[libterralib] 01/24: Imported Upstream version 3.0.3b2

Sebastiaan Couwenberg sebastic at moszumanska.debian.org
Sat Aug 1 23:04:14 UTC 2015


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

sebastic pushed a commit to branch master
in repository libterralib.

commit 3ada99dc384f6b36ebf655001ce1ff70a67b0f91
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date:   Sun Aug 2 00:53:59 2015 +0200

    Imported Upstream version 3.0.3b2
---
 examples/Debug/ijl15.dll                           |   Bin 0 -> 372736 bytes
 examples/Debug/libMySQL.dll                        |   Bin 0 -> 925696 bytes
 examples/Debug/libpq.dll                           |   Bin 0 -> 90112 bytes
 examples/Debug/oci.dll                             |   Bin 0 -> 97280 bytes
 examples/Debug/zlib.dll                            |   Bin 0 -> 65024 bytes
 examples/Readme                                    |    96 +
 examples/Release/ijl15.dll                         |   Bin 0 -> 372736 bytes
 examples/Release/libMySQL.dll                      |   Bin 0 -> 925696 bytes
 examples/Release/libpq.dll                         |   Bin 0 -> 90112 bytes
 examples/Release/oci.dll                           |   Bin 0 -> 97280 bytes
 examples/Release/zlib.dll                          |   Bin 0 -> 65024 bytes
 examples/addGeomRepresentation/.cdtproject         |    17 +
 examples/addGeomRepresentation/.project            |   104 +
 examples/addGeomRepresentation/Makefile            |    23 +
 .../addGeomRepresentation.cpp                      |    96 +
 .../addGeomRepresentation.dsp                      |   114 +
 .../addGeomRepresentation.dsw                      |    89 +
 .../addGeomRepresentation.pro                      |    47 +
 examples/convertCoordinates/.cdtproject            |    17 +
 examples/convertCoordinates/.project               |   104 +
 examples/convertCoordinates/Makefile               |    23 +
 examples/convertCoordinates/convertCoordinates.cpp |    68 +
 examples/convertCoordinates/convertCoordinates.dsp |   106 +
 examples/convertCoordinates/convertCoordinates.dsw |    89 +
 examples/convertCoordinates/convertCoordinates.pro |    45 +
 examples/copyLayer/.cdtproject                     |    17 +
 examples/copyLayer/.project                        |   104 +
 examples/copyLayer/Makefile                        |    23 +
 examples/copyLayer/copyLayer.cpp                   |    88 +
 examples/copyLayer/copyLayer.dsp                   |   122 +
 examples/copyLayer/copyLayer.dsw                   |    89 +
 examples/copyLayer/copyLayer.pro                   |    49 +
 examples/createDatabase/.cdtproject                |    17 +
 examples/createDatabase/.project                   |   104 +
 examples/createDatabase/Makefile                   |    23 +
 examples/createDatabase/createDatabase.cpp         |    65 +
 examples/createDatabase/createDatabase.dsp         |   114 +
 examples/createDatabase/createDatabase.dsw         |    89 +
 examples/createDatabase/createDatabase.pro         |    47 +
 examples/createLayer/.cdtproject                   |    17 +
 examples/createLayer/.project                      |   104 +
 examples/createLayer/Makefile                      |    23 +
 examples/createLayer/createLayer.cpp               |   298 +
 examples/createLayer/createLayer.dsp               |   114 +
 examples/createLayer/createLayer.dsw               |    89 +
 examples/createLayer/createLayer.pro               |    47 +
 examples/createProximityMatrix/.cdtproject         |    17 +
 examples/createProximityMatrix/.project            |   104 +
 examples/createProximityMatrix/Makefile            |    23 +
 .../createProximityMatrix.cpp                      |   131 +
 .../createProximityMatrix.dsp                      |   114 +
 .../createProximityMatrix.dsw                      |    89 +
 .../createProximityMatrix.pro                      |    47 +
 examples/createSTElementSet/.cdtproject            |    17 +
 examples/createSTElementSet/.project               |   104 +
 examples/createSTElementSet/Makefile               |    23 +
 examples/createSTElementSet/createSTElementSet.cpp |   104 +
 examples/createSTElementSet/createSTElementSet.dsp |   114 +
 examples/createSTElementSet/createSTElementSet.dsw |    89 +
 examples/createSTElementSet/createSTElementSet.pro |    47 +
 examples/createSTElementSetFromLayer/.cdtproject   |    17 +
 examples/createSTElementSetFromLayer/.project      |   104 +
 examples/createSTElementSetFromLayer/Makefile      |    23 +
 .../createSTElementSetFromLayer.cpp                |   120 +
 .../createSTElementSetFromLayer.dsp                |   114 +
 .../createSTElementSetFromLayer.dsw                |    89 +
 .../createSTElementSetFromLayer.pro                |    47 +
 .../createSTElementSetFromShapeFile/.cdtproject    |    17 +
 examples/createSTElementSetFromShapeFile/.project  |   104 +
 examples/createSTElementSetFromShapeFile/Makefile  |    23 +
 .../createSTElementSetFromShapeFile.cpp            |    76 +
 .../createSTElementSetFromShapeFile.dsp            |   130 +
 .../createSTElementSetFromShapeFile.dsw            |    89 +
 .../createSTElementSetFromShapeFile.pro            |    51 +
 examples/createSTElementSetFromTheme/.cdtproject   |    17 +
 examples/createSTElementSetFromTheme/.project      |   104 +
 examples/createSTElementSetFromTheme/Makefile      |    23 +
 .../createSTElementSetFromTheme.cpp                |   147 +
 .../createSTElementSetFromTheme.dsp                |   114 +
 .../createSTElementSetFromTheme.dsw                |    89 +
 .../createSTElementSetFromTheme.pro                |    47 +
 examples/createTable/.cdtproject                   |    17 +
 examples/createTable/.project                      |   104 +
 examples/createTable/Makefile                      |    23 +
 examples/createTable/createTable.cpp               |   211 +
 examples/createTable/createTable.dsp               |   114 +
 examples/createTable/createTable.dsw               |    89 +
 examples/createTable/createTable.pro               |    47 +
 examples/createTheme/.cdtproject                   |    17 +
 examples/createTheme/.project                      |   104 +
 examples/createTheme/Makefile                      |    23 +
 examples/createTheme/createTheme.cpp               |   184 +
 examples/createTheme/createTheme.dsp               |   114 +
 examples/createTheme/createTheme.dsw               |    89 +
 examples/createTheme/createTheme.pro               |    47 +
 examples/data/BairrosPoA.dbf                       |   Bin 0 -> 17703 bytes
 examples/data/BairrosPoA.shp                       |   Bin 0 -> 135372 bytes
 examples/data/BairrosPoA.shx                       |   Bin 0 -> 828 bytes
 examples/data/BairrosRecife.mid                    |    94 +
 examples/data/BairrosRecife.mif                    | 13886 +++++++
 examples/data/BairrosRecife2.csv                   |    94 +
 examples/data/Cadastro_Escolas.geo                 |   201 +
 examples/data/Cadastro_Escolas.tab                 |   237 +
 examples/data/Distritos.mid                        |    96 +
 examples/data/Distritos.mif                        | 41096 +++++++++++++++++++
 examples/data/EstadosBrasil.dbf                    |   Bin 0 -> 6321 bytes
 examples/data/EstadosBrasil.shp                    |   Bin 0 -> 150948 bytes
 examples/data/EstadosBrasil.shx                    |   Bin 0 -> 316 bytes
 examples/data/OcorrenciasPoA.dbf                   |   Bin 0 -> 1340978 bytes
 examples/data/OcorrenciasPoA.shp                   |   Bin 0 -> 89252 bytes
 examples/data/OcorrenciasPoA.shx                   |   Bin 0 -> 25572 bytes
 examples/data/SOCEC.dbf                            |   Bin 0 -> 24106 bytes
 examples/data/cities.dbf                           |   Bin 0 -> 3366 bytes
 examples/data/cities.shp                           |   Bin 0 -> 1108 bytes
 examples/data/cities.shx                           |   Bin 0 -> 388 bytes
 examples/data/elevation.raw                        |   Bin 0 -> 644816 bytes
 examples/data/nat1.tif                             |   Bin 0 -> 1219306 bytes
 examples/data/nat2.tif                             |   Bin 0 -> 1104932 bytes
 examples/data/rivers.dbf                           |   Bin 0 -> 2528 bytes
 examples/data/rivers.shp                           |   Bin 0 -> 20208 bytes
 examples/data/rivers.shx                           |   Bin 0 -> 340 bytes
 examples/data/sampa.jpg                            |   Bin 0 -> 165574 bytes
 examples/data/states.dbf                           |   Bin 0 -> 4034 bytes
 examples/data/states.shp                           |   Bin 0 -> 51924 bytes
 examples/data/states.shx                           |   Bin 0 -> 356 bytes
 examples/databaseQuery/.cdtproject                 |    17 +
 examples/databaseQuery/.project                    |   104 +
 examples/databaseQuery/Makefile                    |    23 +
 examples/databaseQuery/databaseQuery.cpp           |   141 +
 examples/databaseQuery/databaseQuery.dsp           |   114 +
 examples/databaseQuery/databaseQuery.dsw           |    89 +
 examples/databaseQuery/databaseQuery.pro           |    47 +
 examples/databaseSQLQuery/.cdtproject              |    17 +
 examples/databaseSQLQuery/.project                 |   104 +
 examples/databaseSQLQuery/Makefile                 |    23 +
 examples/databaseSQLQuery/databaseSQLQuery.cpp     |   138 +
 examples/databaseSQLQuery/databaseSQLQuery.dsp     |   114 +
 examples/databaseSQLQuery/databaseSQLQuery.dsw     |    89 +
 examples/databaseSQLQuery/databaseSQLQuery.pro     |    47 +
 examples/importCSV/.cdtproject                     |    17 +
 examples/importCSV/.project                        |   104 +
 examples/importCSV/Makefile                        |    23 +
 examples/importCSV/importCSV.cpp                   |   181 +
 examples/importCSV/importCSV.dsp                   |   126 +
 examples/importCSV/importCSV.dsw                   |    89 +
 examples/importCSV/importCSV.pro                   |    50 +
 examples/importDBF/.cdtproject                     |    17 +
 examples/importDBF/.project                        |   104 +
 examples/importDBF/Makefile                        |    23 +
 examples/importDBF/importDBF.cpp                   |    91 +
 examples/importDBF/importDBF.dsp                   |   122 +
 examples/importDBF/importDBF.dsw                   |    89 +
 examples/importDBF/importDBF.pro                   |    49 +
 examples/importGeoTab/.cdtproject                  |    17 +
 examples/importGeoTab/.project                     |   104 +
 examples/importGeoTab/Makefile                     |    23 +
 examples/importGeoTab/importGeoTab.cpp             |   112 +
 examples/importGeoTab/importGeoTab.dsp             |   122 +
 examples/importGeoTab/importGeoTab.dsw             |    89 +
 examples/importGeoTab/importGeoTab.pro             |    49 +
 examples/importGridData/.cdtproject                |    17 +
 examples/importGridData/.project                   |   104 +
 examples/importGridData/Makefile                   |    23 +
 examples/importGridData/importGridData.cpp         |   119 +
 examples/importGridData/importGridData.dsp         |   114 +
 examples/importGridData/importGridData.dsw         |    89 +
 examples/importGridData/importGridData.pro         |    47 +
 examples/importJPEG/.cdtproject                    |    17 +
 examples/importJPEG/.project                       |   104 +
 examples/importJPEG/Makefile                       |    23 +
 examples/importJPEG/importJPEG.cpp                 |   109 +
 examples/importJPEG/importJPEG.dsp                 |   114 +
 examples/importJPEG/importJPEG.dsw                 |    89 +
 examples/importJPEG/importJPEG.pro                 |    47 +
 examples/importMIDMIF/.cdtproject                  |    17 +
 examples/importMIDMIF/.project                     |   104 +
 examples/importMIDMIF/Makefile                     |    23 +
 examples/importMIDMIF/importMIDMIF.cpp             |   111 +
 examples/importMIDMIF/importMIDMIF.dsp             |   134 +
 examples/importMIDMIF/importMIDMIF.dsw             |    89 +
 examples/importMIDMIF/importMIDMIF.pro             |    52 +
 examples/importShape/.cdtproject                   |    17 +
 examples/importShape/.project                      |   104 +
 examples/importShape/Makefile                      |    23 +
 examples/importShape/importShape.cpp               |    90 +
 examples/importShape/importShape.dsp               |   126 +
 examples/importShape/importShape.dsw               |    89 +
 examples/importShape/importShape.pro               |    50 +
 examples/mosaicTIFFImages/.cdtproject              |    17 +
 examples/mosaicTIFFImages/.project                 |   104 +
 examples/mosaicTIFFImages/Makefile                 |    23 +
 examples/mosaicTIFFImages/mosaicTIFFImages.cpp     |   133 +
 examples/mosaicTIFFImages/mosaicTIFFImages.dsp     |   114 +
 examples/mosaicTIFFImages/mosaicTIFFImages.dsw     |    29 +
 examples/mosaicTIFFImages/mosaicTIFFImages.pro     |    47 +
 .../proxMatrixAndSpatialStatistics/.cdtproject     |    17 +
 examples/proxMatrixAndSpatialStatistics/.project   |   104 +
 examples/proxMatrixAndSpatialStatistics/Makefile   |    23 +
 .../proxMatrixAndSpatialStatistics.cpp             |   164 +
 .../proxMatrixAndSpatialStatistics.dsp             |   122 +
 .../proxMatrixAndSpatialStatistics.dsw             |    89 +
 .../proxMatrixAndSpatialStatistics.pro             |    47 +
 examples/querierFromLayer/.cdtproject              |    17 +
 examples/querierFromLayer/.project                 |   104 +
 examples/querierFromLayer/Makefile                 |    23 +
 examples/querierFromLayer/querierFromLayer.cpp     |   117 +
 examples/querierFromLayer/querierFromLayer.dsp     |   114 +
 examples/querierFromLayer/querierFromLayer.dsw     |    89 +
 examples/querierFromLayer/querierFromLayer.pro     |    47 +
 examples/querierFromTheme/.cdtproject              |    17 +
 examples/querierFromTheme/.project                 |   104 +
 examples/querierFromTheme/Makefile                 |    23 +
 examples/querierFromTheme/querierFromTheme.cpp     |   137 +
 examples/querierFromTheme/querierFromTheme.dsp     |   114 +
 examples/querierFromTheme/querierFromTheme.dsw     |    89 +
 examples/querierFromTheme/querierFromTheme.pro     |    47 +
 examples/querierGroupChronon/.cdtproject           |    17 +
 examples/querierGroupChronon/.project              |   104 +
 examples/querierGroupChronon/Makefile              |    23 +
 .../querierGroupChronon/querierGroupChronon.cpp    |   141 +
 .../querierGroupChronon/querierGroupChronon.dsp    |   114 +
 .../querierGroupChronon/querierGroupChronon.dsw    |    89 +
 .../querierGroupChronon/querierGroupChronon.pro    |    47 +
 examples/querierGroupElement/.cdtproject           |    17 +
 examples/querierGroupElement/.project              |   104 +
 examples/querierGroupElement/Makefile              |    23 +
 .../querierGroupElement/querierGroupElement.cpp    |   123 +
 .../querierGroupElement/querierGroupElement.dsp    |   114 +
 .../querierGroupElement/querierGroupElement.dsw    |    89 +
 .../querierGroupElement/querierGroupElement.pro    |    47 +
 examples/querierGroupSpatialRest/.cdtproject       |    17 +
 examples/querierGroupSpatialRest/.project          |   104 +
 examples/querierGroupSpatialRest/Makefile          |    23 +
 .../querierGroupSpatialRest.cpp                    |   163 +
 .../querierGroupSpatialRest.dsp                    |   114 +
 .../querierGroupSpatialRest.dsw                    |    89 +
 .../querierGroupSpatialRest.pro                    |    47 +
 examples/querierWithSpatialRestBox/.cdtproject     |    17 +
 examples/querierWithSpatialRestBox/.project        |   104 +
 examples/querierWithSpatialRestBox/Makefile        |    23 +
 .../querierWithSpatialRestBox.cpp                  |   117 +
 .../querierWithSpatialRestBox.dsp                  |   114 +
 .../querierWithSpatialRestBox.dsw                  |    89 +
 .../querierWithSpatialRestBox.pro                  |    47 +
 .../querierWithSpatialRestGeometry/.cdtproject     |    17 +
 examples/querierWithSpatialRestGeometry/.project   |   104 +
 examples/querierWithSpatialRestGeometry/Makefile   |    23 +
 .../querierWithSpatialRestGeometry.cpp             |   152 +
 .../querierWithSpatialRestGeometry.dsp             |   114 +
 .../querierWithSpatialRestGeometry.dsw             |    89 +
 .../querierWithSpatialRestGeometry.pro             |    47 +
 examples/rasterSlicing/.cdtproject                 |    17 +
 examples/rasterSlicing/.project                    |   104 +
 examples/rasterSlicing/Makefile                    |    23 +
 examples/rasterSlicing/rasterSlicing.cpp           |   204 +
 examples/rasterSlicing/rasterSlicing.dsp           |   114 +
 examples/rasterSlicing/rasterSlicing.dsw           |    29 +
 examples/rasterSlicing/rasterSlicing.pro           |    47 +
 examples/spatialQuery/.cdtproject                  |    17 +
 examples/spatialQuery/.project                     |   104 +
 examples/spatialQuery/Makefile                     |    23 +
 examples/spatialQuery/spatialQuery.cpp             |   185 +
 examples/spatialQuery/spatialQuery.dsp             |   126 +
 examples/spatialQuery/spatialQuery.dsw             |    89 +
 examples/spatialQuery/spatialQuery.pro             |    50 +
 examples/spatialQueryAndBuffer/.cdtproject         |    17 +
 examples/spatialQueryAndBuffer/.project            |   104 +
 examples/spatialQueryAndBuffer/Makefile            |    23 +
 .../spatialQueryAndBuffer.cpp                      |   114 +
 .../spatialQueryAndBuffer.dsp                      |   126 +
 .../spatialQueryAndBuffer.dsw                      |    89 +
 .../spatialQueryAndBuffer.pro                      |    50 +
 examples/themeGrouping/.cdtproject                 |    17 +
 examples/themeGrouping/.project                    |   104 +
 examples/themeGrouping/Makefile                    |    23 +
 examples/themeGrouping/themeGrouping.cpp           |   113 +
 examples/themeGrouping/themeGrouping.dsp           |   114 +
 examples/themeGrouping/themeGrouping.dsw           |    89 +
 examples/themeGrouping/themeGrouping.pro           |    47 +
 src/STLport/BC50/README                            |     8 +
 src/STLport/BC50/algorith.h                        |    21 +
 src/STLport/BC50/alloc.h                           |    31 +
 src/STLport/BC50/bak/stddef.h                      |    21 +
 src/STLport/BC50/bak/stdlib.h                      |    16 +
 src/STLport/BC50/bitset.h                          |    21 +
 src/STLport/BC50/cassert.h                         |    21 +
 src/STLport/BC50/cctype.h                          |    21 +
 src/STLport/BC50/cerrno.h                          |    21 +
 src/STLport/BC50/cfloat.h                          |    21 +
 src/STLport/BC50/climits.h                         |    21 +
 src/STLport/BC50/clocale.h                         |    21 +
 src/STLport/BC50/cmath.h                           |    21 +
 src/STLport/BC50/complex.h                         |    31 +
 src/STLport/BC50/csetjmp.h                         |    21 +
 src/STLport/BC50/csignal.h                         |    21 +
 src/STLport/BC50/cstdarg.h                         |    21 +
 src/STLport/BC50/cstddef.h                         |    21 +
 src/STLport/BC50/cstdio.h                          |    21 +
 src/STLport/BC50/cstdlib.h                         |    16 +
 src/STLport/BC50/cstring.h                         |    19 +
 src/STLport/BC50/ctime.h                           |    21 +
 src/STLport/BC50/cwchar.h                          |    21 +
 src/STLport/BC50/cwctype.h                         |    21 +
 src/STLport/BC50/deque.h                           |    21 +
 src/STLport/BC50/exceptio.h                        |    21 +
 src/STLport/BC50/fstream.h                         |    21 +
 src/STLport/BC50/function.h                        |    21 +
 src/STLport/BC50/hash_map.h                        |    21 +
 src/STLport/BC50/hash_set.h                        |    21 +
 src/STLport/BC50/iomanip.h                         |    21 +
 src/STLport/BC50/ios.h                             |    21 +
 src/STLport/BC50/iosfwd.h                          |    21 +
 src/STLport/BC50/iostream.h                        |    21 +
 src/STLport/BC50/istream.h                         |    21 +
 src/STLport/BC50/iterator.h                        |    21 +
 src/STLport/BC50/limits.h                          |    32 +
 src/STLport/BC50/list.h                            |    21 +
 src/STLport/BC50/locale.h                          |    30 +
 src/STLport/BC50/make_bc50.sh                      |    12 +
 src/STLport/BC50/map.h                             |    21 +
 src/STLport/BC50/memory.h                          |    33 +
 src/STLport/BC50/numeric.h                         |    21 +
 src/STLport/BC50/ostream.h                         |    21 +
 src/STLport/BC50/pthread_alloc.h                   |    21 +
 src/STLport/BC50/queue.h                           |    21 +
 src/STLport/BC50/rope.h                            |    21 +
 src/STLport/BC50/set.h                             |    21 +
 src/STLport/BC50/slist.h                           |    21 +
 src/STLport/BC50/sstream.h                         |    21 +
 src/STLport/BC50/stack.h                           |    21 +
 src/STLport/BC50/stdexcep.h                        |    21 +
 src/STLport/BC50/stl_tmpl.h                        |    21 +
 src/STLport/BC50/streambu.h                        |    21 +
 src/STLport/BC50/streambuf.h                       |    31 +
 src/STLport/BC50/string.h                          |    33 +
 src/STLport/BC50/strstrea.h                        |    21 +
 src/STLport/BC50/typeinfo.h                        |    21 +
 src/STLport/BC50/using/cstring.h                   |    54 +
 src/STLport/BC50/using/fstream.h                   |    19 +
 src/STLport/BC50/using/iomanip.h                   |     6 +
 src/STLport/BC50/using/ios.h                       |    41 +
 src/STLport/BC50/using/iosfwd.h                    |    54 +
 src/STLport/BC50/using/iostream.h                  |    11 +
 src/STLport/BC50/using/istream.h                   |    15 +
 src/STLport/BC50/using/locale.h                    |    62 +
 src/STLport/BC50/using/ostream.h                   |    10 +
 src/STLport/BC50/using/sstream.h                   |    16 +
 src/STLport/BC50/using/streambuf.h                 |     5 +
 src/STLport/BC50/using/strstream.h                 |     4 +
 src/STLport/BC50/utility.h                         |    21 +
 src/STLport/BC50/valarray.h                        |    21 +
 src/STLport/BC50/vector.h                          |    21 +
 src/STLport/algorithm                              |    60 +
 src/STLport/bitset                                 |    64 +
 src/STLport/cassert                                |    34 +
 src/STLport/cctype                                 |    78 +
 src/STLport/cerrno                                 |    49 +
 src/STLport/cfloat                                 |    41 +
 src/STLport/climits                                |    46 +
 src/STLport/clocale                                |    49 +
 src/STLport/cmath                                  |    93 +
 src/STLport/complex                                |    52 +
 src/STLport/config/_epilog.h                       |    33 +
 src/STLport/config/_msvc_warnings_off.h            |    20 +
 src/STLport/config/_prolog.h                       |    46 +
 src/STLport/config/new_compiler/README             |    12 +
 src/STLport/config/new_compiler/configure          |  3644 ++
 src/STLport/config/new_compiler/configure.in       |  1424 +
 src/STLport/config/new_compiler/stlconf.h.in       |   133 +
 src/STLport/config/new_compiler/unconfigure        |     3 +
 src/STLport/config/stl_apcc.h                      |    32 +
 src/STLport/config/stl_apple.h                     |   112 +
 src/STLport/config/stl_as400.h                     |    60 +
 src/STLport/config/stl_bc.h                        |   204 +
 src/STLport/config/stl_como.h                      |   209 +
 src/STLport/config/stl_confix.h                    |    78 +
 src/STLport/config/stl_cray.h                      |    68 +
 src/STLport/config/stl_dec.h                       |   110 +
 src/STLport/config/stl_dec_vms.h                   |    96 +
 src/STLport/config/stl_dm.h                        |   225 +
 src/STLport/config/stl_fujitsu.h                   |     5 +
 src/STLport/config/stl_gcc.h                       |   376 +
 src/STLport/config/stl_hpacc.h                     |   218 +
 src/STLport/config/stl_ibm.h                       |   139 +
 src/STLport/config/stl_icc.h                       |    49 +
 src/STLport/config/stl_intel.h                     |    14 +
 src/STLport/config/stl_kai.h                       |    58 +
 src/STLport/config/stl_mlc.h                       |     8 +
 src/STLport/config/stl_msvc.h                      |   208 +
 src/STLport/config/stl_mwerks.h                    |   140 +
 src/STLport/config/stl_mycomp.h                    |   268 +
 src/STLport/config/stl_sco.h                       |    35 +
 src/STLport/config/stl_select_lib.h                |    36 +
 src/STLport/config/stl_sgi.h                       |    94 +
 src/STLport/config/stl_solaris.h                   |    35 +
 src/STLport/config/stl_sunpro.h                    |   175 +
 src/STLport/config/stl_symantec.h                  |    42 +
 src/STLport/config/stl_watcom.h                    |   152 +
 src/STLport/config/stl_wince.h                     |   188 +
 src/STLport/config/stlcomp.h                       |   122 +
 src/STLport/config/vc_select_lib.h                 |    35 +
 src/STLport/csetjmp                                |    54 +
 src/STLport/csignal                                |    49 +
 src/STLport/cstdarg                                |    45 +
 src/STLport/cstddef                                |    58 +
 src/STLport/cstdio                                 |   134 +
 src/STLport/cstdlib                                |   114 +
 src/STLport/cstring                                |    45 +
 src/STLport/ctime                                  |    58 +
 src/STLport/ctype.h                                |    36 +
 src/STLport/cwchar                                 |   250 +
 src/STLport/cwctype                                |    81 +
 src/STLport/deque                                  |    55 +
 src/STLport/exception                              |   188 +
 src/STLport/exception.h                            |    46 +
 src/STLport/export                                 |    85 +
 src/STLport/export.sun                             |    48 +
 src/STLport/fstream                                |    61 +
 src/STLport/fstream.h                              |    57 +
 src/STLport/functional                             |    48 +
 src/STLport/hash_map                               |    42 +
 src/STLport/hash_set                               |    42 +
 src/STLport/iomanip                                |   194 +
 src/STLport/iomanip.h                              |    69 +
 src/STLport/ios                                    |    46 +
 src/STLport/ios.h                                  |    57 +
 src/STLport/iosfwd                                 |    62 +
 src/STLport/iostream                               |    97 +
 src/STLport/iostream.h                             |   119 +
 src/STLport/istream                                |    53 +
 src/STLport/istream.h                              |    63 +
 src/STLport/iterator                               |    59 +
 src/STLport/limits                                 |    44 +
 src/STLport/list                                   |    55 +
 src/STLport/locale                                 |   168 +
 src/STLport/locale.h                               |    35 +
 src/STLport/map                                    |    53 +
 src/STLport/math.h                                 |    46 +
 src/STLport/mem.h                                  |    51 +
 src/STLport/memory                                 |    70 +
 src/STLport/mmemory.h                              |     1 +
 src/STLport/new                                    |    54 +
 src/STLport/new.h                                  |    48 +
 src/STLport/numeric                                |    50 +
 src/STLport/old_hp/algo.h                          |   146 +
 src/STLport/old_hp/algobase.h                      |    97 +
 src/STLport/old_hp/alloc.h                         |   103 +
 src/STLport/old_hp/bvector.h                       |    68 +
 src/STLport/old_hp/defalloc.h                      |    87 +
 src/STLport/old_hp/deque.h                         |    68 +
 src/STLport/old_hp/export                          |    27 +
 src/STLport/old_hp/function.h                      |   126 +
 src/STLport/old_hp/hash_map.h                      |    62 +
 src/STLport/old_hp/hash_set.h                      |    58 +
 src/STLport/old_hp/hashtable.h                     |    70 +
 src/STLport/old_hp/heap.h                          |    58 +
 src/STLport/old_hp/iterator.h                      |   147 +
 src/STLport/old_hp/list.h                          |    62 +
 src/STLport/old_hp/map.h                           |    60 +
 src/STLport/old_hp/multimap.h                      |    58 +
 src/STLport/old_hp/multiset.h                      |    58 +
 src/STLport/old_hp/numeric.h                       |    25 +
 src/STLport/old_hp/pair.h                          |    59 +
 src/STLport/old_hp/pthread_alloc.h                 |    57 +
 src/STLport/old_hp/queue.h                         |    23 +
 src/STLport/old_hp/rope.h                          |    50 +
 src/STLport/old_hp/set.h                           |    57 +
 src/STLport/old_hp/slist.h                         |    57 +
 src/STLport/old_hp/stack.h                         |    73 +
 src/STLport/old_hp/tempbuf.h                       |    79 +
 src/STLport/old_hp/tree.h                          |    60 +
 src/STLport/old_hp/vector.h                        |    65 +
 src/STLport/ostream                                |    49 +
 src/STLport/ostream.h                              |    53 +
 src/STLport/pthread.h                              |    39 +
 src/STLport/pthread_alloc                          |    49 +
 src/STLport/queue                                  |    55 +
 src/STLport/rlocks.h                               |    11 +
 src/STLport/rope                                   |    37 +
 src/STLport/set                                    |    53 +
 src/STLport/setjmp.h                               |    38 +
 src/STLport/signal.h                               |    35 +
 src/STLport/slist                                  |    44 +
 src/STLport/sstream                                |    54 +
 src/STLport/stack                                  |    55 +
 src/STLport/stdarg.h                               |    35 +
 src/STLport/stddef.h                               |    37 +
 src/STLport/stdexcept                              |   180 +
 src/STLport/stdio.h                                |    47 +
 src/STLport/stdio_streambuf                        |   121 +
 src/STLport/stdiostream.h                          |    10 +
 src/STLport/stdlib.h                               |    35 +
 src/STLport/stl/_abbrevs.h                         |    70 +
 src/STLport/stl/_algo.c                            |  1765 +
 src/STLport/stl/_algo.h                            |   740 +
 src/STLport/stl/_algobase.c                        |   392 +
 src/STLport/stl/_algobase.h                        |   583 +
 src/STLport/stl/_alloc.c                           |   370 +
 src/STLport/stl/_alloc.h                           |   531 +
 src/STLport/stl/_alloc_old.h                       |   303 +
 src/STLport/stl/_auto_ptr.h                        |   129 +
 src/STLport/stl/_bitset.c                          |   407 +
 src/STLport/stl/_bitset.h                          |   768 +
 src/STLport/stl/_bvector.h                         |   807 +
 src/STLport/stl/_check_config.h                    |    37 +
 src/STLport/stl/_cmath.h                           |   208 +
 src/STLport/stl/_codecvt.h                         |   307 +
 src/STLport/stl/_collate.h                         |   182 +
 src/STLport/stl/_complex.c                         |   169 +
 src/STLport/stl/_complex.h                         |   969 +
 src/STLport/stl/_config.h                          |  1064 +
 src/STLport/stl/_config_compat.h                   |    89 +
 src/STLport/stl/_config_compat_post.h              |    35 +
 src/STLport/stl/_construct.h                       |   167 +
 src/STLport/stl/_ctraits_fns.h                     |    95 +
 src/STLport/stl/_ctype.h                           |   269 +
 src/STLport/stl/_cwchar.h                          |   112 +
 src/STLport/stl/_deque.c                           |   676 +
 src/STLport/stl/_deque.h                           |   953 +
 src/STLport/stl/_epilog.h                          |    44 +
 src/STLport/stl/_exception.h                       |     0
 src/STLport/stl/_fstream.c                         |   749 +
 src/STLport/stl/_fstream.h                         |   741 +
 src/STLport/stl/_function.h                        |   371 +
 src/STLport/stl/_function_adaptors.h               |   802 +
 src/STLport/stl/_function_base.h                   |   226 +
 src/STLport/stl/_hash_fun.h                        |   107 +
 src/STLport/stl/_hash_map.h                        |   468 +
 src/STLport/stl/_hash_set.h                        |   470 +
 src/STLport/stl/_hashtable.c                       |   468 +
 src/STLport/stl/_hashtable.h                       |   613 +
 src/STLport/stl/_heap.c                            |   242 +
 src/STLport/stl/_heap.h                            |   129 +
 src/STLport/stl/_ios.c                             |   127 +
 src/STLport/stl/_ios.h                             |   199 +
 src/STLport/stl/_ios_base.h                        |   403 +
 src/STLport/stl/_iosfwd.h                          |   159 +
 src/STLport/stl/_istream.c                         |  1430 +
 src/STLport/stl/_istream.h                         |   344 +
 src/STLport/stl/_istreambuf_iterator.h             |   167 +
 src/STLport/stl/_iterator.h                        |   269 +
 src/STLport/stl/_iterator_base.h                   |   463 +
 src/STLport/stl/_iterator_old.h                    |   351 +
 src/STLport/stl/_limits.c                          |   293 +
 src/STLport/stl/_limits.h                          |   557 +
 src/STLport/stl/_list.c                            |   210 +
 src/STLport/stl/_list.h                            |   575 +
 src/STLport/stl/_locale.h                          |   233 +
 src/STLport/stl/_map.h                             |   411 +
 src/STLport/stl/_messages_facets.h                 |   168 +
 src/STLport/stl/_monetary.c                        |   527 +
 src/STLport/stl/_monetary.h                        |   463 +
 src/STLport/stl/_new.h                             |    93 +
 src/STLport/stl/_null_stream.h                     |    42 +
 src/STLport/stl/_num_get.c                         |   671 +
 src/STLport/stl/_num_get.h                         |   259 +
 src/STLport/stl/_num_put.c                         |   553 +
 src/STLport/stl/_num_put.h                         |   186 +
 src/STLport/stl/_numeric.c                         |   104 +
 src/STLport/stl/_numeric.h                         |   186 +
 src/STLport/stl/_numpunct.h                        |   170 +
 src/STLport/stl/_ostream.c                         |   382 +
 src/STLport/stl/_ostream.h                         |   356 +
 src/STLport/stl/_ostreambuf_iterator.h             |    97 +
 src/STLport/stl/_pair.h                            |   161 +
 src/STLport/stl/_prolog.h                          |    17 +
 src/STLport/stl/_pthread_alloc.c                   |   262 +
 src/STLport/stl/_pthread_alloc.h                   |   489 +
 src/STLport/stl/_ptrs_specialize.h                 |    72 +
 src/STLport/stl/_queue.h                           |   212 +
 src/STLport/stl/_range_errors.h                    |    97 +
 src/STLport/stl/_raw_storage_iter.h                |    82 +
 src/STLport/stl/_relops.h                          |    33 +
 src/STLport/stl/_relops_cont.h                     |    29 +
 src/STLport/stl/_relops_hash_cont.h                |    32 +
 src/STLport/stl/_relops_template.h                 |     1 +
 src/STLport/stl/_rope.c                            |  1540 +
 src/STLport/stl/_rope.h                            |  2518 ++
 src/STLport/stl/_set.h                             |   372 +
 src/STLport/stl/_site_config.h                     |   194 +
 src/STLport/stl/_slist.c                           |   179 +
 src/STLport/stl/_slist.h                           |   741 +
 src/STLport/stl/_slist_base.c                      |   109 +
 src/STLport/stl/_slist_base.h                      |    87 +
 src/STLport/stl/_sparc_atomic.h                    |    60 +
 src/STLport/stl/_sstream.c                         |   543 +
 src/STLport/stl/_sstream.h                         |   252 +
 src/STLport/stl/_stack.h                           |   105 +
 src/STLport/stl/_stdio_file.h                      |   758 +
 src/STLport/stl/_stream_iterator.h                 |   343 +
 src/STLport/stl/_streambuf.c                       |   216 +
 src/STLport/stl/_streambuf.h                       |   526 +
 src/STLport/stl/_streambuf_iterator.h              |    83 +
 src/STLport/stl/_string.c                          |   580 +
 src/STLport/stl/_string.h                          |  1501 +
 src/STLport/stl/_string_fwd.c                      |    48 +
 src/STLport/stl/_string_fwd.h                      |    61 +
 src/STLport/stl/_string_hash.h                     |    70 +
 src/STLport/stl/_string_io.c                       |   334 +
 src/STLport/stl/_string_io.h                       |   122 +
 src/STLport/stl/_strstream.h                       |   141 +
 src/STLport/stl/_tempbuf.c                         |    57 +
 src/STLport/stl/_tempbuf.h                         |   165 +
 src/STLport/stl/_threads.c                         |   172 +
 src/STLport/stl/_threads.h                         |   721 +
 src/STLport/stl/_time_facets.c                     |   497 +
 src/STLport/stl/_time_facets.h                     |   315 +
 src/STLport/stl/_tree.c                            |   715 +
 src/STLport/stl/_tree.h                            |   622 +
 src/STLport/stl/_uninitialized.h                   |   287 +
 src/STLport/stl/_valarray.c                        |   197 +
 src/STLport/stl/_valarray.h                        |  1657 +
 src/STLport/stl/_vector.c                          |   137 +
 src/STLport/stl/_vector.h                          |   591 +
 src/STLport/stl/c_locale.h                         |   436 +
 src/STLport/stl/char_traits.h                      |   266 +
 src/STLport/stl/concept_checks.h                   |   810 +
 src/STLport/stl/debug/_debug.c                     |   490 +
 src/STLport/stl/debug/_debug.h                     |   426 +
 src/STLport/stl/debug/_deque.h                     |   281 +
 src/STLport/stl/debug/_hashtable.h                 |   261 +
 src/STLport/stl/debug/_iterator.h                  |   394 +
 src/STLport/stl/debug/_list.h                      |   318 +
 src/STLport/stl/debug/_relops_cont.h               |    41 +
 src/STLport/stl/debug/_relops_hash_cont.h          |    34 +
 src/STLport/stl/debug/_slist.h                     |   399 +
 src/STLport/stl/debug/_string.h                    |   772 +
 src/STLport/stl/debug/_tree.h                      |   249 +
 src/STLport/stl/debug/_vector.h                    |   300 +
 src/STLport/stl/msl_string.h                       |    42 +
 src/STLport/stl/type_traits.h                      |   418 +
 src/STLport/stl/wrappers/_deque.h                  |    76 +
 src/STLport/stl/wrappers/_hash_map.h               |   147 +
 src/STLport/stl/wrappers/_hash_set.h               |   150 +
 src/STLport/stl/wrappers/_list.h                   |    86 +
 src/STLport/stl/wrappers/_map.h                    |   150 +
 src/STLport/stl/wrappers/_mmap.h                   |    46 +
 src/STLport/stl/wrappers/_set.h                    |   141 +
 src/STLport/stl/wrappers/_slist.h                  |    83 +
 src/STLport/stl/wrappers/_vector.h                 |    89 +
 src/STLport/stl_user_config.h                      |   202 +
 src/STLport/streambuf                              |    45 +
 src/STLport/streambuf.h                            |    63 +
 src/STLport/string                                 |    62 +
 src/STLport/string.h                               |    39 +
 src/STLport/strstream                              |    59 +
 src/STLport/strstream.h                            |    75 +
 src/STLport/time.h                                 |    35 +
 src/STLport/typeinfo                               |    86 +
 src/STLport/typeinfo.h                             |    62 +
 src/STLport/using/cstring                          |    54 +
 src/STLport/using/export                           |    12 +
 src/STLport/using/fstream                          |    19 +
 src/STLport/using/h/fstream.h                      |     4 +
 src/STLport/using/h/iomanip.h                      |     6 +
 src/STLport/using/h/iostream.h                     |    24 +
 src/STLport/using/h/ostream.h                      |     6 +
 src/STLport/using/h/streambuf.h                    |     1 +
 src/STLport/using/h/strstream.h                    |     4 +
 src/STLport/using/iomanip                          |     6 +
 src/STLport/using/ios                              |    41 +
 src/STLport/using/iosfwd                           |    54 +
 src/STLport/using/iostream                         |    14 +
 src/STLport/using/istream                          |    16 +
 src/STLport/using/locale                           |    65 +
 src/STLport/using/ostream                          |    10 +
 src/STLport/using/sstream                          |    16 +
 src/STLport/using/streambuf                        |     5 +
 src/STLport/using/strstream                        |     4 +
 src/STLport/utility                                |    65 +
 src/STLport/valarray                               |    47 +
 src/STLport/vector                                 |    57 +
 src/STLport/wchar.h                                |    50 +
 src/STLport/wctype.h                               |    35 +
 src/STLport/wrap_std/complex                       |    49 +
 src/STLport/wrap_std/export                        |    13 +
 src/STLport/wrap_std/fstream                       |    25 +
 src/STLport/wrap_std/h/fstream.h                   |     7 +
 src/STLport/wrap_std/h/iostream.h                  |    11 +
 src/STLport/wrap_std/h/streambuf.h                 |     9 +
 src/STLport/wrap_std/h/strstream.h                 |    31 +
 src/STLport/wrap_std/iomanip                       |    40 +
 src/STLport/wrap_std/ios                           |    29 +
 src/STLport/wrap_std/iosfwd                        |    94 +
 src/STLport/wrap_std/iostream                      |    35 +
 src/STLport/wrap_std/istream                       |    47 +
 src/STLport/wrap_std/locale                        |    30 +
 src/STLport/wrap_std/ostream                       |    44 +
 src/STLport/wrap_std/sstream                       |    25 +
 src/STLport/wrap_std/streambuf                     |    30 +
 src/STLport/wrap_std/strstream                     |    27 +
 src/shapelib/dbfopen.c                             |  1542 +
 src/shapelib/shapefil.h                            |   496 +
 src/shapelib/shpopen.c                             |  1872 +
 src/terralib/PDI/.cvsignore                        |     1 +
 src/terralib/PDI/Doxyfile                          |   214 +
 src/terralib/PDI/PDI.pro                           |     8 +
 src/terralib/PDI/bin/.cvsignore                    |     0
 src/terralib/PDI/bin/dynamic/.cvsignore            |     1 +
 src/terralib/PDI/bin/static/.cvsignore             |     1 +
 src/terralib/PDI/docs/.cvsignore                   |     1 +
 src/terralib/PDI/source/.cvsignore                 |     2 +
 src/terralib/PDI/source/TePDIAgnostic.cpp          |    13 +
 src/terralib/PDI/source/TePDIAgnostic.hpp          |   257 +
 src/terralib/PDI/source/TePDIAlgorithm.cpp         |    42 +
 src/terralib/PDI/source/TePDIAlgorithm.hpp         |   106 +
 src/terralib/PDI/source/TePDIBox.cpp               |    37 +
 src/terralib/PDI/source/TePDIBox.hpp               |    77 +
 src/terralib/PDI/source/TePDIContrast.cpp          |   879 +
 src/terralib/PDI/source/TePDIContrast.hpp          |   278 +
 src/terralib/PDI/source/TePDIFilter.cpp            |    17 +
 src/terralib/PDI/source/TePDIFilter.hpp            |    85 +
 src/terralib/PDI/source/TePDIFilterMask.cpp        |    17 +
 src/terralib/PDI/source/TePDIFilterMask.hpp        |    53 +
 src/terralib/PDI/source/TePDILinearFilter.cpp      |    90 +
 src/terralib/PDI/source/TePDILinearFilter.hpp      |    86 +
 src/terralib/PDI/source/TePDIParameters.cpp        |   313 +
 src/terralib/PDI/source/TePDIParameters.hpp        |   306 +
 src/terralib/PDI/source/TePDIRgbPalette.cpp        |   194 +
 src/terralib/PDI/source/TePDIRgbPalette.hpp        |   238 +
 src/terralib/PDI/source/TePDISharedPtr.cpp         |   146 +
 src/terralib/PDI/source/TePDISharedPtr.hpp         |   142 +
 src/terralib/PDI/source/TePDITypes.hpp             |    84 +
 src/terralib/PDI/source/TePDIUtils.cpp             |   284 +
 src/terralib/PDI/source/TePDIUtils.hpp             |   132 +
 src/terralib/PDI/source/projects/.cvsignore        |     2 +
 src/terralib/PDI/source/projects/base/.cvsignore   |     4 +
 src/terralib/PDI/source/projects/base/base.pro     |    52 +
 .../PDI/source/projects/dynamic/.cvsignore         |     4 +
 .../PDI/source/projects/dynamic/dynamic.pro        |    17 +
 src/terralib/PDI/source/projects/projects.pro      |     6 +
 src/terralib/PDI/source/projects/static/.cvsignore |     4 +
 src/terralib/PDI/source/projects/static/static.pro |    17 +
 src/terralib/PDI/source/source.pro                 |     6 +
 src/terralib/PDI/tests/.cvsignore                  |     1 +
 src/terralib/PDI/tests/bin/.cvsignore              |     3 +
 src/terralib/PDI/tests/resources/.cvsignore        |     1 +
 src/terralib/PDI/tests/resources/cbers_b2_crop.tif |   Bin 0 -> 721734 bytes
 src/terralib/PDI/tests/source/.cvsignore           |     2 +
 .../PDI/tests/source/TePDIContrast/.cvsignore      |     3 +
 .../tests/source/TePDIContrast/TePDIContrast.pro   |     7 +
 .../source/TePDIContrast/TePDIContrast_test.cpp    |   346 +
 .../PDI/tests/source/TePDIParameters/.cvsignore    |     3 +
 .../source/TePDIParameters/TePDIParameters.pro     |     6 +
 .../TePDIParameters/TePDIParameters_test.cpp       |   103 +
 .../PDI/tests/source/TePDISharedPtr/.cvsignore     |     3 +
 .../tests/source/TePDISharedPtr/TePDISharedPtr.pro |     7 +
 .../source/TePDISharedPtr/TePDISharedPtr_test.cpp  |    65 +
 .../PDI/tests/source/TePDIUtils/.cvsignore         |     3 +
 .../PDI/tests/source/TePDIUtils/TePDIUtils.pro     |    10 +
 .../tests/source/TePDIUtils/TePDIUtils_test.cpp    |   119 +
 src/terralib/PDI/tests/source/base/.cvsignore      |     2 +
 src/terralib/PDI/tests/source/base/base.pro        |    27 +
 src/terralib/PDI/tests/source/source.pro           |    10 +
 src/terralib/PDI/tests/tests.pro                   |     7 +
 src/terralib/application/TeApplicationUtils.cpp    |   409 +
 src/terralib/application/TeApplicationUtils.h      |   102 +
 src/terralib/application/TeColorUtils.cpp          |   198 +
 src/terralib/application/TeColorUtils.h            |    58 +
 src/terralib/application/TeDatabaseUtils.cpp       |  3269 ++
 src/terralib/application/TeDatabaseUtils.h         |   179 +
 src/terralib/application/TeGUIUtils.cpp            |   141 +
 src/terralib/application/TeGUIUtils.h              |    42 +
 src/terralib/application/TeMSVFactory.cpp          |   163 +
 src/terralib/application/TeMSVFactory.h            |   192 +
 src/terralib/application/TePlotTheme.h             |  2155 +
 src/terralib/application/TePlotView.h              |    41 +
 src/terralib/application/TeSemivarModelFactory.cpp |   198 +
 src/terralib/application/TeSemivarModelFactory.h   |   153 +
 src/terralib/application/TeThemeApplication.cpp    |   345 +
 src/terralib/application/TeThemeApplication.h      |   314 +
 src/terralib/application/TeUpdateDBVersion.cpp     |   545 +
 src/terralib/application/TeUpdateDBVersion.h       |    46 +
 src/terralib/application/qt/TeDecoderQtImage.cpp   |   102 +
 src/terralib/application/qt/TeDecoderQtImage.h     |    61 +
 .../application/qt/TeInitRasterQtDecoder.cpp       |    11 +
 src/terralib/application/qt/TeQtAnimaThread.cpp    |   117 +
 src/terralib/application/qt/TeQtAnimaThread.h      |    48 +
 src/terralib/application/qt/TeQtBasicCanvas.cpp    |  2428 ++
 src/terralib/application/qt/TeQtBasicCanvas.h      |   280 +
 src/terralib/application/qt/TeQtCanvas.cpp         |   625 +
 src/terralib/application/qt/TeQtCanvas.h           |   118 +
 src/terralib/application/qt/TeQtChartItem.cpp      |    87 +
 src/terralib/application/qt/TeQtChartItem.h        |    63 +
 src/terralib/application/qt/TeQtCheckListItem.cpp  |    95 +
 src/terralib/application/qt/TeQtCheckListItem.h    |    72 +
 src/terralib/application/qt/TeQtDatabaseItem.cpp   |    40 +
 src/terralib/application/qt/TeQtDatabaseItem.h     |    51 +
 .../application/qt/TeQtDatabasesListView.cpp       |   270 +
 .../application/qt/TeQtDatabasesListView.h         |    92 +
 src/terralib/application/qt/TeQtGraph.cpp          |   284 +
 src/terralib/application/qt/TeQtGraph.h            |    83 +
 src/terralib/application/qt/TeQtGrid.cpp           |  2765 ++
 src/terralib/application/qt/TeQtGrid.h             |   251 +
 src/terralib/application/qt/TeQtLatEdit.cpp        |   131 +
 src/terralib/application/qt/TeQtLatEdit.h          |    24 +
 src/terralib/application/qt/TeQtLayerItem.cpp      |    43 +
 src/terralib/application/qt/TeQtLayerItem.h        |    49 +
 src/terralib/application/qt/TeQtLegendItem.cpp     |   319 +
 src/terralib/application/qt/TeQtLegendItem.h       |    71 +
 src/terralib/application/qt/TeQtLongEdit.cpp       |   130 +
 src/terralib/application/qt/TeQtLongEdit.h         |    24 +
 src/terralib/application/qt/TeQtMethods.cpp        |    98 +
 src/terralib/application/qt/TeQtMethods.h          |    64 +
 src/terralib/application/qt/TeQtProgress.h         |   138 +
 src/terralib/application/qt/TeQtShowMedia.cpp      |  1444 +
 src/terralib/application/qt/TeQtShowMedia.h        |    77 +
 src/terralib/application/qt/TeQtTable.cpp          |   316 +
 src/terralib/application/qt/TeQtTable.h            |    67 +
 src/terralib/application/qt/TeQtTerraStat.cpp      |  1184 +
 src/terralib/application/qt/TeQtTerraStat.h        |   207 +
 src/terralib/application/qt/TeQtTextEdit.cpp       |   862 +
 src/terralib/application/qt/TeQtTextEdit.h         |   150 +
 src/terralib/application/qt/TeQtThemeItem.cpp      |   187 +
 src/terralib/application/qt/TeQtThemeItem.h        |    57 +
 src/terralib/application/qt/TeQtViewItem.cpp       |    49 +
 src/terralib/application/qt/TeQtViewItem.h         |    54 +
 src/terralib/application/qt/TeQtViewsListView.cpp  |   767 +
 src/terralib/application/qt/TeQtViewsListView.h    |   146 +
 src/terralib/application/qt/TeWaitCursor.cpp       |    59 +
 src/terralib/application/qt/TeWaitCursor.h         |    36 +
 src/terralib/application/qt/resultVisual.h         |    37 +
 src/terralib/drivers/MrSID/TeDecoderMrSID.cpp      |   387 +
 src/terralib/drivers/MrSID/TeDecoderMrSID.h        |   163 +
 src/terralib/drivers/MrSID/TeMrSID.cpp             |   465 +
 src/terralib/drivers/MrSID/TeMrSID.h               |   223 +
 src/terralib/drivers/MySQL/TeMySQL.cpp             |  1893 +
 src/terralib/drivers/MySQL/TeMySQL.h               |   218 +
 .../drivers/MySQL/include/config-netware.h         |   119 +
 src/terralib/drivers/MySQL/include/config-os2.h    |   835 +
 src/terralib/drivers/MySQL/include/config-win.h    |   396 +
 src/terralib/drivers/MySQL/include/errmsg.h        |    92 +
 src/terralib/drivers/MySQL/include/libmysql.def    |   147 +
 src/terralib/drivers/MySQL/include/libmysqld.def   |   159 +
 src/terralib/drivers/MySQL/include/m_ctype.h       |   450 +
 src/terralib/drivers/MySQL/include/m_string.h      |   264 +
 src/terralib/drivers/MySQL/include/my_alloc.h      |    52 +
 src/terralib/drivers/MySQL/include/my_dbug.h       |    94 +
 src/terralib/drivers/MySQL/include/my_getopt.h     |    77 +
 src/terralib/drivers/MySQL/include/my_global.h     |  1191 +
 src/terralib/drivers/MySQL/include/my_list.h       |    46 +
 src/terralib/drivers/MySQL/include/my_pthread.h    |   700 +
 src/terralib/drivers/MySQL/include/my_sys.h        |   785 +
 src/terralib/drivers/MySQL/include/mysql.h         |   742 +
 src/terralib/drivers/MySQL/include/mysql_com.h     |   402 +
 src/terralib/drivers/MySQL/include/mysql_embed.h   |    33 +
 src/terralib/drivers/MySQL/include/mysql_time.h    |    44 +
 src/terralib/drivers/MySQL/include/mysql_version.h |    29 +
 src/terralib/drivers/MySQL/include/mysqld_error.h  |   322 +
 src/terralib/drivers/MySQL/include/raid.h          |   158 +
 src/terralib/drivers/MySQL/include/typelib.h       |    33 +
 .../drivers/OracleSpatial/OCI/include/cdemodp0.h   |   109 +
 .../drivers/OracleSpatial/OCI/include/kusapi.h     |   775 +
 .../drivers/OracleSpatial/OCI/include/kustags.h    |  1034 +
 .../drivers/OracleSpatial/OCI/include/nzerror.h    |   647 +
 .../drivers/OracleSpatial/OCI/include/nzt.h        |  2750 ++
 .../drivers/OracleSpatial/OCI/include/occi.h       |    78 +
 .../drivers/OracleSpatial/OCI/include/occiAQ.h     |   374 +
 .../drivers/OracleSpatial/OCI/include/occiCommon.h |   872 +
 .../OracleSpatial/OCI/include/occiControl.h        |  2060 +
 .../drivers/OracleSpatial/OCI/include/occiData.h   |   936 +
 .../OracleSpatial/OCI/include/occiObjects.h        |   990 +
 .../drivers/OracleSpatial/OCI/include/oci.h        |  2366 ++
 .../drivers/OracleSpatial/OCI/include/oci1.h       |   183 +
 .../drivers/OracleSpatial/OCI/include/oci8dp.h     |   315 +
 .../drivers/OracleSpatial/OCI/include/ociap.h      | 10240 +++++
 .../drivers/OracleSpatial/OCI/include/ociapr.h     |   157 +
 .../drivers/OracleSpatial/OCI/include/ocidef.h     |   888 +
 .../drivers/OracleSpatial/OCI/include/ocidem.h     |   112 +
 .../drivers/OracleSpatial/OCI/include/ocidfn.h     |   251 +
 .../drivers/OracleSpatial/OCI/include/ociextp.h    |   281 +
 .../drivers/OracleSpatial/OCI/include/ocikp.h      | 10223 +++++
 .../drivers/OracleSpatial/OCI/include/ocikpr.h     |   168 +
 .../drivers/OracleSpatial/OCI/include/ocixad.h     |   316 +
 .../drivers/OracleSpatial/OCI/include/ocixmldb.h   |   139 +
 .../drivers/OracleSpatial/OCI/include/odci.h       |   657 +
 .../drivers/OracleSpatial/OCI/include/oratypes.h   |   307 +
 .../drivers/OracleSpatial/OCI/include/ori.h        |  2094 +
 .../drivers/OracleSpatial/OCI/include/orid.h       |   372 +
 .../drivers/OracleSpatial/OCI/include/orl.h        |  3628 ++
 .../drivers/OracleSpatial/OCI/include/oro.h        |   883 +
 .../drivers/OracleSpatial/OCI/include/ort.h        |  2593 ++
 .../drivers/OracleSpatial/TeOracleSpatial.cpp      |  6810 +++
 .../drivers/OracleSpatial/TeOracleSpatial.h        |   392 +
 src/terralib/drivers/OracleSpatial/connect.cpp     |   425 +
 src/terralib/drivers/OracleSpatial/connect.h       |   111 +
 src/terralib/drivers/OracleSpatial/cursor.cpp      |  1172 +
 src/terralib/drivers/OracleSpatial/cursor.h        |   225 +
 src/terralib/drivers/OracleSpatial/ociap.h         | 10097 +++++
 src/terralib/drivers/OracleSpatial/sdo_oci.cpp     |  3097 ++
 src/terralib/drivers/OracleSpatial/sdo_oci.h       |  1541 +
 src/terralib/drivers/PostgreSQL/TePGInterface.cpp  |  1581 +
 src/terralib/drivers/PostgreSQL/TePGInterface.h    |   429 +
 src/terralib/drivers/PostgreSQL/TePGUtils.cpp      |   470 +
 src/terralib/drivers/PostgreSQL/TePGUtils.h        |   114 +
 src/terralib/drivers/PostgreSQL/TePostGIS.cpp      |  1233 +
 src/terralib/drivers/PostgreSQL/TePostGIS.h        |   213 +
 src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp   |  3304 ++
 src/terralib/drivers/PostgreSQL/TePostgreSQL.h     |   396 +
 .../drivers/PostgreSQL/includepg/ecpg_informix.h   |    90 +
 .../drivers/PostgreSQL/includepg/ecpgerrno.h       |    77 +
 .../drivers/PostgreSQL/includepg/ecpglib.h         |    94 +
 .../drivers/PostgreSQL/includepg/ecpgtype.h        |    93 +
 .../drivers/PostgreSQL/includepg/libpq-fe.h        |   503 +
 .../drivers/PostgreSQL/includepg/pg_config.h       |   685 +
 .../PostgreSQL/includepg/pg_config_manual.h        |   229 +
 .../drivers/PostgreSQL/includepg/pg_config_os.h    |   244 +
 .../drivers/PostgreSQL/includepg/pgtypes_date.h    |    27 +
 .../drivers/PostgreSQL/includepg/pgtypes_error.h   |    15 +
 .../PostgreSQL/includepg/pgtypes_interval.h        |    30 +
 .../drivers/PostgreSQL/includepg/pgtypes_numeric.h |    68 +
 .../PostgreSQL/includepg/pgtypes_timestamp.h       |    33 +
 .../drivers/PostgreSQL/includepg/postgres_ext.h    |    69 +
 .../drivers/PostgreSQL/includepg/sql3types.h       |    48 +
 src/terralib/drivers/PostgreSQL/includepg/sqlca.h  |    66 +
 src/terralib/functions/TeAddressLocator.cpp        |  3357 ++
 src/terralib/functions/TeAddressLocator.h          |   420 +
 src/terralib/functions/TeCellAlgorithms.cpp        |  1066 +
 src/terralib/functions/TeCellAlgorithms.h          |   268 +
 src/terralib/functions/TeCoordAlgorithms.cpp       |    99 +
 src/terralib/functions/TeCoordAlgorithms.h         |    56 +
 src/terralib/functions/TeExportDBF.cpp             |   286 +
 src/terralib/functions/TeExportMIF.cpp             |   534 +
 src/terralib/functions/TeExportSHP.cpp             |   443 +
 src/terralib/functions/TeExportSPR.cpp             |   807 +
 .../functions/TeGeoProcessingFunctions.cpp         |  2097 +
 src/terralib/functions/TeGeoProcessingFunctions.h  |    51 +
 src/terralib/functions/TeImportBNA.cpp             |   496 +
 src/terralib/functions/TeImportDBF.cpp             |   442 +
 src/terralib/functions/TeImportExport.h            |   274 +
 src/terralib/functions/TeImportGeo.cpp             |   455 +
 src/terralib/functions/TeImportMIF.cpp             |   894 +
 src/terralib/functions/TeImportSHP.cpp             |   882 +
 src/terralib/functions/TeImportSPR.cpp             |   224 +
 src/terralib/functions/TeImportSPR.h               |    18 +
 src/terralib/functions/TeLayerFunctions.cpp        |   660 +
 src/terralib/functions/TeLayerFunctions.h          |   197 +
 src/terralib/functions/TeMIFProjection.cpp         |   340 +
 src/terralib/functions/TeMIFProjection.h           |    39 +
 src/terralib/functions/TeSPRFile.cpp               |   310 +
 src/terralib/functions/TeSPRFile.h                 |   185 +
 src/terralib/functions/TeSTEFunctionsSHP.cpp       |   214 +
 src/terralib/functions/TeSTEFunctionsSHP.h         |    41 +
 src/terralib/functions/TeSimilarity.cpp            |    73 +
 src/terralib/functions/TeThemeFunctions.cpp        |   170 +
 src/terralib/functions/TeThemeFunctions.h          |    43 +
 src/terralib/kernel/Gra_algo.h                     |   195 +
 src/terralib/kernel/TeAsciiFile.cpp                |   342 +
 src/terralib/kernel/TeAsciiFile.h                  |   129 +
 src/terralib/kernel/TeAssertions.h                 |    36 +
 src/terralib/kernel/TeAttribute.h                  |   155 +
 src/terralib/kernel/TeBox.cpp                      |   187 +
 src/terralib/kernel/TeBox.h                        |   204 +
 src/terralib/kernel/TeBufferRegion.cpp             |   206 +
 src/terralib/kernel/TeBufferRegion.h               |    52 +
 src/terralib/kernel/TeCentroid.cpp                 |   411 +
 src/terralib/kernel/TeComposite.h                  |   195 +
 .../kernel/TeComputeAttributeStrategies.cpp        |   969 +
 src/terralib/kernel/TeComputeAttributeStrategies.h |   610 +
 src/terralib/kernel/TeConsoleErrorMessage.cpp      |    51 +
 src/terralib/kernel/TeConsoleErrorMessage.h        |    69 +
 src/terralib/kernel/TeCoord2D.h                    |   148 +
 src/terralib/kernel/TeCounted.h                    |    74 +
 src/terralib/kernel/TeDataTypes.h                  |   172 +
 src/terralib/kernel/TeDatabase.cpp                 |  6504 +++
 src/terralib/kernel/TeDatabase.h                   |  1438 +
 src/terralib/kernel/TeDatum.cpp                    |   222 +
 src/terralib/kernel/TeDatum.h                      |   141 +
 src/terralib/kernel/TeDecoder.h                    |   181 +
 src/terralib/kernel/TeDecoderASCIIGrid.cpp         |   335 +
 src/terralib/kernel/TeDecoderASCIIGrid.h           |    68 +
 src/terralib/kernel/TeDecoderDatabase.cpp          |   452 +
 src/terralib/kernel/TeDecoderDatabase.h            |   141 +
 src/terralib/kernel/TeDecoderFile.cpp              |   363 +
 src/terralib/kernel/TeDecoderFile.h                |    73 +
 src/terralib/kernel/TeDecoderJPEG.cpp              |   184 +
 src/terralib/kernel/TeDecoderJPEG.h                |    68 +
 src/terralib/kernel/TeDecoderMemory.cpp            |   339 +
 src/terralib/kernel/TeDecoderMemory.h              |    90 +
 src/terralib/kernel/TeDecoderMemoryMap.cpp         |   664 +
 src/terralib/kernel/TeDecoderMemoryMap.h           |    85 +
 src/terralib/kernel/TeDecoderSPR.cpp               |   341 +
 src/terralib/kernel/TeDecoderSPR.h                 |    68 +
 src/terralib/kernel/TeDecoderTIFF.cpp              |  1372 +
 src/terralib/kernel/TeDecoderTIFF.h                |   205 +
 src/terralib/kernel/TeDecoderVirtualMemory.cpp     |   442 +
 src/terralib/kernel/TeDecoderVirtualMemory.h       |   196 +
 src/terralib/kernel/TeDefines.h                    |    85 +
 src/terralib/kernel/TeErrorLog.cpp                 |   171 +
 src/terralib/kernel/TeErrorLog.h                   |   139 +
 src/terralib/kernel/TeErrorMessage.cpp             |    33 +
 src/terralib/kernel/TeErrorMessage.h               |   111 +
 src/terralib/kernel/TeException.cpp                |    51 +
 src/terralib/kernel/TeException.h                  |    72 +
 src/terralib/kernel/TeFactory.h                    |   145 +
 src/terralib/kernel/TeFragmentation.cpp            |   424 +
 src/terralib/kernel/TeFragmentation.h              |    52 +
 src/terralib/kernel/TeGeneralizedProxMatrix.cpp    |   433 +
 src/terralib/kernel/TeGeneralizedProxMatrix.h      |   169 +
 src/terralib/kernel/TeGeometry.cpp                 |   113 +
 src/terralib/kernel/TeGeometry.h                   |   926 +
 src/terralib/kernel/TeGeometryAlgorithms.cpp       |  2695 ++
 src/terralib/kernel/TeGeometryAlgorithms.h         |  1024 +
 src/terralib/kernel/TeGraph.cpp                    |  1557 +
 src/terralib/kernel/TeGraph.h                      |   182 +
 src/terralib/kernel/TeGroupingAlgorithms.cpp       |   112 +
 src/terralib/kernel/TeGroupingAlgorithms.h         |   280 +
 src/terralib/kernel/TeImportRaster.cpp             |   309 +
 src/terralib/kernel/TeImportRaster.h               |   104 +
 src/terralib/kernel/TeInitQuerierStrategy.cpp      |    41 +
 src/terralib/kernel/TeInitQuerierStrategy.h        |    32 +
 src/terralib/kernel/TeInitRasterDecoders.cpp       |    86 +
 src/terralib/kernel/TeInitRasterDecoders.h         |    33 +
 src/terralib/kernel/TeIntersector.cpp              |   202 +
 src/terralib/kernel/TeIntersector.h                |   442 +
 src/terralib/kernel/TeLayer.cpp                    |  1038 +
 src/terralib/kernel/TeLayer.h                      |   416 +
 src/terralib/kernel/TeLegendEntry.h                |   202 +
 src/terralib/kernel/TeMatrix.cpp                   |  1516 +
 src/terralib/kernel/TeMatrix.h                     |   161 +
 src/terralib/kernel/TeMeasure.h                    |    57 +
 src/terralib/kernel/TeMultiGeometry.cpp            |   171 +
 src/terralib/kernel/TeMultiGeometry.h              |   146 +
 src/terralib/kernel/TeNeighbours.cpp               |   221 +
 src/terralib/kernel/TeNeighbours.h                 |   200 +
 src/terralib/kernel/TeNetwork.cpp                  |   578 +
 src/terralib/kernel/TeNetwork.h                    |   164 +
 src/terralib/kernel/TeOverlay.cpp                  |   895 +
 src/terralib/kernel/TeOverlay.h                    |    78 +
 src/terralib/kernel/TePieBar.h                     |   289 +
 src/terralib/kernel/TePrecision.h                  |    57 +
 src/terralib/kernel/TeProgress.cpp                 |    31 +
 src/terralib/kernel/TeProgress.h                   |    66 +
 src/terralib/kernel/TeProgressBase.h               |    73 +
 src/terralib/kernel/TeProjection.cpp               |  1708 +
 src/terralib/kernel/TeProjection.h                 |   700 +
 src/terralib/kernel/TePrototype.h                  |    79 +
 .../kernel/TeProxMatrixConstructionStrategy.cpp    |  1009 +
 .../kernel/TeProxMatrixConstructionStrategy.h      |   284 +
 src/terralib/kernel/TeProxMatrixImplementation.cpp |   365 +
 src/terralib/kernel/TeProxMatrixImplementation.h   |   210 +
 src/terralib/kernel/TeProxMatrixSlicingStrategy.h  |    89 +
 src/terralib/kernel/TeProxMatrixStrategies.cpp     |   296 +
 src/terralib/kernel/TeProxMatrixWeightsStrategy.h  |   154 +
 src/terralib/kernel/TeQuerier.cpp                  |   146 +
 src/terralib/kernel/TeQuerier.h                    |    94 +
 src/terralib/kernel/TeQuerierDB.cpp                |   362 +
 src/terralib/kernel/TeQuerierDB.h                  |    91 +
 src/terralib/kernel/TeQuerierDBStr1.cpp            |  1018 +
 src/terralib/kernel/TeQuerierDBStr1.h              |    94 +
 src/terralib/kernel/TeQuerierDBStr2.cpp            |   299 +
 src/terralib/kernel/TeQuerierDBStr2.h              |    78 +
 src/terralib/kernel/TeQuerierDBStr3.cpp            |   336 +
 src/terralib/kernel/TeQuerierDBStr3.h              |    79 +
 src/terralib/kernel/TeQuerierImpl.cpp              |    95 +
 src/terralib/kernel/TeQuerierImpl.h                |   109 +
 src/terralib/kernel/TeQuerierParams.cpp            |   252 +
 src/terralib/kernel/TeQuerierParams.h              |   208 +
 src/terralib/kernel/TeQuerierSHP.h                 |    70 +
 src/terralib/kernel/TeRaster.cpp                   |   632 +
 src/terralib/kernel/TeRaster.h                     |   627 +
 src/terralib/kernel/TeRasterParams.cpp             |   509 +
 src/terralib/kernel/TeRasterParams.h               |   366 +
 src/terralib/kernel/TeRasterRemap.cpp              |   503 +
 src/terralib/kernel/TeRasterRemap.h                |   116 +
 src/terralib/kernel/TeRasterTransform.cpp          |   128 +
 src/terralib/kernel/TeRasterTransform.h            |   307 +
 src/terralib/kernel/TeRedBlackTree.h               |   765 +
 src/terralib/kernel/TeRepresentation.cpp           |    34 +
 src/terralib/kernel/TeRepresentation.h             |    79 +
 src/terralib/kernel/TeSTEFunctionsDB.cpp           |   623 +
 src/terralib/kernel/TeSTEFunctionsDB.h             |    81 +
 src/terralib/kernel/TeSTElement.cpp                |   196 +
 src/terralib/kernel/TeSTElement.h                  |   148 +
 src/terralib/kernel/TeSTElementSet.cpp             |   606 +
 src/terralib/kernel/TeSTElementSet.h               |   254 +
 src/terralib/kernel/TeSTEvent.cpp                  |   270 +
 src/terralib/kernel/TeSTEvent.h                    |   298 +
 src/terralib/kernel/TeSTInstance.cpp               |   490 +
 src/terralib/kernel/TeSTInstance.h                 |   231 +
 src/terralib/kernel/TeSingleton.h                  |    62 +
 src/terralib/kernel/TeSlice.h                      |    63 +
 src/terralib/kernel/TeSparseMatrix.h               |   272 +
 src/terralib/kernel/TeSpatialOperations.cpp        |  1658 +
 src/terralib/kernel/TeSpatialOperations.h          |   206 +
 src/terralib/kernel/TeStatistics.h                 |   664 +
 src/terralib/kernel/TeStdFile.cpp                  |    60 +
 src/terralib/kernel/TeStdFile.h                    |    81 +
 src/terralib/kernel/TeStdIOProgress.h              |    60 +
 src/terralib/kernel/TeTable.cpp                    |   348 +
 src/terralib/kernel/TeTable.h                      |   393 +
 src/terralib/kernel/TeTemporalSeries.cpp           |   283 +
 src/terralib/kernel/TeTemporalSeries.h             |   193 +
 src/terralib/kernel/TeTheme.cpp                    |  1703 +
 src/terralib/kernel/TeTheme.h                      |   765 +
 src/terralib/kernel/TeTime.cpp                     |   612 +
 src/terralib/kernel/TeTime.h                       |   156 +
 src/terralib/kernel/TeTimeInterval.cpp             |   181 +
 src/terralib/kernel/TeTimeInterval.h               |   166 +
 src/terralib/kernel/TeTin.cpp                      |  1762 +
 src/terralib/kernel/TeTin.h                        |   353 +
 src/terralib/kernel/TeUtils.cpp                    |   465 +
 src/terralib/kernel/TeUtils.h                      |   169 +
 src/terralib/kernel/TeVectorRemap.cpp              |    95 +
 src/terralib/kernel/TeVectorRemap.h                |    52 +
 src/terralib/kernel/TeView.h                       |   189 +
 src/terralib/kernel/TeViewNode.h                   |   337 +
 src/terralib/kernel/TeViewTreeIterator.cpp         |   140 +
 src/terralib/kernel/TeViewTreeIterator.h           |   193 +
 src/terralib/kernel/TeViewTreeUtils.cpp            |   104 +
 src/terralib/kernel/TeViewTreeUtils.h              |    39 +
 src/terralib/kernel/TeVisual.h                     |   429 +
 src/terralib/kernel/checkvec.h                     |    70 +
 src/terralib/kernel/dynpq.h                        |   175 +
 src/terralib/kernel/gra_util.h                     |   259 +
 src/terralib/kernel/graph.h                        |   365 +
 src/terralib/kernel/ijl.h                          |  1513 +
 src/terralib/kernel/jpeg.cpp                       |   452 +
 src/terralib/kernel/jpeg.h                         |    95 +
 src/terralib/kernel/lexTemporal.cpp                |  1922 +
 src/terralib/kernel/showseq.h                      |    23 +
 src/terralib/kernel/yyTemporal.cpp                 |   495 +
 src/terralib/kernel/yyTemporal.h                   |    35 +
 src/terralib/stat/TeBayesFunctions.cpp             |   232 +
 src/terralib/stat/TeBayesFunctions.h               |    71 +
 src/terralib/stat/TeKMeansGrouping.h               |   164 +
 src/terralib/stat/TeKernelFunctions.cpp            |    67 +
 src/terralib/stat/TeKernelFunctions.h              |   693 +
 src/terralib/stat/TeKernelParams.h                 |   112 +
 src/terralib/stat/TeSkaterArvore.cpp               |    62 +
 src/terralib/stat/TeSkaterArvore.h                 |    18 +
 src/terralib/stat/TeSkaterFunctions.cpp            |   414 +
 src/terralib/stat/TeSkaterFunctions.h              |    32 +
 src/terralib/stat/TeSkaterGrafo.cpp                |   188 +
 src/terralib/stat/TeSkaterGrafo.h                  |    75 +
 src/terralib/stat/TeSpatialStatistics.cpp          |   987 +
 src/terralib/stat/TeSpatialStatistics.h            |   283 +
 src/terralib/stat/TeStatDataStructures.cpp         |    85 +
 src/terralib/stat/TeStatDataStructures.h           |   455 +
 src/terralib/stat/TeTreeMinimum.cpp                |   379 +
 src/terralib/stat/TeTreeMinimum.h                  |    89 +
 src/terralib/stat/erro.h                           |     6 +
 src/terralib/stat/filaDouble.cpp                   |    58 +
 src/terralib/stat/filaDouble.h                     |    27 +
 src/terralib/stat/filaInt.cpp                      |    58 +
 src/terralib/stat/filaInt.h                        |    27 +
 src/terralib/stat/filaR.cpp                        |    79 +
 src/terralib/stat/filaR.h                          |    36 +
 src/terralib/stat/hash.cpp                         |    53 +
 src/terralib/stat/hash.h                           |    26 +
 src/terralib/stat/heap.cpp                         |   124 +
 src/terralib/stat/heap.h                           |    36 +
 src/terralib/stat/lista.cpp                        |   111 +
 src/terralib/stat/lista.h                          |    31 +
 src/tiff/cpl_csv.c                                 |  1013 +
 src/tiff/cpl_csv.h                                 |    86 +
 src/tiff/cpl_serv.c                                |   599 +
 src/tiff/cpl_serv.h                                |   276 +
 src/tiff/csv/README                                |    38 +
 src/tiff/csv/alias.csv                             |  2001 +
 src/tiff/csv/area.csv                              |  1751 +
 src/tiff/csv/codes.csv                             |    84 +
 src/tiff/csv/compd_cs.c                            |    12 +
 src/tiff/csv/compd_cs.csv                          |     9 +
 src/tiff/csv/coordinate_axis.csv                   |    75 +
 src/tiff/csv/coordinate_axis_name.csv              |    29 +
 src/tiff/csv/coordinate_operation.csv              |  2020 +
 src/tiff/csv/coordinate_operation_method.csv       |  1513 +
 src/tiff/csv/coordinate_operation_parameter.csv    |    99 +
 .../csv/coordinate_operation_parameter_value.csv   |  8406 ++++
 src/tiff/csv/coordinate_operation_path.csv         |   336 +
 src/tiff/csv/coordinate_reference_system.csv       |  2609 ++
 src/tiff/csv/coordinate_system.csv                 |    38 +
 src/tiff/csv/datum.csv                             |   332 +
 src/tiff/csv/deprecation.csv                       |   276 +
 src/tiff/csv/ellips_alias.c                        |    10 +
 src/tiff/csv/ellips_alias.csv                      |     7 +
 src/tiff/csv/ellipsoid.c                           |    42 +
 src/tiff/csv/ellipsoid.csv                         |    39 +
 src/tiff/csv/gcs.csv                               |   278 +
 src/tiff/csv/gdatum_alias.c                        |    11 +
 src/tiff/csv/gdatum_alias.csv                      |     8 +
 src/tiff/csv/geod_datum.c                          |   213 +
 src/tiff/csv/geod_datum.csv                        |   210 +
 src/tiff/csv/geod_trf.c                            |   492 +
 src/tiff/csv/geod_trf.csv                          |   489 +
 src/tiff/csv/horiz_cs.c                            |  1496 +
 src/tiff/csv/horiz_cs.csv                          |  1493 +
 src/tiff/csv/naming_system.csv                     |    13 +
 src/tiff/csv/p_meridian.c                          |    17 +
 src/tiff/csv/p_meridian.csv                        |    14 +
 src/tiff/csv/pcs.csv                               |  2251 +
 src/tiff/csv/prime_meridian.csv                    |    14 +
 src/tiff/csv/projop_wparm.csv                      |  1083 +
 src/tiff/csv/stateplane.csv                        |   258 +
 src/tiff/csv/trf_method.c                          |   205 +
 src/tiff/csv/trf_method.csv                        |   984 +
 src/tiff/csv/trf_nonpolynomial.c                   |  1082 +
 src/tiff/csv/trf_nonpolynomial.csv                 |  1079 +
 src/tiff/csv/trf_path.c                            |   568 +
 src/tiff/csv/trf_path.csv                          |   565 +
 src/tiff/csv/unit_of_measure.csv                   |    64 +
 src/tiff/csv/uom_an_alias.c                        |     5 +
 src/tiff/csv/uom_an_alias.csv                      |     2 +
 src/tiff/csv/uom_angle.c                           |    18 +
 src/tiff/csv/uom_angle.csv                         |    15 +
 src/tiff/csv/uom_le_alias.c                        |    27 +
 src/tiff/csv/uom_le_alias.csv                      |    24 +
 src/tiff/csv/uom_length.c                          |    39 +
 src/tiff/csv/uom_length.csv                        |    36 +
 src/tiff/csv/uom_sc_alias.c                        |     4 +
 src/tiff/csv/uom_sc_alias.csv                      |     1 +
 src/tiff/csv/uom_scale.c                           |     6 +
 src/tiff/csv/uom_scale.csv                         |     3 +
 src/tiff/csv/version_history.csv                   |    23 +
 src/tiff/csv/vert_cs.c                             |    31 +
 src/tiff/csv/vert_cs.csv                           |    28 +
 src/tiff/csv/vert_datum.c                          |    32 +
 src/tiff/csv/vert_datum.csv                        |    29 +
 src/tiff/csv/vert_offset.c                         |     5 +
 src/tiff/csv/vert_offset.csv                       |     2 +
 src/tiff/epsg_datum.inc                            |   174 +
 src/tiff/epsg_ellipse.inc                          |    48 +
 src/tiff/epsg_gcs.inc                              |   193 +
 src/tiff/epsg_pcs.inc                              |  1003 +
 src/tiff/epsg_pm.inc                               |    22 +
 src/tiff/epsg_proj.inc                             |   443 +
 src/tiff/epsg_units.inc                            |    35 +
 src/tiff/epsg_vertcs.inc                           |    46 +
 src/tiff/fax3sm.c                                  |  1046 +
 src/tiff/geo_config.h                              |    20 +
 src/tiff/geo_ctrans.inc                            |    55 +
 src/tiff/geo_extra.c                               |   750 +
 src/tiff/geo_free.c                                |    62 +
 src/tiff/geo_get.c                                 |   176 +
 src/tiff/geo_keyp.h                                |    98 +
 src/tiff/geo_names.c                               |   175 +
 src/tiff/geo_new.c                                 |   224 +
 src/tiff/geo_normalize.c                           |  2330 ++
 src/tiff/geo_normalize.h                           |   233 +
 src/tiff/geo_print.c                               |   496 +
 src/tiff/geo_set.c                                 |   259 +
 src/tiff/geo_tiffp.c                               |   140 +
 src/tiff/geo_tiffp.h                               |   113 +
 src/tiff/geo_trans.c                               |   326 +
 src/tiff/geo_write.c                               |   190 +
 src/tiff/geokeys.h                                 |    54 +
 src/tiff/geokeys.inc                               |    76 +
 src/tiff/geonames.h                                |   146 +
 src/tiff/geotiff.h                                 |   117 +
 src/tiff/geotiff_proj4.c                           |   679 +
 src/tiff/geotiffio.h                               |    16 +
 src/tiff/geovalues.h                               |   120 +
 src/tiff/port.h                                    |    32 +
 src/tiff/t4.h                                      |   285 +
 src/tiff/tif_aux.c                                 |   218 +
 src/tiff/tif_close.c                               |    80 +
 src/tiff/tif_codec.c                               |   150 +
 src/tiff/tif_color.c                               |   268 +
 src/tiff/tif_compress.c                            |   233 +
 src/tiff/tif_dir.c                                 |  1419 +
 src/tiff/tif_dir.h                                 |   267 +
 src/tiff/tif_dirinfo.c                             |   480 +
 src/tiff/tif_dirread.c                             |  1485 +
 src/tiff/tif_dirwrite.c                            |  1233 +
 src/tiff/tif_dumpmode.c                            |   118 +
 src/tiff/tif_error.c                               |    49 +
 src/tiff/tif_extension.c                           |   109 +
 src/tiff/tif_fax3.c                                |  1515 +
 src/tiff/tif_fax3.h                                |   525 +
 src/tiff/tif_flush.c                               |    67 +
 src/tiff/tif_getimage.c                            |  2584 ++
 src/tiff/tif_jpeg.c                                |  1667 +
 src/tiff/tif_luv.c                                 |  1586 +
 src/tiff/tif_lzw.c                                 |   745 +
 src/tiff/tif_machdep.c                             |   186 +
 src/tiff/tif_next.c                                |   142 +
 src/tiff/tif_open.c                                |   495 +
 src/tiff/tif_packbits.c                            |   300 +
 src/tiff/tif_pixarlog.c                            |  1305 +
 src/tiff/tif_predict.c                             |   464 +
 src/tiff/tif_predict.h                             |    61 +
 src/tiff/tif_print.c                               |   613 +
 src/tiff/tif_read.c                                |   637 +
 src/tiff/tif_strip.c                               |   217 +
 src/tiff/tif_swab.c                                |   217 +
 src/tiff/tif_thunder.c                             |   154 +
 src/tiff/tif_tile.c                                |   219 +
 src/tiff/tif_unix.c                                |   228 +
 src/tiff/tif_version.c                             |    33 +
 src/tiff/tif_warning.c                             |    49 +
 src/tiff/tif_win32.c                               |   323 +
 src/tiff/tif_write.c                               |   726 +
 src/tiff/tif_zip.c                                 |   368 +
 src/tiff/tiff.h                                    |   482 +
 src/tiff/tiffcomp.h                                |   220 +
 src/tiff/tiffconf.h                                |   153 +
 src/tiff/tiffio.h                                  |   479 +
 src/tiff/tiffiop.h                                 |   289 +
 src/tiff/tiffvers.h                                |     9 +
 src/tiff/uvcode.h                                  |   173 +
 src/tiff/version.h                                 |     1 +
 src/tiff/xtiff.c                                   |   198 +
 src/tiff/xtiffio.h                                 |    72 +
 src/tiff/xtiffiop.h                                |    90 +
 src/zlib/ChangeLog                                 |   471 +
 src/zlib/FAQ                                       |    72 +
 src/zlib/Makefile                                  |    99 +
 src/zlib/README                                    |   148 +
 src/zlib/algorithm.txt                             |   213 +
 src/zlib/zconf.h                                   |   279 +
 src/zlib/zlib.h                                    |   893 +
 terralibx/PostgreSQL/libpq.a                       |   Bin 0 -> 137152 bytes
 terralibx/shapelib/Makefile                        |    11 +
 terralibx/shapelib/shapelib.pro                    |    18 +
 terralibx/stat/Makefile                            |    11 +
 terralibx/stat/stat.pro                            |    45 +
 terralibx/terralib/Makefile                        |    14 +
 terralibx/terralib/terralib.kdevprj                |   795 +
 terralibx/terralib/terralib.pro                    |   181 +
 terralibx/tiff/Makefile                            |    13 +
 terralibx/tiff/tiff.pro                            |    61 +
 1322 files changed, 430683 insertions(+)

diff --git a/examples/Debug/ijl15.dll b/examples/Debug/ijl15.dll
new file mode 100644
index 0000000..0ea9873
Binary files /dev/null and b/examples/Debug/ijl15.dll differ
diff --git a/examples/Debug/libMySQL.dll b/examples/Debug/libMySQL.dll
new file mode 100644
index 0000000..de2c2d2
Binary files /dev/null and b/examples/Debug/libMySQL.dll differ
diff --git a/examples/Debug/libpq.dll b/examples/Debug/libpq.dll
new file mode 100644
index 0000000..6e95daa
Binary files /dev/null and b/examples/Debug/libpq.dll differ
diff --git a/examples/Debug/oci.dll b/examples/Debug/oci.dll
new file mode 100644
index 0000000..59be9f8
Binary files /dev/null and b/examples/Debug/oci.dll differ
diff --git a/examples/Debug/zlib.dll b/examples/Debug/zlib.dll
new file mode 100644
index 0000000..e93cdb9
Binary files /dev/null and b/examples/Debug/zlib.dll differ
diff --git a/examples/Readme b/examples/Readme
new file mode 100644
index 0000000..ca95af1
--- /dev/null
+++ b/examples/Readme
@@ -0,0 +1,96 @@
+						TerraLib Examples
+
+Each one of the items below corresponds to a directory that contains the files that
+implement the operations described, as well as the project files (*.dsw, *.dsp) for
+the Microsoft Visual C++, and the Makefiles to compile the files in the Linux/Unix
+operational system. The data used in these examples can be found in the "data"
+directory.
+
+1. createDatabase
+It illustrates how to create a TerraLib database, creating all of the tables that
+make up the TerraLib data model.
+
+2. createLayer
+It illustrates how to create a layer with vector data in memory and save it in a
+TerraLib database already created.
+
+3. createTable
+It illustrates how to create an attribute table in memory and save it in a TerraLib
+database already created.
+
+4. importMIDMIF
+It illustrates how to import a vector data file in the MapInfo format(MID/MIF)for a
+TerraLib database already created.
+Source Data: Distritos.mid, Distritos.mif
+
+5. importShape
+It illustrates how to import a vector data file in the Shapefile format for a TerraLib
+database already created.
+Source Data: EstadosBrasil.shp, EstadosBrasil.shx, EstadosBrasil.dbf
+
+6. importDBF
+It illustrates how to import an attribute table in the DBF format as an external table
+for a TerraLib database already created.
+Source Data: SOCEC.dbf
+
+7. importJPEG
+It illustrates how to import an image in the JPEG format for a TerraLib database already
+created.
+Source Data: sampa.jpg
+
+8. copyLayer
+It illustrates how to copy a layer of a TerraLib database changing the projection of its
+geometries.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+9. importGeoTab
+It illustrates how to import a vector data file in the SPRING format for a TerraLib
+database already created.
+Source Data: Cadastro_Escolas.geo, Cadastro_Escolas.tab
+
+10. convertCoordinates
+It illustrates how to use the TeProjection class to make the conversion between two
+different projections.
+
+11. databaseQuery
+It illustrates how to use the TeDatabase class to submit queries on geometries tables
+of a TerraLib database.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+12. databaseSQLQuery
+It illustrates how to query geometries tables through explicit SQL queries on a TerraLib
+database.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+13. spatialQuery
+It illustrates how to make spatial queries on the layers of a TerraLib database.
+Source Data: cities.shp/shx/dbf, rivers.shp/shx/dbf, states.shp/shx/dbf
+
+14. addGeomRepresentation
+It illustrates how to add a point representation (centroids) to a layer with polygon
+representation.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+15. createTheme
+It illustrates how to create views and themes from layers of a Terralib database,
+without restriction and with restriction on its attributes.
+It depends on the layer created in the item 4 (importMIDMIF)
+
+16. themeGrouping
+It illustrates how to create a grouping on a theme created in a TerraLib database.
+It depends on the theme created in the item 15 (createTheme)
+
+17. createSTElementSet
+It illustrates how to create a Spatial Temporal Element Set, out of a theme created
+in a TerraLib database.
+It depends on the theme created in the item 15 (createTheme)
+
+18. mosaicTIFFImages
+It illustrates how to import to TIFF files to the same layer in a TerraLib database, 
+generating a mosaic of images.
+It depends on the files nat1.tif and nat2.tif.
+
+19. importCSV
+It illustrates how to import a MIF / MIF file to a new layer in a TerraLib database
+and how to import a second attribute table from a CSV file.
+It depends on the files RecifeBairros.MIF RecifeBairros.MID and RecifeBairros2.csv
diff --git a/examples/Release/ijl15.dll b/examples/Release/ijl15.dll
new file mode 100644
index 0000000..0ea9873
Binary files /dev/null and b/examples/Release/ijl15.dll differ
diff --git a/examples/Release/libMySQL.dll b/examples/Release/libMySQL.dll
new file mode 100644
index 0000000..de2c2d2
Binary files /dev/null and b/examples/Release/libMySQL.dll differ
diff --git a/examples/Release/libpq.dll b/examples/Release/libpq.dll
new file mode 100644
index 0000000..6e95daa
Binary files /dev/null and b/examples/Release/libpq.dll differ
diff --git a/examples/Release/oci.dll b/examples/Release/oci.dll
new file mode 100644
index 0000000..59be9f8
Binary files /dev/null and b/examples/Release/oci.dll differ
diff --git a/examples/Release/zlib.dll b/examples/Release/zlib.dll
new file mode 100644
index 0000000..e93cdb9
Binary files /dev/null and b/examples/Release/zlib.dll differ
diff --git a/examples/addGeomRepresentation/.cdtproject b/examples/addGeomRepresentation/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/addGeomRepresentation/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/addGeomRepresentation/.project b/examples/addGeomRepresentation/.project
new file mode 100644
index 0000000..cb77656
--- /dev/null
+++ b/examples/addGeomRepresentation/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>addGeomRepresentation</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/addGeomRepresentation/Makefile b/examples/addGeomRepresentation/Makefile
new file mode 100644
index 0000000..fb9f796
--- /dev/null
+++ b/examples/addGeomRepresentation/Makefile
@@ -0,0 +1,23 @@
+all: addGeomRepresentation
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+addGeomRepresentation: shapelib tiff terralib stat
+	qmake -o makeAddGeomRepresentation addGeomRepresentation.pro; make -f makeAddGeomRepresentation
+
+clean:
+	if \
+		test -f makeAddGeomRepresentation; \
+	then \
+		make -f makeAddGeomRepresentation distclean; rm -f makeAddGeomRepresentation; \
+	fi
\ No newline at end of file
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.cpp b/examples/addGeomRepresentation/addGeomRepresentation.cpp
new file mode 100644
index 0000000..0ab24da
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.cpp
@@ -0,0 +1,96 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to create a point representation
+	(centroid of polygons) to a layer in a TerraLib database.
+
+	Author: Lubia Vinhas  
+*/
+
+#include "TeMySQL.h"
+
+int main()
+{
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to the TerraTeste MySQL database
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+	TeLayer* distritos = new TeLayer("Distritos");
+	if (!db->loadLayer(distritos))
+	{
+		cout << "Fail to load layer \"Distritos\": " << db->errorMessage() << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Check whether the table of points to be generated 
+	// already exists in the database
+	string pointsTableName = distritos->tableName(TePOINTS);
+	if (pointsTableName.empty() == false)
+	{
+		if (db->tableExist(pointsTableName))
+		{
+			cout << "The table of points \"" << pointsTableName << "\" already exists in the database!\n\n";  
+			db->close();
+			cout << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+	}
+
+	TeRepresentation* repPol = distritos->getRepresentation(TePOLYGONS);
+	TePointSet centroids; 	//generate centroids
+	if (db->Centroid(repPol->tableName_, TePOLYGONS, centroids) == false)
+	{
+		cout << "Fail to create centroids: " << db->errorMessage();  
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	 //  Add new representation to the layer
+	distritos->addPoints(centroids);
+	cout << "Centroids created!\n\n";  
+
+	db->close();
+	cout << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.dsp b/examples/addGeomRepresentation/addGeomRepresentation.dsp
new file mode 100644
index 0000000..542ab26
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="addGeomRepresentation" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=addGeomRepresentation - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "addGeomRepresentation.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "addGeomRepresentation.mak" CFG="addGeomRepresentation - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "addGeomRepresentation - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "addGeomRepresentation - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "addGeomRepresentation - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "addGeomRepresentation - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "addGeomRepresentation - Win32 Release"
+# Name "addGeomRepresentation - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\addGeomRepresentation.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.dsw b/examples/addGeomRepresentation/addGeomRepresentation.dsw
new file mode 100644
index 0000000..c6679e6
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "addGeomRepresentation"=".\addGeomRepresentation.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/addGeomRepresentation/addGeomRepresentation.pro b/examples/addGeomRepresentation/addGeomRepresentation.pro
new file mode 100644
index 0000000..44f3460
--- /dev/null
+++ b/examples/addGeomRepresentation/addGeomRepresentation.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = addGeomRepresentation
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	addGeomRepresentation.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/convertCoordinates/.cdtproject b/examples/convertCoordinates/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/convertCoordinates/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/convertCoordinates/.project b/examples/convertCoordinates/.project
new file mode 100644
index 0000000..13596ff
--- /dev/null
+++ b/examples/convertCoordinates/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>convertCoordinates</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/convertCoordinates/Makefile b/examples/convertCoordinates/Makefile
new file mode 100644
index 0000000..5125abf
--- /dev/null
+++ b/examples/convertCoordinates/Makefile
@@ -0,0 +1,23 @@
+all: convertCoordinates
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+convertCoordinates: shapelib tiff terralib stat
+	qmake -o makeConvertCoordinates convertCoordinates.pro; make -f makeConvertCoordinates
+
+clean:
+	if \
+		test -f makeConvertCoordinates; \
+	then \
+		make -f makeConvertCoordinates distclean; rm -f makeConvertCoordinates; \
+	fi
\ No newline at end of file
diff --git a/examples/convertCoordinates/convertCoordinates.cpp b/examples/convertCoordinates/convertCoordinates.cpp
new file mode 100644
index 0000000..5af38eb
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.cpp
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+        This file showns an example of how to create a new TerraLib database
+        in an MySQL SGDB
+
+        Author: Lubia Vinhas  
+*/
+#include <TeProjection.h>
+#include <iostream>
+
+int main()
+{
+	TeDatum dSAD69 = TeDatumFactory::make("SAD69");		// SAD69 Spheroid
+
+	TeDatum dWGS84 = TeDatumFactory::make("WGS84");		// WGS84 Spheroid
+
+	TeUtm* pUTM = new TeUtm(dSAD69,-45.0*TeCDR);		// Origin latitude of -45.0
+														// TeCDR means "Convert to Degrees from Radians"
+
+	TePolyconic* pPolyconic = new TePolyconic(dWGS84,-45.0*TeCDR);	// Origin latitude of -45.0
+																																			// TeCDR means "Converte Degrees from Radians"
+	TeCoord2D pt1(340033.47, 7391306.21);		// Original coordinate in UTM
+
+	// Conversion from the UTM to the Polyconic projection
+	pUTM->setDestinationProjection(pPolyconic);
+
+	TeCoord2D ll = pUTM->PC2LL(pt1);			// Convert to Lat Long
+	TeCoord2D pt2 = pPolyconic->LL2PC(ll);		// Convert to output projection
+
+	printf("UTM -> Polyconic \n");
+	printf("(%.4f, %.4f) -> ",pt1.x(), pt1.y());
+	printf("(%.4f, %.4f) \n",pt2.x(), pt2.y());
+
+	// Conversion from the Polyconic to the UTM projection
+	pPolyconic->setDestinationProjection(pUTM);
+	ll = pPolyconic->PC2LL(pt2);
+	pt1 = pUTM->LL2PC(ll);
+
+	printf("\nPolyconic -> UTM \n");
+	printf("(%.4f, %.4f) -> ",pt2.x(), pt2.y());
+	printf("(%.4f, %.4f) \n",pt1.x(), pt1.y());
+
+	cout << "\nPress Enter\n" ;
+	cout.flush();
+	getchar();
+	return 0;
+}
diff --git a/examples/convertCoordinates/convertCoordinates.dsp b/examples/convertCoordinates/convertCoordinates.dsp
new file mode 100644
index 0000000..d8501dc
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.dsp
@@ -0,0 +1,106 @@
+# Microsoft Developer Studio Project File - Name="convertCoordinates" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=convertCoordinates - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "convertCoordinates.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "convertCoordinates.mak" CFG="convertCoordinates - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "convertCoordinates - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "convertCoordinates - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "convertCoordinates - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "convertCoordinates - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "convertCoordinates - Win32 Release"
+# Name "convertCoordinates - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\convertCoordinates.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/convertCoordinates/convertCoordinates.dsw b/examples/convertCoordinates/convertCoordinates.dsw
new file mode 100644
index 0000000..124a217
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "convertCoordinates"=".\convertCoordinates.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/convertCoordinates/convertCoordinates.pro b/examples/convertCoordinates/convertCoordinates.pro
new file mode 100644
index 0000000..3b58927
--- /dev/null
+++ b/examples/convertCoordinates/convertCoordinates.pro
@@ -0,0 +1,45 @@
+TEMPLATE = app
+TARGET = convertCoordinates
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	convertCoordinates.cpp
+
+HEADERS	+= \
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/copyLayer/.cdtproject b/examples/copyLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/copyLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/copyLayer/.project b/examples/copyLayer/.project
new file mode 100644
index 0000000..3dc526b
--- /dev/null
+++ b/examples/copyLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>copyLayer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/copyLayer/Makefile b/examples/copyLayer/Makefile
new file mode 100644
index 0000000..8920e34
--- /dev/null
+++ b/examples/copyLayer/Makefile
@@ -0,0 +1,23 @@
+all: copyLayer
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+copyLayer: shapelib tiff terralib stat
+	qmake -o makeCopyLayer copyLayer.pro; make -f makeCopyLayer
+
+clean:
+	if \
+		test -f makeCopyLayer; \
+	then \
+		make -f makeCopyLayer distclean; rm -f makeCopyLayer; \
+	fi
\ No newline at end of file
diff --git a/examples/copyLayer/copyLayer.cpp b/examples/copyLayer/copyLayer.cpp
new file mode 100644
index 0000000..ef3f7bd
--- /dev/null
+++ b/examples/copyLayer/copyLayer.cpp
@@ -0,0 +1,88 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+	This file shows an example of how to duplicate a layer changing its projection.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeMySQL.h>
+#include <TeLayerFunctions.h>
+
+int main()
+{
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to a MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	cout << "Database \"" << dbname << "\" connected on MySQL \"localhost\" server!" << endl << endl;
+
+	// Load the layer Distritos by its name 
+	TeLayer* layer1 = new TeLayer("Distritos");
+	if (!db->loadLayer(layer1))                
+	{                                                                                               
+		cout << "The layer \"Distritos\" could not be loaded from the database!\n\n";
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Layer \"" << layer1->name() << "\" retrieved!" << endl;
+
+	// Show the layer projection
+	TeProjection* proj1 = layer1->projection();
+	cout << "Projection/Datum of the layer \"Distritos\": " << proj1->name();
+	cout << "/" << proj1->datum().name() << endl <<endl; 
+
+	// Create a different projection
+	TeDatum sad69 = TeDatumFactory::make("SAD69");
+	TeProjection* proj2 = new TeLatLong(sad69);
+
+	// Create a layer with a different projection
+	TeLayer* layer2 = new TeLayer("Distritos_LL", db, proj2);
+
+	// Copy the layer doing a remapping of its geometries
+	bool res = TeCopyLayerToLayer(layer1, layer2);
+
+	if (res)
+		cout << "Layer \"Distritos\" was successfully copied to layer \"Distritos_LL\"\n\n";
+	else
+		cout << "Fail to remap layer!\n\n";
+
+	db->close();
+	cout << "Press Enter\n";
+	getchar();
+	return 0;
+} 
diff --git a/examples/copyLayer/copyLayer.dsp b/examples/copyLayer/copyLayer.dsp
new file mode 100644
index 0000000..e5fcc87
--- /dev/null
+++ b/examples/copyLayer/copyLayer.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="copyLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=copyLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "copyLayer.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "copyLayer.mak" CFG="copyLayer - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "copyLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "copyLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "copyLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "copyLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "copyLayer - Win32 Release"
+# Name "copyLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\copyLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeLayerFunctions.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeLayerFunctions.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/copyLayer/copyLayer.dsw b/examples/copyLayer/copyLayer.dsw
new file mode 100644
index 0000000..1907dea
--- /dev/null
+++ b/examples/copyLayer/copyLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "copyLayer"=".\copyLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/copyLayer/copyLayer.pro b/examples/copyLayer/copyLayer.pro
new file mode 100644
index 0000000..4d73380
--- /dev/null
+++ b/examples/copyLayer/copyLayer.pro
@@ -0,0 +1,49 @@
+TEMPLATE = app
+TARGET = copyLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	copyLayer.cpp \
+	../src/terralib/functions/TeLayerFunctions.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeLayerFunctions.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createDatabase/.cdtproject b/examples/createDatabase/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createDatabase/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createDatabase/.project b/examples/createDatabase/.project
new file mode 100644
index 0000000..c549545
--- /dev/null
+++ b/examples/createDatabase/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createDatabase</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createDatabase/Makefile b/examples/createDatabase/Makefile
new file mode 100644
index 0000000..c883e6e
--- /dev/null
+++ b/examples/createDatabase/Makefile
@@ -0,0 +1,23 @@
+all: createDatabase
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createDatabase: shapelib tiff terralib stat
+	qmake -o makeCreateDatabase createDatabase.pro; make -f makeCreateDatabase
+
+clean:
+	if \
+		test -f makeCreateDatabase; \
+	then \
+		make -f makeCreateDatabase distclean; rm -f makeCreateDatabase; \
+	fi
\ No newline at end of file
diff --git a/examples/createDatabase/createDatabase.cpp b/examples/createDatabase/createDatabase.cpp
new file mode 100644
index 0000000..0c660e2
--- /dev/null
+++ b/examples/createDatabase/createDatabase.cpp
@@ -0,0 +1,65 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+	This file shows an example of how to create a TerraLib database called "TerraTeste"
+	in an MySQL DBMS Server running in the local machine, supposing there is an
+	user called "root" with no password.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Creates a new database
+	TeDatabase* db = new TeMySQL();
+	if (!db->newDatabase(dbname, user, password, host))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		cout.flush();
+		getchar();
+		return 1;
+	}
+	cout << "The database \"" << dbname;
+	cout << "\" was created successfully in the MySQL server located in \"" << host;
+	cout << "\" for the user named \"" << user << "\" !"  << endl;
+
+	// Close database
+	db->close();
+	cout << endl << "Press Enter\n";
+	cout.flush();
+	getchar();
+	return 0;
+}
+
+
+
+ 
diff --git a/examples/createDatabase/createDatabase.dsp b/examples/createDatabase/createDatabase.dsp
new file mode 100644
index 0000000..7fe906f
--- /dev/null
+++ b/examples/createDatabase/createDatabase.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createDatabase" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createDatabase - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createDatabase.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createDatabase.mak" CFG="createDatabase - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createDatabase - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createDatabase - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createDatabase - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createDatabase - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createDatabase - Win32 Release"
+# Name "createDatabase - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createDatabase.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createDatabase/createDatabase.dsw b/examples/createDatabase/createDatabase.dsw
new file mode 100644
index 0000000..93a869b
--- /dev/null
+++ b/examples/createDatabase/createDatabase.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createDatabase"=".\createDatabase.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createDatabase/createDatabase.pro b/examples/createDatabase/createDatabase.pro
new file mode 100644
index 0000000..bc8cadc
--- /dev/null
+++ b/examples/createDatabase/createDatabase.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createDatabase
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createDatabase.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createLayer/.cdtproject b/examples/createLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createLayer/.project b/examples/createLayer/.project
new file mode 100644
index 0000000..eba638a
--- /dev/null
+++ b/examples/createLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createLayer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createLayer/Makefile b/examples/createLayer/Makefile
new file mode 100644
index 0000000..424dccc
--- /dev/null
+++ b/examples/createLayer/Makefile
@@ -0,0 +1,23 @@
+all: createLayer
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createLayer: shapelib tiff terralib stat
+	qmake -o makeCreateLayer createLayer.pro; make -f makeCreateLayer
+
+clean:
+	if \
+		test -f makeCreateLayer; \
+	then \
+		make -f makeCreateLayer distclean; rm -f makeCreateLayer; \
+	fi
\ No newline at end of file
diff --git a/examples/createLayer/createLayer.cpp b/examples/createLayer/createLayer.cpp
new file mode 100644
index 0000000..6a6e44f
--- /dev/null
+++ b/examples/createLayer/createLayer.cpp
@@ -0,0 +1,298 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to create a layer in a MySQL TerraLib database,
+	and insert some vectorial data in this new layer. 
+	
+	Author: Lubia Vinhas  
+*/
+
+#include <TeMySQL.h>
+
+
+int main()
+{
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Opens a connection to a database accessible though ADO
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";
+
+	// Creates a projection
+	TeDatum mDatum = TeDatumFactory::make("SAD69");
+	TeProjection* pUTM = new TeUtm(mDatum,0.0);
+
+	// Create a new layer called "TesteLayer"
+	string layerName = "TesteLayer";
+	if (db->layerExist(layerName))
+	{
+		cout << "There is already a layer named \"TesteLayer\" in the TerraLib database!\n\n";
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeLayer* layer = new TeLayer(layerName, db, pUTM);
+	if (layer->id() <= 0)      // layer wasn�t created properly
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Add the geometry representation LINES and store it in a table called "TesteLayerLines"
+	if (!layer->addGeometry(TeLINES, "TesteLayerLines"))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Create a set of lines
+	TeLine2D reta;
+	reta.add(TeCoord2D(500,500));
+	reta.add(TeCoord2D(600,500));
+	reta.add(TeCoord2D(700,500));
+	reta.objectId("reta");
+
+	TeLine2D ele;
+	ele.add(TeCoord2D(500,600));
+	ele.add(TeCoord2D(600,600));
+	ele.add(TeCoord2D(700,700));
+	ele.add(TeCoord2D(800,600));
+	ele.add(TeCoord2D(900,600));
+	ele.objectId("ele");
+
+	TeLineSet ls;
+	ls.add(reta);
+	ls.add(ele);
+
+	// Add the line set to the layer
+	if (!layer->addLines(ls))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	else
+		cout << "Lines inserted to the new layer!\n";
+
+	// Creates a set of  polygons
+	// A simple polygon
+	TeLine2D line;
+	line.add(TeCoord2D(900,900));
+	line.add(TeCoord2D(900,1000));
+	line.add(TeCoord2D(1000,1000));
+	line.add(TeCoord2D(1000,900));
+	line.add(TeCoord2D(900,900));
+
+	TeLinearRing r1(line);
+	TePolygon poly1;
+	poly1.add(r1);
+	poly1.objectId("spoli");
+
+	// A polygon with a hole
+	TeLine2D line2;
+	line2.add(TeCoord2D(200,200));
+	line2.add(TeCoord2D(200,400));
+	line2.add(TeCoord2D(400,400));
+	line2.add(TeCoord2D(400,200));
+	line2.add(TeCoord2D(200,200));
+
+	TeLinearRing r2(line2);
+
+	TeLine2D line3;
+	line3.add(TeCoord2D(250,250));
+	line3.add(TeCoord2D(250,300));
+	line3.add(TeCoord2D(300,300));
+	line3.add(TeCoord2D(300,250));
+	line3.add(TeCoord2D(250,250));
+
+	TeLinearRing r3(line3);
+
+	TePolygon poly2;
+	poly2.add(r2);
+	poly2.add(r3);
+	poly2.objectId("cpoli");
+
+	TePolygonSet ps;
+	ps.add(poly1);
+	ps.add(poly2);
+
+	// Add the polygon set to the layer
+	// As addGeometry wasn�t called before, the table of polygons will have a default name
+	if (!layer->addPolygons(ps))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	else
+		cout << "Polygons inserted in the new layer!\n";
+
+	// Create a set of points
+	TePoint p1(40,40);
+	p1.objectId("ponto1");
+	TePoint p2(65,65);
+	p2.objectId("ponto2");
+
+	TePointSet pos;
+	pos.add(p1);
+	pos.add(p2);
+
+	// Add the point set to the layer
+	// As addGeometry wasn�t called before, the table of points will have a default name
+	if (!layer->addPoints(pos))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	else
+		cout << "Points inserted in the new layer!\n";
+
+	// Create an attribute table
+	// Define a list of attributes
+	TeAttributeList attList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.numChar_ = 16;
+	at.rep_.name_ = "object_id";
+	at.rep_.isPrimaryKey_ = true;
+	attList.push_back(at);
+
+	at.rep_.type_ = TeSTRING;       // a string attribute
+	at.rep_.numChar_ = 255;
+	at.rep_.name_ = "nome";
+	at.rep_.isPrimaryKey_ = false;
+	attList.push_back(at);  
+
+	at.rep_.type_ = TeREAL; // a float attribute
+	at.rep_.name_ = "val1";
+	at.rep_.isPrimaryKey_ = false;
+	attList.push_back(at);  
+
+	at.rep_.type_ = TeINT;          // an integer attribute
+	at.rep_.name_ = "val2";
+	at.rep_.isPrimaryKey_ = false;
+	attList.push_back(at);  
+
+	// Create an attribute table associated to the new layer, called "TesteLayerAttr"
+	TeTable attTable("TesteLayerAttr", attList, "object_id", "object_id");		// creates a table in memory
+	if (!layer->createAttributeTable(attTable))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Each row is related to one of the geometries by its objetc_id
+	TeTableRow row;
+	row.push_back("reta");
+	row.push_back("An straight line");
+	row.push_back("11.1");
+	row.push_back("11");
+	attTable.add(row);
+	row.clear();
+
+	row.push_back("ele");
+	row.push_back("A mountain shaped line");
+	row.push_back("22.2");
+	row.push_back("22");
+	attTable.add(row);
+	row.clear();
+
+	row.push_back("spoli");
+	row.push_back("A simple polygon");
+	row.push_back("33.3");
+	row.push_back("33");
+	attTable.add(row);
+
+	row.clear();
+	row.push_back("ponto1");
+	row.push_back("A point");
+	row.push_back("55.5");
+	row.push_back("55");
+	attTable.add(row);
+	row.clear();
+
+	row.push_back("ponto2");
+	row.push_back("Another point");
+	row.push_back("66.6");
+	row.push_back("66");
+	attTable.add(row);
+	row.clear();
+
+	row.push_back("cpoli");
+	row.push_back("A polygon with hole");
+	row.push_back("44.4");
+	row.push_back("44");
+	attTable.add(row);
+	row.clear();
+
+	// Saves the table in the database
+	if (!layer->saveAttributeTable( attTable ))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	else
+		cout << "Objects inserted in the new layer!\n\n";
+
+	// Close database
+	db->close();
+	cout << "Press Enter\n";
+	cout.flush();
+	getchar();
+	return 0;
+}
+
diff --git a/examples/createLayer/createLayer.dsp b/examples/createLayer/createLayer.dsp
new file mode 100644
index 0000000..86ea6b4
--- /dev/null
+++ b/examples/createLayer/createLayer.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createLayer.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createLayer.mak" CFG="createLayer - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createLayer - Win32 Release"
+# Name "createLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createLayer/createLayer.dsw b/examples/createLayer/createLayer.dsw
new file mode 100644
index 0000000..74d2e1b
--- /dev/null
+++ b/examples/createLayer/createLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "createLayer"=".\createLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createLayer/createLayer.pro b/examples/createLayer/createLayer.pro
new file mode 100644
index 0000000..3b1bb3d
--- /dev/null
+++ b/examples/createLayer/createLayer.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createLayer.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createProximityMatrix/.cdtproject b/examples/createProximityMatrix/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createProximityMatrix/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createProximityMatrix/.project b/examples/createProximityMatrix/.project
new file mode 100644
index 0000000..ec93901
--- /dev/null
+++ b/examples/createProximityMatrix/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createProximityMatrix</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createProximityMatrix/Makefile b/examples/createProximityMatrix/Makefile
new file mode 100644
index 0000000..d969fd8
--- /dev/null
+++ b/examples/createProximityMatrix/Makefile
@@ -0,0 +1,23 @@
+all: createProximityMatrix
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createProximityMatrix: shapelib tiff terralib stat
+	qmake -o makeCreateProximityMatrix createProximityMatrix.pro; make -f makeCreateProximityMatrix
+
+clean:
+	if \
+		test -f makeCreateProximityMatrix; \
+	then \
+		make -f makeCreateProximityMatrix distclean; rm -f makeCreateProximityMatrix; \
+	fi
\ No newline at end of file
diff --git a/examples/createProximityMatrix/createProximityMatrix.cpp b/examples/createProximityMatrix/createProximityMatrix.cpp
new file mode 100644
index 0000000..49eb34b
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.cpp
@@ -0,0 +1,131 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+   This file illustrates an example of how to create a proximity matrix from a 
+   Spatial Temporal Element Set (STElementSet). 
+   In this example, the distance strategy is used to construct the matrix.   
+
+   Author: Karine Reis   
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeGeneralizedProxMatrix.h>
+#include <TeMySQL.h>
+
+int main()
+{	
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraLib";
+	string user = "root";
+	string password = "ferreira";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+		
+	
+	// Opens a connection to a TerraLib database 
+    // Loads a layer named DistritosSP 
+	TeLayer* DistritosSP =  new TeLayer("DistritosSP");
+	if (!db->loadLayer(DistritosSP))
+	{
+	    cout << "Fail to load the layer!" << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+
+	// Inits querier strategies
+	TeInitQuerierStrategies();
+    
+	// Creates a STElementSet from DistritosSP layer 
+	TeSTElementSet steSet(DistritosSP);
+
+	// Builds the STElementSet with geometries
+	if(!TeSTOSetBuildDB(&steSet, true, false))
+	{
+		cout << "Error! " << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	
+	// Shows how many elements the elementSet has
+	cout << "Number of elements: " <<  steSet.numElements() << endl;
+
+	
+	// Builds the proximity matrix
+	TeGeneralizedProxMatrix				proxMat;
+	
+	TeProxMatrixLocalDistanceStrategy   sc_dist (&steSet, TePOLYGONS, 12000.00);
+	TeProxMatrixNoWeightsStrategy		sw_no;
+	TeProxMatrixNoSlicingStrategy		ss_no;
+	
+	proxMat.setCurrentSlicingStrategy(&ss_no);
+	proxMat.setCurrentWeightsStrategy(&sw_no);
+	proxMat.setCurrentConstructionStrategy(&sc_dist);
+
+	if(!proxMat.ConstructMatrix())
+	{
+		cout << "Error building proximity matrix! " << endl;
+		getchar();
+		db->close ();
+		return 0;
+	}
+
+	// Shows the neighbours of each object from proxMat
+	TeSTElementSet::iterator it = steSet.begin();
+	while ( it != steSet.end())
+	{
+		cout<< " The neighbours of the element  "<< (*it).objectId() << " are: " << endl;
+			
+		// Gets the neighbours of an element
+		TeNeighboursMap neighbors = proxMat.getMapNeighbours((*it).objectId());
+		TeNeighboursMap::iterator itN = neighbors.begin();
+		while (itN != neighbors.end())
+		{
+			cout<< "         "<<(*itN).first << endl;
+			++itN;
+		}
+		cout << endl;
+		++it;
+	}
+
+	
+	db->close();
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/createProximityMatrix/createProximityMatrix.dsp b/examples/createProximityMatrix/createProximityMatrix.dsp
new file mode 100644
index 0000000..cc7ba19
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createProximityMatrix" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createProximityMatrix - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createProximityMatrix.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createProximityMatrix.mak" CFG="createProximityMatrix - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createProximityMatrix - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createProximityMatrix - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createProximityMatrix - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createProximityMatrix - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createProximityMatrix - Win32 Release"
+# Name "createProximityMatrix - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createProximityMatrix.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createProximityMatrix/createProximityMatrix.dsw b/examples/createProximityMatrix/createProximityMatrix.dsw
new file mode 100644
index 0000000..7f285c2
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createProximityMatrix"=".\createProximityMatrix.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createProximityMatrix/createProximityMatrix.pro b/examples/createProximityMatrix/createProximityMatrix.pro
new file mode 100644
index 0000000..49a7bba
--- /dev/null
+++ b/examples/createProximityMatrix/createProximityMatrix.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createProximityMatrix
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createProximityMatrix.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSet/.cdtproject b/examples/createSTElementSet/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSet/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSet/.project b/examples/createSTElementSet/.project
new file mode 100644
index 0000000..6fb5fcc
--- /dev/null
+++ b/examples/createSTElementSet/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createSTElementSet</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createSTElementSet/Makefile b/examples/createSTElementSet/Makefile
new file mode 100644
index 0000000..596d1eb
--- /dev/null
+++ b/examples/createSTElementSet/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSet
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createSTElementSet: shapelib tiff terralib stat
+	qmake -o makeCreateSTElementSet createSTElementSet.pro; make -f makeCreateSTElementSet
+
+clean:
+	if \
+		test -f makeCreateSTElementSet; \
+	then \
+		make -f makeCreateSTElementSet distclean; rm -f makeCreateSTElementSet; \
+	fi
\ No newline at end of file
diff --git a/examples/createSTElementSet/createSTElementSet.cpp b/examples/createSTElementSet/createSTElementSet.cpp
new file mode 100644
index 0000000..5e865c2
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.cpp
@@ -0,0 +1,104 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+   This file illustrates an example of how to create a new Spatial Temporal Element 
+   Set (STElementSet) from a theme. A Spatial Temporal Element Set can be created 
+   from a layer or from a theme.
+   In this example the STElementSet is created from a layer and is filled only
+   with attributes.
+
+   Author: Karine Reis   
+*/
+
+#include <TeInitQuerierStrategy.h>
+#include <TeQuerierParams.h>
+#include <TeQuerier.h>
+#include <TeMySQL.h>
+
+int main()
+{	
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraLib";
+	string user = "root";
+	string password = "ferreira";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+	
+	TeTheme* trmsp = new TeTheme("DistritosSP");
+	if (!db->loadTheme(trmsp))
+	{
+	    cout << "Fail to load the theme \"T_dist\": " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+
+	TeInitQuerierStrategies();
+
+	// Defines the attributes that will be kept in the STElementSet. 
+	// The attribute name must be in the format "table_name.attribute_name"
+	vector<string> attrs;
+	attrs.push_back("DistritosSP.Nome");
+	attrs.push_back("DistritosSP.Populac");
+
+	// Define the parameters of the querier
+	TeQuerierParams qpar(false, attrs);
+	qpar.setParams(trmsp);
+
+	// Define a querier to the database
+	TeQuerier qdb(qpar);
+	qdb.loadInstances();
+
+	// Show how many instances the querier found
+	cout << "Number of instances: " << qdb.numElemInstances() << endl;
+
+	// Loop through all of the instances
+	TeSTInstance steInstance;
+	while (qdb.fetchInstance(steInstance))
+	{
+		string sigla, pop;
+		steInstance.getPropertyValue("DistritosSP.Nome", sigla);
+		steInstance.getPropertyValue("DistritosSP.Populac", pop);
+		
+		cout << " Object Identifier :  "<< steInstance.objectId() << endl; 
+		cout << " Sigla             :  "<< sigla  << endl; 
+		cout << " Renda             :  "<< pop  << endl << endl; 
+	}
+
+	db->close();
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/createSTElementSet/createSTElementSet.dsp b/examples/createSTElementSet/createSTElementSet.dsp
new file mode 100644
index 0000000..4d182a9
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSet" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSet - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSet.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSet.mak" CFG="createSTElementSet - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createSTElementSet - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSet - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createSTElementSet - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createSTElementSet - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createSTElementSet - Win32 Release"
+# Name "createSTElementSet - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSet.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSet/createSTElementSet.dsw b/examples/createSTElementSet/createSTElementSet.dsw
new file mode 100644
index 0000000..1dffefa
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSet"=".\createSTElementSet.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSet/createSTElementSet.pro b/examples/createSTElementSet/createSTElementSet.pro
new file mode 100644
index 0000000..95e757b
--- /dev/null
+++ b/examples/createSTElementSet/createSTElementSet.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createSTElementSet
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createSTElementSet.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSetFromLayer/.cdtproject b/examples/createSTElementSetFromLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSetFromLayer/.project b/examples/createSTElementSetFromLayer/.project
new file mode 100644
index 0000000..04c5800
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createSTElementSetFromLayer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createSTElementSetFromLayer/Makefile b/examples/createSTElementSetFromLayer/Makefile
new file mode 100644
index 0000000..2f7a78d
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSetFromLayer
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createSTElementSetFromLayer: shapelib tiff terralib stat
+	qmake -o makeCreateSTElementSetFromLayer createSTElementSetFromLayer.pro; make -f makeCreateSTElementSetFromLayer
+
+clean:
+	if \
+		test -f makeCreateSTElementSetFromLayer; \
+	then \
+		make -f makeCreateSTElementSetFromLayer distclean; rm -f makeCreateSTElementSetFromLayer; \
+	fi
\ No newline at end of file
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.cpp b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.cpp
new file mode 100644
index 0000000..810b38b
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.cpp
@@ -0,0 +1,120 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+   This file illustrates an example of how to create a new Spatial Temporal Element 
+   Set (STElementSet) from a layer. A Spatial Temporal Element Set can be created 
+   from a layer or from a theme.
+   In this example the STElementSet is created from a layer and is filled only
+   with some attributes.
+
+   Author: Karine Reis   
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeMySQL.h>
+
+int main()
+{	
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraLib";
+	string user = "root";
+	string password = "ferreira";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+	
+	// Loads the layer
+	TeLayer* estados = new TeLayer("EstadosBrasil");
+	if (!db->loadLayer(estados))
+	{
+	    cout << "Fail to load the layer \"EstadosBrasil\": " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+
+	// Inits querier strategies
+	TeInitQuerierStrategies();
+
+	// Creates a elementSet from the layer "estados"
+	TeSTElementSet steSet (estados);
+
+	// Defines what attributes will be kept in the elementSet. 
+	// The attribute name must be in the format "table_name.attribute_name"
+	vector<string> attrs;
+	attrs.push_back("EstadosBrasil.NOME_UF");
+	attrs.push_back("EstadosBrasil.CAPITAL");
+
+	// Fills the elementSet without geometries and with the 
+	// attributes NOME_UF and CAPITAL 
+	bool loadGeometries = false;
+	bool loadAllAttributes = false;
+	if(!TeSTOSetBuildDB(&steSet, loadGeometries, loadAllAttributes, attrs))
+	{
+		cout << "Error! " << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Prints the number of elements of the elementSet
+	cout << "Number of elements: " << steSet.numElements() << endl;
+
+	
+	TeSTElementSet::iterator it = steSet.begin();
+	while ( it != steSet.end())
+	{
+		TeSTInstance st = (*it);
+
+		string desc;
+		// returns the attributes
+		TePropertyVector vectp = st.getPropertyVector();
+
+		cout << "Id: " << st.objectId() << " ---------------- " << endl;
+		for (unsigned int i=0; i<vectp.size(); i++)
+		{
+			cout << vectp[i].attr_.rep_.name_ << "  =  ";
+			cout << vectp[i].value_ << endl;
+		}
+		cout << endl;
+		++it;
+	}
+
+	db->close();
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsp b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsp
new file mode 100644
index 0000000..54d6bb3
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSetFromLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSetFromLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSetFromLayer.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSetFromLayer.mak" CFG="createSTElementSetFromLayer - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createSTElementSetFromLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSetFromLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createSTElementSetFromLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createSTElementSetFromLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createSTElementSetFromLayer - Win32 Release"
+# Name "createSTElementSetFromLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSetFromLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsw b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsw
new file mode 100644
index 0000000..4b25b14
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSetFromLayer"=".\createSTElementSetFromLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.pro b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.pro
new file mode 100644
index 0000000..30cc298
--- /dev/null
+++ b/examples/createSTElementSetFromLayer/createSTElementSetFromLayer.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createSTElementSetFromLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createSTElementSetFromLayer.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSetFromShapeFile/.cdtproject b/examples/createSTElementSetFromShapeFile/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSetFromShapeFile/.project b/examples/createSTElementSetFromShapeFile/.project
new file mode 100644
index 0000000..35c9993
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createSTElementSetFromShapeFile</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createSTElementSetFromShapeFile/Makefile b/examples/createSTElementSetFromShapeFile/Makefile
new file mode 100644
index 0000000..90879dc
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSetFromShapeFile
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createSTElementSetFromShapeFile: shapelib tiff terralib stat
+	qmake -o makeCreateSTElementSetFromShapeFile createSTElementSetFromShapeFile.pro; make -f makeCreateSTElementSetFromShapeFile
+
+clean:
+	if \
+		test -f makeCreateSTElementSetFromShapeFile; \
+	then \
+		make -f makeCreateSTElementSetFromShapeFile distclean; rm -f makeCreateSTElementSetFromShapeFile; \
+	fi
\ No newline at end of file
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.cpp b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.cpp
new file mode 100644
index 0000000..6a7ccef
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.cpp
@@ -0,0 +1,76 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This file illustrates an example of how to create a new Spatial Temporal Element 
+   Set (STElementSet) from a shapefile. 
+
+   Author: Karine Reis Ferreira 
+*/
+
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsSHP.h>
+#include <TeMySQL.h>
+
+int
+main()
+{
+	
+	// shape file name with its path 
+	string filename = "../../examples/data/EstadosBrasil.shp";
+	
+	TeSTElementSet  steSet;
+
+	// fills the element set from shape file
+	if (!TeSTOSetBuildSHP(steSet,filename))
+	{
+		cout << "Erro\n";
+		return 1;
+	}
+	
+	// prints the number of elements of the element set
+	cout << "Number of elements: " << steSet.numElements() << endl;
+
+	TeSTElementSet::iterator it = steSet.begin();
+	while ( it != steSet.end())
+	{
+		TeSTInstance st = (*it);
+
+		string desc;
+		// returns the attributes
+		TePropertyVector vectp = st.getPropertyVector();
+
+		cout << "Id: " << st.objectId() << "\nProperties:\n "; 
+		for (unsigned int i=0; i<vectp.size(); i++)
+		{
+			cout << vectp[i].attr_.rep_.name_ << "  =  ";
+			cout << vectp[i].value_ << endl;
+		}
+		cout << endl;
+		++it;
+	}
+	cout << "End\n";
+	cout.flush();
+	getchar();
+	return 0;
+}
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsp b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsp
new file mode 100644
index 0000000..fcefc4e
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsp
@@ -0,0 +1,130 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSetFromShapeFile" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSetFromShapeFile - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSetFromShapeFile.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSetFromShapeFile.mak" CFG="createSTElementSetFromShapeFile - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createSTElementSetFromShapeFile - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSetFromShapeFile - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createSTElementSetFromShapeFile - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createSTElementSetFromShapeFile - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createSTElementSetFromShapeFile - Win32 Release"
+# Name "createSTElementSetFromShapeFile - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSetFromShapeFile.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSTEFunctionsSHP.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSTEFunctionsSHP.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsw b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsw
new file mode 100644
index 0000000..3f4dfc7
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSetFromShapeFile"=".\createSTElementSetFromShapeFile.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.pro b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.pro
new file mode 100644
index 0000000..42a59ab
--- /dev/null
+++ b/examples/createSTElementSetFromShapeFile/createSTElementSetFromShapeFile.pro
@@ -0,0 +1,51 @@
+TEMPLATE = app
+TARGET = createSTElementSetFromShapeFile
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createSTElementSetFromShapeFile.cpp \
+	../src/terralib/functions/TeImportDBF.cpp \
+	../src/terralib/functions/TeSTEFunctionsSHP.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeImportExport.h \
+	../src/terralib/functions/TeSTEFunctionsSHP.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createSTElementSetFromTheme/.cdtproject b/examples/createSTElementSetFromTheme/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createSTElementSetFromTheme/.project b/examples/createSTElementSetFromTheme/.project
new file mode 100644
index 0000000..1f4381d
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createSTElementSetFromTheme</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createSTElementSetFromTheme/Makefile b/examples/createSTElementSetFromTheme/Makefile
new file mode 100644
index 0000000..ce3c22a
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/Makefile
@@ -0,0 +1,23 @@
+all: createSTElementSetFromTheme
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createSTElementSetFromTheme: shapelib tiff terralib stat
+	qmake -o makeCreateSTElementSetFromTheme createSTElementSetFromTheme.pro; make -f makeCreateSTElementSetFromTheme
+
+clean:
+	if \
+		test -f makeCreateSTElementSetFromTheme; \
+	then \
+		make -f makeCreateSTElementSetFromTheme distclean; rm -f makeCreateSTElementSetFromTheme; \
+	fi
\ No newline at end of file
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.cpp b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.cpp
new file mode 100644
index 0000000..cae45f4
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.cpp
@@ -0,0 +1,147 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+   This file illustrates an example of how to create a new Spatial Temporal Element 
+   Set (STElementSet) from a theme. A Spatial Temporal Element Set can be created 
+   from a layer or from a theme.
+   This example creates a theme with spatial and attribute restrictions and fills 
+   a STElementSet from this created theme with all attributes and geometries.
+
+   Author: Karine Reis   
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeMySQL.h>
+
+int main()
+{	
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraLib";
+	string user = "root";
+	string password = "ferreira";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+	
+	// Loads the layer
+	TeLayer* bairrosPA =  new TeLayer("BairrosPoA");
+	if (!db->loadLayer(bairrosPA))
+	{
+	    cout << "Fail to load the layer!" << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+
+	// Loads the geometry of Santo Antonio district (id = 48)
+	TePolygonSet ps;
+	bairrosPA->loadGeometrySet("48", ps);
+		
+	// Loads a layer named OcorrenciaPoA 
+	TeLayer* OcorrenciaPoA =  new TeLayer("OcorrenciasPoA");
+	if (!db->loadLayer(OcorrenciaPoA))
+	{
+	    cout << "Fail to load the layer!" << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+
+	// Create a theme with retrictions from Ocorrencias layer, in memory
+	TeTheme* Ocorrencias = new TeTheme("Ocorrencias", OcorrenciaPoA);
+	TeAttrTableVector attrTables;
+	OcorrenciaPoA->getAttrTables(attrTables);
+	Ocorrencias->setAttTables(attrTables);
+	
+	//spatial restriction: within Santo Antonio district
+	Ocorrencias->setSpatialRest (&ps, TePOINTS, TeWITHIN);
+	//attribute restriction: type "amea�a"
+	Ocorrencias->attributeRest(" EVENTO = 'Amea�a' ");
+
+	// Inits querier strategies
+	TeInitQuerierStrategies();
+		
+	// Creates a elementSet from theme 
+	TeSTElementSet  steSet(Ocorrencias);
+
+	// Builds the elementSet with geometries and all attributes	
+	bool loadGeometries = true;
+	bool loadAllAttributes = true;
+	if(!TeSTOSetBuildDB(&steSet, loadGeometries, loadAllAttributes))
+	{
+		cout << "Error! " << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	
+	// Shows how many elements the elementSet has
+	cout << "Number of elements: " <<  steSet.numElements() << endl;
+
+	TeSTElementSet::iterator it = steSet.begin();
+	while ( it != steSet.end())
+	{
+		TeSTInstance st = (*it);
+
+		//Gets attribute value
+		string event;
+		st.getPropertyValue("EVENTO", event);
+		
+		cout << " Object Identifier :  " << st.objectId() << endl; 
+		cout << " Event	  :  " << event  << endl ; 
+				
+		//Gets geometry
+		if(st.hasPoints())
+		{
+			TePointSet pset;
+			st.getGeometry (pset);
+			cout<< "     point id: "<< pset[0].objectId ()	 << endl;
+			for(unsigned int j=0; j<pset.size (); ++j)
+			{
+				string point =  Te2String(pset[j].location().x()) +";"+  Te2String(pset[j].location().y());
+				cout<< "		point: " << " ("+ point + ") " <<endl << endl;
+			}
+		}
+		++it;
+	}
+
+	db->close();
+	delete (Ocorrencias);
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsp b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsp
new file mode 100644
index 0000000..432296a
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createSTElementSetFromTheme" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createSTElementSetFromTheme - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSetFromTheme.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createSTElementSetFromTheme.mak" CFG="createSTElementSetFromTheme - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createSTElementSetFromTheme - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createSTElementSetFromTheme - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createSTElementSetFromTheme - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createSTElementSetFromTheme - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createSTElementSetFromTheme - Win32 Release"
+# Name "createSTElementSetFromTheme - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createSTElementSetFromTheme.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsw b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsw
new file mode 100644
index 0000000..f73c38d
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createSTElementSetFromTheme"=".\createSTElementSetFromTheme.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.pro b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.pro
new file mode 100644
index 0000000..4579446
--- /dev/null
+++ b/examples/createSTElementSetFromTheme/createSTElementSetFromTheme.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createSTElementSetFromTheme
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createSTElementSetFromTheme.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createTable/.cdtproject b/examples/createTable/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createTable/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createTable/.project b/examples/createTable/.project
new file mode 100644
index 0000000..5c5761f
--- /dev/null
+++ b/examples/createTable/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createTable</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createTable/Makefile b/examples/createTable/Makefile
new file mode 100644
index 0000000..580198d
--- /dev/null
+++ b/examples/createTable/Makefile
@@ -0,0 +1,23 @@
+all: createTable
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createTable: shapelib tiff terralib stat
+	qmake -o makeCreateTable createTable.pro; make -f makeCreateTable
+
+clean:
+	if \
+		test -f makeCreateTable; \
+	then \
+		make -f makeCreateTable distclean; rm -f makeCreateTable; \
+	fi
\ No newline at end of file
diff --git a/examples/createTable/createTable.cpp b/examples/createTable/createTable.cpp
new file mode 100644
index 0000000..e43fa40
--- /dev/null
+++ b/examples/createTable/createTable.cpp
@@ -0,0 +1,211 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+	This file illustrates how to execute some operations relative to attribute tables
+	in a MySQL TerraLib database:
+	 - how to create an attribute table;
+	 - how to add some columns;
+	 - how to insert same data into it;
+	 - how to retrieve some rows using an SQL.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeTable.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+	// Create a table called "TesteTable"
+	string tableName = "TesteTable";
+	if (db->tableExist(tableName))
+	{
+		cout << "There is already a table named \"TesteTable\" in the TerraLib database!\n";
+		cout << "Some data will be retrieved from the table already created:\n\n";
+	}
+	else
+	{
+		// 1) Create a table
+
+		TeAttributeList attList;	
+		TeAttribute at;
+		at.rep_.name_= "IntCol";	
+		at.rep_.type_ = TeINT;	
+		at.rep_.isPrimaryKey_ = true;
+
+		attList.push_back(at);
+
+		if (!db->createTable(tableName, attList))
+		{
+			cout << "Fail to create the table: " << db->errorMessage() << endl;
+			db->close();
+			cout << endl << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+
+		//2)  Add new columns to the table
+
+		TeAttribute atr;
+		atr.rep_.name_= "TimeCol";
+		atr.rep_.type_ = TeDATETIME;
+		atr.dateTimeFormat_ = "DDsMMsYYYYsHHsmmsSS";
+		atr.dateChronon_ = TeSECOND;
+		atr.timeSeparator_ = ":";
+		atr.dateSeparator_ = "/";
+		attList.push_back(atr);
+
+		if (!db->addColumn(tableName, atr.rep_))
+		{
+			cout << "Fail to add the column \"TimeCol\" to the table: " << db->errorMessage() << endl;
+			db->close();
+			cout << endl << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+
+		atr.rep_.name_= "RealCol";
+		atr.rep_.type_ = TeREAL;
+		atr.rep_.numChar_ = 15;
+		atr.rep_.decimals_ = 4;
+		attList.push_back(atr);
+
+		if (!db->addColumn(tableName, atr.rep_))
+		{
+			cout << "Fail to add the column \"RealCol\" to the table: " << db->errorMessage() << endl;
+			db->close();
+			cout << endl << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+
+		atr.rep_.name_= "StringCol";
+		atr.rep_.type_ = TeSTRING;
+		atr.rep_.numChar_ = 10;
+		attList.push_back(atr);
+
+		if (!db->addColumn(tableName, atr.rep_))
+		{
+			cout << "Fail to add the column \"StringCol\" to the table: " << db->errorMessage() << endl;
+			db->close();
+			cout << endl << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+		
+		//3) Add two new rows to the table 
+
+		TeTable table(tableName, attList, "");		// creates a table in memory
+
+		TeTableRow row1;							// fill some rows
+		row1.push_back("1");
+		row1.push_back("25/4/2003 07:14");
+		row1.push_back("15.23");
+		row1.push_back("object1");
+		table.add(row1);
+
+		TeTableRow row2;
+		row2.push_back("2");
+		row2.push_back("01/03/1975 21:30:15");
+		row2.push_back("56.87");
+		row2.push_back("object2");
+		table.add(row2);
+
+		if (!db->insertTable(table))				// save the table into the database
+		{
+			cout << "Fail to save the table: " << db->errorMessage() << endl;
+			db->close();
+			cout << endl << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+	}
+
+	//	4) Retrieve some data from the table using a SQL query 
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+	{
+		cout << "Fail to get a portal fom the database: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	string sql = "SELECT * FROM " + tableName;
+
+	if (portal->query(sql) == false)
+	{
+		cout << "Fail to submit the query: " << db->errorMessage() << endl;
+		delete portal;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Retrieve the attributes from the table
+	int count = 1;
+	while (portal->fetchRow())
+	{
+		cout << "Row : " << count << endl;
+		int intAttribute = atoi(portal->getData(0));
+		cout << "Integer attribute: " << intAttribute << endl;
+
+		TeTime t = portal->getDate(1);
+		cout << "Time attribute: " ;
+		cout << t.getDateTime("DDsMMsYYYYsHHsmmsSS") << " or " << t.getDateTime("YYYYsMMsDDsHHsmmsSS") << endl;
+
+		cout << "Double attribute: " ;
+		double d = portal->getDouble(2);
+		cout << d << endl;
+
+		cout << "String attribute: ";
+		string x = portal->getData(3);
+		cout << x << endl << endl;
+		count++;
+	}
+
+	delete portal;
+	db->close();
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/createTable/createTable.dsp b/examples/createTable/createTable.dsp
new file mode 100644
index 0000000..f2830bd
--- /dev/null
+++ b/examples/createTable/createTable.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createTable" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createTable - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createTable.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createTable.mak" CFG="createTable - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createTable - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createTable - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createTable - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createTable - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createTable - Win32 Release"
+# Name "createTable - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createTable.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createTable/createTable.dsw b/examples/createTable/createTable.dsw
new file mode 100644
index 0000000..d065a6c
--- /dev/null
+++ b/examples/createTable/createTable.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createTable"=".\createTable.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createTable/createTable.pro b/examples/createTable/createTable.pro
new file mode 100644
index 0000000..9222d75
--- /dev/null
+++ b/examples/createTable/createTable.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createTable
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createTable.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/createTheme/.cdtproject b/examples/createTheme/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/createTheme/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/createTheme/.project b/examples/createTheme/.project
new file mode 100644
index 0000000..a70d613
--- /dev/null
+++ b/examples/createTheme/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>createTheme</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/createTheme/Makefile b/examples/createTheme/Makefile
new file mode 100644
index 0000000..3d8e7f1
--- /dev/null
+++ b/examples/createTheme/Makefile
@@ -0,0 +1,23 @@
+all: createTheme
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+createTheme: shapelib tiff terralib stat
+	qmake -o makeCreateTheme createTheme.pro; make -f makeCreateTheme
+
+clean:
+	if \
+		test -f makeCreateTheme; \
+	then \
+		make -f makeCreateTheme distclean; rm -f makeCreateTheme; \
+	fi
\ No newline at end of file
diff --git a/examples/createTheme/createTheme.cpp b/examples/createTheme/createTheme.cpp
new file mode 100644
index 0000000..bab0582
--- /dev/null
+++ b/examples/createTheme/createTheme.cpp
@@ -0,0 +1,184 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file illustrates how to create themes in a TerraLib database
+
+	Authors: Karine Reis Ferreira and Lubia Vinhas  
+*/
+
+#include <TeLegendEntry.h>
+#include <TeMySQL.h>
+
+
+int main()
+{
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+	// Load the layer "Distritos" which contains data of the districts of the Sao Paulo city
+	TeLayer* dist = new TeLayer("Distritos");
+	if (!db->loadLayer(dist))
+	{
+		cout << "Fail to load the layer \"Distritos\": " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeProjection* proj = dist->projection(); 
+
+	// Create a view with the same projection of the layer
+	string viewName = "SaoPaulo";
+
+	// Check whether there is a view with this name in the datatabase
+	if (db->viewExist(viewName))
+	{
+		cout << "There is already a view named \"" << viewName << "\" in the TerraLib database!\n";
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeView* view = new TeView(viewName, user); 
+	view->projection(proj);
+	if (!db->insertView(view))			// save the view in the database
+	{
+		cout << "Fail to insert the view \"SaoPaulo\" into the database: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Create a theme that will contain all of the objects of the layer (no restrictions applied)
+	TeTheme* theme = new TeTheme("T_dist", dist);
+	view->add(theme);
+		
+	// Set a default visual for the geometries of the objects of the layer 
+	// Polygons will be set with the blue color
+	TeColor color;
+	TeVisual polygonVisual(TePOLYGONS);
+	color.init(0,0,255);
+	polygonVisual.color(color); 
+    theme->setVisualDefault(polygonVisual, TePOLYGONS);
+
+	// Polygons will be set with the red color
+    TeVisual pointVisual(TePOINTS);
+	color.init(255,0,0);
+	pointVisual.color(color);
+    pointVisual.style(TePtTypeX);
+    theme->setVisualDefault(pointVisual, TePOINTS);
+
+	// Set all of the geometrical representations to be visible
+	int allRep = dist->geomRep();
+	theme->visibleRep(allRep);
+
+	// Show all of the attribute tables of the layer
+	theme->setAttTables(dist->attrTables());
+
+	// Save the theme in the database
+    if (!theme->save())	
+    {
+		cout << "Fail to save the theme \"T_dist\" in the database: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Build the collection of objects associated to the theme
+	if (!theme->buildCollection())
+	{
+		cout << "Fail to build the theme \"T_dist\": " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "The theme \"T_dist\" was created without restrictions!\n";
+
+	// Create a theme with the following attribute restriction:
+	// Districts with population higher than 100,000 people
+
+	TeTheme* themeRest = new TeTheme("T_dist_POP", dist);
+	themeRest->setAttTables (dist->attrTables());
+	
+	// Set the attribute restriction
+	string restAttr = " Pop91 > 100000 ";
+	themeRest->attributeRest(restAttr);
+
+	// Set all of the geometrical representations to be visible
+	themeRest->visibleRep(allRep);
+
+	// Set the visual
+	themeRest->setVisualDefault(polygonVisual, TePOLYGONS);
+	themeRest->setVisualDefault(pointVisual, TePOINTS);
+
+	// Insert the theme into the view
+	view->add(themeRest);
+
+	// Save the theme in the database
+	if (!themeRest->save())
+    {
+		cout << "Fail to save the theme \"T_dist_POP\" in the database: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Build the collection of objects associated to the theme
+	if (!themeRest->buildCollection())
+	{
+		cout << "Fail to build the theme \"T_dist_POP\": " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	cout << "The theme  \"T_dist_POP\" was created with attribute restrictions!\n\n";
+	db->close();
+	cout << endl << "Press Enter\n";
+    getchar();
+	return 0;
+}
+
+
diff --git a/examples/createTheme/createTheme.dsp b/examples/createTheme/createTheme.dsp
new file mode 100644
index 0000000..65444fd
--- /dev/null
+++ b/examples/createTheme/createTheme.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="createTheme" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=createTheme - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "createTheme.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "createTheme.mak" CFG="createTheme - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "createTheme - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "createTheme - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "createTheme - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "createTheme - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "createTheme - Win32 Release"
+# Name "createTheme - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\createTheme.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/createTheme/createTheme.dsw b/examples/createTheme/createTheme.dsw
new file mode 100644
index 0000000..e178cf7
--- /dev/null
+++ b/examples/createTheme/createTheme.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "createTheme"=".\createTheme.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/createTheme/createTheme.pro b/examples/createTheme/createTheme.pro
new file mode 100644
index 0000000..d710cdc
--- /dev/null
+++ b/examples/createTheme/createTheme.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = createTheme
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	createTheme.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/data/BairrosPoA.dbf b/examples/data/BairrosPoA.dbf
new file mode 100644
index 0000000..9219526
Binary files /dev/null and b/examples/data/BairrosPoA.dbf differ
diff --git a/examples/data/BairrosPoA.shp b/examples/data/BairrosPoA.shp
new file mode 100644
index 0000000..f9b0edb
Binary files /dev/null and b/examples/data/BairrosPoA.shp differ
diff --git a/examples/data/BairrosPoA.shx b/examples/data/BairrosPoA.shx
new file mode 100644
index 0000000..1506a7f
Binary files /dev/null and b/examples/data/BairrosPoA.shx differ
diff --git a/examples/data/BairrosRecife.mid b/examples/data/BairrosRecife.mid
new file mode 100644
index 0000000..838bde2
--- /dev/null
+++ b/examples/data/BairrosRecife.mid
@@ -0,0 +1,94 @@
+261160605001
+261160605002
+261160605003
+261160605004
+261160605005
+261160605006
+261160605007
+261160605008
+261160605009
+261160605010
+261160605011
+261160605012
+261160605013
+261160605014
+261160605015
+261160605016
+261160605017
+261160605018
+261160605019
+261160605020
+261160605021
+261160605022
+261160605023
+261160605024
+261160605025
+261160605026
+261160605027
+261160605028
+261160605029
+261160605030
+261160605031
+261160605032
+261160605033
+261160605034
+261160605035
+261160605036
+261160605037
+261160605038
+261160605039
+261160605040
+261160605041
+261160605042
+261160605043
+261160605044
+261160605045
+261160605046
+261160605047
+261160605048
+261160605049
+261160605050
+261160605051
+261160605052
+261160605053
+261160605054
+261160605055
+261160605056
+261160605057
+261160605058
+261160605059
+261160605060
+261160605061
+261160605062
+261160605063
+261160605064
+261160605065
+261160605066
+261160605067
+261160605068
+261160605069
+261160605070
+261160605071
+261160605072
+261160605073
+261160605074
+261160605075
+261160605076
+261160605077
+261160605078
+261160605079
+261160605080
+261160605081
+261160605082
+261160605083
+261160605084
+261160605085
+261160605086
+261160605087
+261160605088
+261160605089
+261160605090
+261160605091
+261160605092
+261160605093
+261160605094
diff --git a/examples/data/BairrosRecife.mif b/examples/data/BairrosRecife.mif
new file mode 100644
index 0000000..dd89723
--- /dev/null
+++ b/examples/data/BairrosRecife.mif
@@ -0,0 +1,13886 @@
+Version 300
+Charset "WindowsLatin1" 
+Delimiter ";"
+CoordSys Earth Projection 8, 92, Meters, -33.000000, 0.000000, 0.999600, 500000.000000, 10000000.000000 Bounds (277712.72411, 9098026.284832) (294927.38349, 9123062.304523)
+Columns 1
+  ID_ Char(16)
+Data
+Region 1
+143
+294927.383494  9110349.192930 
+294744.887076  9109866.859191 
+294715.645195  9109810.579317 
+294528.843923  9109416.636133 
+294423.835782  9109195.544709 
+294398.772343  9109166.390114 
+294368.560093  9109113.122393 
+294343.294756  9109056.845831 
+294314.726304  9108957.372220 
+294283.363436  9108883.008600 
+294275.150885  9108847.842938 
+294265.010476  9108820.711496 
+294259.921583  9108804.634483 
+294258.860435  9108795.592887 
+294252.822564  9108785.542016 
+294250.767570  9108776.499468 
+294246.739834  9108769.464047 
+294238.684365  9108755.393204 
+294231.600320  9108738.309762 
+294220.578272  9108726.245087 
+294213.539097  9108715.188737 
+294209.481470  9108704.135246 
+294205.364039  9108685.045622 
+294202.277838  9108670.979533 
+294196.195149  9108654.901549 
+294190.149841  9108643.846145 
+294185.105858  9108633.796210 
+294182.057045  9108624.752699 
+294175.966898  9108607.670192 
+294165.878952  9108587.570315 
+294160.834983  9108577.520374 
+294153.758483  9108561.441422 
+294146.674516  9108544.357951 
+294142.616929  9108533.304445 
+294137.595393  9108526.268049 
+294133.537811  9108515.214542 
+294130.421763  9108497.130371 
+294124.406392  9108490.093016 
+294120.341345  9108478.034989 
+294116.223993  9108458.945342 
+294110.178740  9108447.889916 
+294104.126019  9108435.829971 
+294100.008682  9108416.740320 
+294092.902354  9108396.643279 
+294087.836016  9108383.579769 
+294077.755650  9108364.484366 
+294069.692859  9108349.408944 
+294066.659041  9108342.374449 
+294068.519719  9108325.299573 
+294065.508316  9108321.278629 
+294056.548815  9108319.260968 
+294055.532564  9108316.246458 
+294048.471101  9108302.176504 
+294019.223996  9108244.891190 
+294014.202519  9108237.854768 
+294010.189821  9108232.828340 
+294007.156024  9108225.793837 
+294002.082272  9108211.725789 
+293996.926371  9108186.608045 
+293992.876339  9108176.559026 
+293985.837330  9108165.502605 
+293975.816814  9108154.443299 
+293973.791802  9108149.418787 
+293970.698279  9108134.348136 
+293965.639489  9108122.289114 
+293954.572885  9108104.197213 
+293945.501428  9108087.111749 
+293940.472518  9108079.070793 
+293930.392306  9108059.975325 
+293923.301074  9108041.887259 
+293920.207583  9108026.816598 
+293918.122860  9108013.755936 
+293911.054040  9107998.681420 
+293888.913499  9107961.493041 
+293881.889487  9107952.445626 
+293866.847639  9107934.349826 
+293862.827526  9107928.318856 
+293859.786317  9107920.279813 
+293852.627974  9107893.151057 
+293845.484569  9107868.031334 
+293837.407049  9107850.946792 
+293824.323070  9107828.834822 
+293814.280294  9107814.761895 
+293805.246278  9107802.698970 
+293798.155157  9107784.610861 
+293794.082837  9107771.548247 
+293788.934618  9107747.434956 
+293786.835042  9107732.365236 
+293776.687852  9107704.229026 
+293766.570520  9107680.110887 
+293751.424388  9107647.951746 
+293747.374482  9107637.902679 
+293745.289853  9107624.841990 
+293742.241238  9107615.798410 
+293729.164855  9107594.690903 
+293672.755437  9107626.780234 
+293521.281374  9107704.984071 
+293462.936145  9107744.102902 
+293364.208865  9107832.403195 
+293339.616406  9107866.532504 
+293327.869243  9107890.629294 
+293320.097410  9107914.729992 
+293300.255215  9108053.333432 
+293301.509882  9108088.492658 
+293298.637523  9108237.157915 
+293296.080829  9108294.412704 
+293293.382528  9108332.581588 
+293300.764305  9108389.846127 
+293317.493299  9108501.363570 
+293323.491394  9108639.992344 
+293320.972113  9108702.269727 
+293320.559857  9108780.621391 
+293314.169583  9108856.958177 
+293296.345196  9108999.581685 
+293290.687789  9109040.761214 
+293294.737803  9109050.810311 
+293306.858028  9109076.939513 
+293337.973511  9109118.154962 
+293383.234388  9109190.524081 
+293427.531411  9109266.910231 
+293430.557774  9109272.940255 
+293444.725586  9109307.107480 
+293454.850799  9109332.230150 
+293530.218275  9109577.404394 
+293552.419405  9109622.628964 
+293992.155865  9110483.917707 
+294014.373032  9110531.150854 
+294037.644004  9110586.421057 
+294048.853659  9110623.598579 
+294056.117705  9110664.790372 
+294060.340227  9110697.943191 
+294064.772311  9110759.222458 
+294065.213877  9110818.488906 
+294060.588682  9110864.691915 
+294057.666870  9110872.725207 
+294050.089921  9110922.943445 
+294042.505484  9110972.157169 
+294025.960977  9111019.353352 
+294001.555051  9111078.596165 
+293981.983873  9111119.762415 
+293955.530183  9111170.967203 
+294251.836018  9110921.125913 
+294927.383494  9110349.192930 
+Region 1
+84
+294065.213877  9110818.488906 
+294064.772311  9110759.222458 
+294060.340227  9110697.943191 
+294056.117705  9110664.790372 
+294048.853659  9110623.598579 
+294037.644004  9110586.421057 
+294014.373032  9110531.150854 
+293992.155865  9110483.917707 
+293552.419405  9109622.628964 
+293530.218275  9109577.404394 
+293454.850799  9109332.230150 
+293444.725586  9109307.107480 
+293430.557774  9109272.940255 
+293427.531411  9109266.910231 
+293383.234388  9109190.524081 
+293337.973511  9109118.154962 
+293306.858028  9109076.939513 
+293294.737803  9109050.810311 
+293290.687789  9109040.761214 
+293275.645665  9109022.665255 
+293270.631626  9109016.633266 
+293255.604431  9109000.546339 
+293235.630320  9108987.468101 
+293206.674215  9108969.358479 
+293161.756762  9108943.197059 
+293122.780144  9108914.027874 
+293103.755245  9108894.923404 
+293074.657661  9108857.727748 
+292854.985020  9108585.287285 
+292782.828319  9108638.455178 
+292651.255912  9108720.694981 
+292481.108432  9108828.009014 
+292466.230293  9108832.012252 
+292451.344711  9108835.010959 
+292313.160993  9108829.850311 
+292268.578511  9108848.891541 
+292219.086135  9108875.963968 
+292079.531088  9108954.176414 
+291989.371685  9108992.257477 
+291896.341889  9109045.403312 
+291823.100119  9109086.514742 
+291722.141186  9109142.665864 
+291698.741081  9109203.918009 
+291678.834731  9109334.485706 
+291675.127352  9109505.250677 
+291672.347160  9109666.975882 
+291672.451108  9109681.039292 
+291675.989645  9109756.382000 
+291686.448292  9109826.709078 
+291698.709107  9109871.924924 
+291701.350442  9109960.325484 
+291702.485447  9109979.412538 
+291686.125497  9110186.327479 
+291677.522141  9110232.526801 
+291688.521836  9110241.578574 
+291703.519400  9110253.647934 
+291721.483798  9110263.711229 
+291733.469974  9110271.759459 
+291772.380487  9110291.889008 
+291985.817523  9110392.555007 
+291996.794999  9110398.593100 
+292058.632262  9110427.785930 
+292257.109763  9110521.403789 
+292500.469791  9110636.159771 
+292594.231573  9110681.455477 
+292640.114895  9110703.600001 
+292687.993507  9110726.750944 
+292903.451486  9110831.431676 
+292913.427793  9110836.463999 
+293036.110408  9110894.845514 
+293154.810204  9110952.218239 
+293159.802112  9110955.236627 
+293355.301623  9111048.845678 
+293490.965711  9111115.274316 
+293789.205136  9111258.200908 
+293955.530183  9111170.967203 
+293981.983873  9111119.762415 
+294001.555051  9111078.596165 
+294025.960977  9111019.353352 
+294042.505484  9110972.157169 
+294050.089921  9110922.943445 
+294057.666870  9110872.725207 
+294060.588682  9110864.691915 
+294065.213877  9110818.488906 
+Region 1
+101
+292651.255912  9108720.694981 
+292782.828319  9108638.455178 
+292571.701510  9108311.777175 
+292507.344261  9108210.256601 
+292503.324267  9108204.225474 
+292495.306588  9108195.176795 
+292482.126387  9108160.005475 
+292463.087224  9108138.891540 
+292225.928155  9108054.273903 
+291735.740107  9107889.036183 
+291728.620015  9108001.535428 
+291597.432424  9108001.401703 
+291590.556709  9108147.050510 
+291625.623208  9108185.258134 
+291663.671317  9108223.468753 
+291666.689952  9108228.494439 
+291592.573826  9108285.676724 
+291532.208732  9108186.167351 
+291390.265958  9108210.130737 
+291304.913254  9108226.115618 
+291290.049921  9108232.127510 
+291275.134726  9108231.107674 
+291091.494049  9108261.054508 
+291123.747563  9108456.970162 
+291144.113558  9108523.289769 
+291168.284704  9108566.509186 
+291224.548416  9108648.937974 
+291099.545392  9108544.338955 
+290942.458182  9108401.534320 
+290838.475408  9108317.046513 
+290820.738943  9108472.729789 
+290803.172679  9108651.517370 
+290796.630020  9108707.764099 
+290795.249106  9108790.133866 
+290798.132341  9108911.684582 
+290799.400059  9108948.853380 
+290800.889839  9109016.158205 
+290802.996015  9109032.232807 
+290806.066457  9109044.290299 
+290809.181316  9109062.374994 
+290812.251764  9109074.432484 
+290815.322214  9109086.489973 
+290818.370459  9109095.533859 
+290828.472063  9109117.643869 
+290838.544065  9109135.735738 
+290849.617356  9109154.833162 
+290966.069682  9109312.663653 
+290968.072252  9109314.674763 
+290990.159800  9109344.833227 
+291077.627587  9109480.533876 
+291109.750468  9109523.761346 
+291199.073350  9109641.382044 
+291238.205580  9109691.648189 
+291349.572732  9109833.399452 
+291403.762044  9109903.771137 
+291481.997875  9110000.284674 
+291627.448641  9110181.245714 
+291639.479342  9110195.321154 
+291652.518800  9110211.406649 
+291666.522451  9110223.475023 
+291677.522141  9110232.526801 
+291686.125497  9110186.327479 
+291702.485447  9109979.412538 
+291701.350442  9109960.325484 
+291698.709107  9109871.924924 
+291686.448292  9109826.709078 
+291675.989645  9109756.382000 
+291672.451108  9109681.039292 
+291672.347160  9109666.975882 
+291675.127352  9109505.250677 
+291678.834731  9109334.485706 
+291419.856052  9109391.480679 
+291488.351725  9109245.894501 
+291520.786026  9109196.705850 
+291386.888018  9108964.524630 
+291379.812311  9108948.445030 
+291358.251622  9108855.002306 
+291347.801473  9108785.679481 
+291346.763133  9108779.651276 
+291339.168630  9108693.254451 
+291530.709568  9108656.282630 
+291513.858636  9108527.686499 
+291658.056978  9108539.887609 
+291661.402054  9108589.112605 
+291663.590076  9108616.236931 
+291668.700331  9108635.328047 
+291687.124011  9108707.672357 
+291689.378852  9108743.837443 
+291683.208365  9108850.310526 
+291782.179076  9108794.157613 
+292067.222661  9108633.722115 
+292093.367519  9108674.933761 
+292003.187745  9108844.606885 
+292079.531088  9108954.176414 
+292219.086135  9108875.963968 
+292268.578511  9108848.891541 
+292313.160993  9108829.850311 
+292451.344711  9108835.010959 
+292466.230293  9108832.012252 
+292481.108432  9108828.009014 
+292651.255912  9108720.694981 
+Region 1
+30
+291782.179076  9108794.157613 
+291683.208365  9108850.310526 
+291689.378852  9108743.837443 
+291687.124011  9108707.672357 
+291668.700331  9108635.328047 
+291663.590076  9108616.236931 
+291661.402054  9108589.112605 
+291658.056978  9108539.887609 
+291513.858636  9108527.686499 
+291530.709568  9108656.282630 
+291339.168630  9108693.254451 
+291346.763133  9108779.651276 
+291347.801473  9108785.679481 
+291358.251622  9108855.002306 
+291379.812311  9108948.445030 
+291386.888018  9108964.524630 
+291520.786026  9109196.705850 
+291488.351725  9109245.894501 
+291419.856052  9109391.480679 
+291678.834731  9109334.485706 
+291698.741081  9109203.918009 
+291722.141186  9109142.665864 
+291823.100119  9109086.514742 
+291896.341889  9109045.403312 
+291989.371685  9108992.257477 
+292079.531088  9108954.176414 
+292003.187745  9108844.606885 
+292093.367519  9108674.933761 
+292067.222661  9108633.722115 
+291782.179076  9108794.157613 
+Region 1
+59
+293212.241769  9107844.307819 
+293215.178576  9107838.283626 
+293222.008777  9107821.213610 
+293223.921952  9107811.170350 
+293224.781702  9107793.089934 
+293220.687189  9107777.013664 
+293180.758464  9107619.265447 
+293084.595260  9107651.314867 
+293033.087291  9107674.367727 
+292978.649863  9107704.449246 
+292958.907190  9107722.510952 
+292934.165566  9107736.549628 
+292904.015711  9107691.316462 
+292848.100707  9107656.102802 
+292799.737703  9107701.257923 
+292769.077650  9107721.317726 
+292748.288964  9107732.346699 
+292683.015701  9107775.475848 
+292475.735130  9107833.530608 
+292455.367874  9107767.211966 
+292420.020774  9107825.438589 
+292355.770529  9107872.586469 
+292332.096704  9107896.671139 
+292267.253560  9107998.062392 
+292225.928155  9108054.273903 
+292463.087224  9108138.891540 
+292482.126387  9108160.005475 
+292495.306588  9108195.176795 
+292503.324267  9108204.225474 
+292507.344261  9108210.256601 
+292571.701510  9108311.777175 
+292782.828319  9108638.455178 
+292854.985020  9108585.287285 
+293074.657661  9108857.727748 
+293103.755245  9108894.923404 
+293122.780144  9108914.027874 
+293161.756762  9108943.197059 
+293206.674215  9108969.358479 
+293235.630320  9108987.468101 
+293255.604431  9109000.546339 
+293270.631626  9109016.633266 
+293275.645665  9109022.665255 
+293290.687789  9109040.761214 
+293296.345196  9108999.581685 
+293314.169583  9108856.958177 
+293320.559857  9108780.621391 
+293320.972113  9108702.269727 
+293323.491394  9108639.992344 
+293317.493299  9108501.363570 
+293300.764305  9108389.846127 
+293293.382528  9108332.581588 
+293296.080829  9108294.412704 
+293298.637523  9108237.157915 
+293301.509882  9108088.492658 
+293300.255215  9108053.333432 
+293320.097410  9107914.729992 
+293327.869243  9107890.629294 
+293339.616406  9107866.532504 
+293212.241769  9107844.307819 
+Region 1
+29
+291144.113558  9108523.289769 
+291123.747563  9108456.970162 
+291091.494049  9108261.054508 
+291133.659600  9108183.749503 
+291026.234709  9108171.584401 
+290857.190936  9108159.355208 
+290867.390892  9108059.917635 
+290896.673727  9107987.622070 
+290907.978463  9107903.253554 
+290921.159918  9107803.819090 
+290929.594077  9107734.515504 
+290659.512428  9107767.384036 
+290546.465248  9107801.419973 
+290501.753161  9107937.989123 
+290474.372376  9108133.843602 
+290485.604233  9108309.647850 
+290496.972760  9108368.926899 
+290569.443173  9108357.952642 
+290582.769978  9108413.215566 
+290610.842072  9108446.394207 
+290748.236394  9108614.292972 
+290803.172679  9108651.517370 
+290820.738943  9108472.729789 
+290838.475408  9108317.046513 
+290942.458182  9108401.534320 
+291099.545392  9108544.338955 
+291224.548416  9108648.937974 
+291168.284704  9108566.509186 
+291144.113558  9108523.289769 
+Region 1
+28
+291666.689952  9108228.494439 
+291663.671317  9108223.468753 
+291625.623208  9108185.258134 
+291590.556709  9108147.050510 
+291500.406112  9108051.528726 
+291454.348229  9108005.273510 
+291429.390911  9107990.180091 
+291338.454543  9107922.783698 
+291307.126858  9107852.434800 
+291258.644791  9107746.909831 
+291205.193800  9107641.379626 
+291050.620919  9107704.505071 
+290929.594077  9107734.515504 
+290921.159918  9107803.819090 
+290907.978463  9107903.253554 
+290896.673727  9107987.622070 
+290867.390892  9108059.917635 
+290857.190936  9108159.355208 
+291026.234709  9108171.584401 
+291133.659600  9108183.749503 
+291091.494049  9108261.054508 
+291275.134726  9108231.107674 
+291290.049921  9108232.127510 
+291304.913254  9108226.115618 
+291390.265958  9108210.130737 
+291532.208732  9108186.167351 
+291592.573826  9108285.676724 
+291666.689952  9108228.494439 
+Region 1
+28
+292225.928155  9108054.273903 
+292267.253560  9107998.062392 
+292224.198949  9107954.824714 
+292139.054116  9107864.332068 
+292094.746083  9107785.934725 
+292092.728711  9107781.914604 
+292034.966615  9107631.178054 
+292029.886117  9107616.105094 
+291991.393197  9107517.623011 
+291906.234932  9107425.120549 
+291810.397007  9107366.760706 
+291723.933725  9107366.672486 
+291623.860617  9107407.755619 
+291470.431386  9107490.973835 
+291462.510337  9107494.983801 
+291223.031091  9107634.366344 
+291205.193800  9107641.379626 
+291258.644791  9107746.909831 
+291307.126858  9107852.434800 
+291338.454543  9107922.783698 
+291429.390911  9107990.180091 
+291454.348229  9108005.273510 
+291500.406112  9108051.528726 
+291590.556709  9108147.050510 
+291597.432424  9108001.401703 
+291728.620015  9108001.535428 
+291735.740107  9107889.036183 
+292225.928155  9108054.273903 
+Region 1
+58
+291881.700695  9107198.073673 
+291840.783263  9107174.927968 
+291805.895548  9107160.829069 
+291778.016523  9107153.768953 
+291754.135046  9107149.726470 
+291729.267155  9107146.687487 
+291705.415326  9107146.663097 
+291676.594362  9107146.633609 
+291622.942546  9107148.587713 
+291580.222809  9107150.552967 
+291539.490712  9107152.520221 
+291510.684534  9107154.499690 
+291474.921554  9107156.471991 
+291410.359768  9107161.428204 
+291340.813996  9107164.370140 
+291279.196614  9107164.306580 
+291218.536038  9107159.221299 
+291179.710101  9107150.140423 
+291124.931115  9107134.011308 
+291064.181783  9107116.871399 
+290748.450488  9107023.121720 
+290623.948574  9106985.823922 
+290529.335477  9106958.602413 
+290423.760814  9106927.351026 
+290355.039058  9106907.188048 
+290336.112046  9106901.140913 
+290298.265411  9106890.051154 
+290264.379344  9106876.956481 
+290226.495850  9106860.843960 
+290185.586638  9106838.701014 
+290138.692372  9106813.538088 
+290114.421900  9106891.865803 
+290104.205128  9106989.294504 
+290117.552708  9107047.571445 
+290128.809407  9107091.782725 
+290181.115820  9107177.223155 
+290232.568829  9107281.748650 
+290261.788634  9107336.024096 
+290288.976555  9107384.270184 
+290310.186739  9107430.500892 
+290341.497811  9107498.841853 
+290385.773258  9107573.223560 
+290390.794163  9107580.260537 
+290431.013170  9107643.588080 
+290469.525328  9107745.085871 
+290503.456463  9107764.207437 
+290546.465248  9107801.419973 
+290659.512428  9107767.384036 
+290929.594077  9107734.515504 
+291050.620919  9107704.505071 
+291205.193800  9107641.379626 
+291223.031091  9107634.366344 
+291462.510337  9107494.983801 
+291470.431386  9107490.973835 
+291623.860617  9107407.755619 
+291723.933725  9107366.672486 
+291810.397007  9107366.760706 
+291881.700695  9107198.073673 
+Region 1
+27
+291814.312431  9106011.663983 
+291857.706269  9105966.504984 
+291809.165648  9105987.550155 
+291472.385515  9106003.275575 
+291295.079142  9106082.449408 
+291256.365121  9106088.436380 
+291108.458112  9106111.386671 
+290970.215508  9106097.179104 
+290627.651772  9106002.394234 
+290473.301828  9105960.041231 
+290466.514862  9105983.138244 
+290469.533171  9105988.164082 
+290471.660961  9106007.252394 
+290446.692504  9106125.760533 
+290415.893910  9106262.344063 
+290361.942347  9106358.721946 
+290328.639464  9106424.985737 
+290434.212849  9106456.237646 
+290679.312180  9106540.875865 
+290899.500167  9106616.445797 
+291126.674989  9106696.039832 
+291355.845419  9106776.639115 
+291458.467987  9106811.903304 
+291512.032150  9106663.288902 
+291591.752248  9106692.502096 
+291787.178349  9106644.485429 
+291814.312431  9106011.663983 
+Region 1
+255
+293729.164855  9107594.690903 
+293727.147367  9107590.670886 
+293719.084879  9107575.595338 
+293715.020073  9107563.537225 
+293710.925436  9107547.461033 
+293707.876836  9107538.417447 
+293703.841872  9107530.377410 
+293698.813085  9107522.336401 
+293686.849904  9107517.302155 
+293683.801313  9107508.258565 
+293680.678147  9107489.169779 
+293679.632121  9107482.137170 
+293674.603346  9107474.096156 
+293666.540903  9107459.020588 
+293662.498499  9107449.976024 
+293662.468671  9107445.957945 
+293661.377910  9107432.898216 
+293659.323155  9107423.855594 
+293648.241983  9107403.754504 
+293640.194478  9107390.687966 
+293637.168278  9107384.657928 
+293631.078600  9107367.575253 
+293620.961458  9107343.457042 
+293612.899065  9107328.381454 
+293605.845408  9107315.315878 
+293600.786851  9107303.256767 
+293588.615018  9107270.095911 
+293581.539019  9107254.016766 
+293572.400852  9107227.890465 
+293544.156574  9107171.610012 
+293540.084422  9107158.547341 
+293527.972312  9107133.422613 
+293524.879082  9107118.351874 
+293521.852922  9107112.321820 
+293517.825495  9107105.286269 
+293505.795383  9107091.211256 
+293499.772878  9107083.169227 
+293497.740540  9107077.140148 
+293492.622443  9107057.044844 
+293485.472020  9107030.920457 
+293479.375025  9107012.833213 
+293476.311629  9107001.780548 
+293475.302915  9106999.770528 
+293469.258081  9106988.714928 
+293464.214514  9106978.664825 
+293460.202011  9106973.638306 
+293447.185595  9106960.566807 
+293442.179283  9106955.539306 
+293436.186608  9106951.515346 
+293432.151764  9106943.475259 
+293427.108212  9106933.425149 
+293425.023753  9106920.364413 
+293423.955455  9106910.318220 
+293422.916952  9106904.290113 
+293416.909389  9106898.257106 
+293410.901828  9106892.224097 
+293407.868256  9106885.189507 
+293401.823459  9106874.133890 
+293394.762511  9106860.063725 
+293392.730203  9106854.034635 
+293390.615973  9106836.955808 
+293386.596047  9106830.924755 
+293381.597205  9106826.901764 
+293364.337539  9106777.663520 
+293353.159910  9106744.503502 
+293338.904086  9106698.281745 
+293326.881603  9106685.211166 
+293314.881461  9106675.154148 
+293300.856488  9106660.072548 
+293284.762027  9106633.939230 
+293263.750658  9106614.832633 
+293219.814785  9106586.662650 
+293193.700488  9106549.469670 
+293150.728760  9106517.282490 
+293138.877502  9106527.315865 
+293124.897271  9106518.261324 
+293089.928119  9106493.113637 
+293076.956589  9106486.069112 
+293067.915650  9106473.001400 
+293060.892077  9106463.953760 
+293043.975093  9106460.923356 
+293036.017222  9106459.910908 
+293028.956471  9106445.840643 
+292991.791602  9106392.564208 
+292922.840032  9106341.264974 
+292885.846348  9106311.092459 
+292820.989118  9106275.869390 
+292762.094778  9106240.652191 
+292759.083656  9106236.631097 
+292752.097331  9106232.606011 
+292750.102300  9106231.599490 
+292747.113469  9106230.591970 
+292744.117207  9106228.579925 
+292740.127146  9106226.566882 
+292735.135855  9106223.548314 
+292733.133395  9106221.537266 
+292731.138365  9106220.530744 
+292728.142105  9106218.518697 
+292725.145845  9106216.506651 
+292723.143386  9106214.495602 
+292718.152097  9106211.477032 
+292713.145951  9106206.449410 
+292710.157121  9106205.441888 
+292708.154663  9106203.430839 
+292705.158405  9106201.418790 
+292702.169576  9106200.411267 
+292700.174547  9106199.404743 
+292696.184490  9106197.391694 
+292694.189461  9106196.385170 
+292691.208061  9106196.382171 
+292689.213032  9106195.375646 
+292683.227947  9106192.356071 
+292680.246546  9106192.353072 
+292677.257718  9106191.345547 
+292674.276318  9106191.342547 
+292671.287490  9106190.335021 
+292666.311061  9106189.325495 
+292663.322233  9106188.317969 
+292661.334633  9106188.315969 
+292659.347033  9106188.313968 
+292619.491051  9106174.210575 
+292573.664861  9106159.096601 
+292522.765754  9106129.914185 
+292499.871245  9106124.868462 
+292480.877705  9106109.781479 
+292458.005474  9106107.749312 
+292454.045122  9106109.754345 
+292450.069924  9106109.750324 
+292444.107127  9106109.744291 
+292431.002184  9106084.618044 
+292411.007460  9106068.525488 
+292394.023830  9106056.454050 
+292373.176319  9106059.446483 
+292366.204887  9106057.430377 
+292344.200338  9106038.322185 
+292332.200563  9106028.264812 
+292309.365457  9106031.255197 
+292290.498122  9106033.245080 
+292271.519514  9106020.167038 
+292251.613874  9106016.128727 
+292246.630047  9106014.114619 
+292244.612781  9106010.094487 
+292239.614120  9106006.071322 
+292230.669936  9106006.062226 
+292223.720764  9106007.059679 
+292213.827280  9106013.076738 
+292204.935007  9106020.099335 
+292195.011852  9106022.098278 
+292185.029367  9106016.060993 
+292179.022079  9106010.027752 
+292175.009806  9106005.001063 
+292170.982702  9105997.965316 
+292165.969217  9105991.933085 
+292161.956947  9105986.906393 
+292161.934701  9105983.892808 
+292155.971912  9105983.886733 
+292151.025166  9105986.895256 
+292148.058601  9105988.901275 
+292142.140300  9105994.922371 
+292130.214717  9105994.910216 
+292123.191396  9105985.862366 
+292110.309087  9105990.871837 
+292067.627634  9105997.859940 
+291992.855527  9105965.638860 
+291977.955957  9105966.628144 
+291905.527186  9105982.626357 
+291879.636535  9105975.568171 
+291877.648936  9105975.566133 
+291857.706269  9105966.504984 
+291814.312431  9106011.663983 
+291787.178349  9106644.485429 
+291591.752248  9106692.502096 
+291512.032150  9106663.288902 
+291458.467987  9106811.903304 
+291355.845419  9106776.639115 
+291126.674989  9106696.039832 
+290899.500167  9106616.445797 
+290679.312180  9106540.875865 
+290434.212849  9106456.237646 
+290328.639464  9106424.985737 
+290307.100042  9106469.162297 
+290265.199323  9106582.629922 
+290252.508304  9106613.756944 
+290198.467600  9106698.080332 
+290145.501665  9106793.454681 
+290138.692372  9106813.538088 
+290185.586638  9106838.701014 
+290226.495850  9106860.843960 
+290264.379344  9106876.956481 
+290298.265411  9106890.051154 
+290336.112046  9106901.140913 
+290355.039058  9106907.188048 
+290423.760814  9106927.351026 
+290529.335477  9106958.602413 
+290623.948574  9106985.823922 
+290748.450488  9107023.121720 
+291064.181783  9107116.871399 
+291124.931115  9107134.011308 
+291179.710101  9107150.140423 
+291218.536038  9107159.221299 
+291279.196614  9107164.306580 
+291340.813996  9107164.370140 
+291410.359768  9107161.428204 
+291474.921554  9107156.471991 
+291510.684534  9107154.499690 
+291539.490712  9107152.520221 
+291580.222809  9107150.552967 
+291622.942546  9107148.587713 
+291676.594362  9107146.633609 
+291705.415326  9107146.663097 
+291729.267155  9107146.687487 
+291754.135046  9107149.726470 
+291778.016523  9107153.768953 
+291805.895548  9107160.829069 
+291840.783263  9107174.927968 
+291881.700695  9107198.073673 
+291810.397007  9107366.760706 
+291906.234932  9107425.120549 
+291991.393197  9107517.623011 
+292029.886117  9107616.105094 
+292034.966615  9107631.178054 
+292092.728711  9107781.914604 
+292094.746083  9107785.934725 
+292139.054116  9107864.332068 
+292224.198949  9107954.824714 
+292267.253560  9107998.062392 
+292332.096704  9107896.671139 
+292355.770529  9107872.586469 
+292420.020774  9107825.438589 
+292455.367874  9107767.211966 
+292475.735130  9107833.530608 
+292683.015701  9107775.475848 
+292748.288964  9107732.346699 
+292769.077650  9107721.317726 
+292799.737703  9107701.257923 
+292848.100707  9107656.102802 
+292904.015711  9107691.316462 
+292934.165566  9107736.549628 
+292958.907190  9107722.510952 
+292978.649863  9107704.449246 
+293033.087291  9107674.367727 
+293084.595260  9107651.314867 
+293180.758464  9107619.265447 
+293220.687189  9107777.013664 
+293224.781702  9107793.089934 
+293223.921952  9107811.170350 
+293222.008777  9107821.213610 
+293215.178576  9107838.283626 
+293212.241769  9107844.307819 
+293339.616406  9107866.532504 
+293364.208865  9107832.403195 
+293462.936145  9107744.102902 
+293521.281374  9107704.984071 
+293672.755437  9107626.780234 
+293729.164855  9107594.690903 
+Region 1
+60
+290849.617356  9109154.833162 
+290838.544065  9109135.735738 
+290828.472063  9109117.643869 
+290818.370459  9109095.533859 
+290815.322214  9109086.489973 
+290812.251764  9109074.432484 
+290809.181316  9109062.374994 
+290806.066457  9109044.290299 
+290802.996015  9109032.232807 
+290800.889839  9109016.158205 
+290799.400059  9108948.853380 
+290798.132341  9108911.684582 
+290795.249106  9108790.133866 
+290796.630020  9108707.764099 
+290803.172679  9108651.517370 
+290748.236394  9108614.292972 
+290610.842072  9108446.394207 
+290582.769978  9108413.215566 
+290569.443173  9108357.952642 
+290496.972760  9108368.926899 
+290508.348727  9108429.210473 
+290525.255919  9108565.843950 
+290517.689452  9108618.071540 
+290469.958492  9108749.615035 
+290404.976700  9108832.923171 
+290316.030885  9108901.138305 
+290290.345391  9108922.206584 
+290242.942436  9108963.342735 
+290215.387340  9109000.481507 
+290200.634371  9109021.561194 
+290195.783209  9109037.628594 
+290179.315837  9109095.874089 
+290155.979949  9109166.166757 
+290144.637075  9109245.512751 
+290140.809321  9109265.599345 
+290132.196870  9109310.794181 
+290125.527848  9109349.963873 
+290218.040259  9109361.110413 
+290298.648256  9109375.257931 
+290376.222861  9109382.370435 
+290462.779382  9109394.514773 
+290523.435789  9109398.595850 
+290582.141420  9109407.697461 
+290613.982642  9109412.753075 
+290632.866399  9109412.772621 
+290660.732095  9109417.824086 
+290682.604896  9109418.851230 
+290699.493484  9109417.864158 
+290710.389171  9109412.852781 
+290735.191792  9109406.851239 
+290776.853361  9109395.844448 
+290807.611834  9109388.844489 
+290841.329719  9109378.833981 
+290865.116192  9109369.817749 
+290900.806987  9109357.800184 
+290928.546727  9109345.774416 
+290944.367313  9109334.740904 
+290968.072252  9109314.674763 
+290966.069682  9109312.663653 
+290849.617356  9109154.833162 
+Region 1
+158
+291199.073350  9109641.382044 
+291109.750468  9109523.761346 
+291077.627587  9109480.533876 
+290990.159800  9109344.833227 
+290968.072252  9109314.674763 
+290944.367313  9109334.740904 
+290928.546727  9109345.774416 
+290900.806987  9109357.800184 
+290865.116192  9109369.817749 
+290841.329719  9109378.833981 
+290807.611834  9109388.844489 
+290776.853361  9109395.844448 
+290735.191792  9109406.851239 
+290710.389171  9109412.852781 
+290699.493484  9109417.864158 
+290682.604896  9109418.851230 
+290660.732095  9109417.824086 
+290632.866399  9109412.772621 
+290613.982642  9109412.753075 
+290582.141420  9109407.697461 
+290523.435789  9109398.595850 
+290462.779382  9109394.514773 
+290376.222861  9109382.370435 
+290298.648256  9109375.257931 
+290218.040259  9109361.110413 
+290125.527848  9109349.963873 
+290122.634862  9109362.015206 
+290112.086350  9109414.239730 
+290101.656048  9109482.536861 
+290097.916947  9109514.677912 
+290101.327182  9109572.944223 
+290101.681879  9109621.162035 
+290101.792724  9109636.230102 
+290118.130983  9109695.514445 
+290126.392520  9109737.713330 
+290137.606194  9109775.897172 
+290152.751117  9109808.057930 
+290164.951345  9109845.238254 
+290178.101139  9109876.392382 
+290193.320071  9109918.598482 
+290199.534825  9109952.758956 
+290201.833159  9109994.951582 
+290201.149812  9110037.141102 
+290200.569997  9110093.394140 
+290199.871881  9110133.574585 
+290190.302611  9110183.791091 
+290183.485801  9110202.870054 
+290177.655495  9110220.945514 
+290163.101899  9110269.147777 
+290141.576164  9110315.333725 
+290126.867240  9110342.440709 
+290113.144813  9110368.544189 
+290098.398891  9110390.628483 
+290084.646863  9110412.713811 
+290079.736478  9110420.744934 
+290057.105805  9110451.861776 
+290040.408983  9110478.966680 
+290032.783009  9110523.158050 
+290023.021346  9110547.256594 
+290031.157460  9110572.378324 
+290079.910834  9110579.460815 
+290099.840808  9110586.513266 
+290117.768174  9110591.554565 
+290151.716452  9110612.684979 
+290171.602065  9110613.710171 
+290179.656908  9110627.781946 
+290181.844453  9110654.906505 
+290183.023297  9110680.020958 
+290179.180801  9110698.098493 
+290171.510598  9110736.262637 
+290161.756395  9110761.365739 
+290139.118278  9110791.478108 
+290109.604086  9110832.633151 
+290080.045468  9110867.760964 
+290046.592486  9110913.934544 
+290020.022923  9110950.069978 
+290042.979204  9110963.152743 
+290101.834944  9110992.345260 
+290173.663497  9111028.582836 
+290238.512500  9111061.799460 
+290258.472318  9111072.869929 
+290294.401492  9111092.997652 
+290369.234282  9111132.251529 
+290389.186749  9111142.317389 
+290392.183322  9111144.329535 
+290412.128393  9111153.390848 
+290475.998583  9111188.615092 
+290525.879865  9111213.779575 
+290552.804664  9111225.861566 
+290566.756620  9111230.898530 
+290603.516921  9111228.927210 
+290634.261809  9111219.918007 
+290686.709895  9111188.831445 
+290735.211870  9111161.758904 
+290794.594993  9111127.665770 
+290786.517617  9111110.580573 
+290772.424851  9111086.457539 
+290752.294474  9111052.283056 
+290749.283074  9111048.261869 
+290732.171544  9111019.113091 
+290707.012370  9110976.897210 
+290685.880780  9110941.717120 
+290663.747903  9110905.531458 
+290639.590196  9110864.321063 
+290633.530404  9110851.255991 
+290644.381959  9110840.217346 
+290660.128986  9110819.138460 
+290681.795018  9110792.038491 
+290699.470561  9110762.925368 
+290718.169633  9110737.831399 
+290721.114317  9110732.811789 
+290744.619897  9110685.623171 
+290766.182082  9110644.459714 
+290790.622210  9110589.235843 
+290801.362513  9110563.129179 
+290802.326777  9110559.112064 
+290816.983407  9110524.973207 
+290826.663086  9110489.824723 
+290837.351482  9110456.686326 
+290849.011538  9110420.535348 
+290857.808447  9110400.453849 
+290870.751412  9110403.480687 
+290902.600760  9110409.540457 
+290947.444972  9110425.658746 
+291004.312424  9110454.848089 
+291022.247164  9110460.893550 
+291201.104941  9110320.442422 
+291195.082205  9110312.400101 
+291171.013534  9110283.244399 
+291143.963202  9110254.085638 
+291112.863162  9110214.877477 
+291088.757528  9110180.699044 
+291077.683793  9110161.601770 
+291075.673758  9110158.586144 
+291066.602655  9110141.499959 
+291055.514114  9110120.393610 
+291039.426458  9110095.264045 
+291023.331410  9110069.129938 
+291006.272138  9110047.012934 
+290980.245607  9110021.873163 
+290956.251355  9110002.762604 
+290905.333098  9109971.570107 
+290905.296051  9109966.547440 
+290908.114721  9109944.450768 
+290914.894139  9109920.349108 
+290917.786901  9109908.297768 
+290928.490009  9109877.168455 
+290942.130319  9109840.015002 
+290951.891383  9109815.916402 
+290960.880844  9109821.952775 
+290990.875373  9109846.092130 
+290996.816478  9109843.084642 
+291039.353606  9109816.006028 
+291127.416766  9109762.856296 
+291184.773043  9109723.738435 
+291200.586241  9109711.700287 
+291238.205580  9109691.648189 
+291199.073350  9109641.382044 
+Region 1
+108
+290392.183322  9111144.329535 
+290389.186749  9111142.317389 
+290369.234282  9111132.251529 
+290294.401492  9111092.997652 
+290258.472318  9111072.869929 
+290238.512500  9111061.799460 
+290173.663497  9111028.582836 
+290101.834944  9110992.345260 
+290042.979204  9110963.152743 
+290020.022923  9110950.069978 
+290046.592486  9110913.934544 
+290080.045468  9110867.760964 
+290109.604086  9110832.633151 
+290139.118278  9110791.478108 
+290161.756395  9110761.365739 
+290171.510598  9110736.262637 
+290179.180801  9110698.098493 
+290183.023297  9110680.020958 
+290181.844453  9110654.906505 
+290179.656908  9110627.781946 
+290171.602065  9110613.710171 
+290151.716452  9110612.684979 
+290117.768174  9110591.554565 
+290099.840808  9110586.513266 
+290079.910834  9110579.460815 
+290031.157460  9110572.378324 
+290032.188337  9110577.402048 
+290030.422321  9110607.536107 
+290034.664142  9110643.703604 
+290035.887268  9110674.845305 
+290040.047775  9110699.962885 
+290042.213068  9110724.073856 
+290041.492754  9110761.240710 
+290038.621930  9110776.305669 
+290036.752415  9110792.376201 
+290024.112509  9110830.535178 
+290006.436451  9110859.648144 
+290003.499066  9110865.672265 
+289992.743439  9110889.769786 
+289983.018692  9110918.891030 
+289967.278664  9110940.974298 
+289950.566883  9110966.070142 
+289926.934610  9110996.181424 
+289909.214082  9111019.267150 
+289885.530008  9111042.346655 
+289853.887138  9111064.413317 
+289835.106098  9111078.457146 
+289808.395834  9111095.506281 
+289774.654174  9111102.502747 
+289738.917260  9111108.492573 
+289690.214981  9111108.441612 
+289645.451448  9111103.372067 
+289611.576761  9111092.286704 
+289585.660865  9111082.214197 
+289565.671593  9111067.125234 
+289560.672430  9111063.101856 
+289526.738702  9111043.980096 
+289491.781540  9111020.839097 
+289469.774941  9111001.729824 
+289462.773181  9110995.695259 
+289416.642004  9111075.004786 
+289431.720685  9111098.124920 
+289450.686484  9111109.194742 
+289501.590833  9111138.379719 
+289522.551898  9111150.456131 
+289544.477356  9111158.515415 
+289569.443689  9111174.614133 
+289593.349628  9111181.670934 
+289610.275925  9111185.706809 
+289628.203537  9111190.748258 
+289647.132466  9111196.795279 
+289661.106544  9111204.846166 
+289687.096418  9111224.964002 
+289707.078411  9111239.048345 
+289733.068322  9111259.166144 
+289754.059052  9111275.260576 
+289764.064850  9111284.311807 
+289784.069065  9111301.409721 
+289822.119255  9111339.621590 
+289836.152549  9111355.708712 
+289849.191925  9111371.794792 
+289860.236057  9111386.874256 
+289871.258014  9111398.940102 
+289878.326441  9111414.015418 
+289886.507125  9111445.164376 
+289884.696746  9111469.271220 
+289947.410551  9111482.395334 
+289961.103680  9111452.273665 
+289972.882904  9111432.195306 
+289997.435254  9111392.039618 
+290022.068939  9111362.933836 
+290041.740355  9111334.827428 
+290067.375309  9111306.727204 
+290095.940217  9111271.598306 
+290105.931267  9111278.640372 
+290125.898575  9111290.715420 
+290151.859049  9111306.814780 
+290190.799791  9111330.963784 
+290231.721021  9111354.110263 
+290273.643617  9111378.262258 
+290286.646108  9111389.325493 
+290296.407689  9111365.226891 
+290313.052706  9111331.090111 
+290325.707194  9111294.940157 
+290341.373057  9111262.811423 
+290358.982323  9111224.657525 
+290376.524924  9111177.462806 
+290392.183322  9111144.329535 
+Region 1
+58
+291374.594993  9110798.771553 
+291342.552358  9110766.594402 
+291298.471542  9110719.337172 
+291254.390821  9110672.079876 
+291241.336463  9110653.985205 
+291227.273370  9110633.880456 
+291200.163389  9110596.685539 
+291175.019009  9110556.479022 
+291153.961564  9110531.344501 
+291136.998438  9110522.286519 
+291080.160510  9110497.115513 
+291018.293797  9110463.903088 
+291022.247164  9110460.893550 
+291004.312424  9110454.848089 
+290947.444972  9110425.658746 
+290902.600760  9110409.540457 
+290870.751412  9110403.480687 
+290857.808447  9110400.453849 
+290849.011538  9110420.535348 
+290837.351482  9110456.686326 
+290826.663086  9110489.824723 
+290816.983407  9110524.973207 
+290802.326777  9110559.112064 
+290801.362513  9110563.129179 
+290790.622210  9110589.235843 
+290766.182082  9110644.459714 
+290744.619897  9110685.623171 
+290721.114317  9110732.811789 
+290718.169633  9110737.831399 
+290699.470561  9110762.925368 
+290681.795018  9110792.038491 
+290660.128986  9110819.138460 
+290644.381959  9110840.217346 
+290633.530404  9110851.255991 
+290639.590196  9110864.321063 
+290663.747903  9110905.531458 
+290685.880780  9110941.717120 
+290707.012370  9110976.897210 
+290732.171544  9111019.113091 
+290749.283074  9111048.261869 
+290752.294474  9111052.283056 
+290772.424851  9111086.457539 
+290786.517617  9111110.580573 
+290794.594993  9111127.665770 
+290833.261438  9111114.646453 
+290899.646317  9111086.587517 
+290948.199930  9111066.546530 
+291008.650811  9111042.499515 
+291038.401518  9111033.489073 
+291086.005584  9111019.474144 
+291206.966290  9110979.415992 
+291172.364373  9110869.887792 
+291223.921582  9110852.863210 
+291274.469985  9110833.828509 
+291326.093901  9110825.844604 
+291383.658965  9110814.853083 
+291389.637268  9110816.868172 
+291374.594993  9110798.771553 
+Region 1
+85
+292137.748352  9110642.831886 
+292257.109763  9110521.403789 
+292058.632262  9110427.785930 
+291996.794999  9110398.593100 
+291985.817523  9110392.555007 
+291772.380487  9110291.889008 
+291733.469974  9110271.759459 
+291721.483798  9110263.711229 
+291703.519400  9110253.647934 
+291688.521836  9110241.578574 
+291677.522141  9110232.526801 
+291666.522451  9110223.475023 
+291652.518800  9110211.406649 
+291639.479342  9110195.321154 
+291627.448641  9110181.245714 
+291481.997875  9110000.284674 
+291403.762044  9109903.771137 
+291349.572732  9109833.399452 
+291238.205580  9109691.648189 
+291200.586241  9109711.700287 
+291184.773043  9109723.738435 
+291127.416766  9109762.856296 
+291039.353606  9109816.006028 
+290996.816478  9109843.084642 
+290990.875373  9109846.092130 
+290960.880844  9109821.952775 
+290951.891383  9109815.916402 
+290942.130319  9109840.015002 
+290928.490009  9109877.168455 
+290917.786901  9109908.297768 
+290914.894139  9109920.349108 
+290908.114721  9109944.450768 
+290905.296051  9109966.547440 
+290905.333098  9109971.570107 
+290956.251355  9110002.762604 
+290980.245607  9110021.873163 
+291006.272138  9110047.012934 
+291023.331410  9110069.129938 
+291039.426458  9110095.264045 
+291055.514114  9110120.393610 
+291066.602655  9110141.499959 
+291075.673758  9110158.586144 
+291077.683793  9110161.601770 
+291088.757528  9110180.699044 
+291112.863162  9110214.877477 
+291143.963202  9110254.085638 
+291171.013534  9110283.244399 
+291195.082205  9110312.400101 
+291201.104941  9110320.442422 
+291022.247164  9110460.893550 
+291018.293797  9110463.903088 
+291080.160510  9110497.115513 
+291136.998438  9110522.286519 
+291153.961564  9110531.344501 
+291175.019009  9110556.479022 
+291200.163389  9110596.685539 
+291227.273370  9110633.880456 
+291241.336463  9110653.985205 
+291254.390821  9110672.079876 
+291298.471542  9110719.337172 
+291342.552358  9110766.594402 
+291374.594993  9110798.771553 
+291389.637268  9110816.868172 
+291404.560751  9110818.892300 
+291414.678053  9110843.011065 
+291421.724528  9110855.072453 
+291427.918194  9110886.218907 
+291445.208281  9110939.476048 
+291449.280477  9110952.538948 
+291460.235786  9110955.563565 
+291505.829432  9110938.532649 
+291577.205265  9110913.491469 
+291637.759457  9110903.507141 
+291684.413743  9110895.517829 
+291699.307514  9110893.523736 
+291757.881231  9110884.541793 
+291814.415050  9110868.526094 
+291884.781715  9110841.474441 
+291942.197748  9110810.391689 
+291988.688175  9110780.302501 
+292000.540651  9110770.269129 
+292035.126461  9110743.181591 
+292055.879413  9110727.129966 
+292098.319654  9110686.991474 
+292137.748352  9110642.831886 
+Region 1
+34
+291134.422110  9111787.984064 
+291141.253409  9111770.914071 
+291029.635629  9111596.013827 
+290979.353052  9111516.605334 
+290939.069268  9111445.243115 
+290883.498525  9111322.634468 
+290819.858155  9111183.945024 
+290794.594993  9111127.665770 
+290735.211870  9111161.758904 
+290686.709895  9111188.831445 
+290634.261809  9111219.918007 
+290643.481300  9111257.094940 
+290651.566079  9111275.184702 
+290657.714898  9111300.304162 
+290660.867133  9111323.411497 
+290642.034457  9111330.423887 
+290608.292909  9111337.420986 
+290579.498738  9111341.409558 
+290751.728623  9111648.970833 
+290805.089282  9111741.441601 
+290753.775603  9111791.615568 
+290777.867348  9111823.784948 
+290820.035410  9111881.085843 
+290857.211648  9111935.368022 
+290883.298849  9111968.543862 
+290919.325465  9112001.729767 
+290946.302786  9112020.843109 
+290992.231755  9112049.016355 
+291042.077134  9112069.157312 
+291076.968919  9112083.255943 
+291108.797221  9112086.301686 
+291112.810103  9112091.328359 
+291121.599602  9112070.242243 
+291134.422110  9111787.984064 
+Region 1
+125
+291108.797221  9112086.301686 
+291076.968919  9112083.255943 
+291042.077134  9112069.157312 
+290992.231755  9112049.016355 
+290946.302786  9112020.843109 
+290919.325465  9112001.729767 
+290883.298849  9111968.543862 
+290857.211648  9111935.368022 
+290820.035410  9111881.085843 
+290777.867348  9111823.784948 
+290753.775603  9111791.615568 
+290805.089282  9111741.441601 
+290751.728623  9111648.970833 
+290579.498738  9111341.409558 
+290608.292909  9111337.420986 
+290642.034457  9111330.423887 
+290660.867133  9111323.411497 
+290657.714898  9111300.304162 
+290651.566079  9111275.184702 
+290643.481300  9111257.094940 
+290634.261809  9111219.918007 
+290603.516921  9111228.927210 
+290566.756620  9111230.898530 
+290552.804664  9111225.861566 
+290525.879865  9111213.779575 
+290475.998583  9111188.615092 
+290412.128393  9111153.390848 
+290392.183322  9111144.329535 
+290376.524924  9111177.462806 
+290358.982323  9111224.657525 
+290341.373057  9111262.811423 
+290325.707194  9111294.940157 
+290313.052706  9111331.090111 
+290296.407689  9111365.226891 
+290286.646108  9111389.325493 
+290273.643617  9111378.262258 
+290231.721021  9111354.110263 
+290190.799791  9111330.963784 
+290151.859049  9111306.814780 
+290125.898575  9111290.715420 
+290105.931267  9111278.640372 
+290095.940217  9111271.598306 
+290067.375309  9111306.727204 
+290041.740355  9111334.827428 
+290022.068939  9111362.933836 
+289997.435254  9111392.039618 
+289972.882904  9111432.195306 
+289961.103680  9111452.273665 
+289947.410551  9111482.395334 
+289884.696746  9111469.271220 
+289874.949705  9111495.378865 
+289861.093819  9111503.400685 
+289830.392838  9111518.436671 
+289812.568598  9111527.458877 
+289798.742262  9111539.498837 
+289784.901132  9111549.529717 
+289779.983218  9111556.556305 
+289761.342449  9111589.686388 
+289740.765536  9111629.846166 
+289704.012099  9111632.821408 
+289661.346772  9111642.822165 
+289604.747896  9111785.406498 
+289639.676216  9111804.529093 
+289673.662368  9111830.682388 
+289707.596804  9111849.803878 
+289745.507026  9111868.929476 
+289776.459689  9111888.047793 
+289772.587457  9111902.107193 
+289756.765739  9111913.140559 
+289750.846458  9111919.161581 
+289751.892163  9111926.194385 
+289759.086397  9111958.346861 
+289771.479628  9112021.645194 
+289781.855438  9112080.923294 
+289791.222555  9112138.191274 
+289796.369815  9112162.305355 
+289803.608542  9112200.485033 
+289816.046370  9112269.810545 
+289819.116996  9112281.868097 
+289827.275749  9112310.003412 
+289840.818624  9112394.397997 
+289852.716445  9112390.392211 
+289873.530226  9112382.377543 
+289893.342645  9112373.357299 
+289911.167154  9112364.334990 
+289931.951302  9112352.302151 
+289954.701133  9112337.257749 
+289968.564617  9112330.240384 
+289975.514862  9112329.243043 
+289986.455708  9112330.258887 
+289992.419405  9112330.265053 
+290011.289639  9112328.275499 
+290022.223081  9112328.286797 
+290054.029455  9112328.319648 
+290076.860666  9112324.325100 
+290107.643460  9112320.338743 
+290122.515663  9112315.331435 
+290146.325990  9112309.328807 
+290175.113455  9112304.335823 
+290195.978953  9112303.352780 
+290224.788623  9112301.373374 
+290247.627193  9112298.383282 
+290298.333323  9112300.444454 
+290349.039445  9112302.505569 
+290385.852534  9112307.565965 
+290437.567415  9112311.637066 
+290481.308479  9112312.686367 
+290538.964783  9112313.749847 
+290582.720659  9112316.808117 
+290654.284763  9112316.881119 
+290696.045314  9112318.932717 
+290717.837931  9112308.909649 
+290746.521380  9112289.852854 
+290785.159083  9112272.815217 
+290789.120019  9112270.810194 
+290815.874882  9112259.787607 
+290829.752990  9112254.779080 
+290867.389253  9112236.735846 
+290902.036231  9112217.685030 
+290949.574726  9112194.629163 
+290993.152247  9112173.578295 
+291057.520787  9112141.498661 
+291114.004543  9112118.451704 
+291112.810103  9112091.328359 
+291108.797221  9112086.301686 
+Region 1
+55
+293560.092616  9113324.260277 
+293546.265389  9113202.701369 
+293528.522402  9113089.174792 
+293520.144199  9113031.909706 
+293510.974155  9113001.765648 
+293407.813245  9113029.793573 
+293396.849900  9113025.765059 
+293170.259350  9112895.965968 
+292877.785820  9112727.930179 
+292846.054315  9112737.944594 
+292830.285633  9112756.010576 
+292820.413400  9112765.041640 
+292786.125627  9112832.310879 
+292780.266489  9112846.368403 
+292797.223315  9112854.420957 
+292808.194063  9112859.454161 
+292824.156950  9112867.505739 
+292835.172513  9112878.566064 
+292843.206241  9112889.623499 
+292850.268433  9112903.693534 
+292854.333850  9112915.751639 
+292861.433398  9112934.844277 
+292861.530499  9112947.903056 
+292860.656061  9112963.974437 
+292859.841381  9112988.081989 
+292858.877310  9112992.099113 
+292856.941698  9112999.128841 
+292854.183938  9113029.261599 
+292842.458215  9113056.372143 
+292836.681248  9113081.479412 
+292835.724645  9113086.501058 
+292836.860520  9113105.587927 
+292838.908181  9113113.626021 
+292839.005289  9113126.684800 
+292833.101334  9113134.715205 
+292831.143308  9113138.731369 
+292843.123027  9113145.774550 
+292849.168915  9113156.830050 
+292853.271723  9113173.910755 
+292857.374535  9113190.991459 
+292856.417934  9113196.013105 
+292868.509738  9113218.124094 
+292871.596196  9113232.190271 
+292876.610795  9113238.222196 
+292879.622543  9113242.243159 
+292910.577100  9113261.358793 
+292903.791275  9113284.456065 
+292892.132804  9113320.607316 
+292888.358726  9113347.725550 
+292880.623763  9113376.848991 
+292871.820114  9113395.926263 
+292866.080528  9113426.056144 
+292860.363355  9113459.199589 
+293127.267117  9113396.171978 
+293560.092616  9113324.260277 
+Region 1
+73
+292879.622543  9113242.243159 
+292876.610795  9113238.222196 
+292871.596196  9113232.190271 
+292868.509738  9113218.124094 
+292856.417934  9113196.013105 
+292857.374535  9113190.991459 
+292853.271723  9113173.910755 
+292849.168915  9113156.830050 
+292843.123027  9113145.774550 
+292831.143308  9113138.731369 
+292833.101334  9113134.715205 
+292839.005289  9113126.684800 
+292838.908181  9113113.626021 
+292836.860520  9113105.587927 
+292835.724645  9113086.501058 
+292836.681248  9113081.479412 
+292842.458215  9113056.372143 
+292854.183938  9113029.261599 
+292856.941698  9112999.128841 
+292858.877310  9112992.099113 
+292859.841381  9112988.081989 
+292860.656061  9112963.974437 
+292861.530499  9112947.903056 
+292861.433398  9112934.844277 
+292854.333850  9112915.751639 
+292850.268433  9112903.693534 
+292843.206241  9112889.623499 
+292835.172513  9112878.566064 
+292824.156950  9112867.505739 
+292808.194063  9112859.454161 
+292797.223315  9112854.420957 
+292780.266489  9112846.368403 
+292786.125627  9112832.310879 
+292820.413400  9112765.041640 
+292830.285633  9112756.010576 
+292846.054315  9112737.944594 
+292771.687725  9112761.980849 
+292706.236678  9112782.007602 
+292673.503661  9112791.016426 
+292580.438409  9112840.147119 
+292487.380383  9112890.282191 
+292455.700842  9112907.328043 
+292352.740279  9112962.475818 
+292237.911640  9113025.647917 
+292192.338896  9113045.693556 
+292170.509186  9113050.694713 
+292197.614333  9113086.883954 
+292203.630249  9113093.921479 
+292315.711991  9113330.092764 
+292346.023145  9113396.420478 
+292219.042250  9113429.445396 
+292250.168331  9113471.665575 
+292382.520530  9113626.490354 
+292397.579270  9113646.595349 
+292505.001183  9113790.345583 
+292600.317573  9113776.374802 
+292608.418682  9113796.472952 
+292657.990095  9113779.444181 
+292682.569927  9113876.905881 
+292734.749473  9113943.254230 
+292753.717111  9113954.322185 
+292776.615802  9113959.366835 
+292787.302863  9113926.228170 
+292855.595306  9113486.316866 
+292860.363355  9113459.199589 
+292866.080528  9113426.056144 
+292871.820114  9113395.926263 
+292880.623763  9113376.848991 
+292888.358726  9113347.725550 
+292892.132804  9113320.607316 
+292903.791275  9113284.456065 
+292910.577100  9113261.358793 
+292879.622543  9113242.243159 
+Region 1
+76
+292877.785820  9112727.930179 
+292873.795111  9112725.917287 
+292765.007326  9112665.540948 
+292597.435455  9112586.021213 
+292469.733554  9112521.607480 
+292402.893439  9112488.393001 
+292387.932138  9112481.346723 
+292296.169081  9112438.062446 
+292232.355703  9112410.877735 
+292215.391662  9112401.820380 
+292164.484669  9112372.639218 
+292160.494012  9112370.626249 
+292098.549467  9112327.370855 
+292036.597584  9112283.110822 
+291957.674426  9112228.788670 
+291895.782343  9112192.564594 
+291840.010253  9112177.441409 
+291790.239010  9112167.346718 
+291776.309017  9112165.323816 
+291724.564792  9112157.236123 
+291707.652990  9112155.210227 
+291671.834074  9112150.151903 
+291365.552680  9112129.754854 
+291261.137168  9112122.618184 
+291195.507519  9112118.533962 
+291148.762696  9112114.468708 
+291114.004543  9112118.451704 
+291057.520787  9112141.498661 
+290993.152247  9112173.578295 
+290949.574726  9112194.629163 
+290902.036231  9112217.685030 
+290867.389253  9112236.735846 
+290829.752990  9112254.779080 
+290815.874882  9112259.787607 
+290789.120019  9112270.810194 
+290785.159083  9112272.815217 
+290746.521380  9112289.852854 
+290717.837931  9112308.909649 
+290696.045314  9112318.932717 
+290678.369404  9112348.045961 
+290666.634903  9112374.151679 
+290641.244729  9112435.401890 
+290618.695427  9112477.569002 
+290631.676109  9112485.618438 
+290725.686079  9112564.067115 
+290835.398545  9112480.802931 
+290874.051186  9112465.774254 
+290901.763761  9112584.336234 
+291009.288596  9112608.553542 
+291257.175953  9112662.042913 
+291266.136369  9112664.060955 
+291281.298338  9112698.229939 
+291353.281502  9112889.161308 
+291437.529629  9112857.100860 
+291587.184999  9112798.987937 
+291737.826390  9112739.871067 
+291764.588581  9112729.852438 
+291855.801047  9112698.802781 
+291989.596633  9112646.700164 
+292055.715545  9112850.682689 
+292065.684851  9112854.710587 
+292068.711409  9112860.740679 
+292140.429680  9113015.507039 
+292164.493281  9113043.657180 
+292170.509186  9113050.694713 
+292192.338896  9113045.693556 
+292237.911640  9113025.647917 
+292352.740279  9112962.475818 
+292455.700842  9112907.328043 
+292487.380383  9112890.282191 
+292580.438409  9112840.147119 
+292673.503661  9112791.016426 
+292706.236678  9112782.007602 
+292771.687725  9112761.980849 
+292846.054315  9112737.944594 
+292877.785820  9112727.930179 
+Region 1
+30
+291790.239010  9112167.346718 
+291783.050781  9112136.199442 
+291771.871945  9112103.039148 
+291743.565614  9112038.721651 
+291738.506671  9112026.662364 
+291721.208099  9111972.401009 
+291715.013911  9111941.254693 
+291500.064322  9111905.881448 
+291526.001016  9111784.360335 
+291441.383228  9111766.194005 
+291377.675141  9111753.071158 
+291335.878094  9111745.997423 
+291301.045986  9111739.935190 
+291264.255731  9111737.889045 
+291229.490464  9111740.867529 
+291181.863497  9111751.869180 
+291141.253409  9111770.914071 
+291134.422110  9111787.984064 
+291121.599602  9112070.242243 
+291112.810103  9112091.328359 
+291114.004543  9112118.451704 
+291148.762696  9112114.468708 
+291195.507519  9112118.533962 
+291261.137168  9112122.618184 
+291365.552680  9112129.754854 
+291671.834074  9112150.151903 
+291707.652990  9112155.210227 
+291724.564792  9112157.236123 
+291776.309017  9112165.323816 
+291790.239010  9112167.346718 
+Region 1
+33
+292210.117051  9111690.616478 
+292278.812702  9111572.151208 
+292191.909654  9111513.803272 
+292144.964597  9111482.616723 
+292054.998231  9111413.215695 
+291994.034321  9111367.951746 
+291946.050969  9111330.736770 
+291853.185239  9111272.382028 
+291688.088193  9111526.360727 
+291686.130089  9111530.376852 
+291634.106403  9111618.722631 
+291642.102414  9111624.757762 
+291658.072138  9111633.814435 
+291679.078418  9111651.916826 
+291690.160327  9111672.018324 
+291697.221921  9111686.088674 
+291701.338925  9111705.178683 
+291704.491754  9111728.285810 
+291707.808209  9111773.492555 
+291710.629085  9111886.001684 
+291711.883350  9111921.161157 
+291715.013911  9111941.254693 
+291721.208099  9111972.401009 
+291738.506671  9112026.662364 
+291743.565614  9112038.721651 
+291765.380078  9112031.711746 
+291779.354672  9112039.761827 
+291853.262978  9112088.052319 
+291892.618429  9112033.847362 
+291950.586638  9112077.099239 
+292011.532978  9111985.748421 
+292092.141730  9111865.285999 
+292210.117051  9111690.616478 
+Region 1
+77
+293355.301623  9111048.845678 
+293159.802112  9110955.236627 
+293154.810204  9110952.218239 
+293036.110408  9110894.845514 
+292913.427793  9110836.463999 
+292903.451486  9110831.431676 
+292687.993507  9110726.750944 
+292640.114895  9110703.600001 
+292594.231573  9110681.455477 
+292570.795211  9110737.685324 
+292543.316142  9110784.870536 
+292509.910853  9110837.072486 
+292445.072984  9110939.469275 
+292386.261219  9110916.307297 
+292373.270045  9111040.854637 
+292346.542876  9111189.496840 
+292375.641938  9111226.692718 
+292389.653559  9111239.765269 
+292424.671471  9111270.939834 
+292191.909654  9111513.803272 
+292278.812702  9111572.151208 
+292210.117051  9111690.616478 
+292092.141730  9111865.285999 
+292011.532978  9111985.748421 
+291950.586638  9112077.099239 
+291892.618429  9112033.847362 
+291853.262978  9112088.052319 
+291779.354672  9112039.761827 
+291765.380078  9112031.711746 
+291743.565614  9112038.721651 
+291771.871945  9112103.039148 
+291783.050781  9112136.199442 
+291790.239010  9112167.346718 
+291840.010253  9112177.441409 
+291895.782343  9112192.564594 
+291957.674426  9112228.788670 
+292036.597584  9112283.110822 
+292098.549467  9112327.370855 
+292160.494012  9112370.626249 
+292164.484669  9112372.639218 
+292215.391662  9112401.820380 
+292232.355703  9112410.877735 
+292296.169081  9112438.062446 
+292387.932138  9112481.346723 
+292402.893439  9112488.393001 
+292469.733554  9112521.607480 
+292597.435455  9112586.021213 
+292765.007326  9112665.540948 
+292873.795111  9112725.917287 
+292877.785820  9112727.930179 
+293170.259350  9112895.965968 
+293396.849900  9113025.765059 
+293407.813245  9113029.793573 
+293510.974155  9113001.765648 
+293499.786304  9112967.601620 
+293436.702758  9112771.661761 
+293381.750935  9112599.837738 
+293324.744510  9112418.970959 
+293290.113475  9112306.432340 
+293272.827944  9112254.181081 
+293265.698517  9112231.070439 
+293250.400920  9112178.821070 
+293242.113181  9112133.610026 
+293234.752141  9112079.359255 
+293218.363606  9112014.050134 
+293211.174497  9111982.903305 
+293208.947554  9111950.756747 
+293213.693028  9111920.625940 
+293230.148898  9111861.375561 
+293245.707953  9111815.182985 
+293262.231019  9111764.973289 
+293277.857275  9111727.821392 
+293278.828779  9111724.808792 
+293337.544726  9111734.910497 
+293789.205136  9111258.200908 
+293490.965711  9111115.274316 
+293355.301623  9111048.845678 
+Region 1
+75
+292375.641938  9111226.692718 
+292346.542876  9111189.496840 
+292373.270045  9111040.854637 
+292056.139789  9110762.288402 
+292035.126461  9110743.181591 
+292000.540651  9110770.269129 
+291988.688175  9110780.302501 
+291942.197748  9110810.391689 
+291884.781715  9110841.474441 
+291814.415050  9110868.526094 
+291757.881231  9110884.541793 
+291699.307514  9110893.523736 
+291684.413743  9110895.517829 
+291637.759457  9110903.507141 
+291577.205265  9110913.491469 
+291505.829432  9110938.532649 
+291460.235786  9110955.563565 
+291449.280477  9110952.538948 
+291445.208281  9110939.476048 
+291427.918194  9110886.218907 
+291421.724528  9110855.072453 
+291414.678053  9110843.011065 
+291404.560751  9110818.892300 
+291389.637268  9110816.868172 
+291383.658965  9110814.853083 
+291326.093901  9110825.844604 
+291274.469985  9110833.828509 
+291223.921582  9110852.863210 
+291172.364373  9110869.887792 
+291206.966290  9110979.415992 
+291086.005584  9111019.474144 
+291038.401518  9111033.489073 
+291008.650811  9111042.499515 
+290948.199930  9111066.546530 
+290899.646317  9111086.587517 
+290833.261438  9111114.646453 
+290794.594993  9111127.665770 
+290819.858155  9111183.945024 
+290883.498525  9111322.634468 
+290939.069268  9111445.243115 
+290979.353052  9111516.605334 
+291029.635629  9111596.013827 
+291141.253409  9111770.914071 
+291181.863497  9111751.869180 
+291229.490464  9111740.867529 
+291264.255731  9111737.889045 
+291301.045986  9111739.935190 
+291335.878094  9111745.997423 
+291377.675141  9111753.071158 
+291441.383228  9111766.194005 
+291526.001016  9111784.360335 
+291500.064322  9111905.881448 
+291715.013911  9111941.254693 
+291711.883350  9111921.161157 
+291710.629085  9111886.001684 
+291707.808209  9111773.492555 
+291704.491754  9111728.285810 
+291701.338925  9111705.178683 
+291697.221921  9111686.088674 
+291690.160327  9111672.018324 
+291679.078418  9111651.916826 
+291658.072138  9111633.814435 
+291642.102414  9111624.757762 
+291634.106403  9111618.722631 
+291686.130089  9111530.376852 
+291688.088193  9111526.360727 
+291853.185239  9111272.382028 
+291946.050969  9111330.736770 
+291994.034321  9111367.951746 
+292054.998231  9111413.215695 
+292144.964597  9111482.616723 
+292191.909654  9111513.803272 
+292424.671471  9111270.939834 
+292389.653559  9111239.765269 
+292375.641938  9111226.692718 
+Region 1
+15
+292570.795211  9110737.685324 
+292594.231573  9110681.455477 
+292500.469791  9110636.159771 
+292257.109763  9110521.403789 
+292137.748352  9110642.831886 
+292098.319654  9110686.991474 
+292055.879413  9110727.129966 
+292035.126461  9110743.181591 
+292056.139789  9110762.288402 
+292373.270045  9111040.854637 
+292386.261219  9110916.307297 
+292445.072984  9110939.469275 
+292509.910853  9110837.072486 
+292543.316142  9110784.870536 
+292570.795211  9110737.685324 
+Region 1
+261
+289102.061675  9119239.515092 
+288888.087294  9117589.854552 
+288891.002838  9117580.816761 
+288871.039954  9117569.746319 
+288993.577296  9117606.035671 
+289017.734984  9117242.419830 
+288972.742923  9117207.214842 
+288944.857348  9117200.154360 
+288922.839869  9117180.040987 
+288909.783770  9117161.945918 
+288898.767641  9117150.884680 
+288878.753137  9117132.782410 
+288858.783074  9117120.707373 
+288848.812854  9117116.678932 
+288843.827744  9117114.664710 
+288824.910983  9117110.627010 
+288807.974941  9117105.586818 
+288775.119131  9117098.521066 
+288764.214074  9117102.527905 
+288754.325281  9117109.549396 
+288747.440873  9117119.587600 
+288737.537271  9117124.600006 
+288729.495965  9117112.537264 
+288725.416106  9117098.469560 
+288724.377638  9117092.441279 
+288724.325831  9117085.409488 
+288725.164471  9117064.315145 
+288741.945068  9117048.260001 
+288752.761300  9117032.198672 
+288755.669463  9117022.156349 
+288754.549583  9117005.078113 
+288750.491936  9116994.024034 
+288747.398747  9116978.952819 
+288747.309937  9116966.898320 
+288732.354668  9116960.855605 
+288720.374175  9116953.811437 
+288710.344801  9116941.746619 
+288709.202747  9116921.654752 
+288723.980399  9116903.588478 
+288743.757920  9116889.545525 
+288772.333911  9116855.421015 
+288827.586483  9116799.224405 
+288808.381216  9116756.009555 
+288785.318190  9116728.863226 
+288763.345442  9116714.776950 
+288762.158998  9116688.657837 
+288764.087904  9116680.623568 
+288763.056855  9116675.599828 
+288765.987211  9116668.571133 
+288690.513298  9116678.538058 
+288614.920980  9116672.432186 
+288538.319812  9116664.316062 
+288490.501795  9116650.202657 
+288462.520480  9116630.082716 
+288457.483688  9116621.036632 
+288477.893025  9116557.772225 
+288516.646189  9116555.803639 
+288507.507517  9116529.676176 
+288500.423492  9116512.591674 
+288431.494102  9116466.310956 
+288369.523172  9116420.037394 
+288341.490339  9116392.885522 
+288243.335061  9116292.328772 
+288079.130419  9116131.429749 
+288002.992783  9116050.986219 
+288033.490735  9116007.823346 
+288051.154682  9115976.701349 
+288054.085141  9115969.672682 
+288060.910576  9115951.598217 
+288061.845575  9115943.562902 
+288062.773194  9115934.523041 
+288064.576774  9115909.411500 
+288061.461824  9115891.326522 
+288060.290677  9115867.216371 
+288148.917608  9115618.184726 
+288215.079812  9115423.374388 
+288223.162559  9115305.852059 
+288220.047650  9115287.767092 
+288211.940490  9115266.663232 
+288214.686418  9115234.520938 
+288214.642142  9115228.493666 
+288226.230956  9115182.297204 
+288170.794476  9115213.379193 
+288157.092126  9115242.496277 
+288165.214012  9115265.609245 
+288175.309200  9115286.715223 
+288166.495800  9115304.787572 
+288152.668000  9115316.827386 
+288126.926647  9115330.863654 
+288118.989201  9115332.864321 
+288110.050352  9115333.859388 
+288098.166312  9115339.874022 
+288090.265749  9115346.897414 
+288078.389079  9115353.916590 
+288071.489913  9115361.945580 
+288062.610069  9115370.977007 
+288051.727414  9115377.997233 
+288046.779411  9115381.005599 
+288038.871456  9115387.024440 
+288030.963498  9115393.043279 
+288024.056941  9115400.067719 
+288022.164776  9115413.124711 
+288020.250482  9115423.168063 
+288018.343563  9115434.215962 
+288016.421892  9115443.254769 
+288008.536051  9115452.287246 
+288000.628079  9115458.306084 
+287990.732047  9115464.322811 
+287985.813532  9115471.349359 
+287973.973689  9115483.391251 
+287968.039015  9115487.403104 
+287961.154561  9115497.441179 
+287952.282045  9115507.477142 
+287940.420059  9115516.505390 
+287930.531380  9115523.526655 
+287917.682729  9115533.558389 
+287901.837231  9115541.577857 
+287891.963287  9115550.608210 
+287877.097061  9115556.619635 
+287868.224513  9115566.655589 
+287866.310186  9115576.698944 
+287864.395858  9115586.742299 
+287865.471000  9115597.793373 
+287868.622695  9115620.901125 
+287869.705215  9115632.956746 
+287859.831248  9115641.987098 
+287850.973431  9115654.032147 
+287845.090339  9115665.075820 
+287843.168633  9115674.114629 
+287841.210059  9115678.130703 
+287839.244112  9115681.142229 
+287833.383134  9115695.199544 
+287830.415777  9115697.205466 
+287820.527043  9115704.226719 
+287818.583213  9115710.251887 
+287811.735565  9115725.312691 
+287806.809626  9115731.334685 
+287798.894206  9115736.348958 
+287786.052841  9115747.385222 
+287779.146198  9115754.409646 
+287776.208324  9115760.433755 
+287774.271860  9115767.463470 
+287773.381041  9115781.526075 
+287774.456178  9115792.577155 
+287778.528174  9115805.640504 
+287775.560807  9115807.646424 
+287771.614149  9115811.660381 
+287762.682556  9115813.659951 
+287755.761155  9115818.675279 
+287747.845715  9115823.689547 
+287739.937644  9115829.708362 
+287730.048867  9115836.729606 
+287719.210280  9115849.777076 
+287713.282907  9115854.793459 
+287705.389569  9115862.821366 
+287705.448542  9115870.857747 
+287706.472069  9115874.876998 
+287712.502651  9115883.924282 
+287723.503434  9115892.976860 
+287730.572297  9115908.052485 
+287732.619357  9115916.090983 
+287730.756611  9115933.166175 
+287725.941232  9115954.256381 
+287726.994255  9115962.293820 
+287731.110503  9115981.384457 
+287736.161813  9115992.439770 
+287743.208584  9116004.501746 
+287750.247985  9116015.559172 
+287750.373336  9116032.636478 
+287741.589169  9116054.727003 
+287731.810953  9116076.816470 
+287718.056554  9116098.901707 
+287693.330786  9116115.952563 
+287683.500930  9116131.010194 
+287678.626549  9116144.064022 
+287672.809728  9116164.148626 
+287665.998858  9116184.232172 
+287655.174935  9116199.288744 
+287641.302515  9116205.301206 
+287632.385581  9116209.309866 
+287614.573823  9116220.340826 
+287602.755826  9116235.396332 
+287594.884529  9116246.437883 
+287591.931871  9116250.452896 
+287576.100811  9116260.481418 
+287561.352242  9116282.565576 
+287546.625771  9116307.663378 
+287529.911187  9116332.759057 
+287516.127147  9116350.826077 
+287443.068460  9116419.056830 
+287392.600180  9116450.143651 
+287371.857673  9116468.203206 
+287349.311225  9116511.374362 
+287294.005084  9116560.537687 
+287292.031704  9116562.544657 
+287270.250852  9116574.575823 
+287269.463047  9116602.702151 
+287269.595640  9116620.784047 
+287247.925245  9116647.883458 
+287231.085173  9116655.901744 
+287213.258400  9116664.923509 
+287172.472512  9116660.861585 
+287076.048736  9116660.757993 
+286999.484034  9116657.661962 
+286957.711425  9116654.603319 
+286926.048672  9116674.660048 
+286910.209926  9116683.683855 
+286943.300966  9116722.896744 
+286982.378524  9116765.129672 
+287012.472777  9116802.330167 
+287031.625017  9116838.514320 
+287051.844986  9116884.745034 
+287053.155667  9116927.941787 
+287039.525907  9116967.104314 
+287019.961176  9117010.278636 
+287010.307653  9117049.445438 
+287000.705661  9117095.644099 
+286996.957638  9117126.780906 
+286997.149083  9117152.899232 
+287005.388831  9117192.085262 
+287014.571126  9117224.240498 
+287031.669200  9117251.381511 
+287069.804884  9117300.645013 
+287137.866041  9117364.004094 
+287211.862360  9117423.351200 
+287296.778962  9117480.700700 
+287302.772909  9117484.725256 
+287399.685017  9117551.128156 
+287416.658083  9117561.191612 
+287504.690175  9117636.625630 
+287573.812889  9117709.025768 
+287647.854564  9117774.399169 
+287650.851570  9117776.411415 
+287706.763730  9117809.620260 
+287771.578393  9117836.811166 
+287775.569489  9117838.824450 
+287854.353068  9117873.061702 
+287946.074587  9117909.321448 
+288001.964892  9117939.516202 
+288043.967658  9117973.714477 
+288073.054785  9118008.903722 
+288104.181878  9118051.126827 
+288132.504225  9118117.455846 
+288256.519771  9118489.263485 
+288286.845737  9118557.603430 
+288330.050658  9118619.929483 
+288460.630678  9118802.890074 
+288576.107680  9118959.716588 
+288640.367456  9119046.172636 
+288701.548824  9119119.566440 
+288771.707008  9119196.987443 
+288835.856298  9119268.374939 
+288909.924626  9119336.758826 
+288973.050548  9119404.126854 
+288977.969159  9119397.100146 
+289026.064868  9119448.380238 
+289068.203442  9119500.658727 
+289109.333159  9119550.927067 
+289147.643972  9119623.292161 
+289200.436938  9119772.016161 
+289102.061675  9119239.515092 
+Region 1
+305
+290675.442609  9114910.586861 
+290635.467007  9114881.415433 
+290588.518582  9114850.227882 
+290538.513927  9114808.991929 
+290516.489921  9114787.874668 
+290491.528496  9114772.781578 
+290458.563101  9114750.648698 
+290433.594286  9114734.551033 
+290396.667791  9114714.423140 
+290356.766749  9114695.296720 
+290333.800837  9114681.210067 
+290321.754081  9114665.125424 
+290309.581155  9114631.963693 
+290299.425935  9114602.822109 
+290293.239299  9114572.680024 
+290278.218024  9114557.596863 
+290252.270216  9114543.507116 
+290220.373283  9114531.420353 
+290201.442831  9114525.373926 
+290167.624690  9114522.325912 
+290143.724260  9114516.274396 
+290081.065378  9114511.187856 
+290009.527250  9114515.132908 
+289994.632119  9114517.126738 
+289968.684387  9114503.036802 
+289952.646985  9114484.938877 
+289936.572531  9114461.818261 
+289923.502321  9114441.714300 
+289902.524630  9114427.629402 
+289859.679042  9114413.522061 
+289803.013858  9114412.459363 
+289705.624432  9114415.372814 
+289637.023832  9114413.293091 
+289618.167510  9114417.291771 
+289561.739202  9114448.373999 
+289516.378066  9114497.549166 
+289493.612321  9114510.584546 
+289446.968344  9114520.581629 
+289412.185728  9114521.550167 
+289395.250710  9114516.509975 
+289357.537888  9114524.507157 
+289323.793652  9114531.503896 
+289304.870629  9114526.461606 
+289277.943806  9114514.379274 
+289258.019392  9114508.331391 
+289212.332321  9114513.306576 
+289200.404303  9114513.294173 
+289189.625621  9114534.378148 
+289183.713386  9114541.403728 
+289174.811746  9114547.421664 
+289190.878521  9114569.538093 
+289188.942295  9114576.567808 
+289178.104422  9114589.615462 
+289141.437239  9114604.645305 
+289095.897940  9114629.711215 
+289047.457906  9114665.823933 
+289043.533645  9114672.851575 
+289023.934505  9114711.003408 
+289008.096941  9114720.027691 
+288969.441558  9114735.055360 
+288964.508486  9114740.072879 
+288956.593388  9114745.087284 
+288950.636734  9114746.085598 
+288939.732216  9114750.092346 
+288929.829097  9114755.104671 
+288919.940760  9114762.126078 
+288908.020050  9114763.118156 
+288898.116923  9114768.130476 
+288887.241960  9114776.155380 
+288880.335638  9114783.179899 
+288868.474049  9114792.208303 
+288860.573712  9114799.231780 
+288855.692357  9114811.281085 
+288848.815588  9114822.323769 
+288839.876888  9114823.318952 
+288832.926206  9114824.316214 
+288823.965333  9114822.297768 
+288812.037209  9114822.285282 
+288799.100294  9114820.262668 
+288787.179558  9114821.254718 
+288779.242253  9114823.255473 
+288775.317937  9114830.283105 
+288775.362274  9114836.310359 
+288770.495672  9114850.368747 
+288769.582945  9114861.417672 
+288764.716340  9114875.476060 
+288760.843745  9114889.535489 
+288745.042998  9114903.582420 
+288735.147207  9114909.599258 
+288727.224661  9114913.609093 
+288718.322878  9114919.626971 
+288712.395743  9114924.643431 
+288705.481981  9114930.663391 
+288701.542870  9114935.681935 
+288692.655855  9114943.708895 
+288684.740686  9114948.723268 
+288676.825515  9114953.737640 
+288664.926898  9114957.743296 
+288654.022293  9114961.749992 
+288635.180344  9114967.757424 
+288625.277134  9114972.769701 
+288608.467523  9114984.806471 
+288596.561502  9114987.807569 
+288581.658661  9114988.796443 
+288571.748052  9114992.804168 
+288563.840243  9114998.823068 
+288554.938416  9115004.840923 
+288544.107638  9115018.893034 
+288535.213190  9115025.915429 
+288526.303968  9115030.928736 
+288514.427465  9115037.947992 
+288502.558341  9115045.971788 
+288483.716325  9115051.979170 
+288465.868319  9115057.987592 
+288453.019929  9115068.019420 
+288441.136018  9115074.034117 
+288428.295001  9115085.070485 
+288408.481082  9115094.090426 
+288390.633044  9115100.098825 
+288378.741731  9115105.108965 
+288362.881720  9115111.119451 
+288351.005163  9115118.138674 
+288342.103278  9115124.156499 
+288330.219332  9115130.171174 
+288317.363506  9115139.198430 
+288302.512252  9115147.219040 
+288291.607552  9115151.225667 
+288271.815707  9115163.259197 
+288257.928937  9115167.262666 
+288245.036184  9115171.267183 
+288233.159587  9115178.286383 
+288226.230956  9115182.297204 
+288214.642142  9115228.493666 
+288214.686418  9115234.520938 
+288211.940490  9115266.663232 
+288220.047650  9115287.767092 
+288223.162559  9115305.852059 
+288215.079812  9115423.374388 
+288148.917608  9115618.184726 
+288060.290677  9115867.216371 
+288061.461824  9115891.326522 
+288064.576774  9115909.411500 
+288062.773194  9115934.523041 
+288061.845575  9115943.562902 
+288060.910576  9115951.598217 
+288054.085141  9115969.672682 
+288051.154682  9115976.701349 
+288033.490735  9116007.823346 
+288002.992783  9116050.986219 
+288079.130419  9116131.429749 
+288243.335061  9116292.328772 
+288341.490339  9116392.885522 
+288369.523172  9116420.037394 
+288431.494102  9116466.310956 
+288500.423492  9116512.591674 
+288507.507517  9116529.676176 
+288516.646189  9116555.803639 
+288477.893025  9116557.772225 
+288457.483688  9116621.036632 
+288462.520480  9116630.082716 
+288490.501795  9116650.202657 
+288538.319812  9116664.316062 
+288614.920980  9116672.432186 
+288690.513298  9116678.538058 
+288765.987211  9116668.571133 
+288752.923961  9116649.471423 
+288731.099238  9116655.475956 
+288693.147751  9116631.327685 
+288682.087437  9116614.239096 
+288693.860689  9116593.156122 
+288732.428870  9116566.073802 
+288778.978983  9116543.017885 
+288800.677851  9116519.936138 
+288822.421098  9116502.881634 
+288833.148414  9116474.765824 
+288849.001354  9116467.750538 
+288882.821124  9116470.799210 
+288886.789907  9116469.798791 
+288919.623031  9116473.850946 
+288937.656502  9116492.955750 
+288945.571859  9116487.941280 
+288948.516985  9116482.921663 
+288940.401765  9116460.813534 
+288927.227508  9116426.645764 
+288929.023152  9116400.529761 
+288957.680183  9116377.455182 
+288981.463202  9116367.434473 
+289003.339557  9116368.461644 
+289039.117705  9116367.494111 
+289048.976689  9116356.454443 
+289052.664102  9116317.281485 
+289076.513700  9116316.301600 
+289096.416747  9116319.335757 
+289120.177474  9116306.301371 
+289135.014036  9116296.271363 
+289138.953171  9116291.252767 
+289146.787004  9116275.188338 
+289151.668335  9116263.138990 
+289159.620656  9116263.147194 
+289166.638186  9116271.190689 
+289181.652481  9116285.269620 
+289191.637326  9116291.307105 
+289210.561131  9116296.349266 
+289233.431470  9116297.377357 
+289253.171522  9116278.311583 
+289269.053935  9116275.314337 
+289287.020739  9116285.378138 
+289304.994959  9116296.446469 
+289331.804398  9116292.455904 
+289340.706295  9116286.437865 
+289348.540048  9116270.373418 
+289351.403602  9116254.303864 
+289346.359308  9116244.253370 
+289334.230782  9116217.118565 
+289335.158134  9116208.078738 
+289349.942735  9116191.016907 
+289355.936600  9116195.041192 
+289363.970412  9116206.099288 
+289373.992304  9116217.159424 
+289374.764030  9116187.024289 
+289364.490208  9116141.809839 
+289369.356651  9116127.751407 
+289381.403646  9116143.836281 
+289388.465645  9116157.906968 
+289401.454817  9116166.961086 
+289441.965735  9116133.853156 
+289459.517437  9116087.662760 
+289449.488153  9116075.598102 
+289437.404108  9116054.490556 
+289441.224614  9116033.399334 
+289452.158983  9116033.410559 
+289461.216455  9116048.487813 
+289475.214457  9116059.552009 
+289492.083385  9116055.551188 
+289509.820330  9116034.474237 
+289539.322567  9115991.309676 
+289567.860375  9115952.162240 
+289596.383310  9115911.005722 
+289645.714077  9115860.829723 
+289701.038561  9115814.677939 
+289739.612804  9115788.599590 
+289761.310809  9115765.517578 
+289785.990867  9115742.438604 
+289800.693567  9115714.326798 
+289827.287452  9115681.204478 
+289829.067812  9115653.079489 
+289827.962529  9115638.010430 
+289817.829460  9115611.882341 
+289823.674922  9115595.815845 
+289833.615142  9115595.825988 
+289847.501779  9115591.822040 
+289868.183372  9115565.725387 
+289896.883870  9115548.677660 
+289924.456786  9115513.547262 
+289939.374499  9115514.566985 
+289958.149580  9115499.518179 
+290003.614747  9115464.405965 
+290023.361540  9115446.344547 
+290041.335487  9115457.412627 
+290050.259383  9115454.408114 
+290059.101645  9115440.353712 
+290065.948446  9115425.292754 
+290083.877859  9115430.333606 
+290095.694733  9115415.277694 
+290116.465168  9115401.235398 
+290130.262633  9115385.176965 
+290123.067010  9115353.024786 
+290133.830462  9115329.931584 
+290160.579779  9115317.904403 
+290172.530217  9115320.930107 
+290168.769430  9115350.057579 
+290179.740709  9115355.091340 
+290190.615483  9115347.066149 
+290205.340104  9115321.967900 
+290218.262286  9115321.980996 
+290225.405991  9115347.101405 
+290232.683353  9115390.303427 
+290246.762921  9115412.417269 
+290271.635590  9115415.456017 
+290295.410276  9115404.430271 
+290305.313296  9115399.417651 
+290338.768164  9115353.243254 
+290354.501560  9115330.155047 
+290350.369540  9115309.055823 
+290362.201141  9115296.008936 
+290377.029628  9115284.974127 
+290368.483370  9115204.603405 
+290379.276374  9115185.528315 
+290404.972087  9115165.463752 
+290432.722644  9115154.441987 
+290450.570237  9115148.432844 
+290469.448977  9115147.447365 
+290506.175292  9115140.452715 
+290544.837593  9115126.428312 
+290572.439460  9115095.315822 
+290591.013493  9115053.144464 
+290590.753418  9115017.985825 
+290599.617727  9115006.944972 
+290614.587250  9115014.996236 
+290627.576199  9115024.050027 
+290647.456303  9115024.070018 
+290674.093765  9114996.974625 
+290692.823761  9114975.898428 
+290684.485249  9114923.654771 
+290675.442609  9114910.586861 
+Region 1
+113
+290721.230712  9114113.040333 
+290683.385010  9114102.956901 
+290607.738191  9114088.817127 
+290553.988755  9114078.717493 
+290512.181995  9114070.638944 
+290501.181350  9114061.587062 
+290460.353745  9114051.500399 
+290451.407882  9114051.491322 
+290337.151527  9114058.406925 
+290287.474496  9114061.369946 
+290282.497148  9114060.360350 
+290205.878632  9114049.232453 
+290162.788691  9114001.975669 
+290041.137747  9113815.008967 
+290026.064152  9113927.500708 
+289991.178350  9113914.406072 
+289973.190292  9113901.328745 
+289960.120291  9113881.224755 
+289944.001664  9113852.076867 
+289931.955314  9113835.992030 
+289918.914990  9113819.906165 
+289913.745037  9113792.778565 
+289900.593609  9113761.624638 
+289883.599622  9113748.548277 
+289866.590829  9113733.462833 
+289855.531117  9113716.374446 
+289842.394573  9113687.229561 
+289835.392274  9113681.195170 
+289830.400155  9113678.176437 
+289805.609902  9113686.187125 
+289787.799717  9113697.218590 
+289705.824988  9113768.455629 
+289700.958731  9113782.514028 
+289673.245664  9113798.557886 
+289635.644555  9113821.623224 
+289614.918937  9113841.692404 
+289587.999929  9113830.614715 
+289572.081373  9113828.589175 
+289538.248891  9113823.531480 
+289509.526935  9113837.565150 
+289495.625943  9113839.559801 
+289480.701365  9113837.535259 
+289476.718025  9113836.526596 
+289458.767098  9113828.471718 
+289419.794528  9113800.304367 
+289389.819642  9113779.178049 
+289372.892318  9113775.142320 
+289343.028406  9113769.084059 
+289304.226032  9113764.021000 
+289298.306495  9113770.042029 
+289294.367531  9113775.060588 
+289182.276379  9113806.084205 
+289170.370723  9113809.085372 
+289141.604254  9113817.091589 
+289073.218709  9113844.142489 
+289072.261674  9113849.164156 
+289116.152348  9113870.305254 
+289226.015974  9113941.741767 
+289446.308950  9114026.351502 
+289446.345949  9114031.374198 
+289447.406537  9114040.416081 
+289425.950756  9114231.254824 
+289415.697666  9114323.661099 
+289407.782699  9114328.675555 
+289379.060402  9114342.709225 
+289359.224861  9114348.715844 
+289323.729523  9114387.855760 
+289387.263988  9114376.871807 
+289398.575403  9114428.114641 
+289446.968344  9114520.581629 
+289493.612321  9114510.584546 
+289516.378066  9114497.549166 
+289561.739202  9114448.373999 
+289618.167510  9114417.291771 
+289637.023832  9114413.293091 
+289705.624432  9114415.372814 
+289803.013858  9114412.459363 
+289859.679042  9114413.522061 
+289902.524630  9114427.629402 
+289923.502321  9114441.714300 
+289936.572531  9114461.818261 
+289952.646985  9114484.938877 
+289968.684387  9114503.036802 
+289994.632119  9114517.126738 
+290009.527250  9114515.132908 
+290081.065378  9114511.187856 
+290143.724260  9114516.274396 
+290167.624690  9114522.325912 
+290201.442831  9114525.373926 
+290220.373283  9114531.420353 
+290252.270216  9114543.507116 
+290278.218024  9114557.596863 
+290293.239299  9114572.680024 
+290299.425935  9114602.822109 
+290309.581155  9114631.963693 
+290321.754081  9114665.125424 
+290333.800837  9114681.210067 
+290356.766749  9114695.296720 
+290396.667791  9114714.423140 
+290433.594286  9114734.551033 
+290458.563101  9114750.648698 
+290491.528496  9114772.781578 
+290516.489921  9114787.874668 
+290538.513927  9114808.991929 
+290647.556782  9114768.920815 
+290630.116405  9114695.572930 
+290625.999251  9114676.482807 
+290609.642121  9114615.190289 
+290619.500365  9114604.150452 
+290711.464745  9114405.347191 
+290802.886053  9114133.213093 
+290763.030074  9114120.114139 
+290721.230712  9114113.040333 
+Region 1
+61
+291530.118940  9114889.338600 
+291535.081477  9114888.338975 
+291424.036193  9114658.194024 
+291396.781386  9114601.913852 
+291391.729520  9114590.859113 
+291276.043498  9114404.907779 
+291262.898390  9114374.759047 
+291247.854627  9114356.662678 
+291218.909938  9114340.561499 
+291186.063718  9114334.501628 
+291159.337653  9114349.542808 
+291117.701744  9114364.569093 
+291094.869766  9114368.564382 
+291070.064679  9114374.566735 
+290981.614536  9114376.487296 
+290979.366313  9114341.326729 
+290971.102129  9114299.128468 
+290967.993773  9114282.048456 
+290957.905209  9114261.947875 
+290942.787251  9114233.806057 
+290914.702900  9114199.624074 
+290880.706709  9114172.467792 
+290858.757282  9114161.395970 
+290854.766478  9114159.382911 
+290826.830859  9114145.291480 
+290802.886053  9114133.213093 
+290711.464745  9114405.347191 
+290619.500365  9114604.150452 
+290609.642121  9114615.190289 
+290625.999251  9114676.482807 
+290630.116405  9114695.572930 
+290647.556782  9114768.920815 
+290538.513927  9114808.991929 
+290588.518582  9114850.227882 
+290635.467007  9114881.415433 
+290675.442609  9114910.586861 
+290684.485249  9114923.654771 
+290692.823761  9114975.898428 
+290743.674061  9114997.044494 
+290771.573083  9115006.113196 
+290804.434698  9115014.182327 
+290818.499469  9115034.286894 
+290833.588003  9115058.410574 
+290847.645366  9115077.510595 
+290861.501944  9115069.488270 
+290880.231856  9115048.412009 
+290904.970400  9115033.368892 
+290937.541943  9115002.261219 
+290941.503079  9115000.256130 
+290980.157609  9114985.226884 
+291052.563529  9114964.204128 
+291104.087895  9114942.155962 
+291143.654429  9114916.077765 
+291200.163561  9114896.043517 
+291222.031548  9114896.065245 
+291242.905533  9114896.085976 
+291247.853195  9114893.077323 
+291284.497146  9114875.032301 
+291384.697343  9114849.014053 
+291411.587408  9114856.072313 
+291530.118940  9114889.338600 
+Region 1
+91
+290031.932510  9113779.841031 
+290029.892668  9113772.807240 
+290011.771276  9113741.648265 
+289993.724014  9113720.534639 
+289968.726321  9113700.418393 
+289931.697177  9113666.226351 
+289908.465263  9113615.975995 
+289891.086169  9113550.663700 
+289890.826929  9113515.504904 
+289890.493631  9113470.300738 
+289909.706529  9113379.912886 
+289919.357404  9113340.746184 
+289939.919732  9113298.577135 
+290029.319105  9113156.026035 
+290004.403253  9113146.959636 
+289980.562849  9113148.944148 
+289978.804523  9113180.082739 
+289961.944095  9113185.088020 
+289943.073506  9113187.077637 
+289908.358657  9113197.087145 
+289887.470498  9113195.056542 
+289879.652032  9113213.130008 
+289869.845621  9113231.201423 
+289853.125837  9113255.292880 
+289837.029803  9113229.158490 
+289801.796668  9113168.850295 
+289766.615452  9113115.573813 
+289752.588880  9113100.491343 
+289717.474388  9113056.255639 
+289637.421777  9113118.453540 
+289599.784132  9113136.496032 
+289563.110830  9113150.521376 
+289525.384356  9113156.509350 
+289501.536469  9113157.489077 
+289459.774925  9113155.436546 
+289422.975834  9113152.384616 
+289418.999952  9113152.380472 
+289419.229177  9113183.521204 
+289438.181183  9113192.581736 
+289448.209639  9113204.646563 
+289459.298631  9113225.753277 
+289466.507893  9113259.914860 
+289469.719090  9113291.058684 
+289469.785655  9113300.099539 
+289466.142594  9113345.299676 
+289469.213275  9113357.357250 
+289473.292728  9113371.424936 
+289468.478182  9113392.515094 
+289466.630769  9113411.599275 
+289455.963312  9113447.751323 
+289449.234772  9113478.884810 
+289455.427944  9113510.031732 
+289488.658305  9113568.329091 
+289490.668458  9113571.344773 
+289502.788572  9113597.475174 
+289486.149856  9113632.616500 
+289469.488925  9113664.744209 
+289462.782593  9113698.891318 
+289461.943976  9113719.985610 
+289474.300902  9113778.261264 
+289480.701365  9113837.535259 
+289495.625943  9113839.559801 
+289509.526935  9113837.565150 
+289538.248891  9113823.531480 
+289572.081373  9113828.589175 
+289587.999929  9113830.614715 
+289614.918937  9113841.692404 
+289635.644555  9113821.623224 
+289673.245664  9113798.557886 
+289700.958731  9113782.514028 
+289705.824988  9113768.455629 
+289787.799717  9113697.218590 
+289805.609902  9113686.187125 
+289830.400155  9113678.176437 
+289835.392274  9113681.195170 
+289842.394573  9113687.229561 
+289855.531117  9113716.374446 
+289866.590829  9113733.462833 
+289883.599622  9113748.548277 
+289900.593609  9113761.624638 
+289913.745037  9113792.778565 
+289918.914990  9113819.906165 
+289931.955314  9113835.992030 
+289944.001664  9113852.076867 
+289960.120291  9113881.224755 
+289973.190292  9113901.328745 
+289991.178350  9113914.406072 
+290026.064152  9113927.500708 
+290041.137747  9113815.008967 
+290038.133567  9113811.992302 
+290031.932510  9113779.841031 
+Region 1
+47
+292054.178100  9114384.580256 
+291874.254493  9114248.793971 
+291886.970052  9114087.078951 
+291891.775951  9114064.984263 
+291885.782269  9114060.960297 
+291789.001289  9114011.643609 
+291771.820539  9113973.454939 
+291675.680429  9114010.527276 
+291576.304987  9114013.442551 
+291566.484352  9114029.505153 
+291562.545671  9114034.523854 
+291473.887988  9114008.318425 
+291459.231416  9114042.457590 
+291451.391244  9114057.517622 
+291411.203785  9114133.821323 
+291372.877644  9114193.050004 
+291343.318644  9114228.178874 
+291309.820872  9114268.326426 
+291271.427530  9114318.514312 
+291223.857551  9114337.552862 
+291218.909938  9114340.561499 
+291247.854627  9114356.662678 
+291262.898390  9114374.759047 
+291276.043498  9114404.907779 
+291391.729520  9114590.859113 
+291396.781386  9114601.913852 
+291424.036193  9114658.194024 
+291535.081477  9114888.338975 
+291586.717178  9114881.358245 
+291629.272731  9114856.287167 
+291706.454080  9114809.150685 
+291747.993123  9114781.064969 
+291776.729483  9114769.038961 
+291797.580981  9114766.045872 
+291803.522574  9114763.038146 
+291832.229074  9114746.994005 
+291880.673706  9114711.883342 
+291897.452243  9114695.827484 
+291923.161770  9114677.771331 
+291977.756669  9114667.779568 
+292044.174956  9114643.736046 
+292071.932048  9114633.717968 
+292127.528272  9114624.731540 
+292150.233290  9114603.658808 
+292164.052103  9114590.613549 
+292217.085532  9114504.276737 
+292054.178100  9114384.580256 
+Region 1
+44
+292764.000571  9114000.539757 
+292776.615802  9113959.366835 
+292753.717111  9113954.322185 
+292734.749473  9113943.254230 
+292682.569927  9113876.905881 
+292657.990095  9113779.444181 
+292608.418682  9113796.472952 
+292600.317573  9113776.374802 
+292505.001183  9113790.345583 
+292397.579270  9113646.595349 
+292382.520530  9113626.490354 
+292250.168331  9113471.665575 
+292091.984156  9113586.025627 
+292010.948538  9113649.230714 
+291972.235961  9113656.224295 
+291785.630575  9113691.198614 
+291771.752241  9113696.207509 
+291773.926419  9113721.322642 
+291765.271213  9113760.490357 
+291746.862511  9113824.761432 
+291749.349593  9113892.066697 
+291763.645209  9113943.311295 
+291771.820539  9113973.454939 
+291789.001289  9114011.643609 
+291885.782269  9114060.960297 
+291891.775951  9114064.984263 
+291886.970052  9114087.078951 
+291874.254493  9114248.793971 
+292054.178100  9114384.580256 
+292217.085532  9114504.276737 
+292246.569206  9114459.102178 
+292281.015279  9114412.927922 
+292315.379171  9114355.703896 
+292335.094566  9114333.623698 
+292362.784185  9114314.564789 
+292374.652224  9114306.540186 
+292472.615641  9114247.368782 
+292539.944748  9114212.275949 
+292577.514199  9114185.190387 
+292622.841171  9114131.994914 
+292653.482564  9114108.920678 
+292687.083431  9114082.835741 
+292725.579397  9114046.710365 
+292764.000571  9114000.539757 
+Region 1
+64
+292186.025248  9113400.282055 
+292140.124073  9113376.128630 
+292112.211150  9113365.051543 
+292085.284744  9113352.970887 
+292048.470916  9113347.912118 
+292036.528476  9113345.891339 
+291968.976368  9113350.847449 
+291931.272884  9113359.850969 
+291894.253585  9113193.064304 
+291892.220973  9113187.035182 
+291813.832302  9113205.039062 
+291736.169446  9113186.880823 
+291655.517301  9113167.714949 
+291651.712674  9113190.815140 
+291639.911700  9113207.880270 
+291592.581193  9113259.063803 
+291481.949467  9113352.374205 
+291420.811757  9113284.005832 
+291320.052245  9113368.285078 
+291342.120311  9113395.429211 
+291275.911309  9113447.598208 
+291239.357605  9113477.697322 
+291177.131665  9113530.874734 
+291105.077373  9113599.110084 
+291068.590326  9113638.249889 
+291016.340859  9113696.459798 
+290989.793412  9113735.609552 
+291034.827056  9113776.840222 
+291065.878200  9113809.016105 
+291076.878852  9113818.067839 
+291100.037721  9113858.271959 
+291130.176793  9113901.496610 
+291160.345676  9113948.739346 
+291199.557147  9114009.049867 
+291215.721189  9114044.224282 
+291223.948288  9114081.399812 
+291223.229568  9114118.566415 
+291219.447068  9114144.680219 
+291222.562933  9114162.764725 
+291227.629569  9114175.828565 
+291343.318644  9114228.178874 
+291372.877644  9114193.050004 
+291411.203785  9114133.821323 
+291451.391244  9114057.517622 
+291459.231416  9114042.457590 
+291473.887988  9114008.318425 
+291562.545671  9114034.523854 
+291566.484352  9114029.505153 
+291576.304987  9114013.442551 
+291675.680429  9114010.527276 
+291771.820539  9113973.454939 
+291763.645209  9113943.311295 
+291749.349593  9113892.066697 
+291746.862511  9113824.761432 
+291765.271213  9113760.490357 
+291773.926419  9113721.322642 
+291771.752241  9113696.207509 
+291785.630575  9113691.198614 
+291972.235961  9113656.224295 
+292010.948538  9113649.230714 
+292091.984156  9113586.025627 
+292250.168331  9113471.665575 
+292219.042250  9113429.445396 
+292186.025248  9113400.282055 
+Region 1
+152
+292203.630249  9113093.921479 
+292197.614333  9113086.883954 
+292170.509186  9113050.694713 
+292164.493281  9113043.657180 
+292140.429680  9113015.507039 
+292068.711409  9112860.740679 
+292065.684851  9112854.710587 
+292055.715545  9112850.682689 
+291989.596633  9112646.700164 
+291855.801047  9112698.802781 
+291764.588581  9112729.852438 
+291737.826390  9112739.871067 
+291587.184999  9112798.987937 
+291437.529629  9112857.100860 
+291353.281502  9112889.161308 
+291281.298338  9112698.229939 
+291266.136369  9112664.060955 
+291257.175953  9112662.042913 
+291009.288596  9112608.553542 
+290901.763761  9112584.336234 
+290929.617634  9112721.984260 
+290943.014276  9112786.287354 
+290845.940787  9112831.392772 
+290829.095500  9112838.407389 
+290845.280919  9112876.595715 
+290866.443587  9112915.793589 
+290840.778871  9112939.876214 
+290834.103294  9112978.041397 
+290830.313073  9113003.150680 
+290834.400285  9113018.222685 
+290797.030701  9113072.429207 
+290763.154346  9113061.345129 
+290739.135963  9113039.221238 
+290730.116087  9113029.166842 
+290724.159743  9113030.165327 
+290632.819196  9113044.135972 
+290563.316048  9113054.110566 
+290535.448007  9113049.059571 
+290525.530637  9113052.063052 
+290482.723488  9113042.978702 
+290448.951008  9113045.957845 
+290418.078832  9113037.890129 
+290422.217833  9113059.993944 
+290401.745050  9113114.217499 
+290377.815747  9113104.147797 
+290309.269257  9113109.100375 
+290306.391154  9113123.160815 
+290217.831874  9113110.011290 
+290201.386565  9113171.270637 
+290175.023781  9113235.533407 
+290156.056860  9113224.464150 
+290143.031522  9113210.387395 
+290084.209578  9113186.218325 
+290060.591430  9113218.338971 
+290034.926045  9113242.421278 
+289996.368653  9113270.508429 
+289966.675469  9113287.554864 
+289939.919732  9113298.577135 
+289919.357404  9113340.746184 
+289909.706529  9113379.912886 
+289890.493631  9113470.300738 
+289890.826929  9113515.504904 
+289891.086169  9113550.663700 
+289908.465263  9113615.975995 
+289931.697177  9113666.226351 
+289968.726321  9113700.418393 
+289993.724014  9113720.534639 
+290011.771276  9113741.648265 
+290029.892668  9113772.807240 
+290031.932510  9113779.841031 
+290038.133567  9113811.992302 
+290041.137747  9113815.008967 
+290162.788691  9114001.975669 
+290205.878632  9114049.232453 
+290282.497148  9114060.360350 
+290287.474496  9114061.369946 
+290337.151527  9114058.406925 
+290451.407882  9114051.491322 
+290460.353745  9114051.500399 
+290501.181350  9114061.587062 
+290512.181995  9114070.638944 
+290553.988755  9114078.717493 
+290607.738191  9114088.817127 
+290683.385010  9114102.956901 
+290721.230712  9114113.040333 
+290763.030074  9114120.114139 
+290802.886053  9114133.213093 
+290826.830859  9114145.291480 
+290854.766478  9114159.382911 
+290858.757282  9114161.395970 
+290880.706709  9114172.467792 
+290914.702900  9114199.624074 
+290942.787251  9114233.806057 
+290957.905209  9114261.947875 
+290967.993773  9114282.048456 
+290971.102129  9114299.128468 
+290979.366313  9114341.326729 
+290981.614536  9114376.487296 
+291070.064679  9114374.566735 
+291094.869766  9114368.564382 
+291117.701744  9114364.569093 
+291159.337653  9114349.542808 
+291186.063718  9114334.501628 
+291218.909938  9114340.561499 
+291223.857551  9114337.552862 
+291271.427530  9114318.514312 
+291309.820872  9114268.326426 
+291343.318644  9114228.178874 
+291227.629569  9114175.828565 
+291222.562933  9114162.764725 
+291219.447068  9114144.680219 
+291223.229568  9114118.566415 
+291223.948288  9114081.399812 
+291215.721189  9114044.224282 
+291199.557147  9114009.049867 
+291160.345676  9113948.739346 
+291130.176793  9113901.496610 
+291100.037721  9113858.271959 
+291076.878852  9113818.067839 
+291065.878200  9113809.016105 
+291034.827056  9113776.840222 
+290989.793412  9113735.609552 
+291016.340859  9113696.459798 
+291068.590326  9113638.249889 
+291105.077373  9113599.110084 
+291177.131665  9113530.874734 
+291239.357605  9113477.697322 
+291275.911309  9113447.598208 
+291342.120311  9113395.429211 
+291320.052245  9113368.285078 
+291420.811757  9113284.005832 
+291481.949467  9113352.374205 
+291592.581193  9113259.063803 
+291639.911700  9113207.880270 
+291651.712674  9113190.815140 
+291655.517301  9113167.714949 
+291736.169446  9113186.880823 
+291813.832302  9113205.039062 
+291892.220973  9113187.035182 
+291894.253585  9113193.064304 
+291931.272884  9113359.850969 
+291968.976368  9113350.847449 
+292036.528476  9113345.891339 
+292048.470916  9113347.912118 
+292085.284744  9113352.970887 
+292112.211150  9113365.051543 
+292140.124073  9113376.128630 
+292186.025248  9113400.282055 
+292219.042250  9113429.445396 
+292346.023145  9113396.420478 
+292315.711991  9113330.092764 
+292203.630249  9113093.921479 
+Region 1
+84
+290901.763761  9112584.336234 
+290874.051186  9112465.774254 
+290835.398545  9112480.802931 
+290725.686079  9112564.067115 
+290631.676109  9112485.618438 
+290618.695427  9112477.569002 
+290580.546962  9112560.905780 
+290527.748646  9112679.386035 
+290507.098078  9112709.500759 
+290448.617841  9112731.540632 
+290384.151550  9112750.560738 
+290292.966919  9112785.625831 
+290066.936927  9112865.755925 
+290047.131775  9112875.780821 
+290011.475070  9112892.821082 
+290002.559037  9112896.830009 
+289969.876774  9112912.868781 
+289958.972807  9112916.875651 
+289927.269663  9112930.906350 
+289890.589274  9112943.927361 
+289850.919563  9112955.940727 
+289792.334892  9112963.916370 
+289740.811544  9112985.962685 
+289737.844449  9112987.968672 
+289712.119749  9113004.014502 
+289706.185554  9113008.026473 
+289700.251357  9113012.038444 
+289693.323193  9113016.049383 
+289704.360419  9113030.124254 
+289717.474388  9113056.255639 
+289752.588880  9113100.491343 
+289766.615452  9113115.573813 
+289801.796668  9113168.850295 
+289837.029803  9113229.158490 
+289853.125837  9113255.292880 
+289869.845621  9113231.201423 
+289879.652032  9113213.130008 
+289887.470498  9113195.056542 
+289908.358657  9113197.087145 
+289943.073506  9113187.077637 
+289961.944095  9113185.088020 
+289978.804523  9113180.082739 
+289980.562849  9113148.944148 
+290004.403253  9113146.959636 
+290029.319105  9113156.026035 
+289939.919732  9113298.577135 
+289966.675469  9113287.554864 
+289996.368653  9113270.508429 
+290034.926045  9113242.421278 
+290060.591430  9113218.338971 
+290084.209578  9113186.218325 
+290143.031522  9113210.387395 
+290156.056860  9113224.464150 
+290175.023781  9113235.533407 
+290201.386565  9113171.270637 
+290217.831874  9113110.011290 
+290306.391154  9113123.160815 
+290309.269257  9113109.100375 
+290377.815747  9113104.147797 
+290401.745050  9113114.217499 
+290422.217833  9113059.993944 
+290418.078832  9113037.890129 
+290448.951008  9113045.957845 
+290482.723488  9113042.978702 
+290525.530637  9113052.063052 
+290535.448007  9113049.059571 
+290563.316048  9113054.110566 
+290632.819196  9113044.135972 
+290724.159743  9113030.165327 
+290730.116087  9113029.166842 
+290739.135963  9113039.221238 
+290763.154346  9113061.345129 
+290797.030701  9113072.429207 
+290834.400285  9113018.222685 
+290830.313073  9113003.150680 
+290834.103294  9112978.041397 
+290840.778871  9112939.876214 
+290866.443587  9112915.793589 
+290845.280919  9112876.595715 
+290829.095500  9112838.407389 
+290845.940787  9112831.392772 
+290943.014276  9112786.287354 
+290929.617634  9112721.984260 
+290901.763761  9112584.336234 
+Region 1
+104
+282859.930695  9118541.597145 
+282848.907977  9118529.529603 
+282837.834309  9118510.430045 
+282831.753102  9118494.349961 
+282824.648662  9118474.250430 
+282817.529673  9118452.141749 
+282811.346588  9118421.997631 
+282802.173875  9118390.845476 
+282791.861510  9118339.600692 
+282823.728609  9118210.048781 
+282232.132869  9118058.673124 
+282223.265719  9118069.712962 
+282220.377793  9118082.768958 
+282216.510275  9118097.832941 
+282211.670430  9118115.909487 
+282209.820199  9118134.994113 
+282204.000759  9118155.078647 
+282199.168171  9118174.159771 
+282184.532388  9118212.316182 
+282180.701175  9118232.403052 
+282173.880335  9118251.481842 
+282171.028713  9118269.560726 
+282164.236921  9118292.657825 
+282163.315433  9118302.702428 
+282159.433369  9118315.757260 
+282149.622883  9118333.827971 
+282128.906087  9118355.904142 
+282111.142592  9118373.965505 
+282094.344157  9118388.009723 
+282077.589285  9118408.081403 
+282061.792215  9118423.131361 
+282054.949526  9118439.196418 
+282036.199106  9118458.261175 
+282015.445895  9118475.314432 
+282005.591760  9118487.357666 
+281992.784281  9118503.415700 
+281989.976160  9118527.522060 
+282022.884043  9118541.624754 
+282056.749757  9118550.705700 
+282074.731217  9118562.781661 
+282087.785624  9118580.879239 
+282094.947906  9118609.015578 
+282105.157967  9118646.196611 
+282106.362760  9118675.330517 
+282111.587673  9118710.496553 
+282117.799467  9118744.659175 
+282127.030002  9118783.848176 
+282138.190701  9118815.002886 
+282158.393091  9118859.227573 
+282173.552182  9118893.400651 
+282187.789842  9118937.618322 
+282205.039023  9118985.857776 
+282225.263395  9119033.096124 
+282241.394952  9119064.256585 
+282256.539665  9119096.420448 
+282270.668453  9119125.569412 
+282291.741701  9119152.717337 
+282315.775581  9119176.854998 
+282343.720596  9119191.956094 
+282376.592690  9119201.035507 
+282398.500149  9119206.083858 
+282413.492273  9119217.151549 
+282431.459551  9119227.218128 
+282446.408038  9119232.258353 
+282467.314096  9119236.300935 
+282480.274306  9119241.338835 
+282488.227432  9119241.348080 
+282503.117715  9119238.351687 
+282528.914432  9119231.349693 
+282552.759244  9119229.368250 
+282580.580612  9119227.391410 
+282615.331836  9119221.404328 
+282649.110744  9119218.429791 
+282670.952691  9119214.436837 
+282696.778468  9119211.453053 
+282719.680068  9119216.502391 
+282736.631400  9119223.553962 
+282751.565331  9119226.584933 
+282753.407975  9119206.495766 
+282751.237659  9119181.379131 
+282752.115294  9119165.307107 
+282751.033781  9119153.251076 
+282748.899882  9119133.157306 
+282754.726361  9119114.077314 
+282756.576293  9119094.992720 
+282759.442204  9119078.922997 
+282761.284854  9119058.833830 
+282763.193034  9119047.785824 
+282764.085236  9119033.722947 
+282763.018293  9119023.676062 
+282761.871263  9119002.578870 
+282758.765092  9118985.497669 
+282781.477267  9118964.428096 
+282803.173445  9118940.343647 
+282811.989573  9118922.271681 
+282823.729839  9118896.166581 
+282835.506503  9118875.084345 
+282844.278921  9118850.984941 
+282854.981338  9118818.851252 
+282862.788740  9118798.768991 
+282870.632545  9118783.709594 
+282953.156106  9118648.188800 
+282877.985091  9118563.718469 
+282859.930695  9118541.597145 
+Region 1
+1416
+289305.633672  9120285.437156 
+289241.828346  9119992.050112 
+289200.436938  9119772.016161 
+289147.643972  9119623.292161 
+289109.333159  9119550.927067 
+289068.203442  9119500.658727 
+289026.064868  9119448.380238 
+288977.969159  9119397.100146 
+288973.050548  9119404.126854 
+288909.924626  9119336.758826 
+288835.856298  9119268.374939 
+288771.707008  9119196.987443 
+288701.548824  9119119.566440 
+288640.367456  9119046.172636 
+288576.107680  9118959.716588 
+288460.630678  9118802.890074 
+288330.050658  9118619.929483 
+288286.845737  9118557.603430 
+288256.519771  9118489.263485 
+288132.504225  9118117.455846 
+288104.181878  9118051.126827 
+288073.054785  9118008.903722 
+288043.967658  9117973.714477 
+288001.964892  9117939.516202 
+287946.074587  9117909.321448 
+287854.353068  9117873.061702 
+287775.569489  9117838.824450 
+287771.578393  9117836.811166 
+287706.763730  9117809.620260 
+287650.851570  9117776.411415 
+287647.854564  9117774.399169 
+287573.812889  9117709.025768 
+287504.690175  9117636.625630 
+287416.658083  9117561.191612 
+287399.685017  9117551.128156 
+287302.772909  9117484.725256 
+287296.778962  9117480.700700 
+287211.862360  9117423.351200 
+287137.866041  9117364.004094 
+287069.804884  9117300.645013 
+287031.669200  9117251.381511 
+287014.571126  9117224.240498 
+287005.388831  9117192.085262 
+286997.149083  9117152.899232 
+286996.957638  9117126.780906 
+287000.705661  9117095.644099 
+287010.307653  9117049.445438 
+287019.961176  9117010.278636 
+287039.525907  9116967.104314 
+287053.155667  9116927.941787 
+287051.844986  9116884.745034 
+287031.625017  9116838.514320 
+287012.472777  9116802.330167 
+286982.378524  9116765.129672 
+286943.300966  9116722.896744 
+286910.209926  9116683.683855 
+286904.194048  9116676.645557 
+286875.108751  9116641.455125 
+286860.065411  9116623.357084 
+286837.003395  9116596.209471 
+286812.954705  9116570.065317 
+286797.904060  9116550.962691 
+286771.845236  9116521.802694 
+286744.762973  9116488.623386 
+286718.726281  9116462.476999 
+286690.686801  9116434.319327 
+286673.611383  9116410.191713 
+286655.497821  9116380.035690 
+286635.344720  9116342.845619 
+286615.213708  9116308.669191 
+286590.974226  9116256.406454 
+286572.787311  9116216.204830 
+286559.622131  9116183.040482 
+286532.268406  9116112.692459 
+286507.035120  9116060.428541 
+286484.813432  9116012.186068 
+286468.688297  9115982.032068 
+286466.670821  9115978.011678 
+286437.557000  9115938.802548 
+286409.466652  9115903.612693 
+286386.390636  9115874.455581 
+286379.366230  9115865.406968 
+286355.303552  9115837.253297 
+286336.211131  9115809.105054 
+286311.139787  9115778.941145 
+286299.336034  9115796.005501 
+286285.558863  9115815.076786 
+286279.690009  9115828.129463 
+286260.957270  9115849.204402 
+286244.175910  9115865.258742 
+286225.428462  9115884.324562 
+286203.662160  9115898.364322 
+286181.859152  9115907.381295 
+286143.245360  9115928.434351 
+286122.436369  9115937.452395 
+286103.608130  9115945.468063 
+286088.748744  9115952.483546 
+286072.917312  9115962.511600 
+286055.090436  9115971.532903 
+286034.259393  9115977.537245 
+286011.469582  9115987.557615 
+285982.730121  9115999.580511 
+285953.983306  9116010.598836 
+285924.242422  9116021.616049 
+285895.502905  9116033.638901 
+285870.702919  9116040.643344 
+285840.983978  9116054.674185 
+285810.248969  9116065.690237 
+285779.528601  9116078.715388 
+285756.723997  9116086.726539 
+285733.912053  9116093.733122 
+285695.209879  9116102.731180 
+285652.480166  9116104.692885 
+285619.647033  9116100.638236 
+285598.786523  9116102.624170 
+285586.865183  9116103.615476 
+285560.040332  9116105.594765 
+285542.140003  9116104.570311 
+285524.239672  9116103.545849 
+285508.305479  9116099.509914 
+285485.361629  9116088.434307 
+285455.386166  9116067.305334 
+285442.316988  9116047.199734 
+285404.447706  9116034.098332 
+285360.643392  9116025.008476 
+285333.730702  9116014.932896 
+285303.843175  9116005.858523 
+285260.009613  9115992.750315 
+285220.159603  9115980.651072 
+285184.322409  9115973.579053 
+285141.512204  9115964.490076 
+285093.717102  9115953.386349 
+285037.026710  9115949.304447 
+284957.334120  9115926.110046 
+284872.715161  9115908.937259 
+284800.894716  9115874.701315 
+284745.987894  9115842.493476 
+284727.992633  9115828.409338 
+284712.986851  9115815.333131 
+284672.939820  9115776.110097 
+284646.941057  9115754.984952 
+284616.907685  9115725.818758 
+284580.895436  9115694.636633 
+284544.905136  9115666.468162 
+284509.879731  9115634.282521 
+284488.887868  9115618.185727 
+284474.883569  9115606.115103 
+284460.879277  9115594.044472 
+284424.867232  9115562.862171 
+284388.833344  9115528.666130 
+284362.834844  9115507.540754 
+284325.806997  9115473.343505 
+284300.809898  9115453.223781 
+284278.751202  9115427.080047 
+284251.744174  9115403.944309 
+284225.723928  9115379.805120 
+284194.660564  9115345.614542 
+284175.635157  9115326.506117 
+284159.504421  9115295.346292 
+284141.196096  9115238.065417 
+284134.940264  9115197.875868 
+284131.732179  9115166.730847 
+284116.486273  9115120.503608 
+284101.349723  9115089.344874 
+284085.233731  9115060.194122 
+284066.128357  9115030.035360 
+284040.130305  9115008.909690 
+284013.167377  9114991.801126 
+283987.264068  9114983.734804 
+283963.377979  9114979.689032 
+283933.534936  9114976.640936 
+283894.781946  9114978.605337 
+283878.891869  9114980.596112 
+283845.072657  9114977.543364 
+283833.144173  9114977.529580 
+283800.362680  9114980.505364 
+283769.561979  9114982.478856 
+283716.797747  9114971.367592 
+283691.873945  9114961.293097 
+283667.900529  9114945.192316 
+283633.007238  9114931.087972 
+283615.034474  9114920.016929 
+283600.058389  9114910.958480 
+283569.126745  9114894.849551 
+283559.135424  9114887.806003 
+283540.168651  9114876.733765 
+283527.173397  9114866.673026 
+283502.176945  9114846.552689 
+283504.245028  9114857.605287 
+283726.238849  9116136.669639 
+283721.501649  9116168.810136 
+283721.749359  9116202.965497 
+283734.006045  9116248.184854 
+283730.510667  9116314.481853 
+283724.604537  9116322.511544 
+283707.887493  9116347.606327 
+283691.141289  9116368.682830 
+283668.437923  9116390.757031 
+283644.704037  9116407.807232 
+283630.889007  9116421.855172 
+283624.003344  9116431.892851 
+283623.103974  9116444.951113 
+283626.202755  9116461.027668 
+283626.297461  9116474.087075 
+283625.376238  9116484.131628 
+283622.496007  9116498.192170 
+283608.702803  9116515.253821 
+283598.842184  9116526.292633 
+283578.097717  9116544.350828 
+283552.513963  9116580.485549 
+283539.714788  9116597.548337 
+283530.921051  9116618.633992 
+283532.126364  9116647.767677 
+283537.431834  9116693.983640 
+283547.664020  9116734.177907 
+283560.893046  9116776.384743 
+283574.486412  9116868.820065 
+283580.735084  9116908.005157 
+283597.984293  9116956.243953 
+283634.991364  9116987.427903 
+283685.959424  9117024.655205 
+283700.943612  9117034.718013 
+283708.925461  9117038.745415 
+283720.934689  9117049.809360 
+283728.960287  9117059.864172 
+283737.987266  9117070.924690 
+283745.011493  9117079.973788 
+283749.053462  9117089.019466 
+283757.115532  9117104.097113 
+283761.230425  9117123.188477 
+283766.302951  9117137.258134 
+283769.394597  9117152.330081 
+283771.477573  9117165.391752 
+283776.666791  9117195.534504 
+283776.776180  9117210.603034 
+283781.848727  9117224.672686 
+283781.928949  9117235.722940 
+283779.048780  9117249.783487 
+283777.169994  9117264.849740 
+283773.303025  9117279.913718 
+283765.547206  9117307.027968 
+283760.642383  9117316.063396 
+283746.870950  9117336.138836 
+283741.001200  9117349.191401 
+283735.138740  9117363.248534 
+283732.309606  9117384.341064 
+283734.421771  9117401.421010 
+283734.516578  9117414.480404 
+283735.569016  9117422.518093 
+283736.657920  9117435.578625 
+283737.768705  9117451.652862 
+283737.921864  9117472.748806 
+283738.981600  9117481.791062 
+283741.079194  9117496.861868 
+283741.166717  9117508.916693 
+283745.259801  9117524.994341 
+283745.391091  9117543.076577 
+283746.545655  9117565.178224 
+283744.644989  9117577.230774 
+283741.786695  9117594.305030 
+283735.931517  9117609.366738 
+283731.026671  9117618.402171 
+283727.108628  9117626.434173 
+283719.265245  9117641.493607 
+283715.354492  9117650.530177 
+283710.500696  9117666.597591 
+283705.625015  9117679.651299 
+283705.676072  9117686.683281 
+283705.778187  9117700.747244 
+283707.868504  9117714.813482 
+283708.957429  9117727.874013 
+283713.006776  9117737.924248 
+283719.058918  9117749.985893 
+283729.065586  9117759.038376 
+283738.056272  9117765.076014 
+283748.998687  9117766.093079 
+283762.930703  9117768.118116 
+283771.906801  9117772.146609 
+283780.897493  9117778.184236 
+283785.904483  9117783.212753 
+283793.937559  9117794.272083 
+283800.947350  9117801.312004 
+283813.980134  9117816.395273 
+283823.994131  9117826.452295 
+283834.037323  9117840.527586 
+283843.049929  9117849.578899 
+283855.059446  9117860.642745 
+283863.077957  9117869.692920 
+283869.130160  9117881.754530 
+283872.185457  9117891.803606 
+283874.239354  9117900.846981 
+283876.285953  9117908.885788 
+283875.364838  9117918.930333 
+283872.433617  9117925.958911 
+283870.496499  9117932.988621 
+283865.613561  9117945.037772 
+283855.752796  9117956.076694 
+283849.875747  9117968.124713 
+283845.014697  9117983.187568 
+283840.175541  9118001.264127 
+283834.320381  9118016.325850 
+283822.544365  9118037.408184 
+283731.774132  9117995.113129 
+283697.695369  9118093.521121 
+283687.768868  9118095.518905 
+283671.877709  9118097.509872 
+283657.996652  9118102.516813 
+283498.246360  9118006.900632 
+283453.209956  9118102.282319 
+283348.434736  9118047.915629 
+283328.494232  9118039.856196 
+283301.431601  9118146.308678 
+283167.109810  9118130.080944 
+283145.217473  9118127.041998 
+283079.576878  9118122.947950 
+283042.841923  9118266.558119 
+282823.728609  9118210.048781 
+282791.861510  9118339.600692 
+282802.173875  9118390.845476 
+282811.346588  9118421.997631 
+282817.529673  9118452.141749 
+282824.648662  9118474.250430 
+282831.753102  9118494.349961 
+282837.834309  9118510.430045 
+282848.907977  9118529.529603 
+282859.930695  9118541.597145 
+282877.985091  9118563.718469 
+282953.156106  9118648.188800 
+282870.632545  9118783.709594 
+282862.788740  9118798.768991 
+282854.981338  9118818.851252 
+282844.278921  9118850.984941 
+282835.506503  9118875.084345 
+282823.729839  9118896.166581 
+282811.989573  9118922.271681 
+282803.173445  9118940.343647 
+282781.477267  9118964.428096 
+282758.765092  9118985.497669 
+282761.871263  9119002.578870 
+282763.018293  9119023.676062 
+282764.085236  9119033.722947 
+282763.193034  9119047.785824 
+282761.284854  9119058.833830 
+282759.442204  9119078.922997 
+282756.576293  9119094.992720 
+282754.726361  9119114.077314 
+282748.899882  9119133.157306 
+282751.033781  9119153.251076 
+282752.115294  9119165.307107 
+282751.237659  9119181.379131 
+282753.407975  9119206.495766 
+282751.565331  9119226.584933 
+282736.631400  9119223.553962 
+282719.680068  9119216.502391 
+282696.778468  9119211.453053 
+282670.952691  9119214.436837 
+282649.110744  9119218.429791 
+282615.331836  9119221.404328 
+282580.580612  9119227.391410 
+282552.759244  9119229.368250 
+282528.914432  9119231.349693 
+282503.117715  9119238.351687 
+282488.227432  9119241.348080 
+282480.274306  9119241.338835 
+282467.314096  9119236.300935 
+282446.408038  9119232.258353 
+282431.459551  9119227.218128 
+282413.492273  9119217.151549 
+282398.500149  9119206.083858 
+282376.592690  9119201.035507 
+282343.720596  9119191.956094 
+282315.775581  9119176.854998 
+282291.741701  9119152.717337 
+282270.668453  9119125.569412 
+282256.539665  9119096.420448 
+282241.394952  9119064.256585 
+282225.263395  9119033.096124 
+282205.039023  9118985.857776 
+282187.789842  9118937.618322 
+282173.552182  9118893.400651 
+282158.393091  9118859.227573 
+282138.190701  9118815.002886 
+282127.030002  9118783.848176 
+282117.799467  9118744.659175 
+282111.587673  9118710.496553 
+282106.362760  9118675.330517 
+282105.157967  9118646.196611 
+282094.947906  9118609.015578 
+282087.785624  9118580.879239 
+282074.731217  9118562.781661 
+282056.749757  9118550.705700 
+282022.884043  9118541.624754 
+281989.976160  9118527.522060 
+281975.056979  9118526.499926 
+281957.155414  9118525.474275 
+281940.240716  9118523.445209 
+281919.378543  9118525.429763 
+281895.497686  9118522.387899 
+281892.420938  9118509.324861 
+281881.412945  9118499.266177 
+281875.433661  9118497.249983 
+281863.496867  9118496.231328 
+281852.575975  9118498.227580 
+281839.724885  9118508.258112 
+281830.901105  9118525.325389 
+281824.101865  9118547.417908 
+281823.180309  9118557.462523 
+281818.238691  9118561.474970 
+281798.406896  9118568.483543 
+281792.507428  9118577.517708 
+281786.622472  9118588.561032 
+281781.789699  9118607.642162 
+281772.965884  9118624.709438 
+281757.146861  9118636.745594 
+281740.384489  9118655.812627 
+281730.566520  9118672.878725 
+281726.648038  9118680.910659 
+281714.841794  9118697.974406 
+281703.971630  9118707.002691 
+281676.172167  9118711.992667 
+281662.297824  9118718.003678 
+281654.431809  9118730.049223 
+281654.482592  9118737.081281 
+281672.478582  9118751.166568 
+281644.686341  9118757.161111 
+281650.781737  9118775.250605 
+281638.815841  9118770.213589 
+281603.012464  9118768.162058 
+281590.959531  9118751.070067 
+281577.977750  9118743.018114 
+281566.991496  9118735.973092 
+281540.258639  9118751.009975 
+281536.383630  9118765.069384 
+281534.504144  9118780.135732 
+281534.663697  9118802.236500 
+281539.851961  9118832.379803 
+281529.867075  9118826.340536 
+281514.911506  9118820.295371 
+281500.942826  9118813.246799 
+281489.963811  9118807.206341 
+281479.057311  9118811.211686 
+281472.185367  9118823.258395 
+281475.247544  9118834.312322 
+281481.299387  9118846.374368 
+281483.352927  9118855.417953 
+281479.441641  9118864.454461 
+281470.537907  9118870.471328 
+281457.672119  9118878.492636 
+281440.735509  9118873.449669 
+281419.829598  9118869.406553 
+281401.942354  9118870.389876 
+281372.103694  9118868.345268 
+281354.223693  9118870.333153 
+281333.390266  9118876.335810 
+281316.540637  9118883.347772 
+281293.755155  9118894.370956 
+281272.979682  9118908.410243 
+281259.105202  9118914.421159 
+281245.172742  9118912.395416 
+281233.177839  9118903.339963 
+281225.195731  9118899.312157 
+281215.268821  9118901.309471 
+281196.452610  9118911.332772 
+281184.559149  9118916.341456 
+281171.671544  9118921.348952 
+281158.812915  9118930.374774 
+281158.878121  9118939.416015 
+281158.936081  9118947.452675 
+281159.037513  9118961.516828 
+281159.109965  9118971.562652 
+281158.144804  9118975.579795 
+281145.220954  9118975.564376 
+281137.325774  9118983.591545 
+281125.454019  9118991.613968 
+281120.526772  9118997.635530 
+281107.617402  9118999.629267 
+281101.616323  9118994.599232 
+281089.672119  9118992.575819 
+281070.805132  9118995.567004 
+281066.828559  9118995.562253 
+281051.923653  9118996.549016 
+281040.015662  9118999.548505 
+281031.075613  9119000.542392 
+281011.250680  9119008.555281 
+280991.461946  9119021.591080 
+280984.575354  9119031.628587 
+280977.667034  9119038.652344 
+280967.790761  9119047.681698 
+280961.847616  9119050.688310 
+280950.004769  9119062.729032 
+280948.088890  9119072.772487 
+280947.138192  9119078.798798 
+280950.185800  9119087.843620 
+280940.244341  9119087.831720 
+280929.330459  9119090.832378 
+280908.518555  9119099.848630 
+280897.698790  9119115.908871 
+280892.836660  9119130.971673 
+280892.930784  9119144.031263 
+280889.977303  9119148.046025 
+280882.074805  9119155.068584 
+280874.165063  9119161.086559 
+280869.201564  9119162.085187 
+280849.419959  9119176.125534 
+280834.543930  9119181.130577 
+280827.606608  9119184.135986 
+280810.771230  9119193.156976 
+280801.860083  9119198.169165 
+280784.045021  9119209.198124 
+280776.193161  9119223.252762 
+280775.249679  9119230.283660 
+280769.436782  9119251.372775 
+280763.580453  9119266.434384 
+280760.742765  9119286.522494 
+280754.908146  9119304.597857 
+280750.024247  9119316.646906 
+280744.160669  9119330.703931 
+280738.246422  9119337.728864 
+280729.385905  9119349.773140 
+280725.503387  9119362.827967 
+280730.604439  9119380.916456 
+280736.743081  9119405.033643 
+280724.726375  9119392.964312 
+280712.760341  9119387.927069 
+280703.798482  9119385.907158 
+280698.813239  9119383.892020 
+280681.890914  9119380.857968 
+280665.969981  9119378.829688 
+280657.000887  9119375.805182 
+280644.040707  9119370.766723 
+280636.036825  9119363.725066 
+280620.050775  9119352.655502 
+280602.163248  9119353.638562 
+280585.291576  9119357.636568 
+280563.485303  9119366.651512 
+280553.594402  9119373.671641 
+280537.760273  9119383.698343 
+280538.862938  9119398.768325 
+280537.941124  9119408.812985 
+280536.039623  9119420.865618 
+280524.203799  9119433.910866 
+280515.292566  9119438.923018 
+280506.345163  9119438.912240 
+280492.419747  9119437.890884 
+280478.508795  9119438.878696 
+280458.640138  9119440.863898 
+280443.720561  9119439.841329 
+280429.838533  9119444.847472 
+280407.001858  9119448.838227 
+280393.105357  9119451.835187 
+280384.150715  9119450.819799 
+280369.209439  9119446.783447 
+280360.247566  9119444.763467 
+280348.310453  9119443.744469 
+280336.380570  9119443.730054 
+280323.456529  9119443.714434 
+280316.504659  9119444.710609 
+280301.621219  9119448.710928 
+280298.631518  9119447.702735 
+280289.669645  9119445.682740 
+280282.659943  9119438.642214 
+280268.662230  9119427.574917 
+280262.653919  9119421.540176 
+280246.675131  9119411.475051 
+280231.704960  9119403.420297 
+280212.787075  9119399.379070 
+280206.771547  9119392.339732 
+280205.712350  9119383.297239 
+280194.661008  9119367.210587 
+280186.671628  9119362.178009 
+280178.653347  9119353.127078 
+280169.669816  9119348.093291 
+280155.701057  9119341.044297 
+280143.691712  9119329.979359 
+280130.680994  9119317.908621 
+280098.810228  9119309.833296 
+280041.141987  9119308.758650 
+280015.272272  9119305.713455 
+279994.387779  9119304.683470 
+279956.588192  9119301.623724 
+279936.640090  9119292.558210 
+279908.644894  9119270.423333 
+279880.584755  9119239.247127 
+279840.638107  9119214.083873 
+279815.654331  9119195.970914 
+279796.743747  9119192.934073 
+279771.882667  9119191.899115 
+279735.098945  9119191.854144 
+279695.361607  9119195.823855 
+279660.573389  9119196.785849 
+279631.786161  9119202.778080 
+279609.972438  9119210.788006 
+279589.188921  9119223.822098 
+279575.378911  9119238.873899 
+279562.627956  9119262.968239 
+279554.790085  9119279.031944 
+279545.950840  9119294.089839 
+279539.121541  9119312.163947 
+279525.318703  9119328.220335 
+279514.556025  9119352.317112 
+279505.760023  9119373.402554 
+279488.873724  9119375.390997 
+279470.128891  9119395.459642 
+279462.254920  9119406.500386 
+279433.575658  9119427.561409 
+279413.894294  9119455.665557 
+279409.060466  9119474.746697 
+279409.240710  9119499.861496 
+279391.439493  9119512.899207 
+279373.551756  9119513.881807 
+279360.649253  9119516.879696 
+279346.839086  9119531.931467 
+279341.998020  9119550.008017 
+279340.225951  9119580.143341 
+279333.490264  9119611.277147 
+279328.764534  9119645.427175 
+279332.878173  9119664.519318 
+279330.075900  9119689.630460 
+279315.358024  9119716.736123 
+279291.001210  9119786.022446 
+279271.420567  9119828.190885 
+279720.674826  9120919.716068 
+279649.006272  9120907.574044 
+279606.299319  9120913.549604 
+279587.496316  9120925.581707 
+279552.894523  9120952.663298 
+279513.292830  9120975.720456 
+279489.424932  9120974.686796 
+279451.732153  9120986.695835 
+279420.018960  9121000.721308 
+279404.111824  9121000.701899 
+279362.276194  9120989.600417 
+279338.364970  9120982.539129 
+279308.495791  9120976.475125 
+279282.610615  9120971.420557 
+279247.835395  9120974.391759 
+279217.123522  9120989.422913 
+279196.353598  9121004.466231 
+279171.686217  9121030.555188 
+279151.917669  9121046.604304 
+279133.172156  9121066.673005 
+279118.324086  9121075.696057 
+279099.484786  9121082.705042 
+279080.573360  9121079.668090 
+279070.602518  9121075.637518 
+279053.643436  9121067.580027 
+279030.762427  9121065.542764 
+279019.891127  9121074.570672 
+279001.080643  9121085.597994 
+278990.504947  9121135.814234 
+278979.741775  9121159.911043 
+278967.011819  9121187.019189 
+278949.202690  9121199.052319 
+278927.272553  9121190.988678 
+278922.114105  9121164.863123 
+278921.011771  9121149.792991 
+278905.111748  9121150.778016 
+278898.109084  9121144.741888 
+278884.197464  9121145.729352 
+278869.392549  9121160.779906 
+278857.555817  9121173.824942 
+278845.661420  9121178.833222 
+278805.842852  9121171.752067 
+278792.954243  9121176.759109 
+278779.971954  9121168.706417 
+278753.157290  9121172.691689 
+278738.265854  9121175.687075 
+278721.422031  9121183.702977 
+278707.589630  9121195.740937 
+278696.703814  9121202.759601 
+278681.884400  9121215.800924 
+278667.951127  9121213.774543 
+278654.940026  9121201.703431 
+278643.946152  9121193.653153 
+278629.991276  9121188.612971 
+278606.231201  9121202.647807 
+278731.220286  9121440.889096 
+278718.410863  9121456.946682 
+278845.440395  9121702.221921 
+278871.311599  9121705.267456 
+279570.061479  9123062.304523 
+279592.777067  9123041.235707 
+279594.678730  9123029.183032 
+279608.489554  9123014.130966 
+279620.311892  9122999.076502 
+279638.135826  9122989.052167 
+279653.013217  9122984.047180 
+279663.942596  9122983.055758 
+279674.871974  9122982.064333 
+279703.871306  9123005.204564 
+279727.711303  9123002.219492 
+279750.491915  9122990.191919 
+279762.386573  9122985.183315 
+279785.254026  9122985.210787 
+279803.077904  9122975.186398 
+279806.975223  9122964.140704 
+279811.874016  9122954.100792 
+279818.761279  9122944.063268 
+279829.582048  9122928.002990 
+279853.443699  9122928.031628 
+279891.202920  9122925.063185 
+279902.146747  9122926.080885 
+279919.005297  9122920.073621 
+279932.859413  9122911.049015 
+279939.746641  9122901.011480 
+279954.479115  9122875.914665 
+279968.246309  9122854.835007 
+279979.110454  9122844.802234 
+279990.976070  9122835.775238 
+280000.874942  9122829.759620 
+280012.726064  9122818.723445 
+280019.598777  9122806.676732 
+280022.509047  9122796.634433 
+280032.320994  9122778.563768 
+280035.216774  9122766.512296 
+280036.116851  9122753.453856 
+280034.012509  9122737.378086 
+280029.926952  9122722.304521 
+280022.858711  9122707.227384 
+280022.822500  9122702.204449 
+280049.456664  9122673.103568 
+280089.008515  9122643.013557 
+280105.823467  9122630.978736 
+280117.674517  9122619.942552 
+280133.495226  9122607.906536 
+280150.360862  9122602.903808 
+280169.214945  9122597.903452 
+280188.076268  9122593.907674 
+280214.913131  9122592.935144 
+280244.790637  9122600.002844 
+280269.689771  9122606.060009 
+280303.580428  9122618.155336 
+280318.530061  9122623.196034 
+280341.404512  9122624.227858 
+280357.312129  9122624.246801 
+280380.193826  9122626.283190 
+280390.121586  9122624.285851 
+280403.982749  9122616.265732 
+280412.822029  9122601.207604 
+280414.759729  9122594.177875 
+280412.706030  9122585.134246 
+280403.642011  9122569.050242 
+280396.595446  9122556.986941 
+280393.525781  9122544.928372 
+280398.359165  9122525.847174 
+280402.270817  9122516.810643 
+280409.092643  9122497.731812 
+280412.997041  9122487.690697 
+280419.876857  9122476.648545 
+280430.726309  9122464.606541 
+280451.597723  9122463.626794 
+280465.538583  9122466.657101 
+280476.467774  9122465.665520 
+280491.315845  9122456.641987 
+280498.217389  9122448.613583 
+280508.116096  9122442.597892 
+280525.975821  9122437.596232 
+280541.897861  9122439.624295 
+280554.837238  9122441.648810 
+280568.734574  9122438.651582 
+280561.637235  9122419.556223 
+280559.576273  9122409.508021 
+280556.455825  9122390.417381 
+280554.213574  9122355.254574 
+280554.191819  9122352.240822 
+280556.035225  9122332.151500 
+280566.841098  9122314.081976 
+280580.673128  9122302.043497 
+280586.587671  9122295.018492 
+280597.437038  9122282.976469 
+280604.316784  9122271.934308 
+280614.142915  9122255.872767 
+280623.947283  9122236.797475 
+280631.719698  9122211.692319 
+280637.510930  9122187.589388 
+280636.407928  9122172.519452 
+280636.320900  9122160.464446 
+280629.259869  9122146.392011 
+280616.204553  9122128.294153 
+280608.149321  9122114.220531 
+280609.970966  9122091.117462 
+280612.837584  9122075.047661 
+280611.727351  9122058.973137 
+280610.609870  9122041.894028 
+280618.447547  9122025.830134 
+280629.340366  9122019.815624 
+280651.162254  9122012.809515 
+280673.978343  9122005.804579 
+280693.811791  9121998.796093 
+280718.630789  9121993.802664 
+280733.551198  9121994.824934 
+280753.457165  9121997.862258 
+280773.392150  9122004.917905 
+280795.308305  9122010.971314 
+280811.280968  9122020.031397 
+280826.252169  9122028.085714 
+280857.043668  9122024.103852 
+280874.823345  9122008.051697 
+280882.697198  9121997.010696 
+280885.600002  9121985.963815 
+280893.415796  9121966.886154 
+280902.218536  9121946.805085 
+280912.051763  9121931.748104 
+280922.929992  9121923.724374 
+280937.785048  9121915.705342 
+280950.673456  9121910.697703 
+280957.618391  9121908.696761 
+280970.463245  9121897.661626 
+280977.299303  9121880.591951 
+280977.146883  9121859.495729 
+280976.029292  9121842.416660 
+280972.908777  9121823.326077 
+280969.817297  9121808.253822 
+280966.682276  9121787.154073 
+280972.509611  9121768.074063 
+280972.473324  9121763.051152 
+281004.186236  9121749.024594 
+281036.973172  9121746.049591 
+281061.806474  9121743.065182 
+281086.654289  9121742.089922 
+281102.641396  9121753.159077 
+281128.483413  9121752.184966 
+281141.400789  9121751.195614 
+281160.297902  9121752.222448 
+281178.258907  9121761.284750 
+281194.209725  9121767.330961 
+281215.138822  9121774.387595 
+281228.077986  9121776.411960 
+281242.018615  9121779.442070 
+281267.889680  9121782.486199 
+281281.830311  9121785.516297 
+281292.810128  9121791.556627 
+281302.861129  9121806.637008 
+281308.971648  9121826.735617 
+281308.144544  9121849.839794 
+281305.263645  9121863.900415 
+281310.372709  9121882.993273 
+281312.462836  9121897.059729 
+281320.467337  9121904.101124 
+281333.341141  9121897.084229 
+281344.190199  9121885.042099 
+281355.031986  9121871.995387 
+281365.881033  9121859.953255 
+281379.749020  9121852.937517 
+281391.635862  9121846.924025 
+281406.534379  9121844.932345 
+281423.435836  9121844.952149 
+281443.341705  9121847.989178 
+281464.249047  9121852.031940 
+281493.175439  9121865.125211 
+281514.126407  9121875.195422 
+281537.065789  9121885.267945 
+281554.990536  9121889.307174 
+281587.617461  9121864.231031 
+281597.479501  9121853.192277 
+281614.242777  9121834.125018 
+281636.956704  9121813.055562 
+281658.756408  9121803.035301 
+281675.614187  9121797.027546 
+281681.521208  9121788.997878 
+281686.375841  9121772.930425 
+281685.301638  9121761.878907 
+281687.064576  9121730.739304 
+281705.787080  9121707.656039 
+281717.717465  9121707.669950 
+281756.440291  9121700.683093 
+281776.375179  9121707.738298 
+281810.185196  9121708.782228 
+281837.108583  9121719.863812 
+281854.046336  9121724.906354 
+281878.966786  9121733.976441 
+281899.939559  9121747.060200 
+281915.926793  9121758.129021 
+281935.934501  9121775.229911 
+281953.961104  9121793.333058 
+281973.917884  9121803.401888 
+281998.874789  9121817.494775 
+282010.834305  9121821.526908 
+282030.798386  9121832.600283 
+282049.790120  9121846.686224 
+282076.699054  9121855.758479 
+282095.661678  9121865.826092 
+282123.564827  9121874.899465 
+282155.386512  9121875.940809 
+282174.312733  9121880.985507 
+282189.225732  9121881.002728 
+282209.058733  9121873.993655 
+282222.977528  9121874.009718 
+282246.838316  9121874.037245 
+282268.710702  9121874.062467 
+282288.594687  9121874.085387 
+282308.456809  9121871.094574 
+282334.233104  9121861.078602 
+282348.086292  9121852.053459 
+282357.984546  9121846.037458 
+282373.745947  9121825.964281 
+282394.471032  9121804.892248 
+282414.245636  9121789.846510 
+282429.049244  9121774.795050 
+282449.861757  9121765.777890 
+282470.659679  9121754.751574 
+282498.467992  9121750.765260 
+282522.277641  9121743.760644 
+282551.050962  9121735.757149 
+282578.837367  9121728.757072 
+282607.617953  9121721.758119 
+282625.491567  9121718.764911 
+282649.359516  9121719.796820 
+282663.300112  9121722.826479 
+282671.312019  9121730.872167 
+282685.340156  9121745.956688 
+282698.374108  9121761.040065 
+282716.386339  9121777.133694 
+282736.423453  9121798.252447 
+282751.475016  9121817.356362 
+282764.487120  9121829.425993 
+282780.408845  9121831.453305 
+282788.362410  9121831.462387 
+282801.367228  9121842.527432 
+282812.420153  9121858.613063 
+282831.390162  9121869.684902 
+282846.339599  9121874.724768 
+282861.252542  9121874.741770 
+282874.177091  9121874.756501 
+282886.056343  9121867.738097 
+282891.919318  9121853.680895 
+282894.690206  9121824.551724 
+282899.558981  9121810.493390 
+282904.427754  9121796.435055 
+282910.298019  9121783.382425 
+282913.178401  9121769.321826 
+282914.106895  9121760.281817 
+282936.863835  9121745.239298 
+282955.731596  9121742.247096 
+282976.587739  9121739.257150 
+282991.464119  9121734.251267 
+283010.280754  9121724.227049 
+283029.090078  9121713.198255 
+283035.991001  9121705.169603 
+283044.887607  9121698.147782 
+283058.777074  9121694.145322 
+283082.637659  9121694.172436 
+283099.546209  9121695.196204 
+283129.364630  9121694.225498 
+283149.255748  9121695.252632 
+283161.186036  9121695.266167 
+283184.132778  9121706.342368 
+283197.093786  9121711.379868 
+283218.044854  9121721.449224 
+283248.959760  9121734.543534 
+283272.849572  9121738.588821 
+283294.736387  9121740.622706 
+283319.671553  9121751.701074 
+283331.645698  9121757.741975 
+283346.675514  9121773.831930 
+283358.708146  9121787.909371 
+283368.796263  9121808.011974 
+283384.834924  9121826.112169 
+283403.826930  9121840.197447 
+283474.473080  9121848.313579 
+283525.352410  9121872.480306 
+283549.366633  9121893.603074 
+283564.352675  9121903.665522 
+283592.329072  9121922.783596 
+283613.302239  9121935.866427 
+283623.310021  9121944.918697 
+283637.301899  9121954.979996 
+283655.321779  9121972.077721 
+283664.306112  9121977.110595 
+283675.293470  9121984.154831 
+283694.270977  9121996.230815 
+283708.218971  9122000.264684 
+283726.158382  9122006.312137 
+283760.019544  9122014.386526 
+283785.919837  9122021.447422 
+283805.847648  9122027.497064 
+283834.715890  9122032.552132 
+283852.669962  9122040.608660 
+283869.629846  9122048.664069 
+283884.564730  9122051.694421 
+283900.501134  9122055.730443 
+283915.421373  9122056.751653 
+283958.208349  9122061.822165 
+283979.123052  9122066.868265 
+284002.048123  9122074.930264 
+284020.981769  9122080.978692 
+284032.005822  9122093.045647 
+284038.117520  9122113.143584 
+284040.186503  9122124.196011 
+284043.220376  9122131.231283 
+284062.234649  9122148.329899 
+284081.256264  9122166.433068 
+284089.283111  9122176.487555 
+284112.494068  9122223.727492 
+284120.579567  9122241.818484 
+284125.726457  9122265.933548 
+284134.820829  9122286.034766 
+284146.890477  9122305.134725 
+284170.912515  9122327.261602 
+284183.903079  9122336.317008 
+284207.807843  9122342.370836 
+284227.699154  9122343.397426 
+284242.590140  9122340.400250 
+284260.500383  9122342.429188 
+284273.461631  9122347.466309 
+284293.396940  9122354.520251 
+284331.249835  9122364.607653 
+284350.198290  9122372.665030 
+284364.168421  9122379.712345 
+284387.071675  9122384.760407 
+284398.015199  9122385.777040 
+284425.860104  9122386.812316 
+284453.682993  9122384.833888 
+284474.517136  9122378.829525 
+284498.333866  9122372.828439 
+284524.153660  9122368.838656 
+284547.985051  9122364.846672 
+284572.788613  9122357.842084 
+284597.584824  9122349.832923 
+284622.395704  9122343.832873 
+284653.157072  9122335.830241 
+284681.988767  9122335.861898 
+284704.891993  9122340.909798 
+284725.843544  9122350.978309 
+284738.819500  9122358.024407 
+284763.755193  9122369.101817 
+284784.670043  9122374.147492 
+284808.560139  9122378.191860 
+284837.421219  9122382.241654 
+284844.402632  9122385.262948 
+284867.386692  9122401.360918 
+284885.385088  9122415.444320 
+284897.425659  9122430.525755 
+284909.502976  9122450.629986 
+284915.651857  9122475.750496 
+284921.727266  9122490.825406 
+284933.819312  9122512.938742 
+284943.952369  9122539.068142 
+284948.024703  9122552.131755 
+284964.100933  9122575.253972 
+284990.111834  9122597.382453 
+285011.122353  9122615.487263 
+285030.195945  9122640.621809 
+285044.372071  9122675.796524 
+285044.467645  9122688.855791 
+285048.488566  9122694.887471 
+285054.542005  9122706.948667 
+285062.576501  9122718.007465 
+285070.611001  9122729.066260 
+285088.646360  9122748.172328 
+285099.656129  9122758.229797 
+285114.613300  9122764.273346 
+285135.623947  9122782.378067 
+285148.636851  9122794.446794 
+285165.655997  9122810.538063 
+285182.689868  9122828.638438 
+285191.696554  9122836.684603 
+285211.713059  9122854.788196 
+285222.818518  9122877.904875 
+285226.905694  9122892.977551 
+285236.980181  9122911.070357 
+285260.973563  9122929.178220 
+285276.917652  9122934.218214 
+285296.875362  9122944.285290 
+285310.831045  9122949.323121 
+285333.734586  9122954.370613 
+285352.639224  9122956.400127 
+285371.529141  9122956.420519 
+285385.448026  9122956.435540 
+285427.256206  9122963.512473 
+285446.138756  9122962.528277 
+285459.033981  9122958.523977 
+285478.837101  9122947.495273 
+285484.736065  9122938.460689 
+285494.619210  9122930.434943 
+285512.433898  9122919.404088 
+285523.318602  9122912.383965 
+285550.073746  9122900.358172 
+285573.912544  9122897.370165 
+285589.849263  9122901.405489 
+285620.772697  9122915.502386 
+285636.775719  9122928.578693 
+285649.759304  9122936.629013 
+285668.730219  9122947.699394 
+285689.674817  9122956.762787 
+285697.665291  9122961.794092 
+285713.646243  9122971.856697 
+285728.632997  9122981.918229 
+285754.526533  9122987.973246 
+285771.435382  9122988.995895 
+285796.275756  9122987.013383 
+285817.117196  9122982.012942 
+285834.953905  9122973.995640 
+285849.785881  9122962.961482 
+285858.637887  9122949.911836 
+285866.503057  9122937.865683 
+285872.320847  9122917.780969 
+285873.167623  9122897.690944 
+285883.985903  9122881.629760 
+285891.851058  9122869.583606 
+285904.709330  9122860.556425 
+285917.574968  9122852.533795 
+285935.448467  9122849.539240 
+285953.344079  9122849.558341 
+285972.226517  9122848.573942 
+285996.035713  9122841.567513 
+286001.971419  9122837.555658 
+286025.721608  9122822.512788 
+286042.549256  9122812.485262 
+286061.402169  9122807.482616 
+286084.246622  9122804.493304 
+286096.221263  9122810.533322 
+286123.094140  9122814.580095 
+286141.026604  9122819.621891 
+286160.984355  9122829.688556 
+286181.892046  9122833.728950 
+286199.750738  9122828.725193 
+286216.556200  9122815.683954 
+286237.301550  9122797.624169 
+286249.128621  9122783.573095 
+286269.881323  9122766.517855 
+286290.685666  9122756.494473 
+286316.460980  9122746.476353 
+286331.359166  9122744.483051 
+286346.190923  9122733.448778 
+286368.887664  9122710.368302 
+286380.699909  9122694.308105 
+286385.560164  9122679.245092 
+286401.371318  9122666.202758 
+286411.261588  9122659.181418 
+286422.175577  9122656.179334 
+286436.020470  9122646.148543 
+286454.836323  9122636.123006 
+286480.648432  9122631.127574 
+286497.557098  9122632.149983 
+286513.471569  9122633.171336 
+286530.402385  9122637.207385 
+286539.394428  9122643.244136 
+286557.393290  9122657.326731 
+286570.487662  9122680.445030 
+286585.511352  9122695.529014 
+286594.569886  9122710.606703 
+286613.555599  9122723.685763 
+286625.567186  9122734.748383 
+286644.493818  9122739.791023 
+286658.434704  9122742.819323 
+286683.208298  9122731.795421 
+286703.010908  9122720.766282 
+286713.895319  9122713.745931 
+286728.778667  9122709.743407 
+286741.636679  9122700.716040 
+286750.495746  9122688.670845 
+286783.141530  9122666.605212 
+286832.718100  9122648.575494 
+286842.652625  9122647.581373 
+286852.542801  9122640.559955 
+286869.421877  9122637.564028 
+286879.319438  9122631.547155 
+286898.149928  9122623.530558 
+286914.977244  9122613.502774 
+286931.789767  9122601.465889 
+286946.628686  9122591.436015 
+286964.391020  9122573.372870 
+286981.159151  9122555.308682 
+286996.947869  9122539.252548 
+287009.813164  9122531.229678 
+287025.616651  9122517.182635 
+287044.417480  9122505.147802 
+287061.252109  9122496.124531 
+287076.090962  9122486.094630 
+287093.949345  9122481.090579 
+287109.856329  9122481.107187 
+287124.791315  9122484.136394 
+287136.721552  9122484.148842 
+287157.577274  9122481.156976 
+287167.489547  9122477.149152 
+287177.372228  9122469.123137 
+287188.212104  9122456.075419 
+287200.083147  9122448.051473 
+287219.848481  9122431.999433 
+287231.667724  9122416.943651 
+287251.484823  9122407.923433 
+287267.376971  9122405.930897 
+287282.274932  9122403.937322 
+287294.227337  9122406.963375 
+287305.148560  9122404.965656 
+287327.035402  9122406.997491 
+287345.917491  9122406.012576 
+287362.811211  9122405.025588 
+287380.684308  9122402.030534 
+287409.523024  9122403.065008 
+287426.394528  9122399.064359 
+287438.258100  9122390.035819 
+287447.161327  9122384.017822 
+287456.027538  9122372.977094 
+287461.933407  9122364.946911 
+287466.815480  9122352.897513 
+287470.681160  9122337.833446 
+287488.420954  9122316.756533 
+287495.283975  9122303.704650 
+287513.119994  9122295.686826 
+287520.079256  9122295.694036 
+287539.948052  9122293.705537 
+287566.783508  9122292.728778 
+287593.633771  9122293.761095 
+287640.382437  9122296.823034 
+287660.295658  9122300.861754 
+287685.202000  9122307.919230 
+287710.086123  9122311.963056 
+287727.009401  9122314.994122 
+287753.881885  9122319.039974 
+287764.817860  9122319.051244 
+287783.736908  9122323.088880 
+287799.680830  9122328.127982 
+287814.652807  9122336.179686 
+287821.619475  9122337.191392 
+287840.590409  9122348.260810 
+287849.567672  9122352.288188 
+287867.588909  9122369.383831 
+287877.597419  9122378.434942 
+287892.673199  9122400.550224 
+287899.699178  9122409.598264 
+287909.744769  9122423.672082 
+287917.831658  9122441.762030 
+287926.838600  9122449.807560 
+287929.843385  9122452.824250 
+287937.863563  9122461.873301 
+287946.870512  9122469.918825 
+287956.849402  9122474.951737 
+287965.848942  9122481.992713 
+287972.860120  9122489.031649 
+287983.803537  9122490.047399 
+287998.723683  9122491.067221 
+288004.755516  9122500.114218 
+288008.828650  9122513.177349 
+288013.895970  9122526.241497 
+288018.963294  9122539.305643 
+288026.953839  9122544.336498 
+288030.952820  9122547.354197 
+288034.951802  9122550.371895 
+288046.956168  9122560.429528 
+288052.936102  9122562.444715 
+288078.725523  9122554.434806 
+288096.531799  9122542.398588 
+288107.363953  9122528.346170 
+288110.138794  9122500.222031 
+288099.128619  9122490.165429 
+288091.093574  9122479.107331 
+288087.072345  9122473.076010 
+288093.007762  9122469.063939 
+288107.890805  9122465.061015 
+288119.731959  9122453.018699 
+288128.508968  9122429.923369 
+288130.400894  9122416.866351 
+288133.383433  9122416.869399 
+288139.355929  9122417.880036 
+288159.313707  9122427.945768 
+288168.253906  9122426.950363 
+288184.027235  9122408.884845 
+288187.900084  9122394.825316 
+288194.792563  9122385.791541 
+288206.663351  9122377.767381 
+288212.621002  9122376.768925 
+288221.605706  9122381.800763 
+288230.620091  9122390.850766 
+288240.636080  9122400.906321 
+288258.605503  9122410.969979 
+288270.550491  9122412.991219 
+288277.517164  9122414.002850 
+288288.475396  9122417.027614 
+288299.411362  9122417.038750 
+288310.317641  9122413.031719 
+288322.121609  9122395.966660 
+288325.029922  9122385.924283 
+288333.858768  9122369.860730 
+288340.714099  9122355.804235 
+288356.799078  9122379.929406 
+288363.780590  9122382.950107 
+288382.536347  9122364.887576 
+288386.431400  9122353.841668 
+288394.340275  9122347.822508 
+288402.323383  9122351.848755 
+288409.379130  9122364.914858 
+288423.282760  9122362.919916 
+288433.135438  9122350.875526 
+288439.041103  9122342.845258 
+288447.988691  9122342.854344 
+288457.997277  9122351.905302 
+288473.941227  9122356.944149 
+288484.877168  9122356.955244 
+288498.758511  9122351.946660 
+288515.600099  9122343.927476 
+288522.433087  9122326.857347 
+288524.302622  9122310.786720 
+288523.152502  9122289.690367 
+288520.036314  9122271.605618 
+288529.918651  9122263.579377 
+288539.875245  9122265.598537 
+288557.852072  9122276.666615 
+288570.768912  9122275.675170 
+288586.579146  9122262.632262 
+288591.579725  9122266.655455 
+288596.647151  9122279.719507 
+288604.697103  9122292.786576 
+288614.846831  9122320.923750 
+288632.801408  9122328.978170 
+288636.852395  9122339.027588 
+288636.896967  9122345.054826 
+288642.943737  9122356.110793 
+288641.074247  9122372.181415 
+288641.215398  9122391.267667 
+288643.344904  9122410.355928 
+288652.389077  9122423.423984 
+288666.411573  9122437.501598 
+288683.364597  9122444.550441 
+288700.302765  9122449.590198 
+288710.214815  9122445.582075 
+288719.088100  9122435.545711 
+288726.959773  9122424.503805 
+288739.765168  9122408.444218 
+288744.661736  9122398.403841 
+288753.572162  9122393.390170 
+288765.517136  9122395.411277 
+288776.453070  9122395.422300 
+288788.427773  9122401.461556 
+288794.377963  9122399.458488 
+288807.265084  9122394.448814 
+288818.104388  9122381.400826 
+288830.961768  9122372.372993 
+288838.870569  9122366.353769 
+288858.694595  9122358.337474 
+288868.524834  9122343.279402 
+288877.435232  9122338.265712 
+288887.391840  9122340.284789 
+288904.240756  9122333.270017 
+288902.118590  9122315.186331 
+288900.011296  9122299.111720 
+288902.845131  9122279.023956 
+288919.649416  9122265.981955 
+288932.566220  9122264.990410 
+288940.482423  9122259.975714 
+288958.295730  9122248.943778 
+288978.179162  9122248.963751 
+288994.071035  9122246.970647 
+289001.022798  9122245.973095 
+289016.907230  9122242.975447 
+289035.789045  9122241.989859 
+289049.640506  9122232.962981 
+289050.471062  9122210.864155 
+289054.351062  9122197.809157 
+289064.181205  9122182.751065 
+289074.093152  9122178.742884 
+289085.029016  9122178.753846 
+289102.924065  9122178.771778 
+289116.849874  9122179.790258 
+289126.724621  9122170.759381 
+289132.600373  9122158.710910 
+289143.372579  9122136.622047 
+289166.030154  9122108.517903 
+289184.807746  9122093.468754 
+289204.646449  9122087.461424 
+289213.534432  9122079.434080 
+289224.433064  9122074.422331 
+289237.334907  9122071.421641 
+289259.109835  9122058.384525 
+289280.832662  9122038.315647 
+289301.546421  9122016.236698 
+289320.346250  9122004.201120 
+289335.251274  9122003.211465 
+289354.177608  9122008.252987 
+289376.954070  9121996.221356 
+289385.864330  9121991.207596 
+289409.642380  9121980.181480 
+289416.407990  9121954.070487 
+289411.273421  9121931.965752 
+289406.101645  9121904.838336 
+289393.970749  9121877.703979 
+289392.879834  9121864.644024 
+289400.795909  9121859.629275 
+289413.638127  9121848.592268 
+289419.469117  9121830.516572 
+289421.293693  9121808.418771 
+289427.132121  9121791.347612 
+289432.948217  9121771.262847 
+289431.812645  9121752.175680 
+289417.738137  9121731.066553 
+289404.717336  9121717.994696 
+289400.651403  9121705.936300 
+289401.571142  9121695.891934 
+289402.416465  9121675.802211 
+289401.251151  9121652.696895 
+289394.195319  9121639.630983 
+289380.187841  9121627.562654 
+289366.187811  9121616.498856 
+289363.108618  9121603.436908 
+289374.867349  9121580.344500 
+289386.618630  9121556.247555 
+289396.456001  9121542.193983 
+289410.232776  9121523.121702 
+289421.064287  9121509.069121 
+289430.961170  9121503.051832 
+289441.852203  9121497.035533 
+289456.719842  9121491.023201 
+289468.582694  9121481.994283 
+289476.468932  9121472.961397 
+289481.395039  9121466.939142 
+289479.235566  9121443.832843 
+289479.138819  9121430.773882 
+289479.064400  9121420.728527 
+289489.888427  9121405.671404 
+289496.825154  9121402.664739 
+289514.734746  9121404.691653 
+289528.667736  9121406.714597 
+289539.536401  9121397.684678 
+289546.465679  9121393.673471 
+289305.633672  9120285.437156 
+Region 1
+165
+284875.115311  9113367.414495 
+284866.089074  9113356.354074 
+284844.053326  9113333.224117 
+284824.027478  9113313.110110 
+284802.978478  9113288.976694 
+284783.946666  9113268.863796 
+284755.917854  9113241.708691 
+284748.901542  9113233.664204 
+284739.889947  9113224.612873 
+284717.868910  9113203.491953 
+284689.891206  9113183.368746 
+284664.866356  9113159.230673 
+284640.857393  9113138.107418 
+284613.851891  9113114.971588 
+284589.872123  9113097.866559 
+284568.859782  9113078.755808 
+284545.866755  9113060.647323 
+284522.895602  9113045.552521 
+284502.855452  9113023.429171 
+284487.814426  9113005.329799 
+284471.772135  9112986.224707 
+284455.700726  9112963.101338 
+284445.636986  9112946.012239 
+284436.487138  9112917.874045 
+284425.385734  9112894.756388 
+284414.160553  9112854.561083 
+284403.980359  9112821.398888 
+284394.837861  9112794.265239 
+284388.713747  9112772.157868 
+284376.596589  9112746.025332 
+284368.702922  9112754.052681 
+284360.867494  9112770.116569 
+284350.013692  9112781.154172 
+284333.159550  9112787.162039 
+284314.295584  9112790.153897 
+284295.468008  9112798.168587 
+284277.648971  9112808.193558 
+284275.733775  9112818.236936 
+284277.881885  9112840.339733 
+284276.967959  9112851.388830 
+284265.032784  9112850.370455 
+284243.143140  9112847.331430 
+284236.250700  9112856.364485 
+284224.439242  9112872.423760 
+284211.611951  9112885.468177 
+284182.924430  9112904.521569 
+284166.113867  9112916.556801 
+284149.281466  9112925.578323 
+284119.519860  9112933.580278 
+284112.649209  9112945.627029 
+284096.730750  9112943.599432 
+284073.839781  9112939.554610 
+284046.029760  9112942.535986 
+284017.225736  9112945.516189 
+283994.334763  9112941.471326 
+283967.475084  9112938.426393 
+283940.579047  9112930.358594 
+283905.701973  9112918.263232 
+283868.851463  9112908.174660 
+283835.998749  9112901.104406 
+283823.164044  9112913.144171 
+283829.295206  9112936.256251 
+283818.353985  9112935.238921 
+283790.391275  9112917.124160 
+283775.452272  9112913.088463 
+283757.582158  9112916.081272 
+283744.711087  9112923.098166 
+283717.967667  9112936.126215 
+283695.069423  9112931.076621 
+283680.108618  9112924.027179 
+283645.326015  9112924.991026 
+283633.463443  9112934.018201 
+283606.661855  9112939.009620 
+283588.900663  9112957.070943 
+283549.278767  9112976.111193 
+283515.562722  9112987.121838 
+283487.650883  9112976.038875 
+283455.842935  9112976.001516 
+283435.933921  9112971.959866 
+283412.056175  9112968.918103 
+283391.189464  9112969.898126 
+283360.469871  9112982.921318 
+283348.599952  9112990.943862 
+283353.606244  9112995.972577 
+283411.012051  9113099.510212 
+283515.899051  9113308.582556 
+283618.748309  9113510.620082 
+283620.758132  9113513.636118 
+283626.787601  9113522.684227 
+283623.900058  9113535.740170 
+283481.268407  9114017.763773 
+283404.419332  9114249.728105 
+283405.449696  9114254.752128 
+284215.242663  9114620.346581 
+284258.262932  9114658.569238 
+284300.121575  9114673.685656 
+284314.059881  9114676.715318 
+284335.899403  9114672.722124 
+284310.983019  9114663.652528 
+284291.073243  9114659.611454 
+284275.132303  9114654.570367 
+284264.132364  9114645.516712 
+284258.102583  9114636.468759 
+284251.832292  9114594.270086 
+284241.709799  9114569.144484 
+284234.583981  9114546.031440 
+284222.517180  9114526.930948 
+284215.456964  9114512.859003 
+284208.338461  9114490.750516 
+284208.251023  9114478.695705 
+284211.116520  9114462.626054 
+284243.722656  9114435.540453 
+284285.238541  9114403.442280 
+284319.796193  9114371.336093 
+284366.318524  9114344.266414 
+284414.879868  9114324.230945 
+284439.642949  9114312.204632 
+284458.405428  9114295.148645 
+284469.179264  9114273.060713 
+284475.019442  9114255.989920 
+284479.902053  9114243.940819 
+284509.525796  9114216.851684 
+284523.369156  9114206.821956 
+284535.188011  9114191.767120 
+284547.014150  9114177.716848 
+284576.506540  9114132.545507 
+284601.181947  9114108.464353 
+284633.736524  9114074.346627 
+284729.959090  9114047.333476 
+284735.915885  9114046.335716 
+284745.834147  9114043.333361 
+284774.521945  9114024.279504 
+284786.340667  9114009.224633 
+284793.233094  9114000.191483 
+284803.041888  9113982.120651 
+284806.944972  9113972.079537 
+284812.763112  9113951.995045 
+284815.570025  9113927.888896 
+284814.415485  9113905.787344 
+284811.214556  9113875.647010 
+284810.067323  9113854.550021 
+284811.916715  9113835.465562 
+284816.726248  9113813.370810 
+284821.550372  9113793.285187 
+284833.317960  9113771.198369 
+284836.168652  9113753.119609 
+284840.941693  9113726.002036 
+284841.782482  9113704.907317 
+284840.598779  9113678.787508 
+284838.377301  9113646.639177 
+284833.217589  9113620.514830 
+284830.118849  9113604.438395 
+284829.081073  9113598.409873 
+284827.955756  9113580.326576 
+284828.789269  9113558.227290 
+284837.560221  9113534.127952 
+284844.394227  9113517.058296 
+284850.168571  9113490.946426 
+284848.926541  9113456.790098 
+284849.723584  9113429.667991 
+284860.511696  9113409.589183 
+284872.315685  9113392.525202 
+284883.184028  9113383.496601 
+284880.129078  9113373.447554 
+284875.115311  9113367.414495 
+Region 1
+398
+286425.865814  9114066.314045 
+286422.773798  9114051.242420 
+286419.667120  9114034.161684 
+286411.546423  9114011.048126 
+286397.417715  9113981.900642 
+286382.251035  9113946.724716 
+286362.107037  9113910.538727 
+286341.941085  9113871.339053 
+286312.733876  9113819.070225 
+286282.562057  9113770.818485 
+286257.367637  9113723.576778 
+286232.151298  9113673.321372 
+286207.951002  9113626.080713 
+286184.788712  9113584.868475 
+286158.666455  9113546.666570 
+286139.568130  9113517.513398 
+286114.432630  9113478.307996 
+286089.297179  9113439.102570 
+286062.166467  9113398.890344 
+286033.040502  9113357.671313 
+286008.950433  9113325.498823 
+285976.813321  9113280.258168 
+285944.705551  9113239.035708 
+285913.547931  9113191.786970 
+285892.410753  9113155.599478 
+285872.267602  9113119.413081 
+285862.093627  9113087.256048 
+285843.880000  9113043.035380 
+285834.604978  9112997.820175 
+285830.241403  9112944.574068 
+285822.786205  9112876.256216 
+285821.324198  9112811.963294 
+285816.704784  9112723.557589 
+285823.289729  9112672.332873 
+285794.369288  9112659.241183 
+285770.374890  9112640.127705 
+285750.414905  9112629.055167 
+285723.635959  9112637.061420 
+285707.900410  9112660.148385 
+285686.252128  9112690.260548 
+285672.577595  9112723.395352 
+285668.682068  9112734.441034 
+285638.906477  9112740.434773 
+285609.225873  9112759.487783 
+285615.533239  9112806.708862 
+285610.672944  9112821.771665 
+285598.818220  9112831.803814 
+285578.024941  9112842.830427 
+285574.063620  9112844.835061 
+285569.035241  9112836.792964 
+285561.076061  9112835.779425 
+285546.210140  9112841.789954 
+285538.324025  9112850.822021 
+285529.451229  9112860.857527 
+285522.559092  9112869.890716 
+285508.716363  9112879.920604 
+285493.843112  9112884.926559 
+285483.004244  9112897.973496 
+285469.095747  9112898.962323 
+285454.134822  9112891.913531 
+285442.177772  9112887.881791 
+285423.343171  9112894.892350 
+285417.481513  9112908.949462 
+285416.524048  9112913.971145 
+285418.599674  9112926.028135 
+285409.697618  9112932.045380 
+285389.759447  9112923.986379 
+285370.837178  9112918.942179 
+285363.915785  9112923.957105 
+285356.000404  9112928.970905 
+285339.109923  9112929.956317 
+285337.107343  9112927.944939 
+285322.182929  9112925.918911 
+285315.290737  9112934.952081 
+285311.380505  9112943.988632 
+285302.478427  9112950.005859 
+285285.529520  9112942.954754 
+285269.603809  9112939.923019 
+285254.730494  9112944.928907 
+285244.892823  9112958.981498 
+285231.013486  9112963.988508 
+285203.152603  9112959.938640 
+285180.268963  9112956.898966 
+285170.321776  9112955.883102 
+285146.429551  9112950.833154 
+285122.522732  9112943.774065 
+285105.522756  9112929.690942 
+285095.407738  9112905.570101 
+285084.342525  9112887.475503 
+285070.433993  9112888.464209 
+285053.594567  9112896.481457 
+285049.676984  9112904.513434 
+285054.734480  9112916.573863 
+285047.834930  9112924.602441 
+285035.958136  9112931.620789 
+285014.134150  9112937.623233 
+284987.332913  9112942.615433 
+284969.433807  9112941.590447 
+284957.505932  9112941.576829 
+284946.696045  9112958.641934 
+284943.779722  9112967.679606 
+284934.877573  9112973.696775 
+284915.984460  9112972.670635 
+284902.989651  9112962.610224 
+284893.999979  9112956.572611 
+284876.057105  9112949.520201 
+284854.116399  9112939.449540 
+284850.067519  9112929.399343 
+284847.992038  9112917.342291 
+284844.915278  9112904.279536 
+284835.852712  9112888.196258 
+284824.838631  9112877.133525 
+284812.764950  9112857.028565 
+284789.735542  9112833.897372 
+284770.733134  9112817.802678 
+284752.680993  9112795.681721 
+284735.673877  9112780.593852 
+284715.743114  9112773.539074 
+284692.837682  9112767.485426 
+284675.852454  9112755.411224 
+284654.891287  9112743.332442 
+284630.970027  9112734.263916 
+284613.092835  9112736.252466 
+284597.218183  9112740.252430 
+284585.334046  9112746.266098 
+284567.493265  9112753.277464 
+284549.528647  9112743.211193 
+284536.563106  9112737.168906 
+284523.597569  9112731.126615 
+284514.637116  9112729.107170 
+284484.817494  9112729.072784 
+284470.850692  9112722.024762 
+284456.913022  9112718.995003 
+284454.983302  9112727.029245 
+284453.068146  9112737.072621 
+284436.126663  9112731.025713 
+284419.214307  9112728.997067 
+284400.335818  9112729.979819 
+284383.503545  9112739.001401 
+284376.596589  9112746.025332 
+284388.713747  9112772.157868 
+284394.837861  9112794.265239 
+284403.980359  9112821.398888 
+284414.160553  9112854.561083 
+284425.385734  9112894.756388 
+284436.487138  9112917.874045 
+284445.636986  9112946.012239 
+284455.700726  9112963.101338 
+284471.772135  9112986.224707 
+284487.814426  9113005.329799 
+284502.855452  9113023.429171 
+284522.895602  9113045.552521 
+284545.866755  9113060.647323 
+284568.859782  9113078.755808 
+284589.872123  9113097.866559 
+284613.851891  9113114.971588 
+284640.857393  9113138.107418 
+284664.866356  9113159.230673 
+284689.891206  9113183.368746 
+284717.868910  9113203.491953 
+284739.889947  9113224.612873 
+284748.901542  9113233.664204 
+284755.917854  9113241.708691 
+284783.946666  9113268.863796 
+284802.978478  9113288.976694 
+284824.027478  9113313.110110 
+284844.053326  9113333.224117 
+284866.089074  9113356.354074 
+284875.115311  9113367.414495 
+284880.129078  9113373.447554 
+284883.184028  9113383.496601 
+284872.315685  9113392.525202 
+284860.511696  9113409.589183 
+284849.723584  9113429.667991 
+284848.926541  9113456.790098 
+284850.168571  9113490.946426 
+284844.394227  9113517.058296 
+284837.560221  9113534.127952 
+284828.789269  9113558.227290 
+284827.955756  9113580.326576 
+284829.081073  9113598.409873 
+284830.118849  9113604.438395 
+284833.217589  9113620.514830 
+284838.377301  9113646.639177 
+284840.598779  9113678.787508 
+284841.782482  9113704.907317 
+284840.941693  9113726.002036 
+284836.168652  9113753.119609 
+284833.317960  9113771.198369 
+284821.550372  9113793.285187 
+284816.726248  9113813.370810 
+284811.916715  9113835.465562 
+284810.067323  9113854.550021 
+284811.214556  9113875.647010 
+284814.415485  9113905.787344 
+284815.570025  9113927.888896 
+284812.763112  9113951.995045 
+284806.944972  9113972.079537 
+284803.041888  9113982.120651 
+284793.233094  9114000.191483 
+284786.340667  9114009.224633 
+284774.521945  9114024.279504 
+284745.834147  9114043.333361 
+284735.915885  9114046.335716 
+284729.959090  9114047.333476 
+284633.736524  9114074.346627 
+284601.181947  9114108.464353 
+284576.506540  9114132.545507 
+284547.014150  9114177.716848 
+284535.188011  9114191.767120 
+284523.369156  9114206.821956 
+284509.525796  9114216.851684 
+284479.902053  9114243.940819 
+284475.019442  9114255.989920 
+284469.179264  9114273.060713 
+284458.405428  9114295.148645 
+284439.642949  9114312.204632 
+284414.879868  9114324.230945 
+284366.318524  9114344.266414 
+284319.796193  9114371.336093 
+284285.238541  9114403.442280 
+284243.722656  9114435.540453 
+284211.116520  9114462.626054 
+284208.251023  9114478.695705 
+284208.338461  9114490.750516 
+284215.456964  9114512.859003 
+284222.517180  9114526.930948 
+284234.583981  9114546.031440 
+284241.709799  9114569.144484 
+284251.832292  9114594.270086 
+284258.102583  9114636.468759 
+284264.132364  9114645.516712 
+284275.132303  9114654.570367 
+284291.073243  9114659.611454 
+284310.983019  9114663.652528 
+284335.899403  9114672.722124 
+284314.059881  9114676.715318 
+284300.121575  9114673.685656 
+284258.262932  9114658.569238 
+284215.242663  9114620.346581 
+283405.449696  9114254.752128 
+283502.176945  9114846.552689 
+283527.173397  9114866.673026 
+283540.168651  9114876.733765 
+283559.135424  9114887.806003 
+283569.126745  9114894.849551 
+283600.058389  9114910.958480 
+283615.034474  9114920.016929 
+283633.007238  9114931.087972 
+283667.900529  9114945.192316 
+283691.873945  9114961.293097 
+283716.797747  9114971.367592 
+283769.561979  9114982.478856 
+283800.362680  9114980.505364 
+283833.144173  9114977.529580 
+283845.072657  9114977.543364 
+283878.891869  9114980.596112 
+283894.781946  9114978.605337 
+283933.534936  9114976.640936 
+283963.377979  9114979.689032 
+283987.264068  9114983.734804 
+284013.167377  9114991.801126 
+284040.130305  9115008.909690 
+284066.128357  9115030.035360 
+284085.233731  9115060.194122 
+284101.349723  9115089.344874 
+284116.486273  9115120.503608 
+284131.732179  9115166.730847 
+284134.940264  9115197.875868 
+284141.196096  9115238.065417 
+284159.504421  9115295.346292 
+284175.635157  9115326.506117 
+284194.660564  9115345.614542 
+284225.723928  9115379.805120 
+284251.744174  9115403.944309 
+284278.751202  9115427.080047 
+284300.809898  9115453.223781 
+284325.806997  9115473.343505 
+284362.834844  9115507.540754 
+284388.833344  9115528.666130 
+284424.867232  9115562.862171 
+284460.879277  9115594.044472 
+284474.883569  9115606.115103 
+284488.887868  9115618.185727 
+284509.879731  9115634.282521 
+284544.905136  9115666.468162 
+284580.895436  9115694.636633 
+284616.907685  9115725.818758 
+284646.941057  9115754.984952 
+284672.939820  9115776.110097 
+284712.986851  9115815.333131 
+284727.992633  9115828.409338 
+284745.987894  9115842.493476 
+284800.894716  9115874.701315 
+284872.715161  9115908.937259 
+284957.334120  9115926.110046 
+285037.026710  9115949.304447 
+285093.717102  9115953.386349 
+285141.512204  9115964.490076 
+285184.322409  9115973.579053 
+285220.159603  9115980.651072 
+285260.009613  9115992.750315 
+285303.843175  9116005.858523 
+285333.730702  9116014.932896 
+285360.643392  9116025.008476 
+285404.447706  9116034.098332 
+285442.316988  9116047.199734 
+285455.386166  9116067.305334 
+285485.361629  9116088.434307 
+285508.305479  9116099.509914 
+285524.239672  9116103.545849 
+285542.140003  9116104.570311 
+285560.040332  9116105.594765 
+285586.865183  9116103.615476 
+285598.786523  9116102.624170 
+285619.647033  9116100.638236 
+285652.480166  9116104.692885 
+285695.209879  9116102.731180 
+285733.912053  9116093.733122 
+285756.723997  9116086.726539 
+285779.528601  9116078.715388 
+285810.248969  9116065.690237 
+285840.983978  9116054.674185 
+285870.702919  9116040.643344 
+285895.502905  9116033.638901 
+285924.242422  9116021.616049 
+285953.983306  9116010.598836 
+285982.730121  9115999.580511 
+286011.469582  9115987.557615 
+286034.259393  9115977.537245 
+286055.090436  9115971.532903 
+286072.917312  9115962.511600 
+286088.748744  9115952.483546 
+286103.608130  9115945.468063 
+286122.436369  9115937.452395 
+286143.245360  9115928.434351 
+286181.859152  9115907.381295 
+286203.662160  9115898.364322 
+286225.428462  9115884.324562 
+286244.175910  9115865.258742 
+286260.957270  9115849.204402 
+286279.690009  9115828.129463 
+286285.558863  9115815.076786 
+286299.336034  9115796.005501 
+286311.139787  9115778.941145 
+286291.075397  9115753.805446 
+286262.933918  9115711.583553 
+286253.840753  9115691.482611 
+286243.716865  9115666.357795 
+286226.561319  9115631.179763 
+286221.451697  9115612.087735 
+286216.342081  9115592.995705 
+286212.219175  9115572.900211 
+286211.063721  9115550.798885 
+286207.854162  9115519.654366 
+286207.729440  9115502.576912 
+286209.548778  9115479.474311 
+286212.310801  9115449.340911 
+286217.090245  9115423.227925 
+286218.938930  9115404.143548 
+286223.755052  9115383.053343 
+286230.522563  9115356.942546 
+286233.416636  9115344.891157 
+286240.198813  9115320.789474 
+286248.011701  9115301.711665 
+286256.789274  9115278.616726 
+286257.753962  9115274.599597 
+286264.572806  9115255.520694 
+286275.316423  9115229.414277 
+286278.129782  9115206.312775 
+286279.971118  9115186.223846 
+286281.797783  9115164.125806 
+286285.605174  9115141.025399 
+286291.407960  9115118.931737 
+286301.186862  9115096.842452 
+286302.962170  9115067.712523 
+286305.731509  9115038.583689 
+286310.518248  9115013.475267 
+286314.266942  9114982.338417 
+286318.958312  9114944.170772 
+286325.579047  9114897.968871 
+286330.373115  9114873.865007 
+286334.092465  9114838.709937 
+286338.857188  9114810.587851 
+286348.548009  9114776.443907 
+286354.292076  9114746.313807 
+286359.896769  9114697.097150 
+286365.560144  9114655.916940 
+286368.388163  9114634.824557 
+286377.902913  9114576.571284 
+286399.254326  9114369.658032 
+286416.952424  9114206.940857 
+286417.895097  9114199.910065 
+286423.529133  9114154.711644 
+286426.320483  9114128.596489 
+286428.147161  9114106.498460 
+286427.971159  9114082.389127 
+286425.865814  9114066.314045 
+Region 1
+135
+287443.375587  9115918.795675 
+287427.367799  9115904.714946 
+287398.341740  9115877.561210 
+287353.315338  9115837.331229 
+287350.318490  9115835.318928 
+287314.297427  9115803.134894 
+287281.287979  9115774.972227 
+287226.033969  9115831.167141 
+287209.179437  9115837.176250 
+287194.283541  9115839.169292 
+287183.312288  9115834.134760 
+287177.311242  9115829.105580 
+287167.275157  9115816.035709 
+287160.235918  9115804.978151 
+287152.180566  9115790.905866 
+287141.165175  9115779.844014 
+287136.187616  9115778.834102 
+287129.199900  9115774.808392 
+287115.261264  9115771.779722 
+287103.318066  9115769.757745 
+287101.329985  9115769.755599 
+287088.385390  9115766.727993 
+287078.430274  9115764.708155 
+287064.447498  9115755.652160 
+287051.436698  9115743.583580 
+287043.396103  9115731.520368 
+287035.311377  9115713.429845 
+287028.235408  9115697.349496 
+287024.126851  9115679.263268 
+287015.143727  9115674.230832 
+287007.073736  9115658.149401 
+286991.029385  9115639.045703 
+286983.990221  9115627.988100 
+286979.925819  9115615.929172 
+286979.778735  9115595.838136 
+286980.618337  9115574.743625 
+286981.244679  9115524.517110 
+286976.215672  9115516.475310 
+286954.251305  9115503.392431 
+286936.336614  9115500.359372 
+286931.359085  9115499.349428 
+286918.421924  9115497.326305 
+286891.553565  9115493.278967 
+286874.654966  9115493.260618 
+286852.771486  9115491.227758 
+286833.862761  9115488.193575 
+286819.946265  9115488.178447 
+286799.999408  9115479.115852 
+286796.008567  9115477.102421 
+286780.059906  9115471.057799 
+286759.126375  9115462.998654 
+286751.130003  9115456.962676 
+286739.164840  9115451.926920 
+286734.150577  9115445.894187 
+286673.786255  9115482.996573 
+286669.868883  9115491.028665 
+286668.992394  9115507.100438 
+286668.101212  9115521.163104 
+286666.201300  9115533.215579 
+286656.429900  9115556.309472 
+286649.596528  9115573.379295 
+286637.807652  9115592.452805 
+286625.032074  9115612.529784 
+286607.264249  9115629.587677 
+286595.431268  9115642.633860 
+286579.680884  9115663.712133 
+286563.879068  9115677.758525 
+286554.984115  9115684.780634 
+286539.145560  9115693.804251 
+286528.247826  9115698.815077 
+286513.417989  9115709.848881 
+286495.620706  9115722.888531 
+286477.816068  9115734.923622 
+286443.413760  9115788.126963 
+286426.713273  9115815.231451 
+286386.390636  9115874.455581 
+286409.466652  9115903.612693 
+286437.557000  9115938.802548 
+286466.670821  9115978.011678 
+286468.688297  9115982.032068 
+286484.813432  9116012.186068 
+286507.035120  9116060.428541 
+286532.268406  9116112.692459 
+286559.622131  9116183.040482 
+286572.787311  9116216.204830 
+286590.974226  9116256.406454 
+286615.213708  9116308.669191 
+286635.344720  9116342.845619 
+286655.497821  9116380.035690 
+286673.611383  9116410.191713 
+286690.686801  9116434.319327 
+286718.726281  9116462.476999 
+286744.762973  9116488.623386 
+286771.845236  9116521.802694 
+286797.904060  9116550.962691 
+286812.954705  9116570.065317 
+286837.003395  9116596.209471 
+286860.065411  9116623.357084 
+286875.108751  9116641.455125 
+286904.194048  9116676.645557 
+286910.209926  9116683.683855 
+286926.048672  9116674.660048 
+286957.711425  9116654.603319 
+286999.484034  9116657.661962 
+287076.048736  9116660.757993 
+287172.472512  9116660.861585 
+287213.258400  9116664.923509 
+287231.085173  9116655.901744 
+287247.925245  9116647.883458 
+287269.595640  9116620.784047 
+287269.463047  9116602.702151 
+287270.250852  9116574.575823 
+287292.031704  9116562.544657 
+287294.005084  9116560.537687 
+287266.826732  9116514.299640 
+287254.684470  9116485.154905 
+287235.532295  9116448.970846 
+287210.445289  9116416.798569 
+287223.286982  9116405.762391 
+287244.957315  9116378.663013 
+287267.562758  9116343.528298 
+287283.195084  9116306.377016 
+287290.904449  9116273.235403 
+287293.584644  9116232.052060 
+287304.305606  9116202.931848 
+287323.958259  9116171.812132 
+287339.752544  9116156.760944 
+287363.506559  9116142.722827 
+287389.138159  9116113.618590 
+287409.836332  9116089.531769 
+287429.533072  9116064.439330 
+287453.117564  9116027.296556 
+287477.688698  9115989.150293 
+287500.308549  9115956.024642 
+287443.375587  9115918.795675 
+Region 1
+166
+286878.314280  9114498.765385 
+286876.223415  9114484.699475 
+286872.115145  9114466.613183 
+286863.935345  9114435.463360 
+286859.915227  9114429.431701 
+286855.895110  9114423.400040 
+286847.840191  9114409.327612 
+286845.749346  9114395.261697 
+286848.621215  9114380.196658 
+286849.505061  9114365.129447 
+286843.430835  9114350.054634 
+286831.333804  9114326.936874 
+286825.259592  9114311.862055 
+286821.129344  9114290.762088 
+286818.752146  9114237.518588 
+286763.986251  9114224.399554 
+286721.111767  9114206.270754 
+286686.093956  9114175.091426 
+286658.004886  9114139.901482 
+286644.958044  9114122.809869 
+286626.889816  9114098.680907 
+286575.627030  9114156.888253 
+286565.767659  9114167.927424 
+286548.972235  9114181.972603 
+286544.031539  9114185.985354 
+286529.172765  9114193.000832 
+286518.282685  9114199.016128 
+286506.376585  9114202.016662 
+286490.531124  9114210.035590 
+286470.650938  9114210.013692 
+286449.791410  9114211.999801 
+286416.952424  9114206.940857 
+286399.254326  9114369.658032 
+286377.902913  9114576.571284 
+286368.388163  9114634.824557 
+286365.560144  9114655.916940 
+286359.896769  9114697.097150 
+286354.292076  9114746.313807 
+286348.548009  9114776.443907 
+286338.857188  9114810.587851 
+286334.092465  9114838.709937 
+286330.373115  9114873.865007 
+286325.579047  9114897.968871 
+286318.958312  9114944.170772 
+286314.266942  9114982.338417 
+286310.518248  9115013.475267 
+286305.731509  9115038.583689 
+286302.962170  9115067.712523 
+286301.186862  9115096.842452 
+286291.407960  9115118.931737 
+286285.605174  9115141.025399 
+286281.797783  9115164.125806 
+286279.971118  9115186.223846 
+286278.129782  9115206.312775 
+286275.316423  9115229.414277 
+286264.572806  9115255.520694 
+286257.753962  9115274.599597 
+286256.789274  9115278.616726 
+286248.011701  9115301.711665 
+286240.198813  9115320.789474 
+286233.416636  9115344.891157 
+286230.522563  9115356.942546 
+286223.755052  9115383.053343 
+286218.938930  9115404.143548 
+286217.090245  9115423.227925 
+286212.310801  9115449.340911 
+286209.548778  9115479.474311 
+286207.729440  9115502.576912 
+286207.854162  9115519.654366 
+286211.063721  9115550.798885 
+286212.219175  9115572.900211 
+286216.342081  9115592.995705 
+286221.451697  9115612.087735 
+286226.561319  9115631.179763 
+286243.716865  9115666.357795 
+286253.840753  9115691.482611 
+286262.933918  9115711.583553 
+286291.075397  9115753.805446 
+286311.139787  9115778.941145 
+286336.211131  9115809.105054 
+286355.303552  9115837.253297 
+286379.366230  9115865.406968 
+286386.390636  9115874.455581 
+286426.713273  9115815.231451 
+286443.413760  9115788.126963 
+286477.816068  9115734.923622 
+286495.620706  9115722.888531 
+286513.417989  9115709.848881 
+286528.247826  9115698.815077 
+286539.145560  9115693.804251 
+286554.984115  9115684.780634 
+286563.879068  9115677.758525 
+286579.680884  9115663.712133 
+286595.431268  9115642.633860 
+286607.264249  9115629.587677 
+286625.032074  9115612.529784 
+286637.807652  9115592.452805 
+286649.596528  9115573.379295 
+286656.429900  9115556.309472 
+286666.201300  9115533.215579 
+286668.101212  9115521.163104 
+286668.992394  9115507.100438 
+286669.868883  9115491.028665 
+286673.786255  9115482.996573 
+286734.150577  9115445.894187 
+286681.047961  9115388.577214 
+286647.133271  9115372.467475 
+286643.164481  9115373.467688 
+286631.221383  9115371.445556 
+286613.262668  9115362.385028 
+286599.280095  9115353.328836 
+286589.273660  9115344.276986 
+286580.261263  9115335.226219 
+286575.173597  9115319.147918 
+286571.035909  9115297.043378 
+286569.895010  9115276.951207 
+286555.787643  9115250.817570 
+286546.701849  9115231.721247 
+286527.536258  9115193.527500 
+286520.438553  9115174.433342 
+286517.309633  9115154.338985 
+286518.259614  9115148.312746 
+286519.165547  9115136.259181 
+286520.122870  9115131.237497 
+286530.954410  9115117.185714 
+286544.760689  9115102.132642 
+286566.533867  9115089.097385 
+286576.422751  9115082.076388 
+286589.286373  9115074.054100 
+286603.092618  9115059.001017 
+286609.999408  9115051.976752 
+286620.816217  9115035.915851 
+286631.640362  9115020.859502 
+286640.469105  9115004.796424 
+286647.331822  9114991.744833 
+286651.212460  9114978.689981 
+286655.063723  9114961.616913 
+286656.013687  9114955.590677 
+286656.963652  9114949.564441 
+286658.826865  9114932.489199 
+286663.701522  9114919.435435 
+286668.612895  9114911.404440 
+286690.356570  9114894.350937 
+286702.211408  9114884.318439 
+286724.013811  9114875.301355 
+286742.804757  9114862.262792 
+286749.733533  9114858.252178 
+286762.604404  9114851.234415 
+286774.459212  9114841.201905 
+286787.263964  9114825.143158 
+286809.942800  9114800.054278 
+286806.887281  9114790.005493 
+286801.792305  9114772.922665 
+286793.641823  9114745.791048 
+286789.511500  9114724.691089 
+286780.389056  9114700.572039 
+286789.247085  9114688.527171 
+286802.066490  9114674.477537 
+286823.765936  9114651.396689 
+286840.524660  9114632.328625 
+286861.208013  9114606.233025 
+286870.066004  9114594.188149 
+286874.874469  9114572.093408 
+286878.688917  9114549.997582 
+286879.513975  9114526.893951 
+286878.314280  9114498.765385 
+Region 1
+173
+287426.197880  9113030.719098 
+287409.167964  9113012.618817 
+287389.222265  9113003.556239 
+287368.289942  9112995.497120 
+287345.406405  9112992.458580 
+287327.536842  9112995.452749 
+287305.720748  9113002.460783 
+287286.857196  9113005.453854 
+287264.017724  9113008.442582 
+287237.202331  9113011.426961 
+287208.362249  9113009.386395 
+287187.444623  9113003.336289 
+287163.537719  9112996.278362 
+287148.606004  9112993.248409 
+287128.682366  9112987.199358 
+287131.539478  9112970.125232 
+287111.615852  9112964.076171 
+287101.632014  9112958.037979 
+287092.583424  9112943.964454 
+287088.534096  9112933.914576 
+287085.375971  9112909.802051 
+287085.199783  9112885.692790 
+287083.978236  9112854.550573 
+287085.694578  9112817.384306 
+287079.694022  9112812.355009 
+287070.696860  9112805.313338 
+287062.701017  9112799.277307 
+287056.693125  9112793.243453 
+287023.037413  9112812.292896 
+287004.232601  9112823.322259 
+286989.366991  9112829.333215 
+286968.537517  9112835.337619 
+286916.946112  9112848.340031 
+286895.107961  9112852.334206 
+286872.305171  9112860.345493 
+286846.527773  9112869.358042 
+286838.561278  9112867.340182 
+286837.537959  9112863.320873 
+286823.328866  9112823.123394 
+286820.266252  9112812.070015 
+286815.186348  9112796.996231 
+286813.139718  9112788.957608 
+286813.022367  9112772.884743 
+286811.896372  9112754.801675 
+286813.825649  9112746.767432 
+286685.764070  9112768.726167 
+286550.583206  9112768.576642 
+286453.334588  9112790.568879 
+286351.152553  9112817.578187 
+286339.742718  9112752.269847 
+286361.134166  9112686.997990 
+286403.355101  9112615.722005 
+286397.989721  9112561.470433 
+286315.971330  9112491.060736 
+286197.015230  9112398.509485 
+286083.102592  9112316.008953 
+285985.101147  9112234.530451 
+285922.364130  9112218.387142 
+285877.555124  9112207.286673 
+285851.711940  9112207.257580 
+285823.238546  9112665.300957 
+285823.289729  9112672.332873 
+285816.704784  9112723.557589 
+285821.324198  9112811.963294 
+285822.786205  9112876.256216 
+285830.241403  9112944.574068 
+285834.604978  9112997.820175 
+285843.880000  9113043.035380 
+285862.093627  9113087.256048 
+285872.267602  9113119.413081 
+285892.410753  9113155.599478 
+285913.547931  9113191.786970 
+285944.705551  9113239.035708 
+285976.813321  9113280.258168 
+286008.950433  9113325.498823 
+286033.040502  9113357.671313 
+286062.166467  9113398.890344 
+286089.297179  9113439.102570 
+286114.432630  9113478.307996 
+286139.568130  9113517.513398 
+286158.666455  9113546.666570 
+286184.788712  9113584.868475 
+286207.951002  9113626.080713 
+286232.151298  9113673.321372 
+286257.367637  9113723.576778 
+286282.562057  9113770.818485 
+286312.733876  9113819.070225 
+286341.941085  9113871.339053 
+286362.107037  9113910.538727 
+286382.251035  9113946.724716 
+286397.417715  9113981.900642 
+286411.546423  9114011.048126 
+286419.667120  9114034.161684 
+286422.773798  9114051.242420 
+286425.865814  9114066.314045 
+286427.971159  9114082.389127 
+286428.147161  9114106.498460 
+286426.320483  9114128.596489 
+286423.529133  9114154.711644 
+286417.895097  9114199.910065 
+286416.952424  9114206.940857 
+286449.791410  9114211.999801 
+286470.650938  9114210.013692 
+286490.531124  9114210.035590 
+286506.376585  9114202.016662 
+286518.282685  9114199.016128 
+286529.172765  9114193.000832 
+286544.031539  9114185.985354 
+286548.972235  9114181.972603 
+286565.767659  9114167.927424 
+286575.627030  9114156.888253 
+286626.889816  9114098.680907 
+286701.803088  9114012.372208 
+286738.258279  9113968.212191 
+286789.711509  9113936.123153 
+286861.965252  9113894.011395 
+286779.958095  9113825.612437 
+286772.981300  9113686.977468 
+286760.906576  9113666.873293 
+286743.810522  9113639.731774 
+286730.639109  9113605.562734 
+286714.515087  9113575.408624 
+286708.367707  9113550.288208 
+286705.253671  9113532.202951 
+286707.080258  9113510.104943 
+286705.932206  9113489.008209 
+286698.842213  9113470.918574 
+286688.784924  9113454.834763 
+286673.750351  9113437.740919 
+286664.657732  9113417.639974 
+286657.479759  9113387.495670 
+286656.280406  9113359.367045 
+286661.980309  9113323.209651 
+286671.714836  9113295.093078 
+286687.471956  9113275.019513 
+286708.191664  9113253.946866 
+286723.956089  9113234.877850 
+286752.612979  9113211.804840 
+286776.336592  9113193.749120 
+286803.130177  9113187.751320 
+286847.844829  9113185.791384 
+286881.691680  9113192.860381 
+286912.607954  9113206.957952 
+286931.596422  9113221.042416 
+286949.590915  9113235.125779 
+287056.659568  9113332.683847 
+287128.623233  9113387.007856 
+287131.597851  9113386.006559 
+287141.471622  9113376.976439 
+287157.301968  9113366.948273 
+287180.016755  9113346.882175 
+287198.755577  9113326.811734 
+287216.434280  9113297.699242 
+287230.070906  9113259.541450 
+287237.706884  9113216.354401 
+287245.284087  9113165.130942 
+287253.074326  9113143.039477 
+287265.849158  9113122.962533 
+287272.851107  9113128.997424 
+287280.898467  9113142.065256 
+287286.950521  9113154.126369 
+287360.732976  9113185.347510 
+287371.703525  9113190.382153 
+287378.514415  9113170.298702 
+287383.315291  9113147.199437 
+287391.120154  9113127.117067 
+287399.977788  9113115.072183 
+287406.847456  9113103.025137 
+287418.687021  9113090.983493 
+287430.511880  9113076.932746 
+287435.371528  9113061.869887 
+287435.253931  9113045.797079 
+287426.197880  9113030.719098 
+Region 1
+213
+287788.717658  9114349.068663 
+287770.729822  9114335.990356 
+287762.748323  9114331.963635 
+287756.769563  9114329.948141 
+287663.391953  9114337.884203 
+287658.399838  9114334.865216 
+287647.392157  9114324.807974 
+287629.345469  9114303.693207 
+287617.226024  9114277.562102 
+287604.016909  9114238.370782 
+287597.699607  9114190.146004 
+287602.544504  9114173.074022 
+287605.467632  9114165.040840 
+287606.432195  9114161.023715 
+287596.102120  9114107.771904 
+287591.934778  9114081.649341 
+287590.668496  9114044.479949 
+287583.511815  9114017.349618 
+287575.316999  9113984.190916 
+287581.207408  9113974.151855 
+287590.020941  9113956.079615 
+287630.428971  9113908.909739 
+287647.209164  9113892.855163 
+287661.979275  9113873.784796 
+287672.766034  9113853.705596 
+287681.542717  9113830.610607 
+287685.342063  9113806.505718 
+287685.202232  9113787.419290 
+287682.109861  9113772.347845 
+287681.064352  9113765.314932 
+287675.954564  9113746.223148 
+287665.889536  9113729.135104 
+287653.836534  9113712.044912 
+287641.812973  9113698.972910 
+287626.748583  9113677.861293 
+287613.672191  9113656.751814 
+287600.610526  9113637.651426 
+287589.485360  9113611.521333 
+287583.396363  9113594.437549 
+287578.242515  9113569.318441 
+287576.203045  9113562.284446 
+287572.109397  9113546.207356 
+287570.983009  9113528.124389 
+287574.753009  9113500.001299 
+287579.516996  9113471.879285 
+287582.241522  9113436.723274 
+287580.018187  9113404.575538 
+287572.876417  9113379.454272 
+287563.746689  9113354.330851 
+287559.711916  9113346.290151 
+287554.668452  9113336.239274 
+287542.659748  9113325.176314 
+287533.655061  9113317.130228 
+287529.620298  9113309.089522 
+287524.510668  9113289.997690 
+287524.356254  9113268.902141 
+287523.222566  9113249.814615 
+287520.034742  9113221.683984 
+287515.897059  9113199.579574 
+287520.859615  9113198.580411 
+287527.788075  9113194.569752 
+287543.706483  9113196.596085 
+287551.650981  9113195.600150 
+287572.458406  9113186.581808 
+287555.237192  9113142.363315 
+287540.327489  9113142.347159 
+287519.490664  9113147.347283 
+287498.668535  9113154.356498 
+287479.782900  9113154.336010 
+287475.829031  9113157.345347 
+287456.081727  9113175.405678 
+287434.346444  9113193.463845 
+287421.512882  9113205.504419 
+287416.587073  9113211.526324 
+287412.596443  9113209.512905 
+287408.605813  9113207.499484 
+287371.703525  9113190.382153 
+287360.732976  9113185.347510 
+287286.950521  9113154.126369 
+287280.898467  9113142.065256 
+287272.851107  9113128.997424 
+287265.849158  9113122.962533 
+287253.074326  9113143.039477 
+287245.284087  9113165.130942 
+287237.706884  9113216.354401 
+287230.070906  9113259.541450 
+287216.434280  9113297.699242 
+287198.755577  9113326.811734 
+287180.016755  9113346.882175 
+287157.301968  9113366.948273 
+287141.471622  9113376.976439 
+287131.597851  9113386.006559 
+287128.623233  9113387.007856 
+287056.659568  9113332.683847 
+286949.590915  9113235.125779 
+286931.596422  9113221.042416 
+286912.607954  9113206.957952 
+286881.691680  9113192.860381 
+286847.844829  9113185.791384 
+286803.130177  9113187.751320 
+286776.336592  9113193.749120 
+286752.612979  9113211.804840 
+286723.956089  9113234.877850 
+286708.191664  9113253.946866 
+286687.471956  9113275.019513 
+286671.714836  9113295.093078 
+286661.980309  9113323.209651 
+286656.280406  9113359.367045 
+286657.479759  9113387.495670 
+286664.657732  9113417.639974 
+286673.750351  9113437.740919 
+286688.784924  9113454.834763 
+286698.842213  9113470.918574 
+286705.932206  9113489.008209 
+286707.080258  9113510.104943 
+286705.253671  9113532.202951 
+286708.367707  9113550.288208 
+286714.515087  9113575.408624 
+286730.639109  9113605.562734 
+286743.810522  9113639.731774 
+286760.906576  9113666.873293 
+286772.981300  9113686.977468 
+286779.958095  9113825.612437 
+286861.965252  9113894.011395 
+286789.711509  9113936.123153 
+286738.258279  9113968.212191 
+286701.803088  9114012.372208 
+286626.889816  9114098.680907 
+286644.958044  9114122.809869 
+286658.004886  9114139.901482 
+286686.093956  9114175.091426 
+286721.111767  9114206.270754 
+286763.986251  9114224.399554 
+286818.752146  9114237.518588 
+286821.129344  9114290.762088 
+286825.259592  9114311.862055 
+286831.333804  9114326.936874 
+286843.430835  9114350.054634 
+286849.505061  9114365.129447 
+286848.621215  9114380.196658 
+286845.749346  9114395.261697 
+286847.840191  9114409.327612 
+286855.895110  9114423.400040 
+286859.915227  9114429.431701 
+286863.935345  9114435.463360 
+286872.115145  9114466.613183 
+286876.223415  9114484.699475 
+286878.314280  9114498.765385 
+286879.513975  9114526.893951 
+286878.688917  9114549.997582 
+286874.874469  9114572.093408 
+286870.066004  9114594.188149 
+286861.208013  9114606.233025 
+286840.524660  9114632.328625 
+286823.765936  9114651.396689 
+286802.066490  9114674.477537 
+286789.247085  9114688.527171 
+286780.389056  9114700.572039 
+286789.511500  9114724.691089 
+286793.641823  9114745.791048 
+286801.792305  9114772.922665 
+286806.887281  9114790.005493 
+286809.942800  9114800.054278 
+286819.934428  9114807.096995 
+286830.986196  9114823.181769 
+286839.983811  9114830.223395 
+286850.962123  9114836.262632 
+286877.712519  9114824.237245 
+286895.546107  9114816.220314 
+286908.424283  9114810.207071 
+286927.251878  9114802.191212 
+286942.118083  9114796.180126 
+286952.021535  9114791.168180 
+286965.886364  9114784.151453 
+286990.685396  9114777.146612 
+287001.568156  9114770.126635 
+287004.491413  9114762.093460 
+287004.462013  9114758.075251 
+286996.142385  9114707.839000 
+287004.065126  9114703.829438 
+287015.971284  9114700.828751 
+287022.900004  9114696.818106 
+287041.683423  9114682.774904 
+287048.612138  9114678.764257 
+287051.579487  9114676.758393 
+287088.313986  9114670.771026 
+287121.992901  9114654.734881 
+287148.779854  9114647.732133 
+287171.539264  9114633.693203 
+287191.382795  9114628.691994 
+287207.228200  9114620.672817 
+287210.202890  9114619.671496 
+287236.923609  9114603.627747 
+287250.788322  9114596.610956 
+287271.640543  9114593.619895 
+287288.494641  9114587.610873 
+287304.413564  9114589.637174 
+287328.291948  9114592.676615 
+287347.244407  9114601.737976 
+287361.226805  9114610.793959 
+287374.229909  9114621.857964 
+287388.175529  9114625.891186 
+287599.951842  9114633.151045 
+287612.815105  9114625.128539 
+287629.580782  9114607.064813 
+287719.358299  9114514.743435 
+287723.245964  9114502.693120 
+287728.142365  9114492.652968 
+287741.859643  9114465.545090 
+287757.807963  9114471.589430 
+287831.828187  9114399.341847 
+287810.725720  9114368.178509 
+287788.717658  9114349.068663 
+Region 1
+372
+288121.262096  9114559.372407 
+288113.236297  9114549.318488 
+288104.128019  9114527.208955 
+288099.069507  9114515.149112 
+288092.987502  9114499.070024 
+288082.929475  9114482.986701 
+288082.892614  9114477.963970 
+288082.841009  9114470.932145 
+288075.750268  9114452.842901 
+288068.689022  9114438.771840 
+288066.568322  9114420.687886 
+288070.441143  9114406.628471 
+288075.315338  9114393.574663 
+288083.075714  9114367.464928 
+288093.891813  9114351.403833 
+288101.674292  9114328.307738 
+288109.434650  9114302.198004 
+288107.254982  9114276.077683 
+288101.121427  9114252.966763 
+288097.042224  9114238.898877 
+288096.003996  9114232.870540 
+288083.980161  9114219.798722 
+288065.948107  9114200.693259 
+288050.964397  9114190.631888 
+288023.993735  9114172.521402 
+287993.061829  9114156.415741 
+287997.015035  9114017.793566 
+287997.345963  9113927.385395 
+287998.258919  9113916.336440 
+287991.175717  9113899.251697 
+287987.052405  9113879.156500 
+287984.902352  9113857.054335 
+287984.732924  9113833.949750 
+287992.485974  9113806.835488 
+288006.202969  9113779.727608 
+288012.041687  9113762.656690 
+288011.018229  9113758.637438 
+288009.972673  9113751.604545 
+287999.937001  9113738.534793 
+287988.826320  9113714.413954 
+287986.705757  9113696.329975 
+287988.649543  9113690.304821 
+287976.154547  9113612.941902 
+287979.048132  9113600.890530 
+287980.955094  9113589.842639 
+287976.868671  9113574.770168 
+287969.748740  9113552.662667 
+287965.581321  9113526.540171 
+287966.479572  9113513.482121 
+287963.394517  9113499.415258 
+287956.355614  9113488.357773 
+287942.336727  9113474.279176 
+287932.315878  9113463.218484 
+287921.197970  9113438.093054 
+287916.051346  9113413.978571 
+287908.946211  9113393.880141 
+287901.863170  9113376.795353 
+287891.754017  9113353.680069 
+287886.747294  9113348.651987 
+287884.744605  9113346.640754 
+287879.737884  9113341.612670 
+287870.703706  9113329.548474 
+287863.679581  9113320.500058 
+287860.646108  9113313.465013 
+287859.630044  9113310.450300 
+287860.535699  9113298.396792 
+287864.445381  9113289.360136 
+287873.317608  9113279.324279 
+287879.222610  9113271.294310 
+287882.160388  9113265.270229 
+287883.066039  9113253.216722 
+287869.459781  9113159.779848 
+287859.313920  9113131.641798 
+287821.579535  9113136.623853 
+287819.444403  9113116.530743 
+287813.340723  9113097.437894 
+287807.251766  9113080.354140 
+287800.220344  9113070.301152 
+287790.236424  9113064.263141 
+287779.251172  9113057.219505 
+287771.233140  9113048.169986 
+287763.185684  9113035.102270 
+287760.071330  9113017.017173 
+287759.894769  9112992.908002 
+287765.755630  9112978.850758 
+287759.806490  9112980.853416 
+287754.851325  9112982.857148 
+287722.108974  9112990.858107 
+287673.573306  9113013.910086 
+287609.133938  9113036.944807 
+287598.288425  9113048.987562 
+287563.712424  9113078.081818 
+287532.118315  9113107.179291 
+287502.504774  9113135.274357 
+287479.782900  9113154.336010 
+287498.668535  9113154.356498 
+287519.490664  9113147.347283 
+287540.327489  9113142.347159 
+287555.237192  9113142.363315 
+287572.458406  9113186.581808 
+287551.650981  9113195.600150 
+287543.706483  9113196.596085 
+287527.788075  9113194.569752 
+287520.859615  9113198.580411 
+287515.897059  9113199.579574 
+287520.034742  9113221.683984 
+287523.222566  9113249.814615 
+287524.356254  9113268.902141 
+287524.510668  9113289.997690 
+287529.620298  9113309.089522 
+287533.655061  9113317.130228 
+287542.659748  9113325.176314 
+287554.668452  9113336.239274 
+287559.711916  9113346.290151 
+287563.746689  9113354.330851 
+287572.876417  9113379.454272 
+287580.018187  9113404.575538 
+287582.241522  9113436.723274 
+287579.516996  9113471.879285 
+287574.753009  9113500.001299 
+287570.983009  9113528.124389 
+287572.109397  9113546.207356 
+287576.203045  9113562.284446 
+287578.242515  9113569.318441 
+287583.396363  9113594.437549 
+287589.485360  9113611.521333 
+287600.610526  9113637.651426 
+287613.672191  9113656.751814 
+287626.748583  9113677.861293 
+287641.812973  9113698.972910 
+287653.836534  9113712.044912 
+287665.889536  9113729.135104 
+287675.954564  9113746.223148 
+287681.064352  9113765.314932 
+287682.109861  9113772.347845 
+287685.202232  9113787.419290 
+287685.342063  9113806.505718 
+287681.542717  9113830.610607 
+287672.766034  9113853.705596 
+287661.979275  9113873.784796 
+287647.209164  9113892.855163 
+287630.428971  9113908.909739 
+287590.020941  9113956.079615 
+287581.207408  9113974.151855 
+287575.316999  9113984.190916 
+287583.511815  9114017.349618 
+287590.668496  9114044.479949 
+287591.934778  9114081.649341 
+287596.102120  9114107.771904 
+287606.432195  9114161.023715 
+287605.467632  9114165.040840 
+287602.544504  9114173.074022 
+287597.699607  9114190.146004 
+287604.016909  9114238.370782 
+287617.226024  9114277.562102 
+287629.345469  9114303.693207 
+287647.392157  9114324.807974 
+287658.399838  9114334.865216 
+287663.391953  9114337.884203 
+287756.769563  9114329.948141 
+287762.748323  9114331.963635 
+287770.729822  9114335.990356 
+287788.717658  9114349.068663 
+287810.725720  9114368.178509 
+287831.828187  9114399.341847 
+287757.807963  9114471.589430 
+287741.859643  9114465.545090 
+287728.142365  9114492.652968 
+287723.245964  9114502.693120 
+287719.358299  9114514.743435 
+287629.580782  9114607.064813 
+287612.815105  9114625.128539 
+287599.951842  9114633.151045 
+287388.175529  9114625.891186 
+287374.229909  9114621.857964 
+287361.226805  9114610.793959 
+287347.244407  9114601.737976 
+287328.291948  9114592.676615 
+287304.413564  9114589.637174 
+287288.494641  9114587.610873 
+287271.640543  9114593.619895 
+287250.788322  9114596.610956 
+287236.923609  9114603.627747 
+287210.202890  9114619.671496 
+287207.228200  9114620.672817 
+287191.382795  9114628.691994 
+287171.539264  9114633.693203 
+287148.779854  9114647.732133 
+287121.992901  9114654.734881 
+287088.313986  9114670.771026 
+287051.579487  9114676.758393 
+287048.612138  9114678.764257 
+287041.683423  9114682.774904 
+287022.900004  9114696.818106 
+287015.971284  9114700.828751 
+287004.065126  9114703.829438 
+286996.142385  9114707.839000 
+287004.462013  9114758.075251 
+287004.491413  9114762.093460 
+287001.568156  9114770.126635 
+286990.685396  9114777.146612 
+286965.886364  9114784.151453 
+286952.021535  9114791.168180 
+286942.118083  9114796.180126 
+286927.251878  9114802.191212 
+286908.424283  9114810.207071 
+286895.546107  9114816.220314 
+286877.712519  9114824.237245 
+286850.962123  9114836.262632 
+286839.983811  9114830.223395 
+286830.986196  9114823.181769 
+286819.934428  9114807.096995 
+286809.942800  9114800.054278 
+286787.263964  9114825.143158 
+286774.459212  9114841.201905 
+286762.604404  9114851.234415 
+286749.733533  9114858.252178 
+286742.804757  9114862.262792 
+286724.013811  9114875.301355 
+286702.211408  9114884.318439 
+286690.356570  9114894.350937 
+286668.612895  9114911.404440 
+286663.701522  9114919.435435 
+286658.826865  9114932.489199 
+286656.963652  9114949.564441 
+286656.013687  9114955.590677 
+286655.063723  9114961.616913 
+286651.212460  9114978.689981 
+286647.331822  9114991.744833 
+286640.469105  9115004.796424 
+286631.640362  9115020.859502 
+286620.816217  9115035.915851 
+286609.999408  9115051.976752 
+286603.092618  9115059.001017 
+286589.286373  9115074.054100 
+286576.422751  9115082.076388 
+286566.533867  9115089.097385 
+286544.760689  9115102.132642 
+286530.954410  9115117.185714 
+286520.122870  9115131.237497 
+286519.165547  9115136.259181 
+286518.259614  9115148.312746 
+286517.309633  9115154.338985 
+286520.438553  9115174.433342 
+286527.536258  9115193.527500 
+286546.701849  9115231.721247 
+286555.787643  9115250.817570 
+286569.895010  9115276.951207 
+286571.035909  9115297.043378 
+286575.173597  9115319.147918 
+286580.261263  9115335.226219 
+286589.273660  9115344.276986 
+286599.280095  9115353.328836 
+286613.262668  9115362.385028 
+286631.221383  9115371.445556 
+286643.164481  9115373.467688 
+286647.133271  9115372.467475 
+286681.047961  9115388.577214 
+286734.150577  9115445.894187 
+286739.164840  9115451.926920 
+286751.130003  9115456.962676 
+286759.126375  9115462.998654 
+286780.059906  9115471.057799 
+286796.008567  9115477.102421 
+286799.999408  9115479.115852 
+286819.946265  9115488.178447 
+286833.862761  9115488.193575 
+286852.771486  9115491.227758 
+286874.654966  9115493.260618 
+286891.553565  9115493.278967 
+286918.421924  9115497.326305 
+286931.359085  9115499.349428 
+286936.336614  9115500.359372 
+286954.251305  9115503.392431 
+286976.215672  9115516.475310 
+286981.244679  9115524.517110 
+286980.618337  9115574.743625 
+286979.778735  9115595.838136 
+286979.925819  9115615.929172 
+286983.990221  9115627.988100 
+286991.029385  9115639.045703 
+287007.073736  9115658.149401 
+287015.143727  9115674.230832 
+287024.126851  9115679.263268 
+287028.235408  9115697.349496 
+287035.311377  9115713.429845 
+287043.396103  9115731.520368 
+287051.436698  9115743.583580 
+287064.447498  9115755.652160 
+287078.430274  9115764.708155 
+287088.385390  9115766.727993 
+287101.329985  9115769.755599 
+287103.318066  9115769.757745 
+287115.261264  9115771.779722 
+287129.199900  9115774.808392 
+287136.187616  9115778.834102 
+287141.165175  9115779.844014 
+287152.180566  9115790.905866 
+287160.235918  9115804.978151 
+287167.275157  9115816.035709 
+287177.311242  9115829.105580 
+287183.312288  9115834.134760 
+287194.283541  9115839.169292 
+287209.179437  9115837.176250 
+287226.033969  9115831.167141 
+287281.287979  9115774.972227 
+287301.014159  9115753.898056 
+287328.685264  9115731.827878 
+287332.617241  9115725.804853 
+287341.526768  9115720.791717 
+287349.501160  9115723.813911 
+287354.522891  9115730.851098 
+287356.555146  9115736.880532 
+287359.632984  9115749.942881 
+287364.632630  9115753.966417 
+287371.568808  9115750.960239 
+287378.490257  9115745.944962 
+287388.327543  9115731.891940 
+287431.719059  9115684.725051 
+287470.118215  9115634.539166 
+287478.983514  9115623.498717 
+287499.652008  9115595.393719 
+287536.998062  9115537.170355 
+287582.281548  9115476.946399 
+287607.883239  9115443.823960 
+287804.095696  9115226.048416 
+287822.856861  9115208.991258 
+287850.608451  9115197.970916 
+287868.559848  9115206.026365 
+287893.521022  9115221.121045 
+287937.479268  9115251.304007 
+287952.293777  9115238.260760 
+287967.115650  9115226.222057 
+287987.850035  9115207.157866 
+288001.648368  9115191.099914 
+288011.441104  9115171.019549 
+288018.214895  9115145.913284 
+288011.227245  9115141.887704 
+287997.259325  9115134.841085 
+287975.250754  9115115.731444 
+287961.150132  9115090.602971 
+287944.936156  9115048.395077 
+287947.910843  9115047.393705 
+288031.275757  9115029.400696 
+288039.139418  9115017.354592 
+288040.876733  9114983.202130 
+288044.705322  9114963.115431 
+288056.419679  9114933.996268 
+288083.971910  9114895.853090 
+288095.745230  9114874.770295 
+288108.586304  9114863.734015 
+288123.437526  9114855.713482 
+288143.288317  9114851.716405 
+288171.076465  9114845.718665 
+288160.009542  9114827.625240 
+288146.880847  9114799.484242 
+288133.796421  9114777.370511 
+288129.724496  9114764.307191 
+288118.650240  9114745.209201 
+288116.617969  9114739.179812 
+288106.626228  9114732.137426 
+288102.591187  9114724.096831 
+288107.494880  9114715.061199 
+288133.095824  9114681.938646 
+288146.805485  9114653.826146 
+288159.609620  9114637.767139 
+288176.360284  9114617.694170 
+288187.183757  9114602.637594 
+288196.078208  9114595.615273 
+288197.042716  9114591.598145 
+288204.832524  9114569.506583 
+288121.262096  9114559.372407 
+Region 1
+326
+289398.575403  9114428.114641 
+289387.263988  9114376.871807 
+289323.729523  9114387.855760 
+289279.169759  9114410.913732 
+289246.493552  9114427.956829 
+289224.640357  9114429.943176 
+289197.883729  9114440.965204 
+289191.927125  9114441.963540 
+289164.265229  9114465.039004 
+289148.449966  9114477.076932 
+289127.783013  9114505.182331 
+289109.044880  9114525.253471 
+289084.364898  9114548.332014 
+289070.508012  9114556.353835 
+289040.732277  9114562.349983 
+289027.832413  9114565.350125 
+289019.880384  9114565.341826 
+289014.910366  9114565.336639 
+288983.146601  9114571.330677 
+288858.448924  9114645.535811 
+288841.676446  9114662.595336 
+288825.868404  9114675.637730 
+288810.045573  9114686.671036 
+288798.213544  9114699.717589 
+288777.442823  9114713.759306 
+288752.666501  9114723.778678 
+288733.905934  9114740.836094 
+288726.977422  9114744.846965 
+288706.250980  9114764.915917 
+288699.352012  9114772.944957 
+288682.527714  9114782.972647 
+288661.779074  9114800.027957 
+288642.988893  9114813.067178 
+288614.295516  9114831.118663 
+288600.475366  9114844.163096 
+288573.747819  9114859.203022 
+288544.119443  9114885.289779 
+288529.283088  9114895.319521 
+288500.641292  9114920.402763 
+288467.979103  9114939.454540 
+288450.160666  9114949.481123 
+288437.297531  9114957.503852 
+288175.096780  9114851.750156 
+288171.076465  9114845.718665 
+288143.288317  9114851.716405 
+288123.437526  9114855.713482 
+288108.586304  9114863.734015 
+288095.745230  9114874.770295 
+288083.971910  9114895.853090 
+288056.419679  9114933.996268 
+288044.705322  9114963.115431 
+288040.876733  9114983.202130 
+288039.139418  9115017.354592 
+288031.275757  9115029.400696 
+287947.910843  9115047.393705 
+287944.936156  9115048.395077 
+287961.150132  9115090.602971 
+287975.250754  9115115.731444 
+287997.259325  9115134.841085 
+288011.227245  9115141.887704 
+288018.214895  9115145.913284 
+288011.441104  9115171.019549 
+288001.648368  9115191.099914 
+287987.850035  9115207.157866 
+287967.115650  9115226.222057 
+287952.293777  9115238.260760 
+287937.479268  9115251.304007 
+287893.521022  9115221.121045 
+287868.559848  9115206.026365 
+287850.608451  9115197.970916 
+287822.856861  9115208.991258 
+287804.095696  9115226.048416 
+287607.883239  9115443.823960 
+287582.281548  9115476.946399 
+287536.998062  9115537.170355 
+287499.652008  9115595.393719 
+287478.983514  9115623.498717 
+287470.118215  9115634.539166 
+287431.719059  9115684.725051 
+287388.327543  9115731.891940 
+287378.490257  9115745.944962 
+287371.568808  9115750.960239 
+287364.632630  9115753.966417 
+287359.632984  9115749.942881 
+287356.555146  9115736.880532 
+287354.522891  9115730.851098 
+287349.501160  9115723.813911 
+287341.526768  9115720.791717 
+287332.617241  9115725.804853 
+287328.685264  9115731.827878 
+287301.014159  9115753.898056 
+287281.287979  9115774.972227 
+287314.297427  9115803.134894 
+287350.318490  9115835.318928 
+287353.315338  9115837.331229 
+287398.341740  9115877.561210 
+287427.367799  9115904.714946 
+287443.375587  9115918.795675 
+287500.308549  9115956.024642 
+287477.688698  9115989.150293 
+287453.117564  9116027.296556 
+287429.533072  9116064.439330 
+287409.836332  9116089.531769 
+287389.138159  9116113.618590 
+287363.506559  9116142.722827 
+287339.752544  9116156.760944 
+287323.958259  9116171.812132 
+287304.305606  9116202.931848 
+287293.584644  9116232.052060 
+287290.904449  9116273.235403 
+287283.195084  9116306.377016 
+287267.562758  9116343.528298 
+287244.957315  9116378.663013 
+287223.286982  9116405.762391 
+287210.445289  9116416.798569 
+287235.532295  9116448.970846 
+287254.684470  9116485.154905 
+287266.826732  9116514.299640 
+287294.005084  9116560.537687 
+287349.311225  9116511.374362 
+287371.857673  9116468.203206 
+287392.600180  9116450.143651 
+287443.068460  9116419.056830 
+287516.127147  9116350.826077 
+287529.911187  9116332.759057 
+287546.625771  9116307.663378 
+287561.352242  9116282.565576 
+287576.100811  9116260.481418 
+287591.931871  9116250.452896 
+287594.884529  9116246.437883 
+287602.755826  9116235.396332 
+287614.573823  9116220.340826 
+287632.385581  9116209.309866 
+287641.302515  9116205.301206 
+287655.174935  9116199.288744 
+287665.998858  9116184.232172 
+287672.809728  9116164.148626 
+287678.626549  9116144.064022 
+287683.500930  9116131.010194 
+287693.330786  9116115.952563 
+287718.056554  9116098.901707 
+287731.810953  9116076.816470 
+287741.589169  9116054.727003 
+287750.373336  9116032.636478 
+287750.247985  9116015.559172 
+287743.208584  9116004.501746 
+287736.161813  9115992.439770 
+287731.110503  9115981.384457 
+287726.994255  9115962.293820 
+287725.941232  9115954.256381 
+287730.756611  9115933.166175 
+287732.619357  9115916.090983 
+287730.572297  9115908.052485 
+287723.503434  9115892.976860 
+287712.502651  9115883.924282 
+287706.472069  9115874.876998 
+287705.448542  9115870.857747 
+287705.389569  9115862.821366 
+287713.282907  9115854.793459 
+287719.210280  9115849.777076 
+287730.048867  9115836.729606 
+287739.937644  9115829.708362 
+287747.845715  9115823.689547 
+287755.761155  9115818.675279 
+287762.682556  9115813.659951 
+287771.614149  9115811.660381 
+287775.560807  9115807.646424 
+287778.528174  9115805.640504 
+287774.456178  9115792.577155 
+287773.381041  9115781.526075 
+287774.271860  9115767.463470 
+287776.208324  9115760.433755 
+287779.146198  9115754.409646 
+287786.052841  9115747.385222 
+287798.894206  9115736.348958 
+287806.809626  9115731.334685 
+287811.735565  9115725.312691 
+287818.583213  9115710.251887 
+287820.527043  9115704.226719 
+287830.415777  9115697.205466 
+287833.383134  9115695.199544 
+287839.244112  9115681.142229 
+287841.210059  9115678.130703 
+287843.168633  9115674.114629 
+287845.090339  9115665.075820 
+287850.973431  9115654.032147 
+287859.831248  9115641.987098 
+287869.705215  9115632.956746 
+287868.622695  9115620.901125 
+287865.471000  9115597.793373 
+287864.395858  9115586.742299 
+287866.310186  9115576.698944 
+287868.224513  9115566.655589 
+287877.097061  9115556.619635 
+287891.963287  9115550.608210 
+287901.837231  9115541.577857 
+287917.682729  9115533.558389 
+287930.531380  9115523.526655 
+287940.420059  9115516.505390 
+287952.282045  9115507.477142 
+287961.154561  9115497.441179 
+287968.039015  9115487.403104 
+287973.973689  9115483.391251 
+287985.813532  9115471.349359 
+287990.732047  9115464.322811 
+288000.628079  9115458.306084 
+288008.536051  9115452.287246 
+288016.421892  9115443.254769 
+288018.343563  9115434.215962 
+288020.250482  9115423.168063 
+288022.164776  9115413.124711 
+288024.056941  9115400.067719 
+288030.963498  9115393.043279 
+288038.871456  9115387.024440 
+288046.779411  9115381.005599 
+288051.727414  9115377.997233 
+288062.610069  9115370.977007 
+288071.489913  9115361.945580 
+288078.389079  9115353.916590 
+288090.265749  9115346.897414 
+288098.166312  9115339.874022 
+288110.050352  9115333.859388 
+288118.989201  9115332.864321 
+288126.926647  9115330.863654 
+288152.668000  9115316.827386 
+288166.495800  9115304.787572 
+288175.309200  9115286.715223 
+288165.214012  9115265.609245 
+288157.092126  9115242.496277 
+288170.794476  9115213.379193 
+288226.230956  9115182.297204 
+288233.159587  9115178.286383 
+288245.036184  9115171.267183 
+288257.928937  9115167.262666 
+288271.815707  9115163.259197 
+288291.607552  9115151.225667 
+288302.512252  9115147.219040 
+288317.363506  9115139.198430 
+288330.219332  9115130.171174 
+288342.103278  9115124.156499 
+288351.005163  9115118.138674 
+288362.881720  9115111.119451 
+288378.741731  9115105.108965 
+288390.633044  9115100.098825 
+288408.481082  9115094.090426 
+288428.295001  9115085.070485 
+288441.136018  9115074.034117 
+288453.019929  9115068.019420 
+288465.868319  9115057.987592 
+288483.716325  9115051.979170 
+288502.558341  9115045.971788 
+288514.427465  9115037.947992 
+288526.303968  9115030.928736 
+288535.213190  9115025.915429 
+288544.107638  9115018.893034 
+288554.938416  9115004.840923 
+288563.840243  9114998.823068 
+288571.748052  9114992.804168 
+288581.658661  9114988.796443 
+288596.561502  9114987.807569 
+288608.467523  9114984.806471 
+288625.277134  9114972.769701 
+288635.180344  9114967.757424 
+288654.022293  9114961.749992 
+288664.926898  9114957.743296 
+288676.825515  9114953.737640 
+288684.740686  9114948.723268 
+288692.655855  9114943.708895 
+288701.542870  9114935.681935 
+288705.481981  9114930.663391 
+288712.395743  9114924.643431 
+288718.322878  9114919.626971 
+288727.224661  9114913.609093 
+288735.147207  9114909.599258 
+288745.042998  9114903.582420 
+288760.843745  9114889.535489 
+288764.716340  9114875.476060 
+288769.582945  9114861.417672 
+288770.495672  9114850.368747 
+288775.362274  9114836.310359 
+288775.317937  9114830.283105 
+288779.242253  9114823.255473 
+288787.179558  9114821.254718 
+288799.100294  9114820.262668 
+288812.037209  9114822.285282 
+288823.965333  9114822.297768 
+288832.926206  9114824.316214 
+288839.876888  9114823.318952 
+288848.815588  9114822.323769 
+288855.692357  9114811.281085 
+288860.573712  9114799.231780 
+288868.474049  9114792.208303 
+288880.335638  9114783.179899 
+288887.241960  9114776.155380 
+288898.116923  9114768.130476 
+288908.020050  9114763.118156 
+288919.940760  9114762.126078 
+288929.829097  9114755.104671 
+288939.732216  9114750.092346 
+288950.636734  9114746.085598 
+288956.593388  9114745.087284 
+288964.508486  9114740.072879 
+288969.441558  9114735.055360 
+289008.096941  9114720.027691 
+289023.934505  9114711.003408 
+289043.533645  9114672.851575 
+289047.457906  9114665.823933 
+289095.897940  9114629.711215 
+289141.437239  9114604.645305 
+289178.104422  9114589.615462 
+289188.942295  9114576.567808 
+289190.878521  9114569.538093 
+289174.811746  9114547.421664 
+289183.713386  9114541.403728 
+289189.625621  9114534.378148 
+289200.404303  9114513.294173 
+289212.332321  9114513.306576 
+289258.019392  9114508.331391 
+289277.943806  9114514.379274 
+289304.870629  9114526.461606 
+289323.793652  9114531.503896 
+289357.537888  9114524.507157 
+289395.250710  9114516.509975 
+289412.185728  9114521.550167 
+289446.968344  9114520.581629 
+289398.575403  9114428.114641 
+Region 1
+136
+287715.683944  9112656.338954 
+287715.632468  9112649.307109 
+287717.443916  9112625.200080 
+287719.255366  9112601.093051 
+287717.215956  9112594.059054 
+287715.169195  9112586.020508 
+287709.102448  9112571.950360 
+287704.007613  9112554.867639 
+287694.922214  9112535.771509 
+287684.842858  9112516.674299 
+287673.843066  9112507.621501 
+287662.850631  9112499.573250 
+287655.863466  9112495.547505 
+287642.868403  9112485.487992 
+287637.913279  9112487.491699 
+287620.007200  9112485.463182 
+287601.107156  9112483.433579 
+287586.175624  9112480.403736 
+287561.289739  9112475.353987 
+287546.358210  9112472.324130 
+287523.430866  9112463.258317 
+287509.434521  9112452.193124 
+287505.436616  9112449.175146 
+287495.438182  9112441.127925 
+287484.423745  9112430.065966 
+287478.371789  9112418.004865 
+287472.349225  9112409.961966 
+287468.343979  9112405.939433 
+287463.359463  9112403.924918 
+287453.441858  9112406.927741 
+287449.495386  9112410.941612 
+287446.564917  9112417.970218 
+287448.604272  9112425.004240 
+287453.698991  9112442.087017 
+287458.771674  9112456.156140 
+287461.878471  9112473.236750 
+287466.936467  9112485.296769 
+287464.977924  9112489.312807 
+287460.044828  9112494.330149 
+287446.217460  9112506.369602 
+287437.359921  9112518.414467 
+287432.426819  9112523.431807 
+287422.582651  9112536.480139 
+287414.821919  9112562.589798 
+287408.975654  9112578.656114 
+287400.147479  9112594.719181 
+287388.300659  9112605.756242 
+287376.453833  9112616.793302 
+287369.525429  9112620.803920 
+287350.713459  9112630.828838 
+287344.779021  9112634.840538 
+287337.835920  9112636.842051 
+287330.907509  9112640.852665 
+287328.970984  9112647.882355 
+287324.103963  9112661.940652 
+287320.223565  9112674.995481 
+287318.353145  9112691.066134 
+287314.538851  9112713.161926 
+287311.689149  9112731.240597 
+287309.782001  9112742.288493 
+287307.838127  9112748.313633 
+287306.924952  9112759.362613 
+287306.070540  9112778.448005 
+287305.157366  9112789.496986 
+287306.239485  9112801.552687 
+287306.305595  9112810.593649 
+287307.328952  9112814.612939 
+287144.552045  9112846.580529 
+287123.634501  9112840.530373 
+287105.662182  9112829.460710 
+287092.681770  9112821.410138 
+287085.694578  9112817.384306 
+287083.978236  9112854.550573 
+287085.199783  9112885.692790 
+287085.375971  9112909.802051 
+287088.534096  9112933.914576 
+287092.583424  9112943.964454 
+287101.632014  9112958.037979 
+287111.615852  9112964.076171 
+287131.539478  9112970.125232 
+287128.682366  9112987.199358 
+287148.606004  9112993.248409 
+287163.537719  9112996.278362 
+287187.444623  9113003.336289 
+287208.362249  9113009.386395 
+287237.202331  9113011.426961 
+287264.017724  9113008.442582 
+287286.857196  9113005.453854 
+287305.720748  9113002.460783 
+287327.536842  9112995.452749 
+287345.406405  9112992.458580 
+287368.289942  9112995.497120 
+287389.222265  9113003.556239 
+287409.167964  9113012.618817 
+287426.197880  9113030.719098 
+287435.253931  9113045.797079 
+287435.371528  9113061.869887 
+287430.511880  9113076.932746 
+287418.687021  9113090.983493 
+287406.847456  9113103.025137 
+287399.977788  9113115.072183 
+287391.120154  9113127.117067 
+287383.315291  9113147.199437 
+287378.514415  9113170.298702 
+287371.703525  9113190.382153 
+287408.605813  9113207.499484 
+287412.596443  9113209.512905 
+287416.587073  9113211.526324 
+287421.512882  9113205.504419 
+287434.346444  9113193.463845 
+287456.081727  9113175.405678 
+287475.829031  9113157.345347 
+287479.782900  9113154.336010 
+287502.504774  9113135.274357 
+287532.118315  9113107.179291 
+287563.712424  9113078.081818 
+287598.288425  9113048.987562 
+287609.133938  9113036.944807 
+287595.063835  9113015.834193 
+287599.974895  9113007.803179 
+287611.829084  9112997.770601 
+287626.650490  9112985.732151 
+287646.375581  9112964.658132 
+287657.169585  9112945.583526 
+287660.114740  9112940.564007 
+287670.901381  9112920.484851 
+287684.633163  9112895.386175 
+287696.428468  9112877.317192 
+287707.185663  9112853.219838 
+287714.018443  9112836.150028 
+287718.870629  9112820.082617 
+287717.707499  9112796.976913 
+287716.426703  9112757.798421 
+287718.098412  9112714.604958 
+287718.879113  9112685.474108 
+287715.683944  9112656.338954 
+Region 1
+185
+289827.275749  9112310.003412 
+289819.116996  9112281.868097 
+289816.046370  9112269.810545 
+289803.608542  9112200.485033 
+289796.369815  9112162.305355 
+289791.222555  9112138.191274 
+289781.855438  9112080.923294 
+289771.479628  9112021.645194 
+289759.086397  9111958.346861 
+289751.892163  9111926.194385 
+289750.846458  9111919.161581 
+289756.765739  9111913.140559 
+289772.587457  9111902.107193 
+289776.459689  9111888.047793 
+289745.507026  9111868.929476 
+289707.596804  9111849.803878 
+289673.662368  9111830.682388 
+289639.676216  9111804.529093 
+289604.747896  9111785.406498 
+289562.126728  9111801.434438 
+289547.328470  9111816.486934 
+289522.627739  9111836.551722 
+289503.868467  9111853.609128 
+289486.051403  9111863.635790 
+289343.529339  9111945.857980 
+289335.577783  9111945.849629 
+289329.577189  9111940.820660 
+289323.561825  9111933.782609 
+289310.515004  9111916.691835 
+289298.528599  9111908.642969 
+289283.560367  9111900.590962 
+289257.577538  9111881.477491 
+289241.607993  9111872.419880 
+289231.579965  9111860.354917 
+289216.523167  9111840.248384 
+289110.985782  9111680.416121 
+288861.080570  9111757.500586 
+288856.118230  9111758.499852 
+288450.508456  9111882.629966 
+288302.748859  9111928.680349 
+288245.254368  9111949.713917 
+288224.440299  9111957.727859 
+288166.953073  9111979.765891 
+287901.199028  9112064.865093 
+287924.516007  9112127.171808 
+287853.318866  9112177.321851 
+287829.493302  9112181.314230 
+287808.627544  9112182.296180 
+287767.889977  9112184.261129 
+287729.140314  9112186.228199 
+287701.338885  9112190.216202 
+287677.542682  9112198.226705 
+287653.739119  9112205.232647 
+287625.893565  9112203.193308 
+287596.965868  9112189.098271 
+287552.737350  9112257.359025 
+287572.734138  9112273.453455 
+287590.706273  9112284.522962 
+287614.656881  9112297.608039 
+287618.647426  9112299.621459 
+287627.659226  9112308.672126 
+287631.664471  9112312.694644 
+287638.681003  9112320.738599 
+287641.684939  9112323.755486 
+287642.708301  9112327.774764 
+287646.720900  9112332.801830 
+287644.799130  9112341.840619 
+287644.821181  9112344.854268 
+287639.873421  9112347.862522 
+287636.898885  9112348.863834 
+287627.010712  9112355.884889 
+287615.112561  9112359.890134 
+287600.276616  9112369.919436 
+287602.352738  9112381.976195 
+287612.395269  9112396.050691 
+287615.421260  9112402.081229 
+287624.550692  9112427.204688 
+287632.517105  9112429.222420 
+287642.471448  9112431.242308 
+287650.437862  9112433.260036 
+287659.405593  9112436.283391 
+287666.407450  9112442.318236 
+287663.477017  9112449.346849 
+287656.614834  9112462.398446 
+287651.718523  9112472.438551 
+287642.868403  9112485.487992 
+287655.863466  9112495.547505 
+287662.850631  9112499.573250 
+287673.843066  9112507.621501 
+287684.842858  9112516.674299 
+287694.922214  9112535.771509 
+287704.007613  9112554.867639 
+287709.102448  9112571.950360 
+287715.169195  9112586.020508 
+287717.215956  9112594.059054 
+287719.255366  9112601.093051 
+287717.443916  9112625.200080 
+287715.632468  9112649.307109 
+287715.683944  9112656.338954 
+287718.879113  9112685.474108 
+287718.098412  9112714.604958 
+287716.426703  9112757.798421 
+287717.707499  9112796.976913 
+287718.870629  9112820.082617 
+287714.018443  9112836.150028 
+287707.185663  9112853.219838 
+287696.428468  9112877.317192 
+287684.633163  9112895.386175 
+287670.901381  9112920.484851 
+287660.114740  9112940.564007 
+287657.169585  9112945.583526 
+287646.375581  9112964.658132 
+287626.650490  9112985.732151 
+287611.829084  9112997.770601 
+287599.974895  9113007.803179 
+287595.063835  9113015.834193 
+287609.133938  9113036.944807 
+287673.573306  9113013.910086 
+287722.108974  9112990.858107 
+287754.851325  9112982.857148 
+287759.806490  9112980.853416 
+287765.755630  9112978.850758 
+287817.368768  9112968.861047 
+287889.855333  9112958.893768 
+287956.436882  9112956.956349 
+288021.994979  9112950.999575 
+288025.963511  9112949.999298 
+288032.921325  9112950.006771 
+288087.567764  9112947.051805 
+288137.229586  9112942.082356 
+288146.167975  9112941.087395 
+288191.839149  9112934.104536 
+288251.425902  9112927.136515 
+288315.003241  9112922.181757 
+288377.571833  9112915.216762 
+288450.080089  9112908.262271 
+288512.663343  9112903.306188 
+288575.231813  9112896.340933 
+288601.052891  9112893.354744 
+288626.248762  9112940.594693 
+288650.413842  9112982.810841 
+288682.102875  9112966.771847 
+288727.692704  9112948.738481 
+288767.348187  9112934.716944 
+288804.006973  9112918.683139 
+288830.740806  9112904.647897 
+288840.658347  9112901.644768 
+288849.677863  9112911.699646 
+288874.556591  9112915.744052 
+288909.286422  9112907.744417 
+288930.085925  9112897.721004 
+288945.937728  9112890.705972 
+288952.880734  9112888.704221 
+288955.810958  9112881.675567 
+288956.708953  9112868.617563 
+288956.561305  9112848.526716 
+288952.437796  9112828.431677 
+288947.342473  9112811.349216 
+288937.255185  9112791.247884 
+288931.165910  9112774.164369 
+288927.094095  9112761.101121 
+288926.041081  9112753.063732 
+289030.921362  9112687.879553 
+289130.890584  9112630.726308 
+289156.630160  9112616.689890 
+289183.356293  9112601.649964 
+289232.928691  9112584.624938 
+289239.871630  9112582.623157 
+289289.466137  9112568.611701 
+289295.415111  9112566.608870 
+289353.955190  9112552.606726 
+289404.550949  9112539.600741 
+289460.079491  9112521.577198 
+289516.631501  9112507.572792 
+289542.429991  9112501.572514 
+289574.177416  9112493.569361 
+289602.957748  9112487.572159 
+289640.668869  9112479.575176 
+289697.205927  9112463.561493 
+289733.937835  9112457.572483 
+289777.568214  9112443.554363 
+289827.110476  9112422.510627 
+289829.053985  9112416.485461 
+289840.818624  9112394.397997 
+289827.275749  9112310.003412 
+Region 1
+240
+289161.766920  9114395.723639 
+289147.717818  9114377.627413 
+289117.609469  9114338.419246 
+289090.520136  9114304.236863 
+289060.500604  9114277.083127 
+289033.470488  9114250.937020 
+289011.417776  9114225.800628 
+288996.360014  9114205.694205 
+288967.245918  9114166.486918 
+288953.145246  9114141.358803 
+288933.971175  9114102.161885 
+288922.808196  9114071.009624 
+288911.623074  9114036.843730 
+288901.535393  9114016.742462 
+288895.460627  9114001.668072 
+288863.061960  9113921.271296 
+288855.124810  9113923.272027 
+288829.354913  9113933.290293 
+288829.295828  9113925.253952 
+288826.217845  9113912.191764 
+288826.099679  9113896.119083 
+288822.005556  9113880.042220 
+288814.922084  9113862.957678 
+288807.786927  9113838.841333 
+288796.712747  9113819.743515 
+288787.597019  9113796.629614 
+288771.479090  9113767.481123 
+288760.382799  9113745.369659 
+288756.333022  9113735.320039 
+288753.277234  9113725.271466 
+288746.142146  9113701.155097 
+288741.031952  9113682.063538 
+288731.916294  9113658.949611 
+288725.775222  9113634.834282 
+288716.600536  9113603.684000 
+288718.566361  9113600.672468 
+288729.478041  9113597.670376 
+288743.371670  9113594.671427 
+288761.211702  9113587.658495 
+288777.056379  9113579.638918 
+288780.030946  9113578.637518 
+288791.870152  9113566.595574 
+288805.653019  9113548.528467 
+288802.656305  9113546.516239 
+288796.648115  9113540.482696 
+288785.655249  9113532.434828 
+288775.671134  9113526.397090 
+288763.684293  9113518.348166 
+288753.678038  9113509.296792 
+288742.670425  9113499.239823 
+288736.677010  9113495.215355 
+288730.654072  9113487.172714 
+288728.584920  9113476.120638 
+288730.499074  9113466.077304 
+288734.438094  9113461.058785 
+288726.427201  9113453.014043 
+288695.444057  9113429.876995 
+288670.476477  9113413.778030 
+288661.508518  9113410.754938 
+288647.607552  9113412.749307 
+288622.706395  9113405.691204 
+288603.783881  9113400.648490 
+288591.848739  9113399.631314 
+288584.876123  9113397.614855 
+288596.875727  9113272.060530 
+288603.457355  9113220.836154 
+288605.216634  9113189.697393 
+288605.128117  9113177.642864 
+288604.980590  9113157.551981 
+288598.817587  9113130.422965 
+288593.685447  9113108.317722 
+288589.606292  9113094.249885 
+288589.473533  9113076.168088 
+288590.445379  9113073.155510 
+288594.354892  9113064.118830 
+288601.194692  9113048.053504 
+288613.041229  9113037.016170 
+288627.884427  9113027.991084 
+288641.726271  9113017.960397 
+288653.565412  9113005.918513 
+288650.413842  9112982.810841 
+288626.248762  9112940.594693 
+288601.052891  9112893.354744 
+288575.231813  9112896.340933 
+288512.663343  9112903.306188 
+288450.080089  9112908.262271 
+288377.571833  9112915.216762 
+288315.003241  9112922.181757 
+288251.425902  9112927.136515 
+288191.839149  9112934.104536 
+288146.167975  9112941.087395 
+288137.229586  9112942.082356 
+288087.567764  9112947.051805 
+288032.921325  9112950.006771 
+288025.963511  9112949.999298 
+288021.994979  9112950.999575 
+287956.436882  9112956.956349 
+287889.855333  9112958.893768 
+287817.368768  9112968.861047 
+287765.755630  9112978.850758 
+287759.894769  9112992.908002 
+287760.071330  9113017.017173 
+287763.185684  9113035.102270 
+287771.233140  9113048.169986 
+287779.251172  9113057.219505 
+287790.236424  9113064.263141 
+287800.220344  9113070.301152 
+287807.251766  9113080.354140 
+287813.340723  9113097.437894 
+287819.444403  9113116.530743 
+287821.579535  9113136.623853 
+287859.313920  9113131.641798 
+287869.459781  9113159.779848 
+287883.066039  9113253.216722 
+287882.160388  9113265.270229 
+287879.222610  9113271.294310 
+287873.317608  9113279.324279 
+287864.445381  9113289.360136 
+287860.535699  9113298.396792 
+287859.630044  9113310.450300 
+287860.646108  9113313.465013 
+287863.679581  9113320.500058 
+287870.703706  9113329.548474 
+287879.737884  9113341.612670 
+287884.744605  9113346.640754 
+287886.747294  9113348.651987 
+287891.754017  9113353.680069 
+287901.863170  9113376.795353 
+287908.946211  9113393.880141 
+287916.051346  9113413.978571 
+287921.197970  9113438.093054 
+287932.315878  9113463.218484 
+287942.336727  9113474.279176 
+287956.355614  9113488.357773 
+287963.394517  9113499.415258 
+287966.479572  9113513.482121 
+287965.581321  9113526.540171 
+287969.748740  9113552.662667 
+287976.868671  9113574.770168 
+287980.955094  9113589.842639 
+287979.048132  9113600.890530 
+287976.154547  9113612.941902 
+287988.649543  9113690.304821 
+287986.705757  9113696.329975 
+287988.826320  9113714.413954 
+287999.937001  9113738.534793 
+288009.972673  9113751.604545 
+288011.018229  9113758.637438 
+288012.041687  9113762.656690 
+288006.202969  9113779.727608 
+287992.485974  9113806.835488 
+287984.732924  9113833.949750 
+287984.902352  9113857.054335 
+287987.052405  9113879.156500 
+287991.175717  9113899.251697 
+287998.258919  9113916.336440 
+287997.345963  9113927.385395 
+287997.015035  9114017.793566 
+287993.061829  9114156.415741 
+288023.993735  9114172.521402 
+288050.964397  9114190.631888 
+288065.948107  9114200.693259 
+288083.980161  9114219.798722 
+288096.003996  9114232.870540 
+288097.042224  9114238.898877 
+288101.121427  9114252.966763 
+288107.254982  9114276.077683 
+288109.434650  9114302.198004 
+288101.674292  9114328.307738 
+288093.891813  9114351.403833 
+288083.075714  9114367.464928 
+288075.315338  9114393.574663 
+288070.441143  9114406.628471 
+288066.568322  9114420.687886 
+288068.689022  9114438.771840 
+288075.750268  9114452.842901 
+288082.841009  9114470.932145 
+288082.892614  9114477.963970 
+288082.929475  9114482.986701 
+288092.987502  9114499.070024 
+288099.069507  9114515.149112 
+288104.128019  9114527.208955 
+288113.236297  9114549.318488 
+288121.262096  9114559.372407 
+288204.832524  9114569.506583 
+288197.042716  9114591.598145 
+288196.078208  9114595.615273 
+288187.183757  9114602.637594 
+288176.360284  9114617.694170 
+288159.609620  9114637.767139 
+288146.805485  9114653.826146 
+288133.095824  9114681.938646 
+288107.494880  9114715.061199 
+288102.591187  9114724.096831 
+288106.626228  9114732.137426 
+288116.617969  9114739.179812 
+288118.650240  9114745.209201 
+288129.724496  9114764.307191 
+288133.796421  9114777.370511 
+288146.880847  9114799.484242 
+288160.009542  9114827.625240 
+288171.076465  9114845.718665 
+288175.096780  9114851.750156 
+288437.297531  9114957.503852 
+288450.160666  9114949.481123 
+288467.979103  9114939.454540 
+288500.641292  9114920.402763 
+288529.283088  9114895.319521 
+288544.119443  9114885.289779 
+288573.747819  9114859.203022 
+288600.475366  9114844.163096 
+288614.295516  9114831.118663 
+288642.988893  9114813.067178 
+288661.779074  9114800.027957 
+288682.527714  9114782.972647 
+288699.352012  9114772.944957 
+288706.250980  9114764.915917 
+288726.977422  9114744.846965 
+288733.905934  9114740.836094 
+288752.666501  9114723.778678 
+288777.442823  9114713.759306 
+288798.213544  9114699.717589 
+288810.045573  9114686.671036 
+288825.868404  9114675.637730 
+288841.676446  9114662.595336 
+288858.448924  9114645.535811 
+288983.146601  9114571.330677 
+289014.910366  9114565.336639 
+289019.880384  9114565.341826 
+289027.832413  9114565.350125 
+289040.732277  9114562.349983 
+289070.508012  9114556.353835 
+289084.364898  9114548.332014 
+289109.044880  9114525.253471 
+289127.783013  9114505.182331 
+289148.449966  9114477.076932 
+289164.265229  9114465.039004 
+289191.927125  9114441.963540 
+289177.804034  9114413.821926 
+289161.766920  9114395.723639 
+Region 1
+152
+289488.658305  9113568.329091 
+289455.427944  9113510.031732 
+289449.234772  9113478.884810 
+289455.963312  9113447.751323 
+289466.630769  9113411.599275 
+289468.478182  9113392.515094 
+289473.292728  9113371.424936 
+289469.213275  9113357.357250 
+289466.142594  9113345.299676 
+289469.785655  9113300.099539 
+289469.719090  9113291.058684 
+289466.507893  9113259.914860 
+289459.298631  9113225.753277 
+289448.209639  9113204.646563 
+289438.181183  9113192.581736 
+289419.229177  9113183.521204 
+289418.999952  9113152.380472 
+289404.995636  9113140.311489 
+289361.342259  9113151.315811 
+289358.367739  9113152.317239 
+289344.511288  9113160.339037 
+289329.727391  9113177.400655 
+289307.080413  9113206.508450 
+289290.293759  9113221.558905 
+289282.356761  9113223.559678 
+289261.490721  9113224.542403 
+289242.620016  9113226.531739 
+289215.804911  9113229.517289 
+289195.969783  9113235.523730 
+289178.122595  9113241.532245 
+289159.318372  9113252.562419 
+289143.503451  9113264.600252 
+289137.591325  9113271.625792 
+289127.725464  9113281.660788 
+289112.948828  9113299.726905 
+289103.134673  9113316.793688 
+289089.359382  9113335.865385 
+289080.472698  9113343.892336 
+289075.547142  9113349.914373 
+289060.748304  9113364.966857 
+289048.879677  9113372.990676 
+289035.000929  9113377.998782 
+289019.126834  9113382.000255 
+289000.196940  9113375.953172 
+288964.384199  9113371.897407 
+288942.509303  9113370.869874 
+288919.647811  9113370.845827 
+288890.829831  9113371.820033 
+288869.993206  9113376.820767 
+288853.176787  9113387.852937 
+288831.427377  9113403.902580 
+288813.683398  9113423.974578 
+288799.878414  9113439.028051 
+288784.078078  9113453.074882 
+288765.244118  9113460.086762 
+288748.368589  9113463.082561 
+288734.438094  9113461.058785 
+288730.499074  9113466.077304 
+288728.584920  9113476.120638 
+288730.654072  9113487.172714 
+288736.677010  9113495.215355 
+288742.670425  9113499.239823 
+288753.678038  9113509.296792 
+288763.684293  9113518.348166 
+288775.671134  9113526.397090 
+288785.655249  9113532.434828 
+288796.648115  9113540.482696 
+288802.656305  9113546.516239 
+288805.653019  9113548.528467 
+288791.870152  9113566.595574 
+288780.030946  9113578.637518 
+288777.056379  9113579.638918 
+288761.211702  9113587.658495 
+288743.371670  9113594.671427 
+288729.478041  9113597.670376 
+288718.566361  9113600.672468 
+288716.600536  9113603.684000 
+288725.775222  9113634.834282 
+288731.916294  9113658.949611 
+288741.031952  9113682.063538 
+288746.142146  9113701.155097 
+288753.277234  9113725.271466 
+288756.333022  9113735.320039 
+288760.382799  9113745.369659 
+288771.479090  9113767.481123 
+288787.597019  9113796.629614 
+288796.712747  9113819.743515 
+288807.786927  9113838.841333 
+288814.922084  9113862.957678 
+288822.005556  9113880.042220 
+288826.099679  9113896.119083 
+288826.217845  9113912.191764 
+288829.295828  9113925.253952 
+288829.354913  9113933.290293 
+288829.377070  9113936.303920 
+288855.124810  9113923.272027 
+288863.061960  9113921.271296 
+288895.460627  9114001.668072 
+288901.535393  9114016.742462 
+288911.623074  9114036.843730 
+288922.808196  9114071.009624 
+288933.971175  9114102.161885 
+288953.145246  9114141.358803 
+288967.245918  9114166.486918 
+288996.360014  9114205.694205 
+289011.417776  9114225.800628 
+289033.470488  9114250.937020 
+289060.500604  9114277.083127 
+289090.520136  9114304.236863 
+289117.609469  9114338.419246 
+289147.717818  9114377.627413 
+289161.766920  9114395.723639 
+289177.804034  9114413.821926 
+289191.927125  9114441.963540 
+289197.883729  9114440.965204 
+289224.640357  9114429.943176 
+289246.493552  9114427.956829 
+289279.169759  9114410.913732 
+289323.729523  9114387.855760 
+289359.224861  9114348.715844 
+289379.060402  9114342.709225 
+289407.782699  9114328.675555 
+289415.697666  9114323.661099 
+289425.950756  9114231.254824 
+289447.406537  9114040.416081 
+289446.345949  9114031.374198 
+289446.308950  9114026.351502 
+289226.015974  9113941.741767 
+289116.152348  9113870.305254 
+289072.261674  9113849.164156 
+289073.218709  9113844.142489 
+289141.604254  9113817.091589 
+289170.370723  9113809.085372 
+289182.276379  9113806.084205 
+289294.367531  9113775.060588 
+289298.306495  9113770.042029 
+289304.226032  9113764.021000 
+289343.028406  9113769.084059 
+289372.892318  9113775.142320 
+289389.819642  9113779.178049 
+289419.794528  9113800.304367 
+289458.767098  9113828.471718 
+289476.718025  9113836.526596 
+289480.701365  9113837.535259 
+289474.300902  9113778.261264 
+289461.943976  9113719.985610 
+289462.782593  9113698.891318 
+289469.488925  9113664.744209 
+289486.149856  9113632.616500 
+289502.788572  9113597.475174 
+289490.668458  9113571.344773 
+289488.658305  9113568.329091 
+Region 1
+105
+289336.286000  9113123.162748 
+289331.271796  9113117.130317 
+289312.149828  9113084.965299 
+289289.022453  9113048.777948 
+289270.901910  9113017.618478 
+289260.733139  9112986.467317 
+289260.422770  9112944.276608 
+289266.419919  9112813.693601 
+289266.390363  9112809.675438 
+289268.067957  9112767.486810 
+289266.830168  9112734.335924 
+289265.717990  9112718.262230 
+289264.672309  9112711.229403 
+289232.928691  9112584.624938 
+289183.356293  9112601.649964 
+289156.630160  9112616.689890 
+289130.890584  9112630.726308 
+289030.921362  9112687.879553 
+288926.041081  9112753.063732 
+288927.094095  9112761.101121 
+288931.165910  9112774.164369 
+288937.255185  9112791.247884 
+288947.342473  9112811.349216 
+288952.437796  9112828.431677 
+288956.561305  9112848.526716 
+288956.708953  9112868.617563 
+288955.810958  9112881.675567 
+288952.880734  9112888.704221 
+288945.937728  9112890.705972 
+288930.085925  9112897.721004 
+288909.286422  9112907.744417 
+288874.556591  9112915.744052 
+288849.677863  9112911.699646 
+288840.658347  9112901.644768 
+288830.740806  9112904.647897 
+288804.006973  9112918.683139 
+288767.348187  9112934.716944 
+288727.692704  9112948.738481 
+288682.102875  9112966.771847 
+288650.413842  9112982.810841 
+288653.565412  9113005.918513 
+288641.726271  9113017.960397 
+288627.884427  9113027.991084 
+288613.041229  9113037.016170 
+288601.194692  9113048.053504 
+288594.354892  9113064.118830 
+288590.445379  9113073.155510 
+288589.473533  9113076.168088 
+288589.606292  9113094.249885 
+288593.685447  9113108.317722 
+288598.817587  9113130.422965 
+288604.980590  9113157.551981 
+288605.128117  9113177.642864 
+288605.216634  9113189.697393 
+288603.457355  9113220.836154 
+288596.875727  9113272.060530 
+288584.876123  9113397.614855 
+288591.848739  9113399.631314 
+288603.783881  9113400.648490 
+288622.706395  9113405.691204 
+288647.607552  9113412.749307 
+288661.508518  9113410.754938 
+288670.476477  9113413.778030 
+288695.444057  9113429.876995 
+288726.427201  9113453.014043 
+288734.438094  9113461.058785 
+288748.368589  9113463.082561 
+288765.244118  9113460.086762 
+288784.078078  9113453.074882 
+288799.878414  9113439.028051 
+288813.683398  9113423.974578 
+288831.427377  9113403.902580 
+288853.176787  9113387.852937 
+288869.993206  9113376.820767 
+288890.829831  9113371.820033 
+288919.647811  9113370.845827 
+288942.509303  9113370.869874 
+288964.384199  9113371.897407 
+289000.196940  9113375.953172 
+289019.126834  9113382.000255 
+289035.000929  9113377.998782 
+289048.879677  9113372.990676 
+289060.748304  9113364.966857 
+289075.547142  9113349.914373 
+289080.472698  9113343.892336 
+289089.359382  9113335.865385 
+289103.134673  9113316.793688 
+289112.948828  9113299.726905 
+289127.725464  9113281.660788 
+289137.591325  9113271.625792 
+289143.503451  9113264.600252 
+289159.318372  9113252.562419 
+289178.122595  9113241.532245 
+289195.969783  9113235.523730 
+289215.804911  9113229.517289 
+289242.620016  9113226.531739 
+289261.490721  9113224.542403 
+289282.356761  9113223.559678 
+289290.293759  9113221.558905 
+289307.080413  9113206.508450 
+289329.727391  9113177.400655 
+289344.511288  9113160.339037 
+289358.367739  9113152.317239 
+289361.342259  9113151.315811 
+289336.286000  9113123.162748 
+Region 1
+113
+290148.265132  9112707.124089 
+290144.296712  9112708.124536 
+290131.404902  9112712.129389 
+290129.387357  9112708.109199 
+290124.350905  9112699.063260 
+290119.299641  9112688.008248 
+290114.337265  9112689.007669 
+290102.439412  9112693.013536 
+290077.634926  9112699.015165 
+290065.759283  9112706.034633 
+290039.003894  9112717.056878 
+290016.202106  9112725.069601 
+289991.442009  9112737.098410 
+289975.597908  9112745.118295 
+289960.710739  9112748.116516 
+289957.647420  9112737.063530 
+289950.519425  9112713.951993 
+289943.324811  9112681.799619 
+289929.017058  9112628.544767 
+289921.866901  9112602.419605 
+289919.812369  9112593.376714 
+289913.782016  9112584.329710 
+289899.770417  9112571.256330 
+289892.746117  9112562.208293 
+289884.742667  9112555.168301 
+289882.725152  9112551.148093 
+289876.709616  9112544.110157 
+289871.710238  9112540.086861 
+289867.727018  9112539.078207 
+289864.737754  9112538.070581 
+289855.792161  9112538.061316 
+289847.840523  9112538.053079 
+289835.913065  9112538.040721 
+289824.000406  9112540.037436 
+289812.080346  9112541.029610 
+289801.117242  9112537.000121 
+289795.116517  9112531.971246 
+289796.036480  9112521.926897 
+289800.932262  9112511.886672 
+289811.717774  9112491.807251 
+289818.564461  9112476.746397 
+289824.431990  9112463.693589 
+289823.341845  9112450.633565 
+289822.236903  9112435.564466 
+289827.110476  9112422.510627 
+289777.568214  9112443.554363 
+289733.937835  9112457.572483 
+289697.205927  9112463.561493 
+289640.668869  9112479.575176 
+289602.957748  9112487.572159 
+289574.177416  9112493.569361 
+289542.429991  9112501.572514 
+289516.631501  9112507.572792 
+289460.079491  9112521.577198 
+289404.550949  9112539.600741 
+289353.955190  9112552.606726 
+289295.415111  9112566.608870 
+289289.466137  9112568.611701 
+289239.871630  9112582.623157 
+289232.928691  9112584.624938 
+289264.672309  9112711.229403 
+289265.717990  9112718.262230 
+289266.830168  9112734.335924 
+289268.067957  9112767.486810 
+289266.390363  9112809.675438 
+289266.419919  9112813.693601 
+289260.422770  9112944.276608 
+289260.733139  9112986.467317 
+289270.901910  9113017.618478 
+289289.022453  9113048.777948 
+289312.149828  9113084.965299 
+289331.271796  9113117.130317 
+289336.286000  9113123.162748 
+289361.342259  9113151.315811 
+289404.995636  9113140.311489 
+289418.999952  9113152.380472 
+289422.975834  9113152.384616 
+289459.774925  9113155.436546 
+289501.536469  9113157.489077 
+289525.384356  9113156.509350 
+289563.110830  9113150.521376 
+289599.784132  9113136.496032 
+289637.421777  9113118.453540 
+289717.474388  9113056.255639 
+289704.360419  9113030.124254 
+289693.323193  9113016.049383 
+289700.251357  9113012.038444 
+289706.185554  9113008.026473 
+289712.119749  9113004.014502 
+289737.844449  9112987.968672 
+289740.811544  9112985.962685 
+289792.334892  9112963.916370 
+289850.919563  9112955.940727 
+289890.589274  9112943.927361 
+289927.269663  9112930.906350 
+289958.972807  9112916.875651 
+289969.876774  9112912.868781 
+290002.559037  9112896.830009 
+289998.509133  9112886.780544 
+290011.393605  9112881.771178 
+290021.311001  9112878.767811 
+290033.194099  9112872.752879 
+290043.074458  9112864.726825 
+290061.900460  9112856.709981 
+290077.722351  9112845.676452 
+290089.605431  9112839.661509 
+290104.448163  9112830.636023 
+290121.256584  9112818.598970 
+290143.057017  9112809.580630 
+290157.936770  9112805.577812 
+290177.778904  9112800.575558 
+290193.667425  9112798.582822 
+290148.265132  9112707.124089 
+Region 1
+106
+290678.369404  9112348.045961 
+290696.045314  9112318.932717 
+290654.284763  9112316.881119 
+290582.720659  9112316.808117 
+290538.964783  9112313.749847 
+290481.308479  9112312.686367 
+290437.567415  9112311.637066 
+290385.852534  9112307.565965 
+290349.039445  9112302.505569 
+290298.333323  9112300.444454 
+290247.627193  9112298.383282 
+290224.788623  9112301.373374 
+290195.978953  9112303.352780 
+290175.113455  9112304.335823 
+290146.325990  9112309.328807 
+290122.515663  9112315.331435 
+290107.643460  9112320.338743 
+290076.860666  9112324.325100 
+290054.029455  9112328.319648 
+290022.223081  9112328.286797 
+290011.289639  9112328.275499 
+289992.419405  9112330.265053 
+289986.455708  9112330.258887 
+289975.514862  9112329.243043 
+289968.564617  9112330.240384 
+289954.701133  9112337.257749 
+289931.951302  9112352.302151 
+289911.167154  9112364.334990 
+289893.342645  9112373.357299 
+289873.530226  9112382.377543 
+289852.716445  9112390.392211 
+289840.818624  9112394.397997 
+289829.053985  9112416.485461 
+289827.110476  9112422.510627 
+289822.236903  9112435.564466 
+289823.341845  9112450.633565 
+289824.431990  9112463.693589 
+289818.564461  9112476.746397 
+289811.717774  9112491.807251 
+289800.932262  9112511.886672 
+289796.036480  9112521.926897 
+289795.116517  9112531.971246 
+289801.117242  9112537.000121 
+289812.080346  9112541.029610 
+289824.000406  9112540.037436 
+289835.913065  9112538.040721 
+289847.840523  9112538.053079 
+289855.792161  9112538.061316 
+289864.737754  9112538.070581 
+289867.727018  9112539.078207 
+289871.710238  9112540.086861 
+289876.709616  9112544.110157 
+289882.725152  9112551.148093 
+289884.742667  9112555.168301 
+289892.746117  9112562.208293 
+289899.770417  9112571.256330 
+289913.782016  9112584.329710 
+289919.812369  9112593.376714 
+289921.866901  9112602.419605 
+289929.017058  9112628.544767 
+289943.324811  9112681.799619 
+289950.519425  9112713.951993 
+289957.647420  9112737.063530 
+289960.710739  9112748.116516 
+289975.597908  9112745.118295 
+289991.442009  9112737.098410 
+290016.202106  9112725.069601 
+290039.003894  9112717.056878 
+290065.759283  9112706.034633 
+290077.634926  9112699.015165 
+290102.439412  9112693.013536 
+290114.337265  9112689.007669 
+290119.299641  9112688.008248 
+290124.350905  9112699.063260 
+290129.387357  9112708.109199 
+290131.404902  9112712.129389 
+290144.296712  9112708.124536 
+290148.265132  9112707.124089 
+290193.667425  9112798.582822 
+290177.778904  9112800.575558 
+290157.936770  9112805.577812 
+290143.057017  9112809.580630 
+290121.256584  9112818.598970 
+290104.448163  9112830.636023 
+290089.605431  9112839.661509 
+290077.722351  9112845.676452 
+290061.900460  9112856.709981 
+290043.074458  9112864.726825 
+290033.194099  9112872.752879 
+290021.311001  9112878.767811 
+290011.393605  9112881.771178 
+289998.509133  9112886.780544 
+290002.559037  9112896.830009 
+290011.475070  9112892.821082 
+290047.131775  9112875.780821 
+290066.936927  9112865.755925 
+290292.966919  9112785.625831 
+290384.151550  9112750.560738 
+290448.617841  9112731.540632 
+290507.098078  9112709.500759 
+290527.748646  9112679.386035 
+290580.546962  9112560.905780 
+290618.695427  9112477.569002 
+290641.244729  9112435.401890 
+290666.634903  9112374.151679 
+290678.369404  9112348.045961 
+Region 1
+96
+289884.696746  9111469.271220 
+289886.507125  9111445.164376 
+289878.326441  9111414.015418 
+289871.258014  9111398.940102 
+289860.236057  9111386.874256 
+289849.191925  9111371.794792 
+289836.152549  9111355.708712 
+289822.119255  9111339.621590 
+289784.069065  9111301.409721 
+289764.064850  9111284.311807 
+289754.059052  9111275.260576 
+289733.068322  9111259.166144 
+289707.078411  9111239.048345 
+289687.096418  9111224.964002 
+289661.106544  9111204.846166 
+289647.132466  9111196.795279 
+289628.203537  9111190.748258 
+289610.275925  9111185.706809 
+289593.349628  9111181.670934 
+289569.443689  9111174.614133 
+289544.477356  9111158.515415 
+289522.551898  9111150.456131 
+289501.590833  9111138.379719 
+289450.686484  9111109.194742 
+289431.720685  9111098.124920 
+289416.642004  9111075.004786 
+289366.805506  9111055.866142 
+289328.057199  9111057.834338 
+289268.480724  9111065.807704 
+289197.993158  9111076.783056 
+289121.571475  9111091.770156 
+289054.080310  9111104.757546 
+288999.473281  9111112.735855 
+288935.942977  9111123.718220 
+288925.031879  9111126.720220 
+288999.150366  9111204.148209 
+289001.234089  9111217.209377 
+288969.031656  9111298.542535 
+288945.597574  9111355.776159 
+288940.701643  9111365.816312 
+288938.765390  9111372.846003 
+288931.874214  9111381.879501 
+288925.954849  9111387.900425 
+288919.026802  9111391.911206 
+288907.151199  9111398.930336 
+288765.423839  9111454.028989 
+288791.634739  9111504.283715 
+288729.628366  9111587.594172 
+288731.630986  9111589.605379 
+288740.650149  9111599.660352 
+288749.639833  9111605.697146 
+288759.652944  9111615.753172 
+288770.682113  9111628.823885 
+288781.681803  9111637.876417 
+288790.693615  9111646.926831 
+288801.693312  9111655.979357 
+288806.707251  9111662.011906 
+288809.718564  9111666.033252 
+288815.763309  9111677.089575 
+288826.814629  9111693.173897 
+288832.888876  9111708.248390 
+288837.954438  9111721.312738 
+288843.005258  9111732.367997 
+288848.078201  9111746.436885 
+288856.118230  9111758.499852 
+288861.080570  9111757.500586 
+289110.985782  9111680.416121 
+289216.523167  9111840.248384 
+289231.579965  9111860.354917 
+289241.607993  9111872.419880 
+289257.577538  9111881.477491 
+289283.560367  9111900.590962 
+289298.528599  9111908.642969 
+289310.515004  9111916.691835 
+289323.561825  9111933.782609 
+289329.577189  9111940.820660 
+289335.577783  9111945.849629 
+289343.529339  9111945.857980 
+289486.051403  9111863.635790 
+289503.868467  9111853.609128 
+289522.627739  9111836.551722 
+289547.328470  9111816.486934 
+289562.126728  9111801.434438 
+289604.747896  9111785.406498 
+289661.346772  9111642.822165 
+289704.012099  9111632.821408 
+289740.765536  9111629.846166 
+289761.342449  9111589.686388 
+289779.983218  9111556.556305 
+289784.901132  9111549.529717 
+289798.742262  9111539.498837 
+289812.568598  9111527.458877 
+289830.392838  9111518.436671 
+289861.093819  9111503.400685 
+289874.949705  9111495.378865 
+289884.696746  9111469.271220 
+Region 1
+102
+288925.031879  9111126.720220 
+288908.996333  9111108.621518 
+288905.985062  9111104.600171 
+288880.945214  9111078.455584 
+288840.098364  9111065.353096 
+288804.250642  9111056.274044 
+288791.314845  9111054.251169 
+288764.456690  9111051.208892 
+288720.731229  9111052.166721 
+288681.968031  9111052.125279 
+288631.270318  9111051.066491 
+288595.452067  9111046.005441 
+288533.828485  9111045.939371 
+288516.909606  9111042.907603 
+288490.088246  9111044.887885 
+288482.158898  9111047.892983 
+288470.253832  9111050.893810 
+288457.384278  9111057.911750 
+288440.583165  9111070.952690 
+288412.973936  9111101.059155 
+288389.318316  9111128.156250 
+288374.556539  9111148.231138 
+288371.589463  9111150.237023 
+288355.811661  9111167.297200 
+288341.020420  9111183.353898 
+288332.310518  9111215.489758 
+288338.531704  9111250.655304 
+288332.722648  9111271.744363 
+288321.855598  9111280.773516 
+288314.964286  9111289.806946 
+288305.113241  9111301.850806 
+288288.378228  9111323.932641 
+288282.502916  9111335.980780 
+288278.586040  9111344.012873 
+288261.851001  9111366.094704 
+288232.305124  9111403.230814 
+288212.617658  9111429.327612 
+288185.000725  9111458.429474 
+288169.185972  9111470.466889 
+288145.390260  9111478.477531 
+288112.678492  9111490.496694 
+288093.837748  9111496.503584 
+288083.927757  9111500.511037 
+288058.166186  9111511.533136 
+288045.369973  9111528.596483 
+288032.588460  9111547.668924 
+288012.922878  9111576.779320 
+288002.107166  9111592.840264 
+287990.297502  9111608.900132 
+287977.523302  9111628.977116 
+287965.728329  9111647.046078 
+287960.810078  9111654.072538 
+287952.961463  9111668.127608 
+287942.160419  9111686.197644 
+287936.277627  9111697.241221 
+288039.139554  9111763.652102 
+288067.095138  9111780.759462 
+288085.089191  9111794.842435 
+288099.166323  9111816.957491 
+288108.236939  9111834.044444 
+288117.336995  9111855.149583 
+288129.485136  9111885.298857 
+288143.635916  9111917.459358 
+288155.725224  9111939.572239 
+288161.791962  9111953.642318 
+288166.901553  9111972.734062 
+288166.953073  9111979.765891 
+288224.440299  9111957.727859 
+288245.254368  9111949.713917 
+288302.748859  9111928.680349 
+288450.508456  9111882.629966 
+288856.118230  9111758.499852 
+288848.078201  9111746.436885 
+288843.005258  9111732.367997 
+288837.954438  9111721.312738 
+288832.888876  9111708.248390 
+288826.814629  9111693.173897 
+288815.763309  9111677.089575 
+288809.718564  9111666.033252 
+288806.707251  9111662.011906 
+288801.693312  9111655.979357 
+288790.693615  9111646.926831 
+288781.681803  9111637.876417 
+288770.682113  9111628.823885 
+288759.652944  9111615.753172 
+288749.639833  9111605.697146 
+288740.650149  9111599.660352 
+288731.630986  9111589.605379 
+288729.628366  9111587.594172 
+288791.634739  9111504.283715 
+288765.423839  9111454.028989 
+288907.151199  9111398.930336 
+288919.026802  9111391.911206 
+288925.954849  9111387.900425 
+288931.874214  9111381.879501 
+288938.765390  9111372.846003 
+288940.701643  9111365.816312 
+288945.597574  9111355.776159 
+288969.031656  9111298.542535 
+289001.234089  9111217.209377 
+288999.150366  9111204.148209 
+288925.031879  9111126.720220 
+Region 1
+69
+289462.773181  9110995.695259 
+289443.755757  9110977.593647 
+289419.717062  9110952.455001 
+289396.694460  9110930.331007 
+289369.651911  9110902.175554 
+289336.653251  9110875.018322 
+289305.620333  9110844.849532 
+289276.575296  9110814.682813 
+289239.490419  9110772.453147 
+289197.391768  9110724.190914 
+289155.315333  9110678.942247 
+289119.268846  9110642.740737 
+289108.239907  9110629.670071 
+289084.179471  9110601.517527 
+289032.119887  9110550.230862 
+288975.135067  9110504.966071 
+288934.141398  9110471.772677 
+288893.184624  9110443.601949 
+288854.252554  9110420.456018 
+288811.403790  9110405.342144 
+288778.553095  9110398.275224 
+288741.741478  9110393.213106 
+288702.029114  9110399.197752 
+288629.620621  9110419.210783 
+288594.921935  9110431.227953 
+288589.967081  9110433.231703 
+288553.287896  9110446.251256 
+288516.638120  9110463.288968 
+288480.996944  9110482.336819 
+288425.550959  9110511.408686 
+288357.286932  9110554.530211 
+288340.493290  9110568.575626 
+288330.612940  9110576.601269 
+288324.671489  9110579.608470 
+288341.796160  9110610.767664 
+288349.857868  9110625.844447 
+288378.070214  9110678.110892 
+288404.419881  9110747.452450 
+288423.642923  9110793.681918 
+288436.769995  9110821.823120 
+288458.857131  9110851.983027 
+288480.900136  9110876.115642 
+288500.012915  9110907.276856 
+288516.129221  9110936.425763 
+288538.253289  9110971.608333 
+288559.354014  9111002.771635 
+288581.426609  9111030.922350 
+288595.452067  9111046.005441 
+288631.270318  9111051.066491 
+288681.968031  9111052.125279 
+288720.731229  9111052.166721 
+288764.456690  9111051.208892 
+288791.314845  9111054.251169 
+288804.250642  9111056.274044 
+288840.098364  9111065.353096 
+288880.945214  9111078.455584 
+288905.985062  9111104.600171 
+288908.996333  9111108.621518 
+288925.031879  9111126.720220 
+288935.942977  9111123.718220 
+288999.473281  9111112.735855 
+289054.080310  9111104.757546 
+289121.571475  9111091.770156 
+289197.993158  9111076.783056 
+289268.480724  9111065.807704 
+289328.057199  9111057.834338 
+289366.805506  9111055.866142 
+289416.642004  9111075.004786 
+289462.773181  9110995.695259 
+Region 1
+115
+288559.354014  9111002.771635 
+288538.253289  9110971.608333 
+288516.129221  9110936.425763 
+288500.012915  9110907.276856 
+288480.900136  9110876.115642 
+288458.857131  9110851.983027 
+288436.769995  9110821.823120 
+288423.642923  9110793.681918 
+288404.419881  9110747.452450 
+288378.070214  9110678.110892 
+288349.857868  9110625.844447 
+288341.796160  9110610.767664 
+288324.671489  9110579.608470 
+288301.906949  9110592.642888 
+288247.528140  9110631.761141 
+288202.043057  9110663.857198 
+288178.335978  9110683.922330 
+288144.711700  9110706.990331 
+288121.961735  9110722.033781 
+288087.350821  9110746.105225 
+288049.669885  9110758.118835 
+288029.879582  9110770.151842 
+288016.038122  9110780.182221 
+287985.329308  9110794.212439 
+287941.670030  9110804.210399 
+287903.024444  9110820.241023 
+287863.399590  9110838.279637 
+287831.652664  9110846.281392 
+287808.873115  9110857.306526 
+287747.535965  9110896.416767 
+287740.637211  9110904.445575 
+287706.180128  9110949.612357 
+287668.777901  9110999.798623 
+287656.334090  9111065.080278 
+287629.598084  9111214.727884 
+287628.736333  9111232.808705 
+287627.216036  9111432.710964 
+287616.693980  9111488.953854 
+287611.907886  9111514.062190 
+287568.142512  9111645.609499 
+287497.415461  9111760.050160 
+287373.117412  9111888.495813 
+287359.319527  9111904.553411 
+287380.633094  9111964.849330 
+287427.917027  9111906.637511 
+287461.439730  9111869.506043 
+287496.891528  9111824.340326 
+287526.504417  9111796.245451 
+287564.076214  9111769.163787 
+287705.781116  9111982.280921 
+287765.572713  9112003.441196 
+287789.486422  9112011.503460 
+287797.445406  9112012.516630 
+287869.820202  9111987.481512 
+287887.011560  9112027.681744 
+287894.108967  9112046.775694 
+287901.199028  9112064.865093 
+288166.953073  9111979.765891 
+288166.901553  9111972.734062 
+288161.791962  9111953.642318 
+288155.725224  9111939.572239 
+288143.635916  9111917.459358 
+288129.485136  9111885.298857 
+288117.336995  9111855.149583 
+288108.236939  9111834.044444 
+288099.166323  9111816.957491 
+288085.089191  9111794.842435 
+288067.095138  9111780.759462 
+288039.139554  9111763.652102 
+287936.277627  9111697.241221 
+287942.160419  9111686.197644 
+287952.961463  9111668.127608 
+287960.810078  9111654.072538 
+287965.728329  9111647.046078 
+287977.523302  9111628.977116 
+287990.297502  9111608.900132 
+288002.107166  9111592.840264 
+288012.922878  9111576.779320 
+288032.588460  9111547.668924 
+288045.369973  9111528.596483 
+288058.166186  9111511.533136 
+288083.927757  9111500.511037 
+288093.837748  9111496.503584 
+288112.678492  9111490.496694 
+288145.390260  9111478.477531 
+288169.185972  9111470.466889 
+288185.000725  9111458.429474 
+288212.617658  9111429.327612 
+288232.305124  9111403.230814 
+288261.851001  9111366.094704 
+288278.586040  9111344.012873 
+288282.502916  9111335.980780 
+288288.378228  9111323.932641 
+288305.113241  9111301.850806 
+288314.964286  9111289.806946 
+288321.855598  9111280.773516 
+288332.722648  9111271.744363 
+288338.531704  9111250.655304 
+288332.310518  9111215.489758 
+288341.020420  9111183.353898 
+288355.811661  9111167.297200 
+288371.589463  9111150.237023 
+288374.556539  9111148.231138 
+288389.318316  9111128.156250 
+288412.973936  9111101.059155 
+288440.583165  9111070.952690 
+288457.384278  9111057.911750 
+288470.253832  9111050.893810 
+288482.158898  9111047.892983 
+288490.088246  9111044.887885 
+288516.909606  9111042.907603 
+288533.828485  9111045.939371 
+288595.452067  9111046.005441 
+288581.426609  9111030.922350 
+288559.354014  9111002.771635 
+Region 1
+151
+287894.108967  9112046.775694 
+287887.011560  9112027.681744 
+287869.820202  9111987.481512 
+287797.445406  9112012.516630 
+287789.486422  9112011.503460 
+287765.572713  9112003.441196 
+287705.781116  9111982.280921 
+287564.076214  9111769.163787 
+287526.504417  9111796.245451 
+287496.891528  9111824.340326 
+287461.439730  9111869.506043 
+287427.917027  9111906.637511 
+287380.633094  9111964.849330 
+287359.319527  9111904.553411 
+287334.683568  9111933.658209 
+287279.491863  9111997.888565 
+287191.969079  9112126.374262 
+287188.037275  9112132.397215 
+287151.730416  9112196.648221 
+287144.860748  9112208.695216 
+287118.654864  9112295.057284 
+287070.390883  9112355.276975 
+286993.382435  9112426.515040 
+286947.098760  9112485.732300 
+286926.621526  9112539.955221 
+286927.061673  9112600.228434 
+286932.625773  9112681.602733 
+286873.390809  9112736.787571 
+286813.825649  9112746.767432 
+286811.896372  9112754.801675 
+286813.022367  9112772.884743 
+286813.139718  9112788.957608 
+286815.186348  9112796.996231 
+286820.266252  9112812.070015 
+286823.328866  9112823.123394 
+286837.537959  9112863.320873 
+286838.561278  9112867.340182 
+286846.527773  9112869.358042 
+286872.305171  9112860.345493 
+286895.107961  9112852.334206 
+286916.946112  9112848.340031 
+286968.537517  9112835.337619 
+286989.366991  9112829.333215 
+287004.232601  9112823.322259 
+287023.037413  9112812.292896 
+287056.693125  9112793.243453 
+287062.701017  9112799.277307 
+287070.696860  9112805.313338 
+287079.694022  9112812.355009 
+287085.694578  9112817.384306 
+287092.681770  9112821.410138 
+287105.662182  9112829.460710 
+287123.634501  9112840.530373 
+287144.552045  9112846.580529 
+287307.328952  9112814.612939 
+287306.305595  9112810.593649 
+287306.239485  9112801.552687 
+287305.157366  9112789.496986 
+287306.070540  9112778.448005 
+287306.924952  9112759.362613 
+287307.838127  9112748.313633 
+287309.782001  9112742.288493 
+287311.689149  9112731.240597 
+287314.538851  9112713.161926 
+287318.353145  9112691.066134 
+287320.223565  9112674.995481 
+287324.103963  9112661.940652 
+287328.970984  9112647.882355 
+287330.907509  9112640.852665 
+287337.835920  9112636.842051 
+287344.779021  9112634.840538 
+287350.713459  9112630.828838 
+287369.525429  9112620.803920 
+287376.453833  9112616.793302 
+287388.300659  9112605.756242 
+287400.147479  9112594.719181 
+287408.975654  9112578.656114 
+287414.821919  9112562.589798 
+287422.582651  9112536.480139 
+287432.426819  9112523.431807 
+287437.359921  9112518.414467 
+287446.217460  9112506.369602 
+287460.044828  9112494.330149 
+287464.977924  9112489.312807 
+287466.936467  9112485.296769 
+287461.878471  9112473.236750 
+287458.771674  9112456.156140 
+287453.698991  9112442.087017 
+287448.604272  9112425.004240 
+287446.564917  9112417.970218 
+287449.495386  9112410.941612 
+287453.441858  9112406.927741 
+287463.359463  9112403.924918 
+287468.343979  9112405.939433 
+287472.349225  9112409.961966 
+287478.371789  9112418.004865 
+287484.423745  9112430.065966 
+287495.438182  9112441.127925 
+287505.436616  9112449.175146 
+287509.434521  9112452.193124 
+287523.430866  9112463.258317 
+287546.358210  9112472.324130 
+287561.289739  9112475.353987 
+287586.175624  9112480.403736 
+287601.107156  9112483.433579 
+287620.007200  9112485.463182 
+287637.913279  9112487.491699 
+287642.868403  9112485.487992 
+287651.718523  9112472.438551 
+287656.614834  9112462.398446 
+287663.477017  9112449.346849 
+287666.407450  9112442.318236 
+287659.405593  9112436.283391 
+287650.437862  9112433.260036 
+287642.471448  9112431.242308 
+287632.517105  9112429.222420 
+287624.550692  9112427.204688 
+287615.421260  9112402.081229 
+287612.395269  9112396.050691 
+287602.352738  9112381.976195 
+287600.276616  9112369.919436 
+287615.112561  9112359.890134 
+287627.010712  9112355.884889 
+287636.898885  9112348.863834 
+287639.873421  9112347.862522 
+287644.821181  9112344.854268 
+287644.799130  9112341.840619 
+287646.720900  9112332.801830 
+287642.708301  9112327.774764 
+287641.684939  9112323.755486 
+287638.681003  9112320.738599 
+287631.664471  9112312.694644 
+287627.659226  9112308.672126 
+287618.647426  9112299.621459 
+287614.656881  9112297.608039 
+287590.706273  9112284.522962 
+287572.734138  9112273.453455 
+287552.737350  9112257.359025 
+287596.965868  9112189.098271 
+287625.893565  9112203.193308 
+287653.739119  9112205.232647 
+287677.542682  9112198.226705 
+287701.338885  9112190.216202 
+287729.140314  9112186.228199 
+287767.889977  9112184.261129 
+287808.627544  9112182.296180 
+287829.493302  9112181.314230 
+287853.318866  9112177.321851 
+287924.516007  9112127.171808 
+287901.199028  9112064.865093 
+287894.108967  9112046.775694 
+Region 1
+115
+290127.731185  9110189.753109 
+290074.950899  9110175.634661 
+290077.747800  9110150.524331 
+290080.448606  9110112.355012 
+290080.396862  9110105.323249 
+290086.895867  9110043.049176 
+290031.148850  9110030.936596 
+289829.187895  9110003.602752 
+289709.801833  9109987.404774 
+289560.561892  9109966.152288 
+289555.592393  9109966.147041 
+289398.386523  9109942.876506 
+289203.382984  9109915.547047 
+289064.096870  9109896.312468 
+289008.394216  9109890.225778 
+288983.524592  9109887.185593 
+288957.668432  9109885.148874 
+288939.697193  9109874.079753 
+288930.693164  9109866.033829 
+288923.713764  9109863.012751 
+288904.800190  9109858.974357 
+288885.916074  9109858.954130 
+288845.173495  9109859.915002 
+288784.560239  9109861.859047 
+288712.027496  9109864.794736 
+288654.388532  9109865.737268 
+288620.603210  9109866.705428 
+288640.893346  9109922.981383 
+288647.946339  9109936.047962 
+288651.995547  9109946.097694 
+288663.090401  9109968.209455 
+288684.315685  9110016.450071 
+288694.578611  9110060.660741 
+288696.610589  9110066.690147 
+288704.738509  9110090.807771 
+288713.911879  9110121.958273 
+288718.115725  9110153.103436 
+288716.385576  9110188.260375 
+288717.629799  9110222.415970 
+288720.795588  9110247.532793 
+288726.957843  9110274.661902 
+288734.143472  9110305.810253 
+288734.268646  9110322.887515 
+288735.402460  9110341.974931 
+288740.681291  9110384.171138 
+288741.741478  9110393.213106 
+288778.553095  9110398.275224 
+288811.403790  9110405.342144 
+288854.252554  9110420.456018 
+288893.184624  9110443.601949 
+288934.141398  9110471.772677 
+288975.135067  9110504.966071 
+289032.119887  9110550.230862 
+289084.179471  9110601.517527 
+289108.239907  9110629.670071 
+289119.268846  9110642.740737 
+289155.315333  9110678.942247 
+289197.391768  9110724.190914 
+289239.490419  9110772.453147 
+289276.575296  9110814.682813 
+289305.620333  9110844.849532 
+289336.653251  9110875.018322 
+289369.651911  9110902.175554 
+289396.694460  9110930.331007 
+289419.717062  9110952.455001 
+289443.755757  9110977.593647 
+289462.773181  9110995.695259 
+289469.774941  9111001.729824 
+289491.781540  9111020.839097 
+289526.738702  9111043.980096 
+289560.672430  9111063.101856 
+289565.671593  9111067.125234 
+289585.660865  9111082.214197 
+289611.576761  9111092.286704 
+289645.451448  9111103.372067 
+289690.214981  9111108.441612 
+289738.917260  9111108.492573 
+289774.654174  9111102.502747 
+289808.395834  9111095.506281 
+289835.106098  9111078.457146 
+289853.887138  9111064.413317 
+289885.530008  9111042.346655 
+289909.214082  9111019.267150 
+289926.934610  9110996.181424 
+289950.566883  9110966.070142 
+289967.278664  9110940.974298 
+289983.018692  9110918.891030 
+289992.743439  9110889.769786 
+290003.499066  9110865.672265 
+290006.436451  9110859.648144 
+290024.112509  9110830.535178 
+290036.752415  9110792.376201 
+290038.621930  9110776.305669 
+290041.492754  9110761.240710 
+290042.213068  9110724.073856 
+290040.047775  9110699.962885 
+290035.887268  9110674.845305 
+290034.664142  9110643.703604 
+290030.422321  9110607.536107 
+290032.188337  9110577.402048 
+290031.157460  9110572.378324 
+290023.021346  9110547.256594 
+290032.783009  9110523.158050 
+290040.408983  9110478.966680 
+290057.105805  9110451.861776 
+290079.736478  9110420.744934 
+290084.646863  9110412.713811 
+290098.398891  9110390.628483 
+290113.144813  9110368.544189 
+290126.867240  9110342.440709 
+290141.576164  9110315.333725 
+290163.101899  9110269.147777 
+290177.655495  9110220.945514 
+290183.485801  9110202.870054 
+290127.731185  9110189.753109 
+Region 1
+145
+288741.741478  9110393.213106 
+288740.681291  9110384.171138 
+288735.402460  9110341.974931 
+288734.268646  9110322.887515 
+288734.143472  9110305.810253 
+288726.957843  9110274.661902 
+288720.795588  9110247.532793 
+288717.629799  9110222.415970 
+288716.385576  9110188.260375 
+288718.115725  9110153.103436 
+288713.911879  9110121.958273 
+288704.738509  9110090.807771 
+288696.610589  9110066.690147 
+288694.578611  9110060.660741 
+288684.315685  9110016.450071 
+288663.090401  9109968.209455 
+288651.995547  9109946.097694 
+288647.946339  9109936.047962 
+288640.893346  9109922.981383 
+288620.603210  9109866.705428 
+288612.453328  9109839.574129 
+288589.152157  9109779.276744 
+288568.847476  9109720.991640 
+288546.569778  9109664.713458 
+288518.159616  9109585.324242 
+288507.955907  9109549.149828 
+288487.776501  9109507.941923 
+288397.120396  9109343.099337 
+288388.057768  9109327.016879 
+288362.872407  9109280.780734 
+288290.320390  9109145.089026 
+288210.708864  9108995.325826 
+288168.067246  9109008.338319 
+288111.525869  9109023.344670 
+288070.864608  9109035.354707 
+288016.332933  9109053.376777 
+288008.403850  9109056.381719 
+287931.042024  9109078.396862 
+287905.615137  9108999.010167 
+287877.214051  9108920.624707 
+287847.863220  9108848.265413 
+287840.751997  9108827.162205 
+287827.516126  9108783.952323 
+287802.951583  9108686.484660 
+287786.506870  9108612.130386 
+287771.224750  9108560.881858 
+287754.860826  9108497.577607 
+287709.223116  9108508.577196 
+287692.341860  9108510.567634 
+287673.458186  9108510.546767 
+287640.638237  9108507.496849 
+287618.750942  9108504.459005 
+287589.862538  9108495.386137 
+287522.095696  9108470.197451 
+287429.394092  9108432.926412 
+287343.671705  9108398.676551 
+287269.905212  9108368.458009 
+287025.732410  9108275.766790 
+287047.671723  9108422.455196 
+287048.687547  9108425.469974 
+287080.924464  9108621.392614 
+287154.458645  9108756.083916 
+287149.540450  9108763.110252 
+287090.573231  9108854.458143 
+287055.107911  9108897.614033 
+286986.157543  9108982.923442 
+286982.218560  9108987.941772 
+286948.623769  9109015.026965 
+286950.713981  9109029.092961 
+286896.474147  9109087.295995 
+286892.564407  9109096.332543 
+286878.759607  9109111.385295 
+286870.779187  9109107.358169 
+286840.881878  9109096.274654 
+286808.185731  9109110.301669 
+286734.951873  9109153.415057 
+286800.447451  9109276.043354 
+286803.480349  9109283.078586 
+286734.711156  9109256.883231 
+286591.187624  9109201.471766 
+286545.607223  9109357.125527 
+286466.935476  9109335.941352 
+286442.621321  9109409.246039 
+286413.746959  9109402.181617 
+286393.203749  9109447.363167 
+286326.699756  9109459.342654 
+286307.822851  9109460.325867 
+286225.268907  9109725.433804 
+286148.539081  9109971.461915 
+286151.579265  9109979.501760 
+286164.595155  9109992.575642 
+286189.516158  9110002.649323 
+286194.500360  9110004.664057 
+286197.467505  9110002.658310 
+286274.028429  9110006.762967 
+286611.097992  9110025.223921 
+286866.636873  9110039.573267 
+286953.122153  9110041.678715 
+286989.904334  9110042.724190 
+287039.761206  9110064.879632 
+287082.704659  9110093.054607 
+287115.899481  9110147.336902 
+287147.099230  9110200.612396 
+287168.345220  9110251.867739 
+287170.377026  9110257.897260 
+287296.091520  9110187.718156 
+287301.053772  9110186.719093 
+287404.813162  9110376.692401 
+287477.336408  9110508.367416 
+287494.460533  9110539.527078 
+287513.579870  9110571.693461 
+287585.051200  9110695.330644 
+287656.442215  9110807.917560 
+287727.613304  9110890.367774 
+287740.637211  9110904.445575 
+287747.535965  9110896.416767 
+287808.873115  9110857.306526 
+287831.652664  9110846.281392 
+287863.399590  9110838.279637 
+287903.024444  9110820.241023 
+287941.670030  9110804.210399 
+287985.329308  9110794.212439 
+288016.038122  9110780.182221 
+288029.879582  9110770.151842 
+288049.669885  9110758.118835 
+288087.350821  9110746.105225 
+288121.961735  9110722.033781 
+288144.711700  9110706.990331 
+288178.335978  9110683.922330 
+288202.043057  9110663.857198 
+288247.528140  9110631.761141 
+288301.906949  9110592.642888 
+288324.671489  9110579.608470 
+288330.612940  9110576.601269 
+288340.493290  9110568.575626 
+288357.286932  9110554.530211 
+288425.550959  9110511.408686 
+288480.996944  9110482.336819 
+288516.638120  9110463.288968 
+288553.287896  9110446.251256 
+288589.967081  9110433.231703 
+288594.921935  9110431.227953 
+288629.620621  9110419.210783 
+288702.029114  9110399.197752 
+288741.741478  9110393.213106 
+Region 1
+52
+289008.394216  9109890.225778 
+289002.283477  9109870.128535 
+288968.748197  9109769.639096 
+288956.482629  9109723.417316 
+288953.419925  9109712.364142 
+288936.111281  9109656.091586 
+288924.920697  9109620.920830 
+288916.763363  9109592.785072 
+288891.363811  9109517.417605 
+288888.286424  9109504.355330 
+288873.915506  9109442.058640 
+288855.517561  9109372.725852 
+288835.212876  9109314.440895 
+288833.195659  9109310.420579 
+288813.951168  9109261.177570 
+288784.414677  9109163.705677 
+288754.922501  9109072.261002 
+288753.899190  9109068.241750 
+288726.446434  9108983.830986 
+288710.095661  9108922.536537 
+288688.716721  9108853.200334 
+288651.030170  9108864.209500 
+288598.472144  9108880.225229 
+288556.817357  9108892.234568 
+288487.399995  9108913.254606 
+288373.353321  9108947.285052 
+288242.447092  9108986.319573 
+288210.708864  9108995.325826 
+288290.320390  9109145.089026 
+288362.872407  9109280.780734 
+288388.057768  9109327.016879 
+288397.120396  9109343.099337 
+288487.776501  9109507.941923 
+288507.955907  9109549.149828 
+288518.159616  9109585.324242 
+288546.569778  9109664.713458 
+288568.847476  9109720.991640 
+288589.152157  9109779.276744 
+288612.453328  9109839.574129 
+288620.603210  9109866.705428 
+288654.388532  9109865.737268 
+288712.027496  9109864.794736 
+288784.560239  9109861.859047 
+288845.173495  9109859.915002 
+288885.916074  9109858.954130 
+288904.800190  9109858.974357 
+288923.713764  9109863.012751 
+288930.693164  9109866.033829 
+288939.697193  9109874.079753 
+288957.668432  9109885.148874 
+288983.524592  9109887.185593 
+289008.394216  9109890.225778 
+Region 1
+109
+290508.348727  9108429.210473 
+290496.972760  9108368.926899 
+290295.499866  9108406.888370 
+290076.122119  9108442.821119 
+290062.244941  9108447.829168 
+290054.389999  9108460.879800 
+290043.523933  9108469.909138 
+290033.592672  9108470.903212 
+290019.604759  9108460.843169 
+290013.530856  9108445.768805 
+290014.502577  9108442.756236 
+289926.872828  9108419.559595 
+289831.306976  9108398.363431 
+289827.324144  9108397.354686 
+289592.388852  9108344.869771 
+289510.751986  9108325.696733 
+289483.050029  9108478.356349 
+289478.441799  9108527.573596 
+289488.844797  9108590.870299 
+289491.951703  9108607.950679 
+289499.174138  9108644.121577 
+289495.397665  9108671.239966 
+289484.583008  9108687.300997 
+289476.713109  9108698.342493 
+289440.234628  9108738.485012 
+289408.703348  9108775.619184 
+289349.594038  9108846.878110 
+289327.883492  9108867.950178 
+289295.269747  9108893.028743 
+289263.605638  9108912.081098 
+289231.904667  9108926.110723 
+289215.038196  9108930.110838 
+289199.143502  9108931.098381 
+289169.349230  9108934.080121 
+289088.992279  9108954.084793 
+288986.836097  9108983.106764 
+288946.204736  9108999.135704 
+288910.528029  9109013.160869 
+288813.363001  9109045.201481 
+288753.899190  9109068.241750 
+288754.922501  9109072.261002 
+288784.414677  9109163.705677 
+288813.951168  9109261.177570 
+288833.195659  9109310.420579 
+288835.212876  9109314.440895 
+288855.517561  9109372.725852 
+288873.915506  9109442.058640 
+288888.286424  9109504.355330 
+288891.363811  9109517.417605 
+288916.763363  9109592.785072 
+288924.920697  9109620.920830 
+288936.111281  9109656.091586 
+288953.419925  9109712.364142 
+288956.482629  9109723.417316 
+288968.748197  9109769.639096 
+289002.283477  9109870.128535 
+289008.394216  9109890.225778 
+289064.096870  9109896.312468 
+289203.382984  9109915.547047 
+289398.386523  9109942.876506 
+289555.592393  9109966.147041 
+289560.561892  9109966.152288 
+289709.801833  9109987.404774 
+289829.187895  9110003.602752 
+290031.148850  9110030.936596 
+290086.895867  9110043.049176 
+290080.396862  9110105.323249 
+290080.448606  9110112.355012 
+290077.747800  9110150.524331 
+290074.950899  9110175.634661 
+290127.731185  9110189.753109 
+290183.485801  9110202.870054 
+290190.302611  9110183.791091 
+290199.871881  9110133.574585 
+290200.569997  9110093.394140 
+290201.149812  9110037.141102 
+290201.833159  9109994.951582 
+290199.534825  9109952.758956 
+290193.320071  9109918.598482 
+290178.101139  9109876.392382 
+290164.951345  9109845.238254 
+290152.751117  9109808.057930 
+290137.606194  9109775.897172 
+290126.392520  9109737.713330 
+290118.130983  9109695.514445 
+290101.792724  9109636.230102 
+290101.681879  9109621.162035 
+290101.327182  9109572.944223 
+290097.916947  9109514.677912 
+290101.656048  9109482.536861 
+290112.086350  9109414.239730 
+290122.634862  9109362.015206 
+290125.527848  9109349.963873 
+290132.196870  9109310.794181 
+290140.809321  9109265.599345 
+290144.637075  9109245.512751 
+290155.979949  9109166.166757 
+290179.315837  9109095.874089 
+290195.783209  9109037.628594 
+290200.634371  9109021.561194 
+290215.387340  9109000.481507 
+290242.942436  9108963.342735 
+290290.345391  9108922.206584 
+290316.030885  9108901.138305 
+290404.976700  9108832.923171 
+290469.958492  9108749.615035 
+290517.689452  9108618.071540 
+290525.255919  9108565.843950 
+290508.348727  9108429.210473 
+Region 1
+88
+289551.137326  9108005.293537 
+289349.156358  9108109.549331 
+289245.920059  9108126.515831 
+289239.971619  9108128.518522 
+289182.511702  9108153.570247 
+289137.935119  9108173.613081 
+289103.260322  9108188.643847 
+289019.593308  9107892.215567 
+288962.177599  9107923.294240 
+288954.263510  9107928.308378 
+288926.516379  9107939.328312 
+288900.756949  9107950.350381 
+288800.715358  9107996.450858 
+288752.163209  9108016.489009 
+288713.527574  9108033.524261 
+288661.021925  9108056.571660 
+288622.584606  9108100.729604 
+288567.413153  9108166.969193 
+288497.311501  9108230.178885 
+288458.697590  9108250.227624 
+288419.163216  9108280.320730 
+288418.323587  9108301.415144 
+288391.481777  9108300.381344 
+288350.703765  9108296.318700 
+288316.868152  9108290.254520 
+288310.079941  9108313.351527 
+288294.361577  9108338.447860 
+288260.863641  9108378.592866 
+288224.156458  9108387.593597 
+288200.347572  9108393.594794 
+288065.408366  9108424.587723 
+287914.603554  9108460.585549 
+287854.079821  9108474.582515 
+287778.677211  9108492.581169 
+287754.860826  9108497.577607 
+287771.224750  9108560.881858 
+287786.506870  9108612.130386 
+287802.951583  9108686.484660 
+287827.516126  9108783.952323 
+287840.751997  9108827.162205 
+287847.863220  9108848.265413 
+287877.214051  9108920.624707 
+287905.615137  9108999.010167 
+287931.042024  9109078.396862 
+288008.403850  9109056.381719 
+288016.332933  9109053.376777 
+288070.864608  9109035.354707 
+288111.525869  9109023.344670 
+288168.067246  9109008.338319 
+288210.708864  9108995.325826 
+288242.447092  9108986.319573 
+288373.353321  9108947.285052 
+288487.399995  9108913.254606 
+288556.817357  9108892.234568 
+288598.472144  9108880.225229 
+288651.030170  9108864.209500 
+288688.716721  9108853.200334 
+288710.095661  9108922.536537 
+288726.446434  9108983.830986 
+288753.899190  9109068.241750 
+288813.363001  9109045.201481 
+288910.528029  9109013.160869 
+288946.204736  9108999.135704 
+288986.836097  9108983.106764 
+289088.992279  9108954.084793 
+289169.349230  9108934.080121 
+289199.143502  9108931.098381 
+289215.038196  9108930.110838 
+289231.904667  9108926.110723 
+289263.605638  9108912.081098 
+289295.269747  9108893.028743 
+289327.883492  9108867.950178 
+289349.594038  9108846.878110 
+289408.703348  9108775.619184 
+289440.234628  9108738.485012 
+289476.713109  9108698.342493 
+289484.583008  9108687.300997 
+289495.397665  9108671.239966 
+289499.174138  9108644.121577 
+289491.951703  9108607.950679 
+289488.844797  9108590.870299 
+289478.441799  9108527.573596 
+289483.050029  9108478.356349 
+289510.751986  9108325.696733 
+289541.324923  9108157.972188 
+289556.651891  9108079.634902 
+289571.927255  9107994.265830 
+289551.137326  9108005.293537 
+Region 1
+46
+290469.525328  9107745.085871 
+290451.569618  9107736.026303 
+290412.853942  9107742.012902 
+290378.386896  9107785.171516 
+290324.574522  9107900.635945 
+290263.273303  9107943.766349 
+290228.429436  9107935.693483 
+290200.365359  9107903.518995 
+290008.997871  9107693.370157 
+289918.941249  9107745.510471 
+289885.297873  9107765.565456 
+289844.749128  9107792.644823 
+289822.023289  9107810.702290 
+289803.294954  9107831.777592 
+289777.690738  9107863.895445 
+289756.106132  9107902.044758 
+289731.606282  9107949.231765 
+289721.763573  9107962.280232 
+289701.960193  9107972.304512 
+289679.131011  9107976.298369 
+289665.231779  9107978.292651 
+289576.881798  9107992.262043 
+289571.927255  9107994.265830 
+289556.651891  9108079.634902 
+289541.324923  9108157.972188 
+289510.751986  9108325.696733 
+289592.388852  9108344.869771 
+289827.324144  9108397.354686 
+289831.306976  9108398.363431 
+289926.872828  9108419.559595 
+290014.502577  9108442.756236 
+290013.530856  9108445.768805 
+290019.604759  9108460.843169 
+290033.592672  9108470.903212 
+290043.523933  9108469.909138 
+290054.389999  9108460.879800 
+290062.244941  9108447.829168 
+290076.122119  9108442.821119 
+290295.499866  9108406.888370 
+290496.972760  9108368.926899 
+290485.604233  9108309.647850 
+290474.372376  9108133.843602 
+290501.753161  9107937.989123 
+290546.465248  9107801.419973 
+290503.456463  9107764.207437 
+290469.525328  9107745.085871 
+Region 1
+65
+289182.511702  9108153.570247 
+289239.971619  9108128.518522 
+289147.440224  9107843.131029 
+289141.359361  9107827.051912 
+289086.786327  9107703.435193 
+289085.623282  9107680.329606 
+289080.639311  9107678.315159 
+289049.741639  9107666.227391 
+289012.041462  9107675.227521 
+288938.643453  9107695.238936 
+288893.014438  9107707.244014 
+288837.527709  9107730.288283 
+288810.340835  9107682.041009 
+288791.200389  9107646.861427 
+288751.911054  9107574.492044 
+288735.737570  9107537.306562 
+288732.711934  9107531.276045 
+288710.472537  9107480.020415 
+288643.133163  9107513.096897 
+288634.203199  9107515.096249 
+288627.260935  9107517.097764 
+288590.525181  9107522.080427 
+288546.883855  9107534.087302 
+288361.407858  9107585.116108 
+288298.927163  9107603.129384 
+288240.414481  9107620.142399 
+288212.784625  9107647.234674 
+288185.074040  9107663.276899 
+288066.302609  9107730.450574 
+287950.417044  9107784.568153 
+287989.940176  9107889.084090 
+288044.606220  9108025.761930 
+288082.105485  9108125.252742 
+288159.428963  9108098.214989 
+288188.830834  9108177.605943 
+288195.875976  9108189.668149 
+288201.366421  9108260.996549 
+288206.842230  9108330.315845 
+288210.971862  9108351.415716 
+288215.064796  9108367.492842 
+288224.156458  9108387.593597 
+288260.863641  9108378.592866 
+288294.361577  9108338.447860 
+288310.079941  9108313.351527 
+288316.868152  9108290.254520 
+288350.703765  9108296.318700 
+288391.481777  9108300.381344 
+288418.323587  9108301.415144 
+288419.163216  9108280.320730 
+288458.697590  9108250.227624 
+288497.311501  9108230.178885 
+288567.413153  9108166.969193 
+288622.584606  9108100.729604 
+288661.021925  9108056.571660 
+288713.527574  9108033.524261 
+288752.163209  9108016.489009 
+288800.715358  9107996.450858 
+288900.756949  9107950.350381 
+288926.516379  9107939.328312 
+288954.263510  9107928.308378 
+288962.177599  9107923.294240 
+289019.593308  9107892.215567 
+289103.260322  9108188.643847 
+289137.935119  9108173.613081 
+289182.511702  9108153.570247 
+Region 1
+89
+288210.971862  9108351.415716 
+288206.842230  9108330.315845 
+288201.366421  9108260.996549 
+288195.875976  9108189.668149 
+288188.830834  9108177.605943 
+288159.428963  9108098.214989 
+288082.105485  9108125.252742 
+288044.606220  9108025.761930 
+287989.940176  9107889.084090 
+287950.417044  9107784.568153 
+288066.302609  9107730.450574 
+288062.209838  9107714.373404 
+288024.403234  9107572.691368 
+287999.876250  9107480.246456 
+287995.812869  9107468.187467 
+287977.425071  9107399.858301 
+287948.820360  9107293.345209 
+287917.168355  9107177.787806 
+287912.001289  9107150.659434 
+287914.858268  9107133.585372 
+287921.734591  9107122.543016 
+287947.457334  9107106.498806 
+287946.038501  9107048.233770 
+287946.929765  9107034.171161 
+287948.807545  9107019.105102 
+287964.152166  9106942.776859 
+287977.589682  9106877.496475 
+287991.999039  9106809.203544 
+288013.028200  9106694.708999 
+287879.189909  9106739.765037 
+287767.157149  9106776.808650 
+287716.566532  9106789.811418 
+287645.134509  9106806.809081 
+287563.785951  9106826.809206 
+287488.393021  9106845.811315 
+287301.784648  9106877.747740 
+287242.249066  9106890.739995 
+287215.444514  9106894.728060 
+287140.986567  9106905.694325 
+287092.449000  9106791.121290 
+286803.987277  9106620.021904 
+286773.046847  9106601.904907 
+286770.109117  9106607.928866 
+286751.452392  9106639.048700 
+286727.833733  9106671.167444 
+286710.112420  9106694.251942 
+286677.665870  9106742.433434 
+286636.362210  9106802.659439 
+286586.215970  9106876.939066 
+286576.386933  9106891.996127 
+286560.638574  9106913.073748 
+286551.796076  9106927.127381 
+286456.421148  9107068.660304 
+286360.051826  9107210.192025 
+286319.785006  9107276.446421 
+286313.996873  9107300.549038 
+286310.145408  9107317.622008 
+286308.259783  9107331.683571 
+286308.376460  9107347.756522 
+286307.455525  9107357.800981 
+286507.928982  9107455.470770 
+286757.299553  9107580.317579 
+286798.932180  9107565.296401 
+286888.145875  9107533.251564 
+286962.458828  9107502.194345 
+287031.539773  9107708.204266 
+287127.982590  9107986.571926 
+287190.831565  9108155.406024 
+287191.847387  9108158.420797 
+287231.354824  9108260.928614 
+287269.905212  9108368.458009 
+287343.671705  9108398.676551 
+287429.394092  9108432.926412 
+287522.095696  9108470.197451 
+287589.862538  9108495.386137 
+287618.750942  9108504.459005 
+287640.638237  9108507.496849 
+287673.458186  9108510.546767 
+287692.341860  9108510.567634 
+287709.223116  9108508.577196 
+287754.860826  9108497.577607 
+287778.677211  9108492.581169 
+287854.079821  9108474.582515 
+287914.603554  9108460.585549 
+288065.408366  9108424.587723 
+288200.347572  9108393.594794 
+288224.156458  9108387.593597 
+288215.064796  9108367.492842 
+288210.971862  9108351.415716 
+Region 1
+67
+289012.041462  9107675.227521 
+288991.664358  9107606.897012 
+288975.387736  9107555.648039 
+288957.020536  9107490.333270 
+288951.882197  9107467.223357 
+288948.783024  9107451.147410 
+288931.056941  9107337.615518 
+288919.588071  9107264.271868 
+288910.356837  9107225.084903 
+288909.311547  9107218.052008 
+288904.187995  9107196.951165 
+288856.542357  9107204.935753 
+288843.284398  9107158.712619 
+288830.939498  9107101.440551 
+288827.766953  9107075.319118 
+288817.174714  9106985.903725 
+288804.254821  9106985.889667 
+288690.993981  9106990.788971 
+288671.552990  9106914.422819 
+288660.283039  9106868.201730 
+288628.524330  9106874.194273 
+288556.069678  9106887.174058 
+288550.113995  9106888.172080 
+288452.776634  9106896.101774 
+288371.325932  9106902.039635 
+288298.893066  9106918.032680 
+288256.267981  9106933.053896 
+288215.601209  9106944.059071 
+288184.850819  9106952.061520 
+288082.690458  9106980.075982 
+288064.889262  9106992.110825 
+288057.004490  9107001.142992 
+288014.650358  9107053.332377 
+287993.955522  9107077.418511 
+287969.219333  9107092.459289 
+287947.457334  9107106.498806 
+287921.734591  9107122.543016 
+287914.858268  9107133.585372 
+287912.001289  9107150.659434 
+287917.168355  9107177.787806 
+287948.820360  9107293.345209 
+287977.425071  9107399.858301 
+287995.812869  9107468.187467 
+287999.876250  9107480.246456 
+288024.403234  9107572.691368 
+288062.209838  9107714.373404 
+288066.302609  9107730.450574 
+288185.074040  9107663.276899 
+288212.784625  9107647.234674 
+288240.414481  9107620.142399 
+288298.927163  9107603.129384 
+288361.407858  9107585.116108 
+288546.883855  9107534.087302 
+288590.525181  9107522.080427 
+288627.260935  9107517.097764 
+288634.203199  9107515.096249 
+288643.133163  9107513.096897 
+288710.472537  9107480.020415 
+288732.711934  9107531.276045 
+288735.737570  9107537.306562 
+288751.911054  9107574.492044 
+288791.200389  9107646.861427 
+288810.340835  9107682.041009 
+288837.527709  9107730.288283 
+288893.014438  9107707.244014 
+288938.643453  9107695.238936 
+289012.041462  9107675.227521 
+Region 1
+40
+288654.286036  9106727.559736 
+288646.085781  9106693.396448 
+288641.934276  9106669.282973 
+288645.454493  9106607.005403 
+288651.831427  9106527.653794 
+288585.112807  9106509.499048 
+288352.102134  9106446.961650 
+288285.390987  9106429.810950 
+288267.465421  9106424.768476 
+288231.614297  9106414.683502 
+288197.765497  9106406.609791 
+288074.288975  9106373.323325 
+288048.576503  9106526.989803 
+288027.642658  9106654.543489 
+288013.028200  9106694.708999 
+287991.999039  9106809.203544 
+287977.589682  9106877.496475 
+287964.152166  9106942.776859 
+287948.807545  9107019.105102 
+287946.929765  9107034.171161 
+287946.038501  9107048.233770 
+287947.457334  9107106.498806 
+287969.219333  9107092.459289 
+287993.955522  9107077.418511 
+288014.650358  9107053.332377 
+288057.004490  9107001.142992 
+288064.889262  9106992.110825 
+288082.690458  9106980.075982 
+288184.850819  9106952.061520 
+288215.601209  9106944.059071 
+288256.267981  9106933.053896 
+288298.893066  9106918.032680 
+288371.325932  9106902.039635 
+288452.776634  9106896.101774 
+288550.113995  9106888.172080 
+288556.069678  9106887.174058 
+288628.524330  9106874.194273 
+288660.283039  9106868.201730 
+288685.099569  9106864.210668 
+288654.286036  9106727.559736 
+Region 1
+488
+285905.680824  9110744.691470 
+285836.873918  9110576.853278 
+285826.759389  9110552.732543 
+285778.138314  9110427.108247 
+285772.057967  9110411.028491 
+285643.407217  9110077.370270 
+285618.508094  9110070.309954 
+285407.759875  9110065.045893 
+285279.580068  9110069.921431 
+285205.057548  9110072.849329 
+284965.499588  9110069.559118 
+284847.222307  9110069.422110 
+284832.313401  9110069.404818 
+284698.118647  9110067.239836 
+284646.448936  9110069.188833 
+284626.989948  9109989.806022 
+284626.742770  9109955.650730 
+284606.289990  9109876.266728 
+284579.692084  9109771.761544 
+284558.223824  9109689.362609 
+284483.619086  9109405.989510 
+284463.203346  9109331.628146 
+284449.962941  9109287.411977 
+284418.309385  9109170.845841 
+284353.044197  9108941.729307 
+284292.553868  9108960.744752 
+284225.330999  9108873.268663 
+284154.865345  9108887.249335 
+284108.217088  9108896.235263 
+284109.174732  9108891.213584 
+284137.330736  9108798.827154 
+284143.098339  9108771.710796 
+284150.817480  9108739.573936 
+284162.512219  9108707.441777 
+284177.195898  9108676.317713 
+284194.817742  9108639.169750 
+284216.371638  9108595.999062 
+284239.942307  9108556.849002 
+284264.543104  9108522.722962 
+284325.526238  9108434.393547 
+283987.023492  9108216.002645 
+283354.863807  9107932.963540 
+281808.395172  9107240.931431 
+281758.550116  9107219.773389 
+281748.645655  9107363.415399 
+281738.669333  9107497.011567 
+281724.638380  9107619.552371 
+281720.179556  9107690.871708 
+281608.166309  9107593.288558 
+281438.148767  9107445.403718 
+281136.250457  9107200.912782 
+281130.308682  9107203.919047 
+281122.386314  9107207.927399 
+281118.518417  9107222.991222 
+281120.556418  9107230.025840 
+281128.586434  9107241.086309 
+281140.613524  9107255.165538 
+281141.664822  9107263.203492 
+281132.770091  9107270.224363 
+281117.890514  9107274.223971 
+281104.991530  9107277.221486 
+281095.110079  9107285.245690 
+281090.212406  9107295.285322 
+281082.261316  9107295.275319 
+281084.141455  9107280.208994 
+281083.090165  9107272.171036 
+281072.128721  9107268.138925 
+281065.157171  9107266.120991 
+281063.298550  9107284.201082 
+281066.330435  9107291.236954 
+281049.412844  9107288.201920 
+281041.425880  9107283.168966 
+281037.479034  9107287.182315 
+281031.587460  9107297.220692 
+281018.724328  9107305.241129 
+281004.845782  9107310.246545 
+280993.934546  9107313.246537 
+280978.025178  9107312.221907 
+280965.075952  9107308.187264 
+280960.084998  9107305.167231 
+280953.170824  9107311.185993 
+280959.184359  9107318.225636 
+280956.267253  9107327.263178 
+280947.365301  9107333.279434 
+280939.421371  9107334.273996 
+280927.444510  9107327.226828 
+280924.405468  9107319.186353 
+280920.401229  9107315.162980 
+280913.444016  9107315.154202 
+280908.445891  9107311.129573 
+280911.391694  9107306.110389 
+280912.335379  9107299.079518 
+280903.368878  9107296.054461 
+280889.504656  9107303.069023 
+280873.616798  9107305.058123 
+280862.684034  9107305.044316 
+280852.759498  9107307.040942 
+280846.846365  9107314.065536 
+280838.952623  9107322.092208 
+280828.055704  9107327.101343 
+280817.165951  9107333.115065 
+280807.241405  9107335.111682 
+280791.310509  9107331.073218 
+280779.362338  9107328.044365 
+280769.409114  9107326.022613 
+280762.480568  9107330.032173 
+280751.626645  9107341.068832 
+280746.771894  9107357.135988 
+280744.848632  9107366.174785 
+280735.010091  9107380.226473 
+280726.151099  9107392.270236 
+280718.285993  9107404.315257 
+280710.428052  9107417.364868 
+280700.610995  9107434.430324 
+280688.834820  9107455.511626 
+280667.141213  9107479.594112 
+280656.351739  9107499.672079 
+280642.580576  9107519.746268 
+280624.855326  9107542.829192 
+280616.032112  9107559.895902 
+280609.175182  9107573.951359 
+280590.441669  9107595.023836 
+280578.608082  9107608.068401 
+280566.810319  9107626.135921 
+280550.057394  9107646.206320 
+280542.242366  9107665.283470 
+280528.449616  9107682.343874 
+280522.600875  9107698.409771 
+280513.834925  9107723.513208 
+280503.989085  9107736.560288 
+280491.161541  9107749.603584 
+280468.366332  9107758.615897 
+280450.461806  9107756.584001 
+280443.497343  9107755.570575 
+280437.555435  9107758.576777 
+280424.656225  9107761.574142 
+280407.810065  9107768.584819 
+280390.906595  9107767.558756 
+280375.998088  9107767.539805 
+280357.113977  9107767.515793 
+280348.247653  9107778.554931 
+280335.441529  9107794.611973 
+280331.630647  9107817.712540 
+280329.857702  9107847.847782 
+280335.034920  9107876.987279 
+280335.271280  9107910.138825 
+280334.485092  9107939.270738 
+280329.680310  9107962.370042 
+280317.925349  9107986.465095 
+280315.108372  9108009.566928 
+280303.224471  9108015.579318 
+280285.291183  9108009.529010 
+280256.510864  9108015.519893 
+280247.673122  9108030.577399 
+280247.852157  9108055.692217 
+280251.055889  9108086.838385 
+280260.201599  9108114.978358 
+280257.391762  9108139.084788 
+280247.595907  9108159.163999 
+280232.801846  9108175.218516 
+280198.072270  9108183.210987 
+280183.149288  9108181.182820 
+280165.244573  9108179.150850 
+280133.317713  9108162.032241 
+280119.388646  9108160.005317 
+280101.498254  9108159.982505 
+280093.554127  9108160.976958 
+280079.782543  9108181.051080 
+280071.995894  9108204.146590 
+280070.093971  9108216.199178 
+280053.218938  9108219.191402 
+280035.307043  9108216.154788 
+280022.429127  9108222.165857 
+280017.559767  9108236.223827 
+280014.771278  9108263.344056 
+280009.987804  9108289.457154 
+279999.233682  9108314.558045 
+279993.441970  9108338.660687 
+279988.579755  9108353.723253 
+279973.749748  9108364.754751 
+279954.808091  9108356.693878 
+279927.800617  9108332.549324 
+279895.859371  9108313.421363 
+279882.881234  9108305.368079 
+279871.833696  9108289.280575 
+279849.803029  9108266.146907 
+279839.785196  9108255.083637 
+279825.748792  9108237.987702 
+279805.713155  9108215.861141 
+279793.721821  9108206.804498 
+279779.699755  9108191.717731 
+279756.725330  9108175.614886 
+279750.726097  9108170.584258 
+279747.722906  9108167.566646 
+279747.637095  9108155.511501 
+279747.536983  9108141.447164 
+279741.523455  9108134.407342 
+279722.646274  9108135.387698 
+279707.816239  9108146.419108 
+279698.034408  9108168.507451 
+279685.206482  9108181.550602 
+279675.260198  9108180.533239 
+279660.280004  9108170.468125 
+279649.268320  9108159.403518 
+279634.216656  9108139.292431 
+279623.176395  9108124.209430 
+279609.111520  9108103.095010 
+279600.059101  9108088.014556 
+279588.990279  9108068.913155 
+279554.060453  9108048.776433 
+279536.120031  9108041.721209 
+279513.238637  9108038.677958 
+279483.392719  9108034.621126 
+279463.485916  9108030.577096 
+279442.642350  9108034.568552 
+279419.796668  9108036.548238 
+279395.949927  9108037.522032 
+279369.071454  9108031.459777 
+279349.171791  9108028.420292 
+279328.256795  9108022.365718 
+279307.398924  9108024.347917 
+279293.526994  9108030.357503 
+279272.797628  9108050.422455 
+279252.096800  9108074.505796 
+279230.444871  9108104.615435 
+279207.806140  9108135.728382 
+279191.030936  9108152.784670 
+279162.307313  9108166.811702 
+279141.542138  9108181.853628 
+279117.730963  9108187.850290 
+279099.819051  9108184.813286 
+279074.899770  9108174.735049 
+279055.049977  9108178.727640 
+279029.336568  9108196.776871 
+279013.576586  9108216.848204 
+278999.854370  9108243.954316 
+278977.151195  9108266.025803 
+278959.446133  9108292.122145 
+278948.620023  9108307.176930 
+278924.901471  9108326.233313 
+278905.137184  9108342.281059 
+278884.400358  9108361.341307 
+278874.625192  9108384.434180 
+278861.896780  9108411.541574 
+278852.114464  9108433.629847 
+278832.414296  9108458.718983 
+278822.567771  9108471.765850 
+278796.839834  9108487.805808 
+278748.208803  9108497.788360 
+278705.519904  9108504.764839 
+278696.574570  9108504.753170 
+278691.512258  9108491.686870 
+278685.448894  9108477.614671 
+278669.546085  9108477.593915 
+278648.666518  9108476.562064 
+278625.763459  9108470.504597 
+278604.848255  9108464.449715 
+278584.955487  9108462.414529 
+278561.030005  9108452.337318 
+278549.060142  9108446.294105 
+278529.252884  9108456.314119 
+278518.469331  9108477.396458 
+278510.617673  9108491.450484 
+278489.930458  9108517.542824 
+278474.191486  9108540.627861 
+278456.429020  9108558.687279 
+278439.610599  9108569.715777 
+278424.737284  9108574.719259 
+278408.827295  9108573.693817 
+278393.896987  9108570.660466 
+278376.950331  9108563.606092 
+278359.960944  9108550.524090 
+278339.996903  9108538.442771 
+278323.057384  9108532.392974 
+278300.182780  9108530.353752 
+278265.494951  9108544.372506 
+278253.646118  9108555.407474 
+278240.803349  9108566.441134 
+278225.901519  9108567.426140 
+278216.970387  9108569.423587 
+278212.057690  9108577.453884 
+278215.146270  9108592.526863 
+278216.232753  9108605.588021 
+278210.404435  9108624.667655 
+278201.558722  9108638.720350 
+278194.985643  9108692.959817 
+278191.166539  9108715.055879 
+278189.335302  9108737.154553 
+278179.474276  9108748.192131 
+278164.586618  9108751.186340 
+278128.804975  9108751.139272 
+278111.013803  9108765.180190 
+278099.228939  9108785.256580 
+278083.496792  9108809.346155 
+278061.900653  9108847.492340 
+278057.059080  9108865.568680 
+278030.265465  9108871.560964 
+278012.331885  9108865.509762 
+277993.397253  9108858.452637 
+277976.486080  9108856.421150 
+277961.577012  9108856.401488 
+277953.675315  9108863.423237 
+277946.845818  9108881.496954 
+277937.999980  9108895.549628 
+277928.217117  9108917.637833 
+277915.402624  9108932.689866 
+277903.518032  9108938.701759 
+277887.622105  9108939.685373 
+277867.750415  9108940.663732 
+277851.847370  9108940.642728 
+277830.939058  9108935.592123 
+277814.993337  9108929.543469 
+277798.039455  9108921.484283 
+277784.074509  9108914.433638 
+277754.256303  9108914.394192 
+277739.389861  9108920.402100 
+277715.670381  9108939.458047 
+277712.724109  9108944.477133 
+279837.810353  9109930.729523 
+279985.911282  9110070.554778 
+280022.795080  9110085.670267 
+280064.619989  9110096.773639 
+280100.674783  9110134.993424 
+280131.881777  9110190.284955 
+280163.045826  9110239.548891 
+280161.481088  9110298.817317 
+280182.684164  9110345.054890 
+280209.779306  9110381.254043 
+280232.062546  9110439.547923 
+280236.440202  9110495.810062 
+280238.643393  9110525.950313 
+280279.962803  9110605.364328 
+280263.395554  9110651.554273 
+280243.031839  9110722.854003 
+280223.518517  9110774.063157 
+280154.866423  9110903.567910 
+280157.062473  9110932.703577 
+280128.517150  9110971.846368 
+280068.422918  9111047.114396 
+280021.214321  9111117.375722 
+279972.846622  9111164.530145 
+279934.275154  9111191.605229 
+279921.012177  9111283.005625 
+279942.072280  9111309.151381 
+279942.179886  9111324.220274 
+279949.209494  9111334.274979 
+279946.363855  9111353.358482 
+279944.691552  9111397.558058 
+279954.832268  9111425.699188 
+279950.106287  9111459.849077 
+279928.367770  9111477.904177 
+279953.389587  9111502.045730 
+279935.006106  9111572.343420 
+279975.074145  9111615.590991 
+280034.742098  9111619.684416 
+280045.776447  9111633.762458 
+280077.526618  9111625.765709 
+280092.623077  9111651.903834 
+280134.456716  9111664.011365 
+280173.136063  9111652.004917 
+280188.053052  9111653.028211 
+280209.935133  9111655.064816 
+280193.274335  9111688.195139 
+280193.468237  9111715.319103 
+280193.590325  9111732.397155 
+280268.053278  9111720.435465 
+280314.856932  9111732.549023 
+280335.996529  9111769.744978 
+280361.948025  9111784.846138 
+280381.806248  9111781.857207 
+280414.536013  9111771.852273 
+280426.011099  9111708.577999 
+280448.750619  9111691.528513 
+280475.494815  9111678.502340 
+280508.281980  9111676.534077 
+280531.699129  9111615.283867 
+280553.451763  9111599.237699 
+280561.324555  9111588.197128 
+280570.097869  9111564.098136 
+280578.849609  9111536.985377 
+280597.634622  9111522.944662 
+280607.466598  9111507.888210 
+280617.370466  9111502.877646 
+281032.191995  9111410.971279 
+281177.074965  9111377.999211 
+281294.176760  9111352.024563 
+281387.430193  9111327.024904 
+281433.203415  9111334.113188 
+281452.233055  9111354.228072 
+281460.379452  9111381.361612 
+281482.419885  9111405.498471 
+281521.329079  9111425.637697 
+281569.277816  9111458.847426 
+281672.162169  9111529.293516 
+281712.123219  9111557.470407 
+281699.446804  9111591.610445 
+281691.790767  9111632.788633 
+281693.109399  9111677.996077 
+281699.369087  9111719.191253 
+281718.528905  9111757.388441 
+281857.883404  9111923.312776 
+281969.180691  9111919.429670 
+281984.140997  9111926.479827 
+282000.088069  9111932.526603 
+282024.037575  9111945.615077 
+282041.987071  9111953.673405 
+282069.869184  9111960.739182 
+282102.685093  9111962.788053 
+282122.557537  9111961.807527 
+282146.391459  9111958.822640 
+282168.194047  9111949.807858 
+282185.984559  9111935.765363 
+282202.730486  9111914.689603 
+282209.551038  9111895.610992 
+282218.366776  9111877.539363 
+282228.176489  9111859.468934 
+282244.022354  9111851.451505 
+282258.903146  9111847.451191 
+282274.835742  9111851.488708 
+282278.818891  9111852.498087 
+282293.757509  9111856.534397 
+282306.729856  9111863.582041 
+282322.763675  9111881.683649 
+282343.789102  9111902.804976 
+282375.835118  9111935.994405 
+282959.854159  9112564.548310 
+283049.008197  9112660.087936 
+283065.913340  9112661.112541 
+283091.757173  9112661.143162 
+283105.680334  9112662.164220 
+283124.616974  9112669.218603 
+283151.520072  9112678.291534 
+283174.519736  9112697.405487 
+283196.481901  9112710.490804 
+283215.505621  9112729.600027 
+283229.617423  9112756.739960 
+283238.752012  9112782.869441 
+283253.879614  9112813.024252 
+283275.921678  9112837.159820 
+283285.963235  9112851.235572 
+283386.044739  9112808.157218 
+283438.530461  9112781.095748 
+283471.237884  9112768.074878 
+283502.958551  9112756.057394 
+283539.641899  9112743.041156 
+283604.983948  9112706.953561 
+283631.560238  9112670.820456 
+283638.242165  9112632.654894 
+283642.957899  9112597.500717 
+283652.636311  9112561.347797 
+283665.376573  9112536.248662 
+283686.155884  9112523.213706 
+283712.848254  9112503.153732 
+283743.487483  9112479.080120 
+283763.236430  9112461.021121 
+283800.593728  9112403.804794 
+283846.765993  9112328.516651 
+283852.642690  9112316.468780 
+283859.513367  9112304.422071 
+283904.669679  9112226.119040 
+283947.932379  9112160.873088 
+283955.796991  9112148.827537 
+283999.988122  9112074.541602 
+284042.198449  9112001.257905 
+284083.523724  9111943.041582 
+284128.933835  9111899.898420 
+284168.525450  9111876.839664 
+284200.201619  9111858.794469 
+284203.176257  9111857.793372 
+284280.422245  9111818.705409 
+284346.770805  9111784.627486 
+284364.604023  9111776.611720 
+284487.455678  9111721.503471 
+284593.365917  9111660.348015 
+284630.983650  9111639.295793 
+284649.788862  9111628.267390 
+284695.336386  9111604.210619 
+284756.721689  9111571.131068 
+284842.861186  9111525.020734 
+285019.115392  9111432.804266 
+285295.378790  9111288.464849 
+285424.103672  9111221.306705 
+285433.999395  9111215.290668 
+285458.753280  9111202.259693 
+285570.616988  9111140.104781 
+285963.620781  9110921.558100 
+285947.213732  9110852.225501 
+285905.680824  9110744.691470 
+Region 1
+223
+285851.711940  9112207.257580 
+285666.731389  9112192.985175 
+285672.347870  9111461.677304 
+285673.027855  9111418.482310 
+285674.752910  9111382.320370 
+285671.573925  9111355.193841 
+285665.354691  9111320.027438 
+285653.179076  9111285.858822 
+285636.004543  9111247.666309 
+285620.839839  9111212.489724 
+285613.685132  9111185.358659 
+285570.616988  9111140.104781 
+285458.753280  9111202.259693 
+285433.999395  9111215.290668 
+285424.103672  9111221.306705 
+285295.378790  9111288.464849 
+285019.115392  9111432.804266 
+284842.861186  9111525.020734 
+284756.721689  9111571.131068 
+284695.336386  9111604.210619 
+284649.788862  9111628.267390 
+284630.983650  9111639.295793 
+284593.365917  9111660.348015 
+284487.455678  9111721.503471 
+284364.604023  9111776.611720 
+284346.770805  9111784.627486 
+284280.422245  9111818.705409 
+284203.176257  9111857.793372 
+284200.201619  9111858.794469 
+284168.525450  9111876.839664 
+284128.933835  9111899.898420 
+284083.523724  9111943.041582 
+284042.198449  9112001.257905 
+283999.988122  9112074.541602 
+283955.796991  9112148.827537 
+283947.932379  9112160.873088 
+283904.669679  9112226.119040 
+283859.513367  9112304.422071 
+283852.642690  9112316.468780 
+283846.765993  9112328.516651 
+283800.593728  9112403.804794 
+283763.236430  9112461.021121 
+283743.487483  9112479.080120 
+283712.848254  9112503.153732 
+283686.155884  9112523.213706 
+283665.376573  9112536.248662 
+283652.636311  9112561.347797 
+283642.957899  9112597.500717 
+283638.242165  9112632.654894 
+283631.560238  9112670.820456 
+283604.983948  9112706.953561 
+283539.641899  9112743.041156 
+283502.958551  9112756.057394 
+283471.237884  9112768.074878 
+283438.530461  9112781.095748 
+283386.044739  9112808.157218 
+283285.963235  9112851.235572 
+283290.984017  9112858.273446 
+283347.460776  9112970.851231 
+283343.550108  9112979.887708 
+283344.594919  9112986.920889 
+283348.599952  9112990.943862 
+283360.469871  9112982.921318 
+283391.189464  9112969.898126 
+283412.056175  9112968.918103 
+283435.933921  9112971.959866 
+283455.842935  9112976.001516 
+283487.650883  9112976.038875 
+283515.562722  9112987.121838 
+283549.278767  9112976.111193 
+283588.900663  9112957.070943 
+283606.661855  9112939.009620 
+283633.463443  9112934.018201 
+283645.326015  9112924.991026 
+283680.108618  9112924.027179 
+283695.069423  9112931.076621 
+283717.967667  9112936.126215 
+283744.711087  9112923.098166 
+283757.582158  9112916.081272 
+283775.452272  9112913.088463 
+283790.391275  9112917.124160 
+283818.353985  9112935.238921 
+283829.295206  9112936.256251 
+283823.164044  9112913.144171 
+283835.998749  9112901.104406 
+283868.851463  9112908.174660 
+283905.701973  9112918.263232 
+283940.579047  9112930.358594 
+283967.475084  9112938.426393 
+283994.334763  9112941.471326 
+284017.225736  9112945.516189 
+284046.029760  9112942.535986 
+284073.839781  9112939.554610 
+284096.730750  9112943.599432 
+284112.649209  9112945.627029 
+284119.519860  9112933.580278 
+284149.281466  9112925.578323 
+284166.113867  9112916.556801 
+284182.924430  9112904.521569 
+284211.611951  9112885.468177 
+284224.439242  9112872.423760 
+284236.250700  9112856.364485 
+284243.143140  9112847.331430 
+284265.032784  9112850.370455 
+284276.967959  9112851.388830 
+284277.881885  9112840.339733 
+284275.733775  9112818.236936 
+284277.648971  9112808.193558 
+284295.468008  9112798.168587 
+284314.295584  9112790.153897 
+284333.159550  9112787.162039 
+284350.013692  9112781.154172 
+284360.867494  9112770.116569 
+284368.702922  9112754.052681 
+284376.596589  9112746.025332 
+284383.503545  9112739.001401 
+284400.335818  9112729.979819 
+284419.214307  9112728.997067 
+284436.126663  9112731.025713 
+284453.068146  9112737.072621 
+284454.983302  9112727.029245 
+284456.913022  9112718.995003 
+284470.850692  9112722.024762 
+284484.817494  9112729.072784 
+284514.637116  9112729.107170 
+284523.597569  9112731.126615 
+284536.563106  9112737.168906 
+284549.528647  9112743.211193 
+284567.493265  9112753.277464 
+284585.334046  9112746.266098 
+284597.218183  9112740.252430 
+284613.092835  9112736.252466 
+284630.970027  9112734.263916 
+284654.891287  9112743.332442 
+284675.852454  9112755.411224 
+284692.837682  9112767.485426 
+284715.743114  9112773.539074 
+284735.673877  9112780.593852 
+284752.680993  9112795.681721 
+284770.733134  9112817.802678 
+284789.735542  9112833.897372 
+284812.764950  9112857.028565 
+284824.838631  9112877.133525 
+284835.852712  9112888.196258 
+284844.915278  9112904.279536 
+284847.992038  9112917.342291 
+284850.067519  9112929.399343 
+284854.116399  9112939.449540 
+284876.057105  9112949.520201 
+284893.999979  9112956.572611 
+284902.989651  9112962.610224 
+284915.984460  9112972.670635 
+284934.877573  9112973.696775 
+284943.779722  9112967.679606 
+284946.696045  9112958.641934 
+284957.505932  9112941.576829 
+284969.433807  9112941.590447 
+284987.332913  9112942.615433 
+285014.134150  9112937.623233 
+285035.958136  9112931.620789 
+285047.834930  9112924.602441 
+285054.734480  9112916.573863 
+285049.676984  9112904.513434 
+285053.594567  9112896.481457 
+285070.433993  9112888.464209 
+285084.342525  9112887.475503 
+285095.407738  9112905.570101 
+285105.522756  9112929.690942 
+285122.522732  9112943.774065 
+285146.429551  9112950.833154 
+285170.321776  9112955.883102 
+285180.268963  9112956.898966 
+285203.152603  9112959.938640 
+285231.013486  9112963.988508 
+285244.892823  9112958.981498 
+285254.730494  9112944.928907 
+285269.603809  9112939.923019 
+285285.529520  9112942.954754 
+285302.478427  9112950.005859 
+285311.380505  9112943.988632 
+285315.290737  9112934.952081 
+285322.182929  9112925.918911 
+285337.107343  9112927.944939 
+285339.109923  9112929.956317 
+285356.000404  9112928.970905 
+285363.915785  9112923.957105 
+285370.837178  9112918.942179 
+285389.759447  9112923.986379 
+285409.697618  9112932.045380 
+285418.599674  9112926.028135 
+285416.524048  9112913.971145 
+285417.481513  9112908.949462 
+285423.343171  9112894.892350 
+285442.177772  9112887.881791 
+285454.134822  9112891.913531 
+285469.095747  9112898.962323 
+285483.004244  9112897.973496 
+285493.843112  9112884.926559 
+285508.716363  9112879.920604 
+285522.559092  9112869.890716 
+285529.451229  9112860.857527 
+285538.324025  9112850.822021 
+285546.210140  9112841.789954 
+285561.076061  9112835.779425 
+285569.035241  9112836.792964 
+285574.063620  9112844.835061 
+285578.024941  9112842.830427 
+285598.818220  9112831.803814 
+285610.672944  9112821.771665 
+285615.533239  9112806.708862 
+285609.225873  9112759.487783 
+285638.906477  9112740.434773 
+285668.682068  9112734.441034 
+285672.577595  9112723.395352 
+285686.252128  9112690.260548 
+285707.900410  9112660.148385 
+285723.635959  9112637.061420 
+285750.414905  9112629.055167 
+285770.374890  9112640.127705 
+285794.369288  9112659.241183 
+285823.289729  9112672.332873 
+285823.238546  9112665.300957 
+285851.711940  9112207.257580 
+Region 1
+97
+287656.442215  9110807.917560 
+287585.051200  9110695.330644 
+287513.579870  9110571.693461 
+287494.460533  9110539.527078 
+287477.336408  9110508.367416 
+287404.813162  9110376.692401 
+287301.053772  9110186.719093 
+287296.091520  9110187.718156 
+287170.377026  9110257.897260 
+287168.345220  9110251.867739 
+287147.099230  9110200.612396 
+287115.899481  9110147.336902 
+287082.704659  9110093.054607 
+287039.761206  9110064.879632 
+286989.904334  9110042.724190 
+286953.122153  9110041.678715 
+286866.636873  9110039.573267 
+286611.097992  9110025.223921 
+286274.028429  9110006.762967 
+286197.467505  9110002.658310 
+286194.500360  9110004.664057 
+286189.516158  9110002.649323 
+286164.595155  9109992.575642 
+286151.579265  9109979.501760 
+286148.539081  9109971.461915 
+286225.268907  9109725.433804 
+286182.479561  9109718.353536 
+286092.976338  9109711.220275 
+286074.077399  9109709.189738 
+285711.021860  9109670.603403 
+285740.257215  9110001.134745 
+285743.837180  9110083.512165 
+285743.866362  9110087.530410 
+285643.407217  9110077.370270 
+285772.057967  9110411.028491 
+285778.138314  9110427.108247 
+285826.759389  9110552.732543 
+285836.873918  9110576.853278 
+285905.680824  9110744.691470 
+285947.213732  9110852.225501 
+285963.620781  9110921.558100 
+285570.616988  9111140.104781 
+285613.685132  9111185.358659 
+285620.839839  9111212.489724 
+285636.004543  9111247.666309 
+285653.179076  9111285.858822 
+285665.354691  9111320.027438 
+285671.573925  9111355.193841 
+285674.752910  9111382.320370 
+285673.027855  9111418.482310 
+285672.347870  9111461.677304 
+285666.731389  9112192.985175 
+285851.711940  9112207.257580 
+285877.555124  9112207.286673 
+285922.364130  9112218.387142 
+285985.101147  9112234.530451 
+286083.102592  9112316.008953 
+286197.015230  9112398.509485 
+286315.971330  9112491.060736 
+286397.989721  9112561.470433 
+286403.355101  9112615.722005 
+286361.134166  9112686.997990 
+286339.742718  9112752.269847 
+286351.152553  9112817.578187 
+286453.334588  9112790.568879 
+286550.583206  9112768.576642 
+286685.764070  9112768.726167 
+286813.825649  9112746.767432 
+286873.390809  9112736.787571 
+286932.625773  9112681.602733 
+286927.061673  9112600.228434 
+286926.621526  9112539.955221 
+286947.098760  9112485.732300 
+286993.382435  9112426.515040 
+287070.390883  9112355.276975 
+287118.654864  9112295.057284 
+287144.860748  9112208.695216 
+287151.730416  9112196.648221 
+287188.037275  9112132.397215 
+287191.969079  9112126.374262 
+287279.491863  9111997.888565 
+287334.683568  9111933.658209 
+287359.319527  9111904.553411 
+287373.117412  9111888.495813 
+287497.415461  9111760.050160 
+287568.142512  9111645.609499 
+287611.907886  9111514.062190 
+287616.693980  9111488.953854 
+287627.216036  9111432.710964 
+287628.736333  9111232.808705 
+287629.598084  9111214.727884 
+287656.334090  9111065.080278 
+287668.777901  9110999.798623 
+287706.180128  9110949.612357 
+287740.637211  9110904.445575 
+287727.613304  9110890.367774 
+287656.442215  9110807.917560 
+Region 1
+85
+287191.847387  9108158.420797 
+287190.831565  9108155.406024 
+287127.982590  9107986.571926 
+287031.539773  9107708.204266 
+286962.458828  9107502.194345 
+286888.145875  9107533.251564 
+286798.932180  9107565.296401 
+286757.299553  9107580.317579 
+286713.679166  9107595.336476 
+286630.406429  9107624.374110 
+286543.136196  9107650.393430 
+286503.469190  9107662.402993 
+286324.894355  9107706.400061 
+286242.571115  9107729.410860 
+285940.894065  9107792.352410 
+285930.969928  9107794.350127 
+285649.314710  9108151.647318 
+285618.333389  9108265.126261 
+285598.980030  9108337.431880 
+285589.274209  9108369.566439 
+285603.210454  9108372.596159 
+285620.830929  9108335.447943 
+285634.519544  9108304.322525 
+285645.226494  9108273.193673 
+285659.952662  9108248.096775 
+285672.698336  9108224.002150 
+285688.418358  9108198.906393 
+285705.175948  9108179.839153 
+285721.955376  9108163.785597 
+285749.645617  9108144.730923 
+285778.351567  9108128.691066 
+285810.060986  9108115.668307 
+285846.754347  9108104.660357 
+285865.616174  9108101.668347 
+285984.317729  9108161.073006 
+286025.363422  9108338.925711 
+286040.774826  9108408.257412 
+286061.272423  9108493.667731 
+286076.654815  9108558.981150 
+286108.479349  9108698.650105 
+286108.501235  9108701.663784 
+286149.438951  9108864.447705 
+286154.561669  9108885.549107 
+286188.433100  9109033.256605 
+286226.265866  9109178.959406 
+286230.358284  9109195.036857 
+286262.140390  9109328.678092 
+286276.040428  9109326.684727 
+286293.053632  9109342.776787 
+286304.066908  9109353.839299 
+286317.141038  9109374.949640 
+286323.316287  9109404.088576 
+286337.369740  9109423.190911 
+286360.324519  9109436.275995 
+286393.203749  9109447.363167 
+286413.746959  9109402.181617 
+286442.621321  9109409.246039 
+286466.935476  9109335.941352 
+286545.607223  9109357.125527 
+286591.187624  9109201.471766 
+286734.711156  9109256.883231 
+286803.480349  9109283.078586 
+286800.447451  9109276.043354 
+286734.951873  9109153.415057 
+286808.185731  9109110.301669 
+286840.881878  9109096.274654 
+286870.779187  9109107.358169 
+286878.759607  9109111.385295 
+286892.564407  9109096.332543 
+286896.474147  9109087.295995 
+286950.713981  9109029.092961 
+286948.623769  9109015.026965 
+286982.218560  9108987.941772 
+286986.157543  9108982.923442 
+287055.107911  9108897.614033 
+287090.573231  9108854.458143 
+287149.540450  9108763.110252 
+287154.458645  9108756.083916 
+287080.924464  9108621.392614 
+287048.687547  9108425.469974 
+287047.671723  9108422.455196 
+287025.732410  9108275.766790 
+287269.905212  9108368.458009 
+287231.354824  9108260.928614 
+287191.847387  9108158.420797 
+Region 1
+72
+286393.203749  9109447.363167 
+286360.324519  9109436.275995 
+286337.369740  9109423.190911 
+286323.316287  9109404.088576 
+286317.141038  9109374.949640 
+286304.066908  9109353.839299 
+286293.053632  9109342.776787 
+286276.040428  9109326.684727 
+286262.140390  9109328.678092 
+286230.358284  9109195.036857 
+286226.265866  9109178.959406 
+286188.433100  9109033.256605 
+286154.561669  9108885.549107 
+286149.438951  9108864.447705 
+286108.501235  9108701.663784 
+286108.479349  9108698.650105 
+286076.654815  9108558.981150 
+286061.272423  9108493.667731 
+286040.774826  9108408.257412 
+286025.363422  9108338.925711 
+285984.317729  9108161.073006 
+285865.616174  9108101.668347 
+285846.754347  9108104.660357 
+285810.060986  9108115.668307 
+285778.351567  9108128.691066 
+285749.645617  9108144.730923 
+285721.955376  9108163.785597 
+285705.175948  9108179.839153 
+285688.418358  9108198.906393 
+285672.698336  9108224.002150 
+285659.952662  9108248.096775 
+285645.226494  9108273.193673 
+285634.519544  9108304.322525 
+285620.830929  9108335.447943 
+285603.210454  9108372.596159 
+285589.274209  9108369.566439 
+285573.692445  9108413.748882 
+285558.249020  9108477.018024 
+285534.970967  9108556.351014 
+285530.132592  9108574.427423 
+285525.279652  9108590.494705 
+285485.476720  9108721.040953 
+285472.847368  9108761.208590 
+285471.172700  9108804.402522 
+285468.489579  9108845.586182 
+285468.627942  9108864.672885 
+285468.904675  9108902.846290 
+285472.359752  9108968.146336 
+285469.815040  9109028.416696 
+285470.048109  9109060.562719 
+285471.165830  9109077.641437 
+285473.466836  9109120.839942 
+285473.911165  9109182.118293 
+285474.319093  9109238.373827 
+285476.598294  9109278.558636 
+285481.793662  9109309.705805 
+285492.879633  9109330.814195 
+285498.915933  9109340.866677 
+285507.897530  9109345.899769 
+285541.610231  9109334.888392 
+285627.905207  9109310.878100 
+285826.314402  9109259.872929 
+285852.474851  9109440.722280 
+285693.755747  9109482.732187 
+285711.021860  9109670.603403 
+286074.077399  9109709.189738 
+286092.976338  9109711.220275 
+286182.479561  9109718.353536 
+286225.268907  9109725.433804 
+286307.822851  9109460.325867 
+286326.699756  9109459.342654 
+286393.203749  9109447.363167 
+Region 1
+77
+285627.905207  9109310.878100 
+285541.610231  9109334.888392 
+285507.897530  9109345.899769 
+285498.915933  9109340.866677 
+285492.879633  9109330.814195 
+285481.793662  9109309.705805 
+285476.598294  9109278.558636 
+285474.319093  9109238.373827 
+285473.911165  9109182.118293 
+285473.466836  9109120.839942 
+285471.165830  9109077.641437 
+285470.048109  9109060.562719 
+285469.815040  9109028.416696 
+285472.359752  9108968.146336 
+285468.904675  9108902.846290 
+285468.627942  9108864.672885 
+285468.489579  9108845.586182 
+285471.172700  9108804.402522 
+285472.847368  9108761.208590 
+285485.476720  9108721.040953 
+285525.279652  9108590.494705 
+285496.500505  9108596.488856 
+285415.161571  9108618.495205 
+284843.907101  9108787.602242 
+284608.883132  9108860.660297 
+284574.161932  9108869.660648 
+284555.886813  9108816.397552 
+284532.576904  9108754.087489 
+284518.451753  9108724.938666 
+284470.229190  9108653.558235 
+284430.995409  9108588.215655 
+284386.770512  9108519.853450 
+284367.581759  9108477.639276 
+284331.518619  9108438.418862 
+284325.526238  9108434.393547 
+284264.543104  9108522.722962 
+284239.942307  9108556.849002 
+284216.371638  9108595.999062 
+284194.817742  9108639.169750 
+284177.195898  9108676.317713 
+284162.512219  9108707.441777 
+284150.817480  9108739.573936 
+284143.098339  9108771.710796 
+284137.330736  9108798.827154 
+284109.174732  9108891.213584 
+284108.217088  9108896.235263 
+284154.865345  9108887.249335 
+284225.330999  9108873.268663 
+284292.553868  9108960.744752 
+284353.044197  9108941.729307 
+284418.309385  9109170.845841 
+284449.962941  9109287.411977 
+284463.203346  9109331.628146 
+284483.619086  9109405.989510 
+284558.223824  9109689.362609 
+284579.692084  9109771.761544 
+284606.289990  9109876.266728 
+284626.742770  9109955.650730 
+284626.989948  9109989.806022 
+284646.448936  9110069.188833 
+284698.118647  9110067.239836 
+284832.313401  9110069.404818 
+284847.222307  9110069.422110 
+284965.499588  9110069.559118 
+285205.057548  9110072.849329 
+285279.580068  9110069.921431 
+285407.759875  9110065.045893 
+285618.508094  9110070.309954 
+285643.407217  9110077.370270 
+285743.866362  9110087.530410 
+285743.837180  9110083.512165 
+285740.257215  9110001.134745 
+285711.021860  9109670.603403 
+285693.755747  9109482.732187 
+285852.474851  9109440.722280 
+285826.314402  9109259.872929 
+285627.905207  9109310.878100 
+Region 1
+203
+290466.514862  9105983.138244 
+290473.301828  9105960.041231 
+290225.607957  9105927.633892 
+290219.637743  9105926.623019 
+290089.286864  9105904.384670 
+290001.780240  9105897.259644 
+289940.237814  9105907.239248 
+289933.288522  9105908.236354 
+289858.833895  9105919.206586 
+289818.212895  9105936.240155 
+289806.323995  9105941.250085 
+289783.532632  9105950.266462 
+289764.731221  9105961.296175 
+289723.999719  9105963.261552 
+289568.273065  9106004.280090 
+289493.884254  9106024.290659 
+289471.939456  9106013.217116 
+289446.004706  9106000.130184 
+289429.993386  9105985.044876 
+289413.982077  9105969.959561 
+289395.990507  9105955.876632 
+289376.961020  9105935.765359 
+289361.862680  9105909.631112 
+289347.692004  9105874.457037 
+289338.541866  9105846.320137 
+289324.407993  9105816.168764 
+289322.390971  9105812.148437 
+289308.293877  9105787.019773 
+289297.266428  9105773.948859 
+289263.109471  9105723.685027 
+289259.082798  9105716.648906 
+289254.062318  9105709.611706 
+289249.027143  9105700.565417 
+289231.934019  9105673.424386 
+289215.842071  9105647.288967 
+289207.781411  9105632.212165 
+289198.719604  9105616.129735 
+289183.599467  9105586.981741 
+289170.511038  9105563.863166 
+289168.494045  9105559.842826 
+289157.400588  9105537.730950 
+289141.294055  9105509.586392 
+289125.246303  9105489.478182 
+289105.201322  9105466.351998 
+289087.217404  9105453.273418 
+289066.259432  9105441.196122 
+289047.347815  9105437.157347 
+289015.480058  9105428.081733 
+288983.641674  9105423.024276 
+288959.768393  9105419.984578 
+288934.798549  9105402.880134 
+288900.994592  9105400.834077 
+288877.158012  9105402.817063 
+288862.199605  9105395.768914 
+288847.292568  9105395.752585 
+288832.385529  9105395.736251 
+288815.461535  9105391.699546 
+288791.588261  9105388.659751 
+288780.663768  9105389.652306 
+288742.943274  9105395.638142 
+288720.056462  9105391.594853 
+288712.084032  9105388.572477 
+288709.278661  9105412.678337 
+288689.703310  9105453.842940 
+288686.014149  9105493.015920 
+288686.608299  9105574.384256 
+288674.018889  9105619.574698 
+288644.622724  9105676.801154 
+288598.449055  9105750.081800 
+288581.715606  9105772.163277 
+288573.838448  9105782.200014 
+288535.255754  9105806.266530 
+288431.227903  9105850.351725 
+288259.693557  9105904.407526 
+288216.068185  9105918.422839 
+288157.733299  9105959.544450 
+288124.097289  9105980.602554 
+288108.159556  9105975.562172 
+288056.319829  9105953.404719 
+288035.398367  9105946.349689 
+288022.515333  9105951.358090 
+288017.560883  9105953.361671 
+288011.656547  9105961.391451 
+288008.740991  9105970.429096 
+288012.789496  9105980.479021 
+288018.796352  9105986.512950 
+288038.899774  9106017.676096 
+288043.080118  9106045.807927 
+288037.190427  9106055.846814 
+288024.322011  9106062.864324 
+288008.442834  9106065.860317 
+287996.487681  9106061.828866 
+287969.427507  9106030.657965 
+287933.357098  9105990.436126 
+287920.203173  9105958.276106 
+287903.125234  9105933.143510 
+287869.232903  9105919.042141 
+287844.416694  9105923.032648 
+287808.683096  9105929.020049 
+287785.883777  9105937.030953 
+287763.128349  9105951.069160 
+287784.166881  9105974.197160 
+287809.217311  9106002.352338 
+287837.190688  9106022.474405 
+287893.144830  9106063.723019 
+287974.010543  9106114.040114 
+288051.880296  9106162.344612 
+288109.785795  9106198.572320 
+288099.220027  9106248.787719 
+288082.867114  9106323.105720 
+288080.024830  9106342.188872 
+288074.288975  9106373.323325 
+288197.765497  9106406.609791 
+288231.614297  9106414.683502 
+288267.465421  9106424.768476 
+288285.390987  9106429.810950 
+288352.102134  9106446.961650 
+288585.112807  9106509.499048 
+288651.831427  9106527.653794 
+288645.454493  9106607.005403 
+288641.934276  9106669.282973 
+288646.085781  9106693.396448 
+288654.286036  9106727.559736 
+288685.099569  9106864.210668 
+288660.283039  9106868.201730 
+288671.552990  9106914.422819 
+288690.993981  9106990.788971 
+288804.254821  9106985.889667 
+288817.174714  9106985.903725 
+288827.766953  9107075.319118 
+288830.939498  9107101.440551 
+288843.284398  9107158.712619 
+288856.542357  9107204.935753 
+288904.187995  9107196.951165 
+288909.311547  9107218.052008 
+288910.356837  9107225.084903 
+288919.588071  9107264.271868 
+288931.056941  9107337.615518 
+288948.783024  9107451.147410 
+288951.882197  9107467.223357 
+288957.020536  9107490.333270 
+288975.387736  9107555.648039 
+288991.664358  9107606.897012 
+289012.041462  9107675.227521 
+289049.741639  9107666.227391 
+289080.639311  9107678.315159 
+289085.623282  9107680.329606 
+289086.786327  9107703.435193 
+289141.359361  9107827.051912 
+289147.440224  9107843.131029 
+289239.971619  9108128.518522 
+289245.920059  9108126.515831 
+289349.156358  9108109.549331 
+289551.137326  9108005.293537 
+289571.927255  9107994.265830 
+289576.881798  9107992.262043 
+289665.231779  9107978.292651 
+289679.131011  9107976.298369 
+289701.960193  9107972.304512 
+289721.763573  9107962.280232 
+289731.606282  9107949.231765 
+289756.106132  9107902.044758 
+289777.690738  9107863.895445 
+289803.294954  9107831.777592 
+289822.023289  9107810.702290 
+289844.749128  9107792.644823 
+289885.297873  9107765.565456 
+289918.941249  9107745.510471 
+290008.997871  9107693.370157 
+290200.365359  9107903.518995 
+290228.429436  9107935.693483 
+290263.273303  9107943.766349 
+290324.574522  9107900.635945 
+290378.386896  9107785.171516 
+290412.853942  9107742.012902 
+290451.569618  9107736.026303 
+290469.525328  9107745.085871 
+290431.013170  9107643.588080 
+290390.794163  9107580.260537 
+290385.773258  9107573.223560 
+290341.497811  9107498.841853 
+290310.186739  9107430.500892 
+290288.976555  9107384.270184 
+290261.788634  9107336.024096 
+290232.568829  9107281.748650 
+290181.115820  9107177.223155 
+290128.809407  9107091.782725 
+290117.552708  9107047.571445 
+290104.205128  9106989.294504 
+290114.421900  9106891.865803 
+290138.692372  9106813.538088 
+290145.501665  9106793.454681 
+290198.467600  9106698.080332 
+290252.508304  9106613.756944 
+290265.199323  9106582.629922 
+290307.100042  9106469.162297 
+290328.639464  9106424.985737 
+290361.942347  9106358.721946 
+290415.893910  9106262.344063 
+290446.692504  9106125.760533 
+290471.660961  9106007.252394 
+290469.533171  9105988.164082 
+290466.514862  9105983.138244 
+Region 1
+152
+288687.165610  9105378.499701 
+288664.315474  9105379.479117 
+288629.554361  9105382.454495 
+288591.716507  9105372.367441 
+288568.866360  9105373.346808 
+288538.949620  9105359.250272 
+288494.738505  9105292.901835 
+288450.520207  9105225.548774 
+288439.383218  9105197.409322 
+288429.108154  9105151.189082 
+288427.564827  9105075.846811 
+288433.073353  9105013.571374 
+288430.594896  9104946.264391 
+288430.506982  9104934.209802 
+288411.302562  9104889.988729 
+288401.196148  9104866.873085 
+288383.994033  9104824.663286 
+288383.217677  9104718.181054 
+288378.986190  9104683.017414 
+288064.832768  9104803.212836 
+287858.847572  9104902.432314 
+287746.950591  9104957.556778 
+287773.951319  9104980.691596 
+287715.427297  9105132.312155 
+287652.774238  9105262.832643 
+287627.812523  9105383.350006 
+287592.832218  9105492.806135 
+287538.362957  9105655.481280 
+287524.756565  9105697.656899 
+287522.798173  9105701.672881 
+287483.900739  9105819.160995 
+287473.202642  9105851.294430 
+287429.372238  9105837.181513 
+287393.360965  9105941.613774 
+287452.120741  9105958.757120 
+287581.588186  9105996.070575 
+287589.553392  9105998.088589 
+287650.308220  9106016.238420 
+287634.553348  9106036.311681 
+287612.791635  9106050.350947 
+287571.219246  9106073.408917 
+287549.428240  9106083.429947 
+287515.769820  9106101.474023 
+287460.495781  9106153.648367 
+287426.961545  9106188.769812 
+287417.213345  9106214.877052 
+287408.510140  9106248.017286 
+287406.880710  9106297.238197 
+287407.998827  9106314.316730 
+287398.250605  9106340.423974 
+287372.615689  9106368.522467 
+287364.745448  9106379.563631 
+287352.994908  9106403.659532 
+287347.163496  9106421.734808 
+287336.326362  9106434.781729 
+287318.525075  9106446.816275 
+287303.676042  9106454.835951 
+287293.788866  9106461.856657 
+287276.075263  9106485.945846 
+287271.179178  9106495.985803 
+287248.394052  9106506.005632 
+287219.580127  9106506.977745 
+287181.850901  9106511.957982 
+287170.940624  9106514.959328 
+287138.129416  9106512.913244 
+287109.242412  9106503.839733 
+287087.378013  9106503.815056 
+287066.595103  9106515.846158 
+287044.862168  9106533.903466 
+287004.246296  9106551.939424 
+286993.350594  9106556.949844 
+286980.430700  9106556.935234 
+286966.516966  9106556.919495 
+286951.543672  9106547.861621 
+286938.594570  9106543.828772 
+286910.876622  9106558.865610 
+286895.033613  9106566.884052 
+286882.128310  9106568.878527 
+286873.183760  9106568.868391 
+286855.323858  9106572.866340 
+286840.467370  9106579.881335 
+286830.572774  9106585.897406 
+286822.695053  9106595.933957 
+286816.812309  9106606.977320 
+286811.886905  9106612.999025 
+286803.987277  9106620.021904 
+287092.449000  9106791.121290 
+287140.986567  9106905.694325 
+287215.444514  9106894.728060 
+287242.249066  9106890.739995 
+287301.784648  9106877.747740 
+287488.393021  9106845.811315 
+287563.785951  9106826.809206 
+287645.134509  9106806.809081 
+287716.566532  9106789.811418 
+287767.157149  9106776.808650 
+287879.189909  9106739.765037 
+288013.028200  9106694.708999 
+288027.642658  9106654.543489 
+288048.576503  9106526.989803 
+288074.288975  9106373.323325 
+288080.024830  9106342.188872 
+288082.867114  9106323.105720 
+288099.220027  9106248.787719 
+288109.785795  9106198.572320 
+288051.880296  9106162.344612 
+287974.010543  9106114.040114 
+287893.144830  9106063.723019 
+287837.190688  9106022.474405 
+287809.217311  9106002.352338 
+287784.166881  9105974.197160 
+287763.128349  9105951.069160 
+287785.883777  9105937.030953 
+287808.683096  9105929.020049 
+287844.416694  9105923.032648 
+287869.232903  9105919.042141 
+287903.125234  9105933.143510 
+287920.203173  9105958.276106 
+287933.357098  9105990.436126 
+287969.427507  9106030.657965 
+287996.487681  9106061.828866 
+288008.442834  9106065.860317 
+288024.322011  9106062.864324 
+288037.190427  9106055.846814 
+288043.080118  9106045.807927 
+288038.899774  9106017.676096 
+288018.796352  9105986.512950 
+288012.789496  9105980.479021 
+288008.740991  9105970.429096 
+288011.656547  9105961.391451 
+288017.560883  9105953.361671 
+288022.515333  9105951.358090 
+288035.398367  9105946.349689 
+288056.319829  9105953.404719 
+288108.159556  9105975.562172 
+288124.097289  9105980.602554 
+288157.733299  9105959.544450 
+288216.068185  9105918.422839 
+288259.693557  9105904.407526 
+288431.227903  9105850.351725 
+288535.255754  9105806.266530 
+288573.838448  9105782.200014 
+288581.715606  9105772.163277 
+288598.449055  9105750.081800 
+288644.622724  9105676.801154 
+288674.018889  9105619.574698 
+288686.608299  9105574.384256 
+288686.014149  9105493.015920 
+288689.703310  9105453.842940 
+288709.278661  9105412.678337 
+288712.084032  9105388.572477 
+288687.165610  9105378.499701 
+Region 1
+111
+287725.167435  9104968.582315 
+287567.708676  9105044.750696 
+287406.295978  9105123.927823 
+287301.325116  9105175.041064 
+287296.728502  9105226.267752 
+287291.123478  9105275.484206 
+287283.574652  9105330.725744 
+287276.939304  9105374.918301 
+287275.002803  9105381.947940 
+287261.447283  9105431.155409 
+287255.645072  9105453.248880 
+287247.877141  9105478.353769 
+287244.946821  9105485.382285 
+287234.146323  9105503.451916 
+287229.257583  9105514.496404 
+287217.455958  9105531.560356 
+287207.663860  9105551.640221 
+287196.899846  9105574.732628 
+287169.357781  9105613.878803 
+287156.562295  9105630.941625 
+287153.588147  9105631.942805 
+287142.707272  9105638.962318 
+287112.081461  9105664.041321 
+287091.386498  9105688.127018 
+287067.037444  9105756.408670 
+287031.858499  9105838.741719 
+286931.270825  9105809.495669 
+286793.831588  9105769.157351 
+286783.227785  9105814.349986 
+286774.626208  9105861.554002 
+286759.359625  9105948.932400 
+286755.566683  9105974.041812 
+286754.915706  9106021.254889 
+286744.479648  9106089.552359 
+286734.145714  9106171.913639 
+286721.940842  9106270.345583 
+286714.486271  9106338.646457 
+286710.656845  9106358.733086 
+286787.386468  9106386.947715 
+286853.169369  9106413.140673 
+286843.457284  9106444.270661 
+286826.934312  9106495.483896 
+286802.482502  9106549.701780 
+286777.964958  9106594.878648 
+286773.046847  9106601.904907 
+286803.987277  9106620.021904 
+286811.886905  9106612.999025 
+286816.812309  9106606.977320 
+286822.695053  9106595.933957 
+286830.572774  9106585.897406 
+286840.467370  9106579.881335 
+286855.323858  9106572.866340 
+286873.183760  9106568.868391 
+286882.128310  9106568.878527 
+286895.033613  9106566.884052 
+286910.876622  9106558.865610 
+286938.594570  9106543.828772 
+286951.543672  9106547.861621 
+286966.516966  9106556.919495 
+286980.430700  9106556.935234 
+286993.350594  9106556.949844 
+287004.246296  9106551.939424 
+287044.862168  9106533.903466 
+287066.595103  9106515.846158 
+287087.378013  9106503.815056 
+287109.242412  9106503.839733 
+287138.129416  9106512.913244 
+287170.940624  9106514.959328 
+287181.850901  9106511.957982 
+287219.580127  9106506.977745 
+287248.394052  9106506.005632 
+287271.179178  9106495.985803 
+287276.075263  9106485.945846 
+287293.788866  9106461.856657 
+287303.676042  9106454.835951 
+287318.525075  9106446.816275 
+287336.326362  9106434.781729 
+287347.163496  9106421.734808 
+287352.994908  9106403.659532 
+287364.745448  9106379.563631 
+287372.615689  9106368.522467 
+287398.250605  9106340.423974 
+287407.998827  9106314.316730 
+287406.880710  9106297.238197 
+287408.510140  9106248.017286 
+287417.213345  9106214.877052 
+287426.961545  9106188.769812 
+287460.495781  9106153.648367 
+287515.769820  9106101.474023 
+287549.428240  9106083.429947 
+287571.219246  9106073.408917 
+287612.791635  9106050.350947 
+287634.553348  9106036.311681 
+287650.308220  9106016.238420 
+287589.553392  9105998.088589 
+287581.588186  9105996.070575 
+287452.120741  9105958.757120 
+287393.360965  9105941.613774 
+287429.372238  9105837.181513 
+287473.202642  9105851.294430 
+287483.900739  9105819.160995 
+287522.798173  9105701.672881 
+287524.756565  9105697.656899 
+287538.362957  9105655.481280 
+287592.832218  9105492.806135 
+287627.812523  9105383.350006 
+287652.774238  9105262.832643 
+287715.427297  9105132.312155 
+287773.951319  9104980.691596 
+287746.950591  9104957.556778 
+287725.167435  9104968.582315 
+Region 1
+166
+288378.986190  9104683.017414 
+288374.747394  9104646.849222 
+288364.465335  9104599.624362 
+288355.286930  9104567.468841 
+288355.264963  9104564.455192 
+288342.162687  9104539.327096 
+288316.133892  9104513.180078 
+288277.207878  9104490.032310 
+288212.487394  9104472.883008 
+288160.649563  9104450.725266 
+288148.665604  9104442.675551 
+288117.704622  9104421.545585 
+288091.610172  9104386.357428 
+288042.080948  9104271.784112 
+287976.498020  9104136.097257 
+287956.359243  9104099.911088 
+287922.146799  9104041.609129 
+287880.992640  9103985.308404 
+287834.898944  9103933.020232 
+287824.902734  9103924.972620 
+287782.937685  9103893.784455 
+287715.229508  9103875.626271 
+287655.610312  9103876.563478 
+287637.773475  9103883.575136 
+287585.117974  9103885.524670 
+287550.335821  9103885.485295 
+287491.703033  9103885.418859 
+287449.964427  9103885.371519 
+287445.302071  9103927.557185 
+287435.933569  9104005.901191 
+287434.983582  9104011.927393 
+287431.271215  9104048.086860 
+287430.372318  9104061.144947 
+287422.881899  9104124.422888 
+287421.011118  9104140.493513 
+287410.714529  9104227.877394 
+287401.367930  9104309.235076 
+287390.143254  9104405.658833 
+287389.251664  9104419.721476 
+287379.839369  9104492.038171 
+287368.592795  9104585.448272 
+287366.743917  9104604.532565 
+287282.710627  9104528.091715 
+287158.670680  9104416.445945 
+287143.661713  9104402.365185 
+287109.170822  9104442.507820 
+287073.146399  9104408.312119 
+286915.012321  9104254.435487 
+286894.295830  9104275.507305 
+286822.346792  9104357.797943 
+286798.670698  9104381.879995 
+286797.786205  9104396.947228 
+286751.078010  9104396.893653 
+286751.558866  9104463.194508 
+286754.726848  9104625.935238 
+286728.895422  9104626.910171 
+286727.748615  9104605.813304 
+286725.887810  9104486.269704 
+286719.065423  9104367.724948 
+286717.328635  9104265.258825 
+286718.162177  9104243.159676 
+286717.608618  9104166.813214 
+286714.936432  9104072.382407 
+286711.481711  9104007.082655 
+286708.034304  9103942.787458 
+286704.317519  9103841.323575 
+286701.543620  9103732.828915 
+286699.301249  9103697.667059 
+286695.941353  9103645.426551 
+286681.056565  9103648.423042 
+286608.525512  9103650.348451 
+286543.981017  9103657.305736 
+286494.277649  9103655.239143 
+286462.462252  9103653.193210 
+286423.719510  9103655.157436 
+286409.843003  9103660.164115 
+286383.120119  9103675.201418 
+286340.802209  9103732.411823 
+286312.440758  9103795.665727 
+286295.822825  9103833.819443 
+286241.935584  9103940.239483 
+286233.144226  9103961.324886 
+286224.367404  9103984.419412 
+286205.587279  9103998.461339 
+286190.709578  9104002.462264 
+286187.735491  9104003.463361 
+286167.309481  9104064.717371 
+286165.569107  9104098.870161 
+286164.924319  9104147.087971 
+286169.401191  9104216.407348 
+286168.242590  9104330.925070 
+286165.515734  9104366.081267 
+286155.795957  9104396.206580 
+286147.004518  9104417.291993 
+286136.218209  9104437.370536 
+286139.425032  9104468.515412 
+286148.594647  9104499.667206 
+286167.673163  9104526.812276 
+286185.779727  9104556.969864 
+286189.885849  9104575.056578 
+286201.021312  9104603.196965 
+286210.169193  9104631.335044 
+286219.280714  9104654.450312 
+286232.440204  9104687.615788 
+286286.607544  9104756.992574 
+286309.676043  9104786.151250 
+286337.815489  9104829.379492 
+286379.992012  9104889.701274 
+286435.109974  9104953.051548 
+286437.447110  9105001.272710 
+286438.477327  9105006.296654 
+286467.334131  9105011.352624 
+286493.209518  9105016.405145 
+286505.171614  9105021.441655 
+286544.090328  9105043.586503 
+286581.021460  9105065.729027 
+286592.033483  9105076.791722 
+286544.986371  9105167.147287 
+286536.129505  9105179.191728 
+286532.212546  9105187.223637 
+286502.497154  9105337.872157 
+286500.677089  9105360.974740 
+286478.562448  9105463.413555 
+286457.361439  9105554.803364 
+286440.969208  9105624.098575 
+286443.219134  9105660.264999 
+286507.955954  9105679.425717 
+286525.866599  9105682.459894 
+286546.758707  9105685.497478 
+286618.488773  9105709.688776 
+286635.405605  9105712.721768 
+286647.346041  9105714.744517 
+286736.979543  9105740.965155 
+286796.740110  9105759.115173 
+286793.831588  9105769.157351 
+286931.270825  9105809.495669 
+287031.858499  9105838.741719 
+287067.037444  9105756.408670 
+287091.386498  9105688.127018 
+287112.081461  9105664.041321 
+287142.707272  9105638.962318 
+287153.588147  9105631.942805 
+287156.562295  9105630.941625 
+287169.357781  9105613.878803 
+287196.899846  9105574.732628 
+287207.663860  9105551.640221 
+287217.455958  9105531.560356 
+287229.257583  9105514.496404 
+287234.146323  9105503.451916 
+287244.946821  9105485.382285 
+287247.877141  9105478.353769 
+287255.645072  9105453.248880 
+287261.447283  9105431.155409 
+287275.002803  9105381.947940 
+287276.939304  9105374.918301 
+287283.574652  9105330.725744 
+287291.123478  9105275.484206 
+287296.728502  9105226.267752 
+287301.325116  9105175.041064 
+287406.295978  9105123.927823 
+287567.708676  9105044.750696 
+287725.167435  9104968.582315 
+287746.950591  9104957.556778 
+287858.847572  9104902.432314 
+288064.832768  9104803.212836 
+288378.986190  9104683.017414 
+Region 1
+68
+287422.138685  9103885.339937 
+287399.311010  9103889.332203 
+287361.532896  9103887.280185 
+287340.641691  9103884.242793 
+287281.695183  9103840.980183 
+287249.784936  9103825.875622 
+287232.817810  9103815.810808 
+287215.865275  9103807.755098 
+287204.889986  9103801.715294 
+287189.895844  9103789.643613 
+287172.899576  9103775.560544 
+287126.967190  9103745.371641 
+287106.975053  9103729.276018 
+287073.011774  9103705.128012 
+287043.067354  9103687.011865 
+287005.158189  9103666.877470 
+286973.262698  9103653.781775 
+286953.321648  9103644.717963 
+286934.396234  9103638.668954 
+286912.511357  9103635.630188 
+286839.965859  9103635.546848 
+286801.230510  9103638.515951 
+286765.432784  9103635.461102 
+286728.684964  9103638.432432 
+286707.852094  9103643.431179 
+286695.941353  9103645.426551 
+286699.301249  9103697.667059 
+286701.543620  9103732.828915 
+286704.317519  9103841.323575 
+286708.034304  9103942.787458 
+286711.481711  9104007.082655 
+286714.936432  9104072.382407 
+286717.608618  9104166.813214 
+286718.162177  9104243.159676 
+286717.328635  9104265.258825 
+286719.065423  9104367.724948 
+286725.887810  9104486.269704 
+286727.748615  9104605.813304 
+286728.895422  9104626.910171 
+286754.726848  9104625.935238 
+286751.558866  9104463.194508 
+286751.078010  9104396.893653 
+286797.786205  9104396.947228 
+286798.670698  9104381.879995 
+286822.346792  9104357.797943 
+286894.295830  9104275.507305 
+286915.012321  9104254.435487 
+287073.146399  9104408.312119 
+287109.170822  9104442.507820 
+287143.661713  9104402.365185 
+287158.670680  9104416.445945 
+287282.710627  9104528.091715 
+287366.743917  9104604.532565 
+287368.592795  9104585.448272 
+287379.839369  9104492.038171 
+287389.251664  9104419.721476 
+287390.143254  9104405.658833 
+287401.367930  9104309.235076 
+287410.714529  9104227.877394 
+287421.011118  9104140.493513 
+287422.881899  9104124.422888 
+287430.372318  9104061.144947 
+287431.271215  9104048.086860 
+287434.983582  9104011.927393 
+287435.933569  9104005.901191 
+287445.302071  9103927.557185 
+287449.964427  9103885.371519 
+287422.138685  9103885.339937 
+Region 1
+296
+286507.928982  9107455.470770 
+286307.455525  9107357.800981 
+286308.376460  9107347.756522 
+286308.259783  9107331.683571 
+286310.145408  9107317.622008 
+286313.996873  9107300.549038 
+286319.785006  9107276.446421 
+286360.051826  9107210.192025 
+286456.421148  9107068.660304 
+286551.796076  9106927.127381 
+286560.638574  9106913.073748 
+286537.838424  9106921.084186 
+286518.977186  9106924.076352 
+286493.159000  9106927.060580 
+286461.348540  9106926.019758 
+286435.493878  9106923.981160 
+286413.600027  9106919.937967 
+286359.822799  9106904.808273 
+286315.991373  9106890.694436 
+286267.154277  9106871.552061 
+286202.422919  9106853.395950 
+286153.687890  9106848.317277 
+286113.926643  9106847.267067 
+286083.102748  9106845.222543 
+286048.339871  9106848.196230 
+285926.125465  9106852.073708 
+285885.392160  9106854.035835 
+285814.857875  9106857.972615 
+285666.817672  9106863.828664 
+285642.921576  9106857.773643 
+285622.993617  9106850.718654 
+285607.055617  9106845.677394 
+285595.107574  9106842.649867 
+285578.153907  9106834.593750 
+285568.179024  9106829.559395 
+285557.210292  9106824.523882 
+285548.236538  9106820.495239 
+285486.632272  9106822.432758 
+285483.279902  9106771.196516 
+285436.350820  9106741.005224 
+285385.431858  9106708.800104 
+285377.871683  9106625.413111 
+285375.687767  9106598.287541 
+285310.130144  9106603.233805 
+285251.522158  9106607.183546 
+285175.996923  9106608.099736 
+285145.136770  9106601.031689 
+285131.179314  9106594.987987 
+285115.205118  9106584.923686 
+285094.196337  9106565.812450 
+285069.284783  9106556.742201 
+285054.369798  9106555.720138 
+285040.477699  9106558.717503 
+285006.715882  9106562.696082 
+285001.724862  9106559.676543 
+284962.725250  9106526.480265 
+284903.725384  9106476.182889 
+284902.412275  9106431.980746 
+284896.391151  9106423.937180 
+284874.279860  9106389.756113 
+284857.079797  9106347.544344 
+284853.945925  9106326.444902 
+284856.767867  9106304.347925 
+284846.655338  9106280.226569 
+284824.478900  9106237.004337 
+284791.181704  9106167.650389 
+284787.133822  9106157.600007 
+284769.027148  9106127.441806 
+284682.897201  9106035.924881 
+284664.863137  9106015.812298 
+284659.763481  9105997.724163 
+284663.622866  9105981.655771 
+284665.538063  9105971.612436 
+284667.446011  9105960.564532 
+284673.895525  9105890.252944 
+284675.716502  9105867.150212 
+284668.643699  9105851.068854 
+284658.545917  9105828.956542 
+284638.444590  9105797.791303 
+284598.242030  9105735.460777 
+284527.976883  9105776.564235 
+284422.114558  9105842.739247 
+284396.412403  9105861.795287 
+284337.093522  9105904.920707 
+284265.935314  9105960.086685 
+284222.423514  9105990.171572 
+284178.933363  9106023.270146 
+284107.535962  9106045.285081 
+284099.606932  9106048.289275 
+284039.163403  9106073.330930 
+284008.412133  9106081.330560 
+283893.241952  9106097.265279 
+283797.941296  9106112.219089 
+283780.073766  9106115.211265 
+283742.336546  9106119.184054 
+283492.067806  9106143.995853 
+283488.092415  9106143.991039 
+283358.957146  9106152.875588 
+283250.685357  9106160.780588 
+283101.817103  9106189.731798 
+283067.097243  9106198.730573 
+283034.365066  9106207.731751 
+282993.689267  9106217.727775 
+282960.928204  9106222.710592 
+282903.342442  9106230.676732 
+282892.460530  9106237.695407 
+282881.607452  9106248.732395 
+282873.735930  9106259.773032 
+282784.742389  9106184.321225 
+282786.614780  9106168.250392 
+282790.539738  9106161.223212 
+282780.565185  9106156.188125 
+282772.585543  9106152.160054 
+282770.583427  9106150.148457 
+282766.550368  9106142.106943 
+282758.649999  9106149.129244 
+282745.823605  9106162.172923 
+282747.948227  9106181.262375 
+282751.102739  9106205.375945 
+282741.365986  9106233.491979 
+282725.615655  9106254.568638 
+282713.833524  9106274.645595 
+282700.078084  9106296.729271 
+282687.316489  9106318.814166 
+282671.551697  9106337.881659 
+282654.785830  9106355.943348 
+282640.987112  9106371.999537 
+282637.134167  9106389.072516 
+282646.179760  9106403.147625 
+282670.089997  9106411.213556 
+282695.995162  9106420.286490 
+282715.022605  9106440.401251 
+282720.200907  9106469.540156 
+282704.457717  9106491.621407 
+282676.658471  9106495.605587 
+282653.814104  9106497.586692 
+282626.029254  9106503.580003 
+282608.161382  9106506.571769 
+282581.298329  9106502.520472 
+282552.425945  9106495.452972 
+282526.556756  9106491.402862 
+282499.679303  9106485.342351 
+282473.802916  9106480.287627 
+282459.766440  9106463.192609 
+282452.636588  9106439.074089 
+282438.607336  9106422.983640 
+282422.604777  9106408.899899 
+282399.688413  9106400.835049 
+282374.870726  9106404.822714 
+282352.040751  9106408.812821 
+282327.201454  9106409.786716 
+282305.271757  9106400.718462 
+282293.194294  9106379.607498 
+282279.165112  9106363.516981 
+282268.095926  9106344.416398 
+282253.008142  9106319.283397 
+282242.932839  9106300.184032 
+282231.849298  9106279.074267 
+282218.799641  9106260.975782 
+282198.872135  9106253.919081 
+282175.041144  9106256.903269 
+282166.211529  9106272.965506 
+282169.322593  9106291.051692 
+282183.344521  9106306.137677 
+282193.391025  9106321.218731 
+282175.623873  9106338.274473 
+282164.691422  9106338.260925 
+282157.856707  9106355.330211 
+282146.067076  9106374.402503 
+282125.282336  9106386.431623 
+282105.397932  9106385.402389 
+282101.379332  9106379.369959 
+282099.377225  9106377.358327 
+282097.375119  9106375.346695 
+282089.409850  9106373.327664 
+282087.429322  9106374.329781 
+282084.469319  9106377.339831 
+282077.634568  9106394.409113 
+282074.768066  9106410.478745 
+282073.817360  9106416.505011 
+282075.977708  9106440.617476 
+282077.129813  9106462.719540 
+282076.322969  9106488.837471 
+282072.469799  9106505.910454 
+282047.666368  9106511.907126 
+282029.798398  9106514.898673 
+282009.899545  9106511.860242 
+282003.929170  9106510.848253 
+281980.112391  9106515.841541 
+281962.244409  9106518.833062 
+281956.216508  9106509.784395 
+281936.332035  9106508.755099 
+281910.534701  9106514.750464 
+281886.804166  9106531.798717 
+281881.928299  9106544.852128 
+281876.108887  9106564.936393 
+281890.181174  9106587.054560 
+281895.315868  9106610.166178 
+281894.516126  9106637.288714 
+281892.708139  9106662.400846 
+281891.929973  9106692.537135 
+281886.160895  9106719.653492 
+281868.429426  9106741.732098 
+281849.668123  9106758.786542 
+281826.873809  9106767.799359 
+281804.093861  9106778.821335 
+281779.304592  9106786.827073 
+281755.487620  9106791.820283 
+281731.749700  9106807.863917 
+281682.056097  9106807.801951 
+281650.137218  9106791.688896 
+281629.215611  9106784.630739 
+281607.314505  9106779.580499 
+281584.455448  9106779.551935 
+281560.580967  9106776.508358 
+281538.665499  9106769.448911 
+281513.775601  9106763.390305 
+281485.932817  9106761.346297 
+281462.043977  9106756.293491 
+281441.187020  9106758.276514 
+281426.379456  9106772.322044 
+281411.593422  9106789.381331 
+281400.797232  9106808.454774 
+281386.054257  9106831.541579 
+281366.341893  9106854.622151 
+281343.497125  9106856.602647 
+281320.602105  9106851.551022 
+281300.681534  9106845.498541 
+281277.793696  9106841.451479 
+281262.986047  9106855.496973 
+281252.196953  9106875.574987 
+281231.390144  9106884.590043 
+281221.487262  9106889.600486 
+281231.569559  9106909.704736 
+281241.630336  9106926.795219 
+281246.815038  9106956.939092 
+281231.035001  9106973.997102 
+281205.179809  9106971.955446 
+281185.273536  9106967.912099 
+281174.513092  9106992.008460 
+281183.615879  9107014.120646 
+281198.681956  9107036.240323 
+281226.725912  9107066.412926 
+281197.960793  9107074.413412 
+281176.095416  9107074.385926 
+281163.268255  9107087.429323 
+281153.494492  9107110.522350 
+281148.797775  9107148.690448 
+281155.884129  9107166.781781 
+281180.724025  9107165.808425 
+281170.878496  9107178.855577 
+281151.094125  9107191.890234 
+281136.250457  9107200.912782 
+281438.148767  9107445.403718 
+281608.166309  9107593.288558 
+281720.179556  9107690.871708 
+281724.638380  9107619.552371 
+281738.669333  9107497.011567 
+281748.645655  9107363.415399 
+281758.550116  9107219.773389 
+281808.395172  9107240.931431 
+283354.863807  9107932.963540 
+283987.023492  9108216.002645 
+284325.526238  9108434.393547 
+284331.518619  9108438.418862 
+284367.581759  9108477.639276 
+284386.770512  9108519.853450 
+284430.995409  9108588.215655 
+284470.229190  9108653.558235 
+284518.451753  9108724.938666 
+284532.576904  9108754.087489 
+284555.886813  9108816.397552 
+284574.161932  9108869.660648 
+284608.883132  9108860.660297 
+284843.907101  9108787.602242 
+285415.161571  9108618.495205 
+285496.500505  9108596.488856 
+285525.279652  9108590.494705 
+285530.132592  9108574.427423 
+285534.970967  9108556.351014 
+285558.249020  9108477.018024 
+285573.692445  9108413.748882 
+285589.274209  9108369.566439 
+285598.980030  9108337.431880 
+285618.333389  9108265.126261 
+285649.314710  9108151.647318 
+285930.969928  9107794.350127 
+285940.894065  9107792.352410 
+286242.571115  9107729.410860 
+286324.894355  9107706.400061 
+286503.469190  9107662.402993 
+286543.136196  9107650.393430 
+286630.406429  9107624.374110 
+286713.679166  9107595.336476 
+286757.299553  9107580.317579 
+286507.928982  9107455.470770 
+Region 1
+79
+283358.957146  9106152.875588 
+283353.843512  9106132.778031 
+283349.774267  9106119.713713 
+283341.700758  9106102.626261 
+283323.645472  9106079.499273 
+283317.639079  9106073.464569 
+283310.595531  9106061.401197 
+283305.539681  9106049.340238 
+283302.449873  9106034.267965 
+283296.176441  9105991.063919 
+283292.071148  9105972.976704 
+283284.933808  9105947.853823 
+283262.506365  9105869.470221 
+283247.245163  9105820.227796 
+283240.136752  9105799.123203 
+283236.045948  9105783.045126 
+283230.975736  9105768.974991 
+283203.523331  9105821.179089 
+283174.903895  9105849.272114 
+283160.053960  9105857.290552 
+283146.190649  9105864.305622 
+283134.516990  9105899.451287 
+283129.742526  9105926.568820 
+283120.754644  9105920.530440 
+283081.785543  9105891.350365 
+283033.527046  9105952.570130 
+283006.909529  9105982.674678 
+282997.035957  9105991.703732 
+282982.193146  9106000.726708 
+282942.547395  9106015.746753 
+282900.899497  9106028.755177 
+282886.020605  9106032.755234 
+282873.223115  9106049.817249 
+282874.418800  9106077.946678 
+282872.582480  9106099.040402 
+282855.679820  9106098.015125 
+282832.770812  9106090.955058 
+282815.810495  9106081.893131 
+282807.809246  9106074.851325 
+282786.729411  9106045.692919 
+282782.674745  9106034.637666 
+282781.457506  9106003.494481 
+282779.253633  9105973.354655 
+282777.107413  9105951.251464 
+282774.946787  9105927.139113 
+282773.859270  9105914.078358 
+282770.805679  9105904.028900 
+282766.808678  9105901.010278 
+282760.838396  9105899.998374 
+282756.863011  9105899.993490 
+282754.918547  9105906.018527 
+282744.087102  9105920.069212 
+282745.217839  9105939.157448 
+282747.400067  9105966.283543 
+282748.602864  9105995.417576 
+282753.781063  9106024.556490 
+282758.916039  9106047.667923 
+282774.947342  9106065.769874 
+282791.986921  9106085.882194 
+282792.167091  9106110.996679 
+282775.451792  9106136.090440 
+282766.550368  9106142.106943 
+282770.583427  9106150.148457 
+282772.585543  9106152.160054 
+282780.565185  9106156.188125 
+282790.539738  9106161.223212 
+282786.614780  9106168.250392 
+282784.742389  9106184.321225 
+282873.735930  9106259.773032 
+282881.607452  9106248.732395 
+282892.460530  9106237.695407 
+282903.342442  9106230.676732 
+282960.928204  9106222.710592 
+282993.689267  9106217.727775 
+283034.365066  9106207.731751 
+283067.097243  9106198.730573 
+283101.817103  9106189.731798 
+283250.685357  9106160.780588 
+283358.957146  9106152.875588 
+Region 1
+123
+283447.272387  9105304.123410 
+283456.813751  9105248.883810 
+283443.971371  9105121.288118 
+283434.875418  9105100.181126 
+283429.805281  9105086.111005 
+283409.979291  9105093.118828 
+283357.414771  9105108.123277 
+283337.545474  9105109.103611 
+283280.846922  9105102.002433 
+283191.316063  9105089.838187 
+283145.535184  9105080.741042 
+283127.322894  9105174.143677 
+283123.441297  9105187.198325 
+283111.868586  9105236.408049 
+282968.166762  9105292.487821 
+282978.429367  9105337.706059 
+282979.452026  9105341.725594 
+282962.672170  9105357.778129 
+282942.896389  9105371.817843 
+282940.095037  9105396.928658 
+282953.144596  9105415.026930 
+282962.182792  9105428.097427 
+282942.406986  9105442.137148 
+282918.482883  9105432.062089 
+282897.619552  9105433.041046 
+282891.692567  9105438.056619 
+282890.850041  9105459.151562 
+282881.062991  9105480.235521 
+282852.335396  9105493.259651 
+282830.499804  9105497.251101 
+282812.524293  9105485.174156 
+282803.514930  9105476.121941 
+282777.581539  9105463.030619 
+282759.663672  9105458.990285 
+282750.704740  9105456.970115 
+282747.644007  9105445.916064 
+282747.593593  9105438.884004 
+282733.528654  9105417.770690 
+282722.596460  9105417.757224 
+282711.707473  9105423.771237 
+282701.769113  9105423.758991 
+282691.845154  9105425.755903 
+282674.978741  9105429.753398 
+282668.108289  9105441.799785 
+282655.253212  9105450.825078 
+282639.409419  9105458.842110 
+282617.616993  9105468.860942 
+282596.775200  9105472.853507 
+282563.035103  9105479.843851 
+282545.210797  9105488.862982 
+282527.400878  9105499.891271 
+282524.556113  9105518.974629 
+282529.683656  9105541.081555 
+282521.884089  9105562.167936 
+282506.105003  9105579.226167 
+282498.283829  9105597.298804 
+282497.441133  9105618.393783 
+282505.571807  9105643.518139 
+282516.669624  9105666.637012 
+282531.728428  9105687.751624 
+282550.705028  9105700.834487 
+282568.666196  9105710.902371 
+282576.645740  9105714.930502 
+282590.617144  9105722.984309 
+282612.568102  9105735.066234 
+282632.545785  9105749.154857 
+282650.535792  9105763.241020 
+282667.582381  9105784.358011 
+282685.608425  9105803.467054 
+282704.657144  9105826.595629 
+282718.715045  9105846.704341 
+282734.746243  9105864.806329 
+282757.755989  9105885.930595 
+282756.863011  9105899.993490 
+282760.838396  9105899.998374 
+282766.808678  9105901.010278 
+282770.805679  9105904.028900 
+282773.859270  9105914.078358 
+282774.946787  9105927.139113 
+282777.107413  9105951.251464 
+282779.253633  9105973.354655 
+282781.457506  9106003.494481 
+282782.674745  9106034.637666 
+282786.729411  9106045.692919 
+282807.809246  9106074.851325 
+282815.810495  9106081.893131 
+282832.770812  9106090.955058 
+282855.679820  9106098.015125 
+282872.582480  9106099.040402 
+282874.418800  9106077.946678 
+282873.223115  9106049.817249 
+282886.020605  9106032.755234 
+282900.899497  9106028.755177 
+282942.547395  9106015.746753 
+282982.193146  9106000.726708 
+282997.035957  9105991.703732 
+283006.909529  9105982.674678 
+283033.527046  9105952.570130 
+283081.785543  9105891.350365 
+283120.754644  9105920.530440 
+283129.742526  9105926.568820 
+283134.516990  9105899.451287 
+283146.190649  9105864.305622 
+283160.053960  9105857.290552 
+283174.903895  9105849.272114 
+283203.523331  9105821.179089 
+283230.975736  9105768.974991 
+283243.794657  9105754.926655 
+283287.184490  9105707.764804 
+283315.746043  9105671.635130 
+283330.451559  9105643.525128 
+283341.210578  9105619.428595 
+283346.071518  9105604.365993 
+283359.869763  9105588.309700 
+283379.551628  9105561.210317 
+283386.335270  9105537.108946 
+283389.251823  9105528.071386 
+283401.897426  9105489.913200 
+283421.478193  9105448.749747 
+283436.133076  9105413.607708 
+283437.047519  9105402.558579 
+283440.799113  9105371.421552 
+283447.272387  9105304.123410 
+Region 1
+59
+284396.412403  9105861.795287 
+284392.221700  9105694.028424 
+284396.090407  9105541.339596 
+284213.647954  9105461.760910 
+284141.026113  9105451.628183 
+284086.379983  9105453.571696 
+284076.441690  9105453.559756 
+284050.602128  9105453.528702 
+283987.040416  9105459.479635 
+283943.340812  9105463.445280 
+283778.596137  9105495.392649 
+283615.838751  9105527.341876 
+283503.701595  9105550.310934 
+283478.855731  9105550.280770 
+283462.939940  9105548.252306 
+283434.075425  9105542.189832 
+283412.146104  9105533.122067 
+283389.251823  9105528.071386 
+283386.335270  9105537.108946 
+283379.551628  9105561.210317 
+283359.869763  9105588.309700 
+283346.071518  9105604.365993 
+283341.210578  9105619.428595 
+283330.451559  9105643.525128 
+283315.746043  9105671.635130 
+283287.184490  9105707.764804 
+283243.794657  9105754.926655 
+283230.975736  9105768.974991 
+283236.045948  9105783.045126 
+283240.136752  9105799.123203 
+283247.245163  9105820.227796 
+283262.506365  9105869.470221 
+283284.933808  9105947.853823 
+283292.071148  9105972.976704 
+283296.176441  9105991.063919 
+283302.449873  9106034.267965 
+283305.539681  9106049.340238 
+283310.595531  9106061.401197 
+283317.639079  9106073.464569 
+283323.645472  9106079.499273 
+283341.700758  9106102.626261 
+283349.774267  9106119.713713 
+283353.843512  9106132.778031 
+283358.957146  9106152.875588 
+283488.092415  9106143.991039 
+283492.067806  9106143.995853 
+283742.336546  9106119.184054 
+283780.073766  9106115.211265 
+283797.941296  9106112.219089 
+283893.241952  9106097.265279 
+284008.412133  9106081.330560 
+284039.163403  9106073.330930 
+284099.606932  9106048.289275 
+284107.535962  9106045.285081 
+284178.933363  9106023.270146 
+284222.423514  9105990.171572 
+284265.935314  9105960.086685 
+284337.093522  9105904.920707 
+284396.412403  9105861.795287 
+Region 1
+153
+285443.486256  9105116.645893 
+285441.375203  9105099.565952 
+285438.263079  9105081.480280 
+285425.988852  9105033.247150 
+285408.687534  9104976.971649 
+285297.678123  9105018.028003 
+285015.275008  9105133.219113 
+284814.102510  9105212.341056 
+284766.558556  9105234.384951 
+284751.694719  9105240.394663 
+284730.867950  9105246.397287 
+284720.929739  9105246.385478 
+284709.997705  9105246.372487 
+284660.205227  9105232.249427 
+284413.288661  9105169.672129 
+284264.898181  9105126.298265 
+284270.694721  9105103.200265 
+284269.635794  9105094.157928 
+284272.537681  9105083.111214 
+284276.418918  9105070.056549 
+284282.323963  9105062.027126 
+284286.248601  9105054.999891 
+284289.186654  9105048.976036 
+284293.096822  9105039.939657 
+284293.982128  9105024.872274 
+284291.929384  9105015.828746 
+284289.912812  9105011.808076 
+284287.896239  9105007.787406 
+284283.877563  9105001.755209 
+284280.867174  9104997.733346 
+284273.932148  9105000.738717 
+284266.989888  9105002.739515 
+284264.015667  9105003.740510 
+284256.065120  9105003.730970 
+284252.097080  9105004.730772 
+284250.189007  9105015.778677 
+284252.234510  9105023.817637 
+284244.312892  9105027.826384 
+284236.376806  9105029.825986 
+284227.367341  9105020.774101 
+284218.350647  9105010.717642 
+284168.471696  9104984.539068 
+284153.528267  9104979.498285 
+284144.547749  9104974.464668 
+284118.592794  9104958.360424 
+284094.632720  9104943.263127 
+284077.651070  9104931.187910 
+284079.530274  9104916.121711 
+284080.451804  9104906.077180 
+284081.402249  9104900.050939 
+284078.384655  9104895.024484 
+284068.374203  9104884.966783 
+284061.330749  9104872.903526 
+284050.348172  9104865.858340 
+284029.470800  9104864.828608 
+284008.593427  9104863.798866 
+283998.662488  9104864.791451 
+283987.766637  9104869.801128 
+283972.960550  9104883.847166 
+283956.145141  9104894.877081 
+283934.295605  9104896.859829 
+283909.515185  9104905.870981 
+283897.647166  9104913.893161 
+283877.850266  9104924.919452 
+283855.035780  9104930.919260 
+283811.213848  9104917.806893 
+283803.219963  9104911.769823 
+283798.207535  9104905.736361 
+283787.203308  9104895.677380 
+283780.224913  9104892.655232 
+283771.280547  9104892.644398 
+283760.370208  9104895.644878 
+283747.450566  9104895.629223 
+283732.557728  9104897.620304 
+283722.612319  9104896.603682 
+283709.671013  9104893.574291 
+283695.699789  9104885.520816 
+283693.704931  9104884.513830 
+283688.721398  9104882.498651 
+283684.753343  9104883.498403 
+283679.791469  9104884.496949 
+283671.855358  9104886.496451 
+283660.887254  9104881.460307 
+283653.843894  9104869.396959 
+283659.698520  9104854.335570 
+283667.591312  9104846.308620 
+283670.543890  9104842.293939 
+283671.494393  9104836.267694 
+283670.435603  9104827.225311 
+283666.481990  9104830.234211 
+283652.676823  9104845.285946 
+283637.885048  9104861.341048 
+283624.087081  9104877.397355 
+283617.094257  9104872.366027 
+283584.659111  9104922.554951 
+283563.018803  9104953.670220 
+283551.186775  9104966.715206 
+283531.497986  9104992.810007 
+283510.880303  9105027.944779 
+283486.366677  9105074.125049 
+283466.533491  9105080.128318 
+283452.605519  9105078.102228 
+283429.805281  9105086.111005 
+283434.875418  9105100.181126 
+283443.971371  9105121.288118 
+283456.813751  9105248.883810 
+283447.272387  9105304.123410 
+283440.799113  9105371.421552 
+283437.047519  9105402.558579 
+283436.133076  9105413.607708 
+283421.478193  9105448.749747 
+283401.897426  9105489.913200 
+283389.251823  9105528.071386 
+283412.146104  9105533.122067 
+283434.075425  9105542.189832 
+283462.939940  9105548.252306 
+283478.855731  9105550.280770 
+283503.701595  9105550.310934 
+283615.838751  9105527.341876 
+283778.596137  9105495.392649 
+283943.340812  9105463.445280 
+283987.040416  9105459.479635 
+284050.602128  9105453.528702 
+284076.441690  9105453.559756 
+284086.379983  9105453.571696 
+284141.026113  9105451.628183 
+284213.647954  9105461.760910 
+284396.090407  9105541.339596 
+284392.221700  9105694.028424 
+284396.412403  9105861.795287 
+284422.114558  9105842.739247 
+284527.976883  9105776.564235 
+284598.242030  9105735.460777 
+284672.366413  9105678.288851 
+284689.116606  9105658.217521 
+284714.767772  9105632.129386 
+284756.218703  9105591.996134 
+284769.037004  9105577.947489 
+284810.458842  9105533.795936 
+284894.267103  9105441.475675 
+284919.968781  9105422.419454 
+284957.429542  9105380.272264 
+285015.608198  9105317.053799 
+285067.221614  9105308.073715 
+285134.685336  9105292.080354 
+285230.998770  9105280.139094 
+285248.873001  9105278.151008 
+285346.245465  9105275.251776 
+285424.880543  9105292.421505 
+285446.817161  9105302.492783 
+285448.274721  9105229.161857 
+285447.737415  9105154.824033 
+285443.486256  9105116.645893 
+Region 1
+150
+286787.386468  9106386.947715 
+286710.656845  9106358.733086 
+286714.486271  9106338.646457 
+286721.940842  9106270.345583 
+286734.145714  9106171.913639 
+286744.479648  9106089.552359 
+286754.915706  9106021.254889 
+286755.566683  9105974.041812 
+286759.359625  9105948.932400 
+286774.626208  9105861.554002 
+286783.227785  9105814.349986 
+286793.831588  9105769.157351 
+286796.740110  9105759.115173 
+286736.979543  9105740.965155 
+286647.346041  9105714.744517 
+286635.405605  9105712.721768 
+286618.488773  9105709.688776 
+286546.758707  9105685.497478 
+286525.866599  9105682.459894 
+286507.955954  9105679.425717 
+286443.219134  9105660.264999 
+286440.969208  9105624.098575 
+286429.021508  9105621.071205 
+286391.227194  9105617.009586 
+286358.401982  9105612.953648 
+286315.653129  9105610.895369 
+286299.759279  9105611.881627 
+286273.934499  9105613.860996 
+286232.237697  9105619.840266 
+286193.566021  9105631.850306 
+286133.980374  9105637.808855 
+286102.170780  9105636.767560 
+286068.344428  9105631.705697 
+286033.480597  9105620.615287 
+285989.650549  9105606.500802 
+285954.743096  9105589.382948 
+285932.798993  9105578.307417 
+285869.948204  9105545.084206 
+285849.999052  9105535.015495 
+285840.017207  9105528.976573 
+285766.169074  9105486.699409 
+285671.363624  9105432.342994 
+285617.464814  9105400.134328 
+285601.469246  9105387.056425 
+285565.517388  9105362.905079 
+285544.560015  9105350.825905 
+285533.584423  9105344.785733 
+285477.719942  9105315.588219 
+285446.817161  9105302.492783 
+285424.880543  9105292.421505 
+285346.245465  9105275.251776 
+285248.873001  9105278.151008 
+285230.998770  9105280.139094 
+285134.685336  9105292.080354 
+285067.221614  9105308.073715 
+285015.608198  9105317.053799 
+284957.429542  9105380.272264 
+284919.968781  9105422.419454 
+284894.267103  9105441.475675 
+284810.458842  9105533.795936 
+284769.037004  9105577.947489 
+284756.218703  9105591.996134 
+284714.767772  9105632.129386 
+284689.116606  9105658.217521 
+284672.366413  9105678.288851 
+284598.242030  9105735.460777 
+284638.444590  9105797.791303 
+284658.545917  9105828.956542 
+284668.643699  9105851.068854 
+284675.716502  9105867.150212 
+284673.895525  9105890.252944 
+284667.446011  9105960.564532 
+284665.538063  9105971.612436 
+284663.622866  9105981.655771 
+284659.763481  9105997.724163 
+284664.863137  9106015.812298 
+284682.897201  9106035.924881 
+284769.027148  9106127.441806 
+284787.133822  9106157.600007 
+284791.181704  9106167.650389 
+284824.478900  9106237.004337 
+284846.655338  9106280.226569 
+284856.767867  9106304.347925 
+284853.945925  9106326.444902 
+284857.079797  9106347.544344 
+284874.279860  9106389.756113 
+284896.391151  9106423.937180 
+284902.412275  9106431.980746 
+284903.725384  9106476.182889 
+284962.725250  9106526.480265 
+285001.724862  9106559.676543 
+285006.715882  9106562.696082 
+285040.477699  9106558.717503 
+285054.369798  9106555.720138 
+285069.284783  9106556.742201 
+285094.196337  9106565.812450 
+285115.205118  9106584.923686 
+285131.179314  9106594.987987 
+285145.136770  9106601.031689 
+285175.996923  9106608.099736 
+285251.522158  9106607.183546 
+285310.130144  9106603.233805 
+285375.687767  9106598.287541 
+285377.871683  9106625.413111 
+285385.431858  9106708.800104 
+285436.350820  9106741.005224 
+285483.279902  9106771.196516 
+285486.632272  9106822.432758 
+285548.236538  9106820.495239 
+285557.210292  9106824.523882 
+285568.179024  9106829.559395 
+285578.153907  9106834.593750 
+285595.107574  9106842.649867 
+285607.055617  9106845.677394 
+285622.993617  9106850.718654 
+285642.921576  9106857.773643 
+285666.817672  9106863.828664 
+285814.857875  9106857.972615 
+285885.392160  9106854.035835 
+285926.125465  9106852.073708 
+286048.339871  9106848.196230 
+286083.102748  9106845.222543 
+286113.926643  9106847.267067 
+286153.687890  9106848.317277 
+286202.422919  9106853.395950 
+286267.154277  9106871.552061 
+286315.991373  9106890.694436 
+286359.822799  9106904.808273 
+286413.600027  9106919.937967 
+286435.493878  9106923.981160 
+286461.348540  9106926.019758 
+286493.159000  9106927.060580 
+286518.977186  9106924.076352 
+286537.838424  9106921.084186 
+286560.638574  9106913.073748 
+286576.386933  9106891.996127 
+286586.215970  9106876.939066 
+286636.362210  9106802.659439 
+286677.665870  9106742.433434 
+286710.112420  9106694.251942 
+286727.833733  9106671.167444 
+286751.452392  9106639.048700 
+286770.109117  9106607.928866 
+286773.046847  9106601.904907 
+286777.964958  9106594.878648 
+286802.482502  9106549.701780 
+286826.934312  9106495.483896 
+286843.457284  9106444.270661 
+286853.169369  9106413.140673 
+286787.386468  9106386.947715 
+Region 1
+360
+286544.090328  9105043.586503 
+286505.171614  9105021.441655 
+286493.209518  9105016.405145 
+286467.334131  9105011.352624 
+286438.477327  9105006.296654 
+286437.447110  9105001.272710 
+286435.109974  9104953.051548 
+286379.992012  9104889.701274 
+286337.815489  9104829.379492 
+286309.676043  9104786.151250 
+286286.607544  9104756.992574 
+286232.440204  9104687.615788 
+286219.280714  9104654.450312 
+286210.169193  9104631.335044 
+286201.021312  9104603.196965 
+286189.885849  9104575.056578 
+286185.779727  9104556.969864 
+286167.673163  9104526.812276 
+286148.594647  9104499.667206 
+286139.425032  9104468.515412 
+286136.218209  9104437.370536 
+286147.004518  9104417.291993 
+286155.795957  9104396.206580 
+286165.515734  9104366.081267 
+286168.242590  9104330.925070 
+286169.401191  9104216.407348 
+286164.924319  9104147.087971 
+286165.569107  9104098.870161 
+286167.309481  9104064.717371 
+286187.735491  9104003.463361 
+286176.847470  9104009.478025 
+286168.933534  9104014.491592 
+286149.304988  9104048.623585 
+286138.467839  9104061.670177 
+286122.683554  9104077.724674 
+286065.283713  9104110.808143 
+286008.819425  9104135.856216 
+285953.392449  9104166.932769 
+285920.771731  9104191.004013 
+285899.068157  9104213.078880 
+285875.376977  9104235.151419 
+285871.430866  9104239.165029 
+285817.266205  9104307.411479 
+285791.710828  9104346.559254 
+285766.068251  9104373.652259 
+285738.539730  9104414.806826 
+285721.783165  9104433.873773 
+285702.052454  9104453.941790 
+285672.550759  9104497.103143 
+285633.154575  9104546.280233 
+285606.648691  9104591.454193 
+285561.108039  9104615.510146 
+285540.288998  9104622.517617 
+285525.381953  9104622.500123 
+285508.429229  9104614.443770 
+285476.504143  9104597.328810 
+285456.599056  9104593.287191 
+285439.711665  9104594.271896 
+285418.914372  9104604.293010 
+285374.367365  9104628.349969 
+285322.080262  9104681.529947 
+285309.226085  9104690.555823 
+285286.448351  9104701.579117 
+285276.611850  9104715.631332 
+285261.820818  9104731.686821 
+285217.607364  9104664.329278 
+285167.373222  9104588.928075 
+285139.147930  9104533.643984 
+285115.949726  9104486.402278 
+285096.654299  9104429.119581 
+285083.314488  9104370.839360 
+285080.115652  9104340.698799 
+285079.992440  9104323.621149 
+285086.601141  9104275.410149 
+285110.089887  9104225.210040 
+285146.396452  9104160.961292 
+285182.673933  9104092.694269 
+285200.279499  9104053.537332 
+285218.944074  9104023.422674 
+285279.834113  9103923.038897 
+285302.408495  9103883.887832 
+285326.897912  9103834.693448 
+285328.791229  9103821.636434 
+285329.553005  9103789.491481 
+285323.307542  9103750.306334 
+285318.193624  9103730.209124 
+285288.634509  9103627.709207 
+285284.557904  9103613.640564 
+285278.276302  9103569.432558 
+285278.015384  9103533.268149 
+285279.843498  9103511.170032 
+285280.786545  9103504.139242 
+285287.525574  9103474.010479 
+285301.184808  9103438.867126 
+285333.602574  9103386.668510 
+285382.653500  9103298.325496 
+285416.035872  9103242.109774 
+285428.766441  9103216.006340 
+285468.923865  9103134.684688 
+285489.524793  9103097.540428 
+285497.322698  9103076.453945 
+285359.986877  9103049.168258 
+285293.317399  9103037.034452 
+285191.808065  9103016.822631 
+284933.080524  9102968.295174 
+284919.138805  9102964.260259 
+284928.729153  9102916.052827 
+284933.509851  9102889.939973 
+284702.492808  9102825.371095 
+284699.569350  9102833.404076 
+284637.587052  9102782.096883 
+284483.643729  9102656.341002 
+284478.703803  9102660.353289 
+284426.395427  9102710.518258 
+284424.436789  9102714.534144 
+284419.540193  9102724.573860 
+284410.762435  9102747.668208 
+284395.179987  9102791.850163 
+284367.607275  9102826.976551 
+284353.745063  9102833.991733 
+284339.882845  9102841.006911 
+284321.058994  9102849.020647 
+284297.287948  9102860.042079 
+284244.820281  9102888.106332 
+284205.170498  9102902.122178 
+284144.680334  9102920.130966 
+284045.432936  9102938.092583 
+283930.270584  9102954.025481 
+283924.315150  9102955.022792 
+283911.461003  9102964.048223 
+283894.675029  9102979.096255 
+283880.870372  9102994.147918 
+283867.051279  9103007.190429 
+283851.251838  9103021.235088 
+283831.470067  9103034.270320 
+283811.681071  9103046.300970 
+283790.855015  9103052.302949 
+283791.906486  9103060.340765 
+283788.053972  9103077.413694 
+283771.397718  9103110.544057 
+283763.577290  9103128.616708 
+283756.700158  9103139.658544 
+283743.867554  9103151.697673 
+283713.269476  9103180.792733 
+283704.404762  9103191.832137 
+283692.558701  9103202.867897 
+283685.717592  9103218.932608 
+283682.808348  9103228.974723 
+283680.885675  9103238.013476 
+283686.085318  9103270.165976 
+283691.270553  9103300.309322 
+283693.330228  9103310.357507 
+283697.435161  9103328.444727 
+283693.524923  9103337.481053 
+283680.699466  9103350.524757 
+283673.793447  9103357.548289 
+283725.737099  9103394.780692 
+283715.093936  9103434.950373 
+283706.330156  9103460.053847 
+283693.692186  9103499.216529 
+283682.148957  9103552.444485 
+283670.648989  9103611.699898 
+283661.107744  9103666.939436 
+283688.905063  9103662.955084 
+283689.236857  9103709.165562 
+283685.708902  9103771.444402 
+283686.069577  9103821.673180 
+283684.204618  9103838.748542 
+283681.374719  9103859.840995 
+283674.576847  9103881.933178 
+283668.729486  9103897.999119 
+283664.833648  9103909.044605 
+283663.991338  9103930.139482 
+283677.962218  9103938.193044 
+283677.991075  9103942.211346 
+283675.081822  9103952.253468 
+283673.173581  9103963.301377 
+283672.251925  9103973.345922 
+283677.293061  9103983.397732 
+283684.307369  9103991.442811 
+283685.423817  9104008.521804 
+283685.524824  9104022.585861 
+283683.623801  9104034.638346 
+283678.726949  9104044.678049 
+283673.801236  9104050.699450 
+283669.912610  9104062.749514 
+283662.214716  9104097.899974 
+283657.476578  9104130.040340 
+283655.618840  9104148.120279 
+283650.707545  9104156.150832 
+283642.822054  9104165.182328 
+283655.820858  9104176.248395 
+283745.270342  9104177.361801 
+283755.554803  9104225.593482 
+283760.646522  9104242.677295 
+283768.762968  9104265.792177 
+283777.822702  9104281.876239 
+283777.945415  9104298.954011 
+283778.060910  9104315.027208 
+283775.194990  9104331.096785 
+283769.390961  9104353.190190 
+283760.648818  9104381.307425 
+283757.847860  9104406.418177 
+283761.024190  9104433.545318 
+283764.121118  9104449.622135 
+283761.247976  9104464.687138 
+283760.326358  9104474.731680 
+283754.464567  9104488.788490 
+283746.680125  9104511.884061 
+283741.855452  9104531.969527 
+283742.979206  9104550.053082 
+283746.105024  9104570.148198 
+283752.118428  9104577.187458 
+283816.235056  9104648.589381 
+283830.285647  9104667.693150 
+283832.316604  9104673.723003 
+283833.375414  9104682.765376 
+283832.461041  9104693.814490 
+283824.893293  9104747.047302 
+283819.060399  9104765.122420 
+283814.235761  9104785.207890 
+283811.348200  9104798.263747 
+283807.466822  9104811.318400 
+283796.542062  9104812.309735 
+283777.673989  9104814.296009 
+283753.807945  9104812.257954 
+283740.873886  9104810.233142 
+283730.906836  9104806.202792 
+283716.942861  9104799.153892 
+283710.007804  9104802.159178 
+283686.257270  9104816.194286 
+283670.435603  9104827.225311 
+283671.494393  9104836.267694 
+283670.543890  9104842.293939 
+283667.591312  9104846.308620 
+283659.698520  9104854.335570 
+283653.843894  9104869.396959 
+283660.887254  9104881.460307 
+283671.855358  9104886.496451 
+283679.791469  9104884.496949 
+283684.753343  9104883.498403 
+283688.721398  9104882.498651 
+283693.704931  9104884.513830 
+283695.699789  9104885.520816 
+283709.671013  9104893.574291 
+283722.612319  9104896.603682 
+283732.557728  9104897.620304 
+283747.450566  9104895.629223 
+283760.370208  9104895.644878 
+283771.280547  9104892.644398 
+283780.224913  9104892.655232 
+283787.203308  9104895.677380 
+283798.207535  9104905.736361 
+283803.219963  9104911.769823 
+283811.213848  9104917.806893 
+283855.035780  9104930.919260 
+283877.850266  9104924.919452 
+283897.647166  9104913.893161 
+283909.515185  9104905.870981 
+283934.295605  9104896.859829 
+283956.145141  9104894.877081 
+283972.960550  9104883.847166 
+283987.766637  9104869.801128 
+283998.662488  9104864.791451 
+284008.593427  9104863.798866 
+284029.470800  9104864.828608 
+284050.348172  9104865.858340 
+284061.330749  9104872.903526 
+284068.374203  9104884.966783 
+284078.384655  9104895.024484 
+284081.402249  9104900.050939 
+284080.451804  9104906.077180 
+284079.530274  9104916.121711 
+284077.651070  9104931.187910 
+284094.632720  9104943.263127 
+284118.592794  9104958.360424 
+284144.547749  9104974.464668 
+284153.528267  9104979.498285 
+284168.471696  9104984.539068 
+284218.350647  9105010.717642 
+284227.367341  9105020.774101 
+284236.376806  9105029.825986 
+284244.312892  9105027.826384 
+284252.234510  9105023.817637 
+284250.189007  9105015.778677 
+284252.097080  9105004.730772 
+284256.065120  9105003.730970 
+284264.015667  9105003.740510 
+284266.989888  9105002.739515 
+284273.932148  9105000.738717 
+284280.867174  9104997.733346 
+284283.877563  9105001.755209 
+284287.896239  9105007.787406 
+284289.912812  9105011.808076 
+284291.929384  9105015.828746 
+284293.982128  9105024.872274 
+284293.096822  9105039.939657 
+284289.186654  9105048.976036 
+284286.248601  9105054.999891 
+284282.323963  9105062.027126 
+284276.418918  9105070.056549 
+284272.537681  9105083.111214 
+284269.635794  9105094.157928 
+284270.694721  9105103.200265 
+284264.898181  9105126.298265 
+284413.288661  9105169.672129 
+284660.205227  9105232.249427 
+284709.997705  9105246.372487 
+284720.929739  9105246.385478 
+284730.867950  9105246.397287 
+284751.694719  9105240.394663 
+284766.558556  9105234.384951 
+284814.102510  9105212.341056 
+285015.275008  9105133.219113 
+285297.678123  9105018.028003 
+285408.687534  9104976.971649 
+285425.988852  9105033.247150 
+285438.263079  9105081.480280 
+285441.375203  9105099.565952 
+285443.486256  9105116.645893 
+285447.737415  9105154.824033 
+285448.274721  9105229.161857 
+285446.817161  9105302.492783 
+285477.719942  9105315.588219 
+285533.584423  9105344.785733 
+285544.560015  9105350.825905 
+285565.517388  9105362.905079 
+285601.469246  9105387.056425 
+285617.464814  9105400.134328 
+285671.363624  9105432.342994 
+285766.169074  9105486.699409 
+285840.017207  9105528.976573 
+285849.999052  9105535.015495 
+285869.948204  9105545.084206 
+285932.798993  9105578.307417 
+285954.743096  9105589.382948 
+285989.650549  9105606.500802 
+286033.480597  9105620.615287 
+286068.344428  9105631.705697 
+286102.170780  9105636.767560 
+286133.980374  9105637.808855 
+286193.566021  9105631.850306 
+286232.237697  9105619.840266 
+286273.934499  9105613.860996 
+286299.759279  9105611.881627 
+286315.653129  9105610.895369 
+286358.401982  9105612.953648 
+286391.227194  9105617.009586 
+286429.021508  9105621.071205 
+286440.969208  9105624.098575 
+286457.361439  9105554.803364 
+286478.562448  9105463.413555 
+286500.677089  9105360.974740 
+286502.497154  9105337.872157 
+286532.212546  9105187.223637 
+286536.129505  9105179.191728 
+286544.986371  9105167.147287 
+286592.033483  9105076.791722 
+286581.021460  9105065.729027 
+286544.090328  9105043.586503 
+Region 1
+262
+285913.629115  9101827.277387 
+285903.401655  9101787.083088 
+285889.032499  9101723.779107 
+285854.201476  9101579.081880 
+285847.027867  9101548.936712 
+285831.694207  9101489.649751 
+285823.447182  9101448.453180 
+285819.044646  9101389.179141 
+285816.738304  9101344.975927 
+285811.044983  9101244.513534 
+285806.620811  9101182.225784 
+285805.496659  9101164.142433 
+285804.437721  9101155.100168 
+285797.989926  9101087.787227 
+285795.727164  9101049.611389 
+285791.245144  9100979.287100 
+285783.919643  9100928.046007 
+285769.616414  9100873.782947 
+285736.345695  9100807.442634 
+285716.275822  9100780.295715 
+285666.148316  9100718.958033 
+285653.106935  9100701.865015 
+285599.955041  9100634.496261 
+285558.829189  9100581.205586 
+285528.735580  9100541.991855 
+285474.575907  9100472.612535 
+285443.373008  9100417.324439 
+285428.199733  9100380.137579 
+285416.885605  9100326.882390 
+285414.847562  9100319.848033 
+285410.540054  9100273.633150 
+285408.982275  9100195.275671 
+285410.289950  9100100.848680 
+285412.743210  9100027.518806 
+285412.641983  9100013.454856 
+285413.433231  9099985.328148 
+285395.409251  9099966.219872 
+285361.276449  9099917.959995 
+285340.307565  9099903.870941 
+285308.509189  9099903.832676 
+285064.087877  9099907.556037 
+285040.210171  9099903.508913 
+285020.300049  9099898.462016 
+284994.463828  9099898.430741 
+284961.751112  9099909.441300 
+284939.076463  9099934.527869 
+284930.320846  9099960.635865 
+284896.498860  9099955.572053 
+284866.694995  9099956.540463 
+284833.982185  9099967.550945 
+284881.980709  9099871.171230 
+284897.641728  9099838.039684 
+284865.843322  9099838.001093 
+284840.957514  9099831.943500 
+284797.126464  9099816.821804 
+284767.236094  9099805.735267 
+284754.274705  9099799.692123 
+284734.371848  9099795.649651 
+284704.604125  9099801.640787 
+284680.877935  9099818.689462 
+284634.549018  9099870.870297 
+284576.410930  9099939.109723 
+284541.905288  9099977.241043 
+284527.071816  9099987.268575 
+284512.195074  9099991.268668 
+284500.277817  9099992.258678 
+284485.314555  9099984.203887 
+284465.375562  9099975.138443 
+284436.486018  9099965.057480 
+284398.494574  9099932.864933 
+284377.576323  9099925.807371 
+284360.697753  9099927.795831 
+284391.128727  9100014.225657 
+284401.282030  9100044.375019 
+284385.721476  9100091.570522 
+284368.360883  9100164.882506 
+284353.981398  9100238.198142 
+284347.270485  9100272.345136 
+284329.981910  9100355.702868 
+284349.071539  9100384.858593 
+284364.200751  9100416.018592 
+284381.245323  9100437.135275 
+284439.183723  9100479.397714 
+284556.076190  9100566.937214 
+284700.944810  9100675.606064 
+284715.922793  9100685.669859 
+284724.916805  9100692.712704 
+284804.984848  9100772.170129 
+284853.022922  9100819.442653 
+284892.030906  9100854.649454 
+284904.150627  9100881.787254 
+284909.343195  9100912.934931 
+284907.456888  9100926.996514 
+284906.520959  9100935.031876 
+284892.905009  9100976.202461 
+284867.479909  9101033.431773 
+284814.685441  9101153.915419 
+284811.834276  9101171.994089 
+284810.092421  9101206.147089 
+284799.305852  9101226.225297 
+284777.660455  9101256.336004 
+284771.799187  9101270.392790 
+284775.925810  9101291.493580 
+284785.086123  9101321.641506 
+284788.240701  9101345.754803 
+284785.331739  9101355.796909 
+284781.472386  9101371.865240 
+284770.714676  9101395.961735 
+284744.172758  9101436.112156 
+284727.445374  9101459.196875 
+284710.078176  9101531.504370 
+284703.122005  9101531.495963 
+284698.073856  9101520.439676 
+284694.984295  9101505.367506 
+284693.853323  9101486.279454 
+284688.740181  9101466.182023 
+284649.829975  9101306.409490 
+284643.730379  9101287.315411 
+284617.409577  9101219.977809 
+284591.045564  9101146.612739 
+284520.199861  9100967.714431 
+284504.998117  9100926.508839 
+284401.859719  9100955.515640 
+284366.711423  9100904.240017 
+284342.602368  9100868.046287 
+284315.533812  9100834.862614 
+284291.590671  9100821.774031 
+284287.615769  9100821.769175 
+284271.716164  9100821.749748 
+284231.081550  9100836.768550 
+284206.353731  9100852.811349 
+284190.511771  9100860.828490 
+284182.569165  9100861.823335 
+284166.655122  9100859.794726 
+284164.710913  9100865.819739 
+284149.977978  9100889.911275 
+284140.213671  9100914.008893 
+284126.481648  9100939.106219 
+284114.686624  9100957.173956 
+284099.910401  9100975.238040 
+284087.136041  9100995.313707 
+284074.361670  9101015.389372 
+284062.566609  9101033.457105 
+284046.803818  9101052.524539 
+284034.987120  9101067.578544 
+284022.234326  9101090.667929 
+284008.430146  9101105.719495 
+283995.648510  9101124.790577 
+283987.813920  9101140.854028 
+283984.875947  9101146.877822 
+283979.115279  9101174.998614 
+283976.299789  9101198.100187 
+283976.487122  9101224.219143 
+283978.683549  9101253.354261 
+283980.843954  9101277.466502 
+283982.910691  9101288.519265 
+283984.991841  9101301.581179 
+283988.153203  9101326.699210 
+283994.288582  9101350.816319 
+283998.342807  9101361.871515 
+284003.397981  9101373.932503 
+284015.459782  9101393.034033 
+284023.553843  9101413.135266 
+284034.650757  9101436.253869 
+284053.726444  9101463.400493 
+284058.788858  9101476.466042 
+284070.865136  9101497.576693 
+284081.926057  9101515.672400 
+284091.006714  9101534.770248 
+284103.090237  9101556.885457 
+284104.120030  9101561.909543 
+284110.183429  9101575.980868 
+284119.278536  9101597.087852 
+284125.392422  9101618.191191 
+284128.496239  9101635.272592 
+284129.648627  9101657.374437 
+284131.787552  9101678.472920 
+284129.886597  9101690.525384 
+284128.936119  9101696.551616 
+284123.117871  9101716.635821 
+284115.297704  9101734.708452 
+284105.518882  9101756.796955 
+284095.747264  9101779.890031 
+284089.943420  9101801.983386 
+284085.126111  9101823.073381 
+284079.300628  9101842.153014 
+284068.520816  9101863.235729 
+284061.715996  9101884.323298 
+284057.906846  9101907.423656 
+284050.129901  9101931.523736 
+284043.346702  9101955.625029 
+284043.548609  9101983.753114 
+284045.745239  9102012.888200 
+284059.866920  9102042.037837 
+284073.952562  9102066.164594 
+284085.013683  9102084.260262 
+284101.065226  9102105.375704 
+284117.123999  9102127.495711 
+284128.170728  9102143.582212 
+284141.226620  9102162.684850 
+284147.290157  9102176.756144 
+284151.315684  9102183.793000 
+284162.384087  9102202.893207 
+284176.491495  9102230.033625 
+284182.562273  9102245.109483 
+284183.714778  9102267.211310 
+284181.871579  9102287.300364 
+284178.055295  9102309.396148 
+284173.245250  9102331.490724 
+284171.301027  9102337.515748 
+284166.454899  9102354.587457 
+284164.561186  9102367.644497 
+284148.899140  9102400.776089 
+284108.019781  9102520.269596 
+284090.543304  9102577.508545 
+284122.013946  9102669.966798 
+284159.642267  9102789.555718 
+284181.996091  9102857.893238 
+284193.079183  9102879.002535 
+284205.170498  9102902.122178 
+284244.820281  9102888.106332 
+284297.287948  9102860.042079 
+284321.058994  9102849.020647 
+284339.882845  9102841.006911 
+284353.745063  9102833.991733 
+284367.607275  9102826.976551 
+284395.179987  9102791.850163 
+284410.762435  9102747.668208 
+284419.540193  9102724.573860 
+284424.436789  9102714.534144 
+284426.395427  9102710.518258 
+284478.703803  9102660.353289 
+284483.643729  9102656.341002 
+284637.587052  9102782.096883 
+284699.569350  9102833.404076 
+284702.492808  9102825.371095 
+284933.509851  9102889.939973 
+284928.729153  9102916.052827 
+284919.138805  9102964.260259 
+284933.080524  9102968.295174 
+285191.808065  9103016.822631 
+285293.317399  9103037.034452 
+285359.986877  9103049.168258 
+285497.322698  9103076.453945 
+285541.266479  9102969.018275 
+285572.472436  9102886.681479 
+285590.026656  9102840.492603 
+285596.859736  9102823.423209 
+285646.584438  9102690.880456 
+285652.438228  9102675.819020 
+285704.121201  9102539.260361 
+285728.471972  9102470.979275 
+285737.241717  9102446.880275 
+285770.398397  9102359.523017 
+285817.315173  9102251.086320 
+285837.792253  9102196.864455 
+285895.429628  9102059.308285 
+285903.067699  9102016.121397 
+285917.495142  9101949.837737 
+285919.178007  9101907.648386 
+285919.018449  9101885.547974 
+285913.629115  9101827.277387 
+Region 1
+156
+288609.815460  9099397.376816 
+288485.043414  9099456.503396 
+288374.138650  9099509.618211 
+288286.015193  9099552.713318 
+288232.444195  9099564.706810 
+288082.464618  9099573.576494 
+287759.686707  9099596.310879 
+287633.554880  9099605.206528 
+287624.604479  9099604.191658 
+287528.173809  9099598.053043 
+287461.495352  9099583.912263 
+287438.604326  9099578.863026 
+287411.731306  9099572.804615 
+287381.891792  9099568.751846 
+287355.047865  9099566.711627 
+287331.170437  9099562.665735 
+287304.304697  9099557.611812 
+287274.450647  9099551.549850 
+287250.573224  9099547.503911 
+287226.695803  9099543.457959 
+287204.791210  9099537.405188 
+287199.815536  9099536.394850 
+287181.922009  9099535.369482 
+287160.046488  9099533.334920 
+287140.151063  9099530.298103 
+287116.280914  9099527.256646 
+287089.415189  9099522.202582 
+287064.558625  9099520.164496 
+287039.716587  9099520.135513 
+287012.908975  9099523.117875 
+286990.105135  9099530.123102 
+286964.349290  9099541.143074 
+286946.550153  9099553.176886 
+286919.815120  9099566.204796 
+286902.052266  9099583.261396 
+286876.448842  9099615.377090 
+286864.626280  9099629.426977 
+286819.301553  9099682.615159 
+286788.736842  9099715.729572 
+286764.097918  9099743.828158 
+286742.381959  9099763.893747 
+286729.551112  9099775.933331 
+286716.727517  9099788.977473 
+286701.046236  9099819.095652 
+286667.558339  9099860.243015 
+286634.998759  9099892.350482 
+286613.333470  9099919.447967 
+286594.627466  9099943.535265 
+286574.913236  9099965.612269 
+286563.119519  9099983.680365 
+286549.425475  9100013.800863 
+286539.749737  9100049.953404 
+286532.989776  9100077.068394 
+286493.292692  9100084.053592 
+286441.591423  9100079.974536 
+286392.842230  9100071.880682 
+286382.890752  9100069.859845 
+286299.376655  9100063.733998 
+286092.542518  9100043.398208 
+286081.604591  9100042.380685 
+286046.803412  9100039.325742 
+285879.760628  9100025.063448 
+285869.816397  9100024.047054 
+285758.471406  9100016.882458 
+285657.063382  9100009.729455 
+285639.075486  9099995.644138 
+285478.045455  9099988.419373 
+285413.433231  9099985.328148 
+285412.641983  9100013.454856 
+285412.743210  9100027.518806 
+285410.289950  9100100.848680 
+285408.982275  9100195.275671 
+285410.540054  9100273.633150 
+285414.847562  9100319.848033 
+285416.885605  9100326.882390 
+285428.199733  9100380.137579 
+285443.373008  9100417.324439 
+285474.575907  9100472.612535 
+285528.735580  9100541.991855 
+285558.829189  9100581.205586 
+285599.955041  9100634.496261 
+285653.106935  9100701.865015 
+285666.148316  9100718.958033 
+285705.679704  9100688.868392 
+285717.705658  9100702.946510 
+285773.889652  9100777.350563 
+285883.641491  9100701.134600 
+285926.161059  9100672.052905 
+285931.100641  9100668.040537 
+285934.089026  9100669.048636 
+286112.398584  9100729.532996 
+286131.337144  9100737.591804 
+286167.509674  9100792.885018 
+286189.610725  9100826.061391 
+286208.694400  9100854.211415 
+286251.300850  9100837.184182 
+286276.063925  9100826.163241 
+286295.822139  9100810.113628 
+286305.708496  9100803.093383 
+286332.517006  9100800.111256 
+286349.410140  9100800.131119 
+286410.113758  9100812.257084 
+286419.078954  9100815.281270 
+286469.845453  9100827.395479 
+286605.186542  9100854.676915 
+286608.022441  9100834.589183 
+286615.674400  9100793.411484 
+286697.238682  9100804.556887 
+286709.851848  9100762.380434 
+286828.270550  9100785.623240 
+286839.795405  9100730.386347 
+286841.753757  9100726.370424 
+286858.348873  9100685.203156 
+286865.028692  9100647.037994 
+286864.745293  9100607.860168 
+286862.605285  9100586.762100 
+286873.861255  9100494.356509 
+286873.548819  9100451.160444 
+286871.132742  9100391.889106 
+286875.883287  9100361.758109 
+286880.750077  9100347.700067 
+286918.467107  9100341.716728 
+286931.341615  9100335.704423 
+286968.964144  9100316.661776 
+286979.829433  9100307.633469 
+286996.569701  9100286.557390 
+287008.334194  9100264.470969 
+287018.140353  9100246.400470 
+287031.797738  9100211.257094 
+287048.501610  9100185.158215 
+287079.131740  9100161.084629 
+287144.446644  9100123.992174 
+287224.615921  9100079.885034 
+287281.001868  9100044.791174 
+287307.715178  9100028.749335 
+287340.390611  9100012.714387 
+287361.236297  9100009.724867 
+287477.189295  9099830.044759 
+287568.619613  9099694.536358 
+287711.666175  9099688.673945 
+287927.236708  9099680.885174 
+287984.862878  9099679.946642 
+288013.745183  9099689.020609 
+288070.538000  9099710.181005 
+288163.263749  9099753.482298 
+288200.124728  9099766.583402 
+288217.039178  9099769.616307 
+288277.135876  9099698.362102 
+288354.139488  9099629.136170 
+288406.549019  9099594.036703 
+288471.941903  9099567.992814 
+288517.563376  9099555.990037 
+288591.979460  9099541.006197 
+288634.780431  9099551.100050 
+288622.221263  9099463.690660 
+288609.815460  9099397.376816 
+Region 1
+274
+288986.709479  9101621.853507 
+288981.631093  9101606.779766 
+288963.925484  9101495.256167 
+288930.772869  9101309.379367 
+288921.449008  9101257.132890 
+288891.343931  9101080.300223 
+288871.688226  9100973.796982 
+288861.297762  9100911.503855 
+288858.185020  9100893.418644 
+288853.968890  9100860.264089 
+288824.909594  9100690.464177 
+288821.767660  9100668.360759 
+288791.568906  9100478.468654 
+288748.036145  9100231.302602 
+288702.414563  9099970.070428 
+288657.882476  9099721.898330 
+288634.780431  9099551.100050 
+288591.979460  9099541.006197 
+288517.563376  9099555.990037 
+288471.941903  9099567.992814 
+288406.549019  9099594.036703 
+288354.139488  9099629.136170 
+288277.135876  9099698.362102 
+288217.039178  9099769.616307 
+288200.124728  9099766.583402 
+288163.263749  9099753.482298 
+288070.538000  9099710.181005 
+288013.745183  9099689.020609 
+287984.862878  9099679.946642 
+287927.236708  9099680.885174 
+287711.666175  9099688.673945 
+287568.619613  9099694.536358 
+287477.189295  9099830.044759 
+287361.236297  9100009.724867 
+287340.390611  9100012.714387 
+287307.715178  9100028.749335 
+287281.001868  9100044.791174 
+287224.615921  9100079.885034 
+287144.446644  9100123.992174 
+287079.131740  9100161.084629 
+287048.501610  9100185.158215 
+287031.797738  9100211.257094 
+287018.140353  9100246.400470 
+287008.334194  9100264.470969 
+286996.569701  9100286.557390 
+286979.829433  9100307.633469 
+286968.964144  9100316.661776 
+286931.341615  9100335.704423 
+286918.467107  9100341.716728 
+286880.750077  9100347.700067 
+286875.883287  9100361.758109 
+286871.132742  9100391.889106 
+286873.548819  9100451.160444 
+286873.861255  9100494.356509 
+286862.605285  9100586.762100 
+286864.745293  9100607.860168 
+286865.028692  9100647.037994 
+286858.348873  9100685.203156 
+286841.753757  9100726.370424 
+286839.795405  9100730.386347 
+286828.270550  9100785.623240 
+286709.851848  9100762.380434 
+286697.238682  9100804.556887 
+286615.674400  9100793.411484 
+286608.022441  9100834.589183 
+286605.186542  9100854.676915 
+286469.845453  9100827.395479 
+286419.078954  9100815.281270 
+286410.113758  9100812.257084 
+286349.410140  9100800.131119 
+286332.517006  9100800.111256 
+286305.708496  9100803.093383 
+286295.822139  9100810.113628 
+286276.063925  9100826.163241 
+286251.300850  9100837.184182 
+286208.694400  9100854.211415 
+286189.610725  9100826.061391 
+286167.509674  9100792.885018 
+286131.337144  9100737.591804 
+286112.398584  9100729.532996 
+285934.089026  9100669.048636 
+285931.100641  9100668.040537 
+285926.161059  9100672.052905 
+285883.641491  9100701.134600 
+285773.889652  9100777.350563 
+285717.705658  9100702.946510 
+285705.679704  9100688.868392 
+285666.148316  9100718.958033 
+285716.275822  9100780.295715 
+285736.345695  9100807.442634 
+285769.616414  9100873.782947 
+285783.919643  9100928.046007 
+285791.245144  9100979.287100 
+285795.727164  9101049.611389 
+285797.989926  9101087.787227 
+285804.437721  9101155.100168 
+285805.496659  9101164.142433 
+285806.620811  9101182.225784 
+285811.044983  9101244.513534 
+285816.738304  9101344.975927 
+285819.044646  9101389.179141 
+285823.447182  9101448.453180 
+285831.694207  9101489.649751 
+285847.027867  9101548.936712 
+285854.201476  9101579.081880 
+285889.032499  9101723.779107 
+285903.401655  9101787.083088 
+285913.629115  9101827.277387 
+285919.018449  9101885.547974 
+285919.178007  9101907.648386 
+285917.495142  9101949.837737 
+285903.067699  9102016.121397 
+285895.429628  9102059.308285 
+285837.792253  9102196.864455 
+285817.315173  9102251.086320 
+285770.398397  9102359.523017 
+285737.241717  9102446.880275 
+285728.471972  9102470.979275 
+285704.121201  9102539.260361 
+285652.438228  9102675.819020 
+285646.584438  9102690.880456 
+285596.859736  9102823.423209 
+285590.026656  9102840.492603 
+285572.472436  9102886.681479 
+285541.266479  9102969.018275 
+285497.322698  9103076.453945 
+285489.524793  9103097.540428 
+285468.923865  9103134.684688 
+285428.766441  9103216.006340 
+285416.035872  9103242.109774 
+285382.653500  9103298.325496 
+285333.602574  9103386.668510 
+285301.184808  9103438.867126 
+285287.525574  9103474.010479 
+285280.786545  9103504.139242 
+285279.843498  9103511.170032 
+285278.015384  9103533.268149 
+285278.276302  9103569.432558 
+285284.557904  9103613.640564 
+285288.634509  9103627.709207 
+285318.193624  9103730.209124 
+285323.307542  9103750.306334 
+285329.553005  9103789.491481 
+285328.791229  9103821.636434 
+285326.897912  9103834.693448 
+285302.408495  9103883.887832 
+285279.834113  9103923.038897 
+285218.944074  9104023.422674 
+285200.279499  9104053.537332 
+285182.673933  9104092.694269 
+285146.396452  9104160.961292 
+285110.089887  9104225.210040 
+285086.601141  9104275.410149 
+285079.992440  9104323.621149 
+285080.115652  9104340.698799 
+285083.314488  9104370.839360 
+285096.654299  9104429.119581 
+285115.949726  9104486.402278 
+285139.147930  9104533.643984 
+285167.373222  9104588.928075 
+285217.607364  9104664.329278 
+285261.820818  9104731.686821 
+285276.611850  9104715.631332 
+285286.448351  9104701.579117 
+285309.226085  9104690.555823 
+285322.080262  9104681.529947 
+285374.367365  9104628.349969 
+285418.914372  9104604.293010 
+285439.711665  9104594.271896 
+285456.599056  9104593.287191 
+285476.504143  9104597.328810 
+285508.429229  9104614.443770 
+285525.381953  9104622.500123 
+285540.288998  9104622.517617 
+285561.108039  9104615.510146 
+285606.648691  9104591.454193 
+285633.154575  9104546.280233 
+285672.550759  9104497.103143 
+285702.052454  9104453.941790 
+285721.783165  9104433.873773 
+285738.539730  9104414.806826 
+285766.068251  9104373.652259 
+285791.710828  9104346.559254 
+285817.266205  9104307.411479 
+285871.430866  9104239.165029 
+285875.376977  9104235.151419 
+285899.068157  9104213.078880 
+285920.771731  9104191.004013 
+285953.392449  9104166.932769 
+286008.819425  9104135.856216 
+286065.283713  9104110.808143 
+286122.683554  9104077.724674 
+286138.467839  9104061.670177 
+286149.304988  9104048.623585 
+286168.933534  9104014.491592 
+286176.847470  9104009.478025 
+286187.735491  9104003.463361 
+286190.709578  9104002.462264 
+286205.587279  9103998.461339 
+286224.367404  9103984.419412 
+286233.144226  9103961.324886 
+286241.935584  9103940.239483 
+286295.822825  9103833.819443 
+286312.440758  9103795.665727 
+286340.802209  9103732.411823 
+286383.120119  9103675.201418 
+286409.843003  9103660.164115 
+286423.719510  9103655.157436 
+286462.462252  9103653.193210 
+286494.277649  9103655.239143 
+286543.981017  9103657.305736 
+286608.525512  9103650.348451 
+286681.056565  9103648.423042 
+286695.941353  9103645.426551 
+286707.852094  9103643.431179 
+286728.684964  9103638.432432 
+286765.432784  9103635.461102 
+286801.230510  9103638.515951 
+286839.965859  9103635.546848 
+286912.511357  9103635.630188 
+286934.396234  9103638.668954 
+286953.321648  9103644.717963 
+286973.262698  9103653.781775 
+287005.158189  9103666.877470 
+287043.067354  9103687.011865 
+287073.011774  9103705.128012 
+287106.975053  9103729.276018 
+287126.967190  9103745.371641 
+287172.899576  9103775.560544 
+287189.895844  9103789.643613 
+287204.889986  9103801.715294 
+287215.865275  9103807.755098 
+287232.817810  9103815.810808 
+287249.784936  9103825.875622 
+287281.695183  9103840.980183 
+287340.641691  9103884.242793 
+287361.532896  9103887.280185 
+287399.311010  9103889.332203 
+287422.138685  9103885.339937 
+287449.964427  9103885.371519 
+287583.937314  9103449.550384 
+287619.340618  9103398.358677 
+287635.329508  9103273.813112 
+287656.046333  9103116.122905 
+287657.010898  9103112.105816 
+287676.682869  9102947.382618 
+287691.714476  9102827.858726 
+287700.286058  9102776.636620 
+287704.034836  9102745.499956 
+287710.764861  9102714.366677 
+287718.517820  9102687.252743 
+287732.240557  9102661.150130 
+287751.911168  9102633.045173 
+287791.354501  9102590.899002 
+287817.981264  9102562.801920 
+287877.102254  9102493.555291 
+287917.517193  9102448.396528 
+288030.862742  9102319.943016 
+288124.515553  9102216.580738 
+288176.708726  9102151.344275 
+288228.930977  9102090.125992 
+288272.289881  9102039.947673 
+288287.100863  9102026.905290 
+288309.854371  9102012.867299 
+288455.304015  9101926.640120 
+288476.077262  9101913.604388 
+288479.043824  9101911.598633 
+288521.445094  9101866.441809 
+288558.848410  9101817.261197 
+288620.049822  9101761.075435 
+288659.586656  9101731.987995 
+288733.910994  9101703.943960 
+288804.304230  9101681.922679 
+288986.709479  9101621.853507 
+Region 1
+81
+288851.902593  9103304.307533 
+288848.635605  9103265.126880 
+288854.642094  9103271.160763 
+288857.432879  9103245.045827 
+288851.563050  9103121.480974 
+288851.533749  9103117.462784 
+288835.658341  9102848.228573 
+288834.400957  9102812.063748 
+288823.956163  9102606.121492 
+288818.130865  9102488.583848 
+288814.981270  9102465.475928 
+288810.947754  9102457.435123 
+288802.895368  9102443.362609 
+288744.892650  9102393.071050 
+288665.882592  9102323.669677 
+288648.879347  9102308.582588 
+288578.871698  9102247.227370 
+288505.875723  9102184.864106 
+288351.868741  9102051.087180 
+288341.865661  9102042.035049 
+288309.854371  9102012.867299 
+288287.100863  9102026.905290 
+288272.289881  9102039.947673 
+288228.930977  9102090.125992 
+288176.708726  9102151.344275 
+288124.515553  9102216.580738 
+288030.862742  9102319.943016 
+287917.517193  9102448.396528 
+287877.102254  9102493.555291 
+287817.981264  9102562.801920 
+287791.354501  9102590.899002 
+287751.911168  9102633.045173 
+287732.240557  9102661.150130 
+287718.517820  9102687.252743 
+287710.764861  9102714.366677 
+287704.034836  9102745.499956 
+287700.286058  9102776.636620 
+287691.714476  9102827.858726 
+287676.682869  9102947.382618 
+287657.010898  9103112.105816 
+287656.046333  9103116.122905 
+287635.329508  9103273.813112 
+287619.340618  9103398.358677 
+287583.937314  9103449.550384 
+287449.964427  9103885.371519 
+287491.703033  9103885.418859 
+287550.335821  9103885.485295 
+287585.117974  9103885.524670 
+287637.773475  9103883.575136 
+287655.610312  9103876.563478 
+287715.229508  9103875.626271 
+287782.937685  9103893.784455 
+287824.902734  9103924.972620 
+287834.898944  9103933.020232 
+287880.992640  9103985.308404 
+287922.146799  9104041.609129 
+287956.359243  9104099.911088 
+288042.232956  9104019.643908 
+288098.556406  9103975.507101 
+288124.167829  9103944.394939 
+288134.887244  9103915.275191 
+288133.798393  9103902.214914 
+288131.123396  9103807.784879 
+288147.666467  9103759.585342 
+288183.105747  9103713.416045 
+288208.724308  9103683.308431 
+288211.676355  9103679.293563 
+288246.326559  9103661.250551 
+288294.969937  9103654.273116 
+288564.368420  9103666.627722 
+288645.886483  9103670.736372 
+288681.603436  9103662.739650 
+288690.503372  9103656.722273 
+288734.016576  9103627.638816 
+288775.424972  9103582.480365 
+288827.596141  9103514.229389 
+288842.282738  9103484.109447 
+288851.094688  9103466.037481 
+288857.875151  9103441.936033 
+288857.391566  9103375.635902 
+288851.902593  9103304.307533 
+Region 1
+235
+290515.118603  9102855.082557 
+290484.997347  9102812.859963 
+290441.214057  9102804.776733 
+290413.227542  9102782.646987 
+290399.131283  9102757.518553 
+290359.823818  9102682.136408 
+290296.402148  9102570.565054 
+290257.227435  9102513.264461 
+290216.109484  9102461.988904 
+290140.999030  9102382.549584 
+290132.975700  9102372.495567 
+290048.775054  9102272.955501 
+289984.669665  9102203.573053 
+289937.729530  9102171.376914 
+289829.996035  9102115.005610 
+289799.073118  9102098.899309 
+289760.156387  9102076.757037 
+289712.156742  9102035.518614 
+289672.070279  9101989.266106 
+289633.919991  9101935.983912 
+289619.831829  9101911.859603 
+289595.476406  9101842.519894 
+289574.465258  9101686.793701 
+289562.903745  9101600.390864 
+289531.064837  9101458.716179 
+289500.920469  9101276.861807 
+289496.784393  9101254.757434 
+289491.478722  9101208.542881 
+289489.352062  9101189.454332 
+289489.322747  9101185.436151 
+289457.206246  9101005.588542 
+289453.055595  9100981.475060 
+289432.280475  9100857.893990 
+289414.618481  9100752.398000 
+289404.139528  9100678.050608 
+289270.830634  9100656.807416 
+289275.317893  9100727.130086 
+289199.679822  9100710.973408 
+289223.376689  9100826.521698 
+289176.753342  9100837.519797 
+289127.126906  9100845.500892 
+289106.332386  9100855.523131 
+289082.564072  9100866.546588 
+289052.914025  9100888.613414 
+289051.065651  9100907.697604 
+289021.481413  9100938.805348 
+288871.688226  9100973.796982 
+288891.343931  9101080.300223 
+288921.449008  9101257.132890 
+288930.772869  9101309.379367 
+288963.925484  9101495.256167 
+288981.631093  9101606.779766 
+288986.709479  9101621.853507 
+288804.304230  9101681.922679 
+288733.910994  9101703.943960 
+288659.586656  9101731.987995 
+288620.049822  9101761.075435 
+288558.848410  9101817.261197 
+288521.445094  9101866.441809 
+288479.043824  9101911.598633 
+288476.077262  9101913.604388 
+288455.304015  9101926.640120 
+288309.854371  9102012.867299 
+288341.865661  9102042.035049 
+288351.868741  9102051.087180 
+288505.875723  9102184.864106 
+288578.871698  9102247.227370 
+288648.879347  9102308.582588 
+288665.882592  9102323.669677 
+288744.892650  9102393.071050 
+288802.895368  9102443.362609 
+288810.947754  9102457.435123 
+288814.981270  9102465.475928 
+288818.130865  9102488.583848 
+288823.956163  9102606.121492 
+288834.400957  9102812.063748 
+288835.658341  9102848.228573 
+288851.533749  9103117.462784 
+288851.563050  9103121.480974 
+288857.432879  9103245.045827 
+288854.642094  9103271.160763 
+288848.635605  9103265.126880 
+288851.902593  9103304.307533 
+288857.391566  9103375.635902 
+288857.875151  9103441.936033 
+288851.094688  9103466.037481 
+288842.282738  9103484.109447 
+288827.596141  9103514.229389 
+288775.424972  9103582.480365 
+288734.016576  9103627.638816 
+288690.503372  9103656.722273 
+288681.603436  9103662.739650 
+288645.886483  9103670.736372 
+288564.368420  9103666.627722 
+288294.969937  9103654.273116 
+288246.326559  9103661.250551 
+288211.676355  9103679.293563 
+288208.724308  9103683.308431 
+288183.105747  9103713.416045 
+288147.666467  9103759.585342 
+288131.123396  9103807.784879 
+288133.798393  9103902.214914 
+288134.887244  9103915.275191 
+288124.167829  9103944.394939 
+288098.556406  9103975.507101 
+288042.232956  9104019.643908 
+287956.359243  9104099.911088 
+287976.498020  9104136.097257 
+288042.080948  9104271.784112 
+288091.610172  9104386.357428 
+288117.704622  9104421.545585 
+288148.665604  9104442.675551 
+288160.649563  9104450.725266 
+288212.487394  9104472.883008 
+288277.207878  9104490.032310 
+288316.133892  9104513.180078 
+288342.162687  9104539.327096 
+288355.264963  9104564.455192 
+288355.286930  9104567.468841 
+288364.465335  9104599.624362 
+288374.747394  9104646.849222 
+288378.986190  9104683.017414 
+288383.217677  9104718.181054 
+288383.994033  9104824.663286 
+288401.196148  9104866.873085 
+288411.302562  9104889.988729 
+288430.506982  9104934.209802 
+288430.594896  9104946.264391 
+288433.073353  9105013.571374 
+288427.564827  9105075.846811 
+288429.108154  9105151.189082 
+288439.383218  9105197.409322 
+288450.520207  9105225.548774 
+288494.738505  9105292.901835 
+288538.949620  9105359.250272 
+288568.866360  9105373.346808 
+288591.716507  9105372.367441 
+288629.554361  9105382.454495 
+288664.315474  9105379.479117 
+288687.165610  9105378.499701 
+288712.084032  9105388.572477 
+288720.056462  9105391.594853 
+288742.943274  9105395.638142 
+288780.663768  9105389.652306 
+288791.588261  9105388.659751 
+288815.461535  9105391.699546 
+288832.385529  9105395.736251 
+288847.292568  9105395.752585 
+288862.199605  9105395.768914 
+288877.158012  9105402.817063 
+288900.994592  9105400.834077 
+288934.798549  9105402.880134 
+288959.768393  9105419.984578 
+288983.641674  9105423.024276 
+289015.480058  9105428.081733 
+289047.347815  9105437.157347 
+289066.259432  9105441.196122 
+289087.217404  9105453.273418 
+289105.201322  9105466.351998 
+289125.246303  9105489.478182 
+289141.294055  9105509.586392 
+289157.400588  9105537.730950 
+289168.494045  9105559.842826 
+289170.511038  9105563.863166 
+289183.599467  9105586.981741 
+289198.719604  9105616.129735 
+289207.781411  9105632.212165 
+289215.842071  9105647.288967 
+289231.934019  9105673.424386 
+289249.027143  9105700.565417 
+289254.062318  9105709.611706 
+289259.082798  9105716.648906 
+289263.109471  9105723.685027 
+289297.266428  9105773.948859 
+289308.293877  9105787.019773 
+289322.390971  9105812.148437 
+289324.407993  9105816.168764 
+289338.541866  9105846.320137 
+289347.692004  9105874.457037 
+289361.862680  9105909.631112 
+289376.961020  9105935.765359 
+289395.990507  9105955.876632 
+289413.982077  9105969.959561 
+289429.993386  9105985.044876 
+289446.004706  9106000.130184 
+289471.939456  9106013.217116 
+289493.884254  9106024.290659 
+289568.273065  9106004.280090 
+289723.999719  9105963.261552 
+289764.731221  9105961.296175 
+289783.532632  9105950.266462 
+289806.323995  9105941.250085 
+289818.212895  9105936.240155 
+289858.833895  9105919.206586 
+289933.288522  9105908.236354 
+289940.237814  9105907.239248 
+290001.780240  9105897.259644 
+290089.286864  9105904.384670 
+290219.637743  9105926.623019 
+290225.607957  9105927.633892 
+290196.276674  9105587.066634 
+290163.016235  9105388.133968 
+290145.812304  9105345.925289 
+290102.298393  9105239.398456 
+290049.163466  9105176.056121 
+289972.104115  9105102.642718 
+289866.247209  9105032.211781 
+289832.141989  9104988.980172 
+289827.128902  9104982.947578 
+289787.841490  9104910.578861 
+289763.210927  9104804.071727 
+289751.404105  9104684.519443 
+289764.552214  9104580.062091 
+289791.429354  9104450.506216 
+289876.806671  9104302.931865 
+289897.396401  9104264.781790 
+290000.396109  9104081.063175 
+290127.871260  9103847.144197 
+290140.407539  9103794.921987 
+290145.229180  9103774.836523 
+290109.697186  9103672.335980 
+290088.386919  9103612.041070 
+290090.912140  9103549.762758 
+290114.232644  9103477.461525 
+290158.627856  9103433.309903 
+290298.224347  9103362.138216 
+290370.458926  9103320.025406 
+290398.114579  9103296.950836 
+290416.649811  9103249.757734 
+290437.040042  9103048.873350 
+290448.670525  9103008.704574 
+290499.999071  9102961.546632 
+290523.443933  9102906.322551 
+290517.223856  9102871.157307 
+290515.118603  9102855.082557 
+Region 1
+379
+292413.648094  9104137.840727 
+292406.580644  9104122.765692 
+292393.469157  9104096.634745 
+292380.350279  9104069.499263 
+292370.271956  9104050.403051 
+292358.176499  9104027.286686 
+292338.093988  9103999.139524 
+292320.970540  9103967.981819 
+292309.854076  9103942.857391 
+292298.670965  9103908.692199 
+292284.588094  9103885.573755 
+292275.481399  9103863.464935 
+292241.279185  9103807.176592 
+292234.197056  9103790.092444 
+292224.074452  9103764.968993 
+292213.988883  9103744.868184 
+292207.863508  9103722.762403 
+292197.755748  9103699.647997 
+292196.732387  9103695.628857 
+292185.653105  9103675.527010 
+292172.593743  9103656.427640 
+292160.550347  9103640.342877 
+292148.484754  9103621.244519 
+292138.354853  9103595.116498 
+292130.256863  9103575.017701 
+292119.170249  9103553.911294 
+292109.106993  9103536.824027 
+292104.005064  9103518.737357 
+292100.861028  9103496.634619 
+292098.769940  9103482.569146 
+292092.629886  9103458.454265 
+292078.510307  9103430.313044 
+292069.374254  9103404.186013 
+292057.249594  9103377.051363 
+292045.206331  9103360.966540 
+292042.195517  9103356.945333 
+292032.124950  9103338.853500 
+292018.035050  9103314.730363 
+292008.936054  9103293.625957 
+291993.808067  9103263.474593 
+291986.696574  9103242.372237 
+291977.538448  9103213.231572 
+291969.396261  9103187.105524 
+291962.218243  9103156.962381 
+291956.107924  9103136.865575 
+291955.084609  9103132.846419 
+291945.985697  9103111.741984 
+291939.875396  9103091.645172 
+291931.748057  9103067.528169 
+291916.612835  9103036.372214 
+291902.471371  9103005.217282 
+291882.404496  9102979.078795 
+291864.362070  9102957.965019 
+291845.318538  9102935.845665 
+291827.246586  9102910.713739 
+291811.199069  9102890.606532 
+291799.148661  9102873.517057 
+291783.108562  9102854.414365 
+291771.036009  9102834.311281 
+291760.973095  9102817.223863 
+291754.914663  9102804.158720 
+291752.882872  9102798.129451 
+291740.795576  9102776.017287 
+291725.601519  9102736.824952 
+291713.469936  9102708.685579 
+291703.311053  9102678.539212 
+291692.173233  9102650.400865 
+291682.051316  9102625.277150 
+291671.922027  9102599.148897 
+291659.820073  9102575.027622 
+291650.728848  9102554.927596 
+291635.660517  9102532.812251 
+291618.575219  9102506.676680 
+291596.536093  9102482.544950 
+291572.502162  9102457.406584 
+291545.464945  9102429.251465 
+291529.447282  9102413.162218 
+291527.437693  9102410.146528 
+291503.389080  9102382.999038 
+291478.309876  9102350.827813 
+291462.255369  9102329.715859 
+291450.146243  9102304.589948 
+291435.998045  9102272.430196 
+291428.901820  9102253.336714 
+291420.774995  9102229.219511 
+291419.759143  9102226.204860 
+291401.599244  9102189.018221 
+291392.500866  9102167.913559 
+291379.435006  9102147.809231 
+291352.316985  9102108.604040 
+291332.243526  9102081.460593 
+291315.188112  9102059.342960 
+291304.154001  9102045.267906 
+291297.124253  9102035.215195 
+291282.071053  9102015.108715 
+291272.001186  9101997.016559 
+291253.893143  9101966.861553 
+291233.782957  9101934.695356 
+291217.684512  9101907.556037 
+291195.631187  9101881.414914 
+291181.601286  9101865.327573 
+291168.550368  9101847.232210 
+291153.497299  9101827.125657 
+291139.386372  9101799.988400 
+291126.291281  9101775.865800 
+291115.154152  9101747.727162 
+291102.059094  9101723.604547 
+291096.008426  9101711.543766 
+291086.939798  9101694.457128 
+291067.867794  9101668.319072 
+291048.788447  9101641.176467 
+291036.657709  9101613.036730 
+291025.513331  9101583.893508 
+291015.311123  9101547.719584 
+291006.154195  9101518.578472 
+290995.009873  9101489.435232 
+290985.889798  9101465.316794 
+290975.753941  9101438.183678 
+290969.644454  9101418.086565 
+290963.505522  9101393.971301 
+290952.339189  9101361.814424 
+290948.261308  9101347.746652 
+290944.190792  9101334.683416 
+290936.086579  9101313.579627 
+290924.986552  9101290.463569 
+290913.864455  9101264.333892 
+290906.746615  9101242.226618 
+290897.626665  9101218.108136 
+290893.512022  9101199.017664 
+290891.443663  9101187.965620 
+290887.277508  9101161.843382 
+290885.135555  9101140.745961 
+290876.928393  9101105.578618 
+290869.810614  9101083.471326 
+290859.601377  9101046.292765 
+290842.509882  9101019.152107 
+290823.453094  9100995.022916 
+290808.349033  9100967.884370 
+290796.240786  9100942.758096 
+290789.123089  9100920.650775 
+290779.981237  9100893.518621 
+290771.847802  9100868.396608 
+290767.674434  9100841.269794 
+290754.587279  9100818.151501 
+290737.525377  9100795.028919 
+290728.442431  9100775.933049 
+290724.379421  9100763.874301 
+290718.292266  9100746.790717 
+290712.138934  9100720.666282 
+290699.000382  9100690.516185 
+290682.910199  9100664.381018 
+290674.806296  9100643.277119 
+290665.664605  9100616.144909 
+290659.540746  9100594.038610 
+290654.410581  9100571.933382 
+290645.268926  9100544.801161 
+290633.197686  9100524.697487 
+290616.077183  9100493.538500 
+290597.006089  9100467.400048 
+290577.920320  9100439.252502 
+290566.835481  9100418.145332 
+290556.773729  9100401.057392 
+290548.662611  9100378.948903 
+290539.579864  9100359.852953 
+290535.546356  9100351.812325 
+290525.433206  9100327.692592 
+290514.289654  9100298.549075 
+290503.131428  9100267.396472 
+290492.930172  9100231.222240 
+290482.817085  9100207.102484 
+290480.785655  9100201.073084 
+290471.629538  9100171.931700 
+290461.413656  9100133.748368 
+290452.286952  9100108.625135 
+290445.154957  9100084.508599 
+290436.020935  9100058.380817 
+290428.955053  9100043.305140 
+290418.856751  9100021.194431 
+290407.742758  9099996.069013 
+290395.583711  9099963.910722 
+290387.399378  9099931.756753 
+290375.247714  9099900.602988 
+290366.055064  9099866.438844 
+290360.939889  9099846.342604 
+290352.807005  9099821.220405 
+290346.705515  9099802.127617 
+290339.529622  9099771.983790 
+290332.353744  9099741.839959 
+290324.184212  9099711.695038 
+290318.024048  9099684.565909 
+290306.858866  9099652.408639 
+290292.705368  9099619.243562 
+290282.511883  9099584.073739 
+290273.407470  9099561.964039 
+290263.236034  9099529.807830 
+290250.083626  9099497.648350 
+290237.924904  9099465.489951 
+290227.768202  9099435.342805 
+290215.668204  9099411.220727 
+290204.532544  9099383.081563 
+290191.431583  9099357.953840 
+290189.407589  9099352.928949 
+290177.248972  9099320.770511 
+290160.122078  9099288.606610 
+290144.982532  9099256.444879 
+290129.857676  9099226.292223 
+290112.745528  9099196.137371 
+290100.623687  9099169.001602 
+290085.542885  9099144.876173 
+290082.525261  9099139.850177 
+290073.435741  9099119.749474 
+290053.335387  9099088.586754 
+290032.226750  9099055.413836 
+290019.104029  9099027.272384 
+290003.986691  9098998.124188 
+289993.852300  9098970.990552 
+289980.722310  9098941.844532 
+289970.587953  9098914.710884 
+289954.440416  9098880.538837 
+289946.322703  9098857.425547 
+289942.260187  9098845.366628 
+289935.165443  9098826.272606 
+289925.980854  9098793.112769 
+289920.858780  9098772.011851 
+289913.742090  9098749.904188 
+289906.640058  9098729.805610 
+289895.446258  9098693.629924 
+289884.274453  9098660.467862 
+289874.191516  9098640.365970 
+289857.079838  9098610.210920 
+289845.024281  9098592.115901 
+289828.920936  9098563.971021 
+289819.802413  9098539.852029 
+289809.646333  9098509.704661 
+289798.481987  9098477.547095 
+289790.342511  9098451.420102 
+289772.186106  9098414.232068 
+289763.082300  9098392.122138 
+289750.982943  9098367.999799 
+289740.878202  9098344.884210 
+289725.732092  9098311.717633 
+289716.621022  9098288.603138 
+289708.510921  9098266.494290 
+289698.428187  9098246.392315 
+289689.273252  9098217.250534 
+289677.108156  9098184.087242 
+289667.997151  9098160.972724 
+289655.839410  9098128.813964 
+289644.777736  9098110.719946 
+289631.655655  9098082.578247 
+289619.600370  9098064.483108 
+289610.533314  9098047.395839 
+289596.468840  9098026.284832 
+289332.885287  9098125.438904 
+289365.339520  9098215.883845 
+289284.080234  9098245.928812 
+289261.591736  9098159.513143 
+289156.506968  9098192.544702 
+289169.694575  9098229.727537 
+289250.895809  9098464.881147 
+289321.810732  9098651.804990 
+289048.330110  9098756.974515 
+289066.588471  9098808.226626 
+289078.753435  9098841.390140 
+288997.492793  9098871.434886 
+289043.135206  9098999.062905 
+289065.499900  9099068.401330 
+289082.728291  9099114.629534 
+289108.899692  9099160.867761 
+289043.522556  9099188.921460 
+288960.266663  9099217.959504 
+288941.474699  9099229.992840 
+288928.666631  9099245.046532 
+288910.744128  9099240.003642 
+288879.925890  9099237.959834 
+288866.021876  9099238.948701 
+288847.193352  9099245.959258 
+288805.598128  9099264.998613 
+288765.018434  9099287.052711 
+288736.464927  9099323.183957 
+288715.700106  9099337.224077 
+288643.490759  9099382.346802 
+288609.815460  9099397.376816 
+288622.221263  9099463.690660 
+288634.780431  9099551.100050 
+288657.882476  9099721.898330 
+288702.414563  9099970.070428 
+288748.036145  9100231.302602 
+288791.568906  9100478.468654 
+288821.767660  9100668.360759 
+288824.909594  9100690.464177 
+288853.968890  9100860.264089 
+288858.185020  9100893.418644 
+288861.297762  9100911.503855 
+288871.688226  9100973.796982 
+289021.481413  9100938.805348 
+289051.065651  9100907.697604 
+289052.914025  9100888.613414 
+289082.564072  9100866.546588 
+289106.332386  9100855.523131 
+289127.126906  9100845.500892 
+289176.753342  9100837.519797 
+289223.376689  9100826.521698 
+289199.679822  9100710.973408 
+289275.317893  9100727.130086 
+289270.830634  9100656.807416 
+289404.139528  9100678.050608 
+289414.618481  9100752.398000 
+289432.280475  9100857.893990 
+289453.055595  9100981.475060 
+289457.206246  9101005.588542 
+289489.322747  9101185.436151 
+289489.352062  9101189.454332 
+289491.478722  9101208.542881 
+289496.784393  9101254.757434 
+289500.920469  9101276.861807 
+289531.064837  9101458.716179 
+289562.903745  9101600.390864 
+289574.465258  9101686.793701 
+289595.476406  9101842.519894 
+289619.831829  9101911.859603 
+289633.919991  9101935.983912 
+289672.070279  9101989.266106 
+289712.156742  9102035.518614 
+289760.156387  9102076.757037 
+289799.073118  9102098.899309 
+289829.996035  9102115.005610 
+289937.729530  9102171.376914 
+289984.669665  9102203.573053 
+290048.775054  9102272.955501 
+290132.975700  9102372.495567 
+290140.999030  9102382.549584 
+290216.109484  9102461.988904 
+290257.227435  9102513.264461 
+290296.402148  9102570.565054 
+290359.823818  9102682.136408 
+290399.131283  9102757.518553 
+290413.227542  9102782.646987 
+290441.214057  9102804.776733 
+290484.997347  9102812.859963 
+290515.118603  9102855.082557 
+290517.223856  9102871.157307 
+290549.119167  9102884.250371 
+290582.876802  9102880.268381 
+290615.751139  9102891.353378 
+290640.933333  9102937.588685 
+290655.184453  9102983.812294 
+290663.664671  9103056.147511 
+290688.987004  9103121.468972 
+290694.309318  9103169.692079 
+290678.954557  9103244.010919 
+290673.463571  9103308.294977 
+290689.584544  9103338.448048 
+290714.524010  9103351.533493 
+290748.252467  9103343.533152 
+290818.572638  9103311.462978 
+290842.422539  9103311.488312 
+290904.012654  9103308.540089 
+290968.760948  9103329.703808 
+291015.636609  9103352.857572 
+291033.560911  9103357.899169 
+291053.376820  9103349.883896 
+291079.979281  9103318.771649 
+291099.640252  9103289.661117 
+291121.443602  9103281.647923 
+291160.074180  9103264.611730 
+291170.983220  9103261.609657 
+291206.898164  9103280.733543 
+291219.875860  9103288.783436 
+291368.955032  9103426.560353 
+291487.014703  9103535.172871 
+291684.076363  9103711.170420 
+291720.050979  9103738.330012 
+291781.441687  9103708.258108 
+291889.548218  9103949.455882 
+291947.161563  9104081.107990 
+292043.197062  9104302.202033 
+292253.192882  9104210.001888 
+292413.648094  9104137.840727 
+Region 1
+174
+292732.113989  9105142.683814 
+292714.018168  9105114.539012 
+292690.115585  9105107.483213 
+292680.096182  9105096.423374 
+292674.934337  9105070.300666 
+292676.714081  9105042.175945 
+292682.483766  9105016.064299 
+292682.275964  9104987.937566 
+292676.090688  9104957.795744 
+292669.920266  9104929.662971 
+292664.795571  9104908.562886 
+292662.555733  9104874.406978 
+292653.404031  9104846.271176 
+292644.289444  9104823.158001 
+292637.192084  9104804.064944 
+292629.034192  9104775.930137 
+292623.820525  9104742.775718 
+292617.583430  9104705.602182 
+292610.463857  9104683.495532 
+292602.343109  9104660.383344 
+292594.207537  9104635.262098 
+292583.061012  9104606.119711 
+292572.930520  9104579.991909 
+292563.778975  9104551.856058 
+292550.615311  9104518.693522 
+292540.470037  9104490.556648 
+292533.291238  9104460.413750 
+292529.130812  9104435.296521 
+292521.010179  9104412.184296 
+292512.882141  9104388.067539 
+292502.774008  9104364.953280 
+292490.670954  9104340.832462 
+292488.631540  9104333.798742 
+292481.534368  9104314.705623 
+292471.396624  9104287.573238 
+292460.242900  9104257.426250 
+292447.064620  9104222.254587 
+292436.867637  9104187.085960 
+292420.722960  9104153.920288 
+292413.648094  9104137.840727 
+292253.192882  9104210.001888 
+292043.197062  9104302.202033 
+291947.161563  9104081.107990 
+291889.548218  9103949.455882 
+291781.441687  9103708.258108 
+291720.050979  9103738.330012 
+291684.076363  9103711.170420 
+291487.014703  9103535.172871 
+291368.955032  9103426.560353 
+291219.875860  9103288.783436 
+291206.898164  9103280.733543 
+291170.983220  9103261.609657 
+291160.074180  9103264.611730 
+291121.443602  9103281.647923 
+291099.640252  9103289.661117 
+291079.979281  9103318.771649 
+291053.376820  9103349.883896 
+291033.560911  9103357.899169 
+291015.636609  9103352.857572 
+290968.760948  9103329.703808 
+290904.012654  9103308.540089 
+290842.422539  9103311.488312 
+290818.572638  9103311.462978 
+290748.252467  9103343.533152 
+290714.524010  9103351.533493 
+290689.584544  9103338.448048 
+290673.463571  9103308.294977 
+290678.954557  9103244.010919 
+290694.309318  9103169.692079 
+290688.987004  9103121.468972 
+290663.664671  9103056.147511 
+290655.184453  9102983.812294 
+290640.933333  9102937.588685 
+290615.751139  9102891.353378 
+290582.876802  9102880.268381 
+290549.119167  9102884.250371 
+290517.223856  9102871.157307 
+290523.443933  9102906.322551 
+290499.999071  9102961.546632 
+290448.670525  9103008.704574 
+290437.040042  9103048.873350 
+290416.649811  9103249.757734 
+290398.114579  9103296.950836 
+290370.458926  9103320.025406 
+290298.224347  9103362.138216 
+290158.627856  9103433.309903 
+290114.232644  9103477.461525 
+290090.912140  9103549.762758 
+290088.386919  9103612.041070 
+290109.697186  9103672.335980 
+290145.229180  9103774.836523 
+290140.407539  9103794.921987 
+290127.871260  9103847.144197 
+290000.396109  9104081.063175 
+289897.396401  9104264.781790 
+289876.806671  9104302.931865 
+289791.429354  9104450.506216 
+289764.552214  9104580.062091 
+289751.404105  9104684.519443 
+289763.210927  9104804.071727 
+289787.841490  9104910.578861 
+289827.128902  9104982.947578 
+289832.141989  9104988.980172 
+289866.247209  9105032.211781 
+289972.104115  9105102.642718 
+290049.163466  9105176.056121 
+290102.298393  9105239.398456 
+290145.812304  9105345.925289 
+290163.016235  9105388.133968 
+290196.276674  9105587.066634 
+290225.607957  9105927.633892 
+290473.301828  9105960.041231 
+290627.651772  9106002.394234 
+290970.215508  9106097.179104 
+291108.458112  9106111.386671 
+291256.365121  9106088.436380 
+291295.079142  9106082.449408 
+291472.385515  9106003.275575 
+291809.165648  9105987.550155 
+291857.706269  9105966.504984 
+291877.648936  9105975.566133 
+291879.636535  9105975.568171 
+291905.527186  9105982.626357 
+291977.955957  9105966.628144 
+291992.855527  9105965.638860 
+292067.627634  9105997.859940 
+292110.309087  9105990.871837 
+292123.191396  9105985.862366 
+292130.214717  9105994.910216 
+292142.140300  9105994.922371 
+292148.058601  9105988.901275 
+292151.025166  9105986.895256 
+292155.971912  9105983.886733 
+292161.934701  9105983.892808 
+292161.956947  9105986.906393 
+292165.969217  9105991.933085 
+292170.982702  9105997.965316 
+292175.009806  9106005.001063 
+292179.022079  9106010.027752 
+292185.029367  9106016.060993 
+292195.011852  9106022.098278 
+292204.935007  9106020.099335 
+292213.827280  9106013.076738 
+292223.720764  9106007.059679 
+292230.669936  9106006.062226 
+292239.614120  9106006.071322 
+292244.612781  9106010.094487 
+292246.630047  9106014.114619 
+292251.613874  9106016.128727 
+292271.519514  9106020.167038 
+292290.498122  9106033.245080 
+292309.365457  9106031.255197 
+292332.200563  9106028.264812 
+292344.200338  9106038.322185 
+292369.616152  9105981.090329 
+292383.336386  9105954.986726 
+292396.099912  9105933.904751 
+292415.656744  9105890.730228 
+292460.317509  9105748.133711 
+292462.853650  9105687.865112 
+292502.983091  9105604.530664 
+292503.947196  9105600.513564 
+292511.645189  9105566.367706 
+292517.444653  9105544.274157 
+292528.109151  9105508.122268 
+292592.808364  9105387.645490 
+292606.402185  9105344.464936 
+292604.206817  9105316.336184 
+292581.631242  9105219.879497 
+292589.551793  9105215.869446 
+292614.344317  9105208.862924 
+292727.419771  9105179.846250 
+292726.344336  9105168.795462 
+292732.113989  9105142.683814 
+Region 1
+188
+293475.302915  9106999.770528 
+293490.023860  9106974.672175 
+293474.855912  9106939.499268 
+293424.040580  9106787.767597 
+293420.932539  9106770.687792 
+293411.772281  9106741.547845 
+293398.644254  9106713.408489 
+293390.537410  9106692.305685 
+293369.429177  9106660.140373 
+293351.369405  9106637.018688 
+293338.315908  9106618.924516 
+293321.257421  9106596.808316 
+293312.171727  9106577.713544 
+293309.011652  9106553.602062 
+293306.867719  9106532.505130 
+293303.700212  9106507.389124 
+293302.535206  9106484.284130 
+293298.373908  9106459.167137 
+293291.238655  9106435.051709 
+293285.052557  9106404.910130 
+293277.947096  9106384.812785 
+293275.922281  9106379.788202 
+293260.836656  9106355.664876 
+293244.772131  9106333.549599 
+293228.707624  9106311.434312 
+293215.624532  9106289.321979 
+293206.494330  9106264.200021 
+293192.372830  9106236.059550 
+293183.294734  9106217.969242 
+293175.180688  9106195.861828 
+293165.093935  9106175.761477 
+293164.893091  9106148.639355 
+293155.755524  9106122.512850 
+293139.735780  9106106.424641 
+293137.681249  9106097.381952 
+293134.618048  9106086.329226 
+293124.531348  9106066.228856 
+293115.416142  9106043.115902 
+293113.198012  9106011.973695 
+293101.108885  9105989.862283 
+293088.997464  9105964.737295 
+293088.915670  9105953.687536 
+293089.768182  9105934.602581 
+293081.646827  9105911.490601 
+293084.434882  9105885.375964 
+293069.357009  9105862.257030 
+293055.324984  9105846.170747 
+293043.243381  9105825.063825 
+293033.164236  9105805.967933 
+293021.075224  9105783.856476 
+293014.919225  9105757.732885 
+293004.832681  9105737.632456 
+292999.670492  9105711.509853 
+292990.473706  9105677.347073 
+292989.442759  9105672.323456 
+292981.314099  9105648.206909 
+292969.247464  9105629.108993 
+292962.127475  9105607.002482 
+292957.914544  9105574.853715 
+292951.773499  9105550.739146 
+292946.611387  9105524.616524 
+292934.440791  9105491.455243 
+292915.380604  9105467.327689 
+292892.323023  9105440.182551 
+292875.317299  9105425.097692 
+292860.306577  9105411.019348 
+292842.307093  9105395.933470 
+292823.343546  9105384.864683 
+292806.352718  9105371.788838 
+292797.267591  9105352.693844 
+292791.134112  9105329.583749 
+292788.983187  9105307.482186 
+292786.824842  9105284.376097 
+292780.661685  9105257.247895 
+292769.499949  9105226.096574 
+292741.473708  9105198.946293 
+292727.494006  9105189.891509 
+292727.419771  9105179.846250 
+292614.344317  9105208.862924 
+292589.551793  9105215.869446 
+292581.631242  9105219.879497 
+292604.206817  9105316.336184 
+292606.402185  9105344.464936 
+292592.808364  9105387.645490 
+292528.109151  9105508.122268 
+292517.444653  9105544.274157 
+292511.645189  9105566.367706 
+292503.947196  9105600.513564 
+292502.983091  9105604.530664 
+292462.853650  9105687.865112 
+292460.317509  9105748.133711 
+292415.656744  9105890.730228 
+292396.099912  9105933.904751 
+292383.336386  9105954.986726 
+292369.616152  9105981.090329 
+292344.200338  9106038.322185 
+292366.204887  9106057.430377 
+292373.176319  9106059.446483 
+292394.023830  9106056.454050 
+292411.007460  9106068.525488 
+292431.002184  9106084.618044 
+292444.107127  9106109.744291 
+292450.069924  9106109.750324 
+292454.045122  9106109.754345 
+292458.005474  9106107.749312 
+292480.877705  9106109.781479 
+292499.871245  9106124.868462 
+292522.765754  9106129.914185 
+292573.664861  9106159.096601 
+292619.491051  9106174.210575 
+292659.347033  9106188.313968 
+292661.334633  9106188.315969 
+292663.322233  9106188.317969 
+292666.311061  9106189.325495 
+292671.287490  9106190.335021 
+292674.276318  9106191.342547 
+292677.257718  9106191.345547 
+292680.246546  9106192.353072 
+292683.227947  9106192.356071 
+292689.213032  9106195.375646 
+292691.208061  9106196.382171 
+292694.189461  9106196.385170 
+292696.184490  9106197.391694 
+292700.174547  9106199.404743 
+292702.169576  9106200.411267 
+292705.158405  9106201.418790 
+292708.154663  9106203.430839 
+292710.157121  9106205.441888 
+292713.145951  9106206.449410 
+292718.152097  9106211.477032 
+292723.143386  9106214.495602 
+292725.145845  9106216.506651 
+292728.142105  9106218.518697 
+292731.138365  9106220.530744 
+292733.133395  9106221.537266 
+292735.135855  9106223.548314 
+292740.127146  9106226.566882 
+292744.117207  9106228.579925 
+292747.113469  9106230.591970 
+292750.102300  9106231.599490 
+292752.097331  9106232.606011 
+292759.083656  9106236.631097 
+292762.094778  9106240.652191 
+292820.989118  9106275.869390 
+292885.846348  9106311.092459 
+292922.840032  9106341.264974 
+292991.791602  9106392.564208 
+293028.956471  9106445.840643 
+293036.017222  9106459.910908 
+293043.975093  9106460.923356 
+293060.892077  9106463.953760 
+293067.915650  9106473.001400 
+293076.956589  9106486.069112 
+293089.928119  9106493.113637 
+293124.897271  9106518.261324 
+293138.877502  9106527.315865 
+293150.728760  9106517.282490 
+293193.700488  9106549.469670 
+293219.814785  9106586.662650 
+293263.750658  9106614.832633 
+293284.762027  9106633.939230 
+293300.856488  9106660.072548 
+293314.881461  9106675.154148 
+293326.881603  9106685.211166 
+293338.904086  9106698.281745 
+293353.159910  9106744.503502 
+293364.337539  9106777.663520 
+293381.597205  9106826.901764 
+293386.596047  9106830.924755 
+293390.615973  9106836.955808 
+293392.730203  9106854.034635 
+293394.762511  9106860.063725 
+293401.823459  9106874.133890 
+293407.868256  9106885.189507 
+293410.901828  9106892.224097 
+293416.909389  9106898.257106 
+293422.916952  9106904.290113 
+293423.955455  9106910.318220 
+293425.023753  9106920.364413 
+293427.108212  9106933.425149 
+293432.151764  9106943.475259 
+293436.186608  9106951.515346 
+293442.179283  9106955.539306 
+293447.185595  9106960.566807 
+293460.202011  9106973.638306 
+293464.214514  9106978.664825 
+293469.258081  9106988.714928 
+293475.302915  9106999.770528 
diff --git a/examples/data/BairrosRecife2.csv b/examples/data/BairrosRecife2.csv
new file mode 100644
index 0000000..ca41f68
--- /dev/null
+++ b/examples/data/BairrosRecife2.csv
@@ -0,0 +1,94 @@
+261160605001;1;Recife;RECIFE
+261160605002;2;Santo Amaro;SANTO AMARO
+261160605003;3;Boa Vista;BOA VISTA
+261160605004;4;Soledade;SOLEDADE
+261160605005;5;Santo Antonio;SANTO ANTONIO
+261160605006;6;Paissandu;PAISSANDU
+261160605007;7;Ilha do Leite;ILHA DO LEITE
+261160605008;8;Coelhos;COELHOS
+261160605009;9;Ilha Joana Bezerra;ILHA JOANA BEZERRA
+261160605010;10;Cabanga;CABANGA
+261160605011;11;Sao Jose;SAO JOSE
+261160605012;12;Derby;DERBY
+261160605013;13;Gra�as;GRACAS
+261160605014;14;Jaqueira;JAQUEIRA
+261160605015;15;Aflitos;AFLITOS
+261160605016;16;Espinheiro;ESPINHEIRO
+261160605017;17;Rosarinho;ROSARINHO
+261160605018;18;Tamarineira;TAMARINEIRA
+261160605019;19;Peixinhos;PEIXINHOS
+261160605020;20;Campina do Barreto;CAMPINA DO BARRETO
+261160605021;21;Arruda;ARRUDA
+261160605022;22;Ponto de Parada;PONTO DE PARADA
+261160605023;23;Hipodromo;HIPODROMO
+261160605024;24;Campo Grande;CAMPO GRANDE
+261160605025;25;Encruzilhada;ENCRUZILHADA
+261160605026;26;Torreao;TORREAO
+261160605027;27;Passarinho;PASSARINHO
+261160605028;28;Dois Unidos;DOIS UNIDOS
+261160605029;29;Linha do Tiro;LINHA DO TIRO
+261160605030;30;Beberibe;BEBERIBE
+261160605031;31;Alto Santa Teresinha;ALTO SANTA TERESINHA
+261160605032;32;Porto da Madeira;PORTO DA MADEIRA
+261160605033;33;Cajueiro;CAJUEIRO
+261160605034;34;Fundao;FUNDAO
+261160605035;35;Agua Fria;AGUA FRIA
+261160605036;36;Bomba do Hemeterio;BOMBA DO HEMETERIO
+261160605037;37;Pau-Ferro;PAU-FERRO
+261160605038;38;Guabiraba;GUABIRABA
+261160605039;39;Sitio dos Pintos;SITIO DOS PINTOS
+261160605040;40;Dois Irmaos;DOIS IRMAOS
+261160605041;41;Brejo da Guabiraba;BREJO DA GUABIRABA
+261160605042;42;Corrego do Jenipa;CORREGO DO JENIPAPO
+261160605043;43;Apipucos;APIPUCOS
+261160605044;44;Macaxeira;MACAXEIRA
+261160605045;45;Nova Descoberta;NOVA DESCOBERTA
+261160605046;46;Brejo de Beberibe;BREJO DE BEBERIBE
+261160605047;47;Alto do Mandu;ALTO DO MANDU
+261160605048;48;Casa Amarela;CASA AMARELA
+261160605049;49;Vasco da Gama;VASCO DA GAMA
+261160605050;50;Alto Jose Bonifacio;ALTO JOSE BONIFACIO
+261160605051;51;Morro da Conceicao;MORRO DA CONCEICAO
+261160605052;52;Alto Jose do Pinho;ALTO JOSE DO PINHO
+261160605053;53;Mangabeira;MANGABEIRA
+261160605054;54;Parnamirim;PARNAMIRIM
+261160605055;55;Casa Forte;CASA FORTE
+261160605056;56;Santana;SANTANA
+261160605057;57;Po�o;POCO
+261160605058;58;Monteiro;MONTEIRO
+261160605059;59;Torre;TORRE
+261160605060;60;Cordeiro;CORDEIRO
+261160605061;61;Zumbi;ZUMBI
+261160605062;62;Madalena;MADALENA
+261160605063;63;Prado;PRADO
+261160605064;64;Ilha do Retiro;ILHA DO RETIRO
+261160605065;65;Bongi;BONGI
+261160605066;66;San Martin;SAN MARTIN
+261160605067;67;Mustardinha;MUSTARDINHA
+261160605068;68;Mangueira;MANGUEIRA
+261160605069;69;Varzea;VARZEA
+261160605070;70;Caxanga�;CAXANGA
+261160605071;71;Iputinga;IPUTINGA
+261160605072;72;Torroes;TORROES
+261160605073;73;Engenho do Meio;ENGENHO DO MEIO
+261160605074;74;Cidade Universitaria�;CIDADE UNIVERSITARIA
+261160605075;75;Afogados;AFOGADOS
+261160605076;76;Jiquia�;JIQUIA
+261160605077;77;Estancia;ESTANCIA
+261160605078;78;Areias;AREIAS
+261160605079;79;Ca�ote;CACOTE
+261160605080;80;Curado;CURADO
+261160605081;81;Toto;TOTO
+261160605082;82;Coqueiral;COQUEIRAL
+261160605083;83;Sancho;SANCHO
+261160605084;84;Tejipio;TEJIPIO
+261160605085;85;Jardim Sao Paulo;JARDIM SAO PAULO
+261160605086;86;Barro;BARRO
+261160605087;87;Cohab;COHAB
+261160605088;88;Jordao;JORDAO
+261160605089;89;Ibura;IBURA
+261160605090;90;Ipsep;IPSEP
+261160605091;91;Imbiribeira;IMBIRIBEIRA
+261160605092;92;Boa Viagem;BOA VIAGEM
+261160605093;93;Pina;PINA
+261160605094;94;Brasilia Teimosa;BRASILIA TEIMOSA
diff --git a/examples/data/Cadastro_Escolas.geo b/examples/data/Cadastro_Escolas.geo
new file mode 100644
index 0000000..d5b83d4
--- /dev/null
+++ b/examples/data/Cadastro_Escolas.geo
@@ -0,0 +1,201 @@
+PONTOS
+1                                184880.000000 8252050.000000 -47.941111 -15.790318
+2                                185860.000000 8252050.000000 -47.931973 -15.790441
+3                                185685.000000 8252275.000000 -47.933575 -15.788388
+4                                185140.000000 8250300.000000 -47.938915 -15.806151
+21                               191400.000000 8246450.000000 -47.881030 -15.841695
+22                               189700.000000 8246360.000000 -47.896898 -15.842296
+29                               193120.000000 8258910.000000 -47.863406 -15.729404
+30                               194600.000000 8257320.000000 -47.849809 -15.743941
+31                               190285.000000 8250745.000000 -47.890878 -15.802777
+32                               189930.000000 8257645.000000 -47.893305 -15.740433
+33                               190770.000000 8253110.000000 -47.886053 -15.781484
+34                               188420.000000 8247530.000000 -47.908685 -15.831572
+35                               191095.000000 8250010.000000 -47.883419 -15.809514
+36                               186220.000000 8254440.000000 -47.928306 -15.768908
+37                               187300.000000 8249355.000000 -47.918894 -15.814955
+38                               188495.000000 8247600.000000 -47.907977 -15.830950
+39                               189520.000000 8249645.000000 -47.898154 -15.812614
+40                               194720.000000 8251690.000000 -47.849400 -15.794791
+41                               189100.000000 8249355.000000 -47.902108 -15.815180
+42                               190150.000000 8250500.000000 -47.892169 -15.804972
+43                               187400.000000 8248050.000000 -47.918131 -15.826750
+44                               189295.000000 8248535.000000 -47.900395 -15.822608
+45                               192035.000000 8253650.000000 -47.874189 -15.776764
+46                               186790.000000 8248895.000000 -47.923710 -15.819044
+47                               191470.000000 8256050.000000 -47.879151 -15.755025
+48                               191850.000000 8254850.000000 -47.875761 -15.765906
+49                               188230.000000 8250150.000000 -47.910119 -15.807893
+50                               189700.000000 8254500.000000 -47.895852 -15.768801
+51                               188620.000000 8247680.000000 -47.906801 -15.830243
+52                               187125.000000 8249330.000000 -47.920530 -15.815158
+53                               187975.000000 8249825.000000 -47.912539 -15.810796
+54                               189940.000000 8253200.000000 -47.893781 -15.780568
+55                               183835.000000 8255140.000000 -47.950451 -15.762288
+56                               191025.000000 8253160.000000 -47.883669 -15.781064
+57                               190950.000000 8253890.000000 -47.884275 -15.774463
+58                               190900.000000 8254540.000000 -47.884658 -15.768588
+59                               188950.000000 8249220.000000 -47.903524 -15.816380
+60                               187955.000000 8248490.000000 -47.912898 -15.822847
+61                               190150.000000 8256960.000000 -47.891341 -15.746645
+62                               187145.000000 8247940.000000 -47.920524 -15.827711
+63                               190145.000000 8249800.000000 -47.892305 -15.811292
+64                               189600.000000 8249295.000000 -47.897453 -15.815784
+65                               188940.000000 8248700.000000 -47.903685 -15.821074
+66                               187360.000000 8247480.000000 -47.918578 -15.831891
+67                               190670.000000 8253750.000000 -47.886904 -15.775693
+68                               189645.000000 8250470.000000 -47.896882 -15.805180
+69                               189400.000000 8250225.000000 -47.899198 -15.807362
+70                               190560.000000 8254320.000000 -47.887856 -15.770532
+71                               188710.000000 8249570.000000 -47.905717 -15.813190
+72                               189920.000000 8256400.000000 -47.893557 -15.751673
+73                               186950.000000 8248060.000000 -47.922327 -15.826603
+74                               186670.000000 8247930.000000 -47.924955 -15.827741
+75                               189510.000000 8257890.000000 -47.897189 -15.738169
+76                               186350.000000 8247660.000000 -47.927974 -15.830139
+77                               191750.000000 8253610.000000 -47.876851 -15.777090
+78                               191650.000000 8254350.000000 -47.877689 -15.770396
+79                               190075.000000 8249285.000000 -47.893024 -15.815933
+80                               191480.000000 8255280.000000 -47.879156 -15.761978
+81                               191130.000000 8256100.000000 -47.882315 -15.754531
+82                               188750.000000 8248090.000000 -47.905535 -15.826558
+83                               191070.000000 8256360.000000 -47.882841 -15.752176
+84                               187900.000000 8247600.000000 -47.913526 -15.830875
+85                               190605.000000 8257745.000000 -47.886999 -15.739614
+86                               186970.000000 8246890.000000 -47.922292 -15.837169
+87                               190080.000000 8254620.000000 -47.892293 -15.767764
+88                               189680.000000 8255940.000000 -47.895854 -15.755796
+89                               185860.000000 8253820.000000 -47.931743 -15.774461
+91                               188350.000000 8250345.000000 -47.908975 -15.806148
+92                               187800.000000 8250050.000000 -47.914142 -15.808742
+93                               187130.000000 8246640.000000 -47.920832 -15.839446
+94                               186530.000000 8249880.000000 -47.926007 -15.810118
+95                               188580.000000 8249900.000000 -47.906887 -15.810194
+96                               190350.000000 8250670.000000 -47.890282 -15.803462
+97                               190970.000000 8254450.000000 -47.884017 -15.769409
+98                               188790.000000 8249145.000000 -47.905026 -15.817037
+99                               187040.000000 8247885.000000 -47.921510 -15.828194
+100                              189055.000000 8248800.000000 -47.902599 -15.820185
+101                              190710.000000 8253080.000000 -47.886616 -15.781747
+102                              189900.000000 8250755.000000 -47.894467 -15.802639
+103                              190725.000000 8253740.000000 -47.886392 -15.775790
+104                              189380.000000 8250140.000000 -47.899396 -15.808127
+105                              188585.000000 8249490.000000 -47.906893 -15.813897
+106                              189980.000000 8256450.000000 -47.892992 -15.751229
+107                              186875.000000 8248160.000000 -47.923013 -15.825690
+108                              186390.000000 8247840.000000 -47.927578 -15.828519
+109                              191720.000000 8253840.000000 -47.877102 -15.775010
+463                              185300.000000 8252710.000000 -47.937109 -15.784412
+464                              184780.000000 8251740.000000 -47.942084 -15.793104
+465                              185045.000000 8252880.000000 -47.939464 -15.782845
+466                              185100.000000 8251460.000000 -47.939136 -15.795672
+467                              184785.000000 8251470.000000 -47.942072 -15.795542
+468                              184540.000000 8251175.000000 -47.944395 -15.798175
+469                              185150.000000 8251660.000000 -47.938644 -15.793873
+470                              184370.000000 8250550.000000 -47.946062 -15.803796
+471                              185375.000000 8252750.000000 -47.936404 -15.784060
+528                              191820.000000 8246735.000000 -47.877076 -15.839174
+540                              192010.000000 8258485.000000 -47.873807 -15.733105
+546                              189350.000000 8256240.000000 -47.898892 -15.753047
+547                              187570.000000 8248430.000000 -47.916496 -15.823340
+548                              190280.000000 8249710.000000 -47.891058 -15.812121
+549                              188560.000000 8250500.000000 -47.906996 -15.804774
+550                              190800.000000 8256780.000000 -47.885305 -15.748351
+551                              187030.000000 8248900.000000 -47.921471 -15.819029
+552                              191600.000000 8253950.000000 -47.878206 -15.774002
+553                              190250.000000 8254300.000000 -47.890749 -15.770675
+554                              190720.000000 8249520.000000 -47.886979 -15.813891
+555                              189980.000000 8254760.000000 -47.893208 -15.766488
+556                              187460.000000 8249930.000000 -47.917328 -15.809783
+557                              190570.000000 8253100.000000 -47.887919 -15.781549
+558                              188870.000000 8257600.000000 -47.903193 -15.740708
+559                              191450.000000 8250470.000000 -47.880049 -15.805404
+560                              189820.000000 8254750.000000 -47.894701 -15.766558
+561                              189250.000000 8256450.000000 -47.899797 -15.751138
+562                              188660.000000 8250270.000000 -47.906093 -15.806863
+563                              189090.000000 8250560.000000 -47.902046 -15.804299
+564                              189470.000000 8251060.000000 -47.898438 -15.799832
+565                              189040.000000 8257000.000000 -47.901685 -15.746146
+566                              189800.000000 8251140.000000 -47.895350 -15.799150
+567                              188100.000000 8249990.000000 -47.911352 -15.809321
+568                              186850.000000 8249120.000000 -47.923122 -15.817020
+569                              186440.000000 8248600.000000 -47.927013 -15.821663
+570                              188400.000000 8250050.000000 -47.908546 -15.808817
+571                              189870.000000 8254110.000000 -47.894317 -15.772343
+572                              188650.000000 8250600.000000 -47.906144 -15.803883
+573                              188900.000000 8250370.000000 -47.903842 -15.805990
+574                              189900.000000 8254230.000000 -47.894022 -15.771263
+575                              187290.000000 8249570.000000 -47.918960 -15.813012
+576                              188820.000000 8250630.000000 -47.904555 -15.803633
+577                              187350.000000 8246820.000000 -47.918757 -15.837849
+578                              189670.000000 8251110.000000 -47.896567 -15.799405
+579                              190100.000000 8248830.000000 -47.892849 -15.820044
+580                              192020.000000 8253930.000000 -47.874293 -15.774234
+581                              189290.000000 8248230.000000 -47.900481 -15.825361
+582                              187520.000000 8246910.000000 -47.917160 -15.837057
+583                              186560.000000 8248700.000000 -47.925881 -15.820775
+584                              189150.000000 8248100.000000 -47.901803 -15.826517
+585                              190300.000000 8253100.000000 -47.890437 -15.781516
+586                              191380.000000 8250300.000000 -47.880724 -15.806931
+587                              189180.000000 8255700.000000 -47.900546 -15.757901
+588                              191700.000000 8255320.000000 -47.877100 -15.761644
+589                              189340.000000 8250950.000000 -47.899664 -15.800809
+590                              191620.000000 8255700.000000 -47.877797 -15.758203
+591                              188820.000000 8247800.000000 -47.904920 -15.829185
+592                              190380.000000 8249150.000000 -47.890197 -15.817190
+593                              189180.000000 8256470.000000 -47.900447 -15.750949
+594                              188820.000000 8250400.000000 -47.904584 -15.805710
+595                              188020.000000 8247840.000000 -47.912376 -15.828723
+596                              191700.000000 8255480.000000 -47.877079 -15.760200
+597                              190240.000000 8249000.000000 -47.891522 -15.818527
+598                              189270.000000 8250810.000000 -47.900335 -15.802064
+599                              189530.000000 8254860.000000 -47.897391 -15.765529
+600                              189630.000000 8257890.000000 -47.896070 -15.738184
+601                              190310.000000 8253690.000000 -47.890268 -15.776190
+602                              188930.000000 8250380.000000 -47.903561 -15.805904
+603                              186850.000000 8249440.000000 -47.923080 -15.814131
+604                              189460.000000 8256590.000000 -47.897822 -15.749900
+605                              188560.000000 8250380.000000 -47.907012 -15.805858
+606                              187460.000000 8249630.000000 -47.917367 -15.812492
+607                              190530.000000 8255180.000000 -47.888026 -15.762764
+608                              189990.000000 8253920.000000 -47.893222 -15.774073
+609                              189020.000000 8256900.000000 -47.901884 -15.747047
+610                              188950.000000 8250820.000000 -47.903318 -15.801934
+611                              188820.000000 8247790.000000 -47.904921 -15.829275
+612                              191910.000000 8254500.000000 -47.875246 -15.769074
+613                              189550.000000 8256160.000000 -47.897038 -15.753794
+614                              188800.000000 8247700.000000 -47.905119 -15.830085
+615                              186970.000000 8249260.000000 -47.921984 -15.815771
+616                              188280.000000 8249990.000000 -47.909673 -15.809344
+617                              186880.000000 8246950.000000 -47.923124 -15.836616
+618                              189860.000000 8254370.000000 -47.894377 -15.769994
+619                              189000.000000 8247930.000000 -47.903224 -15.828033
+620                              188990.000000 8257180.000000 -47.902128 -15.744515
+621                              186410.000000 8247550.000000 -47.927429 -15.831139
+622                              189300.000000 8257330.000000 -47.899219 -15.743199
+623                              189870.000000 8256970.000000 -47.893951 -15.746520
+624                              186510.000000 8248820.000000 -47.926331 -15.819686
+625                              188925.000000 8256730.000000 -47.902791 -15.748570
+626                              189715.000000 8250215.000000 -47.896262 -15.807491
+627                              189920.000000 8255210.000000 -47.893710 -15.762417
+628                              188460.000000 8249560.000000 -47.908050 -15.813249
+629                              189470.000000 8255940.000000 -47.897812 -15.755770
+630                              194100.000000 8250250.000000 -47.855364 -15.807717
+631                              189580.000000 8255120.000000 -47.896891 -15.763188
+632                              189110.000000 8256700.000000 -47.901071 -15.748864
+634                              188900.000000 8257280.000000 -47.902954 -15.743601
+635                              191020.000000 8249860.000000 -47.884137 -15.810859
+636                              189105.000000 8255680.000000 -47.901248 -15.758073
+637                              188220.000000 8250115.000000 -47.910217 -15.808208
+638                              190900.000000 8256180.000000 -47.884449 -15.753780
+639                              188480.000000 8248280.000000 -47.908029 -15.824808
+640                              190660.000000 8253590.000000 -47.887017 -15.777136
+641                              188790.000000 8249625.000000 -47.904964 -15.812703
+642                              187060.000000 8248325.000000 -47.921266 -15.824224
+643                              191305.000000 8250150.000000 -47.881442 -15.808276
+644                              190610.000000 8252810.000000 -47.887583 -15.784172
+645                              187830.000000 8251650.000000 -47.913655 -15.794300
+646                              188630.000000 8247690.000000 -47.906706 -15.830154
+830                              184740.000000 8251050.000000 -47.942547 -15.799329
+831                              184950.000000 8251040.000000 -47.940590 -15.799445
+END
diff --git a/examples/data/Cadastro_Escolas.tab b/examples/data/Cadastro_Escolas.tab
new file mode 100644
index 0000000..ef759f6
--- /dev/null
+++ b/examples/data/Cadastro_Escolas.tab
@@ -0,0 +1,237 @@
+TABLE
+CADASTRAL	ROTULO
+SEPARATOR ,
+ROTULO,TEXT,32,0
+NOME,TEXT,32,0
+CODIGO,REAL,17,8
+NOME_ESC,TEXT,60,0
+ENDERECO,TEXT,55,0
+TELEFONE,TEXT,13,0
+NOME_RA,TEXT,28,0
+TIPO,TEXT,11,0
+ENSINO,TEXT,15,0
+NO_SALAS,REAL,17,8
+TURNO,TEXT,11,0
+CRE_MAT_AL,REAL,17,8
+CRE_MAT_PF,REAL,17,8
+JARDIM_AL,REAL,17,8
+JARDIM_PF,REAL,17,8
+PG_1A4S_AL,REAL,17,8
+PG_1A4S_PF,REAL,17,8
+PG_5A8S_AL,REAL,17,8
+PG_5A8S_PF,REAL,17,8
+SEGRAU_AL,REAL,17,8
+SEGRAU_PF,REAL,17,8
+ESPECIA_AL,REAL,17,8
+ESP_CLS_CO,REAL,17,8
+ESPECIA_PF,REAL,17,8
+SUPLET_AL,REAL,17,8
+SUPLET_PF,REAL,17,8
+EXTR_AL,REAL,17,8
+EXTR_PF,REAL,17,8
+MUSIC_AL,REAL,17,8
+MUSIC_PF,REAL,17,8
+PROFISS_AL,REAL,17,8
+PROFISS_PF,REAL,17,8
+COORD_X,REAL,17,8
+COORD_Y,REAL,17,8
+INFO_END
+1,1,53008871.000000,Escola Recanto Cultural,Q 02 - Bloco K - Casa 26,233-2255,RA XI - CRUZEIRO,Particular,Infantil,4.000000,M V,31.000000,2.000000,46.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184880.000000,8252050.000000
+2,2,53008901.000000,Maternal e Jardim de Infancia Barquinho Amarelo,Q 10 - Bloco X - Casa 4,234-1149,RA XI - CRUZEIRO,Particular,Infantil,8.000000,M V,36.000000,2.000000,98.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185860.000000,8252050.000000
+3,3,0.000000,Maternal e Jardim de Infancia Matita Pere,Qd 6 - Bloco X - Casa 5,233-3786,RA XI - CRUZEIRO,Particular,Infantil,4.000000,M V,0.000000,0.000000,72.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185685.000000,8252275.000000
+4,4,0.000000,Escola Batista Sementinha do Saber,AOS 1/2 - Lote 7,233-3697,RA XI - CRUZEIRO,Particular,Infantil,4.000000,M V,33.000000,2.000000,26.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185140.000000,8250300.000000
+21,21,53009576.000000,INEI Centro de Ensino de 1o Grau,SHIS QI 7 - Conj 17 - Lote F,248-2450,RA XVI - LAGO SUL,Particular,Inf/Reg,17.000000,M,27.000000,2.000000,76.000000,3.000000,131.000000,6.000000,149.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191400.000000,8246450.000000
+22,22,53009592.000000,Instituto Nossa Senhora do Perpetuo Socorro,SHIS EQL 6/8 - Conj A,248-0043,RA XVI - LAGO SUL,Particular,Inf/Reg,15.000000,M V,39.000000,3.000000,115.000000,7.000000,216.000000,12.000000,181.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189700.000000,8246360.000000
+29,29,53009452.000000,Escola de 1o Grau Tia Bibia - INDI,SHIN QI 03 - Conj D - Area Especial,577-3935,RA XVIII  - LAGO NORTE,Particular,Inf/Reg,21.000000,M V,98.000000,5.000000,96.000000,4.000000,201.000000,10.000000,104.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,193120.000000,8258910.000000
+30,30,0.000000,Sempre Maternal e Jardim de Infancia,SHIN QI 9 - Conj 1 - Casa 28,368-5090,RA XVIII  - LAGO NORTE,Particular,Infantil,2.000000,M V,8.000000,1.000000,8.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,194600.000000,8257320.000000
+31,31,53001451.000000,Escola Classe 102 Sul,SQS 102,226-8224,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,378.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190285.000000,8250745.000000
+32,32,53001524.000000,Escola Classe 115 Norte,SQN 115,274-4960,RA I - BRASILIA,Publica,Inf/Reg/Supl,9.000000,M  V  N,0.000000,0.000000,50.000000,4.000000,394.000000,22.000000,0.000000,0.000000,0.000000,0.000000,0.000000,5.000000,0.000000,265.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189930.000000,8257645.000000
+33,33,53001575.000000,Escola Classe 302 Norte,SQN 302,224-8286,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,397.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190770.000000,8253110.000000
+34,34,53000200.000000,CEE 02 de Brasilia,SGAS 612,242-4400,RA I - BRASILIA,Publica,Especial,32.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,221.000000,0.000000,100.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188420.000000,8247530.000000
+35,35,53000234.000000,CES da Asa Sul - CESAS,SGAS 602 Projecao D,225-3122,RA I - BRASILIA,Publica,Supletivo,31.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,7241.000000,78.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191095.000000,8250010.000000
+36,36,53000242.000000,CES Verde Oliva - CESVO,Batalhao de Policia do Exercito,225-5110,RA I - BRASILIA,Publica,Supletivo,14.000000,N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1119.000000,26.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186220.000000,8254440.000000
+37,37,53000439.000000,Centro Integrado de Ensino Especial-CIEE,SGAS 912 Conjunto E Lotes 42/49,346-6161,RA I - BRASILIA,Publica,Especial,63.000000,M  V  I,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,244.000000,0.000000,122.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187300.000000,8249355.000000
+38,38,53000714.000000,CEE de Deficientes Visuais,SGAS 612  Lote 12,242-1447,RA I - BRASILIA,Publica,Especial,45.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,130.000000,0.000000,59.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188495.000000,8247600.000000
+39,39,53000846.000000,CE de 1o Grau 01 de Brasilia,SQS 106,243-3843,RA I - BRASILIA,Publica,Regular,9.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,552.000000,35.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189520.000000,8249645.000000
+40,40,53000854.000000,CE de 1o Grau 01 do Planalto,Rua 03 Acampamento Tamboril,225-1408,RA I - BRASILIA,Publica,Inf/Reg/Supl,18.000000,M  V  N,0.000000,0.000000,67.000000,2.000000,389.000000,16.000000,425.000000,24.000000,0.000000,0.000000,0.000000,0.000000,0.000000,117.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,194720.000000,8251690.000000
+41,41,53000862.000000,CE de 1o Grau 02 de Brasilia,SQS 107,243-9892,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,509.000000,35.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189100.000000,8249355.000000
+42,42,53000870.000000,CE de 1o Grau 03 de Brasilia,SQS 103,223-4083,RA I - BRASILIA,Publica,Regular,10.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,826.000000,52.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190150.000000,8250500.000000
+43,43,53000889.000000,CE de 1o Grau 04 de Brasilia,SQS 113,242-4182,RA I - BRASILIA,Publica,Reg/Supl,10.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,897.000000,52.000000,0.000000,0.000000,0.000000,10.000000,0.000000,165.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187400.000000,8248050.000000
+44,44,53000897.000000,CE de 1o Grau 05 de Brasilia,SQS 408,242-0931,RA I - BRASILIA,Publica,Regular,10.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,763.000000,40.000000,0.000000,0.000000,0.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189295.000000,8248535.000000
+45,45,53000919.000000,CE de 1o Grau GAN,SGAN 603/604 Conjunto H,223-4863,RA I - BRASILIA,Publica,Regular,9.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,883.000000,55.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,192035.000000,8253650.000000
+46,46,53000927.000000,CE de 1o Grau POLIVALENTE,SGAS 913 Modulos 57/58,245-1178,RA I - BRASILIA,Publica,Regular,15.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,640.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186790.000000,8248895.000000
+47,47,53000986.000000,CED CAN,SGAN 610 Modulo A,273-8001,RA I - BRASILIA,Publica,Regular,16.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,329.000000,37.000000,1003.000000,77.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191470.000000,8256050.000000
+48,48,53001010.000000,CED da Asa Norte - CEAN,SGAN 606 Modulos G/H,272-2338,RA I - BRASILIA,Publica,Regular,10.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,182.000000,11.000000,948.000000,65.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191850.000000,8254850.000000
+49,49,53001036.000000,CED ELEFANTE BRANCO,SGAS 908 Modulos 25/26,243-4588,RA I - BRASILIA,Publica,Regular,30.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,3670.000000,251.000000,0.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188230.000000,8250150.000000
+50,50,53001044.000000,CED GISNO,SGAN 908 Conjunto B,272-4103,RA I - BRASILIA,Publica,Reg/Supl,22.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,746.000000,38.000000,1094.000000,47.000000,0.000000,1.000000,0.000000,494.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189700.000000,8254500.000000
+51,51,53001206.000000,CED SETOR LESTE,SGAS 611/612 Conjunto E,243-8263,RA I - BRASILIA,Publica,Regular,26.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,84.000000,9.000000,1913.000000,192.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188620.000000,8247680.000000
+52,52,53001214.000000,CED SETOR OESTE,SGAS 912/913,346-4224,RA I - BRASILIA,Publica,Regular,16.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1385.000000,70.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187125.000000,8249330.000000
+53,53,53001265.000000,CIE  CASEB,SGAS 909 Conjunto A,242-2266,RA I - BRASILIA,Publica,Regular,37.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1796.000000,107.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187975.000000,8249825.000000
+54,54,53001354.000000,Colegio Militar de Brasilia,SGAN 902/904,321-6664,RA I - BRASILIA,Publica,Regular,92.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1583.000000,90.000000,1602.000000,97.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189940.000000,8253200.000000
+55,55,53001435.000000,Escola Classe 07 do Cruzeiro,Area Especial RCG - SMC,234-4309,RA I - BRASILIA,Publica,Inf/Reg,4.000000,M  V,0.000000,0.000000,55.000000,5.000000,61.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,183835.000000,8255140.000000
+56,56,53001443.000000,Escola Classe 102 Norte,SQN 102,224-7507,RA I - BRASILIA,Publica,Reg/Supl,9.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,126.000000,6.000000,364.000000,23.000000,0.000000,0.000000,0.000000,0.000000,0.000000,141.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191025.000000,8253160.000000
+57,57,53001460.000000,Escola Classe 104 Norte,SQN 104,225-5789,RA I - BRASILIA,Publica,Regular,9.000000,M  V,0.000000,0.000000,0.000000,0.000000,32.000000,1.000000,574.000000,34.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190950.000000,8253890.000000
+58,58,53001478.000000,Escola Classe 106 Norte,SQN 106,273-7543,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,441.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190900.000000,8254540.000000
+59,59,53001486.000000,Escola Classe 108 Sul,SQS 108,242-4516,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,480.000000,13.000000,0.000000,0.000000,0.000000,0.000000,7.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188950.000000,8249220.000000
+60,60,53001494.000000,Escola Classe 111 Sul,SQS 111,242-2915,RA I - BRASILIA,Publica,Regular,10.000000,M  V,0.000000,0.000000,0.000000,0.000000,356.000000,10.000000,340.000000,17.000000,0.000000,0.000000,0.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187955.000000,8248490.000000
+61,61,53001508.000000,Escola Classe 113 Norte,SQN 113,273-7589,RA I - BRASILIA,Publica,Reg/Supl,9.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,593.000000,29.000000,0.000000,0.000000,0.000000,1.000000,0.000000,430.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190150.000000,8256960.000000
+62,62,53001516.000000,Escola Classe 114 Sul,SQS 114,242-3114,RA I - BRASILIA,Publica,Regular,7.000000,M  V,0.000000,0.000000,0.000000,0.000000,333.000000,7.000000,0.000000,0.000000,0.000000,0.000000,16.000000,2.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187145.000000,8247940.000000
+63,63,53001532.000000,Escola Classe 204 Sul,SQS 204,223-4071,RA I - BRASILIA,Publica,Reg/Supl,11.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,399.000000,13.000000,269.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,198.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190145.000000,8249800.000000
+64,64,53001540.000000,Escola Classe 206 Sul,SQS 206,242-0002,RA I - BRASILIA,Publica,Inf/Reg,8.000000,M  V,0.000000,0.000000,38.000000,2.000000,443.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189600.000000,8249295.000000
+65,65,53001559.000000,Escola Classe 209 Sul,SQS 209,244-7058,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,372.000000,10.000000,0.000000,0.000000,0.000000,0.000000,11.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188940.000000,8248700.000000
+66,66,53001567.000000,Escola Classe 214 Sul,SQS 214,346-5464,RA I - BRASILIA,Publica,Regular,10.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,588.000000,35.000000,0.000000,0.000000,6.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187360.000000,8247480.000000
+67,67,53001583.000000,Escola Classe 304 Norte,SQN 304,226-4364,RA I - BRASILIA,Publica,Regular,7.000000,M  V,0.000000,0.000000,0.000000,0.000000,433.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190670.000000,8253750.000000
+68,68,53001591.000000,Escola Classe 304 Sul,SQS 304,224-4003,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,334.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189645.000000,8250470.000000
+69,69,53001605.000000,Escola Classe 305 Sul,SQS 305,243-3083,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,566.000000,18.000000,0.000000,0.000000,0.000000,0.000000,8.000000,4.000000,1.000000,267.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189400.000000,8250225.000000
+70,70,53001613.000000,Escola Classe 306 Norte,SQN 306,272-4414,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,322.000000,9.000000,156.000000,9.000000,0.000000,0.000000,0.000000,14.000000,1.000000,431.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190560.000000,8254320.000000
+71,71,53001621.000000,Escola Classe 308 Sul,SQS 308,242-6194,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,505.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188710.000000,8249570.000000
+72,72,53001630.000000,Escola Classe 312 Norte,SQN 312,340-1840,RA I - BRASILIA,Publica,Regular,6.000000,M  V,0.000000,0.000000,0.000000,0.000000,395.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189920.000000,8256400.000000
+73,73,53001648.000000,Escola Classe 314 Sul,SQS 314,346-4395,RA I - BRASILIA,Publica,Regular,9.000000,M  V,0.000000,0.000000,0.000000,0.000000,517.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186950.000000,8248060.000000
+74,74,53001656.000000,Escola Classe 315 Sul,SQS 315,245-1399,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,180.000000,6.000000,343.000000,27.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186670.000000,8247930.000000
+75,75,53001664.000000,Escola Classe 316 Norte,SQN 316,274-9055,RA I - BRASILIA,Publica,Inf/Reg,10.000000,M  V,0.000000,0.000000,49.000000,2.000000,516.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189510.000000,8257890.000000
+76,76,53001672.000000,Escola Classe 316 Sul,SQS 316,245-2158,RA I - BRASILIA,Publica,Regular,11.000000,M  V,0.000000,0.000000,0.000000,0.000000,663.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186350.000000,8247660.000000
+77,77,53001680.000000,Escola Classe 403 Norte,SQN 403,224-7501,RA I - BRASILIA,Publica,Regular,8.000000,M  V,0.000000,0.000000,0.000000,0.000000,265.000000,12.000000,0.000000,0.000000,0.000000,0.000000,14.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191750.000000,8253610.000000
+78,78,53001699.000000,Escola Classe 405 Norte,SQN 405,272-2303,RA I - BRASILIA,Publica,Reg/Supl,7.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,148.000000,8.000000,88.000000,8.000000,0.000000,0.000000,3.000000,0.000000,2.000000,250.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191650.000000,8254350.000000
+79,79,53001702.000000,Escola Classe 405 Sul,SQS 405,242-0735,RA I - BRASILIA,Publica,Regular,11.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,538.000000,37.000000,0.000000,0.000000,10.000000,3.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190075.000000,8249285.000000
+80,80,53001710.000000,Escola Classe 407 Norte,SQN 407,272-2053,RA I - BRASILIA,Publica,Inf/Reg/Supl,9.000000,M  V  N,0.000000,0.000000,24.000000,2.000000,229.000000,8.000000,0.000000,0.000000,0.000000,0.000000,1.000000,1.000000,2.000000,320.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191480.000000,8255280.000000
+81,81,53001729.000000,Escola Classe 409 Norte,SQN 410,272-4533,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,431.000000,24.000000,0.000000,0.000000,0.000000,0.000000,2.000000,206.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191130.000000,8256100.000000
+82,82,53001737.000000,Escola Classe 410 Sul,SQS 410,242-6092,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,351.000000,15.000000,0.000000,0.000000,0.000000,0.000000,27.000000,8.000000,3.000000,180.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188750.000000,8248090.000000
+83,83,53001745.000000,Escola Classe 411 Norte,SQN 411,273-4240,RA I - BRASILIA,Publica,Inf/Reg,13.000000,M  V,0.000000,0.000000,28.000000,1.000000,374.000000,10.000000,0.000000,0.000000,0.000000,0.000000,3.000000,3.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191070.000000,8256360.000000
+84,84,53001753.000000,Escola Classe 413 Sul,SQS 413,242-9686,RA I - BRASILIA,Publica,Reg/Supl,8.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,183.000000,5.000000,315.000000,27.000000,0.000000,0.000000,0.000000,1.000000,0.000000,161.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187900.000000,8247600.000000
+85,85,53001761.000000,Escola Classe 415 Norte,SQN 415,273-5860,RA I - BRASILIA,Publica,Inf/Reg,7.000000,M  V,0.000000,0.000000,146.000000,5.000000,180.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190605.000000,8257745.000000
+86,86,53001770.000000,Escola Classe 416 Sul,SQS 416,346-7277,RA I - BRASILIA,Publica,Inf/Reg,10.000000,M  V,0.000000,0.000000,96.000000,4.000000,286.000000,11.000000,0.000000,0.000000,0.000000,0.000000,12.000000,0.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186970.000000,8246890.000000
+87,87,53001788.000000,Escola Classe 708 Norte,SHCGN 707/708,274-5781,RA I - BRASILIA,Publica,Reg/Supl,9.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,341.000000,18.000000,0.000000,0.000000,0.000000,0.000000,10.000000,10.000000,6.000000,238.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190080.000000,8254620.000000
+88,88,53001796.000000,Escola Classe 711 Norte,SHCGN 711,273-0262,RA I - BRASILIA,Publica,Regular,10.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,392.000000,31.000000,0.000000,0.000000,36.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189680.000000,8255940.000000
+89,89,53001800.000000,Escola Classe do Setor Militar Urbano,Area Especial da QRO SMU,233-8362,RA I - BRASILIA,Publica,Inf/Reg,9.000000,M  V,0.000000,0.000000,26.000000,1.000000,176.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185860.000000,8253820.000000
+91,91,53001834.000000,Escola Normal de Brasilia,SGAS 907 Conjunto A,244-1893,RA I - BRASILIA,Publica,Inf/Reg/Supl,41.000000,M  V  N  I,0.000000,0.000000,331.000000,13.000000,669.000000,25.000000,0.000000,0.000000,549.000000,53.000000,23.000000,0.000000,5.000000,579.000000,28.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188350.000000,8250345.000000
+92,92,53001893.000000,Escola do Parque da Cidade,SGAS Q 909 Conjunto A  Fundos,243-1225,RA I - BRASILIA,Publica,Regular,14.000000,M  V  I,0.000000,0.000000,0.000000,0.000000,93.000000,14.000000,92.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187800.000000,8250050.000000
+93,93,53001966.000000,Escola da Acao Social do Planalto,SGAS Q 616 Modulos 116/117,346-7334,RA I - BRASILIA,Publica,Regular,5.000000,M  V,0.000000,0.000000,0.000000,0.000000,182.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187130.000000,8246640.000000
+94,94,53002148.000000,Escola Meninos e Meninas do Parque,Parque da Cidade - Estacionamento 06,322-7631,RA I - BRASILIA,Publica,Regular,5.000000,I,0.000000,0.000000,0.000000,0.000000,40.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186530.000000,8249880.000000
+95,95,53002210.000000,Jardim de Infancia 21 de Abril,Praca 21 de Abril  EQS 707/708,242-0390,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,191.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188580.000000,8249900.000000
+96,96,53002237.000000,Jardim de Infancia da 102 Sul,SQS 102,225-2838,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,160.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190350.000000,8250670.000000
+97,97,53002245.000000,Jardim de Infancia da 106 Norte,SQN 106,274-4760,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,302.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190970.000000,8254450.000000
+98,98,53002253.000000,Jardim de Infancia da 108 Sul,SQS 108,242-7933,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,221.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188790.000000,8249145.000000
+99,99,53002261.000000,Jardim de Infancia da 114 Sul,SQS 114,242-3242,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,235.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187040.000000,8247885.000000
+100,100,53002270.000000,Jardim de Infancia da 208 Sul,SQS 208,242-4551,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,264.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,5.000000,4.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189055.000000,8248800.000000
+101,101,53002288.000000,Jardim de Infancia da 302 Norte,SQN 302,226-5736,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,255.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190710.000000,8253080.000000
+102,102,53002296.000000,Jardim de Infancia da 303 Sul,SQS 303,226-7198,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,204.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189900.000000,8250755.000000
+103,103,53002300.000000,Jardim de Infancia da 304 Norte,SQN 304,224-5783,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,242.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190725.000000,8253740.000000
+104,104,53002318.000000,Jardim de Infancia da 305 Sul,SQS 305,243-0228,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,233.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189380.000000,8250140.000000
+105,105,53002326.000000,Jardim de Infancia da 308 Sul,SQS 308,243-2214,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,217.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188585.000000,8249490.000000
+106,106,53002334.000000,Jardim de Infancia da 312 Norte,SQN 312,273-6992,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,266.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189980.000000,8256450.000000
+107,107,53002342.000000,Jardim de Infancia da 314 Sul,SQS 314,245-5119,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,150.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186875.000000,8248160.000000
+108,108,53002350.000000,Jardim de Infancia da 316 Sul,SQS 316,245-1969,RA I - BRASILIA,Publica,Infantil,4.000000,M  V,0.000000,0.000000,243.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186390.000000,8247840.000000
+109,109,53002369.000000,Jardim de Infancia da 404 Norte,SQN 404,223-1803,RA I - BRASILIA,Publica,Infantil,5.000000,M  V,0.000000,0.000000,271.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191720.000000,8253840.000000
+463,463,53008774.000000,Centro de Ensino de 1o Grau 01 do Cruzeiro,SRES Lote 06,234-2463,RA XI - CRUZEIRO,Publica,Reg/Supl,35.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,418.000000,16.000000,577.000000,33.000000,0.000000,0.000000,0.000000,1.000000,0.000000,224.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185300.000000,8252710.000000
+464,464,53008782.000000,Centro de Ensino de 1o Grau 02 do Cruzeiro,SHCES Q 309 Lote 01,234-1464,RA XI - CRUZEIRO,Publica,Reg/Supl,25.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,724.000000,35.000000,0.000000,0.000000,8.000000,0.000000,1.000000,850.000000,27.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184780.000000,8251740.000000
+465,465,53008790.000000,Centro Educacional 01 do Cruzeiro,SRES Area Especial F Lote G,234-4492,RA XI - CRUZEIRO,Publica,Regular,15.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,333.000000,14.000000,775.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185045.000000,8252880.000000
+466,466,53008804.000000,Centro Educacional 02 do Cruzeiro,SHCES Q 805 Lote 02,234-4939,RA XI - CRUZEIRO,Publica,Reg/Supl,20.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,816.000000,41.000000,763.000000,33.000000,0.000000,1.000000,0.000000,336.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185100.000000,8251460.000000
+467,467,53008820.000000,Escola Classe 04 do Cruzeiro,SHCE-EQ 405/407 Lote 01,233-8885,RA XI - CRUZEIRO,Publica,Inf/Reg,8.000000,M  V,0.000000,0.000000,17.000000,1.000000,274.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184785.000000,8251470.000000
+468,468,53008839.000000,Escola Classe 05 do Cruzeiro,SHCES-EQ 201/203 Lote 01,233-8891,RA XI - CRUZEIRO,Publica,Inf/Reg,16.000000,M  V,0.000000,0.000000,65.000000,2.000000,440.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184540.000000,8251175.000000
+469,469,53008847.000000,Escola Classe 06 do Cruzeiro,SHCES Q 807,233-8680,RA XI - CRUZEIRO,Publica,Inf/Reg,15.000000,M  V,0.000000,0.000000,29.000000,1.000000,333.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185150.000000,8251660.000000
+470,470,53008855.000000,Escola Classe 08 do Cruzeiro,AOS 06/08 Lote 03,234-1656,RA XI - CRUZEIRO,Publica,Inf/Reg/Supl,20.000000,M  V  N,0.000000,0.000000,343.000000,12.000000,365.000000,13.000000,0.000000,0.000000,0.000000,0.000000,9.000000,0.000000,1.000000,285.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184370.000000,8250550.000000
+471,471,53008898.000000,Jardim de Infancia 01 do Cruzeiro,SRES Lote 05 Setor Educacional,233-1072,RA XI - CRUZEIRO,Publica,Infantil,18.000000,M  V,0.000000,0.000000,411.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,185375.000000,8252750.000000
+528,528,53009479.000000,Centro Educacional do Lago - CEL,SHIS QI 09 Conjunto 10 Lote H,248-0491,RA XVI - LAGO SUL,Publica,Reg/Supl,8.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,547.000000,27.000000,514.000000,28.000000,0.000000,0.000000,0.000000,444.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191820.000000,8246735.000000
+540,540,53009410.000000,Centro de Ensino de 1o Grau 01 do Lago Norte,SHIN QI 04/06 Area Especial,577-2528,RA XVIII  - LAGO NORTE,Publica,Inf/Reg/Supl,20.000000,M  V  N,0.000000,0.000000,28.000000,1.000000,342.000000,15.000000,809.000000,37.000000,0.000000,0.000000,0.000000,0.000000,0.000000,360.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,192010.000000,8258485.000000
+546,546,53000781.000000,Colegio Arvense - Centro de Ensino de 1o Grau,EQN 712/912 - Conj C,273-0958,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M V,119.000000,6.000000,160.000000,8.000000,177.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189350.000000,8256240.000000
+547,547,53000790.000000,Centro de Artes e Recreacoes Ursinho Feliz,EQS 112/312 - Lote C,244-2539,RA I - BRASILIA,Particular,Infantil,6.000000,M V,111.000000,5.000000,62.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187570.000000,8248430.000000
+548,548,53000803.000000,Centro Infantil Reino Encantado,EQS 204/404 - Lote C,223-7122,RA I - BRASILIA,Particular,Infantil,9.000000,M  V,187.000000,10.000000,157.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190280.000000,8249710.000000
+549,549,53000811.000000,Casa da Crianca Pao de Santo Antonio,SGAS 906 - Modulo 10,242-2337,RA I - BRASILIA,Particular,Infantil,8.000000,I V,79.000000,0.000000,53.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188560.000000,8250500.000000
+550,550,53000838.000000,Centro de Ensino Compacto Junior,EQN 212/412 - Area Especial,273-5091,RA I - BRASILIA,Particular,Inf/Reg,12.000000,M V,24.000000,2.000000,86.000000,6.000000,168.000000,8.000000,197.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190800.000000,8256780.000000
+551,551,53000900.000000,Centro de Ensino de 1o Grau Candanguinho,SEPS EQ 713/913 - Conj D,245-2004,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M V,218.000000,11.000000,350.000000,16.000000,396.000000,19.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187030.000000,8248900.000000
+552,552,53000935.000000,Centro de Ensino de 1o Grau Popeye,EQN 204/404 - Conj C,226-4750,RA I - BRASILIA,Particular,Inf/Reg,9.000000,M V,53.000000,4.000000,92.000000,6.000000,64.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191600.000000,8253950.000000
+553,553,53000943.000000,Viver Centro de Ensino,SHGCN 706 - Conj A - Blocos A/B,349-3434,RA I - BRASILIA,Particular,Inf/Reg,17.000000,M V,36.000000,4.000000,101.000000,8.000000,143.000000,9.000000,90.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190250.000000,8254300.000000
+554,554,53000951.000000,INEI Centro Educacional,SGAS 604 - Conj C - Lotes 25 e 26,226-9877,RA I - BRASILIA,Particular,Inf/Reg,38.000000,M V,95.000000,6.000000,286.000000,13.000000,535.000000,19.000000,488.000000,22.000000,143.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190720.000000,8249520.000000
+555,555,53000960.000000,Centro de Ensino Mauricio Salles de Mello,SHCGN 708 - Bloco C,272-1208,RA I - BRASILIA,Particular,Inf/Reg,22.000000,M V,50.000000,4.000000,145.000000,8.000000,284.000000,16.000000,286.000000,25.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189980.000000,8254760.000000
+556,556,53000226.000000,Centro de Ensino Tecnologico de Brasilia - CETEB,SGAS 910 - Conj D,243-8011,RA I - BRASILIA,Particular,Supletivo,19.000000,N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2684.000000,29.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187460.000000,8249930.000000
+557,557,53000293.000000,Centro Educacional Alfa,CRN 502 - Bloco B - No 68,321-4481,RA I - BRASILIA,Particular,Supletivo,4.000000,V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,168.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190570.000000,8253100.000000
+558,558,53000978.000000,Centro Educacional Alvorada,SGAN 916 - Modulo C/D,273-6181,RA I - BRASILIA,Particular,Regular,23.000000,M  V,0.000000,0.000000,25.000000,3.000000,88.000000,11.000000,138.000000,16.000000,242.000000,27.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188870.000000,8257600.000000
+559,559,53001001.000000,Centro Educacional Compacto Integral,SGAS 601 - Conj A,224-0528,RA I - BRASILIA,Particular,Reg/Supl,14.000000,M V N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,163.000000,13.000000,269.000000,16.000000,0.000000,0.000000,0.000000,652.000000,37.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191450.000000,8250470.000000
+560,560,53001028.000000,Centro Educacional do CEUB,SEPN 707/907 - Lote C - Bloco 6,340-1835,RA I - BRASILIA,Particular,Regular,42.000000,M V,0.000000,0.000000,82.000000,6.000000,265.000000,12.000000,658.000000,31.000000,373.000000,20.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189820.000000,8254750.000000
+561,561,53001052.000000,Centro Educacional Juscelino Kubitschek,SGAN 913 - Bloco A,347-6557,RA I - BRASILIA,Particular,Reg/Supl,16.000000,M  V  N,0.000000,0.000000,36.000000,3.000000,91.000000,10.000000,249.000000,17.000000,437.000000,14.000000,0.000000,0.000000,0.000000,321.000000,20.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189250.000000,8256450.000000
+562,562,53001060.000000,Centro Educacional La Salle,SGAS 906 - Conj D,242-7878,RA I - BRASILIA,Particular,Inf/Reg,32.000000,M V N,0.000000,0.000000,0.000000,0.000000,304.000000,17.000000,615.000000,33.000000,778.000000,45.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188660.000000,8250270.000000
+563,563,53001079.000000,Centro Educacional La Salle - Creche,EQS 705/905 - Lote A,244-7043,RA I - BRASILIA,Particular,Infantil,10.000000,M V,38.000000,4.000000,85.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189090.000000,8250560.000000
+564,564,53001087.000000,Centro Educacional Leonardo da Vinci,SEUPS 703 - Bloco 1 - Lote B,226-6703,RA I - BRASILIA,Particular,Regular,42.000000,M,0.000000,0.000000,0.000000,0.000000,89.000000,8.000000,355.000000,18.000000,711.000000,38.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189470.000000,8251060.000000
+565,565,53001095.000000,Centro Educacional Leonardo da Vinci,SGAN 914 - Conj I,340-1616,RA I - BRASILIA,Particular,Regular,58.000000,M,0.000000,0.000000,0.000000,0.000000,286.000000,14.000000,905.000000,29.000000,1083.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189040.000000,8257000.000000
+566,566,53001109.000000,Centro Educacional Maria Auxiliadora,SEPS 702 - Bloco C,224-5315,RA I - BRASILIA,Particular,Inf/Reg,29.000000,M V N,17.000000,1.000000,103.000000,6.000000,268.000000,8.000000,513.000000,47.000000,125.000000,16.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189800.000000,8251140.000000
+567,567,53001117.000000,Centro Educacional Nossa Senhora do Rosario,SGAS 908 - Lotes 23 e 24,243-7758,RA I - BRASILIA,Particular,Inf/Reg,16.000000,M V,16.000000,1.000000,74.000000,6.000000,158.000000,13.000000,202.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188100.000000,8249990.000000
+568,568,53001125.000000,Colegio Integrado Objetivo,SGAS 913 - Lotes 54/55,245-4544,RA I - BRASILIA,Particular,Regular,33.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1627.000000,46.000000,4087.000000,116.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186850.000000,8249120.000000
+569,569,53001141.000000,Colegio Integrado Objetivo,SGAS 914 - Lotes 67/68,245-2445,RA I - BRASILIA,Particular,Inf/Reg,37.000000,M  V,77.000000,3.000000,324.000000,14.000000,813.000000,29.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186440.000000,8248600.000000
+570,570,53001150.000000,Centro Educacional Planalto,SEUPS EQ 708/907 - Conjunto B,243-2769,RA I - BRASILIA,Particular,Inf/Reg,28.000000,M V,0.000000,0.000000,18.000000,1.000000,59.000000,4.000000,334.000000,18.000000,494.000000,29.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188400.000000,8250050.000000
+571,571,53001168.000000,Centro Educacional Projecao,SGAN 906 - Conj A,340-3106,RA I - BRASILIA,Particular,Inf/Reg,19.000000,M V,34.000000,3.000000,85.000000,4.000000,110.000000,10.000000,100.000000,9.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189870.000000,8254110.000000
+572,572,53000064.000000,Centro Educacional Projecao,SGAS 906 - Modulo A,244-6161,RA I - BRASILIA,Particular,Regular,6.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,146.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188650.000000,8250600.000000
+573,573,53001184.000000,Centro Educacional Rodolpho de Moraes Rego,SEUPS EQ 706/906 - Conjunto A,242-9087,RA I - BRASILIA,Particular,Regular,13.000000,M V,0.000000,0.000000,0.000000,0.000000,125.000000,14.000000,133.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188900.000000,8250370.000000
+574,574,53001192.000000,Centro Educacional Sagrada Familia,SGAN 906 - Modulo C/D,272-1727,RA I - BRASILIA,Particular,Inf/Reg,28.000000,M  V,28.000000,4.000000,117.000000,13.000000,335.000000,17.000000,402.000000,12.000000,128.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189900.000000,8254230.000000
+575,575,53001222.000000,Centro Educacional Sigma,SGAS 912 - Conjunto A,346-3232,RA I - BRASILIA,Particular,Regular,70.000000,M V,0.000000,0.000000,0.000000,0.000000,244.000000,9.000000,1429.000000,38.000000,2240.000000,48.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187290.000000,8249570.000000
+576,576,53001281.000000,Colegio Batista de Brasilia,SGAS 905 - Modulo 04,242-1898,RA I - BRASILIA,Particular,Inf/Reg,21.000000,M V,58.000000,4.000000,198.000000,7.000000,322.000000,21.000000,174.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8250630.000000
+577,577,53001290.000000,Colegio Cor Jesu,SGAS 615 - Conjunto G,346-5566,RA I - BRASILIA,Particular,Inf/Reg,20.000000,M  V,18.000000,2.000000,136.000000,7.000000,274.000000,12.000000,341.000000,23.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187350.000000,8246820.000000
+578,578,53001303.000000,Colegio Dom Bosco,SEPS 702 - Bloco A,223-2650,RA I - BRASILIA,Particular,Inf/Reg,30.000000,M V,0.000000,0.000000,31.000000,2.000000,294.000000,16.000000,697.000000,34.000000,300.000000,21.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189670.000000,8251110.000000
+579,579,53001311.000000,Colegio Imaculada Conceicao,SGAS 606 - Conjunto C,243-5259,RA I - BRASILIA,Particular,Inf/Reg,14.000000,M  V,24.000000,4.000000,90.000000,8.000000,190.000000,13.000000,314.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190100.000000,8248830.000000
+580,580,53001320.000000,Colegio Madre Carmen Salles,SGAN 604 - Conjunto D,223-2863,RA I - BRASILIA,Particular,Inf/Reg,29.000000,M  V,28.000000,2.000000,178.000000,10.000000,383.000000,15.000000,395.000000,13.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,192020.000000,8253930.000000
+581,581,53001338.000000,Colegio Marista de Brasilia-1o Grau,SGAS 609 - Conjunto A,242-1243,RA I - BRASILIA,Particular,Inf/Reg,38.000000,M  V,0.000000,0.000000,521.000000,18.000000,1059.000000,29.000000,1273.000000,46.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189290.000000,8248230.000000
+582,582,53001346.000000,Colegio Marista de Brasilia-2o Grau,SGAS 615 - Conjunto C,346-2288,RA I - BRASILIA,Particular,Regular,33.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1477.000000,61.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187520.000000,8246910.000000
+583,583,53001362.000000,Colegio Notre Dame,SGAS 914 - Lotes 63/64,245-2836,RA I - BRASILIA,Particular,Inf/Reg,22.000000,M  V,6.000000,0.000000,50.000000,6.000000,152.000000,12.000000,131.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186560.000000,8248700.000000
+584,584,53001370.000000,Colegio Pio XII,SGAS 609 - Conjunto C,242-1335,RA I - BRASILIA,Particular,Inf/Reg,24.000000,M  V,56.000000,4.000000,124.000000,7.000000,256.000000,10.000000,349.000000,23.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189150.000000,8248100.000000
+585,585,53001389.000000,Colegio Sagrado Coracao de Maria,SHCGN 702 - Conjunto C,321-8588,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M  V,27.000000,3.000000,105.000000,7.000000,247.000000,13.000000,284.000000,15.000000,31.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190300.000000,8253100.000000
+586,586,53001397.000000,Colegio Santa Rosa,SGAS 601 - Conjunto C - Lote 3,224-2966,RA I - BRASILIA,Particular,Inf/Reg,23.000000,M  V,26.000000,1.000000,233.000000,10.000000,531.000000,22.000000,507.000000,28.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191380.000000,8250300.000000
+587,587,53001400.000000,Colegio Santa Doroteia,SGAN 911 - Conjunto B,274-5110,RA I - BRASILIA,Particular,Inf/Reg,25.000000,M V,33.000000,3.000000,104.000000,9.000000,250.000000,15.000000,283.000000,18.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189180.000000,8255700.000000
+588,588,53001419.000000,Creche Fundacao Cabo Frio,SGAN 608 - Modulo A,274-5176,RA I - BRASILIA,Particular,Infantil,10.000000,I,186.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191700.000000,8255320.000000
+589,589,53001427.000000,Cresca Centro de Realizacao Criadora,SEUPS EQ 703/903 - Bloco C,224-1640,RA I - BRASILIA,Particular,Inf/Reg,15.000000,M V,28.000000,2.000000,104.000000,6.000000,159.000000,8.000000,110.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189340.000000,8250950.000000
+590,590,53001826.000000,Educandario Espirito Santo,SGAN 609 - Conjunto A/B,273-5089,RA I - BRASILIA,Particular,Infantil,6.000000,M V,104.000000,4.000000,172.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191620.000000,8255700.000000
+591,591,53001907.000000,Escola Adventista de Brasilia,SGAS 611 - Modulo 75,242-3847,RA I - BRASILIA,Particular,Inf/Reg,16.000000,M,0.000000,0.000000,54.000000,3.000000,131.000000,9.000000,215.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8247800.000000
+592,592,53001915.000000,Escola Americana de Brasilia,SGAS 605 - Bloco E - Lote 34,243-3237,RA I - BRASILIA,Particular,Inf/Reg,40.000000,I,0.000000,0.000000,157.000000,8.000000,183.000000,14.000000,225.000000,25.000000,170.000000,21.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190380.000000,8249150.000000
+593,593,53001923.000000,Escola Anjo da Guarda,SGAN 913 - Lote A,272-4851,RA I - BRASILIA,Particular,Infantil,5.000000,M  V,78.000000,4.000000,153.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189180.000000,8256470.000000
+594,594,53001931.000000,Centro Educacional Canarinho,SGAS 906 - Modulo 9,244-3950,RA I - BRASILIA,Particular,Inf/Reg,8.000000,M  V,42.000000,2.000000,102.000000,6.000000,95.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8250400.000000
+595,595,53001940.000000,Centro Educacional Canarinho,EQS 212/412 - Bloco C,243-2891,RA I - BRASILIA,Particular,Infantil,6.000000,M  V,81.000000,4.000000,138.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188020.000000,8247840.000000
+596,596,53001958.000000,Escola Cenecista Alzira Sodre,SGAN 608 - Modulo D,272-3233,RA I - BRASILIA,Particular,Infantil,12.000000,M V,154.000000,6.000000,113.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191700.000000,8255480.000000
+597,597,53001974.000000,Escola de 1o Grau Vicenta Maria,SGAS 606 - Conjunto A,243-2884,RA I - BRASILIA,Particular,Regular,4.000000,N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,99.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190240.000000,8249000.000000
+598,598,53001982.000000,Escola de 2o Grau Objetivo,SGAS 904 - Lotes A/C,225-7990,RA I - BRASILIA,Particular,Supletiv,18.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,781.000000,61.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189270.000000,8250810.000000
+599,599,53002008.000000,Escola Fundamental Alvacir Vite Rossi,SGAN 908 - Conjunto B,347-8486,RA I - BRASILIA,Particular,Regular,12.000000,M V,0.000000,0.000000,0.000000,0.000000,341.000000,17.000000,92.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189530.000000,8254860.000000
+600,600,53002016.000000,Escola Golfinho Dourado,EQN 116/316 - Bloco C,274-0635,RA I - BRASILIA,Particular,Infantil,11.000000,M V,95.000000,5.000000,116.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189630.000000,8257890.000000
+601,601,53002024.000000,Escola Logosofica Gonzalez Pecotche,SHCGN 704 - Area Especial,224-9205,RA I - BRASILIA,Particular,Inf/Reg,10.000000,M V,50.000000,4.000000,73.000000,5.000000,88.000000,6.000000,81.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190310.000000,8253690.000000
+602,602,53002032.000000,Escola Maternal e Jardim de Infancia Branca de Neve,SEUPS EQ 706/906 - Conjunto A,242-9087,RA I - BRASILIA,Particular,Infantil,6.000000,M V,82.000000,5.000000,122.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188930.000000,8250380.000000
+603,603,53002040.000000,Escola Moderna Maria Montessori,SGAS 912 - Lotes 50/52,346-2733,RA I - BRASILIA,Particular,Infantil,19.000000,M V,157.000000,7.000000,213.000000,12.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186850.000000,8249440.000000
+604,604,53002059.000000,Escola Monteiro Lobato de 1o Grau,SHCGN 713 - Area Especial,273-1270,RA I - BRASILIA,Particular,Inf/Reg,20.000000,M V,20.000000,2.000000,60.000000,6.000000,99.000000,7.000000,100.000000,8.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189460.000000,8256590.000000
+605,605,53002067.000000,Escola Nossa Senhora de Fatima,SGAS 906 - Conjunto F,243-8646,RA I - BRASILIA,Particular,Inf/Reg,18.000000,M,9.000000,1.000000,18.000000,2.000000,42.000000,4.000000,119.000000,10.000000,210.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188560.000000,8250380.000000
+606,606,53002075.000000,Escola Paroquial Santo Antonio,SGAS 911 - Conjunto B,242-7299,RA I - BRASILIA,Particular,Inf/Reg,33.000000,M  V,60.000000,2.000000,425.000000,17.000000,823.000000,35.000000,803.000000,40.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,187460.000000,8249630.000000
+607,607,53002083.000000,Escola Pedacinho do Ceu,EQN 108/308 - Lote C,274-1311,RA I - BRASILIA,Particular,Infantil,9.000000,M V,149.000000,7.000000,95.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,190530.000000,8255180.000000
+608,608,53002091.000000,Escola Positiva de Brasilia,SGAN 905 - Modulo A,274-8261,RA I - BRASILIA,Particular,Inf/Reg,9.000000,M V,23.000000,2.000000,25.000000,3.000000,16.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189990.000000,8253920.000000
+609,609,53002105.000000,Escola Sao Camilo,SGAN 914 - Conjunto G,349-4308,RA I - BRASILIA,Particular,Inf/Reg,9.000000,M V I,120.000000,4.000000,158.000000,8.000000,145.000000,10.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189020.000000,8256900.000000
+610,610,53002113.000000,Escola Sao Carlos,SGAS 905 - Lotes 1/2,242-9088,RA I - BRASILIA,Particular,Inf/Reg,16.000000,M  V,28.000000,2.000000,147.000000,6.000000,268.000000,10.000000,315.000000,24.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188950.000000,8250820.000000
+611,611,53002130.000000,Escola Tecnica de Saude Golden Garden,SGAS 611 - Conjunto D,244-9664,RA I - BRASILIA,Particular,Regular,2.000000,M,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,22.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188820.000000,8247790.000000
+612,612,53002164.000000,INEI Centro Educacional,SGAN 605 - Modulo A,349-1088,RA I - BRASILIA,Particular,Inf/Reg,38.000000,M  V,85.000000,3.000000,313.000000,12.000000,523.000000,20.000000,515.000000,21.000000,161.000000,14.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191910.000000,8254500.000000
+613,613,53002172.000000,Instituto de Educacao de Brasilia - IEB,SHCGN 712 - Conj B - Area Especial,274-6575,RA I - BRASILIA,Particular,Inf/Reg,8.000000,V,19.000000,1.000000,42.000000,3.000000,43.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189550.000000,8256160.000000
+614,614,53002180.000000,Escola Educacional Filantropica,SGAS 611 - Modulo 77,244-4087,RA I - BRASILIA,Particular,Infantil,5.000000,M V,72.000000,5.000000,41.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188800.000000,8247700.000000
+615,615,53002199.000000,Instituto Nossa Senhora do Carmo,SGAS 913 - Bloco C,346-6700,RA I - BRASILIA,Particular,Inf/Reg,15.000000,M V,35.000000,3.000000,56.000000,7.000000,140.000000,13.000000,171.000000,15.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186970.000000,8249260.000000
+616,616,53002202.000000,Sociedade Educacional Saci Perere,SEUPS EQ 708/907 - Modulo D,243-4741,RA I - BRASILIA,Particular,Inf/Reg,15.000000,M,15.000000,2.000000,36.000000,3.000000,79.000000,4.000000,86.000000,10.000000,18.000000,11.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188280.000000,8249990.000000
+617,617,53002377.000000,Escola Meu Pequeno Mundo,EQS 216/416 - Bloco C,245-5333,RA I - BRASILIA,Particular,Infantil,7.000000,M V,81.000000,2.000000,58.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186880.000000,8246950.000000
+618,618,53002385.000000,Centro de Ensino Juscelino Kubitschek,SGAN 906 - Bloco F,273-5544,RA I - BRASILIA,Particular,Inf/Reg/Esp,25.000000,M  V,108.000000,4.000000,85.000000,4.000000,68.000000,7.000000,81.000000,9.000000,0.000000,0.000000,5.000000,0.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189860.000000,8254370.000000
+619,619,53002393.000000,Associacao Educacional Sol Nascente,SGAS 610 - Bloco D - Modulo 71,244-3634,RA I - BRASILIA,Particular,Infantil,6.000000,M V,52.000000,3.000000,70.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189000.000000,8247930.000000
+620,620,53002407.000000,Pre-Escola Menino de Deus,SGAN 915 - Conjunto C,273-7202,RA I - BRASILIA,Particular,Infantil,4.000000,M V,9.000000,1.000000,39.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188990.000000,8257180.000000
+621,621,53002415.000000,Renascer Creche Maternal e Jardim de Infancia,EQS 116/316 - Bloco C - Area Especial,245-1820,RA I - BRASILIA,Particular,Inf/Esp,9.000000,M V,110.000000,0.000000,20.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,15.000000,0.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186410.000000,8247550.000000
+622,622,53002423.000000,Sociedade Sibipiruna,SHCGN 715 - Area Especial - Bloco A,273-1144,RA I - BRASILIA,Particular,Infantil,5.000000,M V,55.000000,4.000000,75.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189300.000000,8257330.000000
+623,623,0.000000,Escola Batista IBAN,EQN 313/314 - Area Especial - Lote A,349-2428,RA I - BRASILIA,Particular,Infantil,6.000000,M V,27.000000,4.000000,27.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189870.000000,8256970.000000
+624,624,0.000000,Creche Maternal e Pre-Escola Marly Sarney,SGAS 914 - Conjunto 63 - Lote A,245-3225,RA I - BRASILIA,Particular,Infantil,2.000000,M V,3.000000,1.000000,5.000000,1.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,186510.000000,8248820.000000
+625,625,0.000000,Centro de Ensino de 1o Grau Renascenca,SGAN 914 - Conjunto B,273-6284,RA I - BRASILIA,Particular,Inf/Reg,8.000000,M V,33.000000,2.000000,44.000000,4.000000,18.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188925.000000,8256730.000000
+626,626,0.000000,Pimentinhas Escola de Educacao Infantil,EQS 104/304 - Lote C,225-7215,RA I - BRASILIA,Particular,Infantil,6.000000,M V,50.000000,3.000000,27.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189715.000000,8250215.000000
+627,627,53000013.000000,Assoc Maes Pais Amigos e Reabilitad Excepcionais - AMPARE,SHCGN 709 - Area Especial C,274-9561,RA I - BRASILIA,Conveniada,Especial,15.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,120.000000,0.000000,17.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189920.000000,8255210.000000
+628,628,53000030.000000,Assistencia de Pais e Amigos dos Excepcionais - APAE/DF,CRS 508 - Bloco C - Salas 10 a 16,244-1083,RA I - BRASILIA,Conveniada,Especial,7.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,68.000000,0.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188460.000000,8249560.000000
+629,629,0.000000,Associacao de Pais e Amigos do Excepcionais - APAE/DF,EQN 711/911 - Lote E,347-0460,RA I - BRASILIA,Conveniada,Especial,4.000000,M V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,30.000000,0.000000,6.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189470.000000,8255940.000000
+630,630,53000102.000000,Sociedade Pestalozi de Brasilia,Avenida das Nacoes - Trecho 03 - Lote 04,226-0101,RA I - BRASILIA,Conveniada,Especial,10.000000,I,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,108.000000,0.000000,19.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,194100.000000,8250250.000000
+631,631,53000331.000000,Centro Educacional de Audicao e Linguagem - CEAL,SGAN 909 - Conjunto B,272-2602,RA I - BRASILIA,Conveniada,Especial,40.000000,M V I,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,283.000000,0.000000,51.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189580.000000,8255120.000000
+632,632,53000820.000000,Casa de Ismael - Lar Primeira Luz,SGAN 914 - Conjunto C,273-2268,RA I - BRASILIA,Conveniada,Infantil,2.000000,M,20.000000,1.000000,53.000000,2.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189110.000000,8256700.000000
+634,634,53002158.000000,Grupo da Fraternidade Cicero Pereira - CAMEGE,SGAN 915 - Modulo E,273-6803,RA I - BRASILIA,Conveniada,Infantil,2.000000,M V I,96.000000,0.000000,61.000000,3.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,188900.000000,8257280.000000
+635,635,53002229.000000,Jardim de Infancia Casa do Candango,SGAS 603 - Conjunto A,223-3516,RA I - BRASILIA,Conveniada,Infantil,12.000000,M I,350.000000,5.000000,130.000000,5.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,191020.000000,8249860.000000
+636,636,0.000000,Creche Acao Social Paula Frassinetti,SGAN 911 - Conjunto B-1,274-0823,RA I - BRASILIA,ENG,Inf/Reg,7.000000,I V,30.000000,4.000000,65.000000,6.000000,45.000000,6.000000,10.000000,4.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,189105.000000,8255680.000000
+637,637,53001257.000000,Centro de Linguas - CIL,SGAS 908 Modulo 25/26,244-8881,RA I - BRASILIA,Publica,Linguas,26.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,6073.000000,53.000000,0.000000,0.000000,0.000000,0.000000,188220.000000,8250115.000000
+638,638,53001842.000000,Escola Parque 210/211 Norte,EQN 210/211,273-2371,RA I - BRASILIA,Publica,Esc Parque,15.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1247.000000,51.000000,0.000000,0.000000,0.000000,0.000000,190900.000000,8256180.000000
+639,639,53001850.000000,Escola Parque 210/211 Sul,EQS 210/211,244-3659,RA I - BRASILIA,Publica,Esc Parque,19.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,1275.000000,44.000000,0.000000,0.000000,0.000000,0.000000,188480.000000,8248280.000000
+640,640,53001869.000000,Escola Parque 303/304 Norte,EQN 303/304,224-2179,RA I - BRASILIA,Publica,Esc Parque,27.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2211.000000,67.000000,0.000000,0.000000,0.000000,0.000000,190660.000000,8253590.000000
+641,641,53001877.000000,Escola Parque 308 Sul,EQS 307/308,242-0273,RA I - BRASILIA,Publica,Esc Parque,21.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2493.000000,58.000000,0.000000,0.000000,0.000000,0.000000,188790.000000,8249625.000000
+642,642,53001885.000000,Escola Parque 313/314 Sul,EQS 313/314,245-4582,RA I - BRASILIA,Publica,Esc Parque,29.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2695.000000,64.000000,0.000000,0.000000,0.000000,0.000000,187060.000000,8248325.000000
+643,643,53001990.000000,Escola de Musica de Brasilia,SGAS 602 Conjunto D,225-5075,RA I - BRASILIA,Publica,Musica,74.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2049.000000,150.000000,0.000000,0.000000,191305.000000,8250150.000000
+644,644,53002121.000000,Escola Tecnica de Saude de Brasilia,SHN 501 Bloco A,325-4944,RA I - BRASILIA,Publica,Tecnica,7.000000,M  V,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,137.000000,15.000000,190610.000000,8252810.000000
+645,645,0.000000,SENAI - Centro de Treinamento/CETRES,SIG Qd 06 Lote 1100,344-2106,RA I - BRASILIA,Particular,Profissionaliza,16.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,12230.000000,0.000000,187830.000000,8251650.000000
+646,646,53001206.000000,Centro Educ Setor Leste - Setorial de Linguas - SEL,SGAS 611/612 Conjunto E,243-8263,RA I - BRASILIA,Publica,Linguas,26.000000,M  V  N,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,2408.000000,32.000000,0.000000,0.000000,0.000000,0.000000,188630.000000,8247690.000000
+830,830,53008812.000000,Centro Educacional Ciman,Q 501 - Conj D - Lote 2,233-8897,RA XI - CRUZEIRO,Particular,Regular,16.000000,M V,0.000000,0.000000,0.000000,0.000000,438.000000,20.000000,532.000000,21.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184740.000000,8251050.000000
+831,831,53008863.000000,Escola Mundo Magico,Q 801 - Lote 1 - Bloco F,233-3938,RA XI - CRUZEIRO,Particular,Inf/Reg,11.000000,M V,38.000000,2.000000,230.000000,7.000000,211.000000,7.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,184950.000000,8251040.000000
\ No newline at end of file
diff --git a/examples/data/Distritos.mid b/examples/data/Distritos.mid
new file mode 100644
index 0000000..7b7d1d4
--- /dev/null
+++ b/examples/data/Distritos.mid
@@ -0,0 +1,96 @@
+�GUA RASA;1;ARA;6.9;LESTE;95099;85896;45905;39991;0
+ALTO DE PINHEIROS;2;API;7.7;OESTE;50351;44454;24579;19875;1
+ANHANGUERA;3;ANH;33.3;NORTE;12408;38427;19267;19160;2
+ARICANDUVA;4;ARI;6.6;LESTE;193024;94813;49498;45315;3
+ARTUR ALVIM;5;AAL;6.6;LESTE;117321;111210;58607;52603;4
+BARRA FUNDA;6;BFU;5.6;NORTE;15977;12965;7244;5721;5
+BELA VISTA;7;BVI;2.6;SUDESTE;71825;63190;34809;28381;6
+BELEM;8;BEL;6.0;LESTE;48389;39622;21551;18071;7
+BOM RETIRO;9;BRE;5.0;CENTRO;36136;26598;13961;12637;8
+BR�S;10;BRS;3.5;CENTRO;33536;25158;12829;12329;9
+BRASIL�NDIA;11;BRL;21.0;NORTE;201307;247328;127603;119725;10
+BUTANT�;12;BUT;12.5;OESTE;58019;52649;28198;24451;11
+CACHOEIRINHA;13;CAC;13.3;NORTE;125852;147649;76447;71202;12
+CAMBUCI;14;CMB;3.9;SUDESTE;37069;28717;15674;13043;13
+CAMPO BELO;15;CBE;8.9;SUL;77952;66646;36101;30545;14
+CAMPO GRANDE;16;CGR;13.1;SUL;82052;91373;48339;43034;15
+CAMPO LIMPO;17;CLM;12.0;OESTE;159471;191527;99047;92480;16
+CANGA�BA;18;CNG;16.0;LESTE;115070;137442;71699;65743;17
+CAP�O REDONDO;19;CRE;13.6;OESTE;192489;240793;124539;116254;18
+CARR�O;20;CAR;7.5;LESTE;87336;78175;41590;36585;19
+CASA VERDE;21;CVE;7.1;NORTE;96396;83629;44798;38831;20
+CIDADE ADEMAR;22;CAD;12.0;SUL;230794;243372;126923;116449;21
+CIDADE DUTRA;23;CDU;29.3;SUL;169379;191389;99375;92014;22
+CIDADE L�DER;24;CLD;10.2;LESTE;97370;116841;59902;56939;23
+CIDADE TIRADENTES;25;CTI;15.0;LESTE;192562;190657;99131;91526;24
+CONSOLA��O;26;CON;3.7;CENTRO;65570;54522;30892;23630;25
+CURSINO;27;CUR;12.8;SUDESTE;110435;102089;54699;47390;26
+FREGUESIA DO �;29;FRE;10.5;NORTE;152672;144923;76020;68903;27
+GUAIANAZES;31;GUA;9.9;LESTE;81373;98546;50354;48192;28
+IGUATEMI;33;IGU;19.6;LESTE;59820;101780;51373;50407;29
+ITAIM BIBI;35;IBI;9.9;SUL;107497;81456;45560;35896;30
+ITAIM PAULISTA;36;IPA;12.0;LESTE;163269;212733;109106;103627;31
+ITAQUERA;37;ITQ;14.8;LESTE;175126;201512;104214;97298;32
+JABAQUARA;38;JAB;14.1;SUDESTE;214350;214095;113456;100639;33
+JACAN�;39;JAC;7.8;NORTE;86830;91809;48032;43777;34
+JAGUARA;40;JAG;4.6;NORTE;29798;25713;13400;12313;35
+JARAGU�;42;JAR;27.6;NORTE;93185;145900;74751;71149;36
+JARDIM �NGELA;43;JDA;37.4;SUL;177913;245805;125254;120551;37
+JARDIM PAULISTA;45;JDP;6.1;SUL;103138;83667;48148;35519;38
+JARDIM S�O LUIS;46;JDS;24.7;SUL;204284;239161;123372;115789;39
+JOSE BONIF�CIO;47;JBO;14.1;LESTE;103712;107082;56312;50770;40
+LAGEADO;96;LAJ;9.2;LESTE;112807;107082;50770;56312;41
+LAPA;48;LAP;10.0;OESTE;70319;60184;33030;27154;42
+LIBERDADE;49;LIB;3.7;SUDESTE;76245;61875;34043;27832;43
+LIM�O;50;LIM;6.3;NORTE;89478;82045;43375;38670;44
+MANDAQUI;51;MAN;13.1;NORTE;104022;103113;54385;48728;45
+MOEMA;32;MOE;9.0;SUL;77340;71276;39556;31720;46
+MO�CA;53;MOO;7.7;LESTE;71999;63280;34474;28806;47
+MORUMBI;54;MOR;11.4;OESTE;78892;34588;18560;16028;48
+PARI;56;PRI;2.9;CENTRO;21299;14824;7939;6885;49
+PARQUE DO CARMO;57;PQC;15.4;LESTE;54743;64067;32664;31403;50
+PENHA;59;PEN;11.3;LESTE;133006;124292;66160;58132;51
+PERDIZES;60;PRD;6.1;NORTE;108840;102445;56415;46030;52
+PINHEIROS;62;PIN;8.0;OESTE;78644;62997;35570;27427;53
+PIRITUBA;63;PIR;17.1;NORTE;151464;161796;84539;77257;54
+PONTE RASA;64;PRA;6.4;LESTE;102702;98113;51263;46850;55
+REP�BLICA;66;REP;2.3;CENTRO;57797;47718;24353;23365;56
+SANTA CEC�LIA;69;SCE;3.9;CENTRO;85829;71179;39425;31754;57
+SANTANA;70;STN;12.6;NORTE;137679;124654;63170;61484;58
+SANTO AMARO;71;SAM;15.6;SUL;75556;60539;32692;27847;59
+S�O DOMINGOS;95;SDO;10.0;NORTE;70386;82834;42850;39984;60
+S�O LUCAS;72;SLU;9.9;LESTE;152036;139333;72733;66600;61
+S�O MATEUS;73;SMT;13.0;LESTE;150764;154850;79361;75489;62
+S�O MIGUEL;74;SMI;7.6;LESTE;102964;97373;50677;46696;63
+S�O RAFAEL;75;SRA;13.2;LESTE;89862;125088;63274;61814;64
+SA�DE;77;SAU;8.9;SUDESTE;126596;118077;65008;53069;65
+S�;78;SEE;2.1;CENTRO;27186;20115;10566;9549;66
+SOCORRO;79;SOC;12.5;SUL;43194;39097;20836;18261;67
+TATUAP�;80;TAT;8.2;LESTE;81840;79381;42860;36521;68
+TREMEMB�;81;TRE;18.3;NORTE;125075;163803;84384;79419;69
+TUCURUVI;82;TUC;9.0;NORTE;223768;99368;53627;45741;70
+VILA ANDRADE;83;VAN;10.3;OESTE;42576;73649;37694;35955;71
+VILA CURU��;84;VCR;9.7;LESTE;122367;146482;75121;71361;72
+VILA FORMOSA;85;VFO;7.4;LESTE;97940;93850;49468;44382;73
+VILA GUILHERME;86;VGL;6.9;NORTE;62648;49984;26729;23255;74
+VILA JACU�;87;VJA;7.7;LESTE;100589;141959;72844;69115;75
+VILA LEOPOLDINA;88;VLE;8.0;OESTE;26827;26870;14266;12604;76
+VILA MARIA;89;VMR;11.8;LESTE;122662;113845;59702;54143;77
+VILA MARIANA;90;VMN;8.6;SUDESTE;132822;123683;69168;54515;78
+VILA MATILDE;91;VMT;8.9;LESTE;109023;102935;54454;48481;79
+VILA MEDEIROS;92;VMD;7.7;NORTE;156140;140564;74109;66455;80
+VILA S�NIA;94;VSO;9.9;OESTE;83006;87379;45461;41918;81
+PARELHEIROS;55;PLH;153.5;SUL;55594;102836;51611;51225;82
+GRAJA�;30;GRA;92.0;SUL;192838;333436;170271;163165;83
+PEDREIRA;58;PDR;16.7;SUL;86001;127425;65405;62020;84
+SACOM�;68;SAC;14.2;SUDESTE;207834;228283;118795;109488;85
+IPIRANGA;34;IPI;10.5;SUDESTE;101396;98863;53194;45669;86
+VILA PRUDENTE;93;VPR;9.9;LESTE;114297;102104;53998;48106;87
+SAPOPEMBA;76;SAP;13.5;LESTE;256081;282239;145198;137041;88
+JARDIM HELENA;44;JDH;9.1;LESTE;118381;139106;70891;68215;89
+ERMELINO MATARAZZO;28;ERM;8.7;LESTE;95609;106838;54926;51912;90
+PERUS;61;PRS;23.9;NORTE;46301;70689;35791;34898;91
+JAGUAR�;41;JRE;6.6;OESTE;44361;42479;22105;20374;92
+RIO PEQUENO;67;RPE;9.7;OESTE;102843;111756;58200;53556;93
+RAPOSO TAVARES;65;RTA;12.6;OESTE;82890;91204;47329;43875;94
+MARSILAC;52;MAR;200.0;SUL;5992;8404;4124;4280;95
diff --git a/examples/data/Distritos.mif b/examples/data/Distritos.mif
new file mode 100644
index 0000000..4e046b8
--- /dev/null
+++ b/examples/data/Distritos.mif
@@ -0,0 +1,41096 @@
+Version 300
+Charset "WindowsLatin1" 
+Delimiter ";"
+CoordSys Earth Projection 8, 92, Meters, -45.000000, 0.000000, 0.999600, 500000.000000, 10000000.000000
+Columns 10
+  Nome_Distrito Char(45)
+  Numero_Distrito Integer
+  Sigla Char(3)
+  area_km2 Float
+  Zona Char(10)
+  Pop91 Integer
+  Pop2000 Integer
+  Pop_2000_Fem Integer
+  Pop_2000_Masc Integer
+  object_id_ Char(16)
+Data
+Region 1
+206
+340033.474470  7391306.215632 
+340012.347627  7391313.834327 
+339993.645176  7391324.162558 
+339911.718874  7391363.115885 
+339895.242905  7391373.284144 
+339879.138017  7391377.113488 
+339857.681325  7391387.121773 
+339823.781070  7391399.099722 
+339810.092328  7391401.609292 
+339778.418556  7391409.417954 
+339765.274064  7391416.036820 
+339692.797943  7391432.763955 
+339637.490474  7391445.661746 
+339619.711601  7391449.231135 
+339601.338999  7391454.250275 
+339569.401347  7391463.448699 
+339484.621850  7391505.761451 
+339435.969090  7391532.706836 
+339292.426953  7391612.743126 
+339206.097164  7391660.874882 
+339194.783335  7391653.956067 
+339180.204000  7391649.636807 
+339168.708754  7391647.037252 
+339159.530699  7391645.927442 
+339148.101424  7391647.127237 
+339135.657862  7391649.116896 
+339127.048797  7391651.286524 
+339117.112089  7391650.696625 
+339101.576190  7391694.589107 
+339069.333429  7391757.288367 
+339035.828993  7391822.027278 
+339008.591694  7391850.402418 
+338959.435913  7391833.135375 
+338859.796708  7391855.181599 
+338844.450473  7391879.787384 
+338850.453729  7391938.547319 
+338869.156180  7391987.728895 
+338866.781265  7391999.996793 
+338828.098197  7392039.789977 
+338804.027450  7392059.256643 
+338782.950084  7392069.554879 
+338762.573649  7392072.234420 
+338742.691986  7392073.124267 
+338725.680013  7392087.161863 
+338679.402166  7392129.174666 
+338636.868109  7392167.808049 
+338611.337778  7392195.423319 
+338590.631493  7392219.939119 
+338588.446242  7392233.416811 
+338591.406639  7392251.953635 
+338608.542306  7392270.010542 
+338625.686220  7392297.625812 
+338645.774038  7392319.961986 
+338647.472761  7392340.268508 
+338651.101103  7392378.112026 
+338650.721776  7392394.879154 
+338648.429324  7392425.653882 
+338642.970319  7392475.225391 
+338640.636636  7392502.430731 
+338638.302953  7392527.856376 
+338630.328848  7392550.272536 
+338614.157989  7392569.429255 
+338596.461578  7392587.576146 
+338571.887811  7392607.052810 
+338549.342616  7392625.749608 
+338527.531336  7392640.367104 
+338509.002056  7392650.145429 
+338454.939768  7392650.485371 
+338366.498944  7392656.654314 
+338266.851493  7392663.903072 
+338213.061331  7392665.772752 
+338185.807538  7392671.281808 
+338172.918680  7392684.829488 
+338059.780395  7392788.461736 
+338033.169809  7392808.448313 
+337956.562326  7392880.925898 
+337952.950477  7392884.175342 
+337924.591690  7392908.251218 
+337872.277603  7392965.751368 
+337794.969191  7393053.906268 
+337870.941714  7393206.140192 
+337913.327339  7393305.983090 
+337963.357220  7393405.266083 
+338013.337624  7393505.148974 
+338032.147277  7393552.460870 
+338055.014074  7393603.382148 
+338068.744048  7393629.967594 
+338096.740001  7393684.928180 
+338118.048261  7393733.839802 
+338133.946994  7393769.363717 
+338145.565933  7393793.629560 
+338164.425062  7393824.564261 
+338173.025881  7393846.050581 
+338195.068055  7393889.113205 
+338228.861109  7393967.659750 
+338244.372268  7393992.205546 
+338255.941730  7394018.121107 
+338291.515969  7394089.498881 
+338299.762200  7394106.375990 
+338341.290217  7394195.380744 
+338375.371889  7394264.068978 
+338379.956793  7394260.299624 
+338450.890869  7394334.326944 
+338477.682872  7394362.092188 
+338524.076166  7394411.433736 
+338581.041127  7394473.103173 
+338732.722294  7394630.786163 
+338703.233773  7394679.957740 
+338878.911470  7394746.326372 
+338898.372575  7394704.243580 
+338914.988730  7394670.809307 
+338945.392582  7394607.430164 
+338966.346254  7394570.906420 
+338992.222926  7394521.914812 
+339009.193668  7394491.919949 
+339072.796845  7394480.731866 
+339092.612538  7394476.732551 
+339121.993858  7394465.194527 
+339143.351595  7394457.755801 
+339194.436994  7394442.618394 
+339223.389510  7394437.569259 
+339266.410095  7394431.900230 
+339307.138228  7394428.490814 
+339339.867517  7394425.761282 
+339380.166847  7394428.840754 
+339414.372211  7394432.620107 
+339455.421947  7394436.859381 
+339502.153337  7394444.198124 
+339538.997495  7394449.917144 
+339652.523352  7394477.022501 
+339656.077478  7394459.105570 
+339660.357272  7394446.937655 
+339665.370980  7394438.969019 
+339671.118603  7394432.540121 
+339678.391778  7394428.030893 
+339686.398868  7394425.061402 
+339775.491144  7394413.353407 
+339778.327847  7394391.237196 
+339827.318703  7394352.403847 
+339856.749501  7394334.366937 
+339885.767986  7394319.769437 
+339882.527218  7394296.453431 
+339836.397803  7394115.384447 
+339825.323116  7394072.121857 
+339808.203941  7393973.528745 
+339809.416137  7393955.591818 
+339829.306045  7393935.785210 
+339901.798659  7393848.930088 
+339915.330723  7393820.904888 
+340000.003019  7393776.762449 
+340020.832998  7393761.385083 
+340045.489228  7393738.718966 
+340075.414799  7393698.095924 
+340111.582766  7393633.656962 
+340173.503712  7393536.723566 
+340234.418618  7393440.999963 
+340270.809234  7393407.775654 
+340517.618917  7393270.919096 
+340560.969352  7393251.682391 
+340739.904310  7393151.469556 
+340793.702719  7393122.994434 
+340909.191179  7393058.125545 
+340970.106085  7393032.809882 
+340997.805174  7393027.290827 
+341148.851381  7392950.893913 
+341193.183117  7392919.689258 
+341232.938195  7392879.106210 
+341288.905362  7392823.975653 
+341372.761281  7392736.960558 
+341418.643309  7392686.329231 
+341395.710541  7392635.917866 
+341367.912498  7392566.179811 
+341279.966448  7392352.756369 
+341216.915768  7392201.412293 
+341160.470320  7392061.576245 
+341128.862518  7392071.784497 
+341119.618493  7391981.869898 
+341114.876910  7391946.275995 
+341113.219418  7391926.309415 
+341092.612088  7391744.560547 
+341093.214062  7391743.520725 
+341085.932641  7391678.021945 
+341078.148199  7391636.499057 
+341072.103712  7391551.963537 
+341067.032280  7391500.942277 
+341059.379778  7391432.014084 
+341046.804276  7391322.802791 
+340930.705595  7391331.491302 
+340843.542937  7391339.929857 
+340804.777407  7391332.021212 
+340725.349713  7391314.904144 
+340691.870017  7391304.655899 
+340626.164051  7391286.219057 
+340596.609560  7391278.570367 
+340568.176557  7391268.302126 
+340506.552476  7391251.325034 
+340460.282875  7391247.605671 
+340414.392602  7391248.615498 
+340392.836955  7391248.555508 
+340355.910334  7391249.165404 
+340330.248064  7391250.525171 
+340254.992963  7391252.514830 
+340175.441576  7391262.863058 
+340113.042349  7391276.630699 
+340084.815502  7391280.939961 
+340033.474470  7391306.215632 
+Region 1
+182
+327045.149934  7394665.260258 
+327016.642715  7394577.715254 
+326971.403894  7394423.951592 
+326964.427583  7394388.167721 
+326953.509573  7394311.250896 
+326935.969841  7394231.564546 
+326927.418499  7394217.376976 
+326904.246591  7394172.224710 
+326882.756914  7394133.421357 
+326868.161086  7394100.696962 
+326846.176635  7394067.232695 
+326833.122852  7394039.837387 
+326814.906929  7394014.861665 
+326810.552919  7394000.004210 
+326805.357793  7393990.285875 
+326784.610277  7393958.321350 
+326780.891227  7393937.194969 
+326779.349182  7393876.285402 
+326706.427764  7393787.630588 
+326666.540747  7393736.559336 
+326632.112734  7393667.511163 
+326618.539438  7393624.818476 
+326595.854058  7393602.352324 
+326524.260283  7393533.014201 
+326480.926341  7393492.151201 
+326461.143634  7393476.623860 
+326398.282618  7393417.953910 
+326332.131355  7393354.704744 
+326265.213194  7393290.935667 
+326194.237886  7393224.866984 
+326105.557922  7393133.352660 
+326011.122089  7393067.323970 
+325992.543331  7393100.888221 
+325962.436343  7393151.369574 
+325908.184392  7393223.127282 
+325824.015115  7393303.113581 
+325739.614945  7393385.629447 
+325557.678358  7393478.933465 
+325401.313332  7393585.165268 
+325328.342437  7393628.687813 
+325304.519077  7393642.815393 
+325259.024623  7393666.531331 
+325104.440783  7393743.658120 
+324955.085053  7393817.965392 
+324801.466023  7393898.641573 
+324528.853884  7394033.938398 
+324464.236420  7394066.272859 
+324355.410914  7394115.694393 
+324226.274943  7394180.713256 
+324082.064861  7394268.028300 
+323920.364524  7394341.185769 
+323764.774644  7394415.293075 
+323620.498593  7394507.697247 
+323473.608486  7394605.060570 
+323287.581769  7394707.702988 
+323196.576368  7394782.140237 
+323055.293698  7394922.096264 
+322960.626970  7395008.331493 
+323084.823450  7395133.610034 
+323192.997504  7395247.840467 
+323241.848174  7395300.011531 
+323352.092032  7395420.640868 
+323437.819845  7395510.365499 
+323488.360993  7395525.942831 
+323508.143700  7395536.990938 
+323539.067065  7395554.967859 
+323557.546868  7395571.345054 
+323573.470340  7395590.511771 
+323592.667565  7395614.757618 
+323604.773031  7395633.144468 
+323623.129141  7395670.348095 
+323639.761788  7395698.913202 
+323662.397691  7395744.275432 
+323675.583414  7395753.253894 
+323709.450683  7395792.597155 
+323797.446210  7395885.901173 
+323808.306496  7395899.178899 
+323838.207328  7395920.455254 
+323879.512698  7395948.920378 
+323903.146395  7395958.178793 
+323928.759187  7395969.336881 
+323965.578607  7395981.524794 
+323999.998374  7395984.374306 
+324016.053785  7395986.313973 
+324043.027205  7395988.033679 
+324073.810384  7395987.203821 
+324096.446287  7395984.604266 
+324138.048521  7395979.415155 
+324190.799658  7395969.906784 
+324254.889363  7395961.888157 
+324323.563972  7395953.349620 
+324357.653889  7395951.499937 
+324382.582244  7395951.689904 
+324404.467741  7395955.709216 
+324423.062991  7395959.468572 
+324440.643954  7395967.297231 
+324456.221084  7395977.665455 
+324477.908671  7395999.971634 
+324506.127272  7396048.483324 
+324527.163406  7396064.370603 
+324536.201275  7396070.179608 
+324548.026370  7396080.117906 
+324560.593625  7396088.456477 
+324572.047640  7396095.685239 
+324585.711644  7396105.553549 
+324700.672345  7396127.629767 
+324953.048234  7396172.572069 
+325022.333064  7396184.749983 
+325123.580284  7396187.819457 
+325167.343030  7396184.410041 
+325219.863273  7396180.630689 
+325247.653070  7396178.361077 
+325288.372957  7396174.191792 
+325324.953237  7396168.152826 
+325351.910165  7396159.004393 
+325393.009378  7396146.086606 
+325432.962366  7396133.938687 
+325467.200715  7396120.640964 
+325485.853689  7396111.912459 
+325501.818391  7396102.034151 
+325516.661607  7396090.246171 
+325525.402611  7396077.708318 
+325531.859410  7396068.589880 
+325534.506450  7396050.343006 
+325532.222244  7396044.643982 
+325534.110631  7396033.985808 
+325530.680199  7396021.447955 
+325516.686345  7395993.502742 
+325561.850951  7395949.470284 
+325628.249600  7395862.975100 
+325645.236835  7395843.648411 
+325662.751829  7395829.130897 
+325671.138245  7395824.801639 
+325688.933611  7395819.172603 
+325709.771836  7395810.994004 
+325769.029249  7395805.274984 
+325796.497444  7395800.885735 
+325817.352161  7395798.296179 
+325828.542296  7395794.716792 
+325844.292596  7395787.318060 
+325876.246740  7395755.763465 
+325895.237809  7395723.718953 
+325916.546069  7395703.612398 
+325977.271312  7395674.527380 
+326016.160536  7395659.709918 
+326060.409809  7395655.290675 
+326076.432235  7395651.951247 
+326241.439311  7395612.967924 
+326293.308101  7395601.169945 
+326434.763942  7395579.483660 
+326499.307189  7395571.235073 
+326616.073815  7395566.145944 
+326616.082061  7395566.125948 
+326675.628093  7395581.013398 
+326722.252281  7395592.821375 
+326767.820952  7395600.580046 
+326814.403908  7395523.283286 
+326850.101841  7395465.563173 
+326868.317764  7395432.758792 
+326887.597452  7395414.181974 
+326913.762742  7395398.384680 
+326942.707011  7395379.517912 
+327001.131555  7395345.363762 
+327063.530783  7395282.754487 
+327080.781897  7395264.677583 
+327148.986471  7395187.330832 
+327179.175921  7395159.325629 
+327218.279547  7395130.290602 
+327212.812296  7395090.437429 
+327217.322984  7395065.801649 
+327229.469682  7395045.205177 
+327242.135892  7395027.908140 
+327276.349503  7394981.356113 
+327230.822064  7394900.210013 
+327185.393579  7394852.068259 
+327165.412962  7394817.694147 
+327147.023868  7394801.086992 
+327138.398311  7394788.249191 
+327110.253925  7394746.186396 
+327061.576426  7394678.627968 
+327045.191166  7394665.310249 
+327045.149934  7394665.260258 
+Region 1
+1655
+314875.997705  7407081.823413 
+314889.496785  7407054.698059 
+314897.256488  7407041.890253 
+314909.691804  7407020.303951 
+314920.560336  7407001.477176 
+314926.522361  7406990.679025 
+314932.261737  7406976.851394 
+314940.095656  7406957.484711 
+314943.311686  7406941.867386 
+314942.544787  7406917.871496 
+314937.597048  7406905.703581 
+314930.365104  7406892.495843 
+314927.379969  7406886.156929 
+314923.924798  7406877.028493 
+314921.022125  7406863.110876 
+314924.963823  7406851.032945 
+314932.632818  7406846.313754 
+314940.590430  7406838.815038 
+314942.726204  7406829.746591 
+314944.911455  7406815.129095 
+314946.907043  7406794.692596 
+314946.973013  7406788.893589 
+314940.409013  7406760.288489 
+314938.462903  7406752.449832 
+314943.187993  7406738.602204 
+314945.373244  7406724.234665 
+314942.973591  7406710.826961 
+314939.782300  7406699.938826 
+314938.347455  7406691.850212 
+314929.713652  7406667.264423 
+314926.011094  7406656.876203 
+314925.615275  7406646.018063 
+314926.060572  7406628.601046 
+314927.775788  7406610.694113 
+314934.595420  7406590.557562 
+314943.130269  7406576.250013 
+314943.723998  7406568.681310 
+314945.134103  7406555.063642 
+314944.441420  7406548.994682 
+314946.140143  7406532.347533 
+314950.353967  7406518.499905 
+314957.577665  7406508.221666 
+314967.547358  7406503.272514 
+314992.582914  7406490.644677 
+315015.812546  7406481.536237 
+315045.193866  7406467.188694 
+315077.634537  7406451.351407 
+315100.658013  7406437.443789 
+315127.557218  7406417.517203 
+315135.564308  7406404.969352 
+315155.437723  7406376.634206 
+315164.162235  7406345.159597 
+315160.311246  7406324.923063 
+315158.760954  7406302.686872 
+315160.707065  7406287.309506 
+315163.848879  7406254.765081 
+315164.261190  7406216.141696 
+315159.651547  7406195.385252 
+315156.790105  7406177.938240 
+315153.879186  7406164.780494 
+315135.984865  7406120.888013 
+315146.317392  7406084.384265 
+315166.289763  7406042.371462 
+315210.374112  7405977.632551 
+315215.882594  7405945.268095 
+315216.575277  7405918.402696 
+315208.996991  7405871.570718 
+315203.488509  7405827.488269 
+315197.287344  7405780.656291 
+315195.217540  7405741.403015 
+315202.795826  7405701.449858 
+315212.435670  7405678.723751 
+315234.477844  7405649.108824 
+315243.433251  7405626.382717 
+315240.679010  7405605.026375 
+315237.232085  7405587.809324 
+315232.416287  7405568.522628 
+315227.592242  7405540.287464 
+315227.592242  7405511.362419 
+315231.030920  7405478.298082 
+315235.170528  7405452.132564 
+315243.433251  7405410.809643 
+315258.581576  7405350.200024 
+315275.799706  7405316.445806 
+315294.403202  7405276.502648 
+315301.288805  7405253.776541 
+315304.727483  7405237.249372 
+315309.551528  7405221.402086 
+315321.945613  7405206.254681 
+315341.926230  7405195.916452 
+315353.627631  7405184.898339 
+315359.144359  7405172.500463 
+315362.253188  7405164.211882 
+315366.862831  7405137.246501 
+315375.958423  7405118.399730 
+315395.988518  7405098.403155 
+315409.083532  7405085.905296 
+315426.804682  7405068.408293 
+315443.049756  7405047.111941 
+315458.536177  7405024.285851 
+315468.373930  7405007.218774 
+315477.972543  7404989.381829 
+315488.643165  7404965.755876 
+315492.584863  7404953.427988 
+315499.808561  7404943.149748 
+315507.527033  7404934.891163 
+315519.789178  7404928.702223 
+315530.558756  7404919.713763 
+315538.285474  7404910.205391 
+315543.010564  7404895.607892 
+315545.179322  7404883.000052 
+315546.622413  7404866.602860 
+315547.306850  7404850.455626 
+315552.642161  7404827.019640 
+315555.338679  7404812.152187 
+315560.904884  7404790.245939 
+315565.959824  7404769.079565 
+315568.375969  7404757.491550 
+315569.307793  7404741.594273 
+315572.795949  7404724.207251 
+315577.892119  7404698.501654 
+315577.554024  7404682.844336 
+315576.449029  7404667.436976 
+315572.325914  7404648.450228 
+315569.967492  7404631.513129 
+315571.187934  7404612.086457 
+315576.449029  7404595.979216 
+315580.225803  7404575.052800 
+315582.765642  7404551.596818 
+315592.108621  7404517.932584 
+315586.591893  7404499.225789 
+315582.872843  7404473.970115 
+315582.163667  7404460.842363 
+315582.798627  7404427.778027 
+315583.400602  7404401.522524 
+315580.638114  7404327.305237 
+315581.759602  7404298.780123 
+315585.923948  7404271.284833 
+315589.791430  7404255.647511 
+315593.939284  7404232.941401 
+315598.309787  7404219.073776 
+315606.020012  7404195.627792 
+315626.223277  7404158.344179 
+315628.598192  7404134.628241 
+315633.735593  7404119.250875 
+315649.799251  7404101.893848 
+315666.605069  7404089.595954 
+315684.449912  7404072.238928 
+315702.797775  7404054.142027 
+315718.111025  7404034.505391 
+315730.356678  7404018.648107 
+315743.657848  7403993.962336 
+315760.241018  7403974.085740 
+315778.357986  7403950.179835 
+315791.873559  7403936.092248 
+315807.162070  7403923.024487 
+315835.166269  7403902.937927 
+315859.632836  7403880.821716 
+315882.837729  7403855.156112 
+315894.563869  7403843.088179 
+315910.388385  7403821.691844 
+315923.664817  7403804.074862 
+315933.609771  7403793.006758 
+315949.195147  7403766.811245 
+315964.269256  7403744.405083 
+315971.418738  7403734.336807 
+316003.018294  7403705.171803 
+316025.423303  7403688.344685 
+316061.088250  7403658.949720 
+316077.943546  7403635.543730 
+316089.422299  7403621.196187 
+316101.948323  7403599.789854 
+316116.263780  7403575.104082 
+316128.542417  7403550.918225 
+316144.177270  7403511.345004 
+316153.693421  7403481.340143 
+316155.779717  7403465.702822 
+316158.385526  7403448.795718 
+316155.656024  7403431.878615 
+316150.906195  7403412.421948 
+316145.612115  7403400.284027 
+316141.109673  7403383.606884 
+316135.856824  7403361.370693 
+316113.088981  7403271.166144 
+316144.127793  7403256.138718 
+316172.635012  7403237.821856 
+316190.991122  7403220.474827 
+316212.942588  7403190.769915 
+316229.294863  7403162.564747 
+316235.364089  7403170.663359 
+316250.537153  7403187.380496 
+316260.638786  7403202.317937 
+316278.054825  7403230.403126 
+316290.185030  7403247.110265 
+316305.621974  7403261.047877 
+316324.637782  7403268.196653 
+316341.385876  7403273.055820 
+316356.088906  7403278.414902 
+316373.307035  7403292.362513 
+316387.267904  7403294.942071 
+316404.263385  7403299.551282 
+316422.281399  7403302.900708 
+316444.859579  7403309.049655 
+316460.576894  7403317.438218 
+316475.255185  7403330.366004 
+316481.019300  7403350.582541 
+316487.525576  7403377.117995 
+316487.921395  7403405.383154 
+316486.577259  7403424.569867 
+316490.288063  7403452.855022 
+316497.816872  7403475.601126 
+316510.944871  7403497.107442 
+316515.917348  7403525.142640 
+316516.354398  7403543.579482 
+316522.852428  7403571.364723 
+316530.389483  7403593.101000 
+316535.650578  7403612.307710 
+316539.402613  7403627.215156 
+316543.624683  7403651.720958 
+316545.306914  7403676.966634 
+316545.480085  7403698.422959 
+316541.596110  7403719.869285 
+316533.407603  7403735.736567 
+316522.679257  7403752.863634 
+316517.038835  7403765.971388 
+316514.919554  7403790.447196 
+316514.325826  7403812.403435 
+316512.453931  7403838.149025 
+316512.363223  7403860.355221 
+316519.133378  7403884.871022 
+316533.242679  7403914.205997 
+316544.597738  7403933.182747 
+316553.668592  7403952.399455 
+316558.929687  7403971.106251 
+316563.407390  7403996.871837 
+316564.306229  7404026.656735 
+316564.974174  7404052.912238 
+316566.161631  7404073.618691 
+316574.457339  7404097.374622 
+316587.370937  7404107.022969 
+316604.366418  7404112.132094 
+316629.500929  7404114.251731 
+316650.306169  7404118.620983 
+316683.315830  7404118.750960 
+316707.699934  7404118.081075 
+316728.010400  7404120.180716 
+316752.097640  7404128.859229 
+316773.405900  7404135.248135 
+316788.108929  7404144.146610 
+316806.827873  7404163.143356 
+316821.258776  7404175.061315 
+316839.755072  7404186.749313 
+316861.797246  7404198.447309 
+316876.252889  7404203.546436 
+316892.728857  7404212.194954 
+316912.486826  7404225.652649 
+316926.167323  7404235.290998 
+316939.567448  7404249.988481 
+316951.969778  7404262.656311 
+316966.928441  7404268.265350 
+316988.244947  7404272.134687 
+317009.363544  7404260.606662 
+317019.828010  7404248.028816 
+317037.969718  7404218.303908 
+317052.004802  7404199.687097 
+317071.136057  7404177.540890 
+317096.600418  7404159.713944 
+317121.792652  7404145.176434 
+317153.573625  7404134.948186 
+317179.541006  7404119.140894 
+317205.236260  7404107.632865 
+317225.835344  7404099.884192 
+317253.303539  7404088.126206 
+317271.387523  7404073.808659 
+317294.072903  7404050.672622 
+317309.122274  7404033.315595 
+317329.787328  7404009.659647 
+317349.916377  7403992.072659 
+317377.664943  7403973.495841 
+317398.569138  7403951.869546 
+317423.060443  7403922.174632 
+317439.379733  7403904.317691 
+317456.960697  7403889.490231 
+317476.091952  7403866.594153 
+317493.466760  7403838.139027 
+317504.953759  7403822.781657 
+317517.702432  7403809.953855 
+317539.587928  7403796.406175 
+317567.031384  7403791.716978 
+317604.675427  7403777.729374 
+317631.376721  7403768.241000 
+317675.593010  7403759.822442 
+317706.590591  7403755.653156 
+317731.477715  7403755.753139 
+317766.994231  7403764.471645 
+317828.906930  7403779.099140 
+317849.712170  7403784.228261 
+317871.515204  7403793.646648 
+317887.479907  7403802.045209 
+317897.837172  7403818.492392 
+317905.357735  7403842.498280 
+317914.675975  7403863.734642 
+317920.481322  7403874.362822 
+317936.182145  7403885.780866 
+317951.635581  7403894.429385 
+317960.244646  7403901.778126 
+317968.268228  7403929.073451 
+317967.888902  7403961.637873 
+317968.086811  7403976.775280 
+317980.225263  7403990.202980 
+317997.204252  7403999.861325 
+318020.021572  7404009.799623 
+318050.722288  7404018.998047 
+318070.010222  7404020.837732 
+318097.453678  7404016.658448 
+318117.269370  7404015.218695 
+318136.334655  7404008.979763 
+318146.065207  7403988.323302 
+318150.988207  7403962.337753 
+318153.602262  7403942.411166 
+318158.772649  7403918.695228 
+318167.455930  7403905.097557 
+318178.662557  7403896.559020 
+318199.781154  7403886.040822 
+318213.263741  7403879.781894 
+318228.758408  7403878.832056 
+318245.019975  7403877.632262 
+318257.199658  7403879.441952 
+318273.444732  7403882.031508 
+318292.254384  7403878.062188 
+318302.166353  7403875.582613 
+318322.485066  7403873.642945 
+318334.640010  7403883.531251 
+318343.224336  7403896.439040 
+318356.154425  7403902.547994 
+318372.655133  7403904.877595 
+318382.575348  7403900.378366 
+318397.566996  7403897.908789 
+318417.019854  7403895.219249 
+318412.674090  7403906.477321 
+318558.962222  7404213.984648 
+318781.668173  7404524.191512 
+318996.424758  7404953.697942 
+319230.955804  7405274.163049 
+319235.746864  7405301.738325 
+319240.653371  7405318.195506 
+319248.107963  7405334.682682 
+319252.981486  7405354.169344 
+319257.162325  7405367.597044 
+319259.067204  7405379.235051 
+319260.947344  7405393.892540 
+319261.021561  7405410.809643 
+319251.934214  7405428.396630 
+319244.636300  7405445.743659 
+319239.317481  7405467.659905 
+319236.084959  7405485.296884 
+319235.161381  7405499.934376 
+319235.986004  7405518.121261 
+319243.490074  7405529.309345 
+319249.460345  7405541.737216 
+319256.717028  7405552.415387 
+319264.897289  7405571.692085 
+319270.001706  7405593.958271 
+319271.923077  7405604.326495 
+319270.512972  7405617.444248 
+319266.802168  7405631.551831 
+319260.749435  7405651.438425 
+319261.895661  7405663.066433 
+319267.115525  7405673.464652 
+319275.130861  7405684.652736 
+319288.184644  7405700.440031 
+319299.531458  7405708.378672 
+319317.532979  7405712.347992 
+319342.939616  7405713.617774 
+319352.826846  7405715.477456 
+319370.308855  7405720.456603 
+319378.860196  7405728.875161 
+319390.932678  7405741.113065 
+319401.438376  7405757.120323 
+319411.498777  7405766.818661 
+319433.780093  7405774.617326 
+319446.924584  7405781.566135 
+319459.038297  7405789.514774 
+319466.055839  7405798.673205 
+319473.048643  7405809.851290 
+319485.286049  7405830.427766 
+319501.811495  7405853.573801 
+319512.366671  7405865.041837 
+319523.993856  7405870.460908 
+319545.343347  7405870.670872 
+319566.156833  7405872.900491 
+319578.534425  7405880.599172 
+319597.706912  7405893.416976 
+319623.699031  7405911.353904 
+319644.075467  7405930.740583 
+319642.154095  7405944.108293 
+319640.900668  7405966.064532 
+319637.651653  7405984.971294 
+319628.539568  7406005.327807 
+319620.755126  7406020.145269 
+319609.630961  7406039.222001 
+319603.883338  7406053.309588 
+319600.988911  7406063.127906 
+319600.840479  7406077.005529 
+319603.438042  7406095.472366 
+319606.043851  7406112.919377 
+319614.974519  7406133.455860 
+319627.945839  7406156.561902 
+319639.911120  7406178.648119 
+319655.405787  7406203.293897 
+319667.659686  7406222.110674 
+319676.911957  7406236.088280 
+319688.135077  7406256.654757 
+319693.569343  7406270.842327 
+319701.980498  7406292.898549 
+319707.975508  7406302.296939 
+319727.758215  7406309.145766 
+319738.173204  7406330.622087 
+319741.133601  7406338.990654 
+319746.007124  7406358.727273 
+319750.278671  7406387.052421 
+319755.416073  7406406.299124 
+319759.720605  7406431.084879 
+319760.281349  7406450.021635 
+319758.500163  7406474.497442 
+319755.795399  7406490.124766 
+319747.912003  7406514.290626 
+319738.478315  7406540.456144 
+319730.660888  7406559.312914 
+319725.399793  7406575.420155 
+319723.255773  7406586.248301 
+319722.859954  7406599.636007 
+319722.793984  7406629.170948 
+319724.080396  7406651.907054 
+319726.158446  7406671.873634 
+319725.383301  7406696.359439 
+319719.784110  7406704.688013 
+319718.374005  7406717.115884 
+319722.513612  7406727.134168 
+319723.206296  7406757.698933 
+319726.339863  7406797.872051 
+319729.168321  7406818.858457 
+319736.804330  7406841.664550 
+319743.607470  7406870.769565 
+319751.532098  7406890.536179 
+319755.110962  7406912.292452 
+319762.177982  7406940.637597 
+319769.277986  7406965.963259 
+319771.652901  7406982.140488 
+319771.982750  7406998.807633 
+319769.327464  7407009.645776 
+319763.992153  7407033.321721 
+319748.827334  7407049.079022 
+319743.648702  7407058.117474 
+319741.512928  7407067.685835 
+319739.863682  7407079.283848 
+319743.599224  7407086.902543 
+319752.439183  7407091.531750 
+319766.746394  7407099.850325 
+319779.767192  7407109.968592 
+319790.850126  7407125.675901 
+319792.639558  7407132.544725 
+319791.056282  7407140.653336 
+319793.291010  7407145.972425 
+319798.857216  7407148.052069 
+319806.443748  7407151.661450 
+319814.244682  7407159.060183 
+319822.985687  7407173.037789 
+319833.425415  7407195.363965 
+319842.009741  7407224.738933 
+319849.843660  7407252.844119 
+319857.751795  7407273.880515 
+319866.220674  7407290.117734 
+319871.160166  7407303.305475 
+319877.608718  7407318.512870 
+319885.887934  7407328.441170 
+319892.625104  7407340.379125 
+319903.073079  7407361.445516 
+319908.598053  7407367.804427 
+319923.028957  7407372.493624 
+319937.971127  7407377.702732 
+319954.166724  7407384.421581 
+319969.562436  7407394.679824 
+319987.267094  7407402.688452 
+320007.660022  7407420.305434 
+320018.759448  7407428.504030 
+320031.780247  7407446.560937 
+320041.213934  7407467.857289 
+320043.753774  7407491.623218 
+320043.852728  7407506.270709 
+320044.363995  7407530.256600 
+320045.015447  7407540.114912 
+320049.600351  7407562.881012 
+320052.494778  7407577.808455 
+320047.860396  7407588.506623 
+320043.687804  7407593.625746 
+320041.568522  7407601.434408 
+320042.830196  7407614.362194 
+320045.765854  7407630.589416 
+320051.736125  7407649.256217 
+320053.467833  7407653.315522 
+320058.522773  7407662.493949 
+320067.750305  7407672.392254 
+320077.390148  7407674.511891 
+320081.356585  7407683.640327 
+320084.490153  7407699.577597 
+320067.511164  7407719.354210 
+320054.168763  7407731.342156 
+320043.118814  7407742.590230 
+320037.725779  7407747.589373 
+320033.058412  7407756.377868 
+320032.200804  7407765.206356 
+320037.907196  7407778.144140 
+320045.271080  7407802.959889 
+320047.324391  7407825.206078 
+320051.488738  7407839.633607 
+320051.818587  7407856.300752 
+320047.802673  7407875.197515 
+320041.881879  7407882.466270 
+320026.535644  7407891.394741 
+320015.807298  7407897.103763 
+320004.542947  7407904.812442 
+319995.364892  7407906.992069 
+319990.417154  7407918.560088 
+319991.085098  7407926.898659 
+319994.532023  7407937.786794 
+319997.236786  7407946.405318 
+319996.074068  7407960.022985 
+319994.960827  7407969.101430 
+319996.882199  7407979.219697 
+320003.413213  7407987.118344 
+320015.840283  7407989.257978 
+320031.895694  7407984.878728 
+320043.630080  7407980.699444 
+320061.656340  7407982.899067 
+320076.441832  7408002.235755 
+320079.097118  7408015.643458 
+320083.277957  7408028.311288 
+320087.953570  7408043.008771 
+320092.835338  7408062.245476 
+320088.027786  7408083.661807 
+320079.583646  7408112.866805 
+320078.107570  7408132.543434 
+320075.608963  7408152.460023 
+320074.207103  7408164.567949 
+320066.884450  7408184.194587 
+320056.824049  7408197.972227 
+320046.846110  7408204.441119 
+320037.857719  7408212.939663 
+320026.337734  7408220.398385 
+320017.357589  7408228.387017 
+320012.121233  7408242.974518 
+320005.895329  7408255.292408 
+320000.708450  7408264.830775 
+319994.202174  7408279.408278 
+319985.716802  7408288.416734 
+319975.953265  7408298.415022 
+319966.997859  7408303.884085 
+319954.719221  7408311.332809 
+319952.863819  7408318.381602 
+319953.474040  7408333.289048 
+319957.968236  7408340.907743 
+319965.208427  7408352.845698 
+319971.978582  7408360.994303 
+319980.752571  7408372.952254 
+319987.992762  7408384.890209 
+319990.425400  7408395.518389 
+319992.058154  7408408.666137 
+319991.200546  7408417.494625 
+319991.348978  7408427.842852 
+319993.253857  7408439.990771 
+320002.761761  7408453.718420 
+320010.084414  7408458.587586 
+320021.183840  7408466.526226 
+320034.534488  7408477.514344 
+320036.958879  7408488.402479 
+320035.540528  7408502.520061 
+320031.862709  7408513.348206 
+320031.978156  7408526.725914 
+320031.524613  7408544.902801 
+320030.172232  7408553.221376 
+320024.713227  7408564.279482 
+320017.415313  7408581.626510 
+320007.091032  7408596.673933 
+319990.079058  7408618.970114 
+319978.996124  7408632.997711 
+319972.489848  7408647.325257 
+319967.773004  7408660.912929 
+319951.000171  7408684.478893 
+319929.271353  7408720.372744 
+319910.107113  7408754.516896 
+319894.546476  7408783.401948 
+319884.403613  7408805.268203 
+319867.606041  7408831.103777 
+319856.465383  7408851.190336 
+319848.153183  7408868.277410 
+319836.740399  7408890.133666 
+319819.060481  7408903.331405 
+319805.495431  7408912.289871 
+319795.476261  7408922.288158 
+319789.802855  7408929.806870 
+319782.133860  7408934.026147 
+319773.697966  7408938.735341 
+319757.197259  7408936.805671 
+319746.031862  7408935.175950 
+319727.741723  7408934.736026 
+319717.326733  7408934.636043 
+319704.091533  7408936.525719 
+319686.477585  7408943.164582 
+319675.485359  7408949.613477 
+319666.967003  7408961.651415 
+319658.613571  7408982.277882 
+319654.655380  7408996.375468 
+319646.920416  7409006.393752 
+319638.979296  7409012.882640 
+319629.009603  7409018.081749 
+319617.819468  7409018.981595 
+319611.453378  7409019.931433 
+319603.330841  7409018.831621 
+319597.162660  7409001.354615 
+319588.594827  7408994.955711 
+319574.180416  7408988.246860 
+319563.048004  7408983.587658 
+319540.931614  7408983.367696 
+319527.201640  7408984.237547 
+319507.328224  7408988.836759 
+319488.015552  7408989.146706 
+319473.032150  7408987.736947 
+319463.144920  7408985.117396 
+319450.528187  7408977.158759 
+319442.933409  7408974.309247 
+319435.858143  7408969.939996 
+319421.386008  7408969.040150 
+319393.142668  7408972.289593 
+319381.424774  7408974.449223 
+319372.032317  7408973.599369 
+319361.196770  7408965.150816 
+319349.066565  7408958.212005 
+319339.740078  7408951.303188 
+319332.392687  7408948.703633 
+319324.286642  7408946.603993 
+319305.460497  7408948.693635 
+319301.007533  7408960.761568 
+319293.297307  7408968.770196 
+319285.603574  7408975.758999 
+319270.834575  7408978.138591 
+319260.394847  7408979.798307 
+319244.867195  7408982.417858 
+319237.725959  7408984.617482 
+319222.643603  7408992.546123 
+319205.623383  7408992.376153 
+319188.339284  7408992.206182 
+319166.998039  7408991.736262 
+319142.094422  7408991.496303 
+319120.481052  7408992.286168 
+319103.188706  7408993.375981 
+319090.679174  7408998.805051 
+319078.128411  7409007.763517 
+319071.688105  7409015.782143 
+319056.012020  7409032.289316 
+319041.152313  7409043.757351 
+319032.180414  7409050.486199 
+319016.974365  7409070.532765 
+319006.163556  7409083.550535 
+319002.395029  7409103.207168 
+318996.820577  7409125.373371 
+318995.591888  7409145.559914 
+318994.066336  7409169.275851 
+318990.099899  7409184.133306 
+318987.947633  7409195.221407 
+318980.938337  7409209.558951 
+318976.741005  7409215.257975 
+318969.484322  7409221.636882 
+318963.876885  7409223.016646 
+318958.022062  7409223.636540 
+318945.999057  7409217.557581 
+318937.653872  7409216.347788 
+318927.807873  7409214.608086 
+318914.886029  7409214.058180 
+318906.738753  7409215.377954 
+318898.533754  7409218.957341 
+318891.763598  7409226.366072 
+318887.087986  7409241.373502 
+318883.236996  7409253.621404 
+318882.445358  7409265.199420 
+318882.948378  7409276.047562 
+318881.530026  7409292.644719 
+318876.392624  7409305.622496 
+318873.514690  7409319.920047 
+318870.504816  7409328.918506 
+318871.774735  7409339.276732 
+318879.138619  7409359.863205 
+318884.078111  7409375.850467 
+318888.753724  7409392.087686 
+318893.165458  7409409.064778 
+318895.515633  7409427.011703 
+318897.428759  7409442.179105 
+318901.898216  7409456.646627 
+318907.217035  7409467.604750 
+318910.721683  7409479.782664 
+318912.074064  7409486.871450 
+318913.022381  7409499.989203 
+318907.588115  7409514.976636 
+318896.348503  7409528.574307 
+318884.572885  7409533.333492 
+318868.913293  7409540.782216 
+318852.833144  7409545.191460 
+318826.857517  7409549.370744 
+318798.094664  7409553.729998 
+318774.403244  7409557.969272 
+318758.826114  7409562.388515 
+318747.545271  7409567.157698 
+318739.513442  7409574.276478 
+318735.530513  7409581.745199 
+318732.875226  7409586.724346 
+318730.277664  7409609.840387 
+318731.374412  7409627.507360 
+318735.167678  7409649.013677 
+318742.333653  7409667.070584 
+318748.064783  7409681.818057 
+318757.877798  7409695.655687 
+318763.188370  7409706.613810 
+318770.585239  7409715.352313 
+318773.355973  7409726.500404 
+318771.574787  7409737.298554 
+318766.833204  7409744.747278 
+318755.486391  7409752.285987 
+318733.881266  7409764.633872 
+318718.518539  7409770.822812 
+318699.494485  7409781.211032 
+318674.153818  7409801.277595 
+318666.534301  7409812.185727 
+318661.504100  7409820.884237 
+318660.968095  7409842.790484 
+318661.462869  7409853.888583 
+318661.924658  7409876.574697 
+318656.374945  7409896.351310 
+318645.828016  7409912.988460 
+318640.220579  7409924.446497 
+318629.269584  7409936.784384 
+318613.387344  7409953.801469 
+318597.480365  7409971.568426 
+318575.932965  7409992.224888 
+318557.362453  7410004.892718 
+318545.809484  7410010.671728 
+318529.984967  7410016.670700 
+318516.452903  7410018.550378 
+318494.229311  7410025.079260 
+318475.815478  7410031.198212 
+318458.399439  7410038.346987 
+318446.788746  7410046.395609 
+318438.707440  7410055.274088 
+318429.059351  7410066.132228 
+318422.816954  7410093.447549 
+318410.678502  7410113.074187 
+318398.449342  7410125.632036 
+318385.395559  7410140.949412 
+318378.345032  7410159.686203 
+318368.985560  7410179.622788 
+318362.388576  7410200.629190 
+318347.702039  7410220.695753 
+318332.256849  7410240.492362 
+318324.777518  7410255.939716 
+318318.625830  7410269.147453 
+318310.387845  7410284.574811 
+318301.259268  7410305.521223 
+318295.519891  7410311.940123 
+318289.442419  7410322.128378 
+318278.870752  7410329.437126 
+318258.865396  7410338.295609 
+318246.388849  7410340.515229 
+318231.059106  7410344.944470 
+318219.778263  7410349.973608 
+318211.144459  7410360.861743 
+318205.545269  7410372.059825 
+318199.583244  7410387.797130 
+318196.952697  7410402.354636 
+318192.178129  7410431.969563 
+318193.670697  7410443.347614 
+318198.544219  7410451.776171 
+318203.656882  7410460.454684 
+318205.611239  7410463.524158 
+318209.223088  7410471.672762 
+318209.536445  7410479.491423 
+318204.530983  7410487.190105 
+318200.943872  7410499.198048 
+318201.809726  7410505.267008 
+318206.526570  7410509.406299 
+318211.342369  7410520.104467 
+318220.751318  7410529.642833 
+318228.115202  7410539.651118 
+318230.572579  7410542.730591 
+318231.990931  7410547.039853 
+318233.516483  7410557.408077 
+318228.478036  7410566.616499 
+318219.102072  7410576.724768 
+318211.004274  7410586.363117 
+318205.809148  7410591.282274 
+318200.671747  7410593.931821 
+318186.372783  7410597.881144 
+318174.432241  7410598.860976 
+318157.420267  7410599.720829 
+318146.502257  7410599.970786 
+318136.326409  7410601.490526 
+318128.698645  7410602.070427 
+318121.013159  7410605.159897 
+318120.172043  7410608.419339 
+318120.081334  7410612.198692 
+318123.495274  7410618.067686 
+318126.414440  7410623.176811 
+318133.638138  7410628.635876 
+318138.643600  7410631.275424 
+318141.059745  7410636.374551 
+318141.307132  7410646.962737 
+318139.575424  7410655.491276 
+318137.464389  7410658.970680 
+318133.151610  7410669.448885 
+318128.723384  7410674.128084 
+318122.777852  7410679.027245 
+318111.348576  7410679.517161 
+318098.220577  7410676.937602 
+318083.707211  7410668.788998 
+318065.590242  7410663.069978 
+318057.335765  7410658.340788 
+318044.735525  7410655.021357 
+318037.586043  7410656.871040 
+318029.447013  7410668.269087 
+318019.980341  7410682.156708 
+318010.241542  7410696.544244 
+317996.618769  7410714.621148 
+317984.364870  7410728.438781 
+317967.122002  7410749.205224 
+317954.274375  7410766.282299 
+317940.165074  7410783.339377 
+317929.453221  7410796.187176 
+317915.706754  7410808.974986 
+317901.630438  7410813.934136 
+317884.280369  7410818.313386 
+317868.307420  7410818.183408 
+317856.944115  7410815.903799 
+317831.694156  7410804.575739 
+317835.998689  7410790.058226 
+317850.322391  7410755.864083 
+317857.974893  7410744.376051 
+317860.325069  7410736.567388 
+317861.644466  7410721.270009 
+317860.366300  7410703.323083 
+317857.521351  7410690.205330 
+317846.059090  7410675.127912 
+317832.065237  7410652.911718 
+317818.714589  7410638.924114 
+317810.550821  7410630.975475 
+317795.212832  7410625.556404 
+317782.472406  7410622.786878 
+317770.828728  7410622.646902 
+317748.646367  7410624.236630 
+317707.225551  7410632.315246 
+317669.226920  7410637.074431 
+317647.069298  7410636.804477 
+317624.590074  7410632.035294 
+317608.905743  7410624.746542 
+317594.779950  7410612.618620 
+317584.785518  7410600.910625 
+317566.346947  7410573.045398 
+317557.515233  7410557.987977 
+317546.457038  7410540.670944 
+317529.750175  7410525.143603 
+317520.786522  7410520.924326 
+317507.666769  7410518.894674 
+317490.696027  7410523.913814 
+317463.491712  7410536.651632 
+317450.611099  7410545.830060 
+317419.836167  7410573.845261 
+317395.534525  7410594.831666 
+317363.629859  7410622.826871 
+317341.274327  7410638.614167 
+317333.333207  7410642.623480 
+317326.183725  7410643.663302 
+317319.430062  7410643.203381 
+317316.477912  7410638.684155 
+317313.204158  7410630.425570 
+317310.689058  7410621.057174 
+317306.722621  7410606.429680 
+317298.542360  7410599.610848 
+317286.519356  7410599.460874 
+317272.187407  7410603.760137 
+317251.646046  7410624.426597 
+317237.165665  7410640.683812 
+317228.111304  7410643.563319 
+317204.799210  7410645.512985 
+317180.662493  7410652.691756 
+317170.041348  7410660.770372 
+317169.175494  7410670.478709 
+317172.094659  7410677.237551 
+317177.982468  7410687.025874 
+317187.688281  7410692.374958 
+317206.456702  7410693.354790 
+317267.305638  7410694.854533 
+317278.512266  7410699.473742 
+317285.191713  7410706.282576 
+317291.071275  7410716.820771 
+317289.397290  7410730.988344 
+317284.771155  7410740.646690 
+317271.816326  7410754.684285 
+317262.728980  7410760.543282 
+317252.924212  7410763.412790 
+317240.942439  7410760.273328 
+317227.459852  7410757.123867 
+317216.211993  7410754.734277 
+317204.156004  7410757.573790 
+317195.786080  7410766.442271 
+317175.186996  7410791.587964 
+317162.298137  7410800.396455 
+317142.713339  7410804.635729 
+317111.946653  7410801.256308 
+317068.472525  7410792.507806 
+317040.732205  7410787.678634 
+317014.484453  7410783.609331 
+316998.709414  7410783.419363 
+316975.372581  7410786.868772 
+316957.280351  7410791.118044 
+316935.477317  7410792.347834 
+316920.436192  7410793.467642 
+316909.881017  7410796.327152 
+316904.529213  7410803.725885 
+316904.050932  7410811.944477 
+316903.894254  7410824.262367 
+316908.561620  7410842.259284 
+316914.375213  7410857.646649 
+316919.520861  7410867.424974 
+316924.732479  7410870.844388 
+316932.228302  7410872.434116 
+316936.755483  7410870.994362 
+316947.384874  7410861.795938 
+316954.262231  7410852.907460 
+316959.935637  7410849.618024 
+316965.584305  7410848.568204 
+316973.830536  7410850.167930 
+316977.904174  7410855.077089 
+316980.072932  7410861.825933 
+316979.891515  7410876.393438 
+316977.063058  7410892.420692 
+316972.049350  7410903.188848 
+316965.955386  7410909.467772 
+316955.367225  7410914.936835 
+316938.734578  7410923.325398 
+316918.366389  7410929.794290 
+316911.538510  7410934.943408 
+316903.547912  7410943.431954 
+316898.558942  7410951.590557 
+316892.300053  7410971.307180 
+316879.369964  7411014.479785 
+316872.789472  7411030.087111 
+316864.683427  7411047.174184 
+316847.531267  7411066.760829 
+316833.075625  7411081.148365 
+316819.865163  7411086.217497 
+316799.917531  7411089.326964 
+316776.588945  7411091.656565 
+316756.245494  7411096.635712 
+316744.544093  7411100.974969 
+316734.376490  7411102.334736 
+316723.128632  7411100.705015 
+316714.560798  7411094.995993 
+316704.121070  7411088.137168 
+316668.802464  7411058.562234 
+316655.031259  7411047.934054 
+316642.340310  7411041.425169 
+316618.368518  7411035.516181 
+316599.624835  7411031.926796 
+316577.079641  7411032.016781 
+316565.064883  7411031.866806 
+316554.955004  7411029.127276 
+316546.395416  7411022.298445 
+316536.780312  7411010.220514 
+316527.602257  7410992.553540 
+316519.100393  7410981.615414 
+316510.549052  7410974.036712 
+316500.109324  7410967.927759 
+316479.163898  7410960.189084 
+316464.551577  7410957.399562 
+316452.965623  7410952.400418 
+316445.519277  7410947.071331 
+316442.591865  7410940.312489 
+316442.641342  7410936.203193 
+316444.603945  7410929.874277 
+316447.292217  7410925.055102 
+316455.975497  7410921.425724 
+316464.634040  7410920.415897 
+316476.632305  7410922.055616 
+316507.374253  7410927.674653 
+316531.750111  7410931.334027 
+316542.264055  7410931.843939 
+316550.576255  7410927.834626 
+316553.643853  7410922.645515 
+316556.398094  7410912.967173 
+316556.158954  7410902.129029 
+316552.909939  7410891.630827 
+316542.866030  7410883.282258 
+316529.432920  7410875.643566 
+316515.216418  7410870.984364 
+316506.986680  7410867.894893 
+316499.515595  7410864.815421 
+316498.064259  7410860.316191 
+316499.631042  7410855.477020 
+316507.456715  7410830.171355 
+316510.252188  7410817.133588 
+316509.237901  7410807.775191 
+316504.446841  7410800.616417 
+316495.854269  7410796.407138 
+316485.719651  7410795.907224 
+316476.690029  7410797.286988 
+316472.888517  7410800.596421 
+316470.200245  7410805.045659 
+316466.679105  7410816.213746 
+316463.520798  7410828.871578 
+316459.620331  7410840.409601 
+316451.143206  7410857.116739 
+316439.334604  7410870.044525 
+316431.022404  7410873.673903 
+316423.872922  7410875.073664 
+316417.877912  7410873.513931 
+316412.649802  7410871.204326 
+316410.439812  7410867.434972 
+316409.037953  7410859.206381 
+316408.411239  7410849.478048 
+316410.019254  7410840.909516 
+316414.670128  7410829.391489 
+316422.025766  7410812.294417 
+316429.356665  7410796.327152 
+316433.619966  7410785.918935 
+316435.599062  7410777.720339 
+316434.230187  7410767.242134 
+316428.688720  7410759.703425 
+316419.749806  7410753.244532 
+316410.019254  7410750.135064 
+316395.357456  7410751.444840 
+316379.895773  7410756.104042 
+316350.423745  7410769.561737 
+316342.095052  7410774.310923 
+316336.050565  7410777.230423 
+316329.659736  7410777.520374 
+316324.431626  7410774.840833 
+316316.581215  7410771.751362 
+316308.706064  7410770.161634 
+316303.799557  7410771.971324 
+316300.715467  7410778.280243 
+316299.107452  7410787.228711 
+316297.095372  7410797.666923 
+316292.848563  7410806.575397 
+316290.152045  7410812.524378 
+316279.934966  7410817.993441 
+316266.691519  7410825.302189 
+316256.870258  7410830.031379 
+316241.045742  7410833.570773 
+316229.377325  7410834.920541 
+316219.630281  7410833.310817 
+316211.425281  7410828.351667 
+316202.865694  7410821.892773 
+316191.741529  7410810.544717 
+316185.861966  7410799.636585 
+316179.652555  7410785.369029 
+316178.275434  7410775.260761 
+316176.997268  7410757.683771 
+316174.869741  7410747.205566 
+316170.812595  7410741.176599 
+316164.091917  7410738.097126 
+316156.950682  7410738.017140 
+316148.267401  7410741.636520 
+316137.984351  7410752.344686 
+316126.167503  7410766.392280 
+316113.484800  7410789.398339 
+316107.349604  7410799.036688 
+316095.565741  7410810.094794 
+316065.244351  7410831.381148 
+316045.873955  7410848.328245 
+316038.229699  7410858.316534 
+316032.440845  7410870.944371 
+316029.966976  7410888.101432 
+316029.777313  7410903.408810 
+316034.131322  7410916.166625 
+316042.583709  7410931.214047 
+316051.093819  7410941.412300 
+316059.298818  7410946.371451 
+316074.645054  7410951.040651 
+316082.116139  7410954.500059 
+316089.562485  7410960.189084 
+316093.545414  7410972.197027 
+316097.915917  7410983.085162 
+316103.053318  7410992.493551 
+316110.854252  7411000.062254 
+316118.308845  7411005.011406 
+316128.781558  7411008.500809 
+316149.751722  7411014.369803 
+316162.112822  7411016.759394 
+316181.606911  7411020.368776 
+316195.831659  7411024.658041 
+316202.511106  7411031.456877 
+316204.663372  7411039.705464 
+316204.300538  7411068.840473 
+316203.673825  7411088.627084 
+316204.597402  7411105.084265 
+316207.376382  7411123.421124 
+316208.671040  7411139.878305 
+316208.868950  7411154.075873 
+316206.461051  7411166.743703 
+316197.217026  7411184.560651 
+316186.092861  7411203.097476 
+316168.907716  7411225.303672 
+316148.679712  7411250.449365 
+316119.380855  7411280.344244 
+316085.917651  7411312.048814 
+316041.519945  7411347.362765 
+316000.833043  7411386.456068 
+315988.991456  7411401.993407 
+315977.092145  7411422.019977 
+315964.326980  7411451.374948 
+315953.367740  7411486.348958 
+315943.686665  7411509.764947 
+315936.718600  7411526.112147 
+315921.834154  7411544.608978 
+315913.101395  7411551.967718 
+315903.280135  7411556.326971 
+315893.096040  7411559.196480 
+315883.703583  7411559.446437 
+315872.101136  7411555.937038 
+315861.249097  7411552.447636 
+315852.986374  7411551.597781 
+315843.981490  7411551.107865 
+315836.427943  7411553.997370 
+315830.325732  7411561.026166 
+315824.932697  7411571.794322 
+315820.685888  7411581.072732 
+315815.152668  7411602.669033 
+315812.381934  7411613.847118 
+315807.054869  7411619.386170 
+315802.131869  7411622.685604 
+315797.208870  7411625.615103 
+315787.437086  7411625.865060 
+315778.836268  7411622.765591 
+315774.746137  7411618.976240 
+315771.793987  7411614.836949 
+315771.117796  7411608.847975 
+315773.443233  7411602.898994 
+315776.255198  7411588.361484 
+315775.974826  7411580.892763 
+315774.539982  7411575.273726 
+315771.216751  7411570.744501 
+315767.093635  7411569.944638 
+315758.839159  7411569.464721 
+315748.292230  7411571.574359 
+315732.071894  7411576.233561 
+315715.076413  7411583.862255 
+315701.123790  7411587.801580 
+315686.849565  7411587.621611 
+315675.230626  7411585.232020 
+315666.671039  7411578.403190 
+315651.803085  7411565.885334 
+315644.793789  7411555.337141 
+315641.544774  7411544.469002 
+315642.468352  7411531.031304 
+315647.828402  7411522.882700 
+315656.528175  7411518.133513 
+315683.971631  7411516.983710 
+315700.884650  7411516.443803 
+315711.439825  7411513.964227 
+315737.901979  7411500.846474 
+315744.729858  7411495.327420 
+315766.005133  7411476.910574 
+315781.277152  7411457.673869 
+315786.356830  7411442.046546 
+315783.454157  7411433.418024 
+315771.950665  7411422.069968 
+315746.106978  7411415.401110 
+315705.601493  7411409.662093 
+315691.368499  7411406.122700 
+315629.200167  7411390.405392 
+315606.704449  7411386.386080 
+315589.115239  7411380.937014 
+315575.649145  7411376.287810 
+315557.622885  7411375.307978 
+315540.322293  7411376.957695 
+315522.230063  7411381.586902 
+315504.137833  7411386.226108 
+315493.986723  7411386.846002 
+315484.231432  7411385.226279 
+315473.395885  7411380.607070 
+315460.028745  7411368.109211 
+315435.957998  7411339.794061 
+315413.025230  7411311.108975 
+315397.093513  7411293.352016 
+315385.573528  7411282.753832 
+315371.752846  7411276.604885 
+315350.378616  7411272.975507 
+315328.196255  7411274.565234 
+315313.130392  7411277.364755 
+315302.616448  7411277.224779 
+315297.767664  7411274.175301 
+315292.918881  7411271.135822 
+315290.387288  7411263.627108 
+315292.374630  7411255.058576 
+315298.105760  7411246.909971 
+315310.194734  7411241.830841 
+315336.549687  7411237.311615 
+315348.226350  7411235.211975 
+315355.796389  7411230.822727 
+315358.138319  7411223.384001 
+315355.606726  7411215.885286 
+315344.828903  7411206.406909 
+315331.775120  7411198.768218 
+315297.701695  7411189.749762 
+315278.224098  7411184.650636 
+315269.994360  7411181.561165 
+315266.300048  7411176.652006 
+315267.512244  7411170.323090 
+315272.468229  7411164.034167 
+315284.590188  7411156.715421 
+315294.427941  7411150.856424 
+315302.369061  7411146.477175 
+315305.815986  7411141.288063 
+315307.778588  7411134.589211 
+315306.368483  7411127.470430 
+315294.098092  7411117.232184 
+315278.092158  7411105.454201 
+315263.174727  7411096.295770 
+315250.063220  7411093.146310 
+315225.308036  7411089.846875 
+315202.787580  7411088.067180 
+315189.313239  7411084.167848 
+315179.566194  7411082.548125 
+315153.227734  7411085.577606 
+315134.797408  7411087.217325 
+315122.774404  7411087.067351 
+315111.155465  7411085.057695 
+315099.181938  7411081.168361 
+315077.840693  7411074.919432 
+315058.338358  7411072.059922 
+315048.929408  7411073.439685 
+315032.709073  7411078.468824 
+315008.514632  7411090.866700 
+314983.198704  7411102.124772 
+314959.350605  7411116.022391 
+314936.228174  7411132.539562 
+314913.880889  7411146.837113 
+314894.997021  7411154.435811 
+314879.527092  7411159.844885 
+314855.060526  7411163.274297 
+314831.377351  7411164.474092 
+314823.477463  7411165.123981 
+314812.988257  7411162.754386 
+314802.944348  7411154.775753 
+314787.688822  7411143.007769 
+314775.047350  7411132.389588 
+314768.887416  7411119.261836 
+314762.224461  7411101.114945 
+314750.687985  7411072.329875 
+314742.078920  7411060.391920 
+314731.540237  7411051.543436 
+314719.723389  7411045.174527 
+314695.364023  7411040.505327 
+314676.620341  7411037.155900 
+314649.762368  7411031.836811 
+314615.994053  7411027.677524 
+314583.479166  7411024.158127 
+314562.187398  7411024.508067 
+314539.592726  7411028.587368 
+314515.084929  7411035.126248 
+314495.557855  7411044.844583 
+314477.902675  7411053.963021 
+314459.035299  7411060.571889 
+314437.685808  7411065.281083 
+314417.614483  7411068.140593 
+314403.150594  7411072.939771 
+314389.940132  7411077.758945 
+314369.703882  7411093.686217 
+314355.149285  7411105.964114 
+314343.167512  7411112.652968 
+314333.123603  7411114.402669 
+314322.502458  7411112.393013 
+314315.047866  7411107.943775 
+314308.920916  7411097.285601 
+314299.116148  7411079.728608 
+314297.343209  7411071.609999 
+314292.395470  7411066.560864 
+314284.891400  7411065.850985 
+314278.055275  7411062.021641 
+314274.369210  7411056.372609 
+314271.318105  7411049.483789 
+314266.419844  7411040.705292 
+314259.591965  7411036.266053 
+314242.736669  7411032.316729 
+314230.210645  7411032.156757 
+314222.648851  7411035.796133 
+314207.517018  7411044.324672 
+314193.663351  7411050.373636 
+314183.602949  7411053.983018 
+314175.430935  7411056.372609 
+314170.417226  7411056.312619 
+314164.818036  7411053.753057 
+314154.271107  7411045.524467 
+314135.725334  7411026.607707 
+314123.924978  7411018.989012 
+314113.312079  7411016.369461 
+314099.573859  7411013.699918 
+314083.939006  7411012.260165 
+314065.830283  7411007.670951 
+314047.762792  7411000.592163 
+314034.709009  7410992.953472 
+314019.882286  7410977.206169 
+314015.025256  7410964.688313 
+314012.642095  7410955.319918 
+314016.575547  7410941.672256 
+314025.514462  7410927.464689 
+314033.166964  7410916.976486 
+314035.797511  7410907.048187 
+314036.605642  7410892.110745 
+314032.317602  7410884.592033 
+314025.497969  7410879.522901 
+314014.835593  7410880.632711 
+313979.088183  7410885.161936 
+313962.801877  7410885.581864 
+313945.921843  7410883.502220 
+313938.442512  7410880.912663 
+313933.470035  7410877.733208 
+313929.759231  7410873.953855 
+313927.953307  7410868.324820 
+313929.924156  7410860.886094 
+313938.813592  7410851.027782 
+313955.273069  7410836.920199 
+313959.107566  7410831.361151 
+313959.800249  7410825.772108 
+313956.147169  7410817.623504 
+313948.676084  7410814.424052 
+313933.041231  7410812.354407 
+313917.950629  7410817.763480 
+313899.066761  7410825.002240 
+313885.831561  7410832.300990 
+313872.538637  7410843.349098 
+313857.258371  7410863.695613 
+313841.986352  7410882.812338 
+313833.022700  7410898.259692 
+313821.626409  7410908.078010 
+313811.549515  7410912.937178 
+313796.458913  7410917.726358 
+313782.671215  7410918.796174 
+313759.524046  7410916.636544 
+313740.128911  7410915.766693 
+313735.106957  7410916.326597 
+313735.717178  7410910.757551 
+313734.859570  7410887.261576 
+313730.324143  7410871.024357 
+313725.120771  7410863.615626 
+313716.445737  7410852.097599 
+313704.859783  7410846.838500 
+313698.130859  7410839.909687 
+313689.670226  7410830.411314 
+313688.598216  7410819.283220 
+313685.002859  7410807.105306 
+313678.587292  7410796.897055 
+313675.585664  7410794.317496 
+313663.941986  7410792.847748 
+313647.754636  7410790.028231 
+313638.230239  7410783.039428 
+313633.562873  7410774.380911 
+313630.462290  7410748.325374 
+313636.704686  7410739.596870 
+313641.083435  7410735.887505 
+313648.768922  7410731.228303 
+313656.264746  7410723.289663 
+313659.744655  7410713.001425 
+313660.165213  7410703.163110 
+313643.276932  7410682.416664 
+313637.817928  7410675.497849 
+313629.093416  7410666.259432 
+313614.827437  7410655.151334 
+313604.288754  7410648.642449 
+313592.513136  7410640.103912 
+313574.379675  7410632.205265 
+313566.958068  7410621.467104 
+313559.289073  7410609.979072 
+313555.240174  7410594.751680 
+313547.884536  7410580.234167 
+313543.035753  7410567.026429 
+313535.407989  7410539.121209 
+313532.596025  7410510.796061 
+313531.136442  7410492.599178 
+313531.787894  7410469.883069 
+313534.649336  7410451.006302 
+313540.504160  7410435.209008 
+313551.339707  7410410.163299 
+313563.527636  7410394.725943 
+313572.623228  7410382.518034 
+313584.539031  7410368.350461 
+313601.419066  7410272.726840 
+313598.079342  7410260.548926 
+313596.248679  7410248.650964 
+313596.405357  7410240.072434 
+313592.653322  7410222.085515 
+313587.705584  7410214.676784 
+313575.921720  7410206.888118 
+313567.650751  7410201.189094 
+313553.821822  7410193.870348 
+313541.287552  7410185.321812 
+313537.081974  7410179.182863 
+313522.321221  7410167.054941 
+313515.831438  7410161.135955 
+313503.025041  7410153.327292 
+313494.259298  7410146.608443 
+313488.585892  7410137.420017 
+313475.581586  7410126.831831 
+313468.102255  7410118.873194 
+313462.635004  7410112.464292 
+313453.729075  7410099.186566 
+313451.345914  7410090.308087 
+313445.672507  7410081.369618 
+313435.933709  7410072.101205 
+313428.660534  7410067.432005 
+313421.205941  7410058.213584 
+313417.066333  7410048.545240 
+313416.052047  7410033.887751 
+313421.271911  7410025.139250 
+313426.458790  7410018.920315 
+313431.678654  7410010.431769 
+313442.720357  7410002.553118 
+313449.218387  7409993.834612 
+313464.391451  7409981.996640 
+313479.745932  7409974.187977 
+313491.826660  7409965.069539 
+313499.594610  7409955.871115 
+313512.368021  7409921.766956 
+313514.891367  7409907.929327 
+313517.802287  7409900.910529 
+313523.112859  7409887.122891 
+313529.124361  7409877.134601 
+313543.035753  7409864.766720 
+313554.432043  7409851.089063 
+313564.154349  7409831.822363 
+313570.668871  7409807.456537 
+313578.733685  7409795.728546 
+313584.423584  7409789.529607 
+313593.634624  7409785.150358 
+313605.319533  7409784.350495 
+313610.390965  7409784.180524 
+313626.166004  7409781.690950 
+313634.313280  7409779.821270 
+313646.575425  7409775.242055 
+313656.297731  7409770.112933 
+313666.044775  7409764.233940 
+313679.115051  7409756.385285 
+313695.797175  7409745.577136 
+313710.368265  7409739.028258 
+313727.009158  7409730.239763 
+313735.197665  7409726.350429 
+313741.283384  7409726.460411 
+313754.897910  7409731.499547 
+313760.678518  7409734.379054 
+313772.297457  7409737.618499 
+313778.185266  7409734.189087 
+313787.148918  7409729.549881 
+313799.707928  7409722.201140 
+313804.218616  7409710.923072 
+313806.362636  7409704.144233 
+313806.065772  7409692.026309 
+313805.315365  7409676.868905 
+313802.932204  7409667.990426 
+313802.041611  7409660.651683 
+313798.405023  7409650.743380 
+313795.040561  7409640.335163 
+313792.937772  7409629.696985 
+313792.847064  7409620.348587 
+313794.397355  7409603.971392 
+313796.269250  7409584.064802 
+313799.122445  7409580.075485 
+313810.873324  7409575.486271 
+313822.335585  7409573.166668 
+313832.808298  7409568.817413 
+313840.864865  7409557.599335 
+313844.905518  7409544.041657 
+313852.838392  7409525.504832 
+313858.495306  7409506.418102 
+313864.836657  7409491.890590 
+313870.905883  7409478.372906 
+313879.432486  7409469.434437 
+313888.758972  7409458.496310 
+313905.779193  7409442.399068 
+313923.170493  7409434.120486 
+313941.130783  7409422.582462 
+313954.959712  7409415.263716 
+313969.357631  7409404.405576 
+313977.628600  7409395.467107 
+313985.495504  7409380.719633 
+313990.855554  7409364.152471 
+313995.597137  7409353.894228 
+314001.328267  7409330.768189 
+314006.127573  7409317.480465 
+314012.238030  7409301.433214 
+314017.680542  7409280.326829 
+314020.508999  7409263.459718 
+314022.669512  7409241.283517 
+314027.171954  7409215.367956 
+314028.557321  7409194.191583 
+314033.851401  7409167.026237 
+314039.887642  7409134.261849 
+314044.587993  7409122.963784 
+314051.283932  7409114.215283 
+314059.761057  7409105.736735 
+314073.350845  7409092.778955 
+314084.186393  7409077.771525 
+314090.412297  7409065.993543 
+314098.773975  7409045.407069 
+314098.402894  7409034.558927 
+314097.586517  7409017.901780 
+314093.438663  7409004.744034 
+314084.573965  7408982.947768 
+314063.282198  7408961.511439 
+314049.568716  7408942.444705 
+314041.569873  7408933.266278 
+314036.407732  7408919.338663 
+314034.832702  7408903.181431 
+314036.778813  7408889.333803 
+314042.064646  7408871.486860 
+314044.472546  7408861.168627 
+314043.351058  7408849.050703 
+314038.683692  7408836.642828 
+314030.660109  7408828.984140 
+314018.612366  7408819.255807 
+314006.515146  7408813.066867 
+313994.690051  7408805.358187 
+313975.764952  7408797.829477 
+313948.486421  7408789.440914 
+313931.045643  7408785.201640 
+313906.546092  7408777.352984 
+313877.486375  7408769.194382 
+313856.252331  7408764.155245 
+313833.533966  7408755.826671 
+313820.191565  7408747.598081 
+313806.387375  7408736.589966 
+313794.083998  7408726.111761 
+313785.631612  7408712.894025 
+313782.275396  7408696.466839 
+313785.194562  7408685.908648 
+313790.463903  7408669.821403 
+313792.154380  7408655.973775 
+313790.290732  7408642.336111 
+313785.384225  7408628.658454 
+313780.700366  7408617.760321 
+313772.734507  7408605.312453 
+313767.308487  7408592.884582 
+313757.140885  7408574.107798 
+313749.983157  7408557.880578 
+313741.407077  7408554.251199 
+313738.388957  7408531.765051 
+313738.776529  7408499.740537 
+313743.460388  7408468.525883 
+313748.037046  7408446.889590 
+313750.618117  7408422.203818 
+313754.246458  7408395.008476 
+313761.593850  7408374.661961 
+313772.305703  7408348.306476 
+313784.270984  7408323.470730 
+313793.762395  7408293.315895 
+313798.941028  7408263.870939 
+313798.033943  7408233.846082 
+313802.907465  7408208.680393 
+313814.336741  7408185.864301 
+313824.421881  7408169.837046 
+313843.907724  7408152.160074 
+313860.103321  7408133.683239 
+313874.583702  7408110.397228 
+313888.833189  7408085.341519 
+313904.839122  7408061.315635 
+313919.261780  7408042.818803 
+313940.512316  7408026.171655 
+313958.654023  7408014.783605 
+313971.476912  7408002.565698 
+313981.248695  7407991.587579 
+313987.029303  7407974.500505 
+313991.820363  7407955.643735 
+313995.638368  7407933.997443 
+314007.166598  7407924.039149 
+314017.993899  7407909.291675 
+314032.870099  7407895.334066 
+314048.241073  7407882.146325 
+314065.376740  7407869.988407 
+314085.307880  7407857.110613 
+314098.048306  7407852.211452 
+314115.357144  7407846.612412 
+314133.391651  7407843.542937 
+314148.135911  7407840.683427 
+314159.062167  7407838.793751 
+314170.343010  7407828.335542 
+314181.665085  7407814.587897 
+314194.727114  7407803.649771 
+314209.289958  7407794.231384 
+314227.687298  7407782.593377 
+314247.610192  7407770.465455 
+314265.034477  7407755.787969 
+314274.501150  7407748.579204 
+314289.278395  7407742.700211 
+314301.977590  7407740.580574 
+314321.760297  7407740.550579 
+314332.397935  7407741.180471 
+314344.577618  7407740.820533 
+314359.297139  7407739.220807 
+314374.090877  7407732.082030 
+314387.210630  7407716.594682 
+314395.555816  7407697.277991 
+314401.097283  7407679.681005 
+314415.767327  7407661.694086 
+314432.004155  7407639.937813 
+314448.249229  7407617.681625 
+314460.371188  7407600.424581 
+314485.802564  7407572.979282 
+314502.154839  7407563.080978 
+314519.241029  7407554.952370 
+314529.227214  7407546.743776 
+314533.399807  7407536.955453 
+314535.131515  7407520.078344 
+314532.698877  7407511.219861 
+314527.528491  7407498.552031 
+314519.941959  7407476.015891 
+314519.142074  7407458.858830 
+314524.122798  7407445.051195 
+314533.721410  7407427.254244 
+314544.878560  7407405.947893 
+314552.918635  7407391.160426 
+314560.975202  7407375.113175 
+314565.510629  7407356.746321 
+314575.422598  7407333.660276 
+314584.996472  7407317.882978 
+314595.361984  7407299.596111 
+314605.174999  7407284.578683 
+314619.564671  7407268.601420 
+314639.833906  7407248.914792 
+314656.516031  7407232.707568 
+314674.228934  7407214.500687 
+314690.135913  7407199.303290 
+314700.691088  7407186.315514 
+314707.881801  7407178.576840 
+314717.348474  7407171.118118 
+314725.743137  7407169.198446 
+314735.877754  7407169.828339 
+314740.891463  7407174.677508 
+314752.164060  7407185.645629 
+314760.105180  7407200.113151 
+314770.165581  7407206.282094 
+314781.050606  7407207.671856 
+314792.479882  7407206.542050 
+314802.993826  7407196.833713 
+314816.336227  7407183.366020 
+314825.835884  7407173.637686 
+314838.312431  7407160.229983 
+314853.031953  7407138.153764 
+314866.984575  7407116.327503 
+314875.997705  7407081.823413 
+Region 1
+252
+343920.788828  7392520.207686 
+343850.374264  7392483.813920 
+343742.785693  7392426.073810 
+343715.886489  7392402.337876 
+343693.737113  7392377.812077 
+343620.799203  7392248.074300 
+343571.387789  7392211.550556 
+343577.737387  7392200.642425 
+343655.136507  7392134.113820 
+343671.604230  7392129.404627 
+343693.737113  7392125.465302 
+343725.386146  7392115.187062 
+343788.494549  7392080.562993 
+343868.565449  7392040.829799 
+343941.346681  7391992.568066 
+344002.269833  7391947.455793 
+344015.719435  7391938.367350 
+344018.094349  7391923.339924 
+344012.561129  7391886.156293 
+344066.351291  7391871.918732 
+344154.157155  7391847.392933 
+344230.888331  7391821.287405 
+344260.162450  7391803.090522 
+344316.327527  7391766.706754 
+344362.209554  7391735.852039 
+344411.258134  7391720.824613 
+344419.957907  7391650.416673 
+344417.582993  7391623.521280 
+344394.641979  7391528.597540 
+344339.268541  7391424.175426 
+344338.691304  7391418.866336 
+344321.316496  7391388.441547 
+344306.836115  7391360.096402 
+344291.803237  7391330.831415 
+344272.638997  7391296.097365 
+344251.454430  7391256.474152 
+344228.513417  7391212.961605 
+344214.280423  7391182.106890 
+344207.155679  7391172.618516 
+344202.537790  7391164.879841 
+344184.214666  7391137.814477 
+344174.368666  7391120.917372 
+344162.551818  7391099.740999 
+344145.003839  7391069.996094 
+344120.141454  7391033.392364 
+344116.974901  7391026.273583 
+344080.584285  7390971.682934 
+344047.360222  7390980.391443 
+344080.576039  7390971.682934 
+344080.584285  7390971.682934 
+344090.867335  7390965.364017 
+344208.738956  7390876.759194 
+344291.011599  7390883.088110 
+344333.727074  7390886.257567 
+344357.731851  7390887.677324 
+344410.466496  7390894.166212 
+344457.140161  7390897.325671 
+344506.972133  7390902.864722 
+344552.070769  7390909.193638 
+344596.369520  7390914.732689 
+344613.043398  7390915.402575 
+344646.201491  7390918.682013 
+344697.616740  7390926.600656 
+344761.706444  7390934.509302 
+344786.222488  7390936.878896 
+344807.910074  7390937.458796 
+344817.739581  7390934.599286 
+344827.882445  7390928.310364 
+344840.812535  7390925.810792 
+344929.410037  7390874.389600 
+344983.991837  7390852.233395 
+345006.701957  7390837.985835 
+345043.323467  7390825.338002 
+345056.146356  7390819.509000 
+345070.107224  7390813.909959 
+345089.213741  7390804.771525 
+345106.580302  7390793.013539 
+345130.156276  7390774.256752 
+345141.395888  7390765.658224 
+345149.328762  7390756.519790 
+345188.003584  7390719.026212 
+345229.531601  7390684.702091 
+345238.899319  7390678.043232 
+345250.757399  7390674.673809 
+345284.599929  7390662.295929 
+345303.607491  7390662.315926 
+345319.613425  7390663.535717 
+345391.949360  7390687.321643 
+345467.377632  7390713.707123 
+345506.308087  7390720.585945 
+345538.542602  7390722.505616 
+345566.381877  7390720.206010 
+345600.447056  7390712.697296 
+345633.860782  7390701.719177 
+345677.722483  7390675.953590 
+345689.225975  7390667.705003 
+345772.290256  7390589.388418 
+345820.126640  7390549.035330 
+345848.238040  7390525.309394 
+345864.903673  7390511.921687 
+345922.990121  7390469.149014 
+345960.568194  7390446.992809 
+345991.499805  7390433.065195 
+346028.929446  7390421.347202 
+346068.940157  7390415.348229 
+346121.518124  7390407.269613 
+346124.049717  7390406.149805 
+346162.262750  7390396.271497 
+346216.077651  7390380.554189 
+346251.132377  7390365.706732 
+346258.694171  7390382.663828 
+346263.221351  7390398.441125 
+346271.583029  7390408.939327 
+346278.460386  7390424.736621 
+346283.251446  7390435.194830 
+346280.752838  7390449.572367 
+346282.088727  7390458.440848 
+346287.539486  7390464.369832 
+346295.348666  7390468.769079 
+346300.156219  7390477.457591 
+346301.607555  7390485.336241 
+346306.052273  7390489.705493 
+346313.490374  7390500.523640 
+346320.293514  7390513.551408 
+346322.833353  7390524.209582 
+346330.279699  7390534.477823 
+346343.721055  7390547.135655 
+346352.709446  7390556.424064 
+346362.266828  7390569.481828 
+346366.587853  7390586.028993 
+346366.892963  7390595.557361 
+346369.036983  7390615.064020 
+346378.363470  7390628.701684 
+346390.246288  7390646.078707 
+346401.106574  7390661.696032 
+346406.730503  7390670.394542 
+346416.205422  7390691.090997 
+346424.113558  7390715.986733 
+346429.028311  7390734.083633 
+346443.986974  7390747.751292 
+346455.902777  7390760.389127 
+346460.718575  7390777.606178 
+346464.388148  7390797.692737 
+346463.951098  7390829.247332 
+346455.399757  7390866.151011 
+346454.789536  7390877.289103 
+346450.410787  7390923.691155 
+346450.146908  7390948.156964 
+346452.084772  7390967.893583 
+346459.819736  7390994.369048 
+346468.445294  7391023.883993 
+346482.843212  7391052.159149 
+346491.658433  7391089.102821 
+346510.097005  7391121.967192 
+346558.287977  7391169.429062 
+346582.919467  7391235.027826 
+346607.130401  7391291.318184 
+346622.872455  7391338.000187 
+346633.765726  7391359.706469 
+346723.748594  7391468.767788 
+346736.406558  7391460.999119 
+346748.330608  7391451.690713 
+346765.499260  7391457.399735 
+346771.040727  7391491.413909 
+346777.373832  7391532.546863 
+346778.157224  7391546.784425 
+346767.865928  7391591.876701 
+346755.216211  7391653.586130 
+346704.996666  7391885.286442 
+346684.867617  7391909.972214 
+346624.348530  7391987.368956 
+346565.338504  7392082.332690 
+346516.306416  7392184.595173 
+346486.232413  7392292.756646 
+346477.549132  7392398.968453 
+346479.924047  7392470.166258 
+346480.723931  7392523.957044 
+346476.757494  7392577.747830 
+346463.307892  7392630.748751 
+346455.399757  7392652.105093 
+346442.741793  7392679.790351 
+346422.183940  7392720.143439 
+346403.176378  7392745.449104 
+346376.293666  7392773.934225 
+346263.163628  7392865.698506 
+346228.356288  7392901.292410 
+346100.993256  7393158.388371 
+346063.019364  7393227.996448 
+346022.678804  7393283.376962 
+345984.787374  7393324.199969 
+345923.583850  7393378.540661 
+345873.141657  7393416.724121 
+345795.346717  7393465.515763 
+345769.626724  7393483.962603 
+345741.853419  7393512.777668 
+345679.157327  7393578.416424 
+345617.863095  7393643.945200 
+345566.085013  7393697.206077 
+345398.183510  7393875.395555 
+345355.921578  7393919.937925 
+345279.173910  7394006.163155 
+345236.326495  7394060.013931 
+345212.552612  7394097.157569 
+345208.652145  7394101.936750 
+345185.076172  7394137.180713 
+345149.056636  7394192.841179 
+345116.962307  7394154.687714 
+345079.705837  7394106.685937 
+345076.539284  7394101.146885 
+345052.641708  7394071.002049 
+345039.357030  7394058.424203 
+344991.108335  7394021.250571 
+344940.303308  7393987.516349 
+344905.570184  7393968.749564 
+344885.911170  7393956.171718 
+344810.755024  7393910.289577 
+344767.610745  7393877.295229 
+344762.489836  7393871.536216 
+344722.817220  7393825.514099 
+344739.012817  7393811.626478 
+344767.132464  7393789.920196 
+344787.022372  7393771.853290 
+344757.756500  7393710.943724 
+344742.723621  7393680.099007 
+344714.241141  7393624.718493 
+344688.933459  7393556.690146 
+344666.775837  7393483.302716 
+344654.909511  7393420.023556 
+344634.541321  7393360.423765 
+344629.750261  7393350.075537 
+344616.176966  7393302.153746 
+344585.294832  7393250.942518 
+344548.904216  7393201.890920 
+344507.763771  7393158.378373 
+344457.931800  7393116.255588 
+344402.550115  7393079.071958 
+344347.176676  7393044.467885 
+344293.386513  7393008.863984 
+344268.070585  7392984.938082 
+344226.938387  7392941.625501 
+344190.547771  7392893.173800 
+344174.723254  7392863.108950 
+344159.690376  7392829.884641 
+344147.172598  7392791.691183 
+344131.216141  7392754.737513 
+344117.774785  7392723.292899 
+344098.255957  7392689.438698 
+344081.186260  7392664.362993 
+344054.402503  7392628.809083 
+344025.639650  7392597.804394 
+343967.462493  7392552.642130 
+343920.788828  7392520.207686 
+Region 1
+248
+349181.216036  7394936.783748 
+349134.921697  7394844.179611 
+349102.332593  7394770.442241 
+349036.890507  7394673.808794 
+349082.723057  7394652.302477 
+349075.507605  7394634.605509 
+349056.030008  7394581.804553 
+349021.733935  7394496.059240 
+349013.157855  7394477.192472 
+348996.013942  7394454.896291 
+348966.863516  7394436.039521 
+348934.266167  7394420.602166 
+348908.150354  7394405.054829 
+348885.943255  7394393.146868 
+348860.660312  7394382.698658 
+348851.605951  7394378.309410 
+348828.087701  7394373.620213 
+348802.046104  7394379.539199 
+348775.130408  7394393.146868 
+348751.133876  7394403.435106 
+348733.289033  7394408.244282 
+348711.337567  7394404.124988 
+348682.533484  7394389.037572 
+348653.028470  7394369.830862 
+348629.741115  7394349.954267 
+348615.301965  7394336.216620 
+348596.780931  7394317.009910 
+348575.629349  7394300.402755 
+348564.043395  7394285.045385 
+348539.576829  7394277.136740 
+348520.156956  7394276.726810 
+348498.048812  7394277.016760 
+348471.718597  7394278.736466 
+348456.388854  7394282.605803 
+348428.359916  7394291.924207 
+348391.086954  7394305.601864 
+348368.756161  7394315.800117 
+348324.671812  7394327.808060 
+348284.751810  7394340.295921 
+348223.878135  7394353.103727 
+348101.322655  7394364.211825 
+347921.010576  7394383.298555 
+347829.056858  7394393.236853 
+347815.269160  7394394.876572 
+347780.503052  7394397.376144 
+347752.136018  7394404.394942 
+347713.791046  7394415.393058 
+347685.753862  7394425.081398 
+347661.180094  7394433.319987 
+347626.141860  7394449.337244 
+347609.913278  7394459.275541 
+347548.396398  7394499.508650 
+347318.458502  7394656.561748 
+347294.041414  7394675.868441 
+347218.505941  7394729.509253 
+347186.799184  7394750.175713 
+347176.351210  7394757.204509 
+347140.620292  7394769.772356 
+347066.610372  7394790.678775 
+347018.477124  7394806.536059 
+346962.971745  7394807.515891 
+346860.133003  7394806.746023 
+346822.472468  7394809.665523 
+346782.593696  7394816.694319 
+346686.409662  7394868.085516 
+346699.438706  7394919.356733 
+346704.221520  7394932.394500 
+346713.242897  7394970.258014 
+346724.771127  7395020.579395 
+346738.641287  7395065.541693 
+346741.857317  7395074.060234 
+346746.598900  7395097.636196 
+346756.453145  7395130.210616 
+346763.338748  7395156.226160 
+346770.941772  7395186.081046 
+346784.152234  7395234.612733 
+346850.303496  7395310.679703 
+346862.268777  7395324.447345 
+346881.787605  7395351.112778 
+346907.367412  7395406.183344 
+346914.599357  7395423.100447 
+346934.175908  7395449.815871 
+346950.767324  7395474.181697 
+346964.530283  7395488.949167 
+346981.987553  7395508.755775 
+346996.146331  7395522.783372 
+347014.890014  7395536.141084 
+347045.697931  7395555.087838 
+347084.884019  7395573.624663 
+347101.129094  7395580.663458 
+347124.927715  7395589.561933 
+347162.093477  7395597.210623 
+347177.184079  7395604.819320 
+347205.922193  7395630.164978 
+347213.269584  7395625.355802 
+347231.411292  7395615.077563 
+347254.038949  7395608.698655 
+347290.066730  7395599.180286 
+347318.062683  7395591.771555 
+347326.259437  7395590.031853 
+347416.737079  7395575.204393 
+347449.680771  7395572.064930 
+347569.737643  7395549.508794 
+347523.360842  7395610.978265 
+347457.910509  7395688.844927 
+347404.367733  7395763.672110 
+347334.076863  7395844.648239 
+347280.517595  7395911.086859 
+347310.641076  7395928.273915 
+347269.236752  7396004.040937 
+347234.421166  7396063.240796 
+347202.697917  7396121.100886 
+347183.987219  7396159.784259 
+347170.743773  7396193.348510 
+347157.467342  7396220.433871 
+347127.871620  7396265.856090 
+347122.561047  7396275.024520 
+347113.448962  7396289.142102 
+347102.811325  7396304.029552 
+347082.690522  7396333.044581 
+347075.087497  7396342.972881 
+347035.456113  7396393.084297 
+347007.460160  7396427.338430 
+346934.175908  7396511.733974 
+346913.123281  7396540.808993 
+346870.003741  7396595.929552 
+346849.998386  7396653.999605 
+346767.000074  7396758.541698 
+346753.583457  7396787.756693 
+346743.242684  7396808.623119 
+346729.083906  7396834.408702 
+346713.003756  7396857.004832 
+346682.146361  7396882.460472 
+346606.000667  7396934.001643 
+346663.650065  7397002.509908 
+346678.658205  7396992.001708 
+346706.852068  7396972.755005 
+346732.027810  7396958.037526 
+346751.439437  7396947.169387 
+346776.516224  7396935.491388 
+346811.076177  7396920.004041 
+346833.621372  7396904.226743 
+346866.771219  7396881.600619 
+346876.039982  7396876.561482 
+346969.593469  7396800.504510 
+347090.244069  7396673.536258 
+347142.912744  7396617.095926 
+347183.212074  7396579.642342 
+347230.331036  7396529.600913 
+347266.078445  7396501.295762 
+347291.567544  7396481.419166 
+347312.884051  7396469.931134 
+347347.138893  7396453.453956 
+347369.601625  7396443.085732 
+347395.874116  7396433.877310 
+347446.530711  7396421.159488 
+347491.860240  7396412.650946 
+347535.169444  7396407.641804 
+347549.080835  7396444.745448 
+347559.776196  7396471.230911 
+347602.846259  7396526.611425 
+347651.647452  7396591.260351 
+347795.181342  7396749.863184 
+347881.189528  7396843.797094 
+347954.886091  7396922.083684 
+347954.935569  7396922.053690 
+348032.392413  7397015.107750 
+348016.922484  7397058.280355 
+347984.885878  7397148.324931 
+347963.124076  7397175.420290 
+347931.029746  7397267.334546 
+347919.732410  7397285.871371 
+347963.445679  7397278.942558 
+348020.179746  7397333.523209 
+348135.057985  7397497.035200 
+348145.316296  7397485.957098 
+348149.117808  7397480.238078 
+348151.773094  7397476.418732 
+348156.712586  7397471.069648 
+348164.686691  7397461.521284 
+348186.011444  7397452.322859 
+348205.571503  7397446.363880 
+348224.867683  7397445.733988 
+348249.227048  7397449.543335 
+348287.390603  7397450.503171 
+348309.498748  7397454.252529 
+348370.636302  7397482.077763 
+348438.090469  7397519.371374 
+348523.001906  7397564.603627 
+348534.109578  7397567.783082 
+348545.217251  7397565.393491 
+348599.180584  7397529.689607 
+348671.302117  7397490.556310 
+348691.851724  7397480.208083 
+348733.297279  7397481.267901 
+348828.516505  7397492.375999 
+348865.063799  7397504.653895 
+348920.577424  7397528.089881 
+348977.723802  7397551.105939 
+349034.853688  7397575.701726 
+349094.366735  7397598.717783 
+349152.296505  7397622.523705 
+349207.843115  7397644.739900 
+349359.408834  7397700.300383 
+349420.562880  7397726.975814 
+349439.883799  7397734.424538 
+349485.666871  7397479.588189 
+349504.542493  7397377.255718 
+349508.665609  7397350.580287 
+349528.473055  7397227.991285 
+349557.796651  7397071.808038 
+349564.772962  7397028.975375 
+349576.053805  7396970.225438 
+349585.578202  7396896.428079 
+349593.519322  7396861.504061 
+349599.811196  7396825.810175 
+349607.570899  7396790.106291 
+349608.593431  7396721.048120 
+349605.418633  7396657.558995 
+349598.269151  7396621.065246 
+349595.102598  7396588.520821 
+349581.801428  7396531.910518 
+349572.499680  7396487.558115 
+349562.628942  7396463.452244 
+349552.469586  7396442.385852 
+349542.837988  7396422.829202 
+349533.396054  7396403.672484 
+349505.416594  7396377.436977 
+349486.549218  7396329.155248 
+349468.506465  7396313.287966 
+349449.432934  7396287.542376 
+349450.117371  7396152.125571 
+349463.616450  7396129.989363 
+349485.716349  7396101.494244 
+349508.616131  7396063.180807 
+349625.061154  7396003.940954 
+349602.639653  7395981.724759 
+349531.689084  7395906.387664 
+349487.307871  7395863.325040 
+349443.800758  7395807.954525 
+349418.996096  7395688.824930 
+349399.081449  7395620.606616 
+349374.870516  7395552.828225 
+349340.978508  7395393.055593 
+349290.899150  7395200.498576 
+349202.549034  7395015.310297 
+349200.124643  7394986.265273 
+349181.216036  7394936.783748 
+Region 1
+115
+331139.568375  7398194.775684 
+331145.637601  7398238.988111 
+331157.124600  7398323.783586 
+330389.755115  7398425.616143 
+330238.948049  7398440.953516 
+329851.350470  7398485.715848 
+329395.482347  7398538.076879 
+329263.649858  7398549.594906 
+329181.162813  7398557.763507 
+328821.404508  7398601.735975 
+328705.478998  7398637.709813 
+328615.537360  7398687.691252 
+328421.668478  7398807.610711 
+328317.708248  7398902.424470 
+328241.785202  7398973.502295 
+328141.857379  7399021.464080 
+327890.619470  7399056.238123 
+327687.193206  7399107.099411 
+327604.978287  7399124.166488 
+327502.287977  7399141.383538 
+327116.537553  7399213.321216 
+327105.050554  7399145.072906 
+327095.823022  7399102.290235 
+327092.532776  7399019.634393 
+327088.129289  7398984.530406 
+327088.467384  7398979.811214 
+327157.414118  7398854.862617 
+327190.613443  7398800.841870 
+327199.230754  7398784.624648 
+327204.425879  7398767.957503 
+327206.668854  7398746.291214 
+327205.967925  7398717.346172 
+327205.877216  7398702.978633 
+327210.058055  7398677.463004 
+327215.879894  7398668.454547 
+327222.641803  7398649.817739 
+327330.015972  7398465.119376 
+327336.217138  7398453.081438 
+327353.798101  7398428.965569 
+327363.141081  7398397.071032 
+327395.276641  7398353.138558 
+327460.891899  7398241.927607 
+327509.792046  7398139.425165 
+327559.186968  7398037.662596 
+327587.842620  7397981.352241 
+327733.759671  7397726.455903 
+327815.685972  7397640.850566 
+327930.646674  7397541.787535 
+327964.901516  7397503.874029 
+328048.526541  7397469.529912 
+328093.880809  7397458.611782 
+328131.838209  7397442.654515 
+328168.261810  7397423.387816 
+328199.861366  7397404.161109 
+328246.568016  7397365.287768 
+328257.139684  7397305.528004 
+328268.140155  7397230.790806 
+328283.511129  7397211.914039 
+328399.362424  7397107.361948 
+328485.263408  7397045.412559 
+328559.520715  7396989.872073 
+328632.038068  7396939.930627 
+328663.142850  7396920.453964 
+328690.437873  7396904.796646 
+328737.762991  7396883.450302 
+328796.146304  7396846.536625 
+329060.553443  7396679.945161 
+329161.693462  7396621.455179 
+329188.073154  7396600.328798 
+329240.280040  7396568.444260 
+329359.866877  7396543.888466 
+329486.289839  7396515.243372 
+329616.027786  7396489.867719 
+329680.397862  7396480.359348 
+329730.073156  7396471.450874 
+329838.478104  7396443.395679 
+329954.766448  7396418.369966 
+330026.467424  7396402.212734 
+330118.973639  7396340.983222 
+330211.751980  7396284.582883 
+330162.926049  7396173.591894 
+330199.902147  7396071.269421 
+330213.722829  7396052.872572 
+330222.059769  7396074.118933 
+330293.109292  7396239.940529 
+330363.523855  7396390.924667 
+330429.559670  7396542.708668 
+330466.247150  7396616.925955 
+330460.450050  7396713.489415 
+330456.722754  7396819.181311 
+330458.767819  7396868.192915 
+330457.456669  7396919.554118 
+330458.149352  7396984.532987 
+330459.213116  7397083.336063 
+330476.084904  7397134.487302 
+330480.999657  7397149.084801 
+330498.926963  7397245.178341 
+330510.001650  7397294.999807 
+330551.719331  7397477.308579 
+330567.073813  7397547.076629 
+330578.197978  7397586.129939 
+330587.466741  7397611.735553 
+330607.991609  7397652.518568 
+330635.162939  7397701.900109 
+330657.411269  7397734.804473 
+330692.136147  7397777.527155 
+330734.769159  7397825.039016 
+330793.482321  7397889.997889 
+330871.334985  7397986.731320 
+330942.928759  7398062.308374 
+330981.331455  7398110.820065 
+331057.691551  7398153.602736 
+331066.622219  7398158.281935 
+331110.789030  7398177.908573 
+331139.568375  7398194.775684 
+Region 1
+104
+332883.440001  7393972.568910 
+332834.737763  7393981.237425 
+332776.849224  7393992.055572 
+332680.590974  7394004.803388 
+332622.026244  7394018.381062 
+332506.513045  7394035.928057 
+332485.246016  7394039.187498 
+332451.288038  7394042.966851 
+332422.838542  7394046.116312 
+332403.558855  7394053.924974 
+332383.363836  7394063.463340 
+332320.016292  7394088.599035 
+332237.306599  7394120.463577 
+332216.303449  7394128.482203 
+332195.193099  7394138.010571 
+332174.998080  7394148.418788 
+332140.116525  7394177.893739 
+332124.506410  7394190.031660 
+332110.743451  7394207.368691 
+332094.218005  7394242.042751 
+332083.201041  7394265.448742 
+332074.946564  7394302.732356 
+332069.438082  7394323.538792 
+332046.257927  7394412.353578 
+332039.141430  7394433.629934 
+332010.592980  7394503.887899 
+331988.954871  7394549.330116 
+331983.256725  7394559.408389 
+331968.462987  7394541.271496 
+331937.061341  7394526.514024 
+331922.267603  7394514.856021 
+331908.991172  7394498.378843 
+331900.044012  7394481.391753 
+331892.861545  7394460.065406 
+331885.687324  7394444.848012 
+331838.997166  7394483.041470 
+331682.137367  7394428.010897 
+331567.300359  7394386.358031 
+331478.100882  7394329.657744 
+331400.899671  7394285.885241 
+331372.862486  7394267.158449 
+331244.163565  7394191.021491 
+331112.702156  7394113.314801 
+331065.302822  7394085.219614 
+331030.149141  7394067.272688 
+331017.128343  7394053.065121 
+330989.627163  7394009.142645 
+330931.911795  7393929.406303 
+330870.048573  7393837.811992 
+330806.181516  7393749.777072 
+330699.302121  7393599.372835 
+330801.538889  7393511.227933 
+330894.861481  7393420.303508 
+330953.483934  7393366.462730 
+331028.846236  7393298.264412 
+331103.087051  7393230.246063 
+331168.628092  7393169.086539 
+331240.576454  7393109.116811 
+331390.410465  7392972.170269 
+331536.789305  7392841.392670 
+331650.760459  7392741.629758 
+331671.359543  7392723.602846 
+331692.156537  7392705.036027 
+331727.186525  7392674.131320 
+331896.687796  7392539.074454 
+331984.056610  7392468.866480 
+332000.029558  7392457.088498 
+332079.572699  7392394.139280 
+332219.989515  7392274.429785 
+332337.028266  7392179.646021 
+332461.076314  7392090.601274 
+332497.986442  7392078.373368 
+332541.609002  7392058.756728 
+332559.536308  7392053.557619 
+332555.619348  7392250.453892 
+332557.515981  7392291.436872 
+332555.710057  7392351.046662 
+332577.702754  7392584.276711 
+332580.803337  7392653.954776 
+332583.293698  7392701.066706 
+332584.753281  7392746.688892 
+332582.634000  7392791.091286 
+332575.220638  7392839.113060 
+332573.876503  7392885.275153 
+332572.837478  7392917.239678 
+332578.560362  7392958.982528 
+332583.170005  7392994.156503 
+332591.572914  7393028.010704 
+332603.538194  7393079.041963 
+332610.011485  7393103.287810 
+332616.913581  7393138.681747 
+332625.151565  7393236.764946 
+332635.187228  7393320.950526 
+332641.388393  7393377.150899 
+332653.543337  7393423.622939 
+332669.153452  7393463.186162 
+332691.071933  7393516.607012 
+332714.639660  7393561.139384 
+332749.430507  7393607.281480 
+332766.764084  7393643.535270 
+332783.710088  7393687.697705 
+332806.510916  7393761.085135 
+332838.316627  7393850.359843 
+332883.440001  7393972.568910 
+Region 1
+120
+336981.824879  7397158.343215 
+336633.685514  7397505.313782 
+336447.469133  7397638.350994 
+336366.697304  7397670.655461 
+336275.823842  7397702.969926 
+336197.072340  7397711.048542 
+336150.819232  7397710.118701 
+335944.655219  7397680.753731 
+335969.196002  7397597.128055 
+335989.118895  7397520.771135 
+336000.003920  7397482.547682 
+336009.132497  7397449.823287 
+336038.802435  7397323.244969 
+336046.026133  7397286.361287 
+336088.180864  7397241.199023 
+336000.003920  7397141.376122 
+335983.371272  7397124.139074 
+335961.964058  7397100.653097 
+335895.689102  7397028.375478 
+335841.511366  7396969.895495 
+335788.347918  7396911.155556 
+335708.483174  7396822.300776 
+335608.951170  7396714.019324 
+335504.867247  7396602.918355 
+335403.067529  7396491.327469 
+335420.648493  7396474.910281 
+335488.391278  7396414.320660 
+335504.191056  7396397.133604 
+335574.721066  7396336.044068 
+335582.629202  7396325.665845 
+335644.756303  7396271.635100 
+335654.709504  7396257.977440 
+335678.640065  7396238.040855 
+335711.509540  7396204.936525 
+335778.229792  7396145.606688 
+335806.778243  7396115.031925 
+335815.816112  7396082.297532 
+335844.158407  7395989.423441 
+335876.409415  7395877.872548 
+335922.143010  7395706.351928 
+335942.206089  7395626.815552 
+335977.013428  7395504.076576 
+335995.394277  7395473.701779 
+336038.472585  7395441.887229 
+336070.138111  7395416.821522 
+336086.556356  7395389.496203 
+336117.743601  7395337.635086 
+336138.713765  7395302.301139 
+336158.339794  7395270.136648 
+336216.475720  7395186.211024 
+336276.516526  7395188.630609 
+336572.729377  7395262.567944 
+336685.513073  7395293.952569 
+336808.687020  7395371.189339 
+336984.925462  7395475.271510 
+337132.285603  7395575.474346 
+337206.922237  7395491.548722 
+337262.378138  7395428.069596 
+337327.836717  7395353.772322 
+337376.464739  7395297.102029 
+337475.097904  7395180.921930 
+337506.590259  7395143.058415 
+337605.990323  7395029.127931 
+337663.573752  7394962.509342 
+337698.108965  7394922.766149 
+337759.139318  7394852.738145 
+337815.568275  7394785.729623 
+337848.759353  7394747.916100 
+337904.611073  7394684.296997 
+337958.211573  7394639.784622 
+337995.360842  7394607.700117 
+338025.616262  7394580.524772 
+338061.644044  7394546.900532 
+338115.640362  7394499.328680 
+338169.257353  7394451.756829 
+338217.926607  7394405.674722 
+338279.212593  7394351.314034 
+338333.967564  7394304.512051 
+338375.371889  7394264.068978 
+338379.956793  7394260.299624 
+338450.890869  7394334.326944 
+338477.682872  7394362.092188 
+338524.076166  7394411.433736 
+338581.041127  7394473.103173 
+338732.722294  7394630.786163 
+338703.233773  7394679.957740 
+338878.911470  7394746.326372 
+338862.287070  7394795.138011 
+338847.847920  7394841.570058 
+338834.942569  7394888.032099 
+338807.952656  7395002.742450 
+338793.752647  7395086.168160 
+338758.153669  7395250.370034 
+338740.226363  7395335.935377 
+338708.173265  7395486.209637 
+338688.613206  7395604.439385 
+338661.013072  7395771.280807 
+338652.527701  7395805.604927 
+338637.321651  7395857.096107 
+338626.502597  7395885.361266 
+338616.763798  7395905.987732 
+338604.782025  7395930.833477 
+338588.990493  7395956.839022 
+338573.561796  7395979.415155 
+338558.528917  7396005.050764 
+338542.003471  7396033.725852 
+338526.269663  7396066.970158 
+338462.196451  7396344.182674 
+338383.337747  7396580.802143 
+338340.927383  7396755.842160 
+338321.961053  7396813.082355 
+338306.367430  7396863.453727 
+338283.632573  7396926.053005 
+338252.948348  7396994.811227 
+338206.431361  7397106.442105 
+337821.777686  7396988.232354 
+337576.386355  7396931.912001 
+337391.332693  7396931.912001 
+337194.214796  7397000.300287 
+336981.824879  7397158.343215 
+Region 1
+74
+333821.052918  7396075.218745 
+333729.676437  7396099.864523 
+333632.989382  7396125.490134 
+333556.340668  7396145.636683 
+333432.737917  7396179.760838 
+333355.322304  7396201.427126 
+333314.742603  7396207.546078 
+333263.723174  7396222.513514 
+333226.928493  7396231.451983 
+333185.812787  7396242.400108 
+333078.718989  7396269.485469 
+332929.998220  7396307.788908 
+332916.062090  7396308.218834 
+332896.856619  7396295.920940 
+332818.270040  7396299.800276 
+332794.694067  7396302.709778 
+332685.670652  7396309.468620 
+332492.832548  7396624.534652 
+332439.479436  7396805.113720 
+332399.608911  7396868.092933 
+332328.617111  7396927.462763 
+332281.968184  7396961.047010 
+332224.120876  7396972.245092 
+332169.167995  7396976.304397 
+332016.959070  7397003.399756 
+331995.799242  7397004.029648 
+331968.693882  7397002.339937 
+331765.383065  7396968.455741 
+331762.670055  7397072.437930 
+331759.816860  7397168.441486 
+331704.319727  7397269.404192 
+331651.486128  7397365.547723 
+331604.202241  7397438.875163 
+331573.072720  7397497.215170 
+331509.568498  7397617.484569 
+331436.457417  7397744.902743 
+331363.659693  7397880.439527 
+331328.110193  7397965.235002 
+331299.471034  7397999.999047 
+331296.741531  7398008.977509 
+331274.542678  7398041.781890 
+331254.331167  7398071.996715 
+331236.445093  7398106.750762 
+331198.372246  7398138.695290 
+331139.568375  7398194.775684 
+331145.637601  7398238.988111 
+331157.124600  7398323.783586 
+331542.536928  7398255.255324 
+331752.411744  7398227.770032 
+332221.201710  7398166.210577 
+333145.323794  7398119.288614 
+333595.650450  7398089.513714 
+334098.390147  7398060.788635 
+334095.207102  7397991.890436 
+334091.413836  7397801.832991 
+334088.750304  7397633.881760 
+334085.303379  7397567.043209 
+334084.058199  7397468.200140 
+334082.491415  7397382.074892 
+334080.743214  7397329.973817 
+334080.767953  7397276.622955 
+334079.011505  7397178.539756 
+334077.147857  7397051.241561 
+334074.154476  7396897.007980 
+334073.725672  7396874.941759 
+334056.185939  7396718.558546 
+334029.426921  7396691.163239 
+334057.480597  7396642.061650 
+334104.838700  7396536.829675 
+334118.865538  7396494.736885 
+334115.360890  7396408.791607 
+334076.776777  7396249.198943 
+333982.068818  7396026.457097 
+333821.052918  7396075.218745 
+Region 1
+103
+335324.555167  7394205.758966 
+335270.806236  7394210.308187 
+335245.176951  7394213.087711 
+335209.413049  7394215.857237 
+334973.941933  7394238.813304 
+334784.418814  7394253.730749 
+334636.819531  7394264.608886 
+334542.111572  7394267.818336 
+334486.037204  7394270.827821 
+334405.347837  7394276.366872 
+334284.911638  7394282.485824 
+334135.778557  7394293.573924 
+334091.554022  7394278.196558 
+334052.235994  7394368.041169 
+334017.263730  7394444.888006 
+334196.338875  7394497.159052 
+334182.361514  7394504.187848 
+334166.273118  7394523.774493 
+334144.428853  7394584.504091 
+334138.928617  7394618.258309 
+334133.733492  7394643.394003 
+334124.720362  7394669.499532 
+334117.496664  7394693.085492 
+334107.741373  7394718.181193 
+334093.153791  7394745.276552 
+334071.540420  7394782.070249 
+334043.222864  7394834.061344 
+334027.752936  7394904.139340 
+334015.630977  7394957.900131 
+334016.867911  7394984.985492 
+334014.888816  7395049.254483 
+334017.123544  7395134.299916 
+334020.372559  7395193.259816 
+334021.172444  7395236.302443 
+334012.283007  7395278.225262 
+333992.211682  7395349.133117 
+333971.892969  7395423.830322 
+333957.676468  7395454.315100 
+333947.517112  7395476.431312 
+333933.053223  7395502.336874 
+333919.339741  7395520.383783 
+333899.293155  7395541.460173 
+333879.246568  7395560.216960 
+333830.552576  7395600.850000 
+333884.870497  7395785.938296 
+333907.324983  7395848.817525 
+333982.068818  7396026.457097 
+334076.776777  7396249.198943 
+334113.934292  7396408.831600 
+334184.876614  7396381.876217 
+334205.417975  7396378.426808 
+334306.178667  7396351.301454 
+334411.252138  7396323.436227 
+334507.873223  7396312.538094 
+334605.500347  7396302.929740 
+334756.373383  7396289.032120 
+334874.756270  7396281.063485 
+334979.969927  7396274.794559 
+335045.651154  7396268.285674 
+335107.877211  7396336.993905 
+335176.411634  7396413.840742 
+335272.397758  7396520.072545 
+335317.249007  7396569.614059 
+335403.067529  7396491.327469 
+335420.648493  7396474.910281 
+335488.391278  7396414.320660 
+335504.191056  7396397.133604 
+335574.721066  7396336.044068 
+335582.629202  7396325.665845 
+335644.756303  7396271.635100 
+335654.709504  7396257.977440 
+335678.640065  7396238.040855 
+335711.509540  7396204.936525 
+335778.229792  7396145.606688 
+335806.778243  7396115.031925 
+335815.816112  7396082.297532 
+335844.158407  7395989.423441 
+335876.409415  7395877.872548 
+335922.143010  7395706.351928 
+335942.206089  7395626.815552 
+335977.013428  7395504.076576 
+335995.394277  7395473.701779 
+336038.472585  7395441.887229 
+336070.138111  7395416.821522 
+336086.556356  7395389.496203 
+336117.743601  7395337.635086 
+336138.713765  7395302.301139 
+336158.339794  7395270.136648 
+336216.475720  7395186.211024 
+336182.369310  7395177.112582 
+335857.632747  7395110.094062 
+335656.894755  7395017.779874 
+335587.263583  7395004.422162 
+335344.659478  7394957.800148 
+335168.849840  7394911.948002 
+335228.503073  7394820.743625 
+335289.929245  7394724.460117 
+335280.042014  7394715.811599 
+335500.150403  7394362.392136 
+335608.637813  7394186.182320 
+335438.781954  7394195.670694 
+335375.846722  7394200.969787 
+335324.555167  7394205.758966 
+Region 1
+481
+325664.887603  7405456.271855 
+325545.927479  7405414.878945 
+325375.214012  7405273.403179 
+325324.532679  7405286.450944 
+325274.675968  7405281.921720 
+325238.417292  7405261.515215 
+325199.882656  7405207.124532 
+325145.243132  7405147.694712 
+325118.352174  7405098.673109 
+325087.041236  7405059.099887 
+325051.656660  7405018.696808 
+324976.995288  7404947.249046 
+324957.864033  7404905.696164 
+324947.539752  7404883.210016 
+324921.943452  7404833.278568 
+324903.348202  7404798.954448 
+324879.293947  7404768.209714 
+324859.799858  7404732.095900 
+324850.968145  7404701.531136 
+324843.010533  7404640.351615 
+324839.712040  7404625.194211 
+324820.011795  7404582.021606 
+324810.833741  7404562.534944 
+324805.209811  7404539.278928 
+324801.762887  7404516.492831 
+324803.717244  7404490.837225 
+324809.827701  7404463.391927 
+324815.550585  7404443.565323 
+324825.091473  7404417.259829 
+324850.506356  7404373.817270 
+324890.673746  7404322.176116 
+324922.949493  7404278.263637 
+324965.161947  7404294.360880 
+324996.951166  7404312.427785 
+325036.656767  7404316.237133 
+325061.378966  7404327.725165 
+325099.088979  7404353.840692 
+325135.916645  7404382.235828 
+325160.333734  7404397.323244 
+325197.598450  7404415.070204 
+325223.367921  7404405.861781 
+325248.403477  7404390.224460 
+325269.703491  7404354.720541 
+325290.112912  7404344.962213 
+325317.177041  7404353.840692 
+325351.786471  7404357.830008 
+325371.082651  7404360.049628 
+325391.063268  7404354.720541 
+325497.678784  7404348.431618 
+325543.692751  7404341.852745 
+325568.538644  7404344.962213 
+325614.799998  7404361.549371 
+325643.076322  7404363.599020 
+325777.217756  7404381.405970 
+325882.621077  7404389.244627 
+325923.060592  7404374.857092 
+325962.947609  7404341.522802 
+325983.794080  7404366.528518 
+325993.903959  7404364.148926 
+326013.546481  7404352.830865 
+326056.410387  7404326.045453 
+326108.262686  7404297.770296 
+326158.119396  7404269.645114 
+326202.640795  7404244.569409 
+326249.446401  7404221.783312 
+326259.778928  7404141.317095 
+326495.480938  7403846.597578 
+326524.153082  7403809.313964 
+326560.032432  7403765.221517 
+326608.223404  7403691.404161 
+326633.860935  7403661.669254 
+326663.596842  7403623.725754 
+326655.070240  7403576.513841 
+326626.678468  7403523.252964 
+326660.496260  7403486.349285 
+326717.189095  7403430.558842 
+326736.369828  7403293.582304 
+326732.271451  7403262.817574 
+326743.593526  7403111.643469 
+326763.920484  7402997.782972 
+326765.083203  7402981.755717 
+326762.419670  7402968.408004 
+326819.821682  7402834.111008 
+326927.063912  7402571.326020 
+326978.792516  7402586.603403 
+327006.549329  7402593.992138 
+327032.797081  7402587.183304 
+327051.746919  7402583.373957 
+327064.058541  7402573.695614 
+327064.932642  7402554.358927 
+327196.806362  7402561.387723 
+327325.158942  7402571.935916 
+327323.039661  7402595.761835 
+327378.198698  7402591.292600 
+327582.127982  7402568.406520 
+327570.129716  7402507.167010 
+327650.258339  7402500.298187 
+327739.639233  7402491.329723 
+327748.380238  7402488.600191 
+327763.949121  7402483.900995 
+327773.778628  7402476.202314 
+327788.456919  7402462.054738 
+327764.716021  7402423.371364 
+327821.862399  7402406.664225 
+327851.746739  7402411.943321 
+327833.291675  7402383.808140 
+327787.582818  7402253.700427 
+327870.218296  7402230.844342 
+327923.843533  7402213.257354 
+327942.306844  7402219.416299 
+327958.090129  7402207.998255 
+327984.552283  7402199.229757 
+328007.353111  7402197.390072 
+328032.652547  7402200.789490 
+328094.812633  7402214.357166 
+328163.784107  7402243.342201 
+328182.296894  7402228.564732 
+328183.377151  7402216.366822 
+328181.653688  7402197.370076 
+328201.007592  7402206.728473 
+328213.343953  7402224.055505 
+328223.808419  7402237.933128 
+328232.293791  7402257.869713 
+328238.057906  7402282.325524 
+328236.029333  7402320.778937 
+328228.401570  7402351.143736 
+328210.152662  7402387.717471 
+328210.762883  7402396.156025 
+328199.919089  7402417.172425 
+328192.052185  7402434.799406 
+328185.760311  7402448.567048 
+328181.332085  7402460.035083 
+328178.000608  7402474.172662 
+328175.493754  7402487.880314 
+328174.809317  7402502.707774 
+328183.088533  7402528.173412 
+328193.503522  7402542.600941 
+328210.787621  7402556.938485 
+328301.496158  7402640.044250 
+328319.522419  7402651.332316 
+328333.672950  7402656.931357 
+328348.598628  7402664.820006 
+328354.882256  7402667.359571 
+328361.982260  7402669.659177 
+328382.193772  7402671.788812 
+328409.736182  7402675.238221 
+328485.552026  7402682.776930 
+328513.737643  7402683.316837 
+328552.330002  7402676.837947 
+328613.376848  7402664.620040 
+328660.883382  7402651.672258 
+328689.778175  7402646.493145 
+328700.828124  7402646.403160 
+328723.431042  7402648.982718 
+328748.631523  7402648.982718 
+328811.805896  7402658.481091 
+328841.640758  7402670.049110 
+328854.727526  7402672.848630 
+328892.190152  7402697.084479 
+328910.620478  7402711.801958 
+328929.001326  7402719.270679 
+328951.546520  7402745.796135 
+328968.789389  7402756.414316 
+328999.457120  7402798.337135 
+329033.777932  7402837.310460 
+329065.608383  7402877.103643 
+329106.724089  7402922.195920 
+329134.678811  7402953.100626 
+329153.488463  7402968.188041 
+329160.423543  7402975.756745 
+329184.947833  7402990.424233 
+329194.150626  7402996.063267 
+329200.261083  7402997.922948 
+329218.188388  7403000.442517 
+329231.390604  7403008.411152 
+329258.916521  7402986.344931 
+329295.702956  7402978.486277 
+329312.640714  7402975.006873 
+329374.627630  7402976.576605 
+329426.356235  7402999.122743 
+329451.070188  7403010.790744 
+329449.239525  7403049.304147 
+329434.396310  7403139.588682 
+329419.569587  7403225.204017 
+329409.154598  7403320.267733 
+329404.528462  7403363.310361 
+329402.673060  7403380.957338 
+329399.803372  7403401.103887 
+329398.145880  7403488.278955 
+329400.809412  7403520.773389 
+329404.726372  7403545.869090 
+329421.218833  7403619.036557 
+329426.166571  7403645.502024 
+329421.383758  7403669.727874 
+329415.091884  7403718.499520 
+329406.383864  7403796.496160 
+329388.258649  7403840.078695 
+329353.640973  7403921.024829 
+329322.330035  7403989.513098 
+329279.466128  7404061.120832 
+329233.320222  7404134.288299 
+329200.360038  7404176.311101 
+329172.339346  7404293.061103 
+329160.802869  7404359.999637 
+329155.022262  7404393.733858 
+329142.669408  7404451.843905 
+329122.886701  7404542.128440 
+329112.999470  7404601.278308 
+329003.299864  7404667.796914 
+328932.761607  7404801.993927 
+328943.061149  7404891.598579 
+328928.399351  7404957.547282 
+328926.428502  7405021.656301 
+328946.433857  7405155.573362 
+328962.654193  7405198.186063 
+328997.964553  7405284.421292 
+329039.443093  7405364.537569 
+328976.582077  7405462.050865 
+328963.816912  7405575.761388 
+329009.657708  7405675.744262 
+329140.245016  7405808.731482 
+329196.203937  7405935.089838 
+329298.448951  7406044.821042 
+329319.814935  7406176.418501 
+329273.009330  7406255.844896 
+329193.894993  7406292.578603 
+329236.445543  7406403.389623 
+329214.873404  7406536.046900 
+329383.137740  7406646.318011 
+329454.244987  7406779.715161 
+329407.686769  7406899.454651 
+329388.398835  7406985.509911 
+329450.682615  7407025.213110 
+329552.152483  7407114.557806 
+329655.683909  7407211.001286 
+329701.986494  7407396.059587 
+329711.552122  7407558.751719 
+329734.105562  7407746.859498 
+329755.694194  7407912.351151 
+329861.534565  7408022.562273 
+329887.584407  7408032.160629 
+330076.678722  7408047.857940 
+330203.481011  7408095.399797 
+330240.828189  7408224.747640 
+330392.426894  7408356.785024 
+330381.475899  7408366.823304 
+330350.585519  7408387.029843 
+330313.576436  7408410.475827 
+330277.614624  7408428.872676 
+330234.247697  7408452.768582 
+330184.588896  7408467.496060 
+330143.085618  7408479.274042 
+330105.911610  7408489.572278 
+330067.401713  7408510.218742 
+330025.535600  7408537.414083 
+329996.657300  7408560.160187 
+329964.084689  7408602.352960 
+329936.632987  7408639.026678 
+329903.293477  7408682.979150 
+329875.800544  7408725.461873 
+329854.236651  7408756.626534 
+329830.627692  7408789.030984 
+329808.354623  7408812.856903 
+329777.150886  7408841.152056 
+329760.180144  7408869.317231 
+329747.555165  7408929.626901 
+329732.909859  7408952.502983 
+329715.782438  7408967.020496 
+329695.645143  7408975.689011 
+329662.470557  7408995.885551 
+329621.602238  7409025.100547 
+329592.690953  7409053.165740 
+329563.738437  7409087.299893 
+329539.923323  7409112.625555 
+329516.132948  7409135.171693 
+329490.833512  7409154.918311 
+329464.313634  7409168.086055 
+329440.886093  7409175.724747 
+329420.526150  7409179.344127 
+329394.839141  7409182.403603 
+329372.236223  7409180.943853 
+329350.960948  7409171.155529 
+329333.520170  7409158.357721 
+329315.328985  7409143.280304 
+329299.174619  7409127.213056 
+329286.772289  7409120.034286 
+329265.513506  7409108.216310 
+329247.511984  7409103.007203 
+329231.769930  7409100.847572 
+329211.195585  7409098.897906 
+329187.042375  7409101.467466 
+329157.487884  7409111.825692 
+329112.933500  7409124.083592 
+329085.894110  7409138.511121 
+329056.018016  7409159.237571 
+329030.454701  7409181.253800 
+329011.991391  7409204.099886 
+328998.096492  7409229.265576 
+328985.471513  7409253.171481 
+328974.198916  7409266.469203 
+328955.793329  7409281.736588 
+328940.504817  7409287.415615 
+328913.185055  7409305.882452 
+328904.740915  7409314.151035 
+328895.125810  7409325.009176 
+328882.517324  7409338.446874 
+328871.104540  7409355.943877 
+328856.665390  7409373.140931 
+328847.297672  7409389.908059 
+328823.820654  7409418.083233 
+328805.068725  7409434.960342 
+328784.799490  7409452.077410 
+328760.769974  7409474.473574 
+328738.307242  7409494.030224 
+328709.074354  7409516.816321 
+328683.774919  7409531.083877 
+328655.968629  7409542.781873 
+328633.415188  7409542.451930 
+328609.179516  7409535.023202 
+328592.860226  7409523.935101 
+328579.031297  7409515.906477 
+328563.767524  7409501.798893 
+328553.088655  7409486.251556 
+328534.856239  7409467.314800 
+328527.484109  7409451.047586 
+328514.801407  7409433.960513 
+328497.368875  7409411.744319 
+328484.158413  7409396.156989 
+328469.917173  7409381.819444 
+328448.641898  7409362.572741 
+328429.799261  7409350.694776 
+328405.415157  7409335.947302 
+328378.788078  7409318.900222 
+328355.121396  7409310.641637 
+328338.925799  7409300.893306 
+328329.813714  7409295.254272 
+328315.902323  7409286.285809 
+328305.528565  7409280.626778 
+328293.876641  7409275.477660 
+328278.637607  7409273.567987 
+328260.330975  7409275.437667 
+328238.437233  7409280.806747 
+328219.355455  7409284.686083 
+328192.662406  7409285.715906 
+328161.161805  7409283.926213 
+328136.076772  7409274.607809 
+328118.603009  7409266.109265 
+328098.168849  7409245.202846 
+328076.481263  7409221.506905 
+328061.605063  7409204.189871 
+328043.496340  7409177.484445 
+328028.397492  7409157.127932 
+328016.283779  7409145.139986 
+327997.845207  7409129.052741 
+327974.788746  7409120.254248 
+327954.766898  7409112.495577 
+327937.004518  7409108.046339 
+327911.853514  7409107.326463 
+327895.600194  7409106.426617 
+327879.874632  7409102.497290 
+327867.777411  7409088.489689 
+327856.735708  7409067.913214 
+327851.293196  7409047.136773 
+327843.789126  7409029.879729 
+327832.038248  7409002.724380 
+327824.270298  7408987.237033 
+327816.213731  7408977.308734 
+327807.142877  7408966.100653 
+327805.411169  7408959.771737 
+327807.810822  7408943.864462 
+327823.412690  7408929.336951 
+327836.746845  7408912.009919 
+327855.234894  7408884.364654 
+327865.031417  7408864.977975 
+327876.180320  7408833.223414 
+327881.424923  7408810.267346 
+327883.931777  7408778.932714 
+327882.315516  7408756.166613 
+327875.124803  7408731.080910 
+327864.074854  7408713.034001 
+327846.939186  7408691.647665 
+327838.890865  7408680.459581 
+327829.869489  7408662.432669 
+327824.954736  7408638.616748 
+327822.571575  7408616.610518 
+327818.539168  7408575.867497 
+327824.121866  7408541.033464 
+327828.673786  7408507.699173 
+327830.413740  7408477.374368 
+327831.164147  7408443.260211 
+327826.546258  7408413.385328 
+327821.944861  7408381.240835 
+327813.500721  7408353.865524 
+327803.258903  7408328.489870 
+327797.296878  7408308.723256 
+327781.546577  7408272.429473 
+327768.946337  7408257.152090 
+327755.818338  7408245.154145 
+327738.913565  7408228.077070 
+327717.151762  7408215.239269 
+327694.565337  7408210.240125 
+327674.997031  7408211.079982 
+327623.581783  7408223.027935 
+327591.908011  7408245.894018 
+327570.063746  7408265.870596 
+327550.503687  7408281.797868 
+327530.943628  7408301.014577 
+327504.522705  7408321.241112 
+327484.451380  7408333.379033 
+327452.942532  7408357.904832 
+327428.566675  7408384.190329 
+327406.978043  7408407.196389 
+327379.806713  7408439.290891 
+327357.459428  7408464.066647 
+327331.558017  7408497.680889 
+327306.926526  7408524.726257 
+327275.178538  7408557.340670 
+327241.649365  7408585.655820 
+327213.694643  7408603.102832 
+327178.367791  7408621.819626 
+327161.339324  7408627.388672 
+327129.813984  7408632.207846 
+327109.470533  7408632.217844 
+327076.658782  7408629.968230 
+327047.153768  7408627.968572 
+327025.284765  7408622.919437 
+327003.143636  7408610.301599 
+326983.286712  7408592.384668 
+326962.399010  7408566.369124 
+326939.482735  7408542.383232 
+326900.049260  7408529.015522 
+326867.229262  7408517.667466 
+326848.147484  7408514.907939 
+326808.474869  7408508.109103 
+326764.472982  7408504.599704 
+326731.916863  7408502.850004 
+326699.368991  7408501.860174 
+326673.681982  7408502.630042 
+326618.250820  7408503.929819 
+326575.774486  7408503.699858 
+326519.848550  7408517.377516 
+326498.499059  7408525.476128 
+326471.550377  7408535.094481 
+326442.581369  7408548.492186 
+326418.436405  7408561.899889 
+326393.532789  7408578.846986 
+326202.047067  7408619.639999 
+326065.728628  7408633.267665 
+326011.196305  7408599.193501 
+326018.007691  7408435.601523 
+326127.072338  7408203.841222 
+326147.522990  7408026.621578 
+326208.866700  7407863.029599 
+326236.128738  7407760.787113 
+326195.235680  7407651.725794 
+326202.055313  7407542.664475 
+326072.540015  7407113.238032 
+325997.565286  7407092.791534 
+325874.869620  7407079.163869 
+325727.361046  7407039.950585 
+325543.206223  7406979.400957 
+325466.326615  7406904.283824 
+325385.101243  7406884.707177 
+325254.794306  7406833.875884 
+325171.969166  7406768.877018 
+325162.848835  7406678.852438 
+325166.073111  7406627.001320 
+325178.087869  7406573.330513 
+325171.301221  7406602.245560 
+325166.073111  7406627.001320 
+325156.680654  7406585.758384 
+325183.876723  7406489.574860 
+325284.183872  7406381.113438 
+325516.340004  7406266.063145 
+325601.259687  7406208.622984 
+325711.148956  7406058.758655 
+325721.143388  7405941.368763 
+325679.755556  7405771.437870 
+325652.246131  7405634.771280 
+325614.082576  7405535.638261 
+325664.887603  7405456.271855 
+Region 1
+290
+326424.423169  7392114.857119 
+326316.323331  7392102.299270 
+326277.293922  7392098.559910 
+326211.192137  7392088.081705 
+326121.621579  7392074.324062 
+326071.138155  7392074.154091 
+326040.256022  7392044.599153 
+325976.306503  7391999.996793 
+325910.518075  7391963.663017 
+325857.791676  7391863.610155 
+325833.217909  7391818.697848 
+325768.270596  7391657.715423 
+325707.380429  7391507.831097 
+325673.076110  7391447.831374 
+325622.386530  7391411.807545 
+325530.078224  7391341.749545 
+325473.632775  7391300.336639 
+325452.110113  7391284.489353 
+325437.811149  7391267.512261 
+325320.937322  7391062.417392 
+325256.682693  7391003.107551 
+325182.771728  7390957.115429 
+325162.387046  7390943.447771 
+325078.588850  7390903.014696 
+325052.877103  7390894.176210 
+325023.569999  7390879.608706 
+324976.459283  7390855.002920 
+324934.692125  7390836.296125 
+324856.270472  7390805.751357 
+324826.740720  7390794.393302 
+324759.443231  7390743.262061 
+324730.647394  7390727.324791 
+324674.630749  7390703.828815 
+324604.001784  7390689.501269 
+324555.043912  7390684.282163 
+324472.581606  7390663.375744 
+324440.998542  7390650.747907 
+324379.390953  7390628.291754 
+324334.053177  7390604.775782 
+324227.858219  7390559.063612 
+324117.342236  7390513.591401 
+324062.075998  7390490.355381 
+324000.600348  7390773.936806 
+323991.463525  7390811.100441 
+323962.675934  7390954.815823 
+323902.519681  7390902.244828 
+323730.767189  7390749.990908 
+323671.996303  7390695.700208 
+323611.370016  7390644.968897 
+323541.103884  7390603.466006 
+323508.366349  7390590.078300 
+323452.580598  7390565.532504 
+323398.287416  7390543.216327 
+323356.017237  7390510.101999 
+323314.390265  7390462.990069 
+323285.462488  7390416.727993 
+323273.348775  7390363.457118 
+323259.107535  7390325.693586 
+323243.332496  7390290.459622 
+323220.878010  7390263.594223 
+323201.458136  7390240.298214 
+323185.757313  7390232.039628 
+323123.960061  7390196.745674 
+323090.249470  7390181.758241 
+323059.070472  7390168.820457 
+322995.706436  7390139.865417 
+322925.267133  7390105.031384 
+322856.872896  7390260.554744 
+322798.572046  7390389.432668 
+322755.221611  7390487.355895 
+322739.999069  7390519.570377 
+322711.079539  7390588.078642 
+322690.678364  7390635.530514 
+322670.310174  7390679.932908 
+322641.646277  7390670.614504 
+322530.198469  7390646.888569 
+322444.652073  7390633.340889 
+322363.896736  7390635.120584 
+322317.660121  7390639.379855 
+322264.521410  7390640.439673 
+322148.266051  7390644.878913 
+322026.708365  7390650.198002 
+321933.525958  7390643.989065 
+321842.132984  7390623.582561 
+321789.340616  7390583.729387 
+321619.608450  7390494.244715 
+321555.386806  7390480.057145 
+321373.722345  7390466.579454 
+321220.573349  7390471.788562 
+321087.479187  7390466.119533 
+320954.822074  7390460.620475 
+320891.309606  7390458.760793 
+320707.633064  7390460.790445 
+320736.816474  7390489.175583 
+320761.200579  7390516.360927 
+320776.398382  7390531.958255 
+320793.410355  7390535.337676 
+320878.437240  7390555.024304 
+320898.450841  7390566.862276 
+320914.242373  7390600.816460 
+320924.467699  7390629.651521 
+320936.968985  7390660.776190 
+320951.927647  7390682.132532 
+321029.780311  7390696.800019 
+321064.793806  7390702.978961 
+321093.548412  7390702.069117 
+321154.793167  7390664.825496 
+321187.712120  7390647.498464 
+321202.753245  7390642.259361 
+321218.750932  7390643.389168 
+321227.640369  7390645.238851 
+321239.036660  7390650.397967 
+321251.158619  7390662.955816 
+321258.398809  7390684.132189 
+321263.593934  7390714.377008 
+321266.686271  7390736.613200 
+321272.656542  7390757.269661 
+321281.240868  7390766.488082 
+321293.346335  7390780.055758 
+321330.042061  7390805.251442 
+321344.505950  7390808.660858 
+321359.769722  7390807.751014 
+321380.921304  7390800.012340 
+321401.042107  7390794.293319 
+321427.792879  7390785.574813 
+321449.109385  7390790.304003 
+321469.840409  7390808.510884 
+321479.067941  7390834.276471 
+321477.666082  7390855.142896 
+321474.466545  7390877.509065 
+321474.326359  7390898.115536 
+321482.547851  7390924.141078 
+321492.261910  7390953.975967 
+321492.187694  7390965.434005 
+321483.636353  7390987.410240 
+321476.536348  7390998.948264 
+321453.776752  7391046.600102 
+321437.366753  7391066.846634 
+321431.676854  7391082.583938 
+321433.589979  7391099.900972 
+321439.354094  7391113.428654 
+321459.549113  7391134.954967 
+321485.557725  7391161.340448 
+321495.082121  7391182.266863 
+321498.017779  7391198.074155 
+321494.109066  7391213.061588 
+321477.253770  7391235.417759 
+321469.337389  7391267.862201 
+321466.121359  7391293.547802 
+321479.496745  7391308.125305 
+321510.700482  7391357.716810 
+321521.280396  7391371.794399 
+321537.673902  7391392.260893 
+321559.443951  7391405.388644 
+321591.934100  7391413.507254 
+321610.479873  7391414.147144 
+321628.547364  7391410.957690 
+321684.077481  7391393.790631 
+321748.546513  7391367.525130 
+321795.014022  7391341.369610 
+321817.996267  7391324.482503 
+321839.955979  7391310.384918 
+321869.526962  7391297.097194 
+321894.447071  7391295.997382 
+321907.888427  7391301.936365 
+321924.850924  7391312.244599 
+321926.326999  7391319.383376 
+321931.818989  7391335.190669 
+321933.773345  7391347.678530 
+321936.412139  7391370.604603 
+321937.360456  7391376.423606 
+321948.121787  7391407.328312 
+321976.249679  7391420.496057 
+322011.279667  7391428.634663 
+322040.232183  7391431.894104 
+322059.759257  7391431.684140 
+322075.047769  7391433.403846 
+322106.507139  7391443.292152 
+322127.708198  7391466.588161 
+322135.740026  7391481.915536 
+322139.920865  7391502.821955 
+322141.363956  7391517.079513 
+322150.377086  7391536.476190 
+322164.189522  7391562.791683 
+322169.219723  7391570.200414 
+322226.712443  7391602.414896 
+322368.531118  7391684.830778 
+322422.972732  7391717.525178 
+322482.436301  7391757.128395 
+322548.703011  7391847.932841 
+322556.776071  7391855.881479 
+322567.908482  7391864.609984 
+322581.102451  7391869.279184 
+322662.278346  7391893.764990 
+322692.723429  7391904.153210 
+322706.420418  7391907.812584 
+322718.097081  7391909.932221 
+322733.360854  7391909.022376 
+322766.197344  7391902.633471 
+322799.091558  7391887.836005 
+322866.661172  7391863.280212 
+322906.746099  7391867.469494 
+322776.703042  7391931.958448 
+322650.156387  7391999.996793 
+322563.909060  7392044.009254 
+322555.448428  7392051.328001 
+322549.882222  7392055.577273 
+322537.908695  7392066.175458 
+322529.175937  7392079.143236 
+322489.643507  7392130.264480 
+322473.381940  7392157.059890 
+322449.302947  7392184.045268 
+322409.201527  7392233.856735 
+322367.079781  7392291.606843 
+322301.893328  7392374.662616 
+322394.119171  7392445.280520 
+322405.647402  7392453.929039 
+322421.793521  7392481.394334 
+322426.188762  7392503.430560 
+322424.720933  7392522.537287 
+322415.913959  7392544.573512 
+322402.678759  7392556.331498 
+322419.501069  7392592.515300 
+322361.060033  7392681.410073 
+322272.322345  7392799.509844 
+322163.966874  7392944.624987 
+322253.578662  7393013.393208 
+322182.619848  7393104.547594 
+322113.953485  7393197.501672 
+322046.054022  7393285.626577 
+322094.401672  7393384.509639 
+322023.187224  7393575.926851 
+322053.442644  7393586.944963 
+322078.090628  7393600.462648 
+322102.466486  7393618.809505 
+322121.762665  7393638.156191 
+322145.858151  7393666.661309 
+322171.487436  7393692.626861 
+322189.521943  7393709.693938 
+322216.957152  7393724.751359 
+322267.292144  7393743.938072 
+322325.782658  7393760.095304 
+322370.271072  7393773.443018 
+322410.224060  7393772.543172 
+322433.618616  7393774.642813 
+322461.342443  7393780.821754 
+322483.970100  7393790.020179 
+322499.473014  7393798.698692 
+322826.287627  7394000.014208 
+323037.861167  7394125.962635 
+323080.222053  7394152.618069 
+323100.408826  7394172.134726 
+323124.116739  7394203.979271 
+323146.868090  7394239.923114 
+323165.661249  7394282.015904 
+323167.590867  7394443.338271 
+323163.756370  7394483.771345 
+323177.948133  7394563.257730 
+323222.428301  7394645.443652 
+323287.581769  7394707.702988 
+323473.608486  7394605.060570 
+323620.498593  7394507.697247 
+323764.774644  7394415.293075 
+323920.364524  7394341.185769 
+324082.064861  7394268.028300 
+324226.274943  7394180.713256 
+324355.410914  7394115.694393 
+324464.236420  7394066.272859 
+324528.853884  7394033.938398 
+324801.466023  7393898.641573 
+324955.085053  7393817.965392 
+325104.440783  7393743.658120 
+325259.024623  7393666.531331 
+325304.519077  7393642.815393 
+325328.342437  7393628.687813 
+325401.313332  7393585.165268 
+325557.678358  7393478.933465 
+325739.614945  7393385.629447 
+325824.015115  7393303.113581 
+325908.184392  7393223.127282 
+325962.436343  7393151.369574 
+326011.122089  7393067.323970 
+326027.631042  7393017.592488 
+326043.702946  7392961.322127 
+326078.831889  7392865.948464 
+326131.203699  7392705.355972 
+326219.850679  7392496.851687 
+326270.564997  7392345.047689 
+326339.742626  7392211.080637 
+326424.423169  7392114.857119 
+Region 1
+333
+330962.266170  7402191.131144 
+331061.377616  7402270.787500 
+331095.888091  7402291.134015 
+331090.090991  7402315.249884 
+331091.006323  7402346.734491 
+331188.270613  7402388.417351 
+331261.381694  7402416.782492 
+331310.537475  7402445.847514 
+331327.211354  7402452.326404 
+331429.093533  7402492.159581 
+331448.752547  7402630.965805 
+331478.801812  7402691.455443 
+331466.143848  7402754.274683 
+331458.730486  7402813.554529 
+331474.480787  7402871.914532 
+331498.246423  7402921.656012 
+331524.485929  7402976.576605 
+331532.460034  7403055.783037 
+331522.647020  7403107.174234 
+331485.712153  7403184.620968 
+331479.073937  7403196.368956 
+331460.973461  7403232.442777 
+331410.712685  7403265.637091 
+331377.958657  7403299.421304 
+331343.126579  7403364.150217 
+331376.400119  7403369.349326 
+331399.283409  7403374.538437 
+331475.173470  7403403.653450 
+331483.493917  7403408.852560 
+331583.289800  7403464.992943 
+331590.562976  7403467.072587 
+331638.391113  7403506.575821 
+331665.422257  7403518.013861 
+331709.753993  7403522.123157 
+331767.898166  7403538.960273 
+331807.001791  7403550.838239 
+331857.947004  7403562.876177 
+331796.809450  7403685.145233 
+331602.618965  7404094.265155 
+331583.471217  7404163.593279 
+331659.171615  7404302.239531 
+331665.562443  7404318.656718 
+331660.086946  7404335.983750 
+331631.810621  7404376.116876 
+331604.499105  7404415.940055 
+331588.031383  7404438.146251 
+331615.392376  7404483.748440 
+331687.447939  7404555.806097 
+331704.781516  7404578.612190 
+331708.426350  7404603.237972 
+331701.128436  7404621.484847 
+331644.584033  7404697.181880 
+331647.313535  7404731.845943 
+331654.611449  7404750.092817 
+331623.787039  7404819.110995 
+331613.858577  7404874.261548 
+331623.597376  7404951.668289 
+331559.763304  7404992.721257 
+331531.478733  7405046.532040 
+331514.153402  7405076.636883 
+331466.712837  7405114.030478 
+331448.472175  7405128.627978 
+331415.643931  7405155.983292 
+331381.892109  7405176.049855 
+331368.203366  7405189.737510 
+331359.083035  7405196.126416 
+331260.573564  7405250.847043 
+331273.346975  7405361.218137 
+331288.849889  7405477.058295 
+331300.188456  7405584.699857 
+331252.442780  7405661.566690 
+331196.310688  7405779.746447 
+331181.038669  7405828.428108 
+331213.504079  7405848.474674 
+331243.083309  7405875.200097 
+331261.216770  7405910.524046 
+331253.580760  7405949.657343 
+331222.475978  7406007.887369 
+331211.953788  7406017.065796 
+331205.686653  7406036.152527 
+331209.496411  7406069.536809 
+331212.588748  7406103.351016 
+331204.993969  7406133.715815 
+331190.406387  7406148.723245 
+331165.230645  7406151.762724 
+331147.361063  7406150.782892 
+331116.536653  7406155.742042 
+331087.377981  7406159.841340 
+331052.397471  7406171.289379 
+331024.088161  7406189.456267 
+331002.516022  7406224.980182 
+330988.654108  7406249.076055 
+330984.036219  7406268.522724 
+330982.857008  7406300.067321 
+330983.846556  7406320.233866 
+330987.211018  7406358.497312 
+331011.149825  7406398.860398 
+331031.666447  7406428.215370 
+331050.979119  7406454.580854 
+331069.211535  7406477.496929 
+331092.383443  7406506.441971 
+331104.439433  7406524.968797 
+331110.838508  7406554.503738 
+331109.387171  7406583.388790 
+331102.353136  7406599.376052 
+331092.498891  7406638.689318 
+331034.536135  7406679.752284 
+331028.466910  7406701.088629 
+331022.397684  7406716.845930 
+331016.336704  7406727.014189 
+331011.537398  7406737.422406 
+331000.429726  7406754.699446 
+330970.899974  7406803.481091 
+330967.098461  7406817.958611 
+330965.333768  7406827.616956 
+330965.061642  7406839.814867 
+330963.033070  7406854.292387 
+330967.543758  7406866.740255 
+330971.312285  7406876.398600 
+331001.460504  7406943.467112 
+331032.128236  7406991.228931 
+331065.591440  7407031.632010 
+331074.654048  7407037.980923 
+331084.970082  7407043.569965 
+331090.758936  7407046.369486 
+331123.240839  7407056.777703 
+331160.258168  7407066.945961 
+331174.367469  7407070.755309 
+331181.673629  7407072.794959 
+331194.257377  7407080.673610 
+331200.796638  7407086.002697 
+331210.362265  7407097.690695 
+331245.070650  7407142.403036 
+331255.122805  7407163.239467 
+331261.142554  7407180.256552 
+331265.653242  7407199.823201 
+331269.149644  7407218.110068 
+331274.402493  7407256.993408 
+331285.452442  7407284.928623 
+331298.778350  7407299.416141 
+331333.750615  7407338.289483 
+331342.301956  7407351.497220 
+331347.068277  7407362.165393 
+331350.828558  7407376.142999 
+331352.815900  7407393.929952 
+331349.278267  7407606.333569 
+331345.979775  7407626.140176 
+331339.663162  7407646.466695 
+331330.311936  7407667.813038 
+331330.584062  7407693.118704 
+331306.571038  7407711.755511 
+331290.919693  7407735.391463 
+331268.729086  7407758.257546 
+331169.947489  7407845.912531 
+331158.006947  7407856.830661 
+331150.436907  7407862.169747 
+331142.380340  7407864.449356 
+331135.082426  7407864.199399 
+331126.770225  7407861.409877 
+331069.112581  7407837.523968 
+331057.774013  7407834.224533 
+331045.932426  7407833.464664 
+331030.314065  7407833.464664 
+331015.198725  7407836.004229 
+331104.323985  7407868.428675 
+331189.021020  7407898.183578 
+331282.211673  7408020.722588 
+331248.822685  7407998.686363 
+331218.946591  7407983.259005 
+331180.444941  7407965.991963 
+331128.040145  7407938.736632 
+331097.908418  7407923.049319 
+331066.275877  7407904.072569 
+331040.201296  7407890.444903 
+331019.734151  7407874.337662 
+331003.274675  7407866.109072 
+330991.119731  7407860.190086 
+330974.882903  7407855.500889 
+330960.402522  7407855.870826 
+330945.650015  7407857.010630 
+330927.640248  7407852.561393 
+330921.331881  7407846.432442 
+330908.195636  7407835.704280 
+330896.048938  7407828.015597 
+330874.996311  7407822.776494 
+330859.254257  7407821.116779 
+330836.841002  7407827.755642 
+330781.772674  7407853.821177 
+330739.914807  7407879.236823 
+330701.347186  7407907.721944 
+330660.940656  7407944.285681 
+330635.303125  7407976.420177 
+330606.548519  7408017.883074 
+330583.665229  7408055.606613 
+330561.746748  7408100.158981 
+330552.692386  7408123.085054 
+330546.606668  7408157.919088 
+330555.809462  7408185.564352 
+330567.345938  7408206.900697 
+330580.910988  7408229.766781 
+330588.431550  7408243.984345 
+330589.322143  7408261.441355 
+330584.638284  7408277.078677 
+330571.840134  7408290.866315 
+330548.923859  7408296.735310 
+330526.551835  7408299.064911 
+330504.204550  7408295.845462 
+330486.417431  7408296.195402 
+330461.983849  7408301.284530 
+330437.236911  7408315.992011 
+330409.867672  7408341.027723 
+330392.097044  7408356.515070 
+330240.828189  7408224.747640 
+330203.481011  7408095.399797 
+330076.678722  7408047.857940 
+329887.584407  7408032.160629 
+329861.534565  7408022.562273 
+329755.694194  7407912.351151 
+329734.105562  7407746.859498 
+329711.552122  7407558.751719 
+329701.986494  7407396.059587 
+329655.683909  7407211.001286 
+329552.152483  7407114.557806 
+329450.682615  7407025.213110 
+329388.398835  7406985.509911 
+329407.686769  7406899.454651 
+329454.244987  7406779.715161 
+329383.137740  7406646.318011 
+329214.873404  7406536.046900 
+329236.445543  7406403.389623 
+329193.894993  7406292.578603 
+329273.009330  7406255.844896 
+329319.814935  7406176.418501 
+329298.448951  7406044.821042 
+329196.203937  7405935.089838 
+329140.245016  7405808.731482 
+329009.657708  7405675.744262 
+328963.816912  7405575.761388 
+328976.582077  7405462.050865 
+329039.443093  7405364.537569 
+328997.964553  7405284.421292 
+328962.654193  7405198.186063 
+328946.433857  7405155.573362 
+328926.428502  7405021.656301 
+328928.399351  7404957.547282 
+328943.061149  7404891.598579 
+328932.761607  7404801.993927 
+329003.299864  7404667.796914 
+329112.999470  7404601.278308 
+329122.886701  7404542.128440 
+329142.669408  7404451.843905 
+329155.022262  7404393.733858 
+329160.802869  7404359.999637 
+329172.339346  7404293.061103 
+329200.360038  7404176.311101 
+329233.320222  7404134.288299 
+329279.466128  7404061.120832 
+329322.330035  7403989.513098 
+329353.640973  7403921.024829 
+329388.258649  7403840.078695 
+329406.383864  7403796.496160 
+329415.091884  7403718.499520 
+329421.383758  7403669.727874 
+329426.166571  7403645.502024 
+329421.218833  7403619.036557 
+329404.726372  7403545.869090 
+329400.809412  7403520.773389 
+329398.145880  7403488.278955 
+329399.803372  7403401.103887 
+329404.528462  7403363.310361 
+329409.154598  7403320.267733 
+329419.569587  7403225.204017 
+329434.396310  7403139.588682 
+329449.239525  7403049.304147 
+329451.070188  7403010.790744 
+329454.187263  7402979.256146 
+329445.941033  7402943.452279 
+329421.218833  7402899.869744 
+329376.722172  7402867.175344 
+329335.524004  7402848.498543 
+329299.248836  7402832.931210 
+329264.639406  7402812.694676 
+329230.029975  7402780.000276 
+329223.853549  7402773.411405 
+329206.948776  7402745.756142 
+329192.113807  7402686.606274 
+329180.577330  7402650.802407 
+329160.802869  7402600.990939 
+329083.337779  7402507.586938 
+329084.987025  7402448.437070 
+329086.603286  7402389.157224 
+329117.930716  7402376.709356 
+329126.160454  7402362.741749 
+329135.792052  7402360.532127 
+329156.226211  7402247.051566 
+329156.217965  7402247.021571 
+329156.993111  7402153.997505 
+329155.492297  7402107.145530 
+329155.541774  7402107.125534 
+329189.590460  7402107.985386 
+329351.340275  7402129.261742 
+329430.512335  7402142.879409 
+329653.548135  7402175.233867 
+329742.937275  7402188.001680 
+329759.108134  7402184.592264 
+329766.768882  7402176.933576 
+329799.118845  7402159.056638 
+329825.506783  7402146.288825 
+329845.091581  7402142.029555 
+329873.178242  7402139.479992 
+329902.122512  7402135.220721 
+329940.426253  7402113.084513 
+330000.879370  7402067.122386 
+330065.571050  7402024.559676 
+330100.477344  7402014.341427 
+330136.233000  7402010.932011 
+330175.386103  7402007.532593 
+330210.251166  7402002.603437 
+330245.413094  7402048.075648 
+330311.721034  7402142.179529 
+330356.531052  7402131.481362 
+330393.309240  7402119.443424 
+330422.072093  7402102.726287 
+330476.241582  7402053.904650 
+330495.636716  7402025.819461 
+330573.868707  7401959.580807 
+330672.856459  7402025.149575 
+330738.397500  7402065.942588 
+330778.523659  7402094.027777 
+330810.626235  7402116.773881 
+330885.526748  7402164.925633 
+330924.127353  7402187.021848 
+330962.266170  7402191.131144 
+Region 1
+127
+334118.939754  7394231.104625 
+334111.889227  7394211.348009 
+334096.361575  7394194.420908 
+334017.346193  7394184.542600 
+333978.968235  7394169.455185 
+333964.380653  7394155.307608 
+333961.288317  7394149.568591 
+333956.423041  7394117.764039 
+333992.211682  7393973.488752 
+334002.890550  7393905.390417 
+334024.149333  7393748.137353 
+334141.328270  7393692.396901 
+334231.410094  7393644.665077 
+334198.021106  7393539.693057 
+334176.102625  7393464.365960 
+334149.797149  7393365.672865 
+334209.607060  7393348.105874 
+334240.538671  7393340.567166 
+334277.960066  7393343.586649 
+334294.394804  7393193.372379 
+334304.578899  7393170.236342 
+334333.853017  7393138.121843 
+334342.288911  7393124.054252 
+334345.405986  7393111.826347 
+334356.241534  7393021.411834 
+334358.921558  7392996.776054 
+334409.743078  7392986.947738 
+334358.781373  7392719.923476 
+334329.218636  7392548.722802 
+334302.781220  7392415.995537 
+334278.537302  7392277.169316 
+334242.493028  7392080.962925 
+334230.239129  7391999.996793 
+334222.240286  7391954.644562 
+334214.373381  7391904.213200 
+334190.368604  7391790.992594 
+334185.717730  7391763.807250 
+334171.220856  7391678.751820 
+334144.321652  7391529.517382 
+334217.572919  7391529.127449 
+334304.100617  7391534.196581 
+334386.538185  7391537.016098 
+334443.264006  7391537.536009 
+334499.981580  7391540.285538 
+334563.617742  7391541.795279 
+334698.187980  7391544.164873 
+334778.341342  7391546.504472 
+334822.499907  7391510.330669 
+334894.209128  7391456.909819 
+334903.997404  7391469.507661 
+334905.861052  7391477.356317 
+334905.960007  7391487.764534 
+334902.026555  7391501.762136 
+334890.811681  7391525.448079 
+334847.098413  7391607.554015 
+334865.289598  7391646.467350 
+334874.360451  7391663.644407 
+334885.171260  7391677.002119 
+334901.540028  7391686.240537 
+334921.998926  7391696.968699 
+334934.788829  7391704.217458 
+334945.830532  7391715.535519 
+334957.688612  7391731.682753 
+334975.203606  7391752.839129 
+334998.062157  7391775.465254 
+335051.027697  7391808.749552 
+335095.936669  7391848.702709 
+335131.799526  7391900.913765 
+335124.600567  7391919.510580 
+335123.462587  7391929.908799 
+335125.375712  7391941.556804 
+335128.715436  7391953.004843 
+335133.490003  7391964.352899 
+335140.713701  7391975.401006 
+335150.172128  7391988.018845 
+335163.267142  7391999.996793 
+335195.567627  7392012.104719 
+335214.830822  7392024.232642 
+335229.756500  7392036.180595 
+335243.783338  7392054.467463 
+335252.499604  7392076.163747 
+335256.556749  7392092.071022 
+335259.409945  7392112.057598 
+335258.939910  7392131.334296 
+335254.198327  7392154.470333 
+335246.397393  7392176.896492 
+335307.592671  7392254.153259 
+335402.069735  7392293.756475 
+335448.933064  7392484.923730 
+335459.991259  7392506.380054 
+335471.016470  7392580.877294 
+335479.048298  7392610.312252 
+335492.431931  7392630.838736 
+335515.620331  7392649.565528 
+335540.639395  7392658.573985 
+335572.511077  7392680.160287 
+335750.646151  7392752.307929 
+335792.231892  7392676.400931 
+335876.599078  7392587.426172 
+335911.480634  7392640.397099 
+335951.697500  7392658.344024 
+336000.003920  7392682.359911 
+336050.833685  7392702.986378 
+336198.878264  7392779.573259 
+336232.209528  7392797.680157 
+336250.375974  7392774.524124 
+336259.067502  7392764.955763 
+336272.104792  7392762.346210 
+336290.370193  7392770.174869 
+336313.838965  7392782.352783 
+335608.637813  7394186.182320 
+335438.781954  7394195.670694 
+335375.846722  7394200.969787 
+335324.555167  7394205.758966 
+335270.806236  7394210.308187 
+335245.176951  7394213.087711 
+335209.413049  7394215.857237 
+334973.941933  7394238.813304 
+334784.418814  7394253.730749 
+334636.819531  7394264.608886 
+334542.111572  7394267.818336 
+334486.037204  7394270.827821 
+334405.347837  7394276.366872 
+334284.911638  7394282.485824 
+334135.778557  7394293.573924 
+334091.554022  7394278.196558 
+334118.939754  7394231.104625 
+Region 1
+215
+331327.862806  7384686.289565 
+331319.187771  7384674.861523 
+331315.105887  7384666.223002 
+331312.293922  7384658.094395 
+331311.007510  7384651.225571 
+331309.960239  7384636.988010 
+331303.058144  7384620.990750 
+331291.595883  7384608.292925 
+331279.366723  7384600.934186 
+331264.102950  7384595.865054 
+331246.546725  7384589.776097 
+331238.152063  7384588.776268 
+331226.871219  7384589.316176 
+331173.559338  7384590.615953 
+331133.119823  7384587.996402 
+331110.673583  7384591.295837 
+331079.643017  7384582.057419 
+331049.931848  7384570.169455 
+331023.527418  7384556.961718 
+331008.667710  7384541.744324 
+330981.554104  7384515.108887 
+330926.329097  7384461.768024 
+330852.599549  7384391.310092 
+330808.572923  7384437.992096 
+330766.442931  7384484.554121 
+330734.257893  7384542.284232 
+330714.483432  7384580.217734 
+330709.007934  7384634.318467 
+330708.381221  7384657.404513 
+330698.221865  7384683.809990 
+330675.157158  7384710.995333 
+330663.686651  7384736.620944 
+330647.441576  7384758.967116 
+330612.906363  7384789.441896 
+330570.256858  7384819.246791 
+330425.832374  7384829.315066 
+330392.863944  7384795.100927 
+330310.863426  7384688.119252 
+330249.181621  7384620.310867 
+330175.551028  7384554.312172 
+330143.192819  7384521.797741 
+330124.597569  7384506.320392 
+330057.093924  7384449.200176 
+330057.069186  7384440.811613 
+330059.328653  7384425.564225 
+329971.028015  7384398.708825 
+329906.138426  7384377.682427 
+329922.787566  7384308.784228 
+329743.159924  7384265.761598 
+329707.280574  7384257.922940 
+329689.732595  7384253.363721 
+329671.912491  7384245.495069 
+329654.587160  7384233.317155 
+329634.210724  7384217.579851 
+329618.930459  7384204.892024 
+329603.641947  7384188.894764 
+329591.643682  7384166.528596 
+329579.769110  7384127.995196 
+329502.007155  7384108.668506 
+329479.610392  7384100.059981 
+329437.092827  7384158.389990 
+329418.192466  7384185.275384 
+329325.240955  7384299.225866 
+329294.177404  7384337.399327 
+329237.336136  7384404.307866 
+329207.138439  7384433.322896 
+329185.698240  7384455.779050 
+329163.969422  7384467.667013 
+329141.663368  7384482.744431 
+329115.720726  7384500.771343 
+329067.719418  7384537.415066 
+329045.223700  7384559.041362 
+329029.423923  7384586.256700 
+328985.356066  7384745.199474 
+328971.403444  7384809.698426 
+328955.578927  7384871.227887 
+328935.524094  7384944.955258 
+328879.532188  7385055.116388 
+328846.736929  7385106.097656 
+328806.643755  7385165.677450 
+328750.503417  7385241.284500 
+328667.909171  7385322.490590 
+328566.142439  7385405.706336 
+328512.203844  7385445.219567 
+328429.551874  7385503.209634 
+328387.248711  7385548.991792 
+328337.119875  7385595.063900 
+328313.519163  7385621.769326 
+328175.370061  7385781.361989 
+328138.723812  7385865.967497 
+328098.490452  7385935.395605 
+328019.277161  7386040.087672 
+327884.583229  7386123.873320 
+327894.701354  7386139.360667 
+327991.000836  7386281.996235 
+328025.865899  7386341.556033 
+328128.993260  7386509.677235 
+328178.379935  7386588.683702 
+328211.430827  7386641.564644 
+328241.199720  7386687.776729 
+328296.738083  7386789.989220 
+328306.880947  7386804.066809 
+328330.729046  7386841.340424 
+328374.046496  7386909.598732 
+328382.738023  7386930.095222 
+328389.293776  7386938.503781 
+328421.676724  7386987.615369 
+328439.076271  7387008.751748 
+328457.770475  7387042.865905 
+328513.836598  7387125.711714 
+328526.074004  7387145.348351 
+328577.736639  7387228.914037 
+328638.033077  7387326.757277 
+328666.828915  7387377.298620 
+328702.716511  7387423.980623 
+328760.959638  7387523.133639 
+328788.295892  7387567.316071 
+328803.435972  7387598.610711 
+328813.446896  7387623.056524 
+328817.396840  7387632.704871 
+328849.491170  7387736.157150 
+328887.242414  7387852.937147 
+328910.711186  7387936.482836 
+328923.113517  7387969.287217 
+328929.636285  7387999.342069 
+328960.468942  7388116.581987 
+328983.261523  7388096.585412 
+329006.243768  7388077.138743 
+329034.149013  7388047.893753 
+329066.350543  7387999.981960 
+329136.212609  7387890.930639 
+329174.508105  7387845.418435 
+329225.700704  7387805.805220 
+329274.023616  7387773.140816 
+329328.267321  7387745.315582 
+329406.383864  7387707.422073 
+329432.969712  7387693.814403 
+329464.725946  7387678.197079 
+329557.446563  7387656.030875 
+329605.571565  7387620.936887 
+329652.805975  7387578.354181 
+329740.587100  7387502.307207 
+329829.761838  7387433.409008 
+329924.271887  7387362.961076 
+329956.506403  7387349.743340 
+329998.760089  7387334.725912 
+330042.836192  7387321.478181 
+330169.918852  7387293.382994 
+330213.376488  7387275.576044 
+330273.763635  7387267.907357 
+330296.300583  7387258.418983 
+330329.516400  7387242.991625 
+330386.456623  7387212.146909 
+330400.697863  7387206.217924 
+330438.663509  7387188.420973 
+330461.398367  7387176.463021 
+330497.970400  7387158.766052 
+330537.898649  7387136.099935 
+330579.360696  7387112.563966 
+330604.651886  7387098.216424 
+330661.105581  7387069.981260 
+330713.328959  7387041.756095 
+330829.064806  7386983.886008 
+330867.178885  7386966.948909 
+330923.632580  7386938.713745 
+331030.907794  7386882.263415 
+331124.057215  7386818.744295 
+331217.528240  7386677.328518 
+331248.616529  7386628.186936 
+331281.733392  7386579.725237 
+331296.337466  7386507.677578 
+331401.534630  7386315.070570 
+331420.063911  7386283.825922 
+331425.654855  7386259.310121 
+331437.958231  7386236.634005 
+331477.391706  7386135.751286 
+331520.890573  7386027.819773 
+331532.583728  7386000.004538 
+331574.952861  7385925.147360 
+331633.352666  7385827.404103 
+331652.566384  7385819.065531 
+331678.756412  7385816.755927 
+331707.486280  7385817.225846 
+331739.778519  7385812.116721 
+331764.690382  7385802.938293 
+331796.702249  7385789.180650 
+331839.137352  7385769.574008 
+331875.989757  7385756.566236 
+331915.142860  7385752.456940 
+331944.647873  7385754.706555 
+331959.268440  7385691.917310 
+331875.239350  7385635.317005 
+331795.292144  7385585.325568 
+331762.966920  7385558.640139 
+331778.214200  7385532.784568 
+331747.678408  7385525.655789 
+331744.511855  7385501.759882 
+331743.893388  7385443.299896 
+331745.888976  7385424.493118 
+331750.680036  7385406.686168 
+331756.510121  7385393.208476 
+331761.573307  7385382.030391 
+331765.869593  7385372.871960 
+331778.750205  7385263.280732 
+331758.992237  7385236.125383 
+331803.101324  7385161.358190 
+331709.770486  7385139.571922 
+331677.387538  7385122.604828 
+331693.220301  7385024.471638 
+331657.398675  7384938.176419 
+331594.347995  7384798.100413 
+331582.094097  7384771.934895 
+331544.103712  7384721.903465 
+331394.616043  7384702.736748 
+331327.862806  7384686.289565 
+Region 1
+286
+325879.528740  7381254.317431 
+325957.455620  7381110.702031 
+326015.063787  7381010.379215 
+326026.781681  7380969.316249 
+326080.019346  7380893.309268 
+326145.007889  7380773.469796 
+326208.272971  7380669.007689 
+326278.835967  7380552.007730 
+326364.720459  7380407.382503 
+326385.385513  7380376.507792 
+326428.035018  7380327.926113 
+326445.434564  7380311.208977 
+326561.021979  7380179.021619 
+326675.685817  7380053.003205 
+326748.689696  7379969.697475 
+326793.458483  7379907.108196 
+326813.216451  7379879.312957 
+326880.777819  7379773.461088 
+326932.621871  7379685.686123 
+326984.548385  7379590.942352 
+326999.944098  7379561.767349 
+326999.952344  7379561.767349 
+327025.037378  7379514.225493 
+327068.429044  7379424.920790 
+327118.442432  7379338.095662 
+327157.546058  7379281.435368 
+327203.477563  7379218.856087 
+327252.311741  7379143.678964 
+327404.899993  7378894.401663 
+327454.839165  7378812.035772 
+327465.369602  7378792.669089 
+327530.655010  7378682.148020 
+327583.430886  7378590.603701 
+327727.129701  7378367.911846 
+327782.272246  7378289.275316 
+327831.972278  7378213.318327 
+327931.957824  7378116.364934 
+328011.014438  7378053.305735 
+328064.953032  7378021.691151 
+328171.106759  7377971.119813 
+328187.252879  7378037.428455 
+328188.184703  7378053.835644 
+328195.507356  7378089.689503 
+328196.736044  7378124.263581 
+328230.710515  7378149.259299 
+328258.830161  7378151.468921 
+328286.982792  7378151.248958 
+328300.580827  7378156.838001 
+328307.416952  7378165.116583 
+328324.173293  7378179.934045 
+328332.724634  7378198.860803 
+328346.718487  7378222.726715 
+328355.764602  7378234.354723 
+328383.133842  7378282.746434 
+328416.209473  7378349.924927 
+328417.710287  7378369.661546 
+328414.312840  7378389.548140 
+328409.505287  7378398.796556 
+328398.422353  7378413.404054 
+328390.712128  7378427.481642 
+328385.698420  7378446.148445 
+328385.046967  7378466.624937 
+328390.621419  7378477.992990 
+328403.716434  7378492.210555 
+328413.818066  7378500.419149 
+328442.943753  7378512.947003 
+328472.316826  7378521.705503 
+328488.825780  7378522.565355 
+328509.655759  7378520.925636 
+328526.445084  7378515.476570 
+328546.376224  7378512.057155 
+328572.285880  7378511.257292 
+328591.755231  7378512.377100 
+328610.045371  7378518.236097 
+328626.034812  7378520.635686 
+328645.594871  7378522.535360 
+328665.699181  7378521.665509 
+328679.214753  7378517.166280 
+328690.396642  7378511.427263 
+328728.040685  7378501.908894 
+328749.959166  7378503.048698 
+328761.561612  7378505.068352 
+328773.254767  7378508.197816 
+328783.348154  7378517.396241 
+328800.525052  7378530.893929 
+328818.765714  7378540.852223 
+328834.647955  7378552.010312 
+328870.923123  7378589.313922 
+328900.725001  7378613.589764 
+328964.707504  7378690.456597 
+329001.518678  7378733.069298 
+329024.212305  7378754.705592 
+329041.653083  7378763.444095 
+329060.998740  7378766.773525 
+329094.552652  7378767.053477 
+329130.844313  7378768.253271 
+329156.011809  7378770.432898 
+329180.371175  7378771.832658 
+329197.844937  7378778.011600 
+329217.050408  7378792.529113 
+329239.323477  7378806.856659 
+329248.955075  7378811.955785 
+329260.574014  7378820.844263 
+329270.164380  7378829.482783 
+329275.912003  7378835.311785 
+329282.401786  7378847.239742 
+329296.321424  7378860.467476 
+329317.217372  7378876.654703 
+329332.406929  7378888.252716 
+329343.770235  7378901.890380 
+329345.526682  7378908.999163 
+329349.756998  7378921.896953 
+329351.983481  7378932.005222 
+329359.809153  7378938.174165 
+329365.828902  7378942.913354 
+329377.728213  7378946.262780 
+329385.809519  7378952.891644 
+329396.933684  7378961.110237 
+329425.746014  7378982.936498 
+329443.681565  7378992.674830 
+329467.562649  7379000.703455 
+329481.193669  7379008.162177 
+329507.993918  7379022.659694 
+329528.254907  7379034.637642 
+329548.235524  7379052.934508 
+329626.954041  7379150.877731 
+329661.192391  7379206.098272 
+329689.740842  7379269.147473 
+329721.101257  7379307.260944 
+329733.487095  7379341.785030 
+329779.665987  7379409.203482 
+329742.797090  7379405.704082 
+329694.820520  7379402.474635 
+329696.733645  7379593.821859 
+329733.231462  7379677.157584 
+329742.764105  7379707.312419 
+329744.339135  7379733.497934 
+329737.197899  7379777.150456 
+329718.940744  7379843.019174 
+329713.927036  7379883.322270 
+329718.083136  7379921.505730 
+329737.049467  7379963.918465 
+329753.863531  7380006.511169 
+329760.600702  7380050.693601 
+329761.870621  7380082.318184 
+329758.852501  7380112.962935 
+329754.292335  7380135.069148 
+329696.923308  7380173.192618 
+329683.721093  7380175.482226 
+329676.357209  7380182.341051 
+329659.271019  7380257.218225 
+329658.133040  7380306.869720 
+329664.779501  7380404.852937 
+329661.489255  7380461.653207 
+329662.767421  7380489.858376 
+329679.103204  7380580.032930 
+329686.821676  7380620.795947 
+329697.112972  7380660.899078 
+329732.217176  7380843.877736 
+329710.142016  7380875.142380 
+329687.547344  7380892.679376 
+329650.488784  7380917.065199 
+329620.794107  7380932.072629 
+329614.964022  7380936.901801 
+329607.847525  7380941.221062 
+329602.767847  7380946.040236 
+329600.236254  7380952.649104 
+329601.003154  7380959.008015 
+329642.671357  7381039.574214 
+329646.992382  7381044.913300 
+329655.106673  7381055.841428 
+329670.856973  7381068.289296 
+329693.971158  7381077.947641 
+329726.222166  7381088.115900 
+329775.081083  7381096.814410 
+329824.731637  7381105.662894 
+329874.118313  7381130.918568 
+329902.592547  7381164.902747 
+329837.521541  7381215.983997 
+329802.120473  7381234.770779 
+329767.659475  7381263.465864 
+329744.660738  7381286.411933 
+329687.522606  7381362.958822 
+329568.009985  7381399.402579 
+329550.725885  7381403.341904 
+329542.347715  7381403.531872 
+329530.662806  7381406.751320 
+329513.601355  7381414.489995 
+329438.206068  7381454.573129 
+329408.412437  7381469.850512 
+329391.837513  7381480.388707 
+329366.092781  7381497.975694 
+329359.883369  7381514.702829 
+329357.541440  7381523.071396 
+329356.147827  7381539.818527 
+329352.222621  7381556.555660 
+329344.768029  7381569.973362 
+329325.842929  7381590.649820 
+329308.261966  7381601.697928 
+329261.398637  7381625.233896 
+329247.182135  7381627.153567 
+329239.306985  7381627.353533 
+329230.417548  7381629.313198 
+329222.278519  7381631.292858 
+329083.642889  7381717.128156 
+329049.239615  7381736.944761 
+328991.911819  7381769.789135 
+328883.399670  7381828.159137 
+328829.213689  7381990.991245 
+328826.179076  7381999.999702 
+328820.992197  7382012.417575 
+328781.410290  7382150.953845 
+328751.567181  7382256.175822 
+328741.119207  7382316.055565 
+328737.020830  7382404.470420 
+328732.996669  7382451.392383 
+328728.857062  7382520.550537 
+328726.721288  7382559.933791 
+328721.237545  7382631.551523 
+328718.722444  7382658.206957 
+328716.998982  7382680.053215 
+328707.870405  7382793.563772 
+328704.299787  7382847.684502 
+328692.433461  7383035.912260 
+328691.707793  7383059.538213 
+328689.101984  7383095.602036 
+328691.946933  7383172.638840 
+328699.376787  7383193.295302 
+328723.958801  7383228.089342 
+328673.046573  7383210.022436 
+328636.491032  7383208.842638 
+328582.552438  7383233.858353 
+328576.499704  7383239.557377 
+328545.056827  7383269.132311 
+328488.908242  7383300.047016 
+328432.767904  7383315.324399 
+328402.867072  7383323.223046 
+328346.932889  7383334.361138 
+328248.423418  7383356.857285 
+328155.051348  7383375.564081 
+328109.260030  7383384.292585 
+328069.216334  7383385.992294 
+328042.449069  7383379.913336 
+328011.806076  7383355.327547 
+327999.997474  7383347.198939 
+327927.282212  7383286.069410 
+327811.620581  7383190.605762 
+327745.650735  7383142.234048 
+327693.617020  7383109.169712 
+327666.833263  7383082.854219 
+327554.593818  7383012.766225 
+327458.129411  7382945.517744 
+327405.493721  7382905.344625 
+327378.330637  7382888.947434 
+327277.800840  7382820.989074 
+327180.528303  7382767.468242 
+326932.926982  7382626.382409 
+326804.425969  7382556.034459 
+326755.286681  7382529.538997 
+326669.756777  7382480.637373 
+326665.419259  7382478.457747 
+326647.788818  7382470.839052 
+326564.427673  7382431.355815 
+326508.947033  7382405.470249 
+326423.458360  7382375.945306 
+326316.141914  7382347.000264 
+326243.286466  7382331.292955 
+326198.039399  7382307.826974 
+326137.462588  7382245.847591 
+326083.862089  7382197.585858 
+326039.142780  7382157.762679 
+325970.863991  7382108.621096 
+325902.032703  7382037.573266 
+325874.432569  7382009.048152 
+325833.869361  7381960.826412 
+325819.331256  7381952.747796 
+325775.716942  7381892.528111 
+325723.848152  7381832.018476 
+325675.096436  7381885.109382 
+325574.863503  7381821.520274 
+325612.095234  7381743.983556 
+325652.963553  7381670.716106 
+325703.438731  7381579.161788 
+325759.694516  7381481.598500 
+325804.496287  7381395.073321 
+325879.528740  7381254.317431 
+Region 1
+578
+321543.207123  7387086.988347 
+321457.932852  7387072.140890 
+321409.791358  7387175.963107 
+321404.431308  7387191.660418 
+321405.429102  7387203.348416 
+321378.373219  7387312.749676 
+321346.419075  7387518.064508 
+321356.900034  7387580.773766 
+321356.908280  7387580.773766 
+321356.900034  7387580.793763 
+321356.908280  7387580.823758 
+321356.891788  7387580.823758 
+321345.033708  7387624.826220 
+321252.956297  7387801.076030 
+321227.549660  7387861.845621 
+321226.189032  7387856.726498 
+321225.801459  7387846.208300 
+321224.548032  7387832.230694 
+321224.943851  7387816.623367 
+321223.352329  7387804.855383 
+321220.944430  7387801.176013 
+321214.891696  7387795.456993 
+321203.932456  7387790.667813 
+321192.123853  7387787.638332 
+321183.110723  7387782.099281 
+321174.584121  7387778.119963 
+321161.406644  7387770.651242 
+321149.482595  7387761.422823 
+321125.675727  7387738.206799 
+321114.972119  7387728.768416 
+321104.763286  7387721.109728 
+321091.618794  7387710.651519 
+321078.680458  7387700.743217 
+321057.199028  7387687.525481 
+321040.871491  7387679.236900 
+321039.873697  7387679.106923 
+321028.650577  7387677.427210 
+321006.979483  7387679.596839 
+320987.031851  7387683.776123 
+320970.019877  7387689.105210 
+320947.252034  7387697.913701 
+320936.903015  7387701.663059 
+320929.728794  7387704.012657 
+320924.096619  7387705.382422 
+320914.176403  7387707.032139 
+320907.562926  7387705.732362 
+320899.003339  7387704.192626 
+320884.621913  7387694.924213 
+320872.706109  7387684.815945 
+320861.854070  7387670.948320 
+320846.878915  7387651.711615 
+320835.218745  7387637.394068 
+320822.321640  7387623.826392 
+320807.948460  7387614.128053 
+320791.126150  7387604.399719 
+320768.176890  7387594.591399 
+320740.749926  7387583.953222 
+320715.203104  7387570.455534 
+320685.854769  7387557.917681 
+320661.924208  7387545.319839 
+320648.276696  7387534.971612 
+320634.134410  7387522.833691 
+320620.552869  7387506.716452 
+320599.401287  7387475.661771 
+320581.210102  7387452.735698 
+320567.133786  7387435.728611 
+320555.028320  7387424.060610 
+320543.607290  7387414.942172 
+320532.697527  7387405.723751 
+320521.713548  7387394.625652 
+320504.734559  7387380.908001 
+320481.777053  7387363.341010 
+320467.016300  7387352.422881 
+320457.747537  7387342.224628 
+320441.518955  7387325.967412 
+320426.890142  7387312.269759 
+320413.531248  7387303.131324 
+320405.235540  7387296.942384 
+320400.914515  7387291.463322 
+320398.951912  7387285.124408 
+320397.170727  7387272.366594 
+320395.711144  7387249.860449 
+320394.589656  7387233.453259 
+320394.070144  7387225.914550 
+320391.340642  7387190.660589 
+320388.685355  7387179.542494 
+320387.539129  7387175.553177 
+320380.381401  7387160.065830 
+320371.508457  7387143.348693 
+320364.820764  7387123.172149 
+320358.743292  7387102.315722 
+320352.970930  7387073.670628 
+320345.714247  7387041.566128 
+320337.459770  7387015.550584 
+320334.581836  7387009.201671 
+320329.683575  7387002.942743 
+320326.145942  7386998.353530 
+320311.533621  7386982.996160 
+320290.439763  7386963.469505 
+320271.943468  7386949.281935 
+320260.910011  7386942.053173 
+320244.582475  7386933.324668 
+320238.018475  7386927.595650 
+320222.969104  7386915.227768 
+320203.433784  7386901.590104 
+320179.198112  7386881.013629 
+320154.517144  7386862.876735 
+320138.024682  7386851.158743 
+320125.803768  7386841.260438 
+320113.690056  7386830.372303 
+320103.720363  7386819.164223 
+320098.426283  7386810.135770 
+320092.497243  7386794.438458 
+320086.263093  7386778.641164 
+320078.412681  7386761.044178 
+320070.743686  7386745.766795 
+320060.345190  7386728.029834 
+320048.833452  7386710.272875 
+320038.401970  7386695.525401 
+320022.956780  7386673.079246 
+320010.208107  7386655.862195 
+320000.254907  7386644.214190 
+319989.040033  7386634.995769 
+319969.348034  7386617.918695 
+319957.226075  7386608.020390 
+319934.359278  7386591.573207 
+319930.516534  7386587.963826 
+319920.942661  7386578.995362 
+319914.428138  7386569.387008 
+319908.705254  7386553.149789 
+319901.629988  7386531.573485 
+319894.315582  7386511.986840 
+319887.941245  7386490.870457 
+319883.562497  7386482.061966 
+319877.039729  7386473.123497 
+319871.209643  7386466.184685 
+319858.411494  7386452.617009 
+319845.316479  7386438.499427 
+319825.649219  7386419.762637 
+319808.101240  7386403.155482 
+319790.643970  7386386.768289 
+319775.792509  7386374.840332 
+319768.049298  7386365.551923 
+319762.746972  7386356.623452 
+319758.120836  7386351.034409 
+319749.635465  7386344.285565 
+319729.242537  7386325.978701 
+319713.228357  7386309.381544 
+319703.778176  7386297.523575 
+319697.791413  7386286.485466 
+319688.860745  7386274.417533 
+319677.777811  7386254.230991 
+319667.032973  7386231.834827 
+319657.871410  7386213.887901 
+319647.819255  7386193.051471 
+319639.267914  7386174.554639 
+319631.269070  7386161.496876 
+319626.708905  7386150.478763 
+319621.480795  7386136.011241 
+319617.019584  7386125.553032 
+319608.394027  7386113.145158 
+319605.103780  7386104.366661 
+319599.405635  7386088.999294 
+319590.408997  7386074.051854 
+319586.492038  7386065.673289 
+319583.943953  7386060.014259 
+319572.382737  7386037.498115 
+319562.907818  7386019.881133 
+319556.500497  7386001.854221 
+319547.083302  7385979.478054 
+319534.598508  7385957.501818 
+319521.198384  7385943.264257 
+319507.352962  7385924.377492 
+319493.532280  7385903.161126 
+319481.698939  7385894.262650 
+319466.377442  7385887.543801 
+319409.082632  7385866.227452 
+319382.340106  7385858.038855 
+319368.766810  7385850.440157 
+319346.864822  7385838.432214 
+319316.337276  7385823.544764 
+319285.199509  7385807.877447 
+319262.456405  7385798.399071 
+319223.930015  7385786.511107 
+319211.651378  7385781.152025 
+319206.382036  7385777.982568 
+319199.422218  7385771.363702 
+319193.410715  7385762.545212 
+319179.260184  7385734.450025 
+319170.634626  7385722.492073 
+319159.213597  7385713.603596 
+319143.488035  7385705.984901 
+319118.609157  7385696.486528 
+319092.311928  7385685.638386 
+319080.066275  7385677.619759 
+319066.064176  7385670.470984 
+319037.227107  7385659.142924 
+319010.492827  7385650.504404 
+318997.274120  7385646.905020 
+318980.270392  7385635.736933 
+318952.488841  7385604.372306 
+318937.711596  7385589.764808 
+318923.420878  7385576.157139 
+318892.810870  7385560.509819 
+318839.746375  7385519.006928 
+318816.087940  7385502.549747 
+318798.539961  7385494.471131 
+318778.889193  7385482.373203 
+318774.180596  7385475.334409 
+318769.513229  7385464.756221 
+318756.063627  7385414.304863 
+318748.411125  7385389.289148 
+318737.402407  7385355.474940 
+318729.411809  7385325.250117 
+318723.532247  7385305.903431 
+318714.552102  7385277.788247 
+318703.881479  7385244.403965 
+318695.338384  7385217.498574 
+318685.995405  7385189.753326 
+318673.263225  7385163.277861 
+318668.595858  7385144.501078 
+318667.474371  7385128.093888 
+318669.214326  7385111.286767 
+318677.691451  7385094.439653 
+318683.208179  7385077.562544 
+318688.469274  7385064.674751 
+318689.871133  7385050.067253 
+318688.395058  7385037.749363 
+318683.208179  7385028.270987 
+318669.049401  7385017.572819 
+318651.229297  7385006.274755 
+318638.571333  7384998.586072 
+318620.644027  7384988.067873 
+318606.105923  7384975.260067 
+318573.261186  7384957.793059 
+318562.978136  7384947.804770 
+318543.154198  7384933.487222 
+318515.364401  7384919.849558 
+318495.235352  7384905.761972 
+318484.589468  7384899.862982 
+318472.492247  7384888.414943 
+318449.303847  7384857.560228 
+318434.955405  7384845.862232 
+318422.231472  7384843.152696 
+318408.072694  7384841.313011 
+318387.119021  7384836.073908 
+318372.910766  7384829.355059 
+318365.637591  7384823.726024 
+318359.114822  7384814.567592 
+318348.073119  7384800.250045 
+318337.773577  7384791.371566 
+318320.440000  7384773.764581 
+318298.191670  7384765.735957 
+318287.339631  7384760.836796 
+318273.527194  7384755.567698 
+318259.772482  7384753.957974 
+318244.879789  7384752.998139 
+318226.597896  7384754.427894 
+318211.870128  7384757.457375 
+318195.831209  7384758.917125 
+318172.271728  7384757.847308 
+318153.000287  7384756.167596 
+318137.307710  7384754.757837 
+318098.146361  7384744.299629 
+318073.861212  7384736.460971 
+318056.420434  7384727.162564 
+318043.366651  7384718.694015 
+318034.485460  7384710.825362 
+318016.121105  7384693.988246 
+317990.730961  7384676.501242 
+317978.881127  7384669.042519 
+317962.471128  7384659.094223 
+317949.417345  7384650.395713 
+317936.610949  7384638.607733 
+317928.043115  7384629.969212 
+317925.833125  7384619.091076 
+317920.761693  7384600.304294 
+317916.737533  7384587.406503 
+317912.614418  7384574.288750 
+317908.400594  7384560.611093 
+317903.254946  7384547.363362 
+317900.723353  7384538.024962 
+317893.648087  7384528.336621 
+317891.990595  7384526.067010 
+317873.923103  7384510.229723 
+317858.461421  7384506.600344 
+317838.670467  7384506.130425 
+317815.086248  7384507.380211 
+317802.114927  7384508.000105 
+317785.375079  7384508.560009 
+317770.705034  7384506.720324 
+317754.822794  7384495.662218 
+317739.723946  7384486.943711 
+317725.095133  7384473.695981 
+317714.325555  7384461.488072 
+317697.800109  7384445.110877 
+317685.158638  7384435.872459 
+317670.933890  7384414.536114 
+317660.419946  7384398.568849 
+317646.896127  7384378.792237 
+317636.093565  7384369.013912 
+317628.094722  7384364.374706 
+317617.704471  7384362.804975 
+317608.881004  7384358.705677 
+317601.088316  7384345.207989 
+317596.132332  7384333.519991 
+317591.201086  7384320.162279 
+317583.268212  7384301.345503 
+317574.782840  7384286.178101 
+317569.365067  7384270.930712 
+317561.646595  7384251.893973 
+317551.083174  7384223.518834 
+317549.137063  7384207.651552 
+317550.967726  7384183.865626 
+317554.596068  7384171.057820 
+317554.431143  7384159.649774 
+317551.850073  7384137.683536 
+317548.493857  7384120.476484 
+317543.801752  7384103.799340 
+317538.342747  7384091.881382 
+317528.645180  7384075.924115 
+317522.641924  7384066.435741 
+317512.936111  7384051.248342 
+317497.614614  7384036.210918 
+317478.747238  7384018.803899 
+317479.868726  7384010.735282 
+317483.002293  7383997.147609 
+317486.902760  7383986.569421 
+317490.300207  7383976.311178 
+317491.124831  7383967.232733 
+317490.258976  7383955.374764 
+317486.490449  7383946.686253 
+317477.081500  7383931.728815 
+317468.505420  7383923.870161 
+317447.881597  7383908.982711 
+317428.634895  7383897.894610 
+317412.645453  7383878.857871 
+317385.680279  7383856.371723 
+317350.155518  7383833.775593 
+317323.256313  7383813.829010 
+317300.158621  7383792.602646 
+317273.696467  7383770.896364 
+317251.283212  7383751.789637 
+317226.099224  7383734.082670 
+317173.496518  7383697.978854 
+317164.219509  7383680.471853 
+317156.905102  7383653.576460 
+317154.777575  7383636.379405 
+317156.047494  7383616.452819 
+317157.902896  7383598.865831 
+317161.910564  7383580.418991 
+317168.713705  7383558.352771 
+317177.025905  7383538.746129 
+317188.298503  7383502.002423 
+317193.081316  7383478.576435 
+317194.450191  7383467.408348 
+317193.930678  7383443.702409 
+317192.652512  7383423.525865 
+317190.648678  7383412.087824 
+317221.110254  7383420.606365 
+317238.122228  7383429.594826 
+317262.333161  7383442.092685 
+317280.309944  7383465.178730 
+317294.922265  7383484.015504 
+317304.100319  7383511.180851 
+317309.913912  7383533.716990 
+317316.873731  7383555.513257 
+317326.142494  7383575.049910 
+317336.120433  7383599.165780 
+317349.941116  7383619.912226 
+317366.062497  7383639.918799 
+317388.673661  7383658.105684 
+317412.826871  7383674.042954 
+317440.097155  7383684.681132 
+317463.986485  7383691.839905 
+317489.038534  7383697.498936 
+317511.591975  7383689.800255 
+317546.028234  7383675.022786 
+317598.482507  7383650.576973 
+317655.216574  7383617.812586 
+317678.174080  7383608.974100 
+317699.630772  7383597.066139 
+317713.319515  7383597.626043 
+317780.468571  7383493.423892 
+317803.079736  7383480.766060 
+317830.383006  7383458.659847 
+317874.129259  7383429.914771 
+318064.023459  7383350.338402 
+318091.763778  7383349.308578 
+318114.869717  7383352.717994 
+318153.758940  7383347.518884 
+318181.548738  7383347.118953 
+318220.998705  7383326.242529 
+318242.546106  7383315.654343 
+318266.996180  7383303.666396 
+318315.112935  7383290.968571 
+318344.354069  7383275.421234 
+318351.091240  7383263.373298 
+318359.609596  7383257.084375 
+318372.251068  7383253.944913 
+318427.838908  7383254.834760 
+318451.043801  7383255.764601 
+318474.792946  7383250.185557 
+318490.510261  7383245.586345 
+318504.363929  7383239.417401 
+318527.403897  7383231.178812 
+318560.792885  7383202.573712 
+318611.721606  7383154.102015 
+318650.280980  7383117.658258 
+318638.406408  7383137.614839 
+318631.133233  7383156.891537 
+318619.440078  7383203.153613 
+318645.910478  7383228.929198 
+318660.761939  7383246.046266 
+318688.551737  7383281.010277 
+318683.488551  7383320.183567 
+318672.380878  7383391.631328 
+318734.763613  7383361.396507 
+318776.308123  7383342.899676 
+318883.072071  7383280.820309 
+318902.821794  7383271.801854 
+318961.386524  7383258.654106 
+319005.973893  7383257.764259 
+319035.379951  7383254.244861 
+319056.119221  7383246.706153 
+319065.602387  7383231.288794 
+319096.773139  7383199.964159 
+319115.558052  7383194.285132 
+319137.047729  7383169.989294 
+319161.778175  7383137.004944 
+319171.739621  7383117.008369 
+319182.261812  7383089.413096 
+319252.132124  7383064.687331 
+319310.498944  7383043.151020 
+319350.039620  7383029.563347 
+319418.318410  7383007.857065 
+319466.369196  7382988.360405 
+319527.011976  7382967.633955 
+319590.029671  7382942.368283 
+319632.184402  7382928.940583 
+319663.083028  7382888.377531 
+319759.440233  7382766.218456 
+319834.546902  7382684.862392 
+319892.963200  7382645.219182 
+319903.378189  7382649.358473 
+319936.989825  7382703.859138 
+319955.733508  7382731.344430 
+319988.751415  7382775.836808 
+320020.153061  7382810.670842 
+320075.336837  7382869.280802 
+320109.278322  7382905.144659 
+320122.818633  7382940.868540 
+320137.348491  7382962.194887 
+320163.670460  7382986.670694 
+320214.236346  7383026.993788 
+320234.002561  7383053.659220 
+320266.913267  7383119.857881 
+320289.268799  7383135.205252 
+320345.714247  7383150.632609 
+320386.739245  7383174.838463 
+320423.888514  7383215.791448 
+320452.923492  7383285.199559 
+320477.901325  7383319.733644 
+320507.513539  7383343.419587 
+320534.486959  7383364.735935 
+320549.371406  7383373.664406 
+320616.033934  7383404.389143 
+320645.728611  7383420.486386 
+320655.863228  7383426.485358 
+320665.857660  7383435.133877 
+320674.400755  7383445.542094 
+320676.618991  7383455.650363 
+320675.876830  7383465.178730 
+320658.378329  7383503.932092 
+320642.116762  7383548.734418 
+320635.849626  7383562.911990 
+320638.224541  7383590.747222 
+320646.347078  7383619.092366 
+320657.281580  7383642.378378 
+320664.925836  7383667.943999 
+320676.635483  7383686.250863 
+320687.132935  7383703.987825 
+320700.632014  7383718.005423 
+320717.248169  7383736.372277 
+320730.813219  7383744.510883 
+320749.441454  7383756.378850 
+320760.293493  7383761.717936 
+320778.971206  7383770.026513 
+320797.846827  7383786.323721 
+320808.426741  7383797.301841 
+320820.952766  7383807.760049 
+320842.401212  7383822.647499 
+320865.935954  7383830.506153 
+320866.900763  7383841.424283 
+320896.191374  7383846.343440 
+320918.637614  7383854.372065 
+320949.008481  7383865.490161 
+320976.806525  7383870.599286 
+321018.862301  7383877.318135 
+321049.439325  7383888.656193 
+321116.423456  7383877.238148 
+321181.494462  7383864.760286 
+321192.907245  7383863.060577 
+321200.815381  7383858.611339 
+321215.262777  7383854.032123 
+321225.636535  7383856.811647 
+321244.388463  7383890.785828 
+321257.310307  7383911.702245 
+321281.455270  7383931.048931 
+321298.879555  7383941.117206 
+321320.212554  7383942.956891 
+321345.479005  7383943.796747 
+321371.908174  7383943.786749 
+321388.103771  7383945.976374 
+321409.098674  7383948.225989 
+321424.073829  7383950.405615 
+321441.407406  7383959.364081 
+321458.056546  7383966.332887 
+321484.032172  7383986.469438 
+321503.567492  7383999.227253 
+321516.431612  7384007.255877 
+321533.113737  7384019.523776 
+321547.305500  7384027.342437 
+321560.433499  7384038.360550 
+321575.590071  7384050.838412 
+321584.108427  7384063.126307 
+321600.765813  7384077.953768 
+321620.029008  7384088.272000 
+321649.204172  7384096.930517 
+321689.676672  7384124.675765 
+321715.751253  7384145.592182 
+321732.367408  7384163.739073 
+321761.146753  7384188.014915 
+321778.942119  7384218.029774 
+321789.068490  7384249.274422 
+321797.677555  7384296.126397 
+321817.715895  7384401.698313 
+321833.012653  7384506.790312 
+321851.096637  7384497.921831 
+321867.737530  7384529.656395 
+321898.446493  7384550.382845 
+321941.747450  7384561.300975 
+321954.042580  7384565.580242 
+321976.859900  7384633.218656 
+322034.385605  7384701.326989 
+322125.201344  7384858.750024 
+322220.560755  7385007.084616 
+322371.928565  7385215.968836 
+322408.022316  7385220.378081 
+322088.893190  7385746.477965 
+322097.964044  7385784.491453 
+322104.338380  7385809.067244 
+322109.747907  7385838.232248 
+322109.046978  7385866.187459 
+322097.048712  7385906.460561 
+322062.323835  7385914.719146 
+322027.970038  7386004.003853 
+321844.450175  7386404.245295 
+321822.226583  7386502.288501 
+321813.032036  7386538.512296 
+321808.950152  7386551.170128 
+321801.800670  7386578.775399 
+321797.463153  7386594.482709 
+321790.833183  7386610.429977 
+321750.566839  7386691.686059 
+321746.237568  7386700.044627 
+321737.323393  7386713.962243 
+321728.673097  7386722.050858 
+321711.356012  7386736.198434 
+321698.368199  7386748.836270 
+321690.987823  7386758.204665 
+321685.380386  7386768.832844 
+321677.233110  7386786.299852 
+321670.586648  7386806.806340 
+321667.791176  7386817.204559 
+321626.221927  7386921.266734 
+321565.908996  7386955.840812 
+321543.207123  7387086.988347 
+Region 1
+710
+344711.082834  7398740.002291 
+344699.521619  7398749.370687 
+344675.154007  7398767.177637 
+344652.979893  7398780.615335 
+344634.541321  7398790.923569 
+344539.132433  7398820.058579 
+344507.648324  7398832.396465 
+344469.410553  7398849.453543 
+344406.829908  7398855.422521 
+344349.543344  7398858.022076 
+344305.582688  7398853.902781 
+344287.680122  7398852.972941 
+344241.427014  7398836.045840 
+344193.747308  7398807.740688 
+344128.057835  7398779.385545 
+344058.146292  7398746.641154 
+344040.268464  7398737.702685 
+344017.987148  7398732.753533 
+344000.043350  7398728.764216 
+343924.037843  7398706.408046 
+343900.197990  7398703.428556 
+343776.776656  7398684.621778 
+343715.977197  7398692.660401 
+343696.046058  7398695.239959 
+343640.812805  7398699.719192 
+343640.713850  7398699.619209 
+343600.967018  7398702.488717 
+343566.613221  7398708.417702 
+343506.193089  7398710.787296 
+343425.643909  7398697.749529 
+343367.837832  7398680.862422 
+343324.553367  7398669.794317 
+343276.246948  7398659.726042 
+343202.773033  7398657.716386 
+343178.059080  7398660.265950 
+343144.513413  7398662.995482 
+343119.106777  7398666.524877 
+343095.893637  7398670.854136 
+343063.147856  7398678.512824 
+343015.542366  7398691.340627 
+342935.281803  7398717.186200 
+342862.080014  7398740.742165 
+342862.063521  7398740.742165 
+342793.421897  7398764.678065 
+342768.204924  7398769.087309 
+342733.430569  7398779.655499 
+342673.125885  7398790.763596 
+342613.959180  7398772.106792 
+342584.965433  7398767.987498 
+342562.717102  7398764.678065 
+342541.161456  7398759.678921 
+342521.799306  7398752.500151 
+342492.574665  7398739.952300 
+342468.380224  7398728.444271 
+342444.317723  7398719.375825 
+342419.331644  7398712.507001 
+342395.895856  7398705.008286 
+342366.151703  7398703.788495 
+342327.130539  7398701.078959 
+342279.508557  7398694.730046 
+342169.973875  7398679.362678 
+342170.831483  7398728.284299 
+342169.363654  7398743.261733 
+342169.998614  7398793.143189 
+342177.139850  7398817.748974 
+342189.039161  7398833.616256 
+342186.656000  7398856.632314 
+342188.198045  7398878.498568 
+342200.138587  7398900.304833 
+342190.630683  7398928.050081 
+342173.956805  7398970.112876 
+342138.250626  7399028.042953 
+342128.726230  7399070.895612 
+342106.510884  7399119.307320 
+342093.811689  7399138.354057 
+342072.866263  7399177.477356 
+342046.989592  7399247.865299 
+341967.751561  7399255.064066 
+341887.713647  7399259.963227 
+341881.916546  7399258.973396 
+341827.021389  7399255.743950 
+341800.468526  7399248.495191 
+341780.355970  7399240.116626 
+341764.036679  7399233.257801 
+341746.587655  7399222.979562 
+341724.966039  7399208.132105 
+341704.762774  7399202.033150 
+341679.356137  7399230.608255 
+341680.955906  7399273.460915 
+341661.857635  7399330.811091 
+341657.503626  7399363.895424 
+341647.138114  7399411.967190 
+341641.942988  7399436.522984 
+341635.189326  7399466.237894 
+341564.848978  7399726.383333 
+341571.800551  7399727.123207 
+341608.586985  7399727.123207 
+341635.461451  7399726.293349 
+341661.082490  7399720.504340 
+341689.193890  7399712.245755 
+341711.104125  7399701.497596 
+341735.075917  7399683.720641 
+341751.197298  7399663.884039 
+341764.424252  7399638.248430 
+341775.581402  7399612.622819 
+341790.465849  7399586.587279 
+341804.929737  7399569.640182 
+341821.463430  7399555.992520 
+341835.523253  7399549.383652 
+341858.670422  7399548.553794 
+341895.827938  7399550.573448 
+341931.047589  7399553.083018 
+341962.416250  7399564.261103 
+341987.633223  7399570.460042 
+342009.131147  7399582.857918 
+342020.288297  7399602.294589 
+342027.726397  7399623.370978 
+342033.515251  7399651.896092 
+342039.716416  7399668.843189 
+342049.224320  7399683.310711 
+342063.275897  7399699.018021 
+342085.598443  7399715.965118 
+342126.524486  7399743.660374 
+342152.557836  7399764.326834 
+342195.553683  7399809.789047 
+342218.288541  7399840.793736 
+342224.481460  7399849.472249 
+342236.059168  7399878.817223 
+342250.943614  7399912.301487 
+342258.381714  7399934.627663 
+342259.206337  7399958.603556 
+342255.487287  7399977.610300 
+342244.742449  7399992.497750 
+342229.858002  7400004.895627 
+342211.675064  7400025.152157 
+342180.256925  7400063.175644 
+342166.617660  7400077.233236 
+342158.759002  7400086.321679 
+342144.295113  7400114.436863 
+342129.410667  7400140.062474 
+342113.289286  7400163.618439 
+342110.815417  7400170.647235 
+342111.227728  7400178.915819 
+342114.122155  7400186.764474 
+342123.217748  7400193.793270 
+342133.137963  7400202.061854 
+342139.330882  7400210.330438 
+342141.812998  7400223.558172 
+342139.842149  7400249.223775 
+342137.442496  7400277.458939 
+342139.842149  7400302.094719 
+342142.843777  7400328.520193 
+342147.049354  7400361.564532 
+342151.254932  7400403.017432 
+342159.064112  7400425.843522 
+342167.475268  7400434.262080 
+342192.106759  7400447.469818 
+342228.159279  7400455.888376 
+342257.598322  7400456.488273 
+342276.218311  7400452.878891 
+342290.038994  7400440.860950 
+342309.260957  7400420.444447 
+342322.479665  7400415.635271 
+342333.892448  7400414.435476 
+342344.109528  7400419.834551 
+342362.127542  7400439.061258 
+342372.344622  7400449.879405 
+342387.361008  7400460.687554 
+342407.786921  7400471.505701 
+342418.004001  7400479.314363 
+342424.007257  7400488.922717 
+342431.222709  7400511.758806 
+342437.225964  7400529.775719 
+342450.444672  7400553.811602 
+342466.665008  7400572.428413 
+342495.502076  7400591.055223 
+342514.130311  7400598.863885 
+342526.747044  7400602.473267 
+342557.381791  7400601.873370 
+342586.218860  7400598.863885 
+342602.439195  7400598.263988 
+342621.669405  7400600.063680 
+342633.684163  7400604.872856 
+342639.093691  7400616.890797 
+342641.493344  7400636.107506 
+342639.687419  7400677.560405 
+342637.889741  7400708.205156 
+342639.687419  7400762.275894 
+342635.481842  7400779.692911 
+342627.070686  7400812.137353 
+342612.054300  7400845.771592 
+342602.439195  7400875.216549 
+342598.835593  7400895.043152 
+342599.437568  7400915.459655 
+342607.246748  7400963.521423 
+342618.659531  7401009.183601 
+342628.274636  7401030.210000 
+342639.687419  7401045.227427 
+342658.315654  7401062.654442 
+342700.371431  7401092.089400 
+342738.221629  7401114.915490 
+342784.474737  7401149.159625 
+342824.130860  7401185.803348 
+342848.160376  7401211.638922 
+342878.803369  7401233.865115 
+342908.836141  7401250.082337 
+342949.696214  7401264.499868 
+342993.549669  7401280.127191 
+343028.991968  7401298.144105 
+343056.633333  7401317.970709 
+343073.455644  7401332.388239 
+343088.472030  7401357.024019 
+343090.871683  7401387.658772 
+343087.870055  7401407.485376 
+343078.856925  7401428.511774 
+343056.633333  7401447.138583 
+343025.388365  7401466.355292 
+343015.781507  7401478.973131 
+343007.964080  7401493.390661 
+343002.562799  7401512.017470 
+343000.756874  7401543.252120 
+343007.370351  7401577.496254 
+343020.580813  7401619.549051 
+343034.401495  7401659.802156 
+343047.620203  7401707.863924 
+343060.236936  7401730.090116 
+343076.457272  7401741.508161 
+343097.485160  7401748.716926 
+343122.718626  7401751.116515 
+343143.144539  7401748.716926 
+343158.762900  7401742.707955 
+343174.983236  7401728.890322 
+343193.611471  7401705.464335 
+343205.024254  7401685.637731 
+343218.844936  7401661.001951 
+343239.872824  7401629.767301 
+343263.300366  7401597.922756 
+343289.135806  7401576.896357 
+343308.959745  7401566.688106 
+343361.224355  7401558.879443 
+343423.104069  7401559.479341 
+343449.541485  7401566.688106 
+343468.161474  7401581.705533 
+343481.380181  7401607.541108 
+343490.393312  7401633.366684 
+343493.394940  7401656.802670 
+343493.996914  7401704.864437 
+343500.008416  7401801.577871 
+343503.010044  7401848.439844 
+343509.021547  7401880.284390 
+343515.626777  7401913.928627 
+343518.026430  7401946.363071 
+343515.024802  7401987.216073 
+343507.817597  7402021.460207 
+343504.815969  7402055.704342 
+343508.419572  7402085.139300 
+343518.026430  7402106.165698 
+343536.052691  7402118.183640 
+343567.891387  7402124.792508 
+343595.532752  7402125.992302 
+343611.753088  7402121.783023 
+343624.369821  7402113.374463 
+343632.179001  7402100.756625 
+343635.180629  7402083.939505 
+343638.784232  7402049.695371 
+343640.590157  7402001.633604 
+343644.795734  7401971.598748 
+343654.402593  7401950.572350 
+343667.621301  7401930.745746 
+343689.853138  7401911.519039 
+343707.879399  7401900.110993 
+343727.703337  7401895.301817 
+343741.515773  7401893.502125 
+343753.538778  7401895.301817 
+343764.349586  7401906.719861 
+343831.638828  7401976.407924 
+343939.177922  7402086.938991 
+344066.540954  7402214.907072 
+344112.802308  7402264.768531 
+344141.037402  7402295.403283 
+344162.667265  7402320.039064 
+344173.478073  7402335.056491 
+344183.093178  7402353.073405 
+344187.900731  7402372.300112 
+344192.708283  7402394.526305 
+344196.913861  7402411.953319 
+344202.315142  7402431.180026 
+344204.121067  7402457.005602 
+344204.723041  7402483.441074 
+344202.315142  7402511.076341 
+344199.915489  7402533.902431 
+344198.109564  7402551.329446 
+344199.313514  7402561.537697 
+344200.517464  7402568.146565 
+344205.918745  7402577.764917 
+344216.135825  7402590.382756 
+344231.754185  7402606.000081 
+344247.974521  7402630.025966 
+344258.191601  7402643.243702 
+344262.999153  7402658.261129 
+344263.592882  7402679.887425 
+344269.604384  7402697.314440 
+344284.620770  7402706.322897 
+344303.850980  7402710.532176 
+344328.482471  7402716.541146 
+344360.321167  7402728.549089 
+344393.363814  7402731.558574 
+344411.992049  7402732.758368 
+344437.819243  7402735.757855 
+344481.680944  7402739.367236 
+344515.927540  7402742.966620 
+344572.397727  7402745.376207 
+344617.455131  7402742.366723 
+344651.701727  7402736.357752 
+344685.346348  7402733.958163 
+344728.597828  7402730.358779 
+344746.624088  7402732.158471 
+344782.668362  7402738.767339 
+344797.091020  7402741.766825 
+344850.559579  7402736.967647 
+344865.295594  7402724.359807 
+344873.014065  7402716.391172 
+344888.244853  7402695.914679 
+345233.275390  7402956.939968 
+345193.058523  7402947.101653 
+345178.116353  7402944.642075 
+345160.922962  7402939.882890 
+345137.322250  7402940.592768 
+345115.131643  7402949.131306 
+345104.139418  7402955.800163 
+345094.598529  7402967.528155 
+345094.474836  7402974.866897 
+345094.474836  7402983.275457 
+345097.476464  7403000.092577 
+345101.080066  7403013.310312 
+345112.501096  7403037.346195 
+345135.928637  7403067.980948 
+345157.558500  7403087.807552 
+345176.780464  7403095.016317 
+345206.821482  7403100.425390 
+345236.260525  7403111.833436 
+345254.880514  7403122.651583 
+345266.895272  7403140.068600 
+345271.702825  7403166.504072 
+345277.112352  7403210.356560 
+345286.125482  7403233.792546 
+345292.730713  7403244.600695 
+345301.141868  7403248.809973 
+345316.760229  7403251.809460 
+345344.401594  7403251.809460 
+345384.049471  7403254.818944 
+345417.694092  7403259.618122 
+345432.710478  7403264.427298 
+345456.739994  7403272.235961 
+345471.764626  7403275.245445 
+345489.782640  7403280.644521 
+345513.820403  7403288.463181 
+345524.029236  7403294.462154 
+345542.055496  7403314.288758 
+345556.469908  7403329.306185 
+345573.292218  7403350.932481 
+345591.318478  7403371.968877 
+345624.963099  7403398.394351 
+345648.992616  7403417.021160 
+345682.035262  7403430.238896 
+345708.472677  7403440.447148 
+345733.104168  7403457.274265 
+345748.120554  7403462.683339 
+345767.342518  7403465.082928 
+345790.176330  7403465.682825 
+345813.603872  7403466.282722 
+345831.630132  7403462.073443 
+345855.057673  7403456.074471 
+345878.493461  7403454.264781 
+345896.511475  7403454.264781 
+345919.947262  7403457.274265 
+345933.157724  7403459.673854 
+345943.374803  7403461.473546 
+345955.991536  7403459.073957 
+345968.006294  7403454.264781 
+345984.828605  7403441.646942 
+346001.650915  7403421.830337 
+346017.269276  7403402.003733 
+346037.093215  7403367.159701 
+346052.719822  7403319.097934 
+346056.925399  7403302.880712 
+346056.925399  7403284.853800 
+346048.415289  7403270.736218 
+346040.028873  7403251.209562 
+346018.473226  7403218.775118 
+345989.636157  7403189.930059 
+345962.003038  7403173.712837 
+345932.563995  7403162.904688 
+345896.511475  7403159.295307 
+345847.248493  7403159.295307 
+345834.631760  7403158.695409 
+345811.204219  7403153.286336 
+345784.164828  7403139.468703 
+345771.548095  7403131.660040 
+345758.337634  7403123.251481 
+345751.724157  7403116.042715 
+345746.916604  7403105.824466 
+345742.117298  7403084.198170 
+345742.117298  7403061.372080 
+345748.722529  7403042.745271 
+345759.533337  7403025.328254 
+345779.365522  7403015.709901 
+345793.779933  7403011.510621 
+345819.013399  7403010.910723 
+345847.248493  7403022.918667 
+345864.672778  7403034.936608 
+345881.495089  7403050.553933 
+345891.703922  7403058.372594 
+345905.524605  7403060.172285 
+345919.345287  7403052.363623 
+345927.154468  7403040.345682 
+345940.975150  7403013.910210 
+345954.787587  7402990.484222 
+345968.006294  7402964.048751 
+345977.019424  7402943.022352 
+345982.428952  7402926.205233 
+345983.624655  7402916.586880 
+345980.021052  7402902.769247 
+345984.226630  7402879.343260 
+345988.432208  7402858.916759 
+345997.445338  7402825.872419 
+346009.460096  7402801.246637 
+346023.882753  7402782.019930 
+346071.339811  7402732.158471 
+346115.201511  7402689.505777 
+346140.426731  7402669.679173 
+346172.273674  7402657.661232 
+346207.113998  7402655.261643 
+346259.988829  7402660.670716 
+346293.031475  7402678.687630 
+346324.870172  7402709.332381 
+346357.310843  7402754.384664 
+346397.560695  7402789.228696 
+346445.627973  7402815.664167 
+346543.551962  7402860.116553 
+346582.004136  7402882.342746 
+346630.665143  7402915.387086 
+346673.924869  7402955.640191 
+346710.571118  7403003.102061 
+346740.010161  7403042.745271 
+346752.626894  7403071.580331 
+346760.436075  7403090.207141 
+346776.656410  7403110.033745 
+346795.878374  7403124.451275 
+346812.247142  7403130.840181 
+346841.826371  7403136.389230 
+346854.772953  7403133.299759 
+346871.405600  7403125.911025 
+346905.297608  7403108.044085 
+346944.739330  7403088.317464 
+346973.700092  7403070.450525 
+346989.013342  7403062.161945 
+346935.882878  7402984.025329 
+346861.947174  7402859.056735 
+346762.027597  7402689.865716 
+347215.157971  7402074.291158 
+347188.506154  7402012.081814 
+347156.741673  7401983.296744 
+347122.132243  7401962.220355 
+347087.267180  7401945.363242 
+347034.812907  7401930.305821 
+346994.736226  7401923.017070 
+346958.197178  7401920.647476 
+346934.217139  7401918.737803 
+346887.452765  7401916.918115 
+346817.640177  7401919.517669 
+346754.177186  7401918.497844 
+346715.048821  7401916.208236 
+346686.566340  7401913.638676 
+346667.971090  7401910.409229 
+346629.288022  7401900.130990 
+346597.078245  7401889.152870 
+346570.566614  7401878.234741 
+346544.450801  7401865.396940 
+346519.868788  7401850.309524 
+346501.339508  7401836.801838 
+346490.017433  7401825.613754 
+346476.872941  7401812.186054 
+346458.393138  7401792.169483 
+346440.366878  7401767.683677 
+346429.127266  7401748.117029 
+346417.912392  7401726.730692 
+346404.141187  7401695.696008 
+346388.506334  7401652.203458 
+346368.888551  7401589.584184 
+346354.911190  7401543.482081 
+346372.335475  7401526.514987 
+346384.119339  7401517.086602 
+346395.342459  7401511.677529 
+346412.115292  7401509.367924 
+346433.769894  7401501.559262 
+346452.315666  7401499.019697 
+346469.946108  7401488.401516 
+346487.535318  7401480.802817 
+346509.371336  7401479.303074 
+346535.577857  7401472.064314 
+346593.787999  7401461.686092 
+346615.879651  7401459.436477 
+346634.755273  7401450.597991 
+346661.324628  7401435.290613 
+346686.896190  7401417.963581 
+346705.268792  7401408.865139 
+346742.121196  7401381.849767 
+346746.912256  7401378.450349 
+346775.633878  7401358.573754 
+346793.206595  7401352.984711 
+346821.779784  7401345.316025 
+346843.211738  7401329.328763 
+346872.749736  7401313.901406 
+346911.507020  7401287.935853 
+346938.035144  7401268.709147 
+346982.902885  7401240.274018 
+346995.412417  7401229.005948 
+347011.476074  7401218.777700 
+347019.969692  7401202.700454 
+347028.488048  7401182.073987 
+347031.176319  7401161.407527 
+347032.850304  7401140.991024 
+347032.701872  7401127.653308 
+347033.559480  7401112.485906 
+347031.926726  7401093.309191 
+347031.836018  7401070.853038 
+347033.551234  7401043.877658 
+347035.043801  7401013.112928 
+347038.086660  7400978.328886 
+347043.438464  7400940.275405 
+347051.783650  7400917.669277 
+347064.787955  7400874.576658 
+347069.661478  7400855.069999 
+347077.792261  7400830.684177 
+347093.237451  7400790.041138 
+347110.307148  7400760.776151 
+347133.066745  7400731.511164 
+347145.262920  7400712.804368 
+347167.206140  7400684.359241 
+347225.746131  7400607.942330 
+347254.203873  7400570.548735 
+347272.271365  7400600.053681 
+347283.766610  7400583.896449 
+347317.988467  7400524.996538 
+347336.501255  7400493.521929 
+347352.111370  7400475.295051 
+347365.536233  7400460.267626 
+347379.686765  7400445.910085 
+347393.598156  7400434.202090 
+347407.171452  7400425.593565 
+347423.309325  7400415.795243 
+347426.286214  7400412.705772 
+347448.361374  7400394.018973 
+347459.279383  7400385.050510 
+347468.160574  7400375.392164 
+347481.123648  7400353.485916 
+347485.337472  7400334.759124 
+347485.881723  7400294.965940 
+347467.987403  7400231.886745 
+347468.276021  7400207.520919 
+347468.309006  7400173.246790 
+347470.939553  7400144.341741 
+347471.236418  7400109.617689 
+347475.829568  7400054.527125 
+347481.948271  7399989.488266 
+347490.788231  7399982.369485 
+347492.371507  7399914.221158 
+347475.252332  7399819.187437 
+347456.558127  7399727.183196 
+347424.521521  7399637.278596 
+347438.474143  7399605.913969 
+347363.408706  7399595.775705 
+347318.780105  7399595.775705 
+347288.343268  7399585.627443 
+347236.746603  7399566.990636 
+347211.249258  7399527.797349 
+347186.898139  7399507.510824 
+347166.612411  7399501.421867 
+347142.261292  7399501.421867 
+347114.801344  7399510.090382 
+347083.432683  7399501.421867 
+347040.824409  7399491.273605 
+346998.216135  7399485.184648 
+346949.522143  7399491.273605 
+346921.122125  7399497.362562 
+346905.660443  7399484.014849 
+346897.405966  7399486.764378 
+346887.337318  7399482.185162 
+346841.364582  7399443.821734 
+346832.128804  7399436.403004 
+346812.181172  7399411.907200 
+346795.680464  7399395.020093 
+346779.641546  7399380.922508 
+346756.972658  7399370.254335 
+346736.761146  7399364.675291 
+346715.164268  7399363.775445 
+346687.844506  7399362.975582 
+346651.800232  7399365.235195 
+346617.504159  7399369.794414 
+346599.815994  7399376.633242 
+346554.255570  7399394.880117 
+346526.267863  7399401.009067 
+346518.186557  7399402.728772 
+346503.813377  7399405.388317 
+346491.163659  7399406.008211 
+346473.203369  7399404.288505 
+346452.579546  7399400.859093 
+346431.650612  7399398.509495 
+346412.123538  7399395.390029 
+346377.876942  7399388.391228 
+346345.114668  7399380.862518 
+346327.616167  7399375.233482 
+346321.217092  7399371.484124 
+346311.684449  7399363.365515 
+346300.279912  7399354.926960 
+346284.661551  7399343.678887 
+346274.823798  7399338.989690 
+346267.171296  7399337.739904 
+346259.980583  7399337.120011 
+346249.870704  7399338.449783 
+346234.054434  7399340.089502 
+346225.461861  7399340.089502 
+346217.025967  7399338.209824 
+346209.686822  7399335.870225 
+346186.721070  7399321.022768 
+346175.629890  7399311.804347 
+346154.387599  7399293.847423 
+346150.017097  7399290.557986 
+346144.079811  7399288.848279 
+346122.054129  7399283.849135 
+346107.210914  7399281.659510 
+346082.686624  7399277.440233 
+346043.954079  7399270.411437 
+346026.768934  7399268.531759 
+346014.894362  7399267.911865 
+346005.840001  7399270.251465 
+345993.495393  7399274.630714 
+345975.221746  7399280.559699 
+345965.540671  7399282.279404 
+345959.446707  7399281.969457 
+345935.392452  7399278.060127 
+345916.178735  7399274.160795 
+345900.708806  7399269.781545 
+345888.372445  7399264.782401 
+345884.463732  7399259.943230 
+345879.301591  7399251.854616 
+345868.688692  7399234.787539 
+345859.939442  7399229.948368 
+345839.480543  7399223.079545 
+345828.702720  7399219.790108 
+345809.332324  7399216.830615 
+345746.380599  7399205.582542 
+345728.890344  7399201.833184 
+345714.987199  7399197.923854 
+345708.579878  7399194.644415 
+345687.650945  7399178.397198 
+345660.628047  7399157.310810 
+345649.380188  7399150.431989 
+345624.855898  7399136.684343 
+345612.667970  7399130.275441 
+345594.394322  7399124.496431 
+345571.898605  7399116.687769 
+345548.471064  7399107.939267 
+345527.698809  7399102.470204 
+345517.391021  7399100.750499 
+345504.576378  7399101.540363 
+345495.522017  7399102.630177 
+345488.958017  7399105.129748 
+345478.336872  7399109.658973 
+345472.712943  7399110.438839 
+345465.687154  7399108.719134 
+345449.442080  7399101.850310 
+345434.285508  7399094.821514 
+345417.257042  7399088.572584 
+345388.988963  7399079.044217 
+345383.810330  7399077.164539 
+345316.042807  7399048.729409 
+345302.923054  7399043.580291 
+345292.607019  7399039.830933 
+345222.002793  7399013.425457 
+345199.977111  7399003.897089 
+345159.991138  7398989.839497 
+345134.840135  7398972.812413 
+345105.945343  7398954.845491 
+345071.269943  7398928.909933 
+345037.526367  7398901.414643 
+345028.158649  7398895.485659 
+345019.096041  7398891.576328 
+345000.195681  7398886.577184 
+344991.603108  7398883.607693 
+344986.135857  7398880.798174 
+344963.483462  7398867.670423 
+344937.870669  7398855.332536 
+344912.406309  7398841.894838 
+344901.001772  7398834.396123 
+344893.819305  7398827.057380 
+344880.229517  7398811.590029 
+344860.083976  7398790.973561 
+344852.109871  7398781.755140 
+344843.368866  7398774.566371 
+344825.086973  7398764.568084 
+344809.938647  7398758.479127 
+344792.283467  7398753.789930 
+344756.832922  7398747.381028 
+344745.428385  7398745.821295 
+344739.449868  7398744.001606 
+344729.801778  7398741.132098 
+344723.559381  7398740.512204 
+344711.082834  7398740.002291 
+Region 1
+606
+319663.083028  7382888.377531 
+319759.440233  7382766.218456 
+319834.546902  7382684.862392 
+319892.963200  7382645.219182 
+319903.378189  7382649.358473 
+319936.989825  7382703.859138 
+319955.733508  7382731.344430 
+319988.751415  7382775.836808 
+320020.153061  7382810.670842 
+320075.336837  7382869.280802 
+320109.278322  7382905.144659 
+320122.818633  7382940.868540 
+320137.348491  7382962.194887 
+320163.670460  7382986.670694 
+320214.236346  7383026.993788 
+320234.002561  7383053.659220 
+320266.913267  7383119.857881 
+320289.268799  7383135.205252 
+320345.714247  7383150.632609 
+320386.739245  7383174.838463 
+320423.888514  7383215.791448 
+320452.923492  7383285.199559 
+320477.901325  7383319.733644 
+320507.513539  7383343.419587 
+320534.486959  7383364.735935 
+320549.371406  7383373.664406 
+320616.033934  7383404.389143 
+320645.728611  7383420.486386 
+320655.863228  7383426.485358 
+320665.857660  7383435.133877 
+320674.400755  7383445.542094 
+320676.618991  7383455.650363 
+320675.876830  7383465.178730 
+320658.378329  7383503.932092 
+320642.116762  7383548.734418 
+320635.849626  7383562.911990 
+320638.224541  7383590.747222 
+320687.718417  7383585.908051 
+320748.649815  7383586.048027 
+320869.811682  7383587.047855 
+321023.843025  7383594.726540 
+321065.065932  7383592.166978 
+321131.044023  7383583.028544 
+321225.537580  7383548.284495 
+321241.790901  7383541.465663 
+321241.840378  7383525.508396 
+321235.193916  7383501.942433 
+321229.141183  7383471.627626 
+321223.830610  7383447.091829 
+321207.123747  7383386.852147 
+321193.228848  7383354.447698 
+321162.288991  7383272.211784 
+321147.503499  7383233.668386 
+321024.337798  7382972.973041 
+321031.734667  7382962.804783 
+321018.656146  7382946.517572 
+321010.294468  7382930.870253 
+320994.082378  7382905.194651 
+320986.669017  7382885.158083 
+320971.957741  7382853.743464 
+320961.575737  7382835.016671 
+320946.757261  7382812.120593 
+320937.537975  7382798.382946 
+320926.050975  7382778.636329 
+320915.932850  7382755.370314 
+320903.415072  7382735.833661 
+320890.179872  7382717.276839 
+320878.231084  7382693.430924 
+320862.018994  7382667.315397 
+320853.822241  7382645.279172 
+320845.757428  7382620.703381 
+320843.844302  7382602.516497 
+320847.810739  7382586.619220 
+320850.564980  7382561.723484 
+320854.127352  7382537.287670 
+320850.457779  7382521.080446 
+320844.479262  7382509.372451 
+320839.102719  7382498.234359 
+320826.189122  7382486.776322 
+320814.669138  7382477.767865 
+320797.797350  7382464.050215 
+320785.254833  7382455.031759 
+320767.014171  7382445.283429 
+320752.789423  7382432.265659 
+320737.476173  7382416.008444 
+320731.745043  7382400.881035 
+320724.587314  7382385.393688 
+320715.640154  7382366.566913 
+320721.544455  7382351.019576 
+320734.886857  7382336.232109 
+320740.123213  7382325.223994 
+320744.980243  7382312.096243 
+320747.701499  7382298.068646 
+320745.293600  7382286.410643 
+320742.407419  7382272.742984 
+320737.261771  7382251.306656 
+320725.947942  7382217.052523 
+320720.291028  7382196.386063 
+320717.660481  7382177.849238 
+320712.547818  7382153.643385 
+320704.656175  7382132.167063 
+320692.963020  7382111.870540 
+320680.742106  7382093.993602 
+320675.085192  7382086.444895 
+320656.407479  7382064.788605 
+320644.640108  7382051.350906 
+320630.860657  7382035.233667 
+320611.539738  7382013.397407 
+320597.479915  7381995.050550 
+320583.733449  7381976.503727 
+320573.277228  7381955.987241 
+320564.577455  7381941.479726 
+320554.434591  7381920.203371 
+320537.315416  7381901.936500 
+320525.300658  7381891.488289 
+320503.085313  7381881.360024 
+320447.307809  7381853.864734 
+320433.503619  7381839.847135 
+320413.193153  7381816.231180 
+320400.444480  7381799.124110 
+320396.412073  7381787.226148 
+320386.063054  7381765.499870 
+320373.009271  7381749.162668 
+320360.458508  7381732.615503 
+320353.473950  7381727.986296 
+320343.372318  7381719.887683 
+320341.970459  7381709.239507 
+320344.493805  7381703.180545 
+320349.688931  7381695.711824 
+320352.855483  7381687.443240 
+320350.843403  7381676.565104 
+320345.689509  7381664.427183 
+320338.531780  7381641.081182 
+320337.402047  7381625.003936 
+320339.166740  7381606.307138 
+320341.088112  7381591.159733 
+320344.774177  7381573.262798 
+320345.301936  7381546.787333 
+320355.131443  7381519.442017 
+320356.929121  7381505.844347 
+320361.316116  7381481.088587 
+320363.509613  7381452.533478 
+320363.625060  7381409.780801 
+320359.906010  7381389.024357 
+320357.176508  7381370.047607 
+320343.718660  7381336.433365 
+320337.987529  7381313.107361 
+320327.918882  7381285.842031 
+320316.266958  7381254.357424 
+320309.018521  7381230.011594 
+320308.235129  7381218.973485 
+320305.381933  7381169.691927 
+320293.606316  7381090.475496 
+320281.154508  7381058.091043 
+320276.346955  7381033.995170 
+320266.905021  7381005.310084 
+320262.674705  7380968.036468 
+320260.885273  7380948.079887 
+320251.187705  7380907.196890 
+320242.388977  7380884.050854 
+320224.898722  7380863.344401 
+320205.882914  7380849.926699 
+320189.547131  7380834.659315 
+320170.020057  7380805.064384 
+320159.365927  7380783.888011 
+320151.927827  7380758.322390 
+320144.118647  7380721.458705 
+320128.104467  7380678.496064 
+320104.668679  7380672.737050 
+320024.432855  7380552.557636 
+319971.022019  7380462.803010 
+319958.710397  7380438.387192 
+319938.259745  7380406.492656 
+319899.378767  7380344.283312 
+319779.478574  7380165.683904 
+319723.057864  7380051.013546 
+319708.173417  7380017.819232 
+319704.619292  7379991.523736 
+319698.591297  7379975.496481 
+319690.567715  7379940.472481 
+319608.319810  7379939.422660 
+319603.479273  7379969.427521 
+319609.408313  7379986.604579 
+319602.522710  7379990.733871 
+319596.643148  7380008.940753 
+319590.087394  7380018.009199 
+319574.436049  7380022.068504 
+319552.352643  7380021.508600 
+319534.351122  7380033.156605 
+319526.987238  7380047.174204 
+319519.499660  7380074.879458 
+319510.049480  7380109.043606 
+319501.052842  7380134.839187 
+319488.716481  7380151.086404 
+319476.017286  7380165.453943 
+319461.470935  7380173.702530 
+319324.031009  7380253.598845 
+319283.426569  7380280.284274 
+319232.200984  7380316.818016 
+319202.225936  7380330.965593 
+319169.612094  7380358.100945 
+319144.213703  7380387.935834 
+319118.312293  7380429.578701 
+319119.376057  7380437.947268 
+319122.880705  7380471.841462 
+319125.230880  7380506.095595 
+319120.711946  7380542.199410 
+319056.176945  7380519.233344 
+319045.539307  7380517.623620 
+319022.029304  7380506.385545 
+318988.252743  7380494.317612 
+318968.601976  7380477.810440 
+318932.071174  7380432.998115 
+318901.378703  7380374.158194 
+318877.802730  7380329.455851 
+318864.790178  7380293.971929 
+318852.907360  7380261.157550 
+318866.587856  7380222.474176 
+318872.797268  7380209.586384 
+318880.911559  7380197.098523 
+318884.160574  7380175.062298 
+318882.082524  7380152.596146 
+318867.577404  7380113.682811 
+318840.669953  7380058.302297 
+318796.198031  7379966.248066 
+318778.072816  7379928.554522 
+318745.524944  7379864.425507 
+318643.906644  7379645.762962 
+318626.952394  7379609.929100 
+318543.797404  7379457.085281 
+318495.350799  7379342.184962 
+318443.061450  7379223.315323 
+318425.934029  7379187.131521 
+318416.401387  7379175.703479 
+318381.627032  7379134.010620 
+318365.167556  7379183.482146 
+318186.075918  7379135.680334 
+318156.282287  7379128.661537 
+318125.985636  7379120.312967 
+318102.731265  7379111.604458 
+318082.346583  7379102.376039 
+318047.959801  7379098.726664 
+318037.948877  7379132.490881 
+318000.981025  7379136.660166 
+317973.281936  7379139.919608 
+317978.171951  7379179.022910 
+317977.297851  7379250.690634 
+317925.363090  7379280.295563 
+317887.818002  7379301.441941 
+317862.757707  7379310.710353 
+317757.675990  7379363.011395 
+317601.360442  7379432.439502 
+317587.152186  7379473.382489 
+317571.203976  7379464.174066 
+317549.961686  7379448.466757 
+317535.959587  7379426.710483 
+317524.233447  7379407.633751 
+317518.576532  7379392.756299 
+317515.962477  7379381.328257 
+317509.926236  7379364.171196 
+317499.371061  7379338.615573 
+317485.690565  7379373.269637 
+317452.466501  7379475.502126 
+317443.956391  7379516.115169 
+317428.808066  7379497.398375 
+317399.352530  7379435.598961 
+317379.206988  7379430.179889 
+317407.524544  7379312.799995 
+317438.060336  7379192.110668 
+317458.659420  7379128.481567 
+317461.191013  7379087.388606 
+317535.036009  7378971.768411 
+317516.968517  7378868.506099 
+317513.991628  7378855.548318 
+317369.558898  7378659.011983 
+317400.053459  7378659.581886 
+317426.367181  7378588.953984 
+317426.400166  7378588.943985 
+317456.919466  7378513.396926 
+317355.078517  7378530.104064 
+317384.031033  7378464.975220 
+317331.749931  7378477.603057 
+317294.386260  7378479.272771 
+317259.348026  7378476.383266 
+317105.926905  7378447.628191 
+317033.351829  7378478.392922 
+317012.093046  7378398.316638 
+317000.070042  7378368.941670 
+316984.591867  7378342.956121 
+316945.752120  7378338.146945 
+316925.903443  7378344.495857 
+316903.770560  7378348.545163 
+316884.383672  7378340.046619 
+316800.049471  7378229.135617 
+316784.892899  7378214.578111 
+316759.799619  7378203.769962 
+316700.377281  7378205.439676 
+316724.959295  7378221.256967 
+316744.577078  7378234.684667 
+316758.092650  7378246.592627 
+316773.958397  7378266.839159 
+316781.000678  7378290.415121 
+316791.217758  7378321.439806 
+316793.089653  7378343.176083 
+316791.357944  7378358.883393 
+316787.333784  7378378.769986 
+316776.358051  7378400.346290 
+316762.644569  7378419.553000 
+316742.457796  7378443.558888 
+316728.826777  7378456.456679 
+316712.548718  7378477.733035 
+316703.420140  7378497.999563 
+316687.496669  7378523.055271 
+316666.575982  7378588.474066 
+316649.902104  7378632.686493 
+316643.263888  7378657.632220 
+316630.820326  7378690.036669 
+316623.975954  7378723.071011 
+316613.239362  7378748.966575 
+316599.674313  7378789.449640 
+316596.474775  7378816.654980 
+316593.481393  7378851.948935 
+316591.032263  7378875.954823 
+316581.854208  7378900.100687 
+316568.792179  7378925.186390 
+316547.467426  7378957.920783 
+316528.369156  7378983.936327 
+316511.728263  7379009.201999 
+316493.858681  7379034.787616 
+316480.161692  7379053.444421 
+316460.642864  7379088.858354 
+316421.745394  7379147.628288 
+316388.595547  7379196.169973 
+316361.580895  7379234.923335 
+316342.226992  7379257.389487 
+316318.180983  7379311.580204 
+316313.439401  7379339.875358 
+316314.305255  7379367.690593 
+316319.220008  7379390.456693 
+316320.852762  7379422.821150 
+316315.138124  7379447.556913 
+316309.835798  7379463.664154 
+316304.211869  7379480.761225 
+316291.364241  7379496.438540 
+316320.407466  7379554.848535 
+316345.525484  7379617.637779 
+316391.539451  7379698.303962 
+316413.977445  7379738.567065 
+316421.234128  7379761.703102 
+316429.315434  7379784.619177 
+316437.776066  7379808.985003 
+316451.926598  7379835.520458 
+316468.278874  7379857.776646 
+316485.208385  7379881.802530 
+316491.434289  7379905.918399 
+316491.607460  7379924.415231 
+316489.702581  7379938.232864 
+316485.760883  7379959.449230 
+316483.006642  7379975.586466 
+316476.154024  7380009.620636 
+316470.703265  7380037.015944 
+316467.767607  7380067.550713 
+316459.612085  7380099.795190 
+316457.294894  7380170.323109 
+316460.007904  7380197.938379 
+316463.751693  7380215.925298 
+316471.511396  7380239.841202 
+316482.544853  7380263.237194 
+316498.154967  7380287.033118 
+316513.872283  7380310.709062 
+316529.688553  7380334.724949 
+316543.624683  7380353.951655 
+316555.523994  7380372.818424 
+316569.616802  7380395.814485 
+316575.380917  7380410.491971 
+316580.122500  7380420.540249 
+316591.799162  7380457.123983 
+316596.854102  7380493.077824 
+316601.950272  7380525.822216 
+316606.576408  7380555.667103 
+316613.824844  7380579.573009 
+316628.074331  7380606.338424 
+316651.221500  7380639.532738 
+316665.190615  7380656.429844 
+316689.228378  7380675.346603 
+316702.183206  7380691.893769 
+316711.707602  7380713.060143 
+316722.130838  7380744.094827 
+316736.982299  7380775.219496 
+316743.125741  7380786.337592 
+316759.238876  7380810.693420 
+316775.863277  7380835.709135 
+316791.597085  7380866.033940 
+316800.404059  7380887.640239 
+316818.595244  7380925.853694 
+316828.985495  7380959.657903 
+316846.921046  7381001.640712 
+316876.549753  7381087.526001 
+316884.845461  7381109.122302 
+316899.812370  7381143.756369 
+316905.271374  7381172.401462 
+316908.883223  7381201.026559 
+316910.029449  7381223.632687 
+316909.765570  7381244.569101 
+316910.788103  7381260.526367 
+316911.117952  7381275.373824 
+316921.120630  7381298.869800 
+316928.781378  7381314.367145 
+316943.863734  7381339.922768 
+316947.615769  7381357.909687 
+316947.450844  7381371.307392 
+316943.121573  7381391.193985 
+316942.808216  7381407.691159 
+316948.176512  7381427.147827 
+316950.559673  7381448.444179 
+316955.482673  7381462.681740 
+316957.247366  7381500.695229 
+316952.852125  7381509.503720 
+316932.574644  7381515.892625 
+316924.856172  7381521.111731 
+316920.502162  7381526.820754 
+316915.950243  7381556.005754 
+316916.131660  7381590.119911 
+316912.330148  7381608.786714 
+316909.716093  7381621.384556 
+316905.007495  7381638.941548 
+316902.261500  7381654.848824 
+316902.170792  7381669.696280 
+316904.042686  7381683.563905 
+316905.766148  7381692.442384 
+316917.096469  7381699.901106 
+316931.659312  7381710.159349 
+316937.909955  7381716.218311 
+316949.091844  7381743.613619 
+316952.233658  7381753.511923 
+316953.701487  7381766.819644 
+316958.385346  7381775.518154 
+316965.213225  7381783.906717 
+316973.508933  7381789.995674 
+316985.812309  7381801.003789 
+316995.006856  7381816.401151 
+317001.249253  7381831.108632 
+317002.642866  7381842.196733 
+317004.028232  7381853.624775 
+317010.674694  7381876.640833 
+317012.521850  7381891.838229 
+317016.447056  7381912.484693 
+317018.788985  7381929.241822 
+317023.208965  7381943.139442 
+317024.017096  7381976.113794 
+317012.290956  7382000.049694 
+317004.135433  7382031.734266 
+317002.642866  7382045.121973 
+316999.261911  7382062.239041 
+316999.591760  7382076.316630 
+317001.306976  7382086.194938 
+317005.355876  7382105.181686 
+317009.355297  7382119.859171 
+317013.222780  7382136.296356 
+317022.417327  7382152.033660 
+317029.302929  7382172.280192 
+317049.440225  7382213.373153 
+317050.842084  7382228.260603 
+317046.455089  7382236.289228 
+317028.098980  7382243.707957 
+317016.051237  7382260.945005 
+317009.883056  7382272.273064 
+317007.400941  7382291.179826 
+317007.244262  7382303.697682 
+317013.264011  7382336.122128 
+317019.003387  7382350.259706 
+317030.218261  7382367.016836 
+317038.472738  7382376.415226 
+317051.312119  7382385.663642 
+317060.671591  7382395.641932 
+317084.569167  7382434.705241 
+317097.688920  7382445.943316 
+317106.718543  7382458.131229 
+317112.960939  7382465.190019 
+317114.123658  7382478.167796 
+317113.076387  7382504.623265 
+317113.125864  7382525.009773 
+317110.948859  7382544.136497 
+317109.728417  7382559.523861 
+317107.312271  7382573.451475 
+317105.094035  7382595.567687 
+317105.753734  7382608.425484 
+317106.603095  7382621.843186 
+317115.146190  7382632.251403 
+317121.693698  7382638.870270 
+317128.142250  7382645.479138 
+317136.685345  7382655.447430 
+317143.488485  7382666.615517 
+317144.379078  7382676.703789 
+317142.696847  7382689.081669 
+317139.291154  7382700.119778 
+317138.920073  7382713.297521 
+317144.403817  7382723.445783 
+317146.836455  7382733.004145 
+317143.768857  7382741.822635 
+317138.598470  7382747.071736 
+317136.965717  7382755.140354 
+317138.400561  7382762.689061 
+317142.375244  7382771.267591 
+317150.588490  7382791.314157 
+317157.342153  7382822.408831 
+317168.820906  7382875.049814 
+317187.770744  7382934.439641 
+317220.417571  7383040.301508 
+317246.450921  7383128.566389 
+317248.834082  7383142.004087 
+317253.056152  7383155.341803 
+317252.157313  7383169.739336 
+317249.287624  7383178.997751 
+317242.740117  7383196.534747 
+317233.990867  7383210.822299 
+317227.814440  7383223.370150 
+317222.545098  7383236.487903 
+317217.646837  7383268.992335 
+317214.966812  7383287.669136 
+317211.519888  7383326.282522 
+317201.492472  7383345.099299 
+317187.993392  7383372.184659 
+317188.562382  7383391.901282 
+317190.648678  7383412.087824 
+317221.110254  7383420.606365 
+317238.122228  7383429.594826 
+317262.333161  7383442.092685 
+317280.309944  7383465.178730 
+317294.922265  7383484.015504 
+317304.100319  7383511.180851 
+317309.913912  7383533.716990 
+317316.873731  7383555.513257 
+317326.142494  7383575.049910 
+317336.120433  7383599.165780 
+317349.941116  7383619.912226 
+317366.062497  7383639.918799 
+317388.673661  7383658.105684 
+317412.826871  7383674.042954 
+317440.097155  7383684.681132 
+317463.986485  7383691.839905 
+317489.038534  7383697.498936 
+317511.591975  7383689.800255 
+317546.028234  7383675.022786 
+317598.482507  7383650.576973 
+317655.216574  7383617.812586 
+317678.174080  7383608.974100 
+317699.630772  7383597.066139 
+317713.319515  7383597.626043 
+317780.468571  7383493.423892 
+317803.079736  7383480.766060 
+317830.383006  7383458.659847 
+317874.129259  7383429.914771 
+318064.023459  7383350.338402 
+318091.763778  7383349.308578 
+318114.869717  7383352.717994 
+318153.758940  7383347.518884 
+318181.556984  7383347.128951 
+318220.990459  7383326.282522 
+318242.546106  7383315.654343 
+318266.996180  7383303.666396 
+318315.079951  7383290.988568 
+318344.354069  7383275.421234 
+318351.091240  7383263.373298 
+318359.609596  7383257.084375 
+318372.251068  7383253.944913 
+318427.838908  7383254.834760 
+318451.043801  7383255.764601 
+318474.792946  7383250.185557 
+318490.510261  7383245.586345 
+318504.363929  7383239.417401 
+318527.403897  7383231.178812 
+318560.792885  7383202.573712 
+318611.721606  7383154.102015 
+318638.406408  7383137.614839 
+318631.133233  7383156.891537 
+318619.440078  7383203.153613 
+318645.910478  7383228.929198 
+318660.761939  7383246.046266 
+318688.551737  7383281.010277 
+318683.488551  7383320.183567 
+318672.380878  7383391.631328 
+318734.763613  7383361.396507 
+318776.308123  7383342.899676 
+318883.072071  7383280.820309 
+318902.821794  7383271.801854 
+318961.386524  7383258.654106 
+319005.973893  7383257.764259 
+319035.379951  7383254.244861 
+319056.119221  7383246.706153 
+319065.602387  7383231.288794 
+319096.773139  7383199.964159 
+319115.558052  7383194.285132 
+319137.047729  7383169.989294 
+319161.778175  7383137.004944 
+319171.739621  7383117.008369 
+319182.261812  7383089.413096 
+319252.132124  7383064.687331 
+319310.498944  7383043.151020 
+319350.039620  7383029.563347 
+319418.318410  7383007.857065 
+319466.369196  7382988.360405 
+319527.011976  7382967.633955 
+319590.029671  7382942.368283 
+319632.184402  7382928.940583 
+319663.083028  7382888.377531 
+Region 1
+226
+341952.751668  7394121.943323 
+341895.737229  7394110.985200 
+341883.714225  7394163.186259 
+341872.738492  7394214.627447 
+341855.602824  7394234.823988 
+341841.138936  7394243.202553 
+341823.640435  7394250.061378 
+341807.667486  7394252.350985 
+341789.047497  7394253.490790 
+341765.108689  7394251.201182 
+341752.186846  7394247.391835 
+341741.178128  7394242.822618 
+341736.106696  7394240.962936 
+341678.952072  7394186.422278 
+341629.631366  7394138.400504 
+341577.276048  7394084.289773 
+341527.188443  7394041.217151 
+341458.992115  7394131.151746 
+341405.218445  7394141.509972 
+341415.188138  7394283.505649 
+341418.791741  7394311.310886 
+341426.106147  7394433.319987 
+341402.851777  7394523.584526 
+341386.499502  7394581.344632 
+341370.872895  7394645.573630 
+341342.011087  7394756.914558 
+341324.438370  7394826.842580 
+341313.520360  7394868.255487 
+341284.237995  7394985.305437 
+341268.685604  7395044.875233 
+341254.601042  7395098.546040 
+341225.648527  7395221.704944 
+341192.506926  7395331.356162 
+341158.384023  7395439.277676 
+341127.600844  7395514.954713 
+341116.336493  7395550.278662 
+341101.930328  7395603.099614 
+341093.667605  7395664.189150 
+341068.689773  7395778.099639 
+341029.322267  7395925.344417 
+341003.247686  7396032.006147 
+340966.189126  7396176.621375 
+341041.147362  7396191.898758 
+341243.691279  7396236.431130 
+341302.989924  7396267.655782 
+341311.937084  7396274.514607 
+341400.814958  7396298.330528 
+341472.746828  7396314.617738 
+341519.173107  7396325.405890 
+341612.372005  7396347.742064 
+341643.196415  7396353.031158 
+341780.158060  7396384.215816 
+341854.332905  7396402.922612 
+341881.759868  7396405.132234 
+341899.283108  7396406.841941 
+341980.417772  7396412.301006 
+342000.010816  7396350.091661 
+342015.653915  7396258.917279 
+342048.292496  7396186.579670 
+342073.690886  7396157.934576 
+342102.750603  7396104.963650 
+342191.628477  7396049.993066 
+342234.879957  7396029.906506 
+342314.917872  7395985.324143 
+342384.639752  7395945.910894 
+342423.364051  7395920.065321 
+342544.995953  7395870.413826 
+342584.396443  7395854.086623 
+342647.117273  7395830.040741 
+342723.617555  7395798.906075 
+342827.783940  7395759.482827 
+342882.736821  7395734.797056 
+343006.339573  7395722.839104 
+343090.541834  7395728.968054 
+343259.927657  7395711.531041 
+343297.093419  7395688.724948 
+343318.179031  7395674.867321 
+343350.240375  7395644.822468 
+343405.696277  7395597.970493 
+343445.360646  7395570.445208 
+343492.207482  7395542.170051 
+343552.363735  7395509.005732 
+343636.450549  7395469.902430 
+343738.406944  7395422.220597 
+343807.328940  7395384.187112 
+343846.012008  7395366.440152 
+343874.304826  7395346.583553 
+343898.210648  7395326.357018 
+343918.537607  7395306.080491 
+343936.316480  7395286.113911 
+343964.601051  7395247.540519 
+343997.709667  7395210.626841 
+344050.535021  7395155.316316 
+344090.867335  7395118.082693 
+344168.159255  7395047.824728 
+344203.749986  7395025.048629 
+344250.209250  7394992.104272 
+344282.097423  7394964.748958 
+344301.418342  7394942.802717 
+344319.494079  7394923.616004 
+344341.165174  7394892.611315 
+344358.284348  7394866.545779 
+344373.366704  7394840.910171 
+344384.985643  7394823.093222 
+344404.133391  7394799.657237 
+344422.332822  7394771.961981 
+344451.598694  7394744.276723 
+344520.751585  7394701.714014 
+344622.270930  7394640.994414 
+344735.615370  7394572.756103 
+344775.766267  7394550.809862 
+344813.905084  7394528.313716 
+344885.894678  7394485.601032 
+344961.125040  7394440.808704 
+344974.211808  7394429.100710 
+344990.374420  7394416.422881 
+345002.661304  7394403.925022 
+345015.789303  7394388.557654 
+345035.382347  7394369.720881 
+345088.512811  7394289.214671 
+345149.056636  7394192.841179 
+345116.962307  7394154.687714 
+345079.705837  7394106.685937 
+345076.539284  7394101.146885 
+345052.641708  7394071.002049 
+345039.357030  7394058.424203 
+344991.108335  7394021.250571 
+344940.303308  7393987.516349 
+344905.570184  7393968.749564 
+344885.911170  7393956.171718 
+344810.755024  7393910.289577 
+344767.610745  7393877.295229 
+344762.489836  7393871.536216 
+344722.817220  7393825.514099 
+344739.012817  7393811.626478 
+344767.132464  7393789.920196 
+344787.022372  7393771.853290 
+344757.756500  7393710.943724 
+344742.723621  7393680.099007 
+344714.241141  7393624.718493 
+344688.933459  7393556.690146 
+344666.775837  7393483.302716 
+344654.909511  7393420.023556 
+344634.541321  7393360.423765 
+344629.750261  7393350.075537 
+344616.176966  7393302.153746 
+344585.294832  7393250.942518 
+344548.904216  7393201.890920 
+344507.763771  7393158.378373 
+344457.931800  7393116.255588 
+344402.550115  7393079.071958 
+344347.176676  7393044.467885 
+344293.386513  7393008.863984 
+344268.070585  7392984.938082 
+344226.938387  7392941.625501 
+344190.547771  7392893.173800 
+344174.723254  7392863.108950 
+344159.690376  7392829.884641 
+344147.172598  7392791.691183 
+344131.216141  7392754.737513 
+344117.774785  7392723.292899 
+344098.255957  7392689.438698 
+344081.186260  7392664.362993 
+344054.402503  7392628.809083 
+344025.639650  7392597.804394 
+343967.462493  7392552.642130 
+343920.788828  7392520.207686 
+343840.033491  7392630.668765 
+343705.603439  7392558.971046 
+343746.430527  7392701.876568 
+343628.410474  7392913.500318 
+343616.214299  7392971.110450 
+343632.038815  7393007.504216 
+343632.830454  7393024.111372 
+343713.082770  7393162.907597 
+343724.297644  7393181.744371 
+343728.000201  7393187.533379 
+343730.927613  7393194.822131 
+343731.059553  7393210.439455 
+343726.697297  7393221.797510 
+343753.860381  7393270.919096 
+343658.929774  7393324.719880 
+343562.424136  7393379.300531 
+343464.335223  7393433.881182 
+343365.446425  7393486.092239 
+343302.956489  7393520.106412 
+343294.256716  7393489.251697 
+343295.303987  7393460.636599 
+343295.839992  7393447.718812 
+343232.550172  7393460.776575 
+343172.426904  7393467.895356 
+343160.412146  7393443.479538 
+343144.859755  7393423.672931 
+343123.386570  7393410.945111 
+343094.112452  7393398.287279 
+343074.618362  7393384.029721 
+343065.638217  7393406.985789 
+343047.438786  7393418.063891 
+343026.081049  7393439.420233 
+343005.514950  7393452.078065 
+342979.407383  7393461.566440 
+342946.183320  7393460.776575 
+342912.959257  7393456.827251 
+342876.568641  7393457.617116 
+342843.344578  7393459.986710 
+342774.917356  7393462.576267 
+342786.387863  7393484.512509 
+342783.237802  7393517.736818 
+342783.221310  7393521.686142 
+342743.688880  7393640.745748 
+342730.940208  7393625.968279 
+342511.095699  7393540.672889 
+342496.071066  7393593.673811 
+342495.163981  7393605.641761 
+342479.240510  7393657.312910 
+342447.022486  7393739.228879 
+342418.548252  7393825.454109 
+342354.466794  7393989.206060 
+342317.004168  7394110.825228 
+342254.308076  7394137.810605 
+342172.571438  7394157.647207 
+342159.080605  7394160.026800 
+342117.816467  7394156.067478 
+342085.276840  7394149.718565 
+342018.622558  7394134.641148 
+341952.751668  7394121.943323 
+Region 1
+147
+330573.868707  7401959.580807 
+330672.856459  7402025.149575 
+330738.397500  7402065.942588 
+330778.523659  7402094.027777 
+330810.626235  7402116.773881 
+330885.526748  7402164.925633 
+330924.127353  7402187.021848 
+330962.266170  7402191.131144 
+330997.931118  7402164.765660 
+331025.250880  7402135.560663 
+331089.711665  7402052.364914 
+331113.469055  7402011.481917 
+331165.346092  7401924.006900 
+331193.441000  7401881.944105 
+331192.921488  7401863.527260 
+331218.723943  7401784.370819 
+331227.613380  7401707.873922 
+331234.721631  7401641.165348 
+331239.166349  7401619.029140 
+331257.852308  7401563.778604 
+331279.836759  7401534.623598 
+331311.592993  7401502.479104 
+331338.797308  7401473.794018 
+331377.546345  7401436.040484 
+331390.558897  7401423.512630 
+331419.940217  7401353.414638 
+331445.140698  7401291.545235 
+331461.525958  7401252.471928 
+331482.479630  7401230.405708 
+331499.837946  7401204.040224 
+331509.271634  7401188.382906 
+331585.549267  7401091.649476 
+331665.240840  7400988.817090 
+331689.047708  7400963.191479 
+331709.869441  7400950.923581 
+331654.636188  7400835.513349 
+331703.668275  7400807.538141 
+331750.267724  7400781.452609 
+331800.940812  7400753.797347 
+331844.728297  7400724.142426 
+331865.459320  7400710.894695 
+331887.658173  7400696.707126 
+331932.913487  7400666.042378 
+331996.623865  7400626.879087 
+332030.219009  7400601.613414 
+332051.683947  7400531.615404 
+332094.259236  7400400.557853 
+332099.413130  7400382.880881 
+332109.729165  7400346.787064 
+332122.989103  7400304.054383 
+332147.298991  7400223.768136 
+332182.642336  7400104.008649 
+332204.733988  7400048.868095 
+332227.097765  7399999.996466 
+332230.420996  7399994.147468 
+332242.889297  7399974.100902 
+332268.337165  7399932.238072 
+332290.239153  7399894.174592 
+332323.570418  7399841.403631 
+332437.838436  7399655.405491 
+332408.448870  7399636.028810 
+332393.003680  7399623.540949 
+332375.777304  7399606.983785 
+332356.299707  7399582.028060 
+332344.911663  7399567.770502 
+332322.119081  7399546.374167 
+332286.149023  7399519.348796 
+332261.583502  7399501.241898 
+332237.760142  7399486.194475 
+332216.987887  7399478.235839 
+332203.546531  7399473.656623 
+331999.996573  7399428.104426 
+331940.846361  7399415.636561 
+331868.493933  7399398.089567 
+331653.852796  7399351.307580 
+331630.260330  7399256.933746 
+331561.841354  7399202.673040 
+331571.275042  7399153.131526 
+331658.569640  7399122.466779 
+331490.833062  7399082.843566 
+331595.857056  7398431.905066 
+331543.237858  7398430.295341 
+331451.028507  7398392.191868 
+331325.083826  7398366.016352 
+331190.513588  7398378.574201 
+331166.014037  7398379.634019 
+331157.124600  7398323.783586 
+330389.755115  7398425.616143 
+330238.948049  7398440.953516 
+329851.350470  7398485.715848 
+329395.482347  7398538.076879 
+329435.657983  7399061.717185 
+329451.301082  7399191.105022 
+329458.986569  7399344.238791 
+329465.608293  7399378.612903 
+329488.079271  7399409.027693 
+329515.836083  7399431.503843 
+329573.328804  7399496.512708 
+329601.456696  7399528.847169 
+329633.196438  7399562.451413 
+329650.208412  7399584.597620 
+329805.979709  7399801.140528 
+329890.602528  7399920.420097 
+329905.915778  7399944.905902 
+329935.247620  7399999.116617 
+330000.607245  7400055.746916 
+330049.103327  7400141.592212 
+330098.036460  7400238.035692 
+330129.677247  7400322.161282 
+330108.006152  7400339.758268 
+330060.656296  7400395.078792 
+330016.423515  7400429.032976 
+329971.498050  7400459.587742 
+329922.935998  7400489.322649 
+329889.893352  7400509.579179 
+329860.586248  7400527.626088 
+329851.292746  7400535.624718 
+329847.557204  7400539.644029 
+329842.832114  7400552.141888 
+329841.760104  7400575.737847 
+329843.937108  7400640.916682 
+329818.852075  7400759.126434 
+329773.069002  7400988.187198 
+329755.669456  7401073.362608 
+329824.962532  7401089.719806 
+329875.660358  7401164.427009 
+329910.055386  7401220.687373 
+329936.138213  7401257.821012 
+329915.687561  7401359.213644 
+329975.266578  7401452.597648 
+330017.973806  7401536.203328 
+330012.292153  7401579.055987 
+330010.857309  7401601.132206 
+330001.069033  7401699.865294 
+330020.381706  7401744.507647 
+330091.389998  7401907.479731 
+330094.474088  7401909.779337 
+330193.189715  7401980.037303 
+330210.251166  7402002.603437 
+330245.413094  7402048.075648 
+330311.721034  7402142.179529 
+330356.531052  7402131.481362 
+330393.309240  7402119.443424 
+330422.072093  7402102.726287 
+330476.241582  7402053.904650 
+330495.636716  7402025.819461 
+330573.868707  7401959.580807 
+Region 1
+430
+333690.209977  7381015.128402 
+333674.583370  7380991.662421 
+333665.042481  7380978.374697 
+333653.976039  7380963.737205 
+333644.088809  7380955.318647 
+333637.269176  7380953.468964 
+333631.150473  7380953.398976 
+333597.307942  7380960.327789 
+333575.158567  7380961.177643 
+333553.091653  7380955.388635 
+333542.940544  7380951.059376 
+333537.902097  7380945.690296 
+333534.611851  7380939.231402 
+333535.708599  7380932.152615 
+333538.570041  7380922.774221 
+333542.148905  7380913.395828 
+333543.270393  7380904.437362 
+333541.579915  7380891.679548 
+333535.840539  7380876.442158 
+333527.206735  7380863.384394 
+333516.107309  7380853.176143 
+333495.252592  7380842.647946 
+333474.637015  7380823.851166 
+333465.021910  7380815.932522 
+333425.819330  7380787.127456 
+333413.318044  7380803.004737 
+333392.042769  7380815.182651 
+333371.229283  7380826.010796 
+333355.569691  7380835.229217 
+333342.012888  7380846.577273 
+333321.290110  7380869.283384 
+333305.102759  7380890.079822 
+333289.674062  7380910.906254 
+333279.679630  7380926.713547 
+333271.350937  7380941.700979 
+333265.529098  7380955.848556 
+333260.309234  7380970.146107 
+333231.241271  7380982.164048 
+333214.913735  7380990.692587 
+333193.976555  7381002.760520 
+333153.866889  7381030.965689 
+333139.576171  7381040.254098 
+333139.567925  7381040.284093 
+333042.419082  7381080.557194 
+332999.060401  7381099.593934 
+332950.110776  7381118.580681 
+332921.587064  7381125.249539 
+332898.679036  7381129.918739 
+332870.996439  7381139.787049 
+332832.717437  7381149.775338 
+332789.639128  7381160.703466 
+332779.463279  7381161.903261 
+332739.196935  7381174.591087 
+332656.289332  7381197.897095 
+332645.486770  7381199.696787 
+332635.022303  7381202.096376 
+332627.897560  7381202.046384 
+332620.797555  7381200.476653 
+332613.441917  7381197.117229 
+332603.307300  7381192.468025 
+332555.437931  7381164.662788 
+332533.857545  7381159.933598 
+332521.413983  7381159.333701 
+332514.033607  7381160.553492 
+332503.338246  7381161.753286 
+332499.511995  7381163.253029 
+332486.647875  7381192.158078 
+332464.589208  7381221.922980 
+332434.803823  7381255.517225 
+332347.847321  7381181.229950 
+332297.619530  7381276.573619 
+332239.533081  7381367.488046 
+332210.992877  7381413.840106 
+332206.473943  7381431.357106 
+332140.149509  7381473.629865 
+332120.721390  7381489.017229 
+332099.033803  7381500.305295 
+332058.421118  7381526.740767 
+332038.489978  7381541.858178 
+332009.413769  7381558.655301 
+331999.996573  7381564.084371 
+331991.766835  7381571.353126 
+331957.173898  7381595.908919 
+331918.507322  7381618.155109 
+331901.371655  7381627.243552 
+331885.712063  7381632.502651 
+331871.512054  7381632.912581 
+331860.569306  7381629.973085 
+331845.528181  7381624.044100 
+331832.721785  7381613.245950 
+331825.489840  7381601.627940 
+331758.126382  7381622.614345 
+331726.823691  7381635.412153 
+331617.280763  7381631.142884 
+331599.048347  7381650.869505 
+331588.806528  7381664.197222 
+331578.861574  7381681.084330 
+331566.401520  7381700.031084 
+331553.628108  7381713.888711 
+331520.610201  7381731.535688 
+331414.349273  7381775.648132 
+331355.223799  7381834.088121 
+331320.490676  7381860.553588 
+331271.079262  7381908.605357 
+331210.015924  7381972.024494 
+331194.463533  7381977.583542 
+331085.539072  7382035.363645 
+330891.059968  7382115.399935 
+330875.078773  7382113.470266 
+330857.539041  7382115.339946 
+330840.494082  7382119.499233 
+330792.121693  7382104.821747 
+330792.946316  7382068.737928 
+330792.195909  7382039.752893 
+330789.853980  7382019.146423 
+330786.596719  7381993.210865 
+330756.563947  7381940.919822 
+330660.577822  7382020.486193 
+330644.423456  7382037.883213 
+330621.103116  7382060.789290 
+330547.266367  7382166.091252 
+330456.706262  7382294.869194 
+330428.413444  7382335.022316 
+330418.278827  7382360.337980 
+330410.750018  7382377.814986 
+330403.114009  7382408.749687 
+330394.208080  7382465.849906 
+330393.358718  7382503.463464 
+330389.499482  7382513.221792 
+330385.681477  7382537.697600 
+330378.383563  7382558.983953 
+330365.206086  7382583.509752 
+330350.569027  7382601.166728 
+330320.536255  7382636.980593 
+330291.328106  7382672.564498 
+330255.762113  7382709.548163 
+330228.961864  7382738.563193 
+330193.536057  7382778.896284 
+330169.168445  7382806.631534 
+330154.787019  7382823.518641 
+330126.832297  7382855.033243 
+330115.798840  7382867.131171 
+330076.818908  7382909.213962 
+330067.311004  7382921.581844 
+330039.562438  7382957.155750 
+330029.526775  7382971.303327 
+329970.211638  7383043.950883 
+329878.892880  7383116.548448 
+329863.794032  7383129.626208 
+329853.527475  7383140.214394 
+329834.561144  7383160.370941 
+329817.029658  7383189.176007 
+329800.759845  7383219.020895 
+329788.844042  7383245.586345 
+329755.372591  7383351.518199 
+329738.121477  7383405.748910 
+329696.197640  7383547.194682 
+329674.947104  7383622.991698 
+329621.940333  7383811.589393 
+329616.728715  7383825.766965 
+329609.422555  7383847.563231 
+329600.079576  7383869.589459 
+329588.947164  7383892.355559 
+329479.610392  7384100.059981 
+329437.092827  7384158.389990 
+329418.192466  7384185.275384 
+329389.660508  7384135.743869 
+329337.247466  7384055.727575 
+329282.137907  7383981.070363 
+329208.111494  7383884.246948 
+329177.740627  7383845.093654 
+329148.903558  7383805.420450 
+329073.392824  7383703.307941 
+329064.107569  7383690.260176 
+329014.687908  7383623.311644 
+328969.457333  7383568.301066 
+328926.609919  7383502.902269 
+328885.988987  7383449.441426 
+328863.691179  7383416.697035 
+328844.370261  7383390.861460 
+328772.372421  7383294.108033 
+328723.958801  7383228.089342 
+328699.376787  7383193.295302 
+328691.946933  7383172.638840 
+328689.101984  7383095.602036 
+328691.707793  7383059.538213 
+328692.433461  7383035.912260 
+328704.299787  7382847.684502 
+328707.853912  7382793.563772 
+328716.998982  7382680.053215 
+328718.722444  7382658.206957 
+328721.237545  7382631.551523 
+328726.721288  7382559.933791 
+328728.857062  7382520.550537 
+328732.996669  7382451.392383 
+328737.020830  7382404.470420 
+328741.119207  7382316.055565 
+328751.567181  7382256.175822 
+328781.410290  7382150.953845 
+328820.992197  7382012.417575 
+328829.213689  7381990.991245 
+328883.399670  7381828.159137 
+328991.911819  7381769.789135 
+329049.239615  7381736.944761 
+329083.642889  7381717.128156 
+329222.278519  7381631.292858 
+329230.417548  7381629.313198 
+329239.306985  7381627.353533 
+329247.182135  7381627.153567 
+329261.398637  7381625.233896 
+329308.261966  7381601.697928 
+329325.842929  7381590.649820 
+329344.768029  7381569.973362 
+329352.222621  7381556.555660 
+329356.147827  7381539.818527 
+329357.541440  7381523.071396 
+329359.883369  7381514.702829 
+329366.092781  7381497.975694 
+329391.837513  7381480.388707 
+329408.412437  7381469.850512 
+329438.206068  7381454.573129 
+329513.601355  7381414.489995 
+329530.662806  7381406.751320 
+329542.347715  7381403.531872 
+329550.725885  7381403.341904 
+329568.009985  7381399.402579 
+329687.522606  7381362.958822 
+329744.660738  7381286.411933 
+329767.659475  7381263.465864 
+329802.120473  7381234.770779 
+329837.521541  7381215.983997 
+329902.592547  7381164.902747 
+329874.118313  7381130.918568 
+329824.731637  7381105.662894 
+329775.081083  7381096.814410 
+329726.222166  7381088.115900 
+329693.971158  7381077.947641 
+329670.856973  7381068.289296 
+329655.106673  7381055.841428 
+329646.992382  7381044.913300 
+329642.671357  7381039.574214 
+329601.003154  7380959.008015 
+329600.236254  7380952.649104 
+329602.767847  7380946.040236 
+329607.847525  7380941.221062 
+329614.964022  7380936.901801 
+329620.794107  7380932.072629 
+329650.488784  7380917.065199 
+329687.547344  7380892.679376 
+329710.142016  7380875.142380 
+329732.217176  7380843.877736 
+329697.112972  7380660.899078 
+329686.821676  7380620.795947 
+329679.103204  7380580.032930 
+329662.767421  7380489.858376 
+329661.489255  7380461.653207 
+329664.779501  7380404.852937 
+329658.133040  7380306.869720 
+329659.271019  7380257.218225 
+329676.357209  7380182.341051 
+329683.721093  7380175.482226 
+329696.923308  7380173.192618 
+329754.292335  7380135.069148 
+329758.852501  7380112.962935 
+329761.870621  7380082.318184 
+329760.600702  7380050.693601 
+329753.863531  7380006.511169 
+329737.049467  7379963.918465 
+329718.083136  7379921.505730 
+329713.927036  7379883.322270 
+329718.940744  7379843.019174 
+329737.197899  7379777.150456 
+329744.339135  7379733.497934 
+329742.764105  7379707.312419 
+329733.231462  7379677.157584 
+329696.733645  7379593.821859 
+329694.820520  7379402.474635 
+329742.797090  7379405.704082 
+329779.665987  7379409.203482 
+329733.487095  7379341.785030 
+329721.101257  7379307.260944 
+329738.921361  7379301.042009 
+329760.584209  7379288.894090 
+329789.479001  7379269.077485 
+329849.684731  7379240.982297 
+329900.654683  7379251.880430 
+329911.877803  7379251.900427 
+329934.926017  7379251.840437 
+329950.940197  7379251.910425 
+329976.651944  7379251.110562 
+329998.207591  7379248.481013 
+330018.806676  7379248.610990 
+330051.371040  7379246.551343 
+330065.059783  7379244.611675 
+330077.552823  7379240.322410 
+330090.367465  7379234.823352 
+330109.193610  7379221.315666 
+330122.255639  7379211.607329 
+330136.810236  7379205.688343 
+330158.695732  7379200.959153 
+330179.525711  7379198.539567 
+330205.377644  7379202.398906 
+330223.197748  7379206.138265 
+330240.679757  7379211.547339 
+330264.016590  7379213.267044 
+330284.294071  7379215.156721 
+330301.132874  7379214.536827 
+330318.375742  7379213.896936 
+330336.649390  7379212.447185 
+330367.143951  7379209.247733 
+330388.312025  7379207.957954 
+330409.331667  7379215.736621 
+330475.078863  7379219.156036 
+330524.242891  7379194.360283 
+330587.483233  7379154.867048 
+330609.203805  7379142.299201 
+330688.260418  7379193.260471 
+330768.842584  7379246.821297 
+330874.748924  7379314.849644 
+330907.527691  7379332.186675 
+330931.606685  7379346.214272 
+331073.623269  7379439.518290 
+331105.412488  7379458.115104 
+331155.739234  7379501.247716 
+331424.887956  7379643.283386 
+331459.249999  7379662.190148 
+331466.762315  7379602.090442 
+331489.299263  7379573.545332 
+331523.859216  7379502.927428 
+331607.781105  7379390.656659 
+331647.461967  7379361.291689 
+331670.782307  7379346.354248 
+331743.489323  7379296.212837 
+331779.426396  7379271.817015 
+331783.351602  7379258.149356 
+331797.452656  7379193.040509 
+331803.843485  7379173.823801 
+331814.118288  7379145.428664 
+331841.899839  7379042.256337 
+331882.372339  7379052.574570 
+331938.718833  7379060.513210 
+331962.641149  7379060.843153 
+332011.895884  7379048.615248 
+332081.848659  7379036.437334 
+332108.558200  7379031.718142 
+332168.351618  7379022.489723 
+332172.557196  7378975.767726 
+332179.236643  7378958.000769 
+332195.085898  7378932.625116 
+332213.491485  7378906.509589 
+332251.828211  7378848.689493 
+332271.058421  7378852.268880 
+332304.637072  7378865.676583 
+332327.817227  7378882.843643 
+332360.051742  7378862.427140 
+332382.621675  7378836.631559 
+332396.590790  7378801.167633 
+332419.160723  7378758.184996 
+332439.578390  7378678.668616 
+332498.349276  7378707.203728 
+332529.445812  7378718.301827 
+332559.923881  7378742.567671 
+332591.943994  7378742.567671 
+332645.486770  7378750.066386 
+332771.555144  7378760.504598 
+332844.509546  7378799.247962 
+332946.416465  7378820.684290 
+333003.554597  7378827.413138 
+333055.637790  7378832.452275 
+333156.464452  7378808.926304 
+333201.835213  7378820.684290 
+333263.418063  7378877.494559 
+333277.444902  7378918.147596 
+333275.762671  7378968.568959 
+333270.245942  7379020.010148 
+333247.519331  7379027.388884 
+333228.734417  7379028.828637 
+333157.940527  7379020.820009 
+333147.484307  7379087.818533 
+333226.895508  7379100.466366 
+333242.439652  7379133.440718 
+333278.657098  7379167.924811 
+333310.693704  7379230.904023 
+333329.833205  7379295.802907 
+333350.547736  7379322.318365 
+333372.383755  7379331.816738 
+333372.375509  7379331.856731 
+333390.921282  7379335.446116 
+333429.216777  7379360.271864 
+333444.661967  7379379.158629 
+333454.466735  7379407.683743 
+333462.218192  7379442.797728 
+333464.650830  7379474.352323 
+333461.772895  7379496.208579 
+333457.855936  7379522.894008 
+333464.782769  7379577.604637 
+333505.972692  7379786.038934 
+333490.576979  7379795.387332 
+333441.511907  7379825.452183 
+333503.490576  7379968.087750 
+333528.196283  7380021.878537 
+333554.510005  7380078.288874 
+333593.539415  7380170.653053 
+333625.881131  7380236.751731 
+333523.025896  7380219.514683 
+333580.757757  7380291.902284 
+333630.111448  7380348.182644 
+333717.282352  7380442.436499 
+333750.333244  7380480.320010 
+333791.218056  7380524.112508 
+333824.277194  7380559.696413 
+333859.587554  7380587.091721 
+333871.816714  7380596.920037 
+333907.786772  7380617.256554 
+333936.211529  7380625.595125 
+333985.961039  7380638.162973 
+333928.699213  7380682.275417 
+333882.751216  7380708.410940 
+333844.216580  7380728.747456 
+333830.428883  7380737.555947 
+333817.861627  7380746.574403 
+333800.033276  7380757.952454 
+333789.799704  7380767.550810 
+333775.467755  7380777.529100 
+333756.633364  7380795.016105 
+333747.537772  7380811.773235 
+333733.527426  7380853.126151 
+333719.970623  7380901.627843 
+333707.700232  7380948.349840 
+333690.209977  7381015.128402 
+Region 1
+292
+326888.372597  7378966.659286 
+326899.570979  7379005.862571 
+326911.560998  7379047.825383 
+326936.068795  7379133.590692 
+326955.142327  7379191.620752 
+326990.906229  7379253.620132 
+327010.787891  7379267.137817 
+327047.763990  7379293.593285 
+327118.442432  7379338.095662 
+327157.546058  7379281.435368 
+327203.477563  7379218.856087 
+327252.311741  7379143.678964 
+327404.899993  7378894.401663 
+327454.839165  7378812.035772 
+327465.369602  7378792.669089 
+327530.655010  7378682.148020 
+327583.430886  7378590.603701 
+327727.129701  7378367.911846 
+327782.272246  7378289.275316 
+327831.972278  7378213.318327 
+327931.957824  7378116.364934 
+328011.014438  7378053.305735 
+328064.953032  7378021.691151 
+328171.106759  7377971.119813 
+328426.319352  7377864.928003 
+328532.489571  7377825.134819 
+328734.926287  7377762.125612 
+328936.010622  7377704.465488 
+329087.287723  7377676.120344 
+329205.530424  7377655.693843 
+329290.639771  7377651.264601 
+329315.345478  7377648.785026 
+329328.960005  7377646.825362 
+329364.963048  7377635.747259 
+329448.060314  7377568.498778 
+329523.727726  7377438.361070 
+329625.543936  7377174.836209 
+329651.247437  7377095.949722 
+329682.426435  7377011.584173 
+329721.117749  7376895.304090 
+329833.423164  7376649.296229 
+329930.068988  7376486.844056 
+330072.497883  7376332.340521 
+330184.976469  7376193.664275 
+330462.791980  7375946.156671 
+330220.690894  7375624.781719 
+330030.260690  7375341.120308 
+329979.950437  7375266.433101 
+329918.738667  7375173.019102 
+329881.383242  7375097.821983 
+329829.506205  7374999.848765 
+329784.325107  7374878.929477 
+329749.987803  7374789.584781 
+329642.061136  7374776.137085 
+329554.700569  7374765.808854 
+329498.873587  7374761.389611 
+329409.476201  7374758.570094 
+329299.941519  7374725.825702 
+329205.373746  7374695.030977 
+329118.408997  7374642.170032 
+329049.973529  7374600.607151 
+328977.835504  7374560.873957 
+328901.887719  7374524.760143 
+328857.473521  7374503.853724 
+328808.103338  7374480.017807 
+328785.302510  7374467.889885 
+328733.343011  7374446.903479 
+328698.139853  7374431.646093 
+328674.110336  7374420.288038 
+328616.782541  7374378.845137 
+328582.519453  7374344.770974 
+328545.485631  7374303.468048 
+328500.436473  7374232.820150 
+328476.209047  7374162.982112 
+328466.956776  7374149.564411 
+328455.453285  7374086.315245 
+328428.628296  7374028.825092 
+328381.649520  7373968.065500 
+328369.865657  7373926.812566 
+328369.873903  7373926.812566 
+328341.383176  7373903.246603 
+328306.031585  7373871.811987 
+328236.293213  7373820.740735 
+328205.848129  7373799.134436 
+328131.549591  7373738.874758 
+328094.573493  7373760.781006 
+328041.360566  7373783.177170 
+327990.877142  7373839.217570 
+327966.352852  7373858.204318 
+327960.019747  7373870.072285 
+327948.153421  7373904.876324 
+327914.137720  7374004.559249 
+327889.613430  7374124.598687 
+327888.186832  7374153.543729 
+327885.605762  7374190.457406 
+327886.974636  7374246.407822 
+327893.588113  7374292.899859 
+327899.863495  7374337.832162 
+327917.518675  7374391.852909 
+327935.231578  7374442.034313 
+327950.586059  7374495.325185 
+327960.176426  7374520.060948 
+327965.701400  7374564.233382 
+327947.081411  7374599.537335 
+327914.912866  7374660.676862 
+327893.315988  7374705.899116 
+327890.001003  7374710.238372 
+327830.059152  7374861.742421 
+327826.983308  7374876.919821 
+327802.879576  7374907.264624 
+327705.986366  7374988.900640 
+327649.854274  7375039.961894 
+327636.940677  7375047.500602 
+327574.681635  7375076.065710 
+327572.405676  7374941.458766 
+327562.485460  7374789.494797 
+327544.063381  7374666.105932 
+327497.348484  7374570.662281 
+327473.046843  7374515.401746 
+327372.104733  7374380.064928 
+327282.163096  7374258.605733 
+326939.218856  7373812.612128 
+326840.923786  7373671.666270 
+326746.067395  7373527.950888 
+326700.935775  7373459.772566 
+326575.411652  7373293.091117 
+326532.052971  7373234.011237 
+326437.848032  7373096.694758 
+326338.217074  7372955.578930 
+326299.707176  7372903.227897 
+326286.925519  7372889.080322 
+326165.969808  7372680.406064 
+326077.867080  7372527.082327 
+325983.068412  7372347.063163 
+325896.829332  7372167.483923 
+325821.879342  7371982.275648 
+325770.241445  7371841.869698 
+325606.792908  7371411.253459 
+325562.403448  7371152.427793 
+325552.730619  7370778.031924 
+325574.055372  7370336.627532 
+325529.971023  7370347.375691 
+325513.626994  7370358.253828 
+325504.820019  7370378.640336 
+325502.766708  7370396.777229 
+325501.645221  7370430.881388 
+325495.188422  7370441.659541 
+325484.938357  7370454.717305 
+325472.577258  7370468.045022 
+325449.166209  7370488.291554 
+325436.961787  7370494.230536 
+325421.813462  7370508.118158 
+325415.637035  7370521.005950 
+325405.073614  7370534.943563 
+325389.075926  7370542.832211 
+325350.524798  7370569.837586 
+325338.246160  7370581.875524 
+325313.862056  7370592.103772 
+325297.377841  7370597.772801 
+325242.614624  7370608.630941 
+325218.296489  7370613.100175 
+325198.241656  7370619.169136 
+325153.629549  7370625.927978 
+325096.301753  7370635.996253 
+325062.632393  7370638.245868 
+325054.344932  7370639.515650 
+325004.958256  7370644.524792 
+324981.901795  7370646.024535 
+324897.039836  7370649.983857 
+324853.606939  7370650.673739 
+324806.751856  7370656.092811 
+324748.269589  7370662.021795 
+324720.158188  7370659.912157 
+324703.278154  7370655.942837 
+324664.496132  7370634.656483 
+324644.408314  7370626.547872 
+324622.374385  7370627.827652 
+324606.863226  7370637.945919 
+324592.151950  7370640.315513 
+324574.628710  7370639.325683 
+324545.832873  7370635.096407 
+324509.532965  7370627.017791 
+324482.056525  7370623.138456 
+324462.999486  7370622.908495 
+324434.244879  7370623.558384 
+324410.908047  7370623.158452 
+324368.209064  7370621.648711 
+324332.791504  7370617.119487 
+324312.629470  7370615.329793 
+324284.394376  7370606.341333 
+324264.133387  7370604.101716 
+324241.711886  7370595.193242 
+324215.381672  7370581.135650 
+324182.833800  7370575.426628 
+324161.302891  7370576.606426 
+324149.799400  7370583.775198 
+324115.882653  7370606.401323 
+324098.153257  7370631.437034 
+324095.407262  7370647.464289 
+324093.659061  7370673.809776 
+324105.005875  7370696.205940 
+324113.953035  7370706.614157 
+324124.763843  7370715.162693 
+324148.818098  7370740.488355 
+324165.549700  7370755.865721 
+324181.308247  7370768.243600 
+324186.016845  7370782.921086 
+324191.682005  7370795.398949 
+324203.201989  7370803.837504 
+324218.358561  7370806.577034 
+324234.504681  7370811.646166 
+324251.359976  7370817.165221 
+324258.031177  7370829.873044 
+324263.440704  7370846.110263 
+324262.846975  7370878.224762 
+324257.940468  7370888.243046 
+324249.826177  7370909.849345 
+324237.959851  7370929.865916 
+324194.848558  7370979.627392 
+324167.207192  7371072.891417 
+324161.640987  7371120.113328 
+324188.556684  7371170.284734 
+324217.872034  7371232.884012 
+324234.496435  7371307.851171 
+324233.952183  7371352.593507 
+324228.237545  7371412.333274 
+324210.005129  7371469.373503 
+324164.197318  7371531.072935 
+324072.911545  7371627.096487 
+324012.136825  7371678.637658 
+323971.441677  7371730.428787 
+323955.881040  7371777.640700 
+323974.888601  7371857.507019 
+323997.120439  7371882.702704 
+324011.839961  7371912.787550 
+324033.494562  7371985.265136 
+324022.073533  7372094.666396 
+323985.946797  7372181.401539 
+323940.015292  7372253.059265 
+323922.500298  7372360.170918 
+323933.838865  7372669.108000 
+323911.755459  7372833.209890 
+323880.823848  7372912.476313 
+323798.996502  7373050.932596 
+323746.905063  7373209.685404 
+323699.307819  7373418.219684 
+323823.100234  7373534.359790 
+323906.172761  7373704.610627 
+323913.907726  7373898.987332 
+323887.074491  7374043.092648 
+323820.238792  7374181.728901 
+323766.976388  7374445.023801 
+323784.664553  7374692.451419 
+323801.594064  7374893.696948 
+323830.991877  7375319.813958 
+323848.416162  7375581.529128 
+323918.509122  7375990.759031 
+324051.281682  7376201.592917 
+324248.828383  7376428.054126 
+324408.862982  7376720.733993 
+325318.084126  7376989.218004 
+325444.540073  7377051.717298 
+325444.531827  7377051.727297 
+325491.881684  7377070.224128 
+325496.046030  7377071.953832 
+325580.883251  7377107.177798 
+325636.932881  7377130.673774 
+325778.520661  7377197.552318 
+325903.582995  7377263.111088 
+325958.230765  7377304.893931 
+326007.642179  7377362.494065 
+326243.797733  7377371.212572 
+326251.747099  7377371.212572 
+326390.910487  7377377.701460 
+326430.896460  7377373.062255 
+326464.780222  7377452.288684 
+326514.059696  7377633.527639 
+326554.507457  7377794.999981 
+326564.427673  7377879.465513 
+326614.993559  7378107.236497 
+326618.052911  7378115.675052 
+326659.589174  7378294.304454 
+326664.042139  7378309.671822 
+326693.596629  7378420.962759 
+326703.887925  7378443.088969 
+326782.647674  7378615.319467 
+326802.554075  7378668.590343 
+326823.499501  7378724.120831 
+326830.343872  7378752.036049 
+326843.579073  7378801.657549 
+326873.966432  7378913.928318 
+326888.372597  7378966.659286 
+Region 1
+267
+348002.318410  7391343.469251 
+348043.970121  7391376.063667 
+348068.469672  7391394.030590 
+348086.751566  7391407.228329 
+348103.821263  7391417.796519 
+348127.421975  7391430.094412 
+348152.449285  7391439.292837 
+348196.781021  7391457.089788 
+348210.337824  7391478.036200 
+348222.278366  7391495.993125 
+348235.472335  7391517.339468 
+348246.027511  7391540.275539 
+348257.423801  7391565.481222 
+348263.987801  7391582.058382 
+348270.848665  7391608.923781 
+348271.673288  7391650.796608 
+348285.477478  7391693.839235 
+348295.826497  7391722.884260 
+348313.976451  7391757.798280 
+348345.501791  7391794.252036 
+348361.153137  7391808.279633 
+348393.560823  7391835.564959 
+348425.556198  7391862.090415 
+348442.353770  7391876.098016 
+348456.496055  7391891.315409 
+348470.011627  7391910.752080 
+348479.676210  7391929.138931 
+348481.341948  7391946.995872 
+348482.851008  7391973.241376 
+348486.512335  7392070.054793 
+348491.460073  7392164.818561 
+348496.811877  7392234.846566 
+348510.286218  7392281.578561 
+348521.377398  7392314.862860 
+348558.609129  7392370.333358 
+348657.646360  7392517.698116 
+348741.188922  7392623.859931 
+348786.790578  7392714.184459 
+348878.686572  7392666.642603 
+349016.044036  7392602.833533 
+349051.412119  7392638.127487 
+349103.709714  7392666.642603 
+349165.218348  7392675.981003 
+349303.367450  7392714.184459 
+349382.597234  7392728.442017 
+349407.146263  7392735.580794 
+349441.219688  7392751.418082 
+349461.818772  7392763.306045 
+349477.668027  7392775.983874 
+349498.267112  7392805.298852 
+349518.066311  7392851.250981 
+349521.241110  7392867.098267 
+349535.507089  7392970.090625 
+349548.198038  7393063.314657 
+349545.971556  7393238.614629 
+349545.996295  7393279.367649 
+349547.678526  7393351.705258 
+349548.231023  7393407.275739 
+349547.332184  7393429.751889 
+349544.223355  7393530.244676 
+349543.522425  7393629.737633 
+349640.902163  7393620.389235 
+349676.558864  7393610.480932 
+349712.100119  7393622.288909 
+349788.526184  7393646.024844 
+349904.418710  7393709.853910 
+349930.361351  7393725.271269 
+350035.847134  7393861.008019 
+350092.102919  7393925.996887 
+350129.936625  7393973.598733 
+350144.087157  7393988.036260 
+350252.953894  7393966.969869 
+350323.450920  7393954.512003 
+350362.933872  7393945.803494 
+350369.506118  7394021.390547 
+350379.368610  7394083.839850 
+350392.513102  7394156.137466 
+350405.657593  7394185.712400 
+350454.953560  7394221.866207 
+350491.105035  7394261.309451 
+350530.546756  7394343.465378 
+350530.546756  7394373.050311 
+350523.974511  7394405.914681 
+350563.407986  7394455.206238 
+350599.559461  7394497.928920 
+350606.131707  7394537.372164 
+350619.276198  7394576.805409 
+350639.001182  7394603.100905 
+350658.717919  7394635.965276 
+350685.006903  7394668.829646 
+350681.724903  7394698.404581 
+350664.143939  7394740.557360 
+350571.200674  7395067.051435 
+350538.487877  7395033.177237 
+350503.020839  7395003.812267 
+350459.076675  7394978.806550 
+350434.997682  7394967.208537 
+350413.128678  7394959.079929 
+350086.066678  7394873.004673 
+350034.956541  7394863.116367 
+349986.988217  7394873.104656 
+349957.013169  7394893.091232 
+349929.033708  7394919.076781 
+349909.053091  7394943.062673 
+349897.054826  7394979.026513 
+349181.216036  7394936.783748 
+349134.921697  7394844.179611 
+349102.332593  7394770.442241 
+349036.890507  7394673.808794 
+349082.723057  7394652.302477 
+349075.507605  7394634.605509 
+349056.030008  7394581.804553 
+349021.733935  7394496.059240 
+349013.157855  7394477.192472 
+348996.013942  7394454.896291 
+348966.863516  7394436.039521 
+348934.266167  7394420.602166 
+348908.150354  7394405.054829 
+348885.943255  7394393.146868 
+348860.660312  7394382.698658 
+348851.605951  7394378.309410 
+348828.087701  7394373.620213 
+348802.046104  7394379.539199 
+348775.130408  7394393.146868 
+348751.133876  7394403.435106 
+348733.289033  7394408.244282 
+348711.337567  7394404.124988 
+348682.533484  7394389.037572 
+348653.028470  7394369.830862 
+348629.741115  7394349.954267 
+348615.301965  7394336.216620 
+348596.780931  7394317.009910 
+348575.629349  7394300.402755 
+348564.043395  7394285.045385 
+348539.576829  7394277.136740 
+348520.156956  7394276.726810 
+348498.048812  7394277.016760 
+348471.718597  7394278.736466 
+348456.388854  7394282.605803 
+348428.359916  7394291.924207 
+348391.086954  7394305.601864 
+348368.756161  7394315.800117 
+348324.671812  7394327.808060 
+348284.751810  7394340.295921 
+348223.878135  7394353.103727 
+348101.322655  7394364.211825 
+347921.010576  7394383.298555 
+347829.056858  7394393.236853 
+347815.269160  7394394.876572 
+347780.503052  7394397.376144 
+347752.136018  7394404.394942 
+347713.791046  7394415.393058 
+347685.753862  7394425.081398 
+347661.180094  7394433.319987 
+347626.141860  7394449.337244 
+347609.913278  7394459.275541 
+347548.396398  7394499.508650 
+347318.458502  7394656.561748 
+347294.041414  7394675.868441 
+347218.505941  7394729.509253 
+347186.799184  7394750.175713 
+347176.351210  7394757.204509 
+347140.620292  7394769.772356 
+347066.610372  7394790.678775 
+347018.477124  7394806.536059 
+346962.971745  7394807.515891 
+346860.133003  7394806.746023 
+346822.472468  7394809.665523 
+346782.593696  7394816.694319 
+346686.409662  7394868.085516 
+346617.850500  7394882.603029 
+346565.899247  7394898.500306 
+346430.289984  7394925.275720 
+346387.327123  7394929.964916 
+346341.610020  7394930.954747 
+346285.783039  7394920.986454 
+346235.522263  7394903.979367 
+346174.071352  7394867.085687 
+346126.630787  7394827.792418 
+346115.176773  7394818.963930 
+346097.628794  7394806.816011 
+346083.338076  7394794.798069 
+346058.467445  7394776.921131 
+346033.456627  7394772.161947 
+345972.533475  7394769.042481 
+345899.875937  7394769.042481 
+345838.952785  7394765.913017 
+345779.596417  7394747.176226 
+345755.286529  7394735.108294 
+345743.189308  7394728.849366 
+345734.192671  7394719.580953 
+345694.008789  7394678.358014 
+345604.397000  7394584.384111 
+345585.076082  7394559.308406 
+345568.666083  7394536.652287 
+345543.663511  7394488.240580 
+345517.118895  7394416.352893 
+345500.717142  7394389.017576 
+345475.722817  7394361.672260 
+345423.383991  7394329.647745 
+345376.817527  7394306.041789 
+345355.731915  7394296.593407 
+345311.812491  7394276.566838 
+345249.974007  7394251.931057 
+345175.988826  7394226.315445 
+345149.056636  7394192.841179 
+345185.076172  7394137.180713 
+345208.652145  7394101.936750 
+345212.552612  7394097.157569 
+345236.326495  7394060.013931 
+345279.173910  7394006.163155 
+345355.921578  7393919.937925 
+345398.183510  7393875.395555 
+345566.085013  7393697.206077 
+345617.863095  7393643.945200 
+345679.157327  7393578.416424 
+345741.853419  7393512.777668 
+345769.626724  7393483.962603 
+345795.346717  7393465.515763 
+345873.141657  7393416.724121 
+345923.583850  7393378.540661 
+345984.787374  7393324.199969 
+346022.678804  7393283.376962 
+346063.019364  7393227.996448 
+346100.993256  7393158.388371 
+346228.356288  7392901.292410 
+346263.163628  7392865.698506 
+346376.293666  7392773.934225 
+346403.176378  7392745.449104 
+346422.183940  7392720.143439 
+346442.741793  7392679.790351 
+346455.399757  7392652.105093 
+346463.307892  7392630.748751 
+346476.757494  7392577.747830 
+346480.723931  7392523.957044 
+346479.924047  7392470.166258 
+346477.549132  7392398.968453 
+346486.232413  7392292.756646 
+346516.306416  7392184.595173 
+346565.338504  7392082.332690 
+346624.348530  7391987.368956 
+346684.867617  7391909.972214 
+346704.996666  7391885.286442 
+346889.671001  7391780.154450 
+346952.960821  7391734.272310 
+347015.195124  7391701.957845 
+347066.107352  7391680.481523 
+347096.173109  7391670.193286 
+347142.063383  7391658.325319 
+347192.678746  7391650.416673 
+347247.268793  7391647.257214 
+347272.576475  7391648.047079 
+347341.407762  7391649.626809 
+347405.480974  7391649.626809 
+347508.286732  7391628.270467 
+347541.510795  7391615.612635 
+347574.726612  7391601.375074 
+347628.533267  7391566.571035 
+347672.823772  7391530.177269 
+347707.631112  7391496.952960 
+347719.654116  7391482.305469 
+347750.651697  7391439.652775 
+347799.609568  7391371.704414 
+347814.601216  7391351.257916 
+347907.783622  7391271.701544 
+347914.586762  7391276.450730 
+348002.318410  7391343.469251 
+Region 1
+921
+359001.924239  7391495.483212 
+358973.210864  7391519.799047 
+358956.240121  7391533.146761 
+358936.836740  7391544.584801 
+358920.756590  7391550.853727 
+358896.257039  7391561.131967 
+358881.718935  7391565.751176 
+358869.052724  7391566.850987 
+358853.492087  7391571.910121 
+358834.459787  7391587.007535 
+358824.275692  7391606.064270 
+358816.012969  7391637.768840 
+358808.739793  7391660.954868 
+358802.027362  7391690.119872 
+358796.238508  7391718.854950 
+358793.517252  7391736.441938 
+358789.996111  7391763.207353 
+358789.864171  7391776.825021 
+358791.084614  7391798.101376 
+358799.256628  7391808.479599 
+358813.860703  7391817.588038 
+358830.724244  7391826.166569 
+358864.673976  7391841.004027 
+358893.766678  7391851.582215 
+358916.625229  7391861.990433 
+358939.450795  7391876.937872 
+358961.055920  7391890.875485 
+358978.909009  7391902.233539 
+358994.395430  7391905.482983 
+359017.633308  7391908.592450 
+359046.824965  7391908.982383 
+359074.878641  7391910.912053 
+359100.771806  7391913.821554 
+359134.960678  7391914.371460 
+359159.550938  7391915.161325 
+359184.363846  7391914.741397 
+359205.663859  7391917.600907 
+359225.248657  7391930.298732 
+359252.288047  7391952.154988 
+359266.652981  7391976.110885 
+359284.085513  7391999.306912 
+359293.247075  7392013.014564 
+359312.403069  7392037.790320 
+359326.100058  7392056.967035 
+359342.971846  7392085.252190 
+359357.039915  7392108.198259 
+359361.839222  7392129.174666 
+359369.104151  7392148.741315 
+359371.792422  7392177.336417 
+359369.029935  7392188.164562 
+359357.303795  7392208.651053 
+359334.247334  7392228.027734 
+359307.422346  7392236.736242 
+359278.667739  7392244.434923 
+359247.200123  7392247.564387 
+359227.681295  7392249.484058 
+359204.294985  7392251.253755 
+359183.778363  7392250.943808 
+359161.422832  7392251.393731 
+359137.088205  7392255.583014 
+359122.005849  7392263.191710 
+359100.417218  7392279.258958 
+359084.345314  7392305.134526 
+359074.350883  7392325.411053 
+359066.731365  7392342.498126 
+359054.832055  7392359.665185 
+359041.209282  7392374.702610 
+359023.009851  7392388.590231 
+358994.057335  7392405.807282 
+358966.514924  7392414.735752 
+358941.495861  7392426.783689 
+358910.110707  7392442.321027 
+358889.866210  7392456.408614 
+358870.619508  7392473.055763 
+358854.085816  7392493.492262 
+358839.316817  7392511.509176 
+358830.320179  7392523.167179 
+358825.479642  7392538.844494 
+358822.981034  7392554.211861 
+358821.323541  7392567.259626 
+358819.393923  7392576.877979 
+358812.137240  7392588.326018 
+358806.422603  7392598.344302 
+358799.058719  7392610.682188 
+358803.148849  7392630.878729 
+358695.700464  7392606.132968 
+358683.141454  7392596.164675 
+358672.429601  7392584.316705 
+358662.212521  7392575.358239 
+358650.667798  7392565.389947 
+358637.614015  7392553.751940 
+358620.272192  7392541.733999 
+358609.329444  7392533.655382 
+358600.497731  7392528.476270 
+358588.408757  7392522.817239 
+358571.182381  7392520.327665 
+358560.264372  7392519.337835 
+358547.919764  7392519.217855 
+358532.218941  7392517.408165 
+358514.151450  7392516.678290 
+358505.418691  7392512.049083 
+358490.468275  7392507.029943 
+358479.731683  7392497.741534 
+358458.745026  7392493.662233 
+358434.880435  7392492.102500 
+358412.129084  7392490.772728 
+358391.299106  7392491.452611 
+358379.127669  7392493.552252 
+358336.206039  7392499.231279 
+358317.371648  7392504.030457 
+358294.636790  7392512.339034 
+358279.876037  7392517.948073 
+358258.452330  7392527.486439 
+358247.855923  7392535.914995 
+358231.742789  7392544.943449 
+358221.105151  7392547.393029 
+358203.012921  7392549.872605 
+358192.523716  7392557.521294 
+358181.737646  7392564.950022 
+358160.792220  7392577.587857 
+358146.542734  7392583.656818 
+358130.965604  7392590.255687 
+358131.270715  7392589.875752 
+358098.302284  7392600.683901 
+358070.009467  7392581.587172 
+358060.666488  7392576.618023 
+358046.037675  7392568.839356 
+358008.674004  7392558.951050 
+357988.182120  7392556.651443 
+357968.696277  7392554.911741 
+357956.277454  7392552.132218 
+357926.780687  7392541.104107 
+357909.587296  7392535.395084 
+357890.142684  7392530.006008 
+357867.399580  7392527.896369 
+357849.348581  7392526.176663 
+357827.298160  7392526.066682 
+357801.949247  7392529.256136 
+357785.374324  7392533.855348 
+357774.901611  7392539.514379 
+357765.410199  7392549.942593 
+357756.479532  7392565.799876 
+357749.734115  7392576.807991 
+357740.597291  7392592.775256 
+357729.192754  7392611.052125 
+357723.296700  7392619.080750 
+357708.585424  7392630.778746 
+357699.151736  7392635.457945 
+357687.005038  7392635.227984 
+357678.643361  7392634.368131 
+357668.888070  7392629.618945 
+357661.557171  7392627.779260 
+357646.235674  7392628.629114 
+357632.002680  7392633.468285 
+357621.876309  7392635.807885 
+357605.326124  7392637.087665 
+357594.243190  7392632.658424 
+357577.025060  7392628.839078 
+357552.459539  7392625.719613 
+357550.736077  7392660.253697 
+357480.420468  7392694.647806 
+357302.714198  7392777.373636 
+357234.921936  7392824.855503 
+357159.782282  7392875.006912 
+357071.885710  7392930.567395 
+356986.990765  7392986.037893 
+356949.016873  7393013.473194 
+356898.698374  7393073.692879 
+356860.303924  7393114.835832 
+356756.756005  7393224.587032 
+356710.626591  7393275.248354 
+356673.353629  7393314.431643 
+356626.193436  7393350.595448 
+356562.227424  7393415.704295 
+356220.206762  7393530.774585 
+356153.709158  7393544.252276 
+356091.796459  7393545.162121 
+355994.408475  7393532.714253 
+355972.877566  7393520.766299 
+355945.780452  7393504.769039 
+355918.543153  7393492.761096 
+355895.709340  7393479.253410 
+355885.005733  7393477.153770 
+355872.677618  7393474.704189 
+355861.289573  7393470.494910 
+355852.086780  7393461.986368 
+355844.599202  7393454.827594 
+355836.460173  7393452.198044 
+355822.301395  7393448.958599 
+355807.474672  7393441.169933 
+355792.928321  7393435.930831 
+355785.531452  7393430.431773 
+355784.162578  7393424.222836 
+355782.117513  7393414.344528 
+355776.889403  7393405.985960 
+355768.585448  7393399.477075 
+355751.581721  7393394.547919 
+355738.932003  7393394.207978 
+355719.693547  7393398.997157 
+355702.780528  7393405.476047 
+355691.474946  7393413.004758 
+355670.694444  7393429.961853 
+355657.418013  7393440.360072 
+355647.769923  7393446.019103 
+355635.260391  7393451.318195 
+355627.789306  7393452.907923 
+355621.266538  7393452.178048 
+355611.041212  7393443.999449 
+355603.759790  7393436.500733 
+355596.049565  7393431.441600 
+355590.170002  7393427.732235 
+355581.297058  7393426.532441 
+355570.271848  7393426.652420 
+355558.496230  7393430.081833 
+355546.885537  7393437.820507 
+355533.848247  7393445.779144 
+355520.390398  7393453.837764 
+355497.474123  7393459.046871 
+355478.763426  7393461.736411 
+355458.147849  7393461.316483 
+355448.120433  7393460.056698 
+355435.924258  7393458.656938 
+355419.819369  7393455.947402 
+355408.604496  7393454.177705 
+355395.641421  7393454.717613 
+355382.455698  7393455.797428 
+355368.569046  7393456.547299 
+355360.916544  7393455.807426 
+355352.794007  7393451.408180 
+355345.388892  7393446.579007 
+355337.802359  7393440.080120 
+355330.578661  7393436.900665 
+355323.956938  7393435.620884 
+355316.906411  7393436.550725 
+355309.938346  7393439.580206 
+355295.260055  7393451.808111 
+355287.343674  7393461.046529 
+355278.990242  7393465.445775 
+355265.796273  7393470.724871 
+355253.921701  7393474.234270 
+355256.436802  7393459.456801 
+355250.986043  7393432.611399 
+355249.048179  7393415.574318 
+355247.357702  7393401.996643 
+355240.290682  7393381.950077 
+355228.844914  7393365.882829 
+355213.358493  7393348.995722 
+355199.892398  7393332.648522 
+355184.034896  7393323.340117 
+355165.992144  7393307.942754 
+355141.641025  7393289.935838 
+355124.224986  7393265.450033 
+355109.835313  7393260.710844 
+355103.526947  7393258.091293 
+355091.462711  7393250.602576 
+355083.439129  7393243.933718 
+355077.707999  7393236.524987 
+355072.479888  7393229.636167 
+355067.639351  7393212.649077 
+355065.272683  7393201.001072 
+355064.695447  7393188.113280 
+355063.837839  7393176.735229 
+355063.087432  7393158.288388 
+355063.252356  7393146.670379 
+355061.405201  7393133.512632 
+355056.012166  7393102.367967 
+355047.089744  7393087.600497 
+355034.110177  7393072.773036 
+355016.108656  7393054.086237 
+354999.830596  7393038.968827 
+354988.590984  7393026.440973 
+354977.343125  7393014.922946 
+354967.381679  7393001.905176 
+354963.489458  7392989.977219 
+354955.169011  7392968.400914 
+354950.064594  7392952.413653 
+354943.005821  7392931.607217 
+354929.803606  7392878.386333 
+354928.022420  7392843.002394 
+354925.713475  7392809.378154 
+354921.491405  7392767.135389 
+354910.276531  7392734.660952 
+354901.675713  7392697.407333 
+354889.834126  7392655.824456 
+354878.866639  7392623.849933 
+354864.806816  7392596.134680 
+354848.908083  7392572.178784 
+354831.046747  7392543.643672 
+354812.954517  7392513.598818 
+354785.354383  7392474.065590 
+354762.627772  7392394.719181 
+354781.214776  7392295.576163 
+354843.127475  7392234.066699 
+354857.385208  7392217.039616 
+354876.161875  7392196.853074 
+354899.556432  7392174.716865 
+354936.483052  7392145.951793 
+354968.297010  7392118.366518 
+355011.391812  7392085.682116 
+355034.233871  7392067.855170 
+355052.721920  7392056.187168 
+355068.018677  7392047.368679 
+355087.191164  7392038.480201 
+355107.600585  7392028.941835 
+355126.410237  7392025.912354 
+355148.097823  7392021.473115 
+355163.345104  7392017.083866 
+355193.072765  7391994.347761 
+355206.629568  7391986.179160 
+355223.072552  7391974.271200 
+355240.406129  7391965.912632 
+355261.302078  7391958.703866 
+355283.913242  7391953.384778 
+355303.588748  7391945.826072 
+355323.734290  7391941.596797 
+355337.439525  7391939.297191 
+355363.266720  7391939.107223 
+355353.264042  7391928.599023 
+355347.483434  7391924.559715 
+355339.393882  7391906.762763 
+355347.293771  7391891.885312 
+355349.916072  7391884.936502 
+355355.828620  7391875.688086 
+355364.759287  7391870.688943 
+355379.132467  7391861.860455 
+355394.825044  7391843.833543 
+355405.429697  7391834.875077 
+355413.849098  7391829.975916 
+355419.473028  7391829.036077 
+355430.605439  7391827.926267 
+355438.480589  7391826.346538 
+355445.869212  7391822.317228 
+355462.567829  7391796.131714 
+355469.272015  7391788.662993 
+355474.607326  7391786.173419 
+355485.055300  7391782.064123 
+355491.924410  7391779.584548 
+355496.872149  7391774.655392 
+355502.059028  7391765.846901 
+355506.949042  7391756.808449 
+355511.773087  7391743.790679 
+355515.937434  7391735.192152 
+355521.190283  7391719.854779 
+355524.183664  7391706.597050 
+355529.197373  7391695.019033 
+355535.753126  7391682.011261 
+355543.026301  7391669.233450 
+355551.660105  7391652.936242 
+355556.451165  7391633.269610 
+355556.409934  7391606.464202 
+355555.709004  7391583.978054 
+355550.777758  7391556.692727 
+355549.136758  7391525.778023 
+355545.599125  7391511.900400 
+355542.251156  7391500.242397 
+355534.202835  7391477.346319 
+355530.063227  7391462.688829 
+355528.100624  7391444.951868 
+355528.587152  7391426.565017 
+355530.879604  7391411.417612 
+355533.543136  7391399.599636 
+355539.158819  7391379.503078 
+355550.200522  7391356.577005 
+355557.242803  7391329.411659 
+355581.173364  7391343.589230 
+355603.792775  7391364.085719 
+355644.100350  7390990.169768 
+355650.878752  7390846.134440 
+355633.932748  7390737.683016 
+355635.631472  7390690.231144 
+355622.066422  7390639.399851 
+355606.819142  7390600.426527 
+355584.793460  7390575.010881 
+355559.370331  7390561.453203 
+355527.177046  7390542.806397 
+355493.293284  7390512.311620 
+355471.259356  7390476.727716 
+355456.003829  7390427.586133 
+355449.233674  7390371.665712 
+355439.057825  7390324.213840 
+355400.086139  7390256.435450 
+355366.185885  7390205.594158 
+355337.348817  7390159.572041 
+355358.104579  7390140.385328 
+355372.230372  7390125.457885 
+355381.705291  7390116.919347 
+355392.755240  7390103.741605 
+355408.216923  7390089.054121 
+355420.792425  7390076.326301 
+355427.175007  7390070.307332 
+355450.841689  7390051.380574 
+355458.568407  7390043.701889 
+355466.220909  7390034.143526 
+355471.416035  7390024.675148 
+355482.078411  7390009.047825 
+355492.064596  7390000.399306 
+355509.736268  7389988.951267 
+355517.149630  7389982.272411 
+355522.600388  7389978.003143 
+355527.828498  7389964.985372 
+355530.459046  7389956.926753 
+355532.792729  7389948.648171 
+355534.392498  7389941.019478 
+355541.187392  7389925.252178 
+355544.114804  7389917.643482 
+355548.963588  7389912.704328 
+355557.176833  7389908.025129 
+355562.817255  7389905.305595 
+355578.559309  7389902.476080 
+355584.397641  7389900.206468 
+355596.898926  7389895.347301 
+355602.357931  7389890.088202 
+355613.581051  7389880.119909 
+355620.285236  7389873.211092 
+355629.570492  7389862.672898 
+355635.293376  7389851.654785 
+355636.959115  7389838.717001 
+355638.682577  7389828.988667 
+355638.154818  7389810.481837 
+355633.635884  7389803.133096 
+355628.919040  7389794.774528 
+355623.138432  7389790.845201 
+355604.501951  7389777.037566 
+355599.884062  7389758.280779 
+355598.754328  7389748.632432 
+355596.099042  7389738.754124 
+355595.777439  7389719.587407 
+355613.350156  7389697.061265 
+355621.827282  7389686.293110 
+355636.390125  7389658.747828 
+355643.514868  7389640.101022 
+355651.860054  7389621.474213 
+355656.725330  7389594.278871 
+355659.628003  7389569.053192 
+355664.344847  7389535.328969 
+355672.228243  7389512.372901 
+355678.017097  7389494.815908 
+355698.038945  7389461.241659 
+355710.993773  7389441.874976 
+355726.199823  7389421.208516 
+355740.218415  7389396.542741 
+355747.211218  7389380.995405 
+355761.452459  7389343.821772 
+355763.695434  7389323.355278 
+355770.119247  7389293.630369 
+355775.504036  7389275.073548 
+355788.153754  7389234.560488 
+355809.874325  7389225.692007 
+355817.279440  7389219.783019 
+355819.852264  7389217.483413 
+355825.014405  7389211.994353 
+355829.879681  7389204.515634 
+355838.076434  7389180.559737 
+355852.292936  7389157.333716 
+355851.443574  7389150.244930 
+355860.605136  7389142.026338 
+355865.783769  7389134.437638 
+355873.832090  7389125.439179 
+355880.561014  7389115.980799 
+355894.670315  7389102.493109 
+355905.901681  7389091.534987 
+355914.436530  7389085.086091 
+355932.858609  7389069.868698 
+355945.401126  7389060.250345 
+355956.137718  7389057.810763 
+355961.745155  7389058.860583 
+355963.938652  7389063.759744 
+355963.072798  7389068.728893 
+355962.009034  7389073.478080 
+355961.448291  7389078.567208 
+355965.192079  7389081.376727 
+355971.492200  7389084.536185 
+355980.480591  7389083.626341 
+355986.846681  7389079.926975 
+355997.781183  7389078.047297 
+356013.820102  7389076.647537 
+356020.153207  7389076.047639 
+356032.110241  7389074.617884 
+356051.612577  7389072.818193 
+356058.762059  7389072.218295 
+356070.752078  7389067.799052 
+356080.490876  7389062.909890 
+356085.644770  7389057.650791 
+356086.444655  7389048.792308 
+356087.343494  7389040.723690 
+356087.384725  7389036.734373 
+356088.869047  7389020.797103 
+356093.519921  7389014.758138 
+356098.871724  7389010.048944 
+356105.015166  7389008.339237 
+356116.469181  7389005.459730 
+356123.090904  7389006.519549 
+356127.057341  7389007.889314 
+356134.874767  7389012.288561 
+356138.907174  7389017.307701 
+356148.274892  7389019.287362 
+356153.387555  7389018.337525 
+356165.369328  7389014.138244 
+356176.345061  7389008.929136 
+356183.222418  7389004.229941 
+356199.500477  7388999.630729 
+356211.589451  7388994.771561 
+356229.953807  7388984.873257 
+356247.551263  7388979.844118 
+356263.342795  7388972.135439 
+356274.326774  7388966.256446 
+356286.630150  7388959.847543 
+356296.616335  7388951.089044 
+356298.710878  7388946.119895 
+356303.584400  7388938.311232 
+356309.513440  7388936.591527 
+356315.830053  7388937.651345 
+356320.596374  7388940.800806 
+356326.203811  7388941.850626 
+356331.481399  7388944.230218 
+356337.097082  7388944.510171 
+356343.636342  7388943.910273 
+356347.742965  7388940.630835 
+356348.625312  7388934.541878 
+356348.666543  7388930.002656 
+356348.732513  7388923.693736 
+356350.860041  7388914.855250 
+356355.296513  7388909.916096 
+356364.911618  7388907.466516 
+356373.611391  7388905.106920 
+356386.797114  7388902.917295 
+356398.770641  7388899.597864 
+356409.358801  7388891.399268 
+356421.373559  7388884.210499 
+356428.085991  7388876.191873 
+356449.031416  7388863.324077 
+356458.250702  7388859.104800 
+356472.458958  7388857.025156 
+356487.170233  7388855.175473 
+356505.270709  7388851.586088 
+356521.829141  7388849.316476 
+356546.493616  7388842.027725 
+356565.822781  7388837.238545 
+356575.569826  7388832.009441 
+356590.660428  7388823.410914 
+356601.479482  7388812.892715 
+356619.753129  7388791.476384 
+356626.160451  7388782.897853 
+356642.323063  7388768.990236 
+356672.743408  7388736.735760 
+356684.947829  7388709.610407 
+356695.832853  7388692.113404 
+356698.974667  7388684.274747 
+356703.938898  7388677.795856 
+356711.640878  7388672.886697 
+356715.450636  7388668.827393 
+356723.713359  7388659.159049 
+356716.530892  7388641.812020 
+356711.814048  7388634.013356 
+356708.325893  7388625.784765 
+356709.397903  7388620.265711 
+356715.087802  7388612.237086 
+356736.156921  7388597.599593 
+356750.744503  7388587.441333 
+356761.233709  7388579.462700 
+356772.720708  7388573.043799 
+356785.815722  7388559.326149 
+356792.825018  7388552.637295 
+356805.895294  7388541.469208 
+356815.147565  7388534.700367 
+356825.669755  7388522.512455 
+356833.891247  7388516.723447 
+356845.609141  7388508.534849 
+356851.752582  7388506.155257 
+356863.742602  7388501.176110 
+356873.456662  7388498.836510 
+356883.904636  7388494.947177 
+356893.173399  7388486.408639 
+356900.100233  7388477.170222 
+356907.530087  7388469.381556 
+356925.993397  7388459.263289 
+356934.404552  7388454.584090 
+356947.928371  7388449.734921 
+356958.730933  7388440.756459 
+356967.166827  7388433.527697 
+356973.854520  7388427.618709 
+356984.871484  7388418.090341 
+356993.340363  7388407.652129 
+356997.282061  7388401.043261 
+356999.393096  7388393.754510 
+357000.704247  7388385.465930 
+357000.918649  7388374.057884 
+357000.968126  7388368.858774 
+357001.528870  7388363.219740 
+357009.511221  7388351.001833 
+357022.804145  7388348.142323 
+357040.904621  7388343.773071 
+357049.497193  7388342.093359 
+357057.166188  7388340.173688 
+357065.577343  7388335.714452 
+357073.271076  7388331.805121 
+357086.514523  7388323.846485 
+357098.850884  7388314.668057 
+357109.150426  7388305.239672 
+357115.013496  7388300.210533 
+357125.255314  7388296.541162 
+357138.498761  7388287.922638 
+357144.139183  7388285.763008 
+357152.855448  7388280.973828 
+357161.448021  7388279.394099 
+357167.104935  7388274.364960 
+357172.580432  7388267.326166 
+357181.024572  7388259.877442 
+357183.663366  7388250.818994 
+357188.371964  7388239.240977 
+357190.507737  7388229.402662 
+357194.663838  7388221.693982 
+357197.096476  7388212.635534 
+357201.755596  7388206.366608 
+357204.361405  7388200.637589 
+357215.106243  7388197.418141 
+357226.065484  7388192.988899 
+357236.999986  7388191.429166 
+357247.151096  7388186.440021 
+357254.341809  7388181.530862 
+357261.029502  7388176.051800 
+357272.029974  7388168.303128 
+357280.234973  7388163.393969 
+357289.223365  7388152.635811 
+357313.483775  7388124.190684 
+357330.405040  7388104.644032 
+357342.832110  7388086.377161 
+357350.880431  7388077.158740 
+357356.578576  7388068.350249 
+357364.206340  7388060.671564 
+357376.872550  7388049.173534 
+357394.643177  7388026.867354 
+357400.885574  7388014.079545 
+357409.840980  7388005.860953 
+357418.986050  7387989.113821 
+357426.457135  7387977.005895 
+357429.095929  7387967.957445 
+357431.512074  7387960.448731 
+357436.575260  7387943.771588 
+357440.516958  7387926.424559 
+357443.172244  7387916.156318 
+357448.284907  7387894.280065 
+357454.461334  7387868.094551 
+357462.740550  7387855.546700 
+357474.598629  7387843.258805 
+357479.999911  7387833.790427 
+357486.225815  7387823.222237 
+357486.671111  7387808.604741 
+357485.698056  7387803.495616 
+357483.941609  7387785.318730 
+357482.836614  7387772.910855 
+357479.686554  7387761.472814 
+357476.726157  7387750.584679 
+357471.052750  7387735.917192 
+357462.418947  7387721.659634 
+357456.885726  7387713.301066 
+357450.206279  7387697.063847 
+357441.325089  7387676.927296 
+357435.709406  7387603.789824 
+357462.319992  7387627.305796 
+357482.457287  7387644.662823 
+357504.021180  7387662.149827 
+357528.520732  7387671.808173 
+357545.681138  7387680.606666 
+357566.181267  7387692.214677 
+357582.962346  7387707.991975 
+357602.786285  7387725.688944 
+357614.265038  7387741.526231 
+357622.470037  7387758.543316 
+357633.256107  7387782.349238 
+357638.360524  7387803.105683 
+357643.258785  7387834.830249 
+357646.755187  7387863.325368 
+357646.788172  7387880.492427 
+357646.351121  7387893.880134 
+357647.950890  7387907.847741 
+357653.080046  7387926.064621 
+357662.060191  7387937.002747 
+357670.850673  7387945.951215 
+357683.244757  7387951.390283 
+357692.785646  7387956.799356 
+357704.198429  7387958.009149 
+357712.823987  7387963.408224 
+357717.252212  7387968.997267 
+357718.827243  7387985.734400 
+357703.786118  7388011.280024 
+357682.378903  7388040.085090 
+357664.105256  7388061.501422 
+357649.047639  7388079.038418 
+357639.638690  7388090.496455 
+357617.406852  7388120.291352 
+357604.427285  7388143.857315 
+357594.028788  7388163.693917 
+357586.994753  7388193.968731 
+357576.117975  7388231.402319 
+357572.819483  7388255.848132 
+357571.277438  7388278.314284 
+357566.337945  7388302.960062 
+357566.865704  7388321.896819 
+357565.381383  7388338.383994 
+357563.014714  7388350.651893 
+357554.949901  7388361.210085 
+357535.719691  7388376.637442 
+357518.567531  7388387.545574 
+357498.380759  7388396.863977 
+357472.133007  7388409.461819 
+357453.166676  7388418.240316 
+357425.426356  7388426.498901 
+357397.900438  7388434.537524 
+357379.585560  7388439.556665 
+357358.211330  7388444.665789 
+357338.041050  7388451.004704 
+357318.612931  7388465.322251 
+357300.908273  7388481.539473 
+357295.012218  7388499.976315 
+357293.758791  7388523.662258 
+357295.333821  7388540.069448 
+357302.145208  7388562.945529 
+357302.639982  7388586.091564 
+357297.593289  7388601.218973 
+357291.829173  7388616.336384 
+357281.941943  7388636.392948 
+357269.613828  7388644.571547 
+357260.650175  7388653.240062 
+357245.262709  7388661.388667 
+357233.783956  7388666.817737 
+357220.276630  7388670.007190 
+357206.027144  7388676.846019 
+357199.520868  7388684.864645 
+357194.317496  7388694.892928 
+357191.472546  7388703.941378 
+357192.288923  7388714.809516 
+357203.042008  7388732.076558 
+357220.342600  7388747.193969 
+357256.139487  7388769.910078 
+357288.835792  7388797.035432 
+357326.727222  7388825.530551 
+357352.290537  7388851.586088 
+357385.456876  7388883.030701 
+357417.279080  7388915.785091 
+357447.146928  7388941.520683 
+357449.159008  7388943.230390 
+357486.629880  7388972.945300 
+357523.243144  7389006.739511 
+357576.835397  7389046.802649 
+357616.862601  7389075.987650 
+357648.082830  7389097.883899 
+357680.828612  7389120.240070 
+357707.538153  7389133.237843 
+357729.761744  7389146.625550 
+357764.354682  7389157.373709 
+357802.312082  7389167.931900 
+357831.652170  7389173.310979 
+357853.785053  7389174.300809 
+357879.760680  7389169.131695 
+357896.368588  7389161.213051 
+357920.365120  7389149.145118 
+357936.758626  7389132.477973 
+357949.152711  7389117.430551 
+357959.790348  7389103.682906 
+357973.479091  7389081.666677 
+357983.333337  7389065.379467 
+357993.146351  7389053.071575 
+358004.674582  7389043.323245 
+358021.249505  7389038.504070 
+358041.081690  7389035.484587 
+358057.128855  7389032.875034 
+358075.864291  7389029.015696 
+358085.339210  7389027.945879 
+358094.195662  7389030.575428 
+358106.985565  7389047.422543 
+358124.838655  7389079.926975 
+358143.194764  7389112.781347 
+358162.639376  7389138.216990 
+358182.966335  7389157.683656 
+358204.629182  7389175.830547 
+358229.062764  7389192.797641 
+358255.483687  7389204.455644 
+358285.310303  7389222.022635 
+358322.096738  7389238.659785 
+358359.031605  7389249.427941 
+358397.706427  7389260.985961 
+358415.386345  7389268.354699 
+358441.774283  7389272.933915 
+358466.644915  7389276.273343 
+358487.689296  7389274.043724 
+358509.071772  7389268.934600 
+358527.510343  7389261.575860 
+358539.475624  7389258.486389 
+358556.594799  7389251.337614 
+358583.444526  7389249.937854 
+358603.169510  7389257.656531 
+358622.894493  7389264.825303 
+358643.089512  7389277.093202 
+358659.944808  7389285.451770 
+358680.156319  7389295.500049 
+358703.196287  7389298.269575 
+358718.196181  7389298.529530 
+358738.506647  7389297.949630 
+358752.714902  7389295.869986 
+358764.902831  7389301.638998 
+358781.370554  7389318.966030 
+358796.881714  7389340.152401 
+358815.345024  7389362.258614 
+358834.154676  7389380.155548 
+358851.026464  7389397.822522 
+358865.111026  7389407.810811 
+358877.397910  7389414.799614 
+358887.689206  7389426.527605 
+358895.894205  7389443.544690 
+358901.839737  7389472.179786 
+358900.883175  7389508.043642 
+358898.203150  7389542.347766 
+358897.535205  7389569.143177 
+358894.277944  7389589.489691 
+358879.566668  7389612.825694 
+358863.791629  7389629.502837 
+358842.483369  7389648.229630 
+358826.147586  7389659.147760 
+358807.906924  7389677.354641 
+358793.253372  7389694.051781 
+358780.982981  7389717.627742 
+358772.794474  7389741.023735 
+358770.741163  7389763.709849 
+358772.918167  7389792.074990 
+358784.471137  7389821.200002 
+358797.368241  7389848.905256 
+358825.603335  7389884.839101 
+358839.564204  7389907.785170 
+358855.768047  7389931.191161 
+358878.230779  7389962.305831 
+358892.917316  7389983.932127 
+358910.415817  7390021.755648 
+358916.089224  7390057.469531 
+358919.833013  7390102.911747 
+358919.412455  7390136.016076 
+358918.356937  7390182.188168 
+358920.880284  7390226.950500 
+358925.745560  7390262.094482 
+358933.266122  7390287.200180 
+358946.138488  7390316.895093 
+358958.260447  7390340.711014 
+358967.174623  7390358.507966 
+358983.147572  7390384.463520 
+359000.068837  7390408.109469 
+359018.878489  7390426.116385 
+359031.891041  7390441.863687 
+359046.660040  7390455.731312 
+359062.839145  7390481.356923 
+359072.973762  7390510.581917 
+359078.309073  7390528.018930 
+359087.825223  7390558.013792 
+359095.650896  7390582.559588 
+359103.723956  7390602.346198 
+359118.031166  7390621.202968 
+359135.554406  7390635.770473 
+359150.455345  7390646.098704 
+359172.109947  7390654.397282 
+359186.153278  7390657.036830 
+359202.579769  7390659.896340 
+359230.559230  7390658.166637 
+359254.011510  7390655.387113 
+359271.270870  7390649.038200 
+359284.299915  7390641.629469 
+359299.918276  7390631.041283 
+359317.606440  7390617.373624 
+359323.296340  7390608.785095 
+359328.582173  7390589.898330 
+359333.059877  7390580.639916 
+359341.058720  7390566.542331 
+359358.491252  7390557.963801 
+359372.221226  7390551.784859 
+359390.816476  7390550.075152 
+359409.123108  7390546.155823 
+359424.411620  7390538.107202 
+359442.594558  7390525.659334 
+359457.017216  7390511.401776 
+359481.962063  7390486.286078 
+359505.002032  7390467.129360 
+359491.247319  7390517.930658 
+359482.794933  7390558.273747 
+359479.141853  7390587.698707 
+359479.537672  7390620.813035 
+359478.795511  7390655.907024 
+359480.147893  7390674.633816 
+359479.653119  7390693.790535 
+359477.319436  7390713.917087 
+359461.618612  7390733.703698 
+359442.380156  7390749.351018 
+359419.224741  7390769.287603 
+359382.586738  7390800.712220 
+359350.978936  7390828.757416 
+359325.522822  7390854.542999 
+359297.493884  7390882.398228 
+359269.951473  7390913.142962 
+359250.284213  7390941.748062 
+359233.676305  7390969.823253 
+359222.675833  7390999.508168 
+359214.454341  7391026.333573 
+359213.299869  7391048.449785 
+359219.707190  7391074.665294 
+359231.392099  7391111.878920 
+359232.967129  7391128.396091 
+359238.063300  7391150.922232 
+359230.320089  7391181.087065 
+359217.150859  7391192.145171 
+359192.255488  7391212.051761 
+359170.444208  7391229.898704 
+359145.532345  7391252.244876 
+359127.431869  7391276.550713 
+359114.658458  7391299.346808 
+359104.647534  7391321.403030 
+359099.064836  7391339.729891 
+359093.952173  7391361.386182 
+359091.098977  7391382.062640 
+359085.516279  7391400.389501 
+359076.461918  7391428.544678 
+359061.692918  7391446.561592 
+359045.513814  7391462.688829 
+359027.009272  7391476.576451 
+359001.924239  7391495.483212 
+Region 1
+139
+331270.823628  7395558.717217 
+331370.034029  7395558.257296 
+331500.002871  7395553.918039 
+331590.546483  7395552.708246 
+331713.918340  7395552.948205 
+331806.003997  7395552.498282 
+331841.883347  7395554.207989 
+331836.449081  7395438.667780 
+331825.168237  7395322.887612 
+331823.362313  7395226.394141 
+331821.102846  7395148.427496 
+331827.798785  7395101.795483 
+331833.068126  7395065.111767 
+331835.855352  7395053.303789 
+331841.132940  7395038.176381 
+331842.831663  7394977.996689 
+331833.059880  7394948.131805 
+331819.131997  7394908.448602 
+331882.858867  7394780.830462 
+331947.773195  7394622.227629 
+331988.954871  7394549.330116 
+331968.462987  7394541.271496 
+331937.061341  7394526.514024 
+331922.267603  7394514.856021 
+331908.991172  7394498.378843 
+331900.044012  7394481.391753 
+331892.861545  7394460.065406 
+331885.687324  7394444.848012 
+331838.997166  7394483.041470 
+331682.137367  7394428.010897 
+331567.300359  7394386.358031 
+331478.100882  7394329.657744 
+331400.899671  7394285.885241 
+331372.862486  7394267.158449 
+331244.163565  7394191.021491 
+331112.702156  7394113.314801 
+331065.302822  7394085.219614 
+331030.149141  7394067.272688 
+331017.128343  7394053.065121 
+330989.627163  7394009.142645 
+330931.911795  7393929.406303 
+330870.048573  7393837.811992 
+330806.181516  7393749.777072 
+330699.302121  7393599.372835 
+330672.040082  7393625.528355 
+330568.887983  7393716.152831 
+330482.170622  7393807.187238 
+330396.962321  7393901.111150 
+330311.589095  7394000.004210 
+330299.277472  7393989.116075 
+330242.337250  7393938.754702 
+330202.763589  7393915.788636 
+330174.610957  7393904.330598 
+330108.591635  7393887.363505 
+330047.627252  7393895.972030 
+330016.943027  7393904.840511 
+329987.553461  7393916.498514 
+329950.049604  7393932.015856 
+329891.443643  7393959.711112 
+329852.232816  7393979.317754 
+329809.632789  7394000.004210 
+329804.668558  7394009.682552 
+329669.281943  7394074.731410 
+329569.453075  7394122.433239 
+329429.481556  7394185.712400 
+329165.090909  7394296.363447 
+328967.098911  7394382.238737 
+328981.076272  7394414.463217 
+329003.423557  7394465.914404 
+329014.976526  7394492.299884 
+329034.742741  7394537.362166 
+329045.718474  7394562.377881 
+329093.060084  7394661.820847 
+329146.602860  7394788.429160 
+329185.780702  7394792.408479 
+329213.009755  7394795.148009 
+329243.042527  7394801.426934 
+329267.987375  7394808.995637 
+329290.656263  7394818.094079 
+329314.347684  7394829.722087 
+329339.581150  7394844.399573 
+329362.019143  7394864.156189 
+329383.954117  7394882.143108 
+329428.071451  7394921.916295 
+329462.243831  7394950.541392 
+329500.481602  7394979.156490 
+329550.668162  7395006.991722 
+329557.050744  7395012.560768 
+329583.339728  7395027.828153 
+329593.490837  7395034.067085 
+329637.632910  7395059.422741 
+329652.088552  7395067.971277 
+329683.943741  7395085.938200 
+329700.749560  7395091.737206 
+329710.166755  7395097.306252 
+329735.136341  7395108.684303 
+329764.171319  7395120.302313 
+329812.040688  7395135.949633 
+329859.901811  7395149.047389 
+329873.376152  7395151.307002 
+329891.451889  7395154.056531 
+329904.687090  7395157.585927 
+329912.083959  7395161.125321 
+329919.983847  7395167.724190 
+329928.403249  7395175.062933 
+329953.917087  7395208.067280 
+329956.498157  7395216.895768 
+329962.138579  7395232.643070 
+329972.413382  7395265.377463 
+329980.618381  7395289.233377 
+329995.989355  7395332.865903 
+330012.358123  7395354.942122 
+330024.933625  7395392.745646 
+330087.489531  7395560.216960 
+330108.319509  7395615.587475 
+330124.152272  7395657.660269 
+330144.908035  7395710.191271 
+330155.232315  7395751.824139 
+330163.181682  7395788.127921 
+330167.477968  7395849.317440 
+330173.703872  7395902.888263 
+330182.543831  7395950.830051 
+330190.336519  7395999.991630 
+330213.722829  7396052.872572 
+330285.110448  7395986.443951 
+330362.567293  7395907.877409 
+330423.861525  7395852.816840 
+330470.469221  7395823.501862 
+330517.810831  7395795.986575 
+330600.330861  7395744.005479 
+330654.788968  7395703.852356 
+330729.062767  7395661.199662 
+330781.112975  7395641.623016 
+330853.061338  7395616.997234 
+330952.156291  7395579.213706 
+331010.110800  7395563.586383 
+331082.100394  7395564.196278 
+331134.488697  7395563.576384 
+331270.823628  7395558.717217 
+Region 1
+549
+335159.308951  7382708.718305 
+335206.831979  7382725.045509 
+335219.242556  7382731.934329 
+335235.965911  7382743.132410 
+335248.120855  7382756.100189 
+335290.127154  7382820.169215 
+335346.053091  7382912.973318 
+335370.841260  7382956.435873 
+335435.871035  7383066.267060 
+335439.153035  7383080.244666 
+335438.872663  7383099.031448 
+335435.532939  7383128.746358 
+335427.352678  7383173.178747 
+335408.996569  7383235.878008 
+335373.603747  7383344.789352 
+335360.607688  7383385.402395 
+335357.012331  7383419.176610 
+335356.748452  7383425.265567 
+335357.243226  7383433.404173 
+335361.028245  7383446.871866 
+335366.841838  7383465.418689 
+335390.599228  7383523.108808 
+335409.549067  7383571.910448 
+335423.922247  7383633.139960 
+335444.875919  7383699.718556 
+335461.285918  7383754.099241 
+335459.207867  7383809.319782 
+335458.399737  7383821.907626 
+335449.452577  7383855.151932 
+335442.583466  7383885.426746 
+335427.847452  7383934.318371 
+335421.200990  7383953.625064 
+335417.086121  7383974.511486 
+335417.292277  7383992.788356 
+335418.430257  7384000.007119 
+335424.953025  7384027.982327 
+335433.199256  7384056.767397 
+335441.222838  7384078.123738 
+335454.268375  7384106.728839 
+335472.698701  7384136.953661 
+335481.348997  7384150.691308 
+335495.202664  7384183.705653 
+335509.311965  7384216.729996 
+335521.112321  7384247.474730 
+335536.466802  7384275.149990 
+335542.618490  7384287.587859 
+335545.240792  7384309.204156 
+335546.337540  7384329.260721 
+335552.299565  7384359.035621 
+335551.136847  7384389.060478 
+335545.883998  7384408.157207 
+335409.177986  7384671.312131 
+335416.748026  7384693.818276 
+335473.020304  7384709.575576 
+335616.570687  7384741.780060 
+335624.808671  7384753.278091 
+335633.665123  7384772.534792 
+335636.138992  7384797.820461 
+335637.392419  7384813.227822 
+335642.340158  7384826.905479 
+335650.149338  7384849.471614 
+335657.158634  7384867.748483 
+335658.964559  7384872.607651 
+335665.322402  7384906.241889 
+335667.004634  7384928.738036 
+335668.488955  7384951.464143 
+335672.669794  7384978.309545 
+335674.698367  7384998.046164 
+335680.223341  7385023.581790 
+335685.072125  7385036.599560 
+335687.430547  7385053.796615 
+335691.298029  7385063.694919 
+335691.652617  7385077.982472 
+335692.048436  7385087.620821 
+335695.577823  7385100.838557 
+335700.517315  7385114.966137 
+335715.154374  7385138.392124 
+335726.352755  7385158.778632 
+335730.508856  7385169.906726 
+335736.841961  7385187.473717 
+335742.037086  7385197.052076 
+335746.696207  7385209.289980 
+335757.185412  7385220.268099 
+335761.201326  7385225.847144 
+335766.915964  7385234.775614 
+335777.396923  7385247.073508 
+335783.136300  7385253.232453 
+335792.908083  7385264.410538 
+335802.242816  7385287.226630 
+335809.656177  7385299.714491 
+335814.554438  7385308.852926 
+335837.371759  7385330.429230 
+335850.384311  7385343.916920 
+335864.229732  7385373.421866 
+335877.819520  7385435.491234 
+335882.940429  7385470.095306 
+335883.575389  7385494.801074 
+335884.523706  7385519.846784 
+335884.334042  7385536.233977 
+335884.969002  7385562.049555 
+335882.965168  7385576.647055 
+335875.576545  7385598.043390 
+335864.625551  7385619.079787 
+335865.936702  7385637.856570 
+335866.274797  7385645.125325 
+335860.090124  7385668.531316 
+335849.848306  7385690.347579 
+335839.276638  7385722.412087 
+335834.741211  7385736.359698 
+335824.062342  7385766.224582 
+335820.203106  7385776.512820 
+335812.253740  7385802.668340 
+335795.884972  7385833.823003 
+335786.913073  7385851.559965 
+335781.668471  7385864.127812 
+335777.034089  7385885.784103 
+335776.267190  7385900.001667 
+335776.283682  7385907.260424 
+335768.301331  7385936.735375 
+335762.421768  7385950.962938 
+335755.890754  7385968.829878 
+335747.842433  7385994.985397 
+335739.967282  7386051.495718 
+335730.682027  7386078.631070 
+335725.330223  7386096.388028 
+335723.582022  7386101.697119 
+335721.314309  7386131.022096 
+335720.671103  7386142.650104 
+335720.275284  7386168.885610 
+335713.290726  7386181.883383 
+335705.720686  7386192.651539 
+335699.437059  7386224.586069 
+335696.773526  7386234.634348 
+335685.393728  7386248.461979 
+335667.994181  7386262.329604 
+335659.714966  7386272.867799 
+335655.624835  7386291.764562 
+335658.271875  7386300.873002 
+335667.169558  7386317.360178 
+335666.880940  7386333.867350 
+335657.224604  7386359.882894 
+335609.206803  7386351.254372 
+335604.118879  7386408.534560 
+335575.966247  7386627.277092 
+335555.482610  7386625.667367 
+335545.661350  7386649.693252 
+335586.818287  7386810.195759 
+335612.175446  7386842.040305 
+335658.750157  7386901.710084 
+335706.627772  7386981.436427 
+335725.008620  7387016.980339 
+335743.834764  7387057.723360 
+335771.937919  7387135.460044 
+335775.005516  7387143.828611 
+335785.544199  7387169.384234 
+335819.576393  7387280.885134 
+335852.569562  7387388.436712 
+335905.188760  7387546.629615 
+335980.353152  7387768.871547 
+335990.487769  7387793.347354 
+335946.642561  7387855.336736 
+335928.954396  7387876.073184 
+335912.321749  7387912.326974 
+335908.899563  7387952.930019 
+335910.433362  7387999.682011 
+335908.668669  7388029.606885 
+335909.460307  7388044.114400 
+335906.087599  7388055.782402 
+335897.651705  7388066.900497 
+335892.266916  7388074.989112 
+335882.989907  7388084.797432 
+335789.889963  7388108.613352 
+335744.403754  7388125.840401 
+335647.782670  7388131.539425 
+335630.539802  7388132.189314 
+335610.270567  7388130.019685 
+335570.787614  7388119.851427 
+335549.256706  7388117.671800 
+335537.852169  7388118.111725 
+335522.621381  7388120.801264 
+335506.623694  7388125.770413 
+335489.331348  7388133.029170 
+335473.548063  7388142.827492 
+335440.942467  7388167.263306 
+335414.711207  7388185.630160 
+335385.156716  7388207.276452 
+335375.483888  7388215.085114 
+335365.489456  7388230.522470 
+335363.625808  7388233.891893 
+335356.253678  7388247.229608 
+335348.832070  7388267.336164 
+335344.832648  7388287.552701 
+335334.739262  7388357.100788 
+335328.942162  7388391.364919 
+335318.073630  7388462.682703 
+335314.841108  7388491.107834 
+335307.477224  7388530.951009 
+335296.377797  7388600.239141 
+335295.833546  7388606.838011 
+335276.817738  7388721.038449 
+335254.948734  7388848.176672 
+335241.548610  7388918.724587 
+335235.578339  7388940.790808 
+335227.802143  7388966.386423 
+335210.006777  7389011.748653 
+335208.472978  7389015.048088 
+335186.562744  7389070.288626 
+335151.293615  7389151.614695 
+335139.682922  7389182.779357 
+335124.501612  7389217.233456 
+335117.178959  7389249.697895 
+335117.393361  7389256.816675 
+335119.619843  7389264.445369 
+335123.619265  7389273.123882 
+335140.449822  7389296.099946 
+335152.200700  7389321.835538 
+335157.808137  7389354.389962 
+335156.958776  7389368.107612 
+335155.078635  7389383.854915 
+335150.361791  7389408.210743 
+335144.119394  7389431.786704 
+335133.259109  7389465.001015 
+335120.906255  7389492.356329 
+335109.848060  7389515.402382 
+335102.187312  7389524.750781 
+335092.530976  7389528.500138 
+335081.093454  7389533.509280 
+335054.153018  7389543.737528 
+335045.486230  7389550.286407 
+335038.600627  7389557.095240 
+335032.960205  7389566.473634 
+335030.098763  7389577.881680 
+335022.759618  7389614.665379 
+335012.278659  7389627.303214 
+335007.429875  7389631.592480 
+334998.029172  7389635.091880 
+334988.653208  7389636.041717 
+334978.007324  7389634.441991 
+334957.243316  7389631.262536 
+334929.610197  7389631.832438 
+334912.870348  7389632.992240 
+334892.263018  7389645.050174 
+334861.949874  7389665.936597 
+334832.626278  7389691.402235 
+334773.509050  7389737.764293 
+334746.733540  7389763.489887 
+334738.297646  7389773.338200 
+334730.612159  7389786.245989 
+334725.466511  7389796.124297 
+334722.613315  7389807.792298 
+334722.761747  7389823.289644 
+334723.891481  7389844.126074 
+334729.251531  7389876.430541 
+334733.902405  7389902.376097 
+334733.547817  7389917.113572 
+334731.172902  7389931.581094 
+334724.996476  7389944.998796 
+334712.297280  7389948.478200 
+334703.416090  7389949.178080 
+334665.928725  7389945.118775 
+334640.332426  7389940.829510 
+334627.385843  7389842.956275 
+334623.526607  7389823.189661 
+334619.535432  7389797.564050 
+334610.423347  7389763.679854 
+334594.582338  7389711.338820 
+334586.096967  7389686.103142 
+334582.872690  7389672.885406 
+334578.139354  7389658.437881 
+334572.185575  7389643.190493 
+334562.331330  7389621.594192 
+334519.632348  7389534.169167 
+334476.933365  7389447.074086 
+334459.542065  7389411.040258 
+334434.844604  7389360.768869 
+334398.330295  7389286.481594 
+334355.656051  7389198.566653 
+334336.434088  7389160.143235 
+334321.162068  7389125.239213 
+334306.846612  7389091.514990 
+334241.948777  7388936.761498 
+334209.730754  7388862.374240 
+334183.895313  7388800.274877 
+334172.614469  7388778.218655 
+334140.272753  7388705.641087 
+334131.960552  7388682.285087 
+334124.415251  7388663.598288 
+334120.349860  7388653.030098 
+334115.600031  7388636.822875 
+334112.186091  7388626.134705 
+334106.001418  7388605.018322 
+334100.468198  7388588.451160 
+334095.833816  7388574.553541 
+334089.673882  7388559.426132 
+334082.631601  7388541.519199 
+334075.003837  7388525.261984 
+334066.683391  7388508.434866 
+334060.647150  7388493.507423 
+334042.761075  7388448.475137 
+334019.531444  7388391.394914 
+334013.082891  7388374.927735 
+334006.626093  7388359.460384 
+334003.121445  7388349.782042 
+333988.970913  7388313.158315 
+333985.045707  7388301.070386 
+333982.456391  7388294.831455 
+333974.069974  7388278.574239 
+333947.682036  7388212.255599 
+333936.392946  7388179.841151 
+333934.430343  7388174.342093 
+333925.375982  7388154.085563 
+333919.826269  7388139.728022 
+333915.002224  7388124.170687 
+333909.056692  7388108.263412 
+333904.991300  7388098.255126 
+333900.554828  7388084.027563 
+333896.085371  7388064.590893 
+333891.896286  7388046.823936 
+333888.672010  7388025.297623 
+333887.517537  7388010.000244 
+333886.973286  7387995.712691 
+333888.020557  7387975.346180 
+333889.142045  7387957.189290 
+333892.778632  7387933.313379 
+333899.721959  7387906.148033 
+333907.019873  7387883.741871 
+333913.575626  7387863.995253 
+333919.026385  7387842.458942 
+333925.425460  7387817.833160 
+333929.614545  7387799.386320 
+333936.805258  7387777.540062 
+333956.505503  7387719.919932 
+333973.946281  7387670.868334 
+333981.508074  7387652.231526 
+333987.791702  7387629.045498 
+333995.633867  7387603.549865 
+334000.870224  7387582.683439 
+334003.542003  7387562.996811 
+334008.621681  7387538.241052 
+334011.821218  7387517.014688 
+334011.227489  7387497.408046 
+334010.773947  7387456.974972 
+334011.441891  7387433.948916 
+334011.524354  7387417.781685 
+334001.018656  7387359.001754 
+333997.431546  7387328.796928 
+333995.139093  7387296.872396 
+333987.486591  7387270.316945 
+333982.563592  7387245.001281 
+333974.935828  7387215.896266 
+333967.085417  7387180.522326 
+333961.923276  7387157.716232 
+333958.410382  7387116.813238 
+333953.602830  7387082.089186 
+333949.471468  7387059.113122 
+333944.556715  7387034.247381 
+333941.934413  7387013.071009 
+333939.543006  7386990.554865 
+333938.306072  7386955.650844 
+333937.448464  7386932.164867 
+333935.469369  7386854.838112 
+333934.191203  7386797.008018 
+333935.510600  7386753.055547 
+333932.624419  7386728.549744 
+333931.849273  7386697.745021 
+333930.364952  7386666.830316 
+333926.687133  7386643.394331 
+333919.158324  7386602.571323 
+333905.749953  7386552.249943 
+333879.032166  7386461.355512 
+333864.823911  7386418.552844 
+333856.734358  7386385.448515 
+333847.836675  7386350.684469 
+333844.917510  7386338.856495 
+333839.442013  7386317.810100 
+333837.784520  7386301.612875 
+333831.476154  7386282.946072 
+333844.538183  7386279.336691 
+333833.603681  7386231.474889 
+333813.087059  7386172.664963 
+333784.249991  7386092.808641 
+333748.246948  7385963.870727 
+333751.726857  7385884.884257 
+333752.889576  7385791.950176 
+333734.929285  7385645.395279 
+333734.376788  7385523.246202 
+333744.651591  7385434.501403 
+333741.798396  7385371.712158 
+333734.665406  7385106.297622 
+333730.385612  7385050.647154 
+333763.617922  7385030.410620 
+333826.149089  7385014.233391 
+333980.939084  7384979.709305 
+334051.798944  7384965.491740 
+334042.769322  7384935.816823 
+334037.277332  7384918.939714 
+334032.642950  7384898.003301 
+334029.558860  7384875.067229 
+334021.329122  7384770.225188 
+334018.228539  7384723.923119 
+334018.937715  7384677.451079 
+334020.603454  7384634.298471 
+334022.632026  7384609.702684 
+334023.341202  7384587.856426 
+334024.347242  7384575.688510 
+334026.573725  7384566.590069 
+334052.640060  7384508.979937 
+334080.570043  7384447.590452 
+334087.183520  7384422.334778 
+334089.789329  7384406.637467 
+334091.554022  7384370.853596 
+334094.530911  7384337.379330 
+334096.023479  7384326.741153 
+334100.121856  7384312.613572 
+334119.063448  7384268.301163 
+334156.872415  7384171.047821 
+334159.082405  7384159.969719 
+334162.793209  7384142.732672 
+334163.090073  7384128.245153 
+334166.668937  7384114.607489 
+334174.074052  7384100.549897 
+334187.457685  7384079.243547 
+334207.091960  7384050.698436 
+334229.562938  7384019.943704 
+334271.049725  7383966.832802 
+334311.984014  7383892.985451 
+334346.313072  7383835.115364 
+334444.336016  7383748.180255 
+334289.991316  7383703.437919 
+334164.698088  7383499.832794 
+333835.805425  7383567.701169 
+333720.951924  7383270.122142 
+333543.451810  7383270.122142 
+333538.231946  7383056.078806 
+333359.684560  7383039.821590 
+333376.440901  7382903.784892 
+333406.490165  7382644.369328 
+333415.470310  7382573.531462 
+333417.911194  7382495.554818 
+333450.162202  7382459.840936 
+333442.583917  7382494.724960 
+333505.181053  7382494.724960 
+333536.500237  7382349.849776 
+333567.530803  7382312.716137 
+333642.373593  7382217.122511 
+333673.742254  7382172.180209 
+333670.732380  7382150.333951 
+333699.206614  7382091.204080 
+333727.936482  7382041.472598 
+333657.414717  7381971.174640 
+333718.593503  7381890.078531 
+333679.893942  7381850.975229 
+333504.744003  7381735.794958 
+333306.958161  7381434.986484 
+333365.160057  7381438.185936 
+333397.947070  7381439.945634 
+333429.422932  7381447.294376 
+333458.457911  7381439.355736 
+333489.406014  7381413.370187 
+333496.118446  7381398.412749 
+333502.072224  7381383.185357 
+333522.036349  7381326.845008 
+333546.387468  7381261.136263 
+333611.928509  7381120.920281 
+333627.596347  7381097.624271 
+333641.689155  7381083.216739 
+333663.211817  7381059.210851 
+333674.748294  7381044.793321 
+333682.705907  7381033.385275 
+333693.574439  7381067.169488 
+333709.044367  7381088.055910 
+333722.799080  7381107.372601 
+333742.565295  7381127.099222 
+333767.015369  7381148.085627 
+333790.055337  7381167.062377 
+333823.625742  7381184.279428 
+333866.959684  7381212.914523 
+333894.065044  7381224.292574 
+333910.128702  7381237.660284 
+333923.462857  7381249.438267 
+333935.955896  7381262.985946 
+333951.739182  7381283.322463 
+333956.686920  7381296.560195 
+333961.725367  7381319.766220 
+333964.166251  7381347.371492 
+333969.542794  7381359.279452 
+333975.158477  7381376.286539 
+333986.793908  7381402.452057 
+334000.045601  7381421.208844 
+334015.020756  7381440.875475 
+334034.399398  7381459.592269 
+334052.137040  7381477.959123 
+334067.235888  7381496.066022 
+334082.878988  7381520.171892 
+334094.027891  7381544.107792 
+334098.357162  7381585.250745 
+334104.195494  7381690.202768 
+334110.108041  7381726.596534 
+334112.598403  7381758.191122 
+334114.123955  7381785.896376 
+334110.619307  7381887.528968 
+334110.025579  7381948.098592 
+334112.087137  7382053.780490 
+334116.399915  7382118.779356 
+334118.411995  7382161.512037 
+334118.049161  7382202.155075 
+334125.413045  7382227.710697 
+334133.593306  7382252.726413 
+334137.427803  7382275.472516 
+334137.427803  7382325.453955 
+334263.257037  7382324.084190 
+334388.863622  7382313.336031 
+334444.336016  7382306.207252 
+334490.663339  7382296.438925 
+334572.012405  7382274.772636 
+334575.368620  7382284.990886 
+334582.617057  7382311.326375 
+334588.125539  7382338.191773 
+334599.076534  7382370.656212 
+334609.433799  7382393.482302 
+334620.747628  7382420.847615 
+334641.676561  7382446.453229 
+334660.972741  7382463.620288 
+334680.763694  7382481.007310 
+334706.071376  7382489.715818 
+334729.820521  7382500.284008 
+334773.113231  7382506.202994 
+334798.462144  7382511.032167 
+334842.249629  7382517.731020 
+334873.708999  7382523.400049 
+334902.265696  7382533.578305 
+334941.740402  7382543.226652 
+334970.585717  7382545.436274 
+334994.285384  7382560.323724 
+335008.369946  7382569.342179 
+335016.583191  7382582.389944 
+335026.445683  7382603.436339 
+335031.550100  7382621.433256 
+335039.021185  7382646.219011 
+335047.217938  7382679.203361 
+335056.635134  7382730.254616 
+335061.154068  7382754.560453 
+335071.115515  7382766.638384 
+335084.903212  7382765.248622 
+335094.345146  7382760.369458 
+335114.977215  7382758.049855 
+335123.627511  7382733.454068 
+335133.630189  7382723.705738 
+335159.308951  7382708.718305 
+Region 1
+318
+329451.070188  7403010.790744 
+329454.187263  7402979.256146 
+329445.941033  7402943.452279 
+329421.218833  7402899.869744 
+329376.722172  7402867.175344 
+329335.524004  7402848.498543 
+329299.248836  7402832.931210 
+329264.639406  7402812.694676 
+329230.029975  7402780.000276 
+329223.853549  7402773.411405 
+329206.948776  7402745.756142 
+329192.113807  7402686.606274 
+329180.577330  7402650.802407 
+329160.802869  7402600.990939 
+329083.337779  7402507.586938 
+329084.987025  7402448.437070 
+329086.603286  7402389.157224 
+329078.794105  7402335.956337 
+329044.176429  7402293.933535 
+328991.441784  7402247.231535 
+328876.068771  7402181.852734 
+328774.293793  7402116.863866 
+328710.319535  7402074.781074 
+328675.413241  7402053.494720 
+328629.440505  7402030.508657 
+328577.513991  7401998.164198 
+328548.107932  7401973.788373 
+328521.513838  7401947.792826 
+328474.328907  7401889.732771 
+328413.249076  7401818.374994 
+328373.823847  7401768.183591 
+328263.901593  7401657.802499 
+328195.499110  7401557.499680 
+328172.393171  7401536.823221 
+328116.838316  7401463.745739 
+328065.893103  7401410.154918 
+328018.642201  7401351.424978 
+327958.708597  7401268.679152 
+327942.290351  7401226.466383 
+327926.449342  7401186.993144 
+327917.518675  7401143.050671 
+327913.073956  7401127.793284 
+327904.201012  7401085.320560 
+327901.116922  7401059.754939 
+327898.107048  7401043.577710 
+327901.042706  7401007.563879 
+327904.407168  7400986.917415 
+327908.101479  7400963.101495 
+327916.289986  7400940.275405 
+327931.529020  7400859.829184 
+327956.251220  7400744.768893 
+327975.201058  7400663.912743 
+327983.892585  7400597.324149 
+327993.862278  7400518.667622 
+327992.633590  7400467.596370 
+327988.617675  7400446.999898 
+327983.678183  7400425.183635 
+327974.228003  7400391.519401 
+327951.526130  7400352.696052 
+327918.706132  7400303.074551 
+327857.337683  7400201.801898 
+327828.179012  7400148.161087 
+327801.354023  7400085.171876 
+327774.529035  7400016.363662 
+327739.078490  7399947.095527 
+327707.833522  7399873.848074 
+327705.541070  7399867.899093 
+327677.677056  7399805.989697 
+327630.285969  7399704.737041 
+327582.886635  7399576.558997 
+327557.026456  7399446.221322 
+327535.421331  7399299.876390 
+327502.287977  7399141.383538 
+327116.537553  7399213.321216 
+326901.277948  7399224.829245 
+326675.413691  7399212.761312 
+326431.391234  7399199.933509 
+325865.040113  7399134.584703 
+325848.283772  7399287.228557 
+325848.663099  7399360.046084 
+325841.117798  7399467.767632 
+325818.366447  7399623.241001 
+325807.506162  7399784.473383 
+325796.983971  7399896.474198 
+325791.747615  7399940.596640 
+325777.316711  7400062.595743 
+325753.847939  7400268.760429 
+325734.518774  7400359.634863 
+325730.222488  7400377.501803 
+325722.710172  7400408.436504 
+325712.410630  7400435.801816 
+325700.008299  7400460.837528 
+325687.292611  7400489.502618 
+325672.210255  7400513.638484 
+325653.746945  7400559.130691 
+325600.402079  7400624.149554 
+325531.298666  7400737.030219 
+325504.382969  7400777.403303 
+325490.001543  7400798.359713 
+325469.559137  7400839.192719 
+325459.812093  7400866.548033 
+325452.266792  7400885.674757 
+325445.513129  7400911.960255 
+325440.260280  7400930.137141 
+325437.101973  7400963.271466 
+325429.960738  7401012.543026 
+325404.686041  7401165.676795 
+325396.901599  7401218.937672 
+325378.025977  7401290.855353 
+325334.692035  7401351.804913 
+325319.939528  7401454.757278 
+325295.332776  7401559.709301 
+325317.770770  7401615.439755 
+325334.428156  7401639.375655 
+325358.853491  7401669.910425 
+325400.628895  7401715.752572 
+325422.060849  7401743.917748 
+325461.618017  7401805.247243 
+325492.153809  7401853.069051 
+325522.755571  7401904.430254 
+325547.931313  7401941.353929 
+325562.485910  7401978.527561 
+325571.276392  7402011.051990 
+325574.797533  7402035.667774 
+325572.166985  7402067.322352 
+325568.654091  7402092.817984 
+325559.863609  7402146.438800 
+325576.562226  7402223.805547 
+325615.253540  7402327.537779 
+325643.373187  7402360.072206 
+325670.626979  7402426.880763 
+325689.222229  7402507.526949 
+325661.531387  7402516.755368 
+325607.172234  7402544.450624 
+325584.602301  7402560.857813 
+325568.192302  7402578.294827 
+325554.858147  7402587.533244 
+325532.469631  7402616.238327 
+325498.981688  7402642.113895 
+325476.518956  7402659.600900 
+325452.918244  7402678.627641 
+325435.419742  7402683.926733 
+325340.621075  7402744.286394 
+325327.690985  7402759.463794 
+325303.496544  7402856.757129 
+325308.213388  7402891.541170 
+325303.240911  7402919.366404 
+325303.983072  7402945.681897 
+325312.328257  7402968.198040 
+325322.586568  7402987.674704 
+325332.836633  7403010.960715 
+325343.103190  7403031.187250 
+325327.872402  7403108.054084 
+325278.329048  7403244.890645 
+325279.079455  7403282.244247 
+325281.487355  7403335.245168 
+325292.413610  7403389.865812 
+325309.005026  7403476.091042 
+325292.487827  7403542.149727 
+325216.993585  7403598.770029 
+325016.461748  7403899.578503 
+324981.077172  7403970.356379 
+324973.696796  7404063.260465 
+324986.239313  7404087.686282 
+324952.124657  7404184.599681 
+324934.766341  7404234.041212 
+324930.197929  7404250.428405 
+324926.759251  7404265.295859 
+324922.949493  7404278.263637 
+324965.161947  7404294.360880 
+324996.951166  7404312.427785 
+325036.656767  7404316.237133 
+325061.378966  7404327.725165 
+325099.088979  7404353.840692 
+325135.916645  7404382.235828 
+325160.333734  7404397.323244 
+325197.598450  7404415.070204 
+325223.367921  7404405.861781 
+325248.403477  7404390.224460 
+325269.703491  7404354.720541 
+325290.112912  7404344.962213 
+325317.177041  7404353.840692 
+325351.786471  7404357.830008 
+325371.082651  7404360.049628 
+325391.063268  7404354.720541 
+325497.678784  7404348.431618 
+325543.692751  7404341.852745 
+325568.538644  7404344.962213 
+325614.799998  7404361.549371 
+325643.076322  7404363.599020 
+325777.217756  7404381.405970 
+325882.621077  7404389.244627 
+325923.060592  7404374.857092 
+325962.947609  7404341.522802 
+325983.794080  7404366.528518 
+325993.903959  7404364.148926 
+326013.546481  7404352.830865 
+326056.410387  7404326.045453 
+326108.262686  7404297.770296 
+326158.119396  7404269.645114 
+326202.640795  7404244.569409 
+326249.446401  7404221.783312 
+326259.778928  7404141.317095 
+326495.480938  7403846.597578 
+326524.153082  7403809.313964 
+326560.032432  7403765.221517 
+326608.223404  7403691.404161 
+326633.860935  7403661.669254 
+326663.596842  7403623.725754 
+326655.070240  7403576.513841 
+326626.678468  7403523.252964 
+326660.496260  7403486.349285 
+326717.189095  7403430.558842 
+326736.369828  7403293.582304 
+326732.271451  7403262.817574 
+326743.593526  7403111.643469 
+326763.920484  7402997.782972 
+326765.083203  7402981.755717 
+326762.419670  7402968.408004 
+326819.821682  7402834.111008 
+326927.063912  7402571.326020 
+326978.792516  7402586.603403 
+327006.549329  7402593.992138 
+327032.797081  7402587.183304 
+327051.746919  7402583.373957 
+327064.058541  7402573.695614 
+327064.932642  7402554.358927 
+327196.806362  7402561.387723 
+327325.158942  7402571.935916 
+327323.039661  7402595.761835 
+327378.198698  7402591.292600 
+327582.127982  7402568.406520 
+327570.129716  7402507.167010 
+327650.258339  7402500.298187 
+327739.639233  7402491.329723 
+327748.380238  7402488.600191 
+327763.949121  7402483.900995 
+327773.778628  7402476.202314 
+327788.456919  7402462.054738 
+327764.716021  7402423.371364 
+327821.862399  7402406.664225 
+327851.746739  7402411.943321 
+327833.291675  7402383.808140 
+327787.582818  7402253.700427 
+327870.218296  7402230.844342 
+327923.843533  7402213.257354 
+327942.306844  7402219.416299 
+327958.090129  7402207.998255 
+327984.552283  7402199.229757 
+328007.353111  7402197.390072 
+328032.652547  7402200.789490 
+328094.812633  7402214.357166 
+328163.784107  7402243.342201 
+328182.296894  7402228.564732 
+328183.377151  7402216.366822 
+328181.653688  7402197.370076 
+328201.007592  7402206.728473 
+328213.343953  7402224.055505 
+328223.808419  7402237.933128 
+328232.293791  7402257.869713 
+328238.057906  7402282.325524 
+328236.029333  7402320.778937 
+328228.401570  7402351.143736 
+328210.152662  7402387.717471 
+328210.762883  7402396.156025 
+328199.919089  7402417.172425 
+328192.052185  7402434.799406 
+328185.760311  7402448.567048 
+328181.332085  7402460.035083 
+328178.000608  7402474.172662 
+328175.493754  7402487.880314 
+328174.809317  7402502.707774 
+328183.088533  7402528.173412 
+328193.503522  7402542.600941 
+328210.787621  7402556.938485 
+328301.496158  7402640.044250 
+328319.522419  7402651.332316 
+328333.672950  7402656.931357 
+328348.598628  7402664.820006 
+328354.882256  7402667.359571 
+328361.982260  7402669.659177 
+328382.193772  7402671.788812 
+328409.736182  7402675.238221 
+328485.552026  7402682.776930 
+328513.737643  7402683.316837 
+328552.330002  7402676.837947 
+328613.376848  7402664.620040 
+328660.883382  7402651.672258 
+328689.778175  7402646.493145 
+328700.828124  7402646.403160 
+328723.431042  7402648.982718 
+328748.631523  7402648.982718 
+328811.805896  7402658.481091 
+328841.640758  7402670.049110 
+328854.727526  7402672.848630 
+328892.190152  7402697.084479 
+328910.620478  7402711.801958 
+328929.001326  7402719.270679 
+328951.546520  7402745.796135 
+328968.789389  7402756.414316 
+328999.457120  7402798.337135 
+329033.777932  7402837.310460 
+329065.608383  7402877.103643 
+329106.724089  7402922.195920 
+329134.678811  7402953.100626 
+329153.488463  7402968.188041 
+329160.423543  7402975.756745 
+329184.947833  7402990.424233 
+329194.150626  7402996.063267 
+329200.261083  7402997.922948 
+329218.188388  7403000.442517 
+329231.390604  7403008.411152 
+329258.916521  7402986.344931 
+329295.702956  7402978.486277 
+329312.640714  7402975.006873 
+329374.627630  7402976.576605 
+329426.356235  7402999.122743 
+329451.070188  7403010.790744 
+Region 1
+526
+354751.882933  7396032.606044 
+354559.861206  7395710.631195 
+354581.408607  7395691.084543 
+354551.953071  7395633.974326 
+354544.490232  7395619.976724 
+354526.529942  7395587.632264 
+354522.563505  7395555.887701 
+354523.363389  7395517.804225 
+354532.970248  7395469.552490 
+354513.838993  7395420.990808 
+354488.712728  7395367.290007 
+354466.373689  7395330.736268 
+354453.451846  7395304.170818 
+354442.418389  7395257.528808 
+354434.493762  7395215.226054 
+354430.510832  7395194.039683 
+354431.516873  7395169.923814 
+354430.510832  7395158.335798 
+354437.017108  7395132.460231 
+354442.352420  7395084.338474 
+354442.418389  7395072.630479 
+354458.275891  7395015.500265 
+354465.433619  7394985.345430 
+354474.158131  7394967.888420 
+354494.699492  7394904.699244 
+354509.856064  7394841.720032 
+354536.318218  7394744.396702 
+354581.276667  7394600.481354 
+354616.207700  7394514.786033 
+354636.147086  7394477.262460 
+354629.921182  7394474.212983 
+354623.753001  7394471.743406 
+354619.563916  7394470.013702 
+354611.177500  7394466.074377 
+354602.799329  7394462.375010 
+354595.155074  7394461.145221 
+354587.510818  7394460.405348 
+354581.095250  7394458.925601 
+354562.112427  7394426.001241 
+354549.429725  7394408.144299 
+354543.245052  7394396.946218 
+354534.842143  7394381.178918 
+354526.150615  7394367.921189 
+354511.546541  7394360.402477 
+354499.144210  7394358.212852 
+354488.077769  7394351.494003 
+354486.948035  7394341.885649 
+354487.582995  7394332.547249 
+354492.011221  7394324.778579 
+354499.770924  7394314.270379 
+354510.837365  7394302.802344 
+354521.169892  7394289.804570 
+354527.247364  7394272.467540 
+354530.809736  7394254.070691 
+354529.886158  7394247.751773 
+354526.356771  7394227.995157 
+354521.532726  7394210.758110 
+354516.700435  7394193.521062 
+354515.917043  7394177.343834 
+354519.429937  7394161.976466 
+354524.847711  7394155.487577 
+354529.787203  7394146.969036 
+354528.921349  7394136.350855 
+354526.587666  7394122.423241 
+354518.918671  7394108.675596 
+354513.467913  7394099.007252 
+354504.149672  7394076.401124 
+354493.619236  7394049.735692 
+354485.983226  7394033.718435 
+354478.652327  7394014.171783 
+354479.815045  7394003.333640 
+354481.794141  7393988.956103 
+354477.901920  7393977.288101 
+354474.248840  7393966.879884 
+354469.078453  7393955.701799 
+354459.331409  7393945.213595 
+354454.466132  7393930.746073 
+354449.073098  7393917.538336 
+354444.479947  7393901.061158 
+354442.476113  7393881.584494 
+354437.602591  7393867.626885 
+354432.151832  7393858.208499 
+354418.652753  7393844.390865 
+354404.576437  7393834.852499 
+354399.117432  7393826.443939 
+354389.609528  7393816.715606 
+354384.752499  7393801.748170 
+354381.668408  7393786.800730 
+354384.265971  7393764.614530 
+354385.898725  7393738.618983 
+354387.399539  7393722.471749 
+354391.390714  7393709.393989 
+354391.885488  7393691.966974 
+354389.815684  7393676.789574 
+354529.811942  7393517.606840 
+354668.934099  7393361.813526 
+354818.058934  7393317.371139 
+354851.695309  7393306.463008 
+354866.489047  7393300.853968 
+354888.572452  7393299.884134 
+354902.294180  7393298.304405 
+354929.457264  7393297.154602 
+354949.264710  7393295.914814 
+354976.254623  7393288.696051 
+355001.182978  7393283.736900 
+355022.268590  7393281.747241 
+355053.744452  7393280.407471 
+355090.522641  7393280.907385 
+355112.045303  7393283.976859 
+355141.641025  7393289.935838 
+355165.992144  7393307.942754 
+355184.034896  7393323.340117 
+355199.892398  7393332.648522 
+355213.358493  7393348.995722 
+355228.844914  7393365.882829 
+355240.290682  7393381.950077 
+355247.357702  7393401.996643 
+355249.048179  7393415.574318 
+355250.986043  7393432.611399 
+355256.436802  7393459.456801 
+355253.921701  7393474.234270 
+355265.796273  7393470.724871 
+355278.990242  7393465.445775 
+355287.343674  7393461.046529 
+355295.260055  7393451.808111 
+355309.938346  7393439.580206 
+355316.906411  7393436.550725 
+355323.956938  7393435.620884 
+355330.578661  7393436.900665 
+355337.802359  7393440.080120 
+355345.388892  7393446.579007 
+355352.794007  7393451.408180 
+355360.916544  7393455.807426 
+355368.569046  7393456.547299 
+355382.455698  7393455.797428 
+355395.641421  7393454.717613 
+355408.604496  7393454.177705 
+355419.819369  7393455.947402 
+355435.924258  7393458.656938 
+355448.120433  7393460.056698 
+355458.147849  7393461.316483 
+355478.763426  7393461.736411 
+355497.474123  7393459.046871 
+355520.390398  7393453.837764 
+355533.848247  7393445.779144 
+355546.885537  7393437.820507 
+355558.496230  7393430.081833 
+355570.271848  7393426.652420 
+355581.297058  7393426.532441 
+355590.170002  7393427.732235 
+355596.049565  7393431.441600 
+355603.759790  7393436.500733 
+355611.041212  7393443.999449 
+355621.266538  7393452.178048 
+355627.789306  7393452.907923 
+355635.260391  7393451.318195 
+355647.769923  7393446.019103 
+355657.418013  7393440.360072 
+355670.694444  7393429.961853 
+355691.474946  7393413.004758 
+355702.780528  7393405.476047 
+355719.693547  7393398.997157 
+355738.932003  7393394.207978 
+355751.581721  7393394.547919 
+355768.585448  7393399.477075 
+355776.889403  7393405.985960 
+355782.117513  7393414.344528 
+355784.162578  7393424.222836 
+355785.531452  7393430.431773 
+355792.928321  7393435.930831 
+355807.474672  7393441.169933 
+355822.301395  7393448.958599 
+355836.460173  7393452.198044 
+355844.599202  7393454.827594 
+355852.086780  7393461.986368 
+355861.289573  7393470.494910 
+355872.677618  7393474.704189 
+355885.005733  7393477.153770 
+355895.709340  7393479.253410 
+355918.543153  7393492.761096 
+355945.780452  7393504.769039 
+355972.877566  7393520.766299 
+355994.408475  7393532.714253 
+356091.796459  7393545.162121 
+356153.709158  7393544.252276 
+356220.206762  7393530.774585 
+356562.227424  7393415.704295 
+356626.193436  7393350.595448 
+356673.353629  7393314.431643 
+356710.626591  7393275.248354 
+356756.756005  7393224.587032 
+356860.303924  7393114.835832 
+356898.698374  7393073.692879 
+356949.016873  7393013.473194 
+356986.990765  7392986.037893 
+357071.885710  7392930.567395 
+357159.782282  7392875.006912 
+357234.921936  7392824.855503 
+357302.705952  7392777.373636 
+357480.420468  7392694.647806 
+357550.736077  7392660.253697 
+357552.459539  7392625.719613 
+357577.025060  7392628.839078 
+357594.243190  7392632.658424 
+357605.326124  7392637.087665 
+357621.876309  7392635.807885 
+357632.002680  7392633.468285 
+357646.235674  7392628.629114 
+357661.557171  7392627.779260 
+357668.888070  7392629.618945 
+357678.643361  7392634.368131 
+357687.005038  7392635.227984 
+357699.151736  7392635.457945 
+357708.585424  7392630.778746 
+357723.296700  7392619.080750 
+357729.192754  7392611.052125 
+357740.597291  7392592.775256 
+357749.734115  7392576.807991 
+357756.479532  7392565.799876 
+357765.410199  7392549.942593 
+357774.901611  7392539.514379 
+357785.374324  7392533.855348 
+357801.949247  7392529.256136 
+357827.298160  7392526.066682 
+357849.348581  7392526.176663 
+357867.399580  7392527.896369 
+357890.142684  7392530.006008 
+357909.587296  7392535.395084 
+357926.780687  7392541.104107 
+357956.277454  7392552.132218 
+357968.696277  7392554.911741 
+357988.182120  7392556.651443 
+358008.674004  7392558.951050 
+358046.037675  7392568.839356 
+358060.666488  7392576.618023 
+358070.009467  7392581.587172 
+358098.302284  7392600.683901 
+358131.270715  7392589.875752 
+358146.542734  7392583.656818 
+358160.792220  7392577.587857 
+358181.737646  7392564.950022 
+358192.523716  7392557.521294 
+358203.012921  7392549.872605 
+358221.105151  7392547.393029 
+358231.742789  7392544.943449 
+358247.855923  7392535.914995 
+358258.452330  7392527.486439 
+358279.876037  7392517.948073 
+358294.636790  7392512.339034 
+358317.371648  7392504.030457 
+358336.206039  7392499.231279 
+358379.127669  7392493.552252 
+358391.299106  7392491.452611 
+358412.129084  7392490.772728 
+358434.880435  7392492.102500 
+358458.745026  7392493.662233 
+358479.731683  7392497.741534 
+358490.468275  7392507.029943 
+358505.418691  7392512.049083 
+358514.151450  7392516.678290 
+358532.218941  7392517.408165 
+358547.919764  7392519.217855 
+358560.264372  7392519.337835 
+358571.182381  7392520.327665 
+358588.408757  7392522.817239 
+358600.497731  7392528.476270 
+358609.329444  7392533.655382 
+358620.272192  7392541.733999 
+358637.614015  7392553.751940 
+358650.667798  7392565.389947 
+358662.212521  7392575.358239 
+358672.429601  7392584.316705 
+358683.141454  7392596.164675 
+358695.700464  7392606.132968 
+358803.148849  7392630.878729 
+358809.044904  7392644.106463 
+358815.122376  7392659.343853 
+358820.449441  7392678.440582 
+358820.152577  7392699.147035 
+358812.648507  7392725.312553 
+358807.255472  7392744.869203 
+358804.286829  7392756.247254 
+358805.086713  7392768.545148 
+358814.495662  7392787.681870 
+358829.437832  7392804.768943 
+358842.466877  7392819.176475 
+358857.458524  7392831.174420 
+358878.041116  7392845.661939 
+358899.167959  7392856.830026 
+358910.226154  7392864.018794 
+358922.315128  7392869.787806 
+358935.937901  7392875.566816 
+358945.660207  7392883.515455 
+358954.401212  7392898.002973 
+358957.757427  7392910.210882 
+358954.854754  7392935.876486 
+358949.263810  7392954.313328 
+358943.813051  7392980.178897 
+358941.685524  7392999.645563 
+358946.113750  7393027.260832 
+358948.043368  7393049.766977 
+358951.770664  7393075.492571 
+358956.974035  7393096.798921 
+358968.205402  7393128.803439 
+358976.492863  7393147.600219 
+358993.405882  7393172.126018 
+359005.923661  7393186.423569 
+359024.997192  7393199.341356 
+359045.612769  7393210.499445 
+359064.570853  7393213.228978 
+359085.343108  7393218.638051 
+359119.144407  7393228.156421 
+359130.219095  7393233.355530 
+359146.901220  7393239.714441 
+359160.837350  7393254.801857 
+359169.240259  7393273.158712 
+359173.586022  7393298.664343 
+359175.408439  7393331.798668 
+359177.568952  7393394.157986 
+359182.632137  7393429.871869 
+359191.084524  7393453.207871 
+359201.491267  7393475.344080 
+359208.500563  7393499.439952 
+359213.250392  7393515.657174 
+359218.758874  7393536.973523 
+359223.566426  7393556.950101 
+359228.258531  7393567.958216 
+359233.865968  7393579.636215 
+359236.001742  7393591.284220 
+359225.891863  7393591.414198 
+359200.872799  7393581.985813 
+359183.283589  7393574.057171 
+359167.112731  7393567.588279 
+359150.908888  7393565.108704 
+359130.441743  7393559.489666 
+359116.810724  7393554.930447 
+359103.286906  7393549.701343 
+359090.925806  7393539.723052 
+359077.632882  7393530.964552 
+359063.779215  7393528.165032 
+359051.665502  7393524.505659 
+359040.788724  7393520.306378 
+359031.981749  7393512.357740 
+359024.832267  7393502.099497 
+359009.675696  7393496.640432 
+358978.504944  7393479.283405 
+358967.430256  7393473.314427 
+358958.375895  7393470.674880 
+358939.450795  7393463.846049 
+358922.743932  7393460.476626 
+358918.142535  7393461.206501 
+358908.247059  7393460.776575 
+358895.020105  7393466.965515 
+358885.066904  7393471.634715 
+358875.361091  7393472.754523 
+358860.839479  7393475.823998 
+358850.020424  7393475.614033 
+358836.216234  7393477.253753 
+358824.580802  7393477.803658 
+358807.849200  7393476.093951 
+358797.236302  7393475.873989 
+358782.244654  7393474.734184 
+358768.019906  7393478.033619 
+358754.463103  7393486.872105 
+358739.710597  7393492.261182 
+358732.214773  7393496.950379 
+358718.971327  7393504.359110 
+358707.591528  7393519.636493 
+358702.091292  7393529.334832 
+358697.720790  7393537.593417 
+358692.566896  7393542.862514 
+358681.261314  7393551.061110 
+358667.424139  7393556.900110 
+358652.168612  7393561.189375 
+358642.042241  7393563.638956 
+358623.422252  7393567.438305 
+358615.555348  7393568.248166 
+358598.799007  7393569.857890 
+358570.069140  7393574.237140 
+358542.147403  7393580.386087 
+358527.122771  7393582.235770 
+358510.341691  7393585.945135 
+358493.585351  7393587.784820 
+358481.793241  7393592.873948 
+358468.599272  7393595.513496 
+358460.394272  7393599.642788 
+358448.742348  7393601.302504 
+358438.112957  7393602.632276 
+358432.992048  7393604.022038 
+358424.424214  7393614.020326 
+358404.814678  7393635.756602 
+358396.354045  7393645.754890 
+358388.915945  7393654.203443 
+358380.884116  7393661.662165 
+358369.397117  7393667.091235 
+358351.601751  7393670.570639 
+358340.131244  7393674.220014 
+358330.227521  7393674.899898 
+358324.916949  7393674.739925 
+358318.080824  7393674.669937 
+358309.191387  7393675.579781 
+358299.732960  7393682.248639 
+358294.240971  7393690.277264 
+358288.542825  7393699.305717 
+358283.347700  7393708.224189 
+358278.177314  7393715.812890 
+358272.998681  7393723.291609 
+358260.151053  7393731.700168 
+358248.161034  7393736.569334 
+358235.486578  7393738.658976 
+358227.034191  7393746.657606 
+358210.277850  7393759.235452 
+358203.177846  7393764.704515 
+358190.338465  7393773.103076 
+358182.933350  7393778.342179 
+358168.386999  7393783.961216 
+358136.564795  7393791.629903 
+358104.618897  7393790.540089 
+358093.156637  7393793.979500 
+358085.982416  7393796.899000 
+358082.898326  7393799.078627 
+358078.527823  7393807.127248 
+358075.922014  7393812.966248 
+358069.753834  7393817.115537 
+358058.308066  7393818.775253 
+358055.380654  7393826.054006 
+358054.753940  7393837.572033 
+358052.222348  7393867.106974 
+358046.309800  7393877.135257 
+358044.817232  7393894.062357 
+358043.885408  7393905.460405 
+358039.935464  7393913.169084 
+358033.882731  7393926.506800 
+358021.274244  7393942.444070 
+358014.380395  7393958.321350 
+358007.461808  7393966.559939 
+358003.495371  7393975.828351 
+357999.998969  7393988.636157 
+357995.966562  7394004.773393 
+357992.503145  7394014.261768 
+357980.133799  7394026.759627 
+357965.884313  7394032.828588 
+357956.104283  7394040.817219 
+357941.871289  7394045.886351 
+357926.285913  7394052.705183 
+357912.704371  7394063.203385 
+357900.005176  7394078.360788 
+357892.352674  7394098.447348 
+357892.946403  7394111.075185 
+357895.576950  7394124.502885 
+357897.572538  7394139.250359 
+357902.561508  7394151.368283 
+357904.557095  7394166.555681 
+357905.200301  7394174.204371 
+357904.293216  7394183.502779 
+357903.188221  7394192.131301 
+357900.565920  7394199.080110 
+357897.968357  7394203.929280 
+357881.286233  7394218.496784 
+357870.648595  7394231.564546 
+357864.571123  7394247.341843 
+357862.905384  7394260.949513 
+357862.707475  7394270.807824 
+357865.371007  7394280.686132 
+357869.758002  7394291.584265 
+357875.142791  7394304.372075 
+357877.822816  7394312.700648 
+357880.140006  7394326.338312 
+357878.499007  7394337.736360 
+357878.960795  7394352.913760 
+357879.546278  7394365.981522 
+357881.368695  7394378.619357 
+357886.200986  7394395.946389 
+357887.627584  7394406.254623 
+357890.010745  7394413.143443 
+357889.738619  7394431.310331 
+357883.471484  7394445.417915 
+357875.917936  7394456.086087 
+357863.639299  7394469.033870 
+357854.741616  7394481.801683 
+357843.353572  7394498.078894 
+357834.521859  7394513.826197 
+357822.795719  7394533.642803 
+357817.551116  7394547.770383 
+357812.702332  7394563.777641 
+357813.221845  7394578.515117 
+357813.658895  7394590.813010 
+357827.108497  7394635.795305 
+357811.927187  7394653.252315 
+357802.988273  7394659.701210 
+357785.539248  7394669.499532 
+357767.653174  7394681.947399 
+357748.777552  7394691.175819 
+357733.678704  7394700.554212 
+357718.439670  7394713.472000 
+357703.101681  7394726.719730 
+357698.318867  7394704.413551 
+357634.476549  7394756.894562 
+357579.259789  7394818.504009 
+357560.219242  7394835.961018 
+357392.243524  7395038.926252 
+357333.266482  7395104.974939 
+357303.118263  7395131.150455 
+357277.719873  7395148.607465 
+357179.317602  7395214.476182 
+357053.150274  7395295.412319 
+357022.581497  7395314.389068 
+356973.137098  7395338.714901 
+356839.482191  7395377.988174 
+356760.590503  7395401.434158 
+356526.595462  7395463.833469 
+356474.602978  7395476.831243 
+356425.199810  7395492.428571 
+356201.611512  7395549.628774 
+356032.868894  7395597.570562 
+355772.626101  7395656.220515 
+355426.696726  7395723.299025 
+355197.237112  7395785.968291 
+355105.217424  7395804.365139 
+355031.611569  7395825.071593 
+354978.703753  7395859.575682 
+354925.795938  7395887.180954 
+354877.489518  7395937.782286 
+354860.007509  7395950.550099 
+354822.635592  7395978.975230 
+354751.882933  7396032.606044 
+Region 1
+1464
+352640.699455  7390122.748349 
+352645.828611  7390119.808853 
+352686.061970  7390107.810908 
+352697.120166  7390104.491476 
+352730.302998  7390092.863468 
+352759.065850  7390084.954823 
+352767.155402  7390082.155302 
+352774.725442  7390080.685554 
+352782.880964  7390081.095484 
+352792.240436  7390084.184955 
+352798.021044  7390087.564376 
+352801.459722  7390091.473706 
+352805.170526  7390097.492675 
+352809.343118  7390108.500789 
+352809.994571  7390115.479594 
+352810.126510  7390122.018474 
+352810.274942  7390128.107431 
+352810.225465  7390132.536672 
+352809.260656  7390137.405838 
+352808.996777  7390143.044872 
+352805.797239  7390177.009055 
+352804.972616  7390188.407102 
+352803.752174  7390197.475549 
+352800.775285  7390209.853429 
+352800.272265  7390219.371798 
+352801.121626  7390226.130641 
+352802.927551  7390229.030144 
+352807.792827  7390232.069623 
+352819.090163  7390235.179091 
+352824.903756  7390236.228911 
+352830.090635  7390237.948616 
+352836.390755  7390240.108246 
+352854.804588  7390246.717114 
+352873.292637  7390254.875717 
+352892.943405  7390259.954847 
+352902.525525  7390261.264622 
+352920.576524  7390261.894515 
+352938.644015  7390262.294446 
+352952.909994  7390264.324098 
+352962.690023  7390266.303759 
+352975.834515  7390268.533377 
+352982.654148  7390269.933138 
+352986.637077  7390269.753168 
+352998.387956  7390268.543376 
+353004.234533  7390265.723859 
+353009.693538  7390260.684722 
+353014.459859  7390253.755909 
+353015.977166  7390244.907424 
+353016.084367  7390233.949301 
+353015.457653  7390225.300783 
+353015.985412  7390213.902735 
+353017.477980  7390206.943927 
+353019.687970  7390200.205081 
+353022.805045  7390195.475891 
+353026.301447  7390192.526397 
+353032.238733  7390190.476748 
+353042.027009  7390191.796522 
+353053.728410  7390195.565876 
+353061.653037  7390199.185256 
+353069.569419  7390203.474521 
+353081.468730  7390207.583817 
+353089.401604  7390210.433329 
+353095.107995  7390211.373168 
+353107.452602  7390211.723108 
+353122.939024  7390213.982721 
+353132.521144  7390215.742420 
+353137.411158  7390216.232336 
+353141.913600  7390215.392480 
+353145.220339  7390211.213196 
+353146.490258  7390206.573990 
+353145.566681  7390197.265585 
+353143.117550  7390186.497429 
+353143.463892  7390183.177998 
+353143.909188  7390178.978717 
+353146.284103  7390176.009226 
+353149.368193  7390174.379505 
+353154.060298  7390174.649459 
+353157.301067  7390176.789092 
+353161.984926  7390177.828914 
+353167.592363  7390178.768753 
+353170.462051  7390177.688938 
+353174.494458  7390172.529822 
+353178.040337  7390164.921125 
+353180.233834  7390159.742012 
+353180.266819  7390156.082639 
+353178.164030  7390152.303287 
+353174.923262  7390149.943691 
+353170.025001  7390149.443776 
+353156.443459  7390150.643571 
+353149.401178  7390150.353620 
+353142.383636  7390147.954032 
+353139.151113  7390144.934549 
+353137.460636  7390140.035388 
+353137.823470  7390135.056241 
+353140.404540  7390131.876785 
+353145.327540  7390129.157251 
+353156.699092  7390124.837991 
+353165.102001  7390121.598546 
+353171.064026  7390117.449257 
+353173.381217  7390113.969853 
+353176.564262  7390108.430801 
+353180.365774  7390096.172901 
+353186.138135  7390079.625736 
+353188.842899  7390074.776566 
+353191.935235  7390072.256998 
+353202.721305  7390064.618306 
+353220.467194  7390055.709832 
+353225.423178  7390050.670695 
+353230.016329  7390040.412452 
+353237.800770  7390027.204715 
+353248.504378  7390018.226253 
+353258.358623  7390012.907164 
+353272.698818  7390007.728051 
+353284.276526  7390002.758902 
+353302.179093  7389998.729592 
+353313.113595  7389997.729764 
+353332.805594  7389999.089531 
+353347.071573  7390000.169346 
+353355.515713  7390002.918875 
+353363.910376  7390010.307609 
+353374.828385  7390020.825807 
+353382.513872  7390029.434333 
+353386.232922  7390033.563626 
+353392.170208  7390042.492096 
+353400.490655  7390057.189579 
+353409.239905  7390070.237344 
+353416.282186  7390080.155645 
+353424.297523  7390084.784852 
+353435.998924  7390088.994131 
+353445.465597  7390090.753829 
+353454.148878  7390090.503872 
+353462.131229  7390088.044293 
+353467.177922  7390083.885006 
+353471.012419  7390077.606081 
+353473.181178  7390075.526438 
+353477.691866  7390072.916885 
+353487.339956  7390068.137703 
+353496.254131  7390064.238371 
+353503.667493  7390057.559515 
+353508.516276  7390053.070284 
+353514.585502  7390047.701204 
+353529.626627  7390023.485352 
+353540.338480  7390014.076963 
+353549.120716  7390004.458611 
+353598.218773  7389995.020228 
+353645.263519  7390001.399135 
+353691.912446  7390011.767359 
+353703.415938  7390025.564996 
+353713.814434  7390026.774788 
+353729.878092  7390022.945444 
+353762.203316  7390015.746677 
+353771.653496  7390009.747705 
+353792.401012  7389996.439984 
+353804.382786  7389992.020741 
+353827.134136  7389983.172257 
+353837.606849  7389976.293435 
+353839.899301  7389971.784208 
+353844.871778  7389964.745413 
+353849.794778  7389952.387530 
+353852.210923  7389944.878816 
+353862.980501  7389939.669709 
+353879.266806  7389934.080666 
+353895.487142  7389935.020505 
+353904.368332  7389934.110661 
+353919.887738  7389933.600748 
+353926.509462  7389935.210473 
+353934.343381  7389937.290116 
+353938.590189  7389941.429407 
+353940.717717  7389952.967431 
+353941.872189  7389960.616121 
+353944.560460  7389967.174997 
+353945.492284  7389976.273439 
+353951.041998  7389981.972463 
+353953.260234  7389985.201909 
+353962.825861  7389987.631493 
+353966.190323  7389988.441355 
+353974.733418  7389991.070904 
+353979.994513  7389995.660118 
+353982.814724  7389999.789411 
+353988.784995  7390004.608585 
+353993.386392  7390003.878710 
+354000.032854  7390002.728907 
+354006.365959  7390001.799067 
+354012.707310  7390000.859228 
+354017.514863  7389999.139522 
+354018.883737  7389995.160204 
+354018.933215  7389990.620981 
+354019.023923  7389981.212593 
+354020.293843  7389966.385133 
+354022.124506  7389956.766780 
+354024.598375  7389943.948976 
+354028.762722  7389935.680392 
+354032.102445  7389928.411637 
+354043.234856  7389917.883441 
+354053.905479  7389912.454370 
+354064.361699  7389907.575206 
+354085.546266  7389901.806194 
+354099.012360  7389902.386095 
+354112.981475  7389903.635881 
+354119.545475  7389900.156477 
+354141.397986  7389898.936686 
+354152.629352  7389898.276799 
+354163.547361  7389899.156648 
+354180.748999  7389903.645879 
+354186.240988  7389905.475566 
+354198.610334  7389914.014103 
+354205.726831  7389916.413692 
+354212.496987  7389922.792600 
+354218.252856  7389929.381471 
+354226.012559  7389939.319769 
+354230.176905  7389951.757638 
+354238.085040  7389966.785064 
+354255.360893  7389963.975545 
+354269.330008  7389965.105352 
+354289.244655  7389974.493744 
+354315.772779  7389985.501858 
+354323.103678  7389987.131579 
+354332.240502  7389991.760786 
+354337.831446  7389994.580303 
+354340.552702  7389997.379823 
+354344.486154  7390002.179001 
+354347.025993  7390003.758731 
+354349.557586  7390005.888366 
+354356.888485  7390007.178145 
+354359.444817  7390007.198142 
+354361.522867  7390002.908876 
+354362.867002  7390001.699084 
+354365.637736  7390000.179344 
+354378.773981  7390002.858885 
+354381.808594  7390005.208483 
+354384.002092  7390010.767530 
+354389.386880  7390013.367085 
+354391.069111  7390018.926133 
+354394.120217  7390019.286071 
+354399.406050  7390022.105588 
+354408.979924  7390023.975268 
+354419.700024  7390023.305383 
+354423.122210  7390027.994579 
+354426.948461  7390033.013720 
+354429.174943  7390035.583280 
+354436.002822  7390036.203173 
+354441.313395  7390036.263163 
+354449.658580  7390037.892884 
+354452.998303  7390040.912367 
+354458.251152  7390046.501409 
+354460.403419  7390056.159755 
+354462.390760  7390061.718803 
+354465.293433  7390067.397830 
+354466.744770  7390075.156501 
+354469.457780  7390079.725718 
+354475.527006  7390084.664872 
+354478.784267  7390085.244773 
+354487.467547  7390085.004814 
+354490.741301  7390083.815018 
+354500.999612  7390079.155816 
+354506.862682  7390073.896717 
+354512.024822  7390068.637618 
+354519.908219  7390065.498155 
+354528.632731  7390061.048918 
+354538.058173  7390056.939621 
+354546.007539  7390048.371089 
+354546.370373  7390042.292130 
+354551.037740  7390035.363317 
+354556.356558  7390033.643612 
+354561.963995  7390034.473470 
+354562.623694  7390040.012521 
+354564.099769  7390045.121646 
+354568.363070  7390047.381259 
+354575.999080  7390049.230942 
+354584.542175  7390052.410397 
+354587.378878  7390054.660012 
+354589.893978  7390058.229401 
+354593.101762  7390064.128390 
+354595.823018  7390067.697779 
+354601.380978  7390072.846897 
+354609.734409  7390075.146503 
+354619.275298  7390080.335614 
+354634.266945  7390081.035494 
+354645.184955  7390081.145475 
+354655.591698  7390082.025324 
+354669.593798  7390079.945681 
+354680.792179  7390071.977046 
+354688.700314  7390067.067887 
+354695.874535  7390064.598310 
+354701.020183  7390060.439022 
+354711.938192  7390060.549003 
+354716.011830  7390061.588825 
+354721.437850  7390069.497470 
+354726.517528  7390072.316987 
+354731.951794  7390079.465763 
+354740.577351  7390084.644876 
+354752.707556  7390086.314590 
+354762.899897  7390087.414401 
+354772.284108  7390088.284252 
+354791.745212  7390091.573689 
+354805.219553  7390091.263742 
+354813.911080  7390089.803992 
+354825.546512  7390089.913973 
+354835.977993  7390087.254429 
+354842.830611  7390085.654703 
+354850.483113  7390086.514556 
+354855.232942  7390091.323732 
+354856.906927  7390097.092744 
+354863.487419  7390102.811764 
+354866.225167  7390103.831589 
+354872.855137  7390104.891408 
+354876.120644  7390104.931401 
+354881.035398  7390102.981735 
+354883.501021  7390101.571976 
+354889.941327  7390100.082232 
+354899.993482  7390105.271343 
+354905.048421  7390110.420461 
+354910.482687  7390117.999162 
+354915.727290  7390124.368072 
+354922.472707  7390134.066410 
+354935.707907  7390136.745951 
+354947.293861  7390141.955059 
+354966.177729  7390152.223300 
+354979.759271  7390161.991627 
+354994.338607  7390173.099724 
+355008.711787  7390185.087671 
+355021.988218  7390194.855998 
+355032.650594  7390200.285068 
+355040.632946  7390208.773614 
+355050.660362  7390216.402307 
+355060.019834  7390219.381797 
+355068.851547  7390224.011004 
+355074.640401  7390226.610558 
+355086.036691  7390230.269932 
+355099.502786  7390230.959813 
+355114.494433  7390232.429562 
+355121.322312  7390232.939474 
+355131.935211  7390233.049455 
+355153.119778  7390227.280444 
+355170.387385  7390225.230795 
+355187.811670  7390217.652093 
+355202.044664  7390213.252846 
+355215.741653  7390210.843259 
+355234.163733  7390206.044081 
+355257.599520  7390199.525198 
+355266.010675  7390195.395905 
+355269.639017  7390189.566904 
+355281.150755  7390181.148346 
+355290.262840  7390178.688767 
+355297.437060  7390175.769267 
+355308.891075  7390173.339683 
+355320.130687  7390172.009911 
+355337.348817  7390159.572041 
+355358.104579  7390140.385328 
+355372.230372  7390125.457885 
+355381.705291  7390116.919347 
+355392.755240  7390103.741605 
+355408.216923  7390089.054121 
+355420.792425  7390076.326301 
+355427.175007  7390070.307332 
+355450.841689  7390051.380574 
+355458.568407  7390043.701889 
+355466.220909  7390034.143526 
+355471.416035  7390024.675148 
+355482.078411  7390009.047825 
+355492.064596  7390000.399306 
+355509.736268  7389988.951267 
+355517.149630  7389982.272411 
+355522.600388  7389978.003143 
+355527.828498  7389964.985372 
+355530.459046  7389956.926753 
+355532.792729  7389948.648171 
+355534.392498  7389941.019478 
+355541.187392  7389925.252178 
+355544.114804  7389917.643482 
+355548.963588  7389912.704328 
+355557.176833  7389908.025129 
+355562.817255  7389905.305595 
+355578.559309  7389902.476080 
+355584.397641  7389900.206468 
+355596.898926  7389895.347301 
+355602.357931  7389890.088202 
+355613.581051  7389880.119909 
+355620.285236  7389873.211092 
+355629.570492  7389862.672898 
+355635.293376  7389851.654785 
+355636.959115  7389838.717001 
+355638.682577  7389828.988667 
+355638.154818  7389810.481837 
+355633.635884  7389803.133096 
+355628.919040  7389794.774528 
+355623.138432  7389790.845201 
+355604.501951  7389777.037566 
+355599.884062  7389758.280779 
+355598.754328  7389748.632432 
+355596.099042  7389738.754124 
+355595.777439  7389719.587407 
+355613.350156  7389697.061265 
+355621.827282  7389686.293110 
+355636.390125  7389658.747828 
+355643.514868  7389640.101022 
+355651.860054  7389621.474213 
+355656.725330  7389594.278871 
+355659.628003  7389569.053192 
+355664.344847  7389535.328969 
+355672.228243  7389512.372901 
+355678.017097  7389494.815908 
+355698.038945  7389461.241659 
+355710.993773  7389441.874976 
+355726.199823  7389421.208516 
+355740.218415  7389396.542741 
+355747.211218  7389380.995405 
+355761.452459  7389343.821772 
+355763.695434  7389323.355278 
+355770.119247  7389293.630369 
+355775.504036  7389275.073548 
+355788.153754  7389234.560488 
+355809.874325  7389225.692007 
+355817.279440  7389219.783019 
+355819.852264  7389217.483413 
+355825.014405  7389211.994353 
+355829.879681  7389204.515634 
+355838.076434  7389180.559737 
+355852.292936  7389157.333716 
+355851.443574  7389150.244930 
+355860.605136  7389142.026338 
+355865.783769  7389134.437638 
+355873.832090  7389125.439179 
+355880.561014  7389115.980799 
+355894.670315  7389102.493109 
+355905.901681  7389091.534987 
+355914.436530  7389085.086091 
+355932.858609  7389069.868698 
+355945.401126  7389060.250345 
+355956.137718  7389057.810763 
+355961.745155  7389058.860583 
+355963.938652  7389063.759744 
+355963.072798  7389068.728893 
+355962.009034  7389073.478080 
+355961.448291  7389078.567208 
+355965.192079  7389081.376727 
+355971.492200  7389084.536185 
+355980.480591  7389083.626341 
+355986.846681  7389079.926975 
+355997.781183  7389078.047297 
+356013.820102  7389076.647537 
+356020.153207  7389076.047639 
+356032.110241  7389074.617884 
+356051.612577  7389072.818193 
+356058.762059  7389072.218295 
+356070.752078  7389067.799052 
+356080.490876  7389062.909890 
+356085.644770  7389057.650791 
+356086.444655  7389048.792308 
+356087.343494  7389040.723690 
+356087.384725  7389036.734373 
+356088.869047  7389020.797103 
+356093.519921  7389014.758138 
+356098.871724  7389010.048944 
+356105.015166  7389008.339237 
+356116.469181  7389005.459730 
+356123.090904  7389006.519549 
+356127.057341  7389007.889314 
+356134.874767  7389012.288561 
+356138.907174  7389017.307701 
+356148.274892  7389019.287362 
+356153.387555  7389018.337525 
+356165.369328  7389014.138244 
+356176.345061  7389008.929136 
+356183.222418  7389004.229941 
+356199.500477  7388999.630729 
+356211.589451  7388994.771561 
+356229.953807  7388984.873257 
+356247.551263  7388979.844118 
+356263.342795  7388972.135439 
+356274.326774  7388966.256446 
+356286.630150  7388959.847543 
+356296.616335  7388951.089044 
+356298.710878  7388946.119895 
+356303.584400  7388938.311232 
+356309.513440  7388936.591527 
+356315.830053  7388937.651345 
+356320.596374  7388940.800806 
+356326.203811  7388941.850626 
+356331.481399  7388944.230218 
+356337.097082  7388944.510171 
+356343.636342  7388943.910273 
+356347.742965  7388940.630835 
+356348.625312  7388934.541878 
+356348.666543  7388930.002656 
+356348.732513  7388923.693736 
+356350.860041  7388914.855250 
+356355.296513  7388909.916096 
+356364.911618  7388907.466516 
+356373.611391  7388905.106920 
+356386.797114  7388902.917295 
+356398.770641  7388899.597864 
+356409.358801  7388891.399268 
+356421.373559  7388884.210499 
+356428.085991  7388876.191873 
+356449.031416  7388863.324077 
+356458.250702  7388859.104800 
+356472.458958  7388857.025156 
+356487.170233  7388855.175473 
+356505.270709  7388851.586088 
+356521.829141  7388849.316476 
+356546.493616  7388842.027725 
+356565.822781  7388837.238545 
+356575.569826  7388832.009441 
+356590.660428  7388823.410914 
+356601.479482  7388812.892715 
+356619.753129  7388791.476384 
+356626.160451  7388782.897853 
+356642.323063  7388768.990236 
+356672.743408  7388736.735760 
+356684.947829  7388709.610407 
+356695.832853  7388692.113404 
+356698.974667  7388684.274747 
+356703.938898  7388677.795856 
+356711.640878  7388672.886697 
+356715.450636  7388668.827393 
+356723.713359  7388659.159049 
+356716.530892  7388641.812020 
+356711.814048  7388634.013356 
+356708.325893  7388625.784765 
+356709.397903  7388620.265711 
+356715.087802  7388612.237086 
+356736.156921  7388597.599593 
+356750.744503  7388587.441333 
+356761.233709  7388579.462700 
+356772.720708  7388573.043799 
+356785.815722  7388559.326149 
+356792.825018  7388552.637295 
+356805.895294  7388541.469208 
+356815.147565  7388534.700367 
+356825.669755  7388522.512455 
+356833.891247  7388516.723447 
+356845.609141  7388508.534849 
+356851.752582  7388506.155257 
+356863.742602  7388501.176110 
+356873.456662  7388498.836510 
+356883.904636  7388494.947177 
+356893.173399  7388486.408639 
+356900.100233  7388477.170222 
+356907.530087  7388469.381556 
+356925.993397  7388459.263289 
+356934.404552  7388454.584090 
+356947.928371  7388449.734921 
+356958.730933  7388440.756459 
+356967.166827  7388433.527697 
+356973.854520  7388427.618709 
+356984.871484  7388418.090341 
+356993.340363  7388407.652129 
+356997.282061  7388401.043261 
+356999.393096  7388393.754510 
+357000.704247  7388385.465930 
+357000.918649  7388374.057884 
+357000.968126  7388368.858774 
+357001.528870  7388363.219740 
+357009.511221  7388351.001833 
+357022.804145  7388348.142323 
+357040.904621  7388343.773071 
+357049.497193  7388342.093359 
+357057.166188  7388340.173688 
+357065.577343  7388335.714452 
+357073.271076  7388331.805121 
+357086.514523  7388323.846485 
+357098.850884  7388314.668057 
+357109.150426  7388305.239672 
+357115.013496  7388300.210533 
+357125.255314  7388296.541162 
+357138.498761  7388287.922638 
+357144.139183  7388285.763008 
+357152.855448  7388280.973828 
+357161.448021  7388279.394099 
+357167.104935  7388274.364960 
+357172.580432  7388267.326166 
+357181.024572  7388259.877442 
+357183.663366  7388250.818994 
+357188.371964  7388239.240977 
+357190.507737  7388229.402662 
+357194.663838  7388221.693982 
+357197.096476  7388212.635534 
+357201.755596  7388206.366608 
+357204.361405  7388200.637589 
+357215.106243  7388197.418141 
+357226.065484  7388192.988899 
+357236.999986  7388191.429166 
+357247.151096  7388186.440021 
+357254.341809  7388181.530862 
+357261.029502  7388176.051800 
+357272.029974  7388168.303128 
+357280.234973  7388163.393969 
+357289.223365  7388152.635811 
+357313.483775  7388124.190684 
+357330.405040  7388104.644032 
+357342.832110  7388086.377161 
+357350.880431  7388077.158740 
+357356.578576  7388068.350249 
+357364.206340  7388060.671564 
+357376.872550  7388049.173534 
+357394.643177  7388026.867354 
+357400.885574  7388014.079545 
+357409.840980  7388005.860953 
+357418.986050  7387989.113821 
+357426.457135  7387977.005895 
+357429.095929  7387967.957445 
+357431.512074  7387960.448731 
+357436.575260  7387943.771588 
+357440.516958  7387926.424559 
+357443.172244  7387916.156318 
+357448.284907  7387894.280065 
+357454.461334  7387868.094551 
+357462.740550  7387855.546700 
+357474.598629  7387843.258805 
+357479.999911  7387833.790427 
+357486.225815  7387823.222237 
+357486.671111  7387808.604741 
+357485.698056  7387803.495616 
+357483.941609  7387785.318730 
+357482.836614  7387772.910855 
+357479.686554  7387761.472814 
+357476.726157  7387750.584679 
+357471.052750  7387735.917192 
+357462.418947  7387721.659634 
+357456.885726  7387713.301066 
+357450.206279  7387697.063847 
+357441.325089  7387676.927296 
+357435.709406  7387603.789824 
+357414.871181  7387585.532951 
+357397.809730  7387566.876147 
+357391.715765  7387553.408454 
+357389.959318  7387524.163463 
+357392.251770  7387509.006059 
+357395.814142  7387489.109468 
+357403.004855  7387463.493855 
+357411.952015  7387435.558640 
+357416.215317  7387416.661877 
+357418.928326  7387399.964737 
+357417.691392  7387380.358096 
+357410.657357  7387358.471845 
+357402.996609  7387324.467669 
+357402.658513  7387321.298212 
+357391.146775  7387288.073903 
+357378.967093  7387271.226789 
+357362.375677  7387255.899414 
+357344.753482  7387242.761665 
+357325.218161  7387226.404466 
+357308.131971  7387210.297226 
+357292.027083  7387198.509245 
+357263.907436  7387172.433711 
+357243.077458  7387153.177010 
+357214.438299  7387128.871173 
+357194.597868  7387113.163864 
+357178.534211  7387096.616698 
+357160.565674  7387076.730104 
+357141.343710  7387049.744727 
+357129.584585  7387031.357876 
+357120.744626  7387006.242178 
+357109.348335  7386982.106313 
+357101.646356  7386956.000784 
+357087.932874  7386928.845436 
+357077.237513  7386916.887484 
+357060.670836  7386899.790413 
+357048.317982  7386890.032084 
+357028.733185  7386878.654033 
+357019.596361  7386873.694882 
+356998.716905  7386859.537308 
+356986.891810  7386848.339226 
+356971.149756  7386830.472286 
+356958.128958  7386815.944775 
+356934.280859  7386792.118856 
+356924.822432  7386778.851128 
+356914.143564  7386764.903517 
+356903.538911  7386753.615451 
+356868.657355  7386741.867463 
+356853.937834  7386744.157071 
+356840.422262  7386748.786278 
+356828.102393  7386756.304990 
+356818.462549  7386761.644076 
+356799.281817  7386771.862325 
+356782.649170  7386782.220551 
+356764.037427  7386786.799767 
+356744.708262  7386790.819078 
+356728.463188  7386793.208669 
+356699.675597  7386794.808395 
+356673.724709  7386798.317794 
+356650.495077  7386794.538441 
+356631.941058  7386792.478794 
+356607.911542  7386787.919575 
+356585.588996  7386785.160048 
+356562.606751  7386777.291395 
+356545.446345  7386768.482904 
+356533.786175  7386761.504100 
+356515.768161  7386746.156729 
+356507.200327  7386735.988470 
+356498.071750  7386719.621274 
+356490.897529  7386702.604189 
+356479.501239  7386678.798266 
+356468.418305  7386653.662572 
+356457.343617  7386627.966973 
+356449.872532  7386609.730097 
+356444.116663  7386582.874697 
+356443.852784  7386537.362493 
+356436.884719  7386519.015636 
+356427.063458  7386500.978725 
+356421.357066  7386490.180575 
+356411.519313  7386474.143322 
+356397.269827  7386449.197595 
+356388.833933  7386425.521650 
+356386.854837  7386409.114461 
+356393.435329  7386393.337163 
+356399.760188  7386383.108915 
+356408.039404  7386371.110971 
+356434.839653  7386333.167470 
+356446.541055  7386316.010409 
+356460.914235  7386296.773704 
+356466.496933  7386278.776787 
+356464.723993  7386251.181513 
+356459.735024  7386219.576927 
+356456.964290  7386189.762034 
+356458.555813  7386173.604802 
+356464.435375  7386156.277770 
+356479.361053  7386143.130022 
+356496.851308  7386128.572515 
+356513.096382  7386115.784706 
+356526.463522  7386105.166524 
+356539.871893  7386091.018948 
+356546.237983  7386076.241479 
+356547.309993  7386061.074077 
+356547.730551  7386038.597927 
+356533.167708  7385973.229124 
+356525.614160  7385943.034296 
+356523.849467  7385914.999098 
+356520.847839  7385867.237280 
+356515.529020  7385837.172429 
+356499.457117  7385801.248583 
+356483.723309  7385772.193560 
+356466.364993  7385753.526757 
+356439.300864  7385735.539838 
+356422.107473  7385730.280739 
+356402.143349  7385726.871323 
+356374.345305  7385721.052320 
+356358.199186  7385712.923712 
+356347.297669  7385701.635646 
+356329.007529  7385672.770590 
+356316.423781  7385655.483551 
+356299.246883  7385638.476464 
+356276.586241  7385629.288038 
+356256.374730  7385619.999629 
+356226.144048  7385612.950836 
+356206.410818  7385607.111837 
+356191.757266  7385602.532621 
+356170.968519  7385590.034762 
+356150.872455  7385579.536560 
+356130.792883  7385566.828737 
+356110.053613  7385549.121770 
+356096.686473  7385528.615282 
+356081.694826  7385506.988987 
+356067.626757  7385485.252710 
+356044.545557  7385456.557625 
+356026.247171  7385439.880482 
+356014.826142  7385428.252474 
+356000.551916  7385417.144376 
+355982.138083  7385411.755299 
+355958.586849  7385410.085585 
+355931.464996  7385408.375878 
+355897.828621  7385405.276409 
+355874.277387  7385403.826658 
+355848.244036  7385394.818201 
+355829.681771  7385384.120033 
+355817.279440  7385368.822653 
+355811.168983  7385357.574580 
+355809.412536  7385339.397694 
+355810.525777  7385319.471107 
+355809.222873  7385296.754998 
+355805.256436  7385263.830638 
+355796.903004  7385231.636152 
+355762.293574  7385110.576889 
+355750.889037  7385067.274306 
+355738.206335  7385028.720910 
+355724.014572  7384999.345941 
+355707.390171  7384977.699649 
+355684.655313  7384955.543444 
+355660.840199  7384929.397923 
+355644.900235  7384910.631137 
+355614.949925  7384886.195323 
+355592.165590  7384868.358378 
+355559.320853  7384847.321982 
+355535.629433  7384839.123386 
+355515.698293  7384832.714484 
+355491.033817  7384820.186630 
+355473.123004  7384815.017515 
+355447.906031  7384806.468980 
+355430.374545  7384794.880964 
+355412.513209  7384784.962663 
+355396.004255  7384773.284664 
+355371.826307  7384762.516508 
+355343.492258  7384759.467031 
+355315.496305  7384763.846280 
+355292.077010  7384769.925239 
+355270.043082  7384779.893532 
+355252.742490  7384785.372593 
+355221.126442  7384794.910959 
+355192.792393  7384802.489661 
+355168.383551  7384804.359341 
+355148.213271  7384801.499831 
+355129.024292  7384792.111439 
+355112.812202  7384780.653402 
+355097.078394  7384763.006424 
+355081.979546  7384742.030017 
+355072.644813  7384726.772631 
+355065.396376  7384706.426116 
+355059.657000  7384688.659159 
+355049.745030  7384659.434165 
+355045.028186  7384641.667209 
+355045.168372  7384616.971439 
+355047.460824  7384591.525797 
+355051.171628  7384567.859851 
+355054.024824  7384547.183393 
+355054.461874  7384523.487452 
+355050.206819  7384511.039584 
+355034.225624  7384496.592059 
+355017.428052  7384482.694439 
+355002.947671  7384472.136248 
+354985.424431  7384459.118478 
+354960.083765  7384442.591308 
+354950.584107  7384433.852805 
+354921.788269  7384416.185831 
+354905.304054  7384400.958440 
+354886.832498  7384380.951867 
+354876.458740  7384367.894103 
+354860.197173  7384351.446921 
+354850.441882  7384347.807544 
+354839.507380  7384349.577241 
+354831.483798  7384356.036135 
+354828.869743  7384361.985116 
+354820.788436  7384374.752929 
+354800.040920  7384399.128753 
+354790.747418  7384409.786928 
+354776.357746  7384430.793329 
+354764.136832  7384449.720087 
+354743.430547  7384469.776652 
+354729.865497  7384489.243317 
+354720.497779  7384508.090089 
+354715.005790  7384526.856875 
+354713.793594  7384556.081869 
+354713.859564  7384580.337714 
+354717.199287  7384603.843687 
+354717.232272  7384630.869058 
+354718.296036  7384667.532778 
+354722.460382  7384690.278882 
+354723.548885  7384703.916546 
+354723.062357  7384731.701786 
+354722.229488  7384764.476173 
+354720.101960  7384793.801149 
+354717.520890  7384826.995464 
+354712.507182  7384849.211658 
+354701.770590  7384882.545948 
+354689.491952  7384906.011929 
+354684.173133  7384918.029870 
+354675.572315  7384931.007647 
+354658.807728  7384944.355361 
+354645.770437  7384952.533960 
+354621.699690  7384962.372275 
+354604.770178  7384971.940636 
+354586.793396  7384984.278522 
+354571.661562  7385007.714508 
+354558.789196  7385019.662461 
+354542.667815  7385040.758848 
+354528.063741  7385062.215173 
+354510.639456  7385090.500328 
+354494.188225  7385113.926315 
+354465.532574  7385143.201300 
+354448.231982  7385159.308541 
+354428.333828  7385179.375104 
+354404.840316  7385202.951066 
+354386.319282  7385218.268442 
+354366.825193  7385229.596502 
+354345.434471  7385236.025400 
+354323.276849  7385238.355001 
+354303.271494  7385238.814923 
+354248.401075  7385257.531717 
+354261.751722  7385360.444089 
+354284.973108  7385405.856310 
+354291.792740  7385437.710854 
+354299.362780  7385466.685890 
+354308.672775  7385484.722801 
+354323.227372  7385538.683558 
+354185.911139  7385956.691957 
+354099.284486  7386476.442928 
+354056.404087  7386585.144309 
+354048.025916  7386591.873156 
+354042.575158  7386616.288974 
+354036.835781  7386629.086782 
+354029.043093  7386642.844425 
+354012.360969  7386658.631721 
+353999.134015  7386684.967210 
+353987.251196  7386699.684689 
+353978.675117  7386711.002750 
+353967.443750  7386721.410967 
+353957.647228  7386732.169125 
+353937.328516  7386753.895403 
+353915.715146  7386772.062291 
+353909.002714  7386780.300880 
+353901.061594  7386788.519472 
+353898.579478  7386801.897181 
+353893.722448  7386807.936146 
+353889.417916  7386810.335735 
+353864.745194  7386808.096119 
+353841.870150  7386809.855818 
+353829.731699  7386809.405895 
+353811.458052  7386809.885812 
+353795.757228  7386809.285915 
+353787.082194  7386809.415893 
+353772.049315  7386812.255406 
+353755.993904  7386816.304713 
+353738.091337  7386830.742240 
+353731.049056  7386841.530392 
+353713.633017  7386837.581068 
+353699.350546  7386837.881017 
+353687.665637  7386842.970145 
+353680.145075  7386850.208905 
+353677.844376  7386855.827943 
+353670.620678  7386863.506628 
+353657.154584  7386883.313235 
+353653.773629  7386895.121212 
+353644.669790  7386907.879027 
+353638.913921  7386921.666665 
+353626.297189  7386938.263822 
+353621.646314  7386944.752711 
+353611.173602  7386951.181610 
+353591.621789  7386967.368837 
+353582.484965  7386973.037866 
+353573.933624  7386981.036496 
+353569.109579  7386983.975992 
+353561.300399  7386999.073406 
+353549.813399  7387005.272344 
+353546.259274  7387003.682617 
+353543.752420  7386998.783456 
+353543.628726  7386991.474708 
+353539.068561  7386987.665360 
+353534.285747  7386987.065463 
+353528.958682  7386988.555208 
+353523.516170  7386992.264573 
+353513.035211  7386999.253375 
+353505.836251  7387004.942401 
+353490.259122  7387011.541271 
+353482.177816  7387014.000849 
+353462.848651  7387017.800199 
+353456.408345  7387019.279945 
+353451.551315  7387025.208929 
+353444.294632  7387036.546987 
+353441.383713  7387042.056044 
+353434.250723  7387051.284463 
+353426.062216  7387053.414098 
+353415.581257  7387081.109354 
+353412.942463  7387090.167803 
+353411.540604  7387097.676516 
+353407.400996  7387103.175574 
+353399.517600  7387106.195057 
+353384.674384  7387110.474324 
+353369.369380  7387120.402624 
+353355.020939  7387126.791529 
+353333.011749  7387133.990296 
+353316.890368  7387144.348522 
+353308.536937  7387153.017037 
+353301.346224  7387157.926196 
+353285.752602  7387165.744857 
+353262.374538  7387177.132906 
+353246.954086  7387188.270998 
+353232.094379  7387194.549923 
+353221.506219  7387202.188614 
+353208.831762  7387215.136397 
+353199.373336  7387232.313454 
+353194.029778  7387246.101093 
+353188.496557  7387258.119034 
+353044.863712  7387317.848803 
+352742.012645  7387441.097691 
+352657.686691  7387489.209450 
+352637.755551  7387492.878822 
+352617.750196  7387493.228762 
+352587.230896  7387493.698681 
+352573.608123  7387489.129464 
+352554.732501  7387478.751242 
+352527.445724  7387472.602295 
+352510.532705  7387470.002740 
+352494.996806  7387472.832256 
+352479.625832  7387479.321144 
+352474.364737  7387484.810204 
+352466.291677  7387496.018284 
+352460.098758  7387502.487176 
+352450.516638  7387511.695599 
+352442.781674  7387520.364114 
+352435.302342  7387522.953670 
+352422.619640  7387526.253105 
+352396.165732  7387538.720970 
+352383.647954  7387545.239853 
+352367.732729  7387554.828210 
+352358.653629  7387565.036462 
+352350.094041  7387573.475016 
+352334.508665  7387591.361953 
+352323.582410  7387601.780168 
+352315.360918  7387607.449197 
+352308.137220  7387615.907748 
+352291.397371  7387625.926032 
+352286.441387  7387631.415092 
+352278.681684  7387642.413208 
+352272.340332  7387644.002936 
+352263.327202  7387647.122401 
+352255.122203  7387651.251694 
+352253.357509  7387663.859534 
+352250.380620  7387676.227416 
+352247.618133  7387687.055561 
+352235.290018  7387694.684254 
+352226.606737  7387695.484117 
+352218.921250  7387699.173485 
+352212.950979  7387704.092643 
+352210.658527  7387708.831831 
+352193.357935  7387734.347460 
+352181.887428  7387748.515034 
+352171.266283  7387759.703117 
+352163.844676  7387767.161840 
+352158.707274  7387770.101336 
+352157.025043  7387775.290447 
+352156.662209  7387780.379576 
+352155.351058  7387799.306334 
+352153.644088  7387806.595085 
+352148.704596  7387811.084316 
+352138.075205  7387812.084145 
+352124.452432  7387817.703182 
+352120.617935  7387822.872297 
+352119.224322  7387829.721124 
+352117.979141  7387842.109002 
+352117.814216  7387848.427920 
+352116.082508  7387858.156253 
+352113.295282  7387870.744097 
+352108.116649  7387879.002682 
+352102.616413  7387887.471232 
+352094.394921  7387893.150259 
+352088.111294  7387899.399189 
+352085.653917  7387909.667430 
+352082.932661  7387917.176144 
+352080.821626  7387924.014972 
+352076.352169  7387931.503689 
+352067.437993  7387935.403021 
+352051.225904  7387944.211513 
+352026.759338  7387962.118445 
+352006.885922  7387979.525464 
+351994.566053  7387987.044176 
+351983.755245  7387996.232602 
+351972.482647  7388000.551862 
+351950.852784  7388000.661843 
+351933.915027  7388010.460165 
+351917.810138  7388018.268827 
+351905.721164  7388023.127995 
+351891.842758  7388033.396236 
+351884.140778  7388038.085433 
+351858.090936  7388070.709845 
+351846.241102  7388082.107892 
+351829.328083  7388089.136688 
+351812.918084  7388097.385275 
+351760.818399  7388113.352540 
+351729.375522  7388123.890735 
+351722.506412  7388126.940213 
+351708.157970  7388133.419103 
+351688.705112  7388139.867998 
+351679.980600  7388144.987122 
+351659.670134  7388154.965412 
+351650.261185  7388157.305012 
+351639.475115  7388163.733910 
+351622.529111  7388174.302100 
+351611.462670  7388179.171266 
+351606.795303  7388186.879946 
+351611.710057  7388194.788591 
+351613.062438  7388202.107337 
+351598.697505  7388210.495901 
+351592.026304  7388213.855325 
+351585.693199  7388214.235260 
+351581.108295  7388213.415400 
+351576.119325  7388212.585543 
+351570.478903  7388215.525039 
+351565.729075  7388220.674157 
+351557.507583  7388226.133222 
+351552.559844  7388231.622282 
+351550.242653  7388238.131167 
+351549.516985  7388249.749177 
+351553.912226  7388259.207557 
+351558.373437  7388261.467170 
+351568.227682  7388265.776431 
+351564.137552  7388276.584580 
+351558.431160  7388286.492883 
+351552.262980  7388290.972116 
+351544.783649  7388293.111749 
+351535.325222  7388300.220532 
+351531.367031  7388308.259155 
+351525.372022  7388315.727875 
+351517.018590  7388323.946467 
+351514.932294  7388328.465693 
+351514.091178  7388331.225221 
+351515.369344  7388336.004402 
+351517.587580  7388338.573962 
+351521.001519  7388343.703083 
+351520.976781  7388346.252647 
+351517.554595  7388351.971667 
+351516.218706  7388352.961497 
+351516.177475  7388356.720854 
+351517.653550  7388362.609845 
+351522.114761  7388365.419364 
+351523.796992  7388370.308526 
+351522.065283  7388380.146841 
+351520.300590  7388382.566426 
+351515.361098  7388387.275620 
+351508.689897  7388390.974986 
+351501.845526  7388391.574883 
+351495.702084  7388393.724515 
+351488.511371  7388398.193750 
+351483.868743  7388403.122905 
+351482.656547  7388411.421484 
+351486.375597  7388417.550434 
+351487.909396  7388426.758857 
+351494.193024  7388431.588029 
+351500.682807  7388435.747317 
+351503.189661  7388439.646649 
+351504.830661  7388449.304995 
+351498.967591  7388473.380871 
+351497.013235  7388484.988882 
+351492.716948  7388496.016993 
+351489.962707  7388505.845310 
+351482.367929  7388520.062875 
+351470.402648  7388532.560734 
+351465.034352  7388534.570390 
+351438.910293  7388549.077905 
+351438.555705  7388553.387166 
+351437.656866  7388561.685745 
+351437.483696  7388568.324608 
+351442.076846  7388578.782816 
+351446.950368  7388581.052428 
+351448.310996  7388587.491325 
+351447.610067  7388596.229828 
+351441.466625  7388598.709403 
+351437.458957  7388610.967303 
+351435.776726  7388616.266396 
+351433.162671  7388622.545320 
+351431.562902  7388629.064204 
+351427.250123  7388641.312106 
+351420.752094  7388648.340902 
+351413.058360  7388652.470194 
+351410.831878  7388650.670503 
+351406.568577  7388648.300909 
+351406.824210  7388643.541724 
+351407.690064  7388638.012671 
+351407.351969  7388631.363810 
+351402.577401  7388629.544121 
+351399.196447  7388630.513955 
+351380.197131  7388632.423628 
+351361.461695  7388638.102655 
+351354.774002  7388643.791681 
+351349.578877  7388653.040097 
+351345.101174  7388661.628626 
+351342.017083  7388673.896524 
+351336.121028  7388691.443519 
+351331.626833  7388702.031705 
+351328.839607  7388715.069472 
+351320.939718  7388729.387019 
+351315.299296  7388742.174829 
+351304.810091  7388759.341888 
+351295.854684  7388767.330520 
+351284.400670  7388779.508434 
+351275.610188  7388790.716514 
+351269.483239  7388801.724628 
+351269.903796  7388810.263166 
+351272.262218  7388818.921683 
+351277.028540  7388831.929455 
+351281.918554  7388842.607626 
+351282.751424  7388851.696069 
+351283.196720  7388868.093260 
+351284.326454  7388877.181703 
+351288.523785  7388896.058470 
+351292.729363  7388903.957117 
+351295.054800  7388916.055045 
+351297.792548  7388927.273123 
+351301.660031  7388938.941124 
+351303.911251  7388968.306095 
+351306.772694  7388977.974438 
+351306.739709  7388990.822238 
+351305.824377  7389000.660552 
+351301.338428  7389010.478871 
+351294.502302  7389020.147215 
+351289.117514  7389028.175839 
+351275.799851  7389042.553377 
+351271.478826  7389046.492702 
+351254.351405  7389064.149677 
+351243.928170  7389076.117627 
+351237.900175  7389086.355874 
+351231.699010  7389093.824594 
+351228.961261  7389102.103176 
+351225.283442  7389112.581381 
+351222.710618  7389124.739299 
+351214.447895  7389134.397645 
+351205.904800  7389141.846369 
+351195.968092  7389155.254072 
+351194.747650  7389164.652462 
+351177.282134  7389206.225341 
+351169.761571  7389223.312414 
+351159.767140  7389243.039035 
+351156.270738  7389255.626879 
+351145.929965  7389278.442971 
+351139.547382  7389294.210270 
+351133.824498  7389315.086694 
+351132.826704  7389322.605406 
+351134.632629  7389335.803146 
+351134.212071  7389357.059505 
+351129.363287  7389361.998659 
+351123.384770  7389367.697682 
+351115.839469  7389377.146064 
+351110.372218  7389382.845088 
+351102.637254  7389391.073678 
+351097.879179  7389397.002663 
+351092.684053  7389405.811154 
+351088.387767  7389416.619303 
+351083.035964  7389421.328496 
+351073.338396  7389421.118532 
+351064.630377  7389425.017864 
+351061.010282  7389429.517093 
+351055.031764  7389435.216117 
+351051.411669  7389440.165269 
+351051.048835  7389445.254398 
+351045.226996  7389446.304218 
+351040.320489  7389446.474189 
+351038.094007  7389445.234401 
+351034.366710  7389439.875319 
+351032.173213  7389435.206119 
+351026.681223  7389433.376432 
+351024.133138  7389432.796532 
+351017.000149  7389431.726715 
+351014.089229  7389427.377460 
+351009.298169  7389426.777563 
+351004.721511  7389425.177837 
+351002.692938  7389423.388143 
+351000.977722  7389421.488468 
+350998.775979  7389417.699118 
+350994.694095  7389417.659124 
+350991.931607  7389418.069054 
+350990.034974  7389423.808071 
+350989.878296  7389428.907198 
+350988.806286  7389433.986328 
+350980.782704  7389440.665184 
+350966.879559  7389452.483159 
+350955.606961  7389457.352325 
+350943.485002  7389465.200981 
+350929.656074  7389470.260114 
+350912.330743  7389477.278912 
+350898.716216  7389481.348215 
+350890.338046  7389482.927944 
+350881.630026  7389486.047410 
+350877.836760  7389487.227208 
+350872.559173  7389494.705927 
+350868.600982  7389502.754548 
+350864.040816  7389522.891099 
+350855.852309  7389577.441755 
+350885.678926  7389595.798611 
+350887.971378  7389614.145468 
+350878.793323  7389639.391144 
+350899.450131  7389639.391144 
+350959.103363  7389602.677432 
+350968.165971  7389604.647095 
+350975.719518  7389606.286814 
+350973.163186  7389596.958412 
+350970.689317  7389589.069763 
+350971.703604  7389579.881337 
+350971.761327  7389574.122324 
+350974.482583  7389568.063362 
+350979.850880  7389561.584471 
+350981.821729  7389559.054905 
+350984.427538  7389553.435867 
+350989.705125  7389546.067129 
+350996.780391  7389542.597724 
+351004.243230  7389541.567900 
+351014.757174  7389541.447921 
+351025.584475  7389540.568071 
+351034.482158  7389538.778378 
+351046.554639  7389535.688907 
+351065.809588  7389528.910068 
+351075.416446  7389528.010222 
+351082.623652  7389532.069527 
+351087.563144  7389537.768551 
+351090.581265  7389542.007825 
+351098.200782  7389545.517223 
+351106.133656  7389547.916812 
+351112.738886  7389551.316230 
+351118.519494  7389555.025595 
+351122.964212  7389559.274867 
+351124.547489  7389564.274011 
+351125.001031  7389569.373137 
+351122.725072  7389582.200940 
+351121.702539  7389586.310236 
+351119.756429  7389593.578991 
+351118.783373  7389599.108044 
+351118.907067  7389606.416792 
+351121.479891  7389614.525403 
+351125.767931  7389624.203745 
+351133.041106  7389632.142385 
+351140.198834  7389640.191007 
+351156.188276  7389653.858666 
+351174.395953  7389670.105883 
+351193.890042  7389689.462567 
+351208.024082  7389704.559981 
+351219.626528  7389717.737724 
+351248.999602  7389750.492113 
+351262.919239  7389766.249414 
+351273.837248  7389776.767612 
+351292.234589  7389793.784698 
+351310.326819  7389811.691630 
+351317.459808  7389822.729739 
+351332.088622  7389838.936963 
+351348.069817  7389853.604451 
+351358.798163  7389862.572915 
+351367.176333  7389871.071459 
+351380.395041  7389886.158875 
+351386.357065  7389891.977878 
+351395.287733  7389896.717066 
+351401.563115  7389902.546068 
+351407.846743  7389906.485393 
+351413.198546  7389912.294398 
+351418.063822  7389915.673819 
+351427.225385  7389918.083406 
+351440.773942  7389920.113059 
+351456.870584  7389923.042557 
+351467.161880  7389925.032216 
+351473.791849  7389925.092206 
+351481.559798  7389923.732439 
+351491.389305  7389921.062896 
+351511.642048  7389916.623656 
+351521.257153  7389914.614001 
+351529.008609  7389914.913949 
+351534.294443  7389916.853617 
+351542.515935  7389921.802769 
+351565.242547  7389944.848822 
+351572.928034  7389952.237556 
+351584.522234  7389965.865222 
+351598.491349  7389977.413244 
+351611.470916  7389985.961779 
+351617.053614  7389988.571332 
+351622.446649  7389990.281039 
+351627.138754  7389990.331031 
+351634.708794  7389988.751301 
+351651.382672  7389984.931956 
+351665.698129  7389982.532367 
+351679.263178  7389983.332230 
+351687.212544  7389984.412045 
+351693.314755  7389986.571675 
+351700.835317  7389989.861111 
+351705.906749  7389992.790610 
+351709.650538  7389995.600128 
+351713.113955  7389996.519971 
+351718.836839  7389996.140036 
+351723.941256  7389995.750103 
+351726.299678  7389994.330346 
+351728.880748  7389992.030740 
+351732.500843  7389986.971606 
+351738.916411  7389978.403074 
+351745.472164  7389975.693538 
+351753.454515  7389973.893846 
+351759.383555  7389973.183968 
+351764.487972  7389973.233959 
+351773.130022  7389975.753528 
+351778.729212  7389977.583214 
+351785.705523  7389984.192082 
+351792.978699  7389991.570819 
+351799.641653  7389998.399649 
+351805.727371  7390002.668918 
+351815.779526  7390007.418104 
+351827.843762  7390015.626698 
+351837.656776  7390023.695316 
+351842.010786  7390027.504663 
+351850.248771  7390030.364174 
+351862.156328  7390034.023547 
+351869.874799  7390037.532946 
+351885.006633  7390045.221629 
+351895.075280  7390048.531062 
+351902.505134  7390050.710688 
+351910.965767  7390051.690521 
+351925.751258  7390053.050288 
+351928.794117  7390054.520036 
+351930.806198  7390057.539519 
+351933.403760  7390062.658642 
+351936.817700  7390068.777594 
+351940.330594  7390074.136676 
+351944.461956  7390079.825701 
+351948.914920  7390083.185126 
+351953.293669  7390084.344927 
+351959.404126  7390085.844670 
+351966.438160  7390086.574545 
+351973.892753  7390086.434569 
+351983.087300  7390085.084800 
+351991.580918  7390083.065146 
+352001.600088  7390081.615395 
+352010.052474  7390083.035152 
+352014.925997  7390085.854669 
+352019.585117  7390089.444054 
+352025.637850  7390096.042923 
+352028.878619  7390098.622482 
+352033.150166  7390099.882266 
+352039.672935  7390101.052065 
+352050.871316  7390103.711610 
+352064.716737  7390107.400978 
+352076.649033  7390108.180844 
+352086.429062  7390109.940543 
+352094.658801  7390113.349959 
+352100.447655  7390116.399437 
+352104.686217  7390121.088633 
+352106.467403  7390126.977625 
+352109.980297  7390132.326708 
+352114.350799  7390134.476340 
+352119.760327  7390134.316368 
+352126.093432  7390133.936433 
+352132.640939  7390132.336707 
+352144.202154  7390129.907123 
+352164.141540  7390126.127770 
+352179.834117  7390128.167421 
+352188.105086  7390128.247407 
+352195.155614  7390126.877642 
+352198.858171  7390124.148109 
+352200.334246  7390119.508904 
+352196.705905  7390105.191356 
+352195.452478  7390097.982591 
+352196.846091  7390091.233747 
+352199.039588  7390085.944653 
+352201.224839  7390082.205294 
+352204.721241  7390079.245801 
+352211.309979  7390073.446794 
+352213.280829  7390070.477303 
+352214.765150  7390065.058231 
+352216.909170  7390055.119933 
+352218.583155  7390051.150613 
+352220.949823  7390048.841009 
+352225.254355  7390047.451247 
+352230.152616  7390047.051315 
+352236.477475  7390047.781190 
+352254.025454  7390047.961159 
+352267.722443  7390045.991497 
+352277.774598  7390041.442276 
+352285.789935  7390035.663266 
+352291.529311  7390033.613617 
+352298.052080  7390034.233511 
+352305.778798  7390037.083023 
+352314.396109  7390043.481927 
+352319.945822  7390049.290932 
+352326.946872  7390053.350236 
+352335.811570  7390055.099937 
+352351.726795  7390055.479871 
+352370.693125  7390057.339553 
+352401.880370  7390061.418854 
+352449.708507  7390065.558145 
+352473.729777  7390071.887061 
+352498.031419  7390080.775539 
+352521.599146  7390092.193583 
+352537.003105  7390102.651791 
+352547.954099  7390109.960539 
+352558.418566  7390114.489764 
+352576.725198  7390120.548726 
+352589.317192  7390127.207585 
+352600.499081  7390131.416864 
+352608.951467  7390133.606489 
+352615.680392  7390134.006421 
+352622.524763  7390133.746465 
+352627.950783  7390132.026760 
+352640.699455  7390122.748349 
+Region 1
+198
+328374.697948  7391220.110381 
+328479.062243  7391217.660800 
+328563.718047  7391213.771467 
+328586.873462  7391215.191223 
+328609.220747  7391216.231045 
+328632.689520  7391217.620807 
+328669.344015  7391225.689425 
+328695.096993  7391231.858369 
+328708.323947  7391235.887678 
+328727.727328  7391243.876310 
+328762.509929  7391263.442958 
+328836.091045  7391317.683667 
+328856.286064  7391328.221862 
+328952.181480  7391391.311056 
+329044.786650  7391455.140122 
+329121.385887  7391503.891772 
+329192.476641  7391554.113169 
+329212.440766  7391567.450885 
+329255.156240  7391597.045815 
+329276.538716  7391602.834824 
+329302.448373  7391606.634173 
+329321.596121  7391607.574012 
+329340.677898  7391609.233728 
+329370.933319  7391606.264236 
+329404.709879  7391607.214073 
+329417.235904  7391609.463688 
+329439.418264  7391615.922582 
+329470.308644  7391628.130491 
+329472.856729  7391593.276461 
+329474.926533  7391573.469854 
+329485.481708  7391517.889374 
+329503.978004  7391411.327627 
+329521.756877  7391313.744342 
+329527.215882  7391291.428165 
+329543.898006  7391183.196704 
+329547.419147  7391152.122027 
+329558.535066  7391100.580855 
+329558.765960  7391099.081112 
+329586.671205  7390947.337104 
+329588.922426  7390912.033152 
+329591.313833  7390864.321324 
+329583.422190  7390823.248360 
+329532.287314  7390699.719519 
+329530.547359  7390695.370264 
+329511.952109  7390647.118529 
+329493.447567  7390599.246729 
+329474.662654  7390546.525760 
+329468.123393  7390520.980136 
+329462.548941  7390502.603283 
+329460.850218  7390496.864266 
+329446.889349  7390442.423592 
+329436.779470  7390407.749531 
+329424.756466  7390370.725873 
+329404.033688  7390283.320844 
+329372.277454  7390162.451548 
+329365.482560  7390131.796799 
+329360.493591  7390113.799882 
+329357.467224  7390103.261687 
+329353.459556  7390068.967561 
+329344.891722  7389999.999375 
+329343.951652  7389978.463064 
+329337.321682  7389930.331308 
+329330.823653  7389873.611024 
+329328.992989  7389856.913884 
+329321.340487  7389748.372476 
+329315.873237  7389695.391551 
+329308.962895  7389631.062570 
+329304.221313  7389600.217854 
+329279.738254  7389518.331880 
+329255.345904  7389427.987355 
+329238.474116  7389374.726478 
+329234.128352  7389362.398590 
+329226.236709  7389313.546958 
+329224.958544  7389292.110630 
+329223.804071  7389267.674815 
+329226.640775  7389247.018354 
+329226.682006  7389231.930938 
+329229.452739  7389149.984975 
+329228.430207  7389063.709753 
+329224.603956  7389003.320097 
+329216.481419  7388942.070588 
+329207.212655  7388865.033784 
+329198.026354  7388826.670355 
+329173.427848  7388746.374109 
+329163.746774  7388720.938466 
+329134.142806  7388619.945765 
+329130.357786  7388609.337583 
+329111.119330  7388543.218908 
+329097.075999  7388502.625861 
+329088.912230  7388478.939919 
+329055.539735  7388390.215116 
+329012.906723  7388275.254808 
+328986.312629  7388192.758939 
+328960.468942  7388116.581987 
+328929.636285  7387999.342069 
+328923.113517  7387969.287217 
+328910.711186  7387936.482836 
+328887.242414  7387852.937147 
+328849.491170  7387736.157150 
+328817.396840  7387632.704871 
+328813.446896  7387623.056524 
+328803.435972  7387598.610711 
+328788.295892  7387567.316071 
+328760.959638  7387523.133639 
+328702.716511  7387423.980623 
+328666.828915  7387377.298620 
+328638.033077  7387326.757277 
+328577.736639  7387228.914037 
+328526.074004  7387145.348351 
+328513.836598  7387125.711714 
+328457.770475  7387042.865905 
+328439.076271  7387008.751748 
+328421.676724  7386987.615369 
+328389.293776  7386938.503781 
+328382.738023  7386930.095222 
+328374.046496  7386909.598732 
+328330.729046  7386841.340424 
+328306.880947  7386804.066809 
+328296.738083  7386789.989220 
+328241.199720  7386687.776729 
+328211.430827  7386641.564644 
+328178.379935  7386588.683702 
+328128.993260  7386509.677235 
+328025.865899  7386341.556033 
+327991.000836  7386281.996235 
+327884.583229  7386123.873320 
+327838.288891  7386174.204699 
+327814.317098  7386188.692217 
+327793.099547  7386197.130772 
+327770.298719  7386203.059756 
+327742.583138  7386202.979770 
+327718.924702  7386193.261435 
+327699.026547  7386200.110261 
+327615.162382  7386198.190590 
+327550.627381  7386191.981654 
+327490.759746  7386188.902181 
+327460.586788  7386194.431234 
+327449.850196  7386192.871501 
+327415.257258  7386206.799116 
+327376.351542  7386222.096495 
+327327.335947  7386242.383020 
+327253.977479  7386281.536314 
+327176.561866  7386321.019551 
+327127.026759  7386347.694981 
+327067.678637  7386380.759318 
+327000.702751  7386416.073269 
+326979.559416  7386434.350138 
+326962.836060  7386453.616838 
+326924.392133  7386496.289529 
+326854.233202  7386589.153622 
+326763.062876  7386705.723654 
+326706.543212  7386745.806789 
+326616.106800  7386772.642192 
+326560.436497  7386791.488964 
+326475.186965  7386824.303343 
+326512.962947  7387026.518705 
+326538.542755  7387161.385604 
+326584.243365  7387461.304230 
+326617.929217  7387624.406292 
+326633.341422  7387701.123151 
+326682.670374  7387922.005316 
+326705.322769  7388085.307344 
+326728.527663  7388202.547262 
+326765.190404  7388338.873911 
+326817.735386  7388511.764296 
+326844.172801  7388598.099508 
+326938.171584  7388890.539415 
+327007.431675  7389127.458833 
+327107.623378  7389441.205091 
+327122.384131  7389496.095689 
+327144.277873  7389577.651719 
+327186.704730  7389699.290883 
+327212.903004  7389782.366653 
+327244.354128  7389902.246119 
+327270.643111  7389992.270699 
+327326.197967  7390145.214501 
+327376.128894  7390317.035069 
+327394.386049  7390396.111524 
+327404.850515  7390434.334977 
+327406.870842  7390496.824273 
+327403.588842  7390517.900663 
+327509.437459  7390521.899978 
+327534.918311  7390520.920146 
+327587.364338  7390541.876556 
+327606.404885  7390557.643855 
+327652.039525  7390618.353456 
+327684.678106  7390648.008377 
+327697.426779  7390658.606561 
+327867.389838  7390845.074621 
+327944.912653  7390923.891121 
+328000.046951  7390984.240783 
+328016.572397  7391002.267695 
+328038.861959  7391025.233761 
+328140.397796  7391133.435227 
+328228.096459  7391227.759071 
+328304.390585  7391222.739930 
+328311.861670  7391223.599783 
+328374.697948  7391220.110381 
+Region 1
+511
+360200.142783  7400752.597552 
+360204.232913  7400745.178823 
+360215.348832  7400730.441347 
+360229.977645  7400717.523560 
+360244.895077  7400702.586119 
+360253.718543  7400687.818648 
+360263.886146  7400668.022039 
+360270.582085  7400660.293363 
+360282.984416  7400643.556230 
+360292.813923  7400629.818583 
+360307.912771  7400601.253476 
+360325.031946  7400573.978148 
+360337.970282  7400554.981402 
+360345.680508  7400547.772637 
+360366.320823  7400540.493884 
+360418.956513  7400475.105084 
+360424.555704  7400454.988530 
+360441.320291  7400429.092965 
+360447.793582  7400414.265505 
+360451.949682  7400403.447358 
+360454.398812  7400384.540597 
+360459.923787  7400362.134435 
+360469.035872  7400335.958919 
+360483.013233  7400303.784430 
+360500.800352  7400272.139850 
+360520.319180  7400244.304618 
+360554.953349  7400199.682261 
+360583.213181  7400158.799264 
+360599.326316  7400143.551876 
+360607.894150  7400121.665625 
+360615.719823  7400096.999850 
+360623.825867  7400069.814507 
+360631.057812  7400026.221974 
+360634.554213  7400003.535860 
+360634.273842  7399978.300182 
+360634.232610  7399954.574246 
+360634.463505  7399928.328742 
+360633.135862  7399907.122374 
+360628.245847  7399886.125971 
+360623.355832  7399866.149393 
+360621.772556  7399844.933027 
+360616.198104  7399815.108136 
+360618.366863  7399800.230684 
+360608.644557  7399752.698826 
+360599.977768  7399700.887700 
+360592.844779  7399647.066919 
+360589.018528  7399621.041377 
+360583.650232  7399597.275448 
+360578.578800  7399569.210256 
+360574.299006  7399559.731879 
+360569.854288  7399550.283498 
+360567.627805  7399540.275212 
+360564.024203  7399523.148146 
+360562.754283  7399512.599952 
+360557.418972  7399467.317709 
+360557.633374  7399442.841901 
+360556.751027  7399428.694325 
+360560.197952  7399411.317301 
+360561.311193  7399400.729115 
+360562.003876  7399379.532746 
+360563.298534  7399347.998147 
+360561.187499  7399328.801435 
+360561.500856  7399293.977401 
+360560.189705  7399270.241466 
+360559.167173  7399258.323508 
+360557.905500  7399241.696356 
+360556.272746  7399226.288995 
+360553.328842  7399214.910944 
+360551.184822  7399199.493585 
+360552.248585  7399193.954534 
+360557.179831  7399181.126731 
+360561.278208  7399176.367546 
+360562.111077  7399168.548885 
+360562.927454  7399162.499921 
+360555.951143  7399148.052396 
+360543.590043  7399141.133581 
+360533.768782  7399133.214938 
+360521.110818  7399130.585388 
+360494.500232  7399128.835688 
+360476.960499  7399133.474893 
+360457.919953  7399135.324576 
+360437.089974  7399138.674003 
+360420.341880  7399140.033770 
+360401.540474  7399144.163062 
+360357.035567  7399158.150666 
+360324.998961  7399167.209115 
+360305.702781  7399170.058627 
+360290.199868  7399172.958130 
+360270.631562  7399177.577339 
+360249.282071  7399182.936421 
+360228.179967  7399188.555458 
+360210.401094  7399192.184837 
+360199.450100  7399197.383946 
+360179.098402  7399204.022809 
+360169.681207  7399207.722175 
+360153.419640  7399211.871465 
+360126.256556  7399214.151074 
+360102.862000  7399221.519812 
+360094.137488  7399220.979904 
+360074.222841  7399219.750115 
+360058.249892  7399218.850269 
+360042.796456  7399217.200552 
+360022.040693  7399212.221405 
+360006.603750  7399208.801990 
+359989.913379  7399203.612879 
+359968.143330  7399199.373605 
+359950.653075  7399197.963847 
+359933.426699  7399196.044176 
+359913.899625  7399195.864206 
+359899.204842  7399194.224487 
+359891.107043  7399192.134845 
+359873.600296  7399193.494612 
+359862.929673  7399195.664241 
+359848.680186  7399200.593396 
+359839.988659  7399208.592026 
+359824.221866  7399213.501185 
+359812.363787  7399207.102281 
+359795.087934  7399209.201922 
+359782.825789  7399191.424967 
+359774.851684  7399175.707659 
+359766.415790  7399154.691259 
+359752.421936  7399131.095301 
+359741.611128  7399120.147176 
+359725.984521  7399109.658973 
+359707.042929  7399100.150601 
+359691.886357  7399093.451749 
+359667.370313  7399084.913211 
+359651.182963  7399079.974057 
+359634.236959  7399074.774948 
+359614.841824  7399059.457572 
+359605.820448  7399047.519616 
+359602.159121  7399031.332389 
+359604.542282  7399020.504244 
+359621.430562  7399003.497157 
+359632.637190  7398997.538178 
+359652.584822  7398979.541261 
+359678.395524  7398956.805155 
+359694.022131  7398939.778072 
+359708.395311  7398920.471379 
+359718.975225  7398900.124864 
+359724.467214  7398880.998140 
+359726.998807  7398853.502850 
+359722.199501  7398822.428173 
+359712.295778  7398796.092684 
+359703.076492  7398776.825984 
+359687.359176  7398748.170892 
+359675.105278  7398728.884196 
+359652.964148  7398708.747645 
+359635.581094  7398695.469919 
+359614.751116  7398692.730389 
+359598.885368  7398703.408560 
+359586.581992  7398714.626638 
+359573.000450  7398725.834718 
+359542.547120  7398747.201058 
+359528.231664  7398755.629615 
+359513.973931  7398757.999209 
+359501.538615  7398757.109361 
+359486.060440  7398754.419822 
+359472.132556  7398749.480668 
+359455.186552  7398741.482038 
+359439.518714  7398732.993492 
+359420.321489  7398721.695427 
+359402.369445  7398712.926929 
+359363.686377  7398693.350282 
+359350.055358  7398684.121863 
+359341.231891  7398676.963089 
+359325.300174  7398668.724501 
+359321.028626  7398664.645199 
+359303.521878  7398661.935664 
+359294.879829  7398662.095636 
+359278.601769  7398662.935492 
+359260.039504  7398664.755181 
+359238.426134  7398666.034961 
+359210.974432  7398666.754838 
+359186.103800  7398663.215444 
+359156.673003  7398658.616232 
+359139.141517  7398658.426265 
+359126.458814  7398643.298856 
+359101.810831  7398629.211269 
+359088.600369  7398618.653077 
+359072.544958  7398609.544638 
+359052.531356  7398604.035581 
+359030.497428  7398574.630618 
+359011.127032  7398560.543031 
+358997.924817  7398544.695746 
+358975.033281  7398527.968611 
+358963.117477  7398524.639181 
+358942.749288  7398502.992889 
+358931.930233  7398492.024768 
+358926.149625  7398485.655859 
+358915.858329  7398473.187994 
+358903.530215  7398460.700133 
+358895.267492  7398448.502223 
+358888.019055  7398436.574266 
+358872.524387  7398410.428744 
+358861.284775  7398390.892091 
+358852.312876  7398372.885175 
+358843.093590  7398355.128217 
+358834.641204  7398335.871515 
+358829.676973  7398323.963555 
+358826.526913  7398309.046110 
+358832.348752  7398285.650118 
+358834.954561  7398271.782493 
+358828.571978  7398269.252927 
+358819.105305  7398267.603209 
+358809.094381  7398268.263096 
+358793.137925  7398266.063473 
+358785.757549  7398261.104322 
+358781.246860  7398254.175509 
+358775.845579  7398244.437177 
+358764.267872  7398232.719184 
+358757.720364  7398227.100147 
+358752.681917  7398222.750892 
+358746.851832  7398221.181161 
+358727.555653  7398219.971368 
+358716.645890  7398218.081692 
+358708.028578  7398215.472139 
+358700.450293  7398211.352844 
+358691.610333  7398205.963767 
+358686.093605  7398198.595030 
+358682.143660  7398186.697068 
+358676.618686  7398180.578116 
+358659.425295  7398171.419684 
+358654.584758  7398168.120250 
+358646.882778  7398159.641702 
+358644.458386  7398157.332098 
+358642.372090  7398153.372776 
+358639.180799  7398147.423795 
+358638.521100  7398143.464473 
+358638.298452  7398135.105905 
+358637.531553  7398130.586679 
+358635.989508  7398126.847319 
+358631.990086  7398120.328436 
+358626.456865  7398114.719397 
+358622.193564  7398108.870399 
+358614.400876  7398100.211882 
+358606.113414  7398090.543538 
+358591.517586  7398076.265983 
+358577.927798  7398062.748299 
+358567.372622  7398051.540219 
+358555.283648  7398040.822055 
+358539.549840  7398038.132515 
+358524.244836  7398044.271464 
+358513.029962  7398047.680880 
+358488.967461  7398065.087898 
+358477.216583  7398071.266840 
+358469.860945  7398070.177026 
+358464.302985  7398066.847597 
+358446.524112  7398120.768361 
+358281.723193  7398090.663517 
+358267.473706  7398092.253245 
+358194.733706  7398165.740657 
+358179.519410  7398174.649131 
+358154.953889  7398171.479674 
+358147.029261  7398159.601709 
+358141.487794  7398144.544288 
+358134.346559  7398124.737681 
+358128.013453  7398111.269988 
+358115.338997  7398097.792296 
+358099.168139  7398089.283754 
+358012.970290  7398058.219075 
+357992.527884  7398054.219760 
+357957.662821  7398052.630032 
+357872.099932  7398051.050303 
+357819.010699  7398051.840167 
+357768.296380  7398052.630032 
+357708.090650  7398055.009624 
+357620.136354  7398057.389217 
+357587.646205  7398055.799489 
+357560.714016  7398044.711388 
+357512.382858  7398018.565867 
+357478.779468  7398013.126799 
+357448.309646  7397975.643219 
+357442.059003  7397952.217232 
+357440.500466  7397927.211515 
+357443.634033  7397905.345261 
+357482.679936  7397756.920684 
+357491.552880  7397728.695519 
+357413.832156  7397706.869258 
+357362.779742  7397676.664432 
+357215.262922  7398052.630032 
+357200.213551  7398185.747230 
+357201.582425  7398233.219099 
+357191.909597  7398268.283093 
+357182.277999  7398292.278982 
+357171.920734  7398312.845460 
+357158.133036  7398332.642069 
+357144.741157  7398350.529005 
+357120.983767  7398376.694523 
+357017.782190  7398499.293523 
+356968.576932  7398531.178061 
+356926.150075  7398576.070371 
+356901.287690  7398607.265028 
+356885.603359  7398627.821507 
+356872.557822  7398650.667594 
+356861.812984  7398671.614006 
+356853.319366  7398695.999829 
+356849.839457  7398708.187741 
+356852.148402  7398724.534941 
+356855.323200  7398746.371200 
+356871.197194  7398797.612423 
+356879.179546  7398827.447313 
+356883.335646  7398843.384583 
+356893.503248  7398868.720243 
+356906.243675  7398890.796462 
+356919.256227  7398910.353112 
+356927.024176  7398921.791153 
+356932.433703  7398939.508118 
+356937.109316  7398954.435561 
+356937.942185  7398972.862405 
+356935.476562  7398990.989300 
+356933.761346  7399009.636106 
+356935.872381  7399027.573033 
+356941.051014  7399043.010389 
+356943.648577  7399063.216928 
+356947.004793  7399083.183508 
+356945.602933  7399096.031307 
+356942.180748  7399108.609152 
+356930.108266  7399131.805179 
+356927.147869  7399137.704169 
+356910.177127  7399157.200829 
+356892.002434  7399170.628529 
+356872.285697  7399185.805929 
+356850.796020  7399199.953506 
+356831.318423  7399216.900603 
+356814.388911  7399232.617911 
+356802.588555  7399243.845988 
+356788.198883  7399259.833249 
+356765.678427  7399275.740524 
+356746.951237  7399293.447491 
+356729.444490  7399315.713677 
+356718.312078  7399336.780069 
+356706.635416  7399360.875941 
+356697.160497  7399393.560343 
+356691.899401  7399411.417284 
+356684.700442  7399444.631595 
+356679.365131  7399470.057240 
+356670.953976  7399498.212417 
+356669.189282  7399520.128663 
+356668.917157  7399523.668057 
+356664.126097  7399545.814263 
+356653.381258  7399578.238709 
+356646.982183  7399600.624875 
+356626.803657  7399644.047437 
+356610.195748  7399678.431547 
+356599.516879  7399704.297116 
+356586.520820  7399745.580045 
+356581.589574  7399769.685916 
+356575.305946  7399788.282730 
+356570.185037  7399817.487728 
+356562.342872  7399839.104025 
+356554.253319  7399860.460367 
+356543.863069  7399882.796541 
+356537.760858  7399908.202189 
+356528.624035  7399932.578014 
+356522.579548  7399952.944525 
+356514.127161  7399984.889054 
+356506.045855  7400005.485526 
+356485.677665  7400034.530550 
+356467.667898  7400056.536781 
+356450.202381  7400077.003275 
+356433.470779  7400097.039843 
+356425.719322  7400109.317740 
+356412.451137  7400140.702364 
+356408.410484  7400168.917531 
+356404.798635  7400194.093219 
+356403.347299  7400212.240110 
+356397.979002  7400240.435281 
+356392.421043  7400263.081402 
+356379.235320  7400286.917319 
+356370.659240  7400304.724269 
+356348.509865  7400337.868591 
+356337.855735  7400358.105125 
+356327.778841  7400374.392335 
+356313.067565  7400414.495466 
+356311.698691  7400440.491013 
+356308.763033  7400476.574832 
+356308.622847  7400511.908780 
+356314.065359  7400547.272722 
+356321.536444  7400585.156233 
+356330.021816  7400621.530003 
+356340.791393  7400657.663813 
+356349.771538  7400698.586804 
+356358.281648  7400728.901611 
+356369.092456  7400755.437066 
+356376.629511  7400775.663601 
+356403.033942  7400810.757590 
+356416.244403  7400834.603505 
+356426.816071  7400857.349609 
+356438.129899  7400884.904889 
+356447.662542  7400913.709955 
+356465.441415  7400975.609352 
+356471.378701  7400998.455439 
+356477.447927  7401019.821779 
+356484.267560  7401027.920392 
+356492.093233  7401039.558398 
+356497.337836  7401061.534634 
+356501.015654  7401093.349184 
+357046.808922  7401127.353360 
+357338.387392  7401144.500423 
+357401.693704  7401161.747468 
+357445.456450  7401181.944009 
+357516.844069  7401226.606359 
+357576.678719  7401300.513699 
+357707.249535  7401412.134579 
+358069.176598  7401832.972494 
+358127.353755  7401904.070315 
+358186.165872  7401945.723180 
+358248.276481  7401982.366904 
+358283.496132  7402010.452093 
+358351.981078  7402049.375426 
+358393.641035  7402072.261506 
+358439.778696  7402095.147585 
+358480.811939  7402119.133477 
+358523.576891  7402143.569291 
+358564.799798  7402164.825650 
+358591.929897  7402179.033217 
+358646.899271  7402210.497827 
+358692.121600  7402234.173771 
+358734.268084  7402258.919533 
+358780.216082  7402284.505150 
+358828.778134  7402312.430367 
+358872.491403  7402335.306448 
+358917.656008  7402361.651936 
+358962.523749  7402388.397354 
+359009.898344  7402414.352908 
+359057.602788  7402437.518940 
+359087.957163  7402451.566534 
+359131.703417  7402472.173004 
+359176.727836  7402484.800841 
+359242.161676  7402503.897570 
+359253.566213  7402508.076854 
+359268.186780  7402470.003376 
+359279.682026  7402451.106613 
+359290.146492  7402435.489288 
+359302.185989  7402406.754210 
+359311.042441  7402385.007935 
+359327.023636  7402350.793796 
+359340.357791  7402315.749798 
+359353.708438  7402277.176406 
+359368.823779  7402241.122581 
+359376.006246  7402220.696080 
+359391.377220  7402185.412124 
+359401.363405  7402169.844790 
+359414.202786  7402149.858214 
+359417.427062  7402144.599115 
+359434.513252  7402122.692867 
+359441.926614  7402109.335155 
+359458.501537  7402088.438735 
+359469.477270  7402073.071367 
+359478.927451  7402057.204085 
+359481.492028  7402051.155121 
+359490.191802  7402034.268014 
+359501.390183  7402024.459694 
+359508.275785  7402017.920814 
+359517.956860  7402007.092668 
+359532.041422  7401976.087979 
+359538.951763  7401960.710613 
+359548.410190  7401942.823677 
+359557.357350  7401927.196354 
+359562.742139  7401912.578858 
+359585.509982  7401880.634330 
+359595.644599  7401862.857375 
+359617.645542  7401830.602900 
+359628.274934  7401814.095727 
+359641.402933  7401800.148116 
+359662.579253  7401772.422865 
+359675.781469  7401752.676248 
+359685.676945  7401734.129425 
+359695.869286  7401712.313161 
+359701.410753  7401696.745828 
+359715.264421  7401666.650983 
+359726.941083  7401647.124328 
+359748.257590  7401609.310805 
+359762.103011  7401580.225787 
+359779.683975  7401555.739981 
+359798.213255  7401536.313309 
+359820.139982  7401509.617881 
+359839.980413  7401486.421855 
+359857.849995  7401459.416480 
+359870.178110  7401438.220111 
+359885.615054  7401414.124239 
+359900.194389  7401386.818916 
+359913.338881  7401371.601522 
+359925.172222  7401359.153655 
+359940.097899  7401343.206386 
+359953.563994  7401323.209811 
+359966.856918  7401296.894319 
+359973.231254  7401276.277850 
+359983.712213  7401252.201974 
+359986.664364  7401240.374000 
+360005.119428  7401207.819577 
+360024.250683  7401180.834199 
+360042.549069  7401160.137744 
+360063.997515  7401130.662793 
+360091.069890  7401094.129051 
+360101.996146  7401078.441738 
+360113.944934  7401057.915254 
+360132.334028  7401030.409965 
+360144.530203  7401010.133439 
+360153.180499  7400989.806920 
+360159.134278  7400962.631575 
+360164.873654  7400932.926663 
+360165.351936  7400898.352586 
+360166.910473  7400877.176213 
+360168.972031  7400856.499755 
+360173.862046  7400832.843807 
+360177.498634  7400808.407992 
+360180.475523  7400794.820320 
+360186.528256  7400779.003029 
+360200.142783  7400752.597552 
+Region 1
+309
+352533.638643  7397733.664668 
+352562.261310  7397751.121678 
+352590.273755  7397768.678670 
+352651.881344  7397811.391354 
+352673.610162  7397878.929785 
+352672.538152  7397904.285442 
+352667.590414  7397961.275680 
+352636.807235  7398005.008189 
+352612.200482  7398043.091666 
+352594.743212  7398072.456636 
+352592.368298  7398093.093101 
+352589.828459  7398100.141894 
+352590.933453  7398105.111043 
+352587.750408  7398121.518232 
+352588.179212  7398148.033690 
+352595.213247  7398195.295595 
+352595.823468  7398215.932060 
+352604.119176  7398285.270183 
+352623.926622  7398489.635177 
+352629.987602  7398546.215485 
+352634.580752  7398595.906974 
+352631.249275  7398647.788087 
+352612.010819  7398748.190889 
+352611.582015  7398754.679777 
+352610.262618  7398777.205919 
+352611.301643  7398792.113365 
+352613.000367  7398823.168046 
+352615.383527  7398847.763833 
+352618.179000  7398891.476345 
+352623.101999  7398898.765097 
+352619.539628  7398913.272612 
+352559.540053  7398911.352941 
+352481.646159  7398899.764926 
+352458.936040  7398897.365337 
+352425.110001  7398895.185710 
+352364.739347  7398891.356366 
+352345.731785  7398890.296547 
+352303.511084  7398886.657171 
+352289.129658  7398884.987457 
+352253.753329  7398881.448063 
+352184.443760  7398874.529248 
+352154.699606  7398872.609577 
+352044.010452  7398860.461658 
+351960.377181  7398859.131886 
+351852.739132  7398841.814852 
+351843.346675  7398840.795027 
+351816.233069  7398838.645395 
+351789.276141  7398836.265802 
+351690.849132  7398794.203007 
+351639.747241  7398770.517065 
+351580.300164  7398746.451187 
+351546.218493  7398729.334119 
+351521.628233  7398720.465638 
+351473.989759  7398701.448895 
+351465.578603  7398699.569217 
+351459.476393  7398699.429241 
+351452.137247  7398699.269269 
+351441.161514  7398695.499914 
+351380.782614  7398693.580243 
+351314.268517  7398692.770382 
+351210.539182  7398692.970348 
+351202.853695  7398693.040336 
+351138.038322  7398693.530252 
+351111.089640  7398692.180483 
+351076.678120  7398691.450608 
+351018.030927  7398690.840712 
+350954.592675  7398689.290978 
+350923.586848  7398688.651087 
+350892.572774  7398688.271153 
+350826.157633  7398688.451122 
+350774.536229  7398689.640918 
+350713.398675  7398686.571444 
+350651.189111  7398681.572300 
+350583.141216  7398677.273036 
+350521.203777  7398664.465230 
+350397.271177  7398641.129227 
+350314.866594  7398627.171618 
+350217.800213  7398611.154362 
+350183.858728  7398600.996102 
+350151.079961  7398588.558232 
+350062.169102  7398430.395324 
+350026.817511  7398374.024980 
+350010.861055  7398344.300072 
+350004.066161  7398328.832721 
+349997.048619  7398316.354858 
+349982.997042  7398298.447926 
+349965.556264  7398280.710964 
+349950.770772  7398268.373077 
+349935.869833  7398261.124319 
+349915.823247  7398250.956061 
+349891.216494  7398239.967943 
+349860.961074  7398228.009991 
+349850.950150  7398223.160822 
+349836.453277  7398223.350789 
+349820.397866  7398224.400609 
+349799.823520  7398231.979311 
+349786.208993  7398232.249265 
+349775.662064  7398234.688847 
+349745.992127  7398240.137914 
+349725.186887  7398247.676622 
+349706.187571  7398250.226186 
+349681.011829  7398252.985713 
+349661.088936  7398256.055187 
+349648.686605  7398258.074841 
+349630.008892  7398259.754554 
+349588.736508  7398262.134146 
+349566.183067  7398264.023822 
+349544.314064  7398266.893331 
+349526.543437  7398269.342911 
+349515.971769  7398273.662171 
+349504.666187  7398280.301034 
+349496.015891  7398288.069703 
+349490.812519  7398296.988176 
+349479.003917  7398313.485350 
+349455.782531  7398357.317842 
+349432.750809  7398440.303627 
+349419.078559  7398461.789947 
+349410.296323  7398471.548275 
+349395.651017  7398483.266268 
+349382.960069  7398489.125264 
+349369.287818  7398494.984261 
+349358.551226  7398498.883593 
+349348.787689  7398502.792923 
+349336.096740  7398505.722421 
+349296.572556  7398517.010488 
+349400.978082  7397946.868148 
+349420.513403  7397840.196420 
+349439.883799  7397734.424538 
+349485.666871  7397479.588189 
+349504.542493  7397377.255718 
+349508.665609  7397350.580287 
+349528.473055  7397227.991285 
+349557.796651  7397071.808038 
+349564.772962  7397028.975375 
+349576.053805  7396970.225438 
+349585.578202  7396896.428079 
+349593.519322  7396861.504061 
+349599.811196  7396825.810175 
+349607.570899  7396790.106291 
+349608.593431  7396721.048120 
+349605.418633  7396657.558995 
+349598.269151  7396621.065246 
+349595.102598  7396588.520821 
+349581.801428  7396531.910518 
+349572.499680  7396487.558115 
+349562.628942  7396463.452244 
+349552.469586  7396442.385852 
+349542.837988  7396422.829202 
+349533.396054  7396403.672484 
+349505.416594  7396377.436977 
+349486.549218  7396329.155248 
+349468.506465  7396313.287966 
+349449.432934  7396287.542376 
+349450.117371  7396152.125571 
+349463.616450  7396129.989363 
+349485.716349  7396101.494244 
+349508.616131  7396063.180807 
+349625.061154  7396003.940954 
+349602.639653  7395981.724759 
+349531.689084  7395906.387664 
+349487.307871  7395863.325040 
+349443.800758  7395807.954525 
+349418.996096  7395688.824930 
+349399.081449  7395620.606616 
+349374.870516  7395552.828225 
+349340.978508  7395393.055593 
+349290.899150  7395200.498576 
+349202.549034  7395015.310297 
+349200.124643  7394986.265273 
+349181.216036  7394936.783748 
+349897.054826  7394979.026513 
+349909.053091  7394943.062673 
+349929.033708  7394919.076781 
+349957.013169  7394893.091232 
+349986.988217  7394873.104656 
+350034.956541  7394863.116367 
+350086.066678  7394873.004673 
+350413.128678  7394959.079929 
+350434.997682  7394967.208537 
+350459.076675  7394978.806550 
+350503.020839  7395003.812267 
+350538.487877  7395033.177237 
+350571.200674  7395067.051435 
+350664.143939  7394740.557360 
+350674.938255  7394750.695624 
+350684.701792  7394756.644605 
+350700.163475  7394762.333630 
+350722.090202  7394768.172630 
+350748.156537  7394776.021285 
+350759.437381  7394781.610328 
+350770.009048  7394785.279700 
+350801.254016  7394766.242960 
+350898.427598  7394706.903125 
+350913.823311  7394699.274432 
+350994.388984  7394651.342642 
+351014.262400  7394681.097545 
+351105.721344  7394622.767536 
+351203.266006  7394563.817634 
+351302.377453  7394503.767920 
+351395.361949  7394445.477905 
+351493.285938  7394386.538000 
+351588.579380  7394327.158172 
+351686.066318  7394266.578548 
+351779.487865  7394209.928252 
+351823.473260  7394182.432962 
+351880.537176  7394148.018857 
+352001.971168  7394143.659603 
+352091.789112  7394141.210023 
+352140.516089  7394138.940412 
+352299.585878  7394135.081073 
+352416.072133  7394130.981775 
+352474.719325  7394112.015024 
+352491.871485  7394100.646971 
+352515.678353  7394088.659024 
+352523.635965  7394119.763696 
+352532.426447  7394185.662409 
+352543.410426  7394286.695103 
+352545.603924  7394383.338548 
+352541.637487  7394470.333647 
+352539.196602  7394523.054616 
+352541.208683  7394567.836946 
+352532.426447  7394613.959045 
+352530.216457  7394644.703779 
+352528.031206  7394682.047382 
+352526.489161  7394816.824296 
+352533.242824  7394989.314750 
+352532.418201  7395009.071366 
+352530.892648  7395026.148441 
+352524.642005  7395050.354295 
+352501.956625  7395160.085499 
+352497.792278  7395178.542337 
+352487.913294  7395221.814925 
+352484.177752  7395241.891486 
+352475.997491  7395280.534867 
+352562.516943  7395343.414096 
+352659.946158  7395408.482951 
+352755.462247  7395473.881748 
+352845.676011  7395537.630829 
+352883.443747  7395552.628260 
+352951.788507  7395602.569705 
+353006.997021  7395627.545427 
+353118.609753  7395648.621817 
+353119.788964  7395682.825958 
+353119.640531  7395715.340389 
+353103.601613  7395774.780207 
+353081.476976  7395874.893059 
+353071.960826  7395914.566263 
+353069.577665  7395943.921235 
+353071.160941  7395971.696477 
+353104.203588  7396048.293357 
+353111.419039  7396064.790531 
+353163.980514  7396149.426034 
+353185.692839  7396185.509853 
+353215.618410  7396238.110843 
+353233.149896  7396281.443420 
+353231.088339  7396386.675395 
+353237.842001  7396353.970997 
+353338.421277  7396381.096351 
+353367.101667  7396390.294775 
+353416.026553  7396409.871422 
+353470.666078  7396430.257930 
+353522.056587  7396449.014717 
+353547.438485  7396456.913364 
+353567.410856  7396472.320725 
+353745.521191  7396570.533902 
+354058.902695  7396693.012922 
+354118.226078  7396716.718862 
+354108.891345  7396752.192785 
+354030.296520  7397007.519050 
+354012.839250  7397055.130895 
+353989.032382  7397102.742739 
+353967.608675  7397149.564719 
+353944.593445  7397196.386699 
+353922.369854  7397245.588271 
+353900.146262  7397303.518348 
+353879.522439  7397352.719920 
+353853.398381  7397407.650511 
+353825.509629  7397460.771412 
+353802.873725  7397500.124671 
+353814.476172  7397519.731313 
+353739.353011  7397594.438516 
+353673.671784  7397658.727504 
+353619.922852  7397678.844058 
+353572.045237  7397686.542740 
+353513.076442  7397673.125038 
+353501.671905  7397664.976434 
+353469.049816  7397651.108809 
+353459.261541  7397647.029508 
+353445.737722  7397636.421325 
+353406.271262  7397620.304086 
+353298.427058  7397580.860842 
+353261.253050  7397564.003729 
+353195.406899  7397545.846839 
+353135.168184  7397547.926483 
+353078.030052  7397559.034581 
+353013.750684  7397582.050638 
+352959.787350  7397609.825880 
+352879.609250  7397623.223586 
+352768.895357  7397608.996023 
+352686.284618  7397603.606946 
+352625.221280  7397596.428175 
+352576.733444  7397573.082174 
+352536.087773  7397523.120732 
+352505.073700  7397528.879746 
+352447.572734  7397559.484503 
+352475.675888  7397628.102750 
+352494.617480  7397673.584959 
+352510.582182  7397701.210227 
+352533.638643  7397733.664668 
+Region 1
+387
+333751.726857  7385884.884257 
+333622.252790  7385861.908192 
+333598.668570  7385860.378454 
+333557.973422  7385852.389823 
+333516.536113  7385842.861455 
+333483.163618  7385836.552536 
+333459.587644  7385835.032796 
+333420.838606  7385830.643548 
+333387.457865  7385824.844541 
+333334.047029  7385817.585784 
+333267.772073  7385819.205507 
+333229.361131  7385823.214820 
+333195.782479  7385826.554248 
+333156.126356  7385828.993830 
+333081.621662  7385835.772669 
+333025.266922  7385835.572703 
+332993.180839  7385840.721821 
+332952.947479  7385846.720794 
+332914.231427  7385853.499633 
+332878.879836  7385856.799067 
+332835.158321  7385859.928531 
+332793.152022  7385865.877512 
+332748.630623  7385870.756677 
+332711.530831  7385872.756334 
+332677.020356  7385872.266418 
+332633.373057  7385871.576536 
+332582.634000  7385858.038855 
+332559.940373  7385850.940071 
+332538.656852  7385848.710453 
+332525.660792  7385842.311549 
+332499.841844  7385835.932642 
+332480.743574  7385826.904188 
+332480.727081  7385826.884192 
+332431.925888  7385806.777636 
+332397.555599  7385792.620061 
+332355.104004  7385764.324907 
+332318.713388  7385742.078718 
+332294.452977  7385729.950795 
+332256.042035  7385717.822873 
+332227.740971  7385721.862181 
+332213.590440  7385725.911487 
+332200.932476  7385732.690326 
+332191.861622  7385717.252970 
+332177.727583  7385700.935765 
+332164.146041  7385682.608905 
+332137.972505  7385647.504918 
+332110.215692  7385618.609867 
+332094.663301  7385594.234043 
+332068.201147  7385572.567754 
+332045.053978  7385621.619352 
+332036.453159  7385666.581650 
+331999.510046  7385720.092484 
+331944.647873  7385754.706555 
+331959.268440  7385691.917310 
+331875.239350  7385635.317005 
+331795.292144  7385585.325568 
+331762.966920  7385558.640139 
+331778.214200  7385532.784568 
+331747.678408  7385525.655789 
+331744.511855  7385501.759882 
+331743.893388  7385443.299896 
+331745.888976  7385424.493118 
+331750.680036  7385406.686168 
+331756.510121  7385393.208476 
+331761.573307  7385382.030391 
+331765.869593  7385372.871960 
+331778.750205  7385263.280732 
+331758.992237  7385236.125383 
+331803.101324  7385161.358190 
+331709.770486  7385139.571922 
+331677.387538  7385122.604828 
+331693.220301  7385024.471638 
+331657.398675  7384938.176419 
+331594.347995  7384798.100413 
+331582.094097  7384771.934895 
+331544.103712  7384721.903465 
+331394.616043  7384702.736748 
+331327.862806  7384686.289565 
+331319.187771  7384674.861523 
+331315.105887  7384666.223002 
+331312.293922  7384658.094395 
+331311.007510  7384651.225571 
+331309.960239  7384636.988010 
+331303.058144  7384620.990750 
+331291.595883  7384608.292925 
+331279.366723  7384600.934186 
+331264.102950  7384595.865054 
+331246.546725  7384589.776097 
+331238.152063  7384588.776268 
+331226.871219  7384589.316176 
+331173.559338  7384590.615953 
+331133.119823  7384587.996402 
+331110.673583  7384591.295837 
+331079.643017  7384582.057419 
+331049.931848  7384570.169455 
+331023.527418  7384556.961718 
+331008.667710  7384541.744324 
+330981.554104  7384515.108887 
+330926.329097  7384461.768024 
+330852.599549  7384391.310092 
+330808.572923  7384437.992096 
+330766.442931  7384484.554121 
+330734.257893  7384542.284232 
+330714.483432  7384580.217734 
+330709.007934  7384634.318467 
+330708.381221  7384657.404513 
+330698.221865  7384683.809990 
+330675.157158  7384710.995333 
+330663.686651  7384736.620944 
+330647.441576  7384758.967116 
+330612.906363  7384789.441896 
+330570.256858  7384819.246791 
+330425.832374  7384829.315066 
+330392.863944  7384795.100927 
+330310.863426  7384688.119252 
+330249.181621  7384620.310867 
+330175.551028  7384554.312172 
+330143.192819  7384521.797741 
+330124.597569  7384506.320392 
+330057.093924  7384449.200176 
+330057.069186  7384440.811613 
+330059.328653  7384425.564225 
+329971.028015  7384398.708825 
+329906.138426  7384377.682427 
+329922.787566  7384308.784228 
+329743.159924  7384265.761598 
+329707.280574  7384257.922940 
+329689.732595  7384253.363721 
+329671.912491  7384245.495069 
+329654.587160  7384233.317155 
+329634.210724  7384217.579851 
+329618.930459  7384204.892024 
+329603.641947  7384188.894764 
+329591.643682  7384166.528596 
+329579.769110  7384127.995196 
+329502.007155  7384108.668506 
+329479.610392  7384100.059981 
+329588.947164  7383892.355559 
+329600.079576  7383869.589459 
+329609.422555  7383847.563231 
+329616.728715  7383825.766965 
+329621.940333  7383811.589393 
+329674.947104  7383622.991698 
+329696.197640  7383547.194682 
+329738.121477  7383405.748910 
+329755.372591  7383351.518199 
+329788.844042  7383245.586345 
+329800.759845  7383219.020895 
+329817.029658  7383189.176007 
+329834.561144  7383160.370941 
+329853.527475  7383140.214394 
+329863.794032  7383129.626208 
+329878.892880  7383116.548448 
+329970.211638  7383043.950883 
+330029.526775  7382971.303327 
+330039.562438  7382957.155750 
+330067.311004  7382921.581844 
+330076.818908  7382909.213962 
+330115.798840  7382867.131171 
+330126.832297  7382855.033243 
+330154.787019  7382823.518641 
+330169.168445  7382806.631534 
+330193.536057  7382778.896284 
+330228.961864  7382738.563193 
+330255.762113  7382709.548163 
+330291.328106  7382672.564498 
+330320.536255  7382636.980593 
+330350.569027  7382601.166728 
+330365.206086  7382583.509752 
+330378.383563  7382558.983953 
+330385.681477  7382537.697600 
+330389.499482  7382513.221792 
+330393.358718  7382503.463464 
+330394.208080  7382465.849906 
+330403.114009  7382408.749687 
+330410.750018  7382377.814986 
+330418.278827  7382360.337980 
+330428.413444  7382335.022316 
+330456.706262  7382294.869194 
+330547.266367  7382166.091252 
+330621.103116  7382060.789290 
+330644.423456  7382037.883213 
+330660.577822  7382020.486193 
+330756.563947  7381940.919822 
+330786.596719  7381993.210865 
+330789.853980  7382019.146423 
+330792.195909  7382039.752893 
+330792.946316  7382068.737928 
+330792.121693  7382104.821747 
+330840.494082  7382119.499233 
+330857.539041  7382115.339946 
+330875.078773  7382113.470266 
+330891.059968  7382115.399935 
+331085.539072  7382035.363645 
+331194.463533  7381977.583542 
+331210.015924  7381972.024494 
+331271.079262  7381908.605357 
+331320.490676  7381860.553588 
+331355.223799  7381834.088121 
+331414.349273  7381775.648132 
+331520.610201  7381731.535688 
+331553.628108  7381713.888711 
+331566.401520  7381700.031084 
+331578.861574  7381681.084330 
+331588.806528  7381664.197222 
+331599.048347  7381650.869505 
+331617.280763  7381631.142884 
+331726.823691  7381635.412153 
+331758.126382  7381622.614345 
+331825.489840  7381601.627940 
+331832.721785  7381613.245950 
+331845.528181  7381624.044100 
+331860.569306  7381629.973085 
+331871.512054  7381632.912581 
+331885.712063  7381632.502651 
+331901.371655  7381627.243552 
+331918.507322  7381618.155109 
+331957.173898  7381595.908919 
+331991.766835  7381571.353126 
+331999.996573  7381564.084371 
+332009.413769  7381558.655301 
+332038.489978  7381541.858178 
+332058.421118  7381526.740767 
+332099.033803  7381500.305295 
+332120.721390  7381489.017229 
+332140.149509  7381473.629865 
+332206.473943  7381431.357106 
+332210.992877  7381413.840106 
+332239.533081  7381367.488046 
+332297.619530  7381276.573619 
+332347.847321  7381181.229950 
+332434.803823  7381255.517225 
+332464.589208  7381221.922980 
+332486.647875  7381192.158078 
+332499.511995  7381163.253029 
+332503.338246  7381161.753286 
+332514.033607  7381160.553492 
+332521.413983  7381159.333701 
+332533.857545  7381159.933598 
+332555.437931  7381164.662788 
+332603.307300  7381192.468025 
+332613.441917  7381197.117229 
+332620.797555  7381200.476653 
+332627.897560  7381202.046384 
+332635.022303  7381202.096376 
+332645.486770  7381199.696787 
+332656.289332  7381197.897095 
+332739.196935  7381174.591087 
+332779.463279  7381161.903261 
+332789.639128  7381160.703466 
+332832.717437  7381149.775338 
+332870.996439  7381139.787049 
+332898.679036  7381129.918739 
+332921.587064  7381125.249539 
+332950.110776  7381118.580681 
+332999.060401  7381099.593934 
+333042.419082  7381080.557194 
+333139.567925  7381040.284093 
+333139.576171  7381040.254098 
+333153.866889  7381030.965689 
+333193.976555  7381002.760520 
+333214.913735  7380990.692587 
+333231.241271  7380982.164048 
+333260.309234  7380970.146107 
+333265.529098  7380955.848556 
+333271.350937  7380941.700979 
+333279.679630  7380926.713547 
+333289.674062  7380910.906254 
+333305.102759  7380890.079822 
+333321.290110  7380869.283384 
+333342.012888  7380846.577273 
+333355.569691  7380835.229217 
+333371.229283  7380826.010796 
+333392.042769  7380815.182651 
+333413.318044  7380803.004737 
+333425.819330  7380787.127456 
+333465.021910  7380815.932522 
+333474.637015  7380823.851166 
+333495.252592  7380842.647946 
+333516.107309  7380853.176143 
+333527.206735  7380863.384394 
+333535.840539  7380876.442158 
+333541.579915  7380891.679548 
+333543.270393  7380904.437362 
+333542.148905  7380913.395828 
+333538.570041  7380922.774221 
+333535.708599  7380932.152615 
+333534.611851  7380939.231402 
+333537.902097  7380945.690296 
+333542.940544  7380951.059376 
+333553.091653  7380955.388635 
+333575.158567  7380961.177643 
+333597.307942  7380960.327789 
+333631.150473  7380953.398976 
+333637.269176  7380953.468964 
+333644.088809  7380955.318647 
+333653.976039  7380963.737205 
+333665.042481  7380978.374697 
+333674.583370  7380991.662421 
+333690.209977  7381015.128402 
+333682.705907  7381033.385275 
+333674.748294  7381044.793321 
+333663.211817  7381059.210851 
+333641.689155  7381083.216739 
+333627.596347  7381097.624271 
+333611.928509  7381120.920281 
+333546.387468  7381261.136263 
+333522.036349  7381326.845008 
+333502.072224  7381383.185357 
+333496.118446  7381398.412749 
+333489.406014  7381413.370187 
+333458.457911  7381439.355736 
+333429.422932  7381447.294376 
+333397.947070  7381439.945634 
+333365.160057  7381438.185936 
+333306.958161  7381434.986484 
+333504.744003  7381735.794958 
+333679.893942  7381850.975229 
+333718.593503  7381890.078531 
+333657.414717  7381971.174640 
+333727.936482  7382041.472598 
+333699.206614  7382091.204080 
+333670.732380  7382150.333951 
+333673.742254  7382172.180209 
+333642.373593  7382217.122511 
+333567.530803  7382312.716137 
+333536.500237  7382349.849776 
+333505.181053  7382494.724960 
+333442.583917  7382494.724960 
+333450.162202  7382459.840936 
+333417.911194  7382495.554818 
+333415.470310  7382573.531462 
+333406.490165  7382644.369328 
+333376.440901  7382903.784892 
+333359.684560  7383039.821590 
+333538.231946  7383056.078806 
+333543.451810  7383270.122142 
+333720.951924  7383270.122142 
+333835.805425  7383567.701169 
+334164.698088  7383499.832794 
+334289.991316  7383703.437919 
+334444.336016  7383748.180255 
+334346.313072  7383835.115364 
+334311.984014  7383892.985451 
+334271.049725  7383966.832802 
+334229.562938  7384019.943704 
+334207.091960  7384050.698436 
+334187.457685  7384079.243547 
+334174.074052  7384100.549897 
+334166.668937  7384114.607489 
+334163.090073  7384128.245153 
+334162.793209  7384142.732672 
+334159.082405  7384159.969719 
+334156.872415  7384171.047821 
+334119.063448  7384268.301163 
+334100.121856  7384312.613572 
+334096.023479  7384326.741153 
+334094.530911  7384337.379330 
+334091.554022  7384370.853596 
+334089.789329  7384406.637467 
+334087.183520  7384422.334778 
+334080.570043  7384447.590452 
+334052.640060  7384508.979937 
+334026.573725  7384566.590069 
+334024.347242  7384575.688510 
+334023.341202  7384587.856426 
+334022.632026  7384609.702684 
+334020.603454  7384634.298471 
+334018.937715  7384677.451079 
+334018.228539  7384723.923119 
+334021.329122  7384770.225188 
+334029.558860  7384875.067229 
+334032.642950  7384898.003301 
+334037.277332  7384918.939714 
+334042.769322  7384935.816823 
+334051.798944  7384965.491740 
+333980.939084  7384979.709305 
+333826.149089  7385014.233391 
+333763.617922  7385030.410620 
+333730.385612  7385050.647154 
+333734.665406  7385106.297622 
+333741.798396  7385371.712158 
+333744.651591  7385434.501403 
+333734.376788  7385523.246202 
+333734.929285  7385645.395279 
+333752.889576  7385791.950176 
+333751.726857  7385884.884257 
+Region 1
+871
+337213.882056  7403806.924374 
+337193.118047  7403823.161592 
+337146.798969  7403860.325226 
+337131.436242  7403869.833598 
+337122.686991  7403878.582099 
+337113.566660  7403886.580729 
+337061.120633  7403917.935358 
+337102.533203  7403993.292450 
+337123.940418  7404027.326621 
+337130.760051  7404023.077349 
+337143.269583  7404017.648278 
+337164.973662  7404012.229207 
+337184.080178  7404008.919774 
+337208.612714  7404007.270056 
+337230.085899  7404008.689813 
+337250.371626  7404015.758602 
+337264.522158  7404025.436944 
+337277.262584  7404039.584521 
+337289.772116  7404056.571611 
+337320.670743  7404094.085186 
+337357.242775  7404132.768559 
+337381.536171  7404158.244196 
+337402.061039  7404180.660356 
+337417.638169  7404197.637448 
+337484.399652  7404259.676821 
+337491.474918  7404263.926093 
+337497.140078  7404268.175365 
+337522.851826  7404281.153142 
+337529.457056  7404283.502740 
+337534.883076  7404285.162456 
+337539.369026  7404285.392416 
+337551.631170  7404282.802860 
+337564.140702  7404279.973345 
+337570.506792  7404277.613749 
+337587.254887  7404269.585124 
+337605.660474  7404257.557184 
+337620.281041  7404248.598719 
+337641.284190  7404240.100174 
+337660.629847  7404233.021387 
+337673.131133  7404229.481993 
+337698.133704  7404224.062921 
+337710.164955  7404222.413204 
+337733.996561  7404221.463367 
+337758.999133  7404224.772800 
+337777.404719  7404230.191872 
+337785.659196  7404235.151022 
+337792.734462  7404242.699729 
+337799.817974  7404251.898154 
+337805.243994  7404263.216215 
+337812.080119  7404276.433951 
+337823.171299  7404294.590841 
+337839.210218  7404321.726193 
+337855.727418  7404347.911707 
+337870.826266  7404372.677465 
+337884.976798  7404396.743343 
+337902.912350  7404428.347929 
+337939.946172  7404488.267666 
+337965.897060  7404529.310635 
+337974.390677  7404544.408049 
+337988.310314  7404566.584251 
+337999.632389  7404589.470331 
+338010.014393  7404607.397260 
+338030.539262  7404642.311279 
+338044.458899  7404666.367159 
+338054.370868  7404682.644371 
+338066.633013  7404703.400815 
+338070.830344  7404712.589241 
+338076.305842  7404723.927299 
+338084.799459  7404742.804066 
+338090.695514  7404757.661521 
+338102.017589  7404777.238168 
+338130.096004  7404814.041863 
+338136.519818  7404828.789337 
+338143.710531  7404841.017243 
+338149.326214  7404848.355986 
+338158.207404  7404854.934859 
+338168.729595  7404859.904008 
+338182.542031  7404862.483566 
+338215.840310  7404869.322394 
+338242.591083  7404879.330680 
+338281.447321  7404898.377418 
+338308.948501  7404914.054732 
+338334.000549  7404930.521911 
+338354.162583  7404947.738962 
+338366.259804  7404957.587275 
+338401.842289  7404979.013605 
+338409.098972  7404985.572482 
+338416.899906  7404993.711088 
+338410.039042  7404995.270821 
+338396.911043  7404999.980014 
+338388.879214  7405002.129646 
+338357.527045  7405008.988471 
+338334.800434  7405012.717832 
+338309.327827  7405019.966590 
+338268.764619  7405027.605282 
+338243.292012  7405033.684241 
+338226.634626  7405037.603569 
+338197.245060  7405043.472564 
+338180.785584  7405046.612026 
+338161.192540  7405047.791824 
+338147.528536  7405050.341387 
+338139.447230  7405051.711153 
+338110.445237  7405054.650649 
+338085.170540  7405058.170046 
+338067.342189  7405059.939743 
+338047.938808  7405064.049039 
+338032.073060  7405067.968368 
+338000.325072  7405079.536387 
+337984.261415  7405086.385213 
+337977.887079  7405091.164395 
+337970.399501  7405103.442292 
+337966.688698  7405117.529879 
+337968.865703  7405126.638318 
+337973.038295  7405138.806234 
+337975.487426  7405146.144977 
+337981.218556  7405154.793496 
+337985.720998  7405160.402535 
+337994.544465  7405164.541826 
+338001.900103  7405164.371855 
+338013.057253  7405164.751790 
+338024.643207  7405171.190687 
+338031.207206  7405173.540285 
+338049.596301  7405184.098476 
+338064.233360  7405190.067454 
+338077.872625  7405194.516692 
+338087.768102  7405193.616846 
+338093.367293  7405191.917137 
+338108.103307  7405189.057627 
+338121.775557  7405190.727341 
+338128.834331  7405194.346721 
+338134.821094  7405202.995239 
+338141.764421  7405216.442936 
+338151.429003  7405236.499500 
+338166.371173  7405259.885494 
+338177.025303  7405281.711756 
+338190.219272  7405303.058099 
+338197.673864  7405312.686450 
+338205.713939  7405322.414784 
+338218.000823  7405334.922641 
+338231.499902  7405351.479805 
+338243.984696  7405368.526885 
+338258.432092  7405390.903052 
+338270.149985  7405408.200090 
+338273.720603  7405409.839809 
+338283.607834  7405428.546604 
+338309.814355  7405465.440285 
+338326.174876  7405475.718524 
+338341.051077  7405482.957284 
+338356.677684  7405490.955914 
+338366.284542  7405493.595462 
+338375.355396  7405498.494623 
+338389.629621  7405514.051958 
+338402.312324  7405535.898216 
+338406.996183  7405547.306262 
+338413.733353  7405556.974606 
+338426.003745  7405570.492290 
+338442.017925  7405588.589190 
+338470.822008  7405619.453904 
+338474.293671  7405626.312729 
+338479.035254  7405632.921597 
+338484.741646  7405643.839727 
+338501.794851  7405660.186926 
+338510.362684  7405665.336044 
+338522.954678  7405672.794767 
+338536.857823  7405675.984221 
+338559.337048  7405683.812880 
+338570.180841  7405688.732037 
+338577.214876  7405694.621028 
+338592.016860  7405708.158709 
+338597.665528  7405724.375931 
+338602.860653  7405735.793976 
+338610.785281  7405751.781237 
+338616.706075  7405766.238761 
+338627.426174  7405782.256017 
+338635.672405  7405792.704227 
+338647.208882  7405804.192260 
+338651.472183  7405808.271561 
+338657.970213  7405816.170208 
+338658.852559  7405828.048173 
+338657.953720  7405839.646187 
+338658.102152  7405849.484501 
+338660.534791  7405858.093027 
+338666.801926  7405864.731890 
+338674.190548  7405883.238720 
+338679.105302  7405897.166334 
+338679.954664  7405911.313911 
+338682.486256  7405934.050016 
+338678.156985  7405958.225875 
+338715.652596  7405981.371910 
+338762.804543  7405998.838918 
+338809.964736  7406026.784132 
+338869.337597  7406045.990842 
+338970.634294  7406070.436654 
+339036.999958  7406045.990842 
+339094.740065  7405998.958898 
+339101.757608  7405997.679117 
+339110.696522  7405997.679117 
+339124.096646  7406000.868571 
+339147.078891  7406032.783104 
+339155.894112  7406071.906403 
+339160.949051  7406100.221553 
+339171.900045  7406147.763409 
+339177.441512  7406177.338343 
+339184.013758  7406205.663491 
+339188.054411  7406233.208773 
+339188.895527  7406251.635617 
+339191.385888  7406281.940426 
+339197.059295  7406298.147650 
+339200.027938  7406306.246262 
+339209.981139  7406325.273003 
+339220.610530  7406354.388016 
+339230.712162  7406384.262899 
+339236.517509  7406413.587876 
+339237.655489  7406426.725625 
+339240.434468  7406453.501039 
+339240.244805  7406473.177668 
+339241.564202  7406494.384036 
+339246.718096  7406511.591089 
+339251.929714  7406523.759004 
+339270.500225  7406543.875559 
+339282.069687  7406553.833853 
+339299.914530  7406570.411013 
+339329.576222  7406596.946468 
+339357.745345  7406647.437819 
+339369.174621  7406672.023608 
+339386.904017  7406699.958823 
+339397.879750  7406718.985564 
+339413.786729  7406752.699789 
+339422.164899  7406777.265581 
+339432.464441  7406813.949297 
+339435.573270  7406833.405965 
+339476.524052  7406873.179152 
+339478.931951  7406885.567030 
+339487.499785  7406891.206064 
+339503.645904  7406900.194524 
+339512.197245  7406910.302793 
+339519.693069  7406919.281255 
+339527.889822  7406936.518302 
+339541.405394  7406955.325081 
+339562.804363  7406971.432322 
+339579.181377  7406982.190479 
+339598.848637  7406993.998457 
+339618.985932  7407010.085701 
+339635.329962  7407023.873339 
+339650.676197  7407037.151065 
+339660.983985  7407046.079536 
+339671.225804  7407062.086794 
+339678.672150  7407079.313843 
+339699.889701  7407087.852380 
+339714.007248  7407096.570887 
+339733.402383  7407109.888606 
+339748.468246  7407125.425944 
+339763.303215  7407138.443714 
+339776.975465  7407141.103259 
+339789.410781  7407140.463368 
+339805.911489  7407138.103773 
+339820.127990  7407136.734007 
+339847.348798  7407144.512675 
+339844.495602  7407178.736813 
+339831.565512  7407299.006212 
+339816.540880  7407379.502423 
+339785.889641  7407525.957337 
+339751.824462  7407634.948668 
+339717.767529  7407742.240290 
+339683.702350  7407825.685996 
+339646.239725  7407912.531120 
+339600.258743  7408019.822742 
+339554.277760  7408104.978156 
+339562.672423  7408107.887657 
+339579.758613  7408108.677522 
+339610.236682  7408099.919022 
+339739.290191  7408048.657803 
+339783.506480  7408042.338885 
+339830.914060  7408023.382133 
+339864.072153  7407998.106462 
+339880.523384  7408001.065955 
+339911.042683  7407934.997272 
+339904.305513  7407922.409428 
+339895.086227  7407910.001554 
+339879.476112  7407886.945503 
+339855.891893  7407853.081303 
+339843.481315  7407833.394676 
+339836.505004  7407824.506198 
+339819.006503  7407802.190021 
+339813.514513  7407793.321540 
+339806.422755  7407776.834364 
+339798.976409  7407760.337190 
+339789.039701  7407745.089801 
+339778.938068  7407734.101684 
+339775.392189  7407728.952566 
+339772.901827  7407722.753627 
+339772.901827  7407719.554175 
+339774.501596  7407706.256453 
+339776.101365  7407700.047517 
+339779.111239  7407695.618275 
+339783.547711  7407692.248853 
+339789.748877  7407690.479156 
+339815.106036  7407686.929764 
+339851.282250  7407682.140584 
+339862.629063  7407679.301070 
+339871.856595  7407675.931648 
+339875.575645  7407670.262619 
+339878.412349  7407658.384653 
+339880.012117  7407647.206568 
+339881.958228  7407634.438755 
+339886.567871  7407623.090699 
+339890.822926  7407616.001913 
+339897.386925  7407608.913127 
+339920.797974  7407588.696590 
+339926.999139  7407582.137714 
+339930.726436  7407575.568839 
+339939.055129  7407558.551754 
+339945.800545  7407546.133881 
+339953.246892  7407534.255915 
+339965.838886  7407517.588770 
+339973.458403  7407509.430168 
+339978.604051  7407503.401201 
+339992.078392  7407475.036059 
+339996.333447  7407463.857974 
+340000.415331  7407455.349431 
+340005.198145  7407449.500433 
+340011.234386  7407444.891223 
+340023.290375  7407439.212196 
+340030.027545  7407434.423016 
+340034.101183  7407429.633836 
+340036.591545  7407422.365081 
+340038.364484  7407410.487116 
+340042.792710  7407393.460032 
+340046.338589  7407384.951490 
+340050.775061  7407379.452432 
+340058.039991  7407376.792887 
+340065.139995  7407376.262978 
+340073.823276  7407377.152826 
+340086.951275  7407379.282461 
+340099.716440  7407381.762036 
+340105.389847  7407383.891671 
+340108.407967  7407389.030791 
+340111.244671  7407394.879789 
+340113.190781  7407400.028907 
+340116.736660  7407403.218361 
+340120.282540  7407403.928239 
+340133.410539  7407404.278179 
+340151.313106  7407402.508483 
+340162.841336  7407400.028907 
+340168.514743  7407396.659484 
+340172.415210  7407392.220245 
+340174.188149  7407385.311428 
+340174.724154  7407379.282461 
+340172.951215  7407366.864588 
+340169.759924  7407356.586349 
+340164.086517  7407343.988506 
+340157.703934  7407325.731634 
+340145.285111  7407288.138073 
+340138.547941  7407259.233024 
+340135.356649  7407232.637580 
+340135.356649  7407222.349342 
+340135.538066  7407201.782865 
+340134.474303  7407192.734415 
+340130.037830  7407170.928150 
+340128.438062  7407153.731096 
+340126.846539  7407133.694528 
+340126.310534  7407112.768112 
+340125.782775  7407100.000299 
+340123.828419  7407091.841697 
+340118.864188  7407084.213004 
+340108.762555  7407076.064399 
+340099.889611  7407068.255737 
+340095.815973  7407060.986982 
+340094.216205  7407055.487924 
+340094.397622  7407046.799412 
+340095.279968  7407040.600474 
+340097.762084  7407032.441872 
+340103.616907  7407022.153634 
+340111.772430  7407010.275668 
+340117.272665  7407002.117066 
+340125.428188  7406987.399587 
+340127.910303  7406979.600923 
+340127.728886  7406971.262351 
+340125.782775  7406959.204417 
+340122.410067  7406946.436604 
+340113.190781  7406921.970794 
+340109.999490  7406907.603255 
+340107.871962  7406897.145047 
+340107.698792  7406890.046263 
+340108.935726  7406881.187780 
+340110.180907  7406871.959361 
+340117.800424  7406844.124129 
+340118.864188  7406838.275131 
+340118.864188  7406830.116528 
+340117.800424  7406818.948441 
+340116.563490  7406799.621752 
+340114.790550  7406763.797888 
+340113.545369  7406755.109376 
+340109.644902  7406747.840621 
+340103.790078  7406740.041957 
+340091.560918  7406725.674418 
+340076.305392  7406708.297395 
+340068.859045  7406702.268427 
+340059.994347  7406694.819703 
+340049.711298  7406685.951222 
+340040.846600  7406682.051890 
+340029.672957  7406680.102224 
+340013.007325  7406677.802618 
+339998.996979  7406675.313045 
+339988.887100  7406670.353894 
+339979.667815  7406663.435079 
+339975.058172  7406656.696233 
+339973.103815  7406651.197175 
+339969.557936  7406637.549513 
+339968.675589  7406625.661549 
+339969.557936  7406612.193856 
+339968.675589  7406598.186256 
+339965.838886  7406591.087472 
+339960.693238  7406585.588414 
+339954.838414  7406581.339141 
+339947.392068  7406575.480145 
+339943.673018  7406569.281207 
+339939.591134  7406560.592695 
+339938.527370  7406554.913668 
+339939.945722  7406544.455459 
+339941.718661  7406534.877100 
+339954.129238  7406489.834815 
+339970.267112  7406430.255021 
+339974.167579  7406421.566509 
+339978.604051  7406415.007632 
+339985.159804  7406410.218453 
+339992.968985  7406408.268787 
+340010.879798  7406404.369455 
+340019.035320  7406401.889879 
+340023.644963  7406396.920731 
+340026.127078  7406391.421673 
+340026.481666  7406383.443039 
+340025.591073  7406375.284437 
+340022.935787  7406362.526622 
+340017.616968  7406349.578840 
+340012.652737  7406342.839994 
+340006.616496  7406338.230784 
+339991.905221  7406332.201816 
+339975.231343  7406323.863245 
+339968.139584  7406315.884611 
+339963.711358  7406306.666190 
+339963.884529  7406296.557922 
+339966.193474  7406286.629622 
+339970.093941  7406278.830958 
+339975.058172  7406275.101597 
+339981.086166  7406271.912143 
+339990.305452  7406270.312417 
+340005.734150  7406269.072630 
+340011.762144  7406267.652873 
+340018.680732  7406264.643389 
+340022.045194  7406260.914027 
+340023.290375  7406256.484786 
+340022.754370  7406251.875576 
+340020.626842  7406246.376517 
+340013.889672  7406238.397884 
+340001.833683  7406228.819525 
+339994.032748  7406218.891225 
+339986.932744  7406204.353716 
+339981.613925  7406193.355599 
+339976.831111  7406185.906875 
+339964.593705  7406176.158545 
+339950.055600  7406165.870307 
+339936.399842  7406155.232130 
+339924.162436  7406138.564985 
+339919.198205  7406130.946290 
+339907.496804  7406109.489965 
+339894.022463  7406083.774370 
+339868.657058  7406043.701234 
+339859.083184  7406031.463330 
+339847.917788  7406012.666550 
+339824.861327  7405972.413445 
+339816.524388  7405960.535479 
+339811.205569  7405947.587697 
+339806.595926  7405928.800915 
+339802.522288  7405908.934318 
+339798.267233  7405884.998418 
+339795.603700  7405865.671729 
+339792.230992  7405842.445707 
+339787.266761  7405825.948533 
+339781.593354  7405812.650811 
+339775.746777  7405803.072451 
+339767.409838  7405793.324121 
+339758.899728  7405781.616127 
+339755.708436  7405773.637493 
+339753.226321  7405764.239103 
+339749.499025  7405751.471290 
+339745.243970  7405741.193051 
+339738.679970  7405732.144601 
+339732.478805  7405725.585724 
+339728.578338  7405718.496938 
+339728.042333  7405711.758093 
+339728.932926  7405705.369187 
+339731.769629  7405698.810311 
+339736.552443  7405693.491222 
+339752.335728  7405684.622741 
+339767.055250  7405676.294167 
+339773.083244  7405672.744775 
+339787.448178  7405660.506872 
+339801.277107  7405649.158815 
+339807.486519  7405643.309817 
+339815.460624  7405633.381518 
+339817.942739  7405628.592338 
+339817.942739  7405624.693006 
+339816.878975  7405617.774191 
+339812.096162  7405608.735740 
+339807.131931  7405601.636956 
+339801.458524  7405595.787957 
+339791.703233  7405587.809324 
+339778.756651  7405574.151664 
+339768.193230  7405563.533482 
+339764.746305  7405561.213880 
+339758.718311  7405551.275582 
+339753.399492  7405539.047677 
+339749.672196  7405529.649286 
+339745.953146  7405513.512051 
+339742.935025  7405503.223813 
+339739.570563  7405497.024875 
+339722.896685  7405476.098459 
+339710.667525  7405463.330646 
+339704.103525  7405458.361497 
+339699.988656  7405456.231862 
+339697.366355  7405455.172044 
+339674.136723  7405450.202895 
+339660.307794  7405445.773654 
+339643.279328  7405437.974989 
+339631.396509  7405431.236144 
+339625.013927  7405425.557116 
+339618.812762  7405415.808786 
+339615.085465  7405405.520548 
+339613.667114  7405399.311612 
+339614.376289  7405393.292643 
+339615.794641  7405383.714284 
+339622.886399  7405353.569447 
+339624.659339  7405344.171057 
+339625.549932  7405331.403244 
+339625.549932  7405321.474945 
+339626.613696  7405313.496311 
+339630.332746  7405300.368560 
+339632.105685  7405289.020504 
+339632.823107  7405279.272174 
+339631.932514  7405263.844816 
+339632.287102  7405245.937884 
+339633.886871  7405236.359524 
+339636.542157  7405224.831499 
+339639.560278  7405215.613078 
+339642.751569  7405204.794931 
+339646.825207  7405179.439274 
+339645.761443  7405174.650095 
+339643.106157  7405166.491492 
+339636.896745  7405155.503374 
+339631.751097  7405142.555592 
+339628.559806  7405131.557476 
+339625.195344  7405116.140117 
+339615.794641  7405092.734126 
+339605.866179  7405076.056983 
+339595.228542  7405063.999048 
+339584.228070  7405055.490505 
+339578.554664  7405049.821477 
+339575.717960  7405045.212266 
+339576.253965  7405038.113482 
+339578.381493  7405033.854212 
+339581.036779  7405029.784909 
+339593.455602  7405022.506155 
+339599.656768  7405015.767310 
+339603.384064  7405009.738342 
+339607.812290  7404999.810043 
+339615.085465  7404978.713657 
+339623.422404  7404954.947728 
+339627.141454  7404940.060278 
+339627.496042  7404931.541737 
+339626.259108  7404921.973376 
+339622.358641  7404909.025594 
+339615.440053  7404890.938692 
+339613.667114  7404877.640969 
+339613.312526  7404860.443915 
+339611.184998  7404848.735921 
+339607.812290  7404832.248745 
+339609.040978  7404820.470762 
+339611.399400  7404813.391975 
+339618.004631  7404802.543833 
+339618.936455  7404800.454191 
+339624.139827  7404788.386258 
+339629.796741  7404779.887714 
+339646.313941  7404758.661350 
+339663.771211  7404736.015229 
+339687.833712  7404707.700079 
+339705.290982  7404685.053958 
+339714.254635  7404669.006707 
+339733.130257  7404640.231636 
+339748.699140  7404611.916486 
+339755.535266  7404599.208662 
+339756.252688  7404589.740284 
+339762.379637  7404568.503922 
+339766.362566  7404552.236708 
+339770.873255  7404519.432327 
+339776.068380  7404501.505398 
+339792.577334  7404432.617198 
+339801.070951  7404394.393745 
+339807.206147  7404371.277705 
+339814.281413  7404357.590050 
+339820.886644  7404350.041343 
+339835.985492  7404337.773444 
+339843.539039  7404329.754817 
+339851.084340  7404312.767727 
+339858.167852  7404289.651687 
+339864.773083  7404265.585809 
+339874.206771  7404227.842274 
+339878.923615  7404208.025669 
+339885.528846  7404198.117366 
+339892.134076  7404189.618821 
+339904.404468  7404181.130275 
+339939.319008  7404163.193348 
+339957.716349  7404152.345206 
+339986.503940  7404136.777873 
+339995.937628  7404130.638924 
+340004.431245  7404123.090217 
+340013.394898  7404113.181914 
+340018.111742  7404101.853855 
+340022.358551  7404087.226360 
+340028.963781  7404065.050159 
+340033.688872  7404033.915492 
+340036.987364  7404012.209210 
+340042.174243  7403997.111796 
+340052.086212  7403981.534464 
+340067.185060  7403963.607535 
+340082.283909  7403948.510121 
+340090.777526  7403931.992950 
+340097.382757  7403917.365456 
+340099.271144  7403906.517314 
+340097.382757  7403892.829659 
+340088.419104  7403874.432810 
+340082.753944  7403852.726528 
+340073.790291  7403831.970083 
+340070.483553  7403816.392752 
+340070.483553  7403805.544610 
+340072.371940  7403793.746631 
+340078.037100  7403781.008813 
+340087.949069  7403760.722288 
+340103.987988  7403739.016006 
+340113.891711  7403723.918592 
+340121.915293  7403718.719482 
+340135.125755  7403713.060452 
+340154.471412  7403706.451584 
+340171.928682  7403699.852714 
+340187.027530  7403691.354170 
+340195.991183  7403685.225220 
+340203.074695  7403678.616352 
+340215.336840  7403666.818372 
+340239.877623  7403647.471686 
+340259.693315  7403636.153625 
+340271.015390  7403628.604918 
+340281.867429  7403619.166535 
+340289.891012  7403607.368556 
+340297.906348  7403593.690899 
+340307.348282  7403581.423000 
+340315.841899  7403566.795505 
+340346.509631  7403528.572053 
+340358.301741  7403514.414478 
+340372.930554  7403494.127953 
+340381.894207  7403474.311347 
+340390.857860  7403459.213933 
+340398.411407  7403446.946035 
+340409.914899  7403432.108576 
+340424.337556  7403417.091148 
+340443.262655  7403394.864956 
+340465.486247  7403358.211234 
+340485.013321  7403317.058283 
+340497.630054  7403282.214252 
+340514.749229  7403228.743411 
+340521.659570  7403212.526189 
+340548.995825  7403173.172929 
+340570.625688  7403144.337869 
+340581.436496  7403128.120646 
+340589.641496  7403112.993238 
+340604.567173  7403085.457954 
+340633.709352  7403030.487370 
+340648.123763  7403003.152052 
+340653.228180  7402984.525243 
+340656.238054  7402968.607970 
+340655.330969  7402962.299050 
+340653.533291  7402955.690182 
+340643.918186  7402947.581571 
+340625.298197  7402933.164041 
+340620.490644  7402929.854608 
+340617.489016  7402926.255224 
+340613.580303  7402916.336923 
+340611.477514  7402900.119701 
+340611.477514  7402886.302068 
+340612.978328  7402870.684743 
+340615.798539  7402854.617495 
+340620.787509  7402830.131689 
+340624.391112  7402813.304572 
+340627.095875  7402792.278173 
+340631.301453  7402767.352443 
+340632.208538  7402733.708206 
+340631.301453  7402708.772477 
+340627.095875  7402686.846233 
+340617.785881  7402652.902047 
+340608.170776  7402625.566729 
+340599.759621  7402595.221927 
+340585.345209  7402563.087432 
+340580.834521  7402548.659903 
+340580.834521  7402533.042578 
+340582.038471  7402522.834327 
+340584.141260  7402512.316128 
+340597.961942  7402477.472097 
+340610.578675  7402449.236933 
+340615.081117  7402438.118838 
+340617.183906  7402428.810432 
+340618.684720  7402414.992799 
+340618.684720  7402389.157224 
+340617.785881  7402359.722266 
+340613.283439  7402326.377978 
+340609.077861  7402299.342609 
+340601.565545  7402278.616159 
+340591.348465  7402261.789041 
+340578.731732  7402242.562335 
+340573.627316  7402229.344599 
+340570.625688  7402214.927068 
+340569.726849  7402202.319228 
+340572.423366  7402187.891699 
+340576.934054  7402169.874785 
+340580.537657  7402153.947514 
+340580.834521  7402141.939570 
+340580.537657  7402127.212093 
+340577.536029  7402110.694922 
+340567.318949  7402068.942074 
+340561.612558  7402044.306294 
+340558.008955  7402025.689483 
+340556.805005  7402009.162314 
+340558.305819  7401993.544989 
+340563.113372  7401975.518077 
+340573.932426  7401954.191730 
+340587.447998  7401927.156361 
+340594.053229  7401910.039293 
+340599.165892  7401893.512124 
+340600.666706  7401878.494696 
+340601.507821  7401841.551024 
+340601.862409  7401803.397560 
+340599.759621  7401741.218210 
+340600.963570  7401707.274025 
+340602.769495  7401679.038861 
+340583.539285  7401682.738227 
+340488.089165  7401747.507133 
+340416.808747  7401793.609236 
+340316.600553  7401865.966842 
+340262.076476  7401908.179611 
+340230.707814  7401962.430319 
+340196.947746  7402027.809120 
+340168.943547  7402079.690233 
+340137.756302  7402141.949569 
+340110.123183  7402193.430750 
+340085.458708  7402242.172401 
+340067.284015  7402276.226568 
+340029.079229  7402346.694498 
+339935.212385  7402517.325270 
+339928.269059  7402528.333385 
+339914.093789  7402563.397378 
+339872.318384  7402636.234902 
+339814.504061  7402751.015241 
+339750.249432  7402870.034854 
+339698.034299  7402967.818105 
+339677.336260  7403003.162051 
+339671.596884  7403017.569583 
+339638.653192  7403075.629638 
+339622.523565  7403109.943760 
+339603.722159  7403142.748141 
+339592.837135  7403166.014156 
+339575.066508  7403198.608573 
+339571.809247  7403207.327079 
+339551.086469  7403241.141287 
+339528.730938  7403287.493347 
+339501.501884  7403339.634416 
+339490.534398  7403326.176721 
+339484.044614  7403316.518376 
+339475.295363  7403304.070508 
+339467.288273  7403293.142380 
+339454.193259  7403283.923959 
+339430.592547  7403282.934128 
+339379.103083  7403279.384736 
+339347.891100  7403278.574875 
+339329.394805  7403275.105469 
+339317.775866  7403269.696396 
+339309.768776  7403259.268182 
+339304.466449  7403250.679653 
+339294.537988  7403236.152142 
+339269.543662  7403223.534303 
+339257.166070  7403218.365188 
+339235.346544  7403216.885442 
+339211.770571  7403214.375872 
+339189.967537  7403211.886298 
+339165.336046  7403212.656166 
+339137.645203  7403214.395868 
+339116.040079  7403216.955430 
+339097.197442  7403222.314512 
+339072.994755  7403217.515334 
+339054.638646  7403213.815968 
+339035.210526  7403203.027816 
+339022.618532  7403194.569264 
+339011.576829  7403182.851272 
+339004.493317  7403180.261715 
+338993.550569  7403182.921260 
+338977.025123  7403185.530813 
+338959.543114  7403182.081403 
+338949.177602  7403177.942113 
+338931.547161  7403165.394262 
+338912.869448  7403155.625935 
+338895.725535  7403145.107737 
+338888.732731  7403145.747627 
+338869.312858  7403146.607480 
+338845.934794  7403148.137218 
+338834.051976  7403144.237886 
+338807.697023  7403139.938622 
+338766.086543  7403137.998954 
+338739.014168  7403130.160297 
+338725.407887  7403120.441962 
+338714.357938  7403109.733796 
+338694.649447  7403101.205257 
+338653.632695  7403072.300208 
+338631.153471  7403058.432583 
+338613.424075  7403032.267065 
+338605.639633  7403024.108463 
+338572.531017  7402987.954656 
+338553.358531  7402976.906548 
+338528.141557  7402961.519184 
+338509.043287  7402944.422112 
+338494.266042  7402926.355207 
+338483.570681  7402906.058684 
+338469.642797  7402880.443071 
+338460.159632  7402865.575618 
+338450.684713  7402849.968291 
+338431.165885  7402824.292689 
+338411.333700  7402804.156139 
+338393.967139  7402790.868415 
+338389.852270  7402785.999249 
+338377.936466  7402771.271771 
+338371.644592  7402766.412604 
+338363.365377  7402757.254173 
+338358.706256  7402742.816646 
+338356.141679  7402722.100194 
+338350.996031  7402705.143099 
+338338.189635  7402692.405281 
+338310.688455  7402677.237879 
+338304.421320  7402672.208740 
+338222.758898  7402744.796306 
+338163.740625  7402794.227839 
+338168.383253  7402805.975827 
+338180.562936  7402861.376337 
+338193.633211  7402916.906825 
+338191.068634  7402980.745890 
+338173.743303  7403053.073501 
+338172.390921  7403057.542736 
+338160.763736  7403082.698427 
+338150.620872  7403101.005291 
+338135.051989  7403129.120475 
+338038.290718  7403234.742383 
+337909.657766  7403366.019896 
+337799.669542  7403482.999859 
+337771.657097  7403509.505319 
+337706.660307  7403575.983932 
+337664.563299  7403561.206463 
+337649.200572  7403615.967083 
+337630.580583  7403667.568244 
+337601.042585  7403775.399773 
+337475.980251  7403715.200085 
+337433.718318  7403712.450556 
+337360.582499  7403736.176492 
+337299.700578  7403755.933108 
+337271.696379  7403768.960876 
+337264.241786  7403772.430282 
+337213.882056  7403806.924374 
+Region 1
+354
+323728.713878  7398532.747792 
+323748.999605  7398458.030591 
+323509.298173  7398295.668402 
+323369.285423  7398217.451800 
+323213.489387  7398119.318609 
+323021.822248  7398089.763671 
+322810.331171  7398086.984148 
+322637.292267  7398096.632495 
+322401.062497  7398103.231365 
+322107.109114  7398101.221709 
+321962.148625  7398073.036537 
+321839.329266  7397988.471022 
+321728.590634  7397885.788610 
+321664.162834  7397793.174474 
+321647.785820  7397771.298222 
+321429.648281  7397747.092368 
+321325.490142  7397735.444363 
+321300.165967  7397733.434707 
+321275.559215  7397736.734142 
+321249.674297  7397741.273365 
+321228.110404  7397744.082883 
+321214.652556  7397747.492299 
+321193.797838  7397756.610737 
+321165.587483  7397766.429056 
+321135.604189  7397776.477335 
+321108.366889  7397790.075005 
+321081.632609  7397805.202414 
+321062.765233  7397819.389984 
+321039.799481  7397837.816828 
+321024.379030  7397863.132491 
+321020.099236  7397889.058050 
+321020.173452  7397909.984466 
+321022.226763  7397936.979842 
+321025.162422  7397978.602712 
+321026.044768  7397984.841644 
+321029.170090  7398013.936660 
+321030.555456  7398059.078927 
+321032.344888  7398086.574218 
+321029.854527  7398111.509946 
+321018.532452  7398131.316554 
+320996.910835  7398141.444819 
+320984.186901  7398147.623761 
+320961.559245  7398156.482243 
+320948.818818  7398164.930796 
+320937.579206  7398175.159044 
+320928.838201  7398189.946511 
+320914.283604  7398203.164247 
+320901.312283  7398208.333361 
+320881.793455  7398209.153221 
+320869.646758  7398207.523500 
+320856.988794  7398205.893779 
+320843.819563  7398205.763802 
+320824.556369  7398206.333704 
+320800.452636  7398209.633139 
+320781.181195  7398211.712783 
+320760.128569  7398213.532471 
+320739.364560  7398212.072721 
+320720.884757  7398209.873098 
+320695.560583  7398208.623312 
+320679.818528  7398212.252690 
+320670.104469  7398217.021873 
+320667.350228  7398218.181675 
+320650.519671  7398230.369587 
+320637.276224  7398238.568183 
+320625.541838  7398247.776605 
+320592.194081  7398265.353594 
+320578.703248  7398272.792320 
+320562.136571  7398284.230361 
+320551.820536  7398305.556708 
+320544.481391  7398333.471926 
+320542.287894  7398353.368518 
+320542.304386  7398380.593855 
+320543.046547  7398412.108457 
+320544.192773  7398425.986080 
+320548.860139  7398443.683048 
+320555.102536  7398454.081267 
+320563.629138  7398464.239527 
+320565.814390  7398475.357623 
+320565.501033  7398482.916328 
+320557.329018  7398490.655002 
+320550.962928  7398493.614495 
+320542.345617  7398494.294379 
+320521.004372  7398501.143206 
+320512.032473  7398512.401277 
+320509.880207  7398527.258732 
+320511.273820  7398542.146182 
+320512.964297  7398552.244453 
+320517.656403  7398565.902113 
+320515.223765  7398583.529094 
+320510.350242  7398590.787851 
+320498.368469  7398598.736489 
+320477.266365  7398607.864925 
+320466.571004  7398613.563949 
+320442.442533  7398620.642737 
+320423.641127  7398625.751861 
+320390.351094  7398637.279887 
+320372.283603  7398646.688275 
+320361.151191  7398656.546587 
+320349.812624  7398666.634859 
+320333.138746  7398690.170827 
+320325.370796  7398709.767470 
+320308.334084  7398746.151238 
+320299.024089  7398767.747539 
+320289.202829  7398790.593626 
+320277.072623  7398815.939284 
+320262.963323  7398836.475766 
+320241.745771  7398857.702131 
+320227.999305  7398865.380815 
+320211.712999  7398874.049330 
+320200.300216  7398878.118633 
+320181.721458  7398884.597524 
+320159.118540  7398889.926611 
+320144.399019  7398892.556160 
+320130.924678  7398897.975232 
+320115.875307  7398910.183141 
+320110.688428  7398923.240904 
+320111.133724  7398931.059565 
+320113.335468  7398940.407964 
+320115.834076  7398944.217311 
+320123.874150  7398952.365915 
+320133.481009  7398954.975468 
+320141.850933  7398954.045628 
+320154.261510  7398954.165607 
+320170.737479  7398953.825665 
+320181.878137  7398955.185433 
+320189.456423  7398957.535030 
+320198.016010  7398963.663980 
+320203.013226  7398972.282504 
+320202.939010  7398980.351122 
+320199.294176  7398992.419055 
+320190.594403  7399001.657472 
+320183.444921  7399008.396318 
+320168.898570  7399020.104312 
+320154.640837  7399028.792824 
+320141.422129  7399033.452026 
+320128.475547  7399036.351529 
+320116.229895  7399045.819908 
+320108.750563  7399060.617373 
+320104.577971  7399074.445004 
+320099.432323  7399083.973372 
+320094.064027  7399089.212475 
+320088.473082  7399090.932180 
+320073.761807  7399092.801860 
+320058.786652  7399096.441237 
+320045.353542  7399099.550704 
+320031.706031  7399110.278866 
+320022.272343  7399119.437298 
+320002.102063  7399148.392338 
+319993.072440  7399162.419935 
+319980.645370  7399187.535633 
+319970.370567  7399208.032122 
+319965.109472  7399218.860267 
+319940.139885  7399259.353331 
+319915.129068  7399302.615921 
+319905.357285  7399320.572845 
+319902.957631  7399326.111896 
+319896.674004  7399344.348772 
+319895.676210  7399349.667861 
+319895.280391  7399362.865601 
+319895.898858  7399368.904566 
+319901.291893  7399385.891656 
+319907.592013  7399403.818586 
+319917.198872  7399418.995986 
+319923.837087  7399428.584344 
+319939.430710  7399449.630738 
+319947.949066  7399462.038613 
+319956.830256  7399475.116373 
+319968.045130  7399492.173451 
+319982.212154  7399515.519452 
+319990.450139  7399527.907330 
+319995.010304  7399536.075931 
+320009.144344  7399562.211454 
+320029.248654  7399595.605734 
+320042.285944  7399615.932253 
+320056.906511  7399639.978134 
+320066.933928  7399658.644936 
+320075.806872  7399676.601860 
+320086.040444  7399696.888386 
+320095.803981  7399718.104751 
+320106.260202  7399740.250958 
+320119.445925  7399767.536284 
+320125.119331  7399780.114130 
+320130.075316  7399793.621816 
+320139.393557  7399813.438422 
+320146.402853  7399830.905430 
+320150.509475  7399838.374150 
+320153.939907  7399843.983189 
+320161.509947  7399853.571547 
+320168.412042  7399861.310222 
+320176.023313  7399867.659134 
+320188.747247  7399875.467796 
+320201.735060  7399880.956856 
+320209.610211  7399884.996164 
+320232.534732  7399897.793972 
+320253.372957  7399908.942063 
+320258.460881  7399912.241497 
+320267.408041  7399923.949492 
+320277.188071  7399943.766098 
+320282.647075  7399955.194140 
+320284.205613  7399960.773184 
+320289.953236  7399986.108845 
+320292.921879  7399996.567053 
+320301.852547  7400015.553801 
+320315.318641  7400033.130790 
+320320.282872  7400038.089941 
+320335.018886  7400048.158216 
+320351.041312  7400056.516784 
+320357.415649  7400058.506444 
+320377.404512  7400061.475935 
+320392.288958  7400062.895692 
+320396.882109  7400062.865697 
+320403.907897  7400062.755716 
+320421.480615  7400060.776055 
+320439.482136  7400057.796565 
+320455.075758  7400056.376808 
+320474.355445  7400053.687269 
+320484.135475  7400052.837415 
+320514.184739  7400050.987731 
+320519.140724  7400051.837586 
+320533.035623  7400056.096856 
+320547.210893  7400062.045837 
+320561.386164  7400067.574890 
+320573.433907  7400072.674017 
+320580.237047  7400079.902779 
+320584.483856  7400091.250835 
+320584.772474  7400101.169136 
+320584.203484  7400114.066927 
+320580.517419  7400129.804231 
+320575.413002  7400142.412071 
+320569.888027  7400152.900275 
+320566.630766  7400163.108526 
+320565.212415  7400170.907190 
+320563.934249  7400190.603817 
+320561.806721  7400241.915027 
+320562.515897  7400250.283594 
+320566.911138  7400262.191554 
+320572.584545  7400276.359127 
+320583.213936  7400292.516360 
+320590.866438  7400305.704101 
+320598.238568  7400316.192304 
+320603.763543  7400322.281261 
+320611.704663  7400328.660169 
+320623.892592  7400336.888759 
+320631.545094  7400344.257497 
+320644.161827  7400357.015312 
+320664.290876  7400382.101015 
+320669.106675  7400387.200141 
+320675.909815  7400391.459412 
+320717.586265  7400415.125358 
+320731.332731  7400422.784046 
+320738.985233  7400427.743197 
+320743.660846  7400432.702347 
+320746.497549  7400438.801303 
+320750.183614  7400451.129191 
+320750.612418  7400458.078001 
+320749.474439  7400466.576545 
+320746.497549  7400475.085087 
+320740.832389  7400486.843073 
+320735.158982  7400498.471082 
+320732.470711  7400506.829650 
+320732.610897  7400512.078751 
+320733.320073  7400516.897925 
+320732.891269  7400524.976541 
+320731.332731  7400530.505594 
+320726.657118  7400536.884502 
+320719.713792  7400547.512681 
+320707.097059  7400562.680083 
+320698.306577  7400570.618723 
+320689.804714  7400580.826975 
+320668.117127  7400596.274329 
+320643.172279  7400613.561368 
+320612.265407  7400632.418138 
+320606.880618  7400635.247653 
+320571.166193  7400649.855151 
+320554.294405  7400654.954277 
+320545.512170  7400657.083913 
+320512.626202  7400661.043235 
+320484.135475  7400663.742772 
+320463.866240  7400665.442481 
+320439.910940  7400667.282166 
+320430.419529  7400671.601426 
+320519.247925  7400668.371979 
+320599.071438  7400661.123221 
+320651.492726  7400648.615363 
+320693.886598  7400620.600162 
+320754.413931  7400594.194685 
+320771.063070  7400550.142231 
+320790.466451  7400507.589520 
+320811.123259  7400473.505358 
+320829.141273  7400428.203118 
+320836.678328  7400380.111356 
+320848.124096  7400288.097117 
+320862.893095  7399944.915901 
+320866.076140  7399938.087070 
+320857.203196  7399889.555383 
+320873.505994  7399825.656329 
+320901.411238  7399755.218394 
+320963.241476  7399650.296366 
+321044.796697  7399541.534996 
+321113.496044  7399453.210125 
+321202.720260  7399351.847488 
+321260.963387  7399303.635746 
+321339.813844  7399265.572266 
+321436.335974  7399243.815993 
+321568.201448  7399228.868553 
+321670.273291  7399221.439826 
+321759.951050  7399215.590827 
+321879.859489  7399206.542377 
+321908.779020  7399203.722860 
+321966.222263  7399200.423425 
+322094.170778  7399192.034862 
+322193.109053  7399181.566655 
+322392.972945  7399167.499065 
+322464.888323  7399161.410108 
+322580.162381  7399152.961555 
+322758.734505  7399139.843802 
+322869.143288  7399131.745189 
+322955.530800  7399123.646577 
+323033.202046  7399119.787238 
+323082.283611  7399112.658459 
+323118.797920  7399107.119408 
+323152.656943  7399100.450550 
+323196.007378  7399089.912355 
+323224.506351  7399080.224015 
+323253.409390  7399072.815284 
+323290.649367  7399060.407409 
+323336.251023  7399042.230522 
+323386.371612  7399017.544751 
+323417.863967  7398998.288049 
+323458.855980  7398976.321812 
+323489.952516  7398952.495893 
+323512.679127  7398932.529313 
+323539.199005  7398909.883192 
+323563.830496  7398887.996941 
+323600.880810  7398842.014818 
+323619.022518  7398818.258887 
+323633.370959  7398796.822559 
+323655.990370  7398757.779246 
+323671.773655  7398722.585275 
+323683.351363  7398683.611951 
+323697.386448  7398645.258520 
+323705.071935  7398620.162819 
+323738.634093  7398607.974907 
+323760.173248  7398607.634965 
+323778.727267  7398615.593602 
+323790.659562  7398636.480024 
+323786.676633  7398674.933437 
+323806.566541  7398658.686220 
+323818.836933  7398640.789286 
+323818.498837  7398619.242976 
+323806.566541  7398597.366724 
+323786.709618  7398579.659757 
+323743.070565  7398541.736253 
+323728.713878  7398532.747792 
+Region 1
+524
+325145.243132  7405147.694712 
+325199.882656  7405207.124532 
+325238.417292  7405261.515215 
+325274.675968  7405281.921720 
+325324.532679  7405286.450944 
+325375.214012  7405273.403179 
+325545.927479  7405414.878945 
+325664.887603  7405456.271855 
+325614.082576  7405535.638261 
+325652.246131  7405634.771280 
+325679.755556  7405771.437870 
+325721.143388  7405941.368763 
+325711.148956  7406058.758655 
+325601.259687  7406208.622984 
+325516.340004  7406266.063145 
+325284.183872  7406381.113438 
+325183.876723  7406489.574860 
+325156.680654  7406585.758384 
+325166.073111  7406627.001320 
+325171.301221  7406602.245560 
+325178.087869  7406573.330513 
+325166.073111  7406627.001320 
+325162.848835  7406678.852438 
+325171.969166  7406768.877018 
+325254.794306  7406833.875884 
+325385.101243  7406884.707177 
+325466.326615  7406904.283824 
+325543.206223  7406979.400957 
+325727.361046  7407039.950585 
+325874.869620  7407079.163869 
+325997.565286  7407092.791534 
+326072.540015  7407113.238032 
+326202.055313  7407542.664475 
+326195.235680  7407651.725794 
+326236.128738  7407760.787113 
+326208.866700  7407863.029599 
+326147.522990  7408026.621578 
+326127.072338  7408203.841222 
+326018.007691  7408435.601523 
+326011.196305  7408599.193501 
+326065.728628  7408633.267665 
+326202.047067  7408619.639999 
+326393.532789  7408578.846986 
+326364.069007  7408604.372614 
+326342.991641  7408631.927894 
+326325.724034  7408650.884647 
+326304.399282  7408679.699711 
+326291.708333  7408702.445815 
+326287.931559  7408731.250881 
+326290.248750  7408751.457420 
+326295.353167  7408770.654132 
+326303.005669  7408784.291796 
+326307.862699  7408809.297512 
+326308.662583  7408833.553358 
+326310.212874  7408858.559074 
+326306.939121  7408880.795265 
+326304.407528  7408894.692885 
+326294.775930  7408920.718427 
+326285.136087  7408936.895656 
+326268.379746  7408962.171326 
+326267.381952  7408977.828644 
+326268.173590  7408999.304966 
+326268.956982  7409012.952628 
+326273.550133  7409029.619773 
+326280.180102  7409043.507394 
+326293.687428  7409063.713933 
+326302.865483  7409085.690169 
+326307.722513  7409104.886881 
+326306.502070  7409147.329610 
+326302.725297  7409177.904373 
+326299.971056  7409210.238835 
+326294.413096  7409240.563640 
+326287.568725  7409259.260438 
+326276.403329  7409275.177711 
+326265.468827  7409280.746757 
+326259.622249  7409280.496800 
+326242.329904  7409278.987059 
+326231.395402  7409277.737273 
+326213.591790  7409275.217704 
+326180.780038  7409270.688480 
+326164.749366  7409268.678824 
+326152.792331  7409259.850337 
+326143.886402  7409254.801202 
+326125.555031  7409242.433320 
+326102.663495  7409237.394183 
+326082.320044  7409239.173878 
+326066.050231  7409242.463315 
+326051.050337  7409247.532447 
+326005.547637  7409261.200105 
+325984.453779  7409269.038763 
+325958.775017  7409272.088240 
+325930.803802  7409276.907415 
+325919.671391  7409290.685055 
+325909.668713  7409300.173430 
+325895.114116  7409308.082075 
+325878.860795  7409310.171717 
+325846.832436  7409315.610785 
+325788.449123  7409319.240164 
+325758.927617  7409327.498749 
+325721.102157  7409330.098304 
+325689.090289  7409334.277588 
+325654.761231  7409341.206401 
+325627.565163  7409346.205545 
+325603.914973  7409350.984726 
+325583.084995  7409353.524291 
+325567.615066  7409353.344322 
+325541.730148  7409353.814242 
+325426.431351  7408741.909055 
+325270.173526  7408757.036464 
+325209.695671  7408787.281284 
+325164.324910  7408757.036464 
+324947.589230  7408767.114738 
+324786.292958  7408782.232148 
+324674.861644  7408739.399485 
+324605.832447  7408468.165945 
+324473.785555  7408232.826257 
+324388.098973  7408147.140934 
+324226.802701  7408091.700430 
+323987.381641  7408069.404249 
+323962.189406  7408173.676388 
+323932.321559  7408300.704630 
+323909.265098  7408387.819708 
+323919.341992  7408488.632439 
+323944.542473  7408521.396827 
+324000.311730  7408553.851268 
+323981.502078  7408563.689583 
+323929.468363  7408602.053011 
+323902.181586  7408619.340050 
+323865.461121  7408626.088894 
+323816.610450  7408629.438321 
+323803.399989  7408644.275779 
+323792.391271  7408651.764496 
+323778.042830  7408652.944294 
+323762.630624  7408649.064959 
+323744.876490  7408637.856879 
+323694.623960  7408599.153508 
+323662.950188  7408582.016444 
+323625.256668  7408566.999016 
+323595.751655  7408563.279653 
+323560.243386  7408565.459280 
+323531.612473  7408575.157618 
+323499.311987  7408595.554125 
+323471.142864  7408626.788774 
+323433.168971  7408686.008631 
+323412.033882  7408714.133813 
+323356.272871  7408680.809521 
+323340.761711  7408665.532138 
+323332.771113  7408647.615207 
+323338.073440  7408622.979427 
+323349.016188  7408583.066264 
+323369.186468  7408506.809326 
+323378.001688  7408480.363856 
+323381.753723  7408451.678769 
+323376.789492  7408433.241927 
+323369.953367  7408430.022479 
+323310.407336  7408525.216173 
+323285.949016  7408575.167617 
+323266.083846  7408604.292628 
+323240.083481  7408624.859105 
+323189.567072  7408664.212364 
+323171.128500  7408685.708682 
+323156.079129  7408692.207569 
+323121.346006  7408697.166719 
+323084.922405  7408707.474954 
+323012.512254  7408723.502208 
+322973.557060  7408733.830439 
+322892.216241  7408763.895289 
+322856.287414  7408773.943568 
+322797.541267  7408796.149764 
+322746.307436  7408812.696930 
+322706.362695  7408824.314940 
+322646.717708  7408831.833652 
+322618.490861  7408831.143770 
+322552.166428  7408825.304770 
+322542.592554  7408824.914837 
+322415.180044  7408807.857759 
+322404.113603  7408809.247521 
+322380.933448  7408809.517475 
+322358.701611  7408803.438516 
+322329.963497  7408801.988764 
+322313.132940  7408807.247863 
+322284.716429  7408813.396810 
+322253.496200  7408815.526445 
+322238.108734  7408813.926719 
+322203.441580  7408824.214957 
+322179.230647  7408821.955344 
+322153.997181  7408817.926034 
+322122.339902  7408827.174450 
+321973.693348  7408865.477889 
+321996.263281  7408563.349641 
+321935.925612  7408473.505031 
+321799.829821  7408443.270209 
+321704.066344  7408372.702297 
+321598.217728  7408216.449062 
+321497.407558  7408145.881150 
+321436.921456  7408110.597193 
+321426.836316  7408060.195827 
+321371.396908  7408024.911870 
+321361.311768  7407984.588777 
+321401.635835  7407868.658635 
+321446.998350  7407808.168997 
+321537.731626  7407782.963314 
+321517.569592  7407682.160581 
+321361.352999  7407680.190918 
+321364.602014  7407675.361745 
+321356.331044  7407684.780132 
+321300.413354  7407685.050086 
+321039.337692  7407658.644609 
+320752.566775  7407630.059505 
+320617.988291  7407611.932610 
+320597.818011  7407607.713333 
+320325.016208  7407570.939632 
+320309.117476  7407583.667452 
+320298.603532  7407592.395957 
+320286.786683  7407604.903814 
+320275.497593  7407614.382190 
+320260.679117  7407622.060875 
+320245.769932  7407628.669743 
+320242.957967  7407619.801262 
+320236.369229  7407610.192908 
+320231.817310  7407606.663513 
+320223.241230  7407602.644201 
+320214.920783  7407601.164455 
+320172.576389  7407596.285290 
+320118.679025  7407597.045160 
+320071.279691  7407586.107034 
+320059.438104  7407587.936720 
+320047.860396  7407588.506623 
+320052.494778  7407577.808455 
+320049.600351  7407562.881012 
+320045.015447  7407540.114912 
+320044.363995  7407530.256600 
+320043.852728  7407506.270709 
+320043.753774  7407491.623218 
+320041.213934  7407467.857289 
+320031.780247  7407446.560937 
+320018.759448  7407428.504030 
+320007.660022  7407420.305434 
+319987.267094  7407402.688452 
+319969.562436  7407394.679824 
+319954.166724  7407384.421581 
+319937.971127  7407377.702732 
+319923.028957  7407372.493624 
+319908.598053  7407367.804427 
+319903.073079  7407361.445516 
+319892.625104  7407340.379125 
+319885.887934  7407328.441170 
+319877.608718  7407318.512870 
+319871.160166  7407303.305475 
+319866.220674  7407290.117734 
+319857.751795  7407273.880515 
+319849.843660  7407252.844119 
+319842.009741  7407224.738933 
+319833.425415  7407195.363965 
+319822.985687  7407173.037789 
+319814.244682  7407159.060183 
+319806.443748  7407151.661450 
+319798.857216  7407148.052069 
+319793.291010  7407145.972425 
+319791.056282  7407140.653336 
+319792.639558  7407132.544725 
+319790.850126  7407125.675901 
+319779.767192  7407109.968592 
+319766.746394  7407099.850325 
+319752.439183  7407091.531750 
+319743.599224  7407086.902543 
+319739.863682  7407079.283848 
+319741.512928  7407067.685835 
+319743.648702  7407058.117474 
+319748.827334  7407049.079022 
+319763.992153  7407033.321721 
+319769.327464  7407009.645776 
+319771.982750  7406998.807633 
+319771.652901  7406982.140488 
+319769.277986  7406965.963259 
+319762.177982  7406940.637597 
+319755.110962  7406912.292452 
+319751.532098  7406890.536179 
+319743.607470  7406870.769565 
+319736.804330  7406841.664550 
+319729.168321  7406818.858457 
+319726.339863  7406797.872051 
+319723.206296  7406757.698933 
+319722.513612  7406727.134168 
+319718.374005  7406717.115884 
+319719.784110  7406704.688013 
+319725.383301  7406696.359439 
+319726.158446  7406671.873634 
+319724.080396  7406651.907054 
+319722.793984  7406629.170948 
+319722.859954  7406599.636007 
+319723.255773  7406586.248301 
+319725.399793  7406575.420155 
+319730.660888  7406559.312914 
+319738.478315  7406540.456144 
+319747.912003  7406514.290626 
+319755.795399  7406490.124766 
+319758.500163  7406474.497442 
+319760.281349  7406450.021635 
+319759.720605  7406431.084879 
+319755.416073  7406406.299124 
+319750.278671  7406387.052421 
+319746.007124  7406358.727273 
+319741.133601  7406338.990654 
+319738.173204  7406330.622087 
+319727.758215  7406309.145766 
+319707.975508  7406302.296939 
+319701.980498  7406292.898549 
+319693.569343  7406270.842327 
+319688.135077  7406256.654757 
+319676.911957  7406236.088280 
+319667.659686  7406222.110674 
+319655.405787  7406203.293897 
+319639.911120  7406178.648119 
+319627.945839  7406156.561902 
+319614.974519  7406133.455860 
+319606.043851  7406112.919377 
+319603.438042  7406095.472366 
+319600.840479  7406077.005529 
+319600.988911  7406063.127906 
+319603.883338  7406053.309588 
+319609.630961  7406039.222001 
+319620.755126  7406020.145269 
+319628.539568  7406005.327807 
+319637.651653  7405984.971294 
+319640.900668  7405966.064532 
+319642.154095  7405944.108293 
+319644.075467  7405930.740583 
+319623.699031  7405911.353904 
+319597.706912  7405893.416976 
+319578.534425  7405880.599172 
+319566.156833  7405872.900491 
+319545.343347  7405870.670872 
+319523.993856  7405870.460908 
+319512.366671  7405865.041837 
+319501.811495  7405853.573801 
+319485.286049  7405830.427766 
+319473.048643  7405809.851290 
+319466.055839  7405798.673205 
+319459.038297  7405789.514774 
+319446.924584  7405781.566135 
+319433.780093  7405774.617326 
+319411.498777  7405766.818661 
+319401.438376  7405757.120323 
+319390.932678  7405741.113065 
+319378.860196  7405728.875161 
+319370.308855  7405720.456603 
+319352.826846  7405715.477456 
+319342.939616  7405713.617774 
+319317.532979  7405712.347992 
+319299.531458  7405708.378672 
+319288.184644  7405700.440031 
+319275.130861  7405684.652736 
+319267.115525  7405673.464652 
+319261.895661  7405663.066433 
+319260.749435  7405651.438425 
+319266.802168  7405631.551831 
+319270.512972  7405617.444248 
+319271.923077  7405604.326495 
+319270.001706  7405593.958271 
+319264.897289  7405571.692085 
+319256.717028  7405552.415387 
+319249.460345  7405541.737216 
+319243.490074  7405529.309345 
+319235.986004  7405518.121261 
+319235.161381  7405499.934376 
+319236.084959  7405485.296884 
+319239.317481  7405467.659905 
+319244.636300  7405445.743659 
+319251.934214  7405428.396630 
+319261.021561  7405410.809643 
+319260.947344  7405393.892540 
+319259.067204  7405379.235051 
+319257.162325  7405367.597044 
+319252.981486  7405354.169344 
+319248.107963  7405334.682682 
+319240.653371  7405318.195506 
+319235.746864  7405301.738325 
+319230.955804  7405274.163049 
+318996.424758  7404953.697942 
+318781.668173  7404524.191512 
+318558.962222  7404213.984648 
+318412.674090  7403906.477321 
+318417.019854  7403895.219249 
+318439.664003  7403836.619287 
+318442.533691  7403795.776283 
+318440.447395  7403736.216485 
+318411.000105  7403666.298461 
+318372.613902  7403568.545206 
+318335.060567  7403493.997975 
+318320.893543  7403420.200616 
+318333.699939  7403343.133817 
+318350.514004  7403275.185456 
+318373.743635  7403232.032847 
+318419.889542  7403183.551152 
+318473.069484  7403146.237543 
+318634.266800  7403082.758417 
+318878.751046  7402970.657618 
+318936.779771  7402963.668816 
+318994.973421  7402936.003554 
+319053.686583  7402905.808726 
+319076.940954  7402940.782736 
+319089.722611  7402957.949795 
+319251.868245  7402978.646250 
+319392.161367  7402959.099598 
+319553.160774  7403009.700931 
+319801.990783  7403122.831552 
+320024.746212  7403086.307809 
+320154.047108  7403020.469086 
+320162.441771  7402998.272888 
+320167.793575  7402987.434745 
+320179.701132  7402972.937228 
+320191.625181  7402969.117882 
+320205.957130  7402973.797081 
+320228.700234  7402978.326305 
+320255.508730  7402983.415433 
+320273.749393  7402984.805195 
+320298.504577  7402985.275115 
+320315.302149  7402983.895351 
+320337.608203  7402978.886209 
+320436.727895  7402942.572429 
+320477.307596  7402925.625332 
+320500.182640  7402922.055943 
+320515.182533  7402910.117988 
+320551.746320  7402899.129871 
+320563.282797  7402896.090391 
+320583.428338  7402897.310182 
+320591.023117  7402898.150038 
+320613.700251  7402903.089192 
+320633.854039  7402904.129014 
+320663.136404  7402905.098848 
+320684.469402  7402905.048857 
+320702.058612  7402904.139013 
+320734.392083  7402893.740794 
+320783.655065  7402888.311724 
+320830.163805  7402903.879057 
+320970.762038  7402996.433203 
+320991.410599  7403092.356773 
+320946.930431  7403487.869025 
+321002.658458  7403453.704877 
+321028.238266  7403437.807600 
+321090.332382  7403422.910152 
+321099.073387  7403445.296317 
+321119.260159  7403477.970720 
+321142.918595  7403512.094875 
+321155.279695  7403532.961301 
+321207.090762  7403600.209782 
+321214.561847  7403620.636283 
+321219.319922  7403644.732156 
+321210.348023  7403660.849395 
+321191.043597  7403684.125408 
+321169.050900  7403699.072848 
+321245.361518  7403734.656752 
+321336.927664  7403766.711262 
+321382.710736  7403782.728518 
+321421.624699  7403798.755773 
+321455.962003  7403828.510676 
+321478.738092  7403839.368816 
+321524.059376  7403861.585011 
+321608.946074  7403877.032365 
+321698.615586  7403892.609696 
+321692.966918  7403783.368408 
+321691.746476  7403764.421654 
+321698.615586  7403711.770673 
+321714.638012  7403643.092436 
+321723.799574  7403581.283024 
+321753.560221  7403527.492238 
+322389.946578  7403916.655578 
+322511.900084  7404001.031125 
+322804.212468  7404268.035389 
+323137.508618  7404495.796376 
+323487.478646  7404590.230200 
+323840.186424  7404582.341552 
+324445.839080  7404704.830570 
+324434.236633  7404756.791670 
+324405.193409  7404825.569889 
+324397.697585  7404837.227892 
+324379.423938  7404843.986734 
+324362.659351  7404844.446655 
+324342.522056  7404845.316506 
+324328.346786  7404843.046895 
+324308.242475  7404849.335818 
+324299.872551  7404856.994506 
+324293.036426  7404864.993136 
+324288.162904  7404879.110718 
+324285.944668  7404893.598236 
+324285.656049  7404909.655486 
+324288.014471  7404942.909790 
+324292.789039  7404979.843463 
+324324.248409  7405126.198394 
+324334.185117  7405149.464409 
+324345.680362  7405162.782127 
+324361.348201  7405176.489779 
+324375.853320  7405185.968156 
+324391.183063  7405193.896798 
+324408.673318  7405202.195376 
+324428.175654  7405211.283819 
+324444.231065  7405227.321072 
+324463.395305  7405317.145686 
+324508.345508  7405326.324114 
+324537.240300  7405336.972290 
+324558.053786  7405349.740103 
+324569.796419  7405364.567563 
+324585.109669  7405384.724111 
+324604.950100  7405400.021490 
+324644.086711  7405409.219915 
+324677.450960  7405421.937736 
+324700.548652  7405433.955678 
+324711.969681  7405440.624536 
+324735.496177  7405472.879011 
+324746.702805  7405493.085549 
+324746.777021  7405498.524618 
+324746.875976  7405521.450691 
+324741.202569  7405560.254044 
+324762.552060  7405557.054592 
+324820.217951  7405549.615866 
+324853.573954  7405549.125950 
+324907.801167  7405533.498627 
+324930.783412  7405516.951461 
+325043.863973  7405356.458952 
+325043.855726  7405356.408961 
+325149.547664  7405210.373975 
+325157.142443  7405185.238281 
+325145.243132  7405147.694712 
+Region 1
+718
+323801.594064  7374893.696948 
+323341.363686  7374955.656335 
+323049.917156  7375031.743302 
+322777.700836  7375177.838277 
+322504.519707  7375393.701301 
+322310.749779  7375670.223936 
+321932.519918  7376293.277212 
+321597.722954  7376956.403625 
+321575.021081  7377366.123443 
+321575.021081  7377366.143440 
+321514.757627  7377376.651640 
+321604.047813  7377768.444529 
+321611.758039  7377807.797789 
+321425.846769  7377844.301536 
+321247.093227  7377890.583608 
+321055.417842  7377960.361656 
+320997.356132  7378016.532034 
+320978.026967  7378042.977504 
+320950.113476  7378116.554901 
+320938.700693  7378147.009685 
+320932.359342  7378199.020776 
+320940.382924  7378246.772596 
+320973.483294  7378326.508938 
+320987.130806  7378405.445417 
+320999.590860  7378490.820793 
+321110.378969  7378603.311524 
+321224.712957  7378714.632456 
+321370.019787  7378825.723427 
+321405.272423  7378864.896717 
+321423.298683  7378924.666479 
+321415.687412  7378996.984092 
+321340.547759  7379131.341078 
+321308.956449  7379220.105873 
+321262.324015  7379298.332473 
+321233.726087  7379338.945517 
+321213.333159  7379366.700763 
+321245.592413  7379419.461725 
+321278.676290  7379466.353693 
+321305.319862  7379480.311302 
+321323.082242  7379512.025870 
+321364.948355  7379545.010220 
+321382.702490  7379556.428264 
+321411.885900  7379570.375875 
+321418.227252  7379575.455005 
+321451.212174  7379591.942181 
+321488.872709  7379634.864828 
+321509.570748  7379661.720228 
+321551.189474  7379698.044006 
+321578.146402  7379727.798910 
+321631.235635  7379786.138917 
+321653.417996  7379810.524740 
+321656.716488  7379836.780242 
+321668.285950  7379867.355005 
+321678.626723  7379918.226291 
+321683.401290  7379946.841390 
+321678.230904  7379973.766778 
+321662.282694  7380001.392046 
+321647.357016  7380037.795810 
+321622.469892  7380086.707432 
+321593.286482  7380120.951566 
+321538.745912  7380162.824394 
+321540.708515  7380182.531018 
+321548.657882  7380268.376314 
+321573.858363  7380307.589597 
+321593.443160  7380349.462424 
+321606.282541  7380393.574868 
+321610.949908  7380432.868138 
+321613.836089  7380465.512546 
+321613.662918  7380485.939047 
+321622.890450  7380534.900661 
+321596.321095  7380535.280595 
+321579.688448  7380539.779825 
+321565.298775  7380541.949453 
+321549.416535  7380548.378352 
+321524.636612  7380555.717095 
+321484.147619  7380563.855701 
+321357.708165  7380566.955170 
+321333.777603  7380568.084976 
+321301.732751  7380569.174790 
+321242.269182  7380571.744350 
+321165.505021  7380576.803483 
+321107.781406  7380582.422520 
+321054.222138  7380595.880215 
+320992.985630  7380612.847309 
+320944.134959  7380613.757153 
+320928.227980  7380616.146744 
+320770.048784  7380593.890556 
+320665.923630  7380576.403551 
+320659.557540  7380643.961979 
+320654.049057  7380685.994779 
+320638.892486  7380733.796591 
+320617.122437  7380787.107460 
+320571.067238  7380889.969840 
+320561.781983  7380930.922825 
+320556.463164  7380947.679955 
+320556.652827  7380982.254033 
+320553.717169  7380997.491423 
+320543.500089  7381046.982945 
+320543.500089  7381055.721449 
+320518.060468  7381092.295184 
+320506.936303  7381112.161781 
+320488.646163  7381141.576742 
+320488.654409  7381141.596739 
+320468.912933  7381152.014954 
+320449.303397  7381174.281140 
+320433.602574  7381182.149793 
+320363.550844  7381219.963315 
+320351.280453  7381230.551502 
+320308.235129  7381218.973485 
+320305.381933  7381169.691927 
+320293.606316  7381090.475496 
+320281.154508  7381058.091043 
+320276.346955  7381033.995170 
+320266.905021  7381005.310084 
+320262.674705  7380968.036468 
+320260.885273  7380948.079887 
+320251.187705  7380907.196890 
+320242.388977  7380884.050854 
+320224.898722  7380863.344401 
+320205.882914  7380849.926699 
+320189.547131  7380834.659315 
+320170.020057  7380805.064384 
+320159.365927  7380783.888011 
+320151.927827  7380758.322390 
+320144.118647  7380721.458705 
+320128.104467  7380678.496064 
+320104.668679  7380672.737050 
+320024.432855  7380552.557636 
+319971.022019  7380462.803010 
+319958.710397  7380438.387192 
+319938.259745  7380406.492656 
+319899.378767  7380344.283312 
+319779.478574  7380165.683904 
+319723.057864  7380051.013546 
+319708.173417  7380017.819232 
+319704.619292  7379991.523736 
+319698.591297  7379975.496481 
+319690.567715  7379940.472481 
+319608.319810  7379939.422660 
+319603.479273  7379969.427521 
+319609.408313  7379986.604579 
+319602.522710  7379990.733871 
+319596.643148  7380008.940753 
+319590.087394  7380018.009199 
+319574.436049  7380022.068504 
+319552.352643  7380021.508600 
+319534.351122  7380033.156605 
+319526.987238  7380047.174204 
+319519.499660  7380074.879458 
+319510.049480  7380109.043606 
+319501.052842  7380134.839187 
+319488.716481  7380151.086404 
+319476.017286  7380165.453943 
+319461.470935  7380173.702530 
+319324.031009  7380253.598845 
+319283.426569  7380280.284274 
+319232.200984  7380316.818016 
+319202.225936  7380330.965593 
+319169.612094  7380358.100945 
+319144.213703  7380387.935834 
+319118.312293  7380429.578701 
+319119.376057  7380437.947268 
+319122.880705  7380471.841462 
+319125.230880  7380506.095595 
+319120.711946  7380542.199410 
+319056.176945  7380519.233344 
+319045.539307  7380517.623620 
+319022.029304  7380506.385545 
+318988.252743  7380494.317612 
+318968.601976  7380477.810440 
+318932.071174  7380432.998115 
+318901.378703  7380374.158194 
+318877.802730  7380329.455851 
+318864.790178  7380293.971929 
+318852.907360  7380261.157550 
+318866.587856  7380222.474176 
+318872.797268  7380209.586384 
+318880.911559  7380197.098523 
+318884.160574  7380175.062298 
+318882.082524  7380152.596146 
+318867.577404  7380113.682811 
+318840.669953  7380058.302297 
+318796.198031  7379966.248066 
+318778.072816  7379928.554522 
+318745.524944  7379864.425507 
+318643.906644  7379645.762962 
+318626.952394  7379609.929100 
+318543.797404  7379457.085281 
+318495.350799  7379342.184962 
+318443.061450  7379223.315323 
+318425.934029  7379187.131521 
+318416.401387  7379175.703479 
+318381.627032  7379134.010620 
+318365.167556  7379183.482146 
+318186.075918  7379135.680334 
+318156.282287  7379128.661537 
+318125.985636  7379120.312967 
+318102.731265  7379111.604458 
+318082.346583  7379102.376039 
+318047.959801  7379098.726664 
+318037.948877  7379132.490881 
+318000.981025  7379136.660166 
+317973.281936  7379139.919608 
+317978.171951  7379179.022910 
+317977.297851  7379250.690634 
+317925.363090  7379280.295563 
+317887.818002  7379301.441941 
+317862.757707  7379310.710353 
+317757.675990  7379363.011395 
+317601.360442  7379432.439502 
+317587.152186  7379473.382489 
+317571.203976  7379464.174066 
+317549.961686  7379448.466757 
+317535.959587  7379426.710483 
+317524.233447  7379407.633751 
+317518.576532  7379392.756299 
+317515.962477  7379381.328257 
+317509.926236  7379364.171196 
+317499.371061  7379338.615573 
+317485.690565  7379373.269637 
+317452.466501  7379475.502126 
+317443.956391  7379516.115169 
+317428.808066  7379497.398375 
+317399.352530  7379435.598961 
+317379.206988  7379430.179889 
+317407.524544  7379312.799995 
+317438.060336  7379192.110668 
+317458.659420  7379128.481567 
+317461.191013  7379087.388606 
+317535.036009  7378971.768411 
+317516.968517  7378868.506099 
+317513.991628  7378855.548318 
+317369.558898  7378659.011983 
+317400.053459  7378659.581886 
+317426.367181  7378588.953984 
+317426.400166  7378588.943985 
+317456.919466  7378513.396926 
+317355.078517  7378530.104064 
+317384.031033  7378464.975220 
+317331.749931  7378477.603057 
+317294.386260  7378479.272771 
+317259.348026  7378476.383266 
+317105.926905  7378447.628191 
+317033.351829  7378478.392922 
+317012.093046  7378398.316638 
+317000.070042  7378368.941670 
+316984.591867  7378342.956121 
+316945.752120  7378338.146945 
+316925.903443  7378344.495857 
+316903.770560  7378348.545163 
+316884.383672  7378340.046619 
+316800.049471  7378229.135617 
+316784.892899  7378214.578111 
+316759.799619  7378203.769962 
+316700.377281  7378205.439676 
+316679.654504  7378198.530860 
+316659.228590  7378192.401909 
+316631.628456  7378189.172463 
+316593.934936  7378185.593076 
+316544.325613  7378180.203999 
+316519.809569  7378175.024886 
+316494.971922  7378171.165547 
+316469.029281  7378157.547880 
+316447.415910  7378148.859368 
+316424.037846  7378134.161885 
+316392.215642  7378109.836052 
+316376.869407  7378097.458172 
+316345.055449  7378056.295223 
+316369.093211  7378043.307448 
+316387.457567  7378034.448965 
+316430.296735  7378018.711661 
+316477.160064  7378007.003666 
+316555.746642  7377986.507177 
+316578.003219  7377977.268760 
+316599.657820  7377966.240649 
+316621.732980  7377946.584016 
+316668.085042  7377918.808773 
+316693.335000  7377906.060957 
+316714.577291  7377896.252637 
+316745.080098  7377887.884070 
+316775.162347  7377880.285372 
+316796.008818  7377876.785971 
+316818.751922  7377877.185903 
+316840.076675  7377876.236066 
+316863.495970  7377871.546869 
+316889.191224  7377864.338104 
+316908.512143  7377860.588746 
+316929.111227  7377860.958683 
+316938.841779  7377866.177789 
+316953.783949  7377870.137110 
+316966.738777  7377869.857158 
+316984.699068  7377868.857330 
+316999.616499  7377858.969023 
+317008.258549  7377853.319991 
+317013.445428  7377846.071233 
+317020.248568  7377832.533552 
+317026.614658  7377813.116877 
+317039.701426  7377802.538689 
+317061.199350  7377803.808472 
+317073.890299  7377808.847609 
+317085.162896  7377812.526978 
+317101.119352  7377817.156186 
+317116.638758  7377815.806417 
+317147.125073  7377808.767622 
+317194.310005  7377787.211315 
+317260.139664  7377743.728763 
+317279.064763  7377730.680998 
+317300.348285  7377717.103324 
+317322.233781  7377696.216901 
+317338.247961  7377671.941060 
+317339.138553  7377649.684872 
+317336.211142  7377623.399374 
+317334.801036  7377597.353836 
+317334.289770  7377564.889397 
+317337.547031  7377533.364796 
+317342.874096  7377499.100666 
+317351.227528  7377450.908920 
+317357.494663  7377439.130938 
+317379.841948  7377365.423563 
+317379.330682  7377332.739162 
+317377.079461  7377309.453150 
+317368.528120  7377275.229013 
+317355.210457  7377247.703728 
+317344.902669  7377223.757829 
+317330.414041  7377191.683323 
+317314.333892  7377164.897911 
+317306.681390  7377148.630698 
+317301.370817  7377133.383310 
+317299.952465  7377108.337600 
+317300.315300  7377087.621148 
+317298.055832  7377064.005193 
+317289.224119  7377044.948458 
+317282.569411  7377030.470938 
+317270.051633  7377004.175442 
+317264.328749  7376980.839439 
+317262.201222  7376955.553770 
+317262.514578  7376930.528057 
+317265.186357  7376904.752472 
+317274.438628  7376865.879131 
+317270.604131  7376838.583806 
+317268.946638  7376824.716182 
+317266.761387  7376811.728406 
+317262.217714  7376800.160388 
+317252.948951  7376791.181926 
+317243.160675  7376782.303446 
+317237.462530  7376765.066399 
+317233.240460  7376752.608533 
+317231.079947  7376729.652465 
+317223.147073  7376711.605556 
+317218.149857  7376695.148375 
+317215.733712  7376676.401586 
+317223.658340  7376662.763922 
+317238.229429  7376639.357932 
+317256.164981  7376608.453225 
+317254.466257  7376597.355126 
+317253.765328  7376588.156702 
+317249.798891  7376579.358209 
+317244.776936  7376564.890687 
+317236.291565  7376550.383172 
+317227.995857  7376536.995465 
+317214.645209  7376528.296955 
+317196.148914  7376506.910619 
+317194.532653  7376480.855082 
+317200.107105  7376467.747327 
+317205.722788  7376459.398757 
+317208.130687  7376445.801086 
+317207.710129  7376431.063611 
+317205.013612  7376417.965854 
+317197.262155  7376402.028584 
+317192.388633  7376384.241631 
+317187.333694  7376372.323672 
+317184.925794  7376361.445536 
+317182.427186  7376349.007666 
+317182.575618  7376337.149697 
+317190.219874  7376321.742336 
+317196.066452  7376310.744220 
+317202.993286  7376303.405477 
+317217.655084  7376297.166546 
+317230.642897  7376294.227050 
+317243.713172  7376293.067248 
+317262.506332  7376282.888992 
+317272.500764  7376266.731759 
+317278.685437  7376244.875503 
+317280.070803  7376224.069067 
+317278.710175  7376202.562751 
+317280.079050  7376183.196068 
+317282.759075  7376164.179325 
+317285.414361  7376148.042090 
+317284.762909  7376134.854349 
+317286.939914  7376099.550396 
+317285.867904  7376079.593814 
+317280.870688  7376063.366594 
+317274.991125  7376044.129889 
+317272.599718  7376023.823367 
+317272.492517  7375999.347560 
+317275.749779  7375967.712978 
+317275.815748  7375945.996698 
+317276.755819  7375920.421079 
+317276.137351  7375896.715140 
+317275.791010  7375874.998859 
+317277.407271  7375852.202764 
+317286.486371  7375827.506994 
+317292.390672  7375812.179620 
+317304.042596  7375801.921377 
+317321.318449  7375790.613314 
+317333.316715  7375785.454198 
+317346.675608  7375777.425573 
+317352.349015  7375764.307820 
+317358.253316  7375756.739116 
+317370.193858  7375740.391916 
+317369.039386  7375726.304330 
+317358.294547  7375713.326552 
+317347.706387  7375703.558226 
+317329.127629  7375680.942100 
+317316.337726  7375659.855712 
+317306.145385  7375643.108580 
+317299.630862  7375625.861534 
+317290.724933  7375604.585179 
+317288.053155  7375581.849073 
+317286.403909  7375566.651677 
+317285.422607  7375555.783538 
+317287.113084  7375534.987100 
+317286.923421  7375525.458733 
+317288.811808  7375521.159469 
+317293.289511  7375514.350635 
+317293.371973  7375507.481812 
+317294.815064  7375498.193403 
+317293.017385  7375486.985323 
+317293.132833  7375477.686915 
+317296.571511  7375472.297839 
+317289.174642  7375451.941325 
+317277.242346  7375411.798202 
+317268.361156  7375388.322223 
+317262.852674  7375363.986391 
+317256.758709  7375337.660901 
+317243.210152  7375320.323870 
+317231.937555  7375300.577253 
+317218.380752  7375283.460185 
+317199.142296  7375256.524799 
+317181.107789  7375231.149145 
+317169.793961  7375214.392015 
+317159.585127  7375190.786059 
+317148.551671  7375168.159935 
+317136.891501  7375146.413660 
+317131.209848  7375120.308131 
+317125.256069  7375098.971786 
+317113.125864  7375066.367371 
+317108.466744  7375039.501973 
+317108.079171  7375021.555047 
+317099.643277  7374986.880986 
+317091.050704  7374948.337588 
+317085.500991  7374919.472533 
+317074.253133  7374897.626275 
+317058.882159  7374879.589364 
+317046.875647  7374861.052539 
+317022.260648  7374839.926158 
+317003.154132  7374826.608439 
+316979.174093  7374812.020938 
+316955.977446  7374799.763038 
+316935.601011  7374790.204675 
+316902.022359  7374775.827138 
+316854.078774  7374753.171018 
+316817.622189  7374733.224435 
+316786.921472  7374709.238544 
+316770.585689  7374686.552430 
+316763.155835  7374669.395368 
+316746.556173  7374643.489806 
+316727.763013  7374621.763527 
+316711.748833  7374597.637660 
+316699.808291  7374566.033073 
+316693.120598  7374538.367812 
+316684.008514  7374508.782880 
+316685.674252  7374482.447391 
+316686.812232  7374456.431847 
+316693.689588  7374421.067905 
+316702.191452  7374393.372649 
+316712.458009  7374371.906326 
+316723.219340  7374351.549813 
+316747.034454  7374306.987446 
+316770.090915  7374257.545915 
+316778.394870  7374221.542082 
+316832.679806  7374073.027521 
+316851.415242  7374034.944044 
+316871.321643  7374009.388422 
+316890.378682  7373994.121037 
+316914.490660  7373973.824513 
+316935.188699  7373949.598663 
+316956.595914  7373917.974080 
+316980.105917  7373881.270367 
+316986.818349  7373857.984356 
+316989.267480  7373841.847120 
+316984.501158  7373823.620242 
+316978.069098  7373800.274241 
+316964.132969  7373773.188881 
+316956.109386  7373754.362105 
+316951.244110  7373728.056611 
+316948.407407  7373702.211038 
+316944.861528  7373682.124479 
+316940.655950  7373653.929309 
+316937.728538  7373635.722427 
+316935.675227  7373604.127839 
+316934.924820  7373590.940098 
+316940.705427  7373569.193823 
+316941.802176  7373555.026250 
+316936.854438  7373534.809713 
+316934.660940  7373523.151710 
+316942.099040  7373499.425774 
+316955.350733  7373491.177187 
+316965.971878  7373490.097372 
+316985.482460  7373487.677786 
+317002.939730  7373486.018070 
+317055.509450  7373481.368867 
+317082.153022  7373470.400745 
+317105.786719  7373456.193179 
+317124.777788  7373446.244883 
+317144.304862  7373442.055603 
+317186.072020  7373436.826496 
+317223.501661  7373436.076625 
+317248.067182  7373428.637899 
+317270.653608  7373416.959899 
+317285.331899  7373409.271216 
+317300.810073  7373402.492377 
+317319.355846  7373387.554936 
+317333.646564  7373378.206537 
+317352.901512  7373363.269096 
+317395.377847  7373334.234070 
+317409.808750  7373321.676221 
+317423.258352  7373314.207500 
+317444.360457  7373306.498820 
+317460.844672  7373301.389695 
+317477.254671  7373293.840988 
+317501.135755  7373292.031298 
+317528.480255  7373282.632908 
+317542.663772  7373281.263143 
+317559.881902  7373274.274340 
+317571.080283  7373267.775453 
+317582.509559  7373258.717005 
+317584.307237  7373245.669240 
+317582.930116  7373233.471329 
+317579.953227  7373219.033802 
+317569.661931  7373202.066709 
+317561.473424  7373188.569021 
+317551.388284  7373171.601927 
+317540.363074  7373156.284551 
+317527.342276  7373138.067671 
+317514.313231  7373119.960773 
+317510.635412  7373104.073494 
+317508.004865  7373078.007959 
+317506.231925  7373048.862951 
+317510.371533  7373027.976529 
+317516.547960  7373006.790158 
+317529.948084  7372979.484835 
+317543.884214  7372965.487232 
+317559.675746  7372950.399817 
+317580.184122  7372941.241386 
+317597.451729  7372930.273264 
+317611.445582  7372920.474943 
+317622.215159  7372906.877272 
+317628.292631  7372894.329421 
+317635.293681  7372872.153220 
+317639.004485  7372852.706551 
+317645.370575  7372833.509839 
+317651.852112  7372820.632045 
+317666.604619  7372806.864403 
+317682.734246  7372804.964729 
+317698.962828  7372804.054884 
+317725.276550  7372803.055056 
+317749.273081  7372800.145554 
+317773.187150  7372787.707685 
+317790.677405  7372775.749733 
+317807.928520  7372765.441499 
+317820.908087  7372755.193254 
+317833.871161  7372745.934840 
+317862.337149  7372720.379217 
+317874.079782  7372710.560899 
+317891.619514  7372694.053727 
+317909.390141  7372675.226951 
+317920.374121  7372661.629281 
+317936.446024  7372640.232946 
+317963.493661  7372613.427537 
+317978.221429  7372601.649555 
+317997.814473  7372584.062567 
+318025.002295  7372562.586246 
+318059.446801  7372547.958751 
+318075.741352  7372541.179912 
+318092.126613  7372535.290921 
+318134.817349  7372513.564643 
+318161.089839  7372507.695648 
+318185.729577  7372502.356563 
+318210.740394  7372499.677022 
+318243.947965  7372494.447917 
+318267.474461  7372488.318967 
+318289.318726  7372477.840762 
+318297.202123  7372467.312565 
+318297.795851  7372452.365126 
+318290.646369  7372420.710548 
+318285.896540  7372409.572456 
+318284.263787  7372393.375230 
+318285.657400  7372379.437617 
+318289.970178  7372368.859429 
+318298.150439  7372359.101101 
+318305.060780  7372353.102129 
+318318.279488  7372339.534453 
+318330.261261  7372327.166571 
+318344.510748  7372312.949006 
+318359.494149  7372305.160341 
+318381.528077  7372296.021906 
+318396.965021  7372292.782461 
+318415.956090  7372290.132915 
+318470.892479  7372283.514048 
+318487.500387  7372284.383899 
+318508.437567  7372297.721615 
+318514.960335  7372306.550102 
+318526.298902  7372320.867650 
+318535.303786  7372334.275353 
+318540.968947  7372346.193312 
+318555.564775  7372361.440700 
+318569.443181  7372368.149551 
+318584.335874  7372368.229537 
+318607.441812  7372363.090418 
+318704.508193  7372330.186054 
+318723.796126  7372320.237758 
+318737.484869  7372309.999512 
+318750.266527  7372290.882786 
+318775.269098  7372272.705900 
+318794.054011  7372254.219066 
+318812.533814  7372244.370753 
+318828.416055  7372245.900491 
+318848.380179  7372247.250260 
+318867.371248  7372245.050637 
+318879.006680  7372244.090801 
+318898.278121  7372236.242146 
+318923.041551  7372228.693439 
+318935.748993  7372215.445708 
+318948.068861  7372192.449647 
+318951.021012  7372176.432390 
+318951.392092  7372154.726109 
+318950.913811  7372119.492144 
+318946.831927  7372095.406269 
+318951.499293  7372064.231609 
+318962.475026  7372042.765286 
+318975.462839  7372031.517213 
+318999.747989  7372013.550291 
+319017.914435  7372003.691979 
+319036.847780  7371997.952962 
+319056.135714  7371996.643187 
+319083.999727  7372002.302217 
+319108.392077  7372008.591140 
+319125.131926  7372015.339984 
+319151.082814  7372027.067975 
+319173.240435  7372040.855614 
+319192.025349  7372047.184529 
+319227.533618  7372060.812195 
+319248.899601  7372064.281601 
+319269.185329  7372072.960114 
+319295.515543  7372079.049071 
+319317.161899  7372084.628116 
+319346.411279  7372093.856535 
+319371.496313  7372101.705191 
+319400.984833  7372107.834141 
+319418.928631  7372107.834141 
+319431.611334  7372104.664684 
+319450.940499  7372091.836881 
+319466.468151  7372080.958744 
+319493.474556  7372065.781344 
+319519.260519  7372057.912692 
+319544.914543  7372052.913548 
+319578.089129  7372042.025413 
+319595.670093  7372029.837501 
+319625.612156  7372008.171212 
+319641.667567  7371995.853322 
+319659.306255  7371979.126187 
+319670.249003  7371960.429390 
+319678.668404  7371939.273014 
+319688.629851  7371908.708249 
+319695.672132  7371867.485310 
+319702.590719  7371827.142221 
+319709.253674  7371791.448335 
+319717.524643  7371757.884084 
+319720.996306  7371724.579789 
+319851.616599  7371796.877405 
+319961.283221  7371840.549924 
+320018.198705  7371895.970431 
+320067.008144  7371996.263252 
+320110.432795  7372128.840542 
+320136.631069  7372243.690870 
+320124.162769  7372345.213480 
+320092.150901  7372509.195391 
+320090.666580  7372628.684924 
+320115.883553  7373012.569168 
+320192.961071  7373267.615481 
+320316.052556  7373438.506209 
+320515.083579  7373545.527877 
+320820.070419  7373594.159547 
+321080.857463  7373572.453265 
+321527.168205  7373538.189134 
+321630.056424  7373487.617796 
+321696.018023  7373413.670463 
+321843.188502  7373261.076601 
+322020.573169  7373089.026071 
+322101.674848  7373010.269562 
+322202.212892  7372976.615326 
+322287.462424  7372967.796837 
+322487.012959  7373033.715546 
+322895.605442  7373204.296327 
+323066.417863  7373296.880468 
+323129.781900  7373306.728781 
+323274.527986  7373343.382502 
+323479.669466  7373360.829514 
+323699.307819  7373418.219684 
+323823.100234  7373534.359790 
+323906.172761  7373704.610627 
+323913.907726  7373898.987332 
+323887.074491  7374043.092648 
+323820.238792  7374181.728901 
+323766.976388  7374445.023801 
+323784.664553  7374692.451419 
+323801.594064  7374893.696948 
+Region 1
+147
+331727.186525  7392674.131320 
+331692.156537  7392705.036027 
+331671.359543  7392723.602846 
+331650.760459  7392741.629758 
+331536.789305  7392841.392670 
+331390.410465  7392972.170269 
+331240.576454  7393109.116811 
+331168.628092  7393169.086539 
+331103.087051  7393230.246063 
+331028.846236  7393298.264412 
+330953.483934  7393366.462730 
+330894.861481  7393420.303508 
+330801.538889  7393511.227933 
+330699.302121  7393599.372835 
+330672.040082  7393625.528355 
+330568.887983  7393716.152831 
+330482.170622  7393807.187238 
+330396.962321  7393901.111150 
+330311.589095  7394000.004210 
+330299.277472  7393989.116075 
+330242.337250  7393938.754702 
+330202.763589  7393915.788636 
+330174.610957  7393904.330598 
+330108.591635  7393887.363505 
+330047.627252  7393895.972030 
+330016.943027  7393904.840511 
+329987.553461  7393916.498514 
+329950.049604  7393932.015856 
+329891.443643  7393959.711112 
+329852.232816  7393979.317754 
+329809.632789  7394000.004210 
+329804.668558  7394009.682552 
+329669.281943  7394074.731410 
+329569.453075  7394122.433239 
+329429.481556  7394185.712400 
+329165.090909  7394296.363447 
+328967.098911  7394382.238737 
+328917.778206  7394394.776589 
+328883.787243  7394426.091225 
+328792.913781  7394490.280230 
+328776.767662  7394451.716836 
+328758.881587  7394420.012267 
+328741.506779  7394402.505265 
+328700.630214  7394335.056819 
+328681.210341  7394304.881987 
+328660.767935  7394274.697158 
+328640.086389  7394247.831760 
+328585.743729  7394189.281789 
+328547.687374  7394140.350170 
+328519.881085  7394109.675424 
+328502.786649  7394094.478028 
+328460.178375  7394050.885495 
+328433.402864  7394028.089399 
+328415.277649  7394010.902343 
+328407.922011  7394004.773393 
+328324.610343  7393952.092417 
+328314.813821  7393925.137034 
+328303.780364  7393911.659343 
+328292.763400  7393893.282491 
+328287.856893  7393876.125429 
+328282.950386  7393863.877527 
+328277.969662  7393848.600144 
+328278.052125  7393832.432914 
+328279.173612  7393807.517181 
+328335.577830  7393715.922871 
+328367.169139  7393642.865385 
+328381.616535  7393612.350612 
+328401.423981  7393577.916510 
+328442.556180  7393518.476691 
+328572.013755  7393325.659719 
+328692.293275  7393143.760877 
+328775.011215  7393020.531985 
+328795.173249  7392990.087200 
+328810.478253  7392973.320072 
+328853.136004  7392939.925792 
+328907.462171  7392895.823346 
+328794.431088  7392739.210173 
+328715.795032  7392628.209186 
+328715.803279  7392628.199188 
+328800.821917  7392551.442336 
+328852.567014  7392483.274012 
+328945.617480  7392365.734146 
+329031.353541  7392255.433039 
+329106.567410  7392160.949224 
+329195.585470  7392048.128549 
+329195.593716  7392048.128549 
+329234.936483  7391999.966798 
+329270.551953  7391949.105511 
+329351.966988  7391848.712707 
+329393.998026  7391790.282715 
+329453.948122  7391717.875118 
+329473.912247  7391695.848891 
+329514.549671  7391660.544938 
+329486.627935  7391638.178769 
+329470.308644  7391628.130491 
+329472.856729  7391593.276461 
+329474.926533  7391573.469854 
+329485.481708  7391517.889374 
+329503.978004  7391411.327627 
+329521.756877  7391313.744342 
+329527.215882  7391291.428165 
+329543.898006  7391183.196704 
+329547.419147  7391152.122027 
+329558.535066  7391100.580855 
+329558.765960  7391099.081112 
+329586.671205  7390947.337104 
+329588.922426  7390912.033152 
+329591.313833  7390864.321324 
+329583.422190  7390823.248360 
+329684.768365  7390895.316015 
+329742.887798  7390927.450511 
+329789.462509  7390960.114916 
+329836.202144  7390988.010137 
+329893.736095  7391025.903647 
+330043.256749  7391125.106654 
+330125.809764  7391177.297714 
+330205.006564  7391226.889220 
+330282.422177  7391276.850662 
+330364.488664  7391331.081372 
+330388.782060  7391339.559920 
+330454.281870  7391387.281746 
+330490.524053  7391405.308658 
+330537.601784  7391447.391450 
+330564.690652  7391470.517488 
+330605.517740  7391515.519780 
+330653.477817  7391561.041982 
+330672.823474  7391582.798256 
+330735.577290  7391647.837115 
+330804.053989  7391714.025778 
+330840.279680  7391748.169929 
+330879.259612  7391793.582150 
+330950.474060  7391859.860797 
+330984.069204  7391894.364887 
+331016.509875  7391928.729001 
+331075.998183  7391991.998163 
+331142.306124  7392053.467634 
+331175.521941  7392089.601445 
+331228.330802  7392143.752169 
+331268.399237  7392184.845130 
+331314.891485  7392231.127203 
+331393.346123  7392309.223826 
+331477.012380  7392393.809337 
+331512.965945  7392428.223442 
+331552.696284  7392470.546192 
+331642.151394  7392566.939681 
+331708.401611  7392647.115948 
+331727.186525  7392674.131320 
+Region 1
+383
+320638.224541  7383590.747222 
+320687.718417  7383585.908051 
+320748.649815  7383586.048027 
+320869.811682  7383587.047855 
+321023.843025  7383594.726540 
+321065.065932  7383592.166978 
+321131.044023  7383583.028544 
+321225.537580  7383548.284495 
+321241.790901  7383541.465663 
+321241.840378  7383525.508396 
+321235.193916  7383501.942433 
+321229.141183  7383471.627626 
+321223.830610  7383447.091829 
+321207.123747  7383386.852147 
+321193.228848  7383354.447698 
+321162.288991  7383272.211784 
+321147.503499  7383233.668386 
+321024.337798  7382972.973041 
+321031.734667  7382962.804783 
+321018.656146  7382946.517572 
+321010.294468  7382930.870253 
+320994.082378  7382905.194651 
+320986.669017  7382885.158083 
+320971.957741  7382853.743464 
+320961.575737  7382835.016671 
+320946.757261  7382812.120593 
+320937.537975  7382798.382946 
+320926.050975  7382778.636329 
+320915.932850  7382755.370314 
+320903.415072  7382735.833661 
+320890.179872  7382717.276839 
+320878.231084  7382693.430924 
+320862.018994  7382667.315397 
+320853.822241  7382645.279172 
+320845.757428  7382620.703381 
+320843.844302  7382602.516497 
+320847.810739  7382586.619220 
+320850.564980  7382561.723484 
+320854.127352  7382537.287670 
+320850.457779  7382521.080446 
+320844.479262  7382509.372451 
+320839.102719  7382498.234359 
+320826.189122  7382486.776322 
+320814.669138  7382477.767865 
+320797.797350  7382464.050215 
+320785.254833  7382455.031759 
+320767.014171  7382445.283429 
+320752.789423  7382432.265659 
+320737.476173  7382416.008444 
+320731.745043  7382400.881035 
+320724.587314  7382385.393688 
+320715.640154  7382366.566913 
+320721.544455  7382351.019576 
+320734.886857  7382336.232109 
+320740.123213  7382325.223994 
+320744.980243  7382312.096243 
+320747.701499  7382298.068646 
+320745.293600  7382286.410643 
+320742.407419  7382272.742984 
+320737.261771  7382251.306656 
+320725.947942  7382217.052523 
+320720.291028  7382196.386063 
+320717.660481  7382177.849238 
+320712.547818  7382153.643385 
+320704.656175  7382132.167063 
+320692.963020  7382111.870540 
+320680.742106  7382093.993602 
+320675.085192  7382086.444895 
+320656.407479  7382064.788605 
+320644.640108  7382051.350906 
+320630.860657  7382035.233667 
+320611.539738  7382013.397407 
+320597.479915  7381995.050550 
+320583.733449  7381976.503727 
+320573.277228  7381955.987241 
+320564.577455  7381941.479726 
+320554.434591  7381920.203371 
+320537.315416  7381901.936500 
+320525.300658  7381891.488289 
+320503.085313  7381881.360024 
+320447.307809  7381853.864734 
+320433.503619  7381839.847135 
+320413.193153  7381816.231180 
+320400.444480  7381799.124110 
+320396.412073  7381787.226148 
+320386.063054  7381765.499870 
+320373.009271  7381749.162668 
+320360.458508  7381732.615503 
+320353.473950  7381727.986296 
+320343.372318  7381719.887683 
+320341.970459  7381709.239507 
+320344.493805  7381703.180545 
+320349.688931  7381695.711824 
+320352.855483  7381687.443240 
+320350.843403  7381676.565104 
+320345.689509  7381664.427183 
+320338.531780  7381641.081182 
+320337.402047  7381625.003936 
+320339.166740  7381606.307138 
+320341.088112  7381591.159733 
+320344.774177  7381573.262798 
+320345.301936  7381546.787333 
+320355.131443  7381519.442017 
+320361.316116  7381481.088587 
+320363.509613  7381452.533478 
+320363.625060  7381409.780801 
+320359.906010  7381389.024357 
+320357.176508  7381370.047607 
+320343.718660  7381336.433365 
+320337.987529  7381313.107361 
+320327.918882  7381285.842031 
+320316.266958  7381254.357424 
+320309.018521  7381230.011594 
+320308.235129  7381218.973485 
+320351.280453  7381230.551502 
+320363.550844  7381219.963315 
+320433.602574  7381182.149793 
+320449.303397  7381174.281140 
+320468.912933  7381152.014954 
+320488.654409  7381141.596739 
+320488.646163  7381141.576742 
+320506.936303  7381112.161781 
+320518.060468  7381092.295184 
+320543.500089  7381055.721449 
+320543.500089  7381046.982945 
+320553.717169  7380997.491423 
+320556.652827  7380982.254033 
+320556.463164  7380947.679955 
+320561.781983  7380930.922825 
+320571.067238  7380889.969840 
+320617.122437  7380787.107460 
+320638.892486  7380733.796591 
+320654.049057  7380685.994779 
+320659.557540  7380643.961979 
+320665.923630  7380576.403551 
+320770.048784  7380593.890556 
+320928.227980  7380616.146744 
+320944.134959  7380613.757153 
+320992.985630  7380612.847309 
+321054.222138  7380595.880215 
+321107.781406  7380582.422520 
+321165.505021  7380576.803483 
+321242.269182  7380571.744350 
+321301.732751  7380569.174790 
+321333.777603  7380568.084976 
+321357.708165  7380566.955170 
+321484.147619  7380563.855701 
+321524.636612  7380555.717095 
+321549.416535  7380548.378352 
+321565.298775  7380541.949453 
+321579.688448  7380539.779825 
+321596.321095  7380535.280595 
+321622.890450  7380534.900661 
+321613.662918  7380485.939047 
+321613.836089  7380465.512546 
+321610.949908  7380432.868138 
+321606.282541  7380393.574868 
+321593.443160  7380349.462424 
+321573.858363  7380307.589597 
+321548.657882  7380268.376314 
+321540.708515  7380182.531018 
+321538.745912  7380162.824394 
+321593.286482  7380120.951566 
+321622.469892  7380086.707432 
+321647.357016  7380037.795810 
+321662.282694  7380001.392046 
+321678.230904  7379973.766778 
+321683.401290  7379946.841390 
+321678.626723  7379918.226291 
+321668.285950  7379867.355005 
+321656.716488  7379836.780242 
+321653.417996  7379810.524740 
+321631.235635  7379786.138917 
+321578.146402  7379727.798910 
+321551.189474  7379698.044006 
+321509.570748  7379661.720228 
+321488.872709  7379634.864828 
+321451.212174  7379591.942181 
+321418.227252  7379575.455005 
+321411.885900  7379570.375875 
+321382.702490  7379556.428264 
+321364.948355  7379545.010220 
+321323.082242  7379512.025870 
+321305.319862  7379480.311302 
+321278.676290  7379466.353693 
+321245.592413  7379419.461725 
+321213.333159  7379366.700763 
+321233.726087  7379338.945517 
+321262.324015  7379298.332473 
+321308.956449  7379220.105873 
+321340.547759  7379131.341078 
+321415.687412  7378996.984092 
+321423.298683  7378924.666479 
+321405.272423  7378864.896717 
+321370.019787  7378825.723427 
+321224.712957  7378714.632456 
+321110.378969  7378603.311524 
+320999.590860  7378490.820793 
+320987.130806  7378405.445417 
+320973.483294  7378326.508938 
+320940.382924  7378246.772596 
+320932.359342  7378199.020776 
+320938.700693  7378147.009685 
+320950.113476  7378116.554901 
+320978.026967  7378042.977504 
+320997.356132  7378016.532034 
+321055.417842  7377960.361656 
+321247.093227  7377890.583608 
+321425.846769  7377844.301536 
+321611.758039  7377807.797789 
+321604.047813  7377768.444529 
+321514.757627  7377376.651640 
+321575.021081  7377366.143440 
+321575.021081  7377366.123443 
+321597.722954  7376956.403625 
+321932.519918  7376293.277212 
+322310.749779  7375670.223936 
+322504.519707  7375393.701301 
+322777.700836  7375177.838277 
+323049.917156  7375031.743302 
+323341.363686  7374955.656335 
+323801.594064  7374893.696948 
+323830.991877  7375319.813958 
+323848.416162  7375581.529128 
+323918.509122  7375990.759031 
+324051.281682  7376201.592917 
+324248.828383  7376428.054126 
+324408.862982  7376720.733993 
+324487.457806  7376976.990098 
+324472.144556  7377282.387787 
+324406.422097  7377564.029544 
+324238.100037  7377972.139638 
+324026.510005  7378414.503865 
+323973.354802  7378626.637529 
+323963.170708  7378827.653097 
+324022.238458  7379087.548579 
+324080.943374  7379378.448750 
+324081.124791  7379691.785079 
+324026.839854  7379996.832827 
+324011.930669  7380259.707799 
+324000.625087  7380553.637451 
+323946.892648  7380812.163168 
+323874.573205  7380996.921521 
+323826.827530  7381081.517030 
+323818.704993  7381111.991810 
+323818.366897  7381140.116992 
+323825.788505  7381167.232348 
+323844.119876  7381186.838989 
+323868.734874  7381209.735067 
+323890.100858  7381222.952803 
+323963.822160  7381251.417928 
+323977.057360  7381261.886134 
+323983.934716  7381275.593786 
+323989.781294  7381281.202826 
+324002.249595  7381287.661719 
+324036.941487  7381303.918935 
+324056.394345  7381315.226998 
+324075.047319  7381333.063942 
+324101.624920  7381371.377380 
+324109.557794  7381390.304138 
+324118.537939  7381415.449830 
+324122.776502  7381436.096294 
+324135.541667  7381511.013461 
+324155.843887  7381595.289026 
+324175.758534  7381669.226361 
+324199.994205  7381780.527296 
+324223.982490  7381849.565470 
+324232.286445  7381896.847371 
+324248.927338  7381988.431684 
+324271.241638  7382109.540939 
+324291.131547  7382177.559288 
+324314.237485  7382260.205131 
+324327.876750  7382319.554965 
+324344.624845  7382411.139278 
+324364.555984  7382476.168139 
+324387.332073  7382550.215455 
+324410.421519  7382606.425827 
+324445.385537  7382651.038185 
+324498.243876  7382692.990999 
+324560.181314  7382717.326831 
+324599.796206  7382757.349975 
+324485.470464  7382897.405985 
+324348.484081  7383072.525988 
+324269.394483  7383182.247194 
+324125.341079  7383355.677487 
+324019.278061  7383516.219987 
+323953.341201  7383679.621998 
+323921.807615  7383874.558607 
+323928.148966  7384066.155788 
+323728.169627  7384084.122711 
+323699.472744  7384089.841731 
+323606.249106  7384104.849161 
+323589.789630  7384105.998964 
+323441.052368  7384131.334624 
+323322.793174  7384149.761468 
+323161.859737  7384177.386736 
+323078.960380  7384203.872199 
+322988.796094  7384222.379029 
+322931.303374  7384234.286989 
+322910.539365  7384221.019262 
+322840.990656  7384241.535747 
+322787.480866  7384251.524037 
+322738.811612  7384262.722118 
+322708.836564  7384281.078974 
+322610.731158  7384319.912322 
+322522.686153  7384344.338138 
+322460.493082  7384351.596895 
+322367.632278  7384363.044934 
+322328.660592  7384359.775494 
+322295.956042  7384351.596895 
+322274.491103  7384349.557244 
+322237.696422  7384352.616720 
+322189.530189  7384367.514169 
+322155.596950  7384379.062190 
+322111.306445  7384395.289411 
+322071.551367  7384407.907250 
+322030.023349  7384421.074994 
+321989.361186  7384430.293415 
+321947.701229  7384445.590795 
+321889.136499  7384481.294679 
+321851.096637  7384497.921831 
+321833.012653  7384506.790312 
+321817.715895  7384401.698313 
+321797.677555  7384296.126397 
+321789.068490  7384249.274422 
+321778.942119  7384218.029774 
+321761.146753  7384188.014915 
+321732.367408  7384163.739073 
+321715.751253  7384145.592182 
+321689.676672  7384124.675765 
+321649.204172  7384096.930517 
+321620.029008  7384088.272000 
+321600.765813  7384077.953768 
+321584.108427  7384063.126307 
+321575.590071  7384050.838412 
+321560.433499  7384038.360550 
+321547.305500  7384027.342437 
+321533.113737  7384019.523776 
+321516.431612  7384007.255877 
+321503.567492  7383999.227253 
+321484.032172  7383986.469438 
+321458.056546  7383966.332887 
+321441.407406  7383959.364081 
+321424.073829  7383950.405615 
+321409.098674  7383948.225989 
+321388.103771  7383945.976374 
+321371.908174  7383943.786749 
+321345.479005  7383943.796747 
+321320.212554  7383942.956891 
+321298.879555  7383941.117206 
+321281.455270  7383931.048931 
+321257.310307  7383911.702245 
+321244.388463  7383890.785828 
+321225.636535  7383856.811647 
+321215.262777  7383854.032123 
+321200.815381  7383858.611339 
+321192.907245  7383863.060577 
+321181.494462  7383864.760286 
+321116.423456  7383877.238148 
+321049.439325  7383888.656193 
+321018.862301  7383877.318135 
+320976.806525  7383870.599286 
+320949.008481  7383865.490161 
+320918.637614  7383854.372065 
+320896.191374  7383846.343440 
+320866.900763  7383841.424283 
+320865.935954  7383830.506153 
+320842.401212  7383822.647499 
+320820.952766  7383807.760049 
+320808.426741  7383797.301841 
+320797.846827  7383786.323721 
+320778.971206  7383770.026513 
+320760.293493  7383761.717936 
+320749.441454  7383756.378850 
+320730.813219  7383744.510883 
+320717.248169  7383736.372277 
+320700.632014  7383718.005423 
+320687.132935  7383703.987825 
+320676.635483  7383686.250863 
+320664.925836  7383667.943999 
+320657.281580  7383642.378378 
+320646.347078  7383619.092366 
+320638.224541  7383590.747222 
+Region 1
+697
+354118.226078  7396716.718862 
+354125.688917  7396694.322698 
+354139.691016  7396662.578135 
+354159.292306  7396625.244530 
+354180.757245  7396600.978687 
+354219.687700  7396565.964684 
+354256.366934  7396534.700040 
+354421.027667  7396421.199481 
+354519.479415  7396289.981958 
+354563.341116  7396234.481464 
+354612.463912  7396189.679139 
+354659.756044  7396137.478080 
+354708.689177  7396083.657299 
+354751.882933  7396032.606044 
+354559.861206  7395710.631195 
+354581.408607  7395691.084543 
+354551.953071  7395633.974326 
+354544.490232  7395619.976724 
+354526.529942  7395587.632264 
+354522.563505  7395555.887701 
+354523.363389  7395517.804225 
+354532.970248  7395469.552490 
+354513.838993  7395420.990808 
+354488.712728  7395367.290007 
+354466.373689  7395330.736268 
+354453.451846  7395304.170818 
+354442.418389  7395257.528808 
+354434.493762  7395215.226054 
+354430.510832  7395194.039683 
+354431.516873  7395169.923814 
+354430.510832  7395158.335798 
+354437.017108  7395132.460231 
+354442.352420  7395084.338474 
+354442.418389  7395072.630479 
+354458.275891  7395015.500265 
+354465.433619  7394985.345430 
+354474.158131  7394967.888420 
+354494.699492  7394904.699244 
+354509.856064  7394841.720032 
+354536.318218  7394744.396702 
+354581.276667  7394600.481354 
+354616.207700  7394514.786033 
+354636.147086  7394477.262460 
+354629.921182  7394474.212983 
+354623.753001  7394471.743406 
+354619.563916  7394470.013702 
+354611.177500  7394466.074377 
+354602.799329  7394462.375010 
+354595.155074  7394461.145221 
+354587.510818  7394460.405348 
+354581.095250  7394458.925601 
+354562.112427  7394426.001241 
+354549.429725  7394408.144299 
+354543.245052  7394396.946218 
+354534.842143  7394381.178918 
+354526.150615  7394367.921189 
+354511.546541  7394360.402477 
+354499.144210  7394358.212852 
+354488.077769  7394351.494003 
+354486.948035  7394341.885649 
+354487.582995  7394332.547249 
+354492.011221  7394324.778579 
+354499.770924  7394314.270379 
+354510.837365  7394302.802344 
+354521.169892  7394289.804570 
+354527.247364  7394272.467540 
+354530.809736  7394254.070691 
+354529.886158  7394247.751773 
+354526.356771  7394227.995157 
+354521.532726  7394210.758110 
+354516.700435  7394193.521062 
+354515.917043  7394177.343834 
+354519.429937  7394161.976466 
+354524.847711  7394155.487577 
+354529.787203  7394146.969036 
+354528.921349  7394136.350855 
+354526.587666  7394122.423241 
+354518.918671  7394108.675596 
+354513.467913  7394099.007252 
+354504.149672  7394076.401124 
+354493.619236  7394049.735692 
+354485.983226  7394033.718435 
+354478.652327  7394014.171783 
+354479.815045  7394003.333640 
+354481.794141  7393988.956103 
+354477.901920  7393977.288101 
+354474.248840  7393966.879884 
+354469.078453  7393955.701799 
+354459.331409  7393945.213595 
+354454.466132  7393930.746073 
+354449.073098  7393917.538336 
+354444.479947  7393901.061158 
+354442.476113  7393881.584494 
+354437.602591  7393867.626885 
+354432.151832  7393858.208499 
+354418.652753  7393844.390865 
+354404.576437  7393834.852499 
+354399.117432  7393826.443939 
+354389.609528  7393816.715606 
+354384.752499  7393801.748170 
+354381.668408  7393786.800730 
+354384.265971  7393764.614530 
+354385.898725  7393738.618983 
+354387.399539  7393722.471749 
+354391.390714  7393709.393989 
+354391.885488  7393691.966974 
+354389.815684  7393676.789574 
+354529.811942  7393517.606840 
+354668.934099  7393361.813526 
+354818.058934  7393317.371139 
+354851.695309  7393306.463008 
+354866.489047  7393300.853968 
+354888.572452  7393299.884134 
+354902.294180  7393298.304405 
+354929.457264  7393297.154602 
+354949.264710  7393295.914814 
+354976.254623  7393288.696051 
+355001.182978  7393283.736900 
+355022.268590  7393281.747241 
+355053.744452  7393280.407471 
+355090.522641  7393280.907385 
+355112.045303  7393283.976859 
+355141.641025  7393289.935838 
+355124.224986  7393265.450033 
+355109.835313  7393260.710844 
+355103.526947  7393258.091293 
+355091.462711  7393250.602576 
+355083.439129  7393243.933718 
+355077.707999  7393236.524987 
+355072.479888  7393229.636167 
+355067.639351  7393212.649077 
+355065.272683  7393201.001072 
+355064.695447  7393188.113280 
+355063.837839  7393176.735229 
+355063.087432  7393158.288388 
+355063.252356  7393146.670379 
+355061.405201  7393133.512632 
+355056.012166  7393102.367967 
+355047.089744  7393087.600497 
+355034.110177  7393072.773036 
+355016.108656  7393054.086237 
+354999.830596  7393038.968827 
+354988.590984  7393026.440973 
+354977.343125  7393014.922946 
+354967.381679  7393001.905176 
+354963.489458  7392989.977219 
+354955.169011  7392968.400914 
+354950.064594  7392952.413653 
+354943.005821  7392931.607217 
+354929.803606  7392878.386333 
+354928.022420  7392843.002394 
+354925.713475  7392809.378154 
+354921.491405  7392767.135389 
+354910.276531  7392734.660952 
+354901.675713  7392697.407333 
+354889.834126  7392655.824456 
+354878.866639  7392623.849933 
+354864.806816  7392596.134680 
+354848.908083  7392572.178784 
+354831.046747  7392543.643672 
+354812.954517  7392513.598818 
+354785.354383  7392474.065590 
+354762.627772  7392394.719181 
+354781.214776  7392295.576163 
+354843.127475  7392234.066699 
+354857.385208  7392217.039616 
+354876.161875  7392196.853074 
+354899.556432  7392174.716865 
+354936.483052  7392145.951793 
+354968.297010  7392118.366518 
+355011.391812  7392085.682116 
+355034.233871  7392067.855170 
+355052.721920  7392056.187168 
+355068.018677  7392047.368679 
+355087.191164  7392038.480201 
+355107.600585  7392028.941835 
+355126.410237  7392025.912354 
+355148.097823  7392021.473115 
+355163.345104  7392017.083866 
+355193.072765  7391994.347761 
+355206.629568  7391986.179160 
+355223.072552  7391974.271200 
+355240.406129  7391965.912632 
+355261.302078  7391958.703866 
+355283.913242  7391953.384778 
+355303.588748  7391945.826072 
+355323.734290  7391941.596797 
+355337.439525  7391939.297191 
+355363.266720  7391939.107223 
+355353.264042  7391928.599023 
+355347.483434  7391924.559715 
+355339.393882  7391906.762763 
+355347.293771  7391891.885312 
+355349.916072  7391884.936502 
+355355.828620  7391875.688086 
+355364.759287  7391870.688943 
+355379.132467  7391861.860455 
+355394.825044  7391843.833543 
+355405.429697  7391834.875077 
+355413.849098  7391829.975916 
+355419.473028  7391829.036077 
+355430.605439  7391827.926267 
+355438.480589  7391826.346538 
+355445.869212  7391822.317228 
+355462.567829  7391796.131714 
+355469.272015  7391788.662993 
+355474.607326  7391786.173419 
+355485.055300  7391782.064123 
+355491.924410  7391779.584548 
+355496.872149  7391774.655392 
+355502.059028  7391765.846901 
+355506.949042  7391756.808449 
+355511.773087  7391743.790679 
+355515.937434  7391735.192152 
+355521.190283  7391719.854779 
+355524.183664  7391706.597050 
+355529.197373  7391695.019033 
+355535.753126  7391682.011261 
+355543.026301  7391669.233450 
+355551.660105  7391652.936242 
+355556.451165  7391633.269610 
+355556.409934  7391606.464202 
+355555.709004  7391583.978054 
+355550.777758  7391556.692727 
+355549.136758  7391525.778023 
+355545.599125  7391511.900400 
+355542.251156  7391500.242397 
+355534.202835  7391477.346319 
+355530.063227  7391462.688829 
+355528.100624  7391444.951868 
+355528.587152  7391426.565017 
+355530.879604  7391411.417612 
+355533.543136  7391399.599636 
+355539.158819  7391379.503078 
+355550.200522  7391356.577005 
+355557.242803  7391329.411659 
+355581.173364  7391343.589230 
+355603.792775  7391364.085719 
+355644.100350  7390990.169768 
+355650.878752  7390846.134440 
+355633.932748  7390737.683016 
+355635.631472  7390690.231144 
+355622.066422  7390639.399851 
+355606.819142  7390600.426527 
+355584.793460  7390575.010881 
+355559.370331  7390561.453203 
+355527.177046  7390542.806397 
+355493.293284  7390512.311620 
+355471.259356  7390476.727716 
+355456.003829  7390427.586133 
+355449.233674  7390371.665712 
+355439.057825  7390324.213840 
+355400.086139  7390256.435450 
+355366.185885  7390205.594158 
+355337.348817  7390159.572041 
+355320.130687  7390172.009911 
+355308.891075  7390173.339683 
+355297.437060  7390175.769267 
+355290.262840  7390178.688767 
+355281.150755  7390181.148346 
+355269.639017  7390189.566904 
+355266.010675  7390195.395905 
+355257.599520  7390199.525198 
+355234.163733  7390206.044081 
+355215.741653  7390210.843259 
+355202.044664  7390213.252846 
+355187.811670  7390217.652093 
+355170.387385  7390225.230795 
+355153.119778  7390227.280444 
+355131.935211  7390233.049455 
+355121.322312  7390232.939474 
+355114.494433  7390232.429562 
+355099.502786  7390230.959813 
+355086.036691  7390230.269932 
+355074.640401  7390226.610558 
+355068.851547  7390224.011004 
+355060.019834  7390219.381797 
+355050.660362  7390216.402307 
+355040.632946  7390208.773614 
+355032.650594  7390200.285068 
+355021.988218  7390194.855998 
+355008.711787  7390185.087671 
+354994.338607  7390173.099724 
+354979.759271  7390161.991627 
+354966.177729  7390152.223300 
+354947.293861  7390141.955059 
+354935.707907  7390136.745951 
+354922.472707  7390134.066410 
+354915.727290  7390124.368072 
+354910.482687  7390117.999162 
+354905.048421  7390110.420461 
+354899.993482  7390105.271343 
+354889.941327  7390100.082232 
+354883.501021  7390101.571976 
+354881.035398  7390102.981735 
+354876.120644  7390104.931401 
+354872.855137  7390104.891408 
+354866.225167  7390103.831589 
+354863.487419  7390102.811764 
+354856.906927  7390097.092744 
+354855.232942  7390091.323732 
+354850.483113  7390086.514556 
+354842.830611  7390085.654703 
+354835.977993  7390087.254429 
+354825.546512  7390089.913973 
+354813.911080  7390089.803992 
+354805.219553  7390091.263742 
+354791.745212  7390091.573689 
+354772.284108  7390088.284252 
+354762.899897  7390087.414401 
+354752.707556  7390086.314590 
+354740.577351  7390084.644876 
+354731.951794  7390079.465763 
+354726.517528  7390072.316987 
+354721.437850  7390069.497470 
+354716.011830  7390061.588825 
+354711.938192  7390060.549003 
+354701.020183  7390060.439022 
+354695.874535  7390064.598310 
+354688.700314  7390067.067887 
+354680.792179  7390071.977046 
+354669.593798  7390079.945681 
+354655.591698  7390082.025324 
+354645.184955  7390081.145475 
+354634.266945  7390081.035494 
+354619.275298  7390080.335614 
+354609.734409  7390075.146503 
+354601.380978  7390072.846897 
+354595.823018  7390067.697779 
+354593.101762  7390064.128390 
+354589.893978  7390058.229401 
+354587.378878  7390054.660012 
+354584.542175  7390052.410397 
+354575.999080  7390049.230942 
+354568.363070  7390047.381259 
+354564.099769  7390045.121646 
+354562.623694  7390040.012521 
+354561.963995  7390034.473470 
+354556.356558  7390033.643612 
+354551.037740  7390035.363317 
+354546.370373  7390042.292130 
+354546.007539  7390048.371089 
+354538.058173  7390056.939621 
+354528.632731  7390061.048918 
+354519.908219  7390065.498155 
+354512.024822  7390068.637618 
+354506.862682  7390073.896717 
+354500.999612  7390079.155816 
+354490.741301  7390083.815018 
+354487.467547  7390085.004814 
+354478.784267  7390085.244773 
+354475.527006  7390084.664872 
+354469.457780  7390079.725718 
+354466.744770  7390075.156501 
+354465.293433  7390067.397830 
+354462.390760  7390061.718803 
+354460.403419  7390056.159755 
+354458.251152  7390046.501409 
+354452.998303  7390040.912367 
+354449.658580  7390037.892884 
+354441.313395  7390036.263163 
+354436.002822  7390036.203173 
+354429.174943  7390035.583280 
+354426.948461  7390033.013720 
+354423.122210  7390027.994579 
+354419.700024  7390023.305383 
+354408.979924  7390023.975268 
+354399.406050  7390022.105588 
+354394.120217  7390019.286071 
+354391.069111  7390018.926133 
+354389.386880  7390013.367085 
+354384.002092  7390010.767530 
+354381.808594  7390005.208483 
+354378.773981  7390002.858885 
+354365.637736  7390000.179344 
+354362.867002  7390001.699084 
+354361.522867  7390002.908876 
+354359.444817  7390007.198142 
+354356.888485  7390007.178145 
+354349.557586  7390005.888366 
+354347.025993  7390003.758731 
+354344.486154  7390002.179001 
+354340.552702  7389997.379823 
+354337.831446  7389994.580303 
+354332.240502  7389991.760786 
+354323.103678  7389987.131579 
+354315.772779  7389985.501858 
+354289.244655  7389974.493744 
+354269.330008  7389965.105352 
+354255.360893  7389963.975545 
+354238.085040  7389966.785064 
+354230.176905  7389951.757638 
+354226.012559  7389939.319769 
+354218.252856  7389929.381471 
+354212.496987  7389922.792600 
+354205.726831  7389916.413692 
+354198.610334  7389914.014103 
+354186.240988  7389905.475566 
+354180.748999  7389903.645879 
+354163.547361  7389899.156648 
+354152.629352  7389898.276799 
+354141.397986  7389898.936686 
+354119.545475  7389900.156477 
+354112.981475  7389903.635881 
+354099.012360  7389902.386095 
+354085.546266  7389901.806194 
+354064.361699  7389907.575206 
+354053.905479  7389912.454370 
+354043.234856  7389917.883441 
+354032.102445  7389928.411637 
+354028.762722  7389935.680392 
+354024.598375  7389943.948976 
+354022.124506  7389956.766780 
+354020.293843  7389966.385133 
+354019.023923  7389981.212593 
+354018.933215  7389990.620981 
+354018.883737  7389995.160204 
+354017.514863  7389999.139522 
+354012.707310  7390000.859228 
+354006.365959  7390001.799067 
+354000.032854  7390002.728907 
+353993.386392  7390003.878710 
+353988.784995  7390004.608585 
+353982.814724  7389999.789411 
+353979.994513  7389995.660118 
+353974.733418  7389991.070904 
+353966.190323  7389988.441355 
+353962.825861  7389987.631493 
+353953.260234  7389985.201909 
+353951.041998  7389981.972463 
+353945.492284  7389976.273439 
+353944.560460  7389967.174997 
+353941.872189  7389960.616121 
+353940.717717  7389952.967431 
+353938.590189  7389941.429407 
+353934.343381  7389937.290116 
+353926.509462  7389935.210473 
+353919.887738  7389933.600748 
+353904.368332  7389934.110661 
+353895.487142  7389935.020505 
+353879.266806  7389934.080666 
+353862.980501  7389939.669709 
+353852.210923  7389944.878816 
+353849.794778  7389952.387530 
+353844.871778  7389964.745413 
+353839.899301  7389971.784208 
+353837.606849  7389976.293435 
+353827.134136  7389983.172257 
+353804.382786  7389992.020741 
+353792.401012  7389996.439984 
+353771.653496  7390009.747705 
+353762.203316  7390015.746677 
+353729.878092  7390022.945444 
+353713.814434  7390026.774788 
+353703.415938  7390025.564996 
+353691.912446  7390011.767359 
+353645.263519  7390001.399135 
+353598.218773  7389995.020228 
+353549.120716  7390004.458611 
+353540.338480  7390014.076963 
+353529.626627  7390023.485352 
+353514.585502  7390047.701204 
+353508.516276  7390053.070284 
+353503.667493  7390057.559515 
+353496.254131  7390064.238371 
+353487.339956  7390068.137703 
+353477.691866  7390072.916885 
+353473.181178  7390075.526438 
+353471.012419  7390077.606081 
+353467.177922  7390083.885006 
+353462.131229  7390088.044293 
+353454.148878  7390090.503872 
+353445.465597  7390090.753829 
+353435.998924  7390088.994131 
+353424.297523  7390084.784852 
+353416.282186  7390080.155645 
+353409.239905  7390070.237344 
+353400.490655  7390057.189579 
+353392.170208  7390042.492096 
+353386.232922  7390033.563626 
+353382.513872  7390029.434333 
+353374.828385  7390020.825807 
+353363.910376  7390010.307609 
+353355.515713  7390002.918875 
+353347.071573  7390000.169346 
+353332.805594  7389999.089531 
+353313.113595  7389997.729764 
+353302.179093  7389998.729592 
+353284.276526  7390002.758902 
+353272.698818  7390007.728051 
+353258.358623  7390012.907164 
+353248.504378  7390018.226253 
+353237.800770  7390027.204715 
+353230.016329  7390040.412452 
+353225.423178  7390050.670695 
+353220.467194  7390055.709832 
+353202.721305  7390064.618306 
+353191.935235  7390072.256998 
+353188.842899  7390074.776566 
+353186.138135  7390079.625736 
+353180.365774  7390096.172901 
+353176.564262  7390108.430801 
+353173.381217  7390113.969853 
+353171.064026  7390117.449257 
+353165.102001  7390121.598546 
+353156.699092  7390124.837991 
+353145.327540  7390129.157251 
+353140.404540  7390131.876785 
+353137.823470  7390135.056241 
+353137.460636  7390140.035388 
+353139.151113  7390144.934549 
+353142.383636  7390147.954032 
+353149.401178  7390150.353620 
+353156.443459  7390150.643571 
+353170.025001  7390149.443776 
+353174.923262  7390149.943691 
+353178.164030  7390152.303287 
+353180.266819  7390156.082639 
+353180.233834  7390159.742012 
+353178.040337  7390164.921125 
+353174.494458  7390172.529822 
+353170.462051  7390177.688938 
+353167.592363  7390178.768753 
+353161.984926  7390177.828914 
+353157.301067  7390176.789092 
+353154.060298  7390174.649459 
+353149.368193  7390174.379505 
+353146.284103  7390176.009226 
+353143.909188  7390178.978717 
+353143.463892  7390183.177998 
+353143.117550  7390186.497429 
+353145.566681  7390197.265585 
+353146.490258  7390206.573990 
+353145.220339  7390211.213196 
+353141.913600  7390215.392480 
+353137.411158  7390216.232336 
+353132.521144  7390215.742420 
+353122.939024  7390213.982721 
+353107.452602  7390211.723108 
+353095.107995  7390211.373168 
+353089.401604  7390210.433329 
+353081.468730  7390207.583817 
+353069.569419  7390203.474521 
+353061.653037  7390199.185256 
+353053.728410  7390195.565876 
+353042.027009  7390191.796522 
+353032.238733  7390190.476748 
+353026.301447  7390192.526397 
+353022.805045  7390195.475891 
+353019.687970  7390200.205081 
+353017.477980  7390206.943927 
+353015.985412  7390213.902735 
+353015.457653  7390225.300783 
+353016.084367  7390233.949301 
+353015.977166  7390244.907424 
+353014.459859  7390253.755909 
+353009.693538  7390260.684722 
+353004.234533  7390265.723859 
+352998.387956  7390268.543376 
+352986.637077  7390269.753168 
+352982.654148  7390269.933138 
+352975.834515  7390268.533377 
+352962.690023  7390266.303759 
+352952.909994  7390264.324098 
+352938.644015  7390262.294446 
+352920.576524  7390261.894515 
+352902.525525  7390261.264622 
+352892.943405  7390259.954847 
+352873.292637  7390254.875717 
+352854.804588  7390246.717114 
+352836.390755  7390240.108246 
+352830.090635  7390237.948616 
+352824.903756  7390236.228911 
+352819.090163  7390235.179091 
+352807.792827  7390232.069623 
+352802.927551  7390229.030144 
+352801.121626  7390226.130641 
+352800.272265  7390219.371798 
+352800.775285  7390209.853429 
+352803.752174  7390197.475549 
+352804.972616  7390188.407102 
+352805.797239  7390177.009055 
+352808.996777  7390143.044872 
+352809.260656  7390137.405838 
+352810.225465  7390132.536672 
+352810.274942  7390128.107431 
+352810.126510  7390122.018474 
+352809.994571  7390115.479594 
+352809.343118  7390108.500789 
+352805.170526  7390097.492675 
+352801.459722  7390091.473706 
+352798.021044  7390087.564376 
+352792.240436  7390084.184955 
+352782.880964  7390081.095484 
+352774.725442  7390080.685554 
+352767.155402  7390082.155302 
+352759.065850  7390084.954823 
+352730.302998  7390092.863468 
+352697.120166  7390104.491476 
+352686.061970  7390107.810908 
+352645.828611  7390119.808853 
+352640.699455  7390122.748349 
+352649.333259  7390150.433607 
+352672.983448  7390192.076474 
+352690.968477  7390237.858632 
+352715.063963  7390294.368952 
+352739.703701  7390341.310911 
+352796.553215  7390445.123129 
+352829.348474  7390538.947058 
+352803.669712  7390674.973758 
+352766.042161  7390831.606928 
+352768.070734  7390878.388915 
+352790.451004  7390917.042294 
+352816.896666  7390944.497591 
+352849.436292  7390975.012364 
+352886.808209  7391057.138296 
+352880.046300  7391191.995197 
+352887.583355  7391221.150203 
+352831.888313  7391411.077670 
+352804.692244  7391547.624281 
+352775.203724  7391649.326860 
+352760.945991  7391709.336581 
+352739.596500  7391762.227521 
+352531.948166  7392153.540493 
+352478.718747  7392281.288611 
+352447.473779  7392356.295763 
+352318.626425  7392632.968371 
+352303.849180  7392698.447155 
+352312.301566  7392749.128474 
+352350.316689  7392831.504364 
+352377.768391  7392941.325552 
+352409.450409  7393192.652502 
+352420.013831  7393427.092345 
+352439.021392  7393564.368831 
+352449.576568  7393627.727978 
+352455.917919  7393701.655315 
+352413.301399  7393899.621405 
+352417.902796  7393927.646604 
+352420.450881  7394021.210578 
+352421.242519  7394091.828482 
+352416.072133  7394130.981775 
+352474.719325  7394112.015024 
+352491.871485  7394100.646971 
+352515.678353  7394088.659024 
+352523.635965  7394119.763696 
+352532.426447  7394185.662409 
+352543.410426  7394286.695103 
+352545.603924  7394383.338548 
+352541.637487  7394470.333647 
+352539.196602  7394523.054616 
+352541.208683  7394567.836946 
+352532.426447  7394613.959045 
+352530.216457  7394644.703779 
+352528.031206  7394682.047382 
+352526.489161  7394816.824296 
+352533.242824  7394989.314750 
+352532.418201  7395009.071366 
+352530.892648  7395026.148441 
+352524.642005  7395050.354295 
+352501.956625  7395160.085499 
+352497.792278  7395178.542337 
+352487.913294  7395221.814925 
+352484.177752  7395241.891486 
+352475.997491  7395280.534867 
+352562.516943  7395343.414096 
+352659.946158  7395408.482951 
+352755.462247  7395473.881748 
+352845.676011  7395537.630829 
+352883.443747  7395552.628260 
+352951.788507  7395602.569705 
+353006.997021  7395627.545427 
+353118.609753  7395648.621817 
+353119.788964  7395682.825958 
+353119.640531  7395715.340389 
+353103.601613  7395774.780207 
+353081.476976  7395874.893059 
+353071.960826  7395914.566263 
+353069.577665  7395943.921235 
+353071.160941  7395971.696477 
+353104.203588  7396048.293357 
+353111.419039  7396064.790531 
+353163.980514  7396149.426034 
+353185.692839  7396185.509853 
+353215.618410  7396238.110843 
+353233.149896  7396281.443420 
+353231.088339  7396386.675395 
+353237.842001  7396353.970997 
+353338.421277  7396381.096351 
+353367.101667  7396390.294775 
+353416.026553  7396409.871422 
+353470.666078  7396430.257930 
+353522.056587  7396449.014717 
+353547.438485  7396456.913364 
+353567.410856  7396472.320725 
+353745.521191  7396570.533902 
+354058.902695  7396693.012922 
+354118.226078  7396716.718862 
+Region 1
+494
+353976.399157  7397735.564343 
+353977.454674  7397728.715516 
+353994.507879  7397725.326096 
+354007.066889  7397762.509727 
+354010.456089  7397823.299314 
+354010.983848  7397898.856372 
+354015.197672  7398017.726011 
+354023.913938  7398117.698886 
+354050.846127  7398162.911142 
+354069.070297  7398198.265086 
+354098.542325  7398240.707816 
+354132.673474  7398258.164826 
+354153.998226  7398259.334625 
+354219.110464  7398259.074670 
+354277.889596  7398258.964689 
+354359.230415  7398260.214475 
+354425.901189  7398257.304973 
+354465.169740  7398233.569039 
+354496.917728  7398216.112029 
+354554.847498  7398182.777739 
+354620.710142  7398146.273992 
+354698.472097  7398109.760246 
+354783.746368  7398077.855711 
+354813.193658  7398066.067730 
+354832.176481  7398056.959291 
+354862.737012  7398040.722072 
+354935.740892  7398084.374595 
+354998.420491  7398116.919020 
+355125.478413  7398187.816876 
+355231.425984  7397925.551799 
+355228.383125  7397828.158482 
+355227.731673  7397804.282572 
+355227.756411  7397804.252577 
+355301.032417  7397795.654050 
+355366.903307  7397781.376495 
+355417.526917  7397773.327874 
+355449.266659  7397767.728833 
+355527.803760  7397759.070316 
+355527.770775  7397759.050320 
+355587.506470  7397746.452478 
+355652.313596  7397737.593995 
+355714.333497  7397724.756194 
+355746.922600  7397714.497951 
+355776.930634  7397700.740308 
+355790.396728  7397690.772015 
+355834.843912  7397658.237588 
+355893.557074  7397613.795201 
+355951.750723  7397570.282654 
+356036.662160  7397487.656807 
+356046.104095  7397479.008288 
+356070.488199  7397455.892248 
+356089.116434  7397438.235272 
+356165.031233  7397405.880814 
+356089.116434  7397438.235272 
+356165.031233  7397405.880814 
+356232.073088  7397377.295711 
+356300.813667  7397335.902801 
+356357.052960  7397300.748823 
+356399.240676  7397271.063907 
+356419.551142  7397249.977519 
+356446.854411  7397225.311744 
+356496.628660  7397264.055108 
+356504.512056  7397263.635180 
+356511.158518  7397259.415902 
+356514.795106  7397251.387278 
+356519.990231  7397240.599126 
+356525.375020  7397235.100068 
+356533.538788  7397232.410528 
+356549.058194  7397230.560845 
+356565.055882  7397231.490686 
+356584.088182  7397233.960263 
+356603.565779  7397242.488802 
+356619.777868  7397248.207822 
+356631.891581  7397255.906504 
+356647.848037  7397261.875481 
+356658.724816  7397266.534683 
+356692.748763  7397269.414190 
+356710.742038  7397273.893423 
+356727.696289  7397280.882225 
+356741.607680  7397287.591076 
+356751.701066  7397294.759848 
+356779.037321  7397305.138071 
+356789.683204  7397308.027576 
+356801.838148  7397312.696776 
+356814.776484  7397314.846408 
+356827.970453  7397316.246168 
+356835.573478  7397318.855721 
+356845.691603  7397323.244969 
+356854.317160  7397324.604736 
+356868.022396  7397326.004496 
+356881.191626  7397330.943650 
+356888.209168  7397340.601996 
+356892.926012  7397351.750086 
+356897.956213  7397356.589258 
+356903.745067  7397362.708209 
+356913.846699  7397368.367240 
+356921.622895  7397378.535498 
+356929.159950  7397387.443972 
+356934.932311  7397394.312796 
+356940.440793  7397402.951316 
+356954.566586  7397412.939605 
+356966.457651  7397418.108720 
+356977.845695  7397423.017879 
+356991.006679  7397428.206990 
+356999.055001  7397436.365593 
+357006.913658  7397438.215276 
+357021.905306  7397438.375248 
+357034.662224  7397433.206134 
+357046.173962  7397426.017365 
+357059.648303  7397424.897557 
+357067.473976  7397430.526593 
+357072.710333  7397440.174940 
+357083.273754  7397451.383020 
+357089.334734  7397454.722448 
+357103.501758  7397460.931385 
+357116.407109  7397467.120325 
+357126.995269  7397475.558879 
+357139.851143  7397485.277214 
+357157.275428  7397496.815238 
+357172.712372  7397502.774217 
+357188.413195  7397507.983325 
+357202.596712  7397513.182435 
+357218.800555  7397519.151412 
+357235.507418  7397525.640301 
+357250.193955  7397530.839410 
+357258.242276  7397538.488100 
+357269.374687  7397543.907172 
+357276.944727  7397548.776338 
+357287.598857  7397550.905973 
+357300.768087  7397555.585171 
+357305.179821  7397559.634478 
+357358.483456  7397489.766446 
+357393.389750  7397609.405952 
+357360.041993  7397645.209819 
+357353.609933  7397659.317403 
+357355.696230  7397668.885764 
+357362.779742  7397676.664432 
+357413.832156  7397706.869258 
+357491.552880  7397728.695519 
+357482.679936  7397756.920684 
+357443.634033  7397905.345261 
+357440.500466  7397927.211515 
+357442.059003  7397952.217232 
+357448.309646  7397975.643219 
+357478.779468  7398013.126799 
+357512.382858  7398018.565867 
+357560.714016  7398044.711388 
+357587.646205  7398055.799489 
+357620.136354  7398057.389217 
+357708.090650  7398055.009624 
+357768.296380  7398052.630032 
+357819.010699  7398051.840167 
+357872.099932  7398051.050303 
+357957.662821  7398052.630032 
+357992.527884  7398054.219760 
+358012.970290  7398058.219075 
+358099.168139  7398089.283754 
+358115.338997  7398097.792296 
+358128.013453  7398111.269988 
+358134.346559  7398124.737681 
+358141.487794  7398144.544288 
+358147.029261  7398159.601709 
+358154.953889  7398171.479674 
+358168.683863  7398176.118880 
+358179.519410  7398174.649131 
+358194.733706  7398165.740657 
+358267.473706  7398092.253245 
+358281.723193  7398090.663517 
+358446.524112  7398120.768361 
+358464.302985  7398066.847597 
+358459.561403  7398058.219075 
+358458.464654  7398041.052015 
+358462.249674  7398018.395896 
+358466.001709  7397998.509302 
+358472.821342  7397977.392920 
+358478.816351  7397962.315502 
+358490.245627  7397937.469758 
+358499.365958  7397915.113587 
+358515.652264  7397887.038396 
+358528.137057  7397878.489861 
+358537.908840  7397872.140948 
+358555.662975  7397875.860311 
+358566.053225  7397877.989946 
+358576.443476  7397880.869453 
+358591.913405  7397884.058907 
+358603.837454  7397886.458496 
+358628.452453  7397889.238020 
+358645.241778  7397887.398335 
+358664.603928  7397882.559164 
+358684.032047  7397871.161116 
+358692.022645  7397859.643089 
+358694.166665  7397849.074899 
+358692.030891  7397833.417581 
+358686.827519  7397820.239838 
+358678.300917  7397809.051755 
+358662.723787  7397791.484764 
+358649.900899  7397777.977078 
+358635.535965  7397765.969134 
+358607.292625  7397744.232858 
+358592.680304  7397731.465045 
+358570.745331  7397714.078023 
+358543.244151  7397668.885764 
+358523.882002  7397648.759211 
+358511.133329  7397627.432864 
+358491.276406  7397605.536615 
+358483.277562  7397592.838790 
+358475.789985  7397579.391094 
+358465.960478  7397571.212495 
+358452.618077  7397558.204723 
+358441.238278  7397553.045606 
+358428.868932  7397544.587055 
+358419.748601  7397541.967504 
+358408.640929  7397534.538776 
+358398.011537  7397530.129532 
+358387.571809  7397532.549117 
+358366.040901  7397524.880431 
+358352.401636  7397517.541688 
+358335.917421  7397513.842322 
+358316.192437  7397504.293957 
+358303.047945  7397497.595105 
+358294.958393  7397492.975896 
+358283.372439  7397483.267559 
+358272.553384  7397472.049480 
+358247.649768  7397446.813803 
+358234.521769  7397438.355252 
+358218.375649  7397426.327312 
+358198.172384  7397413.749467 
+358183.287938  7397403.251265 
+358169.162144  7397392.763061 
+358152.273864  7397379.465339 
+358134.255850  7397351.530124 
+358120.740278  7397330.453734 
+358107.686495  7397314.416481 
+358102.474877  7397302.758478 
+358099.060938  7397287.841034 
+358096.669531  7397272.933587 
+358084.926898  7397252.637064 
+358074.660341  7397237.639633 
+358061.400402  7397217.323113 
+358049.847433  7397203.835423 
+358040.537439  7397194.147082 
+358027.714550  7397180.899352 
+358007.849380  7397159.243061 
+357994.317316  7397140.946195 
+357978.492799  7397121.859465 
+357964.152604  7397107.831867 
+357947.478726  7397097.813583 
+357929.007169  7397090.554827 
+357910.024346  7397082.786158 
+357886.258710  7397070.938187 
+357859.722339  7397081.246421 
+357843.386556  7397088.645154 
+357826.028241  7397096.533803 
+357808.933805  7397103.912539 
+357793.637047  7397108.291789 
+357785.473279  7397111.741198 
+357763.027039  7397120.579684 
+357742.287769  7397136.256998 
+357725.415981  7397145.655389 
+357713.434208  7397150.074632 
+357696.867530  7397154.693840 
+357688.712008  7397157.123424 
+357673.695622  7397159.493018 
+357656.675402  7397158.803137 
+357641.428122  7397159.403034 
+357634.814645  7397159.333046 
+357624.655289  7397158.973107 
+357610.141923  7397162.342530 
+357600.667004  7397169.561294 
+357593.418567  7397131.647788 
+357590.004627  7397117.740170 
+357585.089874  7397101.043030 
+357579.235050  7397076.257276 
+357574.798578  7397063.099530 
+357570.362106  7397049.171915 
+357561.901473  7397031.424955 
+357564.614483  7397014.307887 
+357569.075694  7396999.970343 
+357574.320297  7396983.633142 
+357582.071754  7396970.605373 
+357585.963974  7396962.566750 
+357596.502657  7396950.318848 
+357608.806033  7396940.110597 
+357621.810339  7396935.201437 
+357631.268766  7396930.262284 
+357644.306056  7396922.573601 
+357655.050895  7396915.124876 
+357663.016754  7396905.876461 
+357669.448813  7396898.127788 
+357676.466356  7396882.560454 
+357684.481692  7396868.772816 
+357689.718048  7396853.445442 
+357692.125948  7396841.357512 
+357700.231992  7396818.241472 
+357703.736640  7396798.344880 
+357714.118645  7396776.518618 
+357722.538046  7396747.593573 
+357728.533056  7396732.776111 
+357736.053618  7396717.468733 
+357743.417502  7396636.862540 
+357746.031557  7396609.367250 
+357744.918316  7396593.719930 
+357745.091487  7396576.312912 
+357745.998573  7396561.695416 
+357748.200316  7396544.568349 
+357749.396020  7396526.671415 
+357753.692306  7396504.015296 
+357755.085919  7396491.417454 
+357758.301949  7396475.310213 
+357760.594401  7396448.844746 
+357761.303577  7396428.928158 
+357761.196376  7396414.550620 
+357759.662577  7396390.064814 
+357757.229939  7396378.686763 
+357754.376743  7396359.490052 
+357753.304733  7396339.803424 
+357754.426220  7396329.215237 
+357758.417396  7396311.098341 
+357763.934124  7396292.741485 
+357769.426114  7396277.164153 
+357777.499174  7396257.827465 
+357782.768515  7396239.470610 
+357785.036228  7396215.784667 
+357786.454580  7396200.917214 
+357791.468288  7396182.560358 
+357798.972358  7396169.262636 
+357810.813945  7396153.505335 
+357818.260292  7396145.756662 
+357826.481784  7396136.768202 
+357831.709894  7396122.440656 
+357833.870406  7396109.852812 
+357838.084230  7396095.015354 
+357841.077612  7396075.378717 
+357846.305722  7396060.301300 
+357851.269953  7396046.723626 
+357857.034068  7396029.886510 
+357857.570073  7396029.116642 
+357865.783319  7396018.378481 
+357875.348946  7396002.341228 
+357882.828278  7395991.063160 
+357893.812257  7395985.384133 
+357908.127713  7395977.205533 
+357917.107858  7395968.477029 
+357926.368375  7395957.478912 
+357933.064315  7395947.960543 
+357956.013575  7395914.906205 
+357971.120669  7395903.468164 
+357985.683513  7395895.799478 
+358005.293049  7395891.210264 
+358019.064254  7395886.321101 
+358039.209796  7395878.962362 
+358047.431288  7395870.723773 
+358057.450458  7395859.485698 
+358069.753834  7395848.767534 
+358081.323296  7395835.009890 
+358097.700310  7395824.341718 
+358113.813444  7395813.413590 
+358123.511012  7395809.484263 
+358141.553764  7395797.156374 
+358157.914286  7395780.849168 
+358171.124747  7395766.351651 
+358184.417671  7395753.413867 
+358203.639635  7395740.316111 
+358213.262986  7395727.008390 
+358221.253583  7395713.240748 
+358227.660905  7395695.363810 
+358241.630019  7395675.677183 
+358255.285777  7395647.012093 
+358270.030038  7395611.168232 
+358279.224585  7395586.602440 
+358284.279524  7395573.214733 
+358297.143644  7395541.330195 
+358302.627387  7395512.815079 
+358305.356890  7395484.159988 
+358305.216704  7395456.584711 
+358307.880236  7395434.678463 
+358314.122633  7395421.900652 
+358329.468868  7395408.642923 
+358342.159817  7395394.705311 
+358354.586887  7395376.778381 
+358356.252625  7395352.542533 
+358351.115224  7395334.775576 
+358350.711158  7395312.509390 
+358352.170741  7395298.901721 
+358347.940425  7395261.758083 
+358337.616144  7395252.689637 
+358318.847723  7395240.331753 
+358288.402640  7395220.985067 
+358254.535370  7395197.179145 
+358220.173327  7395171.493545 
+358198.403278  7395152.786749 
+358167.949949  7395134.659854 
+358141.883613  7395116.802913 
+358099.860822  7395092.257117 
+358068.203543  7395072.120566 
+358017.901536  7395047.604766 
+357967.937624  7395031.057600 
+357924.455250  7395019.009664 
+357878.218635  7395007.711599 
+357835.544391  7394996.553510 
+357776.262239  7394993.654007 
+357738.131668  7394998.153236 
+357701.732806  7395004.222197 
+357679.096903  7395011.530945 
+357652.370870  7395019.689547 
+357630.452389  7395027.448218 
+357605.012767  7395028.648013 
+357600.048536  7395025.268592 
+357592.742376  7395020.109475 
+357590.911713  7395009.461299 
+357589.996381  7394998.373199 
+357591.653874  7394975.137179 
+357593.344351  7394947.911842 
+357593.723677  7394919.346735 
+357596.634597  7394893.351188 
+357601.557597  7394855.647646 
+357611.939601  7394820.853606 
+357621.315565  7394801.786872 
+357628.885605  7394789.229023 
+357636.859710  7394777.790982 
+357655.743578  7394756.824574 
+357667.972738  7394748.416014 
+357679.806079  7394739.227588 
+357703.101681  7394726.719730 
+357698.318867  7394704.413551 
+357634.476549  7394756.894562 
+357579.259789  7394818.504009 
+357560.219242  7394835.961018 
+357392.243524  7395038.926252 
+357333.266482  7395104.974939 
+357303.118263  7395131.150455 
+357277.719873  7395148.607465 
+357179.317602  7395214.476182 
+357053.150274  7395295.412319 
+357022.581497  7395314.389068 
+356973.137098  7395338.714901 
+356839.482191  7395377.988174 
+356760.590503  7395401.434158 
+356526.595462  7395463.833469 
+356474.602978  7395476.831243 
+356425.199810  7395492.428571 
+356348.048076  7395511.965225 
+356201.611512  7395549.628774 
+356032.868894  7395597.570562 
+355772.626101  7395656.220515 
+355426.696726  7395723.299025 
+355197.237112  7395785.968291 
+355105.217424  7395804.365139 
+355031.611569  7395825.071593 
+354978.703753  7395859.575682 
+354925.795938  7395887.180954 
+354877.489518  7395937.782286 
+354860.007509  7395950.550099 
+354822.635592  7395978.975230 
+354751.882933  7396032.606044 
+354708.689177  7396083.657299 
+354659.756044  7396137.478080 
+354612.463912  7396189.679139 
+354563.341116  7396234.481464 
+354519.479415  7396289.981958 
+354421.027667  7396421.199481 
+354256.366934  7396534.700040 
+354219.687700  7396565.964684 
+354180.757245  7396600.978687 
+354159.292306  7396625.244530 
+354139.691016  7396662.578135 
+354125.688917  7396694.322698 
+354118.226078  7396716.718862 
+354108.891345  7396752.192785 
+354030.296520  7397007.519050 
+354012.839250  7397055.130895 
+353989.032382  7397102.742739 
+353967.608675  7397149.564719 
+353944.593445  7397196.386699 
+353922.369854  7397245.588271 
+353900.146262  7397303.518348 
+353879.522439  7397352.719920 
+353853.398381  7397407.650511 
+353825.509629  7397460.771412 
+353802.873725  7397500.124671 
+353814.476172  7397519.731313 
+353834.382573  7397548.216434 
+353838.118115  7397555.125250 
+353842.208246  7397564.733604 
+353845.877818  7397578.131309 
+353848.277471  7397599.737608 
+353854.231250  7397617.554557 
+353857.950300  7397625.993111 
+353868.670400  7397652.748528 
+353886.605951  7397715.537773 
+353894.547072  7397732.944791 
+353902.108865  7397740.003582 
+353919.236286  7397738.373861 
+353976.399157  7397735.564343 
+Region 1
+189
+324677.920995  7399197.423939 
+324782.458461  7399206.932311 
+325016.857567  7399181.586652 
+325682.056255  7399140.403706 
+325865.040113  7399134.584703 
+326431.391234  7399199.933509 
+326675.413691  7399212.761312 
+326901.277948  7399224.829245 
+327116.537553  7399213.321216 
+327105.050554  7399145.072906 
+327095.823022  7399102.290235 
+327092.532776  7399019.634393 
+327088.129289  7398984.530406 
+327088.467384  7398979.811214 
+327157.414118  7398854.862617 
+327190.613443  7398800.841870 
+327199.230754  7398784.624648 
+327204.425879  7398767.957503 
+327206.668854  7398746.291214 
+327205.967925  7398717.346172 
+327205.877216  7398702.978633 
+327210.058055  7398677.463004 
+327215.879894  7398668.454547 
+327222.641803  7398649.817739 
+327330.015972  7398465.119376 
+327336.217138  7398453.081438 
+327353.798101  7398428.965569 
+327363.141081  7398397.071032 
+327395.276641  7398353.138558 
+327460.891899  7398241.927607 
+327509.792046  7398139.425165 
+327559.186968  7398037.662596 
+327587.842620  7397981.352241 
+327733.759671  7397726.455903 
+327815.685972  7397640.850566 
+327930.646674  7397541.787535 
+327964.901516  7397503.874029 
+327960.011501  7397358.338958 
+327960.011501  7397237.259698 
+327879.503551  7397240.909073 
+327872.279853  7397239.849254 
+327813.451244  7397240.089213 
+327743.209851  7397239.319345 
+327670.469851  7397120.919626 
+327538.018894  7396913.845096 
+327444.688056  7396776.748579 
+327355.587533  7396637.912360 
+327319.056732  7396569.494080 
+327271.220348  7396497.516409 
+327197.350613  7396547.047925 
+327121.732678  7396569.494080 
+327124.041623  7396529.520927 
+327119.704106  7396502.895488 
+327113.816297  7396474.000437 
+327102.617916  7396445.515316 
+327091.081439  7396423.889021 
+327077.656576  7396405.692138 
+327059.663300  7396387.525249 
+327040.169211  7396372.797772 
+327027.940051  7396363.729325 
+326976.689728  7396320.636707 
+326956.791573  7396302.099882 
+326937.256253  7396280.523578 
+326918.883651  7396261.206887 
+326829.296601  7396237.370970 
+326814.469878  7396240.130497 
+326781.196338  7396251.608531 
+326758.684128  7396264.146383 
+326723.340783  7396296.880776 
+326695.229383  7396282.143300 
+326707.293619  7396238.470781 
+326708.926372  7396217.124438 
+326738.052059  7396121.050894 
+326737.969597  7396105.443567 
+326732.922903  7396089.096368 
+326723.711864  7396056.182006 
+326724.849844  7396000.001629 
+326739.033360  7395842.888541 
+326753.917807  7395717.929945 
+326767.820952  7395600.580046 
+326722.252281  7395592.821375 
+326675.628093  7395581.013398 
+326616.082061  7395566.125948 
+326616.073815  7395566.145944 
+326499.307189  7395571.235073 
+326434.763942  7395579.483660 
+326293.308101  7395601.169945 
+326241.439311  7395612.967924 
+326076.432235  7395651.951247 
+326060.409809  7395655.290675 
+326016.160536  7395659.709918 
+325977.271312  7395674.527380 
+325916.546069  7395703.612398 
+325895.237809  7395723.718953 
+325876.246740  7395755.763465 
+325844.292596  7395787.318060 
+325828.542296  7395794.716792 
+325817.352161  7395798.296179 
+325796.497444  7395800.885735 
+325769.029249  7395805.274984 
+325709.771836  7395810.994004 
+325688.933611  7395819.172603 
+325671.138245  7395824.801639 
+325662.751829  7395829.130897 
+325645.236835  7395843.648411 
+325628.249600  7395862.975100 
+325561.850951  7395949.470284 
+325516.686345  7395993.502742 
+325530.680199  7396021.447955 
+325534.110631  7396033.985808 
+325532.222244  7396044.643982 
+325534.506450  7396050.343006 
+325531.859410  7396068.589880 
+325525.402611  7396077.708318 
+325516.661607  7396090.246171 
+325501.818391  7396102.034151 
+325485.853689  7396111.912459 
+325467.200715  7396120.640964 
+325432.962366  7396133.938687 
+325393.009378  7396146.086606 
+325351.910165  7396159.004393 
+325324.953237  7396168.152826 
+325288.372957  7396174.191792 
+325247.653070  7396178.361077 
+325219.863273  7396180.630689 
+325167.343030  7396184.410041 
+325123.580284  7396187.819457 
+325022.333064  7396184.749983 
+324953.048234  7396172.572069 
+324700.672345  7396127.629767 
+324585.711644  7396105.553549 
+324572.047640  7396095.685239 
+324560.593625  7396088.456477 
+324548.026370  7396080.117906 
+324536.201275  7396070.179608 
+324527.163406  7396064.370603 
+324506.127272  7396048.483324 
+324523.881407  7396080.807787 
+324527.163406  7396103.803848 
+324522.232160  7396177.701190 
+324515.668161  7396220.403876 
+324489.387424  7396323.866154 
+324482.823424  7396419.119838 
+324489.387424  7396451.964212 
+324494.318670  7396474.950274 
+324500.882669  7396499.586054 
+324509.095915  7396522.582115 
+324519.601613  7396545.958111 
+324479.871274  7396681.244938 
+324472.812500  7396704.111021 
+324446.012251  7396786.426921 
+324419.632559  7396874.811782 
+324429.569267  7396885.939876 
+324435.127226  7396893.498581 
+324439.538960  7396902.627017 
+324443.076592  7396912.535320 
+324443.043608  7396924.063345 
+324440.322351  7396937.980961 
+324429.965086  7396949.928915 
+324406.768439  7397044.902647 
+324370.707672  7397107.931850 
+324352.236116  7397131.617793 
+324331.727740  7397182.789028 
+324285.746758  7397343.731460 
+324230.719661  7397533.278992 
+324188.853548  7397690.242106 
+324194.263075  7397698.160749 
+324176.978976  7397731.405055 
+324092.018061  7397845.835454 
+324040.990386  7397911.364230 
+324057.120013  7397934.540260 
+323980.817641  7397992.200383 
+323924.256745  7398036.192848 
+323894.867179  7398063.488172 
+323867.563909  7398098.142236 
+323847.566800  7398138.115389 
+323830.909414  7398192.076146 
+323823.578515  7398208.733293 
+323794.527045  7398290.029368 
+323748.999605  7398458.030591 
+323878.712813  7398544.435790 
+323992.576766  7398611.404319 
+324101.971262  7398696.249786 
+324166.712419  7398772.156784 
+324280.576371  7398954.105617 
+324343.082800  7399027.772999 
+324392.205596  7399056.798027 
+324541.718003  7399165.749365 
+324677.920995  7399197.423939 
+Region 1
+124
+333956.423041  7394117.764039 
+333947.632559  7394151.748218 
+333937.423725  7394115.114493 
+333926.142882  7394090.908639 
+333914.862038  7394064.673133 
+333910.087471  7394056.264573 
+333899.787929  7394038.417630 
+333892.993034  7394028.729290 
+333886.453774  7394018.780994 
+333877.630307  7394007.812873 
+333870.942614  7394000.004210 
+333844.810309  7393981.247423 
+333802.688563  7393971.229139 
+333747.339863  7393961.650780 
+333719.137754  7393959.301182 
+333662.684059  7393954.741963 
+333456.750941  7393939.814520 
+333348.296515  7393932.705738 
+333236.312703  7393924.627122 
+333191.717088  7393921.957579 
+333146.082447  7393928.026539 
+333080.392974  7393935.765214 
+333041.759383  7393939.624553 
+333017.243340  7393944.773671 
+332915.641532  7393966.190002 
+332883.440001  7393972.568910 
+332838.316627  7393850.359843 
+332806.510916  7393761.085135 
+332783.710088  7393687.697705 
+332766.764084  7393643.535270 
+332749.430507  7393607.281480 
+332714.639660  7393561.139384 
+332691.071933  7393516.607012 
+332669.153452  7393463.186162 
+332653.543337  7393423.622939 
+332641.388393  7393377.150899 
+332635.187228  7393320.950526 
+332625.151565  7393236.764946 
+332616.913581  7393138.681747 
+332610.011485  7393103.287810 
+332603.538194  7393079.041963 
+332591.572914  7393028.010704 
+332583.170005  7392994.156503 
+332578.560362  7392958.982528 
+332572.837478  7392917.239678 
+332573.876503  7392885.275153 
+332575.220638  7392839.113060 
+332582.634000  7392791.091286 
+332584.753281  7392746.688892 
+332583.293698  7392701.066706 
+332580.803337  7392653.954776 
+332577.702754  7392584.276711 
+332555.710057  7392351.046662 
+332557.515981  7392291.436872 
+332555.619348  7392250.453892 
+332559.536308  7392053.557619 
+332626.710103  7392026.792204 
+332727.652212  7391998.537043 
+332872.571469  7391951.855040 
+332932.142239  7391927.989128 
+333028.037656  7391902.023575 
+333133.292544  7391870.638951 
+333289.797755  7391879.407449 
+333239.347316  7391844.073502 
+333250.108647  7391826.466518 
+333253.638034  7391822.627175 
+333259.707259  7391819.777663 
+333264.786938  7391818.467888 
+333269.619229  7391818.427894 
+333277.263485  7391819.377732 
+333283.876961  7391819.817656 
+333289.220519  7391820.027620 
+333295.833996  7391819.717674 
+333302.678367  7391817.877989 
+333309.011473  7391814.528562 
+333313.299512  7391811.189134 
+333321.578728  7391799.701102 
+333378.246825  7391690.329836 
+333384.497468  7391539.305706 
+333398.606768  7391516.789562 
+333418.191566  7391488.814354 
+333436.481706  7391488.064483 
+333513.386053  7391491.213943 
+333580.106305  7391482.015519 
+333632.337930  7391481.265647 
+333714.173523  7391474.746764 
+333781.553474  7391471.317351 
+333826.083119  7391473.466983 
+333859.810202  7391489.414252 
+333890.156331  7391524.158300 
+334025.790333  7391529.297420 
+334080.363887  7391531.637019 
+334144.321652  7391529.517382 
+334171.220856  7391678.751820 
+334185.717730  7391763.807250 
+334190.368604  7391790.992594 
+334214.373381  7391904.213200 
+334222.240286  7391954.644562 
+334230.239129  7391999.996793 
+334242.493028  7392080.962925 
+334278.537302  7392277.169316 
+334302.781220  7392415.995537 
+334329.218636  7392548.722802 
+334358.781373  7392719.923476 
+334409.743078  7392986.947738 
+334358.921558  7392996.776054 
+334356.241534  7393021.411834 
+334345.405986  7393111.826347 
+334342.288911  7393124.054252 
+334333.853017  7393138.121843 
+334304.578899  7393170.236342 
+334294.394804  7393193.372379 
+334277.960066  7393343.586649 
+334240.538671  7393340.567166 
+334209.607060  7393348.105874 
+334149.797149  7393365.672865 
+334176.102625  7393464.365960 
+334198.021106  7393539.693057 
+334231.410094  7393644.665077 
+334141.328270  7393692.396901 
+334024.149333  7393748.137353 
+334002.890550  7393905.390417 
+333992.211682  7393973.488752 
+333956.423041  7394117.764039 
+Region 1
+145
+329086.603286  7402389.157224 
+329078.794105  7402335.956337 
+329044.176429  7402293.933535 
+328991.441784  7402247.231535 
+328876.068771  7402181.852734 
+328774.293793  7402116.863866 
+328710.319535  7402074.781074 
+328675.413241  7402053.494720 
+328629.440505  7402030.508657 
+328577.513991  7401998.164198 
+328548.107932  7401973.788373 
+328521.513838  7401947.792826 
+328474.328907  7401889.732771 
+328413.249076  7401818.374994 
+328373.823847  7401768.183591 
+328263.901593  7401657.802499 
+328195.499110  7401557.499680 
+328172.393171  7401536.823221 
+328116.838316  7401463.745739 
+328065.893103  7401410.154918 
+328018.642201  7401351.424978 
+327958.708597  7401268.679152 
+327942.290351  7401226.466383 
+327926.449342  7401186.993144 
+327917.518675  7401143.050671 
+327913.073956  7401127.793284 
+327904.201012  7401085.320560 
+327901.116922  7401059.754939 
+327898.107048  7401043.577710 
+327901.042706  7401007.563879 
+327904.407168  7400986.917415 
+327908.101479  7400963.101495 
+327916.289986  7400940.275405 
+327931.529020  7400859.829184 
+327956.251220  7400744.768893 
+327975.201058  7400663.912743 
+327983.892585  7400597.324149 
+327993.862278  7400518.667622 
+327992.633590  7400467.596370 
+327988.617675  7400446.999898 
+327983.678183  7400425.183635 
+327974.228003  7400391.519401 
+327951.526130  7400352.696052 
+327918.706132  7400303.074551 
+327857.337683  7400201.801898 
+327828.179012  7400148.161087 
+327801.354023  7400085.171876 
+327774.529035  7400016.363662 
+327739.078490  7399947.095527 
+327707.833522  7399873.848074 
+327705.541070  7399867.899093 
+327677.677056  7399805.989697 
+327630.285969  7399704.737041 
+327582.886635  7399576.558997 
+327557.026456  7399446.221322 
+327535.421331  7399299.876390 
+327502.287977  7399141.383538 
+327604.978287  7399124.166488 
+327687.193206  7399107.099411 
+327890.619470  7399056.238123 
+328141.857379  7399021.464080 
+328241.785202  7398973.502295 
+328317.708248  7398902.424470 
+328421.668478  7398807.610711 
+328615.537360  7398687.691252 
+328705.478998  7398637.709813 
+328821.404508  7398601.735975 
+329181.162813  7398557.763507 
+329263.649858  7398549.594906 
+329395.482347  7398538.076879 
+329435.657983  7399061.717185 
+329451.301082  7399191.105022 
+329458.986569  7399344.238791 
+329465.608293  7399378.612903 
+329488.079271  7399409.027693 
+329515.836083  7399431.503843 
+329573.328804  7399496.512708 
+329601.456696  7399528.847169 
+329633.196438  7399562.451413 
+329650.208412  7399584.597620 
+329805.979709  7399801.140528 
+329890.602528  7399920.420097 
+329905.915778  7399944.905902 
+329935.247620  7399999.116617 
+330000.607245  7400055.746916 
+330049.103327  7400141.592212 
+330098.036460  7400238.035692 
+330129.677247  7400322.161282 
+330108.006152  7400339.758268 
+330060.656296  7400395.078792 
+330016.423515  7400429.032976 
+329971.498050  7400459.587742 
+329922.935998  7400489.322649 
+329889.893352  7400509.579179 
+329860.586248  7400527.626088 
+329851.292746  7400535.624718 
+329847.557204  7400539.644029 
+329842.832114  7400552.141888 
+329841.760104  7400575.737847 
+329843.937108  7400640.916682 
+329818.852075  7400759.126434 
+329773.069002  7400988.187198 
+329755.669456  7401073.362608 
+329824.962532  7401089.719806 
+329875.660358  7401164.427009 
+329910.055386  7401220.687373 
+329936.138213  7401257.821012 
+329915.687561  7401359.213644 
+329975.266578  7401452.597648 
+330017.973806  7401536.203328 
+330012.292153  7401579.055987 
+330010.857309  7401601.132206 
+330001.069033  7401699.865294 
+330020.381706  7401744.507647 
+330091.389998  7401907.479731 
+330094.474088  7401909.779337 
+330193.189715  7401980.037303 
+330210.251166  7402002.603437 
+330175.386103  7402007.532593 
+330136.233000  7402010.932011 
+330100.477344  7402014.341427 
+330065.571050  7402024.559676 
+330000.879370  7402067.122386 
+329940.426253  7402113.084513 
+329902.122512  7402135.220721 
+329873.178242  7402139.479992 
+329845.091581  7402142.029555 
+329825.506783  7402146.288825 
+329799.118845  7402159.056638 
+329766.768882  7402176.933576 
+329759.108134  7402184.592264 
+329742.937275  7402188.001680 
+329653.548135  7402175.233867 
+329430.512335  7402142.879409 
+329351.340275  7402129.261742 
+329189.590460  7402107.985386 
+329155.541774  7402107.125534 
+329155.492297  7402107.145530 
+329156.993111  7402153.997505 
+329156.217965  7402247.021571 
+329156.226211  7402247.051566 
+329135.792052  7402360.532127 
+329126.160454  7402362.741749 
+329117.930716  7402376.709356 
+329086.603286  7402389.157224 
+Region 1
+514
+334379.256763  7402229.984489 
+334383.891145  7402300.952333 
+334381.227612  7402411.963318 
+334383.891145  7402451.776498 
+334377.640502  7402474.472610 
+334416.752374  7402546.400290 
+334440.996292  7402584.113830 
+334457.727894  7402613.128860 
+334505.440585  7402703.143441 
+334573.636912  7402794.947716 
+334605.285945  7402826.602294 
+334622.429859  7402862.286182 
+334648.372500  7402926.965103 
+334672.665896  7402986.454913 
+334674.710961  7402993.943630 
+334691.120960  7403041.125548 
+334701.049422  7403070.810463 
+334719.133406  7403109.983753 
+334745.364665  7403167.883835 
+334585.313575  7403210.856475 
+334545.772899  7403205.097461 
+334497.928268  7403171.743174 
+334445.977015  7403218.635142 
+334395.229712  7403230.473114 
+334370.425050  7403207.896982 
+334267.660524  7403234.542417 
+334100.022901  7403279.534711 
+334031.348292  7403215.435690 
+333944.358805  7403279.524712 
+333845.354560  7403296.121869 
+333788.125719  7403323.597163 
+333795.926654  7403394.704983 
+333870.200453  7403447.825884 
+333862.820077  7403475.371166 
+333850.516700  7403498.977122 
+333832.333762  7403504.396194 
+333800.849653  7403543.249539 
+333766.413394  7403570.304904 
+333725.503844  7403592.701068 
+333702.422644  7403599.919832 
+333685.361193  7403602.849330 
+333655.847934  7403612.067751 
+333614.690996  7403629.464771 
+333610.551389  7403631.814368 
+333602.280419  7403637.273433 
+333597.786224  7403641.912639 
+333585.590048  7403662.269152 
+333592.879716  7403577.303705 
+333496.176170  7403582.502815 
+333488.507175  7403626.375300 
+333475.717271  7403686.375023 
+333461.946066  7403760.152385 
+333454.079162  7403829.020589 
+333464.898217  7403873.283007 
+333484.136673  7403893.249587 
+333523.965967  7403929.193430 
+333544.383634  7403961.247939 
+333553.751352  7404001.810991 
+333555.887126  7404015.478650 
+333559.771100  7404042.434033 
+333563.432427  7404056.451632 
+333566.590733  7404072.278921 
+333580.238245  7404082.817116 
+333592.154048  7404090.245843 
+333607.236404  7404104.853341 
+333617.667886  7404114.581675 
+333629.311563  7404127.709426 
+333635.182880  7404137.507748 
+333635.100417  7404155.404682 
+333631.876141  7404167.242654 
+333626.779970  7404180.260424 
+333624.231885  7404186.389375 
+333616.958710  7404206.285967 
+333607.079725  7404221.293396 
+333606.890062  7404240.320137 
+333603.649294  7404273.094523 
+333599.361254  7404311.207994 
+333597.530590  7404337.503490 
+333593.357998  7404360.389570 
+333578.795154  7404397.883148 
+333578.745677  7404397.913143 
+333535.560167  7404430.987477 
+333524.510218  7404448.624456 
+333518.812073  7404471.160596 
+333517.360736  7404497.816030 
+333518.383269  7404535.099644 
+333518.449238  7404561.345148 
+333518.276068  7404573.912995 
+333517.121595  7404576.492553 
+333518.309053  7404573.883000 
+333512.759339  7404586.110906 
+333505.156315  7404598.878719 
+333491.888130  7404614.486046 
+333477.407749  7404630.463309 
+333470.307744  7404640.001675 
+333459.447458  7404646.430574 
+333443.647680  7404657.278716 
+333427.443837  7404666.997051 
+333407.364265  7404671.526275 
+333392.587020  7404673.685905 
+333338.673164  7404679.114975 
+333310.908106  7404680.294773 
+333290.828534  7404683.684193 
+333278.360233  7404685.353907 
+333236.906432  7404700.611293 
+333208.044624  7404708.110009 
+333201.035328  7404709.949693 
+333149.488141  7404759.311238 
+333141.612990  7404787.026491 
+333145.389764  7404799.144415 
+333136.013800  7404859.624056 
+333127.916001  7404895.957832 
+333120.131560  7404924.772896 
+333104.595661  7404961.036685 
+333080.656853  7404999.310129 
+333061.632799  7405028.335157 
+332996.718472  7405116.959976 
+332916.029105  7405227.241086 
+332897.235945  7405313.646286 
+332879.176700  7405392.412794 
+332832.964823  7405467.419946 
+332836.543688  7405511.762350 
+332861.241148  7405568.852571 
+332864.284007  7405633.351523 
+332854.578194  7405705.229211 
+332877.700625  7405756.990345 
+332918.849316  7405822.249167 
+332887.761026  7405869.301107 
+332809.256910  7405952.576843 
+332749.026442  7406010.396939 
+332738.900071  7406031.033404 
+332735.593332  7406050.510068 
+332737.283809  7406073.086201 
+332744.491015  7406097.032099 
+332754.807049  7406115.188989 
+332800.598368  7406153.892359 
+332830.532185  7406174.618809 
+332852.120817  7406197.254932 
+332854.396777  7406213.512147 
+332846.810245  7406250.155870 
+332846.892707  7406261.823871 
+332852.467159  7406276.861296 
+332875.317464  7406299.007502 
+332890.531760  7406310.125598 
+332901.400292  7406325.253007 
+332913.852100  7406352.558329 
+332925.240144  7406382.903132 
+332937.403335  7406407.478922 
+332956.031570  7406431.534802 
+332973.917644  7406448.531890 
+332997.782235  7406470.938052 
+333031.426856  7406495.783796 
+333063.933498  7406512.990849 
+333150.518919  7406570.311030 
+333186.868304  7406600.255901 
+333238.456723  7406725.004533 
+333247.956381  7406747.200731 
+333259.047561  7406764.087838 
+333277.659304  7406783.894446 
+333289.962680  7406804.610897 
+333307.626106  7406836.815381 
+333332.537969  7406873.189150 
+333358.340424  7406917.941484 
+333364.096293  7406937.538128 
+333353.310224  7406969.332682 
+333340.140993  7406990.928982 
+333337.246566  7407016.244646 
+333337.048657  7407047.169349 
+333322.840401  7407071.285218 
+333301.416694  7407088.972188 
+333279.836308  7407100.060289 
+333246.158703  7407111.978248 
+333225.798759  7407126.125824 
+333214.179820  7407145.222553 
+333222.137433  7407169.678364 
+333228.792141  7407180.166568 
+333229.229191  7407201.732874 
+333220.067629  7407259.392997 
+333225.642081  7407291.437508 
+333233.583201  7407300.405972 
+333238.869035  7407317.483047 
+333238.613401  7407335.729921 
+333231.026869  7407354.116772 
+333222.483774  7407369.964057 
+333209.603162  7407389.800659 
+333195.386660  7407407.247671 
+333184.707792  7407420.355426 
+333171.686994  7407432.333374 
+333158.187914  7407442.271671 
+333135.296378  7407456.889168 
+333126.448172  7407476.015891 
+333122.432258  7407492.703033 
+333117.839107  7407513.669442 
+333112.553274  7407530.576546 
+333103.762792  7407546.423831 
+333083.105984  7407579.828109 
+333078.471602  7407604.353908 
+333078.900406  7407626.670086 
+333089.892632  7407667.903023 
+333104.257566  7407718.824301 
+333109.172319  7407744.999817 
+333108.322957  7407768.815737 
+333104.801817  7407785.252922 
+333094.988802  7407801.330168 
+333083.971838  7407813.838026 
+333077.242914  7407826.405873 
+333075.016432  7407840.583444 
+333081.118642  7407854.361084 
+333088.210401  7407868.658635 
+333099.301581  7407886.055655 
+333105.073942  7407904.662468 
+333107.531319  7407925.988815 
+333107.382887  7407953.624081 
+333103.193802  7407999.186277 
+332938.953626  7408038.109610 
+332946.498927  7408125.794590 
+332952.411474  7408178.075635 
+332929.379752  7408201.131686 
+332898.810975  7408211.739869 
+332882.805042  7408210.840023 
+332866.642429  7408197.042386 
+332855.782144  7408187.604003 
+332846.933938  7408180.195272 
+332827.184216  7408170.666904 
+332811.714287  7408166.487620 
+332794.941454  7408166.337646 
+332770.243993  7408173.706383 
+332738.108432  7408190.113573 
+332698.064736  7408210.999995 
+332672.608622  7408217.358906 
+332642.320217  7408224.427695 
+332608.980707  7408231.716447 
+332579.220060  7408235.255840 
+332549.492399  7408234.995885 
+332514.223270  7408227.607151 
+332483.539046  7408218.748668 
+332446.818581  7408199.971884 
+332426.046326  7408190.943431 
+332390.538057  7408181.535042 
+332362.888445  7408174.466253 
+332325.516528  7408177.175789 
+332293.702570  7408184.734494 
+332261.080482  7408198.362160 
+332239.162001  7408207.520591 
+332218.043404  7408210.370103 
+332197.238164  7408205.890870 
+332176.004120  7408191.043414 
+332155.042202  7408172.656563 
+332132.546485  7408155.269541 
+332103.915572  7408142.641704 
+332089.707317  7408139.982160 
+332058.973615  7408138.452422 
+332019.820512  7408141.151960 
+331972.050098  7408139.972162 
+331925.632065  7408127.944222 
+331887.897314  7408110.167267 
+331853.213668  7408091.670435 
+331824.376599  7408073.723509 
+331782.848582  7408052.127209 
+331740.050645  7408032.030651 
+331703.280702  7408020.592610 
+331673.091252  7408013.753782 
+331636.007953  7408010.904270 
+331595.593176  7408012.823941 
+331569.642288  7408017.153199 
+331540.665034  7408018.412984 
+331503.837368  7408016.073384 
+331472.345013  7408012.763951 
+331444.629432  7408015.563472 
+331423.411880  7408033.830343 
+331402.491193  7408044.768469 
+331385.396757  7408054.736762 
+331370.627758  7408059.665917 
+331352.304633  7408063.295296 
+331324.399389  7408055.976549 
+331301.400652  7408039.089442 
+331282.211673  7408020.722588 
+331189.021020  7407898.183578 
+331104.323985  7407868.428675 
+331015.198725  7407836.004229 
+331030.314065  7407833.464664 
+331045.932426  7407833.464664 
+331057.774013  7407834.224533 
+331069.112581  7407837.523968 
+331126.770225  7407861.409877 
+331135.082426  7407864.199399 
+331142.380340  7407864.449356 
+331150.436907  7407862.169747 
+331158.006947  7407856.830661 
+331169.947489  7407845.912531 
+331268.729086  7407758.257546 
+331290.919693  7407735.391463 
+331306.571038  7407711.755511 
+331330.584062  7407693.118704 
+331330.311936  7407667.813038 
+331339.663162  7407646.466695 
+331345.979775  7407626.140176 
+331349.278267  7407606.333569 
+331352.815900  7407393.929952 
+331350.828558  7407376.142999 
+331347.068277  7407362.165393 
+331342.301956  7407351.497220 
+331333.750615  7407338.289483 
+331298.778350  7407299.416141 
+331285.452442  7407284.928623 
+331274.402493  7407256.993408 
+331269.149644  7407218.110068 
+331265.653242  7407199.823201 
+331261.142554  7407180.256552 
+331255.122805  7407163.239467 
+331245.070650  7407142.403036 
+331210.362265  7407097.690695 
+331200.796638  7407086.002697 
+331194.257377  7407080.673610 
+331181.673629  7407072.794959 
+331174.367469  7407070.755309 
+331160.258168  7407066.945961 
+331123.240839  7407056.777703 
+331090.758936  7407046.369486 
+331084.970082  7407043.569965 
+331074.654048  7407037.980923 
+331065.591440  7407031.632010 
+331032.128236  7406991.228931 
+331001.460504  7406943.467112 
+330971.312285  7406876.398600 
+330967.543758  7406866.740255 
+330963.033070  7406854.292387 
+330965.061642  7406839.814867 
+330965.333768  7406827.616956 
+330967.098461  7406817.958611 
+330970.899974  7406803.481091 
+331000.429726  7406754.699446 
+331011.537398  7406737.422406 
+331016.336704  7406727.014189 
+331022.397684  7406716.845930 
+331028.466910  7406701.088629 
+331034.536135  7406679.752284 
+331092.498891  7406638.689318 
+331102.353136  7406599.376052 
+331109.387171  7406583.388790 
+331110.838508  7406554.503738 
+331104.439433  7406524.968797 
+331092.383443  7406506.441971 
+331069.211535  7406477.496929 
+331050.979119  7406454.580854 
+331031.666447  7406428.215370 
+331011.149825  7406398.860398 
+330987.211018  7406358.497312 
+330983.846556  7406320.233866 
+330982.857008  7406300.067321 
+330984.036219  7406268.522724 
+330988.654108  7406249.076055 
+331002.516022  7406224.980182 
+331024.088161  7406189.456267 
+331052.397471  7406171.289379 
+331087.377981  7406159.841340 
+331116.536653  7406155.742042 
+331147.361063  7406150.782892 
+331165.230645  7406151.762724 
+331190.406387  7406148.723245 
+331204.993969  7406133.715815 
+331212.588748  7406103.351016 
+331209.496411  7406069.536809 
+331205.686653  7406036.152527 
+331211.953788  7406017.065796 
+331222.475978  7406007.887369 
+331253.580760  7405949.657343 
+331261.216770  7405910.524046 
+331243.083309  7405875.200097 
+331213.504079  7405848.474674 
+331181.038669  7405828.428108 
+331196.310688  7405779.746447 
+331252.442780  7405661.566690 
+331300.188456  7405584.699857 
+331288.849889  7405477.058295 
+331273.346975  7405361.218137 
+331260.573564  7405250.847043 
+331359.083035  7405196.126416 
+331368.203366  7405189.737510 
+331381.892109  7405176.049855 
+331415.643931  7405155.983292 
+331448.472175  7405128.627978 
+331466.712837  7405114.030478 
+331514.153402  7405076.636883 
+331531.478733  7405046.532040 
+331559.763304  7404992.721257 
+331623.597376  7404951.668289 
+331613.858577  7404874.261548 
+331623.787039  7404819.110995 
+331654.611449  7404750.092817 
+331647.313535  7404731.845943 
+331644.584033  7404697.181880 
+331701.128436  7404621.484847 
+331708.426350  7404603.237972 
+331704.781516  7404578.612190 
+331687.447939  7404555.806097 
+331615.392376  7404483.748440 
+331588.031383  7404438.146251 
+331604.499105  7404415.940055 
+331631.810621  7404376.116876 
+331660.086946  7404335.983750 
+331665.562443  7404318.656718 
+331659.171615  7404302.239531 
+331583.471217  7404163.593279 
+331602.618965  7404094.265155 
+331796.809450  7403685.145233 
+331857.947004  7403562.876177 
+331807.001791  7403550.838239 
+331767.898166  7403538.960273 
+331709.753993  7403522.123157 
+331665.422257  7403518.013861 
+331638.391113  7403506.575821 
+331590.562976  7403467.072587 
+331583.289800  7403464.992943 
+331483.493917  7403408.852560 
+331475.173470  7403403.653450 
+331399.283409  7403374.538437 
+331376.400119  7403369.349326 
+331343.126579  7403364.150217 
+331377.958657  7403299.421304 
+331410.712685  7403265.637091 
+331460.973461  7403232.442777 
+331479.073937  7403196.368956 
+331485.712153  7403184.620968 
+331522.647020  7403107.174234 
+331532.460034  7403055.783037 
+331524.485929  7402976.576605 
+331498.246423  7402921.656012 
+331474.480787  7402871.914532 
+331458.730486  7402813.554529 
+331466.143848  7402754.274683 
+331478.801812  7402691.455443 
+331448.752547  7402630.965805 
+331429.093533  7402492.159581 
+331327.211354  7402452.326404 
+331310.537475  7402445.847514 
+331261.381694  7402416.782492 
+331188.270613  7402388.417351 
+331091.006323  7402346.734491 
+331090.090991  7402315.249884 
+331095.888091  7402291.134015 
+331061.377616  7402270.787500 
+330962.266170  7402191.131144 
+330997.931118  7402164.765660 
+331025.250880  7402135.560663 
+331089.711665  7402052.364914 
+331113.469055  7402011.481917 
+331165.346092  7401924.006900 
+331193.441000  7401881.944105 
+331192.921488  7401863.527260 
+331218.723943  7401784.370819 
+331227.613380  7401707.873922 
+331234.721631  7401641.165348 
+331239.166349  7401619.029140 
+331257.852308  7401563.778604 
+331279.836759  7401534.623598 
+331311.592993  7401502.479104 
+331338.797308  7401473.794018 
+331377.546345  7401436.040484 
+331390.558897  7401423.512630 
+331558.476892  7401457.046886 
+331626.961838  7401471.274449 
+331715.023335  7401484.622163 
+331754.151699  7401495.290336 
+331783.508280  7401512.197439 
+331848.043281  7401567.807914 
+331877.944114  7401587.154600 
+331904.117650  7401602.991887 
+331925.302216  7401611.560420 
+331951.780863  7401620.538882 
+332001.621081  7401630.527171 
+332096.526949  7401640.395480 
+332210.308440  7401645.144667 
+332273.260165  7401648.704057 
+332322.193297  7401649.483924 
+332390.439102  7401654.613045 
+332497.706070  7401666.161067 
+332547.999831  7401686.017666 
+332584.637834  7401705.004413 
+332686.585983  7401761.494737 
+332747.360703  7401798.968318 
+332769.576049  7401817.455152 
+332791.766655  7401840.901136 
+332837.417788  7401915.998272 
+332850.916868  7401934.405119 
+332871.548937  7401962.030387 
+332893.351971  7401985.846308 
+332919.327597  7402009.322287 
+332944.618786  7402024.779639 
+332971.080941  7402036.667603 
+333019.280159  7402056.344232 
+333080.269281  7402069.132042 
+333169.303833  7402072.081536 
+333242.818979  7402071.341663 
+333376.861458  7402093.727829 
+333449.147916  7402093.737827 
+333512.107887  7402089.308586 
+333563.259256  7402105.045890 
+333701.466081  7402224.075501 
+333742.952868  7402258.219653 
+333765.003289  7402271.497378 
+333798.136643  7402290.464129 
+333867.231810  7402319.499156 
+333895.763768  7402354.423174 
+333935.106534  7402371.140310 
+334022.656765  7402375.569552 
+334081.683284  7402366.711069 
+334108.318609  7402360.422146 
+334132.339879  7402341.135450 
+334197.270699  7402308.181095 
+334249.403369  7402244.242047 
+334277.110704  7402221.205993 
+334359.581257  7402151.287969 
+334379.256763  7402229.984489 
+Region 1
+204
+330950.853387  7387691.874736 
+330876.662050  7387602.300079 
+330805.068275  7387510.095873 
+330727.677401  7387424.140596 
+330650.500928  7387338.625244 
+330572.837928  7387253.559815 
+330555.512597  7387229.943860 
+330497.970400  7387158.766052 
+330461.398367  7387176.463021 
+330438.663509  7387188.420973 
+330400.697863  7387206.217924 
+330386.456623  7387212.146909 
+330329.516400  7387242.991625 
+330296.300583  7387258.418983 
+330273.763635  7387267.907357 
+330213.376488  7387275.576044 
+330169.918852  7387293.382994 
+330042.836192  7387321.478181 
+329998.760089  7387334.725912 
+329956.506403  7387349.743340 
+329924.271887  7387362.961076 
+329829.761838  7387433.409008 
+329740.587100  7387502.307207 
+329652.805975  7387578.354181 
+329605.571565  7387620.936887 
+329557.446563  7387656.030875 
+329464.725946  7387678.197079 
+329432.969712  7387693.814403 
+329406.383864  7387707.422073 
+329328.267321  7387745.315582 
+329274.023616  7387773.140816 
+329225.700704  7387805.805220 
+329174.508105  7387845.418435 
+329136.212609  7387890.930639 
+329066.350543  7387999.981960 
+329034.149013  7388047.893753 
+329006.243768  7388077.138743 
+328983.261523  7388096.585412 
+328960.468942  7388116.581987 
+328986.312629  7388192.758939 
+329012.906723  7388275.254808 
+329055.539735  7388390.215116 
+329088.912230  7388478.939919 
+329097.075999  7388502.625861 
+329111.119330  7388543.218908 
+329130.357786  7388609.337583 
+329134.142806  7388619.945765 
+329163.746774  7388720.938466 
+329173.427848  7388746.374109 
+329198.026354  7388826.670355 
+329207.212655  7388865.033784 
+329216.481419  7388942.070588 
+329224.603956  7389003.320097 
+329228.430207  7389063.709753 
+329229.452739  7389149.984975 
+329226.682006  7389231.930938 
+329226.640775  7389247.018354 
+329223.804071  7389267.674815 
+329224.958544  7389292.110630 
+329226.236709  7389313.546958 
+329234.128352  7389362.398590 
+329238.474116  7389374.726478 
+329255.345904  7389427.987355 
+329279.738254  7389518.331880 
+329304.221313  7389600.217854 
+329308.962895  7389631.062570 
+329315.873237  7389695.391551 
+329321.340487  7389748.372476 
+329328.992989  7389856.913884 
+329330.823653  7389873.611024 
+329337.321682  7389930.331308 
+329343.951652  7389978.463064 
+329344.891722  7389999.999375 
+329353.459556  7390068.967561 
+329357.467224  7390103.261687 
+329360.493591  7390113.799882 
+329365.482560  7390131.796799 
+329372.277454  7390162.451548 
+329404.033688  7390283.320844 
+329424.756466  7390370.725873 
+329436.779470  7390407.749531 
+329446.889349  7390442.423592 
+329460.850218  7390496.864266 
+329462.548941  7390502.603283 
+329468.123393  7390520.980136 
+329474.662654  7390546.525760 
+329493.447567  7390599.246729 
+329511.952109  7390647.118529 
+329532.287314  7390699.719519 
+329583.422190  7390823.248360 
+329684.768365  7390895.316015 
+329742.887798  7390927.450511 
+329789.462509  7390960.114916 
+329836.202144  7390988.010137 
+329893.736095  7391025.903647 
+330043.256749  7391125.106654 
+330125.809764  7391177.297714 
+330205.006564  7391226.889220 
+330282.422177  7391276.850662 
+330364.488664  7391331.081372 
+330388.782060  7391339.559920 
+330454.281870  7391387.281746 
+330490.524053  7391405.308658 
+330537.601784  7391447.391450 
+330564.690652  7391470.517488 
+330605.517740  7391515.519780 
+330653.477817  7391561.041982 
+330672.823474  7391582.798256 
+330735.577290  7391647.837115 
+330804.053989  7391714.025778 
+330840.279680  7391748.169929 
+330879.259612  7391793.582150 
+330950.474060  7391859.860797 
+330984.069204  7391894.364887 
+331016.509875  7391928.729001 
+331075.998183  7391991.998163 
+331142.306124  7392053.467634 
+331175.521941  7392089.601445 
+331228.330802  7392143.752169 
+331268.399237  7392184.845130 
+331356.386518  7392080.083075 
+331372.780024  7392078.383366 
+331457.023516  7392028.971830 
+331476.921671  7392021.553101 
+331503.029237  7392006.015762 
+331513.609151  7392000.046785 
+331547.410451  7391976.780770 
+331571.753323  7391955.614396 
+331580.213956  7391937.117564 
+331567.753902  7391862.920273 
+331566.418012  7391788.333049 
+331562.459821  7391723.314187 
+331560.373525  7391612.173224 
+331552.712777  7391549.134022 
+331529.359452  7391440.092700 
+331530.579894  7391396.140229 
+331532.938316  7391370.984537 
+331538.380828  7391348.338417 
+331546.602320  7391322.142904 
+331564.241007  7391298.396971 
+331618.971240  7391230.768555 
+331663.690549  7391190.525448 
+331671.474991  7391181.546986 
+331706.711134  7391153.281828 
+331723.253073  7391033.212395 
+331796.190983  7390927.970422 
+331796.182737  7390927.970422 
+331839.458955  7390873.599735 
+331877.581279  7390814.959779 
+331878.562581  7390809.360739 
+331879.543882  7390803.001828 
+331883.601028  7390765.178307 
+331883.601028  7390765.138313 
+331888.837384  7390642.429332 
+331872.179998  7390625.002317 
+331824.459062  7390497.804105 
+331824.607494  7390483.056631 
+331847.127950  7390357.198190 
+331728.703831  7390216.982208 
+331712.623682  7390192.006486 
+331686.120296  7390140.935234 
+331683.753628  7390117.869185 
+331690.259904  7390088.884150 
+331696.757934  7390068.057717 
+331725.850636  7390000.039368 
+331798.821531  7389936.790202 
+331619.870079  7389999.569448 
+331573.757157  7390028.264533 
+331581.788986  7390000.029370 
+331590.562976  7389974.213792 
+331596.401307  7389945.818655 
+331600.343005  7389909.554867 
+331608.127447  7389827.828866 
+331608.127447  7389775.287866 
+331601.621171  7389634.431993 
+331591.973081  7389489.226866 
+331578.226614  7389343.421841 
+331578.127660  7389255.396918 
+331576.395951  7389246.048520 
+331565.123354  7389145.125807 
+331560.076661  7389059.460481 
+331547.740300  7388943.680313 
+331545.851913  7388925.883361 
+331541.926707  7388871.402693 
+331540.986637  7388852.895863 
+331538.438552  7388785.307441 
+331532.732160  7388713.909670 
+331520.626693  7388586.401511 
+331521.179191  7388538.669687 
+331517.476633  7388496.326940 
+331513.642136  7388457.623570 
+331510.797186  7388430.008300 
+331498.073253  7388382.796387 
+331463.323637  7388306.159514 
+331455.530949  7388292.701819 
+331443.376005  7388275.174822 
+331405.228942  7388230.022556 
+331323.137716  7388135.448755 
+331245.985982  7388045.284200 
+331219.391888  7388014.299507 
+331175.282800  7387955.529574 
+331101.470790  7387869.504309 
+331026.273412  7387779.479730 
+330950.853387  7387691.874736 
+Region 1
+153
+337781.107277  7391268.692059 
+337798.399623  7391265.962527 
+337819.782099  7391265.722568 
+337833.281178  7391265.822551 
+337862.093508  7391269.311953 
+337869.498623  7391271.001664 
+337886.353919  7391275.130956 
+337913.698420  7391284.479355 
+337933.167770  7391295.177523 
+337948.546990  7391305.165812 
+337968.321451  7391320.183239 
+337985.556073  7391335.990532 
+338007.746680  7391362.915920 
+338038.653553  7391418.696365 
+338082.746148  7391495.333238 
+338162.973726  7391634.719362 
+338198.754121  7391692.359489 
+338219.509883  7391732.442623 
+338230.172259  7391750.289566 
+338242.368434  7391771.745891 
+338248.858218  7391782.853988 
+338255.611881  7391794.961914 
+338265.573327  7391813.228785 
+338268.179136  7391826.566500 
+338272.632101  7391838.464462 
+338280.061955  7391857.291238 
+338284.696336  7391876.407963 
+338288.835944  7391901.013748 
+338289.132808  7391927.169268 
+338289.561612  7391943.666442 
+338286.287859  7391970.381866 
+338283.080075  7392002.116430 
+338318.233756  7392011.954745 
+338393.637289  7392050.198194 
+338450.701205  7392073.724165 
+338487.108314  7392093.220825 
+338586.755765  7392144.961962 
+338636.868109  7392167.808049 
+338611.337778  7392195.423319 
+338590.631493  7392219.939119 
+338588.446242  7392233.416811 
+338591.406639  7392251.953635 
+338608.542306  7392270.010542 
+338625.686220  7392297.625812 
+338645.774038  7392319.961986 
+338647.472761  7392340.268508 
+338651.101103  7392378.112026 
+338650.721776  7392394.879154 
+338648.429324  7392425.653882 
+338642.970319  7392475.225391 
+338640.636636  7392502.430731 
+338638.302953  7392527.856376 
+338630.328848  7392550.272536 
+338614.157989  7392569.429255 
+338596.461578  7392587.576146 
+338571.887811  7392607.052810 
+338549.342616  7392625.749608 
+338527.531336  7392640.367104 
+338509.002056  7392650.145429 
+338454.939768  7392650.485371 
+338366.498944  7392656.654314 
+338266.851493  7392663.903072 
+338213.061331  7392665.772752 
+338185.807538  7392671.281808 
+338172.918680  7392684.829488 
+338059.780395  7392788.461736 
+338033.169809  7392808.448313 
+337956.562326  7392880.925898 
+337952.950477  7392884.175342 
+337924.591690  7392908.251218 
+337872.277603  7392965.751368 
+337794.969191  7393053.906268 
+337870.941714  7393206.140192 
+337913.327339  7393305.983090 
+337963.357220  7393405.266083 
+338013.337624  7393505.148974 
+338032.147277  7393552.460870 
+338055.014074  7393603.382148 
+338068.744048  7393629.967594 
+338096.740001  7393684.928180 
+338118.048261  7393733.839802 
+338133.946994  7393769.363717 
+338145.565933  7393793.629560 
+338164.425062  7393824.564261 
+338173.025881  7393846.050581 
+338195.068055  7393889.113205 
+338228.861109  7393967.659750 
+338244.372268  7393992.205546 
+338255.941730  7394018.121107 
+338291.515969  7394089.498881 
+338299.762200  7394106.375990 
+338341.290217  7394195.380744 
+338375.371889  7394264.068978 
+338333.967564  7394304.512051 
+338279.212593  7394351.314034 
+338217.926607  7394405.674722 
+338169.257353  7394451.756829 
+338115.640362  7394499.328680 
+338061.644044  7394546.900532 
+338025.616262  7394580.524772 
+337995.360842  7394607.700117 
+337958.211573  7394639.784622 
+337904.611073  7394684.296997 
+337848.759353  7394747.916100 
+337815.568275  7394785.729623 
+337759.139318  7394852.738145 
+337698.108965  7394922.766149 
+337663.573752  7394962.509342 
+337605.990323  7395029.127931 
+337506.590259  7395143.058415 
+337475.097904  7395180.921930 
+337376.464739  7395297.102029 
+337327.836717  7395353.772322 
+337262.378138  7395428.069596 
+337206.922237  7395491.548722 
+337132.285603  7395575.474346 
+336984.925462  7395475.271510 
+336808.687020  7395371.189339 
+336685.513073  7395293.952569 
+336572.729377  7395262.567944 
+336276.516526  7395188.630609 
+336216.475720  7395186.211024 
+336182.369310  7395177.112582 
+335857.632747  7395110.094062 
+335656.894755  7395017.779874 
+335587.263583  7395004.422162 
+335344.659478  7394957.800148 
+335168.849840  7394911.948002 
+335228.503073  7394820.743625 
+335289.929245  7394724.460117 
+335280.042014  7394715.811599 
+335500.150403  7394362.392136 
+335608.637813  7394186.182320 
+336313.838965  7392782.352783 
+336383.791740  7392813.077520 
+336673.597270  7392212.990309 
+336820.619316  7391918.950676 
+336900.426336  7391738.321616 
+336999.084240  7391512.680266 
+337127.222418  7391202.363421 
+337197.422579  7391194.214817 
+337243.238637  7391190.465459 
+337454.812176  7391172.668507 
+337651.880596  7391163.470083 
+337661.050405  7391163.620057 
+337663.417073  7391164.229953 
+337670.500585  7391166.049641 
+337755.280083  7391164.089977 
+337722.056019  7391295.257509 
+337734.969616  7391287.748795 
+337757.003545  7391275.820838 
+337767.138162  7391272.401424 
+337781.107277  7391268.692059 
+Region 1
+188
+324062.075998  7390490.355381 
+324117.342236  7390513.591401 
+324227.858219  7390559.063612 
+324334.053177  7390604.775782 
+324379.390953  7390628.291754 
+324440.998542  7390650.747907 
+324472.581606  7390663.375744 
+324555.043912  7390684.282163 
+324604.001784  7390689.501269 
+324674.630749  7390703.828815 
+324730.647394  7390727.324791 
+324759.443231  7390743.262061 
+324826.740720  7390794.393302 
+324856.270472  7390805.751357 
+324934.692125  7390836.296125 
+324976.459283  7390855.002920 
+325023.569999  7390879.608706 
+325052.877103  7390894.176210 
+325078.588850  7390903.014696 
+325162.387046  7390943.447771 
+325182.771728  7390957.115429 
+325256.682693  7391003.107551 
+325320.937322  7391062.417392 
+325437.811149  7391267.512261 
+325452.110113  7391284.489353 
+325473.632775  7391300.336639 
+325530.078224  7391341.749545 
+325622.386530  7391411.807545 
+325673.076110  7391447.831374 
+325707.380429  7391507.831097 
+325768.270596  7391657.715423 
+325833.217909  7391818.697848 
+325857.791676  7391863.610155 
+325910.518075  7391963.663017 
+325976.306503  7391999.996793 
+326040.256022  7392044.599153 
+326071.138155  7392074.154091 
+326121.621579  7392074.324062 
+326211.192137  7392088.081705 
+326277.293922  7392098.559910 
+326316.323331  7392102.299270 
+326424.423169  7392114.857119 
+326651.664547  7391907.422650 
+326759.541736  7391794.821938 
+326860.442614  7391683.840948 
+327092.664715  7391254.324520 
+327328.061615  7390841.665205 
+327345.634333  7390811.380393 
+327372.566522  7390717.226520 
+327377.555492  7390662.395912 
+327395.078732  7390570.111720 
+327403.588842  7390517.900663 
+327406.870842  7390496.824273 
+327404.850515  7390434.334977 
+327394.386049  7390396.111524 
+327376.128894  7390317.035069 
+327326.197967  7390145.214501 
+327270.643111  7389992.270699 
+327244.354128  7389902.246119 
+327212.903004  7389782.366653 
+327186.704730  7389699.290883 
+327144.277873  7389577.651719 
+327122.384131  7389496.095689 
+327107.623378  7389441.205091 
+327007.431675  7389127.458833 
+326938.171584  7388890.539415 
+326844.172801  7388598.099508 
+326817.735386  7388511.764296 
+326765.190404  7388338.873911 
+326728.527663  7388202.547262 
+326705.322769  7388085.307344 
+326682.670374  7387922.005316 
+326633.341422  7387701.123151 
+326617.929217  7387624.406292 
+326584.243365  7387461.304230 
+326538.542755  7387161.385604 
+326512.962947  7387026.518705 
+326481.528316  7387032.777633 
+326401.952190  7387046.335311 
+326390.176573  7387049.974687 
+326310.542723  7387062.332571 
+326235.411316  7387071.391019 
+326155.010567  7387087.268299 
+326117.036675  7387087.368282 
+326041.146614  7387092.547395 
+325963.376413  7387100.136095 
+325835.089803  7387112.014061 
+325757.336094  7387115.973382 
+325703.752088  7387125.411766 
+325629.651459  7387134.710173 
+325534.992977  7387147.537976 
+325409.666764  7387155.786563 
+325319.403523  7387180.682298 
+325286.888636  7387223.424977 
+325252.526593  7387271.306775 
+325210.190445  7387338.915194 
+325195.693571  7387356.132245 
+325181.609009  7387381.217948 
+325173.123638  7387399.614797 
+325165.965910  7387417.691701 
+325155.691106  7387457.444891 
+325144.253584  7387500.617496 
+325108.811285  7387483.740387 
+325082.208945  7387475.031879 
+325064.108469  7387473.022223 
+325042.602299  7387479.691081 
+325033.292305  7387486.429926 
+324986.643378  7387526.703028 
+324898.639605  7387604.879637 
+324813.150931  7387695.954037 
+324783.736627  7387717.190399 
+324767.631738  7387727.578620 
+324742.381780  7387739.126642 
+324708.992792  7387750.804641 
+324678.069427  7387757.873431 
+324644.779394  7387760.163038 
+324616.519562  7387759.333181 
+324583.922212  7387757.043573 
+324557.542520  7387746.535373 
+324516.740171  7387725.878911 
+324455.041873  7387687.525481 
+324410.850323  7387676.807317 
+324362.684090  7387672.218103 
+324319.729474  7387674.917640 
+324226.992365  7387682.176397 
+324142.649918  7387689.815088 
+323934.168714  7387709.631694 
+323727.130602  7387729.138353 
+323789.076286  7387832.960569 
+323851.747639  7387938.522487 
+323889.441159  7388000.001956 
+323911.887399  7388042.034756 
+323924.570102  7388067.140456 
+323946.406121  7388106.273753 
+323967.640165  7388153.025745 
+323975.070018  7388183.310557 
+323979.580707  7388206.286622 
+323984.577922  7388256.897952 
+323989.204058  7388297.161056 
+323999.957142  7388360.750163 
+324000.781766  7388368.738795 
+324002.620675  7388431.478048 
+324007.741584  7388477.370187 
+324009.481539  7388510.394531 
+324009.110458  7388541.409218 
+324004.137981  7388572.803840 
+324002.299072  7388589.840922 
+323999.998374  7388600.319127 
+323992.906615  7388612.277079 
+323989.979203  7388620.055747 
+323987.126008  7388654.889780 
+323986.763173  7388677.915836 
+323988.808239  7388705.261152 
+324010.891644  7388749.303608 
+324026.081201  7388763.101244 
+324034.360417  7388773.669434 
+324099.217021  7388830.589684 
+324228.369485  7388940.110924 
+324317.453515  7389019.857264 
+324419.129539  7389110.401755 
+324497.691378  7389175.600587 
+324544.043441  7389206.235339 
+324506.333428  7389206.895226 
+324496.660599  7389224.092281 
+324498.103690  7389238.299847 
+324502.630870  7389253.997158 
+324522.792904  7389258.336415 
+324489.370931  7389478.298737 
+324470.833405  7389604.827064 
+324468.268827  7389624.423708 
+324458.191933  7389653.008811 
+324440.907834  7389675.584944 
+324430.377397  7389688.912661 
+324419.343941  7389702.010418 
+324405.778891  7389717.417778 
+324388.478299  7389754.021509 
+324383.489330  7389767.489202 
+324366.510341  7389831.678207 
+324359.723693  7389871.741344 
+324326.977911  7389999.999375 
+324327.299514  7390003.518772 
+324321.518907  7390025.105074 
+324313.487078  7390058.119419 
+324307.203450  7390079.445766 
+324291.791245  7390110.190500 
+324257.124091  7390165.591010 
+324170.340760  7390305.107113 
+324062.075998  7390490.355381 
+Region 1
+65
+336038.802435  7397323.244969 
+336046.026133  7397286.361287 
+336088.180864  7397241.199023 
+336000.003920  7397141.376122 
+335983.371272  7397124.139074 
+335961.964058  7397100.653097 
+335895.689102  7397028.375478 
+335841.511366  7396969.895495 
+335788.347918  7396911.155556 
+335708.483174  7396822.300776 
+335608.951170  7396714.019324 
+335504.867247  7396602.918355 
+335403.067529  7396491.327469 
+335317.249007  7396569.614059 
+335272.397758  7396520.072545 
+335176.411634  7396413.840742 
+335107.877211  7396336.993905 
+335045.651154  7396268.285674 
+334979.969927  7396274.794559 
+334874.756270  7396281.063485 
+334756.373383  7396289.032120 
+334605.500347  7396302.929740 
+334507.873223  7396312.538094 
+334411.252138  7396323.436227 
+334306.178667  7396351.301454 
+334205.417975  7396378.426808 
+334184.876614  7396381.876217 
+334113.934292  7396408.831600 
+334118.865538  7396494.736885 
+334104.838700  7396536.829675 
+334057.480597  7396642.061650 
+334029.426921  7396691.163239 
+334056.185939  7396718.558546 
+334073.725672  7396874.941759 
+334074.154476  7396897.007980 
+334077.147857  7397051.241561 
+334079.011505  7397178.539756 
+334080.767953  7397276.622955 
+334080.743214  7397329.973817 
+334082.491415  7397382.074892 
+334084.058199  7397468.200140 
+334085.303379  7397567.043209 
+334088.750304  7397633.881760 
+334091.413836  7397801.832991 
+334095.207102  7397991.890436 
+334098.390147  7398060.788635 
+334304.290280  7398055.099609 
+334441.524051  7398082.554906 
+334606.209523  7398132.456359 
+334733.465354  7398142.434649 
+334783.082924  7398135.865775 
+334848.244639  7398117.488922 
+334992.965987  7398055.099609 
+335127.709395  7397964.025209 
+335354.777603  7397761.919828 
+335499.498950  7397689.552224 
+335611.779627  7397659.617352 
+335763.988552  7397654.628206 
+335901.040906  7397676.464466 
+335944.655219  7397680.753731 
+335969.196002  7397597.128055 
+335989.118895  7397520.771135 
+336000.003920  7397482.547682 
+336009.132497  7397449.823287 
+336038.802435  7397323.244969 
+Region 1
+763
+348625.263412  7390704.878635 
+348657.308264  7390703.318903 
+348670.098168  7390690.301132 
+348686.433951  7390682.262509 
+348708.443140  7390667.345065 
+348721.703079  7390653.607418 
+348756.188816  7390604.435840 
+348788.629487  7390555.384242 
+348828.598967  7390503.513127 
+348834.123942  7390491.945109 
+348840.358092  7390481.266938 
+348852.216172  7390467.849236 
+348858.639985  7390460.410511 
+348875.470542  7390441.533744 
+348889.505627  7390427.176203 
+348896.094365  7390421.707140 
+348902.452209  7390418.667661 
+348912.792982  7390415.118269 
+348928.765931  7390410.079132 
+348949.727849  7390406.639721 
+348964.744235  7390405.359940 
+348995.436705  7390408.219450 
+349006.931951  7390411.668860 
+349014.460760  7390414.508373 
+349022.072030  7390418.357714 
+349029.609085  7390420.207397 
+349033.789924  7390420.247390 
+349040.634296  7390419.877453 
+349048.212582  7390417.407876 
+349054.595164  7390412.378738 
+349065.925485  7390402.420444 
+349081.098549  7390386.073244 
+349085.122710  7390381.683996 
+349088.709820  7390380.284235 
+349091.257906  7390380.314230 
+349094.003900  7390381.444037 
+349097.055006  7390382.473860 
+349101.532709  7390383.963605 
+349104.072548  7390385.093412 
+349106.694849  7390387.662972 
+349113.671161  7390394.271839 
+349117.109839  7390397.081358 
+349120.367100  7390398.551106 
+349125.570471  7390398.161173 
+349132.629245  7390397.241331 
+349142.953526  7390395.571617 
+349154.729143  7390391.932240 
+349162.703248  7390390.572473 
+349170.454705  7390390.872422 
+349182.890021  7390392.442153 
+349190.657970  7390391.852254 
+349193.939970  7390390.012569 
+349196.009774  7390387.263040 
+349196.760181  7390383.503684 
+349197.848683  7390377.204763 
+349197.230216  7390367.896357 
+349195.432537  7390354.358676 
+349197.551819  7390336.661708 
+349200.380276  7390329.382954 
+349205.855773  7390323.134025 
+349212.230109  7390318.544811 
+349221.457641  7390314.765458 
+349234.165083  7390310.136251 
+349256.776247  7390304.607198 
+349273.458372  7390300.347928 
+349285.613316  7390298.818190 
+349294.799617  7390299.348099 
+349302.336671  7390300.427914 
+349310.690103  7390302.067633 
+349317.320073  7390302.907489 
+349322.424489  7390302.187613 
+349328.370022  7390299.918001 
+349335.915323  7390290.699580 
+349344.326478  7390276.831956 
+349350.535890  7390268.693350 
+349353.512779  7390266.623704 
+349359.862376  7390265.023978 
+349365.073994  7390263.974158 
+349369.799084  7390260.924681 
+349373.460411  7390252.656097 
+349378.886431  7390241.188061 
+349383.463089  7390232.599532 
+349390.348691  7390227.800355 
+349398.339289  7390225.330778 
+349406.082499  7390226.410593 
+349414.741041  7390228.270274 
+349426.863000  7390230.499892 
+349438.894251  7390231.839663 
+349448.666034  7390234.269246 
+349451.477999  7390238.508520 
+349452.558255  7390242.727798 
+349452.112959  7390246.377173 
+349450.851285  7390250.346493 
+349449.185547  7390253.106020 
+349443.949190  7390256.365462 
+349431.233503  7390262.104479 
+349425.164277  7390266.253768 
+349422.451267  7390272.432709 
+349421.684368  7390277.851781 
+349423.729433  7390287.390147 
+349428.339076  7390295.638734 
+349435.092739  7390303.567376 
+349441.384613  7390307.176758 
+349447.181713  7390308.896464 
+349452.591240  7390308.956453 
+349460.878702  7390307.376724 
+349474.913786  7390302.207609 
+349486.112168  7390294.568918 
+349499.578262  7390285.400488 
+349509.457247  7390277.751798 
+349514.940990  7390270.393059 
+349518.297206  7390262.004496 
+349519.789774  7390255.495611 
+349518.445638  7390247.396998 
+349515.963523  7390240.278217 
+349511.757945  7390232.819495 
+349507.873970  7390223.031171 
+349506.628790  7390215.712425 
+349506.735991  7390204.964266 
+349508.459453  7390196.345742 
+349510.372578  7390188.947010 
+349510.636458  7390182.858053 
+349509.968513  7390178.868736 
+349506.735991  7390175.179368 
+349502.579890  7390172.809774 
+349495.380931  7390168.300546 
+349485.543178  7390161.891644 
+349482.327148  7390157.202447 
+349482.360133  7390153.443091 
+349483.316695  7390149.903698 
+349486.227615  7390145.284489 
+349490.639348  7390142.564955 
+349495.859212  7390141.505136 
+349500.749227  7390142.444975 
+349504.996036  7390146.474285 
+349510.553995  7390151.623403 
+349515.386286  7390158.212274 
+349518.923919  7390161.571699 
+349522.585246  7390162.491541 
+349525.240532  7390162.521536 
+349529.437864  7390161.121776 
+349534.665974  7390158.852165 
+349551.125450  7390146.174336 
+349562.529987  7390139.095549 
+349568.896077  7390135.726126 
+349571.056590  7390133.316539 
+349571.089574  7390130.766975 
+349568.962047  7390128.857303 
+349565.407922  7390126.827650 
+349560.542646  7390123.898152 
+349555.693862  7390119.418919 
+349550.375043  7390110.510445 
+349549.731837  7390103.301680 
+349550.713139  7390097.442684 
+349553.607566  7390093.483362 
+349556.691656  7390091.193754 
+349563.049500  7390088.714179 
+349571.732780  7390088.134278 
+349582.032323  7390088.684184 
+349597.188894  7390093.493360 
+349616.204702  7390100.442170 
+349624.854998  7390103.191699 
+349637.282068  7390105.091373 
+349648.496942  7390106.201183 
+349659.299504  7390107.640937 
+349670.497885  7390110.860385 
+349681.267462  7390115.619570 
+349695.863290  7390125.517875 
+349701.924270  7390131.666821 
+349703.309637  7390135.676135 
+349706.303018  7390142.674936 
+349709.106737  7390147.364133 
+349712.347505  7390150.493596 
+349719.760867  7390153.343108 
+349738.075745  7390158.842166 
+349753.042654  7390162.541533 
+349758.856246  7390163.481372 
+349766.805613  7390164.561187 
+349776.198069  7390164.221245 
+349785.598772  7390163.101437 
+349797.168234  7390159.672024 
+349825.147694  7390148.333966 
+349834.870000  7390145.884386 
+349841.392769  7390146.614261 
+349848.402065  7390149.783718 
+349851.816004  7390154.922838 
+349853.869316  7390163.581355 
+349854.339351  7390167.790634 
+349855.955612  7390169.690308 
+349861.571295  7390169.190394 
+349867.714737  7390167.710647 
+349877.321596  7390166.360879 
+349896.650760  7390162.351565 
+349910.702337  7390155.962660 
+349924.465296  7390147.244153 
+349952.411772  7390139.335508 
+349984.613303  7390133.686475 
+350008.634573  7390130.836963 
+350036.292430  7390130.457029 
+350065.170730  7390131.196902 
+350075.503257  7390129.197244 
+350084.928699  7390125.637854 
+350091.682361  7390123.608202 
+350099.483296  7390119.698871 
+350106.863672  7390116.449428 
+350125.368214  7390112.990021 
+350136.426409  7390110.000533 
+350142.380187  7390106.071206 
+350151.846860  7390098.752459 
+350162.657669  7390089.564033 
+350171.909939  7390082.895175 
+350182.052803  7390079.455765 
+350193.061521  7390081.015497 
+350202.198345  7390085.534723 
+350208.861299  7390092.363554 
+350216.332384  7390101.072062 
+350220.455499  7390106.651106 
+350225.815549  7390111.140337 
+350235.875951  7390115.669562 
+350244.534493  7390117.419262 
+350252.698261  7390117.499248 
+350260.268301  7390115.479594 
+350268.976320  7390112.580091 
+350279.853099  7390107.041040 
+350289.509435  7390100.822105 
+350306.241037  7390091.473706 
+350325.669156  7390077.946023 
+350332.975316  7390071.927054 
+350337.535482  7390065.218203 
+350338.541522  7390057.029606 
+350340.083567  7390045.861519 
+350341.807029  7390037.242995 
+350343.299597  7390031.164037 
+350344.017019  7390020.765818 
+350345.550818  7390010.037655 
+350347.043386  7390003.958697 
+350352.568360  7389993.270527 
+350358.027365  7389987.791466 
+350364.607857  7389983.212250 
+350367.502284  7389979.912815 
+350368.467093  7389975.493572 
+350367.988812  7389971.724218 
+350364.137822  7389959.396330 
+350359.247807  7389938.299943 
+350356.444089  7389913.354216 
+350354.596933  7389884.659132 
+350355.281370  7389867.832014 
+350357.441883  7389855.784078 
+350360.196124  7389846.175723 
+350365.185093  7389836.927308 
+350370.470927  7389829.118645 
+350377.241083  7389826.079166 
+350390.938072  7389824.339464 
+350406.127628  7389825.489267 
+350421.102783  7389828.858690 
+350430.651918  7389832.498066 
+350436.729390  7389836.987297 
+350443.887119  7389845.705804 
+350446.913485  7389849.715117 
+350448.109189  7389852.274679 
+350451.358204  7389853.644444 
+350458.590148  7389855.594110 
+350469.384464  7389857.373805 
+350477.325584  7389859.553432 
+350486.149051  7389865.182468 
+350496.893889  7389872.601197 
+350503.655798  7389879.649990 
+350510.805280  7389889.468308 
+350515.225260  7389895.827219 
+350519.158712  7389900.516415 
+350521.492395  7389901.976165 
+350524.559993  7389901.786198 
+350525.483571  7389901.136309 
+350527.635837  7389899.936515 
+350532.781485  7389896.227150 
+350536.780907  7389893.717580 
+350539.658841  7389892.087859 
+350542.215173  7389891.887893 
+350547.113434  7389891.937885 
+350553.025981  7389892.007873 
+350555.788469  7389891.367982 
+350557.239805  7389889.498303 
+350557.792303  7389885.738947 
+350557.833534  7389881.089743 
+350557.874765  7389877.100426 
+350558.839574  7389873.011127 
+350560.694976  7389871.371408 
+350563.762574  7389870.411572 
+350568.446433  7389871.891319 
+350577.096728  7389874.310904 
+350584.592552  7389879.809962 
+350589.936110  7389886.068890 
+350594.809632  7389888.778426 
+350599.674908  7389891.597943 
+350606.296631  7389892.767743 
+350613.330666  7389893.837559 
+350619.333922  7389895.787225 
+350625.436133  7389897.396950 
+350632.247519  7389900.566407 
+350646.241372  7389908.794997 
+350657.604678  7389915.773802 
+350672.332446  7389922.902581 
+350679.135587  7389925.962057 
+350691.537917  7389931.181163 
+350701.804475  7389934.830538 
+350716.062207  7389937.750038 
+350729.157222  7389944.858820 
+350736.158271  7389949.138087 
+350742.219251  7389954.847109 
+350746.185688  7389956.766780 
+350754.794753  7389962.945722 
+350760.369205  7389966.665085 
+350769.423566  7389969.524595 
+350778.395465  7389970.384448 
+350785.858304  7389969.464605 
+350797.617428  7389967.045020 
+350813.202804  7389960.446150 
+350836.811763  7389947.178423 
+350844.109677  7389941.939320 
+350851.217928  7389935.690390 
+350855.951264  7389931.311140 
+350859.991917  7389925.932062 
+350860.931987  7389923.832422 
+350861.253590  7389922.282687 
+350859.645575  7389919.613144 
+350855.695631  7389916.803625 
+350848.364732  7389914.843961 
+350825.217562  7389913.284228 
+350809.203383  7389911.894466 
+350797.287579  7389909.454884 
+350791.696635  7389907.285256 
+350789.923695  7389900.956340 
+350791.102906  7389895.657248 
+350792.991293  7389890.248174 
+350797.139147  7389883.759286 
+350800.190252  7389875.480704 
+350801.715805  7389865.422427 
+350802.350765  7389853.794418 
+350803.340313  7389846.275706 
+350805.039036  7389840.316727 
+350808.337528  7389836.807328 
+350812.633814  7389835.627530 
+350818.051588  7389835.247595 
+350826.908040  7389836.997296 
+350833.199914  7389841.046602 
+350841.833717  7389844.565999 
+350849.379018  7389845.635816 
+350855.192611  7389845.695806 
+350862.259630  7389843.226229 
+350871.899474  7389838.896970 
+350880.945589  7389832.448075 
+350888.062086  7389824.999351 
+350892.836654  7389817.840577 
+350894.222020  7389811.991579 
+350894.065342  7389807.112415 
+350891.335840  7389795.014487 
+350889.035141  7389789.785383 
+350889.101111  7389783.256501 
+350890.585433  7389777.957409 
+350891.550242  7389773.538166 
+350894.642578  7389770.468691 
+350898.229689  7389769.168914 
+350905.379171  7389768.908958 
+350917.517622  7389769.038936 
+350926.002993  7389767.909130 
+350931.429013  7389766.519368 
+350936.558169  7389764.029794 
+350939.155731  7389759.400587 
+350939.724721  7389753.091668 
+350936.995219  7389740.773778 
+350936.657123  7389734.014936 
+350934.579073  7389727.456059 
+350932.764903  7389725.116460 
+350929.004621  7389724.076638 
+350925.236094  7389723.376758 
+350919.834813  7389722.546900 
+350916.800200  7389719.747379 
+350915.051999  7389711.088863 
+350916.396135  7389699.260889 
+350918.111351  7389690.852329 
+350922.927149  7389679.274312 
+350926.992541  7389670.685783 
+350930.291033  7389667.616309 
+350933.779189  7389665.876607 
+350945.546560  7389662.677155 
+350951.178736  7389661.067431 
+350957.149007  7389656.038292 
+350963.267710  7389646.799875 
+350969.336935  7389632.132387 
+350973.633222  7389621.214257 
+350975.348438  7389612.595734 
+350975.719518  7389606.286814 
+350973.163186  7389596.958412 
+350970.689317  7389589.069763 
+350971.703604  7389579.881337 
+350971.761327  7389574.122324 
+350974.482583  7389568.063362 
+350979.850880  7389561.584471 
+350981.821729  7389559.054905 
+350984.427538  7389553.435867 
+350989.705125  7389546.067129 
+350996.780391  7389542.597724 
+351004.243230  7389541.567900 
+351014.757174  7389541.447921 
+351025.584475  7389540.568071 
+351034.482158  7389538.778378 
+351046.554639  7389535.688907 
+351065.809588  7389528.910068 
+351075.416446  7389528.010222 
+351082.623652  7389532.069527 
+351087.563144  7389537.768551 
+351090.581265  7389542.007825 
+351098.200782  7389545.517223 
+351106.133656  7389547.916812 
+351112.738886  7389551.316230 
+351118.519494  7389555.025595 
+351122.964212  7389559.274867 
+351124.547489  7389564.274011 
+351125.001031  7389569.373137 
+351122.725072  7389582.200940 
+351121.702539  7389586.310236 
+351119.756429  7389593.578991 
+351118.783373  7389599.108044 
+351118.907067  7389606.416792 
+351121.479891  7389614.525403 
+351125.767931  7389624.203745 
+351133.041106  7389632.142385 
+351140.198834  7389640.191007 
+351156.188276  7389653.858666 
+351174.395953  7389670.105883 
+351193.890042  7389689.462567 
+351208.024082  7389704.559981 
+351219.626528  7389717.737724 
+351248.999602  7389750.492113 
+351262.919239  7389766.249414 
+351273.837248  7389776.767612 
+351292.234589  7389793.784698 
+351310.326819  7389811.691630 
+351317.459808  7389822.729739 
+351332.088622  7389838.936963 
+351348.069817  7389853.604451 
+351358.798163  7389862.572915 
+351367.176333  7389871.071459 
+351380.395041  7389886.158875 
+351386.357065  7389891.977878 
+351395.287733  7389896.717066 
+351401.563115  7389902.546068 
+351407.846743  7389906.485393 
+351413.198546  7389912.294398 
+351418.063822  7389915.673819 
+351427.225385  7389918.083406 
+351440.773942  7389920.113059 
+351456.870584  7389923.042557 
+351467.161880  7389925.032216 
+351473.791849  7389925.092206 
+351481.559798  7389923.732439 
+351491.389305  7389921.062896 
+351511.642048  7389916.623656 
+351521.257153  7389914.614001 
+351529.008609  7389914.913949 
+351534.294443  7389916.853617 
+351542.515935  7389921.802769 
+351565.242547  7389944.848822 
+351572.928034  7389952.237556 
+351584.522234  7389965.865222 
+351598.491349  7389977.413244 
+351611.470916  7389985.961779 
+351617.053614  7389988.571332 
+351622.446649  7389990.281039 
+351627.138754  7389990.331031 
+351634.708794  7389988.751301 
+351651.382672  7389984.931956 
+351665.698129  7389982.532367 
+351679.263178  7389983.332230 
+351687.212544  7389984.412045 
+351693.314755  7389986.571675 
+351700.835317  7389989.861111 
+351705.906749  7389992.790610 
+351709.650538  7389995.600128 
+351713.113955  7389996.519971 
+351718.836839  7389996.140036 
+351723.941256  7389995.750103 
+351726.299678  7389994.330346 
+351728.880748  7389992.030740 
+351732.500843  7389986.971606 
+351738.916411  7389978.403074 
+351745.472164  7389975.693538 
+351753.454515  7389973.893846 
+351759.383555  7389973.183968 
+351764.487972  7389973.233959 
+351773.130022  7389975.753528 
+351778.729212  7389977.583214 
+351785.705523  7389984.192082 
+351792.978699  7389991.570819 
+351799.641653  7389998.399649 
+351805.727371  7390002.668918 
+351815.779526  7390007.418104 
+351827.843762  7390015.626698 
+351837.656776  7390023.695316 
+351842.010786  7390027.504663 
+351850.248771  7390030.364174 
+351862.156328  7390034.023547 
+351869.874799  7390037.532946 
+351885.006633  7390045.221629 
+351895.075280  7390048.531062 
+351902.505134  7390050.710688 
+351910.965767  7390051.690521 
+351925.751258  7390053.050288 
+351928.794117  7390054.520036 
+351930.806198  7390057.539519 
+351933.403760  7390062.658642 
+351936.817700  7390068.777594 
+351940.330594  7390074.136676 
+351944.461956  7390079.825701 
+351948.914920  7390083.185126 
+351953.293669  7390084.344927 
+351959.404126  7390085.844670 
+351966.438160  7390086.574545 
+351973.892753  7390086.434569 
+351983.087300  7390085.084800 
+351991.580918  7390083.065146 
+352001.600088  7390081.615395 
+352010.052474  7390083.035152 
+352014.925997  7390085.854669 
+352019.585117  7390089.444054 
+352025.637850  7390096.042923 
+352028.878619  7390098.622482 
+352033.150166  7390099.882266 
+352039.672935  7390101.052065 
+352050.871316  7390103.711610 
+352064.716737  7390107.400978 
+352076.649033  7390108.180844 
+352086.429062  7390109.940543 
+352094.658801  7390113.349959 
+352100.447655  7390116.399437 
+352104.686217  7390121.088633 
+352106.467403  7390126.977625 
+352109.980297  7390132.326708 
+352114.350799  7390134.476340 
+352119.760327  7390134.316368 
+352126.093432  7390133.936433 
+352132.640939  7390132.336707 
+352144.202154  7390129.907123 
+352164.141540  7390126.127770 
+352179.834117  7390128.167421 
+352188.105086  7390128.247407 
+352195.155614  7390126.877642 
+352198.858171  7390124.148109 
+352200.334246  7390119.508904 
+352196.705905  7390105.191356 
+352195.452478  7390097.982591 
+352196.846091  7390091.233747 
+352199.039588  7390085.944653 
+352201.224839  7390082.205294 
+352204.721241  7390079.245801 
+352211.309979  7390073.446794 
+352213.280829  7390070.477303 
+352214.765150  7390065.058231 
+352216.909170  7390055.119933 
+352218.583155  7390051.150613 
+352220.949823  7390048.841009 
+352225.254355  7390047.451247 
+352230.152616  7390047.051315 
+352236.477475  7390047.781190 
+352254.025454  7390047.961159 
+352267.722443  7390045.991497 
+352277.774598  7390041.442276 
+352285.789935  7390035.663266 
+352291.529311  7390033.613617 
+352298.052080  7390034.233511 
+352305.778798  7390037.083023 
+352314.396109  7390043.481927 
+352319.945822  7390049.290932 
+352326.946872  7390053.350236 
+352335.811570  7390055.099937 
+352351.726795  7390055.479871 
+352370.693125  7390057.339553 
+352401.880370  7390061.418854 
+352449.708507  7390065.558145 
+352473.729777  7390071.887061 
+352498.031419  7390080.775539 
+352521.599146  7390092.193583 
+352537.003105  7390102.651791 
+352547.954099  7390109.960539 
+352558.418566  7390114.489764 
+352576.725198  7390120.548726 
+352589.317192  7390127.207585 
+352600.499081  7390131.416864 
+352608.951467  7390133.606489 
+352615.680392  7390134.006421 
+352622.524763  7390133.746465 
+352627.950783  7390132.026760 
+352640.699455  7390122.748349 
+352649.333259  7390150.433607 
+352672.983448  7390192.076474 
+352690.968477  7390237.858632 
+352715.063963  7390294.368952 
+352739.703701  7390341.310911 
+352796.553215  7390445.123129 
+352829.348474  7390538.947058 
+352803.669712  7390674.973758 
+352766.042161  7390831.606928 
+352768.070734  7390878.388915 
+352790.451004  7390917.042294 
+352816.896666  7390944.497591 
+352849.436292  7390975.012364 
+352886.808209  7391057.138296 
+352880.046300  7391191.995197 
+352887.583355  7391221.150203 
+352831.888313  7391411.077670 
+352804.692244  7391547.624281 
+352775.203724  7391649.326860 
+352760.945991  7391709.336581 
+352739.596500  7391762.227521 
+352531.948166  7392153.540493 
+352478.718747  7392281.288611 
+352447.473779  7392356.295763 
+352318.626425  7392632.968371 
+352303.849180  7392698.447155 
+352312.301566  7392749.128474 
+352350.316689  7392831.504364 
+352377.768391  7392941.325552 
+352409.450409  7393192.652502 
+352420.013831  7393427.092345 
+352439.021392  7393564.368831 
+352449.576568  7393627.727978 
+352455.917919  7393701.655315 
+352413.301399  7393899.621405 
+352417.902796  7393927.646604 
+352420.450881  7394021.210578 
+352421.242519  7394091.828482 
+352416.072133  7394130.981775 
+352299.585878  7394135.081073 
+352140.516089  7394138.940412 
+352091.789112  7394141.210023 
+352001.971168  7394143.659603 
+351880.537176  7394148.018857 
+351823.473260  7394182.432962 
+351779.487865  7394209.928252 
+351686.066318  7394266.578548 
+351588.579380  7394327.158172 
+351493.285938  7394386.538000 
+351395.361949  7394445.477905 
+351302.377453  7394503.767920 
+351203.266006  7394563.817634 
+351105.721344  7394622.767536 
+351014.262400  7394681.097545 
+350994.388984  7394651.342642 
+350913.823311  7394699.274432 
+350898.427598  7394706.903125 
+350801.254016  7394766.242960 
+350770.009048  7394785.279700 
+350759.437381  7394781.610328 
+350748.156537  7394776.021285 
+350722.090202  7394768.172630 
+350700.163475  7394762.333630 
+350684.701792  7394756.644605 
+350674.938255  7394750.695624 
+350664.143939  7394740.557360 
+350681.724903  7394698.404581 
+350685.006903  7394668.829646 
+350658.717919  7394635.965276 
+350639.001182  7394603.100905 
+350619.276198  7394576.805409 
+350606.131707  7394537.372164 
+350599.559461  7394497.928920 
+350563.407986  7394455.206238 
+350523.974511  7394405.914681 
+350530.546756  7394373.050311 
+350530.546756  7394343.465378 
+350491.105035  7394261.309451 
+350454.953560  7394221.866207 
+350405.657593  7394185.712400 
+350392.513102  7394156.137466 
+350379.368610  7394083.839850 
+350369.506118  7394021.390547 
+350362.933872  7393945.803494 
+350323.450920  7393954.512003 
+350252.953894  7393966.969869 
+350144.087157  7393988.036260 
+350129.936625  7393973.598733 
+350092.102919  7393925.996887 
+350035.847134  7393861.028016 
+350035.847134  7393861.008019 
+349930.361351  7393725.271269 
+349904.418710  7393709.853910 
+349788.526184  7393646.024844 
+349712.100119  7393622.288909 
+349676.558864  7393610.480932 
+349640.902163  7393620.389235 
+349543.522425  7393629.737633 
+349544.223355  7393530.244676 
+349547.332184  7393429.751889 
+349548.231023  7393407.275739 
+349547.678526  7393351.705258 
+349545.996295  7393279.367649 
+349545.971556  7393238.614629 
+349548.198038  7393063.314657 
+349535.507089  7392970.090625 
+349521.241110  7392867.098267 
+349518.066311  7392851.250981 
+349498.267112  7392805.298852 
+349477.668027  7392775.983874 
+349461.818772  7392763.306045 
+349441.219688  7392751.418082 
+349407.146263  7392735.580794 
+349382.597234  7392728.442017 
+349303.367450  7392714.184459 
+349165.218348  7392675.981003 
+349103.709714  7392666.642603 
+349051.412119  7392638.127487 
+349016.044036  7392602.833533 
+348878.686572  7392666.642603 
+348786.790578  7392714.184459 
+348741.188922  7392623.859931 
+348657.646360  7392517.698116 
+348558.609129  7392370.333358 
+348521.377398  7392314.862860 
+348510.286218  7392281.578561 
+348496.811877  7392234.846566 
+348491.460073  7392164.818561 
+348486.512335  7392070.054793 
+348482.851008  7391973.241376 
+348481.341948  7391946.995872 
+348479.676210  7391929.138931 
+348470.011627  7391910.752080 
+348456.496055  7391891.315409 
+348442.353770  7391876.098016 
+348425.556198  7391862.090415 
+348393.560823  7391835.564959 
+348361.153137  7391808.279633 
+348345.501791  7391794.252036 
+348313.976451  7391757.798280 
+348295.826497  7391722.884260 
+348285.477478  7391693.839235 
+348271.673288  7391650.796608 
+348270.848665  7391608.923781 
+348263.987801  7391582.058382 
+348257.423801  7391565.481222 
+348246.027511  7391540.275539 
+348235.472335  7391517.339468 
+348221.956763  7391496.293073 
+348210.271854  7391478.096190 
+348196.781021  7391457.089788 
+348152.449285  7391439.292837 
+348127.421975  7391430.094412 
+348103.821263  7391417.796519 
+348086.751566  7391407.228329 
+348068.469672  7391394.030590 
+348043.970121  7391376.063667 
+348002.318410  7391343.469251 
+347914.586762  7391276.450730 
+347907.783622  7391271.701544 
+347898.283964  7391254.294525 
+348044.835975  7390954.235923 
+348142.891904  7390829.807236 
+348203.163604  7390771.377245 
+348238.036913  7390750.780773 
+348260.186289  7390741.292398 
+348320.309556  7390714.397005 
+348368.566498  7390704.898632 
+348441.347730  7390696.989987 
+348625.263412  7390704.878635 
+Region 1
+371
+346663.650065  7397002.509908 
+346583.043161  7397058.800266 
+346487.411624  7397125.588826 
+346441.018330  7397158.073262 
+346369.696682  7397206.344993 
+346323.369358  7397234.600153 
+346297.352500  7397248.917701 
+346272.976642  7397262.855313 
+346245.566172  7397276.782928 
+346217.042460  7397288.410936 
+346173.287960  7397304.518177 
+346145.143575  7397312.726771 
+346113.972823  7397317.875889 
+346090.619498  7397324.224801 
+346064.569655  7397326.884346 
+346034.149310  7397329.993813 
+346008.701443  7397329.653871 
+345985.158454  7397329.333926 
+345965.788058  7397327.324270 
+345941.873989  7397324.144815 
+345903.916590  7397316.696091 
+345889.873259  7397315.856235 
+345752.128222  7397293.090134 
+345663.629675  7397279.592446 
+345579.773755  7397272.023743 
+345466.074727  7397268.564335 
+345370.385467  7397240.309175 
+345309.091234  7397184.348761 
+345281.631286  7397156.473536 
+345130.815974  7397068.498605 
+345013.999871  7397017.267380 
+344861.749714  7396923.823386 
+344839.377691  7396909.745798 
+344760.865329  7396880.800756 
+344574.838611  7396839.177885 
+344332.424169  7396819.001341 
+344237.699718  7396816.201821 
+344099.501138  7396799.834625 
+344081.079059  7396798.284890 
+344064.190779  7396796.955118 
+344042.552669  7396793.795659 
+344009.518269  7396790.946147 
+343977.555879  7396790.336252 
+343879.203087  7396797.055101 
+343791.397223  7396820.211134 
+343715.721564  7396839.557820 
+343674.910969  7396845.776755 
+343602.377124  7396858.284613 
+343575.296502  7396859.494405 
+343550.895906  7396861.134125 
+343524.986249  7396859.324435 
+343504.040823  7396857.194799 
+343477.413745  7396851.565764 
+343369.849912  7396814.232158 
+343335.207497  7396803.933922 
+343279.974244  7396792.585866 
+343205.758168  7396771.759434 
+343095.093753  7396735.055721 
+342987.562905  7396704.640930 
+342948.500511  7396691.743140 
+342822.902172  7396659.348689 
+342649.475695  7396620.115409 
+342571.590047  7396602.818372 
+342332.168986  7396537.609541 
+342174.129976  7396493.967017 
+342122.162230  7396481.249195 
+341969.887335  7396445.495320 
+341950.648879  7396506.364893 
+341935.451076  7396546.158077 
+341913.845952  7396575.233097 
+341880.448717  7396603.788206 
+341816.111626  7396642.631552 
+341808.723003  7396660.198543 
+341816.078641  7396642.671545 
+341744.963148  7396668.397139 
+341652.646596  7396708.240314 
+341530.759061  7396799.784633 
+341419.987444  7397005.619376 
+341385.831557  7397053.271213 
+341238.537385  7397260.875652 
+341261.156796  7397259.645863 
+341238.529139  7397260.905647 
+341194.543745  7397338.842297 
+341167.817711  7397387.274002 
+341150.418164  7397416.389014 
+341128.153342  7397444.334228 
+341071.460506  7397510.272933 
+341056.460613  7397528.399828 
+341034.426684  7397563.933741 
+340958.503639  7397685.492919 
+340931.777605  7397728.135615 
+340976.158818  7397756.260797 
+341015.427369  7397786.855557 
+341050.976869  7397821.989539 
+341089.420796  7397865.392104 
+341113.804900  7397899.696228 
+341167.957897  7398039.822226 
+341184.079278  7398108.030542 
+341189.859886  7398155.562401 
+341192.168830  7398186.007186 
+341187.608665  7398241.597664 
+341182.009474  7398277.091584 
+341165.475782  7398349.009265 
+341125.662980  7398510.671574 
+341114.217212  7398564.362377 
+341107.191423  7398796.252656 
+341111.322785  7398835.935859 
+341124.970297  7398907.033680 
+341134.478201  7398975.241997 
+341148.942089  7399050.469111 
+341168.370209  7399113.708279 
+341182.834097  7399155.461127 
+341191.929690  7399184.806101 
+341210.533186  7399215.810790 
+341226.654567  7399241.846330 
+341258.064459  7399288.558329 
+341277.904890  7399313.774010 
+341295.271452  7399335.680257 
+341302.709552  7399361.305868 
+341301.884929  7399377.843035 
+341298.990502  7399391.890629 
+341297.333010  7399405.538291 
+341304.779356  7399417.106310 
+341328.751148  7399439.012557 
+341364.300649  7399460.098945 
+341392.816114  7399481.595263 
+341425.471188  7399513.009882 
+341459.783753  7399547.314006 
+341482.106300  7399575.009262 
+341500.289238  7399606.833811 
+341508.972519  7399638.668358 
+341511.866946  7399665.533756 
+341515.173685  7399687.030074 
+341522.611785  7399703.557243 
+341533.356623  7399715.135260 
+341550.310873  7399722.573986 
+341564.848978  7399726.383333 
+341635.189326  7399466.237894 
+341641.942988  7399436.522984 
+341647.138114  7399411.967190 
+341657.503626  7399363.895424 
+341661.857635  7399330.811091 
+341680.955906  7399273.460915 
+341679.356137  7399230.608255 
+341704.762774  7399202.033150 
+341724.966039  7399208.132105 
+341746.587655  7399222.979562 
+341764.036679  7399233.257801 
+341780.355970  7399240.116626 
+341800.468526  7399248.495191 
+341827.021389  7399255.743950 
+341881.916546  7399258.973396 
+341887.713647  7399259.963227 
+341967.751561  7399255.064066 
+342046.989592  7399247.865299 
+342072.866263  7399177.477356 
+342093.811689  7399138.354057 
+342106.510884  7399119.307320 
+342128.726230  7399070.895612 
+342138.250626  7399028.042953 
+342173.956805  7398970.112876 
+342190.630683  7398928.050081 
+342200.138587  7398900.304833 
+342188.198045  7398878.498568 
+342186.656000  7398856.632314 
+342189.039161  7398833.616256 
+342177.139850  7398817.748974 
+342169.998614  7398793.143189 
+342169.363654  7398743.261733 
+342170.831483  7398728.284299 
+342169.973875  7398679.362678 
+342279.508557  7398694.730046 
+342327.130539  7398701.078959 
+342366.151703  7398703.788495 
+342395.895856  7398705.008286 
+342419.331644  7398712.507001 
+342444.317723  7398719.375825 
+342468.380224  7398728.444271 
+342492.574665  7398739.952300 
+342521.799306  7398752.500151 
+342541.161456  7398759.678921 
+342562.717102  7398764.678065 
+342584.965433  7398767.987498 
+342613.959180  7398772.106792 
+342673.125885  7398790.763596 
+342733.430569  7398779.655499 
+342768.204924  7398769.087309 
+342793.421897  7398764.678065 
+342862.063521  7398740.742165 
+342862.080014  7398740.742165 
+342935.281803  7398717.186200 
+343015.542366  7398691.340627 
+343063.147856  7398678.512824 
+343095.893637  7398670.854136 
+343119.106777  7398666.524877 
+343144.513413  7398662.995482 
+343178.059080  7398660.265950 
+343202.773033  7398657.716386 
+343276.246948  7398659.726042 
+343324.553367  7398669.794317 
+343367.837832  7398680.862422 
+343425.643909  7398697.749529 
+343506.193089  7398710.787296 
+343566.613221  7398708.417702 
+343600.967018  7398702.488717 
+343640.713850  7398699.619209 
+343640.812805  7398699.719192 
+343696.046058  7398695.239959 
+343715.977197  7398692.660401 
+343776.776656  7398684.621778 
+343900.197990  7398703.428556 
+343924.037843  7398706.408046 
+344000.043350  7398728.764216 
+344017.987148  7398732.753533 
+344040.268464  7398737.702685 
+344058.146292  7398746.641154 
+344128.057835  7398779.385545 
+344193.747308  7398807.740688 
+344241.427014  7398836.045840 
+344287.680122  7398852.972941 
+344305.582688  7398853.902781 
+344349.543344  7398858.022076 
+344406.829908  7398855.422521 
+344469.410553  7398849.453543 
+344507.648324  7398832.396465 
+344539.132433  7398820.058579 
+344634.541321  7398790.923569 
+344652.979893  7398780.615335 
+344675.154007  7398767.177637 
+344699.521619  7398749.370687 
+344711.082834  7398740.002291 
+344715.766693  7398735.623042 
+344724.829301  7398729.694057 
+344734.197019  7398723.445128 
+344743.259626  7398717.196198 
+344758.877987  7398706.877965 
+344787.616101  7398689.071015 
+344832.178731  7398660.065984 
+344847.285826  7398651.587436 
+344867.909649  7398639.399524 
+344890.710476  7398630.031128 
+344908.514088  7398620.342788 
+344932.881700  7398606.285196 
+344959.747919  7398589.408087 
+345011.921821  7398562.232742 
+345053.779687  7398535.987237 
+345090.021871  7398519.120127 
+345108.765553  7398507.562106 
+345134.691703  7398492.254728 
+345165.309957  7398478.187138 
+345192.802890  7398464.759438 
+345214.045180  7398452.261579 
+345241.224756  7398436.324309 
+345270.787493  7398418.117427 
+345346.809493  7398367.596081 
+345363.367925  7398357.907741 
+345388.675606  7398339.480897 
+345407.105932  7398325.733252 
+345416.787007  7398320.104216 
+345427.408152  7398315.105072 
+345461.151728  7398291.989032 
+345474.898194  7398281.680798 
+345487.704590  7398269.812831 
+345501.451057  7398253.245668 
+345516.129347  7398237.008450 
+345528.317276  7398226.380270 
+345538.311708  7398218.261661 
+345561.120782  7398205.453855 
+345575.799072  7398199.824819 
+345580.606625  7398198.695012 
+345588.918825  7398196.385408 
+345602.665292  7398193.885836 
+345622.662401  7398194.205781 
+345640.152656  7398196.705353 
+345658.582982  7398200.134766 
+345683.890664  7398206.383695 
+345706.386381  7398210.452998 
+345726.688601  7398210.133053 
+345749.802785  7398209.203213 
+345766.674573  7398204.204069 
+345783.859718  7398196.385408 
+345825.090871  7398165.150758 
+345847.586588  7398147.343808 
+345865.390200  7398134.845949 
+345880.703450  7398125.467556 
+345896.008455  7398118.598732 
+345911.940172  7398115.159321 
+345936.621140  7398114.539428 
+345956.304893  7398112.659750 
+345974.421862  7398108.290498 
+346000.348011  7398099.851943 
+346026.282406  7398091.413389 
+346039.154772  7398085.684370 
+346051.581842  7398080.165316 
+346076.749338  7398071.136862 
+346085.630528  7398068.297348 
+346095.946563  7398064.857938 
+346104.687567  7398063.298205 
+346115.308712  7398062.048419 
+346131.553787  7398060.798633 
+346169.981222  7398063.298205 
+346193.722120  7398057.989114 
+346212.779159  7398055.489542 
+346231.522841  7398055.179595 
+346270.890346  7398056.739328 
+346335.227438  7398055.199592 
+346350.862291  7398054.859650 
+346420.782080  7398057.189251 
+346432.260834  7398056.989285 
+346526.424541  7398057.049275 
+346565.049886  7398053.809830 
+346602.652697  7398053.299917 
+346635.456203  7398051.430238 
+346661.382352  7398048.300774 
+346678.880853  7398049.870505 
+346688.248571  7398052.989970 
+346715.741504  7398067.357509 
+346735.111900  7398082.664887 
+346741.981010  7398085.794351 
+346751.670331  7398088.293923 
+346780.095088  7398092.663175 
+346813.525307  7398093.603014 
+346849.759245  7398096.412533 
+346951.336314  7398076.225990 
+347155.290337  7398035.712930 
+347272.370319  7398001.268830 
+347366.360856  7397948.757824 
+347422.393994  7397805.272402 
+347523.006254  7397756.680726 
+347622.612474  7397686.872683 
+347795.280297  7397462.411131 
+347845.161746  7397372.246576 
+347902.712190  7397296.459557 
+347919.732410  7397285.871371 
+347931.029746  7397267.334546 
+347963.124076  7397175.420290 
+347984.885878  7397148.324931 
+348016.922484  7397058.280355 
+348032.392413  7397015.107750 
+347954.935569  7396922.053690 
+347954.886091  7396922.083684 
+347881.189528  7396843.797094 
+347795.181342  7396749.863184 
+347651.647452  7396591.260351 
+347602.846259  7396526.611425 
+347559.776196  7396471.230911 
+347549.080835  7396444.745448 
+347535.169444  7396407.641804 
+347491.860240  7396412.650946 
+347446.530711  7396421.159488 
+347395.874116  7396433.877310 
+347369.601625  7396443.085732 
+347347.138893  7396453.453956 
+347312.884051  7396469.931134 
+347291.567544  7396481.419166 
+347266.078445  7396501.295762 
+347230.331036  7396529.600913 
+347183.212074  7396579.642342 
+347142.912744  7396617.095926 
+347090.244069  7396673.536258 
+346969.593469  7396800.504510 
+346876.039982  7396876.561482 
+346866.771219  7396881.600619 
+346833.621372  7396904.226743 
+346811.076177  7396920.004041 
+346776.516224  7396935.491388 
+346751.439437  7396947.169387 
+346732.027810  7396958.037526 
+346706.852068  7396972.755005 
+346678.658205  7396992.001708 
+346663.650065  7397002.509908 
+Region 1
+184
+326732.922903  7396089.096368 
+326723.711864  7396056.182006 
+326724.849844  7396000.001629 
+326739.033360  7395842.888541 
+326753.917807  7395717.929945 
+326767.820952  7395600.580046 
+326814.403908  7395523.283286 
+326850.101841  7395465.563173 
+326868.317764  7395432.758792 
+326887.597452  7395414.181974 
+326913.762742  7395398.384680 
+326942.707011  7395379.517912 
+327001.131555  7395345.363762 
+327063.530783  7395282.754487 
+327080.781897  7395264.677583 
+327148.986471  7395187.330832 
+327179.175921  7395159.325629 
+327218.279547  7395130.290602 
+327281.412689  7395092.237121 
+327329.240826  7395057.673041 
+327399.581174  7395011.290986 
+327462.541145  7394962.899275 
+327524.222950  7394914.007650 
+327560.267224  7394890.561666 
+327574.500218  7394881.393236 
+327600.921141  7394869.135336 
+327648.716294  7394859.377007 
+327672.613871  7394849.928626 
+327717.127024  7394848.298905 
+327750.219147  7394852.288222 
+327790.947280  7394860.316846 
+327830.347770  7394847.029122 
+327896.927837  7394821.483498 
+327914.327383  7394813.954788 
+327951.039602  7394793.418306 
+327999.997474  7394757.714421 
+328037.089019  7394723.240326 
+328085.519132  7394670.059436 
+328097.698814  7394658.861354 
+328138.097098  7394642.524152 
+328159.446589  7394639.684639 
+328189.965889  7394638.104909 
+328242.881951  7394636.705149 
+328286.883838  7394635.855295 
+328427.275914  7394630.986129 
+328497.970850  7394620.927852 
+328554.441037  7394620.307958 
+328618.720405  7394593.502549 
+328684.014059  7394567.966923 
+328716.759841  7394544.280980 
+328756.877753  7394519.055301 
+328792.913781  7394490.280230 
+328883.787243  7394426.091225 
+328917.778206  7394394.776589 
+328967.098911  7394382.238737 
+328981.076272  7394414.463217 
+329003.423557  7394465.914404 
+329014.976526  7394492.299884 
+329034.742741  7394537.362166 
+329045.718474  7394562.377881 
+329093.060084  7394661.820847 
+329146.602860  7394788.429160 
+329185.780702  7394792.408479 
+329213.009755  7394795.148009 
+329243.042527  7394801.426934 
+329267.987375  7394808.995637 
+329290.656263  7394818.094079 
+329314.347684  7394829.722087 
+329339.581150  7394844.399573 
+329362.019143  7394864.156189 
+329383.954117  7394882.143108 
+329428.071451  7394921.916295 
+329462.243831  7394950.541392 
+329500.481602  7394979.156490 
+329550.668162  7395006.991722 
+329557.050744  7395012.560768 
+329583.339728  7395027.828153 
+329593.490837  7395034.067085 
+329637.632910  7395059.422741 
+329652.088552  7395067.971277 
+329683.943741  7395085.938200 
+329700.749560  7395091.737206 
+329710.166755  7395097.306252 
+329735.136341  7395108.684303 
+329764.171319  7395120.302313 
+329812.040688  7395135.949633 
+329859.901811  7395149.047389 
+329873.376152  7395151.307002 
+329891.451889  7395154.056531 
+329904.687090  7395157.585927 
+329912.083959  7395161.125321 
+329919.983847  7395167.724190 
+329928.403249  7395175.062933 
+329953.917087  7395208.067280 
+329956.498157  7395216.895768 
+329962.138579  7395232.643070 
+329972.413382  7395265.377463 
+329980.618381  7395289.233377 
+329995.989355  7395332.865903 
+330012.358123  7395354.942122 
+330024.933625  7395392.745646 
+330087.489531  7395560.216960 
+330108.319509  7395615.587475 
+330124.152272  7395657.660269 
+330144.908035  7395710.191271 
+330155.232315  7395751.824139 
+330163.181682  7395788.127921 
+330167.477968  7395849.317440 
+330173.703872  7395902.888263 
+330182.543831  7395950.830051 
+330190.336519  7395999.991630 
+330213.722829  7396052.872572 
+330199.902147  7396071.269421 
+330162.926049  7396173.591894 
+330211.751980  7396284.582883 
+330118.973639  7396340.983222 
+330026.467424  7396402.212734 
+329954.766448  7396418.369966 
+329838.478104  7396443.395679 
+329730.073156  7396471.450874 
+329680.397862  7396480.359348 
+329616.027786  7396489.867719 
+329486.289839  7396515.243372 
+329359.866877  7396543.888466 
+329240.280040  7396568.444260 
+329188.073154  7396600.328798 
+329161.693462  7396621.455179 
+329060.553443  7396679.945161 
+328796.146304  7396846.536625 
+328737.762991  7396883.450302 
+328690.437873  7396904.796646 
+328663.142850  7396920.453964 
+328632.038068  7396939.930627 
+328559.520715  7396989.872073 
+328485.263408  7397045.412559 
+328399.362424  7397107.361948 
+328283.511129  7397211.914039 
+328268.140155  7397230.790806 
+328257.139684  7397305.528004 
+328246.568016  7397365.287768 
+328199.861366  7397404.161109 
+328168.261810  7397423.387816 
+328131.838209  7397442.654515 
+328093.880809  7397458.611782 
+328048.526541  7397469.529912 
+327964.901516  7397503.874029 
+327960.011501  7397358.338958 
+327960.011501  7397237.259698 
+327879.503551  7397240.909073 
+327872.279853  7397239.849254 
+327813.451244  7397240.089213 
+327743.209851  7397239.319345 
+327670.469851  7397120.919626 
+327538.018894  7396913.845096 
+327444.688056  7396776.748579 
+327355.587533  7396637.912360 
+327319.056732  7396569.494080 
+327271.220348  7396497.516409 
+327197.350613  7396547.047925 
+327121.732678  7396569.494080 
+327124.041623  7396529.520927 
+327119.704106  7396502.895488 
+327113.816297  7396474.000437 
+327102.617916  7396445.515316 
+327091.081439  7396423.889021 
+327077.656576  7396405.692138 
+327059.663300  7396387.525249 
+327040.169211  7396372.797772 
+327027.940051  7396363.729325 
+326976.689728  7396320.636707 
+326956.791573  7396302.099882 
+326937.256253  7396280.523578 
+326918.883651  7396261.206887 
+326829.296601  7396237.370970 
+326814.469878  7396240.130497 
+326781.196338  7396251.608531 
+326758.684128  7396264.146383 
+326723.340783  7396296.880776 
+326695.229383  7396282.143300 
+326707.293619  7396238.470781 
+326708.926372  7396217.124438 
+326738.052059  7396121.050894 
+326737.969597  7396105.443567 
+326732.922903  7396089.096368 
+Region 1
+200
+329470.308644  7391628.130491 
+329439.418264  7391615.922582 
+329417.235904  7391609.463688 
+329404.709879  7391607.214073 
+329370.933319  7391606.264236 
+329340.677898  7391609.233728 
+329321.596121  7391607.574012 
+329302.448373  7391606.634173 
+329276.538716  7391602.834824 
+329255.156240  7391597.045815 
+329212.440766  7391567.450885 
+329192.476641  7391554.113169 
+329121.385887  7391503.891772 
+329044.786650  7391455.140122 
+328952.181480  7391391.311056 
+328856.286064  7391328.221862 
+328836.091045  7391317.683667 
+328762.509929  7391263.442958 
+328727.727328  7391243.876310 
+328708.323947  7391235.887678 
+328695.096993  7391231.858369 
+328669.344015  7391225.689425 
+328632.689520  7391217.620807 
+328609.220747  7391216.231045 
+328586.873462  7391215.191223 
+328563.718047  7391213.771467 
+328479.062243  7391217.660800 
+328374.697948  7391220.110381 
+328311.861670  7391223.599783 
+328304.390585  7391222.739930 
+328228.096459  7391227.759071 
+328140.397796  7391133.435227 
+328038.861959  7391025.233761 
+328016.572397  7391002.267695 
+328000.046951  7390984.240783 
+327944.912653  7390923.891121 
+327867.389838  7390845.074621 
+327697.426779  7390658.606561 
+327684.678106  7390648.008377 
+327652.039525  7390618.353456 
+327606.404885  7390557.643855 
+327587.364338  7390541.876556 
+327534.918311  7390520.920146 
+327509.437459  7390521.899978 
+327403.588842  7390517.900663 
+327395.078732  7390570.111720 
+327377.555492  7390662.395912 
+327372.566522  7390717.226520 
+327345.634333  7390811.380393 
+327328.061615  7390841.665205 
+327092.664715  7391254.324520 
+326860.442614  7391683.840948 
+326759.541736  7391794.821938 
+326651.664547  7391907.422650 
+326424.423169  7392114.857119 
+326339.742626  7392211.080637 
+326270.564997  7392345.047689 
+326219.850679  7392496.851687 
+326131.203699  7392705.355972 
+326078.831889  7392865.948464 
+326043.702946  7392961.322127 
+326027.631042  7393017.592488 
+326011.122089  7393067.323970 
+325962.436343  7393151.369574 
+325992.543331  7393100.888221 
+326011.122089  7393067.323970 
+326105.557922  7393133.352660 
+326194.237886  7393224.866984 
+326265.213194  7393290.935667 
+326332.131355  7393354.704744 
+326398.282618  7393417.953910 
+326461.143634  7393476.623860 
+326480.926341  7393492.151201 
+326524.260283  7393533.014201 
+326595.854058  7393602.352324 
+326618.539438  7393624.818476 
+326632.112734  7393667.511163 
+326666.540747  7393736.559336 
+326706.427764  7393787.630588 
+326779.349182  7393876.285402 
+326780.891227  7393937.194969 
+326784.610277  7393958.321350 
+326805.357793  7393990.285875 
+326810.552919  7394000.004210 
+326814.906929  7394014.861665 
+326833.122852  7394039.837387 
+326846.176635  7394067.232695 
+326868.161086  7394100.696962 
+326882.756914  7394133.421357 
+326904.246591  7394172.224710 
+326927.418499  7394217.376976 
+326935.969841  7394231.564546 
+326953.509573  7394311.250896 
+326964.427583  7394388.167721 
+326971.403894  7394423.951592 
+327016.642715  7394577.715254 
+327045.149934  7394665.260258 
+327045.191166  7394665.310249 
+327061.576426  7394678.627968 
+327110.253925  7394746.186396 
+327138.398311  7394788.249191 
+327147.023868  7394801.086992 
+327165.412962  7394817.694147 
+327185.393579  7394852.068259 
+327230.822064  7394900.210013 
+327276.349503  7394981.356113 
+327242.135892  7395027.908140 
+327229.469682  7395045.205177 
+327217.322984  7395065.801649 
+327212.812296  7395090.437429 
+327218.279547  7395130.290602 
+327281.412689  7395092.237121 
+327329.240826  7395057.673041 
+327399.581174  7395011.290986 
+327462.541145  7394962.899275 
+327524.222950  7394914.007650 
+327560.267224  7394890.561666 
+327574.500218  7394881.393236 
+327600.921141  7394869.135336 
+327648.716294  7394859.377007 
+327672.613871  7394849.928626 
+327717.127024  7394848.298905 
+327750.219147  7394852.288222 
+327790.947280  7394860.316846 
+327830.347770  7394847.029122 
+327896.927837  7394821.483498 
+327914.327383  7394813.954788 
+327951.039602  7394793.418306 
+327999.997474  7394757.714421 
+328037.089019  7394723.240326 
+328085.519132  7394670.059436 
+328097.698814  7394658.861354 
+328138.097098  7394642.524152 
+328159.446589  7394639.684639 
+328189.965889  7394638.104909 
+328242.881951  7394636.705149 
+328286.883838  7394635.855295 
+328427.275914  7394630.986129 
+328497.970850  7394620.927852 
+328554.441037  7394620.307958 
+328618.720405  7394593.502549 
+328684.014059  7394567.966923 
+328716.759841  7394544.280980 
+328756.877753  7394519.055301 
+328792.913781  7394490.280230 
+328776.767662  7394451.716836 
+328758.881587  7394420.012267 
+328741.506779  7394402.505265 
+328700.630214  7394335.056819 
+328681.210341  7394304.881987 
+328660.767935  7394274.697158 
+328640.086389  7394247.831760 
+328585.743729  7394189.281789 
+328547.687374  7394140.350170 
+328519.881085  7394109.675424 
+328502.786649  7394094.478028 
+328460.178375  7394050.885495 
+328433.402864  7394028.089399 
+328415.277649  7394010.902343 
+328407.922011  7394004.773393 
+328324.610343  7393952.092417 
+328314.813821  7393925.137034 
+328303.780364  7393911.659343 
+328292.763400  7393893.282491 
+328287.856893  7393876.125429 
+328282.950386  7393863.877527 
+328277.969662  7393848.600144 
+328278.052125  7393832.432914 
+328279.173612  7393807.517181 
+328335.577830  7393715.922871 
+328367.169139  7393642.865385 
+328381.616535  7393612.350612 
+328401.423981  7393577.916510 
+328442.556180  7393518.476691 
+328572.013755  7393325.659719 
+328692.293275  7393143.760877 
+328775.011215  7393020.531985 
+328795.173249  7392990.087200 
+328810.478253  7392973.320072 
+328853.136004  7392939.925792 
+328907.462171  7392895.823346 
+328794.431088  7392739.210173 
+328715.795032  7392628.209186 
+328715.803279  7392628.199188 
+328800.821917  7392551.442336 
+328852.567014  7392483.274012 
+328945.617480  7392365.734146 
+329031.353541  7392255.433039 
+329106.567410  7392160.949224 
+329195.585470  7392048.128549 
+329195.593716  7392048.128549 
+329234.936483  7391999.966798 
+329270.551953  7391949.105511 
+329351.966988  7391848.712707 
+329393.998026  7391790.282715 
+329453.948122  7391717.875118 
+329473.912247  7391695.848891 
+329514.549671  7391660.544938 
+329486.627935  7391638.178769 
+329470.308644  7391628.130491 
+Region 1
+297
+323487.478646  7404590.230200 
+323137.508618  7404495.796376 
+322804.212468  7404268.035389 
+322511.900084  7404001.031125 
+322389.946578  7403916.655578 
+321753.560221  7403527.492238 
+321723.799574  7403581.283024 
+321714.638012  7403643.092436 
+321698.615586  7403711.770673 
+321691.746476  7403764.421654 
+321692.966918  7403783.368408 
+321698.615586  7403892.609696 
+321608.946074  7403877.032365 
+321524.059376  7403861.585011 
+321478.738092  7403839.368816 
+321455.962003  7403828.510676 
+321421.624699  7403798.755773 
+321382.710736  7403782.728518 
+321336.927664  7403766.711262 
+321245.361518  7403734.656752 
+321169.050900  7403699.072848 
+321191.043597  7403684.125408 
+321210.348023  7403660.849395 
+321219.319922  7403644.732156 
+321214.561847  7403620.636283 
+321207.090762  7403600.209782 
+321155.279695  7403532.961301 
+321142.918595  7403512.094875 
+321119.260159  7403477.970720 
+321099.073387  7403445.296317 
+321090.332382  7403422.910152 
+321028.238266  7403437.807600 
+321002.658458  7403453.704877 
+320946.930431  7403487.869025 
+320991.410599  7403092.356773 
+320970.762038  7402996.433203 
+320965.764822  7402952.980646 
+320955.374572  7402859.886593 
+320943.780371  7402760.803565 
+320967.983058  7402641.923928 
+320956.413597  7402398.905554 
+320935.740296  7402369.620571 
+320911.653057  7402335.736375 
+320906.845504  7402318.099396 
+320935.740296  7402205.548675 
+320921.136222  7402173.344191 
+320849.410508  7402100.326698 
+320797.805596  7402084.789360 
+320773.751342  7402068.752107 
+320765.736005  7402062.343205 
+320751.305102  7402033.478149 
+320746.497549  7402003.013367 
+320749.705333  7401972.548586 
+320780.166909  7401932.455453 
+320828.522806  7401898.461276 
+320872.607155  7401918.327873 
+320932.227402  7401834.502232 
+320995.566700  7401836.361913 
+321014.186689  7401843.190743 
+321025.368577  7401847.539998 
+321039.032581  7401850.019574 
+321050.832938  7401846.920105 
+321054.560234  7401836.981807 
+321104.853994  7401830.772870 
+321150.373188  7401833.722365 
+321168.820006  7401818.354997 
+321208.550345  7401796.478745 
+321237.758494  7401781.761266 
+321267.626341  7401764.254264 
+321278.956662  7401756.015676 
+321302.648083  7401743.657792 
+321368.568451  7401720.991675 
+321436.550376  7401702.454850 
+321473.633675  7401691.126791 
+321494.216267  7401690.096967 
+321517.899441  7401704.144561 
+321533.369370  7401728.200440 
+321559.122348  7401735.409205 
+321583.836302  7401740.558323 
+321594.144090  7401735.409205 
+321620.919601  7401710.693439 
+321677.571205  7401693.186438 
+321744.514106  7401672.579967 
+321788.796364  7401708.633792 
+321834.125894  7401746.747263 
+321863.573184  7401754.785886 
+321884.164022  7401759.805027 
+321908.276000  7401775.582324 
+321916.942789  7401784.310829 
+321930.276944  7401797.318601 
+321947.437350  7401803.467548 
+321976.043524  7401805.457207 
+322011.122989  7401806.327058 
+322045.245891  7401815.905417 
+322073.266583  7401813.385849 
+322102.252084  7401807.756813 
+322136.193569  7401797.948493 
+322176.608345  7401773.282718 
+322202.930314  7401755.055840 
+322219.711393  7401743.287856 
+322250.610019  7401711.743259 
+322282.267299  7401682.098337 
+322351.296495  7401634.646465 
+322414.017326  7401595.343197 
+322459.338609  7401582.975316 
+322530.396379  7401561.349020 
+322599.417329  7401539.722725 
+322642.322467  7401394.177655 
+322685.450254  7401282.586770 
+322778.550198  7401112.815850 
+322839.209470  7401034.459272 
+322907.884079  7400952.313343 
+323098.223575  7400754.237271 
+323148.566813  7400696.057237 
+323211.130965  7400618.090592 
+323236.306707  7400586.136065 
+323267.601152  7400543.913298 
+323362.210157  7400397.778329 
+323442.495458  7400303.044556 
+323610.446438  7400065.355270 
+323889.193772  7399748.599528 
+324152.108344  7399463.518360 
+324347.552257  7399235.407433 
+324392.205596  7399056.798027 
+324541.718003  7399165.749365 
+324677.920995  7399197.423939 
+324782.458461  7399206.932311 
+325016.857567  7399181.586652 
+325682.056255  7399140.403706 
+325865.040113  7399134.584703 
+325848.283772  7399287.228557 
+325848.663099  7399360.046084 
+325841.117798  7399467.767632 
+325818.366447  7399623.241001 
+325807.506162  7399784.473383 
+325796.983971  7399896.474198 
+325791.747615  7399940.596640 
+325777.316711  7400062.595743 
+325753.847939  7400268.760429 
+325734.518774  7400359.634863 
+325730.222488  7400377.501803 
+325722.710172  7400408.436504 
+325712.410630  7400435.801816 
+325700.008299  7400460.837528 
+325687.292611  7400489.502618 
+325672.210255  7400513.638484 
+325653.746945  7400559.130691 
+325600.402079  7400624.149554 
+325531.298666  7400737.030219 
+325504.382969  7400777.403303 
+325490.001543  7400798.359713 
+325469.559137  7400839.192719 
+325459.812093  7400866.548033 
+325452.266792  7400885.674757 
+325445.513129  7400911.960255 
+325440.260280  7400930.137141 
+325437.101973  7400963.271466 
+325429.960738  7401012.543026 
+325404.686041  7401165.676795 
+325396.901599  7401218.937672 
+325378.025977  7401290.855353 
+325334.692035  7401351.804913 
+325319.939528  7401454.757278 
+325295.332776  7401559.709301 
+325317.770770  7401615.439755 
+325334.428156  7401639.375655 
+325358.853491  7401669.910425 
+325400.628895  7401715.752572 
+325422.060849  7401743.917748 
+325461.618017  7401805.247243 
+325492.153809  7401853.069051 
+325522.755571  7401904.430254 
+325547.931313  7401941.353929 
+325562.485910  7401978.527561 
+325571.276392  7402011.051990 
+325574.797533  7402035.667774 
+325572.166985  7402067.322352 
+325568.654091  7402092.817984 
+325559.863609  7402146.438800 
+325576.562226  7402223.805547 
+325615.253540  7402327.537779 
+325643.373187  7402360.072206 
+325670.626979  7402426.880763 
+325689.222229  7402507.526949 
+325661.531387  7402516.755368 
+325607.172234  7402544.450624 
+325584.602301  7402560.857813 
+325568.192302  7402578.294827 
+325554.858147  7402587.533244 
+325532.469631  7402616.238327 
+325498.981688  7402642.113895 
+325476.518956  7402659.600900 
+325452.918244  7402678.627641 
+325435.419742  7402683.926733 
+325340.621075  7402744.286394 
+325327.690985  7402759.463794 
+325303.496544  7402856.757129 
+325308.213388  7402891.541170 
+325303.240911  7402919.366404 
+325303.983072  7402945.681897 
+325312.328257  7402968.198040 
+325322.586568  7402987.674704 
+325332.836633  7403010.960715 
+325343.103190  7403031.187250 
+325327.872402  7403108.054084 
+325278.329048  7403244.890645 
+325279.079455  7403282.244247 
+325281.487355  7403335.245168 
+325292.413610  7403389.865812 
+325309.005026  7403476.091042 
+325292.487827  7403542.149727 
+325216.993585  7403598.770029 
+325016.461748  7403899.578503 
+324981.077172  7403970.356379 
+324973.696796  7404063.260465 
+324986.239313  7404087.686282 
+324952.124657  7404184.599681 
+324934.766341  7404234.041212 
+324930.197929  7404250.428405 
+324926.759251  7404265.295859 
+324922.949493  7404278.263637 
+324890.673746  7404322.176116 
+324850.506356  7404373.817270 
+324825.091473  7404417.259829 
+324809.827701  7404463.391927 
+324803.717244  7404490.837225 
+324801.762887  7404516.492831 
+324805.209811  7404539.278928 
+324810.833741  7404562.534944 
+324820.011795  7404582.021606 
+324839.712040  7404625.194211 
+324842.029231  7404635.462452 
+324843.010533  7404640.351615 
+324850.968145  7404701.531136 
+324859.799858  7404732.095900 
+324879.293947  7404768.209714 
+324903.348202  7404798.954448 
+324921.943452  7404833.278568 
+324947.539752  7404883.210016 
+324957.864033  7404905.696164 
+324976.987042  7404947.219051 
+325051.656660  7405018.696808 
+325087.041236  7405059.099887 
+325118.352174  7405098.673109 
+325145.243132  7405147.694712 
+325157.142443  7405185.238281 
+325149.547664  7405210.373975 
+325043.855726  7405356.408961 
+325043.863973  7405356.458952 
+324930.783412  7405516.951461 
+324907.801167  7405533.498627 
+324853.573954  7405549.125950 
+324820.217951  7405549.615866 
+324762.552060  7405557.054592 
+324741.202569  7405560.254044 
+324746.875976  7405521.450691 
+324746.777021  7405498.524618 
+324746.702805  7405493.085549 
+324735.496177  7405472.879011 
+324711.969681  7405440.624536 
+324700.548652  7405433.955678 
+324677.450960  7405421.937736 
+324644.086711  7405409.219915 
+324604.950100  7405400.021490 
+324585.109669  7405384.724111 
+324569.796419  7405364.567563 
+324558.053786  7405349.740103 
+324537.240300  7405336.972290 
+324508.345508  7405326.324114 
+324463.395305  7405317.145686 
+324444.231065  7405227.321072 
+324428.175654  7405211.283819 
+324408.673318  7405202.195376 
+324391.183063  7405193.896798 
+324375.853320  7405185.968156 
+324361.348201  7405176.489779 
+324345.680362  7405162.782127 
+324334.185117  7405149.464409 
+324324.248409  7405126.198394 
+324292.789039  7404979.843463 
+324288.014471  7404942.909790 
+324285.656049  7404909.655486 
+324285.944668  7404893.598236 
+324288.162904  7404879.110718 
+324293.036426  7404864.993136 
+324299.872551  7404856.994506 
+324308.242475  7404849.335818 
+324328.346786  7404843.046895 
+324342.522056  7404845.316506 
+324362.659351  7404844.446655 
+324379.423938  7404843.986734 
+324397.697585  7404837.227892 
+324405.193409  7404825.569889 
+324434.236633  7404756.791670 
+324445.839080  7404704.830570 
+323840.186424  7404582.341552 
+323487.478646  7404590.230200 
+Region 1
+332
+349296.572556  7398517.010488 
+349400.978082  7397946.868148 
+349420.513403  7397840.196420 
+349439.883799  7397734.424538 
+349420.562880  7397726.975814 
+349359.408834  7397700.300383 
+349207.843115  7397644.739900 
+349152.296505  7397622.523705 
+349094.366735  7397598.717783 
+349034.853688  7397575.701726 
+348977.723802  7397551.105939 
+348920.577424  7397528.089881 
+348865.063799  7397504.653895 
+348828.516505  7397492.375999 
+348733.297279  7397481.267901 
+348691.851724  7397480.208083 
+348671.302117  7397490.556310 
+348599.180584  7397529.689607 
+348545.217251  7397565.393491 
+348534.109578  7397567.783082 
+348523.001906  7397564.603627 
+348438.090469  7397519.371374 
+348370.636302  7397482.077763 
+348309.498748  7397454.252529 
+348287.390603  7397450.503171 
+348249.227048  7397449.543335 
+348224.867683  7397445.733988 
+348205.571503  7397446.363880 
+348186.011444  7397452.322859 
+348164.686691  7397461.521284 
+348156.712586  7397471.069648 
+348151.773094  7397476.418732 
+348149.117808  7397480.238078 
+348145.316296  7397485.957098 
+348135.057985  7397497.035200 
+348020.179746  7397333.523209 
+347963.445679  7397278.942558 
+347919.732410  7397285.871371 
+347902.712190  7397296.459557 
+347845.161746  7397372.246576 
+347795.280297  7397462.411131 
+347622.612474  7397686.872683 
+347523.006254  7397756.680726 
+347422.393994  7397805.272402 
+347366.360856  7397948.757824 
+347272.370319  7398001.268830 
+347155.290337  7398035.712930 
+346951.336314  7398076.225990 
+346849.759245  7398096.412533 
+346813.525307  7398093.603014 
+346780.095088  7398092.663175 
+346751.670331  7398088.293923 
+346741.981010  7398085.794351 
+346735.111900  7398082.664887 
+346715.741504  7398067.357509 
+346688.248571  7398052.989970 
+346678.880853  7398049.870505 
+346661.382352  7398048.300774 
+346635.456203  7398051.430238 
+346602.652697  7398053.299917 
+346565.049886  7398053.809830 
+346526.424541  7398057.049275 
+346432.260834  7398056.989285 
+346420.782080  7398057.189251 
+346350.862291  7398054.859650 
+346335.227438  7398055.199592 
+346270.890346  7398056.739328 
+346231.522841  7398055.179595 
+346212.779159  7398055.489542 
+346193.722120  7398057.989114 
+346169.981222  7398063.298205 
+346131.553787  7398060.798633 
+346115.308712  7398062.048419 
+346104.687567  7398063.298205 
+346095.946563  7398064.857938 
+346085.630528  7398068.297348 
+346076.749338  7398071.136862 
+346051.581842  7398080.165316 
+346039.154772  7398085.684370 
+346026.282406  7398091.413389 
+346000.348011  7398099.851943 
+345974.421862  7398108.290498 
+345956.304893  7398112.659750 
+345936.621140  7398114.539428 
+345911.940172  7398115.159321 
+345896.008455  7398118.598732 
+345880.703450  7398125.467556 
+345865.390200  7398134.845949 
+345847.586588  7398147.343808 
+345825.090871  7398165.150758 
+345783.859718  7398196.385408 
+345766.674573  7398204.204069 
+345749.802785  7398209.203213 
+345726.688601  7398210.133053 
+345706.386381  7398210.452998 
+345683.890664  7398206.383695 
+345658.582982  7398200.134766 
+345640.152656  7398196.705353 
+345622.662401  7398194.205781 
+345602.665292  7398193.885836 
+345588.918825  7398196.385408 
+345580.606625  7398198.695012 
+345575.799072  7398199.824819 
+345561.120782  7398205.453855 
+345538.311708  7398218.261661 
+345528.317276  7398226.380270 
+345516.129347  7398237.008450 
+345501.451057  7398253.245668 
+345487.704590  7398269.812831 
+345474.898194  7398281.680798 
+345461.151728  7398291.989032 
+345427.408152  7398315.105072 
+345416.787007  7398320.104216 
+345407.105932  7398325.733252 
+345388.675606  7398339.480897 
+345363.367925  7398357.907741 
+345346.809493  7398367.596081 
+345270.787493  7398418.117427 
+345241.224756  7398436.324309 
+345214.045180  7398452.261579 
+345192.802890  7398464.759438 
+345165.309957  7398478.187138 
+345134.691703  7398492.254728 
+345108.765553  7398507.562106 
+345090.021871  7398519.120127 
+345053.779687  7398535.987237 
+345011.921821  7398562.232742 
+344959.747919  7398589.408087 
+344932.881700  7398606.285196 
+344908.514088  7398620.342788 
+344890.710476  7398630.031128 
+344867.909649  7398639.399524 
+344847.285826  7398651.587436 
+344832.178731  7398660.065984 
+344787.616101  7398689.071015 
+344758.877987  7398706.877965 
+344743.259626  7398717.196198 
+344734.197019  7398723.445128 
+344724.829301  7398729.694057 
+344715.766693  7398735.623042 
+344711.082834  7398740.002291 
+344723.559381  7398740.512204 
+344729.801778  7398741.132098 
+344739.449868  7398744.001606 
+344745.428385  7398745.821295 
+344756.832922  7398747.381028 
+344792.283467  7398753.789930 
+344809.938647  7398758.479127 
+344825.086973  7398764.568084 
+344843.368866  7398774.566371 
+344852.109871  7398781.755140 
+344860.083976  7398790.973561 
+344880.229517  7398811.590029 
+344893.819305  7398827.057380 
+344901.001772  7398834.396123 
+344912.406309  7398841.894838 
+344937.870669  7398855.332536 
+344963.483462  7398867.670423 
+344986.135857  7398880.798174 
+344991.603108  7398883.607693 
+345000.195681  7398886.577184 
+345019.096041  7398891.576328 
+345028.158649  7398895.485659 
+345037.526367  7398901.414643 
+345071.269943  7398928.909933 
+345105.945343  7398954.845491 
+345134.840135  7398972.812413 
+345159.991138  7398989.839497 
+345199.977111  7399003.897089 
+345222.002793  7399013.425457 
+345292.607019  7399039.830933 
+345302.923054  7399043.580291 
+345316.042807  7399048.729409 
+345383.810330  7399077.164539 
+345388.988963  7399079.044217 
+345417.257042  7399088.572584 
+345434.285508  7399094.821514 
+345449.442080  7399101.850310 
+345465.687154  7399108.719134 
+345472.712943  7399110.438839 
+345478.336872  7399109.658973 
+345488.958017  7399105.129748 
+345495.522017  7399102.630177 
+345504.576378  7399101.540363 
+345517.391021  7399100.750499 
+345527.698809  7399102.470204 
+345548.471064  7399107.939267 
+345571.898605  7399116.687769 
+345594.394322  7399124.496431 
+345612.667970  7399130.275441 
+345624.855898  7399136.684343 
+345649.380188  7399150.431989 
+345660.628047  7399157.310810 
+345687.650945  7399178.397198 
+345708.579878  7399194.644415 
+345714.987199  7399197.923854 
+345728.890344  7399201.833184 
+345746.380599  7399205.582542 
+345809.332324  7399216.830615 
+345828.702720  7399219.790108 
+345839.480543  7399223.079545 
+345859.939442  7399229.948368 
+345868.688692  7399234.787539 
+345879.301591  7399251.854616 
+345884.463732  7399259.943230 
+345888.372445  7399264.782401 
+345900.708806  7399269.781545 
+345916.178735  7399274.160795 
+345935.392452  7399278.060127 
+345959.446707  7399281.969457 
+345965.540671  7399282.279404 
+345975.221746  7399280.559699 
+345993.495393  7399274.630714 
+346005.840001  7399270.251465 
+346014.894362  7399267.911865 
+346026.768934  7399268.531759 
+346043.954079  7399270.411437 
+346082.686624  7399277.440233 
+346107.210914  7399281.659510 
+346122.054129  7399283.849135 
+346144.079811  7399288.848279 
+346150.017097  7399290.557986 
+346154.387599  7399293.847423 
+346175.629890  7399311.804347 
+346186.721070  7399321.022768 
+346209.686822  7399335.870225 
+346217.025967  7399338.209824 
+346225.461861  7399340.089502 
+346234.054434  7399340.089502 
+346249.870704  7399338.449783 
+346259.980583  7399337.120011 
+346267.171296  7399337.739904 
+346274.823798  7399338.989690 
+346284.661551  7399343.678887 
+346300.279912  7399354.926960 
+346311.684449  7399363.365515 
+346321.217092  7399371.484124 
+346327.616167  7399375.233482 
+346345.114668  7399380.862518 
+346377.876942  7399388.391228 
+346412.123538  7399395.390029 
+346431.650612  7399398.509495 
+346452.579546  7399400.859093 
+346473.203369  7399404.288505 
+346491.163659  7399406.008211 
+346503.813377  7399405.388317 
+346518.186557  7399402.728772 
+346526.267863  7399401.009067 
+346554.255570  7399394.880117 
+346599.815994  7399376.633242 
+346617.504159  7399369.794414 
+346651.800232  7399365.235195 
+346687.844506  7399362.975582 
+346715.164268  7399363.775445 
+346736.761146  7399364.675291 
+346756.972658  7399370.254335 
+346779.641546  7399380.922508 
+346795.680464  7399395.020093 
+346812.181172  7399411.907200 
+346832.128804  7399436.403004 
+346841.364582  7399443.821734 
+346887.337318  7399482.185162 
+346897.405966  7399486.764378 
+346905.660443  7399484.014849 
+346921.122125  7399497.362562 
+346949.522143  7399491.273605 
+346998.216135  7399485.184648 
+347040.824409  7399491.273605 
+347083.432683  7399501.421867 
+347114.801344  7399510.090382 
+347142.261292  7399501.421867 
+347166.612411  7399501.421867 
+347186.898139  7399507.510824 
+347211.249258  7399527.797349 
+347236.746603  7399566.990636 
+347288.343268  7399585.627443 
+347318.780105  7399595.775705 
+347363.408706  7399595.775705 
+347438.474143  7399605.913969 
+347464.853835  7399616.062230 
+347477.025272  7399624.180840 
+347495.282426  7399624.180840 
+347519.633545  7399595.775705 
+347539.919273  7399579.538486 
+347568.327537  7399579.538486 
+347606.870419  7399591.716401 
+347643.392975  7399589.686748 
+347708.315549  7399563.311266 
+347779.323841  7399543.024741 
+347828.553838  7399522.288293 
+347841.673591  7399504.181394 
+347855.840615  7399508.140716 
+347879.771176  7399510.090382 
+347913.457029  7399511.750098 
+347980.672055  7399518.628920 
+348028.689856  7399523.388105 
+348055.490105  7399524.997829 
+348115.431956  7399530.476890 
+348250.018686  7399540.155232 
+348291.983754  7399545.144378 
+348318.866466  7399545.764272 
+348364.179503  7399543.104727 
+348381.306924  7399541.674972 
+348399.168260  7399538.705481 
+348421.556776  7399533.376394 
+348456.248668  7399533.176428 
+348479.931843  7399535.835972 
+348588.806826  7399545.144378 
+348642.151692  7399548.753760 
+348666.618258  7399552.543111 
+348699.388779  7399551.993205 
+348724.877878  7399549.663604 
+348759.140966  7399547.184029 
+348878.900974  7399529.557048 
+348896.028395  7399528.517226 
+348909.750123  7399527.907330 
+348920.016680  7399526.967491 
+348948.251774  7399528.027310 
+348963.540285  7399530.436897 
+348982.622063  7399533.356397 
+349003.468534  7399539.705310 
+349027.935100  7399550.583446 
+349102.291362  7399586.977212 
+349116.582080  7399594.905854 
+349174.503604  7399305.255469 
+349215.289461  7399090.702220 
+349227.749515  7399021.554064 
+349249.148484  7398872.559586 
+349259.868584  7398795.392804 
+349269.879508  7398718.975893 
+349285.407160  7398596.836814 
+349296.572556  7398517.010488 
+Region 1
+99
+331947.773195  7394622.227629 
+331988.954871  7394549.330116 
+332010.592980  7394503.887899 
+332039.141430  7394433.629934 
+332046.257927  7394412.353578 
+332069.438082  7394323.538792 
+332074.946564  7394302.732356 
+332083.201041  7394265.448742 
+332094.218005  7394242.042751 
+332110.743451  7394207.368691 
+332124.506410  7394190.031660 
+332140.116525  7394177.893739 
+332174.998080  7394148.418788 
+332195.193099  7394138.010571 
+332216.303449  7394128.482203 
+332237.306599  7394120.463577 
+332320.016292  7394088.599035 
+332383.363836  7394063.463340 
+332403.558855  7394053.924974 
+332422.838542  7394046.116312 
+332451.288038  7394042.966851 
+332485.246016  7394039.187498 
+332506.513045  7394035.928057 
+332622.026244  7394018.381062 
+332680.590974  7394004.803388 
+332776.849224  7393992.055572 
+332834.737763  7393981.237425 
+332883.440001  7393972.568910 
+332893.986930  7393999.964217 
+332939.159782  7394131.901617 
+332953.747364  7394225.305618 
+332962.933665  7394266.918490 
+332960.171177  7394312.870619 
+332953.747364  7394354.483491 
+332940.017390  7394392.426992 
+332928.043863  7394424.711462 
+332915.196236  7394446.377750 
+332903.865915  7394463.394836 
+332868.382384  7394516.605721 
+332787.783726  7394657.381607 
+332744.119935  7394737.757840 
+332726.613187  7394771.852000 
+332731.049659  7394775.561364 
+332743.922025  7394787.569307 
+332759.020873  7394808.995637 
+332780.147716  7394841.380090 
+332812.101860  7394889.331876 
+333003.983401  7395244.701005 
+333055.472865  7395340.264636 
+333089.109240  7395412.862200 
+333099.087179  7395434.388513 
+333153.619502  7395514.324821 
+333200.021042  7395602.029798 
+333213.718031  7395626.335634 
+333219.548116  7395644.492524 
+333223.860895  7395658.210175 
+333227.151141  7395675.497213 
+333239.281346  7395834.849918 
+333244.831059  7395918.725551 
+333252.038265  7396000.001629 
+333260.902963  7396133.828705 
+333263.723174  7396222.513514 
+333226.928493  7396231.451983 
+333185.812787  7396242.400108 
+333078.718989  7396269.485469 
+332929.998220  7396307.788908 
+332916.062090  7396308.218834 
+332896.856619  7396295.920940 
+332818.270040  7396299.800276 
+332794.694067  7396302.709778 
+332685.670652  7396309.468620 
+332629.662253  7396310.678413 
+332556.006921  7396291.221745 
+332484.833704  7396236.451127 
+332453.027993  7396212.135292 
+332359.392044  7396139.707698 
+332277.358541  7396076.498526 
+332198.120511  7396013.299351 
+332181.141522  7396000.001629 
+332132.233128  7395962.258094 
+332053.440394  7395902.098399 
+331999.996573  7395867.714288 
+331982.126992  7395846.967842 
+331942.611054  7395642.872802 
+331874.051893  7395596.040824 
+331841.883347  7395554.207989 
+331836.449081  7395438.667780 
+331825.168237  7395322.887612 
+331823.362313  7395226.394141 
+331821.102846  7395148.427496 
+331827.798785  7395101.795483 
+331833.068126  7395065.111767 
+331835.855352  7395053.303789 
+331841.132940  7395038.176381 
+331842.831663  7394977.996689 
+331833.059880  7394948.131805 
+331819.131997  7394908.448602 
+331882.858867  7394780.830462 
+331947.773195  7394622.227629 
+Region 1
+97
+331982.126992  7395846.967842 
+331999.996573  7395867.714288 
+332053.440394  7395902.098399 
+332132.233128  7395962.258094 
+332181.141522  7396000.001629 
+332198.120511  7396013.299351 
+332277.358541  7396076.498526 
+332359.392044  7396139.707698 
+332453.027993  7396212.135292 
+332484.833704  7396236.451127 
+332556.006921  7396291.221745 
+332629.662253  7396310.678413 
+332685.670652  7396309.468620 
+332492.832548  7396624.534652 
+332439.479436  7396805.113720 
+332399.608911  7396868.092933 
+332328.617111  7396927.462763 
+332281.968184  7396961.047010 
+332224.120876  7396972.245092 
+332169.167995  7396976.304397 
+332016.959070  7397003.399756 
+331995.799242  7397004.029648 
+331968.693882  7397002.339937 
+331765.383065  7396968.455741 
+331762.670055  7397072.437930 
+331759.816860  7397168.441486 
+331704.319727  7397269.404192 
+331651.486128  7397365.547723 
+331604.202241  7397438.875163 
+331573.072720  7397497.215170 
+331509.568498  7397617.484569 
+331436.457417  7397744.902743 
+331363.659693  7397880.439527 
+331328.110193  7397965.235002 
+331299.471034  7397999.999047 
+331296.741531  7398008.977509 
+331274.542678  7398041.781890 
+331254.331167  7398071.996715 
+331236.445093  7398106.750762 
+331198.372246  7398138.695290 
+331139.568375  7398194.775684 
+331110.789030  7398177.908573 
+331066.622219  7398158.281935 
+331057.691551  7398153.602736 
+330981.331455  7398110.820065 
+330942.928759  7398062.308374 
+330871.334985  7397986.731320 
+330793.482321  7397889.997889 
+330734.769159  7397825.039016 
+330692.136147  7397777.527155 
+330657.411269  7397734.804473 
+330635.162939  7397701.900109 
+330607.991609  7397652.518568 
+330587.466741  7397611.735553 
+330578.197978  7397586.129939 
+330567.073813  7397547.076629 
+330551.719331  7397477.308579 
+330510.001650  7397294.999807 
+330498.926963  7397245.178341 
+330480.999657  7397149.084801 
+330476.084904  7397134.487302 
+330459.213116  7397083.336063 
+330458.149352  7396984.532987 
+330457.456669  7396919.554118 
+330458.767819  7396868.192915 
+330456.722754  7396819.181311 
+330460.450050  7396713.489415 
+330466.247150  7396616.925955 
+330429.559670  7396542.708668 
+330363.523855  7396390.924667 
+330293.109292  7396239.940529 
+330222.059769  7396074.118933 
+330213.722829  7396052.872572 
+330285.110448  7395986.443951 
+330362.567293  7395907.877409 
+330423.861525  7395852.816840 
+330470.469221  7395823.501862 
+330517.810831  7395795.986575 
+330600.330861  7395744.005479 
+330654.788968  7395703.852356 
+330729.062767  7395661.199662 
+330781.112975  7395641.623016 
+330853.061338  7395616.997234 
+330952.156291  7395579.213706 
+331010.110800  7395563.586383 
+331082.100394  7395564.196278 
+331134.488697  7395563.576384 
+331270.823628  7395558.717217 
+331370.034029  7395558.257296 
+331500.002871  7395553.918039 
+331590.546483  7395552.708246 
+331713.918340  7395552.948205 
+331806.003997  7395552.498282 
+331841.883347  7395554.207989 
+331874.051893  7395596.040824 
+331942.611054  7395642.872802 
+331982.126992  7395846.967842 
+Region 1
+219
+335156.216615  7400192.113558 
+335258.593568  7400348.396788 
+335292.353637  7400398.358230 
+335373.463561  7400535.854678 
+335400.956494  7400621.100076 
+335410.588092  7400678.850184 
+335425.711679  7400823.225454 
+335446.723074  7400938.995624 
+335449.089742  7400984.777782 
+335470.290801  7401032.279645 
+335482.891042  7401078.571716 
+335499.639136  7401130.622800 
+335525.449838  7401190.002629 
+335555.342424  7401264.669839 
+335593.266839  7401358.003851 
+335603.088100  7401380.769952 
+335672.521362  7401553.330394 
+335623.283119  7401573.077011 
+335496.522061  7401625.518029 
+335479.336916  7401617.959323 
+335466.967570  7401608.330973 
+335345.962382  7401691.516724 
+335334.961910  7401700.455193 
+335242.158831  7401759.575066 
+335176.156001  7401802.197765 
+335121.079426  7401837.441728 
+335046.220144  7401888.822927 
+335172.626614  7402004.713076 
+335221.320606  7402042.096673 
+335299.527857  7402188.171651 
+335333.469343  7402249.651120 
+335363.930919  7402293.653583 
+335314.783384  7402304.251768 
+335191.320819  7402326.877892 
+335135.246450  7402341.135450 
+335075.733404  7402353.433343 
+335019.659035  7402365.731237 
+335001.459604  7402367.700899 
+334969.002440  7402374.089805 
+334891.776490  7402389.337193 
+334793.704069  7402411.423410 
+334665.211303  7402435.339314 
+334607.965970  7402447.867168 
+334482.046028  7402473.942701 
+334377.640502  7402474.472610 
+334383.891145  7402451.776498 
+334381.227612  7402411.963318 
+334383.891145  7402300.952333 
+334379.256763  7402229.984489 
+334359.581257  7402151.287969 
+334277.110704  7402221.205993 
+334249.403369  7402244.242047 
+334197.270699  7402308.181095 
+334132.339879  7402341.135450 
+334108.318609  7402360.422146 
+334081.683284  7402366.711069 
+334022.656765  7402375.569552 
+333935.106534  7402371.140310 
+333895.763768  7402354.423174 
+333867.231810  7402319.499156 
+333798.136643  7402290.464129 
+333765.003289  7402271.497378 
+333742.952868  7402258.219653 
+333701.466081  7402224.075501 
+333563.259256  7402105.045890 
+333512.107887  7402089.308586 
+333449.147916  7402093.737827 
+333376.861458  7402093.727829 
+333242.818979  7402071.341663 
+333169.303833  7402072.081536 
+333080.269281  7402069.132042 
+333019.280159  7402056.344232 
+332971.080941  7402036.667603 
+332944.618786  7402024.779639 
+332919.327597  7402009.322287 
+332893.351971  7401985.846308 
+332871.548937  7401962.030387 
+332850.916868  7401934.405119 
+332837.417788  7401915.998272 
+332791.766655  7401840.901136 
+332769.576049  7401817.455152 
+332747.360703  7401798.968318 
+332686.585983  7401761.494737 
+332584.637834  7401705.004413 
+332547.999831  7401686.017666 
+332497.706070  7401666.161067 
+332390.439102  7401654.613045 
+332322.193297  7401649.483924 
+332273.260165  7401648.704057 
+332210.308440  7401645.144667 
+332096.526949  7401640.395480 
+332001.621081  7401630.527171 
+331951.780863  7401620.538882 
+331925.302216  7401611.560420 
+331904.117650  7401602.991887 
+331877.944114  7401587.154600 
+331848.043281  7401567.807914 
+331783.508280  7401512.197439 
+331754.151699  7401495.290336 
+331715.023335  7401484.622163 
+331626.961838  7401471.274449 
+331558.476892  7401457.046886 
+331390.558897  7401423.512630 
+331419.940217  7401353.414638 
+331445.140698  7401291.545235 
+331461.525958  7401252.471928 
+331482.479630  7401230.405708 
+331499.837946  7401204.040224 
+331509.271634  7401188.382906 
+331585.549267  7401091.649476 
+331665.240840  7400988.817090 
+331689.047708  7400963.191479 
+331709.869441  7400950.923581 
+331654.636188  7400835.513349 
+331703.668275  7400807.538141 
+331750.267724  7400781.452609 
+331800.940812  7400753.797347 
+331844.728297  7400724.142426 
+331865.459320  7400710.894695 
+331887.658173  7400696.707126 
+331932.913487  7400666.042378 
+331996.623865  7400626.879087 
+332030.219009  7400601.613414 
+332036.057340  7400580.637007 
+332051.683947  7400531.615404 
+332094.259236  7400400.557853 
+332099.413130  7400382.880881 
+332109.729165  7400346.787064 
+332122.989103  7400304.054383 
+332147.298991  7400223.768136 
+332182.642336  7400104.008649 
+332204.733988  7400048.868095 
+332227.097765  7399999.996466 
+332230.420996  7399994.147468 
+332242.889297  7399974.100902 
+332268.337165  7399932.238072 
+332290.239153  7399894.174592 
+332323.570418  7399841.403631 
+332437.838436  7399655.405491 
+332408.448870  7399636.028810 
+332393.003680  7399623.540949 
+332375.777304  7399606.983785 
+332356.299707  7399582.028060 
+332344.911663  7399567.770502 
+332322.119081  7399546.374167 
+332286.149023  7399519.348796 
+332261.583502  7399501.241898 
+332237.760142  7399486.194475 
+332216.987887  7399478.235839 
+332203.546531  7399473.656623 
+331999.996573  7399428.104426 
+331940.846361  7399415.636561 
+331868.493933  7399398.089567 
+331653.852796  7399351.307580 
+331630.260330  7399256.933746 
+331561.841354  7399202.673040 
+331571.275042  7399153.131526 
+331658.569640  7399122.466779 
+331490.833062  7399082.843566 
+331595.857056  7398431.905066 
+331543.237858  7398430.295341 
+331451.028507  7398392.191868 
+331325.083826  7398366.016352 
+331190.513588  7398378.574201 
+331166.014037  7398379.634019 
+331157.124600  7398323.783586 
+331542.536928  7398255.255324 
+331752.411744  7398227.770032 
+332221.201710  7398166.210577 
+333145.323794  7398119.288614 
+333595.650450  7398089.513714 
+334098.390147  7398060.788635 
+334304.290280  7398055.099609 
+334441.524051  7398082.554906 
+334606.209523  7398132.456359 
+334733.465354  7398142.434649 
+334783.082924  7398135.865775 
+334771.043428  7398197.235263 
+334762.492086  7398231.399410 
+334753.948991  7398257.025021 
+334748.259092  7398281.220877 
+334739.715997  7398302.577218 
+334726.901355  7398323.933560 
+334711.241763  7398343.860147 
+334645.131732  7398434.794571 
+334548.955944  7398558.803329 
+334534.731196  7398587.278452 
+334523.343151  7398614.323819 
+334517.653252  7398629.981137 
+334516.226654  7398647.068210 
+334513.381705  7398668.414554 
+334519.071604  7398691.190652 
+334519.071604  7398723.935044 
+334510.528509  7398968.773105 
+334514.668117  7398970.572797 
+334573.150384  7398996.638332 
+334697.421080  7399062.287087 
+334782.728336  7399107.689310 
+334796.845883  7399114.848084 
+334934.590920  7399186.895743 
+334971.534033  7399206.242429 
+335001.937886  7399222.069718 
+335015.882262  7399230.488276 
+335036.143250  7399247.815308 
+335047.778682  7399261.822908 
+335057.896807  7399278.110118 
+335069.260113  7399302.785892 
+335078.339213  7399332.290838 
+335083.072549  7399376.013348 
+335083.806463  7399388.971129 
+335087.286373  7399424.545035 
+335109.806829  7399709.466231 
+335110.293356  7399724.213705 
+335110.021231  7399736.661573 
+335100.002060  7399800.920566 
+335075.782881  7400000.986296 
+335064.856625  7400045.458679 
+335131.469677  7400128.174510 
+335156.216615  7400192.113558 
+Region 1
+169
+329337.247466  7384055.727575 
+329389.660508  7384135.743869 
+329418.192466  7384185.275384 
+329325.240955  7384299.225866 
+329294.177404  7384337.399327 
+329237.336136  7384404.307866 
+329207.138439  7384433.322896 
+329185.698240  7384455.779050 
+329163.969422  7384467.667013 
+329115.728972  7384500.821334 
+329067.719418  7384537.415066 
+329045.223700  7384559.041362 
+329029.423923  7384586.256700 
+328985.356066  7384745.199474 
+328971.403444  7384809.698426 
+328955.578927  7384871.227887 
+328935.524094  7384944.955258 
+328879.532188  7385055.116388 
+328846.736929  7385106.097656 
+328806.643755  7385165.677450 
+328750.503417  7385241.284500 
+328667.909171  7385322.490590 
+328566.142439  7385405.706336 
+328512.203844  7385445.219567 
+328429.551874  7385503.209634 
+328387.248711  7385548.991792 
+328337.119875  7385595.063900 
+328319.720328  7385617.080129 
+328313.519163  7385621.769326 
+328175.370061  7385781.361989 
+328138.723812  7385865.967497 
+328098.490452  7385935.395605 
+328019.277161  7386040.087672 
+327884.583229  7386123.873320 
+327838.288891  7386174.204699 
+327814.317098  7386188.692217 
+327793.099547  7386197.130772 
+327770.298719  7386203.059756 
+327742.583138  7386202.979770 
+327718.924702  7386193.261435 
+327699.026547  7386200.110261 
+327615.162382  7386198.190590 
+327550.627381  7386191.981654 
+327490.759746  7386188.902181 
+327460.586788  7386194.431234 
+327449.850196  7386192.871501 
+327415.257258  7386206.799116 
+327376.351542  7386222.096495 
+327327.335947  7386242.383020 
+327253.977479  7386281.536314 
+327176.561866  7386321.019551 
+327127.026759  7386347.694981 
+327067.678637  7386380.759318 
+327000.702751  7386416.073269 
+326979.559416  7386434.350138 
+326962.836060  7386453.616838 
+326924.392133  7386496.289529 
+326854.233202  7386589.153622 
+326763.062876  7386705.723654 
+326706.543212  7386745.806789 
+326616.106800  7386772.642192 
+326560.436497  7386791.488964 
+326475.186965  7386824.303343 
+326410.421069  7386736.738342 
+326342.389666  7386633.066100 
+326212.808398  7386526.164411 
+326054.076704  7386441.938838 
+325862.953816  7386380.389381 
+325644.890493  7386305.162267 
+325597.309742  7386279.966583 
+325450.724746  7386158.887323 
+325168.885075  7385841.411703 
+324995.252443  7385632.497488 
+324553.378174  7385115.766000 
+324455.866496  7385012.963609 
+324316.892771  7384827.445386 
+324180.838212  7384658.984242 
+324045.080517  7384462.247941 
+323987.744475  7384344.708075 
+323928.148966  7384066.155788 
+323921.807615  7383874.558607 
+323953.341201  7383679.621998 
+324019.278061  7383516.219987 
+324125.341079  7383355.677487 
+324269.394483  7383182.247194 
+324348.484081  7383072.525988 
+324485.470464  7382897.405985 
+324599.796206  7382757.349975 
+324623.660797  7382735.833661 
+324650.749665  7382703.469204 
+324700.227049  7382661.306426 
+324745.061805  7382623.522898 
+324804.228510  7382580.330297 
+324864.640396  7382538.017545 
+324964.658927  7382475.868190 
+325076.791171  7382399.131335 
+325111.738697  7382373.155784 
+325185.905295  7382317.925245 
+325277.240546  7382239.388697 
+325337.413291  7382165.011437 
+325414.235176  7382062.818942 
+325464.166102  7381997.030211 
+325543.808198  7381883.059733 
+325574.863503  7381821.520274 
+325675.096436  7381885.109382 
+325723.848152  7381832.018476 
+325775.716942  7381892.528111 
+325819.331256  7381952.747796 
+325833.869361  7381960.826412 
+325874.432569  7382009.048152 
+325902.032703  7382037.573266 
+325970.863991  7382108.621096 
+326039.142780  7382157.762679 
+326083.862089  7382197.585858 
+326137.462588  7382245.847591 
+326198.039399  7382307.826974 
+326243.286466  7382331.292955 
+326316.141914  7382347.000264 
+326423.458360  7382375.945306 
+326508.947033  7382405.470249 
+326564.427673  7382431.355815 
+326647.788818  7382470.839052 
+326665.419259  7382478.457747 
+326669.756777  7382480.637373 
+326755.286681  7382529.538997 
+326804.425969  7382556.034459 
+326932.926982  7382626.382409 
+327180.528303  7382767.468242 
+327277.800840  7382820.989074 
+327378.330637  7382888.947434 
+327405.493721  7382905.344625 
+327458.129411  7382945.517744 
+327554.593818  7383012.766225 
+327666.833263  7383082.854219 
+327693.617020  7383109.169712 
+327745.650735  7383142.234048 
+327811.620581  7383190.605762 
+327927.282212  7383286.069410 
+327999.997474  7383347.198939 
+328011.806076  7383355.327547 
+328042.449069  7383379.913336 
+328069.216334  7383385.992294 
+328109.260030  7383384.292585 
+328155.051348  7383375.564081 
+328248.423418  7383356.857285 
+328346.932889  7383334.361138 
+328402.867072  7383323.223046 
+328432.767904  7383315.324399 
+328488.908242  7383300.047016 
+328545.056827  7383269.132311 
+328576.499704  7383239.557377 
+328582.552438  7383233.858353 
+328636.491032  7383208.842638 
+328673.046573  7383210.022436 
+328723.958801  7383228.089342 
+328772.372421  7383294.108033 
+328844.370261  7383390.861460 
+328863.691179  7383416.697035 
+328885.988987  7383449.441426 
+328926.609919  7383502.902269 
+328969.457333  7383568.301066 
+329014.687908  7383623.311644 
+329064.107569  7383690.260176 
+329073.392824  7383703.307941 
+329148.903558  7383805.420450 
+329177.740627  7383845.093654 
+329208.111494  7383884.246948 
+329282.137907  7383981.070363 
+329337.247466  7384055.727575 
+Region 1
+239
+322073.266583  7401813.385849 
+322102.252084  7401807.756813 
+322136.193569  7401797.948493 
+322176.608345  7401773.282718 
+322202.930314  7401755.055840 
+322219.711393  7401743.287856 
+322250.610019  7401711.743259 
+322282.267299  7401682.098337 
+322351.296495  7401634.646465 
+322414.017326  7401595.343197 
+322459.338609  7401582.975316 
+322530.396379  7401561.349020 
+322599.417329  7401539.722725 
+322642.322467  7401394.177655 
+322685.450254  7401282.586770 
+322778.550198  7401112.815850 
+322839.209470  7401034.459272 
+322907.884079  7400952.313343 
+323098.223575  7400754.237271 
+323148.566813  7400696.057237 
+323211.130965  7400618.090592 
+323236.306707  7400586.136065 
+323267.601152  7400543.913298 
+323362.210157  7400397.778329 
+323442.495458  7400303.044556 
+323610.446438  7400065.355270 
+323889.193772  7399748.599528 
+324152.108344  7399463.518360 
+324347.552257  7399235.407433 
+324392.205596  7399056.798027 
+324343.082800  7399027.772999 
+324280.576371  7398954.105617 
+324166.712419  7398772.156784 
+324101.971262  7398696.249786 
+323992.576766  7398611.404319 
+323878.712813  7398544.435790 
+323748.999605  7398458.030591 
+323728.713878  7398532.747792 
+323743.070565  7398541.736253 
+323786.709618  7398579.659757 
+323806.566541  7398597.366724 
+323818.498837  7398619.242976 
+323818.836933  7398640.789286 
+323806.566541  7398658.686220 
+323786.676633  7398674.933437 
+323790.659562  7398636.480024 
+323778.727267  7398615.593602 
+323760.173248  7398607.634965 
+323738.634093  7398607.974907 
+323705.071935  7398620.162819 
+323683.351363  7398683.611951 
+323671.773655  7398722.585275 
+323655.990370  7398757.779246 
+323633.370959  7398796.822559 
+323619.022518  7398818.258887 
+323600.880810  7398842.014818 
+323563.830496  7398887.996941 
+323539.199005  7398909.883192 
+323512.679127  7398932.529313 
+323489.952516  7398952.495893 
+323458.855980  7398976.321812 
+323417.863967  7398998.288049 
+323386.371612  7399017.544751 
+323336.251023  7399042.230522 
+323290.649367  7399060.407409 
+323253.409390  7399072.815284 
+323224.506351  7399080.224015 
+323196.007378  7399089.912355 
+323152.656943  7399100.450550 
+323118.797920  7399107.119408 
+323082.283611  7399112.658459 
+323033.202046  7399119.787238 
+322955.530800  7399123.646577 
+322869.143288  7399131.745189 
+322758.734505  7399139.843802 
+322580.162381  7399152.961555 
+322464.888323  7399161.410108 
+322392.972945  7399167.499065 
+322193.109053  7399181.566655 
+322094.170778  7399192.034862 
+321966.222263  7399200.423425 
+321908.779020  7399203.722860 
+321879.859489  7399206.542377 
+321759.951050  7399215.590827 
+321670.273291  7399221.439826 
+321568.201448  7399228.868553 
+321436.335974  7399243.815993 
+321339.813844  7399265.572266 
+321260.963387  7399303.635746 
+321202.720260  7399351.847488 
+321113.496044  7399453.210125 
+321044.796697  7399541.534996 
+320963.241476  7399650.296366 
+320901.411238  7399755.218394 
+320873.505994  7399825.656329 
+320857.203196  7399889.555383 
+320866.076140  7399938.087070 
+320862.893095  7399944.915901 
+320848.124096  7400288.097117 
+320836.678328  7400380.111356 
+320829.141273  7400428.203118 
+320811.123259  7400473.505358 
+320790.466451  7400507.589520 
+320771.063070  7400550.142231 
+320754.413931  7400594.194685 
+320693.886598  7400620.600162 
+320651.492726  7400648.615363 
+320599.071438  7400661.123221 
+320519.247925  7400668.371979 
+320401.681415  7400673.761056 
+320114.737327  7400659.133562 
+320064.121963  7400654.034435 
+319955.618060  7400676.660559 
+319878.598266  7400706.155507 
+319793.307503  7400752.737528 
+319724.171105  7400814.606930 
+319686.659002  7400863.178611 
+319632.967794  7400964.561245 
+319619.592408  7401009.053623 
+319504.029731  7401386.588955 
+319411.309114  7401537.023187 
+319367.051594  7401603.181855 
+319310.070140  7401670.730284 
+319248.462551  7401745.287513 
+319220.928387  7401818.165030 
+319183.886319  7401872.285760 
+319161.522542  7401936.154819 
+319144.263181  7401997.034391 
+319141.649126  7402069.651953 
+319147.693613  7402142.369497 
+319168.309189  7402235.913473 
+319193.682841  7402307.811158 
+319206.448006  7402364.951370 
+319210.150564  7402411.413412 
+319223.410503  7402471.583105 
+319235.128396  7402533.752456 
+319236.200406  7402590.782688 
+319235.318060  7402638.194566 
+319218.281347  7402670.319064 
+319198.556363  7402721.580283 
+319185.972615  7402769.392093 
+319151.569341  7402810.924979 
+319112.993474  7402867.045366 
+319053.686583  7402905.808726 
+319076.940954  7402940.782736 
+319089.722611  7402957.949795 
+319251.868245  7402978.646250 
+319392.161367  7402959.099598 
+319553.160774  7403009.700931 
+319801.990783  7403122.831552 
+320024.746212  7403086.307809 
+320154.047108  7403020.469086 
+320162.441771  7402998.272888 
+320167.793575  7402987.434745 
+320179.701132  7402972.937228 
+320191.625181  7402969.117882 
+320205.957130  7402973.797081 
+320228.700234  7402978.326305 
+320255.508730  7402983.415433 
+320273.749393  7402984.805195 
+320298.504577  7402985.275115 
+320315.302149  7402983.895351 
+320337.608203  7402978.886209 
+320436.727895  7402942.572429 
+320477.307596  7402925.625332 
+320500.182640  7402922.055943 
+320515.182533  7402910.117988 
+320551.746320  7402899.129871 
+320563.282797  7402896.090391 
+320583.428338  7402897.310182 
+320591.023117  7402898.150038 
+320613.700251  7402903.089192 
+320633.854039  7402904.129014 
+320663.136404  7402905.098848 
+320684.469402  7402905.048857 
+320702.058612  7402904.139013 
+320734.392083  7402893.740794 
+320783.655065  7402888.311724 
+320830.163805  7402903.879057 
+320970.762038  7402996.433203 
+320965.764822  7402952.980646 
+320955.374572  7402859.886593 
+320943.780371  7402760.803565 
+320967.983058  7402641.923928 
+320956.413597  7402398.905554 
+320935.740296  7402369.620571 
+320911.653057  7402335.736375 
+320906.845504  7402318.099396 
+320935.740296  7402205.548675 
+320921.136222  7402173.344191 
+320849.410508  7402100.326698 
+320797.805596  7402084.789360 
+320773.751342  7402068.752107 
+320765.736005  7402062.343205 
+320751.305102  7402033.478149 
+320746.497549  7402003.013367 
+320749.705333  7401972.548586 
+320780.166909  7401932.455453 
+320828.522806  7401898.461276 
+320872.607155  7401918.327873 
+320932.227402  7401834.502232 
+320995.566700  7401836.361913 
+321014.186689  7401843.190743 
+321025.368577  7401847.539998 
+321039.032581  7401850.019574 
+321050.832938  7401846.920105 
+321054.560234  7401836.981807 
+321104.853994  7401830.772870 
+321150.373188  7401833.722365 
+321168.820006  7401818.354997 
+321208.550345  7401796.478745 
+321237.758494  7401781.761266 
+321267.626341  7401764.254264 
+321278.956662  7401756.015676 
+321302.648083  7401743.657792 
+321368.568451  7401720.991675 
+321436.550376  7401702.454850 
+321473.633675  7401691.126791 
+321494.216267  7401690.096967 
+321517.899441  7401704.144561 
+321533.369370  7401728.200440 
+321559.122348  7401735.409205 
+321583.836302  7401740.558323 
+321594.144090  7401735.409205 
+321620.919601  7401710.693439 
+321677.571205  7401693.186438 
+321744.514106  7401672.579967 
+321788.796364  7401708.633792 
+321834.125894  7401746.747263 
+321863.573184  7401754.785886 
+321884.164022  7401759.805027 
+321908.276000  7401775.582324 
+321916.942789  7401784.310829 
+321930.276944  7401797.318601 
+321947.437350  7401803.467548 
+321976.043524  7401805.457207 
+322011.122989  7401806.327058 
+322045.245891  7401815.905417 
+322073.266583  7401813.385849 
+Region 1
+355
+343659.482271  7390595.647346 
+343657.057879  7390606.285523 
+343648.292136  7390625.042311 
+343623.965756  7390672.784133 
+343581.283266  7390750.190874 
+343537.767907  7390829.067363 
+343523.873008  7390860.571967 
+343496.000748  7390918.891977 
+343475.591328  7390947.437087 
+343437.444265  7390999.768123 
+343408.961784  7391033.782297 
+343373.362806  7391080.464301 
+343339.635723  7391127.716207 
+343317.519332  7391155.361472 
+343282.769716  7391190.905383 
+343256.827075  7391203.183280 
+343211.687208  7391219.330514 
+343161.929452  7391237.497403 
+343064.780609  7391314.114279 
+342971.581710  7391382.822510 
+342888.649369  7391443.642092 
+342883.916032  7391447.591415 
+342864.166310  7391465.758304 
+342828.699272  7391490.654039 
+342812.223303  7391514.969874 
+342768.221416  7391525.878006 
+342747.102820  7391532.316903 
+342627.400536  7391563.001647 
+342477.888128  7391601.765007 
+342316.039359  7391641.988117 
+342167.532991  7391680.431532 
+342024.733015  7391717.365206 
+341884.794481  7391742.980818 
+341733.146299  7391770.296139 
+341619.298839  7391797.421493 
+341566.572440  7391810.609234 
+341513.582162  7391822.747155 
+341459.742522  7391838.884390 
+341392.337833  7391855.461551 
+341213.452352  7391901.733625 
+341113.219418  7391926.309415 
+341092.612088  7391744.560547 
+341093.214062  7391743.520725 
+341085.932641  7391678.021945 
+341078.148199  7391636.499057 
+341072.103712  7391551.963537 
+341067.032280  7391500.942277 
+341059.379778  7391432.014084 
+341046.804276  7391322.802791 
+340930.705595  7391331.491302 
+340843.542937  7391339.929857 
+340804.777407  7391332.021212 
+340725.349713  7391314.904144 
+340691.870017  7391304.655899 
+340626.164051  7391286.219057 
+340596.609560  7391278.570367 
+340568.176557  7391268.302126 
+340506.552476  7391251.325034 
+340511.310551  7391223.279838 
+340529.221364  7391147.782770 
+340410.277733  7391129.335930 
+340349.915324  7391121.197324 
+340314.423548  7391117.457964 
+340232.505492  7391111.129048 
+340266.917013  7391014.555590 
+340275.567309  7390995.018937 
+340324.607643  7390861.331836 
+340338.057245  7390822.568476 
+340382.355996  7390706.278396 
+340561.925914  7390371.665712 
+340624.424096  7390291.769397 
+340644.198558  7390268.033463 
+340682.172450  7390220.571593 
+340717.771427  7390174.689452 
+340743.087355  7390150.953518 
+340808.743844  7390075.806390 
+340813.378225  7390063.258539 
+340841.967907  7390023.595333 
+340878.589417  7389978.523053 
+340921.238922  7389933.500765 
+340952.962172  7389897.946855 
+341001.012958  7389875.840642 
+341145.124084  7389816.100875 
+341187.410755  7389796.864170 
+341263.968761  7389722.146968 
+341284.089563  7389697.291226 
+341296.895959  7389736.724471 
+341350.117132  7389721.037158 
+341339.322816  7389695.031613 
+341336.510852  7389677.084687 
+341370.650246  7389672.065547 
+341391.974999  7389670.485817 
+341413.299751  7389658.637847 
+341517.556845  7389562.274353 
+341544.414819  7389541.737871 
+341564.947933  7389529.889900 
+341673.154971  7389469.080316 
+341763.195564  7389422.478299 
+341766.139468  7389367.297751 
+341765.141674  7389326.894672 
+341764.267574  7389305.918265 
+341762.791499  7389276.763259 
+341758.998232  7389243.728917 
+341755.460600  7389222.722515 
+341750.760248  7389203.965728 
+341835.127434  7389156.403875 
+341819.459596  7389102.823053 
+341806.372828  7389056.141049 
+341797.623577  7389026.666098 
+341787.670376  7388999.930678 
+341756.870705  7388954.908389 
+341726.071033  7388909.896100 
+341707.904587  7388880.671106 
+341695.263116  7388849.866382 
+341669.839987  7388842.297679 
+341672.363333  7388794.575853 
+341674.730001  7388702.171681 
+341673.938363  7388533.150633 
+341681.294001  7388514.493828 
+341691.321418  7388493.227471 
+341712.456507  7388464.112458 
+341738.316686  7388451.324649 
+341795.595004  7388523.822231 
+341822.057158  7388549.687800 
+341833.577142  7388560.225995 
+341850.613855  7388570.484238 
+341856.905729  7388573.763676 
+341878.791225  7388578.432876 
+341897.749309  7388580.742481 
+341939.269081  7388582.522176 
+341980.203370  7388581.972270 
+341993.595248  7388579.682662 
+342013.262508  7388572.913822 
+342034.735693  7388559.856058 
+342061.898777  7388539.109612 
+342073.773349  7388526.611753 
+342080.790891  7388519.372993 
+342097.448277  7388526.531766 
+342109.124940  7388531.980833 
+342119.853286  7388540.289410 
+342125.831803  7388544.448697 
+342134.366652  7388548.308036 
+342147.535882  7388557.306495 
+342165.520911  7388564.485265 
+342189.830799  7388571.724025 
+342203.503049  7388572.423906 
+342216.911420  7388568.804526 
+342231.581465  7388561.435788 
+342245.921660  7388547.408191 
+342275.204025  7388510.514510 
+342300.717862  7388472.251064 
+342332.853423  7388426.528896 
+342354.136944  7388393.084625 
+342377.399561  7388355.461069 
+342398.641851  7388325.676171 
+342416.585649  7388308.929040 
+342448.762441  7388296.651143 
+342459.028998  7388290.452205 
+342470.573721  7388280.493911 
+342509.809287  7388256.887954 
+342544.245546  7388233.671931 
+342613.629330  7388188.009752 
+342652.271167  7388162.624101 
+342677.174784  7388143.957298 
+342706.283978  7388122.450982 
+342800.109590  7388062.331280 
+342837.498000  7388039.365214 
+342878.993033  7388014.559463 
+342908.737187  7387991.843354 
+342949.053008  7387962.928307 
+342968.472881  7387950.290471 
+343020.283949  7387915.526426 
+343068.829508  7387880.052502 
+343142.633273  7387830.670961 
+343178.446652  7387803.035695 
+343199.202415  7387789.637990 
+343211.909856  7387784.458877 
+343224.905916  7387781.499384 
+343237.390709  7387778.419911 
+343263.935326  7387757.883429 
+343295.320479  7387724.229194 
+343313.536403  7387710.131608 
+343334.300412  7387696.513941 
+343358.156757  7387688.575301 
+343377.584876  7387685.015911 
+343385.888831  7387681.896445 
+343391.949810  7387677.857137 
+343400.938201  7387667.548902 
+343411.534608  7387650.051900 
+343426.031481  7387630.605231 
+343439.843918  7387617.907406 
+343451.330917  7387612.268371 
+343463.403399  7387609.968765 
+343479.829890  7387610.358699 
+343509.862662  7387616.447656 
+343632.310941  7387646.112574 
+343655.128261  7387650.121888 
+343680.089601  7387653.601292 
+343700.103203  7387652.811427 
+343721.378478  7387648.062240 
+343747.848879  7387634.724525 
+343761.265496  7387630.435260 
+343781.938796  7387625.006190 
+343790.580846  7387618.127368 
+343799.247634  7387599.940483 
+343806.759950  7387584.633105 
+343812.227201  7387579.264025 
+343819.772502  7387580.003898 
+343825.454155  7387582.943395 
+343832.727331  7387589.892204 
+343843.298998  7387602.959966 
+343853.392385  7387613.808108 
+343871.327936  7387625.296140 
+343889.296473  7387634.354588 
+343916.055491  7387651.031732 
+343928.325883  7387658.470457 
+343940.423103  7387662.699733 
+343955.612660  7387664.409440 
+343977.753789  7387664.979343 
+343989.166572  7387666.319113 
+344002.789345  7387671.228272 
+344014.160897  7387676.327399 
+344024.806781  7387683.086241 
+344034.652780  7387687.955407 
+344040.952901  7387690.904902 
+344047.871488  7387692.524624 
+344062.442578  7387694.234331 
+344076.758034  7387692.174684 
+344105.380701  7387687.495486 
+344121.823685  7387685.675797 
+344151.040080  7387682.886275 
+344210.041860  7387681.306546 
+344234.747567  7387680.566673 
+344257.251531  7387685.575815 
+344280.044112  7387691.244844 
+344298.400221  7387692.654602 
+344315.552381  7387691.844741 
+344328.251576  7387687.885419 
+344340.035440  7387683.356195 
+344349.535098  7387682.126405 
+344356.577379  7387682.206392 
+344363.487720  7387684.825943 
+344372.591559  7387692.454636 
+344377.324895  7387698.593585 
+344383.921880  7387701.763042 
+344390.815728  7387705.932328 
+344400.636989  7387713.351057 
+344410.367541  7387719.769957 
+344418.589033  7387723.619298 
+344427.132128  7387726.478808 
+344438.256293  7387726.268844 
+344447.475579  7387722.929416 
+344452.860368  7387716.010601 
+344461.263277  7387703.252787 
+344470.243422  7387693.274496 
+344479.479200  7387688.605296 
+344491.963993  7387685.305861 
+344504.935314  7387684.116065 
+344531.867504  7387684.735958 
+344557.249401  7387687.555475 
+344581.617013  7387689.695109 
+344618.065353  7387687.865422 
+344628.884407  7387688.315345 
+344640.882673  7387692.214677 
+344663.510330  7387698.673571 
+344654.117873  7387748.874972 
+344643.826577  7387769.441449 
+344625.643638  7387801.086029 
+344607.435961  7387817.693184 
+344584.503194  7387839.849389 
+344582.919917  7387844.588577 
+344545.745910  7387891.260583 
+344527.546479  7387923.695027 
+344507.772018  7387941.102045 
+344482.621014  7387943.091704 
+344469.798125  7387959.298928 
+344455.342483  7387976.805930 
+344449.512398  7387993.163128 
+344443.632836  7388015.229348 
+344447.186961  7388048.063724 
+344452.373840  7388067.560384 
+344458.278141  7388091.256325 
+344464.957588  7388113.822460 
+344472.057593  7388130.669574 
+344479.190582  7388143.687344 
+344488.550054  7388164.373801 
+344512.521846  7388204.886861 
+344534.168202  7388220.074260 
+344561.751843  7388247.759518 
+344582.078802  7388276.164652 
+344586.548259  7388288.412554 
+344592.889610  7388305.999542 
+344609.002745  7388338.943899 
+344613.488695  7388350.041998 
+344621.330860  7388369.948588 
+344635.588593  7388396.004125 
+344655.511486  7388429.358411 
+344678.468992  7388462.742693 
+344742.723621  7388539.519542 
+344707.908035  7388601.258966 
+344673.249128  7388648.450883 
+344664.409169  7388659.439001 
+344647.784768  7388685.894469 
+344617.999383  7388724.997771 
+344611.699262  7388735.276010 
+344588.453138  7388761.841460 
+344573.989250  7388775.309153 
+344560.407708  7388785.597391 
+344548.112578  7388790.206601 
+344534.308388  7388794.015949 
+344514.509188  7388794.235911 
+344493.769918  7388786.457244 
+344471.562819  7388776.338977 
+344431.436661  7388767.270530 
+344403.572647  7388770.320008 
+344380.408985  7388786.367259 
+344317.910803  7388845.687098 
+344291.803237  7388866.263573 
+344247.487993  7388878.311510 
+344275.343761  7388937.651345 
+344297.361196  7388985.803097 
+344315.057607  7389024.316500 
+344326.618823  7389052.931599 
+344277.578489  7389086.155908 
+344232.479854  7389121.769808 
+344188.189349  7389145.835685 
+344160.490260  7389157.373709 
+344091.667219  7389207.995038 
+343954.177816  7389319.795887 
+343933.636455  7389312.687105 
+343899.678477  7389324.535076 
+343849.920722  7389339.542505 
+343759.088491  7389370.347229 
+343684.847676  7389396.412764 
+343647.723146  7389408.260734 
+343556.280694  7389407.100933 
+343424.959471  7389450.123564 
+343346.801697  7389492.776258 
+343297.827333  7389533.839224 
+343254.386190  7389578.071647 
+343272.931963  7389623.483868 
+343300.194002  7389686.283112 
+343359.500892  7389827.928849 
+343368.093465  7389852.134703 
+343425.091411  7389976.823345 
+343456.517796  7390055.299902 
+343478.238368  7390108.400807 
+343542.657921  7390260.874689 
+343554.285107  7390292.379293 
+343578.949582  7390359.227842 
+343591.219974  7390388.512826 
+343627.915700  7390476.117820 
+343666.491567  7390554.604376 
+343664.232100  7390573.751096 
+343659.482271  7390595.647346 
+Region 1
+938
+350975.719518  7389606.286814 
+350975.348438  7389612.595734 
+350973.633222  7389621.214257 
+350969.336935  7389632.132387 
+350963.267710  7389646.799875 
+350957.149007  7389656.038292 
+350951.178736  7389661.067431 
+350945.546560  7389662.677155 
+350933.779189  7389665.876607 
+350930.291033  7389667.616309 
+350926.992541  7389670.685783 
+350922.927149  7389679.274312 
+350918.111351  7389690.852329 
+350916.396135  7389699.260889 
+350915.051999  7389711.088863 
+350916.800200  7389719.747379 
+350919.834813  7389722.546900 
+350925.236094  7389723.376758 
+350929.004621  7389724.076638 
+350932.764903  7389725.116460 
+350934.579073  7389727.456059 
+350936.657123  7389734.014936 
+350936.995219  7389740.773778 
+350939.724721  7389753.091668 
+350939.155731  7389759.400587 
+350936.558169  7389764.029794 
+350931.429013  7389766.519368 
+350926.002993  7389767.909130 
+350917.517622  7389769.038936 
+350905.379171  7389768.908958 
+350898.229689  7389769.168914 
+350894.642578  7389770.468691 
+350891.550242  7389773.538166 
+350890.585433  7389777.957409 
+350889.101111  7389783.256501 
+350889.035141  7389789.785383 
+350891.335840  7389795.014487 
+350894.065342  7389807.112415 
+350894.222020  7389811.991579 
+350892.836654  7389817.840577 
+350888.062086  7389824.999351 
+350880.945589  7389832.448075 
+350871.899474  7389838.896970 
+350862.259630  7389843.226229 
+350855.192611  7389845.695806 
+350849.379018  7389845.635816 
+350841.833717  7389844.565999 
+350833.199914  7389841.046602 
+350826.908040  7389836.997296 
+350818.051588  7389835.247595 
+350812.633814  7389835.627530 
+350808.337528  7389836.807328 
+350805.039036  7389840.316727 
+350803.340313  7389846.275706 
+350802.350765  7389853.794418 
+350801.715805  7389865.422427 
+350800.190252  7389875.480704 
+350797.139147  7389883.759286 
+350792.991293  7389890.248174 
+350791.102906  7389895.657248 
+350789.923695  7389900.956340 
+350791.696635  7389907.285256 
+350797.287579  7389909.454884 
+350809.203383  7389911.894466 
+350825.217562  7389913.284228 
+350848.364732  7389914.843961 
+350855.695631  7389916.803625 
+350859.645575  7389919.613144 
+350861.253590  7389922.282687 
+350860.931987  7389923.832422 
+350859.991917  7389925.932062 
+350855.951264  7389931.311140 
+350851.217928  7389935.690390 
+350844.109677  7389941.939320 
+350836.811763  7389947.178423 
+350813.202804  7389960.446150 
+350797.617428  7389967.045020 
+350785.858304  7389969.464605 
+350778.395465  7389970.384448 
+350769.423566  7389969.524595 
+350760.369205  7389966.665085 
+350754.794753  7389962.945722 
+350746.185688  7389956.766780 
+350742.219251  7389954.847109 
+350736.158271  7389949.138087 
+350729.157222  7389944.858820 
+350716.062207  7389937.750038 
+350701.804475  7389934.830538 
+350691.537917  7389931.181163 
+350679.135587  7389925.962057 
+350672.332446  7389922.902581 
+350657.604678  7389915.773802 
+350646.241372  7389908.794997 
+350632.247519  7389900.566407 
+350625.436133  7389897.396950 
+350619.333922  7389895.787225 
+350613.330666  7389893.837559 
+350606.296631  7389892.767743 
+350599.674908  7389891.597943 
+350594.809632  7389888.778426 
+350589.936110  7389886.068890 
+350584.592552  7389879.809962 
+350577.096728  7389874.310904 
+350568.446433  7389871.891319 
+350563.762574  7389870.411572 
+350560.694976  7389871.371408 
+350558.839574  7389873.011127 
+350557.874765  7389877.100426 
+350557.833534  7389881.089743 
+350557.792303  7389885.738947 
+350557.239805  7389889.498303 
+350555.788469  7389891.367982 
+350553.025981  7389892.007873 
+350547.113434  7389891.937885 
+350542.215173  7389891.887893 
+350539.658841  7389892.087859 
+350536.780907  7389893.717580 
+350532.781485  7389896.227150 
+350527.635837  7389899.936515 
+350525.483571  7389901.136309 
+350524.559993  7389901.786198 
+350521.492395  7389901.976165 
+350519.158712  7389900.516415 
+350515.225260  7389895.827219 
+350510.805280  7389889.468308 
+350503.655798  7389879.649990 
+350496.893889  7389872.601197 
+350486.149051  7389865.182468 
+350477.325584  7389859.553432 
+350469.384464  7389857.373805 
+350458.590148  7389855.594110 
+350451.358204  7389853.644444 
+350448.109189  7389852.274679 
+350446.913485  7389849.715117 
+350443.887119  7389845.705804 
+350436.729390  7389836.987297 
+350430.651918  7389832.498066 
+350421.102783  7389828.858690 
+350406.127628  7389825.489267 
+350390.938072  7389824.339464 
+350377.241083  7389826.079166 
+350370.470927  7389829.118645 
+350365.185093  7389836.927308 
+350360.196124  7389846.175723 
+350357.441883  7389855.784078 
+350355.281370  7389867.832014 
+350354.596933  7389884.659132 
+350356.444089  7389913.354216 
+350359.247807  7389938.299943 
+350364.137822  7389959.396330 
+350367.988812  7389971.724218 
+350368.467093  7389975.493572 
+350367.502284  7389979.912815 
+350364.607857  7389983.212250 
+350358.027365  7389987.791466 
+350352.568360  7389993.270527 
+350347.043386  7390003.958697 
+350345.550818  7390010.037655 
+350344.017019  7390020.765818 
+350343.299597  7390031.164037 
+350341.807029  7390037.242995 
+350340.083567  7390045.861519 
+350338.541522  7390057.029606 
+350337.535482  7390065.218203 
+350332.975316  7390071.927054 
+350325.669156  7390077.946023 
+350306.241037  7390091.473706 
+350289.509435  7390100.822105 
+350279.853099  7390107.041040 
+350268.976320  7390112.580091 
+350260.268301  7390115.479594 
+350252.698261  7390117.499248 
+350244.534493  7390117.419262 
+350235.875951  7390115.669562 
+350225.815549  7390111.140337 
+350220.455499  7390106.651106 
+350216.332384  7390101.072062 
+350208.861299  7390092.363554 
+350202.198345  7390085.534723 
+350193.061521  7390081.015497 
+350182.052803  7390079.455765 
+350171.909939  7390082.895175 
+350162.657669  7390089.564033 
+350151.846860  7390098.752459 
+350142.380187  7390106.071206 
+350136.426409  7390110.000533 
+350125.368214  7390112.990021 
+350106.863672  7390116.449428 
+350099.483296  7390119.698871 
+350091.682361  7390123.608202 
+350084.928699  7390125.637854 
+350075.503257  7390129.197244 
+350065.170730  7390131.196902 
+350036.292430  7390130.457029 
+350008.634573  7390130.836963 
+349984.613303  7390133.686475 
+349952.411772  7390139.335508 
+349924.465296  7390147.244153 
+349910.702337  7390155.962660 
+349896.650760  7390162.351565 
+349877.321596  7390166.360879 
+349867.714737  7390167.710647 
+349861.571295  7390169.190394 
+349855.955612  7390169.690308 
+349854.339351  7390167.790634 
+349853.869316  7390163.581355 
+349851.816004  7390154.922838 
+349848.402065  7390149.783718 
+349841.392769  7390146.614261 
+349834.870000  7390145.884386 
+349825.147694  7390148.333966 
+349797.168234  7390159.672024 
+349785.598772  7390163.101437 
+349776.198069  7390164.221245 
+349766.805613  7390164.561187 
+349758.856246  7390163.481372 
+349753.042654  7390162.541533 
+349738.075745  7390158.842166 
+349719.760867  7390153.343108 
+349712.347505  7390150.493596 
+349709.106737  7390147.364133 
+349706.303018  7390142.674936 
+349703.309637  7390135.676135 
+349701.924270  7390131.666821 
+349695.863290  7390125.517875 
+349681.267462  7390115.619570 
+349670.497885  7390110.860385 
+349659.299504  7390107.640937 
+349648.496942  7390106.201183 
+349637.282068  7390105.091373 
+349624.854998  7390103.191699 
+349616.204702  7390100.442170 
+349597.188894  7390093.493360 
+349582.032323  7390088.684184 
+349571.732780  7390088.134278 
+349563.049500  7390088.714179 
+349556.691656  7390091.193754 
+349553.607566  7390093.483362 
+349550.713139  7390097.442684 
+349549.731837  7390103.301680 
+349550.375043  7390110.510445 
+349555.693862  7390119.418919 
+349560.542646  7390123.898152 
+349565.407922  7390126.827650 
+349568.962047  7390128.857303 
+349571.089574  7390130.766975 
+349571.056590  7390133.316539 
+349568.896077  7390135.726126 
+349562.529987  7390139.095549 
+349551.125450  7390146.174336 
+349534.665974  7390158.852165 
+349529.437864  7390161.121776 
+349525.240532  7390162.521536 
+349522.585246  7390162.491541 
+349518.923919  7390161.571699 
+349515.386286  7390158.212274 
+349510.553995  7390151.623403 
+349504.996036  7390146.474285 
+349500.749227  7390142.444975 
+349495.859212  7390141.505136 
+349490.639348  7390142.564955 
+349486.227615  7390145.284489 
+349483.316695  7390149.903698 
+349482.360133  7390153.443091 
+349482.327148  7390157.202447 
+349485.543178  7390161.891644 
+349495.380931  7390168.300546 
+349502.579890  7390172.809774 
+349506.735991  7390175.179368 
+349509.968513  7390178.868736 
+349510.636458  7390182.858053 
+349510.372578  7390188.947010 
+349508.459453  7390196.345742 
+349506.735991  7390204.964266 
+349506.628790  7390215.712425 
+349507.873970  7390223.031171 
+349511.757945  7390232.819495 
+349515.963523  7390240.278217 
+349518.445638  7390247.396998 
+349519.789774  7390255.495611 
+349518.297206  7390262.004496 
+349514.940990  7390270.393059 
+349509.457247  7390277.751798 
+349499.578262  7390285.400488 
+349486.112168  7390294.568918 
+349474.913786  7390302.207609 
+349460.878702  7390307.376724 
+349452.591240  7390308.956453 
+349447.181713  7390308.896464 
+349441.384613  7390307.176758 
+349435.092739  7390303.567376 
+349428.339076  7390295.638734 
+349423.729433  7390287.390147 
+349421.684368  7390277.851781 
+349422.451267  7390272.432709 
+349425.164277  7390266.253768 
+349431.233503  7390262.104479 
+349443.949190  7390256.365462 
+349449.185547  7390253.106020 
+349450.851285  7390250.346493 
+349452.112959  7390246.377173 
+349452.558255  7390242.727798 
+349451.477999  7390238.508520 
+349448.666034  7390234.269246 
+349438.894251  7390231.839663 
+349426.863000  7390230.499892 
+349414.741041  7390228.270274 
+349406.082499  7390226.410593 
+349398.339289  7390225.330778 
+349390.348691  7390227.800355 
+349383.463089  7390232.599532 
+349378.886431  7390241.188061 
+349373.460411  7390252.656097 
+349369.799084  7390260.924681 
+349365.073994  7390263.974158 
+349359.862376  7390265.023978 
+349353.512779  7390266.623704 
+349350.535890  7390268.693350 
+349344.326478  7390276.831956 
+349335.915323  7390290.699580 
+349328.370022  7390299.918001 
+349322.424489  7390302.187613 
+349317.320073  7390302.907489 
+349310.690103  7390302.067633 
+349302.336671  7390300.427914 
+349294.799617  7390299.348099 
+349285.613316  7390298.818190 
+349273.458372  7390300.347928 
+349256.776247  7390304.607198 
+349234.165083  7390310.136251 
+349221.457641  7390314.765458 
+349212.230109  7390318.544811 
+349205.855773  7390323.134025 
+349200.380276  7390329.382954 
+349197.551819  7390336.661708 
+349195.432537  7390354.358676 
+349197.230216  7390367.896357 
+349197.848683  7390377.204763 
+349196.760181  7390383.503684 
+349196.009774  7390387.263040 
+349193.939970  7390390.012569 
+349190.657970  7390391.852254 
+349182.890021  7390392.442153 
+349170.454705  7390390.872422 
+349162.703248  7390390.572473 
+349154.729143  7390391.932240 
+349142.953526  7390395.571617 
+349132.629245  7390397.241331 
+349125.570471  7390398.161173 
+349120.367100  7390398.551106 
+349117.109839  7390397.081358 
+349113.671161  7390394.271839 
+349106.694849  7390387.662972 
+349104.072548  7390385.093412 
+349101.532709  7390383.963605 
+349097.055006  7390382.473860 
+349094.003900  7390381.444037 
+349091.257906  7390380.314230 
+349088.709820  7390380.284235 
+349085.122710  7390381.683996 
+349081.098549  7390386.073244 
+349065.925485  7390402.420444 
+349054.595164  7390412.378738 
+349048.212582  7390417.407876 
+349040.634296  7390419.877453 
+349033.789924  7390420.247390 
+349029.609085  7390420.207397 
+349022.072030  7390418.357714 
+349014.460760  7390414.508373 
+349006.931951  7390411.668860 
+348995.436705  7390408.219450 
+348964.744235  7390405.359940 
+348949.727849  7390406.639721 
+348928.765931  7390410.079132 
+348912.792982  7390415.118269 
+348902.452209  7390418.667661 
+348896.094365  7390421.707140 
+348889.505627  7390427.176203 
+348875.470542  7390441.533744 
+348858.639985  7390460.410511 
+348852.216172  7390467.849236 
+348840.358092  7390481.266938 
+348834.123942  7390491.945109 
+348828.598967  7390503.513127 
+348788.629487  7390555.384242 
+348756.188816  7390604.435840 
+348721.703079  7390653.607418 
+348708.443140  7390667.345065 
+348686.433951  7390682.262509 
+348670.098168  7390690.301132 
+348657.308264  7390703.318903 
+348625.263412  7390704.878635 
+348441.347730  7390696.989987 
+348368.566498  7390704.898632 
+348320.309556  7390714.397005 
+348260.186289  7390741.292398 
+348238.036913  7390750.780773 
+348203.163604  7390771.377245 
+348142.891904  7390829.807236 
+348044.835975  7390954.235923 
+347898.283964  7391254.294525 
+347907.783622  7391271.701544 
+347814.601216  7391351.257916 
+347799.609568  7391371.704414 
+347750.651697  7391439.652775 
+347719.654116  7391482.305469 
+347707.631112  7391496.952960 
+347672.823772  7391530.177269 
+347628.533267  7391566.571035 
+347574.726612  7391601.375074 
+347541.510795  7391615.612635 
+347508.286732  7391628.270467 
+347405.480974  7391649.626809 
+347341.407762  7391649.626809 
+347272.576475  7391648.047079 
+347247.268793  7391647.257214 
+347192.678746  7391650.416673 
+347142.063383  7391658.325319 
+347096.173109  7391670.193286 
+347066.107352  7391680.481523 
+347015.195124  7391701.957845 
+346952.960821  7391734.272310 
+346889.671001  7391780.154450 
+346704.996666  7391885.286442 
+346755.216211  7391653.586130 
+346767.865928  7391591.876701 
+346778.157224  7391546.784425 
+346777.373832  7391532.546863 
+346771.040727  7391491.413909 
+346765.499260  7391457.399735 
+346748.330608  7391451.690713 
+346736.406558  7391460.999119 
+346723.748594  7391468.767788 
+346633.765726  7391359.706469 
+346622.872455  7391338.000187 
+346607.130401  7391291.318184 
+346582.919467  7391235.027826 
+346558.287977  7391169.429062 
+346510.097005  7391121.967192 
+346491.658433  7391089.102821 
+346482.843212  7391052.159149 
+346468.445294  7391023.883993 
+346459.819736  7390994.369048 
+346452.084772  7390967.893583 
+346450.146908  7390948.156964 
+346450.410787  7390923.691155 
+346454.789536  7390877.289103 
+346455.399757  7390866.151011 
+346463.951098  7390829.247332 
+346464.388148  7390797.692737 
+346460.718575  7390777.606178 
+346455.902777  7390760.389127 
+346443.986974  7390747.751292 
+346429.028311  7390734.083633 
+346424.113558  7390715.986733 
+346416.205422  7390691.090997 
+346406.730503  7390670.394542 
+346401.106574  7390661.696032 
+346390.246288  7390646.078707 
+346378.363470  7390628.701684 
+346369.036983  7390615.064020 
+346366.892963  7390595.557361 
+346366.587853  7390586.028993 
+346362.266828  7390569.481828 
+346352.709446  7390556.424064 
+346343.721055  7390547.135655 
+346330.279699  7390534.477823 
+346322.833353  7390524.209582 
+346320.293514  7390513.551408 
+346313.490374  7390500.523640 
+346306.052273  7390489.705493 
+346301.607555  7390485.336241 
+346300.156219  7390477.457591 
+346295.348666  7390468.769079 
+346287.539486  7390464.369832 
+346282.088727  7390458.440848 
+346280.752838  7390449.572367 
+346283.251446  7390435.194830 
+346278.460386  7390424.736621 
+346271.583029  7390408.939327 
+346263.221351  7390398.441125 
+346258.694171  7390382.663828 
+346251.132377  7390365.706732 
+346259.733196  7390332.622399 
+346258.619955  7390312.675816 
+346260.425879  7390295.528753 
+346260.211477  7390267.953477 
+346257.721116  7390242.447846 
+346257.539699  7390211.333175 
+346257.366528  7390178.988716 
+346260.549573  7390148.014021 
+346266.519844  7390104.881409 
+346272.160266  7390073.496785 
+346274.139361  7390050.030805 
+346272.152019  7390025.764961 
+346266.412643  7390008.197970 
+346261.753522  7389985.341885 
+346290.829732  7389970.594412 
+346353.327914  7389942.909154 
+346446.666998  7389901.756203 
+346482.265976  7389883.559320 
+346533.689470  7389855.884060 
+346555.838846  7389846.395686 
+346596.971044  7389825.029346 
+346613.529476  7389818.170520 
+346642.853072  7389803.673004 
+346682.088637  7389785.596100 
+346689.526737  7389776.777611 
+346727.500629  7389688.172788 
+346744.900176  7389680.264143 
+346789.207173  7389664.446852 
+346824.006267  7389647.039834 
+346862.763551  7389631.212545 
+346901.537327  7389614.605389 
+346914.986929  7389609.066338 
+346937.136305  7389666.816446 
+346942.661279  7389666.016583 
+346945.036194  7389651.779022 
+346998.826356  7389631.212545 
+347092.247903  7389602.337491 
+347103.372068  7389624.803642 
+347111.766731  7389630.872603 
+347120.920047  7389635.421824 
+347132.506001  7389637.541461 
+347155.463507  7389628.053086 
+347179.979551  7389628.842951 
+347198.962374  7389644.390287 
+347263.843717  7389716.647910 
+347274.910158  7389735.634658 
+347278.076711  7389752.251812 
+347277.293319  7389756.211134 
+347325.542015  7389768.079101 
+347351.806259  7389759.660543 
+347365.882575  7389756.201135 
+347384.873644  7389768.069102 
+347414.931155  7389775.977748 
+347456.863238  7389777.567475 
+347455.032574  7389732.195247 
+347452.072178  7389660.187581 
+347444.642324  7389611.815867 
+347434.227335  7389576.031997 
+347427.663335  7389551.276237 
+347422.270300  7389537.198648 
+347408.606296  7389490.406663 
+347349.266420  7389358.289294 
+347304.398679  7389191.807811 
+347311.721332  7389112.731356 
+347320.503568  7389014.618162 
+347283.568701  7388977.594503 
+347309.140262  7388908.016422 
+347324.527728  7388857.994990 
+347337.993823  7388809.903227 
+347336.072451  7388756.032455 
+347328.378718  7388709.860364 
+347314.912623  7388659.848930 
+347282.208073  7388498.246611 
+347270.663350  7388452.074520 
+347243.731160  7388357.810667 
+347211.026610  7388311.638576 
+347161.013221  7388255.848132 
+347116.763947  7388211.605710 
+347070.593302  7388194.288677 
+347005.175954  7388171.202631 
+346951.484746  7388056.922206 
+347316.833995  7388213.535380 
+347382.243097  7388246.239778 
+347477.115980  7388277.604405 
+347543.613584  7388296.081241 
+347815.467070  7388387.875517 
+347900.848542  7388413.761083 
+348155.195280  7388475.740467 
+348188.287404  7388482.649283 
+348226.178833  7388490.307971 
+348332.382038  7388519.662943 
+348377.777538  7388513.813945 
+348449.536237  7388462.552725 
+348518.004690  7388356.880826 
+348540.327236  7388321.976805 
+348566.542003  7388145.996949 
+348543.642221  7388151.625984 
+348523.826529  7388153.885597 
+348486.248456  7388152.355859 
+348451.103020  7388143.267416 
+348414.456772  7388120.881251 
+348437.397785  7388051.263176 
+348474.967612  7387896.399702 
+348505.833253  7387775.370434 
+348543.180432  7387642.613174 
+348546.173814  7387621.106858 
+348569.057104  7387545.669779 
+348579.216460  7387531.412221 
+348599.180584  7387515.814893 
+348644.246235  7387422.550868 
+348664.367037  7387377.438596 
+348666.403856  7387355.312386 
+348664.647409  7387325.667464 
+348657.588636  7387298.502117 
+348654.554023  7387279.775325 
+348655.287938  7387242.481713 
+348665.612218  7387218.465826 
+348677.346605  7387184.311677 
+348680.290509  7387132.590536 
+348680.331740  7387092.227450 
+348681.082147  7387054.943836 
+348683.440569  7387031.767806 
+348686.590629  7387007.461969 
+348691.802247  7386993.864299 
+348696.881925  7386968.078715 
+348700.708176  7386947.602223 
+348698.852774  7386921.416708 
+348686.186564  7386870.785381 
+348679.869951  7386843.889988 
+348670.378540  7386813.835136 
+348667.211987  7386750.545977 
+348643.759707  7386622.447919 
+348680.405956  7386633.626004 
+348694.226639  7386639.195050 
+348706.934080  7386643.754269 
+348719.245702  7386647.093697 
+348734.624923  7386649.693252 
+348746.441771  7386651.812889 
+348759.602755  7386651.722904 
+348780.243071  7386649.063360 
+348795.894416  7386645.234016 
+348817.812897  7386637.485343 
+348834.742409  7386628.806830 
+348850.212338  7386622.317941 
+348871.924663  7386614.789231 
+348896.671601  7386599.991765 
+348914.491705  7386611.989710 
+348971.572114  7386645.513968 
+349021.832890  7386677.758445 
+349059.575887  7386725.230313 
+349111.791020  7386763.203809 
+349136.298817  7386800.777373 
+349194.847055  7386884.263072 
+349213.821632  7386947.922168 
+349217.854039  7387020.969656 
+349218.068441  7387048.005025 
+349220.946375  7387085.198654 
+349221.441149  7387107.854773 
+349232.812701  7387162.725374 
+349242.312359  7387180.922257 
+349263.999945  7387221.015390 
+349309.626339  7387295.052708 
+349335.049468  7387335.155838 
+349366.484100  7387397.475164 
+349377.031029  7387420.541213 
+349385.392707  7387439.357989 
+349397.011646  7387466.633317 
+349403.493183  7387484.660230 
+349408.078087  7387501.877280 
+349411.937323  7387517.954527 
+349421.626644  7387565.356407 
+349448.699019  7387674.407728 
+349449.878230  7387691.574787 
+349462.330038  7387752.734311 
+349483.572329  7387830.740949 
+349504.938312  7387834.700271 
+349548.453671  7387849.727697 
+349568.219886  7387860.805799 
+349585.627679  7387862.385529 
+349667.100438  7387820.462710 
+349754.122910  7387774.580569 
+349832.437362  7387731.857887 
+349898.893735  7387697.053849 
+349967.708530  7387664.619404 
+349982.403313  7387680.346710 
+350001.361397  7387662.849707 
+350067.859001  7387673.237928 
+350088.218945  7387668.018822 
+350100.316165  7387663.159654 
+350110.747647  7387660.830053 
+350116.932320  7387654.911067 
+350126.992721  7387648.592150 
+350134.711193  7387642.363217 
+350146.552780  7387631.964998 
+350152.490066  7387630.365272 
+350166.145824  7387632.054982 
+350176.733984  7387634.594547 
+350190.381496  7387637.284087 
+350202.783827  7387641.843306 
+350225.329022  7387642.733153 
+350236.032629  7387643.183076 
+350247.461905  7387643.403038 
+350256.351341  7387642.063268 
+350270.378180  7387637.774003 
+350284.231847  7387630.495249 
+350294.795269  7387625.396123 
+350305.259735  7387619.967053 
+350318.882508  7387614.907919 
+350327.598774  7387610.338702 
+350348.272074  7387604.569690 
+350371.427490  7387585.872893 
+350383.574188  7387575.694636 
+350400.025418  7387563.576712 
+350414.398598  7387555.088166 
+350435.401747  7387546.329666 
+350446.196063  7387538.690975 
+350463.397700  7387532.991951 
+350476.641147  7387515.524943 
+350487.963221  7387496.038281 
+350493.150101  7387478.151345 
+350498.369965  7387466.683309 
+350504.158818  7387459.214588 
+350516.173576  7387451.585895 
+350535.807852  7387447.356619 
+350568.924714  7387430.419521 
+350595.823918  7387429.319709 
+350657.522216  7387426.150252 
+350707.279972  7387415.062151 
+350746.441321  7387408.923203 
+350782.963877  7387406.593602 
+350818.109312  7387407.963367 
+350833.142190  7387412.702555 
+350851.333375  7387422.990793 
+350932.022742  7387482.320630 
+350961.288614  7387506.846429 
+350985.021266  7387521.873855 
+351010.337194  7387533.741822 
+351036.436514  7387543.240195 
+351132.167006  7387583.533294 
+351149.566552  7387596.191125 
+351197.823494  7387642.073266 
+351216.022925  7387657.110690 
+351246.872074  7387672.927981 
+351264.288113  7387679.046933 
+351325.186527  7387698.243645 
+351417.478340  7387723.089389 
+351447.560589  7387733.707570 
+351443.849786  7387752.824296 
+351445.416569  7387778.929824 
+351445.416569  7387803.455623 
+351452.549559  7387826.391694 
+351462.040970  7387850.917493 
+351484.190346  7387884.931667 
+351596.165912  7388052.063039 
+351618.323534  7388087.656942 
+351643.631215  7388155.685289 
+351650.261185  7388157.305012 
+351639.475115  7388163.733910 
+351622.529111  7388174.302100 
+351611.462670  7388179.171266 
+351606.795303  7388186.879946 
+351611.710057  7388194.788591 
+351613.062438  7388202.107337 
+351598.697505  7388210.495901 
+351592.026304  7388213.855325 
+351585.693199  7388214.235260 
+351581.108295  7388213.415400 
+351576.119325  7388212.585543 
+351570.478903  7388215.525039 
+351565.729075  7388220.674157 
+351557.507583  7388226.133222 
+351552.559844  7388231.622282 
+351550.242653  7388238.131167 
+351549.516985  7388249.749177 
+351553.912226  7388259.207557 
+351558.373437  7388261.467170 
+351568.227682  7388265.776431 
+351564.137552  7388276.584580 
+351558.431160  7388286.492883 
+351552.262980  7388290.972116 
+351544.783649  7388293.111749 
+351535.325222  7388300.220532 
+351531.367031  7388308.259155 
+351525.372022  7388315.727875 
+351517.018590  7388323.946467 
+351514.932294  7388328.465693 
+351514.091178  7388331.225221 
+351515.369344  7388336.004402 
+351517.587580  7388338.573962 
+351521.001519  7388343.703083 
+351520.976781  7388346.252647 
+351517.554595  7388351.971667 
+351516.218706  7388352.961497 
+351516.177475  7388356.720854 
+351517.653550  7388362.609845 
+351522.114761  7388365.419364 
+351523.796992  7388370.308526 
+351522.065283  7388380.146841 
+351520.300590  7388382.566426 
+351515.361098  7388387.275620 
+351508.689897  7388390.974986 
+351501.845526  7388391.574883 
+351495.702084  7388393.724515 
+351488.511371  7388398.193750 
+351483.868743  7388403.122905 
+351482.656547  7388411.421484 
+351486.375597  7388417.550434 
+351487.909396  7388426.758857 
+351494.193024  7388431.588029 
+351500.682807  7388435.747317 
+351503.189661  7388439.646649 
+351504.830661  7388449.304995 
+351498.967591  7388473.380871 
+351497.013235  7388484.988882 
+351492.716948  7388496.016993 
+351489.962707  7388505.845310 
+351482.367929  7388520.062875 
+351470.402648  7388532.560734 
+351465.034352  7388534.570390 
+351438.910293  7388549.077905 
+351438.555705  7388553.387166 
+351437.656866  7388561.685745 
+351437.483696  7388568.324608 
+351442.076846  7388578.782816 
+351446.950368  7388581.052428 
+351448.310996  7388587.491325 
+351447.610067  7388596.229828 
+351441.466625  7388598.709403 
+351437.458957  7388610.967303 
+351435.776726  7388616.266396 
+351433.162671  7388622.545320 
+351431.562902  7388629.064204 
+351427.250123  7388641.312106 
+351420.752094  7388648.340902 
+351413.058360  7388652.470194 
+351410.831878  7388650.670503 
+351406.568577  7388648.300909 
+351406.824210  7388643.541724 
+351407.690064  7388638.012671 
+351407.351969  7388631.363810 
+351402.577401  7388629.544121 
+351399.196447  7388630.513955 
+351380.197131  7388632.423628 
+351361.461695  7388638.102655 
+351354.774002  7388643.791681 
+351349.578877  7388653.040097 
+351345.101174  7388661.628626 
+351342.017083  7388673.896524 
+351336.121028  7388691.443519 
+351331.626833  7388702.031705 
+351328.839607  7388715.069472 
+351320.939718  7388729.387019 
+351315.299296  7388742.174829 
+351304.810091  7388759.341888 
+351295.854684  7388767.330520 
+351284.400670  7388779.508434 
+351275.610188  7388790.716514 
+351269.483239  7388801.724628 
+351269.903796  7388810.263166 
+351272.262218  7388818.921683 
+351277.028540  7388831.929455 
+351281.918554  7388842.607626 
+351282.751424  7388851.696069 
+351283.196720  7388868.093260 
+351284.326454  7388877.181703 
+351288.523785  7388896.058470 
+351292.729363  7388903.957117 
+351295.054800  7388916.055045 
+351297.792548  7388927.273123 
+351301.660031  7388938.941124 
+351303.911251  7388968.306095 
+351306.772694  7388977.974438 
+351306.739709  7388990.822238 
+351305.824377  7389000.660552 
+351301.338428  7389010.478871 
+351294.502302  7389020.147215 
+351289.117514  7389028.175839 
+351275.799851  7389042.553377 
+351271.478826  7389046.492702 
+351254.351405  7389064.149677 
+351243.928170  7389076.117627 
+351237.900175  7389086.355874 
+351231.699010  7389093.824594 
+351228.961261  7389102.103176 
+351225.283442  7389112.581381 
+351222.710618  7389124.739299 
+351214.447895  7389134.397645 
+351205.904800  7389141.846369 
+351195.968092  7389155.254072 
+351194.747650  7389164.652462 
+351177.282134  7389206.225341 
+351169.761571  7389223.312414 
+351159.767140  7389243.039035 
+351156.270738  7389255.626879 
+351145.929965  7389278.442971 
+351139.547382  7389294.210270 
+351133.824498  7389315.086694 
+351132.826704  7389322.605406 
+351134.632629  7389335.803146 
+351134.212071  7389357.059505 
+351129.363287  7389361.998659 
+351123.384770  7389367.697682 
+351115.839469  7389377.146064 
+351110.372218  7389382.845088 
+351102.637254  7389391.073678 
+351097.879179  7389397.002663 
+351092.684053  7389405.811154 
+351088.387767  7389416.619303 
+351083.035964  7389421.328496 
+351073.338396  7389421.118532 
+351064.630377  7389425.017864 
+351061.010282  7389429.517093 
+351055.031764  7389435.216117 
+351051.411669  7389440.165269 
+351051.048835  7389445.254398 
+351045.226996  7389446.304218 
+351040.320489  7389446.474189 
+351038.094007  7389445.234401 
+351034.366710  7389439.875319 
+351032.173213  7389435.206119 
+351026.681223  7389433.376432 
+351024.133138  7389432.796532 
+351017.000149  7389431.726715 
+351014.089229  7389427.377460 
+351009.298169  7389426.777563 
+351004.721511  7389425.177837 
+351002.692938  7389423.388143 
+351000.977722  7389421.488468 
+350998.775979  7389417.699118 
+350994.694095  7389417.659124 
+350991.931607  7389418.069054 
+350990.034974  7389423.808071 
+350989.878296  7389428.907198 
+350988.806286  7389433.986328 
+350980.782704  7389440.665184 
+350966.879559  7389452.483159 
+350955.606961  7389457.352325 
+350943.485002  7389465.200981 
+350929.656074  7389470.260114 
+350912.330743  7389477.278912 
+350898.716216  7389481.348215 
+350890.338046  7389482.927944 
+350881.630026  7389486.047410 
+350877.836760  7389487.227208 
+350872.559173  7389494.705927 
+350868.600982  7389502.754548 
+350864.040816  7389522.891099 
+350855.852309  7389577.441755 
+350885.678926  7389595.798611 
+350887.971378  7389614.145468 
+350878.793323  7389639.391144 
+350899.450131  7389639.391144 
+350959.103363  7389602.677432 
+350968.165971  7389604.647095 
+350975.719518  7389606.286814 
+Region 1
+624
+353400.210283  7401391.408130 
+353398.668238  7401399.726705 
+353396.821082  7401405.275756 
+353394.355459  7401408.355227 
+353391.889836  7401410.824804 
+353386.035012  7401411.434699 
+353372.478209  7401411.434699 
+353353.990160  7401410.204910 
+353344.127668  7401412.364540 
+353339.814890  7401416.063906 
+353336.120578  7401423.142694 
+353334.578533  7401429.921533 
+353333.654955  7401441.019632 
+353333.341599  7401450.258049 
+353335.502111  7401459.506465 
+353343.204090  7401486.931767 
+353350.906070  7401509.727863 
+353359.226517  7401530.064379 
+353372.783320  7401552.560526 
+353381.103767  7401567.957888 
+353388.500635  7401581.825513 
+353395.279037  7401596.922927 
+353408.835840  7401619.419073 
+353423.316221  7401646.834377 
+353433.277668  7401664.651326 
+353443.651426  7401681.038519 
+353447.964205  7401690.586883 
+353456.903119  7401729.410233 
+353459.368742  7401752.216326 
+353460.292319  7401775.322369 
+353459.781053  7401781.101379 
+353457.826696  7401796.888674 
+353450.124717  7401854.198858 
+353437.796602  7401932.765400 
+353434.712512  7401953.721810 
+353427.818663  7401980.027304 
+353420.850598  7402007.642574 
+353411.301463  7402029.828774 
+353404.044780  7402037.947383 
+353404.646755  7402038.407305 
+353372.593656  7402079.750223 
+353339.179930  7402122.042978 
+353300.966897  7402157.266945 
+353263.817628  7402182.392641 
+353236.596821  7402205.138745 
+353224.887173  7402214.697108 
+353213.795993  7402221.785893 
+353199.315612  7402229.484575 
+353167.757287  7402239.842800 
+353154.002575  7402244.761958 
+353134.343561  7402256.060023 
+353108.796738  7402265.888339 
+353075.877785  7402277.676320 
+353027.719798  7402292.913710 
+352992.838243  7402303.231942 
+352946.824276  7402314.340040 
+352926.489071  7402307.561201 
+352904.925178  7402302.622047 
+352880.887415  7402299.542574 
+352856.857899  7402301.392258 
+352830.972981  7402305.091624 
+352808.790621  7402313.100252 
+352790.921039  7402322.958563 
+352773.051457  7402335.286452 
+352753.944941  7402348.224236 
+352737.922515  7402359.322335 
+352720.052933  7402366.711069 
+352700.336195  7402374.729696 
+352681.229679  7402377.809168 
+352627.002466  7402375.959485 
+352559.218450  7402374.109802 
+352532.715065  7402369.800540 
+352509.914237  7402361.781913 
+352496.975901  7402353.773285 
+352488.968812  7402341.445397 
+352485.266254  7402327.887719 
+352484.656033  7402311.870463 
+352487.121656  7402300.162468 
+352492.044656  7402287.834580 
+352510.532705  7402266.268274 
+352517.311106  7402260.719224 
+352525.936664  7402258.259646 
+352545.661647  7402257.639752 
+352571.538319  7402253.940386 
+352594.957614  7402249.011230 
+352620.842532  7402240.382708 
+352643.643360  7402228.064818 
+352666.444188  7402214.507140 
+352688.008081  7402204.028935 
+352710.808908  7402192.320940 
+352765.654588  7402174.454001 
+352818.653113  7402160.276429 
+352850.079498  7402151.038012 
+352872.261858  7402142.409490 
+352882.734571  7402133.161074 
+352891.978596  7402118.993501 
+352899.375465  7402102.966246 
+352904.306711  7402074.001208 
+352903.069776  7402051.205112 
+352896.291374  7402032.718279 
+352880.268948  7402005.602924 
+352872.880326  7401985.886301 
+352863.636301  7401959.390839 
+352856.857899  7401934.735063 
+352855.010744  7401910.709178 
+352855.010744  7401888.522978 
+352854.392276  7401871.885828 
+352851.926653  7401862.637412 
+352840.835473  7401850.929418 
+352822.965891  7401836.751846 
+352814.332088  7401831.822691 
+352802.012219  7401828.743218 
+352788.455416  7401827.513429 
+352779.211392  7401829.983006 
+352767.501744  7401836.751846 
+352754.563408  7401855.858573 
+352742.853761  7401876.195090 
+352732.991269  7401895.301817 
+352729.296957  7401912.548863 
+352720.052933  7401932.885379 
+352705.877662  7401962.470312 
+352684.313769  7401986.496196 
+352668.901564  7402006.222817 
+352656.581696  7402013.001656 
+352643.024892  7402016.691024 
+352631.315245  7402016.691024 
+352620.224065  7402010.532079 
+352605.430327  7401996.364506 
+352594.339147  7401982.806828 
+352587.560745  7401968.629257 
+352587.560745  7401940.284112 
+352591.263303  7401918.717806 
+352603.583171  7401884.203718 
+352630.086557  7401847.230051 
+352654.734540  7401824.433956 
+352671.367187  7401799.778180 
+352677.535368  7401778.211874 
+352676.298433  7401757.265462 
+352674.451277  7401741.238207 
+352671.367187  7401730.150106 
+352662.741630  7401720.901690 
+352627.002466  7401696.255912 
+352580.172122  7401669.140557 
+352538.883246  7401653.733196 
+352517.929574  7401649.423934 
+352497.594369  7401649.423934 
+352479.106320  7401654.353090 
+352458.193879  7401661.551856 
+352441.520000  7401667.290873 
+352419.947861  7401678.388972 
+352395.918345  7401694.406229 
+352379.895919  7401706.734117 
+352363.255025  7401718.442112 
+352341.072665  7401726.450740 
+352329.981485  7401727.680529 
+352306.562190  7401724.601057 
+352281.295739  7401719.671901 
+352251.716510  7401714.742745 
+352225.221371  7401712.283167 
+352183.314026  7401712.283167 
+352158.666043  7401717.822218 
+352134.018060  7401728.300423 
+352113.064387  7401741.238207 
+352085.950781  7401764.044300 
+352064.386888  7401785.610606 
+352053.287462  7401798.548390 
+352032.952257  7401810.876279 
+352020.632388  7401816.425328 
+351991.053159  7401820.114696 
+351968.870798  7401820.734590 
+351931.276233  7401812.106068 
+351897.384225  7401799.168284 
+351872.736242  7401781.291346 
+351857.332283  7401767.123773 
+351844.385701  7401749.866729 
+351832.684299  7401730.150106 
+351819.737717  7401711.663273 
+351800.639447  7401688.247284 
+351783.380086  7401665.441190 
+351767.976127  7401654.972983 
+351750.106546  7401651.883513 
+351731.618496  7401658.662351 
+351716.833005  7401670.990240 
+351699.507674  7401699.715319 
+351698.344956  7401699.955278 
+351670.612882  7401733.229579 
+351620.079981  7401778.831767 
+351585.569505  7401808.406702 
+351558.455899  7401830.592901 
+351542.433473  7401847.230051 
+351526.411047  7401855.858573 
+351511.625555  7401862.017518 
+351498.687219  7401862.017518 
+351486.359105  7401857.088363 
+351470.336678  7401846.000262 
+351451.848629  7401830.592901 
+351433.979047  7401811.496172 
+351405.636753  7401780.061557 
+351386.530236  7401760.344934 
+351387.049749  7401744.757604 
+351385.911769  7401716.282482 
+351385.293302  7401697.175754 
+351374.202122  7401673.139872 
+351362.385273  7401649.943845 
+351344.012671  7401630.937100 
+351339.081425  7401611.220478 
+351329.837401  7401590.883961 
+351324.906155  7401565.618289 
+351324.287687  7401539.112829 
+351327.371778  7401512.007472 
+351336.615802  7401478.113278 
+351344.012671  7401451.617816 
+351348.943917  7401434.360772 
+351350.172605  7401417.723622 
+351351.401294  7401406.015627 
+351348.325450  7401399.846684 
+351343.394204  7401394.917528 
+351329.218933  7401388.138690 
+351365.485856  7401396.067332 
+351385.631397  7401401.226448 
+351414.864285  7401410.804807 
+351445.325861  7401416.463838 
+351470.633543  7401420.633124 
+351493.731235  7401422.352829 
+351518.296756  7401422.112870 
+351536.232307  7401419.163375 
+351552.691784  7401413.024427 
+351571.113863  7401403.196110 
+351581.677285  7401394.837542 
+351587.573340  7401386.488972 
+351602.070213  7401359.213644 
+351610.176258  7401334.157936 
+351616.072313  7401306.892606 
+351621.481840  7401281.097025 
+351623.197056  7401265.619676 
+351622.463141  7401257.751024 
+351620.005765  7401250.872202 
+351614.357097  7401242.763591 
+351598.384148  7401223.356915 
+351557.359150  7401180.364280 
+351519.278057  7401141.550928 
+351475.053522  7401096.348671 
+351464.490101  7401086.760313 
+351448.525398  7401074.722375 
+351443.363258  7401070.553089 
+351438.943278  7401062.934394 
+351418.797737  7401018.961926 
+351414.130370  7401008.143779 
+351398.907829  7400963.931353 
+351393.737442  7400948.204046 
+351362.533705  7400842.812099 
+351334.529506  7400747.728386 
+351306.277920  7400650.934966 
+351282.198926  7400573.058306 
+351271.536550  7400560.490458 
+351292.646900  7400556.381162 
+351313.476879  7400556.161200 
+351323.438326  7400554.021566 
+351396.367989  7400578.147434 
+351475.540050  7400620.890112 
+351523.566097  7400659.093568 
+351534.319182  7400666.642275 
+351575.500858  7400698.876754 
+351616.847458  7400744.408955 
+351648.562461  7400773.334000 
+351678.768404  7400733.370845 
+351691.261444  7400711.214641 
+351705.601639  7400691.398035 
+351719.216166  7400658.703635 
+351738.256712  7400580.147091 
+351759.952545  7400544.823142 
+351776.659408  7400522.017048 
+351953.376131  7400587.255874 
+351995.423661  7400588.655634 
+352089.851248  7400575.907817 
+352134.380894  7400568.489088 
+352147.879973  7400563.929869 
+352159.226787  7400554.731445 
+352168.272902  7400546.222902 
+352176.618087  7400535.014822 
+352181.936906  7400522.946889 
+352184.666408  7400508.129427 
+352186.991845  7400494.061837 
+352188.138071  7400481.114055 
+352187.742252  7400468.486218 
+352186.546549  7400456.988187 
+352168.990324  7400346.717076 
+352167.844098  7400337.238699 
+352160.991480  7400293.186245 
+352150.691938  7400189.983923 
+352152.868943  7400155.229876 
+352158.410410  7400130.054188 
+352167.011228  7400104.888499 
+352170.985912  7400096.030016 
+352182.530634  7400075.963453 
+352194.471176  7400063.805536 
+352239.990370  7400009.864775 
+352277.741613  7399971.521343 
+352293.590869  7399948.315318 
+352302.472059  7399937.687139 
+352314.956852  7399903.772948 
+352319.822128  7399868.269030 
+352324.926545  7399846.862696 
+352328.901228  7399827.815959 
+352336.834102  7399794.491667 
+352344.783469  7399765.916562 
+352359.049448  7399718.334712 
+352359.041201  7399718.334712 
+352379.689763  7399666.723552 
+352409.722535  7399608.703491 
+352423.337062  7399584.197688 
+352443.969131  7399553.242991 
+352477.300395  7399498.492369 
+352510.631659  7399428.654332 
+352541.579763  7399349.297925 
+352570.136460  7399288.988255 
+352585.639373  7399248.065265 
+352636.007350  7399109.648974 
+352633.962285  7399077.244525 
+352632.040913  7399055.678219 
+352628.866114  7399028.672845 
+352628.866114  7398997.748142 
+352624.800723  7398949.186460 
+352619.539628  7398913.272612 
+352623.101999  7398898.765097 
+352618.179000  7398891.476345 
+352615.383527  7398847.763833 
+352613.000367  7398823.168046 
+352611.301643  7398792.113365 
+352610.262618  7398777.205919 
+352611.582015  7398754.679777 
+352612.010819  7398748.190889 
+352631.249275  7398647.788087 
+352634.580752  7398595.906974 
+352629.987602  7398546.215485 
+352623.926622  7398489.635177 
+352604.119176  7398285.270183 
+352595.823468  7398215.932060 
+352595.213247  7398195.295595 
+352588.179212  7398148.033690 
+352587.750408  7398121.518232 
+352590.933453  7398105.111043 
+352589.828459  7398100.141894 
+352592.368298  7398093.093101 
+352594.743212  7398072.456636 
+352612.200482  7398043.091666 
+352636.807235  7398005.008189 
+352667.590414  7397961.275680 
+352672.513413  7397904.235451 
+352673.610162  7397878.929785 
+352651.881344  7397811.391354 
+352590.273755  7397768.678670 
+352562.261310  7397751.121678 
+352533.638643  7397733.664668 
+352510.582182  7397701.210227 
+352494.617480  7397673.584959 
+352475.675888  7397628.102750 
+352447.572734  7397559.484503 
+352505.073700  7397528.879746 
+352536.087773  7397523.120732 
+352576.733444  7397573.082174 
+352625.221280  7397596.428175 
+352686.284618  7397603.606946 
+352768.895357  7397608.996023 
+352879.609250  7397623.223586 
+352959.787350  7397609.825880 
+353013.750684  7397582.050638 
+353078.030052  7397559.034581 
+353135.168184  7397547.926483 
+353195.406899  7397545.846839 
+353261.253050  7397564.003729 
+353298.427058  7397580.860842 
+353406.271262  7397620.304086 
+353445.737722  7397636.421325 
+353459.261541  7397647.029508 
+353469.049816  7397651.108809 
+353501.671905  7397664.976434 
+353513.076442  7397673.125038 
+353572.045237  7397686.542740 
+353619.922852  7397678.844058 
+353673.671784  7397658.727504 
+353739.353011  7397594.438516 
+353814.476172  7397519.731313 
+353834.382573  7397548.216434 
+353838.118115  7397555.125250 
+353842.208246  7397564.733604 
+353845.877818  7397578.131309 
+353848.277471  7397599.737608 
+353854.231250  7397617.554557 
+353857.950300  7397625.993111 
+353868.670400  7397652.748528 
+353886.605951  7397715.537773 
+353894.547072  7397732.944791 
+353902.108865  7397740.003582 
+353919.236286  7397738.373861 
+353976.399157  7397735.564343 
+353977.396951  7397769.558520 
+353975.896137  7397797.303767 
+353972.647122  7397826.548758 
+353964.153504  7397862.542592 
+353956.154661  7397901.785870 
+353954.901234  7397917.783130 
+353956.649435  7397925.781760 
+353959.403676  7397936.279962 
+353966.899499  7397951.277393 
+353974.403569  7397969.024353 
+353979.648172  7397987.271227 
+353980.901599  7398003.768402 
+353978.402991  7398017.016132 
+353973.653162  7398031.013735 
+353970.898921  7398044.011508 
+353968.152926  7398065.007912 
+353967.897293  7398082.754872 
+353969.901127  7398101.501661 
+353972.152348  7398113.749563 
+353979.895559  7398134.745966 
+353986.896609  7398150.493269 
+353989.395216  7398159.241770 
+353991.893824  7398181.487960 
+353992.644231  7398207.233550 
+353985.395795  7398232.479226 
+353975.401363  7398253.975543 
+353963.155710  7398279.721133 
+353954.150827  7398303.217109 
+353948.114586  7398321.703942 
+353946.407616  7398339.460901 
+353947.900184  7398350.708974 
+353951.899606  7398364.956533 
+353960.401469  7398382.953451 
+353980.645966  7398409.448912 
+354005.648537  7398433.194845 
+354018.891983  7398446.442576 
+354022.891405  7398454.441205 
+354026.396053  7398464.439493 
+354028.894661  7398478.687052 
+354027.888621  7398493.434526 
+354024.392219  7398512.681229 
+354021.390591  7398533.427676 
+354020.145410  7398554.174122 
+354021.390591  7398577.920055 
+354021.646224  7398599.666330 
+354019.395004  7398611.164360 
+354013.144361  7398625.911834 
+354004.898130  7398637.159907 
+354001.393482  7398645.908409 
+353999.397894  7398656.406611 
+353999.307186  7398669.034448 
+354001.146095  7398692.400445 
+354001.896502  7398712.147063 
+354001.146095  7398736.392910 
+353997.146673  7398773.636530 
+353993.394638  7398790.883576 
+353989.395216  7398804.131307 
+353982.897187  7398817.379037 
+353966.149092  7398840.875013 
+353958.900655  7398851.873129 
+353955.651641  7398859.871759 
+353954.917726  7398865.230841 
+353953.153033  7398872.869532 
+353951.157445  7398898.115208 
+353949.656631  7398926.610327 
+353947.652797  7398944.107330 
+353944.906802  7398957.355061 
+353936.050350  7398991.429224 
+353920.654638  7399035.841617 
+353910.660206  7399050.589091 
+353896.814785  7399070.935606 
+353882.161233  7399094.331598 
+353868.167380  7399119.827231 
+353852.664466  7399150.072050 
+353848.063069  7399159.250478 
+353840.921834  7399173.318068 
+353835.916372  7399189.565285 
+353827.670141  7399216.810618 
+353818.920890  7399244.305909 
+353811.177680  7399269.801542 
+353806.675238  7399291.047902 
+353804.176630  7399318.543193 
+353802.172796  7399344.288783 
+353797.175580  7399376.283302 
+353793.176158  7399404.028550 
+353792.788585  7399412.987015 
+353792.178364  7399436.023069 
+353793.679178  7399457.269430 
+353799.921575  7399484.014849 
+353808.670826  7399499.512194 
+353821.675131  7399516.259326 
+353835.322643  7399529.377079 
+353843.420442  7399537.755643 
+353860.168536  7399547.503974 
+353882.416866  7399557.002347 
+353892.658685  7399564.251105 
+353899.907121  7399573.249564 
+353907.163804  7399589.496781 
+353911.410613  7399612.742799 
+353915.657422  7399635.488903 
+353919.904231  7399657.485135 
+353923.408879  7399665.733722 
+353929.156502  7399675.732009 
+353947.652797  7399689.979569 
+353968.400313  7399708.226443 
+353981.899393  7399718.224731 
+354005.392904  7399735.471777 
+354020.640184  7399748.219593 
+354034.889671  7399765.466639 
+354045.139736  7399783.963470 
+354051.637765  7399798.211030 
+354057.385388  7399811.958675 
+354064.386438  7399823.956620 
+354072.632669  7399832.955079 
+354075.881683  7399840.703751 
+354078.611186  7399853.731520 
+354079.138945  7399864.699641 
+354076.887724  7399879.947029 
+354072.632669  7399901.693304 
+354069.383654  7399927.688851 
+354069.886674  7399947.935383 
+354072.888302  7399965.182429 
+354078.883311  7399982.179518 
+354087.137788  7399995.677206 
+354097.379607  7400007.925108 
+354109.880892  7400020.922881 
+354115.438852  7400026.181980 
+354120.881364  7400033.170783 
+354131.873590  7400061.665902 
+354138.627252  7400082.412349 
+354145.125282  7400104.158624 
+354156.373141  7400138.152801 
+354163.126804  7400158.149376 
+354166.870592  7400172.396935 
+354171.125647  7400202.391797 
+354176.617637  7400243.884690 
+354181.367466  7400285.127625 
+354184.121707  7400304.124371 
+354189.366310  7400337.118720 
+354195.616952  7400360.114781 
+354199.368987  7400369.863111 
+354211.490946  7400382.330975 
+354217.955991  7400390.349602 
+354221.963659  7400398.358230 
+354225.047750  7400408.526488 
+354225.971327  7400414.685433 
+354225.352860  7400420.234483 
+354222.582127  7400427.933166 
+354219.498036  7400434.712003 
+354217.650881  7400443.340525 
+354214.880147  7400457.828043 
+354214.880147  7400467.686355 
+354214.880147  7400481.543981 
+354216.727303  7400492.952027 
+354216.727303  7400503.730181 
+354214.880147  7400514.208386 
+354209.948901  7400526.836223 
+354201.933565  7400543.483371 
+354198.857721  7400552.721789 
+354197.315676  7400559.190681 
+354196.392098  7400569.358939 
+354194.544942  7400595.244505 
+354193.613118  7400604.482923 
+354191.056787  7400612.751506 
+354185.606028  7400630.368489 
+354182.835295  7400637.767221 
+354179.132737  7400643.616220 
+354169.888713  7400656.863950 
+354167.117979  7400664.262683 
+354163.728779  7400675.350784 
+354160.034467  7400696.617141 
+354155.721689  7400722.802656 
+354150.171975  7400745.298802 
+354141.233061  7400785.661888 
+354137.538750  7400804.448670 
+354131.989037  7400823.245451 
+354124.905525  7400846.351493 
+354111.653832  7400875.316531 
+354100.257541  7400899.352414 
+354090.708406  7400918.759090 
+354084.622688  7400935.226269 
+354082.693070  7400939.715500 
+354075.914668  7400960.361964 
+354073.143935  7400969.600381 
+354070.983422  7400980.698480 
+354066.670644  7401007.803838 
+354063.586554  7401027.530459 
+354061.739398  7401035.539087 
+354055.719650  7401051.656326 
+354050.648218  7401063.574285 
+354037.709882  7401092.229376 
+354027.542279  7401111.026157 
+354019.840300  7401120.884468 
+353999.505095  7401141.840878 
+353985.016468  7401156.008451 
+353973.620177  7401163.407184 
+353958.826439  7401168.336340 
+353944.040948  7401169.566129 
+353908.912005  7401169.256182 
+353891.660891  7401171.725759 
+353880.874821  7401176.654915 
+353849.135079  7401192.062276 
+353831.883965  7401201.300693 
+353821.097895  7401205.929900 
+353797.678600  7401212.088845 
+353783.198219  7401216.398107 
+353767.489150  7401224.106787 
+353753.289141  7401231.935446 
+353731.436629  7401243.203516 
+353720.963916  7401247.212829 
+353679.675040  7401250.292301 
+353667.965392  7401252.761878 
+353658.408011  7401256.151298 
+353647.316830  7401263.240084 
+353605.722843  7401296.824331 
+353580.151282  7401319.620426 
+353567.823167  7401328.868842 
+353557.037097  7401333.488051 
+353543.480294  7401337.187417 
+353524.992245  7401338.727153 
+353443.956537  7401341.496679 
+353423.621332  7401345.196045 
+353414.072197  7401349.195360 
+353409.140951  7401353.204674 
+353405.133283  7401357.823882 
+353402.362549  7401361.523249 
+353400.820504  7401364.912668 
+353400.210283  7401391.408130 
+Region 1
+800
+349021.832890  7386677.758445 
+348971.572114  7386645.513968 
+348914.491705  7386611.989710 
+348896.671601  7386599.991765 
+348907.020621  7386595.442545 
+348926.267323  7386589.773516 
+348939.362337  7386586.254118 
+348951.261648  7386580.725066 
+348961.552944  7386572.086545 
+348972.858526  7386563.787967 
+348988.806736  7386550.880178 
+349009.752162  7386539.142188 
+349032.783884  7386522.215088 
+349052.822225  7386508.027518 
+349062.692963  7386500.818753 
+349072.233852  7386492.660150 
+349076.909464  7386488.120928 
+349086.565800  7386481.462068 
+349098.258955  7386475.603072 
+349117.761291  7386464.724935 
+349131.012984  7386456.116410 
+349145.138777  7386451.387220 
+349159.561434  7386448.547706 
+349166.397559  7386448.067789 
+349192.933929  7386448.117780 
+349215.404908  7386445.588213 
+349231.361364  7386441.868850 
+349240.374494  7386438.309460 
+349254.525026  7386431.810573 
+349283.065230  7386415.053444 
+349292.498918  7386410.614204 
+349310.145852  7386401.375786 
+349323.240866  7386395.556783 
+349342.339136  7386386.758290 
+349348.177468  7386384.048754 
+349349.505111  7386374.320421 
+349350.082347  7386367.901520 
+349350.247272  7386361.372639 
+349349.018583  7386352.164216 
+349347.352845  7386345.615338 
+349344.969684  7386339.056461 
+349342.677232  7386334.267282 
+349339.758066  7386330.028008 
+349336.756438  7386324.019037 
+349334.381524  7386316.800273 
+349332.550861  7386296.623730 
+349330.984077  7386280.436502 
+349330.316132  7386266.478893 
+349329.714157  7386245.092556 
+349331.619037  7386228.835341 
+349337.284197  7386214.057872 
+349341.745408  7386206.899099 
+349348.985598  7386187.712385 
+349354.065276  7386170.265374 
+349355.895940  7386160.537040 
+349363.573180  7386118.534235 
+349370.508260  7386079.730881 
+349372.149260  7386068.452813 
+349374.351004  7386062.823777 
+349382.399325  7386044.306949 
+349385.120581  7386038.237989 
+349386.192591  7386033.158859 
+349386.448224  7386028.179712 
+349387.421279  7386022.760640 
+349388.823139  7386015.021965 
+349392.014430  7386002.764065 
+349395.477847  7385993.385671 
+349406.395856  7385973.679047 
+349409.644871  7385965.740407 
+349411.508519  7385962.320993 
+349419.647549  7385954.982250 
+349424.521071  7385947.283568 
+349428.141166  7385942.674358 
+349431.019101  7385940.484733 
+349441.376366  7385936.165473 
+349449.993677  7385931.046350 
+349459.864416  7385923.837584 
+349466.750018  7385919.038406 
+349475.507515  7385911.269737 
+349481.791143  7385905.130789 
+349496.238539  7385889.443476 
+349504.476523  7385882.434676 
+349510.042729  7385876.515690 
+349517.835417  7385863.197971 
+349518.940412  7385855.119355 
+349513.737040  7385844.771128 
+349507.948186  7385842.161575 
+349498.085695  7385839.292066 
+349491.274308  7385836.892477 
+349487.744921  7385832.323260 
+349484.256766  7385824.754556 
+349486.565710  7385818.685596 
+349488.717977  7385807.637488 
+349493.904856  7385799.378903 
+349498.827855  7385786.811056 
+349504.328091  7385777.782602 
+349506.059800  7385758.865843 
+349506.933900  7385743.038554 
+349507.074086  7385729.190926 
+349511.304402  7385714.613423 
+349511.477573  7385698.226230 
+349510.364332  7385687.368089 
+349509.160382  7385675.500122 
+349508.253297  7385664.641982 
+349507.717292  7385647.464925 
+349509.894297  7385634.317177 
+349512.574322  7385621.719335 
+349517.464337  7385612.680883 
+349519.113583  7385600.632946 
+349521.026708  7385593.894101 
+349517.340643  7385575.357276 
+349513.135066  7385567.568610 
+349512.500106  7385559.699958 
+349513.835995  7385548.861814 
+349518.874442  7385534.844215 
+349523.492331  7385522.486332 
+349526.164110  7385511.218262 
+349534.789667  7385495.920883 
+349542.829742  7385478.053943 
+349547.200244  7385469.795358 
+349553.953907  7385457.797413 
+349568.302349  7385442.220081 
+349570.198982  7385436.031141 
+349570.281444  7385428.392450 
+349564.929640  7385422.583445 
+349561.177605  7385419.993888 
+349556.139158  7385414.624808 
+349552.741711  7385407.066103 
+349552.510817  7385400.197279 
+349553.426148  7385390.678910 
+349561.070404  7385381.120547 
+349567.040675  7385375.871446 
+349580.490277  7385368.472713 
+349600.305970  7385365.913152 
+349619.767074  7385358.584407 
+349632.482762  7385352.175505 
+349645.256173  7385340.687473 
+349659.151072  7385329.199441 
+349666.803574  7385319.201153 
+349668.205433  7385311.462479 
+349676.179538  7385300.694323 
+349689.365261  7385278.128189 
+349701.775838  7385262.300900 
+349706.204064  7385248.063338 
+349707.869802  7385234.675632 
+349711.275495  7385221.097957 
+349716.280957  7385211.069675 
+349717.592108  7385202.221191 
+349718.730088  7385190.933124 
+349716.346927  7385174.965859 
+349713.238098  7385159.538502 
+349712.347505  7385147.130627 
+349712.446460  7385137.602259 
+349716.124279  7385127.014073 
+349722.374922  7385114.446228 
+349734.422665  7385104.277968 
+349740.079579  7385099.348812 
+349743.971800  7385088.540663 
+349747.624880  7385080.492042 
+349755.079473  7385069.713888 
+349762.294925  7385062.255166 
+349767.646728  7385057.995895 
+349775.554863  7385053.316697 
+349783.528968  7385041.208771 
+349786.464627  7385033.930018 
+349791.824676  7385028.670918 
+349796.434319  7385027.061194 
+349804.367193  7385019.502489 
+349809.488103  7385017.562821 
+349815.070801  7385010.304064 
+349821.041072  7385005.054964 
+349825.089971  7384998.786037 
+349830.581960  7384990.537450 
+349836.626448  7384987.827914 
+349842.035975  7384987.437981 
+349851.626341  7384987.757926 
+349858.437728  7384989.827572 
+349878.212189  7384991.577272 
+349893.533685  7384990.517454 
+349908.418132  7384991.667257 
+349926.229990  7384995.616580 
+349936.826396  7384997.276296 
+349956.073098  7385000.245787 
+349970.759635  7385005.724849 
+349981.586936  7385010.024112 
+350000.347111  7385010.773984 
+350019.148517  7385008.424386 
+350038.782792  7385004.085130 
+350058.078972  7385002.845342 
+350075.363071  7384998.256128 
+350088.853904  7384995.846541 
+350108.216054  7384988.187853 
+350124.774485  7384985.918241 
+350144.070665  7384984.348510 
+350159.062312  7384984.948408 
+350180.057215  7384987.268010 
+350188.410647  7384988.347825 
+350222.187208  7384987.917899 
+350242.275026  7384988.677769 
+350261.257848  7384988.097868 
+350279.515003  7384989.277666 
+350295.529183  7384989.227675 
+350308.302594  7384987.367993 
+350324.209573  7384988.747757 
+350336.628397  7384990.867394 
+350355.668943  7384994.936697 
+350367.263143  7384998.266126 
+350372.837595  7385001.865510 
+350377.867796  7385009.234248 
+350380.011816  7385018.882595 
+350390.484529  7385032.620242 
+350399.588368  7385039.799012 
+350417.326010  7385041.198772 
+350433.389667  7385036.599560 
+350445.082822  7385030.960526 
+350455.918369  7385019.222537 
+350464.082137  7385008.674344 
+350470.250318  7385004.195111 
+350477.135921  7384999.725876 
+350485.514091  7384998.266126 
+350496.910382  7385001.255614 
+350508.257195  7385009.124267 
+350520.560571  7385022.871912 
+350530.373586  7385031.610415 
+350536.129455  7385037.209456 
+350542.916102  7385042.038629 
+350548.803911  7385044.868144 
+350557.363499  7385045.737995 
+350562.987428  7385044.578194 
+350571.645970  7385036.029658 
+350582.877336  7385035.139810 
+350587.998245  7385032.980180 
+350599.138903  7385031.540427 
+350604.251566  7385030.050682 
+350608.910686  7385023.891737 
+350613.025555  7385020.062393 
+350625.411394  7385016.203054 
+350633.063896  7385016.053080 
+350643.957167  7385018.932586 
+350659.138477  7385020.862256 
+350672.909682  7385021.222194 
+350679.448943  7385020.292354 
+350686.606671  7385018.602643 
+350692.494480  7385011.123924 
+350697.170093  7385003.095299 
+350702.332233  7384997.606239 
+350718.956634  7384987.477974 
+350748.939929  7384979.149401 
+350777.381178  7384951.754094 
+350812.708031  7384929.407921 
+350835.632552  7384922.559094 
+350869.895640  7384894.223948 
+350905.362678  7384878.196693 
+350919.867798  7384876.357008 
+350951.533323  7384882.435967 
+350974.589784  7384882.675926 
+350999.584109  7384872.627647 
+351017.470184  7384859.959817 
+351028.784012  7384850.551429 
+351037.219906  7384843.772590 
+351038.984599  7384841.243023 
+351039.025831  7384837.263705 
+351035.100625  7384831.684660 
+351031.760901  7384829.105102 
+351031.092957  7384824.555881 
+351031.851610  7384820.016659 
+351040.336981  7384818.336947 
+351045.358936  7384816.397279 
+351052.054875  7384809.928387 
+351058.734322  7384805.679115 
+351069.660577  7384804.239361 
+351077.040954  7384801.319862 
+351086.441657  7384799.650148 
+351096.889631  7384795.770812 
+351106.826339  7384791.771497 
+351119.039007  7384784.592727 
+351125.710207  7384780.893360 
+351131.688724  7384765.116063 
+351133.618342  7384756.057615 
+351134.913001  7384748.758865 
+351136.339599  7384738.690589 
+351138.434141  7384733.621458 
+351154.052502  7384722.703328 
+351174.956697  7384714.064808 
+351202.853695  7384709.585575 
+351214.604574  7384707.935857 
+351230.519799  7384707.655905 
+351251.885782  7384704.106513 
+351262.696591  7384694.358183 
+351268.873017  7384688.659159 
+351278.471630  7384688.209236 
+351284.788243  7384688.489188 
+351298.526463  7384692.508500 
+351308.982683  7384687.739317 
+351315.357020  7384682.600197 
+351322.531240  7384679.350754 
+351332.937983  7384679.240773 
+351343.855993  7384679.130791 
+351355.829520  7384675.701379 
+351364.306645  7384684.319903 
+351373.674363  7384686.189582 
+351379.941498  7384692.118567 
+351387.206427  7384700.497132 
+351394.578557  7384707.335960 
+351409.652667  7384719.883811 
+351421.535485  7384725.322879 
+351431.933982  7384726.432689 
+351446.579288  7384730.342019 
+351459.121805  7384741.100177 
+351470.320186  7384743.539759 
+351481.452597  7384742.879872 
+351493.896159  7384742.789887 
+351501.540415  7384743.859704 
+351508.318817  7384749.468743 
+351516.350645  7384751.768349 
+351529.585846  7384754.447890 
+351540.000835  7384753.778005 
+351550.077729  7384756.427551 
+351556.344864  7384761.806630 
+351565.193070  7384764.446178 
+351572.367290  7384761.746640 
+351578.197375  7384759.816971 
+351585.891108  7384756.347565 
+351590.649184  7384759.387044 
+351597.773927  7384761.006767 
+351603.917369  7384759.077097 
+351612.542926  7384754.067955 
+351618.867785  7384753.698019 
+351624.219589  7384759.507024 
+351629.480684  7384763.876275 
+351639.005080  7384770.065215 
+351650.937376  7384770.415155 
+351657.575591  7384770.255183 
+351661.649229  7384770.745099 
+351680.549590  7384778.243814 
+351684.977816  7384774.304489 
+351692.053082  7384770.825085 
+351693.957961  7384763.536334 
+351696.258659  7384758.467202 
+351704.513136  7384749.248781 
+351713.971563  7384742.040016 
+351725.178190  7384733.841420 
+351741.794345  7384724.712984 
+351787.222830  7384702.466794 
+351794.702161  7384689.479019 
+351803.451412  7384681.260427 
+351828.585923  7384657.484499 
+351847.882102  7384636.308127 
+351852.937042  7384631.268990 
+351861.480137  7384623.270360 
+351866.345413  7384616.561509 
+351879.061100  7384610.382567 
+351893.904316  7384605.543396 
+351905.556239  7384603.113812 
+351916.466003  7384603.783698 
+351946.152433  7384604.083646 
+351959.618528  7384604.443585 
+351978.180793  7384604.633552 
+351992.553973  7384605.773357 
+352002.977208  7384604.103643 
+352018.834710  7384600.284297 
+352040.464573  7384590.206023 
+352057.781657  7384582.297378 
+352069.812908  7384573.558875 
+352083.336726  7384567.939837 
+352092.737429  7384566.480087 
+352101.659850  7384561.590925 
+352124.411201  7384551.742612 
+352165.823771  7384542.084266 
+352187.041323  7384532.995823 
+352211.194532  7384525.377128 
+352230.870039  7384516.498649 
+352253.489449  7384509.419861 
+352284.074719  7384501.421231 
+352309.019566  7384496.692042 
+352335.184856  7384491.972850 
+352363.939462  7384483.404318 
+352386.839245  7384478.315189 
+352407.726947  7384470.996443 
+352427.138574  7384458.348609 
+352439.697583  7384447.620447 
+352457.666120  7384435.732483 
+352472.410380  7384430.573367 
+352485.917706  7384426.724026 
+352508.248499  7384428.163780 
+352520.824001  7384435.602506 
+352530.133995  7384443.111219 
+352540.887080  7384458.838525 
+352552.242139  7384466.037292 
+352568.421244  7384470.416542 
+352588.715217  7384471.396374 
+352615.367035  7384468.446880 
+352632.247069  7384463.857666 
+352658.131987  7384456.588911 
+352682.351166  7384453.289476 
+352703.882075  7384452.959532 
+352722.625757  7384455.249140 
+352739.827394  7384459.408428 
+352760.632634  7384460.398258 
+352781.767723  7384458.618563 
+352805.327204  7384458.858522 
+352826.429308  7384460.838183 
+352842.072408  7384467.527037 
+352867.314120  7384483.294336 
+352879.848390  7384495.492247 
+352889.042938  7384513.739122 
+352901.016464  7384530.476255 
+352915.859680  7384546.353535 
+352930.966774  7384555.252011 
+352949.446577  7384563.850538 
+352978.151706  7384580.317717 
+352996.540800  7384598.324633 
+353009.050332  7384612.412220 
+353020.858934  7384624.820094 
+353037.664753  7384637.947846 
+353056.631083  7384649.215916 
+353077.312629  7384661.823756 
+353099.577452  7384669.912370 
+353123.054471  7384679.230774 
+353138.202797  7384684.139933 
+353162.743579  7384688.489188 
+353192.627919  7384689.898947 
+353209.994481  7384687.639334 
+353224.722249  7384683.580029 
+353240.629227  7384674.651559 
+353269.936331  7384661.883746 
+353285.694878  7384657.164554 
+353308.536937  7384658.504325 
+353325.012906  7384662.993556 
+353342.395960  7384669.482444 
+353363.399109  7384680.990473 
+353377.063113  7384691.978591 
+353389.349997  7384697.747603 
+353396.334555  7384702.916717 
+353410.608780  7384704.386465 
+353433.162221  7384703.616597 
+353448.508456  7384709.635566 
+353464.324726  7384718.993963 
+353483.909524  7384729.482167 
+353499.255759  7384735.291172 
+353515.962623  7384738.330651 
+353546.976696  7384738.420636 
+353558.653359  7384733.561468 
+353580.382176  7384713.174960 
+353596.041768  7384698.827418 
+353617.424244  7384682.540207 
+353635.079424  7384671.982016 
+353655.241458  7384665.313158 
+353685.818481  7384658.534319 
+353708.165766  7384657.434508 
+353726.068333  7384663.033549 
+353754.872417  7384669.862379 
+353788.112973  7384682.040293 
+353814.806021  7384696.147877 
+353840.171427  7384709.695556 
+353863.813370  7384722.783314 
+353883.909434  7384732.951572 
+353898.216644  7384740.950202 
+353919.549643  7384750.248610 
+353964.846188  7384770.965061 
+353980.439810  7384782.533080 
+353996.115894  7384796.200738 
+354011.049818  7384812.627925 
+354023.237747  7384828.475210 
+354030.519169  7384844.832408 
+354035.895711  7384857.950161 
+354038.724168  7384870.937937 
+354042.105123  7384889.904688 
+354042.022660  7384898.543208 
+354037.396525  7384912.340845 
+354029.100817  7384925.548582 
+354018.438441  7384940.725983 
+354007.009165  7384951.354162 
+353994.953176  7384963.302115 
+353975.797182  7384980.939094 
+353964.293690  7384989.017711 
+353951.454309  7384997.636234 
+353942.202038  7385004.305092 
+353937.740828  7385011.563849 
+353933.238386  7385022.811922 
+353932.520964  7385033.880026 
+353937.559411  7385049.877286 
+353942.944199  7385062.335152 
+353954.142580  7385085.041263 
+353959.082073  7385091.400173 
+353964.961635  7385105.637735 
+353966.594389  7385125.814279 
+353971.434926  7385141.801540 
+353973.611931  7385158.328709 
+353980.695443  7385174.785890 
+354006.844240  7385202.291179 
+354030.321259  7385221.577875 
+354048.809308  7385239.594789 
+354064.312222  7385249.933018 
+354080.582035  7385266.160239 
+354093.545109  7385275.698605 
+354110.342681  7385289.376262 
+354121.590540  7385297.464876 
+354135.353499  7385308.013070 
+354154.138412  7385317.391463 
+354174.127275  7385307.733118 
+354193.984199  7385291.655871 
+354206.353545  7385278.488127 
+354222.054368  7385270.119560 
+354248.401075  7385257.531717 
+354261.751722  7385360.444089 
+354284.973108  7385405.856310 
+354291.792740  7385437.710854 
+354299.362780  7385466.685890 
+354308.672775  7385484.722801 
+354323.227372  7385538.683558 
+354185.911139  7385956.691957 
+354099.284486  7386476.442928 
+354056.404087  7386585.144309 
+354048.025916  7386591.873156 
+354042.575158  7386616.288974 
+354036.835781  7386629.086782 
+354029.043093  7386642.844425 
+354012.360969  7386658.631721 
+353999.134015  7386684.967210 
+353987.251196  7386699.684689 
+353978.675117  7386711.002750 
+353967.443750  7386721.410967 
+353957.647228  7386732.169125 
+353937.328516  7386753.895403 
+353915.715146  7386772.062291 
+353909.002714  7386780.300880 
+353901.061594  7386788.519472 
+353898.579478  7386801.897181 
+353893.722448  7386807.936146 
+353889.417916  7386810.335735 
+353864.745194  7386808.096119 
+353841.870150  7386809.855818 
+353829.731699  7386809.405895 
+353811.458052  7386809.885812 
+353795.757228  7386809.285915 
+353787.082194  7386809.415893 
+353772.049315  7386812.255406 
+353755.993904  7386816.304713 
+353738.091337  7386830.742240 
+353731.049056  7386841.530392 
+353713.633017  7386837.581068 
+353699.350546  7386837.881017 
+353687.665637  7386842.970145 
+353680.145075  7386850.208905 
+353677.844376  7386855.827943 
+353670.620678  7386863.506628 
+353657.154584  7386883.313235 
+353653.773629  7386895.121212 
+353644.669790  7386907.879027 
+353638.913921  7386921.666665 
+353626.297189  7386938.263822 
+353621.646314  7386944.752711 
+353611.173602  7386951.181610 
+353591.621789  7386967.368837 
+353582.484965  7386973.037866 
+353573.933624  7386981.036496 
+353569.109579  7386983.975992 
+353561.300399  7386999.073406 
+353549.813399  7387005.272344 
+353546.259274  7387003.682617 
+353543.752420  7386998.783456 
+353543.628726  7386991.474708 
+353539.068561  7386987.665360 
+353534.285747  7386987.065463 
+353528.958682  7386988.555208 
+353523.516170  7386992.264573 
+353513.035211  7386999.253375 
+353505.836251  7387004.942401 
+353490.259122  7387011.541271 
+353482.177816  7387014.000849 
+353462.848651  7387017.800199 
+353456.408345  7387019.279945 
+353451.551315  7387025.208929 
+353444.294632  7387036.546987 
+353441.383713  7387042.056044 
+353434.250723  7387051.284463 
+353426.062216  7387053.414098 
+353415.581257  7387081.109354 
+353412.942463  7387090.167803 
+353411.540604  7387097.676516 
+353407.400996  7387103.175574 
+353399.517600  7387106.195057 
+353384.674384  7387110.474324 
+353369.369380  7387120.402624 
+353355.020939  7387126.791529 
+353333.011749  7387133.990296 
+353316.890368  7387144.348522 
+353308.536937  7387153.017037 
+353301.346224  7387157.926196 
+353285.752602  7387165.744857 
+353262.374538  7387177.132906 
+353246.954086  7387188.270998 
+353232.094379  7387194.549923 
+353221.506219  7387202.188614 
+353208.831762  7387215.136397 
+353199.373336  7387232.313454 
+353194.029778  7387246.101093 
+353188.496557  7387258.119034 
+353044.863712  7387317.848803 
+352742.012645  7387441.097691 
+352657.686691  7387489.209450 
+352637.755551  7387492.878822 
+352617.750196  7387493.228762 
+352587.230896  7387493.698681 
+352573.608123  7387489.129464 
+352554.732501  7387478.751242 
+352527.445724  7387472.602295 
+352510.532705  7387470.002740 
+352494.996806  7387472.832256 
+352479.625832  7387479.321144 
+352474.364737  7387484.810204 
+352466.291677  7387496.018284 
+352460.098758  7387502.487176 
+352450.516638  7387511.695599 
+352442.781674  7387520.364114 
+352435.302342  7387522.953670 
+352422.619640  7387526.253105 
+352396.165732  7387538.720970 
+352383.647954  7387545.239853 
+352367.732729  7387554.828210 
+352358.653629  7387565.036462 
+352350.094041  7387573.475016 
+352334.508665  7387591.361953 
+352323.582410  7387601.780168 
+352315.360918  7387607.449197 
+352308.137220  7387615.907748 
+352291.397371  7387625.926032 
+352286.441387  7387631.415092 
+352278.681684  7387642.413208 
+352272.340332  7387644.002936 
+352263.327202  7387647.122401 
+352255.122203  7387651.251694 
+352253.357509  7387663.859534 
+352250.380620  7387676.227416 
+352247.618133  7387687.055561 
+352235.290018  7387694.684254 
+352226.606737  7387695.484117 
+352218.921250  7387699.173485 
+352212.950979  7387704.092643 
+352210.658527  7387708.831831 
+352193.357935  7387734.347460 
+352181.887428  7387748.515034 
+352171.266283  7387759.703117 
+352163.844676  7387767.161840 
+352158.707274  7387770.101336 
+352157.025043  7387775.290447 
+352156.662209  7387780.379576 
+352155.351058  7387799.306334 
+352153.644088  7387806.595085 
+352148.704596  7387811.084316 
+352138.075205  7387812.084145 
+352124.452432  7387817.703182 
+352120.617935  7387822.872297 
+352119.224322  7387829.721124 
+352117.979141  7387842.109002 
+352117.814216  7387848.427920 
+352116.082508  7387858.156253 
+352113.295282  7387870.744097 
+352108.116649  7387879.002682 
+352102.616413  7387887.471232 
+352094.394921  7387893.150259 
+352088.111294  7387899.399189 
+352085.653917  7387909.667430 
+352082.932661  7387917.176144 
+352080.821626  7387924.014972 
+352076.352169  7387931.503689 
+352067.437993  7387935.403021 
+352051.225904  7387944.211513 
+352026.759338  7387962.118445 
+352006.885922  7387979.525464 
+351994.566053  7387987.044176 
+351983.755245  7387996.232602 
+351972.482647  7388000.551862 
+351950.852784  7388000.661843 
+351933.915027  7388010.460165 
+351917.810138  7388018.268827 
+351905.721164  7388023.127995 
+351891.842758  7388033.396236 
+351884.140778  7388038.085433 
+351858.090936  7388070.709845 
+351846.241102  7388082.107892 
+351829.328083  7388089.136688 
+351812.918084  7388097.385275 
+351760.818399  7388113.352540 
+351729.375522  7388123.890735 
+351722.506412  7388126.940213 
+351708.157970  7388133.419103 
+351688.705112  7388139.867998 
+351679.980600  7388144.987122 
+351659.670134  7388154.965412 
+351650.261185  7388157.305012 
+351643.631215  7388155.685289 
+351618.323534  7388087.656942 
+351596.165912  7388052.063039 
+351484.190346  7387884.931667 
+351462.040970  7387850.917493 
+351452.549559  7387826.391694 
+351445.416569  7387803.455623 
+351445.416569  7387778.929824 
+351443.849786  7387752.824296 
+351447.560589  7387733.707570 
+351417.478340  7387723.089389 
+351325.186527  7387698.243645 
+351264.288113  7387679.046933 
+351246.872074  7387672.927981 
+351216.022925  7387657.110690 
+351197.823494  7387642.073266 
+351149.566552  7387596.191125 
+351132.167006  7387583.533294 
+351036.436514  7387543.240195 
+351010.337194  7387533.741822 
+350985.021266  7387521.873855 
+350961.288614  7387506.846429 
+350932.022742  7387482.320630 
+350851.333375  7387422.990793 
+350833.142190  7387412.702555 
+350818.109312  7387407.963367 
+350782.963877  7387406.593602 
+350746.441321  7387408.923203 
+350707.279972  7387415.062151 
+350657.522216  7387426.150252 
+350595.823918  7387429.319709 
+350568.924714  7387430.419521 
+350535.807852  7387447.356619 
+350516.173576  7387451.585895 
+350504.158818  7387459.214588 
+350498.369965  7387466.683309 
+350493.150101  7387478.151345 
+350487.963221  7387496.038281 
+350476.641147  7387515.524943 
+350463.397700  7387532.991951 
+350446.196063  7387538.690975 
+350435.401747  7387546.329666 
+350414.398598  7387555.088166 
+350400.025418  7387563.576712 
+350383.574188  7387575.694636 
+350371.427490  7387585.872893 
+350348.272074  7387604.569690 
+350327.598774  7387610.338702 
+350318.882508  7387614.907919 
+350305.259735  7387619.967053 
+350294.795269  7387625.396123 
+350284.231847  7387630.495249 
+350270.378180  7387637.774003 
+350256.351341  7387642.063268 
+350247.461905  7387643.403038 
+350236.032629  7387643.183076 
+350225.329022  7387642.733153 
+350202.783827  7387641.843306 
+350190.381496  7387637.284087 
+350176.733984  7387634.594547 
+350166.145824  7387632.054982 
+350152.490066  7387630.365272 
+350146.552780  7387631.964998 
+350134.711193  7387642.363217 
+350126.992721  7387648.592150 
+350116.932320  7387654.911067 
+350110.747647  7387660.830053 
+350100.316165  7387663.159654 
+350088.218945  7387668.018822 
+350067.859001  7387673.237928 
+350001.361397  7387662.849707 
+349982.403313  7387680.346710 
+349967.708530  7387664.619404 
+349898.893735  7387697.053849 
+349832.437362  7387731.857887 
+349754.122910  7387774.580569 
+349667.100438  7387820.462710 
+349585.627679  7387862.385529 
+349568.219886  7387860.805799 
+349548.453671  7387849.727697 
+349504.938312  7387834.700271 
+349483.572329  7387830.740949 
+349462.330038  7387752.734311 
+349449.878230  7387691.574787 
+349448.699019  7387674.407728 
+349421.626644  7387565.356407 
+349411.937323  7387517.954527 
+349408.078087  7387501.877280 
+349403.493183  7387484.660230 
+349397.011646  7387466.633317 
+349385.392707  7387439.357989 
+349377.031029  7387420.541213 
+349366.484100  7387397.475164 
+349335.049468  7387335.155838 
+349309.626339  7387295.052708 
+349263.999945  7387221.015390 
+349242.312359  7387180.922257 
+349232.812701  7387162.725374 
+349221.441149  7387107.854773 
+349220.946375  7387085.198654 
+349218.068441  7387048.005025 
+349217.854039  7387020.969656 
+349213.821632  7386947.922168 
+349194.847055  7386884.263072 
+349136.298817  7386800.777373 
+349111.791020  7386763.203809 
+349059.575887  7386725.230313 
+349021.832890  7386677.758445 
+Region 1
+259
+330497.970400  7387158.766052 
+330555.512597  7387229.943860 
+330572.837928  7387253.559815 
+330650.500928  7387338.625244 
+330727.677401  7387424.140596 
+330805.068275  7387510.095873 
+330876.662050  7387602.300079 
+330950.853387  7387691.874736 
+331026.273412  7387779.479730 
+331101.470790  7387869.504309 
+331175.282800  7387955.529574 
+331219.391888  7388014.299507 
+331245.985982  7388045.284200 
+331323.137716  7388135.448755 
+331405.228942  7388230.022556 
+331443.376005  7388275.174822 
+331455.530949  7388292.701819 
+331463.323637  7388306.159514 
+331498.073253  7388382.796387 
+331510.797186  7388430.008300 
+331513.642136  7388457.623570 
+331517.476633  7388496.326940 
+331521.179191  7388538.669687 
+331520.626693  7388586.401511 
+331532.732160  7388713.909670 
+331538.438552  7388785.307441 
+331540.986637  7388852.895863 
+331541.926707  7388871.402693 
+331545.851913  7388925.883361 
+331547.740300  7388943.680313 
+331560.076661  7389059.460481 
+331565.123354  7389145.125807 
+331576.395951  7389246.048520 
+331578.127660  7389255.396918 
+331603.262171  7389247.928198 
+331730.006736  7389215.003837 
+331758.918020  7389207.865060 
+331859.901361  7389182.949328 
+331993.976825  7389168.841745 
+332122.123249  7389164.182543 
+332262.152492  7389149.874993 
+332395.551765  7389140.086670 
+332485.031614  7389141.446437 
+332546.367077  7389142.616237 
+332643.697338  7389145.295778 
+332704.529781  7389146.205622 
+332778.284068  7389149.245101 
+332853.572154  7389149.485060 
+332929.091134  7389152.794493 
+333027.452173  7389152.694510 
+333212.002815  7389152.654517 
+333340.272933  7389152.234589 
+333412.518160  7389151.704680 
+333453.600881  7389150.704851 
+333502.022747  7389150.774839 
+333541.563423  7389151.544707 
+333623.951513  7389150.314918 
+333697.211026  7389151.054791 
+333774.032911  7389149.785009 
+333847.787198  7389151.804663 
+333915.208380  7389153.024454 
+333951.186684  7389155.294065 
+334049.803356  7389156.203909 
+334125.817111  7389160.013257 
+334232.539828  7389161.483005 
+334285.761000  7389163.872596 
+334309.048356  7389163.042738 
+334325.870666  7389161.403019 
+334336.434088  7389160.143235 
+334321.162068  7389125.239213 
+334306.846612  7389091.514990 
+334241.948777  7388936.761498 
+334209.730754  7388862.374240 
+334183.895313  7388800.274877 
+334172.614469  7388778.218655 
+334140.272753  7388705.641087 
+334131.960552  7388682.285087 
+334124.415251  7388663.598288 
+334120.349860  7388653.030098 
+334115.600031  7388636.822875 
+334112.186091  7388626.134705 
+334106.001418  7388605.018322 
+334100.468198  7388588.451160 
+334095.833816  7388574.553541 
+334089.673882  7388559.426132 
+334082.631601  7388541.519199 
+334075.003837  7388525.261984 
+334066.683391  7388508.434866 
+334060.647150  7388493.507423 
+334042.761075  7388448.475137 
+334019.531444  7388391.394914 
+334013.082891  7388374.927735 
+334006.626093  7388359.460384 
+334003.121445  7388349.782042 
+333988.970913  7388313.158315 
+333985.045707  7388301.070386 
+333982.456391  7388294.831455 
+333974.069974  7388278.574239 
+333947.682036  7388212.255599 
+333936.392946  7388179.841151 
+333934.430343  7388174.342093 
+333925.375982  7388154.085563 
+333919.826269  7388139.728022 
+333915.002224  7388124.170687 
+333909.056692  7388108.263412 
+333904.991300  7388098.255126 
+333900.554828  7388084.027563 
+333896.085371  7388064.590893 
+333891.896286  7388046.823936 
+333888.672010  7388025.297623 
+333887.517537  7388010.000244 
+333886.973286  7387995.712691 
+333888.020557  7387975.346180 
+333889.142045  7387957.189290 
+333892.778632  7387933.313379 
+333899.721959  7387906.148033 
+333907.019873  7387883.741871 
+333913.575626  7387863.995253 
+333919.026385  7387842.458942 
+333925.425460  7387817.833160 
+333929.614545  7387799.386320 
+333936.805258  7387777.540062 
+333956.505503  7387719.919932 
+333973.946281  7387670.868334 
+333981.508074  7387652.231526 
+333987.791702  7387629.045498 
+333995.633867  7387603.549865 
+334000.870224  7387582.683439 
+334003.542003  7387562.996811 
+334008.621681  7387538.241052 
+334011.821218  7387517.014688 
+334011.227489  7387497.408046 
+334010.773947  7387456.974972 
+334011.441891  7387433.948916 
+334011.524354  7387417.781685 
+334001.018656  7387359.001754 
+333997.431546  7387328.796928 
+333995.139093  7387296.872396 
+333987.486591  7387270.316945 
+333982.563592  7387245.001281 
+333974.935828  7387215.896266 
+333967.085417  7387180.522326 
+333961.923276  7387157.716232 
+333958.410382  7387116.813238 
+333953.602830  7387082.089186 
+333949.471468  7387059.113122 
+333944.556715  7387034.247381 
+333941.934413  7387013.071009 
+333939.543006  7386990.554865 
+333938.306072  7386955.650844 
+333937.448464  7386932.164867 
+333935.469369  7386854.838112 
+333934.191203  7386797.008018 
+333935.510600  7386753.055547 
+333932.624419  7386728.549744 
+333931.849273  7386697.745021 
+333930.364952  7386666.830316 
+333926.687133  7386643.394331 
+333919.158324  7386602.571323 
+333905.749953  7386552.249943 
+333879.032166  7386461.355512 
+333864.823911  7386418.552844 
+333856.734358  7386385.448515 
+333847.836675  7386350.684469 
+333844.917510  7386338.856495 
+333839.442013  7386317.810100 
+333837.784520  7386301.612875 
+333831.476154  7386282.946072 
+333844.538183  7386279.336691 
+333833.603681  7386231.474889 
+333813.087059  7386172.664963 
+333784.249991  7386092.808641 
+333748.246948  7385963.870727 
+333751.726857  7385884.884257 
+333622.252790  7385861.908192 
+333598.668570  7385860.378454 
+333557.973422  7385852.389823 
+333516.536113  7385842.861455 
+333483.163618  7385836.552536 
+333459.587644  7385835.032796 
+333420.838606  7385830.643548 
+333387.457865  7385824.844541 
+333334.047029  7385817.585784 
+333267.772073  7385819.205507 
+333229.361131  7385823.214820 
+333195.782479  7385826.554248 
+333156.126356  7385828.993830 
+333081.621662  7385835.772669 
+333025.266922  7385835.572703 
+332993.180839  7385840.721821 
+332952.947479  7385846.720794 
+332914.231427  7385853.499633 
+332878.879836  7385856.799067 
+332835.158321  7385859.928531 
+332793.152022  7385865.877512 
+332748.630623  7385870.756677 
+332711.530831  7385872.756334 
+332677.020356  7385872.266418 
+332633.373057  7385871.576536 
+332582.634000  7385858.038855 
+332559.940373  7385850.940071 
+332538.656852  7385848.710453 
+332525.660792  7385842.311549 
+332499.841844  7385835.932642 
+332480.743574  7385826.904188 
+332480.727081  7385826.884192 
+332431.925888  7385806.777636 
+332397.555599  7385792.620061 
+332355.104004  7385764.324907 
+332318.713388  7385742.078718 
+332294.452977  7385729.950795 
+332256.042035  7385717.822873 
+332227.740971  7385721.862181 
+332213.590440  7385725.911487 
+332200.932476  7385732.690326 
+332191.861622  7385717.252970 
+332177.727583  7385700.935765 
+332164.146041  7385682.608905 
+332137.972505  7385647.504918 
+332110.215692  7385618.609867 
+332094.663301  7385594.234043 
+332068.201147  7385572.567754 
+332045.053978  7385621.619352 
+332036.453159  7385666.581650 
+331999.510046  7385720.092484 
+331944.647873  7385754.706555 
+331915.142860  7385752.456940 
+331875.989757  7385756.566236 
+331839.137352  7385769.574008 
+331796.702249  7385789.180650 
+331764.690382  7385802.938293 
+331739.778519  7385812.116721 
+331707.486280  7385817.225846 
+331678.756412  7385816.755927 
+331652.566384  7385819.065531 
+331633.352666  7385827.404103 
+331574.952861  7385925.147360 
+331532.583728  7386000.004538 
+331520.890573  7386027.819773 
+331477.391706  7386135.751286 
+331437.958231  7386236.634005 
+331425.654855  7386259.310121 
+331420.063911  7386283.825922 
+331401.534630  7386315.070570 
+331296.337466  7386507.677578 
+331281.733392  7386579.725237 
+331248.616529  7386628.186936 
+331217.528240  7386677.328518 
+331124.057215  7386818.744295 
+331030.907794  7386882.263415 
+330923.632580  7386938.713745 
+330867.178885  7386966.948909 
+330829.064806  7386983.886008 
+330713.328959  7387041.756095 
+330661.105581  7387069.981260 
+330604.651886  7387098.216424 
+330579.360696  7387112.563966 
+330537.898649  7387136.099935 
+330497.970400  7387158.766052 
+Region 1
+112
+333907.324983  7395848.817525 
+333982.068818  7396026.457097 
+333821.052918  7396075.218745 
+333729.676437  7396099.864523 
+333632.989382  7396125.490134 
+333556.340668  7396145.636683 
+333468.848161  7396169.792545 
+333432.737917  7396179.760838 
+333355.322304  7396201.427126 
+333314.742603  7396207.546078 
+333263.723174  7396222.513514 
+333260.902963  7396133.828705 
+333252.038265  7396000.001629 
+333244.831059  7395918.725551 
+333239.281346  7395834.849918 
+333227.151141  7395675.497213 
+333223.860895  7395658.210175 
+333219.548116  7395644.492524 
+333213.718031  7395626.335634 
+333200.021042  7395602.029798 
+333153.619502  7395514.324821 
+333099.087179  7395434.388513 
+333089.109240  7395412.862200 
+333055.472865  7395340.264636 
+333003.983401  7395244.701005 
+332812.101860  7394889.331876 
+332780.147716  7394841.380090 
+332759.020873  7394808.995637 
+332743.922025  7394787.569307 
+332731.049659  7394775.561364 
+332726.613187  7394771.852000 
+332731.288800  7394762.743560 
+332744.119935  7394737.757840 
+332787.783726  7394657.381607 
+332868.382384  7394516.605721 
+332903.865915  7394463.394836 
+332915.196236  7394446.377750 
+332928.043863  7394424.711462 
+332940.017390  7394392.426992 
+332953.747364  7394354.483491 
+332960.171177  7394312.870619 
+332962.933665  7394266.918490 
+332953.747364  7394225.305618 
+332939.159782  7394131.901617 
+332893.986930  7393999.964217 
+332883.440001  7393972.568910 
+332915.641532  7393966.190002 
+333017.243340  7393944.773671 
+333041.759383  7393939.624553 
+333080.392974  7393935.765214 
+333146.082447  7393928.026539 
+333191.717088  7393921.957579 
+333236.312703  7393924.627122 
+333348.296515  7393932.705738 
+333456.750941  7393939.814520 
+333662.684059  7393954.741963 
+333719.137754  7393959.301182 
+333747.339863  7393961.650780 
+333802.688563  7393971.229139 
+333844.810309  7393981.247423 
+333870.942614  7394000.004210 
+333877.630307  7394007.812873 
+333886.453774  7394018.780994 
+333892.993034  7394028.729290 
+333899.787929  7394038.417630 
+333910.087471  7394056.264573 
+333914.862038  7394064.673133 
+333926.142882  7394090.908639 
+333937.423725  7394115.114493 
+333947.632559  7394151.748218 
+333956.423041  7394117.764039 
+333961.288317  7394149.568591 
+333964.380653  7394155.307608 
+333978.968235  7394169.455185 
+334017.346193  7394184.542600 
+334096.361575  7394194.420908 
+334111.889227  7394211.348009 
+334118.939754  7394231.104625 
+334091.554022  7394278.196558 
+334052.235994  7394368.041169 
+334017.263730  7394444.888006 
+334196.338875  7394497.159052 
+334182.361514  7394504.187848 
+334166.273118  7394523.774493 
+334144.428853  7394584.504091 
+334138.928617  7394618.258309 
+334133.733492  7394643.394003 
+334124.720362  7394669.499532 
+334117.496664  7394693.085492 
+334107.741373  7394718.181193 
+334093.153791  7394745.276552 
+334071.540420  7394782.070249 
+334043.222864  7394834.061344 
+334027.752936  7394904.139340 
+334015.630977  7394957.900131 
+334016.867911  7394984.985492 
+334014.888816  7395049.254483 
+334017.123544  7395134.299916 
+334020.372559  7395193.259816 
+334021.172444  7395236.302443 
+334012.283007  7395278.225262 
+333992.211682  7395349.133117 
+333971.892969  7395423.830322 
+333957.676468  7395454.315100 
+333947.517112  7395476.431312 
+333933.053223  7395502.336874 
+333919.339741  7395520.383783 
+333899.293155  7395541.460173 
+333879.246568  7395560.216960 
+333830.552576  7395600.850000 
+333884.870497  7395785.938296 
+333907.324983  7395848.817525 
+Region 1
+140
+325444.531827  7377051.727297 
+325444.540073  7377051.717298 
+325318.084126  7376989.218004 
+324408.862982  7376720.733993 
+324487.457806  7376976.990098 
+324472.144556  7377282.387787 
+324406.422097  7377564.029544 
+324238.100037  7377972.139638 
+324026.510005  7378414.503865 
+323973.354802  7378626.637529 
+323963.170708  7378827.653097 
+324022.238458  7379087.548579 
+324080.943374  7379378.448750 
+324081.124791  7379691.785079 
+324026.839854  7379996.832827 
+324011.930669  7380259.707799 
+324000.625087  7380553.637451 
+323946.892648  7380812.163168 
+323874.573205  7380996.921521 
+323826.827530  7381081.517030 
+323818.704993  7381111.991810 
+323818.366897  7381140.116992 
+323825.788505  7381167.232348 
+323844.119876  7381186.838989 
+323868.734874  7381209.735067 
+323890.100858  7381222.952803 
+323963.822160  7381251.417928 
+323977.057360  7381261.886134 
+323983.934716  7381275.593786 
+323989.781294  7381281.202826 
+324002.249595  7381287.661719 
+324036.941487  7381303.918935 
+324056.394345  7381315.226998 
+324075.047319  7381333.063942 
+324101.624920  7381371.377380 
+324109.005297  7381390.614085 
+324118.537939  7381415.449830 
+324122.776502  7381436.096294 
+324135.541667  7381511.013461 
+324149.329364  7381568.663586 
+324155.843887  7381595.289026 
+324175.758534  7381669.226361 
+324199.994205  7381780.527296 
+324223.982490  7381849.565470 
+324232.286445  7381896.847371 
+324248.927338  7381988.431684 
+324271.241638  7382109.540939 
+324291.131547  7382177.559288 
+324314.237485  7382260.205131 
+324327.876750  7382319.554965 
+324344.624845  7382411.139278 
+324364.555984  7382476.168139 
+324387.332073  7382550.215455 
+324410.421519  7382606.425827 
+324445.385537  7382651.038185 
+324498.243876  7382692.990999 
+324560.181314  7382717.326831 
+324599.796206  7382757.349975 
+324623.660797  7382735.833661 
+324650.749665  7382703.469204 
+324700.227049  7382661.306426 
+324745.061805  7382623.522898 
+324804.228510  7382580.330297 
+324864.640396  7382538.017545 
+324964.658927  7382475.868190 
+325076.791171  7382399.131335 
+325111.738697  7382373.155784 
+325185.905295  7382317.925245 
+325277.240546  7382239.388697 
+325337.413291  7382165.011437 
+325414.235176  7382062.818942 
+325464.166102  7381997.030211 
+325481.936729  7381972.254455 
+325543.808198  7381883.059733 
+325574.863503  7381821.520274 
+325612.095234  7381743.983556 
+325652.963553  7381670.716106 
+325703.438731  7381579.161788 
+325759.694516  7381481.598500 
+325804.496287  7381395.073321 
+325879.528740  7381254.317431 
+325957.455620  7381110.702031 
+326015.063787  7381010.379215 
+326026.781681  7380969.316249 
+326080.019346  7380893.309268 
+326145.007889  7380773.469796 
+326208.272971  7380669.007689 
+326278.835967  7380552.007730 
+326364.720459  7380407.382503 
+326385.385513  7380376.507792 
+326428.035018  7380327.926113 
+326445.434564  7380311.208977 
+326561.021979  7380179.021619 
+326675.685817  7380053.003205 
+326748.689696  7379969.697475 
+326793.458483  7379907.108196 
+326813.216451  7379879.312957 
+326880.777819  7379773.461088 
+326932.621871  7379685.686123 
+326984.548385  7379590.942352 
+327025.037378  7379514.225493 
+327068.429044  7379424.920790 
+327118.442432  7379338.095662 
+327047.763990  7379293.593285 
+327010.787891  7379267.137817 
+326990.906229  7379253.620132 
+326955.142327  7379191.620752 
+326936.068795  7379133.590692 
+326911.560998  7379047.825383 
+326899.570979  7379005.862571 
+326888.372597  7378966.659286 
+326873.966432  7378913.928318 
+326843.579073  7378801.657549 
+326830.343872  7378752.036049 
+326823.499501  7378724.120831 
+326802.554075  7378668.590343 
+326782.647674  7378615.319467 
+326703.887925  7378443.088969 
+326693.596629  7378420.962759 
+326664.042139  7378309.671822 
+326659.589174  7378294.304454 
+326618.052911  7378115.675052 
+326614.993559  7378107.236497 
+326564.427673  7377879.465513 
+326554.507457  7377794.999981 
+326514.059696  7377633.527639 
+326464.780222  7377452.288684 
+326430.896460  7377373.062255 
+326390.910487  7377377.701460 
+326251.747099  7377371.212572 
+326243.797733  7377371.212572 
+326007.642179  7377362.494065 
+325958.230765  7377304.893931 
+325903.582995  7377263.111088 
+325778.520661  7377197.552318 
+325636.932881  7377130.673774 
+325580.883251  7377107.177798 
+325496.046030  7377071.953832 
+325491.881684  7377070.224128 
+325444.531827  7377051.727297 
+Region 1
+177
+340932.074469  7397727.665696 
+340958.503639  7397685.492919 
+341034.426684  7397563.933741 
+341056.460613  7397528.399828 
+341071.460506  7397510.272933 
+341128.153342  7397444.334228 
+341150.418164  7397416.389014 
+341167.817711  7397387.274002 
+341194.543745  7397338.842297 
+341238.529139  7397260.905647 
+341261.156796  7397259.645863 
+341238.537385  7397260.875652 
+341385.831557  7397053.271213 
+341419.987444  7397005.619376 
+341530.759061  7396799.784633 
+341652.646596  7396708.240314 
+341744.963148  7396668.397139 
+341816.078641  7396642.671545 
+341808.723003  7396660.198543 
+341816.111626  7396642.631552 
+341880.448717  7396603.788206 
+341913.845952  7396575.233097 
+341935.451076  7396546.158077 
+341950.648879  7396506.364893 
+341969.887335  7396445.495320 
+341969.912074  7396445.505318 
+341980.417772  7396412.301006 
+341899.283108  7396406.841941 
+341881.759868  7396405.132234 
+341854.332905  7396402.922612 
+341780.158060  7396384.215816 
+341643.196415  7396353.031158 
+341612.372005  7396347.742064 
+341519.173107  7396325.405890 
+341472.746828  7396314.617738 
+341400.814958  7396298.330528 
+341311.937084  7396274.514607 
+341302.989924  7396267.655782 
+341243.691279  7396236.431130 
+341041.147362  7396191.898758 
+340966.189126  7396176.621375 
+341003.247686  7396032.006147 
+341029.322267  7395925.344417 
+341068.689773  7395778.099639 
+341093.667605  7395664.189150 
+341101.930328  7395603.099614 
+341116.336493  7395550.278662 
+341127.600844  7395514.954713 
+341158.384023  7395439.277676 
+341192.506926  7395331.356162 
+341225.648527  7395221.704944 
+341254.601042  7395098.546040 
+341268.685604  7395044.875233 
+341284.237995  7394985.305437 
+341313.520360  7394868.255487 
+341324.438370  7394826.842580 
+341342.011087  7394756.914558 
+341370.872895  7394645.573630 
+341386.499502  7394581.344632 
+341402.851777  7394523.584526 
+341426.106147  7394433.319987 
+341418.791741  7394311.310886 
+341415.188138  7394283.505649 
+341405.218445  7394141.509972 
+341398.192657  7394063.833277 
+341376.166975  7394068.282515 
+341353.382639  7394073.481624 
+341313.116295  7394081.630228 
+341278.943915  7394088.289088 
+341218.169195  7394102.026735 
+340924.471445  7394179.943388 
+340894.809753  7394191.191462 
+340867.811594  7394201.689663 
+340818.301225  7394231.484560 
+340750.500717  7394272.967454 
+340736.778989  7394281.645967 
+340683.813450  7394318.649629 
+340642.541065  7394347.144748 
+340619.369157  7394367.001347 
+340552.154131  7394378.809324 
+340510.419958  7394382.378713 
+340479.010065  7394386.847947 
+340399.838005  7394393.676778 
+340333.967114  7394401.795387 
+340285.256630  7394404.754880 
+340239.193186  7394411.163782 
+340193.896641  7394414.143272 
+340146.703463  7394418.242570 
+340102.157325  7394422.371862 
+340054.972393  7394426.481159 
+340062.748588  7394404.414938 
+340052.506770  7394400.105676 
+339957.370007  7394357.912904 
+339916.419226  7394340.695853 
+339888.002715  7394326.288321 
+339885.767986  7394319.769437 
+339856.749501  7394334.366937 
+339827.318703  7394352.403847 
+339778.327847  7394391.237196 
+339775.491144  7394413.353407 
+339686.398868  7394425.061402 
+339678.391778  7394428.030893 
+339671.118603  7394432.540121 
+339665.370980  7394438.969019 
+339660.357272  7394446.937655 
+339656.077478  7394459.105570 
+339652.523352  7394477.022501 
+339538.997495  7394449.917144 
+339502.153337  7394444.198124 
+339455.421947  7394436.859381 
+339414.372211  7394432.620107 
+339380.166847  7394428.840754 
+339339.867517  7394425.761282 
+339307.138228  7394428.490814 
+339266.410095  7394431.900230 
+339223.389510  7394437.569259 
+339194.436994  7394442.618394 
+339143.351595  7394457.755801 
+339121.993858  7394465.194527 
+339092.612538  7394476.732551 
+339072.796845  7394480.731866 
+339009.193668  7394491.919949 
+338992.222926  7394521.914812 
+338966.346254  7394570.906420 
+338945.392582  7394607.430164 
+338914.988730  7394670.809307 
+338898.372575  7394704.243580 
+338878.911470  7394746.326372 
+338862.287070  7394795.138011 
+338847.847920  7394841.570058 
+338834.942569  7394888.032099 
+338807.952656  7395002.742450 
+338793.752647  7395086.168160 
+338758.153669  7395250.370034 
+338740.226363  7395335.935377 
+338708.173265  7395486.209637 
+338688.613206  7395604.439385 
+338661.013072  7395771.280807 
+338652.527701  7395805.604927 
+338637.321651  7395857.096107 
+338626.502597  7395885.361266 
+338616.763798  7395905.987732 
+338604.782025  7395930.833477 
+338588.990493  7395956.839022 
+338573.561796  7395979.415155 
+338558.528917  7396005.050764 
+338542.003471  7396033.725852 
+338526.269663  7396066.970158 
+338462.196451  7396344.182674 
+338383.337747  7396580.802143 
+338340.927383  7396755.842160 
+338321.961053  7396813.082355 
+338306.367430  7396863.453727 
+338283.632573  7396926.053005 
+338252.948348  7396994.811227 
+338206.431361  7397106.442105 
+338535.431225  7397199.266206 
+338585.906403  7397212.193991 
+338837.853488  7397289.180804 
+338911.335649  7397309.607305 
+339021.373351  7397338.952279 
+339154.731393  7397356.979191 
+339360.862421  7397336.002784 
+339523.214210  7397336.002784 
+339593.026798  7397346.071059 
+339654.560171  7397352.419972 
+339841.040431  7397414.219386 
+340016.116154  7397512.502551 
+340178.896747  7397598.507819 
+340221.570991  7397617.284603 
+340301.757337  7397650.718876 
+340424.617928  7397669.145719 
+340657.879054  7397676.074533 
+340771.685283  7397678.364140 
+340824.461159  7397685.172974 
+340880.675714  7397701.700143 
+340932.074469  7397727.665696 
+Region 1
+1604
+333674.377214  7404344.182346 
+333578.795154  7404397.883148 
+333578.745677  7404397.913143 
+333535.560167  7404430.987477 
+333524.510218  7404448.624456 
+333518.861550  7404471.110604 
+333517.360736  7404497.816030 
+333518.383269  7404535.099644 
+333518.449238  7404561.345148 
+333518.309053  7404573.883000 
+333512.759339  7404586.110906 
+333505.156315  7404598.878719 
+333491.888130  7404614.486046 
+333477.407749  7404630.463309 
+333470.307744  7404640.001675 
+333459.447458  7404646.430574 
+333443.647680  7404657.278716 
+333427.443837  7404666.997051 
+333407.364265  7404671.526275 
+333392.587020  7404673.685905 
+333338.673164  7404679.114975 
+333310.908106  7404680.294773 
+333290.828534  7404683.684193 
+333278.360233  7404685.353907 
+333236.906432  7404700.611293 
+333208.044624  7404708.110009 
+333201.035328  7404709.949693 
+333149.488141  7404759.311238 
+333141.612990  7404787.026491 
+333145.389764  7404799.144415 
+333136.013800  7404859.624056 
+333127.916001  7404895.957832 
+333120.131560  7404924.772896 
+333104.595661  7404961.036685 
+333080.656853  7404999.310129 
+333061.632799  7405028.335157 
+332996.718472  7405116.959976 
+332916.029105  7405227.241086 
+332897.235945  7405313.646286 
+332879.176700  7405392.412794 
+332832.964823  7405467.419946 
+332836.543688  7405511.762350 
+332861.241148  7405568.852571 
+332864.284007  7405633.351523 
+332854.578194  7405705.229211 
+332877.700625  7405756.990345 
+332918.849316  7405822.249167 
+332887.761026  7405869.301107 
+332809.256910  7405952.576843 
+332749.026442  7406010.396939 
+332738.900071  7406031.033404 
+332735.593332  7406050.510068 
+332737.283809  7406073.086201 
+332744.491015  7406097.032099 
+332754.807049  7406115.188989 
+332800.598368  7406153.892359 
+332830.532185  7406174.618809 
+332852.120817  7406197.254932 
+332854.396777  7406213.512147 
+332846.810245  7406250.155870 
+332846.892707  7406261.823871 
+332852.467159  7406276.861296 
+332875.317464  7406299.007502 
+332890.531760  7406310.125598 
+332901.400292  7406325.253007 
+332913.852100  7406352.558329 
+332925.240144  7406382.903132 
+332937.403335  7406407.478922 
+332956.031570  7406431.534802 
+332973.917644  7406448.531890 
+332997.782235  7406470.938052 
+333031.426856  7406495.783796 
+333063.933498  7406512.990849 
+333150.518919  7406570.311030 
+333186.868304  7406600.255901 
+333238.456723  7406725.004533 
+333247.956381  7406747.200731 
+333259.047561  7406764.087838 
+333277.659304  7406783.894446 
+333289.962680  7406804.610897 
+333307.626106  7406836.815381 
+333332.537969  7406873.189150 
+333358.340424  7406917.941484 
+333364.096293  7406937.538128 
+333353.310224  7406969.332682 
+333340.140993  7406990.928982 
+333337.246566  7407016.244646 
+333337.048657  7407047.169349 
+333322.840401  7407071.285218 
+333301.416694  7407088.972188 
+333279.836308  7407100.060289 
+333246.158703  7407111.978248 
+333225.798759  7407126.125824 
+333214.179820  7407145.222553 
+333222.137433  7407169.678364 
+333228.792141  7407180.166568 
+333229.229191  7407201.732874 
+333220.067629  7407259.392997 
+333225.642081  7407291.437508 
+333233.583201  7407300.405972 
+333238.869035  7407317.483047 
+333238.613401  7407335.729921 
+333231.026869  7407354.116772 
+333222.483774  7407369.964057 
+333209.603162  7407389.800659 
+333195.386660  7407407.247671 
+333184.707792  7407420.355426 
+333171.686994  7407432.333374 
+333158.187914  7407442.271671 
+333135.296378  7407456.889168 
+333126.448172  7407476.015891 
+333122.432258  7407492.703033 
+333117.839107  7407513.669442 
+333112.553274  7407530.576546 
+333103.762792  7407546.423831 
+333083.105984  7407579.828109 
+333078.471602  7407604.353908 
+333078.900406  7407626.670086 
+333089.892632  7407667.903023 
+333104.257566  7407718.824301 
+333109.172319  7407744.999817 
+333108.322957  7407768.815737 
+333104.801817  7407785.252922 
+333094.988802  7407801.330168 
+333083.971838  7407813.838026 
+333077.242914  7407826.405873 
+333075.016432  7407840.583444 
+333081.118642  7407854.361084 
+333088.210401  7407868.658635 
+333099.301581  7407886.055655 
+333105.073942  7407904.662468 
+333107.531319  7407925.988815 
+333107.382887  7407953.624081 
+333103.193802  7407999.186277 
+332938.953626  7408038.109610 
+332946.498927  7408125.794590 
+332952.411474  7408178.075635 
+332961.630760  7408167.287483 
+332972.466307  7408144.621365 
+332988.637166  7408121.255368 
+333004.008140  7408104.198289 
+333018.034978  7408096.479612 
+333042.179941  7408095.929706 
+333058.688895  7408097.089507 
+333077.465562  7408101.798700 
+333099.029455  7408106.037974 
+333139.947252  7408105.628045 
+333168.652381  7408106.637872 
+333203.938002  7408111.996954 
+333221.436503  7408117.206061 
+333243.726064  7408127.764253 
+333263.954068  7408141.341927 
+333282.705997  7408149.600512 
+333312.103809  7408160.978563 
+333336.941456  7408169.277142 
+333352.881420  7408179.535385 
+333361.911042  7408196.292515 
+333363.807675  7408216.279091 
+333361.647163  7408233.706106 
+333360.492690  7408253.412730 
+333358.488856  7408284.997320 
+333358.777474  7408316.101992 
+333364.657037  7408347.496615 
+333373.167147  7408365.773484 
+333381.429870  7408382.780571 
+333400.866236  7408402.167250 
+333420.121184  7408409.915923 
+333441.932464  7408415.414981 
+333474.933879  7408421.014022 
+333504.372923  7408426.323112 
+333535.048901  7408436.701335 
+333563.671567  7408448.829257 
+333588.426752  7408469.775669 
+333606.098424  7408486.362828 
+333624.256624  7408506.499379 
+333637.862904  7408522.036717 
+333660.276159  7408551.811617 
+333674.632847  7408569.878523 
+333687.999987  7408583.906120 
+333707.675493  7408604.802540 
+333724.811160  7408624.169223 
+333735.349843  7408643.975830 
+333744.099094  7408663.772439 
+333752.592711  7408684.578875 
+333764.153927  7408703.635611 
+333778.007594  7408720.952645 
+333794.194945  7408730.690977 
+333807.858949  7408739.159526 
+333828.688928  7408740.599280 
+333844.183595  7408741.749083 
+333869.837619  7408742.478958 
+333895.508135  7408742.698920 
+333933.613967  7408743.788733 
+333967.720377  7408743.098852 
+333999.146762  7408744.668583 
+334025.501715  7408746.948192 
+334058.923688  7408752.327271 
+334092.609540  7408756.956478 
+334116.944166  7408758.206264 
+334143.851617  7408755.946651 
+334174.313193  7408752.977159 
+334195.885332  7408751.677382 
+334224.037964  7408751.197464 
+334247.820093  7408756.476560 
+334272.863895  7408763.285394 
+334301.626748  7408778.462794 
+334318.490290  7408791.500561 
+334336.805168  7408811.867072 
+334345.158600  7408839.702304 
+334351.747338  7408892.253303 
+334354.617026  7408936.435735 
+334355.367433  7408989.676615 
+334353.041996  7409019.931433 
+334347.079971  7409059.234700 
+334333.960218  7409104.276985 
+334321.854752  7409149.319270 
+334311.349054  7409186.552892 
+334298.625120  7409217.207641 
+334273.548333  7409266.669169 
+334250.491872  7409289.905189 
+334232.877923  7409301.843144 
+334218.793361  7409315.580791 
+334200.503222  7409345.425678 
+334192.924936  7409367.801846 
+334186.146534  7409386.908573 
+334177.636424  7409405.875324 
+334169.967429  7409416.673474 
+334165.827822  7409430.771060 
+334164.961967  7409450.177735 
+334166.198902  7409456.496653 
+334170.701344  7409468.624576 
+334185.602283  7409479.302746 
+334200.297066  7409483.162085 
+334217.045160  7409481.752327 
+334239.433676  7409468.524593 
+334266.143217  7409454.556985 
+334287.748342  7409446.868302 
+334314.960903  7409433.660565 
+334342.627007  7409429.791227 
+334371.051764  7409426.431803 
+334393.638189  7409424.542126 
+334410.897550  7409423.632282 
+334430.449363  7409419.213039 
+334443.651578  7409417.023414 
+334470.385858  7409393.017526 
+334489.616068  7409371.011296 
+334501.812243  7409342.866117 
+334510.907836  7409320.000034 
+334512.919916  7409295.794180 
+334512.383911  7409272.578157 
+334509.060680  7409249.582096 
+334508.442213  7409234.684647 
+334510.074966  7409223.346589 
+334515.204122  7409217.597574 
+334525.899483  7409212.908377 
+334548.197291  7409215.147994 
+334568.606711  7409228.975625 
+334598.276649  7409255.011166 
+334617.704769  7409265.049446 
+334634.848682  7409275.807603 
+334660.634645  7409283.886220 
+334702.451281  7409286.825716 
+334739.790213  7409281.396646 
+334760.867579  7409278.077215 
+334795.097682  7409278.917071 
+334832.238705  7409292.914673 
+334859.500744  7409306.302380 
+334887.768822  7409320.209998 
+334917.100665  7409328.828521 
+334940.651899  7409332.347919 
+334980.522425  7409326.938845 
+335007.454614  7409322.159664 
+335040.258119  7409313.151207 
+335064.658716  7409307.592159 
+335099.416578  7409305.662489 
+335131.090350  7409308.502003 
+335163.506283  7409313.621126 
+335189.811758  7409320.939873 
+335217.337676  7409333.077794 
+335241.532117  7409348.205202 
+335256.111453  7409361.212974 
+335278.203105  7409384.648960 
+335289.706597  7409401.416088 
+335287.265712  7409420.452827 
+335287.216235  7409430.031186 
+335277.691838  7409454.936920 
+335264.918427  7409472.013995 
+335250.124689  7409487.561332 
+335242.942223  7409501.378965 
+335234.209464  7409522.255389 
+335225.740585  7409540.112330 
+335217.288199  7409555.189748 
+335213.428963  7409564.998068 
+335182.571568  7409595.832786 
+335172.090609  7409611.150162 
+335158.558544  7409626.457540 
+335150.864811  7409642.294827 
+335142.082575  7409671.739784 
+335134.091978  7409695.905644 
+335131.172812  7409719.841544 
+335125.952948  7409745.527145 
+335119.743537  7409768.183264 
+335110.730407  7409793.338955 
+335102.253281  7409813.965422 
+335087.624468  7409845.150080 
+335075.271615  7409877.354564 
+335069.053957  7409901.770382 
+335065.392630  7409922.426843 
+335065.235952  7409950.662007 
+335069.416791  7409974.637900 
+335077.704253  7409990.075256 
+335090.535388  7410008.802048 
+335108.437954  7410028.578660 
+335118.267461  7410040.986535 
+335138.239832  7410052.954485 
+335159.721263  7410066.952087 
+335180.971799  7410076.910382 
+335205.784707  7410086.128803 
+335231.100635  7410095.107265 
+335253.159302  7410096.996941 
+335279.778135  7410098.666655 
+335299.049576  7410099.786463 
+335329.733800  7410100.726302 
+335358.372959  7410105.435496 
+335374.337662  7410108.295006 
+335390.277625  7410116.213649 
+335398.111545  7410121.552735 
+335406.671132  7410132.950782 
+335409.145001  7410145.058709 
+335409.516082  7410169.274561 
+335404.840469  7410189.411111 
+335389.436510  7410223.365295 
+335378.337084  7410259.859044 
+335369.233245  7410300.902014 
+335359.453215  7410326.567618 
+335345.541824  7410366.570766 
+335329.131825  7410398.755253 
+335316.564570  7410425.150731 
+335311.130304  7410444.787368 
+335302.884073  7410468.693273 
+335297.928088  7410492.869132 
+335297.045742  7410516.065158 
+335301.968741  7410543.070533 
+335323.573866  7410581.773903 
+335341.435201  7410609.359178 
+335359.296537  7410635.684669 
+335379.186445  7410663.289940 
+335393.279253  7410683.546470 
+335403.314916  7410704.532876 
+335410.810740  7410725.499284 
+335431.607733  7410772.521230 
+335445.923190  7410799.586594 
+335459.224360  7410824.372348 
+335483.864097  7410864.605457 
+335500.744131  7410886.141768 
+335519.900125  7410907.938034 
+335540.293053  7410936.043220 
+335562.384705  7410978.785899 
+335569.616650  7411002.021918 
+335583.577518  7411046.484302 
+335592.277291  7411080.068550 
+335606.568009  7411110.403354 
+335624.940611  7411135.978973 
+335652.186157  7411164.384107 
+335671.614276  7411183.400850 
+335694.827416  7411206.236938 
+335718.296188  7411227.553287 
+335738.738594  7411247.339898 
+335761.646623  7411279.494390 
+335775.706446  7411305.289971 
+335792.792636  7411334.894900 
+335805.005303  7411375.557935 
+335822.751192  7411422.819840 
+335838.014965  7411461.983131 
+335846.450859  7411496.327248 
+335857.443084  7411527.911838 
+335870.002093  7411550.427981 
+335883.855761  7411568.914815 
+335909.905603  7411582.932414 
+335945.611782  7411592.720737 
+335962.071259  7411598.619727 
+335990.413553  7411610.637668 
+336010.888944  7411623.105532 
+336030.869561  7411633.313784 
+336039.973399  7411639.162782 
+336054.115685  7411650.090910 
+336067.194207  7411671.347269 
+336072.183176  7411686.504673 
+336085.022557  7411703.471766 
+336104.764034  7411711.410407 
+336123.515962  7411715.799655 
+336152.171614  7411716.979453 
+336170.469999  7411709.520730 
+336189.576516  7411695.013215 
+336203.595108  7411682.485361 
+336219.114514  7411674.006814 
+336227.748318  7411671.787194 
+336244.257271  7411667.597911 
+336259.718954  7411670.207464 
+336277.415365  7411681.155589 
+336294.080997  7411695.113198 
+336309.946745  7411715.889639 
+336319.759759  7411730.817082 
+336328.509010  7411753.813143 
+336335.782185  7411769.740415 
+336340.795893  7411780.108639 
+336349.371973  7411788.477206 
+336362.302063  7411790.066934 
+336394.792212  7411785.217764 
+336418.928929  7411778.048992 
+336441.548340  7411770.620265 
+336463.128725  7411765.951064 
+336482.919679  7411764.551304 
+336498.645241  7411765.911071 
+336524.991947  7411771.360138 
+336542.968730  7411777.769040 
+336565.695342  7411796.055908 
+336582.080602  7411814.552739 
+336597.632993  7411846.167324 
+336608.666450  7411870.433167 
+336614.884108  7411892.409403 
+336624.169363  7411910.616284 
+336626.643233  7411923.494079 
+336626.857635  7411929.293085 
+336626.824650  7411936.601833 
+336628.308971  7411942.410838 
+336634.872971  7411948.249838 
+336641.164845  7411957.108321 
+336646.186799  7411966.466718 
+336649.666709  7411979.854425 
+336651.464387  7412023.486951 
+336652.569382  7412052.991897 
+336648.809101  7412091.795250 
+336646.376463  7412118.760631 
+336646.516648  7412139.687047 
+336648.190633  7412159.113719 
+336646.549633  7412180.030136 
+336634.749277  7412204.425958 
+336613.548218  7412232.281186 
+336595.423003  7412253.357576 
+336581.132286  7412269.664783 
+336565.588141  7412282.932510 
+336546.745504  7412295.940282 
+336530.467445  7412303.908917 
+336497.441291  7412314.557093 
+336482.449644  7412319.006331 
+336471.012122  7412322.975651 
+336457.018268  7412331.464197 
+336440.162973  7412351.540758 
+336429.904662  7412372.657141 
+336420.355527  7412403.621837 
+336413.346231  7412433.576706 
+336409.618934  7412464.571397 
+336404.349593  7412501.855011 
+336400.383156  7412531.339960 
+336405.603020  7412551.036586 
+336421.955295  7412575.582382 
+336439.379581  7412589.559988 
+336466.402479  7412611.396247 
+336497.762894  7412628.223365 
+336529.609837  7412649.339748 
+336556.665719  7412665.127044 
+336579.911844  7412682.164125 
+336596.090948  7412691.582512 
+336616.599324  7412699.011240 
+336632.968092  7412706.899888 
+336649.988312  7412715.098484 
+336670.744074  7412723.287081 
+336682.635139  7412729.406033 
+336695.491012  7412744.363471 
+336715.554091  7412786.586239 
+336726.620533  7412803.793291 
+336743.772693  7412820.790380 
+336759.193144  7412830.208767 
+336785.762499  7412842.966581 
+336808.307694  7412847.645780 
+336831.850682  7412855.844375 
+336846.792852  7412860.723540 
+336860.217716  7412863.583050 
+336877.971850  7412864.442903 
+336896.954673  7412871.361717 
+336926.550395  7412885.909226 
+336950.093383  7412894.617734 
+336968.309307  7412903.046290 
+336992.643934  7412905.955792 
+337015.964274  7412909.125249 
+337049.955237  7412908.565345 
+337075.073255  7412907.455535 
+337104.751439  7412907.625506 
+337131.378518  7412908.285393 
+337155.441019  7412915.234203 
+337177.911998  7412933.771027 
+337217.032116  7412969.304941 
+337252.861988  7413004.308945 
+337279.884886  7413026.905074 
+337320.077014  7413051.850801 
+337341.607922  7413056.520002 
+337369.678091  7413072.567253 
+337391.909929  7413088.834466 
+337416.656867  7413109.650901 
+337428.498454  7413124.348383 
+337449.897423  7413153.723352 
+337463.767583  7413168.170877 
+337494.591993  7413191.546873 
+337520.353218  7413211.113521 
+337543.079829  7413229.660344 
+337564.528275  7413251.466609 
+337593.752917  7413286.940533 
+337623.950613  7413331.742858 
+337655.203827  7413368.996477 
+337681.690720  7413395.122002 
+337702.141372  7413412.379046 
+337723.128029  7413424.107037 
+337749.466490  7413432.575587 
+337787.976387  7413440.624208 
+337828.226239  7413455.481663 
+337856.840659  7413464.730079 
+337891.516059  7413477.537885 
+337914.786922  7413490.535659 
+337951.936191  7413515.211432 
+337975.190561  7413530.468818 
+338005.272811  7413549.305592 
+338029.755870  7413570.381982 
+338050.965175  7413588.658851 
+338064.868320  7413597.057412 
+338091.940695  7413610.325140 
+338116.728864  7413623.332912 
+338139.719355  7413639.350168 
+338160.145269  7413662.166260 
+338172.704278  7413684.432446 
+338177.404629  7413705.888771 
+338181.527745  7413740.702807 
+338185.436458  7413768.718008 
+338192.932282  7413789.434460 
+338209.309296  7413810.960773 
+338233.050194  7413829.767551 
+338254.811996  7413838.466061 
+338296.331768  7413852.573645 
+338325.218314  7413859.042537 
+338360.437965  7413864.801550 
+338376.913934  7413866.911189 
+338397.191415  7413870.310607 
+338414.417791  7413874.189942 
+338428.576569  7413882.348545 
+338440.649050  7413901.835207 
+338451.905155  7413930.390315 
+338456.877632  7413949.327072 
+338462.023280  7413981.631538 
+338465.956732  7414004.597604 
+338467.391576  7414020.994796 
+338465.231064  7414045.950521 
+338468.043029  7414068.926585 
+338468.463586  7414086.623554 
+338468.694481  7414110.889398 
+338466.591692  7414130.126103 
+338461.487275  7414155.201807 
+338459.318516  7414167.099769 
+338456.671476  7414183.057036 
+338456.564275  7414197.974481 
+338457.661024  7414207.322879 
+338461.808878  7414215.621458 
+338466.929787  7414220.370644 
+338478.647681  7414223.290144 
+338507.897061  7414227.299458 
+338521.371402  7414229.189134 
+338536.429019  7414236.877817 
+338555.321134  7414246.806116 
+338573.182469  7414254.974717 
+338589.229634  7414259.863880 
+338601.945322  7414261.263640 
+338612.838592  7414258.624092 
+338628.720833  7414245.576327 
+338642.120957  7414238.617519 
+338660.584268  7414230.598892 
+338682.890322  7414225.319797 
+338714.852712  7414221.210501 
+338735.187917  7414222.780232 
+338756.273528  7414222.820225 
+338794.173204  7414228.519249 
+338819.851967  7414230.788860 
+338846.800648  7414233.308428 
+338866.154552  7414238.167596 
+338887.495797  7414238.977457 
+338911.393373  7414240.757152 
+338930.227764  7414244.616491 
+338955.106642  7414243.616663 
+338979.482499  7414242.356878 
+338995.752313  7414243.716646 
+339012.772533  7414243.806630 
+339025.719115  7414242.916783 
+339037.832828  7414234.958146 
+339050.911349  7414221.180506 
+339060.204851  7414209.962427 
+339095.506965  7414182.057207 
+339108.865858  7414171.559005 
+339128.046591  7414157.971333 
+339149.750670  7414143.343838 
+339163.637322  7414133.855464 
+339175.973683  7414122.357433 
+339184.549763  7414116.208487 
+339201.974049  7414105.160379 
+339213.625972  7414101.760961 
+339237.193700  7414095.711997 
+339250.651548  7414095.072107 
+339269.922989  7414092.352573 
+339285.648551  7414089.673032 
+339303.839736  7414079.384794 
+339319.243695  7414069.116553 
+339329.081448  7414058.828315 
+339351.758582  7414040.811401 
+339368.300521  7414030.313200 
+339392.445484  7414021.124773 
+339415.567915  7414013.696046 
+339438.426466  7414009.296800 
+339466.587344  7414007.697074 
+339489.404664  7414009.846705 
+339510.935572  7414014.255950 
+339537.554405  7414017.435405 
+339564.428870  7414019.864989 
+339591.542477  7414025.064099 
+339612.059099  7414030.483170 
+339632.023223  7414044.470775 
+339646.421142  7414054.389076 
+339656.019754  7414061.497858 
+339669.856929  7414077.535111 
+339684.617682  7414107.469983 
+339694.043124  7414137.214888 
+339699.098063  7414161.180783 
+339701.390515  7414188.966024 
+339703.320133  7414205.383212 
+339703.938600  7414216.501307 
+339711.162299  7414229.069155 
+339720.876358  7414235.548045 
+339740.263246  7414244.206562 
+339766.247119  7414252.035221 
+339791.480585  7414261.393618 
+339803.487097  7414268.102468 
+339826.452849  7414279.250559 
+339853.319069  7414299.717053 
+339874.091324  7414321.003407 
+339905.905281  7414354.307702 
+339928.038165  7414385.182414 
+339947.647701  7414417.356903 
+339964.783368  7414456.370220 
+339973.903699  7414481.305949 
+339992.688613  7414506.151693 
+340014.013365  7414531.977269 
+340027.603153  7414545.494954 
+340060.917925  7414576.519639 
+340088.056270  7414599.505702 
+340117.734454  7414621.461941 
+340146.653985  7414644.438006 
+340187.769691  7414667.794005 
+340217.637539  7414683.431326 
+340261.540471  7414705.997461 
+340290.822836  7414717.215539 
+340307.727608  7414724.234337 
+340334.692783  7414738.691861 
+340359.901510  7414750.859776 
+340388.689101  7414761.297989 
+340426.448591  7414784.963935 
+340457.165800  7414803.250802 
+340493.927496  7414825.147052 
+340515.598591  7414837.015019 
+340543.479096  7414859.311200 
+340574.798280  7414890.725819 
+340593.261591  7414916.191457 
+340624.391112  7414963.503353 
+340646.779628  7414999.107254 
+340665.737712  7415025.082805 
+340684.728781  7415049.028703 
+340700.561544  7415061.086637 
+340724.723000  7415076.264038 
+340740.052743  7415088.062017 
+340751.795375  7415102.079616 
+340764.230691  7415122.926045 
+340778.653348  7415146.571995 
+340793.809920  7415172.497554 
+340808.966492  7415198.423113 
+340825.483692  7415216.290053 
+340851.846891  7415238.306281 
+340879.001729  7415257.812940 
+340910.312667  7415269.550929 
+340935.348223  7415275.149970 
+340966.939533  7415284.358393 
+340986.862426  7415293.436838 
+341003.445596  7415306.754557 
+341017.958962  7415323.081760 
+341023.879755  7415336.279499 
+341028.373951  7415363.084908 
+341030.320061  7415390.870149 
+341037.568498  7415420.994988 
+341045.155030  7415443.291169 
+341062.645285  7415464.957458 
+341080.473636  7415479.804915 
+341100.074926  7415494.682366 
+341120.690503  7415509.569816 
+341148.917351  7415524.537253 
+341177.276138  7415549.113043 
+341197.141307  7415563.230625 
+341214.878949  7415585.396828 
+341222.968502  7415608.212920 
+341225.161999  7415636.758030 
+341230.860144  7415668.882528 
+341237.951903  7415690.418839 
+341249.595580  7415713.274923 
+341263.416263  7415744.479578 
+341275.447514  7415777.693889 
+341279.991187  7415800.459989 
+341291.478186  7415835.933913 
+341301.629296  7415856.240435 
+341309.529185  7415874.257349 
+341321.247079  7415911.500969 
+341333.294822  7415942.685628 
+341346.431067  7415967.831320 
+341366.329222  7416000.125789 
+341382.821683  7416020.512297 
+341400.617049  7416037.889320 
+341420.201846  7416054.526470 
+341447.101051  7416074.033129 
+341468.516512  7416085.901096 
+341484.679124  7416091.140199 
+341508.964273  7416096.729241 
+341525.819568  7416108.037304 
+341539.912377  7416116.785806 
+341554.227833  7416128.823744 
+341570.035857  7416142.891334 
+341590.766881  7416148.190426 
+341607.275835  7416145.860825 
+341618.243322  7416140.691711 
+341625.706160  7416131.953208 
+341638.570280  7416116.705819 
+341656.695495  7416107.587381 
+341672.470534  7416103.228128 
+341692.310965  7416098.678907 
+341715.021084  7416087.080894 
+341727.085320  7416075.112944 
+341746.777319  7416040.778825 
+341764.556192  7416017.512810 
+341796.089778  7415989.877544 
+341819.352395  7415974.760133 
+341853.458805  7415965.071793 
+341882.188672  7415958.602901 
+341905.723414  7415963.432074 
+341931.550609  7415966.511546 
+341948.950155  7415974.800127 
+341969.376069  7415984.388484 
+341989.546349  7415994.466758 
+342015.456006  7416012.193721 
+342031.066120  7416021.212177 
+342058.286928  7416035.679698 
+342078.053142  7416036.669529 
+342108.308563  7416030.720548 
+342127.893360  7416025.911372 
+342154.908012  7416015.133218 
+342174.558780  7416005.524864 
+342201.326044  7415993.726885 
+342236.479726  7415981.279017 
+342275.401934  7415971.400709 
+342311.000912  7415963.742021 
+342331.632981  7415956.423274 
+342350.096291  7415939.986090 
+342365.013723  7415922.749042 
+342370.555190  7415904.642144 
+342375.906993  7415881.746066 
+342384.351134  7415854.580719 
+342395.104218  7415825.435711 
+342406.261368  7415805.129190 
+342428.146865  7415778.133814 
+342454.559541  7415754.217910 
+342484.328434  7415725.042908 
+342510.980251  7415702.396787 
+342538.869003  7415682.540188 
+342550.652867  7415672.841849 
+342574.204102  7415654.954913 
+342595.974151  7415637.287939 
+342624.679280  7415612.902116 
+342649.516926  7415593.265480 
+342675.665724  7415569.849491 
+342704.857380  7415546.983408 
+342737.100142  7415523.137492 
+342766.910266  7415511.889419 
+342797.446058  7415503.670827 
+342818.350253  7415495.092296 
+342840.615075  7415478.445148 
+342854.732622  7415464.477540 
+342867.613234  7415448.480280 
+342894.091881  7415418.515413 
+342919.341839  7415406.957393 
+342948.352079  7415398.968761 
+342970.179851  7415397.469018 
+342989.970805  7415396.949107 
+342978.170449  7415387.210775 
+342972.447565  7415377.812385 
+342960.020495  7415356.965956 
+342958.437219  7415341.548597 
+342953.885299  7415319.282411 
+342948.286109  7415300.035708 
+342935.644637  7415276.159797 
+342927.480869  7415258.902753 
+342914.080744  7415234.256975 
+342888.352504  7415181.196064 
+342876.725319  7415156.830237 
+342865.048657  7415115.807264 
+342857.726004  7415092.501256 
+342855.045979  7415062.686363 
+342849.694175  7415022.743205 
+342852.036105  7414997.027610 
+342857.313692  7414958.984127 
+342863.201501  7414934.068395 
+342873.212425  7414903.143692 
+342881.846229  7414860.091066 
+342884.534500  7414826.806767 
+342884.872595  7414799.301479 
+342880.452616  7414765.927196 
+342871.744596  7414752.449504 
+342859.985471  7414739.181777 
+342841.291266  7414733.152810 
+342819.092413  7414723.044541 
+342801.165108  7414716.265702 
+342778.949762  7414707.677173 
+342759.571120  7414695.329288 
+342741.050086  7414675.162743 
+342733.150197  7414657.405784 
+342731.599906  7414638.708987 
+342731.212333  7414607.914262 
+342728.837419  7414574.060061 
+342721.432304  7414556.813015 
+342711.998616  7414540.545801 
+342696.899768  7414530.527517 
+342677.504633  7414519.439417 
+342659.140277  7414507.101530 
+342645.591720  7414495.333546 
+342620.778812  7414470.547791 
+342566.617570  7414419.426548 
+342528.544723  7414380.103284 
+342448.069758  7414302.916505 
+342399.911771  7414258.924041 
+342369.598627  7414227.769377 
+342339.268991  7414198.134453 
+342315.965143  7414174.628480 
+342290.385335  7414151.102509 
+342267.947342  7414139.734457 
+342243.703424  7414131.365890 
+342225.751380  7414126.856663 
+342207.527210  7414123.867175 
+342194.390964  7414119.667894 
+342186.350890  7414113.258992 
+342173.560986  7414101.501006 
+342167.986534  7414087.293439 
+342157.612776  7414072.146034 
+342143.684892  7414055.988802 
+342126.969783  7414035.782263 
+342114.311819  7414019.625030 
+342102.156875  7414003.967712 
+342095.592875  7413988.830305 
+342090.290549  7413969.653590 
+342085.260348  7413947.207435 
+342084.023413  7413927.790761 
+342085.845830  7413900.555426 
+342087.173474  7413869.280783 
+342084.938745  7413840.785664 
+342082.951403  7413815.060071 
+342082.984388  7413797.153138 
+342087.594031  7413772.447370 
+342095.238287  7413751.530952 
+342103.905076  7413730.604537 
+342111.301944  7413706.918594 
+342120.496492  7413676.413819 
+342123.852707  7413642.629606 
+342128.981863  7413612.374789 
+342134.358405  7413582.879841 
+342142.019154  7413554.134765 
+342150.438555  7413527.669298 
+342156.062484  7413502.963530 
+342163.467599  7413478.257762 
+342166.287810  7413460.870740 
+342167.095941  7413431.615751 
+342162.832640  7413406.640029 
+342154.240067  7413387.213357 
+342149.465500  7413357.198498 
+342146.216485  7413331.972819 
+342146.249470  7413310.786448 
+342148.566661  7413291.879687 
+342150.380831  7413272.213055 
+342154.858535  7413246.207510 
+342158.330198  7413222.541564 
+342157.868409  7413194.046445 
+342157.926132  7413164.031586 
+342156.705690  7413137.046208 
+342156.235655  7413113.590226 
+342148.418229  7413085.844978 
+342143.115902  7413069.947702 
+342121.840627  7413048.731336 
+342102.593925  7413029.284667 
+342081.054770  7413012.857481 
+342063.820148  7412998.709904 
+342051.920838  7412985.582153 
+342044.078672  7412969.934833 
+342039.526753  7412962.366129 
+342035.989120  7412955.297340 
+342034.480060  7412948.238549 
+342041.093537  7412938.160276 
+342051.252893  7412932.871181 
+342066.236294  7412926.342300 
+342077.409936  7412920.303334 
+342083.767780  7412911.994757 
+342087.354891  7412891.068342 
+342085.095423  7412875.431020 
+342069.650233  7412859.263790 
+342052.415611  7412845.116213 
+342030.373437  7412829.198940 
+342007.061343  7412812.011884 
+341983.741003  7412796.344567 
+341956.371763  7412777.637772 
+341931.525870  7412764.739981 
+341915.058147  7412753.121971 
+341884.646049  7412731.385694 
+341867.930939  7412712.448938 
+341854.514322  7412692.252397 
+341845.418730  7412673.575596 
+341833.791544  7412645.820351 
+341825.710238  7412622.864283 
+341807.989089  7412600.138176 
+341792.304758  7412575.402413 
+341772.563282  7412544.607688 
+341754.833886  7412525.920888 
+341728.503672  7412493.346468 
+341703.690764  7412464.811356 
+341679.372629  7412439.305725 
+341648.721390  7412409.250873 
+341563.842938  7412339.272860 
+341468.846361  7412251.367917 
+341439.448549  7412229.631640 
+341412.087555  7412208.665231 
+341386.491255  7412188.958607 
+341363.179161  7412172.281464 
+341340.625721  7412153.834623 
+341319.853466  7412133.878042 
+341308.721054  7412114.441371 
+341292.286317  7412080.627163 
+341282.679458  7412062.710232 
+341273.592112  7412035.964813 
+341261.973173  7412005.430044 
+341245.274556  7411976.405015 
+341234.397777  7411956.718388 
+341218.977326  7411927.693359 
+341196.704257  7411894.878980 
+341179.741761  7411870.143217 
+341168.370209  7411845.657411 
+341154.186692  7411831.519833 
+341135.690397  7411814.342775 
+341107.826383  7411787.067447 
+341087.054128  7411769.890390 
+341062.488607  7411741.605235 
+341044.767457  7411719.139083 
+340989.798084  7411664.578429 
+340954.611418  7411621.405824 
+340937.896308  7411598.679716 
+340922.459364  7411576.973434 
+340904.993848  7411550.977887 
+340891.832864  7411534.310742 
+340866.756076  7411508.045241 
+340837.613897  7411485.809050 
+340803.655920  7411464.572688 
+340777.037087  7411447.895544 
+340750.937767  7411430.448533 
+340728.631713  7411414.781217 
+340706.845172  7411397.604159 
+340687.087203  7411379.667231 
+340671.130747  7411363.250043 
+340658.720170  7411350.122292 
+340654.184743  7411330.945577 
+340650.919236  7411308.999336 
+340656.279285  7411293.372013 
+340661.375456  7411278.754517 
+340680.193354  7411257.858096 
+340693.906836  7411249.549519 
+340717.021020  7411235.971845 
+340736.564587  7411230.702748 
+340758.911872  7411224.173866 
+340777.366936  7411217.674979 
+340786.264619  7411206.336921 
+340796.935242  7411194.498949 
+340799.475081  7411188.449985 
+340813.699828  7411176.112098 
+340825.129104  7411162.754386 
+340842.149324  7411147.896931 
+340858.905665  7411133.039476 
+340875.670252  7411117.932064 
+340887.355161  7411107.353876 
+340901.068642  7411092.486423 
+340914.015224  7411085.697586 
+340928.487359  7411074.109571 
+340951.865423  7411046.144361 
+340961.274372  7411031.276907 
+340967.632216  7411018.419110 
+340972.728387  7411001.272047 
+340974.773452  7410990.433903 
+340981.139542  7410973.286841 
+340985.955340  7410959.729163 
+340992.667772  7410948.551078 
+340995.867310  7410941.602268 
+341000.600646  7410851.987618 
+340996.320852  7410832.051033 
+340991.018526  7410815.643843 
+340980.636522  7410800.746395 
+340974.831175  7410786.868772 
+340972.307829  7410773.751019 
+340969.800975  7410755.834088 
+340969.817467  7410745.235904 
+340977.964743  7410723.559617 
+340992.709003  7410701.383415 
+341003.140485  7410682.726611 
+341008.995309  7410663.819849 
+341011.056867  7410645.413002 
+341010.067319  7410626.236287 
+341005.531892  7410611.098880 
+340995.405521  7410596.701346 
+340985.287396  7410578.524460 
+340974.658004  7410563.627012 
+340969.611311  7410549.499431 
+340967.079719  7410543.190512 
+340963.294699  7410532.842285 
+340963.129774  7410519.884504 
+340961.488774  7410508.746412 
+340967.038487  7410501.037733 
+340978.904813  7410487.190105 
+341001.845827  7410459.484850 
+341010.619816  7410442.497760 
+341010.858957  7410419.981617 
+341006.430731  7410396.635616 
+341001.936535  7410382.757993 
+340997.285661  7410361.361658 
+340991.727702  7410344.704511 
+340986.425376  7410327.797407 
+340981.139542  7410304.841339 
+340978.880075  7410287.934235 
+340964.704804  7410271.517047 
+340948.484468  7410264.428262 
+340930.738580  7410256.589604 
+340912.497918  7410245.461510 
+340897.803135  7410232.073804 
+340890.480482  7410213.397003 
+340885.169910  7410204.558517 
+340878.605910  7410183.112190 
+340875.579543  7410168.724655 
+340872.808810  7410159.896167 
+340863.952358  7410142.479150 
+340853.578600  7410128.591529 
+340848.762801  7410126.571875 
+340838.619938  7410123.522397 
+340838.619938  7410123.522397 
+340804.109462  7410135.840288 
+340783.048589  7410143.378996 
+340767.059148  7410149.158006 
+340752.083993  7410158.976325 
+340737.620105  7410163.745508 
+340721.375030  7410171.284216 
+340699.563750  7410174.033745 
+340691.952479  7410175.783446 
+340680.036676  7410173.503836 
+340658.744908  7410162.875657 
+340628.085423  7410143.658948 
+340611.625946  7410126.991803 
+340596.436390  7410109.064874 
+340586.062631  7410093.407556 
+340573.149034  7410077.250323 
+340562.519643  7410066.642141 
+340551.370739  7410057.033786 
+340542.761674  7410049.705042 
+340532.627057  7410042.886210 
+340528.569911  7410038.846902 
+340510.065370  7410032.507987 
+340490.546542  7410025.929114 
+340479.397638  7410023.139592 
+340473.567553  7410019.600198 
+340465.197629  7410018.570375 
+340460.126197  7410016.550721 
+340455.813418  7410017.800507 
+340452.506680  7410026.379037 
+340450.717248  7410032.927916 
+340448.177409  7410037.467138 
+340438.529319  7410044.515931 
+340417.006657  7410020.020126 
+340398.518608  7410003.852896 
+340385.101991  7409989.205405 
+340373.194434  7409976.827525 
+340364.841002  7409967.479126 
+340352.430425  7409956.111074 
+340341.133089  7409948.062452 
+340328.986391  7409943.453242 
+340319.132145  7409936.834375 
+340299.671041  7409922.856770 
+340282.725037  7409913.678342 
+340275.385892  7409911.618695 
+340264.228742  7409911.048792 
+340253.830245  7409910.488888 
+340243.233839  7409900.090669 
+340238.690165  7409895.521452 
+340236.455437  7409886.682966 
+340226.865071  7409878.554358 
+340223.104790  7409870.465744 
+340214.256584  7409864.366789 
+340210.001529  7409854.248522 
+340208.286313  7409842.900465 
+340206.587590  7409828.013016 
+340202.629399  7409810.586001 
+340192.280379  7409801.447566 
+340183.959933  7409792.329128 
+340174.089195  7409787.479959 
+340167.508703  7409785.170354 
+340156.895804  7409777.041746 
+340148.303231  7409772.452533 
+340140.741438  7409762.574225 
+340136.238996  7409751.196174 
+340130.986147  7409738.058424 
+340125.716806  7409727.180287 
+340115.343047  7409722.081161 
+340094.323406  7409715.902219 
+340081.640703  7409715.832231 
+340068.958000  7409717.022027 
+340055.252765  7409717.691913 
+340041.794916  7409720.891365 
+340026.819761  7409722.071162 
+340009.576893  7409721.461267 
+339995.409869  7409714.322490 
+339984.343427  7409697.105439 
+339976.822865  7409681.428124 
+339971.297891  7409671.059900 
+339966.300675  7409656.912324 
+339964.354564  7409642.024874 
+339953.048982  7409621.788340 
+339947.779641  7409610.660246 
+339942.774179  7409598.272368 
+339940.547696  7409587.674183 
+339935.022722  7409578.315786 
+339929.489501  7409569.457304 
+339922.430728  7409561.598650 
+339919.684733  7409553.510035 
+339918.200411  7409546.691203 
+339919.824919  7409527.794440 
+339922.653376  7409520.495691 
+339926.248733  7409512.707025 
+339925.572542  7409497.319660 
+339919.824919  7409487.751299 
+339915.009120  7409479.612693 
+339909.261497  7409464.445291 
+339905.921774  7409448.068097 
+339898.491920  7409429.821222 
+339893.338026  7409412.364212 
+339885.479368  7409386.048720 
+339877.084705  7409363.002668 
+339866.183188  7409336.147268 
+339858.002928  7409316.630611 
+339852.420230  7409290.845028 
+339848.643456  7409262.039962 
+339868.953922  7409259.720359 
+339885.767986  7409252.571583 
+339899.530945  7409245.132858 
+339919.231190  7409227.165935 
+339937.735732  7409202.620140 
+339948.604264  7409179.774053 
+339957.172097  7409159.917454 
+339962.515655  7409131.462328 
+339967.916936  7409098.208025 
+339972.114267  7409083.370566 
+339975.082910  7409065.483630 
+339980.005910  7409028.689932 
+339979.206026  7409006.733693 
+339978.356664  7408989.316677 
+339970.992780  7408964.011011 
+339964.610197  7408942.244740 
+339956.974188  7408919.458643 
+339952.108912  7408897.962325 
+339952.282083  7408880.055392 
+339960.379881  7408856.419441 
+339968.411710  7408838.582496 
+339971.182443  7408814.636598 
+339972.188483  7408788.911004 
+339971.941097  7408762.165586 
+339973.771760  7408730.640985 
+339984.632045  7408709.554597 
+340007.655521  7408688.838146 
+340025.244731  7408679.429757 
+340039.428248  7408675.310463 
+340041.019771  7408668.751587 
+340045.101655  7408660.772953 
+340048.647534  7408655.273895 
+340051.657408  7408648.365079 
+340050.775061  7408640.736385 
+340046.874594  7408635.067356 
+340042.083534  7408631.337995 
+340038.009896  7408626.728785 
+340035.700952  7408619.100091 
+340030.027545  7408608.111974 
+340026.654837  7408604.382612 
+340021.336018  7408603.142825 
+340011.588973  7408600.663249 
+340006.261908  7408595.874070 
+340003.070617  7408589.845103 
+340002.188271  7408582.576348 
+340000.415331  7408574.237776 
+339996.688035  7408568.748716 
+339989.777693  7408558.990388 
+339987.650166  7408555.450994 
+339986.759573  7408546.582513 
+339987.650166  7408539.663698 
+339990.305452  7408530.975186 
+340005.734150  7408506.679348 
+340015.662611  7408481.503660 
+340023.108958  7408461.107154 
+340025.945661  7408455.618094 
+340030.200716  7408451.888733 
+340044.565650  7408443.560160 
+340053.611765  7408436.821314 
+340058.930584  7408428.132802 
+340060.348935  7408420.864047 
+340059.639759  7408399.577694 
+340057.330815  7408376.351672 
+340057.512232  7408368.722979 
+340060.348935  7408363.403890 
+340067.440694  7408355.785195 
+340069.922809  7408350.636077 
+340071.167990  7408347.806562 
+340070.458814  7408344.077200 
+340068.331287  7408341.597625 
+340063.721644  7408332.379204 
+340062.121875  7408327.769994 
+340061.412699  7408320.671210 
+340060.348935  7408303.294186 
+340058.221408  7408294.255734 
+340055.557875  7408285.037313 
+340053.430348  7408280.958012 
+340044.747067  7408266.240533 
+340032.864249  7408245.494087 
+340027.190842  7408236.975546 
+340022.754370  7408230.236700 
+340020.453671  7408225.097580 
+340012.652737  7408201.511621 
+340008.389436  7408189.103746 
+340002.716029  7408169.237149 
+339997.578628  7408158.778940 
+339993.323573  7408152.749973 
+339985.341221  7408146.900975 
+339954.310655  7408128.634104 
+339947.573485  7408122.425167 
+339942.963842  7408114.986442 
+339940.836315  7408108.597536 
+339934.272315  7408083.591819 
+339929.662672  7408067.994491 
+339920.971145  7408031.820687 
+339919.025034  7408022.062359 
+339917.252095  7408013.913754 
+339916.006914  7408004.515364 
+339915.652326  7407995.466914 
+339915.825497  7407962.662533 
+339914.588562  7407949.894720 
+339911.042683  7407934.997272 
+339880.523384  7408001.065955 
+339864.072153  7407998.106462 
+339830.914060  7408023.382133 
+339783.506480  7408042.338885 
+339739.290191  7408048.657803 
+339610.236682  7408099.919022 
+339579.758613  7408108.677522 
+339562.672423  7408107.887657 
+339554.277760  7408104.978156 
+339600.258743  7408019.822742 
+339646.239725  7407912.531120 
+339683.702350  7407825.685996 
+339717.767529  7407742.240290 
+339751.824462  7407634.948668 
+339785.889641  7407525.957337 
+339816.540880  7407379.502423 
+339831.565512  7407299.006212 
+339844.495602  7407178.736813 
+339847.348798  7407144.512675 
+339820.127990  7407136.734007 
+339805.911489  7407138.103773 
+339789.410781  7407140.463368 
+339776.975465  7407141.103259 
+339763.303215  7407138.443714 
+339748.468246  7407125.425944 
+339733.402383  7407109.888606 
+339714.007248  7407096.570887 
+339699.889701  7407087.852380 
+339678.672150  7407079.313843 
+339671.225804  7407062.086794 
+339660.983985  7407046.079536 
+339650.676197  7407037.151065 
+339635.329962  7407023.873339 
+339618.985932  7407010.085701 
+339598.848637  7406993.998457 
+339579.181377  7406982.190479 
+339562.804363  7406971.432322 
+339541.405394  7406955.325081 
+339527.889822  7406936.518302 
+339519.693069  7406919.281255 
+339512.197245  7406910.302793 
+339503.645904  7406900.194524 
+339487.499785  7406891.206064 
+339478.931951  7406885.567030 
+339476.524052  7406873.179152 
+339435.573270  7406833.405965 
+339432.464441  7406813.949297 
+339422.164899  7406777.265581 
+339413.786729  7406752.699789 
+339397.879750  7406718.985564 
+339386.904017  7406699.958823 
+339369.174621  7406672.023608 
+339357.745345  7406647.437819 
+339329.576222  7406596.946468 
+339299.914530  7406570.411013 
+339282.069687  7406553.833853 
+339270.500225  7406543.875559 
+339251.929714  7406523.759004 
+339246.718096  7406511.591089 
+339241.564202  7406494.384036 
+339240.244805  7406473.177668 
+339240.434468  7406453.501039 
+339237.655489  7406426.725625 
+339236.517509  7406413.587876 
+339230.712162  7406384.262899 
+339220.610530  7406354.388016 
+339209.981139  7406325.273003 
+339200.027938  7406306.246262 
+339197.059295  7406298.147650 
+339191.385888  7406281.940426 
+339188.895527  7406251.635617 
+339188.054411  7406233.208773 
+339184.013758  7406205.663491 
+339177.441512  7406177.338343 
+339171.900045  7406147.763409 
+339160.949051  7406100.221553 
+339155.894112  7406071.906403 
+339147.078891  7406032.783104 
+339124.096646  7406000.868571 
+339110.696522  7405997.679117 
+339101.757608  7405997.679117 
+339094.740065  7405998.958898 
+339036.999958  7406045.990842 
+338970.634294  7406070.436654 
+338869.337597  7406045.990842 
+338809.964736  7406026.784132 
+338762.804543  7405998.838918 
+338715.652596  7405981.371910 
+338678.156985  7405958.225875 
+338682.486256  7405934.050016 
+338679.954664  7405911.313911 
+338679.105302  7405897.166334 
+338674.190548  7405883.238720 
+338666.801926  7405864.731890 
+338660.534791  7405858.093027 
+338658.102152  7405849.484501 
+338657.953720  7405839.646187 
+338658.852559  7405828.048173 
+338657.970213  7405816.170208 
+338651.472183  7405808.271561 
+338647.208882  7405804.192260 
+338635.672405  7405792.704227 
+338627.426174  7405782.256017 
+338616.706075  7405766.238761 
+338610.785281  7405751.781237 
+338602.860653  7405735.793976 
+338597.665528  7405724.375931 
+338592.016860  7405708.158709 
+338577.214876  7405694.621028 
+338570.180841  7405688.732037 
+338559.337048  7405683.812880 
+338536.857823  7405675.984221 
+338522.954678  7405672.794767 
+338510.362684  7405665.336044 
+338501.794851  7405660.186926 
+338484.741646  7405643.839727 
+338479.035254  7405632.921597 
+338474.293671  7405626.312729 
+338470.822008  7405619.453904 
+338442.017925  7405588.589190 
+338426.003745  7405570.492290 
+338413.733353  7405556.974606 
+338406.996183  7405547.306262 
+338402.312324  7405535.898216 
+338389.629621  7405514.051958 
+338375.355396  7405498.494623 
+338366.284542  7405493.595462 
+338356.677684  7405490.955914 
+338341.051077  7405482.957284 
+338326.174876  7405475.718524 
+338309.814355  7405465.440285 
+338283.607834  7405428.546604 
+338273.720603  7405409.839809 
+338270.149985  7405408.200090 
+338258.432092  7405390.903052 
+338243.984696  7405368.526885 
+338231.499902  7405351.479805 
+338218.000823  7405334.922641 
+338205.713939  7405322.414784 
+338197.673864  7405312.686450 
+338190.219272  7405303.058099 
+338177.025303  7405281.711756 
+338166.371173  7405259.885494 
+338151.429003  7405236.499500 
+338141.764421  7405216.442936 
+338134.821094  7405202.995239 
+338128.834331  7405194.346721 
+338121.775557  7405190.727341 
+338108.103307  7405189.057627 
+338093.367293  7405191.917137 
+338087.768102  7405193.616846 
+338077.872625  7405194.516692 
+338064.233360  7405190.067454 
+338049.596301  7405184.098476 
+338031.207206  7405173.540285 
+338024.643207  7405171.190687 
+338013.057253  7405164.751790 
+338001.900103  7405164.371855 
+337994.544465  7405164.541826 
+337985.720998  7405160.402535 
+337981.218556  7405154.793496 
+337975.487426  7405146.144977 
+337973.038295  7405138.806234 
+337968.865703  7405126.638318 
+337966.688698  7405117.529879 
+337970.399501  7405103.442292 
+337977.887079  7405091.164395 
+337984.261415  7405086.385213 
+338000.325072  7405079.536387 
+338032.073060  7405067.968368 
+338047.938808  7405064.049039 
+338067.342189  7405059.939743 
+338085.170540  7405058.170046 
+338110.445237  7405054.650649 
+338139.447230  7405051.711153 
+338147.528536  7405050.341387 
+338161.192540  7405047.791824 
+338180.785584  7405046.612026 
+338197.245060  7405043.472564 
+338226.634626  7405037.603569 
+338243.292012  7405033.684241 
+338268.764619  7405027.605282 
+338309.327827  7405019.966590 
+338334.800434  7405012.717832 
+338357.527045  7405008.988471 
+338388.879214  7405002.129646 
+338396.911043  7404999.980014 
+338410.039042  7404995.270821 
+338416.899906  7404993.711088 
+338409.098972  7404985.572482 
+338401.842289  7404979.013605 
+338366.259804  7404957.587275 
+338354.162583  7404947.738962 
+338334.000549  7404930.521911 
+338308.948501  7404914.054732 
+338281.447321  7404898.377418 
+338242.591083  7404879.330680 
+338215.840310  7404869.322394 
+338182.542031  7404862.483566 
+338168.729595  7404859.904008 
+338158.207404  7404854.934859 
+338149.326214  7404848.355986 
+338143.710531  7404841.017243 
+338136.519818  7404828.789337 
+338130.096004  7404814.041863 
+338102.017589  7404777.238168 
+338090.695514  7404757.661521 
+338084.799459  7404742.804066 
+338076.305842  7404723.927299 
+338070.830344  7404712.589241 
+338066.633013  7404703.400815 
+338054.370868  7404682.644371 
+338044.458899  7404666.367159 
+338030.539262  7404642.311279 
+338010.014393  7404607.397260 
+337999.632389  7404589.470331 
+337988.310314  7404566.584251 
+337974.390677  7404544.408049 
+337965.897060  7404529.310635 
+337939.946172  7404488.267666 
+337902.912350  7404428.347929 
+337884.976798  7404396.743343 
+337870.826266  7404372.677465 
+337855.727418  7404347.911707 
+337839.210218  7404321.726193 
+337823.171299  7404294.590841 
+337812.080119  7404276.433951 
+337805.243994  7404263.216215 
+337799.817974  7404251.898154 
+337792.734462  7404242.699729 
+337785.659196  7404235.151022 
+337777.404719  7404230.191872 
+337758.999133  7404224.772800 
+337733.996561  7404221.463367 
+337710.164955  7404222.413204 
+337698.133704  7404224.062921 
+337673.131133  7404229.481993 
+337660.629847  7404233.021387 
+337641.284190  7404240.100174 
+337620.281041  7404248.598719 
+337605.660474  7404257.557184 
+337587.254887  7404269.585124 
+337570.506792  7404277.613749 
+337564.140702  7404279.973345 
+337551.631170  7404282.802860 
+337539.369026  7404285.392416 
+337534.883076  7404285.162456 
+337529.457056  7404283.502740 
+337522.851826  7404281.153142 
+337497.140078  7404268.175365 
+337491.474918  7404263.926093 
+337484.399652  7404259.676821 
+337417.638169  7404197.637448 
+337402.061039  7404180.660356 
+337381.536171  7404158.244196 
+337357.242775  7404132.768559 
+337320.670743  7404094.085186 
+337289.772116  7404056.571611 
+337277.262584  7404039.584521 
+337264.522158  7404025.436944 
+337250.371626  7404015.758602 
+337230.085899  7404008.689813 
+337208.612714  7404007.270056 
+337184.080178  7404008.919774 
+337164.973662  7404012.229207 
+337143.269583  7404017.648278 
+337130.760051  7404023.077349 
+337123.940418  7404027.326621 
+337102.533203  7403993.292450 
+337061.120633  7403917.935358 
+337003.479481  7403951.209659 
+336890.291719  7404014.188871 
+336863.631655  7404032.395752 
+336790.636021  7404073.218760 
+336764.338792  7404078.897787 
+336735.435754  7404085.016739 
+336700.785092  7404086.176540 
+336678.709933  7404089.965891 
+336655.084482  7404097.964521 
+336630.403514  7404116.621325 
+336614.108962  7404137.047826 
+336593.147044  7404177.150957 
+336571.492442  7404204.936198 
+336561.217639  7404216.744175 
+336547.223785  7404230.821764 
+336521.610993  7404238.800397 
+336494.266492  7404244.919349 
+336464.192489  7404244.559411 
+336432.609425  7404239.580264 
+336399.104990  7404239.200329 
+336375.083720  7404240.380127 
+336364.083249  7404242.689731 
+336343.533642  7404249.168621 
+336317.681709  7404265.545816 
+336297.313519  7404295.350711 
+336283.228957  7404315.197311 
+336270.422561  7404345.922048 
+336262.102114  7404312.637749 
+336208.443892  7404340.522973 
+336151.388222  7404372.117561 
+336137.930373  7404343.362487 
+336082.886784  7404315.837201 
+336019.506255  7404306.238845 
+335888.176786  7404290.321572 
+335817.514835  7404277.353793 
+335730.088298  7404262.496338 
+335639.544685  7404248.888669 
+335605.891818  7404243.089662 
+335572.807941  7404232.081548 
+335548.761932  7404217.304079 
+335548.745440  7404217.314078 
+335468.344691  7404202.616595 
+335423.303779  7404295.690652 
+335317.356208  7404380.446134 
+335218.475656  7404389.864521 
+335129.004054  7404375.736941 
+335010.522212  7404275.864048 
+334987.746123  7404213.284768 
+334903.980912  7404223.842959 
+334903.972666  7404223.812964 
+334903.947927  7404223.842959 
+334900.476264  7404177.790847 
+334903.857218  7404130.598931 
+334784.311613  7404192.278366 
+334720.881606  7404220.653505 
+334627.460059  7404254.037787 
+334525.602619  7404265.715787 
+334448.690025  7404241.949858 
+334417.156439  7404228.962082 
+334360.356403  7404239.010361 
+334313.682737  7404235.660935 
+334206.844573  7404269.015222 
+334101.630916  7404320.766357 
+334079.959822  7404329.144922 
+334047.560382  7404315.467265 
+334047.535643  7404315.507258 
+333976.106793  7404294.530851 
+333919.768545  7404284.042648 
+333908.075390  7404279.043504 
+333899.688974  7404270.744925 
+333888.053542  7404260.756636 
+333879.700111  7404249.038643 
+333837.941199  7404223.982935 
+333784.530363  7404203.956366 
+333674.377214  7404344.182346 
+Region 1
+309
+336731.683719  7401133.962228 
+336700.438751  7401143.370616 
+336636.266584  7401131.822594 
+336560.112644  7401115.985307 
+336526.311344  7401109.146478 
+336449.769831  7401085.420543 
+336430.382943  7401079.671527 
+336325.977417  7401053.615990 
+336219.312424  7401025.530801 
+336018.673386  7400980.858453 
+335984.896825  7400976.219248 
+335954.459988  7400971.630034 
+335903.333358  7400983.537994 
+335855.595928  7400990.176857 
+335831.723091  7400994.146177 
+335803.916801  7400998.205482 
+335700.022541  7401017.782128 
+335561.840454  7401046.657182 
+335495.837624  7401037.718713 
+335470.290801  7401032.279645 
+335482.891042  7401078.571716 
+335499.639136  7401130.622800 
+335525.449838  7401190.002629 
+335555.342424  7401264.669839 
+335593.266839  7401358.003851 
+335603.088100  7401380.769952 
+335672.521362  7401553.330394 
+335623.283119  7401573.077011 
+335496.522061  7401625.518029 
+335479.336916  7401617.959323 
+335466.967570  7401608.330973 
+335345.962382  7401691.516724 
+335334.961910  7401700.455193 
+335242.158831  7401759.575066 
+335176.156001  7401802.197765 
+335121.079426  7401837.441728 
+335046.220144  7401888.822927 
+335172.626614  7402004.713076 
+335221.320606  7402042.096673 
+335299.527857  7402188.171651 
+335333.469343  7402249.651120 
+335363.930919  7402293.653583 
+335314.783384  7402304.251768 
+335191.320819  7402326.877892 
+335135.246450  7402341.135450 
+335075.733404  7402353.433343 
+335019.659035  7402365.731237 
+335001.459604  7402367.700899 
+334969.002440  7402374.089805 
+334891.776490  7402389.337193 
+334793.704069  7402411.423410 
+334665.211303  7402435.339314 
+334607.965970  7402447.867168 
+334482.046028  7402473.942701 
+334377.640502  7402474.472610 
+334416.752374  7402546.400290 
+334440.996292  7402584.113830 
+334457.727894  7402613.128860 
+334505.440585  7402703.143441 
+334573.636912  7402794.947716 
+334605.285945  7402826.602294 
+334622.429859  7402862.286182 
+334648.372500  7402926.965103 
+334672.665896  7402986.454913 
+334674.710961  7402993.943630 
+334691.120960  7403041.125548 
+334701.049422  7403070.810463 
+334719.133406  7403109.983753 
+334745.364665  7403167.883835 
+334585.313575  7403210.856475 
+334545.772899  7403205.097461 
+334497.928268  7403171.743174 
+334445.977015  7403218.635142 
+334395.229712  7403230.473114 
+334370.425050  7403207.896982 
+334267.660524  7403234.542417 
+334100.022901  7403279.534711 
+334031.348292  7403215.435690 
+333944.358805  7403279.524712 
+333845.354560  7403296.121869 
+333788.125719  7403323.597163 
+333795.926654  7403394.704983 
+333870.200453  7403447.825884 
+333862.820077  7403475.371166 
+333850.516700  7403498.977122 
+333832.333762  7403504.396194 
+333800.849653  7403543.249539 
+333766.413394  7403570.304904 
+333725.503844  7403592.701068 
+333702.422644  7403599.919832 
+333685.361193  7403602.849330 
+333655.847934  7403612.067751 
+333614.690996  7403629.464771 
+333610.551389  7403631.814368 
+333602.280419  7403637.273433 
+333597.786224  7403641.912639 
+333585.590048  7403662.269152 
+333592.879716  7403577.303705 
+333496.176170  7403582.502815 
+333488.507175  7403626.375300 
+333475.717271  7403686.375023 
+333461.946066  7403760.152385 
+333454.079162  7403829.020589 
+333464.898217  7403873.283007 
+333484.136673  7403893.249587 
+333523.965967  7403929.193430 
+333544.383634  7403961.247939 
+333553.751352  7404001.810991 
+333555.887126  7404015.478650 
+333559.771100  7404042.434033 
+333563.432427  7404056.451632 
+333566.590733  7404072.278921 
+333580.238245  7404082.817116 
+333592.154048  7404090.245843 
+333607.236404  7404104.853341 
+333617.667886  7404114.581675 
+333629.311563  7404127.709426 
+333635.182880  7404137.507748 
+333635.100417  7404155.404682 
+333631.876141  7404167.242654 
+333626.779970  7404180.260424 
+333624.231885  7404186.389375 
+333616.958710  7404206.285967 
+333607.079725  7404221.293396 
+333606.890062  7404240.320137 
+333603.649294  7404273.094523 
+333599.361254  7404311.207994 
+333597.530590  7404337.503490 
+333593.357998  7404360.389570 
+333578.795154  7404397.883148 
+333674.377214  7404344.182346 
+333784.530363  7404203.956366 
+333837.941199  7404223.982935 
+333879.700111  7404249.038643 
+333888.053542  7404260.756636 
+333899.688974  7404270.744925 
+333908.075390  7404279.043504 
+333919.768545  7404284.042648 
+333976.106793  7404294.530851 
+334047.535643  7404315.507258 
+334047.560382  7404315.467265 
+334079.959822  7404329.144922 
+334101.630916  7404320.766357 
+334206.844573  7404269.015222 
+334313.682737  7404235.660935 
+334360.356403  7404239.010361 
+334417.156439  7404228.962082 
+334448.690025  7404241.949858 
+334525.602619  7404265.715787 
+334627.460059  7404254.037787 
+334720.881606  7404220.653505 
+334784.311613  7404192.278366 
+334903.857218  7404130.598931 
+334900.476264  7404177.790847 
+334903.947927  7404223.842959 
+334903.972666  7404223.812964 
+334903.980912  7404223.842959 
+334987.746123  7404213.284768 
+335010.522212  7404275.864048 
+335129.004054  7404375.736941 
+335218.475656  7404389.864521 
+335317.356208  7404380.446134 
+335423.303779  7404295.690652 
+335468.344691  7404202.616595 
+335548.745440  7404217.314078 
+335548.761932  7404217.304079 
+335572.807941  7404232.081548 
+335605.891818  7404243.089662 
+335639.544685  7404248.888669 
+335730.088298  7404262.496338 
+335817.514835  7404277.353793 
+335888.176786  7404290.321572 
+336019.506255  7404306.238845 
+336082.886784  7404315.837201 
+336137.930373  7404343.362487 
+336151.388222  7404372.117561 
+336208.443892  7404340.522973 
+336262.102114  7404312.637749 
+336270.422561  7404345.922048 
+336283.228957  7404315.197311 
+336297.313519  7404295.350711 
+336317.681709  7404265.545816 
+336343.533642  7404249.168621 
+336364.083249  7404242.689731 
+336375.083720  7404240.380127 
+336399.104990  7404239.200329 
+336432.609425  7404239.580264 
+336464.192489  7404244.559411 
+336494.266492  7404244.919349 
+336521.610993  7404238.800397 
+336547.223785  7404230.821764 
+336561.217639  7404216.744175 
+336571.492442  7404204.936198 
+336593.147044  7404177.150957 
+336614.108962  7404137.047826 
+336630.403514  7404116.621325 
+336655.084482  7404097.964521 
+336678.709933  7404089.965891 
+336700.785092  7404086.176540 
+336735.435754  7404085.016739 
+336764.338792  7404078.897787 
+336790.636021  7404073.218760 
+336863.631655  7404032.395752 
+336890.291719  7404014.188871 
+337003.479481  7403951.209659 
+337061.120633  7403917.935358 
+337113.566660  7403886.580729 
+337122.686991  7403878.582099 
+337131.436242  7403869.833598 
+337146.798969  7403860.325226 
+337193.118047  7403823.161592 
+337213.882056  7403806.924374 
+337264.241786  7403772.430282 
+337271.696379  7403768.960876 
+337299.700578  7403755.933108 
+337360.582499  7403736.176492 
+337433.718318  7403712.450556 
+337475.980251  7403715.200085 
+337601.042585  7403775.399773 
+337630.580583  7403667.568244 
+337649.200572  7403615.967083 
+337664.563299  7403561.206463 
+337706.660307  7403575.983932 
+337771.657097  7403509.505319 
+337799.669542  7403482.999859 
+337909.657766  7403366.019896 
+338038.290718  7403234.742383 
+338135.051989  7403129.120475 
+338150.620872  7403101.005291 
+338160.763736  7403082.698427 
+338172.390921  7403057.542736 
+338173.743303  7403053.073501 
+338191.068634  7402980.745890 
+338193.633211  7402916.906825 
+338180.562936  7402861.376337 
+338168.383253  7402805.975827 
+338163.740625  7402794.227839 
+338222.758898  7402744.796306 
+338304.421320  7402672.208740 
+338291.301567  7402662.410418 
+338275.716191  7402648.882736 
+338265.919669  7402639.444352 
+338249.254037  7402631.455721 
+338236.332194  7402629.316087 
+338219.633577  7402624.346938 
+338204.749130  7402615.368476 
+338184.389187  7402597.251580 
+338139.537938  7402567.276714 
+338115.813533  7402554.678872 
+338108.218754  7402548.929857 
+337976.122386  7402452.076447 
+337867.255649  7402373.799855 
+337823.154807  7402345.094772 
+337775.301931  7402310.550689 
+337738.276355  7402284.445160 
+337708.309553  7402276.966441 
+337644.096155  7402261.299125 
+337615.811584  7402248.141379 
+337600.110760  7402221.335970 
+337590.635841  7402205.748640 
+337570.045004  7402185.612090 
+337548.134769  7402170.004763 
+337518.407107  7402149.008360 
+337502.599083  7402132.201238 
+337485.092335  7402106.805589 
+337477.390356  7402093.597851 
+337459.759915  7402057.594018 
+337452.313569  7402042.376625 
+337442.385107  7402022.340057 
+337428.135620  7402002.513453 
+337397.954416  7401954.021759 
+337366.552770  7401901.220803 
+337358.883775  7401892.032377 
+337350.019077  7401880.874288 
+337335.612912  7401852.469154 
+337322.385959  7401831.392764 
+337313.323351  7401801.777837 
+337306.008944  7401774.712473 
+337300.871543  7401757.245465 
+337292.031584  7401729.910147 
+337286.605564  7401715.472620 
+337279.695222  7401700.025268 
+337270.055379  7401674.179693 
+337250.586028  7401620.738847 
+337227.991356  7401575.346623 
+337202.856845  7401529.424489 
+337182.200038  7401492.130877 
+337167.043466  7401462.455960 
+337158.178768  7401437.640210 
+337146.477366  7401416.833774 
+337133.943096  7401402.826174 
+337100.941681  7401379.280207 
+337078.297531  7401361.143314 
+337053.171267  7401337.677333 
+337034.518293  7401323.849702 
+337017.382626  7401314.611284 
+336977.668779  7401301.343557 
+336945.104414  7401285.116336 
+336905.052472  7401256.961159 
+336883.678242  7401238.324351 
+336859.970329  7401224.466725 
+336838.225019  7401216.678059 
+336816.957990  7401211.668917 
+336802.733242  7401189.822659 
+336797.364946  7401170.096038 
+336782.051695  7401154.298744 
+336764.652149  7401143.780546 
+336756.884199  7401134.612116 
+336731.683719  7401133.962228 
+Region 1
+218
+323727.130602  7387729.138353 
+323701.732211  7387697.403789 
+323676.828595  7387671.488228 
+323660.064008  7387657.000709 
+323620.416131  7387628.505590 
+323495.898048  7387530.882312 
+323455.747151  7387495.798322 
+323437.209624  7387476.241672 
+323429.590107  7387467.353194 
+323421.970590  7387457.964802 
+323401.660124  7387422.420891 
+323393.793220  7387405.933715 
+323387.946643  7387392.725977 
+323382.883457  7387380.048149 
+323382.520623  7387378.798363 
+323380.343618  7387373.199322 
+323374.257900  7387350.123275 
+323314.992240  7387360.871434 
+323272.507660  7387370.139846 
+323251.397309  7387370.599767 
+323237.667335  7387370.309817 
+323221.339799  7387369.259997 
+323198.250353  7387366.920397 
+323178.673801  7387362.561144 
+323159.352883  7387357.951934 
+323132.907221  7387346.743853 
+323115.639614  7387322.617986 
+323054.683477  7387247.190906 
+322960.948573  7387136.449875 
+322954.598976  7387130.860832 
+322943.161454  7387124.241966 
+322931.979565  7387118.133012 
+322921.036817  7387113.543798 
+322907.570722  7387108.194715 
+322894.863281  7387105.615157 
+322871.971745  7387103.535513 
+322855.190665  7387102.725652 
+322837.131420  7387105.215225 
+322818.808296  7387109.494492 
+322776.323715  7387130.930820 
+322653.669281  7387188.161017 
+322503.043632  7387263.818058 
+322434.583425  7387305.980836 
+322415.229522  7387327.217198 
+322403.033347  7387325.667464 
+322363.096852  7387324.557654 
+322338.432376  7387323.737794 
+322323.943748  7387317.358887 
+322315.812965  7387312.019801 
+322301.827358  7387303.371283 
+322277.690641  7387284.304549 
+322246.429180  7387262.428296 
+322251.236733  7387283.734646 
+322250.956361  7387306.540740 
+322195.508706  7387309.190286 
+321962.033178  7387323.567823 
+321931.761265  7387326.027402 
+321880.642881  7387329.946731 
+321872.000832  7387328.666950 
+321865.131721  7387325.857431 
+321857.512204  7387321.528173 
+321854.972365  7387317.978781 
+321852.176893  7387310.110128 
+321850.659587  7387298.962038 
+321849.397913  7387286.794122 
+321847.888853  7387276.135948 
+321846.371547  7387266.757554 
+321844.845994  7387261.178510 
+321840.533215  7387255.339510 
+321834.942271  7387249.240555 
+321828.337040  7387244.411382 
+321820.973156  7387238.822339 
+321813.848413  7387232.973341 
+321809.527388  7387230.933691 
+321801.907871  7387225.344648 
+321678.387582  7387137.839637 
+321598.580562  7387098.356400 
+321543.207123  7387086.988347 
+321565.908996  7386955.840812 
+321626.221927  7386921.266734 
+321667.791176  7386817.204559 
+321670.586648  7386806.806340 
+321677.233110  7386786.299852 
+321685.380386  7386768.832844 
+321690.987823  7386758.204665 
+321698.368199  7386748.836270 
+321711.356012  7386736.198434 
+321728.673097  7386722.050858 
+321737.323393  7386713.962243 
+321746.237568  7386700.044627 
+321750.566839  7386691.686059 
+321790.833183  7386610.429977 
+321797.463153  7386594.482709 
+321801.800670  7386578.775399 
+321808.950152  7386551.170128 
+321813.032036  7386538.512296 
+321822.226583  7386502.288501 
+321844.450175  7386404.245295 
+322027.970038  7386004.003853 
+322062.323835  7385914.719146 
+322097.048712  7385906.460561 
+322109.046978  7385866.187459 
+322109.747907  7385838.232248 
+322104.338380  7385809.067244 
+322097.964044  7385784.491453 
+322088.893190  7385746.477965 
+322408.022316  7385220.378081 
+322371.928565  7385215.968836 
+322220.560755  7385007.084616 
+322125.201344  7384858.750024 
+322034.385605  7384701.326989 
+321976.859900  7384633.218656 
+321954.042580  7384565.580242 
+321941.747450  7384561.300975 
+321898.446493  7384550.382845 
+321867.737530  7384529.656395 
+321851.096637  7384497.921831 
+321889.136499  7384481.294679 
+321947.701229  7384445.590795 
+321989.361186  7384430.293415 
+322030.023349  7384421.074994 
+322071.551367  7384407.907250 
+322111.306445  7384395.289411 
+322155.596950  7384379.062190 
+322189.530189  7384367.514169 
+322237.696422  7384352.616720 
+322274.491103  7384349.557244 
+322295.956042  7384351.596895 
+322328.660592  7384359.775494 
+322367.632278  7384363.044934 
+322460.493082  7384351.596895 
+322522.686153  7384344.338138 
+322610.731158  7384319.912322 
+322708.836564  7384281.078974 
+322738.811612  7384262.722118 
+322787.480866  7384251.524037 
+322840.990656  7384241.535747 
+322910.539365  7384221.019262 
+322931.303374  7384234.286989 
+322988.796094  7384222.379029 
+323078.960380  7384203.872199 
+323161.859737  7384177.386736 
+323322.793174  7384149.761468 
+323441.052368  7384131.334624 
+323589.789630  7384105.998964 
+323606.249106  7384104.849161 
+323699.472744  7384089.841731 
+323728.169627  7384084.122711 
+323928.148966  7384066.155788 
+323987.744475  7384344.708075 
+324045.080517  7384462.247941 
+324180.838212  7384658.984242 
+324316.892771  7384827.445386 
+324455.866496  7385012.963609 
+324553.378174  7385115.766000 
+324995.252443  7385632.497488 
+325168.885075  7385841.411703 
+325450.724746  7386158.887323 
+325597.309742  7386279.966583 
+325644.890493  7386305.162267 
+325862.953816  7386380.389381 
+326054.076704  7386441.938838 
+326212.808398  7386526.164411 
+326342.389666  7386633.066100 
+326410.421069  7386736.738342 
+326475.186965  7386824.303343 
+326512.962947  7387026.518705 
+326481.528316  7387032.777633 
+326401.952190  7387046.335311 
+326390.176573  7387049.974687 
+326310.542723  7387062.332571 
+326235.411316  7387071.391019 
+326155.010567  7387087.268299 
+326117.036675  7387087.368282 
+326041.146614  7387092.547395 
+325963.376413  7387100.136095 
+325835.089803  7387112.014061 
+325757.336094  7387115.973382 
+325703.752088  7387125.411766 
+325629.651459  7387134.710173 
+325534.992977  7387147.537976 
+325409.666764  7387155.786563 
+325319.403523  7387180.682298 
+325286.888636  7387223.424977 
+325252.526593  7387271.306775 
+325210.190445  7387338.915194 
+325195.693571  7387356.132245 
+325181.609009  7387381.217948 
+325173.123638  7387399.614797 
+325165.965910  7387417.691701 
+325155.691106  7387457.444891 
+325144.253584  7387500.617496 
+325108.811285  7387483.740387 
+325082.208945  7387475.031879 
+325064.108469  7387473.022223 
+325042.602299  7387479.691081 
+325033.292305  7387486.429926 
+324986.643378  7387526.703028 
+324898.639605  7387604.879637 
+324813.150931  7387695.954037 
+324783.736627  7387717.190399 
+324767.631738  7387727.578620 
+324742.381780  7387739.126642 
+324708.992792  7387750.804641 
+324678.069427  7387757.873431 
+324644.779394  7387760.163038 
+324616.519562  7387759.333181 
+324583.922212  7387757.043573 
+324557.542520  7387746.535373 
+324516.740171  7387725.878911 
+324455.041873  7387687.525481 
+324410.850323  7387676.807317 
+324362.684090  7387672.218103 
+324319.729474  7387674.917640 
+324226.992365  7387682.176397 
+324142.649918  7387689.815088 
+323934.168714  7387709.631694 
+323727.130602  7387729.138353 
+Region 1
+515
+353400.210283  7401391.408130 
+353400.820504  7401364.912668 
+353402.362549  7401361.523249 
+353405.133283  7401357.823882 
+353409.140951  7401353.204674 
+353414.072197  7401349.195360 
+353423.621332  7401345.196045 
+353443.956537  7401341.496679 
+353524.992245  7401338.727153 
+353543.480294  7401337.187417 
+353557.037097  7401333.488051 
+353567.823167  7401328.868842 
+353580.151282  7401319.620426 
+353605.722843  7401296.824331 
+353647.316830  7401263.240084 
+353658.408011  7401256.151298 
+353667.965392  7401252.761878 
+353679.675040  7401250.292301 
+353720.963916  7401247.212829 
+353731.436629  7401243.203516 
+353753.289141  7401231.935446 
+353767.489150  7401224.106787 
+353783.198219  7401216.398107 
+353797.678600  7401212.088845 
+353821.097895  7401205.929900 
+353831.883965  7401201.300693 
+353849.135079  7401192.062276 
+353880.874821  7401176.654915 
+353891.660891  7401171.725759 
+353908.912005  7401169.256182 
+353944.040948  7401169.566129 
+353958.826439  7401168.336340 
+353973.620177  7401163.407184 
+353985.016468  7401156.008451 
+353999.505095  7401141.840878 
+354019.840300  7401120.884468 
+354027.542279  7401111.026157 
+354037.709882  7401092.229376 
+354050.648218  7401063.574285 
+354055.719650  7401051.656326 
+354061.739398  7401035.539087 
+354063.586554  7401027.530459 
+354066.670644  7401007.803838 
+354070.983422  7400980.698480 
+354073.143935  7400969.600381 
+354075.914668  7400960.361964 
+354082.693070  7400939.715500 
+354084.622688  7400935.226269 
+354090.708406  7400918.759090 
+354100.257541  7400899.352414 
+354111.653832  7400875.316531 
+354124.905525  7400846.351493 
+354131.989037  7400823.245451 
+354137.538750  7400804.448670 
+354141.233061  7400785.661888 
+354150.171975  7400745.298802 
+354155.721689  7400722.802656 
+354160.034467  7400696.617141 
+354163.728779  7400675.350784 
+354167.117979  7400664.262683 
+354169.888713  7400656.863950 
+354179.132737  7400643.616220 
+354182.835295  7400637.767221 
+354185.606028  7400630.368489 
+354191.056787  7400612.751506 
+354193.613118  7400604.482923 
+354194.544942  7400595.244505 
+354196.392098  7400569.358939 
+354197.315676  7400559.190681 
+354198.857721  7400552.721789 
+354201.933565  7400543.483371 
+354209.948901  7400526.836223 
+354214.880147  7400514.208386 
+354216.727303  7400503.730181 
+354216.727303  7400492.952027 
+354214.880147  7400481.543981 
+354214.880147  7400467.686355 
+354214.880147  7400457.828043 
+354217.650881  7400443.340525 
+354219.498036  7400434.712003 
+354222.582127  7400427.933166 
+354225.352860  7400420.234483 
+354225.971327  7400414.685433 
+354225.047750  7400408.526488 
+354221.963659  7400398.358230 
+354217.955991  7400390.349602 
+354211.490946  7400382.330975 
+354199.368987  7400369.863111 
+354195.616952  7400360.114781 
+354189.366310  7400337.118720 
+354184.121707  7400304.124371 
+354181.367466  7400285.127625 
+354176.617637  7400243.884690 
+354171.125647  7400202.391797 
+354166.870592  7400172.396935 
+354163.126804  7400158.149376 
+354156.373141  7400138.152801 
+354145.125282  7400104.158624 
+354138.627252  7400082.412349 
+354131.873590  7400061.665902 
+354120.881364  7400033.170783 
+354115.438852  7400026.181980 
+354109.880892  7400020.922881 
+354097.379607  7400007.925108 
+354087.137788  7399995.677206 
+354078.883311  7399982.179518 
+354072.888302  7399965.182429 
+354069.886674  7399947.935383 
+354069.383654  7399927.688851 
+354072.632669  7399901.693304 
+354076.887724  7399879.947029 
+354079.138945  7399864.699641 
+354078.611186  7399853.731520 
+354075.881683  7399840.703751 
+354072.632669  7399832.955079 
+354064.386438  7399823.956620 
+354057.385388  7399811.958675 
+354051.637765  7399798.211030 
+354045.139736  7399783.963470 
+354034.889671  7399765.466639 
+354020.640184  7399748.219593 
+354005.392904  7399735.471777 
+353981.899393  7399718.224731 
+353968.400313  7399708.226443 
+353947.652797  7399689.979569 
+353929.156502  7399675.732009 
+353923.408879  7399665.733722 
+353919.904231  7399657.485135 
+353915.657422  7399635.488903 
+353911.410613  7399612.742799 
+353907.163804  7399589.496781 
+353899.907121  7399573.249564 
+353892.658685  7399564.251105 
+353882.416866  7399557.002347 
+353860.168536  7399547.503974 
+353843.420442  7399537.755643 
+353835.322643  7399529.377079 
+353821.675131  7399516.259326 
+353808.670826  7399499.512194 
+353799.921575  7399484.014849 
+353793.679178  7399457.269430 
+353792.178364  7399436.023069 
+353792.788585  7399412.987015 
+353793.176158  7399404.028550 
+353797.175580  7399376.283302 
+353802.172796  7399344.288783 
+353804.176630  7399318.543193 
+353806.675238  7399291.047902 
+353811.177680  7399269.801542 
+353818.920890  7399244.305909 
+353827.670141  7399216.810618 
+353835.916372  7399189.565285 
+353840.921834  7399173.318068 
+353848.063069  7399159.250478 
+353852.664466  7399150.072050 
+353868.167380  7399119.827231 
+353882.161233  7399094.331598 
+353896.814785  7399070.935606 
+353910.660206  7399050.589091 
+353920.654638  7399035.841617 
+353936.050350  7398991.429224 
+353944.906802  7398957.355061 
+353947.652797  7398944.107330 
+353949.656631  7398926.610327 
+353951.157445  7398898.115208 
+353953.153033  7398872.869532 
+353954.917726  7398865.230841 
+353955.651641  7398859.871759 
+353958.900655  7398851.873129 
+353966.149092  7398840.875013 
+353982.897187  7398817.379037 
+353989.395216  7398804.131307 
+353993.394638  7398790.883576 
+353997.146673  7398773.636530 
+354001.146095  7398736.392910 
+354001.896502  7398712.147063 
+354001.146095  7398692.400445 
+353999.307186  7398669.034448 
+353999.397894  7398656.406611 
+354001.393482  7398645.908409 
+354004.898130  7398637.159907 
+354013.144361  7398625.911834 
+354019.395004  7398611.164360 
+354021.646224  7398599.666330 
+354021.390591  7398577.920055 
+354020.145410  7398554.174122 
+354021.390591  7398533.427676 
+354024.392219  7398512.681229 
+354027.888621  7398493.434526 
+354028.894661  7398478.687052 
+354026.396053  7398464.439493 
+354022.891405  7398454.441205 
+354018.891983  7398446.442576 
+354005.648537  7398433.194845 
+353980.645966  7398409.448912 
+353960.401469  7398382.953451 
+353951.899606  7398364.956533 
+353947.900184  7398350.708974 
+353946.407616  7398339.460901 
+353948.114586  7398321.703942 
+353954.150827  7398303.217109 
+353963.155710  7398279.721133 
+353975.401363  7398253.975543 
+353985.395795  7398232.479226 
+353992.644231  7398207.233550 
+353991.893824  7398181.487960 
+353989.395216  7398159.241770 
+353986.896609  7398150.493269 
+353979.895559  7398134.745966 
+353972.152348  7398113.749563 
+353969.901127  7398101.501661 
+353967.897293  7398082.754872 
+353968.152926  7398065.007912 
+353970.898921  7398044.011508 
+353973.653162  7398031.013735 
+353978.402991  7398017.016132 
+353980.901599  7398003.768402 
+353979.648172  7397987.271227 
+353974.403569  7397969.024353 
+353966.899499  7397951.277393 
+353959.403676  7397936.279962 
+353956.649435  7397925.781760 
+353954.901234  7397917.783130 
+353956.154661  7397901.785870 
+353964.153504  7397862.542592 
+353972.647122  7397826.548758 
+353975.896137  7397797.303767 
+353977.396951  7397769.558520 
+353976.399157  7397735.564343 
+353977.454674  7397728.715516 
+353994.507879  7397725.326096 
+354007.066889  7397762.509727 
+354010.456089  7397823.299314 
+354010.983848  7397898.856372 
+354015.197672  7398017.726011 
+354023.913938  7398117.698886 
+354050.846127  7398162.911142 
+354069.070297  7398198.265086 
+354098.542325  7398240.707816 
+354132.673474  7398258.164826 
+354153.998226  7398259.334625 
+354219.110464  7398259.074670 
+354277.889596  7398258.964689 
+354359.230415  7398260.214475 
+354425.901189  7398257.304973 
+354465.169740  7398233.569039 
+354496.917728  7398216.112029 
+354554.847498  7398182.777739 
+354620.710142  7398146.273992 
+354698.472097  7398109.760246 
+354783.746368  7398077.855711 
+354813.193658  7398066.067730 
+354832.176481  7398056.959291 
+354862.737012  7398040.722072 
+354935.740892  7398084.374595 
+354998.420491  7398116.919020 
+355125.478413  7398187.816876 
+355231.425984  7397925.551799 
+355228.383125  7397828.158482 
+355227.731673  7397804.282572 
+355227.756411  7397804.252577 
+355301.032417  7397795.654050 
+355366.903307  7397781.376495 
+355417.526917  7397773.327874 
+355449.266659  7397767.728833 
+355527.803760  7397759.070316 
+355527.770775  7397759.050320 
+355587.506470  7397746.452478 
+355652.313596  7397737.593995 
+355714.333497  7397724.756194 
+355746.922600  7397714.497951 
+355776.930634  7397700.740308 
+355790.396728  7397690.772015 
+355834.843912  7397658.237588 
+355893.557074  7397613.795201 
+355951.750723  7397570.282654 
+356036.662160  7397487.656807 
+356046.104095  7397479.008288 
+356070.488199  7397455.892248 
+356089.116434  7397438.235272 
+356165.031233  7397405.880814 
+356089.116434  7397438.235272 
+356165.031233  7397405.880814 
+356232.073088  7397377.295711 
+356300.813667  7397335.902801 
+356357.052960  7397300.748823 
+356399.240676  7397271.063907 
+356419.551142  7397249.977519 
+356446.854411  7397225.311744 
+356496.628660  7397264.055108 
+356504.512056  7397263.635180 
+356511.158518  7397259.415902 
+356514.795106  7397251.387278 
+356519.990231  7397240.599126 
+356525.375020  7397235.100068 
+356533.538788  7397232.410528 
+356549.058194  7397230.560845 
+356565.055882  7397231.490686 
+356584.088182  7397233.960263 
+356603.565779  7397242.488802 
+356619.777868  7397248.207822 
+356631.891581  7397255.906504 
+356647.848037  7397261.875481 
+356658.724816  7397266.534683 
+356692.748763  7397269.414190 
+356710.742038  7397273.893423 
+356727.696289  7397280.882225 
+356741.607680  7397287.591076 
+356751.701066  7397294.759848 
+356779.037321  7397305.138071 
+356789.683204  7397308.027576 
+356801.838148  7397312.696776 
+356814.776484  7397314.846408 
+356827.970453  7397316.246168 
+356835.573478  7397318.855721 
+356845.691603  7397323.244969 
+356854.317160  7397324.604736 
+356868.022396  7397326.004496 
+356881.191626  7397330.943650 
+356888.209168  7397340.601996 
+356892.926012  7397351.750086 
+356897.956213  7397356.589258 
+356903.745067  7397362.708209 
+356913.846699  7397368.367240 
+356921.622895  7397378.535498 
+356929.159950  7397387.443972 
+356934.932311  7397394.312796 
+356940.440793  7397402.951316 
+356954.566586  7397412.939605 
+356966.457651  7397418.108720 
+356977.845695  7397423.017879 
+356991.006679  7397428.206990 
+356999.055001  7397436.365593 
+357006.913658  7397438.215276 
+357021.905306  7397438.375248 
+357034.662224  7397433.206134 
+357046.173962  7397426.017365 
+357059.648303  7397424.897557 
+357067.473976  7397430.526593 
+357072.710333  7397440.174940 
+357083.273754  7397451.383020 
+357089.334734  7397454.722448 
+357103.501758  7397460.931385 
+357116.407109  7397467.120325 
+357126.995269  7397475.558879 
+357139.851143  7397485.277214 
+357157.275428  7397496.815238 
+357172.712372  7397502.774217 
+357188.413195  7397507.983325 
+357202.596712  7397513.182435 
+357218.800555  7397519.151412 
+357235.507418  7397525.640301 
+357250.193955  7397530.839410 
+357258.242276  7397538.488100 
+357269.374687  7397543.907172 
+357276.944727  7397548.776338 
+357287.598857  7397550.905973 
+357300.768087  7397555.585171 
+357305.179821  7397559.634478 
+357358.483456  7397489.766446 
+357393.389750  7397609.405952 
+357360.041993  7397645.209819 
+357353.609933  7397659.317403 
+357355.696230  7397668.885764 
+357362.779742  7397676.664432 
+357215.262922  7398052.630032 
+357200.213551  7398185.747230 
+357201.582425  7398233.219099 
+357191.909597  7398268.283093 
+357182.277999  7398292.278982 
+357171.920734  7398312.845460 
+357158.133036  7398332.642069 
+357144.741157  7398350.529005 
+357120.983767  7398376.694523 
+357017.782190  7398499.293523 
+356968.576932  7398531.178061 
+356926.150075  7398576.070371 
+356901.287690  7398607.265028 
+356885.603359  7398627.821507 
+356872.557822  7398650.667594 
+356861.812984  7398671.614006 
+356853.319366  7398695.999829 
+356849.839457  7398708.187741 
+356852.148402  7398724.534941 
+356855.323200  7398746.371200 
+356871.197194  7398797.612423 
+356879.179546  7398827.447313 
+356883.335646  7398843.384583 
+356893.503248  7398868.720243 
+356906.243675  7398890.796462 
+356919.256227  7398910.353112 
+356927.024176  7398921.791153 
+356932.433703  7398939.508118 
+356937.109316  7398954.435561 
+356937.942185  7398972.862405 
+356935.476562  7398990.989300 
+356933.761346  7399009.636106 
+356935.872381  7399027.573033 
+356941.051014  7399043.010389 
+356943.648577  7399063.216928 
+356947.004793  7399083.183508 
+356945.602933  7399096.031307 
+356942.180748  7399108.609152 
+356930.108266  7399131.805179 
+356927.147869  7399137.704169 
+356910.177127  7399157.200829 
+356892.002434  7399170.628529 
+356872.285697  7399185.805929 
+356850.796020  7399199.953506 
+356831.318423  7399216.900603 
+356814.388911  7399232.617911 
+356802.588555  7399243.845988 
+356788.198883  7399259.833249 
+356765.678427  7399275.740524 
+356746.951237  7399293.447491 
+356729.444490  7399315.713677 
+356718.312078  7399336.780069 
+356706.635416  7399360.875941 
+356697.160497  7399393.560343 
+356691.899401  7399411.417284 
+356684.700442  7399444.631595 
+356679.365131  7399470.057240 
+356670.953976  7399498.212417 
+356669.189282  7399520.128663 
+356668.917157  7399523.668057 
+356664.126097  7399545.814263 
+356653.381258  7399578.238709 
+356646.982183  7399600.624875 
+356626.803657  7399644.047437 
+356610.195748  7399678.431547 
+356599.516879  7399704.297116 
+356586.520820  7399745.580045 
+356581.589574  7399769.685916 
+356575.305946  7399788.282730 
+356570.185037  7399817.487728 
+356562.342872  7399839.104025 
+356554.253319  7399860.460367 
+356543.863069  7399882.796541 
+356537.760858  7399908.202189 
+356528.624035  7399932.578014 
+356522.579548  7399952.944525 
+356514.127161  7399984.889054 
+356506.045855  7400005.485526 
+356485.677665  7400034.530550 
+356467.667898  7400056.536781 
+356450.202381  7400077.003275 
+356433.470779  7400097.039843 
+356425.719322  7400109.317740 
+356412.451137  7400140.702364 
+356408.410484  7400168.917531 
+356404.798635  7400194.093219 
+356403.347299  7400212.240110 
+356397.979002  7400240.435281 
+356392.421043  7400263.081402 
+356379.235320  7400286.917319 
+356370.659240  7400304.724269 
+356348.509865  7400337.868591 
+356337.855735  7400358.105125 
+356327.778841  7400374.392335 
+356313.067565  7400414.495466 
+356311.698691  7400440.491013 
+356308.763033  7400476.574832 
+356308.622847  7400511.908780 
+356314.065359  7400547.272722 
+356321.536444  7400585.156233 
+356330.021816  7400621.530003 
+356340.791393  7400657.663813 
+356349.771538  7400698.586804 
+356358.281648  7400728.901611 
+356369.092456  7400755.437066 
+356376.629511  7400775.663601 
+356403.033942  7400810.757590 
+356416.244403  7400834.603505 
+356426.816071  7400857.349609 
+356438.129899  7400884.904889 
+356447.662542  7400913.709955 
+356465.441415  7400975.609352 
+356471.378701  7400998.455439 
+356477.447927  7401019.821779 
+356484.267560  7401027.920392 
+356492.093233  7401039.558398 
+356497.337836  7401061.534634 
+356501.015654  7401093.349184 
+356471.057098  7401095.528811 
+356449.493205  7401093.189212 
+356422.594001  7401092.089400 
+356392.643691  7401093.759114 
+356374.576200  7401092.499330 
+356142.675702  7401107.746718 
+355914.807610  7401134.702101 
+355875.423613  7401138.321481 
+355763.497524  7401149.569554 
+355718.778215  7401154.298744 
+355552.657899  7401170.745927 
+355478.656225  7401173.895388 
+355353.692846  7401188.592870 
+355169.933842  7401203.300351 
+355061.875236  7401219.677546 
+354955.639046  7401235.564824 
+354839.787752  7401250.642242 
+354723.985935  7401267.009438 
+354654.033160  7401277.627619 
+354578.646120  7401280.797076 
+354543.731579  7401283.976532 
+354495.317959  7401288.735716 
+354447.687731  7401293.524896 
+354415.980974  7401296.844328 
+354406.440085  7401297.464221 
+354399.298849  7401303.813134 
+354264.209099  7401307.322533 
+354118.786821  7401318.460625 
+354002.506723  7401333.967969 
+353786.529696  7401356.164167 
+353556.097027  7401378.870277 
+353400.210283  7401391.408130 
+Region 1
+245
+344339.268541  7391424.175426 
+344338.691304  7391418.866336 
+344321.316496  7391388.441547 
+344306.836115  7391360.096402 
+344291.803237  7391330.831415 
+344272.638997  7391296.097365 
+344251.454430  7391256.474152 
+344228.513417  7391212.961605 
+344214.280423  7391182.106890 
+344207.155679  7391172.618516 
+344202.537790  7391164.879841 
+344184.214666  7391137.814477 
+344174.368666  7391120.917372 
+344162.551818  7391099.740999 
+344145.003839  7391069.996094 
+344120.141454  7391033.392364 
+344116.974901  7391026.273583 
+344080.584285  7390971.682934 
+344047.360222  7390980.391443 
+344028.377399  7390987.510223 
+344004.661240  7390992.659341 
+343968.328347  7391005.297176 
+343928.837149  7391016.355282 
+343826.427210  7391048.609757 
+343794.374112  7391057.928161 
+343768.060390  7391064.677005 
+343741.655959  7391073.215543 
+343710.848042  7391075.585137 
+343684.781707  7391066.896625 
+343671.595984  7391056.728367 
+343654.773673  7391049.489607 
+343619.380851  7391029.043109 
+343576.450975  7391006.806918 
+343566.588483  7391003.997399 
+343557.682554  7390998.978259 
+343526.899375  7390982.851021 
+343499.142562  7390983.950833 
+343437.444265  7390999.768123 
+343408.961784  7391033.782297 
+343373.362806  7391080.464301 
+343339.635723  7391127.716207 
+343317.519332  7391155.361472 
+343282.769716  7391190.905383 
+343256.827075  7391203.183280 
+343211.687208  7391219.330514 
+343161.929452  7391237.497403 
+343064.780609  7391314.114279 
+342971.581710  7391382.822510 
+342888.649369  7391443.642092 
+342883.916032  7391447.591415 
+342864.166310  7391465.758304 
+342828.699272  7391490.654039 
+342812.223303  7391514.969874 
+342768.221416  7391525.878006 
+342747.102820  7391532.316903 
+342627.400536  7391563.001647 
+342477.888128  7391601.765007 
+342316.039359  7391641.988117 
+342167.532991  7391680.431532 
+342024.733015  7391717.365206 
+341884.794481  7391742.980818 
+341733.146299  7391770.296139 
+341619.298839  7391797.421493 
+341566.572440  7391810.609234 
+341513.582162  7391822.747155 
+341459.742522  7391838.884390 
+341392.337833  7391855.461551 
+341213.452352  7391901.733625 
+341113.219418  7391926.309415 
+341114.876910  7391946.275995 
+341119.618493  7391981.869898 
+341128.862518  7392071.784497 
+341160.470320  7392061.576245 
+341216.915768  7392201.412293 
+341279.966448  7392352.756369 
+341367.912498  7392566.179811 
+341395.710541  7392635.917866 
+341418.643309  7392686.329231 
+341372.761281  7392736.960558 
+341288.905362  7392823.975653 
+341232.938195  7392879.106210 
+341193.183117  7392919.689258 
+341148.851381  7392950.893913 
+340997.805174  7393027.290827 
+340970.106085  7393032.809882 
+340909.191179  7393058.125545 
+340793.702719  7393122.994434 
+340739.904310  7393151.469556 
+340560.969352  7393251.682391 
+340517.618917  7393270.919096 
+340270.809234  7393407.775654 
+340234.418618  7393440.999963 
+340173.503712  7393536.723566 
+340111.582766  7393633.656962 
+340075.414799  7393698.095924 
+340045.489228  7393738.718966 
+340020.832998  7393761.385083 
+340000.003019  7393776.762449 
+339915.330723  7393820.904888 
+339901.798659  7393848.930088 
+339829.306045  7393935.785210 
+339809.416137  7393955.591818 
+339808.203941  7393973.528745 
+339825.323116  7394072.121857 
+339836.397803  7394115.384447 
+339882.527218  7394296.453431 
+339885.767986  7394319.769437 
+339888.002715  7394326.288321 
+339916.419226  7394340.695853 
+339957.370007  7394357.912904 
+340052.506770  7394400.105676 
+340062.748588  7394404.414938 
+340054.972393  7394426.481159 
+340102.157325  7394422.371862 
+340146.703463  7394418.242570 
+340193.896641  7394414.143272 
+340239.193186  7394411.163782 
+340285.256630  7394404.754880 
+340333.967114  7394401.795387 
+340399.838005  7394393.676778 
+340479.010065  7394386.847947 
+340510.419958  7394382.378713 
+340552.154131  7394378.809324 
+340619.369157  7394367.001347 
+340642.541065  7394347.144748 
+340683.813450  7394318.649629 
+340736.778989  7394281.645967 
+340750.500717  7394272.967454 
+340818.301225  7394231.484560 
+340867.811594  7394201.689663 
+340894.809753  7394191.191462 
+340924.471445  7394179.943388 
+341218.169195  7394102.026735 
+341278.943915  7394088.289088 
+341313.116295  7394081.630228 
+341353.382639  7394073.481624 
+341376.166975  7394068.282515 
+341398.192657  7394063.833277 
+341405.218445  7394141.509972 
+341458.992115  7394131.151746 
+341527.188443  7394041.217151 
+341577.276048  7394084.289773 
+341629.631366  7394138.400504 
+341678.952072  7394186.422278 
+341736.106696  7394240.962936 
+341741.178128  7394242.822618 
+341752.186846  7394247.391835 
+341765.108689  7394251.201182 
+341789.047497  7394253.490790 
+341807.667486  7394252.350985 
+341823.640435  7394250.061378 
+341841.138936  7394243.202553 
+341855.602824  7394234.823988 
+341872.738492  7394214.627447 
+341883.714225  7394163.186259 
+341895.737229  7394110.985200 
+341952.751668  7394121.943323 
+342018.622558  7394134.641148 
+342085.276840  7394149.718565 
+342117.816467  7394156.067478 
+342159.080605  7394160.026800 
+342172.571438  7394157.647207 
+342254.308076  7394137.810605 
+342317.004168  7394110.825228 
+342354.466794  7393989.206060 
+342418.548252  7393825.454109 
+342447.022486  7393739.228879 
+342479.240510  7393657.312910 
+342495.163981  7393605.641761 
+342496.071066  7393593.673811 
+342511.095699  7393540.672889 
+342730.940208  7393625.968279 
+342743.688880  7393640.745748 
+342783.221310  7393521.686142 
+342783.237802  7393517.736818 
+342786.387863  7393484.512509 
+342774.917356  7393462.576267 
+342843.344578  7393459.986710 
+342876.568641  7393457.617116 
+342912.959257  7393456.827251 
+342946.183320  7393460.776575 
+342979.407383  7393461.566440 
+343005.514950  7393452.078065 
+343026.081049  7393439.420233 
+343047.438786  7393418.063891 
+343065.638217  7393406.985789 
+343074.618362  7393384.029721 
+343094.112452  7393398.287279 
+343123.386570  7393410.945111 
+343144.859755  7393423.672931 
+343160.412146  7393443.479538 
+343172.426904  7393467.895356 
+343232.550172  7393460.776575 
+343295.839992  7393447.718812 
+343295.303987  7393460.636599 
+343294.256716  7393489.251697 
+343302.956489  7393520.106412 
+343365.446425  7393486.092239 
+343464.335223  7393433.881182 
+343562.424136  7393379.300531 
+343658.929774  7393324.719880 
+343753.860381  7393270.919096 
+343726.697297  7393221.797510 
+343731.059553  7393210.439455 
+343730.927613  7393194.822131 
+343728.000201  7393187.533379 
+343724.297644  7393181.744371 
+343713.082770  7393162.907597 
+343632.830454  7393024.111372 
+343632.038815  7393007.504216 
+343616.214299  7392971.110450 
+343628.410474  7392913.500318 
+343746.430527  7392701.876568 
+343705.603439  7392558.971046 
+343840.033491  7392630.668765 
+343920.788828  7392520.207686 
+343850.374264  7392483.813920 
+343742.785693  7392426.073810 
+343715.886489  7392402.337876 
+343693.737113  7392377.812077 
+343620.799203  7392248.074300 
+343571.387789  7392211.550556 
+343577.737387  7392200.642425 
+343655.136507  7392134.113820 
+343671.604230  7392129.404627 
+343693.737113  7392125.465302 
+343725.386146  7392115.187062 
+343788.494549  7392080.562993 
+343868.565449  7392040.829799 
+343941.346681  7391992.568066 
+344002.269833  7391947.455793 
+344015.719435  7391938.367350 
+344018.094349  7391923.339924 
+344012.561129  7391886.156293 
+344066.351291  7391871.918732 
+344154.157155  7391847.392933 
+344230.888331  7391821.287405 
+344260.162450  7391803.090522 
+344316.327527  7391766.706754 
+344362.209554  7391735.852039 
+344411.258134  7391720.824613 
+344419.957907  7391650.416673 
+344417.582993  7391623.521280 
+344394.641979  7391528.597540 
+344339.268541  7391424.175426 
+Region 1
+160
+337085.117164  7397800.003305 
+337064.278939  7397738.833783 
+337023.344650  7397666.586158 
+337016.120952  7397601.577293 
+337030.568348  7397531.739256 
+337111.777228  7397341.601825 
+337074.751652  7397287.131155 
+337050.144900  7397256.326432 
+337016.063229  7397203.965401 
+336981.824879  7397158.343215 
+336633.685514  7397505.313782 
+336447.469133  7397638.350994 
+336366.697304  7397670.655461 
+336275.823842  7397702.969926 
+336197.072340  7397711.048542 
+336150.819232  7397710.118701 
+335944.655219  7397680.753731 
+335901.040906  7397676.464466 
+335763.988552  7397654.628206 
+335611.779627  7397659.617352 
+335499.498950  7397689.552224 
+335354.777603  7397761.919828 
+335127.709395  7397964.025209 
+334992.965987  7398055.099609 
+334848.244639  7398117.488922 
+334783.082924  7398135.865775 
+334771.043428  7398197.235263 
+334762.492086  7398231.399410 
+334753.948991  7398257.025021 
+334748.259092  7398281.220877 
+334739.715997  7398302.577218 
+334726.901355  7398323.933560 
+334711.241763  7398343.860147 
+334645.131732  7398434.794571 
+334548.955944  7398558.803329 
+334534.731196  7398587.278452 
+334523.343151  7398614.323819 
+334517.653252  7398629.981137 
+334516.226654  7398647.068210 
+334513.381705  7398668.414554 
+334519.071604  7398691.190652 
+334519.071604  7398723.935044 
+334510.528509  7398968.773105 
+334573.150384  7398996.638332 
+334697.421080  7399062.287087 
+334782.728336  7399107.689310 
+334796.845883  7399114.848084 
+334934.590920  7399186.895743 
+334971.534033  7399206.242429 
+335001.937886  7399222.069718 
+335015.882262  7399230.488276 
+335036.143250  7399247.815308 
+335047.778682  7399261.822908 
+335057.896807  7399278.110118 
+335069.260113  7399302.785892 
+335078.339213  7399332.290838 
+335083.072549  7399376.013348 
+335083.806463  7399388.971129 
+335087.286373  7399424.545035 
+335109.806829  7399709.466231 
+335110.293356  7399724.213705 
+335110.021231  7399736.661573 
+335100.002060  7399800.920566 
+335075.782881  7400000.986296 
+335064.856625  7400045.458679 
+335131.469677  7400128.174510 
+335156.216615  7400192.113558 
+335258.593568  7400348.396788 
+335292.353637  7400398.358230 
+335373.463561  7400535.854678 
+335400.956494  7400621.100076 
+335410.588092  7400678.850184 
+335425.711679  7400823.225454 
+335446.723074  7400938.995624 
+335449.089742  7400984.777782 
+335470.290801  7401032.279645 
+335495.837624  7401037.718713 
+335561.840454  7401046.657182 
+335700.022541  7401017.782128 
+335803.916801  7400998.205482 
+335831.723091  7400994.146177 
+335855.595928  7400990.176857 
+335903.333358  7400983.537994 
+335954.459988  7400971.630034 
+335984.896825  7400976.219248 
+336018.673386  7400980.858453 
+336219.312424  7401025.530801 
+336325.977417  7401053.615990 
+336430.382943  7401079.671527 
+336449.769831  7401085.420543 
+336526.311344  7401109.146478 
+336560.112644  7401115.985307 
+336636.266584  7401131.822594 
+336700.438751  7401143.370616 
+336731.683719  7401133.962228 
+336794.140670  7401093.309191 
+336880.569413  7401039.408424 
+336865.173700  7400930.737038 
+336851.047907  7400819.936018 
+336838.637330  7400751.907670 
+336827.513165  7400669.761741 
+336871.581022  7400643.666211 
+336956.723353  7400588.905591 
+336961.431951  7400532.855192 
+336966.132302  7400431.462560 
+337034.881127  7400436.881631 
+337058.828181  7400437.671496 
+337089.240279  7400428.922995 
+337104.446329  7400418.634757 
+337141.711045  7400383.940700 
+337173.648696  7400351.536250 
+337221.551050  7400314.952517 
+337250.000546  7400310.003364 
+337340.832776  7400233.286505 
+337318.600939  7400187.734308 
+337318.089672  7400177.836004 
+337316.300240  7400158.459323 
+337317.471205  7400132.563758 
+337321.858200  7400092.160679 
+337327.556345  7400064.295452 
+337320.233692  7400027.491756 
+337313.537753  7400008.574996 
+337301.778628  7399982.419477 
+337287.809513  7399961.773013 
+337258.189053  7399938.876935 
+337190.586454  7399887.675705 
+337185.028495  7399879.717069 
+337091.070943  7399813.628389 
+337058.424116  7399793.721799 
+337016.228153  7399683.040757 
+336970.016277  7399568.890310 
+337007.652073  7399506.690965 
+337033.726655  7399465.088091 
+337054.589618  7399429.514184 
+337075.073255  7399391.360720 
+337092.942837  7399344.448755 
+337127.568759  7399337.749903 
+337148.390492  7399271.011334 
+337161.939049  7399228.858555 
+337169.723491  7399208.232088 
+337175.149510  7399188.695434 
+337178.596435  7399163.479754 
+337179.454043  7399134.534712 
+337181.193997  7399038.371184 
+337178.307817  7398931.559479 
+337177.837782  7398826.127539 
+337176.716294  7398724.474951 
+337175.932902  7398630.621027 
+337173.021983  7398484.346083 
+337172.997244  7398413.518215 
+337172.288068  7398366.076342 
+337172.263330  7398316.744792 
+337170.960425  7398213.692444 
+337170.803747  7398157.902000 
+337170.836732  7398113.799554 
+337176.493646  7397969.644247 
+337151.771446  7397930.240996 
+337117.928916  7397883.069076 
+337096.398008  7397846.145401 
+337085.117164  7397800.003305 
+Region 1
+430
+351616.072313  7401306.892606 
+351610.176258  7401334.157936 
+351602.070213  7401359.213644 
+351587.573340  7401386.488972 
+351581.677285  7401394.837542 
+351571.113863  7401403.196110 
+351552.691784  7401413.024427 
+351536.232307  7401419.163375 
+351518.296756  7401422.112870 
+351493.731235  7401422.352829 
+351470.633543  7401420.633124 
+351445.325861  7401416.463838 
+351414.864285  7401410.804807 
+351385.631397  7401401.226448 
+351365.485856  7401396.067332 
+351329.218933  7401388.138690 
+351310.120663  7401383.209534 
+351300.876639  7401383.209534 
+351278.686032  7401386.908900 
+351266.984631  7401389.378477 
+351251.572426  7401391.838056 
+351233.702844  7401390.608267 
+351225.077287  7401386.908900 
+351208.551840  7401386.918899 
+351190.566811  7401390.288321 
+351178.857164  7401387.208849 
+351156.674803  7401379.200221 
+351120.317172  7401368.722016 
+351101.829123  7401365.342594 
+351085.806697  7401367.192278 
+351059.311558  7401367.192278 
+351035.282042  7401368.422067 
+351017.404214  7401371.501539 
+350994.603386  7401379.510168 
+350976.733804  7401384.439323 
+350961.329845  7401390.608267 
+350942.841796  7401391.838056 
+350929.284993  7401390.608267 
+350913.262567  7401390.608267 
+350902.171387  7401394.307633 
+350886.767428  7401402.926157 
+350875.676248  7401410.944783 
+350865.813756  7401419.573305 
+350857.188199  7401429.431617 
+350855.341043  7401446.678662 
+350855.341043  7401478.113278 
+350859.653822  7401495.370322 
+350874.439313  7401519.396206 
+350896.011453  7401531.104201 
+350930.521928  7401544.661879 
+350947.154575  7401555.140084 
+350957.017067  7401571.157340 
+350963.177001  7401589.034278 
+350961.948313  7401604.441639 
+350954.551444  7401619.839001 
+350945.307419  7401627.857628 
+350934.216239  7401632.786784 
+350917.575346  7401635.246362 
+350894.774518  7401632.786784 
+350864.585068  7401619.229106 
+350850.409797  7401609.980690 
+350836.852994  7401601.352168 
+350823.914658  7401600.742273 
+350807.273765  7401600.742273 
+350791.869806  7401606.291322 
+350782.007314  7401615.529740 
+350775.228912  7401631.556994 
+350775.228912  7401647.574251 
+350780.778625  7401670.990240 
+350798.029740  7401715.972535 
+350806.655297  7401736.309051 
+350807.892232  7401752.946201 
+350807.273765  7401767.743667 
+350802.342519  7401778.211874 
+350790.022650  7401782.531134 
+350777.076068  7401783.760923 
+350759.824953  7401782.531134 
+350749.962462  7401774.522506 
+350727.780101  7401752.336306 
+350682.796913  7401699.335384 
+350663.690397  7401687.017494 
+350652.599216  7401682.698234 
+350639.042413  7401682.698234 
+350631.645544  7401687.627390 
+350625.485610  7401695.026123 
+350621.172831  7401706.734117 
+350618.707208  7401725.830846 
+350622.401520  7401758.495251 
+350629.798389  7401791.159656 
+350631.645544  7401836.141951 
+350632.264012  7401859.557940 
+350637.813725  7401876.195090 
+350653.217684  7401890.372662 
+350681.559978  7401906.389918 
+350703.750585  7401925.496645 
+350725.314478  7401954.461684 
+350737.642593  7401977.257779 
+350743.802527  7401994.514823 
+350754.893707  7402030.248702 
+350769.679199  7402054.284585 
+350792.480027  7402082.019834 
+350836.234527  7402122.682869 
+350875.057780  7402151.038012 
+350907.102633  7402182.462629 
+350932.369083  7402224.985345 
+350940.376173  7402256.409963 
+350940.376173  7402294.613419 
+350934.216239  7402322.958563 
+350920.659436  7402351.313706 
+350887.996116  7402403.074840 
+350859.653822  7402432.039879 
+350816.517789  7402472.702914 
+350802.960986  7402485.650696 
+350790.632871  7402495.509007 
+350777.744013  7402501.817926 
+350765.366420  7402507.217002 
+350739.489749  7402518.924996 
+350706.826429  7402521.384575 
+350677.865667  7402519.534892 
+350655.683307  7402511.526264 
+350631.645544  7402496.738796 
+350612.547274  7402486.880485 
+350590.356667  7402479.481752 
+350547.220635  7402474.552597 
+350504.703070  7402469.013546 
+350478.826398  7402465.924075 
+350458.482947  7402460.994919 
+350423.362251  7402444.977663 
+350367.287882  7402424.021252 
+350334.624563  7402414.162941 
+350314.907825  7402411.083468 
+350297.038243  7402411.083468 
+350277.313260  7402414.162941 
+350251.436588  7402424.641146 
+350226.170137  7402436.969034 
+350203.369309  7402452.986291 
+350172.553145  7402467.773758 
+350142.363695  7402483.181119 
+350116.478777  7402491.189747 
+350094.914884  7402495.509007 
+350054.854695  7402497.968586 
+350011.100196  7402501.048058 
+349997.543392  7402504.747425 
+349976.597967  7402515.225630 
+349946.400270  7402528.783308 
+349918.049729  7402539.261513 
+349884.157721  7402545.420458 
+349849.647246  7402544.190668 
+349823.152107  7402538.021725 
+349800.557435  7402389.777118 
+349792.599822  7402332.077002 
+349786.299702  7402264.388596 
+349800.573927  7402204.168911 
+349811.656861  7402191.501081 
+349817.998213  7402177.233525 
+349887.720093  7402121.773025 
+350002.326206  7402014.921327 
+350040.069204  7401915.668329 
+350093.496532  7401769.383386 
+350139.263112  7401657.762506 
+350125.186797  7401641.805239 
+350109.106647  7401604.601611 
+350047.226932  7401579.985828 
+350024.203456  7401578.416097 
+350007.620286  7401574.906698 
+349969.390761  7401565.118375 
+349942.029768  7401545.431747 
+349940.702125  7401493.290678 
+349947.241385  7401461.756080 
+349951.999461  7401404.615867 
+349947.241385  7401339.547013 
+349936.133713  7401283.996528 
+349917.818835  7401240.533973 
+349915.501644  7401217.337946 
+349898.036127  7401120.524530 
+349893.278052  7401088.789965 
+349885.328686  7401064.834069 
+349886.367711  7401059.095052 
+349887.349012  7401050.326554 
+349890.226947  7401041.518063 
+349893.838796  7401030.799899 
+349899.751343  7401021.171548 
+349937.733482  7400991.646605 
+349972.573806  7400968.110637 
+349982.296112  7400961.371791 
+350000.256402  7400948.583981 
+350010.646653  7400931.306941 
+350039.236335  7400901.472051 
+350052.809630  7400883.455137 
+350068.617654  7400863.728516 
+350083.221729  7400836.253223 
+350091.393743  7400817.066509 
+350094.626266  7400798.379710 
+350098.889567  7400782.482433 
+350109.048923  7400737.730099 
+350112.009320  7400727.901782 
+350115.406767  7400688.638508 
+350123.463334  7400636.547430 
+350157.322357  7400470.995788 
+350103.548687  7400438.161412 
+350030.371637  7400374.432328 
+349940.091903  7400291.226581 
+349904.962961  7400255.502700 
+349891.010339  7400242.404943 
+349875.829028  7400225.117905 
+349863.797778  7400212.750023 
+349855.609271  7400202.221826 
+349842.728658  7400185.294726 
+349834.086609  7400171.327118 
+349823.803559  7400149.780809 
+349803.897158  7400102.478912 
+349794.413993  7400083.592147 
+349787.281003  7400068.084803 
+349778.919325  7400048.028238 
+349771.077160  7400035.970304 
+349762.121754  7400025.062172 
+349744.557282  7400002.486039 
+349729.458434  7399989.408279 
+349715.926370  7399978.580134 
+349691.492788  7399954.604241 
+349645.429344  7399915.360963 
+349636.490430  7399905.222700 
+349617.524099  7399889.145454 
+349606.696798  7399880.566923 
+349592.735930  7399867.089232 
+349579.937780  7399855.111283 
+349564.459605  7399841.653589 
+349549.030908  7399831.225375 
+349530.460396  7399816.297932 
+349507.700800  7399800.680607 
+349487.208916  7399784.633356 
+349439.619919  7399758.397849 
+349410.230353  7399743.290437 
+349383.322903  7399729.972718 
+349294.882079  7399686.480168 
+349267.133513  7399672.842504 
+349176.012664  7399625.210663 
+349116.582080  7399594.905854 
+349174.503604  7399305.255469 
+349215.289461  7399090.702220 
+349227.749515  7399021.554064 
+349249.148484  7398872.559586 
+349259.868584  7398795.392804 
+349269.879508  7398718.975893 
+349285.407160  7398596.836814 
+349296.572556  7398517.010488 
+349336.096740  7398505.722421 
+349348.787689  7398502.792923 
+349358.551226  7398498.883593 
+349369.287818  7398494.984261 
+349382.960069  7398489.125264 
+349395.651017  7398483.266268 
+349410.296323  7398471.548275 
+349419.078559  7398461.789947 
+349432.750809  7398440.303627 
+349455.782531  7398357.317842 
+349479.003917  7398313.485350 
+349490.812519  7398296.988176 
+349496.015891  7398288.069703 
+349504.666187  7398280.301034 
+349515.971769  7398273.662171 
+349526.543437  7398269.342911 
+349544.314064  7398266.893331 
+349566.183067  7398264.023822 
+349588.736508  7398262.134146 
+349630.008892  7398259.754554 
+349648.686605  7398258.074841 
+349661.088936  7398256.055187 
+349681.011829  7398252.985713 
+349706.187571  7398250.226186 
+349725.186887  7398247.676622 
+349745.992127  7398240.137914 
+349775.662064  7398234.688847 
+349786.208993  7398232.249265 
+349799.823520  7398231.979311 
+349820.397866  7398224.400609 
+349836.453277  7398223.350789 
+349850.950150  7398223.160822 
+349860.961074  7398228.009991 
+349891.216494  7398239.967943 
+349915.823247  7398250.956061 
+349935.869833  7398261.124319 
+349950.770772  7398268.373077 
+349965.556264  7398280.710964 
+349982.997042  7398298.447926 
+349997.048619  7398316.354858 
+350004.066161  7398328.832721 
+350010.861055  7398344.300072 
+350026.817511  7398374.024980 
+350062.169102  7398430.395324 
+350151.079961  7398588.558232 
+350183.858728  7398600.996102 
+350217.800213  7398611.154362 
+350314.866594  7398627.171618 
+350397.271177  7398641.129227 
+350521.203777  7398664.465230 
+350583.141216  7398677.273036 
+350651.189111  7398681.572300 
+350713.398675  7398686.571444 
+350774.536229  7398689.640918 
+350826.157633  7398688.451122 
+350892.572774  7398688.271153 
+350923.586848  7398688.651087 
+350954.592675  7398689.290978 
+351018.030927  7398690.840712 
+351076.678120  7398691.450608 
+351111.089640  7398692.180483 
+351138.038322  7398693.530252 
+351202.853695  7398693.040336 
+351210.539182  7398692.970348 
+351314.268517  7398692.770382 
+351380.782614  7398693.580243 
+351441.161514  7398695.499914 
+351452.137247  7398699.269269 
+351459.476393  7398699.429241 
+351465.578603  7398699.569217 
+351473.989759  7398701.448895 
+351521.628233  7398720.465638 
+351546.218493  7398729.334119 
+351580.300164  7398746.451187 
+351639.747241  7398770.517065 
+351690.849132  7398794.203007 
+351789.276141  7398836.265802 
+351816.233069  7398838.645395 
+351843.387907  7398840.765032 
+351852.739132  7398841.814852 
+351960.377181  7398859.131886 
+352044.010452  7398860.461658 
+352154.699606  7398872.609577 
+352184.443760  7398874.529248 
+352253.753329  7398881.448063 
+352289.129658  7398884.987457 
+352303.511084  7398886.657171 
+352345.731785  7398890.296547 
+352364.706362  7398891.346368 
+352425.110001  7398895.185710 
+352458.936040  7398897.365337 
+352481.646159  7398899.764926 
+352559.540053  7398911.352941 
+352619.539628  7398913.272612 
+352624.800723  7398949.186460 
+352628.866114  7398997.748142 
+352628.866114  7399028.672845 
+352632.040913  7399055.678219 
+352633.962285  7399077.244525 
+352636.007350  7399109.648974 
+352585.639373  7399248.065265 
+352570.136460  7399288.988255 
+352541.579763  7399349.297925 
+352510.631659  7399428.654332 
+352477.300395  7399498.492369 
+352443.969131  7399553.242991 
+352423.337062  7399584.197688 
+352409.722535  7399608.703491 
+352379.689763  7399666.723552 
+352359.057694  7399718.304717 
+352344.783469  7399765.916562 
+352336.834102  7399794.491667 
+352328.901228  7399827.815959 
+352324.926545  7399846.862696 
+352319.822128  7399868.269030 
+352314.956852  7399903.772948 
+352302.472059  7399937.687139 
+352293.590869  7399948.315318 
+352277.741613  7399971.521343 
+352239.990370  7400009.864775 
+352194.471176  7400063.805536 
+352182.530634  7400075.963453 
+352170.985912  7400096.030016 
+352167.011228  7400104.888499 
+352158.410410  7400130.054188 
+352152.868943  7400155.229876 
+352150.691938  7400189.983923 
+352160.991480  7400293.186245 
+352167.844098  7400337.238699 
+352168.990324  7400346.717076 
+352186.546549  7400456.988187 
+352187.742252  7400468.486218 
+352188.138071  7400481.114055 
+352186.991845  7400494.061837 
+352184.666408  7400508.129427 
+352181.936906  7400522.946889 
+352176.618087  7400535.014822 
+352168.272902  7400546.222902 
+352159.226787  7400554.731445 
+352147.879973  7400563.929869 
+352134.380894  7400568.489088 
+352089.851248  7400575.907817 
+351995.423661  7400588.655634 
+351953.376131  7400587.255874 
+351776.659408  7400522.017048 
+351759.952545  7400544.823142 
+351738.256712  7400580.147091 
+351719.216166  7400658.703635 
+351705.601639  7400691.398035 
+351691.261444  7400711.214641 
+351678.768404  7400733.370845 
+351648.562461  7400773.334000 
+351616.847458  7400744.408955 
+351575.500858  7400698.876754 
+351534.319182  7400666.642275 
+351523.566097  7400659.093568 
+351475.540050  7400620.890112 
+351396.367989  7400578.147434 
+351323.438326  7400554.021566 
+351313.476879  7400556.161200 
+351292.646900  7400556.381162 
+351271.536550  7400560.490458 
+351282.198926  7400573.058306 
+351306.277920  7400650.934966 
+351334.529506  7400747.728386 
+351362.533705  7400842.812099 
+351393.737442  7400948.204046 
+351398.907829  7400963.931353 
+351414.130370  7401008.143779 
+351418.797737  7401018.961926 
+351438.943278  7401062.934394 
+351443.363258  7401070.553089 
+351448.525398  7401074.722375 
+351464.490101  7401086.760313 
+351475.053522  7401096.348671 
+351519.278057  7401141.550928 
+351557.359150  7401180.364280 
+351598.384148  7401223.356915 
+351614.357097  7401242.763591 
+351620.005765  7401250.872202 
+351622.463141  7401257.751024 
+351623.197056  7401265.619676 
+351621.481840  7401281.097025 
+351616.072313  7401306.892606 
+Region 1
+126
+323980.817641  7397992.200383 
+324057.120013  7397934.540260 
+324040.990386  7397911.364230 
+324092.018061  7397845.835454 
+324176.978976  7397731.405055 
+324194.263075  7397698.160749 
+324188.853548  7397690.242106 
+324230.719661  7397533.278992 
+324285.746758  7397343.731460 
+324331.727740  7397182.789028 
+324352.236116  7397131.617793 
+324370.707672  7397107.931850 
+324406.768439  7397044.902647 
+324429.965086  7396949.928915 
+324440.322351  7396937.980961 
+324443.043608  7396924.063345 
+324443.076592  7396912.535320 
+324439.538960  7396902.627017 
+324435.127226  7396893.498581 
+324429.569267  7396885.939876 
+324419.632559  7396874.811782 
+324446.012251  7396786.426921 
+324472.812500  7396704.111021 
+324479.871274  7396681.244938 
+324519.601613  7396545.958111 
+324509.095915  7396522.582115 
+324500.882669  7396499.586054 
+324494.318670  7396474.950274 
+324489.387424  7396451.964212 
+324482.823424  7396419.119838 
+324489.387424  7396323.866154 
+324515.668161  7396220.403876 
+324522.232160  7396177.701190 
+324527.163406  7396103.803848 
+324523.881407  7396080.807787 
+324506.127272  7396048.483324 
+324477.908671  7395999.971634 
+324456.221084  7395977.665455 
+324440.643954  7395967.297231 
+324423.062991  7395959.468572 
+324404.467741  7395955.709216 
+324382.582244  7395951.689904 
+324357.653889  7395951.499937 
+324323.563972  7395953.349620 
+324254.889363  7395961.888157 
+324190.799658  7395969.906784 
+324138.048521  7395979.415155 
+324096.446287  7395984.604266 
+324073.810384  7395987.203821 
+324043.027205  7395988.033679 
+324016.053785  7395986.313973 
+323999.998374  7395984.374306 
+323965.578607  7395981.524794 
+323928.759187  7395969.336881 
+323903.146395  7395958.178793 
+323879.512698  7395948.920378 
+323833.770856  7395916.805879 
+323808.306496  7395899.178899 
+323797.446210  7395885.901173 
+323709.483668  7395792.587157 
+323675.583414  7395753.253894 
+323662.397691  7395744.275432 
+323639.761788  7395698.913202 
+323623.129141  7395670.348095 
+323604.773031  7395633.144468 
+323592.667565  7395614.757618 
+323573.470340  7395590.511771 
+323557.546868  7395571.345054 
+323539.067065  7395554.967859 
+323508.143700  7395536.990938 
+323488.360993  7395525.942831 
+323437.819845  7395510.365499 
+323352.092032  7395420.640868 
+323241.848174  7395300.011531 
+323193.046981  7395247.870462 
+323084.806958  7395133.560042 
+322960.626970  7395008.331493 
+322908.486054  7395063.202094 
+322778.038931  7395159.315631 
+322679.249088  7395255.479159 
+322541.866886  7395376.308462 
+322440.265078  7395484.729890 
+322323.325281  7395595.220964 
+322149.478247  7395741.825852 
+321998.324839  7395885.191295 
+321851.319285  7396032.046140 
+321734.049639  7396143.926976 
+321538.275877  7396361.519704 
+321460.010902  7396574.223270 
+321439.766406  7396810.552789 
+321435.824708  7396919.844068 
+321439.873607  7397044.702681 
+321155.156001  7397230.310888 
+321196.172753  7397248.547764 
+321232.637585  7397269.054252 
+321266.818211  7397280.452299 
+321310.119168  7397294.119958 
+321344.299794  7397298.679177 
+321387.600751  7397314.626445 
+321435.453627  7397344.251371 
+321481.690243  7397401.231611 
+321535.628837  7397502.714228 
+321583.440483  7397617.474570 
+321628.324716  7397727.745682 
+321647.785820  7397771.298222 
+321664.162834  7397793.174474 
+321728.590634  7397885.788610 
+321839.329266  7397988.471022 
+321962.148625  7398073.036537 
+322107.109114  7398101.221709 
+322401.062497  7398103.231365 
+322637.292267  7398096.632495 
+322810.331171  7398086.984148 
+323021.822248  7398089.763671 
+323213.489387  7398119.318609 
+323369.285423  7398217.451800 
+323509.298173  7398295.668402 
+323748.999605  7398458.030591 
+323794.527045  7398290.029368 
+323823.578515  7398208.733293 
+323830.909414  7398192.076146 
+323847.566800  7398138.115389 
+323867.563909  7398098.142236 
+323894.867179  7398063.488172 
+323924.256745  7398036.192848 
+323980.817641  7397992.200383 
+Region 1
+221
+340976.158818  7397756.260797 
+341015.427369  7397786.855557 
+341050.976869  7397821.989539 
+341089.420796  7397865.392104 
+341113.804900  7397899.696228 
+341167.957897  7398039.822226 
+341184.079278  7398108.030542 
+341189.859886  7398155.562401 
+341192.168830  7398186.007186 
+341187.608665  7398241.597664 
+341182.009474  7398277.091584 
+341165.475782  7398349.009265 
+341125.662980  7398510.671574 
+341114.217212  7398564.362377 
+341107.191423  7398796.252656 
+341111.322785  7398835.935859 
+341124.970297  7398907.033680 
+341134.478201  7398975.241997 
+341148.942089  7399050.469111 
+341168.370209  7399113.708279 
+341191.929690  7399184.806101 
+341162.169043  7399198.763710 
+341149.354401  7399204.542720 
+341144.192260  7399208.881977 
+341139.854743  7399215.710807 
+341137.166472  7399220.250029 
+341130.965306  7399223.969392 
+341120.838935  7399230.798223 
+341107.818137  7399240.096630 
+341092.315223  7399249.395037 
+341079.500581  7399258.693444 
+341066.892094  7399269.231639 
+341056.353412  7399278.740011 
+341045.608573  7399286.388700 
+341030.732373  7399298.996541 
+341004.896932  7399322.972434 
+340983.399009  7399341.989177 
+340960.457995  7399360.376027 
+340942.893524  7399374.023689 
+340925.329053  7399385.391742 
+340914.782124  7399392.000610 
+340893.086291  7399408.737743 
+340881.508583  7399417.006327 
+340872.833548  7399422.795335 
+340847.204264  7399447.601086 
+340836.253269  7399460.408892 
+340819.925733  7399486.454431 
+340812.067075  7399500.711989 
+340808.966492  7399508.570643 
+340803.185884  7399530.476890 
+340797.603186  7399554.862713 
+340794.708759  7399569.330235 
+340788.919905  7399611.493013 
+340787.270659  7399622.651102 
+340785.200855  7399650.346358 
+340784.788544  7399670.802854 
+340784.582388  7399695.608605 
+340786.033725  7399718.344710 
+340787.889127  7399741.280781 
+340788.919905  7399766.086532 
+340787.064503  7399788.192746 
+340784.170077  7399802.870232 
+340781.687961  7399810.728886 
+340778.999690  7399816.507896 
+340774.868328  7399823.126762 
+340769.994806  7399829.835613 
+340764.741957  7399837.184354 
+340759.365415  7399846.482761 
+340751.721159  7399861.770143 
+340745.519994  7399872.728266 
+340725.473407  7399904.142885 
+340709.352026  7399934.937610 
+340687.862349  7399972.141237 
+340668.021918  7400004.375716 
+340651.092406  7400031.351095 
+340634.954533  7400057.286653 
+340616.920027  7400088.041385 
+340608.294469  7400102.348934 
+340596.098294  7400128.174510 
+340558.487236  7400204.851376 
+340552.492227  7400220.358720 
+340547.791875  7400229.657127 
+340529.773861  7400252.483217 
+340521.362706  7400269.300337 
+340503.336446  7400308.053698 
+340500.334818  7400317.062155 
+340499.130868  7400333.889273 
+340447.278570  7400269.590287 
+340233.973322  7400103.468742 
+340131.101594  7400024.922196 
+340053.933368  7399963.952640 
+339973.656312  7399907.072383 
+339966.242951  7399899.663652 
+339947.952812  7399866.169389 
+339900.165905  7399823.966618 
+339882.659157  7399807.249482 
+339836.579220  7399829.265710 
+339793.970947  7399849.642220 
+339751.370919  7399881.136825 
+339718.946740  7399907.992225 
+339697.960083  7399933.077928 
+339672.099904  7399958.183628 
+339641.341464  7399987.518603 
+339604.060255  7400067.194955 
+339615.283375  7400110.037617 
+339507.571110  7400212.490068 
+339423.443065  7400304.864245 
+339275.654119  7400465.586714 
+339213.947575  7400525.076524 
+339071.700097  7400670.651589 
+339012.582869  7400722.742666 
+338984.619901  7400747.098494 
+338974.147188  7400753.987314 
+338951.197928  7400765.485345 
+338922.121719  7400770.444495 
+338892.501259  7400775.503628 
+338766.523593  7400795.240248 
+338729.819620  7400803.018915 
+338658.250585  7400808.088047 
+338629.058928  7400804.838604 
+338601.277377  7400809.587790 
+338560.689430  7400814.047026 
+338380.806155  7400829.324409 
+338318.002862  7400819.716055 
+338252.973087  7400809.017888 
+338198.061437  7400790.511058 
+338081.913278  7400670.821560 
+338037.936130  7400625.009407 
+338025.146227  7400605.682717 
+337974.019597  7400554.811431 
+337903.077274  7400482.393836 
+337834.716022  7400379.311493 
+337790.376040  7400367.853455 
+337671.786997  7400344.207506 
+337573.500174  7400280.288454 
+337503.671093  7400238.175668 
+337441.948057  7400193.393339 
+337340.832776  7400233.286505 
+337318.600939  7400187.734308 
+337318.089672  7400177.836004 
+337316.300240  7400158.459323 
+337317.471205  7400132.563758 
+337321.858200  7400092.160679 
+337327.556345  7400064.295452 
+337320.233692  7400027.491756 
+337313.537753  7400008.574996 
+337301.778628  7399982.419477 
+337287.809513  7399961.773013 
+337258.189053  7399938.876935 
+337190.586454  7399887.675705 
+337185.028495  7399879.717069 
+337091.070943  7399813.628389 
+337058.424116  7399793.721799 
+337016.228153  7399683.040757 
+336970.016277  7399568.890310 
+337007.652073  7399506.690965 
+337033.726655  7399465.088091 
+337054.589618  7399429.514184 
+337075.073255  7399391.360720 
+337092.942837  7399344.448755 
+337127.568759  7399337.749903 
+337148.390492  7399271.011334 
+337161.939049  7399228.858555 
+337169.723491  7399208.232088 
+337175.149510  7399188.695434 
+337178.596435  7399163.479754 
+337179.454043  7399134.534712 
+337181.193997  7399038.371184 
+337178.307817  7398931.559479 
+337177.837782  7398826.127539 
+337176.716294  7398724.474951 
+337175.932902  7398630.621027 
+337173.021983  7398484.346083 
+337172.997244  7398413.518215 
+337172.288068  7398366.076342 
+337172.263330  7398316.744792 
+337170.960425  7398213.692444 
+337170.803747  7398157.902000 
+337170.836732  7398113.799554 
+337176.493646  7397969.644247 
+337151.771446  7397930.240996 
+337117.928916  7397883.069076 
+337096.398008  7397846.145401 
+337085.117164  7397800.003305 
+337064.278939  7397738.833783 
+337023.344650  7397666.586158 
+337016.120952  7397601.577293 
+337030.568348  7397531.739256 
+337111.777228  7397341.601825 
+337074.751652  7397287.131155 
+337050.144900  7397256.326432 
+337016.063229  7397203.965401 
+336981.824879  7397158.343215 
+337194.214796  7397000.300287 
+337391.332693  7396931.912001 
+337576.386355  7396931.912001 
+337821.777686  7396988.232354 
+338206.431361  7397106.442105 
+338535.431225  7397199.266206 
+338585.906403  7397212.193991 
+338837.853488  7397289.180804 
+338911.335649  7397309.607305 
+339021.373351  7397338.952279 
+339154.731393  7397356.979191 
+339360.862421  7397336.002784 
+339523.214210  7397336.002784 
+339593.026798  7397346.071059 
+339654.560171  7397352.419972 
+339841.040431  7397414.219386 
+340016.116154  7397512.502551 
+340178.896747  7397598.507819 
+340221.570991  7397617.284603 
+340301.757337  7397650.718876 
+340424.617928  7397669.145719 
+340657.879054  7397676.074533 
+340771.685283  7397678.364140 
+340824.461159  7397685.172974 
+340880.675714  7397701.700143 
+340932.074469  7397727.665696 
+340931.777605  7397728.135615 
+340976.158818  7397756.260797 
+Region 1
+234
+331712.623682  7390192.006486 
+331686.120296  7390140.935234 
+331683.753628  7390117.869185 
+331690.259904  7390088.884150 
+331696.757934  7390068.057717 
+331725.850636  7390000.039368 
+331798.821531  7389936.790202 
+331619.870079  7389999.569448 
+331573.757157  7390028.264533 
+331581.788986  7390000.029370 
+331590.562976  7389974.213792 
+331596.401307  7389945.818655 
+331600.343005  7389909.554867 
+331608.127447  7389827.828866 
+331608.127447  7389775.287866 
+331601.621171  7389634.431993 
+331591.973081  7389489.226866 
+331578.226614  7389343.421841 
+331578.127660  7389255.396918 
+331603.262171  7389247.928198 
+331730.006736  7389215.003837 
+331758.918020  7389207.865060 
+331859.901361  7389182.949328 
+331993.976825  7389168.841745 
+332122.123249  7389164.182543 
+332262.152492  7389149.874993 
+332395.551765  7389140.086670 
+332485.031614  7389141.446437 
+332546.367077  7389142.616237 
+332643.697338  7389145.295778 
+332704.529781  7389146.205622 
+332778.284068  7389149.245101 
+332853.572154  7389149.485060 
+332929.091134  7389152.794493 
+333027.452173  7389152.694510 
+333212.002815  7389152.654517 
+333340.272933  7389152.234589 
+333412.518160  7389151.704680 
+333453.600881  7389150.704851 
+333502.022747  7389150.774839 
+333541.563423  7389151.544707 
+333623.951513  7389150.314918 
+333697.211026  7389151.054791 
+333774.032911  7389149.785009 
+333847.787198  7389151.804663 
+333847.828429  7389151.794665 
+333915.208380  7389153.024454 
+333951.186684  7389155.294065 
+334049.803356  7389156.203909 
+334125.817111  7389160.013257 
+334232.539828  7389161.483005 
+334285.761000  7389163.872596 
+334309.048356  7389163.042738 
+334325.870666  7389161.403019 
+334336.434088  7389160.143235 
+334355.656051  7389198.566653 
+334398.330295  7389286.481594 
+334434.844604  7389360.768869 
+334459.542065  7389411.040258 
+334476.933365  7389447.074086 
+334519.632348  7389534.169167 
+334562.331330  7389621.594192 
+334572.185575  7389643.190493 
+334578.139354  7389658.437881 
+334582.872690  7389672.885406 
+334586.096967  7389686.103142 
+334594.582338  7389711.338820 
+334610.423347  7389763.679854 
+334619.535432  7389797.564050 
+334623.526607  7389823.189661 
+334627.385843  7389842.956275 
+334640.332426  7389940.829510 
+334640.818953  7389946.328568 
+334645.758445  7389969.414614 
+334648.801304  7389997.919731 
+334651.901887  7390022.095590 
+334653.056359  7390036.953045 
+334654.441726  7390058.669325 
+334656.511530  7390074.536607 
+334662.844635  7390110.490449 
+334665.928725  7390135.556155 
+334669.037554  7390158.292261 
+334676.038604  7390198.245417 
+334685.092965  7390236.778817 
+334694.196804  7390280.181382 
+334700.727819  7390307.506702 
+334715.199954  7390372.165626 
+334729.729812  7390426.156378 
+334751.541092  7390497.804105 
+334775.413930  7390544.526102 
+334821.106294  7390644.199029 
+334851.122573  7390700.939310 
+334864.836055  7390724.575262 
+334875.209813  7390746.171562 
+334883.959064  7390766.178135 
+334886.358717  7390771.667195 
+334892.749546  7390783.805116 
+334904.450947  7390805.421413 
+334927.861996  7390847.114272 
+334941.361075  7390872.179978 
+334954.208703  7390891.596652 
+334971.979330  7390909.193638 
+334980.984214  7390915.602540 
+334987.828585  7390924.650990 
+334994.046243  7390932.429658 
+335005.228132  7390941.618084 
+335015.486443  7390948.506904 
+335024.977854  7390952.946144 
+335037.536863  7390956.615515 
+335079.493685  7390965.963914 
+335100.315417  7390970.403153 
+335122.209160  7390974.532446 
+335146.865389  7390981.121317 
+335159.267720  7390984.790689 
+335169.963081  7390988.909983 
+335175.042759  7390990.459718 
+335190.199331  7390998.418355 
+335201.686331  7391006.686938 
+335214.698883  7391018.934840 
+335225.113872  7391029.802979 
+335234.300173  7391042.670775 
+335251.295654  7391067.466527 
+335295.891269  7391144.893265 
+335221.567993  7391197.974173 
+335162.541474  7391247.205740 
+335076.450826  7391312.944479 
+335060.840711  7391329.821588 
+334992.396997  7391379.663051 
+334894.209128  7391456.909819 
+334822.499907  7391510.330669 
+334778.341342  7391546.504472 
+334698.187980  7391544.164873 
+334563.617742  7391541.795279 
+334499.981580  7391540.285538 
+334443.264006  7391537.536009 
+334386.538185  7391537.016098 
+334304.100617  7391534.196581 
+334217.572919  7391529.127449 
+334144.321652  7391529.517382 
+334080.363887  7391531.637019 
+334025.790333  7391529.297420 
+333890.156331  7391524.158300 
+333859.810202  7391489.414252 
+333826.083119  7391473.466983 
+333781.553474  7391471.317351 
+333714.173523  7391474.746764 
+333632.337930  7391481.265647 
+333580.106305  7391482.015519 
+333513.386053  7391491.213943 
+333436.481706  7391488.064483 
+333418.191566  7391488.814354 
+333398.606768  7391516.789562 
+333384.497468  7391539.305706 
+333378.246825  7391690.329836 
+333321.578728  7391799.701102 
+333313.299512  7391811.189134 
+333309.011473  7391814.528562 
+333302.678367  7391817.877989 
+333295.833996  7391819.717674 
+333289.220519  7391820.027620 
+333283.876961  7391819.817656 
+333277.263485  7391819.377732 
+333269.619229  7391818.427894 
+333264.786938  7391818.467888 
+333259.707259  7391819.777663 
+333253.638034  7391822.627175 
+333250.108647  7391826.466518 
+333239.347316  7391844.073502 
+333289.797755  7391879.407449 
+333133.292544  7391870.638951 
+333028.037656  7391902.023575 
+332932.142239  7391927.989128 
+332872.571469  7391951.855040 
+332727.652212  7391998.537043 
+332626.710103  7392026.792204 
+332559.536308  7392053.557619 
+332541.609002  7392058.756728 
+332497.986442  7392078.373368 
+332461.076314  7392090.601274 
+332337.028266  7392179.646021 
+332219.989515  7392274.429785 
+332079.572699  7392394.139280 
+332000.029558  7392457.088498 
+331984.056610  7392468.866480 
+331896.687796  7392539.074454 
+331727.186525  7392674.131320 
+331708.401611  7392647.115948 
+331642.151394  7392566.939681 
+331552.696284  7392470.546192 
+331512.965945  7392428.223442 
+331477.012380  7392393.809337 
+331393.346123  7392309.223826 
+331314.891485  7392231.127203 
+331268.399237  7392184.845130 
+331356.386518  7392080.083075 
+331372.780024  7392078.383366 
+331457.023516  7392028.971830 
+331476.921671  7392021.553101 
+331503.029237  7392006.015762 
+331513.609151  7392000.046785 
+331547.410451  7391976.780770 
+331571.753323  7391955.614396 
+331580.213956  7391937.117564 
+331567.753902  7391862.920273 
+331566.418012  7391788.333049 
+331562.459821  7391723.314187 
+331560.373525  7391612.173224 
+331552.712777  7391549.134022 
+331529.359452  7391440.092700 
+331530.579894  7391396.140229 
+331532.938316  7391370.984537 
+331538.380828  7391348.338417 
+331546.602320  7391322.142904 
+331564.241007  7391298.396971 
+331618.971240  7391230.768555 
+331663.690549  7391190.525448 
+331671.474991  7391181.546986 
+331706.711134  7391153.281828 
+331723.253073  7391033.212395 
+331796.190983  7390927.970422 
+331796.182737  7390927.970422 
+331839.458955  7390873.599735 
+331877.581279  7390814.959779 
+331878.562581  7390809.360739 
+331879.543882  7390803.001828 
+331883.601028  7390765.178307 
+331883.601028  7390765.138313 
+331888.837384  7390642.429332 
+331872.179998  7390625.002317 
+331824.459062  7390497.804105 
+331824.607494  7390483.056631 
+331847.127950  7390357.198190 
+331728.703831  7390216.982208 
+331712.623682  7390192.006486 
+Region 1
+241
+347127.871620  7396265.856090 
+347122.561047  7396275.024520 
+347113.448962  7396289.142102 
+347102.811325  7396304.029552 
+347082.690522  7396333.044581 
+347075.087497  7396342.972881 
+347035.456113  7396393.084297 
+347007.460160  7396427.338430 
+346934.175908  7396511.733974 
+346913.123281  7396540.808993 
+346870.003741  7396595.929552 
+346849.998386  7396653.999605 
+346767.000074  7396758.541698 
+346753.583457  7396787.756693 
+346743.242684  7396808.623119 
+346729.083906  7396834.408702 
+346713.003756  7396857.004832 
+346682.146361  7396882.460472 
+346606.000667  7396934.001643 
+346663.650065  7397002.509908 
+346583.043161  7397058.800266 
+346487.411624  7397125.588826 
+346441.018330  7397158.073262 
+346369.696682  7397206.344993 
+346323.369358  7397234.600153 
+346297.352500  7397248.917701 
+346272.976642  7397262.855313 
+346245.566172  7397276.782928 
+346217.042460  7397288.410936 
+346173.287960  7397304.518177 
+346145.143575  7397312.726771 
+346113.972823  7397317.875889 
+346090.619498  7397324.224801 
+346064.569655  7397326.884346 
+346034.149310  7397329.993813 
+346008.701443  7397329.653871 
+345985.158454  7397329.333926 
+345965.788058  7397327.324270 
+345941.873989  7397324.144815 
+345903.916590  7397316.696091 
+345889.873259  7397315.856235 
+345752.128222  7397293.090134 
+345663.629675  7397279.592446 
+345579.773755  7397272.023743 
+345466.074727  7397268.564335 
+345370.385467  7397240.309175 
+345309.091234  7397184.348761 
+345281.631286  7397156.473536 
+345130.815974  7397068.498605 
+345013.999871  7397017.267380 
+344861.749714  7396923.823386 
+344839.377691  7396909.745798 
+344760.865329  7396880.800756 
+344574.838611  7396839.177885 
+344332.424169  7396819.001341 
+344237.699718  7396816.201821 
+344099.501138  7396799.834625 
+344081.079059  7396798.284890 
+344064.190779  7396796.955118 
+344042.552669  7396793.795659 
+344009.518269  7396790.946147 
+343977.555879  7396790.336252 
+343879.203087  7396797.055101 
+343791.397223  7396820.211134 
+343715.721564  7396839.557820 
+343674.910969  7396845.776755 
+343602.377124  7396858.284613 
+343575.296502  7396859.494405 
+343550.895906  7396861.134125 
+343524.986249  7396859.324435 
+343504.040823  7396857.194799 
+343477.413745  7396851.565764 
+343369.849912  7396814.232158 
+343335.207497  7396803.933922 
+343279.974244  7396792.585866 
+343205.758168  7396771.759434 
+343095.093753  7396735.055721 
+342987.562905  7396704.640930 
+342948.500511  7396691.743140 
+342822.902172  7396659.348689 
+342649.475695  7396620.115409 
+342571.590047  7396602.818372 
+342332.168986  7396537.609541 
+342174.129976  7396493.967017 
+342122.162230  7396481.249195 
+341969.887335  7396445.495320 
+341980.417772  7396412.301006 
+341984.499656  7396398.213419 
+342000.010816  7396350.091661 
+342015.653915  7396258.917279 
+342048.292496  7396186.579670 
+342073.690886  7396157.934576 
+342102.750603  7396104.963650 
+342191.628477  7396049.993066 
+342234.879957  7396029.906506 
+342384.639752  7395945.910894 
+342423.364051  7395920.065321 
+342544.995953  7395870.413826 
+342584.396443  7395854.086623 
+342647.117273  7395830.040741 
+342723.617555  7395798.906075 
+342827.783940  7395759.482827 
+342828.064312  7395758.792946 
+342882.736821  7395734.797056 
+343006.339573  7395722.839104 
+343090.541834  7395728.968054 
+343259.927657  7395711.531041 
+343297.093419  7395688.724948 
+343318.179031  7395674.867321 
+343350.240375  7395644.822468 
+343405.696277  7395597.970493 
+343445.360646  7395570.445208 
+343492.207482  7395542.170051 
+343552.363735  7395509.005732 
+343636.450549  7395469.902430 
+343738.406944  7395422.220597 
+343807.328940  7395384.187112 
+343846.012008  7395366.440152 
+343874.304826  7395346.583553 
+343898.210648  7395326.357018 
+343918.537607  7395306.080491 
+343936.316480  7395286.113911 
+343964.601051  7395247.540519 
+343997.709667  7395210.626841 
+344050.535021  7395155.316316 
+344090.867335  7395118.082693 
+344147.873527  7395066.001614 
+344168.159255  7395047.824728 
+344203.749986  7395025.048629 
+344250.209250  7394992.104272 
+344282.097423  7394964.748958 
+344301.418342  7394942.802717 
+344319.494079  7394923.616004 
+344341.165174  7394892.611315 
+344358.284348  7394866.545779 
+344373.366704  7394840.910171 
+344384.985643  7394823.093222 
+344404.133391  7394799.657237 
+344422.332822  7394771.961981 
+344451.598694  7394744.276723 
+344520.751585  7394701.714014 
+344622.270930  7394640.994414 
+344735.615370  7394572.756103 
+344775.766267  7394550.809862 
+344813.905084  7394528.313716 
+344885.894678  7394485.601032 
+344940.163122  7394452.206752 
+344961.125040  7394440.808704 
+344974.211808  7394429.100710 
+344990.374420  7394416.422881 
+345002.661304  7394403.925022 
+345015.789303  7394388.557654 
+345035.382347  7394369.720881 
+345088.512811  7394289.214671 
+345149.056636  7394192.841179 
+345175.988826  7394226.315445 
+345249.974007  7394251.931057 
+345311.812491  7394276.566838 
+345355.731915  7394296.593407 
+345376.817527  7394306.041789 
+345423.383991  7394329.647745 
+345475.722817  7394361.672260 
+345500.717142  7394389.017576 
+345517.118895  7394416.352893 
+345543.663511  7394488.240580 
+345568.666083  7394536.652287 
+345585.076082  7394559.308406 
+345604.397000  7394584.384111 
+345734.192671  7394719.580953 
+345743.189308  7394728.849366 
+345755.286529  7394735.108294 
+345779.596417  7394747.176226 
+345838.952785  7394765.913017 
+345899.875937  7394769.042481 
+345972.533475  7394769.042481 
+346033.456627  7394772.161947 
+346058.467445  7394776.921131 
+346083.338076  7394794.798069 
+346097.628794  7394806.816011 
+346115.176773  7394818.963930 
+346126.630787  7394827.792418 
+346174.071352  7394867.085687 
+346235.522263  7394903.979367 
+346285.783039  7394920.986454 
+346341.610020  7394930.954747 
+346387.327123  7394929.964916 
+346430.289984  7394925.275720 
+346565.899247  7394898.500306 
+346617.850500  7394882.603029 
+346686.409662  7394868.085516 
+346699.438706  7394919.356733 
+346704.221520  7394932.394500 
+346713.242897  7394970.258014 
+346724.771127  7395020.579395 
+346738.641287  7395065.541693 
+346741.857317  7395074.060234 
+346746.598900  7395097.636196 
+346756.453145  7395130.210616 
+346763.338748  7395156.226160 
+346770.941772  7395186.081046 
+346784.152234  7395234.612733 
+346850.303496  7395310.679703 
+346862.268777  7395324.447345 
+346881.787605  7395351.112778 
+346907.367412  7395406.183344 
+346914.599357  7395423.100447 
+346934.175908  7395449.815871 
+346950.767324  7395474.181697 
+346964.530283  7395488.949167 
+346981.987553  7395508.755775 
+346996.146331  7395522.783372 
+347014.890014  7395536.141084 
+347045.697931  7395555.087838 
+347084.884019  7395573.624663 
+347101.129094  7395580.663458 
+347124.927715  7395589.561933 
+347162.093477  7395597.210623 
+347177.184079  7395604.819320 
+347205.922193  7395630.164978 
+347213.269584  7395625.355802 
+347231.411292  7395615.077563 
+347254.038949  7395608.698655 
+347290.066730  7395599.180286 
+347318.062683  7395591.771555 
+347326.259437  7395590.031853 
+347416.737079  7395575.204393 
+347449.680771  7395572.064930 
+347569.737643  7395549.508794 
+347523.360842  7395610.978265 
+347457.910509  7395688.844927 
+347404.367733  7395763.672110 
+347334.076863  7395844.648239 
+347280.517595  7395911.086859 
+347310.641076  7395928.273915 
+347269.236752  7396004.040937 
+347234.421166  7396063.240796 
+347202.697917  7396121.100886 
+347183.987219  7396159.784259 
+347170.743773  7396193.348510 
+347157.467342  7396220.433871 
+347127.871620  7396265.856090 
+Region 1
+295
+340685.973962  7401513.817162 
+340707.298714  7401477.173439 
+340730.429391  7401434.220796 
+340739.145657  7401412.884451 
+340743.351235  7401399.066818 
+340746.352863  7401382.849596 
+340746.055998  7401364.522735 
+340743.351235  7401342.896439 
+340735.838919  7401319.770401 
+340723.222186  7401296.334415 
+340711.809403  7401276.807760 
+340706.704986  7401265.099765 
+340704.602197  7401256.381258 
+340703.695112  7401247.972699 
+340704.602197  7401238.964242 
+340707.298714  7401230.855631 
+340717.218930  7401211.628924 
+340721.119397  7401203.220364 
+340724.228226  7401190.922471 
+340725.630085  7401185.493401 
+340732.235316  7401132.322509 
+340730.734502  7401098.078374 
+340729.530552  7401061.434651 
+340724.121025  7401013.072935 
+340714.514166  7400970.110294 
+340700.396619  7400930.467085 
+340684.176284  7400901.322077 
+340664.047235  7400881.795422 
+340633.107377  7400859.869177 
+340614.784253  7400847.551287 
+340599.462756  7400832.833808 
+340587.142888  7400814.216997 
+340578.434868  7400793.790496 
+340575.433240  7400777.263327 
+340574.526155  7400763.745643 
+340575.433240  7400742.719244 
+340576.934054  7400667.922056 
+340575.433240  7400640.286790 
+340573.025341  7400591.325177 
+340572.423366  7400555.271352 
+340568.217788  7400527.636086 
+340561.612558  7400483.483649 
+340551.997453  7400444.130390 
+340545.689086  7400417.694918 
+340535.777117  7400391.859343 
+340522.261545  7400365.433870 
+340510.543651  7400345.307317 
+340499.130868  7400333.889273 
+340447.278570  7400269.590287 
+340233.973322  7400103.468742 
+340131.101594  7400024.922196 
+340053.933368  7399963.952640 
+339973.656312  7399907.072383 
+339966.242951  7399899.663652 
+339947.952812  7399866.169389 
+339900.165905  7399823.966618 
+339882.659157  7399807.249482 
+339836.579220  7399829.265710 
+339793.970947  7399849.642220 
+339751.370919  7399881.136825 
+339718.946740  7399907.992225 
+339697.960083  7399933.077928 
+339672.099904  7399958.183628 
+339641.341464  7399987.518603 
+339604.060255  7400067.194955 
+339615.283375  7400110.037617 
+339507.571110  7400212.490068 
+339423.443065  7400304.864245 
+339275.654119  7400465.586714 
+339213.947575  7400525.076524 
+339071.700097  7400670.651589 
+339012.582869  7400722.742666 
+338984.619901  7400747.098494 
+338974.147188  7400753.987314 
+338951.197928  7400765.485345 
+338922.121719  7400770.444495 
+338892.501259  7400775.503628 
+338766.523593  7400795.240248 
+338729.819620  7400803.018915 
+338658.250585  7400808.088047 
+338629.058928  7400804.838604 
+338601.277377  7400809.587790 
+338560.689430  7400814.047026 
+338380.806155  7400829.324409 
+338318.002862  7400819.716055 
+338252.973087  7400809.017888 
+338198.061437  7400790.511058 
+338081.913278  7400670.821560 
+338037.936130  7400625.009407 
+338025.146227  7400605.682717 
+337974.019597  7400554.811431 
+337903.077274  7400482.393836 
+337834.716022  7400379.311493 
+337790.376040  7400367.853455 
+337671.786997  7400344.207506 
+337573.500174  7400280.288454 
+337503.671093  7400238.175668 
+337441.948057  7400193.393339 
+337340.832776  7400233.286505 
+337250.000546  7400310.003364 
+337221.551050  7400314.952517 
+337173.648696  7400351.536250 
+337141.711045  7400383.940700 
+337104.446329  7400418.634757 
+337089.240279  7400428.922995 
+337058.828181  7400437.671496 
+337034.881127  7400436.881631 
+336966.132302  7400431.462560 
+336961.431951  7400532.855192 
+336956.723353  7400588.905591 
+336871.581022  7400643.666211 
+336827.513165  7400669.761741 
+336838.637330  7400751.907670 
+336851.047907  7400819.936018 
+336865.173700  7400930.737038 
+336880.569413  7401039.408424 
+336794.140670  7401093.309191 
+336731.683719  7401133.962228 
+336756.884199  7401134.612116 
+336764.652149  7401143.780546 
+336782.051695  7401154.298744 
+336797.364946  7401170.096038 
+336802.733242  7401189.822659 
+336816.957990  7401211.668917 
+336838.225019  7401216.678059 
+336859.970329  7401224.466725 
+336883.678242  7401238.324351 
+336905.052472  7401256.961159 
+336945.104414  7401285.116336 
+336977.668779  7401301.343557 
+337017.382626  7401314.611284 
+337034.518293  7401323.849702 
+337053.171267  7401337.677333 
+337078.297531  7401361.143314 
+337100.941681  7401379.280207 
+337133.943096  7401402.826174 
+337146.477366  7401416.833774 
+337158.178768  7401437.640210 
+337167.043466  7401462.455960 
+337182.200038  7401492.130877 
+337202.856845  7401529.424489 
+337227.991356  7401575.346623 
+337250.586028  7401620.738847 
+337270.055379  7401674.179693 
+337279.695222  7401700.025268 
+337286.605564  7401715.472620 
+337292.031584  7401729.910147 
+337300.871543  7401757.245465 
+337306.008944  7401774.712473 
+337313.323351  7401801.777837 
+337322.385959  7401831.392764 
+337335.612912  7401852.469154 
+337350.019077  7401880.874288 
+337358.883775  7401892.032377 
+337366.552770  7401901.220803 
+337397.954416  7401954.021759 
+337428.135620  7402002.513453 
+337442.385107  7402022.340057 
+337452.313569  7402042.376625 
+337459.759915  7402057.594018 
+337477.390356  7402093.597851 
+337485.092335  7402106.805589 
+337502.599083  7402132.201238 
+337518.407107  7402149.008360 
+337548.134769  7402170.004763 
+337570.045004  7402185.612090 
+337590.635841  7402205.748640 
+337600.110760  7402221.335970 
+337615.811584  7402248.141379 
+337644.096155  7402261.299125 
+337708.309553  7402276.966441 
+337738.276355  7402284.445160 
+337775.301931  7402310.550689 
+337823.154807  7402345.094772 
+337867.255649  7402373.799855 
+337976.122386  7402452.076447 
+338108.218754  7402548.929857 
+338115.813533  7402554.678872 
+338139.537938  7402567.276714 
+338184.389187  7402597.251580 
+338204.749130  7402615.368476 
+338219.633577  7402624.346938 
+338236.332194  7402629.316087 
+338249.254037  7402631.455721 
+338265.919669  7402639.444352 
+338275.716191  7402648.882736 
+338291.301567  7402662.410418 
+338304.421320  7402672.208740 
+338310.688455  7402677.237879 
+338338.189635  7402692.405281 
+338350.996031  7402705.143099 
+338356.141679  7402722.100194 
+338358.706256  7402742.816646 
+338363.365377  7402757.254173 
+338371.644592  7402766.412604 
+338377.936466  7402771.271771 
+338389.852270  7402785.999249 
+338393.967139  7402790.868415 
+338411.333700  7402804.156139 
+338431.165885  7402824.292689 
+338450.684713  7402849.968291 
+338460.159632  7402865.575618 
+338469.642797  7402880.443071 
+338483.570681  7402906.058684 
+338494.266042  7402926.355207 
+338509.043287  7402944.422112 
+338528.141557  7402961.519184 
+338553.358531  7402976.906548 
+338572.531017  7402987.954656 
+338605.639633  7403024.108463 
+338613.424075  7403032.267065 
+338631.153471  7403058.432583 
+338653.632695  7403072.300208 
+338694.649447  7403101.205257 
+338714.357938  7403109.733796 
+338725.407887  7403120.441962 
+338739.014168  7403130.160297 
+338766.086543  7403137.998954 
+338807.697023  7403139.938622 
+338834.051976  7403144.237886 
+338845.934794  7403148.137218 
+338869.312858  7403146.607480 
+338888.732731  7403145.747627 
+338895.725535  7403145.107737 
+338912.869448  7403155.625935 
+338931.547161  7403165.394262 
+338949.177602  7403177.942113 
+338959.543114  7403182.081403 
+338977.025123  7403185.530813 
+338993.550569  7403182.921260 
+339004.493317  7403180.261715 
+339011.576829  7403182.851272 
+339022.618532  7403194.569264 
+339035.210526  7403203.027816 
+339054.638646  7403213.815968 
+339072.994755  7403217.515334 
+339097.197442  7403222.314512 
+339116.040079  7403216.955430 
+339137.645203  7403214.395868 
+339165.336046  7403212.656166 
+339189.967537  7403211.886298 
+339211.770571  7403214.375872 
+339235.346544  7403216.885442 
+339257.166070  7403218.365188 
+339269.543662  7403223.534303 
+339294.537988  7403236.152142 
+339304.466449  7403250.679653 
+339309.768776  7403259.268182 
+339317.775866  7403269.696396 
+339329.394805  7403275.105469 
+339347.891100  7403278.574875 
+339379.103083  7403279.384736 
+339430.592547  7403282.934128 
+339454.193259  7403283.923959 
+339467.288273  7403293.142380 
+339475.295363  7403304.070508 
+339484.044614  7403316.518376 
+339490.534398  7403326.176721 
+339501.501884  7403339.634416 
+339528.730938  7403287.493347 
+339551.086469  7403241.141287 
+339571.809247  7403207.327079 
+339575.066508  7403198.608573 
+339592.837135  7403166.014156 
+339603.722159  7403142.748141 
+339622.523565  7403109.943760 
+339638.653192  7403075.629638 
+339671.596884  7403017.569583 
+339677.336260  7403003.162051 
+339698.034299  7402967.818105 
+339750.249432  7402870.034854 
+339814.504061  7402751.015241 
+339872.318384  7402636.234902 
+339914.093789  7402563.397378 
+339928.269059  7402528.333385 
+339935.212385  7402517.325270 
+340029.079229  7402346.694498 
+340067.284015  7402276.226568 
+340085.458708  7402242.172401 
+340110.123183  7402193.430750 
+340137.756302  7402141.949569 
+340168.943547  7402079.690233 
+340196.947746  7402027.809120 
+340230.707814  7401962.430319 
+340262.076476  7401908.179611 
+340316.600553  7401865.966842 
+340416.808747  7401793.609236 
+340488.089165  7401747.507133 
+340583.539285  7401682.738227 
+340602.769495  7401679.038861 
+340605.474258  7401656.202773 
+340611.180650  7401637.276015 
+340622.890298  7401612.350284 
+340639.110633  7401588.914299 
+340685.973962  7401513.817162 
+Region 1
+372
+320402.027756  7389574.232305 
+320376.390225  7389522.751123 
+320358.149563  7389505.934004 
+320367.327618  7389498.405293 
+320378.451783  7389490.126711 
+320386.162009  7389477.258916 
+320391.555044  7389462.151503 
+320408.979329  7389439.995298 
+320420.087002  7389416.319354 
+320434.377719  7389399.432247 
+320449.723955  7389380.575476 
+320467.024546  7389359.409102 
+320484.226184  7389339.012596 
+320501.856625  7389316.306485 
+320506.713655  7389307.907924 
+320510.300765  7389301.678991 
+320515.792754  7389278.482964 
+320519.214940  7389257.266598 
+320518.349086  7389236.760111 
+320515.891709  7389220.562885 
+320510.886247  7389204.105704 
+320506.697162  7389188.108444 
+320508.181484  7389167.082046 
+320512.246875  7389151.954637 
+320518.959307  7389137.087184 
+320526.949905  7389126.768951 
+320544.778255  7389112.921323 
+320563.076641  7389094.094548 
+320576.476766  7389074.657877 
+320590.536589  7389052.231719 
+320606.138457  7389036.694380 
+320622.424763  7389023.826584 
+320641.968330  7389011.888629 
+320663.606439  7389003.620046 
+320693.276377  7388997.781046 
+320716.357576  7388996.631243 
+320734.095218  7388998.290958 
+320757.201157  7388995.361460 
+320776.456105  7388989.942388 
+320791.249843  7388982.263704 
+320809.515244  7388974.515031 
+320830.708057  7388961.257302 
+320847.802493  7388948.619467 
+320868.129451  7388930.812517 
+320885.743400  7388918.074699 
+320907.703112  7388900.177764 
+320923.502890  7388885.200330 
+320943.508246  7388876.911750 
+320961.839616  7388871.712640 
+320984.698168  7388864.243919 
+321008.307126  7388853.005844 
+321026.168462  7388844.807249 
+321043.444315  7388834.279052 
+321063.598103  7388822.781022 
+321091.569317  7388805.294017 
+321123.614169  7388789.296757 
+321136.898847  7388779.708400 
+321149.927891  7388773.959384 
+321168.407694  7388765.810780 
+321189.212934  7388758.312065 
+321236.166971  7388750.023484 
+321253.211930  7388750.123467 
+321274.775823  7388748.283782 
+321294.327636  7388743.534596 
+321310.820097  7388738.645433 
+321323.016272  7388726.277552 
+321336.366920  7388710.940179 
+321345.528482  7388696.312685 
+321357.559733  7388681.175277 
+321365.253466  7388669.417291 
+321373.532681  7388643.601713 
+321381.729435  7388623.985074 
+321389.579846  7388599.939192 
+321397.496228  7388578.212914 
+321405.635257  7388547.418189 
+321408.274051  7388531.720878 
+321416.190433  7388510.554503 
+321431.520175  7388491.907697 
+321456.407299  7388485.008879 
+321471.440178  7388482.759264 
+321483.941464  7388478.589978 
+321500.780267  7388479.019905 
+321513.735095  7388479.619802 
+321528.438124  7388479.469828 
+321538.935576  7388480.819597 
+321558.223509  7388481.049557 
+321558.264740  7388477.290201 
+321556.829896  7388469.511534 
+321552.335701  7388461.592890 
+321545.095510  7388452.314479 
+321537.187375  7388448.235178 
+321523.177029  7388442.416175 
+321508.053442  7388435.467365 
+321499.634040  7388430.718178 
+321495.197568  7388426.228947 
+321489.878750  7388419.190153 
+321479.958534  7388403.782792 
+321469.757947  7388386.825697 
+321462.855852  7388358.940473 
+321461.684887  7388345.632753 
+321459.780008  7388334.864597 
+321456.382561  7388320.427070 
+321454.469435  7388310.208821 
+321452.490340  7388305.089697 
+321447.253983  7388299.270694 
+321440.566290  7388295.201391 
+321428.485562  7388289.402385 
+321416.009015  7388283.603378 
+321405.552795  7388278.594236 
+321393.562776  7388274.135000 
+321377.903184  7388269.735753 
+321361.212813  7388265.426491 
+321351.135919  7388263.306854 
+321342.065065  7388262.427005 
+321327.559946  7388263.026902 
+321310.127414  7388261.587149 
+321300.891636  7388257.047927 
+321293.338088  7388248.649365 
+321282.527280  7388231.462309 
+321274.314034  7388218.624508 
+321269.349803  7388207.596397 
+321266.488361  7388199.477788 
+321262.958975  7388187.909769 
+321259.833653  7388176.461730 
+321259.042015  7388165.493609 
+321260.740739  7388143.917305 
+321262.084874  7388134.178973 
+321265.902879  7388122.041052 
+321269.531220  7388109.573188 
+321272.557587  7388103.744186 
+321281.735642  7388096.095496 
+321292.422757  7388081.827940 
+321297.551912  7388071.589694 
+321298.599184  7388060.861532 
+321296.100576  7388048.093719 
+321293.783385  7388037.875469 
+321292.208355  7388024.347786 
+321289.544822  7388000.391889 
+321284.877456  7387981.505125 
+321279.006140  7387960.938647 
+321272.054567  7387945.231338 
+321255.702292  7387913.246817 
+321246.103679  7387897.069588 
+321240.487996  7387889.140946 
+321236.389620  7387882.222131 
+321230.914122  7387870.414153 
+321227.549660  7387861.845621 
+321252.956297  7387801.076030 
+321345.033708  7387624.826220 
+321356.891788  7387580.823758 
+321356.908280  7387580.823758 
+321356.900034  7387580.793763 
+321356.908280  7387580.773766 
+321356.900034  7387580.773766 
+321346.419075  7387518.064508 
+321378.373219  7387312.749676 
+321405.429102  7387203.348416 
+321404.431308  7387191.660418 
+321409.791358  7387175.963107 
+321457.932852  7387072.140890 
+321543.207123  7387086.988347 
+321598.580562  7387098.356400 
+321678.387582  7387137.839637 
+321801.907871  7387225.344648 
+321809.527388  7387230.933691 
+321813.848413  7387232.973341 
+321820.973156  7387238.822339 
+321828.337040  7387244.411382 
+321834.942271  7387249.240555 
+321840.533215  7387255.339510 
+321844.845994  7387261.178510 
+321846.371547  7387266.757554 
+321847.888853  7387276.135948 
+321849.397913  7387286.794122 
+321850.659587  7387298.962038 
+321852.176893  7387310.110128 
+321854.972365  7387317.978781 
+321857.512204  7387321.528173 
+321865.131721  7387325.857431 
+321872.000832  7387328.666950 
+321880.642881  7387329.946731 
+321931.761265  7387326.027402 
+321962.033178  7387323.567823 
+322195.508706  7387309.190286 
+322250.956361  7387306.540740 
+322251.236733  7387283.734646 
+322246.429180  7387262.428296 
+322277.690641  7387284.304549 
+322301.827358  7387303.371283 
+322315.812965  7387312.019801 
+322323.943748  7387317.358887 
+322338.432376  7387323.737794 
+322363.096852  7387324.557654 
+322403.033347  7387325.667464 
+322415.229522  7387327.217198 
+322434.583425  7387305.980836 
+322503.043632  7387263.818058 
+322653.669281  7387188.161017 
+322776.323715  7387130.930820 
+322818.808296  7387109.494492 
+322837.131420  7387105.215225 
+322855.190665  7387102.725652 
+322871.971745  7387103.535513 
+322894.863281  7387105.615157 
+322907.570722  7387108.194715 
+322921.036817  7387113.543798 
+322931.979565  7387118.133012 
+322943.161454  7387124.241966 
+322954.598976  7387130.860832 
+322960.948573  7387136.449875 
+323054.683477  7387247.190906 
+323115.639614  7387322.617986 
+323132.907221  7387346.743853 
+323159.352883  7387357.951934 
+323178.673801  7387362.561144 
+323198.250353  7387366.920397 
+323221.339799  7387369.259997 
+323237.667335  7387370.309817 
+323251.397309  7387370.599767 
+323272.507660  7387370.139846 
+323314.992240  7387360.871434 
+323374.257900  7387350.123275 
+323380.343618  7387373.199322 
+323382.520623  7387378.798363 
+323382.883457  7387380.048149 
+323387.946643  7387392.725977 
+323393.793220  7387405.933715 
+323401.660124  7387422.420891 
+323421.970590  7387457.964802 
+323429.590107  7387467.353194 
+323437.209624  7387476.241672 
+323455.747151  7387495.798322 
+323495.898048  7387530.882312 
+323620.416131  7387628.505590 
+323660.064008  7387657.000709 
+323676.828595  7387671.488228 
+323701.732211  7387697.403789 
+323727.130602  7387729.138353 
+323789.076286  7387832.960569 
+323851.747639  7387938.522487 
+323889.441159  7388000.001956 
+323911.887399  7388042.034756 
+323924.570102  7388067.140456 
+323946.406121  7388106.273753 
+323967.640165  7388153.025745 
+323975.070018  7388183.310557 
+323979.580707  7388206.286622 
+323984.577922  7388256.897952 
+323989.204058  7388297.161056 
+323999.957142  7388360.750163 
+324000.781766  7388368.738795 
+324002.620675  7388431.478048 
+324007.741584  7388477.370187 
+324009.481539  7388510.394531 
+324009.110458  7388541.409218 
+324004.137981  7388572.803840 
+324002.299072  7388589.840922 
+323999.998374  7388600.319127 
+323992.906615  7388612.277079 
+323989.979203  7388620.055747 
+323987.126008  7388654.889780 
+323986.763173  7388677.915836 
+323988.808239  7388705.261152 
+324010.891644  7388749.303608 
+324026.081201  7388763.101244 
+324034.360417  7388773.669434 
+324099.217021  7388830.589684 
+324228.369485  7388940.110924 
+324317.453515  7389019.857264 
+324419.129539  7389110.401755 
+324497.691378  7389175.600587 
+324544.043441  7389206.235339 
+324506.333428  7389206.895226 
+324496.660599  7389224.092281 
+324498.103690  7389238.299847 
+324502.630870  7389253.997158 
+324522.792904  7389258.336415 
+324489.370931  7389478.298737 
+324470.833405  7389604.827064 
+324468.268827  7389624.423708 
+324458.191933  7389653.008811 
+324440.907834  7389675.584944 
+324430.377397  7389688.912661 
+324419.343941  7389702.010418 
+324405.778891  7389717.417778 
+324388.478299  7389754.021509 
+324383.489330  7389767.489202 
+324366.510341  7389831.678207 
+324359.723693  7389871.741344 
+324326.977911  7389999.999375 
+324327.299514  7390003.518772 
+324321.518907  7390025.105074 
+324313.487078  7390058.119419 
+324307.203450  7390079.445766 
+324291.791245  7390110.190500 
+324257.124091  7390165.591010 
+324170.340760  7390305.107113 
+324062.075998  7390490.355381 
+324000.600348  7390773.936806 
+323991.463525  7390811.100441 
+323962.675934  7390954.815823 
+323902.519681  7390902.244828 
+323730.767189  7390749.990908 
+323671.996303  7390695.700208 
+323611.370016  7390644.968897 
+323541.103884  7390603.466006 
+323508.366349  7390590.078300 
+323452.580598  7390565.532504 
+323398.287416  7390543.216327 
+323356.017237  7390510.101999 
+323314.390265  7390462.990069 
+323285.462488  7390416.727993 
+323273.348775  7390363.457118 
+323259.107535  7390325.693586 
+323243.332496  7390290.459622 
+323220.878010  7390263.594223 
+323201.458136  7390240.298214 
+323185.757313  7390232.039628 
+323123.960061  7390196.745674 
+323090.249470  7390181.758241 
+323059.070472  7390168.820457 
+322995.706436  7390139.865417 
+322925.267133  7390105.031384 
+322856.872896  7390260.554744 
+322798.572046  7390389.432668 
+322755.221611  7390487.355895 
+322739.999069  7390519.570377 
+322711.079539  7390588.078642 
+322690.678364  7390635.530514 
+322670.310174  7390679.932908 
+322641.646277  7390670.614504 
+322530.198469  7390646.888569 
+322444.652073  7390633.340889 
+322363.896736  7390635.120584 
+322317.660121  7390639.379855 
+322264.521410  7390640.439673 
+322148.266051  7390644.878913 
+322026.708365  7390650.198002 
+321933.525958  7390643.989065 
+321842.132984  7390623.582561 
+321789.340616  7390583.729387 
+321619.608450  7390494.244715 
+321555.386806  7390480.057145 
+321373.722345  7390466.579454 
+321220.573349  7390471.788562 
+321087.479187  7390466.119533 
+320954.822074  7390460.620475 
+320891.309606  7390458.760793 
+320876.697285  7390395.441639 
+320866.422482  7390373.225445 
+320858.143266  7390356.628287 
+320820.251836  7390282.311017 
+320813.028138  7390259.114991 
+320848.330252  7390142.754922 
+320917.648066  7390122.468397 
+320970.052862  7390110.630425 
+321044.640018  7390024.795128 
+321074.120293  7390026.544828 
+321070.929002  7390008.537912 
+321069.106585  7389989.461180 
+321068.207745  7389969.464605 
+321061.841655  7389951.297717 
+321040.071607  7389930.811226 
+321023.843025  7389921.752778 
+321002.823383  7389913.524187 
+320895.968726  7389869.121793 
+320769.413824  7389817.840577 
+320625.327436  7389754.821372 
+320564.288837  7389725.306427 
+320531.073020  7389702.870270 
+320419.567489  7389627.903112 
+320402.027756  7389574.232305 
+Region 1
+1343
+336095.858105  7355254.410980 
+336145.822016  7355302.272781 
+336158.793337  7355316.480348 
+336178.658506  7355333.317464 
+336189.749687  7355343.195771 
+336198.927741  7355359.912908 
+336211.412535  7355381.429222 
+336223.031474  7355389.647815 
+336244.735553  7355396.656614 
+336262.234054  7355398.406314 
+336271.577033  7355400.505955 
+336283.888656  7355409.944338 
+336285.587379  7355422.262228 
+336281.175646  7355434.060207 
+336267.165300  7355439.109342 
+336249.592583  7355444.218467 
+336234.543212  7355451.357244 
+336212.220665  7355453.546869 
+336190.780466  7355458.396039 
+336168.730045  7355463.345191 
+336152.353031  7355470.693932 
+336140.585660  7355475.543102 
+336128.669856  7355484.711531 
+336110.239531  7355494.139916 
+336092.930693  7355502.688452 
+336076.825804  7355512.586756 
+336059.022192  7355520.355426 
+336026.358873  7355536.372682 
+336002.362341  7355551.170147 
+335980.922142  7355564.657837 
+335960.224103  7355576.045886 
+335944.449064  7355584.394456 
+335920.155668  7355598.632018 
+335904.743463  7355619.608424 
+335876.582585  7355642.654477 
+335858.655280  7355660.951343 
+335844.009974  7355676.618659 
+335828.919372  7355687.526791 
+335802.902515  7355700.854508 
+335781.569516  7355705.373734 
+335757.383321  7355710.072929 
+335730.154268  7355713.532336 
+335723.013032  7355723.750586 
+335720.374238  7355731.699224 
+335719.813495  7355763.363800 
+335718.757977  7355783.950274 
+335721.710128  7355793.288675 
+335725.618841  7355807.736200 
+335725.453916  7355822.023753 
+335722.930570  7355829.302506 
+335713.711284  7355833.961708 
+335703.791068  7355837.831045 
+335692.493732  7355845.789682 
+335683.843437  7355854.218238 
+335674.327286  7355867.405979 
+335650.883253  7355896.261036 
+335637.037831  7355913.718046 
+335623.901586  7355931.395018 
+335613.305180  7355950.101814 
+335603.318994  7355977.347147 
+335594.371834  7356011.691264 
+335591.922703  7356029.828158 
+335591.452668  7356044.325674 
+335591.213528  7356065.482050 
+335591.592854  7356076.780115 
+335590.322935  7356107.444863 
+335589.622005  7356124.501941 
+335589.861146  7356147.647976 
+335589.110739  7356169.014316 
+335587.115151  7356192.580280 
+335581.788086  7356212.676837 
+335573.657303  7356238.392432 
+335562.780524  7356263.188185 
+335563.448469  7356293.882927 
+335569.361016  7356310.999995 
+335574.820021  7356323.357879 
+335582.530247  7356335.515796 
+335590.842447  7356347.243787 
+335599.022708  7356362.401191 
+335598.387748  7356373.689257 
+335599.253603  7356386.767017 
+335599.946286  7356397.525174 
+335598.420733  7356414.892200 
+335593.283332  7356428.119934 
+335587.692387  7356444.897060 
+335579.710036  7356457.434912 
+335571.150448  7356475.941742 
+335559.869605  7356491.649052 
+335548.786671  7356508.026247 
+335535.279345  7356531.022308 
+335528.179341  7356555.528110 
+335523.965517  7356576.854457 
+335517.104653  7356597.930847 
+335511.530201  7356622.456646 
+335503.547850  7356652.271539 
+335493.586403  7356686.375697 
+335483.657941  7356717.390384 
+335475.048877  7356740.106493 
+335474.883952  7356754.723989 
+335479.683258  7356780.469579 
+335481.967464  7356803.095704 
+335479.163746  7356825.881801 
+335471.362811  7356840.189350 
+335468.971405  7356853.447079 
+335459.694395  7356871.953909 
+335454.070466  7356891.930487 
+335443.894617  7356917.956029 
+335437.429572  7356930.733841 
+335425.596231  7356950.420468 
+335415.148257  7356973.666487 
+335403.974615  7357007.210741 
+335397.534308  7357035.825839 
+335394.392495  7357043.104592 
+335386.608053  7357065.270796 
+335380.481103  7357084.367525 
+335374.766466  7357103.124312 
+335369.224999  7357124.880585 
+335363.881441  7357146.976800 
+335358.851240  7357167.733245 
+335350.481316  7357187.579845 
+335346.069583  7357225.963270 
+335342.672136  7357256.268080 
+335341.806282  7357269.105881 
+335343.092694  7357290.502216 
+335344.981081  7357303.589974 
+335350.275161  7357330.565353 
+335352.600598  7357349.422123 
+335355.437301  7357395.414245 
+335348.675392  7357407.962096 
+335341.245538  7357416.190686 
+335335.803026  7357429.418420 
+335330.541931  7357444.195889 
+335328.084554  7357462.772707 
+335328.092800  7357479.829785 
+335331.440770  7357498.916516 
+335333.221956  7357521.642623 
+335327.424855  7357547.718157 
+335323.277001  7357554.207045 
+335317.529379  7357566.654913 
+335313.571188  7357583.442038 
+335316.960389  7357598.329487 
+335318.906499  7357606.428100 
+335324.381996  7357617.456211 
+335334.063071  7357634.733252 
+335344.552277  7357652.910138 
+335354.695140  7357673.956533 
+335362.867155  7357698.422342 
+335372.820355  7357736.965740 
+335378.840104  7357771.699791 
+335383.746611  7357805.204052 
+335384.826867  7357826.590388 
+335387.086334  7357852.206001 
+335392.198997  7357876.631817 
+335396.709685  7357901.047635 
+335401.822348  7357925.803394 
+335404.057077  7357953.188703 
+335410.019102  7357984.493341 
+335414.909116  7358001.600411 
+335419.230141  7358024.796438 
+335421.291699  7358049.412221 
+335422.767774  7358071.798387 
+335422.891468  7358087.865634 
+335422.157553  7358107.462278 
+335421.522593  7358118.080459 
+335419.980548  7358146.195643 
+335415.403890  7358172.731098 
+335414.241172  7358184.789032 
+335413.070207  7358198.616664 
+335410.373690  7358211.874393 
+335405.244534  7358223.672372 
+335400.535936  7358234.910447 
+335394.252309  7358249.907878 
+335388.719088  7358252.607416 
+335380.514088  7358258.056482 
+335375.285978  7358261.095962 
+335370.519657  7358267.684833 
+335371.674129  7358273.573824 
+335376.712576  7358278.832923 
+335388.356254  7358284.281990 
+335401.236866  7358289.411111 
+335405.986695  7358292.570570 
+335407.677172  7358305.108423 
+335405.813524  7358307.627991 
+335404.189017  7358315.916571 
+335404.741514  7358321.125679 
+335412.517710  7358326.754715 
+335417.077875  7358329.354270 
+335424.614930  7358329.224292 
+335433.248733  7358331.093972 
+335445.618079  7358335.993132 
+335453.872556  7358344.841617 
+335456.841199  7358352.400322 
+335459.075928  7358361.288799 
+335455.769189  7358366.017989 
+335452.792300  7358377.056099 
+335456.577320  7358383.854934 
+335459.809842  7358386.444491 
+335464.304038  7358394.023192 
+335463.232028  7358399.212304 
+335460.626219  7358404.501398 
+335463.034118  7358416.379363 
+335472.649223  7358421.478490 
+335477.687670  7358426.297664 
+335482.181866  7358434.436270 
+335480.516127  7358445.934300 
+335478.034012  7358458.532143 
+335480.507881  7358465.091019 
+335488.358293  7358472.939675 
+335499.672121  7358481.148269 
+335506.392799  7358490.526662 
+335511.414754  7358496.565628 
+335519.042517  7358497.655441 
+335534.190843  7358499.375147 
+335535.427777  7358507.143816 
+335533.415697  7358522.961106 
+335528.327773  7358531.209694 
+335520.551577  7358543.407604 
+335515.331713  7358554.425717 
+335512.618703  7358569.013218 
+335510.260281  7358579.731382 
+335510.928226  7358592.589180 
+335519.190949  7358600.547817 
+335517.343794  7358610.826056 
+335508.833683  7358615.495256 
+335501.972820  7358618.624720 
+335487.104866  7358627.643175 
+335483.460032  7358643.220507 
+335482.453992  7358651.189142 
+335473.432615  7358664.926789 
+335461.228194  7358672.435503 
+335451.984169  7358679.084364 
+335443.853386  7358695.821497 
+335453.353044  7358710.998897 
+335452.182079  7358733.135106 
+335450.475109  7358748.842415 
+335447.852808  7358773.288228 
+335448.520753  7358786.365988 
+335447.036431  7358827.438952 
+335449.065004  7358863.902706 
+335451.687305  7358883.979267 
+335453.864310  7358907.375260 
+335451.703798  7358926.731944 
+335452.511928  7358954.317219 
+335454.449792  7358972.174160 
+335453.427260  7358999.069553 
+335448.982541  7359022.395558 
+335443.474059  7359049.910845 
+335438.476844  7359077.316150 
+335424.854071  7359110.830410 
+335416.583101  7359130.347067 
+335405.458936  7359159.342100 
+335396.627223  7359192.466426 
+335383.655902  7359230.979829 
+335364.128828  7359255.565618 
+335363.601069  7359283.360857 
+335379.334877  7359314.885457 
+335384.233138  7359350.269396 
+335388.479947  7359397.281343 
+335392.462877  7359441.073842 
+335397.163228  7359493.514859 
+335397.897143  7359544.576113 
+335405.219795  7359617.433633 
+335414.092740  7359696.610071 
+335415.008071  7359794.533298 
+335422.619342  7359868.710592 
+335435.747341  7359914.492750 
+335456.478365  7359962.914455 
+335476.153871  7359988.720035 
+335488.572695  7360024.973825 
+335481.497429  7360064.757011 
+335450.747235  7360108.709482 
+335408.345117  7360146.333038 
+335365.555426  7360173.858323 
+335326.567248  7360207.642536 
+335296.633430  7360242.296600 
+335228.313409  7360284.159429 
+335182.332427  7360296.587300 
+335109.303809  7360340.499779 
+334898.909480  7360469.787633 
+334843.280408  7360506.031424 
+334798.107556  7360518.909219 
+334770.053880  7360531.327092 
+334739.905661  7360566.651041 
+334702.657437  7360608.083944 
+334643.952521  7360664.564269 
+334584.686861  7360715.605526 
+334503.898539  7360769.946218 
+334296.703748  7360867.809455 
+334172.696932  7360915.001372 
+334088.387470  7360946.925903 
+333997.250129  7360979.440334 
+333920.123133  7361025.072517 
+333837.570118  7361116.826801 
+333794.599010  7361212.350438 
+333775.814097  7361286.897669 
+333748.939631  7361391.369774 
+333732.595602  7361457.188500 
+333712.623232  7361555.091730 
+333714.157030  7361642.826702 
+333717.199890  7361714.414439 
+333708.706272  7361779.553282 
+333685.435409  7361836.433539 
+333663.838531  7361907.401382 
+333654.825401  7361990.807096 
+333656.680803  7362086.410720 
+333659.583476  7362170.616296 
+333661.471863  7362253.822044 
+333659.971049  7362322.250323 
+333657.497180  7362351.795262 
+333639.594613  7362534.783918 
+333632.585317  7362630.397540 
+333620.084031  7362750.976886 
+333610.205047  7362856.968730 
+333598.899465  7362954.302058 
+333586.802244  7363048.635899 
+333584.666471  7363128.472224 
+333576.007928  7363216.757102 
+333575.339984  7363336.146651 
+333566.450547  7363479.692063 
+333575.950205  7363610.609638 
+333607.475545  7363695.365120 
+333710.273056  7363899.570142 
+333601.917585  7363797.637602 
+333411.734768  7363634.625525 
+333271.870450  7363482.161640 
+333102.674289  7363259.029861 
+333023.180626  7363137.490679 
+332933.840963  7362995.794951 
+332834.185266  7362873.915827 
+332754.468954  7362772.533193 
+332624.574329  7362640.335837 
+332484.949152  7362477.903661 
+332314.854152  7362325.069840 
+331887.839590  7361882.835590 
+331818.612484  7361843.812275 
+331736.818122  7361798.670007 
+331646.249771  7361746.658916 
+331565.609882  7361690.678505 
+331482.858957  7361632.228517 
+331383.937174  7361553.541995 
+331291.818532  7361477.255063 
+331213.438109  7361437.461879 
+331156.605088  7361418.855066 
+331100.835830  7361414.105880 
+331034.816507  7361414.885746 
+330979.319375  7361421.434624 
+330797.795100  7361446.660303 
+330725.525134  7361458.768229 
+330643.203014  7361468.326592 
+330588.695429  7361476.995107 
+330528.704101  7361484.703787 
+330482.954014  7361494.132172 
+330437.269896  7361506.999968 
+330381.063588  7361521.627462 
+330343.807118  7361545.663345 
+330296.482000  7361575.788185 
+330265.896731  7361604.003352 
+330230.487416  7361634.938053 
+330204.544775  7361657.664160 
+330154.737542  7361691.528360 
+330113.737283  7361721.503225 
+330067.962456  7361750.318289 
+330003.724320  7361764.175916 
+329949.216735  7361773.064393 
+329863.645600  7361781.352973 
+329782.296534  7361785.712227 
+329695.917268  7361784.692401 
+329624.636851  7361781.862886 
+329538.059675  7361771.974580 
+329492.812608  7361764.575847 
+329443.335224  7361753.247788 
+329393.593960  7361738.150374 
+329332.769763  7361729.901787 
+329279.466128  7361722.842996 
+329220.398378  7361721.593210 
+329163.219015  7361723.792833 
+329088.260778  7361730.101752 
+328997.642950  7361734.790949 
+328915.461015  7361706.015878 
+328879.086892  7361689.188760 
+328840.923336  7361660.273713 
+328809.076393  7361631.428654 
+328773.856742  7361602.773562 
+328752.531990  7361580.257419 
+328728.007700  7361552.052251 
+328697.084335  7361513.468860 
+328625.696716  7361442.840957 
+328592.629331  7361413.216032 
+328572.953825  7361397.808671 
+328546.986445  7361379.331836 
+328515.642522  7361359.575220 
+328484.273861  7361350.226821 
+328459.394983  7361343.957895 
+328441.591371  7361341.638293 
+328378.812817  7361335.239389 
+328335.297458  7361319.552076 
+328301.578621  7361302.095066 
+328273.186849  7361282.148483 
+328249.825277  7361259.272401 
+328239.789614  7361246.754545 
+328219.347209  7361226.677984 
+328200.026290  7361215.489901 
+328171.766458  7361201.642273 
+328163.008961  7361184.475213 
+328162.901760  7361184.365232 
+328163.008961  7361184.475213 
+328154.457620  7361175.066825 
+328151.200359  7361157.639810 
+328149.328464  7361152.640666 
+328140.521490  7361139.352942 
+328132.918465  7361135.823547 
+328084.579061  7361140.682714 
+328075.623655  7361139.462923 
+328055.585314  7361137.013343 
+328045.434204  7361134.013857 
+328026.410150  7361123.595641 
+328013.166704  7361123.655631 
+327997.696775  7361122.145890 
+327985.022319  7361117.116751 
+327982.515465  7361113.877306 
+327977.963545  7361102.409270 
+327972.306631  7361090.051387 
+327967.062028  7361085.782118 
+327957.347969  7361088.321683 
+327952.746572  7361098.679909 
+327941.119387  7361108.068301 
+327931.891855  7361113.047448 
+327922.012870  7361121.466006 
+327911.845268  7361128.764756 
+327902.172439  7361136.283468 
+327888.689852  7361156.510003 
+327865.542683  7361158.339690 
+327853.635126  7361157.419848 
+327838.132212  7361159.229538 
+327825.680404  7361161.289185 
+327803.580506  7361168.897881 
+327787.351924  7361171.687404 
+327769.292679  7361182.105619 
+327759.133323  7361188.414538 
+327745.716705  7361203.311987 
+327731.153862  7361228.167729 
+327721.472787  7361245.334788 
+327707.215054  7361262.001934 
+327691.275091  7361274.659765 
+327682.072297  7361286.177792 
+327656.410027  7361311.233501 
+327642.910948  7361323.811346 
+327628.372843  7361338.698796 
+327616.250884  7361355.395936 
+327609.307558  7361365.164263 
+327595.857956  7361382.281331 
+327587.718926  7361398.688520 
+327578.070836  7361413.086054 
+327561.784531  7361420.864722 
+327552.647707  7361426.513754 
+327534.827603  7361434.052463 
+327520.586362  7361441.191240 
+327458.896311  7361402.907798 
+327448.266920  7361405.777306 
+327397.107305  7361397.838666 
+327268.103272  7361731.551504 
+327265.208845  7361739.080214 
+327124.453935  7362465.335813 
+326951.258352  7363243.712484 
+326775.687856  7363903.469474 
+326611.827006  7364519.253996 
+326607.192625  7364555.987704 
+326627.874171  7364820.742354 
+326635.304025  7364897.279243 
+326703.426136  7365162.193866 
+326789.137458  7365381.496301 
+326879.565623  7365668.287177 
+326773.007831  7366250.047527 
+326661.279652  7366570.552627 
+326246.098431  7367155.122495 
+326169.334270  7368025.373429 
+325671.896899  7369380.911238 
+325613.488847  7369526.546292 
+325608.021596  7369615.920983 
+325585.748527  7369832.083956 
+325581.237839  7370033.769409 
+325573.651307  7370287.315979 
+325573.469890  7370334.217945 
+325574.055372  7370336.627532 
+325529.971023  7370347.375691 
+325513.626994  7370358.253828 
+325504.820019  7370378.640336 
+325502.766708  7370396.777229 
+325501.645221  7370430.881388 
+325495.188422  7370441.659541 
+325484.938357  7370454.717305 
+325472.577258  7370468.045022 
+325449.166209  7370488.291554 
+325436.961787  7370494.230536 
+325421.813462  7370508.118158 
+325415.637035  7370521.005950 
+325405.073614  7370534.943563 
+325389.075926  7370542.832211 
+325350.524798  7370569.837586 
+325338.246160  7370581.875524 
+325313.862056  7370592.103772 
+325297.377841  7370597.772801 
+325242.614624  7370608.630941 
+325218.296489  7370613.100175 
+325198.241656  7370619.169136 
+325153.629549  7370625.927978 
+325096.301753  7370635.996253 
+325062.632393  7370638.245868 
+325054.344932  7370639.515650 
+325004.958256  7370644.524792 
+324981.901795  7370646.024535 
+324897.039836  7370649.983857 
+324853.606939  7370650.673739 
+324806.751856  7370656.092811 
+324748.269589  7370662.021795 
+324720.158188  7370659.912157 
+324703.278154  7370655.942837 
+324664.496132  7370634.656483 
+324644.408314  7370626.547872 
+324622.374385  7370627.827652 
+324606.863226  7370637.945919 
+324592.151950  7370640.315513 
+324574.628710  7370639.325683 
+324545.832873  7370635.096407 
+324509.532965  7370627.017791 
+324482.056525  7370623.138456 
+324462.999486  7370622.908495 
+324434.244879  7370623.558384 
+324410.908047  7370623.158452 
+324368.209064  7370621.648711 
+324332.791504  7370617.119487 
+324312.629470  7370615.329793 
+324284.394376  7370606.341333 
+324264.133387  7370604.101716 
+324241.711886  7370595.193242 
+324215.381672  7370581.135650 
+324182.833800  7370575.426628 
+324161.302891  7370576.606426 
+324149.799400  7370583.775198 
+324115.882653  7370606.401323 
+324098.153257  7370631.437034 
+324095.407262  7370647.464289 
+324093.659061  7370673.809776 
+324105.005875  7370696.205940 
+324113.953035  7370706.614157 
+324124.763843  7370715.162693 
+324148.818098  7370740.488355 
+324165.549700  7370755.865721 
+324181.308247  7370768.243600 
+324186.016845  7370782.921086 
+324191.682005  7370795.398949 
+324203.201989  7370803.837504 
+324218.358561  7370806.577034 
+324234.504681  7370811.646166 
+324251.359976  7370817.165221 
+324258.031177  7370829.873044 
+324263.440704  7370846.110263 
+324262.846975  7370878.224762 
+324257.940468  7370888.243046 
+324249.826177  7370909.849345 
+324237.959851  7370929.865916 
+324194.848558  7370979.627392 
+324167.207192  7371072.891417 
+324161.640987  7371120.113328 
+324188.556684  7371170.284734 
+324217.872034  7371232.884012 
+324234.496435  7371307.851171 
+324233.952183  7371352.593507 
+324228.237545  7371412.333274 
+324210.005129  7371469.373503 
+324164.197318  7371531.072935 
+324072.911545  7371627.096487 
+324012.136825  7371678.637658 
+323971.441677  7371730.428787 
+323955.881040  7371777.640700 
+323974.888601  7371857.507019 
+323997.120439  7371882.702704 
+324011.839961  7371912.787550 
+324033.494562  7371985.265136 
+324022.073533  7372094.666396 
+323985.946797  7372181.401539 
+323940.015292  7372253.059265 
+323922.500298  7372360.170918 
+323933.838865  7372669.108000 
+323911.755459  7372833.209890 
+323880.823848  7372912.476313 
+323798.996502  7373050.932596 
+323746.905063  7373209.685404 
+323699.307819  7373418.219684 
+323479.669466  7373360.829514 
+323274.527986  7373343.382502 
+323129.781900  7373306.728781 
+323066.417863  7373296.880468 
+322895.605442  7373204.296327 
+322487.012959  7373033.715546 
+322287.462424  7372967.796837 
+322202.212892  7372976.615326 
+322101.674848  7373010.269562 
+322020.573169  7373089.026071 
+321843.188502  7373261.076601 
+321696.018023  7373413.670463 
+321630.056424  7373487.617796 
+321527.168205  7373538.189134 
+321080.857463  7373572.453265 
+320820.070419  7373594.159547 
+320515.083579  7373545.527877 
+320316.052556  7373438.506209 
+320192.961071  7373267.615481 
+320115.883553  7373012.569168 
+320090.666580  7372628.684924 
+320092.150901  7372509.195391 
+320124.162769  7372345.213480 
+320136.631069  7372243.690870 
+320110.432795  7372128.840542 
+320067.008144  7371996.263252 
+320018.198705  7371895.970431 
+319961.283221  7371840.549924 
+319851.616599  7371796.877405 
+319720.996306  7371724.579789 
+319698.277941  7371633.035469 
+319684.259348  7371555.658723 
+319697.939845  7371463.674479 
+319742.271581  7371317.239562 
+319756.141741  7371210.297881 
+319734.643818  7371127.852003 
+319682.725550  7371072.481487 
+319628.415875  7371004.573119 
+319545.161930  7370854.008910 
+319501.135305  7370771.273082 
+319436.996123  7370690.836860 
+319372.609554  7370630.217243 
+319305.369789  7370602.022073 
+319222.866251  7370588.474393 
+319107.781856  7370579.615911 
+319000.572612  7370535.963388 
+318926.100903  7370482.752502 
+318859.735239  7370384.779284 
+318763.839822  7370244.023395 
+318655.459613  7370090.809639 
+318572.032498  7369955.292852 
+318522.926194  7369879.915763 
+318418.553653  7369813.807087 
+318293.573781  7369789.861188 
+318188.607511  7369771.154393 
+317951.561365  7369700.836438 
+317804.440364  7369654.234420 
+317734.850424  7369610.931837 
+317633.685666  7369485.163380 
+317606.794708  7369434.971978 
+317565.225459  7369352.266145 
+317519.285708  7369219.768840 
+317485.517394  7369117.216406 
+317484.560831  7368998.796691 
+317479.167796  7368925.289282 
+317481.699389  7368821.976978 
+317471.597756  7368733.462140 
+317445.325266  7368634.769045 
+317433.772296  7368556.202503 
+317439.569397  7368492.803363 
+317457.966737  7368424.475067 
+317487.578951  7368355.176937 
+317514.502894  7368305.665418 
+317542.531832  7368273.680896 
+317656.164891  7368194.144520 
+317686.725421  7368154.761266 
+317702.170611  7368126.266147 
+317705.040300  7368092.741890 
+317705.592797  7368049.109364 
+317687.484075  7367997.818149 
+317675.337377  7367966.543506 
+317640.892872  7367917.591891 
+317527.952497  7367837.745568 
+317462.296008  7367782.085102 
+317433.846512  7367750.600495 
+317429.121422  7367729.384130 
+317433.063121  7367715.696474 
+317437.013065  7367702.128798 
+317440.888793  7367693.420290 
+317452.285084  7367678.612826 
+317457.537933  7367666.274940 
+317458.840838  7367660.086000 
+317452.680903  7367647.278194 
+317449.646290  7367637.599851 
+317439.569397  7367628.501410 
+317426.837216  7367620.032860 
+317417.378790  7367610.054570 
+317412.719670  7367599.806325 
+317411.210609  7367589.708055 
+317410.501434  7367581.609442 
+317405.825821  7367572.251045 
+317398.033133  7367560.073131 
+317381.763320  7367540.706448 
+317368.660059  7367529.138430 
+317357.140075  7367521.679707 
+317335.864800  7367511.331480 
+317303.349912  7367495.084263 
+317287.071853  7367484.796025 
+317268.385895  7367471.048380 
+317259.958247  7367460.970106 
+317250.549298  7367455.421057 
+317243.638956  7367453.561375 
+317233.347661  7367453.541379 
+317219.263099  7367454.471220 
+317203.347873  7367455.711007 
+317191.761919  7367453.241430 
+317186.212206  7367448.852182 
+317181.825211  7367441.373463 
+317178.988508  7367431.925082 
+317177.413478  7367419.167267 
+317177.405232  7367387.932617 
+317178.708136  7367373.545082 
+317174.914870  7367358.877594 
+317169.645529  7367340.090812 
+317158.628565  7367325.113377 
+317144.007998  7367304.096977 
+317128.323667  7367287.289856 
+317120.217622  7367275.661848 
+317117.067562  7367266.983335 
+317117.446889  7367261.004359 
+317119.648632  7367256.055207 
+317121.174185  7367248.206551 
+317118.403452  7367241.967620 
+317109.637708  7367233.769024 
+317098.002277  7367226.650243 
+317089.302504  7367221.661098 
+317082.144775  7367215.702119 
+317073.939776  7367203.194261 
+317063.318631  7367180.688116 
+317042.785517  7367136.005770 
+317019.951704  7367096.062612 
+317003.038685  7367071.926746 
+316993.060746  7367054.409747 
+316988.632520  7367041.941882 
+316986.488500  7367034.723119 
+316987.395585  7367026.974446 
+316990.545645  7367019.815672 
+316996.482931  7367009.817385 
+317011.754951  7366994.719971 
+317024.025342  7366983.801841 
+317035.908160  7366970.994035 
+317043.403984  7366958.236220 
+317046.751953  7366943.548736 
+317047.106541  7366931.920728 
+317046.133486  7366919.722817 
+317043.717341  7366909.504567 
+317033.722909  7366886.008592 
+317026.227085  7366865.972024 
+317015.902805  7366836.597056 
+317006.155760  7366816.980416 
+316997.398263  7366808.561858 
+316979.594651  7366797.923680 
+316960.554104  7366788.495295 
+316948.052819  7366786.005722 
+316936.854438  7366784.755936 
+316923.718192  7366783.816097 
+316912.132238  7366781.346520 
+316896.159289  7366771.278244 
+316880.903763  7366760.340118 
+316865.252417  7366756.600759 
+316852.454267  7366753.781241 
+316843.342182  7366748.572134 
+316823.328580  7366735.694340 
+316813.375380  7366732.574874 
+316802.704757  7366730.115295 
+316794.301848  7366726.015997 
+316787.473969  7366717.627434 
+316783.416824  7366708.489000 
+316779.895683  7366696.591038 
+316774.337724  7366676.694446 
+316766.833654  7366665.746321 
+316755.552811  7366655.078148 
+316731.490310  7366639.820762 
+316714.024793  7366626.972963 
+316703.370663  7366615.094997 
+316695.907824  7366600.717460 
+316690.589006  7366594.438535 
+316681.493413  7366588.239597 
+316661.512796  7366580.120988 
+316649.019757  7366577.301471 
+316631.793381  7366576.971527 
+316603.995338  7366575.401796 
+316588.038881  7366571.982382 
+316578.423776  7366566.653295 
+316573.706932  7366560.394367 
+316572.107164  7366550.076134 
+316571.810299  7366541.317635 
+316574.012043  7366528.829774 
+316578.712394  7366503.194165 
+316578.069188  7366489.786461 
+316573.434807  7366477.868503 
+316565.287531  7366461.041385 
+316557.742230  7366445.434059 
+316555.540486  7366433.896035 
+316557.132009  7366421.288195 
+316559.919235  7366410.350068 
+316564.611340  7366401.661556 
+316571.843284  7366394.442793 
+316592.763971  7366375.985954 
+316597.431338  7366369.517062 
+316599.666066  7366362.008349 
+316599.657820  7366354.479638 
+316598.660026  7366345.051253 
+316591.461067  7366333.883166 
+316579.602987  7366320.995374 
+316563.036310  7366301.288749 
+316555.936305  7366290.670568 
+316549.941296  7366273.213558 
+316550.922597  7366260.035816 
+316552.464642  7366250.977367 
+316557.791707  7366240.739121 
+316566.161631  7366231.660676 
+316571.859777  7366223.862012 
+316583.058158  7366201.295877 
+316588.706826  7366189.737857 
+316591.180695  7366179.139672 
+316588.962459  7366169.141385 
+316583.742595  7366163.202402 
+316576.510651  7366162.562512 
+316570.276500  7366164.472185 
+316563.687762  7366169.151383 
+316555.837351  7366177.909883 
+316544.614231  7366186.968331 
+316537.431764  7366190.417741 
+316531.214106  7366190.447735 
+316523.726528  7366186.038491 
+316518.119092  7366178.539775 
+316513.097137  7366164.522176 
+316512.453931  7366151.004492 
+316510.524313  7366134.477323 
+316505.856947  7366117.020313 
+316497.173666  7366102.622779 
+316483.089104  7366087.935295 
+316465.532879  7366073.867705 
+316455.893035  7366062.889585 
+316451.497794  7366047.882156 
+316451.225669  7366029.155363 
+316453.377935  7366011.678357 
+316451.539025  7365987.952421 
+316446.517071  7365974.484728 
+316436.473162  7365954.758107 
+316428.416595  7365938.810839 
+316422.099982  7365930.982180 
+316417.127505  7365929.472438 
+316420.665138  7365899.617552 
+316428.127977  7365889.409301 
+316436.250514  7365884.190195 
+316449.122880  7365873.502025 
+316466.390487  7365869.842652 
+316478.611401  7365862.913839 
+316487.096772  7365852.495624 
+316496.522214  7365848.516305 
+316511.225243  7365846.156709 
+316520.774378  7365840.517675 
+316534.149764  7365822.740720 
+316544.078226  7365819.551267 
+316558.797747  7365815.741919 
+316568.816918  7365805.243717 
+316580.716228  7365791.216120 
+316593.976167  7365782.077686 
+316598.767227  7365766.410369 
+316601.719378  7365750.053171 
+316613.099176  7365736.795442 
+316627.587803  7365727.896966 
+316636.823582  7365722.247934 
+316649.662963  7365706.460638 
+316656.449611  7365693.702823 
+316669.000374  7365684.774353 
+316678.013504  7365672.926382 
+316683.785865  7365659.928609 
+316693.359739  7365644.431263 
+316706.578447  7365638.182333 
+316726.897159  7365635.222840 
+316739.942696  7365627.304197 
+316755.503333  7365621.635168 
+316765.637951  7365617.995791 
+316779.318447  7365616.176103 
+316801.443084  7365615.676189 
+316809.046109  7365610.457083 
+316822.429741  7365599.768913 
+316832.341710  7365597.569290 
+316845.288293  7365597.179357 
+316868.369492  7365593.489989 
+316887.245114  7365583.531695 
+316900.983334  7365577.392746 
+316917.838630  7365565.974702 
+316933.267327  7365555.096565 
+316952.629477  7365546.698004 
+316971.645285  7365542.178778 
+316992.541233  7365533.580251 
+317017.881900  7365536.449759 
+317029.278191  7365537.589564 
+317046.100501  7365545.558199 
+317057.735933  7365551.797130 
+317073.040937  7365558.745940 
+317089.467428  7365564.824899 
+317112.194040  7365572.873520 
+317128.768963  7365584.151588 
+317146.094294  7365592.240203 
+317169.422881  7365592.980076 
+317216.459380  7365580.172270 
+317267.618995  7365556.226372 
+317315.076052  7365542.538716 
+317387.593405  7365530.050855 
+317487.611936  7365526.221511 
+317636.316214  7365532.530431 
+317710.021023  7365522.492150 
+317797.604239  7365495.016856 
+317856.309155  7365462.532421 
+317902.545770  7365432.537559 
+317950.027566  7365408.771629 
+317993.773820  7365390.044837 
+318037.520073  7365380.076545 
+318105.007225  7365386.245488 
+318137.563343  7365382.556120 
+318165.089261  7365365.069115 
+318190.025863  7365343.782761 
+318210.031218  7365324.975983 
+318223.744700  7365320.056826 
+318266.847748  7365320.816695 
+318321.841860  7365315.417620 
+318359.733290  7365308.808752 
+318393.765483  7365301.150064 
+318432.382582  7365292.991462 
+318480.235458  7365280.523597 
+318515.141752  7365268.335685 
+318558.830282  7365253.928153 
+318601.125199  7365237.960888 
+318609.824973  7365234.851420 
+318634.481202  7365210.905522 
+318648.095729  7365197.457826 
+318666.295160  7365176.971335 
+318681.476471  7365160.984073 
+318700.203660  7365146.266594 
+318732.866980  7365125.970071 
+318755.370943  7365111.072623 
+318782.501042  7365092.695770 
+318804.683403  7365078.908132 
+318834.856361  7365062.560932 
+318857.310847  7365050.992914 
+318874.380544  7365038.795003 
+318896.653613  7365026.447118 
+318916.667215  7365006.980453 
+318953.989655  7364980.425001 
+318972.180840  7364968.247087 
+318994.371446  7364953.899545 
+319016.166234  7364938.562172 
+319035.734539  7364929.943648 
+319054.915272  7364919.995352 
+319074.211451  7364917.245823 
+319095.033184  7364914.516291 
+319109.480580  7364908.267361 
+319126.665725  7364895.189601 
+319134.623337  7364885.881196 
+319148.015216  7364874.743104 
+319161.819406  7364862.515198 
+319218.594704  7364820.802343 
+319232.200984  7364832.820285 
+319249.493330  7364843.338483 
+319262.365696  7364848.817545 
+319275.906007  7364858.295921 
+319287.830056  7364858.215935 
+319301.832156  7364854.626549 
+319313.055276  7364845.358137 
+319328.508712  7364832.140401 
+319334.198611  7364817.372931 
+319344.061103  7364802.875414 
+319349.305706  7364790.757490 
+319358.566223  7364775.700069 
+319369.063674  7364766.971564 
+319388.953583  7364757.363210 
+319407.903421  7364749.514554 
+319418.656506  7364737.346638 
+319425.995651  7364721.049430 
+319433.400766  7364699.103189 
+319436.262208  7364674.207454 
+319442.933409  7364661.889564 
+319464.769427  7364643.002799 
+319494.241456  7364633.514424 
+319518.823469  7364615.097579 
+319526.203846  7364611.868132 
+319537.501182  7364604.369416 
+319545.623719  7364590.621771 
+319556.879824  7364578.803795 
+319571.854979  7364571.235092 
+319584.315033  7364568.735520 
+319599.974625  7364563.166474 
+319629.924935  7364547.259199 
+319648.412984  7364535.861151 
+319663.190229  7364527.622562 
+319673.728912  7364515.904570 
+319678.074675  7364510.425508 
+319687.821720  7364505.556342 
+319705.419176  7364491.598733 
+319720.559256  7364478.390995 
+319747.153350  7364462.323747 
+319761.947087  7364452.655404 
+319779.280664  7364444.226847 
+319794.206342  7364431.788978 
+319813.345843  7364417.181480 
+319827.446897  7364405.953403 
+319835.231339  7364394.415380 
+319843.370369  7364387.096633 
+319851.204288  7364379.997849 
+319861.248197  7364367.489992 
+319873.691759  7364350.032982 
+319888.716391  7364330.066402 
+319901.102230  7364316.928652 
+319918.922334  7364293.892598 
+319930.005268  7364279.405080 
+319941.607715  7364264.377654 
+319949.548835  7364256.169060 
+319962.371723  7364241.481576 
+319970.197396  7364226.634119 
+319977.990084  7364214.656171 
+319986.533179  7364199.588752 
+319992.998224  7364188.030731 
+320002.605083  7364169.433917 
+320017.225650  7364156.986049 
+320036.150749  7364143.158418 
+320052.973059  7364133.730033 
+320077.489103  7364121.192180 
+320103.563684  7364105.784819 
+320115.265086  7364098.846008 
+320137.299014  7364080.179205 
+320163.233409  7364055.183487 
+320184.846780  7364034.577017 
+320210.162708  7364014.180510 
+320229.129038  7363997.023449 
+320254.197580  7363980.616260 
+320279.381568  7363954.450741 
+320299.337446  7363939.193355 
+320311.154295  7363931.814619 
+320326.401575  7363926.245573 
+320341.525162  7363914.797534 
+320353.012161  7363908.628590 
+320376.827276  7363886.442391 
+320397.088264  7363863.316352 
+320401.219626  7363858.827121 
+320418.742866  7363842.539911 
+320427.879690  7363820.833629 
+320450.045558  7363791.318685 
+320455.941612  7363768.462600 
+320461.342893  7363743.716838 
+320464.105381  7363726.359811 
+320468.657300  7363704.263596 
+320470.727104  7363685.016893 
+320472.178441  7363667.199945 
+320469.308752  7363652.212512 
+320464.608401  7363628.676544 
+320457.005376  7363608.639976 
+320454.910834  7363596.762010 
+320454.820125  7363579.814913 
+320452.239055  7363566.157253 
+320447.637658  7363551.039842 
+320442.665181  7363541.341503 
+320435.969242  7363514.226148 
+320436.769126  7363490.760167 
+320439.053332  7363470.853577 
+320440.916980  7363460.235396 
+320442.384809  7363448.957328 
+320442.079699  7363432.780099 
+320439.490382  7363419.352399 
+320436.092935  7363405.684740 
+320431.136951  7363394.766610 
+320423.237062  7363382.818657 
+320416.607092  7363366.561442 
+320407.099188  7363353.373701 
+320395.216370  7363333.727066 
+320386.071300  7363315.450196 
+320381.115316  7363304.092142 
+320379.466069  7363280.816129 
+320376.101607  7363264.598907 
+320364.309497  7363237.983466 
+320349.548745  7363220.626439 
+320339.513082  7363208.098585 
+320329.337233  7363198.890162 
+320317.710048  7363191.981346 
+320274.664724  7363170.954947 
+320253.372957  7363154.297800 
+320234.975616  7363142.219869 
+320214.261085  7363120.253632 
+320198.271643  7363103.436512 
+320187.271172  7363086.689381 
+320176.584057  7363061.303729 
+320181.210192  7363033.218540 
+320200.745513  7362994.585158 
+320208.538201  7362974.308631 
+320228.840420  7362963.920410 
+320242.430209  7362968.969545 
+320261.116167  7362982.267268 
+320289.120366  7362991.925613 
+320328.801228  7362996.514827 
+320367.607990  7362997.324688 
+320396.758415  7362988.166257 
+320414.223932  7362976.638232 
+320436.109428  7362962.070727 
+320451.364954  7362948.303085 
+320469.209798  7362930.476139 
+320476.936516  7362915.508703 
+320485.603304  7362890.243031 
+320491.367419  7362869.276622 
+320494.294831  7362838.851833 
+320495.185424  7362808.067107 
+320487.755570  7362774.632834 
+320477.703415  7362747.487483 
+320474.108059  7362733.039958 
+320464.732094  7362700.355557 
+320457.236271  7362680.988874 
+320454.135688  7362659.572542 
+320453.533713  7362642.625445 
+320452.882261  7362621.239109 
+320445.460653  7362603.202198 
+320440.438699  7362589.514543 
+320433.264478  7362568.598125 
+320426.766448  7362550.131289 
+320429.759830  7362530.784603 
+320439.811985  7362508.868357 
+320448.280864  7362491.581318 
+320457.112577  7362469.655074 
+320460.138944  7362447.318899 
+320455.438592  7362415.694317 
+320440.183066  7362380.830288 
+320421.563077  7362337.397728 
+320408.921605  7362314.091720 
+320391.728214  7362287.076348 
+320373.726693  7362260.270939 
+320363.196256  7362246.623277 
+320350.092996  7362226.966644 
+320339.504836  7362202.020917 
+320338.168946  7362170.216365 
+320331.390545  7362141.441294 
+320320.159179  7362118.925150 
+320304.804697  7362100.018389 
+320291.553004  7362092.429689 
+320266.979237  7362077.502246 
+320245.728701  7362066.494131 
+320226.193380  7362064.034553 
+320203.549231  7362066.304164 
+320184.615885  7362064.964393 
+320041.007779  7362028.610620 
+320022.692900  7362018.302386 
+320016.582444  7362009.703859 
+320000.873374  7361994.996378 
+319972.448617  7361986.777786 
+319946.555453  7361996.306154 
+319886.737296  7362021.701804 
+319859.302086  7362024.131388 
+319841.267580  7362023.791446 
+319827.883948  7362018.752309 
+319812.793346  7362011.803499 
+319796.416332  7362009.503893 
+319773.252670  7362012.203431 
+319753.676118  7362013.843150 
+319727.634522  7362010.303756 
+319708.965055  7362004.304784 
+319692.332408  7361990.147209 
+319676.747032  7361981.418704 
+319662.316129  7361970.830518 
+319630.683588  7361966.331288 
+319599.314927  7361973.470066 
+319578.806551  7361983.848288 
+319557.151949  7361988.237536 
+319539.554493  7361994.106531 
+319526.302800  7361995.046370 
+319502.141345  7361987.987579 
+319490.967702  7361985.298039 
+319471.976633  7361971.990319 
+319453.818433  7361957.812747 
+319433.639907  7361950.024082 
+319413.939662  7361944.794977 
+319394.214678  7361941.885476 
+319378.192252  7361943.575186 
+319355.267731  7361951.923756 
+319340.135897  7361956.612953 
+319320.452145  7361966.001345 
+319300.826116  7361971.400420 
+319272.863148  7361975.039797 
+319248.858370  7361979.609014 
+319226.502839  7361983.648322 
+319202.976343  7361990.887082 
+319186.236495  7362001.645239 
+319169.043104  7362023.691463 
+319156.789205  7362042.368264 
+319152.616612  7362049.737002 
+319145.417653  7362063.824589 
+319141.038905  7362079.281941 
+319129.716830  7362097.188874 
+319116.522861  7362108.986853 
+319106.429475  7362117.835337 
+319074.318652  7362127.293717 
+319036.509685  7362127.923609 
+319013.337777  7362131.732957 
+318981.655759  7362131.113063 
+318960.726825  7362134.952405 
+318941.768741  7362143.350966 
+318916.815647  7362150.789692 
+318896.208317  7362152.639375 
+318875.642217  7362151.719533 
+318847.547310  7362149.589898 
+318823.501301  7362149.619893 
+318801.690021  7362150.119807 
+318775.673163  7362153.339256 
+318755.709039  7362152.869336 
+318733.386493  7362153.699194 
+318720.654312  7362153.199280 
+318720.242001  7362137.252011 
+318719.483348  7362124.724157 
+318715.690082  7362102.627942 
+318712.605991  7362080.441742 
+318714.016097  7362057.085743 
+318714.642810  7362031.840067 
+318717.207388  7362005.734539 
+318719.837936  7361975.299752 
+318725.766975  7361948.904273 
+318730.854900  7361933.456919 
+318736.099502  7361913.150398 
+318743.949914  7361880.565979 
+318746.737140  7361853.130679 
+318750.794285  7361830.584541 
+318757.869551  7361818.826555 
+318778.897440  7361798.929963 
+318791.588388  7361786.572079 
+318797.665860  7361773.134381 
+318806.678991  7361753.087815 
+318814.471679  7361732.581328 
+318821.909779  7361716.394100 
+318833.165883  7361688.178933 
+318842.393416  7361659.613826 
+318839.482496  7361631.658615 
+318827.393522  7361604.153326 
+318810.546473  7361582.896967 
+318795.373408  7361557.891250 
+318790.854474  7361520.177710 
+318786.624158  7361492.432463 
+318779.276766  7361452.459310 
+318771.624264  7361421.014696 
+318764.400566  7361388.140327 
+318768.837038  7361359.285270 
+318785.106851  7361345.537625 
+318802.390951  7361331.799978 
+318809.960990  7361321.591726 
+318812.838925  7361294.926294 
+318807.825217  7361280.468770 
+318800.156222  7361258.662506 
+318795.892921  7361241.105513 
+318791.703836  7361225.438197 
+318787.069454  7361205.221660 
+318782.039253  7361192.193891 
+318781.148660  7361173.797042 
+318781.198138  7361145.331918 
+318784.191520  7361125.985232 
+318794.070504  7361102.299289 
+318806.514066  7361076.313740 
+318816.508498  7361059.376641 
+318826.173080  7361044.549181 
+318846.128958  7361013.224547 
+318859.133264  7360999.656871 
+318871.824213  7360986.749082 
+318884.572885  7360969.622016 
+318896.925739  7360951.285157 
+318907.777778  7360930.598700 
+318913.863497  7360916.601098 
+318923.709496  7360895.124776 
+318938.140400  7360873.598464 
+318958.755976  7360854.361759 
+318977.408950  7360837.654620 
+318986.669467  7360830.015929 
+318998.849150  7360817.648047 
+319012.875988  7360804.090370 
+319035.610846  7360786.213432 
+319050.379845  7360770.336151 
+319064.769517  7360760.327866 
+319080.371386  7360742.800868 
+319097.721455  7360723.744132 
+319108.524017  7360707.376936 
+319113.578957  7360693.929239 
+319119.771876  7360687.690308 
+319119.615197  7360686.810459 
+319119.615197  7360583.948078 
+319126.946096  7359466.359511 
+319136.082920  7359463.729961 
+319180.274470  7359446.332941 
+319248.041993  7359416.508050 
+319283.269891  7359412.488738 
+319292.332498  7359411.298942 
+319298.376985  7359408.559411 
+319350.262269  7359362.377322 
+319386.562176  7359347.979788 
+319389.918392  7359336.111821 
+319398.882044  7359313.885628 
+319407.293200  7359298.008348 
+319414.937456  7359284.140723 
+319423.290887  7359276.612013 
+319433.656399  7359267.833517 
+319454.568840  7359261.414616 
+319465.387895  7359260.494774 
+319484.238778  7359260.644748 
+319498.529496  7359266.573732 
+319511.047274  7359272.502717 
+319518.839962  7359273.322576 
+319529.659016  7359271.632866 
+319548.048111  7359266.213794 
+319573.232099  7359261.354626 
+319593.352902  7359260.244816 
+319614.958026  7359261.434613 
+319662.893365  7359272.192770 
+319680.226942  7359273.342573 
+319698.071785  7359275.002289 
+319711.900714  7359274.102443 
+319724.748341  7359269.903162 
+319743.409561  7359262.204481 
+319770.399474  7359250.506485 
+319806.419009  7359239.908300 
+319834.109852  7359235.069129 
+319864.324041  7359229.230129 
+319902.957631  7359239.408386 
+319925.552303  7359244.147574 
+319943.867182  7359248.856767 
+319955.708769  7359252.936068 
+319974.386481  7359269.613212 
+319987.803099  7359291.999377 
+319998.490214  7359307.786673 
+320181.952353  7359475.527940 
+320357.102292  7359526.609191 
+320430.089679  7359519.310441 
+321650.193720  7359181.658278 
+323030.785901  7358765.929488 
+323692.084121  7358570.502963 
+323836.187002  7358520.431540 
+324813.216901  7358187.338596 
+325088.517311  7358098.433824 
+326572.937783  7357617.596187 
+328059.098209  7357476.850296 
+330702.765538  7357474.340726 
+332084.108126  7357442.346206 
+332089.286759  7357391.804863 
+332097.062954  7357342.563298 
+331836.811915  7355681.047900 
+332066.601378  7355329.898049 
+332270.225552  7355060.754151 
+332502.777502  7354836.182618 
+332741.101814  7354236.195391 
+336095.858105  7355254.410980 
+Region 1
+350
+331851.094387  7373867.232772 
+331905.890589  7373687.333587 
+332003.872302  7373405.931788 
+332079.778855  7373207.995693 
+332124.366224  7373029.096337 
+332115.254139  7372873.592973 
+332107.296527  7372653.760628 
+332128.563555  7372428.399231 
+332141.485399  7372386.906338 
+332157.680996  7372352.532226 
+332206.350249  7372226.063889 
+332234.263740  7372166.244136 
+332272.072707  7372061.682046 
+332304.876213  7371966.588335 
+332331.659970  7371880.733041 
+332360.076481  7371786.359206 
+332401.645730  7371674.088437 
+332456.466671  7371543.700772 
+332511.114441  7371446.097490 
+332565.514825  7371369.970530 
+332623.527058  7371298.422786 
+332689.406194  7371208.478192 
+332749.620170  7371131.641354 
+332820.983050  7371042.646598 
+332890.647207  7370959.930766 
+332966.405328  7370870.096154 
+333112.487304  7370718.722083 
+333143.146789  7370676.429327 
+333208.869248  7370599.432516 
+333269.561505  7370525.155239 
+333343.967244  7370445.818829 
+333418.010149  7370362.613081 
+333531.461790  7370238.534335 
+333617.560685  7370134.972074 
+333694.902082  7370039.508426 
+333777.331403  7369944.974619 
+333864.617755  7369844.081901 
+333942.750790  7369759.476393 
+334054.916019  7369613.571385 
+334146.704813  7369502.090481 
+334237.528797  7369403.227415 
+334316.016420  7369305.114221 
+334407.046561  7369197.282692 
+334511.064514  7369005.205593 
+334580.951319  7368847.952529 
+334622.611276  7368743.210470 
+334653.138822  7368640.448073 
+334672.187615  7368507.430857 
+334694.394714  7368320.612857 
+334699.441407  7368244.695861 
+334697.165447  7368171.658372 
+334691.698196  7368119.897238 
+334685.793895  7368048.059543 
+334683.905508  7367980.801064 
+334686.651503  7367919.141626 
+334686.766950  7367837.635587 
+334681.456378  7367678.082917 
+334668.212931  7367454.761170 
+334662.366354  7367208.153412 
+334666.852303  7366949.367739 
+334665.392720  7366676.114545 
+334659.447188  7366286.961204 
+334655.587952  7366009.688698 
+334653.097591  7365906.766327 
+334652.586324  7365799.884635 
+334658.655550  7365714.779213 
+334661.071696  7365548.007780 
+334647.490154  7365390.254801 
+334610.604764  7365194.238377 
+334588.760499  7365090.976065 
+334564.524827  7364965.107625 
+334545.228647  7364878.942384 
+334510.949067  7364811.643912 
+334461.859256  7364756.153417 
+334384.336441  7364692.794270 
+334286.387714  7364597.310625 
+334200.800086  7364508.715801 
+334084.676666  7364363.290711 
+333966.895754  7364212.526535 
+333846.179183  7364068.701171 
+333710.273056  7363899.570142 
+333601.917585  7363797.637602 
+333411.734768  7363634.625525 
+333271.870450  7363482.161640 
+333102.674289  7363259.029861 
+333023.180626  7363137.490679 
+332933.840963  7362995.794951 
+332834.185266  7362873.915827 
+332754.468954  7362772.533193 
+332624.574329  7362640.335837 
+332484.949152  7362477.903661 
+332314.854152  7362325.069840 
+331887.839590  7361882.835590 
+331818.612484  7361843.812275 
+331736.818122  7361798.670007 
+331646.249771  7361746.658916 
+331565.609882  7361690.678505 
+331482.858957  7361632.228517 
+331383.937174  7361553.541995 
+331291.818532  7361477.255063 
+331213.438109  7361437.461879 
+331156.605088  7361418.855066 
+331100.835830  7361414.105880 
+331034.816507  7361414.885746 
+330979.319375  7361421.434624 
+330797.795100  7361446.660303 
+330725.525134  7361458.768229 
+330643.203014  7361468.326592 
+330588.695429  7361476.995107 
+330528.704101  7361484.703787 
+330482.954014  7361494.132172 
+330437.269896  7361506.999968 
+330381.063588  7361521.627462 
+330343.807118  7361545.663345 
+330296.482000  7361575.788185 
+330265.896731  7361604.003352 
+330230.487416  7361634.938053 
+330204.544775  7361657.664160 
+330154.737542  7361691.528360 
+330113.737283  7361721.503225 
+330067.962456  7361750.318289 
+330003.724320  7361764.175916 
+329949.216735  7361773.064393 
+329863.645600  7361781.352973 
+329782.296534  7361785.712227 
+329695.917268  7361784.692401 
+329624.636851  7361781.862886 
+329538.059675  7361771.974580 
+329492.812608  7361764.575847 
+329443.335224  7361753.247788 
+329393.593960  7361738.150374 
+329332.769763  7361729.901787 
+329279.466128  7361722.842996 
+329220.398378  7361721.593210 
+329163.219015  7361723.792833 
+329088.260778  7361730.101752 
+328997.642950  7361734.790949 
+328915.461015  7361706.015878 
+328879.086892  7361689.188760 
+328840.923336  7361660.273713 
+328809.076393  7361631.428654 
+328773.856742  7361602.773562 
+328752.531990  7361580.257419 
+328728.007700  7361552.052251 
+328697.084335  7361513.468860 
+328625.696716  7361442.840957 
+328592.629331  7361413.216032 
+328572.953825  7361397.808671 
+328546.986445  7361379.331836 
+328515.642522  7361359.575220 
+328484.273861  7361350.226821 
+328459.394983  7361343.957895 
+328441.591371  7361341.638293 
+328378.812817  7361335.239389 
+328335.297458  7361319.552076 
+328301.578621  7361302.095066 
+328273.186849  7361282.148483 
+328249.825277  7361259.272401 
+328239.789614  7361246.754545 
+328219.347209  7361226.677984 
+328200.026290  7361215.489901 
+328171.766458  7361201.642273 
+328163.008961  7361184.475213 
+328154.457620  7361175.066825 
+328151.200359  7361157.639810 
+328149.328464  7361152.640666 
+328140.521490  7361139.352942 
+328132.918465  7361135.823547 
+328084.579061  7361140.682714 
+328075.623655  7361139.462923 
+328055.585314  7361137.013343 
+328045.434204  7361134.013857 
+328026.410150  7361123.595641 
+328013.166704  7361123.655631 
+327997.696775  7361122.145890 
+327985.022319  7361117.116751 
+327982.515465  7361113.877306 
+327977.963545  7361102.409270 
+327972.306631  7361090.051387 
+327967.062028  7361085.782118 
+327957.347969  7361088.321683 
+327952.746572  7361098.679909 
+327941.119387  7361108.068301 
+327931.891855  7361113.047448 
+327922.012870  7361121.466006 
+327911.845268  7361128.764756 
+327902.172439  7361136.283468 
+327888.689852  7361156.510003 
+327865.542683  7361158.339690 
+327853.635126  7361157.419848 
+327838.132212  7361159.229538 
+327825.680404  7361161.289185 
+327803.580506  7361168.897881 
+327787.351924  7361171.687404 
+327769.292679  7361182.105619 
+327759.133323  7361188.414538 
+327745.716705  7361203.311987 
+327731.153862  7361228.167729 
+327721.472787  7361245.334788 
+327707.215054  7361262.001934 
+327691.275091  7361274.659765 
+327682.072297  7361286.177792 
+327656.410027  7361311.233501 
+327642.910948  7361323.811346 
+327628.372843  7361338.698796 
+327616.250884  7361355.395936 
+327609.307558  7361365.164263 
+327595.857956  7361382.281331 
+327587.718926  7361398.688520 
+327578.070836  7361413.086054 
+327561.784531  7361420.864722 
+327552.647707  7361426.513754 
+327534.827603  7361434.052463 
+327520.586362  7361441.191240 
+327458.896311  7361402.907798 
+327448.266920  7361405.777306 
+327397.107305  7361397.838666 
+327268.103272  7361731.551504 
+327265.208845  7361739.080214 
+327124.453935  7362465.335813 
+326951.258352  7363243.712484 
+326775.687856  7363903.469474 
+326611.827006  7364519.253996 
+326607.192625  7364555.987704 
+326627.874171  7364820.742354 
+326635.304025  7364897.279243 
+326703.426136  7365162.193866 
+326789.137458  7365381.496301 
+326879.565623  7365668.287177 
+326773.007831  7366250.047527 
+326661.279652  7366570.552627 
+326246.098431  7367155.122495 
+326169.334270  7368025.373429 
+325671.896899  7369380.911238 
+325613.488847  7369526.546292 
+325608.021596  7369615.920983 
+325585.748527  7369832.083956 
+325581.237839  7370033.769409 
+325573.651307  7370287.315979 
+325573.469890  7370334.217945 
+325574.055372  7370336.627532 
+325552.730619  7370778.031924 
+325562.403448  7371152.427793 
+325606.792908  7371411.253459 
+325770.241445  7371841.869698 
+325821.879342  7371982.275648 
+325896.829332  7372167.483923 
+325983.068412  7372347.063163 
+326077.867080  7372527.082327 
+326165.969808  7372680.406064 
+326286.925519  7372889.080322 
+326299.707176  7372903.227897 
+326338.217074  7372955.578930 
+326437.848032  7373096.694758 
+326532.052971  7373234.011237 
+326575.411652  7373293.091117 
+326700.935775  7373459.772566 
+326746.067395  7373527.950888 
+326840.923786  7373671.666270 
+326939.218856  7373812.612128 
+327282.163096  7374258.605733 
+327372.104733  7374380.064928 
+327473.046843  7374515.401746 
+327497.348484  7374570.662281 
+327544.063381  7374666.105932 
+327562.485460  7374789.494797 
+327572.405676  7374941.458766 
+327574.681635  7375076.065710 
+327636.940677  7375047.500602 
+327649.854274  7375039.961894 
+327705.986366  7374988.900640 
+327802.879576  7374907.264624 
+327826.983308  7374876.919821 
+327830.059152  7374861.742421 
+327890.001003  7374710.238372 
+327893.315988  7374705.899116 
+327914.912866  7374660.676862 
+327947.081411  7374599.537335 
+327965.701400  7374564.233382 
+327960.176426  7374520.060948 
+327950.586059  7374495.325185 
+327935.231578  7374442.034313 
+327917.518675  7374391.852909 
+327899.863495  7374337.832162 
+327893.588113  7374292.899859 
+327886.974636  7374246.407822 
+327885.605762  7374190.457406 
+327888.186832  7374153.543729 
+327889.613430  7374124.598687 
+327914.137720  7374004.559249 
+327948.153421  7373904.876324 
+327960.019747  7373870.072285 
+327966.352852  7373858.204318 
+327990.877142  7373839.217570 
+328041.360566  7373783.177170 
+328094.573493  7373760.781006 
+328131.549591  7373738.874758 
+328205.848129  7373799.134436 
+328236.293213  7373820.740735 
+328306.031585  7373871.811987 
+328341.383176  7373903.246603 
+328369.873903  7373926.812566 
+328369.865657  7373926.812566 
+328381.649520  7373968.065500 
+328428.628296  7374028.825092 
+328455.453285  7374086.315245 
+328466.956776  7374149.564411 
+328476.209047  7374162.982112 
+328500.436473  7374232.820150 
+328545.485631  7374303.468048 
+328582.519453  7374344.770974 
+328616.782541  7374378.845137 
+328674.110336  7374420.288038 
+328698.139853  7374431.646093 
+328733.343011  7374446.903479 
+328785.302510  7374467.889885 
+328808.103338  7374480.017807 
+328857.473521  7374503.853724 
+328901.887719  7374524.760143 
+328977.835504  7374560.873957 
+329049.973529  7374600.607151 
+329118.408997  7374642.170032 
+329205.373746  7374695.030977 
+329299.941519  7374725.825702 
+329409.476201  7374758.570094 
+329498.873587  7374761.389611 
+329554.700569  7374765.808854 
+329642.061136  7374776.137085 
+329749.987803  7374789.584781 
+329784.325107  7374878.929477 
+329829.506205  7374999.848765 
+329881.383242  7375097.821983 
+329918.738667  7375173.019102 
+329979.950437  7375266.433101 
+330030.260690  7375341.120308 
+330220.690894  7375624.781719 
+330462.791980  7375946.156671 
+330939.391126  7375502.262706 
+331209.339733  7375201.484226 
+331372.046110  7375002.798260 
+331443.450221  7374903.835211 
+331530.711834  7374774.047443 
+331634.944189  7374569.692447 
+331652.731308  7374513.082143 
+331688.000437  7374417.678485 
+331719.162942  7374324.344473 
+331752.683870  7374211.873738 
+331786.534647  7374106.711751 
+331813.574037  7374016.647178 
+331851.094387  7373867.232772 
+Region 1
+514
+333270.245942  7379020.010148 
+333285.014941  7379012.751391 
+333306.669543  7379001.043396 
+333315.905321  7378996.054251 
+333335.778737  7378988.855484 
+333354.365741  7378986.635864 
+333381.504086  7378986.065962 
+333404.370884  7378984.216279 
+333425.192616  7378982.576560 
+333448.628404  7378975.867709 
+333462.490317  7378967.939067 
+333486.693004  7378947.612549 
+333492.704506  7378929.965571 
+333494.576401  7378917.917635 
+333493.628084  7378903.170161 
+333491.434587  7378889.302537 
+333480.673256  7378867.586256 
+333474.002055  7378853.548661 
+333462.919121  7378841.680694 
+333444.711444  7378827.963043 
+333427.179958  7378818.684633 
+333416.319672  7378813.575508 
+333404.148235  7378808.006462 
+333396.619427  7378797.618241 
+333390.863558  7378783.600642 
+333376.795488  7378764.603896 
+333356.781887  7378758.394960 
+333334.492325  7378754.045705 
+333291.587187  7378750.676282 
+333308.689870  7378736.358734 
+333319.137844  7378732.379416 
+333330.938200  7378717.341992 
+333338.912305  7378706.583835 
+333344.618696  7378689.366784 
+333353.079329  7378671.519841 
+333358.290947  7378653.422941 
+333364.294203  7378636.765794 
+333372.062152  7378617.139156 
+333385.957051  7378597.472524 
+333393.947648  7378585.494576 
+333408.320828  7378559.079101 
+333414.546732  7378541.422125 
+333432.540008  7378510.957344 
+333446.764755  7378479.992648 
+333456.421092  7378446.988301 
+333461.946066  7378419.033089 
+333472.377548  7378389.798097 
+333483.072909  7378346.175569 
+333479.502291  7378343.745985 
+333496.794637  7378354.994059 
+333560.034980  7378351.344684 
+333583.718154  7378349.954922 
+333711.963533  7378342.746157 
+333788.076242  7378338.436895 
+333808.213537  7378334.927496 
+333902.393737  7378308.392041 
+333933.011992  7378313.891099 
+333951.013513  7378327.608750 
+333971.192040  7378338.136946 
+334000.070339  7378354.194196 
+334029.484644  7378333.157799 
+334042.464211  7378321.899728 
+334050.537271  7378302.493052 
+334050.652718  7378283.336333 
+334046.529603  7378260.580231 
+334038.736915  7378246.432654 
+334024.198810  7378223.886516 
+334011.878942  7378204.369859 
+334000.870224  7378186.302954 
+333989.803782  7378163.576847 
+333984.666381  7378140.480803 
+333982.217250  7378122.623862 
+333983.445938  7378095.608489 
+333984.633396  7378072.142509 
+333989.193561  7378047.386749 
+334009.726676  7378000.004865 
+334014.996017  7377984.887455 
+334021.576509  7377971.449756 
+334030.771056  7377961.031541 
+334045.490578  7377949.683485 
+334063.038557  7377940.245102 
+334087.488631  7377933.436268 
+334112.334523  7377927.627263 
+334123.483427  7377924.657771 
+334132.108985  7377919.878590 
+334136.528964  7377916.499169 
+334142.111662  7377910.250239 
+334146.680074  7377903.321426 
+334151.776245  7377894.522933 
+334157.391928  7377884.844591 
+334159.907028  7377870.357073 
+334160.962546  7377848.770770 
+334165.506219  7377834.983132 
+334168.334676  7377828.704207 
+334170.660113  7377821.305475 
+334175.434680  7377814.166698 
+334182.559424  7377806.268051 
+334191.184981  7377801.498867 
+334202.638995  7377798.749338 
+334213.326110  7377800.529034 
+334224.697662  7377805.088253 
+334239.194536  7377812.347009 
+334252.891525  7377818.705920 
+334267.091534  7377825.614737 
+334283.171684  7377828.464249 
+334302.459617  7377827.464420 
+334324.510038  7377825.944680 
+334346.684152  7377821.655415 
+334373.525633  7377811.107222 
+334380.955487  7377803.218573 
+334385.548637  7377794.300101 
+334387.354562  7377788.231140 
+334388.368848  7377779.602618 
+334387.338069  7377771.394024 
+334382.497532  7377757.936329 
+334371.661985  7377741.859083 
+334364.570226  7377719.962834 
+334334.850811  7377678.759892 
+334324.435822  7377662.022758 
+334317.690405  7377645.665560 
+334314.853702  7377634.997388 
+334314.853702  7377626.358867 
+334318.399581  7377619.310075 
+334328.822817  7377608.131989 
+334341.324102  7377603.292818 
+334355.820976  7377601.573113 
+334372.758734  7377601.103193 
+334382.472793  7377599.113534 
+334390.875702  7377595.004238 
+334408.877224  7377581.916480 
+334420.801273  7377573.517919 
+334428.437283  7377565.409307 
+334430.548318  7377559.570308 
+334431.257494  7377551.161748 
+334429.814403  7377543.053137 
+334427.505459  7377539.933671 
+334414.781525  7377528.705595 
+334398.330295  7377523.096555 
+334381.260597  7377517.247557 
+334369.600427  7377511.358566 
+334361.510875  7377505.509568 
+334356.381719  7377499.360621 
+334353.182182  7377493.561614 
+334351.137117  7377484.683135 
+334352.662669  7377476.054613 
+334355.928177  7377467.566067 
+334361.321212  7377459.207499 
+334365.881377  7377452.948571 
+334385.202296  7377431.132308 
+334399.229134  7377417.444652 
+334415.185590  7377404.006954 
+334424.627524  7377398.687865 
+334435.314639  7377391.499097 
+334470.311642  7377372.072424 
+334489.401666  7377361.654209 
+334501.622580  7377354.265475 
+334515.113413  7377343.117384 
+334520.894021  7377336.758473 
+334527.029216  7377326.420244 
+334531.127593  7377315.942039 
+334531.853261  7377305.543820 
+334531.696583  7377292.586040 
+334529.865920  7377282.927694 
+334525.116091  7377261.381385 
+334522.782408  7377251.723039 
+334517.463589  7377235.165875 
+334514.206328  7377225.267571 
+334511.691227  7377213.499586 
+334511.979846  7377205.860895 
+334515.237107  7377197.482330 
+334519.071604  7377191.983272 
+334523.837925  7377185.724344 
+334534.104482  7377179.755367 
+334550.580451  7377183.594709 
+334565.308219  7377188.963789 
+334578.221816  7377192.543176 
+334587.688489  7377193.652986 
+334595.745056  7377193.852952 
+334605.970382  7377191.093424 
+334616.888392  7377181.695034 
+334626.305587  7377169.727084 
+334631.830562  7377159.378857 
+334644.843114  7377145.131297 
+334665.656600  7377144.261446 
+334687.756498  7377146.831006 
+334710.664527  7377150.200429 
+334733.539571  7377156.329379 
+334751.788479  7377157.089249 
+334773.137970  7377153.789814 
+334806.353787  7377147.520888 
+334835.372273  7377142.311780 
+334967.435657  7377115.566362 
+334980.926490  7377112.066961 
+334980.918244  7377112.066961 
+334991.316741  7377105.758042 
+334992.199087  7377104.768211 
+334997.179811  7377099.159172 
+335001.253448  7377092.160371 
+335001.756469  7377091.290520 
+335002.226504  7377088.540991 
+335003.521162  7377080.872304 
+335004.824066  7377065.384957 
+335003.892242  7377059.625944 
+335001.822438  7377047.058096 
+334997.006640  7377032.050667 
+334995.266685  7377029.091174 
+334991.135323  7377022.142364 
+334985.074344  7377017.313191 
+334976.250877  7377013.223892 
+334949.030070  7377003.275596 
+334931.506830  7376997.406601 
+334928.538187  7376996.416771 
+334908.763726  7376990.877720 
+334900.063952  7376985.338668 
+334893.450475  7376979.979586 
+334893.450475  7376979.969588 
+334893.409244  7376979.939593 
+334893.244319  7376979.309701 
+334891.677536  7376974.130588 
+334891.388918  7376972.080939 
+334891.355933  7376971.940963 
+334891.364179  7376971.930965 
+334891.355933  7376971.890972 
+334899.750595  7376959.803042 
+334910.338756  7376949.744765 
+334920.588820  7376942.665978 
+334927.754795  7376940.956271 
+334931.490337  7376940.056425 
+334936.223674  7376939.866457 
+334946.580939  7376939.416534 
+334946.704633  7376939.446529 
+335006.902116  7376936.047112 
+335037.437909  7376932.407735 
+335060.321199  7376928.788355 
+335077.935147  7376922.119497 
+335090.865237  7376915.070705 
+335098.583709  7376908.621809 
+335107.060834  7376898.413558 
+335110.466527  7376886.495599 
+335110.202648  7376873.647800 
+335102.525407  7376812.858213 
+335097.313789  7376796.081086 
+335089.562332  7376778.604080 
+335073.028640  7376752.828495 
+335064.122711  7376737.561110 
+335053.031531  7376726.353030 
+335018.504563  7376704.916702 
+335008.369946  7376698.827745 
+334966.907898  7376677.421412 
+334939.794291  7376658.504652 
+334917.752117  7376641.977483 
+334902.793455  7376629.729581 
+334888.783109  7376615.172075 
+334848.747659  7376566.870348 
+334811.416973  7376531.896339 
+334762.516825  7376491.463265 
+334732.813902  7376467.427382 
+334677.861021  7376429.753835 
+334677.729082  7376429.733838 
+334677.712589  7376429.663850 
+334609.211151  7376387.381093 
+334537.130849  7376350.347437 
+334482.004797  7376319.262761 
+334443.156805  7376301.425816 
+334379.974185  7376279.439582 
+334325.887159  7376265.531965 
+334287.608156  7376260.112893 
+334256.833223  7376257.993256 
+334258.375268  7376230.098034 
+334256.157032  7376209.691530 
+334205.203573  7376198.253489 
+334174.181253  7376191.254688 
+334145.929667  7376182.516185 
+334120.531277  7376174.257599 
+334091.850887  7376158.420312 
+334059.542155  7376139.553544 
+334038.769900  7376127.905539 
+334009.941077  7376089.152177 
+333943.979479  7376043.430009 
+333904.405818  7376008.525988 
+333857.014730  7375961.694009 
+333820.549898  7375922.620702 
+333745.781325  7375835.155684 
+333672.983601  7375754.579486 
+333601.150686  7375669.354085 
+333522.638324  7375579.849416 
+333462.341885  7375511.491125 
+333394.269251  7375428.195393 
+333272.381716  7375297.987696 
+333205.240906  7375230.539250 
+333106.162445  7375156.521928 
+333009.277481  7375104.910769 
+332916.284738  7375060.418390 
+332833.014301  7375030.663487 
+332694.823968  7374980.122144 
+332582.477321  7374942.938513 
+332483.291659  7374913.883490 
+332372.866385  7374879.519376 
+332265.450984  7374847.014944 
+332150.374835  7374807.811659 
+331944.796305  7374730.004987 
+331819.206213  7374674.724456 
+331712.277340  7374601.267038 
+331634.944189  7374569.692447 
+331530.711834  7374774.047443 
+331443.450221  7374903.835211 
+331372.046110  7375002.798260 
+331209.339733  7375201.484226 
+330939.391126  7375502.262706 
+330462.791980  7375946.156671 
+330184.976469  7376193.664275 
+330072.497883  7376332.340521 
+329930.068988  7376486.844056 
+329833.423164  7376649.296229 
+329721.117749  7376895.304090 
+329682.426435  7377011.584173 
+329651.247437  7377095.949722 
+329625.543936  7377174.836209 
+329523.727726  7377438.361070 
+329448.060314  7377568.498778 
+329364.963048  7377635.747259 
+329328.960005  7377646.825362 
+329315.345478  7377648.785026 
+329290.639771  7377651.264601 
+329205.530424  7377655.693843 
+329087.287723  7377676.120344 
+328936.010622  7377704.465488 
+328734.926287  7377762.125612 
+328532.489571  7377825.134819 
+328426.319352  7377864.928003 
+328171.106759  7377971.119813 
+328187.252879  7378037.428455 
+328188.184703  7378053.835644 
+328195.507356  7378089.689503 
+328196.736044  7378124.263581 
+328230.710515  7378149.259299 
+328258.830161  7378151.468921 
+328286.982792  7378151.248958 
+328300.580827  7378156.838001 
+328307.416952  7378165.116583 
+328324.173293  7378179.934045 
+328332.724634  7378198.860803 
+328346.718487  7378222.726715 
+328355.764602  7378234.354723 
+328383.133842  7378282.746434 
+328416.209473  7378349.924927 
+328417.710287  7378369.661546 
+328414.312840  7378389.548140 
+328409.505287  7378398.796556 
+328398.422353  7378413.404054 
+328390.712128  7378427.481642 
+328385.698420  7378446.148445 
+328385.046967  7378466.624937 
+328390.621419  7378477.992990 
+328403.716434  7378492.210555 
+328413.818066  7378500.419149 
+328442.943753  7378512.947003 
+328472.316826  7378521.705503 
+328488.825780  7378522.565355 
+328509.655759  7378520.925636 
+328526.445084  7378515.476570 
+328546.376224  7378512.057155 
+328572.285880  7378511.257292 
+328591.755231  7378512.377100 
+328610.045371  7378518.236097 
+328626.034812  7378520.635686 
+328645.594871  7378522.535360 
+328665.699181  7378521.665509 
+328679.214753  7378517.166280 
+328690.396642  7378511.427263 
+328728.040685  7378501.908894 
+328749.959166  7378503.048698 
+328761.561612  7378505.068352 
+328773.254767  7378508.197816 
+328783.348154  7378517.396241 
+328800.525052  7378530.893929 
+328818.765714  7378540.852223 
+328834.647955  7378552.010312 
+328870.923123  7378589.313922 
+328900.725001  7378613.589764 
+328964.707504  7378690.456597 
+329001.518678  7378733.069298 
+329024.212305  7378754.705592 
+329041.653083  7378763.444095 
+329060.998740  7378766.773525 
+329094.552652  7378767.053477 
+329130.844313  7378768.253271 
+329156.011809  7378770.432898 
+329180.371175  7378771.832658 
+329197.844937  7378778.011600 
+329217.050408  7378792.529113 
+329239.323477  7378806.856659 
+329248.955075  7378811.955785 
+329260.574014  7378820.844263 
+329270.164380  7378829.482783 
+329275.912003  7378835.311785 
+329282.401786  7378847.239742 
+329296.321424  7378860.467476 
+329317.217372  7378876.654703 
+329332.406929  7378888.252716 
+329343.770235  7378901.890380 
+329345.526682  7378908.999163 
+329349.756998  7378921.896953 
+329351.983481  7378932.005222 
+329359.809153  7378938.174165 
+329365.828902  7378942.913354 
+329377.728213  7378946.262780 
+329385.809519  7378952.891644 
+329396.933684  7378961.110237 
+329425.746014  7378982.936498 
+329443.681565  7378992.674830 
+329467.562649  7379000.703455 
+329481.193669  7379008.162177 
+329507.993918  7379022.659694 
+329528.254907  7379034.637642 
+329548.235524  7379052.934508 
+329626.954041  7379150.877731 
+329661.192391  7379206.098272 
+329689.740842  7379269.147473 
+329721.101257  7379307.260944 
+329738.921361  7379301.042009 
+329760.584209  7379288.894090 
+329789.479001  7379269.077485 
+329849.684731  7379240.982297 
+329900.654683  7379251.880430 
+329911.877803  7379251.900427 
+329934.926017  7379251.840437 
+329950.940197  7379251.910425 
+329976.651944  7379251.110562 
+329998.207591  7379248.481013 
+330018.806676  7379248.610990 
+330051.371040  7379246.551343 
+330065.059783  7379244.611675 
+330077.552823  7379240.322410 
+330090.367465  7379234.823352 
+330109.193610  7379221.315666 
+330122.255639  7379211.607329 
+330136.810236  7379205.688343 
+330158.695732  7379200.959153 
+330179.525711  7379198.539567 
+330205.377644  7379202.398906 
+330223.197748  7379206.138265 
+330240.679757  7379211.547339 
+330264.016590  7379213.267044 
+330284.294071  7379215.156721 
+330301.132874  7379214.536827 
+330318.375742  7379213.896936 
+330336.649390  7379212.447185 
+330367.143951  7379209.247733 
+330388.312025  7379207.957954 
+330409.331667  7379215.736621 
+330475.078863  7379219.156036 
+330524.242891  7379194.360283 
+330587.483233  7379154.867048 
+330609.203805  7379142.299201 
+330688.260418  7379193.260471 
+330768.842584  7379246.821297 
+330874.748924  7379314.849644 
+330907.527691  7379332.186675 
+330931.606685  7379346.214272 
+331073.623269  7379439.518290 
+331105.412488  7379458.115104 
+331155.739234  7379501.247716 
+331424.887956  7379643.283386 
+331459.249999  7379662.190148 
+331466.762315  7379602.090442 
+331489.299263  7379573.545332 
+331523.859216  7379502.927428 
+331607.781105  7379390.656659 
+331647.461967  7379361.291689 
+331670.782307  7379346.354248 
+331743.489323  7379296.212837 
+331779.426396  7379271.817015 
+331783.351602  7379258.149356 
+331797.452656  7379193.040509 
+331803.843485  7379173.823801 
+331814.118288  7379145.428664 
+331841.899839  7379042.256337 
+331882.372339  7379052.574570 
+331938.718833  7379060.513210 
+331962.641149  7379060.843153 
+332011.895884  7379048.615248 
+332081.848659  7379036.437334 
+332108.558200  7379031.718142 
+332168.351618  7379022.489723 
+332172.557196  7378975.767726 
+332179.236643  7378958.000769 
+332195.085898  7378932.625116 
+332213.491485  7378906.509589 
+332251.828211  7378848.689493 
+332271.058421  7378852.268880 
+332304.637072  7378865.676583 
+332327.817227  7378882.843643 
+332360.051742  7378862.427140 
+332382.621675  7378836.631559 
+332396.590790  7378801.167633 
+332419.160723  7378758.184996 
+332439.578390  7378678.668616 
+332498.349276  7378707.203728 
+332529.445812  7378718.301827 
+332559.923881  7378742.567671 
+332591.943994  7378742.567671 
+332645.486770  7378750.066386 
+332771.555144  7378760.504598 
+332844.509546  7378799.247962 
+332946.416465  7378820.684290 
+333003.554597  7378827.413138 
+333055.637790  7378832.452275 
+333156.464452  7378808.926304 
+333201.835213  7378820.684290 
+333263.418063  7378877.494559 
+333277.444902  7378918.147596 
+333275.762671  7378968.568959 
+333270.245942  7379020.010148 
+Region 1
+596
+338743.500117  7387764.332324 
+338720.080822  7387611.578490 
+338700.190914  7387481.440781 
+338678.486835  7387340.214972 
+338665.993795  7387260.778579 
+338655.413881  7387193.770056 
+338635.969269  7387059.992971 
+338614.199221  7386925.186062 
+338591.225222  7386778.851128 
+338586.854720  7386746.856609 
+338585.675509  7386735.818499 
+338584.941594  7386719.201346 
+338585.155996  7386700.264589 
+338581.849258  7386684.007374 
+338570.560168  7386626.117290 
+338561.439837  7386574.626110 
+338552.096858  7386533.883089 
+338547.347029  7386501.488638 
+338543.124959  7386459.355855 
+338540.214039  7386426.981400 
+338535.002421  7386400.565925 
+338527.415889  7386366.701726 
+338525.659442  7386359.263000 
+338525.189407  7386355.603627 
+338520.678719  7386348.244887 
+338503.336896  7386329.668069 
+338496.195660  7386319.949734 
+338492.517841  7386311.161239 
+338490.332590  7386287.215341 
+338491.693218  7386275.377369 
+338494.340258  7386266.108956 
+338500.434222  7386250.231676 
+338509.760709  7386228.845339 
+338523.119603  7386210.718444 
+338532.619261  7386200.860133 
+338547.495461  7386184.522931 
+338565.859816  7386166.336047 
+338584.265403  7386144.389806 
+338603.545091  7386126.552861 
+338616.532904  7386114.624904 
+338628.910496  7386102.906911 
+338639.020375  7386093.058598 
+338652.024680  7386079.130984 
+338664.633167  7386064.983407 
+338675.221327  7386048.606213 
+338682.898568  7386027.869765 
+338689.396598  7386012.322428 
+338692.356995  7385994.305514 
+338694.187658  7385975.938660 
+338693.470236  7385957.871755 
+338688.085447  7385927.916886 
+338680.754548  7385889.623445 
+338676.581955  7385870.526716 
+338670.809594  7385847.760616 
+338666.620509  7385830.323603 
+338664.278579  7385820.665257 
+338661.903665  7385804.138088 
+338658.333047  7385785.711244 
+338654.127469  7385769.494022 
+338651.249535  7385753.186815 
+338645.254525  7385723.321931 
+338639.078098  7385691.137444 
+338632.118280  7385664.921934 
+338626.469612  7385640.936043 
+338620.474602  7385619.939639 
+338615.996899  7385611.541078 
+338607.890854  7385595.213875 
+338596.131729  7385579.576553 
+338581.898735  7385565.358989 
+338568.869691  7385553.361044 
+338552.781295  7385540.783198 
+338531.563743  7385531.464794 
+338504.194504  7385515.327558 
+338477.748842  7385498.530436 
+338461.553245  7385486.832439 
+338443.650678  7385472.014978 
+338427.512805  7385455.327836 
+338411.943921  7385442.420047 
+338399.013832  7385430.102157 
+338387.873174  7385413.804948 
+338369.104753  7385385.239841 
+338358.425885  7385363.643541 
+338349.231337  7385337.398036 
+338342.296257  7385318.381294 
+338340.647011  7385309.062890 
+338338.750378  7385297.744828 
+338336.853745  7385275.908569 
+338338.098926  7385246.353631 
+338341.100554  7385224.347401 
+338346.773961  7385199.821602 
+338352.002071  7385179.605065 
+338357.799171  7385162.837937 
+338363.579779  7385147.400581 
+338367.834834  7385132.163191 
+338375.042039  7385107.987332 
+338381.861672  7385081.591853 
+338392.301400  7385042.168606 
+338397.513018  7385022.961896 
+338403.433811  7385004.305092 
+338409.247404  7384985.658286 
+338414.170404  7384965.551730 
+338418.450197  7384947.544815 
+338422.738237  7384928.548068 
+338428.221981  7384912.770771 
+338433.779940  7384889.794707 
+338439.255437  7384874.567315 
+338445.464849  7384848.501780 
+338451.377396  7384830.184917 
+338456.267411  7384812.517943 
+338461.173918  7384793.521197 
+338468.958360  7384762.816457 
+338472.949536  7384743.259807 
+338476.025380  7384723.693158 
+338478.680666  7384705.006359 
+338481.360691  7384693.848270 
+338485.896118  7384679.940653 
+338488.823530  7384664.363321 
+338492.526087  7384643.916823 
+338489.540952  7384636.678063 
+338488.023645  7384626.699772 
+338488.460696  7384614.521858 
+338488.617374  7384600.234306 
+338486.366153  7384582.487346 
+338482.762550  7384566.830028 
+338478.853837  7384551.612634 
+338474.038038  7384534.725527 
+338470.706561  7384522.177676 
+338466.435014  7384511.939430 
+338463.103536  7384500.051466 
+338459.277285  7384485.613939 
+338453.727572  7384471.266397 
+338446.207010  7384450.359978 
+338440.987146  7384432.802985 
+338433.788186  7384410.346832 
+338427.941609  7384394.779498 
+338420.734403  7384373.213192 
+338414.294097  7384355.976145 
+338410.063781  7384341.978543 
+338408.051701  7384329.770634 
+338406.649841  7384318.232610 
+338404.530560  7384307.024530 
+338399.978641  7384294.796624 
+338392.911621  7384278.209466 
+338385.333335  7384262.292192 
+338379.429034  7384252.593853 
+338372.065150  7384244.425253 
+338366.853532  7384236.506609 
+338361.551206  7384226.478327 
+338354.822282  7384217.429877 
+338350.517749  7384209.631212 
+338350.286855  7384203.092332 
+338351.581513  7384196.463468 
+338354.195568  7384190.624468 
+338358.335176  7384185.355371 
+338365.558874  7384178.016628 
+338375.973863  7384168.158316 
+338352.381397  7384142.532706 
+338295.103079  7384100.149966 
+338229.273420  7384065.745859 
+338211.502793  7384049.048719 
+338198.185131  7384035.501039 
+338179.391971  7384018.903882 
+338159.378369  7384001.736823 
+338143.792993  7383990.598731 
+338122.979507  7383971.981920 
+338105.076940  7383958.044307 
+338086.077625  7383942.217018 
+338062.905717  7383924.240097 
+338045.613371  7383910.872387 
+338019.893378  7383892.865472 
+338008.167238  7383883.097145 
+337989.571988  7383867.719779 
+337974.299969  7383855.591856 
+337958.747578  7383840.794391 
+337939.830724  7383826.626818 
+337918.002952  7383807.670065 
+337900.537435  7383791.082906 
+337885.479818  7383777.955155 
+337869.119297  7383763.377652 
+337850.631248  7383747.000457 
+337825.422520  7383729.223502 
+337804.872914  7383714.266064 
+337778.897287  7383701.568239 
+337746.835942  7383685.490993 
+337736.495169  7383680.051925 
+337715.953809  7383664.434600 
+337693.235443  7383652.216692 
+337675.415339  7383640.608681 
+337655.409983  7383631.530236 
+337637.746557  7383624.021522 
+337620.932493  7383613.203375 
+337601.990901  7383600.585536 
+337575.660687  7383583.238508 
+337554.970894  7383572.150407 
+337527.007926  7383554.673401 
+337504.116390  7383539.915929 
+337487.491989  7383529.867650 
+337456.453176  7383513.570441 
+337435.590213  7383499.942776 
+337408.930149  7383484.695387 
+337396.585542  7383475.356987 
+337378.468573  7383462.089260 
+337361.151489  7383450.931171 
+337338.960882  7383437.503471 
+337316.836245  7383427.175240 
+337291.347146  7383415.927167 
+337266.913565  7383402.479470 
+337247.980219  7383389.641669 
+337227.925386  7383376.453928 
+337216.100292  7383366.465639 
+337201.240584  7383354.227735 
+337180.938364  7383335.730904 
+337165.179817  7383321.933267 
+337138.907327  7383308.455576 
+337120.501740  7383303.156483 
+337097.700912  7383298.357305 
+337066.084864  7383288.039073 
+337046.640252  7383284.059754 
+337019.048364  7383279.650510 
+336999.999571  7383276.781001 
+336987.061235  7383275.191274 
+336967.270282  7383274.721354 
+336951.280841  7383272.691702 
+336912.935868  7383271.151965 
+336892.625402  7383271.921834 
+336878.425393  7383273.761518 
+336861.388680  7383273.011647 
+336852.045701  7383269.362272 
+336840.682395  7383264.143166 
+336836.254169  7383258.554123 
+336827.142085  7383252.135223 
+336818.541266  7383237.087800 
+336811.284583  7383228.929198 
+336801.479815  7383220.730602 
+336791.130795  7383215.741457 
+336779.973645  7383209.742484 
+336773.475616  7383207.012952 
+336758.533446  7383201.973815 
+336747.467004  7383196.974671 
+336742.189416  7383194.485098 
+336731.535286  7383189.485954 
+336721.524362  7383181.517319 
+336714.036785  7383175.888283 
+336708.726212  7383167.189773 
+336704.009369  7383160.610900 
+336693.495424  7383151.632438 
+336679.889144  7383146.163375 
+336667.495059  7383141.144235 
+336654.573216  7383138.234733 
+336638.583775  7383136.065105 
+336616.566339  7383133.935469 
+336594.730320  7383134.465379 
+336569.966889  7383068.506677 
+336566.313809  7383057.608543 
+336559.403468  7383045.900549 
+336552.204509  7383033.202724 
+336544.246896  7383023.694353 
+336532.974299  7383010.386632 
+336527.276153  7382999.688465 
+336521.602747  7382987.340580 
+336513.669873  7382975.622587 
+336505.934908  7382965.124385 
+336495.437457  7382954.926132 
+336481.385880  7382943.358114 
+336456.416293  7382931.890078 
+336434.349380  7382925.551164 
+336412.018588  7382924.971263 
+336383.263981  7382932.180028 
+336366.202530  7382934.309663 
+336348.060823  7382942.078333 
+336334.363834  7382944.257959 
+336321.392513  7382945.547738 
+336307.390413  7382948.377254 
+336293.916072  7382948.677202 
+336281.489003  7382947.317435 
+336271.403863  7382945.647721 
+336262.242300  7382944.217966 
+336251.316045  7382944.867855 
+336241.882357  7382949.307095 
+336234.889553  7382953.986293 
+336227.814287  7382956.895795 
+336219.114514  7382959.575336 
+336210.752836  7382959.475353 
+336202.440636  7382954.396223 
+336193.996495  7382943.338117 
+336189.469315  7382937.749074 
+336182.921808  7382930.150376 
+336169.645376  7382922.581672 
+336159.469528  7382919.912130 
+336152.130382  7382919.832143 
+336138.952906  7382921.231904 
+336126.171248  7382923.301549 
+336117.809571  7382923.211564 
+336102.331396  7382920.931955 
+336087.908738  7382915.012969 
+336076.685618  7382906.024508 
+336065.182127  7382894.926409 
+336052.062374  7382881.938634 
+336039.602319  7382865.401467 
+336029.409978  7382854.883268 
+336018.129134  7382842.125454 
+336003.599276  7382827.787910 
+335982.686835  7382800.972503 
+335963.135022  7382779.046259 
+335950.444073  7382764.498751 
+335941.678330  7382754.770417 
+335934.314446  7382738.513202 
+335929.300738  7382731.144464 
+335921.186447  7382726.955181 
+335911.612573  7382725.295466 
+335898.476328  7382723.155832 
+335882.371439  7382713.117552 
+335876.516616  7382707.408530 
+335867.338561  7382698.220103 
+335855.134140  7382694.320771 
+335841.816477  7382690.291462 
+335832.069432  7382677.333681 
+335828.061764  7382670.974770 
+335822.107986  7382664.815825 
+335809.722147  7382659.586721 
+335801.409947  7382654.507591 
+335795.365460  7382647.788742 
+335788.100531  7382640.949913 
+335779.277064  7382636.200727 
+335762.380537  7382633.241234 
+335747.916649  7382630.751660 
+335731.407695  7382629.021956 
+335718.502344  7382625.102628 
+335696.757034  7382617.213979 
+335687.743904  7382611.025039 
+335677.452608  7382601.386690 
+335665.116247  7382591.278422 
+335652.903579  7382579.510437 
+335638.035625  7382568.492325 
+335619.357913  7382560.193746 
+335603.681828  7382556.694346 
+335588.706674  7382554.974640 
+335576.279604  7382553.504892 
+335562.162057  7382548.025830 
+335555.688766  7382542.636753 
+335545.067621  7382534.438158 
+335529.251351  7382526.169574 
+335515.183281  7382516.151290 
+335499.251563  7382508.332629 
+335482.602424  7382501.383820 
+335461.879646  7382493.515168 
+335443.474059  7382488.206077 
+335432.316909  7382482.767009 
+335424.590191  7382478.787690 
+335422.784267  7382477.567899 
+335402.061489  7382469.689249 
+335387.935696  7382464.990054 
+335374.684003  7382463.840251 
+335361.498281  7382466.129858 
+335352.237764  7382472.888701 
+335343.801870  7382479.327598 
+335334.005348  7382488.296062 
+335323.870730  7382500.813917 
+335315.170957  7382512.011999 
+335306.899987  7382521.550365 
+335293.623556  7382541.007033 
+335290.077677  7382556.584364 
+335289.904506  7382572.081710 
+335289.384994  7382590.908485 
+335286.655491  7382606.825758 
+335278.846311  7382620.913345 
+335270.080568  7382629.121939 
+335260.086136  7382637.540497 
+335245.506800  7382646.229009 
+335225.856033  7382669.375044 
+335159.308951  7382708.718305 
+335206.831979  7382725.045509 
+335219.242556  7382731.934329 
+335235.965911  7382743.132410 
+335248.120855  7382756.100189 
+335290.127154  7382820.169215 
+335346.053091  7382912.973318 
+335370.841260  7382956.435873 
+335435.871035  7383066.267060 
+335439.153035  7383080.244666 
+335438.872663  7383099.031448 
+335435.532939  7383128.746358 
+335427.352678  7383173.178747 
+335408.996569  7383235.878008 
+335373.603747  7383344.789352 
+335360.607688  7383385.402395 
+335357.012331  7383419.176610 
+335356.748452  7383425.265567 
+335357.243226  7383433.404173 
+335361.028245  7383446.871866 
+335366.841838  7383465.418689 
+335390.599228  7383523.108808 
+335409.549067  7383571.910448 
+335423.922247  7383633.139960 
+335444.875919  7383699.718556 
+335461.285918  7383754.099241 
+335459.207867  7383809.319782 
+335458.399737  7383821.907626 
+335449.452577  7383855.151932 
+335442.583466  7383885.426746 
+335427.847452  7383934.318371 
+335421.200990  7383953.625064 
+335417.086121  7383974.511486 
+335417.292277  7383992.788356 
+335418.430257  7384000.007119 
+335424.953025  7384027.982327 
+335433.199256  7384056.767397 
+335441.222838  7384078.123738 
+335454.268375  7384106.728839 
+335472.698701  7384136.953661 
+335481.348997  7384150.691308 
+335495.202664  7384183.705653 
+335509.311965  7384216.729996 
+335521.112321  7384247.474730 
+335536.466802  7384275.149990 
+335542.618490  7384287.587859 
+335545.240792  7384309.204156 
+335546.337540  7384329.260721 
+335552.299565  7384359.035621 
+335551.136847  7384389.060478 
+335545.883998  7384408.157207 
+335409.177986  7384671.312131 
+335416.748026  7384693.818276 
+335473.020304  7384709.575576 
+335616.570687  7384741.780060 
+335624.808671  7384753.278091 
+335633.665123  7384772.534792 
+335636.138992  7384797.820461 
+335637.392419  7384813.227822 
+335642.340158  7384826.905479 
+335650.149338  7384849.471614 
+335657.158634  7384867.748483 
+335658.964559  7384872.607651 
+335665.322402  7384906.241889 
+335667.004634  7384928.738036 
+335668.488955  7384951.464143 
+335672.669794  7384978.309545 
+335674.698367  7384998.046164 
+335680.223341  7385023.581790 
+335685.072125  7385036.599560 
+335687.430547  7385053.796615 
+335691.298029  7385063.694919 
+335691.652617  7385077.982472 
+335692.048436  7385087.620821 
+335695.577823  7385100.838557 
+335700.517315  7385114.966137 
+335715.154374  7385138.392124 
+335726.352755  7385158.778632 
+335730.508856  7385169.906726 
+335736.841961  7385187.473717 
+335742.037086  7385197.052076 
+335746.696207  7385209.289980 
+335757.185412  7385220.268099 
+335761.201326  7385225.847144 
+335766.915964  7385234.775614 
+335777.396923  7385247.073508 
+335783.136300  7385253.232453 
+335792.908083  7385264.410538 
+335802.242816  7385287.226630 
+335809.656177  7385299.714491 
+335814.554438  7385308.852926 
+335837.371759  7385330.429230 
+335850.384311  7385343.916920 
+335864.229732  7385373.421866 
+335877.819520  7385435.491234 
+335882.940429  7385470.095306 
+335883.575389  7385494.801074 
+335884.523706  7385519.846784 
+335884.334042  7385536.233977 
+335884.969002  7385562.049555 
+335882.965168  7385576.647055 
+335875.576545  7385598.043390 
+335864.625551  7385619.079787 
+335865.936702  7385637.856570 
+335866.274797  7385645.125325 
+335860.090124  7385668.531316 
+335849.848306  7385690.347579 
+335839.276638  7385722.412087 
+335834.741211  7385736.359698 
+335824.062342  7385766.224582 
+335820.203106  7385776.512820 
+335812.253740  7385802.668340 
+335795.884972  7385833.823003 
+335786.913073  7385851.559965 
+335781.668471  7385864.127812 
+335777.034089  7385885.784103 
+335776.267190  7385900.001667 
+335776.283682  7385907.260424 
+335768.301331  7385936.735375 
+335762.421768  7385950.962938 
+335755.890754  7385968.829878 
+335747.842433  7385994.985397 
+335739.967282  7386051.495718 
+335730.682027  7386078.631070 
+335725.330223  7386096.388028 
+335723.582022  7386101.697119 
+335721.314309  7386131.022096 
+335720.671103  7386142.650104 
+335720.275284  7386168.885610 
+335713.290726  7386181.883383 
+335705.720686  7386192.651539 
+335699.437059  7386224.586069 
+335696.773526  7386234.634348 
+335685.393728  7386248.461979 
+335667.994181  7386262.329604 
+335659.714966  7386272.867799 
+335655.624835  7386291.764562 
+335658.271875  7386300.873002 
+335667.169558  7386317.360178 
+335666.880940  7386333.867350 
+335657.224604  7386359.882894 
+335609.206803  7386351.254372 
+335604.118879  7386408.534560 
+335575.966247  7386627.277092 
+335555.482610  7386625.667367 
+335545.661350  7386649.693252 
+335586.818287  7386810.195759 
+335612.175446  7386842.040305 
+335658.750157  7386901.710084 
+335706.627772  7386981.436427 
+335725.008620  7387016.980339 
+335743.834764  7387057.723360 
+335771.937919  7387135.460044 
+335775.005516  7387143.828611 
+335785.544199  7387169.384234 
+335819.576393  7387280.885134 
+335852.569562  7387388.436712 
+335905.188760  7387546.629615 
+335980.353152  7387768.871547 
+335990.487769  7387793.347354 
+336023.934481  7387843.478767 
+336048.689665  7387909.117524 
+336111.567174  7388102.904330 
+336144.799483  7388227.602970 
+336166.058266  7388292.981771 
+336167.888929  7388302.700107 
+336183.342365  7388330.265385 
+336207.751208  7388379.416966 
+336235.079217  7388434.747488 
+336242.987352  7388445.865584 
+336259.562275  7388469.141597 
+336281.818852  7388499.656370 
+336304.652665  7388527.641576 
+336328.541995  7388554.127040 
+336479.134659  7388718.998799 
+336530.228304  7388709.440436 
+336563.048302  7388711.410098 
+336619.947293  7388718.488886 
+336642.706890  7388726.357538 
+336662.407135  7388734.166201 
+336692.077073  7388751.873168 
+336723.668382  7388775.199172 
+336745.092090  7388798.065255 
+336799.591428  7388845.577117 
+336827.686336  7388877.241693 
+336846.702144  7388893.438919 
+336864.109937  7388912.895586 
+336887.603448  7388945.490003 
+336918.906139  7388994.161666 
+336931.959922  7388979.284214 
+336946.893846  7388960.257473 
+336964.507795  7388934.411900 
+336986.813849  7388892.879014 
+337025.299007  7388832.599340 
+337043.490192  7388804.224200 
+337060.939216  7388774.299326 
+337065.177778  7388766.760617 
+337089.190802  7388740.275154 
+337109.196158  7388721.868307 
+337137.233342  7388697.532476 
+337171.207812  7388669.227324 
+337199.723278  7388646.421230 
+337289.813347  7388567.654722 
+337429.991022  7388450.814736 
+337437.536323  7388438.426858 
+337450.301488  7388425.209122 
+337462.778035  7388413.511126 
+337478.808708  7388396.254082 
+337492.118124  7388387.915510 
+337654.758531  7388252.148766 
+337687.949609  7388225.113397 
+337714.040683  7388204.017010 
+337778.468483  7388149.656322 
+337823.278500  7388113.222563 
+337858.770277  7388088.256839 
+337892.019079  7388071.899641 
+337926.834665  7388061.651396 
+337959.052688  7388055.032530 
+337980.336209  7388050.393325 
+338050.585848  7388041.094917 
+338298.294371  7387999.981960 
+338495.634916  7387957.429249 
+338523.878256  7387950.760391 
+338547.561431  7387941.062052 
+338757.485724  7387858.036274 
+338743.500117  7387764.332324 
+Region 1
+327
+338766.894673  7387919.095815 
+338757.485724  7387858.036274 
+338547.561431  7387941.062052 
+338523.878256  7387950.760391 
+338495.634916  7387957.429249 
+338298.294371  7387999.981960 
+338050.585848  7388041.094917 
+337980.336209  7388050.393325 
+337959.052688  7388055.032530 
+337926.834665  7388061.651396 
+337892.019079  7388071.899641 
+337858.770277  7388088.256839 
+337823.278500  7388113.222563 
+337778.468483  7388149.656322 
+337714.040683  7388204.017010 
+337687.949609  7388225.113397 
+337654.758531  7388252.148766 
+337492.118124  7388387.915510 
+337478.808708  7388396.254082 
+337462.778035  7388413.511126 
+337450.301488  7388425.209122 
+337437.536323  7388438.426858 
+337429.991022  7388450.814736 
+337289.813347  7388567.654722 
+337199.723278  7388646.421230 
+337171.207812  7388669.227324 
+337137.233342  7388697.532476 
+337109.196158  7388721.868307 
+337089.190802  7388740.275154 
+337065.177778  7388766.760617 
+337060.939216  7388774.299326 
+337043.490192  7388804.224200 
+337025.299007  7388832.599340 
+336986.813849  7388892.879014 
+336964.507795  7388934.411900 
+336946.893846  7388960.257473 
+336931.959922  7388979.284214 
+336918.906139  7388994.161666 
+336887.603448  7388945.490003 
+336864.109937  7388912.895586 
+336846.702144  7388893.438919 
+336827.686336  7388877.241693 
+336799.591428  7388845.577117 
+336745.092090  7388798.065255 
+336723.668382  7388775.199172 
+336692.077073  7388751.873168 
+336662.407135  7388734.166201 
+336642.706890  7388726.357538 
+336619.947293  7388718.488886 
+336563.048302  7388711.410098 
+336530.228304  7388709.440436 
+336479.134659  7388718.998799 
+336328.541995  7388554.127040 
+336304.652665  7388527.641576 
+336281.818852  7388499.656370 
+336259.562275  7388469.141597 
+336242.987352  7388445.865584 
+336235.079217  7388434.747488 
+336207.751208  7388379.416966 
+336183.342365  7388330.265385 
+336167.888929  7388302.700107 
+336166.058266  7388292.981771 
+336144.799483  7388227.602970 
+336111.567174  7388102.904330 
+336048.689665  7387909.117524 
+336023.934481  7387843.478767 
+335990.487769  7387793.347354 
+335946.642561  7387855.336736 
+335928.954396  7387876.073184 
+335912.321749  7387912.326974 
+335908.899563  7387952.930019 
+335910.433362  7387999.682011 
+335908.668669  7388029.606885 
+335909.460307  7388044.114400 
+335906.087599  7388055.782402 
+335897.651705  7388066.900497 
+335892.266916  7388074.989112 
+335882.989907  7388084.797432 
+335789.889963  7388108.613352 
+335744.403754  7388125.840401 
+335647.782670  7388131.539425 
+335630.539802  7388132.189314 
+335610.270567  7388130.019685 
+335570.787614  7388119.851427 
+335549.256706  7388117.671800 
+335537.852169  7388118.111725 
+335522.621381  7388120.801264 
+335506.623694  7388125.770413 
+335489.331348  7388133.029170 
+335473.548063  7388142.827492 
+335440.942467  7388167.263306 
+335414.711207  7388185.630160 
+335385.156716  7388207.276452 
+335375.483888  7388215.085114 
+335365.489456  7388230.522470 
+335356.253678  7388247.229608 
+335348.832070  7388267.336164 
+335344.832648  7388287.552701 
+335334.739262  7388357.100788 
+335328.942162  7388391.364919 
+335318.073630  7388462.682703 
+335314.841108  7388491.107834 
+335307.477224  7388530.951009 
+335296.377797  7388600.239141 
+335295.833546  7388606.838011 
+335276.817738  7388721.038449 
+335254.948734  7388848.176672 
+335241.548610  7388918.724587 
+335235.578339  7388940.790808 
+335227.802143  7388966.386423 
+335210.006777  7389011.748653 
+335208.472978  7389015.048088 
+335186.562744  7389070.288626 
+335151.293615  7389151.614695 
+335139.682922  7389182.779357 
+335124.501612  7389217.233456 
+335117.178959  7389249.697895 
+335117.393361  7389256.816675 
+335119.619843  7389264.445369 
+335123.619265  7389273.123882 
+335140.449822  7389296.099946 
+335152.200700  7389321.835538 
+335157.808137  7389354.389962 
+335156.958776  7389368.107612 
+335155.078635  7389383.854915 
+335150.361791  7389408.210743 
+335144.119394  7389431.786704 
+335133.259109  7389465.001015 
+335120.906255  7389492.356329 
+335109.848060  7389515.402382 
+335102.187312  7389524.750781 
+335092.530976  7389528.500138 
+335081.093454  7389533.509280 
+335054.153018  7389543.737528 
+335045.486230  7389550.286407 
+335038.600627  7389557.095240 
+335032.960205  7389566.473634 
+335030.098763  7389577.881680 
+335022.759618  7389614.665379 
+335012.278659  7389627.303214 
+335007.429875  7389631.592480 
+334998.029172  7389635.091880 
+334988.653208  7389636.041717 
+334978.007324  7389634.441991 
+334957.243316  7389631.262536 
+334929.610197  7389631.832438 
+334912.870348  7389632.992240 
+334892.263018  7389645.050174 
+334861.949874  7389665.936597 
+334832.626278  7389691.402235 
+334773.509050  7389737.764293 
+334746.733540  7389763.489887 
+334738.297646  7389773.338200 
+334730.612159  7389786.245989 
+334725.466511  7389796.124297 
+334722.613315  7389807.792298 
+334722.761747  7389823.289644 
+334723.891481  7389844.126074 
+334729.251531  7389876.430541 
+334733.902405  7389902.376097 
+334733.547817  7389917.113572 
+334731.172902  7389931.581094 
+334724.996476  7389944.998796 
+334712.297280  7389948.478200 
+334703.416090  7389949.178080 
+334665.928725  7389945.118775 
+334640.332426  7389940.829510 
+334640.818953  7389946.328568 
+334645.758445  7389969.414614 
+334648.801304  7389997.919731 
+334651.901887  7390022.095590 
+334653.056359  7390036.953045 
+334654.441726  7390058.669325 
+334656.511530  7390074.536607 
+334662.844635  7390110.490449 
+334665.928725  7390135.556155 
+334669.037554  7390158.292261 
+334676.038604  7390198.245417 
+334685.092965  7390236.778817 
+334694.196804  7390280.181382 
+334700.727819  7390307.506702 
+334715.199954  7390372.165626 
+334729.729812  7390426.156378 
+334751.541092  7390497.804105 
+334775.413930  7390544.526102 
+334821.106294  7390644.199029 
+334851.122573  7390700.939310 
+334864.836055  7390724.575262 
+334875.209813  7390746.171562 
+334883.959064  7390766.178135 
+334886.358717  7390771.667195 
+334892.749546  7390783.805116 
+334904.450947  7390805.421413 
+334927.861996  7390847.114272 
+334941.361075  7390872.179978 
+334954.208703  7390891.596652 
+334971.979330  7390909.193638 
+334980.984214  7390915.602540 
+334987.828585  7390924.650990 
+334994.046243  7390932.429658 
+335005.228132  7390941.618084 
+335015.486443  7390948.506904 
+335024.977854  7390952.946144 
+335037.536863  7390956.615515 
+335079.493685  7390965.963914 
+335100.315417  7390970.403153 
+335122.209160  7390974.532446 
+335146.865389  7390981.121317 
+335159.267720  7390984.790689 
+335169.963081  7390988.909983 
+335175.042759  7390990.459718 
+335190.199331  7390998.418355 
+335201.686331  7391006.686938 
+335214.698883  7391018.934840 
+335225.113872  7391029.802979 
+335234.300173  7391042.670775 
+335251.295654  7391067.466527 
+335295.891269  7391144.893265 
+335221.567993  7391197.974173 
+335162.541474  7391247.205740 
+335076.450826  7391312.944479 
+335060.840711  7391329.821588 
+334992.396997  7391379.663051 
+334894.209128  7391456.909819 
+334903.997404  7391469.507661 
+334905.861052  7391477.356317 
+334905.960007  7391487.764534 
+334902.026555  7391501.762136 
+334890.811681  7391525.448079 
+334847.098413  7391607.554015 
+334865.289598  7391646.467350 
+334874.360451  7391663.644407 
+334885.171260  7391677.002119 
+334901.540028  7391686.240537 
+334921.998926  7391696.968699 
+334934.788829  7391704.217458 
+334945.830532  7391715.535519 
+334957.688612  7391731.682753 
+334975.203606  7391752.839129 
+334998.062157  7391775.465254 
+335051.027697  7391808.749552 
+335095.936669  7391848.702709 
+335131.799526  7391900.913765 
+335124.600567  7391919.510580 
+335123.462587  7391929.908799 
+335125.375712  7391941.556804 
+335128.715436  7391953.004843 
+335133.490003  7391964.352899 
+335140.713701  7391975.401006 
+335150.172128  7391988.018845 
+335163.267142  7391999.996793 
+335195.567627  7392012.104719 
+335214.830822  7392024.232642 
+335229.756500  7392036.180595 
+335243.783338  7392054.467463 
+335252.499604  7392076.163747 
+335256.556749  7392092.071022 
+335259.409945  7392112.057598 
+335258.939910  7392131.334296 
+335254.198327  7392154.470333 
+335246.397393  7392176.896492 
+335307.592671  7392254.153259 
+335402.069735  7392293.756475 
+335448.933064  7392484.923730 
+335459.991259  7392506.380054 
+335471.016470  7392580.877294 
+335479.048298  7392610.312252 
+335492.431931  7392630.838736 
+335515.620331  7392649.565528 
+335540.639395  7392658.573985 
+335572.511077  7392680.160287 
+335750.646151  7392752.307929 
+335792.231892  7392676.400931 
+335876.599078  7392587.426172 
+335911.480634  7392640.397099 
+335951.697500  7392658.344024 
+336000.003920  7392682.359911 
+336050.833685  7392702.986378 
+336198.878264  7392779.573259 
+336232.209528  7392797.680157 
+336250.375974  7392774.524124 
+336259.067502  7392764.955763 
+336272.104792  7392762.346210 
+336290.370193  7392770.174869 
+336313.838965  7392782.352783 
+336383.791740  7392813.077520 
+336673.597270  7392212.990309 
+336820.619316  7391918.950676 
+336900.426336  7391738.321616 
+336999.084240  7391512.680266 
+337127.222418  7391202.363421 
+337085.983018  7391203.593210 
+337171.125350  7390942.437944 
+337199.005856  7390867.120845 
+337232.749431  7390801.572073 
+337291.446101  7390698.369750 
+337338.894912  7390622.562735 
+337403.949426  7390530.118570 
+337512.049263  7390389.742615 
+337620.157347  7390252.036203 
+337773.735147  7390060.299046 
+337862.761453  7389946.828482 
+338041.778874  7389723.796686 
+338270.685990  7389432.756538 
+338773.508150  7388794.945790 
+338806.039530  7388753.692856 
+338802.378204  7388725.967605 
+338799.854857  7388713.869677 
+338796.457410  7388697.882416 
+338811.556259  7388680.555384 
+338822.837102  7388665.837905 
+338828.947559  7388658.039240 
+338843.551633  7388638.822532 
+338862.014944  7388611.667184 
+338871.506355  7388593.280333 
+338874.483245  7388582.682148 
+338875.472792  7388575.823323 
+338872.768029  7388561.955699 
+338862.691135  7388513.663971 
+338860.868718  7388503.345738 
+338852.119467  7388454.404121 
+338845.555468  7388420.109996 
+338835.791930  7388380.246824 
+338829.879383  7388360.800155 
+338817.040002  7388266.846248 
+338791.064375  7388087.147029 
+338766.894673  7387919.095815 
+Region 1
+308
+341738.258962  7388451.264659 
+341720.257441  7388431.857983 
+341697.069040  7388405.472503 
+341675.406192  7388379.646926 
+341649.389335  7388351.011831 
+341620.263648  7388317.257613 
+341594.997197  7388285.193106 
+341570.489400  7388257.797798 
+341550.805647  7388228.562806 
+341538.700181  7388206.616565 
+341527.798664  7388185.680151 
+341515.800398  7388153.765618 
+341505.368916  7388127.730078 
+341498.202942  7388110.373051 
+341494.582847  7388096.385447 
+341485.916058  7388076.798802 
+341469.976095  7388050.373328 
+341455.009186  7388028.507074 
+341446.218704  7388020.218493 
+341434.575026  7388011.559976 
+341410.364093  7387994.912828 
+341381.073482  7387976.316013 
+341351.518991  7387954.179805 
+341295.164251  7387918.565906 
+341264.851107  7387900.299034 
+341232.690808  7387882.222131 
+341211.267100  7387872.243840 
+341202.732252  7387869.274349 
+341178.430610  7387860.815798 
+341138.757994  7387858.836137 
+341125.778427  7387860.245895 
+341104.189795  7387865.764950 
+341080.605576  7387875.923210 
+341042.021463  7387894.989944 
+341014.891364  7387912.746902 
+340980.974617  7387934.413191 
+340942.901770  7387963.018291 
+340915.722194  7387985.094510 
+340899.468873  7387996.542549 
+340872.338775  7388014.299507 
+340848.424706  7388026.337445 
+340820.321552  7388039.205241 
+340799.268925  7388051.603117 
+340741.075275  7388090.726416 
+340706.647262  7388113.052592 
+340661.622843  7388142.907478 
+340627.978222  7388167.683234 
+340569.265060  7388208.346269 
+340537.921137  7388227.942912 
+340508.407877  7388248.439401 
+340481.302517  7388263.316853 
+340461.544549  7388277.944347 
+340435.857540  7388293.831626 
+340416.643823  7388305.689595 
+340392.309196  7388319.267269 
+340360.965274  7388339.193856 
+340323.428432  7388365.139412 
+340291.556750  7388386.615733 
+340263.503073  7388404.242713 
+340250.853356  7388412.971218 
+340229.751251  7388429.788338 
+340180.933566  7388470.011448 
+340139.661182  7388501.905985 
+340102.165571  7388533.830516 
+340057.528724  7388573.983638 
+340034.983530  7388591.790588 
+340000.720441  7388617.336212 
+339950.632837  7388652.780141 
+339915.982175  7388675.986166 
+339876.647655  7388698.702275 
+339836.826607  7388727.837285 
+339789.946786  7388759.211910 
+339750.166969  7388785.137470 
+339717.412941  7388802.834438 
+339703.847892  7388811.432965 
+339675.654029  7388832.389376 
+339635.453655  7388859.294767 
+339597.413793  7388884.240494 
+339559.464640  7388910.625975 
+339512.650788  7388944.780124 
+339469.077705  7388971.655521 
+339422.214377  7389001.150469 
+339390.862208  7389021.626961 
+339343.091794  7389050.232061 
+339313.652750  7389063.749746 
+339284.254938  7389073.168133 
+339247.427272  7389081.076778 
+339211.135611  7389086.655822 
+339153.337780  7389098.533788 
+339114.126953  7389109.621888 
+339076.812760  7389124.489342 
+339039.350134  7389143.456093 
+338992.626991  7389169.301666 
+338965.364953  7389188.498378 
+338926.121141  7389212.094336 
+338876.025290  7389237.899916 
+338842.347684  7389256.026811 
+338833.037689  7389248.948023 
+338795.484355  7389220.512894 
+338768.378995  7389189.418220 
+338747.598494  7389167.042053 
+338737.430891  7389154.084272 
+338731.139017  7389141.496429 
+338728.962012  7389126.189051 
+338728.599178  7389113.231270 
+338733.456208  7389097.993880 
+338739.113122  7389085.216069 
+338746.666670  7389075.997648 
+338753.816152  7389065.879381 
+338759.423588  7389057.200868 
+338766.556578  7389048.972277 
+338778.373426  7389032.485101 
+338788.730692  7389019.087396 
+338797.348003  7388996.591250 
+338801.578319  7388973.605187 
+338805.561249  7388955.258329 
+338808.117580  7388935.911643 
+338811.457304  7388901.617518 
+338812.298419  7388871.612657 
+338812.595284  7388844.697268 
+338811.152193  7388809.023378 
+338809.725595  7388781.538086 
+338806.039530  7388753.692856 
+338773.508150  7388794.945790 
+338270.685990  7389432.756538 
+338041.778874  7389723.796686 
+337862.761453  7389946.828482 
+337773.735147  7390060.299046 
+337620.157347  7390252.036203 
+337512.049263  7390389.742615 
+337403.949426  7390530.118570 
+337338.894912  7390622.562735 
+337291.446101  7390698.369750 
+337232.749431  7390801.572073 
+337199.005856  7390867.120845 
+337171.125350  7390942.437944 
+337085.983018  7391203.593210 
+337127.222418  7391202.363421 
+337197.422579  7391194.214817 
+337243.238637  7391190.465459 
+337454.812176  7391172.668507 
+337651.880596  7391163.470083 
+337661.050405  7391163.620057 
+337663.417073  7391164.229953 
+337670.500585  7391166.049641 
+337755.280083  7391164.089977 
+337722.056019  7391295.257509 
+337734.969616  7391287.748795 
+337757.003545  7391275.820838 
+337767.138162  7391272.401424 
+337781.107277  7391268.692059 
+337798.399623  7391265.962527 
+337819.782099  7391265.722568 
+337833.281178  7391265.822551 
+337862.093508  7391269.311953 
+337869.498623  7391271.001664 
+337886.353919  7391275.130956 
+337913.698420  7391284.479355 
+337933.167770  7391295.177523 
+337948.546990  7391305.165812 
+337968.321451  7391320.183239 
+337985.556073  7391335.990532 
+338007.746680  7391362.915920 
+338038.653553  7391418.696365 
+338082.746148  7391495.333238 
+338162.973726  7391634.719362 
+338198.754121  7391692.359489 
+338219.509883  7391732.442623 
+338230.172259  7391750.289566 
+338242.368434  7391771.745891 
+338248.858218  7391782.853988 
+338255.611881  7391794.961914 
+338265.573327  7391813.228785 
+338268.179136  7391826.566500 
+338272.632101  7391838.464462 
+338280.061955  7391857.291238 
+338284.696336  7391876.407963 
+338288.835944  7391901.013748 
+338289.132808  7391927.169268 
+338289.561612  7391943.666442 
+338286.287859  7391970.381866 
+338283.080075  7392002.116430 
+338318.233756  7392011.954745 
+338393.637289  7392050.198194 
+338450.701205  7392073.724165 
+338487.108314  7392093.220825 
+338586.755765  7392144.961962 
+338636.868109  7392167.808049 
+338679.402166  7392129.174666 
+338725.680013  7392087.161863 
+338742.691986  7392073.124267 
+338762.573649  7392072.234420 
+338782.950084  7392069.554879 
+338804.027450  7392059.256643 
+338828.098197  7392039.789977 
+338866.781265  7391999.996793 
+338869.156180  7391987.728895 
+338850.453729  7391938.547319 
+338844.450473  7391879.787384 
+338859.796708  7391855.181599 
+338959.435913  7391833.135375 
+339008.591694  7391850.402418 
+339035.828993  7391822.027278 
+339069.333429  7391757.288367 
+339101.576190  7391694.589107 
+339117.112089  7391650.696625 
+339127.048797  7391651.286524 
+339135.657862  7391649.116896 
+339148.101424  7391647.127237 
+339159.530699  7391645.927442 
+339168.708754  7391647.037252 
+339180.204000  7391649.636807 
+339194.783335  7391653.956067 
+339206.097164  7391660.874882 
+339292.426953  7391612.743126 
+339435.969090  7391532.706836 
+339484.621850  7391505.761451 
+339569.401347  7391463.448699 
+339601.338999  7391454.250275 
+339619.711601  7391449.231135 
+339637.490474  7391445.661746 
+339692.797943  7391432.763955 
+339765.274064  7391416.036820 
+339778.418556  7391409.417954 
+339810.092328  7391401.609292 
+339823.781070  7391399.099722 
+339857.681325  7391387.121773 
+339879.138017  7391377.113488 
+339895.242905  7391373.284144 
+339911.718874  7391363.115885 
+339993.645176  7391324.162558 
+340012.347627  7391313.834327 
+340033.474470  7391306.215632 
+340084.815502  7391280.939961 
+340113.042349  7391276.630699 
+340175.441576  7391262.863058 
+340254.992963  7391252.514830 
+340330.248064  7391250.525171 
+340355.910334  7391249.165404 
+340392.836955  7391248.555508 
+340414.392602  7391248.615498 
+340460.282875  7391247.605671 
+340506.552476  7391251.325034 
+340511.310551  7391223.279838 
+340529.221364  7391147.782770 
+340410.277733  7391129.335930 
+340349.915324  7391121.197324 
+340314.423548  7391117.457964 
+340232.505492  7391111.129048 
+340266.917013  7391014.555590 
+340275.567309  7390995.018937 
+340324.607643  7390861.331836 
+340338.057245  7390822.568476 
+340382.355996  7390706.278396 
+340561.925914  7390371.665712 
+340624.424096  7390291.769397 
+340644.198558  7390268.033463 
+340682.172450  7390220.571593 
+340717.771427  7390174.689452 
+340743.087355  7390150.953518 
+340808.743844  7390075.806390 
+340813.378225  7390063.258539 
+340841.967907  7390023.595333 
+340878.589417  7389978.523053 
+340921.238922  7389933.500765 
+340952.962172  7389897.946855 
+341001.012958  7389875.840642 
+341145.124084  7389816.100875 
+341187.410755  7389796.864170 
+341263.968761  7389722.146968 
+341284.089563  7389697.291226 
+341296.895959  7389736.724471 
+341350.117132  7389721.037158 
+341339.322816  7389695.031613 
+341336.510852  7389677.084687 
+341370.650246  7389672.065547 
+341391.974999  7389670.485817 
+341413.299751  7389658.637847 
+341517.556845  7389562.274353 
+341544.414819  7389541.737871 
+341564.947933  7389529.889900 
+341673.154971  7389469.080316 
+341763.195564  7389422.478299 
+341766.139468  7389367.297751 
+341765.141674  7389326.894672 
+341764.267574  7389305.918265 
+341762.791499  7389276.763259 
+341758.998232  7389243.728917 
+341755.460600  7389222.722515 
+341750.760248  7389203.965728 
+341835.127434  7389156.403875 
+341819.459596  7389102.823053 
+341806.372828  7389056.141049 
+341797.623577  7389026.666098 
+341787.670376  7388999.930678 
+341756.870705  7388954.908389 
+341726.071033  7388909.896100 
+341707.904587  7388880.671106 
+341695.263116  7388849.866382 
+341669.839987  7388842.297679 
+341672.363333  7388794.575853 
+341674.730001  7388702.171681 
+341673.938363  7388533.150633 
+341681.294001  7388514.493828 
+341691.321418  7388493.227471 
+341712.456507  7388464.112458 
+341738.308440  7388451.324649 
+341738.258962  7388451.264659 
+Region 1
+628
+348624.950055  7386618.428607 
+348618.419040  7386618.698561 
+348602.149227  7386623.067813 
+348592.921695  7386627.407069 
+348585.161992  7386637.395358 
+348572.784400  7386650.783065 
+348565.239099  7386659.671543 
+348562.732245  7386665.630522 
+348561.816913  7386674.918931 
+348563.639330  7386685.797068 
+348563.556868  7386694.205627 
+348562.633290  7386704.613844 
+348559.409014  7386710.002921 
+348554.890079  7386712.832437 
+348545.481130  7386715.282017 
+348526.028272  7386721.400969 
+348514.326871  7386727.699890 
+348507.358806  7386730.619390 
+348503.285168  7386730.349436 
+348500.036153  7386728.319784 
+348495.591435  7386723.960531 
+348494.502932  7386720.961044 
+348491.822907  7386713.622301 
+348488.524415  7386707.383370 
+348486.396888  7386705.703658 
+348481.721275  7386703.993951 
+348474.563547  7386705.023774 
+348468.016040  7386707.063425 
+348463.249718  7386713.882257 
+348454.780839  7386733.608878 
+348450.723694  7386740.877633 
+348445.693493  7386743.817129 
+348439.253187  7386744.966932 
+348431.608931  7386744.557003 
+348413.063159  7386741.707491 
+348383.384974  7386739.957790 
+348372.871030  7386740.957619 
+348360.979966  7386745.706806 
+348349.509459  7386750.016068 
+348339.498535  7386751.245857 
+348332.151143  7386750.615965 
+348326.362290  7386748.666299 
+348323.632787  7386745.906771 
+348323.179244  7386744.936938 
+348322.832903  7386744.537006 
+348319.740566  7386737.638188 
+348319.303516  7386730.649385 
+348320.334295  7386719.921222 
+348318.915943  7386708.833122 
+348313.959959  7386694.385597 
+348308.921512  7386678.828261 
+348305.037537  7386670.039767 
+348300.403155  7386663.790837 
+348288.396644  7386651.153002 
+348268.778861  7386633.446035 
+348260.780017  7386627.387073 
+348247.181983  7386620.818198 
+348236.107295  7386616.049015 
+348232.973727  7386612.919551 
+348229.246431  7386608.780260 
+348223.902874  7386602.301370 
+348219.045844  7386598.492022 
+348214.568141  7386597.222240 
+348206.297171  7386597.692159 
+348195.337931  7386602.001421 
+348189.458368  7386608.150368 
+348186.580434  7386619.638400 
+348184.345705  7386628.026963 
+348180.956505  7386630.876475 
+348176.256153  7386630.826484 
+348170.887857  7386626.997140 
+348166.665787  7386621.308114 
+348163.862068  7386616.079010 
+348157.900044  7386610.250008 
+348149.290979  7386603.961085 
+348139.222331  7386601.421520 
+348131.775985  7386600.791628 
+348126.053101  7386602.061411 
+348117.427544  7386606.950573 
+348106.600243  7386617.578753 
+348093.967017  7386625.757352 
+348089.777932  7386626.487227 
+348086.619626  7386625.567384 
+348084.401390  7386622.887843 
+348081.424501  7386615.219157 
+348076.171652  7386600.431690 
+348072.048536  7386584.664391 
+348069.154109  7386568.577146 
+348064.049693  7386558.998787 
+348058.821582  7386551.300106 
+348051.012402  7386546.900859 
+348040.836553  7386544.251313 
+348009.335952  7386541.591769 
+347986.988667  7386541.251827 
+347973.102015  7386542.321644 
+347966.529769  7386546.021010 
+347963.107583  7386551.740030 
+347959.908046  7386564.997759 
+347957.087835  7386571.176701 
+347950.128016  7386573.536297 
+347943.498047  7386573.026384 
+347928.316736  7386570.876752 
+347911.502672  7386568.257201 
+347894.564914  7386568.417174 
+347874.831684  7386572.196526 
+347855.436550  7386573.106371 
+347837.797862  7386571.816591 
+347799.304458  7386560.428542 
+347797.242900  7386559.548693 
+347797.209915  7386559.538695 
+347774.351364  7386549.780366 
+347756.498274  7386540.062031 
+347743.460984  7386528.194064 
+347732.674914  7386515.226285 
+347723.406151  7386503.508292 
+347713.972463  7386488.340890 
+347703.062700  7386478.482579 
+347690.586153  7386470.823891 
+347669.434571  7386464.295009 
+347652.942110  7386460.355684 
+347630.001096  7386458.895934 
+347613.137555  7386461.705453 
+347600.413621  7386467.884394 
+347583.063551  7386478.122640 
+347553.121488  7386502.278503 
+347535.524032  7386516.156126 
+347521.051897  7386524.754653 
+347513.844691  7386530.663641 
+347498.828305  7386541.691752 
+347485.955939  7386553.189782 
+347477.313890  7386559.958623 
+347468.407961  7386562.308220 
+347448.913871  7386563.428028 
+347434.458229  7386560.068604 
+347414.428135  7386553.099797 
+347394.579458  7386548.130649 
+347362.237741  7386537.712433 
+347330.794864  7386529.523836 
+347301.611453  7386520.355406 
+347272.188902  7386513.516578 
+347259.456722  7386511.166980 
+347241.405723  7386510.867032 
+347232.409086  7386511.996838 
+347225.539976  7386515.356263 
+347220.996302  7386520.175437 
+347216.823710  7386528.883945 
+347211.175042  7386542.441623 
+347201.296057  7386560.288566 
+347189.850289  7386571.686614 
+347183.475953  7386575.935886 
+347153.789523  7386594.892639 
+347140.133765  7386602.391354 
+347111.181249  7386610.170022 
+347082.245226  7386615.629087 
+347055.717102  7386615.679078 
+347031.349490  7386613.429464 
+347010.783391  7386609.230183 
+346997.251326  7386605.430834 
+346978.730292  7386600.481681 
+346970.104735  7386596.292399 
+346949.975686  7386579.245319 
+346943.997169  7386575.415975 
+346936.476606  7386572.016557 
+346927.958250  7386567.497331 
+346920.874738  7386561.768313 
+346906.270664  7386552.649875 
+346891.369725  7386543.521438 
+346877.177962  7386534.403000 
+346869.377028  7386529.443850 
+346844.720798  7386516.116132 
+346813.657247  7386500.508806 
+346793.157118  7386490.220568 
+346762.497632  7386474.943185 
+346745.667075  7386464.694940 
+346730.362071  7386454.896619 
+346708.097249  7386437.829542 
+346700.988998  7386434.210162 
+346694.276566  7386432.590440 
+346684.381089  7386432.260496 
+346677.957276  7386431.860565 
+346671.640663  7386430.800746 
+346655.642976  7386428.411156 
+346645.574328  7386425.651628 
+346636.511720  7386423.891930 
+346622.633314  7386423.531991 
+346605.398692  7386422.792118 
+346591.841889  7386421.322370 
+346573.980553  7386422.132231 
+346562.757434  7386422.012252 
+346536.237556  7386420.512508 
+346518.499914  7386419.112748 
+346506.064598  7386417.433036 
+346494.775508  7386414.543531 
+346482.768996  7386411.094122 
+346469.335887  7386407.184791 
+346461.732862  7386402.785545 
+346449.553179  7386396.786573 
+346435.938652  7386391.217526 
+346425.449447  7386388.897924 
+346411.686488  7386388.308025 
+346399.630499  7386389.177876 
+346390.840017  7386391.077550 
+346374.050691  7386395.656766 
+346360.122808  7386401.165822 
+346341.857407  7386410.824168 
+346324.515584  7386419.832625 
+346312.212208  7386425.571642 
+346290.804993  7386432.990371 
+346266.627045  7386442.588727 
+346252.872332  7386449.977461 
+346242.704730  7386455.856454 
+346211.385546  7386475.123154 
+346174.087844  7386498.989066 
+346160.300147  7386510.467100 
+346142.677952  7386526.784305 
+346119.910109  7386547.360781 
+346106.518231  7386558.848813 
+346091.501845  7386569.986905 
+346072.997303  7386583.084661 
+346055.127721  7386594.302740 
+346047.417495  7386599.871786 
+346043.599491  7386603.921092 
+346039.608315  7386614.629258 
+346035.336768  7386632.186251 
+346028.434673  7386658.251786 
+346023.841522  7386668.060106 
+346009.773453  7386685.517116 
+345992.151258  7386702.054283 
+345975.180515  7386715.172036 
+345948.602914  7386738.807987 
+345939.037286  7386746.016753 
+345924.680599  7386752.735602 
+345912.583378  7386758.034694 
+345899.892429  7386761.334129 
+345878.542938  7386763.653732 
+345863.295658  7386767.923000 
+345845.409583  7386780.020928 
+345826.542208  7386798.427775 
+345815.921063  7386809.055955 
+345812.375183  7386816.224727 
+345800.022330  7386845.109779 
+345783.818487  7386882.143435 
+345767.293040  7386910.318609 
+345761.759820  7386922.006607 
+345757.257378  7386932.924737 
+345747.914398  7386947.992156 
+345743.329494  7386957.470532 
+345737.482917  7386969.698438 
+345729.393364  7386991.984620 
+345722.062465  7387019.039986 
+345714.814029  7387048.314972 
+345708.827265  7387074.050563 
+345707.095557  7387083.448953 
+345704.885567  7387089.737876 
+345701.265472  7387094.467066 
+345693.637708  7387101.915790 
+345685.267784  7387111.344175 
+345679.215051  7387114.163692 
+345670.911097  7387118.392968 
+345662.574157  7387124.621901 
+345655.292736  7387128.421250 
+345636.557300  7387134.420223 
+345625.993878  7387138.739483 
+345611.332080  7387145.898256 
+345586.783052  7387160.805703 
+345556.799757  7387178.432684 
+345538.212753  7387189.310820 
+345515.040845  7387200.028984 
+345494.334560  7387208.337561 
+345483.795877  7387211.437030 
+345466.330360  7387212.466854 
+345455.602014  7387213.906607 
+345429.205830  7387220.275516 
+345371.317291  7387232.943346 
+345320.471033  7387244.921295 
+345285.762648  7387256.289347 
+345268.561011  7387261.758411 
+345246.007570  7387271.266782 
+345236.359480  7387276.255927 
+345228.113250  7387284.034595 
+345211.703251  7387301.251646 
+345204.974326  7387310.260103 
+345186.849111  7387345.394085 
+345173.226338  7387369.279993 
+345162.366053  7387383.337585 
+345136.604828  7387415.852016 
+345124.713763  7387430.559497 
+345114.496684  7387441.747580 
+345087.655203  7387461.404213 
+345066.190265  7387473.802090 
+345041.979331  7387486.389933 
+345016.853067  7387498.187912 
+344968.315753  7387516.554766 
+344944.929443  7387524.563395 
+344919.778439  7387529.612530 
+344902.263446  7387535.071595 
+344891.782486  7387542.270362 
+344880.542874  7387552.888543 
+344867.728232  7387568.485871 
+344847.417765  7387596.950995 
+344833.226003  7387617.287512 
+344822.266762  7387630.795198 
+344820.040280  7387638.303912 
+344807.077205  7387657.990540 
+344798.064075  7387670.178452 
+344781.192287  7387683.296205 
+344770.604127  7387690.714934 
+344753.979726  7387699.063504 
+344734.634069  7387704.612554 
+344717.770527  7387707.202110 
+344703.809659  7387705.172458 
+344688.364469  7387703.762699 
+344681.907670  7387702.442925 
+344671.204063  7387700.733218 
+344663.493837  7387698.773554 
+344654.117873  7387748.874972 
+344643.826577  7387769.441449 
+344625.643638  7387801.086029 
+344607.435961  7387817.693184 
+344584.503194  7387839.849389 
+344582.919917  7387844.588577 
+344545.745910  7387891.260583 
+344527.546479  7387923.695027 
+344507.772018  7387941.102045 
+344482.621014  7387943.091704 
+344469.798125  7387959.298928 
+344455.342483  7387976.805930 
+344449.512398  7387993.163128 
+344443.632836  7388015.229348 
+344447.186961  7388048.063724 
+344452.373840  7388067.560384 
+344458.278141  7388091.256325 
+344464.957588  7388113.822460 
+344472.057593  7388130.669574 
+344479.190582  7388143.687344 
+344488.550054  7388164.373801 
+344512.521846  7388204.886861 
+344534.168202  7388220.074260 
+344561.751843  7388247.759518 
+344582.078802  7388276.164652 
+344586.548259  7388288.412554 
+344592.889610  7388305.999542 
+344609.002745  7388338.943899 
+344613.488695  7388350.041998 
+344621.330860  7388369.948588 
+344635.588593  7388396.004125 
+344655.511486  7388429.358411 
+344678.468992  7388462.742693 
+344742.723621  7388539.519542 
+344707.908035  7388601.258966 
+344673.249128  7388648.450883 
+344664.409169  7388659.439001 
+344647.784768  7388685.894469 
+344617.999383  7388724.997771 
+344611.699262  7388735.276010 
+344588.453138  7388761.841460 
+344573.989250  7388775.309153 
+344560.407708  7388785.597391 
+344548.112578  7388790.206601 
+344534.308388  7388794.015949 
+344514.509188  7388794.235911 
+344493.769918  7388786.457244 
+344471.562819  7388776.338977 
+344431.436661  7388767.270530 
+344403.572647  7388770.320008 
+344380.408985  7388786.367259 
+344317.910803  7388845.687098 
+344291.803237  7388866.263573 
+344247.487993  7388878.311510 
+344275.343761  7388937.651345 
+344297.361196  7388985.803097 
+344315.057607  7389024.316500 
+344326.618823  7389052.931599 
+344277.578489  7389086.155908 
+344232.479854  7389121.769808 
+344188.189349  7389145.835685 
+344160.490260  7389157.373709 
+344091.667219  7389207.995038 
+343954.177816  7389319.795887 
+343933.636455  7389312.687105 
+343899.678477  7389324.535076 
+343849.920722  7389339.542505 
+343759.088491  7389370.347229 
+343684.847676  7389396.412764 
+343647.723146  7389408.260734 
+343556.280694  7389407.100933 
+343424.959471  7389450.123564 
+343346.801697  7389492.776258 
+343297.827333  7389533.839224 
+343254.386190  7389578.071647 
+343272.931963  7389623.483868 
+343300.194002  7389686.283112 
+343359.500892  7389827.928849 
+343368.093465  7389852.134703 
+343425.091411  7389976.823345 
+343456.517796  7390055.299902 
+343478.238368  7390108.400807 
+343542.657921  7390260.874689 
+343554.285107  7390292.379293 
+343578.949582  7390359.227842 
+343591.219974  7390388.512826 
+343627.915700  7390476.117820 
+343666.491567  7390554.604376 
+343664.232100  7390573.751096 
+343659.482271  7390595.647346 
+343657.057879  7390606.285523 
+343648.292136  7390625.042311 
+343623.965756  7390672.784133 
+343581.283266  7390750.190874 
+343537.767907  7390829.067363 
+343523.873008  7390860.571967 
+343496.000748  7390918.891977 
+343475.591328  7390947.437087 
+343437.444265  7390999.768123 
+343499.142562  7390983.950833 
+343526.899375  7390982.851021 
+343557.682554  7390998.978259 
+343566.588483  7391003.997399 
+343576.450975  7391006.806918 
+343619.380851  7391029.043109 
+343654.773673  7391049.489607 
+343671.595984  7391056.728367 
+343684.781707  7391066.896625 
+343710.848042  7391075.585137 
+343741.655959  7391073.215543 
+343768.060390  7391064.677005 
+343794.374112  7391057.928161 
+343826.427210  7391048.609757 
+343928.837149  7391016.355282 
+343968.328347  7391005.297176 
+344004.661240  7390992.659341 
+344028.377399  7390987.510223 
+344047.360222  7390980.391443 
+344080.576039  7390971.682934 
+344080.584285  7390971.682934 
+344090.867335  7390965.364017 
+344208.738956  7390876.759194 
+344291.011599  7390883.088110 
+344333.727074  7390886.257567 
+344357.731851  7390887.677324 
+344410.466496  7390894.166212 
+344457.140161  7390897.325671 
+344506.972133  7390902.864722 
+344552.070769  7390909.193638 
+344596.369520  7390914.732689 
+344613.043398  7390915.402575 
+344646.201491  7390918.682013 
+344697.616740  7390926.600656 
+344761.706444  7390934.509302 
+344786.222488  7390936.878896 
+344807.910074  7390937.458796 
+344817.739581  7390934.599286 
+344827.882445  7390928.310364 
+344840.812535  7390925.810792 
+344929.410037  7390874.389600 
+344983.991837  7390852.233395 
+345006.701957  7390837.985835 
+345043.323467  7390825.338002 
+345056.146356  7390819.509000 
+345070.107224  7390813.909959 
+345089.213741  7390804.771525 
+345106.580302  7390793.013539 
+345130.156276  7390774.256752 
+345141.395888  7390765.658224 
+345149.328762  7390756.519790 
+345188.003584  7390719.026212 
+345229.531601  7390684.702091 
+345238.899319  7390678.043232 
+345250.757399  7390674.673809 
+345284.599929  7390662.295929 
+345303.607491  7390662.315926 
+345319.613425  7390663.535717 
+345391.949360  7390687.321643 
+345467.377632  7390713.707123 
+345506.308087  7390720.585945 
+345538.542602  7390722.505616 
+345566.381877  7390720.206010 
+345600.447056  7390712.697296 
+345633.860782  7390701.719177 
+345677.722483  7390675.953590 
+345689.225975  7390667.705003 
+345772.290256  7390589.388418 
+345820.126640  7390549.035330 
+345848.238040  7390525.309394 
+345864.903673  7390511.921687 
+345922.990121  7390469.149014 
+345960.568194  7390446.992809 
+345991.499805  7390433.065195 
+346028.929446  7390421.347202 
+346068.940157  7390415.348229 
+346121.518124  7390407.269613 
+346124.049717  7390406.149805 
+346162.262750  7390396.271497 
+346216.077651  7390380.554189 
+346251.132377  7390365.706732 
+346259.733196  7390332.622399 
+346258.619955  7390312.675816 
+346260.425879  7390295.528753 
+346260.211477  7390267.953477 
+346257.721116  7390242.447846 
+346257.539699  7390211.333175 
+346257.366528  7390178.988716 
+346260.549573  7390148.014021 
+346266.519844  7390104.881409 
+346272.160266  7390073.496785 
+346274.139361  7390050.030805 
+346272.152019  7390025.764961 
+346266.412643  7390008.197970 
+346261.753522  7389985.341885 
+346290.829732  7389970.594412 
+346353.327914  7389942.909154 
+346446.666998  7389901.756203 
+346482.265976  7389883.559320 
+346533.689470  7389855.884060 
+346555.838846  7389846.395686 
+346596.971044  7389825.029346 
+346613.529476  7389818.170520 
+346642.853072  7389803.673004 
+346682.088637  7389785.596100 
+346689.526737  7389776.777611 
+346727.500629  7389688.172788 
+346744.900176  7389680.264143 
+346789.207173  7389664.446852 
+346824.006267  7389647.039834 
+346862.763551  7389631.212545 
+346901.537327  7389614.605389 
+346914.986929  7389609.066338 
+346937.136305  7389666.816446 
+346942.661279  7389666.016583 
+346945.036194  7389651.779022 
+346998.826356  7389631.212545 
+347092.247903  7389602.337491 
+347103.372068  7389624.803642 
+347111.766731  7389630.872603 
+347120.920047  7389635.421824 
+347132.506001  7389637.541461 
+347155.463507  7389628.053086 
+347179.979551  7389628.842951 
+347198.962374  7389644.390287 
+347263.843717  7389716.647910 
+347274.910158  7389735.634658 
+347278.076711  7389752.251812 
+347277.293319  7389756.211134 
+347325.542015  7389768.079101 
+347351.806259  7389759.660543 
+347365.882575  7389756.201135 
+347384.873644  7389768.069102 
+347414.931155  7389775.977748 
+347456.863238  7389777.567475 
+347455.032574  7389732.195247 
+347452.072178  7389660.187581 
+347444.642324  7389611.815867 
+347434.227335  7389576.031997 
+347427.663335  7389551.276237 
+347422.270300  7389537.198648 
+347408.606296  7389490.406663 
+347349.266420  7389358.289294 
+347304.398679  7389191.807811 
+347311.721332  7389112.731356 
+347320.503568  7389014.618162 
+347283.568701  7388977.594503 
+347309.140262  7388908.016422 
+347324.527728  7388857.994990 
+347337.993823  7388809.903227 
+347336.072451  7388756.032455 
+347328.378718  7388709.860364 
+347314.912623  7388659.848930 
+347282.208073  7388498.246611 
+347270.663350  7388452.074520 
+347243.731160  7388357.810667 
+347211.026610  7388311.638576 
+347161.013221  7388255.848132 
+347116.763947  7388211.605710 
+347070.593302  7388194.288677 
+347005.175954  7388171.202631 
+346951.484746  7388056.922206 
+347316.833995  7388213.535380 
+347382.243097  7388246.239778 
+347477.115980  7388277.604405 
+347543.613584  7388296.081241 
+347815.467070  7388387.875517 
+347900.848542  7388413.761083 
+348155.195280  7388475.740467 
+348188.287404  7388482.649283 
+348226.178833  7388490.307971 
+348332.382038  7388519.662943 
+348377.777538  7388513.813945 
+348449.536237  7388462.552725 
+348518.004690  7388356.880826 
+348540.327236  7388321.976805 
+348566.542003  7388145.996949 
+348543.642221  7388151.625984 
+348523.826529  7388153.885597 
+348486.248456  7388152.355859 
+348451.103020  7388143.267416 
+348414.456772  7388120.881251 
+348437.397785  7388051.263176 
+348474.967612  7387896.399702 
+348505.833253  7387775.370434 
+348543.180432  7387642.613174 
+348546.173814  7387621.106858 
+348569.057104  7387545.669779 
+348579.216460  7387531.412221 
+348599.180584  7387515.814893 
+348644.246235  7387422.550868 
+348664.367037  7387377.438596 
+348666.403856  7387355.312386 
+348664.647409  7387325.667464 
+348657.588636  7387298.502117 
+348654.554023  7387279.775325 
+348655.287938  7387242.481713 
+348665.612218  7387218.465826 
+348677.346605  7387184.311677 
+348680.290509  7387132.590536 
+348680.331740  7387092.227450 
+348681.082147  7387054.943836 
+348683.440569  7387031.767806 
+348686.590629  7387007.461969 
+348691.802247  7386993.864299 
+348696.881925  7386968.078715 
+348700.708176  7386947.602223 
+348698.852774  7386921.416708 
+348686.186564  7386870.785381 
+348679.869951  7386843.889988 
+348670.378540  7386813.835136 
+348667.211987  7386750.545977 
+348643.759707  7386622.447919 
+348624.950055  7386618.428607 
+Region 1
+693
+358421.125722  7403268.426613 
+358437.626429  7403275.425415 
+358452.123303  7403278.924815 
+358470.116578  7403276.425243 
+358483.615658  7403268.426613 
+358494.616129  7403256.928583 
+358510.605571  7403229.433293 
+358530.107906  7403202.437917 
+358547.103387  7403189.440143 
+358575.594114  7403176.442369 
+358600.093666  7403166.943996 
+358619.587755  7403161.944853 
+358656.580345  7403157.945538 
+358684.073278  7403158.945366 
+358709.570624  7403166.943996 
+358727.572145  7403180.441684 
+358742.563792  7403199.438430 
+358756.062872  7403226.433806 
+358757.563686  7403244.930638 
+358754.067284  7403254.928925 
+358742.069019  7403264.427298 
+358706.074222  7403277.924986 
+358681.079897  7403286.923445 
+358669.081631  7403289.922931 
+358658.584180  7403294.422161 
+358651.080110  7403301.920876 
+358646.082894  7403309.919506 
+358645.085100  7403320.417708 
+358649.579296  7403333.915396 
+358659.078953  7403350.412570 
+358674.581867  7403366.409830 
+358692.575142  7403381.907175 
+358705.076428  7403391.905463 
+358733.567155  7403409.402465 
+358744.567626  7403418.900838 
+358769.058932  7403453.894844 
+358783.555805  7403474.391333 
+358796.057091  7403485.889364 
+358815.056406  7403496.387566 
+358827.046425  7403499.886966 
+358844.050153  7403498.387223 
+358861.540408  7403494.387908 
+358876.540302  7403487.889021 
+358886.542980  7403478.890563 
+358893.041009  7403464.892960 
+358901.534627  7403449.395615 
+358912.032078  7403440.397156 
+358918.084812  7403406.143024 
+358924.310716  7403371.828901 
+358926.949510  7403346.343267 
+358931.872509  7403320.617673 
+358934.494811  7403297.401650 
+358941.256720  7403256.018739 
+358948.975192  7403230.303144 
+358955.176357  7403201.548069 
+358964.403889  7403178.352042 
+358974.653954  7403154.406144 
+358990.989737  7403129.460417 
+359007.317274  7403109.323866 
+359018.029127  7403094.466411 
+359030.802538  7403074.559821 
+359043.303824  7403056.422928 
+359056.835889  7403036.276379 
+359071.662611  7403010.320825 
+359077.055646  7402993.933632 
+359085.005013  7402972.757259 
+359087.602575  7402956.859982 
+359093.020349  7402935.673611 
+359102.750901  7402911.727713 
+359118.336277  7402885.772159 
+359131.084949  7402870.674745 
+359147.890767  7402857.347028 
+359191.645267  7402831.231501 
+359197.755724  7402826.962232 
+359218.626934  7402810.615032 
+359230.097441  7402798.787058 
+359241.856566  7402777.880639 
+359246.235314  7402761.483448 
+359246.334269  7402735.737858 
+359246.424977  7402713.021749 
+359246.540425  7402683.486808 
+359245.864234  7402660.260787 
+359245.699309  7402638.294549 
+359245.105581  7402596.391727 
+359245.740540  7402563.077433 
+359247.092922  7402542.380978 
+359250.960404  7402525.233916 
+359253.566213  7402508.076854 
+359242.161676  7402503.897570 
+359176.727836  7402484.800841 
+359131.703417  7402472.173004 
+359087.957163  7402451.566534 
+359057.602788  7402437.518940 
+359009.898344  7402414.352908 
+358962.523749  7402388.397354 
+358917.656008  7402361.651936 
+358872.491403  7402335.306448 
+358828.778134  7402312.430367 
+358780.216082  7402284.505150 
+358734.268084  7402258.919533 
+358692.121600  7402234.173771 
+358646.899271  7402210.497827 
+358591.929897  7402179.033217 
+358564.799798  7402164.825650 
+358523.576891  7402143.569291 
+358480.811939  7402119.133477 
+358439.778696  7402095.147585 
+358393.641035  7402072.261506 
+358351.981078  7402049.375426 
+358283.496132  7402010.452093 
+358248.276481  7401982.366904 
+358186.165872  7401945.723180 
+358127.353755  7401904.070315 
+358069.176598  7401832.972494 
+357707.249535  7401412.134579 
+357576.678719  7401300.513699 
+357516.844069  7401226.606359 
+357445.456450  7401181.944009 
+357401.693704  7401161.747468 
+357338.387392  7401144.500423 
+357046.808922  7401127.353360 
+356501.015654  7401093.349184 
+356471.057098  7401095.528811 
+356449.493205  7401093.189212 
+356422.594001  7401092.089400 
+356392.643691  7401093.759114 
+356374.576200  7401092.499330 
+356142.675702  7401107.746718 
+355914.807610  7401134.702101 
+355875.423613  7401138.321481 
+355763.497524  7401149.569554 
+355718.778215  7401154.298744 
+355552.657899  7401170.745927 
+355478.656225  7401173.895388 
+355353.692846  7401188.592870 
+355169.933842  7401203.300351 
+355061.875236  7401219.677546 
+354955.639046  7401235.564824 
+354839.787752  7401250.642242 
+354723.985935  7401267.009438 
+354654.033160  7401277.627619 
+354578.646120  7401280.797076 
+354543.731579  7401283.976532 
+354495.317959  7401288.735716 
+354447.687731  7401293.524896 
+354415.980974  7401296.844328 
+354406.440085  7401297.464221 
+354399.298849  7401303.813134 
+354264.209099  7401307.322533 
+354118.786821  7401318.460625 
+354002.506723  7401333.967969 
+353786.529696  7401356.164167 
+353556.097027  7401378.870277 
+353400.210283  7401391.408130 
+353398.668238  7401399.726705 
+353396.821082  7401405.275756 
+353394.355459  7401408.355227 
+353391.889836  7401410.824804 
+353386.035012  7401411.434699 
+353372.478209  7401411.434699 
+353353.990160  7401410.204910 
+353344.127668  7401412.364540 
+353339.814890  7401416.063906 
+353336.120578  7401423.142694 
+353334.578533  7401429.921533 
+353333.654955  7401441.019632 
+353333.341599  7401450.258049 
+353335.502111  7401459.506465 
+353343.204090  7401486.931767 
+353350.906070  7401509.727863 
+353359.226517  7401530.064379 
+353372.783320  7401552.560526 
+353381.103767  7401567.957888 
+353388.500635  7401581.825513 
+353395.279037  7401596.922927 
+353408.835840  7401619.419073 
+353423.316221  7401646.834377 
+353433.277668  7401664.651326 
+353443.651426  7401681.038519 
+353447.964205  7401690.586883 
+353456.903119  7401729.410233 
+353459.368742  7401752.216326 
+353460.292319  7401775.322369 
+353459.781053  7401781.101379 
+353457.826696  7401796.888674 
+353450.124717  7401854.198858 
+353437.796602  7401932.765400 
+353434.712512  7401953.721810 
+353427.818663  7401980.027304 
+353420.850598  7402007.642574 
+353411.301463  7402029.828774 
+353404.044780  7402037.947383 
+353404.646755  7402038.407305 
+353372.593656  7402079.750223 
+353339.179930  7402122.042978 
+353300.966897  7402157.266945 
+353263.817628  7402182.392641 
+353236.596821  7402205.138745 
+353224.887173  7402214.697108 
+353213.795993  7402221.785893 
+353199.315612  7402229.484575 
+353167.757287  7402239.842800 
+353154.002575  7402244.761958 
+353134.343561  7402256.060023 
+353108.796738  7402265.888339 
+353075.877785  7402277.676320 
+353027.719798  7402292.913710 
+352992.838243  7402303.231942 
+352946.824276  7402314.340040 
+352962.228235  7402319.269195 
+352981.334751  7402330.977190 
+352998.585865  7402351.313706 
+353007.829890  7402367.330963 
+353012.142669  7402383.968113 
+353014.608292  7402398.755580 
+353014.608292  7402422.791463 
+353013.379603  7402450.526712 
+353013.379603  7402473.942701 
+353017.692382  7402501.667952 
+353024.470783  7402520.154786 
+353031.249185  7402540.491302 
+353036.180431  7402559.598029 
+353034.333275  7402576.235179 
+353020.776472  7402597.801485 
+352996.738710  7402623.687051 
+352982.563439  7402639.704308 
+352974.556349  7402663.740191 
+352976.403505  7402684.076707 
+352988.113153  7402700.093964 
+353013.379603  7402711.192063 
+353030.020497  7402714.881431 
+353056.515636  7402714.881431 
+353079.934931  7402709.952275 
+353108.895693  7402701.323753 
+353139.093389  7402692.705229 
+353178.526864  7402695.164808 
+353211.091229  7402710.022263 
+353258.086498  7402749.015584 
+353274.578959  7402767.512415 
+353284.078617  7402771.011816 
+353301.577118  7402772.011645 
+353314.078404  7402769.012159 
+353330.570865  7402761.013529 
+353348.069367  7402756.514299 
+353363.069260  7402752.514984 
+353381.565555  7402756.014385 
+353401.059645  7402762.013357 
+353416.554312  7402771.511730 
+353436.551421  7402789.008733 
+353451.551315  7402805.005993 
+353470.542384  7402829.501797 
+353474.541806  7402842.499571 
+353475.547846  7402861.996231 
+353473.544012  7402874.994005 
+353468.546796  7402888.991607 
+353457.051551  7402900.489638 
+353436.551421  7402909.488096 
+353395.559409  7402923.985613 
+353368.066476  7402935.983558 
+353347.071573  7402949.481246 
+353327.074463  7402973.977050 
+353316.073992  7402997.473025 
+353314.078404  7403017.469600 
+353319.075620  7403037.966089 
+353334.067267  7403075.959581 
+353346.065532  7403087.957526 
+353359.564612  7403093.456584 
+353381.062535  7403095.456242 
+353408.555468  7403093.456584 
+353470.542384  7403079.458982 
+353525.454034  7403064.011628 
+353591.522834  7403037.966089 
+353616.022385  7403022.968658 
+353626.519837  7403014.970028 
+353631.517053  7403004.471826 
+353634.015660  7402989.974310 
+353640.513690  7402949.981160 
+353645.510906  7402936.983387 
+353656.008358  7402923.985613 
+353670.010457  7402917.486726 
+353732.500393  7402898.489980 
+353793.984289  7402885.992121 
+353828.478272  7402869.494947 
+353849.976195  7402856.997087 
+353867.474696  7402852.497858 
+353885.467972  7402855.997259 
+353897.466237  7402861.496317 
+353905.465081  7402874.494090 
+353906.965895  7402888.991607 
+353905.465081  7402906.988524 
+353898.967051  7402917.986641 
+353887.471806  7402926.985099 
+353863.970048  7402936.483472 
+353845.473753  7402944.982016 
+353827.975252  7402955.980133 
+353817.980820  7402972.477307 
+353814.979192  7402992.973796 
+353817.477800  7403012.970371 
+353822.483262  7403024.468401 
+353830.482106  7403031.467202 
+353840.476537  7403035.466517 
+353851.971783  7403036.966260 
+353877.469128  7403037.966089 
+353905.465081  7403034.466689 
+353934.458828  7403034.466689 
+353962.454781  7403039.465832 
+353986.946086  7403048.464291 
+353998.449578  7403062.461893 
+354003.949814  7403079.458982 
+354005.945401  7403096.456070 
+354004.444587  7403114.452988 
+353996.948764  7403139.948620 
+353975.953860  7403194.939201 
+353964.953389  7403237.431922 
+353964.953389  7403265.427127 
+353968.449791  7403291.422674 
+353980.951076  7403323.917108 
+353992.949342  7403342.913854 
+354015.948079  7403366.909744 
+354028.944139  7403377.907860 
+354060.436493  7403395.904777 
+354103.143722  7403415.361445 
+354117.426193  7403421.400410 
+354136.425509  7403430.398869 
+354152.917970  7403437.397670 
+354230.902573  7403486.889193 
+354257.900733  7403500.886795 
+354282.895058  7403508.885425 
+354303.889961  7403511.884911 
+354328.389512  7403509.885254 
+354351.883023  7403502.886452 
+354391.877242  7403487.389107 
+354452.866364  7403455.894502 
+354509.353044  7403437.897584 
+354567.843558  7403425.399725 
+354581.837411  7403422.900153 
+354620.833836  7403421.900325 
+354635.330709  7403419.900667 
+354669.321672  7403414.901524 
+354689.821801  7403411.402123 
+354724.315784  7403410.402294 
+354767.303384  7403405.903065 
+354801.797367  7403399.904092 
+354838.789958  7403397.404521 
+354867.288931  7403396.404692 
+354879.781971  7403392.405377 
+354891.285462  7403383.406918 
+354899.779080  7403369.409316 
+354908.280944  7403352.912142 
+354926.274219  7403336.414968 
+354940.276319  7403326.916595 
+354960.265182  7403322.417365 
+354981.763105  7403312.918992 
+354997.266019  7403302.920705 
+355015.259294  7403297.421647 
+355040.756639  7403287.923274 
+355057.562457  7403281.674344 
+355079.744817  7403273.425757 
+355106.742977  7403260.927898 
+355121.239850  7403256.428668 
+355139.233125  7403254.429011 
+355158.232441  7403255.928754 
+355166.231284  7403261.427812 
+355168.729892  7403272.925843 
+355171.228500  7403287.423359 
+355169.232912  7403300.921047 
+355164.227450  7403314.918650 
+355156.228607  7403342.413940 
+355153.235225  7403362.910429 
+355155.230813  7403387.406233 
+355163.229657  7403408.402637 
+355177.726530  7403428.399211 
+355207.223297  7403444.896386 
+355243.218094  7403461.393560 
+355274.207429  7403475.391162 
+355302.706402  7403475.391162 
+355321.705717  7403472.391676 
+355347.697836  7403456.394416 
+355366.194131  7403439.397328 
+355381.004362  7403420.690532 
+355394.684858  7403403.403493 
+355412.686380  7403374.408460 
+355417.180576  7403358.911114 
+355424.181625  7403332.415653 
+355431.182675  7403312.419078 
+355439.181519  7403296.921732 
+355442.677921  7403286.923445 
+355444.178735  7403280.924473 
+355451.179784  7403275.925329 
+355459.673402  7403272.925843 
+355476.668883  7403266.926870 
+355503.164022  7403266.926870 
+355531.662996  7403269.926356 
+355552.154879  7403280.924473 
+355571.154194  7403292.922417 
+355591.151303  7403306.920020 
+355601.648755  7403321.417536 
+355604.147363  7403339.414454 
+355602.151775  7403360.910772 
+355594.647705  7403384.406747 
+355584.150254  7403397.404521 
+355560.153722  7403412.401952 
+355524.661946  7403420.900496 
+355493.672611  7403427.399383 
+355487.174581  7403436.897756 
+355486.671561  7403455.394587 
+355490.167963  7403466.392704 
+355501.671455  7403476.890905 
+355513.166700  7403484.389621 
+355534.161603  7403498.387223 
+355550.159291  7403511.884911 
+355567.154772  7403532.381400 
+355586.648862  7403551.878061 
+355625.142266  7403585.372323 
+355656.642867  7403608.368384 
+355690.130810  7403632.864188 
+355726.125607  7403654.860421 
+355738.379505  7403661.749241 
+355758.120982  7403672.857338 
+355781.614493  7403688.854598 
+355796.614386  7403699.352800 
+355809.107426  7403705.351772 
+355829.104535  7403705.851686 
+355855.104900  7403700.852543 
+355871.102588  7403697.853056 
+355896.096913  7403701.352457 
+355925.585434  7403705.851686 
+355954.084407  7403705.351772 
+355973.578496  7403701.352457 
+355989.081410  7403691.354170 
+355997.575027  7403681.355882 
+356001.071429  7403667.858194 
+355998.572821  7403651.860935 
+355989.576183  7403633.864017 
+355986.079782  7403622.865901 
+355983.078154  7403610.867956 
+355985.081988  7403596.370440 
+355990.573977  7403588.871724 
+356006.571665  7403579.873265 
+356054.061707  7403562.376262 
+356131.551536  7403540.879945 
+356199.038688  7403527.382257 
+356229.030229  7403517.883884 
+356245.027916  7403506.885767 
+356252.028966  7403494.387908 
+356256.531408  7403477.390820 
+356259.524790  7403459.393902 
+356254.527574  7403438.397499 
+356246.528730  7403423.899982 
+356233.029651  7403406.402979 
+356198.040894  7403378.407775 
+356156.545862  7403356.911457 
+356074.058816  7403317.418222 
+356046.071110  7403302.420790 
+356026.074000  7403283.424044 
+356016.574343  7403268.426613 
+356009.573293  7403241.931152 
+356010.571087  7403222.434491 
+356015.073529  7403203.937660 
+356028.069588  7403189.940057 
+356045.065069  7403180.941599 
+356067.560787  7403180.441684 
+356124.550487  7403189.440143 
+356213.032542  7403206.437232 
+356263.524212  7403212.936118 
+356287.025969  7403210.936461 
+356308.020872  7403202.437917 
+356326.014148  7403187.940400 
+356339.513227  7403169.443568 
+356341.508815  7403150.946737 
+356339.513227  7403137.948963 
+356331.011363  7403131.949991 
+356321.016932  7403127.450761 
+356308.020872  7403127.450761 
+356273.023869  7403125.951018 
+356254.527574  7403122.951532 
+356230.531043  7403116.452645 
+356208.538346  7403107.454186 
+356196.540080  7403090.457098 
+356190.536824  7403063.461722 
+356191.039844  7403041.965404 
+356195.039266  7403021.968829 
+356210.533934  7402995.473368 
+356236.534299  7402969.477821 
+356254.024554  7402954.980304 
+356270.022242  7402941.982530 
+356285.022135  7402927.485014 
+356303.015410  7402916.986812 
+356321.932263  7402910.227970 
+356333.015197  7402905.988696 
+356354.513121  7402901.989381 
+356377.503612  7402905.488781 
+356390.499671  7402919.986298 
+356398.003741  7402941.482616 
+356419.501664  7403007.471313 
+356426.494468  7403026.967973 
+356437.997960  7403043.965062 
+356455.991235  7403058.462578 
+356469.985088  7403062.961808 
+356486.485796  7403061.462064 
+356498.978835  7403056.962835 
+356509.484533  7403048.964205 
+356512.477915  7403040.965575 
+356512.477915  7403030.967288 
+356510.977101  7403017.469600 
+356502.978257  7402987.474738 
+356502.978257  7402968.477992 
+356503.984297  7402952.480732 
+356507.983719  7402939.482958 
+356517.978151  7402925.985270 
+356533.472818  7402906.988524 
+356579.965067  7402868.995032 
+356593.464146  7402856.997087 
+356597.463568  7402842.499571 
+356597.463568  7402829.001883 
+356591.963332  7402817.003938 
+356574.464831  7402809.505222 
+356547.969692  7402806.005822 
+356515.479543  7402801.506593 
+356492.480806  7402790.508476 
+356475.485324  7402774.511217 
+356470.488109  7402759.513785 
+356470.991129  7402740.517039 
+356475.988344  7402721.020379 
+356489.487424  7402703.523376 
+356533.472818  7402666.529713 
+356563.967379  7402638.534508 
+356593.464146  7402613.538790 
+356617.963697  7402592.542386 
+356634.456159  7402577.544955 
+356639.956395  7402564.047267 
+356640.459415  7402547.550093 
+356636.954767  7402529.053261 
+356623.958707  7402510.556430 
+356605.965432  7402498.558485 
+356586.463096  7402494.059255 
+356560.817319  7402483.131127 
+356541.405692  7402477.952014 
+356519.808814  7402476.712227 
+356501.304272  7402476.092333 
+356477.860239  7402476.712227 
+356455.026426  7402478.561910 
+356439.605975  7402470.543284 
+356425.653353  7402453.926130 
+356418.495624  7402423.071415 
+356422.495046  7402391.576810 
+356416.994810  7402357.582633 
+356404.996545  7402326.587942 
+356391.002691  7402300.092480 
+356379.507446  7402265.598389 
+356376.002798  7402233.103955 
+356379.004426  7402206.608493 
+356383.003848  7402167.115258 
+356384.001642  7402134.120910 
+356386.005476  7402104.126047 
+356388.001063  7402083.129644 
+356395.999907  7402060.633497 
+356409.498987  7402029.638806 
+356420.499458  7402014.141461 
+356435.491106  7402000.143859 
+356451.488793  7401990.145571 
+356474.990550  7401981.147113 
+356494.987660  7401977.147798 
+356527.980829  7401977.647712 
+356553.972948  7401980.647198 
+356572.972263  7401988.145914 
+356587.963910  7401996.644458 
+356607.466246  7402014.141461 
+356637.457787  7402053.634696 
+356649.950826  7402069.132042 
+356660.951298  7402077.130672 
+356672.949563  7402083.629558 
+356684.444809  7402087.628873 
+356693.944467  7402087.628873 
+356704.441918  7402086.129130 
+356717.940998  7402078.630415 
+356727.440655  7402067.132384 
+356739.941941  7402046.635895 
+356756.434402  7402029.638806 
+356768.432668  7402021.640177 
+356783.432562  7402012.141804 
+356798.927229  7401997.144372 
+356829.421790  7401972.148654 
+356844.421683  7401958.151052 
+356851.917507  7401943.153621 
+356860.914145  7401917.158073 
+356867.412174  7401898.161327 
+356886.411490  7401882.164068 
+356906.408599  7401876.665010 
+356926.405709  7401877.164924 
+356939.047180  7401877.574854 
+356946.402818  7401879.664496 
+356955.894229  7401885.663468 
+356963.398299  7401894.162012 
+356968.395515  7401909.659358 
+356969.393309  7401933.655248 
+356965.393887  7401955.651480 
+356956.900269  7401983.146770 
+356952.397828  7402001.643602 
+356954.896435  7402019.140605 
+356961.394465  7402037.637436 
+356970.399349  7402064.632812 
+356994.387634  7402120.623222 
+357021.888813  7402182.112689 
+357032.881039  7402215.107037 
+357048.878726  7402256.599930 
+357061.380012  7402289.094364 
+357069.873629  7402298.592737 
+357079.373287  7402308.591024 
+357104.870632  7402324.588284 
+357122.369134  7402330.587257 
+357139.364615  7402331.587085 
+357159.361724  7402329.587428 
+357172.357784  7402322.588627 
+357192.857913  7402304.591710 
+357215.848404  7402272.597190 
+357235.845514  7402249.101215 
+357247.843779  7402242.602328 
+357258.844251  7402236.103441 
+357275.336712  7402218.606438 
+357293.338234  7402199.609692 
+357312.329303  7402185.612090 
+357332.326412  7402182.112689 
+357366.325621  7402185.612090 
+357394.816348  7402197.610035 
+357424.807889  7402224.105496 
+357442.306390  7402244.601985 
+357458.807098  7402265.598389 
+357547.289153  7402361.082033 
+357579.779301  7402397.075868 
+357628.770158  7402435.069360 
+357670.265190  7402464.564308 
+357710.754183  7402499.558314 
+357739.253156  7402530.553004 
+357764.247481  7402548.549922 
+357793.241228  7402564.547182 
+357811.737523  7402573.045726 
+357842.735104  7402588.043157 
+357871.728851  7402594.542044 
+357897.720970  7402594.042129 
+357922.220521  7402588.543071 
+357948.715661  7402577.045041 
+357978.204181  7402553.049151 
+358014.701998  7402515.555573 
+358036.199921  7402490.059941 
+358060.691226  7402469.563451 
+358109.187309  7402434.069531 
+358137.175016  7402419.572014 
+358163.175381  7402409.573727 
+358183.172490  7402403.574755 
+358206.666001  7402403.074840 
+358228.163925  7402409.073813 
+358250.659642  7402424.571158 
+358279.653389  7402441.068332 
+358296.648870  7402452.566363 
+358313.644352  7402462.064736 
+358323.647029  7402471.563109 
+358331.645873  7402489.060112 
+358339.644717  7402512.556087 
+358366.634630  7402571.046068 
+358390.128141  7402636.534851 
+358402.629426  7402657.531254 
+358413.629898  7402670.529028 
+358430.122359  7402681.027230 
+358443.118419  7402696.024661 
+358448.618655  7402716.021235 
+358452.618077  7402742.016783 
+358452.618077  7402767.012501 
+358447.620861  7402790.008562 
+358440.125037  7402813.504537 
+358429.627586  7402832.501283 
+358414.627692  7402854.497516 
+358400.130819  7402876.993662 
+358388.635573  7402903.489124 
+358381.634523  7402933.983900 
+358371.631845  7402993.473710 
+358368.135444  7403023.968487 
+358371.137072  7403048.964205 
+358375.136494  7403067.960951 
+358382.632317  7403080.458811 
+358403.132447  7403097.455899 
+358417.629320  7403113.453159 
+358428.621545  7403121.451789 
+358437.123409  7403129.450419 
+358438.624223  7403145.447679 
+358436.620389  7403163.944510 
+358432.126194  7403181.941427 
+358427.623752  7403192.439629 
+358412.623858  7403206.937146 
+358404.130240  7403224.434149 
+358404.130240  7403241.431237 
+358410.628270  7403254.429011 
+358421.125722  7403268.426613 
+Region 1
+420
+349823.152107  7402538.021725 
+349788.641631  7402520.774679 
+349760.299337  7402503.517635 
+349730.101640  7402490.579851 
+349707.300812  7402486.260591 
+349680.805673  7402488.730168 
+349661.080690  7402493.039430 
+349648.142354  7402500.438163 
+349631.501460  7402512.766051 
+349612.403190  7402536.791936 
+349596.999231  7402563.287397 
+349585.908051  7402596.571696 
+349579.739870  7402631.075786 
+349577.274247  7402664.350086 
+349574.808625  7402698.244280 
+349574.808625  7402713.651641 
+349577.892715  7402730.288791 
+349580.976805  7402742.616680 
+349580.976805  7402750.005414 
+349577.892715  7402756.174358 
+349571.732780  7402762.333303 
+349565.572846  7402763.563092 
+349559.404666  7402766.652563 
+349544.000707  7402775.890980 
+349521.199879  7402795.607603 
+349499.635986  7402814.094436 
+349483.613560  7402824.572642 
+349469.438289  7402833.201164 
+349455.881486  7402838.750213 
+349447.866150  7402838.750213 
+349426.302257  7402833.201164 
+349412.745454  7402824.572642 
+349390.563093  7402809.165281 
+349378.853446  7402791.298341 
+349372.685265  7402777.120770 
+349369.609421  7402760.483619 
+349361.594085  7402716.731114 
+349351.121372  7402680.987236 
+349341.258880  7402658.811035 
+349322.160610  7402635.395046 
+349295.047004  7402619.367791 
+349271.009241  7402612.588952 
+349251.910971  7402612.588952 
+349229.110143  7402622.447264 
+349210.622094  7402636.624835 
+349197.065291  7402652.032196 
+349188.439734  7402671.128925 
+349185.355644  7402689.615758 
+349186.584332  7402702.563541 
+349189.668422  7402720.430480 
+349203.225225  7402760.483619 
+349209.385160  7402780.820136 
+349218.010717  7402799.306969 
+349224.178897  7402809.165281 
+349232.804455  7402811.634858 
+349241.430012  7402814.714330 
+349259.918061  7402829.501797 
+349274.711799  7402836.900530 
+349292.581381  7402841.829686 
+349335.717413  7402849.838314 
+349365.906864  7402854.767469 
+349389.944626  7402867.705253 
+349406.577273  7402878.803352 
+349414.592609  7402891.741136 
+349417.676700  7402904.678920 
+349413.363921  7402916.386915 
+349403.501429  7402920.086281 
+349388.707691  7402920.086281 
+349378.853446  7402923.165753 
+349365.906864  7402933.643959 
+349351.121372  7402941.652587 
+349330.786167  7402955.210264 
+349307.366872  7402966.308363 
+349284.566044  7402971.237519 
+349258.689373  7402971.237519 
+349241.430012  7402966.308363 
+349227.873209  7402953.360581 
+349193.362733  7402918.236598 
+349167.486062  7402900.369658 
+349116.953160  7402879.413248 
+349062.107480  7402859.086730 
+349020.208382  7402852.917786 
+348978.919506  7402855.997259 
+348926.539448  7402863.395991 
+348875.388080  7402873.254303 
+348824.244957  7402873.874197 
+348752.148163  7402864.015885 
+348703.462417  7402843.679369 
+348639.372712  7402809.785174 
+348596.236680  7402766.032669 
+348562.344672  7402720.430480 
+348511.811771  7402668.669346 
+348491.476566  7402645.863253 
+348479.156697  7402627.376419 
+348467.447050  7402612.588952 
+348458.821492  7402587.323280 
+348448.959001  7402562.057608 
+348431.707886  7402541.111196 
+348403.357345  7402525.083941 
+348366.381247  7402518.305102 
+348322.016526  7402513.995840 
+348291.818829  7402512.766051 
+348262.239600  7402507.826897 
+348245.606953  7402500.438163 
+348223.416346  7402485.030802 
+348201.852453  7402459.765130 
+348187.677182  7402432.649774 
+348175.967535  7402390.746952 
+348169.189133  7402374.729696 
+348161.182043  7402357.472652 
+348153.166707  7402351.313706 
+348143.922683  7402348.844129 
+348132.831502  7402348.844129 
+348122.358790  7402352.543496 
+348110.649142  7402366.101174 
+348102.633806  7402388.287373 
+348081.069913  7402429.570302 
+348065.047487  7402453.606185 
+348047.796372  7402470.853230 
+348035.468257  7402483.181119 
+348021.292987  7402489.340064 
+347993.560913  7402493.659324 
+347967.535809  7402493.659324 
+347957.203282  7402493.659324 
+347926.395364  7402496.738796 
+347890.037734  7402512.146157 
+347860.458504  7402520.774679 
+347838.276144  7402529.403201 
+347788.980177  7402547.270141 
+347713.180825  7402580.544441 
+347652.785432  7402604.580324 
+347605.336620  7402625.526736 
+347569.597457  7402634.775152 
+347525.842957  7402644.013570 
+347501.194974  7402651.412302 
+347476.546990  7402664.969980 
+347437.723736  7402696.394597 
+347408.762974  7402716.731114 
+347385.962147  7402727.209319 
+347365.008474  7402732.138475 
+347342.826114  7402733.368264 
+347290.446057  7402734.608052 
+347231.906066  7402734.608052 
+347196.777123  7402738.297420 
+347150.565246  7402745.076259 
+347096.948255  7402753.704781 
+347061.827558  7402760.483619 
+347036.561108  7402772.191614 
+347018.073059  7402784.519502 
+347002.669100  7402800.536759 
+346993.425075  7402820.873275 
+346992.806608  7402835.050847 
+346995.272231  7402847.988631 
+347006.981878  7402862.166202 
+347047.652288  7402888.041770 
+347074.765894  7402900.369658 
+347100.032345  7402908.378286 
+347123.443394  7402918.856492 
+347135.771509  7402933.034063 
+347137.618664  7402947.821530 
+347134.542820  7402973.087202 
+347124.680328  7403002.662136 
+347105.573812  7403024.848336 
+347082.162763  7403037.786120 
+347058.743468  7403042.105380 
+347035.942640  7403047.034536 
+347016.225903  7403049.494114 
+346996.500919  7403058.122637 
+346989.021588  7403062.161945 
+346989.013342  7403062.161945 
+346958.312625  7403017.009679 
+346935.882878  7402984.025329 
+346861.947174  7402859.056735 
+346762.027597  7402689.865716 
+347215.157971  7402074.291158 
+347188.506154  7402012.081814 
+347156.741673  7401983.296744 
+347122.132243  7401962.220355 
+347087.267180  7401945.363242 
+347034.812907  7401930.305821 
+346994.736226  7401923.017070 
+346958.197178  7401920.647476 
+346934.217139  7401918.737803 
+346887.452765  7401916.918115 
+346817.640177  7401919.517669 
+346754.177186  7401918.497844 
+346715.048821  7401916.208236 
+346686.566340  7401913.638676 
+346667.971090  7401910.409229 
+346629.288022  7401900.130990 
+346597.078245  7401889.152870 
+346570.566614  7401878.234741 
+346544.450801  7401865.396940 
+346519.868788  7401850.309524 
+346501.339508  7401836.801838 
+346490.017433  7401825.613754 
+346476.872941  7401812.186054 
+346458.393138  7401792.169483 
+346440.366878  7401767.683677 
+346429.127266  7401748.117029 
+346417.912392  7401726.730692 
+346404.141187  7401695.696008 
+346388.506334  7401652.203458 
+346368.888551  7401589.584184 
+346354.911190  7401543.482081 
+346372.335475  7401526.514987 
+346384.119339  7401517.086602 
+346395.342459  7401511.677529 
+346412.115292  7401509.367924 
+346433.769894  7401501.559262 
+346452.315666  7401499.019697 
+346469.946108  7401488.401516 
+346487.535318  7401480.802817 
+346509.371336  7401479.303074 
+346535.577857  7401472.064314 
+346593.787999  7401461.686092 
+346615.879651  7401459.436477 
+346634.755273  7401450.597991 
+346661.324628  7401435.290613 
+346686.896190  7401417.963581 
+346705.268792  7401408.865139 
+346742.121196  7401381.849767 
+346746.912256  7401378.450349 
+346775.633878  7401358.573754 
+346793.206595  7401352.984711 
+346821.779784  7401345.316025 
+346843.211738  7401329.328763 
+346872.749736  7401313.901406 
+346911.507020  7401287.935853 
+346938.035144  7401268.709147 
+346982.902885  7401240.274018 
+346995.412417  7401229.005948 
+347011.476074  7401218.777700 
+347019.969692  7401202.700454 
+347028.488048  7401182.073987 
+347031.176319  7401161.407527 
+347032.850304  7401140.991024 
+347032.701872  7401127.653308 
+347033.559480  7401112.485906 
+347031.926726  7401093.309191 
+347031.836018  7401070.853038 
+347033.551234  7401043.877658 
+347035.043801  7401013.112928 
+347038.086660  7400978.328886 
+347043.438464  7400940.275405 
+347051.783650  7400917.669277 
+347064.787955  7400874.576658 
+347069.661478  7400855.069999 
+347077.792261  7400830.684177 
+347093.237451  7400790.041138 
+347110.307148  7400760.776151 
+347133.066745  7400731.511164 
+347145.262920  7400712.804368 
+347167.206140  7400684.359241 
+347225.746131  7400607.942330 
+347254.203873  7400570.548735 
+347272.271365  7400600.053681 
+347283.766610  7400583.896449 
+347317.988467  7400524.996538 
+347336.501255  7400493.521929 
+347352.111370  7400475.295051 
+347365.536233  7400460.267626 
+347379.686765  7400445.910085 
+347393.598156  7400434.202090 
+347407.171452  7400425.593565 
+347423.309325  7400415.795243 
+347426.286214  7400412.705772 
+347448.361374  7400394.018973 
+347459.279383  7400385.050510 
+347468.160574  7400375.392164 
+347481.123648  7400353.485916 
+347485.337472  7400334.759124 
+347485.881723  7400294.965940 
+347467.987403  7400231.886745 
+347468.276021  7400207.520919 
+347468.309006  7400173.246790 
+347470.939553  7400144.341741 
+347471.236418  7400109.617689 
+347475.829568  7400054.527125 
+347481.948271  7399989.488266 
+347490.788231  7399982.369485 
+347492.371507  7399914.221158 
+347475.252332  7399819.187437 
+347456.558127  7399727.183196 
+347424.521521  7399637.278596 
+347438.474143  7399605.913969 
+347464.853835  7399616.062230 
+347477.025272  7399624.180840 
+347495.282426  7399624.180840 
+347519.633545  7399595.775705 
+347539.919273  7399579.538486 
+347568.327537  7399579.538486 
+347606.870419  7399591.716401 
+347643.392975  7399589.686748 
+347708.315549  7399563.311266 
+347779.323841  7399543.024741 
+347828.553838  7399522.288293 
+347841.673591  7399504.181394 
+347855.840615  7399508.140716 
+347879.771176  7399510.090382 
+347913.457029  7399511.750098 
+347980.672055  7399518.628920 
+348028.689856  7399523.388105 
+348055.490105  7399524.997829 
+348115.431956  7399530.476890 
+348250.018686  7399540.155232 
+348291.983754  7399545.144378 
+348318.866466  7399545.764272 
+348364.179503  7399543.104727 
+348381.306924  7399541.674972 
+348399.168260  7399538.705481 
+348421.556776  7399533.376394 
+348456.248668  7399533.176428 
+348479.931843  7399535.835972 
+348588.806826  7399545.144378 
+348642.151692  7399548.753760 
+348666.618258  7399552.543111 
+348699.388779  7399551.993205 
+348724.877878  7399549.663604 
+348759.140966  7399547.184029 
+348878.900974  7399529.557048 
+348896.028395  7399528.517226 
+348909.750123  7399527.907330 
+348920.016680  7399526.967491 
+348948.251774  7399528.027310 
+348963.540285  7399530.436897 
+348982.622063  7399533.356397 
+349003.468534  7399539.705310 
+349027.935100  7399550.583446 
+349102.291362  7399586.977212 
+349116.582080  7399594.905854 
+349176.012664  7399625.210663 
+349267.133513  7399672.842504 
+349294.882079  7399686.480168 
+349383.322903  7399729.972718 
+349410.230353  7399743.290437 
+349439.619919  7399758.397849 
+349487.208916  7399784.633356 
+349507.700800  7399800.680607 
+349530.460396  7399816.297932 
+349549.030908  7399831.225375 
+349564.459605  7399841.653589 
+349579.937780  7399855.111283 
+349592.735930  7399867.089232 
+349606.696798  7399880.566923 
+349617.524099  7399889.145454 
+349636.490430  7399905.222700 
+349645.429344  7399915.360963 
+349691.492788  7399954.604241 
+349715.926370  7399978.580134 
+349729.458434  7399989.408279 
+349744.557282  7400002.486039 
+349762.121754  7400025.062172 
+349771.077160  7400035.970304 
+349778.919325  7400048.028238 
+349787.281003  7400068.084803 
+349794.413993  7400083.592147 
+349803.897158  7400102.478912 
+349823.803559  7400149.780809 
+349834.086609  7400171.327118 
+349842.728658  7400185.294726 
+349855.609271  7400202.221826 
+349863.797778  7400212.750023 
+349875.829028  7400225.117905 
+349891.010339  7400242.404943 
+349904.962961  7400255.502700 
+349940.091903  7400291.226581 
+350030.371637  7400374.432328 
+350103.548687  7400438.161412 
+350157.322357  7400470.995788 
+350123.463334  7400636.547430 
+350115.406767  7400688.638508 
+350112.009320  7400727.901782 
+350109.048923  7400737.730099 
+350098.889567  7400782.482433 
+350094.626266  7400798.379710 
+350091.393743  7400817.066509 
+350083.221729  7400836.253223 
+350068.617654  7400863.728516 
+350052.809630  7400883.455137 
+350039.236335  7400901.472051 
+350010.646653  7400931.306941 
+350000.256402  7400948.583981 
+349982.296112  7400961.371791 
+349972.573806  7400968.110637 
+349937.733482  7400991.646605 
+349899.751343  7401021.171548 
+349893.838796  7401030.799899 
+349890.226947  7401041.518063 
+349887.349012  7401050.326554 
+349886.367711  7401059.095052 
+349885.328686  7401064.834069 
+349893.278052  7401088.789965 
+349898.036127  7401120.524530 
+349915.501644  7401217.337946 
+349917.818835  7401240.533973 
+349936.133713  7401283.996528 
+349947.241385  7401339.547013 
+349951.999461  7401404.615867 
+349947.241385  7401461.756080 
+349940.702125  7401493.290678 
+349942.029768  7401545.431747 
+349969.390761  7401565.118375 
+350007.620286  7401574.906698 
+350024.203456  7401578.416097 
+350047.226932  7401579.985828 
+350109.106647  7401604.601611 
+350125.186797  7401641.805239 
+350139.263112  7401657.762506 
+350093.496532  7401769.383386 
+350040.069204  7401915.668329 
+350002.326206  7402014.921327 
+349887.720093  7402121.773025 
+349817.998213  7402177.233525 
+349811.656861  7402191.501081 
+349800.573927  7402204.168911 
+349786.299702  7402264.388596 
+349792.599822  7402332.077002 
+349800.557435  7402389.777118 
+349823.152107  7402538.021725 
+Region 1
+1191
+325541.730148  7409353.814242 
+325498.635346  7409351.804586 
+325482.918031  7409351.124702 
+325473.987363  7409355.563942 
+325453.784098  7409369.481558 
+325438.866667  7409386.978561 
+325420.040522  7409413.534012 
+325405.815774  7409437.109974 
+325390.749911  7409467.234814 
+325375.700540  7409495.849912 
+325362.143737  7409527.004576 
+325355.530260  7409550.670522 
+325349.180662  7409573.326641 
+325342.138381  7409611.620082 
+325338.699703  7409645.414293 
+325337.174150  7409667.370532 
+325344.661728  7409699.774982 
+325352.982175  7409725.370597 
+325358.746290  7409753.465785 
+325363.248732  7409780.791104 
+325363.809475  7409819.174530 
+325362.053028  7409861.067354 
+325358.416441  7409890.572300 
+325353.765566  7409919.307378 
+325350.648491  7409947.552540 
+325348.834321  7409972.278304 
+325349.139431  7409989.955276 
+325350.359873  7410015.220949 
+325357.781481  7410031.458167 
+325367.231661  7410069.701617 
+325368.303671  7410086.118804 
+325360.197626  7410107.245186 
+325346.921195  7410136.380195 
+325335.665090  7410166.305069 
+325328.408407  7410200.809159 
+325321.959855  7410231.793852 
+325320.393071  7410257.529443 
+325316.575066  7410280.465515 
+325314.727911  7410308.220760 
+325309.780172  7410341.245104 
+325300.898982  7410363.111358 
+325291.762158  7410384.977613 
+325277.784797  7410409.053489 
+325265.374220  7410428.860096 
+325250.992794  7410444.607399 
+325238.400800  7410457.845131 
+325226.625182  7410467.053554 
+325218.568615  7410483.630714 
+325213.431213  7410489.379729 
+325204.475807  7410495.838623 
+325195.553385  7410500.037904 
+325182.095537  7410500.637801 
+325164.992854  7410488.579866 
+325152.928619  7410478.841535 
+325131.051369  7410462.184388 
+325108.300019  7410455.865470 
+325084.798261  7410447.766857 
+325061.049117  7410439.928200 
+325038.842018  7410429.819932 
+325012.775683  7410424.730803 
+324998.633397  7410419.521695 
+324979.988670  7410408.703549 
+324954.804682  7410393.016236 
+324938.947180  7410382.228084 
+324916.319523  7410364.551111 
+324893.576419  7410357.222367 
+324857.837255  7410354.792783 
+324831.498795  7410351.463353 
+324798.538611  7410349.823634 
+324766.304095  7410351.733307 
+324741.441710  7410352.213225 
+324708.192908  7410353.343031 
+324663.201473  7410361.171690 
+324636.986706  7410368.950358 
+324602.014442  7410387.747138 
+324574.917328  7410405.614078 
+324533.983039  7410435.448967 
+324500.866177  7410468.913235 
+324449.813763  7410518.074814 
+324424.118508  7410546.309978 
+324396.633821  7410575.794927 
+324378.615808  7410598.061113 
+324361.348201  7410621.347125 
+324343.569327  7410645.133050 
+324330.177449  7410662.160134 
+324312.481038  7410679.377185 
+324296.722491  7410703.183107 
+324285.078813  7410722.749755 
+324277.731422  7410743.876137 
+324273.204241  7410762.512944 
+324270.169628  7410783.179404 
+324263.358242  7410801.786217 
+324253.932800  7410848.648190 
+324248.638720  7410867.774914 
+324247.212122  7410881.652537 
+324243.690982  7410900.299343 
+324240.697600  7410917.936322 
+324233.630580  7410936.293177 
+324223.001189  7410978.086018 
+324226.621284  7410993.783330 
+324231.733947  7411012.020206 
+324235.395274  7411024.428081 
+324239.196786  7411046.194352 
+324244.004338  7411068.970451 
+324248.869615  7411086.957370 
+324253.982278  7411105.194246 
+324261.329669  7411127.750382 
+324266.178453  7411147.497000 
+324273.492859  7411172.832660 
+324276.024452  7411194.578935 
+324281.376256  7411214.335551 
+324284.072773  7411244.410400 
+324285.342693  7411265.636764 
+324287.198095  7411302.020531 
+324269.724332  7411321.257236 
+324254.806901  7411339.024193 
+324247.294584  7411352.321915 
+324237.638248  7411375.687913 
+324227.190274  7411401.323522 
+324216.816516  7411420.900168 
+324204.191537  7411437.927252 
+324195.706166  7411447.685580 
+324178.554006  7411460.873321 
+324159.134133  7411473.021241 
+324141.215073  7411487.208810 
+324119.445025  7411504.635825 
+324107.034447  7411524.952345 
+324104.205990  7411549.918069 
+324100.989960  7411565.035479 
+324094.203313  7411581.112725 
+324085.462308  7411591.370968 
+324069.382158  7411599.269615 
+324052.081566  7411604.118785 
+324032.777140  7411605.918476 
+324012.697569  7411609.987779 
+323981.732973  7411610.897624 
+323961.892542  7411615.466841 
+323942.035618  7411621.805755 
+323921.881831  7411631.424108 
+323908.547676  7411643.642015 
+323889.424667  7411652.520494 
+323875.892602  7411660.189180 
+323853.017559  7411663.968533 
+323840.029745  7411668.367779 
+323820.469686  7411670.417428 
+323796.275245  7411678.726005 
+323785.522161  7411687.444512 
+323767.586609  7411702.641909 
+323760.668022  7411708.630883 
+323748.364645  7411719.349047 
+323735.294370  7411730.807084 
+323719.774964  7411734.676421 
+323707.092261  7411735.036360 
+323690.624538  7411733.076695 
+323679.483881  7411730.937062 
+323665.852862  7411725.727954 
+323651.661099  7411724.048242 
+323636.166431  7411726.147882 
+323626.980130  7411730.587122 
+323611.765835  7411730.167194 
+323599.891263  7411726.497822 
+323591.546077  7411723.878271 
+323574.600073  7411719.898953 
+323560.350587  7411723.768290 
+323539.240236  7411728.077552 
+323517.626866  7411732.886728 
+323495.988756  7411739.455603 
+323475.851461  7411748.064128 
+323443.014971  7411757.282549 
+323420.857349  7411765.371164 
+323402.534225  7411769.960378 
+323384.524457  7411770.000371 
+323368.048488  7411769.310489 
+323346.245454  7411768.310660 
+323323.403395  7411768.800576 
+323304.874115  7411769.860395 
+323290.847277  7411776.769211 
+323285.198609  7411782.258271 
+323277.999649  7411790.756815 
+323265.688027  7411802.234849 
+323259.717756  7411813.782871 
+323251.405555  7411830.609989 
+323245.377561  7411846.947190 
+323239.382551  7411861.024779 
+323231.886728  7411872.802762 
+323219.830738  7411884.280796 
+323211.675216  7411887.980162 
+323197.978227  7411887.320275 
+323174.938259  7411884.030838 
+323156.145099  7411885.580573 
+323135.546015  7411890.139792 
+323117.701172  7411898.018442 
+323101.612776  7411906.926916 
+323082.217641  7411917.065180 
+323065.832381  7411929.753007 
+323049.463613  7411941.431006 
+323035.346066  7411955.668567 
+323019.942107  7411971.395874 
+323007.350113  7411985.143519 
+322990.635004  7412004.650177 
+322979.832442  7412017.148037 
+322967.735221  7412032.415421 
+322951.011865  7412052.931907 
+322937.941590  7412064.399943 
+322912.320551  7412086.076230 
+322895.110668  7412104.563063 
+322876.325755  7412127.079206 
+322861.804142  7412154.184563 
+322852.370454  7412180.340083 
+322841.675093  7412205.715737 
+322827.351391  7412237.370314 
+322803.082734  7412264.025749 
+322793.690277  7412285.392089 
+322780.116982  7412309.178014 
+322771.681088  7412319.806194 
+322756.491531  7412339.442830 
+322743.668642  7412369.847622 
+322740.419627  7412383.335312 
+322723.828211  7412391.733873 
+322706.189524  7412403.651832 
+322690.092882  7412413.070219 
+322675.851641  7412416.439642 
+322667.448732  7412419.119183 
+322655.021663  7412418.979207 
+322641.844186  7412417.819405 
+322631.948709  7412418.219337 
+322617.996087  7412418.059364 
+322605.140213  7412411.090558 
+322597.594912  7412405.961436 
+322588.515812  7412401.052277 
+322578.166793  7412396.643033 
+322559.695236  7412392.903673 
+322524.038535  7412383.655257 
+322504.593923  7412375.606636 
+322477.554533  7412366.968116 
+322452.791102  7412358.859504 
+322438.871465  7412356.179963 
+322415.089336  7412351.110832 
+322397.063076  7412352.420607 
+322383.654705  7412348.981197 
+322363.410208  7412345.221840 
+322341.673144  7412337.903094 
+322330.120175  7412328.424718 
+322319.820633  7412319.976165 
+322311.541418  7412312.057521 
+322298.248494  7412299.029753 
+322280.329435  7412291.001128 
+322268.900159  7412291.880977 
+322262.022802  7412294.830472 
+322255.598989  7412301.579316 
+322248.177381  7412307.298336 
+322234.183528  7412310.927715 
+322217.179800  7412311.747574 
+322207.028690  7412312.137508 
+322189.488958  7412315.466937 
+322177.540169  7412317.606571 
+322159.184060  7412324.975309 
+322145.445840  7412328.854644 
+322132.746645  7412330.474367 
+322116.757203  7412331.054267 
+322103.571481  7412330.404379 
+322087.862411  7412328.954627 
+322074.948814  7412327.044954 
+322062.802116  7412324.385410 
+322050.688403  7412319.196298 
+322041.122776  7412312.777398 
+322029.083279  7412301.019412 
+322019.278511  7412293.330729 
+322005.861894  7412290.911143 
+321993.640980  7412295.060433 
+321980.389287  7412299.959594 
+321965.339916  7412307.118367 
+321942.687521  7412314.177158 
+321927.967999  7412314.267143 
+321912.737211  7412315.097001 
+321899.040222  7412314.947026 
+321889.400378  7412315.596915 
+321872.693515  7412312.627424 
+321856.209300  7412312.187499 
+321844.046110  7412310.787739 
+321830.134719  7412307.598285 
+321814.928669  7412306.158532 
+321800.745153  7412304.738775 
+321787.848048  7412301.309362 
+321775.206576  7412297.130078 
+321761.031306  7412294.690496 
+321750.179266  7412290.281251 
+321736.985297  7412290.131277 
+321726.562062  7412292.530866 
+321720.698992  7412294.990445 
+321710.696314  7412303.968907 
+321695.110938  7412313.887208 
+321682.156110  7412315.007016 
+321674.561331  7412313.657247 
+321663.156794  7412312.767400 
+321655.908357  7412304.098884 
+321643.877107  7412291.591027 
+321635.317520  7412285.692037 
+321625.001485  7412278.503269 
+321613.168144  7412270.794589 
+321600.048391  7412265.085567 
+321584.570216  7412265.665468 
+321569.322936  7412268.025064 
+321555.584715  7412270.894572 
+321541.376460  7412271.744427 
+321525.626159  7412273.084197 
+321517.008848  7412272.984214 
+321507.088633  7412274.893887 
+321487.990363  7412281.492757 
+321480.065735  7412286.451907 
+321468.116947  7412288.591541 
+321452.143998  7412287.901659 
+321439.238647  7412285.482073 
+321427.075457  7412284.082313 
+321406.261971  7412285.612051 
+321394.807956  7412289.011469 
+321382.545812  7412296.200237 
+321373.804807  7412306.448482 
+321365.129772  7412310.897720 
+321359.299687  7412310.327818 
+321351.704909  7412309.228006 
+321343.912221  7412302.829102 
+321332.598392  7412294.370551 
+321323.041011  7412286.941823 
+321307.084555  7412284.992157 
+321288.563521  7412285.032150 
+321269.193125  7412293.140762 
+321258.736905  7412298.079915 
+321235.581489  7412304.128879 
+321216.293555  7412305.168701 
+321198.325019  7412301.179385 
+321183.671467  7412296.460193 
+321168.754036  7412292.000957 
+321148.031258  7412285.202121 
+321142.712439  7412281.562745 
+321133.963189  7412275.293819 
+321125.205692  7412269.274850 
+321115.417416  7412263.995754 
+321106.437271  7412256.457045 
+321099.774316  7412247.718542 
+321091.668272  7412235.400652 
+321086.802996  7412225.442358 
+321081.467684  7412214.204283 
+321076.833303  7412205.505773 
+321070.252811  7412204.335973 
+321067.688233  7412205.795723 
+321061.833409  7412206.155661 
+321056.250711  7412206.025684 
+321048.928058  7412203.826060 
+321043.691702  7412199.666773 
+321037.408074  7412196.737275 
+321031.099708  7412194.817603 
+321022.960678  7412195.377507 
+321017.336749  7412197.017227 
+321012.207593  7412199.166858 
+321007.004222  7412204.845886 
+321001.297830  7412210.015000 
+321000.258805  7412222.362885 
+320998.865192  7412228.131897 
+320996.176921  7412234.890739 
+320991.064258  7412236.280501 
+320982.644856  7412238.100189 
+320970.943455  7412238.830064 
+320955.803376  7412245.788872 
+320944.984321  7412252.597706 
+320929.176297  7412266.615305 
+320918.761307  7412278.233315 
+320910.680001  7412287.631705 
+320900.265012  7412299.249715 
+320892.035274  7412303.848927 
+320874.866622  7412310.757744 
+320854.984960  7412313.817220 
+320848.800287  7412317.716552 
+320841.428156  7412318.036497 
+320832.307825  7412317.066663 
+320824.968680  7412315.876867 
+320816.178198  7412311.377638 
+320807.024882  7412311.667588 
+320797.830335  7412313.967194 
+320791.909541  7412317.616569 
+320786.227889  7412322.025814 
+320780.694668  7412330.984279 
+320776.950879  7412350.840878 
+320776.365397  7412365.968287 
+320774.312085  7412378.296175 
+320772.761794  7412390.884019 
+320777.313713  7412403.361882 
+320781.915110  7412413.320176 
+320783.539617  7412420.428958 
+320785.419758  7412427.287783 
+320783.226261  7412434.306581 
+320779.292809  7412440.015603 
+320771.508367  7412447.664293 
+320762.767362  7412452.253507 
+320758.017533  7412460.472099 
+320758.025780  7412471.320241 
+320759.831704  7412485.777765 
+320752.154463  7412499.375435 
+320743.965956  7412503.634706 
+320730.153520  7412506.584201 
+320716.316345  7412512.013271 
+320701.209251  7412518.682128 
+320667.276011  7412528.850387 
+320644.648355  7412536.049154 
+320637.721521  7412539.078635 
+320630.110250  7412547.077264 
+320625.698517  7412549.516847 
+320604.909769  7412560.464971 
+320590.289202  7412567.553757 
+320580.030891  7412583.461032 
+320568.090349  7412595.299005 
+320556.537380  7412600.828057 
+320537.826683  7412608.466749 
+320528.978477  7412611.696196 
+320521.128066  7412608.606725 
+320504.635604  7412605.417271 
+320485.891922  7412602.197823 
+320461.474833  7412601.527938 
+320424.226609  7412606.677056 
+320351.964890  7412617.005286 
+320303.411084  7412624.633980 
+320279.340337  7412626.583646 
+320263.210710  7412624.893935 
+320258.328941  7412624.084074 
+320229.203255  7412609.536566 
+320219.489195  7412605.307290 
+320212.018110  7412601.857881 
+320202.271065  7412600.238159 
+320195.129830  7412600.158172 
+320186.083714  7412603.037679 
+320175.512047  7412607.016997 
+320164.495083  7412616.965293 
+320156.083927  7412629.193199 
+320141.150004  7412652.169263 
+320135.064285  7412658.448188 
+320128.269391  7412660.977754 
+320121.136402  7412660.517833 
+320115.528965  7412658.208229 
+320109.946267  7412654.028945 
+320087.739168  7412626.863598 
+320072.986661  7412603.897532 
+320053.451341  7412573.022820 
+320044.603135  7412559.465143 
+320031.961664  7412548.487023 
+320024.869905  7412545.037614 
+320015.122861  7412543.047955 
+320004.979997  7412542.927975 
+319993.657922  7412547.267232 
+319967.220507  7412558.895240 
+319948.311900  7412569.123488 
+319900.178652  7412603.657573 
+319888.056693  7412611.346256 
+319874.475151  7412616.415387 
+319855.574790  7412625.893764 
+319830.283601  7412635.672089 
+319816.330979  7412639.981351 
+319803.169994  7412640.571250 
+319790.421322  7412638.921532 
+319757.477630  7412629.183200 
+319739.880174  7412624.484005 
+319728.624069  7412622.854285 
+319715.454839  7412624.933928 
+319710.902920  7412628.233363 
+319707.818829  7412634.552281 
+319707.373533  7412640.521258 
+319711.331724  7412654.768818 
+319719.454261  7412666.076881 
+319735.418963  7412681.954161 
+319742.428259  7412692.502354 
+319752.727802  7412710.189325 
+319764.082861  7412734.235206 
+319766.622700  7412741.363985 
+319766.548484  7412748.082834 
+319763.777751  7412759.260919 
+319759.555681  7412766.679649 
+319753.849289  7412772.208702 
+319747.070887  7412773.998395 
+319737.299104  7412774.248352 
+319728.318959  7412770.778946 
+319694.311504  7412756.541385 
+319681.975143  7412751.162307 
+319668.236922  7412738.294511 
+319656.378843  7412724.696840 
+319647.134818  7412712.258970 
+319631.351533  7412682.174124 
+319620.293337  7412664.487153 
+319606.612841  7412646.760190 
+319579.903300  7412618.794980 
+319569.430587  7412609.156631 
+319537.921739  7412580.171596 
+319520.744841  7412572.122974 
+319502.743319  7412569.283461 
+319467.399975  7412571.463087 
+319440.731665  7412571.143142 
+319422.359063  7412568.303629 
+319404.035939  7412561.354819 
+319395.468105  7412555.265862 
+319388.813397  7412546.227410 
+319379.923960  7412536.029157 
+319371.084001  7412521.721608 
+319355.152283  7412503.594713 
+319347.763661  7412493.046519 
+319341.900591  7412481.398515 
+319338.272249  7412470.520378 
+319339.533923  7412459.702231 
+319343.112787  7412443.684975 
+319351.556927  7412428.847516 
+319361.567851  7412409.170887 
+319368.906996  7412392.443752 
+319370.110946  7412386.484773 
+319372.139518  7412374.176881 
+319368.775056  7412342.012390 
+319364.594217  7412315.436942 
+319360.957630  7412305.678614 
+319353.527776  7412298.489845 
+319339.336013  7412291.601025 
+319331.848436  7412290.011298 
+319322.076652  7412290.261255 
+319310.375251  7412294.600511 
+319301.658985  7412300.469506 
+319295.193940  7412307.118367 
+319286.032378  7412318.956340 
+319276.062685  7412335.643481 
+319264.550947  7412354.930178 
+319254.985320  7412369.007766 
+319240.595647  7412378.546132 
+319231.128974  7412384.405129 
+319222.849759  7412385.804889 
+319213.424317  7412388.304461 
+319206.645916  7412390.084156 
+319192.363444  7412390.284122 
+319179.614772  7412388.634404 
+319171.747868  7412386.664742 
+319159.807326  7412380.175853 
+319138.565035  7412365.718330 
+319128.521126  7412357.749695 
+319118.889529  7412346.421635 
+319113.001720  7412336.633312 
+319106.404736  7412323.105629 
+319102.421806  7412311.107684 
+319094.860013  7412284.492243 
+319091.701707  7412265.775449 
+319089.392762  7412239.969869 
+319088.617616  7412211.194798 
+319090.407048  7412157.054072 
+319090.670928  7412135.757720 
+319089.623657  7412129.028872 
+319087.520868  7412116.670989 
+319085.302632  7412083.396689 
+319083.100888  7412048.252709 
+319083.595662  7412038.924306 
+319084.387300  7412035.194945 
+319086.325164  7412030.365772 
+319091.627491  7412027.066338 
+319099.172792  7412024.916706 
+319109.332148  7412023.177004 
+319114.997308  7412021.007375 
+319121.074780  7412015.098388 
+319126.855388  7412003.220422 
+319132.248423  7411992.452267 
+319132.322639  7411986.853226 
+319130.920780  7411978.614637 
+319128.743775  7411971.865793 
+319120.992318  7411960.557730 
+319114.304625  7411954.498768 
+319103.873143  7411947.649941 
+319091.206933  7411938.901440 
+319080.387878  7411932.792486 
+319072.215864  7411925.593719 
+319065.940482  7411916.555267 
+319060.794834  7411907.146879 
+319057.587050  7411892.919316 
+319056.943844  7411883.940854 
+319057.784960  7411876.852068 
+319060.489724  7411870.533150 
+319066.575442  7411864.634161 
+319085.112968  7411854.025978 
+319096.459782  7411847.447105 
+319104.087545  7411838.568626 
+319110.239233  7411827.070595 
+319109.637258  7411814.732708 
+319103.889636  7411793.366368 
+319097.284405  7411780.588557 
+319090.266863  7411770.410301 
+319088.477430  7411763.671455 
+319087.520868  7411749.833825 
+319088.782541  7411738.645741 
+319091.198687  7411725.228040 
+319091.685214  7411716.639511 
+319092.559315  7411706.561237 
+319093.763264  7411700.232321 
+319096.476274  7411693.533469 
+319100.335510  7411684.614996 
+319100.830284  7411675.286594 
+319098.694510  7411665.548262 
+319092.765470  7411659.129362 
+319083.076149  7411652.650472 
+319070.393447  7411645.031777 
+319062.229678  7411636.713202 
+319054.832809  7411627.284817 
+319051.220960  7411616.026745 
+319047.724559  7411594.320463 
+319049.274850  7411560.346283 
+319052.556850  7411537.600179 
+319053.802031  7411527.531903 
+319053.843262  7411524.162481 
+319052.845468  7411513.694274 
+319054.907026  7411498.776829 
+319057.463357  7411474.530982 
+319058.906447  7411448.765395 
+319057.158246  7411407.652438 
+319054.725608  7411391.185258 
+319052.177523  7411384.436414 
+319047.749297  7411378.397449 
+319041.391453  7411376.077846 
+319035.759278  7411376.017856 
+319029.731283  7411377.437613 
+319015.003515  7411383.226622 
+318999.888175  7411390.885310 
+318964.008825  7411406.142696 
+318925.886501  7411420.990153 
+318907.398452  7411427.479042 
+318892.307850  7411432.528177 
+318879.889026  7411434.617819 
+318864.122233  7411433.677980 
+318842.014089  7411429.298730 
+318811.288634  7411422.569882 
+318773.446681  7411414.631242 
+318753.218677  7411410.271989 
+318727.754317  7411403.603131 
+318714.634564  7411401.203542 
+318696.962892  7411402.113386 
+318684.527576  7411405.312838 
+318672.455094  7411409.652095 
+318661.091789  7411416.980840 
+318647.081443  7411426.519206 
+318631.562037  7411436.047574 
+318622.491183  7411440.416825 
+318611.193847  7411442.516466 
+318595.039481  7411442.696435 
+318572.956075  7411436.067570 
+318546.065117  7411423.039802 
+318528.179043  7411411.241823 
+318512.263818  7411391.995120 
+318494.056141  7411375.707909 
+318483.245332  7411369.219021 
+318463.784228  7411363.000086 
+318433.058772  7411357.021110 
+318417.333211  7411352.341912 
+318409.491045  7411348.512568 
+318404.683493  7411342.853537 
+318400.997428  7411337.204505 
+318399.595568  7411328.965916 
+318402.028206  7411314.048471 
+318409.713693  7411300.330821 
+318429.430431  7411285.623340 
+318458.168545  7411269.916031 
+318469.136032  7411264.446967 
+318482.775297  7411254.908601 
+318491.128729  7411247.539863 
+318494.221065  7411240.481073 
+318495.053934  7411233.762223 
+318492.126523  7411227.373318 
+318482.090860  7411218.664810 
+318466.027203  7411211.735996 
+318450.293394  7411207.806669 
+318435.648089  7411207.626700 
+318422.833446  7411211.206087 
+318400.947950  7411219.154726 
+318383.589635  7411225.293674 
+318365.522143  7411228.433136 
+318344.090190  7411230.032862 
+318310.264152  7411231.482614 
+318274.549727  7411233.662241 
+318232.056900  7411237.241627 
+318216.248876  7411239.291276 
+318187.255129  7411244.910314 
+318159.036528  7411248.669670 
+318133.803062  7411253.968762 
+318104.042416  7411260.697610 
+318090.840201  7411265.016870 
+318077.225674  7411271.945683 
+318063.602901  7411280.364241 
+318044.323213  7411290.212554 
+318029.991265  7411294.521816 
+318014.207979  7411295.451657 
+317998.457679  7411292.642138 
+317986.154303  7411285.393380 
+317974.659057  7411273.295452 
+317961.745460  7411254.078743 
+317947.347541  7411233.732229 
+317934.755547  7411219.384686 
+317919.838116  7411210.226255 
+317901.135665  7411203.647382 
+317885.789429  7411199.348118 
+317871.894531  7411199.178147 
+317862.477335  7411201.307783 
+317840.987658  7411207.386741 
+317816.867434  7411213.815640 
+317799.154530  7411218.454845 
+317781.499350  7411218.234883 
+317770.647311  7411214.735483 
+317753.099332  7411206.306926 
+317739.715700  7411194.558939 
+317725.284796  7411177.191913 
+317711.653777  7411155.355654 
+317705.073285  7411140.708163 
+317703.762134  7411125.000853 
+317707.316259  7411111.223213 
+317720.419520  7411084.487793 
+317731.197343  7411063.701353 
+317739.344619  7411042.135047 
+317743.492473  7411010.810413 
+317744.102694  7410991.763676 
+317746.881674  7410979.475780 
+317752.324186  7410964.968265 
+317764.470884  7410955.039966 
+317786.513059  7410934.013568 
+317803.945590  7410921.525707 
+317818.434217  7410904.528618 
+317824.709599  7410883.312252 
+317828.478126  7410851.977620 
+317829.278011  7410817.243569 
+317831.694156  7410804.575739 
+317856.944115  7410815.903799 
+317868.307420  7410818.183408 
+317884.280369  7410818.313386 
+317901.630438  7410813.934136 
+317915.706754  7410808.974986 
+317929.453221  7410796.187176 
+317940.165074  7410783.339377 
+317954.274375  7410766.282299 
+317967.122002  7410749.205224 
+317984.364870  7410728.438781 
+317996.618769  7410714.621148 
+318010.241542  7410696.544244 
+318019.980341  7410682.156708 
+318029.447013  7410668.269087 
+318037.586043  7410656.871040 
+318044.735525  7410655.021357 
+318057.335765  7410658.340788 
+318065.590242  7410663.069978 
+318083.707211  7410668.788998 
+318098.220577  7410676.937602 
+318111.348576  7410679.517161 
+318122.777852  7410679.027245 
+318128.723384  7410674.128084 
+318133.151610  7410669.448885 
+318137.464389  7410658.970680 
+318139.575424  7410655.491276 
+318141.307132  7410646.962737 
+318141.059745  7410636.374551 
+318138.643600  7410631.275424 
+318133.638138  7410628.635876 
+318126.414440  7410623.176811 
+318123.495274  7410618.067686 
+318120.081334  7410612.198692 
+318120.172043  7410608.419339 
+318121.013159  7410605.159897 
+318128.698645  7410602.070427 
+318136.326409  7410601.490526 
+318146.502257  7410599.970786 
+318157.420267  7410599.720829 
+318174.432241  7410598.860976 
+318186.372783  7410597.881144 
+318200.671747  7410593.931821 
+318205.809148  7410591.282274 
+318211.004274  7410586.363117 
+318219.102072  7410576.724768 
+318228.478036  7410566.616499 
+318233.516483  7410557.408077 
+318231.990931  7410547.039853 
+318230.572579  7410542.730591 
+318228.115202  7410539.651118 
+318220.751318  7410529.642833 
+318211.342369  7410520.104467 
+318206.526570  7410509.406299 
+318201.809726  7410505.267008 
+318200.943872  7410499.198048 
+318204.530983  7410487.190105 
+318209.536445  7410479.491423 
+318209.223088  7410471.672762 
+318205.611239  7410463.524158 
+318203.656882  7410460.454684 
+318198.544219  7410451.776171 
+318193.670697  7410443.347614 
+318192.178129  7410431.969563 
+318196.952697  7410402.354636 
+318199.583244  7410387.797130 
+318205.545269  7410372.059825 
+318211.144459  7410360.861743 
+318219.778263  7410349.973608 
+318231.059106  7410344.944470 
+318246.388849  7410340.515229 
+318258.865396  7410338.295609 
+318278.870752  7410329.437126 
+318289.442419  7410322.128378 
+318295.519891  7410311.940123 
+318301.259268  7410305.521223 
+318310.387845  7410284.574811 
+318318.625830  7410269.147453 
+318324.777518  7410255.939716 
+318332.256849  7410240.492362 
+318347.702039  7410220.695753 
+318362.388576  7410200.629190 
+318368.985560  7410179.622788 
+318378.345032  7410159.686203 
+318385.395559  7410140.949412 
+318398.449342  7410125.632036 
+318410.678502  7410113.074187 
+318422.816954  7410093.447549 
+318429.059351  7410066.132228 
+318438.707440  7410055.274088 
+318446.788746  7410046.395609 
+318458.399439  7410038.346987 
+318475.815478  7410031.198212 
+318494.229311  7410025.079260 
+318516.452903  7410018.550378 
+318529.984967  7410016.670700 
+318545.809484  7410010.671728 
+318557.362453  7410004.892718 
+318575.932965  7409992.224888 
+318597.480365  7409971.568426 
+318613.387344  7409953.801469 
+318629.269584  7409936.784384 
+318640.220579  7409924.446497 
+318645.828016  7409912.988460 
+318656.374945  7409896.351310 
+318661.924658  7409876.574697 
+318661.462869  7409853.888583 
+318660.968095  7409842.790484 
+318661.504100  7409820.884237 
+318666.534301  7409812.185727 
+318674.153818  7409801.277595 
+318699.494485  7409781.211032 
+318718.518539  7409770.822812 
+318733.881266  7409764.633872 
+318755.486391  7409752.285987 
+318766.833204  7409744.747278 
+318771.574787  7409737.298554 
+318773.355973  7409726.500404 
+318770.585239  7409715.352313 
+318763.188370  7409706.613810 
+318757.877798  7409695.655687 
+318748.064783  7409681.818057 
+318742.333653  7409667.070584 
+318735.167678  7409649.013677 
+318731.374412  7409627.507360 
+318730.277664  7409609.840387 
+318732.875226  7409586.724346 
+318735.530513  7409581.745199 
+318739.513442  7409574.276478 
+318747.545271  7409567.157698 
+318758.826114  7409562.388515 
+318774.403244  7409557.969272 
+318798.094664  7409553.729998 
+318826.857517  7409549.370744 
+318852.833144  7409545.191460 
+318868.913293  7409540.782216 
+318884.572885  7409533.333492 
+318896.348503  7409528.574307 
+318907.588115  7409514.976636 
+318913.022381  7409499.989203 
+318912.074064  7409486.871450 
+318910.721683  7409479.782664 
+318907.217035  7409467.604750 
+318901.898216  7409456.646627 
+318897.428759  7409442.179105 
+318895.515633  7409427.011703 
+318893.165458  7409409.064778 
+318888.753724  7409392.087686 
+318884.078111  7409375.850467 
+318879.138619  7409359.863205 
+318871.774735  7409339.276732 
+318870.504816  7409328.918506 
+318873.514690  7409319.920047 
+318876.392624  7409305.622496 
+318881.530026  7409292.644719 
+318882.948378  7409276.047562 
+318882.445358  7409265.199420 
+318883.236996  7409253.621404 
+318887.087986  7409241.373502 
+318891.763598  7409226.366072 
+318898.533754  7409218.957341 
+318906.738753  7409215.377954 
+318914.886029  7409214.058180 
+318927.807873  7409214.608086 
+318937.653872  7409216.347788 
+318945.999057  7409217.557581 
+318958.022062  7409223.636540 
+318963.876885  7409223.016646 
+318969.484322  7409221.636882 
+318976.741005  7409215.257975 
+318980.938337  7409209.558951 
+318987.947633  7409195.221407 
+318990.099899  7409184.133306 
+318994.066336  7409169.275851 
+318995.591888  7409145.559914 
+318996.820577  7409125.373371 
+319002.395029  7409103.207168 
+319006.163556  7409083.550535 
+319016.974365  7409070.532765 
+319032.180414  7409050.486199 
+319041.152313  7409043.757351 
+319056.012020  7409032.289316 
+319071.688105  7409015.782143 
+319078.128411  7409007.763517 
+319090.679174  7408998.805051 
+319103.188706  7408993.375981 
+319120.481052  7408992.286168 
+319142.094422  7408991.496303 
+319166.998039  7408991.736262 
+319188.339284  7408992.206182 
+319205.623383  7408992.376153 
+319222.643603  7408992.546123 
+319237.725959  7408984.617482 
+319244.867195  7408982.417858 
+319260.394847  7408979.798307 
+319270.834575  7408978.138591 
+319285.603574  7408975.758999 
+319293.297307  7408968.770196 
+319301.007533  7408960.761568 
+319305.460497  7408948.693635 
+319324.286642  7408946.603993 
+319332.392687  7408948.703633 
+319339.740078  7408951.303188 
+319349.066565  7408958.212005 
+319361.196770  7408965.150816 
+319372.032317  7408973.599369 
+319381.424774  7408974.449223 
+319393.142668  7408972.289593 
+319421.386008  7408969.040150 
+319435.858143  7408969.939996 
+319442.933409  7408974.309247 
+319450.528187  7408977.158759 
+319463.144920  7408985.117396 
+319473.032150  7408987.736947 
+319488.015552  7408989.146706 
+319507.328224  7408988.836759 
+319527.201640  7408984.237547 
+319540.931614  7408983.367696 
+319563.048004  7408983.587658 
+319574.180416  7408988.246860 
+319588.594827  7408994.955711 
+319597.162660  7409001.354615 
+319603.330841  7409018.831621 
+319611.453378  7409019.931433 
+319617.819468  7409018.981595 
+319629.009603  7409018.081749 
+319638.979296  7409012.882640 
+319646.920416  7409006.393752 
+319654.655380  7408996.375468 
+319658.613571  7408982.277882 
+319666.967003  7408961.651415 
+319675.485359  7408949.613477 
+319686.477585  7408943.164582 
+319704.091533  7408936.525719 
+319717.326733  7408934.636043 
+319727.741723  7408934.736026 
+319746.031862  7408935.175950 
+319757.197259  7408936.805671 
+319773.697966  7408938.735341 
+319782.133860  7408934.026147 
+319789.802855  7408929.806870 
+319795.476261  7408922.288158 
+319805.495431  7408912.289871 
+319819.060481  7408903.331405 
+319836.740399  7408890.133666 
+319848.153183  7408868.277410 
+319856.465383  7408851.190336 
+319867.606041  7408831.103777 
+319884.403613  7408805.268203 
+319894.546476  7408783.401948 
+319910.107113  7408754.516896 
+319929.271353  7408720.372744 
+319951.000171  7408684.478893 
+319967.773004  7408660.912929 
+319972.489848  7408647.325257 
+319978.996124  7408632.997711 
+319990.079058  7408618.970114 
+320007.091032  7408596.673933 
+320017.415313  7408581.626510 
+320024.713227  7408564.279482 
+320030.172232  7408553.221376 
+320031.524613  7408544.902801 
+320031.978156  7408526.725914 
+320031.862709  7408513.348206 
+320035.540528  7408502.520061 
+320036.958879  7408488.402479 
+320034.534488  7408477.514344 
+320021.183840  7408466.526226 
+320010.084414  7408458.587586 
+320002.761761  7408453.718420 
+319993.253857  7408439.990771 
+319991.348978  7408427.842852 
+319991.200546  7408417.494625 
+319992.058154  7408408.666137 
+319990.425400  7408395.518389 
+319987.992762  7408384.890209 
+319980.752571  7408372.952254 
+319971.978582  7408360.994303 
+319965.208427  7408352.845698 
+319957.968236  7408340.907743 
+319953.474040  7408333.289048 
+319952.863819  7408318.381602 
+319954.719221  7408311.332809 
+319966.997859  7408303.884085 
+319975.953265  7408298.415022 
+319985.716802  7408288.416734 
+319994.202174  7408279.408278 
+320000.708450  7408264.830775 
+320005.895329  7408255.292408 
+320012.121233  7408242.974518 
+320017.357589  7408228.387017 
+320026.337734  7408220.398385 
+320037.857719  7408212.939663 
+320046.846110  7408204.441119 
+320056.824049  7408197.972227 
+320066.884450  7408184.194587 
+320074.207103  7408164.567949 
+320075.608963  7408152.460023 
+320078.107570  7408132.543434 
+320079.583646  7408112.866805 
+320088.027786  7408083.661807 
+320092.835338  7408062.245476 
+320087.953570  7408043.008771 
+320083.277957  7408028.311288 
+320079.097118  7408015.643458 
+320076.441832  7408002.235755 
+320061.656340  7407982.899067 
+320043.630080  7407980.699444 
+320031.895694  7407984.878728 
+320015.840283  7407989.257978 
+320003.413213  7407987.118344 
+319996.882199  7407979.219697 
+319994.960827  7407969.101430 
+319996.074068  7407960.022985 
+319997.236786  7407946.405318 
+319994.532023  7407937.786794 
+319991.085098  7407926.898659 
+319990.417154  7407918.560088 
+319995.364892  7407906.992069 
+320004.542947  7407904.812442 
+320015.807298  7407897.103763 
+320026.535644  7407891.394741 
+320041.881879  7407882.466270 
+320047.802673  7407875.197515 
+320051.818587  7407856.300752 
+320051.488738  7407839.633607 
+320047.324391  7407825.206078 
+320045.271080  7407802.959889 
+320037.907196  7407778.144140 
+320032.200804  7407765.206356 
+320033.058412  7407756.377868 
+320037.725779  7407747.589373 
+320043.118814  7407742.590230 
+320054.168763  7407731.342156 
+320067.511164  7407719.354210 
+320084.490153  7407699.577597 
+320081.356585  7407683.640327 
+320077.390148  7407674.511891 
+320067.750305  7407672.392254 
+320058.522773  7407662.493949 
+320053.467833  7407653.315522 
+320051.736125  7407649.256217 
+320045.765854  7407630.589416 
+320042.830196  7407614.362194 
+320041.568522  7407601.434408 
+320043.687804  7407593.625746 
+320047.860396  7407588.506623 
+320059.438104  7407587.936720 
+320071.279691  7407586.107034 
+320118.679025  7407597.045160 
+320172.576389  7407596.285290 
+320214.920783  7407601.164455 
+320223.241230  7407602.644201 
+320231.817310  7407606.663513 
+320236.369229  7407610.192908 
+320242.957967  7407619.801262 
+320245.769932  7407628.669743 
+320260.679117  7407622.060875 
+320275.497593  7407614.382190 
+320286.786683  7407604.903814 
+320298.603532  7407592.395957 
+320309.117476  7407583.667452 
+320325.016208  7407570.939632 
+320597.818011  7407607.713333 
+320617.988291  7407611.932610 
+320752.566775  7407630.059505 
+321039.337692  7407658.644609 
+321300.413354  7407685.050086 
+321356.331044  7407684.780132 
+321364.602014  7407675.361745 
+321361.352999  7407680.190918 
+321517.569592  7407682.160581 
+321537.731626  7407782.963314 
+321446.998350  7407808.168997 
+321401.635835  7407868.658635 
+321361.311768  7407984.588777 
+321371.396908  7408024.911870 
+321426.836316  7408060.195827 
+321436.921456  7408110.597193 
+321497.407558  7408145.881150 
+321598.217728  7408216.449062 
+321704.066344  7408372.702297 
+321799.829821  7408443.270209 
+321935.925612  7408473.505031 
+321996.263281  7408563.349641 
+321973.693348  7408865.477889 
+322122.339902  7408827.174450 
+322153.997181  7408817.926034 
+322179.230647  7408821.955344 
+322203.441580  7408824.214957 
+322238.108734  7408813.926719 
+322253.496200  7408815.526445 
+322284.716429  7408813.396810 
+322313.132940  7408807.247863 
+322329.963497  7408801.988764 
+322358.701611  7408803.438516 
+322380.933448  7408809.517475 
+322404.113603  7408809.247521 
+322415.180044  7408807.857759 
+322542.592554  7408824.914837 
+322552.166428  7408825.304770 
+322618.490861  7408831.143770 
+322646.717708  7408831.833652 
+322706.362695  7408824.314940 
+322746.307436  7408812.696930 
+322797.541267  7408796.149764 
+322856.287414  7408773.943568 
+322892.216241  7408763.895289 
+322973.557060  7408733.830439 
+323012.512254  7408723.502208 
+323084.922405  7408707.474954 
+323121.346006  7408697.166719 
+323156.079129  7408692.207569 
+323171.128500  7408685.708682 
+323189.567072  7408664.212364 
+323240.083481  7408624.859105 
+323266.083846  7408604.292628 
+323285.949016  7408575.167617 
+323310.407336  7408525.216173 
+323369.953367  7408430.022479 
+323376.789492  7408433.241927 
+323381.753723  7408451.678769 
+323378.001688  7408480.363856 
+323369.186468  7408506.809326 
+323349.016188  7408583.066264 
+323338.073440  7408622.979427 
+323332.771113  7408647.615207 
+323340.761711  7408665.532138 
+323356.272871  7408680.809521 
+323412.033882  7408714.133813 
+323433.168971  7408686.008631 
+323471.142864  7408626.788774 
+323499.311987  7408595.554125 
+323531.612473  7408575.157618 
+323560.243386  7408565.459280 
+323595.751655  7408563.279653 
+323625.256668  7408566.999016 
+323662.950188  7408582.016444 
+323694.623960  7408599.153508 
+323744.876490  7408637.856879 
+323762.630624  7408649.064959 
+323778.042830  7408652.944294 
+323792.391271  7408651.764496 
+323803.399989  7408644.275779 
+323816.610450  7408629.438321 
+323865.461121  7408626.088894 
+323902.181586  7408619.340050 
+323929.468363  7408602.053011 
+323981.502078  7408563.689583 
+324000.311730  7408553.851268 
+323944.542473  7408521.396827 
+323919.341992  7408488.632439 
+323909.265098  7408387.819708 
+323932.321559  7408300.704630 
+323962.189406  7408173.676388 
+323987.381641  7408069.404249 
+324226.802701  7408091.700430 
+324388.098973  7408147.140934 
+324473.785555  7408232.826257 
+324605.832447  7408468.165945 
+324674.861644  7408739.399485 
+324786.292958  7408782.232148 
+324947.589230  7408767.114738 
+325164.324910  7408757.036464 
+325209.695671  7408787.281284 
+325270.173526  7408757.036464 
+325426.431351  7408741.909055 
+325541.730148  7409353.814242 
+Region 1
+171
+320590.668529  7394417.702662 
+320570.011721  7394476.472595 
+320568.543892  7394484.331249 
+320549.453868  7394530.903272 
+320537.991607  7394560.358227 
+320525.820171  7394599.411537 
+320479.657772  7394708.622830 
+320405.985947  7394870.235148 
+320381.700798  7394935.883902 
+320372.349572  7394970.877908 
+320365.571171  7395000.312866 
+320356.698227  7395038.366348 
+320352.756528  7395105.674819 
+320351.461870  7395155.456292 
+320350.060011  7395177.552507 
+320353.531674  7395239.561885 
+320358.553628  7395296.252175 
+320366.404040  7395347.883331 
+320377.330296  7395439.667609 
+320387.250511  7395528.912322 
+320407.123927  7395687.585143 
+320383.778848  7395733.017361 
+320392.660038  7395796.126551 
+320390.804637  7395835.439817 
+320377.305557  7395872.873405 
+320334.886947  7395944.311168 
+320267.944046  7396038.704999 
+320230.844254  7396050.452987 
+320282.383196  7396157.084722 
+320290.316070  7396178.331083 
+320297.745924  7396227.812607 
+320295.115376  7396267.875744 
+320296.665667  7396294.611165 
+320309.612250  7396320.956652 
+320315.293903  7396337.903749 
+320320.695184  7396358.880156 
+320322.509354  7396382.846051 
+320329.972193  7396399.303232 
+320337.888574  7396422.069332 
+320344.320634  7396470.031117 
+320340.510876  7396529.990846 
+320329.164062  7396582.821797 
+320323.012374  7396620.585328 
+320312.721079  7396667.877228 
+320308.449531  7396692.792960 
+320307.484722  7396717.488730 
+320306.231295  7396745.463938 
+320321.915626  7396777.378471 
+320432.208961  7396888.099506 
+320457.615597  7396909.775793 
+320584.657027  7397045.872481 
+320602.031835  7397059.150206 
+320621.393984  7397076.227281 
+320632.691320  7397088.945103 
+320646.742897  7397104.962359 
+320661.569620  7397119.469874 
+320672.083564  7397133.687439 
+320681.377066  7397143.615738 
+320687.149427  7397149.714693 
+320695.445135  7397158.113255 
+320697.943743  7397171.510960 
+320700.013547  7397186.898324 
+320696.706809  7397217.623061 
+320702.874989  7397270.414019 
+320706.478592  7397280.662263 
+320708.424702  7397312.206860 
+320758.627755  7397294.119958 
+320872.565923  7397259.935813 
+320954.607672  7397239.429326 
+321025.253130  7397232.590497 
+321089.062463  7397223.472059 
+321155.156001  7397230.310888 
+321439.873607  7397044.702681 
+321435.824708  7396919.844068 
+321439.766406  7396810.552789 
+321460.010902  7396574.223270 
+321538.275877  7396361.519704 
+321734.049639  7396143.926976 
+321851.319285  7396032.046140 
+321998.324839  7395885.191295 
+322149.478247  7395741.825852 
+322323.325281  7395595.220964 
+322440.265078  7395484.729890 
+322541.866886  7395376.308462 
+322679.249088  7395255.479159 
+322778.038931  7395159.315631 
+322908.486054  7395063.202094 
+322960.626970  7395008.331493 
+323055.293698  7394922.096264 
+323196.576368  7394782.140237 
+323287.581769  7394707.702988 
+323222.428301  7394645.443652 
+323177.948133  7394563.257730 
+323163.756370  7394483.771345 
+323167.590867  7394443.338271 
+323165.661249  7394282.015904 
+323146.868090  7394239.923114 
+323124.116739  7394203.979271 
+323100.408826  7394172.134726 
+323080.222053  7394152.618069 
+323037.861167  7394125.962635 
+322826.287627  7394000.014208 
+322499.473014  7393798.698692 
+322483.970100  7393790.020179 
+322461.342443  7393780.821754 
+322433.618616  7393774.642813 
+322410.224060  7393772.543172 
+322370.271072  7393773.443018 
+322325.782658  7393760.095304 
+322267.292144  7393743.938072 
+322216.957152  7393724.751359 
+322189.521943  7393709.693938 
+322171.487436  7393692.626861 
+322145.858151  7393666.661309 
+322121.762665  7393638.156191 
+322102.466486  7393618.809505 
+322078.090628  7393600.462648 
+322053.442644  7393586.944963 
+322023.187224  7393575.926851 
+322000.048301  7393570.017863 
+321977.148519  7393570.717743 
+321931.068582  7393580.216116 
+321820.602076  7393594.613650 
+321795.921108  7393597.333184 
+321770.992752  7393593.703806 
+321743.021538  7393586.764994 
+321701.056470  7393575.976842 
+321647.876529  7393577.586566 
+321632.299399  7393601.152530 
+321610.117039  7393620.119281 
+321570.609348  7393647.164648 
+321457.446324  7393720.942011 
+321396.284032  7393764.414565 
+321374.109918  7393778.562141 
+321350.121633  7393807.667156 
+321335.558789  7393830.223292 
+321293.321596  7393931.615924 
+321281.306838  7393952.402364 
+321273.143070  7393963.540456 
+321264.476281  7393969.349461 
+321253.789166  7393974.908509 
+321237.733755  7393980.437562 
+321218.643731  7393983.177093 
+321193.204110  7393980.307584 
+321166.758448  7393971.599076 
+321150.769007  7393966.229995 
+321121.767014  7393954.462011 
+321074.227494  7393937.314948 
+321027.446627  7393920.407844 
+321018.515960  7393917.648317 
+320963.406400  7393897.361792 
+320927.296156  7393881.784460 
+320884.333295  7393867.696873 
+320871.873240  7393865.367272 
+320856.856854  7393865.837192 
+320833.181926  7393869.826508 
+320814.339289  7393877.375215 
+320801.838003  7393888.513308 
+320795.463667  7393897.891701 
+320782.426376  7393918.408187 
+320775.507789  7393938.444755 
+320752.146217  7394000.004210 
+320741.500333  7394022.800305 
+320727.094169  7394061.873613 
+320706.561054  7394115.714390 
+320681.830609  7394182.982868 
+320666.599821  7394221.756226 
+320639.230581  7394292.724070 
+320620.866225  7394345.954952 
+320601.792694  7394391.277189 
+320590.668529  7394417.702662 
+Region 1
+367
+318137.109801  7391777.094974 
+318157.115156  7391774.235464 
+318196.969189  7391732.072686 
+318223.695223  7391681.961270 
+318227.034946  7391625.160999 
+318223.695223  7391571.710155 
+318214.137841  7391495.123274 
+318218.656776  7391494.383400 
+318301.754042  7391488.984325 
+318315.739649  7391480.505777 
+318345.689959  7391473.866915 
+318363.872897  7391466.138238 
+318401.483955  7391421.005969 
+318416.706497  7391401.979228 
+318436.703606  7391384.842164 
+318459.537419  7391372.474282 
+318492.843945  7391351.537868 
+318529.960229  7391318.223575 
+318537.876610  7391297.777077 
+318537.571500  7391283.019605 
+318537.571500  7391264.932703 
+318538.528062  7391239.237105 
+318545.191017  7391202.123462 
+318555.474066  7391179.767291 
+318567.076513  7391161.200472 
+318590.866888  7391132.645363 
+318610.863998  7391112.658786 
+318629.888052  7391096.481557 
+318646.792825  7391084.673580 
+318682.226878  7391045.090360 
+318700.310861  7391022.254272 
+318733.617387  7391000.368021 
+318753.606250  7390978.471771 
+318762.174084  7390959.445030 
+318769.793601  7390943.267801 
+318778.369681  7390925.270884 
+318782.146454  7390912.813018 
+318790.722534  7390902.344811 
+318937.299284  7390809.060790 
+318937.282792  7390809.070788 
+318987.271442  7390814.669829 
+319066.641412  7390823.018399 
+319134.516136  7390826.917731 
+319184.323369  7390825.817920 
+319230.625954  7390827.097700 
+319257.846762  7390828.927387 
+319269.333761  7390824.218194 
+319273.869188  7390822.668459 
+319311.801849  7390817.509343 
+319347.417319  7390807.781009 
+319391.575884  7390795.883047 
+319422.441525  7390783.725130 
+319451.781614  7390766.388099 
+319471.993125  7390752.570466 
+319478.821004  7390744.891781 
+319552.113502  7390704.138762 
+319596.387515  7390685.212004 
+319685.826132  7390644.648952 
+319734.948928  7390627.411905 
+319806.550949  7390607.835258 
+319851.113579  7390596.317231 
+319968.152331  7390592.297919 
+319999.999274  7390582.759553 
+320113.203528  7390565.742468 
+320132.029673  7390564.162739 
+320158.302163  7390560.743324 
+320194.626809  7390557.223927 
+320220.313818  7390552.494737 
+320311.682053  7390535.307681 
+320451.686557  7390505.742746 
+320557.296033  7390478.787363 
+320638.051370  7390469.119019 
+320688.007035  7390463.140043 
+320707.633064  7390460.790445 
+320736.816474  7390489.175583 
+320761.200579  7390516.360927 
+320776.398382  7390531.958255 
+320793.410355  7390535.337676 
+320878.437240  7390555.024304 
+320898.450841  7390566.862276 
+320914.242373  7390600.816460 
+320924.467699  7390629.651521 
+320936.968985  7390660.776190 
+320951.927647  7390682.132532 
+321029.780311  7390696.800019 
+321064.793806  7390702.978961 
+321093.548412  7390702.069117 
+321154.793167  7390664.825496 
+321187.712120  7390647.498464 
+321202.753245  7390642.259361 
+321218.750932  7390643.389168 
+321227.640369  7390645.238851 
+321239.036660  7390650.397967 
+321251.158619  7390662.955816 
+321258.398809  7390684.132189 
+321263.593934  7390714.377008 
+321266.686271  7390736.613200 
+321272.656542  7390757.269661 
+321281.240868  7390766.488082 
+321293.346335  7390780.055758 
+321330.042061  7390805.251442 
+321344.505950  7390808.660858 
+321359.769722  7390807.751014 
+321380.921304  7390800.012340 
+321401.042107  7390794.293319 
+321427.792879  7390785.574813 
+321449.109385  7390790.304003 
+321469.840409  7390808.510884 
+321479.067941  7390834.276471 
+321477.666082  7390855.142896 
+321474.466545  7390877.509065 
+321474.326359  7390898.115536 
+321482.547851  7390924.141078 
+321492.261910  7390953.975967 
+321492.187694  7390965.434005 
+321483.636353  7390987.410240 
+321476.536348  7390998.948264 
+321453.776752  7391046.600102 
+321437.366753  7391066.846634 
+321431.676854  7391082.583938 
+321433.589979  7391099.900972 
+321439.354094  7391113.428654 
+321459.549113  7391134.954967 
+321485.557725  7391161.340448 
+321495.082121  7391182.266863 
+321498.017779  7391198.074155 
+321494.109066  7391213.061588 
+321477.253770  7391235.417759 
+321469.337389  7391267.862201 
+321466.121359  7391293.547802 
+321479.496745  7391308.125305 
+321510.700482  7391357.716810 
+321521.280396  7391371.794399 
+321537.673902  7391392.260893 
+321559.443951  7391405.388644 
+321591.934100  7391413.507254 
+321610.479873  7391414.147144 
+321628.547364  7391410.957690 
+321684.077481  7391393.790631 
+321748.546513  7391367.525130 
+321795.014022  7391341.369610 
+321817.996267  7391324.482503 
+321839.955979  7391310.384918 
+321869.526962  7391297.097194 
+321894.447071  7391295.997382 
+321907.888427  7391301.936365 
+321924.850924  7391312.244599 
+321926.326999  7391319.383376 
+321931.818989  7391335.190669 
+321933.773345  7391347.678530 
+321936.412139  7391370.604603 
+321937.360456  7391376.423606 
+321948.121787  7391407.328312 
+321976.249679  7391420.496057 
+322011.279667  7391428.634663 
+322040.232183  7391431.894104 
+322059.759257  7391431.684140 
+322075.047769  7391433.403846 
+322106.507139  7391443.292152 
+322127.708198  7391466.588161 
+322135.740026  7391481.915536 
+322139.920865  7391502.821955 
+322141.363956  7391517.079513 
+322150.377086  7391536.476190 
+322164.189522  7391562.791683 
+322169.219723  7391570.200414 
+322226.712443  7391602.414896 
+322368.531118  7391684.830778 
+322422.972732  7391717.525178 
+322482.436301  7391757.128395 
+322548.703011  7391847.932841 
+322556.776071  7391855.881479 
+322567.908482  7391864.609984 
+322581.102451  7391869.279184 
+322662.278346  7391893.764990 
+322692.723429  7391904.153210 
+322706.420418  7391907.812584 
+322718.097081  7391909.932221 
+322733.360854  7391909.022376 
+322766.197344  7391902.633471 
+322799.091558  7391887.836005 
+322866.661172  7391863.280212 
+322906.746099  7391867.469494 
+322776.703042  7391931.958448 
+322650.156387  7391999.996793 
+322563.909060  7392044.009254 
+322555.448428  7392051.328001 
+322549.882222  7392055.577273 
+322537.908695  7392066.175458 
+322529.175937  7392079.143236 
+322489.643507  7392130.264480 
+322473.381940  7392157.059890 
+322449.302947  7392184.045268 
+322409.201527  7392233.856735 
+322367.079781  7392291.606843 
+322301.893328  7392374.662616 
+322394.119171  7392445.280520 
+322405.647402  7392453.929039 
+322421.793521  7392481.394334 
+322426.188762  7392503.430560 
+322424.720933  7392522.537287 
+322415.913959  7392544.573512 
+322402.678759  7392556.331498 
+322419.501069  7392592.515300 
+322361.060033  7392681.410073 
+322272.322345  7392799.509844 
+322163.966874  7392944.624987 
+322253.578662  7393013.393208 
+322182.619848  7393104.547594 
+322113.953485  7393197.501672 
+322046.054022  7393285.626577 
+322094.401672  7393384.509639 
+322023.187224  7393575.926851 
+322000.048301  7393570.017863 
+321977.148519  7393570.717743 
+321931.068582  7393580.216116 
+321820.602076  7393594.613650 
+321795.921108  7393597.333184 
+321770.992752  7393593.703806 
+321743.021538  7393586.764994 
+321701.056470  7393575.976842 
+321647.876529  7393577.586566 
+321632.299399  7393601.152530 
+321610.117039  7393620.119281 
+321570.609348  7393647.164648 
+321457.446324  7393720.942011 
+321396.284032  7393764.414565 
+321374.109918  7393778.562141 
+321350.121633  7393807.667156 
+321335.558789  7393830.223292 
+321293.321596  7393931.615924 
+321281.306838  7393952.402364 
+321273.143070  7393963.540456 
+321264.476281  7393969.349461 
+321253.789166  7393974.908509 
+321237.733755  7393980.437562 
+321218.643731  7393983.177093 
+321193.204110  7393980.307584 
+321166.758448  7393971.599076 
+321150.769007  7393966.229995 
+321121.767014  7393954.462011 
+321074.227494  7393937.314948 
+321027.446627  7393920.407844 
+321018.515960  7393917.648317 
+320963.406400  7393897.361792 
+320927.296156  7393881.784460 
+320884.333295  7393867.696873 
+320871.873240  7393865.367272 
+320856.856854  7393865.837192 
+320833.181926  7393869.826508 
+320814.339289  7393877.375215 
+320801.838003  7393888.513308 
+320795.463667  7393897.891701 
+320782.426376  7393918.408187 
+320775.507789  7393938.444755 
+320752.146217  7394000.004210 
+320741.500333  7394022.800305 
+320727.094169  7394061.873613 
+320706.561054  7394115.714390 
+320681.830609  7394182.982868 
+320666.599821  7394221.756226 
+320639.230581  7394292.724070 
+320620.866225  7394345.954952 
+320601.792694  7394391.277189 
+320590.668529  7394417.702662 
+320555.721003  7394311.490855 
+320515.982418  7394179.643440 
+320499.193092  7394133.031424 
+320452.016407  7393999.974215 
+320430.963780  7393935.585245 
+320424.886308  7393921.887591 
+320416.079333  7393907.939980 
+320407.420791  7393898.191650 
+320388.141104  7393888.103378 
+320376.151085  7393875.325567 
+320299.147783  7393842.591174 
+320254.230565  7393816.785594 
+320219.942738  7393798.638702 
+320201.083608  7393788.440449 
+320185.110659  7393774.952759 
+320172.213555  7393761.175119 
+320163.266394  7393749.317151 
+320156.908550  7393735.069591 
+320151.391822  7393718.492431 
+320147.326430  7393699.725645 
+320143.343501  7393683.948348 
+320149.750822  7393662.422035 
+320153.610058  7393647.204642 
+320158.986601  7393628.947769 
+320139.401803  7393628.377866 
+320126.422236  7393629.857613 
+320107.332212  7393631.337359 
+319947.099704  7393498.110180 
+319934.408755  7393475.274092 
+319944.559865  7393454.977568 
+320017.868856  7393370.632016 
+319972.860929  7393270.229214 
+319955.766493  7393280.517452 
+319942.836403  7393284.136832 
+319933.526408  7393281.547275 
+319927.663338  7393273.868591 
+319912.737661  7393190.252913 
+319898.306757  7393106.667231 
+319887.858783  7393049.167080 
+319874.829739  7393026.740921 
+319861.066780  7393009.263915 
+319836.286857  7392990.347155 
+319794.000186  7392960.032348 
+319730.100145  7393005.004645 
+319463.590216  7392947.154554 
+319397.224552  7392932.737023 
+319321.598371  7392916.339832 
+319274.866982  7392900.972464 
+319263.314013  7392893.533739 
+319249.757209  7392880.026052 
+319238.723753  7392866.528364 
+319138.185709  7392698.427159 
+319115.607529  7392510.169405 
+319084.799612  7392285.237934 
+318991.584220  7392249.454064 
+318954.401966  7392234.186679 
+318931.287782  7392228.897585 
+318910.672205  7392229.957403 
+318884.779041  7392231.207189 
+318859.133264  7392230.687278 
+318841.544054  7392227.987741 
+318806.613021  7392220.059099 
+318783.490590  7392213.260263 
+318759.122978  7392202.412121 
+318734.499734  7392195.343332 
+318696.558827  7392185.614999 
+318663.639874  7392176.446569 
+318627.422429  7392173.527069 
+318588.178617  7392146.651673 
+318574.836216  7392137.953163 
+318561.139227  7392130.404456 
+318541.348273  7392120.576139 
+318523.462199  7392111.137756 
+318505.592617  7392106.278588 
+318488.547658  7392113.227398 
+318475.056825  7392077.453526 
+318454.416510  7392119.136386 
+318445.757968  7392132.164154 
+318438.963074  7392137.533235 
+318430.642627  7392142.922311 
+318420.021482  7392144.122106 
+318410.909397  7392144.172097 
+318395.711594  7392140.052803 
+318378.617158  7392139.382918 
+318364.994385  7392174.656876 
+318311.451609  7392168.307963 
+318311.484594  7392148.871292 
+318314.535699  7392129.214659 
+318322.625252  7392098.509919 
+318330.945698  7392082.192714 
+318333.757663  7392054.207508 
+318327.507020  7392035.460719 
+318314.956257  7392021.203161 
+318302.908514  7392009.725127 
+318278.813028  7391988.778715 
+318265.256225  7391975.520986 
+318245.679673  7391958.153961 
+318228.362589  7391939.557146 
+318218.079539  7391921.020321 
+318214.343997  7391898.774132 
+318149.404931  7391793.632142 
+318137.109801  7391777.094974 
+Region 1
+691
+315576.902572  7387892.880305 
+315576.877833  7387892.920298 
+315585.132310  7387913.956695 
+315592.141606  7387931.943614 
+315595.464837  7387937.512660 
+315600.082726  7387945.351317 
+315604.280058  7387956.599391 
+315607.339409  7387964.917966 
+315604.733600  7387985.594424 
+315596.874942  7388017.508957 
+315583.153215  7388061.421436 
+315583.177953  7388061.501422 
+315571.039502  7388094.955692 
+315563.807558  7388118.011742 
+315552.444252  7388144.677175 
+315547.059463  7388168.353119 
+315546.993493  7388168.403111 
+315541.773629  7388185.620162 
+315538.854464  7388207.066488 
+315547.348081  7388229.222693 
+315558.760864  7388254.838305 
+315570.783869  7388281.243782 
+315575.822316  7388294.151571 
+315581.759602  7388309.408958 
+315590.797470  7388329.125580 
+315595.209204  7388343.133181 
+315595.687485  7388353.771359 
+315592.562164  7388358.720511 
+315585.165295  7388362.719826 
+315573.529863  7388362.469869 
+315568.491417  7388365.509348 
+315565.324864  7388373.997894 
+315567.526608  7388385.205974 
+315569.934507  7388404.732630 
+315570.066447  7388426.448910 
+315560.022538  7388445.815592 
+315545.245292  7388468.331736 
+315525.561540  7388491.677737 
+315509.473144  7388504.435551 
+315493.228069  7388513.533993 
+315471.837347  7388526.221820 
+315457.843494  7388535.570218 
+315445.045344  7388546.818292 
+315434.036626  7388561.735736 
+315426.450094  7388572.273931 
+315422.285747  7388586.621474 
+315427.530350  7388599.869204 
+315443.569268  7388614.586683 
+315456.194248  7388625.594798 
+315456.218986  7388625.604796 
+315456.235479  7388625.624793 
+315473.412377  7388635.783053 
+315473.461855  7388635.813048 
+315493.665120  7388644.041638 
+315517.999746  7388649.330732 
+315538.689539  7388651.700326 
+315553.442046  7388655.319706 
+315563.321030  7388657.439343 
+315573.208260  7388658.229208 
+315581.974004  7388663.848245 
+315576.778878  7388678.955658 
+315568.408954  7388687.274233 
+315553.870850  7388698.832253 
+315546.424503  7388706.600922 
+315537.535067  7388714.909499 
+315530.088720  7388731.096726 
+315527.903469  7388742.144834 
+315527.680821  7388751.553222 
+315525.949113  7388776.119014 
+315520.300445  7388794.545858 
+315512.062460  7388808.183522 
+315491.875688  7388830.519696 
+315482.136889  7388842.137706 
+315471.895071  7388861.064464 
+315460.845122  7388879.191359 
+315452.640122  7388898.807999 
+315447.428504  7388915.025221 
+315444.608294  7388928.392931 
+315445.746273  7388951.448982 
+315448.352082  7388979.504176 
+315445.886459  7388996.751222 
+315440.732565  7389016.957761 
+315439.058580  7389028.005868 
+315438.943133  7389053.371524 
+315440.872751  7389070.568578 
+315451.304233  7389092.854760 
+315462.337689  7389116.250753 
+315476.669638  7389137.367136 
+315491.463376  7389162.032911 
+315505.737601  7389187.908479 
+315519.253173  7389216.763536 
+315529.775364  7389232.070914 
+315539.538901  7389259.446225 
+315554.810920  7389287.111486 
+315570.478758  7389323.195305 
+315580.209310  7389352.780238 
+315586.319767  7389378.445841 
+315588.942069  7389405.061282 
+315589.370873  7389427.767393 
+315587.655657  7389450.343526 
+315582.650195  7389474.759344 
+315579.236255  7389494.765917 
+315580.926732  7389514.282574 
+315586.319767  7389531.739583 
+315597.147068  7389547.716847 
+315612.798414  7389561.314518 
+315612.847891  7389561.354511 
+315625.002835  7389568.263327 
+315639.367769  7389578.971493 
+315652.141180  7389585.890308 
+315661.632592  7389602.397480 
+315666.860702  7389616.865002 
+315664.197169  7389633.562142 
+315662.721094  7389639.291161 
+315660.395657  7389648.089654 
+315659.637004  7389654.498556 
+315658.969059  7389659.747657 
+315660.585320  7389669.126050 
+315661.772778  7389676.244831 
+315663.116913  7389683.223636 
+315664.881607  7389692.712010 
+315664.428064  7389698.591003 
+315663.859074  7389705.289856 
+315659.373124  7389720.957172 
+315659.529803  7389740.673795 
+315661.129572  7389752.631747 
+315663.116913  7389767.899131 
+315669.540727  7389792.684886 
+315677.234460  7389822.139841 
+315686.396022  7389845.975758 
+315690.923203  7389857.823728 
+315695.458630  7389868.191952 
+315704.859333  7389889.828246 
+315722.935070  7389921.842762 
+315746.230672  7389960.466146 
+315762.310822  7389989.131236 
+315774.977032  7390020.865801 
+315782.448117  7390051.750510 
+315789.168795  7390069.007554 
+315804.712940  7390091.353727 
+315815.944306  7390115.529586 
+315820.430255  7390131.756806 
+315819.531416  7390154.452918 
+315803.558467  7390191.026654 
+315798.280880  7390212.562965 
+315787.527795  7390231.479724 
+315777.896198  7390242.317868 
+315771.942419  7390261.184636 
+315767.398746  7390281.731117 
+315764.322902  7390298.628222 
+315763.160183  7390299.558063 
+315751.846355  7390308.556522 
+315735.337401  7390322.954056 
+315734.240653  7390323.903893 
+315724.378161  7390331.292627 
+315709.873041  7390342.150767 
+315709.831810  7390342.200759 
+315709.823564  7390342.200759 
+315700.093011  7390352.269034 
+315690.321228  7390362.387301 
+315668.410993  7390386.223218 
+315646.030723  7390405.529911 
+315626.404694  7390423.896765 
+315598.812807  7390450.792158 
+315591.885973  7390457.351035 
+315586.905250  7390463.649956 
+315581.875049  7390469.908884 
+315579.739275  7390477.407599 
+315577.554024  7390484.866321 
+315586.072380  7390505.352812 
+315601.814435  7390528.028928 
+315610.398761  7390543.536272 
+315619.815956  7390557.613860 
+315629.183674  7390571.741441 
+315635.335362  7390581.729730 
+315641.437573  7390591.778008 
+315645.552442  7390601.026424 
+315649.626080  7390610.324832 
+315654.243969  7390622.022828 
+315656.206572  7390627.081961 
+315661.137818  7390640.759618 
+315668.460471  7390659.246452 
+315669.054199  7390659.986325 
+315674.133877  7390666.455217 
+315682.676972  7390668.724828 
+315691.178836  7390671.044433 
+315700.653755  7390670.484527 
+315711.250161  7390669.914624 
+315721.557950  7390670.314556 
+315732.731592  7390670.794474 
+315751.714415  7390670.924451 
+315770.771454  7390665.735340 
+315795.675071  7390658.076652 
+315805.298422  7390657.626729 
+315814.113643  7390657.256793 
+315824.602848  7390659.356433 
+315831.876023  7390660.856176 
+315835.875445  7390662.665866 
+315844.723651  7390666.725171 
+315857.925866  7390674.483842 
+315862.502524  7390677.193378 
+315879.926809  7390679.852922 
+315889.715085  7390680.402828 
+315900.492909  7390681.052717 
+315923.203028  7390684.992042 
+315935.506404  7390689.871206 
+315941.732308  7390692.370778 
+315956.138473  7390699.309589 
+315966.602940  7390704.548692 
+315979.335120  7390710.957594 
+316023.089620  7390730.564236 
+316046.195558  7390742.162249 
+316069.309742  7390750.220869 
+316085.035304  7390754.380156 
+316091.170500  7390756.009877 
+316124.905829  7390760.639084 
+316144.944170  7390760.009192 
+316180.163821  7390758.919379 
+316199.773357  7390757.859560 
+316213.124005  7390759.339307 
+316224.949100  7390760.679077 
+316243.981400  7390765.688219 
+316264.687685  7390770.917324 
+316265.611263  7390771.157282 
+316269.709640  7390772.057128 
+316317.174943  7390782.555330 
+316373.010171  7390793.163513 
+316380.209130  7390794.533278 
+316388.678009  7390795.703078 
+316437.289539  7390802.451922 
+316618.442734  7390839.395594 
+316694.885292  7390849.543856 
+316729.676139  7390854.463013 
+316748.147695  7390857.102561 
+316765.769890  7390858.652295 
+316787.135874  7390860.561968 
+316820.557847  7390858.102390 
+316853.353106  7390847.654179 
+316865.912115  7390839.285613 
+316866.753231  7390838.665719 
+316906.013535  7390809.730675 
+316933.127141  7390927.270542 
+316940.655950  7390959.964941 
+316968.132390  7391031.482691 
+316968.148883  7391031.522684 
+316974.481988  7391043.380653 
+316995.963419  7391083.603763 
+317017.939624  7391137.224578 
+317017.972608  7391137.264572 
+317132.603461  7391276.700687 
+317133.172451  7391277.440561 
+317171.492684  7391327.372008 
+317196.594211  7391352.607685 
+317214.735918  7391364.455656 
+317223.204797  7391370.004705 
+317299.746310  7391407.608264 
+317461.388923  7391487.064654 
+317501.127508  7391507.301188 
+317505.291855  7391509.420825 
+317510.033437  7391512.470302 
+317537.213014  7391529.987302 
+317575.590971  7391563.921489 
+317603.191105  7391593.726384 
+317632.019927  7391631.859852 
+317650.194620  7391655.715766 
+317680.219146  7391695.199002 
+317709.814867  7391735.372121 
+317732.409539  7391757.308364 
+317752.736498  7391776.954998 
+317773.088195  7391786.243407 
+317802.733394  7391794.372015 
+317802.741640  7391794.372015 
+317842.199854  7391795.531816 
+317877.147380  7391795.891755 
+317907.312091  7391794.182048 
+317954.843365  7391785.333563 
+318076.788624  7391771.685901 
+318093.355301  7391769.886209 
+318100.158441  7391769.166333 
+318100.174934  7391769.166333 
+318100.174934  7391769.146336 
+318107.819189  7391768.676416 
+318124.814671  7391767.636595 
+318137.109801  7391777.094974 
+318157.115156  7391774.235464 
+318196.969189  7391732.072686 
+318223.695223  7391681.961270 
+318227.034946  7391625.160999 
+318223.695223  7391571.710155 
+318214.137841  7391495.123274 
+318218.656776  7391494.383400 
+318301.754042  7391488.984325 
+318315.739649  7391480.505777 
+318345.689959  7391473.866915 
+318363.872897  7391466.138238 
+318401.483955  7391421.005969 
+318416.706497  7391401.979228 
+318436.703606  7391384.842164 
+318459.537419  7391372.474282 
+318492.843945  7391351.537868 
+318529.960229  7391318.223575 
+318537.876610  7391297.777077 
+318537.571500  7391283.019605 
+318537.571500  7391264.932703 
+318538.528062  7391239.237105 
+318545.191017  7391202.123462 
+318555.474066  7391179.767291 
+318567.076513  7391161.200472 
+318590.866888  7391132.645363 
+318610.863998  7391112.658786 
+318629.888052  7391096.481557 
+318646.792825  7391084.673580 
+318682.226878  7391045.090360 
+318700.310861  7391022.254272 
+318733.617387  7391000.368021 
+318753.606250  7390978.471771 
+318762.174084  7390959.445030 
+318769.793601  7390943.267801 
+318778.369681  7390925.270884 
+318782.146454  7390912.813018 
+318790.722534  7390902.344811 
+318937.282792  7390809.070788 
+318937.299284  7390809.060790 
+318937.282792  7390809.070788 
+318987.271442  7390814.669829 
+319066.641412  7390823.018399 
+319134.516136  7390826.917731 
+319184.323369  7390825.817920 
+319230.625954  7390827.097700 
+319257.846762  7390828.927387 
+319269.333761  7390824.218194 
+319273.869188  7390822.668459 
+319311.801849  7390817.509343 
+319347.417319  7390807.781009 
+319391.575884  7390795.883047 
+319422.441525  7390783.725130 
+319451.781614  7390766.388099 
+319471.993125  7390752.570466 
+319478.821004  7390744.891781 
+319552.113502  7390704.138762 
+319596.387515  7390685.212004 
+319685.826132  7390644.648952 
+319734.948928  7390627.411905 
+319806.550949  7390607.835258 
+319851.113579  7390596.317231 
+319968.152331  7390592.297919 
+319999.999274  7390582.759553 
+320113.203528  7390565.742468 
+320132.029673  7390564.162739 
+320158.302163  7390560.743324 
+320194.626809  7390557.223927 
+320220.313818  7390552.494737 
+320311.682053  7390535.307681 
+320451.686557  7390505.742746 
+320557.296033  7390478.787363 
+320638.051370  7390469.119019 
+320688.007035  7390463.140043 
+320707.633064  7390460.790445 
+320891.309606  7390458.760793 
+320876.697285  7390395.441639 
+320866.422482  7390373.225445 
+320858.143266  7390356.628287 
+320820.251836  7390282.311017 
+320813.028138  7390259.114991 
+320848.330252  7390142.754922 
+320917.648066  7390122.468397 
+320970.052862  7390110.630425 
+321044.640018  7390024.795128 
+321074.120293  7390026.544828 
+321070.929002  7390008.537912 
+321069.106585  7389989.461180 
+321068.207745  7389969.464605 
+321061.841655  7389951.297717 
+321040.071607  7389930.811226 
+321023.843025  7389921.752778 
+321002.823383  7389913.524187 
+320895.968726  7389869.121793 
+320769.413824  7389817.840577 
+320625.327436  7389754.821372 
+320564.288837  7389725.306427 
+320531.073020  7389702.870270 
+320419.567489  7389627.903112 
+320402.027756  7389574.232305 
+320376.390225  7389522.751123 
+320358.149563  7389505.934004 
+320341.863258  7389510.383242 
+320329.394957  7389511.563040 
+320305.794245  7389513.482711 
+320301.184602  7389489.616799 
+320292.938371  7389463.261313 
+320290.283085  7389446.834127 
+320283.603638  7389425.487783 
+320275.876920  7389406.231082 
+320270.343699  7389391.323635 
+320265.445438  7389374.756473 
+320252.622550  7389355.219820 
+320238.076199  7389334.663341 
+320223.175260  7389317.306314 
+320212.620085  7389304.328537 
+320195.756543  7389289.611058 
+320175.586263  7389277.843074 
+320155.605646  7389267.524841 
+320140.160456  7389261.685841 
+320121.655914  7389255.696867 
+320099.737433  7389245.678583 
+320079.229058  7389236.230202 
+320065.845425  7389229.311387 
+320047.992336  7389211.704403 
+320029.891860  7389181.239621 
+320016.871062  7389161.363026 
+320004.279067  7389147.365423 
+319987.093923  7389134.077699 
+319963.880783  7389120.610006 
+319949.532342  7389109.141971 
+319926.360434  7389092.794771 
+319902.067039  7389076.437573 
+319890.777949  7389064.219665 
+319876.429507  7389052.751630 
+319859.714398  7389042.243430 
+319848.367585  7389035.344611 
+319831.883370  7389031.375291 
+319810.657572  7389030.775394 
+319791.336653  7389025.116363 
+319784.360342  7389020.897086 
+319767.628740  7389010.758823 
+319754.228616  7389004.829838 
+319736.779591  7388995.861375 
+319721.400371  7388985.153209 
+319705.303729  7388965.786526 
+319693.049830  7388949.579302 
+319683.937745  7388943.710308 
+319670.595344  7388933.242101 
+319656.156194  7388928.522909 
+319637.635160  7388924.413613 
+319621.942583  7388922.233986 
+319600.947680  7388919.314486 
+319589.625606  7388910.426009 
+319578.699350  7388902.757322 
+319567.830818  7388898.628030 
+319553.721517  7388892.259121 
+319540.799674  7388888.329794 
+319521.965283  7388892.749037 
+319493.779667  7388902.477370 
+319471.473613  7388906.416696 
+319442.595313  7388906.166738 
+319419.555345  7388903.777148 
+319390.149286  7388904.297059 
+319366.573313  7388904.117090 
+319346.229862  7388906.526677 
+319289.924599  7388944.930099 
+319275.708097  7388955.158347 
+319264.798334  7388963.007002 
+319246.730843  7388970.975637 
+319226.659517  7388975.934788 
+319204.064845  7388979.534171 
+319176.439973  7388976.304724 
+319142.539719  7388969.245934 
+319105.530635  7388956.928043 
+319080.800190  7388943.330373 
+319052.812483  7388927.923012 
+319040.443137  7388921.794062 
+319016.966118  7388905.216901 
+319002.312566  7388893.518905 
+318985.671673  7388877.141710 
+318975.941121  7388862.954140 
+318967.744368  7388832.499357 
+318962.813122  7388810.733085 
+318958.648775  7388784.427591 
+318954.987449  7388766.660635 
+318953.074323  7388748.363769 
+318951.458062  7388730.176884 
+318943.714851  7388712.909842 
+318932.681395  7388697.162539 
+318919.817275  7388681.155281 
+318907.695316  7388670.487108 
+318895.589849  7388658.929088 
+318889.627825  7388646.341244 
+318884.861503  7388635.423114 
+318882.709237  7388619.665813 
+318881.068237  7388603.698548 
+318882.379388  7388588.541145 
+318882.931885  7388577.143097 
+318876.763705  7388563.775387 
+318868.187625  7388556.356658 
+318852.008520  7388551.947413 
+318832.926743  7388551.817435 
+318818.685502  7388555.956726 
+318808.278759  7388563.475438 
+318800.065514  7388575.663351 
+318794.713710  7388587.781275 
+318780.711610  7388597.029691 
+318767.492903  7388601.508924 
+318752.270361  7388602.878689 
+318733.938990  7388607.297932 
+318717.479514  7388609.757511 
+318706.883107  7388608.407742 
+318694.967304  7388606.038148 
+318679.472637  7388604.188465 
+318657.405723  7388613.876805 
+318633.673072  7388626.874579 
+318603.409405  7388638.902518 
+318575.190804  7388650.850472 
+318558.698343  7388655.739634 
+318542.667670  7388664.288170 
+318523.346752  7388674.796370 
+318511.958707  7388679.745522 
+318498.253472  7388681.685190 
+318485.768679  7388684.184762 
+318477.662634  7388679.325594 
+318469.432896  7388668.587434 
+318463.907921  7388653.120083 
+318459.009660  7388636.112996 
+318451.027309  7388613.636846 
+318442.311043  7388592.050544 
+318434.551340  7388575.553369 
+318425.777351  7388558.836233 
+318416.755974  7388537.679857 
+318411.799990  7388525.541936 
+318406.497664  7388516.943409 
+318398.474081  7388505.775322 
+318384.554444  7388500.836168 
+318365.118078  7388495.937007 
+318348.130843  7388491.187821 
+318337.278803  7388485.628773 
+318315.541739  7388477.380186 
+318297.795851  7388475.940432 
+318283.546365  7388480.969571 
+318264.975853  7388488.708245 
+318239.833096  7388491.277805 
+318222.854107  7388494.167310 
+318202.139576  7388493.357449 
+318187.650948  7388493.177480 
+318166.606568  7388494.357278 
+318150.328508  7388498.586553 
+318127.981223  7388506.505197 
+318110.218843  7388514.693794 
+318092.332768  7388524.992030 
+318074.017890  7388536.510057 
+318063.083388  7388545.788468 
+318052.338550  7388556.066707 
+318032.085807  7388559.796069 
+318015.370698  7388557.596445 
+318000.981025  7388549.217881 
+317974.642565  7388533.050650 
+317959.246852  7388523.342313 
+317936.800612  7388506.555188 
+317915.690262  7388488.678250 
+317889.912545  7388468.971626 
+317870.467933  7388456.213811 
+317852.359210  7388443.695955 
+317840.987658  7388438.346872 
+317811.886710  7388431.558035 
+317782.719792  7388429.428399 
+317750.988297  7388428.138620 
+317722.843912  7388425.909002 
+317703.160159  7388424.779196 
+317676.038307  7388422.889519 
+317659.306705  7388421.789708 
+317644.611922  7388413.851068 
+317635.071033  7388401.333212 
+317627.847335  7388390.934993 
+317608.913989  7388370.768447 
+317583.499106  7388346.302638 
+317571.418378  7388332.415017 
+317553.524058  7388310.478774 
+317541.501054  7388292.721816 
+317528.983275  7388273.625087 
+317514.923452  7388255.058267 
+317502.521121  7388242.830362 
+317486.696605  7388226.793109 
+317478.607052  7388220.714150 
+317464.720400  7388212.785508 
+317449.753491  7388210.385919 
+317432.799241  7388211.275767 
+317408.901665  7388211.865666 
+317391.427902  7388213.535380 
+317370.853557  7388218.474534 
+317355.342397  7388234.571777 
+317350.196749  7388245.909834 
+317345.265503  7388256.478024 
+317338.289192  7388275.444775 
+317337.481061  7388291.382045 
+317336.631699  7388302.010225 
+317330.414041  7388317.657545 
+317318.160143  7388326.146091 
+317300.645149  7388331.135236 
+317275.296236  7388334.244703 
+317248.949529  7388335.024570 
+317222.099802  7388335.464495 
+317196.165407  7388336.244361 
+317167.567479  7388337.884080 
+317131.506712  7388340.093702 
+317110.454085  7388342.043368 
+317083.818760  7388341.593445 
+317067.953012  7388329.325546 
+317055.361018  7388315.877850 
+317034.019773  7388291.901956 
+317020.380508  7388272.575267 
+317008.860524  7388255.588177 
+317002.576896  7388243.660220 
+316991.559932  7388227.133051 
+316982.010797  7388215.155102 
+316971.686516  7388208.056318 
+316960.859215  7388200.607594 
+316947.442598  7388196.228344 
+316935.007282  7388195.188523 
+316909.798555  7388203.067173 
+316887.162652  7388217.404717 
+316870.661944  7388230.932400 
+316859.884121  7388243.530242 
+316842.534051  7388260.037415 
+316831.517087  7388275.404782 
+316820.021842  7388296.641145 
+316810.695355  7388316.347769 
+316796.899411  7388333.904762 
+316782.616940  7388349.232136 
+316757.935971  7388364.309554 
+316737.625505  7388372.478154 
+316729.948264  7388374.327838 
+316717.042913  7388377.427307 
+316688.139875  7388378.727084 
+316664.572148  7388377.877230 
+316631.620210  7388376.907396 
+316607.227860  7388376.487468 
+316570.309485  7388373.697946 
+316543.171140  7388372.808098 
+316520.370313  7388367.868944 
+316499.680520  7388357.520717 
+316483.369476  7388331.625152 
+316466.365748  7388295.631318 
+316458.655522  7388275.824710 
+316447.704528  7388245.669876 
+316440.736463  7388223.313705 
+316424.672806  7388193.868749 
+316421.250620  7388174.332095 
+316415.890570  7388145.687002 
+316416.533776  7388118.891592 
+316416.195681  7388096.955349 
+316416.294636  7388081.008081 
+316414.711359  7388061.271461 
+316406.316696  7388055.072523 
+316392.858848  7388053.802741 
+316371.097045  7388055.402467 
+316350.761841  7388057.482110 
+316329.750445  7388056.322309 
+316310.792361  7388053.982710 
+316286.424749  7388052.013047 
+316257.299062  7388054.422634 
+316234.679652  7388059.561754 
+316213.618779  7388062.511249 
+316200.647458  7388063.121144 
+316190.059298  7388060.991509 
+316183.206680  7388053.932718 
+316178.250695  7388042.014760 
+316171.257892  7388030.296767 
+316160.686224  7388018.638764 
+316136.186673  7388002.721490 
+316115.191770  7387992.263282 
+316081.151330  7387971.786789 
+316062.630296  7387967.337551 
+316028.194036  7387962.808327 
+316003.636762  7387959.398911 
+315982.336748  7387956.469413 
+315958.859729  7387948.750735 
+315946.201765  7387940.512146 
+315930.517434  7387930.343888 
+315916.490596  7387917.536082 
+315902.381295  7387903.068560 
+315892.955854  7387897.639490 
+315872.999976  7387893.730160 
+315862.552001  7387896.699651 
+315847.824233  7387899.389190 
+315832.651169  7387896.539678 
+315814.435246  7387892.100439 
+315791.123152  7387886.941323 
+315773.434987  7387881.732215 
+315762.574701  7387876.603093 
+315744.408255  7387868.844422 
+315729.944366  7387866.224871 
+315716.519503  7387862.185563 
+315698.278841  7387859.735983 
+315686.074419  7387864.675137 
+315674.892531  7387869.404326 
+315654.821205  7387874.143515 
+315642.171487  7387881.622234 
+315627.592152  7387888.641031 
+315610.398761  7387892.080442 
+315599.678661  7387892.720333 
+315576.910818  7387892.870307 
+315576.910818  7387892.880305 
+315576.902572  7387892.880305 
+Region 1
+2805
+319142.053191  7356557.657745 
+319143.191171  7356532.931980 
+319149.672708  7356527.922838 
+319142.267593  7356517.524620 
+319134.375950  7356505.246723 
+319122.831227  7356491.589062 
+319111.896726  7356478.711268 
+319100.591143  7356470.702640 
+319090.555481  7356466.703325 
+319076.940954  7356463.873809 
+319063.516090  7356462.704010 
+319048.565674  7356461.184270 
+319035.239765  7356459.694525 
+319021.311882  7356457.744859 
+319002.931034  7356453.745544 
+318985.778874  7356449.096341 
+318968.503021  7356446.006870 
+318952.637273  7356443.807247 
+318943.088138  7356442.027552 
+318930.298234  7356438.658129 
+318913.434693  7356435.228716 
+318887.953840  7356429.149757 
+318870.166720  7356425.830326 
+318853.616535  7356422.180951 
+318840.513275  7356419.361434 
+318826.288527  7356416.851864 
+318804.848327  7356412.932535 
+318794.581770  7356411.142842 
+318759.535290  7356404.274018 
+318749.672798  7356402.824267 
+318732.380452  7356400.724626 
+318714.073820  7356399.274875 
+318684.049295  7356397.235224 
+318668.076346  7356396.035430 
+318651.600377  7356394.275731 
+318626.894670  7356391.086277 
+318599.748079  7356387.526887 
+318580.006603  7356386.177118 
+318565.155141  7356384.767360 
+318547.945258  7356384.217454 
+318533.910173  7356383.047654 
+318517.442451  7356380.728052 
+318500.158351  7356377.968524 
+318483.096900  7356374.209168 
+318462.266921  7356370.179858 
+318445.007561  7356365.970579 
+318423.484899  7356360.941441 
+318408.674668  7356356.322232 
+318390.417514  7356350.333258 
+318381.684755  7356348.003657 
+318354.422717  7356345.334114 
+318317.397141  7356341.984688 
+318283.711289  7356339.795063 
+318262.666909  7356337.315488 
+318240.393840  7356334.256012 
+318225.443423  7356332.746270 
+318211.499047  7356332.566301 
+318200.201711  7356331.866421 
+318186.479984  7356329.476830 
+318173.681834  7356326.887274 
+318155.729790  7356321.118262 
+318142.750222  7356316.519050 
+318131.197253  7356311.609891 
+318120.460661  7356307.050672 
+318106.293637  7356300.111860 
+318087.079919  7356289.343705 
+318075.419749  7356285.104431 
+318061.219740  7356280.265260 
+318052.899293  7356278.165620 
+318048.429836  7356277.005818 
+318036.629480  7356276.085976 
+318018.306356  7356275.186130 
+317994.672659  7356276.105972 
+317973.949881  7356279.715354 
+317947.941270  7356282.714840 
+317920.984342  7356288.023931 
+317900.673876  7356291.753292 
+317871.787330  7356296.812426 
+317848.631914  7356299.841907 
+317825.987765  7356302.221499 
+317805.594836  7356304.401126 
+317783.362998  7356306.990682 
+317769.682502  7356309.150312 
+317747.359955  7356310.970001 
+317729.094555  7356313.399584 
+317705.732983  7356316.539047 
+317686.956316  7356319.728500 
+317664.204966  7356322.767980 
+317649.312273  7356324.907613 
+317624.524104  7356328.027079 
+317605.846391  7356330.886589 
+317590.739297  7356333.796091 
+317576.737197  7356337.605438 
+317558.364595  7356340.584928 
+317534.598959  7356343.834371 
+317488.881856  7356350.453237 
+317433.178568  7356358.161917 
+317404.712580  7356362.121239 
+317376.147637  7356366.080561 
+317348.407317  7356369.489977 
+317325.655966  7356372.199512 
+317307.398812  7356374.619098 
+317290.452808  7356377.838547 
+317267.973583  7356383.317608 
+317252.132574  7356387.766846 
+317241.280534  7356391.946130 
+317230.717113  7356397.795128 
+317207.875054  7356407.923393 
+317190.351814  7356416.891857 
+317181.734503  7356421.321098 
+317164.409172  7356430.519523 
+317153.334485  7356436.468504 
+317145.047023  7356439.248028 
+317133.906365  7356442.317502 
+317119.409492  7356445.117022 
+317104.533292  7356446.036865 
+317092.221669  7356445.217005 
+317081.237690  7356443.417313 
+317053.596325  7356438.858094 
+317039.198406  7356433.798961 
+317020.331030  7356427.690007 
+317004.432298  7356420.731199 
+316988.640766  7356412.892542 
+316970.721707  7356404.683948 
+316954.311708  7356397.945102 
+316931.725282  7356387.686860 
+316918.547806  7356383.197629 
+316902.121314  7356377.118670 
+316893.083445  7356375.119012 
+316876.706431  7356373.359314 
+316855.109553  7356373.859228 
+316832.399434  7356373.679259 
+316821.201053  7356373.869226 
+316811.808596  7356375.308980 
+316801.599763  7356377.388624 
+316791.275482  7356380.138153 
+316780.448181  7356382.877683 
+316765.332840  7356386.237108 
+316750.382424  7356392.136097 
+316740.132359  7356397.435190 
+316731.003782  7356402.634299 
+316717.224331  7356413.202489 
+316702.513055  7356424.870490 
+316692.823734  7356433.938937 
+316686.869956  7356445.047034 
+316681.650092  7356455.065318 
+316674.764489  7356475.911747 
+316671.762861  7356487.719725 
+316670.682605  7356500.887469 
+316668.967389  7356523.463602 
+316670.847529  7356551.848740 
+316671.870062  7356567.256101 
+316672.364836  7356600.940331 
+316673.478077  7356624.986212 
+316674.813966  7356648.152244 
+316675.275755  7356667.768884 
+316674.442886  7356685.365870 
+316674.220238  7356718.700160 
+316673.708971  7356735.207332 
+316672.224650  7356747.815173 
+316669.256007  7356773.030854 
+316665.998746  7356796.686802 
+316661.100485  7356821.772505 
+316657.818485  7356839.569456 
+316652.367727  7356859.216091 
+316647.923008  7356872.553806 
+316638.926371  7356891.050638 
+316632.255170  7356903.258547 
+316626.021020  7356912.596947 
+316609.149232  7356933.873303 
+316589.952007  7356953.789891 
+316568.115988  7356973.006600 
+316547.253024  7356987.694084 
+316529.053593  7357001.081791 
+316509.435811  7357014.129556 
+316484.408501  7357027.767220 
+316466.893507  7357035.515892 
+316451.019513  7357042.514694 
+316434.444589  7357048.613649 
+316420.318796  7357054.312673 
+316399.777436  7357059.801732 
+316377.314703  7357063.841041 
+316357.317594  7357066.690552 
+316344.173102  7357067.180469 
+316328.917576  7357065.110823 
+316305.737421  7357061.931368 
+316287.133925  7357059.141845 
+316269.940534  7357057.602109 
+316251.897781  7357059.141845 
+316235.570245  7357061.371464 
+316222.887542  7357065.750713 
+316210.914015  7357070.139962 
+316200.045483  7357075.868980 
+316189.564524  7357082.827788 
+316176.840590  7357090.196526 
+316160.521300  7357099.954855 
+316143.698989  7357109.593204 
+316125.046015  7357118.551669 
+316113.765172  7357124.830594 
+316101.577243  7357129.659766 
+316088.688384  7357133.929035 
+316079.889656  7357137.468429 
+316068.196501  7357143.417410 
+316051.085573  7357151.616005 
+316039.309955  7357156.445178 
+316029.802051  7357159.654629 
+316018.966504  7357162.174197 
+316011.726314  7357162.854080 
+316005.830259  7357162.554132 
+316002.292626  7357160.184538 
+315998.870440  7357156.925096 
+315999.719802  7357154.055588 
+315998.581822  7357147.846651 
+315995.192621  7357142.147627 
+315991.498310  7357135.898698 
+315986.633034  7357126.200359 
+315982.114100  7357113.072608 
+315981.940929  7357103.104315 
+315986.731989  7357094.415803 
+315994.994712  7357085.877266 
+315998.787978  7357083.377694 
+316003.793440  7357082.227891 
+316011.940716  7357082.327874 
+316027.047810  7357079.968278 
+316048.974538  7357077.818646 
+316060.313105  7357074.859153 
+316070.991973  7357068.460249 
+316079.205219  7357063.251142 
+316085.002319  7357056.122363 
+316091.046806  7357045.014265 
+316094.963766  7357033.876173 
+316096.299655  7357024.587764 
+316098.089087  7357011.869943 
+316097.454128  7357006.210912 
+316093.784555  7356998.082304 
+316089.199651  7356990.273642 
+316081.118345  7356985.514457 
+316072.377340  7356983.744760 
+316062.984884  7356985.284497 
+316057.971175  7356987.654091 
+316053.823321  7356992.923188 
+316046.739809  7357005.231080 
+316042.897066  7357011.170063 
+316036.027956  7357014.739451 
+316032.564539  7357015.019403 
+316027.633293  7357010.310210 
+316025.472780  7357004.081277 
+316024.054429  7356995.312779 
+316023.881258  7356985.334488 
+316024.862559  7356979.815433 
+316028.490901  7356967.337571 
+316034.551880  7356955.009682 
+316039.120292  7356940.452176 
+316040.983940  7356921.755379 
+316038.988352  7356903.008590 
+316035.013669  7356895.199927 
+316026.058263  7356886.671388 
+316021.143509  7356880.732405 
+316017.746062  7356875.043380 
+316016.896700  7356870.384178 
+316017.894494  7356863.855296 
+316019.469524  7356859.895974 
+316028.260006  7356857.456392 
+316036.085679  7356858.556204 
+316042.954789  7356863.295392 
+316050.161995  7356865.265055 
+316054.854100  7356864.335214 
+316058.960723  7356862.275567 
+316061.789180  7356855.996642 
+316063.842491  7356846.718232 
+316065.631924  7356826.251737 
+316065.838079  7356810.304469 
+316064.741331  7356800.326178 
+316060.461537  7356792.517516 
+316057.360954  7356787.818321 
+316045.931679  7356773.610754 
+316040.151071  7356763.902417 
+316038.732719  7356755.243900 
+316038.823428  7356748.045133 
+316041.396252  7356738.106836 
+316044.018553  7356732.487798 
+316049.964085  7356729.238355 
+316055.967341  7356729.318341 
+316062.481863  7356729.628288 
+316070.612647  7356731.278006 
+316076.632395  7356730.138201 
+316080.021596  7356728.298516 
+316083.212887  7356725.568983 
+316084.210681  7356719.380044 
+316081.522410  7356714.360903 
+316078.100224  7356711.211443 
+316073.465843  7356707.052155 
+316064.865024  7356694.544298 
+316060.189411  7356686.395693 
+316060.981049  7356680.206754 
+316063.174547  7356675.797509 
+316068.938662  7356671.218293 
+316075.741802  7356672.308107 
+316079.180480  7356674.787682 
+316081.357485  7356679.136937 
+316084.672470  7356683.276228 
+316091.549826  7356686.795625 
+316097.454128  7356686.875611 
+316103.218243  7356682.516358 
+316105.758082  7356674.787682 
+316110.334740  7356659.560290 
+316116.527659  7356644.802818 
+316122.654608  7356627.705747 
+316131.741955  7356602.350090 
+316144.993647  7356569.505716 
+316154.072747  7356551.898732 
+316162.615842  7356544.809946 
+316171.101214  7356542.370364 
+316179.858710  7356542.820287 
+316183.899363  7356545.079900 
+316185.952675  7356551.978718 
+316185.259992  7356558.167658 
+316181.400756  7356565.326432 
+316176.972530  7356569.585702 
+316172.214455  7356575.064763 
+316168.685068  7356580.003917 
+316167.101792  7356584.743106 
+316165.411314  7356589.372313 
+316166.672988  7356594.041513 
+316168.767530  7356597.840862 
+316171.274384  7356600.970326 
+316178.440359  7356606.049456 
+316187.131886  7356611.138584 
+316199.633172  7356613.188233 
+316206.452804  7356613.828124 
+316216.554437  7356612.068425 
+316223.134929  7356607.169264 
+316231.059557  7356601.070309 
+316240.509737  7356594.321465 
+316264.935072  7356572.255245 
+316294.110236  7356544.609980 
+316312.796195  7356524.903356 
+316325.899455  7356511.115717 
+316333.205616  7356497.807997 
+316341.245690  7356481.740749 
+316344.230826  7356471.812450 
+316344.313288  7356465.273570 
+316341.295168  7356454.265455 
+316335.745455  7356450.206151 
+316326.303521  7356447.546606 
+316292.221849  7356444.667099 
+316279.135081  7356440.737772 
+316271.383624  7356433.768966 
+316267.400695  7356426.630189 
+316264.827871  7356412.532604 
+316262.725082  7356377.948528 
+316263.030193  7356354.022626 
+316266.048313  7356341.324801 
+316270.921835  7356326.097409 
+316281.773875  7356305.970857 
+316293.615462  7356287.843962 
+316302.274004  7356271.996676 
+316305.341602  7356254.649648 
+316303.915004  7356238.792364 
+316302.224527  7356227.584284 
+316301.507105  7356211.956961 
+316298.860065  7356196.299643 
+316291.751814  7356186.351347 
+316280.611157  7356181.452186 
+316272.480373  7356180.462355 
+316254.998364  7356177.132926 
+316250.652601  7356174.533371 
+316248.186978  7356168.634381 
+316247.675711  7356160.865712 
+316248.706490  7356151.797265 
+316254.750977  7356140.689168 
+316259.228680  7356133.320430 
+316264.448544  7356123.422126 
+316266.691519  7356115.033563 
+316265.891635  7356106.275063 
+316264.159926  7356097.826510 
+316260.490354  7356090.367788 
+316253.332626  7356084.618772 
+316246.743887  7356082.099204 
+316237.400908  7356079.769603 
+316233.063391  7356076.940088 
+316231.298697  7356071.271059 
+316229.171170  7356062.602544 
+316229.253632  7356056.073662 
+316230.861647  7356049.774741 
+316232.560371  7356044.595628 
+316232.609848  7356040.496330 
+316232.362461  7356036.167072 
+316231.109034  7356030.508041 
+316223.868843  7356015.130675 
+316222.021688  7356008.571799 
+316223.283361  7356004.932422 
+316226.482899  7356001.872946 
+316231.537838  7355996.943790 
+316238.217285  7355992.274590 
+316241.713687  7355989.215114 
+316243.907184  7355985.255792 
+316243.066068  7355979.036858 
+316239.701606  7355971.798098 
+316232.684064  7355962.959612 
+316227.109612  7355952.921331 
+316225.064547  7355945.472607 
+316224.528542  7355939.813576 
+316225.204733  7355934.284523 
+316223.357577  7355927.395703 
+316219.366401  7355920.806832 
+316207.854664  7355913.458091 
+316201.735960  7355906.289319 
+316198.635378  7355901.600122 
+316196.565574  7355896.261036 
+316196.029569  7355890.272062 
+316193.588684  7355881.823509 
+316189.267660  7355877.774203 
+316182.390303  7355873.924862 
+316170.820842  7355870.675419 
+316162.129315  7355865.246349 
+316159.408058  7355863.106715 
+316157.824782  7355859.647308 
+316158.154631  7355857.777628 
+316158.921531  7355853.458368 
+316162.368455  7355846.969480 
+316166.532802  7355839.820704 
+316171.694942  7355834.021697 
+316173.937917  7355825.633134 
+316172.544304  7355815.314902 
+316163.926993  7355804.346780 
+316154.600506  7355793.258680 
+316138.289462  7355770.672549 
+316123.536955  7355753.315522 
+316101.313364  7355723.460636 
+316092.720791  7355710.062930 
+316080.450400  7355689.966373 
+316075.585124  7355680.268034 
+316072.270139  7355668.700016 
+316071.247607  7355653.072692 
+316071.090928  7355641.884609 
+316072.154692  7355630.046637 
+316076.417993  7355615.479132 
+316086.651565  7355571.406681 
+316090.362369  7355552.179974 
+316091.104530  7355541.561793 
+316090.263414  7355536.012744 
+316088.185364  7355531.003602 
+316083.856093  7355527.514199 
+316075.733556  7355525.194597 
+316064.139356  7355523.824831 
+316059.166879  7355522.545051 
+316054.837608  7355518.725705 
+316052.347246  7355514.366451 
+316051.802995  7355509.047363 
+316051.868965  7355504.398159 
+316051.943181  7355498.409185 
+316050.079533  7355492.850137 
+316044.834930  7355489.020793 
+316035.203332  7355485.131459 
+316021.069293  7355483.401755 
+316009.582294  7355482.031990 
+315999.241521  7355478.462601 
+315992.784722  7355473.733412 
+315989.115149  7355466.154710 
+315986.377401  7355457.146253 
+315983.120140  7355440.929031 
+315975.846964  7355420.232576 
+315968.573789  7355408.064660 
+315953.656358  7355395.696779 
+315934.154022  7355375.840180 
+315928.035319  7355368.561427 
+315924.679103  7355360.432819 
+315924.802797  7355350.464526 
+315925.289324  7355336.516915 
+315927.251927  7355326.238676 
+315926.130440  7355318.470007 
+315923.038103  7355313.440868 
+315916.911154  7355306.502057 
+315906.628104  7355298.613408 
+315899.610562  7355289.774922 
+315896.806844  7355286.085554 
+315896.914045  7355277.886958 
+315895.858527  7355264.799200 
+315895.091628  7355253.051212 
+315892.370371  7355242.712983 
+315889.624377  7355234.264430 
+315888.230764  7355224.276141 
+315888.964678  7355214.317847 
+315891.009743  7355198.170613 
+315893.359919  7355189.452106 
+315893.434135  7355183.573113 
+315892.263170  7355179.793761 
+315889.137849  7355177.324184 
+315886.004281  7355175.064571 
+315882.235754  7355175.014579 
+315876.636563  7355174.944591 
+315873.766875  7355176.454333 
+315865.561876  7355181.333497 
+315861.447006  7355184.382975 
+315854.924238  7355184.632932 
+315848.640610  7355182.113363 
+315843.107390  7355176.734285 
+315837.615400  7355168.245739 
+315832.700646  7355154.778046 
+315826.713883  7355136.981094 
+315823.638039  7355130.402221 
+315818.698547  7355126.902820 
+315812.101562  7355124.933158 
+315800.919674  7355123.573391 
+315795.229774  7355122.283612 
+315791.197368  7355119.134151 
+315788.797714  7355115.884708 
+315788.871931  7355110.015713 
+315785.862056  7355098.127749 
+315785.334298  7355091.918813 
+315782.547072  7355087.229616 
+315779.100147  7355085.639888 
+315771.991896  7355084.330113 
+315766.293751  7355083.920183 
+315762.549962  7355081.660570 
+315759.548334  7355077.851223 
+315757.363083  7355073.172024 
+315755.911747  7355067.283033 
+315751.937064  7355059.474370 
+315746.288396  7355055.305085 
+315739.180145  7355053.995309 
+315721.277578  7355052.215614 
+315707.267232  7355048.936175 
+315700.356891  7355047.516419 
+315695.755494  7355041.587434 
+315694.287665  7355036.588291 
+315694.427851  7355025.400207 
+315695.409152  7355020.431058 
+315696.984182  7355016.681700 
+315698.649921  7355013.932171 
+315699.631223  7355008.963023 
+315699.680700  7355004.863725 
+315698.534474  7354999.314675 
+315696.349223  7354995.185383 
+315691.088128  7354992.015925 
+315683.905661  7354988.486530 
+315671.148742  7354982.457563 
+315664.733174  7354974.948849 
+315657.649662  7354963.340837 
+315656.833285  7354955.132243 
+315657.872311  7354945.843834 
+315659.818421  7354937.115329 
+315663.991014  7354929.416648 
+315669.078938  7354921.727965 
+315675.189395  7354913.389393 
+315679.716575  7354901.931356 
+315681.035972  7354894.522625 
+315680.244334  7354884.544334 
+315677.523078  7354874.536049 
+315671.709486  7354867.267294 
+315660.774984  7354862.468116 
+315649.931190  7354858.568784 
+315638.699824  7354852.549815 
+315630.033036  7354845.241067 
+315624.128735  7354837.412408 
+315621.448710  7354831.733380 
+315620.558117  7354821.855072 
+315620.863227  7354798.489075 
+315623.782393  7354769.284077 
+315624.301906  7354752.456960 
+315625.225483  7354727.881169 
+315625.406900  7354713.813579 
+315624.598770  7354705.165060 
+315621.226062  7354698.586187 
+315614.802248  7354691.297436 
+315607.957876  7354685.008513 
+315598.342771  7354679.899388 
+315591.432430  7354679.149517 
+315583.342878  7354674.720275 
+315581.545200  7354671.930753 
+315580.027893  7354662.832312 
+315580.473190  7354652.314113 
+315583.120230  7354644.255494 
+315587.647410  7354632.797456 
+315595.687485  7354617.280114 
+315603.067862  7354605.192185 
+315607.867168  7354596.283711 
+315612.996323  7354585.715521 
+315614.282735  7354580.526410 
+315610.621409  7354572.617765 
+315605.393299  7354567.008727 
+315594.186671  7354559.659984 
+315579.623828  7354551.391400 
+315566.611276  7354541.923022 
+315563.205583  7354537.443789 
+315561.333688  7354532.544629 
+315563.411738  7354521.606502 
+315571.055994  7354513.287927 
+315575.822316  7354506.809037 
+315581.479230  7354501.899878 
+315583.796421  7354496.390821 
+315584.497350  7354489.202053 
+315584.307687  7354480.453551 
+315582.171913  7354472.114980 
+315576.086195  7354462.066701 
+315569.274808  7354453.228215 
+315567.270974  7354442.570041 
+315564.607442  7354428.242495 
+315563.551924  7354415.164735 
+315564.533226  7354410.185588 
+315568.054366  7354405.586375 
+315574.305009  7354402.226951 
+315577.471562  7354401.607057 
+315583.351124  7354403.896665 
+315586.476446  7354406.486221 
+315589.238933  7354413.055096 
+315591.877727  7354421.723611 
+315600.082726  7354440.880330 
+315602.869952  7354446.129431 
+315607.512580  7354449.618833 
+315612.163454  7354451.898443 
+315617.861599  7354452.628318 
+315623.790639  7354450.828626 
+315626.693312  7354446.769321 
+315632.407950  7354437.860847 
+315634.692156  7354434.131486 
+315639.730603  7354430.762063 
+315644.727819  7354429.602262 
+315650.038391  7354429.012363 
+315655.431426  7354428.742409 
+315661.047109  7354427.602604 
+315666.085556  7354424.233181 
+315669.268601  7354421.833592 
+315670.538521  7354418.084235 
+315669.070692  7354413.415034 
+315665.054777  7354409.045783 
+315657.608431  7354402.076977 
+315644.900990  7354392.278655 
+315633.158357  7354379.280881 
+315626.363463  7354369.002642 
+315620.574609  7354360.174154 
+315611.281107  7354354.185180 
+315594.763907  7354347.436336 
+315582.963551  7354338.537860 
+315578.700250  7354330.059313 
+315578.502341  7354321.310811 
+315580.423712  7354314.581964 
+315582.180159  7354304.853630 
+315585.066340  7354294.035483 
+315588.059722  7354282.887393 
+315590.492360  7354267.630006 
+315593.461003  7354250.612921 
+315594.920586  7354239.994740 
+315594.706184  7354225.037302 
+315593.370294  7354209.849903 
+315593.568204  7354194.562522 
+315596.305953  7354179.975021 
+315599.505490  7354168.496987 
+315606.597248  7354155.189266 
+315615.833027  7354141.571599 
+315624.821418  7354123.964615 
+315631.269970  7354113.186461 
+315635.475548  7354103.278158 
+315637.100056  7354095.209540 
+315638.609116  7354080.941984 
+315640.596457  7354068.784067 
+315642.567306  7354057.945923 
+315646.781130  7354047.037792 
+315650.986708  7354036.899528 
+315657.608431  7354012.613688 
+315663.034451  7354002.715384 
+315666.011340  7353992.787084 
+315667.949204  7353984.498504 
+315666.497868  7353978.499532 
+315661.055356  7353966.361611 
+315656.115863  7353954.773596 
+315650.162085  7353934.427081 
+315645.989492  7353918.199860 
+315642.682754  7353905.971955 
+315638.130834  7353895.953671 
+315632.531644  7353887.795068 
+315620.500393  7353881.106214 
+315611.371816  7353878.546653 
+315599.208626  7353873.957439 
+315594.895847  7353868.698340 
+315592.562164  7353860.249787 
+315594.516520  7353850.861395 
+315600.379590  7353838.193565 
+315606.407585  7353828.305259 
+315612.155208  7353816.857219 
+315614.843479  7353806.039072 
+315616.550449  7353791.771516 
+315615.330007  7353775.914233 
+315619.873680  7353762.906461 
+315631.838960  7353759.287081 
+315649.518879  7353753.977990 
+315662.531431  7353747.719062 
+315681.299852  7353729.572171 
+315704.884071  7353716.474414 
+315729.565040  7353705.606276 
+315754.592350  7353691.298726 
+315772.156821  7353679.670718 
+315765.279465  7353668.282669 
+315757.701179  7353663.763443 
+315742.940426  7353663.233534 
+315725.730543  7353663.013571 
+315710.796619  7353660.504001 
+315694.749454  7353649.655860 
+315693.529012  7353633.248670 
+315694.774193  7353607.793030 
+315697.594404  7353578.468053 
+315700.373383  7353552.032582 
+315702.871991  7353532.125991 
+315706.920890  7353502.381086 
+315701.602072  7353480.384854 
+315697.025414  7353448.090386 
+315696.827504  7353423.944522 
+315697.091383  7353379.522131 
+315696.275007  7353371.653479 
+315700.596031  7353344.458137 
+315708.215549  7353321.512068 
+315729.762949  7353300.855606 
+315748.564355  7353279.719226 
+315747.038803  7353255.993290 
+315744.457732  7353227.158230 
+315740.961331  7353189.674650 
+315749.801290  7353159.659791 
+315766.821510  7353110.698178 
+315782.324423  7353068.585392 
+315801.307246  7353025.732732 
+315807.673336  7352989.928865 
+315819.820034  7352939.797452 
+315835.537350  7352896.904799 
+315855.839570  7352846.433444 
+315879.407297  7352795.012252 
+315895.652371  7352750.909807 
+315903.073979  7352695.949221 
+315910.924390  7352655.296184 
+315919.797335  7352606.884477 
+315929.676319  7352574.669995 
+315951.017564  7352546.364843 
+315972.564964  7352517.179842 
+315986.237215  7352482.905713 
+315997.394365  7352438.513317 
+315991.811667  7352389.481716 
+315971.014673  7352256.404511 
+315971.781573  7352212.442041 
+315976.556140  7352165.540075 
+315988.463697  7352134.565381 
+316009.343153  7352110.129566 
+316038.782197  7352084.923884 
+316063.372456  7352056.878688 
+316074.249235  7352026.443901 
+316074.265727  7351993.659517 
+316078.058993  7351951.726699 
+316083.608706  7351907.594259 
+316099.383746  7351860.502325 
+316111.250071  7351824.428504 
+316126.216980  7351784.635321 
+316128.517678  7351748.001596 
+316120.370403  7351716.437002 
+316110.277016  7351693.270971 
+316102.632760  7351646.099051 
+316105.172599  7351614.894396 
+316107.003263  7351583.569761 
+316104.413946  7351554.844682 
+316103.638801  7351503.883411 
+316106.945539  7351460.280880 
+316115.620574  7351419.187918 
+316126.769478  7351375.245445 
+316147.319084  7351344.490713 
+316174.704816  7351321.024733 
+316205.397287  7351309.236752 
+316235.273380  7351313.496023 
+316262.222062  7351324.144199 
+316296.988171  7351336.322113 
+316319.821983  7351349.689823 
+316342.053821  7351362.817574 
+316370.775442  7351385.783640 
+316401.171049  7351413.538886 
+316415.700907  7351423.577167 
+316435.698016  7351436.015036 
+316455.736357  7351453.442051 
+316488.440908  7351459.511012 
+316516.354398  7351450.452563 
+316534.578568  7351442.373947 
+316561.048968  7351426.436677 
+316579.784404  7351418.368059 
+316609.157478  7351406.110159 
+316642.439265  7351399.001376 
+316664.967967  7351396.741763 
+316682.293298  7351395.521972 
+316706.083673  7351390.292868 
+316720.522823  7351367.766726 
+316723.351280  7351345.320571 
+316739.043857  7351320.374844 
+316757.853509  7351306.547213 
+316788.059452  7351301.278115 
+316819.007555  7351309.316738 
+316832.679806  7351314.915779 
+316850.640096  7351327.223671 
+316871.742200  7351341.451234 
+316896.043842  7351351.729474 
+316923.017263  7351352.069415 
+316942.461874  7351344.450720 
+316968.668395  7351332.932693 
+316993.703952  7351317.745295 
+317018.327196  7351302.887840 
+317041.738245  7351287.570463 
+317067.573686  7351273.162931 
+317111.451879  7351257.545606 
+317144.428555  7351249.996899 
+317194.112095  7351250.296848 
+317242.121650  7351245.807617 
+317263.405171  7351237.439050 
+317271.775095  7351219.382143 
+317274.512844  7351204.464699 
+317281.101582  7351182.728422 
+317295.054204  7351150.443952 
+317307.538998  7351113.390299 
+317318.457007  7351079.406120 
+317330.826353  7351050.881006 
+317346.865272  7351014.637214 
+317369.113602  7350970.724736 
+317381.837536  7350946.298920 
+317404.885750  7350911.694847 
+317435.314342  7350888.048898 
+317467.804490  7350871.181787 
+317494.464554  7350856.014385 
+317527.960743  7350848.245716 
+317557.119414  7350860.573604 
+317592.924548  7350879.310395 
+317628.853375  7350904.016163 
+317674.570478  7350935.610751 
+317704.256908  7350955.047422 
+317732.351816  7350979.213282 
+317758.756246  7350992.181061 
+317777.590637  7351008.588250 
+317799.896691  7351031.804274 
+317825.509483  7351059.039609 
+317853.414728  7351090.304253 
+317879.307892  7351112.010535 
+317900.030670  7351131.657170 
+317916.819995  7351140.065730 
+317943.174948  7351149.144175 
+317972.391344  7351149.184168 
+318009.087070  7351146.104695 
+318047.893831  7351136.296375 
+318103.522903  7351116.949689 
+318175.256864  7351088.284599 
+318218.623791  7351064.358698 
+318231.298247  7351052.220777 
+318257.199658  7351032.834097 
+318278.722320  7351021.476043 
+318307.889237  7351001.349490 
+318316.028267  7350985.722167 
+318327.671945  7350958.736790 
+318342.391466  7350921.593152 
+318355.090662  7350891.398324 
+318378.699620  7350859.913717 
+318400.972689  7350829.398944 
+318416.269447  7350811.422023 
+318436.827300  7350796.064654 
+318465.697353  7350783.026887 
+318493.124316  7350771.858800 
+318522.563360  7350754.061849 
+318544.844675  7350731.305746 
+318547.095896  7350706.410011 
+318540.993685  7350681.184332 
+318535.180093  7350658.408233 
+318524.839320  7350638.781595 
+318511.851506  7350611.256310 
+318506.293547  7350583.271103 
+318506.301793  7350550.486719 
+318512.387511  7350520.211905 
+318518.695878  7350504.564585 
+318536.515982  7350480.088778 
+318555.985333  7350461.721924 
+318574.036332  7350451.433686 
+318591.510094  7350453.983249 
+318607.466551  7350464.261489 
+318622.474690  7350476.629370 
+318638.695026  7350482.488367 
+318652.878543  7350471.370271 
+318659.747653  7350459.822249 
+318665.379828  7350432.756885 
+318670.203873  7350413.880119 
+318679.835471  7350392.733741 
+318702.661037  7350375.076765 
+318716.555936  7350362.738879 
+318728.479985  7350337.743160 
+318736.652000  7350318.906387 
+318746.753632  7350292.890843 
+318768.870023  7350267.135255 
+318783.787454  7350254.367442 
+318806.926377  7350244.249175 
+318831.722793  7350247.548610 
+318852.074490  7350256.337104 
+318872.269509  7350269.214898 
+318896.950477  7350282.152682 
+318918.489632  7350285.202160 
+318946.650510  7350280.342992 
+318974.242397  7350271.834450 
+319008.324069  7350257.526901 
+319027.306892  7350245.588945 
+319046.100051  7350232.751144 
+319069.205989  7350216.653902 
+319092.501591  7350201.986414 
+319117.339238  7350177.600591 
+319125.750393  7350164.192888 
+319137.361086  7350140.077019 
+319149.326366  7350119.410559 
+319159.411506  7350102.923383 
+319175.475164  7350095.924582 
+319202.580524  7350102.243499 
+319216.772287  7350115.161286 
+319239.309235  7350136.267671 
+319244.891933  7350145.426102 
+319261.409133  7350167.562311 
+319281.983479  7350191.078283 
+319299.432503  7350195.847466 
+319319.982110  7350188.788675 
+319340.069928  7350178.190490 
+319362.112102  7350165.842605 
+319386.174603  7350154.844489 
+319410.525722  7350153.044797 
+319434.118188  7350146.805866 
+319461.767799  7350134.198026 
+319472.199281  7350113.721533 
+319479.579658  7350085.456375 
+319478.021120  7350055.751463 
+319475.506020  7350021.167387 
+319467.350498  7349989.712775 
+319456.020177  7349967.746537 
+319441.028529  7349945.960269 
+319424.519576  7349914.515655 
+319412.620265  7349889.229986 
+319407.037567  7349864.014306 
+319409.841285  7349843.107887 
+319418.978109  7349828.940314 
+319432.106108  7349813.153018 
+319450.124122  7349797.205749 
+319473.477447  7349777.779077 
+319491.478968  7349762.941618 
+319519.169811  7349738.485808 
+319521.907560  7349723.118440 
+319510.296867  7349707.471120 
+319501.143551  7349698.162715 
+319487.924843  7349689.024280 
+319471.201487  7349675.406612 
+319457.273604  7349657.729640 
+319455.484172  7349629.794425 
+319458.048749  7349604.238803 
+319451.435272  7349579.563030 
+319435.932359  7349557.656782 
+319416.933043  7349546.458700 
+319393.810613  7349531.651236 
+319378.357176  7349522.262845 
+319355.787243  7349503.596042 
+319347.153440  7349485.649116 
+319351.523942  7349470.531706 
+319355.506871  7349460.943348 
+319384.203754  7349437.827308 
+319406.518054  7349419.940371 
+319419.233742  7349404.043095 
+319425.847219  7349380.307160 
+319425.286475  7349368.229229 
+319427.282063  7349354.851521 
+319430.135259  7349338.934247 
+319444.310529  7349328.586020 
+319465.346663  7349331.185574 
+319483.595572  7349336.944588 
+319495.066079  7349339.534144 
+319521.726142  7349340.753935 
+319536.932192  7349337.284530 
+319557.976572  7349323.376912 
+319568.053466  7349306.999717 
+319573.174375  7349296.421529 
+319585.650922  7349276.204992 
+319599.314927  7349257.548188 
+319620.870573  7349243.520591 
+319647.967687  7349233.892240 
+319664.963169  7349225.913607 
+319671.584892  7349217.575035 
+319667.676179  7349212.765859 
+319657.714732  7349195.578803 
+319635.977668  7349175.482245 
+319614.603438  7349151.176408 
+319609.466037  7349130.509948 
+319619.782071  7349103.284612 
+319641.560366  7349071.650030 
+319676.112073  7349059.792062 
+319708.602221  7349050.123718 
+319739.871928  7349040.545358 
+319752.975188  7349018.669106 
+319756.702485  7348988.914202 
+319769.723283  7348933.253737 
+319791.979859  7348911.717425 
+319816.545381  7348909.137867 
+319849.447841  7348923.175463 
+319883.776899  7348945.431651 
+319914.106535  7348969.847468 
+319932.000856  7348987.794394 
+319959.320618  7349001.102115 
+319984.751993  7348986.134678 
+319993.460013  7348965.748171 
+320003.685339  7348929.544372 
+320023.929835  7348898.119755 
+320057.228114  7348872.174199 
+320093.115710  7348859.996285 
+320108.890749  7348860.086269 
+320137.150582  7348878.933041 
+320153.395656  7348906.608301 
+320171.842474  7348929.434391 
+320194.898935  7348958.079484 
+320224.263762  7348978.386006 
+320246.759480  7348978.555977 
+320276.107814  7348959.319272 
+320295.775075  7348941.292360 
+320305.810737  7348920.255963 
+320316.530837  7348901.339203 
+320332.041997  7348865.865280 
+320358.578367  7348868.634805 
+320381.370949  7348877.343313 
+320405.680837  7348878.753072 
+320428.399202  7348860.986115 
+320444.734985  7348848.448263 
+320474.536863  7348834.090722 
+320500.759876  7348820.902981 
+320515.693800  7348815.223954 
+320530.611231  7348794.807451 
+320539.343989  7348771.651418 
+320556.207531  7348750.155100 
+320588.854358  7348727.628958 
+320623.439049  7348713.221426 
+320643.469144  7348715.131099 
+320668.257313  7348719.100419 
+320685.244548  7348719.640327 
+320699.238401  7348716.270904 
+320705.505537  7348694.864570 
+320700.211457  7348686.715966 
+320695.535844  7348661.950208 
+320690.876724  7348643.843310 
+320693.581487  7348615.078237 
+320691.956980  7348589.802567 
+320684.048845  7348555.248485 
+320663.746625  7348525.863519 
+320643.345450  7348505.007091 
+320619.085040  7348483.660748 
+320590.635544  7348454.945666 
+320569.978736  7348430.429866 
+320560.825420  7348405.064211 
+320573.854464  7348380.528413 
+320584.154007  7348363.151390 
+320596.036825  7348324.428023 
+320600.531021  7348298.672435 
+320603.285262  7348274.006660 
+320615.456698  7348236.273123 
+320632.880983  7348202.268948 
+320650.140344  7348173.123940 
+320671.539313  7348147.038408 
+320691.956980  7348133.890660 
+320717.322385  7348131.990986 
+320735.307414  7348134.650530 
+320755.865267  7348135.240429 
+320779.515457  7348131.881004 
+320804.889108  7348121.232828 
+320831.376001  7348103.505865 
+320848.973458  7348087.998521 
+320861.285080  7348072.201227 
+320885.603214  7348040.046735 
+320903.786153  7348018.450434 
+320928.038317  7347991.615031 
+320942.155864  7347961.450198 
+320941.281763  7347950.362097 
+320933.489075  7347930.435510 
+320924.014156  7347906.829554 
+320940.152030  7347877.464584 
+320950.501049  7347855.878281 
+320949.791873  7347839.481090 
+320942.625899  7347809.926152 
+320931.782106  7347773.792342 
+320918.068624  7347738.618367 
+320916.938890  7347715.342354 
+320925.218106  7347687.977041 
+320943.153658  7347661.831520 
+320955.745652  7347639.725306 
+320963.431139  7347618.888875 
+320971.182596  7347601.481857 
+320988.953223  7347596.282748 
+321003.062523  7347607.530821 
+321015.200975  7347621.748385 
+321033.449883  7347627.627378 
+321051.674053  7347635.056106 
+321062.971389  7347651.813236 
+321067.787188  7347681.888084 
+321077.600202  7347702.614534 
+321100.335060  7347716.082227 
+321119.598255  7347705.903970 
+321132.726254  7347689.786731 
+321146.497459  7347679.328523 
+321159.171916  7347666.300754 
+321176.225121  7347661.861514 
+321186.219552  7347652.133181 
+321207.560797  7347638.885450 
+321225.562319  7347648.083874 
+321237.832710  7347667.620528 
+321253.418086  7347691.626416 
+321275.765371  7347719.261682 
+321301.708012  7347753.035897 
+321323.205936  7347751.426173 
+321340.588990  7347736.908660 
+321356.141381  7347722.151187 
+321381.449063  7347700.084967 
+321398.221896  7347694.095993 
+321423.356407  7347694.295959 
+321454.065370  7347688.147012 
+321478.968986  7347674.939274 
+321497.184910  7347650.683429 
+321497.052970  7347627.977319 
+321490.167368  7347601.201905 
+321485.285599  7347567.797627 
+321489.466438  7347550.680559 
+321492.616498  7347526.794650 
+321481.368640  7347506.268166 
+321471.860736  7347485.331752 
+321472.000922  7347466.055054 
+321475.992097  7347439.859541 
+321478.012424  7347400.116349 
+321472.594650  7347377.120288 
+321452.655264  7347360.253177 
+321428.609256  7347362.172848 
+321390.223052  7347363.472626 
+321359.621290  7347360.653109 
+321339.096422  7347350.204898 
+321333.587940  7347334.737548 
+321332.252051  7347310.791650 
+321324.310931  7347286.545803 
+321313.623816  7347253.961384 
+321310.696404  7347235.984463 
+321305.690942  7347196.601209 
+321308.280258  7347176.244696 
+321319.140544  7347146.029872 
+321319.750765  7347130.202583 
+321314.794781  7347119.504415 
+321300.009289  7347121.654047 
+321287.120430  7347126.693184 
+321272.730758  7347146.229838 
+321259.726452  7347160.467399 
+321238.525393  7347179.814085 
+321219.468354  7347181.673766 
+321192.898999  7347173.705131 
+321175.614900  7347148.119514 
+321166.321398  7347126.073290 
+321150.991655  7347106.276681 
+321131.802676  7347102.937253 
+321114.048542  7347098.068087 
+321093.771060  7347091.609194 
+321075.588122  7347081.080997 
+321065.634922  7347063.124073 
+321070.335273  7347036.708598 
+321075.241780  7347019.041626 
+321088.938769  7346989.646659 
+321089.829362  7346958.861932 
+321089.400558  7346944.454400 
+321093.713337  7346917.259058 
+321111.417994  7346884.584655 
+321122.987456  7346863.018349 
+321134.507440  7346836.582877 
+321139.347977  7346799.529224 
+321136.263887  7346777.892930 
+321126.055053  7346747.748094 
+321114.724733  7346725.781856 
+321100.895804  7346716.863384 
+321044.013305  7346691.677698 
+321018.449990  7346676.400315 
+321003.565543  7346661.922795 
+320981.968665  7346631.308039 
+320968.527309  7346599.123552 
+320960.866561  7346569.128690 
+320952.612084  7346545.322767 
+320944.703949  7346518.527357 
+320931.048191  7346503.839873 
+320906.565132  7346491.801935 
+320878.725858  7346479.823987 
+320858.110281  7346460.177352 
+320850.606211  7346442.030460 
+320847.480890  7346414.965097 
+320849.311553  7346398.817862 
+320860.105869  7346381.780781 
+320873.910059  7346368.773009 
+320896.512977  7346359.864535 
+320916.922398  7346346.826768 
+320916.262700  7346326.650224 
+320907.043414  7346306.933601 
+320896.257344  7346282.427799 
+320886.032018  7346253.832697 
+320876.623069  7346224.477725 
+320873.934798  7346212.149837 
+320867.420275  7346195.672659 
+320843.423744  7346185.734362 
+320822.898876  7346183.264785 
+320797.995260  7346180.845199 
+320773.446231  7346174.666258 
+320760.408940  7346158.888960 
+320756.285825  7346130.593807 
+320756.648659  7346109.437431 
+320760.359463  7346081.242260 
+320767.987226  7346041.129131 
+320768.251106  7346012.224082 
+320760.969684  7345992.197513 
+320753.424383  7345984.788782 
+320735.975359  7345980.909446 
+320719.177787  7345981.369368 
+320699.131200  7345988.758102 
+320670.195177  7345999.916191 
+320648.334420  7346006.625042 
+320636.369139  7346002.925675 
+320630.374129  7345986.018571 
+320628.296079  7345964.832200 
+320613.683758  7345945.605494 
+320596.762493  7345939.626518 
+320571.388841  7345934.217444 
+320546.790335  7345931.807857 
+320522.216568  7345927.288631 
+320513.269408  7345910.121572 
+320515.957679  7345890.434944 
+320527.931206  7345869.318561 
+320535.963035  7345853.241315 
+320551.028898  7345828.845494 
+320560.091505  7345811.788415 
+320558.945279  7345781.973522 
+320548.810662  7345754.158287 
+320533.728306  7345730.932265 
+320513.764182  7345716.394755 
+320497.857203  7345702.457143 
+320473.959626  7345684.880153 
+320447.167623  7345670.812563 
+320410.092570  7345665.473478 
+320380.950391  7345660.004414 
+320366.659673  7345647.316588 
+320361.415071  7345627.090052 
+320361.612980  7345595.075536 
+320356.681734  7345574.639037 
+320340.288228  7345558.811748 
+320325.948032  7345550.213221 
+320323.268008  7345528.466946 
+320321.684731  7345509.070268 
+320329.098093  7345485.894238 
+320332.165690  7345451.820075 
+320336.981489  7345408.797444 
+320334.680791  7345372.983579 
+320327.217952  7345351.407274 
+320318.823289  7345322.942150 
+320296.682160  7345262.522500 
+320276.132553  7345213.410912 
+320262.748921  7345168.718567 
+320248.540665  7345141.293265 
+320223.703019  7345125.805918 
+320198.857126  7345126.925726 
+320168.172902  7345131.194995 
+320146.567777  7345134.134491 
+320113.558116  7345136.934012 
+320084.688062  7345134.694395 
+320062.934506  7345124.666113 
+320049.616844  7345115.527678 
+320027.624146  7345099.970343 
+320013.465368  7345084.832936 
+320014.875474  7345070.125455 
+320020.763282  7345062.886695 
+320035.054000  7345051.438656 
+320046.524507  7345037.621023 
+320055.051110  7345023.223489 
+320068.170862  7344991.368946 
+320074.380274  7344974.721797 
+320088.102002  7344959.944328 
+320105.476810  7344945.646777 
+320124.847206  7344926.839999 
+320140.729446  7344901.564328 
+320142.213767  7344880.867874 
+320143.071375  7344869.469826 
+320154.286249  7344851.442914 
+320166.869997  7344838.095200 
+320172.823776  7344817.788678 
+320168.535736  7344802.331326 
+320163.678706  7344784.104448 
+320152.884390  7344760.378512 
+320144.300064  7344747.420732 
+320134.247909  7344737.552422 
+320119.536633  7344733.933042 
+320104.883081  7344733.743075 
+320087.945324  7344729.103869 
+320082.849153  7344722.065075 
+320071.807450  7344709.407243 
+320053.591527  7344709.727188 
+320041.601507  7344708.137461 
+320027.962242  7344700.768723 
+320020.177800  7344688.600807 
+320017.547253  7344671.173792 
+320012.277911  7344652.936916 
+319998.762339  7344627.181328 
+319993.509490  7344616.043236 
+319982.245139  7344597.516409 
+319967.838974  7344569.421222 
+319959.262894  7344555.463612 
+319951.734086  7344547.614957 
+319930.458811  7344540.146236 
+319905.299561  7344541.605986 
+319883.100708  7344551.294326 
+319855.995348  7344554.053854 
+319826.473842  7344555.123671 
+319798.115055  7344552.444130 
+319775.536876  7344543.515659 
+319759.044414  7344535.886966 
+319744.357877  7344530.277926 
+319725.828597  7344523.069161 
+319704.536830  7344516.930213 
+319684.275841  7344509.471490 
+319664.270485  7344506.122064 
+319643.663155  7344510.401331 
+319623.863955  7344515.130521 
+319605.986127  7344520.779553 
+319592.602495  7344516.510285 
+319589.427696  7344494.214104 
+319587.465093  7344464.059269 
+319587.423862  7344435.034241 
+319603.009238  7344401.669956 
+319611.494609  7344382.503239 
+319609.119695  7344360.986924 
+319603.619459  7344336.771072 
+319589.716314  7344317.654347 
+319569.991330  7344300.117351 
+319545.937076  7344287.189565 
+319536.866222  7344272.232127 
+319533.485267  7344249.705986 
+319554.067859  7344231.359128 
+319566.362989  7344208.583030 
+319572.135350  7344186.386832 
+319567.129888  7344171.709346 
+319562.190396  7344144.064081 
+319564.829190  7344120.388137 
+319583.193546  7344100.461550 
+319605.845941  7344079.035220 
+319626.527488  7344060.908325 
+319646.450381  7344046.650767 
+319680.804178  7344033.573007 
+319707.018945  7344020.275285 
+319722.777492  7344005.407832 
+319732.070994  7343986.811017 
+319738.470069  7343963.075083 
+319750.542550  7343933.760105 
+319758.145575  7343895.866595 
+319765.888786  7343870.370962 
+319777.903544  7343845.935148 
+319789.481252  7343823.149051 
+319801.999030  7343807.021814 
+319831.001023  7343790.774597 
+319855.995348  7343777.686838 
+319880.371206  7343765.148986 
+319898.933471  7343761.719573 
+319924.067982  7343761.489613 
+319943.067297  7343771.697864 
+319961.810980  7343777.906801 
+319983.251179  7343772.417741 
+319997.508912  7343763.629246 
+320023.146443  7343755.420652 
+320042.426130  7343751.671295 
+320060.757501  7343758.330154 
+320079.682600  7343774.847325 
+320094.764956  7343797.413459 
+320106.400388  7343827.248349 
+320111.265664  7343852.564013 
+320112.708754  7343867.751411 
+320115.430010  7343885.508370 
+320113.327221  7343899.106040 
+320116.353588  7343917.872826 
+320133.027467  7343927.051254 
+320162.227369  7343935.059882 
+320172.493926  7343952.466900 
+320174.151419  7343974.203177 
+320178.348750  7343996.299392 
+320191.047945  7344006.197697 
+320213.642617  7344014.126338 
+320240.434621  7344027.644023 
+320252.086545  7344048.170507 
+320256.052982  7344072.476344 
+320260.497700  7344091.473090 
+320261.008966  7344123.607585 
+320263.746715  7344148.893254 
+320272.957754  7344176.698491 
+320296.764622  7344193.285650 
+320324.900761  7344197.624907 
+320363.773492  7344197.114994 
+320391.752953  7344189.606280 
+320420.243680  7344189.736258 
+320457.318733  7344178.458190 
+320492.431183  7344170.039632 
+320530.767909  7344163.650726 
+320558.466998  7344153.922393 
+320584.145760  7344151.472812 
+320612.562271  7344157.141841 
+320642.966123  7344175.468702 
+320667.053363  7344185.966904 
+320691.643623  7344188.596453 
+320708.465934  7344177.838296 
+320721.750611  7344165.270449 
+320741.360148  7344150.892912 
+320782.459361  7344159.941362 
+320791.200366  7344176.878461 
+320799.438350  7344210.102770 
+320808.237078  7344238.907835 
+320815.163912  7344270.562413 
+320823.946147  7344300.687253 
+320831.672866  7344317.624352 
+320858.250467  7344332.681773 
+320880.111224  7344333.511631 
+320910.762464  7344348.069137 
+320928.162010  7344364.576310 
+320951.787461  7344371.515121 
+320969.780736  7344372.844893 
+320998.708514  7344386.942478 
+321017.707829  7344388.952134 
+321041.877531  7344385.042804 
+321066.245143  7344381.143472 
+321091.783719  7344397.630648 
+321111.970492  7344426.795652 
+321139.422193  7344436.773943 
+321166.560538  7344439.663448 
+321195.521300  7344434.814278 
+321258.440040  7344432.054751 
+321301.914168  7344430.385037 
+321333.381784  7344436.094059 
+321368.123154  7344441.063208 
+321411.564297  7344433.964424 
+321447.864204  7344436.084061 
+321481.550057  7344451.901352 
+321504.078759  7344481.306315 
+321512.522899  7344506.112066 
+321522.253451  7344541.905935 
+321524.224300  7344620.682441 
+321529.114315  7344636.139793 
+321534.416641  7344643.958454 
+321556.376354  7344661.955371 
+321569.982634  7344672.423578 
+321581.271724  7344697.489285 
+321591.208432  7344716.226075 
+321600.741074  7344735.722736 
+321611.296250  7344754.129583 
+321624.160369  7344767.137355 
+321646.400454  7344778.825352 
+321663.808246  7344786.354063 
+321674.726256  7344791.923109 
+321690.105476  7344799.091881 
+321703.546832  7344806.450621 
+321715.553344  7344823.217748 
+321716.815017  7344860.781314 
+321724.632444  7344878.498279 
+321740.176588  7344896.745154 
+321752.570673  7344906.973402 
+321767.463366  7344920.671056 
+321783.040495  7344935.928442 
+321787.419244  7344960.134296 
+321785.341194  7344972.292213 
+321777.853616  7344993.358605 
+321764.387522  7345028.302619 
+321756.743266  7345045.929600 
+321751.201799  7345065.796197 
+321750.121543  7345087.492481 
+321756.891698  7345099.430436 
+321772.023531  7345109.808658 
+321787.765586  7345112.438208 
+321802.864434  7345117.397358 
+321818.309624  7345119.467004 
+321831.264452  7345116.857451 
+321843.023577  7345112.578184 
+321856.555642  7345096.021020 
+321868.603385  7345076.454371 
+321879.059605  7345062.186815 
+321896.252996  7345046.669473 
+321914.238025  7345040.690497 
+321930.177989  7345043.540009 
+321932.412717  7345051.658619 
+321937.113069  7345066.336104 
+321942.102038  7345082.793286 
+321947.536304  7345104.239612 
+321967.327258  7345132.724733 
+321992.230874  7345135.034337 
+322011.535300  7345137.593899 
+322035.795711  7345142.663030 
+322055.050659  7345148.662003 
+322068.442538  7345160.459982 
+322076.565075  7345178.056968 
+322074.726166  7345203.512607 
+322066.677845  7345220.689665 
+322059.882951  7345243.315789 
+322057.639976  7345260.232892 
+322067.263327  7345280.069494 
+322084.794813  7345302.335680 
+322103.876591  7345323.062130 
+322116.212952  7345337.609638 
+322124.673585  7345352.557077 
+322139.558031  7345358.616040 
+322151.218201  7345361.975464 
+322157.996603  7345348.987689 
+322165.805783  7345334.350196 
+322180.855154  7345327.451378 
+322195.640646  7345324.861821 
+322207.003952  7345327.991285 
+322219.414529  7345336.459835 
+322245.249969  7345337.329686 
+322266.855094  7345335.050076 
+322286.547092  7345346.928042 
+322304.152795  7345363.535197 
+322329.328537  7345384.561595 
+322354.298123  7345381.552111 
+322379.061554  7345370.783955 
+322396.683749  7345361.135608 
+322439.201314  7345354.466750 
+322475.501221  7345356.906332 
+322500.874873  7345362.315406 
+322526.298002  7345380.362315 
+322540.250624  7345404.008264 
+322553.188960  7345427.654214 
+322568.345532  7345436.152758 
+322585.151350  7345435.362894 
+322606.970877  7345431.533549 
+322634.463810  7345430.653700 
+322655.772070  7345435.242914 
+322677.162792  7345450.120366 
+322684.064887  7345467.927316 
+322680.551993  7345488.823736 
+322671.217260  7345502.881328 
+322657.841874  7345522.987884 
+322657.371838  7345544.474204 
+322665.865456  7345557.202024 
+322684.971972  7345575.608871 
+322703.295097  7345591.786100 
+322728.272929  7345604.723884 
+322768.448565  7345606.433591 
+322797.912347  7345601.704401 
+322829.792275  7345591.686117 
+322870.157574  7345577.788497 
+322899.011135  7345565.520599 
+322931.641470  7345551.742959 
+322964.535684  7345541.514711 
+323010.895992  7345528.906870 
+323046.750603  7345526.247326 
+323073.171526  7345529.116834 
+323091.898716  7345536.885504 
+323113.033805  7345556.082215 
+323127.769819  7345574.209110 
+323149.210019  7345585.327206 
+323172.621068  7345584.397365 
+323187.860102  7345562.321147 
+323212.574055  7345538.815173 
+323227.244100  7345520.828254 
+323238.879531  7345501.151625 
+323265.160268  7345466.137622 
+323298.780151  7345413.936564 
+323327.386325  7345379.842404 
+323345.808404  7345363.125267 
+323373.515739  7345344.748415 
+323400.810762  7345334.670141 
+323425.005203  7345328.431210 
+323445.117760  7345322.812172 
+323479.026260  7345312.593923 
+323502.000259  7345306.564955 
+323538.745462  7345313.773721 
+323567.846410  7345322.442236 
+323591.694509  7345327.831313 
+323619.706955  7345317.763037 
+323636.174677  7345302.565641 
+323650.745767  7345276.380126 
+323665.737414  7345248.764856 
+323676.647177  7345230.408000 
+323692.100614  7345206.562085 
+323714.414914  7345188.115245 
+323745.849545  7345171.888024 
+323774.496950  7345159.500146 
+323796.382446  7345150.681657 
+323821.352033  7345147.452210 
+323837.094087  7345150.191741 
+323853.182483  7345166.228994 
+323868.660658  7345190.004921 
+323884.749054  7345205.602249 
+323902.404234  7345217.890145 
+323921.560228  7345232.857581 
+323950.727145  7345252.604198 
+323978.022169  7345266.891751 
+323996.765851  7345273.660592 
+324022.972372  7345269.111371 
+324039.481326  7345251.144448 
+324061.350330  7345226.598653 
+324078.222118  7345212.191121 
+324100.025151  7345193.184377 
+324111.256517  7345190.334865 
+324132.441084  7345180.626528 
+324148.768621  7345176.617214 
+324157.567349  7345189.574995 
+324168.089539  7345219.049946 
+324174.232981  7345241.056177 
+324186.874453  7345272.560780 
+324199.548909  7345292.987281 
+324215.596074  7345311.904041 
+324224.815360  7345331.730645 
+324233.828490  7345360.415731 
+324235.692138  7345374.063394 
+324246.535931  7345386.381284 
+324265.931066  7345398.139270 
+324290.018305  7345400.758821 
+324325.336911  7345399.868973 
+324341.483031  7345394.299927 
+324361.471894  7345399.089107 
+324372.752738  7345408.757451 
+324393.327083  7345415.656269 
+324429.132216  7345416.536118 
+324455.478923  7345417.855892 
+324481.743168  7345416.956046 
+324508.164091  7345411.406997 
+324530.758763  7345394.739852 
+324556.858083  7345374.013402 
+324576.912916  7345357.086302 
+324593.504332  7345347.877879 
+324617.434893  7345346.958036 
+324635.386937  7345351.937184 
+324659.787534  7345370.404020 
+324694.124838  7345391.310439 
+324723.489666  7345420.245483 
+324740.930443  7345450.260342 
+324752.310242  7345485.064380 
+324768.984120  7345511.519849 
+324792.535355  7345524.437636 
+324825.701695  7345533.256125 
+324847.471743  7345534.185966 
+324873.876174  7345538.055303 
+324895.530776  7345532.006339 
+324918.232649  7345522.977886 
+324952.528722  7345505.680849 
+324981.308067  7345498.942003 
+325003.952216  7345469.866983 
+325012.586020  7345445.931083 
+325020.189044  7345432.073457 
+325038.982204  7345409.817269 
+325058.286630  7345387.231138 
+325070.474559  7345364.125096 
+325074.276071  7345344.668429 
+325072.313468  7345338.339513 
+325052.687439  7345320.932494 
+325046.354334  7345314.313628 
+325040.722159  7345300.286031 
+325052.753409  7345290.137769 
+325078.465156  7345284.798684 
+325099.385843  7345280.069494 
+325119.506646  7345273.670590 
+325134.951836  7345258.683157 
+325151.708177  7345236.846898 
+325163.986814  7345222.599338 
+325182.672773  7345209.201633 
+325205.259199  7345192.754450 
+325235.151785  7345178.496892 
+325262.422070  7345170.408278 
+325286.764942  7345176.467240 
+325299.851710  7345188.255221 
+325323.658578  7345197.403654 
+325343.903075  7345197.873573 
+325361.220159  7345196.093878 
+325374.521329  7345206.892029 
+325378.718660  7345221.339554 
+325379.790670  7345242.395947 
+325380.689510  7345268.881410 
+325390.131444  7345295.356875 
+325393.512398  7345310.024363 
+325406.310548  7345320.252611 
+325426.794185  7345309.874389 
+325453.041937  7345302.325682 
+325469.806524  7345304.305343 
+325490.578779  7345303.335509 
+325504.308753  7345286.778345 
+325518.145928  7345270.561123 
+325532.560339  7345256.993447 
+325545.845017  7345252.174272 
+325564.959780  7345270.021215 
+325576.463271  7345286.888326 
+325593.194873  7345308.024705 
+325613.348661  7345324.441893 
+325630.583283  7345329.521023 
+325647.273654  7345313.003853 
+325655.041603  7345301.685791 
+325676.465310  7345289.097947 
+325690.739536  7345286.948316 
+325717.787172  7345280.409436 
+325718.718996  7345262.252546 
+325709.474972  7345244.195639 
+325702.457429  7345218.520037 
+325707.702032  7345205.962188 
+325728.523764  7345200.673094 
+325763.825878  7345201.552943 
+325800.134031  7345202.762736 
+325831.642879  7345205.692234 
+325861.106661  7345210.041489 
+325901.603899  7345218.400057 
+325931.042943  7345224.519009 
+325972.562714  7345232.667613 
+326000.179341  7345246.065318 
+326028.142309  7345264.902092 
+326053.953011  7345293.017276 
+326067.897387  7345317.673053 
+326082.847803  7345343.878564 
+326097.484862  7345378.722596 
+326116.154328  7345416.616105 
+326121.695795  7345437.722489 
+326124.136680  7345471.866641 
+326121.819489  7345494.772717 
+326117.044921  7345510.659996 
+326114.521575  7345534.665884 
+326141.346563  7345546.403873 
+326158.539954  7345554.692453 
+326173.168767  7345565.170659 
+326188.704666  7345584.637324 
+326193.223600  7345606.403596 
+326198.278539  7345634.598766 
+326198.402233  7345666.383322 
+326203.877730  7345701.337335 
+326223.388312  7345728.932608 
+326244.259522  7345744.809888 
+326273.822258  7345766.206223 
+326298.305317  7345777.804236 
+326337.252265  7345788.352430 
+326351.757384  7345792.631697 
+326369.899092  7345807.249193 
+326381.922096  7345822.566569 
+326399.775185  7345835.964274 
+326422.460566  7345827.825668 
+326440.965107  7345812.878229 
+326474.395326  7345799.650494 
+326504.304405  7345784.063164 
+326522.627529  7345774.874738 
+326555.628945  7345755.778009 
+326588.349988  7345742.770237 
+326613.113418  7345731.662140 
+326636.920286  7345715.334937 
+326659.960255  7345695.128398 
+326673.871646  7345680.560893 
+326696.944599  7345665.883407 
+326719.250653  7345664.713608 
+326746.652877  7345670.582603 
+326780.849996  7345678.531241 
+326824.084983  7345696.778115 
+326864.244127  7345716.424750 
+326898.465984  7345730.792289 
+326921.184349  7345737.381161 
+326962.852553  7345742.090354 
+327011.257926  7345753.308432 
+327042.956437  7345774.184856 
+327062.607205  7345790.592046 
+327085.119414  7345805.259534 
+327114.401779  7345816.027689 
+327137.697381  7345825.056143 
+327153.604360  7345831.125103 
+327163.367897  7345848.182181 
+327165.586133  7345875.237547 
+327165.149083  7345894.944171 
+327166.633404  7345915.240695 
+327181.954901  7345935.577211 
+327196.723900  7345951.704449 
+327215.756200  7345959.583099 
+327239.546576  7345961.302805 
+327253.326027  7345958.483288 
+327277.932779  7345959.993029 
+327301.030471  7345968.581558 
+327325.274390  7345975.190426 
+327335.458484  7345974.650518 
+327349.435845  7345954.763925 
+327367.569306  7345944.355708 
+327389.685697  7345941.626175 
+327407.390354  7345950.144716 
+327427.923469  7345952.164370 
+327442.486312  7345943.255896 
+327456.249271  7345940.876304 
+327470.259617  7345960.762897 
+327479.718043  7345978.269898 
+327498.643143  7346012.164093 
+327514.715046  7346029.861061 
+327525.525855  7346044.828498 
+327542.331673  7346060.205864 
+327566.229249  7346078.662702 
+327591.174097  7346102.998534 
+327605.357613  7346125.434690 
+327608.392226  7346152.270094 
+327602.949714  7346181.335115 
+327609.579684  7346205.670947 
+327628.463552  7346217.978839 
+327640.923606  7346239.395170 
+327638.589923  7346264.390889 
+327633.345320  7346285.817218 
+327627.424527  7346313.102545 
+327621.338808  7346336.518534 
+327626.921507  7346354.745412 
+327636.981908  7346389.869395 
+327644.321053  7346413.885282 
+327660.302248  7346439.110961 
+327673.859051  7346454.218373 
+327699.447105  7346459.297503 
+327731.384756  7346460.677266 
+327752.684770  7346466.796218 
+327765.837508  7346473.275109 
+327776.656563  7346504.529755 
+327773.828106  7346527.755777 
+327770.076071  7346552.181593 
+327780.367366  7346559.950262 
+327791.747165  7346561.090067 
+327809.121973  7346555.201075 
+327827.271926  7346543.573067 
+327843.071704  7346516.177760 
+327856.174965  7346492.851755 
+327866.161150  7346474.694865 
+327885.737702  7346454.668296 
+327906.378017  7346447.599507 
+327925.542257  7346436.641384 
+327946.232050  7346425.263333 
+327970.937757  7346418.804439 
+327985.822203  7346433.821867 
+328006.973785  7346451.798787 
+328025.733959  7346449.479185 
+328053.004244  7346440.720685 
+328084.842941  7346442.320411 
+328111.387557  7346452.058743 
+328143.580842  7346457.977729 
+328164.674700  7346455.688121 
+328185.356246  7346444.849978 
+328203.324783  7346431.892197 
+328223.478570  7346422.713769 
+328236.722017  7346421.873913 
+328257.205654  7346428.212827 
+328277.103808  7346440.300757 
+328290.677104  7346454.428337 
+328307.623108  7346466.926196 
+328314.137630  7346475.524723 
+328324.964931  7346480.423884 
+328343.461226  7346490.832101 
+328363.268672  7346494.501473 
+328391.000746  7346489.632307 
+328416.893910  7346486.502843 
+328445.566054  7346488.622480 
+328472.481751  7346484.293221 
+328484.727403  7346472.915170 
+328498.853196  7346449.269221 
+328509.614527  7346426.033201 
+328512.764588  7346409.126097 
+328525.034979  7346379.141233 
+328539.383420  7346353.505624 
+328554.003987  7346330.529560 
+328571.609689  7346304.933944 
+328594.022944  7346286.257143 
+328614.440611  7346280.418143 
+328638.791731  7346269.629991 
+328657.147840  7346258.331926 
+328665.954814  7346227.867145 
+328663.505684  7346211.439959 
+328653.940056  7346194.382880 
+328644.102303  7346174.656259 
+328641.628434  7346160.228731 
+328643.805439  7346140.102178 
+328658.426006  7346116.906151 
+328671.652960  7346100.338989 
+328689.250416  7346083.931800 
+328708.117792  7346072.193810 
+328716.784580  7346070.744058 
+328751.641397  7346057.756283 
+328779.035375  7346055.876605 
+328814.098348  7346051.307388 
+328846.860622  7346051.917283 
+328876.291419  7346041.309100 
+328905.136734  7346020.492666 
+328934.905627  7345999.366285 
+328957.079741  7345983.119068 
+328984.350026  7345965.842027 
+329010.276175  7345951.084555 
+329034.017073  7345939.846480 
+329080.748462  7345938.516708 
+329121.278686  7345952.624291 
+329162.823196  7345968.071645 
+329198.817992  7345978.919787 
+329246.002924  7345990.447813 
+329273.644289  7345993.207340 
+329302.819453  7346004.415420 
+329338.979175  7346019.022918 
+329371.964097  7346026.281675 
+329406.474573  7346034.110334 
+329427.551938  7346041.789018 
+329439.937777  7346044.148614 
+329453.189469  7346033.340465 
+329469.319096  7346012.484038 
+329489.918181  7345991.797581 
+329517.691485  7345975.070447 
+329543.930991  7345967.631721 
+329573.386527  7345955.683767 
+329594.084566  7345943.635831 
+329623.845212  7345931.137972 
+329657.036291  7345929.878188 
+329684.611686  7345946.705305 
+329710.455373  7345973.370738 
+329722.222744  7345993.557280 
+329743.968054  7346022.062397 
+329765.408254  7346041.809015 
+329800.157870  7346054.626819 
+329842.749651  7346058.456163 
+329860.074982  7346056.226545 
+329899.986738  7346046.068285 
+329924.329611  7346036.169981 
+329963.969242  7346031.100849 
+329997.333491  7346023.962072 
+330047.569528  7346018.133070 
+330074.988245  7346014.473697 
+330122.032991  7346011.934132 
+330160.592365  7346012.713999 
+330204.767423  7346020.552656 
+330261.526228  7346031.410796 
+330311.729281  7346046.078284 
+330341.951716  7346054.846782 
+330381.261497  7346060.855752 
+330417.586143  7346061.065716 
+330455.386865  7346056.966418 
+330492.973184  7346054.426853 
+330530.031745  7346052.867121 
+330586.856520  7346057.966247 
+330626.471412  7346063.975218 
+330680.748102  7346069.604254 
+330719.604341  7346071.054005 
+330753.908660  7346070.464106 
+330792.764899  7346063.615280 
+330826.574445  7346061.355667 
+330858.033815  7346059.735944 
+330888.676808  7346067.734574 
+330921.925610  7346078.982647 
+330953.863261  7346088.770971 
+330975.954913  7346096.789597 
+330997.757947  7346085.751488 
+331014.126715  7346069.654245 
+331028.170045  7346043.688693 
+331039.525105  7346021.552485 
+331052.867506  7345994.797068 
+331060.099450  7345968.081644 
+331071.083430  7345943.175910 
+331083.518746  7345906.552183 
+331101.421312  7345872.538009 
+331109.494372  7345834.974444 
+331115.151286  7345812.778246 
+331127.025858  7345772.595129 
+331135.816340  7345742.910213 
+331146.420993  7345715.454916 
+331158.204856  7345690.999105 
+331186.481181  7345674.941856 
+331229.452289  7345664.043723 
+331256.062876  7345659.704466 
+331290.680552  7345649.256256 
+331316.301590  7345642.797362 
+331347.365141  7345623.560657 
+331380.547973  7345596.705257 
+331402.796304  7345573.819177 
+331424.731277  7345542.624521 
+331444.357306  7345526.567271 
+331464.989375  7345520.608292 
+331500.811001  7345511.169908 
+331520.907065  7345507.200588 
+331550.197677  7345491.043356 
+331572.330560  7345469.597030 
+331597.390855  7345432.673354 
+331617.074607  7345402.888456 
+331639.413646  7345363.385223 
+331656.260695  7345332.680482 
+331670.938986  7345304.725271 
+331686.532608  7345285.518561 
+331715.592325  7345245.545408 
+331744.825212  7345200.033203 
+331770.380281  7345164.229336 
+331793.370772  7345130.045192 
+331814.299705  7345106.929151 
+331838.296237  7345081.953429 
+331859.926100  7345068.695700 
+331900.464569  7345047.679300 
+331937.605592  7345030.282280 
+331963.812113  7345008.665983 
+331981.219906  7344981.510634 
+331998.685423  7344941.397505 
+332011.335141  7344895.695334 
+332019.078351  7344868.759947 
+332026.937009  7344831.636306 
+332036.543868  7344793.752796 
+332042.472907  7344774.106161 
+332049.729590  7344745.391079 
+332035.249209  7344721.745130 
+332035.735737  7344697.719245 
+332038.580687  7344680.582181 
+332043.363500  7344654.496649 
+332045.144686  7344641.118940 
+332044.600435  7344618.182869 
+332043.412978  7344598.126305 
+332051.197419  7344584.808586 
+332064.655268  7344582.978899 
+332074.097202  7344593.167154 
+332084.487453  7344609.794306 
+332092.370849  7344622.732090 
+332102.183864  7344627.501273 
+332121.793400  7344630.270799 
+332146.960896  7344635.999817 
+332165.069618  7344644.848302 
+332181.677527  7344660.435632 
+332189.297044  7344670.273946 
+332199.909943  7344676.042958 
+332215.750952  7344687.750953 
+332237.001488  7344706.387760 
+332259.579668  7344724.924585 
+332270.538908  7344735.802722 
+332281.646581  7344743.571391 
+332298.716279  7344753.959612 
+332318.985514  7344769.486952 
+332333.358694  7344776.515748 
+332350.370667  7344783.034631 
+332362.006099  7344788.813642 
+332374.020857  7344797.372176 
+332388.616685  7344810.729888 
+332404.342247  7344823.427712 
+332418.385578  7344831.676300 
+332441.169913  7344840.914717 
+332466.279685  7344851.622883 
+332495.858915  7344863.150908 
+332517.859858  7344869.939745 
+332543.390188  7344879.988024 
+332568.681377  7344892.575868 
+332592.694401  7344900.944435 
+332625.365967  7344909.193022 
+332665.558095  7344917.631576 
+332688.697018  7344923.330600 
+332708.463233  7344929.879478 
+332730.027126  7344939.317862 
+332750.980798  7344948.316320 
+332775.793706  7344958.684544 
+332793.424148  7344964.873484 
+332806.271775  7344971.002434 
+332820.917081  7344980.810754 
+332854.050435  7345001.247254 
+332873.536278  7345014.654957 
+332891.735709  7345024.393289 
+332908.434326  7345040.750487 
+332920.935612  7345050.758773 
+332937.601244  7345061.366956 
+332950.152007  7345067.265945 
+332964.871529  7345070.095461 
+332985.017070  7345070.335419 
+332998.895477  7345067.505904 
+333013.705707  7345062.246805 
+333024.961812  7345057.067692 
+333039.062866  7345051.798595 
+333059.059975  7345047.609312 
+333077.976828  7345048.379180 
+333096.258722  7345051.028727 
+333119.389399  7345056.947713 
+333137.902187  7345066.466082 
+333158.839366  7345077.124257 
+333177.319169  7345089.302171 
+333191.007912  7345102.309942 
+333205.282137  7345117.097410 
+333217.437081  7345131.075015 
+333234.341854  7345155.750789 
+333244.633150  7345172.047997 
+333249.358240  7345186.165579 
+333258.956852  7345208.981671 
+333262.090420  7345228.398345 
+333268.365802  7345257.823304 
+333279.935263  7345295.286887 
+333290.284283  7345332.840455 
+333296.213323  7345348.417786 
+333303.016463  7345357.806178 
+333322.271411  7345382.501948 
+333337.477461  7345395.859660 
+333354.720329  7345409.797273 
+333370.528353  7345423.824870 
+333383.524413  7345444.241373 
+333392.916869  7345458.758886 
+333399.159266  7345464.477906 
+333407.842547  7345470.226922 
+333419.205853  7345473.346387 
+333433.018289  7345475.615999 
+333448.686127  7345476.125911 
+333461.022488  7345474.166247 
+333487.039346  7345468.157276 
+333503.267928  7345463.578061 
+333523.512424  7345455.179499 
+333555.986080  7345436.942623 
+333589.259621  7345419.385630 
+333610.741052  7345409.557314 
+333623.415508  7345404.838122 
+333636.667201  7345402.998437 
+333655.262451  7345404.978098 
+333668.159556  7345407.457673 
+333683.448067  7345414.276505 
+333697.474906  7345423.964846 
+333710.569920  7345435.532864 
+333734.121155  7345457.959023 
+333742.631265  7345470.236920 
+333752.724651  7345485.634283 
+333763.279826  7345506.030789 
+333768.920248  7345519.608463 
+333774.428730  7345535.845682 
+333786.707368  7345565.560592 
+333793.395061  7345585.347203 
+333799.761151  7345606.353604 
+333807.727010  7345622.070912 
+333817.135959  7345635.028693 
+333830.230973  7345646.476732 
+333843.441435  7345656.814961 
+333858.952594  7345662.424000 
+333888.061789  7345670.182671 
+333916.263897  7345678.041325 
+333932.715127  7345680.890837 
+333943.583659  7345682.230607 
+333967.604929  7345681.850672 
+333991.700415  7345684.010302 
+334012.118082  7345686.899808 
+334030.086619  7345690.989107 
+334054.412999  7345698.687788 
+334075.383164  7345706.796399 
+334095.454489  7345713.895183 
+334113.051946  7345723.293574 
+334134.269497  7345736.501311 
+334149.211667  7345746.199650 
+334167.971842  7345760.697167 
+334191.918895  7345775.374653 
+334200.767101  7345784.453098 
+334220.764210  7345798.190744 
+334235.986752  7345810.558626 
+334246.426480  7345822.966501 
+334257.336243  7345838.603822 
+334264.419755  7345850.421798 
+334271.659946  7345875.867439 
+334273.358669  7345887.295482 
+334272.113488  7345915.970570 
+334243.053772  7345921.059698 
+334213.804392  7345915.630628 
+334182.732594  7345927.568583 
+334160.319340  7345938.376732 
+334133.403643  7345951.804432 
+334101.993750  7345975.470378 
+334077.807556  7345989.707939 
+334057.967125  7346007.304925 
+334032.717167  7346034.700232 
+334017.626564  7346055.016752 
+334001.026902  7346073.653560 
+333982.126542  7346088.720979 
+333958.921648  7346106.727895 
+333927.363324  7346125.304713 
+333907.259013  7346129.943918 
+333876.838669  7346138.452461 
+333857.938308  7346144.661397 
+333849.758047  7346165.607809 
+333849.411705  7346178.225648 
+333858.457821  7346196.392536 
+333872.344473  7346209.950214 
+333880.862829  7346230.426706 
+333878.463176  7346252.662897 
+333870.208699  7346279.818246 
+333863.323097  7346303.544182 
+333848.603575  7346335.608690 
+333844.703108  7346364.583726 
+333845.098927  7346392.169001 
+333851.440278  7346432.892026 
+333858.993826  7346457.457818 
+333860.857474  7346489.812276 
+333858.853640  7346530.995222 
+333855.167574  7346559.530334 
+333849.634354  7346588.705336 
+333844.538183  7346607.472122 
+333844.389751  7346629.178404 
+333834.081963  7346666.282048 
+333826.008903  7346695.976962 
+333813.466386  7346724.522072 
+333803.711095  7346749.437804 
+333784.983905  7346784.661771 
+333772.441389  7346804.118438 
+333749.690038  7346835.313095 
+333723.310346  7346872.776678 
+333705.424272  7346896.942538 
+333697.252258  7346916.669159 
+333692.271534  7346933.776229 
+333678.219957  7346960.751608 
+333666.122737  7347003.584271 
+333663.376742  7347029.919760 
+333663.269541  7347056.715171 
+333664.712631  7347072.572454 
+333666.831913  7347100.617650 
+333669.264551  7347118.594571 
+333669.165596  7347153.478596 
+333669.528430  7347183.833396 
+333662.543873  7347206.789464 
+333645.094849  7347237.264244 
+333629.022945  7347254.361316 
+333616.026886  7347269.378743 
+333607.236404  7347280.906769 
+333595.765897  7347295.834212 
+333592.904455  7347314.521011 
+333601.233148  7347324.919230 
+333619.539780  7347334.877524 
+333633.657327  7347337.257116 
+333660.078250  7347349.744977 
+333679.827972  7347357.953571 
+333708.467131  7347371.691218 
+333729.956808  7347387.778462 
+333754.439867  7347409.324772 
+333772.086801  7347431.680942 
+333791.803538  7347442.869026 
+333822.438285  7347460.506005 
+333840.753163  7347469.694431 
+333875.445056  7347479.732711 
+333905.106747  7347493.360377 
+333935.502353  7347505.128361 
+333958.014563  7347511.807217 
+333982.101803  7347523.275253 
+334003.179168  7347531.493845 
+334026.450031  7347542.951883 
+334045.482332  7347551.920346 
+334065.380486  7347565.218069 
+334076.051109  7347575.306341 
+334090.688168  7347594.643028 
+334102.488524  7347612.170026 
+334116.655548  7347628.167286 
+334123.903985  7347643.864597 
+334134.525130  7347658.282128 
+334152.419451  7347677.648810 
+334172.771148  7347686.527289 
+334189.197639  7347691.476442 
+334205.929241  7347696.875517 
+334219.114964  7347709.763309 
+334221.267230  7347725.960535 
+334221.176522  7347742.907632 
+334221.654803  7347753.985734 
+334235.508471  7347770.312938 
+334251.225786  7347775.921977 
+334274.339971  7347774.532215 
+334285.018839  7347766.793541 
+334293.974246  7347749.176558 
+334299.152879  7347740.817990 
+334306.821873  7347729.269968 
+334317.286340  7347722.191181 
+334326.637565  7347723.300990 
+334348.910634  7347741.837815 
+334356.777539  7347748.236719 
+334375.191372  7347757.865070 
+334390.933426  7347760.484621 
+334412.489073  7347761.954369 
+334430.754474  7347775.672020 
+334446.133694  7347800.997682 
+334451.304080  7347820.764296 
+334453.942874  7347847.489718 
+334462.510708  7347872.625413 
+334477.477616  7347880.993979 
+334502.636866  7347870.315808 
+334529.395885  7347853.458696 
+334558.282431  7347845.590043 
+334579.120655  7347847.939641 
+334600.148544  7347851.389050 
+334627.055994  7347856.798124 
+334651.926626  7347862.737106 
+334671.684594  7347861.187372 
+334688.589367  7347869.026029 
+334704.735487  7347881.393911 
+334716.676029  7347895.931420 
+334721.838169  7347916.257939 
+334730.529696  7347939.064032 
+334735.823776  7347956.401063 
+334741.653861  7347971.428488 
+334756.068273  7347983.886355 
+334776.469447  7347988.655538 
+334804.391184  7347985.766033 
+334830.960539  7347985.296113 
+334856.218744  7347992.344906 
+334879.506099  7348003.133058 
+334911.204610  7348016.240813 
+334938.268739  7348026.189108 
+334967.295471  7348032.837970 
+334990.970399  7348036.537336 
+335034.634190  7348036.487344 
+335053.245933  7348037.697137 
+335078.685554  7348038.107067 
+335101.898694  7348046.125694 
+335117.648994  7348066.132267 
+335138.470726  7348096.277103 
+335152.530550  7348121.572770 
+335168.701408  7348148.568146 
+335176.527081  7348167.374925 
+335195.353225  7348185.861758 
+335220.619676  7348191.800741 
+335231.529439  7348190.600946 
+335264.423653  7348197.729725 
+335283.315768  7348209.797658 
+335289.525179  7348245.311575 
+335287.776979  7348264.678257 
+335287.834702  7348286.164577 
+335300.987440  7348319.318898 
+335345.533578  7348357.712322 
+335373.570762  7348380.078490 
+335389.543711  7348398.205385 
+335406.951504  7348424.760837 
+335422.726543  7348442.447807 
+335453.245843  7348443.457634 
+335475.263279  7348423.221100 
+335500.678161  7348408.003707 
+335531.065521  7348402.594634 
+335555.746490  7348407.303827 
+335566.928378  7348426.490540 
+335578.588549  7348456.855339 
+335596.722010  7348482.101015 
+335613.898908  7348492.929160 
+335641.919600  7348498.898138 
+335667.746794  7348492.209283 
+335698.026953  7348478.711595 
+335722.411057  7348464.703995 
+335748.576347  7348445.957206 
+335779.318295  7348428.140258 
+335803.116917  7348411.363132 
+335824.614840  7348400.754949 
+335855.200109  7348396.555668 
+335880.260404  7348385.327591 
+335902.310825  7348370.410147 
+335913.014432  7348351.363409 
+335915.290392  7348321.488526 
+335912.931970  7348296.102875 
+335908.446021  7348270.457268 
+335907.514197  7348244.981631 
+335908.553222  7348225.494969 
+335922.769723  7348210.487540 
+335944.737682  7348202.538901 
+335979.157448  7348210.127601 
+335995.831327  7348220.515822 
+336018.755848  7348244.921642 
+336024.049928  7348271.337117 
+336013.511245  7348303.011691 
+336009.231452  7348338.845553 
+336010.344693  7348375.189328 
+336031.619968  7348419.511736 
+336036.856324  7348451.246300 
+336035.586405  7348464.414045 
+336035.809053  7348480.251332 
+336033.475370  7348497.728338 
+336050.569806  7348515.645269 
+336062.238222  7348536.601679 
+336063.087584  7348569.616024 
+336072.001759  7348590.762402 
+336087.075869  7348598.571065 
+336112.391797  7348609.829136 
+336122.039887  7348612.158737 
+336143.174976  7348614.718299 
+336162.405186  7348624.246667 
+336183.688707  7348640.883817 
+336186.896491  7348663.289979 
+336170.478246  7348674.838001 
+336155.659769  7348680.317062 
+336133.015620  7348693.794754 
+336122.724324  7348703.763046 
+336126.501098  7348720.300214 
+336136.742916  7348741.356607 
+336148.716443  7348762.203036 
+336174.040617  7348773.121166 
+336190.302184  7348775.410774 
+336217.638439  7348787.688670 
+336242.418362  7348792.847787 
+336266.785973  7348797.556980 
+336291.046384  7348803.256004 
+336310.012714  7348818.203444 
+336332.450708  7348840.609606 
+336353.387888  7348861.675997 
+336378.027625  7348878.233161 
+336398.024734  7348892.090787 
+336413.065859  7348912.087362 
+336412.834964  7348931.793987 
+336400.144015  7348947.041375 
+336395.361202  7348965.048290 
+336395.534372  7348994.283283 
+336391.452488  7349012.960084 
+336386.686167  7349029.737210 
+336377.244233  7349045.474514 
+336370.498816  7349056.472630 
+336373.698354  7349079.318717 
+336377.343188  7349089.886907 
+336385.853298  7349111.243249 
+336398.865850  7349130.889883 
+336400.968638  7349151.626331 
+336384.756549  7349172.262796 
+336370.803927  7349172.992671 
+336343.055361  7349169.243314 
+336319.256739  7349176.941995 
+336310.919800  7349193.679128 
+336298.558700  7349215.355415 
+336289.141505  7349229.433004 
+336264.897587  7349239.781231 
+336247.151698  7349243.020676 
+336226.346458  7349246.550072 
+336219.304177  7349248.459745 
+336208.963404  7349253.878816 
+336207.676992  7349268.266352 
+336221.439951  7349275.395131 
+336238.798267  7349278.914528 
+336260.724994  7349284.703536 
+336266.827205  7349302.720450 
+336269.903049  7349318.817693 
+336278.050324  7349336.184718 
+336293.281112  7349339.234196 
+336318.638272  7349338.084393 
+336331.601346  7349334.694973 
+336364.676977  7349326.096446 
+336394.107775  7349324.996634 
+336405.413357  7349332.875285 
+336399.970845  7349355.631387 
+336381.037499  7349382.106852 
+336368.767108  7349395.924485 
+336358.558274  7349407.872439 
+336336.697517  7349414.711267 
+336341.925627  7349429.508733 
+336358.533536  7349436.677505 
+336384.525655  7349451.255008 
+336416.273643  7349470.111778 
+336439.585737  7349487.548791 
+336460.819781  7349508.395220 
+336473.799348  7349531.241307 
+336486.383096  7349551.767791 
+336505.712260  7349570.924509 
+336525.577430  7349578.353237 
+336549.400790  7349595.680269 
+336567.031231  7349611.387578 
+336575.153768  7349631.634110 
+336574.370377  7349655.330051 
+336556.245162  7349673.956861 
+336536.305776  7349681.925496 
+336511.839210  7349693.933439 
+336498.966843  7349707.631093 
+336490.638151  7349732.236878 
+336486.135709  7349761.201916 
+336495.412718  7349796.085941 
+336503.980552  7349821.221636 
+336515.772662  7349849.046869 
+336516.844672  7349880.181536 
+336505.481366  7349912.835943 
+336501.704592  7349940.481208 
+336511.954657  7349970.386085 
+336512.985436  7349995.761739 
+336494.406678  7350018.147904 
+336460.506424  7350027.726263 
+336428.807913  7350031.575604 
+336406.130779  7350047.152936 
+336384.360730  7350073.048500 
+336366.969430  7350089.795631 
+336340.119703  7350114.741358 
+336318.943382  7350132.328346 
+336286.948007  7350153.234765 
+336260.906411  7350169.661951 
+336234.477242  7350193.277906 
+336205.590696  7350218.533580 
+336185.247245  7350234.810792 
+336151.676840  7350259.786513 
+336124.464279  7350280.412980 
+336100.533717  7350299.079783 
+336087.339748  7350323.075673 
+336085.393638  7350350.301009 
+336092.246256  7350374.626842 
+336094.819079  7350398.582739 
+336114.387385  7350423.288507 
+336142.853373  7350435.126479 
+336169.554668  7350432.776882 
+336201.261425  7350428.487616 
+336224.021021  7350449.893950 
+336232.968182  7350477.799170 
+336245.510698  7350511.613378 
+336267.833245  7350535.569274 
+336292.159625  7350553.676173 
+336308.000634  7350557.075591 
+336354.253742  7350562.694628 
+336391.040177  7350567.653779 
+336417.304421  7350576.482266 
+336437.268546  7350593.659324 
+336431.718833  7350616.075484 
+336428.214185  7350646.600256 
+336442.183299  7350671.356017 
+336459.789002  7350698.351391 
+336463.178202  7350713.898728 
+336464.736740  7350737.614666 
+336465.091328  7350769.519201 
+336452.218962  7350800.163952 
+336435.503852  7350828.439108 
+336429.863431  7350849.975419 
+336427.653441  7350883.729638 
+336441.169013  7350912.454717 
+336459.442660  7350934.480944 
+336483.818518  7350957.137064 
+336497.490768  7350972.354457 
+336499.511095  7351000.839578 
+336487.034548  7351023.845637 
+336467.820830  7351048.221462 
+336453.810484  7351071.427487 
+336445.432314  7351092.483880 
+336431.760064  7351122.018821 
+336411.804186  7351158.222619 
+336396.119855  7351185.297982 
+336379.907765  7351214.682948 
+336363.019485  7351249.047062 
+336351.977782  7351280.591659 
+336344.993225  7351295.029186 
+336338.981723  7351330.843051 
+336328.838859  7351354.319030 
+336325.556859  7351383.304065 
+336347.153737  7351399.711255 
+336373.673615  7351413.088963 
+336398.750402  7351436.744911 
+336417.378637  7351464.310189 
+336426.820572  7351492.885295 
+336424.676552  7351529.189076 
+336430.523129  7351561.043620 
+336443.403741  7351574.481318 
+336485.137915  7351610.835091 
+336491.471020  7351626.642383 
+336495.280778  7351658.136989 
+336490.250578  7351679.793279 
+336470.987383  7351708.918290 
+336455.352530  7351723.135855 
+336433.788636  7351748.371532 
+336429.484104  7351768.478088 
+336431.232305  7351794.413646 
+336412.463884  7351815.020116 
+336390.718574  7351829.287672 
+336370.259676  7351838.026175 
+336331.733286  7351842.235454 
+336300.315147  7351847.524548 
+336261.104320  7351858.492670 
+336236.736709  7351861.422168 
+336211.882570  7351863.021894 
+336190.186737  7351854.913283 
+336158.752106  7351834.836722 
+336137.006795  7351813.320407 
+336108.260435  7351790.514314 
+336082.680628  7351774.607038 
+336059.657152  7351758.499797 
+336027.529837  7351745.622003 
+336004.968150  7351742.812485 
+335960.009701  7351739.313084 
+335925.680643  7351740.912810 
+335890.617670  7351736.193618 
+335866.324274  7351741.672680 
+335840.983608  7351768.078157 
+335828.309151  7351798.722908 
+335823.699508  7351819.609330 
+335819.089865  7351839.825867 
+335804.642469  7351865.571457 
+335774.881823  7351877.529409 
+335748.180528  7351880.208950 
+335708.532651  7351875.109823 
+335683.909406  7351874.379948 
+335658.271875  7351872.870207 
+335636.180223  7351873.060174 
+335620.809249  7351890.277225 
+335616.504717  7351910.713725 
+335614.311220  7351942.258321 
+335602.156276  7351963.384703 
+335575.405504  7351988.110467 
+335553.693178  7351999.488518 
+335538.033586  7352024.564223 
+335537.415119  7352043.161038 
+335547.953802  7352056.348779 
+335561.988886  7352083.984045 
+335554.773434  7352100.841157 
+335532.953908  7352121.417633 
+335509.419166  7352158.471286 
+335495.573745  7352194.535109 
+335491.162011  7352233.138496 
+335493.404986  7352268.382459 
+335500.686408  7352308.335616 
+335508.462603  7352348.968655 
+335512.412548  7352386.222274 
+335515.702794  7352410.408131 
+335514.498844  7352444.622271 
+335509.303719  7352479.886230 
+335505.378513  7352511.630793 
+335504.520905  7352533.107114 
+335519.017778  7352556.863045 
+335536.376094  7352561.162309 
+335564.668911  7352552.623771 
+335601.059527  7352540.415862 
+335632.626098  7352521.729063 
+335658.642956  7352507.961421 
+335689.005577  7352497.013297 
+335710.643686  7352483.305645 
+335737.757292  7352471.427679 
+335766.066602  7352461.559370 
+335793.031777  7352463.089108 
+335820.813328  7352481.675924 
+335838.394291  7352511.010899 
+335848.957713  7352549.344333 
+335855.942270  7352579.329197 
+335869.441350  7352609.823973 
+335887.550072  7352619.562305 
+335913.014432  7352627.600928 
+335939.229200  7352632.330118 
+335966.788102  7352643.948128 
+335993.827493  7352656.545970 
+336013.115426  7352678.692177 
+336018.261074  7352710.096797 
+336010.575587  7352750.219925 
+336003.805432  7352781.044645 
+336003.500321  7352798.871591 
+336006.213331  7352820.277924 
+336019.506255  7352850.552739 
+336039.956907  7352869.279531 
+336066.847865  7352886.426594 
+336105.151606  7352902.143902 
+336128.760565  7352902.863778 
+336155.832940  7352894.635188 
+336180.291260  7352884.066998 
+336207.429605  7352878.497952 
+336233.314523  7352876.248337 
+336248.941130  7352889.716030 
+336248.429864  7352917.071345 
+336237.058312  7352940.867269 
+336230.906624  7352962.613544 
+336223.460278  7352999.967145 
+336218.726941  7353030.701881 
+336213.944127  7353057.897222 
+336200.197661  7353084.432677 
+336170.676155  7353119.976589 
+336146.720855  7353140.413088 
+336127.127811  7353162.459312 
+336110.874491  7353185.975284 
+336104.310491  7353207.711561 
+336102.521059  7353231.397503 
+336113.480299  7353261.202398 
+336137.056273  7353282.628728 
+336178.485336  7353310.014037 
+336207.116248  7353326.291249 
+336238.831252  7353348.357469 
+336259.471567  7353377.612458 
+336269.614431  7353425.904186 
+336263.949270  7353467.267101 
+336261.772265  7353497.921850 
+336268.212571  7353530.886204 
+336273.176802  7353569.049667 
+336262.934984  7353592.405666 
+336256.939974  7353618.041275 
+336262.852521  7353653.545193 
+336268.006416  7353683.180117 
+336262.753567  7353715.684549 
+336250.549145  7353741.240172 
+336230.296403  7353767.585659 
+336200.148184  7353795.040956 
+336176.432024  7353812.497966 
+336165.579985  7353844.052561 
+336164.862563  7353871.507858 
+336165.579985  7353907.181748 
+336175.805311  7353965.771712 
+336184.183481  7353989.797596 
+336192.000908  7354009.934147 
+336204.329022  7354026.681278 
+336215.791283  7354057.715963 
+336219.015559  7354069.383964 
+336223.864343  7354090.480350 
+336231.013825  7354106.737566 
+336236.497568  7354117.095791 
+336244.974693  7354132.253195 
+336253.493050  7354144.201148 
+336265.812918  7354153.089626 
+336277.085515  7354164.847612 
+336286.873791  7354172.936226 
+336294.163459  7354184.874181 
+336296.637328  7354191.433058 
+336301.329434  7354199.791626 
+336302.962187  7354216.868701 
+336302.822001  7354229.716500 
+336303.151851  7354245.333825 
+336304.545464  7354257.311774 
+336303.613639  7354276.468492 
+336302.178795  7354285.976863 
+336293.487268  7354298.504718 
+336276.120706  7354303.503861 
+336257.830567  7354308.612986 
+336242.847166  7354310.442673 
+336225.513589  7354312.232366 
+336211.305334  7354317.061539 
+336196.948646  7354325.980011 
+336179.961411  7354334.088622 
+336166.115990  7354342.907112 
+336154.439327  7354348.526149 
+336137.567539  7354354.875062 
+336116.465435  7354357.174668 
+336104.821757  7354360.034178 
+336088.807577  7354362.623735 
+336073.865407  7354360.464105 
+336062.180499  7354358.334469 
+336051.592338  7354358.104509 
+336037.804641  7354362.043834 
+336024.552948  7354363.663556 
+336011.639351  7354362.183810 
+335990.677433  7354360.734058 
+335983.536197  7354362.083827 
+335974.547806  7354373.061947 
+335969.327942  7354384.849927 
+335967.381831  7354403.876668 
+335973.805645  7354438.180792 
+335981.697287  7354461.086869 
+335989.382774  7354483.103098 
+335994.215066  7354505.969181 
+336000.795558  7354527.205543 
+336005.702065  7354543.542745 
+336006.543180  7354559.170068 
+336001.232608  7354578.266797 
+335994.314020  7354586.385406 
+335978.951293  7354603.592459 
+335969.130032  7354616.330277 
+335963.852444  7354632.557497 
+335962.681480  7354654.913668 
+335962.219691  7354668.971260 
+335966.854072  7354691.177456 
+335969.426896  7354706.274870 
+335978.192639  7354723.201971 
+335987.420172  7354735.599847 
+335994.569654  7354751.527119 
+335999.245266  7354769.963961 
+335994.957226  7354788.960707 
+335986.958383  7354802.938313 
+335968.445595  7354827.874041 
+335951.458360  7354844.731154 
+335933.869150  7354860.148513 
+335920.798874  7354872.076470 
+335906.870991  7354888.523653 
+335898.822669  7354906.270613 
+335892.819414  7354923.807609 
+335887.401640  7354952.322724 
+335881.827188  7354977.398429 
+335877.671088  7354993.195723 
+335880.029510  7355009.832874 
+335888.152047  7355029.749462 
+335900.917212  7355043.967027 
+335914.770880  7355052.425578 
+335934.256723  7355057.964629 
+335950.963586  7355066.683136 
+335973.846876  7355078.241156 
+335986.801704  7355084.480087 
+335999.748286  7355101.247215 
+336011.771291  7355118.214309 
+336019.423793  7355135.361372 
+336028.758526  7355164.596364 
+336041.754585  7355185.892716 
+336058.980961  7355211.458337 
+336077.551473  7355234.594374 
+336095.858105  7355254.410980 
+332741.101814  7354236.195391 
+332502.777502  7354836.182618 
+332270.225552  7355060.754151 
+332066.601378  7355329.898049 
+331836.811915  7355681.047900 
+332097.062954  7357342.563298 
+332089.286759  7357391.804863 
+332084.108126  7357442.346206 
+330702.765538  7357474.340726 
+328059.098209  7357476.850296 
+326572.937783  7357617.596187 
+325088.517311  7358098.433824 
+324813.216901  7358187.338596 
+323836.187002  7358520.431540 
+323692.084121  7358570.502963 
+323030.785901  7358765.929488 
+321650.193720  7359181.658278 
+320430.089679  7359519.310441 
+320357.102292  7359526.609191 
+320181.952353  7359475.527940 
+319998.490214  7359307.786673 
+319987.803099  7359291.999377 
+319974.386481  7359269.613212 
+319955.708769  7359252.936068 
+319943.867182  7359248.856767 
+319925.552303  7359244.147574 
+319902.957631  7359239.408386 
+319864.324041  7359229.230129 
+319834.109852  7359235.069129 
+319806.419009  7359239.908300 
+319770.399474  7359250.506485 
+319743.409561  7359262.204481 
+319724.748341  7359269.903162 
+319711.900714  7359274.102443 
+319698.071785  7359275.002289 
+319680.226942  7359273.342573 
+319662.893365  7359272.192770 
+319614.958026  7359261.434613 
+319593.352902  7359260.244816 
+319573.232099  7359261.354626 
+319548.048111  7359266.213794 
+319529.659016  7359271.632866 
+319518.839962  7359273.322576 
+319511.047274  7359272.502717 
+319498.529496  7359266.573732 
+319484.238778  7359260.644748 
+319465.387895  7359260.494774 
+319454.568840  7359261.414616 
+319433.656399  7359267.833517 
+319423.290887  7359276.612013 
+319414.937456  7359284.140723 
+319407.293200  7359298.008348 
+319398.882044  7359313.885628 
+319389.918392  7359336.111821 
+319386.562176  7359347.979788 
+319350.262269  7359362.377322 
+319298.376985  7359408.559411 
+319292.332498  7359411.298942 
+319283.269891  7359412.488738 
+319248.041993  7359416.508050 
+319180.274470  7359446.332941 
+319136.082920  7359463.729961 
+319126.352368  7359468.629122 
+319142.053191  7356557.657745 
diff --git a/examples/data/EstadosBrasil.dbf b/examples/data/EstadosBrasil.dbf
new file mode 100644
index 0000000..e056083
Binary files /dev/null and b/examples/data/EstadosBrasil.dbf differ
diff --git a/examples/data/EstadosBrasil.shp b/examples/data/EstadosBrasil.shp
new file mode 100644
index 0000000..ca7a3a8
Binary files /dev/null and b/examples/data/EstadosBrasil.shp differ
diff --git a/examples/data/EstadosBrasil.shx b/examples/data/EstadosBrasil.shx
new file mode 100644
index 0000000..ff58121
Binary files /dev/null and b/examples/data/EstadosBrasil.shx differ
diff --git a/examples/data/OcorrenciasPoA.dbf b/examples/data/OcorrenciasPoA.dbf
new file mode 100644
index 0000000..4fc17ca
Binary files /dev/null and b/examples/data/OcorrenciasPoA.dbf differ
diff --git a/examples/data/OcorrenciasPoA.shp b/examples/data/OcorrenciasPoA.shp
new file mode 100644
index 0000000..20fb31f
Binary files /dev/null and b/examples/data/OcorrenciasPoA.shp differ
diff --git a/examples/data/OcorrenciasPoA.shx b/examples/data/OcorrenciasPoA.shx
new file mode 100644
index 0000000..df08bb4
Binary files /dev/null and b/examples/data/OcorrenciasPoA.shx differ
diff --git a/examples/data/SOCEC.dbf b/examples/data/SOCEC.dbf
new file mode 100644
index 0000000..45d9d83
Binary files /dev/null and b/examples/data/SOCEC.dbf differ
diff --git a/examples/data/cities.dbf b/examples/data/cities.dbf
new file mode 100644
index 0000000..d85d10e
Binary files /dev/null and b/examples/data/cities.dbf differ
diff --git a/examples/data/cities.shp b/examples/data/cities.shp
new file mode 100644
index 0000000..e5a4a1d
Binary files /dev/null and b/examples/data/cities.shp differ
diff --git a/examples/data/cities.shx b/examples/data/cities.shx
new file mode 100644
index 0000000..6e1886c
Binary files /dev/null and b/examples/data/cities.shx differ
diff --git a/examples/data/elevation.raw b/examples/data/elevation.raw
new file mode 100644
index 0000000..bf7d3d0
Binary files /dev/null and b/examples/data/elevation.raw differ
diff --git a/examples/data/nat1.tif b/examples/data/nat1.tif
new file mode 100644
index 0000000..dac0523
Binary files /dev/null and b/examples/data/nat1.tif differ
diff --git a/examples/data/nat2.tif b/examples/data/nat2.tif
new file mode 100644
index 0000000..7bf86a4
Binary files /dev/null and b/examples/data/nat2.tif differ
diff --git a/examples/data/rivers.dbf b/examples/data/rivers.dbf
new file mode 100644
index 0000000..4aa1d8b
Binary files /dev/null and b/examples/data/rivers.dbf differ
diff --git a/examples/data/rivers.shp b/examples/data/rivers.shp
new file mode 100644
index 0000000..877dd1e
Binary files /dev/null and b/examples/data/rivers.shp differ
diff --git a/examples/data/rivers.shx b/examples/data/rivers.shx
new file mode 100644
index 0000000..c3b4cd1
Binary files /dev/null and b/examples/data/rivers.shx differ
diff --git a/examples/data/sampa.jpg b/examples/data/sampa.jpg
new file mode 100644
index 0000000..b2ab515
Binary files /dev/null and b/examples/data/sampa.jpg differ
diff --git a/examples/data/states.dbf b/examples/data/states.dbf
new file mode 100644
index 0000000..fea8e75
Binary files /dev/null and b/examples/data/states.dbf differ
diff --git a/examples/data/states.shp b/examples/data/states.shp
new file mode 100644
index 0000000..aa19d09
Binary files /dev/null and b/examples/data/states.shp differ
diff --git a/examples/data/states.shx b/examples/data/states.shx
new file mode 100644
index 0000000..8555f79
Binary files /dev/null and b/examples/data/states.shx differ
diff --git a/examples/databaseQuery/.cdtproject b/examples/databaseQuery/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/databaseQuery/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/databaseQuery/.project b/examples/databaseQuery/.project
new file mode 100644
index 0000000..64a8d5c
--- /dev/null
+++ b/examples/databaseQuery/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>databaseQuery</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/databaseQuery/Makefile b/examples/databaseQuery/Makefile
new file mode 100644
index 0000000..04b108b
--- /dev/null
+++ b/examples/databaseQuery/Makefile
@@ -0,0 +1,23 @@
+all: databaseQuery
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+databaseQuery: shapelib tiff terralib stat
+	qmake -o makeDatabaseQuery databaseQuery.pro; make -f makeDatabaseQuery
+
+clean:
+	if \
+		test -f makeDatabaseQuery; \
+	then \
+		make -f makeDatabaseQuery distclean; rm -f makeDatabaseQuery; \
+	fi
\ No newline at end of file
diff --git a/examples/databaseQuery/databaseQuery.cpp b/examples/databaseQuery/databaseQuery.cpp
new file mode 100644
index 0000000..48347ad
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.cpp
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+        This file shows an example of how to retrieve an existing layer from a
+        TerraLib database, and execute some queries on its polygon geometry table.
+
+        Author: Lubia Vinhas  
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+	unsigned int i, j;
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to a MySQL database
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		cout.flush();
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\"!";
+	cout << endl << endl;
+
+	// Load a layer by its name 
+	TeLayer *layer = new TeLayer("Distritos");
+	if (!db->loadLayer(layer))                
+	{                                                                                               
+		cout << "Error: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		cout.flush();
+		getchar();
+		return 1;
+	}
+
+	// Retrieve the information about the polygons representation
+	TeRepresentation* rep = layer->getRepresentation(TePOLYGONS);
+	if (!rep)
+	{                                                                                               
+		cout << "Layer has no polygons representation!" << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		cout.flush();
+		getchar();
+		return 0;
+	}
+
+	string polyTableName = rep->tableName_;
+	TePolygonSet ps;
+	// Retrieve all polygons related to the object with id "33"
+	if (db->loadPolygonSet(polyTableName, "33", ps) && ps.size() > 0)
+	{
+		cout << "Polygon identifiers related to the object id \'33\': " << endl;
+		for (i = 0; i < ps.size(); ++i)
+		{
+			TePolygon pol = ps[i];
+			cout << "Parent id: " << pol[0].geomId() << endl;
+			for (j = 1; j < pol.size(); ++j)
+				cout << "\t Child id: " << pol[j].geomId() << endl;
+		}
+	}
+	else
+	{
+		cout << "No polygons related to the object \'33\' were found!" << endl << endl;
+	}
+	ps.clear();
+
+	// Retrieve all polygons that intersect a certain bounding box
+	// given in the same projection coordinates of the data
+	TeBox box(320000,7390000,338000,7400000);
+	if (db->loadPolygonSet(polyTableName, box, ps) && ps.size() > 0)
+	{
+		cout << "\nPolygons that intersect the bounding box: (320000,7390000,338000,7400000)" << endl;
+		cout << "Number of polygons found: " << ps.size() << endl;
+		for (i = 0; i < ps.size(); ++i)
+		{
+			TePolygon pol = ps[i];
+			cout << "Parent id: " << pol[0].geomId() << ", object id: " << pol.objectId() << endl;
+			for (j = 1; j < pol.size(); ++j)
+				cout << "\t Child id: " << pol[j].geomId() << endl;
+		}
+	}
+	else
+		cout << "No polygons intersect the bounding box (320000,7390000,338000,7400000)!" << endl << endl;
+
+	//! Retrieving polygons that contain a certain point
+	TePolygon poly;
+	cout << endl << "Polygons that contain the point (350000,7395000):" << endl;
+	TeCoord2D pt(350000,7395000);
+	if (db->locatePolygon(polyTableName, pt,poly,0))
+		cout << "Polygon id: " << poly.geomId() << ", object id: " << poly.objectId() << endl;
+	else
+	{
+		cout << "\nNo polygons found!\n\n";
+		db->close();
+		cout << endl << "Press Enter\n";
+		cout.flush();
+		getchar();
+		return 0;
+	}
+
+	db->close();
+	cout << endl << "Press Enter\n";
+	cout.flush();
+	getchar();
+	return 0;
+}
+
+
+
+ 
diff --git a/examples/databaseQuery/databaseQuery.dsp b/examples/databaseQuery/databaseQuery.dsp
new file mode 100644
index 0000000..32198e4
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="databaseQuery" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=databaseQuery - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "databaseQuery.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "databaseQuery.mak" CFG="databaseQuery - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "databaseQuery - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "databaseQuery - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "databaseQuery - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "databaseQuery - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "databaseQuery - Win32 Release"
+# Name "databaseQuery - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\databaseQuery.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/databaseQuery/databaseQuery.dsw b/examples/databaseQuery/databaseQuery.dsw
new file mode 100644
index 0000000..c87d2c5
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "databaseQuery"=".\databaseQuery.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/databaseQuery/databaseQuery.pro b/examples/databaseQuery/databaseQuery.pro
new file mode 100644
index 0000000..96e9016
--- /dev/null
+++ b/examples/databaseQuery/databaseQuery.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = databaseQuery
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	databaseQuery.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/databaseSQLQuery/.cdtproject b/examples/databaseSQLQuery/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/databaseSQLQuery/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/databaseSQLQuery/.project b/examples/databaseSQLQuery/.project
new file mode 100644
index 0000000..650dd21
--- /dev/null
+++ b/examples/databaseSQLQuery/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>databaseSQLQuery</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/databaseSQLQuery/Makefile b/examples/databaseSQLQuery/Makefile
new file mode 100644
index 0000000..2311248
--- /dev/null
+++ b/examples/databaseSQLQuery/Makefile
@@ -0,0 +1,23 @@
+all: databaseSQLQuery
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+databaseSQLQuery: shapelib tiff terralib stat
+	qmake -o makeDatabaseSQLQuery databaseSQLQuery.pro; make -f makeDatabaseSQLQuery
+
+clean:
+	if \
+		test -f makeDatabaseSQLQuery; \
+	then \
+		make -f makeDatabaseSQLQuery distclean; rm -f makeDatabaseSQLQuery; \
+	fi
\ No newline at end of file
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.cpp b/examples/databaseSQLQuery/databaseSQLQuery.cpp
new file mode 100644
index 0000000..56554da
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.cpp
@@ -0,0 +1,138 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+    This file shows an example of how retrieve geometries (polygons) using an SQL query 
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to a MySQL database
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !";
+	cout << endl << endl;
+
+	// Load a layer by its name 
+	TeLayer *layer = new TeLayer("Distritos");
+	if (!db->loadLayer(layer))                
+	{                                                                                               
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Retrieve the information about the polygons representation
+	TeRepresentation* rep = layer->getRepresentation(TePOLYGONS);
+	if (!rep)
+	{                                                                                               
+		cout << "Layer has no polygons representation!" << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	string geomTableName = rep->tableName_;
+
+	// Build the SQL to get the polygons that are inside a given box
+	TeBox bb(320100,7390100,337900,7599000);
+    string q;
+    q = "SELECT * FROM " + geomTableName + " WHERE ";
+	q +=  db->getSQLBoxWhere (bb, TePOLYGONS);
+
+    // Get a portal to the database
+    TeDatabasePortal *portal = db->getPortal();
+    if (!portal)
+    {                                                                                               
+		cout << "Fail to get a database portal!\n\n";
+		cout << "Press Enter\n";
+		db->close();
+		getchar();
+		return 1;
+    }
+
+    // Submit the query and go to the first position of the portal 
+    if (!portal->query(q) || !portal->fetchRow())
+    {       
+		cout << "Fail to submit the query or no records returned\n";
+		delete portal;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+   }
+
+    // Process the polygons found
+    TePolygonSet ps;
+    bool flag = true;
+    do
+    {
+        TePolygon poly;
+        flag = portal->fetchGeometry(poly);
+        ps.add(poly);
+    }
+    while (flag);   // while there is a record to be read
+
+    delete portal;
+
+	// Show the result
+	unsigned int i, j;
+
+	cout << "Number of polygons found: " << ps.size() << endl;
+	for (i=0; i < ps.size(); ++i)
+    {
+		TePolygon pol = ps[i];
+		cout << "Geometry id: " << pol[0].geomId() << ", object id: " << pol.objectId() << endl;
+		for (j = 1; j < pol.size(); ++j)
+			 cout << "\t Child id: " << pol[j].geomId() << endl;
+	}
+
+
+	db->close();
+	cout << endl << "Press Enter\n";
+	cout.flush();
+	getchar();
+	return 0;
+}
+
+
+
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.dsp b/examples/databaseSQLQuery/databaseSQLQuery.dsp
new file mode 100644
index 0000000..a5e8388
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="databaseSQLQuery" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=databaseSQLQuery - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "databaseSQLQuery.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "databaseSQLQuery.mak" CFG="databaseSQLQuery - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "databaseSQLQuery - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "databaseSQLQuery - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "databaseSQLQuery - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "databaseSQLQuery - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "databaseSQLQuery - Win32 Release"
+# Name "databaseSQLQuery - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\databaseSQLQuery.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.dsw b/examples/databaseSQLQuery/databaseSQLQuery.dsw
new file mode 100644
index 0000000..4b44c1e
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "databaseSQLQuery"=".\databaseSQLQuery.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/databaseSQLQuery/databaseSQLQuery.pro b/examples/databaseSQLQuery/databaseSQLQuery.pro
new file mode 100644
index 0000000..e11c675
--- /dev/null
+++ b/examples/databaseSQLQuery/databaseSQLQuery.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = databaseSQLQuery
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	databaseSQLQuery.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importCSV/.cdtproject b/examples/importCSV/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importCSV/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importCSV/.project b/examples/importCSV/.project
new file mode 100644
index 0000000..cf757eb
--- /dev/null
+++ b/examples/importCSV/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importCSV</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importCSV/Makefile b/examples/importCSV/Makefile
new file mode 100644
index 0000000..4276005
--- /dev/null
+++ b/examples/importCSV/Makefile
@@ -0,0 +1,23 @@
+all: importCSV
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importCSV: shapelib tiff terralib stat
+	qmake -o makeImportCSV importCSV.pro; make -f makeImportCSV
+
+clean:
+	if \
+		test -f makeImportCSV; \
+	then \
+		make -f makeImportCSV distclean; rm -f makeImportCSV; \
+	fi
\ No newline at end of file
diff --git a/examples/importCSV/importCSV.cpp b/examples/importCSV/importCSV.cpp
new file mode 100644
index 0000000..406be61
--- /dev/null
+++ b/examples/importCSV/importCSV.cpp
@@ -0,0 +1,181 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows how to import a MID/MIF data file into a new layer
+	and a CSV file as a second attribute table of the layer
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeAsciiFile.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+     // Database server parameters
+     string host = "localhost";
+     string dbname = "TerraTeste";
+     string user = "root";
+     string password = "";
+
+     // Connect to the database
+     TeDatabase* db = new TeMySQL();
+     if (!db->connect(host, user, password, dbname))
+     {
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		return 1;
+     }
+
+	string filename = "../data/BairrosRecife.MIF";
+	if (db->layerExist("BairrosRecife"))
+	{
+		cout << "Error: layer \"BairrosRecife\" already exists in the database!\n" << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import the MID/MIF file
+	TeLayer* newLayer = new TeLayer("BairrosRecife", db, 0);
+	// Select the filed ID_ to be the identifier of each neighbourhood
+	if (TeImportMIF(newLayer, filename,"BairrosRecife", "ID_")) 
+		cout << "MID/MIF file imported to the TerraLib database successfully!\n" << endl;
+	else
+	{
+		cout << "Fail to import the MID/MIF file!\n";
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import the csv file
+	filename = "../data/BairrosRecife2.csv";
+	if (db->tableExist("BairrosRecife2"))
+	{
+		cout << "There is already a table named \"BairrosRecife2\" in the TerraLib database!\n\n";
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	cout << "Importing a second attribute table from a CSV file...\n";
+
+	// Creates a definition of the columns contained in the CSV file
+	TeAttributeList attList;
+	TeAttribute column1;
+	column1.rep_.name_  = "BAIRRO_ID";
+	column1.rep_.type_ = TeSTRING;
+	column1.rep_.isPrimaryKey_ = true;
+	column1.rep_.numChar_ = 32;
+	attList.push_back(column1);
+
+	TeAttribute column2;
+	column2.rep_.name_  = "ORDEM";
+	column2.rep_.type_ = TeINT;
+	attList.push_back(column2);
+
+
+	TeAttribute column3;
+	column3.rep_.name_  = "NOME";
+	column3.rep_.type_ = TeSTRING;
+	column3.rep_.numChar_ = 32;
+	attList.push_back(column3);
+
+	TeAttribute column4;
+	column4.rep_.name_  = "NOME_PADRAO";
+	column4.rep_.type_ = TeSTRING;
+	column4.rep_.numChar_ = 32;
+	attList.push_back(column4);
+
+	TeTable attTable2("BairrosRecife2",attList, "BAIRRO_ID","BAIRRO_ID", TeAttrStatic);
+	if (!newLayer->createAttributeTable(attTable2))
+	{
+		cout << "Error creating table \"BairrosRecife2\" in the TerraLib database!\n\n";
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeAsciiFile csvFile(filename);
+	while (csvFile.isNotAtEOF())
+	{
+		TeTableRow trow;
+		csvFile.readNStringCSV (trow, 4, ';');
+		if (trow.empty())
+			break;
+
+		csvFile.findNewLine();
+		attTable2.add(trow);
+	}
+	if (attTable2.size() > 0)
+	{
+		if (!newLayer->saveAttributeTable(attTable2))
+		{
+			cout << "Error saving table \"BairrosRecife2\" in the TerraLib database!\n\n";
+			cout << "Press Enter\n";
+			getchar();
+			return 1;
+		}
+		attTable2.clear();
+	}
+	cout << "Table successfully imported...\n";
+
+
+/*	TeLayer* recife = new TeLayer("BairrosRecife",db);
+	TeTable attTable2;
+	recife->getAttrTablesByName("BairrosRecife2",attTable2);
+
+	TeView* viewrec = new TeView("Recife",user); 
+	viewrec->projection(recife->projection());
+	if (!db->insertView(viewrec))			// save the view in the database
+	{
+		cout << "Fail to insert the view \"Recide\" into the database: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	TeTheme* themerec = new TeTheme("Recife", recife);
+	viewrec->add(themerec);
+	themerec ->addThemeTable(attTable2);
+	themerec->visibleRep(recife->geomRep());
+	if (!themerec ->save() || !themerec ->buildCollection()) 
+	{
+		cout << "Error saving theme \' Recife \': ";
+		cout << db->errorMessage() << endl;
+		db->close();
+		return 0;
+	}
+	cout << "Theme created ..\n";
+*/
+	db->close();
+	getchar();
+	return 0;
+}
+ 
diff --git a/examples/importCSV/importCSV.dsp b/examples/importCSV/importCSV.dsp
new file mode 100644
index 0000000..283ab2c
--- /dev/null
+++ b/examples/importCSV/importCSV.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="importCSV" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importCSV - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importCSV.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importCSV.mak" CFG="importCSV - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importCSV - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importCSV - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importCSV - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importCSV - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importCSV - Win32 Release"
+# Name "importCSV - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importCSV.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportMIF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeMIFProjection.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importCSV/importCSV.dsw b/examples/importCSV/importCSV.dsw
new file mode 100644
index 0000000..7dc5853
--- /dev/null
+++ b/examples/importCSV/importCSV.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importCSV"=".\importCSV.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importCSV/importCSV.pro b/examples/importCSV/importCSV.pro
new file mode 100644
index 0000000..2b5ff7a
--- /dev/null
+++ b/examples/importCSV/importCSV.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = importCSV
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importCSV.cpp \
+	../src/terralib/functions/TeImportMIF.cpp \
+	../src/terralib/functions/TeMIFProjection.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeImportExport.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importDBF/.cdtproject b/examples/importDBF/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importDBF/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importDBF/.project b/examples/importDBF/.project
new file mode 100644
index 0000000..ba4835c
--- /dev/null
+++ b/examples/importDBF/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importDBF</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importDBF/Makefile b/examples/importDBF/Makefile
new file mode 100644
index 0000000..f162a62
--- /dev/null
+++ b/examples/importDBF/Makefile
@@ -0,0 +1,23 @@
+all: importDBF
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importDBF: shapelib tiff terralib stat
+	qmake -o makeImportDBF importDBF.pro; make -f makeImportDBF
+
+clean:
+	if \
+		test -f makeImportDBF; \
+	then \
+		make -f makeImportDBF distclean; rm -f makeImportDBF; \
+	fi
\ No newline at end of file
diff --git a/examples/importDBF/importDBF.cpp b/examples/importDBF/importDBF.cpp
new file mode 100644
index 0000000..bc66813
--- /dev/null
+++ b/examples/importDBF/importDBF.cpp
@@ -0,0 +1,91 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to import a DBF table as
+	an attribute table in a TerraLib database. This attribute 
+	table will be registered in the database as an external table.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+     // Database server parameters
+     string host = "localhost";
+     string dbname = "TerraTeste";
+     string user = "root";
+     string password = "";
+
+     // Connect to the database
+     TeDatabase* db = new TeMySQL();
+     if (!db->connect(host, user, password, dbname))
+     {
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		return 1;
+     }
+
+	// Import the dbf file
+	string filename = "../data/SOCEC.dbf";
+	if (db->tableExist("SOCEC"))
+	{
+		cout << "There is already a table named \"SOCEC\" in the TerraLib database!\n\n";
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	if (TeImportDBFTable(filename,db)) 
+		cout << "The dbf file \"SOCEC.dbf\" was imported successfully as an external table in the TerraLib database!\n\n";
+	else
+	{
+		db->close();
+		cout << "Fail to import the dbf file!\n";
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeAttrTableVector tableVec;
+	if (db->getAttrTables(tableVec, TeAttrExternal))
+	{
+		cout << "External tables in the database: " << tableVec.size() << endl;
+		TeAttrTableVector::iterator it = tableVec.begin();
+		while (it != tableVec.end())
+		{
+			cout << (*it).name() << " primary key column: " << (*it).uniqueName() << endl << endl;
+			++it;
+		}
+	}
+
+	db->close();
+	cout << "Press Enter\n";
+	getchar();
+	return 0;
+}
+ 
diff --git a/examples/importDBF/importDBF.dsp b/examples/importDBF/importDBF.dsp
new file mode 100644
index 0000000..08486a4
--- /dev/null
+++ b/examples/importDBF/importDBF.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="importDBF" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importDBF - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importDBF.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importDBF.mak" CFG="importDBF - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importDBF - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importDBF - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importDBF - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importDBF - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importDBF - Win32 Release"
+# Name "importDBF - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importDBF/importDBF.dsw b/examples/importDBF/importDBF.dsw
new file mode 100644
index 0000000..a11bf9a
--- /dev/null
+++ b/examples/importDBF/importDBF.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importDBF"=".\importDBF.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importDBF/importDBF.pro b/examples/importDBF/importDBF.pro
new file mode 100644
index 0000000..afdf158
--- /dev/null
+++ b/examples/importDBF/importDBF.pro
@@ -0,0 +1,49 @@
+TEMPLATE = app
+TARGET = importDBF
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importDBF.cpp \
+	../src/terralib/functions/TeImportDBF.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeImportExport.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importGeoTab/.cdtproject b/examples/importGeoTab/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importGeoTab/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importGeoTab/.project b/examples/importGeoTab/.project
new file mode 100644
index 0000000..d7dfca9
--- /dev/null
+++ b/examples/importGeoTab/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importGeoTab</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importGeoTab/Makefile b/examples/importGeoTab/Makefile
new file mode 100644
index 0000000..4815ebf
--- /dev/null
+++ b/examples/importGeoTab/Makefile
@@ -0,0 +1,23 @@
+all: importGeoTab
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importGeoTab: shapelib tiff terralib stat
+	qmake -o makeImportGeoTab importGeoTab.pro; make -f makeImportGeoTab
+
+clean:
+	if \
+		test -f makeImportGeoTab; \
+	then \
+		make -f makeImportGeoTab distclean; rm -f makeImportGeoTab; \
+	fi
\ No newline at end of file
diff --git a/examples/importGeoTab/importGeoTab.cpp b/examples/importGeoTab/importGeoTab.cpp
new file mode 100644
index 0000000..912c89a
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.cpp
@@ -0,0 +1,112 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to import some geographical data in 
+	the SPRING Geo/Tab format to a TerraLib database.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Connect to the database
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import the SPRING geo file
+	string filename = "../data/Cadastro_Escolas.geo";
+	string layerName = "Cadastro_Escolas";
+	if (db->layerExist(layerName))
+	{
+		cout << "There is already a layer named \"Cadastro_Escolas\" in the TerraLib database!\n\n";
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeLayer* newLayer = new TeLayer(layerName, db);
+	if (TeImportGEO(newLayer, filename, layerName)) 
+		cout << "The SPRING GEO/TAB file was imported successfully to the TerraLib database!\n\n";
+	else
+	{
+		cout << "Fail to import the SPRING GEO/TAB file!\n\n";
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Show some information about the new layer created
+	cout << "Layer created: " << newLayer->name() << ", id: " << newLayer->id() << endl;
+
+	// Geometries information
+	cout << "Projection: " << newLayer->projection()->name();              
+	cout << "/" << newLayer->projection()->datum().name();          
+
+	TeBox bb = newLayer->box();
+	char message[255];
+	sprintf(message, "[%.15f,%.15f,%.15f,%.15f]\n",bb.x1_, bb.y1_, bb.x2_, bb.y2_);
+	cout << "\nBounding box: " << message;
+	cout << "Number of polygons: " << newLayer->nGeometries(TePOLYGONS) << endl;
+	cout << "Number of lines: "    << newLayer->nGeometries(TeLINES) << endl;
+	cout << "Number of points: "   << newLayer->nGeometries(TePOINTS) << endl;
+
+	// Attributes information
+	TeAttrTableVector tableVec;
+	newLayer->getAttrTables(tableVec);
+	cout << "Attribute tables: " << tableVec.size() << endl;
+	if (tableVec.size() > 0)
+	{
+		TeAttrTableVector::iterator it = tableVec.begin();
+		while (it != tableVec.end())
+		{
+			cout << (*it).name() << ": ";
+			cout << newLayer->nObjects((*it).name()) << " objects\n" << endl;
+			++it;
+		}
+	}
+
+	db->close();
+	cout << "\nPress Enter";
+	getchar();
+	return 0;
+}
+ 
diff --git a/examples/importGeoTab/importGeoTab.dsp b/examples/importGeoTab/importGeoTab.dsp
new file mode 100644
index 0000000..6b70154
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="importGeoTab" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importGeoTab - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importGeoTab.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importGeoTab.mak" CFG="importGeoTab - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importGeoTab - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importGeoTab - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importGeoTab - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importGeoTab - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importGeoTab - Win32 Release"
+# Name "importGeoTab - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importGeoTab.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportGeo.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importGeoTab/importGeoTab.dsw b/examples/importGeoTab/importGeoTab.dsw
new file mode 100644
index 0000000..455b992
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importGeoTab"=".\importGeoTab.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importGeoTab/importGeoTab.pro b/examples/importGeoTab/importGeoTab.pro
new file mode 100644
index 0000000..32f31f5
--- /dev/null
+++ b/examples/importGeoTab/importGeoTab.pro
@@ -0,0 +1,49 @@
+TEMPLATE = app
+TARGET = importGeoTab
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importGeoTab.cpp \
+	../src/terralib/functions/TeImportGeo.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeImportExport.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importGridData/.cdtproject b/examples/importGridData/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importGridData/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importGridData/.project b/examples/importGridData/.project
new file mode 100644
index 0000000..741d1e9
--- /dev/null
+++ b/examples/importGridData/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importGridData</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importGridData/Makefile b/examples/importGridData/Makefile
new file mode 100644
index 0000000..5ae7cbe
--- /dev/null
+++ b/examples/importGridData/Makefile
@@ -0,0 +1,23 @@
+all: importGridData
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importGridData: shapelib tiff terralib stat
+	qmake -o makeImportGridData importGridData.pro; make -f makeImportGridData
+
+clean:
+	if \
+		test -f makeImportGridData; \
+	then \
+		make -f makeImportGridData distclean; rm -f makeImportGridData; \
+	fi
\ No newline at end of file
diff --git a/examples/importGridData/importGridData.cpp b/examples/importGridData/importGridData.cpp
new file mode 100644
index 0000000..f9d6245
--- /dev/null
+++ b/examples/importGridData/importGridData.cpp
@@ -0,0 +1,119 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to import, to a TerraLib database, a raster data: 
+	a binary raw grid data. Each point of the grid is a float value that represents the 
+	elevation over an area 
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeMySQL.h>
+#include <TeInitRasterDecoders.h>
+#include <TeImportRaster.h>
+
+int main()
+{
+	// Initialize the raster decoder tool
+	TeInitRasterDecoders();
+
+	TeRasterParams parRaw;
+	parRaw.nBands(1);
+	parRaw.setDataType(TeFLOAT);
+	parRaw.fileName_ = "../data/elevation.raw";
+	parRaw.mode_ = 'r';
+	TeProjection* proj = new TeNoProjection();
+	parRaw.projection(proj);
+	parRaw.lowerLeftResolutionSize(183557.0,8246277.0,30,30,382,422,false);
+
+	// Acess input image
+	TeRaster elev(parRaw);
+	if (!elev.init())
+	{
+		cout << "Cannot access input grid!" << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		elev.clear();
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	string layerName = "Elevation";
+
+	// Check whether there is a layer with this name in the database
+	if (db->layerExist(layerName))
+	{
+		cout << "The database already has an infolayer with the name \"";
+		cout << layerName << "\"!" << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Create a layer to receive the raster geometry (same projection as raster data)
+	TeLayer* layer = new TeLayer(layerName, db, elev.projection());
+	if (layer->id() <= 0)
+	{
+		elev.clear();
+		db->close();
+		cout << "The destination layer could not be created!\n" << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import raster to the layer
+	if (!TeImportRaster(layer, &elev, parRaw.ncols_, 2))
+	{
+		elev.clear();
+		db->close();
+		cout << "Fail to import grid!\n" << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Close database
+	db->close();
+	cout << "The GRID data was imported successfully into the TerraLib database!\n\n";
+	cout << "Press Enter\n";
+	getchar();
+	return 0;
+}
+ 
diff --git a/examples/importGridData/importGridData.dsp b/examples/importGridData/importGridData.dsp
new file mode 100644
index 0000000..1562c1e
--- /dev/null
+++ b/examples/importGridData/importGridData.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="importGridData" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importGridData - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importGridData.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importGridData.mak" CFG="importGridData - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importGridData - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importGridData - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importGridData - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importGridData - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importGridData - Win32 Release"
+# Name "importGridData - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importGridData.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importGridData/importGridData.dsw b/examples/importGridData/importGridData.dsw
new file mode 100644
index 0000000..3ec0c83
--- /dev/null
+++ b/examples/importGridData/importGridData.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importGridData"=".\importGridData.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importGridData/importGridData.pro b/examples/importGridData/importGridData.pro
new file mode 100644
index 0000000..ddaf9eb
--- /dev/null
+++ b/examples/importGridData/importGridData.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = importGridData
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importGridData.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importJPEG/.cdtproject b/examples/importJPEG/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importJPEG/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importJPEG/.project b/examples/importJPEG/.project
new file mode 100644
index 0000000..631421d
--- /dev/null
+++ b/examples/importJPEG/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importJPEG</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importJPEG/Makefile b/examples/importJPEG/Makefile
new file mode 100644
index 0000000..8b69fdc
--- /dev/null
+++ b/examples/importJPEG/Makefile
@@ -0,0 +1,23 @@
+all: importJPEG
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importJPEG: shapelib tiff terralib stat
+	qmake -o makeImportJPEG importJPEG.pro; make -f makeImportJPEG
+
+clean:
+	if \
+		test -f makeImportJPEG; \
+	then \
+		make -f makeImportJPEG distclean; rm -f makeImportJPEG; \
+	fi
\ No newline at end of file
diff --git a/examples/importJPEG/importJPEG.cpp b/examples/importJPEG/importJPEG.cpp
new file mode 100644
index 0000000..c0a1411
--- /dev/null
+++ b/examples/importJPEG/importJPEG.cpp
@@ -0,0 +1,109 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to import a raster data (an image in JPEG
+	format) to a TerraLib database.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeMySQL.h>
+#include <TeInitRasterDecoders.h>
+#include <TeImportRaster.h>
+
+int main()
+{
+	// Initialize the raster decoder tool
+	TeInitRasterDecoders();
+
+	// Acess input image
+	TeRaster image("../data/sampa.jpg");
+	if (!image.init())
+	{
+		cout << "Cannot access input image!" << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		image.clear();
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	string layerName = "SampaJPEG";
+
+	// Check whether there is a layer with this name in the database
+	if (db->layerExist(layerName))
+	{
+		cout << "The database already has an infolayer with the name \"";
+		cout << layerName << "\"!" << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Create a layer to receive the raster geometry (same projection as raster data)
+	TeLayer* layer = new TeLayer(layerName, db, image.projection());
+	if (layer->id() <= 0)
+	{
+		image.clear();
+		db->close();
+		cout << "The destination layer could not be created!\n" << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import raster to the layer
+	if (!TeImportRaster(layer, &image, 128, 128))
+	{
+		image.clear();
+		db->close();
+		cout << "Fail to import image!\n" << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Close database
+	db->close();
+	cout << "The JPEG image was imported successfully into the TerraLib database!\n\n";
+	cout << "Press Enter\n";
+	getchar();
+	return 0;
+}
+ 
diff --git a/examples/importJPEG/importJPEG.dsp b/examples/importJPEG/importJPEG.dsp
new file mode 100644
index 0000000..437b0a8
--- /dev/null
+++ b/examples/importJPEG/importJPEG.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="importJPEG" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importJPEG - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importJPEG.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importJPEG.mak" CFG="importJPEG - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importJPEG - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importJPEG - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importJPEG - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importJPEG - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importJPEG - Win32 Release"
+# Name "importJPEG - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importJPEG.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importJPEG/importJPEG.dsw b/examples/importJPEG/importJPEG.dsw
new file mode 100644
index 0000000..491946a
--- /dev/null
+++ b/examples/importJPEG/importJPEG.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importJPEG"=".\importJPEG.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importJPEG/importJPEG.pro b/examples/importJPEG/importJPEG.pro
new file mode 100644
index 0000000..1d4bf3b
--- /dev/null
+++ b/examples/importJPEG/importJPEG.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = importJPEG
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importJPEG.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importMIDMIF/.cdtproject b/examples/importMIDMIF/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importMIDMIF/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importMIDMIF/.project b/examples/importMIDMIF/.project
new file mode 100644
index 0000000..c594722
--- /dev/null
+++ b/examples/importMIDMIF/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importMIDMIF</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importMIDMIF/Makefile b/examples/importMIDMIF/Makefile
new file mode 100644
index 0000000..f528c94
--- /dev/null
+++ b/examples/importMIDMIF/Makefile
@@ -0,0 +1,23 @@
+all: importMIDMIF
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importMIDMIF: shapelib tiff terralib stat
+	qmake -o makeImportMIDMIF importMIDMIF.pro; make -f makeImportMIDMIF
+
+clean:
+	if \
+		test -f makeImportMIDMIF; \
+	then \
+		make -f makeImportMIDMIF distclean; rm -f makeImportMIDMIF; \
+	fi
\ No newline at end of file
diff --git a/examples/importMIDMIF/importMIDMIF.cpp b/examples/importMIDMIF/importMIDMIF.cpp
new file mode 100644
index 0000000..c75c9af
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.cpp
@@ -0,0 +1,111 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to import some geographical data
+	in MID/MIF format into a TerraLib database.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+int main()
+{
+     // Datatabase server parameters
+     string host = "localhost";
+     string dbname = "TerraTeste";
+     string user = "root";
+     string password = "";
+
+     // Connects to database
+     TeDatabase* db = new TeMySQL();
+     if (!db->connect(host, user,password, dbname))
+     {
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+     }
+
+	string filename = "../data/Distritos.mif";
+	if (db->layerExist("Distritos"))
+	{
+		cout << "Error: layer \"Distritos\" already exists in the database!\n" << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import the MID/MIF file
+	TeLayer* newLayer = TeImportMIF(filename, db);                          
+	if (newLayer) 
+		cout << "MID/MIF file imported to the TerraLib database successfully!\n" << endl;
+	else
+	{
+		cout << "Fail to import the MID/MIF file!\n";
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Show some information about the new layer created
+	cout << "Layer created: " << newLayer->name() << ", id: " << newLayer->id() << endl;
+
+	// Geometries information
+	cout << "Projection: " << newLayer->projection()->name();              
+	cout << "/" << newLayer->projection()->datum().name();          
+	TeBox bb = newLayer->box();
+	char message[255];
+	sprintf(message,"[%.15f,%.15f,%.15f,%.15f]\n",bb.x1_, bb.y1_, bb.x2_, bb.y2_);
+	cout << "\nBounding box: " << message;
+	cout << "Number of polygons: " << newLayer->nGeometries(TePOLYGONS) << endl;
+	cout << "Number of lines: "    << newLayer->nGeometries(TeLINES) << endl;
+	cout << "Number of points: "   << newLayer->nGeometries(TePOINTS) << endl;
+
+	// Attributes information
+	TeAttrTableVector tableVec;
+	newLayer->getAttrTables(tableVec);
+	cout << "Number of Attribute Tables: " << tableVec.size() << endl;
+	if (tableVec.size() > 0)
+	{
+		TeAttrTableVector::iterator it = tableVec.begin();
+		while (it != tableVec.end())
+		{
+			cout << (*it).name() << ": ";
+			cout << newLayer->nObjects((*it).name()) << " objects" << endl << endl;
+			++it;
+		}
+	}
+	db->close();
+	cout << "Press Enter\n";
+	cout.flush();
+	getchar();
+	return 1;
+}
+
+ 
diff --git a/examples/importMIDMIF/importMIDMIF.dsp b/examples/importMIDMIF/importMIDMIF.dsp
new file mode 100644
index 0000000..212e9bc
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.dsp
@@ -0,0 +1,134 @@
+# Microsoft Developer Studio Project File - Name="importMIDMIF" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importMIDMIF - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importMIDMIF.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importMIDMIF.mak" CFG="importMIDMIF - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importMIDMIF - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importMIDMIF - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importMIDMIF - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importMIDMIF - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importMIDMIF - Win32 Release"
+# Name "importMIDMIF - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importMIDMIF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportMIF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeMIFProjection.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeMIFProjection.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importMIDMIF/importMIDMIF.dsw b/examples/importMIDMIF/importMIDMIF.dsw
new file mode 100644
index 0000000..1a6bbbe
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importMIDMIF"=".\importMIDMIF.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importMIDMIF/importMIDMIF.pro b/examples/importMIDMIF/importMIDMIF.pro
new file mode 100644
index 0000000..e6ae3ba
--- /dev/null
+++ b/examples/importMIDMIF/importMIDMIF.pro
@@ -0,0 +1,52 @@
+TEMPLATE = app
+TARGET = importMIDMIF
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importMIDMIF.cpp \
+	../src/terralib/functions/TeImportMIF.cpp \
+	../src/terralib/functions/TeImportDBF.cpp \
+	../src/terralib/functions/TeMIFProjection.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h \
+	../src/terralib/drivers/MySQL/TeImportExport.h \
+	../src/terralib/functions/TeMIFProjection.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/importShape/.cdtproject b/examples/importShape/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/importShape/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/importShape/.project b/examples/importShape/.project
new file mode 100644
index 0000000..d85b49a
--- /dev/null
+++ b/examples/importShape/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>importShape</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/importShape/Makefile b/examples/importShape/Makefile
new file mode 100644
index 0000000..f6fb303
--- /dev/null
+++ b/examples/importShape/Makefile
@@ -0,0 +1,23 @@
+all: importShape
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+importShape: shapelib tiff terralib stat
+	qmake -o makeImportShape importShape.pro; make -f makeImportShape
+
+clean:
+	if \
+		test -f makeImportShape; \
+	then \
+		make -f makeImportShape distclean; rm -f makeImportShape; \
+	fi
\ No newline at end of file
diff --git a/examples/importShape/importShape.cpp b/examples/importShape/importShape.cpp
new file mode 100644
index 0000000..f5cebf8
--- /dev/null
+++ b/examples/importShape/importShape.cpp
@@ -0,0 +1,90 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+	This file shows an example of importing a shapefile that will create
+	an attribute and a geometry table in a TerraLib database.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeImportExport.h>
+#include <TeMySQL.h>
+
+using namespace std;
+#include <string>
+
+int main()
+{
+	// Open a connection to the "TerraTeste" TerraLib database
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	TeMySQL* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Define a projection. It cannot be decoded from a shapefile
+	TeDatum sad69 = TeDatumFactory::make("SAD69");
+	TePolyconic* proj = new TePolyconic(sad69, -54.0*TeCDR);
+
+	string layerName = "Brasil";
+
+	// Check whether there is a layer with this name in the database
+	if (db->layerExist(layerName))
+	{
+		cout << "The database already has an infolayer with the name \"";
+		cout << layerName << "\" !" << endl << endl;
+		db->close();
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Create a new layer in the database
+	TeLayer* layer = new TeLayer(layerName, db, proj);
+
+	string filename = "../data/EstadosBrasil.shp";	// Shapefile path
+	string tablename = "BrasilIBGE";	// Name of the attribute table
+	string linkcolumn = "SPRROTULO";	// Column that will link the attributes and geometry tables                 
+
+	if (TeImportShape(layer, filename, tablename, linkcolumn))
+		cout << "The shapefile was imported successfully into the TerraLib database!\n" << endl;
+	else
+		cout << "Error: Fail to import the shapefile!\n" << endl;
+		
+	cout.flush();
+	db->close();
+	cout << "Press Enter\n";
+	getchar();
+	return 0;
+}
+
+ 
diff --git a/examples/importShape/importShape.dsp b/examples/importShape/importShape.dsp
new file mode 100644
index 0000000..0257b7e
--- /dev/null
+++ b/examples/importShape/importShape.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="importShape" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=importShape - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "importShape.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "importShape.mak" CFG="importShape - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "importShape - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "importShape - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "importShape - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "importShape - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "importShape - Win32 Release"
+# Name "importShape - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\importShape.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportSHP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/importShape/importShape.dsw b/examples/importShape/importShape.dsw
new file mode 100644
index 0000000..5c270a2
--- /dev/null
+++ b/examples/importShape/importShape.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "importShape"=".\importShape.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/importShape/importShape.pro b/examples/importShape/importShape.pro
new file mode 100644
index 0000000..0a8612f
--- /dev/null
+++ b/examples/importShape/importShape.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = importShape
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	importShape.cpp \
+	../src/terralib/functions/TeImportDBF.cpp \
+	../src/terralib/functions/TeImportSHP.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeImportExport.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/mosaicTIFFImages/.cdtproject b/examples/mosaicTIFFImages/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/mosaicTIFFImages/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/mosaicTIFFImages/.project b/examples/mosaicTIFFImages/.project
new file mode 100644
index 0000000..edf9336
--- /dev/null
+++ b/examples/mosaicTIFFImages/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>mosaicTIFFImages</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/mosaicTIFFImages/Makefile b/examples/mosaicTIFFImages/Makefile
new file mode 100644
index 0000000..2bf9070
--- /dev/null
+++ b/examples/mosaicTIFFImages/Makefile
@@ -0,0 +1,23 @@
+all: mosaicTIFFImages
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+mosaicTIFFImages: shapelib tiff terralib stat
+	qmake -o makeMosaicTIFFImages mosaicTIFFImages.pro; make -f makeMosaicTIFFImages
+
+clean:
+	if \
+		test -f makeMosaicTIFFImages; \
+	then \
+		make -f makeMosaicTIFFImages distclean; rm -f makeMosaicTIFFImages; \
+	fi
\ No newline at end of file
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.cpp b/examples/mosaicTIFFImages/mosaicTIFFImages.cpp
new file mode 100644
index 0000000..ebbcfed
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.cpp
@@ -0,0 +1,133 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to build a mosaic of two images  
+	in GeoTiff format in a layer of a TerraLib database.
+
+	Author: Lubia Vinhas  
+*/
+
+#include <TeDatabase.h>
+#include <TeMySQL.h>
+#include <TeInitRasterDecoders.h>
+#include <TeImportRaster.h>
+
+int main()
+{
+	// Initialize the raster decoder tool
+	TeInitRasterDecoders();
+
+	// Access the input images
+	TeRaster img1("../data/nat1.tif");
+	if (!img1.init())
+	{
+		cout << "Cannot access the first input image!" << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeRaster img2("../data/nat2.tif");
+	if (!img2.init())
+	{
+		cout << "Cannot access the second input image!" << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+    // Database server parameters
+     string host = "localhost";
+     string dbname = "TerraTeste";
+     string user = "root";
+     string password = "";
+
+     // Connect to the database
+     TeDatabase* db = new TeMySQL();
+     if (!db->connect(host, user, password, dbname))
+     {
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		return 1;
+     }
+
+	// Creates a layer to receive the raster geometry (same projection as raster data)
+	string layerName = "NatividadeMosaic";
+
+	// Check whether there is a layer with this name in the database
+	if (db->layerExist(layerName))
+	{
+		db->close();
+		cout << "The database already has an infolayer with the name \"";
+		cout << layerName << "\"!" << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	TeLayer* layer = new TeLayer(layerName, db, img1.projection());
+	if (layer->id() <= 0)
+	{
+		db->close();
+		cout << "The destination layer could not be created!\n" << db->errorMessage() << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Import the first image to the layer
+	if (!TeImportRaster(layer,&img1,256,256,TeNoCompression,"",255,true,TeExpansible))
+	{
+		db->close();
+		cout << "Fail to import the first image\n\n!";
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	else
+		cout << "The first image was imported successfully!\n\n"; 
+
+	delete layer;
+	layer = 0;
+
+	layer = new TeLayer(layerName, db);
+
+	// Mosaic the second raster to the same layer
+	if (!TeImportRaster(layer, &img2, 256, 256, TeNoCompression, "", 255, true, TeExpansible))
+	{
+		db->close();
+		cout << "Fail to import the second image\n\n!";
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	else
+		cout << "The second image was added successfully!" << endl << endl;
+
+	// Close the database
+	db->close();
+	getchar();
+	return 0;
+}
+ 
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.dsp b/examples/mosaicTIFFImages/mosaicTIFFImages.dsp
new file mode 100644
index 0000000..15cc9d3
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="mosaicTIFFImages" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=mosaicTIFFImages - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "mosaicTIFFImages.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "mosaicTIFFImages.mak" CFG="mosaicTIFFImages - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "mosaicTIFFImages - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "mosaicTIFFImages - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "mosaicTIFFImages - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "mosaicTIFFImages - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "mosaicTIFFImages - Win32 Release"
+# Name "mosaicTIFFImages - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\mosaicTIFFImages.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.dsw b/examples/mosaicTIFFImages/mosaicTIFFImages.dsw
new file mode 100644
index 0000000..c19b27b
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "mosaicTIFFImages"=".\mosaicTIFFImages.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/mosaicTIFFImages/mosaicTIFFImages.pro b/examples/mosaicTIFFImages/mosaicTIFFImages.pro
new file mode 100644
index 0000000..faa14d5
--- /dev/null
+++ b/examples/mosaicTIFFImages/mosaicTIFFImages.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = mosaicTIFFImages
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	mosaicTIFFImages.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/proxMatrixAndSpatialStatistics/.cdtproject b/examples/proxMatrixAndSpatialStatistics/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/proxMatrixAndSpatialStatistics/.project b/examples/proxMatrixAndSpatialStatistics/.project
new file mode 100644
index 0000000..4183b49
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>proxMatrixAndSpatialStatistics</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/proxMatrixAndSpatialStatistics/Makefile b/examples/proxMatrixAndSpatialStatistics/Makefile
new file mode 100644
index 0000000..5a09343
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/Makefile
@@ -0,0 +1,23 @@
+all: proxMatrixAndSpatialStatistics
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+proxMatrixAndSpatialStatistics: shapelib tiff terralib stat
+	qmake -o makeProxMatrixAndSpatialStatistics proxMatrixAndSpatialStatistics.pro; make -f makeProxMatrixAndSpatialStatistics
+
+clean:
+	if \
+		test -f makeProxMatrixAndSpatialStatistics; \
+	then \
+		make -f makeProxMatrixAndSpatialStatistics distclean; rm -f makeProxMatrixAndSpatialStatistics; \
+	fi
\ No newline at end of file
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.cpp b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.cpp
new file mode 100644
index 0000000..b0e5169
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.cpp
@@ -0,0 +1,164 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+   This file illustrates an example of how to create a proximity matrix from a 
+   Spatial Temporal Element Set (STElementSet) and calculate spatial statistics.  
+   In this example, the adjacency strategy is used to construct the matrix.   
+
+   Author: Karine Reis   
+*/
+
+#include <TeSTElementSet.h>
+#include <TeSTEFunctionsDB.h>
+#include <TeInitQuerierStrategy.h>
+#include <TeGeneralizedProxMatrix.h>
+#include <TeSpatialStatistics.h>
+#include <TeMySQL.h>
+
+int main()
+{	
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "Terralib";
+	string user = "root";
+	string password = "ferreira";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+		
+	
+	// Opens a connection to a TerraLib database 
+    // Loads a layer named DistritosSP 
+	TeLayer* DistritosSP =  new TeLayer("DistritosSP");
+	if (!db->loadLayer(DistritosSP))
+	{
+	    cout << "Fail to load the layer!" << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+
+	// Inits querier strategies
+	TeInitQuerierStrategies();
+
+	// Creates a STElementSet from DistritosSP layer 
+	TeSTElementSet steSet(DistritosSP);
+
+	// Fills the STElementSet only with the attribute "Populac" to calculate statistics 
+	//and without geometries
+	vector<string> attrs;
+	attrs.push_back ("DistritosSP.Populac");
+
+	if(!TeSTOSetBuildDB(&steSet, false, false, attrs))
+	{
+		cout << "Error! " << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	
+	// Shows how many elements the elementSet has
+	cout << "Number of elements: " <<  steSet.numElements() << endl;
+
+	// Constructs the proximity matrix
+	TeGeneralizedProxMatrix				proxMat;
+	
+	TeProxMatrixLocalAdjacencyStrategy		sc_adj (&steSet, TePOLYGONS);
+	TeProxMatrixNoWeightsStrategy			sw_no;
+	TeProxMatrixNoSlicingStrategy			ss_no;
+	
+	proxMat.setCurrentSlicingStrategy(&ss_no);
+	proxMat.setCurrentWeightsStrategy(&sw_no);
+	proxMat.setCurrentConstructionStrategy(&sc_adj);
+
+	if(!proxMat.ConstructMatrix())
+	{
+		cout << "Error building proximity matrix! " << endl;
+		return 1;
+	}
+
+	// Calculates the global mean
+	double mean = TeFirstMoment (steSet.begin(), steSet.end(), 0); 
+	cout << "Global mean " << mean << endl << endl;
+
+	// Calculates the desviations (Z) to each object and keeps them
+	// in the STElementSet
+	if(!TeDeviation (steSet.begin(), steSet.end(), mean))
+	{
+		cout << "Error calculating Z! " << endl;
+		return 1;
+	}   
+	
+	// Index of the Z (desviations) attribute in the STElementSet
+	int indexZ = 1;  
+
+	// Calculates the local mean (WZ) to each object and keeps them
+	// in the STElementSet
+	if(!TeLocalMean (&steSet, &proxMat, indexZ))
+	{
+		cout << "Error calculating Local Mean! " << endl;
+		return 1;
+	}
+
+	// Index of the WZ (local mean) attribute in the STElementSet
+	int indexWZ = 2;
+
+	// Shows the Z and WZ generated for each object
+	TeSTElementSet::iterator it = steSet.begin();
+	while ( it != steSet.end())
+	{
+		TeSTInstance obj = (*it);
+		
+      //Gets attribute value
+		string valZ, valWZ;
+		obj.getPropertyValue(valZ, indexZ);
+		obj.getPropertyValue(valWZ, indexWZ);
+		cout << " Object Identifier :  " << obj.objectId() << endl; 
+		cout << " Z		:  " << valZ   << endl; 
+		cout << " WZ	:  " << valWZ  << endl << endl; 
+		++it;
+	}
+
+	// Inserts the generated attributes (Z and WZ) in the DistritosSP 
+	// table 
+	if(!TeUpdateDBFromSet (&steSet, "DistritosSP"))
+	{
+		cout << "Error updating database! " << endl;
+		return 1;
+	}
+	
+	db->close();
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsp b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsp
new file mode 100644
index 0000000..890aab9
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsp
@@ -0,0 +1,122 @@
+# Microsoft Developer Studio Project File - Name="proxMatrixAndSpatialStatistics" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=proxMatrixAndSpatialStatistics - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "proxMatrixAndSpatialStatistics.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "proxMatrixAndSpatialStatistics.mak" CFG="proxMatrixAndSpatialStatistics - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "proxMatrixAndSpatialStatistics - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "proxMatrixAndSpatialStatistics - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "proxMatrixAndSpatialStatistics - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "proxMatrixAndSpatialStatistics - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "proxMatrixAndSpatialStatistics - Win32 Release"
+# Name "proxMatrixAndSpatialStatistics - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\proxMatrixAndSpatialStatistics.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSpatialStatistics.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeSpatialStatistics.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsw b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsw
new file mode 100644
index 0000000..e828c1b
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "proxMatrixAndSpatialStatistics"=".\proxMatrixAndSpatialStatistics.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.pro b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.pro
new file mode 100644
index 0000000..4998f7f
--- /dev/null
+++ b/examples/proxMatrixAndSpatialStatistics/proxMatrixAndSpatialStatistics.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = proxMatrixAndSpatialStatistics
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	proxMatrixAndSpatialStatistics.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierFromLayer/.cdtproject b/examples/querierFromLayer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierFromLayer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierFromLayer/.project b/examples/querierFromLayer/.project
new file mode 100644
index 0000000..627ab9e
--- /dev/null
+++ b/examples/querierFromLayer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierFromLayer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierFromLayer/Makefile b/examples/querierFromLayer/Makefile
new file mode 100644
index 0000000..e129ab1
--- /dev/null
+++ b/examples/querierFromLayer/Makefile
@@ -0,0 +1,23 @@
+all: querierFromLayer
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierFromLayer: shapelib tiff terralib stat
+	qmake -o makeQuerierFromLayer querierFromLayer.pro; make -f makeQuerierFromLayer
+
+clean:
+	if \
+		test -f makeQuerierFromLayer; \
+	then \
+		make -f makeQuerierFromLayer distclean; rm -f makeQuerierFromLayer; \
+	fi
\ No newline at end of file
diff --git a/examples/querierFromLayer/querierFromLayer.cpp b/examples/querierFromLayer/querierFromLayer.cpp
new file mode 100644
index 0000000..5916836
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.cpp
@@ -0,0 +1,117 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This example shows how to use a querier from layer.
+   
+   Author: Karine Reis 
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+     string host = "localhost";
+     string dbname = "terralib";
+     string user = "root";
+     string pass = "ferreira";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,pass,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the layer 
+	TeLayer* ocorrencias = new TeLayer("OcorrenciasPoA");
+	if (!db_->loadLayer(ocorrencias))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	bool loadAllAttributes = true;
+	bool loadGeometries = false;
+
+	// Init querier strategies
+	TeInitQuerierStrategies();
+
+	// Set querier parameters - load all attributes and no geometries of the layer "armadilhas"
+	TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
+	querierParams.setParams(ocorrencias);
+
+	TeQuerier  querier(querierParams);
+
+	// Load instances from layer based in the querier parameters 
+	querier.loadInstances(); 
+
+	// Return a list of the loaded attributes  
+	TeAttributeList attrList = querier.getAttrList(); 
+	
+	cout << " Loaded Attributes  -------------------  " << endl;
+	
+	// Plot the attribute names 
+	for(unsigned int i=0; i<attrList.size(); ++i)
+		cout << attrList[i].rep_.name_ << endl; 
+	
+	cout << endl;
+	
+	// Traverse all the instances 
+	TeSTInstance sti;
+	while(querier.fetchInstance(sti))
+	{
+		cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+	
+		// Plot each attribute, its name and value
+		TePropertyVector vec = sti.getPropertyVector();
+		for(unsigned int i=0; i<vec.size(); ++i)
+		{
+			string  attrName = vec[i].attr_.rep_.name_;
+			string  attrValue = vec[i].value_;
+			cout << attrName  << " : " << attrValue << endl;
+
+		}
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierFromLayer/querierFromLayer.dsp b/examples/querierFromLayer/querierFromLayer.dsp
new file mode 100644
index 0000000..c5a4cbf
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierFromLayer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierFromLayer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierFromLayer.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierFromLayer.mak" CFG="querierFromLayer - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierFromLayer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierFromLayer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierFromLayer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierFromLayer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierFromLayer - Win32 Release"
+# Name "querierFromLayer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierFromLayer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierFromLayer/querierFromLayer.dsw b/examples/querierFromLayer/querierFromLayer.dsw
new file mode 100644
index 0000000..cd9ca09
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierFromLayer"=".\querierFromLayer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierFromLayer/querierFromLayer.pro b/examples/querierFromLayer/querierFromLayer.pro
new file mode 100644
index 0000000..34282ef
--- /dev/null
+++ b/examples/querierFromLayer/querierFromLayer.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierFromLayer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierFromLayer.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierFromTheme/.cdtproject b/examples/querierFromTheme/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierFromTheme/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierFromTheme/.project b/examples/querierFromTheme/.project
new file mode 100644
index 0000000..a018667
--- /dev/null
+++ b/examples/querierFromTheme/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierFromTheme</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierFromTheme/Makefile b/examples/querierFromTheme/Makefile
new file mode 100644
index 0000000..275b031
--- /dev/null
+++ b/examples/querierFromTheme/Makefile
@@ -0,0 +1,23 @@
+all: querierFromTheme
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierFromTheme: shapelib tiff terralib stat
+	qmake -o makeQuerierFromTheme querierFromTheme.pro; make -f makeQuerierFromTheme
+
+clean:
+	if \
+		test -f makeQuerierFromTheme; \
+	then \
+		make -f makeQuerierFromTheme distclean; rm -f makeQuerierFromTheme; \
+	fi
\ No newline at end of file
diff --git a/examples/querierFromTheme/querierFromTheme.cpp b/examples/querierFromTheme/querierFromTheme.cpp
new file mode 100644
index 0000000..924e8b6
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.cpp
@@ -0,0 +1,137 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This example shows how to use a querier from theme.
+   
+   Author: Karine Reis 
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste303";
+	string user = "";
+	string password = "";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,password,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the layer 
+	TeTheme* bairros = new TeTheme("T_dist");
+	if (!db_->loadTheme(bairros))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	//Init querier strategies
+	TeInitQuerierStrategies();
+
+	//All attributes and geometries
+	bool loadGeometries = true;
+	bool loadAllAttributes = true;
+	
+	// Set querier parameters - load all attributes and geometries 
+	TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
+	querierParams.setParams(bairros);
+
+	TeQuerier  querier(querierParams);
+
+	// Load instances from layer based in the querier parameters 
+	querier.loadInstances();
+
+	// Traverse all the instances 
+	TeSTInstance sti;
+	while(querier.fetchInstance(sti))
+	{
+		cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+	
+		// Plot each attribute, its name and value
+		TePropertyVector vec = sti.getPropertyVector();
+		for(unsigned int i=0; i<vec.size(); ++i)
+		{
+			string  attrName = vec[i].attr_.rep_.name_;
+			string  attrValue = vec[i].value_;
+
+			cout << attrName  << " : " << attrValue << endl;
+
+		}
+
+		//Get geometries
+		if(sti.hasPolygons())
+		{
+			TePolygonSet polSet;
+			sti.getGeometry(polSet);
+
+			for(unsigned int i=0; i<polSet.size(); ++i)
+			{
+				TeCoord2D centroid = TeFindCentroid(polSet[i]);
+				string p = "( "+ Te2String(centroid.x()) +", "+  Te2String(centroid.y()) +")"; 
+				cout << " Centroid of the Polygon : " << p << endl; 
+			}
+		}
+
+		if(sti.hasPoints())
+		{
+			TePointSet ponSet;
+			sti.getGeometry(ponSet);
+
+			for(unsigned int i=0; i<ponSet.size(); ++i)
+			{
+				string p = "( "+ Te2String(ponSet[i].location().x()) +", "+  Te2String(ponSet[i].location().y()) +")"; 
+				cout << " Point : " << p << endl; 
+			}
+		}
+
+		cout << endl << endl;
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	delete(bairros);
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierFromTheme/querierFromTheme.dsp b/examples/querierFromTheme/querierFromTheme.dsp
new file mode 100644
index 0000000..2e9348c
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierFromTheme" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierFromTheme - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierFromTheme.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierFromTheme.mak" CFG="querierFromTheme - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierFromTheme - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierFromTheme - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierFromTheme - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierFromTheme - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierFromTheme - Win32 Release"
+# Name "querierFromTheme - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierFromTheme.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierFromTheme/querierFromTheme.dsw b/examples/querierFromTheme/querierFromTheme.dsw
new file mode 100644
index 0000000..2de6ba7
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierFromTheme"=".\querierFromTheme.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierFromTheme/querierFromTheme.pro b/examples/querierFromTheme/querierFromTheme.pro
new file mode 100644
index 0000000..9e0e2f9
--- /dev/null
+++ b/examples/querierFromTheme/querierFromTheme.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierFromTheme
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierFromTheme.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierGroupChronon/.cdtproject b/examples/querierGroupChronon/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierGroupChronon/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierGroupChronon/.project b/examples/querierGroupChronon/.project
new file mode 100644
index 0000000..046d95b
--- /dev/null
+++ b/examples/querierGroupChronon/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierGroupChronon</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierGroupChronon/Makefile b/examples/querierGroupChronon/Makefile
new file mode 100644
index 0000000..1f0a32c
--- /dev/null
+++ b/examples/querierGroupChronon/Makefile
@@ -0,0 +1,23 @@
+all: querierGroupChronon
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierGroupChronon: shapelib tiff terralib stat
+	qmake -o makeQuerierGroupChronon querierGroupChronon.pro; make -f makeQuerierGroupChronon
+
+clean:
+	if \
+		test -f makeQuerierGroupChronon; \
+	then \
+		make -f makeQuerierGroupChronon distclean; rm -f makeQuerierGroupChronon; \
+	fi
\ No newline at end of file
diff --git a/examples/querierGroupChronon/querierGroupChronon.cpp b/examples/querierGroupChronon/querierGroupChronon.cpp
new file mode 100644
index 0000000..4b704a2
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.cpp
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This example shows how to use a querier from theme, grouping  
+   spatiotemporal instances by a chronon. 
+   	  
+   Author: Karine Reis 
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+     string host = "localhost";
+     string dbname = "saudavel";
+     string user = "root";
+     string pass = "karine";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,pass,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the layer 
+	TeTheme* coletas = new TeTheme("Coletas");
+	if (!db_->loadTheme(coletas))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	//Init querier strategies
+	TeInitQuerierStrategies();
+
+	//Attributes to group 
+	bool loadGeometries = false;
+	TeGroupingAttr attributes;
+	
+	pair<TeAttributeRep, TeStatisticType> attr1(TeAttributeRep("Coletas.NRO_OVOS_PAL1"), TeSUM);
+	attributes.insert(attr1);
+
+	pair<TeAttributeRep, TeStatisticType> attr2(TeAttributeRep("Coletas.NRO_OVOS_PAL2"), TeSUM);
+	attributes.insert(attr2);
+
+	pair<TeAttributeRep, TeStatisticType> attr3(TeAttributeRep("Coletas.NRO_OVOS_PAL3"), TeSUM);
+	attributes.insert(attr3);
+
+	pair<TeAttributeRep, TeStatisticType> attr4(TeAttributeRep("Coletas.NRO_OVOS"), TeSUM);
+	attributes.insert(attr4);
+
+	// Set querier parameters - load only the grouped attributes 
+	TeQuerierParams querierParams(loadGeometries, attributes);
+	querierParams.setParams(coletas, TeMONTH);
+
+	TeQuerier  querier(querierParams);
+
+	// number of time frames generated by chronon TeMONTH
+	int numTimeFrames = querier.getNumTimeFrames();
+	
+	// Load instances from theme for each time frame or month 
+	for(int frame=0; frame < numTimeFrames; ++frame)
+	{
+		TeTSEntry ts;
+		querier.getTSEntry(ts, frame);
+		
+		cout << " Time frame: " << Te2String(frame) << " --------------------------- " << endl << endl;
+
+		string initialDate = ts.time_.getInitialDateTime("DDsMMsYYYY"); 
+		string finalDate = ts.time_.getFinalDateTime("DDsMMsYYYY");
+		
+		cout << " Time Interval: " << initialDate << " to " << finalDate << endl << endl;
+
+		
+		if(!querier.loadInstances(frame))
+			continue;
+
+		// Traverse all the elements 
+		TeSTInstance sti;
+		while(querier.fetchInstance(sti))
+		{
+			cout << " Object: " << sti.objectId() << endl;
+			
+			// Plot each attribute, its name and value
+			TePropertyVector vec = sti.getPropertyVector();
+			for(unsigned int i=0; i<vec.size(); ++i)
+			{
+				string  attrName = vec[i].attr_.rep_.name_;
+				string  attrValue = vec[i].value_;
+
+				cout << attrName  << " : " << attrValue << endl;
+
+			}
+		}
+
+		cout << endl << endl;
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierGroupChronon/querierGroupChronon.dsp b/examples/querierGroupChronon/querierGroupChronon.dsp
new file mode 100644
index 0000000..1feb58e
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierGroupChronon" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierGroupChronon - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierGroupChronon.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierGroupChronon.mak" CFG="querierGroupChronon - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierGroupChronon - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierGroupChronon - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierGroupChronon - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierGroupChronon - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierGroupChronon - Win32 Release"
+# Name "querierGroupChronon - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierGroupChronon.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierGroupChronon/querierGroupChronon.dsw b/examples/querierGroupChronon/querierGroupChronon.dsw
new file mode 100644
index 0000000..78bd97e
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierGroupChronon"=".\querierGroupChronon.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierGroupChronon/querierGroupChronon.pro b/examples/querierGroupChronon/querierGroupChronon.pro
new file mode 100644
index 0000000..f56820c
--- /dev/null
+++ b/examples/querierGroupChronon/querierGroupChronon.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierGroupChronon
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierGroupChronon.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierGroupElement/.cdtproject b/examples/querierGroupElement/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierGroupElement/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierGroupElement/.project b/examples/querierGroupElement/.project
new file mode 100644
index 0000000..5478a17
--- /dev/null
+++ b/examples/querierGroupElement/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierGroupElement</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierGroupElement/Makefile b/examples/querierGroupElement/Makefile
new file mode 100644
index 0000000..008922d
--- /dev/null
+++ b/examples/querierGroupElement/Makefile
@@ -0,0 +1,23 @@
+all: querierGroupElement
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierGroupElement: shapelib tiff terralib stat
+	qmake -o makeQuerierGroupElement querierGroupElement.pro; make -f makeQuerierGroupElement
+
+clean:
+	if \
+		test -f makeQuerierGroupElement; \
+	then \
+		make -f makeQuerierGroupElement distclean; rm -f makeQuerierGroupElement; \
+	fi
\ No newline at end of file
diff --git a/examples/querierGroupElement/querierGroupElement.cpp b/examples/querierGroupElement/querierGroupElement.cpp
new file mode 100644
index 0000000..ccbfda9
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.cpp
@@ -0,0 +1,123 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This example shows how to use a querier from theme, grouping  
+   spatiotemporal instances by a element. 
+   
+   Author: Karine Reis 
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+     string host = "localhost";
+     string dbname = "saudavel";
+     string user = "root";
+     string pass = "karine";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,pass,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the layer 
+	TeTheme* coletas = new TeTheme("Coletas");
+	if (!db_->loadTheme(coletas))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	//Init querier strategies
+	TeInitQuerierStrategies();
+
+	//Attributes to group 
+	bool loadGeometries = false;
+	TeGroupingAttr attributes;
+	
+	pair<TeAttributeRep, TeStatisticType> attr1(TeAttributeRep("Coletas.NRO_OVOS_PAL1"), TeSUM);
+	attributes.insert(attr1);
+
+	pair<TeAttributeRep, TeStatisticType> attr2(TeAttributeRep("Coletas.NRO_OVOS_PAL2"), TeSUM);
+	attributes.insert(attr2);
+
+	pair<TeAttributeRep, TeStatisticType> attr3(TeAttributeRep("Coletas.NRO_OVOS_PAL3"), TeSUM);
+	attributes.insert(attr3);
+
+	pair<TeAttributeRep, TeStatisticType> attr4(TeAttributeRep("Coletas.NRO_OVOS"), TeSUM);
+	attributes.insert(attr4);
+
+	// Set querier parameters - load only the grouped attributes 
+	TeQuerierParams querierParams(loadGeometries, attributes);
+	querierParams.setParams(coletas);
+
+	TeQuerier  querier(querierParams);
+
+	// Load instances from layer based in the querier parameters 
+	querier.loadInstances();
+
+	// Traverse all the instances 
+	TeSTInstance sti;
+	while(querier.fetchInstance(sti))
+	{
+		cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+	
+		// Plot each attribute, its name and value
+		TePropertyVector vec = sti.getPropertyVector();
+		for(unsigned int i=0; i<vec.size(); ++i)
+		{
+			string  attrName = vec[i].attr_.rep_.name_;
+			string  attrValue = vec[i].value_;
+
+			cout << attrName  << " : " << attrValue << endl;
+
+		}
+
+		cout << endl << endl;
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierGroupElement/querierGroupElement.dsp b/examples/querierGroupElement/querierGroupElement.dsp
new file mode 100644
index 0000000..20a6e20
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierGroupElement" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierGroupElement - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierGroupElement.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierGroupElement.mak" CFG="querierGroupElement - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierGroupElement - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierGroupElement - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierGroupElement - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierGroupElement - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierGroupElement - Win32 Release"
+# Name "querierGroupElement - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierGroupElement.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierGroupElement/querierGroupElement.dsw b/examples/querierGroupElement/querierGroupElement.dsw
new file mode 100644
index 0000000..7fdcd89
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierGroupElement"=".\querierGroupElement.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierGroupElement/querierGroupElement.pro b/examples/querierGroupElement/querierGroupElement.pro
new file mode 100644
index 0000000..506fbee
--- /dev/null
+++ b/examples/querierGroupElement/querierGroupElement.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierGroupElement
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierGroupElement.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierGroupSpatialRest/.cdtproject b/examples/querierGroupSpatialRest/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierGroupSpatialRest/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierGroupSpatialRest/.project b/examples/querierGroupSpatialRest/.project
new file mode 100644
index 0000000..b84c70f
--- /dev/null
+++ b/examples/querierGroupSpatialRest/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierGroupSpatialRest</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierGroupSpatialRest/Makefile b/examples/querierGroupSpatialRest/Makefile
new file mode 100644
index 0000000..dc7e981
--- /dev/null
+++ b/examples/querierGroupSpatialRest/Makefile
@@ -0,0 +1,23 @@
+all: querierGroupSpatialRest
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierGroupSpatialRest: shapelib tiff terralib stat
+	qmake -o makeQuerierGroupSpatialRest querierGroupSpatialRest.pro; make -f makeQuerierGroupSpatialRest
+
+clean:
+	if \
+		test -f makeQuerierGroupSpatialRest; \
+	then \
+		make -f makeQuerierGroupSpatialRest distclean; rm -f makeQuerierGroupSpatialRest; \
+	fi
\ No newline at end of file
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.cpp b/examples/querierGroupSpatialRest/querierGroupSpatialRest.cpp
new file mode 100644
index 0000000..be7988f
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.cpp
@@ -0,0 +1,163 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This example shows how to use a querier from theme, grouping all  
+   spatiotemporal instances that satisfy a spatial restriction. 
+   
+   Author: Karine Reis 
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+     string host = "localhost";
+     string dbname = "saudavel";
+     string user = "root";
+     string pass = "karine";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,pass,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the themes 
+	TeTheme* coletas = new TeTheme("Coletas");
+	if (!db_->loadTheme(coletas))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+
+	TeTheme* bairros = new TeTheme("ibge_bairro");  
+	if (!db_->loadTheme(bairros))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	//Init querier strategies
+	TeInitQuerierStrategies();
+
+	//statistics from coletas
+	TeGroupingAttr attributes;
+	
+	pair<TeAttributeRep, TeStatisticType> attr1(TeAttributeRep("Coletas.NRO_OVOS_PAL1"), TeSUM);
+	attributes.insert(attr1);
+
+	pair<TeAttributeRep, TeStatisticType> attr2(TeAttributeRep("Coletas.NRO_OVOS_PAL2"), TeSUM);
+	attributes.insert(attr2);
+
+	pair<TeAttributeRep, TeStatisticType> attr3(TeAttributeRep("Coletas.NRO_OVOS_PAL3"), TeSUM);
+	attributes.insert(attr3);
+
+	pair<TeAttributeRep, TeStatisticType> attr4(TeAttributeRep("Coletas.NRO_OVOS"), TeSUM);
+	attributes.insert(attr4);
+
+	
+	// ------------ querier to theme "bairros"
+	bool loadGeometries = true;
+	vector<string> attrs;
+	attrs.push_back ("BAIRRO2000_REC.NOME");
+
+	TeQuerierParams querParamsBair(loadGeometries, attrs);
+	querParamsBair.setParams(bairros);
+	
+	TeQuerier  querBairros(querParamsBair); 
+
+	if(!querBairros.loadInstances())
+	{
+		cout << " No data!!! " << endl; 
+		return 1;
+	}
+
+	//Load each element and pass as spatial restriction
+	TeSTInstance bairro;
+	while(querBairros.fetchInstance (bairro))
+	{
+		string name;
+		bairro.getPropertyValue(name, 0);
+
+		cout << " Bairro: " << name << endl;
+		
+		TePolygonSet setP;
+		if(!bairro.getGeometry (setP))  //get the polygon
+			continue;
+
+		// ------------ querier to theme coletas
+		loadGeometries = false;
+
+		TeQuerierParams querParamsCol(loadGeometries, attributes);
+		querParamsCol.setParams(coletas);
+		
+		//spatial restriction
+		querParamsCol.setSpatialRest(&setP);
+
+		TeQuerier  querColetas(querParamsCol);
+		
+		if(!querColetas.loadInstances())
+		{
+			cout << " No data!!! " << endl; 
+			continue;
+		}
+
+		TeSTInstance coleta;
+		while(querColetas.fetchInstance(coleta)) 
+		{
+			// Plot each attribute, its name and value
+			TePropertyVector vec = coleta.getPropertyVector();
+			for(unsigned int i=0; i<vec.size(); ++i)
+			{
+				string  attrName = vec[i].attr_.rep_.name_;
+				string  attrValue = vec[i].value_;
+
+				cout << attrName  << " : " << attrValue << endl;
+			}
+		}
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsp b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsp
new file mode 100644
index 0000000..ce71950
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierGroupSpatialRest" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierGroupSpatialRest - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierGroupSpatialRest.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierGroupSpatialRest.mak" CFG="querierGroupSpatialRest - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierGroupSpatialRest - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierGroupSpatialRest - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierGroupSpatialRest - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierGroupSpatialRest - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierGroupSpatialRest - Win32 Release"
+# Name "querierGroupSpatialRest - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierGroupSpatialRest.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsw b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsw
new file mode 100644
index 0000000..6047b28
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierGroupSpatialRest"=".\querierGroupSpatialRest.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierGroupSpatialRest/querierGroupSpatialRest.pro b/examples/querierGroupSpatialRest/querierGroupSpatialRest.pro
new file mode 100644
index 0000000..751896f
--- /dev/null
+++ b/examples/querierGroupSpatialRest/querierGroupSpatialRest.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierGroupSpatialRest
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierGroupSpatialRest.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierWithSpatialRestBox/.cdtproject b/examples/querierWithSpatialRestBox/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierWithSpatialRestBox/.project b/examples/querierWithSpatialRestBox/.project
new file mode 100644
index 0000000..94f291d
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierWithSpatialRestBox</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierWithSpatialRestBox/Makefile b/examples/querierWithSpatialRestBox/Makefile
new file mode 100644
index 0000000..d8f0d73
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/Makefile
@@ -0,0 +1,23 @@
+all: querierWithSpatialRestBox
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierWithSpatialRestBox: shapelib tiff terralib stat
+	qmake -o makeQuerierWithSpatialRestBox querierWithSpatialRestBox.pro; make -f makeQuerierWithSpatialRestBox
+
+clean:
+	if \
+		test -f makeQuerierWithSpatialRestBox; \
+	then \
+		make -f makeQuerierWithSpatialRestBox distclean; rm -f makeQuerierWithSpatialRestBox; \
+	fi
\ No newline at end of file
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.cpp b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.cpp
new file mode 100644
index 0000000..57bac6d
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.cpp
@@ -0,0 +1,117 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+    This example shows how to use a querier from theme, using a spatial restriction 
+	defined by a rectangle (TeBOX). This spatial restriction is associated to querier. 
+   
+   Author: Karine Reis 
+*/
+
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+     string host = "localhost";
+     string dbname = "saudavel";
+     string user = "root";
+     string pass = "karine";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,pass,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the theme 
+	TeTheme* armadilhas = new TeTheme("Armadilhas");
+	if (!db_->loadTheme(armadilhas))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	//Init querier strategies
+	TeInitQuerierStrategies();
+
+	//All attributes and geometries
+	bool loadGeometries = false;
+	bool loadAllAttributes = true;
+	
+	// Set querier parameters - load all attributes and geometries 
+	TeQuerierParams querierParams(loadGeometries, loadAllAttributes);
+	querierParams.setParams(armadilhas);
+
+	//Set spatial restriction
+	TeBox box(291174.0, 9104633.0, 294304.0, 9107663.0); 
+	querierParams.setSpatialRest(box, TeWITHIN); 		
+	
+	TeQuerier  querier(querierParams);
+
+	// Load instances from layer based in the querier parameters 
+	querier.loadInstances();
+
+	// Traverse all the instances 
+	TeSTInstance sti;
+	while(querier.fetchInstance(sti))
+	{
+		cout << " Object: " << sti.objectId() << " --------------------------- " << endl << endl;
+	
+		// Plot each attribute, its name and value
+		TePropertyVector vec = sti.getPropertyVector();
+		for(unsigned int i=0; i<vec.size(); ++i)
+		{
+			string  attrName = vec[i].attr_.rep_.name_;
+			string  attrValue = vec[i].value_;
+
+			cout << attrName  << " : " << attrValue << endl;
+
+		}
+		
+		cout << endl << endl;
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	delete(armadilhas);
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsp b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsp
new file mode 100644
index 0000000..bf96a85
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierWithSpatialRestBox" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierWithSpatialRestBox - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierWithSpatialRestBox.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierWithSpatialRestBox.mak" CFG="querierWithSpatialRestBox - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierWithSpatialRestBox - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierWithSpatialRestBox - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierWithSpatialRestBox - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierWithSpatialRestBox - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierWithSpatialRestBox - Win32 Release"
+# Name "querierWithSpatialRestBox - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierWithSpatialRestBox.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsw b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsw
new file mode 100644
index 0000000..c3aa45e
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierWithSpatialRestBox"=".\querierWithSpatialRestBox.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.pro b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.pro
new file mode 100644
index 0000000..8a9d1ed
--- /dev/null
+++ b/examples/querierWithSpatialRestBox/querierWithSpatialRestBox.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierWithSpatialRestBox
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierWithSpatialRestBox.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/querierWithSpatialRestGeometry/.cdtproject b/examples/querierWithSpatialRestGeometry/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/querierWithSpatialRestGeometry/.project b/examples/querierWithSpatialRestGeometry/.project
new file mode 100644
index 0000000..9380ec7
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>querierWithSpatialRestGeometry</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/querierWithSpatialRestGeometry/Makefile b/examples/querierWithSpatialRestGeometry/Makefile
new file mode 100644
index 0000000..3f334c2
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/Makefile
@@ -0,0 +1,23 @@
+all: querierWithSpatialRestGeometry
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+querierWithSpatialRestGeometry: shapelib tiff terralib stat
+	qmake -o makeQuerierWithSpatialRestGeometry querierWithSpatialRestGeometry.pro; make -f makeQuerierWithSpatialRestGeometry
+
+clean:
+	if \
+		test -f makeQuerierWithSpatialRestGeometry; \
+	then \
+		make -f makeQuerierWithSpatialRestGeometry distclean; rm -f makeQuerierWithSpatialRestGeometry; \
+	fi
\ No newline at end of file
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.cpp b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.cpp
new file mode 100644
index 0000000..17afae9
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.cpp
@@ -0,0 +1,152 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/* 
+   This example shows how to use a querier from theme, using a spatial restriction 
+	defined by a geometry (polygons, lines, cells and points) from another theme. 
+	This spatial restriction is associated to querier. 
+   
+   Author: Karine Reis 
+*/
+
+#include "TeMySQL.h"
+#include "TeQuerier.h"
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierParams.h"
+
+#include <time.h>
+#include <iostream>
+
+using std::cout;
+
+int 
+main()
+{	
+	
+	// Datatabase server parameters
+     string host = "localhost";
+     string dbname = "saudavel";
+     string user = "root";
+     string pass = "karine";
+
+	 // Connects to database
+     TeDatabase* db_ = new TeMySQL();
+     if (!db_->connect(host,user,pass,dbname))
+     {
+         cout << "Error: " << db_->errorMessage() << endl;
+         return 1;
+     }
+
+	// Load the themes 
+	TeTheme* coletas = new TeTheme("Coletas");
+	if (!db_->loadTheme(coletas))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+
+	TeTheme* bairros = new TeTheme("ibge_bairro");  
+	if (!db_->loadTheme(bairros))
+    {
+        cout << "Error: " << db_->errorMessage() << endl; 
+		db_->close(); 
+        return 1;
+    }
+		
+	//Init querier strategies
+	TeInitQuerierStrategies();
+
+		
+	// ------------ querier to theme "bairros"
+	bool loadGeometries = true;
+	vector<string> attrs;
+	attrs.push_back ("BAIRRO2000_REC.NOME");
+
+	TeQuerierParams querParamsBair(loadGeometries, attrs);
+	querParamsBair.setParams(bairros);
+	
+	TeQuerier  querBairros(querParamsBair); 
+
+	if(!querBairros.loadInstances())
+	{
+		cout << " No data!!! " << endl; 
+		return 1;
+	}
+
+	//Load each element and pass to querier as spatial restriction
+	TeSTInstance bairro;
+	while(querBairros.fetchInstance (bairro))
+	{
+		string name;
+		bairro.getPropertyValue(name, 0);
+
+		cout << " Bairro: " << name << endl;
+		
+		TePolygonSet setP;
+		
+		if(!bairro.getGeometry (setP))  //get the polygon set
+			continue;
+
+		// ------------ querier to theme coletas
+		loadGeometries = false;
+		vector<string> attributes;
+		attributes.push_back ("COLETAS.COD_ARMADILHA");
+
+		TeQuerierParams querParamsCol(loadGeometries, attributes);
+		querParamsCol.setParams(coletas);
+		
+		//spatial restriction
+		querParamsCol.setSpatialRest(&setP);
+
+		TeQuerier  querColetas(querParamsCol);
+		
+		if(!querColetas.loadInstances())
+		{
+			cout << " No data!!! " << endl; 
+			continue;
+		}
+
+		TeSTInstance coleta;
+		while(querColetas.fetchInstance(coleta)) 
+		{
+			// Plot each attribute, its name and value
+			TePropertyVector vec = coleta.getPropertyVector();
+			for(unsigned int i=0; i<vec.size(); ++i)
+			{
+				string  attrName = vec[i].attr_.rep_.name_;
+				string  attrValue = vec[i].value_;
+
+				cout << attrName  << " : " << attrValue << endl;
+			}
+		}
+	}
+
+	cout << " End " << endl;
+	getchar(); 
+	db_->close ();
+	return 0;
+}
+
+
+
+
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsp b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsp
new file mode 100644
index 0000000..a9f4f3a
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="querierWithSpatialRestGeometry" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=querierWithSpatialRestGeometry - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "querierWithSpatialRestGeometry.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "querierWithSpatialRestGeometry.mak" CFG="querierWithSpatialRestGeometry - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "querierWithSpatialRestGeometry - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "querierWithSpatialRestGeometry - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "querierWithSpatialRestGeometry - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "querierWithSpatialRestGeometry - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "querierWithSpatialRestGeometry - Win32 Release"
+# Name "querierWithSpatialRestGeometry - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\querierWithSpatialRestGeometry.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsw b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsw
new file mode 100644
index 0000000..e5d3234
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "querierWithSpatialRestGeometry"=".\querierWithSpatialRestGeometry.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.pro b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.pro
new file mode 100644
index 0000000..ff5fa95
--- /dev/null
+++ b/examples/querierWithSpatialRestGeometry/querierWithSpatialRestGeometry.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = querierWithSpatialRestGeometry
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	querierWithSpatialRestGeometry.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/rasterSlicing/.cdtproject b/examples/rasterSlicing/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/rasterSlicing/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/rasterSlicing/.project b/examples/rasterSlicing/.project
new file mode 100644
index 0000000..8961c75
--- /dev/null
+++ b/examples/rasterSlicing/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>rasterSlicing</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/rasterSlicing/Makefile b/examples/rasterSlicing/Makefile
new file mode 100644
index 0000000..7904703
--- /dev/null
+++ b/examples/rasterSlicing/Makefile
@@ -0,0 +1,23 @@
+all: rasterSlicing
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+rasterSlicing: shapelib tiff terralib stat
+	qmake -o makeRasterSlicing rasterSlicing.pro; make -f makeRasterSlicing
+
+clean:
+	if \
+		test -f makeRasterSlicing; \
+	then \
+		make -f makeRasterSlicing distclean; rm -f makeRasterSlicing; \
+	fi
\ No newline at end of file
diff --git a/examples/rasterSlicing/rasterSlicing.cpp b/examples/rasterSlicing/rasterSlicing.cpp
new file mode 100644
index 0000000..83020f8
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.cpp
@@ -0,0 +1,204 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to create a legend over a raster data,
+	stored in a layer TerraLib.
+
+	Author: Lubia Vinhas  
+*/
+
+#include "TeRaster.h"
+#include "TeInitRasterDecoders.h"
+#include "TeMySQL.h"
+
+int main()
+{
+	TeInitRasterDecoders();
+
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl << endl;
+		cout << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+
+	// Retrieve a layer with a raster representation
+	TeLayer* layer = new TeLayer("Elevation",db);
+	if (layer->id() < 1)
+	{
+		cout << "Cannot access layer Elevation " << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	// Create a new view with the same projection as the layer
+	TeView* view = new TeView("ViewElevation", user);
+	view->projection(layer->projection());
+	if (!db->insertView(view)) 
+	{
+		 cout << "Couldn�t insert view into the database: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+
+	// Create a new theme and a legend over it
+	TeTheme* rstTheme = new TeTheme("Elevation", layer);
+
+	rstTheme->visibleRep(TeRASTER | 0x40000000);	// make visible: the raster representation
+													// and the legend (0x4000000)
+	view->add(rstTheme);							// add theme to the view
+	if (!rstTheme->save())							// save theme definition to the database
+	{
+		 cout << "Error saving theme: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+
+	// Define red, green and blue components to build a 10 color pallete
+	short red[10] =   { 0, 45, 99, 160, 230, 232, 235, 237, 240, 242 };
+	short green[10] = { 166, 182, 198, 214, 230, 195, 178, 180, 201, 242 };
+	short blue[10]  = { 0, 0, 0, 0, 0, 46, 94, 142, 192, 242 };
+
+	// Define a slicing mode: 10 slices
+	TeGrouping* group1 = new TeGrouping();
+	group1->groupMode_ = TeRasterSlicing;
+	group1->groupNumSlices_ = 10;
+	group1->groupPrecision_ = 8;
+
+	
+	// Default way of slicing a raster representation: slices of equal size
+	if (!rstTheme->buildGrouping(group1)) 
+	{
+		 cout << "Error grouping theme: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+
+	// Assign to each slice one color of the pallete
+	int ng;
+	for (ng=0; ng<rstTheme->grouping()->groupNumSlices_; ng++)
+	{
+		TeColor color(red[ng],green[ng],blue[ng]);
+		TeVisual visual(TePOLYGONS);            
+		visual.color(color);
+		visual.transparency(rstTheme->defaultLegend().visual(TePOLYGONS).transparency());
+		visual.contourStyle(rstTheme->defaultLegend().visual(TePOLYGONS).contourStyle());
+		visual.contourWidth(rstTheme->defaultLegend().visual(TePOLYGONS).contourWidth());
+		visual.contourColor(rstTheme->defaultLegend().visual(TePOLYGONS).contourColor());	
+		rstTheme->setGroupingVisual(ng+1,visual,TePOLYGONS);
+	}
+
+	// Saves the theme legend to the database
+	if (!rstTheme->saveGrouping())
+	{
+		 cout << "Error saving theme slicing: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+	cout << "Created first theme...\n";
+	delete rstTheme;
+	
+	// Generates a new theme with slices arbitrarily defined
+	
+	rstTheme = new TeTheme("Elevation4Slices", layer);
+	rstTheme->visibleRep(TeRASTER | 0x40000000);	// make visible: the raster representation
+													// and the legend (0x4000000)
+	view->add(rstTheme);							// add theme to the view
+	if (!rstTheme->save())							// save theme definition to the database
+	{
+		 cout << "Error saving theme: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+
+	vector<TeSlice> mySlices;
+	TeSlice sl1("980","1000"); 
+	mySlices.push_back(sl1);
+	TeSlice sl2("1000","1020"); 
+	mySlices.push_back(sl2);
+	TeSlice sl3("1020","1100"); 
+	mySlices.push_back(sl3);
+	TeSlice sl4("1100","1200"); 
+	mySlices.push_back(sl4);
+	 
+	TeGrouping* group2 = new TeGrouping();
+	group2->groupMode_ = TeRasterSlicing;
+	group2->groupNumSlices_ = 4;
+	group2->groupPrecision_ = 8;
+
+	if (!rstTheme->buildGrouping(group2,mySlices)) 
+	{
+		 cout << "Error grouping theme: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+
+	for (ng=0; ng<rstTheme->grouping()->groupNumSlices_; ng++)
+	{
+		TeColor color(red[ng*2],green[ng*2],blue[ng*2]);
+		TeVisual visual(TePOLYGONS);            
+		visual.color(color);
+		visual.transparency(rstTheme->defaultLegend().visual(TePOLYGONS).transparency());
+		visual.contourStyle(rstTheme->defaultLegend().visual(TePOLYGONS).contourStyle());
+		visual.contourWidth(rstTheme->defaultLegend().visual(TePOLYGONS).contourWidth());
+		visual.contourColor(rstTheme->defaultLegend().visual(TePOLYGONS).contourColor());	
+		rstTheme->setGroupingVisual(ng+1,visual,TePOLYGONS);
+	}
+
+	if (!rstTheme->saveGrouping())
+	{
+		 cout << "Error saving theme slicing: " << db->errorMessage() << endl;
+		 db->close();
+		 cout << endl << "Press Enter\n";
+		 getchar();
+		 return 1;
+	}
+	
+	db->close();
+	cout << "Created second theme...\n";
+	cout << "Sucess. Press enter...\n";
+	getchar();
+	return 0;
+}
diff --git a/examples/rasterSlicing/rasterSlicing.dsp b/examples/rasterSlicing/rasterSlicing.dsp
new file mode 100644
index 0000000..e01f848
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="rasterSlicing" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=rasterSlicing - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "rasterSlicing.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "rasterSlicing.mak" CFG="rasterSlicing - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "rasterSlicing - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "rasterSlicing - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "rasterSlicing - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "rasterSlicing - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "rasterSlicing - Win32 Release"
+# Name "rasterSlicing - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\rasterSlicing.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/rasterSlicing/rasterSlicing.dsw b/examples/rasterSlicing/rasterSlicing.dsw
new file mode 100644
index 0000000..47b4320
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "rasterSlicing"=.\rasterSlicing.dsp - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/rasterSlicing/rasterSlicing.pro b/examples/rasterSlicing/rasterSlicing.pro
new file mode 100644
index 0000000..c099927
--- /dev/null
+++ b/examples/rasterSlicing/rasterSlicing.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = rasterSlicing
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	rasterSlicing.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/spatialQuery/.cdtproject b/examples/spatialQuery/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/spatialQuery/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/spatialQuery/.project b/examples/spatialQuery/.project
new file mode 100644
index 0000000..39aa224
--- /dev/null
+++ b/examples/spatialQuery/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>spatialQuery</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/spatialQuery/Makefile b/examples/spatialQuery/Makefile
new file mode 100644
index 0000000..ef42ba2
--- /dev/null
+++ b/examples/spatialQuery/Makefile
@@ -0,0 +1,23 @@
+all: spatialQuery
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+spatialQuery: shapelib tiff terralib stat
+	qmake -o makeSpatialQuery spatialQuery.pro; make -f makeSpatialQuery
+
+clean:
+	if \
+		test -f makeSpatialQuery; \
+	then \
+		make -f makeSpatialQuery distclean; rm -f makeSpatialQuery; \
+	fi
\ No newline at end of file
diff --git a/examples/spatialQuery/spatialQuery.cpp b/examples/spatialQuery/spatialQuery.cpp
new file mode 100644
index 0000000..2ee275b
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.cpp
@@ -0,0 +1,185 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file shows an example of how to use the database interface to do some
+	spatial queries involving objects with points, lines and polygon geometries.
+
+	Authors: 
+		Karine Reis Ferreira  
+		Lubia Vinhas
+*/
+
+#include <TeMySQL.h>
+#include <TeImportExport.h>
+
+
+
+int main()
+{
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+
+	// Check whether there is a layer of polygons called "states".
+	// In negative case, import it from the states.shp file
+	string layerName = "states";
+
+	TeDatum wgs84 = TeDatumFactory::make("WGS84");
+	TeLatLong* proj = new TeLatLong(wgs84);
+
+	if (db->layerExist(layerName) == false)
+	{
+		// Create a new layer in the database
+		TeLayer* layer = new TeLayer(layerName, db, proj);
+		string filename = "../data/states.shp";	// Shapefile path
+		string tablename = "States";	// Name of the attribute table
+
+		if (TeImportShape(layer, filename, tablename))
+			cout << "The shapefile \"states.shp\" was imported successfully into the TerraLib database!\n" << endl;
+		else
+			cout << "Error: Fail to import the shapefile \"rivers.shp\"!\n" << endl;
+	}	
+
+	// Check whether there is a layer of lines called "rivers".
+	// In negative case, import it from the states.shp file
+	layerName = "rivers";
+
+	if (db->layerExist(layerName) == false)
+	{
+		// Create a new layer in the database
+		TeLayer* layer = new TeLayer(layerName, db, proj);
+		string filename = "../data/rivers.shp";	// Shapefile path
+		string tablename = "Rivers";	// Name of the attribute table
+
+		if (TeImportShape(layer, filename, tablename))
+			cout << "The shapefile \"rivers.shp\" was imported successfully into the TerraLib database!\n" << endl;
+		else
+			cout << "Error: Fail to import the shapefile \"rivers.shp\"!\n" << endl;
+	}
+
+	// Check whether there is a layer of points called "cities".
+	// In negative case, import it from the states.shp file
+	layerName = "cities";
+
+	if (db->layerExist(layerName) == false)
+	{
+		// Create a new layer in the database
+		TeLayer* layer = new TeLayer(layerName, db, proj);
+		string filename = "../data/cities.shp";	// Shapefile path
+		string tablename = "Cities";	// Name of the attribute table
+
+		if (TeImportShape(layer, filename, tablename))
+			cout << "The shapefile \"cities.shp\" was imported successfully into the TerraLib database!\n" << endl;
+		else
+			cout << "Error: Fail to import the shapefile \"cities.shp\"!\n" << endl;
+	}
+
+	// Retrieve from the database a layer of polygons, a layer of lines and a layer of points
+    TeLayer* states = new TeLayer("states");		// states have polygons
+    if (!db->loadLayer(states))                
+    {                                                                                               
+        cout << "Fail to load layer \"states\": " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+    }
+
+    TeLayer* rivers = new TeLayer("rivers");	// rivers have lines
+    if (!db->loadLayer(rivers))                
+    {                                                                                               
+        cout << "Fail to load layer \"rivers\": " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+    }
+
+	TeLayer* cities = new TeLayer("cities");	// cities have points
+    if (!db->loadLayer(cities))                
+    {                                                                                               
+        cout << "Fail to load layer \"cities\": " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+    }
+
+	vector<string> objsOut;	// holds the identification of the resulting objects
+	
+	vector<string> objsIn;  // objects to be queried		
+	objsIn.push_back("23");
+
+	// Retrieve the states that touches state 23
+	bool res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,
+		                      objsOut, TeTOUCHES);
+	if (res)
+	{
+		cout << "States that touch state \"23\": \n";
+		unsigned int i;
+		for (i=0; i<objsOut.size(); i++)
+			cout << "State: " << objsOut[i] << endl;
+
+	}
+
+	// Retrieve the rivers that crosses state 23
+	res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,
+		                            rivers->tableName(TeLINES), TeLINES, objsOut, TeCROSSES);
+	if (res)
+	{
+		cout << "\nRivers that cross state \"23\": \n";
+		unsigned int i;
+		for (i=0; i<objsOut.size(); i++)
+			cout << "River: " << objsOut[i] << endl;
+	}
+
+	// Retrieve the cities that are within state 23
+	res = db->spatialRelation(states->tableName(TePOLYGONS), TePOLYGONS, objsIn,
+		                      cities->tableName(TePOINTS), TePOINTS, objsOut, TeWITHIN);
+	if (res)
+	{
+		cout << "\nCities that are within state \"23\": \n";
+		unsigned int i;
+		for (i=0; i<objsOut.size(); i++)
+			cout << "City: " << objsOut[i] << endl;
+
+	}
+
+	db->close();
+	cout << endl << "Press Enter\n";
+	cout.flush();
+	getchar();
+	return 0;
+}
+
diff --git a/examples/spatialQuery/spatialQuery.dsp b/examples/spatialQuery/spatialQuery.dsp
new file mode 100644
index 0000000..7d0b65a
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="spatialQuery" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=spatialQuery - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "spatialQuery.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "spatialQuery.mak" CFG="spatialQuery - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "spatialQuery - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spatialQuery - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "spatialQuery - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "spatialQuery - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "spatialQuery - Win32 Release"
+# Name "spatialQuery - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\spatialQuery.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportSHP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/spatialQuery/spatialQuery.dsw b/examples/spatialQuery/spatialQuery.dsw
new file mode 100644
index 0000000..a8c7731
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "spatialQuery"=".\spatialQuery.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/spatialQuery/spatialQuery.pro b/examples/spatialQuery/spatialQuery.pro
new file mode 100644
index 0000000..b99ec1c
--- /dev/null
+++ b/examples/spatialQuery/spatialQuery.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = spatialQuery
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	spatialQuery.cpp \
+	../src/terralib/functions/TeImportDBF.cpp \
+	../src/terralib/functions/TeImportSHP.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeImportExport.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/spatialQueryAndBuffer/.cdtproject b/examples/spatialQueryAndBuffer/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/spatialQueryAndBuffer/.project b/examples/spatialQueryAndBuffer/.project
new file mode 100644
index 0000000..3714cb2
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>spatialQueryAndBuffer</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/spatialQueryAndBuffer/Makefile b/examples/spatialQueryAndBuffer/Makefile
new file mode 100644
index 0000000..994aff0
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/Makefile
@@ -0,0 +1,23 @@
+all: spatialQueryAndBuffer
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+spatialQueryAndBuffer: shapelib tiff terralib stat
+	qmake -o makeSpatialQueryAndBuffer spatialQueryAndBuffer.pro; make -f makeSpatialQueryAndBuffer
+
+clean:
+	if \
+		test -f makeSpatialQueryAndBuffer; \
+	then \
+		make -f makeSpatialQueryAndBuffer distclean; rm -f makeSpatialQueryAndBuffer; \
+	fi
\ No newline at end of file
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.cpp b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.cpp
new file mode 100644
index 0000000..af0cdd4
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.cpp
@@ -0,0 +1,114 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+   This file shows an example of how to use the database interface to do some
+	spatial queries involving objects with points, lines and polygon geometries.
+
+  Esse exemplo requer que os arquivos BairrosPoa.shp e OcorrenciasPoA.shp tenham
+  sido importados. Usar o TerraView para importa-los.
+  Ambos os shapefiles est�o em proje��o UTM - Zona 22 , Datum SAD69
+
+   Author: Karine Reis   
+*/
+
+#include <TeMySQL.h>
+
+int main()
+{	
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste303";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+		
+	
+	// Retrieve from the database the layer "BairrosPoA"
+    TeLayer* bairros = new TeLayer("BairrosPoA");		
+    if (!db->loadLayer(bairros))                
+    {                                                                                               
+        cout << "Fail to load layer \"bairros\": " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+    }
+
+    // Retrieve from the database the layer "OcorrenciasPoA"
+	TeLayer* events = new TeLayer("OcorrenciasPoA");	
+    if (!db->loadLayer(events))                
+    {                                                                                               
+        cout << "Fail to load layer \"events\": " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+    }
+
+	TePrecision::instance().setPrecision(TeGetPrecision(bairros->projection()));
+
+	// holds the identification of the resulting objects
+	vector<string> objsOut;	
+	vector<string> objsIn;  // objects to be queried		
+	objsIn.push_back("60");
+	
+	// Generate a buffer (polygon) around 500 meters distance from the element "60"
+	TePolygonSet bufferPol;
+	if (!db->Buffer(bairros->tableName(TePOLYGONS), TePOLYGONS,
+                     objsIn, bufferPol, 500))
+	{
+		cout << "Fail to generate buffer!" << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	
+	// Retrieve the events that are within buffer
+	if(!db->spatialRelation(events->tableName(TePOINTS), TePOINTS, &bufferPol, objsOut, TeWITHIN)) 
+	{
+		cout << "Fail to retrieve events!" << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+
+	//Shows the result
+	cout << " Retrieved events:" << endl << endl;
+	for(unsigned int i=0; i<objsOut.size(); i++)
+		cout << "      " << objsOut[i] << endl;
+
+	
+	db->close();
+	cout << endl << "Press Enter\n";
+	getchar();
+	return 0;
+};
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsp b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsp
new file mode 100644
index 0000000..94f4f9b
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsp
@@ -0,0 +1,126 @@
+# Microsoft Developer Studio Project File - Name="spatialQueryAndBuffer" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=spatialQueryAndBuffer - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "spatialQueryAndBuffer.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "spatialQueryAndBuffer.mak" CFG="spatialQueryAndBuffer - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "spatialQueryAndBuffer - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "spatialQueryAndBuffer - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "spatialQueryAndBuffer - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\Postg [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "spatialQueryAndBuffer - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMySQL.lib ..\..\terralibw\PostgreSQL\li [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "spatialQueryAndBuffer - Win32 Release"
+# Name "spatialQueryAndBuffer - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\spatialQueryAndBuffer.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportDBF.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportSHP.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\functions\TeImportExport.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsw b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsw
new file mode 100644
index 0000000..730b568
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "spatialQueryAndBuffer"=".\spatialQueryAndBuffer.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.pro b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.pro
new file mode 100644
index 0000000..e0c631c
--- /dev/null
+++ b/examples/spatialQueryAndBuffer/spatialQueryAndBuffer.pro
@@ -0,0 +1,50 @@
+TEMPLATE = app
+TARGET = spatialQueryAndBuffer
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	spatialQueryAndBuffer.cpp \
+	../src/terralib/functions/TeImportDBF.cpp \
+	../src/terralib/functions/TeImportSHP.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/functions/TeImportExport.h \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/examples/themeGrouping/.cdtproject b/examples/themeGrouping/.cdtproject
new file mode 100644
index 0000000..fc69c6a
--- /dev/null
+++ b/examples/themeGrouping/.cdtproject
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse-cdt version="2.0"?>
+
+<cdtproject id="org.eclipse.cdt.make.core.make">
+<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+<data>
+<item id="org.eclipse.cdt.core.pathentry">
+<pathentry kind="src" path=""/>
+<pathentry kind="out" path=""/>
+<pathentry kind="con" path="org.eclipse.cdt.make.core.DISCOVERED_SCANNER_INFO"/>
+</item>
+<item id="cdt_indexer">
+<indexEnabled indexValue="false"/>
+<indexerProblemsEnabled indexProblemsValue="0"/>
+</item>
+</data>
+</cdtproject>
diff --git a/examples/themeGrouping/.project b/examples/themeGrouping/.project
new file mode 100644
index 0000000..36ddddb
--- /dev/null
+++ b/examples/themeGrouping/.project
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>themeGrouping</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.makeBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.core.errorOutputParser</key>
+					<value>org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;org.eclipse.cdt.core.GASErrorParser;org.eclipse.cdt.core.GLDErrorParser;org.eclipse.cdt.core.VCErrorParser;</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+					<value>clean all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.incrementalBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+					<value>false</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildLocation</key>
+					<value></value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enabledIncrementalBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+					<value>clean</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.buildCommand</key>
+					<value>make</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+					<value>all</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.stopOnError</key>
+					<value>false</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.cdt.make.core.ScannerConfigBuilder</name>
+			<arguments>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.ScannerConfigDiscoveryEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCScannerInfoConsoleParser</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderCommandEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.siProblemGenerationEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.useDefaultESIProviderCmd</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.makeBuilderParserEnabled</key>
+					<value>true</value>
+				</dictionary>
+				<dictionary>
+					<key>org.eclipse.cdt.make.core.esiProviderParserId</key>
+					<value>org.eclipse.cdt.make.core.GCCSpecsConsoleParser</value>
+				</dictionary>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.cdt.core.cnature</nature>
+		<nature>org.eclipse.cdt.make.core.makeNature</nature>
+		<nature>org.eclipse.cdt.make.core.ScannerConfigNature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/themeGrouping/Makefile b/examples/themeGrouping/Makefile
new file mode 100644
index 0000000..3f33e69
--- /dev/null
+++ b/examples/themeGrouping/Makefile
@@ -0,0 +1,23 @@
+all: themeGrouping
+
+shapelib:
+	cd ../terralibx/shapelib; make
+
+tiff:
+	cd ../terralibx/tiff; make
+
+terralib:
+	cd ../terralibx/terralib; make
+
+stat:
+	cd ../terralibx/stat; make
+
+themeGrouping: shapelib tiff terralib stat
+	qmake -o makeThemeGrouping themeGrouping.pro; make -f makeThemeGrouping
+
+clean:
+	if \
+		test -f makeThemeGrouping; \
+	then \
+		make -f makeThemeGrouping distclean; rm -f makeThemeGrouping; \
+	fi
\ No newline at end of file
diff --git a/examples/themeGrouping/themeGrouping.cpp b/examples/themeGrouping/themeGrouping.cpp
new file mode 100644
index 0000000..2af6400
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.cpp
@@ -0,0 +1,113 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* 
+	This file illustrates how to group objects of a theme. Each group of objects 
+	is associated to a legend.
+
+	Authors: Karine Reis Ferreira and Lubia Vinhas  
+*/
+
+#include <TeLegendEntry.h>
+#include <TeMySQL.h>
+
+int main()
+{
+ 	// Datatabase server parameters
+	string host = "localhost";
+	string dbname = "TerraTeste";
+	string user = "root";
+	string password = "";
+
+	// Open a connection to the TerraTeste MySQL database 
+	TeDatabase* db = new TeMySQL();
+	if (!db->connect(host, user, password, dbname))
+	{
+		cout << "Error: " << db->errorMessage() << endl;
+		cout << endl << "Press Enter\n";
+		getchar();
+		return 1;
+	}
+	cout << "Connection successful to the database \"" << dbname << "\" on MySQL server \"" << host << "\" !\n";;
+	
+	// Load a previously created theme named T_dist.
+	// This theme was created on a layer of the metropolitan districts of Sao Paulo city
+	TeTheme* trmsp = new TeTheme("T_dist");
+	if (!db->loadTheme(trmsp))
+	{
+	    cout << "Fail to load the theme \"T_dist\": " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+	trmsp->resetGrouping();		// clear any grouping previously created
+	
+	TeAttributeRep rep;			// grouping will be based on the attribute named "area_km2"
+	rep.name_ = " area_km2 ";	// that contains the area of each metropolitan district
+	rep.type_ = TeREAL;
+
+	TeGrouping equalstep3;					// define a particular way of grouping objects
+	equalstep3.groupAttribute_ = rep;
+	equalstep3.groupMode_ = TeEqualSteps;	// equal steps in 3 groups
+	equalstep3.groupNumSlices_ = 3;
+	if (!trmsp->buildGrouping(&equalstep3))	// generate groups based on the grouping definition
+	{
+	    cout << "Fail to generate the groups: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+    
+	// Associate a different visual to each group
+
+	TeVisual visual(TePOLYGONS);		// group 1: dark green
+	TeColor color(0,200,0);
+	visual.color(color);
+	trmsp->setGroupingVisual(1,visual,TePOLYGONS);
+
+	color.init(0,150,0);
+	visual.color(color);		// group 2: medium green
+	trmsp->setGroupingVisual(2,visual,TePOLYGONS);
+
+	color.init(0,100,0);	
+	visual.color(color);		// group 3: light red
+	trmsp->setGroupingVisual(3,visual,TePOLYGONS);	
+	
+	if (!trmsp->saveGrouping())			// save grouping definition
+	{
+	    cout << "Fail to save the grouping: " << db->errorMessage() << endl;
+		db->close();
+		cout << endl << "Press Enter\n";
+		getchar();
+        return 1;
+	}
+		
+	db->close();
+	cout << "Theme was successfully grouped! " << endl;
+	cout << endl << "Press Enter\n";
+    getchar();
+	return 0;
+}
+
diff --git a/examples/themeGrouping/themeGrouping.dsp b/examples/themeGrouping/themeGrouping.dsp
new file mode 100644
index 0000000..d4d17fc
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.dsp
@@ -0,0 +1,114 @@
+# Microsoft Developer Studio Project File - Name="themeGrouping" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=themeGrouping - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE 
+!MESSAGE NMAKE /f "themeGrouping.mak".
+!MESSAGE 
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE 
+!MESSAGE NMAKE /f "themeGrouping.mak" CFG="themeGrouping - Win32 Debug"
+!MESSAGE 
+!MESSAGE Possible choices for configuration are:
+!MESSAGE 
+!MESSAGE "themeGrouping - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "themeGrouping - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE 
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF  "$(CFG)" == "themeGrouping - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terralib\drive [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "NDEBUG"
+# ADD RSC /l 0x416 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 ..\..\terralibw\terralib\Release\terralib.lib ..\..\terralibw\shapelib\Release\shapelib.lib ..\..\terralibw\freetype\Release\freetype.lib ..\..\terralibw\tiff\Release\tiff.lib ..\..\terralibw\PostgreSQL\libpqdll.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\ [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ELSEIF  "$(CFG)" == "themeGrouping - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\..\src\STLport" /I "." /I "..\..\src\terralib\kernel" /I "..\..\src\terralib\application" /I "..\..\src\terralib\functions" /I "..\..\src\terralib\stat" /I "..\..\src\shapelib" /I "..\..\src\zlib" /I "..\..\src\jpeg\include" /I "..\..\src\freetype\include" /I "..\..\src\terralib\drivers\ado" /I "..\..\src\terralib\drivers\MySQL" /I "..\..\src\terralib\drivers\MySQL\include" /I "..\..\src\terralib\drivers\OracleSpatial" /I "..\..\src\terra [...]
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x416 /d "_DEBUG"
+# ADD RSC /l 0x416 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ..\..\terralibw\terralib\Debug\terralib.lib ..\..\terralibw\shapelib\Debug\shapelib.lib ..\..\terralibw\freetype\Debug\freetype.lib ..\..\terralibw\tiff\Debug\tiff.lib ..\..\terralibw\PostgreSQL\libpq.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ..\..\terralibw\jpeg\ijl15.lib ..\..\terralibw\zlib\zlibdll.lib ..\..\terralibw\OracleSpatial\Oci\Oci.lib ..\..\terralibw\MySQL\libMy [...]
+# SUBTRACT LINK32 /pdb:none
+
+!ENDIF 
+
+# Begin Target
+
+# Name "themeGrouping - Win32 Release"
+# Name "themeGrouping - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\themeGrouping.cpp
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\src\terralib\drivers\MySQL\TeMySQL.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/examples/themeGrouping/themeGrouping.dsw b/examples/themeGrouping/themeGrouping.dsw
new file mode 100644
index 0000000..a643b69
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.dsw
@@ -0,0 +1,89 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "themeGrouping"=".\themeGrouping.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name terralib
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "freetype"="..\..\terralibw\freetype\freetype.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "shapelib"="..\..\terralibw\shapelib\shapelib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Project: "terralib"="..\..\terralibw\terralib\terralib.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+    Begin Project Dependency
+    Project_Dep_Name freetype
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name shapelib
+    End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name tiff
+    End Project Dependency
+}}}
+
+###############################################################################
+
+Project: "tiff"="..\..\terralibw\tiff\tiff.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/examples/themeGrouping/themeGrouping.pro b/examples/themeGrouping/themeGrouping.pro
new file mode 100644
index 0000000..0ce8715
--- /dev/null
+++ b/examples/themeGrouping/themeGrouping.pro
@@ -0,0 +1,47 @@
+TEMPLATE = app
+TARGET = themeGrouping
+CONFIG += qt warn_on thread debug rtti exceptions
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+= \
+	themeGrouping.cpp \
+	../src/terralib/drivers/MySQL/TeMySQL.cpp
+
+HEADERS	+= \
+	../src/terralib/drivers/MySQL/TeMySQL.h
+	
+INCLUDEPATH += \
+	. \
+	.. \
+	../src/terralib/kernel \
+	../src/terralib/application \
+	../src/terralib/functions \
+	../src/terralib/stat \
+	../src/shapelib \
+	../src/zlib \
+	../src/terralib/application/qt \
+	../src/terralib/drivers/MySQL \
+	../src/terralib/drivers/MySQL/include \
+	../src/terralib/drivers/OracleSpatial \
+	../src/terralib/drivers/OracleSpatial/OCI/include \
+	../src/terralib/drivers/PostgreSQL \
+	../src/terralib/drivers/PostgreSQL/includepg 
+
+LIBS += \
+	-L../terralibx/shapelib \
+	-L../terralibx/stat \
+	-L../terralibx/terralib \
+	-L../terralibx/tiff \
+	-L../terralibx/PostgreSQL \
+	-L/usr/local/lib -L/usr/lib -L/usr/lib/mysql -L/usr/local/lib/mysql \
+	-L/usr/local/mysql -L/usr/local/mysql/lib -L. \
+    -lshapelib -lstat -lterralib -ltiff -lmysqlclient -lpq -lcrypt
+
+
+
+
+
+
+
diff --git a/src/STLport/BC50/README b/src/STLport/BC50/README
new file mode 100644
index 0000000..a132ff1
--- /dev/null
+++ b/src/STLport/BC50/README
@@ -0,0 +1,8 @@
+
+This directory should be included in search path when compiling
+with Borland C++ 5.0x compiler (maybe later ones, too).
+
+It provides wrappers that force inclusion of STLport files without extensions.
+If you want to preserve old-style HP semantics, include ../old_hp BEFORE this directory
+to include HP-style STL headers (with "using" directives). If namespaces are disabled,
+this one should be enough.
diff --git a/src/STLport/BC50/algorith.h b/src/STLport/BC50/algorith.h
new file mode 100644
index 0000000..0644036
--- /dev/null
+++ b/src/STLport/BC50/algorith.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_algorithm_H
+#  define  __STLPORT_BC_algorithm_H
+
+#  include  <..\algorithm.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/alloc.h b/src/STLport/BC50/alloc.h
new file mode 100644
index 0000000..f25a7c6
--- /dev/null
+++ b/src/STLport/BC50/alloc.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_memory_H
+#  define  __STLPORT_BC_memory_H
+
+#  include  <..\memory.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/bak/stddef.h b/src/STLport/BC50/bak/stddef.h
new file mode 100644
index 0000000..c50fc97
--- /dev/null
+++ b/src/STLport/BC50/bak/stddef.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cstddef_H
+#  define  __STLPORT_BC_cstddef_H
+
+#  include  <..\cstddef.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/bak/stdlib.h b/src/STLport/BC50/bak/stdlib.h
new file mode 100644
index 0000000..ad90a34
--- /dev/null
+++ b/src/STLport/BC50/bak/stdlib.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#  include  <..\stdlib.h>
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/bitset.h b/src/STLport/BC50/bitset.h
new file mode 100644
index 0000000..b516504
--- /dev/null
+++ b/src/STLport/BC50/bitset.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_bitset_H
+#  define  __STLPORT_BC_bitset_H
+
+#  include  <..\bitset.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cassert.h b/src/STLport/BC50/cassert.h
new file mode 100644
index 0000000..3f883e2
--- /dev/null
+++ b/src/STLport/BC50/cassert.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cassert_H
+#  define  __STLPORT_BC_cassert_H
+
+#  include  <..\cassert.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cctype.h b/src/STLport/BC50/cctype.h
new file mode 100644
index 0000000..42279ad
--- /dev/null
+++ b/src/STLport/BC50/cctype.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cctype_H
+#  define  __STLPORT_BC_cctype_H
+
+#  include  <..\cctype.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cerrno.h b/src/STLport/BC50/cerrno.h
new file mode 100644
index 0000000..4c0d5db
--- /dev/null
+++ b/src/STLport/BC50/cerrno.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cerrno_H
+#  define  __STLPORT_BC_cerrno_H
+
+#  include  <..\cerrno.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cfloat.h b/src/STLport/BC50/cfloat.h
new file mode 100644
index 0000000..c1ee3f3
--- /dev/null
+++ b/src/STLport/BC50/cfloat.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cfloat_H
+#  define  __STLPORT_BC_cfloat_H
+
+#  include  <..\cfloat.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/climits.h b/src/STLport/BC50/climits.h
new file mode 100644
index 0000000..28068c7
--- /dev/null
+++ b/src/STLport/BC50/climits.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_climits_H
+#  define  __STLPORT_BC_climits_H
+
+#  include  <..\climits.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/clocale.h b/src/STLport/BC50/clocale.h
new file mode 100644
index 0000000..a05c53d
--- /dev/null
+++ b/src/STLport/BC50/clocale.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_clocale_H
+#  define  __STLPORT_BC_clocale_H
+
+#  include  <..\clocale.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cmath.h b/src/STLport/BC50/cmath.h
new file mode 100644
index 0000000..3bb3072
--- /dev/null
+++ b/src/STLport/BC50/cmath.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cmath_H
+#  define  __STLPORT_BC_cmath_H
+
+#  include  <..\cmath.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/complex.h b/src/STLport/BC50/complex.h
new file mode 100644
index 0000000..5f5bd67
--- /dev/null
+++ b/src/STLport/BC50/complex.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_complex_H
+#  define  __STLPORT_BC_complex_H
+
+#  include  <..\complex.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/csetjmp.h b/src/STLport/BC50/csetjmp.h
new file mode 100644
index 0000000..3249254
--- /dev/null
+++ b/src/STLport/BC50/csetjmp.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_csetjmp_H
+#  define  __STLPORT_BC_csetjmp_H
+
+#  include  <..\csetjmp.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/csignal.h b/src/STLport/BC50/csignal.h
new file mode 100644
index 0000000..ae8d5fe
--- /dev/null
+++ b/src/STLport/BC50/csignal.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_csignal_H
+#  define  __STLPORT_BC_csignal_H
+
+#  include  <..\csignal.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstdarg.h b/src/STLport/BC50/cstdarg.h
new file mode 100644
index 0000000..e5f566e
--- /dev/null
+++ b/src/STLport/BC50/cstdarg.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cstdarg_H
+#  define  __STLPORT_BC_cstdarg_H
+
+#  include  <..\cstdarg.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstddef.h b/src/STLport/BC50/cstddef.h
new file mode 100644
index 0000000..c50fc97
--- /dev/null
+++ b/src/STLport/BC50/cstddef.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cstddef_H
+#  define  __STLPORT_BC_cstddef_H
+
+#  include  <..\cstddef.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstdio.h b/src/STLport/BC50/cstdio.h
new file mode 100644
index 0000000..6aefb42
--- /dev/null
+++ b/src/STLport/BC50/cstdio.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cstdio_H
+#  define  __STLPORT_BC_cstdio_H
+
+#  include  <..\cstdio.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstdlib.h b/src/STLport/BC50/cstdlib.h
new file mode 100644
index 0000000..461eebb
--- /dev/null
+++ b/src/STLport/BC50/cstdlib.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#  include  <..\cstdlib.>
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cstring.h b/src/STLport/BC50/cstring.h
new file mode 100644
index 0000000..f41dbd7
--- /dev/null
+++ b/src/STLport/BC50/cstring.h
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+#ifndef __STLPORT_BC_cstring_H
+#  define  __STLPORT_BC_cstring_H
+
+#  include  <..\cstring.>
+
+#endif
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/ctime.h b/src/STLport/BC50/ctime.h
new file mode 100644
index 0000000..01ad304
--- /dev/null
+++ b/src/STLport/BC50/ctime.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_ctime_H
+#  define  __STLPORT_BC_ctime_H
+
+#  include  <..\ctime.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cwchar.h b/src/STLport/BC50/cwchar.h
new file mode 100644
index 0000000..6d6a039
--- /dev/null
+++ b/src/STLport/BC50/cwchar.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cwchar_H
+#  define  __STLPORT_BC_cwchar_H
+
+#  include  <..\cwchar.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/cwctype.h b/src/STLport/BC50/cwctype.h
new file mode 100644
index 0000000..0fda315
--- /dev/null
+++ b/src/STLport/BC50/cwctype.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_cwctype_H
+#  define  __STLPORT_BC_cwctype_H
+
+#  include  <..\cwctype.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/deque.h b/src/STLport/BC50/deque.h
new file mode 100644
index 0000000..cd7166c
--- /dev/null
+++ b/src/STLport/BC50/deque.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_deque_H
+#  define  __STLPORT_BC_deque_H
+
+#  include  <..\deque.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/exceptio.h b/src/STLport/BC50/exceptio.h
new file mode 100644
index 0000000..78a6ae4
--- /dev/null
+++ b/src/STLport/BC50/exceptio.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_exceptio_H
+#  define  __STLPORT_BC_exceptio_H
+
+#  include  <..\exception.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/fstream.h b/src/STLport/BC50/fstream.h
new file mode 100644
index 0000000..511303f
--- /dev/null
+++ b/src/STLport/BC50/fstream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_fstream_H
+#  define  __STLPORT_BC_fstream_H
+
+#  include  <..\fstream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/function.h b/src/STLport/BC50/function.h
new file mode 100644
index 0000000..615ac45
--- /dev/null
+++ b/src/STLport/BC50/function.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_functional_H
+#  define  __STLPORT_BC_functional_H
+
+#  include  <..\functional.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/hash_map.h b/src/STLport/BC50/hash_map.h
new file mode 100644
index 0000000..9b307cf
--- /dev/null
+++ b/src/STLport/BC50/hash_map.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_hash_map_H
+#  define  __STLPORT_BC_hash_map_H
+
+#  include  <..\hash_map.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/hash_set.h b/src/STLport/BC50/hash_set.h
new file mode 100644
index 0000000..7b49c28
--- /dev/null
+++ b/src/STLport/BC50/hash_set.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_hash_set_H
+#  define  __STLPORT_BC_hash_set_H
+
+#  include  <..\hash_set.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iomanip.h b/src/STLport/BC50/iomanip.h
new file mode 100644
index 0000000..4120153
--- /dev/null
+++ b/src/STLport/BC50/iomanip.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_iomanip_H
+#  define  __STLPORT_BC_iomanip_H
+
+#  include  <..\iomanip.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/ios.h b/src/STLport/BC50/ios.h
new file mode 100644
index 0000000..0f1d41c
--- /dev/null
+++ b/src/STLport/BC50/ios.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_ios_H
+#  define  __STLPORT_BC_ios_H
+
+#  include  <..\ios.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iosfwd.h b/src/STLport/BC50/iosfwd.h
new file mode 100644
index 0000000..5570c04
--- /dev/null
+++ b/src/STLport/BC50/iosfwd.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_iosfwd_H
+#  define  __STLPORT_BC_iosfwd_H
+
+#  include  <..\iosfwd.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iostream.h b/src/STLport/BC50/iostream.h
new file mode 100644
index 0000000..326258e
--- /dev/null
+++ b/src/STLport/BC50/iostream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_iostream_H
+#  define  __STLPORT_BC_iostream_H
+
+#  include  <..\iostream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/istream.h b/src/STLport/BC50/istream.h
new file mode 100644
index 0000000..d0ff092
--- /dev/null
+++ b/src/STLport/BC50/istream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_istream_H
+#  define  __STLPORT_BC_istream_H
+
+#  include  <..\istream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/iterator.h b/src/STLport/BC50/iterator.h
new file mode 100644
index 0000000..be12a82
--- /dev/null
+++ b/src/STLport/BC50/iterator.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_iterator_H
+#  define  __STLPORT_BC_iterator_H
+
+#  include  <..\iterator.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/limits.h b/src/STLport/BC50/limits.h
new file mode 100644
index 0000000..6d92905
--- /dev/null
+++ b/src/STLport/BC50/limits.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+// include BC native <limits.h>
+
+#include  <..\climits.>
+
+#ifndef __IN_STLPORT_CLIMITS
+# include  <..\limits.>
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/list.h b/src/STLport/BC50/list.h
new file mode 100644
index 0000000..91b3bdb
--- /dev/null
+++ b/src/STLport/BC50/list.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_list_H
+#  define  __STLPORT_BC_list_H
+
+#  include  <..\list.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/locale.h b/src/STLport/BC50/locale.h
new file mode 100644
index 0000000..ae44bad
--- /dev/null
+++ b/src/STLport/BC50/locale.h
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#  include  <..\clocale.>
+
+# ifndef __IN_STLPORT_CLOCALE
+#  include  <..\locale.>
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/make_bc50.sh b/src/STLport/BC50/make_bc50.sh
new file mode 100644
index 0000000..959c5b7
--- /dev/null
+++ b/src/STLport/BC50/make_bc50.sh
@@ -0,0 +1,12 @@
+#!/bin/sh
+for file in `cat ../export_names`
+do
+rm -fr $file.h
+cat stl_tmpl.h | sed -e "s/REPLACEME/$file/g" > $file.h
+done
+
+mv algorithm.h algorith.h
+mv functional.h function.h
+mv stdexcept.h stdexcep.h
+mv streambuf.h streambu.h
+mv strstream.h strstrea.h
diff --git a/src/STLport/BC50/map.h b/src/STLport/BC50/map.h
new file mode 100644
index 0000000..28650f6
--- /dev/null
+++ b/src/STLport/BC50/map.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_map_H
+#  define  __STLPORT_BC_map_H
+
+#  include  <..\map.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/memory.h b/src/STLport/BC50/memory.h
new file mode 100644
index 0000000..9b97663
--- /dev/null
+++ b/src/STLport/BC50/memory.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_memory_H
+#  define  __STLPORT_BC_memory_H
+
+#  include  <..\include\memory.h>
+
+#  include  <..\memory.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/numeric.h b/src/STLport/BC50/numeric.h
new file mode 100644
index 0000000..e5e7ed1
--- /dev/null
+++ b/src/STLport/BC50/numeric.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_numeric_H
+#  define  __STLPORT_BC_numeric_H
+
+#  include  <..\numeric.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/ostream.h b/src/STLport/BC50/ostream.h
new file mode 100644
index 0000000..8ee2157
--- /dev/null
+++ b/src/STLport/BC50/ostream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_ostream_H
+#  define  __STLPORT_BC_ostream_H
+
+#  include  <..\ostream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/pthread_alloc.h b/src/STLport/BC50/pthread_alloc.h
new file mode 100644
index 0000000..07fb6ab
--- /dev/null
+++ b/src/STLport/BC50/pthread_alloc.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_pthread_alloc_H
+#  define  __STLPORT_BC_pthread_alloc_H
+
+#  include  <..\pthread_alloc.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/queue.h b/src/STLport/BC50/queue.h
new file mode 100644
index 0000000..dde1a75
--- /dev/null
+++ b/src/STLport/BC50/queue.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_queue_H
+#  define  __STLPORT_BC_queue_H
+
+#  include  <..\queue.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/rope.h b/src/STLport/BC50/rope.h
new file mode 100644
index 0000000..db2ab6d
--- /dev/null
+++ b/src/STLport/BC50/rope.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_rope_H
+#  define  __STLPORT_BC_rope_H
+
+#  include  <..\rope.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/set.h b/src/STLport/BC50/set.h
new file mode 100644
index 0000000..2172ae7
--- /dev/null
+++ b/src/STLport/BC50/set.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_set_H
+#  define  __STLPORT_BC_set_H
+
+#  include  <..\set.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/slist.h b/src/STLport/BC50/slist.h
new file mode 100644
index 0000000..fe3babf
--- /dev/null
+++ b/src/STLport/BC50/slist.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_slist_H
+#  define  __STLPORT_BC_slist_H
+
+#  include  <..\slist.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/sstream.h b/src/STLport/BC50/sstream.h
new file mode 100644
index 0000000..b4a4561
--- /dev/null
+++ b/src/STLport/BC50/sstream.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_sstream_H
+#  define  __STLPORT_BC_sstream_H
+
+#  include  <..\sstream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/stack.h b/src/STLport/BC50/stack.h
new file mode 100644
index 0000000..fdfba64
--- /dev/null
+++ b/src/STLport/BC50/stack.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_stack_H
+#  define  __STLPORT_BC_stack_H
+
+#  include  <..\stack.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/stdexcep.h b/src/STLport/BC50/stdexcep.h
new file mode 100644
index 0000000..98173e2
--- /dev/null
+++ b/src/STLport/BC50/stdexcep.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_stdexcept_H
+#  define  __STLPORT_BC_stdexcept_H
+
+#  include  <..\stdexcept.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/stl_tmpl.h b/src/STLport/BC50/stl_tmpl.h
new file mode 100644
index 0000000..8e60093
--- /dev/null
+++ b/src/STLport/BC50/stl_tmpl.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_REPLACEME_H
+#  define  __STLPORT_BC_REPLACEME_H
+
+#  include  <..\REPLACEME.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/streambu.h b/src/STLport/BC50/streambu.h
new file mode 100644
index 0000000..5c314ea
--- /dev/null
+++ b/src/STLport/BC50/streambu.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_streambuf_H
+#  define  __STLPORT_BC_streambuf_H
+
+#  include  <..\streambuf.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/streambuf.h b/src/STLport/BC50/streambuf.h
new file mode 100644
index 0000000..1daf096
--- /dev/null
+++ b/src/STLport/BC50/streambuf.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_streambuf_H
+#  define  __STLPORT_BC_streambuf_H
+
+#  include  <..\streambuf.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/string.h b/src/STLport/BC50/string.h
new file mode 100644
index 0000000..eaaf2a7
--- /dev/null
+++ b/src/STLport/BC50/string.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+
+#  include <..\string.h>
+
+# ifndef __IN_STLPORT_CSTRING
+// okay, include STLPort header
+#  include  <..\string.>
+# endif /* __IN_STLPORT_CSTRING */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/strstrea.h b/src/STLport/BC50/strstrea.h
new file mode 100644
index 0000000..64b66fb
--- /dev/null
+++ b/src/STLport/BC50/strstrea.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_strstream_H
+#  define  __STLPORT_BC_strstream_H
+
+#  include  <..\strstream.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/typeinfo.h b/src/STLport/BC50/typeinfo.h
new file mode 100644
index 0000000..b29354f
--- /dev/null
+++ b/src/STLport/BC50/typeinfo.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_typeinfo_H
+#  define  __STLPORT_BC_typeinfo_H
+
+#  include  <..\typeinfo.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/using/cstring.h b/src/STLport/BC50/using/cstring.h
new file mode 100644
index 0000000..5142dda
--- /dev/null
+++ b/src/STLport/BC50/using/cstring.h
@@ -0,0 +1,54 @@
+using _STLP_VENDOR_CSTD::size_t;
+
+#  ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+#   if defined(__MSL__) && __MC68K__ && !_No_BlockMove && __dest_os == __mac_os
+#    undef memcpy
+#    undef memmove
+inline void* memcpy(void* dst, const void* src, size_t len)
+{
+	return _STLP_VENDOR_CSTD::__memcpy(dst, src, len);
+}
+inline void* memmove(void* dst, const void* src, size_t len)
+{
+	return _STLP_VENDOR_CSTD::__memmove(dst, src, len);
+}
+#   else
+
+ using _STLP_VENDOR_CSTD::memmove;
+ using _STLP_VENDOR_CSTD::memcpy;
+
+#   endif
+
+# if ! defined (__BORLANDC__)
+using _STLP_VENDOR_CSTD::memchr;
+using _STLP_VENDOR_CSTD::strchr;
+using _STLP_VENDOR_CSTD::strpbrk;
+using _STLP_VENDOR_CSTD::strrchr;
+using _STLP_VENDOR_CSTD::strstr;
+# endif
+
+using _STLP_VENDOR_CSTD::memcmp;
+using _STLP_VENDOR_CSTD::memset;
+
+using _STLP_VENDOR_CSTD::strcat;
+
+# if !defined (strcmp)
+using _STLP_VENDOR_CSTD::strcmp;
+# endif
+
+using _STLP_VENDOR_CSTD::strcoll;
+# if !defined (strcpy)
+using _STLP_VENDOR_CSTD::strcpy;
+# endif
+using _STLP_VENDOR_CSTD::strcspn;
+using _STLP_VENDOR_CSTD::strerror;
+using _STLP_VENDOR_CSTD::strlen;
+using _STLP_VENDOR_CSTD::strncat;
+using _STLP_VENDOR_CSTD::strncmp;
+
+using _STLP_VENDOR_CSTD::strncpy;
+using _STLP_VENDOR_CSTD::strspn;
+
+using _STLP_VENDOR_CSTD::strtok;
+using _STLP_VENDOR_CSTD::strxfrm;
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
diff --git a/src/STLport/BC50/using/fstream.h b/src/STLport/BC50/using/fstream.h
new file mode 100644
index 0000000..e79e048
--- /dev/null
+++ b/src/STLport/BC50/using/fstream.h
@@ -0,0 +1,19 @@
+#ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#else
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+# endif
+#endif
diff --git a/src/STLport/BC50/using/iomanip.h b/src/STLport/BC50/using/iomanip.h
new file mode 100644
index 0000000..8a7c792
--- /dev/null
+++ b/src/STLport/BC50/using/iomanip.h
@@ -0,0 +1,6 @@
+using _STLP_NEW_IO_NAMESPACE::setiosflags;
+using _STLP_NEW_IO_NAMESPACE::resetiosflags;
+using _STLP_NEW_IO_NAMESPACE::setbase;
+using _STLP_NEW_IO_NAMESPACE::setfill;
+using _STLP_NEW_IO_NAMESPACE::setprecision;
+using _STLP_NEW_IO_NAMESPACE::setw;
diff --git a/src/STLport/BC50/using/ios.h b/src/STLport/BC50/using/ios.h
new file mode 100644
index 0000000..22f23ae
--- /dev/null
+++ b/src/STLport/BC50/using/ios.h
@@ -0,0 +1,41 @@
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_NEW_IO_NAMESPACE;
+#  else
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+using _STLP_NEW_IO_NAMESPACE::streamsize;
+
+using _STLP_NEW_IO_NAMESPACE::ios_base;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+
+// _lib.std.ios.manip_, manipulators:	
+using _STLP_NEW_IO_NAMESPACE::boolalpha;
+using _STLP_NEW_IO_NAMESPACE::noboolalpha;
+using _STLP_NEW_IO_NAMESPACE::showbase;
+using _STLP_NEW_IO_NAMESPACE::noshowbase;
+using _STLP_NEW_IO_NAMESPACE::showpoint;
+using _STLP_NEW_IO_NAMESPACE::noshowpoint;
+using _STLP_NEW_IO_NAMESPACE::showpos;
+using _STLP_NEW_IO_NAMESPACE::noshowpos;
+using _STLP_NEW_IO_NAMESPACE::skipws;
+using _STLP_NEW_IO_NAMESPACE::noskipws;
+using _STLP_NEW_IO_NAMESPACE::uppercase;
+using _STLP_NEW_IO_NAMESPACE::nouppercase;
+
+// _lib.adjustfield.manip_ adjustfield:
+using _STLP_NEW_IO_NAMESPACE::internal;
+using _STLP_NEW_IO_NAMESPACE::left;
+using _STLP_NEW_IO_NAMESPACE::right;
+
+// _lib.basefield.manip_ basefield:
+using _STLP_NEW_IO_NAMESPACE::dec;
+using _STLP_NEW_IO_NAMESPACE::hex;
+using _STLP_NEW_IO_NAMESPACE::oct;
+
+// _lib.floatfield.manip_ floatfield:
+using _STLP_NEW_IO_NAMESPACE::fixed;
+using _STLP_NEW_IO_NAMESPACE::scientific;
+
+#  endif  /* _STLP_BROKEN_USING_DIRECTIVE */
+
diff --git a/src/STLport/BC50/using/iosfwd.h b/src/STLport/BC50/using/iosfwd.h
new file mode 100644
index 0000000..b564e81
--- /dev/null
+++ b/src/STLport/BC50/using/iosfwd.h
@@ -0,0 +1,54 @@
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+using _STLP_NEW_IO_NAMESPACE::char_traits;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fpos;
+using _STLP_NEW_IO_NAMESPACE::istreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::ostreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+using _STLP_NEW_IO_NAMESPACE::streampos;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+
+# if !defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wios;
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wostream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+using _STLP_NEW_IO_NAMESPACE::wstreampos;
+# endif
diff --git a/src/STLport/BC50/using/iostream.h b/src/STLport/BC50/using/iostream.h
new file mode 100644
index 0000000..3704c4d
--- /dev/null
+++ b/src/STLport/BC50/using/iostream.h
@@ -0,0 +1,11 @@
+using _STLP_VENDOR_STD::cin;
+using _STLP_VENDOR_STD::cout;
+using _STLP_VENDOR_STD::cerr;
+using _STLP_VENDOR_STD::clog;
+
+# if ! defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_VENDOR_STD::wcin;
+using _STLP_VENDOR_STD::wcout;
+using _STLP_VENDOR_STD::wcerr;
+using _STLP_VENDOR_STD::wclog;
+# endif
diff --git a/src/STLport/BC50/using/istream.h b/src/STLport/BC50/using/istream.h
new file mode 100644
index 0000000..4d5b912
--- /dev/null
+++ b/src/STLport/BC50/using/istream.h
@@ -0,0 +1,15 @@
+
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+# if !defined (_STLP_NO_NATIVE_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+# endif
+
+#if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+using _STLP_NEW_IO_NAMESPACE::ws;
+#endif
diff --git a/src/STLport/BC50/using/locale.h b/src/STLport/BC50/using/locale.h
new file mode 100644
index 0000000..f061cd6
--- /dev/null
+++ b/src/STLport/BC50/using/locale.h
@@ -0,0 +1,62 @@
+// from <cwchar>
+#if !defined (_STLP_NO_MBSTATE_T)
+using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
+#endif
+
+// _lib.locale_, locale:
+using _STLP_NEW_IO_NAMESPACE::locale;
+using _STLP_NEW_IO_NAMESPACE::use_facet;
+using _STLP_NEW_IO_NAMESPACE::has_facet;
+
+// _lib.locale.convenience_, convenience interfaces:
+using _STLP_NEW_IO_NAMESPACE::isspace;
+using _STLP_NEW_IO_NAMESPACE::isprint;
+using _STLP_NEW_IO_NAMESPACE::iscntrl;
+using _STLP_NEW_IO_NAMESPACE::isupper;
+using _STLP_NEW_IO_NAMESPACE::islower;
+using _STLP_NEW_IO_NAMESPACE::isalpha;
+using _STLP_NEW_IO_NAMESPACE::isdigit;
+using _STLP_NEW_IO_NAMESPACE::ispunct;
+using _STLP_NEW_IO_NAMESPACE::isxdigit;
+using _STLP_NEW_IO_NAMESPACE::isalnum;
+using _STLP_NEW_IO_NAMESPACE::isgraph;
+using _STLP_NEW_IO_NAMESPACE::toupper;
+using _STLP_NEW_IO_NAMESPACE::tolower;
+
+// _lib.category.ctype_ and _lib.facet.ctype.special_, ctype:
+using _STLP_NEW_IO_NAMESPACE::ctype_base;
+using _STLP_NEW_IO_NAMESPACE::ctype;
+using _STLP_NEW_IO_NAMESPACE::ctype_byname;
+using _STLP_NEW_IO_NAMESPACE::codecvt_base;
+using _STLP_NEW_IO_NAMESPACE::codecvt;
+using _STLP_NEW_IO_NAMESPACE::codecvt_byname;
+
+// _lib.category.numeric_ and _lib.facet.numpunct_, numeric:
+using _STLP_NEW_IO_NAMESPACE::num_get;
+using _STLP_NEW_IO_NAMESPACE::num_put;
+using _STLP_NEW_IO_NAMESPACE::numpunct;
+using _STLP_NEW_IO_NAMESPACE::numpunct_byname;
+
+// _lib.category.collate_, collation:
+using _STLP_NEW_IO_NAMESPACE::collate;
+using _STLP_NEW_IO_NAMESPACE::collate_byname;
+
+// _lib.category.time_, date and time:
+using _STLP_NEW_IO_NAMESPACE::time_base;
+using _STLP_NEW_IO_NAMESPACE::time_get;
+using _STLP_NEW_IO_NAMESPACE::time_get_byname;
+using _STLP_NEW_IO_NAMESPACE::time_put;
+using _STLP_NEW_IO_NAMESPACE::time_put_byname;
+
+// _lib.category.monetary_, money:
+using _STLP_NEW_IO_NAMESPACE::money_base;
+using _STLP_NEW_IO_NAMESPACE::money_get;
+using _STLP_NEW_IO_NAMESPACE::money_put;
+using _STLP_NEW_IO_NAMESPACE::moneypunct;
+using _STLP_NEW_IO_NAMESPACE::moneypunct_byname;
+
+#if !defined (_STLP_OWN_IOSTREAMS) && !defined (_STLP_NO_NATIVE_MESSAGE_FACET)
+using _STLP_NEW_IO_NAMESPACE::messages_base;
+using _STLP_NEW_IO_NAMESPACE::messages;
+using _STLP_NEW_IO_NAMESPACE::messages_byname;
+#endif // _MSL_NO_MESSAGE_FACET
diff --git a/src/STLport/BC50/using/ostream.h b/src/STLport/BC50/using/ostream.h
new file mode 100644
index 0000000..162b32d
--- /dev/null
+++ b/src/STLport/BC50/using/ostream.h
@@ -0,0 +1,10 @@
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wostream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::endl;
+using _STLP_NEW_IO_NAMESPACE::ends;
+using _STLP_NEW_IO_NAMESPACE::flush;
diff --git a/src/STLport/BC50/using/sstream.h b/src/STLport/BC50/using/sstream.h
new file mode 100644
index 0000000..925c37e
--- /dev/null
+++ b/src/STLport/BC50/using/sstream.h
@@ -0,0 +1,16 @@
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+#endif
diff --git a/src/STLport/BC50/using/streambuf.h b/src/STLport/BC50/using/streambuf.h
new file mode 100644
index 0000000..308241d
--- /dev/null
+++ b/src/STLport/BC50/using/streambuf.h
@@ -0,0 +1,5 @@
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+# endif
diff --git a/src/STLport/BC50/using/strstream.h b/src/STLport/BC50/using/strstream.h
new file mode 100644
index 0000000..eb26ac1
--- /dev/null
+++ b/src/STLport/BC50/using/strstream.h
@@ -0,0 +1,4 @@
+using _STLP_NEW_IO_NAMESPACE::strstreambuf;
+using _STLP_NEW_IO_NAMESPACE::istrstream;
+using _STLP_NEW_IO_NAMESPACE::ostrstream;
+using _STLP_NEW_IO_NAMESPACE::strstream;
diff --git a/src/STLport/BC50/utility.h b/src/STLport/BC50/utility.h
new file mode 100644
index 0000000..b6ed123
--- /dev/null
+++ b/src/STLport/BC50/utility.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_utility_H
+#  define  __STLPORT_BC_utility_H
+
+#  include  <..\utility.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/valarray.h b/src/STLport/BC50/valarray.h
new file mode 100644
index 0000000..0ebc7f8
--- /dev/null
+++ b/src/STLport/BC50/valarray.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_valarray_H
+#  define  __STLPORT_BC_valarray_H
+
+#  include  <..\valarray.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/BC50/vector.h b/src/STLport/BC50/vector.h
new file mode 100644
index 0000000..0492e6b
--- /dev/null
+++ b/src/STLport/BC50/vector.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 1999 Boris Fomitchev
+ * AUTOMATICALLY GENERATED - DO NOT EDIT !
+ */
+
+/*
+ *
+ *  This wrapper is needed for Borland C++ 5.0 to get STLport 
+ *  header properly included
+ */
+
+#ifndef __STLPORT_BC_vector_H
+#  define  __STLPORT_BC_vector_H
+
+#  include  <..\vector.>
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/algorithm b/src/STLport/algorithm
new file mode 100644
index 0000000..131348d
--- /dev/null
+++ b/src/STLport/algorithm
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGORITHM
+#define _STLP_ALGORITHM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1
+#  include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+# if ! defined (_STLP_USE_NAMESPACES)
+// remove() conflicts, <cstdio> should always go first
+#  include <cstdio>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGO_H
+#  include <stl/_algo.h>
+# endif
+
+#if defined (_STLP_IMPORT_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(algorithm)
+#endif /* _STLP_IMPORT_VENDOR_STD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALGORITHM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/bitset b/src/STLport/bitset
new file mode 100644
index 0000000..5ac41a8
--- /dev/null
+++ b/src/STLport/bitset
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BITSET
+#define _STLP_BITSET
+
+// This implementation of bitset<> has a second template parameter,
+// _WordT, which defaults to unsigned long.  *YOU SHOULD NOT USE
+// THIS FEATURE*.  It is experimental, and it may be removed in
+// future releases.
+
+// A bitset of size N, using words of type _WordT, will have 
+// N % (sizeof(_WordT) * CHAR_BIT) unused bits.  (They are the high-
+// order bits in the highest word.)  It is a class invariant
+// of class bitset<> that those unused bits are always zero.
+
+// Most of the actual code isn't contained in bitset<> itself, but in the 
+// base class _Base_bitset.  The base class works with whole words, not with
+// individual bits.  This allows us to specialize _Base_bitset for the
+// important special case where the bitset is only a single word.
+
+// The C++ standard does not define the precise semantics of operator[].
+// In this implementation the const version of operator[] is equivalent
+// to test(), except that it does no range checking.  The non-const version
+// returns a reference to a bit, again without doing any range checking.
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2
+#  include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+# include <stl/_bitset.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_BITSET */
+
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/cassert b/src/STLport/cassert
new file mode 100644
index 0000000..763fa79
--- /dev/null
+++ b/src/STLport/cassert
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x103
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS) || defined (__IN_STLPORT_CASSERT)
+#  include _STLP_NATIVE_CPP_C_HEADER(cassert)
+# else
+#  include <assert.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x103 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cctype b/src/STLport/cctype
new file mode 100644
index 0000000..a71bab5
--- /dev/null
+++ b/src/STLport/cctype
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CCTYPE
+# define _STLP_CCTYPE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x104
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+
+#  include _STLP_NATIVE_CPP_C_HEADER(cctype)
+
+# else
+
+#  include <ctype.h>
+
+// Undef convenience interfaces
+#undef isspace
+#undef isprint
+#undef iscntrl
+#undef isupper
+#undef islower
+#undef isalpha
+#undef isdigit
+#undef ispunct
+#undef isxdigit
+#undef isalnum
+#undef isgraph
+#undef toupper
+#undef tolower
+
+# endif /* _STLP_USE_NEW_C_HEADERS */
+
+# if ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+#  if defined ( _STLP_IMPORT_VENDOR_CSTD )
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::isalnum;
+using _STLP_VENDOR_CSTD::isalpha;
+using _STLP_VENDOR_CSTD::iscntrl;
+using _STLP_VENDOR_CSTD::isdigit;
+using _STLP_VENDOR_CSTD::isgraph;
+using _STLP_VENDOR_CSTD::islower;
+using _STLP_VENDOR_CSTD::isprint;
+using _STLP_VENDOR_CSTD::ispunct;
+using _STLP_VENDOR_CSTD::isspace;
+using _STLP_VENDOR_CSTD::isupper;
+using _STLP_VENDOR_CSTD::isxdigit;
+using _STLP_VENDOR_CSTD::tolower;
+using _STLP_VENDOR_CSTD::toupper;
+_STLP_END_NAMESPACE
+#   endif /* _STLP_IMPORT_VENDOR_CSTD*/
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x104 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CCTYPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cerrno b/src/STLport/cerrno
new file mode 100644
index 0000000..e714f87
--- /dev/null
+++ b/src/STLport/cerrno
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CERRNO
+# define _STLP_CERRNO
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x105
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cerrno)
+# else
+#  include <errno.h>
+# endif
+
+#ifndef errno
+
+# if defined (_STLP_IMPORT_VENDOR_CSTD) && ! defined (__IBMCPP__) && ! defined(__hpux)
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::errno;
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x105 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CERRNO */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cfloat b/src/STLport/cfloat
new file mode 100644
index 0000000..00734a6
--- /dev/null
+++ b/src/STLport/cfloat
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CFLOAT
+# define _STLP_CFLOAT
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x106
+#  include <stl/_prolog.h>
+# endif
+
+// Borland defines some implementation constants in std:: namespace,
+// we do not want to import them.
+# if defined  (_STLP_USE_NEW_C_HEADERS) && ! defined (__BORLANDC__)
+#  include _STLP_NATIVE_CPP_C_HEADER(cfloat)
+# else
+#  include _STLP_NATIVE_C_HEADER(float.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x106 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CFLOAT */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/climits b/src/STLport/climits
new file mode 100644
index 0000000..3e2ee84
--- /dev/null
+++ b/src/STLport/climits
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CLIMITS
+# define _STLP_CLIMITS
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x107
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (__SUNPRO_CC) && ((__SUNPRO_CC == 0x500) && (__SUNPRO_CC_COMPAT > 4))
+#  include </usr/include/limits.h>
+# elif defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(climits)
+# else
+#  ifdef __BORLANDC__
+#   include _STLP_NATIVE_C_HEADER(limits.h)
+#  else
+#   include <limits.h>
+#  endif
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID ==  0x107 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CLIMITS */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/clocale b/src/STLport/clocale
new file mode 100644
index 0000000..1cae50d
--- /dev/null
+++ b/src/STLport/clocale
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CLOCALE
+#  define _STLP_CLOCALE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID  0x108
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(clocale)
+# else
+#  include _STLP_NATIVE_C_HEADER(locale.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::lconv;
+#  if ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+using _STLP_VENDOR_CSTD::localeconv;
+using _STLP_VENDOR_CSTD::setlocale;
+#  endif
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID ==  0x108 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CLOCALE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cmath b/src/STLport/cmath
new file mode 100644
index 0000000..8867483
--- /dev/null
+++ b/src/STLport/cmath
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CMATH
+# define _STLP_CMATH
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID  0x109
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  if defined (_STLP_HAS_NO_NAMESPACES) && ! defined (exception)
+#   define exception __math_exception
+#  endif
+#  include _STLP_NATIVE_CPP_C_HEADER(cmath)
+#  if defined (_STLP_HAS_NO_NAMESPACES)
+#   undef exception
+#  endif
+# else
+#  include <math.h>
+# endif
+
+#  if (defined (__SUNPRO_CC) && (__SUNPRO_CC > 0x500)) || \
+     !( defined (__IBMCPP__) && (__IBMCPP__ >= 500) || ! ( defined (__HP_aCC) && (__HP_aCC >= 30000) ))
+# ifndef _STLP_HAS_NO_NAMESPACES
+namespace std {
+# endif
+  extern "C" double hypot(double x, double y);
+# ifndef _STLP_HAS_NO_NAMESPACES
+}
+# endif
+
+#  endif
+
+#  ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+# if ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+# ifdef _STLP_HAS_NATIVE_FLOAT_ABS
+using _STLP_VENDOR_CSTD::abs;
+# endif
+using _STLP_VENDOR_CSTD::acos;
+using _STLP_VENDOR_CSTD::asin;
+using _STLP_VENDOR_CSTD::atan2;
+using _STLP_VENDOR_CSTD::atan;
+using _STLP_VENDOR_CSTD::ceil;
+using _STLP_VENDOR_CSTD::cos;
+using _STLP_VENDOR_CSTD::cosh;
+using _STLP_VENDOR_CSTD::exp;
+using _STLP_VENDOR_CSTD::fabs;
+using _STLP_VENDOR_CSTD::floor;
+using _STLP_VENDOR_CSTD::fmod;
+using _STLP_VENDOR_CSTD::frexp;
+using _STLP_VENDOR_CSTD::ldexp;
+using _STLP_VENDOR_CSTD::log10;
+using _STLP_VENDOR_CSTD::log;
+using _STLP_VENDOR_CSTD::modf;
+using _STLP_VENDOR_CSTD::pow;
+using _STLP_VENDOR_CSTD::sin;
+using _STLP_VENDOR_CSTD::sinh;
+using _STLP_VENDOR_CSTD::sqrt;
+using _STLP_VENDOR_CSTD::tan;
+using _STLP_VENDOR_CSTD::tanh;
+# endif /* BUG */
+_STLP_END_NAMESPACE
+#  endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#ifndef _STLP_CMATH_H_HEADER
+#  include <stl/_cmath.h>
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID ==  0x109 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CMATH */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/complex b/src/STLport/complex
new file mode 100644
index 0000000..905fe93
--- /dev/null
+++ b/src/STLport/complex
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_template_complex
+# define _STLP_template_complex
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID  0x10
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_OWN_IOSTREAMS
+// This header declares the template class complex, as described in 
+// in the draft C++ standard.  Single-precision complex numbers
+// are complex<float>, double-precision are complex<double>, and
+// quad precision are complex<long double>.
+
+// Note that the template class complex is declared within namespace
+// std, as called for by the draft C++ standard
+  
+#  define _STLP_COMPLEX_NAMESPACE _STLP_STD
+#  include <stl/_complex.h>
+# else
+#  define _STLP_COMPLEX_NAMESPACE _STLP_VENDOR_STD
+#  include <wrap_std/complex>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID ==  0x10 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_template_complex */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/config/_epilog.h b/src/STLport/config/_epilog.h
new file mode 100644
index 0000000..3671284
--- /dev/null
+++ b/src/STLport/config/_epilog.h
@@ -0,0 +1,33 @@
+#if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
+
+# if defined (__BORLANDC__)
+#  pragma option pop
+#  pragma option -w-8062
+# else
+#  if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+#   pragma warning (pop)
+#  endif
+#  pragma pack (pop)
+# endif
+
+
+#elif defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+
+# pragma reset woff 1174
+# pragma reset woff 1375
+# pragma reset woff 1209
+// from iterator_base.h
+# pragma reset woff 1183
+
+#elif defined(__DECCXX)
+
+# ifdef __PRAGMA_ENVIRONMENT
+#  pragma __environment __restore
+# endif
+
+#elif defined(__IBMCPP__)
+
+#pragma info(restore)
+
+#endif
+
diff --git a/src/STLport/config/_msvc_warnings_off.h b/src/STLport/config/_msvc_warnings_off.h
new file mode 100644
index 0000000..b4ea8b1
--- /dev/null
+++ b/src/STLport/config/_msvc_warnings_off.h
@@ -0,0 +1,20 @@
+# if (_MSC_VER > 1000)
+// #pragma warning ( disable : 4251 )	// ignore template classes being exported in .dll's
+/* 
+ * "this used in base member initializer list"
+ * arrow operator warning
+ * copy constr & assignment cannot be generated
+ * "forcing value to bool 'true' or 'false'
+ * typedef used instaead of full type
+ * 4018 : signed/unsigned mismatch, 4146 - result still unsigned 
+ * 4100: unreferenced formal parameter
+ * 4663: C++ language change: to explicitly specialize class template 'identifier' use the following syntax
+ */
+#  pragma warning ( disable : 4355 4284  4231 4511 4512 4097 4786 4800 4018 4146 4244 4514 4127 4100 4663)
+#  pragma warning ( disable : 4245 4514 4660) // conversion from enum to unsigned int signed/unsigned mismatch
+#  if (_MSC_VER > 1200)
+// multiple copy constructors/assignment operators specified,
+// with member templates are bogus...
+#   pragma warning ( disable : 4521 4522)
+#  endif  
+# endif
diff --git a/src/STLport/config/_prolog.h b/src/STLport/config/_prolog.h
new file mode 100644
index 0000000..be32caa
--- /dev/null
+++ b/src/STLport/config/_prolog.h
@@ -0,0 +1,46 @@
+
+#if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
+
+# if defined (__BORLANDC__)
+#  if (__BORLANDC__ >= 0x510)
+#  pragma option push -Vx- -Ve- -a8 -b -pc -w-inl -w-aus -w-sig -w-8062 -w-8041 -w-8008 -w-8012 -w-8027 -w-8057 -w-8091 -w-8092 -w-8066  /* P_O_1 */
+#  endif
+# else
+# if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+#  pragma warning(push)
+# endif
+# pragma pack(push,8)
+# include <config/_msvc_warnings_off.h>
+# endif
+
+
+#elif defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
+
+#pragma set woff 1209
+#pragma set woff 1174
+#pragma set woff 1375
+// from iterator_base.h
+#pragma set woff 1183
+
+#elif defined(__DECCXX)
+
+# ifdef __PRAGMA_ENVIRONMENT
+#  pragma __environment __save
+#  pragma __environment __header_defaults
+# endif
+
+#elif defined(__IBMCPP__)
+// supress EDC3130: A constant is being used as a conditional expression
+#pragma info(nocnd)
+
+#elif defined (__HP_aCC)
+/* _REENTRANT selects Posix 1c threads unless draft4 selected.
+ *  * This usage is obsolescent, "-D_POSIX_C_SOURCE=199506" is preferred */
+# if 0 /* defined (_REENTRANT) && ! defined (_POSIX_C_SOURCE) */
+#  define _POSIX_C_SOURCE 199506
+# endif
+#elif defined (__WATCOMCPLUSPLUS__)
+# pragma warning 604 10 // must lookahead to determine...
+# pragma warning 594 10 // resolved as declaration/type
+# pragma warning 595 10 // resolved as an expression
+#endif
diff --git a/src/STLport/config/new_compiler/README b/src/STLport/config/new_compiler/README
new file mode 100644
index 0000000..fc7d92c
--- /dev/null
+++ b/src/STLport/config/new_compiler/README
@@ -0,0 +1,12 @@
+
+README file for "stlport/config/new_compiler"
+
+
+This directory contains "configure" script which will help you to 
+create config file for a new compiler. Please refer to HTML documentation
+at www.stlport.org/doc for details. 
+NOTE : stlconf.h produced by "configure" is NOT suitable for immediate use
+as platform-specific configuration file as it does not set several important
+macros. However, it is a good starting point.
+
+Boris Fomitchev.
\ No newline at end of file
diff --git a/src/STLport/config/new_compiler/configure b/src/STLport/config/new_compiler/configure
new file mode 100644
index 0000000..657e3fa
--- /dev/null
+++ b/src/STLport/config/new_compiler/configure
@@ -0,0 +1,3644 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.12 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help
+--enable-extension=<ext>"
+ac_help="$ac_help
+--enable-namespaces Use namespaces (default if posssible)
+--disable-namespaces Don't use namespaces support"
+ac_help="$ac_help
+--enable-exceptions Use exceptions support (default if posssible)
+ --disable-exceptions Don't use exceptions support"
+ac_help="$ac_help
+--enable-relops Separate rel_ops namespace for relational operators (default if posssible)
+--disable-relops No separate rel_ops namespace for relational operators"
+ac_help="$ac_help
+--enable-new-style-headers Use new-style headers (default)
+--disable-new-style-headers Don't use new-style headers"
+ac_help="$ac_help
+--enable-new-iostreams Use new iostreams (default)
+--disable-new-iostreams Don't use new iostreams"
+ac_help="$ac_help
+--enable-sgi-allocators : set default parameter to SGI-style default alloc, not allocator<T>
+ --disable-sgi-allocators : use allocator<T> if possible"
+ac_help="$ac_help
+--enable-malloc : set default alloc to malloc-based allocator ( malloc_alloc_template<instance_no>, alloc.h )
+--disable-malloc : choose (default) sgi node allocator (__alloc<threads,no>  alloc.h )"
+ac_help="$ac_help
+--enable-newalloc : set default alloc to new-based allocator ( new_alloc, alloc.h )
+--disable-newalloc : choose (default) sgi allocator (__alloc<threads,no>  alloc.h )"
+ac_help="$ac_help
+--enable-defalloc : make HP-style defalloc.h included in alloc.h )
+--disable-defalloc : leave defalloc.h alone"
+ac_help="$ac_help
+--enable-debugalloc : use debug versions of allocators
+--disable-debugalloc : not using debug allocators"
+ac_help="$ac_help
+--enable-abbrevs : use abbreviated class names internally for linker benefit (don't affect interface)
+--disable-abbrevs : don't use abbreviated names"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+Configuration:
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+Directory and file names:
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --sbindir=DIR           system admin executables in DIR [EPREFIX/sbin]
+  --libexecdir=DIR        program executables in DIR [EPREFIX/libexec]
+  --datadir=DIR           read-only architecture-independent data in DIR
+                          [PREFIX/share]
+  --sysconfdir=DIR        read-only single-machine data in DIR [PREFIX/etc]
+  --sharedstatedir=DIR    modifiable architecture-independent data in DIR
+                          [PREFIX/com]
+  --localstatedir=DIR     modifiable single-machine data in DIR [PREFIX/var]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --oldincludedir=DIR     C header files for non-gcc in DIR [/usr/include]
+  --infodir=DIR           info documentation in DIR [PREFIX/info]
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+Host type:
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+Features and packages:
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+EOF
+    if test -n "$ac_help"; then
+      echo "--enable and --with options recognized:$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.12"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"	"*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=stlconf.h.in
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi at caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='	'
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+echo "$ac_t""*** $0: STLport configuration utility ***" 1>&6
+if test "${CXXFLAGS}" = ""; then 
+echo "$ac_t""* Note: for best reliability - try \"CXXFLAGS=-treat_warnings_as_errors\" $0 " 1>&6
+echo "$ac_t""* Please don't forget specifying typical CXXFLAGS you'll be using - " 1>&6 
+echo "$ac_t""* such as that enabling exceptions handling" 1>&6
+fi
+echo "$ac_t""Please stand by while exploring compiler capabilities..." 1>&6
+echo "$ac_t""Be patient - that may take a while..." 1>&6
+echo "$ac_t""***" 1>&6
+
+# utility function
+check_warning () {
+    warn_str=`tail -1 config.log | egrep -i "arning|\(W\)"`
+    if test "$warn_str" = ""; then
+      return 0
+    else
+     return 1
+    fi
+}
+
+
+# Check whether --enable-extension or --disable-extension was given.
+if test "${enable_extension+set}" = set; then
+  enableval="$enable_extension"
+  
+case "$enableval" in
+	no) echo "$ac_t""Info :.cpp used as extension for tests" 1>&6 
+	    ac_ext=cpp 
+      	;;
+	 *) echo "$ac_t""Argument : .$enableval used as extension" 1>&6 
+	ac_ext=$enableval
+esac
+
+else
+  echo "$ac_t""Info : .cpp used as extension for tests" 1>&6 
+	ac_ext=cpp
+
+
+fi
+
+
+# Save that, as it is being redefined several times 
+use_ac_ext=$ac_ext
+
+for ac_prog in $CCC c++ g++ gcc CC cxx cc++
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:601: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CXX'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # Let the user override the test.
+else
+  IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+  for ac_dir in $PATH; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CXX="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CXX="$ac_cv_prog_CXX"
+if test -n "$CXX"; then
+  echo "$ac_t""$CXX" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$CXX" && break
+done
+test -n "$CXX" || CXX="gcc"
+
+
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:632: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+cat > conftest.$ac_ext <<EOF
+#line 642 "configure"
+#include "confdefs.h"
+main(){return(0);}
+EOF
+if { (eval echo configure:646: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  ac_cv_prog_cxx_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cxx_cross=no
+  else
+    ac_cv_prog_cxx_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cxx_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cxx_works" 1>&6
+if test $ac_cv_prog_cxx_works = no; then
+  { echo "configure: error: installation or configuration problem: C++ compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:672: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cxx_cross" 1>&6
+cross_compiling=$ac_cv_prog_cxx_cross
+
+echo $ac_n "checking whether we are using GNU C++""... $ac_c" 1>&6
+echo "configure:677: checking whether we are using GNU C++" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gxx'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.C <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CXX-g++} -E conftest.C'; { (eval echo configure:686: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gxx=yes
+else
+  ac_cv_prog_gxx=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gxx" 1>&6
+
+if test $ac_cv_prog_gxx = yes; then
+  GXX=yes
+  ac_test_CXXFLAGS="${CXXFLAGS+set}"
+  ac_save_CXXFLAGS="$CXXFLAGS"
+  CXXFLAGS=
+  echo $ac_n "checking whether ${CXX-g++} accepts -g""... $ac_c" 1>&6
+echo "configure:701: checking whether ${CXX-g++} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cxx_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.cc
+if test -z "`${CXX-g++} -g -c conftest.cc 2>&1`"; then
+  ac_cv_prog_cxx_g=yes
+else
+  ac_cv_prog_cxx_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cxx_g" 1>&6
+  if test "$ac_test_CXXFLAGS" = set; then
+    CXXFLAGS="$ac_save_CXXFLAGS"
+  elif test $ac_cv_prog_cxx_g = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-O2"
+  fi
+else
+  GXX=
+  test "${CXXFLAGS+set}" = set || CXXFLAGS="-g"
+fi
+
+ac_ext=$use_ac_ext
+
+ac_ext=C
+# CXXFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='${CXX-g++} -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CXX-g++} -o conftest $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cxx_cross
+
+ac_ext=$use_ac_ext
+
+echo $ac_n "checking size of int""... $ac_c" 1>&6
+echo "configure:740: checking size of int" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_int'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_int=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 748 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(int));
+  exit(0);
+}
+EOF
+if { (eval echo configure:762: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_int=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_int=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_int" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_INT $ac_cv_sizeof_int
+EOF
+
+
+ac_ext=$use_ac_ext
+
+if test "$ac_cv_sizeof_int" = "4"; then
+  cat >> confdefs.h <<EOF
+#define _STLP_UINT32_T unsigned int
+EOF
+
+else
+  echo $ac_n "checking size of long""... $ac_c" 1>&6
+echo "configure:790: checking size of long" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_long'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_long=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 798 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(long));
+  exit(0);
+}
+EOF
+if { (eval echo configure:812: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_long=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_long=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_long" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_LONG $ac_cv_sizeof_long
+EOF
+
+
+  ac_ext=$use_ac_ext
+  if test "$ac_cv_sizeof_long" = "4"; then
+    cat >> confdefs.h <<EOF
+#define _STLP_UINT32_T unsigned long
+EOF
+
+  else
+      echo $ac_n "checking size of short""... $ac_c" 1>&6
+echo "configure:839: checking size of short" >&5
+if eval "test \"`echo '$''{'ac_cv_sizeof_short'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test "$cross_compiling" = yes; then
+  ac_cv_sizeof_short=4
+else
+  cat > conftest.$ac_ext <<EOF
+#line 847 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+#include <stdio.h>
+main()
+{
+  FILE *f=fopen("conftestval", "w");
+  if (!f) exit(1);
+  fprintf(f, "%d\n", sizeof(short));
+  exit(0);
+}
+EOF
+if { (eval echo configure:861: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+  ac_cv_sizeof_short=`cat conftestval`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_sizeof_short=0
+fi
+rm -fr conftest*
+fi
+
+fi
+echo "$ac_t""$ac_cv_sizeof_short" 1>&6
+cat >> confdefs.h <<EOF
+#define SIZEOF_SHORT $ac_cv_sizeof_short
+EOF
+
+
+    if test "$ac_cv_sizeof_short" = "4"; then
+      cat >> confdefs.h <<EOF
+#define _STLP_UINT32_T unsigned short
+EOF
+
+    else
+      { echo "configure: error: Cannot find any 32-bit integer type for your compiler" 1>&2; exit 1; }
+    fi
+  ac_ext=$use_ac_ext
+  fi
+fi
+ac_ext=$use_ac_ext
+
+
+if test "$ac_cv_c_cross" = "yes"; then
+  CXXFLAGS="${CXXFLAGS} -c"
+fi
+
+ac_ext=$use_ac_ext
+
+echo $ac_n "checking for basic STL compatibility""... $ac_c" 1>&6
+echo "configure:901: checking for basic STL compatibility" >&5
+cat > conftest.$ac_ext <<EOF
+#line 903 "configure"
+#include "confdefs.h"
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg2 second_argument_type;
+    typedef Result result_type;
+};      
+template <class T>
+struct plus : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+T plus<T>::operator()(const T& x, const T& y) const { return x + y; }
+plus<int> p;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:925: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_compat="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  { echo "configure: error: Your compiler won't be able to compile this implementation. Sorry." 1>&2; exit 1; } 
+ ac_cv_compat="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_compat" 1>&6
+
+echo $ac_n "checking for partial specialization syntax""... $ac_c" 1>&6
+echo "configure:940: checking for partial specialization syntax" >&5
+cat > conftest.$ac_ext <<EOF
+#line 942 "configure"
+#include "confdefs.h"
+
+     template <class T> class fs_foo {};
+     template <> class fs_foo<int> {};
+int main() {
+ fs_foo<int> i;
+; return 0; }
+EOF
+if { (eval echo configure:951: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+    _FULL_SPEC="template <>" ac_cv_spec_syntax="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+    cat >> confdefs.h <<\EOF
+#define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+EOF
+ ac_cv_spec_syntax="no" _FULL_SPEC=""
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_spec_syntax" 1>&6
+
+echo $ac_n "checking for bool keyword""... $ac_c" 1>&6
+echo "configure:967: checking for bool keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 969 "configure"
+#include "confdefs.h"
+bool b_foo() { return true; }
+int main() {
+(void)b_foo();
+; return 0; }
+EOF
+if { (eval echo configure:976: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_bool="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_BOOL 1
+EOF
+ ac_cv_bool="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_bool" 1>&6
+if test "$ac_cv_bool" = "no"; then
+  echo $ac_n "checking for yvals.h header""... $ac_c" 1>&6
+echo "configure:992: checking for yvals.h header" >&5
+  cat > conftest.$ac_ext <<EOF
+#line 994 "configure"
+#include "confdefs.h"
+#include <yvals.h> 
+    extern bool aaa=true;
+   
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_YVALS_H 1
+EOF
+ echo "$ac_t""yes" 1>&6 
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  
+  echo "$ac_t""no" 1>&6
+  echo $ac_n "checking whether bool is reserved word""... $ac_c" 1>&6
+echo "configure:1016: checking whether bool is reserved word" >&5
+  cat > conftest.$ac_ext <<EOF
+#line 1018 "configure"
+#include "confdefs.h"
+typedef int bool;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1025: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_bool_reserved="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_DONT_USE_BOOL_TYPEDEF 1
+EOF
+ ac_cv_bool_reserved="yes"
+fi
+rm -f conftest*
+  echo "$ac_t""$ac_cv_bool_reserved" 1>&6
+  
+fi
+rm -f conftest*
+fi
+
+echo $ac_n "checking for wchar_t type""... $ac_c" 1>&6
+echo "configure:1045: checking for wchar_t type" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1047 "configure"
+#include "confdefs.h"
+ #include <wchar.h>
+      wchar_t wc_foo() { return 'a'; }
+int main() {
+(void)wc_foo();
+; return 0; }
+EOF
+if { (eval echo configure:1055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_wchar="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_WCHAR_T 1
+EOF
+ ac_cv_wchar="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_wchar" 1>&6
+
+echo $ac_n "checking if wchar_t is unsigned short""... $ac_c" 1>&6
+echo "configure:1071: checking if wchar_t is unsigned short" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1073 "configure"
+#include "confdefs.h"
+
+     # include <wchar.h>
+     template <class T> struct foo {};
+     $_FULL_SPEC struct foo <wchar_t> {};
+     typedef unsigned short u__short;
+     $_FULL_SPEC struct foo <u__short> {};
+     foo<wchar_t> f1;
+     foo<u__short> f2;
+	
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1088: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_wchar_short="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_WCHAR_T_IS_USHORT 1
+EOF
+ ac_cv_wchar_short="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_wchar_short" 1>&6
+
+echo $ac_n "checking for long long type""... $ac_c" 1>&6
+echo "configure:1104: checking for long long type" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1106 "configure"
+#include "confdefs.h"
+long long ll_foo() { return 0; }
+int main() {
+(void)ll_foo();
+; return 0; }
+EOF
+if { (eval echo configure:1113: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_LONG_LONG 1
+EOF
+ ac_cv_long_long="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_long_long="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_long_long" 1>&6
+
+echo $ac_n "checking for long double type""... $ac_c" 1>&6
+echo "configure:1129: checking for long double type" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1131 "configure"
+#include "confdefs.h"
+long double ld_foo() { return 0; }
+int main() {
+(void)ld_foo();
+; return 0; }
+EOF
+if { (eval echo configure:1138: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_long_double="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_LONG_DOUBLE 1
+EOF
+ ac_cv_long_double="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_long_double" 1>&6
+
+echo $ac_n "checking for typename keyword""... $ac_c" 1>&6
+echo "configure:1154: checking for typename keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1156 "configure"
+#include "confdefs.h"
+
+template <class T1, class T2>
+struct pair {
+    typedef T1 first_type;
+    typedef T2 second_type;
+};
+
+template <class Arg, class Result>
+struct unary_function {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};
+
+template <class Pair>
+struct select2nd : public unary_function<Pair, typename Pair::second_type> {
+  typedef typename Pair::first_type ignored_type;
+  const typename Pair::second_type& operator()(const typename Pair::second_type& x,
+						const ignored_type& ) const
+  {
+    return x;
+  }
+  
+};
+    
+int main() {
+ 
+	typedef pair<int,int> tn_p;
+	select2nd< tn_p > tn_s;
+	(void)tn_s(1,5);
+    
+; return 0; }
+EOF
+if { (eval echo configure:1190: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  __TYPENAME="typename" 
+     ac_cv_typename="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  __TYPENAME="" 
+     cat >> confdefs.h <<\EOF
+#define _STLP_NEED_TYPENAME 1
+EOF
+
+     ac_cv_typename="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_typename" 1>&6
+
+echo $ac_n "checking for explicit keyword""... $ac_c" 1>&6
+echo "configure:1209: checking for explicit keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1211 "configure"
+#include "confdefs.h"
+struct expl_Class { int a; explicit expl_Class(int t): a(t) {} };
+    expl_Class c(1);
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1220: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_explicit="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXPLICIT 1
+EOF
+ ac_cv_explicit="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_explicit" 1>&6
+
+echo $ac_n "checking for mutable keyword""... $ac_c" 1>&6
+echo "configure:1236: checking for mutable keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1238 "configure"
+#include "confdefs.h"
+struct mut_Class { mutable int a; void update() const { a=0; }  };
+    mut_Class c;
+    
+int main() {
+c.update()
+; return 0; }
+EOF
+if { (eval echo configure:1247: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_mutable="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NEED_MUTABLE 1
+EOF
+ ac_cv_mutable="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_mutable" 1>&6
+
+echo $ac_n "checking for new style casts""... $ac_c" 1>&6
+echo "configure:1263: checking for new style casts" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1265 "configure"
+#include "confdefs.h"
+struct ncast_Class { 
+	int a; void update(int* i) { *i=a; }  };
+    ncast_Class c;
+    
+int main() {
+
+  const int a(5);
+  c.update(const_cast<int*>(&a))
+    
+; return 0; }
+EOF
+if { (eval echo configure:1278: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_new_cast="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_STYLE_CASTS 1
+EOF
+ ac_cv_new_cast="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_new_cast" 1>&6
+
+echo $ac_n "checking for new-style C library headers""... $ac_c" 1>&6
+echo "configure:1294: checking for new-style C library headers" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1296 "configure"
+#include "confdefs.h"
+
+     #include <cctype>
+     #include <cstddef>
+     #include <cstdio>
+     #include <cstdlib>
+     #include <cstring>
+     #include <cassert>
+     #include <climits>
+     #ifndef _STLP_NO_WCHAR_T
+     #include <cwchar>
+     #endif
+       
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1314: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_newheaders="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_NEW_C_HEADERS 1
+EOF
+ ac_cv_newheaders="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_newheaders" 1>&6
+
+echo $ac_n "checking for new-style <new> header""... $ac_c" 1>&6
+echo "configure:1330: checking for new-style <new> header" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1332 "configure"
+#include "confdefs.h"
+
+     #include <new>
+       
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1341: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_new_new="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_NEW_HEADER 1
+EOF
+ ac_cv_new_new="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_new_new" 1>&6
+
+
+echo $ac_n "checking for member template methods""... $ac_c" 1>&6
+echo "configure:1358: checking for member template methods" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1360 "configure"
+#include "confdefs.h"
+
+template <class Result>
+struct mt_foo {
+    typedef Result result_type;
+    template <class Arg> result_type operate(const Arg&) { return Result(); }
+};      
+mt_foo<int> p;
+
+int main() {
+
+(void)p.operate((char*)"aaa");
+
+; return 0; }
+EOF
+if { (eval echo configure:1376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_member_templates="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_MEMBER_TEMPLATES 1
+EOF
+ ac_cv_member_templates="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_member_templates" 1>&6
+
+echo $ac_n "checking for friend templates""... $ac_c" 1>&6
+echo "configure:1393: checking for friend templates" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1395 "configure"
+#include "confdefs.h"
+
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+    typedef Result result_type;
+    template <class Result2> friend class foo;
+};      
+ft_foo<int> p;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1412: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_friend_templates="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_FRIEND_TEMPLATES 1
+EOF
+ ac_cv_friend_templates="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_friend_templates" 1>&6
+
+echo $ac_n "checking for qualified friend templates""... $ac_c" 1>&6
+echo "configure:1429: checking for qualified friend templates" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1431 "configure"
+#include "confdefs.h"
+
+
+${_TEST_STD_BEGIN}
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+    typedef Result result_type;
+    template <class Result2> friend class $_TEST_STD::foo;
+};      
+ft_foo<int> p;
+${_TEST_STD_END}
+
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1452: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_qual_friend_templates="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_QUALIFIED_FRIENDS 1
+EOF
+ ac_cv_qual_friend_templates="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_qual_friend_templates" 1>&6
+
+echo $ac_n "checking for member template keyword""... $ac_c" 1>&6
+echo "configure:1469: checking for member template keyword" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1471 "configure"
+#include "confdefs.h"
+
+template <class Result>
+struct nt_foo {
+    typedef Result result_type;
+    template <class Arg> struct rebind {  typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+  typedef typename _Allocator:: template rebind<_Tp> my_rebind; 
+  typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1494: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_member_template_keyword="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+EOF
+ ac_cv_member_template_keyword="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_member_template_keyword" 1>&6
+
+if test "$ac_cv_member_template_keyword" = "no"; then
+echo $ac_n "checking for member template classes""... $ac_c" 1>&6
+echo "configure:1512: checking for member template classes" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1514 "configure"
+#include "confdefs.h"
+
+template <class Result>
+struct nt_foo {
+    typedef Result result_type;
+    template <class Arg> struct rebind {  typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+  typedef typename _Allocator::rebind<_Tp> my_rebind; 
+  typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1537: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_member_template_classes="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+EOF
+ ac_cv_member_template_classes="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_member_template_classes" 1>&6
+fi
+
+echo $ac_n "checking for partial class specialization""... $ac_c" 1>&6
+echo "configure:1555: checking for partial class specialization" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1557 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ps_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};   
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+	void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+	void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.foo();
+; return 0; }
+EOF
+if { (eval echo configure:1584: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_partial_spec="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+EOF
+ ac_cv_partial_spec="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_spec" 1>&6
+
+if test "$ac_cv_partial_spec" = yes; then
+
+echo $ac_n "checking if explicit args accepted on constructors of partial specialized classes""... $ac_c" 1>&6
+echo "configure:1603: checking if explicit args accepted on constructors of partial specialized classes" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1605 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ps_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};   
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+	ps_foo<Result*,Result*>() {}
+	void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+	ps_foo<int*,Result*>() {}
+	void bar() {}
+
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.foo();
+; return 0; }
+EOF
+if { (eval echo configure:1635: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 1
+EOF
+ ac_cv_partial_spec_needs_args="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_partial_spec_needs_args="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_spec_needs_args" 1>&6
+
+fi
+
+if test ac_cv_partial_spec_needs_args=="no"; then
+
+echo $ac_n "checking if explicit args accepted on constructors of explicitly specialized classes""... $ac_c" 1>&6
+echo "configure:1656: checking if explicit args accepted on constructors of explicitly specialized classes" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1658 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ps_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+    void bar() {}	
+};   
+
+template<class Result>
+struct ps_foo<int*,int> {
+	ps_foo<Result*,Result*>() {}
+	void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.foo();
+; return 0; }
+EOF
+if { (eval echo configure:1682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 1
+EOF
+ ac_cv_partial_spec_needs_args="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_partial_spec_needs_args="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_spec_needs_args" 1>&6
+
+fi
+
+echo $ac_n "checking for partial template function ordering""... $ac_c" 1>&6
+echo "configure:1701: checking for partial template function ordering" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1703 "configure"
+#include "confdefs.h"
+
+
+template <class Arg,class Result>
+Result po_foo (const Arg& a,const Result&){ return (Result)a.nothing; }  
+
+template <class T>
+struct A {
+	T a;
+	A(int _a) : a(_a) {}
+};
+
+template<class T>
+T po_foo (const A<T>& a, const A<T>& b){ return a.a; }   
+
+int main() {
+
+  A<int> po_a(0); A<int> po_b(1); (void)po_foo(po_b, po_a)
+
+; return 0; }
+EOF
+if { (eval echo configure:1725: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_partial_ord="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+EOF
+ ac_cv_partial_ord="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_partial_ord" 1>&6
+
+echo $ac_n "checking for method specialization""... $ac_c" 1>&6
+echo "configure:1742: checking for method specialization" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1744 "configure"
+#include "confdefs.h"
+
+template <class Arg,class Result>
+struct ms_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+    inline void bar();
+};   
+
+template <class Arg,class Result>
+inline void ms_foo<Arg,Result>::bar() {}
+
+inline void ms_foo<int*,int>::bar() {}
+
+ms_foo<char*, char*> p;
+ms_foo<int*, int> p1;
+
+int main() {
+p.bar();
+ p1.bar();
+; return 0; }
+EOF
+if { (eval echo configure:1767: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_method_spec="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_METHOD_SPECIALIZATION 1
+EOF
+ ac_cv_method_spec="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_method_spec" 1>&6
+
+echo $ac_n "checking for lrand48 function""... $ac_c" 1>&6
+echo "configure:1784: checking for lrand48 function" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1786 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+int main() {
+long i = lrand48();
+; return 0; }
+EOF
+if { (eval echo configure:1793: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_RAND48 1
+EOF
+ ac_cv_func_lrand48="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_func_lrand48="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_func_lrand48" 1>&6
+
+
+echo $ac_n "checking for default template parameters""... $ac_c" 1>&6
+echo "configure:1810: checking for default template parameters" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1812 "configure"
+#include "confdefs.h"
+template <class T> struct less {}; 
+     template <class T, class T1=less<T> > struct Class { T1 t1; };
+     Class<int> cl;
+     Class<int,less<short> > cl2;
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1823: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_default_template_param="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+EOF
+ ac_cv_default_template_param="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_default_template_param" 1>&6
+if test "$ac_cv_default_template_param" = "no"; then
+  echo $ac_n "checking for default type parameters""... $ac_c" 1>&6
+echo "configure:1839: checking for default type parameters" >&5
+  cat > conftest.$ac_ext <<EOF
+#line 1841 "configure"
+#include "confdefs.h"
+
+template <class T> struct less {
+	typedef int int_t;
+  }; 
+
+template <class T, class T1=less<int> > 
+struct Class { 
+private:
+       int a;
+public:
+       typedef Class<T,T1> self; 
+       typedef $__TYPENAME T1::int_t int_t;
+       self foo (const Class<T,T1>& t) { 
+         if ( t.a==a ) return *this;
+         else return t;
+         } 
+};
+
+Class<int> cl;
+Class<int,less<short> > cl2;
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1868: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_DEFAULT_TYPE_PARAM 1
+EOF
+ ac_cv_default_type_param="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_default_type_param="no"
+fi
+rm -f conftest*
+  echo "$ac_t""$ac_cv_default_type_param" 1>&6
+
+fi
+
+
+echo $ac_n "checking for default non-type parameters""... $ac_c" 1>&6
+echo "configure:1887: checking for default non-type parameters" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1889 "configure"
+#include "confdefs.h"
+
+template <class T, int N=0 > 
+struct Class { 
+private:
+       T* t;
+       enum { t1=N };
+public:
+       int get_n() { return N; }
+};
+
+Class<int> cl;
+Class<int, 2> cl2;
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1908: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_default_nontype_param="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+EOF
+ ac_cv_default_nontype_param="no"
+	
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_default_nontype_param" 1>&6
+
+echo $ac_n "checking for non-type parameter bug""... $ac_c" 1>&6
+echo "configure:1925: checking for non-type parameter bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1927 "configure"
+#include "confdefs.h"
+
+template <class T, int N> 
+struct Class { 
+private:
+       T* t;
+       enum { t1=N };
+public:
+       int get_n() { return N; }
+};
+
+template <class T, int N>
+int operator==(const Class<T,N>& , const Class<T,N>& ) { return 0; }
+
+Class<int, 1> cl;
+Class<int, 1> cl2;
+int i(cl==cl2);
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1950: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_nontype_param_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+EOF
+ ac_cv_nontype_param_bug="yes"
+	
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_nontype_param_bug" 1>&6
+
+echo $ac_n "checking for static data member templates""... $ac_c" 1>&6
+echo "configure:1967: checking for static data member templates" >&5
+cat > conftest.$ac_ext <<EOF
+#line 1969 "configure"
+#include "confdefs.h"
+template <class T> struct Class { static int a; };
+     template <class T> int Class<T>::a;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:1977: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_static_templates="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_STATIC_TEMPLATE_DATA 1
+EOF
+ ac_cv_static_templates="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_static_templates" 1>&6
+
+if test "$ac_cv_static_templates" = no; then
+ echo $ac_n "checking for weak attribute""... $ac_c" 1>&6
+echo "configure:1994: checking for weak attribute" >&5
+ cat > conftest.$ac_ext <<EOF
+#line 1996 "configure"
+#include "confdefs.h"
+int a_w __attribute__((weak));
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2003: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_WEAK_ATTRIBUTE 1
+EOF
+ ac_cv_weak_attribute="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_weak_attribute="no"
+fi
+rm -f conftest*
+ echo "$ac_t""$ac_cv_weak_attribute" 1>&6
+fi
+
+if test "$ac_cv_static_templates" = yes; then
+echo $ac_n "checking for static array member size bug""... $ac_c" 1>&6
+echo "configure:2021: checking for static array member size bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2023 "configure"
+#include "confdefs.h"
+template <class T> struct Class { enum { sz=5 }; static int a[sz]; };
+     template <class T> int Class<T>::a[Class<T>::sz];
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2031: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_static_array_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_STATIC_ARRAY_BUG 1
+EOF
+ ac_cv_static_array_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_static_array_bug" 1>&6
+fi
+
+echo $ac_n "checking for static data member const initializer bug""... $ac_c" 1>&6
+echo "configure:2048: checking for static data member const initializer bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2050 "configure"
+#include "confdefs.h"
+template <class T> struct Class { static const int a = 1; };
+     template <class T> const int Class<T>::a;
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2058: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_static_init_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_STATIC_CONST_INIT_BUG 1
+EOF
+ ac_cv_static_init_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_static_init_bug" 1>&6
+
+echo $ac_n "checking for namespaces support""... $ac_c" 1>&6
+echo "configure:2074: checking for namespaces support" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2076 "configure"
+#include "confdefs.h"
+class test_class {};
+     namespace std { 
+      using ::test_class;
+      template <class T> struct Class { typedef T my_type; };
+      typedef Class<int>::my_type int_type;
+	}; 
+    inline int ns_foo (std::int_type t) { 
+      using namespace std; 
+      int_type i =2;
+      return i+t; 
+    } 
+     
+int main() {
+(void)ns_foo(1);
+; return 0; }
+EOF
+if { (eval echo configure:2094: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  _TEST_STD="std"  _TEST_STD_BEGIN="namespace $_TEST_STD" _TEST_STD_END="namespace $_TEST_STD" ac_cv_namespaces="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_NAMESPACES 1
+EOF
+ _TEST_STD="" _TEST_STD_BEGIN="" _TEST_STD_END="" ac_cv_namespaces="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_namespaces" 1>&6
+
+echo $ac_n "checking for broken "using" directive""... $ac_c" 1>&6
+echo "configure:2110: checking for broken "using" directive" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2112 "configure"
+#include "confdefs.h"
+namespace std { 
+      template <class T> struct Class { typedef T my_type; };
+      typedef Class<int>::my_type int_type;
+      template <class T> void foo(T,int) {}
+      template <class T> void foo(T,int,int) {}
+	}; 
+     using std::Class;
+     using std::foo;
+     
+int main() {
+(void)foo(1,1);
+; return 0; }
+EOF
+if { (eval echo configure:2127: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_broken_using="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_broken_using="yes"
+fi
+rm -f conftest*
+if test "$ac_cv_broken_using" = no; then
+# check if no warnings have been issued
+  if `check_warning` ; then
+    ac_cv_broken_using=no
+  else
+   cat >> confdefs.h <<\EOF
+#define _STLP_BROKEN_USING_DIRECTIVE 1
+EOF
+
+  fi
+else
+   cat >> confdefs.h <<\EOF
+#define _STLP_BROKEN_USING_DIRECTIVE 1
+EOF
+
+fi
+echo "$ac_t""$ac_cv_broken_using" 1>&6
+
+
+if test "$ac_cv_namespaces" = yes; then
+# Check whether --enable-namespaces or --disable-namespaces was given.
+if test "${enable_namespaces+set}" = set; then
+  enableval="$enable_namespaces"
+  
+case "$enableval" in
+	no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_NAMESPACES 1
+EOF
+ 
+            _TEST_STD="" 
+            _TEST_STD_BEGIN=""
+            _TEST_STD_END=""
+            echo "$ac_t""Config arg --disable-namespaces : code not put into namespace by user request" 1>&6;;
+	 *) echo "$ac_t""Config default: code put into namespace" 1>&6
+esac
+
+else
+  echo "$ac_t""Config default: code put into namespace" 1>&6
+
+fi
+
+else
+ echo "$ac_t""Compiler restriction : no namespaces support used" 1>&6
+fi
+
+
+echo $ac_n "checking for exceptions support""... $ac_c" 1>&6
+echo "configure:2184: checking for exceptions support" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2186 "configure"
+#include "confdefs.h"
+int ex_foo() { 
+       try { 
+         try { throw(1); } 
+         catch (int a) { throw; } 
+       } catch (...) {;} 
+      return 0;
+    }
+int main() {
+(void)ex_foo();
+; return 0; }
+EOF
+if { (eval echo configure:2199: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_exceptions="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_EXCEPTIONS 1
+EOF
+ ac_cv_exceptions="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_exceptions" 1>&6
+
+if test "$ac_cv_exceptions" = yes; then
+
+echo $ac_n "checking if exceptions specification works""... $ac_c" 1>&6
+echo "configure:2217: checking if exceptions specification works" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2219 "configure"
+#include "confdefs.h"
+template <class T> inline int ex_spec_foo(const T&) throw () { return 0;} 
+int main() {
+(void)ex_spec_foo(5);
+; return 0; }
+EOF
+if { (eval echo configure:2226: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_exception_spec="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXCEPTION_SPEC 1
+EOF
+ ac_cv_exception_spec="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_exception_spec" 1>&6
+
+echo $ac_n "checking if return is required after throw""... $ac_c" 1>&6
+echo "configure:2242: checking if return is required after throw" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2244 "configure"
+#include "confdefs.h"
+int ex_foo() { 
+       try { 
+         try { throw(1); } 
+         catch (int a) { throw; } 
+       } catch (...) {;} 
+      return 0;
+    }
+int main() {
+(void)ex_foo();
+; return 0; }
+EOF
+if { (eval echo configure:2257: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_throw_return_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_THROW_RETURN_BUG 1
+EOF
+ ac_cv_throw_return_bug="yes"
+fi
+rm -f conftest*
+
+    if test "$ac_cv_throw_return_bug" = no; then
+    # check if no warnings have been issued
+     if `check_warning` ; then
+       ac_cv_throw_return_bug="no"
+     else
+       cat >> confdefs.h <<\EOF
+#define _STLP_THROW_RETURN_BUG 1
+EOF
+
+       ac_cv_throw_return_bug="yes"
+     fi
+    fi
+echo "$ac_t""$ac_cv_throw_return_bug" 1>&6
+
+fi
+
+echo $ac_n "checking for native <string> header with basic_string defined ""... $ac_c" 1>&6
+echo "configure:2288: checking for native <string> header with basic_string defined " >&5
+cat > conftest.$ac_ext <<EOF
+#line 2290 "configure"
+#include "confdefs.h"
+
+     #include <string>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+     basic_string<char, char_traits<char>, allocator<char> > bs;
+     string bd = bs;
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2304: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+   ac_cv_string_header="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+   cat >> confdefs.h <<\EOF
+#define _STLP_NO_STRING_HEADER 1
+EOF
+ ac_cv_string_header="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_string_header" 1>&6
+
+if test "$ac_cv_string_header" = yes; then
+echo $ac_n "checking for native <stdexcept> header""... $ac_c" 1>&6
+echo "configure:2322: checking for native <stdexcept> header" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2324 "configure"
+#include "confdefs.h"
+
+     #include <stdexcept>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+     string s;
+     logic_error le(s);
+     runtime_error re(s);
+     domain_error de(s);
+     invalid_argument ia(s);
+     length_error lne(s);
+     out_of_range or(s);
+     range_error rne(s);
+     overflow_error ove(s);
+     underflow_error ue(s);
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2346: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_stdexcept_header="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_STDEXCEPT_HEADER 1
+EOF
+ ac_cv_stdexcept_header="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_stdexcept_header" 1>&6
+
+echo $ac_n "checking for new iostreams""... $ac_c" 1>&6
+echo "configure:2363: checking for new iostreams" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2365 "configure"
+#include "confdefs.h"
+
+     #include <iosfwd>
+     #include <iostream>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+
+     template <class _Tp, class _Traits>
+     void outp(basic_ostream<_Tp,_Traits>& o, char* str) {
+         o<<str; 
+        }
+       
+int main() {
+
+	outp(cout, "Hello World\n")
+    
+; return 0; }
+EOF
+if { (eval echo configure:2385: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_newstreams="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_HAS_NO_NEW_IOSTREAMS 1
+EOF
+ ac_cv_newstreams="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_newstreams" 1>&6
+
+
+fi
+
+echo $ac_n "checking for <exception> header with class "exception" defined""... $ac_c" 1>&6
+echo "configure:2404: checking for <exception> header with class "exception" defined" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2406 "configure"
+#include "confdefs.h"
+
+     #include <exception>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+     class my_exception: public $_TEST_STD::exception {};
+     my_exception mm;
+    
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2420: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_exception_header="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXCEPTION_HEADER 1
+EOF
+ ac_cv_exception_header="no"
+
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_exception_header" 1>&6
+
+echo $ac_n "checking builtin constructor bug""... $ac_c" 1>&6
+echo "configure:2437: checking builtin constructor bug" >&5
+if test "$cross_compiling" = yes; then
+   cat >> confdefs.h <<\EOF
+#define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_builtin_c_bug="yes"
+
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2446 "configure"
+#include "confdefs.h"
+#ifdef __cplusplus
+extern "C" void exit(int);
+#endif
+
+# ifdef _STLP_USE_NEW_STYLE_HEADERS
+#  include <cassert>
+#  include <cstdio>
+#  include <cstring>
+#  include <new>
+# else
+#  include <assert.h>
+#  include <stdio.h>
+#  include <string.h>
+#  include <new.h>
+# endif
+int main(int, char**) {
+	int i;
+	double buf[1000];
+	char* pc = (char*)buf;
+	short* ps = (short*)buf;
+	int* pi = (int*)buf;
+	long* pl = (long*)buf;
+	double* pd = (double*)buf;
+	float* pf = (float*)buf;
+	for (i=0; i<100; i++) {
+	   	new(pc) char();
+        	assert(char()==0 && *pc==0);
+		sprintf(pc,"lalala\n");
+	        new (ps) short();	
+		assert(short()==0 && *ps ==0);
+		sprintf(pc,"lalala\n");
+	        new (pi) int();
+		assert(int()==0 && *pi == 0);
+		sprintf(pc,"lalala\n");
+	        new (pl) long();	
+		assert(long()==0 && *pl == 0);
+		sprintf(pc,"lalala\n");
+	        new (pf) float();	
+		assert(float()==0.0 && *pf == 0.0);
+		sprintf(pc,"lalala\n");
+	        new (pd) double();	
+		assert(double()==0.0 && *pd == 0.0);
+		sprintf(pc,"lalala\n");
+	}
+  return 0;
+}
+
+EOF
+if { (eval echo configure:2496: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
+then
+   ac_cv_builtin_c_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+   cat >> confdefs.h <<\EOF
+#define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_builtin_c_bug="yes"
+fi
+rm -fr conftest*
+fi
+
+echo "$ac_t""$ac_cv_builtin_c_bug" 1>&6
+
+echo $ac_n "checking for trivial constructor bug""... $ac_c" 1>&6
+echo "configure:2514: checking for trivial constructor bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2516 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {};
+     void tc_bug_foo(output_iterator_tag) {}
+     inline void tc_test_foo()  { tc_bug_foo(output_iterator_tag()); }
+int main() {
+tc_test_foo();
+; return 0; }
+EOF
+if { (eval echo configure:2525: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_tc_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_TRIVIAL_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_tc_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_tc_bug" 1>&6
+
+echo $ac_n "checking for trivial destructor bug""... $ac_c" 1>&6
+echo "configure:2541: checking for trivial destructor bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2543 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {output_iterator_tag() {} };
+	output_iterator_tag* td_bug_bar ;
+	
+int main() {
+ td_bug_bar->~output_iterator_tag();
+     
+; return 0; }
+EOF
+if { (eval echo configure:2553: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_td_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_TRIVIAL_DESTRUCTOR_BUG 1
+EOF
+ ac_cv_td_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_td_bug" 1>&6
+
+echo $ac_n "checking for explicit function template arguments""... $ac_c" 1>&6
+echo "configure:2569: checking for explicit function template arguments" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2571 "configure"
+#include "confdefs.h"
+  template <class T> class foo;
+       template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs);
+      template <class T> class foo {
+	private:
+	  T bar;
+	friend bool operator== <> (const foo<T>&,const foo<T>&);
+     };
+     template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs) {
+	return  lhs.bar==rhs.bar;
+     }
+int main() {
+ foo<int> f1, f2;
+      int ret= (f1==f2) 
+; return 0; }
+EOF
+if { (eval echo configure:2588: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+   _NULLARGS="<>" ac_cv_expl_fun_args="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+   cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+EOF
+ ac_cv_expl_fun_args="no" _NULLARGS=""
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_expl_fun_args" 1>&6
+
+echo $ac_n "checking for template parameter baseclass matching""... $ac_c" 1>&6
+echo "configure:2604: checking for template parameter baseclass matching" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2606 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {};
+     struct derived1_tag : public output_iterator_tag {};
+     struct derived2_tag : public derived1_tag {};
+     template<class T> struct output_iterator { 
+	public:
+	output_iterator() {} 
+	~output_iterator() {} 
+	friend inline int operator== $_NULLARGS (const output_iterator<T>&, 
+                                      const output_iterator<T>&);
+	};
+     template<class T> inline int operator==(const output_iterator<T>&, 
+                              	        const output_iterator<T>&) {
+       return 0;
+     }
+     template<class T> inline output_iterator_tag
+     iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+     template <class T>
+     struct derived_iterator : public output_iterator<T> {
+	public:
+	derived_iterator() {} 
+	~derived_iterator() {}
+	};
+     template<class T> inline T select_foo(T t, output_iterator_tag) { return t;}     
+     template<class T> inline int select_foo_2(T, T,
+                                             output_iterator_tag) { return 0;}     
+     template<class T> inline T tbase_foo(T pm )  { 
+	derived_iterator<T> di1, di2; int i( di1==di2 && pm);
+	return select_foo((int)1,iterator_category(derived_iterator<T>())); 
+    }
+    
+int main() {
+ (void)tbase_foo((int)1); 
+; return 0; }
+EOF
+if { (eval echo configure:2642: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_base_match="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_BASE_MATCH_BUG 1
+EOF
+ ac_cv_base_match="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_base_match" 1>&6
+
+echo $ac_n "checking for non-template parameter baseclass matching ""... $ac_c" 1>&6
+echo "configure:2658: checking for non-template parameter baseclass matching " >&5
+cat > conftest.$ac_ext <<EOF
+#line 2660 "configure"
+#include "confdefs.h"
+struct output_iterator_tag {};
+     struct derived1_tag : public output_iterator_tag {};
+     struct derived2_tag : public derived1_tag {};
+     struct derived3_tag : public derived2_tag {};
+     template<class T> struct output_iterator { 
+	public:
+	output_iterator() {} 
+	~output_iterator() {} 
+	};
+     template<class T> inline output_iterator_tag
+     iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+     template <class T>
+     struct derived_iterator : public output_iterator<T> {
+	public:
+	derived_iterator() {} 
+	~derived_iterator() {}
+	};
+     template<class T> inline int select_foo_2(T, T,
+                                             output_iterator_tag) { return 0;}     
+     template<class T> inline int select_foo_2(T, T,
+                                             derived1_tag) { return 0;}     
+     template<class T> inline void nont_base_foo(T pm )  { 
+	derived_iterator<T> di1, di2; 
+	(void)select_foo_2(di1, (const derived_iterator<T>&)di2, derived3_tag());
+    }
+    
+int main() {
+ nont_base_foo((int)1); 
+; return 0; }
+EOF
+if { (eval echo configure:2692: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_nont_base_match="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+EOF
+ ac_cv_nont_base_match="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_nont_base_match" 1>&6
+
+echo $ac_n "checking for nested type parameters bug""... $ac_c" 1>&6
+echo "configure:2708: checking for nested type parameters bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2710 "configure"
+#include "confdefs.h"
+template<class T> struct nt_o { typedef int ii; inline ii foo(ii);};
+     template <class T> inline nt_o<T>::ii nt_o<T>::foo(ii) { return 0; }
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2718: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_nested_type_param_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NESTED_TYPE_PARAM_BUG 1
+EOF
+ ac_cv_nested_type_param_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_nested_type_param_bug" 1>&6
+
+
+echo $ac_n "checking if inherited template typedefs broken completely""... $ac_c" 1>&6
+echo "configure:2735: checking if inherited template typedefs broken completely" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2737 "configure"
+#include "confdefs.h"
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg2 second_argument_type;
+    typedef Result result_type;
+};     
+
+template <class T>
+struct equal_to : public binary_function<T, T, int> {
+    int operator()(const T& x, const T& y) const { return x == y; }
+};
+
+template <class Predicate> 
+class binary_negate 
+    : public binary_function<$__TYPENAME Predicate::first_argument_type,
+			     $__TYPENAME Predicate::second_argument_type, 
+                             int> {
+protected:
+    Predicate pred;
+public:
+    binary_negate(const Predicate& x = Predicate()) : pred(x) {}
+    int operator() (const $__TYPENAME Predicate::first_argument_type& x, 
+		    const $__TYPENAME Predicate::second_argument_type& y) const {
+	return !pred(x, y); 
+    }
+};
+      typedef equal_to<int> eq_int;
+      typedef binary_negate<equal_to<int> > int_negate;
+      int_negate n;
+ 
+int main() {
+
+      (void)n(1,2);
+    
+; return 0; }
+EOF
+if { (eval echo configure:2776: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_typebug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_BASE_TYPEDEF_BUG 1
+EOF
+ 
+     cat >> confdefs.h <<\EOF
+#define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+EOF
+ ac_cv_typebug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_typebug" 1>&6
+
+echo $ac_n "checking if inherited typedefs visible from outside""... $ac_c" 1>&6
+echo "configure:2796: checking if inherited typedefs visible from outside" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2798 "configure"
+#include "confdefs.h"
+
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg1 second_argument_type;
+    typedef Result result_type;
+};     
+
+
+template <class T>
+class plus : public binary_function<T, T, T> {
+public:
+    plus() {}
+    plus(const T&) {}
+    T operator()(const T& x, const T& y) const { return x + y; };
+};
+
+plus<int> p;
+plus<int>::first_argument_type a;
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2824: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_outside_typedef="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+EOF
+ ac_cv_outside_typedef="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_outside_typedef" 1>&6
+
+# fi
+
+echo $ac_n "checking if private type static members initializable""... $ac_c" 1>&6
+echo "configure:2842: checking if private type static members initializable" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2844 "configure"
+#include "confdefs.h"
+struct p_Class { private: struct str_ { 
+	int a; str_(int i) : a(i) {}}; static str_ my_int; 
+     };
+     p_Class::str_ p_Class::my_int(0); 
+     
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2855: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_private="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_UNINITIALIZABLE_PRIVATE 1
+EOF
+ ac_cv_private="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_private" 1>&6
+
+
+echo $ac_n "checking for const member constructor bug""... $ac_c" 1>&6
+echo "configure:2872: checking for const member constructor bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2874 "configure"
+#include "confdefs.h"
+
+template <class T1, class T2>
+struct pair {
+    T1 first;
+    T2 second;
+    pair(): first(T1()), second(T2()) {}
+    pair(const pair<T1,T2>& o) : first(o.first), second(o.second) {}
+};
+pair< const int, const int > p;  
+     
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2890: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_const_constructor_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_CONST_CONSTRUCTOR_BUG 1
+EOF
+ ac_cv_const_constructor_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_const_constructor_bug" 1>&6
+
+echo $ac_n "checking for loop inline problems""... $ac_c" 1>&6
+echo "configure:2906: checking for loop inline problems" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2908 "configure"
+#include "confdefs.h"
+inline int il_foo (int a) { 
+      int i; for (i=0; i<a; i++) a+=a;  while (i>0) a-=3; return a; }
+int main() {
+(void)il_foo(2);
+; return 0; }
+EOF
+if { (eval echo configure:2916: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_inline_problems="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_LOOP_INLINE_PROBLEMS 1
+EOF
+ ac_cv_inline_problems="yes"
+fi
+rm -f conftest*
+if test "$ac_cv_inline_problems" = no; then
+# check if no warnings have been issued
+  if `check_warning` ; then
+     ac_cv_inline_problems="no"
+  else
+   cat >> confdefs.h <<\EOF
+#define _STLP_LOOP_INLINE_PROBLEMS 1
+EOF
+
+   ac_cv_inline_problems="yes"
+  fi
+fi
+echo "$ac_t""$ac_cv_inline_problems" 1>&6
+
+
+echo $ac_n "checking if arrow operator always get instantiated""... $ac_c" 1>&6
+echo "configure:2945: checking if arrow operator always get instantiated" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2947 "configure"
+#include "confdefs.h"
+
+     template <class T> struct um_foo { T* ptr; 
+	T* operator ->() { return &(operator*());}
+	T  operator *()  { return *ptr; }
+     };
+     template <class T>
+	int operator == ( const um_foo<T>& x, const um_foo<T>& y)
+	{
+    		return *x == *y;
+	}
+     struct um_tag { int a ; };
+     um_foo<um_tag> f;
+     um_foo<int> a;
+     
+int main() {
+ 
+     int b(5); a.ptr=&b;
+; return 0; }
+EOF
+if { (eval echo configure:2968: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  ac_cv_unused_required="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_ARROW_OPERATOR 1
+EOF
+ ac_cv_unused_required="yes"
+    
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_unused_required" 1>&6
+
+echo $ac_n "checking for pointer-to-member parameter bug""... $ac_c" 1>&6
+echo "configure:2985: checking for pointer-to-member parameter bug" >&5
+cat > conftest.$ac_ext <<EOF
+#line 2987 "configure"
+#include "confdefs.h"
+
+struct pmf_foo {
+	int bar() { return 0; };
+};
+
+template <class Class, class Result> 
+class mem_fun_t {
+protected:
+    typedef Result (Class::*fun_type)(void);
+    fun_type ptr;
+public:
+    mem_fun_t() {}
+    mem_fun_t(fun_type p) : ptr(p) {}
+    Result operator()(Class* x) const { return (x->*ptr)();}
+};
+
+template <class Class, class Result>
+inline mem_fun_t <Class, Result> 
+mem_fun(Result (Class::*ptr)(void)) {
+    return mem_fun_t<Class, Result>(ptr);
+}
+
+int main() {
+pmf_foo pmf; (void)mem_fun(&pmf_foo::bar)(&pmf)
+; return 0; }
+EOF
+if { (eval echo configure:3015: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_pmf_bug="no"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_MEMBER_POINTER_PARAM_BUG 1
+EOF
+ ac_cv_pmf_bug="yes"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_pmf_bug" 1>&6
+
+echo $ac_n "checking if bad_alloc defined in <new>""... $ac_c" 1>&6
+echo "configure:3031: checking if bad_alloc defined in <new>" >&5
+cat > conftest.$ac_ext <<EOF
+#line 3033 "configure"
+#include "confdefs.h"
+
+     #if !defined (_STLP_NO_NEW_STYLE_HEADERS)
+     #include <new>
+     #else
+     #include <new.h>
+     #endif
+
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+
+     bad_alloc badalloc_foo() { bad_alloc err; return err;}
+int main() {
+(void)badalloc_foo()
+; return 0; }
+EOF
+if { (eval echo configure:3051: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_bad_alloc="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_BAD_ALLOC 1
+EOF
+ ac_cv_bad_alloc="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_bad_alloc" 1>&6
+
+echo $ac_n "checking for __type_traits automatic specialization""... $ac_c" 1>&6
+echo "configure:3067: checking for __type_traits automatic specialization" >&5
+cat > conftest.$ac_ext <<EOF
+#line 3069 "configure"
+#include "confdefs.h"
+template <class T> int tt_foo(const T&) {
+	typedef __type_traits<T> traits;
+	return 0;
+     }
+int main() {
+(void)tt_foo(5)
+; return 0; }
+EOF
+if { (eval echo configure:3079: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define _STLP_AUTOMATIC_TYPE_TRAITS 1
+EOF
+ ac_cv_type_traits="yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_type_traits="no"
+fi
+rm -f conftest*
+echo "$ac_t""$ac_cv_type_traits" 1>&6
+
+
+# package options - exceptions
+echo "$ac_t""***" 1>&6
+echo "$ac_t""$0: Setting implementation options..." 1>&6
+echo "$ac_t""***" 1>&6
+
+if test "$ac_cv_exceptions" = yes; then
+# Check whether --enable-exceptions or --disable-exceptions was given.
+if test "${enable_exceptions+set}" = set; then
+  enableval="$enable_exceptions"
+  
+case "$enableval" in
+           no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_EXCEPTIONS 1
+EOF
+
+               echo "$ac_t""Config arg --disable-exceptions : disabling exceptions by user request" 1>&6;;
+           *)  echo "$ac_t""Config default: exceptions enabled" 1>&6
+esac
+
+else
+  echo "$ac_t""Config default: exceptions enabled" 1>&6 
+
+fi
+
+else
+ echo "$ac_t""Compiler restriction : no exceptions support used" 1>&6
+fi
+
+if test "$ac_cv_namespaces" = yes; then
+# Check whether --enable-relops or --disable-relops was given.
+if test "${enable_relops+set}" = set; then
+  enableval="$enable_relops"
+  
+case "$enableval" in
+	no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_RELOPS_NAMESPACE 1
+EOF
+ 
+            echo "$ac_t""Config arg --disable-relops : no std::rel_ops namespace by user request" 1>&6;;
+	 *) echo "$ac_t""Config default: Separate std::rel_ops namespace for relational operators" 1>&6
+esac
+
+else
+  echo "$ac_t""Config default: Separate std::rel_ops namespace for relational operators" 1>&6
+
+fi
+
+else
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_RELOPS_NAMESPACE 1
+EOF
+ 
+fi
+
+if test "$ac_cv_newheaders" = yes; then
+# Check whether --enable-new-style-headers or --disable-new-style-headers was given.
+if test "${enable_new_style_headers+set}" = set; then
+  enableval="$enable_new_style_headers"
+  
+case "$enableval" in
+	no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_STYLE_HEADERS 1
+EOF
+ 
+            echo "$ac_t""Config arg --disable-new-style-headers : not using new-style headers" 1>&6;;
+	 *) echo "$ac_t""Config default: using new-style headers" 1>&6
+esac
+
+else
+  echo "$ac_t""Config default: using new-style headers" 1>&6
+
+fi
+
+else
+ cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_STYLE_HEADERS 1
+EOF
+
+fi
+
+if test "$ac_cv_newstreams" = yes; then
+# Check whether --enable-new-iostreams or --disable-new-iostreams was given.
+if test "${enable_new_iostreams+set}" = set; then
+  enableval="$enable_new_iostreams"
+  
+case "$enableval" in
+	no) cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_IOSTREAMS 1
+EOF
+ 
+            echo "$ac_t""Config arg --disable-new-iostreams : not using new iostreams" 1>&6;;
+	 *) echo "$ac_t""Config default: using new iostreams" 1>&6
+esac
+
+else
+  echo "$ac_t""Config default: using new iostreams" 1>&6
+
+fi
+
+else
+  cat >> confdefs.h <<\EOF
+#define _STLP_NO_NEW_IOSTREAMS 1
+EOF
+
+fi
+
+# Check whether --enable-sgi-allocators or --disable-sgi-allocators was given.
+if test "${enable_sgi_allocators+set}" = set; then
+  enableval="$enable_sgi_allocators"
+  
+case "$enableval" in
+	  yes ) echo "$ac_t""Config arg  --enable-sgi-allocators : SGI-style alloc as default allocator" 1>&6 
+                cat >> confdefs.h <<\EOF
+#define _STLP_USE_RAW_SGI_ALLOCATORS 1
+EOF
+;;
+	    * ) echo "$ac_t""Config default: using allocator<T> as default allocator if possible " 1>&6
+esac
+
+else
+  
+ echo "$ac_t""Config default: using allocator<T> as default allocator if possible" 1>&6
+
+
+fi
+
+
+# Check whether --enable-malloc or --disable-malloc was given.
+if test "${enable_malloc+set}" = set; then
+  enableval="$enable_malloc"
+  
+case "$enableval" in
+	  yes ) echo "$ac_t""Config arg  --enable-malloc : setting malloc_alloc as default alloc" 1>&6 
+                cat >> confdefs.h <<\EOF
+#define _STLP_USE_MALLOC 1
+EOF
+;;
+	    * ) echo "$ac_t""Config default: not using malloc_alloc as default alloc" 1>&6
+esac
+
+else
+  
+ echo "$ac_t""Config default: not using malloc_alloc as default alloc" 1>&6
+
+
+fi
+
+
+# Check whether --enable-newalloc or --disable-newalloc was given.
+if test "${enable_newalloc+set}" = set; then
+  enableval="$enable_newalloc"
+  
+case "$enableval" in
+	  yes ) echo "$ac_t""Config arg  --enable-newalloc : setting new_alloc as default alloc" 1>&6 
+                cat >> confdefs.h <<\EOF
+#define _STLP_USE_NEWALLOC 1
+EOF
+;;
+	    * )
+                echo "$ac_t""Config default: not using new_alloc as default alloc" 1>&6
+esac
+
+else
+  
+ echo "$ac_t""Config default: not using new_alloc as default alloc" 1>&6
+
+
+fi
+
+
+# Check whether --enable-defalloc or --disable-defalloc was given.
+if test "${enable_defalloc+set}" = set; then
+  enableval="$enable_defalloc"
+  
+case "$enableval" in
+	  no ) echo "$ac_t""Config arg --disable-defalloc : not including HP-style defalloc.h into alloc.h" 1>&6;;
+
+	  * ) echo "$ac_t""Config default : including HP-style defalloc.h into alloc.h" 1>&6 
+                cat >> confdefs.h <<\EOF
+#define _STLP_USE_DEFALLOC 1
+EOF
+
+esac
+
+else
+  
+          echo "$ac_t""Config default : not including HP-style defalloc.h into alloc.h" 1>&6
+
+
+fi
+
+
+
+# Check whether --enable-debugalloc or --disable-debugalloc was given.
+if test "${enable_debugalloc+set}" = set; then
+  enableval="$enable_debugalloc"
+  
+case "$enableval" in
+	  yes ) echo "$ac_t""Config arg --enable-debugalloc : use debug versions of allocators " 1>&6 
+                cat >> confdefs.h <<\EOF
+#define _STLP_DEBUG_ALLOC 1
+EOF
+;;
+	  * )
+          echo "$ac_t""Config default : not using debug allocators" 1>&6
+esac
+
+else
+  
+          echo "$ac_t""Config default : not using debug allocators" 1>&6
+
+
+fi
+
+
+
+# Check whether --enable-abbrevs or --disable-abbrevs was given.
+if test "${enable_abbrevs+set}" = set; then
+  enableval="$enable_abbrevs"
+  
+case "$enableval" in
+	  yes ) echo "$ac_t""Config arg --enable-abbrevs : using abbreviated class names internally" 1>&6 
+                cat >> confdefs.h <<\EOF
+#define _STLP_USE_ABBREVS 1
+EOF
+;;
+	  * )
+          echo "$ac_t""Config default : not using abbreviated class names internally" 1>&6
+esac
+
+else
+  
+          echo "$ac_t""Config default : not using abbreviated class names internally" 1>&6
+
+
+fi
+
+
+
+cat >> confdefs.h <<\EOF
+#define __AUTO_CONFIGURED 1
+EOF
+
+
+echo "$ac_t""***" 1>&6
+echo "$ac_t""$0: setting up headers..." 1>&6
+echo "$ac_t""***" 1>&6
+trap '' 1 2 15
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[ 	]*VPATH[ 	]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.12"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+
+trap 'rm -fr `echo "stlconf.h stlconf.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@CXX@%$CXX%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"stlconf.h"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([ 	]*\)#\([ 	]*define[ 	][ 	]*\)'
+ac_dB='\([ 	][ 	]*\)[^ 	]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_uB='\([ 	]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([ 	]*\)#\([ 	]*\)undef\([ 	][ 	]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="stlconf.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[ 	]*#[ 	]*undef[ 	][ 	]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+echo "$ac_t""***" 1>&6
+echo "$ac_t""$0: STLport configured for use with \"${CXX}\" compiler" 1>&6
+echo "$ac_t""$0: To restore original settings - run \"./unconfigure\" or copy stlconf.h.in to stlconf.h." 1>&6
+echo "$ac_t""***" 1>&6
+
diff --git a/src/STLport/config/new_compiler/configure.in b/src/STLport/config/new_compiler/configure.in
new file mode 100644
index 0000000..3b7a5ef
--- /dev/null
+++ b/src/STLport/config/new_compiler/configure.in
@@ -0,0 +1,1424 @@
+dnl Disable any caching here 
+define([AC_CACHE_LOAD], )dnl
+define([AC_CACHE_SAVE], )dnl
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT(stlconf.h.in)
+AC_CONFIG_HEADER(stlconf.h)
+
+AC_MSG_RESULT(*** $0: STLport configuration utility ***)
+if test "${CXXFLAGS}" = ""; then 
+AC_MSG_RESULT(* Note: for best reliability - try \"CXXFLAGS=-treat_warnings_as_errors\" $0 )
+AC_MSG_RESULT(* Please don't forget specifying typical CXXFLAGS you'll be using - ) 
+AC_MSG_RESULT(* such as that enabling exceptions handling, etc. )
+dnl AC_MSG_RESULT(* Add option forcing instantiation of all templates to CXXFLAGS if possible. )
+fi
+AC_MSG_RESULT(Please stand by while exploring compiler capabilities...)
+AC_MSG_RESULT(Be patient - that may take a while...)
+AC_MSG_RESULT(***)
+
+# utility function
+check_warning () {
+    warn_str=`tail -1 config.log | egrep -i "arning|\(W\)"`
+    if test "$warn_str" = ""; then
+      return 0
+    else
+     return 1
+    fi
+}
+
+dnl Checks for systems
+dnl AC_AIX
+dnl Checks for programs.
+dnl sets CXX
+
+AC_ARG_ENABLE(extension,[--enable-extension=<ext>],
+[
+case "$enableval" in
+	no) AC_MSG_RESULT(Info :.cpp used as extension for tests) 
+	    ac_ext=cpp 
+      	;;
+	 *) AC_MSG_RESULT(Argument : .$enableval used as extension) 
+	ac_ext=$enableval
+esac
+],
+[AC_MSG_RESULT(Info : .cpp used as extension for tests) 
+	ac_ext=cpp
+]
+)
+
+# Save that, as it is being redefined several times 
+use_ac_ext=$ac_ext
+
+AC_PROG_CXX
+ac_ext=$use_ac_ext
+
+AC_LANG_CPLUSPLUS
+ac_ext=$use_ac_ext
+
+AC_CHECK_SIZEOF(int,4)
+ac_ext=$use_ac_ext
+
+if test "$ac_cv_sizeof_int" = "4"; then
+  AC_DEFINE_UNQUOTED(_STLP_UINT32_T,unsigned int)
+else
+  AC_CHECK_SIZEOF(long,4)
+  ac_ext=$use_ac_ext
+  if test "$ac_cv_sizeof_long" = "4"; then
+    AC_DEFINE_UNQUOTED(_STLP_UINT32_T,unsigned long)
+  else
+  dnl ELBRUS ??? ;)
+    AC_CHECK_SIZEOF(short,4)
+    if test "$ac_cv_sizeof_short" = "4"; then
+      AC_DEFINE_UNQUOTED(_STLP_UINT32_T,unsigned short)
+    else
+      AC_MSG_ERROR(Cannot find any 32-bit integer type for your compiler)
+    fi
+  ac_ext=$use_ac_ext
+  fi
+fi
+ac_ext=$use_ac_ext
+
+
+dnl Exclude link stage for cross-compilation
+if test "$ac_cv_c_cross" = "yes"; then
+  CXXFLAGS="${CXXFLAGS} -c"
+fi
+
+ac_ext=$use_ac_ext
+
+dnl checking for compiler capabilities
+AC_MSG_CHECKING(for basic STL compatibility)
+AC_TRY_LINK( [
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg2 second_argument_type;
+    typedef Result result_type;
+};      
+template <class T>
+struct plus : public binary_function<T, T, T> {
+    T operator()(const T& x, const T& y) const;
+};
+
+template <class T>
+T plus<T>::operator()(const T& x, const T& y) const { return x + y; }
+plus<int> p;
+],
+[], 
+[ac_cv_compat="yes"],
+[AC_MSG_ERROR(Your compiler won't be able to compile this implementation. Sorry.) 
+ ac_cv_compat="no"]
+)
+AC_MSG_RESULT($ac_cv_compat)
+
+AC_MSG_CHECKING(for partial specialization syntax)
+AC_TRY_LINK(
+    [
+     template <class T> class fs_foo {};
+     template <> class fs_foo<int> {};],
+    [ fs_foo<int> i;],
+    [  _FULL_SPEC="template <>" ac_cv_spec_syntax="yes"],
+    [  AC_DEFINE(_STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX) ac_cv_spec_syntax="no" _FULL_SPEC=""])
+AC_MSG_RESULT($ac_cv_spec_syntax)
+
+AC_MSG_CHECKING(for bool keyword)
+AC_TRY_COMPILE(
+    [bool b_foo() { return true; }],
+    [(void)b_foo();],
+    [ac_cv_bool="yes"],
+    [AC_DEFINE(_STLP_NO_BOOL) ac_cv_bool="no"])
+AC_MSG_RESULT($ac_cv_bool)
+if test "$ac_cv_bool" = "no"; then
+  AC_MSG_CHECKING(for yvals.h header)
+  AC_TRY_COMPILE([#include <yvals.h> 
+    extern bool aaa=true;
+   ], [], 
+  [AC_DEFINE(_STLP_YVALS_H) AC_MSG_RESULT(yes) ], 
+  [
+  AC_MSG_RESULT(no)
+  AC_MSG_CHECKING(whether bool is reserved word)
+  AC_TRY_COMPILE(
+    [typedef int bool;],
+    [],
+    [ac_cv_bool_reserved="no"],
+    [AC_DEFINE(_STLP_DONT_USE_BOOL_TYPEDEF) ac_cv_bool_reserved="yes"])
+  AC_MSG_RESULT($ac_cv_bool_reserved)
+  ])
+fi
+
+AC_MSG_CHECKING(for wchar_t type)
+AC_TRY_COMPILE(
+    [ #include <wchar.h>
+      wchar_t wc_foo() { return 'a'; }],
+    [(void)wc_foo();],
+    [ac_cv_wchar="yes"],
+    [AC_DEFINE(_STLP_NO_WCHAR_T) ac_cv_wchar="no"])
+AC_MSG_RESULT($ac_cv_wchar)
+
+AC_MSG_CHECKING(if wchar_t is unsigned short)
+AC_TRY_COMPILE(
+    [
+     # include <wchar.h>
+     template <class T> struct foo {};
+     $_FULL_SPEC struct foo <wchar_t> {};
+     typedef unsigned short u__short;
+     $_FULL_SPEC struct foo <u__short> {};
+     foo<wchar_t> f1;
+     foo<u__short> f2;
+	],
+    [],
+    [ac_cv_wchar_short="no"],
+    [AC_DEFINE(_STLP_WCHAR_T_IS_USHORT) ac_cv_wchar_short="yes"])
+AC_MSG_RESULT($ac_cv_wchar_short)
+
+AC_MSG_CHECKING(for long long type)
+AC_TRY_COMPILE(
+    [long long ll_foo() { return 0; }],
+    [(void)ll_foo();],
+    [AC_DEFINE(_STLP_LONG_LONG) ac_cv_long_long="yes"],
+    [ac_cv_long_long="no"])
+AC_MSG_RESULT($ac_cv_long_long)
+
+AC_MSG_CHECKING(for long double type)
+AC_TRY_COMPILE(
+    [long double ld_foo() { return 0; }],
+    [(void)ld_foo();],
+    [ac_cv_long_double="yes"],
+    [AC_DEFINE(_STLP_NO_LONG_DOUBLE) ac_cv_long_double="no"])
+AC_MSG_RESULT($ac_cv_long_double)
+
+AC_MSG_CHECKING(for typename keyword)
+AC_TRY_LINK(
+    [
+template <class T1, class T2>
+struct pair {
+    typedef T1 first_type;
+    typedef T2 second_type;
+};
+
+template <class Arg, class Result>
+struct unary_function {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};
+
+template <class Pair>
+struct select2nd : public unary_function<Pair, typename Pair::second_type> {
+  typedef typename Pair::first_type ignored_type;
+  const typename Pair::second_type& operator()(const typename Pair::second_type& x,
+						const ignored_type& ) const
+  {
+    return x;
+  }
+  
+};
+    ],
+    [ 
+	typedef pair<int,int> tn_p;
+	select2nd< tn_p > tn_s;
+	(void)tn_s(1,5);
+    ],
+    [__TYPENAME="typename" 
+     ac_cv_typename="yes"],
+    [__TYPENAME="" 
+     AC_DEFINE(_STLP_NEED_TYPENAME)
+     ac_cv_typename="no"])
+AC_MSG_RESULT($ac_cv_typename)
+
+AC_MSG_CHECKING(for explicit keyword)
+AC_TRY_COMPILE(    
+    [struct expl_Class { int a; explicit expl_Class(int t): a(t) {} };
+    expl_Class c(1);
+    ],
+    [],
+    [ac_cv_explicit="yes"],
+    [AC_DEFINE(_STLP_NO_EXPLICIT) ac_cv_explicit="no"])
+AC_MSG_RESULT($ac_cv_explicit)
+
+AC_MSG_CHECKING(for mutable keyword)
+AC_TRY_COMPILE(    
+    [struct mut_Class { mutable int a; void update() const { a=0; }  };
+    mut_Class c;
+    ],
+    [c.update()],
+    [ac_cv_mutable="yes"],
+    [AC_DEFINE(_STLP_NEED_MUTABLE) ac_cv_mutable="no"])
+AC_MSG_RESULT($ac_cv_mutable)
+
+AC_MSG_CHECKING(for new style casts)
+AC_TRY_COMPILE(    
+    [struct ncast_Class { 
+	int a; void update(int* i) { *i=a; }  };
+    ncast_Class c;
+    ],
+    [
+  const int a(5);
+  c.update(const_cast<int*>(&a))
+    ],
+    [ac_cv_new_cast="yes"],
+    [AC_DEFINE(_STLP_NO_NEW_STYLE_CASTS) ac_cv_new_cast="no"])
+AC_MSG_RESULT($ac_cv_new_cast)
+
+AC_MSG_CHECKING(for new-style C library headers)
+AC_TRY_COMPILE(
+    [
+     #include <cctype>
+     #include <cstddef>
+     #include <cstdio>
+     #include <cstdlib>
+     #include <cstring>
+     #include <cassert>
+     #include <climits>
+     #ifndef _STLP_NO_WCHAR_T
+     #include <cwchar>
+     #endif
+       ],
+    [],
+    [ac_cv_newheaders="yes"],
+    [AC_DEFINE(_STLP_HAS_NO_NEW_C_HEADERS) ac_cv_newheaders="no"])
+AC_MSG_RESULT($ac_cv_newheaders)
+
+AC_MSG_CHECKING(for new-style <new> header)
+AC_TRY_COMPILE(
+    [
+     #include <new>
+       ],
+    [],
+    [ac_cv_new_new="yes"],
+    [AC_DEFINE(_STLP_NO_NEW_NEW_HEADER) ac_cv_new_new="no"])
+AC_MSG_RESULT($ac_cv_new_new)
+
+
+AC_MSG_CHECKING(for member template methods)
+AC_TRY_LINK( [
+template <class Result>
+struct mt_foo {
+    typedef Result result_type;
+    template <class Arg> result_type operate(const Arg&) { return Result(); }
+};      
+mt_foo<int> p;
+],
+[
+(void)p.operate((char*)"aaa");
+], 
+[ac_cv_member_templates="yes"],
+[AC_DEFINE(_STLP_NO_MEMBER_TEMPLATES) ac_cv_member_templates="no"]
+)
+AC_MSG_RESULT($ac_cv_member_templates)
+
+AC_MSG_CHECKING(for friend templates)
+AC_TRY_LINK( [
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+    typedef Result result_type;
+    template <class Result2> friend class foo;
+};      
+ft_foo<int> p;
+],
+[], 
+[ac_cv_friend_templates="yes"],
+[AC_DEFINE(_STLP_NO_FRIEND_TEMPLATES) ac_cv_friend_templates="no"]
+)
+AC_MSG_RESULT($ac_cv_friend_templates)
+
+AC_MSG_CHECKING(for qualified friend templates)
+AC_TRY_LINK( [
+
+${_TEST_STD_BEGIN}
+
+template <class Result2> class foo;
+
+template <class Result>
+struct ft_foo {
+    typedef Result result_type;
+    template <class Result2> friend class $_TEST_STD::foo;
+};      
+ft_foo<int> p;
+${_TEST_STD_END}
+
+],
+[], 
+[ac_cv_qual_friend_templates="yes"],
+[AC_DEFINE(_STLP_NO_QUALIFIED_FRIENDS) ac_cv_qual_friend_templates="no"]
+)
+AC_MSG_RESULT($ac_cv_qual_friend_templates)
+
+AC_MSG_CHECKING(for member template keyword)
+AC_TRY_LINK( [
+template <class Result>
+struct nt_foo {
+    typedef Result result_type;
+    template <class Arg> struct rebind {  typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+  typedef typename _Allocator:: template rebind<_Tp> my_rebind; 
+  typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+],
+[], 
+[ac_cv_member_template_keyword="yes"],
+[AC_DEFINE(_STLP_NO_MEMBER_TEMPLATE_KEYWORD) ac_cv_member_template_keyword="no"]
+)
+AC_MSG_RESULT($ac_cv_member_template_keyword)
+
+if test "$ac_cv_member_template_keyword" = "no"; then
+AC_MSG_CHECKING(for member template classes)
+AC_TRY_LINK( [
+template <class Result>
+struct nt_foo {
+    typedef Result result_type;
+    template <class Arg> struct rebind {  typedef nt_foo<Arg> other; };
+};
+
+template <class _Tp, class _Allocator>
+struct _Traits
+{
+  typedef typename _Allocator::rebind<_Tp> my_rebind; 
+  typedef typename my_rebind::other allocator_type;
+};
+
+nt_foo<char> p;
+_Traits< int, nt_foo<short> > pp;
+],
+[], 
+[ac_cv_member_template_classes="yes"],
+[AC_DEFINE(_STLP_NO_MEMBER_TEMPLATE_CLASSES) ac_cv_member_template_classes="no"]
+)
+AC_MSG_RESULT($ac_cv_member_template_classes)
+fi
+
+AC_MSG_CHECKING(for partial class specialization)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ps_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};   
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+	void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+	void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+],
+[p.bar();
+ p1.foo();], 
+[ac_cv_partial_spec="yes"],
+[AC_DEFINE(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) ac_cv_partial_spec="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_spec)
+
+if test "$ac_cv_partial_spec" = yes; then
+
+AC_MSG_CHECKING(if explicit args accepted on constructors of partial specialized classes)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ps_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+};   
+
+template<class Result>
+struct ps_foo<Result*,Result*> {
+	ps_foo<Result*,Result*>() {}
+	void bar() {}
+};
+
+template<class Result>
+struct ps_foo<int*,Result> {
+	ps_foo<int*,Result*>() {}
+	void bar() {}
+
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+],
+[p.bar();
+ p1.foo();], 
+[AC_DEFINE(_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS) ac_cv_partial_spec_needs_args="yes"],
+[ac_cv_partial_spec_needs_args="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_spec_needs_args)
+
+fi
+
+if test ac_cv_partial_spec_needs_args=="no"; then
+
+AC_MSG_CHECKING(if explicit args accepted on constructors of explicitly specialized classes)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ps_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+    void bar() {}	
+};   
+
+template<class Result>
+struct ps_foo<int*,int> {
+	ps_foo<Result*,Result*>() {}
+	void foo() {}
+};
+
+ps_foo<char*, char*> p;
+ps_foo<int*, int> p1;
+],
+[p.bar();
+ p1.foo();], 
+[AC_DEFINE(_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS) ac_cv_partial_spec_needs_args="yes"],
+[ac_cv_partial_spec_needs_args="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_spec_needs_args)
+
+fi
+
+AC_MSG_CHECKING(for partial template function ordering)
+AC_TRY_LINK( [
+
+template <class Arg,class Result>
+Result po_foo (const Arg& a,const Result&){ return (Result)a.nothing; }  
+
+template <class T>
+struct A {
+	T a;
+	A(int _a) : a(_a) {}
+};
+
+template<class T>
+T po_foo (const A<T>& a, const A<T>& b){ return a.a; }   
+],
+[
+  A<int> po_a(0); A<int> po_b(1); (void)po_foo(po_b, po_a)
+],
+[ac_cv_partial_ord="yes"],
+[AC_DEFINE(_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER) ac_cv_partial_ord="no"]
+)
+AC_MSG_RESULT($ac_cv_partial_ord)
+
+AC_MSG_CHECKING(for method specialization)
+AC_TRY_LINK( [
+template <class Arg,class Result>
+struct ms_foo {
+    typedef Arg argument_type;
+    typedef Result result_type;
+    inline void bar();
+};   
+
+template <class Arg,class Result>
+inline void ms_foo<Arg,Result>::bar() {}
+
+inline void ms_foo<int*,int>::bar() {}
+
+ms_foo<char*, char*> p;
+ms_foo<int*, int> p1;
+],
+[p.bar();
+ p1.bar();], 
+[ac_cv_method_spec="yes"],
+[AC_DEFINE(_STLP_NO_METHOD_SPECIALIZATION) ac_cv_method_spec="no"]
+)
+AC_MSG_RESULT($ac_cv_method_spec)
+
+AC_MSG_CHECKING(for lrand48 function)
+AC_TRY_LINK(
+    [#include <stdlib.h>],
+    [long i = lrand48();],
+    [AC_DEFINE(_STLP_RAND48) ac_cv_func_lrand48="yes"],
+    [ac_cv_func_lrand48="no"])
+AC_MSG_RESULT($ac_cv_func_lrand48)
+
+
+AC_MSG_CHECKING(for default template parameters)
+AC_TRY_LINK(
+    [template <class T> struct less {}; 
+     template <class T, class T1=less<T> > struct Class { T1 t1; };
+     Class<int> cl;
+     Class<int,less<short> > cl2;
+    ],
+    [],
+    [ac_cv_default_template_param="yes"],
+    [AC_DEFINE(_STLP_LIMITED_DEFAULT_TEMPLATES) ac_cv_default_template_param="no"])
+AC_MSG_RESULT($ac_cv_default_template_param)
+if test "$ac_cv_default_template_param" = "no"; then
+  AC_MSG_CHECKING(for default type parameters)
+  AC_TRY_LINK(
+    [
+template <class T> struct less {
+	typedef int int_t;
+  }; 
+
+template <class T, class T1=less<int> > 
+struct Class { 
+private:
+       int a;
+public:
+       typedef Class<T,T1> self; 
+       typedef $__TYPENAME T1::int_t int_t;
+       self foo (const Class<T,T1>& t) { 
+         if ( t.a==a ) return *this;
+         else return t;
+         } 
+};
+
+Class<int> cl;
+Class<int,less<short> > cl2;
+    ],
+    [],
+    [AC_DEFINE(_STLP_DEFAULT_TYPE_PARAM) ac_cv_default_type_param="yes"],
+    [ac_cv_default_type_param="no"])
+  AC_MSG_RESULT($ac_cv_default_type_param)
+
+fi
+
+dnl let's check if non-type cannot be default
+
+AC_MSG_CHECKING(for default non-type parameters)
+AC_TRY_LINK(
+    [
+template <class T, int N=0 > 
+struct Class { 
+private:
+       T* t;
+       enum { t1=N };
+public:
+       int get_n() { return N; }
+};
+
+Class<int> cl;
+Class<int, 2> cl2;
+    ],
+    [],
+    [ac_cv_default_nontype_param="yes"],
+    [AC_DEFINE(_STLP_NO_DEFAULT_NON_TYPE_PARAM) ac_cv_default_nontype_param="no"]
+	)
+AC_MSG_RESULT($ac_cv_default_nontype_param)
+
+AC_MSG_CHECKING(for non-type parameter bug)
+AC_TRY_LINK(
+    [
+template <class T, int N> 
+struct Class { 
+private:
+       T* t;
+       enum { t1=N };
+public:
+       int get_n() { return N; }
+};
+
+template <class T, int N>
+int operator==(const Class<T,N>& , const Class<T,N>& ) { return 0; }
+
+Class<int, 1> cl;
+Class<int, 1> cl2;
+int i(cl==cl2);
+    ],
+    [],
+    [ac_cv_nontype_param_bug="no"],
+    [AC_DEFINE(_STLP_NON_TYPE_TMPL_PARAM_BUG) ac_cv_nontype_param_bug="yes"]
+	)
+AC_MSG_RESULT($ac_cv_nontype_param_bug)
+
+AC_MSG_CHECKING(for static data member templates)
+AC_TRY_LINK(
+    [template <class T> struct Class { static int a; };
+     template <class T> int Class<T>::a;],
+    [],
+    [ac_cv_static_templates="yes"],
+    [AC_DEFINE(_STLP_NO_STATIC_TEMPLATE_DATA) ac_cv_static_templates="no"])
+AC_MSG_RESULT($ac_cv_static_templates)
+
+if test "$ac_cv_static_templates" = no; then
+ AC_MSG_CHECKING(for weak attribute)
+ AC_TRY_COMPILE(
+    [int a_w __attribute__((weak));],
+    [],
+    [AC_DEFINE(_STLP_WEAK_ATTRIBUTE) ac_cv_weak_attribute="yes"],
+    [ac_cv_weak_attribute="no"])
+ AC_MSG_RESULT($ac_cv_weak_attribute)
+fi
+
+if test "$ac_cv_static_templates" = yes; then
+AC_MSG_CHECKING(for static array member size bug)
+AC_TRY_LINK(
+    [template <class T> struct Class { enum { sz=5 }; static int a[sz]; };
+     template <class T> int Class<T>::a[Class<T>::sz];],
+    [],
+    [ac_cv_static_array_bug="no"],
+    [AC_DEFINE(_STLP_STATIC_ARRAY_BUG) ac_cv_static_array_bug="yes"])
+AC_MSG_RESULT($ac_cv_static_array_bug)
+fi
+
+AC_MSG_CHECKING(for static data member const initializer bug)
+AC_TRY_LINK(
+    [template <class T> struct Class { static const int a = 1; };
+     template <class T> const int Class<T>::a;],
+    [],
+    [ac_cv_static_init_bug="no"],
+    [AC_DEFINE(_STLP_STATIC_CONST_INIT_BUG) ac_cv_static_init_bug="yes"])
+AC_MSG_RESULT($ac_cv_static_init_bug)
+
+AC_MSG_CHECKING(for namespaces support)
+AC_TRY_COMPILE(
+    [class test_class {};
+     namespace std { 
+      using ::test_class;
+      template <class T> struct Class { typedef T my_type; };
+      typedef Class<int>::my_type int_type;
+	}; 
+    inline int ns_foo (std::int_type t) { 
+      using namespace std; 
+      int_type i =2;
+      return i+t; 
+    } 
+     ],
+    [(void)ns_foo(1);],
+    [_TEST_STD="std"  _TEST_STD_BEGIN="namespace $_TEST_STD" _TEST_STD_END="namespace $_TEST_STD" ac_cv_namespaces="yes"],
+    [AC_DEFINE(_STLP_HAS_NO_NAMESPACES) _TEST_STD="" _TEST_STD_BEGIN="" _TEST_STD_END="" ac_cv_namespaces="no"])
+AC_MSG_RESULT($ac_cv_namespaces)
+
+AC_MSG_CHECKING(for broken "using" directive)
+AC_TRY_COMPILE(
+    [namespace std { 
+      template <class T> struct Class { typedef T my_type; };
+      typedef Class<int>::my_type int_type;
+      template <class T> void foo(T,int) {}
+      template <class T> void foo(T,int,int) {}
+	}; 
+     using std::Class;
+     using std::foo;
+     ],
+    [(void)foo(1,1);],
+    [ac_cv_broken_using="no"],
+    [ac_cv_broken_using="yes"])
+if test "$ac_cv_broken_using" = no; then
+# check if no warnings have been issued
+  if `check_warning` ; then
+    ac_cv_broken_using=no
+  else
+   AC_DEFINE(_STLP_BROKEN_USING_DIRECTIVE)
+  fi
+else
+   AC_DEFINE(_STLP_BROKEN_USING_DIRECTIVE)
+fi
+AC_MSG_RESULT($ac_cv_broken_using)
+
+
+if test "$ac_cv_namespaces" = yes; then
+AC_ARG_ENABLE(namespaces,[--enable-namespaces Use namespaces (default if posssible)
+--disable-namespaces Don't use namespaces support],
+[
+case "$enableval" in
+	no) AC_DEFINE(_STLP_NO_NAMESPACES) 
+            _TEST_STD="" 
+            _TEST_STD_BEGIN=""
+            _TEST_STD_END=""
+            AC_MSG_RESULT(Config arg --disable-namespaces : code not put into namespace by user request);;
+	 *) AC_MSG_RESULT(Config default: code put into namespace)
+esac
+],
+[AC_MSG_RESULT(Config default: code put into namespace)]
+)
+else
+ AC_MSG_RESULT(Compiler restriction : no namespaces support used)
+fi
+
+
+AC_MSG_CHECKING(for exceptions support)
+AC_TRY_COMPILE(
+    [int ex_foo() { 
+       try { 
+         try { throw(1); } 
+         catch (int a) { throw; } 
+       } catch (...) {;} 
+      return 0;
+    }],
+    [(void)ex_foo();],
+    [ac_cv_exceptions="yes"],
+    [AC_DEFINE(_STLP_HAS_NO_EXCEPTIONS) ac_cv_exceptions="no"])
+AC_MSG_RESULT($ac_cv_exceptions)
+
+if test "$ac_cv_exceptions" = yes; then
+
+AC_MSG_CHECKING(if exceptions specification works)
+AC_TRY_COMPILE(
+    [template <class T> inline int ex_spec_foo(const T&) throw () { return 0;} ], 
+    [(void)ex_spec_foo(5);],
+    [ac_cv_exception_spec="yes"],
+    [AC_DEFINE(_STLP_NO_EXCEPTION_SPEC) ac_cv_exception_spec="no"])
+dnl    if test "$ac_cv_exception_spec" = yes; then
+dnl    # check if no warnings have been issued
+dnl     if `check_warning` ; then
+dnl       AC_DEFINE(_STLP_EXCEPTION_SPEC)
+dnl     else
+dnl      ac_cv_exception_spec=no
+dnl      fi
+dnl    fi
+AC_MSG_RESULT($ac_cv_exception_spec)
+
+AC_MSG_CHECKING(if return is required after throw)
+AC_TRY_COMPILE(
+    [int ex_foo() { 
+       try { 
+         try { throw(1); } 
+         catch (int a) { throw; } 
+       } catch (...) {;} 
+      return 0;
+    }],
+    [(void)ex_foo();],
+    [ac_cv_throw_return_bug="no"],
+    [AC_DEFINE(_STLP_THROW_RETURN_BUG) ac_cv_throw_return_bug="yes"])
+
+    if test "$ac_cv_throw_return_bug" = no; then
+    # check if no warnings have been issued
+     if `check_warning` ; then
+       ac_cv_throw_return_bug="no"
+     else
+       AC_DEFINE(_STLP_THROW_RETURN_BUG)
+       ac_cv_throw_return_bug="yes"
+     fi
+    fi
+AC_MSG_RESULT($ac_cv_throw_return_bug)
+
+fi
+
+AC_MSG_CHECKING(for native <string> header with basic_string defined )
+AC_TRY_COMPILE(
+    [
+     #include <string>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+     basic_string<char, char_traits<char>, allocator<char> > bs;
+     string bd = bs;
+    ],
+    [],
+    [ ac_cv_string_header="yes"],
+    [ AC_DEFINE(_STLP_NO_STRING_HEADER) ac_cv_string_header="no"]
+)
+AC_MSG_RESULT($ac_cv_string_header)
+
+dnl there could be no correct stdexcept/iostream  without string
+if test "$ac_cv_string_header" = yes; then
+AC_MSG_CHECKING(for native <stdexcept> header)
+AC_TRY_COMPILE(
+    [
+     #include <stdexcept>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+     string s;
+     logic_error le(s);
+     runtime_error re(s);
+     domain_error de(s);
+     invalid_argument ia(s);
+     length_error lne(s);
+     out_of_range or(s);
+     range_error rne(s);
+     overflow_error ove(s);
+     underflow_error ue(s);
+    ],
+    [],
+    [ac_cv_stdexcept_header="yes"],
+    [AC_DEFINE(_STLP_NO_STDEXCEPT_HEADER) ac_cv_stdexcept_header="no"]
+)
+AC_MSG_RESULT($ac_cv_stdexcept_header)
+
+AC_MSG_CHECKING(for new iostreams)
+AC_TRY_COMPILE(
+    [
+     #include <iosfwd>
+     #include <iostream>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+
+     template <class _Tp, class _Traits>
+     void outp(basic_ostream<_Tp,_Traits>& o, char* str) {
+         o<<str; 
+        }
+       ],
+    [
+	outp(cout, "Hello World\n")
+    ],
+    [ac_cv_newstreams="yes"],
+    [AC_DEFINE(_STLP_HAS_NO_NEW_IOSTREAMS) ac_cv_newstreams="no"])
+AC_MSG_RESULT($ac_cv_newstreams)
+
+dnl end namespace-related tests
+
+fi
+
+AC_MSG_CHECKING(for <exception> header with class "exception" defined)
+AC_TRY_COMPILE(
+    [
+     #include <exception>
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+     class my_exception: public $_TEST_STD::exception {};
+     my_exception mm;
+    ],
+    [],
+    [ac_cv_exception_header="yes"],
+    [AC_DEFINE(_STLP_NO_EXCEPTION_HEADER) ac_cv_exception_header="no"]
+)
+AC_MSG_RESULT($ac_cv_exception_header)
+
+AC_MSG_CHECKING(builtin constructor bug)
+AC_TRY_RUN( [
+# ifdef _STLP_USE_NEW_STYLE_HEADERS
+#  include <cassert>
+#  include <cstdio>
+#  include <cstring>
+#  include <new>
+# else
+#  include <assert.h>
+#  include <stdio.h>
+#  include <string.h>
+#  include <new.h>
+# endif
+int main(int, char**) {
+	int i;
+	double buf[1000];
+	char* pc = (char*)buf;
+	short* ps = (short*)buf;
+	int* pi = (int*)buf;
+	long* pl = (long*)buf;
+	double* pd = (double*)buf;
+	float* pf = (float*)buf;
+	for (i=0; i<100; i++) {
+	   	new(pc) char();
+        	assert(char()==0 && *pc==0);
+		sprintf(pc,"lalala\n");
+	        new (ps) short();	
+		assert(short()==0 && *ps ==0);
+		sprintf(pc,"lalala\n");
+	        new (pi) int();
+		assert(int()==0 && *pi == 0);
+		sprintf(pc,"lalala\n");
+	        new (pl) long();	
+		assert(long()==0 && *pl == 0);
+		sprintf(pc,"lalala\n");
+	        new (pf) float();	
+		assert(float()==0.0 && *pf == 0.0);
+		sprintf(pc,"lalala\n");
+	        new (pd) double();	
+		assert(double()==0.0 && *pd == 0.0);
+		sprintf(pc,"lalala\n");
+	}
+  return 0;
+}
+], 
+[ ac_cv_builtin_c_bug="no"],
+[ AC_DEFINE(_STLP_DEFAULT_CONSTRUCTOR_BUG) ac_cv_builtin_c_bug="yes"],
+[ AC_DEFINE(_STLP_DEFAULT_CONSTRUCTOR_BUG) ac_cv_builtin_c_bug="yes"]
+)
+AC_MSG_RESULT($ac_cv_builtin_c_bug)
+
+AC_MSG_CHECKING(for trivial constructor bug)
+AC_TRY_LINK(
+    [struct output_iterator_tag {};
+     void tc_bug_foo(output_iterator_tag) {}
+     inline void tc_test_foo()  { tc_bug_foo(output_iterator_tag()); }],
+    [tc_test_foo();],
+    [ac_cv_tc_bug="no"],
+    [AC_DEFINE(_STLP_TRIVIAL_CONSTRUCTOR_BUG) ac_cv_tc_bug="yes"])
+AC_MSG_RESULT($ac_cv_tc_bug)
+
+AC_MSG_CHECKING(for trivial destructor bug)
+AC_TRY_LINK(
+    [struct output_iterator_tag {output_iterator_tag() {} };
+	output_iterator_tag* td_bug_bar ;
+	],
+    [ td_bug_bar->~output_iterator_tag();
+     ],
+    [ac_cv_td_bug="no"],
+    [AC_DEFINE(_STLP_TRIVIAL_DESTRUCTOR_BUG) ac_cv_td_bug="yes"])
+AC_MSG_RESULT($ac_cv_td_bug)
+
+AC_MSG_CHECKING(for explicit function template arguments)
+AC_TRY_LINK(
+    [  template <class T> class foo;
+       template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs);
+      template <class T> class foo {
+	private:
+	  T bar;
+	friend bool operator== <> (const foo<T>&,const foo<T>&);
+     };
+     template<class T> bool operator==(const foo<T>& lhs,const foo<T>& rhs) {
+	return  lhs.bar==rhs.bar;
+     }],
+    [ foo<int> f1, f2;
+      int ret= (f1==f2) ],
+    [ _NULLARGS="<>" ac_cv_expl_fun_args="yes"],
+    [ AC_DEFINE(_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS) ac_cv_expl_fun_args="no" _NULLARGS=""])
+AC_MSG_RESULT($ac_cv_expl_fun_args)
+
+AC_MSG_CHECKING(for template parameter baseclass matching)
+AC_TRY_LINK(
+    [struct output_iterator_tag {};
+     struct derived1_tag : public output_iterator_tag {};
+     struct derived2_tag : public derived1_tag {};
+     template<class T> struct output_iterator { 
+	public:
+	output_iterator() {} 
+	~output_iterator() {} 
+	friend inline int operator== $_NULLARGS (const output_iterator<T>&, 
+                                      const output_iterator<T>&);
+	};
+     template<class T> inline int operator==(const output_iterator<T>&, 
+                              	        const output_iterator<T>&) {
+       return 0;
+     }
+     template<class T> inline output_iterator_tag
+     iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+     template <class T>
+     struct derived_iterator : public output_iterator<T> {
+	public:
+	derived_iterator() {} 
+	~derived_iterator() {}
+	};
+     template<class T> inline T select_foo(T t, output_iterator_tag) { return t;}     
+     template<class T> inline int select_foo_2(T, T,
+                                             output_iterator_tag) { return 0;}     
+     template<class T> inline T tbase_foo(T pm )  { 
+	derived_iterator<T> di1, di2; int i( di1==di2 && pm);
+	return select_foo((int)1,iterator_category(derived_iterator<T>())); 
+    }
+    ],
+    [ (void)tbase_foo((int)1); ],
+    [ac_cv_base_match="yes"],
+    [AC_DEFINE(_STLP_BASE_MATCH_BUG) ac_cv_base_match="no"])
+AC_MSG_RESULT($ac_cv_base_match)
+
+AC_MSG_CHECKING(for non-template parameter baseclass matching )
+AC_TRY_LINK(
+    [struct output_iterator_tag {};
+     struct derived1_tag : public output_iterator_tag {};
+     struct derived2_tag : public derived1_tag {};
+     struct derived3_tag : public derived2_tag {};
+     template<class T> struct output_iterator { 
+	public:
+	output_iterator() {} 
+	~output_iterator() {} 
+	};
+     template<class T> inline output_iterator_tag
+     iterator_category(const output_iterator<T>&) {return output_iterator_tag();}
+     template <class T>
+     struct derived_iterator : public output_iterator<T> {
+	public:
+	derived_iterator() {} 
+	~derived_iterator() {}
+	};
+     template<class T> inline int select_foo_2(T, T,
+                                             output_iterator_tag) { return 0;}     
+     template<class T> inline int select_foo_2(T, T,
+                                             derived1_tag) { return 0;}     
+     template<class T> inline void nont_base_foo(T pm )  { 
+	derived_iterator<T> di1, di2; 
+	(void)select_foo_2(di1, (const derived_iterator<T>&)di2, derived3_tag());
+    }
+    ],
+    [ nont_base_foo((int)1); ],
+    [ac_cv_nont_base_match="yes"],
+    [AC_DEFINE(_STLP_NONTEMPL_BASE_MATCH_BUG) ac_cv_nont_base_match="no"])
+AC_MSG_RESULT($ac_cv_nont_base_match)
+
+AC_MSG_CHECKING(for nested type parameters bug)
+AC_TRY_LINK(
+    [template<class T> struct nt_o { typedef int ii; inline ii foo(ii);};
+     template <class T> inline nt_o<T>::ii nt_o<T>::foo(ii) { return 0; }],
+    [],
+    [ac_cv_nested_type_param_bug="no"],
+    [AC_DEFINE(_STLP_NESTED_TYPE_PARAM_BUG) ac_cv_nested_type_param_bug="yes"])
+AC_MSG_RESULT($ac_cv_nested_type_param_bug)
+
+
+AC_MSG_CHECKING(if inherited template typedefs broken completely)
+AC_TRY_LINK(
+    [
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg2 second_argument_type;
+    typedef Result result_type;
+};     
+
+template <class T>
+struct equal_to : public binary_function<T, T, int> {
+    int operator()(const T& x, const T& y) const { return x == y; }
+};
+
+template <class Predicate> 
+class binary_negate 
+    : public binary_function<$__TYPENAME Predicate::first_argument_type,
+			     $__TYPENAME Predicate::second_argument_type, 
+                             int> {
+protected:
+    Predicate pred;
+public:
+    binary_negate(const Predicate& x = Predicate()) : pred(x) {}
+    int operator() (const $__TYPENAME Predicate::first_argument_type& x, 
+		    const $__TYPENAME Predicate::second_argument_type& y) const {
+	return !pred(x, y); 
+    }
+};
+      typedef equal_to<int> eq_int;
+      typedef binary_negate<equal_to<int> > int_negate;
+      int_negate n;
+ ],
+    [
+      (void)n(1,2);
+    ],
+    [ac_cv_typebug="no"],
+    [AC_DEFINE(_STLP_BASE_TYPEDEF_BUG) 
+     AC_DEFINE(_STLP_BASE_TYPEDEF_OUTSIDE_BUG) ac_cv_typebug="yes"])
+AC_MSG_RESULT($ac_cv_typebug)
+
+AC_MSG_CHECKING(if inherited typedefs visible from outside)
+AC_TRY_COMPILE(
+    [
+template <class Arg1, class Arg2, class Result>
+struct binary_function {
+    typedef Arg1 first_argument_type;
+    typedef Arg1 second_argument_type;
+    typedef Result result_type;
+};     
+
+
+template <class T>
+class plus : public binary_function<T, T, T> {
+public:
+    plus() {}
+    plus(const T&) {}
+    T operator()(const T& x, const T& y) const { return x + y; };
+};
+
+plus<int> p;
+plus<int>::first_argument_type a;
+],
+    [],
+    [ac_cv_outside_typedef="yes"],
+    [AC_DEFINE(_STLP_BASE_TYPEDEF_OUTSIDE_BUG) ac_cv_outside_typedef="no"])
+AC_MSG_RESULT($ac_cv_outside_typedef)
+
+# fi
+
+AC_MSG_CHECKING(if private type static members initializable)
+AC_TRY_COMPILE(
+    [struct p_Class { private: struct str_ { 
+	int a; str_(int i) : a(i) {}}; static str_ my_int; 
+     };
+     p_Class::str_ p_Class::my_int(0); 
+     ],
+    [],
+    [ac_cv_private="yes"],
+    [AC_DEFINE(_STLP_UNINITIALIZABLE_PRIVATE) ac_cv_private="no"])
+AC_MSG_RESULT($ac_cv_private)
+
+
+AC_MSG_CHECKING(for const member constructor bug)
+AC_TRY_LINK([
+template <class T1, class T2>
+struct pair {
+    T1 first;
+    T2 second;
+    pair(): first(T1()), second(T2()) {}
+    pair(const pair<T1,T2>& o) : first(o.first), second(o.second) {}
+};
+pair< const int, const int > p;  
+     ],
+    [],
+    [ac_cv_const_constructor_bug="no"],
+    [AC_DEFINE(_STLP_CONST_CONSTRUCTOR_BUG) ac_cv_const_constructor_bug="yes"])
+AC_MSG_RESULT($ac_cv_const_constructor_bug)
+
+AC_MSG_CHECKING(for loop inline problems)
+AC_TRY_COMPILE(
+    [inline int il_foo (int a) { 
+      int i; for (i=0; i<a; i++) a+=a;  while (i>0) a-=3; return a; }],
+    [(void)il_foo(2);],
+    [ac_cv_inline_problems="no"],
+    [AC_DEFINE(_STLP_LOOP_INLINE_PROBLEMS) ac_cv_inline_problems="yes"])
+if test "$ac_cv_inline_problems" = no; then
+# check if no warnings have been issued
+  if `check_warning` ; then
+     ac_cv_inline_problems="no"
+  else
+   AC_DEFINE(_STLP_LOOP_INLINE_PROBLEMS)
+   ac_cv_inline_problems="yes"
+  fi
+fi
+AC_MSG_RESULT($ac_cv_inline_problems)
+
+
+AC_MSG_CHECKING(if arrow operator always get instantiated)
+AC_TRY_LINK(
+    [
+     template <class T> struct um_foo { T* ptr; 
+	T* operator ->() { return &(operator*());}
+	T  operator *()  { return *ptr; }
+     };
+     template <class T>
+	int operator == ( const um_foo<T>& x, const um_foo<T>& y)
+	{
+    		return *x == *y;
+	}
+     struct um_tag { int a ; };
+     um_foo<um_tag> f;
+     um_foo<int> a;
+     ],
+    [ 
+     int b(5); a.ptr=&b;],
+    [ac_cv_unused_required="no"],
+    [AC_DEFINE(_STPL_NO_ARROW_OPERATOR) ac_cv_unused_required="yes"]
+    )
+AC_MSG_RESULT($ac_cv_unused_required)
+
+AC_MSG_CHECKING(for pointer-to-member parameter bug)
+AC_TRY_COMPILE(
+    [
+struct pmf_foo {
+	int bar() { return 0; };
+};
+
+template <class Class, class Result> 
+class mem_fun_t {
+protected:
+    typedef Result (Class::*fun_type)(void);
+    fun_type ptr;
+public:
+    mem_fun_t() {}
+    mem_fun_t(fun_type p) : ptr(p) {}
+    Result operator()(Class* x) const { return (x->*ptr)();}
+};
+
+template <class Class, class Result>
+inline mem_fun_t <Class, Result> 
+mem_fun(Result (Class::*ptr)(void)) {
+    return mem_fun_t<Class, Result>(ptr);
+}
+],
+    [pmf_foo pmf; (void)mem_fun(&pmf_foo::bar)(&pmf)],
+    [ac_cv_pmf_bug="no"],
+    [AC_DEFINE( _STLP_MEMBER_POINTER_PARAM_BUG) ac_cv_pmf_bug="yes"])
+AC_MSG_RESULT($ac_cv_pmf_bug)
+
+AC_MSG_CHECKING(if bad_alloc defined in <new>)
+AC_TRY_COMPILE(
+    [
+     #if !defined (_STLP_NO_NEW_STYLE_HEADERS)
+     #include <new>
+     #else
+     #include <new.h>
+     #endif
+
+     # if !defined (_STLP_HAS_NO_NAMESPACES)
+       using namespace $_TEST_STD;
+     # endif
+
+     bad_alloc badalloc_foo() { bad_alloc err; return err;}],
+    [(void)badalloc_foo()],
+    [ac_cv_bad_alloc="yes"],
+    [AC_DEFINE(_STLP_NO_BAD_ALLOC) ac_cv_bad_alloc="no"])
+AC_MSG_RESULT($ac_cv_bad_alloc)
+
+AC_MSG_CHECKING(for __type_traits automatic specialization)
+AC_TRY_LINK(
+    [template <class T> int tt_foo(const T&) {
+	typedef __type_traits<T> traits;
+	return 0;
+     }],
+    [(void)tt_foo(5)],
+    [AC_DEFINE(_STLP_AUTOMATIC_TYPE_TRAITS) ac_cv_type_traits="yes"],
+    [ac_cv_type_traits="no"])
+AC_MSG_RESULT($ac_cv_type_traits)
+
+
+# package options - exceptions
+AC_MSG_RESULT(***)
+AC_MSG_RESULT($0: Setting implementation options...)
+AC_MSG_RESULT(***)
+
+if test "$ac_cv_exceptions" = yes; then
+AC_ARG_ENABLE(exceptions,[--enable-exceptions Use exceptions support (default if posssible)
+ --disable-exceptions Don't use exceptions support],
+[
+case "$enableval" in
+           no) AC_DEFINE(_STLP_NO_EXCEPTIONS)
+               AC_MSG_RESULT(Config arg --disable-exceptions : disabling exceptions by user request);;
+           *)  AC_MSG_RESULT(Config default: exceptions enabled)
+esac
+],
+[AC_MSG_RESULT(Config default: exceptions enabled) ]
+)
+else
+ AC_MSG_RESULT(Compiler restriction : no exceptions support used)
+fi
+
+if test "$ac_cv_namespaces" = yes; then
+AC_ARG_ENABLE(relops,[--enable-relops Separate rel_ops namespace for relational operators (default if posssible)
+--disable-relops No separate rel_ops namespace for relational operators],
+[
+case "$enableval" in
+	no) AC_DEFINE(_STLP_NO_RELOPS_NAMESPACE) 
+            AC_MSG_RESULT(Config arg --disable-relops : no std::rel_ops namespace by user request);;
+	 *) AC_MSG_RESULT(Config default: Separate std::rel_ops namespace for relational operators)
+esac
+],
+[AC_MSG_RESULT(Config default: Separate std::rel_ops namespace for relational operators)]
+)
+else
+ AC_DEFINE(_STLP_NO_RELOPS_NAMESPACE) 
+fi
+
+if test "$ac_cv_newheaders" = yes; then
+AC_ARG_ENABLE(new-style-headers,[--enable-new-style-headers Use new-style headers (default)
+--disable-new-style-headers Don't use new-style headers],
+[
+case "$enableval" in
+	no) AC_DEFINE(_STLP_NO_NEW_STYLE_HEADERS) 
+            AC_MSG_RESULT(Config arg --disable-new-style-headers : not using new-style headers);;
+	 *) AC_MSG_RESULT(Config default: using new-style headers)
+esac
+],
+[AC_MSG_RESULT(Config default: using new-style headers)]
+)
+else
+ AC_DEFINE(_STLP_NO_NEW_STYLE_HEADERS)
+fi
+
+if test "$ac_cv_newstreams" = yes; then
+AC_ARG_ENABLE(new-iostreams,[--enable-new-iostreams Use new iostreams (default)
+--disable-new-iostreams Don't use new iostreams],
+[
+case "$enableval" in
+	no) AC_DEFINE(_STLP_NO_NEW_IOSTREAMS) 
+            AC_MSG_RESULT(Config arg --disable-new-iostreams : not using new iostreams);;
+	 *) AC_MSG_RESULT(Config default: using new iostreams)
+esac
+],
+[AC_MSG_RESULT(Config default: using new iostreams)]
+)
+else
+  AC_DEFINE(_STLP_NO_NEW_IOSTREAMS)
+fi
+
+AC_ARG_ENABLE(sgi-allocators,[--enable-sgi-allocators : set default parameter to SGI-style default alloc, not allocator<T>
+ --disable-sgi-allocators : use allocator<T> if possible],
+[
+case "$enableval" in
+	  yes ) AC_MSG_RESULT(Config arg  --enable-sgi-allocators : SGI-style alloc as default allocator) 
+                AC_DEFINE(_STLP_USE_RAW_SGI_ALLOCATORS);;
+	    * ) AC_MSG_RESULT(Config default: using allocator<T> as default allocator if possible )
+esac
+],
+[
+ AC_MSG_RESULT(Config default: using allocator<T> as default allocator if possible)
+]
+)
+
+AC_ARG_ENABLE(malloc,[--enable-malloc : set default alloc to malloc-based allocator ( malloc_alloc_template<instance_no>, alloc.h )
+--disable-malloc : choose (default) sgi node allocator (__alloc<threads,no>  alloc.h )],
+[
+case "$enableval" in
+	  yes ) AC_MSG_RESULT(Config arg  --enable-malloc : setting malloc_alloc as default alloc) 
+                AC_DEFINE(_STLP_USE_MALLOC);;
+	    * ) AC_MSG_RESULT(Config default: not using malloc_alloc as default alloc)
+esac
+],
+[
+ AC_MSG_RESULT(Config default: not using malloc_alloc as default alloc)
+]
+)
+
+AC_ARG_ENABLE(newalloc,[--enable-newalloc : set default alloc to new-based allocator ( new_alloc, alloc.h )
+--disable-newalloc : choose (default) sgi allocator (__alloc<threads,no>  alloc.h )],
+[
+case "$enableval" in
+	  yes ) AC_MSG_RESULT(Config arg  --enable-newalloc : setting new_alloc as default alloc) 
+                AC_DEFINE(_STLP_USE_NEWALLOC);;
+	    * )
+                AC_MSG_RESULT(Config default: not using new_alloc as default alloc)
+esac
+],
+[
+ AC_MSG_RESULT(Config default: not using new_alloc as default alloc)
+]
+)
+
+AC_ARG_ENABLE(defalloc,[--enable-defalloc : make HP-style defalloc.h included in alloc.h )
+--disable-defalloc : leave defalloc.h alone],
+[
+case "$enableval" in
+	  no ) AC_MSG_RESULT(Config arg --disable-defalloc : not including HP-style defalloc.h into alloc.h);;
+
+	  * ) AC_MSG_RESULT(Config default : including HP-style defalloc.h into alloc.h) 
+                AC_DEFINE(_STLP_USE_DEFALLOC)
+esac
+],
+[
+          AC_MSG_RESULT(Config default : not including HP-style defalloc.h into alloc.h)
+]
+)
+
+
+AC_ARG_ENABLE(debugalloc,[--enable-debugalloc : use debug versions of allocators
+--disable-debugalloc : not using debug allocators],
+[
+case "$enableval" in
+	  yes ) AC_MSG_RESULT(Config arg --enable-debugalloc : use debug versions of allocators ) 
+                AC_DEFINE(_STLP_DEBUG_ALLOC);;
+	  * )
+          AC_MSG_RESULT(Config default : not using debug allocators)
+esac
+],
+[
+          AC_MSG_RESULT(Config default : not using debug allocators)
+]
+)
+
+
+AC_ARG_ENABLE(abbrevs,[--enable-abbrevs : use abbreviated class names internally for linker benefit (don't affect interface)
+--disable-abbrevs : don't use abbreviated names],
+[
+case "$enableval" in
+	  yes ) AC_MSG_RESULT(Config arg --enable-abbrevs : using abbreviated class names internally) 
+                AC_DEFINE(_STLP_USE_ABBREVS);;
+	  * )
+          AC_MSG_RESULT(Config default : not using abbreviated class names internally)
+esac
+],
+[
+          AC_MSG_RESULT(Config default : not using abbreviated class names internally)
+]
+)
+
+
+AC_DEFINE(__AUTO_CONFIGURED)
+
+AC_MSG_RESULT(***)
+AC_MSG_RESULT($0: setting up headers...)
+AC_MSG_RESULT(***)
+AC_OUTPUT(stlconf.h)
+AC_MSG_RESULT(***)
+AC_MSG_RESULT($0: STLport configured for use with \"${CXX}\" compiler, CXXFLAGS used: \"${CXXFLAGS}\".)
+AC_MSG_RESULT($0: To restore original settings - run \"./unconfigure\" or copy stlconf.h.in to stlconf.h.)
+AC_MSG_RESULT(***)
+
diff --git a/src/STLport/config/new_compiler/stlconf.h.in b/src/STLport/config/new_compiler/stlconf.h.in
new file mode 100644
index 0000000..de7e9ed
--- /dev/null
+++ b/src/STLport/config/new_compiler/stlconf.h.in
@@ -0,0 +1,133 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STLCONF_H
+# define _STLP_STLCONF_H
+
+# undef __AUTO_CONFIGURED
+
+//==========================================================
+// Getting proper values of autoconf flags
+// if you ran 'configure', __AUTO_CONFIGURED is set to 1 and
+// specific compiler features will be used.
+// Otherwise, the <stlcomp.h> header will be included for per-version
+// features recognition.
+//==========================================================
+# if defined (__AUTO_CONFIGURED)
+// auto-configured section
+
+# undef _STLP_NO_EXCEPTIONS
+# undef _STLP_NO_NAMESPACES
+# undef _STLP_NO_RELOPS_NAMESPACE
+# undef _STLP_NO_NEW_NEW_HEADER 
+
+# undef _STLP_NO_NEW_IOSTREAMS
+
+// select threads strategy
+# undef _PTHREADS
+# undef _NOTHREADS
+
+// select SGI-style alloc instead of allocator<T>
+# undef _STLP_USE_SGI_ALLOCATORS
+
+// select allocation method you like
+# undef _STLP_USE_MALLOC
+# undef _STLP_USE_NEWALLOC
+
+// this one is not mandatory, just enabled
+# undef _STLP_USE_DEFALLOC
+
+// define _STLP_USE_ABBREVS if your linker has trouble with long 
+// external symbols
+# undef _STLP_USE_ABBREVS
+
+
+// unsigned 32-bit integer type
+#  define _STLP_UINT32_T unsigned
+#  undef _STLP_NO_BOOL
+#  undef _STLP_DONT_USE_BOOL_TYPEDEF
+#  undef _STLP_YVALS_H
+#  undef _STLP_LIMITED_DEFAULT_TEMPLATES
+#  undef _STLP_DEFAULT_TYPE_PARAM
+#  undef _STLP_NO_STATIC_TEMPLATE_DATA
+#  undef _STLP_RAND48
+#  undef _STLP_LOOP_INLINE_PROBLEMS
+
+#  undef _STLP_HAS_NO_NAMESPACES
+
+#  undef _STLP_NEED_TYPENAME
+#  undef _STLP_NEED_EXPLICIT
+#  undef _STLP_HAS_NO_EXCEPTIONS
+#  undef _STLP_NO_EXCEPTION_SPEC
+#  undef _STLP_WEAK_ATTRIBUTE
+#  undef _STLP_BASE_MATCH_BUG
+#  undef _STLP_NONTEMPL_BASE_MATCH_BUG
+#  undef _STLP_NESTED_TYPE_PARAM_BUG
+#  undef _STLP_NO_ARROW_OPERATOR
+#  undef _STLP_UNINITIALIZABLE_PRIVATE
+#  undef _STLP_BASE_TYPEDEF_BUG
+#  undef _STLP_BASE_TYPEDEF_OUTSIDE_BUG
+#  undef _STLP_CONST_CONSTRUCTOR_BUG
+
+#  undef _STLP_NO_NEW_STYLE_CASTS
+#  undef _STLP_NO_WCHAR_T
+#  undef _STLP_WCHAR_T_IS_USHORT
+#  undef _STLP_LONG_LONG
+#  undef _STLP_NO_LONG_DOUBLE
+#  undef _STLP_NEED_MUTABLE
+#  undef _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+#  undef _STLP_NO_BAD_ALLOC
+#  undef _STLP_DEBUG_ALLOC
+#  undef _STLP_NO_MEMBER_TEMPLATES
+#  undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+#  undef _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+#  undef _STLP_NO_FRIEND_TEMPLATES
+#  undef _STLP_NO_QUALIFIED_FRIENDS
+#  undef _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+#  undef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+#  undef _STLP_AUTOMATIC_TYPE_TRAITS
+#  undef _STLP_MEMBER_POINTER_PARAM_BUG
+#  undef _STLP_NON_TYPE_TMPL_PARAM_BUG
+#  undef _STLP_NO_DEFAULT_NON_TYPE_PARAM
+#  undef _STLP_NO_METHOD_SPECIALIZATION
+#  undef _STLP_STATIC_ARRAY_BUG
+#  undef _STLP_STATIC_CONST_INIT_BUG
+#  undef _STLP_TRIVIAL_CONSTRUCTOR_BUG
+#  undef _STLP_TRIVIAL_DESTRUCTOR_BUG
+#  undef _STLP_BROKEN_USING_DIRECTIVE
+#  undef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+#  undef _STLP_NO_EXCEPTION_HEADER
+#  undef _STLP_DEFAULT_CONSTRUCTOR_BUG
+
+#  undef _STLP_HAS_NO_NEW_IOSTREAMS
+#  undef _STLP_HAS_NO_NEW_C_HEADERS 
+#  undef _STLP_STATIC_CONST_INIT_BUG
+// new ones
+#  undef _STLP_THROW_RETURN_BUG
+// unimp
+#  undef _STLP_LINK_TIME_INSTANTIATION
+#  undef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+// unimp
+#  undef _STLP_NO_TEMPLATE_CONVERSIONS
+# endif /* AUTO_CONFIGURED */
+
+//==========================================================
+
+
+#endif /* __STLCONF_H */
+
diff --git a/src/STLport/config/new_compiler/unconfigure b/src/STLport/config/new_compiler/unconfigure
new file mode 100644
index 0000000..c91da28
--- /dev/null
+++ b/src/STLport/config/new_compiler/unconfigure
@@ -0,0 +1,3 @@
+#!/bin/sh
+cp stlconf.h.in stlconf.h
+echo "STLport unconfigured."
diff --git a/src/STLport/config/stl_apcc.h b/src/STLport/config/stl_apcc.h
new file mode 100644
index 0000000..b979092
--- /dev/null
+++ b/src/STLport/config/stl_apcc.h
@@ -0,0 +1,32 @@
+// STLport config file for Apogee 4.x
+
+#  define _STLP_NO_NEW_NEW_HEADER 1
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// #  define _STLP_RAND48 1
+#  define _STLP_LONG_LONG long long
+#  define _STLP_NO_BAD_ALLOC 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+// #  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+#  define _STLP_NO_EXCEPTION_HEADER 1
+
+# undef  _STLP_LINK_TIME_INSTANTIATION
+# define _STLP_LINK_TIME_INSTANTIATION 1
+
+# ifdef __STDLIB
+#  undef _STLP_HAS_NO_NEW_IOSTREAMS
+#  undef _STLP_NO_NEW_C_HEADERS
+#  undef _STLP_NO_NEW_NEW_HEADER
+#  undef _STLP_NO_BAD_ALLOC
+#  undef _STLP_LONG_LONG
+# else
+#  undef  _STLP_NO_EXCEPTION_SPEC
+#  define _STLP_NO_EXCEPTION_SPEC 1
+# endif
+
+
diff --git a/src/STLport/config/stl_apple.h b/src/STLport/config/stl_apple.h
new file mode 100644
index 0000000..eb7da79
--- /dev/null
+++ b/src/STLport/config/stl_apple.h
@@ -0,0 +1,112 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// common configuration settings for Apple MPW MrCpp / SCpp
+
+#if defined(__MRC__) && __MRC__ < 0x500
+# error Apple's MPW MrCpp v.5.0.0 or better compiler required
+#endif
+#if defined(__SC__) && __SC__ < 0x890
+# error Apple's MPW SCpp v.8.9.0 or better compiler required
+#endif
+
+#ifdef qMacApp
+# ifndef __CONDITIONALMACROS__ // skip including ConditionalMacros_AC.h if ConditionalMacros.h is already included
+# include <CoreSwitches_AC.h>
+# include <ConditionalMacros_AC.h>
+# include <Types_AC.h>
+# define _STLP_FILE__ _FILE_AC
+# define _STLP_DEBUG_MESSAGE      
+# define __stl_debug_message ProgramBreak_AC
+# include <ConditionalMacros.h>
+# endif
+# include <Types.h>
+#else
+# include <ConditionalMacros.h>
+# include <Types.h>
+#endif
+
+#define _STLP_UINT32_T UInt32
+typedef int wint_t;
+
+#ifndef TYPE_BOOL
+# error <ConditionalMacros.h> must be included. (TYPE_BOOL)
+#endif
+#if !TYPE_BOOL
+# define _STLP_NO_BOOL
+# define _STLP_DONT_USE_BOOL_TYPEDEF
+#endif
+
+#ifndef TYPE_LONGLONG
+# error <ConditionalMacros.h> must be included. (TYPE_LONGLONG)
+#endif
+#if TYPE_LONGLONG
+# define _STLP_LONG_LONG long long
+#endif
+
+#if !__option(exceptions)
+# define _STLP_HAS_NO_EXCEPTIONS
+#endif
+
+#define _STLP_DEBUG_MESSAGE_POST DebugStr("\pSTL diagnosis issued. See 'stderr' for detail.");
+#define _STLP_ASSERT_MSG_TRAILER " "
+
+#ifdef _STLP_DEBUG
+#   define _STLP_THROW(x) (DebugStr("\pSTL is about to throw exception: "#x),throw x)
+#endif
+
+#if defined(__MRC__)
+# ifndef __spillargs
+#  define __spillargs 1 // MrCpp requires this symbol to be defined as 1 to properly handle va_start; ref.[ file stdarg.h; line 26 ]
+# endif
+#endif
+
+#if defined(__SC__)
+#define _STLP_VENDOR_LONG_DOUBLE_MATH				//*TY 12/03/2000 - SCpp's native math type is long double
+#endif
+
+#ifndef _STLP_NATIVE_INCLUDE_PATH
+# if __option(unix_includes)
+#  define _STLP_NATIVE_INCLUDE_PATH ../CIncludes 	// expects the alias to {CIncludes} under the same folder as {STL}
+# else
+#  define _STLP_NATIVE_INCLUDE_PATH ::CIncludes 	// expects the alias to {CIncludes} under the same folder as {STL}
+# endif
+#endif
+#if !defined(_STLP_MAKE_HEADER)
+# if !__option(unix_includes)
+#  define _STLP_MAKE_HEADER(path, header) <path:header> // Mac uses ":" for directory delimiter
+# endif
+#endif
+
+# define _STLD _DBG	// to keep the length of generated symbols within the compiler limitation
+
+#define _STLP_OWN_IOSTREAMS
+#define _STLP_USE_STDIO_IO 1						//*TY 02/24/2000 - see also ; ref.[ file _fstream.h; line 36 ]
+#define _STLP_NO_THREADS							//*TY 12/17/2000 - multi-thread capability not explored, yet.
+#undef _REENTRANT									//*ty 11/24/2001 - to make sure no thread facility is activated
+#define _NOTHREADS									//*ty 12/07/2001 - 
+
+// native library limitations
+#define _STLP_VENDOR_GLOBAL_STD						// mpw's c++ libs do not utilize namespace std yet
+#define _STLP_NO_BAD_ALLOC							// known limitation
+#define _STLP_HAS_NO_NEW_C_HEADERS					// known limitation
+#define _STLP_NO_NEW_NEW_HEADER						// known limitation
+#define _STLP_HAS_NO_NEW_IOSTREAMS					// known limitation
+#define _STLP_NO_NATIVE_MBSTATE_T					// known limitation
+#define _STLP_NO_NATIVE_WIDE_FUNCTIONS				// known limitation
+#define _STLP_NO_NATIVE_WIDE_STREAMS				// known limitation
+#define _STLP_INCOMPLETE_EXCEPTION_HEADER			// known limitation
+#define _STLP_BROKEN_EXCEPTION_CLASS				// known limitation
+
+// compiler limitations
+# define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+
+# define _STLP_MPWFIX_TRY try{											//*TY 06/01/2000 - exception handling bug workaround
+# define _STLP_MPWFIX_CATCH }catch(...){throw;}							//*TY 06/01/2000 - exception handling bug workaround
+# define _STLP_MPWFIX_CATCH_ACTION(action) }catch(...){action;throw;}	//*TY 06/01/2000 - exception handling bug workaround
+# define _STLP_THROW_RETURN_BUG						// known limitation 
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION		// known limitation
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX		// known limitation
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER		// known limitation
+# define _STLP_NO_RELOPS_NAMESPACE					// known limitation
+// end of stl_apple.h
diff --git a/src/STLport/config/stl_as400.h b/src/STLport/config/stl_as400.h
new file mode 100644
index 0000000..c9595c2
--- /dev/null
+++ b/src/STLport/config/stl_as400.h
@@ -0,0 +1,60 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// AS/400 C++ config
+
+# ifdef _REENTRANT
+#  define _PTHREADS
+# endif
+
+#  define _STLP_NO_NEW_NEW_HEADER 1
+
+#  define _STLP_NO_BOOL
+#  define _STLP_LIMITED_DEFAULT_TEMPLATES
+
+#  define _STLP_HAS_NO_NAMESPACES
+#  define _STLP_NEED_TYPENAME
+#  define _STLP_NEED_EXPLICIT
+#  define _STLP_HAS_NO_EXCEPTIONS
+#  define _STLP_NO_EXCEPTION_SPEC
+#  define _STLP_NO_ARROW_OPERATOR
+#  define _STLP_NO_NEW_STYLE_CASTS
+
+#  define _STLP_NEED_MUTABLE
+#  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+#  define _STLP_NO_BAD_ALLOC
+#  define _STLP_NO_MEMBER_TEMPLATES
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+#  define _STLP_NO_FRIEND_TEMPLATES
+#  define _STLP_NO_QUALIFIED_FRIENDS
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+
+#  define _STLP_NO_METHOD_SPECIALIZATION
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+
+// #  define _STLP_NO_EXCEPTION_HEADER
+
+#  define _STLP_HAS_NO_NEW_IOSTREAMS
+#  define _STLP_HAS_NO_NEW_C_HEADERS 
+
+#  define _STLP_STATIC_CONST_INIT_BUG
+#  define _STLP_THROW_RETURN_BUG
+#  define _STLP_LINK_TIME_INSTANTIATION
+#  define _STLP_NO_TEMPLATE_CONVERSIONS
+
+#  define _STLP_UNINITIALIZABLE_PRIVATE 1
+#  define _STLP_STATIC_ARRAY_BUG 1
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+#  define _STLP_TRIVIAL_DESTRUCTOR_BUG  1
+
+#  if defined(_LONG_LONG)
+#    define _STLP_LONG_LONG long long
+#  endif
+// #  define _STLP_LONG_DOUBLE 1
+#  if defined(_PTHREADS)
+#    define _MULTI_THREADED
+#  endif
+// fbp : to fix __partition() problem
+# define _STLP_NONTEMPL_BASE_MATCH_BUG 1
diff --git a/src/STLport/config/stl_bc.h b/src/STLport/config/stl_bc.h
new file mode 100644
index 0000000..95e7a00
--- /dev/null
+++ b/src/STLport/config/stl_bc.h
@@ -0,0 +1,204 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+
+// versions ?
+# if defined(_STLP_DESIGNATED_DLL)
+#   define _STLP_CALL __cdecl __export
+# elif defined(_RTLDLL)
+#   define  _STLP_CALL __cdecl __import
+# else
+#   define  _STLP_CALL __cdecl
+# endif
+
+# define _USE_STLP
+# define _STLP_USE_OWN_MBSTATE_T
+// # define _STLP_USE_OWN_NAMESPACE
+# define _STLP_DLLEXPORT_NEEDS_PREDECLARATION
+# define _STLP_OPERATOR_SPEC_NEEDS_TEMPLATE_ARGS
+
+// most of <exception> contents is still in global namespace
+// # define _STLP_VENDOR_UNEXPECTED_STD
+
+// <limits> problem
+# define _STLP_STATIC_CONST_INIT_BUG
+
+// <bitset> problems
+# define _STLP_MEMBER_SPECIALIZATION_BUG
+# define  _STLP_HAS_SPECIFIC_PROLOG_EPILOG 1
+
+#if ( __BORLANDC__ < 0x540 )
+// Borland C++ Builder 3 (?)
+// those are assumptions, if some of them actually work, please let me know
+// #  define _STLP_STATIC_CONST_INIT_BUG 1
+// #  define _STLP_THROW_RETURN_BUG 1
+#  define _STLP_NO_TEMPLATE_CONVERSIONS 1
+#  define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+#  define _STLP_NO_TYPENAME_ON_RETURN_TYPE
+#else
+#  define _STLP_LONG_LONG  __int64
+#endif
+
+// BCB 2 or less (Borland 5.02)
+#if ( __BORLANDC__ < 0x530 )
+
+#  define _STLP_NO_OWN_IOSTREAMS
+#  undef  _STLP_OWN_IOSTREAMS
+
+#  define _STLP_GLOBAL_VENDOR_CSTD 1
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+#  define _STLP_NO_MEMBER_TEMPLATES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+#  define _STLP_NO_QUALIFIED_FRIENDS 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+#  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+#  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+#  define _STLP_MEMBER_SPECIALIZATION_BUG
+#  define _STLP_NO_EXCEPTION_HEADER 1
+#  define _STLP_NO_EXCEPTION_SPEC 1
+
+#  define _STLP_NO_BAD_ALLOC 1
+#  define _STLP_NO_ARROW_OPERATOR 1
+
+typedef char    mbstate_t;
+
+#  define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+#  define _STLP_NO_TYPEINFO
+#  define _STLP_NO_METHOD_SPECIALIZATION
+
+#endif
+
+// Borland 5.0x
+#if ( __BORLANDC__ < 0x520 )
+
+#  define _STLP_BROKEN_USING_DIRECTIVE 1
+#  define _STLP_EXPORT_KEYWORD _export
+#  define _STLP_IMPORT_KEYWORD _import
+#  define _STLP_EXPORT_TEMPLATE_KEYWORD _export
+#  define _STLP_IMPORT_TEMPLATE_KEYWORD _import
+#endif
+
+#if ( __BORLANDC__ < 0x501 )
+#   define  _STLP_NONTEMPL_BASE_MATCH_BUG 1
+#   define  _STLP_NO_WCHAR_T 1
+#endif
+
+// 4.x
+#if ( __BORLANDC__ < 0x500 )
+#   define _STLP_NESTED_TYPE_PARAM_BUG 1
+#   define _STLP_STATIC_ARRAY_BUG 1
+#   define _STLP_NO_BOOL 1
+#   define _STLP_HAS_NO_NAMESPACES 1
+#   define _STLP_NEED_TYPENAME 1
+#   define _STLP_NEED_EXPLICIT 1
+#   define _STLP_NEED_MUTABLE 1
+#   define _STLP_NO_WCHAR_T 1
+#endif
+
+// auto enable thread safety and exceptions:
+#   ifndef _CPPUNWIND
+#     define _STLP_HAS_NO_EXCEPTIONS
+#   endif
+
+#   if defined ( __MT__ ) && !defined (_NOTHREADS) && !defined (_REENTRANT)
+#     define _REENTRANT 1
+#   endif
+
+#  if defined ( __DEBUG ) && ( __DEBUG > 1 )
+#   define _STLP_DEBUG
+#  endif
+
+#  define _STLP_LIB_BASENAME "stlp"
+
+# if (__BORLANDC__ < 0x540)
+
+#  define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+#  define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+#  define _STLP_IMPORT_TEMPLATE_KEYWORD  extern
+#  define _STLP_EXPORT_TEMPLATE_KEYWORD
+
+#  define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+#  define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+
+#   if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+#    if ( defined (__DLL) || defined (_DLL) || defined (_WINDLL) || defined (_RTLDLL) \
+     || defined (_STLP_USE_DYNAMIC_LIB) ) \
+       && ! defined (_STLP_USE_STATIC_LIB)
+#      undef  _STLP_USE_DECLSPEC
+#      define _STLP_USE_DECLSPEC
+#     endif
+#   endif
+
+# else
+
+# define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+
+# define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+# define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+
+#  if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+#    if ( defined (__DLL) || defined (_DLL) || defined (_WINDLL) || defined (_RTLDLL) \
+     || defined(_AFXDLL) || defined (_STLP_USE_DYNAMIC_LIB) )
+#      undef  _STLP_USE_DECLSPEC
+#      define _STLP_USE_DECLSPEC 1
+#    endif
+
+#  ifndef _STLP_IMPORT_TEMPLATE_KEYWORD
+#   define _STLP_IMPORT_TEMPLATE_KEYWORD __declspec(dllimport)
+#  endif
+#  define _STLP_EXPORT_TEMPLATE_KEYWORD __declspec(dllexport)
+
+# if (__BORLANDC__ >= 0x560) && ! defined (_STLP_OWN_IOSTREAMS)
+// #  define _STLP_IS_NATIVE_LIB
+#  define _STLP_NATIVE_INCLUDE_PATH ../include/oldstl
+#  define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include/oldstl
+#  define _STLP_NATIVE_C_INCLUDE_PATH ../include/oldstl
+#  define _STLP_NATIVE_CPP_RUNTIME_PATH ../include/oldstl
+# endif
+
+# ifndef __BUILDING_STLPORT
+#  ifdef _STLP_DEBUG
+#   ifdef _MT
+#    ifdef _RTLDLL
+#      pragma comment(lib,"stlpmt_stldebug45.lib")
+#    else
+#     pragma comment(lib,"stlpmt_stldebugst.lib")
+#    endif
+#   else
+#    ifdef _RTLDLL
+#      pragma comment(lib,"stlp_stldebug45.lib")
+#    else
+#     pragma comment(lib,"stlp_stldebugst.lib")
+#    endif
+#   endif
+#  else
+#   ifdef _MT
+#    ifdef _RTLDLL
+#      pragma comment(lib,"stlpmt45.lib")
+#    else
+#     pragma comment(lib,"stlpmtst.lib")
+#    endif
+#  else
+#    ifdef _RTLDLL
+#      pragma comment(lib,"stlp45.lib")
+#    else
+#     pragma comment(lib,"stlpst.lib")
+#    endif
+#   endif
+#  endif
+# endif
+
+#  endif /* _STLP_OWN_IOSTREAMS */
+# endif
diff --git a/src/STLport/config/stl_como.h b/src/STLport/config/stl_como.h
new file mode 100644
index 0000000..f2d7d83
--- /dev/null
+++ b/src/STLport/config/stl_como.h
@@ -0,0 +1,209 @@
+
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+
+# define _STLP_UINT32_T unsigned int
+
+# define _STLP_HAS_NO_NEW_C_HEADERS
+// # define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+// # define _STLP_LONG_LONG
+
+
+//
+// ADDITIONS FOR COMEAU C++, made by Comeau Computing.
+// We can be reached through comeau at comeaucomputing.com
+// You shouldn't need to change anything below here for Comeau C++.
+// If you do, please tell us at comeau at comeaucomputing.com
+//
+// Changes made here, AND THROUGH ALL FILES, based upon the __COMO__ macro
+// (and SIMILAR NAMES INVOLVING COMO).... no doubt some of this will
+// change as SGI integrates the changes into their code base since
+// some changes are not really Comeau C++ specific, but required to
+// make the SGI code compliant with Standard C++).
+//
+// Testing was done with Comeau C++ 4.2.44 and 4.2.45.2.  Changes were made for
+// both Comeau relaxed mode and Comeau strict mode, especially for end user code
+// (that is, some of the .cxx files cannot compile in strict mode, because they
+// contain extensions to Standard C++, however their object code forms can
+// be used once compiled in relaxed mode, even if the end user code uses
+// strict mode).
+//
+// These changes may also work for some earlier versions of Comeau C++,
+// though we have not tested them.
+//
+// Actual mods made under RedHat 6.1 LINUX, should be ok with SuSE too and
+// other LINUX's, and older Caldera LINUX, Solaris/SPARC, SunOS, SCO UNIX,
+// and NetBSD. Other platforms may be added.  Comeau will also perform
+// custom ports for you.
+//
+// Check libcomo details at http://www.comeaucomputing.com/libcomo and
+// http://www.comeaucomputing.com
+//
+// History of Comeau changes (this is rough, as work was often going on in parallel):
+// BETA1 July 14, 2000, Initial port for RedHat 6.1 INTEL/ELF
+// BETA2 Aug   4, 2000, Stronger RedHat support
+//                      Support for Comeau strict mode for end user code
+// BETA3 Aug  22, 2000, Support for other LINUX/INTEL/ELF's, including older ones
+// BETA4 Sept  2, 2000, Initial support for SCO UNIX + other UNIX x86 SVR3's
+//                      Stronger support for end user Comeau strict mode
+// BETA5 Oct   5, 2000, Initial support for Solaris/SPARC
+//                      More SCO support (though still incomplete)
+// BETA6 Feb   5, 2001, Minor mods to accomodate Comeau C++ 4.2.45.1
+// BETA7 Mar  13, 2001, Verified with Comeau C++ 4.2.45.2
+//                      Minor NetBSD support
+// BETA8 Apr   1. 2001, Initial support for SunOS/SPARC
+// BETA9 Apr   7, 2001, Stronger SCO support + other UNIX x86 SVR3's
+//                      Mods for an fpos_t problem for some LINUXes
+//                      Mods since Destroy did not work in strict mode
+// BETA10 Apr  12. 2001, Stronger NetBSD support
+//
+// PLANNED:
+// BETAx TBA  TBA, 2001, NetBSD, UNIXWARE, and Windows support expected
+//
+
+
+#ifdef __linux__
+
+#   define _STLP_NO_NATIVE_MBSTATE_T      1
+#   define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#   define _STLP_NO_NATIVE_WIDE_STREAMS   1
+#   define _STLP_NO_LONG_DOUBLE   1
+
+// Comeau C++ under LINUX/INTEL/ELF
+// Preprocess away "long long" routines for now, even in relaxed mode
+# define __wcstoull_internal_defined	1
+# define __wcstoll_internal_defined	1
+
+#endif /* __COMO__ under __linux__ */
+
+#ifdef __USING_x86SVR3x_WITH_COMO /* SCO et al */
+/* UNIX 386+ SVR3 mods made with __USING_x86SVR3x_WITH_COMO
+   in other sources, not here */
+#    define atan2l atan2
+#    define cosl cos
+#    define sinl sin
+#    define sqrtl sqrt
+#    include <math.h>
+     inline long double expl(long double arg) { return exp(arg); }
+     inline long double logl(long double arg) { return log(arg); }
+#    define log10l log10
+
+#    define sinhl sinh
+#    define coshl cosh
+#    define fabsl fabs
+namespace std {
+ inline int min(int a, int b) { return a>b ? b : a; }
+}
+#endif
+
+#ifdef sun
+// Comeau C++ under Solaris/SPARC or SunOS
+
+#ifdef solarissparc
+#define __USING_SOLARIS_SPARC_WITH_COMO /* show this in the source when grep'ing for COMO */
+// Note comowchar.h for Solaris/SPARC wchar stuff
+
+#include <math.h>
+#    define sinf sin
+#    define sinl sin
+#    define sinhf sinh
+#    define sinhl sinh
+#    define cosf cos
+#    define cosl cos
+#    define coshf cosh
+#    define coshl cosh
+#    define atan2l atan2
+#    define atan2f atan2
+     inline float logf(float arg) { return log(arg); }
+     inline long double logl(long double arg) { return log(arg); }
+#    define log10f log10
+#    define log10l log10
+#    define expf exp
+     inline long double expl(long double arg) { return exp(arg); }
+#    define sqrtf sqrt
+#    define sqrtl sqrt
+#    define fabsf fabs
+#    define fabsl fabs
+#else
+#define __USING_SUNOS_WITH_COMO
+
+#define __unix 1
+#define __EXTENSIONS__ /* This might create undue noise somewhere */
+#endif
+#endif /* sun */
+
+#if defined(__NetBSD__)
+// From non-como #ifdef __GNUC__ above
+#undef _STLP_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
+#define __unix 1
+
+#include <sys/cdefs.h>
+// Some joker #define'd __END_DECLS as };
+#undef __END_DECLS
+#define __END_DECLS }
+
+// <sys/stat.h> prob
+#include <sys/cdefs.h>
+#undef __RENAME
+#define __RENAME(x)
+
+#define wchar_t __COMO_WCHAR_T
+#include <stddef.h>
+#undef wchar_t
+
+#include <math.h>
+# ifdef BORIS_DISABLED
+#    define atan2l atan2
+#    define cosl cos
+#    define sinl sin
+#    define sqrtl sqrt
+     inline long double expl(long double arg) { return exp(arg); }
+     inline long double logl(long double arg) { return log(arg); }
+#    define log10l log10
+#    define sinhl sinh
+#    define coshl cosh
+#    define fabsl fabs
+# endif
+#endif /* __NetBSD__ under __COMO__ */
+
+// Shouldn't need to change anything below here for Comeau C++
+// If so, tell us at comeau at comeaucomputing.com
+
+#define _STLP_NO_DRAND48
+
+#define _STLP_PARTIAL_SPECIALIZATION_SYNTAX
+#define _STLP_NO_USING_CLAUSE_IN_CLASS
+
+
+#if __COMO_VERSION__ >= 4245
+#define _STLP_NO_EXCEPTION_HEADER /**/
+#endif
+#define _STLP_NO_BAD_ALLOC /**/
+#define _STLP_USE_AUTO_PTR_CONVERSIONS /**/
+
+#if __COMO_VERSION__ >= 4245
+// Is this needed?
+#include <stdexcept.stdh>
+//
+// ALSO: SEE THE END OF THIS FILE FOR #INCLUDE <IOSTREAM>
+//
+#endif
+
+// this one is true only with MS
+# if defined (_MSC_VER)
+#  define _STLP_WCHAR_T_IS_USHORT 1
+#  if _MSC_VER <= 1200
+#   define _STLP_VENDOR_GLOBAL_CSTD
+#  endif
+#  if _MSC_VER < 1100
+#   define _STLP_NO_BAD_ALLOC 1
+#   define _STLP_NO_EXCEPTION_HEADER 1
+#   define _STLP_NO_NEW_NEW_HEADER 1
+#   define _STLP_NO_NEW_IOSTREAMS 1
+#  endif
+# endif
+
+// # define __EDG_SWITCHES
+
+
diff --git a/src/STLport/config/stl_confix.h b/src/STLport/config/stl_confix.h
new file mode 100644
index 0000000..14ca839
--- /dev/null
+++ b/src/STLport/config/stl_confix.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * STLport configuration file
+ * It is internal STLport header - DO NOT include it directly
+ * Purpose of this file : to define STLport settings that depend on
+ * compiler flags or can be otherwise missed
+ *
+ */
+
+#ifndef _STLP_CONFIX_H
+# define _STLP_CONFIX_H
+
+/* If, by any chance, C compiler gets there, try to help it to pass smoothly */
+# if ! defined (__cplusplus) && ! defined (_STLP_HAS_NO_NAMESPACES)
+#  define _STLP_HAS_NO_NAMESPACES
+# endif
+
+# if defined(__MINGW32__)
+#   define _STLP_NO_DRAND48
+# endif
+
+/* Modena C++ library  */
+#if defined (__MWERKS__) && __MWERKS__ <= 0x2303 || (defined (__KCC) && __KCC_VERSION < 3400)
+# include <mcompile.h>
+# define _STLP_USE_MSIPL 1
+# if defined (__KCC) || (defined(__MSL_CPP__) && \
+       ( (__MSL_CPP__ >= 0x5000 && defined( _MSL_NO_MESSAGE_FACET )) || \
+	 (__MSL_CPP__ < 0x5000 && defined( MSIPL_NL_TYPES )))  \
+	 )
+#  define _STLP_NO_NATIVE_MESSAGE_FACET 1
+# endif
+#endif
+
+/* common switches for EDG front-end */
+# if defined (__EDG_SWITCHES)
+#   if !(defined(_TYPENAME) || defined (_TYPENAME_IS_KEYWORD))
+#     undef  _STLP_NEED_TYPENAME
+#     define _STLP_NEED_TYPENAME 1
+#   endif
+#   if !defined(_WCHAR_T_IS_KEYWORD)
+#     undef _STLP_NO_WCHAR_T 
+#     define _STLP_NO_WCHAR_T 1
+#   endif
+#   ifndef _PARTIAL_SPECIALIZATION_OF_CLASS_TEMPLATES
+#     undef _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+#     define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#   endif
+#   ifndef _MEMBER_TEMPLATES
+#     undef _STLP_NO_MEMBER_TEMPLATES
+#     define _STLP_NO_MEMBER_TEMPLATES 1
+#     undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+#     define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#   endif
+#   if !defined(_MEMBER_TEMPLATE_KEYWORD)
+#     undef  _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+#     define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#   endif
+#   if !defined (__EXCEPTIONS) && ! defined (_EXCEPTIONS)
+#     undef  _STLP_HAS_NO_EXCEPTIONS
+#     define _STLP_HAS_NO_EXCEPTIONS
+#   endif
+#   undef __EDG_SWITCHES
+# endif /* EDG */
+#endif
diff --git a/src/STLport/config/stl_cray.h b/src/STLport/config/stl_cray.h
new file mode 100644
index 0000000..3611261
--- /dev/null
+++ b/src/STLport/config/stl_cray.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// Mostly correct guess, change it for Alpha (and other environments
+// that has 64-bit "long")
+#  define _STLP_UINT32_T unsigned long
+
+// Uncomment if long long is available
+#  define _STLP_LONG_LONG long long
+
+// Uncomment this if your compiler can't inline while(), for()
+#  define _STLP_LOOP_INLINE_PROBLEMS 1
+
+// Uncomment if native new-style iostreams are not available
+#define    _STLP_HAS_NO_NEW_IOSTREAMS	1
+
+// Uncomment this if your compiler does not support exceptions
+// Cray C++ supports exceptions when '-h exceptions' option is user;
+// therefore '-D_STLP_HAS_NO_EXCEPTIONS' must be used when '-h exceptions'
+// is NOT used.
+//#  define _STLP_HAS_NO_EXCEPTIONS 1
+
+// Delete?
+// Define this if compiler lacks <exception> header
+//#  define _STLP_NO_EXCEPTION_HEADER 1
+
+// Uncomment this if your C library has lrand48() function
+#  define _STLP_RAND48 1
+
+// Uncomment if native new-style C library headers lile <cstddef>, etc are not available.
+#   define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+// uncomment if new-style headers <new> is available
+#   define _STLP_NO_NEW_NEW_HEADER 1
+
+// uncomment this if <iostream> and other STD headers put their stuff in ::namespace,
+// not std::
+#  define _STLP_VENDOR_GLOBAL_STD
+
+// uncomment this if <cstdio> and the like put stuff in ::namespace,
+// not std::
+#  define _STLP_VENDOR_GLOBAL_CSTD
+
+# define _STLP_NATIVE_C_HEADER(__x) </usr/include/##__x>
+// WARNING: Following is hardcoded to the system default C++ include files
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(__x) </opt/ctl/CC/CC/include/##__x>
+
+
+# define _STLP_NO_NATIVE_MBSTATE_T
+# define _STLP_NO_CSTD_FUNCTION_IMPORTS
+//# define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+
+
diff --git a/src/STLport/config/stl_dec.h b/src/STLport/config/stl_dec.h
new file mode 100644
index 0000000..8c265d2
--- /dev/null
+++ b/src/STLport/config/stl_dec.h
@@ -0,0 +1,110 @@
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+# define _STLP_NATIVE_HEADER(header) <../cxx/##header>
+# define _STLP_NATIVE_C_HEADER(x) <../include/##x>
+
+#if (__DECCXX_VER < 60300000)
+# define _STLP_NATIVE_CPP_C_HEADER(header) <../cxx/##header>
+#else
+# define _STLP_NATIVE_CPP_C_HEADER(header) </usr/include/cxx_cname/##header>
+#endif
+
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../cxx/##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../cxx/##header>
+
+// Alpha is little-endian
+# define _STLP_LITTLE_ENDIAN
+
+// collisions 
+# define _STLP_DONT_PUT_STLPORT_IN_STD
+
+#if (__DECCXX_VER < 60000000)
+
+// automatic template instantiation does not
+// work with namespaces ;(
+# define _STLP_HAS_NO_NAMESPACES 1
+
+# define _STLP_NO_NEW_NEW_HEADER 1 
+
+# define _STLP_NO_WCHAR_T  1
+# define _STLP_NEED_EXPLICIT  1
+
+# define _STLP_NO_BOOL  1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_BAD_ALLOC 1
+
+
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+#endif
+
+
+#ifdef __NO_USE_STD_IOSTREAM
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# else
+// default is to use new iostreams, anyway
+# ifndef __USE_STD_IOSTREAM
+#  define __USE_STD_IOSTREAM
+# endif
+#endif
+
+// # if !defined (_STLP_NEW_IOSTREAMS) && ! defined (_STLP_DONT_REDEFINE_STD) \
+//  && ! defined (_STLP_REDEFINE_STD)
+// # undef __PRAGMA_ENVIRONMENT
+//   #  define _STLP_DONT_REDEFINE_STD
+// # endif
+
+//# ifndef __STD_STRICT_ANSI_ERRORS
+//# endif
+
+#ifndef __EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS 1
+#endif
+
+# ifdef __IMPLICIT_INCLUDE_ENABLED
+
+// but, works with ours ;).
+#  define _STLP_LINK_TIME_INSTANTIATION 1
+# else
+#  undef _STLP_LINK_TIME_INSTANTIATION
+# endif
+
+# if defined (__IMPLICIT_USING_STD) && !defined (__NO_USE_STD_IOSTREAM)
+// we should ban that !
+// #  error "STLport won't work with new iostreams and std:: being implicitly included. Please use -std strict_ansi[_errors] or specify __NO_USE_STD_IOSTREAM"
+# endif
+
+# if (defined (__STD_STRICT_ANSI) || defined (__STD_STRICT_ANSI_ERRORS))
+#  define _STLP_STRICT_ANSI 1
+# else
+// we want to enforce it
+#  define _STLP_LONG_LONG long long
+# endif
+
+// unsigned 32-bit integer type
+#  define _STLP_UINT32_T unsigned int
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// #  define _STLP_RAND48 1
+
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+# if (__DECCXX_VER <= 60400000)
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1 
+# endif
+
diff --git a/src/STLport/config/stl_dec_vms.h b/src/STLport/config/stl_dec_vms.h
new file mode 100644
index 0000000..c4bd6dd
--- /dev/null
+++ b/src/STLport/config/stl_dec_vms.h
@@ -0,0 +1,96 @@
+// OpenVMS version
+
+# define _STLP_NATIVE_HEADER(header) <sys$library:##header>
+# define _STLP_NATIVE_C_HEADER(x) <sys$library:##x>
+# define _STLP_NATIVE_CPP_C_HEADER(header) <sys$library:##header>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <sys$library:##header>
+
+#if (__DECCXX_VER < 60000000)
+
+// automatic template instantiation does not
+// work with namespaces ;(
+# define _STLP_HAS_NO_NAMESPACES 1
+
+# define _STLP_NO_WCHAR_T  1
+# define _STLP_NEED_EXPLICIT  1
+
+# define _STLP_NO_BOOL  1
+# define _STLP_NEED_TYPENAME 1
+# define _STLP_NO_NEW_STYLE_CASTS 1
+# define _STLP_NEED_MUTABLE 1
+# define _STLP_NO_BAD_ALLOC 1
+
+# define _STLP_NO_NEW_NEW_HEADER 1 
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+
+# define _STLP_NO_MEMBER_TEMPLATES 1
+# define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# define _STLP_NO_FRIEND_TEMPLATES 1
+# define _STLP_NO_QUALIFIED_FRIENDS 1
+# define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+# define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+# define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+# define _STLP_BROKEN_USING_DIRECTIVE 1
+# define _STLP_NO_EXCEPTION_HEADER 1
+# define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+#endif
+
+
+#ifdef __NO_USE_STD_IOSTREAM
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# else
+// default is to use new iostreams, anyway
+# ifndef __USE_STD_IOSTREAM
+#  define __USE_STD_IOSTREAM
+# endif
+#endif
+
+// # if !defined (_STLP_NEW_IOSTREAMS) && ! defined (_STLP_DONT_REDEFINE_STD) \
+//  && ! defined (_STLP_REDEFINE_STD)
+// # undef __PRAGMA_ENVIRONMENT
+//   #  define _STLP_DONT_REDEFINE_STD
+// # endif
+
+//# ifndef __STD_STRICT_ANSI_ERRORS
+//# endif
+
+#ifndef __EXCEPTIONS
+# define _STLP_HAS_NO_EXCEPTIONS 1
+#endif
+
+# ifdef __IMPLICIT_INCLUDE_ENABLED
+
+#ifndef _STLP_IOSTREAMS
+// implicit include introduces conflicts
+// between stlport and native lib.
+# undef __IMPLICIT_INCLUDE_ENABLED
+#endif
+
+// but, works with ours ;).
+#  define _STLP_LINK_TIME_INSTANTIATION 1
+
+# endif
+
+# if defined (__IMPLICIT_USING_STD) && !defined (__NO_USE_STD_IOSTREAM)
+// we should ban that !
+#  error "STLport won't work with new iostreams and std:: being implicitly included. Please use -std strict_ansi[_errors] or specify __NO_USE_STD_IOSTREAM"
+# endif
+
+# if !(defined (__STD_STRICT_ANSI) || defined (__STD_STRICT_ANSI_ERRORS))
+// we want to enforce it
+#  define _STLP_LONG_LONG long long
+# endif
+
+// unsigned 32-bit integer type
+#  define _STLP_UINT32_T unsigned int
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// #  define _STLP_RAND48 1
+
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+#define _STLP_HAS_NO_NEW_C_HEADERS 1
+
diff --git a/src/STLport/config/stl_dm.h b/src/STLport/config/stl_dm.h
new file mode 100644
index 0000000..5866cc6
--- /dev/null
+++ b/src/STLport/config/stl_dm.h
@@ -0,0 +1,225 @@
+// STLport configuration file for Digital Mars C++
+
+#ifndef _STLP_DMC_H
+# define _STLP_DMC_H
+
+#if __DMC__ < 0x832
+#error "Digital Mars C++ versions prior to 8.32 are not supported!"
+#endif
+
+
+#ifndef _CPPUNWIND
+# define _STLP_NO_EXCEPTIONS
+#endif
+# undef _STLP_NO_NAMESPACES
+# define _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_VENDOR_GLOBAL_CSTD
+# define _STLP_VENDOR_GLOBAL_STD
+# define _STLP_VENDOR_EXCEPT_STD std
+
+# if !defined(_WIN32)
+// it's not fully supported on non-Win32 platforms
+#  define _STLP_NO_NEW_IOSTREAMS
+#  define _STLP_NO_NATIVE_WIDE_FUNCTIONS
+# endif
+
+# if defined(_STLP_NO_NEW_IOSTREAMS) || defined(_STLP_NO_OWN_IOSTREAMS)
+#  define _STLP_OWN_NAMESPACE
+# else
+#  define _STLP_NO_OWN_NAMESPACE
+# endif
+
+
+// select threads strategy
+# if defined (_MT) && !defined (_NOTHREADS)
+#  define _REENTRANT
+# else
+#  define _NOTHREADS
+# endif
+
+// select SGI-style alloc instead of allocator<T>
+# define _STLP_USE_SGI_ALLOCATORS
+
+// select allocation method you like
+# undef _STLP_USE_MALLOC
+# define _STLP_USE_NEWALLOC
+
+// this one is not mandatory, just enabled
+# undef _STLP_USE_DEFALLOC
+
+// define _STLP_USE_ABBREVS if your linker has trouble with long 
+// external symbols
+# undef _STLP_USE_ABBREVS
+
+
+// unsigned 32-bit integer type
+#  define _STLP_UINT32_T unsigned
+
+#  ifndef _BOOL_DEFINED
+#   define _STLP_NO_BOOL
+#  else
+#   define _STLP_DONT_USE_BOOL_TYPEDEF
+#  endif
+
+#  undef _STLP_YVALS_H
+#  undef _STLP_LIMITED_DEFAULT_TEMPLATES
+#  define _STLP_DEFAULT_TYPE_PARAM
+#  undef _STLP_NO_STATIC_TEMPLATE_DATA
+#  undef _STLP_RAND48
+#  undef _STLP_LOOP_INLINE_PROBLEMS
+
+#  undef _STLP_HAS_NO_NAMESPACES
+
+#  undef _STLP_NEED_TYPENAME
+#  undef _STLP_NEED_EXPLICIT
+#  undef _STLP_HAS_NO_EXCEPTIONS
+#  undef _STLP_NO_EXCEPTION_SPEC
+#  undef _STLP_WEAK_ATTRIBUTE
+#  undef _STLP_BASE_MATCH_BUG
+#  undef _STLP_NONTEMPL_BASE_MATCH_BUG
+#  undef _STLP_NESTED_TYPE_PARAM_BUG
+#  undef _STLP_NO_ARROW_OPERATOR
+#  undef _STLP_UNINITIALIZABLE_PRIVATE
+#  undef _STLP_BASE_TYPEDEF_BUG
+#  undef _STLP_BASE_TYPEDEF_OUTSIDE_BUG
+#  undef _STLP_CONST_CONSTRUCTOR_BUG
+
+#  undef _STLP_NO_NEW_STYLE_CASTS
+
+#  ifndef _WCHAR_T_DEFINED
+#   define _STLP_NO_WCHAR_T
+#  endif
+#  define _STLP_HAS_NO_UNIX98_WCHAR_EXTENSIONS
+
+#  undef _STLP_WCHAR_T_IS_USHORT
+
+#  if _INTEGRAL_MAX_BITS >= 64
+#   define _STLP_LONG_LONG long long
+#  endif
+
+#  undef _STLP_NO_LONG_DOUBLE
+#  undef _STLP_NEED_MUTABLE
+#  undef _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+#  undef _STLP_NO_BAD_ALLOC
+#  undef _STLP_DEBUG_ALLOC
+#  undef _STLP_NO_MEMBER_TEMPLATES
+#  undef _STLP_NO_MEMBER_TEMPLATE_CLASSES
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+#  undef _STLP_NO_FRIEND_TEMPLATES
+#  undef _STLP_NO_QUALIFIED_FRIENDS
+#  undef _STLP_NO_CLASS_PARTIAL_SPECIALIZATION
+#  undef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+#  undef _STLP_AUTOMATIC_TYPE_TRAITS
+#  undef _STLP_MEMBER_POINTER_PARAM_BUG
+#  undef _STLP_NON_TYPE_TMPL_PARAM_BUG
+#  undef _STLP_NO_DEFAULT_NON_TYPE_PARAM
+#  undef _STLP_NO_METHOD_SPECIALIZATION
+#  undef _STLP_STATIC_ARRAY_BUG
+#  undef _STLP_STATIC_CONST_INIT_BUG
+#  undef _STLP_TRIVIAL_CONSTRUCTOR_BUG
+#  undef _STLP_TRIVIAL_DESTRUCTOR_BUG
+#  undef _STLP_BROKEN_USING_DIRECTIVE
+#  undef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+#  undef _STLP_NO_EXCEPTION_HEADER
+#  undef _STLP_DEFAULT_CONSTRUCTOR_BUG
+
+#  define _STLP_HAS_NO_NEW_IOSTREAMS
+#  define _STLP_HAS_NO_NEW_C_HEADERS
+#  define _STLP_THROW_RETURN_BUG
+#  undef _STLP_LINK_TIME_INSTANTIATION
+#  undef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+#  undef _STLP_NO_TEMPLATE_CONVERSIONS
+#  undef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+
+
+#  define _STLP_NO_NATIVE_MBSTATE_T
+
+
+#  define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+#  define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+
+#  define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+#  define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+
+#  define _STLP_IMPORT_TEMPLATE_KEYWORD __declspec(dllimport)
+#  define _STLP_EXPORT_TEMPLATE_KEYWORD __declspec(dllexport)
+
+#define _STLP_NATIVE_HEADER(header)    <../include/##header>
+#define _STLP_NATIVE_C_HEADER(header)    <../include/##header>
+#define _STLP_NATIVE_CPP_C_HEADER(header)    <../include/##header>
+#define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../include/##header>
+#define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+
+
+# if defined(__BUILDING_STLPORT) && defined(_WINDLL)
+#  define _STLP_CALL __export
+
+#  undef _STLP_USE_DECLSPEC
+#  define _STLP_USE_DECLSPEC 1
+# endif
+
+# if !defined (__BUILDING_STLPORT) && !defined (_STLP_NO_OWN_IOSTREAMS)
+#  if (defined (_DLL) && !defined (_STLP_DONT_USE_DLL)) || defined (_STLP_USE_DLL)
+#   undef  _STLP_USE_DECLSPEC
+#   define _STLP_USE_DECLSPEC 1
+#  endif
+
+#  if defined (_STLP_DEBUG)
+#   if defined (_DLL)
+#    if !defined (_STLP_DONT_USE_DLL)
+#     pragma comment(lib,"stlp45dm_stldebug.lib")
+#    else
+#     pragma comment(lib,"stlp45dm_stldebug_staticx.lib")
+#    endif
+#   else
+#    if defined (_STLP_USE_DLL)
+#     pragma comment(lib,"stlp45dms_stldebug.lib")
+#    else
+#     pragma comment(lib,"stlp45dm_stldebug_static.lib")
+#    endif
+#   endif
+#  elif defined (DEBUG)
+#   if defined (_DLL)
+#    if !defined (_STLP_DONT_USE_DLL)
+#     pragma comment(lib,"stlp45dm_debug.lib")
+#    else
+#     pragma comment(lib,"stlp45dm_debug_staticx.lib")
+#    endif
+#   else
+#    if defined (_STLP_USE_DLL)
+#     pragma comment(lib,"stlp45dms_debug.lib")
+#    else
+#     pragma comment(lib,"stlp45dm_debug_static.lib")
+#    endif
+#   endif
+#  else
+#   if defined (_DLL)
+#    if !defined (_STLP_DONT_USE_DLL)
+#     pragma comment(lib,"stlp45dm.lib")
+#    else
+#     pragma comment(lib,"stlp45dm_staticx.lib")
+#    endif
+#   else
+#    if defined (_STLP_USE_DLL)
+#     pragma comment(lib,"stlp45dms.lib")
+#    else
+#     pragma comment(lib,"stlp45dm_static.lib")
+#    endif
+#   endif
+#  endif
+# endif
+
+
+#ifdef __BUILDING_STLPORT
+// still needed for building STLport itself, but isn't needed for
+// compiling applications anymore
+# undef __SC__
+#endif
+
+#undef __STLP_NO_KEYWORDS_WORKAROUND
+#if !defined (__STLP_NO_KEYWORDS_WORKAROUND)
+# define __in __stl_in
+# define __out __stl_out
+#endif
+
+#endif
diff --git a/src/STLport/config/stl_fujitsu.h b/src/STLport/config/stl_fujitsu.h
new file mode 100644
index 0000000..cc77540
--- /dev/null
+++ b/src/STLport/config/stl_fujitsu.h
@@ -0,0 +1,5 @@
+/* STLport configuration for Fujitsu compiler : looks like a perfect one ! */
+# define _STLP_NATIVE_INCLUDE_PATH ../std
+# define _STLP_UINT32_T unsigned int
+# define _STLP_LONG_LONG long long
+# define _STLP_WCHAR_SUNPRO_EXCLUDE 1
diff --git a/src/STLport/config/stl_gcc.h b/src/STLport/config/stl_gcc.h
new file mode 100644
index 0000000..56d0359
--- /dev/null
+++ b/src/STLport/config/stl_gcc.h
@@ -0,0 +1,376 @@
+/* STLport configuration file
+ * It is internal STLport header - DO NOT include it directly
+ */
+
+/* Systems having GLIBC installed have different traits */
+#if ! defined (_STLP_USE_GLIBC) && ( defined (__linux__) || defined (__CYGWIN__) )
+# define _STLP_USE_GLIBC
+#endif
+
+#   define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+
+# if defined(__FreeBSD__) || defined (__hpux) || defined(__amigaos__) || ( defined(__OS2__) && defined(__EMX__) )
+#  define _STLP_NO_WCHAR_T
+# endif
+
+#ifdef __USLC__
+# include <config/stl_sco.h>
+#endif
+
+# if defined (__sun)
+
+// gcc does not support ELF64 yet ; however; it supports ultrasparc + v8plus.
+// limits.h contains invalid values for this combination
+# if (defined  (__sparc_v9__) || defined (__sparcv9)) && ! defined ( __WORD64 )
+#  define __LONG_MAX__ 2147483647L
+# endif
+
+#  include <config/stl_solaris.h>
+# endif
+
+// no thread support on AmigaOS
+#if defined (__amigaos__)
+# define _NOTHREADS
+# define _STLP_NO_THREADS
+#endif
+
+// azov: gcc on lynx have a bug that causes internal
+// compiler errors when compiling STLport with namespaces turned on. 
+// When the compiler gets better - comment out _STLP_HAS_NO_NAMESPACES
+# if defined (__Lynx__) && (__GNUC__ < 3)
+#   define _STLP_HAS_NO_NAMESPACES 1
+#   define _STLP_NO_STATIC_TEMPLATE_DATA 1
+//  turn off useless warning about including system headers
+#   define __NO_INCLUDE_WARN__ 1
+# endif
+
+
+/* Tru64 Unix, AIX, HP : gcc there by default uses uses native ld and hence cannot auto-instantiate 
+   static template data. If you are using GNU ld, please say so in stl_user_config.h header */    
+# if (__GNUC__ < 3) && ! (_STLP_GCC_USES_GNU_LD) && \
+   ((defined (__osf__) && defined (__alpha__)) || defined (_AIX) || defined (__hpux) || defined(__amigaos__) )
+#   define _STLP_NO_STATIC_TEMPLATE_DATA
+# endif
+
+# if defined(__DJGPP)
+#   define _STLP_RAND48		1
+#   define _NOTHREADS		1
+#   undef  _PTHREADS
+#   define _STLP_LITTLE_ENDIAN
+# endif 
+
+# if defined(__MINGW32__)
+/* Mingw32, egcs compiler using the Microsoft C runtime */
+#   undef  _STLP_NO_DRAND48
+#   define _STLP_NO_DRAND48
+#   ifdef _MT
+#     define _REENTRANT
+#   endif
+#  define _STLP_IMPORT_DECLSPEC __attribute__((dllimport))
+#  define _STLP_EXPORT_DECLSPEC __attribute__((dllexport))
+#  define _STLP_CLASS_IMPORT_DECLSPEC __attribute__((dllimport))
+#  define _STLP_CLASS_EXPORT_DECLSPEC __attribute__((dllexport))
+#  define _STLP_CALL
+
+#  if defined (_STLP_USE_DYNAMIC_LIB)
+#   define _STLP_USE_DECLSPEC 1
+// #   define _STLP_USE_TEMPLATE_EXPORT 1
+/* Using dynamic library in MinGW requires _STLP_NO_CUSTOM_IO */
+# define _STLP_NO_CUSTOM_IO
+#  endif
+
+# endif
+
+#if defined (__CYGWIN__) || defined (__MINGW32__) || !(defined (_STLP_USE_GLIBC) || defined (__sun)) 
+#ifndef __MINGW32__
+#   define _STLP_NO_NATIVE_MBSTATE_T      1
+#endif
+#   define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#   define _STLP_NO_NATIVE_WIDE_STREAMS   1
+# elif defined(__linux__)
+#   define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#   define _STLP_NO_NATIVE_WIDE_STREAMS   1
+# elif defined (__sun)
+#   define _STLP_WCHAR_BORLAND_EXCLUDE
+#   define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#endif
+
+/* Mac OS X is a little different with namespaces and cannot instantiate
+ * static data members in template classes */
+# if defined (__APPLE__)
+/* Mac OS X is missing a required typedef and standard macro */
+typedef unsigned int wint_t;
+
+#  define __unix
+
+#   if (__GNUC__ < 3)
+
+ /* Mac OS X needs one and only one source file to initialize all static data
+  * members in template classes. Only one source file in an executable or
+  * library can declare instances for such data members, otherwise duplicate
+  * symbols will be generated. */
+
+#   define _STLP_NO_STATIC_TEMPLATE_DATA
+#   define _STLP_STATIC_CONST_INIT_BUG 1
+#   define _STLP_STATIC_TEMPLATE_DATA 0
+#   define _STLP_WEAK_ATTRIBUTE 1
+ /* Workaround for the broken Mac OS X C++ preprocessor which cannot handle
+  * parameterized macros in #include statements */
+#  define _STLP_NATIVE_HEADER(header) <../g++/##header##>
+#  define _STLP_NATIVE_C_HEADER(header) <../include/##header##>
+#  define _STLP_NATIVE_CPP_C_HEADER(header) <../g++/##header##>
+#  define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../g++/##header##>
+#  define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../g++/##header##> 
+# endif /* __GNUC__ < 3 */
+
+#   define _STLP_NO_LONG_DOUBLE
+
+/* Mac OS X needs all "::" scope references to be "std::" */
+#define _STLP_USE_NEW_C_HEADERS
+# endif
+
+
+# if defined(__BEOS__) && defined(__INTEL__)
+#  define _STLP_NATIVE_HEADER(header) <../stlport/beos/##header##>
+#  define _STLP_NATIVE_C_HEADER(header) <../stlport/beos/##header##>
+#  define _STLP_NATIVE_CPP_C_HEADER(header) <../stlport/beos/##header##>
+#  define _STLP_NATIVE_OLD_STREAMS_HEADER(header) <../stlport/beos/##header##>
+#  define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../stlport/beos/##header##>
+#  define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#  define _STLP_NO_NATIVE_WIDE_STREAMS   1
+//#  define _NOTHREADS 1
+#  ifdef _PTHREADS
+#    undef  _PTHREADS
+#  endif
+#  ifdef _STLP_PTHREADS
+#    undef _STLP_PTHREADS
+#  endif
+#  define _STLP_USE_STDIO_IO 1
+#  define _STLP_USE_GLIBC 1
+# endif
+
+
+/* g++ 2.7.x and above */
+#   define _STLP_LONG_LONG long long 
+
+#   if (__GNUC__ >= 3)
+#    ifndef _STLP_HAS_NO_NEW_C_HEADERS
+#     define _STLP_HAS_NATIVE_FLOAT_ABS
+#    else
+#     ifdef _STLP_USE_GLIBC
+#      define _STLP_VENDOR_LONG_DOUBLE_MATH  1 // - ptr: with new c headers no needs
+// #      define _STLP_REAL_LOCALE_IMPLEMENTED
+#     endif
+#    endif
+#   endif
+
+#   if (__GNUC__ < 3)
+#    define _STLP_HAS_NO_NEW_C_HEADERS     1
+#    define _STLP_VENDOR_GLOBAL_CSTD       1
+#    define _STLP_HAS_NO_NEW_IOSTREAMS     1
+#    ifndef __HONOR_STD
+#     define _STLP_VENDOR_GLOBAL_EXCEPT_STD 1
+#    endif
+#   endif
+
+#   if (__GNUC_MINOR__ < 95)  && (__GNUC__ < 3)
+/* egcs fails to initialize builtin types in expr. like this : new(p) char();  */
+#     define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+#     define _STLP_INCOMPLETE_EXCEPTION_HEADER
+#   endif
+
+#   if (__GNUC_MINOR__ < 9)  && (__GNUC__ < 3) /* gcc 2.8 */
+#     define _STLP_NO_TEMPLATE_CONVERSIONS
+#     define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#     define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#     define _STLP_NO_FRIEND_TEMPLATES 1
+#     define _STLP_HAS_NO_NAMESPACES 1
+#     define _STLP_NO_METHOD_SPECIALIZATION 1
+#     define _STLP_NO_MEMBER_TEMPLATES 1
+#     define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#     define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+/*  DJGPP doesn't seem to implement it in 2.8.x */
+#     ifdef DJGPP
+#      define  _STLP_NO_STATIC_TEMPLATE_DATA 1
+#     endif
+#   endif
+
+#  if __GNUC__ <= 2 && __GNUC_MINOR__ <= 7 && ! defined (__CYGWIN32__)
+/* Will it work with 2.6 ? I doubt it. */
+#   if ( __GNUC_MINOR__ < 6 )
+    __GIVE_UP_WITH_STL(GCC_272);
+#   endif
+
+# define  _STLP_NO_RELOPS_NAMESPACE
+# define  _STLP_NON_TYPE_TMPL_PARAM_BUG
+# define  _STLP_LIMITED_DEFAULT_TEMPLATES 1
+# define  _STLP_DEFAULT_TYPE_PARAM 1
+# define  _STLP_NO_BAD_ALLOC
+# define  _STLP_NO_ARROW_OPERATOR 1
+# ifndef _STLP_NO_STATIC_TEMPLATE_DATA
+#  define  _STLP_NO_STATIC_TEMPLATE_DATA
+# endif
+# define  _STLP_STATIC_CONST_INIT_BUG 1
+# define  _STLP_NO_METHOD_SPECIALIZATION 1
+
+#  if !defined (__CYGWIN32__) 
+#   define _STLP_NESTED_TYPE_PARAM_BUG   1
+#   define _STLP_BASE_MATCH_BUG       1
+/*  unused operators are required (forward) */
+#   define  _STLP_CONST_CONSTRUCTOR_BUG 
+#   define _STLP_NO_DEFAULT_NON_TYPE_PARAM
+#  endif
+#   define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+#   define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+#   define _STLP_NO_EXCEPTION_HEADER 1
+#  else /* ! <= 2.7.* */
+#  endif /* ! <= 2.7.* */
+
+/* static template data members workaround strategy for gcc tries
+ * to use weak symbols.
+ * if you don't want to use that, #define _STLP_WEAK_ATTRIBUTE=0 ( you'll
+ * have to put "#define __PUT_STATIC_DATA_MEMBERS_HERE" line in one of your
+ * compilation unit ( or CFLAGS for it ) _before_ including any STL header ).
+ */
+#   if defined (_STLP_NO_STATIC_TEMPLATE_DATA) && ! defined (_STLP_WEAK_ATTRIBUTE )
+/* systems using GNU ld or format that supports weak symbols
+   may use "weak" attribute
+   Linux & Solaris ( x86 & SPARC ) are being auto-recognized here */
+#    if defined(_STLP_GNU_LD) || defined(__ELF__) || defined (__CYGWIN__) || \
+     (( defined (__SVR4) || defined ( __svr4__ )) && \
+      ( defined (sun) || defined ( __sun__ )))
+#     define _STLP_WEAK_ATTRIBUTE 1
+#    endif
+#   endif /* _STLP_WEAK_ATTRIBUTE */
+
+
+/* strict ANSI prohibits "long long" ( gcc) */
+#  if defined ( __STRICT_ANSI__ )
+#    undef _STLP_LONG_LONG
+// #    define _STLP_STRICT_ANSI 1
+#  endif
+
+//# if !defined (__STRICT_ANSI__) || defined (__BUILDING_STLPORT)
+//#    define _STLP_USE_TEMPLATE_EXPORT
+//#    define _STLP_EXPORT_TEMPLATE_KEYWORD extern
+//#    define _STLP_IMPORT_TEMPLATE_KEYWORD extern
+//# endif
+
+#   ifndef __EXCEPTIONS
+#     undef  _STLP_HAS_NO_EXCEPTIONS
+#     define _STLP_HAS_NO_EXCEPTIONS  1
+#   endif
+
+# if (__GNUC__ >= 3)
+
+#  if ((__GNUC_MINOR__ == 0) || (__APPLE__))
+#   define _STLP_NATIVE_INCLUDE_PATH ../g++-v3
+#   define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../g++-v3/backward
+#  else
+#   if defined(__GNUC_PATCHLEVEL__) && (__GNUC_PATCHLEVEL__ > 0)
+#     define _STLP_NATIVE_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__
+#     define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__/backward
+#   else
+#     define _STLP_NATIVE_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__
+#     define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../__GNUC__.__GNUC_MINOR__/backward
+#   endif
+#  endif
+
+# elif (__GNUC_MINOR__ < 8)
+
+#  define _STLP_NO_OWN_IOSTREAMS 1
+#  undef  _STLP_OWN_IOSTREAMS
+#  define _STLP_NATIVE_INCLUDE_PATH ../g++-include
+
+/* tuning of static template data members workaround */
+#  if ( _STLP_STATIC_TEMPLATE_DATA < 1 )
+#   if ( _STLP_WEAK_ATTRIBUTE > 0 )
+#    define _STLP_WEAK __attribute__ (( weak ))
+#   else
+#    define _STLP_WEAK
+#   endif /* _STLP_WEAK_ATTRIBUTE */
+
+#   ifdef __PUT_STATIC_DATA_MEMBERS_HERE
+#    define __DECLARE_INSTANCE(type,item,init) type item _STLP_WEAK init
+#   else
+#    define __DECLARE_INSTANCE(type,item,init)
+#   endif /* __PUT_STATIC_DATA_MEMBERS_HERE */
+#  endif /* _STLP_STATIC_TEMPLATE_DATA */
+
+# else
+
+// gcc-2.95.0 used to use "g++-3" directory which has been changed to "g++" in
+// system-dependent "include" for 2.95.2 except for Cygwin and Mingw packages.
+// I expect "g++-3" not being used in later releases.
+// If your installation use "g++-3" include directory for any reason (pre-2.95.2 or Win binary kit),
+// please change the macro below to point to your directory. 
+
+# if defined(__DJGPP)
+#   define _STLP_NATIVE_INCLUDE_PATH ../lang/cxx
+# elif (__GNUC__ >= 3) || (__GNUC_MINOR__ >= 97)
+#   define _STLP_NATIVE_INCLUDE_PATH ../include/g++-v3
+# elif ((__GNUC_MINOR__ >= 95 && __GNUC_MINOR__ < 97) && !( defined (__FreeBSD__) || defined (__NetBSD__) || defined(__sgi) || defined (__OS2__) ) )
+#   define _STLP_NATIVE_INCLUDE_PATH ../g++-3
+# elif (__GNUC_MINOR__ > 8) && (__GNUC_MINOR__ < 95) && (__GNUC__ < 3) && !defined( __Lynx__ )
+// this really sucks, as GNUpro does not really identifies itself, so we have to guess 
+// depending on a platform
+#   ifdef __hpux
+#    define _STLP_NATIVE_INCLUDE_PATH ../g++-3
+#   else
+#    define _STLP_NATIVE_INCLUDE_PATH ../g++-2
+#   endif
+# else
+#   define _STLP_NATIVE_INCLUDE_PATH g++
+# endif
+
+// <exception> et al
+# ifdef __FreeBSD__
+#   if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ > 95)
+#     define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../include
+#   endif
+# else
+// azov
+#   ifdef __Lynx__ 
+#     define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+#   else
+#    if (__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)
+// #     define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../g++-v3
+#   else
+#     define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../include
+#   endif
+#  endif
+# endif
+
+#endif /* GNUC_MINOR < 8 */
+
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+
+
+#ifdef _SCO_ELF
+# define _STLP_SCO_OPENSERVER
+#     if defined(_REENTRANT)
+#           define _UITHREADS     /* if      UnixWare < 7.0.1 */
+#           define _STLP_UITHREADS
+#     endif /* _REENTRANT */
+#endif
+
+// Tune settings for the case where static template data members are not 
+// instaniated by default
+# if defined ( _STLP_NO_STATIC_TEMPLATE_DATA )
+#   define _STLP_STATIC_TEMPLATE_DATA 0
+#   if !defined ( _STLP_WEAK_ATTRIBUTE )
+#    define _STLP_WEAK_ATTRIBUTE 0
+#   endif
+#  ifdef __PUT_STATIC_DATA_MEMBERS_HERE
+#   define __DECLARE_INSTANCE(type,item,init) type item init
+#  else
+#   define __DECLARE_INSTANCE(type,item,init)
+#  endif
+# else
+#   define _STLP_STATIC_TEMPLATE_DATA 1
+# endif
+
+
+
+
diff --git a/src/STLport/config/stl_hpacc.h b/src/STLport/config/stl_hpacc.h
new file mode 100644
index 0000000..e25f101
--- /dev/null
+++ b/src/STLport/config/stl_hpacc.h
@@ -0,0 +1,218 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// system C-library dependent
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// #  define _STLP_RAND48 1
+#  define _STLP_NO_NATIVE_MBSTATE_T      1
+#  define _STLP_HPACC_BROKEN_BUFEND       1
+#  define _STLP_WCHAR_HPACC_EXCLUDE      1
+
+// this was reported to help, just as with SUN CC 4.2
+# define _STLP_INLINE_STRING_LITERAL_BUG
+
+
+// specific prolog is needed to select correct threads impl
+#  define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+// HP aCC with +noeh
+#  ifdef __HPACC_NOEH
+#   define _STLP_HAS_NO_EXCEPTIONS 1
+#  endif
+
+// HP compilers
+// At that point, we only know we are on HP (and _not_ using gcc,
+// according to "stlcomp.h"
+
+// __HP_aCC indicate HP ANSI C++, but not always (03.xx does not
+// define it before 3.13, for example).
+//
+#  if defined(__HP_aCC)
+
+# if __HP_aCC < 33100
+#   define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../iostream
+# else
+#   define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../include/iostream
+# endif
+
+#   define _STLP_LONG_LONG long long
+
+#if (__HP_aCC <= 30000 && __HP_aCC >= 12100)
+
+//Special kludge to workaround bug in aCC A.01.23, CR JAGac40634
+#ifdef _STLP_DEBUG
+static void _STLP_dummy_literal() { const char *p = "x";}
+static void _STLP_dummy_literal_2() { const char *p = "123456789"; }
+static void _STLP_dummy_literal_3() { const char *p = "123456700000000000000089";}
+#endif
+
+#     define _STLP_HP_ACC                   0123
+#     define _STLP_NATIVE_INCLUDE_PATH       ../include
+#     define _STLP_NATIVE_C_INCLUDE_PATH     ../include
+#     define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+#     define _STLP_VENDOR_GLOBAL_STD         1
+#     define _STLP_VENDOR_GLOBAL_CSTD        1
+#     define _STLP_HAS_NO_NEW_IOSTREAMS      1
+#     define _STLP_DONT_THROW_RANGE_ERRORS   1
+#     define _STLP_STATIC_CONST_INIT_BUG 1
+#if (__HP_aCC  < 12700)
+//new flag: on most HP compilers cwchar is missing
+#     define _STLP_NO_CWCHAR
+#endif
+
+#     define _STLP_FORCE_ALLOCATORS(t,a) \
+  typedef typename _Alloc_traits<t,a>::_Orig _STLP_dummy_type1;\
+  typedef typename _STLP_dummy_type1:: _STLP_TEMPLATE rebind<t>::other _STLP_dummy_type2;
+
+#   endif /* 123 */
+
+// latest version and up
+#   if (__HP_aCC >= 32500 )
+#     define _STLP_HP_ACC                   0325
+
+#     define _STLP_FORCE_ALLOCATORS(t,a) \
+  typedef typename _Alloc_traits<t,a>::_Orig _STLP_dummy_type1;\
+  typedef typename _STLP_dummy_type1:: _STLP_TEMPLATE rebind<t>::other _STLP_dummy_type2;
+
+# if !defined( _INCLUDE__STDC_A1_SOURCE ) // HP-UX 11i only
+#  define _STLP_HAS_NO_UNIX98_WCHAR_EXTENSIONS
+# endif
+
+#    if defined(_HP_NAMESPACE_STD) // option -AA
+// from now, we have a full standard lib in namespace std
+//
+// -AA indicates that we are compiling against Rogue Wave 2.2.1
+// STL shipped with the HP aCC compiler. -AA tells the compiler
+// to use the STL defined in the include_std directory.
+//
+# define _STLP_NATIVE_INCLUDE_PATH ../include_std
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include_std
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include_std
+
+// #      define _STLP_HPACC_ONLY_NATIVE_STRING 1 // STLPort _string.c includes <locale>
+#     define _STLP_HP_ACC_COMPAT            -1
+#    else // option -Aa
+#     define _STLP_NATIVE_INCLUDE_PATH       ../include
+#     define _STLP_NATIVE_C_INCLUDE_PATH     ../include
+#     define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+#     define _STLP_VENDOR_GLOBAL_STD         1
+#     define _STLP_VENDOR_GLOBAL_CSTD        1
+#     define _STLP_HAS_NO_NEW_IOSTREAMS      1
+// Add the following in _site_config.h if "-Wc,-koenig_lookup,on" not used
+//#     define _STLP_NO_KOENIG_LOOKUP          1
+#     define _STLP_DONT_THROW_RANGE_ERRORS   1
+#    endif /* _NAMESPACE_STD */
+#   endif
+
+#   if (__HP_aCC >= 31400 && __HP_aCC < 32500)
+#     define _STLP_HP_ACC                   0314
+
+# define _STLP_FORCE_ALLOCATORS(t,a) \
+typedef typename _Alloc_traits<t,a>::_Orig _STLP_dummy_type1;\
+typedef typename _STLP_dummy_type1:: _STLP_TEMPLATE rebind<t>::other _STLP_dummy_type2;
+#     define _STLP_NO_CWCHAR
+#    if defined(_NAMESPACE_STD) // option -AA
+// from now, we have a full standard lib in namespace std
+#      define _STLP_NATIVE_INCLUDE_PATH       ../include_std
+#      define _STLP_NATIVE_C_INCLUDE_PATH     ../include_std
+#      define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include_std
+// #      define _STLP_HPACC_ONLY_NATIVE_STRING 1 // STLPort _string.c includes <locale>
+#     define _STLP_HP_ACC_COMPAT            -1
+#    else // kind of compatibility mode
+#     define _STLP_NATIVE_INCLUDE_PATH       ../include
+#     define _STLP_NATIVE_C_INCLUDE_PATH     ../include
+#     define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+#     define _STLP_VENDOR_GLOBAL_STD         1
+#     define _STLP_VENDOR_GLOBAL_CSTD        1
+#     define _STLP_HAS_NO_NEW_IOSTREAMS      1
+// comment if  "-Wc,-koenig_lookup,on" id used
+#     define _STLP_NO_KOENIG_LOOKUP          1
+#     define _STLP_DONT_THROW_RANGE_ERRORS   1
+#     define _STLP_NO_ROPE                   1
+#    endif /* _NAMESPACE_STD */
+#   endif /* 314 */
+
+#  if ((__HP_aCC >= 30000 && __HP_aCC < 31400) || (__HP_aCC == 1)) // A.03.13: __HP_aCC == 1
+
+#if (__HP_aCC != 1)
+#   define _STLP_HAS_NO_NEW_C_HEADERS 1
+#endif
+
+#   define _STLP_HAS_NO_NEW_IOSTREAMS
+#   define _STLP_NO_QUALIFIED_FRIENDS       1
+// aCC bug ? need explicit args on constructors of partial specialized
+// classes
+#   define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 1
+// ?? fbp: really needed ?
+#   define _STLP_STATIC_ARRAY_BUG 1
+// ?? fbp : maybe present in some versions ?
+#   define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#   define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+// <exception> and stuff is in global namespace
+#   define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+// fbp : moved here
+#     define _STLP_VENDOR_GLOBAL_CSTD        1
+// #     define _INCLUDE_HPUX_SOURCE
+#   define _XPG4
+#   define _INCLUDE_XOPEN_SOURCE
+#   define _INCLUDE_AES_SOURCE
+#  endif /* < 314 */
+#   if __HP_aCC == 1
+#     define _STLP_BROKEN_USING_IN_CLASS
+#     define _STLP_USING_BASE_MEMBER
+#     define _STLP_NO_CWCHAR
+// #     define _STLP_NO_WCHAR_T 1
+#   endif
+# endif /* HP_ACC */
+
+// 
+# ifndef __HP_aCC
+#  define _STLP_NATIVE_INCLUDE_PATH ../CC
+#  define _STLP_NATIVE_C_INCLUDE_PATH ../include
+// it is HP's old cfront-based compiler.
+#  define _STLP_NO_BOOL 1
+// #  define _STLP_DONT_USE_BOOL_TYPEDEF 1
+#  define _STLP_NO_NEW_NEW_HEADER 1 
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+#  define _STLP_NO_SIGNED_BUILTINS
+#  define _STLP_HAS_NO_NAMESPACES 1
+#  define _STLP_NEED_TYPENAME 1
+#  define _STLP_NEED_EXPLICIT 1
+#  define _STLP_NO_EXCEPTION_SPEC 1
+#  define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+#  define _STLP_NO_ARROW_OPERATOR 1
+#  define _STLP_BASE_MATCH_BUG
+#  define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+#  define _STLP_NO_NEW_STYLE_CASTS 1
+// #  define _STLP_NO_WCHAR_T 1
+// #  define _STLP_LONG_LONG long long
+#  define _STLP_NEED_MUTABLE 1
+#  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+#  define _STLP_NO_BAD_ALLOC 1
+#  define _STLP_NO_MEMBER_TEMPLATES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+#  define _STLP_NO_QUALIFIED_FRIENDS 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#  define _STLP_MEMBER_POINTER_PARAM_BUG 1
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+#  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+// #  define _STLP_NO_METHOD_SPECIALIZATION 1
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+#  define _STLP_NO_EXCEPTION_HEADER 1
+#  define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+// #  define _STLP_STATIC_CONST_INIT_BUG 1
+// #  define _STLP_THROW_RETURN_BUG 1
+// #  define _STLP_LINK_TIME_INSTANTIATION 1
+// #  define _STLP_NO_TEMPLATE_CONVERSIONS 1
+#  define _STLP_NO_TYPEINFO 1
+#  define _STLP_WCHAR_T_IS_USHORT 1
+
+# endif /* cfront */
+
diff --git a/src/STLport/config/stl_ibm.h b/src/STLport/config/stl_ibm.h
new file mode 100644
index 0000000..7b00820
--- /dev/null
+++ b/src/STLport/config/stl_ibm.h
@@ -0,0 +1,139 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+#if !defined(__IBMCPP__) || (__IBMCPP__ < 500)
+# define _STLP_HAS_NO_NEW_C_HEADERS 1
+#endif
+
+// string literal problem, same as with SUN and aCC
+# define _STLP_INLINE_STRING_LITERAL_BUG 1
+# define _STLP_HAS_NATIVE_FLOAT_ABS
+
+#  define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+
+# ifdef __IBMCPP__
+#  define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+# endif
+
+// #  if ( defined (__MULTI__) && defined (__WINDOWS__))
+// #   define  _STLP_WIN32THREADS 1          // Only Visual Age 3.5 for Windows
+// #  endif
+
+#  if ( defined (__MULTI__) && defined (__OS2__))
+#   define _STLP_OS2THREADS 1
+#  endif
+
+// __TEMPINC__ is set when /Ft+ option is used
+#  ifdef __TEMPINC__
+#    define _STLP_LINK_TIME_INSTANTIATION 1
+#  endif
+
+# if defined (__MVS__)
+// long long support is buggy - reported by Tinny Ng
+// #  if __EXTENDED__ && __COMPILER_VER__ >= 0x22060000
+// #   define _STLP_LONG_LONG long long
+// #  endif
+// boris : hstash reported it can be treated like UNIX
+#  define _STLP_UNIX 1
+#  define _STLP_NO_TYPEINFO 1
+#  undef _STLP_NATIVE_INCLUDE_PATH
+#  define _STLP_NATIVE_INCLUDE_PATH /usr/lpp/ioclib/include
+// same for C headers like <string.h>
+#  undef _STLP_NATIVE_C_INCLUDE_PATH
+#  define _STLP_NATIVE_C_INCLUDE_PATH /usr/include
+#  define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH /usr/include
+
+# elif (defined (__WINDOWS__) || defined (_AIX) || defined (__OS2__) ) && (__IBMCPP__ >= 350)
+
+#  define _STLP_LONG_LONG long long
+
+#endif
+
+#if !( defined( __xlC__ ) && __xlC__ >= 0x500 )
+
+// AIX xlC 3.1 , 3.0.1 ==0x301
+// Visual Age C++ 3.x
+// OS-390 C++
+// fbp : should be more version-specific!
+
+#  define _STLP_NO_BOOL 1
+#  define _STLP_DONT_USE_BOOL_TYPEDEF 1
+#  define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+#  define _STLP_HAS_NO_NAMESPACES 1
+#  define _STLP_NEED_TYPENAME 1
+#  define _STLP_NEED_EXPLICIT 1
+#  define _STLP_NO_ARROW_OPERATOR 1
+#  define _STLP_NO_NEW_STYLE_CASTS 1
+#  define _STLP_NO_WCHAR_T 1
+#  define _STLP_NEED_MUTABLE 1
+#  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+#  define _STLP_NO_BAD_ALLOC 1
+
+#  define _STLP_NO_MEMBER_TEMPLATES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+#  define _STLP_NO_QUALIFIED_FRIENDS 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+
+#  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+#  define _STLP_NO_METHOD_SPECIALIZATION 1
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+#  define _STLP_NO_EXCEPTION_HEADER 1
+
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  define _STLP_NO_NEW_NEW_HEADER 1
+
+#  if defined (__OS2__) && (__IBMCPP__ <= 350)
+#   define _STLP_NO_TYPEINFO 1
+#  endif
+#  define _STLP_NO_NEW_NEW_HEADER 1
+
+#  define _STLP_STATIC_CONST_INIT_BUG 1
+// #  define _STLP_THROW_RETURN_BUG 1
+
+
+#  define _STLP_NO_TEMPLATE_CONVERSIONS 1
+#  define _STLP_UNINITIALIZABLE_PRIVATE 1
+#  define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+#  define _STLP_STATIC_ARRAY_BUG 1
+
+// AIX xlC, Visual Age 3.0 for OS/2 and MS 
+#  define _STLP_TRIVIAL_DESTRUCTOR_BUG
+
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+#  define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+
+#if __IBMCPP__ <= 350
+#  define _STLP_NEED_UNREACHABLE_RETURN 1
+#endif
+
+#if __IBMCPP__ < 350
+#  define _STLP_NO_LONG_DOUBLE 1
+#endif
+
+#if __IBMCPP__ >= 365
+// does not have new C headers, but has div()
+#  define _STLP_LDIV
+#endif
+
+#endif /* xlC 5 */
+
+/* detect xlC5 by: */
+#if defined(__IBMCPP__) && (500 <= __IBMCPP__) && (__IBMCPP__ < 700)
+// #define _STLP_USE_EXCEPTIONS 1
+# define _STLP_STATIC_CONST_INIT_BUG 1 
+//#pragma report(disable,CPPC1500029)
+// unsigned 32-bit integer type
+#  define _STLP_UINT32_T unsigned int
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+// #  define _STLP_RAND48 1
+# endif /* __IBMCPP__ == 500 */
+
+
+
+
diff --git a/src/STLport/config/stl_icc.h b/src/STLport/config/stl_icc.h
new file mode 100644
index 0000000..bf0faff
--- /dev/null
+++ b/src/STLport/config/stl_icc.h
@@ -0,0 +1,49 @@
+ /* stl_icc.h
+  * *
+  * * A list of Intel compiler for Linux portion of STLport settings.
+  * * This file is being included by stlcomp.h
+  * */
+# ifndef _STLP_ICC_H
+# define _STLP_ICC_H
+
+# define _STLP_UINT32_T unsigned long
+# define _STLP_LONG_LONG long long
+# define _STLP_TYPENAME_ON_RETURN_TYPE typename
+
+// Edit relative path below (or put full path) to get native
+// compiler headers included. Default is "../include".
+// C headers may reside in different directory, so separate macro is provided.
+# if (__INTEL_COMPILER < 800)
+# define _STLP_NATIVE_INCLUDE_PATH ../include
+# else
+// The header of files have moved to a new location on Linux Intel C++ compiler 
+// starting with version 8, which has GCC 3.2 compatability.
+# define _STLP_NATIVE_INCLUDE_PATH ../include/c++
+# define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH/backward
+#   ifndef __GNUC__ 
+//  If GCC compatability is diabled (-no-gcc is specified) STD needs to be redefined.
+#   define _STLP_REDEFINE_STD 1
+#   endif
+# endif
+# define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+
+// This macro constructs header path from directory and name.
+# define _STLP_MAKE_HEADER(path, header) <path/header>
+// This macro constructs native include header path from include path and name.
+# define _STLP_NATIVE_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+
+# define _STLP_NATIVE_CPP_C_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+
+// Same for C headers
+# define _STLP_NATIVE_C_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_C_INCLUDE_PATH,header)
+
+# undef _STLP_WINCE
+
+# ifndef __GNUC__ 
+# define __GNUC__ 1
+# endif
+
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# endif
+
diff --git a/src/STLport/config/stl_intel.h b/src/STLport/config/stl_intel.h
new file mode 100644
index 0000000..9ef13ca
--- /dev/null
+++ b/src/STLport/config/stl_intel.h
@@ -0,0 +1,14 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# if (__ICL >= 450)
+#  define _STLP_DLLEXPORT_NEEDS_PREDECLARATION 1
+# endif
+
+# define _STLP_IMPORT_TEMPLATE_KEYWORD extern
+
+# include <config/stl_msvc.h>
+
+# undef  _STLP_LONG_LONG
+# define _STLP_LONG_LONG long long
+
diff --git a/src/STLport/config/stl_kai.h b/src/STLport/config/stl_kai.h
new file mode 100644
index 0000000..cb883c0
--- /dev/null
+++ b/src/STLport/config/stl_kai.h
@@ -0,0 +1,58 @@
+// STLport config file for KAI C++ compiler
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+
+#  ifndef __KAI_STRICT /* _NO_LONGLONG */
+#   define _STLP_LONG_LONG long long
+#  endif
+
+#  if !defined (__EXCEPTIONS) && ! defined (_EXCEPTIONS)
+#    define _STLP_HAS_NO_EXCEPTIONS
+#  endif
+
+# ifndef __BUILDING_STLPORT
+#  define _STLP_LINK_TIME_INSTANTIATION 1
+# endif
+
+// two levels of macros do not work good with kcc.
+#   define _STLP_NATIVE_HEADER(header)    <../include/##header> 
+#   define _STLP_NATIVE_C_HEADER(header)    <../include/##header> 
+#   define _STLP_NATIVE_CPP_C_HEADER(header)    <../include/##header> 
+#   define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+
+# ifdef _WIN32
+#  define _STLP_MINIMUM_IMPORT_STD
+# endif
+
+// KAI C++ uses EDG front-end, but apparently different switches
+// #  define __EDG_SWITCHES 1
+
+
+#  define _STLP_VENDOR_GLOBAL_CSTD 1
+#  define _STLP_VENDOR_MB_NAMESPACE std
+
+// boris : some of those may also apply to KCC 3.4
+# if __KCC_VERSION < 4000
+#  define _STLP_VENDOR_GLOBAL_EXCEPT_STD 1
+
+# endif
+
+// this is multiplatform compiler, so here should go system-dependant section
+// This really should be in platform-specific files, like stl_solaris.h
+# ifdef __linux__
+#  define _STLP_NO_NATIVE_WIDE_STREAMS 1
+#  define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+# elif defined (__sun) || defined (sun)
+// # define _STLP_VENDOR_MB_NAMESPACE
+#  include <config/stl_solaris.h>
+# elif defined (__hpux)
+#  define _STLP_NO_NATIVE_WIDE_FUNCTIONS
+# elif defined (__sgi)
+// this requires some discrimination on whether we are actually on 
+// a system officially supported by KAI. 
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+#  include <standards.h>
+# endif
+
diff --git a/src/STLport/config/stl_mlc.h b/src/STLport/config/stl_mlc.h
new file mode 100644
index 0000000..be6a5f7
--- /dev/null
+++ b/src/STLport/config/stl_mlc.h
@@ -0,0 +1,8 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+#define _STLP_NO_MEMBER_TEMPLATES           	// Compiler does not support member templates
+#define _STLP_NO_MEMBER_TEMPLATE_CLASSES    	// Compiler does not support member template classes
+
+#define _STLP_HAS_NEW_NEW_HEADER
+#define _STLP_HAS_NO_NEW_IOSTREAMS              // Native C++ library does not provide new-style templatized iostreams
diff --git a/src/STLport/config/stl_msvc.h b/src/STLport/config/stl_msvc.h
new file mode 100644
index 0000000..ebdfc1e
--- /dev/null
+++ b/src/STLport/config/stl_msvc.h
@@ -0,0 +1,208 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+// Microsoft Visual C++ 4.0, 4.1, 4.2, 5.0, 6.0, 7.0, 7.1, ICL
+
+
+// Common features for VC++ 4.0 and higher
+# ifdef _M_IA64
+#  define _STLP_NATIVE_HEADER(x) <../crt/##x>
+#  define _STLP_NATIVE_C_HEADER(x) <../crt/##x>
+#  define _STLP_NATIVE_CPP_C_HEADER(x) <../crt/##x>
+#  define _STLP_NATIVE_OLD_STREAMS_HEADER(x) <../crt/##x>
+#  define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../crt/##header>
+#  define _STLP_GLOBAL_NEW_HANDLER
+# else
+#  define _STLP_NATIVE_HEADER(x) <../include/##x>
+#  define _STLP_NATIVE_C_HEADER(x) <../include/##x>
+#  define _STLP_NATIVE_CPP_C_HEADER(x) <../include/##x>
+#  define _STLP_NATIVE_OLD_STREAMS_HEADER(x) <../include/##x>
+#  define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+# endif
+
+# define _STLP_CALL __cdecl
+
+# ifndef _STLP_LONG_LONG
+#  define _STLP_LONG_LONG  __int64
+# endif
+
+# define _STLP_PRAGMA_ONCE
+
+// these switches depend on compiler flags
+# ifndef _CPPUNWIND
+#  define _STLP_HAS_NO_EXCEPTIONS 1
+# endif
+
+# define _STLP_VENDOR_UNEXPECTED_STD
+
+# if defined ( _MT ) && !defined (_STLP_NO_THREADS)  && !defined (_REENTRANT)
+#   define _REENTRANT 1
+# endif
+
+# if !defined (_NATIVE_WCHAR_T_DEFINED)
+# define _STLP_WCHAR_T_IS_USHORT 1
+# endif
+
+# define _STLP_MINIMUM_IMPORT_STD
+
+# ifdef _STLP_MSVC
+
+# ifndef _STLP_MSVC50_COMPATIBILITY
+#  define _STLP_MSVC50_COMPATIBILITY   1
+# endif
+
+#  define _STLP_DLLEXPORT_NEEDS_PREDECLARATION 1
+#  define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+// # ifndef __BUILDING_STLPORT
+// #  define _STLP_USE_TEMPLATE_EXPORT 1
+// # endif
+
+# if (_STLP_MSVC >= 1310)
+# define _STLP_NO_METHOD_SPECIALIZATION 1
+# endif	//	(_STLP_MSVC >= 1310)
+
+#  if (_STLP_MSVC > 1100)
+     typedef char __stl_char;
+#   define _STLP_DEFAULTCHAR __stl_char
+#  endif /* (_STLP_MSVC < 1100 ) */
+
+# if (_STLP_MSVC <= 1310)
+# define _STLP_STATIC_CONST_INIT_BUG   1
+# endif	//	(_STLP_MSVC <= 1310)
+
+# if (_STLP_MSVC <= 1300) 
+#  define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+
+#  define _STLP_NO_TYPENAME_IN_TEMPLATE_HEADER
+// fails to properly resolve call to sin() from within sin()
+#  define _STLP_SAME_FUNCTION_NAME_RESOLUTION_BUG
+#  define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1
+// boris : not defining this macro for SP5 causes other problems
+// #  if !defined (_MSC_FULL_VER) || (_MSC_FULL_VER < 12008804 )
+#  define _STLP_NO_USING_FOR_GLOBAL_FUNCTIONS 1
+//#  endif
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_FRIEND_TEMPLATES
+// VC++ cannot handle default allocator argument in template constructors
+#  define _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+// there is no partial spec, and MSVC breaks on simulating it for iterator_traits queries
+#  define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+// #  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+#  define _STLP_NO_QUALIFIED_FRIENDS    1
+#  define _STLP_DONT_USE_BOOL_TYPEDEF 1
+# endif /* _STLP_MSVC <= 1300 */
+
+# endif /* _STLP_MSVC */
+
+# if (_MSC_VER <= 1310) 
+#  define _STLP_VENDOR_GLOBAL_CSTD
+// They included the necessary coding,
+// but the beta still has an issue with template classes
+// ok:    class a { static const int v = 2; };
+// error: template <class _Tp> class a { static const int v = 2; };
+#  if !defined (_STLP_WHOLE_NATIVE_STD) && ! defined (_STLP_REDEFINE_STD)
+#    define _STLP_REDEFINE_STD
+#  endif
+# endif /* (_MSC_VER <= 1310) */
+
+# if (_MSC_VER <= 1200)  // including MSVC 6.0
+//  these work, as long they are inline
+#  define _STLP_INLINE_MEMBER_TEMPLATES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_GLOBAL_NEW_HANDLER
+#  define _STLP_DONT_RETURN_VOID 1
+#  define _STLP_DONT_USE_NESTED_TCLASS_THROUGHT_TPARAM 1
+# endif /* (_MSC_VER <= 1200) */
+
+# if ( _MSC_VER<=1010 )
+// "bool" is reserved in MSVC 4.1 while <yvals.h> absent, so :
+// #    define _STLP_USE_ABBREVS           1
+#  define _STLP_NO_BAD_ALLOC
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+#  define _STLP_NO_NEW_NEW_HEADER 1
+# elif (_MSC_VER < 1100)
+// VC++ 4.2 and higher
+#  define _STLP_YVALS_H 1
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+# endif /* 1010 */
+
+# if defined (_STLP_MSVC) && ( _STLP_MSVC < 1200 ) /* VC++ 6.0 */
+// #  define _STLP_NO_MEMBER_TEMPLATES 1
+// #  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1 
+#  define _STLP_THROW_RETURN_BUG 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+# endif
+
+# if defined (_STLP_MSVC) && ( _STLP_MSVC < 1100 )
+#  ifndef _STLP_NO_OWN_IOSTREAMS
+#   define _STLP_NO_OWN_IOSTREAMS
+#   undef  _STLP_OWN_IOSTREAMS
+#  endif
+// #  define _STLP_NESTED_TYPE_PARAM_BUG 1
+// Debug mode does not work for 4.2
+#  ifdef _STLP_DEBUG
+#   pragma message ("STLport debug mode does not work for VC++ 4.2, turning _STLP_DEBUG off ...")
+#    undef _STLP_DEBUG
+#  endif
+#  define _STLP_NO_BOOL            1
+#  define _STLP_NEED_TYPENAME      1
+#  define _STLP_NEED_EXPLICIT      1
+#   define _STLP_NEED_MUTABLE       1
+#   define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+#   define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+
+// up to 4.2, library is in global namespace
+#   define _STLP_VENDOR_GLOBAL_STD
+#   define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+#   define _STLP_BROKEN_USING_DIRECTIVE  1
+#   define _STLP_NO_ARROW_OPERATOR
+#   define _STLP_NO_SIGNED_BUILTINS 1
+#   define _STLP_NO_EXCEPTION_SPEC 1
+#   undef  _STLP_DEFAULT_TYPE_PARAM
+#   undef  _STLP_HAS_NO_NAMESPACES
+#   undef  _STLP_NO_AT_MEMBER_FUNCTION
+#   undef  _STLP_NO_MEMBER_TEMPLATES
+#   undef  _STLP_NO_MEMBER_TEMPLATE_CLASSES
+#   define  _STLP_HAS_NO_NAMESPACES 1
+#   define  _STLP_NO_AT_MEMBER_FUNCTION 1
+#  define  _STLP_NO_MEMBER_TEMPLATES
+#  define  _STLP_NO_MEMBER_TEMPLATE_CLASSES
+# endif /* 1100 */
+
+// If we are under Windows CE, include appropriate config
+
+# ifdef UNDER_CE
+#   include <config/stl_wince.h>
+# endif
+
+# ifdef __ICL
+#  define _STLP_LIB_BASENAME "stlport_icl"
+# else
+# if (_MSC_VER >= 1310) 
+#   define _STLP_LIB_BASENAME "stlport_vc71"
+# elif (_MSC_VER >= 1300) 
+#   define _STLP_LIB_BASENAME "stlport_vc7"
+# elif (_MSC_VER >= 1200)
+#    define _STLP_LIB_BASENAME "stlport_vc6"
+//#   endif
+#  elif (_MSC_VER >= 1100)
+//#   ifdef _UNICODE
+//#    define _STLP_LIB_BASENAME "stlport_vc5_unicode"
+//#   else
+#    define _STLP_LIB_BASENAME "stlport_vc5"
+//#   endif
+#  endif /* (_MSC_VER >= 1200) */
+# endif /* __ICL */
+
+
+#    if (defined (__ICL) && (__ICL < 450)) || (_MSC_VER < 1200)
+//    only static STLport lib now works for ICL and VC 5.0
+#     undef  _STLP_USE_STATIC_LIB
+#     define _STLP_USE_STATIC_LIB
+//    disable hook which makes template symbols to be searched for in the library
+#     undef _STLP_NO_CUSTOM_IO
+#    endif
+
+#   include <config/vc_select_lib.h>
diff --git a/src/STLport/config/stl_mwerks.h b/src/STLport/config/stl_mwerks.h
new file mode 100644
index 0000000..5c9d5aa
--- /dev/null
+++ b/src/STLport/config/stl_mwerks.h
@@ -0,0 +1,140 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// Bring in definition of __MSL__ and related items
+#include <mslGlobals.h>
+#include <ansi_parms.h>
+
+//
+//  Compiler features
+//
+
+
+// *** CodeWarrior Compiler Common Features ***
+#  if __option(longlong)
+#   define _STLP_LONG_LONG	long long
+#  endif
+
+#  define _STLP_USE_UNIX_EMULATION_IO	1
+#  define _STLP_USE_AUTO_PTR_CONVERSIONS	1
+
+# ifdef __INTEL__
+#  define _STLP_LITTLE_ENDIAN
+# else
+#  define _STLP_BIG_ENDIAN
+# endif
+
+#if defined(_MSL_NO_LOCALE)
+#define _STLP_NO_IMPORT_LOCALE
+#endif
+#if !__option( wchar_type )
+# define _STLP_WCHAR_T_IS_USHORT
+#endif
+
+// *** CodeWarrior Compiler Common Bugs ***
+#  define __MSL_FIX_ITERATORS__(myType)		// Some MSL headers rely on this
+#  define _STLP_NO_FRIEND_TEMPLATES 1	// Bug mysteriously reintroduced in this version.
+#  define _STLP_THROW_RETURN_BUG	1
+
+//  *** Version-specific settings ***
+
+#  if __MWERKS__ >= 0x2405
+#   define _STLP_HAS_NATIVE_FLOAT_ABS
+#  endif
+
+#  if __MWERKS__ < 0x2405
+#   define _STLP_STATIC_CONST_INIT_BUG
+#  endif
+
+#  if __MWERKS__ <= 0x2303
+#   define _STLP_NO_TEMPLATE_CONVERSIONS	1
+#   define _STLP_NO_MEMBER_TEMPLATE_KEYWORD	1
+#  endif
+
+#  if __MWERKS__ < 0x2301
+#   define _STLP_MEMBER_SPECIALIZATION_BUG	1
+#  endif
+
+#  if __MWERKS__ < 0x2300		// CW Pro5 features
+#   define _STLP_INLINE_MEMBER_TEMPLATES 1
+#   define _STLP_RELOPS_IN_STD_BUG	 1
+#   define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+#   define _STLP_NO_TYPENAME_ON_RETURN_TYPE
+#  endif
+
+#  if __MWERKS__ < 0x2200		// CW Pro4 features
+#   define _STLP_BROKEN_USING_DIRECTIVE	1
+#   define _STLP_NO_MEMBER_TEMPLATES 1
+#   define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#   define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#   define _STLP_NO_FRIEND_TEMPLATES 1
+#   define _STLP_NO_QUALIFIED_FRIENDS 1
+#   define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#  endif
+
+#  if __MWERKS__ < 0x2100			// CW Pro3 features
+#   define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#   define _STLP_HAS_NO_NAMESPACES 1
+#   define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+#   define _STLP_NEED_TYPENAME				1
+#   define _STLP_NO_ARROW_OPERATOR 1
+#   define _STLP_TEMPLATE_PARAM_SUBTYPE_BUG	1
+#   define _STLP_FORCED_INLINE_INSTANTIATION_BUG	1
+#   define _STLP_MULTI_CONST_TEMPLATE_ARG_BUG	1
+#   define _STLP_INLINE_NAME_RESOLUTION_BUG	1
+// *** Metrowerks Standard Library Bug ***
+#   define _STLP_MSVC50_COMPATIBILITY 1
+#  endif
+
+#  if __MWERKS__ < 0x2000			// v. 2.0 features
+#   define _STLP_NO_WCHAR_T 1
+#   define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+#   define _STLP_NON_TYPE_TMPL_PARAM_BUG	1	// dwa 8/21/97 - this bug fixed for CWPro2
+#   define _STLP_UNINITIALIZABLE_PRIVATE  1		// dwa 10/23/97 - this bug fixed for CWPro2
+#  endif
+
+#  if __MWERKS__ < 0x1900         				// dwa 8/19/97 - 1.9 Compiler feature defines
+#   define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+#   define _STLP_BASE_TYPEDEF_BUG        1
+#   define _STLP_BASE_MATCH_BUG   1
+#   define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+#   define _STLP_DEFAULT_TYPE_PARAM  1			// More limited template parameters
+
+#   if __MWERKS__ < 0x1800
+    __GIVE_UP_WITH_STL(CW_18)
+#   endif
+
+#  endif
+
+
+// fixes to native inclusion wrappers. 
+# if __MWERKS__ >= 0x2300	// CWPro5 changes paths - dwa 2/28/99
+
+#  define _STLP_NATIVE_INCLUDE_PATH  ../include
+#  define _STLP_NATIVE_C_INCLUDE_PATH  ../include
+#  define _STLP_NATIVE_HEADER(header)     <../include/##header>  
+#  define _STLP_NATIVE_CPP_C_HEADER(header)     <../include/##header>
+#  define _STLP_NATIVE_C_HEADER(header)     <../include/##header>
+#  define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <../include/##header>
+
+# else
+
+#  define _STLP_NATIVE_INCLUDE_PATH  Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C++:Include
+#  define _STLP_NATIVE_C_INCLUDE_PATH  Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:MSL Common:Public Includes
+#  define _STLP_NATIVE_HEADER(header)     <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C++:Include:##header>
+#  define _STLP_NATIVE_CPP_C_HEADER(header)     <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C++:Include:##header>
+#  define _STLP_NATIVE_C_HEADER(header)     <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:MSL Common:Public Includes:##header>
+#   define _STLP_NATIVE_CPP_RUNTIME_HEADER(header) <Macintosh HD:Codewarrior Pro 4:Metrowerks CodeWarrior:Metrowerks Standard Library:MSL C:MSL Common:Public Includes:##header>
+
+# endif
+
+     // fbp
+# if !defined( __MSL_CPP__ ) || __MSL_CPP__ <= 0x4105
+#   define _STLP_NO_NATIVE_WIDE_STREAMS 1
+#  endif
+
+# define _STLP_LIB_BASENAME stlport_mwerks_x86
+# define _STLP_DLLEXPORT_NEEDS_PREDECLARATION 1
+
+// # include <config/vc_select_lib.h>
diff --git a/src/STLport/config/stl_mycomp.h b/src/STLport/config/stl_mycomp.h
new file mode 100644
index 0000000..d887f5d
--- /dev/null
+++ b/src/STLport/config/stl_mycomp.h
@@ -0,0 +1,268 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * Purpose of this file :
+ *
+ * A list of COMPILER-SPECIFIC portion of STLport settings.
+ * This file is provided to help in manual configuration
+ * of STLport. This file is being included by stlcomp.h 
+ * when STLport is unable to identify your compiler.
+ * Please remove the error diagnostic below before adjusting 
+ * macros.
+ * 
+ */
+# ifndef _STLP_MYCOMP_H
+#  define  _STLP_MYCOMP_H
+
+# error "Your compiler version is not recognized by STLport. Please edit <config/stl_mycomp.h>"
+
+//==========================================================
+
+// the values choosen here as defaults try to give
+// maximum functionality on the most conservative settings
+
+// Mostly correct guess, change it for Alpha (and other environments
+// that has 64-bit "long")
+// #  define _STLP_UINT32_T unsigned long
+
+// Disables wchar_t functionality
+// #  define _STLP_NO_WCHAR_T  1
+
+// Define if wchar_t is not a unique type, and is actually a typedef to unsigned short. 
+// #  define _STLP_WCHAR_T_IS_USHORT 1
+
+// Uncomment if long long is available
+// #  define _STLP_LONG_LONG long long
+
+// Uncomment if long double is not available
+// #  define _STLP_NO_LONG_DOUBLE 1
+
+// Uncomment this if your compiler does not support "typename" keyword
+// #  define _STLP_NEED_TYPENAME 1
+
+// Uncomment this if your compiler does not support "mutable" keyword
+// #  define _STLP_NEED_MUTABLE 1
+
+// Uncomment this if your compiler does not support "explicit" keyword
+// #  define _STLP_NEED_EXPLICIT 1
+
+// Uncomment if new-style-casts like const_cast<> are not available
+// #  define _STLP_NO_NEW_STYLE_CASTS 1
+
+// Uncomment this if your compiler does not have "bool" type
+// #  define  _STLP_NO_BOOL 1
+
+// Uncomment this if your compiler does not have "bool" type, but has "bool" keyword reserved
+// #  define  _STLP_DONT_USE_BOOL_TYPEDEF 1
+
+// Uncomment this if your compiler does not have "bool" type, but defines "bool" in <yvals.h>
+// #  define  _STLP_YVALS_H 1
+
+// Uncomment this if your compiler has limited or no default template arguments for classes
+// #  define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+
+// Uncomment this if your compiler support only complete (not dependent on other parameters)
+// types as default parameters for class templates
+// #  define _STLP_DEFAULT_TYPE_PARAM 1
+
+// Uncomment this if your compiler has problem with not-type
+// default template parameters
+// #  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+
+// Define if compiler has
+// trouble with functions getting non-type-parameterized classes as parameters
+// #  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+
+// Uncomment this if your compiler lacks static data members.
+// Uncomment next line if your compiler supports __attribute__((weak))
+// #  define _STLP_NO_STATIC_TEMPLATE_DATA 1
+// #  define _STLP_WEAK_ATTRIBUTE 1
+
+// Uncomment this if your compiler does not support namespaces 
+// #  define _STLP_HAS_NO_NAMESPACES 1
+
+// Uncomment if "using" keyword does not work with template types 
+// # define _STLP_BROKEN_USING_DIRECTIVE 1
+
+// Uncomment this if your compiler does not support exceptions
+// #  define _STLP_HAS_NO_EXCEPTIONS 1
+
+// Uncomment this if your compiler does not support exception specifications
+// #  define _STLP_NO_EXCEPTION_SPEC
+
+// Define this if your compiler requires return statement after throw()
+// # define _STLP_THROW_RETURN_BUG 1
+
+// Define this if your compiler do not support return of void
+// # define _STLP_DONT_RETURN_VOID 1
+
+// Header <new> that comes with the compiler 
+// does not define bad_alloc exception
+// #  define _STLP_NO_BAD_ALLOC  1
+
+// Define this if your compiler do not throw bad_alloc from the new operator
+// #  define _STLP_NEW_DONT_THROW  1
+
+// Uncomment if member template methods are not available
+// #  define _STLP_NO_MEMBER_TEMPLATES   1
+
+// Uncomment if member template classes are not available
+// #  define _STLP_NO_MEMBER_TEMPLATE_CLASSES   1
+
+// Uncomment if you cannot access member template classe throught a class template parameter
+// # define _STLP_DONT_USE_NESTED_TCLASS_THROUGHT_TPARAM 1
+
+// Uncomment if no "template" keyword should be used with member template classes
+// #  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD   1
+
+// Uncomment if friend member templates are not available
+// #  define _STLP_NO_FRIEND_TEMPLATES   1
+
+// Compiler does not accept friend declaration qualified with namespace name.
+// #  define _STLP_NO_QUALIFIED_FRIENDS 1
+
+// Uncomment if partial specialization is not available
+// #  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+
+// Define if class being partially specialized require full name (template parameters)
+// of itself for method declarations
+// #  define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+
+// Compiler has problems specializing members of partially 
+// specialized class
+// #  define _STLP_MEMBER_SPECIALIZATION_BUG
+
+// Uncomment if partial order of template functions is not available
+// #  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+
+// Uncomment if specialization of methods is not allowed
+// #  define _STLP_NO_METHOD_SPECIALIZATION  1
+
+// Uncomment if full  specialization does not use partial spec. syntax : template <> struct ....
+// #  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX  1
+
+// Uncomment if compiler does not support explicit template arguments for functions
+// # define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+
+// Uncomment if "__typetraits is being instaniated automatically by the compiler (SGI only ?)
+// #  define _STLP_AUTOMATIC_TYPE_TRAITS 1
+
+// Uncomment this if your compiler can't inline while(), for()
+// #  define _STLP_LOOP_INLINE_PROBLEMS 1
+
+// Define if the compiler fails to match a template function argument of base
+// #  define _STLP_BASE_MATCH_BUG          1
+
+// Define if the compiler fails to match a template function argument of base
+// (non-template)
+//#  define  _STLP_NONTEMPL_BASE_MATCH_BUG 1
+
+// Define if the compiler rejects outline method definition 
+// explicitly taking nested types/typedefs
+// #  define _STLP_NESTED_TYPE_PARAM_BUG   1
+
+// Compiler requires typename keyword on outline method definition 
+// explicitly taking nested types/typedefs
+// #define  _STLP_TYPENAME_ON_RETURN_TYPE
+
+// Define if the baseclass typedefs not visible from outside
+// #  define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+
+// if your compiler have serious problems with typedefs, try this one
+// #  define _STLP_BASE_TYPEDEF_BUG          1
+
+// Uncomment if getting errors compiling mem_fun* adaptors
+// #  define _STLP_MEMBER_POINTER_PARAM_BUG 1
+
+// #  define _STLP_UNINITIALIZABLE_PRIVATE  1
+
+// Defined if the compiler
+// has trouble instantiating static array members with dimension defined as enum
+// # define _STLP_STATIC_ARRAY_BUG
+
+// * _STLP_STATIC_CONST_INIT_BUG: defined if the compiler can't handle a
+//   constant-initializer in the declaration of a static const data member
+//   of integer type.  (See section 9.4.2, paragraph 4, of the C++ standard.)
+// # define _STLP_STATIC_CONST_INIT_BUG
+
+// Define if default constructor for builtin integer type fails to initialize it to 0
+// #  define _STLP_DEFAULT_CONSTRUCTOR_BUG    1
+
+// Defined if constructor
+// required to explicitly call member's default constructors for const objects
+// #  define _STLP_CONST_CONSTRUCTOR_BUG    1
+
+// Defined if the compiler has trouble calling POD-types constructors/destructors
+// #  define _STLP_TRIVIAL_CONSTRUCTOR_BUG    1
+// #  define _STLP_TRIVIAL_DESTRUCTOR_BUG    1
+
+// Define if having problems specializing maps/sets with
+// key type being const 
+// #  define _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+
+// Uncomment this to disable -> operators on all iterators
+// #  define   _STLP_NO_ARROW_OPERATOR 1
+
+// Uncomment this to disble at() member functions for containers
+// #  define   _STLP_NO_AT_MEMBER_FUNCTION 1
+
+// Uncomment if native new-style iostreams are not available
+// #define    _STLP_HAS_NO_NEW_IOSTREAMS	1
+
+// Define this if compiler lacks <exception> header
+// #  define _STLP_NO_EXCEPTION_HEADER 1
+
+// Uncomment this if your C library has lrand48() function
+// #  define _STLP_RAND48 1
+
+// Uncomment if native new-style C library headers lile <cstddef>, etc are not available.
+// #   define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+// uncomment if new-style headers <new> is available
+// #  define _STLP_HAS_NEW_NEW_HEADER 1
+
+// uncomment this if <iostream> and other STD headers put their stuff in ::namespace,
+// not std::
+// #  define _STLP_VENDOR_GLOBAL_STD
+
+// uncomment this if <cstdio> and the like put stuff in ::namespace,
+// not std::
+// #  define _STLP_VENDOR_GLOBAL_CSTD
+
+// Edit relative path below (or put full path) to get native 
+// compiler headers included. Default is "../include".
+// C headers may reside in different directory, so separate macro is provided.
+// Hint : never install STLport in the directory that ends with "include"
+// # define _STLP_NATIVE_INCLUDE_PATH ../include
+// # define _STLP_NATIVE_C_INCLUDE_PATH ../include
+// # define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+
+// This macro constructs header path from directory and name.
+// You may change it if your compiler does not understand "/". 
+// #  define _STLP_MAKE_HEADER(path, header) <path/header>
+
+// This macro constructs native include header path from include path and name.
+// You may have do define it if experirncing problems with preprocessor
+// # define _STLP_NATIVE_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+
+// Same for C headers
+// #define _STLP_NATIVE_C_HEADER(header)
+
+//==========================================================
+# endif
diff --git a/src/STLport/config/stl_sco.h b/src/STLport/config/stl_sco.h
new file mode 100644
index 0000000..05287ac
--- /dev/null
+++ b/src/STLport/config/stl_sco.h
@@ -0,0 +1,35 @@
+// SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x)
+
+
+#  define _STLP_NO_BAD_ALLOC 1
+
+// allocator::rebind used not to work properly
+// #  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+// #  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+#  define _STLP_NO_QUALIFIED_FRIENDS 1
+
+
+// #  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+
+//#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+//#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+// ???
+//#  define _STLP_STATIC_CONST_INIT_BUG 1
+
+// ???
+//#  define _STLP_LINK_TIME_INSTANTIATION 1
+
+// ???
+#  define _STLP_NO_TEMPLATE_CONVERSIONS 1
+
+#     define _STLP_LONG_LONG long long
+
+#     if defined(_REENTRANT)
+#           define _UITHREADS     /* if      UnixWare < 7.0.1 */
+#           define _STLP_UITHREADS
+#     endif /* _REENTRANT */
+
+# define _STLP_SCO_OPENSERVER
diff --git a/src/STLport/config/stl_select_lib.h b/src/STLport/config/stl_select_lib.h
new file mode 100644
index 0000000..4a6426b
--- /dev/null
+++ b/src/STLport/config/stl_select_lib.h
@@ -0,0 +1,36 @@
+# if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+#  if ! defined (_STLP_LIB_STATIC_SUFFIX)
+#   define _STLP_LIB_STATIC_SUFFIX ""
+#  endif
+
+// Note : the code below is intended to make use of compiled
+// STLport iostreams easier. If you are with to change names used for
+// STLport libraries , please also change RELEASE_NAME and DEBUG_NAME
+// macros in makefile ../../src/vc6.mak (or whatever .mak you are using to build
+// STLport). If you are using binaries, you may just rename the binaries.
+#    if ! defined (__BUILDING_STLPORT) && ! defined (_STLP_DONT_FORCE_MSVC_LIB_NAME)
+#     if defined (_STLP_USE_DECLSPEC)
+#      ifdef _STLP_DEBUG
+#       pragma comment(lib, _STLP_LIB_BASENAME"_stldebug.lib")
+#      elif (defined (_DEBUG) || defined (__DEBUG)) && defined (_STLP_USE_DEBUG_LIB)
+#       pragma comment(lib, _STLP_LIB_BASENAME"_debug.lib")
+#      else
+#       pragma comment(lib, _STLP_LIB_BASENAME".lib")
+#      endif
+#     else /* _STLP_USE_DECLSPEC */
+// fbp : for static linking, debug setting _MUST_ correspond to what
+// has been compiled into binary lib
+#      ifdef _STLP_DEBUG
+#       if (! defined (_DEBUG))
+#        error "For static link with STLport library, _DEBUG setting MUST be on when _STLP_DEBUG is on. (/MTd forces _DEBUG)"
+#       endif
+#       pragma comment(lib, _STLP_LIB_BASENAME"_stldebug"_STLP_LIB_STATIC_SUFFIX".lib")
+#      elif (defined (_DEBUG) || defined (__DEBUG)) && defined (_STLP_USE_DEBUG_LIB)
+#       pragma comment(lib, _STLP_LIB_BASENAME"_debug"_STLP_LIB_STATIC_SUFFIX".lib")
+#      else
+#       pragma comment(lib, _STLP_LIB_BASENAME""_STLP_LIB_STATIC_SUFFIX".lib")
+#      endif
+#     endif /* _STLP_USE_DECLSPEC */
+#    endif /* __BUILDING_STLPORT */
+#   endif /* _STLP_OWN_IOSTREAMS */
diff --git a/src/STLport/config/stl_sgi.h b/src/STLport/config/stl_sgi.h
new file mode 100644
index 0000000..b086981
--- /dev/null
+++ b/src/STLport/config/stl_sgi.h
@@ -0,0 +1,94 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+
+// define native include path before trying to include anything
+
+# define _STLP_NATIVE_HEADER(__x) </usr/include/CC/##__x>
+# define _STLP_NATIVE_C_HEADER(__x) </usr/include/##__x>
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(__x) </usr/include/CC/##__x> 
+# define _STLP_NATIVE_CPP_C_HEADER(__x) </usr/include/CC/##__x>
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(__x) </usr/include/CC/##__x>
+
+# define _STLP_NO_NATIVE_MBSTATE_T
+
+#define _STLP_NO_CSTD_FUNCTION_IMPORTS
+#define _STLP_NO_NATIVE_WIDE_FUNCTIONS
+#define _STLP_NO_MEMBER_TEMPLATE_CLASSES
+
+// #define _STLP_NO_BAD_ALLOC
+
+#define _STL_HAS_NAMESPACES
+
+#if ! defined (__EXCEPTIONS) && ! defined (_STLP_NO_EXCEPTIONS)
+# define _STLP_NO_EXCEPTIONS
+#endif
+
+// #define _STLP_NOTHROW throw()
+     
+#  define __EDG_SWITCHES
+
+// any version ???
+#  define _STLP_AUTOMATIC_TYPE_TRAITS 1
+
+#  define _STLP_USE_SGI_STRING         1
+
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+// #  define _STLP_VENDOR_GLOBAL_EXCEPT_STD
+
+// # if ! defined (_STLP_NO_OWN_IOSTREAMS) && ! defined (_STLP_NO_NEW_IOSTREAMS)
+#  define _STLP_NO_POST_COMPATIBLE_SECTION
+// # endif
+
+#  include <standards.h>
+
+# if !(_COMPILER_VERSION >= 730)
+#   define _STLP_NO_NEW_NEW_HEADER 1
+# endif
+
+# if (_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+#  define _STLP_EXTERN_RANGE_ERRORS
+# endif
+
+#   if !defined(_BOOL)
+#     define _STLP_NO_BOOL
+#   endif
+#   if defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32
+#     define _STLP_STATIC_CONST_INIT_BUG
+#   endif
+
+#   if (_COMPILER_VERSION < 720) || (defined(_MIPS_SIM) && _MIPS_SIM == _ABIO32)
+#     define _STLP_DEFAULT_CONSTRUCTOR_BUG
+#   endif
+#   if !((_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32)
+#     define _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+#   endif
+#   if !defined(_STANDARD_C_PLUS_PLUS)
+#     define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+#   endif
+#   if !((_COMPILER_VERSION >= 721) && defined(_NAMESPACES))
+#     define _STLP_HAS_NO_NAMESPACES
+#   endif 
+#   if (_COMPILER_VERSION < 721) || !defined(_STL_HAS_NAMESPACES) || defined(_STLP_NO_NAMESPACES)
+#     define _STLP_NO_EXCEPTION_HEADER
+#   endif
+#   if _COMPILER_VERSION < 730 || !defined(_STANDARD_C_PLUS_PLUS) || !defined(_NAMESPACES)
+#     define _STLP_NO_BAD_ALLOC
+#   endif
+#   if defined(_LONGLONG) && defined(_SGIAPI) && _SGIAPI
+#     define _STLP_LONG_LONG long long
+#   endif
+#   if !(_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+#     define _STLP_HAS_NO_NEW_IOSTREAMS
+#   endif
+#   if !(_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+#     define _STLP_NO_AT_MEMBER_FUNCTION
+#   endif
+// #   if !(_COMPILER_VERSION >= 730 && defined(_STANDARD_C_PLUS_PLUS))
+#   if !(_COMPILER_VERSION >= 721 && defined(_STANDARD_C_PLUS_PLUS))
+#     define _STLP_NO_TEMPLATE_CONVERSIONS
+#   endif
+#   if !((_COMPILER_VERSION >= 730) && defined(_MIPS_SIM) && _MIPS_SIM != _ABIO32)
+#     define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+#   endif
diff --git a/src/STLport/config/stl_solaris.h b/src/STLport/config/stl_solaris.h
new file mode 100644
index 0000000..8ae18f7
--- /dev/null
+++ b/src/STLport/config/stl_solaris.h
@@ -0,0 +1,35 @@
+
+// include system features file
+# include <sys/feature_tests.h>
+
+// system-dependent defines 
+
+# if defined (__SunOS_5_8) && ! defined (_STLP_HAS_NO_NEW_C_HEADERS) && ( __cplusplus >= 199711L)
+#  define _STLP_HAS_NATIVE_FLOAT_ABS
+# endif
+
+#if defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 >= 4)
+# define _STLP_RAND48 1
+#endif
+
+#if (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 == 4)) || defined (__SunOS_5_6)
+# define _STLP_WCHAR_SUNPRO_EXCLUDE 1
+# define _STLP_NO_NATIVE_WIDE_FUNCTIONS 1
+#endif
+
+// boris : this should always be defined for Solaris 5 & 6. Any ideas how to do it ?
+# if !(defined ( __KCC ) && __KCC_VERSION > 3400 ) && \
+  ((defined(__SunOS_5_5_1) || defined(__SunOS_5_6) ))
+#  ifndef _STLP_NO_NATIVE_MBSTATE_T
+#   define _STLP_NO_NATIVE_MBSTATE_T 1
+#  endif
+# endif /* KCC */
+
+// For SPARC we use lightweight synchronization
+# if defined (__sparc) /* && (defined (_REENTRANT) || defined (_PTHREADS)) */ && ((defined (__GNUC__) && defined (__sparc_v9__)) || \
+(defined (__sparcv9) && ! defined (_STLP_NO_OWN_IOSTREAMS)) ) \
+&& !defined(_NOTHREADS) && ! defined (_STLP_NO_SPARC_SOLARIS_THREADS)
+# define _STLP_SPARC_SOLARIS_THREADS
+# define _STLP_THREADS_DEFINED
+# endif
+
diff --git a/src/STLport/config/stl_sunpro.h b/src/STLport/config/stl_sunpro.h
new file mode 100644
index 0000000..3ff133f
--- /dev/null
+++ b/src/STLport/config/stl_sunpro.h
@@ -0,0 +1,175 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+#  define _STLP_LONG_LONG  long long
+#  define _STLP_LINK_TIME_INSTANTIATION 1
+
+# if ! defined(_BOOL)
+#  define _STLP_NO_BOOL 1
+# endif
+
+#  if (__SUNPRO_CC >= 0x500 ) && (!defined (__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT == 5 )) \
+    && defined (_STLP_NO_OWN_IOSTREAMS) && ! defined (_STLP_HAS_NO_NEW_IOSTREAMS)
+#    error "The wrapper (_STLP_NO_OWN_IOSTREAMS) mode does not work well without _STLP_HAS_NO_NEW_IOSTREAMS. Please set this flag. You will also have to use -liostream option on link phase."
+// #   define _STLP_HAS_NO_NEW_IOSTREAMS
+#  endif
+
+// compatibility mode stuff
+# if (__SUNPRO_CC >= 0x510) && (!defined (__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT == 5 ))
+#  define _STLP_NATIVE_INCLUDE_PATH ../CC/Cstd
+#  define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH ../CC
+# elif (__SUNPRO_CC >= 0x500) && (!defined (__SUNPRO_CC_COMPAT) || (__SUNPRO_CC_COMPAT == 5 ))
+#  define _STLP_NATIVE_INCLUDE_PATH ../CC
+# elif (defined (__SUNPRO_CC_COMPAT) && __SUNPRO_CC_COMPAT == 4)
+#  define _STLP_NATIVE_INCLUDE_PATH ../CC4
+# else
+#  define _STLP_NATIVE_INCLUDE_PATH ../CC
+# endif
+
+#  if (__SUNPRO_CC >= 0x500 ) && ( defined (_STLP_NO_NEW_IOSTREAMS) || defined (_STLP_HAS_NO_NEW_IOSTREAMS) )
+// if the project is set up to use libiostream (_STLP_NO_NEW_IOSTREAMS should be defined then),
+// use classic iostreams
+#   define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH ../CCios
+#  endif
+
+#  define _STLP_STATIC_CONST_INIT_BUG 1
+
+# if (__SUNPRO_CC < 0x530)
+// those are tested and proved not to work...
+#  define _STLP_STATIC_ARRAY_BUG 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#  define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# endif 
+
+
+# if defined (_STLP_OWN_IOSTREAMS)
+//#  if ! defined (_STLP_NO_OWN_NAMESPACE)
+//#   define _STLP_NO_OWN_NAMESPACE
+//#  endif
+# else
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+# endif
+
+// those do not depend on compatibility
+# if (__SUNPRO_CC < 0x510)
+#  define _STLP_NO_TYPENAME_ON_RETURN_TYPE 1 
+#  define _STLP_NONTEMPL_BASE_MATCH_BUG 1
+# endif
+
+# if (__SUNPRO_CC < 0x510) || (defined (__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT < 5))
+
+#  define _STLP_NO_QUALIFIED_FRIENDS 1
+
+// no partial , just for explicit one
+#  define _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+
+#  define _STLP_NO_MEMBER_TEMPLATES 1
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+# endif
+
+// Features that depend on compatibility switch
+# if ( __SUNPRO_CC < 0x500 ) || (defined (__SUNPRO_CC_COMPAT) && (__SUNPRO_CC_COMPAT < 5))
+
+#  ifndef _STLP_HAS_NO_NEW_IOSTREAMS
+#   define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  endif
+#  define _STLP_NO_NEW_NEW_HEADER 1
+// #  define _STLP_NO_RELOPS_NAMESPACE
+#  define _STLP_HAS_NO_NAMESPACES 1
+#  define _STLP_NEED_MUTABLE  1
+#  define _STLP_NO_BAD_ALLOC 1
+#  define _STLP_NO_EXCEPTION_HEADER 1
+#  define _STLP_NATIVE_C_INCLUDE_PATH ../include
+# elif (__SUNPRO_CC < 0x510)
+// #  define _STLP_NATIVE_C_HEADER(header) <../CC/##header##.SUNWCCh>
+#  define _STLP_NATIVE_CPP_C_HEADER(header) <../CC/##header##.SUNWCCh>
+#  define _STLP_NATIVE_C_INCLUDE_PATH /usr/include
+# elif defined( __SunOS_5_5_1 ) || defined( __SunOS_5_6 ) || defined( __SunOS_5_7 )
+#  define _STLP_NATIVE_C_INCLUDE_PATH ../CC/std
+#  define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../CC/std
+# else
+#  define _STLP_NATIVE_C_INCLUDE_PATH /usr/include
+#  define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../CC/std
+# endif
+
+
+
+#  if ( __SUNPRO_CC < 0x500 )
+
+# undef _STLP_NATIVE_C_HEADER
+# undef _STLP_NATIVE_CPP_C_HEADER
+
+#   define wint_t __wint_t 
+// famous CC 4.2 bug
+#   define _STLP_INLINE_STRING_LITERAL_BUG 1
+// /usr/include
+#   define _STLP_NATIVE_C_INCLUDE_PATH ../include
+
+// 4.2 cannot handle iterator_traits<_Tp>::iterator_category as a return type ;(
+#  define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+
+// 4.2 does not like it
+#  undef  _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+
+#  define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+
+#  define _STLP_NEED_TYPENAME 1
+#  define _STLP_NEED_EXPLICIT 1
+#  define _STLP_UNINITIALIZABLE_PRIVATE 1
+#  define _STLP_NO_BAD_ALLOC 1
+#  define _STLP_NO_ARROW_OPERATOR 1
+
+#  define _STLP_DEFAULT_CONSTRUCTOR_BUG 1
+#  define _STLP_GLOBAL_NESTED_RETURN_TYPE_PARAM_BUG 1
+#  undef  _STLP_HAS_NO_NEW_C_HEADERS
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+// #  define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+
+#   if ( __SUNPRO_CC < 0x420 )
+#    define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+#    define _STLP_NO_NEW_STYLE_CASTS 1
+#    define _STLP_NO_METHOD_SPECIALIZATION 1
+#    if ( __SUNPRO_CC > 0x401 )
+#     if (__SUNPRO_CC==0x410)
+#      define _STLP_BASE_TYPEDEF_OUTSIDE_BUG  1
+#     endif
+#    else
+   // SUNPro C++ 4.0.1
+#     define _STLP_BASE_MATCH_BUG          1
+#     define _STLP_BASE_TYPEDEF_BUG        1
+#      if ( __SUNPRO_CC < 0x401 )
+        __GIVE_UP_WITH_STL(SUNPRO_401)
+#      endif
+#    endif /* 4.0.1 */
+#   endif /* 4.2 */
+
+#  endif /* <  5.0 */
+
+# include <config/stl_solaris.h>
+
+#ifndef _MBSTATET_H
+#   define _MBSTATET_H
+#   undef _MBSTATE_T
+#   define _MBSTATE_T
+    typedef struct __mbstate_t {
+      #if defined(_LP64)
+        long    __filler[4];
+      #else
+        int     __filler[6];
+      #endif
+    } __mbstate_t;
+# ifndef _STLP_HAS_NO_NAMESPACES
+    namespace std {
+        typedef __mbstate_t     mbstate_t;
+    }
+    using std::mbstate_t;
+#else
+typedef __mbstate_t mbstate_t;
+# endif
+#endif  /* __MBSTATET_H */
diff --git a/src/STLport/config/stl_symantec.h b/src/STLport/config/stl_symantec.h
new file mode 100644
index 0000000..de6d83b
--- /dev/null
+++ b/src/STLport/config/stl_symantec.h
@@ -0,0 +1,42 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+// if not using maximum ANSI compatibility ( -A -Ab -Aw),
+// uncomment the following two lines:
+//#  define _STLP_NO_BOOL 1
+//#  define _STLP_NO_WCHAR_T 1
+
+
+#  define _STLP_HAS_NO_NAMESPACES 1
+
+#  define _STLP_NEED_TYPENAME 1
+#  define _STLP_NEED_EXPLICIT 1
+#  define _STLP_NO_NEW_STYLE_CASTS 1
+#  define _STLP_NEED_MUTABLE 1
+#  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+// #  define _STLP_NO_BAD_ALLOC 1
+
+#  define _STLP_NO_MEMBER_TEMPLATES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+#  define _STLP_NO_QUALIFIED_FRIENDS 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+
+// #  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+#  define _STLP_NO_METHOD_SPECIALIZATION 1
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+// #  define _STLP_NO_EXCEPTION_HEADER 1
+
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+
+#  define _STLP_STATIC_CONST_INIT_BUG 1
+#  define _STLP_THROW_RETURN_BUG 1
+// #  define _STLP_LINK_TIME_INSTANTIATION 1
+#  define _STLP_NO_TEMPLATE_CONVERSIONS 1
+
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+#  define _STLP_UNINITIALIZABLE_PRIVATE 1
+
diff --git a/src/STLport/config/stl_watcom.h b/src/STLport/config/stl_watcom.h
new file mode 100644
index 0000000..c615ebe
--- /dev/null
+++ b/src/STLport/config/stl_watcom.h
@@ -0,0 +1,152 @@
+// STLport configuration file
+// It is internal STLport header - DO NOT include it directly
+
+# ifndef _STLP_NO_OWN_IOSTREAMS 
+#  define _STLP_NO_OWN_IOSTREAMS
+# endif
+
+# define _STLP_NO_RELOPS_NAMESPACE
+# define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+
+#  define _STLP_HAS_SPECIFIC_PROLOG_EPILOG
+#  define _STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+#  define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+
+// On QNX, headers are supposed to be found in /usr/include,
+// so default "../include" should work.
+# ifndef __QNX__
+#  define _STLP_NATIVE_INCLUDE_PATH ../h
+# endif
+
+// Inline replacements for locking calls under Watcom
+// Define _STLP_NO_WATCOM_INLINE_INTERLOCK to keep using
+// standard WIN32 calls
+// Define _STL_MULTIPROCESSOR to enable lock
+#if !defined(_STLP_NO_WATCOM_INLINE_INTERLOCK)
+
+long    __stl_InterlockedIncrement( long *var );
+long    __stl_InterlockedDecrement( long *var );
+
+#ifdef _STL_MULTIPROCESSOR
+// Multiple Processors, add lock prefix
+#pragma aux __stl_InterlockedIncrement parm [ ecx ] = \
+        ".586"                  \
+        "mov eax, 1"            \
+        "lock xadd [ecx], eax"       \
+        "inc eax"               \
+        value [eax];
+
+        
+#pragma aux __stl_InterlockedDecrement parm [ ecx ] = \
+        ".586"                  \
+        "mov eax, 0FFFFFFFFh"   \
+        "lock xadd [ecx], eax"       \
+        "dec eax"               \
+        value [eax];
+#else 
+// Single Processor, lock prefix not needed
+#pragma aux __stl_InterlockedIncrement parm [ ecx ] = \
+        ".586"                  \
+        "mov eax, 1"            \
+        "xadd [ecx], eax"       \
+        "inc eax"               \
+        value [eax];
+        
+#pragma aux __stl_InterlockedDecrement parm [ ecx ] = \
+        ".586"                  \
+        "mov eax, 0FFFFFFFFh"   \
+        "xadd [ecx], eax"       \
+        "dec eax"               \
+        value [eax];
+#endif // _STL_MULTIPROCESSOR
+
+long    __stl_InterlockedExchange( long *Destination, long Value );
+                
+// xchg has auto-lock
+#pragma aux __stl_InterlockedExchange parm [ecx] [eax] = \
+        ".586"                  \
+        "xchg eax, [ecx]"       \
+        value [eax];
+#else
+
+#define __stl_InterlockedIncrement      InterlockedIncrement
+#define __stl_InterlockedDecrement      InterlockedDecrement
+#define __stl_InterlockedExchange       InterlockedExchange
+#endif /* INLINE INTERLOCK */
+
+#define _STLP_ATOMIC_INCREMENT(__x) __stl_InterlockedIncrement((long*)__x)
+#define _STLP_ATOMIC_DECREMENT(__x) __stl_InterlockedDecrement((long*)__x)
+#define _STLP_ATOMIC_EXCHANGE(__x, __y) __stl_InterlockedExchange((long*)__x, (long)__y)
+
+// boris : is this true or just the header is not in /usr/include ?
+# ifdef __QNX__
+#  define _STLP_NO_TYPEINFO 1
+# endif
+
+#  define _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER 1
+#  define _STLP_NO_CLASS_PARTIAL_SPECIALIZATION 1
+#  define _STLP_NO_MEMBER_TEMPLATE_KEYWORD 1
+#  define _STLP_NO_MEMBER_TEMPLATES 1
+#  define _STLP_NO_FRIEND_TEMPLATES 1
+#  define _STLP_NO_MEMBER_TEMPLATE_CLASSES 1
+
+
+#  define _STLP_LIMITED_DEFAULT_TEMPLATES 1
+#  define _STLP_HAS_NO_NAMESPACES 1
+#  define _STLP_NEED_TYPENAME 1
+
+#  if __WATCOMC__ < 1100
+#  define _STLP_NO_WCHAR_T 1
+#  define _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX 1
+#  endif
+
+#  define _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS 1
+
+#  define _STLP_STATIC_CONST_INIT_BUG 1
+// #  define _STLP_THROW_RETURN_BUG 1
+#  define _STLP_NO_TEMPLATE_CONVERSIONS 1
+
+#  define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+
+#  define _STLP_HAS_NO_NEW_IOSTREAMS 1
+#  define _STLP_HAS_NO_NEW_C_HEADERS 1
+#  define _STLP_NO_NEW_NEW_HEADER 1
+#  define _STLP_VENDOR_GLOBAL_STD
+
+#  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+#  define _STLP_NON_TYPE_TMPL_PARAM_BUG 1
+#  define _STLP_NONTEMPL_BASE_MATCH_BUG
+#  define _STLP_NO_EXCEPTION_HEADER 1
+#  define _STLP_NO_BAD_ALLOC 1
+
+#  define _STLP_NESTED_TYPE_PARAM_BUG 1
+
+#  define _STLP_NO_CSTD_FUNCTION_IMPORTS 1
+
+#  if (__WATCOM_CPLUSPLUS__ < 1100 )
+#   define _STLP_NO_BOOL 1
+#   define _STLP_NEED_EXPLICIT 1
+#   define _STLP_NEED_MUTABLE 1
+#   define _STLP_NO_ARROW_OPERATOR 1
+#  endif
+// This one is present in 11, but apparently has bugs (with auto_ptr).
+#   define _STLP_NO_NEW_STYLE_CASTS 1
+
+// Get rid of Watcom's min and max macros 
+#undef min 
+#undef max
+
+// for switches (-xs,  -xss,  -xst)
+//
+#if !(defined (__SW_XS) || defined (__SW_XSS) || defined(__SW_XST))
+#    define _STLP_HAS_NO_EXCEPTIONS 1
+# endif
+
+# if defined ( _MT ) && !defined (_NOTHREADS) && !defined (_REENTRANT)
+# define _REENTRANT 1
+# endif
+
+
+
+
+
diff --git a/src/STLport/config/stl_wince.h b/src/STLport/config/stl_wince.h
new file mode 100644
index 0000000..bcd628b
--- /dev/null
+++ b/src/STLport/config/stl_wince.h
@@ -0,0 +1,188 @@
+/*
+ * File to have Windows CE Toolkit for VC++ 5.0 working with STLport
+ * 09 - 03 - 1999
+ * Origin : Giuseppe Govi - g.govi at iol.it
+ */
+
+#ifndef _STLP_WINCE_H
+#define _STLP_WINCE_H
+
+// this flag is being used by STLport
+#   define _STLP_WINCE
+
+#ifndef _MT                            // Always threaded in CE
+  #define _MT
+#endif
+
+#define _STLP_NO_NATIVE_MBSTATE_T
+#define _STLP_NO_TYPEINFO
+#define _STLP_NO_BAD_ALLOC
+#define _STLP_NO_NEW_NEW_HEADER
+#define _STLP_OWN_IOSTREAMS
+
+// tell other parts no threads are there
+#   define _STLP_NO_THREADS 1
+
+// not all new-style headers are available...
+# define _STLP_HAS_NO_NEW_C_HEADERS
+
+#     undef _STLP_HAS_NO_EXCEPTIONS
+#     define _STLP_HAS_NO_EXCEPTIONS
+#     undef _STLP_NO_EXCEPTION_HEADER
+#     define _STLP_NO_EXCEPTION_HEADER
+
+// we have to use malloc instead of new
+# undef  _STLP_USE_NEWALLOC
+# define _STLP_USE_MALLOC
+
+//# ifdef _STLP_MSVC
+//#     pragma warning (disable: 4786)
+//# endif
+
+#ifdef _STLP_WINCE_USE_OUTPUTDEBUGSTRING
+#define _STLP_WINCE_TRACE(msg)   OutputDebugString(msg)
+#else
+#define _STLP_WINCE_TRACE(msg)   MessageBox(NULL,(msg),NULL,MB_OK)
+#endif
+
+#ifndef __THROW_BAD_ALLOC
+#define __THROW_BAD_ALLOC _STLP_WINCE_TRACE(L"out of memory"); ExitThread(1)
+#endif
+
+#ifndef _SIZE_T_DEFINED
+typedef unsigned int size_t;
+#define _SIZE_T_DEFINED
+#endif
+
+#ifndef _WCHAR_T_DEFINED
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+
+#ifndef _TIME_T_DEFINED
+typedef unsigned long time_t;
+#define _TIME_T_DEFINED
+#endif
+
+//ptrdiff_t is not defined in Windows CE SDK
+#ifndef _PTRDIFF_T_DEFINED
+typedef int ptrdiff_t;
+#define _PTRDIFF_T_DEFINED
+#endif
+
+//clock_t is not defined in Windows CE SDK
+#ifndef _CLOCK_T_DEFINED
+typedef long clock_t;
+#define _CLOCK_T_DEFINED
+#endif
+
+//struct tm is not defined in Windows CE SDK
+#ifndef _TM_DEFINED
+struct tm {
+        int tm_sec;     /* seconds after the minute - [0,59] */
+        int tm_min;     /* minutes after the hour - [0,59] */
+        int tm_hour;    /* hours since midnight - [0,23] */
+        int tm_mday;    /* day of the month - [1,31] */
+        int tm_mon;     /* months since January - [0,11] */
+        int tm_year;    /* years since 1900 */
+        int tm_wday;    /* days since Sunday - [0,6] */
+        int tm_yday;    /* days since January 1 - [0,365] */
+        int tm_isdst;   /* daylight savings time flag */
+        };
+#define _TM_DEFINED
+#endif
+
+// Some useful routines that are missing in Windows CE SDK
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+  char *      __cdecl getenv(const char *);
+  struct tm * __cdecl gmtime(const time_t *);
+  int         __cdecl remove(const char *);
+  int         __cdecl rename(const char *, const char *);
+  time_t      __cdecl time(time_t *);
+
+  #if (_WIN32_WCE < 300)
+    char * __cdecl strrchr(const char *, int);
+  #endif
+
+#ifdef __cplusplus
+}
+
+#ifndef __PLACEMENT_NEW_INLINE
+inline void *__cdecl operator new(size_t, void *_P) { return (_P); }
+#define __PLACEMENT_NEW_INLINE
+#endif
+
+// Only defined as macros in Windows CE SDK
+#include _STLP_NATIVE_C_HEADER(ctype.h)
+
+#if (_WIN32_WCE < 300)                  // Only wide chars for older versions
+#define _isctype iswctype
+#endif
+
+inline int (isalpha)(int c) { return _isctype(c, _ALPHA); }
+inline int (isupper)(int c) { return _isctype(c, _UPPER); }
+inline int (islower)(int c) { return _isctype(c, _LOWER); }
+inline int (isdigit)(int c) { return _isctype(c, _DIGIT); }
+inline int (isxdigit)(int c) { return _isctype(c, _HEX); }
+inline int (isspace)(int c) { return _isctype(c, _SPACE); }
+inline int (ispunct)(int c) { return _isctype(c, _PUNCT); }
+inline int (isalnum)(int c) { return _isctype(c, _ALPHA|_DIGIT); }
+inline int (isprint)(int c) { return _isctype(c, _BLANK|_PUNCT|_ALPHA|_DIGIT); }
+inline int (isgraph)(int c) { return _isctype(c, _PUNCT|_ALPHA|_DIGIT); }
+inline int (iscntrl)(int c) { return _isctype(c, _CONTROL); }
+inline int (isascii)(int c) { return ((unsigned)(c) < 0x80); }
+
+#undef _isctype
+
+inline int (iswalpha)(int c) { return iswctype(c, _ALPHA); }
+inline int (iswupper)(int c) { return iswctype(c, _UPPER); }
+inline int (iswlower)(int c) { return iswctype(c, _LOWER); }
+inline int (iswdigit)(int c) { return iswctype(c, _DIGIT); }
+inline int (iswxdigit)(int c) { return iswctype(c, _HEX); }
+inline int (iswspace)(int c) { return iswctype(c, _SPACE); }
+inline int (iswpunct)(int c) { return iswctype(c, _PUNCT); }
+inline int (iswalnum)(int c) { return iswctype(c, _ALPHA|_DIGIT); }
+inline int (iswprint)(int c) { return iswctype(c, _BLANK|_PUNCT|_ALPHA|_DIGIT); }
+inline int (iswgraph)(int c) { return iswctype(c, _PUNCT|_ALPHA|_DIGIT); }
+inline int (iswcntrl)(int c) { return iswctype(c, _CONTROL); }
+inline int (iswascii)(int c) { return ((unsigned)(c) < 0x80); }
+
+#endif /* __cplusplus */
+
+#if !defined(WIN32_LEAN_AND_MEAN)       // Minimise windows includes
+  #define WIN32_LEAN_AND_MEAN
+#endif
+#if !defined(VC_EXTRALEAN)
+  #define VC_EXTRALEAN
+#endif
+#if !defined(STRICT)
+  #define STRICT
+#endif
+#if !defined(NOMINMAX)
+  #define NOMINMAX
+#endif
+
+#ifndef __WINDOWS__
+#include <windows.h>
+#endif
+
+#ifndef _ABORT_DEFINED
+# define _STLP_ABORT() TerminateProcess(GetCurrentProcess(), 0)
+# define _ABORT_DEFINED
+#endif
+
+#ifndef _ASSERT_DEFINED
+# define assert(expr) _STLP_ASSERT(expr)
+# define _ASSERT_DEFINED
+#endif
+
+// they say it's needed 
+# include <windows.h>
+
+#endif /* _STLP_WCE_H */
+
+
diff --git a/src/STLport/config/stlcomp.h b/src/STLport/config/stlcomp.h
new file mode 100644
index 0000000..cde65ce
--- /dev/null
+++ b/src/STLport/config/stlcomp.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * Purpose of this file :
+ *
+ * To hold COMPILER-SPECIFIC portion of STLport settings.
+ * In general, user should not edit this file unless 
+ * using the compiler not recognized below.
+ *
+ * If your compiler is not being recognized yet, 
+ * please look for definitions of macros in stl_mycomp.h,
+ * copy stl_mycomp.h to stl_YOUR_COMPILER_NAME, 
+ * adjust flags for your compiler, and add  <include config/stl_YOUR_COMPILER_NAME>
+ * to the secton controlled by unique macro defined internaly by your compiler.
+ *
+ * To change user-definable settings, please edit <../stl_user_config.h> 
+ *
+ */
+
+#ifndef _STLP_COMP_H
+# define _STLP_COMP_H
+
+#  define __GIVE_UP_WITH_STL(message) void give_up() \
+   { upgrade_the_compiler_to_use_STL;}
+
+/* distinguish real MSC from Metrowerks and Intel */
+# if defined(_MSC_VER) && !defined(__MWERKS__) && !defined (__ICL) && !defined (__COMO__)
+#  define _STLP_MSVC _MSC_VER
+# endif
+
+# if defined (__xlC__)  || defined (__IBMC__) || defined ( __IBMCPP__ ) 
+/* AIX xlC, Visual Age C++ , OS-390 C++ */
+#  include <config/stl_ibm.h>
+# elif defined (__INTEL_COMPILER) && defined(__unix__)
+/* Check intel before gcc, since newer versions define GNUC */
+#  include <config/stl_icc.h>
+# elif defined (__GNUC__ )
+#  include <config/stl_gcc.h>
+# elif defined (__KCC)
+#  include <config/stl_kai.h>
+# elif defined(__sgi)
+#  include <config/stl_sgi.h>
+# elif (defined(__OS400__))
+/* AS/400 C++ */
+#  include <config/stl_as400.h>
+# elif defined(_STLP_MSVC)
+/* Microsoft Visual C++ 4.0, 4.1, 4.2, 5.0 */
+#  include <config/stl_msvc.h>
+# elif defined ( __BORLANDC__ )
+/* Borland C++ ( 4.x - 5.x ) */
+#  include <config/stl_bc.h>
+# elif defined(__SUNPRO_CC) || defined (__SUNPRO_C)
+/* SUN CC 4.0.1-5.0  */
+#  include <config/stl_sunpro.h>
+# elif defined (__WATCOM_CPLUSPLUS__) || defined (__WATCOMC__)
+/* Watcom C++ */
+#  include <config/stl_watcom.h>
+# elif defined(__COMO__) || defined (__COMO_VERSION_)
+#  include <config/stl_como.h>
+# elif defined (__DMC__)
+/* Digital Mars C++ */
+#  include <config/stl_dm.h>
+# elif defined (__SC__) && (__SC__ < 0x800)
+/* Symantec 7.5 */
+#  include <config/stl_symantec.h>
+# elif defined (__MRC__) || (defined (__SC__) && (__SC__ >= 0x882))
+/* Apple MPW SCpp 8.8.2  
+ * Apple MPW MrCpp 4.1.0 */
+#  include <config/stl_apple.h>
+# elif defined (__MWERKS__)
+/* Metrowerks CodeWarrior */
+#  include <config/stl_mwerks.h>
+# elif defined(__hpux)
+/* HP compilers */
+#  include <config/stl_hpacc.h>
+# elif defined(__ICL)
+/* Intel reference compiler for Win */
+#  include <config/stl_intel.h>
+/* SCO UDK 7 compiler (UnixWare 7x, OSR 5, UnixWare 2x) */
+# elif defined(__USLC__)
+#  include <config/stl_sco.h>
+/* Apogee 4.x */
+# elif defined (__APOGEE__)
+#  include <config/stl_apcc.h>
+# elif defined (__DECCXX) || defined (__DECC)
+#  ifdef __vms
+#    include <config/stl_dec_vms.h>
+#  else
+#    include <config/stl_dec.h>
+#  endif
+# elif defined (__ISCPP__)
+#  include <config/stl_is.h>
+# elif defined (__FCC_VERSION)
+/* Fujutsu Compiler, v4.0 assumed */
+#  include <config/stl_fujitsu.h>
+# elif defined(_CRAY)
+/* Cray C++ 3.4 or 3.5 */
+#  include <config/stl_cray.h>
+# else
+/* Unable to identify the compiler, issue error diagnostic.
+ * Edit <config/stl_mycomp.h> to set STLport up for your compiler. */
+#  include <config/stl_mycomp.h>
+# endif /* end of compiler choice */
+# undef __GIVE_UP_WITH_STL
+#endif
+
diff --git a/src/STLport/config/vc_select_lib.h b/src/STLport/config/vc_select_lib.h
new file mode 100644
index 0000000..35d8155
--- /dev/null
+++ b/src/STLport/config/vc_select_lib.h
@@ -0,0 +1,35 @@
+# if !( defined(_STLP_WINCE) )
+#  define _STLP_EXPORT_DECLSPEC __declspec(dllexport)
+#  define _STLP_IMPORT_DECLSPEC __declspec(dllimport)
+# endif
+
+#  if !( defined(_STLP_MSVC) && _STLP_MSVC < 1100)
+#   define _STLP_CLASS_EXPORT_DECLSPEC __declspec(dllexport)
+#   define _STLP_CLASS_IMPORT_DECLSPEC __declspec(dllimport)
+#  endif
+
+#  if !defined (_STLP_NO_OWN_IOSTREAMS)
+
+#    if ( defined (__DLL) || defined (_DLL) || defined (_WINDLL) || defined (_RTLDLL) \
+     || defined(_AFXDLL) || defined (_STLP_USE_DYNAMIC_LIB) ) \
+       && ! defined (_STLP_USE_STATIC_LIB)
+#      undef  _STLP_USE_DECLSPEC
+#      define _STLP_USE_DECLSPEC 1
+#    endif
+
+#  ifndef _STLP_IMPORT_TEMPLATE_KEYWORD
+#   define _STLP_IMPORT_TEMPLATE_KEYWORD  extern
+#  endif
+#  define _STLP_EXPORT_TEMPLATE_KEYWORD
+
+# if defined (_RTLDLL) && defined (_STLP_USE_STATIC_LIB)
+#    define _STLP_LIB_STATIC_SUFFIX "_staticx"
+# else
+#    define _STLP_LIB_STATIC_SUFFIX "_static"
+# endif
+
+#    include <config/stl_select_lib.h>
+
+#  endif /* _STLP_OWN_IOSTREAMS */
+
+
diff --git a/src/STLport/csetjmp b/src/STLport/csetjmp
new file mode 100644
index 0000000..25a9388
--- /dev/null
+++ b/src/STLport/csetjmp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSETJMP
+# define _STLP_CSETJMP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x111
+#  include <stl/_prolog.h>
+# endif
+
+// if the macro is on, the header is already there
+# ifndef setjmp
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(csetjmp)
+# else
+#  include _STLP_NATIVE_C_HEADER(setjmp.h)
+# endif
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::jmp_buf;
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+#  ifndef setjmp
+using _STLP_VENDOR_CSTD::setjmp;
+#  endif
+using _STLP_VENDOR_CSTD::longjmp;
+# endif
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x111 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSETJMP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/csignal b/src/STLport/csignal
new file mode 100644
index 0000000..e3fe609
--- /dev/null
+++ b/src/STLport/csignal
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSIGNAL
+# define _STLP_CSIGNAL
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x112
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(csignal)
+# else
+#  include _STLP_NATIVE_C_HEADER(signal.h)
+# endif
+
+#  ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::signal;
+using _STLP_VENDOR_CSTD::raise;
+# endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+using _STLP_VENDOR_CSTD::sig_atomic_t;
+_STLP_END_NAMESPACE
+#  endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x112 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSIGNAL */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstdarg b/src/STLport/cstdarg
new file mode 100644
index 0000000..5b6196e
--- /dev/null
+++ b/src/STLport/cstdarg
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDARG
+# define _STLP_CSTDARG
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x113
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cstdarg)
+# else
+#  include _STLP_NATIVE_C_HEADER(stdarg.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::va_list;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x113 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSTDARG */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstddef b/src/STLport/cstddef
new file mode 100644
index 0000000..845b317
--- /dev/null
+++ b/src/STLport/cstddef
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDDEF
+# define _STLP_CSTDDEF
+
+# if ! defined (_STLP_WINCE)
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x114
+#  include <stl/_prolog.h>
+# endif
+
+# if (__GNUC__ >= 3) && defined(__CYGWIN__) // this total HACK is the only expedient way I could cygwin to work with GCC 3.0
+#  define __need_wint_t // mostly because wint_t didn't seem to get defined otherwise :(
+#  define __need_wchar_t
+#  define __need_size_t
+#  define __need_ptrdiff_t
+#  define __need_NULL
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cstddef)
+# else
+#  include _STLP_NATIVE_C_HEADER(stddef.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE  
+using _STLP_VENDOR_CSTD::ptrdiff_t;
+using _STLP_VENDOR_CSTD::size_t;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x114 )
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_WINCE */
+
+#endif /* _STLP_CSTDDEF */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstdio b/src/STLport/cstdio
new file mode 100644
index 0000000..43f7248
--- /dev/null
+++ b/src/STLport/cstdio
@@ -0,0 +1,134 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDIO
+# define _STLP_CSTDIO
+
+# if ! defined (_STLP_WINCE)
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 15
+#  include <stl/_prolog.h>
+# endif
+
+#ifdef __Lynx__
+#  include _STLP_NATIVE_C_HEADER(stdarg.h)
+#endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cstdio)
+# else
+#  include _STLP_NATIVE_C_HEADER(stdio.h)
+# endif
+
+# ifdef __MWERKS__
+#  undef stdin
+#  undef stdout
+#  undef stderr
+#  define stdin  	(&_STLP_VENDOR_CSTD::__files[0])
+#  define stdout	(&_STLP_VENDOR_CSTD::__files[1])
+#  define stderr	(&_STLP_VENDOR_CSTD::__files[2])
+# endif
+
+#  if defined (_STLP_MSVC) || defined (__ICL)
+namespace _STLP_VENDOR_CSTD {
+inline
+int vsnprintf(char *s1, size_t n, const char *s2, va_list v)
+{
+return ::_vsnprintf(s1, n, s2, v);
+}
+}
+#  endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD 
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::FILE;
+using _STLP_VENDOR_CSTD::fpos_t;
+using _STLP_VENDOR_CSTD::size_t;
+
+// undef obsolete macros
+# undef putc
+# undef getc
+# undef getchar
+# undef putchar
+# undef feof
+# undef ferror
+
+#  ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::clearerr;
+using _STLP_VENDOR_CSTD::fclose;
+using _STLP_VENDOR_CSTD::feof;
+using _STLP_VENDOR_CSTD::ferror;
+using _STLP_VENDOR_CSTD::fflush;
+using _STLP_VENDOR_CSTD::fgetc;
+using _STLP_VENDOR_CSTD::fgetpos;
+using _STLP_VENDOR_CSTD::fgets;
+using _STLP_VENDOR_CSTD::fopen;
+using _STLP_VENDOR_CSTD::fprintf;
+using _STLP_VENDOR_CSTD::fputc;
+using _STLP_VENDOR_CSTD::fputs;
+using _STLP_VENDOR_CSTD::fread;
+using _STLP_VENDOR_CSTD::freopen;
+using _STLP_VENDOR_CSTD::fscanf;
+using _STLP_VENDOR_CSTD::fseek;
+using _STLP_VENDOR_CSTD::fsetpos;
+using _STLP_VENDOR_CSTD::ftell;
+using _STLP_VENDOR_CSTD::fwrite;
+
+#   if  ( !( defined (__IBMCPP__) && (__IBMCPP__ >= 500) )  )
+ using _STLP_VENDOR_CSTD::getc;
+ using _STLP_VENDOR_CSTD::getchar;
+ using _STLP_VENDOR_CSTD::putc;
+ using _STLP_VENDOR_CSTD::putchar;
+#   endif
+
+using _STLP_VENDOR_CSTD::gets;
+using _STLP_VENDOR_CSTD::perror;
+using _STLP_VENDOR_CSTD::printf;
+using _STLP_VENDOR_CSTD::puts;
+using _STLP_VENDOR_CSTD::remove;
+using _STLP_VENDOR_CSTD::rename;
+using _STLP_VENDOR_CSTD::rewind;
+using _STLP_VENDOR_CSTD::scanf;
+using _STLP_VENDOR_CSTD::setbuf;
+using _STLP_VENDOR_CSTD::setvbuf;
+using _STLP_VENDOR_CSTD::sprintf;
+using _STLP_VENDOR_CSTD::sscanf;
+using _STLP_VENDOR_CSTD::tmpfile;
+using _STLP_VENDOR_CSTD::tmpnam;
+using _STLP_VENDOR_CSTD::ungetc;
+using _STLP_VENDOR_CSTD::vfprintf;
+using _STLP_VENDOR_CSTD::vprintf;
+using _STLP_VENDOR_CSTD::vsprintf;
+#   if (defined (__MWERKS__) || defined (_STLP_MSVC) || defined (__ICL) || \
+( defined (__BORLANDC__) && __BORLANDC__ > 0x530))
+using _STLP_VENDOR_CSTD::vsnprintf;
+#   endif
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 15)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+# endif /* ! defined (_STLP_WINCE) */
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstdlib b/src/STLport/cstdlib
new file mode 100644
index 0000000..1908261
--- /dev/null
+++ b/src/STLport/cstdlib
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTDLIB
+# define _STLP_CSTDLIB
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x116
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cstdlib)
+# else
+#  include _STLP_NATIVE_C_HEADER(stdlib.h)
+# endif
+
+# if defined( __MSL__ ) && __MSL__ <= 0x5003
+namespace std {
+	typedef ::div_t div_t;
+	typedef ::ldiv_t ldiv_t;
+#  ifdef __MSL_LONGLONG_SUPPORT__
+	typedef ::lldiv_t lldiv_t;
+#  endif
+}
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD 
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::div_t;
+using _STLP_VENDOR_CSTD::ldiv_t;
+using _STLP_VENDOR_CSTD::size_t;
+
+#  ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::abort;
+using _STLP_VENDOR_CSTD::atexit;
+using _STLP_VENDOR_CSTD::exit;
+using _STLP_VENDOR_CSTD::getenv;
+using _STLP_VENDOR_CSTD::calloc;
+using _STLP_VENDOR_CSTD::free;
+using _STLP_VENDOR_CSTD::malloc;
+using _STLP_VENDOR_CSTD::realloc;
+using _STLP_VENDOR_CSTD::atof;
+using _STLP_VENDOR_CSTD::atoi;
+using _STLP_VENDOR_CSTD::atol;
+using _STLP_VENDOR_CSTD::mblen;
+using _STLP_VENDOR_CSTD::mbstowcs;
+using _STLP_VENDOR_CSTD::mbtowc;
+using _STLP_VENDOR_CSTD::strtod;
+using _STLP_VENDOR_CSTD::strtol;
+using _STLP_VENDOR_CSTD::strtoul;
+using _STLP_VENDOR_CSTD::system;
+
+#if ! (defined (_STLP_NO_NATIVE_WIDE_STREAMS) || defined (_STLP_NO_MBSTATE_T) )
+using _STLP_VENDOR_CSTD::wcstombs;
+using _STLP_VENDOR_CSTD::wctomb;
+#endif
+using _STLP_VENDOR_CSTD::bsearch;
+using _STLP_VENDOR_CSTD::qsort;
+// boris : if we do not have native float abs, we define ours; then we cannot do "using" for "other" abs 
+# ifdef _STLP_HAS_NATIVE_FLOAT_ABS 
+using _STLP_VENDOR_CSTD::abs;
+# endif
+using _STLP_VENDOR_CSTD::div;
+using _STLP_VENDOR_CSTD::labs;
+using _STLP_VENDOR_CSTD::ldiv;
+using _STLP_VENDOR_CSTD::rand;
+using _STLP_VENDOR_CSTD::srand;
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined(_STLP_HAS_NO_NEW_C_HEADERS) && defined(__cplusplus)
+# if !defined ( _STLP_LABS )
+inline long   abs(long __x) { return _STLP_VENDOR_CSTD::labs(__x); }
+# endif
+# if !defined ( _STLP_LDIV )
+inline ldiv_t div(long __x, long __y) { return _STLP_VENDOR_CSTD::ldiv(__x, __y); } 
+# endif
+# endif
+
+#  if defined ( _STLP_LLABS )
+_STLP_LONG_LONG   abs(_STLP_LONG_LONG __x) { return _STLP_VENDOR_CSTD::_STLP_LLABS(__x); }
+#  endif
+#  if defined ( _STLP_LLDIV )
+_STLP_LLDIV_T div(_STLP_LONG_LONG __x, _STLP_LONG_LONG __y) { return _STLP_VENDOR_CSTD::_STLP_LLDIV(__x, __y); } 
+#  endif
+
+_STLP_END_NAMESPACE
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x116)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSTDLIB */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cstring b/src/STLport/cstring
new file mode 100644
index 0000000..55c65ce
--- /dev/null
+++ b/src/STLport/cstring
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CSTRING
+# define _STLP_CSTRING
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x117
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cstring)
+# else
+#  include _STLP_NATIVE_C_HEADER(string.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+#  include <using/cstring>
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x117)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CSTRING */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ctime b/src/STLport/ctime
new file mode 100644
index 0000000..3c63fc5
--- /dev/null
+++ b/src/STLport/ctime
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CTIME
+# define _STLP_CTIME
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x118
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(ctime)
+# else
+#  include _STLP_NATIVE_C_HEADER(time.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::size_t;
+using _STLP_VENDOR_CSTD::clock_t;
+using _STLP_VENDOR_CSTD::time_t;
+using _STLP_VENDOR_CSTD::tm;
+#  ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+using _STLP_VENDOR_CSTD::clock;
+using _STLP_VENDOR_CSTD::asctime;
+using _STLP_VENDOR_CSTD::ctime;
+using _STLP_VENDOR_CSTD::gmtime;
+using _STLP_VENDOR_CSTD::difftime;
+using _STLP_VENDOR_CSTD::mktime;
+using _STLP_VENDOR_CSTD::localtime;
+using _STLP_VENDOR_CSTD::strftime;
+using _STLP_VENDOR_CSTD::time;
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x118)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CTIME */
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ctype.h b/src/STLport/ctype.h
new file mode 100644
index 0000000..fda6925
--- /dev/null
+++ b/src/STLport/ctype.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x219
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x219) && ! defined (_STLP_DONT_POP_0x219)
+#  define _STLP_DONT_POP_0x219
+# endif
+
+# include _STLP_NATIVE_C_HEADER(ctype.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x219)
+#  if ! defined (_STLP_DONT_POP_0x219)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x219
+# endif
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/cwchar b/src/STLport/cwchar
new file mode 100644
index 0000000..46943d9
--- /dev/null
+++ b/src/STLport/cwchar
@@ -0,0 +1,250 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CWCHAR
+# define _STLP_CWCHAR
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x120
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef __GNUC__
+#  include <cstddef>
+# endif
+
+# if ! defined (_STLP_WINCE)
+
+# if defined (__BORLANDC__) &&  (__BORLANDC__ >= 0x530 ) && ! defined (_STLP_OWN_IOSTREAMS)
+/*  Borland defines this stuff here */
+#   include <iosfwd>
+# endif
+
+# if !  defined (_STLP_NO_CWCHAR) && defined  (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cwchar)
+
+# elif defined (__MRC__) || (defined (__SC__) && !defined (__DMC__)) || defined (__BORLANDC__) || defined(__FreeBSD__) || (defined (__GNUC__) && defined (__APPLE__) || defined( __Lynx__ )) || defined (_STLP_NO_WCHAR_T)
+
+#  include _STLP_NATIVE_C_HEADER(stddef.h)
+#  if defined (__FreeBSD__) || defined (__Lynx__)
+#   ifndef _WINT_T
+typedef long int wint_t;
+#    define _WINT_T
+#   endif /* _WINT_T */
+#  endif
+
+# else 
+#  include _STLP_NATIVE_C_HEADER(wchar.h)
+
+#  if defined(__sun) && (defined(_XOPEN_SOURCE) || (_XOPEN_VERSION - 0 == 4))
+extern wint_t   btowc();
+extern int      fwprintf();
+extern int      fwscanf();
+extern int      fwide();
+extern int      mbsinit();
+extern size_t   mbrlen();
+extern size_t   mbrtowc();
+extern size_t   mbsrtowcs();
+extern int      swprintf();
+extern int      swscanf();
+extern int      vfwprintf();
+extern int      vwprintf();
+extern int      vswprintf();
+extern size_t   wcrtomb();
+extern size_t   wcsrtombs();
+extern wchar_t  *wcsstr();
+extern int      wctob();
+extern wchar_t  *wmemchr();
+extern int      wmemcmp();
+extern wchar_t  *wmemcpy();
+extern wchar_t  *wmemmove();
+extern wchar_t  *wmemset();
+extern int      wprintf();
+extern int      wscanf();
+#  endif
+# endif
+
+#if defined(__MSL__) && __MSL__ <= 0x51FF	/* dwa 2/28/99 - not yet implemented by MSL  */
+#   define _STLP_WCHAR_MSL_EXCLUDE 1
+namespace std
+{ 
+  extern "C" size_t wcsftime(wchar_t * str, size_t max_size, const wchar_t * format_str, const struct tm * timeptr);
+}
+#  define _STLP_NO_MBSTATE_T 1
+#elif defined (__BORLANDC__)
+#  ifdef _STLP_OWN_IOSTREAMS
+#   define _STLP_NO_NATIVE_MBSTATE_T
+#  endif
+#  define _STLP_WCHAR_BORLAND_EXCLUDE 1
+#  if (__BORLANDC__ < 0x540 )
+#   define _STLP_NO_MBSTATE_T 1
+#   define _STLP_WCHAR_SUNPRO_EXCLUDE
+#  endif
+#endif
+
+#ifndef _STLP_CWCHAR_H
+# include <stl/_cwchar.h>
+#endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+
+#if defined (__SUNPRO_CC) && defined (_STLP_NO_OWN_IOSTREAMS) && !defined (_STLP_HAS_NO_NEW_C_HEADERS)
+using _STLP_VENDOR_CSTD::wint_t; 
+#endif
+
+_STLP_BEGIN_NAMESPACE
+# ifdef _STLP_NO_WCHAR_T
+typedef int wint_t;
+# else
+// gcc 3.0 has a glitch : wint_t only sucked into the global namespace if _GLIBCPP_USE_WCHAR_T is defined
+#  if defined (__GNUC__) && ! defined (_GLIBCPP_USE_WCHAR_T)
+using ::wint_t;
+#  else
+using _STLP_VENDOR_CSTD::wint_t;
+#  endif
+# endif
+
+
+using _STLP_VENDOR_CSTD::size_t;
+
+#  if !defined (_STLP_NO_NATIVE_MBSTATE_T) && ! defined (_STLP_USE_OWN_MBSTATE_T)
+using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
+
+# if !defined (_STLP_NO_CSTD_FUNCTION_IMPORTS) && !defined(_STLP_WCHAR_BORLAND_EXCLUDE) \
+  && (!defined(__MSL__) || __MSL__ > 0x6001)
+#  if ! (defined (__KCC) || defined (__GNUC__))
+using _STLP_VENDOR_MB_NAMESPACE::btowc;
+#   if (!defined(__MSL__) || __MSL__ > 0x7001)
+using _STLP_VENDOR_MB_NAMESPACE::mbsinit;
+#   endif
+#  endif
+# if ! defined (__GNUC__)
+using _STLP_VENDOR_MB_NAMESPACE::mbrlen;
+using _STLP_VENDOR_MB_NAMESPACE::mbrtowc;
+using _STLP_VENDOR_MB_NAMESPACE::mbsrtowcs;
+using _STLP_VENDOR_MB_NAMESPACE::wcrtomb;
+using _STLP_VENDOR_MB_NAMESPACE::wcsrtombs;
+# endif
+#    endif /* BORLAND && !__MSL__ || __MSL__ > 0x6001 */
+
+#  endif /* _STLP_NO_NATIVE_MBSTATE_T */
+
+# if !defined (_STLP_NO_NATIVE_WIDE_FUNCTIONS) && ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+
+# if !defined (_STLP_WCHAR_BORLAND_EXCLUDE) && ! defined (_STLP_NO_CSTD_FUNCTION_IMPORTS)
+using _STLP_VENDOR_CSTD::fgetwc;
+using _STLP_VENDOR_CSTD::fgetws;
+using _STLP_VENDOR_CSTD::fputwc;
+using _STLP_VENDOR_CSTD::fputws;
+# endif
+
+#  if !( defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_BORLAND_EXCLUDE) \
+      || defined(_STLP_WCHAR_HPACC_EXCLUDE) )
+# ifndef __DECCXX
+using _STLP_VENDOR_CSTD::fwide;
+# endif
+using _STLP_VENDOR_CSTD::fwprintf;
+using _STLP_VENDOR_CSTD::fwscanf;
+using _STLP_VENDOR_CSTD::getwchar;
+#  endif
+
+# ifndef _STLP_WCHAR_BORLAND_EXCLUDE
+using _STLP_VENDOR_CSTD::getwc;
+using _STLP_VENDOR_CSTD::ungetwc;
+
+using _STLP_VENDOR_CSTD::putwc;
+using _STLP_VENDOR_CSTD::putwchar;
+# endif
+
+#  if !( defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined (_STLP_WCHAR_BORLAND_EXCLUDE)\
+      || defined(_STLP_WCHAR_HPACC_EXCLUDE) ) 
+using _STLP_VENDOR_CSTD::swprintf;
+using _STLP_VENDOR_CSTD::swscanf;
+using _STLP_VENDOR_CSTD::vfwprintf;
+using _STLP_VENDOR_CSTD::vwprintf;
+using _STLP_VENDOR_CSTD::vswprintf;
+
+#   if !defined(__MSL__) || __MSL__ > 0x7001
+using _STLP_VENDOR_CSTD::wcsftime;
+#   endif
+using _STLP_VENDOR_CSTD::wcstok;
+
+#  endif
+
+# if !(defined (__BORLANDC__) && (__BORLANDC__ < 0x540))
+using _STLP_VENDOR_CSTD::wcscat;
+using _STLP_VENDOR_CSTD::wcsrchr;
+using _STLP_VENDOR_CSTD::wcscmp;
+using _STLP_VENDOR_CSTD::wcscoll;
+
+using _STLP_VENDOR_CSTD::wcscpy;
+using _STLP_VENDOR_CSTD::wcscspn;
+
+using _STLP_VENDOR_CSTD::wcslen;
+using _STLP_VENDOR_CSTD::wcsncat;
+using _STLP_VENDOR_CSTD::wcsncmp;
+using _STLP_VENDOR_CSTD::wcsncpy;
+using _STLP_VENDOR_CSTD::wcspbrk;
+using _STLP_VENDOR_CSTD::wcschr;
+
+using _STLP_VENDOR_CSTD::wcsspn;
+using _STLP_VENDOR_CSTD::wcsxfrm;
+
+# endif
+
+#  if !defined (_STLP_WCHAR_BORLAND_EXCLUDE)
+
+using _STLP_VENDOR_CSTD::wcstod;
+using _STLP_VENDOR_CSTD::wcstol;
+
+# endif
+
+#  if !( defined (_STLP_WCHAR_SUNPRO_EXCLUDE) || defined(_STLP_WCHAR_HPACC_EXCLUDE) )
+
+using _STLP_VENDOR_CSTD::wcsstr;
+using _STLP_VENDOR_CSTD::wmemchr;
+
+#  if !defined (_STLP_WCHAR_BORLAND_EXCLUDE)
+
+#ifndef __DMC__
+using _STLP_VENDOR_CSTD::wctob;
+using _STLP_VENDOR_CSTD::wmemcmp;
+#endif
+using _STLP_VENDOR_CSTD::wmemmove;
+using _STLP_VENDOR_CSTD::wprintf;
+using _STLP_VENDOR_CSTD::wscanf;
+
+#  endif
+
+using _STLP_VENDOR_CSTD::wmemcpy;
+using _STLP_VENDOR_CSTD::wmemset;
+#  endif
+
+# endif /* _STLP_NO_NATIVE_WIDE_FUNCTIONS */
+_STLP_END_NAMESPACE
+# endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# undef _STLP_WCHAR_SUNPRO_EXCLUDE
+# undef _STLP_WCHAR_MSL_EXCLUDE
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x120)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CWCHAR */
+
diff --git a/src/STLport/cwctype b/src/STLport/cwctype
new file mode 100644
index 0000000..a24de63
--- /dev/null
+++ b/src/STLport/cwctype
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CWCTYPE
+# define _STLP_CWCTYPE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x121
+#  include <stl/_prolog.h>
+# endif
+
+#ifdef __BORLANDC__
+# include <cctype>
+#endif
+
+# if defined (_STLP_USE_NEW_C_HEADERS)
+#  include _STLP_NATIVE_CPP_C_HEADER(cwctype)
+#  if defined  (__MSL__)
+namespace std {
+	typedef wchar_t wctrans_t;
+	wint_t 		towctrans(wint_t c, wctrans_t value);
+	wctrans_t 	wctrans(const char *name);
+}
+#  endif
+# else
+#  include _STLP_NATIVE_C_HEADER(wctype.h)
+# endif
+
+# ifdef _STLP_IMPORT_VENDOR_CSTD
+_STLP_BEGIN_NAMESPACE
+using _STLP_VENDOR_CSTD::wctype_t;
+using _STLP_VENDOR_CSTD::wint_t;
+# ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+#  if ! defined (__BORLANDC__)
+using _STLP_VENDOR_CSTD::wctrans_t;
+using _STLP_VENDOR_CSTD::towctrans;
+using _STLP_VENDOR_CSTD::wctrans;
+using _STLP_VENDOR_CSTD::wctype;
+using _STLP_VENDOR_CSTD::iswctype;
+#  endif
+using _STLP_VENDOR_CSTD::iswalnum;
+using _STLP_VENDOR_CSTD::iswalpha;
+using _STLP_VENDOR_CSTD::iswcntrl;
+
+using _STLP_VENDOR_CSTD::iswdigit;
+using _STLP_VENDOR_CSTD::iswgraph;
+using _STLP_VENDOR_CSTD::iswlower;
+using _STLP_VENDOR_CSTD::iswprint;
+using _STLP_VENDOR_CSTD::iswpunct;
+using _STLP_VENDOR_CSTD::iswspace;
+using _STLP_VENDOR_CSTD::iswupper;
+using _STLP_VENDOR_CSTD::iswxdigit;
+
+using _STLP_VENDOR_CSTD::towlower;
+using _STLP_VENDOR_CSTD::towupper;
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x121)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_CWCTYPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/deque b/src/STLport/deque
new file mode 100644
index 0000000..23c5c58
--- /dev/null
+++ b/src/STLport/deque
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DEQUE
+#define _STLP_DEQUE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x22
+#  include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(deque)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x22)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_DEQUE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/exception b/src/STLport/exception
new file mode 100644
index 0000000..8254e18
--- /dev/null
+++ b/src/STLport/exception
@@ -0,0 +1,188 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// This header exists solely for portability.  Normally it just includes
+// the native header <exception>.
+
+// The header <exception> contains low-level functions that interact
+// with a compiler's exception-handling mechanism.  It is assumed to
+// be supplied with the compiler, rather than with the library, because
+// it is inherently tied very closely to the compiler itself.
+
+// On platforms where <exception> does not exist, this header defines
+// an exception base class.  This is *not* a substitute for everything
+// in <exception>, but it suffices to support a bare minimum of STL
+// functionality.
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x423
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x423) && ! defined (_STLP_DONT_POP_0x423)
+#  define _STLP_DONT_POP_0x423
+# endif
+
+# if   ! defined (_STLP_NO_EXCEPTION_HEADER)
+
+#  if defined ( _UNCAUGHT_EXCEPTION )
+#   undef _STLP_INCOMPLETE_EXCEPTION_HEADER
+#  endif
+
+# if defined(_STLP_BROKEN_EXCEPTION_CLASS)
+#  define exception     _STLP_NULLIFIED_BROKEN_EXCEPTION_CLASS
+#  define bad_exception _STLP_NULLIFIED_BROKEN_BAD_EXCEPTION_CLASS
+#  if defined (_STLP_NO_NEW_NEW_HEADER)
+#   include _STLP_NATIVE_CPP_RUNTIME_HEADER(Exception.h)
+#  else
+#   include _STLP_NATIVE_CPP_RUNTIME_HEADER(Exception)
+#  endif
+#  undef exception
+#  undef bad_exception
+# else
+
+# if defined (_STLP_NO_NEW_NEW_HEADER)
+#  include _STLP_NATIVE_CPP_RUNTIME_HEADER(exception.h)
+# else
+#   include _STLP_NATIVE_CPP_RUNTIME_HEADER(exception)
+# endif
+
+# endif
+
+#    if defined (_STLP_MSVC) || defined (__ICL)
+// dwa 02/04/00 - here I'm assuming that __ICL uses the same library headers as vc6.
+// the header <yvals.h> which ships with vc6 and is included by its native <exception>
+// actually turns on warnings, so we have to turn them back off.
+#      include <config/_msvc_warnings_off.h>
+#    endif
+
+
+#  ifdef _STLP_USE_OWN_NAMESPACE
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_BROKEN_EXCEPTION_CLASS)
+using _STLP_VENDOR_EXCEPT_STD::exception;
+using _STLP_VENDOR_EXCEPT_STD::bad_exception;
+#endif
+
+# if ! defined (_STLP_NO_USING_FOR_GLOBAL_FUNCTIONS)
+
+// fbp : many platforms present strange mix of
+// those in various namespaces
+#  if !defined(_STLP_VENDOR_UNEXPECTED_STD)
+#   define _STLP_VENDOR_UNEXPECTED_STD _STLP_VENDOR_EXCEPT_STD
+#  endif
+
+// weird errors
+# if (! defined (__BORLANDC__)) || (defined (__STD_EXCEPTION) && defined (__RWSTD_EXCEPTION_SEEN) && defined ( _STLP_DONT_POP_0x423))
+using _STLP_VENDOR_UNEXPECTED_STD::unexpected;
+using _STLP_VENDOR_UNEXPECTED_STD::unexpected_handler;
+using _STLP_VENDOR_UNEXPECTED_STD::set_unexpected;
+using _STLP_VENDOR_UNEXPECTED_STD::terminate;
+using _STLP_VENDOR_UNEXPECTED_STD::terminate_handler;
+using _STLP_VENDOR_UNEXPECTED_STD::set_terminate;
+# endif
+
+# if !defined (_STLP_INCOMPLETE_EXCEPTION_HEADER) 
+using _STLP_VENDOR_UNEXPECTED_STD::uncaught_exception;
+# endif
+
+#  endif
+
+_STLP_END_NAMESPACE
+
+#  endif /* _STLP_OWN_NAMESPACE */
+
+#else /* _STLP_NO_EXCEPTION_HEADER */
+
+// fbp : absence of <exception> usually means that those
+// functions are not going to be called by compiler.
+// Still, define them for the user.
+typedef void (*unexpected_handler)();
+unexpected_handler set_unexpected(unexpected_handler f) _STLP_NOTHROW_INHERENTLY;
+void unexpected();
+
+typedef void (*terminate_handler)();
+terminate_handler set_terminate(terminate_handler f) _STLP_NOTHROW_INHERENTLY;
+void terminate();
+
+bool uncaught_exception(); // not implemented under mpw as of Jan/1999
+
+#endif  /* _STLP_NO_EXCEPTION_HEADER */	
+
+# if   defined (_STLP_NO_EXCEPTION_HEADER) || defined(_STLP_BROKEN_EXCEPTION_CLASS)
+# ifndef _STLP_EXCEPTION_H
+#  define _STLP_EXCEPTION_H
+
+_STLP_BEGIN_NAMESPACE
+
+// section 18.6.1
+	class _STLP_CLASS_DECLSPEC exception 
+	{
+	public:
+# ifdef _STLP_OWN_IOSTREAMS
+	        exception() _STLP_NOTHROW;
+	        virtual ~exception() _STLP_NOTHROW;
+		virtual const char* what() const _STLP_NOTHROW;
+# else
+	        exception() _STLP_NOTHROW {}
+		virtual ~exception() _STLP_NOTHROW {}
+		virtual const char* what() const _STLP_NOTHROW {return "class exception";}
+# endif
+	};
+	
+	
+
+// section 18.6.2.1
+	class _STLP_CLASS_DECLSPEC bad_exception : public exception 
+	{
+	public:
+# ifdef _STLP_OWN_IOSTREAMS
+	  bad_exception() _STLP_NOTHROW;
+	  ~bad_exception() _STLP_NOTHROW;
+	  const char* what() const _STLP_NOTHROW;
+# else
+	  bad_exception() _STLP_NOTHROW {}
+	  ~bad_exception() _STLP_NOTHROW {}
+	  const char* what() const _STLP_NOTHROW {return "class bad_exception";}
+# endif
+	};
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NO_EXCEPTION_HEADER */
+
+_STLP_BEGIN_NAMESPACE
+// forward declaration
+class __Named_exception;
+_STLP_END_NAMESPACE
+#endif /* _STLP_EXCEPTION_H */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x423)
+#  if ! defined (_STLP_DONT_POP_0x423)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x423
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
+
+
+
diff --git a/src/STLport/exception.h b/src/STLport/exception.h
new file mode 100644
index 0000000..7dbb34c
--- /dev/null
+++ b/src/STLport/exception.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_OLDSTD_exception
+# define _STLP_OLDSTD_exception
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x824
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x824) && ! defined (_STLP_DONT_POP_0x824)
+#  define _STLP_DONT_POP_0x824
+# endif
+
+# if defined (__BORLANDC__)
+#  include <exception.>
+# elif defined (_MSC_VER)
+#  include <exception>
+# else
+#  include _STLP_NATIVE_CPP_RUNTIME_HEADER(exception.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x824)
+#  if ! defined (_STLP_DONT_POP_0x824)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x824
+# endif
+
+#endif /* _STLP_OLDSTD_exception */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/export b/src/STLport/export
new file mode 100644
index 0000000..964628e
--- /dev/null
+++ b/src/STLport/export
@@ -0,0 +1,85 @@
+./algorithm
+./bitset
+./cassert
+./cctype
+./cerrno
+./cfloat
+./climits
+./clocale
+./cmath
+./complex
+./csetjmp
+./csignal
+./cstdarg
+./cstddef
+./cstdio
+./cstdlib
+./cstring
+./ctime
+./ctype.h
+./cwchar
+./cwctype
+./deque
+./exception
+./exception.h
+./export
+./fstream
+./fstream.h
+./functional
+./hash_map
+./hash_set
+./iomanip
+./iomanip.h
+./ios
+./ios.h
+./iosfwd
+./iostream
+./iostream.h
+./istream
+./istream.h
+./iterator
+./limits
+./list
+./locale
+./locale.h
+./map
+./math.h
+./mem.h
+./memory
+./mmemory.h
+./new
+./new.h
+./numeric
+./ostream
+./ostream.h
+./pthread.h
+./pthread_alloc
+./queue
+./rope
+./set
+./setjmp.h
+./signal.h
+./slist
+./sstream
+./stack
+./stdarg.h
+./stddef.h
+./stdexcept
+./stdio.h
+./stdio_streambuf
+./stdlib.h
+./stl_user_config.h
+./streambuf
+./streambuf.h
+./string
+./string.h
+./strstream
+./strstream.h
+./time.h
+./typeinfo
+./typeinfo.h
+./utility
+./valarray
+./vector
+./wchar.h
+./wctype.h
diff --git a/src/STLport/export.sun b/src/STLport/export.sun
new file mode 100644
index 0000000..1b310a2
--- /dev/null
+++ b/src/STLport/export.sun
@@ -0,0 +1,48 @@
+./algorithm.SUNWCCh
+./bitset.SUNWCCh
+./complex.SUNWCCh
+./deque.SUNWCCh
+./exception.SUNWCCh
+./fstream.SUNWCCh
+./fstream.h.SUNWCCh
+./functional.SUNWCCh
+./hash_map.SUNWCCh
+./hash_set.SUNWCCh
+./iomanip.SUNWCCh
+./iomanip.h.SUNWCCh
+./ios.SUNWCCh
+./ios.h.SUNWCCh
+./iosfwd.SUNWCCh
+./iostream.SUNWCCh
+./iostream.h.SUNWCCh
+./istream.SUNWCCh
+./istream.h.SUNWCCh
+./iterator.SUNWCCh
+./limits.SUNWCCh
+./list.SUNWCCh
+./locale.SUNWCCh
+./map.SUNWCCh
+./memory.SUNWCCh
+./new.SUNWCCh
+./numeric.SUNWCCh
+./ostream.SUNWCCh
+./ostream.h.SUNWCCh
+./pthread_alloc.SUNWCCh
+./queue.SUNWCCh
+./set.SUNWCCh
+./slist.SUNWCCh
+./sstream.SUNWCCh
+./stack.SUNWCCh
+./stdexcept.SUNWCCh
+./streambuf.SUNWCCh
+./streambuf.h.SUNWCCh
+./string.SUNWCCh
+./strstream.SUNWCCh
+./strstream.h.SUNWCCh
+./typeinfo.SUNWCCh
+./utility.SUNWCCh
+./valarray.SUNWCCh
+./vector.SUNWCCh
+
+
+
diff --git a/src/STLport/fstream b/src/STLport/fstream
new file mode 100644
index 0000000..5a3b486
--- /dev/null
+++ b/src/STLport/fstream
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+
+// This header defines classes basic_filebuf, basic_ifstream,
+// basic_ofstream, and basic_fstream.  These classes represent
+// streambufs and streams whose sources or destinations are files.
+
+#ifndef _STLP_FSTREAM
+#define _STLP_FSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1025
+#  include <stl/_prolog.h>
+# endif
+
+#ifdef _STLP_PRAGMA_ONCE
+# pragma once
+#endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+#  include <stl/_fstream.h>
+
+# ifndef __LOCALE_INITIALIZED
+#  define __LOCALE_INITIALIZED
+_STLP_BEGIN_NAMESPACE
+// Global initializer object, to ensure construction of static objects.
+static ios_base::_Loc_init _LocInit;
+_STLP_END_NAMESPACE
+# endif
+
+# elif !defined(_STLP_USE_NO_IOSTREAMS)
+#  include <wrap_std/fstream>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1025)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FSTREAM */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/fstream.h b/src/STLport/fstream.h
new file mode 100644
index 0000000..e2ce711
--- /dev/null
+++ b/src/STLport/fstream.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_FSTREAM_H
+# define _STLP_FSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2026
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+#ifdef __BORLANDC__
+#  include <fstream.>
+#else
+#  include <fstream>
+#endif
+// get desired pollution
+#  include <iostream.h>
+
+# ifndef __LOCALE_INITIALIZED
+#  define __LOCALE_INITIALIZED
+// Global initializer object, to ensure initialization of locale subsystem.
+static ios_base::_Loc_init _LocInit;
+# endif
+
+#  ifndef _STLP_HAS_NO_NAMESPACES
+#   include <using/fstream>
+#  endif
+
+# elif ! defined (_STLP_USE_NO_IOSTREAMS)
+# include <wrap_std/h/fstream.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2026)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/functional b/src/STLport/functional
new file mode 100644
index 0000000..80cd905
--- /dev/null
+++ b/src/STLport/functional
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_FUNCTIONAL
+#define _STLP_FUNCTIONAL
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x27
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_IMPORT_VENDOR_STD)
+#  include _STLP_NATIVE_HEADER(functional)
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+#  include <stl/_function.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x27)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FUNCTIONAL */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/hash_map b/src/STLport/hash_map
new file mode 100644
index 0000000..88964eb
--- /dev/null
+++ b/src/STLport/hash_map
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_MAP
+#define _STLP_HASH_MAP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x4028
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#include <stl/_hash_map.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x4028)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_MAP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/hash_set b/src/STLport/hash_set
new file mode 100644
index 0000000..3e4ac56
--- /dev/null
+++ b/src/STLport/hash_set
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_SET
+#define _STLP_HASH_SET
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x4029
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#include <stl/_hash_set.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x4029)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_SET */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iomanip b/src/STLport/iomanip
new file mode 100644
index 0000000..39bf3fe
--- /dev/null
+++ b/src/STLport/iomanip
@@ -0,0 +1,194 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_IOMANIP
+#define _STLP_IOMANIP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1030
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+
+#  include <stl/_istream.h>              // Includes <ostream> and <ios>
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Machinery for defining manipulators.
+
+// Class that calls one of ios_base's single-argument member functions.
+template <class _Arg>
+struct _Ios_Manip_1 {
+   typedef _Arg (ios_base::*__f_ptr_type)(_Arg);
+ 
+  _Ios_Manip_1(__f_ptr_type __f, const _Arg& __arg)  
+    : _M_f(__f), _M_arg(__arg)
+    {}
+  
+  void operator()(ios_base& __ios) const {
+    (__ios.*_M_f)(_M_arg);
+  }
+
+  __f_ptr_type _M_f;
+  _Arg _M_arg;
+};
+
+// Class that calls one of ios_base's two-argument member functions.
+struct _Ios_Setf_Manip {
+  ios_base::fmtflags _M_flag;
+  ios_base::fmtflags _M_mask;
+  bool _M_two_args;
+
+  _Ios_Setf_Manip(ios_base::fmtflags __f)
+    : _M_flag(__f), _M_mask(0), _M_two_args(false)
+    {}
+
+  _Ios_Setf_Manip(ios_base::fmtflags __f, ios_base::fmtflags __m)
+    : _M_flag(__f), _M_mask(__m), _M_two_args(true)
+    {}
+
+  void operator()(ios_base& __ios) const {
+    if (_M_two_args)
+      __ios.setf(_M_flag, _M_mask);
+    else
+      __ios.setf(_M_flag);
+  }
+};
+
+
+template <class _CharT, class _Traits, class _Arg>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __in,
+           const _Ios_Manip_1<_Arg>& __f)
+{
+  __f(__in);
+  return __in;
+}
+
+template <class _CharT, class _Traits, class _Arg>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+           const _Ios_Manip_1<_Arg>& __f)
+{
+  __f(__os);
+  return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __in, const _Ios_Setf_Manip& __f)
+{
+  __f(__in);
+  return __in;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const _Ios_Setf_Manip& __f)
+
+{
+  __f(__os);
+  return __os;
+}
+
+//----------------------------------------------------------------------
+// The ios_base manipulators.
+
+inline _Ios_Setf_Manip  _STLP_CALL resetiosflags(ios_base::fmtflags __mask) {
+  return _Ios_Setf_Manip(0, __mask);
+}
+
+inline _Ios_Setf_Manip _STLP_CALL setiosflags(ios_base::fmtflags __flag) {
+  return _Ios_Setf_Manip(__flag);
+}
+
+inline _Ios_Setf_Manip _STLP_CALL setbase(int __n) {
+  ios_base::fmtflags __base = __n == 8  ? ios_base::oct :
+                              __n == 10 ? ios_base::dec :
+                              __n == 16 ? ios_base::hex :
+                              ios_base::fmtflags(0);
+  return _Ios_Setf_Manip(__base, ios_base::basefield);
+}
+
+inline _Ios_Manip_1<streamsize> _STLP_CALL 
+setprecision(int __n) {
+  _Ios_Manip_1<streamsize>::__f_ptr_type __f = &ios_base::precision;
+  return _Ios_Manip_1<streamsize>(__f, __n);
+}
+
+inline _Ios_Manip_1<streamsize>  _STLP_CALL
+setw(int __n) {
+  _Ios_Manip_1<streamsize>::__f_ptr_type __f = &ios_base::width;	
+  return _Ios_Manip_1<streamsize>(__f, __n);
+}
+
+//----------------------------------------------------------------------
+// setfill, a manipulator that operates on basic_ios<> instead of ios_base.
+
+template <class _CharT>
+struct _Setfill_Manip {
+  _Setfill_Manip(_CharT __c) : _M_c(__c) {}
+  _CharT _M_c;
+};
+
+template <class _CharT, class _CharT2, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL 
+operator<<(basic_ostream<_CharT, _Traits>& __os, 
+           const _Setfill_Manip<_CharT2>& __m)
+{
+  __os.fill(__m._M_c);
+  return __os;
+}
+
+template <class _CharT, class _CharT2, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL 
+operator>>(basic_istream<_CharT, _Traits>& __is, 
+           const _Setfill_Manip<_CharT2>& __m)
+{
+  __is.fill(__m._M_c);
+  return __is;
+}
+
+template <class _CharT>
+inline _Setfill_Manip<_CharT> _STLP_CALL 
+setfill(_CharT __c) {
+  return _Setfill_Manip<_CharT>(__c);
+}
+
+_STLP_END_NAMESPACE
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+#  include <wrap_std/iomanip>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1030)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOMANIP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iomanip.h b/src/STLport/iomanip.h
new file mode 100644
index 0000000..4052ec5
--- /dev/null
+++ b/src/STLport/iomanip.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOMANIP_H
+# define _STLP_IOMANIP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2031
+#  include <stl/_prolog.h>
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+
+#ifdef __BORLANDC__
+#  include <iomanip.>
+#else
+#  include <iomanip>
+#endif
+
+#  ifndef _STLP_HAS_NO_NAMESPACES
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#  else
+using _STLP_STD::setiosflags;
+using _STLP_STD::resetiosflags;
+using _STLP_STD::setbase;
+using _STLP_STD::setfill;
+using _STLP_STD::setprecision;
+using _STLP_STD::setw;
+#  endif
+#  endif /* _STLP_HAS_NO_NAMESPACES */
+
+// get all the pollution we want
+# include <iostream.h>
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iomanip.h)
+
+# if defined  (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/iomanip.h>
+_STLP_END_NAMESPACE
+#  endif /* _STLP_USE_NAMESPACES */
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2031)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOMANIP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ios b/src/STLport/ios
new file mode 100644
index 0000000..a10d7a9
--- /dev/null
+++ b/src/STLport/ios
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_IOS
+#define _STLP_IOS
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1032
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+#  include <stl/_ios.h>
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+#  include <wrap_std/ios>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1032)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ios.h b/src/STLport/ios.h
new file mode 100644
index 0000000..7c92cec
--- /dev/null
+++ b/src/STLport/ios.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOS_H
+# define _STLP_IOS_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1033
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#ifdef __BORLANDC__
+#  include <ios.>
+#else
+#  include <ios>
+#endif
+
+# if defined (_STLP_USE_NAMESPACES)
+# include <using/ios>
+# endif
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(ios.h)
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+using _STLP_OLD_IO_NAMESPACE::ios;
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1033)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/iosfwd b/src/STLport/iosfwd
new file mode 100644
index 0000000..cd958c8
--- /dev/null
+++ b/src/STLport/iosfwd
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_IOSFWD
+#define _STLP_IOSFWD
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1034
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#  if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_CWCHAR)
+#   include <cwchar>
+#  endif			
+
+#  include <stl/_iosfwd.h>
+
+# elif defined (_STLP_USE_NO_IOSTREAMS)
+
+#  include <stl/char_traits.h> 
+
+# else
+
+_STLP_BEGIN_NAMESPACE
+template <class _Tp> class allocator;
+_STLP_END_NAMESPACE
+
+#  include <wrap_std/iosfwd>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1034)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOSFWD */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iostream b/src/STLport/iostream
new file mode 100644
index 0000000..2e3259b
--- /dev/null
+++ b/src/STLport/iostream
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_IOSTREAM
+#define _STLP_IOSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1037
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#include <stl/_iosfwd.h>
+#include <stl/_istream.h>
+
+_STLP_BEGIN_NAMESPACE
+
+#ifndef _STLP_USE_NAMESPACES
+// in case of SGI iostreams, we have to rename our streams not to clash with those
+// provided in native lib
+# define cin _STLP_cin
+# define cout _STLP_cout
+# define cerr _STLP_cerr
+# define clog _STLP_clog
+#endif
+
+// Note: cin and wcin are both associated with stdio.  The C standard
+// (Amendment 1, section 4.6.2.1) says that it is an error to mix
+// wide- and narrow-oriented I/O on the same stream.  This implies
+// that it is an error to use both cin and wcin in the same C++
+// program; the same applies to cout and wcout, and cerr/clog and
+// wcerr/wclog.
+
+extern _STLP_DECLSPEC istream cin;
+extern _STLP_DECLSPEC ostream cout;
+extern _STLP_DECLSPEC ostream cerr;
+extern _STLP_DECLSPEC ostream clog;
+
+# ifndef _STLP_NO_WCHAR_T
+extern _STLP_DECLSPEC wistream wcin;
+extern _STLP_DECLSPEC wostream wcout;
+extern _STLP_DECLSPEC wostream wcerr;
+extern _STLP_DECLSPEC wostream wclog;
+# endif
+
+# ifndef __LOCALE_INITIALIZED
+#  define __LOCALE_INITIALIZED
+// Global initializer object, to ensure initialization of locale subsystem.
+static ios_base::_Loc_init _LocInit;
+# endif
+
+# ifndef __IOS_BASE_INITIALIZED
+#  define __IOS_BASE_INITIALIZED
+// Global initializer object, to ensure construction of static objects.
+static ios_base::Init _IosInit;
+# endif
+
+_STLP_END_NAMESPACE
+
+# elif defined ( _STLP_USE_NO_IOSTREAMS )
+#  include <stl/_null_stream.h>
+# else
+
+#  include <wrap_std/iostream>
+
+# endif /* STL_USE_NO_IOSTREAMS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1037)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/iostream.h b/src/STLport/iostream.h
new file mode 100644
index 0000000..439a0b1
--- /dev/null
+++ b/src/STLport/iostream.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_IOSTREAM_H
+# define _STLP_IOSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2035
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_OWN_IOSTREAMS
+
+#ifdef __BORLANDC__
+# include <iostream.>
+#else
+# include <iostream>
+#endif
+
+// Those should be included all separately, as they do contain using declarations
+# include <streambuf.h>
+# include <ostream.h>
+# include <istream.h>
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#  else
+using _STLP_STD::cin;
+using _STLP_STD::cout;
+using _STLP_STD::clog;
+using _STLP_STD::cerr;
+using _STLP_STD::iostream;
+
+#   ifndef _STLP_NO_WCHAR_T
+using _STLP_STD::wcin;
+using _STLP_STD::wcout;
+using _STLP_STD::wclog;
+using _STLP_STD::wcerr;
+#   endif
+
+#  endif
+
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+// Obsolete classes for old-style backwards compatibility
+
+
+class istream_withassign : public istream {
+ public:
+  istream_withassign() : istream((streambuf*)0) {}
+  ~istream_withassign() {}
+  
+  istream_withassign& operator=(istream& __s) { 
+    ios::init(__s.rdbuf()); 
+    return *this; 
+  }
+  istream_withassign& operator=(streambuf* __s) {
+    ios::init(__s); 
+    return *this; 
+  }
+};
+
+class ostream_withassign : public ostream {
+ public:
+  ostream_withassign() : ostream((streambuf*)0) {}
+  ~ostream_withassign() {}
+  
+  ostream_withassign& operator=(ostream& __s) { 
+    ios::init(__s.rdbuf()); 
+    return *this; 
+  }
+  ostream_withassign& operator=(streambuf* __s) { 
+    ios::init(__s); 
+    return *this; 
+  }
+};
+
+class iostream_withassign : public iostream {
+ public:
+  iostream_withassign() : iostream((streambuf*)0) {}
+  ~iostream_withassign() {}
+  iostream_withassign & operator=(ios& __i) {
+    ios::init(__i.rdbuf());
+    return *this; 
+  }
+  iostream_withassign & operator=(streambuf* __s) {
+    ios::init(__s); 
+    return *this; 
+  }
+} ;
+
+# elif ! defined (_STLP_USE_NO_IOSTREAMS)
+#  include <wrap_std/h/iostream.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2035)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_IOSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/istream b/src/STLport/istream
new file mode 100644
index 0000000..fec47d7
--- /dev/null
+++ b/src/STLport/istream
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_ISTREAM
+#define _STLP_ISTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1036
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+// boris : apparently, needed to resolve some
+// circular dependancies
+// #  include <iterator>
+#  include <stl/_istream.h>
+
+# elif !defined(_STLP_USE_NO_IOSTREAMS)
+
+#  include <wrap_std/istream>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1036)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ISTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/istream.h b/src/STLport/istream.h
new file mode 100644
index 0000000..342aae8
--- /dev/null
+++ b/src/STLport/istream.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ISTREAM_H
+# define _STLP_ISTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2037
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# include <istream>
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#  else
+using _STLP_STD::basic_istream;
+using _STLP_STD::basic_iostream;
+using _STLP_STD::istream;
+using _STLP_STD::iostream;
+using _STLP_STD::ios;
+#   ifndef _STLP_NO_WCHAR_T
+using _STLP_STD::wistream;
+using _STLP_STD::wiostream;
+#   endif
+using _STLP_STD::ws;
+#  endif
+# endif
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(istream.h)
+
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+using _STLP_OLD_IO_NAMESPACE::istream;
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
+
+# endif /* _STLP_OWN_IOSTREAMS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2037)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ISTREAM_H */
+
diff --git a/src/STLport/iterator b/src/STLport/iterator
new file mode 100644
index 0000000..ee3cbd6
--- /dev/null
+++ b/src/STLport/iterator
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ITERATOR
+#define _STLP_ITERATOR
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x38
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#if defined (_STLP_IMPORT_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(iterator)
+#endif /* IMPORT */
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_STREAM_ITERATOR_H
+#  include <stl/_stream_iterator.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x38)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ITERATOR */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/limits b/src/STLport/limits
new file mode 100644
index 0000000..2cd16b5
--- /dev/null
+++ b/src/STLport/limits
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_LIMITS
+#define _STLP_LIMITS
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x39
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# ifndef _STLP_LIMITS_H
+#  include <stl/_limits.h>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x39)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LIMITS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/list b/src/STLport/list
new file mode 100644
index 0000000..7cdc087
--- /dev/null
+++ b/src/STLport/list
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_LIST
+#define _STLP_LIST
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x40
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_LIST_H
+# include <stl/_list.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(list)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x40)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LIST */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/locale b/src/STLport/locale
new file mode 100644
index 0000000..cd7ae9e
--- /dev/null
+++ b/src/STLport/locale
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_LOCALE
+#define _STLP_LOCALE
+
+// Basic framework: class locale and class locale::facet
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1041
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+// Individual facets
+#ifndef _STLP_INTERNAL_CTYPE_H
+#include <stl/_ctype.h>
+#endif
+#ifndef _STLP_INTERNAL_CODECVT_H
+#include <stl/_codecvt.h>
+#endif
+#ifndef _STLP_INTERNAL_COLLATE_H
+#include <stl/_collate.h>
+#endif
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+// those never included separately anyway
+#include <stl/_monetary.h>
+#include <stl/_time_facets.h>
+#include <stl/_messages_facets.h>
+
+// some stuff for streambuf iterators ended up defined there
+// Strictly speaking, _istream.h portion is only required for <iterator>, but it may break too many 
+// programs if we omit it
+#ifndef _STLP_ISTREAM_H
+# include <stl/_istream.h>
+#endif
+
+// Convenience interfaces
+#undef isspace
+#undef isprint
+#undef iscntrl
+#undef isupper
+#undef islower
+#undef isalpha
+#undef isdigit
+#undef ispunct
+#undef isxdigit
+#undef isalnum
+#undef isgraph
+#undef toupper
+#undef tolower
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT> 
+inline bool isspace (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::space, c);
+}
+
+template <class _CharT> 
+inline bool isprint (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::print, c);
+}
+
+template <class _CharT> 
+inline bool iscntrl (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::cntrl, c);
+}
+
+template <class _CharT> 
+inline bool isupper (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::upper, c);
+}
+
+template <class _CharT> 
+inline bool islower (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::lower, c);
+}
+
+template <class _CharT> 
+inline bool isalpha (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::alpha, c);
+}
+
+template <class _CharT> 
+inline bool isdigit (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::digit, c);
+}
+
+template <class _CharT> 
+inline bool ispunct (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::punct, c);
+}
+
+template <class _CharT> 
+inline bool isxdigit (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::xdigit, c);
+}
+
+template <class _CharT> 
+inline bool isalnum (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::alnum, c);
+}
+
+template <class _CharT> 
+inline bool isgraph (_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).is(ctype_base::graph, c);
+}
+
+template <class _CharT>
+inline _CharT toupper(_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).toupper(c);
+}
+
+template <class _CharT>
+inline _CharT tolower(_CharT c, const locale& loc) {
+  return (use_facet<ctype<_CharT> >(loc)).tolower(c);
+}
+
+# ifndef __LOCALE_INITIALIZED
+#  define __LOCALE_INITIALIZED
+// Global initializer object, to ensure initialization of locale subsystem.
+static ios_base::_Loc_init _LocInit;
+# endif
+
+_STLP_END_NAMESPACE
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+#  include <wrap_std/locale> 
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1041)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LOCALE */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/locale.h b/src/STLport/locale.h
new file mode 100644
index 0000000..0656975
--- /dev/null
+++ b/src/STLport/locale.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x242
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x242) && ! defined (_STLP_DONT_POP_0x242)
+#  define _STLP_DONT_POP_0x242
+# endif
+
+# include _STLP_NATIVE_C_HEADER(locale.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x242)
+#  if ! defined (_STLP_DONT_POP_0x242)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x242
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/map b/src/STLport/map
new file mode 100644
index 0000000..f0cf7b1
--- /dev/null
+++ b/src/STLport/map
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MAP
+#define _STLP_MAP
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x43
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#include <stl/_map.h>
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(map)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x43)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MAP */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/math.h b/src/STLport/math.h
new file mode 100644
index 0000000..7b02ff8
--- /dev/null
+++ b/src/STLport/math.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x244
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x244) && ! defined (_STLP_DONT_POP_0x244)
+#  define _STLP_DONT_POP_0x244
+# endif
+
+# if ! defined (exception) && (! defined (__KCC) || (__KCC_VERSION < 4000)) && \
+   ! (defined(__IBMCPP__) && (500 <= __IBMCPP__))
+#  define __EXCEPTION_WAS_REDEFINED 1
+#  define exception __math_exception
+# endif
+
+# include _STLP_NATIVE_C_HEADER(math.h)
+
+# if defined (__EXCEPTION_WAS_REDEFINED)
+#  undef exception
+#  undef __EXCEPTION_WAS_REDEFINED
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x244)
+#  if ! defined (_STLP_DONT_POP_0x244)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x244
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/mem.h b/src/STLport/mem.h
new file mode 100644
index 0000000..e80f14d
--- /dev/null
+++ b/src/STLport/mem.h
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// Boris : highly questionable header for BC++
+
+#ifndef _STLP_mem_h
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x245
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x245) && ! defined (_STLP_DONT_POP_0x245)
+#  define _STLP_DONT_POP_0x245
+# endif
+
+# if (__BORLANDC__ > 0x530) && !defined(__linux__)
+#  include <rw/stddefs.h>
+# endif
+
+#   undef __USING_CNAME__
+
+#   include _STLP_NATIVE_C_HEADER(mem.h)
+
+# define _STLP_mem_h 1
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x245)
+#  if ! defined (_STLP_DONT_POP_0x245)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x245
+# endif
+
+#endif /* _STLP_mem_h */
+
+// #endif /* NATIVE */
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/memory b/src/STLport/memory
new file mode 100644
index 0000000..28f24e3
--- /dev/null
+++ b/src/STLport/memory
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MEMORY
+# define _STLP_MEMORY
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x46
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_TEMPBUF_H
+#  include <stl/_tempbuf.h>
+# endif
+
+# ifndef _STLP_INTERNAL_RAW_STORAGE_ITER_H
+#  include <stl/_raw_storage_iter.h>
+# endif
+
+# include <stl/_auto_ptr.h>
+
+# if defined (_STLP_IMPORT_VENDOR_STD)
+
+#  if defined (__MSL__)
+#   include _STLP_NATIVE_HEADER(limits)
+#  endif
+
+#  include _STLP_NATIVE_HEADER(memory)
+
+#  if defined (__MSL__) && (__MSL__ >= 0x2405	 && __MSL__ < 0x5201) 
+/*  980401 vss  MSL 2.4  Pro 3 Release  */	
+#   include <new_mem.h>
+#  endif
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x46)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MEMORY */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/mmemory.h b/src/STLport/mmemory.h
new file mode 100644
index 0000000..835dad5
--- /dev/null
+++ b/src/STLport/mmemory.h
@@ -0,0 +1 @@
+CAUUSE A SYNTAX ERROR
diff --git a/src/STLport/new b/src/STLport/new
new file mode 100644
index 0000000..fcb3810
--- /dev/null
+++ b/src/STLport/new
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_NEW_HEADER
+# define _STLP_NEW_HEADER
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x447
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_CSTDDEF
+// size_t
+# include <cstddef>
+#endif
+
+#if defined (__BORLANDC__) && (__BORLANDC__ > 0x520)
+// new.h uses ::malloc ;(
+# include <cstdlib>
+using _STLP_VENDOR_CSTD::malloc;
+#endif
+
+# if !defined (_STLP_NO_NEW_NEW_HEADER)
+#   include _STLP_NATIVE_CPP_RUNTIME_HEADER(new)
+#  else
+#   include  <new.h>
+# endif
+
+#ifndef _STLP_NEW_H_HEADER
+# include <stl/_new.h>
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x447)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_NEW */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/new.h b/src/STLport/new.h
new file mode 100644
index 0000000..b1bf7a4
--- /dev/null
+++ b/src/STLport/new.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x848
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x848) && ! defined (_STLP_DONT_POP_0x848)
+#  define _STLP_DONT_POP_0x848
+# endif
+
+# ifndef _STLP_WINCE
+# if defined (__BORLANDC__)
+#  include <new.>
+# elif (__INTEL_COMPILER >= 800)
+#   include _STLP_NATIVE_OLD_STREAMS_HEADER(new.h)
+# else
+#  if defined (__GNUC__) && (__GNUC__ >=3)
+#   include _STLP_NATIVE_OLD_STREAMS_HEADER(new.h)
+#  else
+#   include _STLP_NATIVE_CPP_RUNTIME_HEADER(new.h)
+#  endif
+# endif
+# endif /* STL_WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x848)
+#  if ! defined (_STLP_DONT_POP_0x848)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x848
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/numeric b/src/STLport/numeric
new file mode 100644
index 0000000..c39f0e8
--- /dev/null
+++ b/src/STLport/numeric
@@ -0,0 +1,50 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_NUMERIC
+#define _STLP_NUMERIC
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x49
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function.h>
+#endif
+
+#include <stl/_numeric.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x49)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_NUMERIC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/algo.h b/src/STLport/old_hp/algo.h
new file mode 100644
index 0000000..9e62c34
--- /dev/null
+++ b/src/STLport/old_hp/algo.h
@@ -0,0 +1,146 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGO_H
+#define _STLP_ALGO_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa001
+#  include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_ALGOBASE_H
+#  include <algobase.h>
+# endif
+
+# ifndef _STLP_TEMPBUF_H
+#  include <tempbuf.h>
+# endif
+
+# ifndef _STLP_INTERNAL_HEAP_H
+#  include <stl/_heap.h>
+# endif
+
+# ifndef _STLP_ITERATOR_H
+#  include <iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGO_H
+#  include <stl/_algo.h>
+# endif
+
+# ifndef _STLP_NUMERIC_H
+#  include <stl/_numeric.h>
+# endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+// Names from <stl/_algo.h>
+using STLPORT::for_each; 
+using STLPORT::find; 
+using STLPORT::find_if; 
+using STLPORT::adjacent_find; 
+using STLPORT::count; 
+using STLPORT::count_if; 
+using STLPORT::search; 
+using STLPORT::search_n; 
+using STLPORT::swap_ranges; 
+using STLPORT::transform; 
+using STLPORT::replace; 
+using STLPORT::replace_if; 
+using STLPORT::replace_copy; 
+using STLPORT::replace_copy_if; 
+using STLPORT::generate; 
+using STLPORT::generate_n; 
+// using STLPORT::remove; 
+using STLPORT::remove_if; 
+using STLPORT::remove_copy; 
+using STLPORT::remove_copy_if; 
+using STLPORT::unique; 
+using STLPORT::unique_copy; 
+using STLPORT::reverse; 
+using STLPORT::reverse_copy; 
+using STLPORT::rotate; 
+using STLPORT::rotate_copy; 
+using STLPORT::random_shuffle; 
+using STLPORT::random_sample; 
+using STLPORT::random_sample_n; 
+using STLPORT::partition; 
+using STLPORT::stable_partition; 
+using STLPORT::sort; 
+using STLPORT::stable_sort; 
+using STLPORT::partial_sort; 
+using STLPORT::partial_sort_copy; 
+using STLPORT::nth_element; 
+using STLPORT::lower_bound; 
+using STLPORT::upper_bound; 
+using STLPORT::equal_range; 
+using STLPORT::binary_search; 
+using STLPORT::merge; 
+using STLPORT::inplace_merge; 
+using STLPORT::includes; 
+using STLPORT::set_union; 
+using STLPORT::set_intersection; 
+using STLPORT::set_difference; 
+using STLPORT::set_symmetric_difference; 
+using STLPORT::min_element; 
+using STLPORT::max_element; 
+using STLPORT::next_permutation; 
+using STLPORT::prev_permutation; 
+using STLPORT::find_first_of; 
+using STLPORT::find_end; 
+using STLPORT::is_sorted; 
+using STLPORT::is_heap; 
+
+// Names from stl_heap.h
+using STLPORT::push_heap;
+using STLPORT::pop_heap;
+using STLPORT::make_heap;
+using STLPORT::sort_heap;
+
+// Names from <stl/_numeric.h>
+using STLPORT::accumulate; 
+using STLPORT::inner_product; 
+using STLPORT::partial_sum; 
+using STLPORT::adjacent_difference; 
+using STLPORT::power; 
+using STLPORT::iota; 
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa001)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALGO_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/algobase.h b/src/STLport/old_hp/algobase.h
new file mode 100644
index 0000000..536c8d9
--- /dev/null
+++ b/src/STLport/old_hp/algobase.h
@@ -0,0 +1,97 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGOBASE_H
+#define _STLP_ALGOBASE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa002
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_PAIR_H
+#include <pair.h>
+#endif
+
+// memmove
+#ifndef _STLP_CSTRING
+# include <cstring>
+#endif
+
+// CHAR_MAX
+#ifndef _STLP_CLIMITS
+# include <climits>
+#endif
+
+#ifndef _STLP_ITERATOR_H
+#include <iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#include <stl/_algobase.h>
+#endif
+
+#ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#include <stl/_uninitialized.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+// Names from stl_algobase.h
+using STLPORT::iter_swap; 
+using STLPORT::swap; 
+using STLPORT::min; 
+using STLPORT::max; 
+using STLPORT::copy; 
+using STLPORT::copy_backward; 
+using STLPORT::copy_n; 
+using STLPORT::fill; 
+using STLPORT::fill_n; 
+using STLPORT::mismatch; 
+using STLPORT::equal; 
+using STLPORT::lexicographical_compare; 
+using STLPORT::lexicographical_compare_3way; 
+
+// Names from stl_uninitialized.h
+using STLPORT::uninitialized_copy;
+using STLPORT::uninitialized_copy_n;
+using STLPORT::uninitialized_fill;
+using STLPORT::uninitialized_fill_n;
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa002)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALGOBASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/alloc.h b/src/STLport/old_hp/alloc.h
new file mode 100644
index 0000000..33be2f8
--- /dev/null
+++ b/src/STLport/old_hp/alloc.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALLOC_H
+#define _STLP_ALLOC_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa003
+#  include <stl/_prolog.h>
+# endif
+
+#if defined  (_STLP_DEBUG) || defined (_STLP_ASSERTIONS) && !defined (_STLP_DEBUG_H)
+# include <stl/debug/_debug.h>
+#endif
+
+# ifndef _STLP_CSTDDEF
+#  include <cstddef>
+# endif
+# ifndef _STLP_CLIMITS
+#  include <climits>
+# endif
+# ifndef _STLP_CSTDLIB
+#  include <cstdlib>
+# endif
+# ifndef _STLP_CSTRING
+#  include <cstring>
+# endif
+# ifndef _STLP_CASSERT
+#  include <cassert>
+# endif
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#include <stl/_alloc.h>
+#endif
+
+// Old SGI names
+_STLP_BEGIN_NAMESPACE
+
+typedef __sgi_alloc alloc;
+typedef __malloc_alloc<0> malloc_alloc;
+#ifdef _STLP_USE_NEWALLOC
+typedef __new_alloc new_alloc;
+#endif
+
+#define simple_alloc __simple_alloc
+typedef __single_client_alloc  single_client_alloc; 
+typedef __multithreaded_alloc  multithreaded_alloc; 
+
+_STLP_END_NAMESPACE
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+
+using namespace STLPORT;
+
+# else
+
+# ifdef _STLP_USE_RAW_SGI_ALLOCATORS
+using _STLP_STD::simple_alloc;
+using _STLP_STD::alloc;
+# endif
+
+using _STLP_STD::malloc_alloc; 
+# ifdef _STLP_DEBUG_ALLOC
+using _STLP_STD::__debug_alloc;
+# endif 
+#ifdef _STLP_USE_NEWALLOC
+using _STLP_STD::new_alloc;
+#endif
+
+using _STLP_STD::single_client_alloc; 
+using _STLP_STD::multithreaded_alloc; 
+using _STLP_STD::allocator;
+
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa003)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/bvector.h b/src/STLport/old_hp/bvector.h
new file mode 100644
index 0000000..c0e7b7b
--- /dev/null
+++ b/src/STLport/old_hp/bvector.h
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BVECTOR_H
+#define _STLP_BVECTOR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa004
+#  include <stl/_prolog.h>
+# endif
+
+#include <algobase.h>
+
+#include <stl/_range_errors.h>
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+#include <vector.h>
+#else
+#include <alloc.h>
+#endif 
+
+#include <stl/_vector.h>
+#include <stl/_bvector.h>
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::bit_vector;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa004)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_BVECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/old_hp/defalloc.h b/src/STLport/old_hp/defalloc.h
new file mode 100644
index 0000000..1eee36f
--- /dev/null
+++ b/src/STLport/old_hp/defalloc.h
@@ -0,0 +1,87 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+// Inclusion of this file is DEPRECATED.  This is the original HP
+// default allocator.  It is provided only for backward compatibility.
+// This file WILL BE REMOVED in a future release.
+//
+// DO NOT USE THIS FILE unless you have an old container implementation
+// that requires an allocator with the HP-style interface.  
+//
+// Standard-conforming allocators have a very different interface.  The
+// standard default allocator is declared in the header <memory>.
+
+// Adaptation note: THIS version of allocator<T> is fully compatible with
+// SGI containers and works OK standalone. It is also as close to CD2 version
+// as possible w/o member templates.
+// However, explicit use of allocator<T>  is not recommended 
+// unless you have to do so ( for example, compiling third-party code).
+
+#ifndef _STLP_DEFALLOC_H
+#define _STLP_DEFALLOC_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa005
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_DEBUG) && ! defined ( _STLP_DEBUG_H )
+#  include <stl/debug/_debug.h>
+# endif
+
+#if defined (_STLP_USE_NEW_STYLE_HEADERS)
+# include <cstddef>
+# include <cstdlib>
+# include <cstring>
+# include <cassert>
+#else
+# include <stddef.h>
+# include <stdlib.h>
+# include <string.h>
+# include <assert.h>
+#endif
+
+# include <new>
+
+#ifdef _STLP_THREADS
+# include <stl/_threads.h>
+#endif
+
+# if !defined (__THROW_BAD_ALLOC) && !defined(_STLP_USE_EXCEPTIONS)
+#   if defined (_STLP_USE_NEW_STYLE_HEADERS)
+#    include <cstdio>
+#   else
+#    include <stdio.h>
+#   endif
+# endif
+#  include <stl/_alloc.h>
+
+// fbp: just for backwards compatibility,
+// hope this doesn't break anything.
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::allocator;
+# endif /* _STLP_BROKEN_USING_DIRECTIVE */
+#endif /*  _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa005)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_DEFALLOC_H */
+
diff --git a/src/STLport/old_hp/deque.h b/src/STLport/old_hp/deque.h
new file mode 100644
index 0000000..4171074
--- /dev/null
+++ b/src/STLport/old_hp/deque.h
@@ -0,0 +1,68 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DEQUE_H
+#define _STLP_DEQUE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa006
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_RANGE_ERRORS_H
+# include <stl/_range_errors.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::deque;
+using STLPORT::__deque__;
+# endif /*  _STLP_BROKEN_USING_DIRECTIVE */
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa006)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/export b/src/STLport/old_hp/export
new file mode 100644
index 0000000..0c0e780
--- /dev/null
+++ b/src/STLport/old_hp/export
@@ -0,0 +1,27 @@
+./algo.h
+./algobase.h
+./alloc.h
+./bvector.h
+./defalloc.h
+./deque.h
+./function.h
+./hash_map.h
+./hash_set.h
+./hashtable.h
+./heap.h
+./iterator.h
+./list.h
+./map.h
+./multimap.h
+./multiset.h
+./numeric.h
+./pair.h
+./pthread_alloc.h
+./queue.h
+./rope.h
+./set.h
+./slist.h
+./stack.h
+./tempbuf.h
+./tree.h
+./vector.h
diff --git a/src/STLport/old_hp/function.h b/src/STLport/old_hp/function.h
new file mode 100644
index 0000000..e707e36
--- /dev/null
+++ b/src/STLport/old_hp/function.h
@@ -0,0 +1,126 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_FUNCTION_H
+#define _STLP_FUNCTION_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa008
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#include <stl/_algobase.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+#include <stl/_function.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+#ifndef _STLP_NO_RELOPS_NAMESPACE
+using namespace STLPORT_RELOPS;
+#endif /* _STLP_USE_NAMESPACE_FOR_RELOPS */
+
+# else /* _STLP_BROKEN_USING_DIRECTIVE */
+
+// Names from stl_function.h
+using _STLP_STD::unary_function; 
+using _STLP_STD::binary_function; 
+using _STLP_STD::plus; 
+using _STLP_STD::minus; 
+using _STLP_STD::multiplies; 
+using _STLP_STD::divides; 
+using _STLP_STD::identity_element; 
+using _STLP_STD::modulus; 
+using _STLP_STD::negate; 
+using _STLP_STD::equal_to; 
+using _STLP_STD::not_equal_to; 
+using _STLP_STD::greater; 
+using _STLP_STD::less; 
+using _STLP_STD::greater_equal; 
+using _STLP_STD::less_equal; 
+using _STLP_STD::logical_and; 
+using _STLP_STD::logical_or; 
+using _STLP_STD::logical_not; 
+using _STLP_STD::unary_negate; 
+using _STLP_STD::binary_negate; 
+using _STLP_STD::not1; 
+using _STLP_STD::not2; 
+using _STLP_STD::binder1st; 
+using _STLP_STD::binder2nd; 
+using _STLP_STD::bind1st; 
+using _STLP_STD::bind2nd; 
+using _STLP_STD::unary_compose; 
+using _STLP_STD::binary_compose; 
+using _STLP_STD::compose1; 
+using _STLP_STD::compose2; 
+using _STLP_STD::pointer_to_unary_function; 
+using _STLP_STD::pointer_to_binary_function; 
+using _STLP_STD::ptr_fun; 
+using _STLP_STD::identity; 
+using _STLP_STD::select1st; 
+using _STLP_STD::select2nd; 
+using _STLP_STD::project1st; 
+using _STLP_STD::project2nd; 
+using _STLP_STD::constant_void_fun; 
+using _STLP_STD::constant_unary_fun; 
+using _STLP_STD::constant_binary_fun; 
+using _STLP_STD::constant0; 
+using _STLP_STD::constant1; 
+using _STLP_STD::constant2; 
+using _STLP_STD::subtractive_rng; 
+using _STLP_STD::mem_fun_t; 
+using _STLP_STD::const_mem_fun_t; 
+using _STLP_STD::mem_fun_ref_t; 
+using _STLP_STD::const_mem_fun_ref_t; 
+using _STLP_STD::mem_fun1_t; 
+using _STLP_STD::const_mem_fun1_t; 
+using _STLP_STD::mem_fun1_ref_t; 
+using _STLP_STD::const_mem_fun1_ref_t; 
+using _STLP_STD::mem_fun; 
+using _STLP_STD::mem_fun_ref; 
+using _STLP_STD::mem_fun1; 
+using _STLP_STD::mem_fun1_ref; 
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa008)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_FUNCTION_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/hash_map.h b/src/STLport/old_hp/hash_map.h
new file mode 100644
index 0000000..a0e8aec
--- /dev/null
+++ b/src/STLport/old_hp/hash_map.h
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_MAP_H
+#define _STLP_HASH_MAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa009
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_HASHTABLE_H
+#include <hashtable.h>
+#endif 
+
+#include <stl/_hash_map.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::hash;
+using STLPORT::hashtable;
+using STLPORT::hash_map;
+using STLPORT::hash_multimap;
+using STLPORT::__hash_map__;
+using STLPORT::__hash_multimap__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa009)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/hash_set.h b/src/STLport/old_hp/hash_set.h
new file mode 100644
index 0000000..a30bbad
--- /dev/null
+++ b/src/STLport/old_hp/hash_set.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HASH_SET_H
+#define _STLP_HASH_SET_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa010
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_HASHTABLE_H
+#include <hashtable.h>
+#endif 
+
+#include <stl/_hash_set.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::hash;
+using STLPORT::hashtable;
+using STLPORT::hash_set;
+using STLPORT::hash_multiset;
+using STLPORT::__hash_set__;
+using STLPORT::__hash_multiset__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa010)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HASH_SET_H */
diff --git a/src/STLport/old_hp/hashtable.h b/src/STLport/old_hp/hashtable.h
new file mode 100644
index 0000000..831c2ac
--- /dev/null
+++ b/src/STLport/old_hp/hashtable.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_HASHTABLE_H
+#define _STLP_HASHTABLE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa011
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGO_H
+#include <algo.h>
+#endif
+#ifndef _STLP_ALLOC_H
+#include <alloc.h>
+#endif
+#ifndef _STLP_VECTOR_H
+#include <vector.h>
+#endif
+#ifndef _STLP_HASH_FUN_H
+#include <stl/_hash_fun.h>
+#endif
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+#include <stl/_hashtable.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::hash;
+using STLPORT::hashtable;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa011)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+#endif /* _STLP_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/heap.h b/src/STLport/old_hp/heap.h
new file mode 100644
index 0000000..e82f95c
--- /dev/null
+++ b/src/STLport/old_hp/heap.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_HEAP_H
+#define _STLP_HEAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x12
+#  include <stl/_prolog.h>
+# endif
+
+#include <stl/_heap.h>
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace std;
+# else
+using STLPORT::push_heap;
+using STLPORT::pop_heap;
+using STLPORT::make_heap;
+using STLPORT::sort_heap;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x12)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_HEAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/iterator.h b/src/STLport/old_hp/iterator.h
new file mode 100644
index 0000000..a4d91d3
--- /dev/null
+++ b/src/STLport/old_hp/iterator.h
@@ -0,0 +1,147 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ITERATOR_H
+#define _STLP_ITERATOR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa013
+#  include <stl/_prolog.h>
+# endif
+
+#if defined  (_STLP_DEBUG) || defined (_STLP_ASSERTIONS) && !defined (_STLP_DEBUG_H)
+# include <stl/debug/_debug.h>
+#endif
+
+#if defined (_STLP_USE_NEW_STYLE_HEADERS)
+# include <cstddef>
+#else
+# include <stddef.h>
+#endif
+
+# ifndef _STLP_NEW
+#  include <new>
+# endif
+
+# ifndef __TYPE_TRAITS_H
+#  include <stl/type_traits.h>
+# endif
+
+#ifndef _STLP_FUNCTION_H
+#include <function.h>
+#endif
+
+# ifndef _STLP_IOSFWD
+#  include <iosfwd>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+#  include <stl/_iterator_base.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+#ifndef _STLP_INTERNAL_CONSTRUCT_H
+#include <stl/_construct.h>
+#endif
+
+#ifndef _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H
+#include <stl/_raw_storage_iter.h>
+#endif
+
+# ifndef _STLP_INTERNAL_STREAM_ITERATOR_H
+#  include <stl/_stream_iterator.h>
+# endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+// Names from stl_iterator.h
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+
+using STLPORT::input_iterator_tag;
+using STLPORT::output_iterator_tag;
+using STLPORT::forward_iterator_tag;
+using STLPORT::bidirectional_iterator_tag;
+using STLPORT::random_access_iterator_tag;
+
+using STLPORT::input_iterator;
+using STLPORT::output_iterator;
+using STLPORT::forward_iterator;
+using STLPORT::bidirectional_iterator;
+using STLPORT::random_access_iterator;
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+using STLPORT::iterator_traits;
+#endif
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+using STLPORT::iterator_category;
+using STLPORT::distance_type;
+using STLPORT::value_type;
+# endif
+
+using STLPORT::distance; 
+using STLPORT::advance; 
+
+using STLPORT::insert_iterator;
+using STLPORT::front_insert_iterator;
+using STLPORT::back_insert_iterator;
+using STLPORT::inserter;
+using STLPORT::front_inserter;
+using STLPORT::back_inserter;
+
+using STLPORT::reverse_iterator;
+# if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
+using STLPORT::reverse_bidirectional_iterator;
+# endif
+using STLPORT::istream_iterator;
+using STLPORT::ostream_iterator;
+
+// Names from stl_construct.h
+using STLPORT::construct;
+using STLPORT::destroy;
+
+// Names from stl_raw_storage_iter.h
+using STLPORT::raw_storage_iterator;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa013)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/list.h b/src/STLport/old_hp/list.h
new file mode 100644
index 0000000..6f42e3f
--- /dev/null
+++ b/src/STLport/old_hp/list.h
@@ -0,0 +1,62 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_LIST_H
+#define _STLP_LIST_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa014
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+#include <stl/_list.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::list;
+using STLPORT::__list__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa014)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/map.h b/src/STLport/old_hp/map.h
new file mode 100644
index 0000000..ac4a0b3
--- /dev/null
+++ b/src/STLport/old_hp/map.h
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MAP_H
+# define _STLP_MAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa015
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+# include <stl/_map.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::map;
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+using STLPORT::__map;
+# endif
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa015)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/multimap.h b/src/STLport/old_hp/multimap.h
new file mode 100644
index 0000000..cd00f43
--- /dev/null
+++ b/src/STLport/old_hp/multimap.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MULTIMAP_H
+#define _STLP_MULTIMAP_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa016
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+#include <stl/_map.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::multimap;
+using STLPORT::__multimap__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa016)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MULTIMAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/multiset.h b/src/STLport/old_hp/multiset.h
new file mode 100644
index 0000000..7c32f25
--- /dev/null
+++ b/src/STLport/old_hp/multiset.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_MULTISET_H
+#define _STLP_MULTISET_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa017
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+#include <stl/_set.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::multiset;
+using STLPORT::__multiset__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa017)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_MULTISET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/numeric.h b/src/STLport/old_hp/numeric.h
new file mode 100644
index 0000000..8945a01
--- /dev/null
+++ b/src/STLport/old_hp/numeric.h
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1997
+ * Mark of the Unicorn, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Mark of the Unicorn, Inc. makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef _STLP_NUMERIC_H
+# define _STLP_NUMERIC_H
+
+#ifndef __MWERKS__
+# error This file should be removed from installations not using the Metrowerks Standard Library
+#else
+# include <numeric>
+//# include <algo.h>
+#endif
+
+# endif // _STLP_NUMERIC_H
diff --git a/src/STLport/old_hp/pair.h b/src/STLport/old_hp/pair.h
new file mode 100644
index 0000000..df30a65
--- /dev/null
+++ b/src/STLport/old_hp/pair.h
@@ -0,0 +1,59 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PAIR_H
+#define _STLP_PAIR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa020
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::pair;
+using _STLP_STD::make_pair;
+# endif
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa020)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_PAIR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/pthread_alloc.h b/src/STLport/old_hp/pthread_alloc.h
new file mode 100644
index 0000000..4a66d1e
--- /dev/null
+++ b/src/STLport/old_hp/pthread_alloc.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PTHREAD_ALLOC_H
+#define _STLP_PTHREAD_ALLOC_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa021
+#  include <stl/_prolog.h>
+# endif
+
+#if defined  (_STLP_DEBUG) || defined (_STLP_ASSERTIONS)
+# include <stl/debug/_debug.h>
+#endif
+
+#include <pthread_alloc>
+
+#ifdef _STLP_USE_NAMESPACES
+
+using STLPORT::_Pthread_alloc_template;
+using STLPORT::pthread_alloc;
+
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa021)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_PTHREAD_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/old_hp/queue.h b/src/STLport/old_hp/queue.h
new file mode 100644
index 0000000..36b6e93
--- /dev/null
+++ b/src/STLport/old_hp/queue.h
@@ -0,0 +1,23 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef __QUEUE__
+# define __QUEUE__
+# include <queue>
+#endif
diff --git a/src/STLport/old_hp/rope.h b/src/STLport/old_hp/rope.h
new file mode 100644
index 0000000..851a6bc
--- /dev/null
+++ b/src/STLport/old_hp/rope.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ROPE_H
+#define _STLP_ROPE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa022
+#  include <stl/_prolog.h>
+# endif
+
+#include <stl/_rope.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::char_producer; 
+using STLPORT::sequence_buffer; 
+using STLPORT::rope; 
+using STLPORT::crope; 
+using STLPORT::wrope; 
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa022)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ROPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/set.h b/src/STLport/old_hp/set.h
new file mode 100644
index 0000000..81d4949
--- /dev/null
+++ b/src/STLport/old_hp/set.h
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SET_H
+#define _STLP_SET_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa023
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_TREE_H
+# include <tree.h>
+#endif
+
+#include <stl/_set.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::set;
+using STLPORT::__set__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa023)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/slist.h b/src/STLport/old_hp/slist.h
new file mode 100644
index 0000000..bcd5d15
--- /dev/null
+++ b/src/STLport/old_hp/slist.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SLIST_H
+#define _STLP_SLIST_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa024
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+#include <stl/_slist.h>
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::slist;
+#  ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+using STLPORT::__slist;
+#  endif
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa024)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/stack.h b/src/STLport/old_hp/stack.h
new file mode 100644
index 0000000..2898e06
--- /dev/null
+++ b/src/STLport/old_hp/stack.h
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STACK_H
+#define _STLP_STACK_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa027
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_VECTOR_H
+#include <vector.h>
+#endif
+
+#ifndef _STLP_DEQUE_H
+#include <deque.h>
+#endif
+
+#ifndef _STLP_HEAP_H
+#include <heap.h>
+#endif
+
+#ifndef _STLP_INTERNAL_STACK_H
+#include <stl/_stack.h>
+#endif
+
+#ifndef _STLP_INTERNAL_QUEUE_H
+#include <stl/_queue.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::stack;
+using _STLP_STD::queue;
+using _STLP_STD::priority_queue;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa027)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STACK_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/tempbuf.h b/src/STLport/old_hp/tempbuf.h
new file mode 100644
index 0000000..a78d8f4
--- /dev/null
+++ b/src/STLport/old_hp/tempbuf.h
@@ -0,0 +1,79 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TEMPBUF_H
+#define _STLP_TEMPBUF_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa028
+#  include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_CLIMITS
+#  include <climits>
+# endif
+
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+#ifndef _STLP_CSTDLIB
+# include <cstdlib>
+#endif
+
+#if !defined (_STLP_NEW)
+# include <new>
+#endif
+
+#ifndef __TYPE_TRAITS_H
+#include <stl/type_traits.h>
+#endif
+
+#ifndef _STLP_PAIR_H
+#include <pair.h>
+#endif
+
+#ifndef _STLP_INTERNAL_TEMPBUF_H
+#include <stl/_tempbuf.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::get_temporary_buffer;
+using _STLP_STD::return_temporary_buffer;
+using _STLP_STD::temporary_buffer;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa028)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_TEMPBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/tree.h b/src/STLport/old_hp/tree.h
new file mode 100644
index 0000000..8b6b813
--- /dev/null
+++ b/src/STLport/old_hp/tree.h
@@ -0,0 +1,60 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TREE_H
+#define _STLP_TREE_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa030
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+#include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+#include <alloc.h>
+#endif
+
+#ifndef _STLP_INTERNAL_TREE_H
+#include <stl/_tree.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using _STLP_STD::rb_tree;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa030)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/old_hp/vector.h b/src/STLport/old_hp/vector.h
new file mode 100644
index 0000000..add0b6d
--- /dev/null
+++ b/src/STLport/old_hp/vector.h
@@ -0,0 +1,65 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_VECTOR_H
+#define _STLP_VECTOR_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0xa031
+#  include <stl/_prolog.h>
+# endif
+
+#ifndef _STLP_ALGOBASE_H
+# include <algobase.h>
+#endif
+
+#ifndef _STLP_ALLOC_H
+# include <alloc.h>
+#endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+#  include <stl/_range_errors.h>
+# endif
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+#ifdef _STLP_USE_NAMESPACES
+# ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace STLPORT;
+# else
+using STLPORT::vector;
+using STLPORT::__vector__;
+# endif
+#endif /* _STLP_USE_NAMESPACES */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0xa031)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ostream b/src/STLport/ostream
new file mode 100644
index 0000000..627acbb
--- /dev/null
+++ b/src/STLport/ostream
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_OSTREAM
+#define _STLP_OSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1050
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#  include <stl/_ostream.h>
+
+# elif !defined(_STLP_USE_NO_IOSTREAMS)
+
+#  include <wrap_std/ostream>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1050)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_OSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/ostream.h b/src/STLport/ostream.h
new file mode 100644
index 0000000..6b3ca2b
--- /dev/null
+++ b/src/STLport/ostream.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_OSTREAM_H
+# define _STLP_OSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2051
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#ifdef __BORLANDC__
+#  include <ostream.>
+#else
+#  include <ostream>
+#endif
+
+#  ifdef _STLP_USE_NAMESPACES
+#   include <using/ostream>
+#  endif
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+#  include _STLP_NATIVE_OLD_STREAMS_HEADER(ostream.h)
+#  if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+#   include <using/h/ostream.h>
+_STLP_END_NAMESPACE
+#  endif /* _STLP_USE_NAMESPACES */
+
+# endif /* _STLP_USE_NO_IOSTREAMS */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2051)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_OSTREAM_H */
+
diff --git a/src/STLport/pthread.h b/src/STLport/pthread.h
new file mode 100644
index 0000000..86a0695
--- /dev/null
+++ b/src/STLport/pthread.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x280
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x280) && ! defined (_STLP_DONT_POP_0x280)
+#  define _STLP_DONT_POP_0x280
+# endif
+
+# if defined (__SUNPRO_CC) || defined (__HP_aCC)
+# include "/usr/include/pthread.h"
+# else
+# include _STLP_NATIVE_C_HEADER(pthread.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x280)
+#  if ! defined (_STLP_DONT_POP_0x280)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#  endif
+#  undef  _STLP_DONT_POP_0x280
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/pthread_alloc b/src/STLport/pthread_alloc
new file mode 100644
index 0000000..e9218f5
--- /dev/null
+++ b/src/STLport/pthread_alloc
@@ -0,0 +1,49 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PTHREAD_ALLOC
+#define _STLP_PTHREAD_ALLOC
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x52
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# include <stl/_pthread_alloc.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x52)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_PTHREAD_ALLOC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/queue b/src/STLport/queue
new file mode 100644
index 0000000..45a8cc8
--- /dev/null
+++ b/src/STLport/queue
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_QUEUE
+#define _STLP_QUEUE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x53
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_QUEUE_H
+# include <stl/_queue.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <functional>
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x53)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_QUEUE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/rlocks.h b/src/STLport/rlocks.h
new file mode 100644
index 0000000..8f1fb5e
--- /dev/null
+++ b/src/STLport/rlocks.h
@@ -0,0 +1,11 @@
+#ifndef _STLP_misc_rlocks_h
+# define _STLP_misc_rlocks_h
+# if (__SUNPRO_CC >= 0x500 )
+#  include <../CCios/rlocks.h>
+# elif defined (__SUNPRO_CC) 
+#  include <../CC/rlocks.h>
+# else 
+#  error "This file is for SUN CC only. Please remove it if it causes any harm for other compilers." 
+# endif
+#endif
+
diff --git a/src/STLport/rope b/src/STLport/rope
new file mode 100644
index 0000000..c0bf103
--- /dev/null
+++ b/src/STLport/rope
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef _STLP_ROPE
+#define _STLP_ROPE
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x54
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# include <stl/_rope.h>
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x54)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_ROPE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/set b/src/STLport/set
new file mode 100644
index 0000000..deef6fb
--- /dev/null
+++ b/src/STLport/set
@@ -0,0 +1,53 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_SET
+#define _STLP_SET
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x55
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#include <stl/_set.h>
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(set)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x55)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SET */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/setjmp.h b/src/STLport/setjmp.h
new file mode 100644
index 0000000..0e0f0a5
--- /dev/null
+++ b/src/STLport/setjmp.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x256
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x256) && ! defined (_STLP_DONT_POP_0x256)
+#  define _STLP_DONT_POP_0x256
+# endif
+
+
+# ifndef setjmp
+#  include _STLP_NATIVE_C_HEADER(setjmp.h)
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x256)
+#  if ! defined (_STLP_DONT_POP_0x256)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x256
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/signal.h b/src/STLport/signal.h
new file mode 100644
index 0000000..14148a5
--- /dev/null
+++ b/src/STLport/signal.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x257
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x257) && ! defined (_STLP_DONT_POP_0x257)
+#  define _STLP_DONT_POP_0x257
+# endif
+
+# include _STLP_NATIVE_C_HEADER(signal.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x257)
+#  if ! defined (_STLP_DONT_POP_0x257)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x257
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/slist b/src/STLport/slist
new file mode 100644
index 0000000..b55be37
--- /dev/null
+++ b/src/STLport/slist
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef _STLP_SLIST
+#define _STLP_SLIST
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x58
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_SLIST_H
+# include <stl/_slist.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(slist)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x58)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SLIST */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/sstream b/src/STLport/sstream
new file mode 100644
index 0000000..b3df768
--- /dev/null
+++ b/src/STLport/sstream
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// This header defines classes basic_stringbuf, basic_istringstream,
+// basic_ostringstream, and basic_stringstream.  These classes 
+// represent streamsbufs and streams whose sources or destinations are
+// C++ strings.
+
+#ifndef _STLP_SSTREAM
+#define _STLP_SSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1059
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+# include <stl/_sstream.h>
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include <wrap_std/sstream>
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1059)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_SSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stack b/src/STLport/stack
new file mode 100644
index 0000000..8b6128d
--- /dev/null
+++ b/src/STLport/stack
@@ -0,0 +1,55 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STACK
+#define _STLP_STACK
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x60
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#ifndef _STLP_INTERNAL_STACK_H
+#include <stl/_stack.h>
+#endif
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(stack)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x60)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STACK */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stdarg.h b/src/STLport/stdarg.h
new file mode 100644
index 0000000..b96922f
--- /dev/null
+++ b/src/STLport/stdarg.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x261
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x261) && ! defined (_STLP_DONT_POP_0x261)
+#  define _STLP_DONT_POP_0x261
+# endif
+
+# include _STLP_NATIVE_C_HEADER(stdarg.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x261)
+#  if ! defined (_STLP_DONT_POP_0x261)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x261
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stddef.h b/src/STLport/stddef.h
new file mode 100644
index 0000000..13773cd
--- /dev/null
+++ b/src/STLport/stddef.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x262
+#  include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_WINCE
+
+# include _STLP_NATIVE_C_HEADER(stddef.h)
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x262)
+#  if ! defined (_STLP_DONT_POP_0x262)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x262
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stdexcept b/src/STLport/stdexcept
new file mode 100644
index 0000000..1829a9c
--- /dev/null
+++ b/src/STLport/stdexcept
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STDEXCEPT
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x63
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x63) && ! defined (_STLP_DONT_POP_0x63)
+#  define _STLP_DONT_POP_0x63
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if !defined(_STLP_STDEXCEPT_SEEN) && \
+   (!defined (_STLP_USE_NATIVE_STDEXCEPT) || defined (_STLP_USE_OWN_NAMESPACE))
+
+#  define _STLP_STDEXCEPT_SEEN 1
+
+#  include <exception>
+
+#if defined(_STLP_USE_EXCEPTIONS) || \
+    !(defined(_MIPS_SIM) && defined(_ABIO32) && _MIPS_SIM == _ABIO32)
+
+# include <cstring>
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+# include <stl/_alloc.h>
+#endif
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+# define _STLP_OWN_STDEXCEPT 1
+
+_STLP_BEGIN_NAMESPACE
+
+# if   ! defined (_STLP_NO_EXCEPTION_HEADER)
+# if !defined(_STLP_EXCEPTION_BASE) && !defined(_STLP_BROKEN_EXCEPTION_CLASS) && defined (_STLP_USE_NAMESPACES) && defined (_STLP_USE_OWN_NAMESPACE)
+using _STLP_VENDOR_EXCEPT_STD::exception;
+# endif
+# endif
+#  define _STLP_EXCEPTION_BASE exception
+
+class _STLP_CLASS_DECLSPEC __Named_exception : public _STLP_EXCEPTION_BASE {
+public:
+  __Named_exception(const string& __str) 
+# ifdef _STLP_OWN_IOSTREAMS
+    ;
+  const char* what() const _STLP_NOTHROW_INHERENTLY;
+  ~__Named_exception() _STLP_NOTHROW_INHERENTLY;
+# else
+  {
+    strncpy(_M_name, __get_c_string(__str), _S_bufsize);
+    _M_name[_S_bufsize - 1] = '\0';
+  }
+  const char* what() const _STLP_NOTHROW_INHERENTLY { return _M_name; }
+# endif
+
+private:
+  enum { _S_bufsize = 256 };
+  char _M_name[_S_bufsize];
+};
+
+class _STLP_CLASS_DECLSPEC logic_error : public __Named_exception {
+public:
+  logic_error(const string& __s) : __Named_exception(__s) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~logic_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC runtime_error : public __Named_exception {
+public:
+  runtime_error(const string& __s) : __Named_exception(__s) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~runtime_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC domain_error : public logic_error {
+public:
+  domain_error(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~domain_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC invalid_argument : public logic_error {
+public:
+  invalid_argument(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~invalid_argument() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC length_error : public logic_error {
+public:
+  length_error(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~length_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC out_of_range : public logic_error {
+public:
+  out_of_range(const string& __arg) : logic_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~out_of_range() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC range_error : public runtime_error {
+public:
+  range_error(const string& __arg) : runtime_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~range_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC overflow_error : public runtime_error {
+public:
+  overflow_error(const string& __arg) : runtime_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~overflow_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+class _STLP_CLASS_DECLSPEC underflow_error : public runtime_error {
+public:
+  underflow_error(const string& __arg) : runtime_error(__arg) {}
+# ifdef _STLP_OWN_IOSTREAMS
+  ~underflow_error() _STLP_NOTHROW_INHERENTLY;
+# endif
+};
+
+_STLP_END_NAMESPACE
+
+#endif /* Not o32, and no exceptions */
+# endif /* _STLP_STDEXCEPT_SEEN */
+
+
+#if defined (_STLP_USE_NATIVE_STDEXCEPT)
+#  include _STLP_NATIVE_HEADER(stdexcept)
+# endif
+
+#  define _STLP_STDEXCEPT 1
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x63)
+#  if ! defined (_STLP_DONT_POP_0x63)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x63
+# endif
+
+#endif /* _STLP_STDEXCEPT */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stdio.h b/src/STLport/stdio.h
new file mode 100644
index 0000000..4e8faba
--- /dev/null
+++ b/src/STLport/stdio.h
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x264
+#  include <stl/_prolog.h>
+# endif
+
+# if ! defined (_STLP_WINCE)
+# include _STLP_NATIVE_C_HEADER(stdio.h)
+
+#if defined (__SUNPRO_CC) && !defined (_STRUCT_FILE)
+# define _STRUCT_FILE
+#endif
+
+# ifdef __MWERKS__
+#  undef stdin
+#  undef stdout
+#  undef stderr
+
+#  define stdin  	(&_STLP_VENDOR_CSTD::__files[0])
+#  define stdout	(&_STLP_VENDOR_CSTD::__files[1])
+#  define stderr	(&_STLP_VENDOR_CSTD::__files[2])
+# endif
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x264)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stdio_streambuf b/src/STLport/stdio_streambuf
new file mode 100644
index 0000000..bd49264
--- /dev/null
+++ b/src/STLport/stdio_streambuf
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// This header is an extension.  It defines two streambufs:
+// stdio_istreambuf, a read-only streambuf synchronized with a C stdio
+// FILE object, and stdio_ostreambuf, a write-only streambuf
+// synchronized with a C stdio FILE object.  Note that neither 
+// stdio_istreambuf nor stdio_ostreambuf is a template; both classes
+// are derived from basic_streambuf<char, char_traits<char> >.
+
+// Note: the imbue() member function is a no-op.  In particular, these
+// classes assume that codecvt<char, char, mbstate_t> is always an identity
+// transformation.  This is true of the default locale, and of all locales
+// defined for the C I/O library.  If you need to use a locale where 
+// the codecvt<char, char, mbstate_t> facet performs a nontrivial 
+// conversion, then you should use basic_filebuf<> instead of stdio_istreambuf
+// or stdio_ostreambuf.  (If you don't understand what any of this means, 
+// then it's not a feature you need to worry about.  Locales where 
+// codecvt<char, char, mbstate_t> does something nontrivial are a rare
+// corner case.)
+
+
+#ifndef _STLP_STDIO_STREAMBUF
+#define _STLP_STDIO_STREAMBUF
+
+#if !defined(STLP_WINCE)
+
+#include <streambuf>            // For basic_streambuf<>
+#include <cstdio>              // For FILE.
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+// This is an extension.  It is in namespace SGI, not namespace std
+namespace _SgI {
+
+# ifdef _STLP_USE_NAMESPACES
+using namespace _STLP_STD;
+  // MSVC needs this
+using _STLP_STD::streamsize;
+using _STLP_STD::streambuf;
+using _STLP_STD::basic_streambuf;
+using _STLP_STD::ios_base;
+  // using _STLP_STD::ios_base::openmode;
+# endif
+# endif
+
+// Base class for features common to stdio_istreambuf and stdio_ostreambuf
+class stdio_streambuf_base : public basic_streambuf<char, _STLP_STD::char_traits<char> >
+{
+public:                         // Constructor, destructor.
+  // The argument may not be null.  It must be an open file pointer.
+  stdio_streambuf_base(FILE*);
+
+  // The destructor flushes the stream, but does not close it.
+  ~stdio_streambuf_base();
+
+protected:                      // Virtual functions from basic_streambuf.
+  streambuf* setbuf(char*, streamsize);
+
+  pos_type seekoff(off_type, ios_base::seekdir,
+                   ios_base::openmode
+                          = ios_base::in | ios_base::out);
+  pos_type seekpos(pos_type,
+                   ios_base::openmode
+                          = ios_base::in | ios_base::out);
+  int sync();
+
+protected:
+  FILE* _M_file;
+};
+
+class stdio_istreambuf : public stdio_streambuf_base
+{
+public:                         // Constructor, destructor.
+  stdio_istreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
+
+  ~stdio_istreambuf();
+
+protected:                      // Virtual functions from basic_streambuf.
+  streamsize showmanyc();
+  int_type underflow();
+  int_type uflow();
+  virtual int_type pbackfail(int_type c = traits_type::eof());
+};
+
+class stdio_ostreambuf : public stdio_streambuf_base
+{
+public:                         // Constructor, destructor.
+  stdio_ostreambuf(FILE* __f) : stdio_streambuf_base(__f) {}
+  ~stdio_ostreambuf();
+
+protected:                      // Virtual functions from basic_streambuf.
+  streamsize showmanyc();
+  int_type overflow(int_type c = traits_type::eof());
+};
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+} // Close namespace _SgI.
+# endif
+
+#endif /* _STLP_STDIO_STREAMBUF */
+
+#endif /* _STLP_WINCE */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stdiostream.h b/src/STLport/stdiostream.h
new file mode 100644
index 0000000..80a5c67
--- /dev/null
+++ b/src/STLport/stdiostream.h
@@ -0,0 +1,10 @@
+#ifndef _STLP_misc_stdiostream_h
+# define _STLP_misc_stdiostream_h
+# if (__SUNPRO_CC >= 0x500 )
+#  include <../CCios/stdiostream.h>
+# else if defined (__SUNPRO_CC)
+#  include <../CC/stdiostream.h>
+# else
+#  error "This file is for SUN CC only. Please remove it if it causes any harm for other compilers."
+# endif
+#endif
diff --git a/src/STLport/stdlib.h b/src/STLport/stdlib.h
new file mode 100644
index 0000000..537df7d
--- /dev/null
+++ b/src/STLport/stdlib.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x265
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x265) && ! defined (_STLP_DONT_POP_0x265)
+#  define _STLP_DONT_POP_0x265
+# endif
+
+# include _STLP_NATIVE_C_HEADER(stdlib.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x265)
+#  if ! defined (_STLP_DONT_POP_0x265)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#  endif
+#  undef  _STLP_DONT_POP_0x265
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_abbrevs.h b/src/STLport/stl/_abbrevs.h
new file mode 100644
index 0000000..57901ef
--- /dev/null
+++ b/src/STLport/stl/_abbrevs.h
@@ -0,0 +1,70 @@
+/*
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ABBREVS_H
+# define _STLP_INTERNAL_ABBREVS_H
+
+// ugliness is intentional - to reduce conflicts
+#  define input_iterator_tag             _In__ItT
+#  define output_iterator_tag            _Ou__ItT
+#  define bidirectional_iterator_tag     _Bd__ItT
+#  define random_access_iterator_tag     _Ra__ItT
+#  define input_iterator                 _In__It
+#  define output_iterator                _Ou__It
+#  define bidirectional_iterator         _Bd__It
+#  define random_access_iterator         _Ra__It
+#  define reverse_bidirectional_iterator _rBd__It
+#  define reverse_iterator               _r__It
+#  define back_insert_iterator           _bI__It
+#  define front_insert_iterator          _fI__It
+#  define raw_storage_iterator           _rS__It
+#  define _Const_traits _C_Tr
+#  define _Nonconst_traits _N_Tr
+
+// ugliness is intentional - to reduce conflicts probability
+#  define __malloc_alloc   M__A
+#  define __node_alloc     D__A
+#  define __new_alloc      N__A
+#  define __debug_alloc    G__A
+
+#  define __deque_iterator         _dQ__It
+#  define _Buf_traits              _dQ__BTr
+#  define _Deque_iterator          _Dq__It
+
+#  define _Select1st _S1st
+#  define _Select2nd _S2nd
+
+#  define _Hashtable_iterator         _hT__It
+#  define _Hashtable_const_iterator   _hT__cIt
+#  define _Hashtable_node             _hT__N
+#  define _Hashtable_base             _hT__B
+#  define _Ht_iterator _Ht_It
+
+#  define __list_iterator         _L__It
+#  define __slist_iterator         _SL__It
+
+#  define _Rb_tree_node_base       _rbT__NB
+#  define _Rb_tree_node            _rbT__N
+#  define _Rb_base_iterator        _rbTB__It
+#  define _Rb_tree_base_iterator   _rbT__It
+#  define _Rb_tree_base            _rbT__B
+
+#endif
+
diff --git a/src/STLport/stl/_algo.c b/src/STLport/stl/_algo.c
new file mode 100644
index 0000000..4e9aaf8
--- /dev/null
+++ b/src/STLport/stl/_algo.c
@@ -0,0 +1,1765 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_ALGO_C
+# define _STLP_ALGO_C
+
+# if !defined (_STLP_INTERNAL_ALGO_H)
+#  include <stl/_algo.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _BidirectionalIter, class _Distance, class _Compare>
+void __merge_without_buffer(_BidirectionalIter __first,
+                            _BidirectionalIter __middle,
+                            _BidirectionalIter __last,
+                            _Distance __len1, _Distance __len2,
+                            _Compare __comp);
+
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+          class _BidirectionalIter3, class _Compare>
+_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
+                                     _BidirectionalIter1 __last1,
+                                     _BidirectionalIter2 __first2,
+                                     _BidirectionalIter2 __last2,
+                                     _BidirectionalIter3 __result,
+                                     _Compare __comp);
+
+template <class _Tp>
+# if !(defined (__SUNPRO_CC) && (__SUNPRO_CC < 0x420 ))
+inline 
+# endif
+const _Tp& __median(const _Tp& __a, const _Tp& __b, const _Tp& __c) {
+  if (__a < __b)
+    if (__b < __c)
+      return __b;
+    else if (__a < __c)
+      return __c;
+    else
+      return __a;
+  else if (__a < __c)
+    return __a;
+  else if (__b < __c)
+    return __c;
+  else
+    return __b;
+}
+
+template <class _Tp, class _Compare>
+# if !(defined (__SUNPRO_CC) && (__SUNPRO_CC < 0x420 ))
+inline 
+# endif
+const _Tp&
+__median(const _Tp& __a, const _Tp& __b, const _Tp& __c, _Compare __comp) {
+  if (__comp(__a, __b))
+    if (__comp(__b, __c))
+      return __b;
+    else if (__comp(__a, __c))
+      return __c;
+    else
+      return __a;
+  else if (__comp(__a, __c))
+    return __a;
+  else if (__comp(__b, __c))
+    return __c;
+  else
+    return __b;
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+                     _ForwardIter2 __first2, _ForwardIter2 __last2) 
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  // Test for empty ranges
+  if (__first1 == __last1 || __first2 == __last2)
+    return __first1;
+
+  // Test for a pattern of length 1.
+  _ForwardIter2 __tmp(__first2);
+  ++__tmp;
+  if (__tmp == __last2)
+    return find(__first1, __last1, *__first2);
+
+  // General case.
+  _ForwardIter2 __p1 = __first2; 
+  ++__p1;
+
+  _ForwardIter1 __current = __first1;
+
+  while (__first1 != __last1) {
+    __first1 = find(__first1, __last1, *__first2);
+    if (__first1 == __last1)
+      return __last1;
+
+    _ForwardIter2 __p = __p1;
+    __current = __first1; 
+    if (++__current == __last1)
+      return __last1;
+
+    while (*__current == *__p) {
+      if (++__p == __last2)
+        return __first1;
+      if (++__current == __last1)
+        return __last1;
+    }
+
+    ++__first1;
+  }
+  return __first1;
+}
+
+// search_n.  Search for __count consecutive copies of __val.
+
+template <class _ForwardIter, class _Integer, class _Tp>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+                      _Integer __count, const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__count <= 0)
+    return __first;
+  else {
+    __first = find(__first, __last, __val);
+    while (__first != __last) {
+      _Integer __n = __count - 1;
+      _ForwardIter __i = __first;
+      ++__i;
+      while (__i != __last && __n != 0 && *__i == __val) {
+        ++__i;
+        --__n;
+      }
+      if (__n == 0)
+        return __first;
+      else
+        __first = find(__i, __last, __val);
+    }
+    return __last;
+  }
+}
+
+template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+                      _Integer __count, const _Tp& __val,
+                      _BinaryPred __binary_pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__count <= 0)
+    return __first;
+  else {
+    while (__first != __last) {
+      if (__binary_pred(*__first, __val))
+        break;
+      ++__first;
+    }
+    while (__first != __last) {
+      _Integer __n = __count - 1;
+      _ForwardIter __i = __first;
+      ++__i;
+      while (__i != __last && __n != 0 && __binary_pred(*__i, __val)) {
+        ++__i;
+        --__n;
+      }
+      if (__n == 0)
+        return __first;
+      else {
+        while (__i != __last) {
+          if (__binary_pred(*__i, __val))
+            break;
+          ++__i;
+        }
+        __first = __i;
+      }
+    }
+    return __last;
+  }
+} 
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1 
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
+         _ForwardIter2 __first2, _ForwardIter2 __last2)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  return __find_end(__first1, __last1, __first2, __last2,
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+                    _STLP_ITERATOR_CATEGORY(__first1, _ForwardIter1),
+                    _STLP_ITERATOR_CATEGORY(__first2, _ForwardIter2),
+# else
+		    forward_iterator_tag(),
+                    forward_iterator_tag(),
+# endif
+                    __equal_to(_STLP_VALUE_TYPE(__first1, _ForwardIter1))
+    );
+}
+
+// unique and unique_copy
+template <class _InputIterator, class _OutputIterator, class _BinaryPredicate,
+					    class _Tp>
+_STLP_INLINE_LOOP _OutputIterator 
+__unique_copy(_InputIterator __first, _InputIterator __last,
+              _OutputIterator __result,
+              _BinaryPredicate __binary_pred, _Tp*) {
+  _Tp __val = *__first;
+  *__result = __val;
+  while (++__first != __last)
+    if (!__binary_pred(__val, *__first)) {
+      __val = *__first;
+      *++__result = __val;
+    }
+  return ++__result;
+}
+
+template <class _InputIter, class _OutputIter, class _BinaryPredicate>
+inline _OutputIter 
+__unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+              _BinaryPredicate __binary_pred, const output_iterator_tag &) {
+  return __unique_copy(__first, __last, __result, __binary_pred, _STLP_VALUE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+_STLP_INLINE_LOOP _ForwardIter 
+__unique_copy(_InputIter __first, _InputIter __last, _ForwardIter __result, 
+              _BinaryPredicate __binary_pred, const forward_iterator_tag &) {
+  *__result = *__first;
+  while (++__first != __last)
+    if (!__binary_pred(*__result, *__first)) *++__result = *__first;
+  return ++__result;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _InputIterator, class _BidirectionalIterator, class _BinaryPredicate>
+inline _BidirectionalIterator 
+__unique_copy(_InputIterator __first, _InputIterator __last,
+              _BidirectionalIterator __result, _BinaryPredicate __binary_pred,
+              const bidirectional_iterator_tag &) {
+  return __unique_copy(__first, __last, __result, __binary_pred, forward_iterator_tag());
+}
+
+template <class _InputIterator, class _RandomAccessIterator, class _BinaryPredicate>
+inline _RandomAccessIterator 
+__unique_copy(_InputIterator __first, _InputIterator __last,
+              _RandomAccessIterator __result, _BinaryPredicate __binary_pred,
+              const random_access_iterator_tag &) {
+  return __unique_copy(__first, __last, __result, __binary_pred, forward_iterator_tag());
+}
+# endif /* _STLP_NONTEMPL_BASE_MATCH_BUG */
+
+
+template <class _InputIter, class _OutputIter>
+_OutputIter 
+unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __result;
+  return __unique_copy(__first, __last, __result, __equal_to(_STLP_VALUE_TYPE(__first, _InputIter)),
+                       _STLP_ITERATOR_CATEGORY(__result, _OutputIter));
+}
+
+template <class _InputIter, class _OutputIter, class _BinaryPredicate>
+_OutputIter 
+unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+            _BinaryPredicate __binary_pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __result;
+  return __unique_copy(__first, __last, __result, __binary_pred,
+                       _STLP_ITERATOR_CATEGORY(__result, _OutputIter));
+}
+
+// rotate and rotate_copy, and their auxiliary functions
+
+template <class _ForwardIter, class _Distance>
+_ForwardIter __rotate(_ForwardIter __first,
+                      _ForwardIter __middle,
+                      _ForwardIter __last,
+                      _Distance*,
+                      const forward_iterator_tag &) {
+  if (__first == __middle)
+    return __last;
+  if (__last  == __middle)
+    return __first;
+
+  _ForwardIter __first2 = __middle;
+  do {
+    swap(*__first++, *__first2++);
+    if (__first == __middle)
+      __middle = __first2;
+  } while (__first2 != __last);
+
+  _ForwardIter __new_middle = __first;
+
+  __first2 = __middle;
+
+  while (__first2 != __last) {
+    swap (*__first++, *__first2++);
+    if (__first == __middle)
+      __middle = __first2;
+    else if (__first2 == __last)
+      __first2 = __middle;
+  }
+
+  return __new_middle;
+}
+
+template <class _BidirectionalIter, class _Distance>
+_BidirectionalIter __rotate(_BidirectionalIter __first,
+                            _BidirectionalIter __middle,
+                            _BidirectionalIter __last,
+                            _Distance*,
+                            const bidirectional_iterator_tag &) {
+  if (__first == __middle)
+    return __last;
+  if (__last  == __middle)
+    return __first;
+
+  __reverse(__first,  __middle, bidirectional_iterator_tag());
+  __reverse(__middle, __last,   bidirectional_iterator_tag());
+
+  while (__first != __middle && __middle != __last)
+    swap (*__first++, *--__last);
+
+  if (__first == __middle) {
+    __reverse(__middle, __last,   bidirectional_iterator_tag());
+    return __last;
+  }
+  else {
+    __reverse(__first,  __middle, bidirectional_iterator_tag());
+    return __first;
+  }
+}
+
+template <class _RandomAccessIter, class _Distance, class _Tp>
+_RandomAccessIter __rotate(_RandomAccessIter __first,
+                           _RandomAccessIter __middle,
+                           _RandomAccessIter __last,
+                           _Distance *, _Tp *) {
+
+  _Distance __n = __last   - __first;
+  _Distance __k = __middle - __first;
+  _Distance __l = __n - __k;
+  _RandomAccessIter __result = __first + (__last - __middle);
+
+  if (__k==0)  /* __first == middle */
+    return __last;
+
+  if (__k == __l) {
+    swap_ranges(__first, __middle, __middle);
+    return __result;
+  }
+
+  _Distance __d = __gcd(__n, __k);
+
+  for (_Distance __i = 0; __i < __d; __i++) {
+    _Tp __tmp = *__first;
+    _RandomAccessIter __p = __first;
+
+    if (__k < __l) {
+      for (_Distance __j = 0; __j < __l/__d; __j++) {
+	if (__p > __first + __l) {
+          *__p = *(__p - __l);
+          __p -= __l;
+        }
+
+        *__p = *(__p + __k);
+        __p += __k;
+      }
+    }
+
+    else {
+      for (_Distance __j = 0; __j < __k/__d - 1; __j ++) {
+        if (__p < __last - __k) {
+          *__p = *(__p + __k);
+          __p += __k;
+        }
+
+        *__p = * (__p - __l);
+        __p -= __l;
+      }
+    }
+
+    *__p = __tmp;
+    ++__first;
+  }
+
+  return __result;
+}
+
+template <class _RandomAccessIter, class _Distance>
+inline _RandomAccessIter 
+__rotate(_RandomAccessIter __first, _RandomAccessIter __middle, _RandomAccessIter __last,
+         _Distance * __dis, const random_access_iterator_tag &) {
+  return __rotate(__first, __middle, __last,
+                  __dis, _STLP_VALUE_TYPE(__first, _RandomAccessIter));
+}
+
+template <class _ForwardIter>
+_ForwardIter 
+rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+  _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+  return __rotate(__first, __middle, __last,
+                  _STLP_DISTANCE_TYPE(__first, _ForwardIter),
+                  _STLP_ITERATOR_CATEGORY(__first, _ForwardIter));
+}
+
+// Return a random number in the range [0, __n).  This function encapsulates
+// whether we're using rand (part of the standard C library) or lrand48
+// (not standard, but a much better choice whenever it's available).
+
+template <class _Distance>
+inline _Distance __random_number(_Distance __n) {
+#ifdef _STLP_NO_DRAND48
+  return rand() % __n;
+#else
+  return lrand48() % __n;
+#endif
+}
+
+template <class _RandomAccessIter>
+void random_shuffle(_RandomAccessIter __first,
+		    _RandomAccessIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return;
+  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
+    iter_swap(__i, __first + __random_number((__i - __first) + 1));
+}
+
+template <class _RandomAccessIter, class _RandomNumberGenerator>
+void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
+                    _RandomNumberGenerator& __rand) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return;
+  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
+    iter_swap(__i, __first + __rand((__i - __first) + 1));
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// random_sample and random_sample_n (extensions, not part of the standard).
+
+template <class _ForwardIter, class _OutputIter, class _Distance>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+                            _OutputIter __out, const _Distance __n)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _Distance __remaining = distance(__first, __last);
+  _Distance __m = (min) (__n, __remaining);
+
+  while (__m > 0) {
+    if (__random_number(__remaining) < __m) {
+      *__out = *__first;
+      ++__out;
+      --__m;
+    }
+
+    --__remaining;
+    ++__first;
+  }
+  return __out;
+}
+
+
+template <class _ForwardIter, class _OutputIter, class _Distance,
+          class _RandomNumberGenerator>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+                            _OutputIter __out, const _Distance __n,
+                            _RandomNumberGenerator& __rand)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _Distance __remaining = distance(__first, __last);
+  _Distance __m = (min) (__n, __remaining);
+
+  while (__m > 0) {
+    if (__rand(__remaining) < __m) {
+      *__out = *__first;
+      ++__out;
+      --__m;
+    }
+
+    --__remaining;
+    ++__first;
+  }
+  return __out;
+}
+
+template <class _InputIter, class _RandomAccessIter, class _Distance>
+_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
+                                  _RandomAccessIter __out,
+                                  const _Distance __n)
+{
+  _Distance __m = 0;
+  _Distance __t = __n;
+  for ( ; __first != __last && __m < __n; ++__m, ++__first) 
+    __out[__m] = *__first;
+
+  while (__first != __last) {
+    ++__t;
+    _Distance __M = __random_number(__t);
+    if (__M < __n)
+      __out[__M] = *__first;
+    ++__first;
+  }
+
+  return __out + __m;
+}
+
+template <class _InputIter, class _RandomAccessIter,
+          class _RandomNumberGenerator, class _Distance>
+_RandomAccessIter __random_sample(_InputIter __first, _InputIter __last,
+                                  _RandomAccessIter __out,
+                                  _RandomNumberGenerator& __rand,
+                                  const _Distance __n)
+{
+  _Distance __m = 0;
+  _Distance __t = __n;
+  for ( ; __first != __last && __m < __n; ++__m, ++__first)
+    __out[__m] = *__first;
+
+  while (__first != __last) {
+    ++__t;
+    _Distance __M = __rand(__t);
+    if (__M < __n)
+      __out[__M] = *__first;
+    ++__first;
+  }
+
+  return __out + __m;
+}
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+              _RandomAccessIter __out_first, _RandomAccessIter __out_last) 
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _STLP_DEBUG_CHECK(__check_range(__out_first, __out_last))
+  return __random_sample(__first, __last,
+                         __out_first, __out_last - __out_first);
+}
+
+template <class _InputIter, class _RandomAccessIter, class _RandomNumberGenerator>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+              _RandomAccessIter __out_first, _RandomAccessIter __out_last,
+              _RandomNumberGenerator& __rand) 
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _STLP_DEBUG_CHECK(__check_range(__out_first, __out_last))
+  return __random_sample(__first, __last,
+                         __out_first, __rand,
+                         __out_last - __out_first);
+}
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+// partition, stable_partition, and their auxiliary functions
+
+template <class _ForwardIter, class _Predicate>
+_STLP_INLINE_LOOP _ForwardIter __partition(_ForwardIter __first,
+                                           _ForwardIter __last,
+                                           _Predicate   __pred,
+                                           const forward_iterator_tag &) {
+  if (__first == __last) return __first;
+
+  while (__pred(*__first))
+    if (++__first == __last) return __first;
+
+  _ForwardIter __next = __first;
+
+  while (++__next != __last)
+    if (__pred(*__next)) {
+      swap(*__first, *__next);
+      ++__first;
+    }
+  return __first;
+}
+
+template <class _BidirectionalIter, class _Predicate>
+_STLP_INLINE_LOOP _BidirectionalIter __partition(_BidirectionalIter __first,
+                                                 _BidirectionalIter __last,
+                                                 _Predicate __pred,
+                                                 const bidirectional_iterator_tag &) {
+  while (true) {
+    while (true)
+      if (__first == __last)
+        return __first;
+      else if (__pred(*__first))
+        ++__first;
+      else
+        break;
+    --__last;
+    while (true)
+      if (__first == __last)
+        return __first;
+      else if (!__pred(*__last))
+        --__last;
+      else
+        break;
+    iter_swap(__first, __last);
+    ++__first;
+  }
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _BidirectionalIter, class _Predicate>
+inline
+_BidirectionalIter __partition(_BidirectionalIter __first,
+                               _BidirectionalIter __last,
+			       _Predicate __pred,
+			       const random_access_iterator_tag &) {
+  return __partition(__first, __last, __pred, bidirectional_iterator_tag());
+}
+# endif
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate   __pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __partition(__first, __last, __pred, _STLP_ITERATOR_CATEGORY(__first, _ForwardIter));
+}
+
+
+template <class _ForwardIter, class _Predicate, class _Distance>
+_ForwardIter __inplace_stable_partition(_ForwardIter __first,
+                                        _ForwardIter __last,
+                                        _Predicate __pred, _Distance __len) {
+  if (__len == 1)
+    return __pred(*__first) ? __last : __first;
+  _ForwardIter __middle = __first;
+  advance(__middle, __len / 2);
+  return rotate(__inplace_stable_partition(__first, __middle, __pred, 
+                                           __len / 2),
+                __middle,
+                __inplace_stable_partition(__middle, __last, __pred,
+                                           __len - __len / 2));
+}
+
+template <class _ForwardIter, class _Pointer, class _Predicate, 
+          class _Distance>
+_ForwardIter __stable_partition_adaptive(_ForwardIter __first,
+                                         _ForwardIter __last,
+                                         _Predicate __pred, _Distance __len,
+                                         _Pointer __buffer,
+                                         _Distance __buffer_size) 
+{
+  if (__len <= __buffer_size) {
+    _ForwardIter __result1 = __first;
+    _Pointer __result2 = __buffer;
+    for ( ; __first != __last ; ++__first)
+      if (__pred(*__first)) {
+        *__result1 = *__first;
+        ++__result1;
+      }
+      else {
+        *__result2 = *__first;
+        ++__result2;
+      }
+    copy(__buffer, __result2, __result1);
+    return __result1;
+  }
+  else {
+    _ForwardIter __middle = __first;
+    advance(__middle, __len / 2);
+    return rotate(__stable_partition_adaptive(
+                          __first, __middle, __pred,
+                          __len / 2, __buffer, __buffer_size),
+                    __middle,
+                    __stable_partition_adaptive(
+                          __middle, __last, __pred,
+                          __len - __len / 2, __buffer, __buffer_size));
+  }
+}
+
+template <class _ForwardIter, class _Predicate, class _Tp, class _Distance>
+inline _ForwardIter
+__stable_partition_aux(_ForwardIter __first, _ForwardIter __last, 
+                       _Predicate __pred, _Tp*, _Distance*)
+{
+  _Temporary_buffer<_ForwardIter, _Tp> __buf(__first, __last);
+  _STLP_MPWFIX_TRY		//*TY 06/01/2000 - they forget to call dtor for _Temporary_buffer if no try/catch block is present
+  return (__buf.size() > 0) ?
+    __stable_partition_adaptive(__first, __last, __pred,
+				_Distance(__buf.requested_size()),
+				__buf.begin(), __buf.size())  :
+    __inplace_stable_partition(__first, __last, __pred, 
+			       _Distance(__buf.requested_size()));
+  _STLP_MPWFIX_CATCH	//*TY 06/01/2000 - they forget to call dtor for _Temporary_buffer if no try/catch block is present
+}
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter 
+stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last)
+    return __first;
+  else
+    return __stable_partition_aux(__first, __last, __pred,
+                                  _STLP_VALUE_TYPE(__first, _ForwardIter),
+                                  _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+_RandomAccessIter __unguarded_partition(_RandomAccessIter __first, 
+                                        _RandomAccessIter __last, 
+                                        _Tp __pivot, _Compare __comp) 
+{
+  while (true) {
+    while (__comp(*__first, __pivot))
+      ++__first;
+    --__last;
+    while (__comp(__pivot, *__last))
+      --__last;
+    if (!(__first < __last))
+      return __first;
+    iter_swap(__first, __last);
+    ++__first;
+  }
+}
+
+// sort() and its auxiliary functions. 
+
+# define  __stl_threshold  16
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __unguarded_linear_insert(_RandomAccessIter __last, _Tp __val, 
+                               _Compare __comp) {
+  _RandomAccessIter __next = __last;
+  --__next;  
+  while (__comp(__val, *__next)) {
+    *__last = *__next;
+    __last = __next;
+    --__next;
+  }
+  *__last = __val;
+}
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+inline void __linear_insert(_RandomAccessIter __first, 
+                            _RandomAccessIter __last, _Tp __val, _Compare __comp) {		
+  //*TY 12/26/1998 - added __val as a paramter
+  //  _Tp __val = *__last;		    //*TY 12/26/1998 - __val supplied by caller
+  if (__comp(__val, *__first)) {
+    copy_backward(__first, __last, __last + 1);
+    *__first = __val;
+  }
+  else
+    __unguarded_linear_insert(__last, __val, __comp);
+}
+
+template <class _RandomAccessIter, class _Compare>
+void __insertion_sort(_RandomAccessIter __first,
+                      _RandomAccessIter __last, _Compare __comp) {
+  if (__first == __last) return;
+  for (_RandomAccessIter __i = __first + 1; __i != __last; ++__i)
+    __linear_insert(__first, __i, *__i, __comp);	//*TY 12/26/1998 - supply *__i as __val
+}
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __unguarded_insertion_sort_aux(_RandomAccessIter __first, 
+                                    _RandomAccessIter __last,
+                                    _Tp*, _Compare __comp) {
+  for (_RandomAccessIter __i = __first; __i != __last; ++__i)
+    __unguarded_linear_insert(__i, _Tp(*__i), __comp);
+}
+
+template <class _RandomAccessIter, class _Compare>
+inline void __unguarded_insertion_sort(_RandomAccessIter __first, 
+                                       _RandomAccessIter __last,
+                                       _Compare __comp) {
+  __unguarded_insertion_sort_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);
+}
+
+template <class _RandomAccessIter, class _Compare>
+void __final_insertion_sort(_RandomAccessIter __first, 
+                            _RandomAccessIter __last, _Compare __comp) {
+  if (__last - __first > __stl_threshold) {
+    __insertion_sort(__first, __first + __stl_threshold, __comp);
+    __unguarded_insertion_sort(__first + __stl_threshold, __last, __comp);
+  }
+  else
+    __insertion_sort(__first, __last, __comp);
+}
+
+template <class _RandomAccessIter, class _Tp, class _Size, class _Compare>
+void __introsort_loop(_RandomAccessIter __first,
+                      _RandomAccessIter __last, _Tp*,
+                      _Size __depth_limit, _Compare __comp)
+{
+  while (__last - __first > __stl_threshold) {
+    if (__depth_limit == 0) {
+      partial_sort(__first, __last, __last, __comp);
+      return;
+    }
+    --__depth_limit;
+    _RandomAccessIter __cut =
+      __unguarded_partition(__first, __last,
+                            _Tp(__median(*__first,
+                                         *(__first + (__last - __first)/2),
+                                         *(__last - 1), __comp)),
+       __comp);
+    __introsort_loop(__cut, __last, (_Tp*) 0, __depth_limit, __comp);
+    __last = __cut;
+  }
+}
+
+template <class _RandomAccessIter>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first != __last) {
+    __introsort_loop(__first, __last,
+                     _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+                     __lg(__last - __first) * 2, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)) );
+    __final_insertion_sort(__first, __last, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+  }
+}
+
+template <class _RandomAccessIter, class _Compare>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first != __last) {
+    __introsort_loop(__first, __last,
+                     _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+                     __lg(__last - __first) * 2,
+                     __comp);
+    __final_insertion_sort(__first, __last, __comp);
+  }
+}
+
+// stable_sort() and its auxiliary functions.
+
+template <class _RandomAccessIter, class _Compare>
+void __inplace_stable_sort(_RandomAccessIter __first,
+                           _RandomAccessIter __last, _Compare __comp) {
+  if (__last - __first < 15) {
+    __insertion_sort(__first, __last, __comp);
+    return;
+  }
+  _RandomAccessIter __middle = __first + (__last - __first) / 2;
+  __inplace_stable_sort(__first, __middle, __comp);
+  __inplace_stable_sort(__middle, __last, __comp);
+  __merge_without_buffer(__first, __middle, __last,
+                         __middle - __first,
+                         __last - __middle,
+                         __comp);
+}
+
+template <class _RandomAccessIter1, class _RandomAccessIter2,
+          class _Distance, class _Compare>
+void __merge_sort_loop(_RandomAccessIter1 __first,
+                       _RandomAccessIter1 __last, 
+                       _RandomAccessIter2 __result, _Distance __step_size,
+                       _Compare __comp) {
+  _Distance __two_step = 2 * __step_size;
+
+  while (__last - __first >= __two_step) {
+    __result = merge(__first, __first + __step_size,
+                     __first + __step_size, __first + __two_step,
+                     __result,
+                     __comp);
+    __first += __two_step;
+  }
+  __step_size = (min) (_Distance(__last - __first), __step_size);
+
+  merge(__first, __first + __step_size,
+        __first + __step_size, __last,
+        __result,
+        __comp);
+}
+
+const int __stl_chunk_size = 7;
+        
+template <class _RandomAccessIter, class _Distance, class _Compare>
+void __chunk_insertion_sort(_RandomAccessIter __first, 
+                            _RandomAccessIter __last,
+                            _Distance __chunk_size, _Compare __comp)
+{
+  while (__last - __first >= __chunk_size) {
+    __insertion_sort(__first, __first + __chunk_size, __comp);
+    __first += __chunk_size;
+  }
+  __insertion_sort(__first, __last, __comp);
+}
+
+template <class _RandomAccessIter, class _Pointer, class _Distance,
+          class _Compare>
+void __merge_sort_with_buffer(_RandomAccessIter __first, 
+                              _RandomAccessIter __last, _Pointer __buffer,
+                              _Distance*, _Compare __comp) {
+  _Distance __len = __last - __first;
+  _Pointer __buffer_last = __buffer + __len;
+
+  _Distance __step_size = __stl_chunk_size;
+  __chunk_insertion_sort(__first, __last, __step_size, __comp);
+
+  while (__step_size < __len) {
+    __merge_sort_loop(__first, __last, __buffer, __step_size, __comp);
+    __step_size *= 2;
+    __merge_sort_loop(__buffer, __buffer_last, __first, __step_size, __comp);
+    __step_size *= 2;
+  }
+}
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+          class _Distance>
+_BidirectionalIter1 __rotate_adaptive(_BidirectionalIter1 __first,
+                                      _BidirectionalIter1 __middle,
+                                      _BidirectionalIter1 __last,
+                                      _Distance __len1, _Distance __len2,
+                                      _BidirectionalIter2 __buffer,
+                                      _Distance __buffer_size) {
+  if (__len1 > __len2 && __len2 <= __buffer_size) {
+    _BidirectionalIter2 __buffer_end = copy(__middle, __last, __buffer);
+    copy_backward(__first, __middle, __last);
+    return copy(__buffer, __buffer_end, __first);
+  }
+  else if (__len1 <= __buffer_size) {
+    _BidirectionalIter2 __buffer_end = copy(__first, __middle, __buffer);
+    copy(__middle, __last, __first);
+    return copy_backward(__buffer, __buffer_end, __last);
+  }
+  else
+    return rotate(__first, __middle, __last);
+}
+
+template <class _BidirectionalIter, class _Distance, class _Pointer,
+          class _Compare>
+void __merge_adaptive(_BidirectionalIter __first, 
+                      _BidirectionalIter __middle, 
+                      _BidirectionalIter __last,
+                      _Distance __len1, _Distance __len2,
+                      _Pointer __buffer, _Distance __buffer_size,
+                      _Compare __comp) {
+  if (__len1 <= __len2 && __len1 <= __buffer_size) {
+    _Pointer __buffer_end = copy(__first, __middle, __buffer);
+    merge(__buffer, __buffer_end, __middle, __last, __first, __comp);
+  }
+  else if (__len2 <= __buffer_size) {
+    _Pointer __buffer_end = copy(__middle, __last, __buffer);
+    __merge_backward(__first, __middle, __buffer, __buffer_end, __last,
+                     __comp);
+  }
+  else {
+    _BidirectionalIter __first_cut = __first;
+    _BidirectionalIter __second_cut = __middle;
+    _Distance __len11 = 0;
+    _Distance __len22 = 0;
+    if (__len1 > __len2) {
+      __len11 = __len1 / 2;
+      advance(__first_cut, __len11);
+      __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
+      __len22 += distance(__middle, __second_cut);   
+    }
+    else {
+      __len22 = __len2 / 2;
+      advance(__second_cut, __len22);
+      __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
+      __len11 += distance(__first, __first_cut);
+    }
+    _BidirectionalIter __new_middle =
+      __rotate_adaptive(__first_cut, __middle, __second_cut, __len1 - __len11,
+                        __len22, __buffer, __buffer_size);
+    __merge_adaptive(__first, __first_cut, __new_middle, __len11,
+                     __len22, __buffer, __buffer_size, __comp);
+    __merge_adaptive(__new_middle, __second_cut, __last, __len1 - __len11,
+                     __len2 - __len22, __buffer, __buffer_size, __comp);
+  }
+}
+
+template <class _RandomAccessIter, class _Pointer, class _Distance, 
+          class _Compare>
+void __stable_sort_adaptive(_RandomAccessIter __first, 
+                            _RandomAccessIter __last, _Pointer __buffer,
+                            _Distance __buffer_size, _Compare __comp) {
+  _Distance __len = (__last - __first + 1) / 2;
+  _RandomAccessIter __middle = __first + __len;
+  if (__len > __buffer_size) {
+    __stable_sort_adaptive(__first, __middle, __buffer, __buffer_size, 
+                           __comp);
+    __stable_sort_adaptive(__middle, __last, __buffer, __buffer_size, 
+                           __comp);
+  }
+  else {
+    __merge_sort_with_buffer(__first, __middle, __buffer, (_Distance*)0,
+                               __comp);
+    __merge_sort_with_buffer(__middle, __last, __buffer, (_Distance*)0,
+                               __comp);
+  }
+  __merge_adaptive(__first, __middle, __last, _Distance(__middle - __first), 
+                   _Distance(__last - __middle), __buffer, __buffer_size,
+                   __comp);
+}
+
+template <class _RandomAccessIter, class _Tp, class _Distance, class _Compare>
+void __stable_sort_aux(_RandomAccessIter __first,
+			      _RandomAccessIter __last, _Tp*, _Distance*,
+			      _Compare __comp) {
+  _Temporary_buffer<_RandomAccessIter, _Tp> buf(__first, __last);
+  if (buf.begin() == 0)
+    __inplace_stable_sort(__first, __last, __comp);
+  else 
+    __stable_sort_adaptive(__first, __last, buf.begin(),
+                           _Distance(buf.size()),
+                           __comp);
+}
+
+template <class _RandomAccessIter>
+void stable_sort(_RandomAccessIter __first,
+		 _RandomAccessIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  __stable_sort_aux(__first, __last,
+                    _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+                    _STLP_DISTANCE_TYPE(__first, _RandomAccessIter),
+                    __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+}
+
+template <class _RandomAccessIter, class _Compare>
+void stable_sort(_RandomAccessIter __first,
+		 _RandomAccessIter __last, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  __stable_sort_aux(__first, __last,
+                    _STLP_VALUE_TYPE(__first, _RandomAccessIter),
+                    _STLP_DISTANCE_TYPE(__first, _RandomAccessIter), 
+                    __comp);
+}
+
+// partial_sort, partial_sort_copy, and auxiliary functions.
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __partial_sort(_RandomAccessIter __first, _RandomAccessIter __middle,
+                    _RandomAccessIter __last, _Tp*, _Compare __comp) {
+  make_heap(__first, __middle, __comp);
+  for (_RandomAccessIter __i = __middle; __i < __last; ++__i)
+    if (__comp(*__i, *__first))
+      __pop_heap(__first, __middle, __i, _Tp(*__i), __comp,
+                 _STLP_DISTANCE_TYPE(__first, _RandomAccessIter));
+  sort_heap(__first, __middle, __comp);
+}
+
+
+template <class _RandomAccessIter>
+void 
+partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, _RandomAccessIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+  _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+  __partial_sort(__first, __middle, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), 
+                 __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+}
+
+template <class _RandomAccessIter, class _Compare>
+void partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle,
+                  _RandomAccessIter __last, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+  _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+  __partial_sort(__first, __middle, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);
+}
+
+template <class _InputIter, class _RandomAccessIter, class _Compare,
+          class _Distance, class _Tp>
+_RandomAccessIter __partial_sort_copy(_InputIter __first,
+                                         _InputIter __last,
+                                         _RandomAccessIter __result_first,
+                                         _RandomAccessIter __result_last,
+                                         _Compare __comp, _Distance*, _Tp*) {
+  if (__result_first == __result_last) return __result_last;
+  _RandomAccessIter __result_real_last = __result_first;
+  while(__first != __last && __result_real_last != __result_last) {
+    *__result_real_last = *__first;
+    ++__result_real_last;
+    ++__first;
+  }
+  make_heap(__result_first, __result_real_last, __comp);
+  while (__first != __last) {
+    if (__comp(*__first, *__result_first))
+      __adjust_heap(__result_first, _Distance(0),
+                    _Distance(__result_real_last - __result_first),
+                    _Tp(*__first),
+                    __comp);
+    ++__first;
+  }
+  sort_heap(__result_first, __result_real_last, __comp);
+  return __result_real_last;
+}
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+                  _RandomAccessIter __result_first, _RandomAccessIter __result_last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _STLP_DEBUG_CHECK(__check_range(__result_first, __result_last))
+  return __partial_sort_copy(__first, __last, __result_first, __result_last, 
+                             __less(_STLP_VALUE_TYPE(__first, _InputIter)),
+                             _STLP_DISTANCE_TYPE(__result_first, _RandomAccessIter),
+                             _STLP_VALUE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _RandomAccessIter, class _Compare>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+                  _RandomAccessIter __result_first,
+                  _RandomAccessIter __result_last, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _STLP_DEBUG_CHECK(__check_range(__result_first, __result_last))
+  return __partial_sort_copy(__first, __last, __result_first, __result_last,
+                             __comp,
+                             _STLP_DISTANCE_TYPE(__result_first, _RandomAccessIter),
+                             _STLP_VALUE_TYPE(__first, _InputIter));
+}
+
+// nth_element() and its auxiliary functions.  
+
+template <class _RandomAccessIter, class _Tp, class _Compare>
+void __nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+                   _RandomAccessIter __last, _Tp*, _Compare __comp) {
+  while (__last - __first > 3) {
+    _RandomAccessIter __cut =
+      __unguarded_partition(__first, __last,
+                            _Tp(__median(*__first,
+                                         *(__first + (__last - __first)/2), 
+                                         *(__last - 1),
+                                         __comp)),
+                            __comp);
+    if (__cut <= __nth)
+      __first = __cut;
+    else 
+      __last = __cut;
+  }
+  __insertion_sort(__first, __last, __comp);
+}
+
+
+template <class _RandomAccessIter>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+                 _RandomAccessIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __nth))
+  _STLP_DEBUG_CHECK(__check_range(__nth, __last))
+  __nth_element(__first, __nth, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), 
+                __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)));
+}
+
+template <class _RandomAccessIter, class _Compare>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+                 _RandomAccessIter __last, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __nth))
+  _STLP_DEBUG_CHECK(__check_range(__nth, __last))
+  __nth_element(__first, __nth, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIter), __comp);
+}
+
+// Binary search (lower_bound, upper_bound, equal_range, binary_search).
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
+                           const _Tp& __val, _Compare __comp, _Distance*)
+{
+  _Distance __len = distance(__first, __last);
+  _Distance __half;
+
+  while (__len > 0) {
+    __half = __len >> 1;
+    _ForwardIter __middle = __first;
+    advance(__middle, __half);
+    if (__comp(__val, *__middle))
+      __len = __half;
+    else {
+      __first = __middle;
+      ++__first;
+      __len = __len - __half - 1;
+    }
+  }
+  return __first;
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+pair<_ForwardIter, _ForwardIter>
+__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
+              _Compare __comp, _Distance*)
+{
+  _Distance __len = distance(__first, __last);
+  _Distance __half;
+
+  while (__len > 0) {
+    __half = __len >> 1;
+    _ForwardIter __middle = __first;
+    advance(__middle, __half);
+    if (__comp(*__middle, __val)) {
+      __first = __middle;
+      ++__first;
+      __len = __len - __half - 1;
+    }
+    else if (__comp(__val, *__middle))
+      __len = __half;
+    else {
+      _ForwardIter __left = lower_bound(__first, __middle, __val, __comp);
+      advance(__first, __len);
+      _ForwardIter __right = upper_bound(++__middle, __first, __val, __comp);
+      return pair<_ForwardIter, _ForwardIter>(__left, __right);
+    }
+  }
+  return pair<_ForwardIter, _ForwardIter>(__first, __first);
+}           
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+                  _InputIter2 __first2, _InputIter2 __last2,
+                  _OutputIter __result) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2) {
+    if (*__first2 < *__first1) {
+      *__result = *__first2;
+      ++__first2;
+    }
+    else {
+      *__result = *__first1;
+      ++__first1;
+    }
+    ++__result;
+  }
+  return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+                  _InputIter2 __first2, _InputIter2 __last2,
+                  _OutputIter __result, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2) {
+    if (__comp(*__first2, *__first1)) {
+      *__result = *__first2;
+      ++__first2;
+    }
+    else {
+      *__result = *__first1;
+      ++__first1;
+    }
+    ++__result;
+  }
+  return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _BidirectionalIter, class _Distance, class _Compare>
+void __merge_without_buffer(_BidirectionalIter __first,
+                            _BidirectionalIter __middle,
+                            _BidirectionalIter __last,
+                            _Distance __len1, _Distance __len2,
+                            _Compare __comp) {
+  if (__len1 == 0 || __len2 == 0)
+    return;
+  if (__len1 + __len2 == 2) {
+    if (__comp(*__middle, *__first))
+      iter_swap(__first, __middle);
+    return;
+  }
+  _BidirectionalIter __first_cut = __first;
+  _BidirectionalIter __second_cut = __middle;
+  _Distance __len11 = 0;
+  _Distance __len22 = 0;
+  if (__len1 > __len2) {
+    __len11 = __len1 / 2;
+    advance(__first_cut, __len11);
+    __second_cut = lower_bound(__middle, __last, *__first_cut, __comp);
+    __len22 += distance(__middle, __second_cut);
+  }
+  else {
+    __len22 = __len2 / 2;
+    advance(__second_cut, __len22);
+    __first_cut = upper_bound(__first, __middle, *__second_cut, __comp);
+    __len11 +=distance(__first, __first_cut);
+  }
+  _BidirectionalIter __new_middle
+    = rotate(__first_cut, __middle, __second_cut);
+  __merge_without_buffer(__first, __first_cut, __new_middle, __len11, __len22,
+                         __comp);
+  __merge_without_buffer(__new_middle, __second_cut, __last, __len1 - __len11,
+                         __len2 - __len22, __comp);
+}
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+          class _BidirectionalIter3, class _Compare>
+_BidirectionalIter3 __merge_backward(_BidirectionalIter1 __first1,
+                                     _BidirectionalIter1 __last1,
+                                     _BidirectionalIter2 __first2,
+                                     _BidirectionalIter2 __last2,
+                                     _BidirectionalIter3 __result,
+                                     _Compare __comp) {
+  if (__first1 == __last1)
+    return copy_backward(__first2, __last2, __result);
+  if (__first2 == __last2)
+    return copy_backward(__first1, __last1, __result);
+  --__last1;
+  --__last2;
+  while (true) {
+    if (__comp(*__last2, *__last1)) {
+      *--__result = *__last1;
+      if (__first1 == __last1)
+        return copy_backward(__first2, ++__last2, __result);
+      --__last1;
+    }
+    else {
+      *--__result = *__last2;
+      if (__first2 == __last2)
+        return copy_backward(__first1, ++__last1, __result);
+      --__last2;
+    }
+  }
+}
+
+template <class _BidirectionalIter, class _Tp, 
+          class _Distance, class _Compare>
+inline void __inplace_merge_aux(_BidirectionalIter __first,
+                                _BidirectionalIter __middle,
+                                _BidirectionalIter __last, _Tp*, _Distance*,
+                                _Compare __comp) {
+  _Distance __len1 = distance(__first, __middle);
+  _Distance __len2 = distance(__middle, __last);
+
+  _Temporary_buffer<_BidirectionalIter, _Tp> __buf(__first, __last);
+  if (__buf.begin() == 0)
+    __merge_without_buffer(__first, __middle, __last, __len1, __len2, __comp);
+  else
+    __merge_adaptive(__first, __middle, __last, __len1, __len2,
+                     __buf.begin(), _Distance(__buf.size()),
+                     __comp);
+}
+
+template <class _BidirectionalIter>
+void inplace_merge(_BidirectionalIter __first,
+		   _BidirectionalIter __middle,
+		   _BidirectionalIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+  _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+  if (__first == __middle || __middle == __last)
+    return;
+  __inplace_merge_aux(__first, __middle, __last,
+                      _STLP_VALUE_TYPE(__first, _BidirectionalIter), _STLP_DISTANCE_TYPE(__first, _BidirectionalIter),
+                      __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));
+}
+
+template <class _BidirectionalIter, class _Compare>
+void inplace_merge(_BidirectionalIter __first,
+		   _BidirectionalIter __middle,
+		   _BidirectionalIter __last, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __middle))
+  _STLP_DEBUG_CHECK(__check_range(__middle, __last))
+  if (__first == __middle || __middle == __last)
+    return;
+  __inplace_merge_aux(__first, __middle, __last,
+                      _STLP_VALUE_TYPE(__first, _BidirectionalIter), _STLP_DISTANCE_TYPE(__first, _BidirectionalIter),
+                      __comp);
+}
+
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool __includes(_InputIter1 __first1, _InputIter1 __last1,
+                _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2)
+    if (__comp(*__first2, *__first1))
+      return false;
+    else if(__comp(*__first1, *__first2)) 
+      ++__first1;
+    else
+      ++__first1, ++__first2;
+
+  return __first2 == __last2;
+}
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+              _InputIter2 __first2, _InputIter2 __last2, _Compare __comp) {
+  return __includes(__first1, __last1, __first2, __last2, __comp);
+}
+
+template <class _InputIter1, class _InputIter2>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+              _InputIter2 __first2, _InputIter2 __last2) {
+  return __includes(__first1, __last1, __first2, __last2, __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter __set_union(_InputIter1 __first1, _InputIter1 __last1,
+                        _InputIter2 __first2, _InputIter2 __last2,
+                        _OutputIter __result, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2) {
+    if (__comp(*__first1, *__first2)) {
+      *__result = *__first1;
+      ++__first1;
+    }
+    else if (__comp(*__first2, *__first1)) {
+      *__result = *__first2;
+      ++__first2;
+    }
+    else {
+      *__result = *__first1;
+      ++__first1;
+      ++__first2;
+    }
+    ++__result;
+  }
+  return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+                      _InputIter2 __first2, _InputIter2 __last2,
+                      _OutputIter __result) {
+  return __set_union(__first1, __last1, __first2, __last2, __result, __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));  
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+                      _InputIter2 __first2, _InputIter2 __last2,
+                      _OutputIter __result, _Compare __comp) {
+  return __set_union(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter __set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+                               _InputIter2 __first2, _InputIter2 __last2,
+                               _OutputIter __result, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2)
+    if (__comp(*__first1, *__first2))
+      ++__first1;
+    else if (__comp(*__first2, *__first1))
+      ++__first2;
+    else {
+      *__result = *__first1;
+      ++__first1;
+      ++__first2;
+      ++__result;
+    }
+  return __result;
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2,
+                             _OutputIter __result) {
+  return __set_intersection(__first1, __last1, __first2, __last2, __result, __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));  
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2,
+                             _OutputIter __result, _Compare __comp) {
+  return __set_intersection(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, 
+          class _Compare>
+_OutputIter __set_difference(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2, 
+                             _OutputIter __result, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2)
+    if (__comp(*__first1, *__first2)) {
+      *__result = *__first1;
+      ++__first1;
+      ++__result;
+    }
+    else if (__comp(*__first2, *__first1))
+      ++__first2;
+    else {
+      ++__first1;
+      ++__first2;
+    }
+  return copy(__first1, __last1, __result);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+                           _InputIter2 __first2, _InputIter2 __last2,
+                           _OutputIter __result) {
+  return __set_difference(__first1, __last1, __first2, __last2, __result, 
+                          __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));  
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, 
+          class _Compare>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+                           _InputIter2 __first2, _InputIter2 __last2, 
+                           _OutputIter __result, _Compare __comp) {
+  return __set_difference(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, class _Compare>
+_OutputIter 
+__set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+                           _InputIter2 __first2, _InputIter2 __last2,
+                           _OutputIter __result, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  while (__first1 != __last1 && __first2 != __last2)
+    if (__comp(*__first1, *__first2)) {
+      *__result = *__first1;
+      ++__first1;
+      ++__result;
+    }
+    else if (__comp(*__first2, *__first1)) {
+      *__result = *__first2;
+      ++__first2;
+      ++__result;
+    }
+    else {
+      ++__first1;
+      ++__first2;
+    }
+  return copy(__first2, __last2, copy(__first1, __last1, __result));
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter 
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+                         _InputIter2 __first2, _InputIter2 __last2,
+                         _OutputIter __result) {
+  return __set_symmetric_difference(__first1, __last1, __first2, __last2, __result,
+                                    __less(_STLP_VALUE_TYPE(__first1, _InputIter1)));  
+}
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, class _Compare>
+_OutputIter 
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+                         _InputIter2 __first2, _InputIter2 __last2,
+                         _OutputIter __result,
+                         _Compare __comp) {
+  return __set_symmetric_difference(__first1, __last1, __first2, __last2, __result, __comp);
+}
+
+// min_element and max_element, with and without an explicitly supplied
+// comparison function.
+
+template <class _ForwardIter, class _Compare>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
+                            _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __first;
+  _ForwardIter __result = __first;
+  while (++__first != __last) 
+    if (__comp(*__result, *__first)) __result = __first;
+  return __result;
+}
+
+template <class _ForwardIter>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __first;
+  _ForwardIter __result = __first;
+  while (++__first != __last) 
+    if (*__result < *__first)
+      __result = __first;
+  return __result;
+}
+
+template <class _ForwardIter>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __first;
+  _ForwardIter __result = __first;
+  while (++__first != __last) 
+    if (*__first < *__result)
+      __result = __first;
+  return __result;
+}
+
+template <class _ForwardIter, class _Compare>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
+                            _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __first;
+  _ForwardIter __result = __first;
+  while (++__first != __last) 
+    if (__comp(*__first, *__result)) __result = __first;
+  return __result;
+}
+
+// next_permutation and prev_permutation, with and without an explicitly 
+// supplied comparison function.
+template <class _BidirectionalIter, class _Compare>
+bool __next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+                        _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last)
+    return false;
+  _BidirectionalIter __i = __first;
+  ++__i;
+  if (__i == __last)
+    return false;
+  __i = __last;
+  --__i;
+
+  for(;;) {
+    _BidirectionalIter __ii = __i;
+    --__i;
+    if (__comp(*__i, *__ii)) {
+      _BidirectionalIter __j = __last;
+      while (!__comp(*__i, *--__j))
+        {}
+      iter_swap(__i, __j);
+      reverse(__ii, __last);
+      return true;
+    }
+    if (__i == __first) {
+      reverse(__first, __last);
+      return false;
+    }
+  }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+    return 0;
+#endif
+}
+
+template <class _BidirectionalIter>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __next_permutation(__first, __last, __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));
+}
+
+template <class _BidirectionalIter, class _Compare>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+                      _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __next_permutation(__first, __last, __comp);
+}
+
+template <class _BidirectionalIter, class _Compare>
+bool __prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+                      _Compare __comp) {
+  if (__first == __last)
+    return false;
+  _BidirectionalIter __i = __first;
+  ++__i;
+  if (__i == __last)
+    return false;
+  __i = __last;
+  --__i;
+
+  for(;;) {
+    _BidirectionalIter __ii = __i;
+    --__i;
+    if (__comp(*__ii, *__i)) {
+      _BidirectionalIter __j = __last;
+      while (!__comp(*--__j, *__i))
+        {}
+      iter_swap(__i, __j);
+      reverse(__ii, __last);
+      return true;
+    }
+    if (__i == __first) {
+      reverse(__first, __last);
+      return false;
+    }
+  }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+    return 0;
+#endif
+}
+
+template <class _BidirectionalIter>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __prev_permutation(__first, __last, __less(_STLP_VALUE_TYPE(__first, _BidirectionalIter)));
+}
+
+template <class _BidirectionalIter, class _Compare>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+                      _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __prev_permutation(__first, __last, __comp);
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// is_heap, a predicate testing whether or not a range is
+// a heap.  This function is an extension, not part of the C++
+// standard.
+
+
+template <class _RandomAccessIter, class _Distance, class _StrictWeakOrdering>
+bool __is_heap(_RandomAccessIter __first, _StrictWeakOrdering __comp,
+               _Distance __n)
+{
+  _Distance __parent = 0;
+  for (_Distance __child = 1; __child < __n; ++__child) {
+    if (__comp(__first[__parent], __first[__child]))
+      return false;
+    if ((__child & 1) == 0)
+      ++__parent;
+  }
+  return true;
+}
+
+template <class _RandomAccessIter>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __is_heap(__first, __less(_STLP_VALUE_TYPE(__first, _RandomAccessIter)), __last - __first);
+}
+
+template <class _RandomAccessIter, class _StrictWeakOrdering>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
+	     _StrictWeakOrdering __comp)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __is_heap(__first, __comp, __last - __first);
+}
+
+
+template <class _ForwardIter, class _StrictWeakOrdering>
+bool __is_sorted(_ForwardIter __first, _ForwardIter __last,
+                 _StrictWeakOrdering __comp)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last)
+    return true;
+
+  _ForwardIter __next = __first;
+  for (++__next; __next != __last; __first = __next, ++__next) {
+    if (__comp(*__next, *__first))
+      return false;
+  }
+
+  return true;
+}
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+_STLP_END_NAMESPACE
+
+# undef __stl_threshold
+
+#endif /* _STLP_ALGO_C */
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_algo.h b/src/STLport/stl/_algo.h
new file mode 100644
index 0000000..c6e07cf
--- /dev/null
+++ b/src/STLport/stl/_algo.h
@@ -0,0 +1,740 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ALGO_H
+#define _STLP_INTERNAL_ALGO_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_TEMPBUF_H
+#  include <stl/_tempbuf.h>
+# endif
+
+# ifndef _STLP_INTERNAL_HEAP_H
+#  include <stl/_heap.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+#  include <stl/_function_base.h>
+# endif
+
+# ifdef __SUNPRO_CC
+// remove() conflict
+#  include <cstdio>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// for_each.  Apply a function to every element of a range.
+template <class _InputIter, class _Function>
+_STLP_INLINE_LOOP _Function 
+for_each(_InputIter __first, _InputIter __last, _Function __f) {
+  for ( ; __first != __last; ++__first)
+    __f(*__first);
+  return __f;
+}
+
+// count_if
+template <class _InputIter, class _Predicate>
+_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
+count_if(_InputIter __first, _InputIter __last, _Predicate __pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+_STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
+  for ( ; __first != __last; ++__first)
+    if (__pred(*__first))
+      ++__n;
+  return __n;
+}
+
+// adjacent_find.
+
+template <class _ForwardIter, class _BinaryPredicate>
+_STLP_INLINE_LOOP _ForwardIter 
+adjacent_find(_ForwardIter __first, _ForwardIter __last,
+              _BinaryPredicate __binary_pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last)
+    return __last;
+  _ForwardIter __next = __first;
+  while(++__next != __last) {
+    if (__binary_pred(*__first, *__next))
+      return __first;
+    __first = __next;
+  }
+  return __last;
+}
+
+template <class _ForwardIter>
+_STLP_INLINE_LOOP _ForwardIter 
+adjacent_find(_ForwardIter __first, _ForwardIter __last) {
+  return adjacent_find(__first, __last,
+		       __equal_to(_STLP_VALUE_TYPE(__first, _ForwardIter)));
+}
+
+# ifndef _STLP_NO_ANACHRONISMS
+template <class _InputIter, class _Tp, class _Size>
+_STLP_INLINE_LOOP void 
+count(_InputIter __first, _InputIter __last, const _Tp& __val, _Size& __n) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+    for ( ; __first != __last; ++__first)
+      if (*__first == __val)
+        ++__n;
+}
+
+template <class _InputIter, class _Predicate, class _Size>
+_STLP_INLINE_LOOP void 
+count_if(_InputIter __first, _InputIter __last, _Predicate __pred, _Size& __n) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    if (__pred(*__first))
+      ++__n;
+}
+# endif
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+                     _ForwardIter2 __first2, _ForwardIter2 __last2);
+
+// search_n.  Search for __count consecutive copies of __val.
+template <class _ForwardIter, class _Integer, class _Tp>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+                      _Integer __count, const _Tp& __val);
+template <class _ForwardIter, class _Integer, class _Tp, class _BinaryPred>
+_ForwardIter search_n(_ForwardIter __first, _ForwardIter __last,
+                      _Integer __count, const _Tp& __val, _BinaryPred __binary_pred);
+
+template <class _InputIter, class _ForwardIter>
+inline _InputIter find_first_of(_InputIter __first1, _InputIter __last1,
+                                _ForwardIter __first2, _ForwardIter __last2) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  return __find_first_of(__first1, __last1, __first2, __last2,__equal_to(_STLP_VALUE_TYPE(__first1, _InputIter)));
+}
+
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+inline _InputIter 
+find_first_of(_InputIter __first1, _InputIter __last1,
+              _ForwardIter __first2, _ForwardIter __last2,_BinaryPredicate __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+  return __find_first_of(__first1, __last1, __first2, __last2,__comp);
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+_ForwardIter1 
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
+         _ForwardIter2 __first2, _ForwardIter2 __last2);
+
+// swap_ranges
+template <class _ForwardIter1, class _ForwardIter2>
+_STLP_INLINE_LOOP _ForwardIter2 
+swap_ranges(_ForwardIter1 __first1, _ForwardIter1 __last1, _ForwardIter2 __first2) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  for ( ; __first1 != __last1; ++__first1, ++__first2)
+    iter_swap(__first1, __first2);
+  return __first2;
+}
+
+// transform
+template <class _InputIter, class _OutputIter, class _UnaryOperation>
+_STLP_INLINE_LOOP _OutputIter 
+transform(_InputIter __first, _InputIter __last, _OutputIter __result, _UnaryOperation __opr) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first, ++__result)
+    *__result = __opr(*__first);
+  return __result;
+}
+template <class _InputIter1, class _InputIter2, class _OutputIter, class _BinaryOperation>
+_STLP_INLINE_LOOP _OutputIter 
+transform(_InputIter1 __first1, _InputIter1 __last1, 
+          _InputIter2 __first2, _OutputIter __result,_BinaryOperation __binary_op) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  for ( ; __first1 != __last1; ++__first1, ++__first2, ++__result)
+    *__result = __binary_op(*__first1, *__first2);
+  return __result;
+}
+
+// replace_if, replace_copy, replace_copy_if
+
+template <class _ForwardIter, class _Predicate, class _Tp>
+_STLP_INLINE_LOOP void 
+replace_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred, const _Tp& __new_value) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    if (__pred(*__first))
+      *__first = __new_value;
+}
+
+template <class _InputIter, class _OutputIter, class _Tp>
+_STLP_INLINE_LOOP  _OutputIter 
+replace_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+             const _Tp& __old_value, const _Tp& __new_value) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first, ++__result)
+    *__result = *__first == __old_value ? __new_value : *__first;
+  return __result;
+}
+
+template <class _Iterator, class _OutputIter, class _Predicate, class _Tp>
+_STLP_INLINE_LOOP _OutputIter 
+replace_copy_if(_Iterator __first, _Iterator __last,
+                _OutputIter __result,
+                _Predicate __pred, const _Tp& __new_value) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first, ++__result)
+    *__result = __pred(*__first) ? __new_value : *__first;
+  return __result;
+}
+
+// generate and generate_n
+
+template <class _ForwardIter, class _Generator>
+_STLP_INLINE_LOOP void 
+generate(_ForwardIter __first, _ForwardIter __last, _Generator __gen) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    *__first = __gen();
+}
+
+template <class _OutputIter, class _Size, class _Generator>
+_STLP_INLINE_LOOP _OutputIter 
+generate_n(_OutputIter __first, _Size __n, _Generator __gen) {
+  for ( ; __n > 0; --__n, ++__first)
+    *__first = __gen();
+  return __first;
+}
+
+// remove, remove_if, remove_copy, remove_copy_if
+
+template <class _InputIter, class _OutputIter, class _Tp>
+_STLP_INLINE_LOOP _OutputIter 
+remove_copy(_InputIter __first, _InputIter __last,_OutputIter __result, const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    if (!(*__first == __val)) {
+      *__result = *__first;
+      ++__result;
+    }
+  return __result;
+}
+
+template <class _InputIter, class _OutputIter, class _Predicate>
+_STLP_INLINE_LOOP _OutputIter 
+remove_copy_if(_InputIter __first, _InputIter __last, _OutputIter __result, _Predicate __pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    if (!__pred(*__first)) {
+      *__result = *__first;
+      ++__result;
+    }
+  return __result;
+}
+
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP _ForwardIter 
+remove(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  __first = find(__first, __last, __val);
+  if (__first == __last)
+    return __first;
+  else { 
+    _ForwardIter __next = __first;
+    return remove_copy(++__next, __last, __first, __val);
+  }
+}
+
+template <class _ForwardIter, class _Predicate>
+_STLP_INLINE_LOOP _ForwardIter 
+remove_if(_ForwardIter __first, _ForwardIter __last, _Predicate __pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  __first = find_if(__first, __last, __pred);
+  if ( __first == __last )
+    return __first;
+  else {
+    _ForwardIter __next = __first;
+    return remove_copy_if(++__next, __last, __first, __pred);
+  }
+}
+
+// unique and unique_copy
+template <class _InputIter, class _OutputIter>
+_OutputIter unique_copy(_InputIter __first, _InputIter __last, _OutputIter __result);
+
+template <class _InputIter, class _OutputIter, class _BinaryPredicate>
+_OutputIter unique_copy(_InputIter __first, _InputIter __last,_OutputIter __result,
+                        _BinaryPredicate __binary_pred);
+
+template <class _ForwardIter>
+inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last) {
+  __first = adjacent_find(__first, __last);
+  return unique_copy(__first, __last, __first);
+}
+
+template <class _ForwardIter, class _BinaryPredicate>
+inline _ForwardIter unique(_ForwardIter __first, _ForwardIter __last,
+                    _BinaryPredicate __binary_pred) {
+  __first = adjacent_find(__first, __last, __binary_pred);
+  return unique_copy(__first, __last, __first, __binary_pred);
+}
+
+// reverse and reverse_copy, and their auxiliary functions
+
+template <class _BidirectionalIter>
+_STLP_INLINE_LOOP void 
+__reverse(_BidirectionalIter __first, _BidirectionalIter __last, const bidirectional_iterator_tag &) {
+  for(; __first != __last && __first != --__last; ++__first)
+    iter_swap(__first,__last);
+}
+
+
+template <class _RandomAccessIter>
+_STLP_INLINE_LOOP void 
+__reverse(_RandomAccessIter __first, _RandomAccessIter __last, const random_access_iterator_tag &) {
+  for (; __first < __last; ++__first) iter_swap(__first, --__last);
+}
+
+template <class _BidirectionalIter>
+inline void 
+reverse(_BidirectionalIter __first, _BidirectionalIter __last) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  __reverse(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _BidirectionalIter));
+}
+
+template <class _BidirectionalIter, class _OutputIter>
+_STLP_INLINE_LOOP
+_OutputIter reverse_copy(_BidirectionalIter __first,
+                            _BidirectionalIter __last,
+                            _OutputIter __result) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  while (__first != __last) {
+    --__last;
+    *__result = *__last;
+    ++__result;
+  }
+  return __result;
+}
+
+// rotate and rotate_copy, and their auxiliary functions
+
+template <class _EuclideanRingElement>
+_STLP_INLINE_LOOP
+_EuclideanRingElement __gcd(_EuclideanRingElement __m,
+                            _EuclideanRingElement __n)
+{
+  while (__n != 0) {
+    _EuclideanRingElement __t = __m % __n;
+    __m = __n;
+    __n = __t;
+  }
+  return __m;
+}
+
+template <class _ForwardIter>
+_ForwardIter 
+rotate(_ForwardIter __first, _ForwardIter __middle, _ForwardIter __last);
+
+template <class _ForwardIter, class _OutputIter>
+inline _OutputIter rotate_copy(_ForwardIter __first, _ForwardIter __middle,
+                               _ForwardIter __last, _OutputIter __result) {
+  return copy(__first, __middle, copy(__middle, __last, __result));
+}
+
+// random_shuffle
+
+template <class _RandomAccessIter>
+void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _RandomNumberGenerator>
+void random_shuffle(_RandomAccessIter __first, _RandomAccessIter __last,
+                    _RandomNumberGenerator& __rand);
+
+# ifndef _STLP_NO_EXTENSIONS
+// random_sample and random_sample_n (extensions, not part of the standard).
+
+template <class _ForwardIter, class _OutputIter, class _Distance>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+                            _OutputIter __out, const _Distance __n);
+
+template <class _ForwardIter, class _OutputIter, class _Distance,
+          class _RandomNumberGenerator>
+_OutputIter random_sample_n(_ForwardIter __first, _ForwardIter __last,
+                            _OutputIter __out, const _Distance __n,
+                            _RandomNumberGenerator& __rand);
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+              _RandomAccessIter __out_first, _RandomAccessIter __out_last);
+
+template <class _InputIter, class _RandomAccessIter, 
+          class _RandomNumberGenerator>
+_RandomAccessIter
+random_sample(_InputIter __first, _InputIter __last,
+              _RandomAccessIter __out_first, _RandomAccessIter __out_last,
+              _RandomNumberGenerator& __rand);
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+// partition, stable_partition, and their auxiliary functions
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter partition(_ForwardIter __first, _ForwardIter __last, _Predicate   __pred);
+
+
+template <class _ForwardIter, class _Predicate>
+_ForwardIter 
+stable_partition(_ForwardIter __first, _ForwardIter __last, _Predicate __pred);
+
+// sort() and its auxiliary functions. 
+
+template <class _Size>
+inline _Size __lg(_Size __n) {
+  _Size __k;
+  for (__k = 0; __n != 1; __n >>= 1) ++__k;
+  return __k;
+}
+
+template <class _RandomAccessIter>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last);
+template <class _RandomAccessIter, class _Compare>
+void sort(_RandomAccessIter __first, _RandomAccessIter __last, _Compare __comp);
+
+// stable_sort() and its auxiliary functions.
+template <class _RandomAccessIter>
+void stable_sort(_RandomAccessIter __first,
+		 _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _Compare>
+void stable_sort(_RandomAccessIter __first,
+		 _RandomAccessIter __last, _Compare __comp);
+
+// partial_sort, partial_sort_copy, and auxiliary functions.
+
+template <class _RandomAccessIter>
+void 
+partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _Compare>
+void 
+partial_sort(_RandomAccessIter __first,_RandomAccessIter __middle, 
+             _RandomAccessIter __last, _Compare __comp);
+
+template <class _InputIter, class _RandomAccessIter>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+                  _RandomAccessIter __result_first, _RandomAccessIter __result_last);
+
+template <class _InputIter, class _RandomAccessIter, class _Compare>
+_RandomAccessIter
+partial_sort_copy(_InputIter __first, _InputIter __last,
+                  _RandomAccessIter __result_first,
+                  _RandomAccessIter __result_last, _Compare __comp);
+
+// nth_element() and its auxiliary functions.  
+
+template <class _RandomAccessIter>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+                 _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _Compare>
+void nth_element(_RandomAccessIter __first, _RandomAccessIter __nth,
+                 _RandomAccessIter __last, _Compare __comp);
+
+// auxiliary class for lower_bound, etc.
+template <class _T1, class _T2>
+struct __less_2 {
+  bool operator() (const _T1& __x, const _T2 __y) const { return __x < __y ; } 
+};
+
+template <class _T1, class _T2>
+__less_2<_T1,_T2> __less2(_T1*, _T2* ) { return __less_2<_T1, _T2>(); }
+
+#ifdef _STLP_FUNCTION_PARTIAL_ORDER
+template <class _Tp>
+less<_Tp> __less2(_Tp*, _Tp* ) { return less<_Tp>(); }
+#endif
+
+// Binary search (lower_bound, upper_bound, equal_range, binary_search).
+
+template <class _ForwardIter, class _Tp>
+inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
+                                   const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+    return __lower_bound(__first, __last, __val, 
+			 __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+			 _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline _ForwardIter lower_bound(_ForwardIter __first, _ForwardIter __last,
+                                const _Tp& __val, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __lower_bound(__first, __last, __val, __comp, _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __upper_bound(_ForwardIter __first, _ForwardIter __last,
+                           const _Tp& __val, _Compare __comp, _Distance*);
+
+template <class _ForwardIter, class _Tp>
+inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
+                                const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __upper_bound(__first, __last, __val, 
+		       __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline _ForwardIter upper_bound(_ForwardIter __first, _ForwardIter __last,
+                                const _Tp& __val, _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __upper_bound(__first, __last, __val, __comp,
+                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+pair<_ForwardIter, _ForwardIter>
+__equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
+              _Compare __comp, _Distance*);
+
+template <class _ForwardIter, class _Tp>
+inline pair<_ForwardIter, _ForwardIter>
+equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __equal_range(__first, __last, __val,  
+		       __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline pair<_ForwardIter, _ForwardIter>
+equal_range(_ForwardIter __first, _ForwardIter __last, const _Tp& __val,
+            _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  return __equal_range(__first, __last, __val, __comp,
+                       _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+} 
+
+template <class _ForwardIter, class _Tp>
+inline bool binary_search(_ForwardIter __first, _ForwardIter __last,
+                   const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _ForwardIter __i = __lower_bound(__first, __last, __val, 
+                                   __less2(_STLP_VALUE_TYPE(__first, _ForwardIter), (_Tp*)0),
+                                   _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+  return __i != __last && !(__val < *__i);
+}
+
+template <class _ForwardIter, class _Tp, class _Compare>
+inline bool binary_search(_ForwardIter __first, _ForwardIter __last,
+                   const _Tp& __val,
+                   _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _ForwardIter __i = __lower_bound(__first, __last, __val, __comp, _STLP_DISTANCE_TYPE(__first, _ForwardIter));
+  return __i != __last && !__comp(__val, *__i);
+}
+
+// merge, with and without an explicitly supplied comparison function.
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+                  _InputIter2 __first2, _InputIter2 __last2,
+                  _OutputIter __result);
+ 
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter merge(_InputIter1 __first1, _InputIter1 __last1,
+                  _InputIter2 __first2, _InputIter2 __last2,
+                  _OutputIter __result, _Compare __comp);
+
+
+// inplace_merge and its auxiliary functions. 
+
+
+template <class _BidirectionalIter>
+void inplace_merge(_BidirectionalIter __first,
+		   _BidirectionalIter __middle,
+		   _BidirectionalIter __last) ;
+
+template <class _BidirectionalIter, class _Compare>
+void inplace_merge(_BidirectionalIter __first,
+		   _BidirectionalIter __middle,
+		   _BidirectionalIter __last, _Compare __comp);
+
+// Set algorithms: includes, set_union, set_intersection, set_difference,
+// set_symmetric_difference.  All of these algorithms have the precondition
+// that their input ranges are sorted and the postcondition that their output
+// ranges are sorted.
+
+template <class _InputIter1, class _InputIter2>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+              _InputIter2 __first2, _InputIter2 __last2);
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool includes(_InputIter1 __first1, _InputIter1 __last1,
+              _InputIter2 __first2, _InputIter2 __last2, _Compare __comp);
+ 
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+                      _InputIter2 __first2, _InputIter2 __last2,
+                      _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter set_union(_InputIter1 __first1, _InputIter1 __last1,
+                      _InputIter2 __first2, _InputIter2 __last2,
+                      _OutputIter __result, _Compare __comp);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2,
+                             _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter set_intersection(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2,
+                             _OutputIter __result, _Compare __comp);
+
+
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+                           _InputIter2 __first2, _InputIter2 __last2,
+                           _OutputIter __result);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter, 
+          class _Compare>
+_OutputIter set_difference(_InputIter1 __first1, _InputIter1 __last1,
+                           _InputIter2 __first2, _InputIter2 __last2, 
+                           _OutputIter __result, _Compare __comp);
+
+template <class _InputIter1, class _InputIter2, class _OutputIter>
+_OutputIter 
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+                         _InputIter2 __first2, _InputIter2 __last2,
+                         _OutputIter __result);
+
+
+template <class _InputIter1, class _InputIter2, class _OutputIter,
+          class _Compare>
+_OutputIter 
+set_symmetric_difference(_InputIter1 __first1, _InputIter1 __last1,
+                         _InputIter2 __first2, _InputIter2 __last2,
+                         _OutputIter __result,
+                         _Compare __comp);
+
+
+// min_element and max_element, with and without an explicitly supplied
+// comparison function.
+
+template <class _ForwardIter>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last);
+template <class _ForwardIter, class _Compare>
+_ForwardIter max_element(_ForwardIter __first, _ForwardIter __last,
+                            _Compare __comp);
+
+template <class _ForwardIter>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last);
+
+template <class _ForwardIter, class _Compare>
+_ForwardIter min_element(_ForwardIter __first, _ForwardIter __last,
+                            _Compare __comp);
+
+// next_permutation and prev_permutation, with and without an explicitly 
+// supplied comparison function.
+
+template <class _BidirectionalIter>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last);
+
+template <class _BidirectionalIter, class _Compare>
+bool next_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+                      _Compare __comp);
+
+
+template <class _BidirectionalIter>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last);
+
+
+template <class _BidirectionalIter, class _Compare>
+bool prev_permutation(_BidirectionalIter __first, _BidirectionalIter __last,
+                      _Compare __comp);
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// is_heap, a predicate testing whether or not a range is
+// a heap.  This function is an extension, not part of the C++
+// standard.
+
+template <class _RandomAccessIter>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last);
+
+template <class _RandomAccessIter, class _StrictWeakOrdering>
+bool is_heap(_RandomAccessIter __first, _RandomAccessIter __last,
+	     _StrictWeakOrdering __comp);
+
+
+// is_sorted, a predicated testing whether a range is sorted in
+// nondescending order.  This is an extension, not part of the C++
+// standard.
+template <class _ForwardIter, class _StrictWeakOrdering>
+bool __is_sorted(_ForwardIter __first, _ForwardIter __last,
+                 _StrictWeakOrdering __comp);
+
+template <class _ForwardIter>
+inline bool is_sorted(_ForwardIter __first, _ForwardIter __last) {
+  return __is_sorted(__first, __last, __less(_STLP_VALUE_TYPE(__first, _ForwardIter)));
+}
+
+template <class _ForwardIter, class _StrictWeakOrdering>
+inline bool is_sorted(_ForwardIter __first, _ForwardIter __last,
+                      _StrictWeakOrdering __comp) {
+  return __is_sorted(__first, __last, __comp);
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_algo.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ALGO_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_algobase.c b/src/STLport/stl/_algobase.c
new file mode 100644
index 0000000..d5b51a1
--- /dev/null
+++ b/src/STLport/stl/_algobase.c
@@ -0,0 +1,392 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_ALGOBASE_C
+#define _STLP_ALGOBASE_C
+
+# if !defined (_STLP_INTERNAL_ALGOBASE_H)
+#  include <stl/_algobase.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _InputIter1, class _InputIter2>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+    _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+    for ( ; __first1 != __last1 && __first2 != __last2
+	    ; ++__first1, ++__first2) {
+      if (*__first1 < *__first2)
+	return true;
+      if (*__first2 < *__first1)
+	return false;
+    }
+  return __first1 == __last1 && __first2 != __last2;
+}
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2,
+                             _Compare __comp) {
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+    _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+    for ( ; __first1 != __last1 && __first2 != __last2
+	    ; ++__first1, ++__first2) {
+      if (__comp(*__first1, *__first2))
+	return true;
+      if (__comp(*__first2, *__first1))
+	return false;
+    }
+  return __first1 == __last1 && __first2 != __last2;
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+
+template <class _InputIter1, class _InputIter2>
+int __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+                                   _InputIter2 __first2, _InputIter2 __last2)
+{
+  while (__first1 != __last1 && __first2 != __last2) {
+    if (*__first1 < *__first2)
+      return -1;
+    if (*__first2 < *__first1)
+      return 1;
+    ++__first1;
+    ++__first2;
+  }
+  if (__first2 == __last2) {
+    return !(__first1 == __last1);
+  }
+  else {
+    return -1;
+  }
+}
+
+
+template <class _InputIter1, class _InputIter2>
+int lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+                                 _InputIter2 __first2, _InputIter2 __last2)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+    _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+    return __lexicographical_compare_3way(__first1, __last1, __first2, __last2);
+}
+# endif
+
+template <class _RandomAccessIter, class _Tp>
+_STLP_INLINE_LOOP _RandomAccessIter __find(_RandomAccessIter __first, _RandomAccessIter __last,
+                                           const _Tp& __val,
+                                           const random_access_iterator_tag &)
+{
+  _STLP_DIFFERENCE_TYPE(_RandomAccessIter) __trip_count = (__last - __first) >> 2;
+
+  for ( ; __trip_count > 0 ; --__trip_count) {
+    if (*__first == __val) return __first;
+    ++__first;
+
+    if (*__first == __val) return __first;
+    ++__first;
+
+    if (*__first == __val) return __first;
+    ++__first;
+
+    if (*__first == __val) return __first;
+    ++__first;
+  }
+
+  switch(__last - __first) {
+  case 3:
+    if (*__first == __val) return __first;
+    ++__first;
+  case 2:
+    if (*__first == __val) return __first;
+    ++__first;
+  case 1:
+    if (*__first == __val) return __first;
+    ++__first;
+  case 0:
+  default:
+    return __last;
+  }
+}
+
+template <class _RandomAccessIter, class _Predicate>
+_STLP_INLINE_LOOP _RandomAccessIter __find_if(_RandomAccessIter __first, _RandomAccessIter __last,
+                                              _Predicate __pred,
+                                              const random_access_iterator_tag &)
+{
+  _STLP_DIFFERENCE_TYPE(_RandomAccessIter) __trip_count = (__last - __first) >> 2;
+
+  for ( ; __trip_count > 0 ; --__trip_count) {
+    if (__pred(*__first)) return __first;
+    ++__first;
+
+    if (__pred(*__first)) return __first;
+    ++__first;
+
+    if (__pred(*__first)) return __first;
+    ++__first;
+
+    if (__pred(*__first)) return __first;
+    ++__first;
+  }
+
+  switch(__last - __first) {
+  case 3:
+    if (__pred(*__first)) return __first;
+    ++__first;
+  case 2:
+    if (__pred(*__first)) return __first;
+    ++__first;
+  case 1:
+    if (__pred(*__first)) return __first;
+    //    ++__first;
+  case 0:
+  default:
+    return __last;
+  }
+}
+
+template <class _InputIter, class _Tp>
+inline _InputIter __find(_InputIter __first, _InputIter __last,
+			 const _Tp& __val,
+			 const input_iterator_tag &)
+{
+  while (__first != __last && !(*__first == __val))
+    ++__first;
+  return __first;
+}
+
+template <class _InputIter, class _Predicate>
+inline _InputIter __find_if(_InputIter __first, _STLP_MPW_EXTRA_CONST _InputIter __last,
+                            _Predicate __pred,
+                            const input_iterator_tag &)
+{
+  while (__first != __last && !__pred(*__first))
+    ++__first;
+  return __first;
+}
+
+template <class _InputIter, class _Predicate>
+_InputIter find_if(_InputIter __first, _InputIter __last,
+                   _Predicate __pred) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+    return __find_if(__first, __last, __pred, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+template <class _InputIter, class _Tp>
+_InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+    return __find(__first, __last, __val, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+                     _ForwardIter2 __first2, _ForwardIter2 __last2,
+                     _BinaryPred  __predicate) 
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+    _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+    // Test for empty ranges
+    if (__first1 == __last1 || __first2 == __last2)
+      return __first1;
+
+  // Test for a pattern of length 1.
+  _ForwardIter2 __tmp(__first2);
+  ++__tmp;
+  if (__tmp == __last2) {
+    while (__first1 != __last1 && !__predicate(*__first1, *__first2))
+      ++__first1;
+    return __first1;    
+  }
+  
+  // General case.
+
+  _ForwardIter2 __p1, __p;
+
+  __p1 = __first2; ++__p1;
+
+  //  _ForwardIter1 __current = __first1;
+
+  while (__first1 != __last1) {
+    while (__first1 != __last1) {
+      if (__predicate(*__first1, *__first2))
+        break;
+      ++__first1;
+    }
+    while (__first1 != __last1 && !__predicate(*__first1, *__first2))
+      ++__first1;
+    if (__first1 == __last1)
+      return __last1;
+
+    __p = __p1;
+    _ForwardIter1 __current = __first1; 
+    if (++__current == __last1) return __last1;
+
+    while (__predicate(*__current, *__p)) {
+      if (++__p == __last2)
+        return __first1;
+      if (++__current == __last1)
+        return __last1;
+    }
+
+    ++__first1;
+  }
+  return __first1;
+}
+
+// find_first_of, with and without an explicitly supplied comparison function.
+
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
+                           _ForwardIter __first2, _ForwardIter __last2,
+                           _BinaryPredicate __comp) {
+  for ( ; __first1 != __last1; ++__first1) 
+    for (_ForwardIter __iter = __first2; __iter != __last2; ++__iter)
+      if (__comp(*__first1, *__iter))
+        return __first1;
+  return __last1;
+}
+
+
+// find_end, with and without an explicitly supplied comparison function.
+// Search [first2, last2) as a subsequence in [first1, last1), and return
+// the *last* possible match.  Note that find_end for bidirectional iterators
+// is much faster than for forward iterators.
+
+// find_end for forward iterators. 
+
+template <class _ForwardIter1, class _ForwardIter2,
+  class _BinaryPredicate>
+_ForwardIter1 __find_end(_ForwardIter1 __first1, _ForwardIter1 __last1,
+                         _ForwardIter2 __first2, _ForwardIter2 __last2,
+                         const forward_iterator_tag &, const forward_iterator_tag &,
+                         _BinaryPredicate __comp)
+{
+  if (__first2 == __last2)
+    return __last1;
+  else {
+    _ForwardIter1 __result = __last1;
+    while (1) {
+      _ForwardIter1 __new_result
+        = search(__first1, __last1, __first2, __last2, __comp);
+      if (__new_result == __last1)
+        return __result;
+      else {
+        __result = __new_result;
+        __first1 = __new_result;
+        ++__first1;
+      }
+    }
+  }
+}
+
+// find_end for bidirectional iterators.  Requires partial specialization.
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+
+#if ! defined (_STLP_INTERNAL_ITERATOR_H)
+_STLP_END_NAMESPACE
+# include <stl/_iterator.h>
+_STLP_BEGIN_NAMESPACE 
+#endif
+
+template <class _BidirectionalIter1, class _BidirectionalIter2,
+  class _BinaryPredicate>
+_BidirectionalIter1
+__find_end(_BidirectionalIter1 __first1, _BidirectionalIter1 __last1,
+           _BidirectionalIter2 __first2, _BidirectionalIter2 __last2,
+           const bidirectional_iterator_tag &, const bidirectional_iterator_tag &, 
+           _BinaryPredicate __comp)
+{
+  typedef reverse_iterator<_BidirectionalIter1> _RevIter1;
+  typedef reverse_iterator<_BidirectionalIter2> _RevIter2;
+
+  _RevIter1 __rlast1(__first1);
+  _RevIter2 __rlast2(__first2);
+  _RevIter1 __rresult = search(_RevIter1(__last1), __rlast1,
+                               _RevIter2(__last2), __rlast2,
+                               __comp);
+
+  if (__rresult == __rlast1)
+    return __last1;
+  else {
+    _BidirectionalIter1 __result = __rresult.base();
+    advance(__result, -distance(__first2, __last2));
+    return __result;
+  }
+}
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+template <class _ForwardIter1, class _ForwardIter2, 
+  class _BinaryPredicate>
+_ForwardIter1 
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
+         _ForwardIter2 __first2, _ForwardIter2 __last2,
+         _BinaryPredicate __comp)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+    _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+    return __find_end(__first1, __last1, __first2, __last2,
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+		      _STLP_ITERATOR_CATEGORY(__first1, _ForwardIter1),
+		      _STLP_ITERATOR_CATEGORY(__first2, _ForwardIter2),
+# else
+		      forward_iterator_tag(),
+		      forward_iterator_tag(),
+# endif
+		      __comp);
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
+			   const _Tp& __val, _Compare __comp, _Distance*)
+{
+  _Distance __len = distance(__first, __last);
+  _Distance __half;
+  _ForwardIter __middle;
+
+  while (__len > 0) {
+    __half = __len >> 1;
+    __middle = __first;
+    advance(__middle, __half);
+    if (__comp(*__middle, __val)) {
+      __first = __middle;
+      ++__first;
+      __len = __len - __half - 1;
+    }
+    else
+      __len = __half;
+  }
+  return __first;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_ALGOBASE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_algobase.h b/src/STLport/stl/_algobase.h
new file mode 100644
index 0000000..822c0df
--- /dev/null
+++ b/src/STLport/stl/_algobase.h
@@ -0,0 +1,583 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#define _STLP_INTERNAL_ALGOBASE_H
+
+# if ! defined (_STLP_CSTDDEF)
+#  include <cstddef>
+# endif
+
+#ifndef _STLP_CSTRING
+# include <cstring>
+#endif
+
+#ifndef _STLP_CLIMITS
+# include <climits>
+#endif
+
+# if ! defined (_STLP_CSTDLIB)
+#  include <cstdlib>
+# endif
+
+# ifndef _STLP_INTERNAL_PAIR_H
+#  include <stl/_pair.h>
+# endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+// swap and iter_swap
+template <class _Tp>
+inline void swap(_Tp& __a, _Tp& __b) {
+  _Tp __tmp = __a;
+  __a = __b;
+  __b = __tmp;
+}
+
+template <class _ForwardIter1, class _ForwardIter2>
+inline void iter_swap(_ForwardIter1 __i1, _ForwardIter2 __i2) {
+  swap(*__i1, *__i2);
+}
+
+//--------------------------------------------------
+// min and max
+
+# if !defined (__BORLANDC__) || defined (_STLP_USE_OWN_NAMESPACE)
+template <class _Tp>
+inline const _Tp& (min)(const _Tp& __a, const _Tp& __b) { return __b < __a ? __b : __a; }
+template <class _Tp>
+inline const _Tp& (max)(const _Tp& __a, const _Tp& __b) {  return  __a < __b ? __b : __a; }
+#endif /* __BORLANDC__ */
+
+# if defined (__BORLANDC__) && ( __BORLANDC__ < 0x530 || defined (_STLP_USE_OWN_NAMESPACE))
+inline unsigned long (min) (unsigned long __a, unsigned long __b) { return __b < __a ? __b : __a; }
+inline unsigned long (max) (unsigned long __a, unsigned long __b) {  return  __a < __b ? __b : __a; }
+# endif
+
+template <class _Tp, class _Compare>
+inline const _Tp& (min)(const _Tp& __a, const _Tp& __b, _Compare __comp) { 
+  return __comp(__b, __a) ? __b : __a;
+}
+
+template <class _Tp, class _Compare>
+inline const _Tp& (max)(const _Tp& __a, const _Tp& __b, _Compare __comp) {
+  return __comp(__a, __b) ? __b : __a;
+}
+
+//--------------------------------------------------
+// copy
+
+// All of these auxiliary functions serve two purposes.  (1) Replace
+// calls to copy with memmove whenever possible.  (Memmove, not memcpy,
+// because the input and output ranges are permitted to overlap.)
+// (2) If we're using random access iterators, then write the loop as
+// a for loop with an explicit count.
+
+template <class _InputIter, class _OutputIter, class _Distance>
+inline _OutputIter __copy(_InputIter __first, _InputIter __last,
+                          _OutputIter __result,
+                          const input_iterator_tag &, _Distance*) {
+  for ( ; __first != __last; ++__result, ++__first)
+    *__result = *__first;
+  return __result;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) 
+template <class _InputIter, class _OutputIter, class _Distance>
+inline _OutputIter __copy(_InputIter __first, _InputIter __last,
+			  _OutputIter __result, const forward_iterator_tag &, _Distance* ) {
+  for ( ; __first != __last; ++__result, ++__first)
+    *__result = *__first;
+  return __result;
+}
+
+
+template <class _InputIter, class _OutputIter, class _Distance>
+inline _OutputIter __copy(_InputIter __first, _InputIter __last,
+			  _OutputIter __result, const bidirectional_iterator_tag &, _Distance* __dis) {
+  for ( ; __first != __last; ++__result, ++__first)
+    *__result = *__first;
+  return __result;
+}
+# endif 
+
+template <class _RandomAccessIter, class _OutputIter, class _Distance>
+inline _OutputIter
+__copy(_RandomAccessIter __first, _RandomAccessIter __last,
+       _OutputIter __result, const random_access_iterator_tag &, _Distance*) {
+  for (_Distance __n = __last - __first; __n > 0; --__n) {
+    *__result = *__first;
+    ++__first;
+    ++__result;
+  }
+  return __result;
+}
+
+inline void*
+__copy_trivial(const void* __first, const void* __last, void* __result) {
+  return (__last == __first) ? __result : 
+    ((char*)memmove(__result, __first, ((const char*)__last - (const char*)__first))) + 
+    ((const char*)__last - (const char*)__first);
+}
+
+//--------------------------------------------------
+// copy_backward auxiliary functions
+
+template <class _BidirectionalIter1, class _BidirectionalIter2, 
+          class _Distance>
+inline _BidirectionalIter2 __copy_backward(_BidirectionalIter1 __first, 
+                                           _BidirectionalIter1 __last, 
+                                           _BidirectionalIter2 __result,
+                                           const bidirectional_iterator_tag &,
+                                           _Distance*) 
+{
+  while (__first != __last)
+    *--__result = *--__last;
+  return __result;
+}
+
+template <class _RandomAccessIter, class _BidirectionalIter, class _Distance>
+inline _BidirectionalIter __copy_backward(_RandomAccessIter __first, 
+                                          _RandomAccessIter __last, 
+                                          _BidirectionalIter __result,
+                                          const random_access_iterator_tag &,
+                                          _Distance*)
+{
+  for (_Distance __n = __last - __first; __n > 0; --__n)
+    *--__result = *--__last;
+  return __result;
+}
+
+inline void*
+__copy_trivial_backward(const void* __first, const void* __last, void* __result) {
+  const ptrdiff_t _Num = (const char*)__last - (const char*)__first;
+  return (_Num > 0) ? memmove((char*)__result - _Num, __first, _Num) : __result ;
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+  return __copy(__first, __last, __result, 
+                _STLP_ITERATOR_CATEGORY(__first, _InputIter), 
+                _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+// we know they all pointers, so this cast is OK 
+  //  return (_OutputIter)__copy_trivial(&(*__first), &(*__last), &(*__result));
+  return (_OutputIter)__copy_trivial(__first, __last, __result);
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+  return __copy_ptrs(__first, __last, __result, 
+                     _IsOKToMemCpy(_STLP_VALUE_TYPE(__first, _InputIter), 
+                                   _STLP_VALUE_TYPE(__result, _OutputIter))._Ret());
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+  return __copy(__first, __last, __result, 
+		_STLP_ITERATOR_CATEGORY(__first, _InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter copy(_InputIter __first, _InputIter __last, _OutputIter __result) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+    return __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter> :: _Ret());
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+  return __copy_backward(__first, __last, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_ptrs(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+  return (_OutputIter)__copy_trivial_backward(__first, __last, __result);  
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __false_type&) {
+  return __copy_backward(__first, __last, __result, _STLP_ITERATOR_CATEGORY(__first,_InputIter), _STLP_DISTANCE_TYPE(__first, _InputIter));
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter __copy_backward_aux(_InputIter __first, _InputIter __last, _OutputIter __result, const __true_type&) {
+  return __copy_backward_ptrs(__first, __last, __result,  
+                              _IsOKToMemCpy(_STLP_VALUE_TYPE(__first, _InputIter), 
+                                            _STLP_VALUE_TYPE(__result, _OutputIter))._Ret());
+}
+
+template <class _InputIter, class _OutputIter>
+inline _OutputIter copy_backward(_InputIter __first, _InputIter __last, _OutputIter __result) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+    return __copy_backward_aux(__first, __last, __result, _BothPtrType< _InputIter, _OutputIter> :: _Ret() );
+}
+
+#if ! defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined ( _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS )
+#define _STLP_DECLARE_COPY_TRIVIAL(_Tp)                                \
+inline _Tp* copy(const _Tp* __first, const _Tp* __last, _Tp* __result) \
+{ return (_Tp*)__copy_trivial(__first, __last, __result); } \
+inline _Tp* copy_backward(const _Tp* __first, const _Tp* __last, _Tp* __result) \
+{ return (_Tp*)__copy_trivial_backward(__first, __last, __result); }
+
+_STLP_DECLARE_COPY_TRIVIAL(char)
+# ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_DECLARE_COPY_TRIVIAL(signed char)
+# endif
+_STLP_DECLARE_COPY_TRIVIAL(unsigned char)
+_STLP_DECLARE_COPY_TRIVIAL(short)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned short)
+_STLP_DECLARE_COPY_TRIVIAL(int)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned int)
+_STLP_DECLARE_COPY_TRIVIAL(long)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned long)
+#if !defined(_STLP_NO_WCHAR_T) && !defined (_STLP_WCHAR_T_IS_USHORT) 
+_STLP_DECLARE_COPY_TRIVIAL(wchar_t)
+#endif
+#ifdef _STLP_LONG_LONG
+_STLP_DECLARE_COPY_TRIVIAL(long long)
+_STLP_DECLARE_COPY_TRIVIAL(unsigned long long)
+#endif 
+_STLP_DECLARE_COPY_TRIVIAL(float)
+_STLP_DECLARE_COPY_TRIVIAL(double)
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_DECLARE_COPY_TRIVIAL(long double)
+# endif
+#undef _STLP_DECLARE_COPY_TRIVIAL
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+//--------------------------------------------------
+// copy_n (not part of the C++ standard)
+
+template <class _InputIter, class _Size, class _OutputIter>
+_STLP_INLINE_LOOP 
+pair<_InputIter, _OutputIter> __copy_n(_InputIter __first, _Size __count,
+                                       _OutputIter __result,
+                                       const input_iterator_tag &) {
+  for ( ; __count > 0; --__count) {
+    *__result = *__first;
+    ++__first;
+    ++__result;
+  }
+  return pair<_InputIter, _OutputIter>(__first, __result);
+}
+
+template <class _RAIter, class _Size, class _OutputIter>
+inline pair<_RAIter, _OutputIter>
+__copy_n(_RAIter __first, _Size __count,
+         _OutputIter __result,
+         const random_access_iterator_tag &) {
+  _RAIter __last = __first + __count;
+  return pair<_RAIter, _OutputIter>(__last, copy(__first, __last, __result));
+}
+
+template <class _InputIter, class _Size, class _OutputIter>
+inline pair<_InputIter, _OutputIter>
+__copy_n(_InputIter __first, _Size __count, _OutputIter __result) {
+  _STLP_FIX_LITERAL_BUG(__first)
+  return __copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+template <class _InputIter, class _Size, class _OutputIter>
+inline pair<_InputIter, _OutputIter>
+copy_n(_InputIter __first, _Size __count, _OutputIter __result) {
+  _STLP_FIX_LITERAL_BUG(__first)
+  return __copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+
+//--------------------------------------------------
+// fill and fill_n
+
+
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP
+void fill(_ForwardIter __first, _ForwardIter __last, const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    *__first = __val;
+}
+
+template <class _OutputIter, class _Size, class _Tp>
+_STLP_INLINE_LOOP
+_OutputIter fill_n(_OutputIter __first, _Size __n, const _Tp& __val) {
+  _STLP_FIX_LITERAL_BUG(__first)
+  for ( ; __n > 0; --__n, ++__first)
+    *__first = __val;
+  return __first;
+}
+
+
+// Specialization: for one-byte types we can use memset.
+
+inline void fill(unsigned char* __first, unsigned char* __last,
+                 const unsigned char& __val) {
+  unsigned char __tmp = __val;
+  memset(__first, __tmp, __last - __first);
+}
+# ifndef _STLP_NO_SIGNED_BUILTINS
+inline void fill(signed char* __first, signed char* __last,
+                 const signed char& __val) {
+  signed char __tmp = __val;
+  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
+}
+# endif
+inline void fill(char* __first, char* __last, const char& __val) {
+  char __tmp = __val;
+  memset(__first, __STATIC_CAST(unsigned char,__tmp), __last - __first);
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _Size>
+inline unsigned char* fill_n(unsigned char* __first, _Size __n,
+                             const unsigned char& __val) {
+  fill(__first, __first + __n, __val);
+  return __first + __n;
+}
+
+template <class _Size>
+inline signed char* fill_n(char* __first, _Size __n,
+                           const signed char& __val) {
+  fill(__first, __first + __n, __val);
+  return __first + __n;
+}
+
+template <class _Size>
+inline char* fill_n(char* __first, _Size __n, const char& __val) {
+  fill(__first, __first + __n, __val);
+  return __first + __n;
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+//--------------------------------------------------
+// equal and mismatch
+
+template <class _InputIter1, class _InputIter2>
+_STLP_INLINE_LOOP
+pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
+                                        _InputIter1 __last1,
+                                        _InputIter2 __first2) {
+  _STLP_FIX_LITERAL_BUG(__first2)
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  while (__first1 != __last1 && *__first1 == *__first2) {
+    ++__first1;
+    ++__first2;
+  }
+  return pair<_InputIter1, _InputIter2>(__first1, __first2);
+}
+
+template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
+_STLP_INLINE_LOOP
+pair<_InputIter1, _InputIter2> mismatch(_InputIter1 __first1,
+                                        _InputIter1 __last1,
+                                        _InputIter2 __first2,
+                                        _BinaryPredicate __binary_pred) {
+  _STLP_FIX_LITERAL_BUG(__first2)
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  while (__first1 != __last1 && __binary_pred(*__first1, *__first2)) {
+    ++__first1;
+    ++__first2;
+  }
+  return pair<_InputIter1, _InputIter2>(__first1, __first2);
+}
+
+template <class _InputIter1, class _InputIter2>
+_STLP_INLINE_LOOP
+bool equal(_InputIter1 __first1, _InputIter1 __last1,
+                  _InputIter2 __first2) {
+  _STLP_FIX_LITERAL_BUG(__first1) _STLP_FIX_LITERAL_BUG(__last1)  _STLP_FIX_LITERAL_BUG(__first2)
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  for ( ; __first1 != __last1; ++__first1, ++__first2)
+    if (!(*__first1 == *__first2))
+      return false;
+  return true;
+}
+
+template <class _InputIter1, class _InputIter2, class _BinaryPredicate>
+_STLP_INLINE_LOOP
+bool equal(_InputIter1 __first1, _InputIter1 __last1,
+                  _InputIter2 __first2, _BinaryPredicate __binary_pred) {
+  _STLP_FIX_LITERAL_BUG(__first2)
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  for ( ; __first1 != __last1; ++__first1, ++__first2)
+    if (!__binary_pred(*__first1, *__first2))
+      return false;
+  return true;
+}
+
+//--------------------------------------------------
+// lexicographical_compare and lexicographical_compare_3way.
+// (the latter is not part of the C++ standard.)
+
+template <class _InputIter1, class _InputIter2>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2);
+
+template <class _InputIter1, class _InputIter2, class _Compare>
+bool lexicographical_compare(_InputIter1 __first1, _InputIter1 __last1,
+                             _InputIter2 __first2, _InputIter2 __last2,
+                             _Compare __comp);
+
+inline bool 
+lexicographical_compare(const unsigned char* __first1,
+                        const unsigned char* __last1,
+                        const unsigned char* __first2,
+                        const unsigned char* __last2)
+{
+  const size_t __len1 = __last1 - __first1;
+  const size_t __len2 = __last2 - __first2;
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+
+  const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
+  return __result != 0 ? (__result < 0) : (__len1 < __len2);
+}
+
+
+# if !(CHAR_MAX == SCHAR_MAX)
+inline bool lexicographical_compare(const char* __first1, const char* __last1,
+                                    const char* __first2, const char* __last2)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1)) 
+  _STLP_DEBUG_CHECK(__check_range(__first2, __last2))
+
+  return lexicographical_compare((const unsigned char*) __first1,
+                                 (const unsigned char*) __last1,
+                                 (const unsigned char*) __first2,
+                                 (const unsigned char*) __last2);
+}
+#endif /* CHAR_MAX == SCHAR_MAX */
+
+template <class _InputIter1, class _InputIter2>
+int __lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+                                   _InputIter2 __first2, _InputIter2 __last2);
+
+inline int
+__lexicographical_compare_3way(const unsigned char* __first1,
+                               const unsigned char* __last1,
+                               const unsigned char* __first2,
+                               const unsigned char* __last2)
+{
+  const ptrdiff_t __len1 = __last1 - __first1;
+  const ptrdiff_t __len2 = __last2 - __first2;
+  const int __result = memcmp(__first1, __first2, (min) (__len1, __len2));
+  return __result != 0 ? __result 
+                       : (__len1 == __len2 ? 0 : (__len1 < __len2 ? -1 : 1));
+}
+
+
+# if !(CHAR_MAX == SCHAR_MAX)
+inline int 
+__lexicographical_compare_3way(const char* __first1, const char* __last1,
+                               const char* __first2, const char* __last2)
+{
+  return __lexicographical_compare_3way((const unsigned char*) __first1,
+                                        (const unsigned char*) __last1,
+                                        (const unsigned char*) __first2,
+                                        (const unsigned char*) __last2);
+}
+# endif
+
+# ifndef _STLP_NO_EXTENSIONS
+
+template <class _InputIter1, class _InputIter2>
+int lexicographical_compare_3way(_InputIter1 __first1, _InputIter1 __last1,
+                                 _InputIter2 __first2, _InputIter2 __last2);
+
+# endif /* EXTENSIONS */
+
+// count
+template <class _InputIter, class _Tp>
+_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_InputIter)
+count(_InputIter __first, _InputIter __last, const _Tp& __val) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  _STLP_DIFFERENCE_TYPE(_InputIter) __n = 0;
+  for ( ; __first != __last; ++__first)
+    if (*__first == __val)
+      ++__n;
+  return __n;
+}
+
+// find and find_if. Note find may be expressed in terms of find_if if appropriate binder was available.
+template <class _InputIter, class _Tp>
+_InputIter find(_InputIter __first, _InputIter __last, const _Tp& __val);
+template <class _InputIter, class _Predicate>
+_InputIter find_if(_InputIter __first, _InputIter __last, _Predicate __pred);
+
+// search.
+template <class _ForwardIter1, class _ForwardIter2, class _BinaryPred>
+_ForwardIter1 search(_ForwardIter1 __first1, _ForwardIter1 __last1,
+                     _ForwardIter2 __first2, _ForwardIter2 __last2, _BinaryPred  __predicate);
+
+// find_first_of
+template <class _InputIter, class _ForwardIter, class _BinaryPredicate>
+_InputIter __find_first_of(_InputIter __first1, _InputIter __last1,
+                           _ForwardIter __first2, _ForwardIter __last2,
+                           _BinaryPredicate __comp);
+
+template <class _ForwardIter1, class _ForwardIter2, 
+          class _BinaryPredicate>
+_ForwardIter1 
+find_end(_ForwardIter1 __first1, _ForwardIter1 __last1, 
+         _ForwardIter2 __first2, _ForwardIter2 __last2,
+         _BinaryPredicate __comp);
+
+// replace
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP void 
+replace(_ForwardIter __first, _ForwardIter __last,
+        const _Tp& __old_value, const _Tp& __new_value) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    if (*__first == __old_value)
+      *__first = __new_value;
+}
+
+template <class _ForwardIter, class _Tp, class _Compare, class _Distance>
+_ForwardIter __lower_bound(_ForwardIter __first, _ForwardIter __last,
+                              const _Tp& __val, _Compare __comp, _Distance*);
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_algobase.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ALGOBASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_alloc.c b/src/STLport/stl/_alloc.c
new file mode 100644
index 0000000..c444034
--- /dev/null
+++ b/src/STLport/stl/_alloc.c
@@ -0,0 +1,370 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_ALLOC_C
+#define _STLP_ALLOC_C
+
+#ifdef __WATCOMC__
+#pragma warning 13 9
+#pragma warning 367 9
+#pragma warning 368 9
+#endif
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+#endif
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+# ifdef _STLP_SGI_THREADS
+  // We test whether threads are in use before locking.
+  // Perhaps this should be moved into stl_threads.h, but that
+  // probably makes it harder to avoid the procedure call when
+  // it isn't needed.
+    extern "C" {
+      extern int __us_rsthread_malloc;
+    }
+# endif
+
+
+// Specialised debug form of malloc which does not provide "false"
+// memory leaks when run with debug CRT libraries.
+#if defined(_STLP_MSVC) && (_STLP_MSVC>=1020 && defined(_STLP_DEBUG_ALLOC)) && ! defined (_STLP_WINCE)
+#  include <crtdbg.h>
+inline void* __stlp_chunk_malloc(size_t __bytes) { _STLP_CHECK_NULL_ALLOC(_malloc_dbg(__bytes, _CRT_BLOCK, __FILE__, __LINE__)); }
+#else	// !_DEBUG
+# ifdef _STLP_NODE_ALLOC_USE_MALLOC
+#  include <cstdlib>
+inline void* __stlp_chunk_malloc(size_t __bytes) { _STLP_CHECK_NULL_ALLOC(_STLP_VENDOR_CSTD::malloc(__bytes)); }
+# else
+inline void* __stlp_chunk_malloc(size_t __bytes) { return _STLP_STD::__stl_new(__bytes); }
+# endif
+#endif	// !_DEBUG
+
+
+#define _S_FREELIST_INDEX(__bytes) ((__bytes-size_t(1))>>(int)_ALIGN_SHIFT)
+
+_STLP_BEGIN_NAMESPACE
+
+template <int __inst>
+void *  _STLP_CALL __malloc_alloc<__inst>::_S_oom_malloc(size_t __n)
+{
+  __oom_handler_type __my_malloc_handler;
+  void * __result;
+
+  for (;;) {
+    __my_malloc_handler = __oom_handler;
+    if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; }
+    (*__my_malloc_handler)();
+    __result = malloc(__n);
+    if (__result) return(__result);
+  }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+  return 0;
+#endif
+
+}
+
+template <class _Alloc>
+void *  _STLP_CALL __debug_alloc<_Alloc>::allocate(size_t __n) {
+  size_t __real_n = __n + __extra_before_chunk() + __extra_after_chunk();
+  __alloc_header *__result = (__alloc_header *)__allocator_type::allocate(__real_n);
+  memset((char*)__result, __shred_byte, __real_n*sizeof(value_type));
+  __result->__magic = __magic;
+  __result->__type_size = sizeof(value_type);
+  __result->_M_size = (_STLP_UINT32_T)__n;
+  return ((char*)__result) + (long)__extra_before;
+}
+
+template <class _Alloc>
+void  _STLP_CALL
+__debug_alloc<_Alloc>::deallocate(void *__p, size_t __n) {
+  __alloc_header * __real_p = (__alloc_header*)((char *)__p -(long)__extra_before);
+  // check integrity
+  _STLP_VERBOSE_ASSERT(__real_p->__magic != __deleted_magic, _StlMsg_DBA_DELETED_TWICE)
+  _STLP_VERBOSE_ASSERT(__real_p->__magic == __magic, _StlMsg_DBA_NEVER_ALLOCATED)
+  _STLP_VERBOSE_ASSERT(__real_p->__type_size == 1,_StlMsg_DBA_TYPE_MISMATCH)
+  _STLP_VERBOSE_ASSERT(__real_p->_M_size == __n, _StlMsg_DBA_SIZE_MISMATCH)
+  // check pads on both sides
+  unsigned char* __tmp;
+  for (__tmp= (unsigned char*)(__real_p+1); __tmp < (unsigned char*)__p; __tmp++) {  
+    _STLP_VERBOSE_ASSERT(*__tmp==__shred_byte, _StlMsg_DBA_UNDERRUN)
+      }
+  
+  size_t __real_n= __n + __extra_before_chunk() + __extra_after_chunk();
+  
+  for (__tmp= ((unsigned char*)__p)+__n*sizeof(value_type); 
+       __tmp < ((unsigned char*)__real_p)+__real_n ; __tmp++) {
+    _STLP_VERBOSE_ASSERT(*__tmp==__shred_byte, _StlMsg_DBA_OVERRUN)
+      }
+  
+  // that may be unfortunate, just in case
+  __real_p->__magic=__deleted_magic;
+  memset((char*)__p, __shred_byte, __n*sizeof(value_type));
+  __allocator_type::deallocate(__real_p, __real_n);
+}
+
+// # ifdef _STLP_THREADS
+
+template <bool __threads, int __inst>
+class _Node_Alloc_Lock {
+public:
+  _Node_Alloc_Lock() { 
+    
+#  ifdef _STLP_SGI_THREADS
+    if (__threads && __us_rsthread_malloc)
+#  else /* !_STLP_SGI_THREADS */
+      if (__threads) 
+#  endif
+    	_S_lock._M_acquire_lock(); 
+  }
+  
+  ~_Node_Alloc_Lock() {
+#  ifdef _STLP_SGI_THREADS
+    if (__threads && __us_rsthread_malloc)
+#  else /* !_STLP_SGI_THREADS */
+      if (__threads)
+#  endif
+        _S_lock._M_release_lock(); 
+  }
+  
+  static _STLP_STATIC_MUTEX _S_lock;
+};
+
+// # endif  /* _STLP_THREADS */
+
+
+template <bool __threads, int __inst>
+void* _STLP_CALL
+__node_alloc<__threads, __inst>::_M_allocate(size_t __n) {
+  void*  __r;
+  _Obj * _STLP_VOLATILE * __my_free_list = _S_free_list + _S_FREELIST_INDEX(__n);
+  // #       ifdef _STLP_THREADS
+  /*REFERENCED*/
+  _Node_Alloc_Lock<__threads, __inst> __lock_instance;
+  // #       endif
+  // Acquire the lock here with a constructor call.
+  // This ensures that it is released in exit or during stack
+  // unwinding.
+  if ( (__r  = *__my_free_list) != 0 ) {
+    *__my_free_list = ((_Obj*)__r) -> _M_free_list_link;
+  } else {
+    __r = _S_refill(__n);
+  }
+  // lock is released here
+  return __r;
+}
+
+template <bool __threads, int __inst>
+void _STLP_CALL
+__node_alloc<__threads, __inst>::_M_deallocate(void *__p, size_t __n) {
+  _Obj * _STLP_VOLATILE * __my_free_list = _S_free_list + _S_FREELIST_INDEX(__n);
+  // #       ifdef _STLP_THREADS
+  /*REFERENCED*/
+  _Node_Alloc_Lock<__threads, __inst> __lock_instance;
+  // #       endif /* _STLP_THREADS */
+  // acquire lock
+  ((_Obj *)__p) -> _M_free_list_link = *__my_free_list;
+  *__my_free_list = (_Obj *)__p;
+  // lock is released here
+}
+
+/* We allocate memory in large chunks in order to avoid fragmenting     */
+/* the malloc heap too much.                                            */
+/* We assume that size is properly aligned.                             */
+/* We hold the allocation lock.                                         */
+template <bool __threads, int __inst>
+char* _STLP_CALL
+__node_alloc<__threads, __inst>::_S_chunk_alloc(size_t _p_size, 
+						int& __nobjs)
+{
+  char* __result;
+  size_t __total_bytes = _p_size * __nobjs;
+  size_t __bytes_left = _S_end_free - _S_start_free;
+
+  if (__bytes_left >= __total_bytes) {
+    __result = _S_start_free;
+    _S_start_free += __total_bytes;
+    return(__result);
+  } else if (__bytes_left >= _p_size) {
+    __nobjs = (int)(__bytes_left/_p_size);
+    __total_bytes = _p_size * __nobjs;
+    __result = _S_start_free;
+    _S_start_free += __total_bytes;
+    return(__result);
+  } else {
+    size_t __bytes_to_get = 
+      2 * __total_bytes + _S_round_up(_S_heap_size >> 4);
+    // Try to make use of the left-over piece.
+    if (__bytes_left > 0) {
+      _Obj* _STLP_VOLATILE* __my_free_list =
+	_S_free_list + _S_FREELIST_INDEX(__bytes_left);
+
+      ((_Obj*)_S_start_free) -> _M_free_list_link = *__my_free_list;
+      *__my_free_list = (_Obj*)_S_start_free;
+    }
+    _S_start_free = (char*)__stlp_chunk_malloc(__bytes_to_get);
+    if (0 == _S_start_free) {
+      size_t __i;
+      _Obj* _STLP_VOLATILE* __my_free_list;
+      _Obj* __p;
+      // Try to make do with what we have.  That can't
+      // hurt.  We do not try smaller requests, since that tends
+      // to result in disaster on multi-process machines.
+      for (__i = _p_size; __i <= (size_t)_MAX_BYTES; __i += (size_t)_ALIGN) {
+	__my_free_list = _S_free_list + _S_FREELIST_INDEX(__i);
+	__p = *__my_free_list;
+	if (0 != __p) {
+	  *__my_free_list = __p -> _M_free_list_link;
+	  _S_start_free = (char*)__p;
+	  _S_end_free = _S_start_free + __i;
+	  return(_S_chunk_alloc(_p_size, __nobjs));
+	  // Any leftover piece will eventually make it to the
+	  // right free list.
+	}
+      }
+      _S_end_free = 0;	// In case of exception.
+      _S_start_free = (char*)__stlp_chunk_malloc(__bytes_to_get);
+    /*
+      (char*)malloc_alloc::allocate(__bytes_to_get);
+      */
+
+      // This should either throw an
+      // exception or remedy the situation.  Thus we assume it
+      // succeeded.
+    }
+    _S_heap_size += __bytes_to_get;
+    _S_end_free = _S_start_free + __bytes_to_get;
+    return(_S_chunk_alloc(_p_size, __nobjs));
+  }
+}
+
+
+/* Returns an object of size __n, and optionally adds to size __n free list.*/
+/* We assume that __n is properly aligned.                                */
+/* We hold the allocation lock.                                         */
+template <bool __threads, int __inst>
+void* _STLP_CALL
+__node_alloc<__threads, __inst>::_S_refill(size_t __n)
+{
+  int __nobjs = 20;
+  __n = _S_round_up(__n);
+  char* __chunk = _S_chunk_alloc(__n, __nobjs);
+  _Obj* _STLP_VOLATILE* __my_free_list;
+  _Obj* __result;
+  _Obj* __current_obj;
+  _Obj* __next_obj;
+  int __i;
+
+  if (1 == __nobjs) return(__chunk);
+  __my_free_list = _S_free_list + _S_FREELIST_INDEX(__n);
+
+  /* Build free list in chunk */
+  __result = (_Obj*)__chunk;
+  *__my_free_list = __next_obj = (_Obj*)(__chunk + __n);
+  for (__i = 1; ; __i++) {
+    __current_obj = __next_obj;
+    __next_obj = (_Obj*)((char*)__next_obj + __n);
+    if (__nobjs - 1 == __i) {
+      __current_obj -> _M_free_list_link = 0;
+      break;
+    } else {
+      __current_obj -> _M_free_list_link = __next_obj;
+    }
+  }
+  return(__result);
+}
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+// malloc_alloc out-of-memory handling
+template <int __inst>
+__oom_handler_type __malloc_alloc<__inst>::__oom_handler=(__oom_handler_type)0 ;
+
+// #ifdef _STLP_THREADS
+    template <bool __threads, int __inst>
+    _STLP_STATIC_MUTEX
+    _Node_Alloc_Lock<__threads, __inst>::_S_lock _STLP_MUTEX_INITIALIZER;
+// #endif
+
+template <bool __threads, int __inst>
+_Node_alloc_obj * _STLP_VOLATILE
+__node_alloc<__threads, __inst>::_S_free_list[_STLP_NFREELISTS]
+= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+// The 16 zeros are necessary to make version 4.1 of the SunPro
+// compiler happy.  Otherwise it appears to allocate too little
+// space for the array.
+
+template <bool __threads, int __inst>
+char *__node_alloc<__threads, __inst>::_S_start_free = 0;
+
+template <bool __threads, int __inst>
+char *__node_alloc<__threads, __inst>::_S_end_free = 0;
+
+template <bool __threads, int __inst>
+size_t __node_alloc<__threads, __inst>::_S_heap_size = 0;
+
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+__DECLARE_INSTANCE(__oom_handler_type, __malloc_alloc<0>::__oom_handler, =0);
+
+# define _STLP_ALLOC_NOTHREADS __node_alloc<false, 0>
+# define _STLP_ALLOC_THREADS   __node_alloc<true, 0>
+# define _STLP_ALLOC_NOTHREADS_LOCK _Node_Alloc_Lock<false, 0>
+# define _STLP_ALLOC_THREADS_LOCK   _Node_Alloc_Lock<true, 0>
+
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_NOTHREADS::_S_start_free,=0);
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_NOTHREADS::_S_end_free,=0);
+__DECLARE_INSTANCE(size_t, _STLP_ALLOC_NOTHREADS::_S_heap_size,=0);
+__DECLARE_INSTANCE(_Node_alloc_obj * _STLP_VOLATILE,
+                   _STLP_ALLOC_NOTHREADS::_S_free_list[_STLP_NFREELISTS],
+                   ={0});
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_THREADS::_S_start_free,=0);
+__DECLARE_INSTANCE(char *, _STLP_ALLOC_THREADS::_S_end_free,=0);
+__DECLARE_INSTANCE(size_t, _STLP_ALLOC_THREADS::_S_heap_size,=0);
+__DECLARE_INSTANCE(_Node_alloc_obj * _STLP_VOLATILE,
+                   _STLP_ALLOC_THREADS::_S_free_list[_STLP_NFREELISTS],
+                   ={0});
+// #   ifdef _STLP_THREADS
+__DECLARE_INSTANCE(_STLP_STATIC_MUTEX,
+                   _STLP_ALLOC_NOTHREADS_LOCK::_S_lock,
+                   _STLP_MUTEX_INITIALIZER);
+__DECLARE_INSTANCE(_STLP_STATIC_MUTEX,
+                   _STLP_ALLOC_THREADS_LOCK::_S_lock,
+                   _STLP_MUTEX_INITIALIZER);
+// #   endif
+
+# undef _STLP_ALLOC_THREADS
+# undef _STLP_ALLOC_NOTHREADS
+
+#  endif /* _STLP_STATIC_TEMPLATE_DATA */
+
+_STLP_END_NAMESPACE
+
+# undef _S_FREELIST_INDEX
+
+# endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
+
+#endif /*  _STLP_ALLOC_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_alloc.h b/src/STLport/stl/_alloc.h
new file mode 100644
index 0000000..5018754
--- /dev/null
+++ b/src/STLport/stl/_alloc.h
@@ -0,0 +1,531 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#define _STLP_INTERNAL_ALLOC_H
+
+# ifndef _STLP_CSTDDEF
+#  include <cstddef>
+# endif
+
+#if !defined (_STLP_DEBUG_H) && (defined  (_STLP_DEBUG) || defined (_STLP_ASSERTIONS))
+# include <stl/debug/_debug.h>
+#endif
+
+# ifndef _STLP_CSTDLIB
+#  include <cstdlib>
+# endif
+# ifndef _STLP_CSTRING
+#  include <cstring>
+# endif
+
+# ifndef __THROW_BAD_ALLOC
+#  if !defined(_STLP_USE_EXCEPTIONS)
+#   if !defined (_STLP_CSTDIO)
+#    include <cstdio>
+#   endif
+#   if !defined (_STLP_CSTDLIB)
+#    include <cstdlib>
+#   endif
+#   define __THROW_BAD_ALLOC puts("out of memory\n"); exit(1)
+#  else /* !defined(_STLP_USE_EXCEPTIONS) */
+#   define __THROW_BAD_ALLOC throw _STLP_STD::bad_alloc()
+#  endif /* !defined(_STLP_USE_EXCEPTIONS) */
+# endif   /* __THROW_BAD_ALLOC */
+
+# ifndef _STLP_INTERNAL_NEW_HEADER
+#  include <stl/_new.h>
+# endif
+
+#if /* defined (_STLP_THREADS) && */ ! defined (_STLP_INTERNAL_THREADS_H)
+# include <stl/_threads.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CONSTRUCT_H
+# include <stl/_construct.h>
+#endif
+
+#ifndef __ALLOC
+#   define __ALLOC __sgi_alloc
+#endif
+
+# ifndef __RESTRICT
+#  define __RESTRICT
+# endif
+
+#if defined (_STLP_THREADS) || (defined(_STLP_OWN_IOSTREAMS) && ! defined (_STLP_NO_THREADS) && ! defined (_NOTHREADS) )
+# define _STLP_NODE_ALLOCATOR_THREADS true
+#else
+# define _STLP_NODE_ALLOCATOR_THREADS false
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+template <class _Tp, class _Alloc> struct __allocator;
+# endif
+
+// Malloc-based allocator.  Typically slower than default alloc below.
+// Typically thread-safe and more storage efficient.
+
+typedef void (* __oom_handler_type)();
+
+template <int __inst>
+class __malloc_alloc {
+private:
+  static void* _STLP_CALL _S_oom_malloc(size_t);
+  static __oom_handler_type __oom_handler;
+public:
+  // this one is needed for proper simple_alloc wrapping
+  typedef char value_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+  template <class _Tp1> struct rebind {
+    typedef __allocator<_Tp1, __malloc_alloc<__inst> > other;
+  };
+# endif
+  static void* _STLP_CALL allocate(size_t __n)    {
+    void* __result = malloc(__n);
+    if (0 == __result) __result = _S_oom_malloc(__n);
+    return __result;
+  }
+  static void _STLP_CALL deallocate(void* __p, size_t /* __n */) { free((char*)__p); }
+  static __oom_handler_type _STLP_CALL set_malloc_handler(__oom_handler_type __f) {
+    __oom_handler_type __old = __oom_handler;
+    __oom_handler = __f;
+    return(__old);
+  }
+};
+
+
+// New-based allocator.  Typically slower than default alloc below.
+// Typically thread-safe and more storage efficient.
+class _STLP_CLASS_DECLSPEC __new_alloc {
+public:
+  // this one is needed for proper simple_alloc wrapping
+  typedef char value_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) &&  defined(_STLP_USE_RAW_SGI_ALLOCATORS)
+  template <class _Tp1> struct rebind {
+    typedef __allocator<_Tp1, __new_alloc > other;
+  };
+# endif
+  static void* _STLP_CALL  allocate(size_t __n) {  return __stl_new(__n); }
+  static void _STLP_CALL deallocate(void* __p, size_t) { __stl_delete(__p); }
+};
+
+
+// Allocator adaptor to check size arguments for debugging.
+// Reports errors using assert.  Checking can be disabled with
+// NDEBUG, but it's far better to just use the underlying allocator
+// instead when no checking is desired.
+// There is some evidence that this can confuse Purify.
+// This adaptor can only be applied to raw allocators
+
+template <class _Alloc>
+class __debug_alloc : public _Alloc {
+public:
+  typedef _Alloc __allocator_type;
+  typedef typename _Alloc::value_type value_type;
+private:
+  struct __alloc_header {
+    size_t __magic: 16;
+    size_t __type_size:16;
+    _STLP_UINT32_T _M_size;
+  }; // that is 8 bytes for sure
+  // Sunpro CC has bug on enums, so extra_before/after set explicitly
+  enum { __pad=8, __magic=0xdeba, __deleted_magic = 0xdebd,
+	 __shred_byte= _STLP_SHRED_BYTE
+  };
+
+  enum { __extra_before = 16, __extra_after = 8 };
+  // Size of space used to store size.  Note
+  // that this must be large enough to preserve
+  // alignment.
+  static size_t _STLP_CALL __extra_before_chunk() {
+    return (long)__extra_before/sizeof(value_type)+
+      (size_t)((long)__extra_before%sizeof(value_type)>0);
+  }
+  static size_t _STLP_CALL __extra_after_chunk() {
+    return (long)__extra_after/sizeof(value_type)+
+      (size_t)((long)__extra_after%sizeof(value_type)>0);
+  }
+public:
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+  template <class _Tp1> struct rebind {
+    typedef __allocator< _Tp1, __debug_alloc<_Alloc> > other;
+  };
+# endif
+  __debug_alloc() {}
+  ~__debug_alloc() {}
+  static void * _STLP_CALL allocate(size_t);
+  static void _STLP_CALL deallocate(void *, size_t);
+};
+
+
+// Default node allocator.
+// With a reasonable compiler, this should be roughly as fast as the
+// original STL class-specific allocators, but with less fragmentation.
+// Default_alloc_template parameters are experimental and MAY
+// DISAPPEAR in the future.  Clients should just use alloc for now.
+//
+// Important implementation properties:
+// 1. If the client request an object of size > _MAX_BYTES, the resulting
+//    object will be obtained directly from malloc.
+// 2. In all other cases, we allocate an object of size exactly
+//    _S_round_up(requested_size).  Thus the client has enough size
+//    information that we can return the object to the proper free list
+//    without permanently losing part of the object.
+//
+
+// The first template parameter specifies whether more than one thread
+// may use this allocator.  It is safe to allocate an object from
+// one instance of a default_alloc and deallocate it with another
+// one.  This effectively transfers its ownership to the second one.
+// This may have undesirable effects on reference locality.
+// The second parameter is unreferenced and serves only to allow the
+// creation of multiple default_alloc instances.
+
+# if defined(__OS400__)
+enum {_ALIGN = 16, _ALIGN_SHIFT=4, _MAX_BYTES = 256};
+#  define  _STLP_NFREELISTS 16
+# else
+enum {_ALIGN = 8, _ALIGN_SHIFT=3, _MAX_BYTES = 128};
+#  define  _STLP_NFREELISTS 16
+# endif /* __OS400__ */
+
+class _STLP_CLASS_DECLSPEC _Node_alloc_obj {
+public:
+    _Node_alloc_obj * _M_free_list_link;
+};
+
+template <bool __threads, int __inst>
+class __node_alloc {
+  _STLP_PRIVATE:
+  static inline size_t _STLP_CALL _S_round_up(size_t __bytes) { return (((__bytes) + (size_t)_ALIGN-1) & ~((size_t)_ALIGN - 1)); }
+  typedef _Node_alloc_obj _Obj;
+private:
+  // Returns an object of size __n, and optionally adds to size __n free list.
+  static void*  _STLP_CALL _S_refill(size_t __n);
+  // Allocates a chunk for nobjs of size size.  nobjs may be reduced
+  // if it is inconvenient to allocate the requested number.
+  static char*  _STLP_CALL _S_chunk_alloc(size_t __p_size, int& __nobjs);
+  // Chunk allocation state.
+  static _Node_alloc_obj * _STLP_VOLATILE _S_free_list[_STLP_NFREELISTS]; 
+  static char* _S_start_free;
+  static char* _S_end_free;
+  static size_t _S_heap_size;
+  static void * _STLP_CALL _M_allocate(size_t __n);
+  /* __p may not be 0 */
+  static void _STLP_CALL _M_deallocate(void *__p, size_t __n);
+public:
+  // this one is needed for proper simple_alloc wrapping
+  typedef char value_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+  template <class _Tp1> struct rebind {
+    typedef __allocator<_Tp1, __node_alloc<__threads, __inst> > other;
+  };
+# endif
+  /* __n must be > 0      */
+  static void * _STLP_CALL allocate(size_t __n) { return (__n > (size_t)_MAX_BYTES) ?  __stl_new(__n) : _M_allocate(__n); }
+  /* __p may not be 0 */
+  static void _STLP_CALL deallocate(void *__p, size_t __n) { if (__n > (size_t)_MAX_BYTES) __stl_delete(__p); else _M_deallocate(__p, __n); }
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS __malloc_alloc<0>;
+_STLP_EXPORT_TEMPLATE_CLASS __node_alloc<_STLP_NODE_ALLOCATOR_THREADS, 0>;
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+typedef __node_alloc<_STLP_NODE_ALLOCATOR_THREADS, 0> _Node_alloc;
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<_Node_alloc>;
+_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__new_alloc>;
+_STLP_EXPORT_TEMPLATE_CLASS __debug_alloc<__malloc_alloc<0> >;
+# endif
+
+# if defined (_STLP_USE_PERTHREAD_ALLOC)
+
+_STLP_END_NAMESPACE
+// include additional header here
+# include <stl/_pthread_alloc.h>
+_STLP_BEGIN_NAMESPACE
+
+#  if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<__pthread_alloc> __sgi_alloc;
+#  else
+typedef __pthread_alloc __sgi_alloc;
+#  endif /* _STLP_DEBUG_ALLOC */
+
+typedef __pthread_alloc __single_client_alloc;
+typedef __pthread_alloc __multithreaded_alloc;
+
+# else
+
+# if defined ( _STLP_USE_NEWALLOC )
+
+#  if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<__new_alloc> __sgi_alloc;
+#  else
+typedef __new_alloc __sgi_alloc;
+#  endif /* _STLP_DEBUG_ALLOC */
+
+typedef __new_alloc __single_client_alloc;
+typedef __new_alloc __multithreaded_alloc;
+
+#  elif defined (_STLP_USE_MALLOC)
+
+#   if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<__malloc_alloc<0> > __sgi_alloc;
+#   else
+typedef __malloc_alloc<0> __sgi_alloc;
+#   endif /* _STLP_DEBUG_ALLOC */
+
+typedef __malloc_alloc<0> __single_client_alloc;
+typedef __malloc_alloc<0> __multithreaded_alloc;
+
+# else
+
+#   if defined ( _STLP_DEBUG_ALLOC )
+typedef __debug_alloc<_Node_alloc> __sgi_alloc;
+#   else
+typedef _Node_alloc __sgi_alloc;
+#   endif
+
+typedef __node_alloc<false, 0> __single_client_alloc;
+typedef __node_alloc<true, 0>  __multithreaded_alloc;
+
+#  endif /* _STLP_USE_NEWALLOC */
+# endif /* PTHREAD_ALLOC */
+
+// This implements allocators as specified in the C++ standard.  
+//
+// Note that standard-conforming allocators use many language features
+// that are not yet widely implemented.  In particular, they rely on
+// member templates, partial specialization, partial ordering of function
+// templates, the typename keyword, and the use of the template keyword
+// to refer to a template member of a dependent type.
+
+template <class _Tp>
+class allocator {
+public:
+
+  typedef _Tp        value_type;
+  typedef value_type *       pointer;
+  typedef const _Tp* const_pointer;
+  typedef _Tp&       reference;
+  typedef const _Tp& const_reference;
+  typedef size_t     size_type;
+  typedef ptrdiff_t  difference_type;
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+  template <class _Tp1> struct rebind {
+    typedef allocator<_Tp1> other;
+  };
+# endif
+  allocator() _STLP_NOTHROW {}
+ # if defined (_STLP_MEMBER_TEMPLATES)
+  template <class _Tp1> allocator(const allocator<_Tp1>&) _STLP_NOTHROW {}
+ # endif    
+  allocator(const allocator<_Tp>&) _STLP_NOTHROW {}
+  ~allocator() _STLP_NOTHROW {}
+  pointer address(reference __x) const { return &__x; }
+  const_pointer address(const_reference __x) const { return &__x; }
+  // __n is permitted to be 0.  The C++ standard says nothing about what the return value is when __n == 0.
+  _Tp* allocate(size_type __n, const void* = 0) { 
+    return __n != 0 ? __REINTERPRET_CAST(value_type*,__sgi_alloc::allocate(__n * sizeof(value_type))) : 0;
+  }
+  // __p is permitted to be a null pointer, only if n==0.
+  void deallocate(pointer __p, size_type __n) {
+    _STLP_ASSERT( (__p == 0) == (__n == 0) )
+      if (__p != 0) __sgi_alloc::deallocate((void*)__p, __n * sizeof(value_type));
+  }
+  // backwards compatibility
+  void deallocate(pointer __p) const {  if (__p != 0) __sgi_alloc::deallocate((void*)__p, sizeof(value_type)); }
+  size_type max_size() const _STLP_NOTHROW  { return size_t(-1) / sizeof(value_type); }
+  void construct(pointer __p, const _Tp& __val) { _STLP_STD::_Construct(__p, __val); }
+  void destroy(pointer __p) { _STLP_STD::_Destroy(__p); }
+# if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))
+  template <class _T2> bool operator==(const allocator<_T2>&) const  _STLP_NOTHROW { return true; }
+  template <class _T2> bool operator!=(const allocator<_T2>&) const _STLP_NOTHROW { return false; }
+# endif
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC allocator<void> {
+public:
+  typedef size_t      size_type;
+  typedef ptrdiff_t   difference_type;
+  typedef void*       pointer;
+  typedef const void* const_pointer;
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+  typedef void        value_type;
+# endif
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+  template <class _Tp1> struct rebind {
+    typedef allocator<_Tp1> other;
+  };
+# endif
+# if defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__))		//*ty 03/24/2001 - MPW compilers get confused on these operator definitions
+  template <class _T2> bool operator==(const allocator<_T2>&) const _STLP_NOTHROW { return true; }
+  template <class _T2> bool operator!=(const allocator<_T2>&) const _STLP_NOTHROW { return false; }
+# endif
+};
+
+#if !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)))		//*ty 03/24/2001 - MPW compilers get confused on these operator definitions
+template <class _T1, class _T2> inline bool  _STLP_CALL operator==(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW { return true; }
+template <class _T1, class _T2> inline bool  _STLP_CALL operator!=(const allocator<_T1>&, const allocator<_T2>&) _STLP_NOTHROW { return false; }
+#endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS allocator<char>;
+#  if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS allocator<wchar_t>;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// Another allocator adaptor: _Alloc_traits.  This serves two
+// purposes.  First, make it possible to write containers that can use
+// either SGI-style allocators or standard-conforming allocator.
+
+// The fully general version.
+template <class _Tp, class _Allocator>
+struct _Alloc_traits
+{
+  typedef _Allocator _Orig;
+# if defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM) 
+  typedef typename _Allocator::_STLP_TEMPLATE rebind<_Tp> _Rebind_type;
+  typedef typename _Rebind_type::other  allocator_type;
+  static allocator_type create_allocator(const _Orig& __a) { return allocator_type(__a); }
+# else
+  // this is not actually true, used only to pass this type through
+  // to dynamic overload selection in _STLP_alloc_proxy methods
+  typedef _Allocator allocator_type;
+# endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+};
+
+#ifndef _STLP_FORCE_ALLOCATORS
+#define _STLP_FORCE_ALLOCATORS(a,y) 
+#endif
+
+#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+// The version for the default allocator, for rare occasion when we have partial spec w/o member template classes
+template <class _Tp, class _Tp1>
+struct _Alloc_traits<_Tp, allocator<_Tp1> > {
+  typedef allocator<_Tp1> _Orig;
+  typedef allocator<_Tp> allocator_type;
+  static allocator_type create_allocator(const allocator<_Tp1 >& __a) { return allocator_type(__a); }
+};
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+/* macro to convert the allocator for initialization
+ * not using MEMBER_TEMPLATE_CLASSES as it should work given template constructor  */
+#if defined (_STLP_MEMBER_TEMPLATES) || ! defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+/* if _STLP_NO_TEMPLATE_CONVERSIONS is set, the member template constructor is
+ * not used implicitly to convert allocator parameter, so let us do it explicitly */
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES) && defined (_STLP_NO_TEMPLATE_CONVERSIONS)
+#  define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
+# else
+#  define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __a
+# endif
+/* else convert, but only if partial specialization works, since else
+ * Container::allocator_type won't be different */
+#else 
+#  define _STLP_CONVERT_ALLOCATOR(__a, _Tp) __stl_alloc_create(__a,(_Tp*)0)
+#endif
+
+# if defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM) 
+template <class _Tp, class _Alloc>
+inline _STLP_TYPENAME_ON_RETURN_TYPE _Alloc_traits<_Tp, _Alloc>::allocator_type  _STLP_CALL
+__stl_alloc_create(const _Alloc& __a, const _Tp*) {
+  typedef typename _Alloc::_STLP_TEMPLATE rebind<_Tp>::other _Rebound_type;
+  return _Rebound_type(__a);
+}
+#else
+// If custom allocators are being used without member template classes support :
+// user (on purpose) is forced to define rebind/get operations !!!
+template <class _Tp1, class _Tp2>
+inline allocator<_Tp2>& _STLP_CALL
+__stl_alloc_rebind(allocator<_Tp1>& __a, const _Tp2*) {  return (allocator<_Tp2>&)(__a); }
+template <class _Tp1, class _Tp2>
+inline allocator<_Tp2> _STLP_CALL
+__stl_alloc_create(const allocator<_Tp1>&, const _Tp2*) { return allocator<_Tp2>(); }
+#endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+
+# ifdef _STLP_USE_RAW_SGI_ALLOCATORS
+// move obsolete stuff out of the way
+# include <stl/_alloc_old.h>
+# endif
+
+// inheritance is being used for EBO optimization
+template <class _Value, class _Tp, class _MaybeReboundAlloc>
+class _STLP_alloc_proxy : public _MaybeReboundAlloc {
+private:
+  typedef _MaybeReboundAlloc _Base;
+  typedef _STLP_alloc_proxy<_Value, _Tp, _MaybeReboundAlloc> _Self;
+public:
+  _Value _M_data;
+  inline _STLP_alloc_proxy(const _MaybeReboundAlloc& __a, _Value __p) : _MaybeReboundAlloc(__a), _M_data(__p) {}
+
+# if 0
+  inline _STLP_alloc_proxy(const _Self& __x) : _MaybeReboundAlloc(__x), _M_data(__x._M_data) {} 
+  // construction/destruction
+  inline _Self& operator = (const _Self& __x) { 
+    *(_MaybeReboundAlloc*)this = *(_MaybeReboundAlloc*)__x;
+    _M_data = __x._M_data; return *this; 
+  } 
+  inline _Self& operator = (const _Base& __x) { ((_Base&)*this) = __x; return *this; } 
+# endif
+  // Unified interface to perform allocate()/deallocate() with limited
+  // language support
+#if ! defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+  // else it is rebound already, and allocate() member is accessible
+  inline _Tp* allocate(size_t __n) { 
+    return __stl_alloc_rebind(__STATIC_CAST(_Base&,*this),(_Tp*)0).allocate(__n,0); 
+  }
+  inline void deallocate(_Tp* __p, size_t __n) { 
+    __stl_alloc_rebind(__STATIC_CAST(_Base&, *this),(_Tp*)0).deallocate(__p, __n); 
+  }
+#endif /* !_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<char *,char,allocator<char> >;
+#  if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<wchar_t *,wchar_t,allocator<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# undef _STLP_NODE_ALLOCATOR_THREADS
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_alloc.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ALLOC_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_alloc_old.h b/src/STLport/stl/_alloc_old.h
new file mode 100644
index 0000000..da8c84c
--- /dev/null
+++ b/src/STLport/stl/_alloc_old.h
@@ -0,0 +1,303 @@
+template<class _Tp, class _Alloc>
+class __simple_alloc {
+  typedef _Alloc __alloc_type;
+public:
+  typedef typename _Alloc::value_type __alloc_value_type;
+  typedef _Tp value_type;
+  static size_t  _STLP_CALL __chunk(size_t __n) { 
+    return (sizeof(__alloc_value_type)==sizeof(value_type)) ? __n : 
+	    ((__n*sizeof(value_type)+sizeof(__alloc_value_type)-1)/sizeof(__alloc_value_type));
+  }
+  static _Tp*  _STLP_CALL allocate(size_t __n) { return 0 == __n ? 0 : (_Tp*) __alloc_type::allocate(__chunk(__n)); }
+  static void  _STLP_CALL deallocate(_Tp * __p, size_t __n) { 
+    __alloc_type::deallocate((__alloc_value_type*)__p, __chunk(__n)); }
+};
+
+// Allocator adaptor to turn an SGI-style allocator (e.g. alloc, malloc_alloc)
+// into a standard-conforming allocator.   Note that this adaptor does
+// *not* assume that all objects of the underlying alloc class are
+// identical, nor does it assume that all of the underlying alloc's
+// member functions are static member functions.  Note, also, that 
+// __allocator<_Tp, alloc> is essentially the same thing as allocator<_Tp>.
+
+template <class _Tp, class _Alloc>
+struct __allocator : public _Alloc {
+  typedef _Alloc __underlying_alloc;
+
+  typedef size_t    size_type;
+  typedef ptrdiff_t difference_type;
+  typedef _Tp*       pointer;
+  typedef const _Tp* const_pointer;
+  typedef _Tp&       reference;
+  typedef const _Tp& const_reference;
+  typedef _Tp        value_type;
+
+# if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+  template <class _Tp1> struct rebind {
+    typedef __allocator<_Tp1, _Alloc> other;
+  };
+# endif
+  __allocator() _STLP_NOTHROW {}
+  __allocator(const _Alloc& ) _STLP_NOTHROW {}
+  __allocator(const __allocator<_Tp, _Alloc>& __a) _STLP_NOTHROW
+    : _Alloc(__a) {}
+# if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+  template <class _Tp1> 
+  __allocator(const __allocator<_Tp1, _Alloc>& __a) _STLP_NOTHROW
+    : _Alloc(__a) {}
+# endif
+# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG
+  ~__allocator() _STLP_NOTHROW {}
+# endif
+  pointer address(reference __x) const { return &__x; }
+
+# if !defined (__WATCOM_CPLUSPLUS__)
+  const_pointer address(const_reference __x) const { return &__x; }
+# endif
+
+  // __n is permitted to be 0.
+  _Tp* allocate(size_type __n, const void* = 0) {
+    return __n != 0 
+        ? __STATIC_CAST(_Tp*,__underlying_alloc::allocate(__n * sizeof(_Tp))) 
+        : 0;
+  }
+
+  // __p is not permitted to be a null pointer.
+  void deallocate(pointer __p, size_type __n)
+    { if (__p) __underlying_alloc::deallocate(__p, __n * sizeof(_Tp)); }
+
+  size_type max_size() const _STLP_NOTHROW 
+    { return size_t(-1) / sizeof(_Tp); }
+
+  void construct(pointer __p, const _Tp& __val) { _STLP_STD::_Construct(__p, __val); }
+  void destroy(pointer __p) { _STLP_STD::_Destroy(__p); }
+
+  const __underlying_alloc& __get_underlying_alloc() const { return *this; }
+};
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+template <class _Alloc>
+class __allocator<void, _Alloc> {
+  typedef size_t      size_type;
+  typedef ptrdiff_t   difference_type;
+  typedef void*       pointer;
+  typedef const void* const_pointer;
+  typedef void        value_type;
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+  template <class _Tp1> struct rebind {
+    typedef __allocator<_Tp1, _Alloc> other;
+  };
+#endif
+};
+#endif
+
+template <class _Tp, class _Alloc>
+inline bool  _STLP_CALL operator==(const __allocator<_Tp, _Alloc>& __a1,
+                                   const __allocator<_Tp, _Alloc>& __a2)
+{
+  return __a1.__get_underlying_alloc() == __a2.__get_underlying_alloc();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+template <class _Tp, class _Alloc>
+inline bool  _STLP_CALL operator!=(const __allocator<_Tp, _Alloc>& __a1,
+                                   const __allocator<_Tp, _Alloc>& __a2)
+{
+  return __a1.__get_underlying_alloc() != __a2.__get_underlying_alloc();
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+// Comparison operators for all of the predifined SGI-style allocators.
+// This ensures that __allocator<malloc_alloc> (for example) will
+// work correctly.
+
+#ifndef _STLP_NON_TYPE_TMPL_PARAM_BUG
+template <int inst>
+inline bool  _STLP_CALL operator==(const __malloc_alloc<inst>&,
+                                   const __malloc_alloc<inst>&)
+{
+  return true;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <int __inst>
+inline bool  _STLP_CALL operator!=(const __malloc_alloc<__inst>&,
+                                   const __malloc_alloc<__inst>&)
+{
+  return false;
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+inline bool _STLP_CALL operator==(const __new_alloc&, const __new_alloc&) { return true; }
+
+# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+inline bool _STLP_CALL operator!=(const __new_alloc&, const __new_alloc&) { return false; }
+# endif
+
+
+template <bool __threads, int __inst>
+inline bool  _STLP_CALL operator==(const __node_alloc<__threads, __inst>&,
+                                   const __node_alloc<__threads, __inst>&)
+{
+  return true;
+}
+
+#if defined( _STLP_FUNCTION_TMPL_PARTIAL_ORDER )
+
+template <bool __threads, int __inst>
+inline bool  _STLP_CALL operator!=(const __node_alloc<__threads, __inst>&,
+                                   const __node_alloc<__threads, __inst>&)
+{
+  return false;
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+
+template <class _Alloc>
+inline bool  _STLP_CALL operator==(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) {  return true; }
+# ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+template <class _Alloc>
+inline bool  _STLP_CALL operator!=(const __debug_alloc<_Alloc>&, const __debug_alloc<_Alloc>&) {  return false; }
+# endif
+
+#if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+
+// Versions for the predefined SGI-style allocators.
+template <class _Tp, int __inst>
+struct _Alloc_traits<_Tp, __malloc_alloc<__inst> > {
+  typedef __allocator<_Tp, __malloc_alloc<__inst> > allocator_type;
+};
+
+
+template <class _Tp, bool __threads, int __inst>
+struct _Alloc_traits<_Tp, __node_alloc<__threads, __inst> > {
+  typedef __allocator<_Tp, __node_alloc<__threads, __inst> > 
+          allocator_type;
+};
+
+template <class _Tp, class _Alloc>
+struct _Alloc_traits<_Tp, __debug_alloc<_Alloc> > {
+  typedef __allocator<_Tp, __debug_alloc<_Alloc> > allocator_type;
+};
+
+// Versions for the __allocator adaptor used with the predefined
+// SGI-style allocators.
+
+template <class _Tp, class _Tp1, class _Alloc>
+struct _Alloc_traits<_Tp, __allocator<_Tp1, _Alloc > > {
+  typedef __allocator<_Tp, _Alloc > allocator_type;
+};
+
+#endif
+
+#if !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM) 
+
+// Versions for the predefined SGI-style allocators.
+
+
+#  if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+
+typedef __malloc_alloc<0> __malloc_alloc_dfl;
+typedef __node_alloc<false, 0> __single_client_node_alloc;
+typedef __node_alloc<true, 0>  __multithreaded_node_alloc;
+
+template <class _Tp>
+inline __allocator<_Tp, __malloc_alloc_dfl >& _STLP_CALL
+__stl_alloc_rebind(__malloc_alloc_dfl& __a, const _Tp*) {
+  return (__allocator<_Tp, __malloc_alloc_dfl >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __single_client_node_alloc >& _STLP_CALL
+__stl_alloc_rebind(__single_client_node_alloc& __a, const _Tp*) {
+  return (__allocator<_Tp, __single_client_node_alloc >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __multithreaded_node_alloc >& _STLP_CALL
+__stl_alloc_rebind(__multithreaded_node_alloc& __a, const _Tp*) {
+  return (__allocator<_Tp, __multithreaded_node_alloc >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __malloc_alloc_dfl > _STLP_CALL
+__stl_alloc_create(const __malloc_alloc_dfl&, const _Tp*) {
+  return __allocator<_Tp, __malloc_alloc_dfl > ();
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __single_client_node_alloc > _STLP_CALL
+__stl_alloc_create(const __single_client_node_alloc&, const _Tp*) {
+  return __allocator<_Tp, __single_client_node_alloc >();
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __multithreaded_node_alloc > _STLP_CALL
+__stl_alloc_create(const __multithreaded_node_alloc&, const _Tp*) {
+  return __allocator<_Tp, __multithreaded_node_alloc >();
+}
+
+#  else
+
+template <class _Tp, int __inst>
+inline __allocator<_Tp, __malloc_alloc<__inst> >& _STLP_CALL
+__stl_alloc_rebind(__malloc_alloc<__inst>& __a, const _Tp*) {
+  return (__allocator<_Tp, __malloc_alloc<__inst> >&)__a;
+}
+
+template <class _Tp, bool __threads, int __inst>
+inline __allocator<_Tp, __node_alloc<__threads, __inst> >& _STLP_CALL
+__stl_alloc_rebind(__node_alloc<__threads, __inst>& __a, const _Tp*) {
+  return (__allocator<_Tp, __node_alloc<__threads, __inst> >&)__a;
+}
+
+template <class _Tp, int __inst>
+inline __allocator<_Tp, __malloc_alloc<__inst> > _STLP_CALL
+__stl_alloc_create(const __malloc_alloc<__inst>&, const _Tp*) {
+  return __allocator<_Tp, __malloc_alloc<__inst> >();
+}
+
+template <class _Tp, bool __threads, int __inst>
+inline __allocator<_Tp, __node_alloc<__threads, __inst> > _STLP_CALL
+__stl_alloc_create(const __node_alloc<__threads, __inst>&, const _Tp*) {
+  return __allocator<_Tp, __node_alloc<__threads, __inst> >();
+}
+
+#  endif
+
+template <class _Tp, class _Alloc>
+inline __allocator<_Tp, __debug_alloc<_Alloc> > _STLP_CALL
+__stl_alloc_create(const __debug_alloc<_Alloc>&, const _Tp*) {
+  return __allocator<_Tp, __debug_alloc<_Alloc> >();
+}
+template <class _Tp, class _Alloc>
+inline __allocator<_Tp, __debug_alloc<_Alloc> >& _STLP_CALL
+__stl_alloc_rebind(__debug_alloc<_Alloc>& __a, const _Tp*) {
+  return (__allocator<_Tp, __debug_alloc<_Alloc> >&)__a;
+}
+
+template <class _Tp>
+inline __allocator<_Tp, __new_alloc > _STLP_CALL
+__stl_alloc_create(const __new_alloc&, const _Tp*) {
+  return __allocator<_Tp, __new_alloc >();
+}
+template <class _Tp>
+inline __allocator<_Tp, __new_alloc >&  _STLP_CALL
+__stl_alloc_rebind(__new_alloc& __a, const _Tp*) {
+  return (__allocator<_Tp, __new_alloc >&)__a;
+}
+
+template <class _Tp1, class _Alloc, class _Tp2>
+inline __allocator<_Tp2, _Alloc>& _STLP_CALL
+__stl_alloc_rebind(__allocator<_Tp1, _Alloc>& __a, const _Tp2*) {
+  return (__allocator<_Tp2, _Alloc>&)__a;
+}
+
+template <class _Tp1, class _Alloc, class _Tp2>
+inline __allocator<_Tp2, _Alloc> _STLP_CALL
+__stl_alloc_create(const __allocator<_Tp1, _Alloc>&, const _Tp2*) {
+  return __allocator<_Tp2, _Alloc>();
+}
+#endif
diff --git a/src/STLport/stl/_auto_ptr.h b/src/STLport/stl/_auto_ptr.h
new file mode 100644
index 0000000..98d4ef2
--- /dev/null
+++ b/src/STLport/stl/_auto_ptr.h
@@ -0,0 +1,129 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_AUTO_PTR_H
+# define _STLP_AUTO_PTR_H
+
+_STLP_BEGIN_NAMESPACE
+// implementation primitive
+class __ptr_base {
+public:
+  void* _M_p;
+  void  __set(const void* p) { _M_p = __CONST_CAST(void*,p); }
+  void  __set(void* p) { _M_p = p; }
+};
+
+template <class _Tp> class auto_ptr_ref {
+public:
+  __ptr_base& _M_r;
+  _Tp* const _M_p;
+
+  auto_ptr_ref(__ptr_base& __r, _Tp* __p) : _M_r(__r), _M_p(__p) {  }
+
+  _Tp* release() const { _M_r.__set((void*)0); return _M_p; }
+
+};
+
+template<class _Tp> class auto_ptr :  public __ptr_base {
+public:	
+  typedef _Tp element_type;
+  typedef auto_ptr<_Tp>           _Self;
+  
+  _Tp* release() {  
+    _Tp* __px = this->get(); 
+    this->_M_p = 0; 
+    return __px; 
+  }
+  
+  void reset(_Tp* __px=0) {
+    _Tp* __pt = this->get();
+    if (__px != __pt) 
+      delete __pt; 
+    this->__set(__px); 
+  }
+
+  _Tp* get() const { return __REINTERPRET_CAST(_Tp*,__CONST_CAST(void*,_M_p)); } 
+
+# if !defined (_STLP_NO_ARROW_OPERATOR)
+  _Tp* operator->() const { 
+    _STLP_VERBOSE_ASSERT(get()!=0, _StlMsg_AUTO_PTR_NULL)
+    return get(); 
+  }
+# endif
+  _Tp& operator*() const  { 
+    _STLP_VERBOSE_ASSERT(get()!=0, _StlMsg_AUTO_PTR_NULL)
+    return *get(); 
+  }
+  
+  auto_ptr() { this->_M_p = 0; }
+  
+  explicit auto_ptr(_Tp* __px) { this->__set(__px); }
+  
+#if defined (_STLP_MEMBER_TEMPLATES)
+# if !defined (_STLP_NO_TEMPLATE_CONVERSIONS)
+  template<class _Tp1> auto_ptr(auto_ptr<_Tp1>& __r) {
+    _Tp* __conversionCheck = __r.release();
+    this->__set(__conversionCheck);
+  }
+# endif	
+  template<class _Tp1> auto_ptr<_Tp>& operator=(auto_ptr<_Tp1>& __r) {
+    _Tp* __conversionCheck = __r.release();
+    reset(__conversionCheck);
+    return *this;
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+  
+  auto_ptr(_Self& __r) { this->__set(__r.release()); }
+
+  _Self& operator=(_Self& __r)  {
+    reset(__r.release());
+    return *this;
+  }
+
+  ~auto_ptr() { /* boris : reset(0) might be better */ delete this->get(); }
+	
+  auto_ptr(auto_ptr_ref<_Tp> __r) {
+    this->__set(__r.release());
+  }
+	
+  _Self& operator=(auto_ptr_ref<_Tp> __r) {
+    reset(__r.release());
+    return *this;
+  }
+  
+# if defined(_STLP_MEMBER_TEMPLATES) && !defined(_STLP_NO_TEMPLATE_CONVERSIONS)
+  template<class _Tp1> operator auto_ptr_ref<_Tp1>() {
+    return auto_ptr_ref<_Tp1>(*this, this->get());
+  }
+  template<class _Tp1> operator auto_ptr<_Tp1>() {
+    return auto_ptr<_Tp1>(release());
+  }
+# else
+  operator auto_ptr_ref<_Tp>()
+  { return auto_ptr_ref<_Tp>(*this, this->get()); }
+# endif
+	
+};
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_AUTO_PTR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_bitset.c b/src/STLport/stl/_bitset.c
new file mode 100644
index 0000000..11990a8
--- /dev/null
+++ b/src/STLport/stl/_bitset.c
@@ -0,0 +1,407 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BITSET_C
+# define  _STLP_BITSET_C
+
+# ifndef _STLP_BITSET_H
+#  include <stl/_bitset.h>
+# endif
+
+# define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
+
+_STLP_BEGIN_NAMESPACE
+
+//
+// Definitions of non-inline functions from _Base_bitset.
+// 
+
+
+template<size_t _Nw>
+void _Base_bitset<_Nw>::_M_do_left_shift(size_t __shift) 
+{
+
+  if (__shift != 0) {
+    const size_t __wshift = __shift / __BITS_PER_WORD;
+    const size_t __offset = __shift % __BITS_PER_WORD;
+
+    if (__offset == 0)
+      for (size_t __n = _Nw - 1; __n >= __wshift; --__n)
+        _M_w[__n] = _M_w[__n - __wshift];
+
+    else {
+      const size_t __sub_offset = __BITS_PER_WORD - __offset;
+      for (size_t __n = _Nw - 1; __n > __wshift; --__n)
+        _M_w[__n] = (_M_w[__n - __wshift] << __offset) | 
+                    (_M_w[__n - __wshift - 1] >> __sub_offset);
+      _M_w[__wshift] = _M_w[0] << __offset;
+    }
+
+    fill(_M_w + 0, _M_w + __wshift, __STATIC_CAST(_WordT,0));
+  }
+}
+
+template<size_t _Nw>
+void _Base_bitset<_Nw>::_M_do_right_shift(size_t __shift) 
+{
+
+  if (__shift != 0) {
+    const size_t __wshift = __shift / __BITS_PER_WORD;
+    const size_t __offset = __shift % __BITS_PER_WORD;
+    const size_t __limit = _Nw - __wshift - 1;
+
+    if (__offset == 0)
+      for (size_t __n = 0; __n <= __limit; ++__n)
+        _M_w[__n] = _M_w[__n + __wshift];
+
+    else {
+      const size_t __sub_offset = __BITS_PER_WORD - __offset;
+      for (size_t __n = 0; __n < __limit; ++__n)
+        _M_w[__n] = (_M_w[__n + __wshift] >> __offset) |
+                    (_M_w[__n + __wshift + 1] << __sub_offset);
+      _M_w[__limit] = _M_w[_Nw-1] >> __offset;
+    }
+
+    fill(_M_w + __limit + 1, _M_w + _Nw, __STATIC_CAST(_WordT,0));
+  }
+}
+
+template<size_t _Nw>
+unsigned long _Base_bitset<_Nw>::_M_do_to_ulong() const
+{
+  for (size_t __i = 1; __i < _Nw; ++__i) 
+    if (_M_w[__i]) 
+      __stl_throw_overflow_error("bitset");
+  return _M_w[0];
+} // End _M_do_to_ulong
+
+template<size_t _Nw>
+size_t _Base_bitset<_Nw>::_M_do_find_first(size_t __not_found) const 
+{
+  for ( size_t __i = 0; __i < _Nw; __i++ ) {
+    _WordT __thisword = _M_w[__i];
+    if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+      // find byte within word
+      for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+        unsigned char __this_byte
+          = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+        if ( __this_byte )
+          return __i*__BITS_PER_WORD + __j*CHAR_BIT +
+            _Bs_G<bool>::_S_first_one[__this_byte];
+
+        __thisword >>= CHAR_BIT;
+      }
+    }
+  }
+  // not found, so return an indication of failure.
+  return __not_found;
+}
+
+template<size_t _Nw>
+size_t
+_Base_bitset<_Nw>::_M_do_find_next(size_t __prev, 
+                                   size_t __not_found) const
+{
+  // make bound inclusive
+  ++__prev;
+
+  // check out of bounds
+  if ( __prev >= _Nw * __BITS_PER_WORD )
+    return __not_found;
+
+    // search first word
+  size_t __i = _S_whichword(__prev);
+  _WordT __thisword = _M_w[__i];
+
+    // mask off bits below bound
+  __thisword &= (~__STATIC_CAST(_WordT,0)) << _S_whichbit(__prev);
+
+  if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+    // find byte within word
+    // get first byte into place
+    __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
+    for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) {
+      unsigned char __this_byte
+        = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+      if ( __this_byte )
+        return __i*__BITS_PER_WORD + __j*CHAR_BIT +
+          _Bs_G<bool>::_S_first_one[__this_byte];
+
+      __thisword >>= CHAR_BIT;
+    }
+  }
+
+  // check subsequent words
+  __i++;
+  for ( ; __i < _Nw; __i++ ) {
+    /* _WordT */ __thisword = _M_w[__i];
+    if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+      // find byte within word
+      for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+        unsigned char __this_byte
+          = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+        if ( __this_byte )
+          return __i*__BITS_PER_WORD + __j*CHAR_BIT +
+            _Bs_G<bool>::_S_first_one[__this_byte];
+
+        __thisword >>= CHAR_BIT;
+      }
+    }
+  }
+
+  // not found, so return an indication of failure.
+  return __not_found;
+} // end _M_do_find_next
+
+
+
+# if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+
+#if defined ( _STLP_USE_NEW_IOSTREAMS)
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x)
+{
+  basic_string<_CharT, _Traits> __tmp;
+  __tmp.reserve(_Nb);
+
+  // Skip whitespace
+  typename basic_istream<_CharT, _Traits>::sentry __sentry(__is);
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
+    for (size_t __i = 0; __i < _Nb; ++__i) {
+      static typename _Traits::int_type __eof = _Traits::eof();
+
+      typename _Traits::int_type __c1 = __buf->sbumpc();
+      if (_Traits::eq_int_type(__c1, __eof)) {
+        __is.setstate(ios_base::eofbit);
+        break;
+      }
+      else {
+        char __c2 = _Traits::to_char_type(__c1);
+        char __c  = __is.narrow(__c2, '*');
+
+        if (__c == '0' || __c == '1')
+          __tmp.push_back(__c);
+        else if (_Traits::eq_int_type(__buf->sputbackc(__c2), __eof)) {
+          __is.setstate(ios_base::failbit);
+          break;
+        }
+      }
+    }
+
+    if (__tmp.empty())
+      __is.setstate(ios_base::failbit);
+    else
+      __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb);
+  }
+
+  return __is;
+}
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os,
+           const bitset<_Nb>& __x)
+{
+  basic_string<_CharT, _Traits> __tmp;
+  __x._M_copy_to_string(__tmp);
+  return __os << __tmp;
+}
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
+template <size_t _Nb>
+_ISTREAM_DLL& _STLP_CALL
+operator>>(_ISTREAM_DLL& __is, bitset<_Nb>& __x) {
+  string __tmp;
+  __tmp.reserve(_Nb);
+
+  // In new templatized iostreams, use istream::sentry
+  if (__is.flags() & ios::skipws) {
+    char __c;
+    do 
+      __is.get(__c);
+    while (__is && isspace(__c));
+    if (__is)
+      __is.putback(__c);
+  }
+
+  for (size_t __i = 0; __i < _Nb; ++__i) {
+    char __c;
+    __is.get(__c);
+
+    if (!__is)
+      break;
+    else if (__c != '0' && __c != '1') {
+      __is.putback(__c);
+      break;
+    }
+    else
+      __tmp.push_back(__c);
+  }
+
+  if (__tmp.empty()) 
+    __is.clear(__is.rdstate() | ios::failbit);
+  else
+    __x._M_copy_from_string(__tmp, __STATIC_CAST(size_t,0), _Nb);
+
+  return __is;
+}
+
+# endif /* _STLP_USE_NEW_IOSTREAMS */
+
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+// ------------------------------------------------------------
+// Lookup tables for find and count operations.
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template<class _Dummy>
+unsigned char _Bs_G<_Dummy>::_S_bit_count[256] = {
+# else
+unsigned char _Bs_G<bool>::_S_bit_count[256] _STLP_WEAK = {
+# endif
+  0, /*   0 */ 1, /*   1 */ 1, /*   2 */ 2, /*   3 */ 1, /*   4 */
+  2, /*   5 */ 2, /*   6 */ 3, /*   7 */ 1, /*   8 */ 2, /*   9 */
+  2, /*  10 */ 3, /*  11 */ 2, /*  12 */ 3, /*  13 */ 3, /*  14 */
+  4, /*  15 */ 1, /*  16 */ 2, /*  17 */ 2, /*  18 */ 3, /*  19 */
+  2, /*  20 */ 3, /*  21 */ 3, /*  22 */ 4, /*  23 */ 2, /*  24 */
+  3, /*  25 */ 3, /*  26 */ 4, /*  27 */ 3, /*  28 */ 4, /*  29 */
+  4, /*  30 */ 5, /*  31 */ 1, /*  32 */ 2, /*  33 */ 2, /*  34 */
+  3, /*  35 */ 2, /*  36 */ 3, /*  37 */ 3, /*  38 */ 4, /*  39 */
+  2, /*  40 */ 3, /*  41 */ 3, /*  42 */ 4, /*  43 */ 3, /*  44 */
+  4, /*  45 */ 4, /*  46 */ 5, /*  47 */ 2, /*  48 */ 3, /*  49 */
+  3, /*  50 */ 4, /*  51 */ 3, /*  52 */ 4, /*  53 */ 4, /*  54 */
+  5, /*  55 */ 3, /*  56 */ 4, /*  57 */ 4, /*  58 */ 5, /*  59 */
+  4, /*  60 */ 5, /*  61 */ 5, /*  62 */ 6, /*  63 */ 1, /*  64 */
+  2, /*  65 */ 2, /*  66 */ 3, /*  67 */ 2, /*  68 */ 3, /*  69 */
+  3, /*  70 */ 4, /*  71 */ 2, /*  72 */ 3, /*  73 */ 3, /*  74 */
+  4, /*  75 */ 3, /*  76 */ 4, /*  77 */ 4, /*  78 */ 5, /*  79 */
+  2, /*  80 */ 3, /*  81 */ 3, /*  82 */ 4, /*  83 */ 3, /*  84 */
+  4, /*  85 */ 4, /*  86 */ 5, /*  87 */ 3, /*  88 */ 4, /*  89 */
+  4, /*  90 */ 5, /*  91 */ 4, /*  92 */ 5, /*  93 */ 5, /*  94 */
+  6, /*  95 */ 2, /*  96 */ 3, /*  97 */ 3, /*  98 */ 4, /*  99 */
+  3, /* 100 */ 4, /* 101 */ 4, /* 102 */ 5, /* 103 */ 3, /* 104 */
+  4, /* 105 */ 4, /* 106 */ 5, /* 107 */ 4, /* 108 */ 5, /* 109 */
+  5, /* 110 */ 6, /* 111 */ 3, /* 112 */ 4, /* 113 */ 4, /* 114 */
+  5, /* 115 */ 4, /* 116 */ 5, /* 117 */ 5, /* 118 */ 6, /* 119 */
+  4, /* 120 */ 5, /* 121 */ 5, /* 122 */ 6, /* 123 */ 5, /* 124 */
+  6, /* 125 */ 6, /* 126 */ 7, /* 127 */ 1, /* 128 */ 2, /* 129 */
+  2, /* 130 */ 3, /* 131 */ 2, /* 132 */ 3, /* 133 */ 3, /* 134 */
+  4, /* 135 */ 2, /* 136 */ 3, /* 137 */ 3, /* 138 */ 4, /* 139 */
+  3, /* 140 */ 4, /* 141 */ 4, /* 142 */ 5, /* 143 */ 2, /* 144 */
+  3, /* 145 */ 3, /* 146 */ 4, /* 147 */ 3, /* 148 */ 4, /* 149 */
+  4, /* 150 */ 5, /* 151 */ 3, /* 152 */ 4, /* 153 */ 4, /* 154 */
+  5, /* 155 */ 4, /* 156 */ 5, /* 157 */ 5, /* 158 */ 6, /* 159 */
+  2, /* 160 */ 3, /* 161 */ 3, /* 162 */ 4, /* 163 */ 3, /* 164 */
+  4, /* 165 */ 4, /* 166 */ 5, /* 167 */ 3, /* 168 */ 4, /* 169 */
+  4, /* 170 */ 5, /* 171 */ 4, /* 172 */ 5, /* 173 */ 5, /* 174 */
+  6, /* 175 */ 3, /* 176 */ 4, /* 177 */ 4, /* 178 */ 5, /* 179 */
+  4, /* 180 */ 5, /* 181 */ 5, /* 182 */ 6, /* 183 */ 4, /* 184 */
+  5, /* 185 */ 5, /* 186 */ 6, /* 187 */ 5, /* 188 */ 6, /* 189 */
+  6, /* 190 */ 7, /* 191 */ 2, /* 192 */ 3, /* 193 */ 3, /* 194 */
+  4, /* 195 */ 3, /* 196 */ 4, /* 197 */ 4, /* 198 */ 5, /* 199 */
+  3, /* 200 */ 4, /* 201 */ 4, /* 202 */ 5, /* 203 */ 4, /* 204 */
+  5, /* 205 */ 5, /* 206 */ 6, /* 207 */ 3, /* 208 */ 4, /* 209 */
+  4, /* 210 */ 5, /* 211 */ 4, /* 212 */ 5, /* 213 */ 5, /* 214 */
+  6, /* 215 */ 4, /* 216 */ 5, /* 217 */ 5, /* 218 */ 6, /* 219 */
+  5, /* 220 */ 6, /* 221 */ 6, /* 222 */ 7, /* 223 */ 3, /* 224 */
+  4, /* 225 */ 4, /* 226 */ 5, /* 227 */ 4, /* 228 */ 5, /* 229 */
+  5, /* 230 */ 6, /* 231 */ 4, /* 232 */ 5, /* 233 */ 5, /* 234 */
+  6, /* 235 */ 5, /* 236 */ 6, /* 237 */ 6, /* 238 */ 7, /* 239 */
+  4, /* 240 */ 5, /* 241 */ 5, /* 242 */ 6, /* 243 */ 5, /* 244 */
+  6, /* 245 */ 6, /* 246 */ 7, /* 247 */ 5, /* 248 */ 6, /* 249 */
+  6, /* 250 */ 7, /* 251 */ 6, /* 252 */ 7, /* 253 */ 7, /* 254 */
+  8  /* 255 */
+}; // end _Bitset_global
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template<class _Dummy>
+unsigned char _Bs_G<_Dummy>::_S_first_one[256] = {
+# else
+unsigned char _Bs_G<bool>::_S_first_one[256] _STLP_WEAK = {
+# endif
+
+  0, /*   0 */ 0, /*   1 */ 1, /*   2 */ 0, /*   3 */ 2, /*   4 */
+  0, /*   5 */ 1, /*   6 */ 0, /*   7 */ 3, /*   8 */ 0, /*   9 */
+  1, /*  10 */ 0, /*  11 */ 2, /*  12 */ 0, /*  13 */ 1, /*  14 */
+  0, /*  15 */ 4, /*  16 */ 0, /*  17 */ 1, /*  18 */ 0, /*  19 */
+  2, /*  20 */ 0, /*  21 */ 1, /*  22 */ 0, /*  23 */ 3, /*  24 */
+  0, /*  25 */ 1, /*  26 */ 0, /*  27 */ 2, /*  28 */ 0, /*  29 */
+  1, /*  30 */ 0, /*  31 */ 5, /*  32 */ 0, /*  33 */ 1, /*  34 */
+  0, /*  35 */ 2, /*  36 */ 0, /*  37 */ 1, /*  38 */ 0, /*  39 */
+  3, /*  40 */ 0, /*  41 */ 1, /*  42 */ 0, /*  43 */ 2, /*  44 */
+  0, /*  45 */ 1, /*  46 */ 0, /*  47 */ 4, /*  48 */ 0, /*  49 */
+  1, /*  50 */ 0, /*  51 */ 2, /*  52 */ 0, /*  53 */ 1, /*  54 */
+  0, /*  55 */ 3, /*  56 */ 0, /*  57 */ 1, /*  58 */ 0, /*  59 */
+  2, /*  60 */ 0, /*  61 */ 1, /*  62 */ 0, /*  63 */ 6, /*  64 */
+  0, /*  65 */ 1, /*  66 */ 0, /*  67 */ 2, /*  68 */ 0, /*  69 */
+  1, /*  70 */ 0, /*  71 */ 3, /*  72 */ 0, /*  73 */ 1, /*  74 */
+  0, /*  75 */ 2, /*  76 */ 0, /*  77 */ 1, /*  78 */ 0, /*  79 */
+  4, /*  80 */ 0, /*  81 */ 1, /*  82 */ 0, /*  83 */ 2, /*  84 */
+  0, /*  85 */ 1, /*  86 */ 0, /*  87 */ 3, /*  88 */ 0, /*  89 */
+  1, /*  90 */ 0, /*  91 */ 2, /*  92 */ 0, /*  93 */ 1, /*  94 */
+  0, /*  95 */ 5, /*  96 */ 0, /*  97 */ 1, /*  98 */ 0, /*  99 */
+  2, /* 100 */ 0, /* 101 */ 1, /* 102 */ 0, /* 103 */ 3, /* 104 */
+  0, /* 105 */ 1, /* 106 */ 0, /* 107 */ 2, /* 108 */ 0, /* 109 */
+  1, /* 110 */ 0, /* 111 */ 4, /* 112 */ 0, /* 113 */ 1, /* 114 */
+  0, /* 115 */ 2, /* 116 */ 0, /* 117 */ 1, /* 118 */ 0, /* 119 */
+  3, /* 120 */ 0, /* 121 */ 1, /* 122 */ 0, /* 123 */ 2, /* 124 */
+  0, /* 125 */ 1, /* 126 */ 0, /* 127 */ 7, /* 128 */ 0, /* 129 */
+  1, /* 130 */ 0, /* 131 */ 2, /* 132 */ 0, /* 133 */ 1, /* 134 */
+  0, /* 135 */ 3, /* 136 */ 0, /* 137 */ 1, /* 138 */ 0, /* 139 */
+  2, /* 140 */ 0, /* 141 */ 1, /* 142 */ 0, /* 143 */ 4, /* 144 */
+  0, /* 145 */ 1, /* 146 */ 0, /* 147 */ 2, /* 148 */ 0, /* 149 */
+  1, /* 150 */ 0, /* 151 */ 3, /* 152 */ 0, /* 153 */ 1, /* 154 */
+  0, /* 155 */ 2, /* 156 */ 0, /* 157 */ 1, /* 158 */ 0, /* 159 */
+  5, /* 160 */ 0, /* 161 */ 1, /* 162 */ 0, /* 163 */ 2, /* 164 */
+  0, /* 165 */ 1, /* 166 */ 0, /* 167 */ 3, /* 168 */ 0, /* 169 */
+  1, /* 170 */ 0, /* 171 */ 2, /* 172 */ 0, /* 173 */ 1, /* 174 */
+  0, /* 175 */ 4, /* 176 */ 0, /* 177 */ 1, /* 178 */ 0, /* 179 */
+  2, /* 180 */ 0, /* 181 */ 1, /* 182 */ 0, /* 183 */ 3, /* 184 */
+  0, /* 185 */ 1, /* 186 */ 0, /* 187 */ 2, /* 188 */ 0, /* 189 */
+  1, /* 190 */ 0, /* 191 */ 6, /* 192 */ 0, /* 193 */ 1, /* 194 */
+  0, /* 195 */ 2, /* 196 */ 0, /* 197 */ 1, /* 198 */ 0, /* 199 */
+  3, /* 200 */ 0, /* 201 */ 1, /* 202 */ 0, /* 203 */ 2, /* 204 */
+  0, /* 205 */ 1, /* 206 */ 0, /* 207 */ 4, /* 208 */ 0, /* 209 */
+  1, /* 210 */ 0, /* 211 */ 2, /* 212 */ 0, /* 213 */ 1, /* 214 */
+  0, /* 215 */ 3, /* 216 */ 0, /* 217 */ 1, /* 218 */ 0, /* 219 */
+  2, /* 220 */ 0, /* 221 */ 1, /* 222 */ 0, /* 223 */ 5, /* 224 */
+  0, /* 225 */ 1, /* 226 */ 0, /* 227 */ 2, /* 228 */ 0, /* 229 */
+  1, /* 230 */ 0, /* 231 */ 3, /* 232 */ 0, /* 233 */ 1, /* 234 */
+  0, /* 235 */ 2, /* 236 */ 0, /* 237 */ 1, /* 238 */ 0, /* 239 */
+  4, /* 240 */ 0, /* 241 */ 1, /* 242 */ 0, /* 243 */ 2, /* 244 */
+  0, /* 245 */ 1, /* 246 */ 0, /* 247 */ 3, /* 248 */ 0, /* 249 */
+  1, /* 250 */ 0, /* 251 */ 2, /* 252 */ 0, /* 253 */ 1, /* 254 */
+  0, /* 255 */
+}; // end _Bitset_global
+
+# endif /* defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) */
+
+_STLP_END_NAMESPACE
+
+#  undef __BITS_PER_WORD
+#  undef bitset
+
+#endif /*  _STLP_BITSET_C */
diff --git a/src/STLport/stl/_bitset.h b/src/STLport/stl/_bitset.h
new file mode 100644
index 0000000..a2372fc
--- /dev/null
+++ b/src/STLport/stl/_bitset.h
@@ -0,0 +1,768 @@
+/*
+ * Copyright (c) 1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_BITSET_H
+#define _STLP_BITSET_H
+
+// A bitset of size N has N % (sizeof(unsigned long) * CHAR_BIT) unused 
+// bits.  (They are the high- order bits in the highest word.)  It is
+// a class invariant of class bitset<> that those unused bits are
+// always zero.
+
+// Most of the actual code isn't contained in bitset<> itself, but in the 
+// base class _Base_bitset.  The base class works with whole words, not with
+// individual bits.  This allows us to specialize _Base_bitset for the
+// important special case where the bitset is only a single word.
+
+// The C++ standard does not define the precise semantics of operator[].
+// In this implementation the const version of operator[] is equivalent
+// to test(), except that it does no range checking.  The non-const version
+// returns a reference to a bit, again without doing any range checking.
+
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#  include <stl/_uninitialized.h>
+# endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+#  include <stl/_range_errors.h>
+# endif
+
+# ifndef _STLP_STRING
+#  include <string>
+# endif
+
+# ifndef _STLP_ISTREAM
+#  include <istream>
+# endif
+
+#define __BITS_PER_WORD (CHAR_BIT*sizeof(unsigned long))
+#define __BITSET_WORDS(__n) ((__n + __BITS_PER_WORD - 1)/__BITS_PER_WORD)
+
+_STLP_BEGIN_NAMESPACE
+
+// structure to aid in counting bits
+template<class _Dummy> 
+class _Bs_G {
+public:
+  static unsigned char _S_bit_count[256];
+  // Mapping from 8 bit unsigned integers to the index of the first one
+  // bit:
+  static unsigned char _S_first_one[256];
+};
+
+//
+// Base class: general case.
+//
+
+template<size_t _Nw>
+struct _Base_bitset {
+  typedef unsigned long _WordT;
+
+  _WordT _M_w[_Nw];                // 0 is the least significant word.
+
+  _Base_bitset( void ) { _M_do_reset(); }
+
+  _Base_bitset(unsigned long __val) {
+    _M_do_reset();
+    _M_w[0] = __val;
+  }
+  
+  static size_t _STLP_CALL _S_whichword( size_t __pos ) {
+    return __pos / __BITS_PER_WORD;
+  }
+  static size_t _STLP_CALL _S_whichbyte( size_t __pos ) {
+    return (__pos % __BITS_PER_WORD) / CHAR_BIT;
+  }
+  static size_t _STLP_CALL _S_whichbit( size_t __pos ) {
+    return __pos % __BITS_PER_WORD;
+  }
+  static _WordT _STLP_CALL _S_maskbit( size_t __pos ) {
+    return __STATIC_CAST(_WordT,1) << _S_whichbit(__pos);
+  }
+
+  _WordT& _M_getword(size_t __pos)       { return _M_w[_S_whichword(__pos)]; }
+  _WordT  _M_getword(size_t __pos) const { return _M_w[_S_whichword(__pos)]; }
+
+  _WordT& _M_hiword()       { return _M_w[_Nw - 1]; }
+  _WordT  _M_hiword() const { return _M_w[_Nw - 1]; }
+
+  void _M_do_and(const _Base_bitset<_Nw>& __x) {
+    for ( size_t __i = 0; __i < _Nw; __i++ ) {
+      _M_w[__i] &= __x._M_w[__i];
+    }
+  }
+
+  void _M_do_or(const _Base_bitset<_Nw>& __x) {
+    for ( size_t __i = 0; __i < _Nw; __i++ ) {
+      _M_w[__i] |= __x._M_w[__i];
+    }
+  }
+
+  void _M_do_xor(const _Base_bitset<_Nw>& __x) {
+    for ( size_t __i = 0; __i < _Nw; __i++ ) {
+      _M_w[__i] ^= __x._M_w[__i];
+    }
+  }
+
+  void _M_do_left_shift(size_t __shift);
+
+  void _M_do_right_shift(size_t __shift);
+
+  void _M_do_flip() {
+    for ( size_t __i = 0; __i < _Nw; __i++ ) {
+      _M_w[__i] = ~_M_w[__i];
+    }
+  }
+
+  void _M_do_set() {
+    for ( size_t __i = 0; __i < _Nw; __i++ ) {
+      _M_w[__i] = ~__STATIC_CAST(_WordT,0);
+    }
+  }
+
+
+  void _M_do_reset() { memset(_M_w, 0, _Nw * sizeof(_WordT)); }
+
+  bool _M_is_equal(const _Base_bitset<_Nw>& __x) const {
+    for (size_t __i = 0; __i < _Nw; ++__i) {
+      if (_M_w[__i] != __x._M_w[__i])
+        return false;
+    }
+    return true;
+  }
+
+  bool _M_is_any() const {
+    for ( size_t __i = 0; __i < _Nw ; __i++ ) {
+      if ( _M_w[__i] != __STATIC_CAST(_WordT,0) )
+        return true;
+    }
+    return false;
+  }
+
+  size_t _M_do_count() const {
+    size_t __result = 0;
+    const unsigned char* __byte_ptr = (const unsigned char*)_M_w;
+    const unsigned char* __end_ptr = (const unsigned char*)(_M_w+_Nw);
+
+    while ( __byte_ptr < __end_ptr ) {
+      __result += _Bs_G<bool>::_S_bit_count[*__byte_ptr];
+      __byte_ptr++;
+    }
+    return __result;
+  }
+
+  unsigned long _M_do_to_ulong() const; 
+
+  // find first "on" bit
+  size_t _M_do_find_first(size_t __not_found) const;
+
+  // find the next "on" bit that follows "prev"
+  size_t _M_do_find_next(size_t __prev, size_t __not_found) const;
+};
+
+//
+// Base class: specialization for a single word.
+//
+
+_STLP_TEMPLATE_NULL
+struct _Base_bitset<1UL> {
+  typedef unsigned long _WordT;
+  typedef _Base_bitset<1UL> _Self;
+
+  _WordT _M_w;
+
+  _Base_bitset( void ) : _M_w(0) {}
+  _Base_bitset(unsigned long __val) : _M_w(__val) {}
+  
+  static size_t _STLP_CALL _S_whichword( size_t __pos ) {
+    return __pos / __BITS_PER_WORD ;
+  }
+  static size_t _STLP_CALL _S_whichbyte( size_t __pos ) {
+    return (__pos % __BITS_PER_WORD) / CHAR_BIT;
+  }
+  static size_t _STLP_CALL _S_whichbit( size_t __pos ) {
+    return __pos % __BITS_PER_WORD;
+  }
+  static _WordT _STLP_CALL _S_maskbit( size_t __pos ) {
+    return (__STATIC_CAST(_WordT,1)) << _S_whichbit(__pos);
+  }
+
+  _WordT& _M_getword(size_t)       { return _M_w; }
+  _WordT  _M_getword(size_t) const { return _M_w; }
+
+  _WordT& _M_hiword()       { return _M_w; }
+  _WordT  _M_hiword() const { return _M_w; }
+
+
+  void _M_do_and(const _Self& __x) { _M_w &= __x._M_w; }
+  void _M_do_or(const _Self& __x)  { _M_w |= __x._M_w; }
+  void _M_do_xor(const _Self& __x) { _M_w ^= __x._M_w; }
+  void _M_do_left_shift(size_t __shift)     { _M_w <<= __shift; }
+  void _M_do_right_shift(size_t __shift)    { _M_w >>= __shift; }
+  void _M_do_flip()                       { _M_w = ~_M_w; }
+  void _M_do_set()                        { _M_w = ~__STATIC_CAST(_WordT,0); }
+  void _M_do_reset()                      { _M_w = 0; }
+
+  bool _M_is_equal(const _Self& __x) const {
+    return _M_w == __x._M_w;
+  }
+  bool _M_is_any() const {
+    return _M_w != 0;
+  }
+
+  size_t _M_do_count() const {
+    size_t __result = 0;
+    const unsigned char* __byte_ptr = (const unsigned char*)&_M_w;
+    const unsigned char* __end_ptr = ((const unsigned char*)&_M_w)+sizeof(_M_w);
+    while ( __byte_ptr < __end_ptr ) {
+      __result += _Bs_G<bool>::_S_bit_count[*__byte_ptr];
+      __byte_ptr++;
+    }
+    return __result;
+  }
+
+  unsigned long _M_do_to_ulong() const { return _M_w; }
+
+  inline size_t _M_do_find_first(size_t __not_found) const;
+
+  // find the next "on" bit that follows "prev"
+  inline size_t _M_do_find_next(size_t __prev, size_t __not_found) const; 
+
+};
+
+
+// ------------------------------------------------------------
+//
+// Definitions of should-be-non-inline functions from the single-word version of
+//  _Base_bitset.
+//
+
+inline size_t 
+_Base_bitset<1UL>::_M_do_find_first(size_t __not_found) const
+{
+  //  typedef unsigned long _WordT;
+  _WordT __thisword = _M_w;
+
+  if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+    // find byte within word
+    for ( size_t __j = 0; __j < sizeof(_WordT); __j++ ) {
+      unsigned char __this_byte
+        = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+      if ( __this_byte )
+        return __j*CHAR_BIT + _Bs_G<bool>::_S_first_one[__this_byte];
+
+      __thisword >>= CHAR_BIT;
+    }
+  }
+  // not found, so return a value that indicates failure.
+  return __not_found;
+}
+
+inline size_t 
+_Base_bitset<1UL>::_M_do_find_next(size_t __prev, 
+                                   size_t __not_found ) const
+{
+  // make bound inclusive
+  ++__prev;
+
+  // check out of bounds
+  if ( __prev >= __BITS_PER_WORD )
+    return __not_found;
+
+    // search first (and only) word
+  _WordT __thisword = _M_w;
+
+  // mask off bits below bound
+  __thisword &= (~__STATIC_CAST(_WordT,0)) << _S_whichbit(__prev);
+
+  if ( __thisword != __STATIC_CAST(_WordT,0) ) {
+    // find byte within word
+    // get first byte into place
+    __thisword >>= _S_whichbyte(__prev) * CHAR_BIT;
+    for ( size_t __j = _S_whichbyte(__prev); __j < sizeof(_WordT); __j++ ) {
+      unsigned char __this_byte
+        = __STATIC_CAST(unsigned char,(__thisword & (~(unsigned char)0)));
+      if ( __this_byte )
+        return __j*CHAR_BIT + _Bs_G<bool>::_S_first_one[__this_byte];
+
+      __thisword >>= CHAR_BIT;
+    }
+  }
+
+  // not found, so return a value that indicates failure.
+  return __not_found;
+} // end _M_do_find_next
+
+
+// ------------------------------------------------------------
+// Helper class to zero out the unused high-order bits in the highest word.
+
+template <size_t _Extrabits> struct _Sanitize {
+  static void _STLP_CALL _M_do_sanitize(unsigned long& __val)
+    { __val &= ~((~__STATIC_CAST(unsigned long,0)) << _Extrabits); }
+};
+
+_STLP_TEMPLATE_NULL struct _Sanitize<0UL> {
+  static void _STLP_CALL _M_do_sanitize(unsigned long) {}
+};
+
+// ------------------------------------------------------------
+// Class bitset.
+//   _Nb may be any nonzero number of type size_t.
+
+
+template<size_t _Nb>
+class bitset : public _Base_bitset<__BITSET_WORDS(_Nb) > 
+{
+public:
+  enum { _Words = __BITSET_WORDS(_Nb) } ;
+
+private:
+  typedef _Base_bitset< _Words > _Base;
+
+  void _M_do_sanitize() {
+    _Sanitize<_Nb%__BITS_PER_WORD >::_M_do_sanitize(this->_M_hiword());
+  }
+public:
+  typedef unsigned long _WordT;
+  struct reference;
+  friend struct reference;
+
+  // bit reference:
+  struct reference {
+  typedef _Base_bitset<_Words > _Bitset_base;
+  typedef bitset<_Nb> _Bitset;
+    //    friend _Bitset;
+    _WordT *_M_wp;
+    size_t _M_bpos;
+
+    // should be left undefined
+    reference() {}
+
+    reference( _Bitset& __b, size_t __pos ) {
+      _M_wp = &__b._M_getword(__pos);
+      _M_bpos = _Bitset_base::_S_whichbit(__pos);
+    }
+
+  public:
+    ~reference() {}
+
+    // for b[i] = __x;
+    reference& operator=(bool __x) {
+      if ( __x )
+        *_M_wp |= _Bitset_base::_S_maskbit(_M_bpos);
+      else
+        *_M_wp &= ~_Bitset_base::_S_maskbit(_M_bpos);
+
+      return *this;
+    }
+
+    // for b[i] = b[__j];
+    reference& operator=(const reference& __j) {
+      if ( (*(__j._M_wp) & _Bitset_base::_S_maskbit(__j._M_bpos)) )
+        *_M_wp |= _Bitset_base::_S_maskbit(_M_bpos);
+      else
+        *_M_wp &= ~_Bitset_base::_S_maskbit(_M_bpos);
+
+      return *this;
+    }
+
+    // flips the bit
+    bool operator~() const { return (*(_M_wp) & _Bitset_base::_S_maskbit(_M_bpos)) == 0; }
+
+    // for __x = b[i];
+    operator bool() const { return (*(_M_wp) & _Bitset_base::_S_maskbit(_M_bpos)) != 0; }
+
+    // for b[i].flip();
+    reference& flip() {
+      *_M_wp ^= _Bitset_base::_S_maskbit(_M_bpos);
+      return *this;
+    }
+  };
+
+  // 23.3.5.1 constructors:
+  bitset() {}
+
+  bitset(unsigned long __val) : _Base_bitset<_Words>(__val) { _M_do_sanitize(); }
+
+# ifdef _STLP_MEMBER_TEMPLATES
+  template<class _CharT, class _Traits, class _Alloc>
+  explicit bitset(const basic_string<_CharT,_Traits,_Alloc>& __s,
+                  size_t __pos = 0)
+    : _Base_bitset<_Words >() 
+  {
+    if (__pos > __s.size()) 
+      __stl_throw_out_of_range("bitset");
+    _M_copy_from_string(__s, __pos,
+                        basic_string<_CharT, _Traits, _Alloc>::npos);
+  }
+  template<class _CharT, class _Traits, class _Alloc>
+  bitset(const basic_string<_CharT, _Traits, _Alloc>& __s,
+          size_t __pos,
+          size_t __n)
+  : _Base_bitset<_Words >() 
+  {
+    if (__pos > __s.size()) 
+      __stl_throw_out_of_range("bitset");
+    _M_copy_from_string(__s, __pos, __n);
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  explicit bitset(const string& __s,
+                  size_t __pos = 0,
+                  size_t __n = (size_t)-1) 
+    : _Base_bitset<_Words >() 
+  {
+    if (__pos > __s.size()) 
+      __stl_throw_out_of_range("bitset");
+    _M_copy_from_string(__s, __pos, __n);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  // 23.3.5.2 bitset operations:
+  bitset<_Nb>& operator&=(const bitset<_Nb>& __rhs) {
+    this->_M_do_and(__rhs);
+    return *this;
+  }
+
+  bitset<_Nb>& operator|=(const bitset<_Nb>& __rhs) {
+    this->_M_do_or(__rhs);
+    return *this;
+  }
+
+  bitset<_Nb>& operator^=(const bitset<_Nb>& __rhs) {
+    this->_M_do_xor(__rhs);
+    return *this;
+  }
+
+  bitset<_Nb>& operator<<=(size_t __pos) {
+    this->_M_do_left_shift(__pos);
+    this->_M_do_sanitize();
+    return *this;
+  }
+
+  bitset<_Nb>& operator>>=(size_t __pos) {
+    this->_M_do_right_shift(__pos);
+    this->_M_do_sanitize();
+    return *this;
+  }
+
+  //
+  // Extension:
+  // Versions of single-bit set, reset, flip, test with no range checking.
+  //
+
+  bitset<_Nb>& _Unchecked_set(size_t __pos) {
+    this->_M_getword(__pos) |= _Base_bitset<_Words > ::_S_maskbit(__pos);
+    return *this;
+  }
+
+  bitset<_Nb>& _Unchecked_set(size_t __pos, int __val) {
+    if (__val)
+      this->_M_getword(__pos) |= this->_S_maskbit(__pos);
+    else
+      this->_M_getword(__pos) &= ~ this->_S_maskbit(__pos);
+
+    return *this;
+  }
+
+  bitset<_Nb>& _Unchecked_reset(size_t __pos) {
+    this->_M_getword(__pos) &= ~ this->_S_maskbit(__pos);
+    return *this;
+  }
+
+  bitset<_Nb>& _Unchecked_flip(size_t __pos) {
+    this->_M_getword(__pos) ^= this->_S_maskbit(__pos);
+    return *this;
+  }
+
+  bool _Unchecked_test(size_t __pos) const {
+    return (this->_M_getword(__pos) & this->_S_maskbit(__pos)) != __STATIC_CAST(_WordT,0);
+  }
+
+  // Set, reset, and flip.
+
+  bitset<_Nb>& set() {
+    this->_M_do_set();
+    this->_M_do_sanitize();
+    return *this;
+  }
+
+  bitset<_Nb>& set(size_t __pos) {
+    if (__pos >= _Nb)
+      __stl_throw_out_of_range("bitset");
+    return _Unchecked_set(__pos);
+  }
+
+  bitset<_Nb>& set(size_t __pos, int __val) {
+    if (__pos >= _Nb)
+      __stl_throw_out_of_range("bitset");
+    return _Unchecked_set(__pos, __val);
+  }
+
+  bitset<_Nb>& reset() {
+    this->_M_do_reset();
+    return *this;
+  }
+
+  bitset<_Nb>& reset(size_t __pos) {
+    if (__pos >= _Nb)
+      __stl_throw_out_of_range("bitset");
+
+    return _Unchecked_reset(__pos);
+  }
+
+  bitset<_Nb>& flip() {
+    this->_M_do_flip();
+    this->_M_do_sanitize();
+    return *this;
+  }
+
+  bitset<_Nb>& flip(size_t __pos) {
+    if (__pos >= _Nb)
+      __stl_throw_out_of_range("bitset");
+
+    return _Unchecked_flip(__pos);
+  }
+
+  bitset<_Nb> operator~() const { 
+    return bitset<_Nb>(*this).flip();
+  }
+
+  // element access:
+  //for b[i];
+  reference operator[](size_t __pos) { return reference(*this,__pos); }
+  bool operator[](size_t __pos) const { return _Unchecked_test(__pos); }
+
+  unsigned long to_ulong() const { return this->_M_do_to_ulong(); }
+
+#if defined (_STLP_MEMBER_TEMPLATES) && !  defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS)
+  template <class _CharT, class _Traits, class _Alloc>
+  basic_string<_CharT, _Traits, _Alloc> to_string() const {
+    basic_string<_CharT, _Traits, _Alloc> __result;
+    _M_copy_to_string(__result);
+    return __result;
+  }
+#else
+  string to_string() const {
+    string __result;
+    _M_copy_to_string(__result);
+    return __result;
+  }
+#endif /* _STLP_EXPLICIT_FUNCTION_TMPL_ARGS */
+
+  size_t count() const { return this->_M_do_count(); }
+
+  size_t size() const { return _Nb; }
+
+  bool operator==(const bitset<_Nb>& __rhs) const {
+    return this->_M_is_equal(__rhs);
+  }
+  bool operator!=(const bitset<_Nb>& __rhs) const {
+    return !this->_M_is_equal(__rhs);
+  }
+
+  bool test(size_t __pos) const {
+    if (__pos >= _Nb)
+      __stl_throw_out_of_range("bitset");
+    
+    return _Unchecked_test(__pos);
+  }
+
+  bool any() const { return this->_M_is_any(); }
+  bool none() const { return !this->_M_is_any(); }
+
+  bitset<_Nb> operator<<(size_t __pos) const { 
+    bitset<_Nb> __result(*this);
+    __result <<= __pos ;  return __result; 
+  }
+  bitset<_Nb> operator>>(size_t __pos) const { 
+    bitset<_Nb> __result(*this);
+    __result >>= __pos ;  return __result; 
+  }
+
+  //
+  // EXTENSIONS: bit-find operations.  These operations are
+  // experimental, and are subject to change or removal in future
+  // versions.
+  // 
+
+  // find the index of the first "on" bit
+  size_t _Find_first() const 
+    { return this->_M_do_find_first(_Nb); }
+
+  // find the index of the next "on" bit after prev
+  size_t _Find_next( size_t __prev ) const 
+    { return this->_M_do_find_next(__prev, _Nb); }
+
+//
+// Definitions of should-be non-inline member functions.
+//
+# if defined (_STLP_MEMBER_TEMPLATES)
+  template<class _CharT, class _Traits, class _Alloc>
+    void _M_copy_from_string(const basic_string<_CharT,_Traits,_Alloc>& __s,
+			     size_t __pos,
+			     size_t __n) {
+#else
+    void _M_copy_from_string(const string& __s,
+			     size_t __pos,
+			     size_t __n) {
+      typedef char_traits<char> _Traits;
+#endif
+      reset();
+      size_t __tmp = _Nb;
+      const size_t __Nbits = (min) (__tmp, (min) (__n, __s.size() - __pos));
+      for ( size_t __i= 0; __i < __Nbits; ++__i) {
+        typename _Traits::int_type __k = _Traits::to_int_type(__s[__pos + __Nbits - __i - 1]);
+        // boris : widen() ?
+        if (__k == '1')
+          set(__i);
+        else if (__k !='0')
+          __stl_throw_invalid_argument("bitset");
+      }
+    }
+  
+# if defined (_STLP_MEMBER_TEMPLATES)
+  template <class _CharT, class _Traits, class _Alloc>
+    void _M_copy_to_string(basic_string<_CharT, _Traits, _Alloc>& __s) const
+# else
+    void _M_copy_to_string(string& __s) const
+# endif
+    {
+      __s.assign(_Nb, '0');
+      
+      for (size_t __i = 0; __i < _Nb; ++__i) 
+	if (_Unchecked_test(__i))
+	  __s[_Nb - 1 - __i] = '1';
+    }
+
+# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+  bitset<_Nb> operator&(const bitset<_Nb>& __y) const {
+    bitset<_Nb> __result(*this);
+    __result &= __y;
+    return __result;
+  }
+  bitset<_Nb> operator|(const bitset<_Nb>& __y) const {
+    bitset<_Nb> __result(*this);
+    __result |= __y;
+    return __result;
+  }
+  bitset<_Nb> operator^(const bitset<_Nb>& __y) const {
+    bitset<_Nb> __result(*this);
+    __result ^= __y;
+    return __result;
+  }
+# endif 
+
+};
+
+// ------------------------------------------------------------
+//
+// 23.3.5.3 bitset operations:
+//
+
+# if ! defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+
+template <size_t _Nb>
+inline bitset<_Nb>  _STLP_CALL
+operator&(const bitset<_Nb>& __x,
+          const bitset<_Nb>& __y) {
+  bitset<_Nb> __result(__x);
+  __result &= __y;
+  return __result;
+}
+
+
+template <size_t _Nb>
+inline bitset<_Nb>  _STLP_CALL
+operator|(const bitset<_Nb>& __x,
+          const bitset<_Nb>& __y) {
+  bitset<_Nb> __result(__x);
+  __result |= __y;
+  return __result;
+}
+
+template <size_t _Nb>
+inline bitset<_Nb>  _STLP_CALL
+operator^(const bitset<_Nb>& __x,
+          const bitset<_Nb>& __y) {
+  bitset<_Nb> __result(__x);
+  __result ^= __y;
+  return __result;
+}
+
+#if defined ( _STLP_USE_NEW_IOSTREAMS )
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_istream<_CharT, _Traits>&  _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, bitset<_Nb>& __x);
+
+
+template <class _CharT, class _Traits, size_t _Nb>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const bitset<_Nb>& __x);
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
+template <size_t _Nb>
+_ISTREAM_DLL& _STLP_CALL
+operator>>(_ISTREAM_DLL& __is, bitset<_Nb>& __x);
+
+template <size_t _Nb>
+inline _OSTREAM_DLL&  _STLP_CALL operator<<(_OSTREAM_DLL& __os, const bitset<_Nb>& __x) {
+  string __tmp;
+  __x._M_copy_to_string(__tmp);
+  return __os << __tmp;
+}
+
+#endif
+
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+
+#  undef  bitset
+
+
+_STLP_END_NAMESPACE
+
+#  undef __BITS_PER_WORD
+#  undef __BITSET_WORDS
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_bitset.c>
+# endif
+
+#endif /* _STLP_BITSET_H */
+
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_bvector.h b/src/STLport/stl/_bvector.h
new file mode 100644
index 0000000..8aed5cd
--- /dev/null
+++ b/src/STLport/stl/_bvector.h
@@ -0,0 +1,807 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_BVECTOR_H
+#define _STLP_INTERNAL_BVECTOR_H
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+# endif
+
+#define __WORD_BIT (int(CHAR_BIT*sizeof(unsigned int)))
+
+_STLP_BEGIN_NAMESPACE 
+
+struct _Bit_reference {
+  unsigned int* _M_p;
+  unsigned int _M_mask;
+  _Bit_reference(unsigned int* __x, unsigned int __y) 
+    : _M_p(__x), _M_mask(__y) {}
+
+public:
+  _Bit_reference() : _M_p(0), _M_mask(0) {}
+
+  operator bool() const { 
+	  return !(!(*_M_p & _M_mask)); 
+  }
+  _Bit_reference& operator=(bool __x) {
+    if (__x)  *_M_p |= _M_mask;
+    else      *_M_p &= ~_M_mask;
+    return *this;
+  }
+  _Bit_reference& operator=(const _Bit_reference& __x) {
+	  return *this = bool(__x); 
+  }
+  bool operator==(const _Bit_reference& __x) const {
+	  return bool(*this) == bool(__x); 
+  }
+  bool operator<(const _Bit_reference& __x) const {
+    return !bool(*this) && bool(__x);
+  }
+
+  _Bit_reference& operator |= (bool __x) {
+	  if (__x)
+		  *_M_p |= _M_mask;
+	  return *this;
+  }
+  _Bit_reference& operator &= (bool __x) {
+	  if (!__x)
+		  *_M_p &= ~_M_mask;
+	  return *this;
+  }
+  void flip() { *_M_p ^= _M_mask; }
+};
+
+
+inline void swap(_Bit_reference& __x, _Bit_reference& __y)
+{
+  bool __tmp = (bool)__x;
+  __x = __y;
+  __y = __tmp;
+}
+
+struct _Bit_iterator_base;
+
+struct _Bit_iterator_base
+{
+  typedef ptrdiff_t difference_type;
+
+  unsigned int* _M_p;
+  unsigned int  _M_offset;
+
+  void _M_bump_up() {
+    if (_M_offset++ == __WORD_BIT - 1) {
+      _M_offset = 0;
+      ++_M_p;
+    }
+  }
+
+  void _M_bump_down() {
+    if (_M_offset-- == 0) {
+      _M_offset = __WORD_BIT - 1;
+      --_M_p;
+    }
+  }
+
+  _Bit_iterator_base() : _M_p(0), _M_offset(0) {}
+  _Bit_iterator_base(unsigned int* __x, unsigned int __y) : _M_p(__x), _M_offset(__y) {}
+  //  _Bit_iterator_base( const _Bit_iterator_base& __x) : _M_p(__x._M_p), _M_offset(__x._M_offset) {}
+  //  _Bit_iterator_base& operator = ( const _Bit_iterator_base& __x) { _M_p = __x._M_p ; _M_offset = __x._M_offset ; return *this; }
+
+  void _M_advance (difference_type __i) {
+    difference_type __n = __i + _M_offset;
+    _M_p += __n / __WORD_BIT;
+    __n = __n % __WORD_BIT;
+    if (__n < 0) {
+      _M_offset = (unsigned int) __n + __WORD_BIT;
+      --_M_p;
+    } else
+      _M_offset = (unsigned int) __n;
+  }
+
+  difference_type _M_subtract(const _Bit_iterator_base& __x) const {
+    return __WORD_BIT * (_M_p - __x._M_p) + _M_offset - __x._M_offset;
+  }
+};
+
+inline bool  _STLP_CALL operator==(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+  return __y._M_p == __x._M_p && __y._M_offset == __x._M_offset;
+}
+inline bool  _STLP_CALL operator!=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+  return __y._M_p != __x._M_p || __y._M_offset != __x._M_offset;
+}
+
+inline bool _STLP_CALL operator<(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) {
+  return __x._M_p < __y._M_p || (__x._M_p == __y._M_p && __x._M_offset < __y._M_offset);
+}
+
+inline bool _STLP_CALL operator>(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)  { 
+  return operator <(__y , __x); 
+}
+inline bool _STLP_CALL operator<=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) { 
+  return !(__y < __x); 
+}
+inline bool _STLP_CALL operator>=(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y) { 
+  return !(__x < __y); 
+}
+
+template <class _Ref, class _Ptr>
+struct _Bit_iter : public _Bit_iterator_base
+{
+  typedef _Ref  reference;
+  typedef _Ptr  pointer;
+  typedef _Bit_iter<_Ref, _Ptr> _Self;
+  typedef random_access_iterator_tag iterator_category;
+  typedef bool value_type;
+  typedef ptrdiff_t difference_type;
+  typedef size_t size_type;
+
+  _Bit_iter(unsigned int* __x, unsigned int __y) : _Bit_iterator_base(__x, __y) {}
+  _Bit_iter() {}
+
+  _Bit_iter(const _Bit_iter<_Bit_reference, _Bit_reference*>& __x): 
+    _Bit_iterator_base((const _Bit_iterator_base&)__x) {}
+
+  //  _Self& operator = (const _Bit_iter<_Bit_reference, _Bit_reference*>& __x)
+  //   { (_Bit_iterator_base&)*this = (const _Bit_iterator_base&)__x; return *this; }
+
+  reference operator*() const { 
+    return _Bit_reference(_M_p, 1UL << _M_offset); 
+  }
+  _Self& operator++() {
+    _M_bump_up();
+    return *this;
+  }
+  _Self operator++(int) {
+    _Self __tmp = *this;
+    _M_bump_up();
+    return __tmp;
+  }
+  _Self& operator--() {
+    _M_bump_down();
+    return *this;
+  }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    _M_bump_down();
+    return __tmp;
+  }
+  _Self& operator+=(difference_type __i) {
+    _M_advance(__i);
+    return *this;
+  }
+  _Self& operator-=(difference_type __i) {
+    *this += -__i;
+    return *this;
+  }
+  _Self operator+(difference_type __i) const {
+    _Self __tmp = *this;
+    return __tmp += __i;
+  }
+  _Self operator-(difference_type __i) const {
+    _Self __tmp = *this;
+    return __tmp -= __i;
+  }
+  difference_type operator-(const _Self& __x) const {
+    return _M_subtract(__x);
+  }
+  reference operator[](difference_type __i) { return *(*this + __i); }
+};
+
+template <class _Ref, class _Ptr>
+inline _Bit_iter<_Ref,_Ptr>  _STLP_CALL
+operator+(ptrdiff_t __n, const _Bit_iter<_Ref, _Ptr>& __x) {
+   return __x + __n;
+}
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+inline random_access_iterator_tag  iterator_category(const _Bit_iterator_base&) {return random_access_iterator_tag();}
+inline ptrdiff_t* distance_type(const _Bit_iterator_base&) {return (ptrdiff_t*)0;}
+inline bool* value_type(const _Bit_iter<_Bit_reference, _Bit_reference*>&) {return (bool*)0;}
+inline bool* value_type(const _Bit_iter<bool, const bool*>&) {return (bool*)0;}
+# endif
+
+typedef _Bit_iter<bool, const bool*> _Bit_const_iterator;
+typedef _Bit_iter<_Bit_reference, _Bit_reference*> _Bit_iterator;
+
+// Bit-vector base class, which encapsulates the difference between
+//  old SGI-style allocators and standard-conforming allocators.
+
+
+template <class _Alloc>
+class _Bvector_base
+{
+public:
+  _STLP_FORCE_ALLOCATORS(bool, _Alloc)
+  typedef typename _Alloc_traits<bool, _Alloc>::allocator_type allocator_type;
+  typedef unsigned int __chunk_type;
+  typedef typename _Alloc_traits<__chunk_type, 
+          _Alloc>::allocator_type __chunk_allocator_type;
+  allocator_type get_allocator() const { 
+    return _STLP_CONVERT_ALLOCATOR((const __chunk_allocator_type&)_M_end_of_storage, bool); 
+  }
+  static allocator_type __get_dfl_allocator() { return allocator_type(); }
+   
+  _Bvector_base(const allocator_type& __a)
+    : _M_start(), _M_finish(), _M_end_of_storage(_STLP_CONVERT_ALLOCATOR(__a, __chunk_type),
+						 (__chunk_type*)0) {
+  }
+  ~_Bvector_base() { _M_deallocate();
+  }
+
+protected:
+
+  unsigned int* _M_bit_alloc(size_t __n) 
+    { return _M_end_of_storage.allocate((__n + __WORD_BIT - 1)/__WORD_BIT); }
+  void _M_deallocate() {
+    if (_M_start._M_p)
+      _M_end_of_storage.deallocate(_M_start._M_p,
+				   _M_end_of_storage._M_data - _M_start._M_p);
+  }
+
+  _Bit_iterator _M_start;
+  _Bit_iterator _M_finish;
+  _STLP_alloc_proxy<__chunk_type*, __chunk_type, __chunk_allocator_type> _M_end_of_storage;  
+};
+
+
+// The next few lines are confusing.  What we're doing is declaring a
+//  partial specialization of vector<T, Alloc> if we have the necessary
+//  compiler support.  Otherwise, we define a class bit_vector which uses
+//  the default allocator. 
+
+#if defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined(_STLP_NO_BOOL) && ! defined (__SUNPRO_CC)
+# define _STLP_VECBOOL_TEMPLATE
+# define __BVEC_TMPL_HEADER template <class _Alloc>
+#else
+# undef _STLP_VECBOOL_TEMPLATE
+# ifdef _STLP_NO_BOOL
+#  define __BVEC_TMPL_HEADER
+# else
+#  define __BVEC_TMPL_HEADER _STLP_TEMPLATE_NULL
+# endif
+# if !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)))			//*TY 12/17/2000 - 
+#  define _Alloc _STLP_DEFAULT_ALLOCATOR(bool)
+# else
+#  define _Alloc allocator<bool>
+# endif
+#endif
+
+#ifdef _STLP_NO_BOOL
+# define __BVECTOR_QUALIFIED bit_vector
+# define __BVECTOR           bit_vector
+#else
+# ifdef _STLP_VECBOOL_TEMPLATE
+#  define __BVECTOR_QUALIFIED __WORKAROUND_DBG_RENAME(vector) <bool, _Alloc>
+# else
+#  define __BVECTOR_QUALIFIED __WORKAROUND_DBG_RENAME(vector) <bool, allocator<bool> >
+# endif
+#if defined (_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS)
+# define __BVECTOR __BVECTOR_QUALIFIED
+#else
+# define __BVECTOR __WORKAROUND_DBG_RENAME(vector)
+#endif
+#endif
+
+
+__BVEC_TMPL_HEADER
+class __BVECTOR_QUALIFIED : public _Bvector_base<_Alloc >
+{
+  typedef _Bvector_base<_Alloc > _Base;
+  typedef __BVECTOR_QUALIFIED _Self;
+public:
+  typedef bool value_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type; 
+  typedef _Bit_reference reference;
+  typedef bool const_reference;
+  typedef _Bit_reference* pointer;
+  typedef const bool* const_pointer;
+  typedef random_access_iterator_tag _Iterator_category;
+
+  typedef _Bit_iterator                iterator;
+  typedef _Bit_const_iterator          const_iterator;
+
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+  typedef _STLP_STD::reverse_iterator<const_iterator> const_reverse_iterator;
+  typedef _STLP_STD::reverse_iterator<iterator> reverse_iterator;
+#else /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+  typedef _STLP_STD::reverse_iterator<const_iterator, value_type, const_reference, 
+  const_pointer, difference_type> const_reverse_iterator;
+  typedef _STLP_STD::reverse_iterator<iterator, value_type, reference, reference*, 
+  difference_type> reverse_iterator;
+# else
+  typedef _STLP_STD::reverse_iterator<const_iterator, value_type, const_reference, 
+                                  difference_type> const_reverse_iterator;
+  typedef _STLP_STD::reverse_iterator<iterator, value_type, reference, difference_type>
+          reverse_iterator;
+# endif
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+# ifdef _STLP_VECBOOL_TEMPLATE
+  typedef typename _Bvector_base<_Alloc >::allocator_type allocator_type;
+  typedef typename _Bvector_base<_Alloc >::__chunk_type __chunk_type ;
+# else
+  typedef _Bvector_base<_Alloc >::allocator_type allocator_type;
+  typedef _Bvector_base<_Alloc >::__chunk_type __chunk_type ;
+# endif
+
+protected:
+
+  void _M_initialize(size_type __n) {
+    unsigned int* __q = this->_M_bit_alloc(__n);
+    this->_M_end_of_storage._M_data = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
+    this->_M_start = iterator(__q, 0);
+    this->_M_finish = this->_M_start + difference_type(__n);
+  }
+  void _M_insert_aux(iterator __position, bool __x) {
+    if (this->_M_finish._M_p != this->_M_end_of_storage._M_data) {
+      __copy_backward(__position, this->_M_finish, this->_M_finish + 1, random_access_iterator_tag(), (difference_type*)0 );
+      *__position = __x;
+      ++this->_M_finish;
+    }
+    else {
+      size_type __len = size() ? 2 * size() : __WORD_BIT;
+      unsigned int* __q = this->_M_bit_alloc(__len);
+      iterator __i = copy(begin(), __position, iterator(__q, 0));
+      *__i++ = __x;
+      this->_M_finish = copy(__position, end(), __i);
+      this->_M_deallocate();
+      this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+      this->_M_start = iterator(__q, 0);
+    }
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void _M_initialize_range(_InputIterator __first, _InputIterator __last,
+			const input_iterator_tag &) {
+    this->_M_start = iterator();
+    this->_M_finish = iterator();
+    this->_M_end_of_storage._M_data = 0;
+    for ( ; __first != __last; ++__first) 
+      push_back(*__first);
+  }
+
+  template <class _ForwardIterator>
+  void _M_initialize_range(_ForwardIterator __first, _ForwardIterator __last,
+                           const forward_iterator_tag &) {
+    size_type __n = distance(__first, __last);
+    _M_initialize(__n);
+    //    copy(__first, __last, _M_start);
+    copy(__first, __last, this->_M_start); // dwa 12/22/99 -- resolving ambiguous reference.
+  }
+
+  template <class _InputIterator>
+  void _M_insert_range(iterator __pos,
+                       _InputIterator __first, _InputIterator __last,
+                       const input_iterator_tag &) {
+    for ( ; __first != __last; ++__first) {
+      __pos = insert(__pos, *__first);
+      ++__pos;
+    }
+  }
+
+  template <class _ForwardIterator>
+  void _M_insert_range(iterator __position,
+                       _ForwardIterator __first, _ForwardIterator __last,
+                       const forward_iterator_tag &) {
+    if (__first != __last) {
+      size_type __n = distance(__first, __last);
+      if (capacity() - size() >= __n) {
+        __copy_backward(__position, end(), this->_M_finish + difference_type(__n), random_access_iterator_tag(), (difference_type*)0 );
+        copy(__first, __last, __position);
+        this->_M_finish += difference_type(__n);
+      }
+      else {
+        size_type __len = size() + (max)(size(), __n);
+        unsigned int* __q = this->_M_bit_alloc(__len);
+        iterator __i = copy(begin(), __position, iterator(__q, 0));
+        __i = copy(__first, __last, __i);
+        this->_M_finish = copy(__position, end(), __i);
+        this->_M_deallocate();
+        this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+        this->_M_start = iterator(__q, 0);
+      }
+    }
+  }      
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+  iterator begin() { return this->_M_start; }
+  const_iterator begin() const { return this->_M_start; }
+  iterator end() { return this->_M_finish; }
+  const_iterator end() const { return this->_M_finish; }
+
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin()); 
+  }
+
+  size_type size() const { return size_type(end() - begin()); }
+  size_type max_size() const { return size_type(-1); }
+  size_type capacity() const {
+    return size_type(const_iterator(this->_M_end_of_storage._M_data, 0) - begin());
+  }
+  bool empty() const { return begin() == end(); }
+  reference operator[](size_type __n) 
+  { return *(begin() + difference_type(__n)); }
+  const_reference operator[](size_type __n) const 
+  { return *(begin() + difference_type(__n)); }
+
+  void _M_range_check(size_type __n) const {
+    if (__n >= this->size())
+      __stl_throw_range_error("vector<bool>");
+  }
+
+  reference at(size_type __n)
+    { _M_range_check(__n); return (*this)[__n]; }
+  const_reference at(size_type __n) const
+    { _M_range_check(__n); return (*this)[__n]; }
+
+  explicit __BVECTOR(const allocator_type& __a = allocator_type())
+    : _Bvector_base<_Alloc >(__a) {}
+
+  __BVECTOR(size_type __n, bool __val,
+            const allocator_type& __a = 
+	    allocator_type())
+    : _Bvector_base<_Alloc >(__a)
+  {
+    _M_initialize(__n);
+    fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), __val ? ~0 : 0);
+  }
+
+  explicit __BVECTOR(size_type __n)
+    : _Bvector_base<_Alloc >(allocator_type())
+  {
+    _M_initialize(__n);
+    fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), 0);
+  }
+
+  __BVECTOR(const _Self& __x) : _Bvector_base<_Alloc >(__x.get_allocator()) {
+    _M_initialize(__x.size());
+    copy(__x.begin(), __x.end(), this->_M_start);
+  }
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+  template <class _Integer>
+  void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+    _M_initialize(__n);
+    fill(this->_M_start._M_p, this->_M_end_of_storage._M_data, __x ? ~0 : 0);
+  }
+    
+  template <class _InputIterator>
+  void _M_initialize_dispatch(_InputIterator __first, _InputIterator __last,
+                              const __false_type&) {
+    _M_initialize_range(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+  }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InputIterator>
+  __BVECTOR(_InputIterator __first, _InputIterator __last)
+    : _Base(allocator_type())
+  {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_dispatch(__first, __last, _Integral());
+  }
+# endif
+  template <class _InputIterator>
+  __BVECTOR(_InputIterator __first, _InputIterator __last,
+            const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _Base(__a)
+  {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_dispatch(__first, __last, _Integral());
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  __BVECTOR(const_iterator __first, const_iterator __last,
+            const allocator_type& __a = allocator_type())
+    : _Bvector_base<_Alloc >(__a)
+  {
+    size_type __n = distance(__first, __last);
+    _M_initialize(__n);
+    copy(__first, __last, this->_M_start);
+  }
+  __BVECTOR(const bool* __first, const bool* __last,
+            const allocator_type& __a = allocator_type())
+    : _Bvector_base<_Alloc >(__a)
+  {
+    size_type __n = distance(__first, __last);
+    _M_initialize(__n);
+    copy(__first, __last, this->_M_start);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  ~__BVECTOR() { }
+
+  __BVECTOR_QUALIFIED& operator=(const __BVECTOR_QUALIFIED& __x) {
+    if (&__x == this) return *this;
+    if (__x.size() > capacity()) {
+      this->_M_deallocate();
+      _M_initialize(__x.size());
+    }
+    copy(__x.begin(), __x.end(), begin());
+    this->_M_finish = begin() + difference_type(__x.size());
+    return *this;
+  }
+
+  // assign(), a generalized assignment member function.  Two
+  // versions: one that takes a count, and one that takes a range.
+  // The range version is a member template, so we dispatch on whether
+  // or not the type is an integer.
+
+  void _M_fill_assign(size_t __n, bool __x) {
+    if (__n > size()) {
+      fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), __x ? ~0 : 0);
+      insert(end(), __n - size(), __x);
+    }
+    else {
+      erase(begin() + __n, end());
+      fill(this->_M_start._M_p, (__chunk_type*)(this->_M_end_of_storage._M_data), __x ? ~0 : 0);
+    }
+  }
+  void assign(size_t __n, bool __x) { _M_fill_assign(__n, __x); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_assign_dispatch(__first, __last, _Integral());
+  }
+
+  template <class _Integer>
+  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+    { _M_fill_assign((size_t) __n, (bool) __val); }
+
+  template <class _InputIter>
+  void _M_assign_dispatch(_InputIter __first, _InputIter __last, const __false_type&)
+    { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
+
+  template <class _InputIterator>
+  void _M_assign_aux(_InputIterator __first, _InputIterator __last,
+                     const input_iterator_tag &) {
+    iterator __cur = begin();
+    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
+      *__cur = *__first;
+    if (__first == __last)
+      erase(__cur, end());
+    else
+      insert(end(), __first, __last);
+  }
+
+  template <class _ForwardIterator>
+  void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
+                     const forward_iterator_tag &) {
+    size_type __len = distance(__first, __last);
+    if (__len < size())
+      erase(copy(__first, __last, begin()), end());
+    else {
+      _ForwardIterator __mid = __first;
+      advance(__mid, size());
+      copy(__first, __mid, begin());
+      insert(end(), __mid, __last);
+    }
+  }    
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void reserve(size_type __n) {
+    if (capacity() < __n) {
+      unsigned int* __q = this->_M_bit_alloc(__n);
+      _Bit_iterator __z(__q, 0);
+      this->_M_finish = copy(begin(), end(), __z);
+      this->_M_deallocate();
+      this->_M_start = iterator(__q, 0);
+      this->_M_end_of_storage._M_data = __q + (__n + __WORD_BIT - 1)/__WORD_BIT;
+    }
+  }
+
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back() { return *(end() - 1); }
+  const_reference back() const { return *(end() - 1); }
+  void push_back(bool __x) {
+    if (this->_M_finish._M_p != this->_M_end_of_storage._M_data) {
+      *(this->_M_finish) = __x;
+      ++this->_M_finish;
+    }
+    else
+      _M_insert_aux(end(), __x);
+  }
+  void swap(__BVECTOR_QUALIFIED& __x) {
+    _STLP_STD::swap(this->_M_start, __x._M_start);
+    _STLP_STD::swap(this->_M_finish, __x._M_finish);
+    _STLP_STD::swap(this->_M_end_of_storage, __x._M_end_of_storage);
+  }
+  iterator insert(iterator __position, bool __x = bool()) {
+    difference_type __n = __position - begin();
+    if (this->_M_finish._M_p != this->_M_end_of_storage._M_data && __position == end()) {
+      *(this->_M_finish) = __x;
+      ++this->_M_finish;
+    }
+    else
+      _M_insert_aux(__position, __x);
+    return begin() + __n;
+  }
+
+#if defined ( _STLP_MEMBER_TEMPLATES )
+
+  template <class _Integer>
+  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
+                          const __true_type&) {
+    _M_fill_insert(__pos, (size_type) __n, (bool) __x);
+  }
+
+  template <class _InputIterator>
+  void _M_insert_dispatch(iterator __pos,
+                          _InputIterator __first, _InputIterator __last,
+                          const __false_type&) {
+    _M_insert_range(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+  }
+
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InputIterator>
+  void insert(iterator __position,
+              _InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Is_Integral;
+    _M_insert_dispatch(__position, __first, __last, _Is_Integral());
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert(iterator __position,
+              const_iterator __first, const_iterator __last) {
+    if (__first == __last) return;
+    size_type __n = distance(__first, __last);
+    if (capacity() - size() >= __n) {
+      __copy_backward(__position, end(), this->_M_finish + __n,
+                      random_access_iterator_tag(), (difference_type*)0 );
+      copy(__first, __last, __position);
+      this->_M_finish += __n;
+    }
+    else {
+      size_type __len = size() + (max)(size(), __n);
+      unsigned int* __q = this->_M_bit_alloc(__len);
+      iterator __i = copy(begin(), __position, iterator(__q, 0));
+      __i = copy(__first, __last, __i);
+      this->_M_finish = copy(__position, end(), __i);
+      this->_M_deallocate();
+      this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+      this->_M_start = iterator(__q, 0);
+    }
+  }
+
+  void insert(iterator __position, const bool* __first, const bool* __last) {
+    if (__first == __last) return;
+    size_type __n = distance(__first, __last);
+    if (capacity() - size() >= __n) {
+      __copy_backward(__position, end(), this->_M_finish + __n, 
+                      random_access_iterator_tag(), (difference_type*)0 );
+      copy(__first, __last, __position);
+      this->_M_finish += __n;
+    }
+    else {
+      size_type __len = size() + (max)(size(), __n);
+      unsigned int* __q = this->_M_bit_alloc(__len);
+      iterator __i = copy(begin(), __position, iterator(__q, 0));
+      __i = copy(__first, __last, __i);
+      this->_M_finish = copy(__position, end(), __i);
+      this->_M_deallocate();
+      this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+      this->_M_start = iterator(__q, 0);
+    }
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+  
+  void _M_fill_insert(iterator __position, size_type __n, bool __x) {
+    if (__n == 0) return;
+    if (capacity() - size() >= __n) {
+      __copy_backward(__position, end(), this->_M_finish + difference_type(__n), random_access_iterator_tag(), (difference_type*)0 );
+      fill(__position, __position + difference_type(__n), __x);
+      this->_M_finish += difference_type(__n);
+    }
+    else {
+      size_type __len = size() + (max)(size(), __n);
+      unsigned int* __q = this->_M_bit_alloc(__len);
+      iterator __i = copy(begin(), __position, iterator(__q, 0));
+      fill_n(__i, __n, __x);
+      this->_M_finish = copy(__position, end(), __i + difference_type(__n));
+      this->_M_deallocate();
+      this->_M_end_of_storage._M_data = __q + (__len + __WORD_BIT - 1)/__WORD_BIT;
+      this->_M_start = iterator(__q, 0);
+    }
+  }
+
+  void insert(iterator __position, size_type __n, bool __x) {
+    _M_fill_insert(__position, __n, __x);
+  }
+
+  void pop_back() {
+      --this->_M_finish; 
+  }
+  iterator erase(iterator __position) {
+    if (__position + 1 != end())
+      copy(__position + 1, end(), __position);
+      --this->_M_finish;
+    return __position;
+  }
+  iterator erase(iterator __first, iterator __last) {
+    this->_M_finish = copy(__last, end(), __first);
+    return __first;
+  }
+  void resize(size_type __new_size, bool __x = bool()) {
+    if (__new_size < size()) 
+      erase(begin() + difference_type(__new_size), end());
+    else
+      insert(end(), __new_size - size(), __x);
+  }
+  void flip() {
+    for (unsigned int* __p = this->_M_start._M_p; __p != this->_M_end_of_storage._M_data; ++__p)
+      *__p = ~*__p;
+  }
+
+  void clear() { erase(begin(), end()); }
+};
+
+# if defined  ( _STLP_NO_BOOL ) || defined (__HP_aCC) // fixed soon (03/17/2000)
+ 
+#define _STLP_TEMPLATE_HEADER __BVEC_TMPL_HEADER
+#define _STLP_TEMPLATE_CONTAINER __BVECTOR_QUALIFIED
+#include <stl/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+  
+# endif /* NO_BOOL */
+  
+#if !defined (_STLP_NO_BOOL)
+// This typedef is non-standard.  It is provided for backward compatibility.
+  typedef __WORKAROUND_DBG_RENAME(vector) <bool, allocator<bool> > bit_vector;
+#endif
+
+_STLP_END_NAMESPACE
+
+#undef _Alloc
+#undef _STLP_VECBOOL_TEMPLATE
+#undef __BVECTOR
+#undef __BVECTOR_QUALIFIED
+#undef __BVEC_TMPL_HEADER
+
+# undef __WORD_BIT
+
+#endif /* _STLP_INTERNAL_BVECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_check_config.h b/src/STLport/stl/_check_config.h
new file mode 100644
index 0000000..923c4ba
--- /dev/null
+++ b/src/STLport/stl/_check_config.h
@@ -0,0 +1,37 @@
+// This file is reserved to site configuration purpose
+// and should NEVER be overridden by user
+
+# if defined ( _STLP_NO_OWN_IOSTREAMS )
+
+// User choose not to use SGI iostreams, which means no
+// precompiled library will be used and he is free to override
+// any STLport configuration flags
+
+# else
+
+// The following will be defined in stl_config.h :
+// # define _STLP_OWN_IOSTREAMS 1
+# endif
+
+/*
+ *  Consistency check : if we use SGI iostreams, we have to use consistent
+ *  thread model (single-threaded or multi-threaded) with the compiled library
+ *  
+ *  Default is multithreaded build. If you want to build and use single-threaded
+ *  STLport, please change _STLP_NOTHREADS configuration setting above and rebuild the library
+ *
+ */
+
+# if defined (_STLP_OWN_IOSTREAMS) \
+  && !defined (_STLP_NO_THREADS) && !defined (_REENTRANT)
+
+#  if defined(_MSC_VER) && !defined(__MWERKS__) && !defined (__COMO__) && !defined(_MT)
+#   error "Only multi-threaded runtime library may be linked with STLport!"  
+#  endif
+
+// boris : you may change that to build non-threadsafe STLport library
+#  if defined (__BUILDING_STLPORT) /* || defined (_STLP_DEBUG) */
+#   define _REENTRANT 1
+#  endif
+
+# endif
diff --git a/src/STLport/stl/_cmath.h b/src/STLport/stl/_cmath.h
new file mode 100644
index 0000000..b9a5ab4
--- /dev/null
+++ b/src/STLport/stl/_cmath.h
@@ -0,0 +1,208 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CMATH_H_HEADER
+# define _STLP_CMATH_H_HEADER
+
+# include <cmath>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_SAME_FUNCTION_NAME_RESOLUTION_BUG
+
+// this proxy is needed for some compilers to resolve problems
+// calling sqrt() from within sqrt(), etc.
+template <class _Tp>
+struct _STL_math_proxy {
+  static inline _Tp _do_abs(const _Tp& __x)     { return _STLP_VENDOR_CSTD::fabs(__x); } 
+  static inline _Tp _do_acos(const _Tp& __x)    { return _STLP_VENDOR_CSTD::acos(__x); } 
+  static inline _Tp _do_asin(const _Tp& __x)    { return _STLP_VENDOR_CSTD::asin(__x); } 
+  static inline _Tp _do_atan(const _Tp& __x)    { return _STLP_VENDOR_CSTD::atan(__x); } 
+  static inline _Tp _do_atan2(const _Tp& __x, const _Tp& __y)  { return _STLP_VENDOR_CSTD::atan2(__x, __y); } 
+  static inline _Tp _do_cos(const _Tp& __x)     { return _STLP_VENDOR_CSTD::cos(__x); } 
+  static inline _Tp _do_cosh(const _Tp& __x)    { return _STLP_VENDOR_CSTD::cosh(__x); } 
+  static inline _Tp _do_floor(const _Tp& __x)    { return _STLP_VENDOR_CSTD::floor(__x); } 
+  static inline _Tp _do_ceil(const _Tp& __x)    { return _STLP_VENDOR_CSTD::ceil(__x); } 
+  static inline _Tp _do_fmod(const _Tp& __x, const _Tp& __y)    { return _STLP_VENDOR_CSTD::fmod(__x, __y); } 
+  static inline _Tp _do_frexp(const _Tp& __x, int* __y)    { return _STLP_VENDOR_CSTD::frexp(__x, __y); } 
+  static inline _Tp _do_ldexp(const _Tp& __x, int __y)    { return _STLP_VENDOR_CSTD::ldexp(__x, __y); } 
+  static inline _Tp _do_modf(const _Tp& __x, double* __y) { return _STLP_VENDOR_CSTD::modf(__x, __y); }
+  static inline _Tp _do_log(const _Tp& __x)     { return _STLP_VENDOR_CSTD::log(__x); } 
+  static inline _Tp _do_log10(const _Tp& __x)   { return _STLP_VENDOR_CSTD::log10(__x); } 
+  static inline _Tp _do_pow(const _Tp& __x, const _Tp& __y)    { return _STLP_VENDOR_CSTD::pow(__x, __y); } 
+  static inline _Tp _do_pow(const _Tp& __x, int __y)    { return _STLP_VENDOR_CSTD::pow(__x, __y); } 
+  static inline _Tp _do_sin(const _Tp& __x)     { return _STLP_VENDOR_CSTD::sin(__x); } 
+  static inline _Tp _do_sinh(const _Tp& __x)    { return _STLP_VENDOR_CSTD::sinh(__x); } 
+
+  static inline _Tp _do_sqrt(const _Tp& __x)    { return _STLP_VENDOR_CSTD::sqrt(__x); } 
+  static inline _Tp _do_tan(const _Tp& __x)     { return _STLP_VENDOR_CSTD::tan(__x); } 
+  static inline _Tp _do_tanh(const _Tp& __x)    { return _STLP_VENDOR_CSTD::tanh(__x); } 
+  static inline _Tp _do_exp(const _Tp& __x)     { return _STLP_VENDOR_CSTD::exp(__x); } 
+  static inline _Tp _do_hypot(const _Tp& __x, const _Tp& __y)   { return _STLP_VENDOR_CSTD::hypot(__x, __y); } 
+};
+
+#  define _STLP_DO_ABS(_Tp)   _STL_math_proxy<_Tp>::_do_abs
+#  define _STLP_DO_ACOS(_Tp)  _STL_math_proxy<_Tp>::_do_acos
+#  define _STLP_DO_ASIN(_Tp)  _STL_math_proxy<_Tp>::_do_asin
+#  define _STLP_DO_ATAN(_Tp)  _STL_math_proxy<_Tp>::_do_atan
+#  define _STLP_DO_ATAN2(_Tp) _STL_math_proxy<_Tp>::_do_atan2
+#  define _STLP_DO_COS(_Tp)   _STL_math_proxy<_Tp>::_do_cos
+#  define _STLP_DO_COSH(_Tp)  _STL_math_proxy<_Tp>::_do_cosh
+#  define _STLP_DO_FLOOR(_Tp) _STL_math_proxy<_Tp>::_do_floor
+#  define _STLP_DO_CEIL(_Tp) _STL_math_proxy<_Tp>::_do_ceil
+#  define _STLP_DO_FMOD(_Tp) _STL_math_proxy<_Tp>::_do_fmod
+#  define _STLP_DO_FREXP(_Tp) _STL_math_proxy<_Tp>::_do_frexp
+#  define _STLP_DO_LDEXP(_Tp) _STL_math_proxy<_Tp>::_do_ldexp
+#  define _STLP_DO_MODF(_Tp) _STL_math_proxy<_Tp>::_do_modf
+#  define _STLP_DO_LOG(_Tp)   _STL_math_proxy<_Tp>::_do_log
+#  define _STLP_DO_LOG10(_Tp) _STL_math_proxy<_Tp>::_do_log10
+#  define _STLP_DO_POW(_Tp)   _STL_math_proxy<_Tp>::_do_pow
+#  define _STLP_DO_SIN(_Tp)   _STL_math_proxy<_Tp>::_do_sin
+#  define _STLP_DO_SINH(_Tp)  _STL_math_proxy<_Tp>::_do_sinh
+#  define _STLP_DO_SQRT(_Tp)  _STL_math_proxy<_Tp>::_do_sqrt
+#  define _STLP_DO_TAN(_Tp)   _STL_math_proxy<_Tp>::_do_tan
+#  define _STLP_DO_TANH(_Tp)  _STL_math_proxy<_Tp>::_do_tanh
+#  define _STLP_DO_EXP(_Tp)   _STL_math_proxy<_Tp>::_do_exp
+#  define _STLP_DO_HYPOT(_Tp) _STL_math_proxy<_Tp>::_do_hypot
+# else
+
+#  define _STLP_DO_ABS(_Tp)   _STLP_VENDOR_CSTD::fabs
+#  define _STLP_DO_ACOS(_Tp)  _STLP_VENDOR_CSTD::acos
+#  define _STLP_DO_ASIN(_Tp)  _STLP_VENDOR_CSTD::asin
+#  define _STLP_DO_ATAN(_Tp)  _STLP_VENDOR_CSTD::atan
+#  define _STLP_DO_ATAN2(_Tp) _STLP_VENDOR_CSTD::atan2
+#  define _STLP_DO_COS(_Tp)   _STLP_VENDOR_CSTD::cos
+#  define _STLP_DO_COSH(_Tp)  _STLP_VENDOR_CSTD::cosh
+#  define _STLP_DO_FLOOR(_Tp)  _STLP_VENDOR_CSTD::floor
+#  define _STLP_DO_CEIL(_Tp)   _STLP_VENDOR_CSTD::ceil
+#  define _STLP_DO_FMOD(_Tp)   _STLP_VENDOR_CSTD::fmod
+#  define _STLP_DO_FREXP(_Tp) _STLP_VENDOR_CSTD::frexp
+#  define _STLP_DO_LDEXP(_Tp) _STLP_VENDOR_CSTD::ldexp
+#  define _STLP_DO_MODF(_Tp) _STLP_VENDOR_CSTD::modf
+#  define _STLP_DO_LOG(_Tp)   _STLP_VENDOR_CSTD::log
+#  define _STLP_DO_LOG10(_Tp) _STLP_VENDOR_CSTD::log10
+#  define _STLP_DO_POW(_Tp)   _STLP_VENDOR_CSTD::pow
+#  define _STLP_DO_SIN(_Tp)   _STLP_VENDOR_CSTD::sin
+#  define _STLP_DO_SINH(_Tp)  _STLP_VENDOR_CSTD::sinh
+#  define _STLP_DO_SQRT(_Tp)  _STLP_VENDOR_CSTD::sqrt
+#  define _STLP_DO_TAN(_Tp)   _STLP_VENDOR_CSTD::tan
+#  define _STLP_DO_TANH(_Tp)  _STLP_VENDOR_CSTD::tanh
+#  define _STLP_DO_EXP(_Tp)   _STLP_VENDOR_CSTD::exp
+//# if defined (__GNUC__) || defined ( __IBMCPP__ ) || defined (__SUNPRO_CC) || defined (__HP_aCC) || (_MSC_VER >= 1310)
+#  define _STLP_DO_HYPOT(_Tp) ::hypot
+// # else
+// #  define _STLP_DO_HYPOT(_Tp) _STLP_VENDOR_CSTD::hypot
+// # endif
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# if (defined (_STLP_HAS_NO_NEW_C_HEADERS) || defined(_STLP_MSVC) || defined (__ICL)) && !defined (_STLP_HAS_NO_NAMESPACES)
+
+#if ! defined (_STLP_USE_NEW_C_HEADERS) 
+
+_STLP_BEGIN_NAMESPACE
+
+#  ifndef _STLP_HAS_NATIVE_FLOAT_ABS
+inline double abs(double __x)                 { return _STLP_DO_ABS(double)(__x); }
+inline float abs (float __x)                  { return _STLP_DO_ABS(float)(__x); }
+#  endif
+
+inline double pow(double __x, int __y)        { return _STLP_DO_POW(double)(__x, __y); }
+inline float acos (float __x)                 { return _STLP_DO_ACOS(float)(__x); }
+inline float asin (float __x)                 { return _STLP_DO_ASIN(float)(__x); }
+inline float atan (float __x)                 { return _STLP_DO_ATAN(float)(__x); }
+inline float atan2(float __x, float __y)      { return _STLP_DO_ATAN2(float)(__x, __y); }
+inline float ceil (float __x)                 { return _STLP_DO_CEIL(float)(__x); }
+inline float cos (float __x)                  { return _STLP_DO_COS(float)(__x); }
+inline float cosh (float __x)                 { return _STLP_DO_COSH(float)(__x); }
+inline float exp (float __x)                  { return _STLP_DO_EXP(float)(__x); }
+# ifdef _STLP_USE_NAMESPACES
+inline float fabs (float __x)                 { return _STLP_DO_ABS(float)(__x); }
+# endif
+inline float floor(float __x)                 { return _STLP_DO_FLOOR(float)(__x); }
+inline float fmod (float __x, float __y)      { return _STLP_DO_FMOD(float)(__x, __y); }
+inline float frexp(float __x, int* __y)       { return _STLP_DO_FREXP(float)(__x, __y); }
+inline float ldexp(float __x, int __y)        { return _STLP_DO_LDEXP(float)(__x, __y); }
+// fbp : float versions are not always available
+#if !defined(_STLP_VENDOR_LONG_DOUBLE_MATH)		//*ty 11/25/2001 - 
+inline float modf (float __x, float* __y)     { 
+  double __dd[2]; 
+  double __res = _STLP_DO_MODF(double)((double)__x, __dd); 
+  __y[0] = (float)__dd[0] ; __y[1] = (float)__dd[1]; 
+  return (float)__res; 
+}
+#else		//*ty 11/25/2001 - i.e. for apple SCpp
+inline float modf (float __x, float* __y)     { 
+  long double __dd[2]; 
+  long double __res = _STLP_DO_MODF(long double)((long double)__x, __dd); 
+  __y[0] = (float)__dd[0] ; __y[1] = (float)__dd[1]; 
+  return (float)__res; 
+}
+#endif		//*ty 11/25/2001 - 
+
+inline float log (float __x)                  { return _STLP_DO_LOG(float)(__x); }
+inline float log10(float __x)                 { return _STLP_DO_LOG10(float)(__x); }
+inline float pow (float __x, float __y)       { return _STLP_DO_POW(float)(__x, __y); }
+inline float pow (float __x, int __y)         { return _STLP_DO_POW(float)(__x, __y); }
+inline float sin (float __x)                  { return _STLP_DO_SIN(float)(__x); }
+inline float sinh (float __x)                 { return _STLP_DO_SINH(float)(__x); }
+inline float sqrt (float __x)                 { return _STLP_DO_SQRT(float)(__x); }
+inline float tan (float __x)                  { return _STLP_DO_TAN(float)(__x); }
+inline float tanh (float __x)                 { return _STLP_DO_TANH(float)(__x); }
+
+#  if ! (defined  (_STLP_NO_LONG_DOUBLE) || defined(_STLP_VENDOR_LONG_DOUBLE_MATH))
+
+#if !defined (__MVS__)
+inline long double abs (long double __x)                  { return _STLP_DO_ABS(long double)((double)__x); }
+#endif
+inline long double acos (long double __x)                 { return _STLP_DO_ACOS(long double)(__x); }
+inline long double asin (long double __x)                 { return _STLP_DO_ASIN(long double)(__x); }
+inline long double atan (long double __x)                 { return _STLP_DO_ATAN(long double)(__x); }
+inline long double atan2(long double __x, long double __y)      { return _STLP_DO_ATAN2(long double)(__x, __y); }
+inline long double ceil (long double __x)                 { return _STLP_DO_CEIL(long double)(__x); }
+inline long double cos (long double __x)                  { return _STLP_DO_COS(long double)(__x); }
+inline long double cosh (long double __x)                 { return _STLP_DO_COSH(long double)(__x); }
+inline long double exp (long double __x)                  { return _STLP_DO_EXP(long double)(__x); }
+inline long double fabs (long double __x)                 { return _STLP_DO_ABS(long double)(__x); }
+inline long double floor(long double __x)                 { return _STLP_DO_FLOOR(long double)(__x); }
+inline long double fmod (long double __x, long double __y)      { return _STLP_DO_FMOD(long double)(__x, __y); }
+inline long double frexp(long double __x, int* __y)       { return _STLP_DO_FREXP(long double)(__x, __y); }
+inline long double ldexp(long double __x, int __y)        { return _STLP_DO_LDEXP(long double)(__x, __y); }
+// fbp : long double versions are not available
+inline long double modf (long double __x, long double* __y)     { 
+  double __dd[2]; 
+  double __res = _STLP_DO_MODF(double)((double)__x, __dd); 
+  __y[0] = (long double)__dd[0] ; __y[1] = (long double)__dd[1]; 
+  return (long double)__res; 
+}
+inline long double log (long double __x)                  { return _STLP_DO_LOG(long double)(__x); }
+inline long double log10(long double __x)                 { return _STLP_DO_LOG10(long double)(__x); }
+inline long double pow (long double __x, long double __y)       { return _STLP_DO_POW(long double)(__x, __y); }
+inline long double pow (long double __x, int __y)         { return _STLP_DO_POW(long double)(__x, __y); }
+inline long double sin (long double __x)                  { return _STLP_DO_SIN(long double)(__x); }
+inline long double sinh (long double __x)                 { return _STLP_DO_SINH(long double)(__x); }
+inline long double sqrt (long double __x)                 { return _STLP_DO_SQRT(long double)(__x); }
+inline long double tan (long double __x)                  { return _STLP_DO_TAN(long double)(__x); }
+inline long double tanh (long double __x)                 { return _STLP_DO_TANH(long double)(__x); }
+#  endif
+
+_STLP_END_NAMESPACE
+
+# endif /* NEW_C_HEADERS */
+# endif /* NEW_C_HEADERS */
+
+#endif /* CMATH_H */
diff --git a/src/STLport/stl/_codecvt.h b/src/STLport/stl/_codecvt.h
new file mode 100644
index 0000000..48e2702
--- /dev/null
+++ b/src/STLport/stl/_codecvt.h
@@ -0,0 +1,307 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_CODECVT_H
+#define _STLP_INTERNAL_CODECVT_H
+
+# ifndef _STLP_C_LOCALE_H
+#  include <stl/c_locale.h>
+# endif
+# ifndef _STLP_INTERNAL_LOCALE_H
+#  include <stl/_locale.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC codecvt_base {
+public:
+  enum result {ok, partial, error, noconv};
+};
+
+template <class _InternT, class _ExternT, class _StateT>
+class codecvt : public locale::facet, public codecvt_base {
+  typedef _InternT intern_type;
+  typedef _ExternT extern_type;
+  typedef _StateT state_type;
+};
+ 
+template <class _InternT, class _ExternT, class _StateT>
+class codecvt_byname : public codecvt<_InternT, _ExternT, _StateT> {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC codecvt<char, char, mbstate_t>
+  : public locale::facet, public codecvt_base 
+{
+  friend class _Locale;
+public:
+  typedef char       intern_type;
+  typedef char       extern_type;
+  typedef mbstate_t  state_type;
+
+  explicit codecvt(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  result out(state_type&  __state,
+             const char*  __from,
+             const char*  __from_end,
+             const char*& __from_next,
+             char*        __to,
+             char*        __to_limit, 
+             char*&       __to_next) const {
+    return do_out(__state, 
+                  __from, __from_end, __from_next,
+                  __to,   __to_limit, __to_next);
+  }
+
+  result unshift(mbstate_t& __state,
+                 char* __to, char* __to_limit, char*& __to_next) const
+    { return do_unshift(__state, __to, __to_limit, __to_next); }
+    
+  result in(state_type&   __state,
+            const char*  __from,
+            const char*  __from_end,  
+            const char*& __from_next,
+            char*        __to, 
+            char*        __to_limit, 
+            char*&       __to_next) const {
+    return do_in(__state,
+                 __from, __from_end, __from_next,
+                 __to,   __to_limit, __to_next);
+  }
+
+  int encoding() const _STLP_NOTHROW { return do_encoding(); }
+
+  bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
+
+  int length(const state_type& __state,
+             const char* __from, const char* __end,
+             size_t __max) const
+    { return do_length(__state, __from, __end, __max); }
+  
+  int max_length() const _STLP_NOTHROW { return do_max_length(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~codecvt();
+
+  virtual result do_out(mbstate_t&   /* __state */,
+                        const char*  __from,
+                        const char*  /* __from_end */,
+                        const char*& __from_next,
+                        char*        __to,
+                        char*        /* __to_limit */,
+                        char*&       __to_next) const;
+
+  virtual result do_in (mbstate_t&   /* __state */ , 
+                        const char*  __from,
+                        const char*  /* __from_end */,
+                        const char*& __from_next,
+                        char*        __to,
+                        char*        /* __to_end */,
+                        char*&       __to_next) const;
+
+  virtual result do_unshift(mbstate_t& /* __state */,
+                            char*      __to,
+                            char*      /* __to_limit */,
+                            char*&     __to_next) const;
+
+  virtual int do_encoding() const _STLP_NOTHROW;
+  virtual bool do_always_noconv() const _STLP_NOTHROW;
+  virtual int do_length(const mbstate_t&         __state,
+                        const  char* __from, 
+                        const  char* __end,
+                        size_t __max) const;
+  virtual int do_max_length() const _STLP_NOTHROW;
+private:
+  codecvt(const codecvt<char, char, mbstate_t>&);
+  codecvt<char, char, mbstate_t>& operator =(const codecvt<char, char, mbstate_t>&); 
+};
+
+# ifndef _STLP_NO_WCHAR_T
+ 
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC codecvt<wchar_t, char, mbstate_t>
+  : public locale::facet, public codecvt_base
+{
+  friend class _Locale;
+public:
+  typedef wchar_t    intern_type;
+  typedef char       extern_type;
+  typedef mbstate_t  state_type;
+
+  explicit codecvt(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  result out(mbstate_t       __state,
+             const wchar_t*  __from,
+             const wchar_t*  __from_end,
+             const wchar_t*& __from_next,
+             char*           __to,
+             char*           __to_limit,
+             char*&          __to_next) const {
+    return do_out(__state,
+                  __from, __from_end, __from_next, 
+                  __to,   __to_limit, __to_next);
+  }
+
+  result unshift(mbstate_t& __state,
+                 char*  __to, char*  __to_limit, char*& __to_next) const {
+    return do_unshift(__state, __to, __to_limit, __to_next);
+  }
+    
+  result in(mbstate_t    __state,
+            const char*  __from,
+            const char*  __from_end,  
+            const char*& __from_next,
+            wchar_t*     __to, 
+            wchar_t*     __to_limit, 
+            wchar_t*&    __to_next) const {
+    return do_in(__state, 
+                 __from, __from_end, __from_next,
+                 __to,  __to_limit, __to_next);
+  }
+
+  int encoding() const _STLP_NOTHROW { return do_encoding(); }
+
+  bool always_noconv() const _STLP_NOTHROW { return do_always_noconv(); }
+
+  int length(const mbstate_t&        __state,
+             const char* __from,
+             const char* __end,
+             size_t             __max) const
+    { return do_length(__state, __from, __end, __max); }
+  
+  int max_length() const _STLP_NOTHROW { return do_max_length(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~codecvt();
+
+  virtual result do_out(mbstate_t&         __state,
+                        const wchar_t*  __from,
+                        const wchar_t*  __from_end,
+                        const wchar_t*& __from_next,
+                        char*        __to,
+                        char*        __to_limit,
+                        char*&       __to_next) const;
+
+  virtual result do_in (mbstate_t&         __state,
+                        const char*  __from,
+                        const char*  __from_end,
+                        const char*& __from_next,
+                        wchar_t*        __to,
+                        wchar_t*        __to_limit,
+                        wchar_t*&       __to_next) const;
+
+  virtual result do_unshift(mbstate_t&   __state,
+                            char*  __to, 
+                            char*  __to_limit,
+                            char*& __to_next) const;
+
+  virtual int do_encoding() const _STLP_NOTHROW;
+
+  virtual bool do_always_noconv() const _STLP_NOTHROW;
+  
+  virtual int do_length(const mbstate_t& __state,
+                        const  char* __from, 
+                        const  char* __end,
+                        size_t __max) const;
+
+  virtual int do_max_length() const _STLP_NOTHROW;
+
+private:
+  codecvt(const codecvt<wchar_t, char, mbstate_t>&);
+  codecvt<wchar_t, char, mbstate_t>& operator = (const codecvt<wchar_t, char, mbstate_t>&);  
+};
+
+# endif
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC codecvt_byname<char, char, mbstate_t>
+  : public codecvt<char, char, mbstate_t> {
+public:
+  explicit codecvt_byname(const char* __name, size_t __refs = 0);
+  ~codecvt_byname();
+private:
+  codecvt_byname(const codecvt_byname<char, char, mbstate_t>&);
+  codecvt_byname<char, char, mbstate_t>& operator =(const codecvt_byname<char, char, mbstate_t>&);  
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class codecvt_byname<wchar_t, char, mbstate_t>
+  : public codecvt<wchar_t, char, mbstate_t> 
+{
+public:
+  explicit codecvt_byname(const char * __name, size_t __refs = 0);    
+
+protected:
+  ~codecvt_byname();
+
+  virtual result do_out(mbstate_t&         __state,
+                        const wchar_t*  __from,
+                        const wchar_t*  __from_end,
+                        const wchar_t*& __from_next,
+                        char*        __to,
+                        char*        __to_limit,
+                        char*&       __to_next) const;
+
+  virtual result do_in (mbstate_t&         __state,
+                        const char*  __from,
+                        const char*  __from_end,
+                        const char*& __from_next,
+                        wchar_t*        __to,
+                        wchar_t*        __to_limit,
+                        wchar_t*&       __to_next) const;
+
+  virtual result do_unshift(mbstate_t&   __state,
+                            char*  __to, 
+                            char*  __to_limit,
+                            char*& __to_next) const;
+
+  virtual int do_encoding() const _STLP_NOTHROW;
+
+  virtual bool do_always_noconv() const _STLP_NOTHROW;
+  
+  virtual int do_length(const mbstate_t&         __state,
+                        const  char* __from, 
+                        const  char* __end,
+                        size_t __max) const;
+
+  virtual int do_max_length() const _STLP_NOTHROW;
+
+private:
+  _Locale_ctype* _M_ctype;
+  codecvt_byname(const codecvt_byname<wchar_t, char, mbstate_t>&);
+  codecvt_byname<wchar_t, char, mbstate_t>& operator =(const codecvt_byname<wchar_t, char, mbstate_t>&);  
+};
+
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CODECVT_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_collate.h b/src/STLport/stl/_collate.h
new file mode 100644
index 0000000..6ad23c3
--- /dev/null
+++ b/src/STLport/stl/_collate.h
@@ -0,0 +1,182 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+#ifndef _STLP_INTERNAL_COLLATE_H
+#define _STLP_INTERNAL_COLLATE_H
+
+#ifndef _STLP_C_LOCALE_H
+# include <stl/c_locale.h>
+#endif
+
+#ifndef _STLP_INTERNAL_LOCALE_H
+# include <stl/_locale.h>
+#endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+
+template <class _CharT> class collate {};
+template <class _CharT> class collate_byname {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate<char> : public locale::facet 
+{
+  friend class _Locale;
+public:
+  typedef char   char_type;
+  typedef string string_type;
+
+  explicit collate(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  int compare(const char* __low1, const char* __high1,
+              const char* __low2, const char* __high2) const {
+    return do_compare( __low1, __high1, __low2, __high2);
+  }
+
+  string_type transform(const char* __low, const char* __high) const {
+    return do_transform(__low, __high);
+  }
+
+  long hash(const char* __low, const char* __high) const
+    { return do_hash(__low, __high); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~collate();
+
+  virtual int do_compare(const char*, const char*,
+                         const char*, const char*) const;
+  virtual string_type do_transform(const char*, const char*) const;
+  virtual long do_hash(const char*, const char*) const;
+private:
+  collate(const collate<char>&);
+  collate<char>& operator =(const collate<char>&);  
+};
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate<wchar_t> : public locale::facet 
+{
+  friend class _Locale;
+public:
+  typedef wchar_t char_type;
+  typedef wstring string_type;
+
+  explicit collate(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  int compare(const wchar_t* __low1, const wchar_t* __high1,
+              const wchar_t* __low2, const wchar_t* __high2) const {
+    return do_compare( __low1, __high1, __low2, __high2);
+  }
+
+  string_type transform(const wchar_t* __low, const wchar_t* __high) const {
+    return do_transform(__low, __high);
+  }
+
+  long hash(const wchar_t* __low, const wchar_t* __high) const
+    { return do_hash(__low, __high); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~collate();
+
+  virtual int do_compare(const wchar_t*, const wchar_t*,
+                         const wchar_t*, const wchar_t*) const;
+  virtual string_type do_transform(const wchar_t*, const wchar_t*) const;
+  virtual long do_hash(const wchar_t* __low, const wchar_t* __high) const;
+private:
+  collate(const collate<wchar_t>&);
+  collate<wchar_t>& operator = (const collate<wchar_t>&);  
+};
+
+# endif /* NO_WCHAR_T */
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate_byname<char>: public collate<char> 
+{
+public:
+  explicit collate_byname(const char* __name, size_t __refs = 0);
+
+protected:
+  ~collate_byname();
+
+  virtual int do_compare(const char*, const char*,
+                         const char*, const char*) const;
+  virtual string_type do_transform(const char*, const char*) const;
+
+private:
+  _Locale_collate* _M_collate;
+  collate_byname(const collate_byname<char>&);
+  collate_byname<char>& operator =(const collate_byname<char>&);  
+};
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC collate_byname<wchar_t>: public collate<wchar_t> 
+{
+public:
+  explicit collate_byname(const char * __name, size_t __refs = 0);
+
+protected:
+  ~collate_byname();
+
+  virtual int do_compare(const wchar_t*, const wchar_t*,
+                         const wchar_t*, const wchar_t*) const;
+  virtual string_type do_transform(const wchar_t*, const wchar_t*) const;
+
+private:
+  _Locale_collate* _M_collate;
+  collate_byname(const collate_byname<wchar_t>&);
+  collate_byname<wchar_t>& operator =(const collate_byname<wchar_t>&);  
+};
+
+# endif /* NO_WCHAR_T */
+
+
+template <class _CharT>
+bool 
+__locale_do_operator_call (const locale* __that, 
+                           const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __x,
+                           const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __y) 
+{
+  collate<_CharT>* __f = (collate<_CharT>*)__that->_M_get_facet(collate<_CharT>::id);
+  if (!__f)
+    __that->_M_throw_runtime_error();
+  return __f->compare(__x.data(), __x.data() + __x.size(),
+                      __y.data(), __y.data() + __y.size()) < 0;
+  
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_COLLATE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_complex.c b/src/STLport/stl/_complex.c
new file mode 100644
index 0000000..804766e
--- /dev/null
+++ b/src/STLport/stl/_complex.c
@@ -0,0 +1,169 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_COMPLEX_C
+#define _STLP_COMPLEX_C
+
+# ifndef _STLP_internal_complex_h
+#  include <stl/_complex.h>
+# endif
+
+#include <istream>
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+# include <sstream>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Non-inline member functions.
+
+template <class _Tp>
+void complex<_Tp>::_div(const _Tp& __z1_r, const _Tp& __z1_i,
+                        const _Tp& __z2_r, const _Tp& __z2_i,
+                        _Tp& __res_r, _Tp& __res_i) {
+  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    _Tp __ratio = __z2_r / __z2_i;
+    _Tp __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio + __z1_i) / __denom;
+    __res_i = (__z1_i * __ratio - __z1_r) / __denom;
+  }
+  else {
+    _Tp __ratio = __z2_i / __z2_r;
+    _Tp __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = (__z1_r + __z1_i * __ratio) / __denom;
+    __res_i = (__z1_i - __z1_r * __ratio) / __denom;
+  }
+}
+
+template <class _Tp>
+void complex<_Tp>::_div(const _Tp& __z1_r,
+                        const _Tp& __z2_r, const _Tp& __z2_i,
+                        _Tp& __res_r, _Tp& __res_i) {
+  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;
+  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;
+
+  if (__ar <= __ai) {
+    _Tp __ratio = __z2_r / __z2_i;
+    _Tp __denom = __z2_i * (1 + __ratio * __ratio);
+    __res_r = (__z1_r * __ratio) / __denom;
+    __res_i = - __z1_r / __denom;
+  }
+  else {
+    _Tp __ratio = __z2_i / __z2_r;
+    _Tp __denom = __z2_r * (1 + __ratio * __ratio);
+    __res_r = __z1_r / __denom;
+    __res_i = - (__z1_r * __ratio) / __denom;
+  }
+}
+
+// I/O.
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+
+// Complex output, in the form (re,im).  We use a two-step process 
+// involving stringstream so that we get the padding right.  
+template <class _Tp, class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z)
+{
+  basic_ostringstream<_CharT, _Traits, allocator<_CharT> > __tmp;
+  __tmp.flags(__os.flags());
+  __tmp.imbue(__os.getloc());
+  __tmp.precision(__os.precision());
+  __tmp << '(' << __z.real() << ',' << __z.imag() << ')';
+  return __os << __tmp.str();
+}
+
+// Complex input from arbitrary streams.  Note that results in some
+// locales may be confusing, since the decimal character varies with
+// locale and the separator between real and imaginary parts does not.
+
+template <class _Tp, class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z)
+{
+  _Tp  __re = 0;
+  _Tp  __im = 0;
+
+  // typedef ctype<_CharT> _Ctype;
+  //  locale __loc = __is.getloc();
+  //const _Ctype&  __c_type  = use_facet<_Ctype>(__loc);
+  const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__is._M_ctype_facet();
+
+  char   __punct[4] = "(,)";
+  _CharT __wpunct[3];
+  __c_type.widen(__punct, __punct + 3, __wpunct);
+
+  _CharT __c;
+
+  __is >> __c;
+  if (_Traits::eq(__c, __wpunct[0])) {  // Left paren
+    __is >> __re >> __c;
+    if (_Traits::eq(__c, __wpunct[1]))  // Comma
+      __is >> __im >> __c;
+    if (!_Traits::eq(__c, __wpunct[2])) // Right paren
+      __is.setstate(ios_base::failbit);
+  }
+  else {
+    __is.putback(__c);
+    __is >> __re;
+  }
+
+  if (__is)
+    __z = complex<_Tp>(__re, __im);
+  return __is;
+}
+
+
+#else /* _STLP_USE_NEW_IOSTREAMS */
+
+template <class _Tp>
+ostream& _STLP_CALL operator<<(ostream& s, const complex<_Tp>& __z)
+{
+  return s << "( " << __z._M_re <<", " << __z._M_im <<")";
+}
+
+template <class _Tp>
+istream& _STLP_CALL operator>>(istream& s, complex<_Tp>& a)
+{
+  _Tp re = 0, im = 0;
+  char 	c = 0;
+
+  s >> c;
+  if (c == '(') {
+    s >> re >> c;
+    if (c == ',') s >> im >> c;
+    if (c != ')') s.clear(ios::badbit);
+  }
+  else {
+    s.putback(c);
+    s >> re;
+  }
+
+  if (s) a = complex<_Tp>(re, im);
+  return s;
+}
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_COMPLEX_C */
diff --git a/src/STLport/stl/_complex.h b/src/STLport/stl/_complex.h
new file mode 100644
index 0000000..d019116
--- /dev/null
+++ b/src/STLport/stl/_complex.h
@@ -0,0 +1,969 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_internal_complex_h
+#define _STLP_internal_complex_h
+
+// This header declares the template class complex, as described in 
+// in the draft C++ standard.  Single-precision complex numbers
+// are complex<float>, double-precision are complex<double>, and
+// quad precision are complex<long double>.
+
+// Note that the template class complex is declared within namespace
+// std, as called for by the draft C++ standard.  
+
+#include <stl/_cmath.h>
+#include <iosfwd>
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_NO_COMPLEX_SPECIALIZATIONS)		//*TY 02/25/2000 - added for MPW compiler workaround
+
+template <class _Tp> struct complex;
+
+_STLP_TEMPLATE_NULL  struct _STLP_CLASS_DECLSPEC complex<float>;
+_STLP_TEMPLATE_NULL  struct _STLP_CLASS_DECLSPEC complex<double>;
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL  struct _STLP_CLASS_DECLSPEC complex<long double>;
+# endif
+# endif
+
+template <class _Tp>
+struct complex {
+  typedef _Tp value_type;
+  typedef complex<_Tp> _Self;
+
+  // Constructors, destructor, assignment operator.
+  complex() : _M_re(0), _M_im(0) {}
+  complex(const value_type& __x)
+    : _M_re(__x), _M_im(0) {}
+  complex(const value_type& __x, const value_type& __y)
+    : _M_re(__x), _M_im(__y) {}
+  complex(const _Self& __z)
+    : _M_re(__z._M_re), _M_im(__z._M_im) {}
+
+  _Self& operator=(const _Self& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+#if defined (_STLP_MEMBER_TEMPLATES) && ( defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) || defined(_STLP_NO_COMPLEX_SPECIALIZATIONS))
+  template <class _Tp2>
+  explicit complex(const complex<_Tp2>& __z)
+    : _M_re(__z._M_re), _M_im(__z._M_im) {}
+
+  template <class _Tp2>
+  _Self& operator=(const complex<_Tp2>& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  // Element access.
+  value_type real() const { return _M_re; }
+  value_type imag() const { return _M_im; }
+
+  // Arithmetic op= operations involving one real argument.
+
+  _Self& operator= (const value_type& __x) {
+    _M_re = __x;
+    _M_im = 0;
+    return *this;
+  }
+  _Self& operator+= (const value_type& __x) {
+    _M_re += __x;
+    return *this;
+  }
+  _Self& operator-= (const value_type& __x) {
+    _M_re -= __x;
+    return *this;
+  }
+  _Self& operator*= (const value_type& __x) {
+    _M_re *= __x;
+    _M_im *= __x;
+    return *this;
+  }
+  _Self& operator/= (const value_type& __x) {
+    _M_re /= __x;
+    _M_im /= __x;
+    return *this;
+  }
+
+  // Arithmetic op= operations involving two complex arguments.
+
+  static void  _STLP_CALL _div(const value_type& __z1_r, const value_type& __z1_i,
+                   const value_type& __z2_r, const value_type& __z2_i,
+                   value_type& __res_r, value_type& __res_i);
+
+  static void _STLP_CALL _div(const value_type& __z1_r, 
+                   const value_type& __z2_r, const value_type& __z2_i,
+                   value_type& __res_r, value_type& __res_i);
+
+#if defined ( _STLP_MEMBER_TEMPLATES ) // && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+
+  template <class _Tp2> _Self& operator+= (const complex<_Tp2>& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2> _Self& operator-= (const complex<_Tp2>& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2> _Self& operator*= (const complex<_Tp2>& __z) {
+    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  template <class _Tp2> _Self& operator/= (const complex<_Tp2>& __z) {
+    value_type __r;
+    value_type __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& operator+= (const _Self& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  _Self& operator-= (const _Self& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+  
+  _Self& operator*= (const _Self& __z) {
+    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  _Self& operator/= (const _Self& __z) {
+    value_type __r;
+    value_type __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  // Data members.
+  value_type _M_re;
+  value_type _M_im;
+};
+
+#if !defined(_STLP_NO_COMPLEX_SPECIALIZATIONS)		//*TY 02/25/2000 - added for MPW compiler workaround
+// Explicit specializations for float, double, long double.  The only
+// reason for these specializations is to enable automatic conversions
+// from complex<float> to complex<double>, and complex<double> to
+// complex<long double>.
+
+
+_STLP_TEMPLATE_NULL
+struct _STLP_CLASS_DECLSPEC complex<float> {
+  typedef float value_type;
+  typedef complex<float> _Self;
+  // Constructors, destructor, assignment operator.
+
+  complex(value_type __x = 0.0, value_type __y = 0.0)
+    : _M_re(__x), _M_im(__y) {}
+
+  complex(const complex<float>& __z)    : _M_re(__z._M_re), _M_im(__z._M_im) {} 
+
+  inline explicit complex(const complex<double>& __z);
+# ifndef _STLP_NO_LONG_DOUBLE
+  inline explicit complex(const complex<long double>& __z);
+# endif
+  // Element access.
+  value_type real() const { return _M_re; }
+  value_type imag() const { return _M_im; }
+
+  // Arithmetic op= operations involving one real argument.
+
+  _Self& operator= (value_type __x) {
+    _M_re = __x;
+    _M_im = 0;
+    return *this;
+  }
+  _Self& operator+= (value_type __x) {
+    _M_re += __x;
+    return *this;
+  }
+  _Self& operator-= (value_type __x) {
+    _M_re -= __x;
+    return *this;
+  }
+  _Self& operator*= (value_type __x) {
+    _M_re *= __x;
+    _M_im *= __x;
+    return *this;
+  }
+  _Self& operator/= (value_type __x) {
+    _M_re /= __x;
+    _M_im /= __x;
+    return *this;
+  }
+
+  // Arithmetic op= operations involving two complex arguments.
+
+  static void _STLP_CALL _div(const float& __z1_r, const float& __z1_i,
+                              const float& __z2_r, const float& __z2_i,
+                              float& __res_r, float& __res_i);
+    
+  static void _STLP_CALL _div(const float& __z1_r, 
+                              const float& __z2_r, const float& __z2_i,
+                              float& __res_r, float& __res_i);
+    
+#if defined (_STLP_MEMBER_TEMPLATES)
+
+  template <class _Tp2>
+  complex<float>& operator=(const complex<_Tp2>& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<float>& operator+= (const complex<_Tp2>& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<float>& operator-= (const complex<_Tp2>& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<float>& operator*= (const complex<_Tp2>& __z) {
+    float __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    float __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<float>& operator/= (const complex<_Tp2>& __z) {
+    float __r;
+    float __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& operator=(const _Self& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+  _Self& operator+= (const _Self& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  _Self& operator-= (const _Self& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+  
+  _Self& operator*= (const _Self& __z) {
+    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  _Self& operator/= (const _Self& __z) {
+    value_type __r;
+    value_type __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  // Data members.
+  value_type _M_re;
+  value_type _M_im;
+};
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<double> {
+  typedef double value_type;
+  typedef complex<double> _Self;
+
+  // Constructors, destructor, assignment operator.
+
+  complex(value_type __x = 0.0, value_type __y = 0.0)
+    : _M_re(__x), _M_im(__y) {}
+
+  complex(const complex<double>& __z)
+    : _M_re(__z._M_re), _M_im(__z._M_im) {}
+  inline complex(const complex<float>& __z);
+# ifndef _STLP_NO_LONG_DOUBLE
+  explicit inline complex(const complex<long double>& __z);
+# endif
+  // Element access.
+  value_type real() const { return _M_re; }
+  value_type imag() const { return _M_im; }
+
+  // Arithmetic op= operations involving one real argument.
+
+  _Self& operator= (value_type __x) {
+    _M_re = __x;
+    _M_im = 0;
+    return *this;
+  }
+  _Self& operator+= (value_type __x) {
+    _M_re += __x;
+    return *this;
+  }
+  _Self& operator-= (value_type __x) {
+    _M_re -= __x;
+    return *this;
+  }
+  _Self& operator*= (value_type __x) {
+    _M_re *= __x;
+    _M_im *= __x;
+    return *this;
+  }
+  _Self& operator/= (value_type __x) {
+    _M_re /= __x;
+    _M_im /= __x;
+    return *this;
+  }
+
+  // Arithmetic op= operations involving two complex arguments.
+
+  static void _STLP_CALL _div(const double& __z1_r, const double& __z1_i,
+                              const double& __z2_r, const double& __z2_i,
+                              double& __res_r, double& __res_i);
+  static void _STLP_CALL _div(const double& __z1_r, 
+                              const double& __z2_r, const double& __z2_i,
+                              double& __res_r, double& __res_i);
+    
+#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+
+  template <class _Tp2>
+  complex<double>& operator=(const complex<_Tp2>& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<double>& operator+= (const complex<_Tp2>& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<double>& operator-= (const complex<_Tp2>& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<double>& operator*= (const complex<_Tp2>& __z) {
+    double __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    double __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<double>& operator/= (const complex<_Tp2>& __z) {
+    double __r;
+    double __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& operator=(const _Self& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+  _Self& operator+= (const _Self& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  _Self& operator-= (const _Self& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+  
+  _Self& operator*= (const _Self& __z) {
+    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  _Self& operator/= (const _Self& __z) {
+    value_type __r;
+    value_type __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  // Data members.
+  value_type _M_re;
+  value_type _M_im;
+};
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC complex<long double> {
+  typedef long double value_type;
+  typedef complex<long double> _Self;
+
+  // Constructors, destructor, assignment operator.
+  complex(value_type __x = 0.0, value_type __y = 0.0)
+    : _M_re(__x), _M_im(__y) {}
+
+  complex(const complex<long double>& __z)
+    : _M_re(__z._M_re), _M_im(__z._M_im) {}
+  inline complex(const complex<float>& __z);
+  inline complex(const complex<double>& __z);
+
+  // Element access.
+  value_type real() const { return _M_re; }
+  value_type imag() const { return _M_im; }
+
+  // Arithmetic op= operations involving one real argument.
+
+  _Self& operator= (value_type __x) {
+    _M_re = __x;
+    _M_im = 0;
+    return *this;
+  }
+  _Self& operator+= (value_type __x) {
+    _M_re += __x;
+    return *this;
+  }
+  _Self& operator-= (value_type __x) {
+    _M_re -= __x;
+    return *this;
+  }
+  _Self& operator*= (value_type __x) {
+    _M_re *= __x;
+    _M_im *= __x;
+    return *this;
+  }
+  _Self& operator/= (value_type __x) {
+    _M_re /= __x;
+    _M_im /= __x;
+    return *this;
+  }
+
+  // Arithmetic op= operations involving two complex arguments.
+
+  static void _STLP_CALL _div(const long double& __z1_r, const long double& __z1_i,
+                              const long double& __z2_r, const long double& __z2_i,
+                              long double& __res_r, long double& __res_i);
+
+  static void _STLP_CALL _div(const long double& __z1_r, 
+                              const long double& __z2_r, const long double& __z2_i,
+                              long double& __res_r, long double& __res_i);
+
+#if defined (_STLP_MEMBER_TEMPLATES) && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER)
+
+  template <class _Tp2>
+  complex<long double>& operator=(const complex<_Tp2>& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<long double>& operator+= (const complex<_Tp2>& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<long double>& operator-= (const complex<_Tp2>& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<long double>& operator*= (const complex<_Tp2>& __z) {
+    long double __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    long double __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  template <class _Tp2>
+  complex<long double>& operator/= (const complex<_Tp2>& __z) {
+    long double __r;
+    long double __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& operator=(const _Self& __z) {
+    _M_re = __z._M_re;
+    _M_im = __z._M_im;
+    return *this;
+  }
+
+  _Self& operator+= (const _Self& __z) {
+    _M_re += __z._M_re;
+    _M_im += __z._M_im;
+    return *this;
+  }
+
+  _Self& operator-= (const _Self& __z) {
+    _M_re -= __z._M_re;
+    _M_im -= __z._M_im;
+    return *this;
+  }
+  
+  _Self& operator*= (const _Self& __z) {
+    value_type __r = _M_re * __z._M_re - _M_im * __z._M_im;
+    value_type __i = _M_re * __z._M_im + _M_im * __z._M_re;
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  _Self& operator/= (const _Self& __z) {
+    value_type __r;
+    value_type __i;
+    _div(_M_re, _M_im, __z._M_re, __z._M_im, __r, __i);
+    _M_re = __r;
+    _M_im = __i;
+    return *this;
+  }
+
+  // Data members.
+  value_type _M_re;
+  value_type _M_im;
+};
+
+# endif /* _STLP_NO_LONG_DOUBLE */
+
+// Converting constructors from one of these three specialized types
+// to another.
+
+inline complex<float>::complex(const complex<double>& __z)
+  : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<double>::complex(const complex<float>& __z)
+  : _M_re(__z._M_re), _M_im(__z._M_im) {}
+# ifndef _STLP_NO_LONG_DOUBLE
+inline complex<float>::complex(const complex<long double>& __z)
+  : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<double>::complex(const complex<long double>& __z)
+  : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<long double>::complex(const complex<float>& __z)
+  : _M_re(__z._M_re), _M_im(__z._M_im) {}
+inline complex<long double>::complex(const complex<double>& __z)
+  : _M_re(__z._M_re), _M_im(__z._M_im) {}
+# endif
+
+# endif /* SPECIALIZATIONS */
+
+// Unary non-member arithmetic operators.
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z) {
+  return __z;
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL  operator-(const complex<_Tp>& __z) {
+  return complex<_Tp>(-__z._M_re, -__z._M_im);
+}
+
+// Non-member arithmetic operations involving one real argument.
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator+(const _Tp& __x, const complex<_Tp>& __z) {
+  return complex<_Tp>(__x + __z._M_re, __z._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator+(const complex<_Tp>& __z, const _Tp& __x) {
+  return complex<_Tp>(__z._M_re + __x, __z._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator-(const _Tp& __x, const complex<_Tp>& __z) {
+  return complex<_Tp>(__x - __z._M_re, -__z._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator-(const complex<_Tp>& __z, const _Tp& __x) {
+  return complex<_Tp>(__z._M_re - __x, __z._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator*(const _Tp& __x, const complex<_Tp>& __z) {
+  return complex<_Tp>(__x * __z._M_re, __x * __z._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator*(const complex<_Tp>& __z, const _Tp& __x) {
+  return complex<_Tp>(__z._M_re * __x, __z._M_im * __x);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator/(const _Tp& __x, const complex<_Tp>& __z) {
+  complex<_Tp> __result;
+  complex<_Tp>::_div(__x,
+                     __z._M_re, __z._M_im,
+                     __result._M_re, __result._M_im);
+  return __result;
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL operator/(const complex<_Tp>& __z, const _Tp& __x) {
+  return complex<_Tp>(__z._M_re / __x, __z._M_im / __x);
+}
+
+// Non-member arithmetic operations involving two complex arguments
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL 
+operator+(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+  return complex<_Tp>(__z1._M_re + __z2._M_re, __z1._M_im + __z2._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL 
+operator-(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+  return complex<_Tp>(__z1._M_re - __z2._M_re, __z1._M_im - __z2._M_im);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL 
+operator*(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+  return complex<_Tp>(__z1._M_re * __z2._M_re - __z1._M_im * __z2._M_im,
+                      __z1._M_re * __z2._M_im + __z1._M_im * __z2._M_re);
+}
+
+template <class _Tp> 
+inline complex<_Tp> _STLP_CALL 
+operator/(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+  complex<_Tp> __result;
+  complex<_Tp>::_div(__z1._M_re, __z1._M_im,
+                     __z2._M_re, __z2._M_im,
+                     __result._M_re, __result._M_im);
+  return __result;
+}
+
+// Comparison operators.
+
+template <class _Tp> 
+inline bool _STLP_CALL operator==(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+  return __z1._M_re == __z2._M_re && __z1._M_im == __z2._M_im;
+}
+
+template <class _Tp> 
+inline bool _STLP_CALL operator==(const complex<_Tp>& __z, const _Tp& __x) {
+  return __z._M_re == __x && __z._M_im == 0;
+}
+
+template <class _Tp> 
+inline bool _STLP_CALL operator==(const _Tp& __x, const complex<_Tp>& __z) {
+  return __x == __z._M_re && 0 == __z._M_im;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _Tp> 
+inline bool _STLP_CALL operator!=(const complex<_Tp>& __z1, const complex<_Tp>& __z2) {
+  return __z1._M_re != __z2._M_re || __z1._M_im != __z2._M_im;
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+template <class _Tp> 
+inline bool _STLP_CALL operator!=(const complex<_Tp>& __z, const _Tp& __x) {
+  return __z._M_re != __x || __z._M_im != 0;
+}
+
+template <class _Tp> 
+inline bool _STLP_CALL operator!=(const _Tp& __x, const complex<_Tp>& __z) {
+  return __x != __z._M_re || 0 != __z._M_im;
+}
+
+// Other basic arithmetic operations
+
+template <class _Tp> 
+inline _Tp _STLP_CALL real(const complex<_Tp>& __z) {
+  return __z._M_re;
+}
+
+template <class _Tp> 
+inline _Tp _STLP_CALL imag(const complex<_Tp>& __z) {
+  return __z._M_im;
+}
+
+template <class _Tp>
+_Tp _STLP_CALL abs(const complex<_Tp>& __z) {
+  return _Tp(abs(complex<double>(double(__z.real()), double(__z.imag()))));
+}
+
+template <class _Tp>
+_Tp _STLP_CALL arg(const complex<_Tp>& __z) {
+  return _Tp(arg(complex<double>(double(__z.real()), double(__z.imag()))));
+}
+
+template <class _Tp>
+inline _Tp _STLP_CALL norm(const complex<_Tp>& __z) {
+  return __z._M_re * __z._M_re + __z._M_im * __z._M_im;
+}
+
+template <class _Tp>
+inline complex<_Tp> _STLP_CALL conj(const complex<_Tp>& __z) {
+  return complex<_Tp>(__z._M_re, -__z._M_im);
+}
+
+template <class _Tp>
+complex<_Tp> _STLP_CALL polar(const _Tp& __rho) {
+  return complex<_Tp>(__rho, 0);
+}
+
+template <class _Tp>
+complex<_Tp> _STLP_CALL polar(const _Tp& __rho, const _Tp& __phi) {
+  complex<double> __tmp = polar(double(__rho), double(__phi));
+  return complex<_Tp>(_Tp(__tmp.real()), _Tp(__tmp.imag()));
+}
+
+
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC float  _STLP_CALL abs(const complex<float>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC double  _STLP_CALL abs(const complex<double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC float  _STLP_CALL arg(const complex<float>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC double  _STLP_CALL arg(const complex<double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC complex<float> _STLP_CALL polar(const float& __rho, const float& __phi);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC complex<double> _STLP_CALL polar(const double& __rho, const double& __phi);
+
+
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC long double  _STLP_CALL arg(const complex<long double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC long double  _STLP_CALL abs(const complex<long double>&);
+_STLP_TEMPLATE_NULL
+_STLP_DECLSPEC complex<long double> _STLP_CALL polar(const long double&, const long double&);
+# endif
+
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+
+// Complex output, in the form (re,im).  We use a two-step process 
+// involving stringstream so that we get the padding right.  
+template <class _Tp, class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>&  _STLP_CALL 
+operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z);
+
+template <class _Tp, class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL 
+operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z);
+
+// Specializations for narrow characters; lets us avoid widen.
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL 
+operator>>(basic_istream<char, char_traits<char> >& __is, complex<float>& __z);
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL 
+operator>>(basic_istream<char, char_traits<char> >& __is, complex<double>& __z);
+
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL 
+operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<float>& __z);
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL 
+operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<double>& __z);
+
+#  if ! defined (_STLP_NO_LONG_DOUBLE)
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_istream<char, char_traits<char> >& _STLP_CALL 
+operator>>(basic_istream<char, char_traits<char> >& __is, complex<long double>& __z);
+
+_STLP_OPERATOR_TEMPLATE
+_STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL 
+operator<<(basic_ostream<char, char_traits<char> >& __is, const complex<long double>& __z);
+
+# endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) && ! defined (_STLP_NO_WCHAR_T)
+
+_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
+        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<double>&);
+_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
+        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<double>&);
+_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
+        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<float>&);
+_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
+        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<float>&);
+
+#  ifndef _STLP_NO_LONG_DOUBLE
+_STLP_EXPORT_TEMPLATE basic_istream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator>>(
+        basic_istream<wchar_t, char_traits<wchar_t> >&, complex<long double>&);
+_STLP_EXPORT_TEMPLATE basic_ostream<wchar_t, char_traits<wchar_t> >& _STLP_CALL operator<<(
+        basic_ostream<wchar_t, char_traits<wchar_t> >&, const complex<long double>&);
+#  endif
+
+# endif /* USE_TEMPLATE_EXPORT */
+
+#else /* _STLP_USE_NEW_IOSTREAMS */
+
+template <class _Tp>
+ostream& _STLP_CALL operator<<(ostream& s, const complex<_Tp>& __z);
+
+template <class _Tp>
+istream& _STLP_CALL  operator>>(istream& s, complex<_Tp>& a);
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+
+// Transcendental functions.  These are defined only for float, 
+//  double, and long double.  (Sqrt isn't transcendental, of course,
+//  but it's included in this section anyway.)
+
+_STLP_DECLSPEC complex<float> _STLP_CALL sqrt(const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL exp(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL  log(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL log10(const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, int);
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const float&);
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const float&, const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL pow(const complex<float>&, const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL sin(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL cos(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL tan(const complex<float>&);
+
+_STLP_DECLSPEC complex<float> _STLP_CALL sinh(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL cosh(const complex<float>&);
+_STLP_DECLSPEC complex<float> _STLP_CALL tanh(const complex<float>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL sqrt(const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL exp(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL log(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL log10(const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, int);
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const double&);
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const double&, const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL pow(const complex<double>&, const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL sin(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL cos(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL tan(const complex<double>&);
+
+_STLP_DECLSPEC complex<double> _STLP_CALL sinh(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL cosh(const complex<double>&);
+_STLP_DECLSPEC complex<double> _STLP_CALL tanh(const complex<double>&);
+
+# ifndef _STLP_NO_LONG_DOUBLE
+_STLP_DECLSPEC complex<long double> _STLP_CALL sqrt(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL exp(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL log(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL log10(const complex<long double>&);
+
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, int);
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&, const long double&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const long double&, const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL pow(const complex<long double>&,
+                                                   const complex<long double>&);
+
+_STLP_DECLSPEC complex<long double> _STLP_CALL sin(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL cos(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL tan(const complex<long double>&);
+
+_STLP_DECLSPEC complex<long double> _STLP_CALL sinh(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL cosh(const complex<long double>&);
+_STLP_DECLSPEC complex<long double> _STLP_CALL tanh(const complex<long double>&);
+# endif
+
+_STLP_END_NAMESPACE
+
+# ifndef _STLP_LINK_TIME_INSTANTIATION
+#  include <stl/_complex.c>
+# endif
+
+#endif /* _STLP_template_complex */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_config.h b/src/STLport/stl/_config.h
new file mode 100644
index 0000000..c7b582c
--- /dev/null
+++ b/src/STLport/stl/_config.h
@@ -0,0 +1,1064 @@
+ /*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CONFIG_H
+# define _STLP_CONFIG_H
+
+/*
+ * Purpose of this file :
+ *
+ * Defines all STLport settings.
+ * This file is actually a wrapper : it includes compiler-specific
+ * settings from <config/stlcomp.h>
+ * and user-defined settings from <stl_user_config.h>.
+ * See <config/stl_mycomp.h> and <stl_user_config.h> for the description
+ * of those macros
+ * 
+ */
+
+/* Other macros defined by this file:
+
+ * bool, true, and false, if _STLP_NO_BOOL is defined.
+ * typename, as a null macro if it's not already a keyword.
+ * explicit, as a null macro if it's not already a keyword.
+ * namespace-related macros (_STLP_STD, _STLP_BEGIN_NAMESPACE, etc.)
+ * exception-related macros (_STLP_TRY, _STLP_UNWIND, etc.)
+ * _STLP_ASSERT, either as a test or as a null macro, depending on
+   whether or not _STLP_ASSERTIONS is defined.
+*/
+
+/* The last SGI STL release we merged with */
+#   define __SGI_STL                                      0x330
+
+/* STLport version */
+#   define _STLPORT_VERSION                               0x461
+
+/* Placeholder for user to override settings.
+ * It could be also used to mask settings from 
+ * different directories.
+ */
+# include <stl_user_config.h>
+
+/* ========================================================= */
+/* This file is used for compatibility; it accepts old-style config
+   switches */
+#  include <stl/_config_compat.h>
+
+/* Common configuration file for this particular installation. */
+
+# include <stl/_site_config.h>
+
+/* Use per-version compiler recognition */
+#  include <config/stlcomp.h>
+
+/* ========================================================= */
+
+/* some fixes to configuration. This also includes modifications
+ * of STLport switches depending on compiler flags,
+ * or settings applicable to a group of compilers, such as
+ * to all who use EDG front-end.
+ */
+# include <config/stl_confix.h>
+
+
+/*
+ * Performs integrity check on user-specified parameters
+ * and site-specific settings.
+ */
+// # include <stl/_check_config.h>
+
+/* SGI terms */
+
+# if !defined (_STLP_NO_MEMBER_TEMPLATES) && !defined (_STLP_MEMBER_TEMPLATES)
+#  define _STLP_MEMBER_TEMPLATES 1
+# endif
+
+# if !defined (_STLP_NO_FRIEND_TEMPLATES) && !defined (_STLP_FRIEND_TEMPLATES)
+#  define _STLP_FRIEND_TEMPLATES 1
+# endif
+
+# if !defined (_STLP_NO_MEMBER_TEMPLATE_CLASSES) && !defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+#  define _STLP_MEMBER_TEMPLATE_CLASSES 1
+# endif
+
+# if !defined (_STLP_NO_MEMBER_TEMPLATE_CLASSES) && !defined (_STLP_DONT_USE_NESTED_TCLASS_THROUGHT_TPARAM) && !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+#  define _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM 1
+# endif
+
+#if !defined (_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) && !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+#  define _STLP_CLASS_PARTIAL_SPECIALIZATION 1
+#endif
+
+#if !defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && !defined (_STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER)
+#  define _STLP_FUNCTION_TMPL_PARTIAL_ORDER 1
+#endif
+
+# if !defined (_STLP_BIG_ENDIAN) && ! defined (_STLP_LITTLE_ENDIAN)
+#  if defined(_MIPSEB) || defined (__sparc) || \
+      defined (_AIX) || defined (__hpux) || defined(macintosh) || defined (_MAC)
+#   define _STLP_BIG_ENDIAN 1
+#  elif defined(__i386) || defined(_M_IX86) 
+#   define _STLP_LITTLE_ENDIAN 1
+#  else
+#   define _STLP_UNKNOWN_ENDIAN 1
+#  endif
+# endif /* _STLP_BIG_ENDIAN */
+
+/* ==========================================================
+ * final workaround tuning based on given flags
+ * ========================================================== */
+
+#ifndef _STLP_UINT32_T
+# define _STLP_UINT32_T unsigned long
+#endif
+#ifndef _STLP_ABORT
+# define _STLP_ABORT() abort()
+#endif
+
+# if !defined (_STLP_HAS_NO_NAMESPACES)
+# if defined _STLP_NO_NAMESPACES
+#  undef _STLP_USE_NAMESPACES
+# else
+/* assume it as the default, turn it off later if NO_NAMESPACES selected */
+#  undef _STLP_USE_NAMESPACES
+#  define _STLP_USE_NAMESPACES 1
+# endif
+# endif
+
+# if defined (_STLP_NO_IOSTREAMS)
+#  define _STLP_USE_NO_IOSTREAMS
+# endif
+
+# if defined (_STLP_USE_NO_IOSTREAMS)
+#  undef _STLP_USE_NEW_IOSTREAMS
+# endif
+
+# if ( defined (_STLP_OWN_IOSTREAMS) || ! defined (_STLP_HAS_NO_NEW_IOSTREAMS)) \
+   && ! defined (_STLP_USE_NO_IOSTREAMS) && !defined (_STLP_USE_NEW_IOSTREAMS)
+#  define _STLP_USE_NEW_IOSTREAMS
+# endif
+
+# if defined (_STLP_NO_NEW_IOSTREAMS)
+#  undef _STLP_USE_NEW_IOSTREAMS
+#  undef _STLP_OWN_IOSTREAMS
+# endif
+
+/* Operating system recognition (basic) */
+# if defined (__unix) || defined (__linux__) || defined (__QNX__) || defined (_AIX)  || defined (__NetBSD__) || defined (__Lynx__)
+#  define _STLP_UNIX 1
+#  if defined (__linux__) && ! defined (_STLP_USE_GLIBC)
+#   define _STLP_USE_GLIBC 1
+#  endif
+# elif defined(macintosh) || defined (_MAC)
+#  define _STLP_MAC  1
+# elif defined (_WIN32) || defined (__WIN32) || defined (WIN32) || defined (__WIN32__)
+#  define _STLP_WIN32 1
+# elif defined (__WIN16) || defined (WIN16) || defined (_WIN16)
+#  define _STLP_WIN16
+# endif /* __unix */
+
+# if !defined(_STLP_MAKE_HEADER)
+#  define _STLP_MAKE_HEADER(path, header) <path/header>
+# endif
+
+#if !defined (_STLP_NATIVE_HEADER)
+# if !defined (_STLP_NATIVE_INCLUDE_PATH)
+#  define _STLP_NATIVE_INCLUDE_PATH ../include
+# endif
+# define _STLP_NATIVE_HEADER(header) _STLP_MAKE_HEADER(_STLP_NATIVE_INCLUDE_PATH,header)
+#endif
+
+/* For some compilers, C headers like <stdio.h> are located in separate directory */
+#if !defined (_STLP_NATIVE_C_HEADER)
+# if !defined (_STLP_NATIVE_C_INCLUDE_PATH)
+#  define _STLP_NATIVE_C_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_C_HEADER(header)  _STLP_MAKE_HEADER(_STLP_NATIVE_C_INCLUDE_PATH,header)
+#endif
+
+/* For some compilers, C-library headers like <cstdio> are located in separate directory */
+#if !defined (_STLP_NATIVE_CPP_C_HEADER)
+# if !defined (_STLP_NATIVE_CPP_C_INCLUDE_PATH)
+#  define _STLP_NATIVE_CPP_C_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_CPP_C_HEADER(header)  _STLP_MAKE_HEADER(_STLP_NATIVE_CPP_C_INCLUDE_PATH,header)
+#endif
+
+/* Some compilers have weird placement of old-style iostream headers */
+#if !defined ( _STLP_NATIVE_OLD_STREAMS_HEADER )
+# if !defined (_STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH)
+#  define _STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_OLD_STREAMS_HEADER(header)  _STLP_MAKE_HEADER(_STLP_NATIVE_OLD_STREAMS_INCLUDE_PATH,header)
+#endif
+
+/* Some compilers locate basic C++ runtime support headers (<new>, <typeinfo>, <exception>) in separate directory */
+#if !defined ( _STLP_NATIVE_CPP_RUNTIME_HEADER )
+# if !defined (_STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH)
+#  define _STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH _STLP_NATIVE_INCLUDE_PATH
+# endif
+# define _STLP_NATIVE_CPP_RUNTIME_HEADER(header)  _STLP_MAKE_HEADER(_STLP_NATIVE_CPP_RUNTIME_INCLUDE_PATH,header)
+#endif
+
+/*  shared library tune-up */
+
+#if defined (__BUILDING_STLPORT)
+/*  if we are rebuilding right now as a DLL, place everything here */
+#  undef  _STLP_DESIGNATED_DLL
+#  define _STLP_DESIGNATED_DLL 1
+#endif
+
+/* Use own namespace always if possible and not explicitly instructed otherwise */
+# if defined (_STLP_USE_NAMESPACES) && !defined (_STLP_BROKEN_USING_DIRECTIVE) && \
+     /* !defined (_STLP_OWN_IOSTREAMS) && */ !defined(_STLP_NO_OWN_NAMESPACE)
+#  undef  _STLP_USE_OWN_NAMESPACE
+#  define _STLP_USE_OWN_NAMESPACE  1
+# else
+#  undef _STLP_WHOLE_NATIVE_STD
+# endif
+
+#  undef _STLP_NAMESPACE
+
+# if !defined(_NOTHREADS) && ! defined (_STLP_THREADS_DEFINED)
+
+#  ifndef _REENTRANT
+#     define _REENTRANT
+#  endif
+
+#  if defined(_PTHREADS)
+#     define _STLP_PTHREADS
+#     define _STLP_THREADS
+#  endif
+#  if defined(_UITHREADS)
+#     define _STLP_UITHREADS
+#     define _STLP_THREADS
+#  endif
+
+#   if defined (__sgi) && ! defined (__KCC) && ! defined (__GNUC__)  
+#    define _STLP_SGI_THREADS
+#   elif defined(__DECC) || defined(__DECCXX)
+#    define _STLP_DEC_THREADS
+#   elif defined (_STLP_WIN32) && ! defined (_STLP_PTHREADS)
+#    define _STLP_WIN32THREADS 1
+#   elif ((defined (__sun) && !defined (__linux__)) \
+     || defined(_UITHREADS) ) && !defined(_STLP_PTHREADS)
+#     define _STLP_UITHREADS
+#   elif defined (__OS2__)
+#     define _STLP_OS2THREADS
+#   elif defined(__BEOS__)
+#     define _STLP_BETHREADS
+#   else
+#     define _STLP_PTHREADS
+#   endif /* __sgi */
+#   define _STLP_THREADS_DEFINED
+# endif
+
+#  if defined (_REENTRANT) && ! defined (_STLP_THREADS)
+#   define _STLP_THREADS
+#  endif /* _REENTRANT */
+
+// warning : pthread_spinlock code was reported not to work on RedHat 3
+# if defined(__linux__) && defined(_STLP_USE_PTHREAD_SPINLOCK)
+#  include <features.h>
+#  ifndef __USE_XOPEN2K
+#   undef _STLP_USE_PTHREAD_SPINLOCK
+#  endif /* __USE_XOPEN2K */
+# endif /* __linux__ && _STLP_PTHREADS */
+
+# ifndef _STLP_STATIC_MUTEX
+#  define _STLP_STATIC_MUTEX _STLP_mutex_base
+# endif
+
+
+# if defined (_MFC_VER) && !defined (_STLP_USE_MFC)
+#  define _STLP_USE_MFC 1
+# endif
+
+#if defined (_STLP_THREADS)
+#   define _STLP_VOLATILE volatile
+/* windows.h _MUST be included before bool definition ;( */
+# if defined  (_STLP_WIN32THREADS) && defined (_STLP_NO_BOOL)
+#   undef  NOMINMAX
+#   define NOMINMAX
+#   ifdef _STLP_USE_MFC
+#    include <afx.h>
+#   else
+#    include <windows.h>
+#   endif
+#   define _STLP_WINDOWS_H_INCLUDED
+# endif
+#else
+#   define _STLP_VOLATILE
+#endif
+
+# if !defined ( _STLP_USE_NEW_C_HEADERS ) && !defined ( _STLP_HAS_NO_NEW_C_HEADERS )
+#  define _STLP_USE_NEW_C_HEADERS
+# endif
+/* disable new-style headers if requested */
+# if defined ( _STLP_NO_NEW_C_HEADERS )
+#  undef _STLP_USE_NEW_C_HEADERS
+# endif
+
+# if !defined ( _STLP_STATIC_TEMPLATE_DATA )
+# define _STLP_STATIC_TEMPLATE_DATA 1
+# endif
+
+# if defined (_STLP_BASE_TYPEDEF_BUG)
+#  undef  _STLP_BASE_TYPEDEF_OUTSIDE_BUG
+#  define _STLP_BASE_TYPEDEF_OUTSIDE_BUG 1
+# endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG ) || (defined (_STLP_MSVC) && (_STLP_MSVC < 1100))
+#  define _STLP_GLOBAL_NESTED_RETURN_TYPE_PARAM_BUG
+# endif
+
+/* SUNpro 4.2 inline string literal bug */
+#ifdef _STLP_INLINE_STRING_LITERAL_BUG
+# define _STLP_FIX_LITERAL_BUG(__x) __x=__x;
+#else
+# define _STLP_FIX_LITERAL_BUG(__x)
+#endif
+
+# if defined (_STLP_NON_TYPE_TMPL_PARAM_BUG)
+#  undef  _STLP_NO_DEFAULT_NON_TYPE_PARAM
+#  define _STLP_NO_DEFAULT_NON_TYPE_PARAM 1
+# endif
+
+# define _STLP_NEW new
+# define _STLP_PLACEMENT_NEW new
+
+# ifdef _STLP_DEBUG
+#  define _STLP_ASSERTIONS 1
+# endif
+
+/* apple mpw exception handling bug */
+#ifndef _STLP_MPWFIX_TRY
+# define _STLP_MPWFIX_TRY
+#endif
+#ifndef _STLP_MPWFIX_CATCH
+# define _STLP_MPWFIX_CATCH
+#endif
+#ifndef _STLP_MPWFIX_CATCH_ACTION
+# define _STLP_MPWFIX_CATCH_ACTION(action)
+#endif
+
+/* if _STLP_DEBUG or _STLP_ASSERTIONS are set, stl/debug/_debug.h defines those */
+
+# if !defined( _STLP_ASSERTIONS ) && !defined(_STLP_DEBUG) && !defined(_STLP_DEBUG_ALLOC)
+#  define _STLP_ASSERT(expr)
+# endif
+
+# ifndef _STLP_DEBUG
+#  define _STLP_VERBOSE_ASSERT(expr,diagnostic)
+#  define _STLP_DEBUG_CHECK(expr)
+#  define _STLP_DEBUG_DO(expr)
+# endif
+
+#  if !defined (_STLP_WEAK)
+#   define _STLP_WEAK 
+#  endif
+
+/* default parameters as template types derived from arguments ( not always supported ) */
+#  if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+#   define __DFL_TMPL_PARAM( classname, defval ) class classname
+#   define __DFL_TMPL_ARG(classname) , classname
+#  else
+#   define _STLP_DEFAULT_TYPE_PARAM 1
+#   define __DFL_TMPL_PARAM( classname, defval ) class classname = defval
+#   define __DFL_TMPL_ARG(classname)  
+#  endif
+
+/* default parameters as complete types */
+# if defined ( _STLP_DEFAULT_TYPE_PARAM )
+#   define __DFL_TYPE_PARAM( classname, defval ) class classname = defval
+#   define __DFL_NON_TYPE_PARAM(type,name,val) type name = val
+#   define __DFL_TYPE_ARG(classname)
+# else
+#   define __DFL_TYPE_PARAM( classname, defval ) class classname
+#   define __DFL_NON_TYPE_PARAM(type,name,val) type name
+#   define __DFL_TYPE_ARG(classname) , classname
+# endif
+
+/* SGI compatibility */
+
+#ifdef _STLP_NO_WCHAR_T
+# ifndef _STLP_NO_NATIVE_WIDE_STREAMS
+#  define  _STLP_NO_NATIVE_WIDE_STREAMS 1
+# endif
+#else
+# define _STLP_HAS_WCHAR_T 1
+#endif
+
+#if !defined (_STLP_NO_AT_MEMBER_FUNCTION)
+# define _STLP_CAN_THROW_RANGE_ERRORS 1
+#endif
+
+# if !defined (_STLP_USE_RAW_SGI_ALLOCATORS)
+#   define _STLP_DEFAULT_ALLOCATOR(_Tp) allocator< _Tp >
+#   define _STLP_DEFAULT_ALLOCATOR_SELECT( _Tp ) __DFL_TMPL_PARAM(_Alloc, allocator< _Tp >)
+#   define _STLP_DEFAULT_PAIR_ALLOCATOR(_Key, _Tp) allocator< pair < _Key, _Tp > >
+#   if defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+#     define _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_Key, _Tp ) class _Alloc
+#     define _STLP_USE_WRAPPER_FOR_ALLOC_PARAM 1
+#   else
+#     define _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_Key, _Tp ) \
+             class _Alloc = allocator< pair < _Key, _Tp > >
+#   endif
+# else
+#   define _STLP_DEFAULT_ALLOCATOR( _Tp ) __sgi_alloc
+#   define _STLP_DEFAULT_ALLOCATOR_SELECT( _Tp ) __DFL_TYPE_PARAM(_Alloc,__sgi_alloc)
+#   define _STLP_DEFAULT_PAIR_ALLOCATOR( _Key, _Tp ) __sgi_alloc
+#   define _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(_Key, _Tp ) __DFL_TYPE_PARAM(_Alloc,__sgi_alloc)
+#   if defined (_STLP_LIMITED_DEFAULT_TEMPLATES) && !defined (_STLP_DEFAULT_TYPE_PARAM)
+#    define _STLP_USE_WRAPPER_FOR_ALLOC_PARAM 1
+#   endif
+# endif
+
+/* default parameters workaround tuning */
+#  if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )
+#    define __WORKAROUND_RENAME(X) __##X
+#  else
+#    define __WORKAROUND_RENAME(X) X
+#  endif
+#  if defined ( _STLP_DEBUG )
+#    define __WORKAROUND_DBG_RENAME(X) __##X
+#  else
+#    define __WORKAROUND_DBG_RENAME(X) __WORKAROUND_RENAME(X)
+#  endif
+#  define __FULL_NAME(X) __WORKAROUND_RENAME(X)
+
+/* this always mean the C library is in global namespace */
+# if defined (_STLP_HAS_NO_NEW_C_HEADERS) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+#  define _STLP_VENDOR_GLOBAL_CSTD 1
+# endif
+
+/* Depending of whether compiler supports namespaces,
+ * tune the parameters for vendor-supplied libraries.
+ * This section is guarded by _STLP_HAS_NO_NAMESPACES, not by _STLP_USE_NAMESPACES,
+ * since it depends only on the native features, not on user's preference whether
+ * to use namespace for STLport or not.
+ */
+# if !defined (_STLP_HAS_NO_NAMESPACES)
+/* Import some vendor's headers into corresponding STLport ones if they might be needed
+ * (if we wrap native iostreams and use namepace other than std::) */
+#  if defined (_STLP_WHOLE_NATIVE_STD)
+#    define  _STLP_IMPORT_VENDOR_STD 1
+#    undef   _STLP_MINIMUM_IMPORT_STD
+#  elif (defined (_STLP_USE_OWN_NAMESPACE) || ( defined (_STLP_DEBUG) && defined (_STLP_USE_NAMESPACES))) \
+       && defined (_STLP_USE_NEW_IOSTREAMS) && ! defined (_STLP_OWN_IOSTREAMS)
+#    define  _STLP_IMPORT_VENDOR_STD 1
+#  endif
+
+/* if using stlport:: namespace or if C library stuff is not in vendor's std::,
+ * try importing 'em.
+ * MSVC has ambiguity problem when we try to import C-style std:: stuff back into global namespace */
+#  if defined (_STLP_USE_NAMESPACES) && /* ! defined (_STLP_OWN_IOSTREAMS) && */ \
+   ( defined(_STLP_USE_OWN_NAMESPACE) || defined (_STLP_VENDOR_GLOBAL_CSTD))
+#    define  _STLP_IMPORT_VENDOR_CSTD 1
+#  endif
+
+# if defined (_STLP_NO_USING_FOR_GLOBAL_FUNCTIONS) && ! defined (_STLP_DO_IMPORT_CSTD_FUNCTIONS)
+#  define _STLP_NO_CSTD_FUNCTION_IMPORTS
+# endif
+
+#  define  _STLP_USING_NAMESPACE(x) using namespace x ;
+
+namespace std { }
+namespace __std_alias = std;
+
+/* assume std:: namespace for C++ std library if not being told otherwise */
+#  ifdef _STLP_VENDOR_GLOBAL_STD
+#   define _STLP_VENDOR_STD
+#   define _STLP_USING_VENDOR_STD
+#  else
+#   define _STLP_VENDOR_STD __std_alias
+#   define _STLP_USING_VENDOR_STD _STLP_USING_NAMESPACE(_STLP_VENDOR_STD)
+// #   define _STLP_USING_VENDOR_STD
+#  endif
+
+/* tune things that come from C library */
+#  if  defined (_STLP_VENDOR_GLOBAL_CSTD) || !defined(_STLP_USE_NEW_C_HEADERS)
+/*  in old-style headers, C functions go to global scope. */
+#   define _STLP_VENDOR_CSTD
+#   define _STLP_USING_VENDOR_CSTD
+#  else
+#   define _STLP_VENDOR_CSTD  _STLP_VENDOR_STD
+#   define _STLP_USING_VENDOR_CSTD _STLP_USING_NAMESPACE(_STLP_VENDOR_CSTD)
+#  endif /* _STLP_VENDOR_CSTD */
+/* exception, typeinfo, new - always come from the vendor */
+#  ifndef _STLP_VENDOR_EXCEPT_STD
+#   ifdef _STLP_VENDOR_GLOBAL_EXCEPT_STD
+#    define _STLP_VENDOR_EXCEPT_STD
+#   else
+#    define _STLP_VENDOR_EXCEPT_STD _STLP_VENDOR_STD
+#   endif
+#  endif
+# define _STLP_OLD_IO_NAMESPACE
+# ifndef _STLP_VENDOR_MB_NAMESPACE
+#  define _STLP_VENDOR_MB_NAMESPACE _STLP_VENDOR_CSTD
+# endif
+# else 
+/* compiler has no namespace support */
+#  define _STLP_VENDOR_STD 
+#  define _STLP_VENDOR_CSTD
+#  define _STLP_USING_NAMESPACE(x)
+#  define _STLP_USING_VENDOR_CSTD
+#  define _STLP_USING_VENDOR_STD 
+#  define _STLP_VENDOR_EXCEPT_STD
+# endif
+
+# if defined (_STLP_USE_NAMESPACES)
+
+#  if defined (_STLP_USE_OWN_NAMESPACE)
+#   define _STLP_STD      _STL
+#  else
+#   ifdef _STLP_DEBUG
+namespace stdD = std;
+#   endif
+#   define _STLP_STD      std
+#  endif /* _STLP_USE_OWN_NAMESPACE */
+
+#  define _STLP_BEGIN_NAMESPACE namespace _STLP_STD {
+#  define _STLP_END_NAMESPACE }
+
+_STLP_BEGIN_NAMESPACE _STLP_END_NAMESPACE
+
+namespace stlport = _STLP_STD;
+// backward compatibility 
+# undef __STLPORT_NAMESPACE
+# define __STLPORT_NAMESPACE _STLP_STD
+
+/* decide whether or not we use separate namespace for rel ops */
+#   if defined(_STLP_NO_RELOPS_NAMESPACE)
+#     define _STLP_BEGIN_RELOPS_NAMESPACE _STLP_BEGIN_NAMESPACE namespace rel_ops {}
+#     define _STLP_END_RELOPS_NAMESPACE }
+#   else
+/* Use std::rel_ops namespace */
+#     define _STLP_BEGIN_RELOPS_NAMESPACE _STLP_BEGIN_NAMESPACE namespace rel_ops {
+#     define _STLP_END_RELOPS_NAMESPACE } }
+#     define _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+#   endif /* Use std::rel_ops namespace */
+
+# else /* _STLP_USE_NAMESPACES */
+/* STLport is being put into global namespace */
+#  define _STLP_STD
+#  define _STLP_BEGIN_NAMESPACE
+#  define _STLP_END_NAMESPACE
+
+/* boris : it was found out that _STLP_USE_SEPARATE_RELOPS_NAMESPACE 
+   causes less problems than having relational operator templates in global namespace
+   Please define _STLP_NO_RELOPS_NAMESPACE in stl_user_config.h if your code rely on them. */
+#  ifndef _STLP_NO_RELOPS_NAMESPACE
+#   define _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+#  endif
+#  define _STLP_BEGIN_RELOPS_NAMESPACE 
+#  define _STLP_END_RELOPS_NAMESPACE 
+#  undef  _STLP_USE_OWN_NAMESPACE
+# endif  /* _STLP_USE_NAMESPACES */
+
+# define STLPORT_CSTD _STLP_VENDOR_CSTD
+# define STLPORT      _STLP_STD
+
+#if defined(_STLP_BOGUS_TEMPLATE_TYPE_MATCHING_BUG)
+#  define _STLP_SIMPLE_TYPE(T) _stl_trivial_proxy<T>
+#else
+#  define _STLP_SIMPLE_TYPE(T) T
+#endif
+
+/* if we are going to use native new iostreams, use native <string> and <stdexcept> */
+#  if defined (_STLP_USE_NEW_IOSTREAMS) && !defined (_STLP_OWN_IOSTREAMS)
+#   define _STLP_USE_NATIVE_STRING      1
+#   define _STLP_USE_NATIVE_STDEXCEPT   1
+# endif
+
+# ifndef _STLP_RAND48
+# define _STLP_NO_DRAND48
+# endif
+
+/* backwards compatibility */
+# define __STL_NAMESPACE _STLP_STD
+# define __STL_NAME(name) _STLP_STD::name
+
+/* advanced keywords usage */
+#  ifndef  _STLP_NO_NEW_STYLE_CASTS
+#   define __CONST_CAST(__x,__y) const_cast<__x>(__y)
+#   define __STATIC_CAST(__x,__y) static_cast<__x>(__y)
+#   define __REINTERPRET_CAST(__x,__y) reinterpret_cast<__x>(__y)
+#   define __DYNAMIC_CAST(__x,__y) dynamic_cast<__x>(__y)
+#  else
+#   define __STATIC_CAST(__x,__y) ((__x)(__y))
+#   define __CONST_CAST(__x,__y) ((__x)(__y))
+#   define __REINTERPRET_CAST(__x,__y) ((__x)(__y))
+#   define __DYNAMIC_CAST(__x,__y) ((__x)(__y))
+#  endif
+#  if defined (_STLP_NEED_TYPENAME) && ! defined (typename)
+#   define typename
+#  endif
+#  if defined (_STLP_NEED_TYPENAME) || defined (_STLP_NO_TYPENAME_ON_RETURN_TYPE )
+#    define _STLP_TYPENAME_ON_RETURN_TYPE
+#  else
+#    define _STLP_TYPENAME_ON_RETURN_TYPE typename
+#  endif
+# ifdef _STLP_NO_TYPENAME_IN_TEMPLATE_HEADER
+#  define _STLP_HEADER_TYPENAME
+# else
+#  define _STLP_HEADER_TYPENAME typename
+# endif
+# ifndef _STLP_NO_MEMBER_TEMPLATE_KEYWORD
+#   define _STLP_TEMPLATE template
+# else
+#   define _STLP_TEMPLATE
+# endif
+#  if defined (_STLP_NEED_EXPLICIT) && ! defined (explicit)
+#   define explicit
+#  endif
+#  ifndef _STLP_NEED_MUTABLE
+#   define __ASSIGN_MUTABLE(type,x,y) x=y
+#  else
+#   define __ASSIGN_MUTABLE(type,x,y) __CONST_CAST(type,x)=y
+#   define mutable
+#  endif
+# if defined (_STLP_NO_SIGNED_BUILTINS)
+/* old HP-UX doesn't understand "signed" keyword */
+#  define signed
+# endif
+
+#  if defined (_STLP_LOOP_INLINE_PROBLEMS)
+#   define _STLP_INLINE_LOOP
+#  else
+#   define _STLP_INLINE_LOOP inline 
+#  endif
+
+#  define _STLP_PRIVATE public
+#  define _STLP_PROTECTED public
+
+#  ifndef _STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX
+#   define _STLP_TEMPLATE_NULL template<>
+#  else
+#   define _STLP_TEMPLATE_NULL
+#  endif
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+#  define _STLP_OPERATOR_TEMPLATE
+# else 
+#  define _STLP_OPERATOR_TEMPLATE _STLP_TEMPLATE_NULL
+#endif
+
+# ifndef _STLP_CLASS_PARTIAL_SPECIALIZATION
+/* unless we have other compiler problem, try simulating partial spec here */
+# if ! defined (_STLP_DONT_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS)
+#  define  _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+# endif
+/* For your own iterators, please use inheritance from iterator<> instead of these obsolete queries. */
+#  if  ( defined (_STLP_NESTED_TYPE_PARAM_BUG) || !defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS))
+#   if ! defined ( _STLP_USE_OLD_HP_ITERATOR_QUERIES )
+#    define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+#   endif
+#  elif defined ( _STLP_NO_ANACHRONISMS )
+#   undef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+#  endif
+# endif
+
+# ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+#   define _STLP_NULL_TMPL_ARGS <>
+# else
+#   define _STLP_NULL_TMPL_ARGS
+# endif
+
+# ifndef _STLP_ALLOCATOR_TYPE_DFL
+#  ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS 
+#   define _STLP_ALLOCATOR_TYPE_DFL 
+#  else
+#   define _STLP_ALLOCATOR_TYPE_DFL = allocator_type()
+#  endif
+# endif
+
+//When the compiler do not correctly initialized the basic types value in default parameters we prefer
+//to avoid them to be able to correct this bug.
+# if defined (_STLP_DEF_CONST_DEF_PARAM_BUG)
+#  define _STLP_DONT_SUP_DFLT_PARAM 1
+# endif
+
+# if defined (__SGI_STL_NO_ARROW_OPERATOR) && ! defined (_STLP_NO_ARROW_OPERATOR)
+# define _STLP_NO_ARROW_OPERATOR
+# endif
+
+# if !defined (_STLP_CLASS_PARTIAL_SPECIALIZATION)
+#  if !( defined (_STLP_NO_ARROW_OPERATOR)) \
+      && !defined (_STLP_NO_MSVC50_COMPATIBILITY) && !defined (_STLP_MSVC50_COMPATIBILITY)
+/* this one is needed for proper reverse_iterator<> operator ->() handling */
+#   define _STLP_MSVC50_COMPATIBILITY 1
+#  endif
+# endif
+
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+# if (defined(__IBMCPP__) && (500 <= __IBMCPP__) && (__IBMCPP__ < 600) )
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+   typedef typename _STLP_STD :: reverse_iterator<const_iterator> const_reverse_iterator; \
+   typedef typename _STLP_STD :: reverse_iterator<iterator> reverse_iterator
+# elif (defined (__sgi) && ! defined (__GNUC__)) || defined (__SUNPRO_CC) || defined (__xlC__)
+#  define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+   typedef _STLP_STD:: _STLP_TEMPLATE reverse_iterator<const_iterator> const_reverse_iterator; \
+   typedef _STLP_STD:: _STLP_TEMPLATE reverse_iterator<iterator> reverse_iterator
+# else
+#  define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+   typedef _STLP_STD::reverse_iterator<const_iterator> const_reverse_iterator; \
+   typedef _STLP_STD::reverse_iterator<iterator> reverse_iterator
+# endif
+#else /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+  typedef _STLP_STD::__reverse_iterator<const_iterator, value_type, const_reference, \
+    const_pointer, difference_type>  const_reverse_iterator; \
+  typedef _STLP_STD::__reverse_iterator<iterator, value_type, reference, pointer, difference_type> \
+    reverse_iterator
+# else
+# define _STLP_DECLARE_REVERSE_ITERATORS(__reverse_iterator) \
+  typedef _STLP_STD::__reverse_iterator<const_iterator, value_type, const_reference, \
+    difference_type>  const_reverse_iterator; \
+  typedef _STLP_STD::__reverse_iterator<iterator, value_type, \
+    reference, difference_type> \
+    reverse_iterator
+# endif
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+# define _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS \
+         _STLP_DECLARE_REVERSE_ITERATORS(reverse_bidirectional_iterator)
+# define _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS \
+         _STLP_DECLARE_REVERSE_ITERATORS(reverse_iterator)
+
+#  define __IMPORT_CONTAINER_TYPEDEFS(_Super)                            \
+    typedef typename _Super::value_type value_type;                      \
+    typedef typename _Super::size_type size_type;                        \
+    typedef typename _Super::difference_type difference_type;            \
+    typedef typename _Super::reference reference;                        \
+    typedef typename _Super::const_reference const_reference;            \
+    typedef typename _Super::pointer pointer;                            \
+    typedef typename _Super::const_pointer const_pointer;                \
+    typedef typename _Super::allocator_type allocator_type;
+
+
+#  define __IMPORT_ITERATORS(_Super)                                     \
+    typedef typename _Super::iterator iterator;                                   \
+    typedef typename _Super::const_iterator const_iterator; 
+
+#  define __IMPORT_REVERSE_ITERATORS(_Super)                             \
+    typedef typename _Super::const_reverse_iterator  const_reverse_iterator;      \
+    typedef typename _Super::reverse_iterator reverse_iterator;
+
+#  define  __IMPORT_SUPER_COPY_ASSIGNMENT(__derived_name, _Self, _SUPER)         \
+    __derived_name(const _Super& __x) : _SUPER(__x) {}          \
+    _Self& operator=(const _Super& __x) {                       \
+        *(_Super*)this = __x;                                   \
+        return *this;                                           \
+    }  \
+    __derived_name(const _Self& __x) : _SUPER(__x) {}          \
+    _Self& operator=(const _Self& __x) {                       \
+        *(_Super*)this = __x;                                   \
+        return *this;                                           \
+    }
+
+# define __IMPORT_WITH_ITERATORS(_Super) \
+__IMPORT_CONTAINER_TYPEDEFS(_Super) __IMPORT_ITERATORS(_Super)
+
+# define __IMPORT_WITH_REVERSE_ITERATORS(_Super) \
+__IMPORT_WITH_ITERATORS(_Super) __IMPORT_REVERSE_ITERATORS(_Super)
+
+# if defined (_STLP_TRIVIAL_CONSTRUCTOR_BUG) 
+#  define __TRIVIAL_CONSTRUCTOR(__type) __type() {}  
+# else
+#  define __TRIVIAL_CONSTRUCTOR(__type)
+# endif
+# if defined (_STLP_TRIVIAL_DESTRUCTOR_BUG)
+#  define __TRIVIAL_DESTRUCTOR(__type) ~__type() {}  
+# else
+#  define __TRIVIAL_DESTRUCTOR(__type) 
+# endif
+
+#  define __TRIVIAL_STUFF(__type)  \
+  __TRIVIAL_CONSTRUCTOR(__type) __TRIVIAL_DESTRUCTOR(__type)
+
+# if ! (defined ( _STLP_NO_EXCEPTIONS ) || defined (_STLP_HAS_NO_EXCEPTIONS) \
+	|| defined ( _STLP_USE_EXCEPTIONS ))
+#  define _STLP_USE_EXCEPTIONS
+# endif 
+
+# ifdef _STLP_USE_EXCEPTIONS
+#   define _STLP_TRY try
+#   define _STLP_CATCH_ALL catch(...)
+#   ifndef _STLP_THROW
+#    define _STLP_THROW(x) throw x
+#   endif
+#   define _STLP_RETHROW throw
+#   define _STLP_UNWIND(action) catch(...) { action; throw; }
+
+#   ifdef _STLP_THROW_RETURN_BUG
+#     define _STLP_RET_AFTER_THROW(data) return data
+#   else
+#     define _STLP_RET_AFTER_THROW(data)
+#   endif
+
+#   if !defined ( _STLP_NO_EXCEPTION_SPEC )
+#    define _STLP_THROWS_INHERENTLY(x) throw x
+#    define _STLP_NOTHROW_INHERENTLY throw()
+#   else
+#    define _STLP_THROWS_INHERENTLY(x)
+#    define _STLP_NOTHROW_INHERENTLY 
+#   endif
+/* We do not use exception throw specifications unless we are forced to */
+#   define _STLP_THROWS(x)
+#   define _STLP_NOTHROW 
+# else
+#   define _STLP_TRY 
+#   define _STLP_CATCH_ALL if (false)
+#   ifndef _STLP_THROW
+#    define _STLP_THROW(x)
+#   endif
+#   define _STLP_RETHROW {}
+#   define _STLP_UNWIND(action) 
+#   define _STLP_THROWS(x)
+#   define _STLP_NOTHROW
+#   define _STLP_RET_AFTER_THROW(data)
+#   define _STLP_THROWS_INHERENTLY(x)
+#   define _STLP_NOTHROW_INHERENTLY 
+# endif
+
+#if defined(_STLP_NO_BOOL)
+# if (defined (__IBMCPP__) && (__IBMCPP__ < 400)) && ! defined (_AIX)
+#  include <isynonym.hpp>
+#  if defined (__OS400__)
+    typedef int bool;
+#  elif !( defined (__xlC__) || defined (_AIX))
+    typedef Boolean bool;
+#  endif
+# else
+#  if defined(_STLP_YVALS_H)
+#   include <yvals.h>
+#  else
+#    if defined (_STLP_DONT_USE_BOOL_TYPEDEF)
+#     define bool int
+#    else
+      typedef int bool;
+#    endif
+#    define true 1
+#    define false 0
+#  endif
+# endif /* __IBMCPP__ */
+#else
+#    define _STLP_BOOL_KEYWORD 1
+#endif /* _STLP_NO_BOOL */
+
+# ifndef _STLP_MPW_EXTRA_CONST
+#  define _STLP_MPW_EXTRA_CONST
+# endif
+
+# ifndef _STLP_DEFAULTCHAR
+#  define _STLP_DEFAULTCHAR char
+# endif
+
+# if defined (_STLP_DEBUG_ALLOC) && ! defined (_STLP_ASSERTIONS)
+#  define _STLP_ASSERTIONS 1
+# endif
+
+/* uninitialized value filler */
+# ifndef _STLP_SHRED_BYTE
+/* This value is designed to cause problems if an error occurs */
+#   define _STLP_SHRED_BYTE 0xA3
+# endif /* _STLP_SHRED_BYTE */
+
+/* shared library tune-up */
+# ifndef _STLP_IMPORT_DECLSPEC
+#  define _STLP_IMPORT_DECLSPEC
+# endif
+
+/* a keyword used to instantiate export template */
+#  ifndef _STLP_EXPORT_TEMPLATE_KEYWORD
+#   define _STLP_EXPORT_TEMPLATE_KEYWORD
+#  endif
+# ifndef _STLP_IMPORT_TEMPLATE_KEYWORD
+#  define _STLP_IMPORT_TEMPLATE_KEYWORD
+# endif
+
+
+# if  defined (_STLP_DLLEXPORT_NEEDS_PREDECLARATION) && defined (_STLP_USE_DECLSPEC)
+#  if ! defined (_STLP_USE_TEMPLATE_EXPORT)
+/* this setting turns on "extern template" extension use */
+#   define _STLP_USE_TEMPLATE_EXPORT
+#  endif
+#  if defined (_STLP_DESIGNATED_DLL) && ! defined (_STLP_NO_FORCE_INSTANTIATE)
+#   define _STLP_NO_FORCE_INSTANTIATE
+#  endif
+# endif
+
+#   if defined (_STLP_DESIGNATED_DLL) /* This is a lib which will contain STLport exports */
+#    define  _STLP_EXPORT          _STLP_EXPORT_TEMPLATE_KEYWORD
+#   else
+#    define  _STLP_EXPORT          _STLP_IMPORT_TEMPLATE_KEYWORD
+#  endif
+
+# ifndef _STLP_EXPORT_TEMPLATE
+#  define  _STLP_EXPORT_TEMPLATE _STLP_EXPORT template
+# endif
+
+# if defined (_STLP_USE_DECLSPEC) /* using export/import technique */
+
+#  ifndef _STLP_EXPORT_DECLSPEC
+#   define _STLP_EXPORT_DECLSPEC
+#  endif
+#  ifndef _STLP_IMPORT_DECLSPEC
+#   define _STLP_IMPORT_DECLSPEC
+#  endif
+#  ifndef _STLP_CLASS_EXPORT_DECLSPEC
+#   define _STLP_CLASS_EXPORT_DECLSPEC
+#  endif
+#  ifndef _STLP_CLASS_IMPORT_DECLSPEC
+#   define _STLP_CLASS_IMPORT_DECLSPEC
+#  endif
+#  if defined (_STLP_DESIGNATED_DLL) /* This is a lib which will contain STLport exports */
+#   define  _STLP_DECLSPEC        _STLP_EXPORT_DECLSPEC 
+#   define  _STLP_CLASS_DECLSPEC  _STLP_CLASS_EXPORT_DECLSPEC 
+#  else
+#   define  _STLP_DECLSPEC        _STLP_IMPORT_DECLSPEC   /* Other modules, importing STLport exports */
+#   define  _STLP_CLASS_DECLSPEC  _STLP_CLASS_IMPORT_DECLSPEC
+#  endif
+
+#  ifndef _STLP_STATIC_CONST_INIT_BUG
+// constant data members cannot be exported; using workaround here
+#   define _STLP_STATIC_CONST_INIT_BUG
+#  endif
+# else /* Not using DLL export/import specifications */
+
+#  define _STLP_DECLSPEC
+#  define _STLP_CLASS_DECLSPEC
+
+# endif
+
+#  define _STLP_EXPORT_TEMPLATE_CLASS _STLP_EXPORT template class _STLP_CLASS_DECLSPEC
+
+#  if defined (_STLP_MSVC) || defined (__ICL) 
+#   define _STLP_STATIC_MEMBER_DECLSPEC
+#  else
+#   define _STLP_STATIC_MEMBER_DECLSPEC _STLP_DECLSPEC
+#  endif
+
+# if !defined (_STLP_CALL)
+#   define _STLP_CALL
+# endif
+
+#ifdef _STLP_OWN_IOSTREAMS
+
+#  if defined (__DECCXX) && ! defined (__USE_STD_IOSTREAM)
+#   define __USE_STD_IOSTREAM
+#  endif
+
+/* We only need to expose details of streams implementation 
+   if we use non-standard i/o or are building STLport*/
+# if defined (__BUILDING_STLPORT) ||  defined (_STLP_NO_FORCE_INSTANTIATE) || !defined(_STLP_NO_CUSTOM_IO)
+#  define _STLP_EXPOSE_STREAM_IMPLEMENTATION 1
+# endif
+
+/* We only need to expose details of global implementation if we are building STLport 
+   or have not instantiated everything in the lib */
+# if defined (__BUILDING_STLPORT) || defined (_STLP_NO_FORCE_INSTANTIATE)
+#   undef  _STLP_EXPOSE_GLOBALS_IMPLEMENTATION
+#   define _STLP_EXPOSE_GLOBALS_IMPLEMENTATION 1
+# endif
+
+#else
+/* when we are not using SGI iostreams, we must expose globals, but not streams implementation */
+#  define _STLP_EXPOSE_GLOBALS_IMPLEMENTATION
+#endif
+
+# ifdef _STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS
+#  define _STLP_PSPEC2(t1,t2) < t1,t2 >
+#  define _STLP_PSPEC3(t1,t2,t3) < t1,t2,t3 >
+# else
+#  define _STLP_PSPEC2(t1,t2)	/* nothing */
+#  define _STLP_PSPEC3(t1,t2,t3)	/* nothing */
+# endif
+
+# ifdef _STLP_OPERATOR_SPEC_NEEDS_TEMPLATE_ARGS
+#  define _STLP_OPSPEC2(t1,t2) < t1,t2 >
+# else
+#  define _STLP_OPSPEC2(t1,t2)	/* nothing */
+# endif
+
+//Activation of the partial template workaround:
+# if !defined(_STLP_DONT_USE_PARTIAL_SPEC_WRKD) \
+    && (!defined(_STLP_CLASS_PARTIAL_SPECIALIZATION) || !defined(_STLP_FUNCTION_TMPL_PARTIAL_ORDER))
+#  define _STLP_USE_PARTIAL_SPEC_WORKAROUND
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+#  define _STLP_NEW_IO_NAMESPACE _STLP_STD
+#  define _STLP_NO_WIDE_STREAMS  _STLP_NO_WCHAR_T
+# else
+#  ifdef _STLP_USE_NEW_IOSTREAMS
+#   define _STLP_NEW_IO_NAMESPACE _STLP_VENDOR_STD
+#   ifdef _STLP_NO_NATIVE_WIDE_STREAMS
+#    define _STLP_NO_WIDE_STREAMS _STLP_NO_NATIVE_WIDE_STREAMS
+#   endif /* _STLP_NO_NATIVE_WIDE_STREAMS */
+#  else
+#   define _STLP_NO_WIDE_STREAMS
+#   define _STLP_NEW_IO_NAMESPACE
+#  endif
+# endif
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+# define _STLP_RELOPS_OPERATORS(_TMPL, _TP) \
+_TMPL inline bool _STLP_CALL operator!=(const _TP& __x, const _TP& __y) {return !(__x == __y);}\
+_TMPL inline bool _STLP_CALL operator>(const _TP& __x, const _TP& __y)  {return __y < __x;}\
+_TMPL inline bool _STLP_CALL operator<=(const _TP& __x, const _TP& __y) { return !(__y < __x);}\
+_TMPL inline bool _STLP_CALL operator>=(const _TP& __x, const _TP& __y) { return !(__x < __y);}
+# else
+#  define _STLP_RELOPS_OPERATORS(_TMPL, _TP)
+# endif
+
+# if defined (_STLP_FULL_ADL_IMPLEMENTED) && defined (_STLP_NO_OWN_IOSTREAMS)
+#  error "Invalid configuration, STLport wrapper iostream mode can't be used with compiler"\
+         "implementing full Argument Dependent Lookup. Please remove _STLP_NO_OWN_IOSTREAMS switch"\
+         "and build STLport library."
+# endif /* _STLP_FULL_ADL_IMPLEMENTED && _STLP_NO_OWN_IOSTREAMS */
+
+# if defined ( _STLP_USE_ABBREVS )
+#  include <stl/_abbrevs.h>
+# endif
+
+/* some cleanup */
+# undef _STLP_DONT_USE_BOOL_TYPEDEF
+# undef _STLP_YVALS_H
+# undef _STLP_LOOP_INLINE_PROBLEMS
+# undef _STLP_NEED_EXPLICIT
+# undef _STLP_NEED_TYPENAME
+# undef _STLP_NO_NEW_STYLE_CASTS
+# undef __AUTO_CONFIGURED
+
+#endif /* _STLP_CONFIG_H */
+
+/*
+ Local Variables:
+ mode:C++
+ End:
+*/
diff --git a/src/STLport/stl/_config_compat.h b/src/STLport/stl/_config_compat.h
new file mode 100644
index 0000000..5d9110c
--- /dev/null
+++ b/src/STLport/stl/_config_compat.h
@@ -0,0 +1,89 @@
+
+/*
+ * Compatibility section
+ * This section sets new-style macros based on old-style ones, for compatibility
+ */
+
+# if (defined (__STL_NO_SGI_IOSTREAMS) || defined (_STLP_NO_SGI_IOSTREAMS)) \
+  && ! defined ( _STLP_NO_OWN_IOSTREAMS )
+#  define _STLP_NO_OWN_IOSTREAMS
+# endif
+
+# if defined (__STL_NO_NEW_IOSTREAMS) && ! defined ( _STLP_NO_NEW_IOSTREAMS )
+#  define _STLP_NO_NEW_IOSTREAMS __STL_NO_NEW_IOSTREAMS
+# endif
+# if defined (__STL_NO_IOSTREAMS) && ! defined ( _STLP_NO_IOSTREAMS )
+#  define _STLP_NO_IOSTREAMS __STL_NO_IOSTREAMS
+# endif
+# if defined (__STL_DEBUG) && ! defined ( _STLP_DEBUG )
+#  define _STLP_DEBUG __STL_DEBUG
+# endif
+# if defined (__STL_NO_ANACHRONISMS) && ! defined ( _STLP_NO_ANACHRONISMS )
+#  define _STLP_NO_ANACHRONISMS __STL_NO_ANACHRONISMS
+# endif
+# if defined (__STL_NO_EXTENSIONS) && ! defined ( _STLP_NO_EXTENSIONS )
+#  define _STLP_NO_EXTENSIONS __STL_NO_EXTENSIONS
+# endif
+# if defined (__STL_NO_EXCEPTIONS) && ! defined ( _STLP_NO_EXCEPTIONS )
+#  define _STLP_NO_EXCEPTIONS __STL_NO_EXCEPTIONS
+# endif
+# if defined (__STL_NO_NAMESPACES) && ! defined ( _STLP_NO_NAMESPACES )
+#  define _STLP_NO_NAMESPACES __STL_NO_NAMESPACES
+# endif
+# if defined (__STL_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+#  define _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS __STL_MINIMUM_DEFAULT_TEMPLATE_PARAMS
+# endif
+# if defined (__STL_NO_OWN_NAMESPACE) && ! defined ( _STLP_NO_OWN_NAMESPACE )
+#  define _STLP_NO_OWN_NAMESPACE __STL_NO_OWN_NAMESPACE
+# endif
+
+# if defined (__STL_NO_RELOPS_NAMESPACE) && ! defined ( _STLP_NO_RELOPS_NAMESPACE )
+#  define _STLP_NO_RELOPS_NAMESPACE __STL_NO_RELOPS_NAMESPACE
+# endif
+
+# if defined (__STL_DEBUG_UNINITIALIZED) && ! defined ( _STLP_DEBUG_UNINITIALIZED )
+#  define _STLP_DEBUG_UNINITIALIZED __STL_DEBUG_UNINITIALIZED
+# endif
+# if defined (__STL_SHRED_BYTE) && ! defined ( _STLP_SHRED_BYTE )
+#  define _STLP_SHRED_BYTE __STL_SHRED_BYTE
+# endif
+# if defined (__STL_USE_MFC) && ! defined ( _STLP_USE_MFC )
+#  define _STLP_USE_MFC __STL_USE_MFC
+# endif
+
+# if defined (__STL_USE_NEWALLOC) && ! defined ( _STLP_USE_NEWALLOC )
+#  define _STLP_USE_NEWALLOC __STL_USE_NEWALLOC
+# endif
+# if defined (__STL_USE_MALLOC) && ! defined ( _STLP_USE_MALLOC )
+#  define _STLP_USE_MALLOC __STL_USE_MALLOC
+# endif
+
+# if defined (__STL_DEBUG_ALLOC) && ! defined ( _STLP_DEBUG_ALLOC )
+#  define _STLP_DEBUG_ALLOC __STL_DEBUG_ALLOC
+# endif
+
+# if defined (__STL_DEBUG_MESSAGE) && ! defined ( _STLP_DEBUG_MESSAGE )
+#  define _STLP_DEBUG_MESSAGE __STL_DEBUG_MESSAGE
+# endif
+
+# if defined (__STL_DEBUG_TERMINATE) && ! defined ( _STLP_DEBUG_TERMINATE )
+#  define _STLP_DEBUG_TERMINATE __STL_DEBUG_TERMINATE
+# endif
+
+# if defined (__STL_NO_DEBUG_EXCEPTIONS) && ! defined ( _STLP_NO_DEBUG_EXCEPTIONS )
+#  define _STLP_NO_DEBUG_EXCEPTIONS __STL_NO_DEBUG_EXCEPTIONS
+# endif
+
+# if defined (__STL_USE_ABBREVS) && ! defined ( _STLP_USE_ABBREVS )
+#  define _STLP_USE_ABBREVS __STL_USE_ABBREVS
+# endif
+
+# if defined (__STL_NO_MSVC50_COMPATIBILITY) && ! defined ( _STLP_NO_MSVC50_COMPATIBILITY )
+#  define _STLP_NO_MSVC50_COMPATIBILITY __STL_NO_MSVC50_COMPATIBILITY
+# endif
+
+# if defined (__STL_USE_RAW_SGI_ALLOCATORS) && ! defined ( _STLP_USE_RAW_SGI_ALLOCATORS )
+#  define _STLP_USE_RAW_SGI_ALLOCATORS __STL_USE_RAW_SGI_ALLOCATORS
+# endif
+
+
diff --git a/src/STLport/stl/_config_compat_post.h b/src/STLport/stl/_config_compat_post.h
new file mode 100644
index 0000000..298c49e
--- /dev/null
+++ b/src/STLport/stl/_config_compat_post.h
@@ -0,0 +1,35 @@
+//==========================================
+
+# define __SGI_STL_PORT  _STLPORT_VERSION
+
+# if defined (_STLP_DEBUG) && ! defined ( __STL_DEBUG )
+#  define __STL_DEBUG _STLP_DEBUG
+# endif
+
+# if defined (_STLP_USE_NAMESPACES)
+#  undef  __STL_USE_NAMESPACES 
+#  define __STL_USE_NAMESPACES _STLP_USE_NAMESPACES
+# endif
+
+# if defined (_STLP_USE_EXCEPTIONS)
+#  undef  __STL_USE_EXCEPTIONS 
+#  define __STL_USE_EXCEPTIONS _STLP_USE_EXCEPTIONS
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS) && ! defined ( __STL_USE_NEW_IOSTREAMS )
+#  define __STL_USE_NEW_IOSTREAMS _STLP_USE_NEW_IOSTREAMS
+# endif
+
+# if defined (_STLP_BEGIN_NAMESPACE) && ! defined ( __STL_BEGIN_NAMESPACE )
+#  define __STL_BEGIN_NAMESPACE _STLP_BEGIN_NAMESPACE
+#  define __STL_END_NAMESPACE _STLP_END_NAMESPACE
+#  define __STL_VENDOR_STD _STLP_VENDOR_STD
+#  define __STL_VENDOR_CSTD _STLP_VENDOR_CSTD
+# endif
+
+/*
+# if defined (_STLP_XXX) && ! defined ( __STL_XXX )
+#  define __STL_XXX _STLP_XXX
+# endif
+*/
+
diff --git a/src/STLport/stl/_construct.h b/src/STLport/stl/_construct.h
new file mode 100644
index 0000000..12eb16d
--- /dev/null
+++ b/src/STLport/stl/_construct.h
@@ -0,0 +1,167 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_CONSTRUCT_H
+#define _STLP_INTERNAL_CONSTRUCT_H
+
+# if defined (_STLP_DEBUG_UNINITIALIZED) && ! defined (_STLP_CSTRING)
+# include <cstring>
+# endif
+
+# ifndef _STLP_INTERNAL_NEW_HEADER
+#  include <stl/_new.h>
+# endif
+
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG
+template <class _Tp>
+inline void __destroy_aux(_Tp* __pointer, const __false_type&) { __pointer->~_Tp(); }
+template <class _Tp>
+inline void __destroy_aux(_Tp* __pointer, const __true_type&) {}
+# endif
+
+template <class _Tp>
+inline void _Destroy(_Tp* __pointer) {
+# if _MSC_VER >= 1010
+  __pointer;
+# endif	// _MSC_VER >= 1000
+# ifdef _STLP_TRIVIAL_DESTRUCTOR_BUG
+  typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor;
+  __destroy_aux(__pointer, _Trivial_destructor());
+# else
+#  if ( defined (__BORLANDC__) && ( __BORLANDC__ < 0x500 ) )
+    __pointer->_Tp::~_Tp();
+#  else
+    __pointer->~_Tp();
+#  endif
+# endif
+# ifdef _STLP_DEBUG_UNINITIALIZED
+	memset((char*)__pointer, _STLP_SHRED_BYTE, sizeof(_Tp));
+# endif
+}
+
+# if defined (new)
+#   define _STLP_NEW_REDEFINE new
+#   undef new
+# endif 
+
+# ifdef _STLP_DEFAULT_CONSTRUCTOR_BUG
+template <class _T1>
+inline void _Construct_aux (_T1* __p, const __false_type&) {
+_STLP_PLACEMENT_NEW (__p) _T1();
+}
+
+template <class _T1>
+inline void _Construct_aux (_T1* __p, const __true_type&) {
+_STLP_PLACEMENT_NEW (__p) _T1(0);
+}
+# endif
+
+template <class _T1, class _T2>
+inline void _Construct(_T1* __p, const _T2& __val) {
+# ifdef _STLP_DEBUG_UNINITIALIZED
+	memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
+# endif
+    _STLP_PLACEMENT_NEW (__p) _T1(__val);
+}
+
+template <class _T1>
+inline void _Construct(_T1* __p) {
+# ifdef _STLP_DEBUG_UNINITIALIZED
+  memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
+# endif
+# ifdef _STLP_DEFAULT_CONSTRUCTOR_BUG
+typedef typename _Is_integer<_T1>::_Integral _Is_Integral;
+_Construct_aux (__p, _Is_Integral() );
+# else
+  _STLP_PLACEMENT_NEW (__p) _T1();
+# endif
+}
+
+# if defined(_STLP_NEW_REDEFINE)
+# ifdef DEBUG_NEW
+#  define new DEBUG_NEW
+# endif
+#  undef _STLP_NEW_REDEFINE
+# endif 
+
+template <class _ForwardIterator>
+_STLP_INLINE_LOOP void
+__destroy_aux(_ForwardIterator __first, _ForwardIterator __last, const __false_type&) {
+  for ( ; __first != __last; ++__first)
+    _STLP_STD::_Destroy(&*__first);
+}
+
+template <class _ForwardIterator> 
+inline void __destroy_aux(_ForwardIterator, _ForwardIterator, const __true_type&) {}
+
+template <class _ForwardIterator, class _Tp>
+inline void 
+__destroy(_ForwardIterator __first, _ForwardIterator __last, _Tp*) {
+  typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor;
+  __destroy_aux(__first, __last, _Trivial_destructor());
+}
+
+template <class _ForwardIterator>
+inline void _Destroy(_ForwardIterator __first, _ForwardIterator __last) {
+  __destroy(__first, __last, _STLP_VALUE_TYPE(__first, _ForwardIterator));
+}
+
+inline void _Destroy(char*, char*) {}
+# ifdef _STLP_HAS_WCHAR_T // dwa 8/15/97
+inline void _Destroy(wchar_t*, wchar_t*) {}
+inline void _Destroy(const wchar_t*, const wchar_t*) {}
+# endif
+
+# ifndef _STLP_NO_ANACHRONISMS
+// --------------------------------------------------
+// Old names from the HP STL.
+
+template <class _T1, class _T2>
+inline void construct(_T1* __p, const _T2& __val) {_Construct(__p, __val); }
+template <class _T1>
+inline void construct(_T1* __p) { _Construct(__p); }
+template <class _Tp>
+inline void destroy(_Tp* __pointer) {  _STLP_STD::_Destroy(__pointer); }
+template <class _ForwardIterator>
+inline void destroy(_ForwardIterator __first, _ForwardIterator __last) { _STLP_STD::_Destroy(__first, __last); }
+# endif
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CONSTRUCT_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ctraits_fns.h b/src/STLport/stl/_ctraits_fns.h
new file mode 100644
index 0000000..09501b0
--- /dev/null
+++ b/src/STLport/stl/_ctraits_fns.h
@@ -0,0 +1,95 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */ 
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+#ifndef _STLP_INTERNAL_CTRAITS_FUNCTIONS_H
+#define _STLP_INTERNAL_CTRAITS_FUNCTIONS_H
+
+# ifndef _STLP_INTERNAL_FUNCTION_H 
+#  include <stl/_function_base.h>
+# endif
+
+// This file contains a few small adapters that allow a character
+// traits class to be used as a function object.
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Traits>
+struct _Eq_traits
+  : public binary_function<typename _Traits::char_type,
+                           typename _Traits::char_type,
+                           bool>
+{
+  bool operator()(const typename _Traits::char_type& __x,
+                  const typename _Traits::char_type& __y) const
+    { return _Traits::eq(__x, __y); }
+};
+
+template <class _Traits>
+struct _Eq_char_bound
+  : public unary_function<typename _Traits::char_type, bool>
+{
+  typename _Traits::char_type __val;
+  _Eq_char_bound(typename _Traits::char_type __c) : __val(__c) {}
+  bool operator()(const typename _Traits::char_type& __x) const
+    { return _Traits::eq(__x, __val); }
+};
+
+template <class _Traits>
+struct _Neq_char_bound
+  : public unary_function<typename _Traits::char_type, bool>
+{
+  typename _Traits::char_type __val;
+  _Neq_char_bound(typename _Traits::char_type __c) : __val(__c) {}
+  bool operator()(const typename _Traits::char_type& __x) const
+    { return !_Traits::eq(__x, __val); }
+};
+
+template <class _Traits>
+struct _Eq_int_bound
+  : public unary_function<typename _Traits::char_type, bool>
+{
+  typename _Traits::int_type __val;
+
+  _Eq_int_bound(typename _Traits::int_type __c) : __val(__c) {}
+  bool operator()(const typename _Traits::char_type& __x) const
+    { return _Traits::eq_int_type(_Traits::to_int_type(__x), __val); }
+};
+
+# if 0
+template <class _Traits>
+struct _Lt_traits
+  : public binary_function<typename _Traits::char_type,
+                           typename _Traits::char_type,
+                           bool>
+{
+  bool operator()(const typename _Traits::char_type& __x,
+                  const typename _Traits::char_type& __y) const
+    { return _Traits::lt(__x, __y); }
+};
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CTRAITS_FUNCTIONS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
+
+
diff --git a/src/STLport/stl/_ctype.h b/src/STLport/stl/_ctype.h
new file mode 100644
index 0000000..5de2126
--- /dev/null
+++ b/src/STLport/stl/_ctype.h
@@ -0,0 +1,269 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+#define _STLP_INTERNAL_CTYPE_H
+
+# ifndef _STLP_C_LOCALE_H
+#  include <stl/c_locale.h>
+# endif
+# ifndef _STLP_INTERNAL_LOCALE_H
+#  include <stl/_locale.h>
+# endif
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC ctype_base {
+public:
+  enum mask {
+    space   = _Locale_SPACE,
+    print   = _Locale_PRINT,
+    cntrl   = _Locale_CNTRL,
+    upper   = _Locale_UPPER,
+    lower   = _Locale_LOWER,
+    alpha   = _Locale_ALPHA,
+    digit   = _Locale_DIGIT,
+    punct   = _Locale_PUNCT,
+    xdigit  = _Locale_XDIGIT,
+    alnum   = alpha | digit,
+    graph   = alnum | punct
+  };
+};
+
+// ctype<> template
+
+template <class charT> class ctype {};
+template <class charT> class ctype_byname {};
+
+//ctype specializations
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype<char> :   public locale::facet, public ctype_base 
+{
+
+# ifndef _STLP_NO_WCHAR_T
+#  ifdef _STLP_MSVC
+    typedef ctype<wchar_t> _Wctype;
+    friend _Wctype;
+#  else
+    friend class ctype<wchar_t>;
+#  endif
+# endif
+  friend class _Locale;
+public:
+
+  typedef char char_type;
+
+  explicit ctype(const mask* __tab = 0, bool __del = false, size_t __refs = 0);
+  bool is(mask __m, char __c) const
+    { return ((*(_M_ctype_table+(unsigned char)__c)) & __m) != 0; }
+
+  const char* is(const char* __low, const char* __high, mask* __vec) const {
+    for (const char* __p = __low;__p != __high; ++__p, ++__vec) {
+      *__vec = _M_ctype_table[(unsigned char)*__p];
+    }
+    return __high;
+  }
+
+  const char* scan_is(mask __m, const char* __low, const char* __high) const;
+  const char* scan_not(mask __m, const char* __low, const char* __high) const;
+
+  char        (toupper)(char __c) const { return do_toupper(__c); }
+  const char* (toupper)(char* __low, const char* __high) const { 
+    return do_toupper(__low, __high); 
+  }
+
+  char        (tolower)(char __c) const { return do_tolower(__c); }
+  const char* (tolower)(char* __low, const char* __high) const { 
+    return do_tolower(__low, __high); 
+  }
+  
+  char        widen(char __c) const { return do_widen(__c); }
+  const char* widen(const char* __low, const char* __high, char* __to) const { 
+    return do_widen(__low, __high, __to); 
+  }
+
+  char        narrow(char __c, char __dfault) const { 
+    return do_narrow(__c, __dfault); 
+  }
+  const char* narrow(const char* __low, const char* __high,
+                     char __dfault, char* __to) const { 
+    return do_narrow(__low, __high, __dfault, __to); 
+  }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined(_STLP_STATIC_CONST_INIT_BUG)
+  enum __TableSize { table_size = 256 };
+# else
+  static const size_t table_size = 256;
+# endif
+
+protected:
+  const mask* table() const _STLP_NOTHROW {return _M_ctype_table;}
+  static const mask* _STLP_CALL classic_table() _STLP_NOTHROW { return & _S_classic_table [1]; }
+
+  ~ctype();
+
+  virtual char        do_toupper(char __c) const;
+  virtual char        do_tolower(char __c) const;
+  virtual const char* do_toupper(char* __low, const char* __high) const;
+  virtual const char* do_tolower(char* __low, const char* __high) const;
+  virtual char        do_widen(char __c) const;
+  virtual const char* do_widen(const char* __low, const char* __high,
+                               char* __to) const;
+  virtual char        do_narrow(char __c, char /* dfault */ ) const;
+  virtual const char* do_narrow(const char* __low, const char* __high,
+                                char /* dfault */, char* __to) const;
+private:
+  struct _Is_mask {
+    mask __m;
+    _Is_mask(mask __x): __m(__x) {}
+   bool operator()(char __c) {return (__m & (unsigned char) __c) != 0;}
+  };
+
+  static const mask _S_classic_table[257 /* table_size + 1 */];
+  const mask* _M_ctype_table;
+  bool _M_delete;
+
+  static const unsigned char _S_upper[256 /* table_size */];
+  static const unsigned char _S_lower[256 /* table_size */];
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype_byname<char>: public ctype<char> {
+public:
+  explicit ctype_byname(const char*, size_t = 0);
+  ~ctype_byname();
+
+  virtual char        do_toupper(char __c) const;
+  virtual char        do_tolower(char __c) const;
+
+  virtual const char* do_toupper(char*, const char*) const;
+  virtual const char* do_tolower(char*, const char*) const;
+
+private:
+  mask _M_byname_table[table_size + 1];
+  _Locale_ctype* _M_ctype;
+};
+
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype<wchar_t> : public locale::facet, public ctype_base 
+{
+  friend class _Locale;
+public:
+  typedef wchar_t char_type;
+
+  explicit ctype(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  bool is(mask __m, wchar_t __c) const
+    { return do_is(__m, __c); }
+
+  const wchar_t* is(const wchar_t* __low, const wchar_t* __high,
+                    mask* __vec) const
+    { return do_is(__low, __high, __vec); }
+
+  const wchar_t* scan_is(mask __m, 
+                         const wchar_t* __low, const wchar_t* __high) const
+    { return do_scan_is(__m, __low, __high); }
+
+  const wchar_t* scan_not (mask __m, 
+                           const wchar_t* __low, const wchar_t* __high) const
+    { return do_scan_not(__m, __low, __high); }
+
+  wchar_t (toupper)(wchar_t __c) const { return do_toupper(__c); }
+  const wchar_t* (toupper)(wchar_t* __low, const wchar_t* __high) const
+    { return do_toupper(__low, __high); }
+
+  wchar_t (tolower)(wchar_t __c) const { return do_tolower(__c); }
+  const wchar_t* (tolower)(wchar_t* __low, const wchar_t* __high) const
+    { return do_tolower(__low, __high); }
+
+  wchar_t widen(char __c) const { return do_widen(__c); }
+  const char* widen(const char* __low, const char* __high,
+                    wchar_t* __to) const
+    { return do_widen(__low, __high, __to); }
+
+  char narrow(wchar_t __c, char __dfault) const
+    { return do_narrow(__c, __dfault); }
+  const wchar_t* narrow(const wchar_t* __low, const wchar_t* __high,
+                        char __dfault, char* __to) const
+    { return do_narrow(__low, __high, __dfault, __to); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~ctype();
+
+  virtual bool           do_is(mask __m, wchar_t __c) const;
+  virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
+  virtual const wchar_t* do_scan_is(mask,
+                                    const wchar_t*, const wchar_t*) const;
+  virtual const wchar_t* do_scan_not(mask,
+                                     const wchar_t*, const wchar_t*) const;
+  virtual wchar_t do_toupper(wchar_t __c) const;
+  virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
+  virtual wchar_t do_tolower(wchar_t c) const;
+  virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
+  virtual wchar_t do_widen(char c) const;
+  virtual const char* do_widen(const char*, const char*, wchar_t*) const;
+  virtual char  do_narrow(wchar_t __c, char __dfault) const;
+  virtual const wchar_t* do_narrow(const wchar_t*, const wchar_t*,
+                                   char, char*) const;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>: public ctype<wchar_t> {
+public:
+  explicit ctype_byname(const char* __name, size_t __refs = 0);
+
+protected:
+  ~ctype_byname();
+
+  virtual bool           do_is(mask __m, wchar_t __c) const;
+  virtual const wchar_t* do_is(const wchar_t*, const wchar_t*, mask*) const;
+  virtual const wchar_t* do_scan_is(mask,
+                                    const wchar_t*, const wchar_t*) const;
+  virtual const wchar_t* do_scan_not(mask,
+                                     const wchar_t*, const wchar_t*) const;
+  virtual wchar_t do_toupper(wchar_t __c) const;
+  virtual const wchar_t* do_toupper(wchar_t*, const wchar_t*) const;
+  virtual wchar_t do_tolower(wchar_t c) const;
+  virtual const wchar_t* do_tolower(wchar_t*, const wchar_t*) const;
+
+private:
+  _Locale_ctype* _M_ctype;
+};
+
+# endif /* WCHAR_T */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_CTYPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_cwchar.h b/src/STLport/stl/_cwchar.h
new file mode 100644
index 0000000..45c7668
--- /dev/null
+++ b/src/STLport/stl/_cwchar.h
@@ -0,0 +1,112 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CWCHAR_H
+# define _STLP_CWCHAR_H
+
+#ifndef _STLP_NO_WCHAR_T
+#ifdef __cplusplus
+# include <cwchar>
+#else
+# include <wchar.h>
+#endif
+#endif
+
+# if defined (__MRC__) || defined (__SC__) || defined (__BORLANDC__) || defined(__FreeBSD__) || (defined (__GNUC__) && defined (__APPLE__) || defined( __Lynx__ )) || defined (_STLP_NO_WCHAR_T)
+
+#  include _STLP_NATIVE_C_HEADER(stddef.h)
+#  if defined (__FreeBSD__) || defined (__Lynx__)
+#   ifndef _WINT_T
+typedef long int wint_t;
+#    define _WINT_T
+#   endif /* _WINT_T */
+#  endif
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS ) && defined (_STLP_NO_NATIVE_MBSTATE_T) && ! defined (_STLP_NO_MBSTATE_T) && ! defined (_MBSTATE_T) && ! defined (__mbstate_t_defined)
+#  define _STLP_USE_OWN_MBSTATE_T
+#  define _MBSTATE_T
+# endif
+
+# ifdef _STLP_USE_OWN_MBSTATE_T
+
+// to be compatible across different SUN platforms
+#ifdef __sun
+# define __stl_mbstate_t __mbstate_t
+#endif
+
+struct __stl_mbstate_t;
+
+# ifdef __cplusplus
+struct __stl_mbstate_t { 
+  __stl_mbstate_t( long __st = 0 ) { _M_state[0] = __st ; }
+  __stl_mbstate_t& operator=(const long __st) {
+    _M_state[0] = __st;              
+    return *this;
+  } 
+  __stl_mbstate_t(const __stl_mbstate_t& __x) {_M_state[0]= __x._M_state[0]; }         
+  __stl_mbstate_t& operator=(const __stl_mbstate_t& __x) {
+    _M_state[0]= __x._M_state[0];              
+    return *this;
+  }
+# if defined (__sun)
+#  ifdef _LP64
+  long _M_state[4];
+#  else
+  int _M_state[6];
+#  endif
+# else       
+  long _M_state[1];
+# endif
+};          
+
+inline bool operator==(const __stl_mbstate_t& __x, const __stl_mbstate_t& __y) {
+  return ( __x._M_state[0] == __y._M_state[0] );
+}
+
+inline bool operator!=(const __stl_mbstate_t& __x, const __stl_mbstate_t& __y) {
+  return ( __x._M_state[0] == __y._M_state[0] );
+}
+# endif
+
+
+_STLP_BEGIN_NAMESPACE
+
+typedef __stl_mbstate_t mbstate_t;
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_USE_OWN_MBSTATE_T */
+
+#if !defined (_STLP_NO_WCHAR_T)
+# ifndef WCHAR_MIN
+#  define WCHAR_MIN 0
+// SUNpro has some bugs with casts. wchar_t is size of int there anyway.
+#  if defined (__SUNPRO_CC) || defined (__DJGPP)
+#   define WCHAR_MAX (~0)
+#  else
+#   define WCHAR_MAX ((wchar_t)~0)
+#  endif
+# endif
+#endif
+
+# if defined  (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+_STLP_BEGIN_NAMESPACE  
+using namespace _STLP_VENDOR_CSTD;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#endif /* _STLP_CWCHAR_H */
+
diff --git a/src/STLport/stl/_deque.c b/src/STLport/stl/_deque.c
new file mode 100644
index 0000000..f72e525
--- /dev/null
+++ b/src/STLport/stl/_deque.c
@@ -0,0 +1,676 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_DEQUE_C
+# define _STLP_DEQUE_C
+
+# ifndef _STLP_INTERNAL_DEQUE_H
+#  include <stl/_deque.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Non-inline member functions from _Deque_base.
+
+template <class _Tp, class _Alloc >
+_Deque_base<_Tp,_Alloc >::~_Deque_base() {
+  if (_M_map._M_data) {
+    _M_destroy_nodes(_M_start._M_node, this->_M_finish._M_node + 1);
+    _M_map.deallocate(_M_map._M_data, _M_map_size._M_data);
+  }
+}
+
+template <class _Tp, class _Alloc >
+void
+_Deque_base<_Tp,_Alloc>::_M_initialize_map(size_t __num_elements)
+{
+  size_t __num_nodes = 
+    __num_elements / this->buffer_size() + 1 ;
+
+  _M_map_size._M_data = (max)((size_t) _S_initial_map_size, __num_nodes + 2);
+  _M_map._M_data = _M_map.allocate(_M_map_size._M_data);
+
+  _Tp** __nstart = _M_map._M_data + (_M_map_size._M_data - __num_nodes) / 2;
+  _Tp** __nfinish = __nstart + __num_nodes;
+    
+  _STLP_TRY {
+    _M_create_nodes(__nstart, __nfinish);
+  }
+  _STLP_UNWIND((_M_map.deallocate(_M_map._M_data, _M_map_size._M_data), 
+                _M_map._M_data = 0, _M_map_size._M_data = 0));
+  _M_start._M_set_node(__nstart);
+  this->_M_finish._M_set_node(__nfinish - 1);
+  _M_start._M_cur = _M_start._M_first;
+  this->_M_finish._M_cur = this->_M_finish._M_first +
+               __num_elements % this->buffer_size();
+}
+
+template <class _Tp, class _Alloc >
+void
+_Deque_base<_Tp,_Alloc>::_M_create_nodes(_Tp** __nstart,
+                                                  _Tp** __nfinish)
+{
+  _Tp** __cur;
+  _STLP_TRY {
+    for (__cur = __nstart; __cur < __nfinish; ++__cur)
+      *__cur = _M_map_size.allocate(this->buffer_size());
+  }
+  _STLP_UNWIND(_M_destroy_nodes(__nstart, __cur));
+}
+
+template <class _Tp, class _Alloc >
+void 
+_Deque_base<_Tp,_Alloc>::_M_destroy_nodes(_Tp** __nstart,
+                                                   _Tp** __nfinish)
+{
+  for (_Tp** __n = __nstart; __n < __nfinish; ++__n)
+    _M_map_size.deallocate(*__n, this->buffer_size());
+}
+
+
+
+// Non-inline member functions
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// qualified references 
+#   define __iterator__           _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >
+#   define const_iterator         _Deque_iterator<_Tp, _Const_traits<_Tp>  > 
+#   define iterator               __iterator__
+#   define size_type              size_t
+#   define value_type             _Tp
+# else
+#  define __iterator__           _STLP_TYPENAME_ON_RETURN_TYPE __deque__<_Tp, _Alloc>::iterator
+# endif
+
+template <class _Tp, class _Alloc >
+__deque__<_Tp, _Alloc >&  
+__deque__<_Tp, _Alloc >::operator= (const __deque__<_Tp, _Alloc >& __x) {
+  const size_type __len = size();
+  if (&__x != this) {
+    if (__len >= __x.size())
+      erase(copy(__x.begin(), __x.end(), this->_M_start), this->_M_finish);
+    else {
+      const_iterator __mid = __x.begin() + difference_type(__len);
+      copy(__x.begin(), __mid, this->_M_start);
+      insert(this->_M_finish, __mid, __x.end());
+    }
+  }
+  return *this;
+}        
+
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp, _Alloc >::_M_fill_insert(iterator __pos,
+					     size_type __n, const value_type& __x)
+{
+  if (__pos._M_cur == this->_M_start._M_cur) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    _STLP_TRY {
+      uninitialized_fill(__new_start, this->_M_start, __x);
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+    this->_M_start = __new_start;
+  }
+  else if (__pos._M_cur == this->_M_finish._M_cur) {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    _STLP_TRY {
+      uninitialized_fill(this->_M_finish, __new_finish, __x);
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node+1, __new_finish._M_node+1));
+    this->_M_finish = __new_finish;
+  }
+  else 
+    _M_insert_aux(__pos, __n, __x);
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES  
+
+template <class _Tp, class _Alloc >
+void __deque__<_Tp, _Alloc>::insert(iterator __pos,
+                                           const value_type* __first,
+                                           const value_type* __last) {
+  size_type __n = __last - __first;
+  if (__pos._M_cur == this->_M_start._M_cur) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    _STLP_TRY {
+      uninitialized_copy(__first, __last, __new_start);
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+    this->_M_start = __new_start;
+  }
+  else if (__pos._M_cur == this->_M_finish._M_cur) {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    _STLP_TRY {
+      uninitialized_copy(__first, __last, this->_M_finish);
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, 
+                                  __new_finish._M_node + 1));
+    this->_M_finish = __new_finish;
+  }
+  else
+    _M_insert_aux(__pos, __first, __last, __n);
+}
+
+template <class _Tp, class _Alloc >
+void __deque__<_Tp,_Alloc>::insert(iterator __pos,
+                                         const_iterator __first,
+                                         const_iterator __last)
+{
+  size_type __n = __last - __first;
+  if (__pos._M_cur == this->_M_start._M_cur) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    _STLP_TRY {
+      uninitialized_copy(__first, __last, __new_start);
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+    this->_M_start = __new_start;
+  }
+  else if (__pos._M_cur == this->_M_finish._M_cur) {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    _STLP_TRY {
+      uninitialized_copy(__first, __last, this->_M_finish);
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1,__new_finish._M_node + 1));
+    this->_M_finish = __new_finish;
+  }
+  else
+    _M_insert_aux(__pos, __first, __last, __n);
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _Tp, class _Alloc >
+__iterator__ 
+__deque__<_Tp,_Alloc>::erase(iterator __first, iterator __last)
+{
+  if (__first == this->_M_start && __last == this->_M_finish) {
+    clear();
+    return this->_M_finish;
+  }
+  else {
+    difference_type __n = __last - __first;
+    difference_type __elems_before = __first - this->_M_start;
+    if (__elems_before < difference_type(this->size() - __n) / 2) {
+      copy_backward(this->_M_start, __first, __last);
+      iterator __new_start = this->_M_start + __n;
+      _STLP_STD::_Destroy(this->_M_start, __new_start);
+      this->_M_destroy_nodes(this->_M_start._M_node, __new_start._M_node);
+      this->_M_start = __new_start;
+    }
+    else {
+      copy(__last, this->_M_finish, __first);
+      iterator __new_finish = this->_M_finish - __n;
+      _STLP_STD::_Destroy(__new_finish, this->_M_finish);
+      this->_M_destroy_nodes(__new_finish._M_node + 1, this->_M_finish._M_node + 1);
+      this->_M_finish = __new_finish;
+    }
+    return this->_M_start + __elems_before;
+  }
+}
+
+template <class _Tp, class _Alloc >
+void __deque__<_Tp,_Alloc>::clear()
+{
+  for (_Map_pointer __node = this->_M_start._M_node + 1;
+       __node < this->_M_finish._M_node;
+       ++__node) {
+    _STLP_STD::_Destroy(*__node, *__node + this->buffer_size());
+    this->_M_map_size.deallocate(*__node, this->buffer_size());
+  }
+
+  if (this->_M_start._M_node != this->_M_finish._M_node) {
+    _STLP_STD::_Destroy(this->_M_start._M_cur, this->_M_start._M_last);
+    _STLP_STD::_Destroy(this->_M_finish._M_first, this->_M_finish._M_cur);
+    this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
+  }
+  else
+    _STLP_STD::_Destroy(this->_M_start._M_cur, this->_M_finish._M_cur);
+
+  this->_M_finish = this->_M_start;
+}
+
+// Precondition: this->_M_start and this->_M_finish have already been initialized,
+// but none of the deque's elements have yet been constructed.
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_fill_initialize(const value_type& __val) {
+  _Map_pointer __cur;
+  _STLP_TRY {
+    for (__cur = this->_M_start._M_node; __cur < this->_M_finish._M_node; ++__cur)
+      uninitialized_fill(*__cur, *__cur + this->buffer_size(), __val);
+    uninitialized_fill(this->_M_finish._M_first, this->_M_finish._M_cur, __val);
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, iterator(*__cur, __cur)));
+}
+
+
+// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_push_back_aux_v(const value_type& __t)
+{
+  value_type __t_copy = __t;
+  _M_reserve_map_at_back();
+  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
+  _STLP_TRY {
+    _Construct(this->_M_finish._M_cur, __t_copy);
+    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
+    this->_M_finish._M_cur = this->_M_finish._M_first;
+  }
+  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1), 
+				      this->buffer_size()));
+}
+
+# ifndef _STLP_NO_ANACHRONISMS
+// Called only if this->_M_finish._M_cur == this->_M_finish._M_last - 1.
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_push_back_aux()
+{
+  _M_reserve_map_at_back();
+  *(this->_M_finish._M_node + 1) = this->_M_map_size.allocate(this->buffer_size());
+  _STLP_TRY {
+    _Construct(this->_M_finish._M_cur);
+    this->_M_finish._M_set_node(this->_M_finish._M_node + 1);
+    this->_M_finish._M_cur = this->_M_finish._M_first;
+  }
+  _STLP_UNWIND(this->_M_map_size.deallocate(*(this->_M_finish._M_node + 1), 
+				      this->buffer_size()));
+}
+# endif
+
+// Called only if this->_M_start._M_cur == this->_M_start._M_first.
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_push_front_aux_v(const value_type& __t)
+{
+  value_type __t_copy = __t;
+  _M_reserve_map_at_front();
+  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
+  _STLP_TRY {
+    this->_M_start._M_set_node(this->_M_start._M_node - 1);
+    this->_M_start._M_cur = this->_M_start._M_last - 1;
+    _Construct(this->_M_start._M_cur, __t_copy);
+  }
+  _STLP_UNWIND((++this->_M_start, 
+		this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), this->buffer_size())));
+} 
+
+
+# ifndef _STLP_NO_ANACHRONISMS
+// Called only if this->_M_start._M_cur == this->_M_start._M_first.
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_push_front_aux()
+{
+  _M_reserve_map_at_front();
+  *(this->_M_start._M_node - 1) = this->_M_map_size.allocate(this->buffer_size());
+  _STLP_TRY {
+    this->_M_start._M_set_node(this->_M_start._M_node - 1);
+    this->_M_start._M_cur = this->_M_start._M_last - 1;
+    _Construct(this->_M_start._M_cur);
+  }
+  _STLP_UNWIND((++this->_M_start, this->_M_map_size.deallocate(*(this->_M_start._M_node - 1), 
+						   this->buffer_size() )));
+} 
+# endif
+
+// Called only if this->_M_finish._M_cur == this->_M_finish._M_first.
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_pop_back_aux()
+{
+  this->_M_map_size.deallocate(this->_M_finish._M_first, this->buffer_size());
+  this->_M_finish._M_set_node(this->_M_finish._M_node - 1);
+  this->_M_finish._M_cur = this->_M_finish._M_last - 1;
+  _STLP_STD::_Destroy(this->_M_finish._M_cur);
+}
+
+// Called only if this->_M_start._M_cur == this->_M_start._M_last - 1.  Note that 
+// if the deque has at least one element (a precondition for this member 
+// function), and if this->_M_start._M_cur == this->_M_start._M_last, then the deque 
+// must have at least two nodes.
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_pop_front_aux()
+{
+  _STLP_STD::_Destroy(this->_M_start._M_cur);
+  this->_M_map_size.deallocate(this->_M_start._M_first, this->buffer_size());
+  this->_M_start._M_set_node(this->_M_start._M_node + 1);
+  this->_M_start._M_cur = this->_M_start._M_first;
+}      
+
+
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::_M_insert_aux_prepare(iterator __pos) {
+  difference_type __index = __pos - this->_M_start;
+  if (__index < difference_type(size() / 2)) {
+    push_front(front());
+    iterator __front1 = this->_M_start;
+    ++__front1;
+    iterator __front2 = __front1;
+    ++__front2;
+    __pos = this->_M_start + __index;
+    iterator __pos1 = __pos;
+    ++__pos1;
+    copy(__front2, __pos1, __front1);
+  }
+  else {
+    push_back(back());
+    iterator __back1 = this->_M_finish;
+    --__back1;
+    iterator __back2 = __back1;
+    --__back2;
+    __pos = this->_M_start + __index;
+    copy_backward(__pos, __back2, __back1);
+  }
+  return __pos;
+}
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+				     const value_type& __x) {
+  value_type __x_copy = __x;
+  _STLP_MPWFIX_TRY		//*TY 06/01/2000 - mpw forget to call dtor on __x_copy without this try block
+  __pos = _M_insert_aux_prepare(__pos);
+  *__pos = __x_copy;
+  return __pos;
+  _STLP_MPWFIX_CATCH		//*TY 06/01/2000 - 
+}
+
+template <class _Tp, class _Alloc >
+__iterator__
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos)
+{
+  __pos = _M_insert_aux_prepare(__pos);
+  *__pos = value_type();
+  return __pos;
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+                                           size_type __n,
+                                           const value_type& __x)
+{
+  const difference_type __elems_before = __pos - this->_M_start;
+  size_type __length = this->size();
+  value_type __x_copy = __x;
+  if (__elems_before < difference_type(__length / 2)) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    iterator __old_start = this->_M_start;
+    __pos = this->_M_start + __elems_before;
+    _STLP_TRY {
+      if (__elems_before >= difference_type(__n)) {
+        iterator __start_n = this->_M_start + difference_type(__n);
+        uninitialized_copy(this->_M_start, __start_n, __new_start);
+        this->_M_start = __new_start;
+        copy(__start_n, __pos, __old_start);
+        fill(__pos - difference_type(__n), __pos, __x_copy);
+      }
+      else {
+        __uninitialized_copy_fill(this->_M_start, __pos, __new_start, 
+	                          this->_M_start, __x_copy);
+        this->_M_start = __new_start;
+        fill(__old_start, __pos, __x_copy);
+      }
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+  }
+  else {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    iterator __old_finish = this->_M_finish;
+    const difference_type __elems_after = 
+      difference_type(__length) - __elems_before;
+    __pos = this->_M_finish - __elems_after;
+    _STLP_TRY {
+      if (__elems_after > difference_type(__n)) {
+        iterator __finish_n = this->_M_finish - difference_type(__n);
+        uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+        this->_M_finish = __new_finish;
+        copy_backward(__pos, __finish_n, __old_finish);
+        fill(__pos, __pos + difference_type(__n), __x_copy);
+      }
+      else {
+        __uninitialized_fill_copy(this->_M_finish, __pos + difference_type(__n),
+                                  __x_copy, __pos, this->_M_finish);
+        this->_M_finish = __new_finish;
+        fill(__pos, __old_finish, __x_copy);
+      }
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+  }
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES 
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+                                           const value_type* __first,
+                                           const value_type* __last,
+                                           size_type __n)
+{
+
+  const difference_type __elemsbefore = __pos - this->_M_start;
+  size_type __length = size();
+  if (__elemsbefore < difference_type(__length / 2)) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    iterator __old_start = this->_M_start;
+    __pos = this->_M_start + __elemsbefore;
+    _STLP_TRY {
+      if (__elemsbefore >= difference_type(__n)) {
+        iterator __start_n = this->_M_start + difference_type(__n);
+        uninitialized_copy(this->_M_start, __start_n, __new_start);
+        this->_M_start = __new_start;
+        copy(__start_n, __pos, __old_start);
+        copy(__first, __last, __pos - difference_type(__n));
+      }
+      else {
+        const value_type* __mid = 
+	  __first + (difference_type(__n) - __elemsbefore);
+        __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,
+                                  __new_start, _IsPODType());
+        this->_M_start = __new_start;
+        copy(__mid, __last, __old_start);
+      }
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+  }
+  else {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    iterator __old_finish = this->_M_finish;
+    const difference_type __elemsafter = 
+      difference_type(__length) - __elemsbefore;
+    __pos = this->_M_finish - __elemsafter;
+    _STLP_TRY {
+      if (__elemsafter > difference_type(__n)) {
+        iterator __finish_n = this->_M_finish - difference_type(__n);
+        uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+        this->_M_finish = __new_finish;
+        copy_backward(__pos, __finish_n, __old_finish);
+        copy(__first, __last, __pos);
+      }
+      else {
+        const value_type* __mid = __first + __elemsafter;
+        __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());
+        this->_M_finish = __new_finish;
+        copy(__first, __mid, __pos);
+      }
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+  }
+}
+
+template <class _Tp, class _Alloc >
+void
+__deque__<_Tp,_Alloc>::_M_insert_aux(iterator __pos,
+                                           const_iterator __first,
+                                           const_iterator __last,
+                                           size_type __n)
+{
+  const difference_type __elemsbefore = __pos - this->_M_start;
+  size_type __length = size();
+  if (__elemsbefore < difference_type(__length / 2)) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    iterator __old_start = this->_M_start;
+    __pos = this->_M_start + __elemsbefore;
+    _STLP_TRY {
+      if (__elemsbefore >= difference_type(__n)) {
+        iterator __start_n = this->_M_start + __n;
+        uninitialized_copy(this->_M_start, __start_n, __new_start);
+        this->_M_start = __new_start;
+        copy(__start_n, __pos, __old_start);
+        copy(__first, __last, __pos - difference_type(__n));
+      }
+      else {
+        const_iterator __mid = __first + (__n - __elemsbefore);
+        __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,
+                                  __new_start, _IsPODType());
+        this->_M_start = __new_start;
+        copy(__mid, __last, __old_start);
+      }
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+  }
+  else {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    iterator __old_finish = this->_M_finish;
+    const difference_type __elemsafter = __length - __elemsbefore;
+    __pos = this->_M_finish - __elemsafter;
+    _STLP_TRY {
+      if (__elemsafter > difference_type(__n)) {
+        iterator __finish_n = this->_M_finish - difference_type(__n);
+        uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+        this->_M_finish = __new_finish;
+        copy_backward(__pos, __finish_n, __old_finish);
+        copy(__first, __last, __pos);
+      }
+      else {
+        const_iterator __mid = __first + __elemsafter;
+        __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());
+        this->_M_finish = __new_finish;
+        copy(__first, __mid, __pos);
+      }
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+  }
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_new_elements_at_front(size_type __new_elems)
+{
+  size_type __new_nodes
+      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
+  _M_reserve_map_at_front(__new_nodes);
+  size_type __i =1;
+  _STLP_TRY {
+    for (; __i <= __new_nodes; ++__i)
+      *(this->_M_start._M_node - __i) = this->_M_map_size.allocate(this->buffer_size());
+  }
+#       ifdef _STLP_USE_EXCEPTIONS
+  catch(...) {
+    for (size_type __j = 1; __j < __i; ++__j)
+      this->_M_map_size.deallocate(*(this->_M_start._M_node - __j), this->buffer_size());
+    throw;
+  }
+#       endif /* _STLP_USE_EXCEPTIONS */
+}
+
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_new_elements_at_back(size_type __new_elems)
+{
+  size_type __new_nodes
+      = (__new_elems + this->buffer_size() - 1) / this->buffer_size();
+  _M_reserve_map_at_back(__new_nodes);
+  size_type __i = 1;
+  _STLP_TRY {
+    for (; __i <= __new_nodes; ++__i)
+      *(this->_M_finish._M_node + __i) = this->_M_map_size.allocate(this->buffer_size());
+  }
+#       ifdef _STLP_USE_EXCEPTIONS
+  catch(...) {
+    for (size_type __j = 1; __j < __i; ++__j)
+      this->_M_map_size.deallocate(*(this->_M_finish._M_node + __j), this->buffer_size());
+    throw;
+  }
+#       endif /* _STLP_USE_EXCEPTIONS */
+}
+
+template <class _Tp, class _Alloc >
+void 
+__deque__<_Tp,_Alloc>::_M_reallocate_map(size_type __nodes_to_add,
+                                              bool __add_at_front)
+{
+  size_type __old_num_nodes = this->_M_finish._M_node - this->_M_start._M_node + 1;
+  size_type __new_num_nodes = __old_num_nodes + __nodes_to_add;
+
+  _Map_pointer __new_nstart;
+  if (this->_M_map_size._M_data > 2 * __new_num_nodes) {
+    __new_nstart = this->_M_map._M_data + (this->_M_map_size._M_data - __new_num_nodes) / 2 
+                     + (__add_at_front ? __nodes_to_add : 0);
+    if (__new_nstart < this->_M_start._M_node)
+      copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
+    else
+      copy_backward(this->_M_start._M_node, this->_M_finish._M_node + 1, 
+                    __new_nstart + __old_num_nodes);
+  }
+  else {
+    size_type __new_map_size = 
+      this->_M_map_size._M_data + (max)((size_t)this->_M_map_size._M_data, __nodes_to_add) + 2;
+
+    _Map_pointer __new_map = this->_M_map.allocate(__new_map_size);
+    __new_nstart = __new_map + (__new_map_size - __new_num_nodes) / 2
+                         + (__add_at_front ? __nodes_to_add : 0);
+    copy(this->_M_start._M_node, this->_M_finish._M_node + 1, __new_nstart);
+    this->_M_map.deallocate(this->_M_map._M_data, this->_M_map_size._M_data);
+
+    this->_M_map._M_data = __new_map;
+    this->_M_map_size._M_data = __new_map_size;
+  }
+
+  this->_M_start._M_set_node(__new_nstart);
+  this->_M_finish._M_set_node(__new_nstart + __old_num_nodes - 1);
+}
+
+_STLP_END_NAMESPACE
+
+# undef __iterator__
+# undef iterator
+# undef const_iterator
+# undef size_type
+# undef value_type
+
+#endif /*  _STLP_DEQUE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_deque.h b/src/STLport/stl/_deque.h
new file mode 100644
index 0000000..02eb070
--- /dev/null
+++ b/src/STLport/stl/_deque.h
@@ -0,0 +1,953 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+#define _STLP_INTERNAL_DEQUE_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#  include <stl/_uninitialized.h>
+# endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+#  include <stl/_range_errors.h>
+# endif
+
+/* Class invariants:
+ *  For any nonsingular iterator i:
+ *    i.node is the address of an element in the map array.  The
+ *      contents of i.node is a pointer to the beginning of a node.
+ *    i.first == *(i.node) 
+ *    i.last  == i.first + node_size
+ *    i.cur is a pointer in the range [i.first, i.last).  NOTE:
+ *      the implication of this is that i.cur is always a dereferenceable
+ *      pointer, even if i is a past-the-end iterator.
+ *  Start and Finish are always nonsingular iterators.  NOTE: this means
+ *    that an empty deque must have one node, and that a deque
+ *    with N elements, where N is the buffer size, must have two nodes.
+ *  For every node other than start.node and finish.node, every element
+ *    in the node is an initialized object.  If start.node == finish.node,
+ *    then [start.cur, finish.cur) are initialized objects, and
+ *    the elements outside that range are uninitialized storage.  Otherwise,
+ *    [start.cur, start.last) and [finish.first, finish.cur) are initialized
+ *    objects, and [start.first, start.cur) and [finish.cur, finish.last)
+ *    are uninitialized storage.
+ *  [map, map + map_size) is a valid, non-empty range.  
+ *  [start.node, finish.node] is a valid range contained within 
+ *    [map, map + map_size).  
+ *  A pointer in the range [map, map + map_size) points to an allocated node
+ *    if and only if the pointer is in the range [start.node, finish.node].
+ */
+
+# undef deque
+# define deque __WORKAROUND_DBG_RENAME(deque)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+struct _Deque_iterator_base {
+
+  enum _Constants { 
+    _blocksize = _MAX_BYTES, 
+    __buffer_size = (sizeof(_Tp) < (size_t)_blocksize ?
+   		    ( (size_t)_blocksize / sizeof(_Tp)) : size_t(1))
+  };
+
+  typedef random_access_iterator_tag iterator_category;
+
+  typedef _Tp value_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+  typedef value_type** _Map_pointer;
+
+  typedef _Deque_iterator_base< _Tp > _Self;
+
+  value_type* _M_cur;
+  value_type* _M_first;
+  value_type* _M_last;
+  _Map_pointer _M_node;
+
+  _Deque_iterator_base(value_type* __x, _Map_pointer __y) 
+    : _M_cur(__x), _M_first(*__y),
+      _M_last(*__y + __buffer_size), _M_node(__y) {}
+  _Deque_iterator_base() : _M_cur(0), _M_first(0), _M_last(0), _M_node(0) {}
+
+  difference_type _M_subtract(const _Self& __x) const {
+    return difference_type(__buffer_size) * (_M_node - __x._M_node - 1) +
+      (_M_cur - _M_first) + (__x._M_last - __x._M_cur);
+  }
+
+  void _M_increment() {
+    if (++_M_cur == _M_last) {
+      _M_set_node(_M_node + 1);
+      _M_cur = _M_first;
+    }
+  }
+
+  void _M_decrement() {
+    if (_M_cur == _M_first) {
+      _M_set_node(_M_node - 1);
+      _M_cur = _M_last;
+    }
+    --_M_cur;
+  }
+
+  void _M_advance(difference_type __n)
+  {
+    difference_type __offset = __n + (_M_cur - _M_first);
+    if (__offset >= 0 && __offset < difference_type(__buffer_size))
+      _M_cur += __n;
+    else {
+      difference_type __node_offset =
+        __offset > 0 ? __offset / __buffer_size
+                   : -difference_type((-__offset - 1) / __buffer_size) - 1;
+      _M_set_node(_M_node + __node_offset);
+      _M_cur = _M_first + 
+        (__offset - __node_offset * difference_type(__buffer_size));
+    }
+  }
+
+  void _M_set_node(_Map_pointer __new_node) {
+    _M_last = (_M_first = *(_M_node = __new_node)) + difference_type(__buffer_size);
+  }
+};
+
+
+
+template <class _Tp, class _Traits>
+struct _Deque_iterator : public _Deque_iterator_base< _Tp> {
+
+  typedef random_access_iterator_tag iterator_category;
+  typedef _Tp value_type;
+  typedef typename _Traits::reference  reference;
+  typedef typename _Traits::pointer    pointer;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef value_type** _Map_pointer;
+
+  typedef _Deque_iterator_base< _Tp > _Base;
+  typedef _Deque_iterator<_Tp, _Traits> _Self;
+  typedef _Deque_iterator<_Tp, _Nonconst_traits<_Tp> > _Nonconst_self;
+  typedef _Deque_iterator<_Tp, _Const_traits<_Tp> > _Const_self;
+
+  _Deque_iterator(value_type* __x, _Map_pointer __y) :
+    _Deque_iterator_base<value_type>(__x,__y) {}
+
+  _Deque_iterator() {}
+  _Deque_iterator(const _Nonconst_self& __x) : 
+    _Deque_iterator_base<value_type>(__x) {}
+
+  reference operator*() const { 
+      return *this->_M_cur; 
+  }
+
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  difference_type operator-(const _Self& __x) const { return this->_M_subtract(__x); }
+
+  _Self& operator++() { this->_M_increment(); return *this; }
+  _Self operator++(int)  {
+    _Self __tmp = *this;
+    ++*this;
+    return __tmp;
+  }
+
+  _Self& operator--() { this->_M_decrement(); return *this; }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    --*this;
+    return __tmp;
+  }
+
+  _Self& operator+=(difference_type __n) { this->_M_advance(__n); return *this; }
+  _Self operator+(difference_type __n) const
+  {
+    _Self __tmp = *this;
+    return __tmp += __n;
+  }
+
+  _Self& operator-=(difference_type __n) { return *this += -__n; }
+  _Self operator-(difference_type __n) const {
+    _Self __tmp = *this;
+    return __tmp -= __n;
+  }
+
+  reference operator[](difference_type __n) const { return *(*this + __n); }
+};
+
+template <class _Tp, class _Traits>
+inline _Deque_iterator<_Tp, _Traits> _STLP_CALL
+operator+(ptrdiff_t __n, const _Deque_iterator<_Tp, _Traits>& __x)
+{
+   return __x + __n;
+}
+
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Tp>
+inline bool _STLP_CALL 
+operator==(const _Deque_iterator_base<_Tp >& __x,
+	   const _Deque_iterator_base<_Tp >& __y) { 
+    return __x._M_cur == __y._M_cur; 
+}
+
+template <class _Tp>
+inline bool _STLP_CALL 
+operator < (const _Deque_iterator_base<_Tp >& __x,
+	    const _Deque_iterator_base<_Tp >& __y) { 
+  return (__x._M_node == __y._M_node) ? 
+    (__x._M_cur < __y._M_cur) : (__x._M_node < __y._M_node);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL 
+operator!=(const _Deque_iterator_base<_Tp >& __x,
+	   const _Deque_iterator_base<_Tp >& __y) { 
+    return __x._M_cur != __y._M_cur; 
+}
+template <class _Tp>
+inline bool _STLP_CALL 
+operator>(const _Deque_iterator_base<_Tp >& __x,
+	  const _Deque_iterator_base<_Tp >& __y) { 
+    return __y < __x;
+}
+template <class _Tp>
+inline bool  _STLP_CALL operator>=(const _Deque_iterator_base<_Tp >& __x,
+                                   const _Deque_iterator_base<_Tp >& __y) { 
+    return !(__x < __y);
+}
+template <class _Tp>
+inline bool  _STLP_CALL operator<=(const _Deque_iterator_base<_Tp >& __x,
+                                   const _Deque_iterator_base<_Tp >& __y) { 
+    return !(__y < __x);
+}
+
+# else
+
+template <class _Tp, class _Traits1, class _Traits2>
+inline bool  _STLP_CALL
+operator==(const _Deque_iterator<_Tp, _Traits1 >& __x,
+	   const _Deque_iterator<_Tp, _Traits2 >& __y) { 
+    return __x._M_cur == __y._M_cur; 
+}
+
+template <class _Tp, class _Traits1, class _Traits2>
+inline bool _STLP_CALL 
+operator < (const _Deque_iterator<_Tp, _Traits1 >& __x,
+	    const _Deque_iterator<_Tp, _Traits2 >& __y) { 
+  return (__x._M_node == __y._M_node) ? 
+    (__x._M_cur < __y._M_cur) : (__x._M_node < __y._M_node);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL 
+operator!=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+	   const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) { 
+    return __x._M_cur != __y._M_cur; 
+}
+template <class _Tp>
+inline bool _STLP_CALL 
+operator>(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+	  const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) { 
+    return __y < __x;
+}
+template <class _Tp>
+inline bool  _STLP_CALL
+operator>=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+           const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) { 
+    return !(__x < __y);
+}
+template <class _Tp>
+inline bool _STLP_CALL
+operator<=(const _Deque_iterator<_Tp, _Nonconst_traits<_Tp> >& __x,
+           const _Deque_iterator<_Tp, _Const_traits<_Tp> >& __y) { 
+    return !(__y < __x);
+}
+# endif
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp, class _Traits> inline _Tp*  _STLP_CALL value_type(const _Deque_iterator<_Tp, _Traits  >&) { return (_Tp*)0; }
+template <class _Tp, class _Traits> inline random_access_iterator_tag _STLP_CALL 
+iterator_category(const _Deque_iterator<_Tp, _Traits  >&) { return random_access_iterator_tag(); }
+template <class _Tp, class _Traits> inline ptrdiff_t* _STLP_CALL 
+distance_type(const _Deque_iterator<_Tp, _Traits  >&) { return 0; }
+#endif
+
+// Deque base class.  It has two purposes.  First, its constructor
+//  and destructor allocate (but don't initialize) storage.  This makes
+//  exception safety easier.  Second, the base class encapsulates all of
+//  the differences between SGI-style allocators and standard-conforming
+//  allocators.
+
+template <class _Tp, class _Alloc>
+class _Deque_base {
+public:
+  typedef _Tp value_type;
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type  allocator_type;
+  typedef typename _Alloc_traits<_Tp*, _Alloc>::allocator_type _Map_alloc_type;
+
+  typedef _Deque_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+  typedef _Deque_iterator<_Tp, _Const_traits<_Tp> >   const_iterator;
+
+  static size_t  _STLP_CALL buffer_size() { return (size_t)_Deque_iterator_base<_Tp>::__buffer_size; } 
+
+  _Deque_base(const allocator_type& __a, size_t __num_elements)
+    : _M_start(), _M_finish(), _M_map(_STLP_CONVERT_ALLOCATOR(__a, _Tp*), 0),
+      _M_map_size(__a, (size_t)0) {
+	_M_initialize_map(__num_elements);
+  }
+  _Deque_base(const allocator_type& __a)
+    : _M_start(), _M_finish(), _M_map(_STLP_CONVERT_ALLOCATOR(__a, _Tp*), 0), 
+      _M_map_size(__a, (size_t)0) {
+  }
+  ~_Deque_base();    
+
+protected:
+  void _M_initialize_map(size_t);
+  void _M_create_nodes(_Tp** __nstart, _Tp** __nfinish);
+  void _M_destroy_nodes(_Tp** __nstart, _Tp** __nfinish);
+  enum { _S_initial_map_size = 8 };
+
+protected:
+  iterator _M_start;
+  iterator _M_finish;
+  _STLP_alloc_proxy<value_type**, value_type*, _Map_alloc_type>  _M_map;
+  _STLP_alloc_proxy<size_t, value_type,  allocator_type>   _M_map_size;  
+};
+
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class deque : protected _Deque_base<_Tp, _Alloc> {
+  typedef _Deque_base<_Tp, _Alloc> _Base;
+  typedef deque<_Tp, _Alloc> _Self;
+public:                         // Basic types
+  typedef _Tp value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef random_access_iterator_tag _Iterator_category;
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Base::allocator_type allocator_type;
+
+public:                         // Iterators
+  typedef typename _Base::iterator       iterator;
+  typedef typename _Base::const_iterator const_iterator;
+
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+protected:                      // Internal typedefs
+  typedef pointer* _Map_pointer;
+  typedef typename  __type_traits<_Tp>::has_trivial_assignment_operator _TrivialAss;
+  typedef typename  __type_traits<_Tp>::has_trivial_assignment_operator _IsPODType;
+
+public:                         // Basic accessors
+  iterator begin() { return this->_M_start; }
+  iterator end() { return this->_M_finish; }
+  const_iterator begin() const { return const_iterator(this->_M_start); }
+  const_iterator end() const { return const_iterator(this->_M_finish); }
+
+  reverse_iterator rbegin() { return reverse_iterator(this->_M_finish); }
+  reverse_iterator rend() { return reverse_iterator(this->_M_start); }
+  const_reverse_iterator rbegin() const 
+    { return const_reverse_iterator(this->_M_finish); }
+  const_reverse_iterator rend() const 
+    { return const_reverse_iterator(this->_M_start); }
+
+  reference operator[](size_type __n)
+    { return this->_M_start[difference_type(__n)]; }
+  const_reference operator[](size_type __n) const 
+    { return this->_M_start[difference_type(__n)]; }
+
+  void _M_range_check(size_type __n) const {
+    if (__n >= this->size())
+      __stl_throw_out_of_range("deque");
+  }
+  reference at(size_type __n)
+    { _M_range_check(__n); return (*this)[__n]; }
+  const_reference at(size_type __n) const
+    { _M_range_check(__n); return (*this)[__n]; }
+
+  reference front() { return *this->_M_start; }
+  reference back() {
+    iterator __tmp = this->_M_finish;
+    --__tmp;
+    return *__tmp;
+  }
+  const_reference front() const { return *this->_M_start; }
+  const_reference back() const {
+    const_iterator __tmp = this->_M_finish;
+    --__tmp;
+    return *__tmp;
+  }
+
+  size_type size() const { return this->_M_finish - this->_M_start; }
+  size_type max_size() const { return size_type(-1); }
+  bool empty() const { return this->_M_finish == this->_M_start; }
+  allocator_type get_allocator() const { return this->_M_map_size; }
+
+public:                         // Constructor, destructor.
+  explicit deque(const allocator_type& __a = allocator_type()) 
+    : _Deque_base<_Tp, _Alloc>(__a, 0) {}
+
+  deque(const _Self& __x) : 
+    _Deque_base<_Tp, _Alloc>(__x.get_allocator(), __x.size()) { 
+      __uninitialized_copy(__x.begin(), __x.end(), this->_M_start, _IsPODType()); 
+  }
+
+  deque(size_type __n, const value_type& __val,
+        const allocator_type& __a = allocator_type()) : 
+    _Deque_base<_Tp, _Alloc>(__a, __n)
+    { _M_fill_initialize(__val); }
+  // int,long variants may be needed 
+  explicit deque(size_type __n) : _Deque_base<_Tp, _Alloc>(allocator_type(), __n)
+    { _M_fill_initialize(value_type()); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _Integer>
+  void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+    this->_M_initialize_map(__n);
+    _M_fill_initialize(__x);
+  }
+
+  template <class _InputIter>
+  void _M_initialize_dispatch(_InputIter __first, _InputIter __last,
+                              const __false_type&) {
+    _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+  }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  // VC++ needs this
+  template <class _InputIterator>
+  deque(_InputIterator __first, _InputIterator __last) : 
+    _Deque_base<_Tp, _Alloc>(allocator_type()) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_dispatch(__first, __last, _Integral());
+  }
+# endif
+
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InputIterator>
+  deque(_InputIterator __first, _InputIterator __last,
+        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : 
+    _Deque_base<_Tp, _Alloc>(__a) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_dispatch(__first, __last, _Integral());
+  }
+
+# else
+  deque(const value_type* __first, const value_type* __last,
+        const allocator_type& __a = allocator_type() ) 
+    : _Deque_base<_Tp, _Alloc>(__a, __last - __first) { 
+    __uninitialized_copy(__first, __last, this->_M_start, _IsPODType()); 
+  }
+
+  deque(const_iterator __first, const_iterator __last,
+        const allocator_type& __a = allocator_type() ) 
+    : _Deque_base<_Tp, _Alloc>(__a, __last - __first) { 
+    __uninitialized_copy(__first, __last, this->_M_start, _IsPODType()); 
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  ~deque() { 
+    _STLP_STD::_Destroy(this->_M_start, this->_M_finish); 
+  }
+
+  _Self& operator= (const _Self& __x);
+
+  void swap(_Self& __x) {
+    _STLP_STD::swap(this->_M_start, __x._M_start);
+    _STLP_STD::swap(this->_M_finish, __x._M_finish);
+    _STLP_STD::swap(this->_M_map, __x._M_map);
+    _STLP_STD::swap(this->_M_map_size, __x._M_map_size);
+  }
+
+public: 
+  // assign(), a generalized assignment member function.  Two
+  // versions: one that takes a count, and one that takes a range.
+  // The range version is a member template, so we dispatch on whether
+  // or not the type is an integer.
+
+  void _M_fill_assign(size_type __n, const _Tp& __val) {
+    if (__n > size()) {
+      _STLP_STD::fill(begin(), end(), __val);
+      insert(end(), __n - size(), __val);
+    }
+    else {
+      erase(begin() + __n, end());
+      _STLP_STD::fill(begin(), end(), __val);
+    }
+  }
+
+  void assign(size_type __n, const _Tp& __val) {
+    _M_fill_assign(__n, __val);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_assign_dispatch(__first, __last, _Integral());
+  }
+
+private:                        // helper functions for assign() 
+
+  template <class _Integer>
+  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+    { _M_fill_assign((size_type) __n, (_Tp) __val); }
+
+  template <class _InputIterator>
+  void _M_assign_dispatch(_InputIterator __first, _InputIterator __last,
+                          const __false_type&) {
+    _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+  }
+
+  template <class _InputIter>
+  void _M_assign_aux(_InputIter __first, _InputIter __last, const input_iterator_tag &) {
+    iterator __cur = begin();
+    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
+      *__cur = *__first;
+    if (__first == __last)
+      erase(__cur, end());
+    else
+      insert(end(), __first, __last);
+  }
+
+  template <class _ForwardIterator>
+  void _M_assign_aux(_ForwardIterator __first, _ForwardIterator __last,
+                     const forward_iterator_tag &) {
+    size_type __len = distance(__first, __last);
+    if (__len > size()) {
+      _ForwardIterator __mid = __first;
+      advance(__mid, size());
+      copy(__first, __mid, begin());
+      insert(end(), __mid, __last);
+    }
+    else
+      erase(copy(__first, __last, begin()), end());
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // push_* and pop_*
+  
+  void push_back(const value_type& __t) {
+    if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
+      _Construct(this->_M_finish._M_cur, __t);
+      ++this->_M_finish._M_cur;
+    }
+    else
+      _M_push_back_aux_v(__t);
+  }
+  void push_front(const value_type& __t) {
+    if (this->_M_start._M_cur != this->_M_start._M_first) {
+      _Construct(this->_M_start._M_cur - 1, __t);
+      --this->_M_start._M_cur;
+    }
+    else
+      _M_push_front_aux_v(__t);
+  }
+
+# ifndef _STLP_NO_ANACHRONISMS
+  void push_back() {
+    if (this->_M_finish._M_cur != this->_M_finish._M_last - 1) {
+      _Construct(this->_M_finish._M_cur);
+      ++this->_M_finish._M_cur;
+    }
+    else
+      _M_push_back_aux();
+  }
+  void push_front() {
+    if (this->_M_start._M_cur != this->_M_start._M_first) {
+      _Construct(this->_M_start._M_cur - 1);
+      --this->_M_start._M_cur;
+    }
+    else
+      _M_push_front_aux();
+  }
+# endif
+
+  void pop_back() {
+    if (this->_M_finish._M_cur != this->_M_finish._M_first) {
+      --this->_M_finish._M_cur;
+      _STLP_STD::_Destroy(this->_M_finish._M_cur);
+    }
+    else
+      _M_pop_back_aux();
+  }
+
+  void pop_front() {
+    if (this->_M_start._M_cur != this->_M_start._M_last - 1) {
+      _STLP_STD::_Destroy(this->_M_start._M_cur);
+      ++this->_M_start._M_cur;
+    }
+    else 
+      _M_pop_front_aux();
+  }
+
+public:                         // Insert
+
+  iterator insert(iterator __position, const value_type& __x) {
+    if (__position._M_cur == this->_M_start._M_cur) {
+      push_front(__x);
+      return this->_M_start;
+    }
+    else if (__position._M_cur == this->_M_finish._M_cur) {
+      push_back(__x);
+      iterator __tmp = this->_M_finish;
+      --__tmp;
+      return __tmp;
+    }
+    else {
+      return _M_insert_aux(__position, __x);
+    }
+  }
+
+  iterator insert(iterator __position)
+    { return insert(__position, value_type()); }
+
+  void insert(iterator __pos, size_type __n, const value_type& __x) {
+    _M_fill_insert(__pos, __n, __x);
+  }
+
+  void _M_fill_insert(iterator __pos, size_type __n, const value_type& __x);
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InputIterator>
+  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_insert_dispatch(__pos, __first, __last, _Integral());
+  }
+
+  template <class _Integer>
+  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
+                          const __true_type&) {
+    _M_fill_insert(__pos, (size_type) __n, (value_type) __x);
+  }
+
+  template <class _InputIterator>
+  void _M_insert_dispatch(iterator __pos,
+                          _InputIterator __first, _InputIterator __last,
+                          const __false_type&) {
+    insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void insert(iterator __pos,
+              const value_type* __first, const value_type* __last);
+  void insert(iterator __pos,
+              const_iterator __first, const_iterator __last);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void resize(size_type __new_size, value_type __x) {
+    const size_type __len = size();
+    if (__new_size < __len) 
+      erase(this->_M_start + __new_size, this->_M_finish);
+    else
+      insert(this->_M_finish, __new_size - __len, __x);
+  }
+
+  void resize(size_type new_size) { resize(new_size, value_type()); }
+
+public:                         // Erase
+  iterator erase(iterator __pos) {
+    iterator __next = __pos;
+    ++__next;
+    difference_type __index = __pos - this->_M_start;
+    if (size_type(__index) < this->size() >> 1) {
+      copy_backward(this->_M_start, __pos, __next);
+      pop_front();
+    }
+    else {
+      copy(__next, this->_M_finish, __pos);
+      pop_back();
+    }
+    return this->_M_start + __index;
+  }
+
+  iterator erase(iterator __first, iterator __last);
+  void clear(); 
+
+protected:                        // Internal construction/destruction
+
+  void _M_fill_initialize(const value_type& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES 
+
+  template <class _InputIterator>
+  void _M_range_initialize(_InputIterator __first,
+			   _InputIterator __last,
+			   const input_iterator_tag &) {
+    this->_M_initialize_map(0);
+    _STLP_TRY {
+      for ( ; __first != __last; ++__first)
+        push_back(*__first);
+    }
+    _STLP_UNWIND(clear());
+  }
+ template <class _ForwardIterator>
+ void  _M_range_initialize(_ForwardIterator __first,
+                           _ForwardIterator __last,
+                           const forward_iterator_tag &)  {
+   size_type __n = distance(__first, __last);
+   this->_M_initialize_map(__n);
+   _Map_pointer __cur_node;
+   _STLP_TRY {
+    for (__cur_node = this->_M_start._M_node; 
+         __cur_node < this->_M_finish._M_node; 
+	 ++__cur_node) {
+      _ForwardIterator __mid = __first;
+      advance(__mid, this->buffer_size());
+      uninitialized_copy(__first, __mid, *__cur_node);
+      __first = __mid;
+    }
+    uninitialized_copy(__first, __last, this->_M_finish._M_first);
+   }
+  _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, iterator(*__cur_node, __cur_node)));
+ }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+protected:                        // Internal push_* and pop_*
+
+  void _M_push_back_aux_v(const value_type&);
+  void _M_push_front_aux_v(const value_type&);
+# ifndef _STLP_NO_ANACHRONISMS
+  void _M_push_back_aux();
+  void _M_push_front_aux();
+# endif
+  void _M_pop_back_aux();
+  void _M_pop_front_aux();
+
+protected:                        // Internal insert functions
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+template <class _InputIterator>
+void 
+insert(iterator __pos,
+       _InputIterator __first,
+       _InputIterator __last,
+       const input_iterator_tag &)
+{
+  copy(__first, __last, inserter(*this, __pos));
+}
+
+template <class _ForwardIterator>
+void  insert(iterator __pos,
+	     _ForwardIterator __first,
+	     _ForwardIterator __last,
+	     const forward_iterator_tag &)
+ {
+  size_type __n = distance(__first, __last);
+  if (__pos._M_cur == this->_M_start._M_cur) {
+    iterator __new_start = _M_reserve_elements_at_front(__n);
+    _STLP_TRY {
+      uninitialized_copy(__first, __last, __new_start);
+      this->_M_start = __new_start;
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+  }
+  else if (__pos._M_cur == this->_M_finish._M_cur) {
+    iterator __new_finish = _M_reserve_elements_at_back(__n);
+    _STLP_TRY {
+      uninitialized_copy(__first, __last, this->_M_finish);
+      this->_M_finish = __new_finish;
+    }
+    _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+  }
+  else
+    _M_insert_aux(__pos, __first, __last, __n);
+}
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  iterator _M_insert_aux(iterator __pos, const value_type& __x);
+  iterator _M_insert_aux(iterator __pos);
+  iterator _M_insert_aux_prepare(iterator __pos);
+
+  void _M_insert_aux(iterator __pos, size_type __n, const value_type& __x);
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template <class _ForwardIterator>
+  void _M_insert_aux(iterator __pos,
+                     _ForwardIterator __first,
+                     _ForwardIterator __last,
+                     size_type __n) {
+    
+    const difference_type __elemsbefore = __pos - this->_M_start;
+    size_type __length = size();
+    if (__elemsbefore < difference_type(__length / 2)) {
+      iterator __new_start = _M_reserve_elements_at_front(__n);
+      iterator __old_start = this->_M_start;
+      __pos = this->_M_start + __elemsbefore;
+      _STLP_TRY {
+	if (__elemsbefore >= difference_type(__n)) {
+	  iterator __start_n = this->_M_start + difference_type(__n); 
+	  uninitialized_copy(this->_M_start, __start_n, __new_start);
+	  this->_M_start = __new_start;
+	  copy(__start_n, __pos, __old_start);
+	  copy(__first, __last, __pos - difference_type(__n));
+	}
+	else {
+	  _ForwardIterator __mid = __first;
+	  advance(__mid, difference_type(__n) - __elemsbefore);
+	  __uninitialized_copy_copy(this->_M_start, __pos, __first, __mid,
+				    __new_start, _IsPODType());
+	  this->_M_start = __new_start;
+	  copy(__mid, __last, __old_start);
+	}
+      }
+      _STLP_UNWIND(this->_M_destroy_nodes(__new_start._M_node, this->_M_start._M_node));
+    }
+    else {
+      iterator __new_finish = _M_reserve_elements_at_back(__n);
+      iterator __old_finish = this->_M_finish;
+      const difference_type __elemsafter = 
+	difference_type(__length) - __elemsbefore;
+      __pos = this->_M_finish - __elemsafter;
+      _STLP_TRY {
+      if (__elemsafter > difference_type(__n)) {
+        iterator __finish_n = this->_M_finish - difference_type(__n);
+        uninitialized_copy(__finish_n, this->_M_finish, this->_M_finish);
+        this->_M_finish = __new_finish;
+        copy_backward(__pos, __finish_n, __old_finish);
+        copy(__first, __last, __pos);
+      }
+      else {
+        _ForwardIterator __mid = __first;
+        advance(__mid, __elemsafter);
+        __uninitialized_copy_copy(__mid, __last, __pos, this->_M_finish, this->_M_finish, _IsPODType());
+        this->_M_finish = __new_finish;
+        copy(__first, __mid, __pos);
+      }
+      }
+      _STLP_UNWIND(this->_M_destroy_nodes(this->_M_finish._M_node + 1, __new_finish._M_node + 1));
+    }
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  
+  void _M_insert_aux(iterator __pos,
+                     const value_type* __first, const value_type* __last,
+                     size_type __n);
+
+  void _M_insert_aux(iterator __pos, 
+                     const_iterator __first, const_iterator __last,
+                     size_type __n);
+ 
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  iterator _M_reserve_elements_at_front(size_type __n) {
+    size_type __vacancies = this->_M_start._M_cur - this->_M_start._M_first;
+    if (__n > __vacancies) 
+      _M_new_elements_at_front(__n - __vacancies);
+    return this->_M_start - difference_type(__n);
+  }
+
+  iterator _M_reserve_elements_at_back(size_type __n) {
+    size_type __vacancies = (this->_M_finish._M_last - this->_M_finish._M_cur) - 1;
+    if (__n > __vacancies)
+      _M_new_elements_at_back(__n - __vacancies);
+    return this->_M_finish + difference_type(__n);
+  }
+
+  void _M_new_elements_at_front(size_type __new_elements);
+  void _M_new_elements_at_back(size_type __new_elements);
+
+protected:                      // Allocation of _M_map and nodes
+
+  // Makes sure the _M_map has space for new nodes.  Does not actually
+  //  add the nodes.  Can invalidate _M_map pointers.  (And consequently, 
+  //  deque iterators.)
+
+  void _M_reserve_map_at_back (size_type __nodes_to_add = 1) {
+    if (__nodes_to_add + 1 > this->_M_map_size._M_data - (this->_M_finish._M_node - this->_M_map._M_data))
+      _M_reallocate_map(__nodes_to_add, false);
+  }
+
+  void _M_reserve_map_at_front (size_type __nodes_to_add = 1) {
+    if (__nodes_to_add > size_type(this->_M_start._M_node - this->_M_map._M_data))
+      _M_reallocate_map(__nodes_to_add, true);
+  }
+
+  void _M_reallocate_map(size_type __nodes_to_add, bool __add_at_front);
+ 
+};
+
+# define _STLP_TEMPLATE_CONTAINER deque<_Tp, _Alloc>
+# define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE 
+
+// do a cleanup
+# undef deque
+# undef __deque__
+# define __deque__ __WORKAROUND_DBG_RENAME(deque)
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_deque.c>
+# endif
+
+#if defined (_STLP_DEBUG)
+# include <stl/debug/_deque.h>
+#endif
+
+# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+#  include <stl/wrappers/_deque.h>
+# endif
+  
+#endif /* _STLP_INTERNAL_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_epilog.h b/src/STLport/stl/_epilog.h
new file mode 100644
index 0000000..0393b92
--- /dev/null
+++ b/src/STLport/stl/_epilog.h
@@ -0,0 +1,44 @@
+/* NOTE : this header has no guards and is MEANT for multiple inclusion !
+ * If you are using "header protection" option with your compiler,
+ * please also find #pragma which disables it and put it here, to
+ * allow reentrancy of this header.
+ */
+
+/* If the platform provides any specific epilog actions,
+   like #pragmas, do include platform-specific prolog file */
+# if defined (_STLP_HAS_SPECIFIC_PROLOG_EPILOG)
+#  include <config/_epilog.h>
+# endif
+
+# ifndef _STLP_NO_POST_COMPATIBLE_SECTION
+#  include <stl/_config_compat_post.h>
+# endif
+
+/* provide a mechanism to redefine std:: namespace in a way that is transparent to the 
+ * user. _STLP_REDEFINE_STD is being used for wrapper files that include native headers
+ * to temporary undef the std macro. */
+#  if defined ( _STLP_USE_NAMESPACES ) && (defined ( _STLP_USE_OWN_NAMESPACE ) && !defined ( _STLP_REDEFINE_STD ) )
+#   undef _STLP_REDEFINE_STD
+#   define _STLP_REDEFINE_STD 1
+#  endif
+
+# if defined (_STLP_REDEFINE_STD)
+/*  We redefine "std" to "stlport", so that user code may use std:: transparently */
+#   undef  std
+#   define std STLPORT
+# else
+# if defined(__cplusplus)
+#  ifndef _STLP_CONFIG_H
+#   include <stl/_config.h>
+#  endif
+
+# endif /* __cplusplus */
+# endif
+
+
+
+
+
+
+
+
diff --git a/src/STLport/stl/_exception.h b/src/STLport/stl/_exception.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/STLport/stl/_fstream.c b/src/STLport/stl/_fstream.c
new file mode 100644
index 0000000..b01789b
--- /dev/null
+++ b/src/STLport/stl/_fstream.c
@@ -0,0 +1,749 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_FSTREAM_C
+#define _STLP_FSTREAM_C
+
+# ifndef _STLP_INTERNAL_FSTREAM_H
+#  include <stl/_fstream.h>
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// no wchar_t is supported for this mode
+# define __BF_int_type__ int
+# define __BF_pos_type__ streampos
+# define __BF_off_type__ streamoff
+# else
+# define __BF_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::int_type
+# define __BF_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::pos_type
+# define __BF_off_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::off_type
+# endif
+
+
+//----------------------------------------------------------------------
+// Public basic_filebuf<> member functions
+
+template <class _CharT, class _Traits>
+basic_filebuf<_CharT, _Traits>::basic_filebuf()
+     :  basic_streambuf<_CharT, _Traits>(), _M_base(),
+    _M_constant_width(false), _M_always_noconv(false),
+    _M_int_buf_dynamic(false),
+    _M_in_input_mode(false), _M_in_output_mode(false),
+    _M_in_error_mode(false), _M_in_putback_mode(false),
+    _M_int_buf(0), _M_int_buf_EOS(0),
+    _M_ext_buf(0), _M_ext_buf_EOS(0),
+    _M_ext_buf_converted(0), _M_ext_buf_end(0),
+    _M_state(_STLP_DEFAULT_CONSTRUCTED(_State_type)),
+    _M_end_state(_STLP_DEFAULT_CONSTRUCTED(_State_type)),
+    _M_mmap_base(0), _M_mmap_len(0),
+    _M_saved_eback(0), _M_saved_gptr(0), _M_saved_egptr(0),
+    _M_codecvt(0),
+    _M_width(1), _M_max_width(1)
+{
+  this->_M_setup_codecvt(locale());
+}
+
+template <class _CharT, class _Traits>
+basic_filebuf<_CharT, _Traits>::~basic_filebuf() {
+  this->close();
+  _M_deallocate_buffers();
+}
+
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_filebuf<_CharT, _Traits>::int_type 
+basic_filebuf<_CharT, _Traits>::underflow() 
+{
+  return _Underflow<_CharT, _Traits>::_M_doit(this);
+}
+
+template <class _CharT, class _Traits>
+basic_filebuf<_CharT, _Traits>* 
+basic_filebuf<_CharT, _Traits>::close()
+{
+  bool __ok = this->is_open();
+
+  if (_M_in_output_mode) {
+    __ok = __ok && !_Traits::eq_int_type(this->overflow(traits_type::eof()),
+                                         traits_type::eof());
+    __ok == __ok && this->_M_unshift();
+  }
+  else if (_M_in_input_mode)
+      this->_M_exit_input_mode();
+
+  // Note order of arguments.  We close the file even if __ok is false.
+  __ok = _M_base._M_close() && __ok;
+
+  // Restore the initial state, except that we don't deallocate the buffer
+  // or mess with the cached codecvt information.
+  _M_state = _M_end_state = _State_type();
+  _M_ext_buf_converted = _M_ext_buf_end = 0;
+
+  _M_mmap_base = 0;
+  _M_mmap_len = 0;
+
+  this->setg(0, 0, 0);
+  this->setp(0, 0);
+
+  _M_saved_eback = _M_saved_gptr = _M_saved_egptr = 0;
+
+  _M_in_input_mode = _M_in_output_mode = _M_in_error_mode = _M_in_putback_mode
+    = false;
+
+  return __ok ? this : 0;
+}
+
+// This member function is called whenever we exit input mode.
+// It unmaps the memory-mapped file, if any, and sets
+// _M_in_input_mode to false.  
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::_M_exit_input_mode()
+{
+   if (_M_mmap_base != 0)
+     _M_base._M_unmap(_M_mmap_base, _M_mmap_len); 
+   _M_in_input_mode = false;
+   _M_mmap_base = 0;
+}
+
+
+//----------------------------------------------------------------------
+// basic_filebuf<> overridden protected virtual member functions
+
+template <class _CharT, class _Traits>
+streamsize basic_filebuf<_CharT, _Traits>::showmanyc()
+{
+  // Is there any possibility that reads can succeed?
+  if (!this->is_open() || _M_in_output_mode || _M_in_error_mode)
+    return -1;
+
+  else if (_M_in_putback_mode)
+    return this->egptr() - this->gptr();
+
+  else if (_M_constant_width) {
+    streamoff __pos  = _M_base._M_seek(0, ios_base::cur);
+    streamoff __size = _M_base._M_file_size();
+    return __pos >= 0 && __size > __pos ? __size - __pos : 0;
+  }
+
+  else 
+    return 0;
+}
+
+
+// Make a putback position available, if necessary, by switching to a 
+// special internal buffer used only for putback.  The buffer is
+// [_M_pback_buf, _M_pback_buf + _S_pback_buf_size), but the base
+// class only sees a piece of it at a time.  (We want to make sure
+// that we don't try to read a character that hasn't been initialized.)
+// The end of the putback buffer is always _M_pback_buf + _S_pback_buf_size,
+// but the beginning is usually not _M_pback_buf.
+template <class _CharT, class _Traits>
+__BF_int_type__ 
+basic_filebuf<_CharT, _Traits>::pbackfail(int_type __c)
+{
+  const int_type __eof = traits_type::eof();
+
+  // If we aren't already in input mode, pushback is impossible.
+  if (!_M_in_input_mode)
+    return __eof;
+
+  // We can use the ordinary get buffer if there's enough space, and
+  // if it's a buffer that we're allowed to write to.
+  if (this->gptr() != this->eback() &&
+      (traits_type::eq_int_type(__c, __eof) ||
+       traits_type::eq(traits_type::to_char_type(__c), this->gptr()[-1]) ||
+       !_M_mmap_base)) {
+    this->gbump(-1);
+    if (traits_type::eq_int_type(__c, __eof) ||
+        traits_type::eq(traits_type::to_char_type(__c), *this->gptr()))
+      return traits_type::to_int_type(*this->gptr());
+  }
+  else if (!traits_type::eq_int_type(__c, __eof)) {
+    // Are we in the putback buffer already?
+    _CharT* __pback_end = _M_pback_buf + __STATIC_CAST(int,_S_pback_buf_size);
+    if (_M_in_putback_mode) {
+      // Do we have more room in the putback buffer?
+      if (this->eback() != _M_pback_buf) 
+        this->setg(this->egptr() - 1, this->egptr() - 1, __pback_end);
+      else
+        return __eof;           // No more room in the buffer, so fail.
+    }
+    else {                      // We're not yet in the putback buffer.
+      _M_saved_eback = this->eback();
+      _M_saved_gptr  = this->gptr();
+      _M_saved_egptr = this->egptr();
+      this->setg(__pback_end - 1, __pback_end - 1, __pback_end);
+      _M_in_putback_mode = true;
+    }
+  }
+  else
+    return __eof;
+
+  // We have made a putback position available.  Assign to it, and return.
+  *this->gptr() = traits_type::to_char_type(__c);
+  return __c;
+}
+
+// This member function flushes the put area, and also outputs the
+// character __c (unless __c is eof).  Invariant: we always leave room
+// in the internal buffer for one character more than the base class knows
+// about.  We see the internal buffer as [_M_int_buf, _M_int_buf_EOS), but
+// the base class only sees [_M_int_buf, _M_int_buf_EOS - 1).
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::overflow(int_type __c)
+{
+  // Switch to output mode, if necessary.
+  if (!_M_in_output_mode)
+    if (!_M_switch_to_output_mode())
+      return traits_type::eof();
+
+  _CharT* __ibegin = this->_M_int_buf;
+  _CharT* __iend   = this->pptr();
+  this->setp(_M_int_buf, _M_int_buf_EOS - 1);
+
+  // Put __c at the end of the internal buffer.
+  if (!traits_type::eq_int_type(__c, traits_type::eof()))
+    *__iend++ = __c;
+
+  // For variable-width encodings, output may take more than one pass.
+  while (__ibegin != __iend) {
+    const _CharT* __inext = __ibegin;
+    char* __enext         = _M_ext_buf;
+    typename _Codecvt::result __status
+      = _M_codecvt->out(_M_state, __ibegin, __iend, __inext,
+                                  _M_ext_buf, _M_ext_buf_EOS, __enext);
+    if (__status == _Codecvt::noconv)
+      return _Noconv_output<_Traits>::_M_doit(this, __ibegin, __iend)
+        ? traits_type::not_eof(__c)
+        : _M_output_error();
+
+    // For a constant-width encoding we know that the external buffer
+    // is large enough, so failure to consume the entire internal buffer
+    // or to produce the correct number of external characters, is an error.
+    // For a variable-width encoding, however, we require only that we 
+    // consume at least one internal character
+    else if (__status != _Codecvt::error && 
+             ((__inext == __iend && (__enext - _M_ext_buf == 
+                                     _M_width * (__iend - __ibegin))) ||
+              (!_M_constant_width && __inext != __ibegin))) {
+        // We successfully converted part or all of the internal buffer.
+      ptrdiff_t __n = __enext - _M_ext_buf;
+      if (_M_write(_M_ext_buf, __n))
+        __ibegin += __inext - __ibegin;
+      else
+        return _M_output_error();
+    }
+    else
+      return _M_output_error();
+  }
+
+  return traits_type::not_eof(__c);
+}
+
+// This member function must be called before any I/O has been
+// performed on the stream, otherwise it has no effect.
+//
+// __buf == 0 && __n == 0 means to make ths stream unbuffered.
+// __buf != 0 && __n > 0 means to use __buf as the stream's internal
+// buffer, rather than the buffer that would otherwise be allocated
+// automatically.  __buf must be a pointer to an array of _CharT whose
+// size is at least __n.
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>*
+basic_filebuf<_CharT, _Traits>::setbuf(_CharT* __buf, streamsize __n)
+{
+  if (!_M_in_input_mode &&! _M_in_output_mode && !_M_in_error_mode &&
+      _M_int_buf == 0) {
+    if (__buf == 0 && __n == 0)
+      _M_allocate_buffers(0, 1);
+    else if (__buf != 0 && __n > 0)
+      _M_allocate_buffers(__buf, __n);
+  }
+  return this;
+}
+
+template <class _CharT, class _Traits>
+__BF_pos_type__
+basic_filebuf<_CharT, _Traits>::seekoff(off_type __off,
+                                        ios_base::seekdir __whence,
+                                        ios_base::openmode /* dummy */)
+{
+  if (this->is_open() &&
+      (__off == 0 || (_M_constant_width && this->_M_base._M_in_binary_mode()))) {
+
+    if (!_M_seek_init(__off != 0 || __whence != ios_base::cur))
+      return pos_type(-1);
+
+    // Seek to beginning or end, regardless of whether we're in input mode.
+    if (__whence == ios_base::beg || __whence == ios_base::end)
+      return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence),
+                            _State_type());
+
+    // Seek relative to current position.  Complicated if we're in input mode.
+    else if (__whence == ios_base::cur) {
+
+      if (!_M_in_input_mode)
+        return _M_seek_return(_M_base._M_seek(_M_width * __off, __whence),
+                              _State_type());
+      else if (_M_mmap_base != 0) {
+        // __off is relative to gptr().  We need to do a bit of arithmetic
+        // to get an offset relative to the external file pointer.
+        streamoff __adjust = _M_mmap_len - (this->gptr() - (_CharT*) _M_mmap_base);
+
+        // if __off == 0, we do not need to exit input mode and to shift file pointer
+        if (__off == 0) {
+          return pos_type(_M_base._M_seek(0, ios_base::cur) - __adjust);
+        }
+        else
+          return _M_seek_return(_M_base._M_seek(__off - __adjust, ios_base::cur), _State_type());
+      }
+      else if (_M_constant_width) { // Get or set the position.  
+
+        streamoff __iadj = _M_width * (this->gptr() - this->eback());
+        
+        // Compensate for offset relative to gptr versus offset relative
+        // to external pointer.  For a text-oriented stream, where the 
+        // compensation is more than just pointer arithmetic, we may get
+        // but not set the current position.
+        
+        if (__iadj <= _M_ext_buf_end - _M_ext_buf) {
+          
+          streamoff __eadj =  _M_base._M_get_offset(_M_ext_buf + __iadj, _M_ext_buf_end);
+
+          if (__off == 0) {
+            return pos_type(_M_base._M_seek(0, ios_base::cur) - __eadj);
+          }  else {
+            return _M_seek_return(_M_base._M_seek(__off - __eadj, ios_base::cur), _State_type());
+          }
+        }
+        else
+          return pos_type(-1);
+      }
+      else {                    // Get the position.  Encoding is var width.
+        // Get position in internal buffer.
+        ptrdiff_t __ipos = this->gptr() - this->eback();
+        
+        // Get corresponding position in external buffer.
+        _State_type __state = _M_state;
+        int __epos = _M_codecvt->length(__state, _M_ext_buf, _M_ext_buf_end,
+                                        __ipos);
+
+        // Sanity check (expensive): make sure __epos is the right answer.
+        _State_type __tmp_state = _M_state;
+        _Filebuf_Tmp_Buf<_CharT> __buf(__ipos);
+        _CharT* __ibegin = __buf._M_ptr;
+        _CharT* __inext  = __ibegin;
+
+        const char* __dummy;
+        typename _Codecvt::result __status
+          = _M_codecvt->in(__tmp_state,
+                           _M_ext_buf, _M_ext_buf + __epos, __dummy,
+                           __ibegin, __ibegin + __ipos, __inext);
+        if (__status != _Codecvt::error &&
+            (__status == _Codecvt::noconv ||
+             (__inext == __ibegin + __ipos &&
+              equal(this->gptr(), this->eback(), __ibegin,
+                    _Eq_traits<traits_type>())))) {
+          // Get the current position (at the end of the external buffer),
+          // then adjust it.  Again, it might be a text-oriented stream.
+          streamoff __cur = _M_base._M_seek(0, ios_base::cur);
+          streamoff __adj =
+            _M_base._M_get_offset(_M_ext_buf, _M_ext_buf + __epos) -
+            _M_base._M_get_offset(_M_ext_buf, _M_ext_buf_end);
+          if (__cur != -1 && __cur + __adj >= 0)
+            return _M_seek_return(__cur + __adj, __state);
+          else
+            return pos_type(-1);
+        }
+        else                    // We failed the sanity check.
+          return pos_type(-1);
+      }
+    }
+    else                        // Unrecognized value for __whence.
+      return pos_type(-1);
+  }
+  else
+    return pos_type(-1);
+}
+
+
+template <class _CharT, class _Traits>
+__BF_pos_type__
+basic_filebuf<_CharT, _Traits>::seekpos(pos_type __pos,
+                                        ios_base::openmode /* dummy */)
+{
+  if (this->is_open()) {
+    if (!_M_seek_init(true))
+      return pos_type(-1);
+
+    streamoff __off = off_type(__pos);
+    if (__off != -1 && _M_base._M_seek(__off, ios_base::beg) != -1) {
+      _M_state = __pos.state();
+      return _M_seek_return(__off, __pos.state());
+    }
+    else
+      return pos_type(-1);
+  }
+  else
+    return pos_type(-1);
+}
+
+
+template <class _CharT, class _Traits>
+int basic_filebuf<_CharT, _Traits>::sync()
+{
+  if (_M_in_output_mode)
+    return traits_type::eq_int_type(this->overflow(traits_type::eof()),
+                                    traits_type::eof())
+      ? -1
+      : 0;
+  else
+    return 0;
+}
+
+
+// Change the filebuf's locale.  This member function has no effect
+// unless it is called before any I/O is performed on the stream.
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::imbue(const locale& __loc)
+{
+  if (!_M_in_input_mode &&! _M_in_output_mode && !_M_in_error_mode) {
+    this->_M_setup_codecvt(__loc);
+  }
+}
+
+//----------------------------------------------------------------------
+// basic_filebuf<> helper functions.
+
+//----------------------------------------
+// Helper functions for switching between modes.
+
+// This member function is called if we're performing the first I/O
+// operation on a filebuf, or if we're performing an input operation 
+// immediately after a seek.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_switch_to_input_mode()
+{
+
+  if (this->is_open() && (((int)_M_base.__o_mode() & (int)ios_base::in) !=0)
+      && (_M_in_output_mode == 0) && (_M_in_error_mode == 0)) {
+    if (!_M_int_buf && !_M_allocate_buffers())
+      return false;
+
+    _M_ext_buf_converted = _M_ext_buf;
+    _M_ext_buf_end       = _M_ext_buf;
+
+    _M_end_state    = _M_state;
+
+    _M_in_input_mode = true;
+    return true;
+  }
+  else
+
+    return false;
+}
+
+
+// This member function is called if we're performing the first I/O
+// operation on a filebuf, or if we're performing an output operation 
+// immediately after a seek.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_switch_to_output_mode()
+{
+  if (this->is_open() && (_M_base.__o_mode() & (int)ios_base::out) &&
+      _M_in_input_mode == 0 && _M_in_error_mode == 0) {
+
+    if (!_M_int_buf && !_M_allocate_buffers())
+      return false;
+
+    // In append mode, every write does an implicit seek to the end
+    // of the file.  Whenever leaving output mode, the end of file
+    // get put in the initial shift state.
+    if (_M_base.__o_mode() & ios_base::app)
+      _M_state = _State_type();
+
+    this->setp(_M_int_buf, _M_int_buf_EOS - 1);
+    _M_in_output_mode = true;
+
+    return true;
+  }
+  else
+    return false;
+}
+
+
+//----------------------------------------
+// Helper functions for input
+
+// This member function is called if there is an error during input.
+// It puts the filebuf in error mode, clear the get area buffer, and
+// returns eof.
+// returns eof.  Error mode is sticky; it is cleared only by close or
+// seek.
+
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::_M_input_error()
+{
+   this->_M_exit_input_mode();   
+  _M_in_output_mode = false;
+  _M_in_error_mode = true;
+  this->setg(0, 0, 0);
+  return traits_type::eof();
+}
+
+template <class _CharT, class _Traits>
+__BF_int_type__ 
+basic_filebuf<_CharT, _Traits>::_M_underflow_aux() 
+{
+  // We have the state and file position from the end of the internal
+  // buffer.  This round, they become the beginning of the internal buffer.
+  _M_state    = _M_end_state;
+
+  // Fill the external buffer.  Start with any leftover characters that
+  // didn't get converted last time.
+  if (_M_ext_buf_end > _M_ext_buf_converted)
+
+    _M_ext_buf_end = copy(_M_ext_buf_converted, _M_ext_buf_end, _M_ext_buf);
+    // boris : copy_backward did not work
+    //_M_ext_buf_end = copy_backward(_M_ext_buf_converted, _M_ext_buf_end, 
+    //_M_ext_buf+ (_M_ext_buf_end - _M_ext_buf_converted));
+  else
+    _M_ext_buf_end = _M_ext_buf;
+
+  // Now fill the external buffer with characters from the file.  This is
+  // a loop because occasonally we don't get enough external characters
+  // to make progress.
+  while (true) {
+    ptrdiff_t __n = _M_base._M_read(_M_ext_buf_end, _M_ext_buf_EOS - _M_ext_buf_end);
+ 
+    // Don't enter error mode for a failed read.  Error mode is sticky,
+    // and we might succeed if we try again.
+    if (__n <= 0)
+      return traits_type::eof();
+
+    // Convert the external buffer to internal characters.  
+    _M_ext_buf_end += __n;
+    const char*   __enext;
+    _CharT* __inext;
+
+    typename _Codecvt::result __status
+      = _M_codecvt->in(_M_end_state,
+                       _M_ext_buf, _M_ext_buf_end, __enext,
+                       _M_int_buf, _M_int_buf_EOS, __inext);
+
+    // Error conditions: (1) Return value of error.  (2) Producing internal
+    // characters without consuming external characters.  (3) In fixed-width
+    // encodings, producing an internal sequence whose length is inconsistent
+    // with that of the internal sequence.  (4) Failure to produce any 
+    // characters if we have enough characters in the external buffer, where
+    // "enough" means the largest possible width of a single character.
+    if (__status == _Codecvt::noconv)
+      return _Noconv_input<_Traits>::_M_doit(this);
+
+    else if (__status == _Codecvt::error ||
+             (__inext != _M_int_buf && __enext == _M_ext_buf) ||
+             (_M_constant_width &&
+              //         __inext - _M_int_buf != _M_width * (__enext - _M_ext_buf)) ||
+              (__inext - _M_int_buf) *  _M_width != (__enext - _M_ext_buf)) ||
+             (__inext == _M_int_buf && __enext - _M_ext_buf >= _M_max_width))
+      return _M_input_error();
+    
+    else if (__inext != _M_int_buf) {
+      _M_ext_buf_converted = _M_ext_buf + (__enext - _M_ext_buf);
+      this->setg(_M_int_buf, _M_int_buf, __inext);
+      return traits_type::to_int_type(*_M_int_buf);
+    }
+    // We need to go around the loop again to get more external characters.
+  } 
+}
+
+//----------------------------------------
+// Helper functions for output
+
+// This member function is called if there is an error during output.
+// It puts the filebuf in error mode, clear the put area buffer, and
+// returns eof.  Error mode is sticky; it is cleared only by close or
+// seek.
+template <class _CharT, class _Traits>
+__BF_int_type__
+basic_filebuf<_CharT, _Traits>::_M_output_error()
+{
+  _M_in_output_mode = false;
+  _M_in_input_mode = false;
+  _M_in_error_mode = true;
+  this->setp(0, 0);
+  return traits_type::eof();
+}
+
+
+// Write whatever sequence of characters is necessary to get back to
+// the initial shift state.  This function overwrites the external
+// buffer, changes the external file position, and changes the state.
+// Precondition: the internal buffer is empty.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_unshift()
+{
+  if (_M_in_output_mode && !_M_constant_width) {
+    typename _Codecvt::result __status;
+    do {
+      char* __enext = _M_ext_buf;
+      __status = _M_codecvt->unshift(_M_state,
+                                     _M_ext_buf, _M_ext_buf_EOS, __enext);
+      if (__status == _Codecvt::noconv ||
+          (__enext == _M_ext_buf && __status == _Codecvt::ok))
+        return true;
+      else if (__status == _Codecvt::error)
+        return false;
+      else if (!_M_write(_M_ext_buf, __enext - _M_ext_buf))
+        return false;
+    } while(__status == _Codecvt::partial);
+  }
+
+  return true;
+}
+
+
+//----------------------------------------
+// Helper functions for buffer allocation and deallocation
+
+// This member function is called when we're initializing a filebuf's
+// internal and external buffers.  The argument is the size of the
+// internal buffer; the external buffer is sized using the character
+// width in the current encoding.  Preconditions: the buffers are currently
+// null.  __n >= 1.  __buf is either a null pointer or a pointer to an 
+// array show size is at least __n.
+
+// We need __n >= 1 for two different reasons.  For input, the base
+// class always needs a buffer because of the sementics of underflow().
+// For output, we want to have an internal buffer that's larger by one
+// element than the buffer that the base class knows about.  (See 
+// basic_filebuf<>::overflow() for the reason.)
+template <class _CharT, class _Traits>
+bool 
+basic_filebuf<_CharT, _Traits>::_M_allocate_buffers(_CharT* __buf, streamsize __n)
+{
+
+  if (__buf == 0) {
+    _M_int_buf = __STATIC_CAST(_CharT*,malloc(__n * sizeof(_CharT)));
+    if (! _M_int_buf)
+      return false;
+    _M_int_buf_dynamic = true;
+  }
+  else {
+    _M_int_buf = __buf;
+    _M_int_buf_dynamic = false;
+  }
+  
+  size_t __ebufsiz = (max)(__n * (max)(_M_codecvt->encoding(), 1),
+                      streamsize(_M_codecvt->max_length()));
+
+  _M_ext_buf = __STATIC_CAST(char*,malloc(__ebufsiz));
+  if (!_M_ext_buf) {
+    _M_deallocate_buffers();
+    return false;
+  }
+
+  _M_int_buf_EOS = _M_int_buf + __n;
+  _M_ext_buf_EOS = _M_ext_buf + __ebufsiz;
+  return true;
+}
+
+// Abbreviation for the most common case.
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_allocate_buffers()
+{
+  // Choose a buffer that's at least 4096 characters long and that's a
+  // multiple of the page size.
+  streamsize __default_bufsiz =
+    ((_M_base.__page_size() + 4095UL) / _M_base.__page_size()) * _M_base.__page_size();
+  return _M_allocate_buffers(0, __default_bufsiz);
+}
+
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::_M_deallocate_buffers()
+{
+  if (_M_int_buf_dynamic)
+    free(_M_int_buf);
+  free(_M_ext_buf);
+  _M_int_buf     = 0;
+  _M_int_buf_EOS = 0;
+  _M_ext_buf     = 0;
+  _M_ext_buf_EOS = 0;
+}
+
+
+//----------------------------------------
+// Helper functiosn for seek and imbue
+
+template <class _CharT, class _Traits>
+bool basic_filebuf<_CharT, _Traits>::_M_seek_init(bool __do_unshift) {
+  // If we're in error mode, leave it.
+   _M_in_error_mode = false;
+   
+  // Flush the output buffer if we're in output mode, and (conditionally)
+  // emit an unshift sequence.
+  if (_M_in_output_mode) {
+    bool __ok = !traits_type::eq_int_type(this->overflow(traits_type::eof()),
+                                          traits_type::eof());
+    if (__do_unshift)
+      __ok = __ok && this->_M_unshift();
+    if (!__ok) {
+      _M_in_output_mode = false;
+      _M_in_error_mode = true;
+      this->setp(0, 0);
+      return false;
+    }
+  }
+
+  // Discard putback characters, if any.
+  if (_M_in_input_mode && _M_in_putback_mode)
+    _M_exit_putback_mode();
+
+  return true;
+}
+
+
+// Change the filebuf's locale.  This member function has no effect
+// unless it is called before any I/O is performed on the stream.
+template <class _CharT, class _Traits>
+void basic_filebuf<_CharT, _Traits>::_M_setup_codecvt(const locale& __loc)
+{
+  _M_codecvt = &use_facet<_Codecvt>(__loc) ;
+  int __encoding    = _M_codecvt->encoding();
+
+  _M_width          = (max)(__encoding, 1);
+  _M_max_width      = _M_codecvt->max_length();
+  _M_constant_width = __encoding > 0;
+  _M_always_noconv  = _M_codecvt->always_noconv();
+}
+
+_STLP_END_NAMESPACE
+
+# undef __BF_int_type__
+# undef __BF_pos_type__
+# undef __BF_off_type__
+
+# endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_FSTREAM_C */
+
diff --git a/src/STLport/stl/_fstream.h b/src/STLport/stl/_fstream.h
new file mode 100644
index 0000000..58f9c52
--- /dev/null
+++ b/src/STLport/stl/_fstream.h
@@ -0,0 +1,741 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// This header defines classes basic_filebuf, basic_ifstream,
+// basic_ofstream, and basic_fstream.  These classes represent
+// streambufs and streams whose sources or destinations are files.
+
+#ifndef _STLP_INTERNAL_FSTREAM_H
+#define _STLP_INTERNAL_FSTREAM_H
+
+#if defined(__sgi) && !defined(__GNUC__) && !defined(_STANDARD_C_PLUS_PLUS)
+#error This header file requires the -LANG:std option
+#endif
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+#include <stl/_istream.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CODECVT_H
+#include <stl/_codecvt.h>
+#endif
+
+#ifndef _STLP_STDIO_FILE_H
+#include <stl/_stdio_file.h>
+#endif
+
+#if !defined (_STLP_USE_UNIX_IO) && !defined(_STLP_USE_WIN32_IO) \
+    && ! defined (_STLP_USE_UNIX_EMULATION_IO) && !defined (_STLP_USE_STDIO_IO)
+
+# if defined (_STLP_UNIX)  || defined (__CYGWIN__) || defined (__amigaos__) || defined (__EMX__)
+// open/close/read/write
+#  define _STLP_USE_UNIX_IO
+# elif defined (_STLP_WIN32)  && ! defined (__CYGWIN__)
+// CreateFile/ReadFile/WriteFile
+#  define _STLP_USE_WIN32_IO
+# elif defined (_STLP_WIN16) || defined (_STLP_WIN32) || defined (_STLP_MAC)
+// _open/_read/_write
+#  define _STLP_USE_UNIX_EMULATION_IO
+# else
+// fopen/fread/fwrite
+#  define _STLP_USE_STDIO_IO
+# endif /* _STLP_UNIX */
+
+#endif /* mode selection */
+
+
+#if defined (_STLP_USE_WIN32_IO)
+typedef void* _STLP_fd;
+#elif defined (_STLP_USE_UNIX_EMULATION_IO) || defined (_STLP_USE_STDIO_IO) || defined (_STLP_USE_UNIX_IO)
+typedef int _STLP_fd;
+#else
+#error "Configure i/o !"
+#endif
+
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Class _Filebuf_base, a private base class to factor out the system-
+// dependent code from basic_filebuf<>.
+
+class _STLP_CLASS_DECLSPEC _Filebuf_base {
+public:                      // Opening and closing files.
+  _Filebuf_base();
+
+  bool _M_open(const char*, ios_base::openmode, long __protection);
+  bool _M_open(const char*, ios_base::openmode);
+  bool _M_open(int __id, ios_base::openmode = ios_base::__default_mode);
+  bool _M_close();
+
+public:                      // Low-level I/O, like Unix read/write
+  ptrdiff_t _M_read(char* __buf,  ptrdiff_t __n);
+  streamoff _M_seek(streamoff __offset, ios_base::seekdir __dir);
+  streamoff _M_file_size();
+  bool _M_write(char* __buf,  ptrdiff_t __n);
+
+public:                      // Memory-mapped I/O.
+  void* _M_mmap(streamoff __offset, streamoff __len);
+  void _M_unmap(void* __mmap_base, streamoff __len);
+
+public:
+  // Returns a value n such that, if pos is the file pointer at the
+  // beginning of the range [first, last), pos + n is the file pointer at
+  // the end.  On many operating systems n == __last - __first.
+  // In Unix, writing n characters always bumps the file position by n.
+  // In Windows text mode, however, it bumps the file position by n + m,
+  // where m is the number of newlines in the range.  That's because an
+  // internal \n corresponds to an external two-character sequence.
+  streamoff _M_get_offset(char* __first, char* __last) {
+#if defined (_STLP_UNIX) || defined (_STLP_MAC)
+    return __last - __first;
+#else // defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS)
+    return ( (_M_openmode & ios_base::binary) != 0 )
+      ? (__last - __first)
+      : count(__first, __last, '\n') + (__last - __first);
+#endif
+  }
+
+  // Returns true if we're in binary mode or if we're using an OS or file 
+  // system where there is no distinction between text and binary mode.
+  bool _M_in_binary_mode() const {
+# if defined (_STLP_UNIX) || defined (_STLP_MAC)  || defined(__BEOS__) || defined (__amigaos__) 
+    return true;
+# elif defined (_STLP_WIN32) || defined (_STLP_WIN16) || defined (_STLP_DOS) || defined (_STLP_VM) || defined (__EMX__)
+    return (_M_openmode & ios_base::binary) != 0;
+# else 
+#   error "Port!"
+# endif
+  }
+
+protected:                      // Static data members.
+  static size_t _M_page_size;
+
+protected:                      // Data members.
+  _STLP_fd _M_file_id;
+# ifdef _STLP_USE_STDIO_IO
+  // for stdio, the whole FILE* is being kept here
+  FILE* _M_file;
+# endif
+# ifdef _STLP_USE_WIN32_IO
+  void* _M_view_id; 
+# endif
+
+  ios_base::openmode _M_openmode     ;
+  unsigned char      _M_is_open      ;
+  unsigned char      _M_should_close ;
+  unsigned char      _M_regular_file ;
+
+public :
+  static size_t  _STLP_CALL __page_size() { return _M_page_size; } 
+  int  __o_mode() const { return (int)_M_openmode; } 
+  bool __is_open()      const { return (_M_is_open !=0 ); } 
+  bool __should_close() const { return (_M_should_close != 0); } 
+  bool __regular_file() const { return (_M_regular_file != 0); }
+  _STLP_fd __get_fd() const { return _M_file_id; }
+};
+
+
+
+
+//----------------------------------------------------------------------
+// Class basic_filebuf<>.
+
+// Forward declaration of two helper classes.
+template <class _Traits> class _Noconv_input;
+_STLP_TEMPLATE_NULL
+class _Noconv_input<char_traits<char> >;
+
+template <class _Traits> class _Noconv_output;
+_STLP_TEMPLATE_NULL
+class _Noconv_output< char_traits<char> >;
+
+// There is a specialized version of underflow, for basic_filebuf<char>,
+// in fstream.cxx.
+
+template <class _CharT, class _Traits>
+class _Underflow;
+
+ _STLP_TEMPLATE_NULL class _Underflow< char, char_traits<char> >;
+
+template <class _CharT, class _Traits>
+class basic_filebuf : public basic_streambuf<_CharT, _Traits>
+{
+public:                         // Types.
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+  typedef typename _Traits::state_type _State_type;
+  typedef basic_streambuf<_CharT, _Traits> _Base;
+  typedef basic_filebuf<_CharT, _Traits> _Self;
+
+public:                         // Constructors, destructor.
+  basic_filebuf();  
+  ~basic_filebuf();
+  
+public:                         // Opening and closing files.
+  bool is_open() const { return _M_base.__is_open(); }
+
+  _Self* open(const char* __s, ios_base::openmode __m) {
+    return _M_base._M_open(__s, __m) ? this : 0;
+  }
+
+# ifndef _STLP_NO_EXTENSIONS
+  // These two version of open() and file descriptor getter are extensions.
+  _Self* open(const char* __s, ios_base::openmode __m,
+		      long __protection) {
+    return _M_base._M_open(__s, __m, __protection) ? this : 0;
+  }
+  
+  _STLP_fd fd() const { return _M_base.__get_fd(); }
+
+  _Self* open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) {
+    return this->_M_open(__id, _Init_mode);
+  }
+# endif
+
+  _Self* _M_open(int __id, ios_base::openmode _Init_mode = ios_base::__default_mode) {
+    return _M_base._M_open(__id, _Init_mode) ? this : 0;
+  }
+
+  _Self* close();
+
+protected:                      // Virtual functions from basic_streambuf.
+  virtual streamsize showmanyc();
+  virtual int_type underflow();
+
+  virtual int_type pbackfail(int_type = traits_type::eof());
+  virtual int_type overflow(int_type = traits_type::eof());
+
+  virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize);
+  virtual pos_type seekoff(off_type, ios_base::seekdir,
+                           ios_base::openmode = ios_base::in | ios_base::out);
+  virtual pos_type seekpos(pos_type,
+                           ios_base::openmode = ios_base::in | ios_base::out);
+
+  virtual int sync();
+  virtual void imbue(const locale&);
+
+private:                        // Helper functions.
+
+  // Precondition: we are currently in putback input mode.  Effect:
+  // switches back to ordinary input mode.
+  void _M_exit_putback_mode() {
+    this->setg(_M_saved_eback, _M_saved_gptr, _M_saved_egptr);
+    _M_in_putback_mode = false;
+  }
+  bool _M_switch_to_input_mode();
+  void _M_exit_input_mode();
+  bool _M_switch_to_output_mode();
+
+  int_type _M_input_error();
+  int_type _M_underflow_aux();
+  //  friend class _Noconv_input<_Traits>;
+  //  friend class _Noconv_output<_Traits>;
+  friend class _Underflow<_CharT, _Traits>;
+
+  int_type _M_output_error();
+  bool _M_unshift();
+
+  bool _M_allocate_buffers(_CharT* __buf, streamsize __n);
+  bool _M_allocate_buffers();
+  void _M_deallocate_buffers();
+
+  pos_type _M_seek_return(off_type __off, _State_type __state) {
+    if (__off != -1) {
+      if (_M_in_input_mode)
+        _M_exit_input_mode();
+      _M_in_input_mode = false;
+      _M_in_output_mode = false;
+      _M_in_putback_mode = false;
+      _M_in_error_mode = false;
+      this->setg(0, 0, 0);
+      this->setp(0, 0);
+    }
+    
+    pos_type __result(__off);
+    __result.state(__state);
+    return __result;
+  }
+  
+  bool _M_seek_init(bool __do_unshift);
+
+  void _M_setup_codecvt(const locale&);
+
+private:                        // Data members used in all modes.
+
+  _Filebuf_base _M_base;
+
+private:                        // Locale-related information.
+
+  unsigned char _M_constant_width;
+  unsigned char _M_always_noconv;
+  
+  // private:                        // Mode flags.
+  unsigned char _M_int_buf_dynamic;  // True if internal buffer is heap allocated,
+  // false if it was supplied by the user.
+  unsigned char _M_in_input_mode;
+  unsigned char _M_in_output_mode;
+  unsigned char _M_in_error_mode;
+  unsigned char _M_in_putback_mode;
+  
+  // Internal buffer: characters seen by the filebuf's clients.
+  _CharT* _M_int_buf;
+  _CharT* _M_int_buf_EOS;
+  
+  // External buffer: characters corresponding to the external file.
+  char* _M_ext_buf;
+  char* _M_ext_buf_EOS;
+
+  // The range [_M_ext_buf, _M_ext_buf_converted) contains the external
+  // characters corresponding to the sequence in the internal buffer.  The
+  // range [_M_ext_buf_converted, _M_ext_buf_end) contains characters that
+  // have been read into the external buffer but have not been converted
+  // to an internal sequence.
+  char* _M_ext_buf_converted;
+  char* _M_ext_buf_end;
+
+  // State corresponding to beginning of internal buffer.
+  _State_type _M_state;
+
+private:                        // Data members used only in input mode.
+
+  // Similar to _M_state except that it corresponds to
+  // the end of the internal buffer instead of the beginning.
+  _State_type _M_end_state;
+
+  // This is a null pointer unless we are in mmap input mode.
+  void*     _M_mmap_base;
+  streamoff _M_mmap_len;
+
+private:                        // Data members used only in putback mode.
+  _CharT* _M_saved_eback;
+  _CharT* _M_saved_gptr;
+  _CharT* _M_saved_egptr;
+
+  typedef codecvt<_CharT, char, _State_type> _Codecvt;
+  const _Codecvt* _M_codecvt;
+
+  int _M_width;                 // Width of the encoding (if constant), else 1
+  int _M_max_width;             // Largest possible width of single character.
+
+
+  enum { _S_pback_buf_size = 8 };
+  _CharT _M_pback_buf[_S_pback_buf_size];
+
+  // for _Noconv_output
+public:
+  bool _M_write(char* __buf,  ptrdiff_t __n) {return _M_base._M_write(__buf, __n); }
+
+public:
+  int_type
+  _M_do_noconv_input() {
+    _M_ext_buf_converted = _M_ext_buf_end;
+    this->setg((char_type*)_M_ext_buf, (char_type*)_M_ext_buf, (char_type*)_M_ext_buf_end);
+    return traits_type::to_int_type(*_M_ext_buf);
+  }
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_filebuf<char, char_traits<char> >;
+#  if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_filebuf<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// public:
+// helper class.
+template <class _CharT>
+struct _Filebuf_Tmp_Buf
+{
+  _CharT* _M_ptr;
+  _Filebuf_Tmp_Buf(ptrdiff_t __n) : _M_ptr(0) { _M_ptr = new _CharT[__n]; }
+  ~_Filebuf_Tmp_Buf() { delete[] _M_ptr; }
+};
+
+
+//
+// This class had to be designed very carefully to work
+// with Visual C++.
+//
+template <class _Traits>
+class _Noconv_output {
+public:
+  typedef typename _Traits::char_type char_type;
+  static bool  _STLP_CALL _M_doit(basic_filebuf<char_type, _Traits >*, 
+                                  char_type*, char_type*)
+  {
+      return false; 
+  }
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC _Noconv_output< char_traits<char> > {
+public:
+  static bool  _STLP_CALL
+  _M_doit(basic_filebuf<char, char_traits<char> >* __buf, 
+          char* __first, char* __last)
+  {
+    ptrdiff_t __n = __last - __first;
+    if (__buf->_M_write(__first, __n)) {
+      return true;
+    }
+    else
+      return false; 
+  }
+};
+
+//----------------------------------------------------------------------
+// basic_filebuf<> helper functions.
+
+
+//----------------------------------------
+// Helper functions for switching between modes.
+
+//
+// This class had to be designed very carefully to work
+// with Visual C++.
+//
+template <class _Traits>
+class _Noconv_input {
+public:
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::char_type char_type;
+
+  static inline int_type _STLP_CALL
+  _M_doit(basic_filebuf<char_type, _Traits>*) 
+  {
+    return 0;
+  }
+};
+
+_STLP_TEMPLATE_NULL
+class _Noconv_input<char_traits<char> > {
+public:
+  static inline int _STLP_CALL
+  _M_doit(basic_filebuf<char, char_traits<char> >* __buf)  {
+    return __buf->_M_do_noconv_input();
+  }
+};
+
+// underflow() may be called for one of two reasons.  (1) We've
+// been going through the special putback buffer, and we need to move back
+// to the regular internal buffer.  (2) We've exhausted the internal buffer,
+// and we need to replentish it.  
+template <class _CharT, class _Traits>
+class _Underflow {
+public:
+  typedef typename _Traits::int_type int_type;
+  typedef _Traits                    traits_type;
+  
+  static int_type _STLP_CALL _M_doit(basic_filebuf<_CharT, _Traits>* __this);
+};
+
+
+// Specialization of underflow: if the character type is char, maybe
+// we can use mmap instead of read.
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC _Underflow< char, char_traits<char> > {
+public:
+  typedef char_traits<char>::int_type int_type;
+  typedef char_traits<char> traits_type;
+  static  int _STLP_CALL _M_doit(basic_filebuf<char, traits_type >* __this);
+};
+
+// There is a specialized version of underflow, for basic_filebuf<char>,
+// in fstream.cxx.
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE _Underflow<_CharT, _Traits>::int_type // _STLP_CALL
+ _Underflow<_CharT, _Traits>::_M_doit(basic_filebuf<_CharT, _Traits>* __this)
+{
+  if (!__this->_M_in_input_mode) {
+    if (!__this->_M_switch_to_input_mode())
+      return traits_type::eof();
+  }
+  
+  else if (__this->_M_in_putback_mode) {
+    __this->_M_exit_putback_mode();
+    if (__this->gptr() != __this->egptr()) {
+      int_type __c = traits_type::to_int_type(*__this->gptr());
+      return __c;
+    }
+  }
+  
+  return __this->_M_underflow_aux();
+}
+
+#if defined( _STLP_USE_TEMPLATE_EXPORT ) && ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _Underflow<wchar_t, char_traits<wchar_t> >;
+#endif
+
+
+//----------------------------------------------------------------------
+// Class basic_ifstream<>
+
+template <class _CharT, class _Traits>
+class basic_ifstream : public basic_istream<_CharT, _Traits>
+{
+public:                         // Types
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
+  typedef basic_istream<_CharT, _Traits>            _Base;
+  typedef basic_filebuf<_CharT, _Traits>            _Buf;
+
+public:                         // Constructors, destructor.
+
+  basic_ifstream() : 
+    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0), _M_buf() {
+      this->init(&_M_buf);
+  }
+
+  explicit basic_ifstream(const char* __s, ios_base::openmode __mod = ios_base::in) : 
+    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0),
+    _M_buf() {
+      this->init(&_M_buf);
+      if (!_M_buf.open(__s, __mod | ios_base::in))
+	this->setstate(ios_base::failbit);
+  }
+
+# ifndef _STLP_NO_EXTENSIONS
+  explicit basic_ifstream(int __id, ios_base::openmode __mod = ios_base::in) : 
+    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0), _M_buf() {
+    this->init(&_M_buf);
+    if (!_M_buf.open(__id, __mod | ios_base::in))
+      this->setstate(ios_base::failbit);
+  }
+  basic_ifstream(const char* __s, ios_base::openmode __m,
+		 long __protection) : 
+    basic_ios<_CharT, _Traits>(),  basic_istream<_CharT, _Traits>(0), _M_buf() {
+    this->init(&_M_buf);
+    if (!_M_buf.open(__s, __m | ios_base::in, __protection))
+      this->setstate(ios_base::failbit);  
+  }
+  
+# endif
+
+  ~basic_ifstream() {}
+
+public:                         // File and buffer operations.
+  basic_filebuf<_CharT, _Traits>* rdbuf() const
+    { return __CONST_CAST(_Buf*,&_M_buf); }
+
+  bool is_open() {
+    return this->rdbuf()->is_open();
+  }
+
+  void open(const char* __s, ios_base::openmode __mod = ios_base::in) {
+    if (!this->rdbuf()->open(__s, __mod | ios_base::in))
+      this->setstate(ios_base::failbit);
+  }
+
+  void close() {
+    if (!this->rdbuf()->close())
+      this->setstate(ios_base::failbit);
+  }
+
+
+private:
+  basic_filebuf<_CharT, _Traits> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_ofstream<>
+
+template <class _CharT, class _Traits>
+class basic_ofstream : public basic_ostream<_CharT, _Traits>
+{
+public:                         // Types
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
+  typedef basic_ostream<_CharT, _Traits>            _Base;
+  typedef basic_filebuf<_CharT, _Traits>            _Buf;
+
+public:                         // Constructors, destructor.
+  basic_ofstream() : 
+    basic_ios<_CharT, _Traits>(), 
+    basic_ostream<_CharT, _Traits>(0), _M_buf() {
+      this->init(&_M_buf);
+  }
+  explicit basic_ofstream(const char* __s, ios_base::openmode __mod = ios_base::out) 
+    : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0),
+      _M_buf() {
+	this->init(&_M_buf);
+	if (!_M_buf.open(__s, __mod | ios_base::out))
+	  this->setstate(ios_base::failbit);
+  }
+
+# ifndef _STLP_NO_EXTENSIONS
+  explicit basic_ofstream(int __id, ios_base::openmode __mod = ios_base::out) 
+    : basic_ios<_CharT, _Traits>(), basic_ostream<_CharT, _Traits>(0),
+    _M_buf() {
+ 	this->init(&_M_buf);
+ 	if (!_M_buf.open(__id, __mod | ios_base::out))
+ 	  this->setstate(ios_base::failbit);
+  }
+  basic_ofstream(const char* __s, ios_base::openmode __m, long __protection) : 
+    basic_ios<_CharT, _Traits>(),  basic_ostream<_CharT, _Traits>(0), _M_buf() {
+    this->init(&_M_buf);
+    if (!_M_buf.open(__s, __m | ios_base::out, __protection))
+      this->setstate(ios_base::failbit);  
+  }
+# endif
+  
+  ~basic_ofstream() {}
+
+public:                         // File and buffer operations.
+  basic_filebuf<_CharT, _Traits>* rdbuf() const
+    { return __CONST_CAST(_Buf*,&_M_buf); } 
+
+  bool is_open() {
+    return this->rdbuf()->is_open();
+  }
+
+  void open(const char* __s, ios_base::openmode __mod= ios_base::out) {
+    if (!this->rdbuf()->open(__s, __mod | ios_base::out))
+      this->setstate(ios_base::failbit);
+  }
+
+  void close() {
+    if (!this->rdbuf()->close())
+      this->setstate(ios_base::failbit);
+  }
+
+private:
+  basic_filebuf<_CharT, _Traits> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_fstream<>
+
+template <class _CharT, class _Traits>
+class basic_fstream : public basic_iostream<_CharT, _Traits>
+{
+public:                         // Types
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
+  typedef basic_iostream<_CharT, _Traits>           _Base;
+  typedef basic_filebuf<_CharT, _Traits>            _Buf;
+
+public:                         // Constructors, destructor.
+  
+  basic_fstream()   
+    : basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+      this->init(&_M_buf);
+  }
+
+  explicit basic_fstream(const char* __s,
+                         ios_base::openmode __mod = ios_base::in | ios_base::out) :
+    basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+      this->init(&_M_buf);
+      if (!_M_buf.open(__s, __mod))
+	this->setstate(ios_base::failbit);
+  }
+
+# ifndef _STLP_NO_EXTENSIONS
+  explicit basic_fstream(int __id,
+                         ios_base::openmode __mod = ios_base::in | ios_base::out) :
+    basic_ios<_CharT, _Traits>(), basic_iostream<_CharT, _Traits>(0), _M_buf() {
+    this->init(&_M_buf);
+    if (!_M_buf.open(__id, __mod))
+      this->setstate(ios_base::failbit);
+  }
+  basic_fstream(const char* __s, ios_base::openmode __m, long __protection) : 
+    basic_ios<_CharT, _Traits>(),  basic_iostream<_CharT, _Traits>(0), _M_buf() {
+    this->init(&_M_buf);
+    if (!_M_buf.open(__s, __m, __protection))
+      this->setstate(ios_base::failbit);  
+  }
+# endif    
+  ~basic_fstream() {}
+
+public:                         // File and buffer operations.
+
+  basic_filebuf<_CharT, _Traits>* rdbuf() const
+    { return __CONST_CAST(_Buf*,&_M_buf); } 
+
+  bool is_open() {
+    return this->rdbuf()->is_open();
+  }
+
+  void open(const char* __s, 
+	    ios_base::openmode __mod = 
+	    ios_base::in | ios_base::out) {
+    if (!this->rdbuf()->open(__s, __mod))
+      this->setstate(ios_base::failbit);
+  }
+
+  void close() {
+    if (!this->rdbuf()->close())
+      this->setstate(ios_base::failbit);
+  }
+
+private:
+  basic_filebuf<_CharT, _Traits> _M_buf;
+};
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_fstream.c>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ifstream<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ofstream<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_fstream<char, char_traits<char> >;
+#  if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ifstream<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ofstream<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_fstream<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_FSTREAM */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_function.h b/src/STLport/stl/_function.h
new file mode 100644
index 0000000..b97e2f2
--- /dev/null
+++ b/src/STLport/stl/_function.h
@@ -0,0 +1,371 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+#define _STLP_INTERNAL_FUNCTION_H
+
+#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+#include <stl/_function_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifndef _STLP_NO_EXTENSIONS
+// identity_element (not part of the C++ standard).
+template <class _Tp> inline _Tp identity_element(plus<_Tp>) {  return _Tp(0); }
+template <class _Tp> inline _Tp identity_element(multiplies<_Tp>) { return _Tp(1); }
+# endif
+
+#  if defined (_STLP_BASE_TYPEDEF_BUG)
+// this workaround is needed for SunPro 4.0.1
+// suggested by "Martin Abernethy" <gma at paston.co.uk>:
+
+// We have to introduce the XXary_predicate_aux structures in order to
+// access the argument and return types of predicate functions supplied
+// as type parameters. SUN C++ 4.0.1 compiler gives errors for template type parameters
+// of the form 'name1::name2', where name1 is itself a type parameter.
+template <class _Pair>
+struct __pair_aux : private _Pair
+{
+	typedef typename _Pair::first_type first_type;
+	typedef typename _Pair::second_type second_type;
+};
+
+template <class _Operation>
+struct __unary_fun_aux : private _Operation
+{
+	typedef typename _Operation::argument_type argument_type;
+	typedef typename _Operation::result_type result_type;
+};
+
+template <class _Operation>
+struct __binary_fun_aux  : private _Operation
+{
+	typedef typename _Operation::first_argument_type first_argument_type;
+	typedef typename _Operation::second_argument_type second_argument_type;
+	typedef typename _Operation::result_type result_type;
+};
+
+#  define __UNARY_ARG(__Operation,__type)  __unary_fun_aux<__Operation>::__type
+#  define __BINARY_ARG(__Operation,__type)  __binary_fun_aux<__Operation>::__type
+#  define __PAIR_ARG(__Pair,__type)  __pair_aux<__Pair>::__type
+# else
+#  define __UNARY_ARG(__Operation,__type)  __Operation::__type
+#  define __BINARY_ARG(__Operation,__type) __Operation::__type
+#  define __PAIR_ARG(__Pair,__type) __Pair::__type
+# endif
+
+template <class _Predicate>
+class unary_negate : 
+    public unary_function<typename __UNARY_ARG(_Predicate,argument_type), bool> {
+protected:
+  _Predicate _M_pred;
+public:
+  explicit unary_negate(const _Predicate& __x) : _M_pred(__x) {}
+  bool operator()(const typename _Predicate::argument_type& __x) const {
+    return !_M_pred(__x);
+  }
+};
+
+template <class _Predicate>
+inline unary_negate<_Predicate> 
+not1(const _Predicate& __pred)
+{
+  return unary_negate<_Predicate>(__pred);
+}
+
+template <class _Predicate> 
+class binary_negate 
+    : public binary_function<typename __BINARY_ARG(_Predicate,first_argument_type),
+			     typename __BINARY_ARG(_Predicate,second_argument_type), 
+                             bool> {
+protected:
+  _Predicate _M_pred;
+public:
+  explicit binary_negate(const _Predicate& __x) : _M_pred(__x) {}
+  bool operator()(const typename _Predicate::first_argument_type& __x, 
+                  const typename _Predicate::second_argument_type& __y) const
+  {
+    return !_M_pred(__x, __y); 
+  }
+};
+
+template <class _Predicate>
+inline binary_negate<_Predicate> 
+not2(const _Predicate& __pred)
+{
+  return binary_negate<_Predicate>(__pred);
+}
+
+template <class _Operation> 
+class binder1st : 
+    public unary_function<typename __BINARY_ARG(_Operation,second_argument_type),
+                          typename __BINARY_ARG(_Operation,result_type) > {
+protected:
+  _Operation _M_op;
+  typename _Operation::first_argument_type _M_value;
+public:
+  binder1st(const _Operation& __x,
+            const typename _Operation::first_argument_type& __y)
+      : _M_op(__x), _M_value(__y) {}
+
+  typename _Operation::result_type
+  operator()(const typename _Operation::second_argument_type& __x) const {
+    return _M_op(_M_value, __x); 
+  }
+
+  typename _Operation::result_type
+  operator()(typename _Operation::second_argument_type& __x) const {
+    return _M_op(_M_value, __x); 
+  }
+};
+
+template <class _Operation, class _Tp>
+inline binder1st<_Operation> 
+bind1st(const _Operation& __fn, const _Tp& __x) 
+{
+  typedef typename _Operation::first_argument_type _Arg1_type;
+  return binder1st<_Operation>(__fn, _Arg1_type(__x));
+}
+
+template <class _Operation> 
+class binder2nd
+  : public unary_function<typename __BINARY_ARG(_Operation,first_argument_type),
+                          typename __BINARY_ARG(_Operation,result_type)> {
+protected:
+  _Operation _M_op;
+  typename _Operation::second_argument_type value;
+public:
+  binder2nd(const _Operation& __x,
+            const typename _Operation::second_argument_type& __y) 
+      : _M_op(__x), value(__y) {}
+
+  typename _Operation::result_type
+  operator()(const typename _Operation::first_argument_type& __x) const {
+    return _M_op(__x, value); 
+  }
+
+  typename _Operation::result_type
+  operator()(typename _Operation::first_argument_type& __x) const {
+    return _M_op(__x, value); 
+  }
+};
+
+template <class _Operation, class _Tp>
+inline binder2nd<_Operation> 
+bind2nd(const _Operation& __fn, const _Tp& __x) 
+{
+  typedef typename _Operation::second_argument_type _Arg2_type;
+  return binder2nd<_Operation>(__fn, _Arg2_type(__x));
+}
+
+# ifndef _STLP_NO_EXTENSIONS
+// unary_compose and binary_compose (extensions, not part of the standard).
+
+template <class _Operation1, class _Operation2>
+class unary_compose : 
+  public unary_function<typename __UNARY_ARG(_Operation2,argument_type),
+                        typename __UNARY_ARG(_Operation1,result_type)> {
+protected:
+  _Operation1 _M_fn1;
+  _Operation2 _M_fn2;
+public:
+  unary_compose(const _Operation1& __x, const _Operation2& __y) 
+    : _M_fn1(__x), _M_fn2(__y) {}
+
+  typename _Operation1::result_type
+  operator()(const typename _Operation2::argument_type& __x) const {
+    return _M_fn1(_M_fn2(__x));
+  }
+
+  typename _Operation1::result_type
+  operator()(typename _Operation2::argument_type& __x) const {
+    return _M_fn1(_M_fn2(__x));
+  }
+};
+
+template <class _Operation1, class _Operation2>
+inline unary_compose<_Operation1,_Operation2> 
+compose1(const _Operation1& __fn1, const _Operation2& __fn2)
+{
+  return unary_compose<_Operation1,_Operation2>(__fn1, __fn2);
+}
+
+template <class _Operation1, class _Operation2, class _Operation3>
+class binary_compose : 
+    public unary_function<typename __UNARY_ARG(_Operation2,argument_type),
+                          typename __BINARY_ARG(_Operation1,result_type)> {
+protected:
+  _Operation1 _M_fn1;
+  _Operation2 _M_fn2;
+  _Operation3 _M_fn3;
+public:
+  binary_compose(const _Operation1& __x, const _Operation2& __y, 
+                 const _Operation3& __z) 
+    : _M_fn1(__x), _M_fn2(__y), _M_fn3(__z) { }
+
+  typename _Operation1::result_type
+  operator()(const typename _Operation2::argument_type& __x) const {
+    return _M_fn1(_M_fn2(__x), _M_fn3(__x));
+  }
+
+  typename _Operation1::result_type
+  operator()(typename _Operation2::argument_type& __x) const {
+    return _M_fn1(_M_fn2(__x), _M_fn3(__x));
+  }
+};
+
+template <class _Operation1, class _Operation2, class _Operation3>
+inline binary_compose<_Operation1, _Operation2, _Operation3> 
+compose2(const _Operation1& __fn1, const _Operation2& __fn2, 
+         const _Operation3& __fn3)
+{
+  return binary_compose<_Operation1,_Operation2,_Operation3>
+    (__fn1, __fn2, __fn3);
+}
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// identity is an extension: it is not part of the standard.
+template <class _Tp> struct identity : public _Identity<_Tp> {};
+// select1st and select2nd are extensions: they are not part of the standard.
+template <class _Pair> struct select1st : public _Select1st<_Pair> {};
+template <class _Pair> struct select2nd : public _Select2nd<_Pair> {};
+
+template <class _Arg1, class _Arg2> 
+struct project1st : public _Project1st<_Arg1, _Arg2> {};
+
+template <class _Arg1, class _Arg2>
+struct project2nd : public _Project2nd<_Arg1, _Arg2> {};
+
+
+// constant_void_fun, constant_unary_fun, and constant_binary_fun are
+// extensions: they are not part of the standard.  (The same, of course,
+// is true of the helper functions constant0, constant1, and constant2.)
+
+template <class _Result>
+struct _Constant_void_fun {
+  typedef _Result result_type;
+  result_type _M_val;
+
+  _Constant_void_fun(const result_type& __v) : _M_val(__v) {}
+  const result_type& operator()() const { return _M_val; }
+};  
+
+
+template <class _Result>
+struct constant_void_fun : public _Constant_void_fun<_Result> {
+  constant_void_fun(const _Result& __v) : _Constant_void_fun<_Result>(__v) {}
+};  
+
+template <class _Result, __DFL_TMPL_PARAM( _Argument , _Result) >
+struct constant_unary_fun : public _Constant_unary_fun<_Result, _Argument>
+{
+  constant_unary_fun(const _Result& __v)
+    : _Constant_unary_fun<_Result, _Argument>(__v) {}
+};
+
+template <class _Result, __DFL_TMPL_PARAM( _Arg1 , _Result), __DFL_TMPL_PARAM( _Arg2 , _Arg1) >
+struct constant_binary_fun
+  : public _Constant_binary_fun<_Result, _Arg1, _Arg2>
+{
+  constant_binary_fun(const _Result& __v)
+    : _Constant_binary_fun<_Result, _Arg1, _Arg2>(__v) {}
+};
+
+template <class _Result>
+inline constant_void_fun<_Result> constant0(const _Result& __val)
+{
+  return constant_void_fun<_Result>(__val);
+}
+
+template <class _Result>
+inline constant_unary_fun<_Result,_Result> constant1(const _Result& __val)
+{
+  return constant_unary_fun<_Result,_Result>(__val);
+}
+
+template <class _Result>
+inline constant_binary_fun<_Result,_Result,_Result> 
+constant2(const _Result& __val)
+{
+  return constant_binary_fun<_Result,_Result,_Result>(__val);
+}
+
+// subtractive_rng is an extension: it is not part of the standard.
+// Note: this code assumes that int is 32 bits.
+class subtractive_rng : public unary_function<_STLP_UINT32_T, _STLP_UINT32_T> {
+private:
+  _STLP_UINT32_T _M_table[55];
+  _STLP_UINT32_T _M_index1;
+  _STLP_UINT32_T _M_index2;
+public:
+  _STLP_UINT32_T operator()(_STLP_UINT32_T __limit) {
+    _M_index1 = (_M_index1 + 1) % 55;
+    _M_index2 = (_M_index2 + 1) % 55;
+    _M_table[_M_index1] = _M_table[_M_index1] - _M_table[_M_index2];
+    return _M_table[_M_index1] % __limit;
+  }
+
+  void _M_initialize(_STLP_UINT32_T __seed)
+  {
+    _STLP_UINT32_T __k = 1;
+    _M_table[54] = __seed;
+    _STLP_UINT32_T __i;
+    for (__i = 0; __i < 54; __i++) {
+        _STLP_UINT32_T __ii = (21 * (__i + 1) % 55) - 1;
+        _M_table[__ii] = __k;
+        __k = __seed - __k;
+        __seed = _M_table[__ii];
+    }
+    for (int __loop = 0; __loop < 4; __loop++) {
+        for (__i = 0; __i < 55; __i++)
+            _M_table[__i] = _M_table[__i] - _M_table[(1 + __i + 30) % 55];
+    }
+    _M_index1 = 0;
+    _M_index2 = 31;
+  }
+
+  subtractive_rng(unsigned int __seed) { _M_initialize(__seed); }
+  subtractive_rng() { _M_initialize(161803398ul); }
+};
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+_STLP_END_NAMESPACE
+
+#include <stl/_function_adaptors.h>
+
+#endif /* _STLP_INTERNAL_FUNCTION_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_function_adaptors.h b/src/STLport/stl/_function_adaptors.h
new file mode 100644
index 0000000..4ea584b
--- /dev/null
+++ b/src/STLport/stl/_function_adaptors.h
@@ -0,0 +1,802 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * Copyright (c) 2000
+ * Pavel Kuznetsov
+ *
+ * Copyright (c) 2001
+ * Meridian'93
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+// This file has noo macro protection as it is meant to be included several times
+// from other header.
+// Adaptor function objects: pointers to member functions.
+
+// There are a total of 16 = 2^4 function objects in this family.
+//  (1) Member functions taking no arguments vs member functions taking
+//       one argument.
+//  (2) Call through pointer vs call through reference.
+//  (3) Member function with void return type vs member function with
+//      non-void return type.
+//  (4) Const vs non-const member function.
+
+// Note that choice (3) is nothing more than a workaround: according
+//  to the draft, compilers should handle void and non-void the same way.
+//  This feature is not yet widely implemented, though.  You can only use
+//  member functions returning void if your compiler supports partial
+//  specialization.
+
+// All of this complexity is in the function objects themselves.  You can
+//  ignore it by using the helper function mem_fun and mem_fun_ref,
+//  which create whichever type of adaptor is appropriate.
+
+_STLP_BEGIN_NAMESPACE
+
+//This implementation will only be used if needed, that is to say when there is the return void bug
+//and when there is no partial template specialization
+#if defined(_STLP_DONT_RETURN_VOID) && defined (_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) && defined(_STLP_MEMBER_TEMPLATE_CLASSES)
+
+template<class _Result, class _Tp>
+class _Mem_fun0_ptr : public unary_function<_Tp*, _Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) ();
+  explicit _Mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(_Tp* __p) const { return (__p->*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Mem_fun1_ptr : public binary_function<_Tp*,_Arg,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) (_Arg);
+  explicit _Mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp>
+class _Const_mem_fun0_ptr : public unary_function<const _Tp*,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) () const;
+  explicit _Const_mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(const _Tp* __p) const { return (__p->*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Const_mem_fun1_ptr : public binary_function<const _Tp*,_Arg,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) (_Arg) const;
+  explicit _Const_mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(const _Tp* __p, _Arg __x) const {
+    return (__p->*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp>
+class _Mem_fun0_ref : public unary_function<_Tp&,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) ();
+  explicit _Mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(_Tp& __p) const { return (__p.*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Mem_fun1_ref : public binary_function<_Tp&,_Arg,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) (_Arg);
+  explicit _Mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(_Tp& __p, _Arg __x) const { return (__p.*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp>
+class _Const_mem_fun0_ref : public unary_function<const _Tp&,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) () const;
+  explicit _Const_mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(const _Tp& __p) const { return (__p.*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result, class _Tp, class _Arg>
+class _Const_mem_fun1_ref : public binary_function<const _Tp&,_Arg,_Result> {
+protected:
+  typedef _Result (_Tp::*__fun_type) (_Arg) const;
+  explicit _Const_mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator ()(const _Tp& __p, _Arg __x) const { return (__p.*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result> 
+struct _Mem_fun_traits {
+  template<class _Tp> 
+  struct _Args0 {
+    typedef _Mem_fun0_ptr<_Result,_Tp>            _Ptr;
+    typedef _Const_mem_fun0_ptr<_Result,_Tp>      _Ptr_const;
+    typedef _Mem_fun0_ref<_Result,_Tp>            _Ref;
+    typedef _Const_mem_fun0_ref<_Result,_Tp>      _Ref_const;
+  };
+
+  template<class _Tp, class _Arg>
+  struct _Args1 {
+    typedef _Mem_fun1_ptr<_Result,_Tp,_Arg>       _Ptr;
+    typedef _Const_mem_fun1_ptr<_Result,_Tp,_Arg> _Ptr_const;
+    typedef _Mem_fun1_ref<_Result,_Tp,_Arg>       _Ref;
+    typedef _Const_mem_fun1_ref<_Result,_Tp,_Arg> _Ref_const;
+  };
+};
+
+template<class _Arg, class _Result>
+class _Ptr_fun1_base : public unary_function<_Arg, _Result> {
+protected:
+  typedef _Result (*__fun_type) (_Arg);
+  explicit _Ptr_fun1_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator()(_Arg __x) const { return _M_f(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+class _Ptr_fun2_base : public binary_function<_Arg1,_Arg2,_Result> {
+protected:
+  typedef _Result (*__fun_type) (_Arg1, _Arg2);
+  explicit _Ptr_fun2_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+  _Result operator()(_Arg1 __x, _Arg2 __y) const { return _M_f(__x, __y); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Result> 
+struct _Ptr_fun_traits {
+  template<class _Arg> struct _Args1 {
+    typedef _Ptr_fun1_base<_Arg,_Result> _Fun;
+  };
+
+  template<class _Arg1, class _Arg2> struct _Args2 {
+    typedef _Ptr_fun2_base<_Arg1,_Arg2,_Result> _Fun;
+  };
+};
+
+/*Specialization for void return type
+*/
+template<class _Tp>
+class _Void_mem_fun0_ptr : public unary_function<_Tp*,void> {
+protected:
+  typedef void (_Tp::*__fun_type) ();
+  explicit _Void_mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(_Tp* __p) const { (__p->*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_mem_fun1_ptr : public binary_function<_Tp*,_Arg,void> {
+protected:
+  typedef void (_Tp::*__fun_type) (_Arg);
+  explicit _Void_mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(_Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp>
+class _Void_const_mem_fun0_ptr : public unary_function<const _Tp*,void> {
+protected:
+  typedef void (_Tp::*__fun_type) () const;
+  explicit _Void_const_mem_fun0_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(const _Tp* __p) const { (__p->*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_const_mem_fun1_ptr : public binary_function<const _Tp*,_Arg,void> {
+protected:
+  typedef void (_Tp::*__fun_type) (_Arg) const;
+  explicit _Void_const_mem_fun1_ptr(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(const _Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp>
+class _Void_mem_fun0_ref : public unary_function<_Tp&,void> {
+protected:
+  typedef void (_Tp::*__fun_type) ();
+  explicit _Void_mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(_Tp& __p) const { (__p.*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_mem_fun1_ref : public binary_function<_Tp&,_Arg,void> {
+protected:
+  typedef void (_Tp::*__fun_type) (_Arg);
+  explicit _Void_mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(_Tp& __p, _Arg __x) const { (__p.*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp>
+class _Void_const_mem_fun0_ref : public unary_function<const _Tp&,void> {
+protected:
+  typedef void (_Tp::*__fun_type) () const;
+  explicit _Void_const_mem_fun0_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(const _Tp& __p) const { (__p.*_M_f)(); }
+
+private:
+  __fun_type _M_f;
+};
+
+template<class _Tp, class _Arg>
+class _Void_const_mem_fun1_ref : public binary_function<const _Tp&,_Arg,void> {
+protected:
+  typedef void (_Tp::*__fun_type) (_Arg) const;
+  explicit _Void_const_mem_fun1_ref(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator ()(const _Tp& __p, _Arg __x) const { (__p.*_M_f)(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Mem_fun_traits<void> {
+  template<class _Tp> struct _Args0 {
+    typedef _Void_mem_fun0_ptr<_Tp>             _Ptr;
+    typedef _Void_const_mem_fun0_ptr<_Tp>       _Ptr_const;
+    typedef _Void_mem_fun0_ref<_Tp>             _Ref;
+    typedef _Void_const_mem_fun0_ref<_Tp>       _Ref_const;
+  };
+
+  template<class _Tp, class _Arg> struct _Args1 {
+    typedef _Void_mem_fun1_ptr<_Tp,_Arg>        _Ptr;
+    typedef _Void_const_mem_fun1_ptr<_Tp,_Arg>  _Ptr_const;
+    typedef _Void_mem_fun1_ref<_Tp,_Arg>        _Ref;
+    typedef _Void_const_mem_fun1_ref<_Tp,_Arg>  _Ref_const;
+  };
+};
+
+template<class _Arg>
+class _Ptr_void_fun1_base : public unary_function<_Arg, void> {
+protected:
+  typedef void (*__fun_type) (_Arg);
+  explicit _Ptr_void_fun1_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator()(_Arg __x) const { _M_f(__x); }
+
+private:
+  __fun_type _M_f;
+};
+
+template <class _Arg1, class _Arg2>
+class _Ptr_void_fun2_base : public binary_function<_Arg1,_Arg2,void> {
+protected:
+  typedef void (*__fun_type) (_Arg1, _Arg2);
+  explicit _Ptr_void_fun2_base(__fun_type __f) : _M_f(__f) {}
+
+public:
+  void operator()(_Arg1 __x, _Arg2 __y) const { _M_f(__x, __y); }
+
+private:
+  __fun_type _M_f;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Ptr_fun_traits<void> {
+  template<class _Arg> struct _Args1 {
+    typedef _Ptr_void_fun1_base<_Arg> _Fun;
+  };
+  
+  template<class _Arg1, class _Arg2> struct _Args2 {
+    typedef _Ptr_void_fun2_base<_Arg1,_Arg2> _Fun;
+  };
+};
+
+// pavel: need extra level of inheritance here since MSVC++ does not
+// accept traits-based fake partial specialization for template
+// arguments other than first
+
+template<class _Result, class _Arg>
+class _Ptr_fun1 : 
+  public _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Arg>::_Fun {
+protected:
+  typedef typename _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Arg>::_Fun _Base;
+  explicit _Ptr_fun1(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+template<class _Result, class _Arg1, class _Arg2>
+class _Ptr_fun2 : 
+  public _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args2<_Arg1,_Arg2>::_Fun {
+protected:
+  typedef typename _Ptr_fun_traits<_Result>::_STLP_TEMPLATE _Args2<_Arg1,_Arg2>::_Fun _Base;
+  explicit _Ptr_fun2(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+
+#endif /*_STLP_DONT_RETURN_VOID && _STLP_NO_CLASS_PARTIAL_SPECIALIZATION && _STLP_MEMBER_TEMPLATE_CLASSES*/
+
+
+#if !defined(_STLP_DONT_RETURN_VOID) || !defined(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION) || !defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+
+template <class _Ret, class _Tp>
+class mem_fun_t : public unary_function<_Tp*,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(void);
+public:
+  explicit mem_fun_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(_Tp* __p) const { return (__p->*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp>
+class const_mem_fun_t : public unary_function<const _Tp*,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(void) const;
+public:
+  explicit const_mem_fun_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(const _Tp* __p) const { return (__p->*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+
+template <class _Ret, class _Tp>
+class mem_fun_ref_t : public unary_function<_Tp,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(void);
+public:
+  explicit mem_fun_ref_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(_Tp& __r) const { return (__r.*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp>
+class const_mem_fun_ref_t : public unary_function<_Tp,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(void) const;
+public:
+  explicit const_mem_fun_ref_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(const _Tp& __r) const { return (__r.*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class mem_fun1_t : public binary_function<_Tp*,_Arg,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(_Arg);
+public:
+  explicit mem_fun1_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(_Tp* __p, _Arg __x) const { return (__p->*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class const_mem_fun1_t : public binary_function<const _Tp*,_Arg,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(_Arg) const;
+public:
+  explicit const_mem_fun1_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(const _Tp* __p, _Arg __x) const
+    { return (__p->*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(_Arg);
+public:
+  explicit mem_fun1_ref_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(_Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Ret, class _Tp, class _Arg>
+class const_mem_fun1_ref_t : public binary_function<_Tp,_Arg,_Ret> {
+  typedef _Ret (_Tp::*__fun_type)(_Arg) const;
+public:
+  explicit const_mem_fun1_ref_t(__fun_type __pf) : _M_f(__pf) {}
+  _Ret operator()(const _Tp& __r, _Arg __x) const { return (__r.*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Arg, class _Result>
+class pointer_to_unary_function : public unary_function<_Arg, _Result> {
+protected:
+  _Result (*_M_ptr)(_Arg);
+public:
+  pointer_to_unary_function() {}
+  explicit pointer_to_unary_function(_Result (*__x)(_Arg)) : _M_ptr(__x) {}
+  _Result operator()(_Arg __x) const { return _M_ptr(__x); }
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+class pointer_to_binary_function : 
+  public binary_function<_Arg1,_Arg2,_Result> {
+protected:
+    _Result (*_M_ptr)(_Arg1, _Arg2);
+public:
+    pointer_to_binary_function() {}
+    explicit pointer_to_binary_function(_Result (*__x)(_Arg1, _Arg2)) 
+      : _M_ptr(__x) {}
+    _Result operator()(_Arg1 __x, _Arg2 __y) const {
+      return _M_ptr(__x, __y);
+    }
+};
+
+
+#if defined(_STLP_DONT_RETURN_VOID) && !defined(_STLP_NO_CLASS_PARTIAL_SPECIALIZATION)
+//Partial specialization for the void type
+template <class _Tp>
+class mem_fun_t<void, _Tp> : public unary_function<_Tp*,void> {
+  typedef void (_Tp::*__fun_type)(void);
+public:
+  explicit mem_fun_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(_Tp* __p) const { (__p->*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp>
+class const_mem_fun_t<void, _Tp> : public unary_function<const _Tp*,void> {
+  typedef void (_Tp::*__fun_type)(void) const;
+public:
+  explicit const_mem_fun_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(const _Tp* __p) const { (__p->*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp>
+class mem_fun_ref_t<void, _Tp> : public unary_function<_Tp,void> {
+  typedef void (_Tp::*__fun_type)(void);
+public:
+  explicit mem_fun_ref_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(_Tp& __r) const { (__r.*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp>
+class const_mem_fun_ref_t<void, _Tp> : public unary_function<_Tp,void> {
+  typedef void (_Tp::*__fun_type)(void) const;
+public:
+  explicit const_mem_fun_ref_t _STLP_PSPEC2(void,_Tp) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(const _Tp& __r) const { (__r.*_M_f)(); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class mem_fun1_t<void, _Tp, _Arg> : public binary_function<_Tp*,_Arg,void> {
+  typedef void (_Tp::*__fun_type)(_Arg);
+public:
+  explicit mem_fun1_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(_Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class const_mem_fun1_t<void, _Tp, _Arg> 
+  : public binary_function<const _Tp*,_Arg,void> {
+  typedef void (_Tp::*__fun_type)(_Arg) const;
+public:
+  explicit const_mem_fun1_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(const _Tp* __p, _Arg __x) const { (__p->*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class mem_fun1_ref_t<void, _Tp, _Arg>
+  : public binary_function<_Tp,_Arg,void> {
+  typedef void (_Tp::*__fun_type)(_Arg);
+public:
+  explicit mem_fun1_ref_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(_Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Tp, class _Arg>
+class const_mem_fun1_ref_t<void, _Tp, _Arg>
+  : public binary_function<_Tp,_Arg,void> {
+  typedef void (_Tp::*__fun_type)(_Arg) const;
+public:
+  explicit const_mem_fun1_ref_t _STLP_PSPEC3(void,_Tp,_Arg) (__fun_type __pf) : _M_f(__pf) {}
+  void operator()(const _Tp& __r, _Arg __x) const { (__r.*_M_f)(__x); }
+private:
+  __fun_type _M_f;
+};
+
+template <class _Arg>
+class pointer_to_unary_function : public unary_function<_Arg, void> {
+  typedef void (*__fun_type)(_Arg);
+  __fun_type _M_ptr;
+public:
+  pointer_to_unary_function() {}
+  explicit pointer_to_unary_function(__fun_type __x) : _M_ptr(__x) {}
+  void operator()(_Arg __x) const { _M_ptr(__x); }
+};
+
+template <class _Arg1, class _Arg2>
+class pointer_to_binary_function : public binary_function<_Arg1,_Arg2,void> {
+  typedef void (*__fun_type)(_Arg1, _Arg2);
+  __fun_type _M_ptr;
+public:
+  pointer_to_binary_function() {}
+  explicit pointer_to_binary_function(__fun_type __x) : _M_ptr(__x) {}
+  void operator()(_Arg1 __x, _Arg2 __y) const { _M_ptr(__x, __y); }
+};
+
+#endif /*_STLP_DONT_RETURN_VOID && !_STLP_NO_CLASS_PARTIAL_SPECIALIZATION*/
+
+#else /*!_STLP_DONT_RETURN_VOID || !_STLP_NO_CLASS_PARTIAL_SPECIALIZATION || !_STLP_MEMBER_TEMPLATE_CLASSES*/
+
+//mem_fun_t
+template <class _Result, class _Tp>
+class mem_fun_t : 
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr _Base;
+public:
+  explicit mem_fun_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun_t
+template <class _Result, class _Tp>
+class const_mem_fun_t : 
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr_const {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ptr_const _Base;
+public:
+  explicit const_mem_fun_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//mem_fun_ref_t
+template <class _Result, class _Tp>
+class mem_fun_ref_t :
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref _Base;
+public:
+  explicit mem_fun_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun_ref_t
+template <class _Result, class _Tp>
+class const_mem_fun_ref_t :
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref_const {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args0<_Tp>::_Ref_const _Base;
+public:
+  explicit const_mem_fun_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//mem_fun1_t
+template <class _Result, class _Tp, class _Arg>
+class mem_fun1_t :
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr _Base;
+public:
+  explicit mem_fun1_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun1_t
+template <class _Result, class _Tp, class _Arg>
+class const_mem_fun1_t :
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr_const {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ptr_const _Base;
+public:
+  explicit const_mem_fun1_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//mem_fun1_ref_t
+template <class _Result, class _Tp, class _Arg>
+class mem_fun1_ref_t :
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref _Base;
+public:
+  explicit mem_fun1_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+//const_mem_fun1_t
+template <class _Result, class _Tp, class _Arg>
+class const_mem_fun1_ref_t :
+  public _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref_const {
+  typedef typename
+    _Mem_fun_traits<_Result>::_STLP_TEMPLATE _Args1<_Tp,_Arg>::_Ref_const _Base;
+public:
+  explicit const_mem_fun1_ref_t(typename _Base::__fun_type __f) : _Base(__f) {}
+};
+
+
+template <class _Arg, class _Result>
+class pointer_to_unary_function :
+public _Ptr_fun1<_Result,_Arg> {
+  typedef typename 
+    _Ptr_fun1<_Result,_Arg>::__fun_type __fun_type;
+public:
+  explicit pointer_to_unary_function(__fun_type __f)
+    : _Ptr_fun1<_Result,_Arg>(__f) {}
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+class pointer_to_binary_function :
+public _Ptr_fun2<_Result,_Arg1,_Arg2> {
+  typedef typename
+    _Ptr_fun2<_Result,_Arg1,_Arg2>::__fun_type __fun_type;
+public:
+  explicit pointer_to_binary_function(__fun_type __f)
+    : _Ptr_fun2<_Result,_Arg1,_Arg2>(__f) {}
+};
+
+#endif /*!_STLP_DONT_RETURN_VOID || !_STLP_NO_CLASS_PARTIAL_SPECIALIZATION || !_STLP_MEMBER_TEMPLATE_CLASSES*/
+
+
+# if !defined (_STLP_MEMBER_POINTER_PARAM_BUG)
+// Mem_fun adaptor helper functions.  There are only two:
+//  mem_fun and mem_fun_ref.  (mem_fun1 and mem_fun1_ref 
+//  are provided for backward compatibility, but they are no longer
+//  part of the C++ standard.)
+
+template <class _Result, class _Tp>
+inline mem_fun_t<_Result,_Tp> 
+mem_fun(_Result (_Tp::*__f)()) { return mem_fun_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp>
+inline const_mem_fun_t<_Result,_Tp> 
+mem_fun(_Result (_Tp::*__f)() const)  { return const_mem_fun_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp>
+inline mem_fun_ref_t<_Result,_Tp> 
+mem_fun_ref(_Result (_Tp::*__f)())  { return mem_fun_ref_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp>
+inline const_mem_fun_ref_t<_Result,_Tp> 
+mem_fun_ref(_Result (_Tp::*__f)() const)  { return const_mem_fun_ref_t<_Result,_Tp>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_t<_Result,_Tp,_Arg> 
+mem_fun(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_t<_Result,_Tp,_Arg> 
+mem_fun(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_ref_t<_Result,_Tp,_Arg> 
+mem_fun_ref(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_ref_t<_Result,_Tp,_Arg>
+mem_fun_ref(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+# if !(defined (_STLP_NO_EXTENSIONS) || defined (_STLP_NO_ANACHRONISMS))
+//  mem_fun1 and mem_fun1_ref are no longer part of the C++ standard,
+//  but they are provided for backward compatibility.
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_t<_Result,_Tp,_Arg> 
+mem_fun1(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_t<_Result,_Tp,_Arg> 
+mem_fun1(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline mem_fun1_ref_t<_Result,_Tp,_Arg> 
+mem_fun1_ref(_Result (_Tp::*__f)(_Arg)) { return mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+template <class _Result, class _Tp, class _Arg>
+inline const_mem_fun1_ref_t<_Result,_Tp,_Arg>
+mem_fun1_ref(_Result (_Tp::*__f)(_Arg) const) { return const_mem_fun1_ref_t<_Result,_Tp,_Arg>(__f); }
+
+# endif /* _STLP_NO_EXTENSIONS */
+
+# endif /* _STLP_MEMBER_POINTER_PARAM_BUG */
+
+template <class _Arg, class _Result>
+inline pointer_to_unary_function<_Arg, _Result>
+ptr_fun(_Result (*__f)(_Arg)) 
+{ return pointer_to_unary_function<_Arg, _Result>(__f); }
+
+template <class _Arg1, class _Arg2, class _Result>
+inline pointer_to_binary_function<_Arg1,_Arg2,_Result> 
+ptr_fun(_Result (*__f)(_Arg1, _Arg2)) 
+{ return pointer_to_binary_function<_Arg1,_Arg2,_Result>(__f); }
+
+_STLP_END_NAMESPACE
diff --git a/src/STLport/stl/_function_base.h b/src/STLport/stl/_function_base.h
new file mode 100644
index 0000000..e310427
--- /dev/null
+++ b/src/STLport/stl/_function_base.h
@@ -0,0 +1,226 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+#define _STLP_INTERNAL_FUNCTION_BASE_H
+
+#ifndef _STLP_CONFIG_H
+#include <stl/_config.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Arg, class _Result>
+struct unary_function {
+  typedef _Arg argument_type;
+  typedef _Result result_type;
+};
+
+template <class _Arg1, class _Arg2, class _Result>
+struct binary_function {
+  typedef _Arg1 first_argument_type;
+  typedef _Arg2 second_argument_type;
+  typedef _Result result_type;
+};      
+
+template <class _Tp>
+struct equal_to : public binary_function<_Tp,_Tp,bool> 
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x == __y; }
+};
+
+template <class _Tp>
+struct not_equal_to : public binary_function<_Tp,_Tp,bool> 
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x != __y; }
+};
+
+template <class _Tp>
+struct greater : public binary_function<_Tp,_Tp,bool> 
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x > __y; }
+};
+
+template <class _Tp>
+struct less : public binary_function<_Tp,_Tp,bool> 
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
+};
+
+template <class _Tp>
+struct greater_equal : public binary_function<_Tp,_Tp,bool>
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x >= __y; }
+};
+
+template <class _Tp>
+struct less_equal : public binary_function<_Tp,_Tp,bool> 
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x <= __y; }
+};
+
+template <class _Tp>
+less<_Tp> __less(_Tp* ) { return less<_Tp>(); }
+
+template <class _Tp>
+equal_to<_Tp> __equal_to(_Tp* ) { return equal_to<_Tp>(); }
+
+template <class _Tp>
+struct plus : public binary_function<_Tp,_Tp,_Tp> {
+  _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x + __y; }
+};
+
+template <class _Tp>
+struct minus : public binary_function<_Tp,_Tp,_Tp> {
+  _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x - __y; }
+};
+
+template <class _Tp>
+plus<_Tp> __plus(_Tp* ) { return plus<_Tp>(); }
+
+template <class _Tp>
+minus<_Tp> __minus(_Tp* ) { return minus<_Tp>(); }
+
+template <class _Tp>
+struct multiplies : public binary_function<_Tp,_Tp,_Tp> {
+  _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x * __y; }
+};
+
+template <class _Tp>
+struct divides : public binary_function<_Tp,_Tp,_Tp> {
+  _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x / __y; }
+};
+
+template <class _Tp>
+struct modulus : public binary_function<_Tp,_Tp,_Tp> 
+{
+  _Tp operator()(const _Tp& __x, const _Tp& __y) const { return __x % __y; }
+};
+
+template <class _Tp>
+struct negate : public unary_function<_Tp,_Tp> 
+{
+  _Tp operator()(const _Tp& __x) const { return -__x; }
+};
+
+template <class _Tp>
+struct logical_and : public binary_function<_Tp,_Tp,bool>
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x && __y; }
+};
+
+template <class _Tp>
+struct logical_or : public binary_function<_Tp,_Tp,bool>
+{
+  bool operator()(const _Tp& __x, const _Tp& __y) const { return __x || __y; }
+};
+
+template <class _Tp>
+struct logical_not : public unary_function<_Tp,bool>
+{
+  bool operator()(const _Tp& __x) const { return !__x; }
+};
+
+template <class _Pair>
+struct _Select1st : public unary_function<_Pair, typename _Pair::first_type> {
+  const typename _Pair::first_type& operator()(const _Pair& __x) const {
+    return __x.first;
+  }
+};
+
+template <class _Pair>
+struct _Select2nd : public unary_function<_Pair, typename _Pair::second_type>
+{
+  const typename _Pair::second_type& operator()(const _Pair& __x) const {
+    return __x.second;
+  }
+};
+
+// project1st and project2nd are extensions: they are not part of the standard
+template <class _Arg1, class _Arg2>
+struct _Project1st : public binary_function<_Arg1, _Arg2, _Arg1> {
+  _Arg1 operator()(const _Arg1& __x, const _Arg2&) const { return __x; }
+};
+
+template <class _Arg1, class _Arg2>
+struct _Project2nd : public binary_function<_Arg1, _Arg2, _Arg2> {
+  _Arg2 operator()(const _Arg1&, const _Arg2& __y) const { return __y; }
+};
+
+#ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+// fbp : sort of select1st just for maps
+template <class _Pair, class _Whatever>		
+// JDJ (CW Pro1 doesn't like const when first_type is also const)
+struct __Select1st_hint : public unary_function<_Pair, _Whatever> {
+    const _Whatever& operator () (const _Pair& __x) const { return __x.first; }
+};
+# define  _STLP_SELECT1ST(__x,__y) __Select1st_hint< __x, __y >
+# else
+# define  _STLP_SELECT1ST(__x, __y) _Select1st< __x >
+# endif
+
+template <class _Tp>
+struct _Identity : public unary_function<_Tp,_Tp> {
+  const _Tp& operator()(const _Tp& __x) const { return __x; }
+};
+
+template <class _Result, class _Argument>
+struct _Constant_unary_fun {
+  typedef _Argument argument_type;
+  typedef  _Result  result_type;
+  result_type _M_val;
+
+  _Constant_unary_fun(const result_type& __v) : _M_val(__v) {}
+  const result_type& operator()(const _Argument&) const { return _M_val; }
+};
+
+template <class _Result, class _Arg1, class _Arg2>
+struct _Constant_binary_fun {
+  typedef  _Arg1   first_argument_type;
+  typedef  _Arg2   second_argument_type;
+  typedef  _Result result_type;
+  _Result _M_val;
+
+  _Constant_binary_fun(const _Result& __v) : _M_val(__v) {}
+  const result_type& operator()(const _Arg1&, const _Arg2&) const {
+    return _M_val;
+  }
+};
+
+// identity_element (not part of the C++ standard).
+template <class _Tp> inline _Tp __identity_element(plus<_Tp>) {  return _Tp(0); }
+template <class _Tp> inline _Tp __identity_element(multiplies<_Tp>) { return _Tp(1); }
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_FUNCTION_BASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_hash_fun.h b/src/STLport/stl/_hash_fun.h
new file mode 100644
index 0000000..414ea8b
--- /dev/null
+++ b/src/STLport/stl/_hash_fun.h
@@ -0,0 +1,107 @@
+/*
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_HASH_FUN_H
+#define _STLP_HASH_FUN_H
+
+# ifndef _STLP_CSTDDEF
+#  include <cstddef>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Key> struct hash { };
+
+inline size_t __stl_hash_string(const char* __s)
+{
+  _STLP_FIX_LITERAL_BUG(__s)
+  unsigned long __h = 0; 
+  for ( ; *__s; ++__s)
+    __h = 5*__h + *__s;
+  
+  return size_t(__h);
+}
+
+_STLP_TEMPLATE_NULL struct hash<char*>
+{
+  size_t operator()(const char* __s) const { _STLP_FIX_LITERAL_BUG(__s) return __stl_hash_string(__s); }
+};
+
+_STLP_TEMPLATE_NULL struct hash<const char*>
+{
+  size_t operator()(const char* __s) const { _STLP_FIX_LITERAL_BUG(__s) return __stl_hash_string(__s); }
+};
+
+_STLP_TEMPLATE_NULL struct hash<char> {
+  size_t operator()(char __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned char> {
+  size_t operator()(unsigned char __x) const { return __x; }
+};
+#ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_TEMPLATE_NULL struct hash<signed char> {
+  size_t operator()(unsigned char __x) const { return __x; }
+};
+#endif
+_STLP_TEMPLATE_NULL struct hash<short> {
+  size_t operator()(short __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned short> {
+  size_t operator()(unsigned short __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<int> {
+  size_t operator()(int __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned int> {
+  size_t operator()(unsigned int __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<long> {
+  size_t operator()(long __x) const { return __x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned long> {
+  size_t operator()(unsigned long __x) const { return __x; }
+};
+
+# if defined (_STLP_LONG_LONG)
+_STLP_TEMPLATE_NULL struct hash<_STLP_LONG_LONG> {
+  size_t operator()(long x) const { return x; }
+};
+_STLP_TEMPLATE_NULL struct hash<unsigned _STLP_LONG_LONG> {
+  size_t operator()(unsigned long x) const { return x; }
+};
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_HASH_FUN_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_hash_map.h b/src/STLport/stl/_hash_map.h
new file mode 100644
index 0000000..6962264
--- /dev/null
+++ b/src/STLport/stl/_hash_map.h
@@ -0,0 +1,468 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HASH_MAP_H
+#define _STLP_INTERNAL_HASH_MAP_H
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+# include <stl/_hashtable.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# define  hash_map      __WORKAROUND_RENAME(hash_map)
+# define  hash_multimap __WORKAROUND_RENAME(hash_multimap)
+
+#  define _STLP_KEY_PAIR pair< const _Key, _Tp >
+#  define _STLP_HASHTABLE hashtable \
+      < pair < const _Key, _Tp >, _Key, _HashFcn, \
+      _STLP_SELECT1ST( _STLP_KEY_PAIR,  _Key ), _EqualKey, _Alloc >
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_HashFcn,hash<_Key>),
+          __DFL_TMPL_PARAM(_EqualKey,equal_to<_Key>),
+          _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class hash_map
+{
+private:
+  typedef _STLP_HASHTABLE _Ht;
+  typedef hash_map<_Key, _Tp, _HashFcn, _EqualKey, _Alloc> _Self;
+public:
+  typedef typename _Ht::key_type key_type;
+  typedef _Tp data_type;
+  typedef _Tp mapped_type;
+  typedef typename _Ht::value_type _value_type;
+  typedef typename _Ht::value_type value_type;
+  typedef typename _Ht::hasher hasher;
+  typedef typename _Ht::key_equal key_equal;
+  
+  typedef typename _Ht::size_type size_type;
+  typedef typename _Ht::difference_type difference_type;
+  typedef typename _Ht::pointer pointer;
+  typedef typename _Ht::const_pointer const_pointer;
+  typedef typename _Ht::reference reference;
+  typedef typename _Ht::const_reference const_reference;
+
+  typedef typename _Ht::iterator iterator;
+  typedef typename _Ht::const_iterator const_iterator;
+
+  typedef typename _Ht::allocator_type allocator_type;
+
+  hasher hash_funct() const { return _M_ht.hash_funct(); }
+  key_equal key_eq() const { return _M_ht.key_eq(); }
+  allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+  _Ht _M_ht;
+public:
+  hash_map() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+  explicit hash_map(size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+  hash_map(size_type __n, const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+  hash_map(size_type __n, const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  hash_map(_InputIterator __f, _InputIterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  template <class _InputIterator>
+  hash_map(_InputIterator __f, _InputIterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  template <class _InputIterator>
+  hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
+           const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql)
+    : _M_ht(__n, __hf, __eql, allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+# endif
+  template <class _InputIterator>
+  hash_map(_InputIterator __f, _InputIterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+
+#else
+  hash_map(const value_type* __f, const value_type* __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_map(const value_type* __f, const value_type* __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_map(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_map(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+
+  hash_map(const_iterator __f, const_iterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_map(const_iterator __f, const_iterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_map(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_map(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return _M_ht.size(); }
+  size_type max_size() const { return _M_ht.max_size(); }
+  bool empty() const { return _M_ht.empty(); }
+  void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
+  iterator begin() { return _M_ht.begin(); }
+  iterator end() { return _M_ht.end(); }
+  const_iterator begin() const { return _M_ht.begin(); }
+  const_iterator end() const { return _M_ht.end(); }
+
+public:
+  pair<iterator,bool> insert(const value_type& __obj)
+    { return _M_ht.insert_unique(__obj); }
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(_InputIterator __f, _InputIterator __l)
+    { _M_ht.insert_unique(__f,__l); }
+#else
+  void insert(const value_type* __f, const value_type* __l) {
+    _M_ht.insert_unique(__f,__l);
+  }
+  void insert(const_iterator __f, const_iterator __l)
+    { _M_ht.insert_unique(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+  pair<iterator,bool> insert_noresize(const value_type& __obj)
+    { return _M_ht.insert_unique_noresize(__obj); }    
+
+  iterator find(const key_type& __key) { return _M_ht.find(__key); }
+  const_iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+
+  _Tp& operator[](const key_type& __key) {
+    iterator __it = _M_ht.find(__key);
+    return (__it == _M_ht.end() ? 
+	    _M_ht._M_insert(_value_type(__key, _Tp())).second : 
+	    (*__it).second );
+  }
+
+  size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& __key)
+    { return _M_ht.equal_range(__key); }
+  pair<const_iterator, const_iterator>
+  equal_range(const key_type& __key) const
+    { return _M_ht.equal_range(__key); }
+
+  size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+  void erase(iterator __it) { _M_ht.erase(__it); }
+  void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+  void clear() { _M_ht.clear(); }
+
+  void resize(size_type __hint) { _M_ht.resize(__hint); }
+  size_type bucket_count() const { return _M_ht.bucket_count(); }
+  size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+  size_type elems_in_bucket(size_type __n) const
+    { return _M_ht.elems_in_bucket(__n); }
+  static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+    return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+  }
+};
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_HashFcn,hash<_Key>),
+          __DFL_TMPL_PARAM(_EqualKey,equal_to<_Key>),
+          _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class hash_multimap
+{
+private:
+  typedef _STLP_HASHTABLE _Ht;
+  typedef hash_multimap<_Key, _Tp, _HashFcn, _EqualKey, _Alloc> _Self;
+public:
+  typedef typename _Ht::key_type key_type;
+  typedef _Tp data_type;
+  typedef _Tp mapped_type;
+  typedef typename _Ht::value_type _value_type;
+  typedef _value_type value_type;
+  typedef typename _Ht::hasher hasher;
+  typedef typename _Ht::key_equal key_equal;
+
+  typedef typename _Ht::size_type size_type;
+  typedef typename _Ht::difference_type difference_type;
+  typedef typename _Ht::pointer pointer;
+  typedef typename _Ht::const_pointer const_pointer;
+  typedef typename _Ht::reference reference;
+  typedef typename _Ht::const_reference const_reference;
+
+  typedef typename _Ht::iterator iterator;
+  typedef typename _Ht::const_iterator const_iterator;
+
+  typedef typename _Ht::allocator_type allocator_type;
+
+  hasher hash_funct() const { return _M_ht.hash_funct(); }
+  key_equal key_eq() const { return _M_ht.key_eq(); }
+  allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+  _Ht _M_ht;
+public:
+  hash_multimap() : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+  explicit hash_multimap(size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+  hash_multimap(size_type __n, const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+  hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  hash_multimap(_InputIterator __f, _InputIterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  template <class _InputIterator>
+  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  template <class _InputIterator>
+  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+                const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql)
+    : _M_ht(__n, __hf, __eql, allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+#  endif
+  template <class _InputIterator>
+  hash_multimap(_InputIterator __f, _InputIterator __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+
+#else
+  hash_multimap(const value_type* __f, const value_type* __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multimap(const value_type* __f, const value_type* __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+                const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+
+  hash_multimap(const_iterator __f, const_iterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multimap(const_iterator __f, const_iterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+                const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return _M_ht.size(); }
+  size_type max_size() const { return _M_ht.max_size(); }
+  bool empty() const { return _M_ht.empty(); }
+  void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
+
+  iterator begin() { return _M_ht.begin(); }
+  iterator end() { return _M_ht.end(); }
+  const_iterator begin() const { return _M_ht.begin(); }
+  const_iterator end() const { return _M_ht.end(); }
+
+public:
+  iterator insert(const value_type& __obj) 
+    { return _M_ht.insert_equal(__obj); }
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(_InputIterator __f, _InputIterator __l) 
+    { _M_ht.insert_equal(__f,__l); }
+#else
+  void insert(const value_type* __f, const value_type* __l) {
+    _M_ht.insert_equal(__f,__l);
+  }
+  void insert(const_iterator __f, const_iterator __l) 
+    { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+  iterator insert_noresize(const value_type& __obj)
+    { return _M_ht.insert_equal_noresize(__obj); }    
+
+  iterator find(const key_type& __key) { return _M_ht.find(__key); }
+  const_iterator find(const key_type& __key) const 
+    { return _M_ht.find(__key); }
+
+  size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& __key)
+    { return _M_ht.equal_range(__key); }
+  pair<const_iterator, const_iterator>
+  equal_range(const key_type& __key) const
+    { return _M_ht.equal_range(__key); }
+
+  size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+  void erase(iterator __it) { _M_ht.erase(__it); }
+  void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+  void clear() { _M_ht.clear(); }
+
+public:
+  void resize(size_type __hint) { _M_ht.resize(__hint); }
+  size_type bucket_count() const { return _M_ht.bucket_count(); }
+  size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+  size_type elems_in_bucket(size_type __n) const
+    { return _M_ht.elems_in_bucket(__n); }
+  static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+    return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+  }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Key, class _Tp, class _HashFcn, class _EqlKey, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER hash_map<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>
+
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#define _STLP_TEMPLATE_CONTAINER hash_multimap<_Key,_Tp,_HashFcn,_EqlKey,_Alloc>
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+// Specialization of insert_iterator so that it will work for hash_map
+// and hash_multimap.
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
+class insert_iterator<hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc> > {
+protected:
+  typedef hash_map<_Key, _Tp, _HashFn, _EqKey, _Alloc> _Container;
+  _Container* container;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  insert_iterator(_Container& __x) : container(&__x) {}
+  insert_iterator(_Container& __x, typename _Container::iterator)
+    : container(&__x) {}
+  insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    container->insert(__val);
+    return *this;
+  }
+  insert_iterator<_Container>& operator*() { return *this; }
+  insert_iterator<_Container>& operator++() { return *this; }
+  insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Key, class _Tp, class _HashFn,  class _EqKey, class _Alloc>
+class insert_iterator<hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc> > {
+protected:
+  typedef hash_multimap<_Key, _Tp, _HashFn, _EqKey, _Alloc> _Container;
+  _Container* container;
+  typename _Container::iterator iter;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  insert_iterator(_Container& __x) : container(&__x) {}
+  insert_iterator(_Container& __x, typename _Container::iterator)
+    : container(&__x) {}
+  insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    container->insert(__val);
+    return *this;
+  }
+  insert_iterator<_Container>& operator*() { return *this; }
+  insert_iterator<_Container>& operator++() { return *this; }
+  insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+// do a cleanup
+# undef hash_map
+# undef hash_multimap
+
+# define __hash_map__ __FULL_NAME(hash_map)
+# define __hash_multimap__ __FULL_NAME(hash_multimap)
+
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM) 
+#  include <stl/wrappers/_hash_map.h>
+# endif /*  WRAPPER */
+
+#endif /* _STLP_INTERNAL_HASH_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_hash_set.h b/src/STLport/stl/_hash_set.h
new file mode 100644
index 0000000..eb5279b
--- /dev/null
+++ b/src/STLport/stl/_hash_set.h
@@ -0,0 +1,470 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HASH_SET_H
+#define _STLP_INTERNAL_HASH_SET_H
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+# include <stl/_hashtable.h>
+#endif
+
+# define  hash_set      __WORKAROUND_RENAME(hash_set)
+# define  hash_multiset __WORKAROUND_RENAME(hash_multiset)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Value, __DFL_TMPL_PARAM(_HashFcn,hash<_Value>),
+          __DFL_TMPL_PARAM(_EqualKey,equal_to<_Value>),
+          _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) >
+class hash_set
+{
+private:
+  typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>, 
+                    _EqualKey, _Alloc> _Ht;
+  typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Self;
+  typedef typename _Ht::iterator _ht_iterator;
+public:
+  typedef typename _Ht::key_type key_type;
+  typedef typename _Ht::value_type value_type;
+  typedef typename _Ht::hasher hasher;
+  typedef typename _Ht::key_equal key_equal;
+
+  typedef typename _Ht::size_type size_type;
+  typedef typename _Ht::difference_type difference_type;
+  typedef typename _Ht::pointer         pointer;
+  typedef typename _Ht::const_pointer   const_pointer;
+  typedef typename _Ht::reference       reference;
+  typedef typename _Ht::const_reference const_reference;
+
+  // SunPro bug
+  typedef typename _Ht::const_iterator const_iterator;
+  typedef const_iterator iterator;
+
+  typedef typename _Ht::allocator_type allocator_type;
+
+  hasher hash_funct() const { return _M_ht.hash_funct(); }
+  key_equal key_eq() const { return _M_ht.key_eq(); }
+  allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+  _Ht _M_ht;
+
+public:
+  hash_set()
+    : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+  explicit hash_set(size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+  hash_set(size_type __n, const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+  hash_set(size_type __n, const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  hash_set(_InputIterator __f, _InputIterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  template <class _InputIterator>
+  hash_set(_InputIterator __f, _InputIterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  template <class _InputIterator>
+  hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
+           const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql)
+    : _M_ht(__n, __hf, __eql, allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+#  endif
+  template <class _InputIterator>
+  hash_set(_InputIterator __f, _InputIterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+#else
+
+  hash_set(const value_type* __f, const value_type* __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_set(const value_type* __f, const value_type* __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_set(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_set(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+
+  hash_set(const_iterator __f, const_iterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_set(const_iterator __f, const_iterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_set(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_unique(__f, __l); }
+  hash_set(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql,
+           const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_unique(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return _M_ht.size(); }
+  size_type max_size() const { return _M_ht.max_size(); }
+  bool empty() const { return _M_ht.empty(); }
+  void swap(_Self& __hs) { _M_ht.swap(__hs._M_ht); }
+
+  iterator begin() const { return _M_ht.begin(); }
+  iterator end() const { return _M_ht.end(); }
+
+public:
+  pair<iterator, bool> insert(const value_type& __obj)
+    {
+      pair<_ht_iterator, bool> __p = _M_ht.insert_unique(__obj);
+      return pair<iterator,bool>(__REINTERPRET_CAST(const iterator&, __p.first), __p.second);
+    }
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(_InputIterator __f, _InputIterator __l) 
+    { _M_ht.insert_unique(__f,__l); }
+#else
+  void insert(const value_type* __f, const value_type* __l) {
+    _M_ht.insert_unique(__f,__l);
+  }
+  void insert(const_iterator __f, const_iterator __l) 
+    {_M_ht.insert_unique(__f, __l); }
+
+#endif /*_STLP_MEMBER_TEMPLATES */
+  pair<iterator, bool> insert_noresize(const value_type& __obj)
+  {
+    pair<_ht_iterator, bool> __p = 
+      _M_ht.insert_unique_noresize(__obj);
+    return pair<iterator, bool>(__p.first, __p.second);
+  }
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+  template <class _KT>
+  iterator find(const _KT& __key) const { return _M_ht.find(__key); }
+# else
+  iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+# endif
+  size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& __key) const
+    { return _M_ht.equal_range(__key); }
+
+  size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+  void erase(iterator __it) { _M_ht.erase(__it); }
+  void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+  void clear() { _M_ht.clear(); }
+
+public:
+  void resize(size_type __hint) { _M_ht.resize(__hint); }
+  size_type bucket_count() const { return _M_ht.bucket_count(); }
+  size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+  size_type elems_in_bucket(size_type __n) const
+    { return _M_ht.elems_in_bucket(__n); }
+
+  static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+    return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+  }
+
+};
+
+template <class _Value, __DFL_TMPL_PARAM(_HashFcn,hash<_Value>),
+          __DFL_TMPL_PARAM(_EqualKey,equal_to<_Value>),
+          _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) >
+class hash_multiset
+{
+private:
+  typedef hashtable<_Value, _Value, _HashFcn, _Identity<_Value>, 
+                    _EqualKey, _Alloc> _Ht;
+  typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Self;
+
+public:
+  typedef typename _Ht::key_type key_type;
+  typedef typename _Ht::value_type value_type;
+  typedef typename _Ht::hasher hasher;
+  typedef typename _Ht::key_equal key_equal;
+
+  typedef typename _Ht::size_type size_type;
+  typedef typename _Ht::difference_type difference_type;
+  typedef typename _Ht::pointer       pointer;
+  typedef typename _Ht::const_pointer const_pointer;
+  typedef typename _Ht::reference reference;
+  typedef typename _Ht::const_reference const_reference;
+
+  typedef typename _Ht::const_iterator const_iterator;
+  // SunPro bug
+  typedef const_iterator iterator;
+
+  typedef typename _Ht::allocator_type allocator_type;
+
+  hasher hash_funct() const { return _M_ht.hash_funct(); }
+  key_equal key_eq() const { return _M_ht.key_eq(); }
+  allocator_type get_allocator() const { return _M_ht.get_allocator(); }
+
+private:
+  _Ht _M_ht;
+
+public:
+  hash_multiset()
+    : _M_ht(100, hasher(), key_equal(), allocator_type()) {}
+  explicit hash_multiset(size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type()) {}
+  hash_multiset(size_type __n, const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type()) {}
+  hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql)
+    : _M_ht(__n, __hf, __eql, allocator_type()) {}
+  hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a)
+    : _M_ht(__n, __hf, __eql, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  hash_multiset(_InputIterator __f, _InputIterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  template <class _InputIterator>
+  hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  template <class _InputIterator>
+  hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
+                const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql)
+    : _M_ht(__n, __hf, __eql, allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+# endif
+  template <class _InputIterator>
+  hash_multiset(_InputIterator __f, _InputIterator __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+#else
+
+  hash_multiset(const value_type* __f, const value_type* __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multiset(const value_type* __f, const value_type* __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+                const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+
+  hash_multiset(const_iterator __f, const_iterator __l)
+    : _M_ht(100, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multiset(const_iterator __f, const_iterator __l, size_type __n)
+    : _M_ht(__n, hasher(), key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+                const hasher& __hf)
+    : _M_ht(__n, __hf, key_equal(), allocator_type())
+    { _M_ht.insert_equal(__f, __l); }
+  hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+                const hasher& __hf, const key_equal& __eql,
+                const allocator_type& __a = allocator_type())
+    : _M_ht(__n, __hf, __eql, __a)
+    { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+public:
+  size_type size() const { return _M_ht.size(); }
+  size_type max_size() const { return _M_ht.max_size(); }
+  bool empty() const { return _M_ht.empty(); }
+  void swap(_Self& hs) { _M_ht.swap(hs._M_ht); }
+
+  iterator begin() const { return _M_ht.begin(); }
+  iterator end() const { return _M_ht.end(); }
+
+public:
+  iterator insert(const value_type& __obj)
+    { return _M_ht.insert_equal(__obj); }
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(_InputIterator __f, _InputIterator __l) 
+    { _M_ht.insert_equal(__f,__l); }
+#else
+  void insert(const value_type* __f, const value_type* __l) {
+    _M_ht.insert_equal(__f,__l);
+  }
+  void insert(const_iterator __f, const_iterator __l) 
+    { _M_ht.insert_equal(__f, __l); }
+#endif /*_STLP_MEMBER_TEMPLATES */
+  iterator insert_noresize(const value_type& __obj)
+    { return _M_ht.insert_equal_noresize(__obj); }    
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+  template <class _KT>
+  iterator find(const _KT& __key) const { return _M_ht.find(__key); }
+# else
+  iterator find(const key_type& __key) const { return _M_ht.find(__key); }
+# endif
+
+  size_type count(const key_type& __key) const { return _M_ht.count(__key); }
+  
+  pair<iterator, iterator> equal_range(const key_type& __key) const
+    { return _M_ht.equal_range(__key); }
+
+  size_type erase(const key_type& __key) {return _M_ht.erase(__key); }
+  void erase(iterator __it) { _M_ht.erase(__it); }
+  void erase(iterator __f, iterator __l) { _M_ht.erase(__f, __l); }
+  void clear() { _M_ht.clear(); }
+
+public:
+  void resize(size_type __hint) { _M_ht.resize(__hint); }
+  size_type bucket_count() const { return _M_ht.bucket_count(); }
+  size_type max_bucket_count() const { return _M_ht.max_bucket_count(); }
+  size_type elems_in_bucket(size_type __n) const
+    { return _M_ht.elems_in_bucket(__n); }
+  static bool _STLP_CALL _M_equal (const _Self& __x, const _Self& __y) {
+    return _Ht::_M_equal(__x._M_ht,__y._M_ht);
+  }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER hash_set<_Value,_HashFcn,_EqualKey,_Alloc>
+
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#define _STLP_TEMPLATE_CONTAINER hash_multiset<_Value,_HashFcn,_EqualKey,_Alloc>
+#include <stl/_relops_hash_cont.h>
+
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+// Specialization of insert_iterator so that it will work for hash_set
+// and hash_multiset.
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
+class insert_iterator<hash_set<_Value, _HashFcn, _EqualKey, _Alloc> > {
+protected:
+  typedef hash_set<_Value, _HashFcn, _EqualKey, _Alloc> _Container;
+  _Container* container;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  insert_iterator(_Container& __x) : container(&__x) {}
+  insert_iterator(_Container& __x, typename _Container::iterator)
+    : container(&__x) {}
+  insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    container->insert(__val);
+    return *this;
+  }
+  insert_iterator<_Container>& operator*() { return *this; }
+  insert_iterator<_Container>& operator++() { return *this; }
+  insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Value, class _HashFcn, class _EqualKey, class _Alloc>
+class insert_iterator<hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> > {
+protected:
+  typedef hash_multiset<_Value, _HashFcn, _EqualKey, _Alloc> _Container;
+  _Container* container;
+  typename _Container::iterator iter;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  insert_iterator(_Container& __x) : container(&__x) {}
+  insert_iterator(_Container& __x, typename _Container::iterator)
+    : container(&__x) {}
+  insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    container->insert(__val);
+    return *this;
+  }
+  insert_iterator<_Container>& operator*() { return *this; }
+  insert_iterator<_Container>& operator++() { return *this; }
+  insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+_STLP_END_NAMESPACE
+
+// do a cleanup
+#  undef hash_set
+#  undef hash_multiset
+
+// provide a uniform way to access full funclionality 
+#  define __hash_set__       __FULL_NAME(hash_set)
+#  define __hash_multiset__  __FULL_NAME(hash_multiset)
+
+# if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )
+#  include <stl/wrappers/_hash_set.h>
+# endif /*  WRAPPER */
+
+#endif /* _STLP_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_hashtable.c b/src/STLport/stl/_hashtable.c
new file mode 100644
index 0000000..2e636f0
--- /dev/null
+++ b/src/STLport/stl/_hashtable.c
@@ -0,0 +1,468 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_HASHTABLE_C
+#define _STLP_HASHTABLE_C
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+# include <stl/_hashtable.h>
+#endif
+
+#ifdef _STLP_DEBUG
+#  define hashtable __WORKAROUND_DBG_RENAME(hashtable)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# define __PRIME_LIST_BODY { \
+  53ul,         97ul,         193ul,       389ul,       769ul,      \
+  1543ul,       3079ul,       6151ul,      12289ul,     24593ul,    \
+  49157ul,      98317ul,      196613ul,    393241ul,    786433ul,   \
+  1572869ul,    3145739ul,    6291469ul,   12582917ul,  25165843ul, \
+  50331653ul,   100663319ul,  201326611ul, 402653189ul, 805306457ul,\
+  1610612741ul, 3221225473ul, 4294967291ul  \
+}
+
+#if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _Tp>
+const size_t _Stl_prime<_Tp>::_M_list[__stl_num_primes] = __PRIME_LIST_BODY;
+#else
+__DECLARE_INSTANCE(const size_t, 
+		   _Stl_prime_type::_M_list[], =__PRIME_LIST_BODY);
+#endif /* _STLP_STATIC_TEMPLATE_DATA */
+
+# undef __PRIME_LIST_BODY
+
+// fbp: these defines are for outline methods definitions.
+// needed to definitions to be portable. Should not be used in method bodies.
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+#  define __size_type__       size_t
+#  define size_type           size_t
+#  define value_type      _Val
+#  define key_type        _Key
+#  define _Node           _Hashtable_node<_Val>
+#  define __reference__       _Val&
+
+#  define __iterator__        _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>
+#  define __const_iterator__  _Ht_iterator<_Val, _Const_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>
+# else
+#  define __size_type__        _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>::size_type
+#  define __reference__        _STLP_TYPENAME_ON_RETURN_TYPE  hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>::reference
+#  define __iterator__         _STLP_TYPENAME_ON_RETURN_TYPE hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>::iterator
+# endif
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, 
+          class _All>
+_Hashtable_node<_Val>*
+_Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_skip_to_next() {
+  size_t __bucket = _M_ht->_M_bkt_num(_M_cur->_M_val);
+  size_t __h_sz;
+  __h_sz = this->_M_ht->bucket_count();
+
+  _Node* __i=0;
+  while (__i==0 && ++__bucket < __h_sz)
+    __i = (_Node*)_M_ht->_M_buckets[__bucket];
+  return __i;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, 
+          class _All>
+__size_type__
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_next_size(size_type __n) const    { 
+  const size_type* __first = (const size_type*)_Stl_prime_type::_M_list;
+  const size_type* __last =  (const size_type*)_Stl_prime_type::_M_list + (int)__stl_num_primes;
+  const size_type* pos = __lower_bound(__first, __last, __n, __less((size_type*)0), (ptrdiff_t*)0);
+  return (pos == __last ? *(__last - 1) : *pos);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+bool 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_equal(
+						  const hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>& __ht1,
+						  const hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>& __ht2)
+{
+  //  typedef _Hashtable_node<_Val> _Node;
+  if (__ht1.bucket_count() != __ht2.bucket_count())
+    return false;
+  for (size_t __n = 0; __n < __ht1.bucket_count(); ++__n) {
+    const _Node* __cur1 = __ht1._M_get_bucket(__n);
+    const _Node* __cur2 = __ht2._M_get_bucket(__n);
+    for ( ; __cur1 && __cur2 && __cur1->_M_val == __cur2->_M_val;
+          __cur1 = __cur1->_M_next, __cur2 = __cur2->_M_next)
+      {}
+    if (__cur1 || __cur2)
+      return false;
+  }
+  return true;
+}  
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+pair< _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> , bool> 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::insert_unique_noresize(const value_type& __obj)
+{
+  const size_type __n = _M_bkt_num(__obj);
+  _Node* __first = (_Node*)_M_buckets[__n];
+
+  for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) 
+    if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj)))
+      return pair<iterator, bool>(iterator(__cur, this), false);
+
+  _Node* __tmp = _M_new_node(__obj);
+  __tmp->_M_next = __first;
+  _M_buckets[__n] = __tmp;
+  ++_M_num_elements._M_data;
+  return pair<iterator, bool>(iterator(__tmp, this), true);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__iterator__ 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::insert_equal_noresize(const value_type& __obj)
+{
+  const size_type __n = _M_bkt_num(__obj);
+  _Node* __first = (_Node*)_M_buckets[__n];
+
+  for (_Node* __cur = __first; __cur; __cur = __cur->_M_next) 
+    if (_M_equals(_M_get_key(__cur->_M_val), _M_get_key(__obj))) {
+      _Node* __tmp = _M_new_node(__obj);
+      __tmp->_M_next = __cur->_M_next;
+      __cur->_M_next = __tmp;
+      ++_M_num_elements._M_data;
+      return iterator(__tmp, this);
+    }
+
+  _Node* __tmp = _M_new_node(__obj);
+  __tmp->_M_next = __first;
+  _M_buckets[__n] = __tmp;
+  ++_M_num_elements._M_data;
+  return iterator(__tmp, this);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__reference__ 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::_M_insert(const value_type& __obj)
+{
+  resize(_M_num_elements._M_data + 1);
+
+  size_type __n = _M_bkt_num(__obj);
+  _Node* __first = (_Node*)_M_buckets[__n];
+
+  _Node* __tmp = _M_new_node(__obj);
+  __tmp->_M_next = __first;
+  _M_buckets[__n] = __tmp;
+  ++_M_num_elements._M_data;
+  return __tmp->_M_val;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__reference__ 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::find_or_insert(const value_type& __obj)
+{
+
+  _Node* __first = _M_find(_M_get_key(__obj));
+  if (__first)
+    return __first->_M_val;
+  else
+    return _M_insert(__obj);
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+pair< _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>,
+      _Ht_iterator<_Val, _Nonconst_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> > 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::equal_range(const key_type& __key)
+{
+  typedef pair<iterator, iterator> _Pii;
+  const size_type __n = _M_bkt_num_key(__key);
+
+  for (_Node* __first = (_Node*)_M_buckets[__n]; __first; __first = __first->_M_next)
+    if (_M_equals(_M_get_key(__first->_M_val), __key)) {
+      for (_Node* __cur = __first->_M_next; __cur; __cur = __cur->_M_next)
+        if (!_M_equals(_M_get_key(__cur->_M_val), __key))
+          return _Pii(iterator(__first, this), iterator(__cur, this));
+      for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)
+        if (_M_buckets[__m])
+          return _Pii(iterator(__first, this),
+                     iterator((_Node*)_M_buckets[__m], this));
+      return _Pii(iterator(__first, this), end());
+    }
+  return _Pii(end(), end());
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+pair< _Ht_iterator<_Val, _Const_traits<_Val>, _Key, _HF, _ExK, _EqK, _All>, 
+     _Ht_iterator<_Val, _Const_traits<_Val>, _Key, _HF, _ExK, _EqK, _All> > 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::equal_range(const key_type& __key) const
+{
+  typedef pair<const_iterator, const_iterator> _Pii;
+  const size_type __n = _M_bkt_num_key(__key);
+
+  for (const _Node* __first = (_Node*)_M_buckets[__n] ;
+       __first; 
+       __first = __first->_M_next) {
+    if (_M_equals(_M_get_key(__first->_M_val), __key)) {
+      for (const _Node* __cur = __first->_M_next;
+           __cur;
+           __cur = __cur->_M_next)
+        if (!_M_equals(_M_get_key(__cur->_M_val), __key))
+          return _Pii(const_iterator(__first, this),
+                      const_iterator(__cur, this));
+      for (size_type __m = __n + 1; __m < _M_buckets.size(); ++__m)
+        if (_M_buckets[__m])
+          return _Pii(const_iterator(__first, this),
+                      const_iterator((_Node*)_M_buckets[__m], this));
+      return _Pii(const_iterator(__first, this), end());
+    }
+  }
+  return _Pii(end(), end());
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+__size_type__ 
+hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::erase(const key_type& __key)
+{
+  const size_type __n = _M_bkt_num_key(__key);
+  _Node* __first = (_Node*)_M_buckets[__n];
+  size_type __erased = 0;
+
+  if (__first) {
+    _Node* __cur = __first;
+    _Node* __next = __cur->_M_next;
+    while (__next) {
+      if (_M_equals(_M_get_key(__next->_M_val), __key)) {
+        __cur->_M_next = __next->_M_next;
+        _M_delete_node(__next);
+        __next = __cur->_M_next;
+        ++__erased;
+        --_M_num_elements._M_data;
+      }
+      else {
+        __cur = __next;
+        __next = __cur->_M_next;
+      }
+    }
+    if (_M_equals(_M_get_key(__first->_M_val), __key)) {
+      _M_buckets[__n] = __first->_M_next;
+      _M_delete_node(__first);
+      ++__erased;
+      --_M_num_elements._M_data;
+    }
+  }
+  return __erased;
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::erase(const const_iterator& __it)
+{
+  // const iterator& __it = __REINTERPRET_CAST(const iterator&,_c_it);
+  const _Node* __p = __it._M_cur;
+  if (__p) {
+    const size_type __n = _M_bkt_num(__p->_M_val);
+    _Node* __cur = (_Node*)_M_buckets[__n];
+
+    if (__cur == __p) {
+      _M_buckets[__n] = __cur->_M_next;
+      _M_delete_node(__cur);
+      --_M_num_elements._M_data;
+    }
+    else {
+      _Node* __next = __cur->_M_next;
+      while (__next) {
+        if (__next == __p) {
+          __cur->_M_next = __next->_M_next;
+          _M_delete_node(__next);
+          --_M_num_elements._M_data;
+          break;
+        }
+        else {
+          __cur = __next;
+          __next = __cur->_M_next;
+        }
+      }
+    }
+  }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::erase(const_iterator _c_first, const_iterator _c_last)
+{
+  iterator& __first = (iterator&)_c_first;
+  iterator& __last = (iterator&)_c_last;
+  size_type __f_bucket = __first._M_cur ? 
+    _M_bkt_num(__first._M_cur->_M_val) : _M_buckets.size();
+  size_type __l_bucket = __last._M_cur ? 
+    _M_bkt_num(__last._M_cur->_M_val) : _M_buckets.size();
+  if (__first._M_cur == __last._M_cur)
+    return;
+  else if (__f_bucket == __l_bucket)
+    _M_erase_bucket(__f_bucket, __first._M_cur, __last._M_cur);
+  else {
+    _M_erase_bucket(__f_bucket, __first._M_cur, 0);
+    for (size_type __n = __f_bucket + 1; __n < __l_bucket; ++__n)
+      _M_erase_bucket(__n, 0);
+    if (__l_bucket != _M_buckets.size())
+      _M_erase_bucket(__l_bucket, __last._M_cur);
+  }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::resize(size_type __num_elements_hint)
+{
+  const size_type __old_n = _M_buckets.size();
+  if (__num_elements_hint > __old_n) {
+    const size_type __n = _M_next_size(__num_elements_hint);
+    if (__n > __old_n) {
+      _BucketVector __tmp(__n, (void*)(0),
+			  _M_buckets.get_allocator());
+      _STLP_TRY {
+        for (size_type __bucket = 0; __bucket < __old_n; ++__bucket) {
+          _Node* __first = (_Node*)_M_buckets[__bucket];
+          while (__first) {
+            size_type __new_bucket = _M_bkt_num(__first->_M_val, __n);
+            _M_buckets[__bucket] = __first->_M_next;
+            __first->_M_next = (_Node*)__tmp[__new_bucket];
+            __tmp[__new_bucket] = __first;
+            __first = (_Node*)_M_buckets[__bucket];          
+          }
+        }
+        _M_buckets.swap(__tmp);
+      }
+#         ifdef _STLP_USE_EXCEPTIONS
+      catch(...) {
+        for (size_type __bucket = 0; __bucket < __tmp.size(); ++__bucket) {
+          while (__tmp[__bucket]) {
+            _Node* __next = ((_Node*)__tmp[__bucket])->_M_next;
+            _M_delete_node((_Node*)__tmp[__bucket]);
+            __tmp[__bucket] = __next;
+          }
+        }
+        throw;
+      }
+#         endif /* _STLP_USE_EXCEPTIONS */
+    }
+  }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::_M_erase_bucket(const size_type __n, _Node* __first, _Node* __last)
+{
+  _Node* __cur = (_Node*)_M_buckets[__n];
+  if (__cur == __first)
+    _M_erase_bucket(__n, __last);
+  else {
+    _Node* __next;
+    for (__next = __cur->_M_next; 
+         __next != __first; 
+         __cur = __next, __next = __cur->_M_next)
+      ;
+    while (__next != __last) {
+      __cur->_M_next = __next->_M_next;
+      _M_delete_node(__next);
+      __next = __cur->_M_next;
+      --_M_num_elements._M_data;
+    }
+  }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::_M_erase_bucket(const size_type __n, _Node* __last)
+{
+  _Node* __cur = (_Node*)_M_buckets[__n];
+  while (__cur && __cur != __last) {
+    _Node* __next = __cur->_M_next;
+    _M_delete_node(__cur);
+    __cur = __next;
+    _M_buckets[__n] = __cur;
+    --_M_num_elements._M_data;
+  }
+}
+
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>::clear()
+{
+  for (size_type __i = 0; __i < _M_buckets.size(); ++__i) {
+    _Node* __cur = (_Node*)_M_buckets[__i];
+    while (__cur != 0) {
+      _Node* __next = __cur->_M_next;
+      _M_delete_node(__cur);
+      __cur = __next;
+    }
+    _M_buckets[__i] = 0;
+  }
+  _M_num_elements._M_data = 0;
+}
+
+    
+template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+void hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+  ::_M_copy_from(const hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>& __ht)
+{
+  _M_buckets.clear();
+  _M_buckets.reserve(__ht._M_buckets.size());
+  _M_buckets.insert(_M_buckets.end(), __ht._M_buckets.size(), (void*) 0);
+  _STLP_TRY {
+    for (size_type __i = 0; __i < __ht._M_buckets.size(); ++__i) {
+      const _Node* __cur = (_Node*)__ht._M_buckets[__i];
+      if (__cur) {
+        _Node* __xcopy = _M_new_node(__cur->_M_val);
+        _M_buckets[__i] = __xcopy;
+
+        for (_Node* __next = __cur->_M_next; 
+             __next; 
+             __cur = __next, __next = __cur->_M_next) {
+          __xcopy->_M_next = _M_new_node(__next->_M_val);
+          __xcopy = __xcopy->_M_next;
+        }
+      }
+    }
+    _M_num_elements._M_data = __ht._M_num_elements._M_data;
+  }
+  _STLP_UNWIND(clear());
+}
+
+# undef __iterator__ 
+# undef const_iterator
+# undef __size_type__
+# undef __reference__
+# undef size_type       
+# undef value_type      
+# undef key_type        
+# undef _Node            
+# undef __stl_num_primes
+# undef hashtable
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_HASHTABLE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_hashtable.h b/src/STLport/stl/_hashtable.h
new file mode 100644
index 0000000..9efe721
--- /dev/null
+++ b/src/STLport/stl/_hashtable.h
@@ -0,0 +1,613 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HASHTABLE_H
+#define _STLP_INTERNAL_HASHTABLE_H
+
+# ifndef _STLP_INTERNAL_VECTOR_H
+#  include <stl/_vector.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+#  include <stl/_function_base.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_HASH_FUN_H
+#  include <stl/_hash_fun.h>
+# endif
+
+// Hashtable class, used to implement the hashed associative containers
+// hash_set, hash_map, hash_multiset, and hash_multimap.
+
+#ifdef _STLP_DEBUG
+#  define hashtable __WORKAROUND_DBG_RENAME(hashtable)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Val>
+struct _Hashtable_node
+{
+  typedef _Hashtable_node<_Val> _Self;
+  _Self* _M_next;
+  _Val _M_val;
+  __TRIVIAL_STUFF(_Hashtable_node)
+};  
+
+// some compilers require the names of template parameters to be the same
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+class hashtable;
+
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+struct _Hashtable_iterator
+{
+  typedef hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+          _Hashtable;
+  typedef _Hashtable_node<_Val> _Node;
+
+  _Node* _M_cur;
+  _Hashtable* _M_ht;
+
+  _Hashtable_iterator(_Node* __n, _Hashtable* __tab) 
+    : _M_cur(__n), _M_ht(__tab) {}
+  _Hashtable_iterator() {}
+
+  _Node* _M_skip_to_next();
+};
+
+
+template <class _Val, class _Traits, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+struct _Ht_iterator : public _Hashtable_iterator< _Val, _Key,_HF, _ExK,_EqK,_All>
+{
+  
+  typedef _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All> _Base;
+
+  //  typedef _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All> iterator;
+  //  typedef _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All> const_iterator;
+  typedef _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All> _Self;
+
+  typedef hashtable<_Val,_Key,_HF,_ExK,_EqK,_All> _Hashtable;
+  typedef _Hashtable_node<_Val> _Node;
+
+  typedef _Val value_type;
+  typedef forward_iterator_tag iterator_category;
+  typedef ptrdiff_t difference_type;
+  typedef size_t size_type;
+  typedef typename _Traits::reference reference;
+  typedef typename _Traits::pointer   pointer;
+
+  _Ht_iterator(const _Node* __n, const _Hashtable* __tab) :
+    _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>((_Node*)__n, (_Hashtable*)__tab) {}
+  _Ht_iterator() {}
+  _Ht_iterator(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __it) : 
+    _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>(__it) {}
+
+  reference operator*() const { 
+      return this->_M_cur->_M_val; 
+  }
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  _Self& operator++() {
+    _Node* __n = this->_M_cur->_M_next;
+    this->_M_cur =  (__n !=0 ? __n : this->_M_skip_to_next());
+    return *this;
+  }
+  inline  _Self operator++(int) {
+     _Self __tmp = *this;
+    ++*this;
+    return __tmp;
+  }
+};
+
+template <class _Val, class _Traits, class _Traits1, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+inline bool 
+operator==(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>& __x, 
+	   const _Ht_iterator<_Val, _Traits1,_Key,_HF,_ExK,_EqK,_All>& __y) { 
+  return __x._M_cur == __y._M_cur; 
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+inline bool 
+operator!=(const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __x, 
+	   const _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>& __y) { 
+  return __x._M_cur != __y._M_cur; 
+}
+#else
+
+# if (defined (__GNUC__) && (__GNUC_MINOR__ < 8))
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+inline bool
+operator!=(const _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __x,
+           const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __y) {
+  return __x._M_cur != __y._M_cur;
+}
+# endif
+
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+inline bool 
+operator!=(const _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __x, 
+	   const _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>& __y) { 
+  return __x._M_cur != __y._M_cur; 
+}
+#endif
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Val, class _Traits, class _Key, class _HF, class _ExK, class _EqK, class _All>
+inline _Val* value_type(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>&) { return (_Val*) 0; }
+template <class _Val, class _Traits, class _Key, class _HF, class _ExK, class _EqK, class _All>
+inline forward_iterator_tag iterator_category(const _Ht_iterator<_Val, _Traits,_Key,_HF,_ExK,_EqK,_All>&) { return forward_iterator_tag(); }
+template <class _Val, class _Traits, class _Key, class _HF, class _ExK, class _EqK, class _All>
+inline ptrdiff_t* distance_type(const _Ht_iterator<_Val,_Traits,_Key,_HF,_ExK,_EqK,_All>&) { return (ptrdiff_t*) 0; }
+#endif
+
+#define __stl_num_primes  28
+template <class _Tp>
+class _Stl_prime {
+public:
+  static const size_t _M_list[__stl_num_primes];
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+_STLP_EXPORT_TEMPLATE_CLASS _Stl_prime<bool>;
+# endif
+
+typedef _Stl_prime<bool> _Stl_prime_type;
+
+
+// Hashtables handle allocators a bit differently than other containers
+//  do.  If we're using standard-conforming allocators, then a hashtable
+//  unconditionally has a member variable to hold its allocator, even if
+//  it so happens that all instances of the allocator type are identical.
+// This is because, for hashtables, this extra storage is negligible.  
+//  Additionally, a base class wouldn't serve any other purposes; it 
+//  wouldn't, for example, simplify the exception-handling code.
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+class hashtable {
+  typedef hashtable<_Val, _Key, _HF, _ExK, _EqK, _All> _Self;
+public:
+  typedef _Key key_type;
+  typedef _Val value_type;
+  typedef _HF hasher;
+  typedef _EqK key_equal;
+
+  typedef size_t            size_type;
+  typedef ptrdiff_t         difference_type;
+  typedef value_type*       pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type&       reference;
+  typedef const value_type& const_reference;
+  typedef forward_iterator_tag _Iterator_category;
+
+  hasher hash_funct() const { return _M_hash; }
+  key_equal key_eq() const { return _M_equals; }
+
+private:
+  typedef _Hashtable_node<_Val> _Node;
+
+private:
+  _STLP_FORCE_ALLOCATORS(_Val, _All)
+  typedef typename _Alloc_traits<_Node, _All>::allocator_type _M_node_allocator_type;
+  typedef typename _Alloc_traits<void*, _All>::allocator_type _M_node_ptr_allocator_type;
+  typedef __vector__<void*, _M_node_ptr_allocator_type> _BucketVector;
+public:
+  typedef typename _Alloc_traits<_Val,_All>::allocator_type allocator_type;
+  allocator_type get_allocator() const { 
+    return _STLP_CONVERT_ALLOCATOR((const _M_node_allocator_type&)_M_num_elements, _Val); 
+  }
+private:
+  hasher                _M_hash;
+  key_equal             _M_equals;
+  _ExK                  _M_get_key;
+  _BucketVector         _M_buckets;
+  _STLP_alloc_proxy<size_type, _Node, _M_node_allocator_type>  _M_num_elements;
+  const _Node* _M_get_bucket(size_t __n) const { return (_Node*)_M_buckets[__n]; }
+
+public:
+  typedef _Const_traits<_Val> __const_val_traits;
+  typedef _Nonconst_traits<_Val> __nonconst_val_traits;
+  typedef _Ht_iterator<_Val, __const_val_traits,_Key,_HF,_ExK,_EqK, _All> const_iterator;
+  typedef _Ht_iterator<_Val, __nonconst_val_traits,_Key,_HF,_ExK,_EqK,_All> iterator;
+  friend struct _Hashtable_iterator<_Val,_Key,_HF,_ExK,_EqK,_All>;
+  friend struct _Ht_iterator<_Val, _Nonconst_traits<_Val>,_Key,_HF,_ExK,_EqK,_All>;
+  friend struct _Ht_iterator<_Val, _Const_traits<_Val>,_Key,_HF,_ExK,_EqK, _All>;
+
+public:
+  hashtable(size_type __n,
+            const _HF&  __hf,
+            const _EqK& __eql,
+            const _ExK& __ext,
+            const allocator_type& __a = allocator_type())
+    :
+      _M_hash(__hf),
+      _M_equals(__eql),
+      _M_get_key(__ext),
+      _M_buckets(_STLP_CONVERT_ALLOCATOR(__a,void*)),
+      _M_num_elements(_STLP_CONVERT_ALLOCATOR(__a,_Node), (size_type)0)
+  {
+    _M_initialize_buckets(__n);
+  }
+
+  hashtable(size_type __n,
+            const _HF&    __hf,
+            const _EqK&   __eql,
+            const allocator_type& __a = allocator_type())
+    :
+      _M_hash(__hf),
+      _M_equals(__eql),
+      _M_get_key(_ExK()),
+      _M_buckets(_STLP_CONVERT_ALLOCATOR(__a,void*)),
+      _M_num_elements(_STLP_CONVERT_ALLOCATOR(__a,_Node), (size_type)0)
+  {
+    _M_initialize_buckets(__n);
+  }
+
+  hashtable(const _Self& __ht)
+    :
+      _M_hash(__ht._M_hash),
+      _M_equals(__ht._M_equals),
+      _M_get_key(__ht._M_get_key),
+      _M_buckets(_STLP_CONVERT_ALLOCATOR(__ht.get_allocator(),void*)),
+      _M_num_elements((const _M_node_allocator_type&)__ht._M_num_elements, (size_type)0)
+  {
+    _M_copy_from(__ht);
+  }
+
+  _Self& operator= (const _Self& __ht)
+  {
+    if (&__ht != this) {
+      clear();
+      _M_hash = __ht._M_hash;
+      _M_equals = __ht._M_equals;
+      _M_get_key = __ht._M_get_key;
+      _M_copy_from(__ht);
+    }
+    return *this;
+  }
+
+  ~hashtable() { clear(); }
+
+  size_type size() const { return _M_num_elements._M_data; }
+  size_type max_size() const { return size_type(-1); }
+  bool empty() const { return size() == 0; }
+
+  void swap(_Self& __ht)
+  {
+    _STLP_STD::swap(_M_hash, __ht._M_hash);
+    _STLP_STD::swap(_M_equals, __ht._M_equals);
+    _STLP_STD::swap(_M_get_key, __ht._M_get_key);
+    _M_buckets.swap(__ht._M_buckets);
+    _STLP_STD::swap(_M_num_elements, __ht._M_num_elements);
+  }
+
+  iterator begin()
+  { 
+    for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
+      if (_M_buckets[__n])
+        return iterator((_Node*)_M_buckets[__n], this);
+    return end();
+  }
+
+  iterator end() { return iterator((_Node*)0, this); }
+
+  const_iterator begin() const
+  {
+    for (size_type __n = 0; __n < _M_buckets.size(); ++__n)
+      if (_M_buckets[__n])
+        return const_iterator((_Node*)_M_buckets[__n], this);
+    return end();
+  }
+
+  const_iterator end() const { return const_iterator((_Node*)0, this); }
+
+  static bool _STLP_CALL _M_equal (const hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>&,
+			const hashtable<_Val, _Key, _HF, _ExK, _EqK, _All>&);
+
+public:
+
+  size_type bucket_count() const { return _M_buckets.size(); }
+
+  size_type max_bucket_count() const
+    { return _Stl_prime_type::_M_list[(int)__stl_num_primes - 1]; } 
+
+  size_type elems_in_bucket(size_type __bucket) const
+  {
+    size_type __result = 0;
+    for (_Node* __cur = (_Node*)_M_buckets[__bucket]; __cur; __cur = __cur->_M_next)
+      __result += 1;
+    return __result;
+  }
+
+  pair<iterator, bool> insert_unique(const value_type& __obj)
+  {
+    resize(_M_num_elements._M_data + 1);
+    return insert_unique_noresize(__obj);
+  }
+
+  iterator insert_equal(const value_type& __obj)
+  {
+    resize(_M_num_elements._M_data + 1);
+    return insert_equal_noresize(__obj);
+  }
+
+  pair<iterator, bool> insert_unique_noresize(const value_type& __obj);
+  iterator insert_equal_noresize(const value_type& __obj);
+ 
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert_unique(_InputIterator __f, _InputIterator __l)
+  {
+    insert_unique(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIterator));
+  }
+
+  template <class _InputIterator>
+  void insert_equal(_InputIterator __f, _InputIterator __l)
+  {
+    insert_equal(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIterator));
+  }
+
+  template <class _InputIterator>
+  void insert_unique(_InputIterator __f, _InputIterator __l,
+                     const input_iterator_tag &)
+  {
+    for ( ; __f != __l; ++__f)
+      insert_unique(*__f);
+  }
+
+  template <class _InputIterator>
+  void insert_equal(_InputIterator __f, _InputIterator __l,
+                    const input_iterator_tag &)
+  {
+    for ( ; __f != __l; ++__f)
+      insert_equal(*__f);
+  }
+
+  template <class _ForwardIterator>
+  void insert_unique(_ForwardIterator __f, _ForwardIterator __l,
+                     const forward_iterator_tag &)
+  {
+    size_type __n = distance(__f, __l);
+    resize(_M_num_elements._M_data + __n);
+    for ( ; __n > 0; --__n, ++__f)
+      insert_unique_noresize(*__f);
+  }
+
+  template <class _ForwardIterator>
+  void insert_equal(_ForwardIterator __f, _ForwardIterator __l,
+                    const forward_iterator_tag &)
+  {
+    size_type __n = distance(__f, __l);
+    resize(_M_num_elements._M_data + __n);
+    for ( ; __n > 0; --__n, ++__f)
+      insert_equal_noresize(*__f);
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert_unique(const value_type* __f, const value_type* __l)
+  {
+    size_type __n = __l - __f;
+    resize(_M_num_elements._M_data + __n);
+    for ( ; __n > 0; --__n, ++__f)
+      insert_unique_noresize(*__f);
+  }
+
+  void insert_equal(const value_type* __f, const value_type* __l)
+  {
+    size_type __n = __l - __f;
+    resize(_M_num_elements._M_data + __n);
+    for ( ; __n > 0; --__n, ++__f)
+      insert_equal_noresize(*__f);
+  }
+
+  void insert_unique(const_iterator __f, const_iterator __l)
+  {
+    size_type __n = distance(__f, __l);
+    resize(_M_num_elements._M_data + __n);
+    for ( ; __n > 0; --__n, ++__f)
+      insert_unique_noresize(*__f);
+  }
+
+  void insert_equal(const_iterator __f, const_iterator __l)
+  {
+    size_type __n = distance(__f, __l);
+    resize(_M_num_elements._M_data + __n);
+    for ( ; __n > 0; --__n, ++__f)
+      insert_equal_noresize(*__f);
+  }
+#endif /*_STLP_MEMBER_TEMPLATES */
+
+  reference find_or_insert(const value_type& __obj);
+
+private:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )  && !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC_)))
+  template <class _KT> 
+   _Node* _M_find(const _KT& __key) const
+# else
+   _Node* _M_find(const key_type& __key) const
+# endif
+  {
+    size_type __n = _M_hash(__key)% _M_buckets.size();
+    _Node* __first;
+    for ( __first = (_Node*)_M_buckets[__n];
+          __first && !_M_equals(_M_get_key(__first->_M_val), __key);
+          __first = __first->_M_next)
+      {}
+    return __first;
+  } 
+
+public:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )  && !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)))
+  template <class _KT> 
+  iterator find(const _KT& __key) 
+# else
+  iterator find(const key_type& __key) 
+# endif
+  {
+    return iterator(_M_find(__key), this);
+  } 
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )  && !(defined(__MRC__)||(defined(__SC__)&&!defined(__DMC__)))
+  template <class _KT> 
+  const_iterator find(const _KT& __key) const
+# else
+  const_iterator find(const key_type& __key) const
+# endif
+  {
+    return const_iterator(_M_find(__key), this);
+  } 
+
+  size_type count(const key_type& __key) const
+  {
+    const size_type __n = _M_bkt_num_key(__key);
+    size_type __result = 0;
+
+    for (const _Node* __cur = (_Node*)_M_buckets[__n]; __cur; __cur = __cur->_M_next)
+      if (_M_equals(_M_get_key(__cur->_M_val), __key))
+        ++__result;
+    return __result;
+  }
+
+  pair<iterator, iterator> 
+  equal_range(const key_type& __key);
+
+  pair<const_iterator, const_iterator> 
+  equal_range(const key_type& __key) const;
+
+  size_type erase(const key_type& __key);
+  //   void erase(const iterator& __it); `
+  void erase(const const_iterator& __it) ;
+
+  //  void erase(const const_iterator& __first, const const_iterator __last) {
+  //     erase((const iterator&)__first, (const iterator&)__last);
+  //  }
+  void erase(const_iterator __first, const_iterator __last);
+  void resize(size_type __num_elements_hint);
+  void clear();
+
+public:
+  // this is for hash_map::operator[]
+  reference _M_insert(const value_type& __obj);
+
+private:
+
+  size_type _M_next_size(size_type __n) const;
+
+  void _M_initialize_buckets(size_type __n)
+  {
+    const size_type __n_buckets = _M_next_size(__n);
+    _M_buckets.reserve(__n_buckets);
+    _M_buckets.insert(_M_buckets.end(), __n_buckets, (void*) 0);
+    _M_num_elements._M_data = 0;
+  }
+
+  size_type _M_bkt_num_key(const key_type& __key) const
+  {
+    return _M_bkt_num_key(__key, _M_buckets.size());
+  }
+
+  size_type _M_bkt_num(const value_type& __obj) const
+  {
+    return _M_bkt_num_key(_M_get_key(__obj));
+  }
+
+  size_type _M_bkt_num_key(const key_type& __key, size_t __n) const
+  {
+    return _M_hash(__key) % __n;
+  }
+
+  size_type _M_bkt_num(const value_type& __obj, size_t __n) const
+  {
+    return _M_bkt_num_key(_M_get_key(__obj), __n);
+  }
+
+  _Node* _M_new_node(const value_type& __obj)
+  {
+    _Node* __n = _M_num_elements.allocate(1);
+    __n->_M_next = 0;
+    _STLP_TRY {
+      _Construct(&__n->_M_val, __obj);
+      //      return __n;
+    }
+    _STLP_UNWIND(_M_num_elements.deallocate(__n, 1));
+    return __n;
+  }
+  
+  void _M_delete_node(_Node* __n)
+  {
+    _STLP_STD::_Destroy(&__n->_M_val);
+    _M_num_elements.deallocate(__n, 1);
+  }
+
+  void _M_erase_bucket(const size_type __n, _Node* __first, _Node* __last);
+  void _M_erase_bucket(const size_type __n, _Node* __last);
+
+  void _M_copy_from(const _Self& __ht);
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+#define _STLP_TEMPLATE_CONTAINER hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+#include <stl/_relops_hash_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+# undef hashtable
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_hashtable.c>
+# endif
+
+# if defined (_STLP_DEBUG)
+#  include <stl/debug/_hashtable.h>
+# endif
+
+#endif /* _STLP_INTERNAL_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/_heap.c b/src/STLport/stl/_heap.c
new file mode 100644
index 0000000..21e087c
--- /dev/null
+++ b/src/STLport/stl/_heap.c
@@ -0,0 +1,242 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_HEAP_C
+#define _STLP_HEAP_C
+
+#ifndef _STLP_INTERNAL_HEAP_H
+# include <stl/_heap.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+_STLP_INLINE_LOOP
+void 
+__push_heap(_RandomAccessIterator __first,
+            _Distance __holeIndex, _Distance __topIndex, _Tp __val)
+{
+  _Distance __parent = (__holeIndex - 1) / 2;
+  while (__holeIndex > __topIndex && *(__first + __parent) < __val) {
+    *(__first + __holeIndex) = *(__first + __parent);
+    __holeIndex = __parent;
+    __parent = (__holeIndex - 1) / 2;
+  }    
+  *(__first + __holeIndex) = __val;
+}
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+inline void 
+__push_heap_aux(_RandomAccessIterator __first,
+                _RandomAccessIterator __last, _Distance*, _Tp*)
+{
+  __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
+              _Tp(*(__last - 1)));
+}
+
+template <class _RandomAccessIterator>
+void 
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+{
+  __push_heap_aux(__first, __last,
+                  _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator), _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
+}
+
+
+template <class _RandomAccessIterator, class _Distance, class _Tp, 
+          class _Compare>
+_STLP_INLINE_LOOP
+void
+__push_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+            _Distance __topIndex, _Tp __val, _Compare __comp)
+{
+  _Distance __parent = (__holeIndex - 1) / 2;
+  while (__holeIndex > __topIndex && __comp(*(__first + __parent), __val)) {
+    *(__first + __holeIndex) = *(__first + __parent);
+    __holeIndex = __parent;
+    __parent = (__holeIndex - 1) / 2;
+  }
+  *(__first + __holeIndex) = __val;
+}
+
+template <class _RandomAccessIterator, class _Compare,
+          class _Distance, class _Tp>
+inline void 
+__push_heap_aux(_RandomAccessIterator __first,
+                _RandomAccessIterator __last, _Compare __comp,
+                _Distance*, _Tp*) 
+{
+  __push_heap(__first, _Distance((__last - __first) - 1), _Distance(0), 
+              _Tp(*(__last - 1)), __comp);
+}
+
+template <class _RandomAccessIterator, class _Compare>
+void 
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+          _Compare __comp) 
+{
+  __push_heap_aux(__first, __last, __comp,
+                  _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator), _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+void 
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+              _Distance __len, _Tp __val) {
+  _Distance __topIndex = __holeIndex;
+  _Distance __secondChild = 2 * __holeIndex + 2;
+  while (__secondChild < __len) {
+    if (*(__first + __secondChild) < *(__first + (__secondChild - 1)))
+      __secondChild--;
+    *(__first + __holeIndex) = *(__first + __secondChild);
+    __holeIndex = __secondChild;
+    __secondChild = 2 * (__secondChild + 1);
+  }
+  if (__secondChild == __len) {
+    *(__first + __holeIndex) = *(__first + (__secondChild - 1));
+    __holeIndex = __secondChild - 1;
+  }
+  __push_heap(__first, __holeIndex, __topIndex, __val);
+}
+
+
+template <class _RandomAccessIterator, class _Tp>
+inline void 
+__pop_heap_aux(_RandomAccessIterator __first, _RandomAccessIterator __last, _Tp*) {
+  __pop_heap(__first, __last - 1, __last - 1, 
+             _Tp(*(__last - 1)), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator>
+void pop_heap(_RandomAccessIterator __first, 
+	      _RandomAccessIterator __last) {
+  __pop_heap_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator, class _Distance,
+          class _Tp, class _Compare>
+void
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+              _Distance __len, _Tp __val, _Compare __comp)
+{
+  _Distance __topIndex = __holeIndex;
+  _Distance __secondChild = 2 * __holeIndex + 2;
+  while (__secondChild < __len) {
+    if (__comp(*(__first + __secondChild), *(__first + (__secondChild - 1))))
+      __secondChild--;
+    *(__first + __holeIndex) = *(__first + __secondChild);
+    __holeIndex = __secondChild;
+    __secondChild = 2 * (__secondChild + 1);
+  }
+  if (__secondChild == __len) {
+    *(__first + __holeIndex) = *(__first + (__secondChild - 1));
+    __holeIndex = __secondChild - 1;
+  }
+  __push_heap(__first, __holeIndex, __topIndex, __val, __comp);
+}
+
+
+template <class _RandomAccessIterator, class _Tp, class _Compare>
+inline void 
+__pop_heap_aux(_RandomAccessIterator __first,
+               _RandomAccessIterator __last, _Tp*, _Compare __comp)
+{
+  __pop_heap(__first, __last - 1, __last - 1, _Tp(*(__last - 1)), __comp,
+             _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+
+template <class _RandomAccessIterator, class _Compare>
+void 
+pop_heap(_RandomAccessIterator __first,
+         _RandomAccessIterator __last, _Compare __comp)
+{
+    __pop_heap_aux(__first, __last, _STLP_VALUE_TYPE(__first, _RandomAccessIterator), __comp);
+}
+
+template <class _RandomAccessIterator, class _Tp, class _Distance>
+_STLP_INLINE_LOOP
+void 
+__make_heap(_RandomAccessIterator __first,
+            _RandomAccessIterator __last, _Tp*, _Distance*)
+{
+  if (__last - __first < 2) return;
+  _Distance __len = __last - __first;
+  _Distance __parent = (__len - 2)/2;
+    
+  while (true) {
+    __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)));
+    if (__parent == 0) return;
+    __parent--;
+  }
+}
+
+template <class _RandomAccessIterator>
+void 
+make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+{
+  __make_heap(__first, __last,
+              _STLP_VALUE_TYPE(__first, _RandomAccessIterator), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+template <class _RandomAccessIterator, class _Compare,
+          class _Tp, class _Distance>
+_STLP_INLINE_LOOP
+void
+__make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+            _Compare __comp, _Tp*, _Distance*)
+{
+  if (__last - __first < 2) return;
+  _Distance __len = __last - __first;
+  _Distance __parent = (__len - 2)/2;
+    
+  while (true) {
+    __adjust_heap(__first, __parent, __len, _Tp(*(__first + __parent)),
+                  __comp);
+    if (__parent == 0) return;
+    __parent--;
+  }
+}
+
+template <class _RandomAccessIterator, class _Compare>
+void 
+make_heap(_RandomAccessIterator __first, 
+          _RandomAccessIterator __last, _Compare __comp)
+{
+  __make_heap(__first, __last, __comp,
+              _STLP_VALUE_TYPE(__first, _RandomAccessIterator), _STLP_DISTANCE_TYPE(__first, _RandomAccessIterator));
+}
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_HEAP_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_heap.h b/src/STLport/stl/_heap.h
new file mode 100644
index 0000000..fbf6337
--- /dev/null
+++ b/src/STLport/stl/_heap.h
@@ -0,0 +1,129 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_HEAP_H
+#define _STLP_INTERNAL_HEAP_H
+
+#ifndef _STLP_CONFIG_H
+#include <stl/_config.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Heap-manipulation functions: push_heap, pop_heap, make_heap, sort_heap.
+
+template <class _RandomAccessIterator>
+void 
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last);
+
+
+template <class _RandomAccessIterator, class _Compare>
+void 
+push_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+          _Compare __comp);
+
+template <class _RandomAccessIterator, class _Distance, class _Tp>
+void 
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+              _Distance __len, _Tp __val);
+
+template <class _RandomAccessIterator, class _Tp, class _Distance>
+inline void 
+__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+           _RandomAccessIterator __result, _Tp __val, _Distance*)
+{
+  *__result = *__first;
+  __adjust_heap(__first, _Distance(0), _Distance(__last - __first), __val);
+}
+
+template <class _RandomAccessIterator>
+void pop_heap(_RandomAccessIterator __first, 
+	      _RandomAccessIterator __last);
+
+template <class _RandomAccessIterator, class _Distance,
+          class _Tp, class _Compare>
+void
+__adjust_heap(_RandomAccessIterator __first, _Distance __holeIndex,
+              _Distance __len, _Tp __val, _Compare __comp);
+
+template <class _RandomAccessIterator, class _Tp, class _Compare, 
+          class _Distance>
+inline void 
+__pop_heap(_RandomAccessIterator __first, _RandomAccessIterator __last,
+           _RandomAccessIterator __result, _Tp __val, _Compare __comp,
+           _Distance*)
+{
+  *__result = *__first;
+  __adjust_heap(__first, _Distance(0), _Distance(__last - __first), 
+                __val, __comp);
+}
+
+template <class _RandomAccessIterator, class _Compare>
+void 
+pop_heap(_RandomAccessIterator __first,
+         _RandomAccessIterator __last, _Compare __comp);
+
+template <class _RandomAccessIterator>
+void 
+make_heap(_RandomAccessIterator __first, _RandomAccessIterator __last);
+
+template <class _RandomAccessIterator, class _Compare>
+void 
+make_heap(_RandomAccessIterator __first, 
+          _RandomAccessIterator __last, _Compare __comp);
+
+template <class _RandomAccessIterator>
+_STLP_INLINE_LOOP
+void sort_heap(_RandomAccessIterator __first, _RandomAccessIterator __last)
+{
+  while (__last - __first > 1)
+    pop_heap(__first, __last--);
+}
+
+template <class _RandomAccessIterator, class _Compare>
+_STLP_INLINE_LOOP
+void 
+sort_heap(_RandomAccessIterator __first,
+          _RandomAccessIterator __last, _Compare __comp)
+{
+  while (__last - __first > 1)
+    pop_heap(__first, __last--, __comp);
+}
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_heap.c>
+# endif
+
+#endif /* _STLP_INTERNAL_HEAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ios.c b/src/STLport/stl/_ios.c
new file mode 100644
index 0000000..04076f0
--- /dev/null
+++ b/src/STLport/stl/_ios.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_IOS_C
+#define _STLP_IOS_C
+
+#ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h>
+#endif
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// basic_ios<>'s non-inline member functions
+
+// Public constructor, taking a streambuf.
+template <class _CharT, class _Traits>
+basic_ios<_CharT, _Traits>
+  ::basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf)
+    : ios_base(),
+      _M_fill(_STLP_NULL_CHAR_INIT(_CharT)), _M_streambuf(0), _M_tied_ostream(0)
+{
+  init(__streambuf);
+}
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>*
+basic_ios<_CharT, _Traits>::rdbuf(basic_streambuf<_CharT, _Traits>* __buf)
+{
+  basic_streambuf<_CharT, _Traits>* __tmp = _M_streambuf;
+  _M_streambuf = __buf;
+  this->clear();
+  return __tmp;
+}
+
+template <class _CharT, class _Traits>
+basic_ios<_CharT, _Traits>&
+basic_ios<_CharT, _Traits>::copyfmt(const basic_ios<_CharT, _Traits>& __x)
+{
+  _M_invoke_callbacks(erase_event);
+  _M_copy_state(__x);           // Inherited from ios_base.
+  _M_fill = __x._M_fill;
+  _M_tied_ostream = __x._M_tied_ostream;
+  _M_invoke_callbacks(copyfmt_event);
+  this->_M_set_exception_mask(__x.exceptions());
+  return *this;
+}
+
+template <class _CharT, class _Traits>
+locale basic_ios<_CharT, _Traits>::imbue(const locale& __loc)
+{
+  locale __tmp = ios_base::imbue(__loc);
+
+  if (_M_streambuf)
+    _M_streambuf->pubimbue(__loc);
+
+  // no throwing here
+  this->_M_cached_ctype = __loc._M_get_facet(ctype<char_type>::id) ;
+  this->_M_cached_numpunct = __loc._M_get_facet(numpunct<char_type>::id) ;
+  this->_M_cached_grouping = ((numpunct<char_type>*)_M_cached_numpunct)->grouping() ;
+  return __tmp;
+}
+
+// Protected constructor and initialization functions. The default
+// constructor creates an uninitialized basic_ios, and init() initializes
+// all of the members to the values in Table 89 of the C++ standard.
+
+template <class _CharT, class _Traits>
+basic_ios<_CharT, _Traits>::basic_ios()
+  : ios_base(),
+    _M_fill(_STLP_NULL_CHAR_INIT(_CharT)), _M_streambuf(0), _M_tied_ostream(0)
+{}
+
+template <class _CharT, class _Traits>
+void
+basic_ios<_CharT, _Traits>::init(basic_streambuf<_CharT, _Traits>* __sb)
+{
+  this->rdbuf(__sb);
+  this->imbue(locale());
+  this->tie(0);
+  this->_M_set_exception_mask(ios_base::goodbit);
+  this->_M_clear_nothrow(__sb != 0 ? ios_base::goodbit : ios_base::badbit);
+  ios_base::flags(ios_base::skipws | ios_base::dec);
+  ios_base::width(0);
+  ios_base::precision(6);
+  this->fill(widen(' '));
+  // We don't need to worry about any of the three arrays: they are
+  // initialized correctly in ios_base's constructor.
+}
+
+// This is never called except from within a catch clause.
+template <class _CharT, class _Traits>
+void basic_ios<_CharT, _Traits>::_M_handle_exception(ios_base::iostate __flag)
+{
+  this->_M_setstate_nothrow(__flag);
+  if (this->_M_get_exception_mask() & __flag)
+    _STLP_RETHROW;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_IOS_C */
diff --git a/src/STLport/stl/_ios.h b/src/STLport/stl/_ios.h
new file mode 100644
index 0000000..af0e5e9
--- /dev/null
+++ b/src/STLport/stl/_ios.h
@@ -0,0 +1,199 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_INTERNAL_IOS_H
+#define _STLP_INTERNAL_IOS_H
+
+
+#ifndef _STLP_IOS_BASE_H
+# include <stl/_ios_base.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// ----------------------------------------------------------------------
+
+// Class basic_ios, a subclass of ios_base.  The only important difference
+// between the two is that basic_ios is a class template, parameterized
+// by the character type.  ios_base exists to factor out all of the
+// common properties that don't depend on the character type.
+
+// The second template parameter, _Traits, defaults to char_traits<_CharT>.
+// The default is declared in header <iosfwd>, and it isn't declared here
+// because C++ language rules do not allow it to be declared twice.
+
+template <class _CharT, class _Traits>
+class basic_ios : public ios_base {
+  friend class ios_base;
+public:                         // Synonyms for types.
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+public:                         // Constructor, destructor.
+  explicit basic_ios(basic_streambuf<_CharT, _Traits>* __streambuf);
+  virtual ~basic_ios() {}
+
+public:                         // Members from clause 27.4.4.2
+  basic_ostream<_CharT, _Traits>* tie() const {
+    return _M_tied_ostream;
+  }
+  basic_ostream<_CharT, _Traits>*
+  tie(basic_ostream<char_type, traits_type>* __new_tied_ostream) {
+    basic_ostream<char_type, traits_type>* __tmp = _M_tied_ostream;
+    _M_tied_ostream = __new_tied_ostream;
+    return __tmp;
+  }
+
+  basic_streambuf<_CharT, _Traits>* rdbuf() const
+    { return _M_streambuf; }
+
+  basic_streambuf<_CharT, _Traits>*
+  rdbuf(basic_streambuf<char_type, traits_type>*);
+
+  // Copies __x's state to *this.
+  basic_ios<_CharT, _Traits>& copyfmt(const basic_ios<_CharT, _Traits>& __x);
+
+  char_type fill() const { return _M_fill; }
+  char_type fill(char_type __fill) {
+    char_type __tmp(_M_fill);
+    _M_fill = __fill;
+    return __tmp;
+  }
+
+public:                         // Members from 27.4.4.3.  These four functions
+                                // can almost be defined in ios_base.
+
+  void clear(iostate __state = goodbit) {
+    _M_clear_nothrow(this->rdbuf() ? __state : iostate(__state|ios_base::badbit));
+    _M_check_exception_mask();
+  }
+  void setstate(iostate __state) { this->clear(rdstate() | __state); }
+
+  iostate exceptions() const { return this->_M_get_exception_mask(); }
+  void exceptions(iostate __mask) {
+    this->_M_set_exception_mask(__mask);
+    this->clear(this->rdstate());
+  }
+
+public:                         // Locale-related member functions.
+  locale imbue(const locale&);
+
+  inline char narrow(_CharT, char) const ;
+  inline _CharT widen(char) const; 
+
+  // Helper function that makes testing for EOF more convenient.
+  static bool _STLP_CALL _S_eof(int_type __c) {
+    const int_type __eof = _Traits::eof();
+    return _Traits::eq_int_type(__c, __eof);
+  }
+
+protected:
+  basic_ios();
+
+  void init(basic_streambuf<_CharT, _Traits>* __streambuf);
+
+public:
+  
+  // Helper function used in istream and ostream.  It is called only from
+  // a catch clause.
+  void _M_handle_exception(ios_base::iostate __flag);
+  
+private:                        // Data members
+  char_type _M_fill;            // The fill character, used for padding.
+
+  basic_streambuf<_CharT, _Traits>* _M_streambuf;
+  basic_ostream<_CharT, _Traits>*   _M_tied_ostream;
+
+};
+
+
+template <class _CharT, class _Traits>
+inline char 
+basic_ios<_CharT, _Traits>::narrow(_CharT __c, char __default) const
+{ return ((const ctype<_CharT>*)this->_M_ctype_facet())->narrow(__c, __default); }
+
+template <class _CharT, class _Traits>
+inline _CharT 
+basic_ios<_CharT, _Traits>::widen(char __c) const
+{ 
+  return ((const ctype<_CharT>*)this->_M_ctype_facet())->widen(__c); }
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ios<char, char_traits<char> >;
+#  if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ios<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# if !defined (_STLP_NO_METHOD_SPECIALIZATION)
+_STLP_TEMPLATE_NULL
+inline char
+basic_ios<char, char_traits<char> >::narrow(char __c, char) const
+{
+  return __c;
+}
+
+_STLP_TEMPLATE_NULL
+inline char
+basic_ios<char, char_traits<char> >::widen(char __c) const
+{
+  return __c;
+}
+# endif /* _STLP_NO_METHOD_SPECIALIZATION */
+
+
+_STLP_END_NAMESPACE
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_ios.c>
+# endif
+
+// The following is needed to ensure that the inlined _Stl_loc_init functions
+// that ios_base::_Loc_init::_Loc_init() calls are found eventually.
+// Otherwise, undefined externs may be caused.
+
+#if defined(__BORLANDC__) && defined(_RTLDLL)
+# ifndef _STLP_INTERNAL_NUM_PUT_H
+#  include <stl/_num_put.h>
+# endif
+# ifndef _STLP_INTERNAL_NUM_GET_H
+#   include <stl/_num_get.h>
+# endif
+# ifndef _STLP_INTERNAL_MONETARY_H
+#  include <stl/_monetary.h>
+# endif
+# ifndef _STLP_INTERNAL_TIME_FACETS_H
+#  include <stl/_time_facets.h>
+# endif
+#endif
+
+#endif /* _STLP_IOS */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_ios_base.h b/src/STLport/stl/_ios_base.h
new file mode 100644
index 0000000..e7ef38e
--- /dev/null
+++ b/src/STLport/stl/_ios_base.h
@@ -0,0 +1,403 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_IOS_BASE_H
+#define _STLP_IOS_BASE_H
+
+#ifndef _STLP_STDEXCEPT
+#include <stdexcept>
+#endif
+#ifndef _STLP_UTILITY
+#include <utility>
+#endif
+#ifndef _STLP_INTERNAL_LOCALE_H
+#include <stl/_locale.h>
+#endif
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// ----------------------------------------------------------------------
+
+// Class ios_base.  This is the base class of the ios hierarchy, which
+// includes basic_istream and basic_ostream.  Classes in the ios
+// hierarchy are actually quite simple: they are just glorified
+// wrapper classes.  They delegate buffering and physical character
+// manipulation to the streambuf classes, and they delegate most
+// formatting tasks to a locale.
+
+class _STLP_CLASS_DECLSPEC ios_base {
+public:
+  
+  class _STLP_CLASS_DECLSPEC failure : public __Named_exception {
+  public:
+    explicit failure(const string&);
+    virtual ~failure() _STLP_NOTHROW_INHERENTLY;
+  };
+
+  typedef int fmtflags;
+  typedef int iostate;
+  typedef int openmode;
+  typedef int seekdir;
+
+# ifndef _STLP_NO_ANACHRONISMS
+  typedef fmtflags fmt_flags;
+# endif
+
+  // Formatting flags.
+# ifdef _STLP_STATIC_CONST_INIT_BUG
+  enum  {
+# else
+  // boris : type for all those constants is int   
+  static const int
+# endif
+    left       = 0x0001,
+    right      = 0x0002,
+    internal   = 0x0004,
+    dec        = 0x0008,
+    hex        = 0x0010,
+    oct        = 0x0020,
+    fixed      = 0x0040,
+    scientific = 0x0080,
+    boolalpha  = 0x0100,
+    showbase   = 0x0200,
+    showpoint  = 0x0400,
+    showpos    = 0x0800,
+    skipws     = 0x1000,
+    unitbuf    = 0x2000,
+    uppercase  = 0x4000,
+    adjustfield = left | right | internal,
+    basefield   = dec | hex | oct,
+    floatfield  = scientific | fixed,
+    
+    // State flags.
+    goodbit = 0x00,
+    badbit  = 0x01,
+    eofbit  = 0x02,
+    failbit = 0x04,
+    
+    // Openmode flags.
+    __default_mode = 0x0, /* implementation detail */
+    app    = 0x01,
+    ate    = 0x02,
+    binary = 0x04,
+    in     = 0x08,
+    out    = 0x10,
+    trunc  = 0x20,
+    
+    // Seekdir flags
+    
+    beg = 0x01,
+    cur = 0x02,
+    end = 0x04
+# ifdef _STLP_STATIC_CONST_INIT_BUG
+  }
+# endif
+  ;
+
+public:                         // Flag-manipulation functions.
+  fmtflags flags() const { return _M_fmtflags; }
+  fmtflags flags(fmtflags __flags) {
+    fmtflags __tmp = _M_fmtflags;
+    _M_fmtflags = __flags;
+    return __tmp;
+  }
+
+  fmtflags setf(fmtflags __flag) {
+    fmtflags __tmp = _M_fmtflags;
+    _M_fmtflags |= __flag;
+    return __tmp;
+  }
+  fmtflags setf(fmtflags __flag, fmtflags __mask) {
+    fmtflags __tmp = _M_fmtflags;
+    _M_fmtflags &= ~__mask;
+    _M_fmtflags |= __flag & __mask;
+    return __tmp;
+  }
+  void unsetf(fmtflags __mask) { _M_fmtflags &= ~__mask; }
+
+  streamsize precision() const { return _M_precision; }
+  streamsize precision(streamsize __newprecision) {
+    streamsize __tmp = _M_precision;
+    _M_precision = __newprecision;
+    return __tmp;
+  }
+
+  streamsize width() const { return _M_width; }
+  streamsize width(streamsize __newwidth) {
+    streamsize __tmp = _M_width;
+    _M_width = __newwidth;
+    return __tmp;
+  }
+
+public:                         // Locales
+  locale imbue(const locale&);
+  locale getloc() const { return _M_locale; }
+
+public:                         // Auxiliary storage.
+  static int _STLP_CALL xalloc();
+  long&  iword(int __index);
+  void*& pword(int __index);
+
+public:                         // Destructor.
+  virtual ~ios_base();
+
+public:                         // Callbacks.
+  enum event { erase_event, imbue_event, copyfmt_event };
+  typedef void (*event_callback)(event, ios_base&, int __index);
+  void register_callback(event_callback __fn, int __index);
+
+public:                         // This member function affects only
+                                // the eight predefined ios objects:
+                                // cin, cout, etc.
+  static bool _STLP_CALL sync_with_stdio(bool __sync = true);
+
+public:                         // The C++ standard requires only that these
+                                // member functions be defined in basic_ios.
+                                // We define them in the non-template
+                                // base class to avoid code duplication.
+  operator void*() const { return !fail() ? (void*) __CONST_CAST(ios_base*,this) : (void*) 0; }
+  bool operator!() const { return fail(); }
+
+  iostate rdstate() const { return _M_iostate; }
+
+  bool good() const { return _M_iostate == 0; }
+  bool eof() const { return (_M_iostate & eofbit) != 0; }
+  bool fail() const { return (_M_iostate & (failbit | badbit)) != 0; }
+  bool bad() const { return (_M_iostate & badbit) != 0; }
+
+protected:                      // The functional protected interface.
+
+  // Copies the state of __x to *this.  This member function makes it
+  // possible to implement basic_ios::copyfmt without having to expose
+  // ios_base's private data members.  Does not copy _M_exception_mask
+  // or _M_iostate.
+  void _M_copy_state(const ios_base& __x);
+
+  void _M_setstate_nothrow(iostate __state) { _M_iostate |= __state; }
+  void _M_clear_nothrow(iostate __state) { _M_iostate = __state; }
+  iostate _M_get_exception_mask() const { return _M_exception_mask; }
+  void _M_set_exception_mask(iostate __mask) { _M_exception_mask = __mask; }
+  void _M_check_exception_mask() { 
+    if (_M_iostate & _M_exception_mask)
+      _M_throw_failure(); 
+  }
+
+  void _M_invoke_callbacks(event);
+  void _M_throw_failure();
+
+  ios_base();                   // Default constructor.
+
+protected:                        // Initialization of the I/O system
+  static void _STLP_CALL _S_initialize();
+  static void _STLP_CALL _S_uninitialize();
+  static bool _S_was_synced;
+  
+private:                        // Invalidate the copy constructor and
+                                // assignment operator.
+  ios_base(const ios_base&);
+  void operator=(const ios_base&);
+
+private:                        // Data members.
+
+  fmtflags _M_fmtflags;         // Flags
+  iostate _M_iostate;
+  openmode _M_openmode;
+  seekdir _M_seekdir;
+  iostate _M_exception_mask;
+
+  streamsize _M_precision;
+  streamsize _M_width;
+
+  locale _M_locale;
+
+  pair<event_callback, int>* _M_callbacks;
+  size_t _M_num_callbacks;      // Size of the callback array.
+  size_t _M_callback_index;     // Index of the next available callback;
+                                // initially zero.
+
+  long* _M_iwords;              // Auxiliary storage.  The count is zero
+  size_t _M_num_iwords;         // if and only if the pointer is null.
+
+  void** _M_pwords;
+  size_t _M_num_pwords;
+
+  static int _S_index;
+
+protected:
+  // Cached copies of the curent locale's facets.  Set by init() and imbue().
+  locale::facet* _M_cached_ctype;
+  locale::facet* _M_cached_numpunct;
+  string         _M_cached_grouping;
+public:
+  // Equivalent to &use_facet< Facet >(getloc()), but faster.
+  const locale::facet* _M_ctype_facet() const { return _M_cached_ctype; }
+  const locale::facet* _M_numpunct_facet() const { return _M_cached_numpunct; }
+  const string&  _M_grouping() const { return _M_cached_grouping; }
+public:
+
+  // ----------------------------------------------------------------------
+  // Nested initializer class.  This is an implementation detail, but it's
+  // prescribed by the standard.  The static initializer object (on 
+  // implementations where such a thing is required) is declared in
+  // <iostream>
+  
+  class _STLP_CLASS_DECLSPEC Init {
+  public:
+    Init();
+    ~Init();
+  private:
+    static long _S_count;
+    friend class ios_base;
+  };
+
+  // this class is needed to ensure locale initialization w/o <iostream> inclusion
+  class _STLP_CLASS_DECLSPEC _Loc_init {
+  public:
+    _Loc_init();
+    ~_Loc_init();
+  private:
+    static long _S_count;
+    friend class locale;
+    friend class ios_base;
+  };
+
+  friend class Init;
+
+public:
+# ifndef _STLP_NO_ANACHRONISMS
+  //  31.6  Old iostreams members                         [depr.ios.members]
+  typedef iostate  io_state;
+  typedef openmode open_mode;
+  typedef seekdir  seek_dir;
+  typedef _STLP_STD::streamoff  streamoff;
+  typedef _STLP_STD::streampos  streampos;
+# endif  
+};
+
+// ----------------------------------------------------------------------
+// ios_base manipulator functions, from section 27.4.5 of the C++ standard.
+// All of them are trivial one-line wrapper functions.
+
+// fmtflag manipulators, section 27.4.5.1
+inline ios_base& _STLP_CALL boolalpha(ios_base& __s)
+  { __s.setf(ios_base::boolalpha); return __s;}
+
+inline ios_base& _STLP_CALL noboolalpha(ios_base& __s)
+  { __s.unsetf(ios_base::boolalpha); return __s;}
+
+inline ios_base& _STLP_CALL showbase(ios_base& __s)
+  { __s.setf(ios_base::showbase); return __s;}
+
+inline ios_base& _STLP_CALL noshowbase(ios_base& __s)
+  { __s.unsetf(ios_base::showbase); return __s;}
+
+inline ios_base& _STLP_CALL showpoint(ios_base& __s)
+  { __s.setf(ios_base::showpoint); return __s;}
+
+inline ios_base& _STLP_CALL noshowpoint(ios_base& __s)
+  { __s.unsetf(ios_base::showpoint); return __s;}
+
+inline ios_base& _STLP_CALL showpos(ios_base& __s)
+  { __s.setf(ios_base::showpos); return __s;}
+
+inline ios_base& _STLP_CALL noshowpos(ios_base& __s) 
+  { __s.unsetf(ios_base::showpos); return __s;}
+
+inline ios_base& _STLP_CALL skipws(ios_base& __s)
+  { __s.setf(ios_base::skipws); return __s;}
+
+inline ios_base& _STLP_CALL noskipws(ios_base& __s)
+  { __s.unsetf(ios_base::skipws); return __s;}
+
+inline ios_base& _STLP_CALL uppercase(ios_base& __s)
+  { __s.setf(ios_base::uppercase); return __s;}
+
+inline ios_base& _STLP_CALL nouppercase(ios_base& __s)
+  { __s.unsetf(ios_base::uppercase); return __s;}
+
+inline ios_base& _STLP_CALL unitbuf(ios_base& __s)
+  { __s.setf(ios_base::unitbuf); return __s;}
+
+inline ios_base& _STLP_CALL nounitbuf(ios_base& __s)
+  { __s.unsetf(ios_base::unitbuf); return __s;}
+
+
+// adjustfield manipulators, section 27.4.5.2
+inline ios_base& _STLP_CALL internal(ios_base& __s)
+  { __s.setf(ios_base::internal, ios_base::adjustfield); return __s; }
+
+inline ios_base& _STLP_CALL left(ios_base& __s)
+  { __s.setf(ios_base::left, ios_base::adjustfield); return __s; }
+
+inline ios_base& _STLP_CALL right(ios_base& __s)
+  { __s.setf(ios_base::right, ios_base::adjustfield); return __s; }
+
+// basefield manipulators, section 27.4.5.3
+inline ios_base& _STLP_CALL dec(ios_base& __s)
+  { __s.setf(ios_base::dec, ios_base::basefield); return __s; }
+
+inline ios_base& _STLP_CALL hex(ios_base& __s) 
+  { __s.setf(ios_base::hex, ios_base::basefield); return __s; }
+
+inline ios_base& _STLP_CALL oct(ios_base& __s)
+  { __s.setf(ios_base::oct, ios_base::basefield); return __s; }
+
+
+// floatfield manipulators, section 27.4.5.3
+inline ios_base& _STLP_CALL fixed(ios_base& __s)
+  { __s.setf(ios_base::fixed, ios_base::floatfield); return __s; }
+
+inline ios_base& _STLP_CALL scientific(ios_base& __s)
+  { __s.setf(ios_base::scientific, ios_base::floatfield); return __s; }
+
+#if defined(__BORLANDC__) && defined(_RTLDLL)
+
+long ios_base::_Loc_init::_S_count = 0;
+
+void _STLP_CALL _Stl_loc_init_num_put();
+void _STLP_CALL _Stl_loc_init_num_get();
+void _STLP_CALL _Stl_loc_init_monetary();
+void _STLP_CALL _Stl_loc_init_time_facets();
+
+inline ios_base::_Loc_init::_Loc_init() {
+  if (_S_count++ == 0) {
+      _Stl_loc_init_num_put();
+      _Stl_loc_init_num_get();
+      _Stl_loc_init_monetary();
+      _Stl_loc_init_time_facets();
+      locale::_S_initialize();
+  }
+}
+
+inline ios_base::_Loc_init::~_Loc_init() {
+    if (--_S_count == 0)
+      locale::_S_uninitialize();
+}
+
+#endif /* __BORLANDC__ */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_IOS_BASE */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_iosfwd.h b/src/STLport/stl/_iosfwd.h
new file mode 100644
index 0000000..848fa4b
--- /dev/null
+++ b/src/STLport/stl/_iosfwd.h
@@ -0,0 +1,159 @@
+# ifndef _STLP_INTERNAL_IOSFWD
+#  define _STLP_INTERNAL_IOSFWD
+
+#if defined(__sgi) && !defined(__GNUC__) && !defined(_STANDARD_C_PLUS_PLUS)
+#error This header file requires the -LANG:std option
+#endif
+
+// This file provides forward declarations of the most important I/O
+// classes.  Note that almost all of those classes are class templates,
+// with default template arguments.  According to the C++ standard, 
+// if a class template is declared more than once in the same scope
+// then only one of those declarations may have default arguments.  
+
+// <iosfwd> contains the same declarations as other headers, and including
+// both <iosfwd> and (say) <iostream> is permitted.  This means that only
+// one header may contain those default template arguments.
+
+// In this implementation, the declarations in <iosfwd> contain default
+// template arguments.  All of the other I/O headers include <iosfwd>.
+
+#ifndef _STLP_CHAR_TRAITS_H
+# include <stl/char_traits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC ios_base;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ios;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_streambuf;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_istream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ostream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_iostream;
+
+template <class _CharT, __DFL_TMPL_PARAM( _Traits , char_traits<_CharT>),
+          __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_stringbuf;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>),
+          __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_istringstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>),
+          __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_ostringstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>),
+          __DFL_TMPL_PARAM(_Allocator , allocator<_CharT>) >
+class basic_stringstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_filebuf;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ifstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_ofstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class basic_fstream;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class istreambuf_iterator;
+
+template <class _CharT, __DFL_TMPL_PARAM(_Traits , char_traits<_CharT>) >
+class ostreambuf_iterator;
+
+typedef basic_ios<char, char_traits<char> >    ios;
+
+# ifndef _STLP_NO_WCHAR_T
+typedef basic_ios<wchar_t, char_traits<wchar_t> > wios;
+# endif
+
+// Forward declaration of class locale, and of the most important facets.
+class locale;
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+template <class _Facet>
+struct _Use_facet {
+  const locale& __loc;
+  _Use_facet(const locale& __p_loc) : __loc(__p_loc) {}
+  inline const _Facet& operator *() const;
+};
+# define use_facet *_Use_facet
+# else
+template <class _Facet> inline const _Facet& use_facet(const locale&);
+# endif
+
+template <class _CharT> class ctype;
+template <class _CharT> class ctype_byname;
+template <class _CharT> class collate;
+template <class _CharT> class collate_byname;
+
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype<char>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype_byname<char>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate<char>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate_byname<char>;
+
+#  ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype<wchar_t>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC ctype_byname<wchar_t>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate<wchar_t>;
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC collate_byname<wchar_t>;
+#  endif
+
+# if !(defined (__SUNPRO_CC) && __SUNPRO_CC < 0x500 ) && !defined(_STLP_WINCE)
+// Typedefs for ordinary (narrow-character) streams.
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC basic_streambuf<char, char_traits<char> >;
+# endif
+
+typedef basic_istream<char, char_traits<char> >   istream;
+typedef basic_ostream<char, char_traits<char> >   ostream;
+typedef basic_iostream<char, char_traits<char> >  iostream;
+typedef basic_streambuf<char,char_traits<char> > streambuf;
+
+typedef basic_stringbuf<char, char_traits<char>, allocator<char> >     stringbuf;
+typedef basic_istringstream<char, char_traits<char>, allocator<char> > istringstream;
+typedef basic_ostringstream<char, char_traits<char>, allocator<char> > ostringstream;
+typedef basic_stringstream<char, char_traits<char>, allocator<char> >  stringstream;
+
+typedef basic_filebuf<char, char_traits<char> >  filebuf;
+typedef basic_ifstream<char, char_traits<char> > ifstream;
+typedef basic_ofstream<char, char_traits<char> > ofstream;
+typedef basic_fstream<char, char_traits<char> >  fstream;
+
+# ifndef _STLP_NO_WCHAR_T
+// Typedefs for wide-character streams.
+typedef basic_streambuf<wchar_t, char_traits<wchar_t> > wstreambuf;
+typedef basic_istream<wchar_t, char_traits<wchar_t> >   wistream;
+typedef basic_ostream<wchar_t, char_traits<wchar_t> >   wostream;
+typedef basic_iostream<wchar_t, char_traits<wchar_t> >  wiostream;
+
+typedef basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >     wstringbuf;
+typedef basic_istringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wistringstream;
+typedef basic_ostringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wostringstream;
+typedef basic_stringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >  wstringstream;
+
+typedef basic_filebuf<wchar_t, char_traits<wchar_t> >  wfilebuf;
+typedef basic_ifstream<wchar_t, char_traits<wchar_t> > wifstream;
+typedef basic_ofstream<wchar_t, char_traits<wchar_t> > wofstream;
+typedef basic_fstream<wchar_t, char_traits<wchar_t> >  wfstream;
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_istream.c b/src/STLport/stl/_istream.c
new file mode 100644
index 0000000..234bba7
--- /dev/null
+++ b/src/STLport/stl/_istream.c
@@ -0,0 +1,1430 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_ISTREAM_C
+#define _STLP_ISTREAM_C
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+# include <stl/_istream.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// no wchar_t is supported for this mode
+# define __BIS_int_type__ int
+# define __BIS_pos_type__ streampos
+# define __BIS_off_type__ streamoff
+# else
+# define __BIS_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::int_type
+# define __BIS_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::pos_type
+# define __BIS_off_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_istream<_CharT, _Traits>::off_type
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Function object structs used by some member functions.
+
+template <class _Traits>
+struct _Is_not_wspace {
+  typedef typename _Traits::char_type argument_type;
+  typedef bool                        result_type;
+
+  const ctype<argument_type>* _M_ctype;
+
+  _Is_not_wspace(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
+  bool operator()(argument_type __c) const
+    { return !_M_ctype->is(ctype_base::space, __c); }
+};
+
+template <class _Traits>
+struct _Is_wspace_null {
+  typedef typename _Traits::char_type argument_type;
+  typedef bool                        result_type;
+
+  const ctype<argument_type>* _M_ctype;
+
+  _Is_wspace_null(const ctype<argument_type>* __c_type) : _M_ctype(__c_type) {}
+  bool operator()(argument_type __c) const {
+    return _Traits::eq(__c, argument_type()) || 
+           _M_ctype->is(ctype_base::space, __c);
+  }
+};
+
+template <class _Traits>
+struct _Scan_for_wspace {
+  typedef typename _Traits::char_type  char_type;
+  typedef char_type*                   first_argument_type;
+  typedef char_type*                   second_argument_type;
+  typedef char_type*                   result_type;
+
+  const ctype<char_type>* _M_ctype;
+
+  _Scan_for_wspace(const ctype<char_type>* __ctype) : _M_ctype(__ctype) {}
+  const char_type*
+  operator()(const char_type* __first, const char_type* __last) const {
+    return _M_ctype->scan_is(ctype_base::space, __first, __last);
+  }
+};
+
+template <class _Traits>
+struct _Scan_wspace_null {
+  typedef typename _Traits::char_type  char_type;
+  typedef char_type*                   first_argument_type;
+  typedef char_type*                   second_argument_type;
+  typedef char_type*                   result_type;
+
+  const ctype<char_type>* _M_ctype;
+
+  _Scan_wspace_null(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
+  const char_type*
+  operator()(const char_type* __first, const char_type* __last) const {
+    __last = find_if(__first, __last,
+                     _Eq_char_bound<_Traits>(char_type()));
+    return _M_ctype->scan_is(ctype_base::space, __first, __last);
+  }
+};
+
+template <class _Traits>
+struct _Scan_for_not_wspace {
+  typedef typename _Traits::char_type  char_type;
+  typedef char_type*                   first_argument_type;
+  typedef char_type*                   second_argument_type;
+  typedef char_type*                   result_type;
+
+  const ctype<char_type>* _M_ctype;
+
+  _Scan_for_not_wspace(const ctype<char_type>* __c_type) : _M_ctype(__c_type) {}
+  const char_type*
+  operator()(const char_type* __first, const char_type* __last) const {
+    return _M_ctype->scan_not(ctype_base::space, __first, __last);
+  }
+};
+
+template <class _Traits>
+struct _Scan_for_char_val
+{
+  typedef typename _Traits::char_type char_type;
+  typedef char_type*                  first_argument_type;
+  typedef char_type*                  second_argument_type;
+  typedef char_type*                  result_type;
+
+  char_type _M_val;
+
+  _Scan_for_char_val(char_type __val) : _M_val(__val) {}
+
+  const char_type*
+  operator()(const char_type* __first, const char_type* __last) const {
+    return find_if(__first, __last, _Eq_char_bound<_Traits>(_M_val)); 
+  }
+};
+
+template <class _Traits>
+struct _Scan_for_int_val
+{
+  typedef typename _Traits::char_type char_type;
+  typedef typename _Traits::int_type  int_type;
+  typedef char_type*                  first_argument_type;
+  typedef char_type*                  second_argument_type;
+  typedef char_type*                  result_type;
+
+  int_type _M_val;
+
+  _Scan_for_int_val(int_type __val) : _M_val(__val) {}
+
+  const char_type*
+  operator()(const char_type* __first, const char_type* __last) const {
+    return find_if(__first, __last,
+                   _Eq_int_bound<_Traits>(_M_val));
+  }
+};
+
+// Helper function: try to push back a character to a streambuf, 
+// return true if the pushback succeeded.  Does not throw.
+
+template <class _CharT, class _Traits> 
+bool _STLP_CALL
+__pushback(basic_streambuf<_CharT, _Traits>* __buf, _CharT __c)
+{
+  bool ret;
+  _STLP_TRY {
+    const typename _Traits::int_type __eof = _Traits::eof();
+    ret = !_Traits::eq_int_type(__buf->sputbackc(__c), __eof);
+  }
+  _STLP_CATCH_ALL {
+    ret = false;
+  }
+  return ret;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+ws(basic_istream<_CharT, _Traits>& __is)
+{
+  typedef typename basic_istream<_CharT, _Traits>::sentry      _Sentry;
+  _Sentry __sentry(__is, _No_Skip_WS()); // Don't skip whitespace.
+  if (__sentry)
+    __is._M_skip_whitespace(false);
+  return __is;
+}
+
+// Helper functions for istream<>::sentry constructor.
+template <class _CharT, class _Traits>
+bool
+_M_init_skip(basic_istream<_CharT, _Traits>& __is) {
+  if (__is.good()) {
+    if (__is.tie())
+      __is.tie()->flush();
+    
+    __is._M_skip_whitespace(true);
+  }
+  
+  if (!__is.good()) {
+    __is.setstate(ios_base::failbit);
+    return false;
+  } else
+    return true;
+}
+
+template <class _CharT, class _Traits>
+bool
+_M_init_noskip(basic_istream<_CharT, _Traits>& __is){
+  if (__is.good()) {
+    if (__is.tie())
+      __is.tie()->flush();
+    
+    if (!__is.rdbuf())
+      __is.setstate(ios_base::badbit);
+  }
+  else
+    __is.setstate(ios_base::failbit);
+  return __is.good();
+}
+
+//----------------------------------------------------------------------
+// Definitions of basic_istream<>'s noninline member functions.
+
+// Helper function for formatted input of numbers.
+template <class _CharT, class _Traits, class _Number> 
+ios_base::iostate _STLP_CALL 
+_M_get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val)
+{
+  typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
+  ios_base::iostate __err = 0;
+  _Sentry __sentry( __that );     // Skip whitespace.
+  if (__sentry) {
+    typedef num_get<_CharT, istreambuf_iterator<_CharT, _Traits> > _Num_get;
+    _STLP_TRY {
+      ((const _Num_get&)use_facet<_Num_get>(__that.getloc())).get(istreambuf_iterator<_CharT, _Traits>(__that.rdbuf()),
+					0, __that, __err, __val);
+    }
+    _STLP_CATCH_ALL {
+      __that._M_handle_exception(ios_base::badbit);
+    }
+    if (__err) __that.setstate(__err);
+  }
+  return __err;
+}
+
+
+// Unformatted input
+
+template <class _CharT, class _Traits>
+__BIS_int_type__
+basic_istream<_CharT, _Traits>::peek()
+{
+  typename _Traits::int_type __tmp = _Traits::eof();
+
+  this->_M_gcount = 0;
+  sentry __sentry(*this, _No_Skip_WS());
+
+  if (__sentry) {
+    _STLP_TRY {
+      __tmp = this->rdbuf()->sgetc();
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+    if (this->_S_eof(__tmp))
+      this->setstate(ios_base::eofbit);
+  }
+
+  return __tmp;
+}
+
+
+template <class _CharT, class _Traits>
+__BIS_int_type__
+basic_istream<_CharT, _Traits>::get()
+{
+  typename _Traits::int_type __tmp = _Traits::eof();
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    _STLP_TRY {
+      __tmp = this->rdbuf()->sbumpc();
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+
+    if (!this->_S_eof(__tmp))
+      this->_M_gcount = 1;
+  }
+
+  if (_M_gcount == 0)
+    this->setstate(ios_base::eofbit | ios_base::failbit);
+
+  return __tmp;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& 
+basic_istream<_CharT, _Traits>::get(_CharT& __c)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    typename _Traits::int_type __tmp = _Traits::eof();
+    _STLP_TRY {
+      __tmp = this->rdbuf()->sbumpc();
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+
+    if (!this->_S_eof(__tmp)) {
+      this->_M_gcount = 1;
+      __c = _Traits::to_char_type(__tmp);
+    }
+  }
+
+  if (this->_M_gcount == 0)
+    this->setstate(ios_base::eofbit | ios_base::failbit);
+
+  return *this;
+}
+
+
+
+// Read characters and discard them.  The standard specifies a single
+// function with two arguments, each with a default.  We instead use
+// three overloded functions, because it's possible to implement the
+// first two more efficiently than the fully general third version.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::ignore()
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    int_type __c;
+    _STLP_TRY {
+      __c = this->rdbuf()->sbumpc();
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+      return *this;
+    }
+
+    if (!this->_S_eof(__c))
+      this->_M_gcount = 1;
+    else
+      this->setstate(ios_base::eofbit);
+  }
+
+  return *this;
+}
+
+// Putback
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& 
+basic_istream<_CharT, _Traits>::putback(_CharT __c) {
+  this->_M_gcount = 0;
+  sentry __sentry(*this, _No_Skip_WS());
+
+  if (__sentry) {
+    typename _Traits::int_type __tmp = _Traits::eof();
+    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+//    if (!__buf || this->_S_eof(__buf->sputbackc(__c)))
+    if (__buf) {
+      _STLP_TRY {
+        __tmp = __buf->sputbackc(__c);
+      }
+      _STLP_CATCH_ALL {
+        this->_M_handle_exception(ios_base::badbit);
+      }
+    }
+    if (this->_S_eof(__tmp))
+      this->setstate(ios_base::badbit);
+  }
+  else
+    this->setstate(ios_base::failbit);
+
+  return *this;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& basic_istream<_CharT, _Traits>::unget() {
+  this->_M_gcount = 0;
+
+  sentry __sentry(*this, _No_Skip_WS());
+
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+    //     if (!__buf || _Traits::eq_int_type(__buf->sungetc(), _Traits::eof()))
+    if (__buf) {
+      _STLP_TRY {
+        _CharT __tmp;
+        __tmp = __buf->sungetc();
+        if (this->_S_eof(__tmp))
+          this->setstate(ios_base::badbit);
+      }
+      _STLP_CATCH_ALL {
+        this->_M_handle_exception(ios_base::badbit);
+      }
+    } else
+      this->setstate(ios_base::badbit);    
+  }
+  else
+    this->setstate(ios_base::failbit);
+
+  return *this;
+}
+
+// Positioning and buffer control.
+
+template <class _CharT, class _Traits>
+int basic_istream<_CharT, _Traits>::sync() {
+  sentry __sentry(*this, _No_Skip_WS());
+
+  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+  if (__buf) {
+    if (__buf->pubsync() == -1) {
+      this->setstate(ios_base::badbit);
+      return -1;
+    }
+    else
+      return 0;
+  }
+  else
+    return -1;
+}
+
+template <class _CharT, class _Traits>
+__BIS_pos_type__
+basic_istream<_CharT, _Traits>::tellg() {
+  //   sentry __sentry(*this, _No_Skip_WS());
+  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+  return (__buf && !this->fail()) ? __buf->pubseekoff(0, ios_base::cur, ios_base::in)
+    : pos_type(-1);
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::seekg(pos_type __pos) {
+  sentry __sentry(*this, _No_Skip_WS());
+
+  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+  if (!this->fail() && __buf)
+    __buf->pubseekpos(__pos, ios_base::in);
+  return *this;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::seekg(off_type __off, ios_base::seekdir __dir)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+
+  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+  if (!this->fail() && __buf)
+    __buf->pubseekoff(__off, __dir, ios_base::in);
+  return *this;
+}
+
+// Formatted input of characters and character arrays.
+
+template <class _CharT, class _Traits>
+void basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT& __c)
+{
+//  typename _Traits::int_type __tmp = _Traits::eof();
+
+  sentry __sentry(*this); // Skip whitespace.
+
+  if (__sentry) {
+    typename _Traits::int_type __tmp = _Traits::eof();
+    
+    _STLP_TRY {
+      __tmp = this->rdbuf()->sbumpc();
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+      return;
+    }
+
+    if (!this->_S_eof(__tmp))
+      __c = _Traits::to_char_type(__tmp);
+    else 
+      this->setstate(ios_base::eofbit | ios_base::failbit);
+  }
+}
+
+
+//---------------------------------------------------------------------------
+// istream's helper functions.
+
+// A generic function for unbuffered input.  We stop when we reach EOF,
+// or when we have extracted _Num characters, or when the function object
+// __is_delim return true.  In the last case, it extracts the character
+// for which __is_delim is true, if and only if __extract_delim is true. 
+// It appends a null character to the end of the string; this means that
+// it may store up to _Num + 1 characters.  
+//
+// __is_getline governs two corner cases: reading _Num characters without
+// encountering delim or eof (in which case failbit is set if __is_getline
+// is true); and reading _Num characters where the _Num+1'st character is
+// eof (in which case eofbit is set if __is_getline is true).
+//
+// It is assumed that __is_delim never throws.
+//
+// Return value is the number of characters extracted, including the
+// delimiter if it is extracted.  Note that the number of characaters
+// extracted isn't necessarily the same as the number stored.
+
+template < class _CharT, class _Traits, class _Is_Delim>
+streamsize _STLP_CALL 
+_M_read_unbuffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
+                       streamsize _Num, _CharT* __s,
+                       _Is_Delim __is_delim,
+                       bool __extract_delim, bool __append_null,
+                       bool __is_getline)
+{
+  streamsize __n = 0;
+  ios_base::iostate __status = 0;
+  
+  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+  // The operations that can potentially throw are sbumpc, snextc, and sgetc.
+  _STLP_TRY {
+# if 0
+    int_type __c = __buf->sgetc();
+    while (true) {
+      if (__that->_S_eof(__c)) {
+        if (__n < _Num || __is_getline)
+          __status |= ios_base::eofbit;
+        break;
+      }
+
+      else if (__is_delim(__c)) {
+        if (__extract_delim) {  // Extract and discard current character.
+          __buf->sbumpc();
+          ++__n;
+        }
+        break;
+      }
+
+      else if (__n == _Num) {
+        if (__is_getline)
+          __status |= ios_base::failbit;
+        break;
+      }
+        
+      *__s++ = _Traits::to_char_type(__c);
+      ++__n;
+      __c = __buf->snextc();
+    }
+# else
+// int_type __c = __buf->sbumpc(); // __buf->sgetc();
+while (true) {
+
+int_type __c = __buf->sbumpc(); // sschwarz
+
+if (__that->_S_eof(__c)) {
+if (__n < _Num || __is_getline)
+__status |= ios_base::eofbit;
+break;
+}
+
+else if (__is_delim(__c)) {
+if (__extract_delim) { // Extract and discard current character.
+// __buf->sbumpc();
+++__n;
+}
+break;
+}
+
+else { // regular character
+
+*__s++ = _Traits::to_char_type(__c);
+++__n;
+
+}
+
+if (__n == _Num) {
+if (__is_getline) // didn't find delimiter as one of the _Num chars
+__status |= ios_base::failbit;
+break;
+}
+
+// *__s++ = _Traits::to_char_type(__c);
+// ++__n;
+
+}
+
+# endif
+
+  }
+  _STLP_CATCH_ALL {
+    __that->_M_handle_exception(ios_base::badbit);
+    *__s = _STLP_DEFAULT_CONSTRUCTED(_CharT);
+    return __n;
+  }
+
+  if (__append_null)
+    *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
+  if (__status)
+    __that->setstate(__status);    // This might throw.
+  return __n;
+}
+
+// Much like _M_read_unbuffered, but with one additional function object:
+// __scan_delim(first, last) returns the first pointer p in [first, last)
+// such that __is_delim(p) is true.  
+
+template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
+streamsize _STLP_CALL 
+_M_read_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __buf,
+                     streamsize _Num, _CharT* __s,
+                     _Is_Delim __is_delim, _Scan_Delim __scan_delim,
+                     bool __extract_delim, bool __append_null,
+                     bool __is_getline)
+{
+  streamsize __n = 0;
+  ios_base::iostate __status = 0;
+  bool __done    = false;
+
+  _STLP_TRY {
+    while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
+      const _CharT* __first = __buf->_M_gptr();
+      const _CharT* __last  = __buf->_M_egptr();
+      ptrdiff_t __request = _Num - __n;
+
+      const _CharT* __p  = __scan_delim(__first, __last);
+      ptrdiff_t __chunk = (min) (ptrdiff_t(__p - __first), __request);
+      _Traits::copy(__s, __first, __chunk);
+      __s += __chunk;
+      __n += __chunk;
+      __buf->_M_gbump((int)__chunk);
+
+      // We terminated by finding delim.
+      if (__p != __last && __p - __first <= __request) {
+        if (__extract_delim) {
+          __n += 1;
+          __buf->_M_gbump(1);
+        }
+        __done = true;
+      }
+
+      // We terminated by reading all the characters we were asked for.
+      else if(__n == _Num) {
+
+        // Find out if we have reached eof.  This matters for getline.
+        if (__is_getline) {
+          if (__chunk == __last - __first) {
+            if (__that->_S_eof(__buf->sgetc()))
+              __status |= ios_base::eofbit;            
+          }
+          else
+            __status |= ios_base::failbit;
+        }
+        __done   = true;
+      }
+
+      // The buffer contained fewer than _Num - __n characters.  Either we're
+      // at eof, or we should refill the buffer and try again.
+      else {
+	if (__that->_S_eof(__buf->sgetc())) {
+          __status |= ios_base::eofbit;
+          __done = true;
+        }
+      }
+    } // Close the while loop.
+  }
+  _STLP_CATCH_ALL {
+    __that->_M_handle_exception(ios_base::badbit);
+    __done = true;
+  }
+
+  if (__done) {
+    if (__append_null)
+        *__s =  _STLP_DEFAULT_CONSTRUCTED(_CharT);
+    if (__status != 0)
+      __that->setstate(__status);   // This might throw.
+    return __n;
+  }
+
+  // If execution has reached this point, then we have an empty buffer but
+  // we have not reached eof.  What that means is that the streambuf has
+  // decided to switch from buffered to unbuffered input.  We switch to
+  // to _M_read_unbuffered.
+
+  return __n + _M_read_unbuffered(__that,  __buf, _Num - __n, __s, __is_delim,
+                                  __extract_delim,__append_null,__is_getline);
+}
+
+
+
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::get(_CharT* __s, streamsize __n,
+                                    _CharT __delim) {
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    if (__n > 0) {
+      basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+
+      if (__buf->egptr() != __buf->gptr())
+        this->_M_gcount =
+          _M_read_buffered(this,  __buf, __n - 1, __s,
+                           _Eq_char_bound<_Traits>(__delim),
+                           _Scan_for_char_val<_Traits>(__delim),
+                           false, true, false);
+      else
+        this->_M_gcount =
+          _M_read_unbuffered(this,  __buf, __n - 1, __s,
+                             _Eq_char_bound<_Traits>(__delim),
+                             false, true, false);
+    }
+  }
+
+  if (this->_M_gcount == 0)
+    this->setstate(ios_base::failbit);
+
+  return *this;
+}
+
+// Getline is essentially identical to get, except that it extracts
+// the delimiter.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::getline(_CharT* __s, streamsize __n,
+                                        _CharT __delim) {
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    if (__n > 0) {
+      basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+      this->_M_gcount = __buf->egptr() != __buf->gptr()
+        ? _M_read_buffered(this,  __buf, __n - 1, __s,
+                           _Eq_char_bound<_Traits>(__delim),
+                           _Scan_for_char_val<_Traits>(__delim),
+                           true, true, true)
+        : _M_read_unbuffered(this,  __buf, __n - 1, __s,
+                             _Eq_char_bound<_Traits>(__delim),
+                             true, true, true);
+    }
+  }
+
+  if (this->_M_gcount == 0)
+    this->setstate(ios_base::failbit);
+
+  return *this;
+}
+
+// Read n characters.  We don't look for any delimiter, and we don't
+// put in a terminating null character.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::read(char_type* __s, streamsize __n)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry && !this->eof()) {
+    basic_streambuf<_CharT, _Traits>*__buf = this->rdbuf();
+    if (__buf->gptr() != __buf->egptr()) 
+      _M_gcount
+        = _M_read_buffered(this,  __buf, __n, __s,
+                           _Constant_unary_fun<bool, int_type>(false),
+                           _Project2nd<const _CharT*, const _CharT*>(),
+                           false, false, false);
+    else
+      _M_gcount
+        = _M_read_unbuffered(this,  __buf, __n, __s,
+                             _Constant_unary_fun<bool, int_type>(false),
+                             false, false, false);
+  }
+  else
+    this->setstate(ios_base::failbit);
+
+  if (this->eof())
+    this->setstate(ios_base::eofbit | ios_base::failbit);
+
+  return *this;
+}
+
+
+// Read n or fewer characters.  We don't look for any delimiter, and
+// we don't put in a terminating null character.
+template <class _CharT, class _Traits>
+streamsize
+basic_istream<_CharT, _Traits>::readsome(char_type* __s, streamsize __nmax)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry && !this->eof() && __nmax >= 0) {
+
+    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+    streamsize __avail = __buf->in_avail();
+
+    // fbp : isn't full-blown setstate required here ?
+    if (__avail == -1)
+      this->_M_setstate_nothrow(ios_base::eofbit);
+
+    else if (__avail != 0) {
+
+      if (__buf->gptr() != __buf->egptr()) 
+        _M_gcount
+          = _M_read_buffered(this,  __buf, (min) (__avail, __nmax), __s,
+                             _Constant_unary_fun<bool, int_type>(false),
+                             _Project2nd<const _CharT*, const _CharT*>(),
+                             false, false, false);
+      else
+        _M_gcount
+          = _M_read_unbuffered(this,  __buf, (min) (__avail, __nmax), __s,
+                               _Constant_unary_fun<bool, int_type>(false),
+                               false, false, false);
+    }
+  }
+  else {
+    // fbp : changed so that failbit is set only there, to pass Dietmar's test
+    if (this->eof())
+      this->setstate(ios_base::eofbit | ios_base::failbit);
+    else
+      this->setstate(ios_base::failbit);
+  }
+
+  //  if (this->eof())
+  //    this->setstate(ios_base::eofbit | ios_base::failbit);
+  
+  return _M_gcount;
+}
+
+template <class _CharT, class _Traits>
+void basic_istream<_CharT, _Traits>::_M_formatted_get(_CharT* __s)
+{
+  sentry __sentry(*this); // Skip whitespace.
+
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+    streamsize __nmax = this->width() > 0
+      ? this->width() - 1
+      : (numeric_limits<streamsize>::max)() / sizeof(_CharT) - 1;
+
+    streamsize __n = __buf->gptr() != __buf->egptr()
+      ? _M_read_buffered(this,  __buf, __nmax, __s,
+                         _Is_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+                         _Scan_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+			 false, true, false)
+      : _M_read_unbuffered(this,  __buf, __nmax, __s,
+                           _Is_wspace_null<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+			   false, true, false);
+    if (__n == 0)
+      this->setstate(ios_base::failbit);
+  }
+  this->width(0);
+}
+
+// A generic unbuffered function for ignoring characters.  We stop
+// when we reach EOF, or when the function object __is_delim returns
+// true.  In the last case, it extracts the character for which
+// __is_delim is true, if and only if __extract_delim is true.
+
+template < class _CharT, class _Traits, class _Is_Delim>
+void _STLP_CALL 
+_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that, 
+		     basic_streambuf<_CharT, _Traits>* __buf,
+		     _Is_Delim __is_delim,
+		     bool __extract_delim, bool __set_failbit)
+{
+  bool __done = false;
+  ios_base::iostate __status = 0;
+  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+
+  _STLP_TRY {
+    while (!__done) {
+      int_type __c = __buf->sbumpc();
+
+      if (__that->_S_eof(__c)) {
+        __done = true;
+        __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
+                                  : ios_base::eofbit;
+      }
+
+      else if (__is_delim(__c)) {
+        __done = true;
+        if (!__extract_delim)
+          if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
+            __status |= ios_base::failbit;
+      }
+    }
+  }
+  _STLP_CATCH_ALL {
+    __that->_M_handle_exception(ios_base::badbit);
+  }
+
+  __that->setstate(__status);
+}
+
+// A generic buffered function for ignoring characters.  Much like
+// _M_ignore_unbuffered, but with one additional function object:
+// __scan_delim(first, last) returns the first pointer p in [first,
+// last) such that __is_delim(p) is true.
+
+template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
+void _STLP_CALL 
+_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that, 
+		   basic_streambuf<_CharT, _Traits>* __buf,
+		   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
+		   bool __extract_delim, bool __set_failbit)
+{
+  bool __at_eof      = false;
+  bool __found_delim = false;
+
+  _STLP_TRY {
+    while (__buf->_M_egptr() != __buf->_M_gptr() && !__at_eof && !__found_delim) {
+      const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
+      __buf->_M_gbump((int)(__p - __buf->_M_gptr()));
+    
+      if (__p != __buf->_M_egptr()) { // We found delim, so we're done.
+        if (__extract_delim)
+          __buf->_M_gbump(1);
+        __found_delim = true;
+      }
+
+      else                         // No delim.  Try to refil the buffer.
+        __at_eof = __that->_S_eof(__buf->sgetc());
+    }                              // Close the while loop.
+  }
+  _STLP_CATCH_ALL {
+    __that->_M_handle_exception(ios_base::badbit);
+    return;
+  }
+
+  if (__at_eof) {
+    __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
+                                   : ios_base::eofbit);
+    return;
+  }
+  if (__found_delim)
+    return;
+
+  // If execution has reached this point, then we have an empty buffer but
+  // we have not reached eof.  What that means is that the streambuf has
+  // decided to switch from a buffered to an unbuffered mode.  We switch 
+  // to _M_ignore_unbuffered.
+  _M_ignore_unbuffered(__that,  __buf, __is_delim, __extract_delim, __set_failbit);
+}
+
+// Overloaded versions of _M_ignore_unbuffered and _M_ignore_unbuffered 
+// with an explicit count _Num.  Return value is the number of
+// characters extracted.
+//
+// The function object __max_chars takes two arguments, _Num and __n
+// (the latter being the number of characters we have already read), 
+// and returns the maximum number of characters to read from the buffer.
+// We parameterize _M_ignore_buffered so that we can use it for both
+// bounded and unbounded input; for the former the function object should
+// be minus<>, and for the latter it should return a constant maximum value.
+
+template < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim>
+streamsize _STLP_CALL 
+_M_ignore_unbuffered(basic_istream<_CharT, _Traits>* __that,
+		     basic_streambuf<_CharT, _Traits>* __buf,
+		     streamsize _Num, _Max_Chars __max_chars,
+		     _Is_Delim __is_delim,
+		     bool __extract_delim, bool __set_failbit)
+{
+  streamsize __n = 0;
+  ios_base::iostate __status = 0;
+  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+  
+  _STLP_TRY {
+    while (__max_chars(_Num, __n) > 0) {
+      int_type __c = __buf->sbumpc();
+      
+      if (__that->_S_eof(__c)) {
+        __status |= __set_failbit ? ios_base::eofbit | ios_base::failbit
+                                  : ios_base::eofbit;
+        break;
+      }
+
+      else if (__is_delim(__c)) {
+        if (__extract_delim)
+          ++__n;
+        else if (__that->_S_eof(__buf->sputbackc(_Traits::to_char_type(__c))))
+          __status |= ios_base::failbit;
+
+        break;
+      }
+      // fbp : added counter increment to pass Dietmar's test
+      ++__n;
+    }
+  }
+  _STLP_CATCH_ALL {
+    __that->_M_handle_exception(ios_base::badbit);
+  }
+
+  if (__status)
+    __that->setstate(__status);   // This might throw.
+  return __n;
+}
+
+template < class _CharT, class _Traits, class _Max_Chars, class _Is_Delim, class _Scan_Delim>
+streamsize _STLP_CALL 
+_M_ignore_buffered(basic_istream<_CharT, _Traits>* __that,
+		   basic_streambuf<_CharT, _Traits>* __buf,
+		   streamsize _Num,
+		   _Max_Chars __max_chars,
+		   _Is_Delim __is_delim, _Scan_Delim __scan_delim,
+		   bool __extract_delim, bool __set_failbit)
+{
+  streamsize __n = 0;
+  bool __at_eof = false;
+  bool __done   = false;
+
+  _STLP_TRY {
+    while (__buf->_M_egptr() != __buf->_M_gptr() && !__done) {
+      ptrdiff_t __avail = __buf->_M_egptr() - __buf->_M_gptr();
+      streamsize __m = __max_chars(_Num, __n);
+    
+      if (__avail >= __m) {       // We have more characters than we need.
+        const _CharT* __last = __buf->_M_gptr() + __m;
+        const _CharT* __p = __scan_delim(__buf->_M_gptr(), __last);
+        ptrdiff_t __chunk = __p - __buf->_M_gptr();
+        __n += __chunk;
+        __buf->_M_gbump((int)__chunk);
+
+        if (__extract_delim && __p != __last) {
+          __n += 1;
+          __buf->_M_gbump(1);
+        }
+
+        __done = true;
+      }
+
+      else {
+        const _CharT* __p = __scan_delim(__buf->_M_gptr(), __buf->_M_egptr());
+        ptrdiff_t __chunk = __p - __buf->_M_gptr();
+        __n += __chunk;
+        __buf->_M_gbump((int)__chunk);
+
+        if (__p != __buf->_M_egptr()) { // We found delim.
+          if (__extract_delim) {
+            __n += 1;
+            __buf->_M_gbump(1);
+          }
+
+          __done = true;
+        }
+
+        // We didn't find delim.  Try to refill the buffer.
+        else if (__that->_S_eof(__buf->sgetc())) {
+          __done   = true;
+          __at_eof = true;
+        } 
+      }
+    } // Close the while loop.
+  }
+  _STLP_CATCH_ALL {
+    __that->_M_handle_exception(ios_base::badbit);
+    return __n;
+  }
+
+  if (__at_eof)
+    __that->setstate(__set_failbit ? ios_base::eofbit | ios_base::failbit
+                                   : ios_base::eofbit);
+
+  if (__done)
+    return __n;
+
+  // If execution has reached this point, then we have an empty buffer but
+  // we have not reached eof.  What that means is that the streambuf has
+  // decided to switch from buffered to unbuffered input.  We switch to
+  // to _M_ignore_unbuffered.
+
+  return __n + _M_ignore_unbuffered( __that,  __buf, _Num, __max_chars,
+                                    __is_delim, __extract_delim, __set_failbit);
+}
+
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::ignore(streamsize __n)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+    typedef _Constant_unary_fun<bool, int_type> _Const_bool;
+    typedef _Constant_binary_fun<streamsize, streamsize, streamsize>
+      _Const_streamsize;
+    const streamsize __maxss = (numeric_limits<streamsize>::max)();
+
+    if (__n == (numeric_limits<int>::max)()) {
+      if (__buf->gptr() != __buf->egptr())
+        _M_gcount
+          = _M_ignore_buffered(this,  __buf,
+                               __maxss, _Const_streamsize(__maxss),
+                               _Const_bool(false),
+                               _Project2nd<const _CharT*, const _CharT*>(),
+                               false, false);
+      else
+        _M_gcount = _M_ignore_unbuffered(this,  __buf,
+                                         __maxss, _Const_streamsize(__maxss),
+                                         _Const_bool(false), false, false);
+    }
+    else {
+      if (__buf->gptr() != __buf->egptr())
+        _M_gcount
+          = _M_ignore_buffered(this,  __buf,
+                               __n, minus<streamsize>(),
+                               _Const_bool(false),
+                               _Project2nd<const _CharT*, const _CharT*>(),
+                               false, false);
+      else
+        _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
+                                         _Const_bool(false), false, false);
+    }
+  }
+
+  return *this;
+}
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>&
+basic_istream<_CharT, _Traits>::ignore(streamsize __n, int_type __delim)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+    typedef _Constant_unary_fun<bool, int_type> _Const_bool;
+    typedef _Constant_binary_fun<streamsize, streamsize, streamsize>
+      _Const_streamsize;
+    const streamsize __maxss = (numeric_limits<streamsize>::max)();
+
+    if (__n == (numeric_limits<int>::max)()) {
+      if (__buf->gptr() != __buf->egptr())
+        _M_gcount = _M_ignore_buffered(this,  __buf,
+                                       __maxss, _Const_streamsize(__maxss),
+                                       _Eq_int_bound<_Traits>(__delim),
+                                       _Scan_for_int_val<_Traits>(__delim),
+                                       true, false);
+      else
+        _M_gcount = _M_ignore_unbuffered(this,  __buf,
+                                         __maxss, _Const_streamsize(__maxss),
+                                         _Eq_int_bound<_Traits>(__delim),
+                                         true, false);
+    }
+    else {
+      if (__buf->gptr() != __buf->egptr())
+        _M_gcount = _M_ignore_buffered(this,  __buf,
+                                       __n, minus<streamsize>(),
+                                       _Eq_int_bound<_Traits>(
+                                               __delim),
+                                       _Scan_for_int_val<_Traits>(__delim),
+                                       true, false);
+      else
+        _M_gcount = _M_ignore_unbuffered(this,  __buf, __n, minus<streamsize>(),
+                                         _Eq_int_bound<_Traits>(__delim),
+                                         true, false);
+    }
+  }
+
+  return *this;
+}
+
+// This member function does not construct a sentry object, because
+// it is called from sentry's constructor.  
+template <class _CharT, class _Traits>
+void basic_istream<_CharT, _Traits>::_M_skip_whitespace(bool __set_failbit)
+{
+  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+  if (!__buf)
+    this->setstate(ios_base::badbit);
+  else if (__buf->gptr() != __buf->egptr())
+    _M_ignore_buffered(this,  __buf,
+                       _Is_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+                       _Scan_for_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+                       false, __set_failbit);
+  else
+    _M_ignore_unbuffered(this,  __buf,
+                         _Is_not_wspace<_Traits>((const ctype<_CharT>*)this->_M_ctype_facet()),
+                         false, __set_failbit);
+}
+
+
+// This is a very simple loop that reads characters from __src and puts
+// them into __dest.  It looks complicated because of the (standard-
+// mandated) exception handling policy.
+//
+// We stop when we get an exception, when we fail to insert into the 
+// output streambuf, or when __is_delim is true.
+
+template < class _CharT, class _Traits, class _Is_Delim>
+streamsize _STLP_CALL 
+_M_copy_unbuffered( basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
+		    basic_streambuf<_CharT, _Traits>* __dest,
+		    _Is_Delim __is_delim,
+		    bool __extract_delim, bool __rethrow)
+{
+  streamsize __extracted = 0;
+  ios_base::iostate __status = 0;
+  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+  int_type __c;
+
+  _STLP_TRY {
+  
+    while (true) {
+  
+      // Get a character. If there's an exception, catch and (maybe) rethrow it.
+      __c = __src->sbumpc();
+      
+      // If we failed to get a character, then quit.
+      if (__that->_S_eof(__c)) {
+        __status |= ios_base::eofbit;
+        break;
+      }  
+      // If it's the delimiter, then quit.
+      else if (__is_delim(__c)) {
+        if (!__extract_delim && !__pushback(__src, _Traits::to_char_type(__c)))
+          __status |= ios_base::failbit;
+        break;
+      }
+      
+      else {
+      
+        // Try to put the character in the output streambuf.
+        bool __failed = false;
+        _STLP_TRY {
+          if (!__that->_S_eof(__dest->sputc(__c)))
+            ++__extracted;
+          else
+            __failed = true;
+        }
+        _STLP_CATCH_ALL {
+          __failed = true;
+        }
+        
+        // If we failed to put the character in the output streambuf, then
+        // try to push it back to the input streambuf.
+        if (__failed && !__pushback(__src, _Traits::to_char_type(__c)))
+          __status |= ios_base::failbit;
+
+        // fbp : avoiding infinite loop in io-27-6-1-2-3.exp 
+        if (__failed)
+          break;
+      }
+
+    } /* while (true) */
+    
+  }
+  // fbp : this try/catch moved here in reasonable assumption
+  // __is_delim never throw (__pushback is guaranteed not to)
+  _STLP_CATCH_ALL {
+    // See 27.6.1.2.3, paragraph 13.
+    if (__rethrow && __extracted == 0)
+      __that->_M_handle_exception(ios_base::failbit);
+  }
+  __that->setstate(__status);
+  return __extracted;
+}
+      
+// Buffered copying from one streambuf to another.  We copy the characters
+// in chunks, rather than one at a time.  We still have to worry about all
+// of the error conditions we checked in _M_copy_unbuffered, plus one more:
+// the streambuf might decide to switch from a buffered to an unbuffered mode.
+
+template < class _CharT, class _Traits, class _Is_Delim, class _Scan_Delim>
+streamsize _STLP_CALL 
+_M_copy_buffered(basic_istream<_CharT, _Traits>* __that, basic_streambuf<_CharT, _Traits>* __src,
+                     basic_streambuf<_CharT, _Traits>* __dest,
+                     _Scan_Delim __scan_delim, _Is_Delim __is_delim,
+                     bool __extract_delim, bool __rethrow)
+{
+  streamsize __extracted = 0;
+  ios_base::iostate __status = 0;
+  typedef typename basic_istream<_CharT, _Traits>::int_type int_type;
+  int_type __c = _Traits::eof();
+  _CharT* __first = __src->_M_gptr();
+  ptrdiff_t __avail = __src->_M_egptr() - __first;
+  // fbp : introduced to move catch/try blocks out of the loop
+  bool __do_handle_exceptions;
+
+  _STLP_TRY {
+    while (true) {
+      __do_handle_exceptions = false ;
+      const _CharT* __last = __scan_delim(__first, __src->_M_egptr());
+      
+      // Try to copy the entire input buffer to the output buffer.
+      streamsize __n = __dest->sputn(__first, __extract_delim && __last != __src->_M_egptr()
+                                     ? (__last - __first) + 1
+                                     : (__last - __first));
+      __src->_M_gbump((int)__n);
+      __extracted += __n;
+      
+      // from this on, catch() will call _M_handle_exceptions()
+      __do_handle_exceptions = true;
+      
+      if (__n < __avail)          // We found the delimiter, or else failed to
+        break;                    // copy some characters.
+      
+      __c = __src->sgetc();
+
+      // Three possibilities: we succeeded in refilling the buffer, or 
+      // we got EOF, or the streambuf has switched to unbuffered mode.
+      __first = __src->_M_gptr();
+      __avail = __src->_M_egptr() - __first;
+      
+      if (__avail > 0)
+        {}	// dwa 1/16/00 -- suppress a Metrowerks warning
+      else if (__that->_S_eof(__c)) {
+        __status |= ios_base::eofbit;
+        break;
+      }
+      else 
+        return __extracted + _M_copy_unbuffered(__that,  __src, __dest, __is_delim,
+                                                __extract_delim, __rethrow);
+    } /* while */
+  }
+  
+  _STLP_CATCH_ALL {
+    // See 27.6.1.2.3, paragraph 13.
+    if (__rethrow && __do_handle_exceptions &&  __extracted == 0)
+      __that->_M_handle_exception(ios_base::failbit);
+  }
+  
+  if (__status)
+    __that->setstate(__status);   // This might throw.
+  return __extracted;
+} 
+
+
+
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& 
+basic_istream<_CharT, _Traits>
+  ::get(basic_streambuf<_CharT, _Traits>& __dest, _CharT __delim)
+{
+  sentry __sentry(*this, _No_Skip_WS());
+  this->_M_gcount = 0;
+
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
+
+    if (__src)
+      this->_M_gcount = __src->egptr() != __src->gptr()
+        ? _M_copy_buffered(this,  __src, &__dest,
+                           _Scan_for_char_val<_Traits>(__delim),
+                           _Eq_char_bound<_Traits>(__delim),
+                           false, false)
+        : _M_copy_unbuffered(this,  __src, &__dest,
+                             _Eq_char_bound<_Traits>(__delim),
+                             false, false);
+  }
+
+  if (this->_M_gcount == 0)
+    this->setstate(ios_base::failbit);
+
+  return *this;
+}
+
+// Copying characters into a streambuf.
+template <class _CharT, class _Traits> 
+basic_istream<_CharT, _Traits>& 
+basic_istream<_CharT, _Traits>
+  ::operator>>(basic_streambuf<_CharT, _Traits>* __dest)
+{
+  streamsize __n = 0;
+  typedef typename basic_istream<_CharT, _Traits>::sentry _Sentry;
+  _Sentry __sentry(*this);
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __src = this->rdbuf();
+    if (__src && __dest)
+      __n = __src->egptr() != __src->gptr()
+        ? _M_copy_buffered(this,  __src, __dest,
+                           _Project2nd<const _CharT*, const _CharT*>(),
+                           _Constant_unary_fun<bool, int_type>(false),
+                           false, true)
+        : _M_copy_unbuffered(this,  __src, __dest,
+                             _Constant_unary_fun<bool, int_type>(false),
+                             false, true);
+  }
+
+  if (__n == 0)
+    this->setstate(ios_base::failbit);
+  
+  return *this;
+}
+
+// ----------------------------------------------------------------
+// basic_iostream<> class 
+// ----------------------------------------------------------------
+
+template <class _CharT, class _Traits>
+basic_iostream<_CharT, _Traits>
+  ::basic_iostream(basic_streambuf<_CharT, _Traits>* __buf)
+    : basic_ios<_CharT, _Traits>(),
+      basic_istream<_CharT, _Traits>(__buf),
+      basic_ostream<_CharT, _Traits>(__buf)
+{
+  this->init(__buf);
+}
+
+template <class _CharT, class _Traits>
+basic_iostream<_CharT, _Traits>::~basic_iostream()
+{}
+
+_STLP_END_NAMESPACE
+
+# undef __BIS_int_type__
+# undef __BIS_pos_type__
+# undef __BIS_off_type__
+
+# endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_ISTREAM_C */
diff --git a/src/STLport/stl/_istream.h b/src/STLport/stl/_istream.h
new file mode 100644
index 0000000..646bb31
--- /dev/null
+++ b/src/STLport/stl/_istream.h
@@ -0,0 +1,344 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_INTERNAL_ISTREAM_H
+#define _STLP_INTERNAL_ISTREAM_H
+
+// this block is included by _ostream.h, we include it here to lower #include level
+# if defined (_STLP_HAS_WCHAR_T) && !defined (_STLP_CWCHAR_H)
+#  include <stl/_cwchar.h>
+# endif
+
+# ifndef _STLP_INTERNAL_IOS_H
+#  include <stl/_ios.h>                  // For basic_ios<>.  Includes <iosfwd>.
+# endif
+
+#ifndef _STLP_INTERNAL_OSTREAM_H
+# include <stl/_ostream.h>              // Needed as a base class of basic_iostream.
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+#include <stl/_ctraits_fns.h>    // Helper functions that allow char traits
+                                // to be used as function objects.
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Number> 
+ios_base::iostate _STLP_CALL
+_M_get_num(basic_istream<_CharT, _Traits>& __that, _Number& __val);
+
+#if defined (_STLP_USE_TEMPLATE_EXPORT)
+template <class _CharT, class _Traits>
+class _Isentry;
+#endif
+
+struct _No_Skip_WS {};        // Dummy class used by sentry.
+
+template <class _CharT, class _Traits>
+bool _M_init_skip(basic_istream<_CharT, _Traits>& __is);
+template <class _CharT, class _Traits>
+bool _M_init_noskip(basic_istream<_CharT, _Traits>& __is);
+
+//----------------------------------------------------------------------
+// Class basic_istream, a class that performs formatted input through
+// a stream buffer.
+
+// The second template parameter, _Traits, defaults to char_traits<_CharT>.
+// The default is declared in header <iosfwd>, and it isn't declared here
+// because C++ language rules do not allow it to be declared twice. 
+
+template <class _CharT, class _Traits>
+class basic_istream : virtual public basic_ios<_CharT, _Traits> {
+public:
+                         // Types
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+  typedef basic_ios<_CharT, _Traits>     _Basic_ios;
+  typedef basic_istream<_CharT, _Traits> _Self;
+
+  typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
+  typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
+  typedef _Self& (_STLP_CALL *__istream_fn)(_Self&);
+
+public:                         // Constructor and destructor.
+  explicit basic_istream(basic_streambuf<_CharT, _Traits>* __buf) :
+    basic_ios<_CharT, _Traits>(), _M_gcount(0) {
+    this->init(__buf);
+  }
+  ~basic_istream() {};
+
+public:                         // Nested sentry class.
+
+public:                         // Hooks for manipulators.  The arguments are
+                                // function pointers.
+  _Self& operator>> (__istream_fn __f) { return __f(*this); }
+  _Self& operator>> (__ios_fn __f) {  __f(*this); return *this; }
+  _Self& operator>> (__ios_base_fn __f) { __f(*this); return *this; }
+
+public:                         // Formatted input of numbers.
+  _Self& operator>> (short& __val) {
+    long __lval;
+    unsigned short __uval;
+   _M_get_num(*this, __lval);
+    __val = __STATIC_CAST(short, __lval);
+    __uval = __lval;
+    // check if we lose digits
+    //    if ((__val != __lval) && ((unsigned short)__val != __lval))
+    if ((__val != __lval) && ((long)__uval != __lval))
+      this->setstate(ios_base::failbit); 
+    return *this; 
+  }
+  _Self& operator>> (int& __val) { 
+    long __lval;
+    unsigned int __uval;
+    _M_get_num(*this, __lval);
+    __val = __lval;
+    __uval = __lval;
+    // check if we lose digits
+    //    if ((__val != __lval) && ((unsigned int)__val != __lval))
+    if ((__val != __lval) && ((long)__uval != __lval))
+      this->setstate(ios_base::failbit); 
+    return *this;
+  }
+  _Self& operator>> (unsigned short& __val) { _M_get_num(*this, __val); return *this; }
+  _Self& operator>> (unsigned int& __val) { _M_get_num(*this, __val); return *this; }
+  _Self& operator>> (long& __val) { _M_get_num(*this, __val); return *this; }
+  _Self& operator>> (unsigned long& __val) { _M_get_num(*this, __val); return *this; }
+#ifdef _STLP_LONG_LONG
+  _Self& operator>> (_STLP_LONG_LONG& __val) { _M_get_num(*this, __val); return *this; }
+  _Self& operator>> (unsigned _STLP_LONG_LONG& __val) { _M_get_num(*this, __val); return *this; }
+#endif 
+  _Self& operator>> (float& __val)  { _M_get_num(*this, __val); return *this; }
+  _Self& operator>> (double& __val) { _M_get_num(*this, __val); return *this; }
+# ifndef _STLP_NO_LONG_DOUBLE
+  _Self& operator>> (long double& __val) { _M_get_num(*this, __val); return *this; }
+# endif
+# ifndef _STLP_NO_BOOL
+  _Self& operator>> (bool& __val) { _M_get_num(*this, __val); return *this; }
+# endif
+  _Self& operator>> (void*& __val) { _M_get_num(*this, __val); return *this; }
+
+public:                         // Copying characters into a streambuf.
+  _Self& operator>>(basic_streambuf<_CharT, _Traits>*);
+
+public:                         // Unformatted input.
+  streamsize gcount() const { return _M_gcount; }
+  int_type peek();
+
+public:                         // get() for single characters
+  int_type get();
+  _Self& get(char_type& __c);
+
+public:                         // get() for character arrays.
+  _Self& get(char_type* __s, streamsize __n, char_type __delim);
+  _Self& get(char_type* __s, streamsize __n)
+    { return get(__s, __n, this->widen('\n')); }
+
+public:                         // get() for streambufs
+  _Self& get(basic_streambuf<_CharT, _Traits>& __buf,
+                     char_type __delim);
+  _Self& get(basic_streambuf<_CharT, _Traits>& __buf)
+    { return get(__buf, this->widen('\n')); }
+
+public:                         // getline()
+  _Self& getline(char_type* __s, streamsize __n, char_type delim);
+  _Self& getline(char_type* __s, streamsize __n)
+    { return getline(__s, __n, this->widen('\n')); }
+
+public:                         // read(), readsome(), ignore()
+  _Self& ignore();
+  _Self& ignore(streamsize __n);
+#if (defined (_STLP_MSVC) && _STLP_MSVC < 1200)
+  inline
+#endif
+  _Self& ignore(streamsize __n, int_type __delim);
+
+  _Self& read(char_type* __s, streamsize __n);
+  streamsize readsome(char_type* __s, streamsize __n);
+
+public:                         // putback
+  _Self& putback(char_type __c);
+  _Self& unget();
+
+public:                         // Positioning and buffer control.
+  int sync();
+
+  pos_type tellg();
+  _Self& seekg(pos_type __pos);
+  _Self& seekg(off_type, ios_base::seekdir);
+
+public:                         // Helper functions for non-member extractors.
+  void _M_formatted_get(_CharT& __c);
+  void _M_formatted_get(_CharT* __s);
+  void _M_skip_whitespace(bool __set_failbit);
+
+private:                        // Number of characters extracted by the
+  streamsize _M_gcount;         // most recent unformatted input function.
+
+public:
+
+#if defined (_STLP_USE_TEMPLATE_EXPORT)
+  // If we are using DLL specs, we have not to use inner classes
+  // end class declaration here
+  typedef _Isentry<_CharT, _Traits>      sentry;
+};
+#  define sentry _Isentry
+template <class _CharT, class _Traits>
+class _Isentry {
+  typedef _Isentry<_CharT, _Traits> _Self;
+# else
+  class sentry {
+    typedef sentry _Self;
+#endif
+    
+  private:
+    const bool _M_ok;
+    //    basic_streambuf<_CharT, _Traits>* _M_buf;
+        
+  public:
+    typedef _Traits traits_type;
+    
+    explicit sentry(basic_istream<_CharT, _Traits>& __is,
+                    bool __noskipws = false) : 
+      _M_ok((__noskipws || !(__is.flags() & ios_base::skipws)) ? _M_init_noskip(__is) :  _M_init_skip(__is) )
+      /* , _M_buf(__is.rdbuf()) */
+      {}
+    
+    // Calling this constructor is the same as calling the previous one with 
+    // __noskipws = true, except that it doesn't require a runtime test.
+    sentry(basic_istream<_CharT, _Traits>& __is, _No_Skip_WS) : /* _M_buf(__is.rdbuf()), */
+      _M_ok(_M_init_noskip(__is)) {}
+    
+    ~sentry() {}
+    
+    operator bool() const { return _M_ok; }
+    
+  private:                        // Disable assignment and copy constructor.
+    sentry(const _Self&) : _M_ok(false) {}
+    void operator=(const _Self&) {}
+  };
+  
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+#  undef sentry
+# else
+  // close basic_istream class definition here
+};
+# endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Isentry<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_istream<char, char_traits<char> >;
+#  if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _Isentry<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_istream<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// Non-member character and string extractor functions.
+
+template <class _CharT, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL  
+operator>>(basic_istream<_CharT, _Traits>& __in, _CharT& __c) {
+  __in._M_formatted_get(__c);
+  return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL  
+operator>>(basic_istream<char, _Traits>& __in, unsigned char& __c) {
+  __in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
+  return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL 
+operator>>(basic_istream<char, _Traits>& __in, signed char& __c) {
+  __in._M_formatted_get(__REINTERPRET_CAST(char&,__c));
+  return __in;
+}
+
+template <class _CharT, class _Traits>
+inline basic_istream<_CharT, _Traits>& _STLP_CALL 
+operator>>(basic_istream<_CharT, _Traits>& __in, _CharT* __s) {
+  __in._M_formatted_get(__s);
+  return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL 
+operator>>(basic_istream<char, _Traits>& __in, unsigned char* __s) {
+  __in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
+  return __in;
+}
+
+template <class _Traits>
+inline basic_istream<char, _Traits>& _STLP_CALL 
+operator>>(basic_istream<char, _Traits>& __in, signed char* __s) {
+  __in._M_formatted_get(__REINTERPRET_CAST(char*,__s));
+  return __in;
+}
+
+//----------------------------------------------------------------------
+// istream manipulator.
+template <class _CharT, class _Traits>
+basic_istream<_CharT, _Traits>& _STLP_CALL
+ws(basic_istream<_CharT, _Traits>& __is);
+
+//----------------------------------------------------------------------
+// Class iostream.
+
+template <class _CharT, class _Traits>
+class basic_iostream 
+  : public basic_istream<_CharT, _Traits>,
+    public basic_ostream<_CharT, _Traits>
+{
+public:
+  typedef basic_ios<_CharT, _Traits> _Basic_ios;
+
+  explicit basic_iostream(basic_streambuf<_CharT, _Traits>* __buf);
+  virtual ~basic_iostream();
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_iostream<char, char_traits<char> >;
+#  if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_iostream<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& __is) 
+{
+  return __is.rdbuf();
+}
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_istream.c>
+# endif
+
+#endif /* _STLP_INTERNAL_ISTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_istreambuf_iterator.h b/src/STLport/stl/_istreambuf_iterator.h
new file mode 100644
index 0000000..c3ef8a2
--- /dev/null
+++ b/src/STLport/stl/_istreambuf_iterator.h
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+#define _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// defined in _istream.h
+template <class _CharT, class _Traits>
+extern basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_istreambuf(basic_istream<_CharT, _Traits>& ) ;
+
+// We do not read any characters until operator* is called. operator* calls sgetc 
+// unless the iterator is unchanged from the last call in which case a cached value is
+// used. Calls to operator++ use sbumpc.
+
+template<class _CharT, class _Traits>
+class istreambuf_iterator
+{
+public:
+  typedef _CharT                           char_type;
+  typedef _Traits                          traits_type;
+  typedef typename _Traits::int_type       int_type;
+  typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+  typedef basic_istream<_CharT, _Traits>   istream_type;
+
+  typedef input_iterator_tag               iterator_category;
+  typedef _CharT                           value_type;
+  typedef typename _Traits::off_type       difference_type;
+  typedef const _CharT*                    pointer;
+  typedef const _CharT&                    reference;
+
+public:
+  istreambuf_iterator(streambuf_type* __p = 0) { this->_M_init(__p); }
+  //  istreambuf_iterator(basic_istream<_CharT, _Traits>& __is) { this->_M_init(_M_get_istreambuf(__is)); }
+  inline istreambuf_iterator(basic_istream<_CharT, _Traits>& __is);
+
+  char_type operator*() const { this->_M_getc(); return _M_c; }
+  istreambuf_iterator<_CharT, _Traits>& operator++() { this->_M_bumpc(); return *this; }
+  istreambuf_iterator<_CharT, _Traits>  operator++(int);
+
+  bool equal(const istreambuf_iterator<_CharT, _Traits>& __i) const {
+    if (this->_M_buf)
+      this->_M_getc();
+    if (__i._M_buf)
+      __i._M_getc(); 
+    return this->_M_eof == __i._M_eof;
+  }
+
+private:
+  void _M_init(streambuf_type* __p) {
+    _M_buf = __p;
+    _M_eof = !__p;
+    //    _M_is_initialized = _M_eof;
+    _M_have_c = false;
+  }
+
+  void _M_getc() const {
+    if (_M_have_c)
+      return;
+    int_type __c = _M_buf->sgetc();
+# if !defined (_STLP_NEED_MUTABLE) /* && ! defined (__SUNPRO_CC) */
+    _M_c = traits_type::to_char_type(__c);
+    _M_eof = traits_type::eq_int_type(__c, traits_type::eof());
+    _M_have_c = true;
+# else
+    typedef istreambuf_iterator<_CharT,_Traits> _Self;
+    _Self* __that = __CONST_CAST(_Self*, this);
+    __that->_M_c = __STATIC_CAST(_CharT, traits_type::to_char_type(__c));
+    __that->_M_eof = traits_type::eq_int_type(__c, traits_type::eof());
+    __that->_M_have_c = true;
+# endif
+  }
+
+  void _M_bumpc() {
+    _M_buf->sbumpc();
+    _M_have_c = false;
+  }
+
+private:
+  streambuf_type* _M_buf;
+  mutable _CharT _M_c;
+  mutable unsigned char _M_eof;
+  mutable unsigned char _M_have_c;
+};
+
+template<class _CharT, class _Traits>
+inline istreambuf_iterator<_CharT, _Traits>::istreambuf_iterator(basic_istream<_CharT, _Traits>& __is) 
+{ this->_M_init(_M_get_istreambuf(__is)); }
+
+template<class _CharT, class _Traits>
+inline bool _STLP_CALL operator==(const istreambuf_iterator<_CharT, _Traits>& __x,
+                                  const istreambuf_iterator<_CharT, _Traits>& __y) {
+  return __x.equal(__y);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template<class _CharT, class _Traits>
+inline bool _STLP_CALL operator!=(const istreambuf_iterator<_CharT, _Traits>& __x,
+                                  const istreambuf_iterator<_CharT, _Traits>& __y) {
+  return !__x.equal(__y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS istreambuf_iterator<char, char_traits<char> >;
+#  if defined (INSTANTIATE_WIDE_STREAMS)
+_STLP_EXPORT_TEMPLATE_CLASS istreambuf_iterator<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _CharT, class _Traits>
+inline input_iterator_tag _STLP_CALL iterator_category(const istreambuf_iterator<_CharT, _Traits>&) { return input_iterator_tag(); }
+template <class _CharT, class _Traits>
+inline streamoff* _STLP_CALL 
+distance_type(const istreambuf_iterator<_CharT, _Traits>&) { return (streamoff*)0; }
+template <class _CharT, class _Traits>
+inline _CharT* _STLP_CALL value_type(const istreambuf_iterator<_CharT, _Traits>&) { return (_CharT*)0; }
+# endif
+
+template <class _CharT, class _Traits>
+istreambuf_iterator<_CharT, _Traits>
+istreambuf_iterator<_CharT, _Traits>::operator++(int) {
+  istreambuf_iterator<_CharT, _Traits> __tmp = *this;
+  this->_M_bumpc();
+  this->_M_have_c = false;
+  return __tmp;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_iterator.h b/src/STLport/stl/_iterator.h
new file mode 100644
index 0000000..34baef7
--- /dev/null
+++ b/src/STLport/stl/_iterator.h
@@ -0,0 +1,269 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ITERATOR_H
+#define _STLP_INTERNAL_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+// This is the new version of reverse_iterator, as defined in the
+//  draft C++ standard.  It relies on the iterator_traits template,
+//  which in turn relies on partial specialization.  The class
+//  reverse_bidirectional_iterator is no longer part of the draft
+//  standard, but it is retained for backward compatibility.
+
+template <class _Iterator>
+class reverse_iterator : 
+  public iterator<typename iterator_traits<_Iterator>::iterator_category,
+                  typename iterator_traits<_Iterator>::value_type,
+                  typename iterator_traits<_Iterator>::difference_type,
+                  typename iterator_traits<_Iterator>::pointer,
+                  typename iterator_traits<_Iterator>::reference>
+{
+protected:
+  _Iterator current;
+  typedef reverse_iterator<_Iterator> _Self;
+public:
+  typedef typename iterator_traits<_Iterator>::iterator_category  iterator_category;
+  typedef typename iterator_traits<_Iterator>::value_type value_type;
+  typedef typename iterator_traits<_Iterator>::difference_type difference_type;
+  typedef typename iterator_traits<_Iterator>::pointer pointer;
+  typedef typename iterator_traits<_Iterator>::reference reference;
+  typedef _Iterator iterator_type;
+public:
+  reverse_iterator() {}
+  explicit reverse_iterator(iterator_type __x) : current(__x) {}
+  reverse_iterator(const _Self& __x) : current(__x.current) {}
+  _Self& operator = (const _Self& __x) { current = __x.base(); return *this; } 
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _Iter>
+  reverse_iterator(const reverse_iterator<_Iter>& __x) : current(__x.base()) {}
+  template <class _Iter>
+  _Self& operator = (const reverse_iterator<_Iter>& __x) { current = __x.base(); return *this; } 
+#endif /* _STLP_MEMBER_TEMPLATES */
+    
+  iterator_type base() const { return current; }
+  reference operator*() const {
+    _Iterator __tmp = current;
+    return *--__tmp;
+  }
+  _STLP_DEFINE_ARROW_OPERATOR
+  _Self& operator++() {
+    --current;
+    return *this;
+  }
+  _Self operator++(int) {
+    _Self __tmp = *this;
+    --current;
+    return __tmp;
+  }
+  _Self& operator--() {
+    ++current;
+    return *this;
+  }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    ++current;
+    return __tmp;
+  }
+
+  _Self operator+(difference_type __n) const {
+    return _Self(current - __n);
+  }
+  _Self& operator+=(difference_type __n) {
+    current -= __n;
+    return *this;
+  }
+  _Self operator-(difference_type __n) const {
+    return _Self(current + __n);
+  }
+  _Self& operator-=(difference_type __n) {
+    current += __n;
+    return *this;
+  }
+  reference operator[](difference_type __n) const { return *(*this + __n); }  
+}; 
+ 
+template <class _Iterator>
+inline bool  _STLP_CALL operator==(const reverse_iterator<_Iterator>& __x, 
+                       const reverse_iterator<_Iterator>& __y) {
+  return __x.base() == __y.base();
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator<(const reverse_iterator<_Iterator>& __x, 
+                      const reverse_iterator<_Iterator>& __y) {
+  return __y.base() < __x.base();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Iterator>
+inline bool _STLP_CALL operator!=(const reverse_iterator<_Iterator>& __x, 
+                       const reverse_iterator<_Iterator>& __y) {
+  return !(__x == __y);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator>(const reverse_iterator<_Iterator>& __x, 
+                      const reverse_iterator<_Iterator>& __y) {
+  return __y < __x;
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator<=(const reverse_iterator<_Iterator>& __x, 
+                       const reverse_iterator<_Iterator>& __y) {
+  return !(__y < __x);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL operator>=(const reverse_iterator<_Iterator>& __x, 
+                      const reverse_iterator<_Iterator>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _Iterator>
+# ifdef __SUNPRO_CC
+inline ptrdiff_t _STLP_CALL
+# else
+inline typename reverse_iterator<_Iterator>::difference_type _STLP_CALL
+# endif
+operator-(const reverse_iterator<_Iterator>& __x, 
+          const reverse_iterator<_Iterator>& __y) {
+  return __y.base() - __x.base();
+}
+
+template <class _Iterator, class _DifferenceType>
+inline reverse_iterator<_Iterator>  _STLP_CALL
+operator+(_DifferenceType n,const reverse_iterator<_Iterator>& x) {
+  return x.operator+(n);
+}
+
+# endif
+
+template <class _Container>
+class back_insert_iterator 
+  : public iterator<output_iterator_tag,void,void,void,void>
+{
+protected:
+  _Container* container;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+
+  explicit back_insert_iterator(_Container& __x) : container(&__x) {}
+  back_insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    container->push_back(__val);
+    return *this;
+  }
+  back_insert_iterator<_Container>& operator*() { return *this; }
+  back_insert_iterator<_Container>& operator++() { return *this; }
+  back_insert_iterator<_Container>  operator++(int) { return *this; }
+};
+
+template <class _Container>
+inline back_insert_iterator<_Container>  _STLP_CALL back_inserter(_Container& __x) {
+  return back_insert_iterator<_Container>(__x);
+}
+
+template <class _Container>
+class front_insert_iterator 
+  : public iterator<output_iterator_tag,void,void,void,void>
+{
+protected:
+  _Container* container;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  explicit front_insert_iterator(_Container& __x) : container(&__x) {}
+  front_insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    container->push_front(__val);
+    return *this;
+  }
+  front_insert_iterator<_Container>& operator*() { return *this; }
+  front_insert_iterator<_Container>& operator++() { return *this; }
+  front_insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Container>
+inline front_insert_iterator<_Container>  _STLP_CALL front_inserter(_Container& __x) {
+  return front_insert_iterator<_Container>(__x);
+}
+
+template <class _Container>
+class insert_iterator 
+  : public iterator<output_iterator_tag,void,void,void,void>
+{
+protected:
+  _Container* container;
+  typename _Container::iterator iter;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  insert_iterator(_Container& __x, typename _Container::iterator __i) 
+    : container(&__x), iter(__i) {}
+  insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    iter = container->insert(iter, __val);
+    ++iter;
+    return *this;
+  }
+  insert_iterator<_Container>& operator*() { return *this; }
+  insert_iterator<_Container>& operator++() { return *this; }
+  insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+template <class _Container, class _Iterator>
+inline insert_iterator<_Container>  _STLP_CALL
+inserter(_Container& __x, _Iterator __i)
+{
+  typedef typename _Container::iterator __iter;
+  return insert_iterator<_Container>(__x, __iter(__i));
+}
+
+_STLP_END_NAMESPACE
+
+#if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) || defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
+# include <stl/_iterator_old.h>
+#endif /* __NO_PARTIAL_SPEC || ANACHRONISMS */
+
+#endif /* _STLP_INTERNAL_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_iterator_base.h b/src/STLport/stl/_iterator_base.h
new file mode 100644
index 0000000..26b5161
--- /dev/null
+++ b/src/STLport/stl/_iterator_base.h
@@ -0,0 +1,463 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+#define _STLP_INTERNAL_ITERATOR_BASE_H
+
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+# if defined  (_STLP_IMPORT_VENDOR_CSTD) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+_STLP_BEGIN_NAMESPACE  
+using namespace _STLP_VENDOR_CSTD;
+_STLP_END_NAMESPACE
+#endif /* _STLP_IMPORT_VENDOR_CSTD */
+
+#ifndef __TYPE_TRAITS_H
+# include <stl/type_traits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+struct input_iterator_tag {};
+struct output_iterator_tag {};
+struct forward_iterator_tag : public input_iterator_tag {};
+struct bidirectional_iterator_tag : public forward_iterator_tag {};
+struct random_access_iterator_tag : public bidirectional_iterator_tag {};
+
+
+template <class _Category, class _Tp, __DFL_TMPL_PARAM(_Distance,ptrdiff_t),
+          __DFL_TMPL_PARAM(_Pointer,_Tp*), __DFL_TMPL_PARAM(_Reference,_Tp&) >
+struct iterator {
+  typedef _Category  iterator_category;
+  typedef _Tp        value_type;
+  typedef _Distance  difference_type;
+  typedef _Pointer   pointer;
+  typedef _Reference reference;
+};
+_STLP_TEMPLATE_NULL
+struct iterator<output_iterator_tag, void, void, void, void> {
+  typedef output_iterator_tag  iterator_category;
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+#endif
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+#  define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_category(_It)
+#  define _STLP_DISTANCE_TYPE(_It, _Tp)     distance_type(_It)
+#  define _STLP_VALUE_TYPE(_It, _Tp)        value_type(_It)
+# else
+#  ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+#   define _STLP_VALUE_TYPE(_It, _Tp)        (typename iterator_traits< _Tp >::value_type*)0
+#   define _STLP_DISTANCE_TYPE(_It, _Tp)     (typename iterator_traits< _Tp >::difference_type*)0
+#   if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
+#    define _STLP_ITERATOR_CATEGORY(_It, _Tp) iterator_traits< _Tp >::iterator_category()
+#   else
+#    define _STLP_ITERATOR_CATEGORY(_It, _Tp) typename iterator_traits< _Tp >::iterator_category()
+#   endif
+#  else
+#   define _STLP_ITERATOR_CATEGORY(_It, _Tp) __iterator_category(_It, _IsPtrType<_Tp>::_Ret())
+#   define _STLP_DISTANCE_TYPE(_It, _Tp)     (ptrdiff_t*)0
+#   define _STLP_VALUE_TYPE(_It, _Tp)        __value_type(_It, _IsPtrType<_Tp>::_Ret() )
+#  endif
+# endif
+
+template <class _Iterator>
+struct iterator_traits {
+  typedef typename _Iterator::iterator_category iterator_category;
+  typedef typename _Iterator::value_type        value_type;
+  typedef typename _Iterator::difference_type   difference_type;
+  typedef typename _Iterator::pointer           pointer;
+  typedef typename _Iterator::reference         reference;
+};
+
+
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) && ! defined (__SUNPRO_CC)
+#  define _STLP_DIFFERENCE_TYPE(_Iterator) typename iterator_traits<_Iterator>::difference_type
+# else
+#  define _STLP_DIFFERENCE_TYPE(_Iterator) ptrdiff_t
+# endif
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+// fbp : this order keeps gcc happy
+template <class _Tp>
+struct iterator_traits<const _Tp*> {
+  typedef random_access_iterator_tag iterator_category;
+  typedef _Tp                         value_type;
+  typedef ptrdiff_t                   difference_type;
+  typedef const _Tp*                  pointer;
+  typedef const _Tp&                  reference;
+};
+
+template <class _Tp>
+struct iterator_traits<_Tp*> {
+  typedef random_access_iterator_tag iterator_category;
+  typedef _Tp                         value_type;
+  typedef ptrdiff_t                   difference_type;
+  typedef _Tp*                        pointer;
+  typedef _Tp&                        reference;
+};
+
+#  if defined (__BORLANDC__)
+template <class _Tp>
+struct iterator_traits<_Tp* const> {
+  typedef random_access_iterator_tag iterator_category;
+  typedef _Tp                         value_type;
+  typedef ptrdiff_t                   difference_type;
+  typedef const _Tp*                  pointer;
+  typedef const _Tp&                  reference;
+};
+#  endif
+
+# endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+
+# if defined (_STLP_CLASS_PARTIAL_SPECIALIZATION) \
+  || (defined (_STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS) && ! defined (_STLP_NO_ARROW_OPERATOR))
+#  define _STLP_POINTERS_SPECIALIZE( _TpP )
+#  define _STLP_DEFINE_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }
+# else 
+#  include <stl/_ptrs_specialize.h>
+# endif
+
+# ifndef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+// The overloaded functions iterator_category, distance_type, and
+// value_type are not part of the C++ standard.  (They have been
+// replaced by struct iterator_traits.)  They are included for
+// backward compatibility with the HP STL.
+// We introduce internal names for these functions.
+
+#  ifdef  _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Iter>
+inline typename iterator_traits<_Iter>::iterator_category __iterator_category(const _Iter&) {
+  typedef typename iterator_traits<_Iter>::iterator_category _Category;
+  return _Category();
+}
+
+template <class _Iter>
+inline typename iterator_traits<_Iter>::difference_type* __distance_type(const _Iter&) {
+  typedef typename iterator_traits<_Iter>::difference_type _diff_type;
+  return __STATIC_CAST(_diff_type*,0);
+}
+
+template <class _Iter>
+inline typename iterator_traits<_Iter>::value_type* __value_type(const _Iter&) {
+  typedef typename iterator_traits<_Iter>::value_type _value_type;
+  return __STATIC_CAST(_value_type*,0);
+}
+
+# else
+
+template <class _Iter>
+inline random_access_iterator_tag 
+__iterator_category(const _Iter&, const __true_type&) {
+  return random_access_iterator_tag();
+}
+
+template <class _Iter>
+inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::iterator_category
+__iterator_category(const _Iter&, const __false_type&) {
+  typedef typename iterator_traits<_Iter>::iterator_category _Category;
+  return _Category();
+}
+
+
+template <class _Iter>
+inline ptrdiff_t* _STLP_CALL __distance_type(const _Iter&) { return (ptrdiff_t*)(0); }
+
+template <class _Iter>
+inline _STLP_TYPENAME_ON_RETURN_TYPE iterator_traits<_Iter>::value_type* 
+__value_type(const _Iter&, const __false_type&) {
+  typedef typename iterator_traits<_Iter>::value_type _value_type;
+  return __STATIC_CAST(_value_type*,0);
+}
+
+template <class _Tp>
+inline _Tp*  
+__value_type(const _Tp*, const __true_type&) {
+  return __STATIC_CAST(_Tp*, 0);
+}
+
+# endif
+
+#else /* old queries */
+template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
+inline _Category _STLP_CALL iterator_category(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return _Category(); }
+template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
+inline _Tp* _STLP_CALL value_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Tp*)(0); }
+template <class _Category, class _Tp, class _Distance, class _Pointer, class _Reference>
+inline _Distance* _STLP_CALL distance_type(const iterator<_Category,_Tp,_Distance,_Pointer,_Reference>&) { return (_Distance*)(0); }
+template <class _Tp>
+inline random_access_iterator_tag _STLP_CALL iterator_category(const _Tp*) { return random_access_iterator_tag(); }
+template <class _Tp>
+inline _Tp* _STLP_CALL value_type(const _Tp*) { return (_Tp*)(0); }
+template <class _Tp>
+inline ptrdiff_t* _STLP_CALL distance_type(const _Tp*) { return (ptrdiff_t*)(0); }
+#endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
+
+# if ! defined (_STLP_NO_ANACHRONISMS)
+// The base classes input_iterator, output_iterator, forward_iterator,
+// bidirectional_iterator, and random_access_iterator are not part of
+// the C++ standard.  (They have been replaced by struct iterator.)
+// They are included for backward compatibility with the HP STL.
+template <class _Tp, class _Distance> struct input_iterator : 
+  public iterator <input_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+struct output_iterator : public iterator <output_iterator_tag, void, void, void, void> {};
+template <class _Tp, class _Distance> struct forward_iterator :
+  public iterator<forward_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+template <class _Tp, class _Distance> struct bidirectional_iterator :
+  public iterator<bidirectional_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+template <class _Tp, class _Distance> struct random_access_iterator :
+  public iterator<random_access_iterator_tag, _Tp, _Distance, _Tp*, _Tp&> {};
+
+# if defined (_STLP_BASE_MATCH_BUG) && defined (_STLP_USE_OLD_HP_ITERATOR_QUERIES)
+template <class _Tp, class _Distance> 
+inline input_iterator_tag _STLP_CALL 
+iterator_category(const input_iterator<_Tp, _Distance>&) { return input_iterator_tag(); }
+inline output_iterator_tag _STLP_CALL
+iterator_category(const output_iterator&) { return output_iterator_tag(); }
+template <class _Tp, class _Distance> 
+inline forward_iterator_tag _STLP_CALL
+iterator_category(const forward_iterator<_Tp, _Distance>&) { return forward_iterator_tag(); }
+template <class _Tp, class _Distance> 
+inline bidirectional_iterator_tag _STLP_CALL 
+iterator_category(const bidirectional_iterator<_Tp, _Distance>&) { return bidirectional_iterator_tag(); }
+template <class _Tp, class _Distance> 
+inline random_access_iterator_tag _STLP_CALL
+iterator_category(const random_access_iterator<_Tp, _Distance>&) { return random_access_iterator_tag(); }
+template <class _Tp, class _Distance> 
+inline _Tp*  _STLP_CALL value_type(const input_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance> 
+inline _Tp* _STLP_CALL value_type(const forward_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance> 
+inline _Tp* _STLP_CALL value_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance> 
+inline _Tp* _STLP_CALL value_type(const random_access_iterator<_Tp, _Distance>&) { return (_Tp*)(0); }
+template <class _Tp, class _Distance> 
+inline _Distance* _STLP_CALL distance_type(const input_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
+template <class _Tp, class _Distance> 
+inline _Distance* _STLP_CALL distance_type(const forward_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
+template <class _Tp, class _Distance> 
+inline _Distance* _STLP_CALL distance_type(const bidirectional_iterator<_Tp, _Distance>&) { return (_Distance*)(0);}
+template <class _Tp, class _Distance> 
+inline _Distance* _STLP_CALL distance_type(const random_access_iterator<_Tp, _Distance>&) { return (_Distance*)(0); }
+# endif /* BASE_MATCH */
+
+#endif /* _STLP_NO_ANACHRONISMS */
+
+template <class _InputIterator, class _Distance>
+inline void _STLP_CALL __distance(const _InputIterator& __first, const _InputIterator& __last,
+				  _Distance& __n, const input_iterator_tag &) {
+  _InputIterator __it(__first);
+  while (__it != __last) { ++__it; ++__n; }
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) 
+template <class _ForwardIterator, class _Distance>
+inline void _STLP_CALL __distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
+				  _Distance& __n, const forward_iterator_tag &) {
+  _ForwardIterator __it(__first);
+  while (__it != __last) { ++__first; ++__n; }
+}
+
+template <class _BidirectionalIterator, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __distance(const _BidirectionalIterator& __first, 
+					     const _BidirectionalIterator& __last,
+					     _Distance& __n, const bidirectional_iterator_tag &) {
+  _BidirectionalIterator __it(__first);
+  while (__it != __last) { ++__it; ++__n; }
+}
+# endif
+
+template <class _RandomAccessIterator, class _Distance>
+inline void _STLP_CALL __distance(const _RandomAccessIterator& __first, 
+				  const _RandomAccessIterator& __last, 
+				  _Distance& __n, const random_access_iterator_tag &) {
+  __n += __last - __first;
+}
+
+#ifndef _STLP_NO_ANACHRONISMS 
+template <class _InputIterator, class _Distance>
+inline void _STLP_CALL distance(const _InputIterator& __first, 
+				const _InputIterator& __last, _Distance& __n) {
+  __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+}
+#endif
+
+template <class _InputIterator>
+inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
+__distance(const _InputIterator& __first, const _InputIterator& __last, const input_iterator_tag &) {
+  _STLP_DIFFERENCE_TYPE(_InputIterator) __n = 0;
+  _InputIterator __it(__first);  
+  while (__it != __last) {
+    ++__it; ++__n;
+  }
+  return __n;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG) 
+template <class _ForwardIterator>
+inline _STLP_DIFFERENCE_TYPE(_ForwardIterator) _STLP_CALL 
+__distance(const _ForwardIterator& __first, const _ForwardIterator& __last,
+           const forward_iterator_tag &)
+{
+  _STLP_DIFFERENCE_TYPE(_ForwardIterator) __n = 0;
+  _ForwardIterator __it(__first);
+  while (__it != __last) {
+    ++__it; ++__n;
+  }
+  return __n;
+}
+
+template <class _BidirectionalIterator>
+_STLP_INLINE_LOOP _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) _STLP_CALL 
+__distance(const _BidirectionalIterator& __first, 
+           const _BidirectionalIterator& __last,
+           const bidirectional_iterator_tag &) {
+  _STLP_DIFFERENCE_TYPE(_BidirectionalIterator) __n = 0;
+  _BidirectionalIterator __it(__first);
+  while (__it != __last) {
+    ++__it; ++__n;
+  }
+  return __n;
+}
+# endif
+
+template <class _RandomAccessIterator>
+inline _STLP_DIFFERENCE_TYPE(_RandomAccessIterator) _STLP_CALL
+__distance(const _RandomAccessIterator& __first, const _RandomAccessIterator& __last,
+           const random_access_iterator_tag &) {
+  return __last - __first;
+}
+
+template <class _InputIterator>
+inline _STLP_DIFFERENCE_TYPE(_InputIterator) _STLP_CALL
+distance(const _InputIterator& __first, const _InputIterator& __last) {
+  return __distance(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));  
+}
+
+
+// fbp: those are being used for iterator/const_iterator definitions everywhere
+template <class _Tp>
+struct _Nonconst_traits;
+
+template <class _Tp>
+struct _Const_traits {
+  typedef _Tp value_type;
+  typedef const _Tp&  reference;
+  typedef const _Tp*  pointer;
+  typedef _Nonconst_traits<_Tp> _Non_const_traits;
+};
+
+template <class _Tp>
+struct _Nonconst_traits {
+  typedef _Tp value_type;
+  typedef _Tp& reference;
+  typedef _Tp* pointer;
+  typedef _Nonconst_traits<_Tp> _Non_const_traits;
+};
+
+#  if defined (_STLP_BASE_TYPEDEF_BUG)
+// this workaround is needed for SunPro 4.0.1
+template <class _Traits>
+struct __cnst_traits_aux : private _Traits
+{
+  typedef typename _Traits::value_type value_type;
+};
+#  define __TRAITS_VALUE_TYPE(_Traits) __cnst_traits_aux<_Traits>::value_type
+#  else
+#  define __TRAITS_VALUE_TYPE(_Traits) _Traits::value_type
+#  endif
+
+# if defined (_STLP_MSVC)
+// MSVC specific
+template <class _InputIterator, class _Dist>
+inline void  _STLP_CALL _Distance(_InputIterator __first, 
+		      _InputIterator __last, _Dist& __n) {
+  __distance(__first, __last, __n, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+}
+# endif
+
+template <class _InputIter, class _Distance>
+_STLP_INLINE_LOOP void  _STLP_CALL __advance(_InputIter& __i, _Distance __n, const input_iterator_tag &) {
+  while (__n--) ++__i;
+}
+
+// fbp : added output iterator tag variant
+template <class _InputIter, class _Distance>
+_STLP_INLINE_LOOP void  _STLP_CALL __advance(_InputIter& __i, _Distance __n, const output_iterator_tag &) {
+  while (__n--) ++__i;
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _ForwardIterator, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __advance(_ForwardIterator& i, _Distance n, const forward_iterator_tag &) {
+    while (n--) ++i;
+}
+# endif
+
+template <class _BidirectionalIterator, class _Distance>
+_STLP_INLINE_LOOP void _STLP_CALL __advance(_BidirectionalIterator& __i, _Distance __n, 
+                      const bidirectional_iterator_tag &) {
+  if (__n > 0)
+    while (__n--) ++__i;
+  else
+    while (__n++) --__i;
+}
+
+template <class _RandomAccessIterator, class _Distance>
+inline void _STLP_CALL __advance(_RandomAccessIterator& __i, _Distance __n, 
+                      const random_access_iterator_tag &) {
+  __i += __n;
+}
+
+template <class _InputIterator, class _Distance>
+inline void _STLP_CALL advance(_InputIterator& __i, _Distance __n) {
+  __advance(__i, __n, _STLP_ITERATOR_CATEGORY(__i, _InputIterator));
+}
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_DEBUG) && ! defined (_STLP_DEBUG_H)
+#  include <stl/debug/_debug.h>
+# endif
+
+#endif /* _STLP_INTERNAL_ITERATOR_BASE_H */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_iterator_old.h b/src/STLport/stl/_iterator_old.h
new file mode 100644
index 0000000..3b3b038
--- /dev/null
+++ b/src/STLport/stl/_iterator_old.h
@@ -0,0 +1,351 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_ITERATOR_OLD_H
+#define _STLP_INTERNAL_ITERATOR_OLD_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+
+template <class _Container>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const back_insert_iterator<_Container>&) { return output_iterator_tag(); }
+template <class _Container>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const front_insert_iterator<_Container>&) { return output_iterator_tag(); }
+template <class _Container>
+inline output_iterator_tag _STLP_CALL
+iterator_category(const insert_iterator<_Container>&) { return output_iterator_tag(); }
+
+# endif
+
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+# define __Reference _Reference, class _Pointer
+# define Reference__ _Reference, _Pointer
+template <class _BidirectionalIterator, class _Tp, 
+    __DFL_TMPL_PARAM(_Reference, _Tp& ),
+    __DFL_TMPL_PARAM(_Pointer, _Tp*),
+    __DFL_TYPE_PARAM(_Distance, ptrdiff_t)> 
+# else
+# define __Reference _Reference
+# define Reference__ _Reference
+template <class _BidirectionalIterator, class _Tp, __DFL_TMPL_PARAM(_Reference, _Tp& ),
+    __DFL_TYPE_PARAM(_Distance, ptrdiff_t)> 
+# endif
+class reverse_bidirectional_iterator {
+  typedef reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, 
+                                         Reference__, _Distance> _Self;
+  //  friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& x, const _Self& y);
+protected:
+  _BidirectionalIterator current;
+public:
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef _Tp                        value_type;
+  typedef _Distance                  difference_type;
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+  typedef _Pointer                   pointer;
+# else
+  typedef _Tp*                       pointer;
+# endif
+  typedef _Reference                 reference;
+
+  reverse_bidirectional_iterator() {}
+  explicit reverse_bidirectional_iterator(_BidirectionalIterator __x)
+    : current(__x) {}
+  _BidirectionalIterator base() const { return current; }
+  _Reference operator*() const {
+    _BidirectionalIterator __tmp = current;
+    return *--__tmp;
+  }
+# if !(defined _STLP_NO_ARROW_OPERATOR)
+  _STLP_DEFINE_ARROW_OPERATOR
+# endif
+  _Self& operator++() {
+    --current;
+    return *this;
+  }
+  _Self operator++(int) {
+    _Self __tmp = *this;
+    --current;
+    return __tmp;
+  }
+  _Self& operator--() {
+    ++current;
+    return *this;
+  }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    ++current;
+    return __tmp;
+  }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _BidirectionalIterator, class _Tp, class __Reference, 
+          class _Distance>
+inline bidirectional_iterator_tag _STLP_CALL
+iterator_category(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&) 
+{ return bidirectional_iterator_tag(); }
+template <class _BidirectionalIterator, class _Tp, class __Reference, 
+  class _Distance>
+inline _Tp* _STLP_CALL
+value_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&)
+{ return (_Tp*) 0; }
+template <class _BidirectionalIterator, class _Tp, class __Reference, 
+          class _Distance>
+inline _Distance* _STLP_CALL
+distance_type(const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp, Reference__, _Distance>&)
+{ return (_Distance*) 0; }
+#endif
+
+template <class _BidirectionalIterator, class _Tp, class __Reference, 
+          class _Distance>
+inline bool  _STLP_CALL operator==(
+    const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,
+                                               Reference__, _Distance>& __x,
+    const reverse_bidirectional_iterator<_BidirectionalIterator, _Tp,
+                                               Reference__, _Distance>& __y)
+{
+  return __x.base() == __y.base();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _BiIter, class _Tp, class __Reference, class _Distance>
+inline bool  _STLP_CALL operator!=(
+    const reverse_bidirectional_iterator<_BiIter, _Tp, Reference__, _Distance>& __x, 
+    const reverse_bidirectional_iterator<_BiIter, _Tp, Reference__, _Distance>& __y)
+{
+  return !(__x == __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#if ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION )
+
+// This is the old version of reverse_iterator, as found in the original
+//  HP STL.  It does not use partial specialization.
+
+template <class _RandomAccessIterator, 
+# if defined (__MSL__) && (__MSL__ >= 0x2405) \
+	|| defined(__MRC__) || (defined(__SC__) && !defined(__DMC__))		//*ty 03/22/2001 - give the default to the secont param under MPW. 
+												// I believe giving the default will cause any harm even though the 2nd type parameter 
+												// still have to be provided for T* type iterators.
+	__DFL_TMPL_PARAM(_Tp,iterator_traits<_RandomAccessIterator>::value_type),
+# else
+	class _Tp,
+#endif
+ __DFL_TMPL_PARAM(_Reference,_Tp&),
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+        __DFL_TMPL_PARAM(_Pointer, _Tp*),
+# endif
+        __DFL_TYPE_PARAM(_Distance,ptrdiff_t)> 
+class reverse_iterator {
+  typedef reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>
+          _Self;
+protected:
+  _RandomAccessIterator __current;
+public:
+  typedef random_access_iterator_tag iterator_category;
+  typedef _Tp                        value_type;
+  typedef _Distance                  difference_type;
+# if defined (_STLP_MSVC50_COMPATIBILITY)
+  typedef _Pointer                   pointer;
+# else
+  typedef _Tp*                       pointer;
+# endif
+  typedef _Reference                 reference;
+
+  reverse_iterator() {}
+  reverse_iterator(const _Self& __x) : __current(__x.base()) {}
+  explicit reverse_iterator(_RandomAccessIterator __x) : __current(__x) {}
+  _Self& operator=(const _Self& __x) {__current = __x.base(); return *this; }  
+       
+  _RandomAccessIterator base() const { return __current; }
+  _Reference operator*() const { return *(__current - (difference_type)1); }
+
+# if !(defined _STLP_NO_ARROW_OPERATOR)
+  _STLP_DEFINE_ARROW_OPERATOR
+# endif
+
+  _Self& operator++() {
+    --__current;
+    return *this;
+  }
+  _Self operator++(int) {
+    _Self __tmp = *this;
+    --__current;
+    return __tmp;
+  }
+  _Self& operator--() {
+    ++__current;
+    return *this;
+  }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    ++__current;
+    return __tmp;
+  }
+  _Self operator+(_Distance __n) const {
+    return _Self(__current - __n);
+  }
+  _Self& operator+=(_Distance __n) {
+    __current -= __n;
+    return *this;
+  }
+  _Self operator-(_Distance __n) const {
+    return _Self(__current + __n);
+  }
+  _Self& operator-=(_Distance __n) {
+    __current += __n;
+    return *this;
+  }
+  _Reference operator[](_Distance __n) const { return *(*this + __n); }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _RandomAccessIterator, class _Tp, 
+          class __Reference, class _Distance>
+inline random_access_iterator_tag _STLP_CALL
+iterator_category(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&)
+{ return random_access_iterator_tag(); }
+template <class _RandomAccessIterator, class _Tp,
+  class __Reference, class _Distance>
+inline _Tp*  _STLP_CALL value_type(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&)
+{ return (_Tp*) 0; }
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline _Distance*  _STLP_CALL
+distance_type(const reverse_iterator<_RandomAccessIterator, _Tp, Reference__, _Distance>&)
+{ return (_Distance*) 0; }
+#endif
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline bool  _STLP_CALL
+operator==(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __x, 
+           const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __y)
+{
+  return __x.base() == __y.base();
+}
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline bool _STLP_CALL 
+operator<(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __x, 
+          const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __y)
+{
+  return __y.base() < __x.base();
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline bool _STLP_CALL 
+operator!=(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __x, 
+           const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __y) {
+  return !(__x == __y);
+}
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline bool _STLP_CALL 
+operator>(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __x, 
+          const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __y) {
+  return __y < __x;
+}
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline bool _STLP_CALL 
+operator<=(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __x, 
+           const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __y) {
+  return !(__y < __x);
+}
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline bool _STLP_CALL 
+operator>=(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __x, 
+           const reverse_iterator<_RandomAccessIterator, _Tp,
+                                  Reference__, _Distance>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline _Distance  _STLP_CALL
+operator-(const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __x, 
+          const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __y)
+{
+  return __y.base() - __x.base();
+}
+
+template <class _RandomAccessIterator, class _Tp,
+          class __Reference, class _Distance>
+inline reverse_iterator<_RandomAccessIterator, _Tp,
+                        Reference__, _Distance>  _STLP_CALL
+operator+(_Distance __n,
+          const reverse_iterator<_RandomAccessIterator, _Tp,
+                                 Reference__, _Distance>& __x)
+{
+  return reverse_iterator<_RandomAccessIterator, _Tp,
+                          Reference__, _Distance>(__x.base() - __n);
+}
+
+#endif /* ! defined ( _STLP_CLASS_PARTIAL_SPECIALIZATION ) */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_limits.c b/src/STLport/stl/_limits.c
new file mode 100644
index 0000000..5048d3f
--- /dev/null
+++ b/src/STLport/stl/_limits.c
@@ -0,0 +1,293 @@
+/*
+ * Copyright (c) 1998,1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_LIMITS_C)
+#  define _STLP_LIMITS_C
+
+#ifndef _STLP_INTERNAL_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+//==========================================================
+//  numeric_limits static members
+//==========================================================
+
+_STLP_BEGIN_NAMESPACE
+
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+
+#   define __declare_numeric_base_member(__type, __mem, _Init) \
+template <class __number> \
+  const __type _Numeric_limits_base<__number>:: __mem
+
+__declare_numeric_base_member(bool, is_specialized, false);
+__declare_numeric_base_member(int, digits, 0);
+__declare_numeric_base_member(int, digits10, 0);
+__declare_numeric_base_member(bool, is_signed, false);
+__declare_numeric_base_member(bool, is_integer, false);
+__declare_numeric_base_member(bool, is_exact, false);
+__declare_numeric_base_member(int, radix, 0);
+__declare_numeric_base_member(int, min_exponent, 0);
+__declare_numeric_base_member(int, max_exponent, 0);
+__declare_numeric_base_member(int, min_exponent10, 0);
+__declare_numeric_base_member(int, max_exponent10, 0);
+__declare_numeric_base_member(bool, has_infinity, false);
+__declare_numeric_base_member(bool, has_quiet_NaN, false);
+__declare_numeric_base_member(bool, has_signaling_NaN, false);
+__declare_numeric_base_member(float_denorm_style, has_denorm, denorm_absent);
+__declare_numeric_base_member(bool, has_denorm_loss, false);
+__declare_numeric_base_member(bool, is_iec559, false);
+__declare_numeric_base_member(bool, is_bounded, false);
+__declare_numeric_base_member(bool, is_modulo, false);
+__declare_numeric_base_member(bool, traps, false);
+__declare_numeric_base_member(bool, tinyness_before, false);
+__declare_numeric_base_member(float_round_style, round_style, round_toward_zero);
+
+# undef __declare_numeric_base_member
+
+#   define __declare_integer_limits_member(__type, __mem, _Init) \
+template <class _Int, _STLP_LIMITS_MIN_TYPE __imin, _STLP_LIMITS_MAX_TYPE __imax, int __idigits, bool __ismod> \
+  const __type _Integer_limits<_Int, __imin, __imax, __idigits, __ismod>:: __mem
+
+__declare_integer_limits_member(bool, is_specialized, true);
+__declare_integer_limits_member(int, digits, (__idigits < 0) ? \
+			    ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1)) \
+                            : (__idigits) );
+__declare_integer_limits_member(int, digits10, (int)(301UL * digits) /1000);
+__declare_integer_limits_member(bool, is_signed, __imin != 0);
+__declare_integer_limits_member(bool, is_integer, true);
+__declare_integer_limits_member(bool, is_exact, true);
+__declare_integer_limits_member(int, radix, 2);
+__declare_integer_limits_member(bool, is_bounded, true);
+__declare_integer_limits_member(bool, is_modulo, true);
+
+#   define __declare_float_limits_member(__type, __mem, _Init) \
+template <class __number,  \
+         int __Digits, int __Digits10,    \
+         int __MinExp, int __MaxExp,      \
+         int __MinExp10, int __MaxExp10,  \
+         bool __IsIEC559, \
+         float_round_style __RoundStyle> \
+const __type _Floating_limits< __number, __Digits, __Digits10,    \
+         __MinExp, __MaxExp, __MinExp10, __MaxExp10,  \
+         __IsIEC559, __RoundStyle>::\
+         __mem
+
+__declare_float_limits_member(bool, is_specialized, true);  
+__declare_float_limits_member(int, digits, __Digits);  
+__declare_float_limits_member(int, digits10, __Digits10);  
+__declare_float_limits_member(bool, is_signed, true);  
+__declare_float_limits_member(int, radix, FLT_RADIX);  
+__declare_float_limits_member(int, min_exponent, __MinExp);  
+__declare_float_limits_member(int, max_exponent, __MaxExp);  
+__declare_float_limits_member(int, min_exponent10, __MinExp10);  
+__declare_float_limits_member(int, max_exponent10, __MaxExp10);  
+__declare_float_limits_member(bool, has_infinity, true);
+__declare_float_limits_member(bool, has_quiet_NaN, true);
+__declare_float_limits_member(bool, has_signaling_NaN, true);
+__declare_float_limits_member(float_denorm_style, has_denorm, denorm_indeterminate);
+__declare_float_limits_member(bool, has_denorm_loss, false);
+__declare_float_limits_member(bool, is_iec559, __IsIEC559);
+__declare_float_limits_member(bool, is_bounded, true);
+__declare_float_limits_member(bool, traps, true);
+__declare_float_limits_member(bool, tinyness_before, false);
+__declare_float_limits_member(float_round_style, round_style, __RoundStyle);
+
+# endif /* _STLP_STATIC_CONST_INIT_BUG */
+
+
+# ifdef _STLP_EXPOSE_GLOBALS_IMPLEMENTATION
+
+# if defined(_STLP_BIG_ENDIAN)
+# if defined(__OS400__)
+#  define _STLP_FLOAT_INF_REP { 0x7f80, 0 }
+#  define _STLP_FLOAT_QNAN_REP { 0xffc0, 0 }
+#  define _STLP_FLOAT_SNAN_REP { 0xff80, 0 }
+#  define _STLP_DOUBLE_INF_REP { 0x7ff0, 0, 0, 0 }
+#  define _STLP_DOUBLE_QNAN_REP { 0xfff8, 0, 0, 0 }
+#  define _STLP_DOUBLE_SNAN_REP { 0xfff0, 0, 0, 0 }
+#  define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
+#  define _STLP_LDOUBLE_QNAN_REP { 0xfff8, 0, 0, 0, 0, 0, 0, 0 }
+#  define _STLP_LDOUBLE_SNAN_REP { 0xfff0, 0, 0, 0, 0, 0, 0, 0 }
+# else
+#  define _STLP_FLOAT_INF_REP   { 0x7f80, 0 }
+#  define _STLP_FLOAT_SNAN_REP  { 0x7f81, 0 }
+#  define _STLP_FLOAT_QNAN_REP  { 0x7fc1, 0 }
+#  define _STLP_DOUBLE_INF_REP  { 0x7ff0, 0, 0, 0 }
+#  define _STLP_DOUBLE_QNAN_REP { 0x7ff1, 0, 0, 0 }
+#  define _STLP_DOUBLE_SNAN_REP { 0x7ff9, 0, 0, 0 }
+#  define _STLP_LDOUBLE_INF_REP { 0x7ff0, 0, 0, 0, 0, 0, 0, 0 }
+#  define _STLP_LDOUBLE_SNAN_REP { 0x7ff1, 0, 0, 0, 0, 0, 0, 0 }
+#  define _STLP_LDOUBLE_QNAN_REP { 0x7ff9, 0, 0, 0, 0, 0, 0, 0 }
+# endif
+
+# elif defined (_STLP_LITTLE_ENDIAN)
+
+# if 0 /* defined(_STLP_MSVC) || defined(__linux__) */
+// some IA-32 platform ?? 
+#  define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
+#  define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
+#  define _STLP_FLOAT_SNAN_REP { 0, 0xff80 }
+
+#  define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+#  define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
+#  define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0xfff0 }
+#  define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 } // ????
+#  define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 } // ????
+#  define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF0, 0 } // ????
+
+# elif defined(__DECCXX)
+
+#  define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
+#  define _STLP_FLOAT_QNAN_REP { 0, 0xffc0 }
+#  define _STLP_FLOAT_SNAN_REP { 0x5555, 0x7f85 }
+
+#  define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+#  define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0xfff8 }
+#  define _STLP_DOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x7ff5 }
+
+#  define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0, 0, 0, 0, 0x7fff }
+#  define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0, 0, 0, 0x8000, 0xffff }
+#  define _STLP_LDOUBLE_SNAN_REP { 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x7fff}
+# else
+#  define _STLP_FLOAT_INF_REP { 0, 0x7f80 }
+#  define _STLP_FLOAT_QNAN_REP { 0, 0x7fa0 }
+#  define _STLP_FLOAT_SNAN_REP { 0, 0x7fc0 }
+#  define _STLP_DOUBLE_INF_REP { 0, 0, 0, 0x7ff0 }
+#  define _STLP_DOUBLE_QNAN_REP { 0, 0, 0, 0x7ff4 }
+#  define _STLP_DOUBLE_SNAN_REP { 0, 0, 0, 0x7ff8 }
+#  if defined (_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__)
+#   define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x7FF0, 0 } // ????
+#   define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xFFF8, 0 } // ????
+#   define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xFFF8, 0 }
+#  else
+#   define _STLP_LDOUBLE_INF_REP { 0, 0, 0, 0x8000, 0x7fff }
+#   define _STLP_LDOUBLE_QNAN_REP { 0, 0, 0, 0xa000, 0x7fff }
+#   define _STLP_LDOUBLE_SNAN_REP { 0, 0, 0, 0xc000, 0x7fff }
+#  endif
+# endif
+#else
+/* This is an architecture we don't know how to handle. Return some
+obviously wrong values. */
+# define _STLP_FLOAT_INF_REP { 0, 0 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0 }
+# define _STLP_FLOAT_SNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_INF_REP { 0, 0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_SNAN_REP { 0, 0 }
+# define _STLP_LDOUBLE_INF_REP { 0 }
+# define _STLP_LDOUBLE_QNAN_REP { 0 }
+# define _STLP_LDOUBLE_SNAN_REP { 0 }
+
+#endif
+
+
+# if 0
+# if defined(_STLP_BIG_ENDIAN)
+
+# elif defined (_STLP_LITTLE_ENDIAN)
+#else 
+
+/* This is an architecture we don't know how to handle.  Return some 
+   obviously wrong values. */
+# define _STLP_FLOAT_INF_REP  { 0, 0 }
+# define _STLP_FLOAT_QNAN_REP { 0, 0 }
+# define _STLP_FLOAT_SNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_INF_REP  { 0, 0 }
+# define _STLP_DOUBLE_QNAN_REP { 0, 0 }
+# define _STLP_DOUBLE_SNAN_REP { 0, 0 }
+# define _STLP_LDOUBLE_INF_REP  { 0 }
+# define _STLP_LDOUBLE_QNAN_REP { 0 }
+# define _STLP_LDOUBLE_SNAN_REP { 0 }
+
+#endif
+# endif
+
+#if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+# ifndef _STLP_NO_LONG_DOUBLE
+template <class __dummy>
+const _L_rep _LimG<__dummy>::_L_inf  = {_STLP_LDOUBLE_INF_REP}; 
+template <class __dummy>
+const _L_rep _LimG<__dummy>::_L_qNaN  = {_STLP_LDOUBLE_QNAN_REP}; 
+template <class __dummy>
+const _L_rep _LimG<__dummy>::_L_sNaN  = {_STLP_LDOUBLE_SNAN_REP}; 
+# endif
+template <class __dummy>
+const _D_rep _LimG<__dummy>::_D_inf  = {_STLP_DOUBLE_INF_REP}; 
+template <class __dummy>
+const _D_rep _LimG<__dummy>::_D_qNaN  = {_STLP_DOUBLE_QNAN_REP}; 
+template <class __dummy>
+const _D_rep _LimG<__dummy>::_D_sNaN  = {_STLP_DOUBLE_SNAN_REP}; 
+template <class __dummy>
+const _F_rep _LimG<__dummy>::_F_inf  = {_STLP_FLOAT_INF_REP}; 
+template <class __dummy>
+const _F_rep _LimG<__dummy>::_F_qNaN  = {_STLP_FLOAT_QNAN_REP}; 
+template <class __dummy>
+const _F_rep _LimG<__dummy>::_F_sNaN  = {_STLP_FLOAT_SNAN_REP}; 
+
+#else
+
+__DECLARE_INSTANCE( const _F_rep,
+                   _LimG<bool>::_F_inf,  = _STLP_FLOAT_INF_REP);
+__DECLARE_INSTANCE( const _F_rep,
+                   _LimG<bool>::_F_qNaN,  = _STLP_FLOAT_QNAN_REP);
+__DECLARE_INSTANCE( const _F_rep,
+                   _LimG<bool>::_F_sNaN,  = _STLP_FLOAT_SNAN_REP);
+__DECLARE_INSTANCE( const _D_rep,
+                   _LimG<bool>::_D_inf,  = _STLP_DOUBLE_INF_REP);
+__DECLARE_INSTANCE( const _D_rep,
+                   _LimG<bool>::_D_qNaN,  = _STLP_DOUBLE_QNAN_REP);
+__DECLARE_INSTANCE( const _D_rep,
+                   _LimG<bool>::_D_sNaN,  = _STLP_DOUBLE_SNAN_REP);
+# ifndef _STLP_NO_LONG_DOUBLE
+__DECLARE_INSTANCE( const _L_rep,
+                   _LimG<bool>::_L_inf,  = _STLP_LDOUBLE_INF_REP);
+__DECLARE_INSTANCE( const _L_rep,
+                   _LimG<bool>::_L_qNaN,  = _STLP_LDOUBLE_QNAN_REP);
+__DECLARE_INSTANCE( const _L_rep,
+                   _LimG<bool>::_L_sNaN,  = _STLP_LDOUBLE_SNAN_REP);
+# endif
+
+#endif /* STATIC_DATA */   
+
+# endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
+    
+# undef __declare_integer_limits_member
+# undef __declare_float_limits_member
+# undef __HACK_ILIMITS
+# undef __HACK_NOTHING
+# undef __declare_int_members
+# undef __declare_float_members
+# undef _STLP_LIMITS_MIN_TYPE
+# undef _STLP_LIMITS_MAX_TYPE
+
+# undef _STLP_FLOAT_INF_REP
+# undef _STLP_FLOAT_QNAN_REP
+# undef _STLP_FLOAT_SNAN_REP
+# undef _STLP_DOUBLE_INF_REP
+# undef _STLP_DOUBLE_QNAN_REP
+# undef _STLP_DOUBLE_SNAN_REP
+# undef _STLP_LDOUBLE_INF_REP
+# undef _STLP_LDOUBLE_QNAN_REP
+# undef _STLP_LDOUBLE_SNAN_REP
+
+_STLP_END_NAMESPACE
+
+
+#endif /* _STLP_LIMITS_C_INCLUDED */
diff --git a/src/STLport/stl/_limits.h b/src/STLport/stl/_limits.h
new file mode 100644
index 0000000..67987ee
--- /dev/null
+++ b/src/STLport/stl/_limits.h
@@ -0,0 +1,557 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This may be not portable code. Parts of numeric_limits<> are
+ * inherently machine-dependent.  At present this file is suitable
+ * for the MIPS, SPARC, Alpha and ia32 architectures.
+ */
+
+#ifndef _STLP_INTERNAL_LIMITS_H
+# define _STLP_INTERNAL_LIMITS_H
+
+#ifndef _STLP_CLIMITS
+# include <climits>
+#endif
+
+#ifndef _STLP_CFLOAT
+# include <cfloat>
+#endif
+
+#if !defined (_STLP_NO_WCHAR_T) && !defined (_STLP_CWCHAR_H)
+# include <stl/_cwchar.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+enum float_round_style {
+  round_indeterminate       = -1,
+  round_toward_zero         =  0,
+  round_to_nearest          =  1,
+  round_toward_infinity     =  2,
+  round_toward_neg_infinity =  3
+};
+
+enum float_denorm_style {
+  denorm_indeterminate = -1,
+  denorm_absent        =  0,
+  denorm_present       =  1
+};
+
+// Base class for all specializations of numeric_limits.
+
+template <class __number>
+class _Numeric_limits_base {
+public:
+
+  static __number (_STLP_CALL min)() _STLP_NOTHROW { return __number(); }
+  static __number (_STLP_CALL max)() _STLP_NOTHROW { return __number(); }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  enum {
+# else
+  static const int 
+# endif
+  
+  digits = 0,
+  digits10 = 0,
+  radix = 0,
+  min_exponent = 0,
+  min_exponent10 = 0,
+  max_exponent = 0,
+  max_exponent10 = 0
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  ,  
+  has_denorm = denorm_absent,
+  round_style = round_toward_zero,
+# else
+  ;
+  static const float_denorm_style has_denorm =  denorm_absent;
+  static const float_round_style round_style = round_toward_zero;
+  static const bool 
+# endif
+
+    is_specialized = false,
+    is_signed  = false,
+    is_integer = false,
+    is_exact = false,
+    has_infinity = false,
+    has_quiet_NaN = false,
+    has_signaling_NaN = false,
+    has_denorm_loss = false,
+    is_iec559 = false,
+    is_bounded = false,
+    is_modulo = false,
+    traps = false,
+    tinyness_before = false
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  }
+# endif
+  ;
+    
+  static __number _STLP_CALL epsilon() _STLP_NOTHROW     { return __number(); }
+  static __number _STLP_CALL round_error() _STLP_NOTHROW { return __number(); }
+
+  static __number _STLP_CALL infinity() _STLP_NOTHROW      { return __number(); }
+  static __number _STLP_CALL quiet_NaN() _STLP_NOTHROW     { return __number(); }
+  static __number _STLP_CALL signaling_NaN() _STLP_NOTHROW { return __number(); }
+  static __number _STLP_CALL denorm_min() _STLP_NOTHROW    { return __number(); }
+
+
+};
+
+// Base class for integers.
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+#  ifdef _STLP_LONG_LONG
+#   define _STLP_LIMITS_MIN_TYPE _STLP_LONG_LONG
+#   define _STLP_LIMITS_MAX_TYPE unsigned _STLP_LONG_LONG
+#  else
+#   define _STLP_LIMITS_MIN_TYPE long
+#   define _STLP_LIMITS_MAX_TYPE unsigned long
+#  endif
+# else
+#   define _STLP_LIMITS_MIN_TYPE _Int
+#   define _STLP_LIMITS_MAX_TYPE _Int
+# endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
+
+template <class _Int,
+          _STLP_LIMITS_MIN_TYPE __imin,
+          _STLP_LIMITS_MAX_TYPE __imax,
+          int __idigits, bool __ismod>
+class _Integer_limits : public _Numeric_limits_base<_Int> 
+{
+public:
+
+  static _Int (_STLP_CALL min) () _STLP_NOTHROW { return (_Int)__imin; }
+  static _Int (_STLP_CALL max) () _STLP_NOTHROW { return (_Int)__imax; }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  enum {
+# else
+  static const int 
+# endif  
+  digits = (__idigits < 0) ?
+  ((int)((sizeof(_Int) * (CHAR_BIT))) - ((__imin == 0) ? 0 : 1))
+  : (__idigits),
+  digits10 = (digits * 301UL) / 1000,
+  radix = 2
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+  ;
+  static const bool
+# else
+  ,
+# endif
+  is_specialized = true,
+  is_signed = (__imin != 0),
+  is_integer = true,
+  is_exact = true,
+  is_bounded = true,
+  is_modulo = __ismod
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  }
+# endif
+  ;
+};
+
+// Base class for floating-point numbers.
+template <class __number,
+         int __Digits, int __Digits10,
+         int __MinExp, int __MaxExp,
+         int __MinExp10, int __MaxExp10,
+         bool __IsIEC559,
+         float_round_style __RoundStyle>
+class _Floating_limits : public _Numeric_limits_base<__number>
+{
+public:
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  enum {
+# else
+  static const int 
+# endif  
+
+  digits = __Digits,
+  digits10 = __Digits10,
+
+  radix = (  FLT_RADIX /* 2 */ ),
+  min_exponent = __MinExp, 
+  max_exponent = __MaxExp,
+  min_exponent10 = __MinExp10,
+  max_exponent10 = __MaxExp10
+
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  ,  
+  has_denorm = denorm_indeterminate,
+  round_style = __RoundStyle,
+# else
+  ;
+  static const float_denorm_style has_denorm = denorm_indeterminate;
+  static const float_round_style round_style = __RoundStyle;
+  static const bool 
+# endif
+
+  is_specialized = true,
+  is_signed = true, 
+
+#if (!defined(_CRAY) || !defined(_CRAYIEEE))
+   has_infinity     =  true,
+   has_quiet_NaN    =  true,
+   has_signaling_NaN=  true,
+#else
+  has_infinity     =  false,
+  has_quiet_NaN    =  false,
+  has_signaling_NaN=  false,
+#endif
+
+  has_denorm_loss  =  false,
+  is_iec559      =  __IsIEC559,
+  is_bounded     =  true,
+  traps          =  true,
+  tinyness_before=  false
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  }
+# endif
+  ;
+
+};
+
+// Class numeric_limits
+
+// The unspecialized class.
+
+template<class _Tp> 
+class numeric_limits : public _Numeric_limits_base<_Tp> {};
+
+// Specializations for all built-in integral types.
+
+#ifndef _STLP_NO_BOOL
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<bool>
+  : public _Integer_limits<bool, false, true, 1, false>
+{};
+
+#endif /* _STLP_NO_BOOL */
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<char>
+  : public _Integer_limits<char, CHAR_MIN, CHAR_MAX, -1, true>
+{};
+
+# ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_TEMPLATE_NULL
+class   numeric_limits<signed char>
+  : public _Integer_limits<signed char, SCHAR_MIN, SCHAR_MAX, -1, true>
+{};
+# endif
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<unsigned char>
+  : public _Integer_limits<unsigned char, 0, UCHAR_MAX, -1, true>
+{};
+
+#if !(defined ( _STLP_NO_WCHAR_T ) || defined (_STLP_WCHAR_T_IS_USHORT))
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<wchar_t>
+  : public _Integer_limits<wchar_t, WCHAR_MIN, WCHAR_MAX, -1, true>
+{};
+
+#endif
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<short>
+  : public _Integer_limits<short, SHRT_MIN, SHRT_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<unsigned short>
+  : public _Integer_limits<unsigned short, 0, USHRT_MAX, -1, true>
+{};
+
+# if defined (__xlC__) && (__xlC__ == 0x500)
+#  undef INT_MIN
+#  define INT_MIN -2147483648
+# endif
+
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<int>
+  : public _Integer_limits<int, INT_MIN, INT_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<unsigned int>
+  : public _Integer_limits<unsigned int, 0, UINT_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<long>
+  : public _Integer_limits<long, LONG_MIN, LONG_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<unsigned long>
+  : public _Integer_limits<unsigned long, 0, ULONG_MAX, -1, true>
+{};
+
+#ifdef _STLP_LONG_LONG
+
+# if defined (_STLP_MSVC) || defined (__BORLANDC__)
+
+#    define LONGLONG_MAX     0x7fffffffffffffffi64
+#    define LONGLONG_MIN     (-LONGLONG_MAX-1i64)
+#    define ULONGLONG_MAX    0xffffffffffffffffUi64
+
+# else
+
+#  ifndef   LONGLONG_MAX
+#    define LONGLONG_MAX     0x7fffffffffffffffLL
+#  endif
+#  ifndef   LONGLONG_MIN
+#    define LONGLONG_MIN     (-LONGLONG_MAX-1LL)
+#  endif
+#  ifndef   ULONGLONG_MAX
+#    define ULONGLONG_MAX    0xffffffffffffffffULL
+#  endif
+
+# endif
+
+#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ <= 96)
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<_STLP_LONG_LONG>
+  : public _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
+{};
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<unsigned _STLP_LONG_LONG>
+  : public _Integer_limits<unsigned _STLP_LONG_LONG, 0, ULONGLONG_MAX, -1, true>
+{};
+#else /* gcc 2.97 (after 2000-11-01), 2.98, 3.0 */
+/*
+ newest gcc has new mangling scheme, that has problem
+ with generating name [instantiated] of template specialization like
+ _Integer_limits<_STLP_LONG_LONG, LONGLONG_MIN, LONGLONG_MAX, -1, true>
+                                  ~~~~~~~~~~~~  ~~~~~~~~~~~~
+ Below is code that solve this problem.
+   - ptr
+ */
+_STLP_TEMPLATE_NULL
+class   numeric_limits<_STLP_LONG_LONG>
+  : public _Numeric_limits_base<_STLP_LONG_LONG> 
+{
+public:
+
+  static _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return LONGLONG_MIN; }
+  static _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return LONGLONG_MAX; }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  enum {
+# else
+  static const int 
+# endif  
+  digits = ((int)((sizeof(_STLP_LONG_LONG) * (CHAR_BIT))) - 1),
+  digits10 = (digits * 301UL) / 1000,
+  radix = 2
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+  ;
+  static const bool
+# else
+  ,
+# endif
+  is_specialized = true,
+  is_signed = true,
+  is_integer = true,
+  is_exact = true,
+  is_bounded = true,
+  is_modulo = true
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  }
+# endif
+  ;
+};
+
+_STLP_TEMPLATE_NULL
+class   numeric_limits<unsigned _STLP_LONG_LONG>
+  : public _Numeric_limits_base<unsigned _STLP_LONG_LONG> 
+{
+public:
+
+  static unsigned _STLP_LONG_LONG (_STLP_CALL min) () _STLP_NOTHROW { return 0ULL; }
+  static unsigned _STLP_LONG_LONG (_STLP_CALL max) () _STLP_NOTHROW { return ULONGLONG_MAX; }
+
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  enum {
+# else
+  static const int 
+# endif  
+  digits = ((int)((sizeof(unsigned _STLP_LONG_LONG) * (CHAR_BIT)))),
+  digits10 = (digits * 301UL) / 1000,
+  radix = 2
+# if ! defined ( _STLP_STATIC_CONST_INIT_BUG)
+  ;
+  static const bool
+# else
+  ,
+# endif
+  is_specialized = true,
+  is_signed = false,
+  is_integer = true,
+  is_exact = true,
+  is_bounded = true,
+  is_modulo = true
+# if defined ( _STLP_STATIC_CONST_INIT_BUG)
+  }
+# endif
+  ;
+};
+
+# endif /* __GNUC__ > 2000-11-01 */
+
+#endif /* _STLP_LONG_LONG */
+
+// Specializations for all built-in floating-point types.
+
+union _F_rep
+{
+  unsigned short rep[2];
+  float val;
+};
+union _D_rep
+{
+  unsigned short rep[4];
+  double val;
+};
+
+# ifndef _STLP_NO_LONG_DOUBLE
+union _L_rep
+{
+  unsigned short rep[8];
+  long double val;
+};
+# endif
+
+template <class __dummy>
+class _LimG 
+{
+public:  
+  static const _F_rep _F_inf;
+  static const _F_rep _F_qNaN;
+  static const _F_rep _F_sNaN;
+  static const _D_rep _D_inf;
+  static const _D_rep _D_qNaN;
+  static const _D_rep _D_sNaN;
+  
+# ifndef _STLP_NO_LONG_DOUBLE
+  static const _L_rep _L_inf;
+  static const _L_rep _L_qNaN;
+  static const _L_rep _L_sNaN;
+# endif
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+_STLP_EXPORT_TEMPLATE_CLASS _LimG<bool>;
+# endif
+
+_STLP_TEMPLATE_NULL class   numeric_limits<float>
+  : public _Floating_limits<float, 
+                            FLT_MANT_DIG,   // Binary digits of precision
+                            FLT_DIG,        // Decimal digits of precision
+                            FLT_MIN_EXP,    // Minimum exponent
+                            FLT_MAX_EXP,    // Maximum exponent
+                            FLT_MIN_10_EXP, // Minimum base 10 exponent
+                            FLT_MAX_10_EXP, // Maximum base 10 exponent
+                            true,           // conforms to iec559
+                            round_to_nearest>
+{
+public:
+  static float (_STLP_CALL min) () _STLP_NOTHROW { return FLT_MIN; }
+  static float _STLP_CALL denorm_min() _STLP_NOTHROW { return FLT_MIN; }
+  static float (_STLP_CALL max) () _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return FLT_MAX; }
+  static float _STLP_CALL epsilon() _STLP_NOTHROW { return FLT_EPSILON; }
+  static float _STLP_CALL round_error() _STLP_NOTHROW { return 0.5f; } // Units: ulps.
+  static  float _STLP_CALL infinity() { return _LimG<bool>::_F_inf.val; }
+  static  float _STLP_CALL quiet_NaN() { return _LimG<bool>::_F_qNaN.val; }
+  static  float _STLP_CALL signaling_NaN() { return _LimG<bool>::_F_sNaN.val; }
+};
+
+_STLP_TEMPLATE_NULL class   numeric_limits<double>
+  : public _Floating_limits<double, 
+                            DBL_MANT_DIG,   // Binary digits of precision
+                            DBL_DIG,        // Decimal digits of precision
+                            DBL_MIN_EXP,    // Minimum exponent
+                            DBL_MAX_EXP,    // Maximum exponent
+                            DBL_MIN_10_EXP, // Minimum base 10 exponent
+                            DBL_MAX_10_EXP, // Maximum base 10 exponent
+                            true,           // conforms to iec559
+                            round_to_nearest>
+{
+public:
+  static double (_STLP_CALL min)() _STLP_NOTHROW { return DBL_MIN; }
+  static double _STLP_CALL denorm_min() _STLP_NOTHROW { return DBL_MIN; }
+  static double (_STLP_CALL max)() _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return DBL_MAX; }
+  static double _STLP_CALL epsilon() _STLP_NOTHROW { return DBL_EPSILON; }
+  static double _STLP_CALL round_error() _STLP_NOTHROW { return 0.5; } // Units: ulps.
+  static  double _STLP_CALL infinity() { return _LimG<bool>::_D_inf.val; }
+  static  double _STLP_CALL quiet_NaN(){ return _LimG<bool>::_D_qNaN.val; }
+  static  double _STLP_CALL signaling_NaN() { return _LimG<bool>::_D_sNaN.val; }
+};
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+_STLP_TEMPLATE_NULL 
+class   numeric_limits<long double>
+  : public _Floating_limits<long double, 
+                            LDBL_MANT_DIG,  // Binary digits of precision
+                            LDBL_DIG,       // Decimal digits of precision
+                            LDBL_MIN_EXP,   // Minimum exponent
+                            LDBL_MAX_EXP,   // Maximum exponent
+                            LDBL_MIN_10_EXP,// Minimum base 10 exponent
+                            LDBL_MAX_10_EXP,// Maximum base 10 exponent
+                            false,          // Doesn't conform to iec559
+                            round_to_nearest>
+{
+public:
+  static long double (_STLP_CALL min) () _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return LDBL_MIN; }
+  static long double _STLP_CALL denorm_min() _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return LDBL_MIN; }
+  static long double (_STLP_CALL max) () _STLP_NOTHROW { _STLP_USING_VENDOR_CSTD return LDBL_MAX; }
+  static long double _STLP_CALL epsilon() _STLP_NOTHROW { return LDBL_EPSILON; }
+  static long double _STLP_CALL round_error() _STLP_NOTHROW { return 4; } // Units: ulps.
+  static long double _STLP_CALL infinity() { return _LimG<bool>::_L_inf.val; } 
+  static long double _STLP_CALL quiet_NaN() { return _LimG<bool>::_L_qNaN.val; }
+  static long double _STLP_CALL signaling_NaN() { return _LimG<bool>::_L_sNaN.val; }
+};
+
+# endif
+
+// We write special values (Inf and NaN) as bit patterns and 
+// cast the the appropriate floating-point types. 
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_limits.c>
+# endif
+
+#endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_list.c b/src/STLport/stl/_list.c
new file mode 100644
index 0000000..21bb044
--- /dev/null
+++ b/src/STLport/stl/_list.c
@@ -0,0 +1,210 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_LIST_C
+#define _STLP_LIST_C
+
+#ifndef _STLP_INTERNAL_LIST_H
+# include <stl/_list.h>
+#endif
+
+#if defined (__WATCOMC__)
+#include <vector>
+#endif
+
+# undef list
+# define  list  __WORKAROUND_DBG_RENAME(list)
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+template <class _Dummy>
+void _STLP_CALL
+_List_global<_Dummy>::_Transfer(_List_node_base* __position, 
+				_List_node_base* __first, _List_node_base* __last) {
+  if (__position != __last) {
+    // Remove [first, last) from its old position.
+    ((_Node*) (__last->_M_prev))->_M_next = __position;
+    ((_Node*) (__first->_M_prev))->_M_next    = __last;
+    ((_Node*) (__position->_M_prev))->_M_next = __first; 
+    
+    // Splice [first, last) into its new position.
+    _Node* __tmp = (_Node*) (__position->_M_prev);
+    __position->_M_prev = __last->_M_prev;
+    __last->_M_prev      = __first->_M_prev; 
+    __first->_M_prev    = __tmp;
+  }
+}
+
+#endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */
+
+
+template <class _Tp, class _Alloc>
+void 
+_List_base<_Tp,_Alloc>::clear() 
+{
+  _List_node<_Tp>* __cur = (_List_node<_Tp>*) this->_M_node._M_data->_M_next;
+  while (__cur != this->_M_node._M_data) {
+    _List_node<_Tp>* __tmp = __cur;
+    __cur = (_List_node<_Tp>*) __cur->_M_next;
+    _STLP_STD::_Destroy(&__tmp->_M_data);
+    this->_M_node.deallocate(__tmp, 1);
+  }
+  this->_M_node._M_data->_M_next = this->_M_node._M_data;
+  this->_M_node._M_data->_M_prev = this->_M_node._M_data;
+}
+
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG) 
+#  define size_type      size_t
+# endif
+
+template <class _Tp, class _Alloc>
+void list<_Tp, _Alloc>::resize(size_type __new_size, _Tp __x)
+{
+  iterator __i = begin();
+  size_type __len = 0;
+  for ( ; __i != end() && __len < __new_size; ++__i, ++__len);
+
+  if (__len == __new_size)
+    erase(__i, end());
+  else                          // __i == end()
+    insert(end(), __new_size - __len, __x);
+}
+
+template <class _Tp, class _Alloc>
+list<_Tp, _Alloc>& list<_Tp, _Alloc>::operator=(const list<_Tp, _Alloc>& __x)
+{
+  if (this != &__x) {
+    iterator __first1 = begin();
+    iterator __last1 = end();
+    const_iterator __first2 = __x.begin();
+    const_iterator __last2 = __x.end();
+    while (__first1 != __last1 && __first2 != __last2) 
+      *__first1++ = *__first2++;
+    if (__first2 == __last2)
+      erase(__first1, __last1);
+    else
+      insert(__last1, __first2, __last2);
+  }
+  return *this;
+}
+
+template <class _Tp, class _Alloc>
+void list<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {
+  iterator __i = begin();
+  for ( ; __i != end() && __n > 0; ++__i, --__n)
+    *__i = __val;
+  if (__n > 0)
+    insert(end(), __n, __val);
+  else
+    erase(__i, end());
+}
+
+template <class _Tp, class _Alloc, class _Predicate> 
+void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred)  {
+  typename list<_Tp, _Alloc>::iterator __first = __that.begin();
+  typename list<_Tp, _Alloc>::iterator __last = __that.end();
+  while (__first != __last) {
+    typename list<_Tp, _Alloc>::iterator __next = __first;
+    ++__next;
+    if (__pred(*__first)) __that.erase(__first);
+    __first = __next;
+  }
+}
+
+template <class _Tp, class _Alloc, class _BinaryPredicate>
+void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred) {
+  typename list<_Tp, _Alloc>::iterator __first = __that.begin();
+  typename list<_Tp, _Alloc>::iterator __last = __that.end();
+  if (__first == __last) return;
+  typename list<_Tp, _Alloc>::iterator __next = __first;
+  while (++__next != __last) {
+    if (__binary_pred(*__first, *__next))
+      __that.erase(__next);
+    else
+      __first = __next;
+    __next = __first;
+  }
+}
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
+	      _StrictWeakOrdering __comp) {
+  typedef typename list<_Tp, _Alloc>::iterator _Literator;
+  _Literator __first1 = __that.begin();
+  _Literator __last1 = __that.end();
+  _Literator __first2 = __x.begin();
+  _Literator __last2 = __x.end();
+  while (__first1 != __last1 && __first2 != __last2)
+    if (__comp(*__first2, *__first1)) {
+      _Literator __next = __first2;
+      _List_global_inst::_Transfer(__first1._M_node, __first2._M_node, (++__next)._M_node);
+      __first2 = __next;
+    }
+    else
+      ++__first1;
+  if (__first2 != __last2) _List_global_inst::_Transfer(__last1._M_node, __first2._M_node, __last2._M_node);
+}
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp) {
+  // Do nothing if the list has length 0 or 1.
+  if (__that._M_node._M_data->_M_next != __that._M_node._M_data &&
+      (__that._M_node._M_data->_M_next)->_M_next != __that._M_node._M_data) {
+    list<_Tp, _Alloc> __carry;
+#if !defined (__WATCOMC__)
+    list<_Tp, _Alloc> __counter[64];
+#else
+    __vector__<list<_Tp, _Alloc>, _Alloc> __counter(64);		
+#endif		//*TY 05/25/2000 - 
+    int __fill = 0;
+    while (!__that.empty()) {
+      __carry.splice(__carry.begin(), __that, __that.begin());
+      int __i = 0;
+      while(__i < __fill && !__counter[__i].empty()) {
+	_S_merge(__counter[__i], __carry, __comp);
+	__carry.swap(__counter[__i++]);
+      }
+      __carry.swap(__counter[__i]);         
+      if (__i == __fill) ++__fill;
+    } 
+    
+    for (int __i = 1; __i < __fill; ++__i) 
+      _S_merge(__counter[__i], __counter[__i-1], __comp);
+    __that.swap(__counter[__fill-1]);
+  }
+}
+
+# undef  list
+# undef  size_type
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_LIST_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_list.h b/src/STLport/stl/_list.h
new file mode 100644
index 0000000..ee7d293
--- /dev/null
+++ b/src/STLport/stl/_list.h
@@ -0,0 +1,575 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_LIST_H
+#define _STLP_INTERNAL_LIST_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+#  include <stl/_construct.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+#  include <stl/_function_base.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# undef list
+# define  list  __WORKAROUND_DBG_RENAME(list)
+
+struct _List_node_base {
+  _List_node_base* _M_next;
+  _List_node_base* _M_prev;
+};
+
+template <class _Dummy>
+class _List_global {
+public:
+  typedef _List_node_base _Node;
+  static void  _STLP_CALL _Transfer(_List_node_base* __position, 
+                                    _List_node_base* __first, _List_node_base* __last);
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+_STLP_EXPORT_TEMPLATE_CLASS _List_global<bool>;
+# endif
+typedef _List_global<bool> _List_global_inst;
+
+template <class _Tp>
+struct _List_node : public _List_node_base {
+  _Tp _M_data;
+  __TRIVIAL_STUFF(_List_node)
+
+#ifdef __DMC__
+  // for some reason, Digital Mars C++ needs a constructor...
+ private:
+  _List_node();
+#endif
+};
+
+struct _List_iterator_base {
+  typedef size_t                     size_type;
+  typedef ptrdiff_t                  difference_type;
+  typedef bidirectional_iterator_tag iterator_category;
+
+  _List_node_base* _M_node;
+
+  _List_iterator_base(_List_node_base* __x) : _M_node(__x) {}
+  _List_iterator_base() {}
+
+  void _M_incr() { _M_node = _M_node->_M_next; }
+  void _M_decr() { _M_node = _M_node->_M_prev; }
+  bool operator==(const _List_iterator_base& __y ) const { 
+    return _M_node == __y._M_node; 
+  }
+  bool operator!=(const _List_iterator_base& __y ) const { 
+    return _M_node != __y._M_node; 
+  }
+};  
+
+
+
+
+template<class _Tp, class _Traits>
+struct _List_iterator : public _List_iterator_base {
+  typedef _Tp value_type;
+  typedef typename _Traits::pointer    pointer;
+  typedef typename _Traits::reference  reference;
+
+  typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+  typedef _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
+  typedef _List_iterator<_Tp, _Traits>                       _Self;
+
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef _List_node<_Tp> _Node;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+
+  _List_iterator(_Node* __x) : _List_iterator_base(__x) {}
+  _List_iterator() {}
+  _List_iterator(const iterator& __x) :  _List_iterator_base(__x._M_node) {}
+
+  reference operator*() const { return ((_Node*)_M_node)->_M_data; }
+
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  _Self& operator++() { 
+    this->_M_incr();
+    return *this;
+  }
+  _Self operator++(int) { 
+    _Self __tmp = *this;
+    this->_M_incr();
+    return __tmp;
+  }
+  _Self& operator--() { 
+    this->_M_decr();
+    return *this;
+  }
+  _Self operator--(int) { 
+    _Self __tmp = *this;
+    this->_M_decr();
+    return __tmp;
+  }
+};
+
+
+#ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp, class _Traits>
+inline _Tp* value_type(const _List_iterator<_Tp, _Traits>&) { return 0; }
+inline bidirectional_iterator_tag iterator_category(const _List_iterator_base&) { return bidirectional_iterator_tag();}
+inline ptrdiff_t* distance_type(const _List_iterator_base&) { return 0; }
+#endif
+
+
+// Base class that encapsulates details of allocators and helps 
+// to simplify EH
+
+template <class _Tp, class _Alloc>
+class _List_base 
+{
+protected:
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef _List_node<_Tp> _Node;
+  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type
+           _Node_allocator_type;
+public:
+  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type
+          allocator_type;
+
+  allocator_type get_allocator() const { 
+    return _STLP_CONVERT_ALLOCATOR((const _Node_allocator_type&)_M_node, _Tp);
+  }
+
+  _List_base(const allocator_type& __a) : _M_node(_STLP_CONVERT_ALLOCATOR(__a, _Node), (_Node*)0) {
+    _Node* __n = _M_node.allocate(1);
+    __n->_M_next = __n;
+    __n->_M_prev = __n;
+    _M_node._M_data = __n;
+  }
+  ~_List_base() {
+    clear();
+    _M_node.deallocate(_M_node._M_data, 1);
+  }
+
+  void clear();
+
+public:
+  _STLP_alloc_proxy<_Node*, _Node, _Node_allocator_type>  _M_node;
+};
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class list;
+
+// helper functions to reduce code duplication
+template <class _Tp, class _Alloc, class _Predicate> 
+void _S_remove_if(list<_Tp, _Alloc>& __that, _Predicate __pred);
+
+template <class _Tp, class _Alloc, class _BinaryPredicate>
+void _S_unique(list<_Tp, _Alloc>& __that, _BinaryPredicate __binary_pred);
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_merge(list<_Tp, _Alloc>& __that, list<_Tp, _Alloc>& __x,
+	      _StrictWeakOrdering __comp);
+
+template <class _Tp, class _Alloc, class _StrictWeakOrdering>
+void _S_sort(list<_Tp, _Alloc>& __that, _StrictWeakOrdering __comp);
+
+template <class _Tp, class _Alloc>
+class list : public _List_base<_Tp, _Alloc> {
+  typedef _List_base<_Tp, _Alloc> _Base;
+  typedef list<_Tp, _Alloc> _Self;
+public:      
+  typedef _Tp value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef _List_node<_Tp> _Node;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Base::allocator_type allocator_type;
+  typedef bidirectional_iterator_tag _Iterator_category;
+
+public:
+  typedef _List_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+  typedef _List_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
+  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+protected:
+  _Node* _M_create_node(const _Tp& __x)
+  {
+    _Node* __p = this->_M_node.allocate(1);
+    _STLP_TRY {
+      _Construct(&__p->_M_data, __x);
+    }
+    _STLP_UNWIND(this->_M_node.deallocate(__p, 1));
+    return __p;
+  }
+
+  _Node* _M_create_node()
+  {
+    _Node* __p = this->_M_node.allocate(1);
+    _STLP_TRY {
+      _Construct(&__p->_M_data);
+    }
+    _STLP_UNWIND(this->_M_node.deallocate(__p, 1));
+    return __p;
+  }
+
+public:
+# if !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))
+  explicit
+# endif
+  list(const allocator_type& __a = allocator_type()) :
+    _List_base<_Tp, _Alloc>(__a) {}
+
+  iterator begin()             { return iterator((_Node*)(this->_M_node._M_data->_M_next)); }
+  const_iterator begin() const { return const_iterator((_Node*)(this->_M_node._M_data->_M_next)); }
+
+  iterator end()             { return this->_M_node._M_data; }
+  const_iterator end() const { return this->_M_node._M_data; }
+
+  reverse_iterator rbegin() 
+    { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const 
+    { return const_reverse_iterator(end()); }
+
+  reverse_iterator rend()
+    { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const
+    { return const_reverse_iterator(begin()); }
+
+  bool empty() const { return this->_M_node._M_data->_M_next == this->_M_node._M_data; }
+  size_type size() const {
+    size_type __result = distance(begin(), end());
+    return __result;
+  }
+  size_type max_size() const { return size_type(-1); }
+
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back() { return *(--end()); }
+  const_reference back() const { return *(--end()); }
+
+  void swap(list<_Tp, _Alloc>& __x) {
+    _STLP_STD::swap(this->_M_node, __x._M_node); 
+  }
+
+  iterator insert(iterator __position, const _Tp& __x) {
+
+    _Node* __tmp = _M_create_node(__x);
+    _List_node_base* __n = __position._M_node;
+    _List_node_base* __p = __n->_M_prev;
+    __tmp->_M_next = __n;
+    __tmp->_M_prev = __p;
+    __p->_M_next = __tmp;
+    __n->_M_prev = __tmp;
+    return __tmp;
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_insert_dispatch(__pos, __first, __last, _Integral());
+  }
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template<class _Integer>
+  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __x,
+                          const __true_type&) {
+    _M_fill_insert(__pos, (size_type) __n, (_Tp) __x);
+  }
+  template <class _InputIter>
+  void 
+  _M_insert_dispatch(iterator __position,
+		     _InputIter __first, _InputIter __last,
+		     const __false_type&) 
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert(iterator __position, const _Tp* __first, const _Tp* __last) {
+    for ( ; __first != __last; ++__first)
+      insert(__position, *__first);
+  }
+  void insert(iterator __position, const_iterator __first, const_iterator __last)
+#endif /* _STLP_MEMBER_TEMPLATES */
+  {
+    for ( ; __first != __last; ++__first)
+      insert(__position, *__first);
+  }
+  void insert(iterator __pos, size_type __n, const _Tp& __x) { _M_fill_insert(__pos, __n, __x); }
+  
+  void _M_fill_insert(iterator __pos, size_type __n, const _Tp& __x) {
+    for ( ; __n > 0; --__n)
+      insert(__pos, __x);
+  } 
+  void push_front(const _Tp& __x) { insert(begin(), __x); }
+  void push_back(const _Tp& __x) { insert(end(), __x); }
+
+# ifndef _STLP_NO_ANACHRONISMS
+  iterator insert(iterator __position) { return insert(__position, _Tp()); }
+  void push_front() {insert(begin());}
+  void push_back() {insert(end());}
+# endif
+
+  iterator erase(iterator __position) {
+    _List_node_base* __next_node = __position._M_node->_M_next;
+    _List_node_base* __prev_node = __position._M_node->_M_prev;
+    _Node* __n = (_Node*) __position._M_node;
+    __prev_node->_M_next = __next_node;
+    __next_node->_M_prev = __prev_node;
+    _STLP_STD::_Destroy(&__n->_M_data);
+    this->_M_node.deallocate(__n, 1);
+    return iterator((_Node*)__next_node);
+    }
+  
+  iterator erase(iterator __first, iterator __last) {
+    while (__first != __last)
+      erase(__first++);
+    return __last;
+  }
+
+  void resize(size_type __new_size, _Tp __x);
+  void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
+
+  void pop_front() { erase(begin()); }
+  void pop_back() { 
+    iterator __tmp = end();
+    erase(--__tmp);
+  }
+  list(size_type __n, const _Tp& __val,
+       const allocator_type& __a = allocator_type())
+    : _List_base<_Tp, _Alloc>(__a)
+    { this->insert(begin(), __n, __val); }
+  explicit list(size_type __n)
+    : _List_base<_Tp, _Alloc>(allocator_type())
+    { this->insert(begin(), __n, _Tp()); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  // We don't need any dispatching tricks here, because insert does all of
+  // that anyway.
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  list(_InputIterator __first, _InputIterator __last)
+    : _List_base<_Tp, _Alloc>(allocator_type())
+  { insert(begin(), __first, __last); }
+# endif  
+  template <class _InputIterator>
+  list(_InputIterator __first, _InputIterator __last,
+       const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _List_base<_Tp, _Alloc>(__a)
+  { insert(begin(), __first, __last); }
+  
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  list(const _Tp* __first, const _Tp* __last,
+       const allocator_type& __a = allocator_type())
+    : _List_base<_Tp, _Alloc>(__a)
+    { insert(begin(), __first, __last); }
+  list(const_iterator __first, const_iterator __last,
+       const allocator_type& __a = allocator_type())
+    : _List_base<_Tp, _Alloc>(__a)
+    { insert(begin(), __first, __last); }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+  list(const list<_Tp, _Alloc>& __x) : _List_base<_Tp, _Alloc>(__x.get_allocator())
+    { insert(begin(), __x.begin(), __x.end()); }
+
+  ~list() { }
+
+  list<_Tp, _Alloc>& operator=(const list<_Tp, _Alloc>& __x);
+
+public:
+  // assign(), a generalized assignment member function.  Two
+  // versions: one that takes a count, and one that takes a range.
+  // The range version is a member template, so we dispatch on whether
+  // or not the type is an integer.
+
+  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
+
+  void _M_fill_assign(size_type __n, const _Tp& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_assign_dispatch(__first, __last, _Integral());
+  }
+
+  template <class _Integer>
+  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+    { assign((size_type) __n, (_Tp) __val); }
+
+  template <class _InputIterator>
+  void _M_assign_dispatch(_InputIterator __first2, _InputIterator __last2,
+                          const __false_type&) {
+    iterator __first1 = begin();
+    iterator __last1 = end();
+    for ( ; __first1 != __last1 && __first2 != __last2; ++__first1, ++__first2)
+      *__first1 = *__first2;
+    if (__first2 == __last2)
+      erase(__first1, __last1);
+    else
+      insert(__last1, __first2, __last2);
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+  void splice(iterator __position, _Self& __x) {
+    if (!__x.empty()) 
+      _List_global_inst::_Transfer(__position._M_node, __x.begin()._M_node, __x.end()._M_node);
+  }
+  void splice(iterator __position, _Self&, iterator __i) {
+    iterator __j = __i;
+    ++__j;
+    if (__position == __i || __position == __j) return;
+    _List_global_inst::_Transfer(__position._M_node, __i._M_node, __j._M_node);
+  }
+  void splice(iterator __position, _Self&, iterator __first, iterator __last) {
+    if (__first != __last) 
+      _List_global_inst::_Transfer(__position._M_node, __first._M_node, __last._M_node);
+  }
+
+  void remove(const _Tp& __val) {
+    iterator __first = begin();
+    iterator __last = end();
+    while (__first != __last) {
+      iterator __next = __first;
+      ++__next;
+      if (__val == *__first) erase(__first);
+      __first = __next;
+    }
+  }
+  
+  void unique() {
+    _S_unique(*this, equal_to<_Tp>());
+  }
+  
+  void merge(_Self& __x) {
+    _S_merge(*this, __x, less<_Tp>());
+  }
+
+  void reverse() {
+    _List_node_base* __p = this->_M_node._M_data;
+    _List_node_base* __tmp = __p;
+    do {
+      _STLP_STD::swap(__tmp->_M_next, __tmp->_M_prev);
+      __tmp = __tmp->_M_prev;     // Old next node is now prev.
+    } while (__tmp != __p);
+  }    
+  
+  void sort() {
+    _S_sort(*this, less<_Tp>());
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _Predicate> void remove_if(_Predicate __pred)  {
+    _S_remove_if(*this, __pred);
+  }
+  template <class _BinaryPredicate>
+    void unique(_BinaryPredicate __binary_pred) {
+    _S_unique(*this, __binary_pred);
+  }
+
+  template <class _StrictWeakOrdering>
+    void merge(list<_Tp, _Alloc>& __x,
+	  _StrictWeakOrdering __comp) {
+    _S_merge(*this, __x, __comp);
+  }
+
+  template <class _StrictWeakOrdering>
+    void sort(_StrictWeakOrdering __comp) {
+    _S_sort(*this, __comp);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+template <class _Tp, class _Alloc>
+_STLP_INLINE_LOOP bool  _STLP_CALL
+operator==(const list<_Tp,_Alloc>& __x, const list<_Tp,_Alloc>& __y)
+{
+  typedef typename list<_Tp,_Alloc>::const_iterator const_iterator;
+  const_iterator __end1 = __x.end();
+  const_iterator __end2 = __y.end();
+
+  const_iterator __i1 = __x.begin();
+  const_iterator __i2 = __y.begin();
+  while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
+    ++__i1;
+    ++__i2;
+  }
+  return __i1 == __end1 && __i2 == __end2;
+}
+
+# define _STLP_EQUAL_OPERATOR_SPECIALIZED
+# define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
+# define _STLP_TEMPLATE_CONTAINER list<_Tp, _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+# undef _STLP_EQUAL_OPERATOR_SPECIALIZED
+
+_STLP_END_NAMESPACE 
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_list.c>
+# endif
+
+// do a cleanup
+# undef list
+# define __list__ __FULL_NAME(list)
+
+#if defined (_STLP_DEBUG)
+# include <stl/debug/_list.h>
+#endif
+
+#if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+# include <stl/wrappers/_list.h>
+#endif
+
+#endif /* _STLP_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_locale.h b/src/STLport/stl/_locale.h
new file mode 100644
index 0000000..3270a0a
--- /dev/null
+++ b/src/STLport/stl/_locale.h
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_LOCALE_H
+#define _STLP_INTERNAL_LOCALE_H
+
+#ifndef _STLP_CSTDLIB
+# include <cstdlib>
+#endif
+
+#ifndef _STLP_CWCHAR_H
+# include <stl/_cwchar.h>
+#endif
+
+#ifndef _STLP_INTERNAL_THREADS_H
+# include <stl/_threads.h>
+#endif
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class _STLP_CLASS_DECLSPEC _Locale_impl;             // Forward declaration of opaque type.
+class _STLP_CLASS_DECLSPEC _Locale;             // Forward declaration of opaque type.
+class _STLP_CLASS_DECLSPEC locale;
+class _STLP_CLASS_DECLSPEC ios_base;
+
+
+template <class _CharT>
+bool 
+__locale_do_operator_call (const locale* __that, 
+                           const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __x,
+                           const basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> >& __y);
+
+#  define _BaseFacet locale::facet
+
+class _STLP_CLASS_DECLSPEC locale {
+public:
+  // types:
+
+  class _STLP_DECLSPEC facet : private _Refcount_Base {
+  protected:
+    explicit facet(size_t __no_del = 0) : _Refcount_Base(1), _M_delete(__no_del == 0) {}
+    virtual ~facet();
+    friend class locale;
+    friend class _Locale_impl;
+    friend class _Locale;
+    
+  private:                        // Invalidate assignment and copying.
+    facet(const facet& __f) : _Refcount_Base(1), _M_delete(__f._M_delete == 0)  {};       
+    void operator=(const facet&); 
+    
+  private:                        // Data members.
+    const bool _M_delete;
+  };
+  
+#if defined(__MVS__) || defined(__OS400__)
+  struct
+#else
+  class
+#endif
+  _STLP_DECLSPEC id {
+    friend class locale;
+    friend class _Locale_impl;
+  public:
+    size_t _M_index;
+    static size_t _S_max;
+  };
+
+  typedef int category;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  enum _Category {
+# else
+  static const category
+# endif
+    none      = 0x000,
+    collate   = 0x010,
+    ctype     = 0x020,
+    monetary  = 0x040,
+    numeric   = 0x100,
+    time      = 0x200,
+    messages  = 0x400,
+    all       = collate | ctype | monetary | numeric | time | messages
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  }
+# endif
+  ;
+
+  // construct/copy/destroy:
+  locale();
+  locale(const locale&) _STLP_NOTHROW;
+  explicit locale(const char *);
+  locale(const locale&, const char*, category);
+
+  // those are for internal use
+  locale(_Locale_impl*);
+  locale(_Locale_impl*, bool);
+
+public:
+
+# if defined ( _STLP_MEMBER_TEMPLATES ) /* && defined (_STLP_FUNCTION_TMPL_PARTIAL_ORDER) */
+  template <class _Facet> 
+  locale(const locale& __loc, _Facet* __f) : _M_impl(0)
+    {
+      //      _M_impl = this->_S_copy_impl(__loc._M_impl, __f != 0);
+      new(this) locale(__loc._M_impl, __f != 0);
+      if (__f != 0)
+        this->_M_insert(__f, _Facet::id);
+    }
+# endif
+
+  locale(const locale&, const locale&, category);
+  ~locale() _STLP_NOTHROW;
+  const locale& operator=(const locale&) _STLP_NOTHROW;
+
+# if !(defined (_STLP_NO_MEMBER_TEMPLATES) || defined (_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS))
+  template <class _Facet> locale combine(const locale& __loc) {
+    locale __result(__loc._M_impl, true);
+    if (facet* __f = __loc._M_get_facet(_Facet::id)) {
+      __result._M_insert(__f, _Facet::id);
+      __f->_M_incr();
+    }
+    else
+      _M_throw_runtime_error();    
+    return __result;
+  }
+# endif
+  // locale operations:
+  string name() const;
+
+  bool operator==(const locale&) const;
+  bool operator!=(const locale&) const;
+
+# if ! defined ( _STLP_MEMBER_TEMPLATES ) || defined (_STLP_INLINE_MEMBER_TEMPLATES) || (defined(__MWERKS__) && __MWERKS__ <= 0x2301)
+  bool operator()(const string& __x, const string& __y) const;
+#  ifndef _STLP_NO_WCHAR_T
+  bool operator()(const wstring& __x, const wstring& __y) const;
+#  endif
+# else
+  template <class _CharT, class _Traits, class _Alloc>
+  bool operator()(const basic_string<_CharT, _Traits, _Alloc>& __x,
+                  const basic_string<_CharT, _Traits, _Alloc>& __y) const  {
+    return __locale_do_operator_call(this, __x, __y);
+  }              
+# endif
+
+  // global locale objects:
+  static locale _STLP_CALL global(const locale&);
+  static const locale& _STLP_CALL classic();
+
+public:                         // Helper functions for locale globals.
+  facet* _M_get_facet(const id&) const;
+  // same, but throws
+  facet* _M_use_facet(const id&) const;
+  static void _STLP_CALL _M_throw_runtime_error(const char* = 0);
+  static void _STLP_CALL _S_initialize();
+  static void _STLP_CALL _S_uninitialize();
+
+private:                        // More helper functions.
+  //  static _Locale_impl* _STLP_CALL _S_copy_impl(_Locale_impl*, bool);
+  void _M_insert(facet* __f, id& __id);
+
+  // friends:
+  friend class _Locale_impl;
+  friend class _Locale;
+  friend class ios_base;
+
+private:                        // Data members
+  _Locale_impl* _M_impl;
+};
+
+//----------------------------------------------------------------------
+// locale globals
+
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+template <class _Facet>
+inline const _Facet& 
+_Use_facet<_Facet>::operator *() const
+# else
+template <class _Facet> inline const _Facet& use_facet(const locale& __loc)
+# endif
+{
+  return *__STATIC_CAST(const _Facet*,__loc._M_use_facet(_Facet::id));
+}
+
+ 
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+template <class _Facet> 
+struct has_facet {
+  const locale& __loc;
+  has_facet(const locale& __p_loc) : __loc(__p_loc) {}
+  operator bool() const _STLP_NOTHROW
+# else
+template <class _Facet> inline bool has_facet(const locale& __loc) _STLP_NOTHROW 
+# endif
+{
+  return (__loc._M_get_facet(_Facet::id) != 0);
+}
+
+# ifdef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+  // close class definition
+};
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_LOCALE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_map.h b/src/STLport/stl/_map.h
new file mode 100644
index 0000000..a14edeb
--- /dev/null
+++ b/src/STLport/stl/_map.h
@@ -0,0 +1,411 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_MAP_H
+#define _STLP_INTERNAL_MAP_H
+
+#ifndef _STLP_INTERNAL_TREE_H
+# include <stl/_tree.h>
+#endif
+
+#define map __WORKAROUND_RENAME(map)
+#define multimap __WORKAROUND_RENAME(multimap)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_Compare, less<_Key> ), 
+          _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class map {
+public:
+
+// typedefs:
+
+  typedef _Key                  key_type;
+  typedef _Tp                   data_type;
+  typedef _Tp                   mapped_type;
+  typedef pair<const _Key, _Tp> value_type;
+  typedef _Compare              key_compare;
+    
+  class value_compare
+    : public binary_function<value_type, value_type, bool> {
+  friend class map<_Key,_Tp,_Compare,_Alloc>;
+  protected :
+    _Compare _M_comp;
+    value_compare(_Compare __c) : _M_comp(__c) {}
+  public:
+    bool operator()(const value_type& __x, const value_type& __y) const {
+      return _M_comp(__x.first, __y.first);
+    }
+  };
+
+private:
+# ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+  typedef _Rb_tree<key_type, value_type, 
+                   _Select1st_hint<value_type, _Key>, key_compare, _Alloc> _Rep_type;
+# else
+  typedef _Rb_tree<key_type, value_type, 
+                   _Select1st<value_type>, key_compare, _Alloc> _Rep_type;
+# endif
+  _Rep_type _M_t;  // red-black tree representing map
+public:
+  typedef typename _Rep_type::pointer pointer;
+  typedef typename _Rep_type::const_pointer const_pointer;
+  typedef typename _Rep_type::reference reference;
+  typedef typename _Rep_type::const_reference const_reference;
+  typedef typename _Rep_type::iterator iterator;
+  typedef typename _Rep_type::const_iterator const_iterator;
+  typedef typename _Rep_type::reverse_iterator reverse_iterator;
+  typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename _Rep_type::size_type size_type;
+  typedef typename _Rep_type::difference_type difference_type;
+  typedef typename _Rep_type::allocator_type allocator_type;
+
+  // allocation/deallocation
+
+  map() : _M_t(_Compare(), allocator_type()) {}
+  explicit map(const _Compare& __comp,
+               const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  map(_InputIterator __first, _InputIterator __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_unique(__first, __last); }
+
+  template <class _InputIterator>
+  map(_InputIterator __first, _InputIterator __last, const _Compare& __comp,
+      const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  map(_InputIterator __first, _InputIterator __last, const _Compare& __comp)
+    : _M_t(__comp, allocator_type()) { _M_t.insert_unique(__first, __last); }
+# endif
+
+#else
+  map(const value_type* __first, const value_type* __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_unique(__first, __last); }
+
+  map(const value_type* __first,
+      const value_type* __last, const _Compare& __comp,
+      const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+  map(const_iterator __first, const_iterator __last)
+    : _M_t(_Compare(), allocator_type()) 
+    { _M_t.insert_unique(__first, __last); }
+
+  map(const_iterator __first, const_iterator __last, const _Compare& __comp,
+      const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  map(const map<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}
+  map<_Key,_Tp,_Compare,_Alloc>&
+  operator=(const map<_Key, _Tp, _Compare, _Alloc>& __x)
+  {
+    _M_t = __x._M_t;
+    return *this; 
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return _M_t.key_comp(); }
+  value_compare value_comp() const { return value_compare(_M_t.key_comp()); }
+  allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+  iterator begin() { return _M_t.begin(); }
+  const_iterator begin() const { return _M_t.begin(); }
+  iterator end() { return _M_t.end(); }
+  const_iterator end() const { return _M_t.end(); }
+  reverse_iterator rbegin() { return _M_t.rbegin(); }
+  const_reverse_iterator rbegin() const { return _M_t.rbegin(); }
+  reverse_iterator rend() { return _M_t.rend(); }
+  const_reverse_iterator rend() const { return _M_t.rend(); }
+  bool empty() const { return _M_t.empty(); }
+  size_type size() const { return _M_t.size(); }
+  size_type max_size() const { return _M_t.max_size(); }
+  _Tp& operator[](const key_type& __k) {
+    iterator __i = lower_bound(__k);
+    // __i->first is greater than or equivalent to __k.
+    if (__i == end() || key_comp()(__k, (*__i).first))
+      __i = insert(__i, value_type(__k, _STLP_DEFAULT_CONSTRUCTED(_Tp)));
+    return (*__i).second;
+  }
+  void swap(map<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+  // insert/erase
+
+  pair<iterator,bool> insert(const value_type& __x) 
+    { return _M_t.insert_unique(__x); }
+  iterator insert(iterator position, const value_type& __x)
+    { return _M_t.insert_unique(position, __x); }
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(_InputIterator __first, _InputIterator __last) {
+    _M_t.insert_unique(__first, __last);
+  }
+#else
+  void insert(const value_type* __first, const value_type* __last) {
+    _M_t.insert_unique(__first, __last);
+  }
+  void insert(const_iterator __first, const_iterator __last) {
+    _M_t.insert_unique(__first, __last);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void erase(iterator __position) { _M_t.erase(__position); }
+  size_type erase(const key_type& __x) { return _M_t.erase(__x); }
+  void erase(iterator __first, iterator __last)
+    { _M_t.erase(__first, __last); }
+  void clear() { _M_t.clear(); }
+
+  // map operations:
+
+  iterator find(const key_type& __x) { return _M_t.find(__x); }
+  const_iterator find(const key_type& __x) const { return _M_t.find(__x); }
+  size_type count(const key_type& __x) const { 
+    return _M_t.find(__x) == _M_t.end() ? 0 : 1;
+  }
+  iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); }
+  const_iterator lower_bound(const key_type& __x) const {
+    return _M_t.lower_bound(__x); 
+  }
+  iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); }
+  const_iterator upper_bound(const key_type& __x) const {
+    return _M_t.upper_bound(__x); 
+  }
+  
+  pair<iterator,iterator> equal_range(const key_type& __x) {
+    return _M_t.equal_range(__x);
+  }
+  pair<const_iterator,const_iterator> equal_range(const key_type& __x) const {
+    return _M_t.equal_range(__x);
+  }
+};
+
+
+template <class _Key, class _Tp, __DFL_TMPL_PARAM(_Compare, less<_Key> ), 
+          _STLP_DEFAULT_PAIR_ALLOCATOR_SELECT(const _Key, _Tp) >
+class multimap {
+public:
+
+// typedefs:
+
+  typedef _Key                  key_type;
+  typedef _Tp                   data_type;
+  typedef _Tp                   mapped_type;
+  typedef pair<const _Key, _Tp> value_type;
+  typedef _Compare              key_compare;
+
+  class value_compare : public binary_function<value_type, value_type, bool> {
+  friend class multimap<_Key,_Tp,_Compare,_Alloc>;
+  protected:
+    _Compare _M_comp;
+    value_compare(_Compare __c) : _M_comp(__c) {}
+  public:
+    bool operator()(const value_type& __x, const value_type& __y) const {
+      return _M_comp(__x.first, __y.first);
+    }
+  };
+
+private:
+# ifdef _STLP_MULTI_CONST_TEMPLATE_ARG_BUG
+  typedef _Rb_tree<key_type, value_type, 
+                  _Select1st_hint<value_type, _Key>, key_compare, _Alloc> _Rep_type;
+# else
+  typedef _Rb_tree<key_type, value_type, 
+                  _Select1st<value_type>, key_compare, _Alloc> _Rep_type;
+# endif
+  _Rep_type _M_t;  // red-black tree representing multimap
+public:
+  typedef typename _Rep_type::pointer pointer;
+  typedef typename _Rep_type::const_pointer const_pointer;
+  typedef typename _Rep_type::reference reference;
+  typedef typename _Rep_type::const_reference const_reference;
+  typedef typename _Rep_type::iterator iterator;
+  typedef typename _Rep_type::const_iterator const_iterator; 
+  typedef typename _Rep_type::reverse_iterator reverse_iterator;
+  typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename _Rep_type::size_type size_type;
+  typedef typename _Rep_type::difference_type difference_type;
+  typedef typename _Rep_type::allocator_type allocator_type;
+
+// allocation/deallocation
+
+  multimap() : _M_t(_Compare(), allocator_type()) { }
+  explicit multimap(const _Compare& __comp,
+                    const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { }
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template <class _InputIterator>
+  multimap(_InputIterator __first, _InputIterator __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_equal(__first, __last); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  multimap(_InputIterator __first, _InputIterator __last,
+           const _Compare& __comp)
+    : _M_t(__comp, allocator_type()) { _M_t.insert_equal(__first, __last); }
+#  endif
+  template <class _InputIterator>
+  multimap(_InputIterator __first, _InputIterator __last,
+           const _Compare& __comp,
+           const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+#else
+  multimap(const value_type* __first, const value_type* __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_equal(__first, __last); }
+  multimap(const value_type* __first, const value_type* __last,
+           const _Compare& __comp,
+           const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+  multimap(const_iterator __first, const_iterator __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_equal(__first, __last); }
+  multimap(const_iterator __first, const_iterator __last,
+           const _Compare& __comp,
+           const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  multimap(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) : _M_t(__x._M_t) { }
+  multimap<_Key,_Tp,_Compare,_Alloc>&
+  operator=(const multimap<_Key,_Tp,_Compare,_Alloc>& __x) {
+    _M_t = __x._M_t;
+    return *this; 
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return _M_t.key_comp(); }
+  value_compare value_comp() const { return value_compare(_M_t.key_comp()); }
+  allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+  iterator begin() { return _M_t.begin(); }
+  const_iterator begin() const { return _M_t.begin(); }
+  iterator end() { return _M_t.end(); }
+  const_iterator end() const { return _M_t.end(); }
+  reverse_iterator rbegin() { return _M_t.rbegin(); }
+  const_reverse_iterator rbegin() const { return _M_t.rbegin(); }
+  reverse_iterator rend() { return _M_t.rend(); }
+  const_reverse_iterator rend() const { return _M_t.rend(); }
+  bool empty() const { return _M_t.empty(); }
+  size_type size() const { return _M_t.size(); }
+  size_type max_size() const { return _M_t.max_size(); }
+  void swap(multimap<_Key,_Tp,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+  // insert/erase
+
+  iterator insert(const value_type& __x) { return _M_t.insert_equal(__x); }
+  iterator insert(iterator __position, const value_type& __x) {
+    return _M_t.insert_equal(__position, __x);
+  }
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template <class _InputIterator>
+  void insert(_InputIterator __first, _InputIterator __last) {
+    _M_t.insert_equal(__first, __last);
+  }
+#else
+  void insert(const value_type* __first, const value_type* __last) {
+    _M_t.insert_equal(__first, __last);
+  }
+  void insert(const_iterator __first, const_iterator __last) {
+    _M_t.insert_equal(__first, __last);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+  void erase(iterator __position) { _M_t.erase(__position); }
+  size_type erase(const key_type& __x) { return _M_t.erase(__x); }
+  void erase(iterator __first, iterator __last)
+    { _M_t.erase(__first, __last); }
+  void clear() { _M_t.clear(); }
+
+  // multimap operations:
+
+  iterator find(const key_type& __x) { return _M_t.find(__x); }
+  const_iterator find(const key_type& __x) const { return _M_t.find(__x); }
+  size_type count(const key_type& __x) const { return _M_t.count(__x); }
+  iterator lower_bound(const key_type& __x) {return _M_t.lower_bound(__x); }
+  const_iterator lower_bound(const key_type& __x) const {
+    return _M_t.lower_bound(__x); 
+  }
+  iterator upper_bound(const key_type& __x) {return _M_t.upper_bound(__x); }
+  const_iterator upper_bound(const key_type& __x) const {
+    return _M_t.upper_bound(__x); 
+  }
+   pair<iterator,iterator> equal_range(const key_type& __x) {
+    return _M_t.equal_range(__x);
+  }
+  pair<const_iterator,const_iterator> equal_range(const key_type& __x) const {
+    return _M_t.equal_range(__x);
+  }
+};
+
+# define _STLP_TEMPLATE_HEADER template <class _Key, class _Tp, class _Compare, class _Alloc>
+
+# define _STLP_TEMPLATE_CONTAINER map<_Key,_Tp,_Compare,_Alloc>
+
+// fbp : if this template header gets protected against your will, report it !
+# include <stl/_relops_cont.h>
+
+# undef  _STLP_TEMPLATE_CONTAINER
+# define _STLP_TEMPLATE_CONTAINER multimap<_Key,_Tp,_Compare,_Alloc>
+
+// fbp : if this template header gets protected against your will, report it !
+# include <stl/_relops_cont.h>
+
+# undef  _STLP_TEMPLATE_CONTAINER
+# undef  _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+// do a cleanup
+#  undef map
+#  undef multimap
+// provide a way to access full funclionality 
+# define __map__  __FULL_NAME(map)
+# define __multimap__  __FULL_NAME(multimap)
+
+# ifdef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# include <stl/wrappers/_map.h>
+# endif
+
+#endif /* _STLP_INTERNAL_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_messages_facets.h b/src/STLport/stl/_messages_facets.h
new file mode 100644
index 0000000..564136b
--- /dev/null
+++ b/src/STLport/stl/_messages_facets.h
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_MESSAGES_H
+#define _STLP_INTERNAL_MESSAGES_H
+
+#ifndef _STLP_IOS_BASE_H
+# include <stl/_ios_base.h>
+#endif
+
+# ifndef _STLP_C_LOCALE_H
+#  include <stl/c_locale.h>
+# endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// messages facets
+
+class messages_base {
+public:
+  typedef int catalog;
+};
+
+template <class _CharT> class messages {};
+
+class _Messages;
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages<char> : public locale::facet, public messages_base 
+{
+  friend class _Locale;
+public:
+  typedef messages_base::catalog catalog;
+  typedef char                   char_type;
+  typedef string    string_type;
+
+  explicit messages(size_t __refs = 0);
+
+  catalog open(const string& __fn, const locale& __loc) const
+    { return do_open(__fn, __loc); }
+  string_type get(catalog __c, int __set, int __msgid,
+		  const string_type& __dfault) const
+    { return do_get(__c, __set, __msgid, __dfault); }
+  inline void close(catalog __c) const
+    { do_close(__c); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+  messages(_Messages*);
+
+protected:
+   messages(size_t, _Locale_messages*);
+  ~messages();
+
+  virtual catalog     do_open(const string& __fn, const locale& __loc) const;
+  virtual string_type do_get(catalog __c, int __set, int __msgid,
+                             const string_type& __dfault) const;
+  virtual void        do_close(catalog __c) const;
+
+  void _M_initialize(const char* __name);
+
+private:
+  _Messages* _M_impl;
+};
+
+# if !defined (_STLP_NO_WCHAR_T)
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages<wchar_t> : public locale::facet, public messages_base 
+{
+  friend class _Locale;
+public:
+  typedef messages_base::catalog catalog;
+  typedef wchar_t                char_type;
+  typedef wstring  string_type;
+
+  explicit messages(size_t __refs = 0);
+  
+  inline catalog open(const string& __fn, const locale& __loc) const
+    { return do_open(__fn, __loc); }
+  inline string_type get(catalog __c, int __set, int __msgid,
+                         const string_type& __dfault) const
+    { return do_get(__c, __set, __msgid, __dfault); }
+  inline void close(catalog __c) const
+    { do_close(__c); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+  messages(_Messages*);
+
+protected:
+
+  messages(size_t, _Locale_messages*);
+  ~messages();
+
+  virtual catalog     do_open(const string& __fn, const locale& __loc) const;
+  virtual string_type do_get(catalog __c, int __set, int __msgid,
+                             const string_type& __dfault) const;
+  virtual void        do_close(catalog __c) const;
+
+  void _M_initialize(const char* __name);
+
+private:
+  _Messages* _M_impl;
+};
+
+# endif /* WCHAR_T */
+
+template <class _CharT> class messages_byname {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages_byname<char> : public messages<char> {
+public:
+  typedef messages_base::catalog catalog;
+  typedef string     string_type;
+
+  explicit messages_byname(const char* __name, size_t __refs = 0);
+
+protected:
+  ~messages_byname();
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC messages_byname<wchar_t> : public messages<wchar_t> {
+public:
+  typedef messages_base::catalog catalog;
+  typedef wstring                string_type;
+
+  explicit messages_byname(const char* __name, size_t __refs = 0);
+
+protected:
+  ~messages_byname();
+};
+# endif /* WCHAR_T */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_MESSAGES_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_monetary.c b/src/STLport/stl/_monetary.c
new file mode 100644
index 0000000..5430532
--- /dev/null
+++ b/src/STLport/stl/_monetary.c
@@ -0,0 +1,527 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_MONETARY_C
+#define _STLP_MONETARY_C
+
+# ifndef _STLP_INTERNAL_MONETARY_H
+#  include <stl/_monetary.h>
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+template <class _CharT, class _InputIterator>
+locale::id money_get<_CharT, _InputIterator>::id;
+
+template <class _CharT, class _OutputIterator>
+locale::id money_put<_CharT, _OutputIterator>::id;
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+typedef money_get<char, const char*> money_get_char;
+typedef money_put<char, char*> money_put_char;
+typedef money_get<char, istreambuf_iterator<char, char_traits<char> > > money_get_char_2;
+typedef money_put<char, ostreambuf_iterator<char, char_traits<char> > > money_put_char_2;
+
+__DECLARE_INSTANCE(locale::id, money_get_char::id, );
+__DECLARE_INSTANCE(locale::id, money_put_char::id, );
+__DECLARE_INSTANCE(locale::id, money_get_char_2::id, );
+__DECLARE_INSTANCE(locale::id, money_put_char_2::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef money_get<wchar_t, const wchar_t*> money_get_wchar_t;
+typedef money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > money_get_wchar_t_2;
+typedef money_put<wchar_t, wchar_t*> money_put_wchar_t;
+typedef money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > money_put_wchar_t_2;
+
+__DECLARE_INSTANCE(locale::id, money_get_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, money_put_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, money_get_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, money_put_wchar_t_2::id, );
+
+# endif
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+// money_get facets
+
+
+// helper functions for do_get
+template <class _InIt1, class _InIt2>
+pair<_InIt1, bool> __get_string(_InIt1 __first,     _InIt1 __last,
+                               _InIt2 __str_first, _InIt2 __str_last) {
+  pair<_InIt1, _InIt2> __pr = mismatch(__first, __last, __str_first);
+  return make_pair(__pr.first, __pr.second == __str_last);
+}
+
+template <class _InIt, class _OuIt, class _CharT>
+bool
+__get_monetary_value(_InIt& __first, _InIt __last, _OuIt __out,
+                     const ctype<_CharT>& _c_type,
+                     _CharT   __point,
+                     int      __frac_digits,
+                     _CharT __sep,
+                     const string& __grouping,
+                     bool&         __syntax_ok)
+{
+  if (__first == __last || !_c_type.is(ctype_base::digit, *__first))
+    return false;
+
+  char __group_sizes[128];
+  char* __group_sizes_end = __grouping.size() == 0 ? 0 : __group_sizes;
+  char   __current_group_size = 0;
+
+  while (__first != __last) {
+    if (_c_type.is(ctype_base::digit, *__first)) {
+      ++__current_group_size;
+      *__out++ = *__first++;
+    }
+    else if (__group_sizes_end) {
+      if (*__first == __sep) {
+	*__group_sizes_end++ = __current_group_size;
+	__current_group_size = 0;
+	++__first;
+      }
+      else break;
+    }
+    else
+      break;
+  }
+
+  if (__grouping.size() == 0)
+    __syntax_ok = true;
+  else {
+    if (__group_sizes_end != __group_sizes)
+      *__group_sizes_end++ = __current_group_size;
+    
+    __syntax_ok = __valid_grouping(__group_sizes, __group_sizes_end,
+                                   __grouping.data(), __grouping.data()+ __grouping.size());  
+    
+    if (__first == __last || *__first != __point) {
+      for (int __digits = 0; __digits != __frac_digits; ++__digits)
+        *__out++ = _CharT('0');
+      return true; // OK not to have decimal point
+    }
+  }
+
+  ++__first;
+
+  size_t __digits = 0;
+
+  while (__first != __last && _c_type.is(ctype_base::digit, *__first)) {
+      *__out++ = *__first++;
+     ++__digits;
+  }
+
+  __syntax_ok = __syntax_ok && (__digits == __frac_digits);
+
+  return true;
+}
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+//===== methods ======
+template <class _CharT, class _InputIter>
+_InputIter 
+money_get<_CharT, _InputIter>::do_get(_InputIter __s, _InputIter  __end, bool  __intl,
+				      ios_base&  __str, ios_base::iostate& __err,
+				      long double& __units) const {
+  string_type __buf;
+  __s = do_get(__s, __end, __intl, __str, __err, __buf);
+
+  if (__err == ios_base::goodbit || __err == ios_base::eofbit) {
+    __buf.push_back(0);
+    typename string_type::iterator __b = __buf.begin(), __e = __buf.end();
+    // Can't use atold, since it might be wchar_t. Don't get confused by name below :
+    // it's perfectly capable of reading long double.
+    __get_decimal_integer(__b, __e, __units);
+  }
+  if (__s == __end)
+    __err |= ios_base::eofbit;
+  return __s;
+}
+# endif
+
+template <class _CharT, class _InputIter>
+_InputIter 
+money_get<_CharT, _InputIter>::do_get(iter_type __s, 
+				      iter_type  __end, bool  __intl,
+				      ios_base&  __str, ios_base::iostate&  __err,
+				      string_type& __digits) const {
+  if (__s == __end) {
+    __err |= ios_base::eofbit;
+    return __s;
+  }
+
+  typedef moneypunct<_CharT, false> _Punct;
+  typedef moneypunct<_CharT, true>  _Punct_intl;
+  typedef ctype<_CharT>             _Ctype;
+
+  locale __loc = __str.getloc();
+  const _Punct&      __punct      = use_facet<_Punct>(__loc) ;
+  const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ;
+  const _Ctype&      __c_type      = use_facet<_Ctype>(__loc) ;
+                   
+  money_base::pattern __format = __intl ? __punct_intl.neg_format()
+                                        : __punct.neg_format();
+  string_type __ns = __intl ? __punct_intl.negative_sign()
+                            : __punct.negative_sign();
+  string_type __ps = __intl ? __punct_intl.positive_sign()
+                            : __punct.positive_sign();
+  int __i;
+  bool __is_positive = true;
+  bool __symbol_required = (__str.flags() & ios_base::showbase) !=0;
+  string_type __buf;
+  back_insert_iterator<string_type> __out(__buf);
+//  pair<iter_type, bool> __result;
+
+  for (__i = 0; __i < 4; ++__i) {
+    switch (__format.field[__i]) {
+    case (char) money_base::none:
+      if (__i == 3) {
+        if (__c_type.is(ctype_base::space, *__s)) {
+          __err = ios_base::failbit;
+          return __s;
+        }
+        break;
+      }
+      while (__s != __end && __c_type.is(ctype_base::space, *__s))
+        ++__s;
+      break;
+    case (char) money_base::space:
+      if (!__c_type.is(ctype_base::space, *__s)) {
+        __err = ios_base::failbit;
+        return __s;
+      }
+      ++__s;
+      while (__s != __end && __c_type.is(ctype_base::space, *__s))
+        ++__s;
+      break;
+    case money_base::symbol: {
+      string_type __curs = __intl ? __punct_intl.curr_symbol()
+                                : __punct.curr_symbol();
+      pair<iter_type, bool>
+      __result  = __get_string(__s, __end, __curs.begin(), __curs.end());
+      if (!__result.second && __symbol_required)
+        __err = ios_base::failbit;
+      __s = __result.first;
+      break;
+    }
+    case money_base::sign: {
+      if (__s == __end) {
+        if (__ps.size() == 0)
+          break;
+        if (__ns.size() == 0) {
+          __is_positive = false;
+          break;
+        }
+        __err = ios_base::failbit;
+        return __s;
+      }
+      else {
+        if (__ps.size() == 0) {
+          if (__ns.size() == 0)
+            break;
+          if (*__s == ++__ns[0]) {
+            ++__s;
+            __is_positive = false;
+            break;
+          }
+          __err = ios_base::failbit;
+	  //          return __s;
+        } 
+        else {
+          if (*__s == __ps[0]) {
+            ++__s;
+            break;
+          }
+          if (__ns.size() == 0)
+            break;
+          if (*__s == __ns[0]) {
+            ++__s;
+            __is_positive = false;
+            break;
+          }
+          __err = ios_base::failbit;
+	  //          return __s;
+        }
+      }
+      return __s;
+      //      break;
+    }
+    case money_base::value: {
+      _CharT __point = __intl ? __punct_intl.decimal_point()
+                              : __punct.decimal_point();
+      int __frac_digits = __intl ? __punct_intl.frac_digits()
+                                 : __punct.frac_digits();
+      string __grouping = __intl ? __punct_intl.grouping()
+                                 : __punct.grouping();
+      bool __syntax_ok = true;
+
+      bool __result;
+
+      _CharT __sep = __grouping.size() == 0 ? _CharT() : 
+	__intl ? __punct_intl.thousands_sep() : __punct.thousands_sep();
+
+      __result = __get_monetary_value(__s, __end, __out, __c_type,
+                                      __point, __frac_digits,
+                                      __sep,
+                                      __grouping, __syntax_ok);      
+
+      if (!__syntax_ok)
+        __err |= ios_base::failbit;
+      if (!__result) {
+        __err = ios_base::failbit;
+        return __s;
+      }
+      break;
+      
+    }                           // Close money_base::value case
+
+
+    }                           // Close switch statement
+  }                             // Close for loop
+
+  if (__is_positive) {
+    if (__ps.size() > 1) {
+      pair<_InputIter, bool>
+        __result = __get_string(__s, __end, __ps.begin() + 1, __ps.end());
+      __s = __result.first;
+      if (!__result.second)
+	__err |= ios::failbit;
+    }
+    if (!(__err & ios_base::failbit))
+      __digits = __buf;
+  }
+  else {
+    if (__ns.size() > 1) {
+      pair<_InputIter, bool>
+        __result = __get_string(__s, __end, __ns.begin() + 1, __ns.end());
+      __s = __result.first;
+      if (!__result.second)
+	__err |= ios::failbit;
+    }
+    if (!(__err & ios::failbit)) {
+      __buf.insert(__buf.begin(),__c_type.widen('-'));
+      __digits = __buf;
+    }
+  }
+  if (__s == __end)
+    __err |= ios::eofbit;
+
+  return __s;
+}
+
+// money_put facets
+
+template <class _CharT, class _OutputIter>
+_OutputIter
+money_put<_CharT, _OutputIter>
+ ::do_put(_OutputIter __s, bool __intl, ios_base& __str,
+          char_type __fill,
+          const string_type& __digits) const { 
+  typedef ctype<_CharT>             _Ctype;
+  typedef moneypunct<_CharT, false> _Punct;
+  typedef moneypunct<_CharT, true>  _Punct_intl;
+
+  locale __loc = __str.getloc();
+  const _Ctype&      __c_type      = use_facet<_Ctype>(__loc) ;
+  const _Punct&      __punct      = use_facet<_Punct>(__loc) ;
+  const _Punct_intl& __punct_intl = use_facet<_Punct_intl>(__loc) ;
+
+  // some special characters
+
+  char_type __minus = __c_type.widen('-');
+  char_type __plus  = __c_type.widen('+');
+  char_type __space = __c_type.widen(' ');
+  char_type __zero  = __c_type.widen('0');
+  char_type __point = __intl ? __c_type.widen(__punct_intl.decimal_point())
+			     : __c_type.widen(__punct.decimal_point());
+
+  char_type __sep = __intl ? __punct_intl.thousands_sep()
+			   : __punct     .thousands_sep();
+
+  string __grouping = __intl ? __punct_intl.grouping()
+		             : __punct     .grouping();
+				
+  int __frac_digits      = __intl ? __punct_intl.frac_digits() 
+                                  : __punct.frac_digits();
+
+  string_type __curr_sym = __intl ? __punct_intl.curr_symbol() 
+                                  : __punct.curr_symbol();
+
+    // if there are no digits we are going to return __s.  If there
+    // are digits, but not enough to fill the frac_digits, we are
+    // going to add zeros.  I don't know whether this is right or
+    // not.
+
+  if (__digits.size() == 0) 
+    return __s;
+
+  typename string_type::const_iterator __digits_first = __digits.begin();
+  typename string_type::const_iterator __digits_last  = __digits.end();
+
+  bool __is_negative = *__digits_first == __minus;
+  if (__is_negative)
+    ++__digits_first;
+
+  string_type __sign = __intl ?
+			 __is_negative ? __punct_intl.negative_sign()
+				       : __punct_intl.positive_sign()
+			      :
+			 __is_negative ? __punct.negative_sign()
+				       : __punct.positive_sign();
+  typename string_type::const_iterator __cp = __digits_first;
+  while (__cp != __digits_last && __c_type.is(ctype_base::digit, *__cp))
+    ++__cp;
+  if (__cp == __digits_first)
+    return __s;
+  __digits_last = __cp;
+
+  // If grouping is required, we make a copy of __digits and
+  // insert the grouping.
+
+  // To handle the fractional digits, we augment the first group
+  // by frac_digits.  If there is only one group, we need first
+  // to duplicate it.
+
+  string_type __new_digits(__digits_first, __digits_last);
+
+  if (__grouping.size() != 0) {
+    if (__grouping.size() == 1)
+      __grouping.push_back(__grouping[0]);
+    __grouping[0] += __frac_digits;
+    _CharT* __data_ptr = __CONST_CAST(_CharT*,__new_digits.data());
+    _CharT* __data_end = __data_ptr + __new_digits.size();
+    
+    ptrdiff_t __value_length = __insert_grouping(__data_ptr,
+	  				         __data_end,
+					         __grouping,
+					         __sep,
+					         __plus, __minus, 0);
+    __digits_first = __new_digits.begin();
+    __digits_last  = __digits_first + __value_length;
+  }
+
+  // Determine the amount of padding required, if any.  
+    
+  size_t __width        = __str.width();
+
+#if defined(_STLP_DEBUG) && (defined(__HP_aCC) || (__HP_aCC <= 1))
+  size_t __value_length = operator -(__digits_last, __digits_first);
+#else
+  size_t __value_length = __digits_last - __digits_first;
+#endif
+
+  size_t __length       = __value_length;
+      
+  __length += __sign.size();
+  if (__frac_digits != 0)
+    ++__length;
+
+  bool __generate_curr = (__str.flags() & ios_base::showbase) !=0;
+  if (__generate_curr)
+    __length += __curr_sym.size();
+  money_base::pattern __format =
+    __intl ? (__is_negative ? __punct_intl.neg_format() 
+                            : __punct_intl.pos_format())
+           : (__is_negative ? __punct.neg_format() 
+                            : __punct.pos_format());
+  {
+    for (int __i = 0; __i < 4; ++__i)
+      if (__format.field[__i] == (char) money_base::space)
+        ++__length;
+  }
+
+  size_t __fill_amt = __length < __width ? __width - __length : 0;
+
+  ios_base::fmtflags __fill_pos = __str.flags() & ios_base::adjustfield;
+
+  if (__fill_amt != 0 &&
+      !(__fill_pos & (ios_base::left | ios_base::internal)))
+    __s = fill_n(__s, __fill_amt, __fill);
+    
+  for (int __i = 0; __i < 4; ++__i) {
+    char __ffield = __format.field[__i];
+    if (__ffield == money_base::none) {
+      if (__fill_amt != 0 && __fill_pos == ios_base::internal)
+        __s = fill_n(__s, __fill_amt, __fill);
+    }
+    else if (__ffield == money_base::space) {
+      *__s++ = __space;
+      if (__fill_amt != 0 && __fill_pos == ios_base::internal)
+        __s = fill_n(__s, __fill_amt, __fill);
+    }
+    else if (__ffield == money_base::symbol) {
+      if (__generate_curr)
+        __s = copy(__curr_sym.begin(), __curr_sym.end(), __s);
+    }
+    else if (__ffield == money_base::sign) {
+      if (__sign.size() != 0)
+        *__s++ = __sign[0];
+    }
+    else if (__ffield == money_base::value) {
+      if (__frac_digits == 0)
+        __s = copy(__digits_first, __digits_last, __s);
+      else {
+        if ((int)__value_length <= __frac_digits) {
+          *__s++ = __point;
+          __s = copy(__digits_first, __digits_last, __s);
+          __s =  fill_n(__s, __frac_digits - __value_length, __zero);
+        }
+        else {
+          __s = copy(__digits_first, __digits_last - __frac_digits, __s);
+          if (__frac_digits != 0) {
+            *__s++ = __point;
+            __s = copy(__digits_last - __frac_digits, __digits_last, __s);
+          }
+        }
+      }
+    }
+  } // Close for loop
+
+  // Ouput rest of sign if necessary.
+
+  if (__sign.size() > 1)
+    __s = copy(__sign.begin() + 1, __sign.end(), __s);
+  if (!(__fill_pos & (ios_base::right | ios_base::internal)))
+    __s = fill_n(__s, __fill_amt, __fill);
+  
+  return __s;
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* EXPOSE */
+
+#endif /* _STLP_MONETARY_C */
diff --git a/src/STLport/stl/_monetary.h b/src/STLport/stl/_monetary.h
new file mode 100644
index 0000000..3343c14
--- /dev/null
+++ b/src/STLport/stl/_monetary.h
@@ -0,0 +1,463 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_MONETARY_H
+#define _STLP_INTERNAL_MONETARY_H
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class money_base {
+public:
+  enum part {none, space, symbol, sign, value};
+  struct pattern {
+    char field[4];
+  };
+};
+
+// moneypunct facets: forward declaration
+template <class _charT, __DFL_NON_TYPE_PARAM(bool, _International, false) > class moneypunct {};
+
+// money_get facets
+
+template <class _CharT, __DFL_TMPL_PARAM(_InputIter , istreambuf_iterator<_CharT>) >
+class money_get : public locale::facet 
+{
+  friend class _Locale;
+public:
+  typedef _CharT               char_type;
+  typedef _InputIter           iter_type;
+  typedef basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > string_type;
+
+  money_get(size_t __refs = 0) : _BaseFacet(__refs) {}
+# ifndef _STLP_NO_LONG_DOUBLE
+  iter_type get(iter_type __s, iter_type  __end, bool __intl,
+                ios_base&  __str, ios_base::iostate&  __err,
+                long double& __units) const
+    { return do_get(__s,  __end, __intl,  __str,  __err, __units); }
+# endif  
+  iter_type get(iter_type __s, iter_type  __end, bool __intl,
+                ios_base&  __str, ios_base::iostate& __err,
+                string_type& __digits) const
+    { return do_get(__s,  __end, __intl,  __str,  __err, __digits); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~money_get() {}
+# ifndef _STLP_NO_LONG_DOUBLE
+  virtual iter_type do_get(iter_type __s, iter_type  __end, bool  __intl,
+                           ios_base&  __str, ios_base::iostate& __err,
+                           long double& __units) const;
+# endif
+  virtual iter_type do_get(iter_type __s, iter_type __end, bool __intl,
+                           ios_base&  __str, ios_base::iostate& __err,
+                           string_type& __digits) const;
+};
+
+
+// moneypunct facets: definition of specializations
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<char, true> : public locale::facet, public money_base 
+{
+
+public:
+  typedef char                 char_type;
+  typedef string               string_type;
+  explicit moneypunct _STLP_PSPEC2(char, true) (size_t __refs = 0);
+
+  char        decimal_point() const { return do_decimal_point(); }
+  char        thousands_sep() const { return do_thousands_sep(); }
+  string      grouping()      const { return do_grouping(); }
+  string_type curr_symbol()   const { return do_curr_symbol(); }
+  string_type positive_sign() const { return do_positive_sign(); }
+  string_type negative_sign() const { return do_negative_sign(); }
+  int         frac_digits()   const { return do_frac_digits(); }
+  pattern     pos_format()    const { return do_pos_format(); }
+  pattern     neg_format()    const { return do_neg_format(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  enum _IntlVal { intl = 1 } ;
+# else
+  static const bool intl = true;
+# endif
+
+protected:
+  pattern _M_pos_format;
+  pattern _M_neg_format;
+
+  ~moneypunct _STLP_PSPEC2(char, true) ();
+
+  virtual char        do_decimal_point() const;
+  virtual char        do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string      do_curr_symbol()   const;
+
+  virtual string      do_positive_sign() const;
+  virtual string      do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+  virtual pattern     do_pos_format()    const;
+  virtual pattern     do_neg_format()    const;
+
+  friend class _Locale;
+
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<char, false> : public locale::facet, public money_base 
+{
+public:
+  typedef char                 char_type;
+  typedef string               string_type;
+
+  explicit moneypunct _STLP_PSPEC2(char, false) (size_t __refs = 0);
+
+  char        decimal_point() const { return do_decimal_point(); }
+  char        thousands_sep() const { return do_thousands_sep(); }
+  string      grouping()      const { return do_grouping(); }
+  string_type curr_symbol()   const { return do_curr_symbol(); }
+  string_type positive_sign() const { return do_positive_sign(); }
+  string_type negative_sign() const { return do_negative_sign(); }
+  int         frac_digits()   const { return do_frac_digits(); }
+  pattern     pos_format()    const { return do_pos_format(); }
+  pattern     neg_format()    const { return do_neg_format(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  enum _IntlVal { intl = 0 } ;
+# else
+  static const bool intl = false;
+# endif
+
+protected:
+  pattern _M_pos_format;
+  pattern _M_neg_format;
+
+  ~moneypunct _STLP_PSPEC2(char, false) ();
+
+  virtual char        do_decimal_point() const;
+  virtual char        do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string      do_curr_symbol()   const;
+
+  virtual string      do_positive_sign() const;
+  virtual string      do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+  virtual pattern     do_pos_format()    const;
+  virtual pattern     do_neg_format()    const;
+
+  friend class _Locale;
+};
+
+
+# ifndef _STLP_NO_WCHAR_T
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<wchar_t, true> : public locale::facet, public money_base 
+{
+  friend class _Locale;
+public:
+  typedef wchar_t                 char_type;
+  typedef wstring                 string_type;
+  explicit moneypunct _STLP_PSPEC2(wchar_t, true) (size_t __refs = 0);
+  wchar_t     decimal_point() const { return do_decimal_point(); }
+  wchar_t     thousands_sep() const { return do_thousands_sep(); }
+  string      grouping()      const { return do_grouping(); }
+  string_type curr_symbol()   const { return do_curr_symbol(); }
+  string_type positive_sign() const { return do_positive_sign(); }
+  string_type negative_sign() const { return do_negative_sign(); }
+  int         frac_digits()   const { return do_frac_digits(); }
+  pattern     pos_format()    const { return do_pos_format(); }
+  pattern     neg_format()    const { return do_neg_format(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  enum _IntlVal { intl = 1 } ;
+# else
+  static const bool intl = true;
+# endif
+
+protected:
+  pattern _M_pos_format;
+  pattern _M_neg_format;
+
+  ~moneypunct _STLP_PSPEC2(wchar_t, true) ();
+
+  virtual wchar_t     do_decimal_point() const;
+  virtual wchar_t     do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string_type do_curr_symbol()   const;
+
+  virtual string_type do_positive_sign() const;
+  virtual string_type do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+  virtual pattern     do_pos_format()    const;
+  virtual pattern     do_neg_format()    const;
+};
+
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct<wchar_t, false> : public locale::facet, public money_base 
+{
+  friend class _Locale;
+public:
+  typedef wchar_t                 char_type;
+  typedef wstring                 string_type;
+  explicit moneypunct _STLP_PSPEC2(wchar_t, false) (size_t __refs = 0);
+  wchar_t     decimal_point() const { return do_decimal_point(); }
+  wchar_t     thousands_sep() const { return do_thousands_sep(); }
+  string      grouping()      const { return do_grouping(); }
+  string_type curr_symbol()   const { return do_curr_symbol(); }
+  string_type positive_sign() const { return do_positive_sign(); }
+  string_type negative_sign() const { return do_negative_sign(); }
+  int         frac_digits()   const { return do_frac_digits(); }
+  pattern     pos_format()    const { return do_pos_format(); }
+  pattern     neg_format()    const { return do_neg_format(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+# if defined (_STLP_STATIC_CONST_INIT_BUG)
+  enum _IntlVal { intl = 0 } ;
+# else
+  static const bool intl = false;
+# endif
+
+protected:
+  pattern _M_pos_format;
+  pattern _M_neg_format;
+
+  ~moneypunct _STLP_PSPEC2(wchar_t, false) ();
+
+  virtual wchar_t     do_decimal_point() const;
+  virtual wchar_t     do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string_type do_curr_symbol()   const;
+
+  virtual string_type do_positive_sign() const;
+  virtual string_type do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+  virtual pattern     do_pos_format()    const;
+  virtual pattern     do_neg_format()    const;
+};
+
+# endif
+
+template <class _charT, __DFL_NON_TYPE_PARAM(bool , _International , false) > class moneypunct_byname {};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<char, true> : public moneypunct<char, true> 
+{
+public:
+  typedef money_base::pattern   pattern;
+  typedef char                  char_type;
+  typedef string                string_type;
+
+  explicit moneypunct_byname _STLP_PSPEC2(char, true) (const char * __name, size_t __refs = 0);
+
+protected:
+  _Locale_monetary* _M_monetary;
+  ~moneypunct_byname _STLP_PSPEC2(char, true) ();
+  virtual char        do_decimal_point() const;
+  virtual char        do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string_type do_curr_symbol()   const;
+
+  virtual string_type do_positive_sign() const;
+  virtual string_type do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<char, false> : public moneypunct<char, false> 
+{
+public:
+  typedef money_base::pattern   pattern;
+  typedef char                  char_type;
+  typedef string                string_type;
+
+  explicit moneypunct_byname _STLP_PSPEC2(char, false) (const char * __name, size_t __refs = 0);
+
+protected:
+  _Locale_monetary* _M_monetary;
+  ~moneypunct_byname _STLP_PSPEC2(char, false) ();
+  virtual char        do_decimal_point() const;
+  virtual char        do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string_type do_curr_symbol()   const;
+
+  virtual string_type do_positive_sign() const;
+  virtual string_type do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<wchar_t, true> : public moneypunct<wchar_t, true> 
+{
+public:
+  typedef money_base::pattern   pattern;
+  typedef wchar_t               char_type;
+  typedef wstring               string_type;
+
+  explicit moneypunct_byname _STLP_PSPEC2(wchar_t, true) (const char * __name, size_t __refs = 0);
+
+protected:
+  _Locale_monetary* _M_monetary;
+  ~moneypunct_byname _STLP_PSPEC2(wchar_t, true) ();
+  virtual wchar_t     do_decimal_point() const;
+  virtual wchar_t     do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string_type do_curr_symbol()   const;
+
+  virtual string_type do_positive_sign() const;
+  virtual string_type do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC moneypunct_byname<wchar_t, false> : public moneypunct<wchar_t, false> 
+{
+public:
+  typedef money_base::pattern   pattern;
+  typedef wchar_t               char_type;
+  typedef wstring               string_type;
+
+  explicit moneypunct_byname _STLP_PSPEC2(wchar_t, false) (const char * __name, size_t __refs = 0);
+
+protected:
+  _Locale_monetary* _M_monetary;
+  ~moneypunct_byname _STLP_PSPEC2(wchar_t, false) ();
+  virtual wchar_t     do_decimal_point() const;
+  virtual wchar_t     do_thousands_sep() const;
+  virtual string      do_grouping()      const;
+
+  virtual string_type do_curr_symbol()   const;
+
+  virtual string_type do_positive_sign() const;
+  virtual string_type do_negative_sign() const;
+  virtual int         do_frac_digits()   const;
+};
+# endif
+
+//===== methods ======
+
+
+// money_put facets
+
+template <class _CharT, __DFL_TMPL_PARAM( _OutputIter , ostreambuf_iterator<_CharT>) >
+class money_put : public locale::facet {
+  friend class _Locale;
+
+public:
+  typedef _CharT               char_type;
+  typedef _OutputIter          iter_type;
+  typedef basic_string<_CharT, char_traits<_CharT>, allocator<_CharT> > string_type;
+
+  money_put(size_t __refs = 0) : _BaseFacet(__refs) {}
+# ifndef _STLP_NO_LONG_DOUBLE
+  iter_type put(iter_type __s, bool __intl, ios_base& __str,
+                char_type  __fill, long double __units) const
+    { return do_put(__s, __intl, __str, __fill, __units); }
+# endif
+  iter_type put(iter_type __s, bool __intl, ios_base& __str,
+                char_type  __fill, 
+                const string_type& __digits) const
+    { return do_put(__s, __intl, __str, __fill, __digits); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~money_put() {}
+# ifndef _STLP_NO_LONG_DOUBLE
+  virtual iter_type do_put(iter_type __s, bool  __intl, ios_base&  __str,
+                           char_type __fill, long double /*  __units */ ) const {
+
+    locale __loc = __str.getloc();
+    _CharT  __buf[64];
+    return do_put(__s, __intl, __str, __fill, __buf + 0);
+  }
+# endif    
+  virtual iter_type do_put(iter_type __s, bool  __intl, ios_base&  __str,
+                           char_type __fill,
+                           const string_type& __digits) const;
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS money_get<char, istreambuf_iterator<char, char_traits<char> > >;
+_STLP_EXPORT_TEMPLATE_CLASS money_put<char, ostreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_get<char, const char* >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_put<char, char* >;
+#  if ! defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+_STLP_EXPORT_TEMPLATE_CLASS money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_get<wchar_t, const wchar_t* >;
+// _STLP_EXPORT_TEMPLATE_CLASS money_put<wchar_t, wchar_t* >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_monetary() {
+  money_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index                     = 8;
+  money_get<char, const char*>::id._M_index        = 9;
+  money_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index                     = 10;
+  money_put<char, char*>::id._M_index              = 11;
+# ifndef _STLP_NO_WCHAR_T
+  money_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index                  = 27;
+  money_get<wchar_t, const wchar_t*>::id._M_index  = 28;
+  money_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index                  = 29;
+  money_put<wchar_t, wchar_t*>::id._M_index        = 30;
+# endif  
+}
+#endif
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_monetary.c>
+# endif
+
+#endif /* _STLP_INTERNAL_MONETARY_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/_new.h b/src/STLport/stl/_new.h
new file mode 100644
index 0000000..9c9dc35
--- /dev/null
+++ b/src/STLport/stl/_new.h
@@ -0,0 +1,93 @@
+
+#ifndef _STLP_NEW_H_HEADER
+# define _STLP_NEW_H_HEADER
+
+# ifdef _STLP_NO_BAD_ALLOC
+
+# ifndef _STLP_NEW_DONT_THROW
+#   define _STLP_NEW_DONT_THROW 1
+# endif /* _STLP_NEW_DONT_THROW */
+
+#  include <exception>
+
+_STLP_BEGIN_NAMESPACE
+
+struct nothrow_t {};
+
+# ifdef _STLP_OWN_IOSTREAMS
+extern _STLP_DECLSPEC const nothrow_t nothrow;
+# else
+#  define nothrow nothrow_t()
+# endif
+
+class bad_alloc : public _STLP_EXCEPTION_BASE { 
+public:
+  bad_alloc () _STLP_NOTHROW_INHERENTLY { }
+  bad_alloc(const bad_alloc&) _STLP_NOTHROW_INHERENTLY { }
+  bad_alloc& operator=(const bad_alloc&) _STLP_NOTHROW_INHERENTLY {return *this;}
+  ~bad_alloc () _STLP_NOTHROW_INHERENTLY { }
+  const char* what() const _STLP_NOTHROW_INHERENTLY { return "bad alloc"; }
+};
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NO_BAD_ALLOC */
+
+#ifdef _STLP_WINCE
+_STLP_BEGIN_NAMESPACE
+
+inline void* _STLP_CALL __stl_new(size_t __n) {
+  return ::malloc(__n);
+}
+
+inline void _STLP_CALL __stl_delete(void* __p) {
+  free(__p);
+}
+_STLP_END_NAMESPACE
+
+#else /* _STLP_WINCE */
+
+#include <new>
+
+# ifndef _STLP_NO_BAD_ALLOC
+#  ifdef _STLP_USE_OWN_NAMESPACE
+
+    _STLP_BEGIN_NAMESPACE
+    using _STLP_VENDOR_EXCEPT_STD::bad_alloc;
+    using _STLP_VENDOR_EXCEPT_STD::nothrow_t;
+    using _STLP_VENDOR_EXCEPT_STD::nothrow;
+
+#  if defined (_STLP_GLOBAL_NEW_HANDLER)
+    using ::new_handler;
+    using ::set_new_handler;
+#  else
+    using _STLP_VENDOR_EXCEPT_STD::new_handler;
+    using _STLP_VENDOR_EXCEPT_STD::set_new_handler;
+#  endif
+    
+    _STLP_END_NAMESPACE
+
+#  endif /* _STLP_OWN_NAMESPACE */
+
+# endif /* _STLP_NO_BAD_ALLOC */
+
+# if defined (_STLP_NO_NEW_NEW_HEADER) || defined (_STLP_NEW_DONT_THROW) && ! defined (_STLP_CHECK_NULL_ALLOC)
+#  define _STLP_CHECK_NULL_ALLOC(__x) void* __y = __x;if (__y == 0){_STLP_THROW(bad_alloc());}return __y
+# else
+#  define _STLP_CHECK_NULL_ALLOC(__x) return __x
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if (( defined(__IBMCPP__)|| defined(__OS400__) || defined (__xlC__) || defined (qTidyHeap)) && defined(__DEBUG_ALLOC__) )
+inline void*  _STLP_CALL __stl_new(size_t __n) {  _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n, __FILE__, __LINE__)); }
+inline void _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p, __FILE__, __LINE__); }
+#else
+inline void*  _STLP_CALL __stl_new(size_t __n)   { _STLP_CHECK_NULL_ALLOC(::operator _STLP_NEW(__n)); }
+inline void   _STLP_CALL __stl_delete(void* __p) { ::operator delete(__p); }
+#endif
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_WINCE */
+
+#endif /* _STLP_NEW_H_HEADER */
diff --git a/src/STLport/stl/_null_stream.h b/src/STLport/stl/_null_stream.h
new file mode 100644
index 0000000..1628783
--- /dev/null
+++ b/src/STLport/stl/_null_stream.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_NULL_STREAM_H
+# define _STLP_NULL_STREAM_H
+
+_STLP_BEGIN_NAMESPACE
+
+struct __null_stream 
+{
+    void flush() { }
+};
+
+template <class _Tp>
+__null_stream& operator <<(__null_stream& __x, const _Tp& ) 
+{
+    return __x;
+}
+
+template <class _Tp>
+__null_stream& operator >>(const _Tp&, __null_stream& __x ) 
+{
+    return __x;
+}
+
+extern __null_stream cin, cout, cerr, endl, ws, hex, dec;
+
+_STLP_END_NAMESPACE
+
+# endif
diff --git a/src/STLport/stl/_num_get.c b/src/STLport/stl/_num_get.c
new file mode 100644
index 0000000..5f50bb2
--- /dev/null
+++ b/src/STLport/stl/_num_get.c
@@ -0,0 +1,671 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_NUM_GET_C
+#define _STLP_NUM_GET_C
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+extern const unsigned char __digit_val_table[];
+
+template < class _InputIter, class _Integer, class _CharT>
+_InputIter _STLP_CALL
+_M_do_get_integer(_InputIter&, _InputIter&, ios_base&, ios_base::iostate&, _Integer&, _CharT*);
+
+// _M_do_get_integer and its helper functions.  
+
+inline bool _STLP_CALL __get_fdigit(char& __c, const char*)
+  { return __c >= '0' && __c <= '9'; }
+
+inline bool _STLP_CALL __get_fdigit_or_sep(char& __c, char __sep, const char *)
+{ 
+  if (__c == __sep) { 
+    __c = ',' ; 
+    return true ;
+  } else
+    return  ( __c >= '0' && __c <= '9');
+}
+
+inline int _STLP_CALL
+__get_digit_from_table(unsigned __index)
+{
+  return (__index > 127 ? 0xFF : __digit_val_table[__index]);
+}
+
+extern const char __narrow_atoms[];
+
+template <class _InputIter, class _CharT>
+int 
+_M_get_base_or_zero(_InputIter& __in, _InputIter& __end, ios_base& __str, _CharT*)
+{
+  _CharT __atoms[5];
+  const ctype<_CharT>& __c_type = use_facet< ctype<_CharT> >(__str.getloc());
+  // const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__str._M_ctype_facet();
+
+  __c_type.widen(__narrow_atoms, __narrow_atoms + 5, __atoms);
+
+  bool __negative = false;
+  _CharT __c = *__in;
+
+  if (__c == __atoms[1] /* __xminus_char */ ) {
+    __negative = true;
+    ++__in;
+  }
+  else if (__c == __atoms[0] /* __xplus_char */ ) 
+    ++__in;
+
+
+  int __base;
+  int __valid_zero = 0;
+  
+  ios_base::fmtflags __basefield = __str.flags() & ios_base::basefield; 
+
+  switch (__basefield) {
+  case ios_base::oct:
+    __base = 8;
+    break;
+  case ios_base::dec:
+    __base = 10;
+    break;
+  case ios_base::hex:
+    __base = 16;
+    if (__in != __end && *__in == __atoms[2] /* __zero_char */ ) {
+      ++__in;
+      if (__in != __end &&
+          (*__in == __atoms[3] /* __x_char */ || *__in == __atoms[4] /* __X_char */ ))
+        ++__in;
+      else
+        __valid_zero = 1; // That zero is valid by itself.
+    }
+    break;
+  default:
+    if (__in != __end && *__in == __atoms[2] /* __zero_char */ ) {
+      ++__in;
+      if (__in != __end &&
+          (*__in == __atoms[3] /* __x_char */ || *__in == __atoms[4] /* __X_char */ )) {
+        ++__in;
+        __base = 16;
+      }
+      else
+        {
+          __base = 8;
+          __valid_zero = 1; // That zero is still valid by itself.
+        }
+    }
+    else
+      __base = 10;
+    break;
+  }
+  return (__base << 2) | ((int)__negative << 1) | __valid_zero;
+}
+
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_integer(_InputIter& __first, _InputIter& __last,
+	      int __base, _Integer& __val, 
+	      int __got, bool __is_negative, char __separator, const string& __grouping, const __true_type&) 
+{
+  bool __ovflow = false;
+  _Integer __result = 0;
+  bool __is_group = !__grouping.empty();
+  char __group_sizes[64];
+  int __current_group_size = 0;
+  char* __group_sizes_end = __group_sizes;
+  
+  _Integer __over_base = (numeric_limits<_Integer>::min)() / __STATIC_CAST(_Integer, __base);
+
+   for ( ; __first != __last ; ++__first) {
+  
+     const char __c = *__first;
+     
+     if (__is_group && __c == __separator) {
+       *__group_sizes_end++ = __current_group_size;
+       __current_group_size = 0;
+       continue;
+     }
+     
+     int __n = __get_digit_from_table(__c);
+     
+     if (__n >= __base)
+       break;
+     
+     ++__got;
+     ++__current_group_size;
+     
+     if (__result < __over_base)
+       __ovflow = true;  // don't need to keep accumulating
+     else {
+       _Integer __next = __STATIC_CAST(_Integer, __base * __result - __n);
+       if (__result != 0)
+	 __ovflow = __ovflow || __next >= __result;
+       __result = __next;
+     }
+   }
+
+   if (__is_group && __group_sizes_end != __group_sizes) {
+     *__group_sizes_end++ = __current_group_size;
+   }
+
+   // fbp : added to not modify value if nothing was read
+   if (__got > 0) {
+       __val = __ovflow
+	 ? __is_negative ? (numeric_limits<_Integer>::min)()
+	 : (numeric_limits<_Integer>::max)()
+	 : (__is_negative ? __result : __STATIC_CAST(_Integer, -__result));
+   }
+  // overflow is being treated as failure
+  return ((__got > 0) && !__ovflow) && (__is_group == 0 || __valid_grouping(__group_sizes, __group_sizes_end,
+									    __grouping.data(), __grouping.data()+ __grouping.size())) ;
+}
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_integer(_InputIter& __first, _InputIter& __last,
+	      int __base, _Integer& __val, 
+	      int __got, bool __is_negative, char __separator, const string& __grouping, const __false_type&) 
+{
+  bool __ovflow = false;
+  _Integer __result = 0;
+  bool __is_group = !__grouping.empty();
+  char __group_sizes[64];
+  int __current_group_size = 0;
+  char* __group_sizes_end = __group_sizes;
+
+  _Integer  __over_base = (numeric_limits<_Integer>::max)() / __STATIC_CAST(_Integer, __base);
+
+  for ( ; __first != __last ; ++__first) {
+
+    const char __c = *__first;
+    
+    if (__is_group && __c == __separator) {
+      *__group_sizes_end++ = __current_group_size;
+      __current_group_size = 0;
+      continue;
+    }
+    
+    int __n = __get_digit_from_table(__c);
+    
+    if (__n >= __base)
+      break;
+    
+    ++__got;
+    ++__current_group_size;
+
+    if (__result > __over_base)
+      __ovflow = true;  //don't need to keep accumulating
+    else {
+      _Integer __next = __STATIC_CAST(_Integer, __base * __result + __n);
+	if (__result != 0)
+	  __ovflow = __ovflow || __next <= __result;
+	__result = __next;
+      }      
+  }
+
+  if (__is_group && __group_sizes_end != __group_sizes) {
+      *__group_sizes_end++ = __current_group_size;
+  }
+
+  // fbp : added to not modify value if nothing was read
+  if (__got > 0) {
+      __val = __ovflow
+	? (numeric_limits<_Integer>::max)()
+	: (__is_negative ? __STATIC_CAST(_Integer, -__result) : __result);      
+  }
+  // overflow is being treated as failure
+  return ((__got > 0) && !__ovflow) && 
+    (__is_group == 0 || __valid_grouping(__group_sizes, __group_sizes_end,
+					 __grouping.data(), __grouping.data()+ __grouping.size())) ;
+}
+
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val)
+{
+  string __grp;
+  return __get_integer(__first, __last, 10, __val, 0, false, ' ', __grp, __false_type());
+}
+
+template <class _InputIter, class _Integer, class _CharT>
+_InputIter _STLP_CALL
+_M_do_get_integer(_InputIter& __in, _InputIter& __end, ios_base& __str,
+                  ios_base::iostate& __err, _Integer& __val, _CharT* __pc) 
+{
+
+#if defined(__HP_aCC) && (__HP_aCC == 1)
+  bool _IsSigned = !((_Integer)(-1) > 0);
+#else
+  typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned;
+#endif
+
+  const numpunct<_CharT>& __numpunct = *(const numpunct<_CharT>*)__str._M_numpunct_facet();
+  const string& __grouping = __str._M_grouping(); // cached copy
+
+  const int __base_or_zero = _M_get_base_or_zero(__in, __end, __str, __pc);
+  int  __got = __base_or_zero & 1;
+
+  bool __result;
+
+  if (__in == __end) {      // We may have already read a 0.  If so,
+
+    if (__got > 0) {       // the result is 0 even if we're at eof.
+      __val = 0;
+      __result = true;
+    }
+    else
+      __result = false;    
+  } else {
+
+    const bool __negative = __base_or_zero & 2;
+    const int __base = __base_or_zero >> 2;
+
+#if defined(__HP_aCC) && (__HP_aCC == 1)
+     if (_IsSigned)
+       __result = __get_integer(__in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __true_type() );
+     else
+      __result = __get_integer(__in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, __false_type() );
+#else
+    __result = __get_integer(__in, __end, __base,  __val, __got, __negative, __numpunct.thousands_sep(), __grouping, _IsSigned());
+# endif
+  }
+
+  __err = __STATIC_CAST(ios_base::iostate, __result ? ios_base::goodbit : ios_base::failbit);
+
+  if (__in == __end)
+    __err |= ios_base::eofbit;
+  return __in;
+}
+
+// _M_read_float and its helper functions.
+template <class _InputIter, class _CharT>
+_InputIter  _STLP_CALL
+__copy_sign(_InputIter __first, _InputIter __last, string& __v,
+            _CharT __xplus, _CharT __xminus) {
+    if (__first != __last) {
+    _CharT __c = *__first;
+    if (__c == __xplus)
+      ++__first;
+    else if (__c == __xminus) {
+      __v.push_back('-');
+      ++__first;
+    }
+  }
+  return __first;
+}
+
+
+template <class _InputIter, class _CharT>
+bool _STLP_CALL
+__copy_digits(_InputIter& __first, _InputIter& __last,
+              string& __v, const _CharT* __digits)
+{
+  bool __ok = false;
+
+  for ( ; __first != __last; ++__first) {
+    _CharT __c = *__first;
+    if (__get_fdigit(__c, __digits)) {
+      __v.push_back((char)__c);
+      __ok = true;
+    }
+    else
+      break;
+  }
+  return __ok;
+}
+
+template <class _InputIter, class _CharT>
+bool _STLP_CALL
+__copy_grouped_digits(_InputIter& __first, _InputIter& __last,
+		      string& __v, const _CharT * __digits,
+		      _CharT __sep, const string& __grouping,
+		      bool& __grouping_ok)
+{
+  bool __ok = false;
+  char __group_sizes[64];
+  char*__group_sizes_end = __group_sizes;
+  char __current_group_size = 0;
+
+  for ( ; __first != __last; ++__first) {
+    _CharT __c = *__first;
+    bool __tmp = __get_fdigit_or_sep(__c, __sep, __digits);
+    if (__tmp) {
+      if (__c == ',') {
+        *__group_sizes_end++ = __current_group_size;
+        __current_group_size = 0;
+      }
+      else {
+        __ok = true;
+        __v.push_back((char)__c);
+        ++__current_group_size;
+      }
+    }
+    else
+      break;
+  }
+  
+  if (__group_sizes_end != __group_sizes)
+    *__group_sizes_end++ = __current_group_size;
+  __grouping_ok = __valid_grouping(__group_sizes, __group_sizes_end, __grouping.data(), __grouping.data() + __grouping.size());
+  return __ok;	
+}
+
+
+template <class _InputIter, class _CharT>
+bool _STLP_CALL
+_M_read_float(string& __buf, _InputIter& __in, _InputIter& __end, ios_base& __s, _CharT*)
+{
+  // Create a string, copying characters of the form 
+  // [+-]? [0-9]* .? [0-9]* ([eE] [+-]? [0-9]+)?
+
+  bool __digits_before_dot /* = false */;
+  bool __digits_after_dot = false;
+  bool __ok;
+
+  bool   __grouping_ok = true;
+
+  const ctype<_CharT>& __ct = use_facet< ctype<_CharT> >(__s.getloc());
+  // const ctype<_CharT>& __ct = *(const ctype<_CharT>*)__s._M_ctype_facet();
+  const numpunct<_CharT>& __numpunct = *(const numpunct<_CharT>*)__s._M_numpunct_facet();
+  const string& __grouping = __s._M_grouping(); // cached copy
+
+  _CharT __dot = __numpunct.decimal_point();
+  _CharT __sep = __numpunct.thousands_sep();
+
+  _CharT __digits[10];
+  _CharT __xplus;
+  _CharT __xminus;
+
+  _CharT __pow_e;
+  _CharT __pow_E;
+
+  _Initialize_get_float(__ct, __xplus, __xminus, __pow_e, __pow_E, __digits);
+
+  // Get an optional sign
+  __in = __copy_sign(__in, __end, __buf, __xplus, __xminus);
+
+  // Get an optional string of digits.
+  if (__grouping.size() != 0)
+    __digits_before_dot = __copy_grouped_digits(__in, __end, __buf, __digits,
+						__sep, __grouping, __grouping_ok);
+  else
+    __digits_before_dot = __copy_digits(__in, __end, __buf, __digits);
+
+  // Get an optional decimal point, and an optional string of digits.
+  if (__in != __end && *__in == __dot) {
+    __buf.push_back('.');
+    ++__in;
+    __digits_after_dot = __copy_digits(__in, __end, __buf, __digits);
+  }
+
+  // There have to be some digits, somewhere.
+  __ok = __digits_before_dot || __digits_after_dot;
+  
+  // Get an optional exponent.
+  if (__ok && __in != __end && (*__in == __pow_e || *__in == __pow_E)) {
+    __buf.push_back('e');
+    ++__in;
+    __in = __copy_sign(__in, __end, __buf, __xplus, __xminus);
+    __ok = __copy_digits(__in, __end, __buf, __digits);
+    // If we have an exponent then the sign 
+    // is optional but the digits aren't.
+  }
+  
+  return __ok;
+}
+
+//
+// num_get<>, num_put<>
+//
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 ) 
+template <class _CharT, class _InputIterator>
+locale::id num_get<_CharT, _InputIterator>::id;
+# else
+
+typedef num_get<char, const char*> num_get_char;
+typedef num_get<char, istreambuf_iterator<char, char_traits<char> > > num_get_char_2;
+
+__DECLARE_INSTANCE(locale::id, num_get_char::id, );
+__DECLARE_INSTANCE(locale::id, num_get_char_2::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef num_get<wchar_t, const wchar_t*> num_get_wchar_t;
+typedef num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > num_get_wchar_t_2;
+
+__DECLARE_INSTANCE(locale::id, num_get_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, num_get_wchar_t_2::id, );
+
+# endif
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+# ifndef _STLP_NO_BOOL
+template <class _CharT, class _InputIter>
+_InputIter
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end,
+                                    ios_base& __s,
+                                    ios_base::iostate& __err, bool& __x) const
+{
+  if (__s.flags() & ios_base::boolalpha) {
+    locale __loc = __s.getloc();
+    const _Numpunct& __np = *(const _Numpunct*)__s._M_numpunct_facet();
+    //    const numpunct<_CharT>& __np = use_facet<numpunct<_CharT> >(__loc) ;
+//    const ctype<_CharT>& __ct =    use_facet<ctype<_CharT> >(__loc) ;
+
+    const basic_string<_CharT> __truename  = __np.truename();
+    const basic_string<_CharT> __falsename = __np.falsename();
+    bool __true_ok  = true;
+    bool __false_ok = true;
+
+    size_t __n = 0;
+    for ( ; __in != __end; ++__in) {
+      _CharT __c = *__in;
+      __true_ok  = __true_ok  && (__c == __truename[__n]);
+      __false_ok = __false_ok && (__c == __falsename[__n]);
+      ++__n;
+
+      if ((!__true_ok && !__false_ok) ||
+          (__true_ok  && __n >= __truename.size()) ||
+          (__false_ok && __n >= __falsename.size())) {
+	++__in;
+        break;
+      }
+    }
+    if (__true_ok  && __n < __truename.size())  __true_ok  = false;
+    if (__false_ok && __n < __falsename.size()) __false_ok = false;
+    
+    if (__true_ok || __false_ok) {
+      __err = ios_base::goodbit;
+      __x = __true_ok;
+    }
+    else
+      __err = ios_base::failbit;
+
+    if (__in == __end)
+      __err |= ios_base::eofbit;
+
+    return __in;
+  }
+
+  else {
+    long __lx;
+    _InputIter __tmp = this->do_get(__in, __end, __s, __err, __lx);
+    if (!(__err & ios_base::failbit)) {
+      if (__lx == 0)
+        __x = false;
+      else if (__lx == 1)
+        __x = true;
+      else
+        __err |= ios_base::failbit;
+    }
+    return __tmp;
+  }
+}
+
+# endif /* _STLP_NO_BOOL */
+
+# ifdef _STLP_FIX_LIBRARY_ISSUES
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err, short& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err, int& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+# endif
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err, long& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err,
+                                    unsigned short& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err, 
+                                    unsigned int& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err,
+                                    unsigned long& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err,
+                                    float& __val) const {
+  string __buf ;
+  bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+  __string_to_float(__buf, __val);  
+  __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
+  if (__in == __end)
+    __err |= ios_base::eofbit;
+  return __in;
+}
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err, 
+                                    double& __val) const {
+  string __buf ;
+  bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+  __string_to_float(__buf, __val);
+  __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
+  if (__in == __end)
+    __err |= ios_base::eofbit;
+  return __in;
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+				    ios_base::iostate& __err,
+                                    long double& __val) const {
+  string __buf ;
+  bool __ok = _M_read_float(__buf, __in, __end, __str, (_CharT*)0 );
+  __string_to_float(__buf, __val);
+  __err = __STATIC_CAST(ios_base::iostate, __ok ? ios_base::goodbit : ios_base::failbit);
+  if (__in == __end)
+    __err |= ios_base::eofbit;
+  return __in;
+}
+#endif /* _STLP_NO_LONG_DOUBLE */
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err,
+                           void*& __p) const {
+# if defined(_STLP_LONG_LONG)&&!defined(__MRC__)		//*ty 12/07/2001 - MrCpp can not cast from long long to void*
+  unsigned _STLP_LONG_LONG __val;
+# else
+  unsigned long __val;
+# endif
+    iter_type __tmp = _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+    if (!(__err & ios_base::failbit))
+      __p = __REINTERPRET_CAST(void*,__val);
+    return __tmp;
+  }
+
+
+#ifdef _STLP_LONG_LONG
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err,
+                                    _STLP_LONG_LONG& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+template <class _CharT, class _InputIter>  
+_InputIter 
+num_get<_CharT, _InputIter>::do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                                    ios_base::iostate& __err,
+                                    unsigned _STLP_LONG_LONG& __val) const {
+  return _M_do_get_integer(__in, __end, __str, __err, __val, (_CharT*)0 );
+}
+
+#endif /* _STLP_LONG_LONG */
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_EXPOSE_STREAM_IMPLEMENTATION */
+
+#endif /* _STLP_NUMERIC_FACETS_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_num_get.h b/src/STLport/stl/_num_get.h
new file mode 100644
index 0000000..b396d4a
--- /dev/null
+++ b/src/STLport/stl/_num_get.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+#define _STLP_INTERNAL_NUM_GET_H
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+# ifndef _STLP_C_LOCALE_H
+#  include <stl/c_locale.h>
+# endif
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// num_get facets
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _CharT, class _InputIter>  
+# else
+template <class _CharT, class _InputIter = istreambuf_iterator<_CharT> >  
+# endif
+class num_get: public locale::facet
+{
+  friend class _Locale;
+public:
+  typedef _CharT     char_type;
+  typedef _InputIter iter_type;
+
+  explicit num_get(size_t __refs = 0): locale::facet(__refs) {}
+    
+# ifndef _STLP_NO_BOOL
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, bool& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+# endif
+
+# ifdef _STLP_FIX_LIBRARY_ISSUES
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, short& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, int& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+# endif
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, long& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, unsigned short& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, unsigned int& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, unsigned long& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+#ifdef _STLP_LONG_LONG
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, _STLP_LONG_LONG& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+#endif /* _STLP_LONG_LONG */
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                 ios_base::iostate& __err, float& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, double& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+# ifndef _STLP_NO_LONG_DOUBLE
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, long double& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+# endif
+
+  _InputIter get(_InputIter __in, _InputIter __end, ios_base& __str,
+                ios_base::iostate& __err, void*& __val) const {
+    return do_get(__in, __end, __str, __err, __val);
+  }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~num_get() {}
+
+  typedef string               string_type; 
+  typedef ctype<_CharT>        _Ctype;
+  typedef numpunct<_CharT>     _Numpunct;
+
+# ifndef _STLP_NO_BOOL
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end,
+                           ios_base& __str, ios_base::iostate& __err, bool& __val) const;
+# endif
+
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, long& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, unsigned short& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, unsigned int& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, unsigned long& __val) const;
+# ifdef _STLP_FIX_LIBRARY_ISSUES
+  // issue 118 : those are actually not supposed to be here
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, short& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, int& __val) const;
+# endif
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                          ios_base::iostate& __err, float& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, double& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err,
+                           void*& __p) const;
+
+#ifndef _STLP_NO_LONG_DOUBLE
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, long double& __val) const;
+#endif /* _STLP_NO_LONG_DOUBLE */
+
+#ifdef _STLP_LONG_LONG
+
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                            ios_base::iostate& __err, _STLP_LONG_LONG& __val) const;
+  virtual _InputIter do_get(_InputIter __in, _InputIter __end, ios_base& __str,
+                           ios_base::iostate& __err, unsigned _STLP_LONG_LONG& __val) const;
+#endif /* _STLP_LONG_LONG */
+
+};
+
+
+# ifdef _STLP_USE_TEMPLATE_EXPORT
+_STLP_EXPORT_TEMPLATE_CLASS num_get<char, istreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_get<char, const char*>;
+#  ifndef _STLP_NO_WCHAR_T
+_STLP_EXPORT_TEMPLATE_CLASS num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_get<wchar_t, const wchar_t*>;
+#  endif /* _STLP_NO_WCHAR_T */
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+extern bool  _STLP_CALL __valid_grouping(const char*, const char*, const char*, const char*);
+
+template <class _InputIter, class _Integer>
+bool _STLP_CALL
+__get_decimal_integer(_InputIter& __first, _InputIter& __last, _Integer& __val);
+
+inline bool _STLP_CALL __get_fdigit(char& __c, const char*);
+inline bool _STLP_CALL __get_fdigit_or_sep(char& __c, char __sep, const char *);
+# ifndef _STLP_NO_WCHAR_T
+bool _STLP_CALL __get_fdigit(wchar_t&, const wchar_t*);
+bool _STLP_CALL __get_fdigit_or_sep(wchar_t&, wchar_t, const wchar_t*);
+# endif
+
+inline void  _STLP_CALL
+_Initialize_get_float(const ctype<char>&,
+                       char& Plus, char& Minus,
+                       char& pow_e, char& pow_E,
+                       char*)
+{
+  Plus = '+';
+  Minus = '-';
+  pow_e = 'e';
+  pow_E = 'E';
+}
+
+# ifndef _STLP_NO_WCHAR_T
+void  _STLP_CALL _Initialize_get_float(const ctype<wchar_t>&,
+                                        wchar_t&, wchar_t&, wchar_t&, wchar_t&, wchar_t*);
+# endif
+void  _STLP_CALL __string_to_float(const string&, float&);
+void  _STLP_CALL __string_to_float(const string&, double&);
+# ifndef _STLP_NO_LONG_DOUBLE
+void  _STLP_CALL __string_to_float(const string&, long double&);
+# endif
+# endif
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_num_get() {  
+  num_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index = 12;
+  num_get<char, const char*>::id._M_index = 13;
+  
+# ifndef _STLP_NO_WCHAR_T
+  num_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index = 31;
+  num_get<wchar_t, const wchar_t*>::id._M_index = 32;
+# endif
+} 
+# endif
+
+_STLP_END_NAMESPACE
+
+#  if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && ! defined (_STLP_LINK_TIME_INSTANTIATION)
+#   include <stl/_num_get.c>
+#  endif
+
+#endif /* _STLP_INTERNAL_NUM_GET_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_num_put.c b/src/STLport/stl/_num_put.c
new file mode 100644
index 0000000..2c191ea
--- /dev/null
+++ b/src/STLport/stl/_num_put.c
@@ -0,0 +1,553 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_NUM_PUT_C
+#define _STLP_NUM_PUT_C
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_LIMITS_H
+# include <stl/_limits.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// _M_do_put_float and its helper functions.  Strategy: write the output
+// to a buffer of char, transform the buffer to _CharT, and then copy
+// it to the output.
+
+template <class _CharT, class _OutputIter,class _Float>
+_OutputIter _STLP_CALL
+_M_do_put_float(_OutputIter __s, ios_base& __f, _CharT __fill,_Float    __x);
+
+
+//----------------------------------------------------------------------
+// num_put facet
+
+template <class _CharT, class _OutputIter>
+_OutputIter  _STLP_CALL
+__copy_float_and_fill(const _CharT* __first, const _CharT* __last,
+                      _OutputIter __out,
+                      ios_base::fmtflags __flags,
+                      streamsize __width, _CharT __fill,
+                      _CharT __xplus, _CharT __xminus) {
+  if (__width <= __last - __first)
+    return copy(__first, __last, __out);
+  else {
+    streamsize __pad = __width - (__last - __first);
+    ios_base::fmtflags __dir = __flags & ios_base::adjustfield;
+
+    if (__dir == ios_base::left) {
+      __out = copy(__first, __last, __out);
+      return fill_n(__out, __pad, __fill);
+    }
+    else if (__dir == ios_base::internal && __first != __last &&
+             (*__first == __xplus || *__first == __xminus)) {
+      *__out++ = *__first++;
+      __out = fill_n(__out, __pad, __fill);
+      return copy(__first, __last, __out);
+    }
+    else {
+      __out = fill_n(__out, __pad, __fill);
+      return copy(__first, __last, __out);
+    }
+  }
+}
+
+#ifndef _STLP_NO_WCHAR_T
+// Helper routine for wchar_t
+template <class _OutputIter>
+_OutputIter  _STLP_CALL
+__put_float(char* __ibuf, char* __iend, _OutputIter __out,
+            ios_base& __f, wchar_t __fill,
+            wchar_t __decimal_point,
+            wchar_t __sep, const string& __grouping)
+{
+  const ctype<wchar_t>& __ct = *(ctype<wchar_t>*)__f._M_ctype_facet() ;
+
+  wchar_t __wbuf[128];
+  wchar_t* __eend = __convert_float_buffer(__ibuf, __iend, __wbuf,
+                                           __ct, __decimal_point);
+  if (!__grouping.empty()) {
+    // In order to do separator-insertion only to the left of the
+    // decimal point, we adjust the size of the first (right-most)
+    // group.  We need to be careful if there is only one entry in
+    // grouping:  in this case we need to duplicate the first entry.
+
+    string __new_grouping = __grouping;
+    wchar_t* __decimal_pos = find(__wbuf, __eend, __decimal_point);
+    if (__grouping.size() == 1)
+      __new_grouping.push_back(__grouping[0]);
+
+	// dwa 1/24/00 - try as I might, there doesn't seem to be a way
+    // to suppress the warning
+    __new_grouping[0] += __STATIC_CAST(char, __eend - __decimal_pos);
+    ptrdiff_t __len = __insert_grouping(__wbuf, __eend, __new_grouping,
+					__sep,
+					__ct.widen('+'), __ct.widen('-'),
+					0);
+    __eend = __wbuf + __len;
+  }
+
+  return __copy_float_and_fill(__wbuf, __eend, __out,
+                               __f.flags(), __f.width(0), __fill,
+                               __ct.widen('+'), __ct.widen('-')); 
+}
+# endif /* WCHAR_T */
+
+// Helper routine for char
+template <class _OutputIter>
+_OutputIter  _STLP_CALL
+__put_float(char* __ibuf, char* __iend, _OutputIter __out,
+            ios_base& __f, char __fill,
+            char __decimal_point,
+            char __sep, const string& __grouping)
+{
+  __adjust_float_buffer(__ibuf, __iend, __decimal_point);
+  if (!__grouping.empty()) {
+    string __new_grouping = __grouping;
+    const char * __decimal_pos = find(__ibuf, __iend, __decimal_point);
+    if (__grouping.size() == 1)
+      __new_grouping.push_back(__grouping[0]);
+    __new_grouping[0] += __STATIC_CAST(char, (__iend - __decimal_pos));
+    ptrdiff_t __len = __insert_grouping(__ibuf, __iend, __new_grouping,
+					__sep, '+', '-', 0);
+    __iend = __ibuf + __len;
+  }
+
+  return __copy_float_and_fill(__ibuf, __iend, __out,
+                               __f.flags(), __f.width(0), __fill, '+', '-');
+}
+
+template <class _CharT, class _OutputIter, class _Float>
+_OutputIter _STLP_CALL
+_M_do_put_float(_OutputIter __s, ios_base& __f,
+                _CharT __fill, _Float __x)
+{
+  string __buf;
+  __buf.reserve(128);
+  __write_float(__buf, __f.flags(), (int)__f.precision(), __x);
+
+  const numpunct<_CharT>& __np = *(const numpunct<_CharT>*)__f._M_numpunct_facet();
+  
+  return __put_float(__CONST_CAST(char*, __buf.c_str()), 
+                     __CONST_CAST(char*, __buf.c_str()) + __buf.size(),
+                     __s, __f, __fill,
+                     __np.decimal_point(),
+		                 __np.thousands_sep(), __f._M_grouping());
+}
+
+// _M_do_put_integer and its helper functions.
+
+template <class _CharT, class _OutputIter>
+_OutputIter _STLP_CALL
+__copy_integer_and_fill(const _CharT* __buf, ptrdiff_t __len,
+                        _OutputIter __out,
+                        ios_base::fmtflags __flg, streamsize __wid, _CharT __fill,
+                        _CharT __xplus, _CharT __xminus)
+{
+  if (__len >= __wid)
+    return copy(__buf, __buf + __len, __out);
+  else {
+    ptrdiff_t __pad = __wid - __len;
+    ios_base::fmtflags __dir = __flg & ios_base::adjustfield;
+
+    if (__dir == ios_base::left) {
+      __out = copy(__buf, __buf + __len, __out);
+      return fill_n(__out, __pad, __fill);
+    }
+    else if (__dir == ios_base::internal && __len != 0 &&
+             (__buf[0] == __xplus || __buf[0] == __xminus)) {
+      *__out++ = __buf[0];
+      __out = fill_n(__out, __pad, __fill);
+      return copy(__buf + 1, __buf + __len, __out);
+    }
+    else if (__dir == ios_base::internal && __len >= 2 &&
+             (__flg & ios_base::showbase) &&
+             (__flg & ios_base::basefield) == ios_base::hex) {
+      *__out++ = __buf[0];
+      *__out++ = __buf[1];
+      __out = fill_n(__out, __pad, __fill);
+      return copy(__buf + 2, __buf + __len, __out);
+    }
+    else {
+      __out = fill_n(__out, __pad, __fill);
+      return copy(__buf, __buf + __len, __out);
+    }
+  }
+}
+
+#ifndef _STLP_NO_WCHAR_T
+// Helper function for wchar_t
+template <class _OutputIter>
+_OutputIter _STLP_CALL
+__put_integer(char* __buf, char* __iend, _OutputIter __s,
+              ios_base& __f,
+              ios_base::fmtflags __flags, wchar_t __fill)
+{
+  locale __loc = __f.getloc();
+  //  const ctype<wchar_t>& __ct = use_facet<ctype<wchar_t> >(__loc);
+  const ctype<wchar_t>& __ct = *(const ctype<wchar_t>*)__f._M_ctype_facet();
+
+  wchar_t __xplus  = __ct.widen('+');
+  wchar_t __xminus = __ct.widen('-');
+
+  wchar_t __wbuf[64];
+  __ct.widen(__buf, __iend, __wbuf);
+  ptrdiff_t __len = __iend - __buf;
+  wchar_t* __eend = __wbuf + __len;
+
+  //  const numpunct<wchar_t>& __np = use_facet<numpunct<wchar_t> >(__loc);
+  //  const string& __grouping = __np.grouping();
+
+  const numpunct<wchar_t>& __np = *(const numpunct<wchar_t>*)__f._M_numpunct_facet();
+  const string& __grouping = __f._M_grouping();
+
+  if (!__grouping.empty()) {
+    int __basechars;
+    if (__flags & ios_base::showbase)
+      switch (__flags & ios_base::basefield) {
+	case ios_base::hex: __basechars = 2; break;
+	case ios_base::oct: __basechars = 1; break;
+	default: __basechars = 0;
+      }
+    else
+      __basechars = 0;
+
+    __len = __insert_grouping(__wbuf, __eend, __grouping, __np.thousands_sep(),
+			      __xplus, __xminus, __basechars);
+  }
+
+  return __copy_integer_and_fill((wchar_t*)__wbuf, __len, __s,
+                                 __flags, __f.width(0), __fill, __xplus, __xminus);
+}
+#endif
+
+// Helper function for char
+template <class _OutputIter>
+_OutputIter _STLP_CALL
+__put_integer(char* __buf, char* __iend, _OutputIter __s,
+              ios_base& __f, ios_base::fmtflags __flags, char __fill)
+{
+  ptrdiff_t __len = __iend - __buf;
+  char __grpbuf[64];
+
+  //  const numpunct<char>& __np = use_facet<numpunct<char> >(__f.getloc());
+  //  const string& __grouping = __np.grouping();
+
+  const numpunct<char>& __np = *(const numpunct<char>*)__f._M_numpunct_facet();
+  const string& __grouping = __f._M_grouping();
+
+  if (!__grouping.empty()) {
+    int __basechars;
+    if (__flags & ios_base::showbase)
+      switch (__flags & ios_base::basefield) {
+	case ios_base::hex: __basechars = 2; break;
+	case ios_base::oct: __basechars = 1; break;
+	default: __basechars = 0;
+      }
+    else
+      __basechars = 0;
+ 
+     // make sure there is room at the end of the buffer
+     // we pass to __insert_grouping
+
+    copy(__buf, __iend, (char *) __grpbuf);
+    __buf = __grpbuf;
+    __iend = __grpbuf + __len; 
+    __len = __insert_grouping(__buf, __iend, __grouping, __np.thousands_sep(), 
+                              '+', '-', __basechars);
+  }
+  
+  return __copy_integer_and_fill(__buf, __len, __s, __flags, __f.width(0), __fill, '+', '-');
+}
+
+#ifdef _STLP_LONG_LONG
+typedef _STLP_LONG_LONG __max_int_t;
+typedef unsigned _STLP_LONG_LONG __umax_int_t;
+#else
+typedef long __max_int_t;
+typedef unsigned long __umax_int_t;
+#endif
+
+extern const char __hex_char_table_lo[];
+extern const char __hex_char_table_hi[];
+
+template <class _Integer>
+inline char* _STLP_CALL
+__write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __true_type& /* is_signed */)
+{
+  const bool __negative = __x < 0 ;
+  __max_int_t __temp = __x;
+  __umax_int_t __utemp = __negative?-__temp:__temp;
+
+  for (; __utemp != 0; __utemp /= 10)
+    *--__ptr = (int)(__utemp % 10) + '0';	  
+  // put sign if needed or requested
+  if (__negative)
+    *--__ptr = '-';
+  else if (__flags & ios_base::showpos)
+    *--__ptr = '+';
+  return __ptr;
+}
+
+template <class _Integer>
+inline char* _STLP_CALL
+__write_decimal_backward(char* __ptr, _Integer __x, ios_base::fmtflags __flags, const __false_type& /* is_signed */)
+{
+  for (; __x != 0; __x /= 10)
+    *--__ptr = (int)(__x % 10) + '0';
+  // put sign if requested
+  if (__flags & ios_base::showpos)
+    *--__ptr = '+';
+  return __ptr;
+}
+
+template <class _Integer>
+char* _STLP_CALL
+__write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x)
+{
+  char* __ptr = __buf;
+  __umax_int_t __temp;
+
+  if (__x == 0) {
+    *--__ptr = '0';
+    if ((__flags & ios_base::showpos) && ( (__flags & (ios_base::hex | ios_base::oct)) == 0 ))
+      *--__ptr = '+';
+  }
+  else {
+    
+    switch (__flags & ios_base::basefield) {
+    case ios_base::oct:
+      __temp = __x;
+      // if the size of integer is less than 8, clear upper part
+      if ( sizeof(__x) < 8  && sizeof(__umax_int_t) >= 8 )
+        __temp &= 0xFFFFFFFF;
+
+      for (; __temp != 0; __temp >>=3)
+        *--__ptr = (((unsigned)__temp)& 0x7) + '0';
+      
+      // put leading '0' is showbase is set
+      if (__flags & ios_base::showbase)
+        *--__ptr = '0';
+      break;
+    case ios_base::hex: 
+      {
+        const char* __table_ptr = (__flags & ios_base::uppercase) ? 
+          __hex_char_table_hi : __hex_char_table_lo;
+      __temp = __x;
+      // if the size of integer is less than 8, clear upper part
+      if ( sizeof(__x) < 8  && sizeof(__umax_int_t) >= 8 )
+        __temp &= 0xFFFFFFFF;
+
+        for (; __temp != 0; __temp >>=4)
+          *--__ptr = __table_ptr[((unsigned)__temp & 0xF)];
+        
+        if (__flags & ios_base::showbase) {
+          *--__ptr = __table_ptr[16];
+          *--__ptr = '0';
+        }
+      }
+      break;
+    default: 
+      {
+#if defined(__HP_aCC) && (__HP_aCC == 1)
+        bool _IsSigned = !((_Integer)-1 > 0);
+	if (_IsSigned)
+	  __ptr = __write_decimal_backward(__ptr, __x, __flags, __true_type() );
+        else
+	  __ptr = __write_decimal_backward(__ptr, __x, __flags, __false_type() );
+#else
+	typedef typename __bool2type<numeric_limits<_Integer>::is_signed>::_Ret _IsSigned;
+	__ptr = __write_decimal_backward(__ptr, __x, __flags, _IsSigned());
+# endif
+      }
+      break;
+    }  
+  }
+  // return pointer to beginning of the string
+  return __ptr;
+}
+
+//
+// num_put<>
+//
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+template <class _CharT, class _OutputIterator>
+locale::id num_put<_CharT, _OutputIterator>::id;
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+typedef num_put<char, const char*> num_put_char;
+typedef num_put<char, char*> num_put_char_2;
+typedef num_put<char, ostreambuf_iterator<char, char_traits<char> > > num_put_char_3;
+
+__DECLARE_INSTANCE(locale::id, num_put_char::id, );
+__DECLARE_INSTANCE(locale::id, num_put_char_2::id, );
+__DECLARE_INSTANCE(locale::id, num_put_char_3::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef num_put<wchar_t, const wchar_t*> num_put_wchar_t;
+typedef num_put<wchar_t, wchar_t*> num_put_wchar_t_2;
+typedef num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > num_put_wchar_t_3;
+
+__DECLARE_INSTANCE(locale::id, num_put_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, num_put_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, num_put_wchar_t_3::id, );
+
+# endif
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+// issue 118
+
+# ifndef _STLP_NO_BOOL
+
+template <class _CharT, class _OutputIter>  
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, 
+                                     char_type __fill,  bool __val) const {
+  if (!(__f.flags() & ios_base::boolalpha))
+    return this->do_put(__s, __f, __fill, __STATIC_CAST(long,__val));
+
+  locale __loc = __f.getloc();
+  //  typedef numpunct<_CharT> _Punct;
+  //  const _Punct& __np = use_facet<_Punct>(__loc);
+
+  const numpunct<_CharT>& __np = *(const numpunct<_CharT>*)__f._M_numpunct_facet();
+
+  basic_string<_CharT> __str = __val ? __np.truename() : __np.falsename();
+
+  // Reuse __copy_integer_and_fill.  Since internal padding makes no
+  // sense for bool, though, make sure we use something else instead.
+  // The last two argument to __copy_integer_and_fill are dummies.
+  ios_base::fmtflags __flags = __f.flags();
+  if ((__flags & ios_base::adjustfield) == ios_base::internal)
+    __flags = (__flags & ~ios_base::adjustfield) | ios_base::right;
+
+  return __copy_integer_and_fill(__str.c_str(), __str.size(), __s,
+                                 __flags, __f.width(0), __fill,
+                                 (_CharT) 0, (_CharT) 0);
+}
+
+# endif
+
+template <class _CharT, class _OutputIter>
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+                                     long __val) const {
+
+  char __buf[64];               // Large enough for a base 8 64-bit integer,
+                                // plus any necessary grouping.  
+  ios_base::fmtflags __flags = __f.flags();
+  char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);  
+  return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+
+template <class _CharT, class _OutputIter>  
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+				     unsigned long __val) const {
+  char __buf[64];               // Large enough for a base 8 64-bit integer,
+                                // plus any necessary grouping.
+  
+  ios_base::fmtflags __flags = __f.flags();
+  char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);
+  return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+template <class _CharT, class _OutputIter>  
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+                                     double __val) const {
+  return _M_do_put_float(__s, __f, __fill, __val);
+}
+
+#ifndef _STLP_NO_LONG_DOUBLE
+template <class _CharT, class _OutputIter>  
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+                                     long double __val) const {
+  return _M_do_put_float(__s, __f, __fill, __val);
+}
+#endif
+
+#ifdef _STLP_LONG_LONG
+template <class _CharT, class _OutputIter>  
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+                                     _STLP_LONG_LONG __val) const {
+  char __buf[64];               // Large enough for a base 8 64-bit integer,
+                                // plus any necessary grouping.
+  
+  ios_base::fmtflags __flags = __f.flags();
+  char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);
+  return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+template <class _CharT, class _OutputIter>  
+_OutputIter 
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT __fill,
+                                     unsigned _STLP_LONG_LONG __val) const {
+  char __buf[64];               // Large enough for a base 8 64-bit integer,
+                                // plus any necessary grouping.
+  
+  ios_base::fmtflags __flags = __f.flags();
+  char* __ibeg = __write_integer_backward((char*)__buf+64, __flags, __val);  
+  return __put_integer(__ibeg, (char*)__buf+64, __s, __f, __flags, __fill);
+}
+
+#endif /* _STLP_LONG_LONG */
+
+
+// lib.facet.num.put.virtuals "12 For conversion from void* the specifier is %p."
+template <class _CharT, class _OutputIter>
+_OutputIter
+num_put<_CharT, _OutputIter>::do_put(_OutputIter __s, ios_base& __f, _CharT /*__fill*/,
+				     const void* __val) const {
+  const ctype<_CharT>& __c_type = *(const ctype<_CharT>*)__f._M_ctype_facet();
+  ios_base::fmtflags __save_flags = __f.flags();
+
+  __f.setf(ios_base::hex, ios_base::basefield);
+  __f.setf(ios_base::showbase);
+  __f.setf(ios_base::internal, ios_base::adjustfield);
+  __f.width((sizeof(void*) * 2) + 2); // digits in pointer type plus '0x' prefix
+# if defined(_STLP_LONG_LONG) && !defined(__MRC__) //*ty 11/24/2001 - MrCpp can not cast from void* to long long
+  _OutputIter result = this->do_put(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned _STLP_LONG_LONG,__val));
+# else
+  _OutputIter result = this->do_put(__s, __f, __c_type.widen('0'), __REINTERPRET_CAST(unsigned long,__val));
+# endif
+  __f.flags(__save_flags);
+  return result;
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_EXPOSE_STREAM_IMPLEMENTATION */
+
+#endif /* _STLP_NUM_PUT_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_num_put.h b/src/STLport/stl/_num_put.h
new file mode 100644
index 0000000..8fccfaf
--- /dev/null
+++ b/src/STLport/stl/_num_put.h
@@ -0,0 +1,186 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+#define _STLP_INTERNAL_NUM_PUT_H
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+# include <stl/_numpunct.h>
+#endif
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// num_put facet
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _CharT, class _OutputIter>  
+# else
+template <class _CharT, class _OutputIter = ostreambuf_iterator<_CharT, char_traits<_CharT> > >  
+# endif
+class num_put: public locale::facet
+{
+  friend class _Locale;
+public:
+  typedef _CharT      char_type;
+  typedef _OutputIter iter_type;
+
+  explicit num_put(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+# ifndef _STLP_NO_BOOL
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                bool __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+# endif
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+               long __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                unsigned long __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+
+#ifdef _STLP_LONG_LONG
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                _STLP_LONG_LONG __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                unsigned _STLP_LONG_LONG __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+#endif
+
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                double __val) const {
+    return do_put(__s, __f, __fill, (double)__val);
+  }
+
+#ifndef _STLP_NO_LONG_DOUBLE
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                long double __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+# endif
+
+  iter_type put(iter_type __s, ios_base& __f, char_type __fill,
+                const void * __val) const {
+    return do_put(__s, __f, __fill, __val);
+  }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  ~num_put() {}   
+# ifndef _STLP_NO_BOOL
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, bool __val) const;
+# endif
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, long __val) const;
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, unsigned long __val) const;
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, double __val) const;
+#ifndef _STLP_NO_LONG_DOUBLE
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, long double __val) const;
+#endif
+
+#ifdef _STLP_LONG_LONG
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, _STLP_LONG_LONG __val) const;
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, 
+                           unsigned _STLP_LONG_LONG __val) const ;
+#endif /* _STLP_LONG_LONG  */
+  virtual _OutputIter do_put(_OutputIter __s, ios_base& __f, _CharT __fill, const void* __val) const;
+};
+
+# ifdef _STLP_USE_TEMPLATE_EXPORT
+_STLP_EXPORT_TEMPLATE_CLASS num_put<char, ostreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_put<char, char*>;
+#  ifndef _STLP_NO_WCHAR_T
+_STLP_EXPORT_TEMPLATE_CLASS num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS num_put<wchar_t, wchar_t*>;
+#  endif /* _STLP_NO_WCHAR_T */
+# endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+template <class _Integer>
+char* _STLP_CALL
+__write_integer_backward(char* __buf, ios_base::fmtflags __flags, _Integer __x);
+
+void  _STLP_CALL __string_to_float(const string&, float&);
+void  _STLP_CALL __string_to_float(const string&, double&);
+extern void _STLP_CALL __write_float(string&, ios_base::fmtflags, int, double);
+# ifndef _STLP_NO_LONG_DOUBLE
+void  _STLP_CALL __string_to_float(const string&, long double&);
+extern void _STLP_CALL __write_float(string&, ios_base::fmtflags, int, long double);
+# endif
+
+#ifndef _STLP_NO_WCHAR_T
+extern wchar_t* _STLP_CALL __convert_float_buffer(const char*, const char*, wchar_t*, const ctype<wchar_t>&, wchar_t);
+#endif
+extern void _STLP_CALL __adjust_float_buffer(char*, char*, char);
+
+extern char* _STLP_CALL
+__write_integer(char* buf, ios_base::fmtflags flags, long x);
+
+extern ptrdiff_t _STLP_CALL __insert_grouping(char* first, char* last, const string&, char, char, char, int);
+#  ifndef _STLP_NO_WCHAR_T
+extern ptrdiff_t _STLP_CALL __insert_grouping(wchar_t*, wchar_t*, const string&, wchar_t, wchar_t, wchar_t, int);
+#  endif
+
+# endif
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_num_put() {
+  
+  num_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index = 14;
+  num_put<char, char*>::id._M_index = 15;
+  
+# ifndef _STLP_NO_WCHAR_T
+  num_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > ::id._M_index = 33;
+  num_put<wchar_t, wchar_t*>::id._M_index = 34;
+# endif
+  
+}
+ 
+# endif
+
+_STLP_END_NAMESPACE
+
+#  if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && ! defined (_STLP_LINK_TIME_INSTANTIATION)
+#   include <stl/_num_put.c>
+#  endif
+
+#endif /* _STLP_INTERNAL_NUMERIC_FACETS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_numeric.c b/src/STLport/stl/_numeric.c
new file mode 100644
index 0000000..f050112
--- /dev/null
+++ b/src/STLport/stl/_numeric.c
@@ -0,0 +1,104 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_NUMERIC_C
+#define _STLP_NUMERIC_C
+
+#ifndef _STLP_INTERNAL_NUMERIC_H
+# include <stl/_numeric.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _InputIterator, class _OutputIterator, class _Tp,
+          class _BinaryOperation>
+_OutputIterator 
+__partial_sum(_InputIterator __first, _InputIterator __last, 
+              _OutputIterator __result, _Tp*, _BinaryOperation __binary_op)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __result;
+  *__result = *__first;
+
+  _Tp __val = *__first;
+  while (++__first != __last) {
+    __val = __binary_op(__val, *__first);
+    *++__result = __val;
+  }
+  return ++__result;
+}
+
+template <class _InputIterator, class _OutputIterator, class _Tp, 
+          class _BinaryOperation>
+_OutputIterator
+__adjacent_difference(_InputIterator __first, _InputIterator __last, 
+                      _OutputIterator __result, _Tp*,
+                      _BinaryOperation __binary_op) {
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  if (__first == __last) return __result;
+  *__result = *__first;
+  _Tp __val = *__first;
+  while (++__first != __last) {
+    _Tp __tmp = *__first;
+    *++__result = __binary_op(__tmp, __val);
+    __val = __tmp;
+  }
+  return ++__result;
+}
+
+
+template <class _Tp, class _Integer, class _MonoidOperation>
+_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr) 
+{
+  _STLP_MPWFIX_TRY
+  if (__n == 0)
+    return __identity_element(__opr);
+  else {
+    while ((__n & 1) == 0) {
+      __n >>= 1;
+      __x = __opr(__x, __x);
+    }
+    _Tp __result = __x;
+	_STLP_MPWFIX_TRY
+    __n >>= 1;
+    while (__n != 0) {
+      __x = __opr(__x, __x);
+      if ((__n & 1) != 0)
+        __result = __opr(__result, __x);
+      __n >>= 1;
+    }
+    return __result;
+	_STLP_MPWFIX_CATCH
+  }
+  _STLP_MPWFIX_CATCH_ACTION(__x = _Tp())
+}
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_NUMERIC_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_numeric.h b/src/STLport/stl/_numeric.h
new file mode 100644
index 0000000..d58ac16
--- /dev/null
+++ b/src/STLport/stl/_numeric.h
@@ -0,0 +1,186 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+
+#ifndef _STLP_INTERNAL_NUMERIC_H
+#define _STLP_INTERNAL_NUMERIC_H
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function_base.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _InputIterator, class _Tp>
+_STLP_INLINE_LOOP
+_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp _Init)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    _Init = _Init + *__first;
+  return _Init;
+}
+
+template <class _InputIterator, class _Tp, class _BinaryOperation>
+_STLP_INLINE_LOOP
+_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp _Init,
+               _BinaryOperation __binary_op)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  for ( ; __first != __last; ++__first)
+    _Init = __binary_op(_Init, *__first);
+  return _Init;
+}
+
+template <class _InputIterator1, class _InputIterator2, class _Tp>
+_STLP_INLINE_LOOP
+_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
+                  _InputIterator2 __first2, _Tp _Init)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  for ( ; __first1 != __last1; ++__first1, ++__first2)
+    _Init = _Init + (*__first1 * *__first2);
+  return _Init;
+}
+
+template <class _InputIterator1, class _InputIterator2, class _Tp,
+          class _BinaryOperation1, class _BinaryOperation2>
+_STLP_INLINE_LOOP
+_Tp inner_product(_InputIterator1 __first1, _InputIterator1 __last1,
+                  _InputIterator2 __first2, _Tp _Init, 
+                  _BinaryOperation1 __binary_op1,
+                  _BinaryOperation2 __binary_op2)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first1, __last1))
+  for ( ; __first1 != __last1; ++__first1, ++__first2)
+    _Init = __binary_op1(_Init, __binary_op2(*__first1, *__first2));
+  return _Init;
+}
+
+template <class _InputIterator, class _OutputIterator, class _Tp,
+          class _BinaryOperation>
+_OutputIterator 
+__partial_sum(_InputIterator __first, _InputIterator __last, 
+              _OutputIterator __result, _Tp*, _BinaryOperation __binary_op);
+
+
+template <class _InputIterator, class _OutputIterator>
+inline _OutputIterator 
+partial_sum(_InputIterator __first, _InputIterator __last,
+            _OutputIterator __result) {
+  return __partial_sum(__first, __last, __result, _STLP_VALUE_TYPE(__first, _InputIterator),
+                       __plus(_STLP_VALUE_TYPE(__first, _InputIterator)));
+}
+
+template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
+inline _OutputIterator 
+partial_sum(_InputIterator __first, _InputIterator __last,
+            _OutputIterator __result, _BinaryOperation __binary_op) {
+  return __partial_sum(__first, __last, __result, _STLP_VALUE_TYPE(__first, _InputIterator), 
+                       __binary_op);
+}
+
+
+template <class _InputIterator, class _OutputIterator, class _Tp, 
+          class _BinaryOperation>
+_OutputIterator
+__adjacent_difference(_InputIterator __first, _InputIterator __last, 
+                      _OutputIterator __result, _Tp*,
+                      _BinaryOperation __binary_op);
+
+template <class _InputIterator, class _OutputIterator>
+inline _OutputIterator
+adjacent_difference(_InputIterator __first,
+                    _InputIterator __last, _OutputIterator __result) {
+  return __adjacent_difference(__first, __last, __result,
+                               _STLP_VALUE_TYPE(__first, _InputIterator),
+                               __minus(_STLP_VALUE_TYPE(__first, _InputIterator)));
+}
+
+template <class _InputIterator, class _OutputIterator, class _BinaryOperation>
+_OutputIterator 
+adjacent_difference(_InputIterator __first, _InputIterator __last,
+                    _OutputIterator __result, _BinaryOperation __binary_op) {
+  return __adjacent_difference(__first, __last, __result,
+                               _STLP_VALUE_TYPE(__first, _InputIterator),
+                               __binary_op);
+}
+
+template <class _Tp, class _Integer, class _MonoidOperation>
+_Tp __power(_Tp __x, _Integer __n, _MonoidOperation __opr);
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// Returns __x ** __n, where __n >= 0.  _Note that "multiplication"
+// is required to be associative, but not necessarily commutative.
+
+template <class _Tp, class _Integer>
+inline _Tp __power(_Tp __x, _Integer __n)
+{
+  return __power(__x, __n, multiplies<_Tp>());
+}
+
+// Alias for the internal name __power.  Note that power is an extension,
+// not part of the C++ standard.
+template <class _Tp, class _Integer, class _MonoidOperation>
+inline _Tp power(_Tp __x, _Integer __n, _MonoidOperation __opr) {
+  return __power(__x, __n, __opr);
+}
+
+
+template <class _Tp, class _Integer>
+inline _Tp power(_Tp __x, _Integer __n) {
+  return __power(__x, __n, multiplies<_Tp>());
+}
+
+// iota is not part of the C++ standard.  It is an extension.
+
+template <class _ForwardIterator, class _Tp>
+_STLP_INLINE_LOOP
+void 
+iota(_ForwardIterator __first, _ForwardIterator __last, _Tp __val)
+{
+  _STLP_DEBUG_CHECK(__check_range(__first, __last))
+  while (__first != __last)
+    *__first++ = __val++;
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_numeric.c>
+# endif
+
+#endif /* _STLP_INTERNAL_NUMERIC_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_numpunct.h b/src/STLport/stl/_numpunct.h
new file mode 100644
index 0000000..7f8ed50
--- /dev/null
+++ b/src/STLport/stl/_numpunct.h
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_NUMPUNCT_H
+#define _STLP_INTERNAL_NUMPUNCT_H
+
+#ifndef _STLP_IOS_BASE_H
+# include <stl/_ios_base.h>
+#endif
+
+# ifndef _STLP_C_LOCALE_H
+#  include <stl/c_locale.h>
+# endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// numpunct facets
+
+template <class _CharT> class numpunct {};
+template <class _CharT> class numpunct_byname {};
+template <class _Ch, class _InIt> class num_get;
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct<char> : public locale::facet
+{
+  friend class _Locale;
+# ifndef _STLP_NO_FRIEND_TEMPLATES
+  template <class _Ch, class _InIt> friend class num_get;
+# endif
+public:
+  typedef char               char_type;
+  typedef string             string_type;
+
+  explicit numpunct(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  char decimal_point() const { return do_decimal_point(); }
+  char thousands_sep() const { return do_thousands_sep(); }
+  string grouping() const { return do_grouping(); }
+  string truename() const { return do_truename(); }
+  string falsename() const { return do_falsename(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+# ifndef _STLP_NO_FRIEND_TEMPLATES
+protected:
+# endif
+  ~numpunct();
+
+  _STLP_STATIC_MEMBER_DECLSPEC static string  _M_truename;
+  _STLP_STATIC_MEMBER_DECLSPEC static string  _M_falsename;
+  _STLP_STATIC_MEMBER_DECLSPEC static string  _M_grouping;
+
+  virtual char do_decimal_point() const;
+  virtual char do_thousands_sep() const;
+  virtual string do_grouping() const;
+  virtual string do_truename() const;
+  virtual string do_falsename()  const;
+};
+
+# if ! defined (_STLP_NO_WCHAR_T)
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct<wchar_t> : public locale::facet
+{
+  friend class _Locale;
+public:
+  typedef wchar_t               char_type;
+  typedef wstring               string_type;
+
+  explicit numpunct(size_t __refs = 0) : _BaseFacet(__refs) {}
+
+  wchar_t decimal_point() const { return do_decimal_point(); }
+  wchar_t thousands_sep() const { return do_thousands_sep(); }
+  string grouping() const { return do_grouping(); }
+  wstring truename() const { return do_truename(); }
+  wstring falsename() const { return do_falsename(); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  _STLP_STATIC_MEMBER_DECLSPEC static wstring _M_truename;
+  _STLP_STATIC_MEMBER_DECLSPEC static wstring _M_falsename;
+  _STLP_STATIC_MEMBER_DECLSPEC static string _M_grouping;
+
+  ~numpunct();
+
+  virtual wchar_t do_decimal_point() const;
+  virtual wchar_t do_thousands_sep() const;
+  virtual string do_grouping() const;
+  virtual wstring do_truename() const;
+  virtual wstring do_falsename()  const;
+};
+
+# endif /* WCHAR_T */
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct_byname<char> : public numpunct<char> {
+public:
+  typedef char                char_type;
+  typedef string              string_type;
+
+  explicit numpunct_byname(const char* __name, size_t __refs = 0);
+
+protected:
+
+  ~numpunct_byname();
+
+  virtual char   do_decimal_point() const;
+  virtual char   do_thousands_sep() const;
+  virtual string do_grouping()      const;
+
+private:
+  _Locale_numeric* _M_numeric;
+};
+
+# ifndef _STLP_NO_WCHAR_T
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC numpunct_byname<wchar_t>: public numpunct<wchar_t> {
+public:
+  typedef wchar_t               char_type;
+  typedef wstring               string_type;
+
+  explicit numpunct_byname(const char* __name, size_t __refs = 0);
+
+protected:
+
+  ~numpunct_byname();
+
+  virtual wchar_t   do_decimal_point() const;
+  virtual wchar_t   do_thousands_sep() const;
+  virtual string do_grouping() const;
+
+private:
+  _Locale_numeric* _M_numeric;
+};
+
+# endif /* WCHAR_T */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_NUMPUNCT_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_ostream.c b/src/STLport/stl/_ostream.c
new file mode 100644
index 0000000..da75a0b
--- /dev/null
+++ b/src/STLport/stl/_ostream.c
@@ -0,0 +1,382 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_OSTREAM_C
+#define _STLP_OSTREAM_C
+
+
+#ifndef _STLP_INTERNAL_OSTREAM_H
+# include <stl/_ostream.h>
+#endif
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#if !defined (_STLP_INTERNAL_NUM_PUT_H)
+# include <stl/_num_put.h>            // For basic_streambuf and iterators
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+// Helper functions for istream<>::sentry constructor.
+template <class _CharT, class _Traits>
+bool
+_M_init(basic_ostream<_CharT, _Traits>& __str) {
+  if (__str.good()) {
+    // boris : check if this is needed !
+    if (!__str.rdbuf())
+      __str.setstate(ios_base::badbit);
+    if (__str.tie())
+      __str.tie()->flush();
+    return __str.good();
+  } else
+    return false;
+}
+
+//----------------------------------------------------------------------
+// Definitions of non-inline member functions.
+
+// Constructor, destructor
+
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>
+  ::basic_ostream(basic_streambuf<_CharT, _Traits>* __buf)
+    : basic_ios<_CharT, _Traits>() 
+{
+  this->init(__buf);
+}
+
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>::~basic_ostream()
+{}
+
+// Output directly from a streambuf.
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>& 
+basic_ostream<_CharT, _Traits>::operator<<(basic_streambuf<_CharT, _Traits>* __from)
+{
+  sentry __sentry(*this);
+  if (__sentry) {
+    if (__from) {
+      bool __any_inserted = __from->gptr() != __from->egptr()
+        ? this->_M_copy_buffered(__from, this->rdbuf())
+        : this->_M_copy_unbuffered(__from, this->rdbuf());
+      if (!__any_inserted)
+        this->setstate(ios_base::failbit);
+    }
+    else
+      this->setstate(ios_base::badbit);
+  }
+
+  return *this;
+}
+
+// Helper functions for the streambuf version of operator<<.  The
+// exception-handling code is complicated because exceptions thrown
+// while extracting characters are treated differently than exceptions
+// thrown while inserting characters.
+
+template <class _CharT, class _Traits>
+bool basic_ostream<_CharT, _Traits>
+  ::_M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
+                     basic_streambuf<_CharT, _Traits>* __to)
+{
+  bool __any_inserted = false;
+
+  while (__from->egptr() != __from->gptr()) {
+    const ptrdiff_t __avail = __from->egptr() - __from->gptr();
+
+    streamsize __nwritten;
+    _STLP_TRY {
+      __nwritten = __to->sputn(__from->gptr(), __avail);
+      __from->gbump((int)__nwritten);
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+      return __any_inserted;
+    }
+
+    if (__nwritten == __avail) {
+      _STLP_TRY {
+        if (this->_S_eof(__from->sgetc()))
+          return true;
+        else
+          __any_inserted = true;
+      }
+      _STLP_CATCH_ALL {
+        this->_M_handle_exception(ios_base::failbit);
+        return false;
+      }
+    }
+
+    else if (__nwritten != 0)
+      return true;
+
+    else
+      return __any_inserted;
+  }
+
+  // No characters are in the buffer, but we aren't at EOF.  Switch to
+  // unbuffered mode.
+  return __any_inserted || this->_M_copy_unbuffered(__from, __to);
+}
+
+template <class _CharT, class _Traits>
+bool basic_ostream<_CharT, _Traits>
+  ::_M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
+                       basic_streambuf<_CharT, _Traits>* __to)
+{
+  bool __any_inserted = false;
+
+  while (true) {
+    int_type __c;
+    _STLP_TRY {
+      __c = __from->sbumpc();
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::failbit);
+      return __any_inserted;
+    }
+
+    if (this->_S_eof(__c))
+      return __any_inserted;
+
+    else {
+      int_type __tmp;
+      _STLP_TRY {
+        __tmp = __to->sputc(__c);
+      }
+      _STLP_CATCH_ALL {
+        this->_M_handle_exception(ios_base::badbit);
+        return __any_inserted;
+      }
+
+      if (this->_S_eof(__tmp)) {
+        _STLP_TRY {
+          /* __tmp = */ __from->sputbackc(__c);
+        }
+        _STLP_CATCH_ALL {
+          this->_M_handle_exception(ios_base::badbit);
+          return __any_inserted;
+        }
+      }
+      else
+        __any_inserted = true;
+    }
+  }
+}
+
+// Helper function for numeric output.
+
+template <class _CharT, class _Traits, class _Number>
+basic_ostream<_CharT, _Traits>&  _STLP_CALL
+_M_put_num(basic_ostream<_CharT, _Traits>& __os, _Number __x)
+{
+  typedef typename basic_ostream<_CharT, _Traits>::sentry _Sentry;
+  _Sentry __sentry(__os);
+  bool __failed = true;
+
+  if (__sentry) {
+    _STLP_TRY {
+      typedef num_put<_CharT, ostreambuf_iterator<_CharT, _Traits> > _NumPut;      
+      __failed = (use_facet<_NumPut>(__os.getloc())).put(
+                                                         ostreambuf_iterator<_CharT, _Traits>(__os.rdbuf()), 
+                                                         __os, __os.fill(),
+                                                         __x).failed();
+    }
+    _STLP_CATCH_ALL {
+      __os._M_handle_exception(ios_base::badbit);
+    }
+  }
+  if (__failed)
+    __os.setstate(ios_base::badbit); 
+  return __os;
+}
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)  && defined (__BUILDING_STLPORT)
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >& _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, unsigned long);
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >&  _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, long);
+#  if defined (_STLP_LONG_LONG)
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >&  _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, unsigned _STLP_LONG_LONG);
+_STLP_EXPORT_TEMPLATE _STLP_DECLSPEC basic_ostream<char, char_traits<char> >&  _STLP_CALL
+_M_put_num(basic_ostream<char, char_traits<char> >&, _STLP_LONG_LONG );
+#  endif
+# endif
+
+template <class _CharT, class _Traits>
+void basic_ostream<_CharT, _Traits>::_M_put_char(_CharT __c)
+{
+  sentry __sentry(*this);
+  if (__sentry) {
+    bool __failed = true;
+    _STLP_TRY {
+      streamsize __npad = this->width() > 0 ? this->width() - 1 : 0;
+      //      if (__npad <= 1)
+      if (__npad == 0)
+        __failed = this->_S_eof(this->rdbuf()->sputc(__c));
+      else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
+        __failed = this->_S_eof(this->rdbuf()->sputc(__c));
+        __failed = __failed || 
+                   this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+      }
+      else {
+        __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+        __failed = __failed || this->_S_eof(this->rdbuf()->sputc(__c));
+      }
+
+      this->width(0);
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+
+    if (__failed)
+      this->setstate(ios_base::badbit);
+  }
+}
+
+template <class _CharT, class _Traits>
+void basic_ostream<_CharT, _Traits>::_M_put_nowiden(const _CharT* __s)
+{
+  sentry __sentry(*this);
+  if (__sentry) {
+    bool __failed = true;
+    streamsize __n = _Traits::length(__s);
+    streamsize __npad = this->width() > __n ? this->width() - __n : 0;
+
+    _STLP_TRY {
+      if (__npad == 0)
+        __failed = this->rdbuf()->sputn(__s, __n) != __n;
+      else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
+        __failed = this->rdbuf()->sputn(__s, __n) != __n;
+        __failed = __failed || 
+                   this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+      }
+      else {
+        __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+        __failed = __failed || this->rdbuf()->sputn(__s, __n) != __n;
+      }
+
+      this->width(0);
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+
+    if (__failed)
+      this->setstate(ios_base::failbit);
+  }
+}
+
+template <class _CharT, class _Traits>
+void basic_ostream<_CharT, _Traits>::_M_put_widen(const char* __s)
+{
+  sentry __sentry(*this);
+  if (__sentry) {
+    bool __failed = true;
+    streamsize __n = char_traits<char>::length(__s);
+    streamsize __npad = this->width() > __n ? this->width() - __n : 0;
+
+    _STLP_TRY {
+      if (__npad == 0)
+        __failed = !this->_M_put_widen_aux(__s, __n);
+      else if ((this->flags() & ios_base::adjustfield) == ios_base::left) {
+        __failed = !this->_M_put_widen_aux(__s, __n);
+        __failed = __failed || 
+                   this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+      }
+      else {
+        __failed = this->rdbuf()->_M_sputnc(this->fill(), __npad) != __npad;
+        __failed = __failed || !this->_M_put_widen_aux(__s, __n);
+      }
+
+      this->width(0);
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+
+    if (__failed)
+      this->setstate(ios_base::failbit);
+  }
+}
+
+template <class _CharT, class _Traits>
+bool basic_ostream<_CharT, _Traits>::_M_put_widen_aux(const char* __s,
+                                                      streamsize __n)
+{
+  basic_streambuf<_CharT, _Traits>* __buf = this->rdbuf();
+
+  for ( ; __n > 0 ; --__n)
+    if (this->_S_eof(__buf->sputc(this->widen(*__s++))))
+      return false;
+  return true;
+}
+
+// Unformatted output of a single character.
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>&
+basic_ostream<_CharT, _Traits>::put(char_type __c)
+{
+  sentry __sentry(*this);
+  bool __failed = true;
+
+  if (__sentry) {
+    _STLP_TRY {
+      __failed = this->_S_eof(this->rdbuf()->sputc(__c));
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+  }
+
+  if (__failed)
+    this->setstate(ios_base::badbit);
+
+  return *this;
+}
+
+// Unformatted output of a single character.
+template <class _CharT, class _Traits>
+basic_ostream<_CharT, _Traits>&
+basic_ostream<_CharT, _Traits>::write(const char_type* __s, streamsize __n)
+{
+  sentry __sentry(*this);
+  bool __failed = true;
+
+  if (__sentry) {
+    _STLP_TRY {
+      __failed = this->rdbuf()->sputn(__s, __n) != __n;
+    }
+    _STLP_CATCH_ALL {
+      this->_M_handle_exception(ios_base::badbit);
+    }
+  }
+
+  if (__failed)
+    this->setstate(ios_base::badbit);
+
+  return *this;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+
+#endif /* _STLP_OSTREAM_C */
diff --git a/src/STLport/stl/_ostream.h b/src/STLport/stl/_ostream.h
new file mode 100644
index 0000000..91e2541
--- /dev/null
+++ b/src/STLport/stl/_ostream.h
@@ -0,0 +1,356 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+
+#ifndef _STLP_INTERNAL_OSTREAM_H
+#define _STLP_INTERNAL_OSTREAM_H
+
+#ifndef _STLP_INTERNAL_IOS_H
+# include <stl/_ios.h>                  // For basic_ios<>.  Includes <iosfwd>.
+#endif
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Number> 
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+_M_put_num(basic_ostream<_CharT, _Traits>& __os, _Number __x);
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+template <class _CharT, class _Traits>
+class _Osentry;
+# endif
+
+template <class _CharT, class _Traits>
+bool
+_M_init(basic_ostream<_CharT, _Traits>& __str);
+
+//----------------------------------------------------------------------
+// class basic_ostream<>
+
+template <class _CharT, class _Traits>
+class basic_ostream : virtual public basic_ios<_CharT, _Traits>
+{
+  typedef basic_ostream<_CharT, _Traits> _Self;
+  
+public:                         // Types
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+  typedef basic_ios<_CharT, _Traits> _Basic_ios;
+
+public:                         // Constructor and destructor.
+  explicit basic_ostream(basic_streambuf<_CharT, _Traits>* __buf);
+  ~basic_ostream();
+
+public:                         // Hooks for manipulators.
+  typedef basic_ios<_CharT, _Traits>& (_STLP_CALL *__ios_fn)(basic_ios<_CharT, _Traits>&);
+  typedef ios_base& (_STLP_CALL *__ios_base_fn)(ios_base&);
+  typedef _Self& (_STLP_CALL *__ostream_fn)(_Self&);
+  _Self& operator<< (__ostream_fn __f) { return __f(*this); }
+  _Self & operator<< (__ios_base_fn __f) { __f(*this); return *this; }
+  _Self& operator<< (__ios_fn __ff) { __ff(*this); return *this; }
+
+private:
+  bool _M_copy_buffered(basic_streambuf<_CharT, _Traits>* __from,
+                        basic_streambuf<_CharT, _Traits>* __to);
+  bool _M_copy_unbuffered(basic_streambuf<_CharT, _Traits>* __from,
+                          basic_streambuf<_CharT, _Traits>* __to);
+
+public:
+  void _M_put_char(_CharT __c);
+
+  void _M_put_nowiden(const _CharT* __s);
+  void _M_put_widen(const char* __s);
+  bool _M_put_widen_aux(const char* __s, streamsize __n);
+
+public:                         // Unformatted output.
+  _Self& put(char_type __c);
+  _Self& write(const char_type* __s, streamsize __n);
+
+public:                         // Formatted output.
+  // Formatted output from a streambuf.
+  _Self& operator<<(basic_streambuf<_CharT, _Traits>* __buf);
+# ifndef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+  // this is needed for compiling with option char = unsigned
+  _Self& operator<<(unsigned char __x) { _M_put_char(__x); return *this; }
+# endif
+  _Self& operator<<(short __x) { return _M_put_num(*this,  __STATIC_CAST(long,__x)); }
+  _Self& operator<<(unsigned short __x) { return _M_put_num(*this,  __STATIC_CAST(unsigned long,__x)); }
+  _Self& operator<<(int __x) { return _M_put_num(*this,  __STATIC_CAST(long,__x)); }
+  _Self& operator<<(unsigned int __x) { return _M_put_num(*this,  __STATIC_CAST(unsigned long,__x)); }
+  _Self& operator<<(long __x) { return _M_put_num(*this,  __x); }
+  _Self& operator<<(unsigned long __x) { return _M_put_num(*this,  __x); }
+#ifdef _STLP_LONG_LONG
+  _Self& operator<< (_STLP_LONG_LONG __x)     { return _M_put_num(*this,  __x); }
+  _Self& operator<< (unsigned _STLP_LONG_LONG __x) { return _M_put_num(*this,  __x); }
+#endif 
+  _Self& operator<<(float __x)
+    { return _M_put_num(*this,  __STATIC_CAST(double,__x)); }
+  _Self& operator<<(double __x) { return _M_put_num(*this,  __x); }
+# ifndef _STLP_NO_LONG_DOUBLE
+  _Self& operator<<(long double __x) { return _M_put_num(*this,  __x); }
+# endif
+  _Self& operator<<(const void* __x) { return _M_put_num(*this,  __x); }
+# ifndef _STLP_NO_BOOL
+  _Self& operator<<(bool __x) { return _M_put_num(*this,  __x); }
+# endif
+
+public:                         // Buffer positioning and manipulation.
+  _Self& flush() {
+    if (this->rdbuf())
+      if (this->rdbuf()->pubsync() == -1)
+        this->setstate(ios_base::badbit);
+    return *this;
+  }
+
+  pos_type tellp() {
+    return this->rdbuf() && !this->fail()
+      ? this->rdbuf()->pubseekoff(0, ios_base::cur, ios_base::out)
+      : pos_type(-1);
+  }
+
+  _Self& seekp(pos_type __pos) {
+    if (this->rdbuf() && !this->fail())
+      this->rdbuf()->pubseekpos(__pos, ios_base::out);
+    return *this;
+  }
+
+  _Self& seekp(off_type __off, ios_base::seekdir __dir) {
+    if (this->rdbuf() && !this->fail())
+      this->rdbuf()->pubseekoff(__off, __dir, ios_base::out);
+    return *this;
+  }
+
+#if defined (_STLP_USE_TEMPLATE_EXPORT)
+  // If we are using DLL specs, we have not to use inner classes
+  // end class declaration here
+  typedef _Osentry<_CharT, _Traits>  sentry;
+};
+#  define sentry _Osentry
+  template <class _CharT, class _Traits>
+  class _Osentry {
+    typedef _Osentry<_CharT, _Traits> _Self;
+# else
+    class sentry {
+      typedef sentry _Self;
+# endif
+    private:
+      basic_ostream<_CharT, _Traits>& _M_str;
+      //      basic_streambuf<_CharT, _Traits>* _M_buf;
+      bool _M_ok;
+    public:
+      explicit sentry(basic_ostream<_CharT, _Traits>& __str)
+        : _M_str(__str), /* _M_buf(__str.rdbuf()), */ _M_ok(_M_init(__str))
+      {
+      }
+      
+      ~sentry() {
+        if (_M_str.flags() & ios_base::unitbuf)
+# ifndef _STLP_INCOMPLETE_EXCEPTION_HEADER 
+          if (!_STLP_VENDOR_EXCEPT_STD::uncaught_exception())
+# endif
+            _M_str.flush();
+      }
+
+      operator bool() const { return _M_ok; }
+    private:                        // Disable assignment and copy constructor.
+      sentry(const _Self& __s) : _M_str (__s._M_str) {};
+      void operator=(const _Self&) {};
+    };
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+#  undef sentry
+# else
+  // close basic_ostream class definition here    
+};
+# endif
+  
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<char, char_traits<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS _Osentry<char, char_traits<char> >;
+#  if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostream<wchar_t, char_traits<wchar_t> >;
+_STLP_EXPORT_TEMPLATE_CLASS _Osentry<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+template <class _CharT, class _Traits>
+inline basic_streambuf<_CharT, _Traits>* _STLP_CALL 
+_M_get_ostreambuf(basic_ostream<_CharT, _Traits>& __St) 
+{
+  return __St.rdbuf();
+}
+
+// Non-member functions.
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, _CharT __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const _CharT* __s) {
+  __os._M_put_nowiden(__s);
+  return __os;
+}
+
+# ifdef _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER
+// some specializations
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, char __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, signed char __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, unsigned char __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, const char* __s) {
+  __os._M_put_nowiden(__s);
+  return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >& _STLP_CALL
+operator<<(basic_ostream<char, char_traits<char> >& __os, const signed char* __s) {
+  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+  return __os;
+}
+
+inline basic_ostream<char, char_traits<char> >&
+operator<<(basic_ostream<char, char_traits<char> >& __os, const unsigned char* __s) {
+  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+  return __os;
+}
+
+# else
+
+// also for compilers who might use that
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, char __c) {
+  __os._M_put_char(__os.widen(__c));
+  return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, char __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, signed char __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, unsigned char __c) {
+  __os._M_put_char(__c);
+  return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, const char* __s) {
+  __os._M_put_widen(__s);
+  return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, const char* __s) {
+  __os._M_put_nowiden(__s);
+  return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>& _STLP_CALL
+operator<<(basic_ostream<char, _Traits>& __os, const signed char* __s) {
+  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+  return __os;
+}
+
+template <class _Traits>
+inline basic_ostream<char, _Traits>&
+operator<<(basic_ostream<char, _Traits>& __os, const unsigned char* __s) {
+  __os._M_put_nowiden(__REINTERPRET_CAST(const char*,__s));
+  return __os;
+}
+# endif /* _STLP_NO_FUNCTION_TMPL_PARTIAL_ORDER */
+
+//----------------------------------------------------------------------
+// basic_ostream manipulators.
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+endl(basic_ostream<_CharT, _Traits>& __os) {
+  __os.put(__os.widen('\n'));
+  __os.flush();
+  return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+ends(basic_ostream<_CharT, _Traits>& __os) {
+  __os.put(_STLP_DEFAULT_CONSTRUCTED(_CharT));
+  return __os;
+}
+
+template <class _CharT, class _Traits>
+inline basic_ostream<_CharT, _Traits>& _STLP_CALL
+flush(basic_ostream<_CharT, _Traits>& __os) {
+  __os.flush();
+  return __os;
+}
+
+_STLP_END_NAMESPACE
+
+#  undef _STLP_MANIP_INLINE
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_ostream.c>
+# endif
+
+#endif /* _STLP_INTERNAL_OSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ostreambuf_iterator.h b/src/STLport/stl/_ostreambuf_iterator.h
new file mode 100644
index 0000000..096f428
--- /dev/null
+++ b/src/STLport/stl/_ostreambuf_iterator.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+#define _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits>
+extern basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_ostreambuf(basic_ostream<_CharT, _Traits>& ) ;
+
+// The default template argument is declared in iosfwd
+template<class _CharT, class _Traits>
+class ostreambuf_iterator
+{
+public:
+  typedef _CharT                           char_type;
+  typedef _Traits                          traits_type;
+  typedef typename _Traits::int_type       int_type;
+  typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+  typedef basic_ostream<_CharT, _Traits>   ostream_type;
+
+  typedef output_iterator_tag              iterator_category;
+  typedef void                             value_type;
+  typedef void                             difference_type;
+  typedef void                             pointer;
+  typedef void                             reference;
+
+public:
+  ostreambuf_iterator(streambuf_type* __buf) _STLP_NOTHROW : _M_buf(__buf), _M_ok(__buf!=0) {}
+  //  ostreambuf_iterator(ostream_type& __o) _STLP_NOTHROW : _M_buf(_M_get_ostreambuf(__o)), _M_ok(_M_buf != 0) {}
+  inline ostreambuf_iterator(ostream_type& __o) _STLP_NOTHROW;
+
+  ostreambuf_iterator<_CharT, _Traits>& operator=(char_type __c) {
+    _M_ok = _M_ok && !traits_type::eq_int_type(_M_buf->sputc(__c),
+                                               traits_type::eof());
+    return *this;
+  }    
+  
+  ostreambuf_iterator<_CharT, _Traits>& operator*()     { return *this; }
+  ostreambuf_iterator<_CharT, _Traits>& operator++()    { return *this; }
+  ostreambuf_iterator<_CharT, _Traits>& operator++(int) { return *this; }
+
+  bool failed() const { return !_M_ok; }
+
+private:
+  streambuf_type* _M_buf;
+  bool _M_ok;
+};
+
+template <class _CharT, class _Traits>
+inline ostreambuf_iterator<_CharT, _Traits>::ostreambuf_iterator(basic_ostream<_CharT, _Traits>& __o) _STLP_NOTHROW : _M_buf(_M_get_ostreambuf(__o)), _M_ok(_M_buf != 0) {}
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS ostreambuf_iterator<char, char_traits<char> >;
+#  if defined (INSTANTIATE_WIDE_STREAMS)
+_STLP_EXPORT_TEMPLATE_CLASS ostreambuf_iterator<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _CharT, class _Traits>
+inline output_iterator_tag _STLP_CALL 
+iterator_category(const ostreambuf_iterator<_CharT, _Traits>&) { return output_iterator_tag(); }
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_pair.h b/src/STLport/stl/_pair.h
new file mode 100644
index 0000000..5888a18
--- /dev/null
+++ b/src/STLport/stl/_pair.h
@@ -0,0 +1,161 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_PAIR_H
+#define _STLP_INTERNAL_PAIR_H
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _T1, class _T2>
+struct pair {
+  typedef _T1 first_type;
+  typedef _T2 second_type;
+
+  _T1 first;
+  _T2 second;
+# if defined (_STLP_CONST_CONSTRUCTOR_BUG)
+  pair() {}
+# else
+  pair() : first(_T1()), second(_T2()) {}
+# endif
+  pair(const _T1& __a, const _T2& __b) : first(__a), second(__b) {}
+
+#if defined (_STLP_MEMBER_TEMPLATES) && !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+  template <class _U1, class _U2>
+  pair(const pair<_U1, _U2>& __p) : first(__p.first), second(__p.second) {}
+
+  pair(const pair<_T1,_T2>& __o) : first(__o.first), second(__o.second) {}
+#endif
+  __TRIVIAL_DESTRUCTOR(pair)
+};
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+{ 
+  return __x.first == __y.first && __x.second == __y.second; 
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
+{ 
+  return __x.first < __y.first || 
+         (!(__y.first < __x.first) && __x.second < __y.second); 
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return !(__x == __y);
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return __y < __x;
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return !(__y < __x);
+}
+
+template <class _T1, class _T2>
+inline bool _STLP_CALL operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+
+#if defined(_STLP_FUNCTION_TMPL_PARTIAL_ORDER) && ! defined (_STLP_NO_EXTENSIONS) && ! defined (__BORLANDC__) && ! defined (__DMC__)
+template <class _T1, class _T2, int _Sz>
+inline pair<_T1, _T2 const*> make_pair(_T1 const& __x,
+                                       _T2 const (&__y)[_Sz])
+{
+  return pair<_T1, _T2 const*>(__x, static_cast<_T2 const*>(__y));
+}
+
+template <class _T1, class _T2, int _Sz>
+inline pair<_T1 const*, _T2> make_pair(_T1 const (&__x)[_Sz],
+                                       _T2 const& __y)
+{
+  return pair<_T1 const*, _T2>(static_cast<_T1 const*>(__x), __y);
+}
+
+template <class _T1, class _T2, int _Sz1, int _Sz2>
+inline pair<_T1 const*, _T2 const*> make_pair(_T1 const (&__x)[_Sz1],
+                                              _T2 const (&__y)[_Sz2])
+{
+  return pair<_T1 const*, _T2 const*>(static_cast<_T1 const*>(__x),
+                                      static_cast<_T2 const*>(__y));
+}
+#endif
+
+template <class _T1, class _T2>
+inline pair<_T1, _T2> _STLP_CALL make_pair(const _T1& __x, const _T2& __y)
+{
+  return pair<_T1, _T2>(__x, __y);
+}
+
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_USE_NAMESPACES) || ! defined (_STLP_USE_SEPARATE_RELOPS_NAMESPACE) 
+_STLP_BEGIN_RELOPS_NAMESPACE
+
+template <class _Tp>
+inline bool _STLP_CALL operator!=(const _Tp& __x, const _Tp& __y) {
+  return !(__x == __y);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator>(const _Tp& __x, const _Tp& __y) {
+  return __y < __x;
+}
+
+template <class _Tp>
+inline bool _STLP_CALL operator<=(const _Tp& __x, const _Tp& __y) {
+  return !(__y < __x);
+}
+
+template <class _Tp>
+inline bool _STLP_CALL  operator>=(const _Tp& __x, const _Tp& __y) {
+  return !(__x < __y);
+}
+
+_STLP_END_RELOPS_NAMESPACE
+
+# endif
+
+#endif /* _STLP_INTERNAL_PAIR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_prolog.h b/src/STLport/stl/_prolog.h
new file mode 100644
index 0000000..c545322
--- /dev/null
+++ b/src/STLport/stl/_prolog.h
@@ -0,0 +1,17 @@
+/* NOTE : this header has no guards and is MEANT for multiple inclusion !
+ * If you are using "header protection" option with your compiler,
+ * please also find #pragma which disables it and put it here, to
+ * allow reentrancy of this header.
+ */
+/* We undef "std" on entry , as STLport headers may include native ones. */
+# undef std
+
+# ifndef _STLP_CONFIG_H
+#  include <stl/_config.h>
+# endif
+
+/* If the platform provides any specific prolog actions,
+ * like #pragmas, do include platform-specific prolog file */
+# if defined (_STLP_HAS_SPECIFIC_PROLOG_EPILOG)
+#  include <config/_prolog.h>
+# endif
diff --git a/src/STLport/stl/_pthread_alloc.c b/src/STLport/stl/_pthread_alloc.c
new file mode 100644
index 0000000..5d64b6b
--- /dev/null
+++ b/src/STLport/stl/_pthread_alloc.c
@@ -0,0 +1,262 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_PTHREAD_ALLOC_C
+#define _STLP_PTHREAD_ALLOC_C
+
+#ifdef __WATCOMC__
+#pragma warning 13 9
+#pragma warning 367 9
+#pragma warning 368 9
+#endif
+
+#ifndef _STLP_PTHREAD_ALLOC_H
+# include <stl/_pthread_alloc.h>
+#endif
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+# include <cerrno>
+
+_STLP_BEGIN_NAMESPACE
+
+template <size_t _Max_size>
+void _Pthread_alloc<_Max_size>::_S_destructor(void * __instance)
+{
+    _M_lock __lock_instance;	// Need to acquire lock here.
+    _Pthread_alloc_per_thread_state<_Max_size>* __s =
+        (_Pthread_alloc_per_thread_state<_Max_size> *)__instance;
+    __s -> __next = _S_free_per_thread_states;
+    _S_free_per_thread_states = __s;
+}
+
+template <size_t _Max_size>
+_Pthread_alloc_per_thread_state<_Max_size> *
+_Pthread_alloc<_Max_size>::_S_new_per_thread_state()
+{    
+    /* lock already held here.	*/
+    if (0 != _S_free_per_thread_states) {
+        _Pthread_alloc_per_thread_state<_Max_size> *__result =
+					_S_free_per_thread_states;
+        _S_free_per_thread_states = _S_free_per_thread_states -> __next;
+        return __result;
+    } else {
+        return _STLP_NEW _Pthread_alloc_per_thread_state<_Max_size>;
+    }
+}
+
+template <size_t _Max_size>
+_Pthread_alloc_per_thread_state<_Max_size> *
+_Pthread_alloc<_Max_size>::_S_get_per_thread_state()
+{
+
+    int __ret_code;
+    __state_type* __result;
+    
+    if (_S_key_initialized && (__result = (__state_type*) pthread_getspecific(_S_key)))
+      return __result;
+    
+    /*REFERENCED*/
+    _M_lock __lock_instance;	// Need to acquire lock here.
+    if (!_S_key_initialized) {
+      if (pthread_key_create(&_S_key, _S_destructor)) {
+	__THROW_BAD_ALLOC;  // failed
+      }
+      _S_key_initialized = true;
+    }
+
+    __result = _S_new_per_thread_state();
+    __ret_code = pthread_setspecific(_S_key, __result);
+    if (__ret_code) {
+      if (__ret_code == ENOMEM) {
+	__THROW_BAD_ALLOC;
+      } else {
+	// EINVAL
+	_STLP_ABORT();
+      }
+    }
+    return __result;
+}
+
+/* We allocate memory in large chunks in order to avoid fragmenting     */
+/* the malloc heap too much.                                            */
+/* We assume that size is properly aligned.                             */
+template <size_t _Max_size>
+char *_Pthread_alloc<_Max_size>
+::_S_chunk_alloc(size_t __p_size, size_t &__nobjs)
+{
+  {
+    char * __result;
+    size_t __total_bytes;
+    size_t __bytes_left;
+    /*REFERENCED*/
+    _M_lock __lock_instance;         // Acquire lock for this routine
+
+    __total_bytes = __p_size * __nobjs;
+    __bytes_left = _S_end_free - _S_start_free;
+    if (__bytes_left >= __total_bytes) {
+        __result = _S_start_free;
+        _S_start_free += __total_bytes;
+        return(__result);
+    } else if (__bytes_left >= __p_size) {
+        __nobjs = __bytes_left/__p_size;
+        __total_bytes = __p_size * __nobjs;
+        __result = _S_start_free;
+        _S_start_free += __total_bytes;
+        return(__result);
+    } else {
+        size_t __bytes_to_get =
+		2 * __total_bytes + _S_round_up(_S_heap_size >> 4);
+        // Try to make use of the left-over piece.
+        if (__bytes_left > 0) {
+            _Pthread_alloc_per_thread_state<_Max_size>* __a = 
+                (_Pthread_alloc_per_thread_state<_Max_size>*)
+			pthread_getspecific(_S_key);
+            __obj * volatile * __my_free_list =
+                        __a->__free_list + _S_freelist_index(__bytes_left);
+
+            ((__obj *)_S_start_free) -> __free_list_link = *__my_free_list;
+            *__my_free_list = (__obj *)_S_start_free;
+        }
+#       ifdef _SGI_SOURCE
+          // Try to get memory that's aligned on something like a
+          // cache line boundary, so as to avoid parceling out
+          // parts of the same line to different threads and thus
+          // possibly different processors.
+          {
+            const int __cache_line_size = 128;  // probable upper bound
+            __bytes_to_get &= ~(__cache_line_size-1);
+            _S_start_free = (char *)memalign(__cache_line_size, __bytes_to_get); 
+            if (0 == _S_start_free) {
+              _S_start_free = (char *)__malloc_alloc<0>::allocate(__bytes_to_get);
+            }
+          }
+#       else  /* !SGI_SOURCE */
+          _S_start_free = (char *)__malloc_alloc<0>::allocate(__bytes_to_get);
+#       endif
+        _S_heap_size += __bytes_to_get;
+        _S_end_free = _S_start_free + __bytes_to_get;
+    }
+  }
+  // lock is released here
+  return(_S_chunk_alloc(__p_size, __nobjs));
+}
+
+
+/* Returns an object of size n, and optionally adds to size n free list.*/
+/* We assume that n is properly aligned.                                */
+/* We hold the allocation lock.                                         */
+template <size_t _Max_size>
+void *_Pthread_alloc_per_thread_state<_Max_size>
+::_M_refill(size_t __n)
+{
+    size_t __nobjs = 128;
+    char * __chunk =
+	_Pthread_alloc<_Max_size>::_S_chunk_alloc(__n, __nobjs);
+    __obj * volatile * __my_free_list;
+    __obj * __result;
+    __obj * __current_obj, * __next_obj;
+    int __i;
+
+    if (1 == __nobjs)  {
+        return(__chunk);
+    }
+    __my_free_list = __free_list
+		 + _Pthread_alloc<_Max_size>::_S_freelist_index(__n);
+
+    /* Build free list in chunk */
+      __result = (__obj *)__chunk;
+      *__my_free_list = __next_obj = (__obj *)(__chunk + __n);
+      for (__i = 1; ; __i++) {
+        __current_obj = __next_obj;
+        __next_obj = (__obj *)((char *)__next_obj + __n);
+        if (__nobjs - 1 == __i) {
+            __current_obj -> __free_list_link = 0;
+            break;
+        } else {
+            __current_obj -> __free_list_link = __next_obj;
+        }
+      }
+    return(__result);
+}
+
+template <size_t _Max_size>
+void *_Pthread_alloc<_Max_size>
+::reallocate(void *__p, size_t __old_sz, size_t __new_sz)
+{
+    void * __result;
+    size_t __copy_sz;
+
+    if (__old_sz > _Max_size
+	&& __new_sz > _Max_size) {
+        return(realloc(__p, __new_sz));
+    }
+    if (_S_round_up(__old_sz) == _S_round_up(__new_sz)) return(__p);
+    __result = allocate(__new_sz);
+    __copy_sz = __new_sz > __old_sz? __old_sz : __new_sz;
+    memcpy(__result, __p, __copy_sz);
+    deallocate(__p, __old_sz);
+    return(__result);
+}
+
+#if defined (_STLP_STATIC_TEMPLATE_DATA) && (_STLP_STATIC_TEMPLATE_DATA > 0)
+
+template <size_t _Max_size>
+_Pthread_alloc_per_thread_state<_Max_size> * _Pthread_alloc<_Max_size>::_S_free_per_thread_states = 0;
+
+template <size_t _Max_size>
+pthread_key_t _Pthread_alloc<_Max_size>::_S_key =0;
+
+template <size_t _Max_size>
+bool _Pthread_alloc<_Max_size>::_S_key_initialized = false;
+
+template <size_t _Max_size>
+_STLP_mutex_base _Pthread_alloc<_Max_size>::_S_chunk_allocator_lock _STLP_MUTEX_INITIALIZER;
+
+template <size_t _Max_size>
+char *_Pthread_alloc<_Max_size>::_S_start_free = 0;
+
+template <size_t _Max_size>
+char *_Pthread_alloc<_Max_size>::_S_end_free = 0;
+
+template <size_t _Max_size>
+size_t _Pthread_alloc<_Max_size>::_S_heap_size = 0;
+
+ # else
+ 
+ __DECLARE_INSTANCE(template <size_t _Max_size> _Pthread_alloc_per_thread_state<_Max_size> *, _Pthread_alloc<_Max_size>::_S_free_per_thread_states, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> pthread_key_t, _Pthread_alloc<_Max_size>::_S_key, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> bool, _Pthread_alloc<_Max_size>::_S_key_initialized, = false);
+ __DECLARE_INSTANCE(template <size_t _Max_size> char *, _Pthread_alloc<_Max_size>::_S_start_free, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> char *, _Pthread_alloc<_Max_size>::_S_end_free, = 0);
+ __DECLARE_INSTANCE(template <size_t _Max_size> size_t, _Pthread_alloc<_Max_size>::_S_heap_size, = 0);
+
+# endif
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_EXPOSE_GLOBALS_IMPLEMENTATION */
+
+#endif /*  _STLP_PTHREAD_ALLOC_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_pthread_alloc.h b/src/STLport/stl/_pthread_alloc.h
new file mode 100644
index 0000000..3d6be7e
--- /dev/null
+++ b/src/STLport/stl/_pthread_alloc.h
@@ -0,0 +1,489 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_PTHREAD_ALLOC_H
+#define _STLP_PTHREAD_ALLOC_H
+
+// Pthread-specific node allocator.
+// This is similar to the default allocator, except that free-list
+// information is kept separately for each thread, avoiding locking.
+// This should be reasonably fast even in the presence of threads.
+// The down side is that storage may not be well-utilized.
+// It is not an error to allocate memory in thread A and deallocate
+// it in thread B.  But this effectively transfers ownership of the memory,
+// so that it can only be reallocated by thread B.  Thus this can effectively
+// result in a storage leak if it's done on a regular basis.
+// It can also result in frequent sharing of
+// cache lines among processors, with potentially serious performance
+// consequences.
+
+#include <pthread.h>
+
+#ifndef _STLP_INTERNAL_ALLOC_H
+#include <stl/_alloc.h>
+#endif
+
+#ifndef __RESTRICT
+#  define __RESTRICT
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#define _STLP_DATA_ALIGNMENT 8
+
+union _Pthread_alloc_obj {
+    union _Pthread_alloc_obj * __free_list_link;
+    char __client_data[_STLP_DATA_ALIGNMENT];    /* The client sees this.    */
+};
+
+// Pthread allocators don't appear to the client to have meaningful
+// instances.  We do in fact need to associate some state with each
+// thread.  That state is represented by
+// _Pthread_alloc_per_thread_state<_Max_size>.
+
+template<size_t _Max_size>
+struct _Pthread_alloc_per_thread_state {
+  typedef _Pthread_alloc_obj __obj;
+  enum { _S_NFREELISTS = _Max_size/_STLP_DATA_ALIGNMENT };
+
+  // Free list link for list of available per thread structures.
+  // When one of these becomes available for reuse due to thread
+  // termination, any objects in its free list remain associated
+  // with it.  The whole structure may then be used by a newly
+  // created thread.
+  _Pthread_alloc_per_thread_state() : __next(0)
+  {
+    memset((void *)__free_list, 0, (size_t)_S_NFREELISTS * sizeof(__obj *));
+  }
+  // Returns an object of size __n, and possibly adds to size n free list.
+  void *_M_refill(size_t __n);
+  
+  _Pthread_alloc_obj* volatile __free_list[_S_NFREELISTS]; 
+  _Pthread_alloc_per_thread_state<_Max_size> * __next; 
+  // this data member is only to be used by per_thread_allocator, which returns memory to the originating thread.
+  _STLP_mutex _M_lock;
+
+ };
+
+// Pthread-specific allocator.
+// The argument specifies the largest object size allocated from per-thread
+// free lists.  Larger objects are allocated using malloc_alloc.
+// Max_size must be a power of 2.
+template < __DFL_NON_TYPE_PARAM(size_t, _Max_size, _MAX_BYTES) >
+class _Pthread_alloc {
+
+public: // but only for internal use:
+
+  typedef _Pthread_alloc_obj __obj;
+  typedef _Pthread_alloc_per_thread_state<_Max_size> __state_type;
+  typedef char value_type;
+
+  // Allocates a chunk for nobjs of size size.  nobjs may be reduced
+  // if it is inconvenient to allocate the requested number.
+  static char *_S_chunk_alloc(size_t __size, size_t &__nobjs);
+
+  enum {_S_ALIGN = _STLP_DATA_ALIGNMENT};
+
+  static size_t _S_round_up(size_t __bytes) {
+        return (((__bytes) + (int)_S_ALIGN-1) & ~((int)_S_ALIGN - 1));
+  }
+  static size_t _S_freelist_index(size_t __bytes) {
+        return (((__bytes) + (int)_S_ALIGN-1)/(int)_S_ALIGN - 1);
+  }
+
+private:
+  // Chunk allocation state. And other shared state.
+  // Protected by _S_chunk_allocator_lock.
+  static _STLP_mutex_base _S_chunk_allocator_lock;
+  static char *_S_start_free;
+  static char *_S_end_free;
+  static size_t _S_heap_size;
+  static _Pthread_alloc_per_thread_state<_Max_size>* _S_free_per_thread_states;
+  static pthread_key_t _S_key;
+  static bool _S_key_initialized;
+        // Pthread key under which per thread state is stored. 
+        // Allocator instances that are currently unclaimed by any thread.
+  static void _S_destructor(void *instance);
+        // Function to be called on thread exit to reclaim per thread
+        // state.
+  static _Pthread_alloc_per_thread_state<_Max_size> *_S_new_per_thread_state();
+public:
+        // Return a recycled or new per thread state.
+  static _Pthread_alloc_per_thread_state<_Max_size> *_S_get_per_thread_state();
+private:
+        // ensure that the current thread has an associated
+        // per thread state.
+  class _M_lock;
+  friend class _M_lock;
+  class _M_lock {
+      public:
+        _M_lock () { _S_chunk_allocator_lock._M_acquire_lock(); }
+        ~_M_lock () { _S_chunk_allocator_lock._M_release_lock(); }
+  };
+
+public:
+
+  /* n must be > 0      */
+  static void * allocate(size_t __n)
+  {
+    __obj * volatile * __my_free_list;
+    __obj * __RESTRICT __result;
+    __state_type* __a;
+
+    if (__n > _Max_size) {
+        return(__malloc_alloc<0>::allocate(__n));
+    }
+
+    __a = _S_get_per_thread_state();
+
+    __my_free_list = __a -> __free_list + _S_freelist_index(__n);
+    __result = *__my_free_list;
+    if (__result == 0) {
+        void *__r = __a -> _M_refill(_S_round_up(__n));
+        return __r;
+    }
+    *__my_free_list = __result -> __free_list_link;
+    return (__result);
+  };
+
+  /* p may not be 0 */
+  static void deallocate(void *__p, size_t __n)
+  {
+    __obj *__q = (__obj *)__p;
+    __obj * volatile * __my_free_list;
+    __state_type* __a;
+
+    if (__n > _Max_size) {
+        __malloc_alloc<0>::deallocate(__p, __n);
+        return;
+    }
+
+    __a = _S_get_per_thread_state();
+    
+    __my_free_list = __a->__free_list + _S_freelist_index(__n);
+    __q -> __free_list_link = *__my_free_list;
+    *__my_free_list = __q;
+  }
+
+  // boris : versions for per_thread_allocator
+  /* n must be > 0      */
+  static void * allocate(size_t __n, __state_type* __a)
+  {
+    __obj * volatile * __my_free_list;
+    __obj * __RESTRICT __result;
+
+    if (__n > _Max_size) {
+        return(__malloc_alloc<0>::allocate(__n));
+    }
+
+    // boris : here, we have to lock per thread state, as we may be getting memory from
+    // different thread pool.
+    _STLP_mutex_lock __lock(__a->_M_lock);
+
+    __my_free_list = __a -> __free_list + _S_freelist_index(__n);
+    __result = *__my_free_list;
+    if (__result == 0) {
+        void *__r = __a -> _M_refill(_S_round_up(__n));
+        return __r;
+    }
+    *__my_free_list = __result -> __free_list_link;
+    return (__result);
+  };
+
+  /* p may not be 0 */
+  static void deallocate(void *__p, size_t __n, __state_type* __a)
+  {
+    __obj *__q = (__obj *)__p;
+    __obj * volatile * __my_free_list;
+
+    if (__n > _Max_size) {
+        __malloc_alloc<0>::deallocate(__p, __n);
+        return;
+    }
+
+    // boris : here, we have to lock per thread state, as we may be returning memory from
+    // different thread.
+    _STLP_mutex_lock __lock(__a->_M_lock);
+
+    __my_free_list = __a->__free_list + _S_freelist_index(__n);
+    __q -> __free_list_link = *__my_free_list;
+    *__my_free_list = __q;
+  }
+
+  static void * reallocate(void *__p, size_t __old_sz, size_t __new_sz);
+
+} ;
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _Pthread_alloc<_MAX_BYTES>;
+# endif
+
+typedef _Pthread_alloc<_MAX_BYTES> __pthread_alloc;
+typedef __pthread_alloc pthread_alloc;
+
+template <class _Tp>
+class pthread_allocator {
+  typedef pthread_alloc _S_Alloc;          // The underlying allocator.
+public:
+  typedef size_t     size_type;
+  typedef ptrdiff_t  difference_type;
+  typedef _Tp*       pointer;
+  typedef const _Tp* const_pointer;
+  typedef _Tp&       reference;
+  typedef const _Tp& const_reference;
+  typedef _Tp        value_type;
+
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+  template <class _NewType> struct rebind {
+    typedef pthread_allocator<_NewType> other;
+  };
+#endif
+
+  pthread_allocator() _STLP_NOTHROW {}
+  pthread_allocator(const pthread_allocator<_Tp>& a) _STLP_NOTHROW {}
+
+#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */
+  template <class _OtherType> pthread_allocator(const pthread_allocator<_OtherType>&)
+		_STLP_NOTHROW {}
+#endif
+
+  ~pthread_allocator() _STLP_NOTHROW {}
+
+  pointer address(reference __x) const { return &__x; }
+  const_pointer address(const_reference __x) const { return &__x; }
+
+  // __n is permitted to be 0.  The C++ standard says nothing about what
+  // the return value is when __n == 0.
+  _Tp* allocate(size_type __n, const void* = 0) {
+    return __n != 0 ? __STATIC_CAST(_Tp*,_S_Alloc::allocate(__n * sizeof(_Tp)))
+                    : 0;
+  }
+
+  // p is not permitted to be a null pointer.
+  void deallocate(pointer __p, size_type __n)
+    { _S_Alloc::deallocate(__p, __n * sizeof(_Tp)); }
+
+  size_type max_size() const _STLP_NOTHROW 
+    { return size_t(-1) / sizeof(_Tp); }
+
+  void construct(pointer __p, const _Tp& __val) { _STLP_PLACEMENT_NEW (__p) _Tp(__val); }
+  void destroy(pointer _p) { _p->~_Tp(); }
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC pthread_allocator<void> {
+public:
+  typedef size_t      size_type;
+  typedef ptrdiff_t   difference_type;
+  typedef void*       pointer;
+  typedef const void* const_pointer;
+  typedef void        value_type;
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+  template <class _NewType> struct rebind {
+    typedef pthread_allocator<_NewType> other;
+  };
+#endif
+};
+
+template <class _T1, class _T2>
+inline bool operator==(const pthread_allocator<_T1>&,
+                       const pthread_allocator<_T2>& a2) 
+{
+  return true;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <class _T1, class _T2>
+inline bool operator!=(const pthread_allocator<_T1>&,
+                       const pthread_allocator<_T2>&)
+{
+  return false;
+}
+#endif
+
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+# ifdef _STLP_USE_RAW_SGI_ALLOCATORS
+template <class _Tp, size_t _Max_size>
+struct _Alloc_traits<_Tp, _Pthread_alloc<_Max_size> >
+{
+  typedef __allocator<_Tp, _Pthread_alloc<_Max_size> > 
+          allocator_type;
+};
+# endif
+
+template <class _Tp, class _Atype>
+struct _Alloc_traits<_Tp, pthread_allocator<_Atype> >
+{
+  typedef pthread_allocator<_Tp> allocator_type;
+};
+
+#endif
+
+#if !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+
+template <class _Tp1, class _Tp2>
+inline pthread_allocator<_Tp2>&
+__stl_alloc_rebind(pthread_allocator<_Tp1>& __x, const _Tp2*) {
+  return (pthread_allocator<_Tp2>&)__x;
+}
+
+template <class _Tp1, class _Tp2>
+inline pthread_allocator<_Tp2>
+__stl_alloc_create(pthread_allocator<_Tp1>&, const _Tp2*) {
+  return pthread_allocator<_Tp2>();
+}
+
+#endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+
+//
+// per_thread_allocator<> : this allocator always return memory to the same thread 
+// it was allocated from.
+//
+
+template <class _Tp>
+class per_thread_allocator {
+  typedef pthread_alloc _S_Alloc;          // The underlying allocator.
+  typedef pthread_alloc::__state_type __state_type;
+public:
+  typedef size_t     size_type;
+  typedef ptrdiff_t  difference_type;
+  typedef _Tp*       pointer;
+  typedef const _Tp* const_pointer;
+  typedef _Tp&       reference;
+  typedef const _Tp& const_reference;
+  typedef _Tp        value_type;
+
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+  template <class _NewType> struct rebind {
+    typedef per_thread_allocator<_NewType> other;
+  };
+#endif
+
+  per_thread_allocator() _STLP_NOTHROW { 
+    _M_state = _S_Alloc::_S_get_per_thread_state();
+  }
+  per_thread_allocator(const per_thread_allocator<_Tp>& __a) _STLP_NOTHROW : _M_state(__a._M_state){}
+
+#if defined (_STLP_MEMBER_TEMPLATES) /* && defined (_STLP_FUNCTION_PARTIAL_ORDER) */
+  template <class _OtherType> per_thread_allocator(const per_thread_allocator<_OtherType>& __a)
+		_STLP_NOTHROW : _M_state(__a._M_state) {}
+#endif
+
+  ~per_thread_allocator() _STLP_NOTHROW {}
+
+  pointer address(reference __x) const { return &__x; }
+  const_pointer address(const_reference __x) const { return &__x; }
+
+  // __n is permitted to be 0.  The C++ standard says nothing about what
+  // the return value is when __n == 0.
+  _Tp* allocate(size_type __n, const void* = 0) {
+    return __n != 0 ? __STATIC_CAST(_Tp*,_S_Alloc::allocate(__n * sizeof(_Tp), _M_state)): 0;
+  }
+
+  // p is not permitted to be a null pointer.
+  void deallocate(pointer __p, size_type __n)
+    { _S_Alloc::deallocate(__p, __n * sizeof(_Tp), _M_state); }
+
+  size_type max_size() const _STLP_NOTHROW 
+    { return size_t(-1) / sizeof(_Tp); }
+
+  void construct(pointer __p, const _Tp& __val) { _STLP_PLACEMENT_NEW (__p) _Tp(__val); }
+  void destroy(pointer _p) { _p->~_Tp(); }
+
+  // state is being kept here
+  __state_type* _M_state;
+};
+
+_STLP_TEMPLATE_NULL
+class _STLP_CLASS_DECLSPEC per_thread_allocator<void> {
+public:
+  typedef size_t      size_type;
+  typedef ptrdiff_t   difference_type;
+  typedef void*       pointer;
+  typedef const void* const_pointer;
+  typedef void        value_type;
+#ifdef _STLP_MEMBER_TEMPLATE_CLASSES
+  template <class _NewType> struct rebind {
+    typedef per_thread_allocator<_NewType> other;
+  };
+#endif
+};
+
+template <class _T1, class _T2>
+inline bool operator==(const per_thread_allocator<_T1>& __a1,
+                       const per_thread_allocator<_T2>& __a2) 
+{
+  return __a1._M_state == __a2._M_state;
+}
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <class _T1, class _T2>
+inline bool operator!=(const per_thread_allocator<_T1>& __a1,
+                       const per_thread_allocator<_T2>& __a2)
+{
+  return __a1._M_state != __a2._M_state;
+}
+#endif
+
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Tp, class _Atype>
+struct _Alloc_traits<_Tp, per_thread_allocator<_Atype> >
+{
+  typedef per_thread_allocator<_Tp> allocator_type;
+};
+
+#endif
+
+#if !defined (_STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM)
+
+template <class _Tp1, class _Tp2>
+inline per_thread_allocator<_Tp2>&
+__stl_alloc_rebind(per_thread_allocator<_Tp1>& __x, const _Tp2*) {
+  return (per_thread_allocator<_Tp2>&)__x;
+}
+
+template <class _Tp1, class _Tp2>
+inline per_thread_allocator<_Tp2>
+__stl_alloc_create(per_thread_allocator<_Tp1>&, const _Tp2*) {
+  return per_thread_allocator<_Tp2>();
+}
+
+#endif /* _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM */
+
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_pthread_alloc.c>
+# endif
+
+#endif /* _STLP_PTHREAD_ALLOC */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_ptrs_specialize.h b/src/STLport/stl/_ptrs_specialize.h
new file mode 100644
index 0000000..cc5d259
--- /dev/null
+++ b/src/STLport/stl/_ptrs_specialize.h
@@ -0,0 +1,72 @@
+#ifndef _STLP_PTRS_SPECIALIZE_H
+# define _STLP_PTRS_SPECIALIZE_H
+
+// the following is a workaround for arrow operator problems
+#  if defined  ( _STLP_NO_ARROW_OPERATOR ) 
+// User wants to disable proxy -> operators
+#    define _STLP_DEFINE_ARROW_OPERATOR
+#    define _STLP_ARROW_SPECIALIZE_WITH_PTRS(_Tp)
+# else
+// Compiler can handle generic -> operator.
+#  define _STLP_ARROW_SPECIALIZE_WITH_PTRS(_Tp)
+#  ifdef __BORLANDC__
+#   define _STLP_DEFINE_ARROW_OPERATOR  pointer operator->() const { return &(*(*this)); }
+#  elif defined ( _STLP_WINCE ) || defined(__WATCOMC__)
+#   define _STLP_DEFINE_ARROW_OPERATOR pointer operator->() const { reference x = operator*(); return &x; }
+#  else
+#   define _STLP_DEFINE_ARROW_OPERATOR  pointer operator->() const { return &(operator*()); }
+#  endif
+# endif /* _STLP_NO_ARROW_OPERATOR */
+
+// Important pointers specializations
+
+# ifdef _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+#  define _STLP_TYPE_TRAITS_POD_SPECIALIZE_V(_Type)
+#  define _STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type)
+# else
+#  define _STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type) _STLP_TEMPLATE_NULL struct __type_traits<_Type> : __type_traits_aux<true> {};
+#  define _STLP_TYPE_TRAITS_POD_SPECIALIZE_V(_Type) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type*) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(const _Type*) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type**) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type* const *) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(const _Type**) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(_Type***) \
+_STLP_TYPE_TRAITS_POD_SPECIALIZE(const _Type***)
+# endif
+
+# define _STLP_POINTERS_SPECIALIZE(_Type) _STLP_TYPE_TRAITS_POD_SPECIALIZE_V(_Type) _STLP_ARROW_SPECIALIZE_WITH_PTRS(_Type)
+
+#  if !defined ( _STLP_NO_BOOL )
+_STLP_POINTERS_SPECIALIZE( bool )
+#  endif
+_STLP_TYPE_TRAITS_POD_SPECIALIZE_V(void)
+# ifndef _STLP_NO_SIGNED_BUILTINS
+  _STLP_POINTERS_SPECIALIZE( signed char )
+# endif
+  _STLP_POINTERS_SPECIALIZE( char )
+  _STLP_POINTERS_SPECIALIZE( unsigned char )
+  _STLP_POINTERS_SPECIALIZE( short )
+  _STLP_POINTERS_SPECIALIZE( unsigned short )
+  _STLP_POINTERS_SPECIALIZE( int )
+  _STLP_POINTERS_SPECIALIZE( unsigned int )
+  _STLP_POINTERS_SPECIALIZE( long )
+  _STLP_POINTERS_SPECIALIZE( unsigned long )
+  _STLP_POINTERS_SPECIALIZE( float )
+  _STLP_POINTERS_SPECIALIZE( double )
+#  if !defined ( _STLP_NO_LONG_DOUBLE )
+  _STLP_POINTERS_SPECIALIZE( long double )
+#  endif
+#  if defined ( _STLP_LONG_LONG)
+  _STLP_POINTERS_SPECIALIZE( _STLP_LONG_LONG )
+  _STLP_POINTERS_SPECIALIZE( unsigned _STLP_LONG_LONG )
+#  endif
+#if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT)
+  _STLP_POINTERS_SPECIALIZE( wchar_t )
+#  endif
+
+# undef _STLP_ARROW_SPECIALIZE
+# undef _STLP_ARROW_SPECIALIZE_WITH_PTRS
+# undef _STLP_TYPE_TRAITS_POD_SPECIALIZE_V
+
+#endif
diff --git a/src/STLport/stl/_queue.h b/src/STLport/stl/_queue.h
new file mode 100644
index 0000000..d95e42f
--- /dev/null
+++ b/src/STLport/stl/_queue.h
@@ -0,0 +1,212 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_QUEUE_H
+#define _STLP_INTERNAL_QUEUE_H
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+#ifndef _STLP_INTERNAL_HEAP_H
+# include <stl/_heap.h>
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_H
+# include <stl/_function.h>
+#endif
+
+#if defined(__SC__) && !defined(__DMC__)		//*ty 12/07/2001 - since "comp" is a built-in type and reserved under SCpp
+#define comp _Comp
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if ! defined ( _STLP_LIMITED_DEFAULT_TEMPLATES )
+template <class _Tp, class _Sequence = deque<_Tp> >
+# elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+#  define _STLP_QUEUE_ARGS _Tp
+template <class _Tp>
+# else
+template <class _Tp, class _Sequence>
+# endif
+
+class queue {
+# if defined ( _STLP_QUEUE_ARGS )
+  typedef deque<_Tp> _Sequence;
+# endif
+public:
+  typedef typename _Sequence::value_type      value_type;
+  typedef typename _Sequence::size_type       size_type;
+  typedef          _Sequence                  container_type;
+
+  typedef typename _Sequence::reference       reference;
+  typedef typename _Sequence::const_reference const_reference;
+
+protected:
+  _Sequence c;
+public:
+  queue() : c() {}
+  explicit queue(const _Sequence& __c) : c(__c) {}
+
+  bool empty() const { return c.empty(); }
+  size_type size() const { return c.size(); }
+  reference front() { return c.front(); }
+  const_reference front() const { return c.front(); }
+  reference back() { return c.back(); }
+  const_reference back() const { return c.back(); }
+  void push(const value_type& __x) { c.push_back(__x); }
+  void pop() { c.pop_front(); }
+  const _Sequence& _Get_c() const { return c; }
+};
+
+# ifndef _STLP_QUEUE_ARGS
+#  define _STLP_QUEUE_ARGS _Tp, _Sequence
+#  define _STLP_QUEUE_HEADER_ARGS class _Tp, class _Sequence
+# else
+#  define _STLP_QUEUE_HEADER_ARGS class _Tp
+# endif
+
+template < _STLP_QUEUE_HEADER_ARGS >
+inline bool _STLP_CALL 
+operator==(const queue<_STLP_QUEUE_ARGS >& __x, const queue<_STLP_QUEUE_ARGS >& __y)
+{
+  return __x._Get_c() == __y._Get_c();
+}
+
+template < _STLP_QUEUE_HEADER_ARGS >
+inline bool _STLP_CALL
+operator<(const queue<_STLP_QUEUE_ARGS >& __x, const queue<_STLP_QUEUE_ARGS >& __y)
+{
+  return __x._Get_c() < __y._Get_c();
+}
+
+_STLP_RELOPS_OPERATORS( template < _STLP_QUEUE_HEADER_ARGS >, queue<_STLP_QUEUE_ARGS > )
+
+# if !(defined ( _STLP_LIMITED_DEFAULT_TEMPLATES ) || defined ( _STLP_TEMPLATE_PARAM_SUBTYPE_BUG ))
+template <class _Tp, class _Sequence = vector<_Tp>, 
+          class _Compare = less<_STLP_HEADER_TYPENAME _Sequence::value_type> >
+# elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+template <class _Tp>
+# else
+template <class _Tp, class _Sequence, class _Compare>
+# endif
+class  priority_queue {
+# ifdef _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS
+  typedef vector<_Tp> _Sequence;
+  typedef less< typename vector<_Tp>::value_type> _Compare; 
+# endif
+public:
+  typedef typename _Sequence::value_type      value_type;
+  typedef typename _Sequence::size_type       size_type;
+  typedef          _Sequence                  container_type;
+
+  typedef typename _Sequence::reference       reference;
+  typedef typename _Sequence::const_reference const_reference;
+protected:
+  _Sequence c;
+  _Compare comp;
+public:
+  priority_queue() : c() {}
+  explicit priority_queue(const _Compare& __x) :  c(), comp(__x) {}
+  priority_queue(const _Compare& __x, const _Sequence& __s) 
+    : c(__s), comp(__x)
+    { make_heap(c.begin(), c.end(), comp); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  priority_queue(_InputIterator __first, _InputIterator __last) 
+    : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
+
+  template <class _InputIterator>
+  priority_queue(_InputIterator __first, 
+                 _InputIterator __last, const _Compare& __x)
+    : c(__first, __last), comp(__x)
+    { make_heap(c.begin(), c.end(), comp); }
+
+  template <class _InputIterator>
+  priority_queue(_InputIterator __first, _InputIterator __last,
+                 const _Compare& __x, const _Sequence& __s)
+  : c(__s), comp(__x)
+  { 
+    c.insert(c.end(), __first, __last);
+    make_heap(c.begin(), c.end(), comp);
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+  priority_queue(const value_type* __first, const value_type* __last) 
+    : c(__first, __last) { make_heap(c.begin(), c.end(), comp); }
+
+  priority_queue(const value_type* __first, const value_type* __last, 
+                 const _Compare& __x) 
+    : c(__first, __last), comp(__x)
+    { make_heap(c.begin(), c.end(), comp); }
+
+  priority_queue(const value_type* __first, const value_type* __last, 
+                 const _Compare& __x, const _Sequence& __c)
+    : c(__c), comp(__x)
+  { 
+    c.insert(c.end(), __first, __last);
+    make_heap(c.begin(), c.end(), comp);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  bool empty() const { return c.empty(); }
+  size_type size() const { return c.size(); }
+  const_reference top() const { return c.front(); }
+  void push(const value_type& __x) {
+    _STLP_TRY {
+      c.push_back(__x); 
+      push_heap(c.begin(), c.end(), comp);
+    }
+    _STLP_UNWIND(c.clear());
+  }
+  void pop() {
+    _STLP_TRY {
+      pop_heap(c.begin(), c.end(), comp);
+      c.pop_back();
+    }
+    _STLP_UNWIND(c.clear());
+  }
+};
+
+_STLP_END_NAMESPACE
+
+#  undef _STLP_QUEUE_ARGS
+#  undef _STLP_QUEUE_HEADER_ARGS
+
+#endif /* _STLP_INTERNAL_QUEUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_range_errors.h b/src/STLport/stl/_range_errors.h
new file mode 100644
index 0000000..0f7fa03
--- /dev/null
+++ b/src/STLport/stl/_range_errors.h
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef _STLP_RANGE_ERRORS_H
+#define _STLP_RANGE_ERRORS_H
+
+// A few places in the STL throw range errors, using standard exception
+// classes defined in <stdexcept>.  This header file provides functions
+// to throw those exception objects.
+
+// _STLP_DONT_THROW_RANGE_ERRORS is a hook so that users can disable
+// this exception throwing.
+#if defined(_STLP_CAN_THROW_RANGE_ERRORS) && defined(_STLP_USE_EXCEPTIONS) \
+    && !defined(_STLP_DONT_THROW_RANGE_ERRORS)
+# define _STLP_THROW_RANGE_ERRORS
+#endif
+
+// For the STLport iostreams, only declaration here, definition is in the lib
+
+#if defined ( _STLP_OWN_IOSTREAMS  ) && ! defined (_STLP_EXTERN_RANGE_ERRORS) 
+#  define _STLP_EXTERN_RANGE_ERRORS
+# endif
+
+#if defined (_STLP_EXTERN_RANGE_ERRORS)
+_STLP_BEGIN_NAMESPACE
+void  _STLP_DECLSPEC _STLP_CALL __stl_throw_range_error(const char* __msg);
+void  _STLP_DECLSPEC _STLP_CALL __stl_throw_out_of_range(const char* __msg);
+void  _STLP_DECLSPEC _STLP_CALL __stl_throw_length_error(const char* __msg);
+void  _STLP_DECLSPEC _STLP_CALL __stl_throw_invalid_argument(const char* __msg);
+void  _STLP_DECLSPEC _STLP_CALL __stl_throw_overflow_error(const char* __msg);
+_STLP_END_NAMESPACE
+#else
+
+#if defined(_STLP_THROW_RANGE_ERRORS)
+# ifndef _STLP_STDEXCEPT
+#  include <stdexcept>
+# endif
+# ifndef _STLP_STRING
+#  include <string>
+# endif
+# define _STLP_THROW_MSG(ex,msg)  throw ex(string(msg))
+#else
+# if defined (_STLP_WINCE)
+#  define _STLP_THROW_MSG(ex,msg)  TerminateProcess(GetCurrentProcess(), 0)
+# else
+#  include <cstdlib>
+#  include <cstdio>
+#  define _STLP_THROW_MSG(ex,msg)  puts(msg),_STLP_ABORT()
+# endif
+#endif
+
+// For wrapper mode and throwing range errors, include the
+// stdexcept header and throw the appropriate exceptions directly.
+
+_STLP_BEGIN_NAMESPACE
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_range_error(const char* __msg) { 
+  _STLP_THROW_MSG(range_error, __msg); 
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_out_of_range(const char* __msg) { 
+  _STLP_THROW_MSG(out_of_range, __msg); 
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_length_error(const char* __msg) { 
+  _STLP_THROW_MSG(length_error, __msg); 
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_invalid_argument(const char* __msg) { 
+  _STLP_THROW_MSG(invalid_argument, __msg); 
+}
+
+inline void _STLP_DECLSPEC _STLP_CALL __stl_throw_overflow_error(const char* __msg) { 
+  _STLP_THROW_MSG(overflow_error, __msg); 
+}
+_STLP_END_NAMESPACE
+
+# undef _STLP_THROW_MSG
+
+# endif /* EXTERN_RANGE_ERRORS */
+
+
+#endif /* _STLP_RANGE_ERRORS_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_raw_storage_iter.h b/src/STLport/stl/_raw_storage_iter.h
new file mode 100644
index 0000000..7d253f3
--- /dev/null
+++ b/src/STLport/stl/_raw_storage_iter.h
@@ -0,0 +1,82 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ * You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H
+#define _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+#  include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _ForwardIterator, class _Tp>
+class raw_storage_iterator 
+# ifdef _STLP_HAS_VOID_SPECIALIZATION
+      : public iterator<output_iterator_tag,void,void,void,void>
+# endif
+{
+protected:
+  _ForwardIterator _M_iter;
+public:
+  typedef output_iterator_tag iterator_category;
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+# endif
+  explicit raw_storage_iterator(_ForwardIterator __x) : _M_iter(__x) {}
+  raw_storage_iterator<_ForwardIterator, _Tp>& operator*() { return *this; }
+  raw_storage_iterator<_ForwardIterator, _Tp>& operator=(const _Tp& __element) {
+    _Construct(&*_M_iter, __element);
+    return *this;
+  }        
+  raw_storage_iterator<_ForwardIterator, _Tp>& operator++() {
+    ++_M_iter;
+    return *this;
+  }
+  raw_storage_iterator<_ForwardIterator, _Tp> operator++(int) {
+    raw_storage_iterator<_ForwardIterator, _Tp> __tmp = *this;
+    ++_M_iter;
+    return __tmp;
+  }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _ForwardIterator, class _Tp>
+inline output_iterator_tag iterator_category(const raw_storage_iterator<_ForwardIterator, _Tp>&) { return output_iterator_tag(); }
+#endif
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_RAW_STORAGE_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_relops.h b/src/STLport/stl/_relops.h
new file mode 100644
index 0000000..e186cd3
--- /dev/null
+++ b/src/STLport/stl/_relops.h
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Hewlett-Packard Company makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_relops_cont.h b/src/STLport/stl/_relops_cont.h
new file mode 100644
index 0000000..bbbf513
--- /dev/null
+++ b/src/STLport/stl/_relops_cont.h
@@ -0,0 +1,29 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+#ifndef _STLP_EQUAL_OPERATOR_SPECIALIZED
+_STLP_TEMPLATE_HEADER
+inline bool  _STLP_CALL operator==(const _STLP_TEMPLATE_CONTAINER& __x, 
+                                   const _STLP_TEMPLATE_CONTAINER& __y) {
+  return __x.size() == __y.size() &&
+    equal(__x.begin(), __x.end(), __y.begin());
+}
+#endif /* _STLP_EQUAL_OPERATOR_SPECIALIZED */
+
+_STLP_TEMPLATE_HEADER
+inline bool  _STLP_CALL operator<(const _STLP_TEMPLATE_CONTAINER& __x, 
+                                  const _STLP_TEMPLATE_CONTAINER& __y) {
+  return lexicographical_compare(__x.begin(), __x.end(), 
+				 __y.begin(), __y.end());
+}
+
+_STLP_RELOPS_OPERATORS( _STLP_TEMPLATE_HEADER , _STLP_TEMPLATE_CONTAINER )
+    
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+_STLP_TEMPLATE_HEADER
+inline void  _STLP_CALL swap(_STLP_TEMPLATE_CONTAINER& __x, 
+                             _STLP_TEMPLATE_CONTAINER& __y) {
+  __x.swap(__y);
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
diff --git a/src/STLport/stl/_relops_hash_cont.h b/src/STLport/stl/_relops_hash_cont.h
new file mode 100644
index 0000000..8739567
--- /dev/null
+++ b/src/STLport/stl/_relops_hash_cont.h
@@ -0,0 +1,32 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL 
+operator==(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+  return _STLP_TEMPLATE_CONTAINER::_M_equal(__hm1, __hm2);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL 
+operator!=(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2) {
+  return !(__hm1 == __hm2);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL 
+swap(_STLP_TEMPLATE_CONTAINER& __hm1, _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+  __hm1.swap(__hm2);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
diff --git a/src/STLport/stl/_relops_template.h b/src/STLport/stl/_relops_template.h
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/STLport/stl/_relops_template.h
@@ -0,0 +1 @@
+
diff --git a/src/STLport/stl/_rope.c b/src/STLport/stl/_rope.c
new file mode 100644
index 0000000..1820e7c
--- /dev/null
+++ b/src/STLport/stl/_rope.c
@@ -0,0 +1,1540 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+// Set buf_start, buf_end, and buf_ptr appropriately, filling tmp_buf
+// if necessary.  Assumes path_end[leaf_index] and leaf_pos are correct.
+// Results in a valid buf_ptr if the iterator can be legitimately
+// dereferenced.
+# ifndef _STLP_ROPEIMPL_H
+# define _STLP_ROPEIMPL_H
+
+#ifndef _STLP_INTERNAL_ROPE_H
+# include <stl/_rope.h>
+#endif
+
+# ifndef _STLP_CSTDIO
+#  include <cstdio>
+# endif
+
+#ifndef _STLP_IOSTREAM
+# include <iostream>
+#endif
+
+# include <stl/_range_errors.h>
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+# define __allocator__ _Alloc
+# else
+# define __allocator__ allocator_type
+# endif
+
+template<class _CharT, class _Alloc>
+_Rope_iterator<_CharT, _Alloc>::_Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos)
+  : _Rope_iterator_base<_CharT,_Alloc>(__r->_M_tree_ptr._M_data, __pos),
+  _M_root_rope(__r) { _RopeRep::_S_ref(this->_M_root); }
+
+template<class _CharT, class _Alloc>
+_Rope_iterator<_CharT, _Alloc>::_Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos): 
+  _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr._M_data, __pos), 
+  _M_root_rope(&__r) {
+  _RopeRep::_S_ref(this->_M_root); if (!(__r.empty()))_S_setcache(*this);
+}
+
+template<class _CharT, class _Alloc>
+void 
+_Rope_RopeRep<_CharT, _Alloc>::_M_free_c_string()
+{
+  _CharT* __cstr = _M_c_string;
+  if (0 != __cstr) {
+    size_t _p_size = _M_size._M_data + 1;
+    _STLP_STD::_Destroy(__cstr, __cstr + _p_size);
+    _M_size.deallocate(__cstr, _p_size);
+  }
+}
+
+
+// Set buf_start, buf_end, and buf_ptr appropriately, filling tmp_buf
+// if necessary.  Assumes _M_path_end[leaf_index] and leaf_pos are correct.
+// Results in a valid buf_ptr if the iterator can be legitimately
+// dereferenced.
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_S_setbuf( 
+  _Rope_iterator_base<_CharT,_Alloc>& __x)
+{
+    const _RopeRep* __leaf = __x._M_path_end[__x._M_leaf_index];
+    size_t __leaf_pos = __x._M_leaf_pos;
+    size_t __pos = __x._M_current_pos;
+
+    switch(__leaf->_M_tag) {
+	case _RopeRep::_S_leaf:
+	    __x._M_buf_start = 
+	      ((_Rope_RopeLeaf<_CharT,_Alloc>*)__leaf)->_M_data;
+	    __x._M_buf_ptr = __x._M_buf_start + (__pos - __leaf_pos);
+	    __x._M_buf_end = __x._M_buf_start + __leaf->_M_size._M_data;
+	    break;
+	case _RopeRep::_S_function:
+	case _RopeRep::_S_substringfn:
+	    {
+		size_t __len = _S_iterator_buf_len;
+		size_t __buf_start_pos = __leaf_pos;
+		size_t __leaf_end = __leaf_pos + __leaf->_M_size._M_data;
+		char_producer<_CharT>* __fn =
+			((_Rope_RopeFunction<_CharT,_Alloc>*)__leaf)->_M_fn;
+
+		if (__buf_start_pos + __len <= __pos) {
+		    __buf_start_pos = __pos - __len/4;
+		    if (__buf_start_pos + __len > __leaf_end) {
+			__buf_start_pos = __leaf_end - __len;
+		    }
+		}
+		if (__buf_start_pos + __len > __leaf_end) {
+		    __len = __leaf_end - __buf_start_pos;
+		}
+		(*__fn)(__buf_start_pos - __leaf_pos, __len, __x._M_tmp_buf);
+		__x._M_buf_ptr = __x._M_tmp_buf + (__pos - __buf_start_pos);
+		__x._M_buf_start = __x._M_tmp_buf;
+		__x._M_buf_end = __x._M_tmp_buf + __len;
+	    }
+	    break;
+	default:
+      _STLP_ASSERT(0)
+        ;
+    }
+}
+
+// Set path and buffer inside a rope iterator.  We assume that 
+// pos and root are already set.
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache
+(_Rope_iterator_base<_CharT,_Alloc>& __x)
+{
+    const _RopeRep* __path[_RopeRep::_S_max_rope_depth+1];
+    const _RopeRep* __curr_rope;
+    int __curr_depth = -1;  /* index into path    */
+    size_t __curr_start_pos = 0;
+    size_t __pos = __x._M_current_pos;
+    unsigned char __dirns = 0; // Bit vector marking right turns in the path
+
+    _STLP_ASSERT(__pos <= __x._M_root->_M_size._M_data)
+    if (__pos >= __x._M_root->_M_size._M_data) {
+	__x._M_buf_ptr = 0;
+	return;
+    }
+    __curr_rope = __x._M_root;
+    if (0 != __curr_rope->_M_c_string) {
+	/* Treat the root as a leaf. */
+	__x._M_buf_start = __curr_rope->_M_c_string;
+	__x._M_buf_end = __curr_rope->_M_c_string + __curr_rope->_M_size._M_data;
+	__x._M_buf_ptr = __curr_rope->_M_c_string + __pos;
+	__x._M_path_end[0] = __curr_rope;
+	__x._M_leaf_index = 0;
+	__x._M_leaf_pos = 0;
+	return;
+    }
+    for(;;) {
+	++__curr_depth;
+	_STLP_ASSERT(__curr_depth <= _RopeRep::_S_max_rope_depth)
+	__path[__curr_depth] = __curr_rope;
+	switch(__curr_rope->_M_tag) {
+	  case _RopeRep::_S_leaf:
+	  case _RopeRep::_S_function:
+	  case _RopeRep::_S_substringfn:
+	    __x._M_leaf_pos = __curr_start_pos;
+	    goto done;
+	  case _RopeRep::_S_concat:
+	    {
+		_Rope_RopeConcatenation<_CharT,_Alloc>* __c =
+			(_Rope_RopeConcatenation<_CharT,_Alloc>*)__curr_rope;
+		_RopeRep* __left = __c->_M_left;
+		size_t __left_len = __left->_M_size._M_data;
+		
+		__dirns <<= 1;
+		if (__pos >= __curr_start_pos + __left_len) {
+		    __dirns |= 1;
+		    __curr_rope = __c->_M_right;
+		    __curr_start_pos += __left_len;
+		} else {
+		    __curr_rope = __left;
+		}
+	    }
+	    break;
+	}
+    }
+  done:
+    // Copy last section of path into _M_path_end.
+      {
+	int __i = -1;
+	int __j = __curr_depth + 1 - _S_path_cache_len;
+
+	if (__j < 0) __j = 0;
+	while (__j <= __curr_depth) {
+	    __x._M_path_end[++__i] = __path[__j++];
+	}
+	__x._M_leaf_index = __i;
+      }
+      __x._M_path_directions = __dirns;
+      _S_setbuf(__x);
+}
+
+// Specialized version of the above.  Assumes that
+// the path cache is valid for the previous position.
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_S_setcache_for_incr
+(_Rope_iterator_base<_CharT,_Alloc>& __x)
+{
+    int __current_index = __x._M_leaf_index;
+    const _RopeRep* __current_node = __x._M_path_end[__current_index];
+    size_t __len = __current_node->_M_size._M_data;
+    size_t __node_start_pos = __x._M_leaf_pos;
+    unsigned char __dirns = __x._M_path_directions;
+    _Rope_RopeConcatenation<_CharT,_Alloc>* __c;
+
+    _STLP_ASSERT(__x._M_current_pos <= __x._M_root->_M_size._M_data)
+    if (__x._M_current_pos - __node_start_pos < __len) {
+	/* More stuff in this leaf, we just didn't cache it. */
+	_S_setbuf(__x);
+	return;
+    }
+    _STLP_ASSERT(__node_start_pos + __len == __x._M_current_pos)
+    //  node_start_pos is starting position of last_node.
+    while (--__current_index >= 0) {
+	if (!(__dirns & 1) /* Path turned left */) 
+	  break;
+	__current_node = __x._M_path_end[__current_index];
+	__c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node;
+	// Otherwise we were in the right child.  Thus we should pop
+	// the concatenation node.
+	__node_start_pos -= __c->_M_left->_M_size._M_data;
+	__dirns >>= 1;
+    }
+    if (__current_index < 0) {
+	// We underflowed the cache. Punt.
+	_S_setcache(__x);
+	return;
+    }
+    __current_node = __x._M_path_end[__current_index];
+    __c = (_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node;
+    // current_node is a concatenation node.  We are positioned on the first
+    // character in its right child.
+    // node_start_pos is starting position of current_node.
+    __node_start_pos += __c->_M_left->_M_size._M_data;
+    __current_node = __c->_M_right;
+    __x._M_path_end[++__current_index] = __current_node;
+    __dirns |= 1;
+    while (_RopeRep::_S_concat == __current_node->_M_tag) {
+	++__current_index;
+	if (_S_path_cache_len == __current_index) {
+	    int __i;
+	    for (__i = 0; __i < _S_path_cache_len-1; __i++) {
+		__x._M_path_end[__i] = __x._M_path_end[__i+1];
+	    }
+	    --__current_index;
+	}
+	__current_node =
+	    ((_Rope_RopeConcatenation<_CharT,_Alloc>*)__current_node)->_M_left;
+	__x._M_path_end[__current_index] = __current_node;
+	__dirns <<= 1;
+	// node_start_pos is unchanged.
+    }
+    __x._M_leaf_index = __current_index;
+    __x._M_leaf_pos = __node_start_pos;
+    __x._M_path_directions = __dirns;
+    _S_setbuf(__x);
+}
+
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_M_incr(size_t __n) {
+    _M_current_pos += __n;
+    if (0 != _M_buf_ptr) {
+        size_t __chars_left = _M_buf_end - _M_buf_ptr;
+        if (__chars_left > __n) {
+            _M_buf_ptr += __n;
+        } else if (__chars_left == __n) {
+            _M_buf_ptr += __n;
+            _S_setcache_for_incr(*this);
+        } else {
+            _M_buf_ptr = 0;
+        }
+    }
+}
+
+template <class _CharT, class _Alloc>
+void _Rope_iterator_base<_CharT,_Alloc>::_M_decr(size_t __n) {
+    if (0 != _M_buf_ptr) {
+        size_t __chars_left = _M_buf_ptr - _M_buf_start;
+        if (__chars_left >= __n) {
+            _M_buf_ptr -= __n;
+        } else {
+            _M_buf_ptr = 0;
+        }
+    }
+    _M_current_pos -= __n;
+}
+
+template <class _CharT, class _Alloc>
+void _Rope_iterator<_CharT,_Alloc>::_M_check() {
+    if (_M_root_rope->_M_tree_ptr._M_data != this->_M_root) {
+        // _Rope was modified.  Get things fixed up.
+        _RopeRep::_S_unref(this->_M_root);
+        this->_M_root = _M_root_rope->_M_tree_ptr._M_data;
+        _RopeRep::_S_ref(this->_M_root);
+        this->_M_buf_ptr = 0;
+    }
+}
+
+# ifndef _GC
+//  There are several reasons for not doing this with virtual destructors
+//  and a class specific delete operator:
+//  - A class specific delete operator can't easily get access to
+//    allocator instances if we need them.
+//  - Any virtual function would need a 4 or byte vtable pointer;
+//    this only requires a one byte tag per object.
+template <class _CharT, class _Alloc>
+void _Rope_RopeRep<_CharT,_Alloc>::_M_free_tree()
+{
+    switch(_M_tag) {
+	case _S_leaf:
+	    {
+	      typedef _Rope_RopeLeaf<_CharT,_Alloc> _Rope_RopeLeaf_T;
+          _Rope_RopeLeaf_T* __l = (_Rope_RopeLeaf_T*)this;
+          _STLP_STD::_Destroy(__l); // ->_Rope_RopeLeaf<_CharT,_Alloc>::~_Rope_RopeLeaf();
+	      _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size, _Rope_RopeLeaf_T).deallocate(__l, 1);
+	        break;
+	    }
+	case _S_concat:
+	    {
+               typedef _Rope_RopeConcatenation<_CharT,_Alloc> _Rope_RopeConcatenation_T;
+               _Rope_RopeConcatenation_T* __c  = (_Rope_RopeConcatenation_T*)this;
+               _STLP_STD::_Destroy(__c);
+               _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size, 
+                               _Rope_RopeConcatenation_T).deallocate(__c, 1);
+	        break;
+	    }
+	case _S_function:
+	    {
+            typedef _Rope_RopeFunction<_CharT,_Alloc> _Rope_RopeFunctionT;
+              _Rope_RopeFunctionT* __f = (_Rope_RopeFunctionT*)this;
+              _STLP_STD::_Destroy(__f);
+              _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size, 
+                                 _Rope_RopeFunctionT).deallocate(__f, 1);
+	        break;
+	    }
+	case _S_substringfn:
+	    {
+            typedef _Rope_RopeSubstring<_CharT,_Alloc> _Rope_RopeSubstring_T;
+              _Rope_RopeSubstring_T* __ss = (_Rope_RopeSubstring_T*)this;
+              _STLP_STD::_Destroy(__ss);
+              _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_size, 
+                              _Rope_RopeSubstring_T).deallocate(__ss, 1);
+		break;
+	    }
+    }
+}
+#endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+#   define __RopeLeaf__ _Rope_RopeLeaf<_CharT,_Alloc>
+#   define __RopeRep__ _Rope_RopeRep<_CharT,_Alloc>
+#   define _RopeLeaf _Rope_RopeLeaf<_CharT,_Alloc>
+#   define _RopeRep _Rope_RopeRep<_CharT,_Alloc>
+#   define size_type size_t
+# else
+#   define __RopeLeaf__ _STLP_TYPENAME_ON_RETURN_TYPE rope<_CharT,_Alloc>::_RopeLeaf
+#   define __RopeRep__ _STLP_TYPENAME_ON_RETURN_TYPE rope<_CharT,_Alloc>::_RopeRep
+# endif
+
+// Concatenate a C string onto a leaf rope by copying the rope data.
+// Used for short ropes.
+template <class _CharT, class _Alloc>
+__RopeLeaf__*
+rope<_CharT,_Alloc>::_S_leaf_concat_char_iter
+		(_RopeLeaf* __r, const _CharT* __iter, size_t __len)
+{
+    size_t __old_len = __r->_M_size._M_data;
+    _CharT* __new_data = __r->_M_size.allocate(_S_rounded_up_size(__old_len + __len));
+    _RopeLeaf* __result;
+    
+    uninitialized_copy_n(__r->_M_data, __old_len, __new_data);
+    uninitialized_copy_n(__iter, __len, __new_data + __old_len);
+    _S_cond_store_eos(__new_data[__old_len + __len]);
+    _STLP_TRY {
+	__result = _S_new_RopeLeaf(__new_data, __old_len + __len,
+				   __r->get_allocator());
+    }
+    _STLP_UNWIND(_RopeRep::_S_free_string(__new_data, __old_len + __len,
+					     __r->get_allocator()));
+    return __result;
+}
+
+#ifndef __GC
+// As above, but it's OK to clobber original if refcount is 1
+template <class _CharT, class _Alloc>
+__RopeLeaf__*
+rope<_CharT,_Alloc>::_S_destr_leaf_concat_char_iter
+		(_RopeLeaf* __r, const _CharT* __iter, size_t __len)
+{
+    _STLP_ASSERT(__r->_M_ref_count >= 1)
+    if (__r->_M_ref_count > 1)
+      return _S_leaf_concat_char_iter(__r, __iter, __len);
+    size_t __old_len = __r->_M_size._M_data;
+    if (_S_allocated_capacity(__old_len) >= __old_len + __len) {
+	// The space has been partially initialized for the standard
+	// character types.  But that doesn't matter for those types.
+	uninitialized_copy_n(__iter, __len, __r->_M_data + __old_len);
+	if (_S_is_basic_char_type((_CharT*)0)) {
+	    _S_cond_store_eos(__r->_M_data[__old_len + __len]);
+	    _STLP_ASSERT(__r->_M_c_string == __r->_M_data)
+	} else if (__r->_M_c_string != __r->_M_data && 0 != __r->_M_c_string) {
+	    __r->_M_free_c_string();
+	    __r->_M_c_string = 0;
+	}
+	__r->_M_size._M_data = __old_len + __len;
+	_STLP_ASSERT(__r->_M_ref_count == 1)
+	__r->_M_ref_count = 2;
+	return __r;
+    } else {
+	_RopeLeaf* __result = _S_leaf_concat_char_iter(__r, __iter, __len);
+	_STLP_ASSERT(__result->_M_ref_count == 1)
+	return __result;
+    }
+}
+#endif
+
+// Assumes left and right are not 0.
+// Does not increment (nor decrement on exception) child reference counts.
+// Result has ref count 1.
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_tree_concat (_RopeRep* __left, _RopeRep* __right)
+{
+    _RopeConcatenation* __result =
+      _S_new_RopeConcatenation(__left, __right, __left->get_allocator());
+    size_t __depth = __result->_M_depth;
+    
+    _STLP_ASSERT(__left->get_allocator() == __right->get_allocator())
+    if (__depth > 20 && (__result->_M_size._M_data < 1000 ||
+			 __depth > _RopeRep::_S_max_rope_depth)) {
+        _RopeRep* __balanced;
+      
+	_STLP_TRY {
+	   __balanced = _S_balance(__result);
+#          ifndef __GC
+	     if (__result != __balanced) {
+		_STLP_ASSERT(1 == __result->_M_ref_count
+			     && 1 == __balanced->_M_ref_count)
+	     }
+#          endif
+	   __result->_M_unref_nonnil();
+        }
+      _STLP_UNWIND((_STLP_CREATE_ALLOCATOR(allocator_type,(allocator_type&)__left->_M_size,
+                                    _RopeConcatenation).deallocate(__result,1)));
+		// In case of exception, we need to deallocate
+		// otherwise dangling result node.  But caller
+		// still owns its children.  Thus unref is
+		// inappropriate.
+	return __balanced;
+    } else {
+	return __result;
+    }
+}
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_concat_char_iter
+		(_RopeRep* __r, const _CharT*__s, size_t __slen)
+{
+    _RopeRep* __result;
+    if (0 == __slen) {
+	_S_ref(__r);
+	return __r;
+    }
+    if (0 == __r)
+      return _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
+					      /* __r->get_allocator()*/ allocator_type() );
+    if (_RopeRep::_S_leaf == __r->_M_tag && 
+          __r->_M_size._M_data + __slen <= _S_copy_max) {
+	__result = _S_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
+#       ifndef __GC
+	  _STLP_ASSERT(1 == __result->_M_ref_count)
+#       endif
+	return __result;
+    }
+    if (_RopeRep::_S_concat == __r->_M_tag
+	&& _RopeRep::_S_leaf == ((_RopeConcatenation*)__r)->_M_right->_M_tag) {
+	_RopeLeaf* __right = 
+	  (_RopeLeaf* )(((_RopeConcatenation* )__r)->_M_right);
+	if (__right->_M_size._M_data + __slen <= _S_copy_max) {
+	  _RopeRep* __left = ((_RopeConcatenation*)__r)->_M_left;
+	  _RopeRep* __nright = 
+	    _S_leaf_concat_char_iter((_RopeLeaf*)__right, __s, __slen);
+	  __left->_M_ref_nonnil();
+	  _STLP_TRY {
+	    __result = _S_tree_concat(__left, __nright);
+          }
+	  _STLP_UNWIND(_S_unref(__left); _S_unref(__nright));
+#         ifndef __GC
+	    _STLP_ASSERT(1 == __result->_M_ref_count)
+#         endif
+	  return __result;
+	}
+    }
+    _RopeRep* __nright =
+      _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator());
+    _STLP_TRY {
+      __r->_M_ref_nonnil();
+      __result = _S_tree_concat(__r, __nright);
+    }
+    _STLP_UNWIND(_S_unref(__r); _S_unref(__nright));
+#   ifndef __GC
+      _STLP_ASSERT(1 == __result->_M_ref_count)
+#   endif
+    return __result;
+}
+
+#ifndef __GC
+template <class _CharT, class _Alloc>
+__RopeRep__* 
+rope<_CharT,_Alloc>::_S_destr_concat_char_iter(
+  _RopeRep* __r, const _CharT* __s, size_t __slen)
+{
+    _RopeRep* __result;
+    if (0 == __r)
+      return _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen,
+					      /* __r-> */allocator_type());
+    size_t __count = __r->_M_ref_count;
+    size_t __orig_size = __r->_M_size._M_data;
+    _STLP_ASSERT(__count >= 1)
+    if (__count > 1) return _S_concat_char_iter(__r, __s, __slen);
+    if (0 == __slen) {
+	__r->_M_ref_count = 2;      // One more than before
+	return __r;
+    }
+    if (__orig_size + __slen <= _S_copy_max && 
+          _RopeRep::_S_leaf == __r->_M_tag) {
+	__result = _S_destr_leaf_concat_char_iter((_RopeLeaf*)__r, __s, __slen);
+	return __result;
+    }
+    if (_RopeRep::_S_concat == __r->_M_tag) {
+	_RopeLeaf* __right = (_RopeLeaf*)(((_RopeConcatenation*)__r)->_M_right);
+	if (_RopeRep::_S_leaf == __right->_M_tag
+	    && __right->_M_size._M_data + __slen <= _S_copy_max) {
+	  _RopeRep* __new_right = 
+	    _S_destr_leaf_concat_char_iter(__right, __s, __slen);
+	  if (__right == __new_right) {
+	      _STLP_ASSERT(__new_right->_M_ref_count == 2)
+	      __new_right->_M_ref_count = 1;
+	  } else {
+	      _STLP_ASSERT(__new_right->_M_ref_count >= 1)
+	      __right->_M_unref_nonnil();
+	  }
+	  _STLP_ASSERT(__r->_M_ref_count == 1)
+	  __r->_M_ref_count = 2;    // One more than before.
+      ((_RopeConcatenation*)__r)->_M_right = __new_right;
+      // E.Musser : moved below
+      //	  __r->_M_size._M_data = __orig_size + __slen;
+	  if (0 != __r->_M_c_string) {
+	      __r->_M_free_c_string();
+	      __r->_M_c_string = 0;
+	  }
+	  __r->_M_size._M_data = __orig_size + __slen;
+	  return __r;
+	}
+    }
+    _RopeRep* __right =
+      _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __slen, __r->get_allocator());
+    __r->_M_ref_nonnil();
+    _STLP_TRY {
+      __result = _S_tree_concat(__r, __right);
+    }
+    _STLP_UNWIND(_S_unref(__r); _S_unref(__right))
+    _STLP_ASSERT(1 == __result->_M_ref_count)
+    return __result;
+}
+#endif /* !__GC */
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_concat_rep(_RopeRep* __left, _RopeRep* __right)
+{
+    if (0 == __left) {
+	_S_ref(__right);
+	return __right;
+    }
+    if (0 == __right) {
+	__left->_M_ref_nonnil();
+	return __left;
+    }
+    if (_RopeRep::_S_leaf == __right->_M_tag) {
+	if (_RopeRep::_S_leaf == __left->_M_tag) {
+	  if (__right->_M_size._M_data + __left->_M_size._M_data <= _S_copy_max) {
+	    return _S_leaf_concat_char_iter((_RopeLeaf*)__left,
+					 ((_RopeLeaf*)__right)->_M_data,
+					 __right->_M_size._M_data);
+	  }
+	} else if (_RopeRep::_S_concat == __left->_M_tag
+		   && _RopeRep::_S_leaf ==
+		      ((_RopeConcatenation*)__left)->_M_right->_M_tag) {
+	  _RopeLeaf* __leftright =
+		    (_RopeLeaf*)(((_RopeConcatenation*)__left)->_M_right); 
+	  if (__leftright->_M_size._M_data + __right->_M_size._M_data <= _S_copy_max) {
+	    _RopeRep* __leftleft = ((_RopeConcatenation*)__left)->_M_left;
+	    _RopeRep* __rest = _S_leaf_concat_char_iter(__leftright,
+					   ((_RopeLeaf*)__right)->_M_data,
+					   __right->_M_size._M_data);
+	    __leftleft->_M_ref_nonnil();
+	    _STLP_TRY {
+	      return(_S_tree_concat(__leftleft, __rest));
+            }
+	    _STLP_UNWIND(_S_unref(__leftleft); _S_unref(__rest))
+	  }
+	}
+    }
+    __left->_M_ref_nonnil();
+    __right->_M_ref_nonnil();
+    _STLP_TRY {
+      return(_S_tree_concat(__left, __right));
+    }
+    _STLP_UNWIND(_S_unref(__left); _S_unref(__right));
+#ifdef _STLP_THROW_RETURN_BUG
+	return 0;
+#endif
+}
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_substring(_RopeRep* __base, 
+                               size_t __start, size_t __endp1)
+{
+    if (0 == __base) return 0;
+    size_t __len = __base->_M_size._M_data;
+    size_t __adj_endp1;
+    const size_t __lazy_threshold = 128;
+    
+    if (__endp1 >= __len) {
+	if (0 == __start) {
+	    __base->_M_ref_nonnil();
+	    return __base;
+	} else {
+	    __adj_endp1 = __len;
+	}
+    } else {
+	__adj_endp1 = __endp1;
+    }
+    switch(__base->_M_tag) {
+	case _RopeRep::_S_concat:
+	    {
+		_RopeConcatenation* __c = (_RopeConcatenation*)__base;
+		_RopeRep* __left = __c->_M_left;
+		_RopeRep* __right = __c->_M_right;
+		size_t __left_len = __left->_M_size._M_data;
+		_RopeRep* __result;
+
+		if (__adj_endp1 <= __left_len) {
+		    return _S_substring(__left, __start, __endp1);
+		} else if (__start >= __left_len) {
+		    return _S_substring(__right, __start - __left_len,
+				  __adj_endp1 - __left_len);
+		}
+		_Self_destruct_ptr __left_result(
+		  _S_substring(__left, __start, __left_len));
+		_Self_destruct_ptr __right_result(
+		  _S_substring(__right, 0, __endp1 - __left_len));
+		_STLP_MPWFIX_TRY		//*TY 06/01/2000 - mpw forgets to call dtor on __left_result and __right_result without this try block
+		__result = _S_concat_rep(__left_result, __right_result);
+#               ifndef __GC
+		  _STLP_ASSERT(1 == __result->_M_ref_count)
+#               endif
+		return __result;
+		_STLP_MPWFIX_CATCH		//*TY 06/01/2000 - 
+	    }
+	case _RopeRep::_S_leaf:
+	    {
+		_RopeLeaf* __l = (_RopeLeaf*)__base;
+		_RopeLeaf* __result;
+		size_t __result_len;
+		if (__start >= __adj_endp1) return 0;
+		__result_len = __adj_endp1 - __start;
+		if (__result_len > __lazy_threshold) goto lazy;
+#               ifdef __GC
+		    const _CharT* __section = __l->_M_data + __start;
+		    __result = _S_new_RopeLeaf(__section, __result_len,
+					  __base->get_allocator());
+		    __result->_M_c_string = 0;  // Not eos terminated.
+#               else
+		    // We should sometimes create substring node instead.
+		    __result = _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(
+					__l->_M_data + __start, __result_len,
+					__base->get_allocator());
+#               endif
+		return __result;
+	    }
+	case _RopeRep::_S_substringfn:
+	    // Avoid introducing multiple layers of substring nodes.
+	    {
+		_RopeSubstring* __old = (_RopeSubstring*)__base;
+		size_t __result_len;
+		if (__start >= __adj_endp1) return 0;
+		__result_len = __adj_endp1 - __start;
+		if (__result_len > __lazy_threshold) {
+		    _RopeSubstring* __result =
+			_S_new_RopeSubstring(__old->_M_base,
+					  __start + __old->_M_start,
+					  __adj_endp1 - __start,
+					  __base->get_allocator());
+		    return __result;
+
+		} // *** else fall through: ***
+	    }
+	case _RopeRep::_S_function:
+	    {
+		_RopeFunction* __f = (_RopeFunction*)__base;
+		if (__start >= __adj_endp1) return 0;
+		size_t __result_len = __adj_endp1 - __start;
+
+		if (__result_len > __lazy_threshold) goto lazy;
+		_CharT* __section = __base->_M_size.allocate(_S_rounded_up_size(__result_len));
+		_STLP_TRY {
+		  (*(__f->_M_fn))(__start, __result_len, __section);
+                }
+		_STLP_UNWIND(_RopeRep::_S_free_string(
+	               __section, __result_len, __base->get_allocator()));
+		_S_cond_store_eos(__section[__result_len]);
+		return _S_new_RopeLeaf(__section, __result_len,
+				       __base->get_allocator());
+	    }
+    }
+    /*NOTREACHED*/
+    _STLP_ASSERT(false)
+  lazy:
+    {
+	// Create substring node.
+	return _S_new_RopeSubstring(__base, __start, __adj_endp1 - __start,
+			       __base->get_allocator());
+    }
+}
+
+template<class _CharT>
+class _Rope_flatten_char_consumer : public _Rope_char_consumer<_CharT> {
+    private:
+	_CharT* _M_buf_ptr;
+    public:
+	//  _CharT* _M_buffer;  // XXX not used
+
+	_Rope_flatten_char_consumer(_CharT* __buffer) {
+	    _M_buf_ptr = __buffer;
+	};
+	~_Rope_flatten_char_consumer() {}
+	bool operator() (const _CharT* __leaf, size_t __n) {
+	    uninitialized_copy_n(__leaf, __n, _M_buf_ptr);
+	    _M_buf_ptr += __n;
+	    return true;
+	}
+};
+	    
+template<class _CharT>
+class _Rope_find_char_char_consumer : public _Rope_char_consumer<_CharT> {
+    private:
+	_CharT _M_pattern;
+    public:
+	size_t _M_count;  // Number of nonmatching characters
+	_Rope_find_char_char_consumer(_CharT __p) 
+	  : _M_pattern(__p), _M_count(0) {}
+	~_Rope_find_char_char_consumer() {}
+	bool operator() (const _CharT* __leaf, size_t __n) {
+	    size_t __i;
+	    for (__i = 0; __i < __n; __i++) {
+		if (__leaf[__i] == _M_pattern) {
+		    _M_count += __i; return false;
+		}
+	    }
+	    _M_count += __n; return true;
+	}
+};
+
+#if !defined (_STLP_USE_NO_IOSTREAMS)	    
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+  template<class _CharT, class _Traits>
+  // Here _CharT is both the stream and rope character type.
+#else
+ template<class _CharT>
+  // Here _CharT is the rope character type.  Unlike in the
+  // above case, we somewhat handle the case in which it doesn't
+  // match the stream character type, i.e. char.
+#endif
+class _Rope_insert_char_consumer : public _Rope_char_consumer<_CharT> {
+    private:
+#       if defined (_STLP_USE_NEW_IOSTREAMS)
+	  typedef basic_ostream<_CharT,_Traits> _Insert_ostream;
+#	else
+ 	typedef ostream _Insert_ostream;
+#	endif
+	_Insert_ostream& _M_o;
+    public:
+	// _CharT* buffer;    // XXX not used
+	_Rope_insert_char_consumer(_Insert_ostream& __writer) 
+	  : _M_o(__writer) {};
+#if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))		//*TY 05/23/2000 - added support for mpw compiler's trigger function approach to generate vtable
+  ~_Rope_insert_char_consumer();		//*TY 05/23/2000 - 
+#else		//*TY 05/23/2000 - 
+  ~_Rope_insert_char_consumer() {}
+#endif		//*TY 05/23/2000 - 
+		// Caller is presumed to own the ostream
+	bool operator() (const _CharT* __leaf, size_t __n);
+		// Returns true to continue traversal.
+};
+	    
+# if defined ( _STLP_USE_NEW_IOSTREAMS )
+#  if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))		//*TY 05/23/2000 - added support for mpw compiler's trigger function approach to generate vtable
+  template<class _CharT, class _Traits>
+  _Rope_insert_char_consumer<_CharT, _Traits>::  ~_Rope_insert_char_consumer() {}
+#  endif		//*TY 05/23/2000 - 
+
+  template<class _CharT, class _Traits>
+  bool _Rope_insert_char_consumer<_CharT, _Traits>::operator()
+					(const _CharT* __leaf, size_t __n)
+{
+    size_t __i;
+    //  We assume that formatting is set up correctly for each element.
+    for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]);
+    return true;
+}
+# else
+#  if defined(__MRC__)||(defined(__SC__) && !defined(__DMC__))		//*TY 05/23/2000 - added support for mpw compiler's trigger function approach to generate vtable
+  template<class _CharT>
+  _Rope_insert_char_consumer<_CharT>::  ~_Rope_insert_char_consumer() {}
+#  endif		//*TY 05/23/2000 - 
+
+  template<class _CharT>
+  bool _Rope_insert_char_consumer<_CharT>::operator()
+					(const _CharT* __leaf, size_t __n)
+  {
+    size_t __i;
+    //  We assume that formatting is set up correctly for each element.
+    for (__i = 0; __i < __n; __i++) _M_o << __leaf[__i];
+    return true;
+  }
+
+# if !defined (_STLP_NO_METHOD_SPECIALIZATION)
+_STLP_TEMPLATE_NULL
+inline bool 
+_Rope_insert_char_consumer<char>::operator()
+					(const char* __leaf, size_t __n)
+{
+    size_t __i;
+    for (__i = 0; __i < __n; __i++) _M_o.put(__leaf[__i]);
+    return true;
+}
+
+#endif /* _STLP_METHOD_SPECIALIZATION */
+#endif /* _STLP_USE_NEW_IOSTREAM */
+#endif /* if !defined (_STLP_USE_NO_IOSTREAMS) */
+
+template <class _CharT, class _Alloc>
+bool rope<_CharT, _Alloc>::_S_apply_to_pieces(
+				_Rope_char_consumer<_CharT>& __c,
+				const _RopeRep* __r,
+				size_t __begin, size_t __end)
+{
+    if (0 == __r) return true;
+    switch(__r->_M_tag) {
+	case _RopeRep::_S_concat:
+	    {
+		_RopeConcatenation* __conc = (_RopeConcatenation*)__r;
+		_RopeRep* __left =  __conc->_M_left;
+		size_t __left_len = __left->_M_size._M_data;
+		if (__begin < __left_len) {
+		    size_t __left_end = (min) (__left_len, __end);
+		    if (!_S_apply_to_pieces(__c, __left, __begin, __left_end))
+			return false;
+		}
+		if (__end > __left_len) {
+		    _RopeRep* __right =  __conc->_M_right;
+		    size_t __right_start = (max)(__left_len, __begin);
+		    if (!_S_apply_to_pieces(__c, __right,
+					 __right_start - __left_len,
+					 __end - __left_len)) {
+			return false;
+		    }
+		}
+	    }
+	    return true;
+	case _RopeRep::_S_leaf:
+	    {
+		_RopeLeaf* __l = (_RopeLeaf*)__r;
+		return __c.operator()(__l->_M_data + __begin, __end - __begin);
+	    }
+	case _RopeRep::_S_function:
+	case _RopeRep::_S_substringfn:
+	    {
+		_RopeFunction* __f = (_RopeFunction*)__r;
+		size_t __len = __end - __begin;
+		bool __result;
+		_CharT* __buffer =
+		  (_CharT*)__sgi_alloc::allocate(__len * sizeof(_CharT));
+		_STLP_TRY {
+		  (*(__f->_M_fn))(__begin, __len, __buffer);
+		  __result = __c.operator()(__buffer, __len);
+                  __sgi_alloc::deallocate(__buffer, __len * sizeof(_CharT));
+                }
+		_STLP_UNWIND((__sgi_alloc::deallocate(__buffer,
+						      __len * sizeof(_CharT))))
+		return __result;
+	    }
+	default:
+	    _STLP_ASSERT(false)
+	    /*NOTREACHED*/
+	    return false;
+    }
+}
+
+template <class _CharT> inline bool _Rope_is_simple(_CharT*) { return false; }
+inline bool _Rope_is_simple(char*) { return true; }
+# ifdef _STLP_HAS_WCHAR_T
+inline bool _Rope_is_simple(wchar_t*) { return true; }
+# endif
+
+#if !defined (_STLP_USE_NO_IOSTREAMS)
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+  template<class _CharT, class _Traits>
+  inline void _Rope_fill(basic_ostream<_CharT, _Traits>& __o, size_t __n)
+#else
+inline void _Rope_fill(ostream& __o, size_t __n)
+#endif
+{
+    char __f = __o.fill();
+    size_t __i;
+
+    for (__i = 0; __i < __n; __i++) __o.put(__f);
+}
+    
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+  template<class _CharT, class _Traits, class _Alloc>
+  basic_ostream<_CharT, _Traits>& operator<<
+					(basic_ostream<_CharT, _Traits>& __o,
+					 const rope<_CharT, _Alloc>& __r)
+# else
+template<class _CharT, class _Alloc>
+ostream& operator<< (ostream& __o, const rope<_CharT, _Alloc>& __r)
+#endif
+{
+    size_t __w = __o.width();
+    bool __left = bool(__o.flags() & ios::left);
+    size_t __pad_len;
+    size_t __rope_len = __r.size();
+#   if defined (_STLP_USE_NEW_IOSTREAMS)
+      _Rope_insert_char_consumer<_CharT, _Traits> __c(__o);
+#   else
+    _Rope_insert_char_consumer<_CharT> __c(__o);
+#   endif
+    bool __is_simple = _Rope_is_simple((_CharT*)0);
+    
+    if (__rope_len < __w) {
+	__pad_len = __w - __rope_len;
+    } else {
+	__pad_len = 0;
+    }
+    if (!__is_simple) __o.width(__w/__rope_len);
+    _STLP_TRY {
+      if (__is_simple && !__left && __pad_len > 0) {
+	_Rope_fill(__o, __pad_len);
+      }
+      __r.apply_to_pieces(0, __r.size(), __c);
+      if (__is_simple && __left && __pad_len > 0) {
+	_Rope_fill(__o, __pad_len);
+      }
+      if (!__is_simple)
+        __o.width(__w);
+    }
+    _STLP_UNWIND(if (!__is_simple) __o.width(__w))
+    return __o;
+}
+
+#endif /* NO_IOSTREAMS */
+
+template <class _CharT, class _Alloc>
+_CharT*
+rope<_CharT,_Alloc>::_S_flatten(_RopeRep* __r,
+				 size_t __start, size_t __len,
+				 _CharT* __buffer)
+{
+    _Rope_flatten_char_consumer<_CharT> __c(__buffer);
+    _S_apply_to_pieces(__c, __r, __start, __start + __len);
+    return(__buffer + __len);
+}
+
+template <class _CharT, class _Alloc>
+size_t
+rope<_CharT,_Alloc>::find(_CharT __pattern, size_t __start) const
+{
+    _Rope_find_char_char_consumer<_CharT> __c(__pattern);
+    _S_apply_to_pieces(__c, _M_tree_ptr._M_data, __start, size());
+    size_type __result_pos = __start + __c._M_count;
+#   ifndef _STLP_OLD_ROPE_SEMANTICS
+	if (__result_pos == size()) __result_pos = npos;
+#   endif
+    return __result_pos;
+}
+
+template <class _CharT, class _Alloc>
+_CharT*
+rope<_CharT,_Alloc>::_S_flatten(_Rope_RopeRep<_CharT, _Alloc>* __r, _CharT* __buffer)
+{
+    if (0 == __r) return __buffer;
+    switch(__r->_M_tag) {
+	case _RopeRep::_S_concat:
+	    {
+		_RopeConcatenation* __c = (_RopeConcatenation*)__r;
+		_RopeRep* __left = __c->_M_left;
+		_RopeRep* __right = __c->_M_right;
+		_CharT* __rest = _S_flatten(__left, __buffer);
+		return _S_flatten(__right, __rest);
+	    }
+	case _RopeRep::_S_leaf:
+	    {
+		_RopeLeaf* __l = (_RopeLeaf*)__r;
+		return copy_n(__l->_M_data, __l->_M_size._M_data, __buffer).second;
+	    }
+	case _RopeRep::_S_function:
+	case _RopeRep::_S_substringfn:
+	    // We dont yet do anything with substring nodes.
+	    // This needs to be fixed before ropefiles will work well.
+	    {
+		_RopeFunction* __f = (_RopeFunction*)__r;
+		(*(__f->_M_fn))(0, __f->_M_size._M_data, __buffer);
+		return __buffer + __f->_M_size._M_data;
+	    }
+	default:
+	    _STLP_ASSERT(false)
+	    /*NOTREACHED*/
+	    return 0;
+    }
+}
+
+
+// This needs work for _CharT != char
+template <class _CharT, class _Alloc>
+void
+rope<_CharT,_Alloc>::_S_dump(_RopeRep* __r, int __indent)
+{
+    for (int __i = 0; __i < __indent; __i++) putchar(' ');
+    if (0 == __r) {
+      printf("NULL\n"); return;
+    }
+    if (_RopeRep::_S_concat == __r->_M_tag) {
+	_RopeConcatenation* __c = (_RopeConcatenation*)__r;
+	_RopeRep* __left = __c->_M_left;
+	_RopeRep* __right = __c->_M_right;
+
+#       ifdef __GC
+	  printf("Concatenation %p (depth = %d, len = %ld, %s balanced)\n",
+	    __r, __r->_M_depth, __r->_M_size._M_data, __r->_M_is_balanced? "" : "not");
+#       else
+	  printf("Concatenation %p (rc = %ld, depth = %d, "
+	           "len = %ld, %s balanced)\n",
+		 __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size._M_data,
+		 __r->_M_is_balanced? "" : "not");
+#       endif
+	_S_dump(__left, __indent + 2);
+	_S_dump(__right, __indent + 2);
+	return;
+    } else {
+	const char* __kind;
+
+	switch (__r->_M_tag) {
+	    case _RopeRep::_S_leaf:
+		__kind = "Leaf";
+		break;
+	    case _RopeRep::_S_function:
+		__kind = "Function";
+		break;
+	    case _RopeRep::_S_substringfn:
+		__kind = "Function representing substring";
+		break;
+	    default:
+		__kind = "(corrupted kind field!)";
+	}
+#       ifdef __GC
+	  printf("%s %p (depth = %d, len = %ld) ",
+		 __kind, __r, __r->_M_depth, __r->_M_size._M_data);
+#       else
+	  printf("%s %p (rc = %ld, depth = %d, len = %ld) ",
+		 __kind, __r, __r->_M_ref_count, __r->_M_depth, __r->_M_size._M_data);
+#       endif
+	if (_S_is_one_byte_char_type((_CharT*)0)) {
+	    const int __max_len = 40;
+	    _Self_destruct_ptr __prefix(_S_substring(__r, 0, __max_len));
+	    _CharT __buffer[__max_len + 1];
+	    bool __too_big = __r->_M_size._M_data > __prefix->_M_size._M_data;
+
+	    _S_flatten(__prefix, __buffer);
+	    __buffer[__prefix->_M_size._M_data] = _S_eos((_CharT*)0); 
+	    printf("%s%s\n", 
+	           (char*)__buffer, __too_big? "...\n" : "\n");
+	} else {
+	    printf("\n");
+	}
+    }
+}
+
+# define __ROPE_TABLE_BODY  = { \
+/* 0 */1, /* 1 */2, /* 2 */3, /* 3 */5, /* 4 */8, /* 5 */13, /* 6 */21,         \
+/* 7 */34, /* 8 */55, /* 9 */89, /* 10 */144, /* 11 */233, /* 12 */377,         \
+/* 13 */610, /* 14 */987, /* 15 */1597, /* 16 */2584, /* 17 */4181,             \
+/* 18 */6765ul, /* 19 */10946ul, /* 20 */17711ul, /* 21 */28657ul, /* 22 */46368ul,   \
+/* 23 */75025ul, /* 24 */121393ul, /* 25 */196418ul, /* 26 */317811ul,                \
+/* 27 */514229ul, /* 28 */832040ul, /* 29 */1346269ul, /* 30 */2178309ul,             \
+/* 31 */3524578ul, /* 32 */5702887ul, /* 33 */9227465ul, /* 34 */14930352ul,          \
+/* 35 */24157817ul, /* 36 */39088169ul, /* 37 */63245986ul, /* 38 */102334155ul,      \
+/* 39 */165580141ul, /* 40 */267914296ul, /* 41 */433494437ul,                        \
+/* 42 */701408733ul, /* 43 */1134903170ul, /* 44 */1836311903ul,                      \
+/* 45 */2971215073ul }
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _CharT, class _Alloc>
+const unsigned long
+rope<_CharT,_Alloc>::_S_min_len[__ROPE_DEPTH_SIZE] __ROPE_TABLE_BODY ;
+# else 
+__DECLARE_INSTANCE(const unsigned long, 
+                   crope::_S_min_len[__ROPE_DEPTH_SIZE],
+                   __ROPE_TABLE_BODY);
+#  ifndef _STLP_NO_WCHAR_T
+__DECLARE_INSTANCE(const unsigned long, 
+                   wrope::_S_min_len[__ROPE_DEPTH_SIZE],
+                   __ROPE_TABLE_BODY);
+#  endif
+# endif
+# undef __ROPE_DEPTH_SIZE
+# undef __ROPE_MAX_DEPTH
+# undef __ROPE_TABLE_BODY
+
+// These are Fibonacci numbers < 2**32.
+
+template <class _CharT, class _Alloc>
+__RopeRep__*
+rope<_CharT,_Alloc>::_S_balance(_RopeRep* __r)
+{
+    _RopeRep* __forest[_RopeRep::_S_max_rope_depth + 1];
+    _RopeRep* __result = 0;
+    int __i;
+    // Invariant:
+    // The concatenation of forest in descending order is equal to __r.
+    // __forest[__i]._M_size._M_data >= _S_min_len[__i]
+    // __forest[__i]._M_depth = __i
+    // References from forest are included in refcount.
+
+    for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i) 
+      __forest[__i] = 0;
+    _STLP_TRY {
+      _S_add_to_forest(__r, __forest);
+      for (__i = 0; __i <= _RopeRep::_S_max_rope_depth; ++__i) 
+        if (0 != __forest[__i]) {
+#	ifndef __GC
+	  _Self_destruct_ptr __old(__result);
+#	endif
+	  __result = _S_concat_rep(__forest[__i], __result);
+	__forest[__i]->_M_unref_nonnil();
+#	if !defined(__GC) && defined(_STLP_USE_EXCEPTIONS)
+	  __forest[__i] = 0;
+#	endif
+      }
+    }
+    _STLP_UNWIND(for(__i = 0; __i <= _RopeRep::_S_max_rope_depth; __i++)
+		 _S_unref(__forest[__i]))
+    if (__result->_M_depth > _RopeRep::_S_max_rope_depth) {
+	__stl_throw_range_error("rope too long");
+    }
+    return(__result);
+}
+
+
+template <class _CharT, class _Alloc>
+void
+rope<_CharT,_Alloc>::_S_add_to_forest(_RopeRep* __r, _RopeRep** __forest)
+{
+    if (__r -> _M_is_balanced) {
+	_S_add_leaf_to_forest(__r, __forest);
+	return;
+    }
+    _STLP_ASSERT(__r->_M_tag == _RopeRep::_S_concat)
+    {
+	_RopeConcatenation* __c = (_RopeConcatenation*)__r;
+
+	_S_add_to_forest(__c->_M_left, __forest);
+	_S_add_to_forest(__c->_M_right, __forest);
+    }
+}
+
+
+template <class _CharT, class _Alloc>
+void
+rope<_CharT,_Alloc>::_S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest)
+{
+    _RopeRep* __insertee;   		// included in refcount
+    _RopeRep* __too_tiny = 0;    	// included in refcount
+    int __i;  				// forest[0..__i-1] is empty
+    size_t __s = __r->_M_size._M_data;
+
+    for (__i = 0; __s >= _S_min_len[__i+1]/* not this bucket */; ++__i) {
+	if (0 != __forest[__i]) {
+#	    ifndef __GC
+	      _Self_destruct_ptr __old(__too_tiny);
+#	    endif
+	    __too_tiny = _S_concat_and_set_balanced(__forest[__i], __too_tiny);
+	    __forest[__i]->_M_unref_nonnil();
+	    __forest[__i] = 0;
+	}
+    }
+    {
+#	ifndef __GC
+	  _Self_destruct_ptr __old(__too_tiny);
+#	endif
+	__insertee = _S_concat_and_set_balanced(__too_tiny, __r);
+    }
+    // Too_tiny dead, and no longer included in refcount.
+    // Insertee is live and included.
+    _STLP_ASSERT(_S_is_almost_balanced(__insertee))
+    _STLP_ASSERT(__insertee->_M_depth <= __r->_M_depth + 1)
+    for (;; ++__i) {
+	if (0 != __forest[__i]) {
+#	    ifndef __GC
+	      _Self_destruct_ptr __old(__insertee);
+#	    endif
+	    __insertee = _S_concat_and_set_balanced(__forest[__i], __insertee);
+	    __forest[__i]->_M_unref_nonnil();
+	    __forest[__i] = 0;
+	    _STLP_ASSERT(_S_is_almost_balanced(__insertee))
+	}
+	_STLP_ASSERT(_S_min_len[__i] <= __insertee->_M_size._M_data)
+	_STLP_ASSERT(__forest[__i] == 0)
+	if (__i == _RopeRep::_S_max_rope_depth || 
+	      __insertee->_M_size._M_data < _S_min_len[__i+1]) {
+	    __forest[__i] = __insertee;
+	    // refcount is OK since __insertee is now dead.
+	    return;
+	}
+    }
+}
+
+template <class _CharT, class _Alloc>
+_CharT
+rope<_CharT,_Alloc>::_S_fetch(_RopeRep* __r, size_type __i)
+{
+    __GC_CONST _CharT* __cstr = __r->_M_c_string;
+
+    _STLP_ASSERT(__i < __r->_M_size._M_data)
+    if (0 != __cstr) return __cstr[__i]; 
+    for(;;) {
+      switch(__r->_M_tag) {
+	case _RopeRep::_S_concat:
+	    {
+		_RopeConcatenation* __c = (_RopeConcatenation*)__r;
+		_RopeRep* __left = __c->_M_left;
+		size_t __left_len = __left->_M_size._M_data;
+
+		if (__i >= __left_len) {
+		    __i -= __left_len;
+		    __r = __c->_M_right;
+		} else {
+		    __r = __left;
+		}
+	    }
+	    break;
+	case _RopeRep::_S_leaf:
+	    {
+		_RopeLeaf* __l = (_RopeLeaf*)__r;
+		return __l->_M_data[__i];
+	    }
+	case _RopeRep::_S_function:
+	case _RopeRep::_S_substringfn:
+	    {
+		_RopeFunction* __f = (_RopeFunction*)__r;
+		_CharT __result;
+
+		(*(__f->_M_fn))(__i, 1, &__result);
+		return __result;
+	    }
+      }
+    }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+    return 0;
+#endif
+}
+
+# ifndef __GC
+// Return a uniquely referenced character slot for the given
+// position, or 0 if that's not possible.
+template <class _CharT, class _Alloc>
+_CharT*
+rope<_CharT,_Alloc>::_S_fetch_ptr(_RopeRep* __r, size_type __i)
+{
+    _RopeRep* __clrstack[_RopeRep::_S_max_rope_depth];
+    size_t __csptr = 0;
+
+    for(;;) {
+      if (__r->_M_ref_count > 1) return 0;
+      switch(__r->_M_tag) {
+	case _RopeRep::_S_concat:
+	    {
+		_RopeConcatenation* __c = (_RopeConcatenation*)__r;
+		_RopeRep* __left = __c->_M_left;
+		size_t __left_len = __left->_M_size._M_data;
+
+		if (__c->_M_c_string != 0) __clrstack[__csptr++] = __c;
+		if (__i >= __left_len) {
+		    __i -= __left_len;
+		    __r = __c->_M_right;
+		} else {
+		    __r = __left;
+		}
+	    }
+	    break;
+	case _RopeRep::_S_leaf:
+	    {
+		_RopeLeaf* __l = (_RopeLeaf*)__r;
+		if (__l->_M_c_string != __l->_M_data && __l->_M_c_string != 0)
+		    __clrstack[__csptr++] = __l;
+		while (__csptr > 0) {
+		    -- __csptr;
+		    _RopeRep* __d = __clrstack[__csptr];
+		    __d->_M_free_c_string();
+		    __d->_M_c_string = 0;
+		}
+		return __l->_M_data + __i;
+	    }
+	case _RopeRep::_S_function:
+	case _RopeRep::_S_substringfn:
+	    return 0;
+      }
+    }
+#if defined(_STLP_NEED_UNREACHABLE_RETURN)
+    return 0;
+#endif
+
+}
+# endif /* __GC */
+
+// The following could be implemented trivially using
+// lexicographical_compare_3way.
+// We do a little more work to avoid dealing with rope iterators for
+// flat strings.
+template <class _CharT, class _Alloc>
+int
+rope<_CharT,_Alloc>::_S_compare (const _RopeRep* __left, 
+                                 const _RopeRep* __right)
+{
+    size_t __left_len;
+    size_t __right_len;
+
+    if (0 == __right) return 0 != __left;
+    if (0 == __left) return -1;
+    __left_len = __left->_M_size._M_data;
+    __right_len = __right->_M_size._M_data;
+    if (_RopeRep::_S_leaf == __left->_M_tag) {
+	_RopeLeaf* __l = (_RopeLeaf*) __left;
+	if (_RopeRep::_S_leaf == __right->_M_tag) {
+	    _RopeLeaf* __r = (_RopeLeaf*) __right;
+	    return lexicographical_compare_3way(
+			__l->_M_data, __l->_M_data + __left_len,
+			__r->_M_data, __r->_M_data + __right_len);
+	} else {
+	    const_iterator __rstart(__right, 0);
+	    const_iterator __rend(__right, __right_len);
+	    return lexicographical_compare_3way(
+			__l->_M_data, __l->_M_data + __left_len,
+			__rstart, __rend);
+	}
+    } else {
+	const_iterator __lstart(__left, 0);
+	const_iterator __lend(__left, __left_len);
+	if (_RopeRep::_S_leaf == __right->_M_tag) {
+	    _RopeLeaf* __r = (_RopeLeaf*) __right;
+	    return lexicographical_compare_3way(
+				   __lstart, __lend,
+				   __r->_M_data, __r->_M_data + __right_len);
+	} else {
+	    const_iterator __rstart(__right, 0);
+	    const_iterator __rend(__right, __right_len);
+	    return lexicographical_compare_3way(
+				   __lstart, __lend,
+				   __rstart, __rend);
+	}
+    }
+}
+
+// Assignment to reference proxies.
+template <class _CharT, class _Alloc>
+_Rope_char_ref_proxy<_CharT, _Alloc>&
+_Rope_char_ref_proxy<_CharT, _Alloc>::operator= (_CharT __c) {
+    _RopeRep* __old = _M_root->_M_tree_ptr._M_data;
+#   ifndef __GC
+	// First check for the case in which everything is uniquely
+	// referenced.  In that case we can do this destructively.
+	_CharT* __ptr = _My_rope::_S_fetch_ptr(__old, _M_pos);
+	if (0 != __ptr) {
+	    *__ptr = __c;
+	    return *this;
+	}
+#   endif
+    _Self_destruct_ptr __left(
+      _My_rope::_S_substring(__old, 0, _M_pos));
+    _Self_destruct_ptr __right(
+      _My_rope::_S_substring(__old, _M_pos+1, __old->_M_size._M_data));
+    _Self_destruct_ptr __result_left(
+      _My_rope::_S_destr_concat_char_iter(__left, &__c, 1));
+
+#   ifndef __GC
+      _STLP_ASSERT(__left == __result_left || 1 == __result_left->_M_ref_count)
+#   endif
+    _RopeRep* __result =
+      _My_rope::_S_concat_rep(__result_left, __right);
+#   ifndef __GC
+      _STLP_ASSERT(1 <= __result->_M_ref_count)
+      _RopeRep::_S_unref(__old);
+#   endif
+    _M_root->_M_tree_ptr._M_data = __result;
+    return *this;
+}
+
+template <class _CharT, class _Alloc>
+_Rope_char_ptr_proxy<_CharT, _Alloc>
+_Rope_char_ref_proxy<_CharT, _Alloc>::operator& () const {
+    return _Rope_char_ptr_proxy<_CharT, _Alloc>(*this);
+}
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template<class _CharT, class _Alloc>
+_CharT rope<_CharT,_Alloc>::_S_empty_c_str[1] = { _CharT() };
+# else
+__DECLARE_INSTANCE(char, crope::_S_empty_c_str[1], ={0});
+# ifdef _STLP_HAS_WCHAR_T
+__DECLARE_INSTANCE(wchar_t, wrope::_S_empty_c_str[1], ={0});
+# endif /* _STLP_HAS_WCHAR_T */
+# endif /* _STLP_STATIC_TEMPLATE_DATA */
+// # endif
+
+template<class _CharT, class _Alloc>
+const _CharT* rope<_CharT,_Alloc>::c_str() const {
+    if (0 == _M_tree_ptr._M_data) {
+        _S_empty_c_str[0] = _S_eos((_CharT*)0);  // Possibly redundant,
+					     // but probably fast.
+        return _S_empty_c_str;
+    }
+    __GC_CONST _CharT* __old_c_string = _M_tree_ptr._M_data->_M_c_string;
+    if (0 != __old_c_string) return(__old_c_string);
+    size_t __s = size();
+   _CharT* __result = _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_tree_ptr, _CharT).allocate(__s + 1);
+    _S_flatten(_M_tree_ptr._M_data, __result);
+    __result[__s] = _S_eos((_CharT*)0);
+#   ifdef __GC
+	_M_tree_ptr._M_data->_M_c_string = __result;
+#   else
+      if ((__old_c_string = (__GC_CONST _CharT*)
+	   _Atomic_swap((__stl_atomic_t *)(&(_M_tree_ptr._M_data->_M_c_string)),
+			(__stl_atomic_t)__result)) != 0) {
+	// It must have been added in the interim.  Hence it had to have been
+	// separately allocated.  Deallocate the old copy, since we just
+	// replaced it.
+	_STLP_STD::_Destroy(__old_c_string, __old_c_string + __s + 1);
+      _STLP_CREATE_ALLOCATOR(allocator_type,(const allocator_type&)_M_tree_ptr, _CharT).deallocate(__old_c_string, __s + 1);
+      }
+#   endif
+    return(__result);
+}
+
+template<class _CharT, class _Alloc>
+const _CharT* rope<_CharT,_Alloc>::replace_with_c_str() {
+    if (0 == _M_tree_ptr._M_data) {
+        _S_empty_c_str[0] = _S_eos((_CharT*)0);
+        return _S_empty_c_str;
+    }
+    __GC_CONST _CharT* __old_c_string = _M_tree_ptr._M_data->_M_c_string;
+    if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag && 0 != __old_c_string) {
+	return(__old_c_string);
+    }
+    size_t __s = size();
+    _CharT* __result = _M_tree_ptr.allocate(_S_rounded_up_size(__s));
+    _S_flatten(_M_tree_ptr._M_data, __result);
+    __result[__s] = _S_eos((_CharT*)0);
+    _M_tree_ptr._M_data->_M_unref_nonnil();
+    _M_tree_ptr._M_data = _S_new_RopeLeaf(__result, __s, get_allocator());
+    return(__result);
+}
+
+// Algorithm specializations.  More should be added.
+
+#ifndef _STLP_MSVC
+// I couldn't get this to work with VC++
+template<class _CharT,class _Alloc>
+void
+_Rope_rotate(_Rope_iterator<_CharT,_Alloc> __first,
+              _Rope_iterator<_CharT,_Alloc> __middle,
+              _Rope_iterator<_CharT,_Alloc> __last)
+{
+    _STLP_ASSERT(__first.container() == __middle.container()
+                 && __middle.container() == __last.container())
+    rope<_CharT,_Alloc>& __r(__first.container());
+    rope<_CharT,_Alloc> __prefix = __r.substr(0, __first.index());
+    rope<_CharT,_Alloc> __suffix = 
+      __r.substr(__last.index(), __r.size() - __last.index());
+    rope<_CharT,_Alloc> __part1 = 
+      __r.substr(__middle.index(), __last.index() - __middle.index());
+    rope<_CharT,_Alloc> __part2 = 
+      __r.substr(__first.index(), __middle.index() - __first.index());
+    __r = __prefix;
+    __r += __part1;
+    __r += __part2;
+    __r += __suffix;
+}
+
+
+# if 0
+// Probably not useful for several reasons:
+// - for SGIs 7.1 compiler and probably some others,
+//   this forces lots of rope<wchar_t, ...> instantiations, creating a
+//   code bloat and compile time problem.  (Fixed in 7.2.)
+// - wchar_t is 4 bytes wide on most UNIX platforms, making it unattractive
+//   for unicode strings.  Unsigned short may be a better character
+//   type.
+inline void rotate(
+		_Rope_iterator<wchar_t,_STLP_DEFAULT_ALLOCATOR(char) > __first,
+                _Rope_iterator<wchar_t,_STLP_DEFAULT_ALLOCATOR(char) > __middle,
+                _Rope_iterator<wchar_t,_STLP_DEFAULT_ALLOCATOR(char) > __last) {
+    _Rope_rotate(__first, __middle, __last);
+}
+# endif
+#endif /* _STLP_MSVC */
+
+#   undef __RopeLeaf__ 
+#   undef __RopeRep__ 
+#   undef __RopeLeaf 
+#   undef __RopeRep 
+#   undef size_type
+
+_STLP_END_NAMESPACE
+
+# endif /* ROPEIMPL_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_rope.h b/src/STLport/stl/_rope.h
new file mode 100644
index 0000000..d6a09ed
--- /dev/null
+++ b/src/STLport/stl/_rope.h
@@ -0,0 +1,2518 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+// rope<_CharT,_Alloc> is a sequence of _CharT.
+// Ropes appear to be mutable, but update operations
+// really copy enough of the data structure to leave the original
+// valid.  Thus ropes can be logically copied by just copying
+// a pointer value.
+
+#ifndef _STLP_INTERNAL_ROPE_H
+# define _STLP_INTERNAL_ROPE_H
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_IOSFWD
+#  include <iosfwd>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGO_H
+#  include <stl/_algo.h>
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+#  include <stl/_function.h>
+# endif
+
+# ifndef _STLP_INTERNAL_NUMERIC_H
+#  include <stl/_numeric.h>
+# endif
+
+# ifndef _STLP_INTERNAL_HASH_FUN_H
+#  include <stl/_hash_fun.h>
+# endif
+
+# ifdef __GC
+#   define __GC_CONST const
+# else
+# include <stl/_threads.h>
+#   define __GC_CONST   // constant except for deallocation
+# endif
+# ifdef _STLP_SGI_THREADS
+#    include <mutex.h>
+# endif
+
+#ifdef _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM 
+#  define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) (_Alloc_traits<_Tp,__atype>::create_allocator(__a)) 
+#elif defined(__MRC__)||defined(__SC__) 
+#  define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) __stl_alloc_create<_Tp,__atype>(__a,(_Tp*)0) 
+#else 
+#  define _STLP_CREATE_ALLOCATOR(__atype,__a, _Tp) __stl_alloc_create(__a,(_Tp*)0) 
+#endif 
+
+_STLP_BEGIN_NAMESPACE
+
+// First a lot of forward declarations.  The standard seems to require
+// much stricter "declaration before use" than many of the implementations
+// that preceded it.
+template<class _CharT, _STLP_DEFAULT_ALLOCATOR_SELECT(_CharT) > class rope;
+template<class _CharT, class _Alloc> struct _Rope_RopeConcatenation;
+template<class _CharT, class _Alloc> struct _Rope_RopeRep;
+template<class _CharT, class _Alloc> struct _Rope_RopeLeaf;
+template<class _CharT, class _Alloc> struct _Rope_RopeFunction;
+template<class _CharT, class _Alloc> struct _Rope_RopeSubstring;
+template<class _CharT, class _Alloc> class _Rope_iterator;
+template<class _CharT, class _Alloc> class _Rope_const_iterator;
+template<class _CharT, class _Alloc> class _Rope_char_ref_proxy;
+template<class _CharT, class _Alloc> class _Rope_char_ptr_proxy;
+
+// Some helpers, so we can use power on ropes.
+// See below for why this isn't local to the implementation.
+
+// This uses a nonstandard refcount convention.
+// The result has refcount 0.
+template<class _CharT, class _Alloc>
+struct _Rope_Concat_fn
+  : public binary_function<rope<_CharT,_Alloc>, rope<_CharT,_Alloc>,
+  rope<_CharT,_Alloc> > {
+  rope<_CharT,_Alloc> operator() (const rope<_CharT,_Alloc>& __x,
+                                  const rope<_CharT,_Alloc>& __y) {
+    return __x + __y;
+  }
+};
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+__identity_element(_Rope_Concat_fn<_CharT, _Alloc>)
+{
+  return rope<_CharT,_Alloc>();
+}
+
+// The _S_eos function is used for those functions that
+// convert to/from C-like strings to detect the end of the string.
+
+// The end-of-C-string character.
+// This is what the draft standard says it should be.
+template <class _CharT>
+inline _CharT _S_eos(_CharT*) { return _CharT(); }
+
+// fbp : some compilers fail to zero-initialize builtins ;(
+inline const char _S_eos(const char*) { return 0; }
+# ifdef _STLP_HAS_WCHAR_T
+inline const wchar_t _S_eos(const wchar_t*) { return 0; }
+# endif
+
+// Test for basic character types.
+// For basic character types leaves having a trailing eos.
+template <class _CharT>
+inline bool _S_is_basic_char_type(_CharT*) { return false; }
+template <class _CharT>
+inline bool _S_is_one_byte_char_type(_CharT*) { return false; }
+
+inline bool _S_is_basic_char_type(char*) { return true; }
+inline bool _S_is_one_byte_char_type(char*) { return true; }
+# ifdef _STLP_HAS_WCHAR_T
+inline bool _S_is_basic_char_type(wchar_t*) { return true; }
+# endif
+
+// Store an eos iff _CharT is a basic character type.
+// Do not reference _S_eos if it isn't.
+template <class _CharT>
+inline void _S_cond_store_eos(_CharT&) {}
+
+inline void _S_cond_store_eos(char& __c) { __c = 0; }
+# ifdef _STLP_HAS_WCHAR_T
+inline void _S_cond_store_eos(wchar_t& __c) { __c = 0; }
+# endif
+
+// char_producers are logically functions that generate a section of
+// a string.  These can be convereted to ropes.  The resulting rope
+// invokes the char_producer on demand.  This allows, for example,
+// files to be viewed as ropes without reading the entire file.
+template <class _CharT>
+class char_producer {
+public:
+  virtual ~char_producer() {};
+  virtual void operator()(size_t __start_pos, size_t __len, 
+                          _CharT* __buffer) = 0;
+  // Buffer should really be an arbitrary output iterator.
+  // That way we could flatten directly into an ostream, etc.
+  // This is thoroughly impossible, since iterator types don't
+  // have runtime descriptions.
+};
+
+// Sequence buffers:
+//
+// Sequence must provide an append operation that appends an
+// array to the sequence.  Sequence buffers are useful only if
+// appending an entire array is cheaper than appending element by element.
+// This is true for many string representations.
+// This should  perhaps inherit from ostream<sequence::value_type>
+// and be implemented correspondingly, so that they can be used
+// for formatted.  For the sake of portability, we don't do this yet.
+//
+// For now, sequence buffers behave as output iterators.  But they also
+// behave a little like basic_ostringstream<sequence::value_type> and a
+// little like containers.
+
+template<class _Sequence
+# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \
+       defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM ))
+, size_t _Buf_sz = 100
+#   if defined(__sgi) && !defined(__GNUC__)
+#	 define __TYPEDEF_WORKAROUND
+,class _V = typename _Sequence::value_type
+#   endif /* __sgi */
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+>
+// The 3rd parameter works around a common compiler bug.
+class sequence_buffer : public iterator <output_iterator_tag, void, void, void, void> {
+public:
+#       ifndef __TYPEDEF_WORKAROUND
+  typedef typename _Sequence::value_type value_type;
+  typedef sequence_buffer<_Sequence
+# if !(defined (_STLP_NON_TYPE_TMPL_PARAM_BUG) || \
+       defined ( _STLP_NO_DEFAULT_NON_TYPE_PARAM ))
+  , _Buf_sz
+  > _Self;
+# else /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+  > _Self;
+  enum { _Buf_sz = 100}; 
+# endif /* _STLP_NON_TYPE_TMPL_PARAM_BUG */
+  // # endif
+#	else /* __TYPEDEF_WORKAROUND */
+  typedef _V value_type;
+  typedef sequence_buffer<_Sequence, _Buf_sz, _V> _Self;
+#	endif /* __TYPEDEF_WORKAROUND */
+protected:
+  _Sequence* _M_prefix;
+  value_type _M_buffer[_Buf_sz];
+  size_t     _M_buf_count;
+public:
+  void flush() {
+    _M_prefix->append(_M_buffer, _M_buffer + _M_buf_count);
+    _M_buf_count = 0;
+  }
+  ~sequence_buffer() { flush(); }
+  sequence_buffer() : _M_prefix(0), _M_buf_count(0) {}
+  sequence_buffer(const _Self& __x) {
+    _M_prefix = __x._M_prefix;
+    _M_buf_count = __x._M_buf_count;
+    copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer);
+  }
+  sequence_buffer(_Self& __x) {
+    __x.flush();
+    _M_prefix = __x._M_prefix;
+    _M_buf_count = 0;
+  }
+  sequence_buffer(_Sequence& __s) : _M_prefix(&__s), _M_buf_count(0) {}
+  _Self& operator= (_Self& __x) {
+    __x.flush();
+    _M_prefix = __x._M_prefix;
+    _M_buf_count = 0;
+    return *this;
+  }
+  _Self& operator= (const _Self& __x) {
+    _M_prefix = __x._M_prefix;
+    _M_buf_count = __x._M_buf_count;
+    copy(__x._M_buffer, __x._M_buffer + __x._M_buf_count, _M_buffer);
+    return *this;
+  }
+  void push_back(value_type __x)
+  {
+    if (_M_buf_count < _Buf_sz) {
+      _M_buffer[_M_buf_count] = __x;
+      ++_M_buf_count;
+    } else {
+      flush();
+      _M_buffer[0] = __x;
+      _M_buf_count = 1;
+    }
+  }
+  void append(value_type* __s, size_t __len)
+  {
+    if (__len + _M_buf_count <= _Buf_sz) {
+      size_t __i = _M_buf_count;
+      size_t __j = 0;
+      for (; __j < __len; __i++, __j++) {
+        _M_buffer[__i] = __s[__j];
+      }
+      _M_buf_count += __len;
+    } else if (0 == _M_buf_count) {
+      _M_prefix->append(__s, __s + __len);
+    } else {
+      flush();
+      append(__s, __len);
+    }
+  }
+  _Self& write(value_type* __s, size_t __len)
+  {
+    append(__s, __len);
+    return *this;
+  }
+  _Self& put(value_type __x)
+  {
+    push_back(__x);
+    return *this;
+  }
+  _Self& operator=(const value_type& __rhs)
+  {
+    push_back(__rhs);
+    return *this;
+  }
+  _Self& operator*() { return *this; }
+  _Self& operator++() { return *this; }
+  _Self& operator++(int) { return *this; }
+};
+
+// The following should be treated as private, at least for now.
+template<class _CharT>
+class _Rope_char_consumer {
+public:
+  // If we had member templates, these should not be virtual.
+  // For now we need to use run-time parametrization where
+  // compile-time would do.  _Hence this should all be private
+  // for now.
+  // The symmetry with char_producer is accidental and temporary.
+  virtual ~_Rope_char_consumer() {};
+  virtual bool operator()(const _CharT* __buffer, size_t __len) = 0;
+};
+
+//
+// What follows should really be local to rope.  Unfortunately,
+// that doesn't work, since it makes it impossible to define generic
+// equality on rope iterators.  According to the draft standard, the
+// template parameters for such an equality operator cannot be inferred
+// from the occurence of a member class as a parameter.
+// (SGI compilers in fact allow this, but the __result wouldn't be
+// portable.)
+// Similarly, some of the static member functions are member functions
+// only to avoid polluting the global namespace, and to circumvent
+// restrictions on type inference for template functions.
+//
+
+//
+// The internal data structure for representing a rope.  This is
+// private to the implementation.  A rope is really just a pointer
+// to one of these.
+//
+// A few basic functions for manipulating this data structure
+// are members of _RopeRep.  Most of the more complex algorithms
+// are implemented as rope members.
+//
+// Some of the static member functions of _RopeRep have identically
+// named functions in rope that simply invoke the _RopeRep versions.
+//
+// A macro to introduce various allocation and deallocation functions
+// These need to be defined differently depending on whether or not
+// we are using standard conforming allocators, and whether the allocator
+// instances have real state.  Thus this macro is invoked repeatedly
+// with different definitions of __ROPE_DEFINE_ALLOC.
+
+#if defined (_STLP_MEMBER_TEMPLATE_CLASSES)
+# define __ROPE_DEFINE_ALLOC(_Tp, __name, _M_proxy) \
+        typedef typename \
+          _Alloc_traits<_Tp,_Alloc>::allocator_type __name##Allocator;
+
+#define __ROPE_DEFINE_ALLOCS(__a, _M_proxy) \
+        __ROPE_DEFINE_ALLOC(_CharT,_Data, _M_proxy) /* character data */ \
+        typedef _Rope_RopeConcatenation<_CharT,__a> __C; \
+        __ROPE_DEFINE_ALLOC(__C,_C, _M_proxy) \
+        typedef _Rope_RopeLeaf<_CharT,__a> __L; \
+        __ROPE_DEFINE_ALLOC(__L,_L, _M_proxy) \
+        typedef _Rope_RopeFunction<_CharT,__a> __F; \
+        __ROPE_DEFINE_ALLOC(__F,_F, _M_proxy) \
+        typedef _Rope_RopeSubstring<_CharT,__a> __S; \
+        __ROPE_DEFINE_ALLOC(__S,_S,_M_proxy)
+#else
+#define __ROPE_DEFINE_ALLOC(_Tp, __name, _M_proxy) 
+#define __ROPE_DEFINE_ALLOCS(__a, _M_proxy)
+#endif
+
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeRep
+# ifndef __GC
+  : public _Refcount_Base
+# endif
+{
+  typedef _Rope_RopeRep<_CharT, _Alloc> _Self;
+public:
+#  define __ROPE_MAX_DEPTH  45
+#  define __ROPE_DEPTH_SIZE 46
+  enum { _S_max_rope_depth = __ROPE_MAX_DEPTH };
+  enum _Tag {_S_leaf, _S_concat, _S_substringfn, _S_function};
+  // Apparently needed by VC++
+  // The data fields of leaves are allocated with some
+  // extra space, to accomodate future growth and for basic
+  // character types, to hold a trailing eos character.
+  enum { _S_alloc_granularity = 8 };
+
+  
+  _Tag _M_tag:8;
+  bool _M_is_balanced:8;
+
+  _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+  typedef typename _Alloc_traits<_CharT,_Alloc>::allocator_type
+  allocator_type;
+  
+  allocator_type get_allocator() const { return allocator_type(_M_size);  }
+
+  unsigned char _M_depth;
+  __GC_CONST _CharT* _M_c_string;
+  _STLP_alloc_proxy<size_t, _CharT, allocator_type> _M_size;
+
+# ifdef _STLP_NO_ARROW_OPERATOR
+  _Rope_RopeRep() : _Refcount_Base(1), _M_size(allocator_type(), 0) {}
+# endif
+
+  /* Flattened version of string, if needed.  */
+  /* typically 0.                             */
+  /* If it's not 0, then the memory is owned  */
+  /* by this node.                            */
+  /* In the case of a leaf, this may point to */
+  /* the same memory as the data field.       */
+  _Rope_RopeRep(_Tag __t, int __d, bool __b, size_t _p_size,
+                allocator_type __a) :
+#         ifndef __GC
+    _Refcount_Base(1),
+#	  endif
+    _M_tag(__t), _M_is_balanced(__b), _M_depth(__d), _M_c_string(0), _M_size(__a, _p_size)
+  { }
+#   ifdef __GC
+  void _M_incr () {}
+#   endif
+
+  // fbp : moved from RopeLeaf
+  static size_t _S_rounded_up_size(size_t __n) {
+    size_t __size_with_eos;
+    
+    if (_S_is_basic_char_type((_CharT*)0)) {
+      __size_with_eos = __n + 1;
+    } else {
+      __size_with_eos = __n;
+    }
+#       ifdef __GC
+    return __size_with_eos;
+#       else
+    // Allow slop for in-place expansion.
+    return (__size_with_eos + _S_alloc_granularity-1)
+      &~ (_S_alloc_granularity-1);
+#       endif
+  }
+
+  static void _S_free_string(__GC_CONST _CharT* __s, size_t __len,
+                             allocator_type __a) {
+
+    if (!_S_is_basic_char_type((_CharT*)0)) {
+      _STLP_STD::_Destroy(__s, __s + __len);
+    }
+    //  This has to be a static member, so this gets a bit messy
+#   ifdef _STLP_USE_NESTED_TCLASS_THROUGHT_TPARAM
+    __a.deallocate(__s, _S_rounded_up_size(__len));		//*ty 03/24/2001 - restored not to use __stl_alloc_rebind() since it is not defined under _STLP_MEMBER_TEMPLATE_CLASSES
+#   else
+    __stl_alloc_rebind (__a, (_CharT*)0).deallocate(__s, _S_rounded_up_size(__len));
+#   endif
+  }
+  
+  // Deallocate data section of a leaf.
+  // This shouldn't be a member function.
+  // But its hard to do anything else at the
+  // moment, because it's templatized w.r.t.
+  // an allocator.
+  // Does nothing if __GC is defined.
+#   ifndef __GC
+  void _M_free_c_string();
+  void _M_free_tree();
+  // Deallocate t. Assumes t is not 0.
+  void _M_unref_nonnil()
+  {
+    _M_decr(); if (!_M_ref_count) _M_free_tree();
+  }
+  void _M_ref_nonnil()
+  {
+    _M_incr();
+  }
+  static void _S_unref(_Self* __t)
+  {
+    if (0 != __t) {
+      __t->_M_unref_nonnil();
+    }
+  }
+  static void _S_ref(_Self* __t)
+  {
+    if (0 != __t) __t->_M_incr();
+  }
+  static void _S_free_if_unref(_Self* __t)
+  {
+    if (0 != __t && 0 == __t->_M_ref_count) __t->_M_free_tree();
+  }
+#   else /* __GC */
+  void _M_unref_nonnil() {}
+  void _M_ref_nonnil() {}
+  static void _S_unref(_Self*) {}
+  static void _S_ref(_Self*) {}
+  static void _S_free_if_unref(_Self*) {}
+#   endif
+
+  __ROPE_DEFINE_ALLOCS(_Alloc, _M_size)
+    };
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeLeaf : public _Rope_RopeRep<_CharT,_Alloc> {
+public:
+  __GC_CONST _CharT* _M_data; /* Not necessarily 0 terminated. */
+                                /* The allocated size is         */
+                                /* _S_rounded_up_size(size), except */
+                                /* in the GC case, in which it   */
+                                /* doesn't matter.               */
+  _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+  typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+  _Rope_RopeLeaf(__GC_CONST _CharT* __d, size_t _p_size, allocator_type __a)
+    : _Rope_RopeRep<_CharT,_Alloc>(_Rope_RopeRep<_CharT,_Alloc>::_S_leaf, 0, true, _p_size, __a), 
+    _M_data(__d)
+  {
+    _STLP_ASSERT(_p_size > 0)
+    if (_S_is_basic_char_type((_CharT *)0)) {
+      // already eos terminated.
+      this->_M_c_string = __d;
+    }
+  }
+
+# ifdef _STLP_NO_ARROW_OPERATOR
+  _Rope_RopeLeaf() {}
+  _Rope_RopeLeaf(const _Rope_RopeLeaf<_CharT, _Alloc>& ) {}
+# endif
+  
+// The constructor assumes that d has been allocated with
+  // the proper allocator and the properly padded size.
+  // In contrast, the destructor deallocates the data:
+# ifndef __GC
+  ~_Rope_RopeLeaf() {
+    if (_M_data != this->_M_c_string) {
+      this->_M_free_c_string();
+    }
+    _S_free_string(_M_data, this->_M_size._M_data, this->get_allocator());
+  }
+# endif
+};
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeConcatenation : public _Rope_RopeRep<_CharT,_Alloc> {
+public:
+  _Rope_RopeRep<_CharT,_Alloc>* _M_left;
+  _Rope_RopeRep<_CharT,_Alloc>* _M_right;
+  _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+  typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+  _Rope_RopeConcatenation(_Rope_RopeRep<_CharT,_Alloc>* __l,
+                          _Rope_RopeRep<_CharT,_Alloc>* __r,
+                          allocator_type __a)
+    :   _Rope_RopeRep<_CharT,_Alloc>(
+                                     _Rope_RopeRep<_CharT,_Alloc>::_S_concat, 
+				     (max)(__l->_M_depth, __r->_M_depth) + 1, false,
+                                     __l->_M_size._M_data + __r->_M_size._M_data, __a), _M_left(__l), _M_right(__r)
+  {}
+# ifdef _STLP_NO_ARROW_OPERATOR
+  _Rope_RopeConcatenation() {}
+  _Rope_RopeConcatenation(const _Rope_RopeConcatenation<_CharT, _Alloc>&) {}
+# endif
+
+# ifndef __GC
+  ~_Rope_RopeConcatenation() {
+    this->_M_free_c_string();
+    _M_left->_M_unref_nonnil();
+    _M_right->_M_unref_nonnil();
+  }
+# endif
+};
+
+template<class _CharT, class _Alloc>
+struct _Rope_RopeFunction : public _Rope_RopeRep<_CharT,_Alloc> {
+public:
+  char_producer<_CharT>* _M_fn;
+#   ifndef __GC
+  bool _M_delete_when_done; // Char_producer is owned by the
+                                // rope and should be explicitly
+                                // deleted when the rope becomes
+                                // inaccessible.
+#   else
+  // In the GC case, we either register the rope for
+  // finalization, or not.  Thus the field is unnecessary;
+  // the information is stored in the collector data structures.
+  // We do need a finalization procedure to be invoked by the
+  // collector.
+  static void _S_fn_finalization_proc(void * __tree, void *) {
+    delete ((_Rope_RopeFunction *)__tree) -> _M_fn;
+  }
+#   endif
+  _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+  typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+# ifdef _STLP_NO_ARROW_OPERATOR
+  _Rope_RopeFunction() {}
+  _Rope_RopeFunction(const _Rope_RopeFunction<_CharT, _Alloc>& ) {}
+# endif
+
+  _Rope_RopeFunction(char_producer<_CharT>* __f, size_t _p_size,
+                     bool __d, allocator_type __a)
+    :
+    _Rope_RopeRep<_CharT,_Alloc>(_Rope_RopeRep<_CharT,_Alloc>::_S_function, 0, true, _p_size, __a),
+    _M_fn(__f)
+#       ifndef __GC
+    , _M_delete_when_done(__d)
+#       endif
+  {
+    _STLP_ASSERT(_p_size > 0)
+#       ifdef __GC
+    if (__d) {
+      GC_REGISTER_FINALIZER(
+                            this, _Rope_RopeFunction::_S_fn_finalization_proc, 0, 0, 0);
+    }
+#       endif
+  }
+# ifndef __GC
+  ~_Rope_RopeFunction() {
+    this->_M_free_c_string();
+    if (_M_delete_when_done) {
+      delete _M_fn;
+    }
+  }
+# endif
+};
+// Substring results are usually represented using just
+// concatenation nodes.  But in the case of very long flat ropes
+// or ropes with a functional representation that isn't practical.
+// In that case, we represent the __result as a special case of
+// RopeFunction, whose char_producer points back to the rope itself.
+// In all cases except repeated substring operations and
+// deallocation, we treat the __result as a RopeFunction.
+template<class _CharT, class _Alloc>
+# if  ( defined (__IBMCPP__) && (__IBMCPP__ == 500) )  // JFA 10-Aug-2000 for some reason xlC cares about the order
+struct _Rope_RopeSubstring : public char_producer<_CharT> , public _Rope_RopeFunction<_CharT,_Alloc>
+# else
+struct _Rope_RopeSubstring : public _Rope_RopeFunction<_CharT,_Alloc>,
+                             public char_producer<_CharT>
+# endif
+{
+public:
+  // XXX this whole class should be rewritten.
+  typedef _Rope_RopeRep<_CharT,_Alloc> _Base;
+  _Rope_RopeRep<_CharT,_Alloc>* _M_base;      // not 0
+  size_t _M_start;
+  virtual void operator()(size_t __start_pos, size_t __req_len,
+                          _CharT* __buffer) {
+    switch(_M_base->_M_tag) {
+    case _Base::_S_function:
+    case _Base::_S_substringfn:
+      {
+        char_producer<_CharT>* __fn =
+          ((_Rope_RopeFunction<_CharT,_Alloc>*)_M_base)->_M_fn;
+        _STLP_ASSERT(__start_pos + __req_len <= this->_M_size._M_data)
+        _STLP_ASSERT(_M_start + this->_M_size._M_data <= _M_base->_M_size._M_data)
+        (*__fn)(__start_pos + _M_start, __req_len, __buffer);
+      }
+      break;
+    case _Base::_S_leaf:
+      {
+        __GC_CONST _CharT* __s =
+          ((_Rope_RopeLeaf<_CharT,_Alloc>*)_M_base)->_M_data;
+        uninitialized_copy_n(__s + __start_pos + _M_start, __req_len,
+                             __buffer);
+      }
+      break;
+    default:
+      _STLP_ASSERT(false)
+        ;
+    }
+  }
+
+  _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+  typedef typename _Rope_RopeRep<_CharT,_Alloc>::allocator_type allocator_type;
+
+  _Rope_RopeSubstring(_Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s,
+                      size_t __l, allocator_type __a)
+    : _Rope_RopeFunction<_CharT,_Alloc>(this, __l, false, __a),
+	_M_base(__b),
+    _M_start(__s)
+       
+  {
+    _STLP_ASSERT(__l > 0)
+    _STLP_ASSERT(__s + __l <= __b->_M_size._M_data)
+#       ifndef __GC
+    _M_base->_M_ref_nonnil();
+#       endif
+    this->_M_tag = _Base::_S_substringfn;
+  }
+  virtual ~_Rope_RopeSubstring()
+  { 
+#       ifndef __GC
+    _M_base->_M_unref_nonnil();
+#       endif
+  }
+};
+
+// Self-destructing pointers to Rope_rep.
+// These are not conventional smart pointers.  Their
+// only purpose in life is to ensure that unref is called
+// on the pointer either at normal exit or if an exception
+// is raised.  It is the caller's responsibility to
+// adjust reference counts when these pointers are initialized
+// or assigned to.  (This convention significantly reduces
+// the number of potentially expensive reference count
+// updates.)
+#ifndef __GC
+template<class _CharT, class _Alloc>
+struct _Rope_self_destruct_ptr {
+  _Rope_RopeRep<_CharT,_Alloc>* _M_ptr;
+  ~_Rope_self_destruct_ptr() 
+  { _Rope_RopeRep<_CharT,_Alloc>::_S_unref(_M_ptr); }
+#   ifdef _STLP_USE_EXCEPTIONS
+  _Rope_self_destruct_ptr() : _M_ptr(0) {};
+#   else
+  _Rope_self_destruct_ptr() {};
+#   endif
+  _Rope_self_destruct_ptr(_Rope_RopeRep<_CharT,_Alloc>* __p) : _M_ptr(__p) {}
+  _Rope_RopeRep<_CharT,_Alloc>& operator*() { return *_M_ptr; }
+  _Rope_RopeRep<_CharT,_Alloc>* operator->() { return _M_ptr; }
+  operator _Rope_RopeRep<_CharT,_Alloc>*() { return _M_ptr; }
+  _Rope_self_destruct_ptr<_CharT, _Alloc>& 
+  operator= (_Rope_RopeRep<_CharT,_Alloc>* __x)
+  { _M_ptr = __x; return *this; }
+};
+#endif
+
+// Dereferencing a nonconst iterator has to return something
+// that behaves almost like a reference.  It's not possible to
+// return an actual reference since assignment requires extra
+// work.  And we would get into the same problems as with the
+// CD2 version of basic_string.
+template<class _CharT, class _Alloc>
+class _Rope_char_ref_proxy {
+  typedef _Rope_char_ref_proxy<_CharT, _Alloc> _Self;
+  friend class rope<_CharT,_Alloc>;
+  friend class _Rope_iterator<_CharT,_Alloc>;
+  friend class _Rope_char_ptr_proxy<_CharT,_Alloc>;
+#   ifdef __GC
+  typedef _Rope_RopeRep<_CharT,_Alloc>* _Self_destruct_ptr;
+#   else
+  typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr;
+#   endif
+  typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+  typedef rope<_CharT,_Alloc> _My_rope;
+  size_t _M_pos;
+  _CharT _M_current;
+  bool _M_current_valid;
+  _My_rope* _M_root;     // The whole rope.
+public:
+  _Rope_char_ref_proxy(_My_rope* __r, size_t __p) :
+    _M_pos(__p), _M_current_valid(false), _M_root(__r) {}
+  _Rope_char_ref_proxy(const _Self& __x) :
+    _M_pos(__x._M_pos), _M_current_valid(false), _M_root(__x._M_root) {}
+  // Don't preserve cache if the reference can outlive the
+  // expression.  We claim that's not possible without calling
+  // a copy constructor or generating reference to a proxy
+  // reference.  We declare the latter to have undefined semantics.
+  _Rope_char_ref_proxy(_My_rope* __r, size_t __p,
+                       _CharT __c) :
+    _M_pos(__p), _M_current(__c), _M_current_valid(true), _M_root(__r) {}
+  inline operator _CharT () const;
+  _Self& operator= (_CharT __c);
+  _Rope_char_ptr_proxy<_CharT, _Alloc> operator& () const;
+  _Self& operator= (const _Self& __c) {
+    return operator=((_CharT)__c); 
+  }
+};
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template<class _CharT, class __Alloc>
+inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a,
+                 _Rope_char_ref_proxy <_CharT, __Alloc > __b) {
+  _CharT __tmp = __a;
+  __a = __b;
+  __b = __tmp;
+}
+#else
+// There is no really acceptable way to handle this.  The default
+// definition of swap doesn't work for proxy references.
+// It can't really be made to work, even with ugly hacks, since
+// the only unusual operation it uses is the copy constructor, which
+// is needed for other purposes.  We provide a macro for
+// full specializations, and instantiate the most common case.
+# define _ROPE_SWAP_SPECIALIZATION(_CharT, __Alloc) \
+    inline void swap(_Rope_char_ref_proxy <_CharT, __Alloc > __a, \
+                     _Rope_char_ref_proxy <_CharT, __Alloc > __b) { \
+        _CharT __tmp = __a; \
+        __a = __b; \
+        __b = __tmp; \
+    }
+
+_ROPE_SWAP_SPECIALIZATION(char,_STLP_DEFAULT_ALLOCATOR(char) )
+
+#endif /* !_STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+  template<class _CharT, class _Alloc>
+class _Rope_char_ptr_proxy {
+  // XXX this class should be rewritten.
+public:
+  typedef _Rope_char_ptr_proxy<_CharT, _Alloc> _Self;
+  friend class _Rope_char_ref_proxy<_CharT,_Alloc>;
+  size_t _M_pos;
+  rope<_CharT,_Alloc>* _M_root;     // The whole rope.
+
+  _Rope_char_ptr_proxy(const _Rope_char_ref_proxy<_CharT,_Alloc>& __x) 
+    : _M_pos(__x._M_pos), _M_root(__x._M_root) {}
+  _Rope_char_ptr_proxy(const _Self& __x)
+    : _M_pos(__x._M_pos), _M_root(__x._M_root) {}
+  _Rope_char_ptr_proxy() {}
+  _Rope_char_ptr_proxy(_CharT* __x) : _M_pos(0), _M_root(0) {
+    _STLP_ASSERT(0 == __x)
+  }
+  _Self& 
+  operator= (const _Self& __x) {
+    _M_pos = __x._M_pos;
+    _M_root = __x._M_root;
+    return *this;
+  }
+
+  _Rope_char_ref_proxy<_CharT,_Alloc> operator*() const {
+    return _Rope_char_ref_proxy<_CharT,_Alloc>(_M_root, _M_pos);
+  }
+};
+
+
+// Rope iterators:
+// Unlike in the C version, we cache only part of the stack
+// for rope iterators, since they must be efficiently copyable.
+// When we run out of cache, we have to reconstruct the iterator
+// value.
+// Pointers from iterators are not included in reference counts.
+// Iterators are assumed to be thread private.  Ropes can
+// be shared.
+
+template<class _CharT, class _Alloc>
+class _Rope_iterator_base
+/*   : public random_access_iterator<_CharT, ptrdiff_t>  */
+{
+  friend class rope<_CharT,_Alloc>;
+  typedef _Rope_iterator_base<_CharT, _Alloc> _Self;
+public:
+  typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+  // Borland doesnt want this to be protected.
+  //  protected:
+  enum { _S_path_cache_len = 4 }; // Must be <= 9.
+  enum { _S_iterator_buf_len = 15 };
+  size_t _M_current_pos;
+  _RopeRep* _M_root;     // The whole rope.
+  size_t _M_leaf_pos;    // Starting position for current leaf
+  __GC_CONST _CharT* _M_buf_start;
+  // Buffer possibly
+  // containing current char.
+  __GC_CONST _CharT* _M_buf_ptr;
+  // Pointer to current char in buffer.
+  // != 0 ==> buffer valid.
+  __GC_CONST _CharT* _M_buf_end;
+  // One past __last valid char in buffer.
+  // What follows is the path cache.  We go out of our
+  // way to make this compact.
+  // Path_end contains the bottom section of the path from
+  // the root to the current leaf.
+  const _RopeRep* _M_path_end[_S_path_cache_len];
+  int _M_leaf_index;     // Last valid __pos in path_end;
+  // _M_path_end[0] ... _M_path_end[leaf_index-1]
+  // point to concatenation nodes.
+  unsigned char _M_path_directions;
+  // (path_directions >> __i) & 1 is 1
+  // iff we got from _M_path_end[leaf_index - __i - 1]
+  // to _M_path_end[leaf_index - __i] by going to the
+  // __right. Assumes path_cache_len <= 9.
+  _CharT _M_tmp_buf[_S_iterator_buf_len];
+  // Short buffer for surrounding chars.
+  // This is useful primarily for 
+  // RopeFunctions.  We put the buffer
+  // here to avoid locking in the
+  // multithreaded case.
+  // The cached path is generally assumed to be valid
+  // only if the buffer is valid.
+  static void _S_setbuf(_Rope_iterator_base<_CharT, _Alloc>& __x);
+  // Set buffer contents given
+  // path cache.
+  static void _S_setcache(_Rope_iterator_base<_CharT, _Alloc>& __x);
+  // Set buffer contents and
+  // path cache.
+  static void _S_setcache_for_incr(_Rope_iterator_base<_CharT, _Alloc>& __x);
+  // As above, but assumes path
+  // cache is valid for previous posn.
+  _Rope_iterator_base() {}
+  _Rope_iterator_base(_RopeRep* __root, size_t __pos)
+    : _M_current_pos(__pos),_M_root(__root),  _M_buf_ptr(0) {}
+  void _M_incr(size_t __n);
+  void _M_decr(size_t __n);
+public:
+  size_t index() const { return _M_current_pos; }
+  _Rope_iterator_base(const _Self& __x) {
+    if (0 != __x._M_buf_ptr) {
+      *this = __x;
+    } else {
+      _M_current_pos = __x._M_current_pos;
+      _M_root = __x._M_root;
+      _M_buf_ptr = 0;
+    }
+  }
+};
+
+template<class _CharT, class _Alloc> class _Rope_iterator;
+
+template<class _CharT, class _Alloc>
+class _Rope_const_iterator : public _Rope_iterator_base<_CharT,_Alloc> {
+  friend class rope<_CharT,_Alloc>;
+  typedef  _Rope_const_iterator<_CharT, _Alloc> _Self;
+  typedef _Rope_iterator_base<_CharT,_Alloc> _Base;
+  //  protected:
+public:
+#   ifndef _STLP_HAS_NO_NAMESPACES
+  typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+  // The one from the base class may not be directly visible.
+#   endif
+  _Rope_const_iterator(const _RopeRep* __root, size_t __pos):
+    _Rope_iterator_base<_CharT,_Alloc>(
+                                       __CONST_CAST(_RopeRep*,__root), __pos)
+    // Only nonconst iterators modify root ref count
+  {}
+public:
+  typedef _CharT reference;   // Really a value.  Returning a reference
+                                // Would be a mess, since it would have
+                                // to be included in refcount.
+  typedef const _CharT* pointer;
+  typedef _CharT value_type;
+  typedef ptrdiff_t difference_type;
+  typedef random_access_iterator_tag iterator_category;
+
+public:
+  _Rope_const_iterator() {};
+  _Rope_const_iterator(const _Self& __x) :
+    _Rope_iterator_base<_CharT,_Alloc>(__x) { }
+  _Rope_const_iterator(const _Rope_iterator<_CharT,_Alloc>& __x): 
+    _Rope_iterator_base<_CharT,_Alloc>(__x) {}
+  _Rope_const_iterator(const rope<_CharT,_Alloc>& __r, size_t __pos) :
+    _Rope_iterator_base<_CharT,_Alloc>(__r._M_tree_ptr._M_data, __pos) {}
+  _Self& operator= (const _Self& __x) {
+    if (0 != __x._M_buf_ptr) {
+      *(__STATIC_CAST(_Base*,this)) = __x;
+    } else {
+      this->_M_current_pos = __x._M_current_pos;
+      this->_M_root = __x._M_root;
+      this->_M_buf_ptr = 0;
+    }
+    return(*this);
+  }
+  reference operator*() {
+    if (0 == this->_M_buf_ptr) _S_setcache(*this);
+    return *(this->_M_buf_ptr);
+  }
+  _Self& operator++() {
+    __GC_CONST _CharT* __next;
+    if (0 != this->_M_buf_ptr && (__next = this->_M_buf_ptr + 1) < this->_M_buf_end) {
+      this->_M_buf_ptr = __next;
+      ++this->_M_current_pos;
+    } else {
+      this->_M_incr(1);
+    }
+    return *this;
+  }
+  _Self& operator+=(ptrdiff_t __n) {
+    if (__n >= 0) {
+      this->_M_incr(__n);
+    } else {
+      this->_M_decr(-__n);
+    }
+    return *this;
+  }
+  _Self& operator--() {
+    this->_M_decr(1);
+    return *this;
+  }
+  _Self& operator-=(ptrdiff_t __n) {
+    if (__n >= 0) {
+      this->_M_decr(__n);
+    } else {
+      this->_M_incr(-__n);
+    }
+    return *this;
+  }
+  _Self operator++(int) {
+    size_t __old_pos = this->_M_current_pos;
+    this->_M_incr(1);
+    return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos);
+    // This makes a subsequent dereference expensive.
+    // Perhaps we should instead copy the iterator
+    // if it has a valid cache?
+  }
+  _Self operator--(int) {
+    size_t __old_pos = this->_M_current_pos;
+    this->_M_decr(1);
+    return _Rope_const_iterator<_CharT,_Alloc>(this->_M_root, __old_pos);
+  }
+  inline reference operator[](size_t __n);
+};
+
+template<class _CharT, class _Alloc>
+class _Rope_iterator : public _Rope_iterator_base<_CharT,_Alloc> {
+  friend class rope<_CharT,_Alloc>;
+  typedef _Rope_iterator<_CharT, _Alloc> _Self;
+  typedef _Rope_iterator_base<_CharT,_Alloc> _Base;
+  typedef _Rope_RopeRep<_CharT,_Alloc> _RopeRep;
+  //  protected:
+public:
+  rope<_CharT,_Alloc>* _M_root_rope;
+  // root is treated as a cached version of this,
+  // and is used to detect changes to the underlying
+  // rope.
+  // Root is included in the reference count.
+  // This is necessary so that we can detect changes reliably.
+  // Unfortunately, it requires careful bookkeeping for the
+  // nonGC case.
+  _Rope_iterator(rope<_CharT,_Alloc>* __r, size_t __pos);
+  
+  void _M_check();
+public:
+  typedef _Rope_char_ref_proxy<_CharT,_Alloc>  reference;
+  typedef _Rope_char_ref_proxy<_CharT,_Alloc>* pointer;
+  typedef _CharT value_type;
+  typedef ptrdiff_t difference_type;
+  typedef random_access_iterator_tag iterator_category;
+public:
+  ~_Rope_iterator() 		//*TY 5/6/00 - added dtor to balance reference count
+  {
+    _RopeRep::_S_unref(this->_M_root);
+  }
+  
+  rope<_CharT,_Alloc>& container() { return *_M_root_rope; }
+  _Rope_iterator() {
+    this->_M_root = 0;  // Needed for reference counting.
+  };
+  _Rope_iterator(const  _Self& __x) :
+    _Rope_iterator_base<_CharT,_Alloc>(__x) {
+    _M_root_rope = __x._M_root_rope;
+    _RopeRep::_S_ref(this->_M_root);
+  }
+  _Rope_iterator(rope<_CharT,_Alloc>& __r, size_t __pos);
+  _Self& operator= (const  _Self& __x) {
+    _RopeRep* __old = this->_M_root;
+    
+    _RopeRep::_S_ref(__x._M_root);
+    if (0 != __x._M_buf_ptr) {
+      _M_root_rope = __x._M_root_rope;
+      *(__STATIC_CAST(_Base*,this)) = __x;
+    } else {
+      this->_M_current_pos = __x._M_current_pos;
+      this->_M_root = __x._M_root;
+      _M_root_rope = __x._M_root_rope;
+      this->_M_buf_ptr = 0;
+    }
+    _RopeRep::_S_unref(__old);
+    return(*this);
+  }
+  reference operator*() {
+    _M_check();
+    if (0 == this->_M_buf_ptr) {
+      return _Rope_char_ref_proxy<_CharT,_Alloc>(
+                                                 _M_root_rope, this->_M_current_pos);
+    } else {
+      return _Rope_char_ref_proxy<_CharT,_Alloc>(
+                                                 _M_root_rope, this->_M_current_pos, *(this->_M_buf_ptr));
+    }
+  }
+  _Self& operator++() {
+    this->_M_incr(1);
+    return *this;
+  }
+  _Self& operator+=(ptrdiff_t __n) {
+    if (__n >= 0) {
+      this->_M_incr(__n);
+    } else {
+      this->_M_decr(-__n);
+    }
+    return *this;
+  }
+  _Self& operator--() {
+    this->_M_decr(1);
+    return *this;
+  }
+  _Self& operator-=(ptrdiff_t __n) {
+    if (__n >= 0) {
+      this->_M_decr(__n);
+    } else {
+      this->_M_incr(-__n);
+    }
+    return *this;
+  }
+  _Self operator++(int) {
+    size_t __old_pos = this->_M_current_pos;
+    this->_M_incr(1);
+    return _Rope_iterator<_CharT,_Alloc>(_M_root_rope, __old_pos);
+  }
+  _Self operator--(int) {
+    size_t __old_pos = this->_M_current_pos;
+    this->_M_decr(1);
+    return _Rope_iterator<_CharT,_Alloc>(_M_root_rope, __old_pos);
+  }
+  reference operator[](ptrdiff_t __n) {
+    return _Rope_char_ref_proxy<_CharT,_Alloc>(
+                                               _M_root_rope, this->_M_current_pos + __n);
+  }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _CharT, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const _Rope_iterator<_CharT,_Alloc>&) {  return random_access_iterator_tag();}
+template <class _CharT, class _Alloc>
+inline _CharT* value_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; }
+template <class _CharT, class _Alloc>
+inline ptrdiff_t* distance_type(const _Rope_iterator<_CharT,_Alloc>&) { return 0; }
+template <class _CharT, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const _Rope_const_iterator<_CharT,_Alloc>&) { return random_access_iterator_tag(); }
+template <class _CharT, class _Alloc>
+inline _CharT* value_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; }
+template <class _CharT, class _Alloc>
+inline ptrdiff_t* distance_type(const _Rope_const_iterator<_CharT,_Alloc>&) { return 0; }
+#endif
+
+template <class _CharT, class _Alloc>
+class rope {
+  typedef rope<_CharT,_Alloc> _Self;
+public:
+  typedef _CharT value_type;
+  typedef ptrdiff_t difference_type;
+  typedef size_t size_type;
+  typedef _CharT const_reference;
+  typedef const _CharT* const_pointer;
+  typedef _Rope_iterator<_CharT,_Alloc> iterator;
+  typedef _Rope_const_iterator<_CharT,_Alloc> const_iterator;
+  typedef _Rope_char_ref_proxy<_CharT,_Alloc> reference;
+  typedef _Rope_char_ptr_proxy<_CharT,_Alloc> pointer;
+  
+  friend class _Rope_iterator<_CharT,_Alloc>;
+  friend class _Rope_const_iterator<_CharT,_Alloc>;
+  friend struct _Rope_RopeRep<_CharT,_Alloc>;
+  friend class _Rope_iterator_base<_CharT,_Alloc>;
+  friend class _Rope_char_ptr_proxy<_CharT,_Alloc>;
+  friend class _Rope_char_ref_proxy<_CharT,_Alloc>;
+  friend struct _Rope_RopeSubstring<_CharT,_Alloc>;
+
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+  
+protected:
+  typedef __GC_CONST _CharT* _Cstrptr;
+  
+  static _CharT _S_empty_c_str[1];
+  
+  static bool _S_is0(_CharT __c) { return __c == _S_eos((_CharT*)0); }
+  enum { _S_copy_max = 23 };
+  // For strings shorter than _S_copy_max, we copy to
+  // concatenate.
+  
+public:
+  typedef _Rope_RopeRep<_CharT, _Alloc> _RopeRep;
+  _STLP_FORCE_ALLOCATORS(_CharT, _Alloc)
+  typedef typename _Alloc_traits<_CharT,_Alloc>::allocator_type  allocator_type;
+  allocator_type get_allocator() const { return allocator_type(_M_tree_ptr); }
+public:
+  // The only data member of a rope:
+  _STLP_alloc_proxy<_RopeRep*, _CharT, allocator_type> _M_tree_ptr;
+
+  typedef _Rope_RopeConcatenation<_CharT,_Alloc> _RopeConcatenation;
+  typedef _Rope_RopeLeaf<_CharT,_Alloc> _RopeLeaf;
+  typedef _Rope_RopeFunction<_CharT,_Alloc> _RopeFunction;
+  typedef _Rope_RopeSubstring<_CharT,_Alloc> _RopeSubstring;
+
+
+
+  // Retrieve a character at the indicated position.
+  static _CharT _S_fetch(_RopeRep* __r, size_type __pos);
+
+#       ifndef __GC
+  // Obtain a pointer to the character at the indicated position.
+  // The pointer can be used to change the character.
+  // If such a pointer cannot be produced, as is frequently the
+  // case, 0 is returned instead.
+  // (Returns nonzero only if all nodes in the path have a refcount
+  // of 1.)
+  static _CharT* _S_fetch_ptr(_RopeRep* __r, size_type __pos);
+#       endif
+
+  static bool _S_apply_to_pieces(
+                                // should be template parameter
+                                 _Rope_char_consumer<_CharT>& __c,
+                                 const _RopeRep* __r,
+                                 size_t __begin, size_t __end);
+                                // begin and end are assumed to be in range.
+
+#       ifndef __GC
+  static void _S_unref(_RopeRep* __t)
+  {
+    _RopeRep::_S_unref(__t);
+  }
+  static void _S_ref(_RopeRep* __t)
+  {
+    _RopeRep::_S_ref(__t);
+  }
+#       else /* __GC */
+  static void _S_unref(_RopeRep*) {}
+  static void _S_ref(_RopeRep*) {}
+#       endif
+
+
+#       ifdef __GC
+  typedef _Rope_RopeRep<_CharT,_Alloc>* _Self_destruct_ptr;
+#       else
+  typedef _Rope_self_destruct_ptr<_CharT,_Alloc> _Self_destruct_ptr;
+#       endif
+
+  // _Result is counted in refcount.
+  static _RopeRep* _S_substring(_RopeRep* __base,
+                                size_t __start, size_t __endp1);
+
+  static _RopeRep* _S_concat_char_iter(_RopeRep* __r,
+                                       const _CharT* __iter, size_t __slen);
+  // Concatenate rope and char ptr, copying __s.
+  // Should really take an arbitrary iterator.
+  // Result is counted in refcount.
+  static _RopeRep* _S_destr_concat_char_iter(_RopeRep* __r,
+                                             const _CharT* __iter, size_t __slen)
+    // As above, but one reference to __r is about to be
+    // destroyed.  Thus the pieces may be recycled if all
+    // relevent reference counts are 1.
+#           ifdef __GC
+    // We can't really do anything since refcounts are unavailable.
+  { return _S_concat_char_iter(__r, __iter, __slen); }
+#           else
+  ;
+#           endif
+
+  static _RopeRep* _S_concat_rep(_RopeRep* __left, _RopeRep* __right);
+  // General concatenation on _RopeRep.  _Result
+  // has refcount of 1.  Adjusts argument refcounts.
+
+public:
+  void apply_to_pieces( size_t __begin, size_t __end,
+                        _Rope_char_consumer<_CharT>& __c) const {
+    _S_apply_to_pieces(__c, _M_tree_ptr._M_data, __begin, __end);
+  }
+
+
+protected:
+
+  static size_t _S_rounded_up_size(size_t __n) {
+    return _RopeRep::_S_rounded_up_size(__n);
+  }
+
+  static size_t _S_allocated_capacity(size_t __n) {
+    if (_S_is_basic_char_type((_CharT*)0)) {
+      return _S_rounded_up_size(__n) - 1;
+    } else {
+      return _S_rounded_up_size(__n);
+    }
+  }
+                
+  // Allocate and construct a RopeLeaf using the supplied allocator
+  // Takes ownership of s instead of copying.
+  static _RopeLeaf* _S_new_RopeLeaf(__GC_CONST _CharT *__s,
+                                    size_t _p_size, allocator_type __a)
+  {
+   _RopeLeaf* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a, _RopeLeaf).allocate(1,(const void*)0);
+    _STLP_TRY {
+      _STLP_PLACEMENT_NEW(__space) _RopeLeaf(__s, _p_size, __a);
+    }
+   _STLP_UNWIND(_STLP_CREATE_ALLOCATOR(allocator_type,__a, 
+                                   _RopeLeaf).deallocate(__space, 1))
+	  return __space;
+  }
+
+  static _RopeConcatenation* _S_new_RopeConcatenation(
+                                                      _RopeRep* __left, _RopeRep* __right,
+                                                      allocator_type __a)
+  {
+   _RopeConcatenation* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a,
+                                                    _RopeConcatenation).allocate(1,(const void*)0);
+    return _STLP_PLACEMENT_NEW(__space) _RopeConcatenation(__left, __right, __a);
+  }
+
+  static _RopeFunction* _S_new_RopeFunction(char_producer<_CharT>* __f,
+                                            size_t _p_size, bool __d, allocator_type __a)
+  {
+   _RopeFunction* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a, 
+                                               _RopeFunction).allocate(1,(const void*)0);
+    return _STLP_PLACEMENT_NEW(__space) _RopeFunction(__f, _p_size, __d, __a);
+  }
+
+  static _RopeSubstring* _S_new_RopeSubstring(
+                                              _Rope_RopeRep<_CharT,_Alloc>* __b, size_t __s,
+                                              size_t __l, allocator_type __a)
+  {
+   _RopeSubstring* __space = _STLP_CREATE_ALLOCATOR(allocator_type,__a, 
+                                                _RopeSubstring).allocate(1,(const void*)0);
+    return _STLP_PLACEMENT_NEW(__space) _RopeSubstring(__b, __s, __l, __a);
+  }
+
+#         define _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, _p_size, __a) \
+                _S_RopeLeaf_from_unowned_char_ptr(__s, _p_size, __a)     
+
+  static
+  _RopeLeaf* _S_RopeLeaf_from_unowned_char_ptr(const _CharT *__s,
+                                               size_t _p_size, allocator_type __a)
+  {
+    if (0 == _p_size) return 0;
+
+   _CharT* __buf = _STLP_CREATE_ALLOCATOR(allocator_type,__a, _CharT).allocate(_S_rounded_up_size(_p_size));
+
+    uninitialized_copy_n(__s, _p_size, __buf);
+    _S_cond_store_eos(__buf[_p_size]);
+
+    _STLP_TRY {
+      return _S_new_RopeLeaf(__buf, _p_size, __a);
+    }
+    _STLP_UNWIND(_RopeRep::_S_free_string(__buf, _p_size, __a))
+            
+# if defined (_STLP_THROW_RETURN_BUG)
+      return 0;
+# endif
+  }
+            
+
+  // Concatenation of nonempty strings.
+  // Always builds a concatenation node.
+  // Rebalances if the result is too deep.
+  // Result has refcount 1.
+  // Does not increment left and right ref counts even though
+  // they are referenced.
+  static _RopeRep*
+  _S_tree_concat(_RopeRep* __left, _RopeRep* __right);
+
+  // Concatenation helper functions
+  static _RopeLeaf*
+  _S_leaf_concat_char_iter(_RopeLeaf* __r,
+                           const _CharT* __iter, size_t __slen);
+  // Concatenate by copying leaf.
+  // should take an arbitrary iterator
+  // result has refcount 1.
+#       ifndef __GC
+  static _RopeLeaf* _S_destr_leaf_concat_char_iter
+  (_RopeLeaf* __r, const _CharT* __iter, size_t __slen);
+  // A version that potentially clobbers __r if __r->_M_ref_count == 1.
+#       endif
+
+
+  // A helper function for exponentiating strings.
+  // This uses a nonstandard refcount convention.
+  // The result has refcount 0.
+  friend struct _Rope_Concat_fn<_CharT,_Alloc>;
+  typedef _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn;
+
+public:
+  static size_t _S_char_ptr_len(const _CharT* __s) {
+    const _CharT* __p = __s;
+	  
+    while (!_S_is0(*__p)) { ++__p; }
+    return (__p - __s);
+  }
+
+public: /* for operators */
+  rope(_RopeRep* __t, const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, __t) { }
+private:
+  // Copy __r to the _CharT buffer.
+  // Returns __buffer + __r->_M_size._M_data.
+  // Assumes that buffer is uninitialized.
+  static _CharT* _S_flatten(_RopeRep* __r, _CharT* __buffer);
+
+  // Again, with explicit starting position and length.
+  // Assumes that buffer is uninitialized.
+  static _CharT* _S_flatten(_RopeRep* __r,
+                            size_t __start, size_t __len,
+                            _CharT* __buffer);
+
+  // fbp : HP aCC prohibits access to protected min_len from within static methods ( ?? )
+public:
+  static const unsigned long _S_min_len[46];
+protected:
+  static bool _S_is_balanced(_RopeRep* __r)
+  { return (__r->_M_size._M_data >= _S_min_len[__r->_M_depth]); }
+
+  static bool _S_is_almost_balanced(_RopeRep* __r)
+  { return (__r->_M_depth == 0 ||
+            __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 1]); }
+
+  static bool _S_is_roughly_balanced(_RopeRep* __r)
+  { return (__r->_M_depth <= 1 ||
+            __r->_M_size._M_data >= _S_min_len[__r->_M_depth - 2]); }
+
+  // Assumes the result is not empty.
+  static _RopeRep* _S_concat_and_set_balanced(_RopeRep* __left,
+                                              _RopeRep* __right)
+  {
+    _RopeRep* __result = _S_concat_rep(__left, __right);
+    if (_S_is_balanced(__result)) __result->_M_is_balanced = true;
+    return __result;
+  }
+
+  // The basic rebalancing operation.  Logically copies the
+  // rope.  The result has refcount of 1.  The client will
+  // usually decrement the reference count of __r.
+  // The result is within height 2 of balanced by the above
+  // definition.
+  static _RopeRep* _S_balance(_RopeRep* __r);
+
+  // Add all unbalanced subtrees to the forest of balanceed trees.
+  // Used only by balance.
+  static void _S_add_to_forest(_RopeRep*__r, _RopeRep** __forest);
+        
+  // Add __r to forest, assuming __r is already balanced.
+  static void _S_add_leaf_to_forest(_RopeRep* __r, _RopeRep** __forest);
+
+  // Print to stdout, exposing structure
+  static void _S_dump(_RopeRep* __r, int __indent = 0);
+
+  // Return -1, 0, or 1 if __x < __y, __x == __y, or __x > __y resp.
+  static int _S_compare(const _RopeRep* __x, const _RopeRep* __y);
+
+public:
+  bool empty() const { return 0 == _M_tree_ptr._M_data; }
+
+  // Comparison member function.  This is public only for those
+  // clients that need a ternary comparison.  Others
+  // should use the comparison operators below.
+  int compare(const _Self& __y) const {
+    return _S_compare(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data);
+  }
+
+  rope(const _CharT* __s, const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, _S_char_ptr_len(__s),__a))
+  { }
+
+  rope(const _CharT* __s, size_t __len,
+       const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, (_STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __len, __a)))
+  { }
+
+  // Should perhaps be templatized with respect to the iterator type
+  // and use Sequence_buffer.  (It should perhaps use sequence_buffer
+  // even now.)
+  rope(const _CharT *__s, const _CharT *__e,
+       const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(__s, __e - __s, __a))
+  { }
+
+  rope(const const_iterator& __s, const const_iterator& __e,
+       const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos,
+                                    __e._M_current_pos))
+  { }
+
+  rope(const iterator& __s, const iterator& __e,
+       const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, _S_substring(__s._M_root, __s._M_current_pos,
+                                    __e._M_current_pos))
+  { }
+
+  rope(_CharT __c, const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, (_RopeRep*)0)
+  {
+    _CharT* __buf = _M_tree_ptr.allocate(_S_rounded_up_size(1));
+
+    _Construct(__buf, __c);
+    _STLP_TRY {
+      _M_tree_ptr._M_data = _S_new_RopeLeaf(__buf, 1, __a);
+    }
+    _STLP_UNWIND(_RopeRep::_S_free_string(__buf, 1, __a))
+      }
+
+  rope(size_t __n, _CharT __c,     
+       const allocator_type& __a = allocator_type()):
+    _M_tree_ptr(__a, (_RopeRep*)0) {
+    rope<_CharT,_Alloc> __result;
+# define  __exponentiate_threshold size_t(32)
+    _RopeRep* __remainder;
+    rope<_CharT,_Alloc> __remainder_rope;
+	    
+    // gcc-2.7.2 bugs
+    typedef _Rope_Concat_fn<_CharT,_Alloc> _Concat_fn;
+	    
+    if (0 == __n)
+      return;
+	    
+    size_t __exponent = __n / __exponentiate_threshold;
+    size_t __rest = __n % __exponentiate_threshold;
+    if (0 == __rest) {
+      __remainder = 0;
+    } else {
+      _CharT* __rest_buffer = _M_tree_ptr.allocate(_S_rounded_up_size(__rest));
+      uninitialized_fill_n(__rest_buffer, __rest, __c);
+      _S_cond_store_eos(__rest_buffer[__rest]);
+      _STLP_TRY {
+		__remainder = _S_new_RopeLeaf(__rest_buffer, __rest, __a);
+      }
+      _STLP_UNWIND(_RopeRep::_S_free_string(__rest_buffer, __rest, __a))
+		}
+    __remainder_rope._M_tree_ptr._M_data = __remainder;
+    if (__exponent != 0) {
+      _CharT* __base_buffer =
+		_M_tree_ptr.allocate(_S_rounded_up_size(__exponentiate_threshold));
+      _RopeLeaf* __base_leaf;
+      rope<_CharT,_Alloc> __base_rope;
+      uninitialized_fill_n(__base_buffer, __exponentiate_threshold, __c);
+      _S_cond_store_eos(__base_buffer[__exponentiate_threshold]);
+      _STLP_TRY {
+		__base_leaf = _S_new_RopeLeaf(__base_buffer,
+                                      __exponentiate_threshold, __a);
+      }
+      _STLP_UNWIND(_RopeRep::_S_free_string(__base_buffer, 
+                                            __exponentiate_threshold, __a))
+		__base_rope._M_tree_ptr._M_data = __base_leaf;
+      if (1 == __exponent) {
+		__result = __base_rope;
+#         ifndef __GC
+		_STLP_ASSERT(2 == __result._M_tree_ptr._M_data->_M_ref_count)
+		// One each for base_rope and __result
+#         endif
+      } else {
+		__result = power(__base_rope, __exponent, _Concat_fn());
+      }
+      if (0 != __remainder) {
+		__result += __remainder_rope;
+      }
+    } else {
+      __result = __remainder_rope;
+    }
+    _M_tree_ptr._M_data = __result._M_tree_ptr._M_data;
+    _M_tree_ptr._M_data->_M_ref_nonnil();
+# undef __exponentiate_threshold
+  }
+
+  rope(const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, (_RopeRep*)0) {}
+
+  // Construct a rope from a function that can compute its members
+  rope(char_producer<_CharT> *__fn, size_t __len, bool __delete_fn,
+       const allocator_type& __a = allocator_type())
+    : _M_tree_ptr(__a, (_RopeRep*)0)
+  {
+    _M_tree_ptr._M_data = (0 == __len) ?
+      0 : _S_new_RopeFunction(__fn, __len, __delete_fn, __a);
+  }
+
+  rope(const _Self& __x)
+    : _M_tree_ptr(__x.get_allocator(), __x._M_tree_ptr._M_data)
+  {
+    _S_ref(_M_tree_ptr._M_data);
+  }
+
+  ~rope()
+  {
+    _S_unref(_M_tree_ptr._M_data);
+  }
+
+  _Self& operator=(const _Self& __x)
+  {
+    _RopeRep* __old = _M_tree_ptr._M_data;
+    _STLP_ASSERT(get_allocator() == __x.get_allocator())
+    _M_tree_ptr._M_data = __x._M_tree_ptr._M_data;
+    _S_ref(_M_tree_ptr._M_data);
+    _S_unref(__old);
+    return(*this);
+  }
+  void clear()
+  {
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = 0;
+  }
+  void push_back(_CharT __x)
+  {
+    _RopeRep* __old = _M_tree_ptr._M_data;
+    _M_tree_ptr._M_data = _S_destr_concat_char_iter(_M_tree_ptr._M_data, &__x, 1);
+    _S_unref(__old);
+  }
+
+  void pop_back()
+  {
+    _RopeRep* __old = _M_tree_ptr._M_data;
+    _M_tree_ptr._M_data = 
+      _S_substring(_M_tree_ptr._M_data, 0, _M_tree_ptr._M_data->_M_size._M_data - 1);
+    _S_unref(__old);
+  }
+
+  _CharT back() const
+  {
+    return _S_fetch(_M_tree_ptr._M_data, _M_tree_ptr._M_data->_M_size._M_data - 1);
+  }
+
+  void push_front(_CharT __x)
+  {
+    _RopeRep* __old = _M_tree_ptr._M_data;
+    _RopeRep* __left =
+      _STLP_ROPE_FROM_UNOWNED_CHAR_PTR(&__x, 1, get_allocator());
+    _STLP_TRY {
+      _M_tree_ptr._M_data = _S_concat_rep(__left, _M_tree_ptr._M_data);
+      _S_unref(__old);
+      _S_unref(__left);
+    }
+    _STLP_UNWIND(_S_unref(__left))
+      }
+
+  void pop_front()
+  {
+    _RopeRep* __old = _M_tree_ptr._M_data;
+    _M_tree_ptr._M_data = _S_substring(_M_tree_ptr._M_data, 1, _M_tree_ptr._M_data->_M_size._M_data);
+    _S_unref(__old);
+  }
+
+  _CharT front() const
+  {
+    return _S_fetch(_M_tree_ptr._M_data, 0);
+  }
+
+  void balance()
+  {
+    _RopeRep* __old = _M_tree_ptr._M_data;
+    _M_tree_ptr._M_data = _S_balance(_M_tree_ptr._M_data);
+    _S_unref(__old);
+  }
+
+  void copy(_CharT* __buffer) const {
+    _STLP_STD::_Destroy(__buffer, __buffer + size());
+    _S_flatten(_M_tree_ptr._M_data, __buffer);
+  }
+
+  // This is the copy function from the standard, but
+  // with the arguments reordered to make it consistent with the
+  // rest of the interface.
+  // Note that this guaranteed not to compile if the draft standard
+  // order is assumed.
+  size_type copy(size_type __pos, size_type __n, _CharT* __buffer) const 
+  {
+    size_t _p_size = size();
+    size_t __len = (__pos + __n > _p_size? _p_size - __pos : __n);
+
+    _STLP_STD::_Destroy(__buffer, __buffer + __len);
+    _S_flatten(_M_tree_ptr._M_data, __pos, __len, __buffer);
+    return __len;
+  }
+
+  // Print to stdout, exposing structure.  May be useful for
+  // performance debugging.
+  void dump() {
+    _S_dump(_M_tree_ptr._M_data);
+  }
+
+  // Convert to 0 terminated string in new allocated memory.
+  // Embedded 0s in the input do not terminate the copy.
+  const _CharT* c_str() const;
+
+  // As above, but lso use the flattened representation as the
+  // the new rope representation.
+  const _CharT* replace_with_c_str();
+
+  // Reclaim memory for the c_str generated flattened string.
+  // Intentionally undocumented, since it's hard to say when this
+  // is safe for multiple threads.
+  void delete_c_str () {
+    if (0 == _M_tree_ptr._M_data) return;
+    if (_RopeRep::_S_leaf == _M_tree_ptr._M_data->_M_tag && 
+        ((_RopeLeaf*)_M_tree_ptr._M_data)->_M_data == 
+        _M_tree_ptr._M_data->_M_c_string) {
+      // Representation shared
+      return;
+    }
+#           ifndef __GC
+    _M_tree_ptr._M_data->_M_free_c_string();
+#           endif
+    _M_tree_ptr._M_data->_M_c_string = 0;
+  }
+
+  _CharT operator[] (size_type __pos) const {
+    return _S_fetch(_M_tree_ptr._M_data, __pos);
+  }
+
+  _CharT at(size_type __pos) const {
+    // if (__pos >= size()) throw out_of_range;  // XXX
+    return (*this)[__pos];
+  }
+
+  const_iterator begin() const {
+    return(const_iterator(_M_tree_ptr._M_data, 0));
+  }
+
+  // An easy way to get a const iterator from a non-const container.
+  const_iterator const_begin() const {
+    return(const_iterator(_M_tree_ptr._M_data, 0));
+  }
+
+  const_iterator end() const {
+    return(const_iterator(_M_tree_ptr._M_data, size()));
+  }
+
+  const_iterator const_end() const {
+    return(const_iterator(_M_tree_ptr._M_data, size()));
+  }
+
+  size_type size() const { 
+    return(0 == _M_tree_ptr._M_data? 0 : _M_tree_ptr._M_data->_M_size._M_data);
+  }
+
+  size_type length() const {
+    return size();
+  }
+
+  size_type max_size() const {
+    return _S_min_len[__ROPE_MAX_DEPTH-1] - 1;
+    //  Guarantees that the result can be sufficirntly
+    //  balanced.  Longer ropes will probably still work,
+    //  but it's harder to make guarantees.
+  }
+
+  const_reverse_iterator rbegin() const {
+    return const_reverse_iterator(end());
+  }
+
+  const_reverse_iterator const_rbegin() const {
+    return const_reverse_iterator(end());
+  }
+
+  const_reverse_iterator rend() const {
+    return const_reverse_iterator(begin());
+  }
+
+  const_reverse_iterator const_rend() const {
+    return const_reverse_iterator(begin());
+  }
+  // The symmetric cases are intentionally omitted, since they're presumed
+  // to be less common, and we don't handle them as well.
+
+  // The following should really be templatized.
+  // The first argument should be an input iterator or
+  // forward iterator with value_type _CharT.
+  _Self& append(const _CharT* __iter, size_t __n) {
+    _RopeRep* __result = 
+      _S_destr_concat_char_iter(_M_tree_ptr._M_data, __iter, __n);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+    return *this;
+  }
+
+  _Self& append(const _CharT* __c_string) {
+    size_t __len = _S_char_ptr_len(__c_string);
+    append(__c_string, __len);
+    return(*this);
+  }
+
+  _Self& append(const _CharT* __s, const _CharT* __e) {
+    _RopeRep* __result =
+      _S_destr_concat_char_iter(_M_tree_ptr._M_data, __s, __e - __s);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+    return *this;
+  }
+
+  _Self& append(const_iterator __s, const_iterator __e) {
+    _STLP_ASSERT(__s._M_root == __e._M_root)
+    _STLP_ASSERT(get_allocator() == __s._M_root->get_allocator())
+    _Self_destruct_ptr __appendee(_S_substring(
+                                               __s._M_root, __s._M_current_pos, __e._M_current_pos));
+    _RopeRep* __result = 
+      _S_concat_rep(_M_tree_ptr._M_data, (_RopeRep*)__appendee);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+    return *this;
+  }
+
+  _Self& append(_CharT __c) {
+    _RopeRep* __result = 
+      _S_destr_concat_char_iter(_M_tree_ptr._M_data, &__c, 1);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+    return *this;
+  }
+
+  _Self& append() { return append(_CharT()); }  // XXX why?
+
+  _Self& append(const _Self& __y) {
+    _STLP_ASSERT(__y.get_allocator() == get_allocator())
+    _RopeRep* __result = _S_concat_rep(_M_tree_ptr._M_data, __y._M_tree_ptr._M_data);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+    return *this;
+  }
+
+  _Self& append(size_t __n, _CharT __c) {
+    rope<_CharT,_Alloc> __last(__n, __c);
+    return append(__last);
+  }
+
+  void swap(_Self& __b) {
+    _STLP_ASSERT(get_allocator() == __b.get_allocator())
+    _RopeRep* __tmp = _M_tree_ptr._M_data;
+    _M_tree_ptr._M_data = __b._M_tree_ptr._M_data;
+    __b._M_tree_ptr._M_data = __tmp;
+  }
+
+
+protected:
+  // Result is included in refcount.
+  static _RopeRep* replace(_RopeRep* __old, size_t __pos1,
+                           size_t __pos2, _RopeRep* __r) {
+    if (0 == __old) { _S_ref(__r); return __r; }
+    _Self_destruct_ptr __left(
+                              _S_substring(__old, 0, __pos1));
+    _Self_destruct_ptr __right(
+                               _S_substring(__old, __pos2, __old->_M_size._M_data));
+	_STLP_MPWFIX_TRY	//*TY 06/01/2000 - 
+    _RopeRep* __result;
+
+    if (0 == __r) {
+      __result = _S_concat_rep(__left, __right);
+    } else {
+      _STLP_ASSERT(__old->get_allocator() == __r->get_allocator())
+      _Self_destruct_ptr __left_result(_S_concat_rep(__left, __r));
+      __result = _S_concat_rep(__left_result, __right);
+    }
+    return __result;
+	_STLP_MPWFIX_CATCH	//*TY 06/01/2000 - 
+  }
+
+public:
+  void insert(size_t __p, const _Self& __r) {
+    _RopeRep* __result = 
+      replace(_M_tree_ptr._M_data, __p, __p, __r._M_tree_ptr._M_data);
+    _STLP_ASSERT(get_allocator() == __r.get_allocator())
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+  }
+
+  void insert(size_t __p, size_t __n, _CharT __c) {
+    rope<_CharT,_Alloc> __r(__n,__c);
+    insert(__p, __r);
+  }
+
+  void insert(size_t __p, const _CharT* __i, size_t __n) {
+    _Self_destruct_ptr __left(_S_substring(_M_tree_ptr._M_data, 0, __p));
+    _Self_destruct_ptr __right(_S_substring(_M_tree_ptr._M_data, __p, size()));
+    _Self_destruct_ptr __left_result(
+                                     _S_concat_char_iter(__left, __i, __n));
+    // _S_ destr_concat_char_iter should be safe here.
+    // But as it stands it's probably not a win, since __left
+    // is likely to have additional references.
+    _RopeRep* __result = _S_concat_rep(__left_result, __right);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+  }
+
+  void insert(size_t __p, const _CharT* __c_string) {
+    insert(__p, __c_string, _S_char_ptr_len(__c_string));
+  }
+
+  void insert(size_t __p, _CharT __c) {
+    insert(__p, &__c, 1);
+  }
+
+  void insert(size_t __p) {
+    _CharT __c = _CharT();
+    insert(__p, &__c, 1);
+  }
+
+  void insert(size_t __p, const _CharT* __i, const _CharT* __j) {
+    _Self __r(__i, __j);
+    insert(__p, __r);
+  }
+
+  void insert(size_t __p, const const_iterator& __i,
+              const const_iterator& __j) {
+    _Self __r(__i, __j);
+    insert(__p, __r);
+  }
+
+  void insert(size_t __p, const iterator& __i,
+              const iterator& __j) {
+    _Self __r(__i, __j);
+    insert(__p, __r);
+  }
+
+  // (position, length) versions of replace operations:
+
+  void replace(size_t __p, size_t __n, const _Self& __r) {
+    _RopeRep* __result = 
+      replace(_M_tree_ptr._M_data, __p, __p + __n, __r._M_tree_ptr._M_data);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+  }
+
+  void replace(size_t __p, size_t __n, 
+               const _CharT* __i, size_t __i_len) {
+    _Self __r(__i, __i_len);
+    replace(__p, __n, __r);
+  }
+
+  void replace(size_t __p, size_t __n, _CharT __c) {
+    _Self __r(__c);
+    replace(__p, __n, __r);
+  }
+
+  void replace(size_t __p, size_t __n, const _CharT* __c_string) {
+    _Self __r(__c_string);
+    replace(__p, __n, __r);
+  }
+
+  void replace(size_t __p, size_t __n, 
+               const _CharT* __i, const _CharT* __j) {
+    _Self __r(__i, __j);
+    replace(__p, __n, __r);
+  }
+
+  void replace(size_t __p, size_t __n,
+               const const_iterator& __i, const const_iterator& __j) {
+    _Self __r(__i, __j);
+    replace(__p, __n, __r);
+  }
+
+  void replace(size_t __p, size_t __n,
+               const iterator& __i, const iterator& __j) {
+    _Self __r(__i, __j);
+    replace(__p, __n, __r);
+  }
+
+  // Single character variants:
+  void replace(size_t __p, _CharT __c) {
+    iterator __i(this, __p);
+    *__i = __c;
+  }
+
+  void replace(size_t __p, const _Self& __r) {
+    replace(__p, 1, __r);
+  }
+
+  void replace(size_t __p, const _CharT* __i, size_t __i_len) {
+    replace(__p, 1, __i, __i_len);
+  }
+
+  void replace(size_t __p, const _CharT* __c_string) {
+    replace(__p, 1, __c_string);
+  }
+
+  void replace(size_t __p, const _CharT* __i, const _CharT* __j) {
+    replace(__p, 1, __i, __j);
+  }
+
+  void replace(size_t __p, const const_iterator& __i,
+               const const_iterator& __j) {
+    replace(__p, 1, __i, __j);
+  }
+
+  void replace(size_t __p, const iterator& __i,
+               const iterator& __j) {
+    replace(__p, 1, __i, __j);
+  }
+
+  // Erase, (position, size) variant.
+  void erase(size_t __p, size_t __n) {
+    _RopeRep* __result = replace(_M_tree_ptr._M_data, __p, __p + __n, 0);
+    _S_unref(_M_tree_ptr._M_data);
+    _M_tree_ptr._M_data = __result;
+  }
+
+  // Erase, single character
+  void erase(size_t __p) {
+    erase(__p, __p + 1);
+  }
+
+  // Insert, iterator variants.  
+  iterator insert(const iterator& __p, const _Self& __r)
+  { insert(__p.index(), __r); return __p; }
+  iterator insert(const iterator& __p, size_t __n, _CharT __c)
+  { insert(__p.index(), __n, __c); return __p; }
+  iterator insert(const iterator& __p, _CharT __c) 
+  { insert(__p.index(), __c); return __p; }
+  iterator insert(const iterator& __p ) 
+  { insert(__p.index()); return __p; }
+  iterator insert(const iterator& __p, const _CharT* c_string) 
+  { insert(__p.index(), c_string); return __p; }
+  iterator insert(const iterator& __p, const _CharT* __i, size_t __n)
+  { insert(__p.index(), __i, __n); return __p; }
+  iterator insert(const iterator& __p, const _CharT* __i, 
+                  const _CharT* __j)
+  { insert(__p.index(), __i, __j);  return __p; }
+  iterator insert(const iterator& __p,
+                  const const_iterator& __i, const const_iterator& __j)
+  { insert(__p.index(), __i, __j); return __p; }
+  iterator insert(const iterator& __p,
+                  const iterator& __i, const iterator& __j)
+  { insert(__p.index(), __i, __j); return __p; }
+
+  // Replace, range variants.
+  void replace(const iterator& __p, const iterator& __q,
+               const _Self& __r)
+  { replace(__p.index(), __q.index() - __p.index(), __r); }
+  void replace(const iterator& __p, const iterator& __q, _CharT __c)
+  { replace(__p.index(), __q.index() - __p.index(), __c); }
+  void replace(const iterator& __p, const iterator& __q,
+               const _CharT* __c_string)
+  { replace(__p.index(), __q.index() - __p.index(), __c_string); }
+  void replace(const iterator& __p, const iterator& __q,
+               const _CharT* __i, size_t __n)
+  { replace(__p.index(), __q.index() - __p.index(), __i, __n); }
+  void replace(const iterator& __p, const iterator& __q,
+               const _CharT* __i, const _CharT* __j)
+  { replace(__p.index(), __q.index() - __p.index(), __i, __j); }
+  void replace(const iterator& __p, const iterator& __q,
+               const const_iterator& __i, const const_iterator& __j)
+  { replace(__p.index(), __q.index() - __p.index(), __i, __j); }
+  void replace(const iterator& __p, const iterator& __q,
+               const iterator& __i, const iterator& __j)
+  { replace(__p.index(), __q.index() - __p.index(), __i, __j); }
+
+  // Replace, iterator variants.
+  void replace(const iterator& __p, const _Self& __r)
+  { replace(__p.index(), __r); }
+  void replace(const iterator& __p, _CharT __c)
+  { replace(__p.index(), __c); }
+  void replace(const iterator& __p, const _CharT* __c_string)
+  { replace(__p.index(), __c_string); }
+  void replace(const iterator& __p, const _CharT* __i, size_t __n)
+  { replace(__p.index(), __i, __n); }
+  void replace(const iterator& __p, const _CharT* __i, const _CharT* __j)
+  { replace(__p.index(), __i, __j); }
+  void replace(const iterator& __p, const_iterator __i, 
+               const_iterator __j)
+  { replace(__p.index(), __i, __j); }
+  void replace(const iterator& __p, iterator __i, iterator __j)
+  { replace(__p.index(), __i, __j); }
+
+  // Iterator and range variants of erase
+  iterator erase(const iterator& __p, const iterator& __q) {
+    size_t __p_index = __p.index();
+    erase(__p_index, __q.index() - __p_index);
+    return iterator(this, __p_index);
+  }
+  iterator erase(const iterator& __p) {
+    size_t __p_index = __p.index();
+    erase(__p_index, 1);
+    return iterator(this, __p_index);
+  }
+
+  _Self substr(size_t __start, size_t __len = 1) const {
+    return rope<_CharT,_Alloc>(
+                               _S_substring(_M_tree_ptr._M_data, __start, __start + __len));
+  }
+
+  _Self substr(iterator __start, iterator __end) const {
+    return rope<_CharT,_Alloc>(
+                               _S_substring(_M_tree_ptr._M_data, __start.index(), __end.index()));
+  }
+        
+  _Self substr(iterator __start) const {
+    size_t __pos = __start.index();
+    return rope<_CharT,_Alloc>(
+                               _S_substring(_M_tree_ptr._M_data, __pos, __pos + 1));
+  }
+        
+  _Self substr(const_iterator __start, const_iterator __end) const {
+    // This might eventually take advantage of the cache in the
+    // iterator.
+    return rope<_CharT,_Alloc>(
+                               _S_substring(_M_tree_ptr._M_data, __start.index(), __end.index()));
+  }
+
+  rope<_CharT,_Alloc> substr(const_iterator __start) {
+    size_t __pos = __start.index();
+    return rope<_CharT,_Alloc>(
+                               _S_substring(_M_tree_ptr._M_data, __pos, __pos + 1));
+  }
+
+  enum { npos = -1 };
+
+  //         static const size_type npos;
+
+  size_type find(_CharT __c, size_type __pos = 0) const;
+  size_type find(const _CharT* __s, size_type __pos = 0) const {
+    size_type __result_pos;
+    const_iterator __result = search(const_begin() + (ptrdiff_t)__pos, const_end(),
+                                     __s, __s + _S_char_ptr_len(__s));
+    __result_pos = __result.index();
+#           ifndef _STLP_OLD_ROPE_SEMANTICS
+    if (__result_pos == size()) __result_pos = npos;
+#           endif
+    return __result_pos;
+  }
+
+  iterator mutable_begin() {
+    return(iterator(this, 0));
+  }
+
+  iterator mutable_end() {
+    return(iterator(this, size()));
+  }
+
+  reverse_iterator mutable_rbegin() {
+    return reverse_iterator(mutable_end());
+  }
+
+  reverse_iterator mutable_rend() {
+    return reverse_iterator(mutable_begin());
+  }
+
+  reference mutable_reference_at(size_type __pos) {
+    return reference(this, __pos);
+  }
+
+#       ifdef __STD_STUFF
+  reference operator[] (size_type __pos) {
+    return reference(this, __pos);
+  }
+
+  reference at(size_type __pos) {
+    // if (__pos >= size()) throw out_of_range;  // XXX
+    return (*this)[__pos];
+  }
+
+  void resize(size_type, _CharT) {}
+  void resize(size_type) {}
+  void reserve(size_type = 0) {}
+  size_type capacity() const {
+    return max_size();
+  }
+
+  // Stuff below this line is dangerous because it's error prone.
+  // I would really like to get rid of it.
+  // copy function with funny arg ordering.
+  size_type copy(_CharT* __buffer, size_type __n, 
+                 size_type __pos = 0) const {
+    return copy(__pos, __n, __buffer);
+  }
+
+  iterator end() { return mutable_end(); }
+
+  iterator begin() { return mutable_begin(); }
+
+  reverse_iterator rend() { return mutable_rend(); }
+
+  reverse_iterator rbegin() { return mutable_rbegin(); }
+
+#       else
+
+  const_iterator end() { return const_end(); }
+
+  const_iterator begin() { return const_begin(); }
+
+  const_reverse_iterator rend() { return const_rend(); }
+  
+  const_reverse_iterator rbegin() { return const_rbegin(); }
+
+#	endif
+
+  __ROPE_DEFINE_ALLOCS(_Alloc, _M_tree_ptr)
+    };
+
+# undef __ROPE_DEFINE_ALLOC
+# undef __ROPE_DEFINE_ALLOCS
+
+template <class _CharT, class _Alloc>
+inline _CharT 
+_Rope_const_iterator< _CharT, _Alloc>::operator[](size_t __n)
+{
+  return rope<_CharT,_Alloc>::_S_fetch(this->_M_root, this->_M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator== (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return (__x._M_current_pos == __y._M_current_pos && 
+          __x._M_root == __y._M_root);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator< (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                       const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return (__x._M_current_pos < __y._M_current_pos);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Alloc>
+inline bool operator!= (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator> (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                       const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return __y < __x;
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator<= (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return !(__y < __x);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator>= (const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Alloc>
+inline ptrdiff_t operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x,
+                           const _Rope_const_iterator<_CharT,_Alloc>& __y) {
+  return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos;
+}
+
+#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000		// dwa 8/21/97  - "ambiguous access to overloaded function" bug.
+template <class _CharT, class _Alloc>
+inline _Rope_const_iterator<_CharT,_Alloc>
+operator-(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) {
+  return _Rope_const_iterator<_CharT,_Alloc>(
+                                             __x._M_root, __x._M_current_pos - __n);
+}
+# endif
+
+template <class _CharT, class _Alloc>
+inline _Rope_const_iterator<_CharT,_Alloc>
+operator+(const _Rope_const_iterator<_CharT,_Alloc>& __x, ptrdiff_t __n) {
+  return _Rope_const_iterator<_CharT,_Alloc>(
+                                             __x._M_root, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline _Rope_const_iterator<_CharT,_Alloc>
+operator+(ptrdiff_t __n, const _Rope_const_iterator<_CharT,_Alloc>& __x) {
+  return _Rope_const_iterator<_CharT,_Alloc>(
+                                             __x._M_root, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator== (const _Rope_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return (__x._M_current_pos == __y._M_current_pos && 
+          __x._M_root_rope == __y._M_root_rope);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator< (const _Rope_iterator<_CharT,_Alloc>& __x,
+                       const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return (__x._M_current_pos < __y._M_current_pos);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Alloc>
+inline bool operator!= (const _Rope_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator> (const _Rope_iterator<_CharT,_Alloc>& __x,
+                       const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return __y < __x;
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator<= (const _Rope_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return !(__y < __x);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator>= (const _Rope_iterator<_CharT,_Alloc>& __x,
+                        const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Alloc>
+inline ptrdiff_t operator-(const _Rope_iterator<_CharT,_Alloc>& __x,
+                           const _Rope_iterator<_CharT,_Alloc>& __y) {
+  return (ptrdiff_t)__x._M_current_pos - (ptrdiff_t)__y._M_current_pos;
+}
+
+#if !defined( __MWERKS__ ) || __MWERKS__ >= 0x2000		// dwa 8/21/97  - "ambiguous access to overloaded function" bug.
+template <class _CharT, class _Alloc>
+inline _Rope_iterator<_CharT,_Alloc>
+operator-(const _Rope_iterator<_CharT,_Alloc>& __x,
+          ptrdiff_t __n) {
+  return _Rope_iterator<_CharT,_Alloc>(
+                                       __x._M_root_rope, __x._M_current_pos - __n);
+}
+# endif
+
+template <class _CharT, class _Alloc>
+inline _Rope_iterator<_CharT,_Alloc>
+operator+(const _Rope_iterator<_CharT,_Alloc>& __x,
+          ptrdiff_t __n) {
+  return _Rope_iterator<_CharT,_Alloc>(
+                                       __x._M_root_rope, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline _Rope_iterator<_CharT,_Alloc>
+operator+(ptrdiff_t __n, const _Rope_iterator<_CharT,_Alloc>& __x) {
+  return _Rope_iterator<_CharT,_Alloc>(
+                                       __x._M_root_rope, __x._M_current_pos + __n);
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+operator+ (const rope<_CharT,_Alloc>& __left,
+           const rope<_CharT,_Alloc>& __right)
+{
+  _STLP_ASSERT(__left.get_allocator() == __right.get_allocator())
+  return rope<_CharT,_Alloc>(rope<_CharT,_Alloc>::_S_concat_rep(__left._M_tree_ptr._M_data, __right._M_tree_ptr._M_data));
+  // Inlining this should make it possible to keep __left and
+  // __right in registers.
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>&
+operator+= (rope<_CharT,_Alloc>& __left, 
+            const rope<_CharT,_Alloc>& __right)
+{
+  __left.append(__right);
+  return __left;
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+operator+ (const rope<_CharT,_Alloc>& __left,
+           const _CharT* __right) {
+  size_t __rlen = rope<_CharT,_Alloc>::_S_char_ptr_len(__right);
+  return rope<_CharT,_Alloc>(
+                             rope<_CharT,_Alloc>::_S_concat_char_iter(
+                                                                      __left._M_tree_ptr._M_data, __right, __rlen)); 
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>&
+operator+= (rope<_CharT,_Alloc>& __left,
+            const _CharT* __right) {
+  __left.append(__right);
+  return __left;
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>
+operator+ (const rope<_CharT,_Alloc>& __left, _STLP_SIMPLE_TYPE(_CharT) __right) {
+  return rope<_CharT,_Alloc>(
+                             rope<_CharT,_Alloc>::_S_concat_char_iter(
+                                                                      __left._M_tree_ptr._M_data, &__right, 1));
+}
+
+template <class _CharT, class _Alloc>
+inline
+rope<_CharT,_Alloc>&
+operator+= (rope<_CharT,_Alloc>& __left, _STLP_SIMPLE_TYPE(_CharT) __right) {
+  __left.append(__right);
+  return __left;
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator< (const rope<_CharT,_Alloc>& __left, 
+           const rope<_CharT,_Alloc>& __right) {
+  return __left.compare(__right) < 0;
+}
+        
+template <class _CharT, class _Alloc>
+inline bool
+operator== (const rope<_CharT,_Alloc>& __left, 
+            const rope<_CharT,_Alloc>& __right) {
+  return __left.compare(__right) == 0;
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Alloc>
+inline bool
+operator!= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator> (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+  return __y < __x;
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator<= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+  return !(__y < __x);
+}
+
+template <class _CharT, class _Alloc>
+inline bool
+operator>= (const rope<_CharT,_Alloc>& __x, const rope<_CharT,_Alloc>& __y) {
+  return !(__x < __y);
+}
+
+template <class _CharT, class _Alloc>
+inline bool operator!= (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x,
+                        const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Alloc>
+inline bool operator== (const _Rope_char_ptr_proxy<_CharT,_Alloc>& __x,
+                        const _Rope_char_ptr_proxy<_CharT,_Alloc>& __y) {
+  return (__x._M_pos == __y._M_pos && __x._M_root == __y._M_root);
+}
+
+#ifdef _STLP_USE_NEW_IOSTREAMS
+template<class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& operator<< (
+                                            basic_ostream<_CharT, _Traits>& __o,
+                                            const rope<_CharT, _Alloc>& __r);
+#elif ! defined (_STLP_USE_NO_IOSTREAMS)
+template<class _CharT, class _Alloc>
+ostream& operator<< (ostream& __o, const rope<_CharT,_Alloc>& __r);        
+#endif
+        
+typedef rope<char, _STLP_DEFAULT_ALLOCATOR(char) > crope;
+# ifdef _STLP_HAS_WCHAR_T
+typedef rope<wchar_t, _STLP_DEFAULT_ALLOCATOR(wchar_t) > wrope;
+# endif
+
+inline crope::reference __mutable_reference_at(crope& __c, size_t __i)
+{
+  return __c.mutable_reference_at(__i);
+}
+
+# ifdef _STLP_HAS_WCHAR_T
+inline wrope::reference __mutable_reference_at(wrope& __c, size_t __i)
+{
+  return __c.mutable_reference_at(__i);
+}
+# endif
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _CharT, class _Alloc>
+inline void swap(rope<_CharT,_Alloc>& __x, rope<_CharT,_Alloc>& __y) {
+  __x.swap(__y);
+}
+#else
+
+inline void swap(crope& __x, crope& __y) { __x.swap(__y); }
+# ifdef _STLP_HAS_WCHAR_T	// dwa 8/21/97
+inline void swap(wrope& __x, wrope& __y) { __x.swap(__y); }
+# endif
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+
+// Hash functions should probably be revisited later:
+_STLP_TEMPLATE_NULL struct hash<crope>
+{
+  size_t operator()(const crope& __str) const
+  {
+    size_t _p_size = __str.size();
+
+    if (0 == _p_size) return 0;
+    return 13*__str[0] + 5*__str[_p_size - 1] + _p_size;
+  }
+};
+
+# ifdef _STLP_HAS_WCHAR_T	// dwa 8/21/97
+_STLP_TEMPLATE_NULL struct hash<wrope>
+{
+  size_t operator()(const wrope& __str) const
+  {
+    size_t _p_size = __str.size();
+
+    if (0 == _p_size) return 0;
+    return 13*__str[0] + 5*__str[_p_size - 1] + _p_size;
+  }
+};
+#endif
+
+#ifndef _STLP_MSVC
+// I couldn't get this to work with VC++
+template<class _CharT,class _Alloc>
+void
+_Rope_rotate(_Rope_iterator<_CharT,_Alloc> __first,
+             _Rope_iterator<_CharT,_Alloc> __middle,
+             _Rope_iterator<_CharT,_Alloc> __last);
+
+#if !defined(__GNUC__)
+// Appears to confuse g++
+inline void rotate(_Rope_iterator<char,_STLP_DEFAULT_ALLOCATOR(char) > __first,
+                   _Rope_iterator<char,_STLP_DEFAULT_ALLOCATOR(char) > __middle,
+                   _Rope_iterator<char,_STLP_DEFAULT_ALLOCATOR(char) > __last) {
+  _Rope_rotate(__first, __middle, __last);
+}
+#endif
+
+#endif
+
+template <class _CharT, class _Alloc>
+inline _Rope_char_ref_proxy<_CharT, _Alloc>::operator _CharT () const
+{
+  if (_M_current_valid) {
+	return _M_current;
+  } else {
+    return _My_rope::_S_fetch(_M_root->_M_tree_ptr._M_data, _M_pos);
+  }
+}
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_rope.c>
+# endif
+
+# endif /* _STLP_INTERNAL_ROPE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_set.h b/src/STLport/stl/_set.h
new file mode 100644
index 0000000..3f795a4
--- /dev/null
+++ b/src/STLport/stl/_set.h
@@ -0,0 +1,372 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_SET_H
+#define _STLP_INTERNAL_SET_H
+
+#ifndef _STLP_INTERNAL_TREE_H
+#include <stl/_tree.h>
+#endif
+
+#define set __WORKAROUND_RENAME(set)
+#define multiset __WORKAROUND_RENAME(multiset)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Key, __DFL_TMPL_PARAM(_Compare,less<_Key>), 
+                     _STLP_DEFAULT_ALLOCATOR_SELECT(_Key) >
+class set {
+public:
+// typedefs:
+  typedef _Key     key_type;
+  typedef _Key     value_type;
+  typedef _Compare key_compare;
+  typedef _Compare value_compare;
+private:
+  typedef _Rb_tree<key_type, value_type, 
+    _Identity<value_type>, key_compare, _Alloc> _Rep_type;
+public:
+  typedef typename _Rep_type::pointer pointer;
+  typedef typename _Rep_type::const_pointer const_pointer;
+  typedef typename _Rep_type::reference reference;
+  typedef typename _Rep_type::const_reference const_reference;
+  typedef typename _Rep_type::const_iterator const_iterator;
+  typedef const_iterator iterator;
+  typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+  typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename _Rep_type::size_type size_type;
+  typedef typename _Rep_type::difference_type difference_type;
+  typedef typename _Rep_type::allocator_type allocator_type;
+
+private:
+  _Rep_type _M_t;  // red-black tree representing set
+public:
+
+  // allocation/deallocation
+
+  set() : _M_t(_Compare(), allocator_type()) {}
+  explicit set(const _Compare& __comp,
+	       const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  set(_InputIterator __first, _InputIterator __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_unique(__first, __last); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  set(_InputIterator __first, _InputIterator __last, const _Compare& __comp)
+    : _M_t(__comp, allocator_type()) { _M_t.insert_unique(__first, __last); }
+# endif
+  template <class _InputIterator>
+  set(_InputIterator __first, _InputIterator __last, const _Compare& __comp,
+      const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+#else
+  set(const value_type* __first, const value_type* __last) 
+    : _M_t(_Compare(), allocator_type()) 
+    { _M_t.insert_unique(__first, __last); }
+
+  set(const value_type* __first, 
+      const value_type* __last, const _Compare& __comp,
+      const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+
+  set(const_iterator __first, const_iterator __last)
+    : _M_t(_Compare(), allocator_type()) 
+    { _M_t.insert_unique(__first, __last); }
+
+  set(const_iterator __first, const_iterator __last, const _Compare& __comp,
+      const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_unique(__first, __last); }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  set(const set<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}
+  set<_Key,_Compare,_Alloc>& operator=(const set<_Key, _Compare, _Alloc>& __x)
+  { 
+    _M_t = __x._M_t; 
+    return *this;
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return _M_t.key_comp(); }
+  value_compare value_comp() const { return _M_t.key_comp(); }
+  allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+  iterator begin() const { return _M_t.begin(); }
+  iterator end() const { return _M_t.end(); }
+  reverse_iterator rbegin() const { return _M_t.rbegin(); } 
+  reverse_iterator rend() const { return _M_t.rend(); }
+  bool empty() const { return _M_t.empty(); }
+  size_type size() const { return _M_t.size(); }
+  size_type max_size() const { return _M_t.max_size(); }
+  void swap(set<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+  // insert/erase
+  pair<iterator,bool> insert(const value_type& __x) { 
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    pair<_Rep_iterator, bool> __p = _M_t.insert_unique(__x); 
+    return pair<iterator, bool>(__REINTERPRET_CAST(const iterator&,__p.first), __p.second);
+  }
+  iterator insert(iterator __position, const value_type& __x) {
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    return _M_t.insert_unique((_Rep_iterator&)__position, __x);
+  }
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert(_InputIterator __first, _InputIterator __last) {
+    _M_t.insert_unique(__first, __last);
+  }
+#else
+  void insert(const_iterator __first, const_iterator __last) {
+    _M_t.insert_unique(__first, __last);
+  }
+  void insert(const value_type* __first, const value_type* __last) {
+    _M_t.insert_unique(__first, __last);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+  void erase(iterator __position) { 
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    _M_t.erase((_Rep_iterator&)__position); 
+  }
+  size_type erase(const key_type& __x) { 
+    return _M_t.erase(__x); 
+  }
+  void erase(iterator __first, iterator __last) { 
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last); 
+  }
+  void clear() { _M_t.clear(); }
+
+  // set operations:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+  template <class _KT>
+  iterator find(const _KT& __x) const { return _M_t.find(__x); }
+# else
+  iterator find(const key_type& __x) const { return _M_t.find(__x); }
+# endif
+  size_type count(const key_type& __x) const { 
+    return _M_t.find(__x) == _M_t.end() ? 0 : 1 ; 
+  }
+  iterator lower_bound(const key_type& __x) const {
+    return _M_t.lower_bound(__x);
+  }
+  iterator upper_bound(const key_type& __x) const {
+    return _M_t.upper_bound(__x); 
+  }
+  pair<iterator,iterator> equal_range(const key_type& __x) const {
+    return _M_t.equal_range(__x);
+  }
+};
+
+template <class _Key, __DFL_TMPL_PARAM(_Compare,less<_Key>), 
+                     _STLP_DEFAULT_ALLOCATOR_SELECT(_Key) >
+class multiset {
+public:
+  // typedefs:
+
+  typedef _Key     key_type;
+  typedef _Key     value_type;
+  typedef _Compare key_compare;
+  typedef _Compare value_compare;
+private:
+  typedef _Rb_tree<key_type, value_type, 
+                  _Identity<value_type>, key_compare, _Alloc> _Rep_type;
+public:
+  typedef typename _Rep_type::pointer pointer;
+  typedef typename _Rep_type::const_pointer const_pointer;
+  typedef typename _Rep_type::reference reference;
+  typedef typename _Rep_type::const_reference const_reference;
+  typedef typename _Rep_type::const_iterator const_iterator;
+  typedef const_iterator iterator;
+  typedef typename _Rep_type::const_reverse_iterator reverse_iterator;
+  typedef typename _Rep_type::const_reverse_iterator const_reverse_iterator;
+  typedef typename _Rep_type::size_type size_type;
+  typedef typename _Rep_type::difference_type difference_type;
+  typedef typename _Rep_type::allocator_type allocator_type;
+
+private:
+  _Rep_type _M_t;  // red-black tree representing multiset
+public:
+  // allocation/deallocation
+
+  multiset() : _M_t(_Compare(), allocator_type()) {}
+  explicit multiset(const _Compare& __comp,
+                    const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  multiset(_InputIterator __first, _InputIterator __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_equal(__first, __last); }
+
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  multiset(_InputIterator __first, _InputIterator __last,
+           const _Compare& __comp)
+    : _M_t(__comp, allocator_type()) { _M_t.insert_equal(__first, __last); }
+# endif
+  template <class _InputIterator>
+  multiset(_InputIterator __first, _InputIterator __last,
+           const _Compare& __comp,
+           const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+#else
+
+  multiset(const value_type* __first, const value_type* __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_equal(__first, __last); }
+
+  multiset(const value_type* __first, const value_type* __last,
+           const _Compare& __comp,
+           const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+
+  multiset(const_iterator __first, const_iterator __last)
+    : _M_t(_Compare(), allocator_type())
+    { _M_t.insert_equal(__first, __last); }
+
+  multiset(const_iterator __first, const_iterator __last,
+           const _Compare& __comp,
+           const allocator_type& __a = allocator_type())
+    : _M_t(__comp, __a) { _M_t.insert_equal(__first, __last); }
+   
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  multiset(const multiset<_Key,_Compare,_Alloc>& __x) : _M_t(__x._M_t) {}
+  multiset<_Key,_Compare,_Alloc>&
+  operator=(const multiset<_Key,_Compare,_Alloc>& __x) {
+    _M_t = __x._M_t; 
+    return *this;
+  }
+
+  // accessors:
+
+  key_compare key_comp() const { return _M_t.key_comp(); }
+  value_compare value_comp() const { return _M_t.key_comp(); }
+  allocator_type get_allocator() const { return _M_t.get_allocator(); }
+
+  iterator begin() const { return _M_t.begin(); }
+  iterator end() const { return _M_t.end(); }
+  reverse_iterator rbegin() const { return _M_t.rbegin(); } 
+  reverse_iterator rend() const { return _M_t.rend(); }
+  bool empty() const { return _M_t.empty(); }
+  size_type size() const { return _M_t.size(); }
+  size_type max_size() const { return _M_t.max_size(); }
+  void swap(multiset<_Key,_Compare,_Alloc>& __x) { _M_t.swap(__x._M_t); }
+
+  // insert/erase
+  iterator insert(const value_type& __x) { 
+    return _M_t.insert_equal(__x);
+  }
+  iterator insert(iterator __position, const value_type& __x) {
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    return _M_t.insert_equal((_Rep_iterator&)__position, __x);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template <class _InputIterator>
+  void insert(_InputIterator __first, _InputIterator __last) {
+    _M_t.insert_equal(__first, __last);
+  }
+#else
+  void insert(const value_type* __first, const value_type* __last) {
+    _M_t.insert_equal(__first, __last);
+  }
+  void insert(const_iterator __first, const_iterator __last) {
+    _M_t.insert_equal(__first, __last);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+  void erase(iterator __position) { 
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    _M_t.erase((_Rep_iterator&)__position); 
+  }
+  size_type erase(const key_type& __x) { 
+    return _M_t.erase(__x); 
+  }
+  void erase(iterator __first, iterator __last) { 
+    typedef typename _Rep_type::iterator _Rep_iterator;
+    _M_t.erase((_Rep_iterator&)__first, (_Rep_iterator&)__last); 
+  }
+  void clear() { _M_t.clear(); }
+
+  // multiset operations:
+
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS )
+  template <class _KT>
+  iterator find(const _KT& __x) const { return _M_t.find(__x); }
+# else
+  iterator find(const key_type& __x) const { return _M_t.find(__x); }
+# endif
+  size_type count(const key_type& __x) const { return _M_t.count(__x); }
+  iterator lower_bound(const key_type& __x) const {
+    return _M_t.lower_bound(__x);
+  }
+  iterator upper_bound(const key_type& __x) const {
+    return _M_t.upper_bound(__x); 
+  }
+  pair<iterator,iterator> equal_range(const key_type& __x) const {
+    return _M_t.equal_range(__x);
+  }
+};
+
+# define _STLP_TEMPLATE_HEADER template <class _Key, class _Compare, class _Alloc>
+# define _STLP_TEMPLATE_CONTAINER set<_Key,_Compare,_Alloc>
+# include <stl/_relops_cont.h>
+# undef  _STLP_TEMPLATE_CONTAINER
+# define _STLP_TEMPLATE_CONTAINER multiset<_Key,_Compare,_Alloc>
+# include <stl/_relops_cont.h>
+# undef  _STLP_TEMPLATE_CONTAINER
+# undef  _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+// do a cleanup
+# undef set
+# undef multiset
+// provide a way to access full funclionality 
+# define __set__  __FULL_NAME(set)
+# define __multiset__  __FULL_NAME(multiset)
+
+# ifdef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+# include <stl/wrappers/_set.h>
+# endif
+
+#endif /* _STLP_INTERNAL_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_site_config.h b/src/STLport/stl/_site_config.h
new file mode 100644
index 0000000..0ef8aa9
--- /dev/null
+++ b/src/STLport/stl/_site_config.h
@@ -0,0 +1,194 @@
+// 
+// This file defines site configuration.
+//
+//
+
+/* 
+ * _STLP_NO_THREADS: if defined, STLport don't use any 
+ * multithreading support. Synonym is _NOTHREADS
+ */
+// #define _NOTHREADS
+// #define _STLP_NO_THREADS
+
+/* _PTHREADS: if defined, use Posix threads for multithreading support. */
+// #define _PTHREADS
+
+// compatibility section
+
+# if defined (_STLP_NO_IOSTREAMS) || defined (_STLP_NO_NEW_IOSTREAMS) && ! defined ( _STLP_NO_OWN_IOSTREAMS )
+#  define _STLP_NO_OWN_IOSTREAMS
+# endif
+
+# if !defined (_STLP_NO_OWN_IOSTREAMS) &&  ! defined (_STLP_OWN_IOSTREAMS)
+#  define _STLP_OWN_IOSTREAMS
+# endif
+
+# if (defined (_STLP_NOTHREADS) || defined (_STLP_NO_THREADS) || defined (NOTHREADS))
+#  if ! defined (_NOTHREADS)
+#   define _NOTHREADS
+#  endif
+#  if ! defined (_STLP_NO_THREADS)
+#   define _STLP_NO_THREADS
+#  endif
+# endif
+
+/*
+ * Turn _STLP_USE_DYNAMIC_LIB to enforce use of .dll version of STLport library.
+ * NOTE : please do that only if you know what you are doing !
+ * Changing default will require you to change makefile in "src" accordingly
+ * and to rebuild STLPort library !
+ * On UNIX, this has no effect. 
+ *
+ */
+// # define _STLP_USE_DYNAMIC_LIB
+
+/*
+ * Turn _STLP_USE_STATIC_LIB to enforce use of static version of STLport library.
+ * NOTE : please do that only if you know what you are doing !
+ * Changing default will require you to change makefile in "src" accordingly
+ * and to rebuild STLPort library !
+ * On UNIX, this has no effect. 
+ *
+ */
+// # define _STLP_USE_STATIC_LIB
+
+
+/* 
+ * Edit relative path below (or put full path) to get native 
+ * compiler vendor's headers included. Default is "../include"
+ * Hint : never install STLport in the directory that ends with "include"
+ */
+// #  undef _STLP_NATIVE_INCLUDE_PATH
+// #  define _STLP_NATIVE_INCLUDE_PATH ../include
+// same for C library headers like <cstring>
+// #  undef _STLP_NATIVE_CPP_C_INCLUDE_PATH
+// #  define _STLP_NATIVE_CPP_C_INCLUDE_PATH ../include
+// same for C headers like <string.h>
+// #  undef _STLP_NATIVE_C_INCLUDE_PATH
+// #  define _STLP_NATIVE_C_INCLUDE_PATH ../include
+
+
+/* 
+ * _STLP_USE_OWN_NAMESPACE/_STLP_NO_OWN_NAMESPACE
+ * If defined, STLport uses _STL:: namespace, else std::
+ * The reason you have to use separate namespace in wrapper mode is that new-style IO
+ * compiled library may have its own idea about STL stuff (string, vector, etc.),
+ * so redefining them in the same namespace would break ODR and may cause
+ * undefined behaviour. Rule of thumb is - if new-style iostreams are
+ * available, there WILL be a conflict. Otherwise you should be OK.
+ * In STLport iostreams mode, there is no need for this flag other than to facilitate
+ * link with third-part libraries compiled with different standard library implementation.
+ */
+// #  define _STLP_USE_OWN_NAMESPACE 1
+// #  define _STLP_NO_OWN_NAMESPACE  1
+
+
+/* 
+ * Uncomment _STLP_USE_NEWALLOC to force allocator<T> to use plain "new"
+ * instead of STLport optimized node allocator engine.
+ */
+// #define   _STLP_USE_NEWALLOC   1
+
+/* 
+ * Uncomment _STLP_USE_MALLOC to force allocator<T> to use plain "malloc" 
+ * instead of STLport optimized node allocator engine.
+ */
+// #define   _STLP_USE_MALLOC 1
+
+/*
+ * Set _STLP_DEBUG_ALLOC to use allocators that perform memory debugging,
+ * such as padding/checking for memory consistency 
+ */
+// #define   _STLP_DEBUG_ALLOC 1
+
+
+/*
+ * Uncomment this to force all debug diagnostic to be directed through a
+ * user-defined global function:
+ *	void __stl_debug_message(const char * format_str, ...)
+ * instead of predefined STLport routine. 
+ * This allows you to take control of debug message output.
+ * Default routine calls fprintf(stderr,...)
+ * Note : If you set this macro, you must supply __stl_debug_message 
+ * function definition somewhere.
+ */
+//#define _STLP_DEBUG_MESSAGE 1
+
+/*
+ * Uncomment this to force all failed assertions to be executed through
+ * user-defined global function:
+ *	void __stl_debug_terminate(void). This allows
+ * you to take control of assertion behaviour for debugging purposes.
+ * Default routine throws unique exception if _STLP_USE_EXCEPTIONS is set,
+ * calls _STLP_ABORT() otherwise.
+ * Note : If you set this macro, you must supply __stl_debug_terminate 
+ * function definition somewhere.
+ */
+//#define _STLP_DEBUG_TERMINATE 1
+
+/*
+ * Comment this out to enable throwing exceptions from default __stl_debug_terminate()
+ * instead of calling _STLP_ABORT().
+ */
+#define   _STLP_NO_DEBUG_EXCEPTIONS 1
+
+/* 
+ * Uncomment that to disable exception handling code 
+ */
+// #define   _STLP_NO_EXCEPTIONS 1
+
+/*
+ * _STLP_NO_NAMESPACES: if defined, don't put the library in namespace
+ * stlport:: or std::, even if the compiler supports namespaces
+ */
+
+// #define   _STLP_NO_NAMESPACES 1
+
+//==========================================================
+// Compatibility section
+//==========================================================
+
+/* 
+ * Use abbreviated class names for linker benefit (don't affect interface).
+ * This option is obsolete, but should work in this release.
+ *
+ */
+// # define _STLP_USE_ABBREVS
+
+/* 
+ * This definition precludes STLport reverse_iterator to be compatible with
+ * other parts of MSVC library. (With partial specialization, it just
+ * has no effect).
+ * Use it _ONLY_ if you use SGI-style reverse_iterator<> template explicitly
+ */
+// #    define _STLP_NO_MSVC50_COMPATIBILITY 1
+
+/*
+ * _STLP_USE_RAW_SGI_ALLOCATORS is a hook so that users can disable use of
+ * allocator<T> as default parameter for containers, and use SGI
+ * raw allocators as default ones, without having to edit library headers.
+ * Use of this macro is strongly discouraged.
+ */
+// #define   _STLP_USE_RAW_SGI_ALLOCATORS 1
+
+/*
+ * Use obsolete overloaded template functions iterator_category(), value_type(), distance_type()
+ * for querying iterator properties. Please note those names are non-standard and are not guaranteed
+ * to be used by every implementation. However, this setting is on by default when partial specialization
+ * is not implemented in the compiler and cannot be sumulated (only if _STLP_NO_ANACHRONISMS is not set). 
+ * Use of those interfaces for user-defined iterators is strongly discouraged: 
+ * please use public inheritance from iterator<> template to achieve desired effect. 
+ * Second form is to disable old-style queries in any case.
+ */
+// # define _STLP_USE_OLD_HP_ITERATOR_QUERIES
+// # define _STLP_NO_OLD_HP_ITERATOR_QUERIES
+
+
+//==========================================================================
+
+// This section contains swithes which should be off by default,
+// but so few compilers would have it undefined, so that we set them here,
+// with the option to be turned off later in compiler-specific file
+
+# define _STLP_INCOMPLETE_EXCEPTION_HEADER
+
diff --git a/src/STLport/stl/_slist.c b/src/STLport/stl/_slist.c
new file mode 100644
index 0000000..11e67d4
--- /dev/null
+++ b/src/STLport/stl/_slist.c
@@ -0,0 +1,179 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_SLIST_C
+#define _STLP_SLIST_C
+
+#ifndef _STLP_INTERNAL_SLIST_H
+# include <stl/_slist.h>
+#endif
+
+# undef slist
+# define  slist  __WORKAROUND_DBG_RENAME(slist)
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG) 
+#  define size_type          size_t
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp, class _Alloc> 
+_Slist_node_base*
+_Slist_base<_Tp,_Alloc>::_M_erase_after(_Slist_node_base* __before_first,
+                                        _Slist_node_base* __last_node) {
+  _Slist_node<_Tp>* __cur = (_Slist_node<_Tp>*) (__before_first->_M_next);
+  while (__cur != __last_node) {
+    _Slist_node<_Tp>* __tmp = __cur;
+    __cur = (_Slist_node<_Tp>*) __cur->_M_next;
+    _STLP_STD::_Destroy(&__tmp->_M_data);
+    _M_head.deallocate(__tmp,1);
+  }
+  __before_first->_M_next = __last_node;
+  return __last_node;
+}
+
+template <class _Tp, class _Alloc>
+slist<_Tp,_Alloc>& slist<_Tp,_Alloc>::operator=(const slist<_Tp,_Alloc>& __x)
+{
+  if (&__x != this) {
+    _Node_base* __p1 = &this->_M_head._M_data;
+    _Node* __n1 = (_Node*) this->_M_head._M_data._M_next;
+    const _Node* __n2 = (const _Node*) __x._M_head._M_data._M_next;
+    while (__n1 && __n2) {
+      __n1->_M_data = __n2->_M_data;
+      __p1 = __n1;
+      __n1 = (_Node*) __n1->_M_next;
+      __n2 = (const _Node*) __n2->_M_next;
+    }
+    if (__n2 == 0)
+      this->_M_erase_after(__p1, 0);
+    else
+      _M_insert_after_range(__p1, const_iterator((_Node*)__n2), 
+                                  const_iterator(0));
+  }
+  return *this;
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp, _Alloc>::_M_fill_assign(size_type __n, const _Tp& __val) {
+  _Node_base* __prev = &this->_M_head._M_data;
+  _Node* __node = (_Node*) this->_M_head._M_data._M_next;
+  for ( ; __node != 0 && __n > 0 ; --__n) {
+    __node->_M_data = __val;
+    __prev = __node;
+    __node = (_Node*) __node->_M_next;
+  }
+  if (__n > 0)
+    _M_insert_after_fill(__prev, __n, __val);
+  else
+    this->_M_erase_after(__prev, 0);
+}
+
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::resize(size_type __len, const _Tp& __x)
+{
+  _Node_base* __cur = &this->_M_head._M_data;
+  while (__cur->_M_next != 0 && __len > 0) {
+    --__len;
+    __cur = __cur->_M_next;
+  }
+  if (__cur->_M_next) 
+    this->_M_erase_after(__cur, 0);
+  else
+    _M_insert_after_fill(__cur, __len, __x);
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::remove(const _Tp& __val)
+{
+  _Node_base* __cur = &this->_M_head._M_data;
+  while (__cur && __cur->_M_next) {
+    if (((_Node*) __cur->_M_next)->_M_data == __val)
+      this->_M_erase_after(__cur);
+    else
+      __cur = __cur->_M_next;
+  }
+}
+
+template <class _Tp, class _Alloc> 
+void slist<_Tp,_Alloc>::unique()
+{
+  _Node_base* __cur = this->_M_head._M_data._M_next;
+  if (__cur) {
+    while (__cur->_M_next) {
+      if (((_Node*)__cur)->_M_data == 
+          ((_Node*)(__cur->_M_next))->_M_data)
+        this->_M_erase_after(__cur);
+      else
+        __cur = __cur->_M_next;
+    }
+  }
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::merge(slist<_Tp,_Alloc>& __x)
+{
+  _Node_base* __n1 = &this->_M_head._M_data;
+  while (__n1->_M_next && __x._M_head._M_data._M_next) {
+    if (((_Node*) __x._M_head._M_data._M_next)->_M_data < 
+        ((_Node*)       __n1->_M_next)->_M_data) 
+      _Sl_global_inst::__splice_after(__n1, &__x._M_head._M_data, __x._M_head._M_data._M_next);
+    __n1 = __n1->_M_next;
+  }
+  if (__x._M_head._M_data._M_next) {
+    __n1->_M_next = __x._M_head._M_data._M_next;
+    __x._M_head._M_data._M_next = 0;
+  }
+}
+
+template <class _Tp, class _Alloc>
+void slist<_Tp,_Alloc>::sort()
+{
+  if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
+    _Self __carry;
+    _Self __counter[64];
+    int __fill = 0;
+    while (!empty()) {
+      _Sl_global_inst::__splice_after(&__carry._M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
+      int __i = 0;
+      while (__i < __fill && !__counter[__i].empty()) {
+        __counter[__i].merge(__carry);
+        __carry.swap(__counter[__i]);
+        ++__i;
+      }
+      __carry.swap(__counter[__i]);
+      if (__i == __fill)
+        ++__fill;
+    }
+
+    for (int __i = 1; __i < __fill; ++__i)
+      __counter[__i].merge(__counter[__i-1]);
+    this->swap(__counter[__fill-1]);
+  }
+}
+
+# undef slist
+# undef size_type
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_SLIST_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_slist.h b/src/STLport/stl/_slist.h
new file mode 100644
index 0000000..e2f84e4
--- /dev/null
+++ b/src/STLport/stl/_slist.h
@@ -0,0 +1,741 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_SLIST_H
+#define _STLP_INTERNAL_SLIST_H
+
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+#  include <stl/_construct.h>
+# endif
+
+# ifndef _STLP_INTERNAL_SLIST_BASE_H
+#  include <stl/_slist_base.h>
+# endif
+
+# undef slist
+# define  slist  __WORKAROUND_DBG_RENAME(slist)
+
+_STLP_BEGIN_NAMESPACE 
+
+template <class _Tp>
+struct _Slist_node : public _Slist_node_base
+{
+  _Tp _M_data;
+  __TRIVIAL_STUFF(_Slist_node)
+};
+
+struct _Slist_iterator_base {
+
+  typedef size_t               size_type;
+  typedef ptrdiff_t            difference_type;
+  typedef forward_iterator_tag iterator_category;
+
+  _Slist_node_base* _M_node;
+
+  _Slist_iterator_base(_Slist_node_base* __x) : _M_node(__x) {}
+
+  void _M_incr() { 
+//    _STLP_VERBOSE_ASSERT(_M_node != 0, _StlMsg_INVALID_ADVANCE)
+    _M_node = _M_node->_M_next; 
+  }
+  bool operator==(const _Slist_iterator_base& __y ) const { 
+    return _M_node == __y._M_node; 
+  }
+  bool operator!=(const _Slist_iterator_base& __y ) const { 
+    return _M_node != __y._M_node; 
+  }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+inline ptrdiff_t* _STLP_CALL distance_type(const _Slist_iterator_base&) { return 0; }
+inline forward_iterator_tag _STLP_CALL iterator_category(const _Slist_iterator_base&) { return forward_iterator_tag(); }
+#endif
+
+template <class _Tp, class _Traits>
+struct _Slist_iterator : public _Slist_iterator_base
+{
+  typedef _Tp value_type;
+  typedef typename _Traits::pointer    pointer;
+  typedef typename _Traits::reference  reference;
+  typedef forward_iterator_tag iterator_category;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  
+  typedef _Slist_iterator<_Tp, _Nonconst_traits<_Tp> > iterator;
+  typedef _Slist_iterator<_Tp, _Const_traits<_Tp> >    const_iterator;
+  typedef _Slist_iterator<_Tp, _Traits>                       _Self;
+
+  typedef _Slist_node<value_type> _Node;
+
+  _Slist_iterator(_Node* __x) : _Slist_iterator_base(__x) {}
+  _Slist_iterator() : _Slist_iterator_base(0) {}
+  _Slist_iterator(const iterator& __x) : _Slist_iterator_base(__x._M_node) {}
+
+  reference operator*() const { return ((_Node*) _M_node)->_M_data; }
+
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  _Self& operator++()
+  {
+    _M_incr();
+    return *this;
+  }
+  _Self operator++(int)
+  {
+    _Self __tmp = *this;
+    _M_incr();
+    return __tmp;
+  }
+};
+
+#ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp, class _Traits>
+inline _Tp* _STLP_CALL value_type(const _Slist_iterator<_Tp, _Traits>&) { return (_Tp*)0; }
+#endif /* OLD_QUERIES */
+
+// Base class that encapsulates details of allocators and simplifies EH
+
+template <class _Tp, class _Alloc> 
+struct _Slist_base {
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Alloc_traits<_Tp,_Alloc>::allocator_type allocator_type;
+  typedef _Slist_node<_Tp> _Node;
+
+  _Slist_base(const allocator_type& __a) : 
+    _M_head(_STLP_CONVERT_ALLOCATOR(__a, _Node), _Slist_node_base() ) { 
+    _M_head._M_data._M_next = 0; 
+  }
+  ~_Slist_base() { _M_erase_after(&_M_head._M_data, 0); }
+
+protected:
+  typedef typename _Alloc_traits<_Node,_Alloc>::allocator_type _M_node_allocator_type;
+
+  _Slist_node_base* _M_erase_after(_Slist_node_base* __pos)
+  {
+    _Node* __next = (_Node*) (__pos->_M_next);
+    _Slist_node_base* __next_next = __next->_M_next;
+    __pos->_M_next = __next_next;
+    _STLP_STD::_Destroy(&__next->_M_data);
+    _M_head.deallocate(__next,1);
+    return __next_next;
+  }
+  _Slist_node_base* _M_erase_after(_Slist_node_base*, _Slist_node_base*);
+
+public:
+  allocator_type get_allocator() const { 
+    return _STLP_CONVERT_ALLOCATOR((const _M_node_allocator_type&)_M_head, _Tp); 
+  }
+  _STLP_alloc_proxy<_Slist_node_base, _Node, _M_node_allocator_type> _M_head;
+};  
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class slist : protected _Slist_base<_Tp,_Alloc>
+{
+private:
+  typedef _Slist_base<_Tp,_Alloc> _Base;
+  typedef slist<_Tp,_Alloc> _Self;
+public:
+  typedef _Tp                value_type;
+  typedef value_type*       pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type&       reference;
+  typedef const value_type& const_reference;
+  typedef size_t            size_type;
+  typedef ptrdiff_t         difference_type;
+  typedef forward_iterator_tag _Iterator_category;
+
+  typedef _Slist_iterator<_Tp, _Nonconst_traits<_Tp> >  iterator;
+  typedef _Slist_iterator<_Tp, _Const_traits<_Tp> >     const_iterator;
+
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Base::allocator_type allocator_type;
+
+
+private:
+  typedef _Slist_node<_Tp>      _Node;
+  typedef _Slist_node_base      _Node_base;
+  typedef _Slist_iterator_base  _Iterator_base;
+
+  _Node* _M_create_node(const value_type& __x) {
+    _Node* __node = this->_M_head.allocate(1);
+    _STLP_TRY {
+      _Construct(&__node->_M_data, __x);
+      __node->_M_next = 0;
+    }
+    _STLP_UNWIND(this->_M_head.deallocate(__node, 1));
+    return __node;
+  }
+  
+  _Node* _M_create_node() {
+    _Node* __node = this->_M_head.allocate(1);
+    _STLP_TRY {
+      _Construct(&__node->_M_data);
+      __node->_M_next = 0;
+    }
+    _STLP_UNWIND(this->_M_head.deallocate(__node, 1));
+    return __node;
+  }
+
+public:
+  allocator_type get_allocator() const { return _Base::get_allocator(); }
+
+  explicit slist(const allocator_type& __a = allocator_type()) : _Slist_base<_Tp,_Alloc>(__a) {}
+
+  slist(size_type __n, const value_type& __x,
+        const allocator_type& __a =  allocator_type()) : _Slist_base<_Tp,_Alloc>(__a)
+    { _M_insert_after_fill(&this->_M_head._M_data, __n, __x); }
+
+  explicit slist(size_type __n) : _Slist_base<_Tp,_Alloc>(allocator_type())
+    { _M_insert_after_fill(&this->_M_head._M_data, __n, value_type()); }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  // We don't need any dispatching tricks here, because _M_insert_after_range
+  // already does them.
+  template <class _InputIterator>
+  slist(_InputIterator __first, _InputIterator __last,
+        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : 
+    _Slist_base<_Tp,_Alloc>(__a)
+  { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  // VC++ needs this crazyness
+  template <class _InputIterator>
+  slist(_InputIterator __first, _InputIterator __last) :
+    _Slist_base<_Tp,_Alloc>(allocator_type())
+  { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+# endif  
+#else /* _STLP_MEMBER_TEMPLATES */
+  slist(const_iterator __first, const_iterator __last,
+        const allocator_type& __a =  allocator_type() ) :
+    _Slist_base<_Tp,_Alloc>(__a)
+    { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+  slist(const value_type* __first, const value_type* __last,
+        const allocator_type& __a =  allocator_type()) : 
+    _Slist_base<_Tp,_Alloc>(__a)
+    { _M_insert_after_range(&this->_M_head._M_data, __first, __last); }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  slist(const _Self& __x) : _Slist_base<_Tp,_Alloc>(__x.get_allocator())
+    { _M_insert_after_range(&this->_M_head._M_data, __x.begin(), __x.end()); }
+
+  _Self& operator= (const _Self& __x);
+
+  ~slist() {}
+
+public:
+  // assign(), a generalized assignment member function.  Two
+  // versions: one that takes a count, and one that takes a range.
+  // The range version is a member template, so we dispatch on whether
+  // or not the type is an integer.
+
+  void assign(size_type __n, const _Tp& __val)
+    { _M_fill_assign(__n, __val); }
+
+  void _M_fill_assign(size_type __n, const _Tp& __val);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_assign_dispatch(__first, __last, _Integral());
+  }
+
+  template <class _Integer>
+  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+    { _M_fill_assign((size_type) __n, (_Tp) __val); }
+
+  template <class _InputIter>
+  void
+  _M_assign_dispatch(_InputIter __first, _InputIter __last,
+		     const __false_type&) {
+    _Node_base* __prev = &this->_M_head._M_data;
+    _Node* __node = (_Node*) this->_M_head._M_data._M_next;
+    while (__node != 0 && __first != __last) {
+      __node->_M_data = *__first;
+      __prev = __node;
+      __node = (_Node*) __node->_M_next;
+      ++__first;
+    }
+    if (__first != __last)
+      _M_insert_after_range(__prev, __first, __last);
+    else
+      this->_M_erase_after(__prev, 0);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+
+  // Experimental new feature: before_begin() returns a
+  // non-dereferenceable iterator that, when incremented, yields
+  // begin().  This iterator may be used as the argument to
+  // insert_after, erase_after, etc.  Note that even for an empty 
+  // slist, before_begin() is not the same iterator as end().  It 
+  // is always necessary to increment before_begin() at least once to
+  // obtain end().
+  iterator before_begin() { return iterator((_Node*) &this->_M_head._M_data); }
+  const_iterator before_begin() const
+    { return const_iterator((_Node*) &this->_M_head._M_data); }
+
+  iterator begin() { return iterator((_Node*)this->_M_head._M_data._M_next); }
+  const_iterator begin() const 
+    { return const_iterator((_Node*)this->_M_head._M_data._M_next);}
+
+  iterator end() { return iterator(0); }
+  const_iterator end() const { return const_iterator(0); }
+
+  size_type size() const { return _Sl_global_inst::size(this->_M_head._M_data._M_next); }
+  
+  size_type max_size() const { return size_type(-1); }
+
+  bool empty() const { return this->_M_head._M_data._M_next == 0; }
+
+  void swap(_Self& __x) { 
+    _STLP_STD::swap(this->_M_head, __x._M_head); 
+  }
+
+public:
+  reference front() { return ((_Node*) this->_M_head._M_data._M_next)->_M_data; }
+  const_reference front() const 
+    { return ((_Node*) this->_M_head._M_data._M_next)->_M_data; }
+  void push_front(const value_type& __x)   {
+    __slist_make_link(&this->_M_head._M_data, _M_create_node(__x));
+  }
+
+# ifndef _STLP_NO_ANACHRONISMS
+  void push_front() { __slist_make_link(&this->_M_head._M_data, _M_create_node());}
+# endif
+
+  void pop_front() {
+    _Node* __node = (_Node*) this->_M_head._M_data._M_next;
+    this->_M_head._M_data._M_next = __node->_M_next;
+    _STLP_STD::_Destroy(&__node->_M_data);
+    this->_M_head.deallocate(__node, 1);
+  }
+
+  iterator previous(const_iterator __pos) {
+    return iterator((_Node*) _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node));
+  }
+  const_iterator previous(const_iterator __pos) const {
+    return const_iterator((_Node*) _Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node));
+  }
+
+private:
+  _Node* _M_insert_after(_Node_base* __pos, const value_type& __x) {
+    return (_Node*) (__slist_make_link(__pos, _M_create_node(__x)));
+  }
+
+  _Node* _M_insert_after(_Node_base* __pos) {
+    return (_Node*) (__slist_make_link(__pos, _M_create_node()));
+  }
+
+  void _M_insert_after_fill(_Node_base* __pos,
+                            size_type __n, const value_type& __x) {
+    for (size_type __i = 0; __i < __n; ++__i)
+      __pos = __slist_make_link(__pos, _M_create_node(__x));
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InIter>
+  void _M_insert_after_range(_Node_base* __pos, 
+                             _InIter __first, _InIter __last) {
+    typedef typename _Is_integer<_InIter>::_Integral _Integral;
+    _M_insert_after_range(__pos, __first, __last, _Integral());
+  }
+
+  template <class _Integer>
+  void _M_insert_after_range(_Node_base* __pos, _Integer __n, _Integer __x,
+                             const __true_type&) {
+    _M_insert_after_fill(__pos, __n, __x);
+  }
+
+  template <class _InIter>
+  void _M_insert_after_range(_Node_base* __pos,
+                             _InIter __first, _InIter __last,
+                             const __false_type&) {
+    while (__first != __last) {
+      __pos = __slist_make_link(__pos, _M_create_node(*__first));
+      ++__first;
+    }
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void _M_insert_after_range(_Node_base* __pos,
+                             const_iterator __first, const_iterator __last) {
+    while (__first != __last) {
+      __pos = __slist_make_link(__pos, _M_create_node(*__first));
+      ++__first;
+    }
+  }
+  void _M_insert_after_range(_Node_base* __pos,
+                             const value_type* __first,
+                             const value_type* __last) {
+    while (__first != __last) {
+      __pos = __slist_make_link(__pos, _M_create_node(*__first));
+      ++__first;
+    }
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:
+
+  iterator insert_after(iterator __pos, const value_type& __x) {
+    return iterator(_M_insert_after(__pos._M_node, __x));
+  }
+
+  iterator insert_after(iterator __pos) {
+    return insert_after(__pos, value_type());
+  }
+
+  void insert_after(iterator __pos, size_type __n, const value_type& __x) {
+    _M_insert_after_fill(__pos._M_node, __n, __x);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // We don't need any dispatching tricks here, because _M_insert_after_range
+  // already does them.
+  template <class _InIter>
+  void insert_after(iterator __pos, _InIter __first, _InIter __last) {
+    _M_insert_after_range(__pos._M_node, __first, __last);
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void insert_after(iterator __pos,
+                    const_iterator __first, const_iterator __last) {
+    _M_insert_after_range(__pos._M_node, __first, __last);
+  }
+  void insert_after(iterator __pos,
+                    const value_type* __first, const value_type* __last) {
+    _M_insert_after_range(__pos._M_node, __first, __last);
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  iterator insert(iterator __pos, const value_type& __x) {
+    return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+                    __x));
+  }
+
+  iterator insert(iterator __pos) {
+    return iterator(_M_insert_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+                                    value_type()));
+  }
+
+  void insert(iterator __pos, size_type __n, const value_type& __x) {
+    _M_insert_after_fill(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), __n, __x);
+  } 
+    
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // We don't need any dispatching tricks here, because _M_insert_after_range
+  // already does them.
+  template <class _InIter>
+  void insert(iterator __pos, _InIter __first, _InIter __last) {
+    _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), 
+                          __first, __last);
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void insert(iterator __pos, const_iterator __first, const_iterator __last) {
+    _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), 
+                          __first, __last);
+  }
+  void insert(iterator __pos, const value_type* __first, 
+                              const value_type* __last) {
+    _M_insert_after_range(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node), 
+                          __first, __last);
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+
+public:
+  iterator erase_after(iterator __pos) {
+    return iterator((_Node*) this->_M_erase_after(__pos._M_node));
+  }
+  iterator erase_after(iterator __before_first, iterator __last) {
+    return iterator((_Node*) this->_M_erase_after(__before_first._M_node, 
+                                            __last._M_node));
+  } 
+
+  iterator erase(iterator __pos) {
+    return iterator((_Node*) this->_M_erase_after(_Sl_global_inst::__previous(&this->_M_head._M_data, 
+                                                    __pos._M_node)));
+  }
+  iterator erase(iterator __first, iterator __last) {
+    return iterator((_Node*) this->_M_erase_after(
+      _Sl_global_inst::__previous(&this->_M_head._M_data, __first._M_node), __last._M_node));
+  }
+
+  void resize(size_type new_size, const _Tp& __x);
+  void resize(size_type new_size) { resize(new_size, _Tp()); }
+  void clear() {
+    this->_M_erase_after(&this->_M_head._M_data, 0); 
+  }
+
+public:
+  // Moves the range [__before_first + 1, __before_last + 1) to *this,
+  //  inserting it immediately after __pos.  This is constant time.
+  void splice_after(iterator __pos, 
+                    iterator __before_first, iterator __before_last)
+  {
+    if (__before_first != __before_last) {
+      _Sl_global_inst::__splice_after(__pos._M_node, __before_first._M_node, 
+                           __before_last._M_node);
+    }
+  }
+
+  // Moves the element that follows __prev to *this, inserting it immediately
+  //  after __pos.  This is constant time.
+  void splice_after(iterator __pos, iterator __prev)
+  {
+    _Sl_global_inst::__splice_after(__pos._M_node,
+                         __prev._M_node, __prev._M_node->_M_next);
+  }
+
+  // Removes all of the elements from the list __x to *this, inserting
+  // them immediately after __pos.  __x must not be *this.  Complexity:
+  // linear in __x.size().
+  void splice_after(iterator __pos, _Self& __x)
+  {
+    _Sl_global_inst::__splice_after(__pos._M_node, &__x._M_head._M_data);
+  }
+
+  // Linear in distance(begin(), __pos), and linear in __x.size().
+  void splice(iterator __pos, _Self& __x) {
+    if (__x._M_head._M_data._M_next)
+      _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+                           &__x._M_head._M_data, _Sl_global_inst::__previous(&__x._M_head._M_data, 0));
+  }
+
+  // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i).
+  void splice(iterator __pos, _Self& __x, iterator __i) {
+    _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+                         _Sl_global_inst::__previous(&__x._M_head._M_data, __i._M_node),
+                         __i._M_node);
+  }
+
+  // Linear in distance(begin(), __pos), in distance(__x.begin(), __first),
+  // and in distance(__first, __last).
+  void splice(iterator __pos, _Self& __x, iterator __first, iterator __last)
+  {
+    if (__first != __last)
+      _Sl_global_inst::__splice_after(_Sl_global_inst::__previous(&this->_M_head._M_data, __pos._M_node),
+                           _Sl_global_inst::__previous(&__x._M_head._M_data, __first._M_node),
+                           _Sl_global_inst::__previous(__first._M_node, __last._M_node));
+  }
+
+public:
+  void reverse() { 
+    if (this->_M_head._M_data._M_next)
+      this->_M_head._M_data._M_next = _Sl_global_inst::__reverse(this->_M_head._M_data._M_next);
+  }
+
+  void remove(const _Tp& __val); 
+  void unique(); 
+  void merge(_Self& __x);
+  void sort();     
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _Predicate>
+  void remove_if(_Predicate __pred) {
+    _Node_base* __cur = &this->_M_head._M_data;
+    while (__cur->_M_next) {
+      if (__pred(((_Node*) __cur->_M_next)->_M_data))
+	this->_M_erase_after(__cur);
+      else
+	__cur = __cur->_M_next;
+    }
+  }
+
+  template <class _BinaryPredicate> 
+  void unique(_BinaryPredicate __pred) {
+    _Node* __cur = (_Node*) this->_M_head._M_data._M_next;
+    if (__cur) {
+      while (__cur->_M_next) {
+	if (__pred(((_Node*)__cur)->_M_data, 
+		   ((_Node*)(__cur->_M_next))->_M_data))
+	  this->_M_erase_after(__cur);
+	else
+	  __cur = (_Node*) __cur->_M_next;
+      }
+    }
+  }
+
+  template <class _StrictWeakOrdering>
+  void merge(slist<_Tp,_Alloc>& __x,
+	     _StrictWeakOrdering __comp) {
+    _Node_base* __n1 = &this->_M_head._M_data;
+    while (__n1->_M_next && __x._M_head._M_data._M_next) {
+      if (__comp(((_Node*) __x._M_head._M_data._M_next)->_M_data,
+		 ((_Node*)       __n1->_M_next)->_M_data))
+	_Sl_global_inst::__splice_after(__n1, &__x._M_head._M_data, __x._M_head._M_data._M_next);
+      __n1 = __n1->_M_next;
+    }
+    if (__x._M_head._M_data._M_next) {
+      __n1->_M_next = __x._M_head._M_data._M_next;
+      __x._M_head._M_data._M_next = 0;
+    }
+  }
+
+  template <class _StrictWeakOrdering> 
+  void sort(_StrictWeakOrdering __comp) {
+    if (this->_M_head._M_data._M_next && this->_M_head._M_data._M_next->_M_next) {
+      slist __carry;
+      slist __counter[64];
+      int __fill = 0;
+      while (!empty()) {
+	_Sl_global_inst::__splice_after(&__carry._M_head._M_data, &this->_M_head._M_data, this->_M_head._M_data._M_next);
+	int __i = 0;
+	while (__i < __fill && !__counter[__i].empty()) {
+	  __counter[__i].merge(__carry, __comp);
+	  __carry.swap(__counter[__i]);
+	  ++__i;
+	}
+	__carry.swap(__counter[__i]);
+	if (__i == __fill)
+	  ++__fill;
+      }
+      
+      for (int __i = 1; __i < __fill; ++__i)
+	__counter[__i].merge(__counter[__i-1], __comp);
+      this->swap(__counter[__fill-1]);
+    }
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+template <class _Tp, class _Alloc>
+inline bool  _STLP_CALL
+operator==(const slist<_Tp,_Alloc>& _SL1, const slist<_Tp,_Alloc>& _SL2)
+{
+  typedef typename slist<_Tp,_Alloc>::const_iterator const_iterator;
+  const_iterator __end1 = _SL1.end();
+  const_iterator __end2 = _SL2.end();
+
+  const_iterator __i1 = _SL1.begin();
+  const_iterator __i2 = _SL2.begin();
+  while (__i1 != __end1 && __i2 != __end2 && *__i1 == *__i2) {
+    ++__i1;
+    ++__i2;
+   }
+  return __i1 == __end1 && __i2 == __end2;
+}
+
+# define _STLP_EQUAL_OPERATOR_SPECIALIZED
+# define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
+# define _STLP_TEMPLATE_CONTAINER slist<_Tp, _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+# undef _STLP_EQUAL_OPERATOR_SPECIALIZED
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_slist.c>
+# endif
+
+#  undef  slist
+#  define __slist__ __FULL_NAME(slist)
+
+#if defined (_STLP_DEBUG) && !defined (_STLP_INTERNAL_DBG_SLIST_H)
+# include <stl/debug/_slist.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+// Specialization of insert_iterator so that insertions will be constant
+// time rather than linear time.
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _Tp, class _Alloc>
+class insert_iterator<slist<_Tp, _Alloc> > {
+protected:
+  typedef slist<_Tp, _Alloc> _Container;
+  _Container* container;
+  typename _Container::iterator iter;
+public:
+  typedef _Container          container_type;
+  typedef output_iterator_tag iterator_category;
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+
+  insert_iterator(_Container& __x, typename _Container::iterator __i) 
+    : container(&__x) {
+    if (__i == __x.begin())
+      iter = __x.before_begin();
+    else
+      iter = __x.previous(__i);
+  }
+
+  insert_iterator<_Container>&
+  operator=(const typename _Container::value_type& __val) { 
+    iter = container->insert_after(iter, __val);
+    return *this;
+  }
+  insert_iterator<_Container>& operator*() { return *this; }
+  insert_iterator<_Container>& operator++() { return *this; }
+  insert_iterator<_Container>& operator++(int) { return *this; }
+};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+_STLP_END_NAMESPACE
+
+
+# if defined ( _STLP_USE_WRAPPER_FOR_ALLOC_PARAM )
+# include <stl/wrappers/_slist.h>
+# endif
+
+#endif /* _STLP_INTERNAL_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_slist_base.c b/src/STLport/stl/_slist_base.c
new file mode 100644
index 0000000..26fb6ea
--- /dev/null
+++ b/src/STLport/stl/_slist_base.c
@@ -0,0 +1,109 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_SLIST_BASE_C
+#define _STLP_SLIST_BASE_C
+
+#ifndef _STLP_INTERNAL_SLIST_BASE_H
+# include <stl/_slist_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+template <class _Dummy>
+_Slist_node_base*  _STLP_CALL
+_Sl_global<_Dummy>::__previous(_Slist_node_base* __head,
+			       const _Slist_node_base* __node)
+{
+  while (__head && __head->_M_next != __node)
+    __head = __head->_M_next;
+  return __head;
+}
+
+template <class _Dummy>
+void _STLP_CALL
+_Sl_global<_Dummy>::__splice_after(_Slist_node_base* __pos, _Slist_node_base* __head)
+{
+  _Slist_node_base* __before_last = __previous(__head, 0);
+  if (__before_last != __head) {
+    _Slist_node_base* __after = __pos->_M_next;
+    __pos->_M_next = __head->_M_next;
+    __head->_M_next = 0;
+    __before_last->_M_next = __after;
+  }
+}
+
+template <class _Dummy>
+void _STLP_CALL
+_Sl_global<_Dummy>::__splice_after(_Slist_node_base* __pos,
+				   _Slist_node_base* __before_first,
+				   _Slist_node_base* __before_last)
+{
+  if (__pos != __before_first && __pos != __before_last) {
+    _Slist_node_base* __first = __before_first->_M_next;
+    _Slist_node_base* __after = __pos->_M_next;
+    __before_first->_M_next = __before_last->_M_next;
+    __pos->_M_next = __first;
+    __before_last->_M_next = __after;
+  }
+}
+
+template <class _Dummy>
+_Slist_node_base* _STLP_CALL
+_Sl_global<_Dummy>::__reverse(_Slist_node_base* __node)
+{
+  _Slist_node_base* __result = __node;
+  __node = __node->_M_next;
+  __result->_M_next = 0;
+  while(__node) {
+    _Slist_node_base* __next = __node->_M_next;
+    __node->_M_next = __result;
+    __result = __node;
+    __node = __next;
+  }
+  return __result;
+}
+
+template <class _Dummy> 
+size_t _STLP_CALL
+_Sl_global<_Dummy>::size(_Slist_node_base* __node)
+{
+  size_t __result = 0;
+  for ( ; __node != 0; __node = __node->_M_next)
+    ++__result;
+  return __result;
+}
+
+#endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_SLIST_BASE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_slist_base.h b/src/STLport/stl/_slist_base.h
new file mode 100644
index 0000000..e090e81
--- /dev/null
+++ b/src/STLport/stl/_slist_base.h
@@ -0,0 +1,87 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_SLIST_BASE_H
+#define _STLP_INTERNAL_SLIST_BASE_H
+
+#ifndef _STLP_CSTDDEF
+#include <cstddef>
+#endif
+
+_STLP_BEGIN_NAMESPACE 
+
+struct _Slist_node_base
+{
+  _Slist_node_base* _M_next;
+};
+
+inline _Slist_node_base*
+__slist_make_link(_Slist_node_base* __prev_node,
+                  _Slist_node_base* __new_node)
+{
+  __new_node->_M_next = __prev_node->_M_next;
+  __prev_node->_M_next = __new_node;
+  return __new_node;
+}
+
+
+template <class _Dummy>
+class _Sl_global {
+public:
+  // those used to be global functions 
+  // moved here to reduce code bloat without templatizing _Slist_iterator_base
+  static size_t _STLP_CALL size(_Slist_node_base* __node);
+  static _Slist_node_base* _STLP_CALL __reverse(_Slist_node_base* __node);
+  static void _STLP_CALL __splice_after(_Slist_node_base* __pos,
+                                        _Slist_node_base* __before_first,
+                                        _Slist_node_base* __before_last);
+  
+  static void _STLP_CALL __splice_after(_Slist_node_base* __pos, _Slist_node_base* __head);
+
+  static _Slist_node_base* _STLP_CALL __previous(_Slist_node_base* __head,
+                                                 const _Slist_node_base* __node);
+  static const _Slist_node_base* _STLP_CALL __previous(const _Slist_node_base* __head,
+					    const _Slist_node_base* __node) {
+    return _Sl_global<_Dummy>::__previous((_Slist_node_base*)__head, __node);
+  }
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+_STLP_EXPORT_TEMPLATE_CLASS _Sl_global<bool>;
+# endif
+typedef _Sl_global<bool> _Sl_global_inst;
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_slist_base.c>
+# endif
+
+#endif /* _STLP_INTERNAL_SLIST_BASE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_sparc_atomic.h b/src/STLport/stl/_sparc_atomic.h
new file mode 100644
index 0000000..320dd19
--- /dev/null
+++ b/src/STLport/stl/_sparc_atomic.h
@@ -0,0 +1,60 @@
+
+// Currently, SUN CC requires object file
+
+#if defined (__GNUC__)
+
+/*
+**  int _STLP_atomic_exchange (__stl_atomic_t *pvalue, __stl_atomic_t value)
+*/
+ 
+# ifdef __sparc_v9__
+
+#  ifdef __arch64__
+
+#   define _STLP_EXCH_ASM  asm volatile ("casx [%3], %4, %0 ;  membar  #LoadLoad | #LoadStore " : \
+                   "=r" (_L_value2), "=m" (*_L_pvalue1) : \
+                   "m" (*_L_pvalue1), "r" (_L_pvalue1), "r" (_L_value1), "0" (_L_value2) )
+
+#  else /* __arch64__ */
+
+#   define _STLP_EXCH_ASM  asm volatile ("cas [%3], %4, %0" : \
+                   "=r" (_L_value2), "=m" (*_L_pvalue1) : \
+                   "m" (*_L_pvalue1), "r" (_L_pvalue1), "r" (_L_value1), "0" (_L_value2) )
+#  endif
+
+# else /* __sparc_v9__ */
+
+#  define _STLP_EXCH_ASM asm volatile ("swap [%3], %0 " : \
+                                       "=r" (_L_value2), "=m" (*_L_pvalue1) : \
+                                       "m" (*_L_pvalue1), "r" (_L_pvalue1),  "0" (_L_value2) )
+# endif
+
+
+#  define _STLP_ATOMIC_EXCHANGE(__pvalue1, __value2) \
+ ({  register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
+     register __stl_atomic_t _L_value1, _L_value2 =  __value2 ; \
+     do { _L_value1 = *_L_pvalue1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; \
+     _L_value1; })
+
+#  define _STLP_ATOMIC_INCREMENT(__pvalue1) \
+ {  register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
+    register __stl_atomic_t _L_value1, _L_value2; \
+    do { _L_value1 = *_L_pvalue1;  _L_value2 = _L_value1+1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; }
+
+#  define _STLP_ATOMIC_DECREMENT(__pvalue1) \
+ {  register volatile __stl_atomic_t *_L_pvalue1 = __pvalue1; \
+    register __stl_atomic_t _L_value1, _L_value2; \
+    do { _L_value1 = *_L_pvalue1;  _L_value2 = _L_value1-1; _STLP_EXCH_ASM; } while ( _L_value1 != _L_value2 ) ; }
+
+# elif ! defined (_STLP_NO_EXTERN_INLINE) 
+
+extern "C" __stl_atomic_t _STLP_atomic_exchange(__stl_atomic_t * __x, __stl_atomic_t __v);
+extern "C" void _STLP_atomic_decrement(__stl_atomic_t* i);
+extern "C" void _STLP_atomic_increment(__stl_atomic_t* i);
+
+#  define _STLP_ATOMIC_INCREMENT(__x)           _STLP_atomic_increment((__stl_atomic_t*)__x)
+#  define _STLP_ATOMIC_DECREMENT(__x)           _STLP_atomic_decrement((__stl_atomic_t*)__x)
+#  define _STLP_ATOMIC_EXCHANGE(__x, __y)       _STLP_atomic_exchange((__stl_atomic_t*)__x, (__stl_atomic_t)__y)
+
+# endif
+
diff --git a/src/STLport/stl/_sstream.c b/src/STLport/stl/_sstream.c
new file mode 100644
index 0000000..411e2b1
--- /dev/null
+++ b/src/STLport/stl/_sstream.c
@@ -0,0 +1,543 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_SSTREAM_C
+#define _STLP_SSTREAM_C
+
+#ifndef _STLP_SSTREAM_H
+# include <stl/_sstream.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+// no wint_t is supported for this mode
+# define __BSB_int_type__ int
+# define __BSB_pos_type__ streampos
+# else
+# define __BSB_int_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_stringbuf<_CharT, _Traits, _Alloc>::int_type
+# define __BSB_pos_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_stringbuf<_CharT, _Traits, _Alloc>::pos_type
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Non-inline stringbuf member functions.
+
+// Constructors.  Note that the base class constructor sets all of the
+// get and area pointers to null.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringbuf<_CharT, _Traits, _Alloc>
+  ::basic_stringbuf(ios_base::openmode __mode)
+    : basic_streambuf<_CharT, _Traits>(), _M_mode(__mode), _M_str()
+{}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringbuf<_CharT, _Traits, _Alloc>
+  ::basic_stringbuf(const basic_string<_CharT, _Traits, _Alloc>& __s, ios_base::openmode __mode)
+    : basic_streambuf<_CharT, _Traits>(), _M_mode(__mode), _M_str(__s)
+{
+  _M_set_ptrs();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringbuf<_CharT, _Traits, _Alloc>::~basic_stringbuf()
+{}
+
+// Set the underlying string to a new value.
+template <class _CharT, class _Traits, class _Alloc>
+void 
+basic_stringbuf<_CharT, _Traits, _Alloc>::str(const basic_string<_CharT, _Traits, _Alloc>& __s)
+{
+  _M_str = __s;
+  _M_set_ptrs();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+void 
+basic_stringbuf<_CharT, _Traits, _Alloc>::_M_set_ptrs() {
+  _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+  _CharT* __data_end = __data_ptr + _M_str.size();
+  // The initial read position is the beginning of the string.
+  if (_M_mode & ios_base::in)
+    this->setg(__data_ptr, __data_ptr, __data_end);
+  
+  // The initial write position is the beginning of the string.
+  if (_M_mode & ios_base::out) {
+    if (_M_mode & ios_base::app)
+      this->setp(__data_end, __data_end);
+    else
+      this->setp(__data_ptr, __data_end);
+  }
+}
+
+// Precondition: gptr() >= egptr().  Returns a character, if one is available.
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::underflow()
+{
+  return this->gptr() != this->egptr()
+    ? _Traits::to_int_type(*this->gptr())
+    : _Traits::eof();
+}
+
+// Precondition: gptr() >= egptr().
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::uflow()
+{
+  if (this->gptr() != this->egptr()) {
+    int_type __c = _Traits::to_int_type(*this->gptr());
+    this->gbump(1);
+    return __c;
+  }
+  else
+    return _Traits::eof();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::pbackfail(int_type __c)
+{
+  if (this->gptr() != this->eback()) {
+    if (!_Traits::eq_int_type(__c, _Traits::eof())) {
+      if (_Traits::eq(_Traits::to_char_type(__c), this->gptr()[-1])) {
+        this->gbump(-1);
+        return __c;
+      }
+      else if (_M_mode & ios_base::out) {
+        this->gbump(-1);
+        *this->gptr() = __c;
+        return __c;
+      }
+      else
+        return _Traits::eof();
+    }
+    else {
+      this->gbump(-1);
+      return _Traits::not_eof(__c);
+    }
+  }
+  else
+    return _Traits::eof();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_int_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::overflow(int_type __c)
+{
+  // fbp : reverse order of "ifs" to pass Dietmar's test.
+  // Apparently, standard allows overflow with eof even for read-only streams.
+  if (!_Traits::eq_int_type(__c, _Traits::eof())) {
+    if (_M_mode & ios_base::out) {
+      if (!(_M_mode & ios_base::in)) {
+        // It's a write-only streambuf, so we can use special append buffer.
+        if (this->pptr() == this->epptr())
+          this->_M_append_buffer();
+      
+        if (this->pptr() != this->epptr()) {
+          *this->pptr() = _Traits::to_char_type(__c);
+          this->pbump(1);
+          return __c;
+        }
+        else
+          return _Traits::eof();
+      }
+
+      else {
+        // We're not using a special append buffer, just the string itself.
+        if (this->pptr() == this->epptr()) {
+          ptrdiff_t __offset = this->gptr() - this->eback();
+          _M_str.push_back(_Traits::to_char_type(__c));
+
+	  _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+	  size_t __data_size = _M_str.size();
+
+          this->setg(__data_ptr, __data_ptr + __offset, __data_ptr+__data_size);
+          this->setp(__data_ptr, __data_ptr + __data_size);
+          this->pbump((int)__data_size);
+          return __c;
+        }
+        else {
+          *this->pptr() = _Traits::to_char_type(__c);
+          this->pbump(1);
+          return __c;
+        }
+      }
+    }
+    else                          // Overflow always fails if it's read-only 
+      return _Traits::eof();
+  }
+  else                        // __c is EOF, so we don't have to do anything
+    return _Traits::not_eof(__c);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+streamsize 
+basic_stringbuf<_CharT, _Traits, _Alloc>::xsputn(const char_type* __s,
+                                                 streamsize __n)
+{
+  streamsize __nwritten = 0;
+
+  if ((_M_mode & ios_base::out) && __n > 0) {
+    // If the put pointer is somewhere in the middle of the string,
+    // then overwrite instead of append.
+    if (this->pbase() == _M_str.data() ) {
+      ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr();
+      if (__avail > __n) {
+        _Traits::copy(this->pptr(), __s, __n);
+        this->pbump((int)__n);
+        return __n;
+      }
+      else {
+        _Traits::copy(this->pptr(), __s, __avail);
+        __nwritten += __avail;
+        __n -= __avail;
+        __s += __avail;
+        this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz));
+      }
+    }
+
+    // At this point we know we're appending.
+    if (_M_mode & ios_base::in) {
+      ptrdiff_t __get_offset = this->gptr() - this->eback();
+      _M_str.append(__s, __s + __n);
+      
+      _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+      size_t __data_size = _M_str.size();
+
+      this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr+__data_size);
+      this->setp(__data_ptr, __data_ptr + __data_size);
+      this->pbump((int)__data_size);
+    }
+    else {
+      _M_append_buffer();
+      _M_str.append(__s, __s + __n);
+    }
+
+    __nwritten += __n;
+  }
+
+  return __nwritten;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+streamsize 
+basic_stringbuf<_CharT, _Traits, _Alloc>::_M_xsputnc(char_type __c,
+                                                     streamsize __n)
+{
+  streamsize __nwritten = 0;
+
+  if ((_M_mode & ios_base::out) && __n > 0) {
+    // If the put pointer is somewhere in the middle of the string,
+    // then overwrite instead of append.
+    if (this->pbase() == _M_str.data()) {
+      ptrdiff_t __avail = _M_str.data() + _M_str.size() - this->pptr();
+      if (__avail > __n) {
+        _Traits::assign(this->pptr(), __n, __c);
+        this->pbump((int)__n);
+        return __n;
+      }
+      else {
+        _Traits::assign(this->pptr(), __avail, __c);
+        __nwritten += __avail;
+        __n -= __avail;
+        this->setp(_M_Buf, _M_Buf + __STATIC_CAST(int,_S_BufSiz));
+      }
+    }
+
+    // At this point we know we're appending.
+    if (this->_M_mode & ios_base::in) {
+      ptrdiff_t __get_offset = this->gptr() - this->eback();
+      _M_str.append(__n, __c);
+
+      _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+      size_t __data_size = _M_str.size();
+
+      this->setg(__data_ptr, __data_ptr + __get_offset, __data_ptr+__data_size);
+      this->setp(__data_ptr, __data_ptr + __data_size);
+      this->pbump((int)__data_size);
+
+    }
+    else {
+      _M_append_buffer();
+      _M_str.append(__n, __c);      
+    }
+
+    __nwritten += __n;
+  }
+
+  return __nwritten;
+}
+
+// According to the C++ standard the effects of setbuf are implementation
+// defined, except that setbuf(0, 0) has no effect.  In this implementation,
+// setbuf(<anything>, n), for n > 0, calls reserve(n) on the underlying
+// string.
+template <class _CharT, class _Traits, class _Alloc>
+basic_streambuf<_CharT, _Traits>*
+basic_stringbuf<_CharT, _Traits, _Alloc>::setbuf(_CharT*, streamsize __n)
+{
+  if (__n > 0) {
+    bool __do_get_area = false;
+    bool __do_put_area = false;
+    ptrdiff_t __offg = 0;
+    ptrdiff_t __offp = 0;
+
+    if (this->pbase() == _M_str.data()) {
+      __do_put_area = true;
+      __offp = this->pptr() - this->pbase();
+    }
+
+    if (this->eback() == _M_str.data()) {
+      __do_get_area = true;
+      __offg = this->gptr() - this->eback();
+    }
+
+    if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
+      _M_append_buffer();
+
+    _M_str.reserve(__n);
+
+    _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+    size_t __data_size = _M_str.size();
+
+    if (__do_get_area) {
+      this->setg(__data_ptr, __data_ptr + __offg, __data_ptr+__data_size);
+    }
+
+    if (__do_put_area) {
+      this->setp(__data_ptr, __data_ptr+__data_size);
+      this->pbump((int)__offp);
+    }
+  }
+
+  return this;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_pos_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>::seekoff(off_type __off, 
+            ios_base::seekdir __dir,
+            ios_base::openmode __mode)
+{
+  bool __in  = false;
+  bool __out = false;
+  
+  if ((__mode & (ios_base::in | ios_base::out)) == (ios_base::in | ios_base::out) ) {
+    if (__dir == ios_base::beg || __dir == ios_base::end)
+      __in = __out = true;
+  }
+  else if (__mode & ios_base::in)
+    __in = true;
+  else if (__mode & ios_base::out)
+    __out = true;
+
+  if (!__in && !__out)
+    return pos_type(off_type(-1));
+  else if ((__in  && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
+           (__out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
+    return pos_type(off_type(-1));
+
+  if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
+    _M_append_buffer();
+
+  streamoff __newoff;
+  switch(__dir) {
+  case ios_base::beg:
+    __newoff = 0;
+    break;
+  case ios_base::end:
+    __newoff = _M_str.size();
+    break;
+  case ios_base::cur:
+    __newoff = __in ? this->gptr() - this->eback() 
+                    : this->pptr() - this->pbase();
+    break;
+  default:
+    return pos_type(off_type(-1));
+  }
+
+  __off += __newoff;
+
+  if (__in) {
+    ptrdiff_t __n = this->egptr() - this->eback();
+
+    if (__off < 0 || __off > __n)
+      return pos_type(off_type(-1));
+    else
+      this->setg(this->eback(), this->eback() + __off, this->eback() + __n);
+  }
+
+  if (__out) {
+    ptrdiff_t __n = this->epptr() - this->pbase();
+
+    if (__off < 0 || __off > __n)
+      return pos_type(off_type(-1));
+    else {
+      this->setp(this->pbase(), this->pbase() + __n);
+      this->pbump((int)__off);
+    }
+  }
+
+  return pos_type(__off);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+__BSB_pos_type__
+basic_stringbuf<_CharT, _Traits, _Alloc>
+  ::seekpos(pos_type __pos, ios_base::openmode __mode)
+{
+  bool __in  = (__mode & ios_base::in) != 0;
+  bool __out = (__mode & ios_base::out) != 0;
+
+  if ((__in  && (!(_M_mode & ios_base::in) || this->gptr() == 0)) ||
+      (__out && (!(_M_mode & ios_base::out) || this->pptr() == 0)))
+    return pos_type(off_type(-1));
+
+  const off_type __n = __pos - pos_type(off_type(0));
+  if ((_M_mode & ios_base::out) && !(_M_mode & ios_base::in))
+    _M_append_buffer();
+
+  if (__in) {
+    if (__n < 0 || __n > this->egptr() - this->eback())
+      return pos_type(off_type(-1));
+    this->setg(this->eback(), this->eback() + __n, this->egptr());
+  }
+
+  if (__out) {
+    if (__n < 0 || size_t(__n) > _M_str.size())
+      return pos_type(off_type(-1));
+
+    _CharT* __data_ptr = __CONST_CAST(_CharT*,_M_str.data());
+    size_t __data_size = _M_str.size();
+    
+    this->setp(__data_ptr, __data_ptr+__data_size);
+    this->pbump((int)__n);
+  }
+
+  return __pos;
+}
+
+// This is declared as a const member function because it is 
+// called by basic_stringbuf<>::str().  Precondition: this is a
+// write-only stringbuf.  We can't use an output buffer for read-
+// write stringbufs.  Postcondition: pptr is reset to the beginning
+// of the buffer.
+template <class _CharT, class _Traits, class _Alloc>
+void basic_stringbuf<_CharT, _Traits, _Alloc>::_M_append_buffer() const
+
+{
+  // Do we have a buffer to append?
+  if (this->pbase() == this->_M_Buf && this->pptr() != this->_M_Buf) {
+    basic_stringbuf<_CharT, _Traits, _Alloc>* __this = __CONST_CAST(_Self*,this);
+    __this->_M_str.append((const _CharT*)this->pbase(), (const _CharT*)this->pptr());
+    __this->setp(__CONST_CAST(_CharT*,_M_Buf),
+                 __CONST_CAST(_CharT*,_M_Buf + __STATIC_CAST(int,_S_BufSiz)));
+  }
+
+  // Have we run off the end of the string?
+  else if (this->pptr() == this->epptr()) {
+    basic_stringbuf<_CharT, _Traits, _Alloc>* __this = __CONST_CAST(_Self*,this);
+    __this->setp(__CONST_CAST(_CharT*,_M_Buf),
+                 __CONST_CAST(_CharT*,_M_Buf + __STATIC_CAST(int,_S_BufSiz)));
+  }
+}
+
+//----------------------------------------------------------------------
+// Non-inline istringstream member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istringstream<_CharT, _Traits, _Alloc>
+  ::basic_istringstream(ios_base::openmode __mode)
+    : basic_istream<_CharT, _Traits>(0),
+      _M_buf(__mode | ios_base::in)
+{
+  this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istringstream<_CharT, _Traits, _Alloc>
+  ::basic_istringstream(const _String& __str,ios_base::openmode __mode)
+    : basic_istream<_CharT, _Traits>(0),
+      _M_buf(__str, __mode | ios_base::in)
+{
+  this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istringstream<_CharT, _Traits, _Alloc>::~basic_istringstream()
+{}
+
+//----------------------------------------------------------------------
+// Non-inline ostringstream member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostringstream<_CharT, _Traits, _Alloc>
+  ::basic_ostringstream(ios_base::openmode __mode)
+    : basic_ostream<_CharT, _Traits>(0),
+      _M_buf(__mode | ios_base::out)
+{
+  this->init(&_M_buf);
+}
+  
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostringstream<_CharT, _Traits, _Alloc>
+  ::basic_ostringstream(const _String& __str, ios_base::openmode __mode)
+    : basic_ostream<_CharT, _Traits>(0),
+      _M_buf(__str, __mode | ios_base::out)
+{
+  this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostringstream<_CharT, _Traits, _Alloc>::~basic_ostringstream()
+{}
+
+//----------------------------------------------------------------------
+// Non-inline stringstream member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringstream<_CharT, _Traits, _Alloc>
+  ::basic_stringstream(ios_base::openmode __mode)
+    : basic_iostream<_CharT, _Traits>(0), _M_buf(__mode)
+{
+   this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringstream<_CharT, _Traits, _Alloc>
+  ::basic_stringstream(const _String& __str, ios_base::openmode __mode)
+    : basic_iostream<_CharT, _Traits>(0), _M_buf(__str, __mode)
+{
+  this->init(&_M_buf);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_stringstream<_CharT, _Traits, _Alloc>::~basic_stringstream()
+{}
+
+_STLP_END_NAMESPACE
+
+# undef __BSB_int_type__
+# undef __BSB_pos_type__
+
+# endif /* EXPOSE */
+
+#endif /* _STLP_SSTREAM_C */
diff --git a/src/STLport/stl/_sstream.h b/src/STLport/stl/_sstream.h
new file mode 100644
index 0000000..985f929
--- /dev/null
+++ b/src/STLport/stl/_sstream.h
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+
+// This header defines classes basic_stringbuf, basic_istringstream,
+// basic_ostringstream, and basic_stringstream.  These classes 
+// represent streamsbufs and streams whose sources or destinations are
+// C++ strings.
+
+#ifndef _STLP_SSTREAM_H
+#define _STLP_SSTREAM_H
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+# include <stl/_istream.h> // Includes <ostream>, <ios>, <iosfwd>
+#endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// This version of basic_stringbuf relies on the internal details of
+// basic_string.  It relies on the fact that, in this implementation,
+// basic_string's iterators are pointers.  It also assumes (as allowed
+// by the standard) that _CharT is a POD type.
+
+// We have a very small buffer for the put area, just so that we don't
+// have to use append() for every sputc.  Conceptually, the buffer
+// immediately follows the end of the underlying string.  We use this
+// buffer when appending to write-only streambufs, but we don't use it
+// for read-write streambufs.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_stringbuf : public basic_streambuf<_CharT, _Traits>
+{
+public:                         // Typedefs.
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+  typedef basic_streambuf<_CharT, _Traits>          _Base;
+  typedef basic_stringbuf<_CharT, _Traits, _Alloc>  _Self;
+  typedef basic_string<_CharT, _Traits, _Alloc>     _String;
+
+public:                         // Constructors, destructor.
+  explicit basic_stringbuf(ios_base::openmode __mode
+                                      = ios_base::in | ios_base::out);
+  explicit basic_stringbuf(const _String& __s, ios_base::openmode __mode
+                                      = ios_base::in | ios_base::out);
+  virtual ~basic_stringbuf();
+
+public:                         // Get or set the string.
+  _String str() const { _M_append_buffer(); return _M_str; }
+  void str(const _String& __s);
+
+protected:                      // Overridden virtual member functions.
+  virtual int_type underflow();
+  virtual int_type uflow();
+  virtual int_type pbackfail(int_type __c);
+  virtual int_type overflow(int_type __c);
+  int_type pbackfail() {return pbackfail(_Traits::eof());}
+  int_type overflow() {return overflow(_Traits::eof());}
+
+  virtual streamsize xsputn(const char_type* __s, streamsize __n);
+  virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+
+  virtual _Base* setbuf(_CharT* __buf, streamsize __n);
+  virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
+                           ios_base::openmode __mode 
+                                      = ios_base::in | ios_base::out);
+  virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode 
+                                      = ios_base::in | ios_base::out);
+
+private:                        // Helper functions.
+  // Append the internal buffer to the string if necessary.
+  void _M_append_buffer() const;
+  void _M_set_ptrs();
+
+private:
+  ios_base::openmode _M_mode;
+  mutable basic_string<_CharT, _Traits, _Alloc> _M_str;
+
+  enum _JustName { _S_BufSiz = 8 };
+  _CharT _M_Buf[ 8 /* _S_BufSiz */];
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf<char, char_traits<char>, allocator<char> >;
+#  if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringbuf<wchar_t, char_traits<wchar_t>, allocator<wchar_t>  >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+//----------------------------------------------------------------------
+// Class basic_istringstream, an input stream that uses a stringbuf.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_istringstream : public basic_istream<_CharT, _Traits>
+{
+public:                         // Typedefs
+  typedef typename _Traits::char_type   char_type;
+  typedef typename _Traits::int_type    int_type;
+  typedef typename _Traits::pos_type    pos_type;
+  typedef typename _Traits::off_type    off_type;
+  typedef _Traits traits_type;
+
+  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
+  typedef basic_istream<_CharT, _Traits>            _Base;
+  typedef basic_string<_CharT, _Traits, _Alloc>     _String;
+  typedef basic_stringbuf<_CharT, _Traits, _Alloc>  _Buf;
+
+public:                         // Constructors, destructor.
+  basic_istringstream(ios_base::openmode __mode = ios_base::in);
+  basic_istringstream(const _String& __str,
+                      ios_base::openmode __mode = ios_base::in);
+  ~basic_istringstream();
+
+public:                         // Member functions
+
+  basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
+    { return __CONST_CAST(_Buf*,&_M_buf); }
+
+  _String str() const { return _M_buf.str(); }
+  void str(const _String& __s) { _M_buf.str(__s); }
+  
+private:
+  basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_ostringstream, an output stream that uses a stringbuf.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_ostringstream : public basic_ostream<_CharT, _Traits>
+{
+public:                         // Typedefs
+  typedef typename _Traits::char_type   char_type;
+  typedef typename _Traits::int_type    int_type;
+  typedef typename _Traits::pos_type    pos_type;
+  typedef typename _Traits::off_type    off_type;
+  typedef _Traits traits_type;
+
+  typedef basic_ios<_CharT, _Traits>                _Basic_ios;
+  typedef basic_ostream<_CharT, _Traits>            _Base;
+  typedef basic_string<_CharT, _Traits, _Alloc>     _String;
+  typedef basic_stringbuf<_CharT, _Traits, _Alloc>  _Buf;
+
+public:                         // Constructors, destructor.
+  basic_ostringstream(ios_base::openmode __mode = ios_base::out);
+  basic_ostringstream(const _String& __str,
+                      ios_base::openmode __mode = ios_base::out);
+  ~basic_ostringstream();
+
+public:                         // Member functions.
+
+  basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
+    { return __CONST_CAST(_Buf*,&_M_buf); }
+
+  _String str() const { return _M_buf.str(); }
+    void str(const _String& __s) { _M_buf.str(__s); } // dwa 02/07/00 - BUG STOMPER DAVE
+
+
+private:
+  basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
+};
+
+
+//----------------------------------------------------------------------
+// Class basic_stringstream, a bidirectional stream that uses a stringbuf.
+
+template <class _CharT, class _Traits, class _Alloc>
+class basic_stringstream : public basic_iostream<_CharT, _Traits>
+{
+public:                         // Typedefs
+  typedef typename _Traits::char_type char_type;
+  typedef typename _Traits::int_type  int_type;
+  typedef typename _Traits::pos_type  pos_type;
+  typedef typename _Traits::off_type  off_type;
+  typedef _Traits  traits_type;
+
+  typedef basic_ios<_CharT, _Traits>                 _Basic_ios;
+  typedef basic_iostream<_CharT, _Traits>            _Base;
+  typedef basic_string<_CharT, _Traits, _Alloc>      _String;
+  typedef basic_stringbuf<_CharT, _Traits, _Alloc>  _Buf;
+  
+  typedef ios_base::openmode openmode;
+
+public:                         // Constructors, destructor.
+  basic_stringstream(openmode __mod = ios_base::in | ios_base::out);
+  basic_stringstream(const _String& __str,
+                     openmode __mod = ios_base::in | ios_base::out);
+  ~basic_stringstream();
+
+public:                         // Member functions.
+
+  basic_stringbuf<_CharT, _Traits, _Alloc>* rdbuf() const
+    { return __CONST_CAST(_Buf*,&_M_buf); }
+
+  _String str() const { return _M_buf.str(); }
+    void str(const _String& __s) { _M_buf.str(__s); }
+
+private:
+  basic_stringbuf<_CharT, _Traits, _Alloc> _M_buf;
+};
+
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_istringstream<char, char_traits<char>, allocator<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream<char, char_traits<char>, allocator<char> >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringstream<char, char_traits<char>, allocator<char> >;
+#  if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_istringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t>  >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_ostringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t>  >;
+_STLP_EXPORT_TEMPLATE_CLASS basic_stringstream<wchar_t, char_traits<wchar_t>, allocator<wchar_t>  >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+# if  defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_sstream.c>
+# endif
+
+#endif /* _STLP_SSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_stack.h b/src/STLport/stl/_stack.h
new file mode 100644
index 0000000..8bfca5b
--- /dev/null
+++ b/src/STLport/stl/_stack.h
@@ -0,0 +1,105 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_STACK_H
+#define _STLP_INTERNAL_STACK_H
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if !defined ( _STLP_LIMITED_DEFAULT_TEMPLATES )
+template <class _Tp, class _Sequence = deque<_Tp> >
+# elif defined ( _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS )
+# define _STLP_STACK_ARGS _Tp
+template <class _Tp>
+# else
+template <class _Tp, class _Sequence>
+# endif
+class stack {
+
+# ifdef _STLP_STACK_ARGS 
+  typedef deque<_Tp> _Sequence;
+# endif
+
+public:
+  typedef typename _Sequence::value_type      value_type;
+  typedef typename _Sequence::size_type       size_type;
+  typedef          _Sequence                  container_type;
+
+  typedef typename _Sequence::reference       reference;
+  typedef typename _Sequence::const_reference const_reference;
+protected:
+  _Sequence c;
+public:
+  stack() : c() {}
+  explicit stack(const _Sequence& __s) : c(__s) {}
+
+  bool empty() const { return c.empty(); }
+  size_type size() const { return c.size(); }
+  reference top() { return c.back(); }
+  const_reference top() const { return c.back(); }
+  void push(const value_type& __x) { c.push_back(__x); }
+  void pop() { c.pop_back(); }
+  const _Sequence& _Get_c() const { return c; }
+};
+
+# ifndef _STLP_STACK_ARGS
+#  define _STLP_STACK_ARGS _Tp, _Sequence
+#  define _STLP_STACK_HEADER_ARGS class _Tp, class _Sequence
+# else
+#  define _STLP_STACK_HEADER_ARGS class _Tp
+# endif
+
+template < _STLP_STACK_HEADER_ARGS >
+inline bool _STLP_CALL  operator==(const stack< _STLP_STACK_ARGS >& __x, const stack< _STLP_STACK_ARGS >& __y)
+{
+  return __x._Get_c() == __y._Get_c();
+}
+
+template < _STLP_STACK_HEADER_ARGS >
+inline bool _STLP_CALL  operator<(const stack< _STLP_STACK_ARGS >& __x, const stack< _STLP_STACK_ARGS >& __y)
+{
+  return __x._Get_c() < __y._Get_c();
+}
+
+_STLP_RELOPS_OPERATORS(template < _STLP_STACK_HEADER_ARGS >, stack< _STLP_STACK_ARGS >)
+    
+_STLP_END_NAMESPACE
+
+#  undef _STLP_STACK_ARGS
+#  undef _STLP_STACK_HEADER_ARGS
+
+#endif /* _STLP_INTERNAL_STACK_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_stdio_file.h b/src/STLport/stl/_stdio_file.h
new file mode 100644
index 0000000..1bd2e72
--- /dev/null
+++ b/src/STLport/stl/_stdio_file.h
@@ -0,0 +1,758 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_STDIO_FILE_H
+#define _STLP_STDIO_FILE_H
+
+// This file provides a low-level interface between the internal 
+// representation of struct FILE, from the C stdio library, and 
+// the C++ I/O library.  The C++ I/O library views a FILE object as
+// a collection of three pointers: the beginning of the buffer, the
+// current read/write position, and the end of the buffer.
+
+// The interface:
+// - char* _FILE_[IO]_begin(const FILE *__f);
+//       Returns a pointer to the beginning of the buffer.
+// - char* _FILE_[IO]_next(const FILE *__f);
+//       Returns the current read/write position within the buffer.
+// - char* _FILE_[IO]_end(const FILE *__f);
+//       Returns a pointer immediately past the end of the buffer.
+// - char* _FILE_[IO]_avail(const FILE *__f);
+//       Returns the number of characters remaining in the buffer, i.e.
+//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+// - char& _FILE_[IO]_preincr(FILE *__f)
+//       Increments the current read/write position by 1, returning the 
+//       character at the old position.
+// - char& _FILE_[IO]_postincr(FILE *__f)
+//       Increments the current read/write position by 1, returning the 
+//       character at the old position.
+// - char& _FILE_[IO]_predecr(FILE *__f)
+//       Decrements the current read/write position by 1, returning the 
+//       character at the old position.
+// - char& _FILE_[IO]_postdecr(FILE *__f)
+//       Decrements the current read/write position by 1, returning the 
+//       character at the old position.
+// - void _FILE_[IO]_bump(FILE *__f, int __n)
+//       Increments the current read/write position by __n.
+// - void _FILE_[IO]_set(FILE *__f, char* __begin, char* __next, char* __end);
+//       Sets the beginning of the bufer to __begin, the current read/write
+//       position to __next, and the buffer's past-the-end pointer to __end.
+//       If any of those pointers is null, then all of them must be null.
+
+// Each function comes in two versions, one for a FILE used as an input
+// buffer and one for a FILE used as an output buffer.  In some stdio
+// implementations the two functions are identical, but in others they are
+// not.
+
+#ifndef _STLP_CSTDIO
+# include <cstdio>
+#endif
+#ifndef _STLP_CSTDDEF
+# include <cstddef>
+#endif
+
+#if defined(__MSL__)
+# include <unix.h>	// get the definition of fileno
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#if !defined(_STLP_WINCE)
+//----------------------------------------------------------------------
+// Implementation for the IRIX C library.
+// Solaris interface looks to be identical.
+#if !defined(_STLP_USE_GLIBC) && \
+    ( defined(__sgi) || \
+      ( defined(__sun) && ! defined (_LP64) )  || \
+      defined (__osf__) || defined(__DECCXX) || \
+      defined (_STLP_MSVC) || defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP) || defined (_AIX) || defined (_CRAY))
+
+#if defined ( _MSC_VER ) || defined (__ICL) || defined (__MINGW32__) || defined(__DJGPP)
+typedef  char* _File_ptr_type;
+#else
+typedef  unsigned char* _File_ptr_type;
+#endif
+
+inline int   _FILE_fd(const FILE *__f) { return __f->_file; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }  
+inline char* _FILE_I_end(const FILE *__f)
+  { return (char*) __f->_ptr + __f->_cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+  { --__f->_cnt; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+  { --__f->_cnt; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+  { ++__f->_cnt; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+  { ++__f->_cnt; return *(char*) (__f->_ptr--); }
+inline void  _FILE_I_bump(FILE *__f, int __n)
+  { __f->_ptr += __n; __f->_cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+  __f->_base = (_File_ptr_type) __begin;
+  __f->_ptr  = (_File_ptr_type) __next;
+  __f->_cnt  = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL 1
+
+#elif defined(__EMX__)
+
+inline int   _FILE_fd(const FILE* __f) { return __f->_handle; }
+inline char* _FILE_I_begin(const FILE* __f) { return (char*) __f->_buffer; }
+inline char* _FILE_I_next(const FILE* __f) { return (char*) __f->_ptr; }
+inline char* _FILE_I_end(const FILE* __f) { return (char *) __f->_ptr + __f->_rcount; }
+inline ptrdiff_t _FILE_I_avail(const FILE* __f) { return __f->_rcount; }
+inline char& _FILE_I_preincr(FILE* __f) { --__f->_rcount; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE* __f) { --__f->_rcount; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE* __f) { ++__f->_rcount; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE* __f) { ++__f->_rcount; return *(char*) (__f->_ptr--); }
+inline void  _FILE_I_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_rcount -= __n; }
+inline void _FILE_I_set(FILE* __f, char* __begin, char* __next, char* __end) {
+  __f->_buffer = __begin;
+  __f->_ptr  = __next;
+  __f->_rcount  = __end - __next;
+}
+
+inline char* _FILE_O_begin(const FILE* __f) { return (char*) __f->_buffer; }
+inline char* _FILE_O_next(const FILE* __f) { return (char*) __f->_ptr; }
+inline char* _FILE_O_end(const FILE* __f) { return (char*) __f->_ptr + __f->_wcount; }
+inline ptrdiff_t _FILE_O_avail(const FILE* __f) { return __f->_wcount; }
+inline char& _FILE_O_preincr(FILE* __f) { --__f->_wcount; return *(char*) (++__f->_ptr); }
+inline char& _FILE_O_postincr(FILE* __f) { --__f->_wcount; return *(char*) (__f->_ptr++); }
+inline char& _FILE_O_predecr(FILE* __f) { ++__f->_wcount; return *(char*) (--__f->_ptr); }
+inline char& _FILE_O_postdecr(FILE* __f) { ++__f->_wcount; return *(char*) (__f->_ptr--); }
+inline void _FILE_O_bump(FILE* __f, int __n) { __f->_ptr += __n; __f->_wcount -= __n; }
+inline void _FILE_O_set(FILE* __f, char* __begin, char* __next, char* __end) {
+  __f->_buffer = __begin;
+  __f->_ptr  = __next;
+  __f->_wcount  = __end - __next;
+}
+
+
+# undef _STLP_FILE_I_O_IDENTICAL
+
+# elif defined(_STLP_SCO_OPENSERVER) || defined(__NCR_SVR)
+
+typedef  unsigned char* _File_ptr_type;
+
+inline int   _FILE_fd(const FILE *__f) { return __f->__file; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->__base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->__ptr; }
+inline char* _FILE_I_end(const FILE *__f)
+  { return (char*) __f->__ptr + __f->__cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+  { --__f->__cnt; return *(char*) (++__f->__ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+  { --__f->__cnt; return *(char*) (__f->__ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+  { ++__f->__cnt; return *(char*) (--__f->__ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+  { ++__f->__cnt; return *(char*) (__f->__ptr--); }
+inline void  _FILE_I_bump(FILE *__f, int __n)
+  { __f->__ptr += __n; __f->__cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+  __f->__base = (_File_ptr_type) __begin;
+  __f->__ptr  = (_File_ptr_type) __next;
+  __f->__cnt  = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL 1
+
+# elif defined(__sun) && defined( _LP64)
+
+typedef long _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return (int) __f->__pad[2]; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*)
+__f->__pad[1]; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*)
+__f->__pad[0]; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->__pad[0] + __f->__pad[3]; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->__pad[3]; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->__pad[3]; return *(char*) (++__f->__pad[0]); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->__pad[3]; return *(char*) (__f->__pad[0]++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->__pad[3]; return *(char*) (--__f->__pad[0]); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->__pad[3]; return *(char*) (__f->__pad[0]--); }
+inline void _FILE_I_bump(FILE *__f, long __n)
+{ __f->__pad[0] += __n; __f->__pad[3] -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+__end) {
+__f->__pad[1] = (_File_ptr_type) __begin;
+__f->__pad[0] = (_File_ptr_type) __next;
+__f->__pad[3] = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__CYGWIN__) || defined(__FreeBSD__)  || defined(__NetBSD__) \
+  || defined(__amigaos__) || ( defined(__GNUC__) && defined(__APPLE__) )
+
+inline int _FILE_fd(const FILE *__f) { return __f->_file; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*)
+						__f->_bf._base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_p; } 
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->_p + __f->_r; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_r; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->_r; --__f->_bf._size; return *(char*) (++__f->_p); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->_r; --__f->_bf._size; return *(char*) (__f->_p++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->_r; ++ __f->_bf._size; return *(char*) (--__f->_p); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->_r; ++__f->_bf._size; return *(char*) (__f->_p--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->_p += __n; __f->_bf._size+=__n; __f->_r -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+			__end) {
+  __f->_bf._base = (unsigned char*) __begin;
+  __f->_p = (unsigned char*) __next;
+  __f->_r = __f->_bf._size = __end - __next;
+}
+inline char* _FILE_O_begin(const FILE *__f) { return (char*)
+						__f->_bf._base; }
+inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->_p; } 
+inline char* _FILE_O_end(const FILE *__f)
+{ return (char*) __f->_p + __f->_w; }
+
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->_w; }
+
+inline char& _FILE_O_preincr(FILE *__f)
+{ --__f->_w; --__f->_bf._size; return *(char*) (++__f->_p); }
+inline char& _FILE_O_postincr(FILE *__f)
+{ --__f->_w; --__f->_bf._size; return *(char*) (__f->_p++); }
+inline char& _FILE_O_predecr(FILE *__f)
+{ ++__f->_w; ++__f->_bf._size; return *(char*) (--__f->_p); }
+inline char& _FILE_O_postdecr(FILE *__f)
+{ ++__f->_w; ++__f->_bf._size; return *(char*) (__f->_p--); }
+inline void _FILE_O_bump(FILE *__f, int __n)
+{ __f->_p += __n; __f->_bf._size+=__n; __f->_w -= __n; }
+
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char*
+			__end) {
+  __f->_bf._base = (unsigned char*) __begin;
+  __f->_p = (unsigned char*) __next;
+  __f->_w = __f->_bf._size = __end - __next;
+}
+
+# undef _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(_STLP_USE_GLIBC)
+
+inline int   _FILE_fd(const FILE *__f) { return __f->_fileno; }
+inline char* _FILE_I_begin(const FILE *__f) { return __f->_IO_read_base; }
+inline char* _FILE_I_next(const FILE *__f)  { return __f->_IO_read_ptr; }
+inline char* _FILE_I_end(const FILE *__f)   { return __f->_IO_read_end; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) 
+  { return __f->_IO_read_end - __f->_IO_read_ptr; }
+
+inline char& _FILE_I_preincr(FILE *__f)  { return *++__f->_IO_read_ptr; }
+inline char& _FILE_I_postincr(FILE *__f) { return *__f->_IO_read_ptr++; }
+inline char& _FILE_I_predecr(FILE *__f)  { return *--__f->_IO_read_ptr; }
+inline char& _FILE_I_postdecr(FILE *__f) { return *__f->_IO_read_ptr--; }
+inline void  _FILE_I_bump(FILE *__f, int __n) { __f->_IO_read_ptr += __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+  __f->_IO_read_base = __begin; 
+  __f->_IO_read_ptr  = __next; 
+  __f->_IO_read_end  = __end; 
+}
+
+inline char* _FILE_O_begin(const FILE *__f) { return __f->_IO_write_base; }
+inline char* _FILE_O_next(const FILE *__f)  { return __f->_IO_write_ptr; }
+inline char* _FILE_O_end(const FILE *__f)   { return __f->_IO_write_end; }
+
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) 
+  { return __f->_IO_write_end - __f->_IO_write_ptr; }
+
+inline char& _FILE_O_preincr(FILE *__f)  { return *++__f->_IO_write_ptr; }
+inline char& _FILE_O_postincr(FILE *__f) { return *__f->_IO_write_ptr++; }
+inline char& _FILE_O_predecr(FILE *__f)  { return *--__f->_IO_write_ptr; }
+inline char& _FILE_O_postdecr(FILE *__f) { return *__f->_IO_write_ptr--; }
+inline void  _FILE_O_bump(FILE *__f, int __n) { __f->_IO_write_ptr += __n; }
+
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end) {
+  __f->_IO_write_base = __begin; 
+  __f->_IO_write_ptr  = __next; 
+  __f->_IO_write_end  = __end; 
+
+}
+
+#elif defined(__hpux) /* && defined(__hppa) && defined(__HP_aCC)) */
+
+#ifndef _INCLUDE_HPUX_SOURCE
+extern "C" unsigned char *__bufendtab[];
+#  undef  _bufend
+#  define _bufend(__p) \
+     (*(((__p)->__flag & _IOEXT)  ? &(((_FILEX *)(__p))->__bufendp)      \
+ 				    : &(__bufendtab[(__p) - __iob])))
+ 
+#  define _bufsiz(__p)  (_bufend(__p) - (__p)->__base)
+#endif /* _INCLUDE_HPUX_SOURCE */
+
+#if defined(_STLP_HPACC_BROKEN_BUFEND)
+#  undef  _bufend
+#  define _bufend(__p) \
+     (*(((__p)->__flag & _IOEXT)  ? &((__REINTERPRET_CAST(_FILEX*,(__p)))->__bufendp)  \
+                               : &(__bufendtab[__REINTERPRET_CAST(FILE*,(__p)) - __iob])))
+#endif
+
+inline int   _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE *,__f)); }
+inline char* _FILE_I_begin(const FILE *__f) { return (__REINTERPRET_CAST(char*, __f->__base)); }
+inline char* _FILE_I_next(const FILE *__f)  { return (__REINTERPRET_CAST(char*, __f->__ptr)); }
+inline char* _FILE_I_end(const FILE *__f)   { return (__REINTERPRET_CAST(char*, __f->__ptr +__f->__cnt)); }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f)  { return __f->__cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)  { --__f->__cnt; return *__REINTERPRET_CAST(char*, ++__f->__ptr); }
+inline char& _FILE_I_postincr(FILE *__f) { --__f->__cnt; return *__REINTERPRET_CAST(char*, __f->__ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)  { ++__f->__cnt; return *__REINTERPRET_CAST(char*,--__f->__ptr); }
+inline char& _FILE_I_postdecr(FILE *__f) { ++__f->__cnt; return *__REINTERPRET_CAST(char*,__f->__ptr--); }
+inline void  _FILE_I_bump(FILE *__f, int __n) { __f->__cnt -= __n; __f->__ptr += __n; }
+ 
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+# if defined(__hpux)
+   if( (unsigned long) (__f - &__iob[0]) > _NFILE)
+        __f->__flag |= _IOEXT;  // used by stdio's _bufend macro and goodness knows what else...
+# endif
+  __f->__cnt  = __end - __next; 
+  __f->__base = __REINTERPRET_CAST(unsigned char*, __begin); 
+  __f->__ptr  = __REINTERPRET_CAST(unsigned char*, __next);
+  _bufend(__f) = __REINTERPRET_CAST(unsigned char*, __end); 
+}
+
+// For HPUX stdio, input and output FILE manipulation is identical.
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__BORLANDC__)
+
+typedef unsigned char* _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return __f->fd; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->buffer;
+}
+inline char* _FILE_I_next(const FILE *__f) 
+{ return (char*)__f->curp; } 
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->curp + __f->level; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->level; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->level; return *(char*) (++__f->curp); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->level; return *(char*) (__f->curp++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->level; return *(char*) (--__f->curp); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->level; return *(char*) (__f->curp--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->curp += __n; __f->level -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+			__end) {
+  __f->buffer = (_File_ptr_type) __begin;
+  __f->curp = (_File_ptr_type) __next;
+  __f->level = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined( __MWERKS__ )
+
+// using MWERKS-specific defines here to detect other OS targets
+// dwa: I'm not sure they provide fileno for all OS's, but this should
+// work for Win32 and WinCE
+# if __dest_os == __mac_os
+inline int   _FILE_fd(const FILE *__f) { return ::fileno(__CONST_CAST(FILE*, __f)); }
+# else
+inline int   _FILE_fd(const FILE *__f) { return ::_fileno(__CONST_CAST(FILE*, __f)); }
+# endif
+
+//       Returns a pointer to the beginning of the buffer.
+inline char* _FILE_I_begin(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer); }
+//       Returns the current read/write position within the buffer.
+inline char* _FILE_I_next(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr); }
+
+//       Returns a pointer immediately past the end of the buffer.
+inline char* _FILE_I_end(const FILE *__f) { return __REINTERPRET_CAST(char*, __f->buffer_ptr + __f->buffer_len); }
+
+//       Returns the number of characters remaining in the buffer, i.e.
+//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->buffer_len; }
+
+//       Increments the current read/write position by 1, returning the 
+//       character at the old position.
+inline char& _FILE_I_preincr(FILE *__f)
+  { --__f->buffer_len; return *(char*) (++__f->buffer_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+  { --__f->buffer_len; return *(char*) (__f->buffer_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+  { ++__f->buffer_len; return *(char*) (--__f->buffer_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+  { ++__f->buffer_len; return *(char*) (__f->buffer_ptr--); }
+inline void  _FILE_I_bump(FILE *__f, int __n)
+  { __f->buffer_ptr += __n; __f->buffer_len -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+  __f->buffer = __REINTERPRET_CAST(unsigned char*, __begin);
+  __f->buffer_ptr   = __REINTERPRET_CAST(unsigned char*, __next);
+  __f->buffer_len  = __end - __next;
+  __f->buffer_size = __end - __begin;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(__DMC__)
+
+inline int   _FILE_fd(const FILE *__f) { return __f->_file; }
+
+//       Returns a pointer to the beginning of the buffer.
+inline char* _FILE_I_begin(const FILE *__f) { return __f->_base; }
+
+//       Returns the current read/write position within the buffer.
+inline char* _FILE_I_next(const FILE *__f) { return __f->_ptr; }
+
+//       Returns a pointer immediately past the end of the buffer.
+inline char* _FILE_I_end(const FILE *__f) { return __f->_ptr + __f->_cnt; }
+
+//       Returns the number of characters remaining in the buffer, i.e.
+//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+//       Increments the current read/write position by 1, returning the 
+//       character at the NEW position.
+inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return *(++__f->_ptr); }
+
+
+//       Increments the current read/write position by 1, returning the 
+//       character at the old position.
+inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return *(__f->_ptr++); }
+
+//       Decrements the current read/write position by 1, returning the 
+//       character at the NEW position.
+inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return *(--__f->_ptr); }
+
+//       Decrements the current read/write position by 1, returning the 
+//       character at the old position.
+inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return *(__f->_ptr--); }
+
+//       Increments the current read/write position by __n.
+inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
+
+//       Sets the beginning of the bufer to __begin, the current read/write
+//       position to __next, and the buffer's past-the-end pointer to __end.
+//       If any of those pointers is null, then all of them must be null.
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
+{
+	__f->_base = __begin;
+	__f->_ptr = __next;
+	__f->_cnt = __end - __next;
+	__f->_bufsiz = __end - __begin;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined(__MRC__) || defined(__SC__)		//*TY 02/24/2000 - added support for MPW
+
+inline int   _FILE_fd(const FILE *__f) { return __f->_file; }
+
+//       Returns a pointer to the beginning of the buffer.
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
+
+//       Returns the current read/write position within the buffer.
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }
+
+//       Returns a pointer immediately past the end of the buffer.
+inline char* _FILE_I_end(const FILE *__f) { return (char*)__f->_end; }
+
+//       Returns the number of characters remaining in the buffer, i.e.
+//       _FILE_[IO]_end(__f) - _FILE_[IO]_next(__f).
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+
+//       Increments the current read/write position by 1, returning the 
+//       character at the NEW position.
+inline char& _FILE_I_preincr(FILE *__f) { --__f->_cnt; return*(char*) (++__f->_ptr); }
+
+
+//       Increments the current read/write position by 1, returning the 
+//       character at the old position.
+inline char& _FILE_I_postincr(FILE *__f) { --__f->_cnt; return*(char*) (__f->_ptr++); }
+
+//       Decrements the current read/write position by 1, returning the 
+//       character at the NEW position.
+inline char& _FILE_I_predecr(FILE *__f) { ++__f->_cnt; return*(char*) (--__f->_ptr); }
+
+//       Decrements the current read/write position by 1, returning the 
+//       character at the old position.
+inline char& _FILE_I_postdecr(FILE *__f) { ++__f->_cnt; return*(char*) (__f->_ptr--); }
+
+//       Increments the current read/write position by __n.
+inline void _FILE_I_bump(FILE *__f, int __n) { __f->_cnt -= __n; __f->_ptr += __n; }
+
+//       Sets the beginning of the bufer to __begin, the current read/write
+//       position to __next, and the buffer's past-the-end pointer to __end.
+//       If any of those pointers is null, then all of them must be null.
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
+{
+	__f->_base = (unsigned char*)__begin;
+	__f->_ptr  = (unsigned char*)__next;
+	__f->_end  = (unsigned char*)__end;
+	__f->_cnt  = __end - __next;
+	__f->_size = __end - __begin;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__MVS__)
+
+typedef unsigned char* _File_ptr_type;
+
+inline int _FILE_fd(const FILE *__f) { return fileno(__CONST_CAST(FILE
+								  *,__f)); }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*)
+						__f->__fp->__bufPtr; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*)
+					       __f->__fp->__bufPtr; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->__fp->__bufPtr + __f->__fp->__countIn; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
+						    __f->__fp->__countIn; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->__fp->__countIn; return *(char*) (++__f->__fp->__bufPtr); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->__fp->__countIn; return *(char*) (--__f->__fp->__bufPtr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->__fp->__countIn; return *(char*) (__f->__fp->__bufPtr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->__fp->__bufPtr += __n; __f->__fp->__countIn -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char*
+			__end) {
+  // __f->_base = (_File_ptr_type) __begin;
+  if(__f->__fp) {
+    __f->__fp->__bufPtr = (_File_ptr_type) __next;
+    __f->__fp->__countIn = __end - __next;
+  }
+}
+
+inline char* _FILE_O_begin(const FILE *__f) { return (char*)__f->__fp->__bufPtr;}
+inline char* _FILE_O_next(const FILE *__f) { return (char*) __f->__fp->__bufPtr;}
+inline char* _FILE_O_end(const FILE *__f) { return (char*) __f->__fp->__bufPtr + __f->__fp->__countOut; }
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return __f->__fp->__countOut; }
+
+inline char& _FILE_O_preincr(FILE *__f)
+{ --__f->__fp->__countOut; return *(char*) (++__f->__fp->__bufPtr); }
+inline char& _FILE_O_postincr(FILE *__f)
+{ --__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr++); }
+inline char& _FILE_O_predecr(FILE *__f)
+{ ++__f->__fp->__countOut; return *(char*) (--__f->__fp->__bufPtr); }
+inline char& _FILE_O_postdecr(FILE *__f)
+{ ++__f->__fp->__countOut; return *(char*) (__f->__fp->__bufPtr--); }
+inline void _FILE_O_bump(FILE *__f, int __n)
+{ __f->__fp->__bufPtr += __n; __f->__fp->__countOut -= __n; }
+
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char*
+			__end) {
+  // __f->_base = (_File_ptr_type) __begin;
+  if(__f->__fp) {
+    __f->__fp->__bufPtr = (_File_ptr_type) __next;
+    __f->__fp->__countOut = __end - __next;
+  }
+}
+
+#elif defined(__QNXNTO__)
+
+inline int _FILE_fd(const FILE *__f) { return __f->_handle;
+}
+inline char* _FILE_I_begin(const FILE *__f) { return
+                                                (char*) __f->_base; }
+inline char* _FILE_I_next(const FILE *__f) { return
+                                               (char*) __f->_ptr; }
+inline char* _FILE_I_end(const FILE *__f)
+{ return (char*) __f->_ptr + __f->_cnt; }
+
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return
+                                                    __f->_cnt; }
+
+inline char& _FILE_I_preincr(FILE *__f)
+{ --__f->_cnt; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+{ --__f->_cnt; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+{ ++__f->_cnt; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+{ ++__f->_cnt; return *(char*) (__f->_ptr--); }
+inline void _FILE_I_bump(FILE *__f, int __n)
+{ __f->_ptr += __n; __f->_cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char*
+                        __next, char*
+                        __end) {
+  __f->_base = (unsigned char*) __begin;
+  __f->_ptr = (unsigned char*) __next;
+  __f->_cnt = __end - __next;
+}
+
+# define _STLP_FILE_I_O_IDENTICAL
+ 
+#elif defined(__WATCOMC__)                   // Nikolaev
+ 
+inline int       _FILE_fd      (const FILE *__f) { return __f->_handle;}
+inline char*     _FILE_I_begin (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_link); }
+inline char*     _FILE_I_next  (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr); }
+inline char*     _FILE_I_end   (const FILE *__f) { return __REINTERPRET_CAST(char*, __f->_ptr + __f->_cnt); }
+inline ptrdiff_t _FILE_I_avail (const FILE *__f) { return __f->_cnt; }
+ 
+inline char& _FILE_I_preincr(FILE *__f)
+{
+  --__f->_cnt;
+  return *__REINTERPRET_CAST(char*, ++__f->_ptr);
+}
+ 
+inline char& _FILE_I_postincr(FILE *__f)
+{
+  --__f->_cnt;
+  return *__REINTERPRET_CAST(char*, __f->_ptr++);
+}
+
+inline char& _FILE_I_predecr(FILE *__f)
+{
+  ++__f->_cnt;
+  return *__REINTERPRET_CAST(char*, --__f->_ptr);
+}
+ 
+inline char& _FILE_I_postdecr(FILE *__f)
+{
+  ++__f->_cnt;
+  return *__REINTERPRET_CAST(char*, __f->_ptr--);
+}
+ 
+inline void _FILE_I_bump(FILE *__f, int __n)
+{
+  __f->_ptr += __n;
+  __f->_cnt -= __n;
+}
+ 
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end)
+{
+  __f->_link = __REINTERPRET_CAST(__stream_link*, __begin);
+  __f->_ptr  = __REINTERPRET_CAST(unsigned char*, __next);
+  __f->_cnt  = __end - __next;
+}
+ 
+# define _STLP_FILE_I_O_IDENTICAL
+
+#elif defined (__Lynx__)
+
+// the prototypes are taken from LynxOS patch for STLport 4.0
+inline int   _FILE_fd(const FILE *__f) { return __f->_fd; }
+inline char* _FILE_I_begin(const FILE *__f) { return (char*) __f->_base; }
+inline char* _FILE_I_next(const FILE *__f) { return (char*) __f->_ptr; }  
+inline char* _FILE_I_end(const FILE *__f)
+  { return (char*) __f->_ptr + __f->_cnt; }
+ 
+inline ptrdiff_t _FILE_I_avail(const FILE *__f) { return __f->_cnt; }
+ 
+inline char& _FILE_I_preincr(FILE *__f)
+  { --__f->_cnt; return *(char*) (++__f->_ptr); }
+inline char& _FILE_I_postincr(FILE *__f)
+  { --__f->_cnt; return *(char*) (__f->_ptr++); }
+inline char& _FILE_I_predecr(FILE *__f)
+   { ++__f->_cnt; return *(char*) (--__f->_ptr); }
+inline char& _FILE_I_postdecr(FILE *__f)
+  { ++__f->_cnt; return *(char*) (__f->_ptr--); }
+inline void  _FILE_I_bump(FILE *__f, int __n)
+  { __f->_ptr += __n; __f->_cnt -= __n; }
+
+inline void _FILE_I_set(FILE *__f, char* __begin, char* __next, char* __end) {
+  __f->_base = __begin;
+  __f->_ptr  = __next;
+  __f->_cnt  = __end - __next;
+}
+# define _STLP_FILE_I_O_IDENTICAL
+
+#else  /* A C library that we don't have an implementation for. */
+
+# error The C++ I/O library is not configured for this compiler
+
+#endif
+
+
+// For most stdio's , input and output FILE manipulation is identical.
+# ifdef _STLP_FILE_I_O_IDENTICAL
+inline char* _FILE_O_begin(const FILE *__f) { return _FILE_I_begin(__f); }
+inline char* _FILE_O_next(const FILE *__f)  { return _FILE_I_next(__f); }
+inline char* _FILE_O_end(const FILE *__f)   { return _FILE_I_end(__f); }
+
+inline ptrdiff_t _FILE_O_avail(const FILE *__f) { return _FILE_I_avail(__f); }
+
+inline char& _FILE_O_preincr(FILE *__f)  { return _FILE_I_preincr(__f); }
+inline char& _FILE_O_postincr(FILE *__f) { return _FILE_I_postincr(__f); }
+inline char& _FILE_O_predecr(FILE *__f)  { return _FILE_I_predecr(__f); }
+inline char& _FILE_O_postdecr(FILE *__f) { return _FILE_I_postdecr(__f); }
+
+inline void  _FILE_O_bump(FILE *__f, int __n) { _FILE_I_bump(__f, __n); }
+inline void _FILE_O_set(FILE *__f, char* __begin, char* __next, char* __end)
+  { _FILE_I_set(__f, __begin, __next, __end); }
+# endif
+
+#else
+inline int _FILE_fd(const FILE *__f) { return (int)::_fileno(__CONST_CAST(FILE *, __f)); }
+#endif /* _STLP_WINCE */
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_STDIO_FILE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_stream_iterator.h b/src/STLport/stl/_stream_iterator.h
new file mode 100644
index 0000000..2979e3a
--- /dev/null
+++ b/src/STLport/stl/_stream_iterator.h
@@ -0,0 +1,343 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#if !defined (_STLP_INTERNAL_STREAM_ITERATOR_H) && ! defined (_STLP_USE_NO_IOSTREAMS)
+#define _STLP_INTERNAL_STREAM_ITERATOR_H
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+// streambuf_iterators predeclarations must appear first
+#ifndef _STLP_IOSFWD
+# include <iosfwd>
+#endif
+
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+#include <stl/_algobase.h>
+#endif
+
+#if defined (_STLP_OWN_IOSTREAMS)
+
+#ifndef _STLP_INTERNAL_OSTREAMBUF_ITERATOR_H
+# include <stl/_ostreambuf_iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAMBUF_ITERATOR_H
+# include <stl/_istreambuf_iterator.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ISTREAM_H
+# include <stl/_istream.h>
+#endif
+#endif /* _STLP_OWN_IOSTREAMS */
+
+// istream_iterator and ostream_iterator look very different if we're
+// using new, templatized iostreams than if we're using the old cfront
+// version.
+
+# if defined (_STLP_USE_NEW_IOSTREAMS) 
+
+_STLP_BEGIN_NAMESPACE
+
+#  ifndef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _Tp, 
+          class _CharT = _STLP_DEFAULTCHAR, class _Traits = char_traits<_CharT>,
+          class _Dist = ptrdiff_t> 
+#   define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _CharT, class _Traits, class _Dist
+#   define __ISI_TMPL_ARGUMENTS _Tp, _CharT, _Traits, _Dist
+class istream_iterator : public iterator<input_iterator_tag, _Tp , _Dist,
+                         const _Tp*, const _Tp& > {
+#  else
+
+#   if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+#    define __ISI_TMPL_HEADER_ARGUMENTS class _Tp
+#    define __ISI_TMPL_ARGUMENTS        _Tp
+template <class _Tp>
+class istream_iterator : public iterator<input_iterator_tag, _Tp , ptrdiff_t, 
+                         const _Tp*, const _Tp& > {
+#   else
+#    define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _Dist
+#    define __ISI_TMPL_ARGUMENTS        _Tp, _Dist
+template <class _Tp,__DFL_TYPE_PARAM(_Dist, ptrdiff_t)>
+class istream_iterator : public iterator<input_iterator_tag, _Tp, _Dist , 
+                                         const _Tp*, const _Tp& > {
+#   endif /* _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS */
+
+#  endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
+
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+  typedef char _CharT;
+  typedef char_traits<char> _Traits;
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+  typedef ptrdiff_t _Dist;
+#  endif
+# endif
+
+  typedef istream_iterator< __ISI_TMPL_ARGUMENTS > _Self;
+public:
+  typedef _CharT                         char_type;
+  typedef _Traits                        traits_type;
+  typedef basic_istream<_CharT, _Traits> istream_type;
+
+  typedef input_iterator_tag             iterator_category;
+  typedef _Tp                            value_type;
+  typedef _Dist                          difference_type;
+  typedef const _Tp*                     pointer;
+  typedef const _Tp&                     reference;
+
+  istream_iterator() : _M_stream(0), _M_ok(false) {}
+  istream_iterator(istream_type& __s) : _M_stream(&__s) { _M_read(); }
+
+  reference operator*() const { return _M_value; }
+
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  _Self& operator++() { 
+    _M_read(); 
+    return *this;
+  }
+  _Self operator++(int)  {
+    _Self __tmp = *this;
+    _M_read();
+    return __tmp;
+  }
+
+  bool _M_equal(const _Self& __x) const
+    { return (_M_ok == __x._M_ok) && (!_M_ok || _M_stream == __x._M_stream); }
+
+private:
+  istream_type* _M_stream;
+  _Tp _M_value;
+  bool _M_ok;
+
+  void _M_read() {
+    _M_ok = (_M_stream && *_M_stream) ? true : false;
+    if (_M_ok) {
+      *_M_stream >> _M_value;
+      _M_ok = *_M_stream ? true : false;
+    }
+  }
+};
+
+#ifndef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _TpP,
+          class _CharT = _STLP_DEFAULTCHAR, class _Traits = char_traits<_CharT> >
+#else
+template <class _TpP>
+#endif
+class ostream_iterator: public iterator<output_iterator_tag, void, void, void, void> {
+# ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+  typedef char _CharT;
+  typedef char_traits<char> _Traits;
+  typedef ostream_iterator<_TpP> _Self;
+# else
+  typedef ostream_iterator<_TpP, _CharT, _Traits> _Self;
+# endif
+public:
+  typedef _CharT                         char_type;
+  typedef _Traits                        traits_type;
+  typedef basic_ostream<_CharT, _Traits> ostream_type;
+
+  typedef output_iterator_tag            iterator_category;
+
+  ostream_iterator(ostream_type& __s) : _M_stream(&__s), _M_string(0) {}
+  ostream_iterator(ostream_type& __s, const _CharT* __c) 
+    : _M_stream(&__s), _M_string(__c)  {}
+  _Self& operator=(const _TpP& __val) { 
+    *_M_stream << __val;
+    if (_M_string) *_M_stream << _M_string;
+    return *this;
+  }
+  _Self& operator*() { return *this; }
+  _Self& operator++() { return *this; } 
+  _Self& operator++(int) { return *this; } 
+private:
+  ostream_type* _M_stream;
+  const _CharT* _M_string;
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+#  ifdef _STLP_LIMITED_DEFAULT_TEMPLATES
+template <class _TpP>
+inline output_iterator_tag _STLP_CALL 
+iterator_category(const ostream_iterator<_TpP>&) { return output_iterator_tag(); }
+# else
+template <class _TpP, class _CharT, class _Traits>
+inline output_iterator_tag _STLP_CALL 
+iterator_category(const ostream_iterator<_TpP, _CharT, _Traits>&) { return output_iterator_tag(); }
+#  endif
+# endif
+
+_STLP_END_NAMESPACE
+
+# elif ! defined(_STLP_USE_NO_IOSTREAMS)
+
+_STLP_BEGIN_NAMESPACE
+
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+#  define __ISI_TMPL_HEADER_ARGUMENTS class _Tp
+#  define __ISI_TMPL_ARGUMENTS        _Tp
+template <class _Tp>
+class istream_iterator : public iterator<input_iterator_tag, _Tp, ptrdiff_t, 
+                         const _Tp*, const _Tp& > {
+#  else
+#  define __ISI_TMPL_HEADER_ARGUMENTS class _Tp, class _Dist
+#  define __ISI_TMPL_ARGUMENTS        _Tp, _Dist
+template <class _Tp, __DFL_TYPE_PARAM(_Dist, ptrdiff_t)>
+class istream_iterator : public iterator<input_iterator_tag, _Tp, _Dist, 
+                         const _Tp*, const _Tp& > {
+#  endif
+
+protected:
+  istream* _M_stream;
+  _Tp _M_value;
+  bool _M_end_marker;
+  void _M_read() {
+    _M_end_marker = (*_M_stream) ? true : false;
+    if (_M_end_marker) *_M_stream >> _M_value;
+    _M_end_marker = (*_M_stream) ? true : false;
+}
+public:
+  typedef input_iterator_tag  iterator_category;
+  typedef _Tp                 value_type;
+  typedef _Dist               difference_type;
+  typedef const _Tp*          pointer;
+  typedef const _Tp&          reference;
+
+  istream_iterator() : _M_stream(&cin), _M_end_marker(false) {}
+  istream_iterator(istream& __s) : _M_stream(&__s) { _M_read(); }
+  reference operator*() const { return _M_value; }
+
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  istream_iterator< __ISI_TMPL_ARGUMENTS >& operator++() { 
+    _M_read(); 
+    return *this;
+  }
+  istream_iterator< __ISI_TMPL_ARGUMENTS > operator++(int)  {
+    istream_iterator< __ISI_TMPL_ARGUMENTS > __tmp = *this;
+    _M_read();
+    return __tmp;
+  }
+  inline bool _M_equal(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y) const {
+    return (_M_stream == __y._M_stream &&
+	    _M_end_marker == __y._M_end_marker) ||
+      _M_end_marker == false && __y._M_end_marker == false;
+  }
+};
+
+template <class _Tp>
+class ostream_iterator {
+protected:
+  ostream* _M_stream;
+  const char* _M_string;
+public:
+  typedef output_iterator_tag iterator_category;
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+  typedef void                value_type;
+  typedef void                difference_type;
+  typedef void                pointer;
+  typedef void                reference;
+# endif
+  ostream_iterator(ostream& __s) : _M_stream(&__s), _M_string(0) {}
+  ostream_iterator(ostream& __s, const char* __c) 
+    : _M_stream(&__s), _M_string(__c)  {}
+  ostream_iterator<_Tp>& operator=(const _Tp& __val) { 
+    *_M_stream << __val;
+    if (_M_string) *_M_stream << _M_string;
+    return *this;
+  }
+  ostream_iterator<_Tp>& operator*() { return *this; }
+  ostream_iterator<_Tp>& operator++() { return *this; } 
+  ostream_iterator<_Tp>& operator++(int) { return *this; } 
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Tp> inline output_iterator_tag 
+iterator_category(const ostream_iterator<_Tp>&) { return output_iterator_tag(); }
+#endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+// form-independent definiotion of stream iterators
+_STLP_BEGIN_NAMESPACE
+
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline bool _STLP_CALL 
+operator==(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __x,
+           const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y) {
+  return __x._M_equal(__y);
+}
+
+#  ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline bool _STLP_CALL 
+operator!=(const istream_iterator< __ISI_TMPL_ARGUMENTS >& __x,
+           const istream_iterator< __ISI_TMPL_ARGUMENTS >& __y) {
+  return !__x._M_equal(__y);
+}
+
+#  endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline input_iterator_tag _STLP_CALL 
+iterator_category(const istream_iterator< __ISI_TMPL_ARGUMENTS >&)
+{ return input_iterator_tag(); }
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline _Tp* _STLP_CALL 
+value_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (_Tp*) 0; }
+
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS) && ! defined (_STLP_DEFAULT_TYPE_PARAM)
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline ptrdiff_t* _STLP_CALL 
+distance_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (ptrdiff_t*)0; }
+#  else
+template < __ISI_TMPL_HEADER_ARGUMENTS >
+inline _Dist* _STLP_CALL 
+distance_type(const istream_iterator< __ISI_TMPL_ARGUMENTS >&) { return (_Dist*)0; }
+#  endif /* _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS */
+
+# endif 
+
+_STLP_END_NAMESPACE
+
+#  undef __ISI_TMPL_HEADER_ARGUMENTS
+#  undef __ISI_TMPL_ARGUMENTS
+
+
+#endif /* _STLP_INTERNAL_STREAM_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_streambuf.c b/src/STLport/stl/_streambuf.c
new file mode 100644
index 0000000..59a1e4b
--- /dev/null
+++ b/src/STLport/stl/_streambuf.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_STREAMBUF_C
+#define _STLP_STREAMBUF_C
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+# include <stl/_streambuf.h>
+#endif
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+_STLP_BEGIN_NAMESPACE
+//----------------------------------------------------------------------
+// Non-inline basic_streambuf<> member functions.
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>::basic_streambuf()
+  : _M_gbegin(0), _M_gnext(0), _M_gend(0),
+    _M_pbegin(0), _M_pnext(0), _M_pend(0),
+    _M_locale()
+{
+  //  _M_lock._M_initialize();
+}
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>::~basic_streambuf() 
+{}
+
+
+template <class _CharT, class _Traits>
+locale 
+basic_streambuf<_CharT, _Traits>::pubimbue(const locale& __loc) {
+  this->imbue(__loc);
+  locale __tmp = _M_locale;
+  _M_locale = __loc;
+  return __tmp;
+}
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::xsgetn(_CharT* __s, streamsize __n)
+{
+  streamsize __result = 0;
+  const int_type __eof = _Traits::eof();
+
+  while (__result < __n) {
+    if (_M_gnext < _M_gend) {
+      size_t __chunk = (min) (__STATIC_CAST(size_t,_M_gend - _M_gnext),
+                           __STATIC_CAST(size_t,__n - __result));
+      _Traits::copy(__s, _M_gnext, __chunk);
+      __result += __chunk;
+      __s += __chunk;
+      _M_gnext += __chunk;
+    }
+    else {
+      int_type __c = this->sbumpc();
+      if (!_Traits::eq_int_type(__c, __eof)) {
+        *__s = __c;
+        ++__result;
+	++__s;
+      }
+      else
+        break; 
+    }
+  }
+  
+  return __result;
+}
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::xsputn(const _CharT* __s, streamsize __n)
+{
+  streamsize __result = 0;
+  const int_type __eof = _Traits::eof();
+
+  while (__result < __n) {
+    if (_M_pnext < _M_pend) {
+      size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
+                           __STATIC_CAST(size_t,__n - __result));
+      _Traits::copy(_M_pnext, __s, __chunk);
+      __result += __chunk;
+      __s += __chunk;
+      _M_pnext += __chunk;
+    }
+
+    else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(*__s)),
+                                   __eof)) {
+      ++__result;
+      ++__s;
+    }
+    else
+      break;
+  }
+  return __result;
+}
+
+template <class _CharT, class _Traits>
+streamsize
+basic_streambuf<_CharT, _Traits>::_M_xsputnc(_CharT __c, streamsize __n)
+{
+  streamsize __result = 0;
+  const int_type __eof = _Traits::eof();
+
+  while (__result < __n) {
+    if (_M_pnext < _M_pend) {
+      size_t __chunk = (min) (__STATIC_CAST(size_t,_M_pend - _M_pnext),
+                           __STATIC_CAST(size_t,__n - __result));
+      _Traits::assign(_M_pnext, __chunk, __c);
+      __result += __chunk;
+      _M_pnext += __chunk;
+    }
+
+    else if (!_Traits::eq_int_type(this->overflow(_Traits::to_int_type(__c)),
+                                   __eof))
+      ++__result;
+    else
+      break;
+  }
+  return __result;
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type 
+basic_streambuf<_CharT, _Traits>::_M_snextc_aux()  
+{
+  int_type __eof = _Traits::eof();
+  if (_M_gend == _M_gnext)
+    return _Traits::eq_int_type(this->uflow(), __eof) ? __eof : this->sgetc();
+  else {
+    _M_gnext = _M_gend;
+    return this->underflow();
+  }
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type 
+basic_streambuf<_CharT, _Traits>::pbackfail(int_type) { 
+ return _Traits::eof(); 
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type 
+basic_streambuf<_CharT, _Traits>::overflow(int_type) { 
+  return _Traits::eof(); 
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type 
+basic_streambuf<_CharT, _Traits>::uflow() {
+    return ( _Traits::eq_int_type(this->underflow(),_Traits::eof()) ?
+             _Traits::eof() :
+             _Traits::to_int_type(*_M_gnext++));
+}
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::int_type 
+basic_streambuf<_CharT, _Traits>::underflow()
+{ return _Traits::eof(); }
+
+template <class _CharT, class _Traits>
+streamsize 
+basic_streambuf<_CharT, _Traits>::showmanyc()
+{ return 0; }
+
+template <class _CharT, class _Traits>
+void 
+basic_streambuf<_CharT, _Traits>::imbue(const locale&) {}
+
+template <class _CharT, class _Traits>
+int
+basic_streambuf<_CharT, _Traits>::sync() { return 0; }
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type 
+basic_streambuf<_CharT, _Traits>::seekpos(pos_type, ios_base::openmode)
+{ return pos_type(-1); }
+
+template <class _CharT, class _Traits>
+_STLP_TYPENAME_ON_RETURN_TYPE basic_streambuf<_CharT, _Traits>::pos_type 
+basic_streambuf<_CharT, _Traits>::seekoff(off_type, ios_base::seekdir,
+					  ios_base::openmode)
+{ return pos_type(-1); }
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>* 
+basic_streambuf<_CharT, _Traits>:: setbuf(char_type*, streamsize)
+{ return this; }
+
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+#  if !defined (_STLP_NO_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_streambuf<wchar_t, char_traits<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+# endif /* EXPOSE */
+
+#endif
diff --git a/src/STLport/stl/_streambuf.h b/src/STLport/stl/_streambuf.h
new file mode 100644
index 0000000..b2f5cb2
--- /dev/null
+++ b/src/STLport/stl/_streambuf.h
@@ -0,0 +1,526 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_INTERNAL_STREAMBUF
+#define _STLP_INTERNAL_STREAMBUF
+
+#ifndef _STLP_IOS_BASE_H
+#include <stl/_ios_base.h>      // Needed for ios_base bitfield members.
+                                // <ios_base> includes <iosfwd>.
+#endif
+
+#ifndef _STLP_STDIO_FILE_H
+#include <stl/_stdio_file.h>     // Declaration of struct FILE, and of
+                                // functions to manipulate it.
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Class basic_streambuf<>, the base class of the streambuf hierarchy.
+
+// A basic_streambuf<> manages an input (get) area and an output (put)
+// area.  Each is described by three pointers: a beginning, an end, and a
+// current position.  basic_streambuf<> contains some very simple member
+// functions that manipulate those six pointers, but almost all of the real
+// functionality gets delegated to protected virtual member functions.
+// All of the public member functions are inline, and most of the protected
+// member functions are virtual.
+
+// Although basic_streambuf<> is not abstract, it is useful only as a base
+// class.  Its virtual member functions have default definitions such that
+// reading from a basic_streambuf<> will always yield EOF, and writing to a
+// basic_streambuf<> will always fail.
+
+// The second template parameter, _Traits, defaults to char_traits<_CharT>.
+// The default is declared in header <iosfwd>, and it isn't declared here
+// because C++ language rules do not allow it to be declared twice. 
+
+template <class _CharT, class _Traits>
+class basic_streambuf
+{
+  friend class basic_istream<_CharT, _Traits>;
+  friend class basic_ostream<_CharT, _Traits>;
+
+public:                         // Typedefs.
+  typedef _CharT                     char_type;
+  typedef typename _Traits::int_type int_type;
+  typedef typename _Traits::pos_type pos_type;
+  typedef typename _Traits::off_type off_type;
+  typedef _Traits                    traits_type;
+
+private:                        // Data members.
+
+  char_type* _M_gbegin;         // Beginning of get area
+  char_type* _M_gnext;          // Current position within the get area
+  char_type* _M_gend;           // End of get area
+
+  char_type* _M_pbegin;         // Beginning of put area
+  char_type* _M_pnext;          // Current position within the put area
+  char_type* _M_pend;           // End of put area
+
+  locale _M_locale;             // The streambuf's locale object
+
+public:                         // Extension: locking, for thread safety.
+  _STLP_mutex _M_lock;
+
+public:                         // Destructor.
+  virtual ~basic_streambuf();
+
+protected:                      // The default constructor.
+  basic_streambuf();
+
+protected:                      // Protected interface to the get area.
+  char_type* eback() const { return _M_gbegin; } // Beginning
+  char_type* gptr()  const { return _M_gnext; }  // Current position
+  char_type* egptr() const { return _M_gend; }   // End
+  
+  void gbump(int __n) { _M_gnext += __n; }
+  void setg(char_type* __gbegin, char_type* __gnext, char_type* __gend) {
+    _M_gbegin = __gbegin;
+    _M_gnext  = __gnext;
+    _M_gend   = __gend;
+  }
+
+public:
+  // An alternate public interface to the above functions
+  // which allows us to avoid using templated friends which
+  // are not supported on some compilers.
+
+  char_type* _M_eback() const { return eback(); }
+  char_type* _M_gptr()  const { return gptr(); }
+  char_type* _M_egptr() const { return egptr(); }
+  void _M_gbump(int __n)      { gbump(__n); }
+  void _M_setg(char_type* __gbegin, char_type* __gnext, char_type* __gend)
+    { setg(__gbegin, __gnext, __gend); }
+
+protected:                      // Protected interface to the put area
+
+  char_type* pbase() const { return _M_pbegin; } // Beginning
+  char_type* pptr()  const { return _M_pnext; }  // Current position
+  char_type* epptr() const { return _M_pend; }   // End
+
+  void pbump(int __n) { _M_pnext += __n; }
+  void setp(char_type* __pbegin, char_type* __pend) {
+    _M_pbegin = __pbegin;
+    _M_pnext  = __pbegin;
+    _M_pend   = __pend;
+  }
+
+protected:                      // Virtual buffer management functions.
+
+  virtual basic_streambuf<_CharT, _Traits>* setbuf(char_type*, streamsize);
+
+  // Alters the stream position, using an integer offset.  In this
+  // class seekoff does nothing; subclasses are expected to override it.
+  virtual pos_type seekoff(off_type, ios_base::seekdir,
+                           ios_base::openmode = ios_base::in | ios_base::out);
+
+  // Alters the stream position, using a previously obtained streampos.  In
+  // this class seekpos does nothing; subclasses are expected to override it.
+  virtual pos_type
+  seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
+
+  // Synchronizes (i.e. flushes) the buffer.  All subclasses are expected to 
+  // override this virtual member function.
+  virtual int sync();
+
+
+public:                         // Buffer management.
+  basic_streambuf<_CharT, _Traits>* pubsetbuf(char_type* __s, streamsize __n) 
+    { return this->setbuf(__s, __n); }
+
+  pos_type pubseekoff(off_type __offset, ios_base::seekdir __way,
+                      ios_base::openmode __mod = ios_base::in | ios_base::out)
+    { return this->seekoff(__offset, __way, __mod); }
+
+  pos_type pubseekpos(pos_type __sp,
+                      ios_base::openmode __mod = ios_base::in | ios_base::out)
+    { return this->seekpos(__sp, __mod); }
+
+  int pubsync() { return this->sync(); }
+
+protected:                      // Virtual get area functions, as defined in
+                                // 17.5.2.4.3 and 17.5.2.4.4 of the standard.
+  // Returns a lower bound on the number of characters that we can read,
+  // with underflow, before reaching end of file.  (-1 is a special value:
+  // it means that underflow will fail.)  Most subclasses should probably
+  // override this virtual member function.
+  virtual streamsize showmanyc();
+
+  // Reads up to __n characters.  Return value is the number of 
+  // characters read.
+  virtual streamsize xsgetn(char_type* __s, streamsize __n);
+
+  // Called when there is no read position, i.e. when gptr() is null
+  // or when gptr() >= egptr().  Subclasses are expected to override
+  // this virtual member function.
+  virtual int_type underflow();
+
+  // Similar to underflow(), but used for unbuffered input.  Most 
+  // subclasses should probably override this virtual member function.
+  virtual int_type uflow();
+
+  // Called when there is no putback position, i.e. when gptr() is null
+  // or when gptr() == eback().  All subclasses are expected to override
+  // this virtual member function.
+  virtual int_type pbackfail(int_type = traits_type::eof());
+
+protected:                      // Virtual put area functions, as defined in
+                                // 27.5.2.4.5 of the standard.
+
+  // Writes up to __n characters.  Return value is the number of characters
+  // written.
+  virtual streamsize xsputn(const char_type* __s, streamsize __n);
+
+  // Extension: writes up to __n copies of __c.  Return value is the number
+  // of characters written.
+  virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+
+  // Called when there is no write position.  All subclasses are expected to
+  // override this virtual member function.
+  virtual int_type overflow(int_type = traits_type::eof());
+
+public:                         // Public members for writing characters.
+  // Write a single character.
+  int_type sputc(char_type __c) {
+    return ((_M_pnext < _M_pend) ? _Traits::to_int_type(*_M_pnext++ = __c)
+      : this->overflow(_Traits::to_int_type(__c)));
+  }
+
+  // Write __n characters.
+  streamsize sputn(const char_type* __s, streamsize __n)
+    { return this->xsputn(__s, __n); }
+
+  // Extension: write __n copies of __c.
+  streamsize _M_sputnc(char_type __c, streamsize __n)
+    { return this->_M_xsputnc(__c, __n); }
+
+private:                        // Helper functions.
+  int_type _M_snextc_aux();
+
+
+public:                         // Public members for reading characters.
+  streamsize in_avail() {
+    return (_M_gnext < _M_gend) ? (_M_gend - _M_gnext) : this->showmanyc();
+  }
+  
+  // Advance to the next character and return it.
+  int_type snextc() {
+	return ( _M_gend - _M_gnext > 1 ?
+             _Traits::to_int_type(*++_M_gnext) :
+             this->_M_snextc_aux());
+  }
+
+  // Return the current character and advance to the next.
+  int_type sbumpc() {
+    return _M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext++) 
+      : this->uflow();
+  }
+  
+  // Return the current character without advancing to the next.
+  int_type sgetc() {
+    return _M_gnext < _M_gend ? _Traits::to_int_type(*_M_gnext) 
+      : this->underflow();
+  }
+  
+  streamsize sgetn(char_type* __s, streamsize __n)
+  { return this->xsgetn(__s, __n); }
+  
+  int_type sputbackc(char_type __c) {
+    return ((_M_gbegin < _M_gnext) && _Traits::eq(__c, *(_M_gnext - 1)))
+      ? _Traits::to_int_type(*--_M_gnext)
+      : this->pbackfail(_Traits::to_int_type(__c));
+  }
+  
+  int_type sungetc() {
+    return (_M_gbegin < _M_gnext)
+      ? _Traits::to_int_type(*--_M_gnext)
+      : this->pbackfail();
+  }
+
+protected:                      // Virtual locale functions.
+
+  // This is a hook, called by pubimbue() just before pubimbue()
+  // sets the streambuf's locale to __loc.  Note that imbue should
+  // not (and cannot, since it has no access to streambuf's private
+  // members) set the streambuf's locale itself.
+  virtual void imbue(const locale&);
+
+public:                         // Locale-related functions.
+  locale pubimbue(const locale&);
+  locale getloc() const { return _M_locale; }
+
+# ifndef _STLP_NO_ANACHRONISMS
+  void stossc() { this->sbumpc(); }
+# endif
+#if defined(__MVS__) || defined(__OS400__)
+private: // Data members.
+
+  char_type* _M_gbegin; // Beginning of get area
+  char_type* _M_gnext; // Current position within the get area
+  char_type* _M_gend; // End of get area
+
+  char_type* _M_pbegin; // Beginning of put area
+  char_type* _M_pnext; // Current position within the put area
+  char_type* _M_pend; // End of put area
+#endif
+};
+
+
+//----------------------------------------------------------------------
+// Specialization: basic_streambuf<char, char_traits<char> >
+
+// We implement basic_streambuf<char, char_traits<char> > very differently
+// than the general basic_streambuf<> template.  The main reason for this
+// difference is a requirement in the C++ standard: the standard input
+// and output streams cin and cout are required by default to be synchronized
+// with the C library components stdin and stdout.  This means it must be
+// possible to synchronize a basic_streambuf<char> with a C buffer.
+//
+// There are two basic ways to do that.  First, the streambuf could be
+// unbuffered and delegate all buffering to stdio operations.  This
+// would be correct, but slow: it would require at least one virtual
+// function call for every character.  Second, the streambuf could use 
+// a C stdio FILE as its buffer.  
+//
+// We choose the latter option.  Every streambuf has pointers to two
+// FILE objects, one for the get area and one for the put area.  Ordinarily
+// it just uses a FILE object as a convenient way to package the three
+// get/put area pointers.  If a basic_streambuf<char> is synchronized with
+// a stdio stream, though, then the pointers are to a FILE object that's
+// also used by the C library.
+//
+// The header <stl/_stdio_file.h> encapsulates the implementation details
+// of struct FILE.  It contains low-level inline functions that convert
+// between whe FILE's internal representation and the three-pointer 
+// representation that basic_streambuf<> needs.
+
+_STLP_TEMPLATE_NULL 
+class _STLP_CLASS_DECLSPEC basic_streambuf<char, char_traits<char> >
+{
+  friend class basic_istream<char, char_traits<char> >;
+  friend class basic_ostream<char, char_traits<char> >;
+public:                         // Typedefs.
+  typedef char                        char_type;
+  typedef char_traits<char>::int_type int_type;
+  typedef char_traits<char>::pos_type pos_type;
+  typedef char_traits<char>::off_type off_type;
+  typedef char_traits<char>           traits_type;
+
+private:                        // Data members.
+
+  FILE* _M_get;                 // Reference to the get area
+  FILE* _M_put;                 // Reference to the put area
+
+#if defined(__hpux)
+  _FILEX  _M_default_get;          // Get area, unless we're syncing with stdio.
+  _FILEX  _M_default_put;          // Put area, unless we're syncing with stdio.
+#else
+  FILE  _M_default_get;          // Get area, unless we're syncing with stdio.
+  FILE  _M_default_put;          // Put area, unless we're syncing with stdio.
+#endif
+
+  locale _M_locale;
+
+public:                         // Extension: locking, for thread safety.
+  _STLP_mutex _M_lock;
+
+public:                         // Destructor.
+  virtual ~basic_streambuf _STLP_PSPEC2(char, char_traits<char>) ();
+
+protected:                      // Constructors.
+
+  // The default constructor; defined here inline as some compilers require it
+  basic_streambuf _STLP_PSPEC2(char, char_traits<char>) ()
+    : _M_get(__REINTERPRET_CAST(FILE*,&_M_default_get)),
+      _M_put(__REINTERPRET_CAST(FILE*,&_M_default_put)), _M_locale()
+  {
+    // _M_lock._M_initialize();
+    _FILE_I_set(_M_get, 0, 0, 0);
+    _FILE_O_set(_M_put, 0, 0, 0);
+  }
+  
+  // Extension: a constructor for streambufs synchronized with C stdio files.
+  basic_streambuf _STLP_PSPEC2(char, char_traits<char>) (FILE* __get, FILE* __put);
+
+protected:                      // Protected interface to the get area.
+  char_type* eback() const { return _FILE_I_begin(_M_get); }
+  char_type* gptr()  const { return _FILE_I_next(_M_get); }
+  char_type* egptr() const { return _FILE_I_end(_M_get); }
+  void gbump(int __n) { _FILE_I_bump(_M_get, __n); }
+  void setg(char_type* __gbegin, char_type* __gnext, char_type* __gend)
+    { _FILE_I_set(_M_get, __gbegin, __gnext, __gend); }
+
+public:
+  // An alternate public interface to the above functions
+  // which allows us to avoid using templated friends which
+  // are not supported on some compilers.
+
+  char_type* _M_eback() const { return _FILE_I_begin(_M_get); }
+  char_type* _M_gptr()  const { return _FILE_I_next(_M_get); }
+  char_type* _M_egptr() const { return _FILE_I_end(_M_get); }
+
+  void _M_gbump(int __n) { _FILE_I_bump(_M_get, __n); }
+  void _M_setg(char_type* __gbegin, char_type* __gnext, char_type* __gend)
+    { _FILE_I_set(_M_get, __gbegin, __gnext, __gend); }
+
+protected:                      // Protected interface to the put area
+  char_type* pbase() const { return _FILE_O_begin(_M_put); }
+  char_type* pptr()  const { return _FILE_O_next(_M_put); }
+  char_type* epptr() const { return _FILE_O_end(_M_put); }
+
+  void pbump(int __n) { _FILE_O_bump(_M_put, __n); }
+  void setp(char_type* __pbegin, char_type* __pend)
+    { _FILE_O_set(_M_put, __pbegin, __pbegin, __pend); }
+
+protected:                      // Virtual buffer-management functions.
+  virtual basic_streambuf<char, char_traits<char> >* setbuf(char_type*, streamsize);
+  virtual pos_type seekoff(off_type, ios_base::seekdir,
+                           ios_base::openmode = ios_base::in | ios_base::out);
+  virtual pos_type
+  seekpos(pos_type, ios_base::openmode = ios_base::in | ios_base::out);
+  virtual int sync();
+
+public:                         // Buffer management.
+  basic_streambuf<char, char_traits<char> >* pubsetbuf(char_type* __s, streamsize __n) 
+    { return this->setbuf(__s, __n); }
+
+  pos_type pubseekoff(off_type __offset, ios_base::seekdir __way,
+                      ios_base::openmode __mod = ios_base::in | ios_base::out)
+    { return this->seekoff(__offset, __way, __mod); }
+
+  pos_type pubseekpos(pos_type __sp,
+                      ios_base::openmode __mod = ios_base::in | ios_base::out)
+    { return this->seekpos(__sp, __mod); }
+
+  int pubsync() { return this->sync(); }
+
+protected:                      // Virtual get area functions.
+  virtual streamsize showmanyc();
+  virtual streamsize xsgetn(char_type* __s, streamsize __n);
+  virtual int_type underflow();
+  virtual int_type uflow();
+  virtual int_type pbackfail(int_type __c = traits_type::eof());
+
+protected:                      // Virtual put area functions.
+  virtual streamsize xsputn(const char_type* __s, streamsize __n);
+  virtual streamsize _M_xsputnc(char_type __c, streamsize __n);
+  virtual int_type overflow(int_type = traits_type::eof());
+
+public:                         // Public members for writing characters.
+  // Write a single character.
+  int_type sputc(char_type __c) {
+    int_type __res;
+	if( _FILE_O_avail(_M_put) > 0 )
+	{
+		_FILE_O_postincr(_M_put) = __c;
+		__res = traits_type::to_int_type(__c);
+	}
+	else
+      __res = this->overflow(traits_type::to_int_type(__c));
+    return __res;
+  }
+
+  // Write __n characters.
+  streamsize sputn(const char_type* __s, streamsize __n)
+    { return this->xsputn(__s, __n); }
+
+  // Extension: write __n copies of __c.
+  streamsize _M_sputnc(char_type __c, streamsize __n)
+    { return this->_M_xsputnc(__c, __n); }
+
+private:                        // Helper functions.
+  int_type _M_snextc_aux();
+
+public:                         // Public members for reading characters.
+  streamsize in_avail()
+    { return _FILE_I_avail(_M_get) > 0 ? _FILE_I_avail(_M_get) 
+                                     : this->showmanyc(); }
+  
+  // Advance to the next character and return it.
+  int_type snextc() {
+    return _FILE_I_avail(_M_get) > 1
+      ? traits_type::to_int_type(_FILE_I_preincr(_M_get))
+      : this->_M_snextc_aux();
+  }
+
+  // Return the current character and advance to the next.
+  int_type sbumpc() {
+    return _FILE_I_avail(_M_get) > 0
+      ? traits_type::to_int_type(_FILE_I_postincr(_M_get))
+      : this->uflow();
+  }
+
+  // Return the current character without advancing to the next.
+  int_type sgetc() {
+    return _FILE_I_avail(_M_get) > 0
+      ? traits_type::to_int_type(*_FILE_I_next(_M_get))
+      : this->underflow();
+  }
+    
+  streamsize sgetn(char_type* __s, streamsize __n)
+    { return this->xsgetn(__s, __n); }
+
+  int_type sputbackc(char_type __c) {
+    return _FILE_I_begin(_M_get) < _FILE_I_next(_M_get) &&
+           __c == *(_FILE_I_next(_M_get) - 1)
+      ? traits_type::to_int_type(_FILE_I_predecr(_M_get))
+      : this->pbackfail(traits_type::to_int_type(__c));
+  }
+
+  int_type sungetc() {
+    return _FILE_I_begin(_M_get) < _FILE_I_next(_M_get)
+      ? traits_type::to_int_type(_FILE_I_predecr(_M_get))
+      : this->pbackfail();
+  }
+
+protected:                      // Virtual locale functions.
+  virtual void imbue(const locale&);
+
+public:                         // Locale-related functions.
+  locale pubimbue(const locale&);
+  locale getloc() const { return _M_locale; }
+
+# ifndef _STLP_NO_ANACHRONISMS
+public:
+  void stossc() { this->sbumpc(); }
+# endif
+
+#if defined(__MVS__) || defined(__OS400__)
+private: // Data members.
+
+  char_type* _M_gbegin; // Beginning of get area
+  char_type* _M_gnext; // Current position within the get area
+  char_type* _M_gend; // End of get area
+
+  char_type* _M_pbegin; // Beginning of put area
+  char_type* _M_pnext; // Current position within the put area
+  char_type* _M_pend; // End of put area
+#endif
+
+};
+_STLP_END_NAMESPACE
+
+# if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_streambuf.c>
+# endif
+
+#endif
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_streambuf_iterator.h b/src/STLport/stl/_streambuf_iterator.h
new file mode 100644
index 0000000..dd685f7
--- /dev/null
+++ b/src/STLport/stl/_streambuf_iterator.h
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1998
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#if !defined (_STLP_INTERNAL_STREAMBUF_ITERATOR_H)
+#define _STLP_INTERNAL_STREAMBUF_ITERATOR_H
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits>
+basic_streambuf<_CharT, _Traits>* _STLP_CALL _M_get_ostreambuf(basic_ostream<_CharT, _Traits>& ) ;
+
+// The default template argument is declared in iosfwd
+template<class _CharT, class _Traits>
+class ostreambuf_iterator
+{
+public:
+  typedef _CharT                           char_type;
+  typedef _Traits                          traits_type;
+  typedef typename _Traits::int_type       int_type;
+  typedef basic_streambuf<_CharT, _Traits> streambuf_type;
+  typedef basic_ostream<_CharT, _Traits>   ostream_type;
+
+  typedef output_iterator_tag              iterator_category;
+  typedef void                             value_type;
+  typedef void                             difference_type;
+  typedef void                             pointer;
+  typedef void                             reference;
+
+public:
+  ostreambuf_iterator(streambuf_type* __buf) _STLP_NOTHROW : _M_buf(__buf), _M_ok(__buf!=0) {}
+  ostreambuf_iterator(ostream_type& __o) _STLP_NOTHROW : _M_buf(_M_get_ostreambuf(__o)), _M_ok(_M_buf != 0) {}
+
+  ostreambuf_iterator<_CharT, _Traits>& operator=(char_type __c) {
+    _M_ok = _M_ok && !traits_type::eq_int_type(_M_buf->sputc(__c),
+                                               traits_type::eof());
+    return *this;
+  }    
+  
+  ostreambuf_iterator<_CharT, _Traits>& operator*()     { return *this; }
+  ostreambuf_iterator<_CharT, _Traits>& operator++()    { return *this; }
+  ostreambuf_iterator<_CharT, _Traits>& operator++(int) { return *this; }
+
+  bool failed() const { return !_M_ok; }
+
+private:
+  streambuf_type* _M_buf;
+  bool _M_ok;
+};
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_STREAMBUF_ITERATOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_string.c b/src/STLport/stl/_string.c
new file mode 100644
index 0000000..3457990
--- /dev/null
+++ b/src/STLport/stl/_string.c
@@ -0,0 +1,580 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_STRING_C
+#define _STLP_STRING_C
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+# ifdef _STLP_DEBUG
+#  define basic_string _Nondebug_string
+# endif
+
+# if defined (_STLP_USE_OWN_NAMESPACE) || !defined (_STLP_USE_NATIVE_STRING)
+
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG)
+#  define __size_type__ size_t
+#  define size_type size_t
+#  define iterator   _CharT*
+# else
+#  define __size_type__ _STLP_TYPENAME_ON_RETURN_TYPE basic_string<_CharT,_Traits,_Alloc>::size_type
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// ------------------------------------------------------------
+// Non-inline declarations.
+
+
+// Change the string's capacity so that it is large enough to hold
+//  at least __res_arg elements, plus the terminating _CharT().  Note that,
+//  if __res_arg < capacity(), this member function may actually decrease
+//  the string's capacity.
+template <class _CharT, class _Traits, class _Alloc> void basic_string<_CharT,_Traits,_Alloc>::reserve(size_type __res_arg) {
+
+  if (__res_arg >= capacity())
+    {      
+      if (__res_arg > max_size())
+	this->_M_throw_length_error();
+
+      size_type __n = __res_arg + 1;
+      pointer __new_start = this->_M_end_of_storage.allocate(__n);
+      pointer __new_finish = __new_start;
+      
+      _STLP_TRY {
+	__new_finish = uninitialized_copy(this->_M_start, this->_M_finish, __new_start);
+	_M_construct_null(__new_finish);
+      }
+      _STLP_UNWIND((_STLP_STD::_Destroy(__new_start, __new_finish), 
+		    this->_M_end_of_storage.deallocate(__new_start, __n)));
+      
+      _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+      this->_M_deallocate_block();
+      this->_M_start = __new_start;
+      this->_M_finish = __new_finish;
+      this->_M_end_of_storage._M_data = __new_start + __n;
+    }
+}
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc>::append(size_type __n, _CharT __c) {
+  if (__n > max_size() || size() > max_size() - __n)
+    this->_M_throw_length_error();
+  if (size() + __n > capacity())
+    reserve(size() + (max)(size(), __n));
+  if (__n > 0) {
+    uninitialized_fill_n(this->_M_finish + 1, __n - 1, __c);
+    _STLP_TRY {
+      _M_construct_null(this->_M_finish + __n);
+    }
+    _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_finish + 1, this->_M_finish + __n));
+    _Traits::assign(*end(), __c);
+    this->_M_finish += __n;
+  }
+  return *this;
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>& basic_string<_CharT, _Traits, _Alloc>::append(const _CharT* __first,
+					      const _CharT* __last)
+{
+  if (__first != __last) {
+    const size_type __old_size = size();
+    ptrdiff_t __n = __last - __first;
+    if ((size_type)__n > max_size() || __old_size > max_size() - __n)
+      this->_M_throw_length_error();
+    if (__old_size + __n > capacity()) {
+      const size_type __len = __old_size + (max)(__old_size, (size_t) __n) + 1;
+      pointer __new_start = this->_M_end_of_storage.allocate(__len);
+      pointer __new_finish = __new_start;
+      _STLP_TRY {
+        __new_finish = uninitialized_copy(this->_M_start, this->_M_finish, __new_start);
+        __new_finish = uninitialized_copy(__first, __last, __new_finish);
+        _M_construct_null(__new_finish);
+      }
+      _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+                    this->_M_end_of_storage.deallocate(__new_start,__len)));
+      _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+      this->_M_deallocate_block();
+      this->_M_start = __new_start;
+      this->_M_finish = __new_finish;
+      this->_M_end_of_storage._M_data = __new_start + __len; 
+    }
+    else {
+      const _CharT* __f1 = __first;
+      ++__f1;
+      uninitialized_copy(__f1, __last, this->_M_finish + 1);
+      _STLP_TRY {
+        _M_construct_null(this->_M_finish + __n);
+      }
+      _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_finish + 1, this->_M_finish + __n));
+      _Traits::assign(*end(), *__first);
+      this->_M_finish += __n;
+    }
+  }
+  return *this;  
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _CharT, class _Traits, class _Alloc> 
+basic_string<_CharT,_Traits,_Alloc>& 
+basic_string<_CharT,_Traits,_Alloc>::assign(size_type __n, _CharT __c) {
+  if (__n <= size()) {
+    _Traits::assign(this->_M_start, __n, __c);
+    erase(begin() + __n, end());
+  }
+  else {
+    _Traits::assign(this->_M_start, size(), __c);
+    append(__n - size(), __c);
+  }
+  return *this;
+}
+
+template <class _CharT, class _Traits, class _Alloc> _CharT* 
+basic_string<_CharT,_Traits,_Alloc> ::_M_insert_aux(_CharT* __p,
+                  _CharT __c)
+{
+  pointer __new_pos = __p;
+  if (this->_M_finish + 1 < this->_M_end_of_storage._M_data) {
+    _M_construct_null(this->_M_finish + 1);
+    _Traits::move(__p + 1, __p, this->_M_finish - __p);
+    _Traits::assign(*__p, __c);
+    ++this->_M_finish;
+  }
+  else {
+    const size_type __old_len = size();
+    const size_type __len = __old_len +
+                            (max)(__old_len, __STATIC_CAST(size_type,1)) + 1;
+    pointer __new_start = this->_M_end_of_storage.allocate(__len);
+    pointer __new_finish = __new_start;
+    _STLP_TRY {
+      __new_pos = uninitialized_copy(this->_M_start, __p, __new_start);
+      _Construct(__new_pos, __c);
+      __new_finish = __new_pos + 1;
+      __new_finish = uninitialized_copy(__p, this->_M_finish, __new_finish);
+      _M_construct_null(__new_finish);
+    }
+    _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish), 
+                  this->_M_end_of_storage.deallocate(__new_start,__len)));
+    _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+    this->_M_deallocate_block();
+    this->_M_start = __new_start;
+    this->_M_finish = __new_finish;
+    this->_M_end_of_storage._M_data = __new_start + __len;
+  }
+  return __new_pos;
+}
+
+template <class _CharT, class _Traits, class _Alloc> void basic_string<_CharT,_Traits,_Alloc>::insert(iterator __position,
+           size_t __n, _CharT __c)
+{
+  if (__n != 0) {
+    if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n + 1) {
+      const size_type __elems_after = this->_M_finish - __position;
+      pointer __old_finish = this->_M_finish;
+      if (__elems_after >= __n) {
+        uninitialized_copy((this->_M_finish - __n) + 1, this->_M_finish + 1,
+                           this->_M_finish + 1);
+        this->_M_finish += __n;
+        _Traits::move(__position + __n,
+                      __position, (__elems_after - __n) + 1);
+        _Traits::assign(__position, __n, __c);
+      }
+      else {
+        uninitialized_fill_n(this->_M_finish + 1, __n - __elems_after - 1, __c);
+        this->_M_finish += __n - __elems_after;
+        _STLP_TRY {
+          uninitialized_copy(__position, __old_finish + 1, this->_M_finish);
+          this->_M_finish += __elems_after;
+        }
+        _STLP_UNWIND((_STLP_STD::_Destroy(__old_finish + 1, this->_M_finish), 
+                      this->_M_finish = __old_finish));
+        _Traits::assign(__position, __elems_after + 1, __c);
+      }
+    }
+    else {
+      const size_type __old_size = size();        
+      const size_type __len = __old_size + (max)(__old_size, __n) + 1;
+      pointer __new_start = this->_M_end_of_storage.allocate(__len);
+      pointer __new_finish = __new_start;
+      _STLP_TRY {
+        __new_finish = uninitialized_copy(this->_M_start, __position, __new_start);
+        __new_finish = uninitialized_fill_n(__new_finish, __n, __c);
+        __new_finish = uninitialized_copy(__position, this->_M_finish,
+                                          __new_finish);
+        _M_construct_null(__new_finish);
+      }
+      _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+                    this->_M_end_of_storage.deallocate(__new_start,__len)));
+      _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+      this->_M_deallocate_block();
+      this->_M_start = __new_start;
+      this->_M_finish = __new_finish;
+      this->_M_end_of_storage._M_data = __new_start + __len;    
+    }
+  }
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+template <class _CharT, class _Traits, class _Alloc> void 
+basic_string<_CharT,_Traits,_Alloc>::insert(iterator __position,
+                                            const _CharT* __first, 
+                                            const _CharT* __last)
+{
+  if (__first != __last) {
+    const ptrdiff_t __n = __last - __first;
+    if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) {
+      const ptrdiff_t __elems_after = this->_M_finish - __position;
+      pointer __old_finish = this->_M_finish;
+      if (__elems_after >= __n) {
+        uninitialized_copy((this->_M_finish - __n) + 1, this->_M_finish + 1,
+                           this->_M_finish + 1);
+        this->_M_finish += __n;
+        _Traits::move(__position + __n,
+                      __position, (__elems_after - __n) + 1);
+        _M_copy(__first, __last, __position);
+      }
+      else {
+        const _CharT* __mid = __first;
+        advance(__mid, __elems_after + 1);
+        uninitialized_copy(__mid, __last, this->_M_finish + 1);
+        this->_M_finish += __n - __elems_after;
+        _STLP_TRY {
+          uninitialized_copy(__position, __old_finish + 1, this->_M_finish);
+          this->_M_finish += __elems_after;
+        }
+        _STLP_UNWIND((_STLP_STD::_Destroy(__old_finish + 1, this->_M_finish), 
+                      this->_M_finish = __old_finish));
+        _M_copy(__first, __mid, __position);
+      }
+    }
+    else {
+      size_type __old_size = size();        
+      size_type __len
+        = __old_size + (max)(__old_size, __STATIC_CAST(const size_type,__n)) + 1;
+      pointer __new_start = this->_M_end_of_storage.allocate(__len);
+      pointer __new_finish = __new_start;
+      _STLP_TRY {
+        __new_finish = uninitialized_copy(this->_M_start, __position, __new_start);
+        __new_finish = uninitialized_copy(__first, __last, __new_finish);
+        __new_finish
+          = uninitialized_copy(__position, this->_M_finish, __new_finish);
+        _M_construct_null(__new_finish);
+      }
+      _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+                    this->_M_end_of_storage.deallocate(__new_start,__len)));
+      _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+      this->_M_deallocate_block();
+      this->_M_start = __new_start;
+      this->_M_finish = __new_finish;
+      this->_M_end_of_storage._M_data = __new_start + __len; 
+    }
+  }
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc> ::replace(iterator __first, iterator __last, size_type __n, _CharT __c)
+{
+  size_type __len = (size_type)(__last - __first);
+  
+  if (__len >= __n) {
+    _Traits::assign(__first, __n, __c);
+    erase(__first + __n, __last);
+  }
+  else {
+    _Traits::assign(__first, __len, __c);
+    insert(__last, __n - __len, __c);
+  }
+  return *this;
+}
+
+#ifndef _STLP_MEMBER_TEMPLATES
+
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT,_Traits,_Alloc>& basic_string<_CharT,_Traits,_Alloc> ::replace(iterator __first, iterator __last,
+            const _CharT* __f, const _CharT* __l)
+{
+  const ptrdiff_t         __n = __l - __f;
+  const difference_type __len = __last - __first;
+  if (__len >= __n) {
+    _M_copy(__f, __l, __first);
+    erase(__first + __n, __last);
+  }
+  else {
+    const _CharT* __m = __f + __len;
+    _M_copy(__f, __m, __first);
+    insert(__last, __m, __l);
+  }
+  return *this;
+}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find(const _CharT* __s, size_type __pos, size_type __n) const 
+{
+  if (__pos + __n > size())
+    return npos;
+  else {
+    const const_pointer __result =
+      _STLP_STD::search((const _CharT*)this->_M_start + __pos, (const _CharT*)this->_M_finish, 
+			__s, __s + __n, _Eq_traits<_Traits>());
+    return __result != this->_M_finish ? __result - this->_M_start : npos;
+  }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find(_CharT __c, size_type __pos) const 
+{
+  if (__pos >= size())
+    return npos;
+  else {
+    const const_pointer __result =
+      _STLP_STD::find_if((const _CharT*)this->_M_start + __pos, (const _CharT*)this->_M_finish,
+			 _Eq_char_bound<_Traits>(__c));
+    return __result != this->_M_finish ? __result - this->_M_start : npos;
+  }
+}    
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::rfind(const _CharT* __s, size_type __pos, size_type __n) const 
+{
+  const size_t __len = size();
+
+  if (__n > __len)
+    return npos;
+  else if (__n == 0)
+    return (min) (__len, __pos);
+  else {
+    const_pointer __last = this->_M_start + (min) (__len - __n, __pos) + __n;
+    const_pointer __result = _STLP_STD::find_end((const_pointer)this->_M_start, __last,
+						 __s, __s + __n,
+						 _Eq_traits<_Traits>());
+    return __result != __last ? __result - this->_M_start : npos;
+  }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::rfind(_CharT __c, size_type __pos) const 
+{
+  const size_type __len = size();
+
+  if (__len < 1)
+    return npos;
+  else {
+    const const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+    const_reverse_iterator __rresult =
+      _STLP_STD::find_if(const_reverse_iterator(__last), rend(),
+              _Eq_char_bound<_Traits>(__c));
+    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+  }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_first_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+  if (__pos >= size())
+    return npos;
+  else {
+    const_iterator __result = __find_first_of(begin() + __pos, end(),
+                                              __s, __s + __n,
+                                              _Eq_traits<_Traits>());
+    return __result != end() ? __result - begin() : npos;
+  }
+}
+
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_last_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+  const size_type __len = size();
+
+  if (__len < 1)
+    return npos;
+  else {
+    const const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+    const const_reverse_iterator __rresult =
+      __find_first_of(const_reverse_iterator(__last), rend(),
+                      __s, __s + __n,
+                      _Eq_traits<_Traits>());
+    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+  }
+}
+
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(const _CharT* __s, size_type __pos, size_type __n) const
+{
+  typedef typename _Traits::char_type _CharType;
+  if (__pos > size())
+    return npos;
+  else {
+    const_pointer __result = _STLP_STD::find_if((const _CharT*)this->_M_start + __pos, 
+				      (const _CharT*)this->_M_finish,
+                                _Not_within_traits<_Traits>((const _CharType*)__s, 
+							    (const _CharType*)__s + __n));
+    return __result != this->_M_finish ? __result - this->_M_start : npos;
+  }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_first_not_of(_CharT __c, size_type __pos) const
+{
+  if (__pos > size())
+    return npos;
+  else {
+    const_pointer __result = _STLP_STD::find_if((const _CharT*)this->_M_start + __pos, (const _CharT*)this->_M_finish,
+						_Neq_char_bound<_Traits>(__c));
+    return __result != this->_M_finish ? __result - this->_M_start : npos;
+  }
+}    
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT,_Traits,_Alloc> ::find_last_not_of(const _CharT* __s, size_type __pos, size_type __n) const 
+{
+  typedef typename _Traits::char_type _CharType;
+  const size_type __len = size();
+
+  if (__len < 1)
+    return npos;
+  else {
+    const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+    const_reverse_iterator __rlast = const_reverse_iterator(__last);
+    const_reverse_iterator __rresult =
+      _STLP_STD::find_if(__rlast, rend(),
+			 _Not_within_traits<_Traits>((const _CharType*)__s, 
+						     (const _CharType*)__s + __n));
+    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+  }
+}
+
+template <class _CharT, class _Traits, class _Alloc> __size_type__
+basic_string<_CharT, _Traits, _Alloc> ::find_last_not_of(_CharT __c, size_type __pos) const 
+{
+  const size_type __len = size();
+
+  if (__len < 1)
+    return npos;
+  else {
+    const_iterator __last = begin() + (min) (__len - 1, __pos) + 1;
+    const_reverse_iterator __rlast = const_reverse_iterator(__last);
+    const_reverse_iterator __rresult =
+      _STLP_STD::find_if(__rlast, rend(),
+			 _Neq_char_bound<_Traits>(__c));
+    return __rresult != rend() ? (__rresult.base() - 1) - begin() : npos;
+  }
+}
+
+template <class _CharT, class _Traits, class _Alloc> void _STLP_CALL _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s,
+                    _CharT* __buf,
+                    size_t __n)
+{
+  if (__n > 0) {
+    __n = (min) (__n - 1, __s.size());
+    _STLP_STD::copy(__s.begin(), __s.begin() + __n, __buf);
+    __buf[__n] = _CharT();
+  }
+}
+_STLP_END_NAMESPACE
+
+// _string_fwd has to see clean basic_string
+# undef basic_string
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_string_fwd.c> 
+# endif
+
+# ifdef _STLP_DEBUG
+#  define basic_string _Nondebug_string
+# endif
+
+# include <stl/_range_errors.h>  
+_STLP_BEGIN_NAMESPACE
+
+// _String_base methods
+template <class _Tp, class _Alloc> void _String_base<_Tp,_Alloc>::_M_throw_length_error() const {
+    __stl_throw_length_error("basic_string");
+}
+
+template <class _Tp, class _Alloc> void _String_base<_Tp, _Alloc>::_M_throw_out_of_range() const {
+    __stl_throw_out_of_range("basic_string");
+}
+
+template <class _Tp, class _Alloc> void _String_base<_Tp, _Alloc>::_M_allocate_block(size_t __n) {  
+  if ((__n <= (max_size()+1)) && (__n>0)){ 
+    _M_start  = _M_end_of_storage.allocate(__n); 
+    _M_finish = _M_start; 
+    _M_end_of_storage._M_data = _M_start + __n; 
+  } 
+    else 
+      _M_throw_length_error(); 
+} 
+ 
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>::basic_string()
+  : _String_base<_CharT,_Alloc>(allocator_type()) {  
+  this->_M_start = this->_M_end_of_storage.allocate(8); 
+  this->_M_finish = this->_M_start; 
+  this->_M_end_of_storage._M_data = this->_M_start + 8; 
+  _M_terminate_string();  
+} 
+
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>::basic_string(const _CharT* __s, 
+						    const allocator_type& __a) 
+  : _String_base<_CharT,_Alloc>(__a)  
+{ 
+  _STLP_FIX_LITERAL_BUG(__s) 
+    _M_range_initialize(__s, __s + traits_type::length(__s));  
+} 
+
+
+template <class _CharT, class _Traits, class _Alloc> basic_string<_CharT, _Traits, _Alloc>::basic_string(const basic_string<_CharT, _Traits, _Alloc> & __s)  
+  : _String_base<_CharT,_Alloc>(__s.get_allocator())  
+{  
+  _M_range_initialize(__s._M_start, __s._M_finish);  
+} 
+  
+# if defined ( __SUNPRO_CC) && ! defined(_STLP_STATIC_CONST_INIT_BUG)
+template <class _CharT, class _Traits, class _Alloc> const size_t basic_string<_CharT, _Traits, _Alloc>::npos;
+# endif
+
+_STLP_END_NAMESPACE
+
+# undef basic_string
+# undef __size_type__
+# undef size_type
+# undef iterator
+# endif /* NATIVE */
+
+#endif /*  _STLP_STRING_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string.h b/src/STLport/stl/_string.h
new file mode 100644
index 0000000..f00dbe7
--- /dev/null
+++ b/src/STLport/stl/_string.h
@@ -0,0 +1,1501 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_H
+#define _STLP_STRING_H
+
+#ifndef _STLP_MEMORY
+# include <memory> 
+#endif
+
+# ifndef _STLP_CCTYPE
+#  include <cctype> 
+# endif
+
+#ifndef _STLP_STRING_FWD_H
+#  include <stl/_string_fwd.h> 
+#endif
+
+#ifndef _STLP_INTERNAL_FUNCTION_BASE_H
+# include <stl/_function.h> 
+#endif
+
+# include <stl/_ctraits_fns.h>  
+#ifndef _STLP_INTERNAL_ALGOBASE_H
+# include <stl/_algobase.h> 
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_H
+# include <stl/_iterator.h> 
+#endif
+
+#if defined( __MWERKS__ ) && ! defined (_STLP_USE_OWN_NAMESPACE)
+
+// MSL implementation classes expect to see the definition of streampos
+// when this header is included. We expect this to be fixed in later MSL
+// implementations
+# if !defined( __MSL_CPP__ ) || __MSL_CPP__ < 0x4105
+#  include <stl/msl_string.h> 
+# endif
+
+#endif // __MWERKS__
+
+// Standard C++ string class.  This class has performance
+// characteristics very much like vector<>, meaning, for example, that
+// it does not perform reference-count or copy-on-write, and that
+// concatenation of two strings is an O(N) operation. 
+
+// There are three reasons why basic_string is not identical to
+// vector.  First, basic_string always stores a null character at the
+// end; this makes it possible for c_str to be a fast operation.
+// Second, the C++ standard requires basic_string to copy elements
+// using char_traits<>::assign, char_traits<>::copy, and
+// char_traits<>::move.  This means that all of vector<>'s low-level
+// operations must be rewritten.  Third, basic_string<> has a lot of
+// extra functions in its interface that are convenient but, strictly
+// speaking, redundant.
+
+// Additionally, the C++ standard imposes a major restriction: according
+// to the standard, the character type _CharT must be a POD type.  This
+// implementation weakens that restriction, and allows _CharT to be a
+// a user-defined non-POD type.  However, _CharT must still have a
+// default constructor.
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG
+#  define basic_string _Nondebug_string
+# endif
+
+// A helper class to use a char_traits as a function object.
+
+template <class _Traits> struct _Not_within_traits
+  : public unary_function<typename _Traits::char_type, bool> {
+  typedef typename _Traits::char_type _CharT;
+  const _CharT* _M_first;
+  const _CharT* _M_last;
+
+  _Not_within_traits(const typename _Traits::char_type* __f, 
+		     const typename _Traits::char_type* __l) 
+    : _M_first(__f), _M_last(__l) {}
+
+  bool operator()(const typename _Traits::char_type& __x) const {
+    return find_if(_M_first, _M_last, 
+                   _Eq_char_bound<_Traits>(__x)) == _M_last;
+  }
+};
+
+// ------------------------------------------------------------
+// Class _String_base.  
+
+// _String_base is a helper class that makes it it easier to write an
+// exception-safe version of basic_string.  The constructor allocates,
+// but does not initialize, a block of memory.  The destructor
+// deallocates, but does not destroy elements within, a block of
+// memory.  The destructor assumes that _M_start either is null, or else
+// points to a block of memory that was allocated using _String_base's 
+// allocator and whose size is _M_end_of_storage._M_data - _M_start.
+
+template <class _Tp, class _Alloc> class _String_base {
+public:
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
+  _Tp*    _M_start;
+  _Tp*    _M_finish;
+  _STLP_alloc_proxy<_Tp*, _Tp, allocator_type> _M_end_of_storage;
+                                // Precondition: 0 < __n <= max_size().
+  void _M_allocate_block(size_t);
+  void _M_deallocate_block() 
+    { _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start); }
+  
+  size_t max_size() const { return (size_t(-1) / sizeof(_Tp)) - 1; }
+
+  _String_base(const allocator_type& __a)
+    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, (_Tp*)0) {}
+  
+  _String_base(const allocator_type& __a, size_t __n)
+    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, (_Tp*)0)
+    { _M_allocate_block(__n); }
+
+  ~_String_base() { _M_deallocate_block(); }
+
+  void _M_throw_length_error() const;
+  void _M_throw_out_of_range() const;
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS _String_base<char, allocator<char> >;
+#  if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS _String_base<wchar_t, allocator<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// ------------------------------------------------------------
+// Class basic_string.  
+
+// Class invariants:
+// (1) [start, finish) is a valid range.
+// (2) Each iterator in [start, finish) points to a valid object
+//     of type value_type.
+// (3) *finish is a valid object of type value_type; in particular,
+//     it is value_type().
+// (4) [finish + 1, end_of_storage) is a valid range.
+// (5) Each iterator in [finish + 1, end_of_storage) points to 
+//     unininitialized memory.
+
+// Note one important consequence: a string of length n must manage
+// a block of memory whose size is at least n + 1.  
+
+struct _String_reserve_t {};
+
+template <class _CharT, class _Traits, class _Alloc> class basic_string : protected _String_base<_CharT,_Alloc> {
+private:                        // Protected members inherited from base.
+  typedef _String_base<_CharT,_Alloc> _Base;
+  typedef basic_string<_CharT, _Traits, _Alloc> _Self;
+  // fbp : used to optimize char/wchar_t cases, and to simplify
+  // _STLP_DEFAULT_CONSTRUCTOR_BUG problem workaround
+  typedef typename _Is_integer<_CharT>::_Integral _Char_Is_Integral;
+public:
+  typedef _CharT value_type;
+  typedef _Traits traits_type;
+
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef random_access_iterator_tag _Iterator_category;
+
+  typedef const value_type*                const_iterator;
+  typedef value_type*                      iterator;
+
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+# if defined(_STLP_STATIC_CONST_INIT_BUG)
+  enum { npos = -1 };
+# elif __GNUC__ == 2 && __GNUC_MINOR__ == 96
+  // inline initializer conflicts with 'extern template' 
+  static const size_t npos ;
+# else
+  static const size_t npos = ~(size_t)0;
+# endif
+
+  typedef _String_reserve_t _Reserve_t;
+# if defined (_STLP_USE_NATIVE_STRING) && ! defined (_STLP_DEBUG)
+#  if (defined(__IBMCPP__) && (500 <= __IBMCPP__) && (__IBMCPP__ < 600) )
+   // this typedef is being used for conversions
+   typedef typename _STLP_VENDOR_STD::basic_string<_CharT,_Traits, 
+    typename _STLP_VENDOR_STD::allocator<_CharT> > __std_string;
+#  else
+   // this typedef is being used for conversions
+   typedef _STLP_VENDOR_STD::basic_string<_CharT,_Traits, 
+    _STLP_VENDOR_STD::allocator<_CharT> > __std_string;
+#  endif
+# endif
+  
+public:                         // Constructor, destructor, assignment.
+  typedef typename _String_base<_CharT,_Alloc>::allocator_type allocator_type;
+
+  allocator_type get_allocator() const {
+    return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _CharT);
+  }
+
+  basic_string();
+
+  explicit basic_string(const allocator_type& __a)
+    : _String_base<_CharT,_Alloc>(__a, 8) { 
+    _M_terminate_string(); 
+  }
+
+  basic_string(_Reserve_t, size_t __n,
+               const allocator_type& __a = allocator_type())
+    : _String_base<_CharT,_Alloc>(__a, __n + 1) { 
+    _M_terminate_string(); 
+  }
+
+  basic_string(const basic_string<_CharT, _Traits, _Alloc>&);
+
+  basic_string(const _Self& __s, size_type __pos, size_type __n = npos,
+               const allocator_type& __a = allocator_type()) 
+    : _String_base<_CharT,_Alloc>(__a) {
+    if (__pos > __s.size())
+      this->_M_throw_out_of_range();
+    else
+      _M_range_initialize(__s._M_start + __pos,
+                          __s._M_start + __pos + (min) (__n, __s.size() - __pos));
+  }
+
+  basic_string(const _CharT* __s, size_type __n,
+               const allocator_type& __a = allocator_type()) 
+    : _String_base<_CharT,_Alloc>(__a) 
+    { 
+      _STLP_FIX_LITERAL_BUG(__s)
+      _M_range_initialize(__s, __s + __n); 
+    }
+
+  basic_string(const _CharT* __s,
+               const allocator_type& __a = allocator_type());
+
+  basic_string(size_type __n, _CharT __c,
+               const allocator_type& __a = allocator_type())
+    : _String_base<_CharT,_Alloc>(__a, __n + 1)
+  {
+    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __c);
+    _M_terminate_string();
+  }
+
+  // Check to see if _InputIterator is an integer type.  If so, then
+  // it can't be an iterator.
+#if defined (_STLP_MEMBER_TEMPLATES) && !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))		//*ty 04/30/2001 - mpw compilers choke on this ctor
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator> basic_string(_InputIterator __f, _InputIterator __l)
+    : _String_base<_CharT,_Alloc>(allocator_type())
+  {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_dispatch(__f, __l, _Integral());
+  }
+# endif
+  template <class _InputIterator> basic_string(_InputIterator __f, _InputIterator __l,
+               const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _String_base<_CharT,_Alloc>(__a)
+  {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_dispatch(__f, __l, _Integral());
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  basic_string(const _CharT* __f, const _CharT* __l,
+               const allocator_type& __a = allocator_type())
+    : _String_base<_CharT,_Alloc>(__a)
+  {
+    _STLP_FIX_LITERAL_BUG(__f)  _STLP_FIX_LITERAL_BUG(__l)
+    _M_range_initialize(__f, __l);
+  }
+
+#endif
+
+# if defined (_STLP_USE_NATIVE_STRING) && ! defined (_STLP_DEBUG)
+  // these conversion operations still needed for
+  // strstream, etc.
+  basic_string (const __std_string& __x): _String_base<_CharT,_Alloc>(allocator_type())
+    {
+      const _CharT* __s = __x.data();
+      _M_range_initialize(__s, __s + __x.size()); 
+    }
+  
+  operator __std_string() const { return __std_string(this->data(), this->size()); }
+# endif
+
+  ~basic_string() { _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1); }
+    
+  _Self& operator=(const _Self& __s) {
+    if (&__s != this) 
+      assign(__s._M_start, __s._M_finish);
+    return *this;
+  }
+
+  _Self& operator=(const _CharT* __s) { 
+    _STLP_FIX_LITERAL_BUG(__s)
+    return assign(__s, __s + traits_type::length(__s)); 
+  }
+
+  _Self& operator=(_CharT __c)
+    { return assign(__STATIC_CAST(size_type,1), __c); }
+
+  static _CharT _STLP_CALL _M_null() {
+    return _STLP_DEFAULT_CONSTRUCTED(_CharT);
+  }
+
+private:                        // Helper functions used by constructors
+                                // and elsewhere.
+  // fbp : simplify integer types (char, wchar)
+  void _M_construct_null_aux(_CharT* __p, const __false_type&) {
+    _Construct(__p);
+  }
+  void _M_construct_null_aux(_CharT* __p, const __true_type&) {
+    *__p = 0;
+  }
+
+  void _M_construct_null(_CharT* __p) {
+    _M_construct_null_aux(__p, _Char_Is_Integral());
+  }
+
+private:                        
+  // Helper functions used by constructors.  It is a severe error for
+  // any of them to be called anywhere except from within constructors.
+
+  void _M_terminate_string_aux(const __false_type&) {
+    _STLP_TRY {
+      _M_construct_null(this->_M_finish);
+    }
+    _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, this->_M_finish));
+  }
+
+  void _M_terminate_string_aux(const __true_type&) {
+    *(this->_M_finish)=0;
+  }
+
+  void _M_terminate_string() {
+    _M_terminate_string_aux(_Char_Is_Integral());
+  }
+
+#ifndef _STLP_MEMBER_TEMPLATES
+  bool _M_inside(const _CharT* __s ) const {
+    return (__s >= this->_M_start) && (__s < this->_M_finish);
+  }
+#else
+  template <class _InputIter>
+  bool _M_inside(_InputIter __i) const {
+    const _CharT* __s = __STATIC_CAST(const _CharT*, &(*__i));
+    return (__s >= this->_M_start) && (__s < this->_M_finish);
+  }
+#endif /*_STLP_MEMBER_TEMPLATES*/
+
+#ifdef _STLP_MEMBER_TEMPLATES
+    
+  template <class _InputIter> void _M_range_initialize(_InputIter __f, _InputIter __l,
+                           const input_iterator_tag &) {
+    this->_M_allocate_block(8);
+    _M_construct_null(this->_M_finish);
+    _STLP_TRY {
+      append(__f, __l);
+    }
+    _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1));
+  }
+
+  template <class _ForwardIter> void _M_range_initialize(_ForwardIter __f, _ForwardIter __l, 
+                           const forward_iterator_tag &) {
+    difference_type __n = distance(__f, __l);
+    this->_M_allocate_block(__n + 1);
+    this->_M_finish = uninitialized_copy(__f, __l, this->_M_start);
+    _M_terminate_string();
+  }
+
+  template <class _InputIter> void _M_range_initialize(_InputIter __f, _InputIter __l) {
+    _M_range_initialize(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
+  }
+
+  template <class _Integer> void _M_initialize_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+    this->_M_allocate_block(__n + 1);
+    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __x);
+    _M_terminate_string();
+  }
+
+  template <class _InputIter> void _M_initialize_dispatch(_InputIter __f, _InputIter __l, const __false_type&) {
+     _M_range_initialize(__f, __l);
+  }
+    
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void _M_range_initialize(const _CharT* __f, const _CharT* __l) {
+    ptrdiff_t __n = __l - __f;
+    this->_M_allocate_block(__n + 1);
+    this->_M_finish = uninitialized_copy(__f, __l, this->_M_start);
+    _M_terminate_string();
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // Iterators.
+  iterator begin()             { return this->_M_start; }
+  iterator end()               { return this->_M_finish; }
+  const_iterator begin() const { return this->_M_start; }
+  const_iterator end()   const { return this->_M_finish; }  
+
+  reverse_iterator rbegin()             
+    { return reverse_iterator(this->_M_finish); }
+  reverse_iterator rend()               
+    { return reverse_iterator(this->_M_start); }
+  const_reverse_iterator rbegin() const 
+    { return const_reverse_iterator(this->_M_finish); }
+  const_reverse_iterator rend()   const 
+    { return const_reverse_iterator(this->_M_start); }
+
+public:                         // Size, capacity, etc.
+  size_type size() const { return this->_M_finish - this->_M_start; }
+  size_type length() const { return size(); }
+
+  size_t max_size() const { return _Base::max_size(); }
+
+
+  void resize(size_type __n, _CharT __c) {
+    if (__n <= size())
+      erase(begin() + __n, end());
+    else
+      append(__n - size(), __c);
+  }
+  void resize(size_type __n) { resize(__n, _M_null()); }
+
+  void reserve(size_type = 0);
+
+  size_type capacity() const { return (this->_M_end_of_storage._M_data - this->_M_start) - 1; }
+
+  void clear() {
+    if (!empty()) {
+      _Traits::assign(*(this->_M_start), _M_null());
+      _STLP_STD::_Destroy(this->_M_start+1, this->_M_finish+1);
+      this->_M_finish = this->_M_start;
+    }
+  } 
+
+  bool empty() const { return this->_M_start == this->_M_finish; }    
+
+public:                         // Element access.
+
+  const_reference operator[](size_type __n) const
+    { return *(this->_M_start + __n); }
+  reference operator[](size_type __n)
+    { return *(this->_M_start + __n); }
+
+  const_reference at(size_type __n) const {
+    if (__n >= size())
+      this->_M_throw_out_of_range();
+    return *(this->_M_start + __n);
+  }
+
+  reference at(size_type __n) {
+    if (__n >= size())
+      this->_M_throw_out_of_range();
+    return *(this->_M_start + __n);
+  }
+
+public:                         // Append, operator+=, push_back.
+
+  _Self& operator+=(const _Self& __s) { return append(__s); }
+  _Self& operator+=(const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) return append(__s); }
+  _Self& operator+=(_CharT __c) { push_back(__c); return *this; }
+
+  _Self& append(const _Self& __s) 
+    { return append(__s._M_start, __s._M_finish); }
+
+  _Self& append(const _Self& __s,
+                       size_type __pos, size_type __n)
+  {
+    if (__pos > __s.size())
+      this->_M_throw_out_of_range();
+    return append(__s._M_start + __pos,
+                  __s._M_start + __pos + (min) (__n, __s.size() - __pos));
+  }
+
+  _Self& append(const _CharT* __s, size_type __n) 
+    { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s+__n); }
+  _Self& append(const _CharT* __s) 
+    { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s + traits_type::length(__s)); }
+  _Self& append(size_type __n, _CharT __c);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // Check to see if _InputIterator is an integer type.  If so, then
+  // it can't be an iterator.
+  template <class _InputIter> _Self& append(_InputIter __first, _InputIter __last) {
+    typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+    return _M_append_dispatch(__first, __last, _Integral());
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& append(const _CharT* __first, const _CharT* __last);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void push_back(_CharT __c) {
+    if (this->_M_finish + 1 == this->_M_end_of_storage._M_data)
+      reserve(size() + (max)(size(), __STATIC_CAST(size_type,1)));
+    _M_construct_null(this->_M_finish + 1);
+    _Traits::assign(*(this->_M_finish), __c);
+    ++this->_M_finish;
+  }
+
+  void pop_back() {
+    _Traits::assign(*(this->_M_finish - 1), _M_null());
+    _STLP_STD::_Destroy(this->_M_finish);
+    --this->_M_finish;
+  }
+
+private:                        // Helper functions for append.
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIter> _Self& append(_InputIter __first, _InputIter __last, const input_iterator_tag &)
+  {
+	  for ( ; __first != __last ; ++__first)
+	    push_back(*__first);
+	  return *this;
+	}
+
+  template <class _ForwardIter> _Self& append(_ForwardIter __first, _ForwardIter __last, 
+                       const forward_iterator_tag &)  {
+    if (__first != __last) {
+	    const size_type __old_size = size();
+	    difference_type __n = distance(__first, __last);
+	    if (__STATIC_CAST(size_type,__n) > max_size() || __old_size > max_size() - __STATIC_CAST(size_type,__n))
+	      this->_M_throw_length_error();
+	    if (__old_size + __n > capacity()) {
+	      const size_type __len = __old_size +
+	                            (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1;
+	      pointer __new_start = this->_M_end_of_storage.allocate(__len);
+	      pointer __new_finish = __new_start;
+	      _STLP_TRY {
+	        __new_finish = uninitialized_copy(this->_M_start, this->_M_finish, __new_start);
+	        __new_finish = uninitialized_copy(__first, __last, __new_finish);
+	        _M_construct_null(__new_finish);
+	      }
+	      _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+	                    this->_M_end_of_storage.deallocate(__new_start,__len)));
+	      _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+	      this->_M_deallocate_block();
+	      this->_M_start = __new_start;
+	      this->_M_finish = __new_finish;
+	      this->_M_end_of_storage._M_data = __new_start + __len; 
+	    }
+	    else {
+	      _ForwardIter __f1 = __first;
+	      ++__f1;
+	      uninitialized_copy(__f1, __last, this->_M_finish + 1);
+	      _STLP_TRY {
+	        _M_construct_null(this->_M_finish + __n);
+	      }
+	      _STLP_UNWIND(_STLP_STD::_Destroy(this->_M_finish + 1, this->_M_finish + __n));
+	      _Traits::assign(*end(), *__first);
+	      this->_M_finish += __n;
+	    }
+	  }
+	  return *this;  
+	}
+
+  template <class _Integer> _Self& _M_append_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+    return append((size_type) __n, (_CharT) __x);
+  }
+
+  template <class _InputIter> _Self& _M_append_dispatch(_InputIter __f, _InputIter __l,
+                                   const __false_type&) {
+    return append(__f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // Assign
+  
+  _Self& assign(const _Self& __s) 
+    { return assign(__s._M_start, __s._M_finish); }
+
+  _Self& assign(const _Self& __s, 
+                       size_type __pos, size_type __n) {
+    if (__pos > __s.size())
+      this->_M_throw_out_of_range();
+    return assign(__s._M_start + __pos, 
+                  __s._M_start + __pos + (min) (__n, __s.size() - __pos));
+  }
+
+  _Self& assign(const _CharT* __s, size_type __n)
+    { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + __n); }
+
+  _Self& assign(const _CharT* __s)
+    { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + _Traits::length(__s)); }
+
+  _Self& assign(size_type __n, _CharT __c);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+private:                        // Helper functions for assign.
+
+  template <class _Integer> 
+  _Self& _M_assign_dispatch(_Integer __n, _Integer __x, const __true_type&) {
+    return assign((size_type) __n, (_CharT) __x);
+  }
+
+  template <class _InputIter> 
+  _Self& _M_assign_dispatch(_InputIter __f, _InputIter __l,
+			    const __false_type&)  {
+    pointer __cur = this->_M_start;
+    while (__f != __l && __cur != this->_M_finish) {
+      _Traits::assign(*__cur, *__f);
+      ++__f;
+      ++__cur;
+    }
+    if (__f == __l)
+      erase(__cur, end());
+    else
+      append(__f, __l);
+    return *this;
+  }
+  
+public:
+  // Check to see if _InputIterator is an integer type.  If so, then
+  // it can't be an iterator.
+  template <class _InputIter> _Self& assign(_InputIter __first, _InputIter __last) {
+    typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+    return _M_assign_dispatch(__first, __last, _Integral());
+  }
+#endif  /* _STLP_MEMBER_TEMPLATES */
+
+  // if member templates are on, this works as specialization 
+  _Self& assign(const _CharT* __f, const _CharT* __l)
+  {
+    ptrdiff_t __n = __l - __f;
+    if (__STATIC_CAST(size_type,__n) <= size()) {
+      _Traits::copy(this->_M_start, __f, __n);
+      erase(begin() + __n, end());
+    }
+    else {
+      _Traits::copy(this->_M_start, __f, size());
+      append(__f + size(), __l);
+    }
+    return *this;
+  }
+  
+public:                         // Insert
+
+  _Self& insert(size_type __pos, const _Self& __s) {
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    if (size() > max_size() - __s.size())
+      this->_M_throw_length_error();
+    insert(begin() + __pos, __s._M_start, __s._M_finish);
+    return *this;
+  }
+
+  _Self& insert(size_type __pos, const _Self& __s,
+                       size_type __beg, size_type __n) {
+    if (__pos > size() || __beg > __s.size())
+      this->_M_throw_out_of_range();
+    size_type __len = (min) (__n, __s.size() - __beg);
+    if (size() > max_size() - __len)
+      this->_M_throw_length_error();
+    insert(begin() + __pos,
+           __s._M_start + __beg, __s._M_start + __beg + __len);
+    return *this;
+  }
+
+  _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    if (size() > max_size() - __n)
+      this->_M_throw_length_error();
+    insert(begin() + __pos, __s, __s + __n);
+    return *this;
+  }
+
+  _Self& insert(size_type __pos, const _CharT* __s) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    size_type __len = _Traits::length(__s);
+    if (size() > max_size() - __len)
+      this->_M_throw_length_error();
+    insert(this->_M_start + __pos, __s, __s + __len);
+    return *this;
+  }
+    
+  _Self& insert(size_type __pos, size_type __n, _CharT __c) {
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    if (size() > max_size() - __n)
+      this->_M_throw_length_error();
+    insert(begin() + __pos, __n, __c);
+    return *this;
+  }
+
+  iterator insert(iterator __p, _CharT __c) {
+    _STLP_FIX_LITERAL_BUG(__p)
+    if (__p == end()) {
+      push_back(__c);
+      return this->_M_finish - 1;
+    }
+    else
+      return _M_insert_aux(__p, __c);
+  }
+
+  void insert(iterator __p, size_t __n, _CharT __c);
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // Check to see if _InputIterator is an integer type.  If so, then
+  // it can't be an iterator.
+  template <class _InputIter> void insert(iterator __p, _InputIter __first, _InputIter __last) {
+    typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+    _M_insert_dispatch(__p, __first, __last, _Integral());
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void insert(iterator __p, const _CharT* __first, const _CharT* __last);
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+private:                        // Helper functions for insert.
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIter> void insert(iterator __p, _InputIter __first, _InputIter __last,
+	      const input_iterator_tag &)
+  {
+	  for ( ; __first != __last; ++__first) {
+	    __p = insert(__p, *__first);
+	    ++__p;
+	  }
+	}
+
+  template <class _ForwardIter> 
+  void insert(iterator __position, _ForwardIter __first, _ForwardIter __last, 
+	      const forward_iterator_tag &)  {
+    if (__first != __last) {
+      difference_type __n = distance(__first, __last);
+      if (this->_M_end_of_storage._M_data - this->_M_finish >= __n + 1) {
+	const difference_type __elems_after = this->_M_finish - __position;
+	pointer __old_finish = this->_M_finish;
+	if (__elems_after >= __n) {
+	  uninitialized_copy((this->_M_finish - __n) + 1, this->_M_finish + 1,
+			     this->_M_finish + 1);
+	  this->_M_finish += __n;
+	  _Traits::move(__position + __n,
+			__position, (__elems_after - __n) + 1);
+	  _M_move(__first, __last, __position);
+	      }
+	else {
+	  _ForwardIter __mid = __first;
+	  advance(__mid, __elems_after + 1);
+	  uninitialized_copy(__mid, __last, this->_M_finish + 1);
+	  this->_M_finish += __n - __elems_after;
+	        _STLP_TRY {
+	          uninitialized_copy(__position, __old_finish + 1, this->_M_finish);
+	          this->_M_finish += __elems_after;
+	        }
+	        _STLP_UNWIND((_STLP_STD::_Destroy(__old_finish + 1, this->_M_finish), 
+	                      this->_M_finish = __old_finish));
+	        _M_move(__first, __mid, __position);
+	}
+      }
+      else {
+	const size_type __old_size = size();        
+	const size_type __len
+	  = __old_size + (max)(__old_size, __STATIC_CAST(size_type,__n)) + 1;
+	      pointer __new_start = this->_M_end_of_storage.allocate(__len);
+	      pointer __new_finish = __new_start;
+	      _STLP_TRY {
+	        __new_finish = uninitialized_copy(this->_M_start, __position, __new_start);
+	        __new_finish = uninitialized_copy(__first, __last, __new_finish);
+	        __new_finish
+	          = uninitialized_copy(__position, this->_M_finish, __new_finish);
+	        _M_construct_null(__new_finish);
+	      }
+	      _STLP_UNWIND((_STLP_STD::_Destroy(__new_start,__new_finish),
+	                    this->_M_end_of_storage.deallocate(__new_start,__len)));
+	      _STLP_STD::_Destroy(this->_M_start, this->_M_finish + 1);
+	      this->_M_deallocate_block();
+	      this->_M_start = __new_start;
+	      this->_M_finish = __new_finish;
+	      this->_M_end_of_storage._M_data = __new_start + __len; 
+	    }
+    }
+  }
+
+  template <class _Integer> void _M_insert_dispatch(iterator __p, _Integer __n, _Integer __x,
+                          const __true_type&) {
+    insert(__p, (size_type) __n, (_CharT) __x);
+  }
+
+  template <class _InputIter> void _M_insert_dispatch(iterator __p, _InputIter __first, _InputIter __last,
+                          const __false_type&) {
+    insert(__p, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+  }
+
+  template <class _InputIterator> void 
+  _M_copy(_InputIterator __first, _InputIterator __last, pointer __result) {
+    for ( ; __first != __last; ++__first, ++__result)
+      _Traits::assign(*__result, *__first);
+  }
+
+  template <class _InputIterator>
+  void _M_move(_InputIterator __first, _InputIterator __last, pointer __result) {
+    //call _M_copy as being here means that __result is not within [__first, __last)
+    for ( ; __first != __last; ++__first, ++__result)
+      _Traits::assign(*__result, *__first);
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  pointer _M_insert_aux(pointer, _CharT);
+
+  void 
+  _M_copy(const _CharT* __first, const _CharT* __last, _CharT* __result) {
+    _Traits::copy(__result, __first, __last - __first);
+  }
+  void _M_move(const _CharT* __first, const _CharT* __last, _CharT* __result) {
+    _Traits::move(__result, __first, __last - __first);
+  }
+
+public:                         // Erase.
+
+  _Self& erase(size_type __pos = 0, size_type __n = npos) {
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    erase(begin() + __pos, begin() + __pos + (min) (__n, size() - __pos));
+    return *this;
+  }  
+
+  iterator erase(iterator __position) {
+                                // The move includes the terminating _CharT().
+    _Traits::move(__position, __position + 1, this->_M_finish - __position);
+    _STLP_STD::_Destroy(this->_M_finish);
+    --this->_M_finish;
+    return __position;
+  }
+
+  iterator erase(iterator __first, iterator __last) {
+    if (__first != __last) {
+                                // The move includes the terminating _CharT().
+      traits_type::move(__first, __last, (this->_M_finish - __last) + 1);
+      pointer __new_finish = this->_M_finish - (__last - __first);
+      _STLP_STD::_Destroy(__new_finish + 1, this->_M_finish + 1);
+      this->_M_finish = __new_finish;
+    }
+    return __first;
+  }
+
+public:                         // Replace.  (Conceptually equivalent
+                                // to erase followed by insert.)
+  _Self& replace(size_type __pos, size_type __n, 
+                        const _Self& __s) {
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    const size_type __len = (min) (__n, size() - __pos);
+    if (size() - __len >= max_size() - __s.size())
+      this->_M_throw_length_error();
+    return replace(begin() + __pos, begin() + __pos + __len, 
+                   __s._M_start, __s._M_finish);
+  }
+
+  _Self& replace(size_type __pos1, size_type __n1,
+                        const _Self& __s,
+                        size_type __pos2, size_type __n2) {
+    if (__pos1 > size() || __pos2 > __s.size())
+      this->_M_throw_out_of_range();
+    const size_type __len1 = (min) (__n1, size() - __pos1);
+    const size_type __len2 = (min) (__n2, __s.size() - __pos2);
+    if (size() - __len1 >= max_size() - __len2)
+      this->_M_throw_length_error();
+    return replace(begin() + __pos1, begin() + __pos1 + __len1,
+                   __s._M_start + __pos2, __s._M_start + __pos2 + __len2);
+  }
+
+  _Self& replace(size_type __pos, size_type __n1,
+                        const _CharT* __s, size_type __n2) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    const size_type __len = (min) (__n1, size() - __pos);
+    if (__n2 > max_size() || size() - __len >= max_size() - __n2)
+      this->_M_throw_length_error();
+    return replace(begin() + __pos, begin() + __pos + __len,
+                   __s, __s + __n2);
+  }
+
+  _Self& replace(size_type __pos, size_type __n1,
+                        const _CharT* __s) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    const size_type __len = (min) (__n1, size() - __pos);
+    const size_type __n2 = _Traits::length(__s);
+    if (__n2 > max_size() || size() - __len >= max_size() - __n2)
+      this->_M_throw_length_error();
+    return replace(begin() + __pos, begin() + __pos + __len,
+                   __s, __s + _Traits::length(__s));
+  }
+
+  _Self& replace(size_type __pos, size_type __n1,
+                        size_type __n2, _CharT __c) {
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    const size_type __len = (min) (__n1, size() - __pos);
+    if (__n2 > max_size() || size() - __len >= max_size() - __n2)
+      this->_M_throw_length_error();
+    return replace(begin() + __pos, begin() + __pos + __len, __n2, __c);
+  }
+
+  _Self& replace(iterator __first, iterator __last, 
+                        const _Self& __s) 
+    { return replace(__first, __last, __s._M_start, __s._M_finish); }
+
+  _Self& replace(iterator __first, iterator __last,
+                        const _CharT* __s, size_type __n) 
+    { _STLP_FIX_LITERAL_BUG(__s) return replace(__first, __last, __s, __s + __n); }
+
+  _Self& replace(iterator __first, iterator __last,
+                        const _CharT* __s) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    return replace(__first, __last, __s, __s + _Traits::length(__s));
+  }
+
+  _Self& replace(iterator __first, iterator __last, 
+                        size_type __n, _CharT __c);
+
+  // Check to see if _InputIterator is an integer type.  If so, then
+  // it can't be an iterator.
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIter> _Self& replace(iterator __first, iterator __last,
+                        _InputIter __f, _InputIter __l) {
+    typedef typename _Is_integer<_InputIter>::_Integral _Integral;
+    return _M_replace_dispatch(__first, __last, __f, __l,  _Integral());
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  _Self& replace(iterator __first, iterator __last,
+		 const _CharT* __f, const _CharT* __l);
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+private:                        // Helper functions for replace.
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _Integer> _Self& _M_replace_dispatch(iterator __first, iterator __last,
+                                    _Integer __n, _Integer __x,
+                                    const __true_type&) {
+    return replace(__first, __last, (size_type) __n, (_CharT) __x);
+  }
+
+  template <class _InputIter> _Self& _M_replace_dispatch(iterator __first, iterator __last,
+                                    _InputIter __f, _InputIter __l,
+                                    const __false_type&) {
+    return replace(__first, __last, __f, __l, _STLP_ITERATOR_CATEGORY(__f, _InputIter));
+  }
+
+  template <class _InputIter> _Self& replace(iterator __first, iterator __last,
+                        _InputIter __f, _InputIter __l, const input_iterator_tag &)  {
+	  for ( ; __first != __last && __f != __l; ++__first, ++__f)
+	    _Traits::assign(*__first, *__f);
+
+	  if (__f == __l)
+	    erase(__first, __last);
+	  else
+	    insert(__last, __f, __l);
+	  return *this;
+	}
+
+  template <class _InputIter>
+  _Self& replace(iterator __first, iterator __last,
+                 _InputIter __f, _InputIter __l, const random_access_iterator_tag &) {
+    //might be overlapping
+    if (_M_inside(__f)) {
+      difference_type __n = __l - __f;
+      const difference_type __len = __last - __first;
+      if (__len >= __n) {
+        _M_move(__f, __l, __first);
+        erase(__first + __n, __last);
+      }
+      else {
+        _InputIter __m = __f + __len;
+        if ((__l <= __first) || (__f >= __last)) {
+				  //no overlap:
+          _M_copy(__f, __m, __first);
+          insert(__last, __m, __l);
+        }
+        else {
+				  //we have to take care of reallocation:
+				  const difference_type __off_dest = __first - this->begin();
+				  const difference_type __off_src = __f - this->begin();
+				  insert(__last, __m, __l);
+				  _Traits::move(begin() + __off_dest, begin() + __off_src, __n);
+        }
+      }
+      return *this;
+    }
+	  else {
+		  return replace(__first, __last, __f, __l, forward_iterator_tag());
+	  }
+  }
+
+
+  template <class _ForwardIter> _Self& replace(iterator __first, iterator __last,
+                        _ForwardIter __f, _ForwardIter __l, 
+                        const forward_iterator_tag &)  {
+	  difference_type __n = distance(__f, __l);
+	  const difference_type __len = __last - __first;
+	  if (__len >= __n) {
+	    _M_copy(__f, __l, __first);
+	    erase(__first + __n, __last);
+	  }
+	  else {
+	    _ForwardIter __m = __f;
+	    advance(__m, __len);
+	    _M_copy(__f, __m, __first);
+	    insert(__last, __m, __l);
+	  }
+	  return *this;
+	}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // Other modifier member functions.
+
+  size_type copy(_CharT* __s, size_type __n, size_type __pos = 0) const {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    const size_type __len = (min) (__n, size() - __pos);
+    _Traits::copy(__s, this->_M_start + __pos, __len);
+    return __len;
+  }
+
+  void swap(_Self& __s) {
+    _STLP_STD::swap(this->_M_start, __s._M_start);
+    _STLP_STD::swap(this->_M_finish, __s._M_finish);
+    _STLP_STD::swap(this->_M_end_of_storage, __s._M_end_of_storage);
+  }
+
+public:                         // Conversion to C string.
+
+  const _CharT* c_str() const { return this->_M_start; }
+  const _CharT* data()  const { return this->_M_start; }
+
+public:                         // find.
+
+  size_type find(const _Self& __s, size_type __pos = 0) const 
+    { return find(__s._M_start, __pos, __s.size()); }
+
+  size_type find(const _CharT* __s, size_type __pos = 0) const 
+    { _STLP_FIX_LITERAL_BUG(__s) return find(__s, __pos, _Traits::length(__s)); }
+
+  size_type find(const _CharT* __s, size_type __pos, size_type __n) const;
+
+  // WIE: Versant schema compiler 5.2.2 ICE workaround
+  size_type find(_CharT __c) const
+    { return find(__c, 0) ; }
+  size_type find(_CharT __c, size_type __pos /* = 0 */) const;
+
+public:                         // rfind.
+
+  size_type rfind(const _Self& __s, size_type __pos = npos) const 
+    { return rfind(__s._M_start, __pos, __s.size()); }
+
+  size_type rfind(const _CharT* __s, size_type __pos = npos) const 
+    { _STLP_FIX_LITERAL_BUG(__s) return rfind(__s, __pos, _Traits::length(__s)); }
+
+  size_type rfind(const _CharT* __s, size_type __pos, size_type __n) const;
+  size_type rfind(_CharT __c, size_type __pos = npos) const;
+
+public:                         // find_first_of
+  
+  size_type find_first_of(const _Self& __s, size_type __pos = 0) const 
+    { return find_first_of(__s._M_start, __pos, __s.size()); }
+
+  size_type find_first_of(const _CharT* __s, size_type __pos = 0) const 
+    { _STLP_FIX_LITERAL_BUG(__s) return find_first_of(__s, __pos, _Traits::length(__s)); }
+
+  size_type find_first_of(const _CharT* __s, size_type __pos, 
+                          size_type __n) const;
+
+  size_type find_first_of(_CharT __c, size_type __pos = 0) const 
+    { return find(__c, __pos); }
+
+public:                         // find_last_of
+
+  size_type find_last_of(const _Self& __s,
+                         size_type __pos = npos) const
+    { return find_last_of(__s._M_start, __pos, __s.size()); }
+
+  size_type find_last_of(const _CharT* __s, size_type __pos = npos) const 
+    { _STLP_FIX_LITERAL_BUG(__s) return find_last_of(__s, __pos, _Traits::length(__s)); }
+
+  size_type find_last_of(const _CharT* __s, size_type __pos, 
+                         size_type __n) const;
+
+  size_type find_last_of(_CharT __c, size_type __pos = npos) const {
+    return rfind(__c, __pos);
+  }
+
+public:                         // find_first_not_of
+
+  size_type find_first_not_of(const _Self& __s, 
+                              size_type __pos = 0) const 
+    { return find_first_not_of(__s._M_start, __pos, __s.size()); }
+
+  size_type find_first_not_of(const _CharT* __s, size_type __pos = 0) const 
+    { _STLP_FIX_LITERAL_BUG(__s) return find_first_not_of(__s, __pos, _Traits::length(__s)); }
+
+  size_type find_first_not_of(const _CharT* __s, size_type __pos,
+                              size_type __n) const;
+
+  size_type find_first_not_of(_CharT __c, size_type __pos = 0) const;
+
+public:                         // find_last_not_of
+
+  size_type find_last_not_of(const _Self& __s, 
+                             size_type __pos = npos) const
+    { return find_last_not_of(__s._M_start, __pos, __s.size()); }
+
+  size_type find_last_not_of(const _CharT* __s, size_type __pos = npos) const
+    { _STLP_FIX_LITERAL_BUG(__s) return find_last_not_of(__s, __pos, _Traits::length(__s)); }
+
+  size_type find_last_not_of(const _CharT* __s, size_type __pos,
+                             size_type __n) const;
+
+  size_type find_last_not_of(_CharT __c, size_type __pos = npos) const;
+
+public:                         // Substring.
+
+  _Self substr(size_type __pos = 0, size_type __n = npos) const {
+    if (__pos > size())
+      this->_M_throw_out_of_range();
+    return _Self(this->_M_start + __pos, 
+                        this->_M_start + __pos + (min) (__n, size() - __pos));
+  }
+
+public:                         // Compare
+
+  int compare(const _Self& __s) const 
+    { return _M_compare(this->_M_start, this->_M_finish, __s._M_start, __s._M_finish); }
+
+  int compare(size_type __pos1, size_type __n1,
+              const _Self& __s) const {
+    if (__pos1 > size())
+      this->_M_throw_out_of_range();
+    return _M_compare(this->_M_start + __pos1, 
+                      this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+                      __s._M_start, __s._M_finish);
+  }
+    
+  int compare(size_type __pos1, size_type __n1,
+              const _Self& __s,
+              size_type __pos2, size_type __n2) const {
+    if (__pos1 > size() || __pos2 > __s.size())
+      this->_M_throw_out_of_range();
+    return _M_compare(this->_M_start + __pos1, 
+                      this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+                      __s._M_start + __pos2, 
+                      __s._M_start + __pos2 + (min) (__n2, __s.size() - __pos2));
+  }
+
+  int compare(const _CharT* __s) const {
+    _STLP_FIX_LITERAL_BUG(__s) 
+      return _M_compare(this->_M_start, this->_M_finish, __s, __s + _Traits::length(__s));
+  }
+
+  int compare(size_type __pos1, size_type __n1, const _CharT* __s) const {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos1 > size())
+      this->_M_throw_out_of_range();
+    return _M_compare(this->_M_start + __pos1, 
+                      this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+                      __s, __s + _Traits::length(__s));
+  }
+
+  int compare(size_type __pos1, size_type __n1, const _CharT* __s,
+              size_type __n2) const {
+    _STLP_FIX_LITERAL_BUG(__s)
+    if (__pos1 > size())
+      this->_M_throw_out_of_range();
+    return _M_compare(this->_M_start + __pos1, 
+                      this->_M_start + __pos1 + (min) (__n1, size() - __pos1),
+                      __s, __s + __n2);
+  }
+
+public:                        // Helper functions for compare.
+  
+  static int _STLP_CALL _M_compare(const _CharT* __f1, const _CharT* __l1,
+                        const _CharT* __f2, const _CharT* __l2) {
+    const ptrdiff_t __n1 = __l1 - __f1;
+    const ptrdiff_t __n2 = __l2 - __f2;
+    const int cmp = _Traits::compare(__f1, __f2, (min) (__n1, __n2));
+    return cmp != 0 ? cmp : (__n1 < __n2 ? -1 : (__n1 > __n2 ? 1 : 0));
+  }
+};
+
+#if ! defined (__STLP_STATIC_CONST_INIT_BUG) && \
+  __GNUC__ == 2 && __GNUC_MINOR__ == 96
+template <class _CharT, class _Traits, class _Alloc>
+const size_t basic_string<_CharT, _Traits, _Alloc>::npos = ~(size_t) 0;
+#endif
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE_CLASS basic_string<char, char_traits<char>, allocator<char> >;
+#  if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT_TEMPLATE_CLASS basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+// ------------------------------------------------------------
+// Non-member functions.
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y)
+{
+  typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+  typedef typename _Str::_Reserve_t _Reserve_t;
+# ifdef __GNUC__
+  // gcc counts this as a function
+  _Str __result  = _Str(_Reserve_t(),__s.size() + __y.size());
+# else
+  _Str __result(_Reserve_t(), __s.size() + __y.size());
+# endif
+  __result.append(__s);
+  __result.append(__y);
+  return __result;
+}
+
+# if defined (__GNUC__) || defined (__MLCCPP__)
+#  define _STLP_INIT_AMBIGUITY 1
+# endif
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const _CharT* __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+  typedef typename _Str::_Reserve_t _Reserve_t;
+  const size_t __n = _Traits::length(__s);
+# ifdef _STLP_INIT_AMBIGUITY
+  _Str __result = _Str(_Reserve_t(), __n + __y.size());
+# else
+  _Str __result(_Reserve_t(), __n + __y.size());
+# endif
+  __result.append(__s, __s + __n);
+  __result.append(__y);
+  return __result;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(_CharT __c,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+  typedef typename _Str::_Reserve_t _Reserve_t;
+# ifdef _STLP_INIT_AMBIGUITY
+  _Str __result = _Str(_Reserve_t(), 1 + __y.size());
+# else
+  _Str __result(_Reserve_t(), 1 + __y.size());
+# endif
+  __result.push_back(__c);
+  __result.append(__y);
+  return __result;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+  typedef typename _Str::_Reserve_t _Reserve_t;
+  const size_t __n = _Traits::length(__s);
+# ifdef _STLP_INIT_AMBIGUITY
+  _Str __result = _Str(_Reserve_t(), __x.size() + __n, __x.get_allocator());
+# else
+  _Str __result(_Reserve_t(), __x.size() + __n, __x.get_allocator());
+# endif
+  __result.append(__x);
+  __result.append(__s, __s + __n);
+  return __result;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT __c) {
+  typedef basic_string<_CharT,_Traits,_Alloc> _Str;
+  typedef typename _Str::_Reserve_t _Reserve_t;
+# ifdef _STLP_INIT_AMBIGUITY
+  _Str __result = _Str(_Reserve_t(), __x.size() + 1, __x.get_allocator());
+# else
+  _Str __result(_Reserve_t(), __x.size() + 1, __x.get_allocator());
+# endif
+  __result.append(__x);
+  __result.push_back(__c);
+  return __result;
+}
+
+# undef _STLP_INIT_AMBIGUITY
+
+// Operator== and operator!=
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return __x.size() == __y.size() && _Traits::compare(__x.data(), __y.data(), __x.size()) == 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator==(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  size_t __n = _Traits::length(__s);
+  return __n == __y.size() && _Traits::compare(__s, __y.data(), __n) == 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  size_t __n = _Traits::length(__s);
+  return __x.size() == __n && _Traits::compare(__x.data(), __s, __n) == 0;
+}
+
+// Operator< (and also >, <=, and >=).
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return basic_string<_CharT,_Traits,_Alloc> ::_M_compare(__x.begin(), __x.end(), 
+		 __y.begin(), __y.end()) < 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<(const _CharT* __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  size_t __n = _Traits::length(__s);
+  return basic_string<_CharT,_Traits,_Alloc> ::_M_compare(__s, __s + __n, __y.begin(), __y.end()) < 0;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  size_t __n = _Traits::length(__s);
+  return basic_string<_CharT,_Traits,_Alloc> ::_M_compare(__x.begin(), __x.end(), __s, __s + __n) < 0;
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return __y < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return !(__y < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL 
+operator!=(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__s == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL 
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__x == __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>(const _CharT* __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return __y < __s;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return __s < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<=(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__y < __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__s < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>=(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__s < __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc> inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__x < __s);
+}
+
+
+// Swap.
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _CharT, class _Traits, class _Alloc> inline void _STLP_CALL
+swap(basic_string<_CharT,_Traits,_Alloc>& __x,
+     basic_string<_CharT,_Traits,_Alloc>& __y) {
+  __x.swap(__y);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+template <class _CharT, class _Traits, class _Alloc> void  _STLP_CALL _S_string_copy(const basic_string<_CharT,_Traits,_Alloc>& __s,
+                    _CharT* __buf,
+                    size_t __n);
+
+# undef basic_string
+
+#if defined(_STLP_WINCE)
+// A couple of functions to transfer between ASCII/Unicode
+
+wstring __ASCIIToWide(const char *ascii);
+string __WideToASCII(const wchar_t *wide);
+#endif
+
+_STLP_END_NAMESPACE
+
+# ifdef _STLP_DEBUG
+#  include <stl/debug/_string.h> 
+# endif
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_string.c> 
+# endif
+
+# include <stl/_string_io.h>  
+# include <stl/_string_hash.h>  
+
+#endif /* _STLP_STRING_H */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string_fwd.c b/src/STLport/stl/_string_fwd.c
new file mode 100644
index 0000000..509ac82
--- /dev/null
+++ b/src/STLport/stl/_string_fwd.c
@@ -0,0 +1,48 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_FWD_H
+# include <stl/_string_fwd.h>
+#endif
+
+#if !defined ( _STLP_STRING_FWD_C) && ! defined (_STLP_OWN_IOSTREAMS)
+#define _STLP_STRING_FWD_C
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc>
+const char* _STLP_CALL
+__get_c_string(const basic_string<_CharT,_Traits,_Alloc>& __str) { 
+  return __str.c_str(); 
+}
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_STRING_FWD_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string_fwd.h b/src/STLport/stl/_string_fwd.h
new file mode 100644
index 0000000..e90a00b
--- /dev/null
+++ b/src/STLport/stl/_string_fwd.h
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_FWD_H
+#define _STLP_STRING_FWD_H
+
+#ifndef _STLP_IOSFWD
+# include <iosfwd>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if !defined (_STLP_LIMITED_DEFAULT_TEMPLATES)
+template <class _CharT, 
+          class _Traits = char_traits<_CharT>, 
+          class _Alloc = allocator<_CharT> >
+class basic_string;
+# else
+template <class _CharT, 
+          class _Traits, 
+          class _Alloc>
+class basic_string;
+# endif /* _STLP_LIMITED_DEFAULT_TEMPLATES */
+
+typedef basic_string<char, char_traits<char>, allocator<char> > string;
+
+#  ifdef _STLP_HAS_WCHAR_T
+typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> > wstring;
+#  endif
+
+# ifdef _STLP_OWN_IOSTREAMS
+_STLP_DECLSPEC const char*  _STLP_CALL
+__get_c_string(const string& __str);
+# else
+template <class _CharT, class _Traits, class _Alloc>
+const char* _STLP_CALL
+__get_c_string(const basic_string<_CharT, _Traits, _Alloc>& __str);
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_STRING_FWD_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_string_hash.h b/src/STLport/stl/_string_hash.h
new file mode 100644
index 0000000..acf8f04
--- /dev/null
+++ b/src/STLport/stl/_string_hash.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_HASH_H
+# define _STLP_STRING_HASH_H
+
+#ifndef _STLP_HASH_FUN_H
+# include <stl/_hash_fun.h>
+#endif
+
+#ifndef _STLP_STRING_H
+# include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc>
+_STLP_INLINE_LOOP size_t
+__stl_string_hash(const basic_string<_CharT,_Traits,_Alloc>& __s) {
+  unsigned long __h = 0;
+  typedef typename basic_string<_CharT,_Traits,_Alloc>::const_pointer const_ptr;
+  size_t __len = __s.size();
+  const _CharT* __data = __s.data();
+  for ( size_t __i = 0; __i < __len; ++__i)
+    __h = 5*__h + __data[__i];
+  return size_t(__h);
+}
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+
+template <class _CharT, class _Traits, class _Alloc>
+struct hash<basic_string<_CharT,_Traits,_Alloc> > {
+  size_t operator()(const basic_string<_CharT,_Traits,_Alloc>& __s) const
+    { return __stl_string_hash(__s); }
+};
+
+#else
+
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC hash<string> {
+  size_t operator()(const string& __s) const
+    { return __stl_string_hash(__s); }
+};
+
+# if defined (_STLP_HAS_WCHAR_T)
+_STLP_TEMPLATE_NULL struct _STLP_CLASS_DECLSPEC hash<wstring> {
+  size_t operator()(const wstring& __s) const
+    { return __stl_string_hash(__s); }
+};
+# endif
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+_STLP_END_NAMESPACE
+
+#endif
diff --git a/src/STLport/stl/_string_io.c b/src/STLport/stl/_string_io.c
new file mode 100644
index 0000000..973b6c4
--- /dev/null
+++ b/src/STLport/stl/_string_io.c
@@ -0,0 +1,334 @@
+#ifndef _STLP_STRING_IO_C
+#define _STLP_STRING_IO_C
+
+#ifndef _STLP_STRING_IO_H
+# include <stl/_string_io.h>
+#endif
+
+#ifndef _STLP_INTERNAL_CTYPE_H
+# include <stl/_ctype.h>
+#endif
+
+# ifdef _STLP_DEBUG
+#  define basic_string _Nondebug_string
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_OWN_IOSTREAMS)
+#  define _STLP_USING_IO
+# else
+#  define _STLP_USING_IO _STLP_USING_VENDOR_STD
+# endif
+
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+
+template <class _CharT, class _Traits>
+bool _STLP_CALL
+__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
+                  basic_streambuf<_CharT, _Traits>* __buf,
+                  size_t __n)
+{
+  _CharT __f = __os.fill();
+  size_t __i;
+  bool __ok = true;
+
+  for (__i = 0; __i < __n; ++__i)
+    __ok = __ok && !_Traits::eq_int_type(__buf->sputc(__f), _Traits::eof());
+  return __ok;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, 
+           const basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+
+  _STLP_USING_IO
+  typedef basic_ostream<_CharT, _Traits> __ostream;
+  typename __ostream::sentry __sentry(__os);
+  bool __ok = false;
+
+  if (__sentry) {
+    __ok = true;
+    size_t __n = __s.size();
+    size_t __pad_len = 0;
+    const bool __left = (__os.flags() & __ostream::left) != 0;
+    const size_t __w = __os.width(0);
+    basic_streambuf<_CharT, _Traits>* __buf = __os.rdbuf();
+
+    if (__n < __w) {
+      __pad_len = __w - __n;
+    }
+    
+    if (!__left)
+      __ok = __stlp_string_fill(__os, __buf, __pad_len);    
+
+    __ok = __ok && (__buf->sputn(__s.data(), streamsize(__n)) == streamsize(__n));
+
+    if (__left)
+      __ok = __ok && __stlp_string_fill(__os, __buf, __pad_len);
+  }
+
+  if (!__ok)
+    __os.setstate(__ostream::failbit);
+
+  return __os;
+}
+ 
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>& _STLP_CALL 
+operator>>(basic_istream<_CharT, _Traits>& __is,
+           basic_string<_CharT,_Traits, _Alloc>& __s)
+{
+  _STLP_USING_IO
+  typedef basic_istream<_CharT, _Traits> __istream;
+  typename __istream::sentry __sentry(__is);
+
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
+    typedef ctype<_CharT> _C_type;
+
+#ifdef _STLP_OWN_IOSTREAMS
+    //    const _C_type& _Ctype = use_facet<_C_type>(__loc);
+    const _C_type& _Ctype = *(const _C_type*)__is._M_ctype_facet();
+#else
+# if defined (_STLP_MSVC) && (_STLP_MSVC <= 1200 ) || defined (__ICL)
+    const locale& __loc = __is.getloc();
+    const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0, true);
+# elif defined (__SUNPRO_CC)
+    const locale& __loc = __is.getloc();
+    const _C_type& _Ctype = use_facet(__loc , ( _C_type * ) 0);
+# else
+    const locale& __loc = __is.getloc();
+    const _C_type& _Ctype = use_facet<_C_type>(__loc);
+# endif
+#endif
+    __s.clear();
+    size_t __n = __is.width(0);
+    if (__n == 0)
+      __n = __STATIC_CAST(size_t,-1);
+    else
+      __s.reserve(__n);
+    
+
+    while (__n-- > 0) {
+      typename _Traits::int_type __c1 = __buf->sbumpc();
+      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
+        __is.setstate(__istream::eofbit);
+        break;
+      }
+      else {
+        _CharT __c = _Traits::to_char_type(__c1);
+
+        if (_Ctype.is(_C_type::space, __c)) {
+          if (_Traits::eq_int_type(__buf->sputbackc(__c), _Traits::eof()))
+            __is.setstate(__istream::failbit);
+          break;
+        }
+        else
+          __s.push_back(__c);
+      }
+    }
+    
+    // If we have read no characters, then set failbit.
+    if (__s.size() == 0)
+      __is.setstate(__istream::failbit);
+  }
+  else
+    __is.setstate(__istream::failbit);
+
+  return __is;
+}
+
+template <class _CharT, class _Traits, class _Alloc>    
+basic_istream<_CharT, _Traits>& _STLP_CALL 
+getline(basic_istream<_CharT, _Traits>& __is,
+        basic_string<_CharT,_Traits,_Alloc>& __s,
+        _CharT __delim)
+{
+  _STLP_USING_IO
+  typedef basic_istream<_CharT, _Traits> __istream;
+  size_t __nread = 0;
+  typename basic_istream<_CharT, _Traits>::sentry __sentry(__is, true);
+  if (__sentry) {
+    basic_streambuf<_CharT, _Traits>* __buf = __is.rdbuf();
+    __s.clear();
+
+    while (__nread < __s.max_size()) {
+      int __c1 = __buf->sbumpc();
+      if (_Traits::eq_int_type(__c1, _Traits::eof())) {
+        __is.setstate(__istream::eofbit);
+        break;
+      }
+      else {
+        ++__nread;
+        _CharT __c = _Traits::to_char_type(__c1);
+        if (!_Traits::eq(__c, __delim)) 
+          __s.push_back(__c);
+        else
+          break;              // Character is extracted but not appended.
+      }
+    }
+  }
+  if (__nread == 0 || __nread >= __s.max_size())
+    __is.setstate(__istream::failbit);
+
+  return __is;
+}
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, _OSTREAM_DLL tells if ostream class is in .exe or in .dll
+
+template <class _CharT, class _Traits, class _Alloc>
+_OSTREAM_DLL&  _STLP_CALL operator<<(_OSTREAM_DLL& __os, 
+                    const basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+  _STLP_USING_IO
+  streambuf* __buf = __os.rdbuf();
+  if (__buf) {
+    size_t __n = __s.size();
+    size_t __pad_len = 0;
+    const bool __left = (__os.flags() & ios::left) !=0;
+    const size_t __w = __os.width();
+
+    if (__n < __w) { 
+      __pad_len = __w - __n; 
+    } 
+    
+    if (!__left)
+      __stlp_string_fill(__os, __buf, __pad_len);
+  
+    const size_t __nwritten = __buf->sputn(__s.data(), __n);
+
+    if (__left)
+      __stlp_string_fill(__os, __buf, __pad_len);
+
+    if (__nwritten != __n)
+      __os.clear(__os.rdstate() | ios::failbit);
+
+    __os.width(0);
+  }
+  else
+    __os.clear(__os.rdstate() | ios::badbit);
+
+  return __os;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+  _STLP_USING_IO
+  if (!__is)
+    return __is;
+
+  streambuf* __buf = __is.rdbuf();
+  if (__buf) {
+
+    if (__is.flags() & ios::skipws) {
+      //      _CharT __c;
+      int __c;
+      do {
+        __c = __buf->sbumpc();
+      }
+      while (__c != EOF && isspace((unsigned char)__c));
+
+      if (__c == EOF) {
+        __is.clear(__is.rdstate() | ios::eofbit | ios::failbit);
+      }
+      else {
+	if (__buf->sputbackc(__c) == EOF)
+	  __is.clear(__is.rdstate() | ios::failbit);
+      }
+    }
+
+    // If we arrive at end of file (or fail for some other reason) while
+    // still discarding whitespace, then we don't try to read the string.
+    if (__is) {
+      __s.clear();
+
+      size_t __n = __is.width();
+      if (__n == 0)
+        __n = __STATIC_CAST(size_t,-1);
+      else
+        __s.reserve(__n);
+
+      while (__n-- > 0) {
+        int __c1 = __buf->sbumpc();
+        if (__c1 == EOF) {
+          __is.clear(__is.rdstate() | ios::eofbit);
+          break;
+        }
+        else {
+          _CharT __c = _Traits::to_char_type(__c1);
+
+          if (isspace((unsigned char) __c)) {
+            if (__buf->sputbackc(__c) == EOF)
+              __is.clear(__is.rdstate() | ios::failbit);
+            break;
+          }
+          else
+            __s.push_back(__c);
+        }
+      }
+    
+      // If we have read no characters, then set failbit.
+      if (__s.size() == 0)
+        __is.clear(__is.rdstate() | ios::failbit);
+    }
+
+    __is.width(0);
+  }
+  else                          // We have no streambuf.
+    __is.clear(__is.rdstate() | ios::badbit);
+
+  return __is;
+}
+
+template <class _CharT, class _Traits, class _Alloc>    
+_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is,
+                 basic_string<_CharT,_Traits,_Alloc>& __s,
+                 _CharT __delim)
+{
+  _STLP_USING_IO
+  streambuf* __buf = __is.rdbuf();
+  if (__buf) {
+    size_t __nread = 0;
+    if (__is) {
+      __s.clear();
+
+      while (__nread < __s.max_size()) {
+        int __c1 = __buf->sbumpc();
+        if (__c1 == EOF) {
+          __is.clear(__is.rdstate() | ios::eofbit);
+          break;
+        }
+        else {
+          ++__nread;
+          _CharT __c = _Traits::to_char_type(__c1);
+          if (!_Traits::eq(__c, __delim)) 
+            __s.push_back(__c);
+          else
+            break;              // Character is extracted but not appended.
+        }
+      }
+    }
+
+    if (__nread == 0 || __nread >= __s.max_size())
+      __is.clear(__is.rdstate() | ios::failbit);
+  }
+  else
+    __is.clear(__is.rdstate() | ios::badbit);
+
+  return __is;
+}
+
+# endif /* _STLP_NEW_IOSTREAMS */
+
+_STLP_END_NAMESPACE
+
+// # undef _STLP_USING_IO
+# undef basic_string
+
+#endif
diff --git a/src/STLport/stl/_string_io.h b/src/STLport/stl/_string_io.h
new file mode 100644
index 0000000..c4b99e3
--- /dev/null
+++ b/src/STLport/stl/_string_io.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING_IO_H
+#define _STLP_STRING_IO_H
+
+// this is for link-time instantiation
+#if !defined  ( _STLP_STRING )
+# include <string>
+# endif
+
+//#ifndef _STLP_LOCALE
+//# include <locale>
+//#endif
+
+# ifdef _STLP_DEBUG
+#  define basic_string _Nondebug_string
+# endif
+
+// I/O.  
+_STLP_BEGIN_NAMESPACE
+
+#if defined (_STLP_USE_NEW_IOSTREAMS)
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, 
+           const basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>&  _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is,
+           basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>    
+basic_istream<_CharT, _Traits>& _STLP_CALL 
+getline(basic_istream<_CharT, _Traits>& __is,
+        basic_string<_CharT,_Traits,_Alloc>& __s,
+        _CharT __delim);
+
+# if !(defined (__BORLANDC__) && ! defined (_STLP_USE_OWN_NAMESPACE))
+
+template <class _CharT, class _Traits, class _Alloc>    
+inline basic_istream<_CharT, _Traits>& _STLP_CALL 
+getline(basic_istream<_CharT, _Traits>& __is,
+        basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+  return getline(__is, __s, __is.widen('\n'));
+}
+# endif
+
+template <class _CharT, class _Traits>
+bool _STLP_CALL
+__stlp_string_fill(basic_ostream<_CharT, _Traits>& __os,
+                  basic_streambuf<_CharT, _Traits>* __buf,
+                  size_t __n);
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+// (reg) For Watcom IO, this tells if ostream class is in .exe or in .dll
+# ifdef _WPRTLINK
+typedef _WPRTLINK ostream _OSTREAM_DLL;
+typedef _WPRTLINK istream _ISTREAM_DLL;
+#else
+typedef           ostream _OSTREAM_DLL;
+typedef           istream _ISTREAM_DLL;
+#endif
+
+template <class _CharT, class _Traits, class _Alloc>
+_OSTREAM_DLL& _STLP_CALL operator<<(_OSTREAM_DLL& __os, 
+                    const basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>
+_ISTREAM_DLL& _STLP_CALL operator>>(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s);
+
+template <class _CharT, class _Traits, class _Alloc>    
+_ISTREAM_DLL& _STLP_CALL getline(_ISTREAM_DLL& __is,
+                 basic_string<_CharT,_Traits,_Alloc>& __s,
+                 _CharT __delim);
+
+
+template <class _CharT, class _Traits, class _Alloc>    
+inline _ISTREAM_DLL& _STLP_CALL 
+getline(_ISTREAM_DLL& __is, basic_string<_CharT,_Traits,_Alloc>& __s)
+{
+  return getline(__is, __s, '\n');
+}
+
+inline void  _STLP_CALL
+__stlp_string_fill(_OSTREAM_DLL& __os, streambuf* __buf, size_t __n)
+{
+  char __f = __os.fill();
+  size_t __i;
+
+  for (__i = 0; __i < __n; ++__i) __buf->sputc(__f);
+}
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+_STLP_END_NAMESPACE
+
+# undef basic_string
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_string_io.c>
+# endif
+
+#endif /* _STLP_STRING_IO_H */
diff --git a/src/STLport/stl/_strstream.h b/src/STLport/stl/_strstream.h
new file mode 100644
index 0000000..85bb7fc
--- /dev/null
+++ b/src/STLport/stl/_strstream.h
@@ -0,0 +1,141 @@
+
+#ifndef _STLP_INTERNAL_STREAMBUF
+#include <stl/_streambuf.h>
+#endif
+#ifndef _STLP_ISTREAM
+#include <istream>              // Includes <ostream>, <ios>, <iosfwd>
+#endif
+#ifndef _STLP_STRING_H
+#include <stl/_string.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+#ifndef _STLP_USE_NAMESPACES
+# define strstream _STLP_strstream 
+# define ostrstream _STLP_ostrstream
+# define istrstream _STLP_istrstream
+# define strstreambuf _STLP_strstreambuf
+#endif
+
+//----------------------------------------------------------------------
+// Class strstreambuf, a streambuf class that manages an array of char.
+// Note that this class is not a template.
+
+class _STLP_CLASS_DECLSPEC strstreambuf : public basic_streambuf<char, char_traits<char> >
+{
+public:                         // Types.
+  typedef char_traits<char>              _Traits;
+  typedef basic_streambuf<char, char_traits<char> > _Base;
+  typedef void* (*__alloc_fn)(size_t);
+  typedef void (*__free_fn)(void*);
+public:                         // Constructor, destructor
+
+  explicit strstreambuf(streamsize _Initial_capacity = 0);
+
+  strstreambuf(__alloc_fn, __free_fn);
+
+  strstreambuf(char* __get, streamsize __n, char* __put = 0);
+  strstreambuf(signed char* __get, streamsize __n, signed char* __put = 0);
+  strstreambuf(unsigned char* __get, streamsize __n, unsigned char* __put=0);
+
+  strstreambuf(const char* __get, streamsize __n);
+  strstreambuf(const signed char* __get, streamsize __n);
+  strstreambuf(const unsigned char* __get, streamsize __n);
+
+  virtual ~strstreambuf();
+
+public:                         // strstreambuf operations.
+  void freeze(bool = true);
+  char* str();
+  int pcount() const;
+
+protected:                      // Overridden virtual member functions.
+  virtual int_type overflow(int_type __c  = _Traits::eof());
+  virtual int_type pbackfail(int_type __c = _Traits::eof());
+  virtual int_type underflow();
+  virtual _Base* setbuf(char* __buf, streamsize __n);
+  virtual pos_type seekoff(off_type __off, ios_base::seekdir __dir,
+                           ios_base::openmode __mode 
+                                      = ios_base::in | ios_base::out);
+  virtual pos_type seekpos(pos_type __pos, ios_base::openmode __mode 
+                                      = ios_base::in | ios_base::out);
+
+private:                        // Helper functions.
+  // Dynamic allocation, possibly using _M_alloc_fun and _M_free_fun.
+  char* _M_alloc(size_t);
+  void  _M_free(char*);
+
+  // Helper function used in constructors.
+  void _M_setup(char* __get, char* __put, streamsize __n);
+private:                        // Data members.
+  __alloc_fn _M_alloc_fun;
+  __free_fn  _M_free_fun;
+  bool _M_dynamic  : 1;
+  bool _M_frozen   : 1;
+  bool _M_constant : 1;
+};
+
+//----------------------------------------------------------------------
+// Class istrstream, an istream that manages a strstreambuf.
+
+class _STLP_CLASS_DECLSPEC istrstream : public basic_istream<char, char_traits<char> >
+{
+public:
+  explicit istrstream(char*);
+  explicit istrstream(const char*);
+  istrstream(char* , streamsize);
+  istrstream(const char*, streamsize);
+  virtual ~istrstream();
+  
+  strstreambuf* rdbuf() const;
+  char* str();
+
+private:
+  strstreambuf _M_buf;
+};
+
+//----------------------------------------------------------------------
+// Class ostrstream
+
+class _STLP_CLASS_DECLSPEC ostrstream : public basic_ostream<char, char_traits<char> >
+{
+public:
+  ostrstream();
+  ostrstream(char*, int, ios_base::openmode = ios_base::out);
+  virtual ~ostrstream();
+
+  strstreambuf* rdbuf() const;
+  void freeze(bool = true);
+  char* str();
+  int pcount() const;
+
+private:
+  strstreambuf _M_buf;
+};
+
+//----------------------------------------------------------------------
+// Class strstream
+
+class _STLP_CLASS_DECLSPEC strstream : public basic_iostream<char, char_traits<char> >
+{
+public:
+  typedef char                        char_type;
+  typedef char_traits<char>::int_type int_type;
+  typedef char_traits<char>::pos_type pos_type;
+  typedef char_traits<char>::off_type off_type;
+
+  strstream();
+  strstream(char*, int, ios_base::openmode = ios_base::in | ios_base::out);
+  virtual ~strstream();
+
+  strstreambuf* rdbuf() const;
+  void freeze(bool = true);
+  int pcount() const;
+  char* str();
+
+private:
+  strstreambuf _M_buf;
+};
+
+_STLP_END_NAMESPACE
diff --git a/src/STLport/stl/_tempbuf.c b/src/STLport/stl/_tempbuf.c
new file mode 100644
index 0000000..b1eb21c
--- /dev/null
+++ b/src/STLport/stl/_tempbuf.c
@@ -0,0 +1,57 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_TEMPBUF_C
+#define _STLP_TEMPBUF_C
+
+#ifndef _STLP_INTERNAL_TEMPBUF_H
+# include <stl/_tempbuf.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+pair<_Tp*, ptrdiff_t> _STLP_CALL 
+__get_temporary_buffer(ptrdiff_t __len, _Tp*)
+{
+  if (__len > ptrdiff_t(INT_MAX / sizeof(_Tp)))
+    __len = INT_MAX / sizeof(_Tp);
+
+  while (__len > 0) {
+    _Tp* __tmp = (_Tp*) malloc((size_t)__len * sizeof(_Tp));
+    if (__tmp != 0)
+      return pair<_Tp*, ptrdiff_t>(__tmp, __len);
+    __len /= 2;
+  }
+
+  return pair<_Tp*, ptrdiff_t>((_Tp*)0, 0);
+}
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_TEMPBUF_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_tempbuf.h b/src/STLport/stl/_tempbuf.h
new file mode 100644
index 0000000..f6d342e
--- /dev/null
+++ b/src/STLport/stl/_tempbuf.h
@@ -0,0 +1,165 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_TEMPBUF_H
+#define _STLP_INTERNAL_TEMPBUF_H
+
+# ifndef _STLP_CLIMITS
+#  include <climits>
+# endif
+# ifndef _STLP_CSTDLIB
+#  include <cstdlib>
+# endif
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#  include <stl/_uninitialized.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+pair<_Tp*, ptrdiff_t>  _STLP_CALL
+__get_temporary_buffer(ptrdiff_t __len, _Tp*);
+
+#ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
+
+template <class _Tp>
+inline pair<_Tp*, ptrdiff_t>  _STLP_CALL get_temporary_buffer(ptrdiff_t __len) {
+  return __get_temporary_buffer(__len, (_Tp*) 0);
+}
+
+# if ! defined(_STLP_NO_EXTENSIONS)
+// This overload is not required by the standard; it is an extension.
+// It is supported for backward compatibility with the HP STL, and
+// because not all compilers support the language feature (explicit
+// function template arguments) that is required for the standard
+// version of get_temporary_buffer.
+template <class _Tp>
+inline pair<_Tp*, ptrdiff_t>  _STLP_CALL
+get_temporary_buffer(ptrdiff_t __len, _Tp*) {
+  return __get_temporary_buffer(__len, (_Tp*) 0);
+}
+# endif
+#endif
+
+template <class _Tp>
+inline void  _STLP_CALL return_temporary_buffer(_Tp* __p) {
+// SunPro brain damage
+  free((char*)__p);
+}
+
+template <class _ForwardIterator, class _Tp>
+class _Temporary_buffer {
+private:
+  ptrdiff_t  _M_original_len;
+  ptrdiff_t  _M_len;
+  _Tp*       _M_buffer;
+
+  void _M_allocate_buffer() {
+    _M_original_len = _M_len;
+    _M_buffer = 0;
+
+    if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp)))
+      _M_len = INT_MAX / sizeof(_Tp);
+
+    while (_M_len > 0) {
+      _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
+      if (_M_buffer)
+        break;
+      _M_len /= 2;
+    }
+  }
+
+  void _M_initialize_buffer(const _Tp&, const __true_type&) {}
+  void _M_initialize_buffer(const _Tp& val, const __false_type&) {
+    uninitialized_fill_n(_M_buffer, _M_len, val);
+  }
+
+public:
+  ptrdiff_t size() const { return _M_len; }
+  ptrdiff_t requested_size() const { return _M_original_len; }
+  _Tp* begin() { return _M_buffer; }
+  _Tp* end() { return _M_buffer + _M_len; }
+
+  _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
+    // Workaround for a __type_traits bug in the pre-7.3 compiler.
+#   if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730
+    typedef typename __type_traits<_Tp>::is_POD_type _Trivial;
+#   else
+     typedef typename __type_traits<_Tp>::has_trivial_default_constructor  _Trivial;
+#   endif
+    _STLP_TRY {
+      _M_len = distance(__first, __last);
+      _M_allocate_buffer();
+      if (_M_len > 0)
+        _M_initialize_buffer(*__first, _Trivial());
+    }
+    _STLP_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0);
+  }
+ 
+  ~_Temporary_buffer() {  
+    _STLP_STD::_Destroy(_M_buffer, _M_buffer + _M_len);
+    free(_M_buffer);
+  }
+
+private:
+  // Disable copy constructor and assignment operator.
+  _Temporary_buffer(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
+  void operator=(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
+};
+
+# ifndef _STLP_NO_EXTENSIONS
+
+// Class temporary_buffer is not part of the standard.  It is an extension.
+
+template <class _ForwardIterator, 
+          class _Tp 
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+                    = typename iterator_traits<_ForwardIterator>::value_type
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+         >
+struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
+{
+  temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
+    : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {}
+  ~temporary_buffer() {}
+};
+
+# endif /* _STLP_NO_EXTENSIONS */
+    
+_STLP_END_NAMESPACE
+
+# ifndef _STLP_LINK_TIME_INSTANTIATION
+#  include <stl/_tempbuf.c>
+# endif
+
+#endif /* _STLP_INTERNAL_TEMPBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_threads.c b/src/STLport/stl/_threads.c
new file mode 100644
index 0000000..31c2cfa
--- /dev/null
+++ b/src/STLport/stl/_threads.c
@@ -0,0 +1,172 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_THREADS_C
+#define _STLP_THREADS_C
+
+#ifndef _STLP_INTERNAL_THREADS_H
+# include <stl/_threads.h>
+#endif
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+# if defined(_STLP_SGI_THREADS)
+#  include <time.h>
+# elif defined (_STLP_UNIX)
+#  include <ctime>
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+using _STLP_VENDOR_CSTD::time_t;
+# endif
+#  include <sys/time.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if (_STLP_STATIC_TEMPLATE_DATA > 0)
+
+#  ifdef _STLP_THREADS
+#  if !defined(_STLP_ATOMIC_EXCHANGE) && (defined(_STLP_PTHREADS) || defined(_STLP_UITHREADS) || defined(_STLP_OS2THREADS) || defined(_STLP_USE_PTHREAD_SPINLOCK))
+template<int __dummy>
+_STLP_STATIC_MUTEX
+_Swap_lock_struct<__dummy>::_S_swap_lock _STLP_MUTEX_INITIALIZER;
+#  endif
+#  endif //_STLP_THREADS
+
+#  ifndef _STLP_USE_PTHREAD_SPINLOCK
+template <int __inst>
+unsigned _STLP_mutex_spin<__inst>::__max = _STLP_mutex_spin<__inst>::__low_max;
+
+template <int __inst>
+unsigned _STLP_mutex_spin<__inst>::__last = 0;
+#  endif // _STLP_USE_PTHREAD_SPINLOCK
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+#  if defined(_STLP_PTHREADS) || defined(_STLP_UITHREADS) || defined(_STLP_OS2THREADS)
+__DECLARE_INSTANCE(_STLP_STATIC_MUTEX, _Swap_lock_struct<0>::_S_swap_lock, 
+                   _STLP_MUTEX_INITIALIZER  );
+#  endif /* _STLP_PTHREADS */
+
+#  ifndef _STLP_USE_PTHREAD_SPINLOCK
+__DECLARE_INSTANCE(unsigned, _STLP_mutex_spin<0>::__max,  =30);
+__DECLARE_INSTANCE(unsigned, _STLP_mutex_spin<0>::__last, =0);
+#  endif // _STLP_USE_PTHREAD_SPINLOCK
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+#ifndef _STLP_USE_PTHREAD_SPINLOCK
+
+#ifdef _STLP_SPARC_SOLARIS_THREADS
+// underground function in libc.so; we do not want dependance on librt
+extern "C" int __nanosleep(const struct timespec*, struct timespec*);
+# define _STLP_NANOSLEEP __nanosleep
+#else
+# define _STLP_NANOSLEEP nanosleep
+#endif
+
+template <int __inst>
+void _STLP_CALL
+_STLP_mutex_spin<__inst>::_S_nsec_sleep(int __log_nsec) {
+#     if defined(_STLP_WIN32THREADS)
+	  if (__log_nsec <= 20) {
+        // Note from boost (www.boost.org): 
+        // Changed to Sleep(1) from Sleep(0).
+        // According to MSDN, Sleep(0) will never yield
+        // to a lower-priority thread, whereas Sleep(1)
+        // will. Performance seems not to be affected.
+	      Sleep(1);
+	  } else {
+	      Sleep(1 << (__log_nsec - 20));
+	  }
+#    elif defined(_STLP_OS2THREADS)
+      if (__log_nsec <= 20) {
+         DosSleep(0);
+      } else {
+         DosSleep(1 << (__log_nsec - 20));
+      }
+#     elif defined (_STLP_UNIX)
+          timespec __ts;
+          /* Max sleep is 2**27nsec ~ 60msec      */
+          __ts.tv_sec = 0;
+          __ts.tv_nsec = 1 << __log_nsec;
+          _STLP_NANOSLEEP(&__ts, 0);
+#     endif
+  }
+
+
+template <int __inst>
+void  _STLP_CALL
+_STLP_mutex_spin<__inst>::_M_do_lock(volatile __stl_atomic_t* __lock)
+{
+#if defined(_STLP_ATOMIC_EXCHANGE)
+  if (_Atomic_swap(__lock, 1)) {
+    unsigned __my_spin_max = _STLP_mutex_spin<0>::__max;
+    unsigned __my_last_spins = _STLP_mutex_spin<0>::__last;
+    volatile unsigned __junk = 17; 	// Value doesn't matter.
+    unsigned  __i;
+    
+    for (__i = 0; __i < __my_spin_max; ++__i) {
+      if (__i < __my_last_spins/2 || *__lock) {
+        __junk *= __junk; __junk *= __junk;
+        __junk *= __junk; __junk *= __junk;
+      } else {
+        if (!_Atomic_swap(__lock, 1)) {
+          // got it!
+          // Spinning worked.  Thus we're probably not being scheduled
+          // against the other process with which we were contending.
+          // Thus it makes sense to spin longer the next time.
+          _STLP_mutex_spin<0>::__last = __i;
+          _STLP_mutex_spin<0>::__max = _STLP_mutex_spin<0>::__high_max;
+	    return;
+        }
+      }
+    }
+    
+    // We are probably being scheduled against the other process.  Sleep.
+    _STLP_mutex_spin<0>::__max = _STLP_mutex_spin<0>::__low_max;
+    
+    for (__i = 0 ;; ++__i) {
+      int __log_nsec = __i + 6;
+      
+      if (__log_nsec > 27) __log_nsec = 27;
+      if (!_Atomic_swap(__lock, 1)) {
+	  break;
+      }
+      _S_nsec_sleep(__log_nsec);
+    }
+    
+  } /* first _Atomic_swap */
+# endif
+}
+#endif // _STLP_USE_PTHREAD_SPINLOCK
+
+_STLP_END_NAMESPACE
+
+# endif /* BUILDING_STLPORT */
+#endif /*  _STLP_THREADS_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_threads.h b/src/STLport/stl/_threads.h
new file mode 100644
index 0000000..a383604
--- /dev/null
+++ b/src/STLport/stl/_threads.h
@@ -0,0 +1,721 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+// Stl_config.h should be included before this file.
+
+
+#ifndef _STLP_INTERNAL_THREADS_H
+#define _STLP_INTERNAL_THREADS_H
+
+// Supported threading models are native SGI, pthreads, uithreads
+// (similar to pthreads, but based on an earlier draft of the Posix
+// threads standard), and Win32 threads.  Uithread support by Jochen
+// Schlick, 1999, and Solaris threads generalized to them.
+
+#ifndef _STLP_CONFIG_H
+#include <stl/_config.h>
+#endif
+
+# if ! defined (_STLP_CSTDDEF)
+#  include <cstddef>
+# endif
+
+# if ! defined (_STLP_CSTDLIB)
+#  include <cstdlib>
+# endif
+
+// On SUN and Mac OS X gcc, zero-initialization works just fine...
+# if defined (__sun) || ( defined(__GNUC__) && defined(__APPLE__) )
+# define _STLP_MUTEX_INITIALIZER
+# endif
+
+# if defined (_STLP_WIN32) || defined (__sgi) || defined (_STLP_SPARC_SOLARIS_THREADS)
+  typedef long __stl_atomic_t;
+# else 
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+// using _STLP_VENDOR_CSTD::size_t;
+using namespace _STLP_VENDOR_CSTD;
+# endif
+  typedef size_t __stl_atomic_t;
+#endif  
+
+# if defined(_STLP_SGI_THREADS)
+#  include <mutex.h>
+// Hack for SGI o32 compilers.
+#if !defined(__add_and_fetch) && \
+    (__mips < 3 || !(defined (_ABIN32) || defined(_ABI64)))
+#  define __add_and_fetch(__l,__v) add_then_test((unsigned long*)__l,__v)  
+#  define __test_and_set(__l,__v)  test_and_set(__l,__v)
+#endif /* o32 */
+
+# if __mips < 3 || !(defined (_ABIN32) || defined(_ABI64))
+#  define _STLP_ATOMIC_EXCHANGE(__p, __q) test_and_set(__p, __q)
+# else
+#  define _STLP_ATOMIC_EXCHANGE(__p, __q) __test_and_set((unsigned long*)__p, (unsigned long)__q)
+# endif
+
+#  define _STLP_ATOMIC_INCREMENT(__x) __add_and_fetch(__x, 1)
+#  define _STLP_ATOMIC_DECREMENT(__x) __add_and_fetch(__x, (size_t) -1)
+
+# elif defined (__GNUC__) && defined (__i386__) && defined (__unix__) && defined (_STLP_USE_INLINE_X86_SPINLOCK) 
+
+// gcc on i386 linux, freebsd, etc. 
+
+// This enables the memory caching on x86 linux.  It is critical for SMP
+// without it the performace is DISMAL!
+static inline unsigned long __xchg(volatile __stl_atomic_t* target, int source)
+{
+
+  // The target is refernce in memory rather than the register
+  // because making a copy of it from memory to the register and
+  // back again would ruin the atomic nature of the call.
+  // the source does not need to be delt with atomicly so it can
+  // be copied about as needed.
+  //
+  // The casting of the source is used to prevent gcc from optimizing 
+  // in such a way that breaks the atomic nature of this call.
+  //
+  __asm__ __volatile__("xchgl %1,%0"
+		       :"=m" (*(volatile long *) target), "=r" (source)
+		       :"m" (*(volatile long *) target), "r" (source) );
+  return source;
+
+  //  The assembly above does the following atomicly:
+  //   int temp=source;
+  //   source=(int)(*target);
+  //   (int)(*target)=temp;
+  // return source
+}
+
+static inline void __inc_and_fetch(volatile __stl_atomic_t* __x)
+{
+  // Referenced in memory rather than register to preserve the atomic nature.
+  //
+  __asm__ __volatile__(
+      "lock; incl %0"
+      :"=m" (*__x)
+      :"m" (*__x) );
+
+  //  The assembly above does the following atomicly:
+  //   ++(int)(*__x);
+
+}
+static inline void __dec_and_fetch(volatile __stl_atomic_t* __x)
+{
+  // Referenced in memory rather than register to preserve the atomic nature.
+  //
+  __asm__ __volatile__(
+      "lock; decl %0"
+      :"=m" (*__x)
+      :"m" (*__x) );
+
+  //  The assembly above does the following atomicly:
+  //   --(int)(*__x);
+}
+
+#  define _STLP_ATOMIC_EXCHANGE(target, newValue) ((__xchg(target, newValue)))
+#  define _STLP_ATOMIC_INCREMENT(__x) __inc_and_fetch(__x)
+#  define _STLP_ATOMIC_DECREMENT(__x) __dec_and_fetch(__x)
+
+# elif defined(_STLP_PTHREADS)
+
+#  include <pthread.h>
+#  ifndef _STLP_USE_PTHREAD_SPINLOCK
+#   if defined(PTHREAD_MUTEX_INITIALIZER) && !defined(_STLP_MUTEX_INITIALIZER)
+#    define _STLP_MUTEX_INITIALIZER = { PTHREAD_MUTEX_INITIALIZER }
+#   endif
+
+//HPUX variants have (on some platforms optional) non-standard "DCE" pthreads impl
+#   if defined(_DECTHREADS_) && (defined(_PTHREAD_USE_D4) || defined(__hpux)) && !defined(_CMA_SUPPRESS_EXTERNALS_)
+#    define _STLP_PTHREAD_ATTR_DEFAULT pthread_mutexattr_default
+#   else
+#    define _STLP_PTHREAD_ATTR_DEFAULT 0
+#   endif
+#  endif // !_STLP_USE_PTHREAD_SPINLOCK 
+
+# elif defined(_STLP_WIN32THREADS)
+#  if !defined (_STLP_WINDOWS_H_INCLUDED) && ! defined (_WINDOWS_H)
+#   if ! (defined ( _STLP_MSVC ) || defined (__BORLANDC__) || defined (__ICL) || defined (__WATCOMC__) || defined (__MINGW32__) || defined (__DMC__))
+#    ifdef _STLP_USE_MFC
+#     include <afx.h>
+#    else
+#     include <windows.h>
+#    endif
+#    define _STLP_WINDOWS_H_INCLUDED
+#   else 
+// This section serves as a replacement for windows.h header for Visual C++
+extern "C" {
+#   if (defined(_M_MRX000) || defined(_M_ALPHA) \
+       || (defined(_M_PPC) && (_MSC_VER >= 1000))) && !defined(RC_INVOKED)
+#    define InterlockedIncrement       _InterlockedIncrement
+#    define InterlockedDecrement       _InterlockedDecrement
+#    define InterlockedExchange        _InterlockedExchange
+#    define _STLP_STDCALL
+#   else
+#    ifdef _MAC
+#     define _STLP_STDCALL _cdecl
+#    else
+#     define _STLP_STDCALL __stdcall
+#    endif
+#   endif
+
+#if (_MSC_VER >= 1300) || defined (_STLP_NEW_PLATFORM_SDK)
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedIncrement(long volatile *);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedDecrement(long volatile *);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchange(long volatile *, long);
+#else
+  // boris : for the latest SDK, you may actually need the other version of the declaration (above)
+  // even for earlier VC++ versions. There is no way to tell SDK versions apart, sorry ...
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedIncrement(long*);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedDecrement(long*);
+_STLP_IMPORT_DECLSPEC long _STLP_STDCALL InterlockedExchange(long*, long);
+#endif
+
+_STLP_IMPORT_DECLSPEC void _STLP_STDCALL Sleep(unsigned long);
+_STLP_IMPORT_DECLSPEC void _STLP_STDCALL OutputDebugStringA( const char* lpOutputString );
+
+#ifdef _STLP_DEBUG
+typedef unsigned long DWORD;
+_STLP_IMPORT_DECLSPEC DWORD _STLP_STDCALL GetCurrentThreadId();
+#endif /* _STLP_DEBUG */
+
+#    if defined (InterlockedIncrement)
+#     pragma intrinsic(_InterlockedIncrement)
+#     pragma intrinsic(_InterlockedDecrement)
+#     pragma intrinsic(_InterlockedExchange)
+#    endif
+} /* extern "C" */
+
+#   endif /* STL_MSVC */
+
+#   define _STLP_WINDOWS_H_INCLUDED
+
+#  endif /* _STLP_WIN32 */
+
+#  ifndef _STLP_ATOMIC_INCREMENT
+#   define _STLP_ATOMIC_INCREMENT(__x)           InterlockedIncrement((long*)__x)
+#   define _STLP_ATOMIC_DECREMENT(__x)           InterlockedDecrement((long*)__x)
+#   define _STLP_ATOMIC_EXCHANGE(__x, __y)       InterlockedExchange((long*)__x, (long)__y)
+#  endif
+# elif defined(__DECC) || defined(__DECCXX)
+#  include <machine/builtins.h>
+#  define _STLP_ATOMIC_EXCHANGE __ATOMIC_EXCH_LONG
+#  define _STLP_ATOMIC_INCREMENT(__x) __ATOMIC_ADD_LONG(__x, 1)
+#  define _STLP_ATOMIC_DECREMENT(__x) __ATOMIC_ADD_LONG(__x, -1)
+# elif defined(_STLP_SPARC_SOLARIS_THREADS)
+#  include <stl/_sparc_atomic.h>
+# elif defined (_STLP_UITHREADS)
+// this inclusion is potential hazard to bring up all sorts
+// of old-style headers. Let's assume vendor already know how
+// to deal with that.
+#  include <ctime>
+# if defined (_STLP_USE_NAMESPACES) && ! defined (_STLP_VENDOR_GLOBAL_CSTD)
+using _STLP_VENDOR_CSTD::time_t;
+# endif
+#  include <synch.h>
+#  include <cstdio>
+#  include <stl/_cwchar.h>
+# elif defined (_STLP_BETHREADS)
+#  include <OS.h>
+#include <cassert>
+#include <stdio.h>
+#  define _STLP_MUTEX_INITIALIZER = { 0 }
+#elif defined(_STLP_OS2THREADS)
+# ifdef __GNUC__
+#  define INCL_DOSSEMAPHORES
+#  include <os2.h>
+# else
+  // This section serves to replace os2.h for VisualAge C++
+  typedef unsigned long ULONG;
+  #ifndef __HEV__  /* INCL_SEMAPHORE may also define HEV */
+    #define __HEV__
+    typedef ULONG HEV;
+    typedef HEV*  PHEV;
+  #endif
+  typedef ULONG APIRET;
+  typedef ULONG HMTX;
+  typedef HMTX*  PHMTX;
+  typedef const char*  PCSZ;
+  typedef ULONG BOOL32;
+  APIRET _System DosCreateMutexSem(PCSZ pszName, PHEV phev, ULONG flAttr, BOOL32 fState);
+  APIRET _System DosRequestMutexSem(HMTX hmtx, ULONG ulTimeout);
+  APIRET _System DosReleaseMutexSem(HMTX hmtx);
+  APIRET _System DosCloseMutexSem(HMTX hmtx);
+# define _STLP_MUTEX_INITIALIZER = { 0 };
+#  endif /* GNUC */
+# endif
+
+# ifndef _STLP_MUTEX_INITIALIZER
+#   if defined(_STLP_ATOMIC_EXCHANGE)
+// we are using our own spinlock. 
+#     define _STLP_MUTEX_INITIALIZER = { 0 }
+#   elif defined(_STLP_UITHREADS)
+// known case
+#     define _STLP_MUTEX_INITIALIZER = { DEFAULTMUTEX }
+#   else
+// we do not have static initializer available. therefore, on-demand synchronization is needed.
+#     define _STLP_MUTEX_INITIALIZER
+#     define _STLP_MUTEX_NEEDS_ONDEMAND_INITIALIZATION
+#   endif
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+#ifndef _STLP_USE_PTHREAD_SPINLOCK
+// Helper struct.  This is a workaround for various compilers that don't
+// handle static variables in inline functions properly.
+template <int __inst>
+struct _STLP_mutex_spin {
+  enum { __low_max = 30, __high_max = 1000 };
+  // Low if we suspect uniprocessor, high for multiprocessor.
+  static unsigned __max;
+  static unsigned __last;
+  static void _STLP_CALL _M_do_lock(volatile __stl_atomic_t* __lock);
+  static void _STLP_CALL _S_nsec_sleep(int __log_nsec);
+};
+#endif // !_STLP_USE_PTHREAD_SPINLOCK
+
+
+// Locking class.  Note that this class *does not have a constructor*.
+// It must be initialized either statically, with _STLP_MUTEX_INITIALIZER,
+// or dynamically, by explicitly calling the _M_initialize member function.
+// (This is similar to the ways that a pthreads mutex can be initialized.)
+// There are explicit member functions for acquiring and releasing the lock.
+
+// There is no constructor because static initialization is essential for
+// some uses, and only a class aggregate (see section 8.5.1 of the C++
+// standard) can be initialized that way.  That means we must have no
+// constructors, no base classes, no virtual functions, and no private or
+// protected members.
+
+// For non-static cases, clients should use  _STLP_mutex.
+
+struct _STLP_CLASS_DECLSPEC _STLP_mutex_base
+{
+#if defined(_STLP_ATOMIC_EXCHANGE) || defined(_STLP_SGI_THREADS)
+  // It should be relatively easy to get this to work on any modern Unix.
+  volatile __stl_atomic_t _M_lock;
+#endif
+
+#ifdef _STLP_THREADS
+
+# ifdef _STLP_ATOMIC_EXCHANGE
+  inline void _M_initialize() { _M_lock=0; }
+  inline void _M_destroy() {}
+
+  void _M_acquire_lock() {
+    _STLP_mutex_spin<0>::_M_do_lock(&_M_lock);
+  }
+
+  inline void _M_release_lock() {
+    volatile __stl_atomic_t* __lock = &_M_lock;
+#  if defined(_STLP_SGI_THREADS) && defined(__GNUC__) && __mips >= 3
+        asm("sync");
+        *__lock = 0;
+#  elif defined(_STLP_SGI_THREADS) && __mips >= 3 \
+	 && (defined (_ABIN32) || defined(_ABI64))
+        __lock_release(__lock);
+#  elif defined (_STLP_SPARC_SOLARIS_THREADS)
+#   if defined (__WORD64) || defined (__arch64__) || defined (__sparcv9) || defined (__sparcv8plus)
+	asm("membar #StoreStore ; membar #LoadStore");
+#   else
+	asm(" stbar ");
+#   endif
+        *__lock = 0;	
+#  else
+        *__lock = 0;
+        // This is not sufficient on many multiprocessors, since
+        // writes to protected variables and the lock may be reordered.
+#  endif
+  }
+# elif defined(_STLP_PTHREADS)
+#  ifdef _STLP_USE_PTHREAD_SPINLOCK
+  pthread_spinlock_t _M_lock;
+  inline void _M_initialize() { pthread_spin_init( &_M_lock, 0 ); }
+  inline void _M_destroy() { pthread_spin_destroy( &_M_lock ); }
+
+  inline void _M_acquire_lock() { 
+    // we do not care about race conditions here : there is only one thread at this point 
+    if(!_M_lock) pthread_spin_init( &_M_lock, 0 );
+
+    // fbp: here, initialization on demand should happen before the lock
+    // we use simple strategy as we are sure this only happens on initialization
+    pthread_spin_lock( &_M_lock );
+  }
+
+  inline void _M_acquire_lock_nodemand() { 
+    pthread_spin_lock( &_M_lock ); 
+  }
+  inline void _M_release_lock() { pthread_spin_unlock( &_M_lock ); }
+#  else // !_STLP_USE_PTHREAD_SPINLOCK
+  pthread_mutex_t _M_lock;
+
+  inline void _M_initialize() {
+    pthread_mutex_init(&_M_lock,_STLP_PTHREAD_ATTR_DEFAULT);
+  }
+  inline void _M_destroy() {
+    pthread_mutex_destroy(&_M_lock);
+  }
+  inline void _M_acquire_lock_nodemand() { 
+    pthread_mutex_lock(&_M_lock);
+  }
+
+  inline void _M_acquire_lock() { 
+#    if defined (__hpux) && !defined (PTHREAD_MUTEX_INITIALIZER)
+      if (!_M_lock.field1)  _M_initialize();
+#    endif
+     pthread_mutex_lock(&_M_lock);
+  }
+  inline void _M_release_lock() { pthread_mutex_unlock(&_M_lock); }
+#  endif // !_STLP_USE_PTHREAD_SPINLOCK
+  
+# elif defined (_STLP_UITHREADS)
+  mutex_t _M_lock;
+  inline void _M_initialize() {
+    mutex_init(&_M_lock,0,NULL);	
+  }
+  inline void _M_destroy() {
+    mutex_destroy(&_M_lock);
+  }
+  inline void _M_acquire_lock() { mutex_lock(&_M_lock); }
+  inline void _M_release_lock() { mutex_unlock(&_M_lock); }
+
+# elif defined(_STLP_OS2THREADS)
+  HMTX _M_lock;
+  inline void _M_initialize() { DosCreateMutexSem(NULL, &_M_lock, 0, false); }
+  inline void _M_destroy() { DosCloseMutexSem(_M_lock); }
+  inline void _M_acquire_lock_nodemand() {
+    DosRequestMutexSem(_M_lock, SEM_INDEFINITE_WAIT);
+  }  
+  inline void _M_acquire_lock() {
+    if(!_M_lock) _M_initialize();
+    DosRequestMutexSem(_M_lock, SEM_INDEFINITE_WAIT);
+  }
+  inline void _M_release_lock() { DosReleaseMutexSem(_M_lock); }
+# elif defined(_STLP_BETHREADS)
+  sem_id sem;
+  inline void _M_initialize() 
+  {
+     sem = create_sem(1, "STLPort");
+     assert(sem > 0);
+  }
+  inline void _M_destroy() 
+  {
+     int t = delete_sem(sem);
+     assert(t == B_NO_ERROR);
+  }
+  inline void _M_acquire_lock_nodemand()
+  {
+    status_t t;
+    t = acquire_sem(sem);
+    assert(t == B_NO_ERROR);
+  }
+  inline void _M_acquire_lock();
+  inline void _M_release_lock() 
+  {
+     status_t t = release_sem(sem);
+     assert(t == B_NO_ERROR);
+  }
+# else		//*ty 11/24/2001 - added configuration check
+#  error "Unknown thread facility configuration"
+# endif
+#else /* No threads */
+  inline void _M_initialize() {}
+  inline void _M_destroy() {}
+  inline void _M_acquire_lock() {}
+  inline void _M_release_lock() {}
+#endif // _STLP_PTHREADS
+};
+
+
+#if defined (_STLP_THREADS) && defined (_STLP_MUTEX_NEEDS_ONDEMAND_INITIALIZATION)
+// for use in _STLP_mutex, our purposes do not require ondemand initialization
+// also, mutex_base may use some hacks to determine uninitialized state by zero data, which only works for globals.
+class _STLP_CLASS_DECLSPEC _STLP_mutex_nodemand : public _STLP_mutex_base {
+  inline void _M_acquire_lock() { 
+    _M_acquire_lock_nodemand();
+  }
+};
+#else
+typedef _STLP_mutex_base _STLP_mutex_nodemand;
+#endif
+
+
+// Locking class.  The constructor initializes the lock, the destructor destroys it.
+// Well - behaving class, does not need static initializer
+class _STLP_CLASS_DECLSPEC _STLP_mutex : public _STLP_mutex_nodemand {
+  public:
+    inline _STLP_mutex () { _M_initialize(); }
+    inline ~_STLP_mutex () { _M_destroy(); }
+  private:
+    _STLP_mutex(const _STLP_mutex&);
+    void operator=(const _STLP_mutex&);
+};
+
+#if 0 /* def _STLP_DEBUG */
+/*
+ * Recursive Safe locking class.
+*/
+# ifndef _STLP_THREADS
+class _STLP_mutex_RS
+{};
+# else
+class _STLP_CLASS_DECLSPEC _STLP_mutex_RS : public _STLP_mutex
+{
+  public:
+    _STLP_mutex_RS()
+      : _count( 0 )
+#  if defined(_STLP_UITHREADS)
+        ,_id( __STATIC_CAST(thread_t,-1) )
+#  elif defined(_STLP_PTHREADS)
+#   if !defined(__FreeBSD__) && !defined(__DECCXX)
+        ,_id( __STATIC_CAST(pthread_t,-1) )
+#   else
+        ,_id( __STATIC_CAST(pthread_t,0) )
+#   endif /*__FreeBSD__*/
+#  elif defined(__FIT_NOVELL_THREADS)
+        ,_id( -1 )
+#  elif defined(_STLP_WIN32THREADS)
+        ,_id( NULL )
+#  else
+#   error "New _STLP_mutex_RS class not yet ported to this platform"
+#  endif
+    {}
+
+    ~_STLP_mutex_RS()
+    {}
+
+    void _M_acquire_lock() {
+#  if defined(_STLP_PTHREADS)
+      pthread_t _c_id = pthread_self();
+#  elif defined(_STLP_UITHREADS)
+      thread_t _c_id = thr_self();
+#  elif defined(__FIT_NOVELL_THREADS)
+      int _c_id = GetThreadID();
+#  elif defined(_STLP_WIN32THREADS)
+      DWORD _c_id = GetCurrentThreadId();
+#  endif
+      if ( _c_id == _id ) {
+        ++_count;
+        return;
+      }
+      _STLP_mutex::_M_acquire_lock();
+      _id = _c_id;
+      ++_count;
+    }
+
+    void _M_release_lock() {
+      if ( --_count == 0 ) {
+#  if defined(_STLP_UITHREADS)
+        _id = __STATIC_CAST(thread_t,-1);
+#  elif defined(_STLP_PTHREADS)
+#   if !defined(__FreeBSD__) && !defined(__DECCXX)
+        _id =  __STATIC_CAST(pthread_t,-1);
+#   else
+        _id =  __STATIC_CAST(pthread_t,0);
+#   endif /*__FreeBSD__*/
+#  elif defined(__FIT_NOVELL_THREADS)
+        _id = -1;
+#  elif defined(_STLP_WIN32THREADS)
+        _id = NULL;
+#  endif
+        _STLP_mutex::_M_release_lock();
+      }
+    }
+
+  protected:
+    unsigned int _count;
+
+#  if defined(_STLP_PTHREADS)
+    pthread_t _id;
+#  elif defined(_STLP_UITHREADS)
+    thread_t  _id;
+#  elif defined(__FIT_NOVELL_THREADS)
+    int _id;
+#  elif defined(_STLP_WIN32THREADS)
+    DWORD _id;
+#  endif
+};
+
+# endif /* _STLP_THREADS */
+
+#endif /* OBSOLETE, _STLP_DEBUG */
+
+
+/*
+ * Class _Refcount_Base provides a type, __stl_atomic_t, a data member,
+ * _M_ref_count, and member functions _M_incr and _M_decr, which perform
+ * atomic preincrement/predecrement.  The constructor initializes 
+ * _M_ref_count.
+ */
+struct _STLP_CLASS_DECLSPEC _Refcount_Base
+{
+  // The data member _M_ref_count
+  volatile __stl_atomic_t _M_ref_count;
+
+# if !defined (_STLP_ATOMIC_EXCHANGE)
+  _STLP_mutex _M_mutex;
+# endif
+
+  // Constructor
+  _Refcount_Base(__stl_atomic_t __n) : _M_ref_count(__n) {}
+
+  // _M_incr and _M_decr
+# if defined (_STLP_THREADS) && defined (_STLP_ATOMIC_EXCHANGE)
+   void _M_incr() { _STLP_ATOMIC_INCREMENT((__stl_atomic_t*)&_M_ref_count); }
+   void _M_decr() { _STLP_ATOMIC_DECREMENT((__stl_atomic_t*)&_M_ref_count); }
+# elif defined(_STLP_THREADS)
+  void _M_incr() {
+    _M_mutex._M_acquire_lock();
+    ++_M_ref_count;
+    _M_mutex._M_release_lock();
+  }
+  void _M_decr() {
+    _M_mutex._M_acquire_lock();
+    --_M_ref_count;
+    _M_mutex._M_release_lock();
+  }
+# else  /* No threads */
+  void _M_incr() { ++_M_ref_count; }
+  void _M_decr() { --_M_ref_count; }
+# endif
+};
+
+// Atomic swap on unsigned long
+// This is guaranteed to behave as though it were atomic only if all
+// possibly concurrent updates use _Atomic_swap.
+// In some cases the operation is emulated with a lock.
+# if defined (_STLP_THREADS)
+#  ifdef _STLP_ATOMIC_EXCHANGE
+inline __stl_atomic_t _Atomic_swap(volatile __stl_atomic_t * __p, __stl_atomic_t __q) {
+  return (__stl_atomic_t) _STLP_ATOMIC_EXCHANGE(__p,__q);
+}
+#  elif defined(_STLP_PTHREADS) || defined (_STLP_UITHREADS) || defined (_STLP_OS2THREADS) || defined(_STLP_USE_PTHREAD_SPINLOCK)
+// We use a template here only to get a unique initialized instance.
+template<int __dummy>
+struct _Swap_lock_struct {
+  static _STLP_STATIC_MUTEX _S_swap_lock;
+};
+
+
+// This should be portable, but performance is expected
+// to be quite awful.  This really needs platform specific
+// code.
+inline __stl_atomic_t _Atomic_swap(volatile __stl_atomic_t * __p, __stl_atomic_t __q) {
+  _Swap_lock_struct<0>::_S_swap_lock._M_acquire_lock();
+  __stl_atomic_t __result = *__p;
+  *__p = __q;
+  _Swap_lock_struct<0>::_S_swap_lock._M_release_lock();
+  return __result;
+}
+#  endif // _STLP_PTHREADS || _STLP_UITHREADS || _STLP_OS2THREADS || _STLP_USE_PTHREAD_SPINLOCK
+# else // !_STLP_THREADS
+/* no threads */
+static inline __stl_atomic_t  _STLP_CALL
+_Atomic_swap(volatile __stl_atomic_t * __p, __stl_atomic_t __q) {
+  __stl_atomic_t __result = *__p;
+  *__p = __q;
+  return __result;
+}
+# endif // _STLP_THREADS
+
+// A locking class that uses _STLP_STATIC_MUTEX.  The constructor takes
+// a reference to an _STLP_STATIC_MUTEX, and acquires a lock.  The destructor
+// releases the lock.
+
+struct _STLP_CLASS_DECLSPEC _STLP_auto_lock
+{
+  _STLP_STATIC_MUTEX& _M_lock;
+  
+  _STLP_auto_lock(_STLP_STATIC_MUTEX& __lock) : _M_lock(__lock)
+    { _M_lock._M_acquire_lock(); }
+  ~_STLP_auto_lock() { _M_lock._M_release_lock(); }
+
+private:
+  void operator=(const _STLP_auto_lock&);
+  _STLP_auto_lock(const _STLP_auto_lock&);
+};
+
+typedef _STLP_auto_lock _STLP_mutex_lock;
+
+#ifdef _STLP_BETHREADS
+
+template <int __inst>
+struct _STLP_beos_static_lock_data
+{
+	static bool is_init;
+	struct mutex_t : public _STLP_mutex
+	{
+		mutex_t()
+		{
+			_STLP_beos_static_lock_data<0>::is_init = true;
+		}
+		~mutex_t()
+		{
+			_STLP_beos_static_lock_data<0>::is_init = false;
+		}
+	};
+	static mutex_t mut;
+};
+
+template <int __inst>
+bool _STLP_beos_static_lock_data<__inst>::is_init = false;
+template <int __inst>
+typename _STLP_beos_static_lock_data<__inst>::mutex_t _STLP_beos_static_lock_data<__inst>::mut;
+
+
+inline void _STLP_mutex_base::_M_acquire_lock() 
+{
+	if(sem == 0)
+	{
+		// we need to initialise on demand here
+		// to prevent race conditions use our global
+		// mutex if it's available:
+		if(_STLP_beos_static_lock_data<0>::is_init)
+		{
+			_STLP_auto_lock al(_STLP_beos_static_lock_data<0>::mut);
+			if(sem == 0) _M_initialize();
+		}
+		else
+		{
+			// no lock available, we must still be
+			// in startup code, THERE MUST BE ONE THREAD
+			// ONLY active at this point.
+			_M_initialize();
+		}
+	}
+	_M_acquire_lock_nodemand();
+}
+
+#endif
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_threads.c>
+# endif
+
+#endif /* _STLP_INTERNAL_THREADS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/_time_facets.c b/src/STLport/stl/_time_facets.c
new file mode 100644
index 0000000..5f58deb
--- /dev/null
+++ b/src/STLport/stl/_time_facets.c
@@ -0,0 +1,497 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_TIME_FACETS_C
+#define _STLP_TIME_FACETS_C
+
+#ifndef _STLP_INTERNAL_TIME_FACETS_H
+# include <stl/_time_facets.h>
+#endif
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION)
+
+#ifndef _STLP_INTERNAL_NUM_PUT_H
+# include <stl/_num_put.h>
+#endif
+
+#ifndef _STLP_INTERNAL_NUM_GET_H
+# include <stl/_num_get.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//----------------------------------------------------------------------
+// Declarations of static template members.
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+
+template <class _CharT, class _InputIterator>
+locale::id time_get<_CharT, _InputIterator>::id;
+
+template <class _CharT, class _OutputIterator>
+locale::id time_put<_CharT, _OutputIterator>::id;
+
+# else /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+typedef time_get<char, const char*> time_get_char;
+typedef time_get<char, char*> time_get_char_2;
+typedef time_get<char, istreambuf_iterator<char, char_traits<char> > > time_get_char_3;
+typedef time_put<char, const char*> time_put_char;
+typedef time_put<char, char*> time_put_char_2;
+typedef time_put<char, ostreambuf_iterator<char, char_traits<char> > > time_put_char_3;
+
+__DECLARE_INSTANCE(locale::id, time_get_char::id, );
+__DECLARE_INSTANCE(locale::id, time_get_char_2::id, );
+__DECLARE_INSTANCE(locale::id, time_get_char_3::id, );
+__DECLARE_INSTANCE(locale::id, time_put_char::id, );
+__DECLARE_INSTANCE(locale::id, time_put_char_2::id, );
+__DECLARE_INSTANCE(locale::id, time_put_char_3::id, );
+
+# ifndef _STLP_NO_WCHAR_T
+
+typedef time_get<wchar_t, const wchar_t*> time_get_wchar_t;
+typedef time_get<wchar_t, wchar_t*> time_get_wchar_t_2;
+typedef time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > > time_get_wchar_t_3;
+typedef time_put<wchar_t, const wchar_t*> time_put_wchar_t;
+typedef time_put<wchar_t, wchar_t*> time_put_wchar_t_2;
+typedef time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > > time_put_wchar_t_3;
+
+__DECLARE_INSTANCE(locale::id, time_get_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, time_get_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, time_get_wchar_t_3::id, );
+__DECLARE_INSTANCE(locale::id, time_put_wchar_t::id, );
+__DECLARE_INSTANCE(locale::id, time_put_wchar_t_2::id, );
+__DECLARE_INSTANCE(locale::id, time_put_wchar_t_3::id, );
+
+# endif
+
+# endif /* ( _STLP_STATIC_TEMPLATE_DATA > 0 ) */
+
+template <class _InIt, class _RAIt, class _DiffType>
+_RAIt _STLP_CALL
+__match(_InIt& __first, _InIt& __last, _RAIt __name, _RAIt __name_end, _DiffType*) {
+  typedef _DiffType difference_type;
+  difference_type __n = __name_end - __name;
+  size_t __max_pos = 0;
+  difference_type __i;
+  difference_type __pos = 0;
+  difference_type __check_count = __n;
+  bool __do_check[_MAXNAMES];
+  _RAIt __matching_name[_MAX_NAME_LENGTH];
+
+  for (__i = 0; __i < __n; ++__i)
+    __max_pos = (max)(__max_pos,  __name[__i].size());
+
+  for (__i = 0; __i < _MAXNAMES; ++__i)
+    __do_check[__i] = true;
+
+
+
+  for (__i = 0; __i < _MAX_NAME_LENGTH; ++__i)
+    __matching_name[__i] = __name_end;
+
+  while (__first != __last) {
+    for (__i = 0; __i < __n; ++__i)
+      if (__do_check[__i])
+        if (*__first == __name[__i][__pos]) {
+          if (__pos == _DiffType(__name[__i].size()) - 1) {
+            __do_check[__i] = 0;
+            __matching_name[__pos+1] = __name + __i;
+            --__check_count;
+            if (__check_count == 0) {
+              ++__first; 
+	      return __name + __i;
+	    }
+          }
+        }
+        else {
+          __do_check[__i] = 0;
+          --__check_count;
+          if (__check_count == 0) 
+            return __matching_name[__pos];
+        }
+
+    ++__first; ++__pos;
+  }
+
+  return __matching_name[__pos];
+}
+
+template <class _InIt, class _RAIt>
+_RAIt _STLP_CALL
+__match(_InIt& __first, _InIt& __last, _RAIt __name, _RAIt __name_end) {
+  return __match((_InIt&)__first, (_InIt&)__last, __name, __name_end, _STLP_DISTANCE_TYPE(__name, _InIt));
+}
+
+// __get_formatted_time reads input that is assumed to be formatted
+// according to the rules for the C strftime function (C standard,
+// 7.12.3.5).  This function is used to implement the do_get_time
+// and do_get_date virtual functions, which depend on the locale
+// specifications for the time and day formats respectively.
+// Note the catchall default case, intended mainly for the '%Z'
+// format designator, which does not make sense here since the
+// representation of timezones is not part of the locale.
+//
+// The case branches are implemented either by doing a match using
+// the appopriate name table or by doing a __get_integer_nogroup.
+//
+// 'y' format is assumed to mean that the input represents years
+// since 1900.  That is, 2002 should be represented as 102.  There
+// is no century-guessing.
+//
+// The match is successful if and only if the second component of the
+// return value is format_end.
+
+// Note that the antepenultimate parameter is being used only to determine
+// the correct overloading for the calls to __get_integer_nogroup.
+
+template <class _InIt1, class _InIt2 /* , class _Ch */ >
+_InIt2 _STLP_CALL
+__get_formatted_time _STLP_WEAK (_InIt1 __first,  _InIt1 __last,
+                     _InIt2 __format, _InIt2 __format_end,
+				 /* _Ch, */ const _Time_Info& __table,
+		     ios_base::iostate& __err,
+                     tm*         __t) {
+  while(__first != __last && __format != __format_end) {
+    if (*__format == '%') {
+      ++__format;
+      char __c = *__format;
+      switch (__c) {
+        case 'a': {
+          const string* __pr =
+            __match(__first, __last,
+		    (string*)__table._M_dayname + 0 , (string*)__table._M_dayname + 7);
+            if (__pr == (string*)__table._M_dayname + 7)
+              return __format;
+            __t->tm_wday = (int)(__pr - (string*)__table._M_dayname);
+            break;
+        }
+
+        case 'A': {
+          const string* __pr =
+            __match(__first, __last,
+		    (string*)__table._M_dayname + 7, (string*)__table._M_dayname + 14);
+            if (__pr == (string*)__table._M_dayname + 14)
+              return __format;
+            __t->tm_wday = (int)(__pr - (string*)__table._M_dayname - 7);
+            break;
+        }
+
+        case 'b': {
+          const string* __pr =
+            __match(__first, __last,
+		    (string*)__table._M_monthname + 0, (string*)__table._M_monthname + 12);
+            if (__pr == (string*)__table._M_monthname + 12)
+              return __format;
+            __t->tm_mon = (int)(__pr - (string*)__table._M_monthname);
+            break;
+        }
+
+        case 'B': {
+          const string* __pr =
+            __match(__first, __last,
+		    (string*)__table._M_monthname + 12, (string*)__table._M_monthname + 24);
+            if (__pr == (string*)__table._M_monthname + 24)
+              return __format;
+            __t->tm_mon = (int)(__pr - (string*)__table._M_monthname - 12);
+            break;
+        }
+
+        case 'd': {
+          bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_mday);
+          if (!__pr || __t->tm_mday < 1 || __t->tm_mday > 31) {
+	    __err |= ios_base::failbit;
+            return __format;
+	  }
+          break;
+        }
+        
+        case 'H': case 'I': {
+          bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_hour);
+            if (!__pr)
+              return __format;
+            break;
+        }
+
+        case 'j': {
+          bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_yday);
+          if (!__pr)
+            return __format;
+          break;
+        }
+
+        case 'm': {
+          bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_mon);
+	    --__t->tm_mon;
+          if (!__pr || __t->tm_mon < 0 || __t->tm_mon > 11) {
+	    __err |= ios_base::failbit;
+            return __format;
+	  }
+          break;
+        }
+
+        case 'M': {
+          bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_min);
+          if (!__pr)
+            return __format;
+          break;
+        }
+
+        case 'p': {
+          const string* __pr =
+            __match(__first, __last, (string*)__table._M_am_pm + 0, (string*)__table._M_am_pm + 2);
+          if (__pr == (string*)__table._M_am_pm + 2)
+            return __format;
+          if (__pr == (string*)__table._M_am_pm + 1)
+            __t->tm_hour += 12;
+          break;
+        }
+
+        case 'S': {
+          bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_sec);
+          if (!__pr)
+            return __format;
+          break;
+        }
+
+	case 'y': {
+	  bool __pr =
+	    __get_decimal_integer(__first, __last, __t->tm_year);
+	  if (!__pr)
+	    return __format;
+	  break;
+        }
+
+        case 'Y': {
+	  bool __pr =
+            __get_decimal_integer(__first, __last, __t->tm_year);
+          __t->tm_year -= 1900;
+          if (!__pr)
+            return __format;
+          break;
+        }
+
+        default:
+          break;
+      }
+
+    }
+    else {
+      if (*__first++ != *__format) break;
+    }
+    
+    ++__format;
+  }
+
+  return __format;
+}
+
+template <class _InIt>
+bool _STLP_CALL
+__get_short_or_long_dayname(_InIt& __first, _InIt& __last,
+                            const _Time_Info& __table, tm* __t) {
+  const string* __pr =
+    __match(__first, __last, __table._M_dayname + 0, __table._M_dayname + 14);
+  __t->tm_wday = (int)(__pr - __table._M_dayname) % 7;
+  return __pr != __table._M_dayname + 14;
+}
+
+template <class _InIt>
+bool _STLP_CALL
+__get_short_or_long_monthname(_InIt& __first, _InIt& __last,
+                              const _Time_Info& __table, tm* __t) {
+  const string* __pr =
+    __match(__first, __last, (string*)__table._M_monthname + 0, (string*)__table._M_monthname + 24);
+  __t->tm_mon = (int)(__pr - __table._M_monthname) % 12;
+  return __pr != __table._M_monthname + 24;
+}
+
+# ifndef _STLP_NO_WCHAR_T
+template <class _OuIt>
+_OuIt _STLP_CALL
+__put_time(char * __first, char * __last, _OuIt __out,
+           const ios_base& __s, wchar_t) {
+    const ctype<wchar_t>& __ct = *(ctype<wchar_t>*)__s._M_ctype_facet();
+    wchar_t __wbuf[64];
+    __ct.widen(__first, __last, __wbuf);
+    ptrdiff_t __len = __last - __first;
+    wchar_t * __eend = __wbuf + __len;
+    return copy((wchar_t*)__wbuf, __eend, __out);
+}
+# endif
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_date(_InIt __s, _InIt  __end,
+				  ios_base& /* __str */, ios_base::iostate&  __err,
+				  tm* __t) const 
+{
+  typedef string::const_iterator string_iterator;
+
+  string_iterator __format
+    = _M_timeinfo._M_date_format.begin();
+  string_iterator __format_end
+    = _M_timeinfo._M_date_format.end();
+  
+  string_iterator __result
+    = __get_formatted_time(__s, __end, __format, __format_end,
+                           /* _Ch() ,*/  _M_timeinfo, __err, __t);
+  if (__result == __format_end)
+    __err = ios_base::goodbit;
+  else {
+    __err = ios_base::failbit;
+    if (__s == __end)
+      __err |= ios_base::eofbit;
+  }
+  return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_time(_InIt __s, _InIt  __end,
+				  ios_base& /* __str */, ios_base::iostate&  __err,
+				  tm* __t) const 
+{
+  typedef string::const_iterator string_iterator;
+  string_iterator __format
+    = _M_timeinfo._M_time_format.begin();
+  string_iterator __format_end
+    = _M_timeinfo._M_time_format.end();
+  
+  string_iterator __result
+    = __get_formatted_time(__s, __end, __format, __format_end,
+			   /* _Ch() , */ _M_timeinfo, __err, __t);
+  __err = __result == __format_end ? ios_base::goodbit 
+    : ios_base::failbit;
+  if (__s == __end)
+    __err |= ios_base::eofbit;
+  return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_year(_InIt __s, _InIt  __end,
+				  ios_base&, 
+				  ios_base::iostate&  __err,
+				  tm* __t) const
+{
+  
+  if (__s == __end) {
+    __err = ios_base::failbit | ios_base::eofbit;
+    return __s;
+  }
+  
+  bool __pr =  __get_decimal_integer(__s, __end, __t->tm_year);
+  __t->tm_year -= 1900;
+  __err = __pr ? ios_base::goodbit : ios_base::failbit;
+  if (__s == __end)
+    __err |= ios_base::eofbit;
+  
+  return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_weekday(_InIt __s, _InIt  __end,
+				     ios_base& /* __str */, 
+				     ios_base::iostate&  __err,
+				     tm* __t) const 
+{
+    bool __result =
+      __get_short_or_long_dayname(__s, __end, _M_timeinfo, __t);
+    if (__result)
+      __err = ios_base::goodbit;
+    else {
+      __err = ios_base::failbit;
+      if (__s == __end)
+        __err |= ios_base::eofbit;
+    }
+    return __s;
+}
+
+template <class _Ch, class _InIt>
+_InIt
+time_get<_Ch, _InIt>::do_get_monthname(_InIt __s, _InIt  __end,
+				       ios_base& /* __str */, 
+				       ios_base::iostate&  __err,
+				       tm* __t) const 
+{
+  bool __result =
+    __get_short_or_long_monthname(__s, __end, _M_timeinfo, __t);
+  if (__result)
+    __err = ios_base::goodbit;
+  else {
+    __err = ios_base::failbit;
+    if (__s == __end)
+      __err |= ios_base::eofbit;
+  }
+  return __s;
+}
+
+template<class _Ch, class _OutputIter>
+_OutputIter
+time_put<_Ch,_OutputIter>::put(_OutputIter __s, ios_base& __f, _Ch __fill,
+			       const tm* __tmb,
+			       const _Ch* __pat, const _Ch* __pat_end) const 
+{
+  //  locale __loc = __f.getloc();
+  //  const ctype<_Ch>& _Ct = use_facet<ctype<_Ch> >(__loc); 
+  const ctype<_Ch>& _Ct = *(ctype<_Ch>*)__f._M_ctype_facet(); 
+  while (__pat != __pat_end) {
+    char __c = _Ct.narrow(*__pat, 0);
+    if (__c == '%') {
+      char __mod = 0;
+      ++__pat;
+      __c = _Ct.narrow(*__pat++, 0);
+      if(__c == '#') { // MS extension
+        __mod = __c;
+        __c = _Ct.narrow(*__pat++, 0);
+      }
+      __s = do_put(__s, __f, __fill, __tmb, __c, __mod);
+    }
+    else
+      *__s++ = *__pat++;
+  }
+  return __s;
+}
+
+template<class _Ch, class _OutputIter>
+_OutputIter
+time_put<_Ch,_OutputIter>::do_put(_OutputIter __s, ios_base& __f, _Ch     /* __fill */ ,
+				  const tm* __tmb,
+				  char __format, char __modifier ) const 
+{
+  char __buf[64];
+  char * __iend = __write_formatted_time(__buf, __format, __modifier,
+					 _M_timeinfo, __tmb);
+  //  locale __loc = __f.getloc();
+  return __put_time(__buf, __iend, __s, __f, _Ch());
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) */
+#endif /* _STLP_TIME_FACETS_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_time_facets.h b/src/STLport/stl/_time_facets.h
new file mode 100644
index 0000000..4d777ca
--- /dev/null
+++ b/src/STLport/stl/_time_facets.h
@@ -0,0 +1,315 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: This is an internal header file, included by other C++
+// standard library headers.  You should not attempt to use this header
+// file directly.
+
+
+#ifndef _STLP_INTERNAL_TIME_FACETS_H
+#define _STLP_INTERNAL_TIME_FACETS_H
+
+#ifndef _STLP_CTIME
+# include <ctime>                // Needed (for struct tm) by time facets
+#endif
+
+#include <stl/c_locale.h>
+#include <stl/_ios_base.h>
+
+_STLP_BEGIN_NAMESPACE
+
+// Template functions used by time_get
+
+// Matching input against a list of names
+
+// Alphabetic input of the names of months and the names
+// of weekdays requires matching input against a list of names.
+// We use a simple generic algorithm to accomplish this.  This
+// algorithm is not very efficient, especially for longer lists
+// of names, but it probably does not matter for the initial
+// implementation and it may never matter, since we do not expect
+// this kind of input to be used very often.  The algorithm
+// could be improved fairly simply by creating a new list of
+// names still in the running at each iteration.  A more sophisticated
+// approach would be to build a trie to do the matching.
+//
+// We compare each character of the input to the corresponding
+// character of each name on the list that has not been eliminated,
+// either because every character in the name has already been
+// matched, or because some character has not been matched.  We
+// continue only as long as there are some names that have not been
+// eliminated.
+
+// We do not really need a random access iterator (a forward iterator
+// would do), but the extra generality makes the notation clumsier,
+// and we don't really need it.
+
+// We can recognize a failed match by the fact that the second
+// component of the return value will be __name_end.
+
+#define _MAXNAMES        64
+#define _MAX_NAME_LENGTH 64
+
+// Both time_get and time_put need a structure of type _Time_Info
+// to provide names and abbreviated names for months and days,
+// as well as the am/pm designator.  The month and weekday tables
+// have the all the abbreviated names before all the full names.
+// The _Time_Info tables are initialized using the non-template
+// function _Init_timeinfo, which has two overloadings:  one
+// with a single reference parameter for the table to be initialized,
+// and one with a second _Locale_time * parameter.  The first form
+// is called by the default constructor and the second by a special
+// constructor invoked from the _byname subclass constructor to
+// construct the base class.
+
+class _STLP_CLASS_DECLSPEC _Time_Info {
+public:
+  string _M_dayname[14];
+  string _M_monthname[24];
+  string _M_am_pm[2];
+  string _M_time_format;
+  string _M_date_format;
+  string _M_date_time_format;
+  string _M_long_date_format;
+  string _M_long_date_time_format;
+};
+
+void _STLP_CALL _Init_timeinfo(_Time_Info&);
+void _STLP_CALL _Init_timeinfo(_Time_Info&, _Locale_time*);
+
+class _STLP_CLASS_DECLSPEC time_base {
+public:
+  enum dateorder {no_order, dmy, mdy, ymd, ydm};
+};
+
+
+template <class _Ch, __DFL_TMPL_PARAM( _InIt , istreambuf_iterator<_Ch>) >
+class time_get : public locale::facet, public time_base 
+{
+  friend class _Locale;
+
+public:
+  typedef _Ch   char_type;
+  typedef _InIt iter_type;
+
+  explicit time_get(size_t __refs = 0)   : _BaseFacet(__refs) {
+      _Init_timeinfo(_M_timeinfo);
+  }
+  dateorder date_order() const { return do_date_order(); }
+  iter_type get_time(iter_type __s, iter_type  __end, ios_base&  __str,
+                     ios_base::iostate&  __err, tm* __t) const
+    { return do_get_time(__s,  __end,  __str,  __err, __t); }
+  iter_type get_date(iter_type __s, iter_type  __end, ios_base&  __str,
+                     ios_base::iostate&  __err, tm* __t) const
+    { return do_get_date(__s,  __end,  __str,  __err, __t); }
+  iter_type get_weekday(iter_type __s, iter_type  __end, ios_base&  __str,
+                        ios_base::iostate&  __err, tm* __t) const
+    { return do_get_weekday(__s,  __end,  __str,  __err, __t); }
+  iter_type get_monthname(iter_type __s, iter_type  __end, ios_base&  __str,
+                          ios_base::iostate&  __err, tm* __t) const
+    { return do_get_monthname(__s,  __end,  __str,  __err, __t); }
+  iter_type get_year(iter_type __s, iter_type  __end, ios_base&  __str,
+                     ios_base::iostate&  __err, tm* __t) const
+    { return do_get_year(__s,  __end,  __str,  __err, __t); }
+
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+
+protected:
+  _Time_Info _M_timeinfo;
+
+  time_get(_Locale_time *, size_t __refs) : _BaseFacet(__refs) {}
+
+  ~time_get() {}
+
+  virtual dateorder do_date_order() const {return no_order;}
+    
+  virtual iter_type do_get_time(iter_type __s, iter_type  __end,
+                                ios_base&, ios_base::iostate&  __err,
+                                tm* __t) const;
+    
+  virtual iter_type do_get_date(iter_type __s, iter_type  __end,
+                                ios_base&, ios_base::iostate& __err,
+                                tm* __t) const;
+
+  virtual iter_type do_get_weekday(iter_type __s, iter_type  __end,
+                                   ios_base&,
+                                   ios_base::iostate& __err,
+                                   tm* __t) const;
+  virtual iter_type do_get_monthname(iter_type __s, iter_type  __end,
+                                     ios_base&,
+                                     ios_base::iostate& __err,
+                                     tm* __t) const;
+  
+  virtual iter_type do_get_year(iter_type __s, iter_type  __end,
+                                ios_base&, ios_base::iostate& __err,
+                                tm* __t) const;
+};
+
+time_base::dateorder _STLP_CALL
+__get_date_order(_Locale_time*);
+_Locale_time* _STLP_CALL __acquire_time(const char* __name);
+void          _STLP_CALL __release_time(_Locale_time* __time);
+
+template <class _Ch, __DFL_TMPL_PARAM( _InIt , istreambuf_iterator<_Ch>) >
+class time_get_byname : public time_get<_Ch, _InIt> 
+{
+public:
+  typedef  time_base::dateorder dateorder;
+  typedef _InIt                 iter_type;
+
+  explicit time_get_byname(const char* __name, size_t __refs = 0)
+    : time_get<_Ch, _InIt>((_Locale_time*) 0, __refs),
+      _M_time(__acquire_time(__name))
+    { _Init_timeinfo(this->_M_timeinfo, this->_M_time); }
+
+protected:
+  ~time_get_byname() { __release_time(_M_time); }
+  dateorder do_date_order() const { return __get_date_order(_M_time); }
+private:
+  _Locale_time* _M_time;
+};
+
+// time_put facet
+
+// For the formats 'x, 'X', and 'c', do_put calls the first form of
+// put with the pattern obtained from _M_timeinfo._M_date_format or
+// _M_timeinfo._M_time_format.
+
+// Helper function:  __  takes a single-character
+// format.  As indicated by the foregoing remark, this will never be
+// 'x', 'X', or 'c'.
+
+char * _STLP_CALL
+__write_formatted_time(char * __buf, char __format, char __modifier,
+                       const _Time_Info& __table, const tm* __t);
+
+template <class _OuIt>
+inline _OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt __out,
+                                   const ios_base& /* __loc */, char) {
+    return copy(__first, __last, __out);
+}
+
+# ifndef _STLP_NO_WCHAR_T
+template <class _OuIt>
+_OuIt _STLP_CALL __put_time(char * __first, char * __last, _OuIt __out,
+                            const ios_base& __s, wchar_t);
+# endif
+
+template<class _Ch, __DFL_TMPL_PARAM( _OutputIter , ostreambuf_iterator<_Ch> ) >
+class time_put : public locale::facet, public time_base
+{
+  friend class _Locale;
+public:
+  typedef _Ch      char_type;
+  typedef _OutputIter iter_type;
+
+  explicit time_put(size_t __refs = 0) : _BaseFacet(__refs) {
+    _Init_timeinfo(_M_timeinfo);
+  }
+
+  _OutputIter put(iter_type __s, ios_base& __f, _Ch __fill,
+		  const tm* __tmb,
+		  const _Ch* __pat, const _Ch* __pat_end) const;
+  
+  _OutputIter put(iter_type __s, ios_base& __f, _Ch  __fill,
+		  const tm* __tmb, char __format, char __modifier = 0) const { 
+    return do_put(__s, __f,  __fill, __tmb, __format, __modifier); 
+  }
+  
+  _STLP_STATIC_MEMBER_DECLSPEC static locale::id id;
+  
+protected:
+  _Time_Info _M_timeinfo;
+
+  time_put(_Locale_time* /*__time*/, size_t __refs) : _BaseFacet(__refs) {
+    //    _Init_timeinfo(_M_timeinfo, __time);
+  }
+
+  ~time_put() {}
+  virtual iter_type do_put(iter_type __s, ios_base& __f,
+                           char_type  /* __fill */, const tm* __tmb,
+                           char __format, char /* __modifier */) const;
+};
+
+template <class _Ch, __DFL_TMPL_PARAM( _InIt , ostreambuf_iterator<_Ch> ) >
+class time_put_byname : public time_put<_Ch, _InIt> 
+{
+  friend class _Locale;
+public:
+  typedef time_base::dateorder dateorder;
+  typedef _InIt iter_type;
+  typedef _Ch   char_type;
+
+  explicit time_put_byname(const char * __name, size_t __refs = 0)
+    : time_put<_Ch, _InIt>((_Locale_time*) 0, __refs),
+    _M_time(__acquire_time(__name))
+  { _Init_timeinfo(this->_M_timeinfo, this->_M_time); }
+  
+protected:
+  ~time_put_byname() { __release_time(_M_time); }
+
+private:
+  _Locale_time* _M_time;
+};
+
+# ifdef _STLP_USE_TEMPLATE_EXPORT
+_STLP_EXPORT_TEMPLATE_CLASS time_get<char, istreambuf_iterator<char, char_traits<char> > >;
+_STLP_EXPORT_TEMPLATE_CLASS time_put<char, ostreambuf_iterator<char, char_traits<char> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS time_get<char, const char*>;
+// _STLP_EXPORT_TEMPLATE_CLASS time_put<char, char*>;
+#  ifndef _STLP_NO_WCHAR_T
+_STLP_EXPORT_TEMPLATE_CLASS time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+_STLP_EXPORT_TEMPLATE_CLASS time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >;
+// _STLP_EXPORT_TEMPLATE_CLASS time_get<wchar_t, const wchar_t*>;
+// _STLP_EXPORT_TEMPLATE_CLASS time_put<wchar_t, wchar_t*>;
+#  endif /* INSTANTIATE_WIDE_STREAMS */
+
+# endif
+
+# if defined (__BORLANDC__) && defined (_RTLDLL)
+inline void _Stl_loc_init_time_facets() {
+  
+  time_get<char, istreambuf_iterator<char, char_traits<char> > >::id._M_index                      = 16;
+  time_get<char, const char*>::id._M_index         = 17;
+  time_put<char, ostreambuf_iterator<char, char_traits<char> > >::id._M_index                      = 18;
+  time_put<char, char*>::id._M_index               = 19;
+  
+# ifndef _STLP_NO_WCHAR_T
+  
+  time_get<wchar_t, istreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index                   = 35;
+  time_get<wchar_t, const wchar_t*>::id._M_index   = 36;
+  time_put<wchar_t, ostreambuf_iterator<wchar_t, char_traits<wchar_t> > >::id._M_index                   = 37;
+  time_put<wchar_t, wchar_t*>::id._M_index         = 38;
+  
+# endif
+  
+}
+# endif
+
+_STLP_END_NAMESPACE
+
+#if defined (_STLP_EXPOSE_STREAM_IMPLEMENTATION) && !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_time_facets.c>
+# endif
+
+#endif /* _STLP_INTERNAL_TIME_FACETS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/_tree.c b/src/STLport/stl/_tree.c
new file mode 100644
index 0000000..eb056fd
--- /dev/null
+++ b/src/STLport/stl/_tree.c
@@ -0,0 +1,715 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ * Modified CRP 7/10/00 for improved conformance / efficiency on insert_unique /
+ * insert_equal with valid hint -- efficiency is improved all around, and it is
+ * should now be standard conforming for complexity on insert point immediately
+ * after hint (amortized constant time).
+ *
+ */
+#ifndef _STLP_TREE_C
+#define _STLP_TREE_C
+
+#ifndef _STLP_INTERNAL_TREE_H
+# include <stl/_tree.h>
+#endif
+
+// fbp: these defines are for outline methods definitions.
+// needed for definitions to be portable. Should not be used in method bodies.
+# if defined  ( _STLP_NESTED_TYPE_PARAM_BUG )
+#  define __iterator__        _Rb_tree_iterator<_Value, _Nonconst_traits<_Value> > 
+#  define __size_type__       size_t
+#  define iterator __iterator__
+# else
+#  define __iterator__  _STLP_TYPENAME_ON_RETURN_TYPE _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::iterator
+#  define __size_type__  _STLP_TYPENAME_ON_RETURN_TYPE _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>::size_type
+# endif
+
+#if defined ( _STLP_DEBUG)
+#  define _Rb_tree __WORKAROUND_DBG_RENAME(Rb_tree)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+template <class _Dummy> void _STLP_CALL
+_Rb_global<_Dummy>::_Rotate_left(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
+{
+  _Rb_tree_node_base* __y = __x->_M_right;
+  __x->_M_right = __y->_M_left;
+  if (__y->_M_left !=0)
+    __y->_M_left->_M_parent = __x;
+  __y->_M_parent = __x->_M_parent;
+
+  if (__x == __root)
+    __root = __y;
+  else if (__x == __x->_M_parent->_M_left)
+    __x->_M_parent->_M_left = __y;
+  else
+    __x->_M_parent->_M_right = __y;
+  __y->_M_left = __x;
+  __x->_M_parent = __y;
+}
+
+template <class _Dummy> void _STLP_CALL 
+_Rb_global<_Dummy>::_Rotate_right(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root)
+{
+  _Rb_tree_node_base* __y = __x->_M_left;
+  __x->_M_left = __y->_M_right;
+  if (__y->_M_right != 0)
+    __y->_M_right->_M_parent = __x;
+  __y->_M_parent = __x->_M_parent;
+
+  if (__x == __root)
+    __root = __y;
+  else if (__x == __x->_M_parent->_M_right)
+    __x->_M_parent->_M_right = __y;
+  else
+    __x->_M_parent->_M_left = __y;
+  __y->_M_right = __x;
+  __x->_M_parent = __y;
+}
+
+template <class _Dummy> void _STLP_CALL
+_Rb_global<_Dummy>::_Rebalance(_Rb_tree_node_base* __x, 
+			       _Rb_tree_node_base*& __root)
+{
+  __x->_M_color = _S_rb_tree_red;
+  while (__x != __root && __x->_M_parent->_M_color == _S_rb_tree_red) {
+    if (__x->_M_parent == __x->_M_parent->_M_parent->_M_left) {
+      _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_right;
+      if (__y && __y->_M_color == _S_rb_tree_red) {
+        __x->_M_parent->_M_color = _S_rb_tree_black;
+        __y->_M_color = _S_rb_tree_black;
+        __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+        __x = __x->_M_parent->_M_parent;
+      }
+      else {
+        if (__x == __x->_M_parent->_M_right) {
+          __x = __x->_M_parent;
+          _Rotate_left(__x, __root);
+        }
+        __x->_M_parent->_M_color = _S_rb_tree_black;
+        __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+        _Rotate_right(__x->_M_parent->_M_parent, __root);
+      }
+    }
+    else {
+      _Rb_tree_node_base* __y = __x->_M_parent->_M_parent->_M_left;
+      if (__y && __y->_M_color == _S_rb_tree_red) {
+        __x->_M_parent->_M_color = _S_rb_tree_black;
+        __y->_M_color = _S_rb_tree_black;
+        __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+        __x = __x->_M_parent->_M_parent;
+      }
+      else {
+        if (__x == __x->_M_parent->_M_left) {
+          __x = __x->_M_parent;
+          _Rotate_right(__x, __root);
+        }
+        __x->_M_parent->_M_color = _S_rb_tree_black;
+        __x->_M_parent->_M_parent->_M_color = _S_rb_tree_red;
+        _Rotate_left(__x->_M_parent->_M_parent, __root);
+      }
+    }
+  }
+  __root->_M_color = _S_rb_tree_black;
+}
+
+template <class _Dummy> _Rb_tree_node_base* _STLP_CALL
+_Rb_global<_Dummy>::_Rebalance_for_erase(_Rb_tree_node_base* __z,
+					 _Rb_tree_node_base*& __root,
+					 _Rb_tree_node_base*& __leftmost,
+					 _Rb_tree_node_base*& __rightmost)
+{
+  _Rb_tree_node_base* __y = __z;
+  _Rb_tree_node_base* __x = 0;
+  _Rb_tree_node_base* __x_parent = 0;
+  if (__y->_M_left == 0)     // __z has at most one non-null child. y == z.
+    __x = __y->_M_right;     // __x might be null.
+  else
+    if (__y->_M_right == 0)  // __z has exactly one non-null child. y == z.
+      __x = __y->_M_left;    // __x is not null.
+    else {                   // __z has two non-null children.  Set __y to
+      __y = __y->_M_right;   //   __z's successor.  __x might be null.
+      while (__y->_M_left != 0)
+        __y = __y->_M_left;
+      __x = __y->_M_right;
+    }
+  if (__y != __z) {          // relink y in place of z.  y is z's successor
+    __z->_M_left->_M_parent = __y; 
+    __y->_M_left = __z->_M_left;
+    if (__y != __z->_M_right) {
+      __x_parent = __y->_M_parent;
+      if (__x) __x->_M_parent = __y->_M_parent;
+      __y->_M_parent->_M_left = __x;      // __y must be a child of _M_left
+      __y->_M_right = __z->_M_right;
+      __z->_M_right->_M_parent = __y;
+    }
+    else
+      __x_parent = __y;  
+    if (__root == __z)
+      __root = __y;
+    else if (__z->_M_parent->_M_left == __z)
+      __z->_M_parent->_M_left = __y;
+    else 
+      __z->_M_parent->_M_right = __y;
+    __y->_M_parent = __z->_M_parent;
+    _STLP_STD::swap(__y->_M_color, __z->_M_color);
+    __y = __z;
+    // __y now points to node to be actually deleted
+  }
+  else {                        // __y == __z
+    __x_parent = __y->_M_parent;
+    if (__x) __x->_M_parent = __y->_M_parent;   
+    if (__root == __z)
+      __root = __x;
+    else 
+      if (__z->_M_parent->_M_left == __z)
+        __z->_M_parent->_M_left = __x;
+      else
+        __z->_M_parent->_M_right = __x;
+    if (__leftmost == __z) 
+      if (__z->_M_right == 0)        // __z->_M_left must be null also
+        __leftmost = __z->_M_parent;
+    // makes __leftmost == _M_header if __z == __root
+      else
+        __leftmost = _Rb_tree_node_base::_S_minimum(__x);
+    if (__rightmost == __z)  
+      if (__z->_M_left == 0)         // __z->_M_right must be null also
+        __rightmost = __z->_M_parent;  
+    // makes __rightmost == _M_header if __z == __root
+      else                      // __x == __z->_M_left
+        __rightmost = _Rb_tree_node_base::_S_maximum(__x);
+  }
+  if (__y->_M_color != _S_rb_tree_red) { 
+    while (__x != __root && (__x == 0 || __x->_M_color == _S_rb_tree_black))
+      if (__x == __x_parent->_M_left) {
+        _Rb_tree_node_base* __w = __x_parent->_M_right;
+        if (__w->_M_color == _S_rb_tree_red) {
+          __w->_M_color = _S_rb_tree_black;
+          __x_parent->_M_color = _S_rb_tree_red;
+          _Rotate_left(__x_parent, __root);
+          __w = __x_parent->_M_right;
+        }
+        if ((__w->_M_left == 0 || 
+             __w->_M_left->_M_color == _S_rb_tree_black) && (__w->_M_right == 0 || 
+             __w->_M_right->_M_color == _S_rb_tree_black)) {
+          __w->_M_color = _S_rb_tree_red;
+          __x = __x_parent;
+          __x_parent = __x_parent->_M_parent;
+        } else {
+          if (__w->_M_right == 0 || 
+              __w->_M_right->_M_color == _S_rb_tree_black) {
+            if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black;
+            __w->_M_color = _S_rb_tree_red;
+            _Rotate_right(__w, __root);
+            __w = __x_parent->_M_right;
+          }
+          __w->_M_color = __x_parent->_M_color;
+          __x_parent->_M_color = _S_rb_tree_black;
+          if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black;
+          _Rotate_left(__x_parent, __root);
+          break;
+        }
+      } else {                  // same as above, with _M_right <-> _M_left.
+        _Rb_tree_node_base* __w = __x_parent->_M_left;
+        if (__w->_M_color == _S_rb_tree_red) {
+          __w->_M_color = _S_rb_tree_black;
+          __x_parent->_M_color = _S_rb_tree_red;
+          _Rotate_right(__x_parent, __root);
+          __w = __x_parent->_M_left;
+        }
+        if ((__w->_M_right == 0 || 
+             __w->_M_right->_M_color == _S_rb_tree_black) && (__w->_M_left == 0 || 
+             __w->_M_left->_M_color == _S_rb_tree_black)) {
+          __w->_M_color = _S_rb_tree_red;
+          __x = __x_parent;
+          __x_parent = __x_parent->_M_parent;
+        } else {
+          if (__w->_M_left == 0 || 
+              __w->_M_left->_M_color == _S_rb_tree_black) {
+            if (__w->_M_right) __w->_M_right->_M_color = _S_rb_tree_black;
+            __w->_M_color = _S_rb_tree_red;
+            _Rotate_left(__w, __root);
+            __w = __x_parent->_M_left;
+          }
+          __w->_M_color = __x_parent->_M_color;
+          __x_parent->_M_color = _S_rb_tree_black;
+          if (__w->_M_left) __w->_M_left->_M_color = _S_rb_tree_black;
+          _Rotate_right(__x_parent, __root);
+          break;
+        }
+      }
+    if (__x) __x->_M_color = _S_rb_tree_black;
+  }
+  return __y;
+}
+
+template <class _Dummy> _Rb_tree_node_base* _STLP_CALL
+_Rb_global<_Dummy>::_M_decrement(_Rb_tree_node_base* _M_node)
+{
+  if (_M_node->_M_color == _S_rb_tree_red && _M_node->_M_parent->_M_parent == _M_node)
+    _M_node = _M_node->_M_right;
+  else if (_M_node->_M_left != 0) {
+    _Base_ptr __y = _M_node->_M_left;
+    while (__y->_M_right != 0)
+      __y = __y->_M_right;
+    _M_node = __y;
+  }
+  else {
+    _Base_ptr __y = _M_node->_M_parent;
+    while (_M_node == __y->_M_left) {
+      _M_node = __y;
+      __y = __y->_M_parent;
+    }
+    _M_node = __y;
+  }
+  return _M_node;
+}
+
+template <class _Dummy> _Rb_tree_node_base* _STLP_CALL
+_Rb_global<_Dummy>::_M_increment(_Rb_tree_node_base* _M_node)
+{
+  if (_M_node->_M_right != 0) {
+    _M_node = _M_node->_M_right;
+    while (_M_node->_M_left != 0)
+      _M_node = _M_node->_M_left;
+  }
+  else {
+    _Base_ptr __y = _M_node->_M_parent;
+    while (_M_node == __y->_M_right) {
+      _M_node = __y;
+      __y = __y->_M_parent;
+    }
+    if (_M_node->_M_right != __y)
+      _M_node = __y;
+  }
+  return _M_node;
+}
+
+#endif /* defined (__BUILDING_STLPORT) || ! defined (_STLP_OWN_IOSTREAMS) */
+
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x)
+{
+  if (this != &__x) {
+                                // Note that _Key may be a constant type.
+    clear();
+    _M_node_count = 0;
+    _M_key_compare = __x._M_key_compare;        
+    if (__x._M_root() == 0) {
+      _M_root() = 0;
+      _M_leftmost() = this->_M_header._M_data;
+      _M_rightmost() = this->_M_header._M_data;
+    }
+    else {
+      _M_root() = _M_copy(__x._M_root(), this->_M_header._M_data);
+      _M_leftmost() = _S_minimum(_M_root());
+      _M_rightmost() = _S_maximum(_M_root());
+      _M_node_count = __x._M_node_count;
+    }
+  }
+  return *this;
+}
+
+// CRP 7/10/00 inserted argument __w_, which is another hint (meant to
+// act like __x_ and ignore a portion of the if conditions -- specify
+// __w_ != 0 to bypass comparison as false or __x_ != 0 to bypass
+// comparison as true)
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> __iterator__ 
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::_M_insert(_Rb_tree_node_base* __x_, _Rb_tree_node_base* __y_, const _Value& __v,
+  _Rb_tree_node_base* __w_)
+{
+  _Link_type __w = (_Link_type) __w_;
+  _Link_type __x = (_Link_type) __x_;
+  _Link_type __y = (_Link_type) __y_;
+  _Link_type __z;
+
+  if ( __y == this->_M_header._M_data ||
+       ( __w == 0 && // If w != 0, the remainder fails to false
+         ( __x != 0 ||     // If x != 0, the remainder succeeds to true
+           _M_key_compare( _KeyOfValue()(__v), _S_key(__y) ) )
+	 )
+       ) {
+    
+    __z = _M_create_node(__v);
+    _S_left(__y) = __z;               // also makes _M_leftmost() = __z 
+                                      //    when __y == _M_header
+    if (__y == this->_M_header._M_data) {
+      _M_root() = __z;
+      _M_rightmost() = __z;
+    }
+    else if (__y == _M_leftmost())
+      _M_leftmost() = __z;   // maintain _M_leftmost() pointing to min node
+  }
+  else {
+    __z = _M_create_node(__v);
+    _S_right(__y) = __z;
+    if (__y == _M_rightmost())
+      _M_rightmost() = __z;  // maintain _M_rightmost() pointing to max node
+  }
+  _S_parent(__z) = __y;
+  _S_left(__z) = 0;
+  _S_right(__z) = 0;
+  _Rb_global_inst::_Rebalance(__z, this->_M_header._M_data->_M_parent);
+  ++_M_node_count;
+  return iterator(__z);
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> __iterator__
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::insert_equal(const _Value& __v)
+{
+  _Link_type __y = this->_M_header._M_data;
+  _Link_type __x = _M_root();
+  while (__x != 0) {
+    __y = __x;
+    __x = _M_key_compare(_KeyOfValue()(__v), _S_key(__x)) ? 
+            _S_left(__x) : _S_right(__x);
+  }
+  return _M_insert(__x, __y, __v);
+}
+
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> pair< _Rb_tree_iterator<_Value, _Nonconst_traits<_Value> >, bool> _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::insert_unique(const _Value& __v)
+{
+  _Link_type __y = this->_M_header._M_data;
+  _Link_type __x = _M_root();
+  bool __comp = true;
+  while (__x != 0) {
+    __y = __x;
+    __comp = _M_key_compare(_KeyOfValue()(__v), _S_key(__x));
+    __x = __comp ? _S_left(__x) : _S_right(__x);
+  }
+  iterator __j = iterator(__y);   
+  if (__comp)
+    if (__j == begin())     
+      return pair<iterator,bool>(_M_insert(/* __x*/ __y, __y, __v), true);
+    else
+      --__j;
+  if (_M_key_compare(_S_key(__j._M_node), _KeyOfValue()(__v)))
+    return pair<iterator,bool>(_M_insert(__x, __y, __v), true);
+  return pair<iterator,bool>(__j, false);
+}
+
+// Modifications CRP 7/10/00 as noted to improve conformance and
+// efficiency.
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> __iterator__ 
+_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> ::insert_unique(iterator __position, const _Value& __v)
+{
+  if (__position._M_node == this->_M_header._M_data->_M_left) { // begin()
+
+    // if the container is empty, fall back on insert_unique.
+    if (size() <= 0)
+      return insert_unique(__v).first;
+
+    if ( _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node)))
+      return _M_insert(__position._M_node, __position._M_node, __v);
+    // first argument just needs to be non-null 
+    else
+      {
+	bool __comp_pos_v = _M_key_compare( _S_key(__position._M_node), _KeyOfValue()(__v) );
+	
+	if (__comp_pos_v == false)  // compare > and compare < both false so compare equal
+	  return __position;
+	//Below __comp_pos_v == true
+
+	// Standard-conformance - does the insertion point fall immediately AFTER
+	// the hint?
+	iterator __after = __position;
+	++__after;
+
+	// Check for only one member -- in that case, __position points to itself,
+	// and attempting to increment will cause an infinite loop.
+	if (__after._M_node == this->_M_header._M_data)
+	  // Check guarantees exactly one member, so comparison was already
+	  // performed and we know the result; skip repeating it in _M_insert
+	  // by specifying a non-zero fourth argument.
+	  return _M_insert(0, __position._M_node, __v, __position._M_node);
+		
+	
+	// All other cases:
+	
+	// Optimization to catch insert-equivalent -- save comparison results,
+	// and we get this for free.
+	if(_M_key_compare( _KeyOfValue()(__v), _S_key(__after._M_node) )) {
+	  if (_S_right(__position._M_node) == 0)
+	    return _M_insert(0, __position._M_node, __v, __position._M_node);
+	  else
+	    return _M_insert(__after._M_node, __after._M_node, __v);
+	} else {
+	    return insert_unique(__v).first;
+	}
+      }
+
+  } else if (__position._M_node == this->_M_header._M_data) { // end()
+    if (_M_key_compare(_S_key(_M_rightmost()), _KeyOfValue()(__v)))
+      // pass along to _M_insert that it can skip comparing
+      // v, Key ; since compare Key, v was true, compare v, Key must be false.
+      return _M_insert(0, _M_rightmost(), __v, __position._M_node); // Last argument only needs to be non-null
+    else
+      return insert_unique(__v).first;
+  } else {
+    iterator __before = __position;
+    --__before;
+    
+    bool __comp_v_pos = _M_key_compare(_KeyOfValue()(__v), _S_key(__position._M_node));
+
+    if (__comp_v_pos
+      && _M_key_compare( _S_key(__before._M_node), _KeyOfValue()(__v) )) {
+
+      if (_S_right(__before._M_node) == 0)
+        return _M_insert(0, __before._M_node, __v, __before._M_node); // Last argument only needs to be non-null
+      else
+        return _M_insert(__position._M_node, __position._M_node, __v);
+    // first argument just needs to be non-null 
+    } else
+      {
+	// Does the insertion point fall immediately AFTER the hint?
+	iterator __after = __position;
+	++__after;
+	
+	// Optimization to catch equivalent cases and avoid unnecessary comparisons
+	bool __comp_pos_v = !__comp_v_pos;  // Stored this result earlier
+	// If the earlier comparison was true, this comparison doesn't need to be
+	// performed because it must be false.  However, if the earlier comparison
+	// was false, we need to perform this one because in the equal case, both will
+	// be false.
+	if (!__comp_v_pos) __comp_pos_v = _M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v));
+	
+	if ( (!__comp_v_pos) // comp_v_pos true implies comp_v_pos false
+	     && __comp_pos_v
+	     && (__after._M_node == this->_M_header._M_data ||
+	        _M_key_compare( _KeyOfValue()(__v), _S_key(__after._M_node) ))) {
+	  
+	  if (_S_right(__position._M_node) == 0)
+	    return _M_insert(0, __position._M_node, __v, __position._M_node);
+	  else
+	    return _M_insert(__after._M_node, __after._M_node, __v);
+	} else {
+	  // Test for equivalent case
+	  if (__comp_v_pos == __comp_pos_v)
+	    return __position;
+	  else
+	    return insert_unique(__v).first;
+	}
+      }
+  }
+}
+
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> __iterator__ 
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::insert_equal(iterator __position, const _Value& __v)
+{
+  if (__position._M_node == this->_M_header._M_data->_M_left) { // begin()
+
+    // Check for zero members
+    if (size() <= 0)
+        return insert_equal(__v);
+
+    if (!_M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v)))
+      return _M_insert(__position._M_node, __position._M_node, __v);
+    else    {
+      // Check for only one member
+      if (__position._M_node->_M_left == __position._M_node)
+        // Unlike insert_unique, can't avoid doing a comparison here.
+        return _M_insert(0, __position._M_node, __v);
+                
+      // All other cases:
+      // Standard-conformance - does the insertion point fall immediately AFTER
+      // the hint?
+      iterator __after = __position;
+      ++__after;
+      
+      // Already know that compare(pos, v) must be true!
+      // Therefore, we want to know if compare(after, v) is false.
+      // (i.e., we now pos < v, now we want to know if v <= after)
+      // If not, invalid hint.
+      if ( __after._M_node==this->_M_header._M_data ||
+	   !_M_key_compare( _S_key(__after._M_node), _KeyOfValue()(__v) ) ) {
+        if (_S_right(__position._M_node) == 0)
+          return _M_insert(0, __position._M_node, __v, __position._M_node);
+        else
+          return _M_insert(__after._M_node, __after._M_node, __v);
+      } else // Invalid hint
+        return insert_equal(__v);
+    }
+  } else if (__position._M_node == this->_M_header._M_data) {// end()
+    if (!_M_key_compare(_KeyOfValue()(__v), _S_key(_M_rightmost())))
+      return _M_insert(0, _M_rightmost(), __v, __position._M_node); // Last argument only needs to be non-null
+    else
+      return insert_equal(__v);
+  } else {
+    iterator __before = __position;
+    --__before;
+    // store the result of the comparison between pos and v so
+    // that we don't have to do it again later.  Note that this reverses the shortcut
+    // on the if, possibly harming efficiency in comparisons; I think the harm will
+    // be negligible, and to do what I want to do (save the result of a comparison so
+    // that it can be re-used) there is no alternative.  Test here is for before <= v <= pos.
+    bool __comp_pos_v = _M_key_compare(_S_key(__position._M_node), _KeyOfValue()(__v));
+    if (!__comp_pos_v
+        && !_M_key_compare(_KeyOfValue()(__v), _S_key(__before._M_node))) {
+      if (_S_right(__before._M_node) == 0)
+        return _M_insert(0, __before._M_node, __v, __before._M_node); // Last argument only needs to be non-null
+      else
+        return _M_insert(__position._M_node, __position._M_node, __v);
+    } else  {
+      // Does the insertion point fall immediately AFTER the hint?
+      // Test for pos < v <= after
+      iterator __after = __position;
+      ++__after;
+      
+      if (__comp_pos_v
+	  && ( __after._M_node==this->_M_header._M_data 
+	       || !_M_key_compare( _S_key(__after._M_node), _KeyOfValue()(__v) ) ) ) {
+        if (_S_right(__position._M_node) == 0)
+          return _M_insert(0, __position._M_node, __v, __position._M_node);
+        else
+          return _M_insert(__after._M_node, __after._M_node, __v);
+      } else // Invalid hint
+        return insert_equal(__v);
+    }
+  }
+}
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc> _Rb_tree_node<_Value>* 
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::_M_copy(_Rb_tree_node<_Value>* __x, _Rb_tree_node<_Value>* __p)
+{
+                        // structural copy.  __x and __p must be non-null.
+  _Link_type __top = _M_clone_node(__x);
+  __top->_M_parent = __p;
+  
+  _STLP_TRY {
+    if (__x->_M_right)
+      __top->_M_right = _M_copy(_S_right(__x), __top);
+    __p = __top;
+    __x = _S_left(__x);
+
+    while (__x != 0) {
+      _Link_type __y = _M_clone_node(__x);
+      __p->_M_left = __y;
+      __y->_M_parent = __p;
+      if (__x->_M_right)
+        __y->_M_right = _M_copy(_S_right(__x), __y);
+      __p = __y;
+      __x = _S_left(__x);
+    }
+  }
+  _STLP_UNWIND(_M_erase(__top));
+
+  return __top;
+}
+
+// this has to stay out-of-line : it's recursive
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> void 
+_Rb_tree<_Key,_Value,_KeyOfValue,
+  _Compare,_Alloc>::_M_erase(_Rb_tree_node<_Value>* __x)
+{
+                                // erase without rebalancing
+  while (__x != 0) {
+    _M_erase(_S_right(__x));
+    _Link_type __y = _S_left(__x);
+    _STLP_STD::_Destroy(&__x->_M_value_field);
+    this->_M_header.deallocate(__x,1);
+    __x = __y;
+  }
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> __size_type__ 
+_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc> ::count(const _Key& __k) const
+{
+  pair<const_iterator, const_iterator> __p = equal_range(__k);
+  size_type __n = distance(__p.first, __p.second);
+  return __n;
+}
+
+inline int 
+__black_count(_Rb_tree_node_base* __node, _Rb_tree_node_base* __root)
+{
+  if (__node == 0)
+    return 0;
+  else {
+    int __bc = __node->_M_color == _S_rb_tree_black ? 1 : 0;
+    if (__node == __root)
+      return __bc;
+    else
+      return __bc + __black_count(__node->_M_parent, __root);
+  }
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> bool _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>::__rb_verify() const
+{
+  if (_M_node_count == 0 || begin() == end())
+    return _M_node_count == 0 && begin() == end() && this->_M_header._M_data->_M_left == this->_M_header._M_data
+      && this->_M_header._M_data->_M_right == this->_M_header._M_data;
+  
+  int __len = __black_count(_M_leftmost(), _M_root());
+  for (const_iterator __it = begin(); __it != end(); ++__it) {
+    _Link_type __x = (_Link_type) __it._M_node;
+    _Link_type __L = _S_left(__x);
+    _Link_type __R = _S_right(__x);
+
+    if (__x->_M_color == _S_rb_tree_red)
+      if ((__L && __L->_M_color == _S_rb_tree_red) ||
+          (__R && __R->_M_color == _S_rb_tree_red))
+        return false;
+
+    if (__L && _M_key_compare(_S_key(__x), _S_key(__L)))
+      return false;
+    if (__R && _M_key_compare(_S_key(__R), _S_key(__x)))
+      return false;
+
+    if (!__L && !__R && __black_count(__x, _M_root()) != __len)
+      return false;
+  }
+
+  if (_M_leftmost() != _Rb_tree_node_base::_S_minimum(_M_root()))
+    return false;
+  if (_M_rightmost() != _Rb_tree_node_base::_S_maximum(_M_root()))
+    return false;
+
+  return true;
+}
+_STLP_END_NAMESPACE
+
+# undef __iterator__        
+# undef iterator
+# undef __size_type__  
+
+#endif /*  _STLP_TREE_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_tree.h b/src/STLport/stl/_tree.h
new file mode 100644
index 0000000..c46a17d
--- /dev/null
+++ b/src/STLport/stl/_tree.h
@@ -0,0 +1,622 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_TREE_H
+#define _STLP_INTERNAL_TREE_H
+
+/*
+
+Red-black tree class, designed for use in implementing STL
+associative containers (set, multiset, map, and multimap). The
+insertion and deletion algorithms are based on those in Cormen,
+Leiserson, and Rivest, Introduction to Algorithms (MIT Press, 1990),
+except that
+
+(1) the header cell is maintained with links not only to the root
+but also to the leftmost node of the tree, to enable constant time
+begin(), and to the rightmost node of the tree, to enable linear time
+performance when used with the generic set algorithms (set_union,
+etc.);
+
+(2) when a node being deleted has two children its successor node is
+relinked into its place, rather than copied, so that the only
+iterators invalidated are those referring to the deleted node.
+
+*/
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h> 
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h> 
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h> 
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+#  include <stl/_construct.h> 
+# endif
+
+# ifndef _STLP_INTERNAL_FUNCTION_H
+#  include <stl/_function_base.h> 
+# endif
+
+#if defined ( _STLP_DEBUG)
+#  define _Rb_tree __WORKAROUND_DBG_RENAME(Rb_tree)
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+typedef bool _Rb_tree_Color_type;
+//const _Rb_tree_Color_type _S_rb_tree_red = false;
+//const _Rb_tree_Color_type _S_rb_tree_black = true;
+
+#define _S_rb_tree_red false
+#define _S_rb_tree_black true
+
+struct _Rb_tree_node_base
+{
+  typedef _Rb_tree_Color_type _Color_type;
+  typedef _Rb_tree_node_base* _Base_ptr;
+
+  _Color_type _M_color; 
+  _Base_ptr _M_parent;
+  _Base_ptr _M_left;
+  _Base_ptr _M_right;
+
+  static _Base_ptr _STLP_CALL _S_minimum(_Base_ptr __x)
+  {
+    while (__x->_M_left != 0) __x = __x->_M_left;
+    return __x;
+  }
+
+  static _Base_ptr _STLP_CALL _S_maximum(_Base_ptr __x)
+  {
+    while (__x->_M_right != 0) __x = __x->_M_right;
+    return __x;
+  }
+};
+
+template <class _Value> struct _Rb_tree_node : public _Rb_tree_node_base
+{
+  _Value _M_value_field;
+  __TRIVIAL_STUFF(_Rb_tree_node)
+};
+
+struct _Rb_tree_base_iterator;
+
+template <class _Dummy> class _Rb_global {
+public:
+  typedef _Rb_tree_node_base* _Base_ptr;
+  // those used to be global functions 
+  static void _STLP_CALL _Rebalance(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root);
+  static _Rb_tree_node_base* _STLP_CALL _Rebalance_for_erase(_Rb_tree_node_base* __z,
+                                                             _Rb_tree_node_base*& __root,
+                                                             _Rb_tree_node_base*& __leftmost,
+                                                             _Rb_tree_node_base*& __rightmost);
+  // those are from _Rb_tree_base_iterator - moved here to reduce code bloat
+  // moved here to reduce code bloat without templatizing _Rb_tree_base_iterator
+  static _Rb_tree_node_base*  _STLP_CALL _M_increment(_Rb_tree_node_base*);
+  static _Rb_tree_node_base*  _STLP_CALL _M_decrement(_Rb_tree_node_base*);
+  static void _STLP_CALL _Rotate_left(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root);
+  static void _STLP_CALL _Rotate_right(_Rb_tree_node_base* __x, _Rb_tree_node_base*& __root); 
+};
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+_STLP_EXPORT_TEMPLATE_CLASS _Rb_global<bool>;
+# endif
+
+typedef _Rb_global<bool> _Rb_global_inst;
+
+struct _Rb_tree_base_iterator
+{
+  typedef _Rb_tree_node_base*        _Base_ptr;
+  typedef bidirectional_iterator_tag iterator_category;
+  typedef ptrdiff_t                  difference_type;
+  _Base_ptr _M_node;
+  bool operator==(const _Rb_tree_base_iterator& __y) const {
+    return _M_node == __y._M_node;
+  }
+  bool operator!=(const _Rb_tree_base_iterator& __y) const {
+    return _M_node != __y._M_node;
+  }
+};
+
+
+template <class _Value, class _Traits> struct _Rb_tree_iterator : public _Rb_tree_base_iterator
+{
+  typedef _Value value_type;
+  typedef typename _Traits::reference  reference;
+  typedef typename _Traits::pointer    pointer;
+  typedef _Rb_tree_iterator<_Value, _Traits> _Self;
+  typedef _Rb_tree_node<_Value>* _Link_type;
+
+  _Rb_tree_iterator() { _M_node = 0; }
+  _Rb_tree_iterator(_Link_type __x) { _M_node = __x; }
+  _Rb_tree_iterator(const _Rb_tree_iterator<_Value, 
+                    _Nonconst_traits<_Value> >& __it) { _M_node = __it._M_node; }
+
+  reference operator*() const { 
+    return _Link_type(_M_node)->_M_value_field; 
+  }
+  
+  _STLP_DEFINE_ARROW_OPERATOR
+
+  _Self& operator++() { _M_node = _Rb_global_inst::_M_increment(_M_node); return *this; }
+  _Self operator++(int) {
+    _Self __tmp = *this;
+    _M_node = _Rb_global_inst::_M_increment(_M_node);
+    return __tmp;
+  }
+    
+  _Self& operator--() { _M_node = _Rb_global_inst::_M_decrement(_M_node); return *this; }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    _M_node = _Rb_global_inst::_M_decrement(_M_node);
+    return __tmp;
+  }
+};
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+template <class _Value, class _Traits> inline _Value* value_type(const _Rb_tree_iterator<_Value, _Traits>&) { return (_Value*)0; }
+inline bidirectional_iterator_tag iterator_category(const _Rb_tree_base_iterator&) { return bidirectional_iterator_tag(); }
+inline ptrdiff_t* distance_type(const _Rb_tree_base_iterator&) { return (ptrdiff_t*) 0; }
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+// Base class to help EH
+
+template <class _Tp, class _Alloc> struct _Rb_tree_base
+{
+  typedef _Rb_tree_node<_Tp> _Node;
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
+
+  _Rb_tree_base(const allocator_type& __a) : 
+    _M_header(_STLP_CONVERT_ALLOCATOR(__a, _Node), (_Node*)0) { 
+      _M_header._M_data = _M_header.allocate(1); 
+  }
+  ~_Rb_tree_base() { 
+    _M_header.deallocate(_M_header._M_data,1); 
+  }
+  allocator_type get_allocator() const { 
+    return _STLP_CONVERT_ALLOCATOR(_M_header, _Tp); 
+  }
+protected:
+  typedef typename _Alloc_traits<_Node, _Alloc>::allocator_type _M_node_allocator_type;
+  _STLP_alloc_proxy<_Node*, _Node, _M_node_allocator_type> _M_header;
+};
+
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare,
+          _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) > class _Rb_tree : public _Rb_tree_base<_Value, _Alloc> {
+  typedef _Rb_tree_base<_Value, _Alloc> _Base;
+protected:
+  typedef _Rb_tree_node_base* _Base_ptr;
+  typedef _Rb_tree_node<_Value> _Node;
+  typedef _Rb_tree_Color_type _Color_type;
+public:
+  typedef _Key key_type;
+  typedef _Value value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef _Rb_tree_node<_Value>* _Link_type;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef bidirectional_iterator_tag _Iterator_category;
+  typedef typename _Base::allocator_type allocator_type;
+  
+protected:
+
+  _Link_type _M_create_node(const value_type& __x)
+  {
+    _Link_type __tmp = this->_M_header.allocate(1);
+    _STLP_TRY {
+      _Construct(&__tmp->_M_value_field, __x);
+    }
+    _STLP_UNWIND(this->_M_header.deallocate(__tmp,1));
+    return __tmp;
+  }
+
+  _Link_type _M_clone_node(_Link_type __x)
+  {
+    _Link_type __tmp = _M_create_node(__x->_M_value_field);
+    __tmp->_M_color = __x->_M_color;
+    __tmp->_M_left = 0;
+    __tmp->_M_right = 0;
+    return __tmp;
+  }
+
+protected:
+  size_type _M_node_count; // keeps track of size of tree
+  _Compare _M_key_compare;
+
+  _Link_type& _M_root() const 
+    { return (_Link_type&) this->_M_header._M_data->_M_parent; }
+  _Link_type& _M_leftmost() const 
+    { return (_Link_type&) this->_M_header._M_data->_M_left; }
+  _Link_type& _M_rightmost() const 
+    { return (_Link_type&) this->_M_header._M_data->_M_right; }
+
+  static _Link_type& _STLP_CALL _S_left(_Link_type __x)
+    { return (_Link_type&)(__x->_M_left); }
+  static _Link_type& _STLP_CALL _S_right(_Link_type __x)
+    { return (_Link_type&)(__x->_M_right); }
+  static _Link_type& _STLP_CALL _S_parent(_Link_type __x)
+    { return (_Link_type&)(__x->_M_parent); }
+  static reference  _STLP_CALL _S_value(_Link_type __x)
+    { return __x->_M_value_field; }
+  static const _Key& _STLP_CALL _S_key(_Link_type __x)
+    { return _KeyOfValue()(_S_value(__x)); }
+  static _Color_type& _STLP_CALL _S_color(_Link_type __x)
+    { return (_Color_type&)(__x->_M_color); }
+
+  static _Link_type& _STLP_CALL _S_left(_Base_ptr __x)
+    { return (_Link_type&)(__x->_M_left); }
+  static _Link_type& _STLP_CALL _S_right(_Base_ptr __x)
+    { return (_Link_type&)(__x->_M_right); }
+  static _Link_type& _STLP_CALL _S_parent(_Base_ptr __x)
+    { return (_Link_type&)(__x->_M_parent); }
+  static reference  _STLP_CALL _S_value(_Base_ptr __x)
+    { return ((_Link_type)__x)->_M_value_field; }
+  static const _Key& _STLP_CALL _S_key(_Base_ptr __x)
+    { return _KeyOfValue()(_S_value(_Link_type(__x)));} 
+  static _Color_type& _STLP_CALL _S_color(_Base_ptr __x)
+    { return (_Color_type&)(_Link_type(__x)->_M_color); }
+
+  static _Link_type  _STLP_CALL _S_minimum(_Link_type __x) 
+    { return (_Link_type)  _Rb_tree_node_base::_S_minimum(__x); }
+
+  static _Link_type  _STLP_CALL _S_maximum(_Link_type __x)
+    { return (_Link_type) _Rb_tree_node_base::_S_maximum(__x); }
+
+public:
+  typedef _Rb_tree_iterator<value_type, _Nonconst_traits<value_type> > iterator;
+  typedef _Rb_tree_iterator<value_type, _Const_traits<value_type> > const_iterator;
+  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+private:
+  iterator _M_insert(_Base_ptr __x, _Base_ptr __y, const value_type& __v, _Base_ptr __w = 0);
+  _Link_type _M_copy(_Link_type __x, _Link_type __p);
+  void _M_erase(_Link_type __x);
+
+public:
+                                // allocation/deallocation
+  _Rb_tree()
+    : _Rb_tree_base<_Value, _Alloc>(allocator_type()), _M_node_count(0), _M_key_compare(_Compare())
+    { _M_empty_initialize(); }
+
+  _Rb_tree(const _Compare& __comp)
+    : _Rb_tree_base<_Value, _Alloc>(allocator_type()), _M_node_count(0), _M_key_compare(__comp) 
+    { _M_empty_initialize(); }
+
+  _Rb_tree(const _Compare& __comp, const allocator_type& __a)
+    : _Rb_tree_base<_Value, _Alloc>(__a), _M_node_count(0), _M_key_compare(__comp) 
+    { _M_empty_initialize(); }
+
+  _Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x) 
+    : _Rb_tree_base<_Value, _Alloc>(__x.get_allocator()),
+      _M_node_count(0), _M_key_compare(__x._M_key_compare)
+  { 
+    if (__x._M_root() == 0)
+      _M_empty_initialize();
+    else {
+      _S_color(this->_M_header._M_data) = _S_rb_tree_red;
+      _M_root() = _M_copy(__x._M_root(), this->_M_header._M_data);
+      _M_leftmost() = _S_minimum(_M_root());
+      _M_rightmost() = _S_maximum(_M_root());
+    }
+    _M_node_count = __x._M_node_count;
+  }
+  ~_Rb_tree() { clear(); }
+  _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& operator=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x);
+
+private:
+  void _M_empty_initialize() {
+    _S_color(this->_M_header._M_data) = _S_rb_tree_red; // used to distinguish header from 
+                                          // __root, in iterator.operator++
+    _M_root() = 0;
+    _M_leftmost() = this->_M_header._M_data;
+    _M_rightmost() = this->_M_header._M_data;
+  }
+
+public:    
+                                // accessors:
+  _Compare key_comp() const { return _M_key_compare; }
+
+  iterator begin() { return iterator(_M_leftmost()); }
+  const_iterator begin() const { return const_iterator(_M_leftmost()); }
+  iterator end() { return iterator(this->_M_header._M_data); }
+  const_iterator end() const { return const_iterator(this->_M_header._M_data); }
+
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin());
+  } 
+  bool empty() const { return _M_node_count == 0; }
+  size_type size() const { return _M_node_count; }
+  size_type max_size() const { return size_type(-1); }
+
+  void swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __t) {
+    _STLP_STD::swap(this->_M_header, __t._M_header);
+    _STLP_STD::swap(_M_node_count, __t._M_node_count);
+    _STLP_STD::swap(_M_key_compare, __t._M_key_compare);
+  }
+    
+public:
+                                // insert/erase
+  pair<iterator,bool> insert_unique(const value_type& __x);
+  iterator insert_equal(const value_type& __x);
+
+  iterator insert_unique(iterator __position, const value_type& __x);
+  iterator insert_equal(iterator __position, const value_type& __x);
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template<class _II> void insert_equal(_II __first, _II __last) {
+    for ( ; __first != __last; ++__first)
+      insert_equal(*__first);
+  }
+  template<class _II> void insert_unique(_II __first, _II __last) {
+    for ( ; __first != __last; ++__first)
+      insert_unique(*__first);
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert_unique(const_iterator __first, const_iterator __last) {
+    for ( ; __first != __last; ++__first)
+      insert_unique(*__first);
+  }
+  void insert_unique(const value_type* __first, const value_type* __last) {
+    for ( ; __first != __last; ++__first)
+      insert_unique(*__first);
+  }
+  void insert_equal(const_iterator __first, const_iterator __last) {
+    for ( ; __first != __last; ++__first)
+      insert_equal(*__first);
+  }
+  void insert_equal(const value_type* __first, const value_type* __last) {
+    for ( ; __first != __last; ++__first)
+      insert_equal(*__first);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void erase(iterator __position) {
+    _Link_type __y = 
+      (_Link_type) _Rb_global_inst::_Rebalance_for_erase(__position._M_node,
+							 this->_M_header._M_data->_M_parent,
+							 this->_M_header._M_data->_M_left,
+							 this->_M_header._M_data->_M_right);
+    _STLP_STD::_Destroy(&__y->_M_value_field);
+    this->_M_header.deallocate(__y,1);
+    --_M_node_count;
+  }
+  
+  size_type erase(const key_type& __x) {
+    pair<iterator,iterator> __p = equal_range(__x);
+    size_type __n = distance(__p.first, __p.second);
+    erase(__p.first, __p.second);
+    return __n;
+  }
+  
+  void erase(iterator __first, iterator __last) {
+    if (__first == begin() && __last == end())
+      clear();
+    else
+      while (__first != __last) erase(__first++);
+  }
+
+  void erase(const key_type* __first, const key_type* __last) {
+    while (__first != __last) erase(*__first++);
+  }
+
+  void clear() {
+    if (_M_node_count != 0) {
+      _M_erase(_M_root());
+      _M_leftmost() = this->_M_header._M_data;
+      _M_root() = 0;
+      _M_rightmost() = this->_M_header._M_data;
+      _M_node_count = 0;
+    }
+  }      
+
+public:
+                                // set operations:
+# if defined(_STLP_MEMBER_TEMPLATES) && ! defined ( _STLP_NO_EXTENSIONS ) && !defined(__MRC__) && !(defined(__SC__) && !defined(__DMC__))
+  template <class _KT> iterator find(const _KT& __x) { return iterator(_M_find(__x)); }
+  template <class _KT> const_iterator find(const _KT& __x) const { return const_iterator(_M_find(__x)); }
+private:
+  template <class _KT> _Rb_tree_node<_Value>* _M_find(const _KT& __k) const
+# else
+  iterator find(const key_type& __x) { return iterator(_M_find(__x)); }
+  const_iterator find(const key_type& __x) const { return const_iterator(_M_find(__x)); }
+private:
+  _Rb_tree_node<_Value>* _M_find(const key_type& __k) const
+# endif
+  {
+    _Link_type __y = this->_M_header._M_data;      // Last node which is not less than __k. 
+    _Link_type __x = _M_root();      // Current node. 
+    
+    while (__x != 0) 
+      if (!_M_key_compare(_S_key(__x), __k))
+	__y = __x, __x = _S_left(__x);
+      else
+	__x = _S_right(__x);
+    if (__y == this->_M_header._M_data || _M_key_compare(__k, _S_key(__y)))
+      __y = this->_M_header._M_data;
+    return __y;
+  }
+  
+  _Link_type _M_lower_bound(const key_type& __k) const {
+    _Link_type __y = this->_M_header._M_data; /* Last node which is not less than __k. */
+    _Link_type __x = _M_root(); /* Current node. */
+    
+    while (__x != 0) 
+      if (!_M_key_compare(_S_key(__x), __k))
+	__y = __x, __x = _S_left(__x);
+      else
+	__x = _S_right(__x);
+    
+    return __y;
+  }
+
+  _Link_type _M_upper_bound(const key_type& __k) const {
+    _Link_type __y = this->_M_header._M_data; /* Last node which is greater than __k. */
+    _Link_type __x = _M_root(); /* Current node. */
+    
+    while (__x != 0) 
+      if (_M_key_compare(__k, _S_key(__x)))
+	__y = __x, __x = _S_left(__x);
+      else
+	__x = _S_right(__x);
+    
+    return __y;
+  }
+  
+public:  
+  size_type count(const key_type& __x) const;
+  iterator lower_bound(const key_type& __x) { return iterator(_M_lower_bound(__x)); }
+  const_iterator lower_bound(const key_type& __x) const { return const_iterator(_M_lower_bound(__x)); }
+  iterator upper_bound(const key_type& __x) { return iterator(_M_upper_bound(__x)); }
+  const_iterator upper_bound(const key_type& __x) const { return const_iterator(_M_upper_bound(__x)); }
+  pair<iterator,iterator> equal_range(const key_type& __x) {
+    return pair<iterator, iterator>(lower_bound(__x), upper_bound(__x));
+  }
+  pair<const_iterator, const_iterator> equal_range(const key_type& __x) const {
+    return pair<const_iterator,const_iterator>(lower_bound(__x),
+					       upper_bound(__x));
+  }
+
+public:
+                                // Debugging.
+  bool __rb_verify() const;
+};
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline bool _STLP_CALL 
+operator==(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+           const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
+{
+  return __x.size() == __y.size() && equal(__x.begin(), __x.end(), __y.begin());
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline bool _STLP_CALL 
+operator<(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+          const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
+{
+  return lexicographical_compare(__x.begin(), __x.end(), 
+                                 __y.begin(), __y.end());
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline bool _STLP_CALL 
+operator!=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+           const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline bool _STLP_CALL 
+operator>(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+          const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+  return __y < __x;
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline bool _STLP_CALL 
+operator<=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+           const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+  return !(__y < __x);
+}
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline bool _STLP_CALL 
+operator>=(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+           const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+template <class _Key, class _Value, class _KeyOfValue, 
+          class _Compare, class _Alloc> inline void _STLP_CALL 
+swap(_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x, 
+     _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __y)
+{
+  __x.swap(__y);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+         
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_tree.c> 
+# endif
+
+# undef _Rb_tree
+
+#if defined (_STLP_DEBUG)
+# include <stl/debug/_tree.h> 
+#endif
+
+_STLP_BEGIN_NAMESPACE
+// Class rb_tree is not part of the C++ standard.  It is provided for
+// compatibility with the HP STL.
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare,
+          _STLP_DEFAULT_ALLOCATOR_SELECT(_Value) > struct rb_tree : public _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> {
+  typedef _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Base;
+  typedef typename _Base::allocator_type allocator_type;
+
+  rb_tree()
+     : _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>(_Compare(), allocator_type()) {}
+  rb_tree(const _Compare& __comp,
+          const allocator_type& __a = allocator_type())
+    : _Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc>(__comp, __a) {} 
+  ~rb_tree() {}
+};
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_uninitialized.h b/src/STLport/stl/_uninitialized.h
new file mode 100644
index 0000000..6784ff7
--- /dev/null
+++ b/src/STLport/stl/_uninitialized.h
@@ -0,0 +1,287 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#define _STLP_INTERNAL_UNINITIALIZED_H
+
+# ifndef _STLP_CSTRING
+#  include <cstring>
+# endif
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_CONSTRUCT_H
+#  include <stl/_construct.h>
+# endif
+
+_STLP_BEGIN_NAMESPACE
+
+// uninitialized_copy
+
+// Valid if copy construction is equivalent to assignment, and if the
+//  destructor is trivial.
+template <class _InputIter, class _ForwardIter>
+inline _ForwardIter 
+__uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
+                     const __true_type&) {
+  return __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _ForwardIter> :: _Ret());
+}
+
+template <class _InputIter, class _ForwardIter>
+_STLP_INLINE_LOOP
+_ForwardIter 
+__uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
+                     const __false_type&)
+{
+  _ForwardIter __cur = __result;
+  _STLP_TRY {
+    for ( ; __first != __last; ++__first, ++__cur)
+      _Construct(&*__cur, *__first);
+    return __cur;
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__result, __cur));
+# ifdef _STLP_THROW_RETURN_BUG
+  return __cur;
+# endif
+}
+
+template <class _InputIter, class _ForwardIter>
+inline _ForwardIter
+uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result) {
+  return __uninitialized_copy(__first, __last, __result,  _IS_POD_ITER(__result, _ForwardIter));
+}
+
+inline char* 
+uninitialized_copy(const char* __first, const char* __last, char* __result) {
+  return  (char*)__copy_trivial (__first, __last, __result);
+}
+
+#  ifdef _STLP_HAS_WCHAR_T // dwa 8/15/97
+inline wchar_t* 
+uninitialized_copy(const wchar_t* __first, const wchar_t* __last, wchar_t* __result) {
+  return  (wchar_t*)__copy_trivial (__first, __last, __result);
+}
+#  endif /* _STLP_HAS_WCHAR_T */
+
+# ifndef _STLP_NO_EXTENSIONS
+// uninitialized_copy_n (not part of the C++ standard)
+
+template <class _InputIter, class _Size, class _ForwardIter>
+_STLP_INLINE_LOOP 
+pair<_InputIter, _ForwardIter>
+__uninitialized_copy_n(_InputIter __first, _Size __count,
+                       _ForwardIter __result,
+                       const input_iterator_tag &)
+{
+  _ForwardIter __cur = __result;
+  _STLP_TRY {
+    for ( ; __count > 0 ; --__count, ++__first, ++__cur) 
+      _Construct(&*__cur, *__first);
+    return pair<_InputIter, _ForwardIter>(__first, __cur);
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__result, __cur));
+# ifdef _STLP_THROW_RETURN_BUG
+  return pair<_InputIter, _ForwardIter>(__first, __cur);
+# endif
+}
+
+# if defined(_STLP_NONTEMPL_BASE_MATCH_BUG) 
+template <class _InputIterator, class _Size, class _ForwardIterator>
+inline pair<_InputIterator, _ForwardIterator>
+__uninitialized_copy_n(_InputIterator __first, _Size __count,
+                       _ForwardIterator __result,
+                       const forward_iterator_tag &) {
+  return __uninitialized_copy_n(__first, __count, __result, input_iterator_tag());
+}
+
+template <class _InputIterator, class _Size, class _ForwardIterator>
+inline pair<_InputIterator, _ForwardIterator>
+__uninitialized_copy_n(_InputIterator __first, _Size __count,
+                       _ForwardIterator __result,
+                       const bidirectional_iterator_tag &) {
+  return __uninitialized_copy_n(__first, __count, __result, input_iterator_tag());
+}
+# endif
+
+
+template <class _RandomAccessIter, class _Size, class _ForwardIter>
+inline pair<_RandomAccessIter, _ForwardIter>
+__uninitialized_copy_n(_RandomAccessIter __first, _Size __count, _ForwardIter __result, const random_access_iterator_tag &) {
+  _RandomAccessIter __last = __first + __count;
+  return pair<_RandomAccessIter, _ForwardIter>( __last, __uninitialized_copy(__first, __last, __result, 
+                                                                             _IS_POD_ITER(__result, _ForwardIter)));
+}
+
+// this is used internally in <rope> , which is extension itself.
+template <class _InputIter, class _Size, class _ForwardIter>
+inline pair<_InputIter, _ForwardIter>
+uninitialized_copy_n(_InputIter __first, _Size __count,
+                     _ForwardIter __result) {
+  return __uninitialized_copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
+}
+# endif /* _STLP_NO_EXTENSIONS */
+
+// Valid if copy construction is equivalent to assignment, and if the
+// destructor is trivial.
+template <class _ForwardIter, class _Tp>
+inline void
+__uninitialized_fill(_ForwardIter __first, _ForwardIter __last, 
+                     const _Tp& __x, const __true_type&) {
+  _STLP_STD::fill(__first, __last, __x);
+}
+
+template <class _ForwardIter, class _Tp>
+_STLP_INLINE_LOOP void
+__uninitialized_fill(_ForwardIter __first, _ForwardIter __last, 
+                     const _Tp& __x, const __false_type&)
+{
+  _ForwardIter __cur = __first;
+  _STLP_TRY {
+    for ( ; __cur != __last; ++__cur)
+      _Construct(&*__cur, __x);
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__first, __cur));
+}
+
+template <class _ForwardIter, class _Tp>
+inline void uninitialized_fill(_ForwardIter __first, _ForwardIter __last,  const _Tp& __x) {
+  __uninitialized_fill(__first, __last, __x, _IS_POD_ITER(__first, _ForwardIter));
+}
+
+// Valid if copy construction is equivalent to assignment, and if the
+//  destructor is trivial.
+template <class _ForwardIter, class _Size, class _Tp>
+inline _ForwardIter
+__uninitialized_fill_n(_ForwardIter __first, _Size __n,
+                       const _Tp& __x, const __true_type&) {
+  return _STLP_STD::fill_n(__first, __n, __x);
+}
+
+template <class _ForwardIter, class _Size, class _Tp>
+_STLP_INLINE_LOOP _ForwardIter
+__uninitialized_fill_n(_ForwardIter __first, _Size __n,
+                       const _Tp& __x, const __false_type&)
+{
+  _ForwardIter __cur = __first;
+  _STLP_TRY {
+    for ( ; __n > 0; --__n, ++__cur)
+      _Construct(&*__cur, __x);
+    return __cur;
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__first, __cur));
+# ifdef _STLP_THROW_RETURN_BUG
+  return __cur;
+# endif
+}
+
+template <class _ForwardIter, class _Size, class _Tp>
+inline _ForwardIter 
+uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x) {
+  return __uninitialized_fill_n(__first, __n, __x, _IS_POD_ITER(__first, _ForwardIter));
+}
+
+// Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill, 
+// __uninitialized_fill_copy.
+
+// __uninitialized_copy_copy
+// Copies [first1, last1) into [result, result + (last1 - first1)), and
+//  copies [first2, last2) into
+//  [result, result + (last1 - first1) + (last2 - first2)).
+
+template <class _InputIter1, class _InputIter2, class _ForwardIter>
+inline _ForwardIter
+__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
+                          _InputIter2 __first2, _InputIter2 __last2,
+                          _ForwardIter __result, __true_type)
+{
+  return __uninitialized_copy(__first2, __last2, 
+                              __uninitialized_copy(__first1, __last1, __result, __true_type()), __true_type());
+}
+
+template <class _InputIter1, class _InputIter2, class _ForwardIter>
+inline _ForwardIter
+__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
+                          _InputIter2 __first2, _InputIter2 __last2,
+                          _ForwardIter __result, __false_type)
+{
+  _ForwardIter __mid = __uninitialized_copy(__first1, __last1, __result, _IS_POD_ITER(__result, _ForwardIter));
+  _STLP_TRY {
+    return __uninitialized_copy(__first2, __last2, __mid , _IS_POD_ITER(__result, _ForwardIter));
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__result, __mid));
+# ifdef _STLP_THROW_RETURN_BUG
+  return __mid;
+# endif
+}
+
+// __uninitialized_fill_copy
+// Fills [result, mid) with x, and copies [first, last) into
+//  [mid, mid + (last - first)).
+template <class _ForwardIter, class _Tp, class _InputIter>
+inline _ForwardIter 
+__uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid, const _Tp& __x,
+                          _InputIter __first, _InputIter __last)
+{
+  typedef typename __type_traits<_Tp>::is_POD_type _I_POD;
+  __uninitialized_fill(__result, __mid, __x, _I_POD());
+  _STLP_TRY {
+    return __uninitialized_copy(__first, __last, __mid, _I_POD());
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__result, __mid));
+# ifdef _STLP_THROW_RETURN_BUG
+  return __result;
+# endif
+}
+
+// __uninitialized_copy_fill
+// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
+//  fills [first2 + (last1 - first1), last2) with x.
+template <class _InputIter, class _ForwardIter, class _Tp>
+inline void
+__uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
+                          _ForwardIter __first2, _ForwardIter __last2,
+                          const _Tp& __x)
+{
+  typedef typename __type_traits<_Tp>::is_POD_type _I_POD;
+  _ForwardIter __mid2 = __uninitialized_copy(__first1, __last1, __first2, _I_POD());
+  _STLP_TRY {
+    __uninitialized_fill(__mid2, __last2, __x, _I_POD());
+  }
+  _STLP_UNWIND(_STLP_STD::_Destroy(__first2, __mid2));
+}
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_UNINITIALIZED_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_valarray.c b/src/STLport/stl/_valarray.c
new file mode 100644
index 0000000..3381ca2
--- /dev/null
+++ b/src/STLport/stl/_valarray.c
@@ -0,0 +1,197 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_VALARRAY_C
+#define _STLP_VALARRAY_C
+
+#ifndef _STLP_VALARRAY_H
+# include <stl/_valarray.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp>
+_Valarray_bool valarray<_Tp>:: operator!() const {
+  _Valarray_bool __tmp(this->size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < this->size(); ++__i)
+    __tmp[__i] = !(*this)[__i];
+  return __tmp;
+}
+
+// Behavior is undefined if __x and *this have different sizes
+template <class _Tp>
+valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<_Tp>& __x)
+{
+  size_t __index = __x._M_slice.start();
+  for (size_t __i = 0;
+       __i < __x._M_slice.size();
+       ++__i, __index += __x._M_slice.stride())
+    (*this)[__i] = __x._M_array[__index];
+  return *this;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::operator[](slice __slice) const {
+  valarray<_Tp> __tmp(__slice.size(), _NoInit());
+  size_t __index = __slice.start();
+  for (size_t __i = 0;
+       __i < __slice.size();
+       ++__i, __index += __slice.stride())
+    __tmp[__i] = (*this)[__index];
+  return __tmp;
+}
+
+template <class _Size>
+bool _Gslice_Iter_tmpl<_Size>::_M_incr() {
+  size_t __dim = _M_indices.size() - 1;
+  ++_M_step;
+  while (true) {
+    _M_1d_idx += _M_gslice._M_strides[__dim];
+    if (++_M_indices[__dim] != _M_gslice._M_lengths[__dim])
+      return true;
+    else if (__dim != 0) {
+      _M_1d_idx -=
+	_M_gslice._M_strides[__dim] * _M_gslice._M_lengths[__dim];
+      _M_indices[__dim] = 0;
+      --__dim;
+    }
+    else
+      return false;
+  }
+}
+
+// Behavior is undefined if __x and *this have different sizes, or if
+// __x was constructed from a degenerate gslice.
+template <class _Tp>
+valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<_Tp>& __x)
+{
+  if (this->size() != 0) {
+    _Gslice_Iter __i(__x._M_gslice);
+    do
+      (*this)[__i._M_step] = __x._M_array[__i._M_1d_idx];
+    while(__i._M_incr());
+  }
+  return *this;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::operator[](gslice __slice) const
+{
+  valarray<_Tp> __tmp(__slice._M_size(), _NoInit());
+  if (__tmp.size() != 0) {
+    _Gslice_Iter __i(__slice);
+    do __tmp[__i._M_step] = (*this)[__i._M_1d_idx]; while(__i._M_incr());
+  }
+  return __tmp;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask) const
+{
+  size_t _p_size = 0;
+  {
+    for (size_t __i = 0; __i < __mask.size(); ++__i)
+      if (__mask[__i]) ++_p_size;
+  }
+
+  valarray<_Tp> __tmp(_p_size, _NoInit());
+  size_t __idx = 0;
+  {
+    for (size_t __i = 0; __i < __mask.size(); ++__i)
+      if (__mask[__i]) __tmp[__idx++] = (*this)[__i];
+  }
+
+  return __tmp;
+}
+
+template <class _Tp>
+valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<_Tp>& __x) {
+  for (size_t __i = 0; __i < __x._M_addr.size(); ++__i)
+    (*this)[__i] = __x._M_array[__x._M_addr[__i]];
+  return *this;
+}
+
+template <class _Tp>
+valarray<_Tp>
+valarray<_Tp>::operator[](const _Valarray_size_t& __addr) const
+{
+  valarray<_Tp> __tmp(__addr.size(), _NoInit());
+  for (size_t __i = 0; __i < __addr.size(); ++__i)
+    __tmp[__i] = (*this)[__addr[__i]];
+  return __tmp;
+}
+
+//----------------------------------------------------------------------
+// Other valarray noninline member functions
+
+// Shift and cshift
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::shift(int __n) const
+{
+  valarray<_Tp> __tmp(this->size());
+
+  if (__n >= 0) {
+    if (__n < this->size())
+      copy(this->_M_first + __n, this->_M_first + this->size(),
+           __tmp._M_first);
+  }
+  else {
+    if (-__n < this->size())
+      copy(this->_M_first, this->_M_first + this->size() + __n,
+           __tmp._M_first - __n);
+  }
+  return __tmp;
+}
+
+template <class _Tp>
+valarray<_Tp> valarray<_Tp>::cshift(int __m) const
+{
+  valarray<_Tp> __tmp(this->size());
+
+  // Reduce __m to an equivalent number in the range [0, size()).  We
+  // have to be careful with negative numbers, since the sign of a % b
+  // is unspecified when a < 0.
+  long __n = __m;
+  if (this->size() < (numeric_limits<long>::max)())
+    __n %= long(this->size());
+  if (__n < 0)
+    __n += this->size();
+
+  copy(this->_M_first,       this->_M_first + __n,
+       __tmp._M_first + (this->size() - __n));
+  copy(this->_M_first + __n, this->_M_first + this->size(),
+       __tmp._M_first);
+
+  return __tmp;
+}
+
+_STLP_END_NAMESPACE
+
+#endif /*  _STLP_VALARRAY_C */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_valarray.h b/src/STLport/stl/_valarray.h
new file mode 100644
index 0000000..be8b5b7
--- /dev/null
+++ b/src/STLport/stl/_valarray.h
@@ -0,0 +1,1657 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_VALARRAY_H
+#define _STLP_VALARRAY_H
+
+#ifndef _STLP_CMATH_H_HEADER
+#include <stl/_cmath.h>
+#endif
+#ifndef _STLP_INTERNAL_NEW_HEADER
+#include <stl/_new.h>
+#endif
+#ifndef _STLP_INTERNAL_ALGO_H
+#include <stl/_algo.h>
+#endif
+#ifndef _STLP_INTERNAL_NUMERIC_H
+#include <stl/_numeric.h>
+#endif
+#ifndef _STLP_LIMITS_H
+#include <limits>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+class slice;
+class gslice;
+
+template <class _Tp> class valarray;
+typedef valarray<bool>    _Valarray_bool;
+typedef valarray<size_t>  _Valarray_size_t;
+
+template <class _Tp> class slice_array;
+template <class _Tp> class gslice_array;
+template <class _Tp> class mask_array;
+template <class _Tp> class indirect_array;
+
+//----------------------------------------------------------------------
+// class valarray
+
+// Base class to handle memory allocation and deallocation.  We can't just
+// use vector<>, because vector<bool> would be unsuitable as an internal 
+// representation for valarray<bool>.
+
+template <class _Tp> 
+struct _Valarray_base
+{
+  _Tp*   _M_first;
+  size_t _M_size;
+
+  _Valarray_base() : _M_first(0), _M_size(0) {}
+  _Valarray_base(size_t __n) : _M_first(0), _M_size(0) { _M_allocate(__n); }
+  ~_Valarray_base() { _M_deallocate(); }
+
+  void _M_allocate(size_t __n) {
+    if (__n != 0) {
+      _M_first = __STATIC_CAST(_Tp*, (malloc(__n * sizeof(_Tp))));
+      _M_size  = __n;
+#   if !defined(_STLP_NO_BAD_ALLOC) && defined(_STLP_USE_EXCEPTIONS)
+      if (_M_first == 0) {
+        _M_size = 0;
+        throw _STLP_STD::bad_alloc();
+      }
+#   endif
+    }
+    else {
+      _M_first = 0;
+      _M_size = 0;
+    }
+  }
+
+  void _M_deallocate() {
+    free(_M_first);
+    _M_first = 0;
+    _M_size = 0;
+  }
+};
+
+template <class _Tp> 
+class valarray : private _Valarray_base<_Tp>
+{
+  friend class gslice;
+
+public:
+  typedef _Tp value_type;
+
+  // Basic constructors
+  valarray() : _Valarray_base<_Tp>() {}
+  valarray(size_t __n) : _Valarray_base<_Tp>(__n)
+    { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); }
+  valarray(const value_type& __x, size_t __n) : _Valarray_base<_Tp>(__n)
+    { uninitialized_fill_n(this->_M_first, this->_M_size, __x); }
+  valarray(const value_type* __p, size_t __n) : _Valarray_base<_Tp>(__n)
+    { uninitialized_copy(__p, __p + __n, this->_M_first); } 
+  valarray(const valarray<_Tp>& __x) : _Valarray_base<_Tp>(__x._M_size) {
+    uninitialized_copy(__x._M_first, __x._M_first + __x._M_size,
+                       this->_M_first);
+  }
+
+  // Constructors from auxiliary array types
+  valarray(const slice_array<_Tp>&);
+  valarray(const gslice_array<_Tp>&);
+  valarray(const mask_array<_Tp>&);
+  valarray(const indirect_array<_Tp>&);
+
+  // Destructor
+  ~valarray() { _STLP_STD::_Destroy(this->_M_first, this->_M_first + this->_M_size); }
+
+  // Extension: constructor that doesn't initialize valarray elements to a
+  // specific value.  This is faster for types such as int and double.
+private:
+  void _M_initialize(const __true_type&) {}
+  void _M_initialize(const __false_type&)
+    { uninitialized_fill_n(this->_M_first, this->_M_size, value_type()); }
+
+public:
+  struct _NoInit {};
+  valarray(size_t __n, _NoInit) : _Valarray_base<_Tp>(__n) {
+    typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Is_Trivial;
+    _M_initialize(_Is_Trivial());
+  }
+
+public:                         // Assignment
+  // Basic assignment.  Note that 'x = y' is undefined if x.size() != y.size()
+  valarray<_Tp>& operator=(const valarray<_Tp>& __x) {
+    _STLP_ASSERT(__x.size() == this->size())
+    if (this != &__x)
+      copy(__x._M_first, __x._M_first + __x._M_size, this->_M_first);
+    return *this;
+  }
+
+  // Scalar assignment
+  valarray<_Tp>& operator=(const value_type& __x) {
+    fill_n(this->_M_first, this->_M_size, __x);
+    return *this;
+  }
+
+  // Assignment of auxiliary array types
+  valarray<_Tp>& operator=(const slice_array<_Tp>&);
+  valarray<_Tp>& operator=(const gslice_array<_Tp>&);
+  valarray<_Tp>& operator=(const mask_array<_Tp>&);
+  valarray<_Tp>& operator=(const indirect_array<_Tp>&);
+
+public:                         // Element access
+  value_type  operator[](size_t __n) const { return this->_M_first[__n]; }
+  value_type& operator[](size_t __n)       { return this->_M_first[__n]; }
+  size_t size() const { return this->_M_size; }
+
+public:                         // Subsetting operations with auxiliary type
+  valarray<_Tp>            operator[](slice) const;
+  slice_array<_Tp>    operator[](slice);
+  valarray<_Tp>            operator[](gslice) const;
+  gslice_array<_Tp>   operator[](const gslice&);  
+  valarray<_Tp>            operator[](const _Valarray_bool&) const;
+  mask_array<_Tp>     operator[](const _Valarray_bool&);
+  valarray<_Tp>            operator[](const _Valarray_size_t&) const;
+  indirect_array<_Tp> operator[](const _Valarray_size_t&);
+  
+public:                         // Unary operators.
+  valarray<_Tp> operator+() const { return *this; }
+
+  valarray<_Tp> operator-() const {
+    valarray<_Tp> __tmp(this->size(), _NoInit());
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      __tmp[__i] = -(*this)[__i];
+    return __tmp;
+  }
+  
+  valarray<_Tp> operator~() const {
+    valarray<_Tp> __tmp(this->size(), _NoInit());
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      __tmp[__i] = ~(*this)[__i];
+    return __tmp;
+  }
+
+  _Valarray_bool operator!() const;
+
+public:                         // Scalar computed assignment.
+  valarray<_Tp>& operator*= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] *= __x;
+    return *this;
+  }
+    
+  valarray<_Tp>& operator/= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] /= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator%= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] %= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator+= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] += __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator-= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] -= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator^= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] ^= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator&= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] &= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator|= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] |= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator<<= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] <<= __x;
+    return *this;
+  }
+
+  valarray<_Tp>& operator>>= (const value_type& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] >>= __x;
+    return *this;
+  }
+
+public:                         // Array computed assignment.
+  valarray<_Tp>& operator*= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] *= __x[__i];
+    return *this;
+  }
+    
+  valarray<_Tp>& operator/= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] /= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator%= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] %= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator+= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] += __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator-= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] -= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator^= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] ^= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator&= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] &= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator|= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] |= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator<<= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] <<= __x[__i];
+    return *this;
+  }
+
+  valarray<_Tp>& operator>>= (const valarray<_Tp>& __x) {
+    for (size_t __i = 0; __i < this->size(); ++__i)
+      (*this)[__i] >>= __x[__i];
+    return *this;
+  }
+
+public:                         // Other member functions.
+
+  // The result is undefined for zero-length arrays
+  value_type sum() const {
+    return accumulate(this->_M_first + 1, this->_M_first + this->_M_size,
+                      (*this)[0]);
+  }
+
+  // The result is undefined for zero-length arrays
+  value_type (min) () const {
+    return *min_element(this->_M_first + 0, this->_M_first + this->_M_size);
+  }
+
+  value_type (max) () const {
+    return *max_element(this->_M_first + 0, this->_M_first + this->_M_size);
+  }
+
+  valarray<_Tp> shift(int __n) const;
+  valarray<_Tp> cshift(int __n) const;
+
+  valarray<_Tp> apply(value_type __f(value_type)) const {
+    valarray<_Tp> __tmp(this->size());
+    transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first,
+              __f);
+    return __tmp;
+  }
+  valarray<_Tp> apply(value_type __f(const value_type&)) const {
+    valarray<_Tp> __tmp(this->size());
+    transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first,
+              __f);
+    return __tmp;
+  }
+  
+  void resize(size_t __n, value_type __x = value_type()) {
+    _STLP_STD::_Destroy(this->_M_first, this->_M_first + this->_M_size);
+    this->_Valarray_base<_Tp>::_M_deallocate();
+    this->_Valarray_base<_Tp>::_M_allocate(__n);
+    uninitialized_fill_n(this->_M_first, this->_M_size, __x);
+  }
+};
+
+//----------------------------------------------------------------------
+// valarray non-member functions.
+
+// Binary arithmetic operations between two arrays.  Behavior is
+// undefined if the two arrays do not have the same length.
+
+template <class _Tp> 
+inline valarray<_Tp>  _STLP_CALL operator*(const valarray<_Tp>& __x,
+                                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] * __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp>  _STLP_CALL operator/(const valarray<_Tp>& __x,
+                                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] / __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp>  _STLP_CALL operator%(const valarray<_Tp>& __x,
+                                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] % __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp>  _STLP_CALL operator+(const valarray<_Tp>& __x,
+                                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] + __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp>  _STLP_CALL operator-(const valarray<_Tp>& __x,
+                                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] - __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x,
+                               const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] ^ __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x,
+                               const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] & __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x,
+                               const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] | __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x,
+                               const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] << __y[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x,
+                               const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] >> __y[__i];
+  return __tmp;
+}
+
+// Binary arithmetic operations between an array and a scalar.
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator*(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  * __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator*(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c * __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator/(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  / __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator/(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c / __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator%(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  % __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator%(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c % __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator+(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  + __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator+(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c + __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator-(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  - __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator-(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c - __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  ^ __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator^(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c ^ __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  & __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator&(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c & __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  | __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator|(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c | __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  << __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator<<(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c << __x[__i];
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  >> __c;
+  return __tmp;
+}
+
+template <class _Tp> 
+inline valarray<_Tp> _STLP_CALL operator>>(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c >> __x[__i];
+  return __tmp;
+}
+
+// Binary logical operations between two arrays.  Behavior is undefined
+// if the two arrays have different lengths.  Note that operator== does
+// not do what you might at first expect.
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x,
+                                 const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] == __y[__i];
+  return __tmp;  
+}
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x,
+                                const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] < __y[__i];
+  return __tmp;  
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x,
+                                 const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] != __y[__i];
+  return __tmp;  
+}
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x,
+                                const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] > __y[__i];
+  return __tmp;  
+}
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x,
+                                 const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] <= __y[__i];
+  return __tmp;  
+}
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x,
+                                 const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] >= __y[__i];
+  return __tmp;  
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+// fbp : swap ?
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x,
+                                 const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] && __y[__i];
+  return __tmp;  
+}
+
+template <class _Tp> 
+inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x,
+                                 const valarray<_Tp>& __y)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] || __y[__i];
+  return __tmp;  
+}
+
+// Logical operations between an array and a scalar.
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] == __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator==(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c == __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] != __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator!=(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c != __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] < __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c < __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] > __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c > __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i]  <= __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator<=(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c <= __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] >= __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator>=(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c >= __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] && __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator&&(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c && __x[__i];
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x, const _Tp& __c)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __x[__i] || __c;
+  return __tmp;  
+}
+
+template <class _Tp>
+inline _Valarray_bool _STLP_CALL operator||(const _Tp& __c, const valarray<_Tp>& __x)
+{
+  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = __c || __x[__i];
+  return __tmp;  
+}
+
+// valarray "transcendentals" (the list includes abs and sqrt, which,
+// of course, are not transcendental).
+
+template <class _Tp>
+inline valarray<_Tp> abs(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ABS(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> acos(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ACOS(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> asin(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ASIN(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ATAN(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan2(const valarray<_Tp>& __x,
+                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__x[__i], __y[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__x[__i], __c);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> atan2(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_ATAN2(_Tp)(__c, __x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> cos(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_COS(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> cosh(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_COSH(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> exp(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_EXP(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> log(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_LOG(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> log10(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_LOG10(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> pow(const valarray<_Tp>& __x,
+                           const valarray<_Tp>& __y) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_POW(_Tp)(__x[__i], __y[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> pow(const valarray<_Tp>& __x, const _Tp& __c) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_POW(_Tp)(__x[__i], __c);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> pow(const _Tp& __c, const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_POW(_Tp)(__c, __x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> sin(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_SIN(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> sinh(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_SINH(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> sqrt(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_SQRT(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> tan(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_TAN(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+template <class _Tp>
+inline valarray<_Tp> tanh(const valarray<_Tp>& __x) {
+  typedef typename valarray<_Tp>::_NoInit _NoInit;
+  valarray<_Tp> __tmp(__x.size(), _NoInit());
+  for (size_t __i = 0; __i < __x.size(); ++__i)
+    __tmp[__i] = _STLP_DO_TANH(_Tp)(__x[__i]);
+  return __tmp;
+}
+
+//----------------------------------------------------------------------
+// slice and slice_array
+
+class slice {
+public:
+  slice() : _M_start(0), _M_length(0), _M_stride(0) {}
+  slice(size_t __start, size_t __length, size_t __stride)
+    : _M_start(__start), _M_length(__length), _M_stride(__stride)
+    {}
+  __TRIVIAL_DESTRUCTOR(slice)
+
+  size_t start()  const { return _M_start; }
+  size_t size()   const { return _M_length; }
+  size_t stride() const { return _M_stride; }
+
+   
+private:
+  size_t _M_start;
+  size_t _M_length;
+  size_t _M_stride;
+};
+
+template <class _Tp>
+class slice_array {
+  friend class valarray<_Tp>;
+public:
+  typedef _Tp value_type;
+
+  void operator=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] = __x[__i];
+  }
+
+  void operator*=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] *= __x[__i];
+  }
+
+  void operator/=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] /= __x[__i];
+  }
+
+  void operator%=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] %= __x[__i];
+  }
+
+  void operator+=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] += __x[__i];
+  }
+
+  void operator-=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] -= __x[__i];
+  }
+
+  void operator^=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] ^= __x[__i];
+  }
+
+  void operator&=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] &= __x[__i];
+  }
+
+  void operator|=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] |= __x[__i];
+  }
+
+  void operator<<=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] <<= __x[__i];
+  }
+
+  void operator>>=(const valarray<value_type>& __x) const {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] >>= __x[__i];
+  }
+
+  void operator=(const value_type& __c) {
+    size_t __index = _M_slice.start();
+    for (size_t __i = 0;
+         __i < _M_slice.size();
+         ++__i, __index += _M_slice.stride())
+      _M_array[__index] = __c;
+  }
+
+  ~slice_array() {}
+
+private:
+  slice_array(const slice& __slice, valarray<_Tp>& __array)
+    : _M_slice(__slice), _M_array(__array)
+    {}
+
+  slice          _M_slice;
+  valarray<_Tp>& _M_array;
+
+private:                        // Disable assignment and default constructor
+  slice_array();
+};
+
+// valarray member functions dealing with slice and slice_array
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const slice_array<_Tp>& __x)
+  : _Valarray_base<_Tp>(__x._M_slice.size())
+{
+  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+          _Is_Trivial;
+  _M_initialize(_Is_Trivial());  
+  *this = __x;
+}
+
+
+template <class _Tp>
+inline slice_array<_Tp> valarray<_Tp>::operator[](slice __slice) {
+  return slice_array<_Tp>(__slice, *this);
+}
+
+//----------------------------------------------------------------------
+// gslice and gslice_array
+
+template <class _Size>
+struct _Gslice_Iter_tmpl;
+
+class gslice {
+  friend struct _Gslice_Iter_tmpl<size_t>;
+public:
+  gslice() : _M_start(0), _M_lengths(0), _M_strides(0) {}
+  gslice(size_t __start,
+         const _Valarray_size_t& __lengths, const _Valarray_size_t& __strides)
+    : _M_start(__start), _M_lengths(__lengths), _M_strides(__strides)
+    {}
+  __TRIVIAL_DESTRUCTOR(gslice)
+
+  size_t start()            const { return _M_start; }
+  _Valarray_size_t size()   const { return _M_lengths; }
+  _Valarray_size_t stride() const { return _M_strides; }
+
+  // Extension: check for an empty gslice.
+  bool _M_empty() const { return _M_lengths.size() == 0; }
+
+  // Extension: number of indices this gslice represents.  (For a degenerate
+  // gslice, they're not necessarily all distinct.)
+  size_t _M_size() const {
+    return !this->_M_empty()
+      ? accumulate(_M_lengths._M_first + 1,
+                   _M_lengths._M_first + _M_lengths._M_size,
+                   _M_lengths[0],
+                   multiplies<size_t>())
+      : 0;
+  }
+
+# ifndef __HP_aCC
+private:
+# endif
+
+  size_t _M_start;
+  _Valarray_size_t _M_lengths;
+  _Valarray_size_t _M_strides;
+};
+
+// This is not an STL iterator.  It is constructed from a gslice, and it
+// steps through the gslice indices in sequence.  See 23.3.6 of the C++
+// standard, paragraphs 2-3, for an explanation of the sequence.  At
+// each step we get two things: the ordinal (i.e. number of steps taken),
+// and the one-dimensional index.
+
+template <class _Size>
+struct _Gslice_Iter_tmpl {
+  _Gslice_Iter_tmpl(const gslice& __gslice)
+    : _M_step(0), _M_1d_idx(__gslice.start()),
+      _M_indices(size_t(0), __gslice._M_lengths.size()),
+      _M_gslice(__gslice)
+    {}
+    
+  bool _M_done() const { return _M_indices[0] == _M_gslice._M_lengths[0]; }
+
+  bool _M_incr();
+
+  _Size _M_step;
+  _Size _M_1d_idx;
+
+  valarray<_Size> _M_indices;
+  const gslice& _M_gslice;
+};
+
+typedef _Gslice_Iter_tmpl<size_t> _Gslice_Iter;
+
+template <class _Tp>
+class gslice_array {
+  friend class valarray<_Tp>;
+public:
+  typedef _Tp value_type;
+
+  void operator= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] = __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator*= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] *= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator/= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] /= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator%= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] %= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator+= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] += __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator-= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] -= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator^= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] ^= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator&= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] &= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator|= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] |= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator<<= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] <<= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator>>= (const valarray<value_type>& __x) const {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] >>= __x[__i._M_step]; while(__i._M_incr());
+    }
+  }
+
+  void operator= (const value_type& __c) {
+    if (!_M_gslice._M_empty()) {
+      _Gslice_Iter __i(_M_gslice);
+      do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr());
+    }
+  }
+
+  ~gslice_array() {}
+
+private:                        
+  gslice_array(gslice __gslice, valarray<_Tp>& __array)
+    : _M_gslice(__gslice), _M_array(__array)
+    {}
+
+  gslice                _M_gslice;
+  valarray<value_type>& _M_array;
+
+private:                        // Disable assignment
+  void operator=(const gslice_array<_Tp>&);
+};
+
+// valarray member functions dealing with gslice and gslice_array.  Note
+// that it is illegal (behavior is undefined) to construct a gslice_array
+// from a degenerate gslice.
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const gslice_array<_Tp>& __x)
+  : _Valarray_base<_Tp>(__x._M_gslice._M_size())
+{
+  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+          _Is_Trivial;
+  _M_initialize(_Is_Trivial());  
+  *this = __x;
+}
+
+template <class _Tp>
+inline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __slice) {
+  return gslice_array<_Tp>(__slice, *this);
+}
+
+
+//----------------------------------------------------------------------
+// mask_array
+
+template <class _Tp>
+class mask_array {
+  friend class valarray<_Tp>;
+public:
+  typedef _Tp value_type;
+
+  void operator=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] = __x[__idx++];
+  }
+
+  void operator*=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] *= __x[__idx++];
+  }
+
+  void operator/=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] /= __x[__idx++];
+  }
+
+  void operator%=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] %= __x[__idx++];
+  }
+
+  void operator+=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] += __x[__idx++];
+  }
+
+  void operator-=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] -= __x[__idx++];
+  }
+  
+  void operator^=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] ^= __x[__idx++];
+  }
+
+  void operator&=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] &= __x[__idx++];
+  }
+
+  void operator|=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] |= __x[__idx++];
+  }
+
+  void operator<<=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] <<= __x[__idx++];
+  }
+
+  void operator>>=(const valarray<value_type>& __x) const {
+    size_t __idx = 0;
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] >>= __x[__idx++];
+  }
+
+  void operator=(const value_type& __c) const {
+    for (size_t __i = 0; __i < _M_array.size(); ++__i)
+      if (_M_mask[__i]) _M_array[__i] = __c;
+  }
+
+  ~mask_array() {}
+
+  // Extension: number of true values in the mask
+  size_t _M_num_true() const {
+    size_t __result = 0;
+    for (size_t __i = 0; __i < _M_mask.size(); ++__i)
+      if (_M_mask[__i]) ++__result;
+    return __result;
+  }
+
+private:
+  mask_array(const _Valarray_bool& __mask, valarray<_Tp>& __array)
+    : _M_mask(__mask), _M_array(__array)
+    {}
+
+  _Valarray_bool _M_mask;
+  valarray<_Tp>& _M_array;
+
+private:                        // Disable assignment
+  void operator=(const mask_array<_Tp>&);
+};
+
+// valarray member functions dealing with mask_array
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const mask_array<_Tp>& __x)
+  : _Valarray_base<_Tp>(__x._M_num_true())
+{
+  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+          _Is_Trivial;
+  _M_initialize(_Is_Trivial());  
+  *this = __x;
+}
+
+// Behavior is undefined if __x._M_num_true() != this->size()
+template <class _Tp>
+inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<_Tp>& __x) {
+  size_t __idx = 0;
+  for (size_t __i = 0; __i < __x._M_array.size(); ++__i)
+    if (__x._M_mask[__i]) (*this)[__idx++] = __x._M_array[__i];
+  return *this;
+}
+
+template <class _Tp>
+inline mask_array<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask)
+{
+  return mask_array<_Tp>(__mask, *this);
+}
+
+
+//----------------------------------------------------------------------
+// indirect_array
+
+template <class _Tp>
+class indirect_array {
+  friend class valarray<_Tp>;
+public:
+  typedef _Tp value_type;
+
+  void operator=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] = __x[__i];
+  }
+
+  void operator*=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] *= __x[__i];
+  }
+
+  void operator/=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] /= __x[__i];
+  }
+
+  void operator%=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] %= __x[__i];
+  }
+
+  void operator+=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] += __x[__i];
+  }
+
+  void operator-=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] -= __x[__i];
+  }
+
+  void operator^=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] ^= __x[__i];
+  }
+
+  void operator&=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] &= __x[__i];
+  }
+
+  void operator|=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] |= __x[__i];
+  }
+
+  void operator<<=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] <<= __x[__i];
+  }
+
+  void operator>>=(const valarray<value_type>& __x) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] >>= __x[__i];
+  }
+
+  void operator=(const value_type& __c) const {
+    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
+      _M_array[_M_addr[__i]] = __c;
+  }
+
+  ~indirect_array() {}
+
+private:
+  indirect_array(const _Valarray_size_t& __addr, valarray<_Tp>& __array)
+    : _M_addr(__addr), _M_array(__array)
+    {}
+
+  _Valarray_size_t _M_addr;
+  valarray<_Tp>&   _M_array;
+
+private:                        // Disable assignment
+  void operator=(const indirect_array<_Tp>&);
+};
+
+// valarray member functions dealing with indirect_array
+
+template <class _Tp>
+inline valarray<_Tp>::valarray(const indirect_array<_Tp>& __x)
+  : _Valarray_base<_Tp>(__x._M_addr.size())
+{
+  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
+          _Is_Trivial;
+  _M_initialize(_Is_Trivial());  
+  *this = __x;
+}
+
+
+template <class _Tp>
+inline indirect_array<_Tp>
+valarray<_Tp>::operator[](const _Valarray_size_t& __addr)
+{
+  return indirect_array<_Tp>(__addr, *this);
+}
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_valarray.c>
+# endif
+
+#endif /* _STLP_VALARRAY */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/_vector.c b/src/STLport/stl/_vector.c
new file mode 100644
index 0000000..30ec488
--- /dev/null
+++ b/src/STLport/stl/_vector.c
@@ -0,0 +1,137 @@
+/*
+ *
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+#ifndef _STLP_VECTOR_C
+#define _STLP_VECTOR_C
+
+# if !defined (_STLP_INTERNAL_VECTOR_H)
+#  include <stl/_vector.h>
+# endif
+
+# if defined ( _STLP_NESTED_TYPE_PARAM_BUG )
+#  define iterator       _Tp*
+#  define size_type           size_t
+# endif
+
+#  undef  vector
+#  define vector __WORKAROUND_DBG_RENAME(vector)
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Tp, class _Alloc>
+void 
+__vector__<_Tp, _Alloc>::reserve(size_type __n) {
+  if (capacity() < __n) {
+    const size_type __old_size = size();
+    pointer __tmp;
+    if (this->_M_start) {
+      __tmp = _M_allocate_and_copy(__n, this->_M_start, this->_M_finish);
+      _M_clear();
+    } else {
+      __tmp = this->_M_end_of_storage.allocate(__n);
+    }
+    _M_set(__tmp, __tmp + __old_size, __tmp + __n);
+  }
+}
+
+template <class _Tp, class _Alloc>
+void 
+__vector__<_Tp, _Alloc>::_M_fill_insert(
+				    iterator __position, 
+				    size_type __n, const _Tp& __x) {
+  if (__n != 0) {
+    if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
+      _Tp __x_copy = __x;
+      const size_type __elems_after = this->_M_finish - __position;
+      pointer __old_finish = this->_M_finish;
+      if (__elems_after > __n) {
+        __uninitialized_copy(this->_M_finish - __n, this->_M_finish, this->_M_finish, _IsPODType());
+        this->_M_finish += __n;
+        __copy_backward_ptrs(__position, __old_finish - __n, __old_finish, _TrivialAss());
+        _STLP_STD::fill(__position, __position + __n, __x_copy);
+      }
+      else {
+        uninitialized_fill_n(this->_M_finish, __n - __elems_after, __x_copy);
+        this->_M_finish += __n - __elems_after;
+        __uninitialized_copy(__position, __old_finish, this->_M_finish, _IsPODType());
+        this->_M_finish += __elems_after;
+        _STLP_STD::fill(__position, __old_finish, __x_copy);
+      }
+    }
+    else 
+      _M_insert_overflow(__position, __x, _IsPODType(), __n);
+  }
+}
+
+template <class _Tp, class _Alloc>
+__vector__<_Tp,_Alloc>& 
+__vector__<_Tp,_Alloc>::operator=(const __vector__<_Tp, _Alloc>& __x)
+{
+  if (&__x != this) {
+    const size_type __xlen = __x.size();
+    if (__xlen > capacity()) {
+      pointer __tmp = _M_allocate_and_copy(__xlen, (const_pointer)__x._M_start+0, (const_pointer)__x._M_finish+0);
+      _M_clear();
+      this->_M_start = __tmp;
+      this->_M_end_of_storage._M_data = this->_M_start + __xlen;
+    }
+    else if (size() >= __xlen) {
+      pointer __i = __copy_ptrs((const_pointer)__x._M_start+0, (const_pointer)__x._M_finish+0, (pointer)this->_M_start, _TrivialAss());
+      _STLP_STD::_Destroy(__i, this->_M_finish);
+    }
+    else {
+      __copy_ptrs((const_pointer)__x._M_start, (const_pointer)__x._M_start + size(), (pointer)this->_M_start, _TrivialAss());
+      __uninitialized_copy((const_pointer)__x._M_start + size(), (const_pointer)__x._M_finish+0, this->_M_finish, _IsPODType());
+    }
+    this->_M_finish = this->_M_start + __xlen;
+  }
+  return *this;
+}
+
+template <class _Tp, class _Alloc>
+void __vector__<_Tp, _Alloc>::_M_fill_assign(size_t __n, const _Tp& __val) {
+  if (__n > capacity()) {
+    __vector__<_Tp, _Alloc> __tmp(__n, __val, get_allocator());
+    __tmp.swap(*this);
+  }
+  else if (__n > size()) {
+    fill(begin(), end(), __val);
+    this->_M_finish = _STLP_STD::uninitialized_fill_n(this->_M_finish, __n - size(), __val);
+  }
+  else
+    erase(_STLP_STD::fill_n(begin(), __n, __val), end());
+}
+
+_STLP_END_NAMESPACE
+
+# undef size_type
+# undef iterator
+# undef vector
+
+#endif /*  _STLP_VECTOR_C */
+
+      // Local Variables:
+	// mode:C++
+	// End:
diff --git a/src/STLport/stl/_vector.h b/src/STLport/stl/_vector.h
new file mode 100644
index 0000000..7ad440c
--- /dev/null
+++ b/src/STLport/stl/_vector.h
@@ -0,0 +1,591 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+#define _STLP_INTERNAL_VECTOR_H
+
+
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ALLOC_H
+#  include <stl/_alloc.h>
+# endif
+
+# ifndef _STLP_INTERNAL_ITERATOR_H
+#  include <stl/_iterator.h>
+# endif
+
+# ifndef _STLP_INTERNAL_UNINITIALIZED_H
+#  include <stl/_uninitialized.h>
+# endif
+
+# ifndef _STLP_RANGE_ERRORS_H
+#  include <stl/_range_errors.h>
+# endif
+
+#  undef  vector
+#  define vector __WORKAROUND_DBG_RENAME(vector)
+
+_STLP_BEGIN_NAMESPACE 
+
+// The vector base class serves two purposes.  First, its constructor
+// and destructor allocate (but don't initialize) storage.  This makes
+// exception safety easier.
+
+template <class _Tp, class _Alloc> 
+class _Vector_base {
+public:
+
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Alloc_traits<_Tp, _Alloc>::allocator_type allocator_type;
+
+  _Vector_base(const _Alloc& __a)
+    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0) {
+  }
+  _Vector_base(size_t __n, const _Alloc& __a)
+    : _M_start(0), _M_finish(0), _M_end_of_storage(__a, 0)
+  {
+    _M_start = _M_end_of_storage.allocate(__n);
+    _M_finish = _M_start;
+    _M_end_of_storage._M_data = _M_start + __n;
+	_STLP_MPWFIX_TRY _STLP_MPWFIX_CATCH
+  }
+
+  ~_Vector_base() { 
+    if (_M_start !=0) 
+    _M_end_of_storage.deallocate(_M_start, _M_end_of_storage._M_data - _M_start); 
+  }
+
+protected:
+  _Tp* _M_start;
+  _Tp* _M_finish;
+  _STLP_alloc_proxy<_Tp*, _Tp, allocator_type> _M_end_of_storage;
+};
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class vector : public _Vector_base<_Tp, _Alloc> 
+{
+private:
+  typedef _Vector_base<_Tp, _Alloc> _Base;
+public:
+  typedef _Tp value_type;
+  typedef value_type* pointer;
+  typedef const value_type* const_pointer;
+  typedef value_type* iterator;
+  typedef const value_type* const_iterator;
+
+public:
+  typedef value_type& reference;
+  typedef const value_type& const_reference;
+  typedef size_t size_type;
+  typedef ptrdiff_t difference_type;
+  typedef random_access_iterator_tag _Iterator_category;
+
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+  _STLP_FORCE_ALLOCATORS(_Tp, _Alloc)
+  typedef typename _Vector_base<_Tp, _Alloc>::allocator_type allocator_type;
+
+  allocator_type get_allocator() const {
+    return _STLP_CONVERT_ALLOCATOR((const allocator_type&)this->_M_end_of_storage, _Tp);
+  }
+protected:
+  typedef typename  __type_traits<_Tp>::has_trivial_assignment_operator _TrivialAss;
+  typedef typename  __type_traits<_Tp>::has_trivial_assignment_operator _IsPODType;
+
+  // handles insertions on overflow
+  void _M_insert_overflow(pointer __position, const _Tp& __x, const __false_type&, 
+			  size_type __fill_len, bool __atend = false) {
+    const size_type __old_size = size();
+    const size_type __len = __old_size + (max)(__old_size, __fill_len);
+    
+    pointer __new_start = this->_M_end_of_storage.allocate(__len);
+    pointer __new_finish = __new_start;
+    _STLP_TRY {
+      __new_finish = __uninitialized_copy(this->_M_start, __position, __new_start, __false_type());
+      // handle insertion
+      if (__fill_len == 1) {
+        _Construct(__new_finish, __x);
+        ++__new_finish;
+      } else
+        __new_finish = __uninitialized_fill_n(__new_finish, __fill_len, __x, __false_type());
+      if (!__atend)
+        // copy remainder
+        __new_finish = __uninitialized_copy(__position, this->_M_finish, __new_finish, __false_type());
+    }
+    _STLP_UNWIND((_Destroy(__new_start,__new_finish), 
+                  this->_M_end_of_storage.deallocate(__new_start,__len)));
+    _M_clear();
+    _M_set(__new_start, __new_finish, __new_start + __len);
+  }
+
+  void _M_insert_overflow(pointer __position, const _Tp& __x, const __true_type&, 
+			  size_type __fill_len, bool __atend = false) {
+    const size_type __old_size = size();
+    const size_type __len = __old_size + (max)(__old_size, __fill_len);
+    
+    pointer __new_start = this->_M_end_of_storage.allocate(__len);
+    pointer __new_finish = (pointer)__copy_trivial(this->_M_start, __position, __new_start);
+      // handle insertion
+    __new_finish = fill_n(__new_finish, __fill_len, __x);
+    if (!__atend)
+      // copy remainder
+      __new_finish = (pointer)__copy_trivial(__position, this->_M_finish, __new_finish);
+    _M_clear();
+    _M_set(__new_start, __new_finish, __new_start + __len);
+  }
+ 
+  void _M_range_check(size_type __n) const {
+    if (__n >= size_type(this->_M_finish-this->_M_start))
+      __stl_throw_out_of_range("vector");
+  }
+
+public:
+  iterator begin()             { return this->_M_start; }
+  const_iterator begin() const { return this->_M_start; }
+  iterator end()               { return this->_M_finish; }
+  const_iterator end() const   { return this->_M_finish; }
+
+  reverse_iterator rbegin()              { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const  { return const_reverse_iterator(end()); }
+  reverse_iterator rend()                { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const    { return const_reverse_iterator(begin()); }
+
+  size_type size() const        { return size_type(this->_M_finish - this->_M_start); }
+  size_type max_size() const    { return size_type(-1) / sizeof(_Tp); }
+  size_type capacity() const    { return size_type(this->_M_end_of_storage._M_data - this->_M_start); }
+  bool empty() const            { return this->_M_start == this->_M_finish; }
+
+  reference operator[](size_type __n) { return *(begin() + __n); }
+  const_reference operator[](size_type __n) const { return *(begin() + __n); }
+
+  reference front()             { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back()              { return *(end() - 1); }
+  const_reference back() const  { return *(end() - 1); }
+
+  reference at(size_type __n) { _M_range_check(__n); return (*this)[__n]; }
+  const_reference at(size_type __n) const { _M_range_check(__n); return (*this)[__n]; }
+
+  explicit vector(const allocator_type& __a = allocator_type()) : 
+    _Vector_base<_Tp, _Alloc>(__a) {}
+
+  vector(size_type __n, const _Tp& __val,
+         const allocator_type& __a = allocator_type()) 
+    : _Vector_base<_Tp, _Alloc>(__n, __a) { 
+    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __val); 
+  }
+
+  explicit vector(size_type __n)
+    : _Vector_base<_Tp, _Alloc>(__n, allocator_type() ) {
+    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, _Tp()); 
+  }
+
+  vector(const vector<_Tp, _Alloc>& __x) 
+    : _Vector_base<_Tp, _Alloc>(__x.size(), __x.get_allocator()) { 
+    this->_M_finish = __uninitialized_copy((const_pointer)__x._M_start, 
+                                           (const_pointer)__x._M_finish, this->_M_start, _IsPODType());
+  }
+  
+#if defined (_STLP_MEMBER_TEMPLATES)
+
+  template <class _Integer>
+  void _M_initialize_aux(_Integer __n, _Integer __val, const __true_type&) {
+    this->_M_start = this->_M_end_of_storage.allocate(__n);
+    this->_M_end_of_storage._M_data = this->_M_start + __n; 
+    this->_M_finish = uninitialized_fill_n(this->_M_start, __n, __val);
+  }
+
+  template <class _InputIterator>
+  void _M_initialize_aux(_InputIterator __first, _InputIterator __last,
+                         const __false_type&) {
+    _M_range_initialize(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+  }
+
+  // Check whether it's an integral type.  If so, it's not an iterator.
+ # ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  vector(_InputIterator __first, _InputIterator __last) :
+    _Vector_base<_Tp, _Alloc>(allocator_type()) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_aux(__first, __last, _Integral());
+  }
+ # endif
+  template <class _InputIterator>
+  vector(_InputIterator __first, _InputIterator __last,
+         const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL ) :
+    _Vector_base<_Tp, _Alloc>(__a) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_initialize_aux(__first, __last, _Integral());
+  }
+
+#else
+  vector(const _Tp* __first, const _Tp* __last,
+         const allocator_type& __a = allocator_type())
+    : _Vector_base<_Tp, _Alloc>(__last - __first, __a) { 
+      this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType()); 
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  ~vector() { _Destroy(this->_M_start, this->_M_finish); }
+
+  vector<_Tp, _Alloc>& operator=(const vector<_Tp, _Alloc>& __x);
+
+  void reserve(size_type __n);
+
+  // assign(), a generalized assignment member function.  Two
+  // versions: one that takes a count, and one that takes a range.
+  // The range version is a member template, so we dispatch on whether
+  // or not the type is an integer.
+
+  void assign(size_type __n, const _Tp& __val) { _M_fill_assign(__n, __val); }
+  void _M_fill_assign(size_type __n, const _Tp& __val);
+  
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _ForwardIter>
+  void _M_assign_aux(_ForwardIter __first, _ForwardIter __last, const forward_iterator_tag &)
+#else
+  void assign(const_iterator __first, const_iterator __last)
+#endif
+  {
+    size_type __len = distance(__first, __last);
+    
+    if (__len > capacity()) {
+      iterator __tmp = _M_allocate_and_copy(__len, __first, __last);
+    _M_clear();
+    _M_set(__tmp, __tmp + __len, __tmp + __len);
+    }
+    else if (size() >= __len) {
+      iterator __new_finish = copy(__first, __last, this->_M_start);
+      _Destroy(__new_finish, this->_M_finish);
+      this->_M_finish = __new_finish;
+    }
+    else {
+# if defined ( _STLP_MEMBER_TEMPLATES )
+          _ForwardIter __mid = __first;
+          advance(__mid, size());
+# else
+          const_iterator __mid = __first + size() ;
+# endif
+    copy(__first, __mid, this->_M_start);
+    this->_M_finish = __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType());
+    }
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIter>
+  void _M_assign_aux(_InputIter __first, _InputIter __last,
+		     const input_iterator_tag &) {
+    iterator __cur = begin();
+    for ( ; __first != __last && __cur != end(); ++__cur, ++__first)
+      *__cur = *__first;
+    if (__first == __last)
+      erase(__cur, end());
+    else
+      insert(end(), __first, __last);
+  }
+  
+  template <class _Integer>
+  void _M_assign_dispatch(_Integer __n, _Integer __val, const __true_type&)
+    { assign((size_type) __n, (_Tp) __val); }
+
+  template <class _InputIter>
+  void _M_assign_dispatch(_InputIter __first, _InputIter __last, const __false_type&)
+    { _M_assign_aux(__first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIter)); }
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_assign_dispatch(__first, __last, _Integral());
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void push_back(const _Tp& __x) {
+    if (this->_M_finish != this->_M_end_of_storage._M_data) {
+      _Construct(this->_M_finish, __x);
+      ++this->_M_finish;
+    }
+    else
+      _M_insert_overflow(this->_M_finish, __x, _IsPODType(), 1UL, true);
+  }
+
+  void swap(vector<_Tp, _Alloc>& __x) {
+    _STLP_STD::swap(this->_M_start, __x._M_start);
+    _STLP_STD::swap(this->_M_finish, __x._M_finish);
+    _STLP_STD::swap(this->_M_end_of_storage, __x._M_end_of_storage);
+  }
+
+  iterator insert(iterator __position, const _Tp& __x) {
+    size_type __n = __position - begin();
+    if (this->_M_finish != this->_M_end_of_storage._M_data) {
+      if (__position == end()) {
+        _Construct(this->_M_finish, __x);
+        ++this->_M_finish;
+      } else {
+        _Construct(this->_M_finish, *(this->_M_finish - 1));
+        ++this->_M_finish;
+        _Tp __x_copy = __x;
+        __copy_backward_ptrs(__position, this->_M_finish - 2, this->_M_finish - 1, _TrivialAss());
+        *__position = __x_copy;
+      }
+    }
+    else
+      _M_insert_overflow(__position, __x, _IsPODType(), 1UL);
+    return begin() + __n;
+  }
+
+# ifndef _STLP_NO_ANACHRONISMS
+  void push_back() { push_back(_Tp()); }
+  iterator insert(iterator __position) { return insert(__position, _Tp()); }
+# endif
+
+  void _M_fill_insert (iterator __pos, size_type __n, const _Tp& __x);
+
+#if defined ( _STLP_MEMBER_TEMPLATES)
+
+  template <class _Integer>
+  void _M_insert_dispatch(iterator __pos, _Integer __n, _Integer __val,
+                          const __true_type&) {
+    _M_fill_insert(__pos, (size_type) __n, (_Tp) __val);
+  }
+
+  template <class _InputIterator>
+  void _M_insert_dispatch(iterator __pos,
+                          _InputIterator __first, _InputIterator __last,
+                          const __false_type&) {
+    _M_range_insert(__pos, __first, __last, _STLP_ITERATOR_CATEGORY(__first, _InputIterator));
+  }
+
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InputIterator>
+  void insert(iterator __pos, _InputIterator __first, _InputIterator __last) {
+    typedef typename _Is_integer<_InputIterator>::_Integral _Integral;
+    _M_insert_dispatch(__pos, __first, __last, _Integral());
+  }
+
+  template <class _InputIterator>
+  void _M_range_insert(iterator __pos, 
+		       _InputIterator __first, 
+		       _InputIterator __last,
+		       const input_iterator_tag &) {
+    for ( ; __first != __last; ++__first) {
+      __pos = insert(__pos, *__first);
+      ++__pos;
+    }
+  }
+
+  template <class _ForwardIterator>
+  void _M_range_insert(iterator __position,
+                       _ForwardIterator __first,
+                       _ForwardIterator __last,
+                       const forward_iterator_tag &) 
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert(iterator __position,
+              const_iterator __first, const_iterator __last)
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  {
+    if (__first != __last) {
+      size_type __n = distance(__first, __last);
+
+      if (size_type(this->_M_end_of_storage._M_data - this->_M_finish) >= __n) {
+        const size_type __elems_after = this->_M_finish - __position;
+        pointer __old_finish = this->_M_finish;
+        if (__elems_after > __n) {
+          __uninitialized_copy(this->_M_finish - __n, this->_M_finish, this->_M_finish, _IsPODType());
+          this->_M_finish += __n;
+          __copy_backward_ptrs(__position, __old_finish - __n, __old_finish, _TrivialAss());
+          copy(__first, __last, __position);
+        }
+        else {
+# if defined ( _STLP_MEMBER_TEMPLATES )
+          _ForwardIterator __mid = __first;
+          advance(__mid, __elems_after);
+# else
+          const_pointer __mid = __first + __elems_after;
+# endif
+          __uninitialized_copy(__mid, __last, this->_M_finish, _IsPODType());
+          this->_M_finish += __n - __elems_after;
+          __uninitialized_copy(__position, __old_finish, this->_M_finish, _IsPODType());
+          this->_M_finish += __elems_after;
+          copy(__first, __mid, __position);
+        } /* elems_after */
+      }
+      else {
+        const size_type __old_size = size();
+        const size_type __len = __old_size + (max)(__old_size, __n);
+        pointer __new_start = this->_M_end_of_storage.allocate(__len);
+        pointer __new_finish = __new_start;
+        _STLP_TRY {
+          __new_finish = __uninitialized_copy(this->_M_start, __position, __new_start, _IsPODType());
+          __new_finish = __uninitialized_copy(__first, __last, __new_finish, _IsPODType());
+          __new_finish = __uninitialized_copy(__position, this->_M_finish, __new_finish, _IsPODType());
+        }
+        _STLP_UNWIND((_Destroy(__new_start,__new_finish), 
+                      this->_M_end_of_storage.deallocate(__new_start,__len)));
+        _M_clear();
+        _M_set(__new_start, __new_finish, __new_start + __len);
+      }
+    }
+  }
+  void insert (iterator __pos, size_type __n, const _Tp& __x)
+  { _M_fill_insert(__pos, __n, __x); }
+  
+  void pop_back() {
+    --this->_M_finish;
+    _Destroy(this->_M_finish);
+  }
+  iterator erase(iterator __position) {
+    if (__position + 1 != end())
+      __copy_ptrs(__position + 1, this->_M_finish, __position, _TrivialAss());
+    --this->_M_finish;
+    _Destroy(this->_M_finish);
+    return __position;
+  }
+  iterator erase(iterator __first, iterator __last) {
+    pointer __i = __copy_ptrs(__last, this->_M_finish, __first, _TrivialAss());
+    _Destroy(__i, this->_M_finish);
+    this->_M_finish = __i;
+    return __first;
+  }
+
+  void resize(size_type __new_size, _Tp __x) {
+    if (__new_size < size()) 
+      erase(begin() + __new_size, end());
+    else
+      insert(end(), __new_size - size(), __x);
+  }
+  void resize(size_type __new_size) { resize(__new_size, _Tp()); }
+  void clear() { 
+    erase(begin(), end());
+  }
+
+protected:
+
+  void _M_clear() {
+    //    if (this->_M_start) {
+    _Destroy(this->_M_start, this->_M_finish);
+    this->_M_end_of_storage.deallocate(this->_M_start, this->_M_end_of_storage._M_data - this->_M_start);
+    //    }
+  }
+
+  void _M_set(pointer __s, pointer __f, pointer __e) {
+    this->_M_start = __s;
+    this->_M_finish = __f;
+    this->_M_end_of_storage._M_data = __e;
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _ForwardIterator>
+  pointer _M_allocate_and_copy(size_type __n, _ForwardIterator __first, 
+				_ForwardIterator __last)
+#else /* _STLP_MEMBER_TEMPLATES */
+  pointer _M_allocate_and_copy(size_type __n, const_pointer __first, 
+			       const_pointer __last)
+#endif /* _STLP_MEMBER_TEMPLATES */
+  {
+    pointer __result = this->_M_end_of_storage.allocate(__n);
+    _STLP_TRY {
+#if !defined(__MRC__)		//*TY 12/17/2000 - added workaround for MrCpp. it confuses on nested try/catch block
+      __uninitialized_copy(__first, __last, __result, _IsPODType());
+#else
+      uninitialized_copy(__first, __last, __result);
+#endif
+      return __result;
+    }
+    _STLP_UNWIND(this->_M_end_of_storage.deallocate(__result, __n));
+# ifdef _STLP_THROW_RETURN_BUG
+	return __result;
+# endif
+  }
+
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void _M_range_initialize(_InputIterator __first,  
+                           _InputIterator __last, const input_iterator_tag &) {
+    for ( ; __first != __last; ++__first)
+      push_back(*__first);
+  }
+  // This function is only called by the constructor. 
+  template <class _ForwardIterator>
+  void _M_range_initialize(_ForwardIterator __first,
+                           _ForwardIterator __last, const forward_iterator_tag &) {
+    size_type __n = distance(__first, __last);
+    this->_M_start = this->_M_end_of_storage.allocate(__n);
+    this->_M_end_of_storage._M_data = this->_M_start + __n;
+    this->_M_finish = __uninitialized_copy(__first, __last, this->_M_start, _IsPODType());
+  }
+  
+#endif /* _STLP_MEMBER_TEMPLATES */
+};
+
+# define _STLP_TEMPLATE_CONTAINER vector<_Tp, _Alloc>
+# define _STLP_TEMPLATE_HEADER    template <class _Tp, class _Alloc>
+# include <stl/_relops_cont.h>
+# undef _STLP_TEMPLATE_CONTAINER
+# undef _STLP_TEMPLATE_HEADER
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+_STLP_EXPORT_TEMPLATE_CLASS allocator<void*>;
+_STLP_EXPORT_TEMPLATE_CLASS _STLP_alloc_proxy<void**, void*, allocator<void*> >;
+_STLP_EXPORT_TEMPLATE_CLASS _Vector_base<void*,allocator<void*> >;
+_STLP_EXPORT_TEMPLATE_CLASS vector<void*,allocator<void*> >;
+# endif
+
+#  undef  vector
+#  undef  __vector__
+#  define __vector__ __WORKAROUND_RENAME(vector)
+
+_STLP_END_NAMESPACE
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/_vector.c>
+# endif
+
+#ifndef _STLP_INTERNAL_BVECTOR_H
+# include <stl/_bvector.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+#  include <stl/debug/_vector.h>
+# endif
+
+# if defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM)
+#  include <stl/wrappers/_vector.h>
+# endif
+
+#endif /* _STLP_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/c_locale.h b/src/STLport/stl/c_locale.h
new file mode 100644
index 0000000..0a619ea
--- /dev/null
+++ b/src/STLport/stl/c_locale.h
@@ -0,0 +1,436 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+
+#ifndef _STLP_C_LOCALE_H
+# define _STLP_C_LOCALE_H
+
+/*
+ * Implementation dependent definitions
+ */
+#ifdef __cplusplus
+#  include <stl/_config.h>
+#endif
+
+#if defined(__sgi) 
+# if defined(ROOT_65) /* IRIX 6.5.x */
+#  include <sgidefs.h>
+#  include <standards.h>
+#  include <wchar.h>
+#  include <ctype.h>
+
+# else
+                  /* IRIX pre-6.5 */
+#  include <sgidefs.h>
+#  include <standards.h>
+
+#  if !defined(_SIZE_T) && !defined(_SIZE_T_)
+#   define _SIZE_T
+#    if (_MIPS_SZLONG == 32)
+typedef unsigned int    size_t;
+#    endif
+#    if (_MIPS_SZLONG == 64)
+typedef unsigned long   size_t;
+#    endif
+#   endif
+
+#   ifndef _WCHAR_T
+#    define _WCHAR_T
+#     if (_MIPS_SZLONG == 32)
+typedef long wchar_t;
+#     endif
+#     if (_MIPS_SZLONG == 64)
+typedef __int32_t wchar_t;
+#     endif
+#    endif /* _WCHAR_T */
+
+#    ifndef _WINT_T
+#     define _WINT_T
+#     if (_MIPS_SZLONG == 32)
+        typedef long    wint_t;
+#     endif
+#     if (_MIPS_SZLONG == 64)
+        typedef __int32_t wint_t;
+#     endif
+#    endif /* _WINT_T */
+
+#    ifndef _MBSTATE_T
+#    define _MBSTATE_T
+#    ifdef _MSC_VER
+		typedef int		mbstate_t;
+#    else
+        typedef char    mbstate_t;
+#    endif
+#    endif /* _MBSTATE_T */
+
+#   endif /* ROOT65 */ 
+
+#  else /* __sgi */
+
+# ifdef __cplusplus
+# ifndef _STLP_CSTDDEF
+#  include <cstddef>
+# endif
+# ifndef _STLP_CWCHAR_H
+#  include <stl/_cwchar.h>
+# endif
+# ifndef _STLP_CCTYPE
+#  include <cctype>
+# endif
+# else
+#  include <stddef.h>
+#  include <wchar.h>
+#  include <ctype.h>
+# endif
+
+#endif /* __sgi */
+
+/*
+ * GENERAL FRAMEWORK
+ */
+
+struct _Locale_ctype;
+struct _Locale_numeric;
+struct _Locale_time;
+struct _Locale_collate;
+struct _Locale_monetary;
+struct _Locale_messages;
+
+/*
+  Bitmask macros.  
+*/
+
+/*
+ * For narrow characters, we expose the lookup table interface.
+ */
+
+/* Internal bitmask macros, os-specific. */
+
+#if defined(__sgi)              /* IRIX */
+
+#define _Locale_S      0x00000008      /* Spacing character */
+#define _Locale_A      0x00004000      /* Alphabetical characters only */
+#define _Locale_B      0x00000040      /* Obsolete: was space char only */
+#define _Locale_PR     0x00008000      /* Printable characters only */
+#define _Locale_G      0x40000000      /* Graphic characters only */
+#define _Locale_BL     0x80000000      /* The blank character class */
+
+/* Public bitmask macros, must be defined for every OS. These values, of
+ * course, are specific to IRIX. */
+
+#define _Locale_CNTRL  0x00000020      /* Control character */
+#define _Locale_UPPER  0x00000001      /* Upper case */
+#define _Locale_LOWER  0x00000002      /* Lower case */
+#define _Locale_DIGIT  0x00000004      /* Numeral (digit) */
+#define _Locale_XDIGIT 0x00000080      /* heXadecimal digit */
+#define _Locale_PUNCT  0x00000010      /* Punctuation */
+#define _Locale_SPACE  (_Locale_S | _Locale_BL)
+#define _Locale_PRINT  (_Locale_PUNCT | _Locale_UPPER | _Locale_LOWER | \
+                        _Locale_DIGIT | _Locale_A | _Locale_XDIGIT | \
+                        _Locale_PR)
+#define _Locale_ALPHA  _Locale_A
+
+/*
+* All of these except for graph and blank are from the C standard;
+* graph and blank are XPG4.  (graph in XPG4 doesn't mean quite the
+* same thing as graph in the C++ library)
+*/
+
+#endif /* IRIX */
+
+
+#if defined( __Lynx__ )
+ /* azov: On Lynx isalpha defined as (_U | _L), which gives us a mask 
+  * unusable in ctype_table. So we have to redefine it and use hard-coded 
+  * numbers (to avoid potential clashes if system headers change).
+  *
+  * P.S. Actually, I see no reason in using platform-specific masks - 
+  * having just one set of masks for all platforms should work just as
+  * well - we only use them internally and they don't have to be equal 
+  * to whatever defined in local ctype.h
+  *
+  */ 
+#   define _Locale_CNTRL  040     /* _C, Control character */
+#   define _Locale_UPPER  01      /* _U, Upper case */
+#   define _Locale_LOWER  02      /* _L, Lower case */
+#   define _Locale_DIGIT  04      /* _N, Numeral (digit) */
+#   define _Locale_XDIGIT 0200    /* _X, heXadecimal digit */
+#   define _Locale_PUNCT  020     /* _P, Punctuation */
+#   define _Locale_SPACE  010     /* _S, Spacing */
+#   define _Locale_ALPHA  040000  /* none, Alphanumerical */
+#   define _Locale_PRINT  (_Locale_PUNCT | _Locale_UPPER | _Locale_LOWER | \
+                           _Locale_DIGIT | _Locale_ALPHA | _Locale_XDIGIT |\
+                           _Locale_SPACE ) /* Printable */
+# endif /* __Lynx__ */
+
+#if defined(__GNUC__) || defined (__BORLANDC__) || defined (__COMO__)
+
+# if defined (__CYGWIN__)
+
+#  define _Locale_CNTRL  040
+#  define _Locale_UPPER  02
+#  define _Locale_LOWER  01
+#  define _Locale_DIGIT  04
+#  define _Locale_XDIGIT ( 0100 | _Locale_DIGIT )
+#  define _Locale_PUNCT  020
+#  define _Locale_SPACE  010
+#  define _Locale_ALPHA  (_Locale_UPPER | _Locale_LOWER)
+#  define _Locale_PRINT  (_Locale_ALPHA | _Locale_DIGIT | _Locale_PUNCT | 0200 )
+
+# elif defined (__FreeBSD__)
+
+# define _Locale_CNTRL _CTYPE_C
+# define _Locale_UPPER _CTYPE_U
+# define _Locale_LOWER _CTYPE_L
+# define _Locale_DIGIT _CTYPE_D
+# define _Locale_XDIGIT _CTYPE_X
+# define _Locale_PUNCT _CTYPE_P
+# define _Locale_SPACE _CTYPE_S
+# define _Locale_PRINT _CTYPE_R
+# define _Locale_ALPHA _CTYPE_A
+
+# elif defined (__NetBSD__) || defined (__amigaos__)
+ 
+#  define _Locale_CNTRL _C
+#  define _Locale_UPPER _U
+#  define _Locale_LOWER _L
+#  define _Locale_DIGIT _N
+#  define _Locale_XDIGIT (_N|_X)
+#  define _Locale_PUNCT _P
+#  define _Locale_SPACE _S
+#  define _Locale_PRINT (_P|_U|_L|_N|_B)
+#  define _Locale_ALPHA (_U|_L)
+# elif defined(__EMX__) /* OS/2 with emx runtime */
+#  define _Locale_CNTRL _CNTRL
+#  define _Locale_UPPER _UPPER
+#  define _Locale_LOWER _LOWER
+#  define _Locale_DIGIT _DIGIT
+#  define _Locale_XDIGIT _XDIGIT
+#  define _Locale_PUNCT _PUNCT
+#  define _Locale_SPACE _SPACE
+#  define _Locale_PRINT _PRINT
+#  define _Locale_ALPHA (_UPPER|_LOWER)
+
+# elif defined(_STLP_USE_GLIBC) /* linux, using the gnu compiler */
+
+/* This section uses macros defined in the gnu libc ctype.h header */
+
+#  define _Locale_CNTRL  _IScntrl
+#  define _Locale_UPPER  _ISupper
+#  define _Locale_LOWER  _ISlower
+#  define _Locale_DIGIT  _ISdigit
+#  define _Locale_XDIGIT _ISxdigit
+#  define _Locale_PUNCT  _ISpunct
+#  define _Locale_SPACE  _ISspace
+#  define _Locale_PRINT  _ISprint
+#  define _Locale_ALPHA  _ISalpha
+
+#  endif /* GLIBC */
+
+#endif /* gnu */
+
+#if ( defined(__sun) && defined (__SVR4) ) \
+    || (defined (__digital__) && defined (__unix__)) \
+    || defined(_AIX)
+/* fbp : condition from AT&T code*/
+#if !(defined(__XPG4_CHAR_CLASS__) || defined(_XPG4_2) || \
+    (defined(_XOPEN_SOURCE) && (_XOPEN_VERSION - 0 == 4))) && ! defined (_ISCNTRL)
+  /* fbp : on 2.5.1, the defines are different ;( */
+  // # if ( defined (__sun) && defined (__SVR4) && ! defined (_ISCNTRL) )
+#   define _ISCNTRL _C
+#   define _ISUPPER _U
+#   define _ISLOWER _L
+#   define _ISDIGIT _N
+#   define _ISXDIGIT _X
+#   define _ISPUNCT _P
+#   define _ISSPACE _S
+#   define _ISPRINT (_P | _U | _L | _N | _B)
+#   define _ISALPHA (_U | _L)
+#  endif 
+
+#  define _Locale_CNTRL  _ISCNTRL
+#  define _Locale_UPPER  _ISUPPER
+#  define _Locale_LOWER  _ISLOWER
+#  define _Locale_DIGIT  _ISDIGIT
+#  define _Locale_XDIGIT _ISXDIGIT
+#  define _Locale_PUNCT  _ISPUNCT
+#  define _Locale_SPACE  _ISSPACE
+#  define _Locale_PRINT  _ISPRINT
+#  define _Locale_ALPHA  _ISALPHA
+#elif defined (__MWERKS__)
+#  define _Locale_CNTRL  __control_char
+#  define _Locale_UPPER  __upper_case
+#  define _Locale_LOWER  __lower_case
+#  define _Locale_DIGIT  __digit
+#  define _Locale_XDIGIT __hex_digit
+#  define _Locale_PUNCT  __punctuation
+#  define _Locale_SPACE  __space_char
+#  define _Locale_PRINT  __printable
+#  define _Locale_ALPHA  __alphanumeric
+#elif defined (__BORLANDC__)
+#  define _Locale_CNTRL  _IS_CTL
+#  define _Locale_UPPER  _IS_UPP
+#  define _Locale_LOWER  _IS_LOW
+#  define _Locale_DIGIT  _IS_DIG
+#  define _Locale_XDIGIT _IS_HEX
+#  define _Locale_PUNCT  _IS_PUN
+#  define _Locale_SPACE  _IS_SP
+#  define _Locale_PRINT  (_IS_SP|_IS_PUN|_IS_UPP|_IS_LOW|_IS_DIG)
+#  define _Locale_ALPHA  _IS_ALPHA
+#elif defined (_MSC_VER) || defined (__MINGW32__)
+#  define _Locale_CNTRL  _CONTROL
+#  define _Locale_UPPER  _UPPER
+#  define _Locale_LOWER  _LOWER
+#  define _Locale_DIGIT  _DIGIT
+#  define _Locale_XDIGIT _HEX
+#  define _Locale_PUNCT  _PUNCT
+#  define _Locale_SPACE  _SPACE
+#  define _Locale_PRINT  (_ALPHA | _DIGIT | _BLANK | _PUNCT)
+// is this one has to be so complex ?  
+#  define _Locale_ALPHA  ( _ALPHA & ~ (_UPPER | _LOWER )) 
+#elif defined (__DMC__)
+#  define _Locale_CNTRL  _CONTROL
+#  define _Locale_UPPER  _UPPER
+#  define _Locale_LOWER  _LOWER
+#  define _Locale_DIGIT  _DIGIT
+#  define _Locale_XDIGIT _HEX
+#  define _Locale_PUNCT  _PUNCT
+#  define _Locale_SPACE  _SPACE
+#  define _Locale_PRINT  (_UPPER | _LOWER | _DIGIT | _PUNCT | _SPACE)
+#  define _Locale_ALPHA  _ALPHA
+#elif defined(__MRC__) || defined(__SC__)		//*TY 02/24/2000 - added support for MPW
+#  define _Locale_CNTRL  _CTL
+#  define _Locale_UPPER  _UPP
+#  define _Locale_LOWER  _LOW
+#  define _Locale_DIGIT  _DIG
+#  define _Locale_XDIGIT _HEX
+#  define _Locale_PUNCT  _PUN
+#  define _Locale_SPACE  _BLA
+#  define _Locale_PRINT  (_UPP | _LOW | _DIG | _PUN | _BLA)
+#  define _Locale_ALPHA  (_UPP | _LOW)
+#elif defined(__MLCCPP__)
+#  define _Locale_CNTRL    1
+#  define _Locale_UPPER    2
+#  define _Locale_LOWER    4
+#  define _Locale_DIGIT    8
+#  define _Locale_XDIGIT  16
+#  define _Locale_PUNCT   32
+#  define _Locale_SPACE   64
+#  define _Locale_PRINT  128
+#  define _Locale_ALPHA  256
+
+# elif defined (__GNUC__) && defined (__APPLE__)
+ 
+# define _Locale_CNTRL _C
+# define _Locale_UPPER _U
+# define _Locale_LOWER _L
+# define _Locale_DIGIT _D
+# define _Locale_XDIGIT _X
+# define _Locale_PUNCT _P
+# define _Locale_SPACE _S
+# define _Locale_PRINT _R
+# define _Locale_ALPHA _A
+
+# elif defined (__hpux) || defined (__osf__)
+ 
+#   if defined(__HP_aCC) && !defined(_INCLUDE_HPUX_SOURCE)
+#     define _ISALPHA      0x001
+#     define _ISALNUM      0x002
+#     define _ISBLANK      0x004
+#     define _ISCNTRL      0x008
+#     define _ISDIGIT      0x010
+#     define _ISGRAPH      0x020
+#     define _ISLOWER      0x040
+#     define _ISPRINT      0x080
+#     define _ISPUNCT      0x100
+#     define _ISSPACE      0x200
+#     define _ISUPPER      0x400
+#     define _ISXDIGIT     0x800
+#  endif
+#  define _Locale_CNTRL  _ISCNTRL
+#  define _Locale_UPPER  _ISUPPER
+#  define _Locale_LOWER  _ISLOWER
+#  define _Locale_DIGIT  _ISDIGIT
+#  define _Locale_XDIGIT _ISXDIGIT
+#  define _Locale_PUNCT  _ISPUNCT
+#  define _Locale_SPACE  _ISSPACE
+#  define _Locale_PRINT  _ISPRINT
+#  define _Locale_ALPHA  _ISALPHA
+# elif defined (__MVS__) || defined(__OS400__)
+#  define _Locale_CNTRL __ISCNTRL
+#  define _Locale_UPPER __ISUPPER
+#  define _Locale_LOWER __ISLOWER
+#  define _Locale_DIGIT __ISDIGIT
+#  define _Locale_XDIGIT __ISXDIGIT
+#  define _Locale_PUNCT __ISPUNCT
+#  define _Locale_SPACE __ISSPACE
+#  define _Locale_PRINT __ISPRINT
+#  define _Locale_ALPHA __ISALPHA
+# elif defined (__QNXNTO__)  || defined (__WATCOMC__)
+# define _Locale_CNTRL _CNTRL
+# define _Locale_UPPER _UPPER
+# define _Locale_LOWER _LOWER
+# define _Locale_DIGIT _DIGIT
+# define _Locale_XDIGIT _XDIGT
+# define _Locale_PUNCT _PUNCT
+# define _Locale_SPACE _SPACE
+# define _Locale_PRINT _PRINT
+# define _Locale_ALPHA (_UPPER | _LOWER)
+#elif defined (__DJGPP)
+#  define _Locale_CNTRL  __dj_ISCNTRL
+#  define _Locale_UPPER  __dj_ISUPPER
+#  define _Locale_LOWER  __dj_ISLOWER
+#  define _Locale_DIGIT  __dj_ISDIGIT
+#  define _Locale_XDIGIT __dj_ISXDIGIT
+#  define _Locale_PUNCT  __dj_ISPUNCT
+#  define _Locale_SPACE  __dj_ISSPACE
+#  define _Locale_PRINT  __dj_ISPRINT
+#  define _Locale_ALPHA  __dj_ISALPHA
+#elif defined (_STLP_SCO_OPENSERVER)
+#  define _Locale_CNTRL _C
+#  define _Locale_UPPER _U
+#  define _Locale_LOWER _L
+#  define _Locale_DIGIT _N
+#  define _Locale_XDIGIT _X
+#  define _Locale_PUNCT _P
+#  define _Locale_SPACE _S
+#  define _Locale_PRINT _R
+#  define _Locale_ALPHA _A
+#elif defined (__NCR_SVR)
+#  define _Locale_CNTRL _C
+#  define _Locale_UPPER _U
+#  define _Locale_LOWER _L
+#  define _Locale_DIGIT _N
+#  define _Locale_XDIGIT _X
+#  define _Locale_PUNCT _P
+#  define _Locale_SPACE _S
+#  define _Locale_PRINT (_P | _U | _L | _N | _B)
+#  define _Locale_ALPHA (_U | _L)
+#elif defined (_CRAY)
+#  define _Locale_CNTRL  _CNTRL
+#  define _Locale_UPPER  _UPPER
+#  define _Locale_LOWER  _LOWER
+#  define _Locale_DIGIT  _DIGIT
+#  define _Locale_XDIGIT _XDIGIT
+#  define _Locale_PUNCT  _PUNCT
+#  define _Locale_SPACE  _SPACE
+#  define _Locale_PRINT  _PRINT
+#  define _Locale_ALPHA  _ALPHA
+#endif
+
+# endif /* _STLP_C_LOCALE_H */
diff --git a/src/STLport/stl/char_traits.h b/src/STLport/stl/char_traits.h
new file mode 100644
index 0000000..e93a56e
--- /dev/null
+++ b/src/STLport/stl/char_traits.h
@@ -0,0 +1,266 @@
+/*
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_CHAR_TRAITS_H
+#define _STLP_CHAR_TRAITS_H
+
+// Define char_traits
+
+# if defined (_STLP_OWN_IOSTREAMS) || ! defined (_STLP_USE_NEW_IOSTREAMS)
+
+# if ! defined (_STLP_CSTDDEF)
+#  include <cstddef>
+# endif
+
+#if ! defined (_STLP_CSTRING)
+#  include <cstring>
+#endif
+
+#if defined (_STLP_UNIX) && defined (_STLP_HAS_NO_NEW_C_HEADERS)
+#include <sys/types.h>          // For off_t
+#endif /* __unix */
+
+#ifdef __BORLANDC__
+# include <mem.h>
+# include <string.h>
+# include <_stddef.h>
+// class mbstate_t;
+#endif
+
+#ifndef __TYPE_TRAITS_H
+# include <stl/type_traits.h>
+#endif
+
+# if !defined (_STLP_CWCHAR)
+#  include <stl/_cwchar.h>
+# endif			
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_OWN_IOSTREAMS
+
+template <class _Tp> class allocator;
+
+#define _STLP_NULL_CHAR_INIT(_ChT) _STLP_DEFAULT_CONSTRUCTED(_ChT)
+
+#if defined (__sgi) && defined (_STLP_HAS_NO_NEW_C_HEADERS) /* IRIX */
+typedef off64_t   streamoff;
+// #elif defined (__unix) && defined (_STLP_HAS_NO_NEW_C_HEADERS) /* Other version of UNIX */
+// typedef off_t     streamoff;
+#else /* __unix */
+// boris : here, it's not ptrdiff_t as some Solaris systems have confusing definitions of these.
+typedef long streamoff;
+#endif /* _STLP_HAS_NO_NEW_C_HEADERS */
+
+typedef ptrdiff_t streamsize;
+
+// Class fpos, which represents a position within a file.  (The C++
+// standard calls for it to be defined in <ios>.  This implementation
+// moves it to <iosfwd>, which is included by <ios>.)
+template <class _StateT> class fpos
+{
+public:                         // From table 88 of the C++ standard.
+  fpos(streamoff __pos) : _M_pos(__pos), _M_st(_STLP_NULL_CHAR_INIT(_StateT)) {}
+  fpos() : _M_pos(0), _M_st(_STLP_NULL_CHAR_INIT(_StateT)) {}
+
+  operator streamoff() const { return _M_pos; }
+
+  bool  _STLP_CALL operator==(const fpos<_StateT>& __y) const
+    { return _M_pos == __y._M_pos; }
+  bool _STLP_CALL operator!=(const fpos<_StateT>& __y) const
+    { return _M_pos != __y._M_pos; }
+
+  fpos<_StateT>& operator+=(streamoff __off) {
+    _M_pos += __off;
+    return *this;
+  }
+  fpos<_StateT>& operator-=(streamoff __off) {
+    _M_pos -= __off;
+    return *this;
+  }
+
+  fpos<_StateT> operator+(streamoff __off) {
+    fpos<_StateT> __tmp(*this);
+    __tmp += __off;
+    return __tmp;
+  }
+  fpos<_StateT> operator-(streamoff __off) {
+    fpos<_StateT> __tmp(*this);
+    __tmp -= __off;
+    return __tmp;
+  }
+
+public:                         // Manipulation of the state member.
+  _StateT state() const { return _M_st; }
+  void state(_StateT __st) { _M_st = __st; }
+private:
+  streamoff _M_pos;
+  _StateT _M_st;
+};
+
+typedef fpos<mbstate_t> streampos;
+typedef fpos<mbstate_t> wstreampos;
+# endif
+
+// Class __char_traits_base.
+
+template <class _CharT, class _IntT> class __char_traits_base {
+public:
+  typedef _CharT char_type;
+  typedef _IntT int_type;
+#ifdef _STLP_USE_NEW_IOSTREAMS
+  typedef streamoff off_type;
+  typedef streampos pos_type;
+# ifdef _STLP_NO_MBSTATE_T
+  typedef char      state_type;
+# else
+  typedef mbstate_t state_type;
+# endif
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+  static void _STLP_CALL assign(char_type& __c1, const char_type& __c2) { __c1 = __c2; }
+  static bool _STLP_CALL eq(const _CharT& __c1, const _CharT& __c2) 
+    { return __c1 == __c2; }
+  static bool _STLP_CALL lt(const _CharT& __c1, const _CharT& __c2) 
+    { return __c1 < __c2; }
+
+  static int _STLP_CALL compare(const _CharT* __s1, const _CharT* __s2, size_t __n) {
+    for (size_t __i = 0; __i < __n; ++__i)
+      if (!eq(__s1[__i], __s2[__i]))
+        return __s1[__i] < __s2[__i] ? -1 : 1;
+    return 0;
+  }
+
+  static size_t _STLP_CALL length(const _CharT* __s) {
+    const _CharT _NullChar = _STLP_DEFAULT_CONSTRUCTED(_CharT);
+    size_t __i;
+    for (__i = 0; !eq(__s[__i], _NullChar); ++__i)
+      {}
+    return __i;
+  }
+
+  static const _CharT* _STLP_CALL find(const _CharT* __s, size_t __n, const _CharT& __c) {
+    for ( ; __n > 0 ; ++__s, --__n)
+      if (eq(*__s, __c))
+        return __s;
+    return 0;
+  }
+
+
+  static _CharT* _STLP_CALL move(_CharT* __s1, const _CharT* __s2, size_t _Sz) {    
+    return (_Sz == 0 ? __s1 : (_CharT*)memmove(__s1, __s2, _Sz * sizeof(_CharT)));
+  }
+  
+  static _CharT* _STLP_CALL copy(_CharT* __s1, const _CharT* __s2, size_t __n) {
+    return (__n == 0 ? __s1 :
+	    (_CharT*)memcpy(__s1, __s2, __n * sizeof(_CharT)));
+    } 
+
+  static _CharT* _STLP_CALL assign(_CharT* __s, size_t __n, _CharT __c) {
+    for (size_t __i = 0; __i < __n; ++__i)
+      __s[__i] = __c;
+    return __s;
+  }
+
+  static int_type _STLP_CALL not_eof(const int_type& __c) {
+    return !eq_int_type(__c, eof()) ? __c : __STATIC_CAST(int_type, 0);
+  }
+
+  static char_type _STLP_CALL to_char_type(const int_type& __c) {
+    return (char_type)__c;
+  }
+
+  static int_type _STLP_CALL to_int_type(const char_type& __c) {
+    return (int_type)__c;
+  }
+
+  static bool _STLP_CALL eq_int_type(const int_type& __c1, const int_type& __c2) {
+    return __c1 == __c2;
+  }
+
+  static int_type _STLP_CALL eof() {
+    return (int_type)-1;
+    //    return __STATIC_CAST(int_type,-1);
+  }
+};
+
+// Generic char_traits class.  Note that this class is provided only
+//  as a base for explicit specialization; it is unlikely to be useful
+//  as is for any particular user-defined type.  In particular, it 
+//  *will not work* for a non-POD type.
+
+template <class _CharT> class char_traits
+  : public __char_traits_base<_CharT, _CharT>
+{};
+
+// Specialization for char.
+
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC char_traits<char> 
+  : public __char_traits_base<char, int>
+{
+public:
+  typedef char char_type;
+  typedef int int_type;
+#ifdef _STLP_USE_NEW_IOSTREAMS
+  typedef streamoff off_type;
+# ifndef _STLP_NO_MBSTATE_T
+  typedef streampos pos_type;
+  typedef mbstate_t state_type;
+# endif
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+
+  static char _STLP_CALL to_char_type(const int& __c) {
+    return (char)(unsigned char)__c;
+  }
+
+  static int _STLP_CALL to_int_type(const char& __c) {
+    return (unsigned char)__c;
+  }
+
+  static int _STLP_CALL compare(const char* __s1, const char* __s2, size_t __n) 
+    { return memcmp(__s1, __s2, __n); }
+  
+  static size_t _STLP_CALL length(const char* __s) { return strlen(__s); }
+
+  static void _STLP_CALL assign(char& __c1, const char& __c2) { __c1 = __c2; }
+
+  static char* _STLP_CALL assign(char* __s, size_t __n, char __c)
+    { memset(__s, __c, __n); return __s; }
+};
+
+# if defined (_STLP_HAS_WCHAR_T)
+// Specialization for wchar_t.
+_STLP_TEMPLATE_NULL class _STLP_CLASS_DECLSPEC char_traits<wchar_t>
+  : public __char_traits_base<wchar_t, wint_t>
+{};
+# endif
+
+_STLP_END_NAMESPACE
+
+# else /* OWN_IOSTREAMS */
+
+#  include <wrap_std/iosfwd>
+
+# endif /* OWN_IOSTREAMS */
+
+#endif /* _STLP_CHAR_TRAITS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/concept_checks.h b/src/STLport/stl/concept_checks.h
new file mode 100644
index 0000000..36fb00c
--- /dev/null
+++ b/src/STLport/stl/concept_checks.h
@@ -0,0 +1,810 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Silicon Graphics makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ */
+
+#ifndef __CONCEPT_CHECKS_H
+#define __CONCEPT_CHECKS_H
+
+/*
+  Use these macro like assertions, but they assert properties
+  on types (usually template arguments). In technical terms they
+  verify whether a type "models" a "concept".
+
+  This set of requirements and the terminology used here is derived
+  from the book "Generic Programming and the STL" by Matt Austern
+  (Addison Wesley). For further information please consult that
+  book. The requirements also are intended to match the ANSI/ISO C++
+  standard.
+
+  This file covers the basic concepts and the iterator concepts.
+  There are several other files that provide the requirements
+  for the STL containers:
+    container_concepts.h
+    sequence_concepts.h
+    assoc_container_concepts.h
+
+  Jeremy Siek, 1999
+
+  TO DO:
+    - some issues with regards to concept classification and mutability
+      including AssociativeContianer -> ForwardContainer
+      and SortedAssociativeContainer -> ReversibleContainer
+    - HashedAssociativeContainer
+    - Allocator
+    - Function Object Concepts
+
+  */
+
+#ifndef _STLP_USE_CONCEPT_CHECKS
+
+// Some compilers lack the features that are necessary for concept checks.
+// On those compilers we define the concept check macros to do nothing.
+#define _STLP_REQUIRES(__type_var, __concept) do {} while(0)
+#define _STLP_CLASS_REQUIRES(__type_var, __concept) \
+  static int  __##__type_var##_##__concept
+#define _STLP_CONVERTIBLE(__type_x, __type_y) do {} while(0)
+#define _STLP_REQUIRES_SAME_TYPE(__type_x, __type_y) do {} while(0)
+#define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
+  static int  __##__type_x##__type_y##_require_same_type
+#define _STLP_GENERATOR_CHECK(__func, __ret) do {} while(0)
+#define _STLP_CLASS_GENERATOR_CHECK(__func, __ret) \
+  static int  __##__func##__ret##_generator_check
+#define _STLP_UNARY_FUNCTION_CHECK(__func, __ret, __arg) do {} while(0)
+#define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
+  static int  __##__func##__ret##__arg##_unary_function_check
+#define _STLP_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+  do {} while(0)
+#define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+  static int  __##__func##__ret##__first##__second##_binary_function_check
+#define _STLP_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+  do {} while(0)
+#define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+  static int __##__opname##__ret##__first##__second##_require_binary_op
+
+#else /* _STLP_USE_CONCEPT_CHECKS */
+
+// This macro tests whether the template argument "__type_var"
+// satisfies the requirements of "__concept".  Here is a list of concepts
+// that we know how to check:
+//       _Allocator
+//       _Assignable
+//       _DefaultConstructible
+//       _EqualityComparable
+//       _LessThanComparable
+//       _TrivialIterator
+//       _InputIterator
+//       _OutputIterator
+//       _ForwardIterator
+//       _BidirectionalIterator
+//       _RandomAccessIterator
+//       _Mutable_TrivialIterator
+//       _Mutable_ForwardIterator
+//       _Mutable_BidirectionalIterator
+//       _Mutable_RandomAccessIterator
+
+#define _STLP_REQUIRES(__type_var, __concept) \
+do { \
+  void (*__x)( __type_var ) = __concept##_concept_specification< __type_var >\
+    ::##__concept##_requirement_violation; __x = __x; } while (0)
+
+// Use this to check whether type X is convertible to type Y
+#define _STLP_CONVERTIBLE(__type_x, __type_y) \
+do { \
+  void (*__x)( __type_x , __type_y ) = _STL_CONVERT_ERROR< __type_x , \
+  __type_y >::__type_X_is_not_convertible_to_type_Y; \
+  __x = __x; } while (0)
+
+// Use this to test whether two template arguments are the same type
+#define _STLP_REQUIRES_SAME_TYPE(__type_x, __type_y) \
+do { \
+  void (*__x)( __type_x , __type_y ) = _STL_SAME_TYPE_ERROR< __type_x, \
+    __type_y  >::__type_X_not_same_as_type_Y; \
+  __x = __x; } while (0)
+
+
+// function object checks
+#define _STLP_GENERATOR_CHECK(__func, __ret) \
+do { \
+  __ret (*__x)( __func&) = \
+     _STL_GENERATOR_ERROR< \
+  __func, __ret>::__generator_requirement_violation; \
+  __x = __x; } while (0)
+
+
+#define _STLP_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
+do { \
+  __ret (*__x)( __func&, const __arg& ) = \
+     _STL_UNARY_FUNCTION_ERROR< \
+  __func, __ret, __arg>::__unary_function_requirement_violation; \
+  __x = __x; } while (0)
+
+
+#define _STLP_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+do { \
+  __ret (*__x)( __func&, const __first&, const __second& ) = \
+     _STL_BINARY_FUNCTION_ERROR< \
+  __func, __ret, __first, __second>::__binary_function_requirement_violation; \
+  __x = __x; } while (0)
+
+
+#define _STLP_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+    do { \
+  __ret (*__x)( __first&, __second& ) = _STL_BINARY##__opname##_ERROR< \
+    __ret, __first, __second>::__binary_operator_requirement_violation; \
+  __ret (*__y)( const __first&, const __second& ) = \
+    _STL_BINARY##__opname##_ERROR< __ret, __first, __second>:: \
+      __const_binary_operator_requirement_violation; \
+  __y = __y; __x = __x; } while (0)
+
+
+#ifdef _STLP_NO_FUNCTION_PTR_IN_CLASS_TEMPLATE
+
+#define _STLP_CLASS_REQUIRES(__type_var, __concept)
+#define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y)
+#define _STLP_CLASS_GENERATOR_CHECK(__func, __ret)
+#define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg)
+#define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second)
+#define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second)
+
+#else
+
+// Use this macro inside of template classes, where you would
+// like to place requirements on the template arguments to the class
+// Warning: do not pass pointers and such (e.g. T*) in as the __type_var,
+// since the type_var is used to construct identifiers. Instead typedef
+// the pointer type, then use the typedef name for the __type_var.
+#define _STLP_CLASS_REQUIRES(__type_var, __concept) \
+  typedef void (* __func##__type_var##__concept)( __type_var ); \
+  template <__func##__type_var##__concept _Tp1> \
+  struct __dummy_struct_##__type_var##__concept { }; \
+  static __dummy_struct_##__type_var##__concept< \
+    __concept##_concept_specification< \
+      __type_var>::__concept##_requirement_violation>  \
+  __dummy_ptr_##__type_var##__concept
+
+
+#define _STLP_CLASS_REQUIRES_SAME_TYPE(__type_x, __type_y) \
+  typedef void (* __func_##__type_x##__type_y##same_type)( __type_x, \
+                                                            __type_y ); \
+  template < __func_##__type_x##__type_y##same_type _Tp1> \
+  struct __dummy_struct_##__type_x##__type_y##_same_type { }; \
+  static __dummy_struct_##__type_x##__type_y##_same_type< \
+    _STL_SAME_TYPE_ERROR<__type_x, __type_y>::__type_X_not_same_as_type_Y>  \
+  __dummy_ptr_##__type_x##__type_y##_same_type
+
+
+#define _STLP_CLASS_GENERATOR_CHECK(__func, __ret) \
+  typedef __ret (* __f_##__func##__ret##_generator)( __func& ); \
+  template <__f_##__func##__ret##_generator _Tp1> \
+  struct __dummy_struct_##__func##__ret##_generator { }; \
+  static __dummy_struct_##__func##__ret##_generator< \
+    _STL_GENERATOR_ERROR< \
+      __func, __ret>::__generator_requirement_violation>  \
+  __dummy_ptr_##__func##__ret##_generator
+
+
+#define _STLP_CLASS_UNARY_FUNCTION_CHECK(__func, __ret, __arg) \
+  typedef __ret (* __f_##__func##__ret##__arg##_unary_check)( __func&, \
+                                                         const __arg& ); \
+  template <__f_##__func##__ret##__arg##_unary_check _Tp1> \
+  struct __dummy_struct_##__func##__ret##__arg##_unary_check { }; \
+  static __dummy_struct_##__func##__ret##__arg##_unary_check< \
+    _STL_UNARY_FUNCTION_ERROR< \
+      __func, __ret, __arg>::__unary_function_requirement_violation>  \
+  __dummy_ptr_##__func##__ret##__arg##_unary_check
+
+
+#define _STLP_CLASS_BINARY_FUNCTION_CHECK(__func, __ret, __first, __second) \
+  typedef __ret (* __f_##__func##__ret##__first##__second##_binary_check)( __func&, const __first&,\
+                                                    const __second& ); \
+  template <__f_##__func##__ret##__first##__second##_binary_check _Tp1> \
+  struct __dummy_struct_##__func##__ret##__first##__second##_binary_check { }; \
+  static __dummy_struct_##__func##__ret##__first##__second##_binary_check< \
+    _STL_BINARY_FUNCTION_ERROR<__func, __ret, __first, __second>:: \
+  __binary_function_requirement_violation>  \
+  __dummy_ptr_##__func##__ret##__first##__second##_binary_check
+
+
+#define _STLP_CLASS_REQUIRES_BINARY_OP(__opname, __ret, __first, __second) \
+  typedef __ret (* __f_##__func##__ret##__first##__second##_binary_op)(const __first&, \
+                                                    const __second& ); \
+  template <__f_##__func##__ret##__first##__second##_binary_op _Tp1> \
+  struct __dummy_struct_##__func##__ret##__first##__second##_binary_op { }; \
+  static __dummy_struct_##__func##__ret##__first##__second##_binary_op< \
+    _STL_BINARY##__opname##_ERROR<__ret, __first, __second>:: \
+  __binary_operator_requirement_violation>  \
+  __dummy_ptr_##__func##__ret##__first##__second##_binary_op
+
+#endif
+
+/* helper class for finding non-const version of a type. Need to have
+   something to assign to etc. when testing constant iterators. */
+
+template <class _Tp>
+struct _Mutable_trait {
+  typedef _Tp _Type;
+};
+template <class _Tp>
+struct _Mutable_trait<const _Tp> {
+  typedef _Tp _Type;
+};
+
+
+/* helper function for avoiding compiler warnings about unused variables */
+template <class _Type>
+void __sink_unused_warning(_Type) { }
+
+template <class _TypeX, class _TypeY>
+struct _STL_CONVERT_ERROR {
+  static void
+  __type_X_is_not_convertible_to_type_Y(_TypeX __x, _TypeY) {
+    _TypeY __y = __x;
+    __sink_unused_warning(__y);
+  }
+};
+
+
+template <class _Type> struct __check_equal { };
+
+template <class _TypeX, class _TypeY>
+struct _STL_SAME_TYPE_ERROR {
+  static void
+  __type_X_not_same_as_type_Y(_TypeX , _TypeY ) { 
+    __check_equal<_TypeX> t1 = __check_equal<_TypeY>();
+  }
+};
+
+
+// Some Functon Object Checks
+
+template <class _Func, class _Ret>
+struct _STL_GENERATOR_ERROR {
+  static _Ret __generator_requirement_violation(_Func& __f) {
+    return __f();
+  }
+};
+
+template <class _Func>
+struct _STL_GENERATOR_ERROR<_Func, void> {
+  static void __generator_requirement_violation(_Func& __f) {
+    __f();
+  }
+};
+
+
+template <class _Func, class _Ret, class _Arg>
+struct _STL_UNARY_FUNCTION_ERROR {
+  static _Ret
+  __unary_function_requirement_violation(_Func& __f,
+                                          const _Arg& __arg) {
+    return __f(__arg);
+  }
+};
+
+template <class _Func, class _Arg>
+struct _STL_UNARY_FUNCTION_ERROR<_Func, void, _Arg> {
+  static void
+  __unary_function_requirement_violation(_Func& __f,
+                                          const _Arg& __arg) {
+    __f(__arg);
+  }
+};
+
+template <class _Func, class _Ret, class _First, class _Second>
+struct _STL_BINARY_FUNCTION_ERROR {
+  static _Ret
+  __binary_function_requirement_violation(_Func& __f,
+                                          const _First& __first, 
+                                          const _Second& __second) {
+    return __f(__first, __second);
+  }
+};
+
+template <class _Func, class _First, class _Second>
+struct _STL_BINARY_FUNCTION_ERROR<_Func, void, _First, _Second> {
+  static void
+  __binary_function_requirement_violation(_Func& __f,
+                                          const _First& __first, 
+                                          const _Second& __second) {
+    __f(__first, __second);
+  }
+};
+
+
+#define _STLP_DEFINE_BINARY_OP_CHECK(_OP, _NAME) \
+template <class _Ret, class _First, class _Second> \
+struct _STL_BINARY##_NAME##_ERROR { \
+  static _Ret \
+  __const_binary_operator_requirement_violation(const _First& __first,  \
+                                                const _Second& __second) { \
+    return __first _OP __second; \
+  } \
+  static _Ret \
+  __binary_operator_requirement_violation(_First& __first,  \
+                                          _Second& __second) { \
+    return __first _OP __second; \
+  } \
+}
+
+_STLP_DEFINE_BINARY_OP_CHECK(==, _OP_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(!=, _OP_NOT_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(<, _OP_LESS_THAN);
+_STLP_DEFINE_BINARY_OP_CHECK(<=, _OP_LESS_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(>, _OP_GREATER_THAN);
+_STLP_DEFINE_BINARY_OP_CHECK(>=, _OP_GREATER_EQUAL);
+_STLP_DEFINE_BINARY_OP_CHECK(+, _OP_PLUS);
+_STLP_DEFINE_BINARY_OP_CHECK(*, _OP_TIMES);
+_STLP_DEFINE_BINARY_OP_CHECK(/, _OP_DIVIDE);
+_STLP_DEFINE_BINARY_OP_CHECK(-, _OP_SUBTRACT);
+_STLP_DEFINE_BINARY_OP_CHECK(%, _OP_MOD);
+// ...
+
+// TODO, add unary operators (prefix and postfix)
+
+/*
+  The presence of this class is just to trick EDG into displaying
+  these error messages before any other errors. Without the
+  classes, the errors in the functions get reported after
+  other class errors deep inside the library. The name
+  choice just makes for an eye catching error message :)
+ */
+struct _STL_ERROR {
+
+  template <class _Type>
+  static _Type
+  __default_constructor_requirement_violation(_Type) {
+    return _Type();
+  }
+  template <class _Type>
+  static _Type
+  __assignment_operator_requirement_violation(_Type __a) {
+    __a = __a;
+    return __a;
+  }
+  template <class _Type>
+  static _Type
+  __copy_constructor_requirement_violation(_Type __a) {
+    _Type __c(__a);
+    return __c;
+  }
+  template <class _Type>
+  static _Type
+  __const_parameter_required_for_copy_constructor(_Type /* __a */, 
+                                                  const _Type& __b) {
+    _Type __c(__b);
+    return __c;
+  }
+  template <class _Type>
+  static _Type
+  __const_parameter_required_for_assignment_operator(_Type __a, 
+                                                     const _Type& __b) {
+    __a = __b;
+    return __a;
+  }
+  template <class _Type>
+  static _Type
+  __less_than_comparable_requirement_violation(_Type __a, _Type __b) {
+    if (__a < __b || __a > __b || __a <= __b || __a >= __b) return __a;
+    return __b;
+  }
+  template <class _Type>
+  static _Type
+  __equality_comparable_requirement_violation(_Type __a, _Type __b) {
+    if (__a == __b || __a != __b) return __a;
+    return __b;
+  }
+  template <class _Iterator>
+  static void
+  __dereference_operator_requirement_violation(_Iterator __i) {
+    __sink_unused_warning(*__i);
+  }
+  template <class _Iterator>
+  static void
+  __dereference_operator_and_assignment_requirement_violation(_Iterator __i) {
+    *__i = *__i;
+  }
+  template <class _Iterator>
+  static void
+  __preincrement_operator_requirement_violation(_Iterator __i) {
+    ++__i;
+  }
+  template <class _Iterator>
+  static void
+  __postincrement_operator_requirement_violation(_Iterator __i) {
+    __i++;
+  }
+  template <class _Iterator>
+  static void
+  __predecrement_operator_requirement_violation(_Iterator __i) {
+    --__i;
+  }
+  template <class _Iterator>
+  static void
+  __postdecrement_operator_requirement_violation(_Iterator __i) {
+    __i--;
+  }
+  template <class _Iterator, class _Type>
+  static void
+  __postincrement_operator_and_assignment_requirement_violation(_Iterator __i,
+                                                                _Type __t) {
+    *__i++ = __t;
+  }
+  template <class _Iterator, class _Distance>
+  static _Iterator
+  __iterator_addition_assignment_requirement_violation(_Iterator __i, 
+                                                       _Distance __n) {
+    __i += __n;
+    return __i;
+  }
+  template <class _Iterator, class _Distance>
+  static _Iterator
+  __iterator_addition_requirement_violation(_Iterator __i, _Distance __n) {
+    __i = __i + __n;
+    __i = __n + __i;
+    return __i;
+  }
+  template <class _Iterator, class _Distance>
+  static _Iterator
+  __iterator_subtraction_assignment_requirement_violation(_Iterator __i,
+                                                          _Distance __n) {
+    __i -= __n;
+    return __i;
+  }
+  template <class _Iterator, class _Distance>
+  static _Iterator
+  __iterator_subtraction_requirement_violation(_Iterator __i, _Distance __n) {
+    __i = __i - __n;
+    return __i;
+  }
+  template <class _Iterator, class _Distance>
+  static _Distance
+  __difference_operator_requirement_violation(_Iterator __i, _Iterator __j,
+                                              _Distance __n) {
+    __n = __i - __j;
+    return __n;
+  }
+  template <class _Exp, class _Type, class _Distance>
+  static _Type
+  __element_access_operator_requirement_violation(_Exp __x, _Type*,
+                                                  _Distance __n) {
+    return __x[__n];
+  }
+  template <class _Exp, class _Type, class _Distance>
+  static void
+  __element_assignment_operator_requirement_violation(_Exp __x,
+                                                      _Type* __t,
+                                                      _Distance __n) {
+    __x[__n] = *__t;
+  }
+
+}; /* _STL_ERROR */
+
+/* Associated Type Requirements */
+
+_STLP_BEGIN_NAMESPACE
+template <class _Iterator> struct iterator_traits;
+_STLP_END_NAMESPACE
+
+template <class _Iter> 
+struct __value_type_type_definition_requirement_violation {
+  typedef typename __STD::iterator_traits<_Iter>::value_type value_type;
+};
+
+template <class _Iter> 
+struct __difference_type_type_definition_requirement_violation {
+  typedef typename __STD::iterator_traits<_Iter>::difference_type
+          difference_type;
+};
+
+template <class _Iter> 
+struct __reference_type_definition_requirement_violation {
+  typedef typename __STD::iterator_traits<_Iter>::reference reference;
+};
+
+template <class _Iter> 
+struct __pointer_type_definition_requirement_violation {
+  typedef typename __STD::iterator_traits<_Iter>::pointer pointer;
+};
+
+template <class _Iter> 
+struct __iterator_category_type_definition_requirement_violation {
+  typedef typename __STD::iterator_traits<_Iter>::iterator_category 
+          iterator_category;
+};
+
+/* Assignable Requirements */
+
+
+template <class _Type>
+struct _Assignable_concept_specification {
+  static void _Assignable_requirement_violation(_Type __a) {
+    _STL_ERROR::__assignment_operator_requirement_violation(__a);
+    _STL_ERROR::__copy_constructor_requirement_violation(__a);
+    _STL_ERROR::__const_parameter_required_for_copy_constructor(__a,__a);
+    _STL_ERROR::__const_parameter_required_for_assignment_operator(__a,__a);
+  }
+};
+
+/* DefaultConstructible Requirements */
+
+
+template <class _Type>
+struct _DefaultConstructible_concept_specification {
+  static void _DefaultConstructible_requirement_violation(_Type __a) {
+    _STL_ERROR::__default_constructor_requirement_violation(__a);
+  }
+};
+
+/* EqualityComparable Requirements */
+
+template <class _Type>
+struct _EqualityComparable_concept_specification {
+  static void _EqualityComparable_requirement_violation(_Type __a) {
+    _STL_ERROR::__equality_comparable_requirement_violation(__a, __a);
+  }
+};
+
+/* LessThanComparable Requirements */
+template <class _Type>
+struct _LessThanComparable_concept_specification {
+  static void _LessThanComparable_requirement_violation(_Type __a) {
+    _STL_ERROR::__less_than_comparable_requirement_violation(__a, __a);
+  }
+};
+
+/* TrivialIterator Requirements */
+
+template <class _TrivialIterator>
+struct _TrivialIterator_concept_specification {
+static void
+_TrivialIterator_requirement_violation(_TrivialIterator __i) {
+  typedef typename
+    __value_type_type_definition_requirement_violation<_TrivialIterator>::
+    value_type __T;
+  // Refinement of Assignable
+  _Assignable_concept_specification<_TrivialIterator>::
+    _Assignable_requirement_violation(__i);
+  // Refinement of DefaultConstructible
+  _DefaultConstructible_concept_specification<_TrivialIterator>::
+    _DefaultConstructible_requirement_violation(__i);
+  // Refinement of EqualityComparable
+  _EqualityComparable_concept_specification<_TrivialIterator>::
+    _EqualityComparable_requirement_violation(__i);
+  // Valid Expressions
+  _STL_ERROR::__dereference_operator_requirement_violation(__i);
+}
+};
+
+template <class _TrivialIterator>
+struct _Mutable_TrivialIterator_concept_specification {
+static void
+_Mutable_TrivialIterator_requirement_violation(_TrivialIterator __i) {
+  _TrivialIterator_concept_specification<_TrivialIterator>::
+    _TrivialIterator_requirement_violation(__i);
+  // Valid Expressions
+  _STL_ERROR::__dereference_operator_and_assignment_requirement_violation(__i);
+}
+};
+
+/* InputIterator Requirements */
+
+template <class _InputIterator>
+struct _InputIterator_concept_specification {
+static void
+_InputIterator_requirement_violation(_InputIterator __i) {
+  // Refinement of TrivialIterator
+  _TrivialIterator_concept_specification<_InputIterator>::
+    _TrivialIterator_requirement_violation(__i);
+  // Associated Types
+  __difference_type_type_definition_requirement_violation<_InputIterator>();
+  __reference_type_definition_requirement_violation<_InputIterator>();
+  __pointer_type_definition_requirement_violation<_InputIterator>();
+  __iterator_category_type_definition_requirement_violation<_InputIterator>();
+  // Valid Expressions
+  _STL_ERROR::__preincrement_operator_requirement_violation(__i);
+  _STL_ERROR::__postincrement_operator_requirement_violation(__i);
+}
+};
+
+/* OutputIterator Requirements */
+
+template <class _OutputIterator>
+struct _OutputIterator_concept_specification {
+static void
+_OutputIterator_requirement_violation(_OutputIterator __i) {
+  // Refinement of Assignable
+  _Assignable_concept_specification<_OutputIterator>::
+    _Assignable_requirement_violation(__i);
+  // Associated Types
+  __iterator_category_type_definition_requirement_violation<_OutputIterator>();
+  // Valid Expressions
+  _STL_ERROR::__dereference_operator_requirement_violation(__i);
+  _STL_ERROR::__preincrement_operator_requirement_violation(__i);
+  _STL_ERROR::__postincrement_operator_requirement_violation(__i);
+  _STL_ERROR::
+    __postincrement_operator_and_assignment_requirement_violation(__i, *__i);
+}
+};
+
+/* ForwardIterator Requirements */
+
+template <class _ForwardIterator>
+struct _ForwardIterator_concept_specification {
+static void
+_ForwardIterator_requirement_violation(_ForwardIterator __i) {
+  // Refinement of InputIterator
+  _InputIterator_concept_specification<_ForwardIterator>::
+    _InputIterator_requirement_violation(__i);
+}
+};
+
+template <class _ForwardIterator>
+struct _Mutable_ForwardIterator_concept_specification {
+static void
+_Mutable_ForwardIterator_requirement_violation(_ForwardIterator __i) {
+  _ForwardIterator_concept_specification<_ForwardIterator>::
+    _ForwardIterator_requirement_violation(__i);
+  // Refinement of OutputIterator
+  _OutputIterator_concept_specification<_ForwardIterator>::
+    _OutputIterator_requirement_violation(__i);
+}
+};
+
+/* BidirectionalIterator Requirements */
+
+template <class _BidirectionalIterator>
+struct _BidirectionalIterator_concept_specification {
+static void
+_BidirectionalIterator_requirement_violation(_BidirectionalIterator __i) {
+  // Refinement of ForwardIterator
+  _ForwardIterator_concept_specification<_BidirectionalIterator>::
+    _ForwardIterator_requirement_violation(__i);
+  // Valid Expressions
+  _STL_ERROR::__predecrement_operator_requirement_violation(__i);
+  _STL_ERROR::__postdecrement_operator_requirement_violation(__i);
+}
+};
+
+template <class _BidirectionalIterator>
+struct _Mutable_BidirectionalIterator_concept_specification {
+static void
+_Mutable_BidirectionalIterator_requirement_violation(
+       _BidirectionalIterator __i)
+{
+  _BidirectionalIterator_concept_specification<_BidirectionalIterator>::
+    _BidirectionalIterator_requirement_violation(__i);
+  // Refinement of mutable_ForwardIterator
+  _Mutable_ForwardIterator_concept_specification<_BidirectionalIterator>::
+    _Mutable_ForwardIterator_requirement_violation(__i);
+  typedef typename
+    __value_type_type_definition_requirement_violation<
+    _BidirectionalIterator>::value_type __T;
+  typename _Mutable_trait<__T>::_Type* __tmp_ptr = 0;
+  // Valid Expressions
+  _STL_ERROR::
+    __postincrement_operator_and_assignment_requirement_violation(__i,
+                                                                  *__tmp_ptr);
+}
+};
+
+/* RandomAccessIterator Requirements */
+
+template <class _RandAccIter>
+struct _RandomAccessIterator_concept_specification {
+static void
+_RandomAccessIterator_requirement_violation(_RandAccIter __i) {
+  // Refinement of BidirectionalIterator
+  _BidirectionalIterator_concept_specification<_RandAccIter>::
+    _BidirectionalIterator_requirement_violation(__i);
+  // Refinement of LessThanComparable
+  _LessThanComparable_concept_specification<_RandAccIter>::
+    _LessThanComparable_requirement_violation(__i);
+  typedef typename 
+        __value_type_type_definition_requirement_violation<_RandAccIter>
+        ::value_type
+    value_type;
+  typedef typename
+        __difference_type_type_definition_requirement_violation<_RandAccIter>
+        ::difference_type 
+    _Dist;
+  typedef typename _Mutable_trait<_Dist>::_Type _MutDist;
+
+  // Valid Expressions
+  _STL_ERROR::__iterator_addition_assignment_requirement_violation(__i,
+                                                                   _MutDist());
+  _STL_ERROR::__iterator_addition_requirement_violation(__i,
+                                                        _MutDist());
+  _STL_ERROR::
+    __iterator_subtraction_assignment_requirement_violation(__i,
+                                                            _MutDist());
+  _STL_ERROR::__iterator_subtraction_requirement_violation(__i,
+                                                           _MutDist());
+  _STL_ERROR::__difference_operator_requirement_violation(__i, __i,
+                                                          _MutDist());
+  typename _Mutable_trait<value_type>::_Type* __dummy_ptr = 0;
+  _STL_ERROR::__element_access_operator_requirement_violation(__i,
+                                                              __dummy_ptr,
+                                                              _MutDist());
+}
+};
+
+template <class _RandAccIter>
+struct _Mutable_RandomAccessIterator_concept_specification {
+static void
+_Mutable_RandomAccessIterator_requirement_violation(_RandAccIter __i)
+{
+  _RandomAccessIterator_concept_specification<_RandAccIter>::
+    _RandomAccessIterator_requirement_violation(__i);
+  // Refinement of mutable_BidirectionalIterator
+  _Mutable_BidirectionalIterator_concept_specification<_RandAccIter>::
+    _Mutable_BidirectionalIterator_requirement_violation(__i);
+  typedef typename
+        __value_type_type_definition_requirement_violation<_RandAccIter>
+        ::value_type
+    value_type;
+  typedef typename
+        __difference_type_type_definition_requirement_violation<_RandAccIter>
+        ::difference_type
+    _Dist;
+
+  typename _Mutable_trait<value_type>::_Type* __tmp_ptr = 0;
+  // Valid Expressions
+  _STL_ERROR::__element_assignment_operator_requirement_violation(__i,
+                  __tmp_ptr, _Dist());
+}
+};
+
+#define _STLP_TYPEDEF_REQUIREMENT(__REQUIREMENT) \
+template <class Type> \
+struct __##__REQUIREMENT##__typedef_requirement_violation { \
+  typedef typename Type::__REQUIREMENT __REQUIREMENT; \
+};
+
+_STLP_TYPEDEF_REQUIREMENT(value_type);
+_STLP_TYPEDEF_REQUIREMENT(difference_type);
+_STLP_TYPEDEF_REQUIREMENT(size_type);
+_STLP_TYPEDEF_REQUIREMENT(reference);
+_STLP_TYPEDEF_REQUIREMENT(const_reference);
+_STLP_TYPEDEF_REQUIREMENT(pointer);
+_STLP_TYPEDEF_REQUIREMENT(const_pointer);
+
+
+template <class _Alloc>
+struct _Allocator_concept_specification {
+static void
+_Allocator_requirement_violation(_Alloc __a) {
+  // Refinement of DefaultConstructible
+  _DefaultConstructible_concept_specification<_Alloc>::
+    _DefaultConstructible_requirement_violation(__a);
+  // Refinement of EqualityComparable
+  _EqualityComparable_concept_specification<_Alloc>::
+    _EqualityComparable_requirement_violation(__a);
+  // Associated Types
+  __value_type__typedef_requirement_violation<_Alloc>();
+  __difference_type__typedef_requirement_violation<_Alloc>();
+  __size_type__typedef_requirement_violation<_Alloc>();
+  __reference__typedef_requirement_violation<_Alloc>();
+  __const_reference__typedef_requirement_violation<_Alloc>();
+  __pointer__typedef_requirement_violation<_Alloc>();
+  __const_pointer__typedef_requirement_violation<_Alloc>();
+  typedef typename _Alloc::value_type _Type;
+  _STLP_REQUIRES_SAME_TYPE(typename _Alloc::rebind<_Type>::other, _Alloc);
+}
+};
+
+#endif /* _STLP_USE_CONCEPT_CHECKS */
+
+#endif /* __CONCEPT_CHECKS_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_debug.c b/src/STLport/stl/debug/_debug.c
new file mode 100644
index 0000000..028ed76
--- /dev/null
+++ b/src/STLport/stl/debug/_debug.c
@@ -0,0 +1,490 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_DEBUG_C
+#  define  _STLP_DEBUG_C
+
+#if defined ( _STLP_DEBUG )
+
+# ifdef _STLP_THREADS
+#  ifndef _STLP_NEED_MUTABLE 
+#   define _STLP_ACQUIRE_LOCK(_Lock) _Lock._M_acquire_lock();
+#   define _STLP_RELEASE_LOCK(_Lock) _Lock._M_release_lock();
+#  else
+#   define _STLP_ACQUIRE_LOCK(_Lock) ((_STLP_mutex&)_Lock)._M_acquire_lock();
+#   define _STLP_RELEASE_LOCK(_Lock) ((_STLP_mutex&)_Lock)._M_release_lock();
+#  endif /* _STLP_NEED_MUTABLE */
+# else
+#  define _STLP_ACQUIRE_LOCK(_Lock)
+#  define _STLP_RELEASE_LOCK(_Lock)
+# endif /* _STLP_THREADS */
+
+_STLP_BEGIN_NAMESPACE
+
+//==========================================================
+//  global non-inline functions
+//==========================================================
+
+// [ i1, i2)
+template <class _Iterator>
+inline bool  _STLP_CALL
+__in_range_aux(const _Iterator& __it, const _Iterator& __first,
+               const _Iterator& __last, const random_access_iterator_tag &) {
+    return ( __it >= __first && 
+             __it < __last);
+}
+
+template <class _Iterator1, class _Iterator>
+# if defined (_STLP_MSVC) && (_STLP_MSVC >= 1100)
+inline bool _STLP_CALL  __in_range_aux(_Iterator1 __it, const _Iterator& __first,
+# else
+inline bool _STLP_CALL  __in_range_aux(const _Iterator1& __it, const _Iterator& __first,
+# endif
+                                       const _Iterator& __last, const forward_iterator_tag &) {
+    _Iterator1 __i(__first);
+    for (;  __i != __last && __i != __it; ++__i);
+    return (__i!=__last);
+}
+
+# if defined (_STLP_NONTEMPL_BASE_MATCH_BUG)
+template <class _Iterator1, class _Iterator>
+inline bool  _STLP_CALL
+__in_range_aux(const _Iterator1& __it, const _Iterator& __first,
+               const _Iterator& __last, const bidirectional_iterator_tag &) {
+    _Iterator1 __i(__first);
+    for (;  __i != __last && __i != __it; ++__i);
+    return (__i !=__last);
+}
+# endif
+
+template <class _Iterator>
+bool _STLP_CALL  __check_range(const _Iterator& __first, const _Iterator& __last) {
+    _STLP_VERBOSE_RETURN(__valid_range(__first,__last), _StlMsg_INVALID_RANGE )
+    return true;
+}
+
+template <class _Iterator>
+bool _STLP_CALL  __check_range(const _Iterator& __it, 
+                               const _Iterator& __start, const _Iterator& __finish) {
+    _STLP_VERBOSE_RETURN(__in_range(__it,__start, __finish), 
+                         _StlMsg_NOT_IN_RANGE_1)
+    return true;
+}
+
+template <class _Iterator>
+bool _STLP_CALL  __check_range(const _Iterator& __first, const _Iterator& __last, 
+                               const _Iterator& __start, const _Iterator& __finish) {
+    _STLP_VERBOSE_RETURN(__in_range(__first, __last, __start, __finish), 
+                         _StlMsg_NOT_IN_RANGE_2)
+    return true;
+}
+
+//===============================================================
+
+template <class _Iterator>
+void  _STLP_CALL __invalidate_range(const __owned_list* __base, 
+                                    const _Iterator& __first,
+                                    const _Iterator& __last)
+{
+    typedef _Iterator* _Safe_iterator_ptr;
+    typedef __owned_link _L_type;
+    _STLP_ACQUIRE_LOCK(__base->_M_lock)
+    _L_type* __pos;
+    _L_type* __prev;
+
+    for (__prev = (_L_type*)&__base->_M_node, __pos= (_L_type*)__prev->_M_next; 
+         __pos!=0;) {	    
+        if ((!(&__first == (_Iterator*)__pos || &__last == (_Iterator*)__pos))
+            &&  __in_range_aux(
+			       ((_Iterator*)__pos)->_M_iterator,
+			       __first._M_iterator,
+			       __last._M_iterator,
+			       _STLP_ITERATOR_CATEGORY(__first, _Iterator))) {
+	  __pos->_M_owner = 0;
+	  __pos = (_L_type*) (__prev->_M_next = __pos->_M_next);
+	}
+	else {
+	  __prev = __pos;
+	  __pos=(_L_type*)__pos->_M_next;
+	}
+    }
+    _STLP_RELEASE_LOCK(__base->_M_lock)    
+}
+
+template <class _Iterator>
+void  _STLP_CALL __invalidate_iterator(const __owned_list* __base, 
+                                       const _Iterator& __it)
+{
+    typedef __owned_link   _L_type;
+    _L_type*  __position, *__prev;
+    _STLP_ACQUIRE_LOCK(__base->_M_lock)
+    for (__prev = (_L_type*)&__base->_M_node, __position = (_L_type*)__prev->_M_next; 
+         __position!= 0;) {
+      // this requires safe iterators to be derived from __owned_link
+       if ((__position != (_L_type*)&__it) && ((_Iterator*)__position)->_M_iterator ==__it._M_iterator) {
+	    __position->_M_owner = 0;
+	    __position = (_L_type*) (__prev->_M_next = __position->_M_next);
+        }
+       else {
+	 __prev = __position;
+	 __position=(_L_type*)__position->_M_next;
+       }
+    }
+    _STLP_RELEASE_LOCK(__base->_M_lock)
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_DEBUG */
+
+# if defined (_STLP_EXPOSE_GLOBALS_IMPLEMENTATION)
+
+// dwa 12/26/99 -- for abort
+#  if defined (_STLP_USE_NEW_C_HEADERS)
+#   include <cstdlib>
+#  else
+#   include <stdlib.h>
+#  endif
+
+# if defined (_STLP_WIN32)
+#  include <stl/_threads.h>
+# endif
+
+//==========================================================
+// .c section
+//  owned_list non-inline methods and global functions 
+//==========================================================
+
+#if defined ( _STLP_ASSERTIONS )
+
+_STLP_BEGIN_NAMESPACE
+
+# ifndef _STLP_STRING_LITERAL
+# define _STLP_STRING_LITERAL(__x) __x
+# endif
+
+# ifdef _STLP_WINCE
+#  define _STLP_PERCENT_S "%hs" 
+# else
+#  define _STLP_PERCENT_S "%s" 
+# endif
+
+# define _STLP_MESSAGE_TABLE_BODY = { \
+_STLP_STRING_LITERAL("\n" _STLP_PERCENT_S "(%d): STL error: %s\n"), \
+_STLP_STRING_LITERAL(_STLP_PERCENT_S "(%d): STL assertion failure : " _STLP_PERCENT_S "\n" _STLP_ASSERT_MSG_TRAILER), \
+_STLP_STRING_LITERAL("\n" _STLP_PERCENT_S "(%d): STL error : " _STLP_PERCENT_S "\n" _STLP_PERCENT_S "(%d): STL assertion failure:     " _STLP_PERCENT_S " \n" _STLP_ASSERT_MSG_TRAILER), \
+_STLP_STRING_LITERAL("Invalid argument to operation (see operation documentation)"),                  \
+_STLP_STRING_LITERAL("Taking an iterator out of destroyed (or otherwise corrupted) container"),       \
+_STLP_STRING_LITERAL("Trying to extract an object out from empty container"),\
+_STLP_STRING_LITERAL("Past-the-end iterator could not be erased"),  \
+_STLP_STRING_LITERAL("Index out of bounds"),  \
+_STLP_STRING_LITERAL("Container doesn't own the iterator"),  \
+_STLP_STRING_LITERAL("Uninitialized or invalidated (by mutating operation) iterator used"),  \
+_STLP_STRING_LITERAL("Uninitialized or invalidated (by mutating operation) lefthand iterator in expression"),  \
+_STLP_STRING_LITERAL("Uninitialized or invalidated (by mutating operation) righthand iterator in expression"),  \
+_STLP_STRING_LITERAL("Iterators used in expression are from different owners"),  \
+_STLP_STRING_LITERAL("Iterator could not be dereferenced (past-the-end ?)"),  \
+_STLP_STRING_LITERAL("Range [first,last) is invalid"),  \
+_STLP_STRING_LITERAL("Iterator is not in range [first,last)"),  \
+_STLP_STRING_LITERAL("Range [first,last) is not in range [start,finish)"),  \
+_STLP_STRING_LITERAL("The advance would produce invalid iterator"),  \
+_STLP_STRING_LITERAL("Iterator is singular (advanced beyond the bounds ?)"),  \
+_STLP_STRING_LITERAL("Memory block deallocated twice"),  \
+_STLP_STRING_LITERAL("Deallocating a block that was never allocated"),  \
+_STLP_STRING_LITERAL("Deallocating a memory block allocated for another type"),  \
+_STLP_STRING_LITERAL("Size of block passed to deallocate() doesn't match block size"),  \
+_STLP_STRING_LITERAL("Pointer underrun - safety margin at front of memory block overwritten"),  \
+_STLP_STRING_LITERAL("Pointer overrrun - safety margin at back of memory block overwritten"),   \
+_STLP_STRING_LITERAL("Attempt to dereference null pointer returned by auto_ptr::get()"),   \
+_STLP_STRING_LITERAL("Unknown problem") \
+  }
+
+# if ( _STLP_STATIC_TEMPLATE_DATA > 0 )
+template <class _Dummy>
+const char* __stl_debug_engine<_Dummy>::_Message_table[_StlMsg_MAX]  _STLP_MESSAGE_TABLE_BODY;
+
+# else
+__DECLARE_INSTANCE(const char*, __stl_debug_engine<bool>::_Message_table[_StlMsg_MAX],
+		   _STLP_MESSAGE_TABLE_BODY);
+
+# endif
+
+# undef _STLP_STRING_LITERAL
+# undef _STLP_PERCENT_S
+_STLP_END_NAMESPACE
+
+// abort()
+#    include <cstdlib>
+
+#  if !defined( _STLP_DEBUG_MESSAGE )
+
+#    include <cstdarg>
+#    include <cstdio>
+
+_STLP_BEGIN_NAMESPACE
+
+template <class _Dummy>
+void _STLP_CALL  
+__stl_debug_engine<_Dummy>::_Message(const char * __format_str, ...)
+{
+	STLPORT_CSTD::va_list __args;
+	va_start( __args, __format_str );
+
+# if defined (_STLP_WINCE)
+	TCHAR __buffer[512];
+	int _convert = strlen(__format_str) + 1;
+	LPWSTR _lpw = (LPWSTR)alloca(_convert*sizeof(wchar_t));
+	_lpw[0] = '\0';
+	MultiByteToWideChar(GetACP(), 0, __format_str, -1, _lpw, _convert);
+	wvsprintf(__buffer, _lpw, __args);
+	//	wvsprintf(__buffer, __format_str, __args);
+	_STLP_WINCE_TRACE(__buffer);
+# elif defined (_STLP_WIN32) && ( defined(_STLP_MSVC) || defined (__ICL) || defined (__BORLANDC__))
+    char __buffer [4096];
+    _vsnprintf(__buffer, sizeof(__buffer) / sizeof(char),
+               __format_str, __args);
+    OutputDebugStringA(__buffer);
+# elif defined (__amigaos__)
+    STLPORT_CSTD::vfprintf(stderr, __format_str, (char *)__args);
+# else
+    STLPORT_CSTD::vfprintf(stderr, __format_str, __args);
+# endif /* WINCE */
+
+# ifdef _STLP_DEBUG_MESSAGE_POST
+	_STLP_DEBUG_MESSAGE_POST
+# endif
+
+    va_end(__args);
+
+}
+
+_STLP_END_NAMESPACE
+
+#  endif /* _STLP_DEBUG_MESSAGE */
+
+
+_STLP_BEGIN_NAMESPACE
+
+
+template <class _Dummy>
+void _STLP_CALL  
+__stl_debug_engine<_Dummy>::_IndexedError(int __error_ind, const char* __f, int __l)
+{
+  __stl_debug_message(_Message_table[_StlFormat_ERROR_RETURN], 
+		      __f, __l, _Message_table[__error_ind]);
+}
+
+template <class _Dummy>
+void _STLP_CALL  
+__stl_debug_engine<_Dummy>::_VerboseAssert(const char* __expr, int __error_ind, const char* __f, int __l)
+{
+  __stl_debug_message(_Message_table[_StlFormat_VERBOSE_ASSERTION_FAILURE],
+		      __f, __l, _Message_table[__error_ind], __f, __l, __expr);
+  __stl_debug_terminate();
+}
+
+template <class _Dummy>
+void _STLP_CALL 
+__stl_debug_engine<_Dummy>::_Assert(const char* __expr, const char* __f, int __l)
+{
+  __stl_debug_message(_Message_table[_StlFormat_ASSERTION_FAILURE],__f, __l, __expr);
+  __stl_debug_terminate();
+}
+
+// if exceptions are present, sends unique exception
+// if not, calls abort() to terminate
+template <class _Dummy>
+void _STLP_CALL 
+__stl_debug_engine<_Dummy>::_Terminate()
+{
+# ifdef _STLP_USE_NAMESPACES
+  using namespace _STLP_STD;
+# endif
+# if defined (_STLP_USE_EXCEPTIONS) && ! defined (_STLP_NO_DEBUG_EXCEPTIONS)
+  throw __stl_debug_exception();
+# else
+  _STLP_ABORT();
+# endif
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_ASSERTIONS */
+
+#ifdef _STLP_DEBUG
+
+_STLP_BEGIN_NAMESPACE
+
+//==========================================================
+//  owned_list non-inline methods 
+//==========================================================
+
+template <class _Dummy>
+void  _STLP_CALL
+__stl_debug_engine<_Dummy>::_Invalidate_all(__owned_list* __l) {
+  _STLP_ACQUIRE_LOCK(__l->_M_lock);
+  _Stamp_all(__l, 0);
+  __l->_M_node._M_next =0;
+  _STLP_RELEASE_LOCK(__l->_M_lock);
+}
+
+// boris : this is unasafe routine; should be used from within critical section only !
+template <class _Dummy>
+void  _STLP_CALL
+__stl_debug_engine<_Dummy>::_Stamp_all(__owned_list* __l, __owned_list* __o) {
+  // crucial
+  if (__l->_M_node._M_owner) {
+    for (__owned_link*  __position = (__owned_link*)__l->_M_node._M_next; 
+	 __position != 0; __position= (__owned_link*)__position->_M_next) {
+      _STLP_ASSERT(__position->_Owner()== __l)
+      __position->_M_owner=__o;
+    }
+  }
+}
+
+template <class _Dummy>
+void  _STLP_CALL
+__stl_debug_engine<_Dummy>::_Verify(const __owned_list* __l) {
+  _STLP_ACQUIRE_LOCK(__l->_M_lock);
+  if (__l) {
+    _STLP_ASSERT(__l->_M_node._Owner() != 0)
+    for (__owned_link* __position = (__owned_link*)__l->_M_node._M_next; 
+         __position != 0; __position= (__owned_link*)__position->_M_next) {
+      _STLP_ASSERT(__position->_Owner()== __l)
+    }
+  }
+  _STLP_RELEASE_LOCK(__l->_M_lock);
+}
+
+template <class _Dummy>
+void _STLP_CALL  
+__stl_debug_engine<_Dummy>::_Swap_owners(__owned_list& __x, __owned_list& __y) {
+
+  //  according to the standard : --no swap() function invalidates any references, 
+  //  pointers,  or  iterators referring to the elements of the containers being swapped.
+
+  __owned_link* __tmp;
+
+  // boris : there is a deadlock potential situation here if we lock two containers sequentially.
+  // As user is supposed to provide its own synchronization around swap() ( it is unsafe to do any container/iterator access
+  // in parallel with swap()), we just do not use any locking at all -- that behaviour is closer to non-debug version
+
+  __tmp = __x._M_node._M_next;
+
+  _Stamp_all(&__x, &__y);
+  _Stamp_all(&__y, &__x);
+
+  __x._M_node._M_next = __y._M_node._M_next;
+  __y._M_node._M_next = __tmp;  
+
+}
+
+template <class _Dummy>
+void _STLP_CALL 
+__stl_debug_engine<_Dummy>::_M_detach(__owned_list* __l, __owned_link* __c_node) {
+  if (__l  != 0) {
+
+    _STLP_VERBOSE_ASSERT(__l->_Owner()!=0, _StlMsg_INVALID_CONTAINER)
+
+    _STLP_ACQUIRE_LOCK(__l->_M_lock)
+      // boris : re-test the condition in case someone else already deleted us
+      if(__c_node->_M_owner != 0) {
+        __owned_link* __prev, *__next;
+        
+        for (__prev = &__l->_M_node; (__next = __prev->_M_next) != __c_node; 
+             __prev = __next) {
+          _STLP_ASSERT(__next && __next->_Owner() == __l)
+            }
+        
+        __prev->_M_next = __c_node->_M_next;
+        __c_node->_M_owner=0;
+      }
+    _STLP_RELEASE_LOCK(__l->_M_lock)
+  }
+}
+
+template <class _Dummy>
+void _STLP_CALL 
+__stl_debug_engine<_Dummy>::_M_attach(__owned_list* __l, __owned_link* __c_node) {
+  if (__l ==0) {
+    (__c_node)->_M_owner = 0;    
+  } else {
+    _STLP_VERBOSE_ASSERT(__l->_Owner()!=0, _StlMsg_INVALID_CONTAINER)
+    _STLP_ACQUIRE_LOCK(__l->_M_lock)
+    __c_node->_M_owner = __l;
+    __c_node->_M_next = __l->_M_node._M_next;
+    __l->_M_node._M_next = __c_node;
+    _STLP_RELEASE_LOCK(__l->_M_lock)
+  }
+}
+
+
+template <class _Dummy>
+void* _STLP_CALL
+__stl_debug_engine<_Dummy>::_Get_container_ptr(const __owned_link* __l) {
+  const __owned_list* __owner    = __l->_Owner();
+  _STLP_VERBOSE_RETURN_0(__owner != 0, _StlMsg_INVALID_ITERATOR)
+  void* __ret = __CONST_CAST(void*,__owner->_Owner());
+  _STLP_VERBOSE_RETURN_0(__ret !=0, _StlMsg_INVALID_CONTAINER)
+  return __ret;
+}
+
+template <class _Dummy>
+bool _STLP_CALL
+__stl_debug_engine<_Dummy>::_Check_same_owner( const __owned_link& __i1, 
+                                               const __owned_link& __i2)
+{
+  _STLP_VERBOSE_RETURN(__i1._Valid(), _StlMsg_INVALID_LEFTHAND_ITERATOR)
+  _STLP_VERBOSE_RETURN(__i2._Valid(), _StlMsg_INVALID_RIGHTHAND_ITERATOR)
+  _STLP_VERBOSE_RETURN((__i1._Owner()==__i2._Owner()), _StlMsg_DIFFERENT_OWNERS)
+  return true;
+}
+
+template <class _Dummy>
+bool  _STLP_CALL
+__stl_debug_engine<_Dummy>::_Check_same_owner_or_null( const __owned_link& __i1, 
+						       const __owned_link& __i2)
+{
+  _STLP_VERBOSE_RETURN(__i1._Owner()==__i2._Owner(), _StlMsg_DIFFERENT_OWNERS)
+  return true;
+}
+
+template <class _Dummy>
+bool _STLP_CALL
+__stl_debug_engine<_Dummy>::_Check_if_owner( const __owned_list * __l, const __owned_link& __it)
+{
+  const __owned_list* __owner_ptr = __it._Owner();
+  _STLP_VERBOSE_RETURN(__owner_ptr!=0, _StlMsg_INVALID_ITERATOR)
+  _STLP_VERBOSE_RETURN(__l==__owner_ptr, _StlMsg_NOT_OWNER)
+  return true;
+}
+
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_DEBUG */
+
+#endif /* if defined (EXPOSE_GLOBALS_IMPLEMENTATION) */
+
+#endif /* header guard */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_debug.h b/src/STLport/stl/debug/_debug.h
new file mode 100644
index 0000000..0297598
--- /dev/null
+++ b/src/STLport/stl/debug/_debug.h
@@ -0,0 +1,426 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DEBUG_H
+# define _STLP_DEBUG_H
+
+# if defined (_STLP_ASSERTIONS) || defined (_STLP_DEBUG)
+
+#ifndef _STLP_CONFIG_H
+# include <stl/_config.h>
+#endif
+
+# if !defined (_STLP_EXTRA_OPERATORS_FOR_DEBUG) && \
+     ( defined (_STLP_BASE_MATCH_BUG) || (defined (_STLP_MSVC) && _STLP_MSVC < 1100 ) )
+#  define _STLP_EXTRA_OPERATORS_FOR_DEBUG
+# endif
+
+# if !defined(_STLP_FILE__)
+#   define _STLP_FILE__ __FILE__
+# endif
+ 
+enum {
+  _StlFormat_ERROR_RETURN,
+  _StlFormat_ASSERTION_FAILURE,
+  _StlFormat_VERBOSE_ASSERTION_FAILURE,
+  _StlMsg_INVALID_ARGUMENT,
+  _StlMsg_INVALID_CONTAINER,
+  _StlMsg_EMPTY_CONTAINER,
+  _StlMsg_ERASE_PAST_THE_END,
+  _StlMsg_OUT_OF_BOUNDS,
+  _StlMsg_NOT_OWNER,
+  _StlMsg_INVALID_ITERATOR,
+  _StlMsg_INVALID_LEFTHAND_ITERATOR,
+  _StlMsg_INVALID_RIGHTHAND_ITERATOR,
+  _StlMsg_DIFFERENT_OWNERS     ,
+  _StlMsg_NOT_DEREFERENCEABLE  ,
+  _StlMsg_INVALID_RANGE        ,
+  _StlMsg_NOT_IN_RANGE_1       ,
+  _StlMsg_NOT_IN_RANGE_2       ,
+  _StlMsg_INVALID_ADVANCE      ,
+  _StlMsg_SINGULAR_ITERATOR    ,
+  // debug alloc messages
+  _StlMsg_DBA_DELETED_TWICE    ,
+  _StlMsg_DBA_NEVER_ALLOCATED  ,
+  _StlMsg_DBA_TYPE_MISMATCH    ,
+  _StlMsg_DBA_SIZE_MISMATCH    ,
+  _StlMsg_DBA_UNDERRUN         ,
+  _StlMsg_DBA_OVERRUN          ,
+  // auto_ptr messages
+  _StlMsg_AUTO_PTR_NULL    ,
+  _StlMsg_UNKNOWN
+  /* _StlMsg_MAX */
+};
+
+/* have to hardcode that ;() */
+# define _StlMsg_MAX 27
+
+_STLP_BEGIN_NAMESPACE
+
+// This class is unique (not inherited from exception),
+// to disallow catch in anything but (...)
+struct __stl_debug_exception {
+  // no members
+};
+
+class _STLP_CLASS_DECLSPEC __owned_link;
+class _STLP_CLASS_DECLSPEC __owned_list;
+
+template <class _Dummy>
+struct __stl_debug_engine {
+
+  // Basic routine to report any debug message
+  // Use _STLP_DEBUG_MESSAGE to override
+  static void _STLP_CALL _Message(const char * format_str, ...);
+
+  // Micsellanous function to report indexed error message
+  static void _STLP_CALL  _IndexedError(int __ind, const char* __f, int __l);
+
+  // Basic assertion report mechanism.
+  // Reports failed assertion via __stl_debug_message and calls _Terminate
+  // if _STLP_DEBUG_TERMINATE is specified, calls __stl_debug_terminate instead
+  static void _STLP_CALL  _Assert(const char* __expr, const char* __f, int __l);
+
+  // The same, with additional diagnostics
+  static void _STLP_CALL  _VerboseAssert(const char* __expr, int __error_ind, const char* __f, int __l);
+
+  // If exceptions are present, sends unique exception
+  // If not, calls _STLP_ABORT() to terminate
+  // Use _STLP_DEBUG_TERMINATE to override
+  static void _STLP_CALL  _Terminate();
+
+# ifdef _STLP_DEBUG
+
+  // owned_list/link delegate non-inline functions here
+
+  static bool _STLP_CALL  _Check_same_owner( const __owned_link& __i1, 
+                                             const __owned_link& __i2);
+  static bool _STLP_CALL  _Check_same_owner_or_null( const __owned_link& __i1, 
+                                                     const __owned_link& __i2);
+  static bool  _STLP_CALL _Check_if_owner( const __owned_list*, const __owned_link&);
+
+  static void _STLP_CALL  _Verify(const __owned_list*);
+  
+  static void _STLP_CALL  _Swap_owners(__owned_list&, __owned_list& /*, bool __swap_roots */ );
+ 
+  static void _STLP_CALL  _Invalidate_all(__owned_list*);
+  
+  static void _STLP_CALL  _Stamp_all(__owned_list*, __owned_list*);
+
+  static void _STLP_CALL  _M_detach(__owned_list*, __owned_link*);
+
+  static void _STLP_CALL  _M_attach(__owned_list*, __owned_link*);
+
+  // accessor : check and get pointer to the container
+  static void* _STLP_CALL  _Get_container_ptr(const __owned_link*);
+# endif /* _STLP_DEBUG */
+
+  // debug messages and formats
+   _STLP_STATIC_MEMBER_DECLSPEC static const char* _Message_table[_StlMsg_MAX];
+};
+
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT_TEMPLATE struct _STLP_CLASS_DECLSPEC __stl_debug_engine<bool>;
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+typedef __stl_debug_engine<bool> __stl_debugger;
+
+_STLP_END_NAMESPACE
+
+#  ifndef _STLP_ASSERT
+#   define _STLP_ASSERT(expr) \
+     if (!(expr)) {STLPORT::__stl_debugger::_Assert( # expr, _STLP_FILE__, __LINE__);}
+#  endif
+
+# endif /* _STLP_ASSERTIONS || _STLP_DEBUG */
+
+
+// this section is for _STLP_DEBUG only 
+#if defined ( _STLP_DEBUG )
+
+# ifndef _STLP_VERBOSE_ASSERT
+// fbp : new form not requiring ";"
+#  define _STLP_VERBOSE_ASSERT(expr,__diag_num) \
+    if (!(expr)) { STLPORT::__stl_debugger::_VerboseAssert\
+                                 ( # expr,  __diag_num, _STLP_FILE__, __LINE__ ); \
+         }
+# endif
+
+#  define _STLP_DEBUG_CHECK(expr) _STLP_ASSERT(expr)
+#  define _STLP_DEBUG_DO(expr)    expr;
+
+# ifndef _STLP_VERBOSE_RETURN
+#  define _STLP_VERBOSE_RETURN(__expr,__diag_num) if (!(__expr)) { \
+       __stl_debugger::_IndexedError(__diag_num, __FILE__ , __LINE__); \
+       return false; }
+# endif
+
+# ifndef _STLP_VERBOSE_RETURN_0
+#  define _STLP_VERBOSE_RETURN_0(__expr,__diag_num) if (!(__expr)) { \
+       __stl_debugger::_IndexedError(__diag_num, __FILE__ , __LINE__); \
+       return 0; }
+# endif
+
+#if ! defined (_STLP_INTERNAL_THREADS_H)
+# include <stl/_threads.h>
+#endif
+
+#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
+# include <stl/_iterator_base.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+//=============================================================
+template <class _Iterator>
+inline bool  _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2, 
+                                      const random_access_iterator_tag&) { 
+    return (__i1< __i2) || (__i1 == __i2);
+}
+
+template <class _Iterator>
+inline bool  _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2,
+                                      const bidirectional_iterator_tag&) { 
+    // check if comparable
+    bool __dummy(__i1==__i2);
+    return (__dummy==__dummy); 
+}
+
+template <class _Iterator>
+inline bool  _STLP_CALL __valid_range(const _Iterator& __i1 ,const _Iterator& __i2, const forward_iterator_tag&) { 
+    // check if comparable
+    bool __dummy(__i1==__i2);
+    return (__dummy==__dummy); 
+}
+
+template <class _Iterator>
+inline bool  _STLP_CALL __valid_range(const _Iterator&,const _Iterator&, const input_iterator_tag&) { 
+    return true; 
+}
+
+template <class _Iterator>
+inline bool  _STLP_CALL __valid_range(const _Iterator&,const _Iterator&, const output_iterator_tag&) { 
+    return true; 
+}
+
+template <class _Iterator>
+inline bool  _STLP_CALL __valid_range(const _Iterator& __i1, const _Iterator& __i2) { 
+    return __valid_range(__i1,__i2,_STLP_ITERATOR_CATEGORY(__i1, _Iterator));
+}
+
+// Note : that means in range [i1, i2].
+template <class _Iterator>
+inline bool  _STLP_CALL __in_range(const _Iterator& _It, const _Iterator& __i1,
+                                   const _Iterator& __i2) { 
+    return __valid_range(__i1,_It,_STLP_ITERATOR_CATEGORY(__i1, _Iterator)) && 
+        __valid_range(_It,__i2,_STLP_ITERATOR_CATEGORY(_It, _Iterator));
+}
+
+template <class _Iterator>
+inline bool  _STLP_CALL __in_range(const _Iterator& __first, const _Iterator& __last, 
+                                   const _Iterator& __start, const _Iterator& __finish) { 
+    return __valid_range(__first,__last,_STLP_ITERATOR_CATEGORY(__first, _Iterator)) &&
+        __valid_range(__start,__first,_STLP_ITERATOR_CATEGORY(__first, _Iterator)) && 
+        __valid_range(__last,__finish,_STLP_ITERATOR_CATEGORY(__last, _Iterator));
+}
+
+//==========================================================
+
+
+class _STLP_CLASS_DECLSPEC __owned_link {
+public:
+
+  __owned_link() : _M_owner(0) {}
+  __owned_link(const __owned_list* __c) : _M_owner(0), _M_next(0) {
+    __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__c), this);
+  }
+  __owned_link(const __owned_link& __rhs): _M_owner(0) {
+    __stl_debugger::_M_attach(__CONST_CAST(__owned_list*,__rhs._M_owner), this);
+  }
+  __owned_link& operator=(const __owned_link& __rhs) {
+    __owned_list* __new_owner = __CONST_CAST(__owned_list*,__rhs._M_owner);
+    __owned_list* __old_owner = _M_owner;
+    if ( __old_owner != __new_owner ) {
+      __stl_debugger::_M_detach(__old_owner, this);
+      __stl_debugger::_M_attach(__new_owner, this);
+    }
+    return *this;
+  }
+  ~__owned_link() {
+    __stl_debugger::_M_detach(_M_owner, this);
+    _Invalidate();
+  }
+  
+  const __owned_list* _Owner() const { 
+    return _M_owner; 
+  }
+  __owned_list* _Owner() { 
+    return _M_owner; 
+  }
+  void _Set_owner(const __owned_list* __o)  { 
+    _M_owner= __CONST_CAST(__owned_list*,__o); 
+  }
+  bool  _Valid() const { 
+    return _M_owner !=0; 
+  }
+
+  void _Invalidate() { _M_owner=0; _M_next = 0; }
+  void _Link_to_self() { _M_next= 0; }
+
+  __owned_link* _Next() { return _M_next; }
+  const __owned_link* _Next() const { return _M_next; }
+
+public:
+  __owned_list* _M_owner;
+  __owned_link* _M_next;
+};
+
+
+class _STLP_CLASS_DECLSPEC __owned_list {
+public:
+  __owned_list(const void* __o) {
+    //    fprintf(stderr, "__owned_list(): %p\n",(void*)this);
+    _M_node._M_owner = __CONST_CAST(__owned_list*, __REINTERPRET_CAST(const __owned_list*,__o)); 
+    _M_node._M_next=0;
+  }
+  ~__owned_list() {
+    //    fprintf(stderr, "~__owned_list(): %p\n",(void*)this);
+    _Invalidate_all();
+    // that prevents detach
+    _M_node._Invalidate();
+  }
+  const void* _Owner() const { 
+    return (const void*)_M_node._M_owner; 
+  }
+  void* _Owner() { 
+    return (void*)_M_node._M_owner; 
+  }
+  bool  _Valid() const { 
+    return _M_node._M_owner!=0; 
+  }
+  void _Invalidate() { _M_node._M_owner=0; }
+  
+  __owned_link* _First() { return _M_node._Next(); }
+  __owned_link* _Last() { return 0 ; }
+
+  const __owned_link* _First() const { return (__owned_link*)_M_node._M_next; }
+  const __owned_link* _Last() const { return 0 ;}
+  
+  void _Verify() const {
+    __stl_debugger::_Verify(this); 
+  }
+  
+  void _Swap_owners(__owned_list& __y) { 
+    __stl_debugger::_Swap_owners(*this, __y); 
+  }
+ 
+  void _Invalidate_all() { 
+    __stl_debugger::_Invalidate_all(this);
+  }
+  
+  mutable __owned_link              _M_node; 
+  mutable _STLP_mutex            _M_lock;
+  
+private:
+  // should never be called, should be left undefined,
+  // but some compilers complain about it ;(
+  __owned_list(const __owned_list&){}
+  void operator=(const __owned_list&) {}
+
+  friend class __owned_link;
+  friend struct __stl_debug_engine<bool>;
+};
+
+
+//==========================================================
+
+// forward declaratioins
+
+template <class _Iterator>
+bool  _STLP_CALL __check_range(const _Iterator&, const _Iterator&);
+template <class _Iterator>
+bool _STLP_CALL  __check_range(const _Iterator&, 
+                               const _Iterator&, const _Iterator&);
+template <class _Iterator>
+bool _STLP_CALL  __check_range(const _Iterator&, const _Iterator& , 
+                               const _Iterator&, const _Iterator& );
+
+template <class _Iterator>
+void _STLP_CALL  __invalidate_range(const __owned_list* __base, 
+                                    const _Iterator& __first,
+                                    const _Iterator& __last);
+
+template <class _Iterator>
+void  _STLP_CALL __invalidate_iterator(const __owned_list* __base, 
+                                       const _Iterator& __it);
+
+//============================================================
+
+inline bool _STLP_CALL 
+__check_same_owner( const __owned_link& __i1, const __owned_link& __i2) {
+  return __stl_debugger::_Check_same_owner(__i1,__i2);
+}
+inline bool _STLP_CALL  
+__check_same_owner_or_null( const __owned_link& __i1, const __owned_link& __i2) {
+  return __stl_debugger::_Check_same_owner_or_null(__i1,__i2);
+}
+
+template <class _Iterator>
+inline bool _STLP_CALL  __check_if_owner( const __owned_list* __owner, 
+                                          const _Iterator& __it) {
+  return __stl_debugger::_Check_if_owner(__owner, (const __owned_link&)__it);
+}
+
+_STLP_END_NAMESPACE
+
+# endif /* _STLP_DEBUG */
+
+#if defined ( _STLP_ASSERTIONS )
+
+# ifndef _STLP_ASSERT_MSG_TRAILER
+#  define _STLP_ASSERT_MSG_TRAILER
+# endif
+
+// dwa 12/30/98 - if _STLP_DEBUG_MESSAGE is defined, the user can supply own definition.
+# if !defined( _STLP_DEBUG_MESSAGE )
+#   define __stl_debug_message __stl_debugger::_Message
+# else
+    extern  void __stl_debug_message(const char * format_str, ...);
+# endif
+
+// fbp: if _STLP_DEBUG_TERMINATE is defined, the user can supply own definition.
+# if !defined( _STLP_DEBUG_TERMINATE )
+#   define __stl_debug_terminate __stl_debugger::_Terminate
+# else
+    extern  void __stl_debug_terminate(void);
+# endif
+
+#endif
+
+# if !defined (_STLP_LINK_TIME_INSTANTIATION)
+#  include <stl/debug/_debug.c>
+# endif
+
+#endif /* DEBUG_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_deque.h b/src/STLport/stl/debug/_deque.h
new file mode 100644
index 0000000..2212696
--- /dev/null
+++ b/src/STLport/stl/debug/_deque.h
@@ -0,0 +1,281 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_DEQUE_H
+#define _STLP_INTERNAL_DBG_DEQUE_H
+
+#include <stl/debug/_iterator.h>
+
+# if !defined (_STLP_USE_WRAPPER_FOR_ALLOC_PARAM) && !defined (_STLP_NO_DEFAULT_NON_TYPE_PARAM)
+#  undef  _DBG_deque
+#  define _DBG_deque deque
+# endif
+
+# define _DEQUE_WRAPPER _DBG_deque<_Tp,_Alloc>
+
+# define _STLP_DEQUE_SUPER   __WORKAROUND_DBG_RENAME(deque) <_Tp,_Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp* value_type(const  _DBG_iter_base< _STLP_DEQUE_SUPER >&) {
+  return (_Tp*)0;
+}
+template <class _Tp, class _Alloc>
+inline random_access_iterator_tag iterator_category(const  _DBG_iter_base< _STLP_DEQUE_SUPER >&) {
+  return random_access_iterator_tag();
+}
+# endif
+
+template <class _Tp, _STLP_DBG_ALLOCATOR_SELECT(_Tp) >
+class _DBG_deque : public _STLP_DEQUE_SUPER {
+
+  typedef _DBG_deque<_Tp,_Alloc> _Self;
+  typedef _STLP_DEQUE_SUPER _Base;
+
+public:                         // Basic types
+
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+public:                         // Iterators
+  typedef _DBG_iter< _STLP_DEQUE_SUPER, _Nonconst_traits<value_type> >    iterator;
+  typedef _DBG_iter< _STLP_DEQUE_SUPER, _Const_traits<value_type> >   const_iterator;
+
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+protected:
+  __owned_list _M_iter_list;
+  void _Invalidate_iterator(const iterator& __it) { 
+    __invalidate_iterator(&_M_iter_list,__it);
+  }
+  void _Invalidate_all() {
+      _M_iter_list._Invalidate_all();
+  }
+
+public:                         // Basic accessors
+  iterator begin() { return iterator(&_M_iter_list, this->_M_start); }
+  iterator end() { return iterator(&_M_iter_list, this->_M_finish); }
+  const_iterator begin() const { 
+    return const_iterator(&_M_iter_list, this->_M_start); 
+  }
+  const_iterator end() const { 
+    return const_iterator(&_M_iter_list,  this->_M_finish); 
+  }
+
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rbegin() const 
+    { return const_reverse_iterator(end()); }
+  const_reverse_iterator rend() const 
+    { return const_reverse_iterator(begin()); }
+
+  reference operator[](size_type __n)
+    { return begin()[difference_type(__n)]; }
+  const_reference operator[](size_type __n) const 
+    { return begin()[difference_type(__n)]; }
+
+  reference front() { return *begin(); }
+  reference back() {
+    iterator __tmp = end();
+    --__tmp;
+    return *__tmp;
+  }
+  const_reference front() const { return *begin(); }
+  const_reference back() const {
+    const_iterator __tmp = end();
+    --__tmp;
+    return *__tmp;
+  }
+
+public:                         // Constructor, destructor.
+
+  const _Base* _Get_base() const { return (const _Base*)this; }
+
+  explicit _DBG_deque(const allocator_type& __a = allocator_type()) :
+    _STLP_DEQUE_SUPER(__a), _M_iter_list(_Get_base()) {}
+  _DBG_deque(const _Self& __x) : _STLP_DEQUE_SUPER(__x), _M_iter_list(_Get_base()) {}
+  _DBG_deque(size_type __n, const value_type& __value,
+        const allocator_type& __a = allocator_type()) : 
+    _STLP_DEQUE_SUPER(__n, __value, __a), _M_iter_list(_Get_base()) {}
+  explicit _DBG_deque(size_type __n) : _STLP_DEQUE_SUPER(__n), _M_iter_list(_Get_base()) {}
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  _DBG_deque(_InputIterator __first, _InputIterator __last,
+        const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : 
+    _STLP_DEQUE_SUPER(__first, __last, __a) , _M_iter_list(_Get_base()) {}
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  _DBG_deque(_InputIterator __first, _InputIterator __last):
+    _STLP_DEQUE_SUPER(__first, __last, allocator_type()) , _M_iter_list(_Get_base()) {}
+# endif
+#else /* _STLP_MEMBER_TEMPLATES */
+  _DBG_deque(const value_type* __first, const value_type* __last,
+        const allocator_type& __a = allocator_type()) 
+    : _STLP_DEQUE_SUPER(__first, __last, __a), _M_iter_list(_Get_base()) {}
+
+  _DBG_deque(const_iterator __first, const_iterator __last,
+        const allocator_type& __a = allocator_type()) 
+    : _STLP_DEQUE_SUPER(__first._M_iterator, __last._M_iterator, __a), 
+      _M_iter_list(_Get_base()) {}
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& operator= (const _Self& __x) {
+    _Invalidate_all();
+    (_Base&)*this = (const _Base&)__x; 
+    return *this;
+  }
+
+  void swap(_Self& __x) {
+    _M_iter_list._Swap_owners(__x._M_iter_list);
+    _Base::swap(__x);
+  }
+
+public: 
+  void assign(size_type __n, const _Tp& __val) {
+    _Base::assign(__n, __val);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    _Base::assign(__first, __last);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // push_* and pop_*
+  
+  void push_back(const value_type& __t) {
+    _Invalidate_all();
+    _Base::push_back(__t);
+  }
+
+  void push_back() {
+    _Invalidate_all();
+    _Base::push_back();
+  }
+
+  void push_front(const value_type& __t) {
+    _Invalidate_all();
+    _Base::push_front(__t);
+  }
+
+  void push_front() {
+    _Base::push_front();
+    _Invalidate_all();
+  }
+
+
+  void pop_back() {
+    _Invalidate_iterator(end());
+    _Base::pop_back();
+  }
+
+  void pop_front() {
+    _Invalidate_iterator(begin());        
+    _Base::pop_front();
+  }
+
+public:                         // Insert
+
+  iterator insert(iterator __position, const value_type& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    // fbp : invalidation !
+    return iterator(&_M_iter_list, _Base::insert(__position._M_iterator, __x));
+  }
+
+  iterator insert(iterator __position) { 
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    // fbp : invalidation !
+    return iterator(&_M_iter_list, _Base::insert(__position._M_iterator));
+  }
+
+  void insert(iterator __position, size_type __n, const value_type& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    // fbp : invalidation !
+    _Base::insert(__position._M_iterator, __n, __x);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template <class _InputIterator>
+  void insert(iterator __position, _InputIterator __first, _InputIterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    // fbp : invalidation !
+    _Base::insert(__position._M_iterator, __first, __last);
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert(iterator __position,
+              const value_type* __first, const value_type* __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    _Base::insert(__position._M_iterator, __first, __last);
+  }
+  void insert(iterator __position,
+              const_iterator __first, const_iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    _Base::insert(__position._M_iterator, __first._M_iterator, __last._M_iterator);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // Erase
+  iterator erase(iterator __pos) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __pos) && (__pos != end()))
+    return iterator (&_M_iter_list, _Base::erase(__pos._M_iterator));
+  }
+
+  iterator erase(iterator __first, iterator __last) {
+    _STLP_DEBUG_CHECK(__first >= begin() && __last <= end())
+    return iterator (&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator));
+  }
+  
+  void clear() {
+    _Invalidate_all();
+    _Base::clear();
+  }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_deque<_Tp, _Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DEQUE_SUPER
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE 
+
+# undef _DBG_deque
+# undef _STLP_DEQUE_SUPER
+  
+#endif /* _STLP_INTERNAL_DEQUE_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_hashtable.h b/src/STLport/stl/debug/_hashtable.h
new file mode 100644
index 0000000..0d5a110
--- /dev/null
+++ b/src/STLport/stl/debug/_hashtable.h
@@ -0,0 +1,261 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_HASHTABLE_H
+#define _STLP_INTERNAL_DBG_HASHTABLE_H
+
+// Hashtable class, used to implement the hashed associative containers
+// hash_set, hash_map, hash_multiset, and hash_multimap.
+
+# include <stl/debug/_iterator.h>
+
+#  undef  hashtable
+#  undef  _DBG_hashtable
+#  define _DBG_hashtable  hashtable
+
+#  define _STLP_DBG_HT_SUPER \
+__WORKAROUND_DBG_RENAME(hashtable) <_Val, _Key, _HF, _ExK, _EqK, _All>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+inline _Val*
+value_type(const  _DBG_iter_base< _STLP_DBG_HT_SUPER >&) {
+  return (_Val*)0;
+}
+
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+inline forward_iterator_tag
+iterator_category(const  _DBG_iter_base< _STLP_DBG_HT_SUPER >&) {
+  return forward_iterator_tag();
+}
+# endif
+
+template <class _Val, class _Key, class _HF,
+          class _ExK, class _EqK, class _All>
+class _DBG_hashtable : public _STLP_DBG_HT_SUPER {
+  typedef _DBG_hashtable<_Val, _Key, _HF, _ExK, _EqK, _All> _Self;
+  typedef _STLP_DBG_HT_SUPER _Base;
+
+public:
+  typedef _Key key_type;
+  typedef _HF hasher;
+  typedef _EqK key_equal;
+
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+public:
+  typedef _DBG_iter<_Base, _Nonconst_traits<value_type> >  iterator;
+  typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+  typedef typename _Base::iterator _Base_iterator;
+  typedef typename _Base::const_iterator _Base_const_iterator;
+
+protected:
+  void _Invalidate_all() {_M_iter_list._Invalidate_all();}
+
+  void _Invalidate_iterator(const const_iterator& __it) { 
+    __invalidate_iterator(&_M_iter_list,__it); 
+  }
+  void _Invalidate_iterators(const const_iterator& __first, const const_iterator& __last) {
+    const_iterator __cur = __first;
+    while (__cur != __last) __invalidate_iterator(&_M_iter_list, __cur++); 
+  }
+
+  const _Base* _Get_base() const { return (const _Base*)this; }
+  _Base* _Get_base() { return (_Base*)this; }
+
+public:
+  _DBG_hashtable(size_type __n,
+		 const _HF&  __hf,
+		 const _EqK& __eql,
+		 const _ExK& __ext,
+		 const allocator_type& __a = allocator_type()):
+    _STLP_DBG_HT_SUPER(__n, __hf, __eql, __ext, __a),
+    _M_iter_list(_Get_base()) {}
+  
+  _DBG_hashtable(size_type __n,
+		 const _HF&    __hf,
+		 const _EqK&   __eql,
+		 const allocator_type& __a = allocator_type()):
+    
+    _STLP_DBG_HT_SUPER(__n, __hf, __eql, __a),
+    _M_iter_list(_Get_base()) {}
+  
+  _DBG_hashtable(const _Self& __ht):
+    _STLP_DBG_HT_SUPER(__ht),
+    _M_iter_list(_Get_base()) {}
+  
+  _Self& operator= (const _Self& __ht) {
+    _Invalidate_all();
+    _Base::operator=(__ht);
+    return *this;
+  }
+  
+  void swap(_Self& __ht)
+  {
+   _M_iter_list._Swap_owners(__ht._M_iter_list);
+   _Base::swap(__ht);
+  }
+
+  iterator begin() { return iterator(&_M_iter_list, _Base::begin()); }
+  iterator end()   { return iterator(&_M_iter_list, _Base::end()); }
+
+  const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); }
+  const_iterator end() const { return const_iterator(&_M_iter_list, _Base::end()); }
+
+  pair<iterator, bool> insert_unique(const value_type& __obj)
+  {
+    pair < _Base_iterator, bool> __res =
+      _Base::insert_unique(__obj);
+    return pair<iterator, bool> ( iterator(&_M_iter_list, __res.first), __res.second);
+  }
+
+  iterator insert_equal(const value_type& __obj) {
+    return iterator(&_M_iter_list, _Base::insert_equal(__obj));
+  }
+  
+  pair<iterator, bool> insert_unique_noresize(const value_type& __obj) {
+    pair < _Base_iterator, bool> __res =
+      _Base::insert_unique_noresize(__obj);
+    return pair<iterator, bool> ( iterator(&_M_iter_list, __res.first), __res.second);
+  }
+  
+  iterator insert_equal_noresize(const value_type& __obj) {
+    return iterator(&_M_iter_list, _Base::insert_equal_noresize(__obj));
+  }
+  
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIterator>
+  void insert_unique(_InputIterator __f, _InputIterator __l) {
+    _Base::insert_unique(__f, __l);
+  }
+
+  template <class _InputIterator>
+  void insert_equal(_InputIterator __f, _InputIterator __l){
+    _Base::insert_equal(__f, __l);
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void insert_unique(const value_type* __f, const value_type* __l) {
+    _Base::insert_unique(__f, __l);
+  }
+  
+  void insert_equal(const value_type* __f, const value_type* __l) {
+    _Base::insert_equal(__f, __l);
+  }
+  
+  void insert_unique(const_iterator __f, const_iterator __l) {
+    _Base::insert_unique(__f._M_iterator, __l._M_iterator);
+  }
+  
+  void insert_equal(const_iterator __f, const_iterator __l) {
+    _Base::insert_equal(__f._M_iterator, __l._M_iterator);
+  }
+#endif /*_STLP_MEMBER_TEMPLATES */
+  
+  iterator find(const key_type& __key) {
+    return iterator(&_M_iter_list, _Base::find(__key));
+  } 
+
+  const_iterator find(const key_type& __key) const {
+    return const_iterator(&_M_iter_list, _Base::find(__key));
+  } 
+
+  pair<iterator, iterator> 
+  equal_range(const key_type& __key) {
+    pair < _Base_iterator, _Base_iterator > __res =
+      _Base::equal_range(__key);
+    return pair<iterator,iterator> (iterator(&_M_iter_list,__res.first),
+				    iterator(&_M_iter_list,__res.second));
+  }
+
+  pair<const_iterator, const_iterator> 
+  equal_range(const key_type& __key) const {
+    pair <  _Base_const_iterator, _Base_const_iterator > __res =
+      _Base::equal_range(__key);
+    return pair<const_iterator,const_iterator> (const_iterator(&_M_iter_list,__res.first),
+				    const_iterator(&_M_iter_list,__res.second));
+  }
+
+  size_type erase(const key_type& __key) {
+    pair<const_iterator, const_iterator> __p = equal_range(__key);
+    size_type __n = distance(__p.first, __p.second);
+    _Invalidate_iterators(__p.first, __p.second);
+    _Base::erase(__p.first._M_iterator, __p.second._M_iterator);
+    return __n;
+  }
+
+  void erase(const const_iterator& __it) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __it))
+    _STLP_DEBUG_CHECK(_Dereferenceable(__it))
+    _Invalidate_iterator(__it);
+    _Base::erase(__it._M_iterator);
+  }
+  void erase(const_iterator __first, const_iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __first)&&
+                      __check_if_owner(&_M_iter_list, __last))
+    _Invalidate_iterators(__first, __last);
+    _Base::erase(__first._M_iterator, __last._M_iterator);
+  }
+  void resize(size_type __num_elements_hint) {
+    _Base::resize(__num_elements_hint);
+  }
+  
+  void clear() {
+    _Invalidate_all();
+    _Base::clear();
+  }
+
+private:
+  __owned_list _M_iter_list;
+
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Val, class _Key, class _HF, class _ExK, class _EqK, class _All>
+#define _STLP_TEMPLATE_CONTAINER _DBG_hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+#define _STLP_TEMPLATE_CONTAINER_BASE hashtable<_Val,_Key,_HF,_ExK,_EqK,_All>
+#include <stl/debug/_relops_hash_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+#  undef  hashtable
+
+#endif /* _STLP_INTERNAL_HASHTABLE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
+
diff --git a/src/STLport/stl/debug/_iterator.h b/src/STLport/stl/debug/_iterator.h
new file mode 100644
index 0000000..2b96a2f
--- /dev/null
+++ b/src/STLport/stl/debug/_iterator.h
@@ -0,0 +1,394 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DBG_ITERATOR_H
+# define _STLP_DBG_ITERATOR_H
+
+# include <stl/_pair.h>
+# include <stl/_alloc.h>
+
+# define _STLP_DBG_ALLOCATOR_SELECT( _Tp ) _STLP_DEFAULT_ALLOCATOR_SELECT( _Tp )
+
+_STLP_BEGIN_NAMESPACE
+
+//============================================================
+
+template <class _Iterator>
+void _Decrement(_Iterator& __it, const bidirectional_iterator_tag &) {
+  --__it;
+}
+
+template <class _Iterator>
+void _Decrement(_Iterator& __it, const random_access_iterator_tag &) {
+  --__it;
+}
+
+template <class _Iterator>
+void _Decrement(_Iterator& __it, const forward_iterator_tag &) {
+  _STLP_ASSERT(0)
+}
+
+template <class _Iterator>
+void _Advance(_Iterator&, ptrdiff_t, const forward_iterator_tag &) {
+  _STLP_ASSERT(0)
+}
+
+template <class _Iterator>
+void _Advance(_Iterator& __it, ptrdiff_t, const bidirectional_iterator_tag &) {
+  _STLP_ASSERT(0)  
+}
+
+template <class _Iterator>
+void _Advance(_Iterator& __it, ptrdiff_t __n, const random_access_iterator_tag &) {
+  __it += __n;
+}
+
+template <class _Iterator>
+ptrdiff_t _DBG_distance(const _Iterator& __x, const _Iterator& __y, const random_access_iterator_tag &) {
+  return __x - __y;
+}
+
+template <class _Iterator>
+ptrdiff_t _DBG_distance(const _Iterator&, const _Iterator&, const forward_iterator_tag &) {
+  _STLP_ASSERT(0)
+  return 0;
+}
+
+template <class _Iterator>
+ptrdiff_t _DBG_distance(const _Iterator&, const _Iterator&, const bidirectional_iterator_tag &) {
+  _STLP_ASSERT(0)  
+  return 0;
+}
+
+template <class _Iterator>
+bool _CompareIt(const _Iterator&, const _Iterator&, const forward_iterator_tag &) {
+  _STLP_ASSERT(0)
+  return false;
+}
+
+template <class _Iterator>
+bool _CompareIt(const _Iterator&, const _Iterator&, const bidirectional_iterator_tag &) {
+  _STLP_ASSERT(0)  
+  return false;
+}
+
+template <class _Iterator>
+bool _CompareIt(const _Iterator& __x, const _Iterator& __y, const random_access_iterator_tag &) {
+  return __x < __y;
+}
+
+
+template <class _Iterator>
+bool _Dereferenceable(_Iterator __it) {
+  return (__it._Get_container_ptr() !=0) && !(__it._M_iterator == (__it._Get_container_ptr())->end());
+}
+
+
+template <class _Iterator>
+bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const forward_iterator_tag &) {
+  return (__n == 1) && _Dereferenceable(__it);
+}
+
+template <class _Iterator>
+bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const bidirectional_iterator_tag &) {
+  typedef typename _Iterator::_Container_type __container_type;
+  __container_type* __c = __it._Get_container_ptr();
+  return (__c!=0) && ((__n == 1 && __it._M_iterator != __c->end() ) ||
+    (__n == -1 && __it._M_iterator != __c->begin()));
+}
+
+template <class _Iterator>
+bool _Incrementable(const _Iterator& __it, ptrdiff_t __n, const random_access_iterator_tag &) {
+  typedef typename _Iterator::_Container_type __container_type;
+  __container_type* __c = __it._Get_container_ptr();
+  if (!__c) return false;
+  ptrdiff_t __new_pos = (__it._M_iterator - __c->begin()) + __n;
+  return  (__new_pos >=0) && (__STATIC_CAST(typename __container_type::size_type,__new_pos) <=__c->size());
+}
+
+
+template <class _Container>
+struct _DBG_iter_base : public __owned_link {
+public:
+  typedef typename _Container::value_type value_type;
+  typedef typename _Container::reference  reference;
+  typedef typename _Container::pointer    pointer;
+  typedef ptrdiff_t difference_type;
+  //private:
+  typedef typename _Container::iterator        _Nonconst_iterator;
+  typedef typename _Container::const_iterator  _Const_iterator;
+  typedef _Container                     _Container_type;
+    
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+  typedef typename iterator_traits<_Const_iterator>::iterator_category _Iterator_category;
+# else
+  typedef typename _Container::_Iterator_category  _Iterator_category;
+# endif
+  typedef _Iterator_category iterator_category;
+
+  _DBG_iter_base() : __owned_link(0)  {}
+  _DBG_iter_base(const __owned_list* __c, const _Const_iterator& __it) :
+# ifdef __HP_aCC
+    __owned_link(__c), _M_iterator(*__REINTERPRET_CAST(const _Nonconst_iterator *, &__it)) {}
+# else
+    __owned_link(__c), _M_iterator(*(const _Nonconst_iterator*)&__it) {}
+# endif  
+  _Container* _Get_container_ptr() const { 
+    return (_Container*)__stl_debugger::_Get_container_ptr(this); 
+  }
+
+  void __increment() {
+    _STLP_DEBUG_CHECK(_Incrementable(*this,1,_Iterator_category()))
+    ++_M_iterator;
+  }
+  
+  void __decrement() {
+    _STLP_DEBUG_CHECK(_Incrementable(*this,-1,_Iterator_category()))
+    _Decrement(_M_iterator, _Iterator_category());
+  }
+
+  void __advance(difference_type __n) {
+    _STLP_DEBUG_CHECK(_Incrementable(*this,__n, _Iterator_category()))
+    _Advance(_M_iterator,__n, _Iterator_category());
+  }
+
+// protected:
+  _Nonconst_iterator _M_iterator;
+};
+
+template <class _Container>
+ptrdiff_t operator-(const _DBG_iter_base<_Container>& __x,
+                    const _DBG_iter_base<_Container>& __y ) {
+  typedef typename _DBG_iter_base<_Container>::_Iterator_category  _Iterator_category;
+  _STLP_DEBUG_CHECK(__check_same_owner(__x, __y))
+  return _DBG_distance(__x._M_iterator,__y._M_iterator, _Iterator_category());
+}
+
+template <class _Container, class _Traits>
+struct _DBG_iter_mid : public _DBG_iter_base<_Container>
+{
+  typedef _DBG_iter_mid<_Container, typename _Traits::_Non_const_traits> _Nonconst_self;
+  typedef typename _Container::iterator        _Nonconst_iterator;
+  typedef typename _Container::const_iterator  _Const_iterator;
+
+  _DBG_iter_mid() {}
+
+  explicit _DBG_iter_mid(const _Nonconst_self& __it) :
+      _DBG_iter_base<_Container>(__it) {}
+        
+  _DBG_iter_mid(const __owned_list* __c, const _Const_iterator& __it) :
+      _DBG_iter_base<_Container>(__c, __it) {}
+};
+
+template <class _Container, class _Traits>
+struct _DBG_iter : public _DBG_iter_mid<_Container, _Traits> {
+  typedef _DBG_iter_base<_Container>          _Base;
+public:
+  typedef typename _Base::value_type value_type;
+  typedef typename _Base::difference_type difference_type;    
+  typedef typename _Traits::reference  reference;
+  typedef typename _Traits::pointer    pointer;
+
+private:
+  typedef typename _Base::_Nonconst_iterator _Nonconst_iterator;
+  typedef typename _Base::_Const_iterator _Const_iterator;
+
+  typedef _DBG_iter<_Container, _Traits>     _Self;
+  typedef _DBG_iter_mid<_Container, typename _Traits::_Non_const_traits> _Nonconst_mid;
+
+public:
+
+# ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+  typedef typename _Base::iterator_category iterator_category;
+# endif
+  typedef typename _Base::_Iterator_category  _Iterator_category;
+    
+public:
+  _DBG_iter() {}
+    // boris : real type of iter would be nice
+  _DBG_iter(const __owned_list* __c, const _Const_iterator& __it) :
+    _DBG_iter_mid<_Container, _Traits>(__c, __it) {}
+
+  // This allows conversions from iterator to const_iterator without being
+  // redundant with the copy constructor below.
+  _DBG_iter(const _Nonconst_mid& __rhs) :
+    _DBG_iter_mid<_Container, _Traits>(__rhs) {}
+
+  _DBG_iter(const  _Self& __rhs) :
+    _DBG_iter_mid<_Container, _Traits>(__rhs) {}
+  
+  // This allows conversions from iterator to const_iterator without being
+  // redundant with the copy assignment operator below.
+  _Self& operator=(const _Nonconst_mid& __rhs)  
+  {
+    (_Base&)*this = __rhs;
+    return *this;
+  }
+
+  _Self& operator=(const  _Self& __rhs) 
+  {
+    (_Base&)*this = __rhs;
+    return *this;
+  }
+  
+  reference operator*() const {
+    _STLP_DEBUG_CHECK(_Dereferenceable(*this))
+    return *this->_M_iterator;
+  }
+
+  _STLP_DEFINE_ARROW_OPERATOR
+  
+  _Self& operator++() {
+    this->__increment();
+    return *this;
+  }
+  _Self operator++(int) {
+    _Self __tmp = *this;
+    this->__increment();
+    return __tmp;
+  }
+  _Self& operator--() {
+    this->__decrement();
+    return *this;
+  }
+  _Self operator--(int) {
+    _Self __tmp = *this;
+    this->__decrement();
+    return __tmp;
+  }
+  
+  _Self& operator+=(difference_type __n) {
+    this->__advance(__n);
+    return *this;
+  }
+  
+  _Self& operator-=(difference_type __n) {
+    this->__advance(-__n);
+    return *this;
+  }
+  _Self operator+(difference_type __n) const {
+    _Self __tmp(*this);
+    __tmp.__advance(__n);
+    return __tmp;
+  }
+  _Self operator-(difference_type __n) const {
+    _Self __tmp(*this);
+    __tmp.__advance(-__n);
+    return __tmp;
+  }
+  reference operator[](difference_type __n) const { return *(*this + __n); }
+};
+
+template <class _Container>
+inline bool 
+operator==(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
+  _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+  return __x._M_iterator==__y._M_iterator;
+}
+
+template <class _Container>
+inline bool 
+operator<(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
+  _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+  return _CompareIt(__x._M_iterator , __y._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool 
+operator>(const _DBG_iter_base<_Container>& __x,
+	  const _DBG_iter_base<_Container>& __y) { 
+  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+  return _CompareIt(__y._M_iterator , __x._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool 
+operator>=(const _DBG_iter_base<_Container>& __x, const _DBG_iter_base<_Container>& __y) {
+  _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+  return !_CompareIt(__x._M_iterator , __y._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool 
+operator<=(const _DBG_iter_base<_Container>& __x,
+	  const _DBG_iter_base<_Container>& __y) {
+  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category; 
+  return !_CompareIt(__y._M_iterator , __x._M_iterator, _Category());
+}
+
+template <class _Container>
+inline bool 
+operator!=(const _DBG_iter_base<_Container>& __x, 
+	   const _DBG_iter_base<_Container>& __y) {
+  _STLP_DEBUG_CHECK(__check_same_owner_or_null(__x, __y))
+  return __x._M_iterator != __y._M_iterator;
+}
+
+//------------------------------------------
+
+template <class _Container, class _Traits>
+inline _DBG_iter<_Container, _Traits> 
+operator+(ptrdiff_t __n, const _DBG_iter<_Container, _Traits>& __it) {
+    _DBG_iter<_Container, _Traits> __tmp(__it);
+    return __tmp += __n;
+}
+
+
+# ifdef _STLP_USE_OLD_HP_ITERATOR_QUERIES
+# if defined (_STLP_NESTED_TYPE_PARAM_BUG) \
+   || ( defined (__SUNPRO_CC) && __SUNPRO_CC < 0x600) \
+   || ( defined (_STLP_MSVC) && (_STLP_MSVC < 1100) )
+#  define _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS 1
+# endif
+
+template <class _Container>
+inline ptrdiff_t* 
+distance_type(const  _DBG_iter_base<_Container>&) { return (ptrdiff_t*) 0; }
+
+# if !defined (_STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS)
+template <class _Container>
+inline _STLP_TYPENAME_ON_RETURN_TYPE _DBG_iter_base<_Container>::value_type*
+value_type(const  _DBG_iter_base<_Container>&) {
+  typedef typename _DBG_iter_base<_Container>::value_type _Val;
+  return (_Val*)0;
+}
+
+template <class _Container>
+inline _STLP_TYPENAME_ON_RETURN_TYPE _DBG_iter_base<_Container>::_Iterator_category 
+iterator_category(const  _DBG_iter_base<_Container>&) {
+  typedef typename _DBG_iter_base<_Container>::_Iterator_category _Category;
+  return _Category();
+}
+# endif
+
+#  endif /* _STLP_USE_OLD_HP_ITERATOR_QUERIES */
+
+# define _Get_iter(__x)   __x
+# define _Debug_iter(__x, __y) __y
+
+_STLP_END_NAMESPACE
+
+#endif /* INTERNAL_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_list.h b/src/STLport/stl/debug/_list.h
new file mode 100644
index 0000000..de35cdc
--- /dev/null
+++ b/src/STLport/stl/debug/_list.h
@@ -0,0 +1,318 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_LIST_H
+#define _STLP_INTERNAL_DBG_LIST_H
+
+#include <stl/debug/_iterator.h>
+
+# ifndef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+#  undef  _DBG_list
+#  define _DBG_list list
+# endif
+
+#  define _STLP_DBG_LIST_BASE \
+__WORKAROUND_DBG_RENAME(list) <_Tp, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp*
+value_type(const  _DBG_iter_base< _STLP_DBG_LIST_BASE >&) {
+  return (_Tp*)0;
+}
+template <class _Tp, class _Alloc>
+inline bidirectional_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_LIST_BASE >&) {
+  return bidirectional_iterator_tag();
+}
+# endif
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class _DBG_list : public _STLP_DBG_LIST_BASE {
+
+  typedef _STLP_DBG_LIST_BASE _Base;
+  typedef _DBG_list<_Tp, _Alloc> _Self;
+
+public:      
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+public:
+  typedef _DBG_iter<_Base, _Nonconst_traits<value_type> >     iterator;
+  typedef _DBG_iter<_Base, _Const_traits<value_type> >    const_iterator;
+
+  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+protected:
+  mutable __owned_list _M_iter_list;
+  void _Invalidate_all() { _M_iter_list._Invalidate_all();}
+
+public:
+  const _Base* _Get_base() const { return (const _Base*)this; }
+  _Base* _Get_base() { return (_Base*)this; }
+  explicit _DBG_list(const allocator_type& __a = allocator_type()) :
+    _STLP_DBG_LIST_BASE(__a), _M_iter_list(_Get_base()) {}
+  _DBG_list(size_type __n, const _Tp& __value,
+	    const allocator_type& __a = allocator_type())
+    : _STLP_DBG_LIST_BASE(__n, __value, __a), _M_iter_list(_Get_base()) {}
+  explicit _DBG_list(size_type __n)
+    : _STLP_DBG_LIST_BASE(__n), _M_iter_list(_Get_base()) {}
+  
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // We don't need any dispatching tricks here, because insert does all of
+  // that anyway.  
+#  ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  _DBG_list(_InputIterator __first, _InputIterator __last)
+    : _STLP_DBG_LIST_BASE(__first, __last, allocator_type()), _M_iter_list(_Get_base()) {}
+#  endif
+  template <class _InputIterator>
+  _DBG_list(_InputIterator __first, _InputIterator __last,
+       const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL)
+    : _STLP_DBG_LIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {}
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  _DBG_list(const _Tp* __first, const _Tp* __last,
+       const allocator_type& __a = allocator_type())
+    : _STLP_DBG_LIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {}
+  _DBG_list(const_iterator __first, const_iterator __last,
+       const allocator_type& __a = allocator_type()):
+    _STLP_DBG_LIST_BASE(__first._M_iterator, __last._M_iterator, __a),
+    _M_iter_list(_Get_base()) {}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _DBG_list(const _Self& __x) : 
+    _STLP_DBG_LIST_BASE(__x) , _M_iter_list(_Get_base()) {}
+
+  _Self& operator=(const _Self& __x) {
+    _Invalidate_all();
+    _Base::operator=((const _Base&)__x);
+    return *this;
+  }
+
+public:
+  iterator begin()             { return iterator(&_M_iter_list, _Base::begin()); }
+  const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); }
+
+  iterator end()               { return iterator(&_M_iter_list, _Base::end()); }
+  const_iterator end() const   { return const_iterator(&_M_iter_list, _Base::end()); }
+
+  reverse_iterator rbegin()    { return reverse_iterator(end()); }
+  reverse_iterator rend()      { return reverse_iterator(begin()); }
+
+  const_reverse_iterator rbegin() const { return const_reverse_iterator(end()); }
+  const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
+
+  // those are here to enforce checking
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+  reference back() { return *(--end()); }
+  const_reference back() const { return *(--end()); }
+
+  void swap(_Self& __x) {
+    _M_iter_list._Swap_owners(__x._M_iter_list);
+    _Base::swap(__x); 
+  }
+
+  iterator insert(iterator __position, const _Tp& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+      return iterator(&_M_iter_list,_Base::insert(__position._M_iterator, __x) );
+  }
+
+# ifndef _STLP_NO_ANACHRONISMS
+  iterator insert(iterator __position) { return insert(__position, _Tp()); }
+# endif
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void insert(iterator __position, _InputIterator __first, _InputIterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _Base::insert(__position._M_iterator, __first, __last);
+  }
+
+#else
+
+  void insert(iterator __position, const _Tp* __first, const _Tp* __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _Base::insert(__position._M_iterator, __first, __last);
+  }
+
+  void insert(iterator __position,
+	      const_iterator __first, const_iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _Base::insert(__position._M_iterator, __first._M_iterator, __last._M_iterator);
+  }
+  
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void insert(iterator __position, size_type __n, const _Tp& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _Base::insert(__position._M_iterator, __n, __x);    
+  }
+
+  void pop_back() {
+    _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+    __invalidate_iterator(&_M_iter_list,end());
+    _Base::pop_back();
+  }
+
+  void pop_front() {
+    _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+    __invalidate_iterator(&_M_iter_list,begin());
+    _Base::pop_front();
+  }
+
+  iterator erase(iterator __position) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _STLP_VERBOSE_ASSERT(__position._M_iterator._M_node!=this->_M_node._M_data, 
+			 _StlMsg_ERASE_PAST_THE_END)
+    // fbp : CHECK !!!
+    __invalidate_iterator(&_M_iter_list, __position);
+    return iterator(&_M_iter_list,_Base::erase(__position._M_iterator));
+  }
+  iterator erase(iterator __first, iterator __last) {
+    while (__first != __last)
+      erase(__first++);
+    return __last;
+  }
+
+  void resize(size_type __new_size, const _Tp& __x) {
+    typename _Base::iterator __i = _Base::begin();
+    size_type __len = 0;
+    for ( ; __i != _Base::end() && __len < __new_size; ++__i, ++__len);
+    
+    if (__len == __new_size)
+      erase(iterator(&_M_iter_list,__i), end());
+    else                          // __i == end()
+      _Base::insert(_Base::end(), __new_size - __len, __x);
+  }
+
+  void resize(size_type __new_size) { this->resize(__new_size, _Tp()); }
+
+  void remove(const _Tp& __value) {
+    typename _Base::iterator __first = _Base::begin();
+    typename _Base::iterator __last = _Base::end();
+    while (__first != __last) {
+      typename _Base::iterator __next = __first;
+      ++__next;
+      if (__value == *__first) erase(iterator(&_M_iter_list,__first));
+      __first = __next;
+    }
+  }
+
+  void clear() {   
+    _Invalidate_all();
+    _Base::clear(); 
+  }
+
+public:
+  void splice(iterator __position, _Self& __x) {
+    _STLP_VERBOSE_ASSERT(&__x!=this, _StlMsg_INVALID_ARGUMENT)
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _Base::splice(__position._M_iterator, __x);
+    __x._Invalidate_all();
+  }
+
+  void splice(iterator __position, _Self& __x, iterator __i) {
+      _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position) &&
+                        __check_if_owner(&__x._M_iter_list ,__i))
+    _STLP_DEBUG_CHECK(_Dereferenceable(__i))
+    // fbp : CHECK !!!
+	// __invalidate_iterator(&__x._M_iter_list, __i);
+    _Base::splice(__position._M_iterator, __x, __i._M_iterator);
+  }
+
+  void splice(iterator __position, _Self& __x, iterator __first, iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    _STLP_VERBOSE_ASSERT(__first._Owner()==&__x._M_iter_list && __last._Owner()==&__x._M_iter_list, 
+			 _StlMsg_NOT_OWNER)
+    _Base::splice(__position._M_iterator, __x, __first._M_iterator, __last._M_iterator);
+  }
+
+  void merge(_Self& __x) {   
+    __x._Invalidate_all();
+    _Base::merge(__x); 
+  }
+  void reverse() {
+    _Invalidate_all();
+    _Base::reverse();
+  }
+  void unique() {
+    _Invalidate_all();
+    _Base::unique();
+  }
+  void sort() {
+    _Invalidate_all();
+    _Base::sort();
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _Predicate> void remove_if(_Predicate __pred)  {
+    _Base::remove_if(__pred);
+  }
+  template <class _BinaryPredicate>
+    void unique(_BinaryPredicate __binary_pred) {
+    _Base::unique(__binary_pred);
+  }
+  template <class _StrictWeakOrdering>
+    void merge(_Self& __x,
+	       _StrictWeakOrdering __comp) {
+    __x._Invalidate_all();
+    _Base::merge(__x, __comp);
+  }
+
+  template <class _StrictWeakOrdering>
+  void sort(_StrictWeakOrdering __comp) {
+      _Invalidate_all();
+      _Base::sort(__comp);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_list<_Tp,_Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_LIST_BASE
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE 
+
+#endif /* _STLP_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_relops_cont.h b/src/STLport/stl/debug/_relops_cont.h
new file mode 100644
index 0000000..c800404
--- /dev/null
+++ b/src/STLport/stl/debug/_relops_cont.h
@@ -0,0 +1,41 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+
+_STLP_TEMPLATE_HEADER
+inline  bool _STLP_CALL
+operator==(const _STLP_TEMPLATE_CONTAINER& __x, const _STLP_TEMPLATE_CONTAINER& __y)
+{
+  return (const _STLP_TEMPLATE_CONTAINER_BASE&)__x == (const _STLP_TEMPLATE_CONTAINER_BASE&)__y; 
+}
+
+_STLP_TEMPLATE_HEADER
+inline  bool _STLP_CALL
+operator<(const _STLP_TEMPLATE_CONTAINER& __x, const _STLP_TEMPLATE_CONTAINER& __y)
+{
+  return (const _STLP_TEMPLATE_CONTAINER_BASE&)__x < (const _STLP_TEMPLATE_CONTAINER_BASE&)__y; 
+}
+
+_STLP_RELOPS_OPERATORS( _STLP_TEMPLATE_HEADER , _STLP_TEMPLATE_CONTAINER )
+
+#endif /* _STLP_EXTRA_OPERATORS_FOR_DEBUG */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL swap(_STLP_TEMPLATE_CONTAINER& __x, _STLP_TEMPLATE_CONTAINER& __y)
+{
+  __x.swap(__y);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+#if 0 /* def _STLP_CLASS_PARTIAL_SPECIALIZATION */
+
+_STLP_TEMPLATE_HEADER
+struct __type_traits<_STLP_STD::_STLP_TEMPLATE_CONTAINER > : __type_traits_aux<0, 1>
+{};
+
+#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
diff --git a/src/STLport/stl/debug/_relops_hash_cont.h b/src/STLport/stl/debug/_relops_hash_cont.h
new file mode 100644
index 0000000..6e94167
--- /dev/null
+++ b/src/STLport/stl/debug/_relops_hash_cont.h
@@ -0,0 +1,34 @@
+// This is an implementation file which
+// is intended to be included multiple times with different _STLP_ASSOCIATIVE_CONTAINER
+// setting
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL 
+operator==(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+  return _STLP_TEMPLATE_CONTAINER_BASE::_M_equal(__hm1, __hm2);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+_STLP_TEMPLATE_HEADER
+inline bool _STLP_CALL 
+operator!=(const _STLP_TEMPLATE_CONTAINER& __hm1, const _STLP_TEMPLATE_CONTAINER& __hm2) {
+  return !(__hm1 == __hm2);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+#endif /* _STLP_EXTRA_OPERATORS_FOR_DEBUG */
+
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+
+_STLP_TEMPLATE_HEADER
+inline void _STLP_CALL 
+swap(_STLP_TEMPLATE_CONTAINER& __hm1, _STLP_TEMPLATE_CONTAINER& __hm2)
+{
+  __hm1.swap(__hm2);
+}
+
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
diff --git a/src/STLport/stl/debug/_slist.h b/src/STLport/stl/debug/_slist.h
new file mode 100644
index 0000000..ec22394
--- /dev/null
+++ b/src/STLport/stl/debug/_slist.h
@@ -0,0 +1,399 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_SLIST_H
+#define _STLP_INTERNAL_DBG_SLIST_H
+
+#include <stl/debug/_iterator.h>
+
+# ifndef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+#  undef  _DBG_slist
+#  define _DBG_slist slist
+# endif
+
+#  define _STLP_DBG_SLIST_BASE __WORKAROUND_DBG_RENAME(slist) <_Tp, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp*
+value_type(const _DBG_iter_base< _STLP_DBG_SLIST_BASE >&) {
+  return (_Tp*)0;
+}
+
+template <class _Tp, class _Alloc>
+inline forward_iterator_tag
+iterator_category(const _DBG_iter_base< _STLP_DBG_SLIST_BASE >&) {
+  return forward_iterator_tag();
+}
+# endif
+
+template <class _Tp, _STLP_DEFAULT_ALLOCATOR_SELECT(_Tp) >
+class _DBG_slist : public _STLP_DBG_SLIST_BASE
+{
+private:
+  typedef _STLP_DBG_SLIST_BASE _Base;
+  typedef _DBG_slist<_Tp,_Alloc> _Self;
+
+public:
+
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+  typedef _DBG_iter<_Base, _Nonconst_traits<value_type> >      iterator;
+  typedef _DBG_iter<_Base, _Const_traits<value_type> >     const_iterator;
+
+protected:
+  friend class __owned_link;
+  mutable __owned_list _M_iter_list;
+  void _Invalidate_all() { _M_iter_list._Invalidate_all();}
+  void _Invalidate_iterator(const iterator& __it) {__invalidate_iterator(&_M_iter_list, __it); }
+
+public:
+  const _Base* _Get_base() const { return (const _Base*)this; }
+  _Base* _Get_base() { return (_Base*)this; }
+
+public:
+
+  explicit _DBG_slist(const allocator_type& __a = allocator_type()) :
+    _STLP_DBG_SLIST_BASE(__a) , _M_iter_list(_Get_base()) {}
+  
+  _DBG_slist(size_type __n, const value_type& __x,
+	     const allocator_type& __a =  allocator_type()) :
+    _STLP_DBG_SLIST_BASE(__n, __x, __a), _M_iter_list(_Get_base()) {}
+  
+  explicit _DBG_slist(size_type __n) : _STLP_DBG_SLIST_BASE(__n) , _M_iter_list(_Get_base()) {}
+  
+#ifdef _STLP_MEMBER_TEMPLATES
+  // We don't need any dispatching tricks here, because _M_insert_after_range
+  // already does them.
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  _DBG_slist(_InputIterator __first, _InputIterator __last) :
+    _STLP_DBG_SLIST_BASE(__first, __last, allocator_type()), _M_iter_list(_Get_base()) {} 
+# endif
+  template <class _InputIterator>
+  _DBG_slist(_InputIterator __first, _InputIterator __last,
+	     const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) : 
+    _STLP_DBG_SLIST_BASE(__first, __last, __a), _M_iter_list(_Get_base()) {} 
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  _DBG_slist(const_iterator __first, const_iterator __last,
+	     const allocator_type& __a = allocator_type() ) :
+    _STLP_DBG_SLIST_BASE(__first._M_iterator, __last._M_iterator, __a),
+    _M_iter_list(_Get_base()) {}
+  
+  _DBG_slist(const value_type* __first, const value_type* __last,
+        const allocator_type& __a =  allocator_type()) : 
+    _STLP_DBG_SLIST_BASE(__first, __last, __a), _M_iter_list(_Get_base())  {}
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _DBG_slist(const _Self& __x) : _STLP_DBG_SLIST_BASE(__x), _M_iter_list(_Get_base()) {}
+  
+  _Self& operator= (const _Self& __x) {
+    _Invalidate_all();
+    (_Base&)*this = (const _Base&)__x;
+    return *this;
+  }
+  
+  ~_DBG_slist() {}
+
+public:
+  void assign(size_type __n, const _Tp& __val) {
+    // fbp :check invalidation here !
+    _Base::assign(__n, __val); 
+  }
+
+public:
+
+  iterator before_begin() { return iterator(&_M_iter_list, _Base::before_begin()); }
+  const_iterator before_begin() const
+    { return const_iterator(&_M_iter_list, _Base::before_begin()); }
+
+  iterator begin() { return iterator(&_M_iter_list, _Base::begin()); }
+  const_iterator begin() const 
+    { return const_iterator(&_M_iter_list,_Base::begin());}
+
+  iterator end() { return iterator(&_M_iter_list, _Base::end()); }
+  const_iterator end() const { return const_iterator(&_M_iter_list, _Base::end()); }
+
+  void swap(_Self& __x) { 
+    _M_iter_list._Swap_owners(__x._M_iter_list);
+    _Base::swap(__x); 
+  }
+
+public:
+  // fbp : checks here !
+  reference front() { 
+    _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+    return _Base::front(); 
+  }
+  const_reference front() const { 
+    _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+    return _Base::front(); 
+  }
+  void pop_front() {
+    _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+    _Base::pop_front();
+  }
+  iterator previous(const_iterator __pos) {
+    return iterator(&_M_iter_list,_Base::previous(__pos._M_iterator));
+  }
+  const_iterator previous(const_iterator __pos) const {
+    return const_iterator(&_M_iter_list,_Base::previous(__pos._M_iterator));
+  }
+
+public:
+
+  iterator insert_after(iterator __pos, const value_type& __x) {
+    return iterator(&_M_iter_list,_Base::insert_after(__pos._M_iterator, __x));
+  }
+
+  iterator insert_after(iterator __pos) {
+    return iterator(&_M_iter_list,_Base::insert_after(__pos._M_iterator));
+  }
+
+  void insert_after(iterator __pos, size_type __n, const value_type& __x) {
+    _Base::insert_after(__pos._M_iterator, __n, __x);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _InputIterator>
+  void assign(_InputIterator __first, _InputIterator __last) {
+    // fbp :check invalidation here !
+    _Base::assign(__first, __last);
+  }
+
+  // We don't need any dispatching tricks here, because _M_insert_after_range
+  // already does them.
+  template <class _InIter>
+  void insert_after(iterator __pos, _InIter __first, _InIter __last) {
+    _Base::insert_after(__pos._M_iterator, __first, __last);
+  }
+
+  // We don't need any dispatching tricks here, because _M_insert_after_range
+  // already does them.
+  template <class _InIter>
+  void insert(iterator __pos, _InIter __first, _InIter __last) {
+    _Base::insert(__pos._M_iterator, __first, __last);
+
+  }
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  void insert_after(iterator __pos,
+                    const_iterator __first, const_iterator __last) {
+    _Base::insert_after(__pos._M_iterator, __first._M_iterator, __last._M_iterator);
+  }
+  void insert_after(iterator __pos,
+                    const value_type* __first, const value_type* __last) {
+    _Base::insert_after(__pos._M_iterator, __first, __last);
+  }
+
+  void insert(iterator __pos, const_iterator __first, const_iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    _Base::insert(__pos._M_iterator, __first._M_iterator, __last._M_iterator);
+  }
+  void insert(iterator __pos, const value_type* __first, 
+                              const value_type* __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    _Base::insert(__pos._M_iterator, __first, __last);
+  }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  iterator insert(iterator __pos, const value_type& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    return iterator(&_M_iter_list, _Base::insert(__pos._M_iterator, __x));
+  }
+
+  iterator insert(iterator __pos) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    return iterator(&_M_iter_list, _Base::insert(__pos._M_iterator));
+  }
+
+  void insert(iterator __pos, size_type __n, const value_type& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    _Base::insert(__pos._M_iterator, __n, __x);
+  } 
+    
+public:
+  iterator erase_after(iterator __pos) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    return iterator(&_M_iter_list, _Base::erase_after(__pos._M_iterator));
+  }
+  iterator erase_after(iterator __before_first, iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__before_first))
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__last))
+    return iterator(&_M_iter_list, 
+		    _Base::erase_after(__before_first._M_iterator, __last._M_iterator));
+  } 
+
+  iterator erase(iterator __pos) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    return iterator(&_M_iter_list, _Base::erase(__pos._M_iterator));
+  }
+  iterator erase(iterator __first, iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__first))
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__last))
+    return iterator(&_M_iter_list, 
+		    _Base::erase(__first._M_iterator, __last._M_iterator));
+  }
+
+  void resize(size_type __new_size, const _Tp& __x) {
+    _Base::resize(__new_size, __x);
+  }
+  void resize(size_type new_size) { resize(new_size, _Tp()); }
+
+  void clear() {
+    _Invalidate_all();      
+    _Base::clear();
+  }
+
+public:
+  // Moves the range [__before_first + 1, __before_last + 1) to *this,
+  //  inserting it immediately after __pos.  This is constant time.
+  void splice_after(iterator __pos, 
+                    iterator __before_first, iterator __before_last)
+  {
+    if (__before_first != __before_last) {
+      _Base::splice_after(__pos._M_iterator, 
+                          __before_first._M_iterator, __before_last._M_iterator);
+      __before_first++;
+      __before_last++;
+      __invalidate_range(__before_first._Owner(), 
+                         __before_first, __before_last);
+    }
+  }
+
+  // Moves the element that follows __prev to *this, inserting it immediately
+  //  after __pos.  This is constant time.
+  void splice_after(iterator __pos, iterator __prev)
+  {
+    _Base::splice_after(__pos._M_iterator, __prev._M_iterator);
+    __invalidate_iterator(__prev._Owner(), ++__prev);
+  }
+
+  // Removes all of the elements from the list __x to *this, inserting
+  // them immediately after __pos.  __x must not be *this.  Complexity:
+  // linear in __x.size().
+  void splice_after(iterator __pos, _Self& __x)
+  {
+    _Base::splice_after(__pos._M_iterator, (_Base&)__x);
+    __x._Invalidate_all();
+  }
+
+  // Linear in distance(begin(), __pos), and linear in __x.size().
+  void splice(iterator __pos, _Self& __x) {
+    _STLP_VERBOSE_ASSERT(!(&__x==this), _StlMsg_INVALID_ARGUMENT)
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    _Base::splice(__pos._M_iterator, (_Base&)__x);
+    __x._Invalidate_all();
+  }
+
+  // Linear in distance(begin(), __pos), and in distance(__x.begin(), __i).
+  void splice(iterator __pos, _Self& __x, iterator __i) {
+    _STLP_VERBOSE_ASSERT(&__x!=this, _StlMsg_INVALID_ARGUMENT)
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos) && 
+                      __check_if_owner(&__x._M_iter_list ,__i))
+    _Base::splice(__pos._M_iterator, (_Base&)__x, __i._M_iterator);
+    __x._Invalidate_iterator(__i);
+  }
+
+  // Linear in distance(begin(), __pos), in distance(__x.begin(), __first),
+  // and in distance(__first, __last).
+  void splice(iterator __pos, _Self& __x, iterator __first, iterator __last)
+  {
+    _STLP_VERBOSE_ASSERT(&__x!=this, _StlMsg_INVALID_ARGUMENT)
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__pos))
+    if (__first != __last)
+      _Base::splice(__pos._M_iterator, (_Base&)__x, __first._M_iterator, __last._M_iterator);      
+    __invalidate_range(&__x._M_iter_list, __first, __last);
+  }
+
+public:
+
+  void remove(const _Tp& __val) {
+    _Base::remove(__val);
+    //    __x._Invalidate_all();    
+  }
+  void unique() {
+    _Base::unique();
+  }
+  void merge(_Self& __x) {
+    _Base::merge((_Base&)__x);
+    __x._Invalidate_all();
+  }
+  void sort() {
+    _Invalidate_all();
+    _Base::sort();
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  template <class _Predicate> 
+  void remove_if(_Predicate __pred) {
+    _Base::remove_if(__pred);
+  }
+
+  template <class _BinaryPredicate> 
+  void unique(_BinaryPredicate __pred) {
+    _Base::unique(__pred);
+  }
+
+  template <class _StrictWeakOrdering> 
+  void merge(_Self& __x, _StrictWeakOrdering __ord) {
+    _Base::merge((_Base&)__x, __ord);
+    __x._Invalidate_all();    
+  }
+
+  template <class _StrictWeakOrdering>
+  void sort(_StrictWeakOrdering __comp) {
+      _Invalidate_all();
+      _Base::sort(__comp);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_slist<_Tp,_Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_SLIST_BASE
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_INTERNAL_DBG_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/debug/_string.h b/src/STLport/stl/debug/_string.h
new file mode 100644
index 0000000..2ea29e1
--- /dev/null
+++ b/src/STLport/stl/debug/_string.h
@@ -0,0 +1,772 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_DBG_STRING_H
+#define _STLP_DBG_STRING_H
+
+#include <stl/debug/_iterator.h>
+
+# define _STLP_DBG_STRING_BASE _Nondebug_string <_CharT, _Traits, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _CharT,class _Traits, class _Alloc>
+inline _CharT*
+value_type(const  _DBG_iter_base< _STLP_DBG_STRING_BASE >&) {
+return (_CharT*)0;
+}
+template <class _CharT, class _Traits, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const  _DBG_iter_base< _STLP_DBG_STRING_BASE >&) {
+  return random_access_iterator_tag();
+}
+# endif
+
+template <class _CharT, class _Traits, class _Alloc> 
+class basic_string : public _STLP_DBG_STRING_BASE {
+private:
+  typedef _STLP_DBG_STRING_BASE _Base;
+  typedef basic_string<_CharT, _Traits, _Alloc> _Self;
+protected:
+  mutable __owned_list _M_iter_list;
+public:
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+  typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+  typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+# ifdef _STLP_USE_NATIVE_STRING
+  // this typedef is being used for conversions
+  typedef _STLP_VENDOR_STD::basic_string<_CharT,_Traits, 
+    _STLP_VENDOR_STD::allocator<_CharT> >  __std_string;
+# endif
+public:                         // Constructor, destructor, assignment.
+  typedef typename _Base::_Reserve_t _Reserve_t;
+
+  const _Base* _Get_base() const { return (const _Base*)this; }
+  _Base* _Get_base() { return (_Base*)this; }
+
+  basic_string() :_STLP_DBG_STRING_BASE(), _M_iter_list(_Get_base()) {}
+  
+  explicit basic_string(const allocator_type& __a): 
+    _STLP_DBG_STRING_BASE(__a), _M_iter_list(_Get_base()) {}
+
+  basic_string(_Reserve_t __r, size_t __n,
+               const allocator_type& __a = allocator_type())
+    : _STLP_DBG_STRING_BASE(__r, __n, __a), _M_iter_list(_Get_base()) {}
+
+  basic_string(const _Self& __s): 
+    _STLP_DBG_STRING_BASE(__s), _M_iter_list(_Get_base()) {}
+
+  basic_string(const _Self& __s, size_type __pos, size_type __n = _Base::npos,
+               const allocator_type& __a = allocator_type()):
+    _STLP_DBG_STRING_BASE(__s, __pos, __n, __a), _M_iter_list(_Get_base()) {}
+
+  basic_string(const _CharT* __s, size_type __n,
+		    const allocator_type& __a = allocator_type()):
+    _STLP_DBG_STRING_BASE(__s, __n, __a), _M_iter_list(_Get_base()) {}
+
+  basic_string(const _CharT* __s,
+		    const allocator_type& __a = allocator_type()):
+    _STLP_DBG_STRING_BASE(__s, __a), _M_iter_list(_Get_base()) {}
+
+  basic_string(size_type __n, _CharT __c,
+		    const allocator_type& __a = allocator_type()):
+    _STLP_DBG_STRING_BASE(__n, __c, __a), _M_iter_list(_Get_base()) {}
+
+#if defined (_STLP_MEMBER_TEMPLATES) && !(defined(__MRC__)||(defined(__SC__) && !defined(__DMC__)))
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  basic_string(_InputIterator __f, _InputIterator __l):
+    _STLP_DBG_STRING_BASE(__f, __l), _M_iter_list(_Get_base()) {}
+#  endif
+  template <class _InputIterator>
+  basic_string(_InputIterator __f, _InputIterator __l,
+		    const allocator_type & __a _STLP_ALLOCATOR_TYPE_DFL):
+    _STLP_DBG_STRING_BASE(__f, __l, __a), _M_iter_list(_Get_base()) {}
+#else /* _STLP_MEMBER_TEMPLATES */
+  basic_string(const_iterator __f, const_iterator __l, 
+		    const allocator_type & __a = allocator_type()):
+    _STLP_DBG_STRING_BASE(__f._M_iterator, __l._M_iterator, __a), 
+     _M_iter_list(_Get_base()) {}
+
+  basic_string(const _CharT* __f, const _CharT* __l,
+               const allocator_type& __a = allocator_type()):
+   _STLP_DBG_STRING_BASE(__f, __l, __a), _M_iter_list(_Get_base()) {}
+#endif
+
+# ifdef _STLP_USE_NATIVE_STRING
+  // these conversion operations still needed for
+  // strstream, etc.
+  basic_string (const __std_string& __x)
+    : _STLP_DBG_STRING_BASE(__x.begin(), __x.end()), _M_iter_list(_Get_base()) {}
+  operator __std_string() const { return __std_string(this->data()); }
+# endif
+
+  // constructor from non-debug version
+  basic_string (const _Base& __x)
+    : _STLP_DBG_STRING_BASE(__x), _M_iter_list(_Get_base()) {}
+
+  _Self& operator=(const _Self& __s) {
+    _Base::operator=(__s);
+    return *this;
+  }
+
+  _Self& operator=(const _CharT* __s) { 
+    _STLP_FIX_LITERAL_BUG(__s)
+    _Base::operator=(__s);
+    return *this;
+  }
+
+  _Self& operator=(_CharT __c) {
+    _Base::operator=(__c);
+    return *this;
+  }
+
+public:                         // Iterators.
+
+  iterator begin() { return iterator(&_M_iter_list, this->_M_start); }
+  const_iterator begin() const { return const_iterator(&_M_iter_list,this->_M_start); }
+  iterator end() { return iterator(&_M_iter_list,this->_M_finish); }
+  const_iterator end() const { return const_iterator(&_M_iter_list,this->_M_finish); }
+  void _M_deallocate_block() {
+    _M_iter_list._Invalidate_all();
+    _Base::_M_deallocate_block();
+  }
+
+  reverse_iterator rbegin()             
+    { return reverse_iterator(iterator(&_M_iter_list,this->_M_finish)); }
+  reverse_iterator rend()               
+    { return reverse_iterator(iterator(&_M_iter_list,this->_M_start)); }
+  const_reverse_iterator rbegin() const 
+    { return const_reverse_iterator(const_iterator(&_M_iter_list,this->_M_finish)); }
+  const_reverse_iterator rend()   const 
+    { return const_reverse_iterator(const_iterator(&_M_iter_list,this->_M_start)); }
+
+public:                         // Size, capacity, etc.
+
+  void resize(size_type __n, _CharT __c) {
+    _Base::resize(__n, __c);
+  }
+  void resize(size_type __n) { resize(__n, this->_M_null()); }
+
+  void reserve(size_type __s= 0) {
+    _Base::reserve(__s);
+  }
+
+  void clear() {
+    _M_iter_list._Invalidate_all();
+    _Base::clear();
+  } 
+
+public:                         // Element access.
+
+  const_reference operator[](size_type __n) const
+    { return *(begin() + __n); }
+  reference operator[](size_type __n)
+    { return *(begin() + __n); }
+
+  const_reference at(size_type __n) const {
+    if (__n >= this->size())
+      this->_M_throw_out_of_range();
+    return *(begin() + __n);
+  }
+
+  reference at(size_type __n) {
+    if (__n >= this->size())
+      this->_M_throw_out_of_range();
+    return *(begin() + __n);
+  }
+
+public:                         // Append, operator+=, push_back.
+
+  _Self& operator+=(const _Self& __s) { return append(__s); }
+  _Self& operator+=(const _CharT* __s) { _STLP_FIX_LITERAL_BUG(__s) return append(__s); }
+  _Self& operator+=(_CharT __c) { push_back(__c); return *this; }
+
+  _Self& append(const _Self& __s) { return append(__s._M_start, __s._M_finish); }
+
+  _Self& append(const _Self& __s,
+                       size_type __pos, size_type __n)
+  {
+    _Base::append(__s, __pos, __n);
+    return *this;
+  }
+
+  _Self& append(const _CharT* __s, size_type __n) 
+    { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s+__n); }
+
+  _Self& append(const _CharT* __s) 
+    { _STLP_FIX_LITERAL_BUG(__s) return append(__s, __s + _Traits::length(__s)); }
+
+  _Self& append(size_type __n, _CharT __c){
+	  _Base::append(__n, __c);
+	  return *this;
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+
+  // Check to see if _InputIterator is an integer type.  If so, then
+  // it can't be an iterator.
+  template <class _InputIter>
+  _Self& append(_InputIter __first, _InputIter __last) {
+    _Base::append(__first, __last);
+    return *this;
+  }
+
+#ifdef _STLP_MSVC
+// specialization for append
+ template <>
+ inline _Self& append(iterator __f, iterator __l) {
+ _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+  __check_range(__f, __l);
+  _Base::append(__f._M_iterator, __l._M_iterator);
+  return *this;
+ }
+#endif
+
+#else /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& append(const _CharT* __first, const _CharT* __last) {
+    _Base::append(__first, __last);
+    return *this;
+  }
+
+  _Self& append(const_iterator __first, const_iterator __last) {
+    _Base::append(__first._M_iterator, __last._M_iterator);
+    return *this;
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void push_back(_CharT __c) {
+    _Base::push_back(__c);
+  }
+
+  void pop_back() {
+    __invalidate_iterator(&_M_iter_list,end());
+    _Base::pop_back();
+  }
+
+
+public:                         // Assign
+  
+  _Self& assign(const _Self& __s) {
+    _Base::assign(__s); 
+    return *this; 
+  }
+
+  _Self& assign(const _Self& __s, 
+                       size_type __pos, size_type __n) {
+    _Base::assign(__s, __pos, __n);
+    return *this;
+  }
+
+  _Self& assign(const _CharT* __s, size_type __n)
+    { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + __n); }
+
+  _Self& assign(const _CharT* __s)
+    { _STLP_FIX_LITERAL_BUG(__s) return assign(__s, __s + _Traits::length(__s)); }
+
+  _Self& assign(size_type __n, _CharT __c) {
+    _Base::assign(__n, __c);
+    return *this;    
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIter>
+  inline _Self& assign(_InputIter __first, _InputIter __last) {
+      _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
+      __check_range(__first, __last);
+      _Base::assign(__first, __last);
+      return *this;    
+  }
+
+#ifdef _STLP_MSVC
+// partial specialization for assign
+template <>
+inline _Self& assign(iterator __f, iterator __l) {
+  _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+    __check_range(__f, __l);
+  _Base::assign(__f._M_iterator, __l._M_iterator);
+  return *this;
+  }
+#endif
+
+#else
+  _Self& assign(const _CharT* __f, const _CharT* __l) {
+    _STLP_FIX_LITERAL_BUG(__f) _STLP_FIX_LITERAL_BUG(__l)
+      __check_range(__f, __l);
+      _Base::assign(__f, __l);
+    return *this;
+  }
+  _Self& assign(const_iterator __f, const_iterator __l) {
+
+      _Base::assign(__f._M_iterator, __l._M_iterator);
+    return *this;
+  }
+#endif  /* _STLP_MEMBER_TEMPLATES */
+    
+public:                         // Insert
+
+  _Self& insert(size_type __pos, const _Self& __s) {
+    _Base::insert(__pos, __s);
+    return *this;
+  }
+
+  _Self& insert(size_type __pos, const _Self& __s,
+                       size_type __beg, size_type __n) {
+    _Base::insert(__pos, __s, __beg, __n);
+    return *this;
+  }
+
+  _Self& insert(size_type __pos, const _CharT* __s, size_type __n) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    _Base::insert(__pos, __s, __n);
+    return *this;
+  }
+
+  _Self& insert(size_type __pos, const _CharT* __s) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    _Base::insert(__pos, __s);      
+    return *this;
+  }
+    
+  _Self& insert(size_type __pos, size_type __n, _CharT __c) {
+    _Base::insert(__pos, __n, __c);
+    return *this;
+  }
+
+  iterator insert(iterator __p, _CharT __c) {
+    _STLP_FIX_LITERAL_BUG(__p)
+    __check_if_owner(&_M_iter_list,__p);
+    return iterator(&_M_iter_list,_Base::insert(__p._M_iterator, __c));
+  }
+
+  void insert(iterator __p, size_t __n, _CharT __c) {
+    __check_if_owner(&_M_iter_list,__p);
+    _Base::insert(__p._M_iterator, __n, __c);
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIter>
+  void insert(iterator __p, _InputIter __first, _InputIter __last) {
+    __check_if_owner(&_M_iter_list,__p);
+    __check_range(__first,__last);
+    _Base::insert(__p._M_iterator, __first, __last);
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert(iterator __p, const _CharT* __first, const _CharT* __last) {
+    _STLP_FIX_LITERAL_BUG(__first) _STLP_FIX_LITERAL_BUG(__last)
+    __check_if_owner(&_M_iter_list,__p);
+    __check_range(__first,__last);
+    _Base::insert(__p._M_iterator, __first, __last);
+  }
+  void insert(iterator __p, const_iterator __first, const_iterator __last) {
+    __check_range(__first,__last);
+    _Base::insert(__p._M_iterator, __first._M_iterator, __last._M_iterator); 
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // Erase.
+  _Self& erase(size_type __pos = 0, size_type __n = _Base::npos) {
+    _Base::erase(__pos, __n);
+    return *this;
+  }  
+  iterator erase(iterator __position) {
+    __check_if_owner(&_M_iter_list, __position);
+    __invalidate_iterator(&_M_iter_list,end());
+    return iterator(&_M_iter_list, _Base::erase(__position._M_iterator));
+  }
+  iterator erase(iterator __first, iterator __last) {
+    __check_range(__first, __last)&&__check_if_owner(&_M_iter_list,__first);
+    if (__first != __last) {
+      __invalidate_range(&_M_iter_list, __last, end());
+    }
+    return iterator(&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator));   
+  }
+
+public:                         // Substring.
+  _Self substr(size_type __pos = 0, size_type __n = _Base::npos) const {
+    if (__pos > this->size())
+      this->_M_throw_out_of_range();
+    return _Self(this->begin() + __pos, 
+                 this->begin() + __pos + min(__n, this->size() - __pos),
+                 allocator_type());
+  }
+public:                         // Replace.  (Conceptually equivalent
+                                // to erase followed by insert.)
+  _Self& replace(size_type __pos, size_type __n, 
+                        const _Self& __s) {
+    _Base::replace(__pos, __n, __s);
+    return *this;
+  }
+
+  _Self& replace(size_type __pos1, size_type __n1,
+                        const _Self& __s,
+                        size_type __pos2, size_type __n2) {
+    _Base::replace(__pos1, __n1, (const _Base&)__s, __pos2, __n2);
+    return *this;
+  }
+
+  _Self& replace(size_type __pos, size_type __n1,
+                        const _CharT* __s, size_type __n2) {    
+    _STLP_FIX_LITERAL_BUG(__s)
+    _Base::replace(__pos, __n1, __s, __n2);
+    return *this;
+  }
+
+  _Self& replace(size_type __pos, size_type __n1,
+                        const _CharT* __s) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    _Base::replace(__pos, __n1, __s);
+    return *this;
+  }
+
+  _Self& replace(size_type __pos, size_type __n1,
+                        size_type __n2, _CharT __c) {
+    _Base::replace(__pos, __n1, __n2, __c);
+    return *this;
+  }
+
+  _Self& replace(iterator __first, iterator __last, 
+                        const _Self& __s) { 
+    __check_if_owner(&_M_iter_list,__first);
+    __check_range(__first, __last);
+    _Base::replace(__first._M_iterator, __last._M_iterator,__s);
+    return *this;
+  }
+
+  _Self& replace(iterator __first, iterator __last,
+                        const _CharT* __s, size_type __n) { 
+    _STLP_FIX_LITERAL_BUG(__s)
+    __check_if_owner(&_M_iter_list,__first);
+    __check_range(__first, __last);
+    _Base::replace(__first._M_iterator, __last._M_iterator,__s, __n);
+    return *this;
+  }
+
+  _Self& replace(iterator __first, iterator __last,
+                        const _CharT* __s) {
+    _STLP_FIX_LITERAL_BUG(__s)
+    __check_if_owner(&_M_iter_list,__first);
+    __check_range(__first, __last);
+    _Base::replace(__first._M_iterator, __last._M_iterator,__s);
+    return *this;
+  }
+
+  _Self& replace(iterator __first, iterator __last, 
+		 size_type __n, _CharT __c) {
+    __check_if_owner(&_M_iter_list,__first);
+    __check_range(__first, __last);
+    _Base::replace(__first._M_iterator, __last._M_iterator, __n, __c);
+    return *this;
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  template <class _InputIter>
+  _Self& replace(iterator __first, iterator __last,
+                        _InputIter __f, _InputIter __l) {
+    __check_if_owner(&_M_iter_list, __first);
+    __check_range(__first, __last);
+    __check_range(__f, __l);
+    _Base::replace(__first._M_iterator, __last._M_iterator, __f, __l);
+    return *this;    
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  _Self& replace(iterator __first, iterator __last,
+		 const _CharT* __f, const _CharT* __l) {
+    __check_if_owner(&_M_iter_list, __first);
+    __check_range(__first, __last);
+    __check_range(__f, __l);
+    _Base::replace(__first._M_iterator, __last._M_iterator, __f, __l);
+    return *this;    
+  }
+ 
+  _Self& replace(iterator __first, iterator __last,
+		 const_iterator __f, const_iterator __l) {
+    __check_if_owner(&_M_iter_list, __first);
+    __check_range(__first, __last);
+    __check_range(__f, __l);
+    _Base::replace(__first._M_iterator, __last._M_iterator, 
+		   __f._M_iterator, __l._M_iterator);
+    return *this; 
+  } 
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+public:                         // Other modifier member functions.
+
+  void swap(_Self& __s) {
+    _M_iter_list._Swap_owners(__s._M_iter_list);
+    _Base::swap(__s);
+  }
+};
+
+
+// This is a hook to instantiate STLport exports in a designated DLL
+# if defined (_STLP_USE_TEMPLATE_EXPORT)
+_STLP_EXPORT template class _STLP_CLASS_DECLSPEC basic_string<char, char_traits<char>, allocator<char> >;
+#  if defined (_STLP_HAS_WCHAR_T)
+_STLP_EXPORT template class _STLP_CLASS_DECLSPEC basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >;
+#  endif
+# endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+
+// ------------------------------------------------------------
+// Non-member functions.
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y)
+{
+  return basic_string<_CharT,_Traits,_Alloc>(*__s._Get_base() + *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const _CharT* __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return basic_string<_CharT,_Traits,_Alloc>(__s + *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(_CharT __c,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return basic_string<_CharT,_Traits,_Alloc>(__c + *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return basic_string<_CharT,_Traits,_Alloc>(*__x._Get_base()+ __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline basic_string<_CharT,_Traits,_Alloc> _STLP_CALL
+operator+(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT __c) {
+  return basic_string<_CharT,_Traits,_Alloc>(*__x._Get_base() + __c);
+}
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+
+// Operator== and operator!=
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return (*__x._Get_base() == *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator==(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return (__s == *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator==(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return (*__x._Get_base() == __s);
+}
+
+// Operator< (and also >, <=, and >=).
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return (*__x._Get_base() < *__y._Get_base());
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<(const _CharT* __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return (__s < *__y._Get_base());    
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return (*__x._Get_base() < __s);
+}
+
+#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return !(__x == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return __y < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return !(__y < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  return !(__x < __y);
+}
+
+#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator!=(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__s == __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator!=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__x == __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>(const _CharT* __s,
+          const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return __y < __s;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>(const basic_string<_CharT,_Traits,_Alloc>& __x,
+          const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return __s < __x;
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<=(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__y < __s);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator<=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__s < __x);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>=(const _CharT* __s,
+           const basic_string<_CharT,_Traits,_Alloc>& __y) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__s < __y);
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+inline bool _STLP_CALL
+operator>=(const basic_string<_CharT,_Traits,_Alloc>& __x,
+           const _CharT* __s) {
+  _STLP_FIX_LITERAL_BUG(__s)
+  return !(__x < __s);
+}
+#endif /*  if 0 */
+
+// Swap.
+#ifdef _STLP_FUNCTION_TMPL_PARTIAL_ORDER
+template <class _CharT, class _Traits, class _Alloc>
+inline void swap(basic_string<_CharT,_Traits,_Alloc>& __x,
+                 basic_string<_CharT,_Traits,_Alloc>& __y) {
+  __x.swap(__y);
+}
+#endif /* _STLP_FUNCTION_TMPL_PARTIAL_ORDER */
+
+// I/O.  
+
+#ifdef _STLP_EXTRA_OPERATORS_FOR_DEBUG
+#if defined (_STLP_USE_NEW_IOSTREAMS) && ! defined (_STLP_OWN_IOSTREAMS)
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_ostream<_CharT, _Traits>& _STLP_CALL
+operator<<(basic_ostream<_CharT, _Traits>& __os, 
+           const basic_string<_CharT,_Traits,_Alloc>& __s) {
+  return __os << *__s._Get_base();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+basic_istream<_CharT, _Traits>&  _STLP_CALL
+operator>>(basic_istream<_CharT, _Traits>& __is,
+           basic_string<_CharT,_Traits,_Alloc>& __s) {
+    return __is >> *__s._Get_base();
+}
+
+#elif ! defined ( _STLP_USE_NO_IOSTREAMS )
+
+template <class _CharT, class _Traits, class _Alloc>
+ostream& _STLP_CALL operator<<(ostream& __os, 
+                    const basic_string<_CharT,_Traits,_Alloc>& __s) {
+  return __os << *__s._Get_base();
+}
+
+template <class _CharT, class _Traits, class _Alloc>
+istream& _STLP_CALL operator>>(istream& __is, basic_string<_CharT,_Traits,_Alloc>& __s) {
+    return __is >> *__s._Get_base();
+}
+
+#endif /* _STLP_USE_NEW_IOSTREAMS */
+#endif /* if _STLP_EXTRA_OPERATORS_FOR_DEBUG */
+
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_DBG_STRING */
+
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_tree.h b/src/STLport/stl/debug/_tree.h
new file mode 100644
index 0000000..4d2ecc0
--- /dev/null
+++ b/src/STLport/stl/debug/_tree.h
@@ -0,0 +1,249 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_TREE_H
+#define _STLP_INTERNAL_DBG_TREE_H
+
+#include <stl/debug/_iterator.h>
+#include <stl/_function.h>
+#include <stl/_alloc.h>
+
+#  undef _DBG_Rb_tree
+#  define _DBG_Rb_tree _Rb_tree
+
+# define _STLP_DBG_TREE_SUPER __WORKAROUND_DBG_RENAME(Rb_tree) <_Key, _Value, _KeyOfValue, _Compare, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc >
+inline _Value*
+value_type(const  _DBG_iter_base< _STLP_DBG_TREE_SUPER >&) {
+  return (_Value*)0;
+}
+template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc >
+inline bidirectional_iterator_tag
+iterator_category(const  _DBG_iter_base< _STLP_DBG_TREE_SUPER >&) {
+  return bidirectional_iterator_tag();
+}
+# endif
+
+template <class _Key, class _Value, class _KeyOfValue, class _Compare,
+          _STLP_DBG_ALLOCATOR_SELECT(_Value) >
+class _DBG_Rb_tree : public _STLP_DBG_TREE_SUPER {
+  typedef _STLP_DBG_TREE_SUPER _Base;
+  typedef _DBG_Rb_tree<_Key, _Value, _KeyOfValue, _Compare, _Alloc> _Self;
+protected:
+  friend class __owned_link;
+  mutable __owned_list _M_iter_list;
+
+public:
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+    typedef typename _Base::key_type key_type;
+  
+  typedef _DBG_iter<_Base, _Nonconst_traits<value_type> > iterator;
+  typedef _DBG_iter<_Base, _Const_traits<value_type> > const_iterator;
+
+  _STLP_DECLARE_BIDIRECTIONAL_REVERSE_ITERATORS;
+
+protected:
+
+  //typedef typename _Base::key_param_type key_param_type;
+  //typedef typename _Base::val_param_type val_param_type;
+
+  void _Invalidate_all() {_M_iter_list._Invalidate_all();}
+
+  void _Invalidate_iterator(const iterator& __it) { 
+    __invalidate_iterator(&_M_iter_list,__it); 
+  }
+  void _Invalidate_iterators(const iterator& __first, const iterator& __last) {
+    iterator __cur = __first;
+    while (__cur != __last) __invalidate_iterator(&_M_iter_list, __cur++); 
+  }
+
+  const _Base* _Get_base() const { return (const _Base*)this; }
+  _Base* _Get_base() { return (_Base*)this; }
+
+public:
+  _DBG_Rb_tree() : _STLP_DBG_TREE_SUPER(), 
+    _M_iter_list(_Get_base()) {}
+  _DBG_Rb_tree(const _Compare& __comp) : 
+    _STLP_DBG_TREE_SUPER(__comp), _M_iter_list(_Get_base()) {}
+  _DBG_Rb_tree(const _Compare& __comp, const allocator_type& __a): 
+    _STLP_DBG_TREE_SUPER(__comp, __a), _M_iter_list(_Get_base()) {}
+  _DBG_Rb_tree(const _Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>& __x):
+    _STLP_DBG_TREE_SUPER(__x), _M_iter_list(_Get_base()) {}
+  ~_DBG_Rb_tree() { _Invalidate_all(); }
+
+  _Self& operator=(const _Self& __x) {
+    _Invalidate_all();
+    (_Base&)*this = (const _Base&)__x;
+    return *this;
+  }
+  
+  iterator begin() { return iterator(&_M_iter_list,_Base::begin()); }
+  const_iterator begin() const { return const_iterator(&_M_iter_list, _Base::begin()); }
+  iterator end() { return iterator(&_M_iter_list, _Base::end()); }
+  const_iterator end() const { return const_iterator(&_M_iter_list,_Base::end()); }
+
+public:
+  reverse_iterator rbegin() { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const { 
+    return const_reverse_iterator(end()); 
+  }
+  reverse_iterator rend() { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const { 
+    return const_reverse_iterator(begin());
+  }
+  void swap(_Self& __t) {
+    _Base::swap(__t);
+    _M_iter_list._Swap_owners(__t._M_iter_list);
+  }
+    
+public:
+
+  iterator find(const key_type& __x) {
+    return iterator(&_M_iter_list, _Base::find(__x));    
+  }
+  const_iterator find(const key_type& __x) const {
+    return const_iterator(&_M_iter_list, _Base::find(__x));    
+  }
+
+  iterator lower_bound(const key_type& __x) {
+    return iterator(&_M_iter_list, _Base::lower_bound(__x));    
+  }
+  const_iterator lower_bound(const key_type& __x) const {
+    return const_iterator(&_M_iter_list, _Base::lower_bound(__x));    
+  }
+
+  iterator upper_bound(const key_type& __x) {
+    return iterator(&_M_iter_list, _Base::upper_bound(__x));    
+  }
+  const_iterator upper_bound(const key_type& __x) const {
+    return const_iterator(&_M_iter_list, _Base::upper_bound(__x));    
+  }
+
+  pair<iterator,iterator> equal_range(const key_type& __x) {
+    return pair<iterator, iterator>(iterator(&_M_iter_list, _Base::lower_bound(__x)),
+				    iterator(&_M_iter_list, _Base::upper_bound(__x)));
+  }
+  pair<const_iterator, const_iterator> equal_range(const key_type& __x) const {
+    return pair<const_iterator,const_iterator>(const_iterator(&_M_iter_list, _Base::lower_bound(__x)),
+					       const_iterator(&_M_iter_list, _Base::upper_bound(__x)));
+  }
+
+  pair<iterator,bool> insert_unique(const value_type& __x) {
+    _STLP_STD::pair<_STLP_HEADER_TYPENAME _Base::iterator, bool> __res = _Base::insert_unique(__x);
+    return pair<iterator,bool>( iterator(&_M_iter_list, __res.first), __res.second ) ;
+  }
+  iterator insert_equal(const value_type& __x) {
+    return iterator(&_M_iter_list, _Base::insert_equal(__x));
+  }
+
+  iterator insert_unique(iterator __position, const value_type& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    return iterator(&_M_iter_list, _Base::insert_unique(__position._M_iterator, __x));
+  }
+  iterator insert_equal(iterator __position, const value_type& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    return iterator(&_M_iter_list, _Base::insert_equal(__position._M_iterator, __x));
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES  
+  template<class _II>
+  void insert_equal(_II __first, _II __last) {
+    _Base::insert_equal(__first, __last);
+  }
+  template<class _II>
+  void insert_unique(_II __first, _II __last) {
+    _Base::insert_unique(__first, __last);
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert_unique(const_iterator __first, const_iterator __last) {
+    _Base::insert_unique(__first._M_iterator, __last._M_iterator);
+  }
+  void insert_unique(const value_type* __first, const value_type* __last) {
+    _Base::insert_unique(__first, __last);    
+  }
+  void insert_equal(const_iterator __first, const_iterator __last) {
+    _Base::insert_equal(__first._M_iterator, __last._M_iterator);
+  }
+  void insert_equal(const value_type* __first, const value_type* __last) {
+    _Base::insert_equal(__first, __last);
+  }
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void erase(iterator __position) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list,__position))
+    _STLP_DEBUG_CHECK(_Dereferenceable(__position))
+    _Invalidate_iterator(__position);
+    _Base::erase(__position._M_iterator);
+  }
+  size_type erase(const key_type& __x) {
+    pair<iterator,iterator> __p = equal_range(__x);
+    size_type __n = distance(__p.first, __p.second);
+    _Invalidate_iterators(__p.first, __p.second);
+    _Base::erase(__p.first._M_iterator, __p.second._M_iterator);
+	return __n;
+  }
+
+  void erase(iterator __first, iterator __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __first)&&
+		      __check_if_owner(&_M_iter_list, __last))
+    _Invalidate_iterators(__first, __last);
+    _Base::erase(__first._M_iterator, __last._M_iterator);    
+  }
+  void erase(const key_type* __first, const key_type* __last) {
+    while (__first != __last) erase(*__first++);
+  }
+
+  void clear() {
+    _Invalidate_all();
+    _Base::clear();
+  }      
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Key, class _Value, class _KeyOfValue, class _Compare, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_Rb_tree<_Key,_Value,_KeyOfValue,_Compare,_Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_TREE_SUPER
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+         
+_STLP_END_NAMESPACE
+
+# undef  _STLP_DBG_TREE_SUPER
+
+#endif /* _STLP_INTERNAL_DBG_TREE_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/debug/_vector.h b/src/STLport/stl/debug/_vector.h
new file mode 100644
index 0000000..a9a1a0a
--- /dev/null
+++ b/src/STLport/stl/debug/_vector.h
@@ -0,0 +1,300 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_DBG_VECTOR_H
+#define _STLP_INTERNAL_DBG_VECTOR_H
+
+#include <stl/debug/_iterator.h>
+
+# ifndef _STLP_USE_WRAPPER_FOR_ALLOC_PARAM
+#  undef  _DBG_vector
+#  define _DBG_vector vector
+# endif
+
+#  define _STLP_DBG_VECTOR_BASE __WORKAROUND_DBG_RENAME(vector) <_Tp, _Alloc>
+
+_STLP_BEGIN_NAMESPACE
+
+# ifdef _STLP_DEBUG_USE_DISTINCT_VALUE_TYPE_HELPERS
+template <class _Tp, class _Alloc>
+inline _Tp*
+value_type(const  _DBG_iter_base< _STLP_DBG_VECTOR_BASE >&) {
+  return (_Tp*)0;
+}
+template <class _Tp, class _Alloc>
+inline random_access_iterator_tag
+iterator_category(const  _DBG_iter_base< _STLP_DBG_VECTOR_BASE >&) {
+  return random_access_iterator_tag();
+}
+# endif
+
+template <class _Tp, class _NcIt>
+struct _Vector_nonconst_traits
+{
+	typedef _Nonconst_traits<_Tp> _BaseT;
+	typedef _Tp value_type;
+	typedef _Tp& reference;
+	typedef _Tp* pointer;
+	typedef _Vector_nonconst_traits<_Tp, _NcIt> _Non_const_traits;
+};
+
+template <class _Tp, class _NcIt>
+struct _Vector_const_traits
+{
+	typedef _Const_traits<_Tp> _BaseT;
+	typedef _Tp value_type;
+	typedef const _Tp& reference;
+	typedef const _Tp* pointer;
+	typedef _Vector_nonconst_traits<_Tp, _NcIt> _Non_const_traits;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Vector_nonconst_traits<bool, _Bit_iterator>
+{
+	typedef _Bit_iterator::value_type value_type;
+	typedef _Bit_iterator::reference reference;
+	typedef _Bit_iterator::pointer pointer;
+	typedef _Vector_nonconst_traits<bool, _Bit_iterator> _Non_const_traits;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Vector_const_traits<bool, _Bit_iterator>
+{
+	typedef _Bit_const_iterator::value_type value_type;
+	typedef _Bit_const_iterator::reference reference;
+	typedef _Bit_const_iterator::pointer pointer;
+	typedef _Vector_nonconst_traits<bool, _Bit_iterator> _Non_const_traits;
+};
+
+template <class _Tp, _STLP_DBG_ALLOCATOR_SELECT(_Tp) >
+class _DBG_vector : public  _STLP_DBG_VECTOR_BASE {
+private:
+  typedef _STLP_DBG_VECTOR_BASE _Base;
+  typedef _DBG_vector<_Tp, _Alloc> _Self;
+  mutable __owned_list _M_iter_list;
+
+public:
+
+  __IMPORT_CONTAINER_TYPEDEFS(_Base)
+
+  typedef _DBG_iter<_Base,
+      _Vector_nonconst_traits<value_type, typename _Base::iterator> > iterator;
+    
+  typedef _DBG_iter<_Base,
+      _Vector_const_traits<value_type, typename _Base::iterator> > const_iterator;
+
+  _STLP_DECLARE_RANDOM_ACCESS_REVERSE_ITERATORS;
+
+  iterator begin() { return iterator(&_M_iter_list, this->_M_start); }
+  const_iterator begin() const { return const_iterator(&_M_iter_list, this->_M_start); }
+  iterator end() { return iterator(&_M_iter_list, this->_M_finish); }
+  const_iterator end() const { return const_iterator(&_M_iter_list, this->_M_finish); }
+
+  reverse_iterator rbegin()
+    { return reverse_iterator(end()); }
+  const_reverse_iterator rbegin() const
+    { return const_reverse_iterator(end()); }
+  reverse_iterator rend()
+    { return reverse_iterator(begin()); }
+  const_reverse_iterator rend() const
+    { return const_reverse_iterator(begin()); }
+
+  reference operator[](size_type __n) {
+    _STLP_VERBOSE_ASSERT(__n < _Base::size(), _StlMsg_OUT_OF_BOUNDS)
+    return _Base::operator[](__n);
+  }
+
+  const_reference operator[](size_type __n) const {
+    _STLP_VERBOSE_ASSERT(__n < _Base::size(), _StlMsg_OUT_OF_BOUNDS)
+    return _Base::operator[](__n);
+  }
+
+  _Base* _Get_base() { return (_Base*)this; }
+  const _Base* _Get_base() const { return (const _Base*)this; }
+
+  explicit _DBG_vector(const allocator_type& __a = allocator_type())
+    : _STLP_DBG_VECTOR_BASE(__a), _M_iter_list((const _Base*)this)  {}
+
+  _DBG_vector(size_type __n, const _Tp& __value,
+         const allocator_type& __a = allocator_type()) 
+    : _STLP_DBG_VECTOR_BASE(__n, __value, __a), _M_iter_list((const _Base*)this) {}
+
+  explicit _DBG_vector(size_type __n)
+    : _STLP_DBG_VECTOR_BASE(__n), _M_iter_list((const _Base*)this) {}
+
+
+  _DBG_vector(const _Self& __x) 
+    : _STLP_DBG_VECTOR_BASE(__x), _M_iter_list((const _Base*)this) {}
+
+#if defined (_STLP_MEMBER_TEMPLATES)
+# ifdef _STLP_NEEDS_EXTRA_TEMPLATE_CONSTRUCTORS
+  template <class _InputIterator>
+  _DBG_vector(_InputIterator __first, _InputIterator __last):
+    _STLP_DBG_VECTOR_BASE(__first, __last), _M_iter_list((const _Base*)this) {}
+# endif
+  template <class _InputIterator>
+  _DBG_vector(_InputIterator __first, _InputIterator __last,
+         const allocator_type& __a _STLP_ALLOCATOR_TYPE_DFL) :
+    _STLP_DBG_VECTOR_BASE(__first, __last, __a), _M_iter_list((const _Base*)this) {}
+
+#else
+  _DBG_vector(const _Tp* __first, const _Tp* __last,
+         const allocator_type& __a = allocator_type())
+    : _STLP_DBG_VECTOR_BASE(__first, __last, __a), _M_iter_list((const _Base*)this) {}
+
+  // mysterious VC++ bug ?
+  _DBG_vector(const_iterator __first, const_iterator __last , 
+	      const allocator_type& __a = allocator_type())
+    : _STLP_DBG_VECTOR_BASE(__first._M_iterator, __last._M_iterator, __a),
+      _M_iter_list((const _Base*)this) { }
+
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  _Self& operator=(const _Self& __x) {
+    _M_iter_list._Invalidate_all();
+    (_Base&)*this = (const _Base&)__x;
+    return *this;
+  }
+
+  reference front() { return *begin(); }
+  const_reference front() const { return *begin(); }
+
+  reference back() {
+    iterator __tmp = end();
+    --__tmp;
+    return *__tmp;
+  }
+  const_reference back() const {
+    const_iterator __tmp = end();
+    --__tmp;
+    return *__tmp;
+  }
+
+  void swap(_Self& __x) {
+    _M_iter_list._Swap_owners(__x._M_iter_list);
+    _Base::swap((_Base&)__x);
+  }
+
+  iterator insert(iterator __position, const _Tp& __x) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    if (this->size()+1 > this->capacity()) _M_iter_list._Invalidate_all();  
+    return iterator(&_M_iter_list, _Base::insert(__position._M_iterator, __x));
+  }
+
+  iterator insert(iterator __position) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    if (this->size()+1 > this->capacity()) _M_iter_list._Invalidate_all();  
+    return iterator(&_M_iter_list, _Base::insert(__position._M_iterator));    
+  }
+
+#ifdef _STLP_MEMBER_TEMPLATES
+  // Check whether it's an integral type.  If so, it's not an iterator.
+  template <class _InputIterator>
+  void insert(iterator __position, _InputIterator __first, _InputIterator __last) {
+    _STLP_DEBUG_CHECK(__check_range(__first,__last))
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    size_type __n = distance(__first, __last);
+    if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();  
+    _Base::insert(__position._M_iterator, __first, __last);    
+  }
+#else /* _STLP_MEMBER_TEMPLATES */
+  void insert(iterator __position,
+              const_iterator __first, const_iterator __last) {
+    _STLP_DEBUG_CHECK(__check_range(__first,__last))
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    size_type __n = distance(__first, __last);
+    if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();  
+    _Base::insert(__position._M_iterator,
+		  __first._M_iterator, __last._M_iterator);        
+  }
+
+  void insert (iterator __position, const_pointer __first, const_pointer __last) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    _STLP_DEBUG_CHECK(__check_range(__first,__last))
+    size_type __n = distance(__first, __last);
+    if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();  
+    _Base::insert(__position._M_iterator, __first, __last);  
+}
+#endif /* _STLP_MEMBER_TEMPLATES */
+
+  void insert (iterator __position, size_type __n, const _Tp& __x){
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    if (this->size()+__n > this->capacity()) _M_iter_list._Invalidate_all();  
+    _Base::insert(__position._M_iterator, __n, __x);
+  }
+  
+  void pop_back() {
+    _STLP_VERBOSE_ASSERT(!this->empty(), _StlMsg_EMPTY_CONTAINER)
+    __invalidate_iterator(&_M_iter_list,end());
+    _Base::pop_back();
+  }
+  iterator erase(iterator __position) {
+    _STLP_DEBUG_CHECK(__check_if_owner(&_M_iter_list, __position))
+    _STLP_VERBOSE_ASSERT(__position._M_iterator !=this->_M_finish,_StlMsg_ERASE_PAST_THE_END)
+    __invalidate_range(&_M_iter_list, __position+1, end());
+    return iterator(&_M_iter_list,_Base::erase(__position._M_iterator));
+  }
+  iterator erase(iterator __first, iterator __last) {
+    _STLP_DEBUG_CHECK(__check_range(__first,__last, begin(), end()))
+    __invalidate_range(&_M_iter_list, __first._M_iterator == this->_M_finish ? 
+		       __first : __first+1, end());
+    return iterator(&_M_iter_list, _Base::erase(__first._M_iterator, __last._M_iterator));
+  }
+  void clear() { 
+    _M_iter_list._Invalidate_all();
+    _Base::clear();
+  }
+  void push_back(const _Tp& __x) {
+    if (this->size()+1 > this->capacity()) _M_iter_list._Invalidate_all();
+    _Base::push_back(__x);
+  }
+};
+
+#define _STLP_TEMPLATE_HEADER template <class _Tp, class _Alloc>
+#define _STLP_TEMPLATE_CONTAINER _DBG_vector<_Tp, _Alloc>
+#define _STLP_TEMPLATE_CONTAINER_BASE _STLP_DBG_VECTOR_BASE
+#include <stl/debug/_relops_cont.h>
+#undef _STLP_TEMPLATE_CONTAINER_BASE
+#undef _STLP_TEMPLATE_CONTAINER
+#undef _STLP_TEMPLATE_HEADER
+
+# if defined (_STLP_USE_TEMPLATE_EXPORT) 
+ _STLP_EXPORT_TEMPLATE_CLASS _DBG_vector <void*,allocator<void*> >;
+#  endif /* _STLP_USE_TEMPLATE_EXPORT */
+
+_STLP_END_NAMESPACE
+
+# undef _STLP_DBG_VECTOR_BASE
+# undef _DBG_vector
+
+#endif /* _STLP_DBG_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/msl_string.h b/src/STLport/stl/msl_string.h
new file mode 100644
index 0000000..0e57377
--- /dev/null
+++ b/src/STLport/stl/msl_string.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1998
+ * Mark of the Unicorn, Inc.
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation.  Mark of the Unicorn, Inc. makes no
+ * representations about the suitability of this software for any
+ * purpose.  It is provided "as is" without express or implied warranty.
+ *
+ */
+#if defined( _STLP_USE_MSIPL ) && !defined( _STLP_MSL_STRING_H_ )
+#define _STLP_MSL_STRING_H_
+
+//# define char_traits __msl_char_traits
+# define basic_string __msl_basic_string
+# define b_str_ref __msl_b_str_ref
+# define basic_istream __msl_basic_istream
+# define basic_ostream __msl_basic_ostream
+# define string __msl_string
+# define wstring __msl_wstring
+# define iterator_traits __msl_iterator_traits
+
+namespace std
+{
+	template<class charT, class traits> class basic_istream;
+	template<class charT, class traits> class basic_ostream;
+}
+
+# include _STLP_NATIVE_HEADER(string)
+// # undef char_traits
+# undef basic_string
+# undef b_str_ref
+# undef basic_istream
+# undef basic_ostream
+# undef string
+# undef wstring
+# undef iterator_traits
+
+#endif
diff --git a/src/STLport/stl/type_traits.h b/src/STLport/stl/type_traits.h
new file mode 100644
index 0000000..240f7b2
--- /dev/null
+++ b/src/STLport/stl/type_traits.h
@@ -0,0 +1,418 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TYPE_TRAITS_H
+#define _STLP_TYPE_TRAITS_H
+
+/*
+This header file provides a framework for allowing compile time dispatch
+based on type attributes. This is useful when writing template code.
+For example, when making a copy of an array of an unknown type, it helps
+to know if the type has a trivial copy constructor or not, to help decide
+if a memcpy can be used.
+
+The class template __type_traits provides a series of typedefs each of
+which is either __true_type or __false_type. The argument to
+__type_traits can be any type. The typedefs within this template will
+attain their correct values by one of these means:
+    1. The general instantiation contain conservative values which work
+       for all types.
+    2. Specializations may be declared to make distinctions between types.
+    3. Some compilers (such as the Silicon Graphics N32 and N64 compilers)
+       will automatically provide the appropriate specializations for all
+       types.
+
+EXAMPLE:
+
+//Copy an array of elements which have non-trivial copy constructors
+template <class T> void copy(T* source, T* destination, int n, __false_type);
+//Copy an array of elements which have trivial copy constructors. Use memcpy.
+template <class T> void copy(T* source, T* destination, int n, __true_type);
+
+//Copy an array of any type by using the most efficient copy mechanism
+template <class T> inline void copy(T* source,T* destination,int n) {
+   copy(source, destination, n,
+        typename __type_traits<T>::has_trivial_copy_constructor());
+}
+*/
+
+#ifdef __WATCOMC__
+# include <stl/_cwchar.h>
+#endif
+
+_STLP_BEGIN_NAMESPACE
+
+struct __true_type {};
+struct __false_type {};
+
+
+template <int _Is> struct __bool2type {
+  typedef __false_type _Ret; 
+};
+
+_STLP_TEMPLATE_NULL
+struct __bool2type<1> { typedef __true_type _Ret; };
+
+_STLP_TEMPLATE_NULL
+struct __bool2type<0> { typedef __false_type _Ret; };
+
+// logical end of 3 predicated
+template <class _P1, class _P2, class _P3>
+struct _Land3 {
+  typedef __false_type _Ret;
+};
+
+_STLP_TEMPLATE_NULL
+struct _Land3<__true_type, __true_type, __true_type> {
+  typedef __true_type _Ret;
+};
+
+
+// Forward declarations.
+template <class _Tp> struct __type_traits; 
+template <int _IsPOD> struct __type_traits_aux {
+   typedef __false_type    has_trivial_default_constructor;
+   typedef __false_type    has_trivial_copy_constructor;
+   typedef __false_type    has_trivial_assignment_operator;
+   typedef __false_type    has_trivial_destructor;
+   typedef __false_type    is_POD_type;
+};
+
+_STLP_TEMPLATE_NULL
+struct __type_traits_aux<0> {
+   typedef __false_type    has_trivial_default_constructor;
+   typedef __false_type    has_trivial_copy_constructor;
+   typedef __false_type    has_trivial_assignment_operator;
+   typedef __false_type    has_trivial_destructor;
+   typedef __false_type    is_POD_type;
+};
+
+_STLP_TEMPLATE_NULL
+struct __type_traits_aux<1> { 
+   typedef __true_type    has_trivial_default_constructor;
+   typedef __true_type    has_trivial_copy_constructor;
+   typedef __true_type    has_trivial_assignment_operator;
+   typedef __true_type    has_trivial_destructor;
+   typedef __true_type    is_POD_type;
+};
+
+# ifdef _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS
+
+// Boris : simulation technique is used here according to Adobe Open Source License Version 1.0.
+// Copyright 2000 Adobe Systems Incorporated and others. All rights reserved.
+// Authors: Mat Marcus and Jesse Jones
+// The original version of this source code may be found at
+// http://opensource.adobe.com.
+
+struct _PointerShim {
+  // Since the compiler only allows at most one non-trivial
+  // implicit conversion we can make use of a shim class to
+  // be sure that IsPtr below doesn't accept classes with
+  // implicit pointer conversion operators
+  _PointerShim(const volatile void*); // no implementation
+};
+
+// These are the discriminating functions
+
+char _STLP_CALL _IsP(bool, _PointerShim); // no implementation is required
+char* _STLP_CALL _IsP(bool, ...);          // no implementation is required
+
+template <class _Tp>
+char _STLP_CALL _IsSameFun(bool, _Tp*, _Tp*); // no implementation is required
+char* _STLP_CALL _IsSameFun(bool, ...);          // no implementation is required
+
+template <class _Tp1, class _Tp2>
+struct _IsSame {
+  // boris : check!
+  static _Tp1* __null_rep1();
+  static _Tp2* __null_rep2();
+  enum { _Ret = (sizeof(_IsSameFun(false,__null_rep1(),__null_rep2())) == sizeof(char)) };
+};
+
+template <class _Tp>
+struct _IsPtr {
+  
+  // This template meta function takes a type T
+  // and returns true exactly when T is a pointer.
+  // One can imagine meta-functions discriminating on
+  // other criteria.
+  static _Tp& __null_rep();
+  enum { _Ret = (sizeof(_IsP(false,__null_rep())) == sizeof(char)) };
+
+};
+
+template <class _Tp>
+struct _IsPtrType {
+  enum { _Is =  _IsPtr<_Tp>::_Ret } ;
+  typedef __bool2type< _Is > _BT;
+  typedef typename _BT::_Ret _Type;
+  static _Type _Ret() { return _Type(); }
+};
+
+template <class _Tp1, class _Tp2>
+struct _BothPtrType {
+  typedef __bool2type< _IsPtr<_Tp1>::_Ret> _B1;
+  typedef __bool2type< _IsPtr<_Tp2>::_Ret> _B2;
+  typedef typename _B1::_Ret _Type1;
+  typedef typename _B2::_Ret _Type2;
+  typedef typename _Land3<_Type1, _Type2, __true_type>::_Ret _Type;
+  static _Type _Ret() { return _Type(); }
+};
+
+// we make general case dependant on the fact the type is actually a pointer.
+ 
+template <class _Tp>
+struct __type_traits : __type_traits_aux<_IsPtr<_Tp>::_Ret> {};
+
+# else
+
+template <class _Tp>
+struct __type_traits { 
+   typedef __true_type     this_dummy_member_must_be_first;
+                   /* Do not remove this member. It informs a compiler which
+                      automatically specializes __type_traits that this
+                      __type_traits template is special. It just makes sure that
+                      things work if an implementation is using a template
+                      called __type_traits for something unrelated. */
+
+   /* The following restrictions should be observed for the sake of
+      compilers which automatically produce type specific specializations 
+      of this class:
+          - You may reorder the members below if you wish
+          - You may remove any of the members below if you wish
+          - You must not rename members without making the corresponding
+            name change in the compiler
+          - Members you add will be treated like regular members unless
+            you add the appropriate support in the compiler. */
+   typedef __false_type    has_trivial_default_constructor;
+   typedef __false_type    has_trivial_copy_constructor;
+   typedef __false_type    has_trivial_assignment_operator;
+   typedef __false_type    has_trivial_destructor;
+   typedef __false_type    is_POD_type;
+};
+
+
+template <class _Tp>  struct _IsPtr { enum { _Ret = 0 }; };
+template <class _Tp>  struct _IsPtrType { 
+  static __false_type _Ret() { return __false_type();} 
+};
+template <class _Tp1, class _Tp2>  struct _BothPtrType { 
+  static __false_type _Ret() { return __false_type();} 
+};
+
+template <class _Tp1, class _Tp2>
+struct _IsSame { enum { _Ret = 0 }; };
+
+// template <class _Tp1, class _Tp2>
+// struct _IsSameType {   static __false_type _Ret() { return __false_type(); }  };
+
+#  ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+template <class _Tp>  struct _IsPtr<_Tp*> { enum { _Ret = 1 }; };
+template <class _Tp>  struct _IsPtrType<_Tp*> { 
+  static __true_type _Ret() { return __true_type();} 
+};
+template <class _Tp1, class _Tp2>  struct _BothPtrType<_Tp1*, _Tp2*> { 
+  static __true_type _Ret() { return __true_type();} 
+};
+template <class _Tp>
+struct _IsSame<_Tp, _Tp> { enum { _Ret = 1 }; };
+#  endif
+
+# endif /* _STLP_SIMULATE_PARTIAL_SPEC_FOR_TYPE_TRAITS */
+
+// Provide some specializations.  This is harmless for compilers that
+//  have built-in __types_traits support, and essential for compilers
+//  that don't.
+#ifndef _STLP_NO_BOOL
+_STLP_TEMPLATE_NULL struct __type_traits<bool> : __type_traits_aux<1> {};
+#endif /* _STLP_NO_BOOL */
+_STLP_TEMPLATE_NULL struct __type_traits<char> : __type_traits_aux<1> {};
+#ifndef _STLP_NO_SIGNED_BUILTINS
+_STLP_TEMPLATE_NULL struct __type_traits<signed char> : __type_traits_aux<1> {};
+# endif
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned char> : __type_traits_aux<1> {};
+#if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT)
+_STLP_TEMPLATE_NULL struct __type_traits<wchar_t> : __type_traits_aux<1> {};
+#endif /* _STLP_HAS_WCHAR_T */
+
+_STLP_TEMPLATE_NULL struct __type_traits<short> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned short> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<int> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned int> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<long> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned long> : __type_traits_aux<1> {};
+
+#ifdef _STLP_LONG_LONG
+_STLP_TEMPLATE_NULL struct __type_traits<_STLP_LONG_LONG> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<unsigned _STLP_LONG_LONG> : __type_traits_aux<1> {};
+#endif /* _STLP_LONG_LONG */
+
+_STLP_TEMPLATE_NULL struct __type_traits<float> : __type_traits_aux<1> {};
+_STLP_TEMPLATE_NULL struct __type_traits<double> : __type_traits_aux<1> {};
+
+# if !defined ( _STLP_NO_LONG_DOUBLE )
+_STLP_TEMPLATE_NULL struct __type_traits<long double> : __type_traits_aux<1> {};
+# endif
+
+#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+template <class _Tp> struct __type_traits<_Tp*> : __type_traits_aux<1> {};
+#endif
+
+// The following could be written in terms of numeric_limits.  
+// We're doing it separately to reduce the number of dependencies.
+
+template <class _Tp> struct _Is_integer {
+  typedef __false_type _Integral;
+};
+
+#ifndef _STLP_NO_BOOL
+
+_STLP_TEMPLATE_NULL struct _Is_integer<bool> {
+  typedef __true_type _Integral;
+};
+
+#endif /* _STLP_NO_BOOL */
+
+_STLP_TEMPLATE_NULL struct _Is_integer<char> {
+  typedef __true_type _Integral;
+};
+
+#ifndef _STLP_NO_SIGNED_BUILTINS
+
+_STLP_TEMPLATE_NULL struct _Is_integer<signed char> {
+  typedef __true_type _Integral;
+};
+#endif
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned char> {
+  typedef __true_type _Integral;
+};
+
+#if defined ( _STLP_HAS_WCHAR_T ) && ! defined (_STLP_WCHAR_T_IS_USHORT)
+
+_STLP_TEMPLATE_NULL struct _Is_integer<wchar_t> {
+  typedef __true_type _Integral;
+};
+
+#endif /* _STLP_HAS_WCHAR_T */
+
+_STLP_TEMPLATE_NULL struct _Is_integer<short> {
+  typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned short> {
+  typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<int> {
+  typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned int> {
+  typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<long> {
+  typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned long> {
+  typedef __true_type _Integral;
+};
+
+#ifdef _STLP_LONG_LONG
+
+_STLP_TEMPLATE_NULL struct _Is_integer<_STLP_LONG_LONG> {
+  typedef __true_type _Integral;
+};
+
+_STLP_TEMPLATE_NULL struct _Is_integer<unsigned _STLP_LONG_LONG> {
+  typedef __true_type _Integral;
+};
+
+#endif /* _STLP_LONG_LONG */
+
+template <class _Tp1, class _Tp2>
+struct _OKToMemCpy {
+  enum { _Same = _IsSame<_Tp1,_Tp2>::_Ret } ;
+  typedef typename __type_traits<_Tp1>::has_trivial_assignment_operator _Tr1;
+  typedef typename __type_traits<_Tp2>::has_trivial_assignment_operator _Tr2;
+  typedef typename __bool2type< _Same >::_Ret _Tr3;
+  typedef typename _Land3<_Tr1, _Tr2, _Tr3>::_Ret _Type;
+  static _Type _Ret() { return _Type(); }
+};
+
+template <class _Tp1, class _Tp2>
+inline _OKToMemCpy<_Tp1, _Tp2> _IsOKToMemCpy(_Tp1*, _Tp2*)  {
+  return _OKToMemCpy<_Tp1, _Tp2>();
+}
+
+template <class _Tp> 
+struct _IsPOD {
+  typedef typename __type_traits<_Tp>::is_POD_type _Type;
+  static _Type _Ret() { return _Type(); }
+};
+
+template <class _Tp> 
+inline _IsPOD<_Tp>  _Is_POD (_Tp*) { return _IsPOD<_Tp>(); } 
+
+#  ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
+#   if defined (__BORLANDC__) || defined (__SUNPRO_CC) || ( defined (__MWERKS__) && (__MWERKS__ <= 0x2303)) || ( defined (__sgi) && defined (_COMPILER_VERSION)) || defined (__DMC__)
+#   define _IS_POD_ITER(_It, _Tp) __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type()
+#   else
+#   define _IS_POD_ITER(_It, _Tp) typename __type_traits< typename iterator_traits< _Tp >::value_type >::is_POD_type()
+#   endif
+#  else
+#   define _IS_POD_ITER(_It, _Tp) _Is_POD( _STLP_VALUE_TYPE( _It, _Tp ) )._Ret()
+#  endif
+
+# ifdef _STLP_DEFAULT_CONSTRUCTOR_BUG
+// Those adaptors are here to fix common compiler bug regarding builtins:
+// expressions like int k = int() should initialize k to 0
+template <class _Tp>
+inline _Tp __default_constructed_aux(_Tp*, const __false_type&) {
+  return _Tp();
+}
+template <class _Tp>
+inline _Tp __default_constructed_aux(_Tp*, const __true_type&) {
+  return _Tp(0);
+}
+
+template <class _Tp>
+inline _Tp __default_constructed(_Tp* __p) {
+  typedef typename _Is_integer<_Tp>::_Integral _Is_Integral;
+  return __default_constructed_aux(__p, _Is_Integral());
+}
+
+#  define _STLP_DEFAULT_CONSTRUCTED(_TTp) __default_constructed((_TTp*)0)
+# else
+#  define _STLP_DEFAULT_CONSTRUCTED(_TTp) _TTp()
+# endif
+
+_STLP_END_NAMESPACE
+
+#endif /* __TYPE_TRAITS_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/stl/wrappers/_deque.h b/src/STLport/stl/wrappers/_deque.h
new file mode 100644
index 0000000..0a79713
--- /dev/null
+++ b/src/STLport/stl/wrappers/_deque.h
@@ -0,0 +1,76 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_INTERNAL_DEQUE_H
+# include <stl/_deque.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+#  define _DEQUE_SUPER_NAME _DBG_deque
+# else
+#  define _DEQUE_SUPER_NAME __deque__
+# endif
+
+# define _DEQUE_SUPER   _DEQUE_SUPER_NAME<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+
+_STLP_BEGIN_NAMESPACE
+
+// provide a "default" deque adaptor
+template <class _Tp>
+class deque : public _DEQUE_SUPER {
+public:
+  typedef deque<_Tp> _Self;
+  typedef _DEQUE_SUPER _Super;
+  __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    __IMPORT_SUPER_COPY_ASSIGNMENT(deque, _Self, _DEQUE_SUPER)
+    deque() : _DEQUE_SUPER() { }
+  deque(size_type __n, const _Tp& __value) : _DEQUE_SUPER(__n, __value) { }
+  explicit deque(size_type __n) : _DEQUE_SUPER(__n) { }
+  deque(const _Tp* __first, const _Tp* __last) : _DEQUE_SUPER(__first, __last) { }
+  deque(const_iterator __first, const_iterator __last) : _DEQUE_SUPER(__first, __last) { }
+  ~deque() { }
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool 
+operator==(const deque<_Tp>& __x, const deque<_Tp>& __y) {
+    return __x.size() == __y.size() && equal(__x.begin(), __x.end(), __y.begin());
+}
+
+template <class _Tp>
+inline bool 
+operator<(const deque<_Tp>& __x, const deque<_Tp>& __y) {
+    return lexicographical_compare(__x.begin(), __x.end(), __y.begin(), __y.end());
+}
+#  endif /* BASE_MATCH_BUG */
+
+# undef _DEQUE_SUPER
+
+_STLP_END_NAMESPACE  
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_hash_map.h b/src/STLport/stl/wrappers/_hash_map.h
new file mode 100644
index 0000000..952f3e5
--- /dev/null
+++ b/src/STLport/stl/wrappers/_hash_map.h
@@ -0,0 +1,147 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_HASH_MAP_H
+#define _STLP_INTERNAL_WRAP_HASH_MAP_H
+
+#ifndef _STLP_INTERNAL_HASH_MAP_H
+# include <stl/_hash_map.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+// provide a "default" hash_map adaptor
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+#   define __HM_TEMPLATE_HEADER  template <class _Key, class _Tp>
+#   define __HM_ARGUMENTS        _Key, _Tp
+#   define __HM_BASE_ARGUMENTS   _Key, _Tp, hash<_Key>, equal_to<_Key>, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp)
+#  else
+#   define __HM_TEMPLATE_HEADER  template <class _Key, class _Tp, class _HashFcn, class _EqualKey >
+#   define __HM_ARGUMENTS        _Key, _Tp, _HashFcn, _EqualKey
+#   define __HM_BASE_ARGUMENTS   _Key, _Tp, _HashFcn, _EqualKey, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp)
+#  endif
+
+
+# define __HM_SUPER  __hash_map< __HM_BASE_ARGUMENTS >
+# define __HMM_SUPER __hash_multimap< __HM_BASE_ARGUMENTS >
+
+__HM_TEMPLATE_HEADER
+class hash_map : public __HM_SUPER
+{
+  typedef hash_map< __HM_ARGUMENTS > _Self;
+public:
+  typedef __HM_SUPER _Super;
+  __IMPORT_WITH_ITERATORS(_Super)
+  typedef typename _Super::key_type key_type;
+  typedef typename _Super::hasher hasher;
+  typedef typename _Super::key_equal key_equal;
+  typedef _Tp data_type;
+  hash_map() {}
+  hash_map(size_type __n) : __HM_SUPER(__n) {}
+  hash_map(size_type __n, const hasher& __hf) : __HM_SUPER(__n, __hf) {}
+  hash_map(size_type __n, const hasher& __hf, const key_equal& __eql): __HM_SUPER(__n, __hf, __eql) {}
+  hash_map(const value_type* __f, const value_type* __l) : __HM_SUPER(__f,__l) {}
+  hash_map(const value_type* __f, const value_type* __l, size_type __n): __HM_SUPER(__f,__l,__n) {}
+  hash_map(const value_type* __f, const value_type* __l, size_type __n, 
+           const hasher& __hf) : __HM_SUPER(__f,__l,__n,__hf) {}
+  hash_map(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql) : __HM_SUPER(__f,__l,__n,__hf, __eql) {}
+  hash_map(const_iterator __f, const_iterator __l) : __HM_SUPER(__f,__l) { }
+  hash_map(const_iterator __f, const_iterator __l, size_type __n) : __HM_SUPER(__f,__l,__n) { }
+  hash_map(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf) : __HM_SUPER(__f, __l, __n, __hf) { }
+  hash_map(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql) : __HM_SUPER(__f, __l, __n, __hf, __eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+  friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& __hm1, const _Self& __hm2);
+# endif
+};
+
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HM_TEMPLATE_HEADER
+inline bool operator==(const hash_map< __HM_ARGUMENTS >& __hm1, 
+                       const hash_map< __HM_ARGUMENTS >& __hm2)
+{
+    typedef __HM_SUPER _Super;
+    return (const _Super&)__hm1 == (const _Super&)__hm2; 
+}
+# endif
+
+// provide a "default" hash_multimap adaptor
+__HM_TEMPLATE_HEADER
+class hash_multimap : public __HMM_SUPER
+{
+  typedef hash_multimap< __HM_ARGUMENTS > _Self;
+public:
+  typedef __HMM_SUPER _Super;
+  __IMPORT_WITH_ITERATORS(_Super)
+  typedef typename _Super::key_type key_type;
+  typedef typename _Super::hasher hasher;
+  typedef typename _Super::key_equal key_equal;
+  typedef _Tp data_type;
+  hash_multimap() {}
+  hash_multimap(size_type __n) : __HMM_SUPER(__n) {}
+  hash_multimap(size_type __n, const hasher& __hf) : __HMM_SUPER(__n, __hf) {}
+  hash_multimap(size_type __n, const hasher& __hf, const key_equal& __eql): __HMM_SUPER(__n, __hf, __eql) {}
+  hash_multimap(const value_type* __f, const value_type* __l) : __HMM_SUPER(__f,__l) {}
+  hash_multimap(const value_type* __f, const value_type* __l, size_type __n): __HMM_SUPER(__f,__l,__n) {}
+  hash_multimap(const value_type* __f, const value_type* __l, size_type __n, 
+           const hasher& __hf) : __HMM_SUPER(__f,__l,__n,__hf) {}
+  hash_multimap(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql) : __HMM_SUPER(__f,__l,__n,__hf, __eql) {}
+
+  hash_multimap(const_iterator __f, const_iterator __l) : __HMM_SUPER(__f,__l) { }
+  hash_multimap(const_iterator __f, const_iterator __l, size_type __n) : __HMM_SUPER(__f,__l,__n) { }
+  hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf) : __HMM_SUPER(__f, __l, __n, __hf) { }
+  hash_multimap(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql) : __HMM_SUPER(__f, __l, __n, __hf, __eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+  friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& __hm1, const _Self& __hm2);
+# endif
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HM_TEMPLATE_HEADER
+inline bool operator==(const hash_multimap< __HM_ARGUMENTS >& __hm1, 
+                       const hash_multimap< __HM_ARGUMENTS >& __hm2)
+{
+    typedef __HMM_SUPER _Super;
+    return (const _Super&)__hm1 == (const _Super&)__hm2; 
+}
+# endif
+
+# undef __HM_SUPER
+# undef __HMM_SUPER
+# undef __HM_TEMPLATE_HEADER
+# undef __HM_ARGUMENTS
+# undef __HM_BASE_ARGUMENTS
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_hash_set.h b/src/STLport/stl/wrappers/_hash_set.h
new file mode 100644
index 0000000..e5af83c
--- /dev/null
+++ b/src/STLport/stl/wrappers/_hash_set.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_HASH_SET_H
+#define _STLP_INTERNAL_WRAP_HASH_SET_H
+
+#ifndef _STLP_INTERNAL_HASH_SET_H
+# include <stl/_hash_set.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+#   define __HS_TEMPLATE_HEADER  template <class _Value>
+#   define __HS_ARGUMENTS        _Value
+#   define __HS_BASE_ARGUMENTS   _Value, hash<_Value>, equal_to<_Value>, _STLP_DEFAULT_ALLOCATOR(_Value)
+#  else
+#   define __HS_TEMPLATE_HEADER  template <class _Value, class _HashFcn, class _EqualKey >
+#   define __HS_ARGUMENTS        _Value, _HashFcn, _EqualKey
+#   define __HS_BASE_ARGUMENTS   _Value, _HashFcn, _EqualKey, _STLP_DEFAULT_ALLOCATOR(_Value)
+#  endif
+
+
+#  define __HS_SUPER  __hash_set< __HS_BASE_ARGUMENTS >
+#  define __HMS_SUPER __hash_multiset< __HS_BASE_ARGUMENTS >
+
+
+// provide a "default" hash_set adaptor
+__HS_TEMPLATE_HEADER
+class hash_set : public __HS_SUPER 
+{
+  typedef hash_set< __HS_ARGUMENTS > _Self;
+public:
+  typedef  __HS_SUPER _Super;
+  __IMPORT_WITH_ITERATORS(_Super)
+  typedef typename _Super::key_type key_type;
+  typedef typename _Super::hasher hasher;
+  typedef typename _Super::key_equal key_equal;
+  hash_set() {}
+  hash_set(size_type n) : __HS_SUPER(n) {}
+  hash_set(size_type n, const hasher& hf) : __HS_SUPER(n, hf) {}
+  hash_set(size_type n, const hasher& hf, const key_equal& eql): __HS_SUPER(n, hf, eql) {}
+
+  hash_set(const value_type* f, const value_type* l) : __HS_SUPER(f,l) {}
+  hash_set(const value_type* f, const value_type* l, size_type n): __HS_SUPER(f,l,n) {}
+  hash_set(const value_type* f, const value_type* l, size_type n,
+           const hasher& hf) : __HS_SUPER(f,l,n,hf) {}
+  hash_set(const value_type* f, const value_type* l, size_type n,
+           const hasher& hf, const key_equal& eql) : __HS_SUPER(f,l,n,hf, eql) {}
+
+  hash_set(const_iterator f, const_iterator l) : __HS_SUPER(f,l) { }
+  hash_set(const_iterator f, const_iterator l, size_type n) : __HS_SUPER(f,l,n) { }
+  hash_set(const_iterator f, const_iterator l, size_type n,
+           const hasher& hf) : __HS_SUPER(f, l, n, hf) { }
+  hash_set(const_iterator f, const_iterator l, size_type n,
+           const hasher& hf, const key_equal& eql) : __HS_SUPER(f, l, n, hf, eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+    friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& hs1, const _Self& hs2);
+# endif
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HS_TEMPLATE_HEADER
+inline bool operator==(const hash_set< __HS_ARGUMENTS >& hs1, 
+                       const hash_set< __HS_ARGUMENTS >& hs2)
+{
+    typedef __HS_SUPER _Super;
+    return (const _Super&)hs1 == (const _Super&)hs2; 
+}
+# endif
+
+// provide a "default" hash_multiset adaptor
+__HS_TEMPLATE_HEADER
+class hash_multiset : public __HMS_SUPER
+{
+  typedef hash_multiset< __HS_ARGUMENTS > _Self;
+public:
+  typedef __HMS_SUPER _Super;
+  __IMPORT_WITH_ITERATORS(_Super)
+  typedef typename _Super::key_type key_type;
+  typedef typename _Super::hasher hasher;
+  typedef typename _Super::key_equal key_equal;
+
+  hash_multiset() {}
+  hash_multiset(size_type __n) : __HMS_SUPER(__n) {}
+  hash_multiset(size_type __n, const hasher& __hf) : __HMS_SUPER(__n, __hf) {}
+  hash_multiset(size_type __n, const hasher& __hf, const key_equal& __eql): __HMS_SUPER(__n, __hf, __eql) {}
+
+  hash_multiset(const value_type* __f, const value_type* __l) : __HMS_SUPER(__f,__l) {}
+  hash_multiset(const value_type* __f, const value_type* __l, size_type __n): __HMS_SUPER(__f,__l,__n) {}
+  hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf) : __HMS_SUPER(__f,__l,__n,__hf) {}
+  hash_multiset(const value_type* __f, const value_type* __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql) : __HMS_SUPER(__f,__l,__n,__hf, __eql) {}
+
+  hash_multiset(const_iterator __f, const_iterator __l) : __HMS_SUPER(__f,__l) { }
+  hash_multiset(const_iterator __f, const_iterator __l, size_type __n) : __HMS_SUPER(__f,__l,__n) { }
+  hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf) : __HMS_SUPER(__f, __l, __n, __hf) { }
+  hash_multiset(const_iterator __f, const_iterator __l, size_type __n,
+           const hasher& __hf, const key_equal& __eql) : __HMS_SUPER(__f, __l, __n, __hf, __eql) { }
+# if defined (_STLP_BASE_MATCH_BUG)
+  friend inline bool operator== _STLP_NULL_TMPL_ARGS (const _Self& __hs1, const _Self& __hs2);
+# endif
+};
+
+# if defined (_STLP_BASE_MATCH_BUG)
+__HS_TEMPLATE_HEADER
+inline bool operator==(const hash_multiset< __HS_ARGUMENTS >& __hs1, 
+                       const hash_multiset< __HS_ARGUMENTS >& __hs2)
+{
+    typedef __HMS_SUPER  __s;
+    return _STLP_STD::operator==((const __s&)__hs1,(const __s&)__hs2);
+}
+# endif
+
+
+# undef __HS_SUPER
+# undef __HMS_SUPER
+# undef __HS_ARGUMENTS
+# undef __HS_BASE_ARGUMENTS
+# undef __HS_TEMPLATE_HEADER
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_HASH_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_list.h b/src/STLport/stl/wrappers/_list.h
new file mode 100644
index 0000000..4baf5be
--- /dev/null
+++ b/src/STLport/stl/wrappers/_list.h
@@ -0,0 +1,86 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_LIST_H
+#define _STLP_INTERNAL_WRAP_LIST_H
+
+#ifndef _STLP_INTERNAL_LIST_H
+# include <stl/_list.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+# if defined (_STLP_DEBUG)
+#  define __LIST_SUPER _DBG_list<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# else
+#  define __LIST_SUPER __list__<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# endif
+
+
+// provide a "default" list adaptor
+template <class _Tp>
+class list : public __LIST_SUPER
+{
+public:
+    typedef __LIST_SUPER _Super;
+    __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    __IMPORT_SUPER_COPY_ASSIGNMENT(list, list<_Tp>, __LIST_SUPER)
+    list() { }
+    explicit list(size_type __n, const _Tp& __value) : __LIST_SUPER(__n, __value) { }
+    explicit list(size_type __n) :  __LIST_SUPER(__n) { } 
+    list(const _Tp* __first, const _Tp* __last) : __LIST_SUPER(__first, __last) { } 
+    list(const_iterator __first, const_iterator __last) : __LIST_SUPER(__first, __last) { }
+# undef __LIST_SUPER
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool operator==(const list<_Tp>& __x, const list<_Tp>& __y) {
+    typedef typename list<_Tp>::_Super _Super;
+    return operator == ((const _Super&)__x,(const _Super&)__y);
+}
+
+template <class _Tp>
+inline bool operator<(const list<_Tp>& __x, const list<_Tp>& __y) {
+  return lexicographical_compare(__x.begin(), __x.end(),
+                                 __y.begin(), __y.end());
+}
+#  endif
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_LIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_map.h b/src/STLport/stl/wrappers/_map.h
new file mode 100644
index 0000000..3ad9940
--- /dev/null
+++ b/src/STLport/stl/wrappers/_map.h
@@ -0,0 +1,150 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_MAP_H
+#define _STLP_INTERNAL_WRAP_MAP_H
+
+#ifndef _STLP_INTERNAL_MAP_H
+# include <stl/_map.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+#   define __MAP_TEMPLATE_HEADER  template <class _Key, class _Tp>
+#   define __MAP_ARGUMENTS        _Key, _Tp
+#   define __MMAP_TEMPLATE_HEADER  template <class _Key, class _Tp>
+#   define __MMAP_ARGUMENTS        _Key, _Tp
+#   define _Compare less<_Key>
+#  else
+#   define __MAP_TEMPLATE_HEADER  template <class _Key, class _Tp, class _Compare >
+#   define __MAP_ARGUMENTS        _Key, _Tp, _Compare
+#   define __MMAP_TEMPLATE_HEADER  template <class _Key, class _Tp, class _Compare >
+#   define __MMAP_ARGUMENTS        _Key, _Tp, _Compare
+#  endif
+
+
+#  define __MAP_SUPER  __map< _Key, _Tp, _Compare, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp) >
+#  define __MMAP_SUPER  __multimap< _Key, _Tp, _Compare, _STLP_DEFAULT_PAIR_ALLOCATOR(const _Key, _Tp) >
+
+// provide a "default" map adaptor
+__MAP_TEMPLATE_HEADER
+class map : public __MAP_SUPER
+{
+  typedef map< __MAP_ARGUMENTS > _Self;
+public:
+    typedef __MAP_SUPER _Super;
+    __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    __IMPORT_SUPER_COPY_ASSIGNMENT(map, _Self, __MAP_SUPER)
+    map() : __MAP_SUPER(_Compare()) {}
+    explicit map(const _Compare& __comp) : __MAP_SUPER(__comp) {}
+    map(const typename _Super::value_type* __first, 
+	const typename _Super::value_type* __last) : 
+      __MAP_SUPER(__first, __last, _Compare()) { }
+    map(const typename _Super::value_type* __first, 
+	const typename _Super::value_type* __last, 
+        const _Compare& __comp) : __MAP_SUPER(__first, __last, __comp) { }
+    map(typename _Super::const_iterator __first, 
+	typename _Super::const_iterator __last) : 
+        __MAP_SUPER(__first, __last, _Compare()) { }
+    map(typename _Super::const_iterator __first, 
+	typename _Super::const_iterator __last, 
+        const _Compare& __comp) : __MAP_SUPER(__first, __last, __comp) { }
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+__MAP_TEMPLATE_HEADER
+inline bool operator==(const map< __MAP_ARGUMENTS >& __x, 
+                       const map< __MAP_ARGUMENTS >& __y) {
+  typedef __MAP_SUPER _Super;
+  return operator==((const _Super&)__x,(const _Super&)__y);
+}
+
+__MAP_TEMPLATE_HEADER
+inline bool operator<(const map< __MAP_ARGUMENTS >& __x, 
+                      const map< __MAP_ARGUMENTS >& __y) {
+  typedef __MAP_SUPER _Super;
+  return operator < ((const _Super&)__x,(const _Super&)__y);
+}
+#  endif /* _STLP_BASE_MATCH_BUG */
+
+
+// provide a "default" multimap adaptor
+__MMAP_TEMPLATE_HEADER
+class multimap : public __MMAP_SUPER
+{
+  typedef multimap< __MMAP_ARGUMENTS > _Self;
+public:
+    typedef __MMAP_SUPER  _Super;
+    __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    // copy & assignment from super
+    __IMPORT_SUPER_COPY_ASSIGNMENT(multimap, _Self, __MMAP_SUPER)
+    multimap() : __MMAP_SUPER(_Compare()) {}
+    explicit multimap(const _Compare& __comp) : __MMAP_SUPER(__comp) {}
+    multimap(const typename _Super::value_type* __first, 
+	     const typename _Super::value_type* __last) : 
+        __MMAP_SUPER(__first, __last, _Compare()) { }
+    multimap(const typename _Super::value_type* __first,
+	     const typename _Super::value_type* __last, 
+	     const _Compare& __comp) : __MMAP_SUPER(__first, __last, __comp) { }
+    multimap(typename _Super::const_iterator __first, 
+	     typename _Super::const_iterator __last) : 
+      __MMAP_SUPER(__first, __last, _Compare()) { }
+    multimap(typename _Super::const_iterator __first, 
+	     typename _Super::const_iterator __last, 
+	     const _Compare& __comp) : __MMAP_SUPER(__first, __last, __comp) { }
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+__MMAP_TEMPLATE_HEADER
+inline bool operator==(const multimap< __MMAP_ARGUMENTS >& __x, 
+                       const multimap< __MMAP_ARGUMENTS >& __y) {
+  typedef __MMAP_SUPER  _Super;
+  return (const _Super&)__x == (const _Super&)__y;
+}
+
+__MMAP_TEMPLATE_HEADER
+inline bool operator<(const multimap< __MMAP_ARGUMENTS >& __x, 
+                      const multimap< __MMAP_ARGUMENTS >& __y) {
+  typedef __MMAP_SUPER  _Super;
+  return (const _Super&)__x < (const _Super&)__y;
+}
+#  endif
+
+# undef __MMAP_TEMPLATE_HEADER
+# undef __MMAP_ARGUMENTS
+# undef __MMAP_SUPER
+
+# undef __MAP_TEMPLATE_HEADER
+# undef __MAP_ARGUMENTS
+# undef __MAP_SUPER
+
+# undef _Compare
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_MAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_mmap.h b/src/STLport/stl/wrappers/_mmap.h
new file mode 100644
index 0000000..49a32f6
--- /dev/null
+++ b/src/STLport/stl/wrappers/_mmap.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_MULTIMAP_H
+#define _STLP_INTERNAL_WRAP_MULTIMAP_H
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+#   define _Compare less<_Key>
+#  else
+#  endif
+
+# if defined (_STLP_DEBUG) && ! defined (_STLP_USE_NAMESPACES)
+# else
+
+# endif
+
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_MULTIMAP_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_set.h b/src/STLport/stl/wrappers/_set.h
new file mode 100644
index 0000000..3785cc1
--- /dev/null
+++ b/src/STLport/stl/wrappers/_set.h
@@ -0,0 +1,141 @@
+/*
+ * Copyright (c) 1999, 2000
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_SET_H
+#define _STLP_INTERNAL_WRAP_SET_H
+
+#ifndef _STLP_INTERNAL_SET_H
+# include <stl/_set.h>
+#endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+#  if defined (_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS)
+#   define __SET_TEMPLATE_HEADER  template <class _Key>
+#   define __SET_ARGUMENTS        _Key
+#   define __MSET_TEMPLATE_HEADER  template <class _Key>
+#   define __MSET_ARGUMENTS        _Key
+#   define _Compare less<_Key>
+#  else
+#   define __SET_TEMPLATE_HEADER  template <class _Key, class _Compare >
+#   define __SET_ARGUMENTS        _Key, _Compare
+#   define __MSET_TEMPLATE_HEADER  template <class _Key, class _Compare >
+#   define __MSET_ARGUMENTS        _Key, _Compare
+#  endif
+
+#   define __SET_SUPER  __set< _Key, _Compare, _STLP_DEFAULT_ALLOCATOR(_Key) >
+#   define __MSET_SUPER __multiset< _Key, _Compare, _STLP_DEFAULT_ALLOCATOR(_Key) >
+
+// provide a "default" set adaptor
+__SET_TEMPLATE_HEADER
+class set : public __SET_SUPER
+{
+  typedef set< __SET_ARGUMENTS > _Self;
+public:
+    typedef __SET_SUPER _Super;
+    __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    // copy & assignment from super
+    __IMPORT_SUPER_COPY_ASSIGNMENT(set,_Self,__SET_SUPER)
+    // specific constructors
+    explicit set() : __SET_SUPER(_Compare()) {}
+    explicit set(const _Compare& __comp) : __SET_SUPER(__comp) {}
+    set(const value_type* __first, const value_type* __last) : 
+        __SET_SUPER(__first, __last, _Compare()) { }
+    set(const value_type* __first, const value_type* __last, 
+        const _Compare& __comp) : __SET_SUPER(__first, __last, __comp) { }
+    set(const_iterator __first, const_iterator __last) : 
+        __SET_SUPER(__first, __last, _Compare()) { }
+    set(const_iterator __first, const_iterator __last, 
+        const _Compare& __comp) : __SET_SUPER(__first, __last, __comp) { }
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+__SET_TEMPLATE_HEADER 
+inline bool operator==(const set< __SET_ARGUMENTS >& __x, 
+                       const set< __SET_ARGUMENTS >& __y) {
+  typedef __SET_SUPER _Super;
+  return operator==((const _Super&)__x,(const _Super&)__y);
+}
+
+__SET_TEMPLATE_HEADER 
+inline bool operator<(const set< __SET_ARGUMENTS >& __x, 
+                      const set< __SET_ARGUMENTS >& __y) {
+  typedef __SET_SUPER _Super;
+  return operator < ((const _Super&)__x , (const _Super&)__y);
+}
+#  endif
+
+// provide a "default" multiset adaptor
+__MSET_TEMPLATE_HEADER 
+class multiset : public __MSET_SUPER
+{
+    typedef multiset< __MSET_ARGUMENTS > _Self;
+public:
+    typedef __MSET_SUPER _Super;
+    __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    // copy & assignment from super
+    __IMPORT_SUPER_COPY_ASSIGNMENT(multiset, _Self, __MSET_SUPER)
+    explicit multiset() : __MSET_SUPER(_Compare()) {}
+    explicit multiset(const _Compare& __comp) : __MSET_SUPER(__comp) {}
+    multiset(const value_type* __first, const value_type* __last) : 
+        __MSET_SUPER(__first, __last, _Compare()) { }
+    multiset(const value_type* __first, const value_type* __last, 
+        const _Compare& __comp) : __MSET_SUPER(__first, __last, __comp) { }
+    multiset(const_iterator __first, const_iterator __last) : 
+        __MSET_SUPER(__first, __last, _Compare()) { }
+    multiset(const_iterator __first, const_iterator __last, 
+        const _Compare& __comp) : __MSET_SUPER(__first, __last, __comp) { }
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)   
+__MSET_TEMPLATE_HEADER 
+inline bool operator==(const multiset< __MSET_ARGUMENTS >& __x, 
+                       const multiset< __MSET_ARGUMENTS >& __y) {
+  typedef __MSET_SUPER  _Super;
+  return (const _Super&)__x == (const _Super&)__y;
+}
+
+__MSET_TEMPLATE_HEADER 
+inline bool operator<(const multiset< __MSET_ARGUMENTS >& __x, 
+                      const multiset< __MSET_ARGUMENTS >& __y) {
+  typedef __MSET_SUPER _Super;
+  return (const _Super&)__x < (const _Super&)__y;
+}
+#  endif
+
+# undef __MSET_TEMPLATE_HEADER
+# undef __MSET_ARGUMENTS
+# undef __MSET_SUPER
+
+# undef __SET_TEMPLATE_HEADER
+# undef __SET_ARGUMENTS
+# undef __SET_SUPER 
+# undef _Compare
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_SET_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_slist.h b/src/STLport/stl/wrappers/_slist.h
new file mode 100644
index 0000000..ffa8de1
--- /dev/null
+++ b/src/STLport/stl/wrappers/_slist.h
@@ -0,0 +1,83 @@
+/*
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_SLIST_H
+#define _STLP_INTERNAL_WRAP_SLIST_H
+
+#ifndef _STLP_INTERNAL_SLIST_H
+# include <stl/_slist.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+#  define __SL_SUPER _DBG_slist<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# else
+#  define __SL_SUPER __slist__<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# endif
+
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+ 
+// provide a "default" list adaptor
+template <class _Tp>
+class slist : public  __SL_SUPER
+{
+public:
+    typedef __SL_SUPER _Super;
+    __IMPORT_WITH_ITERATORS(_Super)
+    __IMPORT_SUPER_COPY_ASSIGNMENT(slist, slist<_Tp>, __SL_SUPER)
+    slist() { }
+    explicit slist(size_type __n, const _Tp& __value) : __SL_SUPER(__n, __value) { }
+    explicit slist(size_type __n) :  __SL_SUPER(__n) { } 
+    slist(const _Tp* __first, const _Tp* __last) : __SL_SUPER(__first, __last) { } 
+    slist(const_iterator __first, const_iterator __last) : __SL_SUPER(__first, __last) { }
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool operator==(const slist<_Tp>& __x, const slist<_Tp>& __y) {
+    typedef typename slist<_Tp>::_Super _Super;
+    return operator == ((const _Super&)__x,(const _Super&)__y);
+}
+
+template <class _Tp>
+inline bool operator<(const slist<_Tp>& __x, const slist<_Tp>& __y) {
+    typedef typename slist<_Tp>::_Super _Super;
+    return operator < ((const _Super&)__x,(const _Super&)__y);
+}
+#  endif
+#  undef __SL_SUPER
+
+# ifdef _STLP_USE_NAMESPACES
+} /* namespace STLPORT */
+# endif
+
+#endif /* _STLP_INTERNAL_WRAP_SLIST_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl/wrappers/_vector.h b/src/STLport/stl/wrappers/_vector.h
new file mode 100644
index 0000000..ff42bc6
--- /dev/null
+++ b/src/STLport/stl/wrappers/_vector.h
@@ -0,0 +1,89 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/* NOTE: This is an internal header file, included by other STL headers.
+ *   You should not attempt to use it directly.
+ */
+
+#ifndef _STLP_INTERNAL_WRAP_VECTOR_H
+#define _STLP_INTERNAL_WRAP_VECTOR_H
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+# if defined (_STLP_DEBUG)
+#  define _VEC_SUPER _DBG_vector<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# else
+#  define _VEC_SUPER __vector__<_Tp, _STLP_DEFAULT_ALLOCATOR(_Tp) >
+# endif
+
+# ifdef _STLP_USE_NAMESPACES
+namespace STLPORT { 
+# endif
+
+template <class _Tp>
+class vector : public _VEC_SUPER
+{
+public:
+    typedef _VEC_SUPER  _Super;
+    __IMPORT_WITH_REVERSE_ITERATORS(_Super)
+    __IMPORT_SUPER_COPY_ASSIGNMENT(vector, vector<_Tp>, _VEC_SUPER)
+    vector() {}
+    explicit vector(size_type __n, const _Tp& __value) : _VEC_SUPER(__n, __value) { }
+    explicit vector(size_type __n) : _VEC_SUPER(__n) { }
+    vector(const_iterator __first, const_iterator __last) : _VEC_SUPER(__first,__last) { }
+# ifdef _STLP_DEBUG
+  // certainly, no member templates here !
+    vector(const _Tp* __first, const _Tp* __last) : _VEC_SUPER(__first,__last) { }    
+# endif
+    ~vector() {}
+};
+
+#  if defined (_STLP_BASE_MATCH_BUG)
+template <class _Tp>
+inline bool operator==(const vector<_Tp>& __x, const vector<_Tp>& __y) {
+  return __x.size() == __y.size() &&
+    equal(__x.begin(), __x.end(), __y.begin());
+}
+
+template <class _Tp>
+inline bool operator<(const vector<_Tp>& __x, const vector<_Tp>& __y) {
+  return lexicographical_compare(__x.begin(), __x.end(), 
+				 __y.begin(), __y.end());
+}
+#  endif /* _STLP_BASE_MATCH_BUG */
+#  undef _VEC_SUPER
+
+// close std namespace
+# ifdef _STLP_USE_NAMESPACES
+}
+# endif
+
+#endif /* _STLP_WRAP_VECTOR_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/stl_user_config.h b/src/STLport/stl_user_config.h
new file mode 100644
index 0000000..2fdcccd
--- /dev/null
+++ b/src/STLport/stl_user_config.h
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+/*
+ * Purpose of this file :
+ *
+ * To hold user-definable portion of STLport settings which may be overridden
+ * on per-project basis.
+ * Please note that if you use STLport iostreams (compiled library) then you have
+ * to use consistent settings when you compile STLport library and your project. 
+ * Those settings are defined in _site_config.h and have to be the same for a given
+ * STLport installation.
+ *
+ */
+
+
+//==========================================================
+// User-settable macros that control compilation:
+//              Features selection
+//==========================================================
+
+/* _STLP_NO_OWN_IOSTREAMS: 
+ * __STL_NO_SGI_IOSTREAMS (in older versions)
+ *  This is major configuration switch.
+ *  Turn it on to disable use of SGI iostreams and use wrappers 
+ *  around your compiler's iostreams, like before.
+ *  Keep it off if you want to use  SGI iostreams 
+ *  (Note that in this case you have to compile library in ../src
+ *  and supply resulting library at link time).
+ *
+ */
+
+ # define   _STLP_NO_OWN_IOSTREAMS	1
+
+
+/* 
+ * This macro only works in non-SGI iostreams mode.
+ *
+ * Uncomment to suppress using new-style streams even if they are
+ * available.
+ * Beware - _STLP_USE_OWN_NAMESPACE depends on this macro, too.
+ * Do that only if you are absolutely sure backwards-compatible 
+ * <iostream.h> is not actually a wrapper with <iostream>
+ * Hint : In VC++ 6.x, they are not.
+ */
+
+// #define   _STLP_NO_NEW_IOSTREAMS	1
+
+/*
+ * Use this switch for embedded systems where no iostreams are available
+ * at all. STLport own iostreams will also get disabled automatically then.
+ */
+// # define _STLP_NO_IOSTREAMS 1
+
+/* 
+ * Set _STLP_DEBUG to turn the "Debug Mode" on.
+ * That gets you checked iterators/ranges in the manner
+ * of "Safe STL". Very useful for debugging. Thread-safe.
+ * Please do not forget to link proper STLport library flavor
+ * (e.g libstlport_gcc_stldebug.a) when you set this flag in STLport iostreams mode.
+ */
+//#define   _STLP_DEBUG 1
+
+
+/* 
+ *
+ *  _STLP_NO_CUSTOM_IO : define this if you do not instantiate basic_xxx iostream classes  with custom types (which is most likely the case).
+ *  Custom means types other than char, wchar and char_traits<>,
+ *  like basic_ostream<my_char_type, my_traits<my_char_type> >
+ *  When this option is on, most non-inline template functions definitions for iostreams are not seen by the client.
+ *  Default is off, just not to break compilation for those who do use those types.
+ *  which saves a lot of compile time for most compilers, also object and executable size for some.
+ *  That also guarantees that you still use optimized standard i/o when you compile your program without optimization. 
+ *  Option does not affect STLport library build; you may use the same binary library with and without this option, 
+ *  on per-project basis.
+ *
+ */
+//#define _STLP_NO_CUSTOM_IO
+
+
+/* 
+ * _STLP_NO_RELOPS_NAMESPACE: if defined, don't put the relational
+ * operator templates (>, <=. >=, !=) in namespace std::rel_ops, even
+ * if the compiler supports namespaces.
+ * Note : if the compiler do not support namespaces, those operators are not be provided by default,
+ * to simulate hiding them into rel_ops. This was proved to resolve many compiler bugs with ambiguity.
+ */
+
+// #define _STLP_NO_RELOPS_NAMESPACE 1
+
+
+/*
+ * If _STLP_USE_OWN_NAMESPACE is in effect, STLport by default will not try
+ * to rename std:: for the user
+ * to _STL::. If you do want this feature, please define the following switch :
+ */
+// # define _STLP_REDEFINE_STD 1
+
+
+/*
+ * _STLP_WHOLE_NATIVE_STD : only meaningful in _STLP_USE_OWN_NAMESPACE mode.
+ * Normally, STLport only imports necessary components from native std:: namespace -
+ * those not yet provided by STLport (<iostream>, <complex>, etc.) 
+ * and their dependencies (<string>, <stdexcept>). 
+ * You might want everything from std:: being available in std:: namespace when you
+ * include corresponding STLport header (like STLport <map> provides std::map as well, etc.),
+ * if you are going to use both stlport:: and std:: components in your code.
+ * Otherwise this option is not recommended as it increases the size of your object files
+ * and slows down compilation.
+ */
+// # define _STLP_WHOLE_NATIVE_STD
+
+
+/*
+ * Use this option to catch uninitialized members in your classes.
+ * When it is set, construct() and destroy() fill the class storage
+ * with _STLP_SHRED_BYTE (see below). 
+ * Note : _STLP_DEBUG and _STLP_DEBUG_ALLOC don't set this option automatically.
+ */
+
+// # define _STLP_DEBUG_UNINITIALIZED 1
+
+/*
+ * Uncomment and provide a definition for the byte with which raw memory
+ * will be filled if _STLP_DEBUG_ALLOC or _STLP_DEBUG_UNINITIALIZED is defined. 
+ * Choose a value which is likely to cause a noticeable problem if dereferenced 
+ * or otherwise abused. A good value may already be defined for your platform; see
+ * stl_config.h
+ */
+// #define _STLP_SHRED_BYTE 0xA3
+
+/*
+ *  This option is for gcc users only and only affects systems where native linker
+ *  does not let gcc to implement automatic instantiation of static template data members/
+ *  It is being put in this file as there is no way to check if we are using GNU ld automatically,
+ *  so it becomes user's responsibility.
+ * 
+ */
+
+// #define _STLP_GCC_USES_GNU_LD
+
+
+//==========================================================
+// Compatibility section
+//==========================================================
+
+/*
+ *  Define this macro to disable anachronistic constructs (like the ones used in HP STL and
+ *  not included in final standard, etc. 
+ */
+// define _STLP_NO_ANACHRONISMS 1
+
+/*
+ *  Define this macro to disable STLport extensions (for example, to make sure your code will 
+ *  compile with some other implementation )
+ */
+// define _STLP_NO_EXTENSIONS   1
+
+
+/* 
+ * You should define this macro if compiling with MFC - STLport <stl/_config.h>
+ * then include <afx.h> instead of <windows.h> to get synchronisation primitives 
+ *
+ */
+
+// # define _STLP_USE_MFC 1
+
+
+// boris : this setting is here as we cannot detect precense of new Platform SDK automatically 
+// If you are using new PSDK with VC++ 6.0 or lower, please define this to get correct prototypes for InterlockedXXX functions
+//# define _STLP_NEW_PLATFORM_SDK 1
+
+/*
+ * Use minimum set of default arguments on template classes that have more
+ * than one - for example map<>, set<>.
+ * This has effect only if _STLP_LIMITED_DEFAULT_TEMPLATES is on.
+ * If _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS is set, you'll be able to compile
+ * set<T> with those compilers, but you'll have to use __set__<T, less<T>>
+ *
+ * Affects : map<>, multimap<>, set<>, multiset<>, hash_*<>, 
+ * queue<>, priority_queue<>, stack<>, istream_iterator<>
+ */
+
+// # define _STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS 1
+
+//==========================================================
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/streambuf b/src/STLport/streambuf
new file mode 100644
index 0000000..b033cfc
--- /dev/null
+++ b/src/STLport/streambuf
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_STREAMBUF
+#define _STLP_STREAMBUF
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1066
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+#  include <stl/_streambuf.h>
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+#  include <wrap_std/streambuf>
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1066)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STREAMBUF */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/streambuf.h b/src/STLport/streambuf.h
new file mode 100644
index 0000000..378c23c
--- /dev/null
+++ b/src/STLport/streambuf.h
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+#ifndef _STLP_STREAMBUF_H
+# define _STLP_STREAMBUF_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2067
+#  include <stl/_prolog.h>
+# endif
+
+# if defined ( _STLP_OWN_IOSTREAMS )
+
+#ifdef __BORLANDC__
+#  include <streambuf.>
+#else
+#  include <streambuf>
+#endif
+
+# include <ios.h>
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+   using namespace _STLP_STD;
+#  else
+using _STLP_STD::basic_streambuf;
+using _STLP_STD::streambuf;
+#   ifndef _STLP_NO_WCHAR_T
+using _STLP_STD::wstreambuf;
+#   endif
+#  endif
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(streambuf.h)
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2067)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STREAMBUF_H */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/string b/src/STLport/string
new file mode 100644
index 0000000..d3a8055
--- /dev/null
+++ b/src/STLport/string
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1997-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRING
+# define _STLP_STRING
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x68
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#if defined (_STLP_USE_NATIVE_STRING)
+
+// as part of compiled runtime library depends on it.
+
+# if defined (_STLP_MSVC)
+#  include <streambuf>
+#  include <istream>
+# endif
+
+#  include _STLP_NATIVE_HEADER(string)
+
+# endif /* _STLP_USE_NATIVE_STRING */
+
+# if !defined (_STLP_USE_NATIVE_STRING) || defined (_STLP_USE_OWN_NAMESPACE)
+# include <stl/_string.h>
+# else
+# include <stl/_string_hash.h>
+# endif /*_STLP_USE_NATIVE_STRING */
+
+// cleanup
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x68)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STRING */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/string.h b/src/STLport/string.h
new file mode 100644
index 0000000..47babc3
--- /dev/null
+++ b/src/STLport/string.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x269
+#  include <stl/_prolog.h>
+# endif
+
+# if defined (__BORLANDC__)
+#  include _STLP_NATIVE_CPP_C_HEADER(_str.h)
+# else
+#  include _STLP_NATIVE_C_HEADER(string.h)
+# endif
+
+# if defined (__BORLANDC__) && defined (_STLP_IMPORT_VENDOR_CSTD)
+#  include <using/cstring>
+# endif /* BORLAND */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x269)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/strstream b/src/STLport/strstream
new file mode 100644
index 0000000..6f87f19
--- /dev/null
+++ b/src/STLport/strstream
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+// WARNING: The classes defined in this header are DEPRECATED.  This
+// header is defined in section D.7.1 of the C++ standard, and it
+// MAY BE REMOVED in a future standard revision.  You should use the
+// header <sstream> instead.
+
+
+#ifndef _STLP_STRSTREAM
+#define _STLP_STRSTREAM
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x1070
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# if defined (_STLP_OWN_IOSTREAMS)
+
+#  include <stl/_strstream.h>
+
+# elif !defined (_STLP_USE_NO_IOSTREAMS)
+
+#  if defined (_STLP_USE_NEW_IOSTREAMS)
+#   include <wrap_std/strstream>
+#  else
+#   include <wrap_std/h/strstream.h>
+#  endif
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x1070)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STRSTREAM */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/strstream.h b/src/STLport/strstream.h
new file mode 100644
index 0000000..6a1978e
--- /dev/null
+++ b/src/STLport/strstream.h
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_STRSTREAM_H
+# define _STLP_STRSTREAM_H
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x2071
+#  include <stl/_prolog.h>
+# endif
+
+# if defined ( _STLP_USE_NEW_IOSTREAMS )
+
+// fbp - if we are going to use that consistently, let's do it
+#ifdef __BORLANDC__
+#  include <strstream.>
+#else
+#  include <strstream>
+#endif
+
+# include  <iostream.h>
+
+
+# ifndef _STLP_HAS_NO_NAMESPACES
+
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+
+using namespace _STLP_STD;
+
+#  else
+
+using _STLP_STD::strstreambuf;
+using _STLP_STD::istrstream;
+using _STLP_STD::ostrstream;
+using _STLP_STD::strstream;
+
+#  endif /* _STLP_BROKEN_USING_DIRECTIVE */
+
+# endif /* _STLP_HAS_NO_NAMESPACES */
+
+# else
+
+
+// just include old-style strstream.h
+#  if defined (_MSC_VER) && (_MSC_VER <= 1200)
+#   include _STLP_NATIVE_OLD_STREAMS_HEADER(strstrea.h)
+#  else
+#   include _STLP_NATIVE_OLD_STREAMS_HEADER(strstream.h)
+#  endif
+
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x2071)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_STRSTREAM_H */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/time.h b/src/STLport/time.h
new file mode 100644
index 0000000..ccb64b3
--- /dev/null
+++ b/src/STLport/time.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x272
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x272) && ! defined (_STLP_DONT_POP_0x272)
+#  define _STLP_DONT_POP_0x272
+# endif
+
+# include _STLP_NATIVE_C_HEADER(time.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x272)
+#  if ! defined (_STLP_DONT_POP_0x272)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x272
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/typeinfo b/src/STLport/typeinfo
new file mode 100644
index 0000000..1301bfe
--- /dev/null
+++ b/src/STLport/typeinfo
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_TYPEINFO
+# define _STLP_TYPEINFO
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x473
+#  include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_NO_TYPEINFO
+
+# if defined (_STLP_NO_NEW_NEW_HEADER)
+#  include <typeinfo.h>
+# else
+#  include _STLP_NATIVE_CPP_RUNTIME_HEADER(typeinfo)
+# endif
+
+# if defined(_STLP_MSVC) && (_STLP_MSVC >= 1300)
+// In .NET, <typeinfo> actually includes <typeinfo.h> 
+#  undef _STLP_OLDSTD_typeinfo
+# endif
+
+// if <typeinfo.h> already included, do not import anything
+# if defined  (_STLP_USE_NAMESPACES) && ! defined (_STLP_OLDSTD_typeinfo) \
+&& ( defined (_STLP_VENDOR_GLOBAL_EXCEPT_STD) || defined (_STLP_USE_OWN_NAMESPACE) || defined (_STLP_DEBUG))
+# if defined(_STLP_MSVC) && (_STLP_MSVC < 1300)
+class bad_cast : public exception {};
+# endif
+_STLP_BEGIN_NAMESPACE
+
+// VC++ 6 has only this guy in ::
+// # if !(defined(_STLP_MSVC)&& (_STLP_MSVC <= 1200))
+using _STLP_VENDOR_EXCEPT_STD::type_info;
+// # endif
+
+#  if !(defined(__MRC__) || defined(__SC__) || defined(__DMC__))
+using _STLP_VENDOR_EXCEPT_STD::bad_typeid;
+#  endif
+
+//#if defined( __xlC__ ) && (__xlC__ < 0x500)
+//# include <exception>
+//struct bad_cast : exception {};
+//#endif
+# if defined(_STLP_MSVC) && (_STLP_MSVC < 1300)
+using ::bad_cast;
+# else
+using _STLP_VENDOR_EXCEPT_STD::bad_cast;
+# endif
+
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+#else
+
+# include <exception>
+_STLP_BEGIN_NAMESPACE
+# ifndef __DMC__
+struct bad_cast : exception {};
+# endif
+_STLP_END_NAMESPACE
+#endif  /* NO_TYPEINFO */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x473)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_TYPEINFO */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/typeinfo.h b/src/STLport/typeinfo.h
new file mode 100644
index 0000000..c0ec75d
--- /dev/null
+++ b/src/STLport/typeinfo.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_OLDSTD_typeinfo
+# define _STLP_OLDSTD_typeinfo
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x874
+#  include <stl/_prolog.h>
+# endif
+
+# ifndef _STLP_NO_TYPEINFO
+
+#if defined (__GNUC__)
+# undef _STLP_OLDSTD_typeinfo
+#  include <typeinfo>
+# define _STLP_OLDSTD_typeinfo
+#else
+#  include _STLP_NATIVE_CPP_RUNTIME_HEADER(typeinfo.h)
+#endif
+
+// if <typeinfo> already included, do not import anything
+
+# if defined  (_STLP_USE_OWN_NAMESPACE) && ! (defined (_STLP_TYPEINFO) && !defined(_STLP_NO_NEW_NEW_HEADER))
+
+_STLP_BEGIN_NAMESPACE
+
+using /*_STLP_VENDOR_EXCEPT_STD */ :: type_info;
+# if !(defined(__MRC__) || (defined(__SC__) && !defined(__DMC__)))
+using /* _STLP_VENDOR_EXCEPT_STD */ :: bad_typeid;
+# endif
+using /* _STLP_VENDOR_EXCEPT_STD */ :: bad_cast;
+
+_STLP_END_NAMESPACE
+
+#endif /* _STLP_OWN_NAMESPACE */
+
+# endif /* _STLP_NO_TYPEINFO */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x874)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_OLDSTD_typeinfo */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/using/cstring b/src/STLport/using/cstring
new file mode 100644
index 0000000..5142dda
--- /dev/null
+++ b/src/STLport/using/cstring
@@ -0,0 +1,54 @@
+using _STLP_VENDOR_CSTD::size_t;
+
+#  ifndef _STLP_NO_CSTD_FUNCTION_IMPORTS
+#   if defined(__MSL__) && __MC68K__ && !_No_BlockMove && __dest_os == __mac_os
+#    undef memcpy
+#    undef memmove
+inline void* memcpy(void* dst, const void* src, size_t len)
+{
+	return _STLP_VENDOR_CSTD::__memcpy(dst, src, len);
+}
+inline void* memmove(void* dst, const void* src, size_t len)
+{
+	return _STLP_VENDOR_CSTD::__memmove(dst, src, len);
+}
+#   else
+
+ using _STLP_VENDOR_CSTD::memmove;
+ using _STLP_VENDOR_CSTD::memcpy;
+
+#   endif
+
+# if ! defined (__BORLANDC__)
+using _STLP_VENDOR_CSTD::memchr;
+using _STLP_VENDOR_CSTD::strchr;
+using _STLP_VENDOR_CSTD::strpbrk;
+using _STLP_VENDOR_CSTD::strrchr;
+using _STLP_VENDOR_CSTD::strstr;
+# endif
+
+using _STLP_VENDOR_CSTD::memcmp;
+using _STLP_VENDOR_CSTD::memset;
+
+using _STLP_VENDOR_CSTD::strcat;
+
+# if !defined (strcmp)
+using _STLP_VENDOR_CSTD::strcmp;
+# endif
+
+using _STLP_VENDOR_CSTD::strcoll;
+# if !defined (strcpy)
+using _STLP_VENDOR_CSTD::strcpy;
+# endif
+using _STLP_VENDOR_CSTD::strcspn;
+using _STLP_VENDOR_CSTD::strerror;
+using _STLP_VENDOR_CSTD::strlen;
+using _STLP_VENDOR_CSTD::strncat;
+using _STLP_VENDOR_CSTD::strncmp;
+
+using _STLP_VENDOR_CSTD::strncpy;
+using _STLP_VENDOR_CSTD::strspn;
+
+using _STLP_VENDOR_CSTD::strtok;
+using _STLP_VENDOR_CSTD::strxfrm;
+#  endif /* _STLP_NO_CSTD_FUNCTION_IMPORTS */
diff --git a/src/STLport/using/export b/src/STLport/using/export
new file mode 100644
index 0000000..2d3afcd
--- /dev/null
+++ b/src/STLport/using/export
@@ -0,0 +1,12 @@
+cstring
+fstream
+iomanip
+ios
+iosfwd
+iostream
+istream
+locale
+ostream
+sstream
+streambuf
+strstream
diff --git a/src/STLport/using/fstream b/src/STLport/using/fstream
new file mode 100644
index 0000000..e79e048
--- /dev/null
+++ b/src/STLport/using/fstream
@@ -0,0 +1,19 @@
+#ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_STD;
+#else
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+# endif
+#endif
diff --git a/src/STLport/using/h/fstream.h b/src/STLport/using/h/fstream.h
new file mode 100644
index 0000000..6600568
--- /dev/null
+++ b/src/STLport/using/h/fstream.h
@@ -0,0 +1,4 @@
+using ::streambuf;
+using ::ifstream;
+using ::ofstream;
+using ::fstream;
diff --git a/src/STLport/using/h/iomanip.h b/src/STLport/using/h/iomanip.h
new file mode 100644
index 0000000..99e48d9
--- /dev/null
+++ b/src/STLport/using/h/iomanip.h
@@ -0,0 +1,6 @@
+using ::setiosflags;
+using ::resetiosflags;
+// using ::setbase;
+using ::setfill;
+using ::setprecision;
+using ::setw;
diff --git a/src/STLport/using/h/iostream.h b/src/STLport/using/h/iostream.h
new file mode 100644
index 0000000..e85f4e2
--- /dev/null
+++ b/src/STLport/using/h/iostream.h
@@ -0,0 +1,24 @@
+using _STLP_OLD_IO_NAMESPACE::istream;
+using _STLP_OLD_IO_NAMESPACE::ostream;
+
+/* HP aCC include files re-define these when THREAD_SAFE */
+#if !defined(cin)
+using _STLP_OLD_IO_NAMESPACE::cin;
+#endif
+#if !defined(cout)
+using _STLP_OLD_IO_NAMESPACE::cout;
+#endif
+#if !defined(cerr)
+using _STLP_OLD_IO_NAMESPACE::cerr;
+#endif
+#if !defined(clog)
+using _STLP_OLD_IO_NAMESPACE::clog;
+#endif
+
+using _STLP_OLD_IO_NAMESPACE::endl;
+using _STLP_OLD_IO_NAMESPACE::ends;
+
+using _STLP_OLD_IO_NAMESPACE::ios;
+using _STLP_OLD_IO_NAMESPACE::flush;
+
+// using _STLP_OLD_IO_NAMESPACE::ws;
diff --git a/src/STLport/using/h/ostream.h b/src/STLport/using/h/ostream.h
new file mode 100644
index 0000000..6ba3f88
--- /dev/null
+++ b/src/STLport/using/h/ostream.h
@@ -0,0 +1,6 @@
+using _STLP_OLD_IO_NAMESPACE::ostream;
+using _STLP_OLD_IO_NAMESPACE::endl;
+using _STLP_OLD_IO_NAMESPACE::ends;
+using _STLP_OLD_IO_NAMESPACE::flush;
+
+// using _STLP_OLD_IO_NAMESPACE::ws;
diff --git a/src/STLport/using/h/streambuf.h b/src/STLport/using/h/streambuf.h
new file mode 100644
index 0000000..459de3d
--- /dev/null
+++ b/src/STLport/using/h/streambuf.h
@@ -0,0 +1 @@
+using ::streambuf;
diff --git a/src/STLport/using/h/strstream.h b/src/STLport/using/h/strstream.h
new file mode 100644
index 0000000..a7d9f11
--- /dev/null
+++ b/src/STLport/using/h/strstream.h
@@ -0,0 +1,4 @@
+using _STLP_OLD_IO_NAMESPACE::strstreambuf;
+using _STLP_OLD_IO_NAMESPACE::istrstream;
+using _STLP_OLD_IO_NAMESPACE::ostrstream;
+using _STLP_OLD_IO_NAMESPACE::strstream;
diff --git a/src/STLport/using/iomanip b/src/STLport/using/iomanip
new file mode 100644
index 0000000..8a7c792
--- /dev/null
+++ b/src/STLport/using/iomanip
@@ -0,0 +1,6 @@
+using _STLP_NEW_IO_NAMESPACE::setiosflags;
+using _STLP_NEW_IO_NAMESPACE::resetiosflags;
+using _STLP_NEW_IO_NAMESPACE::setbase;
+using _STLP_NEW_IO_NAMESPACE::setfill;
+using _STLP_NEW_IO_NAMESPACE::setprecision;
+using _STLP_NEW_IO_NAMESPACE::setw;
diff --git a/src/STLport/using/ios b/src/STLport/using/ios
new file mode 100644
index 0000000..22f23ae
--- /dev/null
+++ b/src/STLport/using/ios
@@ -0,0 +1,41 @@
+#  ifdef _STLP_BROKEN_USING_DIRECTIVE
+using namespace _STLP_NEW_IO_NAMESPACE;
+#  else
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+using _STLP_NEW_IO_NAMESPACE::streamsize;
+
+using _STLP_NEW_IO_NAMESPACE::ios_base;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+
+// _lib.std.ios.manip_, manipulators:	
+using _STLP_NEW_IO_NAMESPACE::boolalpha;
+using _STLP_NEW_IO_NAMESPACE::noboolalpha;
+using _STLP_NEW_IO_NAMESPACE::showbase;
+using _STLP_NEW_IO_NAMESPACE::noshowbase;
+using _STLP_NEW_IO_NAMESPACE::showpoint;
+using _STLP_NEW_IO_NAMESPACE::noshowpoint;
+using _STLP_NEW_IO_NAMESPACE::showpos;
+using _STLP_NEW_IO_NAMESPACE::noshowpos;
+using _STLP_NEW_IO_NAMESPACE::skipws;
+using _STLP_NEW_IO_NAMESPACE::noskipws;
+using _STLP_NEW_IO_NAMESPACE::uppercase;
+using _STLP_NEW_IO_NAMESPACE::nouppercase;
+
+// _lib.adjustfield.manip_ adjustfield:
+using _STLP_NEW_IO_NAMESPACE::internal;
+using _STLP_NEW_IO_NAMESPACE::left;
+using _STLP_NEW_IO_NAMESPACE::right;
+
+// _lib.basefield.manip_ basefield:
+using _STLP_NEW_IO_NAMESPACE::dec;
+using _STLP_NEW_IO_NAMESPACE::hex;
+using _STLP_NEW_IO_NAMESPACE::oct;
+
+// _lib.floatfield.manip_ floatfield:
+using _STLP_NEW_IO_NAMESPACE::fixed;
+using _STLP_NEW_IO_NAMESPACE::scientific;
+
+#  endif  /* _STLP_BROKEN_USING_DIRECTIVE */
+
diff --git a/src/STLport/using/iosfwd b/src/STLport/using/iosfwd
new file mode 100644
index 0000000..b564e81
--- /dev/null
+++ b/src/STLport/using/iosfwd
@@ -0,0 +1,54 @@
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+using _STLP_NEW_IO_NAMESPACE::char_traits;
+using _STLP_NEW_IO_NAMESPACE::basic_ios;
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_filebuf;
+using _STLP_NEW_IO_NAMESPACE::basic_ifstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ofstream;
+using _STLP_NEW_IO_NAMESPACE::basic_fstream;
+using _STLP_NEW_IO_NAMESPACE::fpos;
+using _STLP_NEW_IO_NAMESPACE::istreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::ostreambuf_iterator;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::ios;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+using _STLP_NEW_IO_NAMESPACE::filebuf;
+using _STLP_NEW_IO_NAMESPACE::ifstream;
+using _STLP_NEW_IO_NAMESPACE::ofstream;
+using _STLP_NEW_IO_NAMESPACE::fstream;
+
+using _STLP_NEW_IO_NAMESPACE::streampos;
+using _STLP_NEW_IO_NAMESPACE::streamoff;
+
+# if !defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wios;
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wostream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+using _STLP_NEW_IO_NAMESPACE::wfilebuf;
+using _STLP_NEW_IO_NAMESPACE::wifstream;
+using _STLP_NEW_IO_NAMESPACE::wofstream;
+using _STLP_NEW_IO_NAMESPACE::wfstream;
+using _STLP_NEW_IO_NAMESPACE::wstreampos;
+# endif
diff --git a/src/STLport/using/iostream b/src/STLport/using/iostream
new file mode 100644
index 0000000..6169afb
--- /dev/null
+++ b/src/STLport/using/iostream
@@ -0,0 +1,14 @@
+
+# include <using/istream>
+
+using _STLP_VENDOR_STD::cin;
+using _STLP_VENDOR_STD::cout;
+using _STLP_VENDOR_STD::cerr;
+using _STLP_VENDOR_STD::clog;
+
+# if ! defined (_STLP_NO_WIDE_STREAMS)
+using _STLP_VENDOR_STD::wcin;
+using _STLP_VENDOR_STD::wcout;
+using _STLP_VENDOR_STD::wcerr;
+using _STLP_VENDOR_STD::wclog;
+# endif
diff --git a/src/STLport/using/istream b/src/STLport/using/istream
new file mode 100644
index 0000000..baf10d2
--- /dev/null
+++ b/src/STLport/using/istream
@@ -0,0 +1,16 @@
+# include <using/ostream>
+
+using _STLP_NEW_IO_NAMESPACE::basic_istream;
+using _STLP_NEW_IO_NAMESPACE::basic_iostream;
+
+using _STLP_NEW_IO_NAMESPACE::istream;
+using _STLP_NEW_IO_NAMESPACE::iostream;
+
+# if !defined (_STLP_NO_NATIVE_WIDE_STREAMS)
+using _STLP_NEW_IO_NAMESPACE::wistream;
+using _STLP_NEW_IO_NAMESPACE::wiostream;
+# endif
+
+#if !(defined (_STLP_MSVC) && (_STLP_MSVC < 1200))
+using _STLP_NEW_IO_NAMESPACE::ws;
+#endif
diff --git a/src/STLport/using/locale b/src/STLport/using/locale
new file mode 100644
index 0000000..aa99b5b
--- /dev/null
+++ b/src/STLport/using/locale
@@ -0,0 +1,65 @@
+#if !defined(_STLP_NO_IMPORT_LOCALE)
+
+// from <cwchar>
+#if !defined (_STLP_NO_MBSTATE_T)
+using _STLP_VENDOR_MB_NAMESPACE::mbstate_t;
+#endif
+
+// _lib.locale_, locale:
+using _STLP_NEW_IO_NAMESPACE::locale;
+using _STLP_NEW_IO_NAMESPACE::use_facet;
+using _STLP_NEW_IO_NAMESPACE::has_facet;
+
+// _lib.locale.convenience_, convenience interfaces:
+using _STLP_NEW_IO_NAMESPACE::isspace;
+using _STLP_NEW_IO_NAMESPACE::isprint;
+using _STLP_NEW_IO_NAMESPACE::iscntrl;
+using _STLP_NEW_IO_NAMESPACE::isupper;
+using _STLP_NEW_IO_NAMESPACE::islower;
+using _STLP_NEW_IO_NAMESPACE::isalpha;
+using _STLP_NEW_IO_NAMESPACE::isdigit;
+using _STLP_NEW_IO_NAMESPACE::ispunct;
+using _STLP_NEW_IO_NAMESPACE::isxdigit;
+using _STLP_NEW_IO_NAMESPACE::isalnum;
+using _STLP_NEW_IO_NAMESPACE::isgraph;
+using _STLP_NEW_IO_NAMESPACE::toupper;
+using _STLP_NEW_IO_NAMESPACE::tolower;
+
+// _lib.category.ctype_ and _lib.facet.ctype.special_, ctype:
+using _STLP_NEW_IO_NAMESPACE::ctype_base;
+using _STLP_NEW_IO_NAMESPACE::ctype;
+using _STLP_NEW_IO_NAMESPACE::ctype_byname;
+using _STLP_NEW_IO_NAMESPACE::codecvt_base;
+using _STLP_NEW_IO_NAMESPACE::codecvt;
+using _STLP_NEW_IO_NAMESPACE::codecvt_byname;
+
+// _lib.category.numeric_ and _lib.facet.numpunct_, numeric:
+using _STLP_NEW_IO_NAMESPACE::num_get;
+using _STLP_NEW_IO_NAMESPACE::num_put;
+using _STLP_NEW_IO_NAMESPACE::numpunct;
+using _STLP_NEW_IO_NAMESPACE::numpunct_byname;
+
+// _lib.category.collate_, collation:
+using _STLP_NEW_IO_NAMESPACE::collate;
+using _STLP_NEW_IO_NAMESPACE::collate_byname;
+
+// _lib.category.time_, date and time:
+using _STLP_NEW_IO_NAMESPACE::time_base;
+using _STLP_NEW_IO_NAMESPACE::time_get;
+using _STLP_NEW_IO_NAMESPACE::time_get_byname;
+using _STLP_NEW_IO_NAMESPACE::time_put;
+using _STLP_NEW_IO_NAMESPACE::time_put_byname;
+
+// _lib.category.monetary_, money:
+using _STLP_NEW_IO_NAMESPACE::money_base;
+using _STLP_NEW_IO_NAMESPACE::money_get;
+using _STLP_NEW_IO_NAMESPACE::money_put;
+using _STLP_NEW_IO_NAMESPACE::moneypunct;
+using _STLP_NEW_IO_NAMESPACE::moneypunct_byname;
+
+#if !defined (_STLP_OWN_IOSTREAMS) && !defined (_STLP_NO_NATIVE_MESSAGE_FACET)
+using _STLP_NEW_IO_NAMESPACE::messages_base;
+using _STLP_NEW_IO_NAMESPACE::messages;
+using _STLP_NEW_IO_NAMESPACE::messages_byname;
+#endif // _MSL_NO_MESSAGE_FACET
+#endif /* !defined(_STLP_NO_IMPORT_LOCALE) */
diff --git a/src/STLport/using/ostream b/src/STLport/using/ostream
new file mode 100644
index 0000000..162b32d
--- /dev/null
+++ b/src/STLport/using/ostream
@@ -0,0 +1,10 @@
+using _STLP_NEW_IO_NAMESPACE::basic_ostream;
+using _STLP_NEW_IO_NAMESPACE::ostream;
+
+# ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wostream;
+# endif
+
+using _STLP_NEW_IO_NAMESPACE::endl;
+using _STLP_NEW_IO_NAMESPACE::ends;
+using _STLP_NEW_IO_NAMESPACE::flush;
diff --git a/src/STLport/using/sstream b/src/STLport/using/sstream
new file mode 100644
index 0000000..925c37e
--- /dev/null
+++ b/src/STLport/using/sstream
@@ -0,0 +1,16 @@
+using _STLP_NEW_IO_NAMESPACE::basic_stringbuf;
+using _STLP_NEW_IO_NAMESPACE::stringbuf;
+
+using _STLP_NEW_IO_NAMESPACE::basic_istringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_ostringstream;
+using _STLP_NEW_IO_NAMESPACE::basic_stringstream;
+using _STLP_NEW_IO_NAMESPACE::istringstream;
+using _STLP_NEW_IO_NAMESPACE::ostringstream;
+using _STLP_NEW_IO_NAMESPACE::stringstream;
+
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstringbuf;
+using _STLP_NEW_IO_NAMESPACE::wistringstream;
+using _STLP_NEW_IO_NAMESPACE::wostringstream;
+using _STLP_NEW_IO_NAMESPACE::wstringstream;
+#endif
diff --git a/src/STLport/using/streambuf b/src/STLport/using/streambuf
new file mode 100644
index 0000000..308241d
--- /dev/null
+++ b/src/STLport/using/streambuf
@@ -0,0 +1,5 @@
+using _STLP_NEW_IO_NAMESPACE::basic_streambuf;
+using _STLP_NEW_IO_NAMESPACE::streambuf;
+#ifndef _STLP_NO_WIDE_STREAMS
+using _STLP_NEW_IO_NAMESPACE::wstreambuf;
+# endif
diff --git a/src/STLport/using/strstream b/src/STLport/using/strstream
new file mode 100644
index 0000000..eb26ac1
--- /dev/null
+++ b/src/STLport/using/strstream
@@ -0,0 +1,4 @@
+using _STLP_NEW_IO_NAMESPACE::strstreambuf;
+using _STLP_NEW_IO_NAMESPACE::istrstream;
+using _STLP_NEW_IO_NAMESPACE::ostrstream;
+using _STLP_NEW_IO_NAMESPACE::strstream;
diff --git a/src/STLport/utility b/src/STLport/utility
new file mode 100644
index 0000000..c6de4d8
--- /dev/null
+++ b/src/STLport/utility
@@ -0,0 +1,65 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_UTILITY
+#define _STLP_UTILITY
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x75
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# ifndef __TYPE_TRAITS_H
+#  include <stl/type_traits.h>
+# endif
+
+# if !defined (_STLP_DEBUG_H) && (defined  (_STLP_DEBUG) || defined (_STLP_ASSERTIONS))
+#  include <stl/debug/_debug.h>
+# endif
+
+# ifndef _STLP_INTERNAL_PAIR_H
+#  include <stl/_pair.h>
+# endif
+
+# if defined (_STLP_IMPORT_VENDOR_STD)
+#   include _STLP_NATIVE_HEADER(utility)
+# else
+#  if defined (_STLP_MSVC) && ! defined (_STLP_INTERNAL_ITERATOR_H)
+#   include <stl/_iterator.h>
+#  endif
+# endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x75)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_UTILITY */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/valarray b/src/STLport/valarray
new file mode 100644
index 0000000..8acc0b1
--- /dev/null
+++ b/src/STLport/valarray
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */ 
+
+#ifndef _STLP_VALARRAY
+#define _STLP_VALARRAY
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x76
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+#include <stl/_valarray.h>
+
+#if defined (_STLP_WHOLE_VENDOR_STD)
+# include _STLP_NATIVE_HEADER(valarray)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x76)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_VALARRAY */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/vector b/src/STLport/vector
new file mode 100644
index 0000000..23ae762
--- /dev/null
+++ b/src/STLport/vector
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996,1997
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef _STLP_VECTOR
+#define _STLP_VECTOR
+
+# ifndef _STLP_OUTERMOST_HEADER_ID
+#  define _STLP_OUTERMOST_HEADER_ID 0x77
+#  include <stl/_prolog.h>
+# endif
+
+# ifdef _STLP_PRAGMA_ONCE
+#  pragma once
+# endif
+
+# ifndef _STLP_INTERNAL_ALGOBASE_H
+#  include <stl/_algobase.h>
+# endif
+
+#ifndef _STLP_INTERNAL_VECTOR_H
+# include <stl/_vector.h>
+#endif
+
+#if defined (_STLP_IMPORT_VENDOR_STD) && ! defined (_STLP_MINIMUM_IMPORT_STD)
+#  include _STLP_NATIVE_HEADER(vector)
+#endif
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x77)
+#  include <stl/_epilog.h>
+#  undef _STLP_OUTERMOST_HEADER_ID
+# endif
+
+#endif /* _STLP_VECTOR */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/wchar.h b/src/STLport/wchar.h
new file mode 100644
index 0000000..30608d6
--- /dev/null
+++ b/src/STLport/wchar.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x278
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x278) && ! defined (_STLP_DONT_POP_0x278)
+#  define _STLP_DONT_POP_0x278
+# endif
+
+# if ! defined (_STLP_WINCE) && ! defined (_STLP_NO_WCHAR_T)
+
+# if defined ( __BORLANDC__ ) && (__BORLANDC__) >= 0x530
+// #  include <cstring>
+# include _STLP_NATIVE_CPP_C_HEADER(_str.h)
+using _STLP_VENDOR_CSTD::strlen;
+using _STLP_VENDOR_CSTD::strspn;
+# endif
+
+# if defined (__GNUC__) && defined (__APPLE__)
+#  include _STLP_NATIVE_C_HEADER(stddef.h)
+# else
+#  include _STLP_NATIVE_C_HEADER(wchar.h)
+# endif
+
+# endif /* WINCE */
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x278)
+#  if ! defined (_STLP_DONT_POP_0x278)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x278
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wctype.h b/src/STLport/wctype.h
new file mode 100644
index 0000000..f5de1e1
--- /dev/null
+++ b/src/STLport/wctype.h
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if !defined (_STLP_OUTERMOST_HEADER_ID)
+#  define _STLP_OUTERMOST_HEADER_ID 0x279
+#  include <stl/_prolog.h>
+# elif (_STLP_OUTERMOST_HEADER_ID == 0x279) && ! defined (_STLP_DONT_POP_0x279)
+#  define _STLP_DONT_POP_0x279
+# endif
+
+# include _STLP_NATIVE_C_HEADER(wctype.h)
+
+# if (_STLP_OUTERMOST_HEADER_ID == 0x279)
+#  if ! defined (_STLP_DONT_POP_0x279)
+#   include <stl/_epilog.h>
+#   undef  _STLP_OUTERMOST_HEADER_ID
+#   endif
+#   undef  _STLP_DONT_POP_0x279
+# endif
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/complex b/src/STLport/wrap_std/complex
new file mode 100644
index 0000000..0dc4e4e
--- /dev/null
+++ b/src/STLport/wrap_std/complex
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# include _STLP_NATIVE_HEADER(complex)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+
+using _STLP_COMPLEX_NAMESPACE::complex;
+
+using _STLP_COMPLEX_NAMESPACE::real;
+using _STLP_COMPLEX_NAMESPACE::imag;
+using _STLP_COMPLEX_NAMESPACE::abs;
+using _STLP_COMPLEX_NAMESPACE::arg;
+using _STLP_COMPLEX_NAMESPACE::norm;
+
+using _STLP_COMPLEX_NAMESPACE::conj;
+using _STLP_COMPLEX_NAMESPACE::polar;
+
+using _STLP_COMPLEX_NAMESPACE::cos;
+using _STLP_COMPLEX_NAMESPACE::cosh;
+using _STLP_COMPLEX_NAMESPACE::exp;
+using _STLP_COMPLEX_NAMESPACE::log;
+using _STLP_COMPLEX_NAMESPACE::log10;
+using _STLP_COMPLEX_NAMESPACE::pow;
+using _STLP_COMPLEX_NAMESPACE::sin;
+using _STLP_COMPLEX_NAMESPACE::sinh;
+using _STLP_COMPLEX_NAMESPACE::sqrt;
+using _STLP_COMPLEX_NAMESPACE::tan;
+using _STLP_COMPLEX_NAMESPACE::tanh;
+
+_STLP_END_NAMESPACE
+# endif /* USE_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/export b/src/STLport/wrap_std/export
new file mode 100644
index 0000000..f9b7305
--- /dev/null
+++ b/src/STLport/wrap_std/export
@@ -0,0 +1,13 @@
+./complex
+./export
+./fstream
+./iomanip
+./ios
+./iosfwd
+./iostream
+./istream
+./locale
+./ostream
+./sstream
+./streambuf
+./strstream
diff --git a/src/STLport/wrap_std/fstream b/src/STLport/wrap_std/fstream
new file mode 100644
index 0000000..b69e024
--- /dev/null
+++ b/src/STLport/wrap_std/fstream
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+# include _STLP_NATIVE_HEADER(fstream)
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/fstream>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+# else
+# include <wrap_std/h/fstream.h>
+# endif /* _STLP_USE_NEW_IOSTREAMS */
diff --git a/src/STLport/wrap_std/h/fstream.h b/src/STLport/wrap_std/h/fstream.h
new file mode 100644
index 0000000..27192c3
--- /dev/null
+++ b/src/STLport/wrap_std/h/fstream.h
@@ -0,0 +1,7 @@
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(fstream.h)
+# if defined  (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+#  include <using/h/fstream.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
diff --git a/src/STLport/wrap_std/h/iostream.h b/src/STLport/wrap_std/h/iostream.h
new file mode 100644
index 0000000..b523af6
--- /dev/null
+++ b/src/STLport/wrap_std/h/iostream.h
@@ -0,0 +1,11 @@
+// # ifndef  _STLP_NO_WCHAR_T
+// #   include <wchar.h>
+// # endif
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/iostream.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
diff --git a/src/STLport/wrap_std/h/streambuf.h b/src/STLport/wrap_std/h/streambuf.h
new file mode 100644
index 0000000..37fc08f
--- /dev/null
+++ b/src/STLport/wrap_std/h/streambuf.h
@@ -0,0 +1,9 @@
+//*TY 02/11/2000 - added missing header file
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+
+# if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/streambuf.h>
+_STLP_END_NAMESPACE
+# endif /* _STLP_USE_OWN_NAMESPACE */
diff --git a/src/STLport/wrap_std/h/strstream.h b/src/STLport/wrap_std/h/strstream.h
new file mode 100644
index 0000000..bf271be
--- /dev/null
+++ b/src/STLport/wrap_std/h/strstream.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#  if defined (_MSC_VER) && (_MSC_VER <= 1200)
+#   include _STLP_NATIVE_OLD_STREAMS_HEADER(strstrea.h)
+#  else
+#   include _STLP_NATIVE_OLD_STREAMS_HEADER(strstream.h)
+#  endif
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+#  include <using/h/strstream.h>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/iomanip b/src/STLport/wrap_std/iomanip
new file mode 100644
index 0000000..6c93073
--- /dev/null
+++ b/src/STLport/wrap_std/iomanip
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+#  include _STLP_NATIVE_HEADER(iomanip)
+
+#  ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+#   include <using/iomanip>
+_STLP_END_NAMESPACE
+#  endif /* _STLP_OWN_NAMESPACE */
+
+# else
+
+#  include _STLP_NATIVE_OLD_STREAMS_HEADER(iomanip.h)
+
+# if defined  (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+#   include <using/h/iomanip.h>
+_STLP_END_NAMESPACE
+#  endif /* _STLP_USE_OWN_NAMESPACE */
+
+# endif /* _STLP_USE_NEW_IOSTREAMS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/ios b/src/STLport/wrap_std/ios
new file mode 100644
index 0000000..765f4c9
--- /dev/null
+++ b/src/STLport/wrap_std/ios
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+#  include _STLP_NATIVE_HEADER(ios)
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+#  include <using/ios>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+# else
+#  include <wrap_std/h/iostream.h>
+# endif /* USE_NEW_IOSTREAMS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/iosfwd b/src/STLport/wrap_std/iosfwd
new file mode 100644
index 0000000..0582bda
--- /dev/null
+++ b/src/STLport/wrap_std/iosfwd
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_CSTDDEF
+#  include <cstddef> /* wchar_t */
+# endif
+
+# ifndef _STLP_CSTRING
+#  include <cstring>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+#   include _STLP_NATIVE_HEADER(iosfwd)
+
+#  if defined ( __MWERKS__ ) || defined (__KCC)
+// MSL leaves a few important things out of <iosfwd>.
+// We expect this to be fixed in later MSL implementations
+# if !defined( __MSL_CPP__ ) || __MSL_CPP__ <= 0x4105
+
+#    ifdef MSIPL_USING_NAMESPACE
+namespace std {
+#    endif
+
+// A few things that seem to be missing from CodeWarrior's <iosfwd>
+#    ifdef __MWERKS__
+template <class charT, class traits = char_traits<charT> >
+  class istreambuf_iterator;
+
+template <class charT, class traits = char_traits<charT> >
+  class ostreambuf_iterator;
+#    endif /* __MWERKS__ */
+
+#  if defined (_STLP_NO_NATIVE_WIDE_STREAMS)
+class streampos;
+#  endif
+
+#  ifdef MSIPL_USING_NAMESPACE
+	} // namespace std
+#    endif
+
+#   endif    /* __MSL__ version */
+#  endif  /* MWERKS */
+
+# else 
+
+_STLP_BEGIN_NAMESPACE
+template <class _Tp> class allocator;
+_STLP_END_NAMESPACE
+
+// use old-style iostreams
+#  include <iostream.h>
+#  include <fstream.h>
+
+#ifndef _STLP_CHAR_TRAITS_H
+// that defines char_traits or imports std::char_traits
+# include <stl/char_traits.h>
+#endif
+
+# endif /* _STLP_USE_NEW_IOSTREAMS */
+
+# ifdef _STLP_USE_ABBREVS
+#  define istream_iterator               _iS__It
+#  define ostream_iterator               _oS__It
+# endif
+
+# if  defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+#  include <using/iosfwd>
+_STLP_END_NAMESPACE
+# endif 
+
+// Local Variables:
+// mode:C++
+// End:
+
+
+
+
+
+
+
diff --git a/src/STLport/wrap_std/iostream b/src/STLport/wrap_std/iostream
new file mode 100644
index 0000000..4f522df
--- /dev/null
+++ b/src/STLport/wrap_std/iostream
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_MSVC) && (_STLP_MSVC < 1200)
+#  include <cwchar>
+// lower ifdef level
+#  include <ios>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+#  include _STLP_NATIVE_HEADER(iostream)
+#   if defined  (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+#    include <using/iostream>
+_STLP_END_NAMESPACE
+#  endif
+# else
+#  include <wrap_std/h/iostream.h>
+# endif /* _STLP_USE_NEW_STYLE_IOSTREAMS */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/istream b/src/STLport/wrap_std/istream
new file mode 100644
index 0000000..8d3647a
--- /dev/null
+++ b/src/STLport/wrap_std/istream
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_MSVC) && (_STLP_MSVC < 1200)
+// #  include <cwchar>
+// lower ifdef level
+#  include <ios>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+
+# include _STLP_NATIVE_HEADER(istream)
+
+# if defined  (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+#  include <using/istream>
+_STLP_END_NAMESPACE
+#  endif /* _STLP_OWN_NAMESPACE */
+
+# else
+
+# include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+# if defined  (_STLP_USE_NAMESPACES)
+_STLP_BEGIN_NAMESPACE
+using ::istream;
+// using ::ws;
+_STLP_END_NAMESPACE
+# endif /* NAMESPACES */
+
+# endif /* if defined (_STLP_USE_NEW_IOSTREAMS) */
+
+// Local Variables:
+// mode:C++
+// End:
+
diff --git a/src/STLport/wrap_std/locale b/src/STLport/wrap_std/locale
new file mode 100644
index 0000000..5c7e125
--- /dev/null
+++ b/src/STLport/wrap_std/locale
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# ifndef _STLP_CSTDLIB
+#  include <cstdlib>
+# endif
+
+# include _STLP_NATIVE_HEADER(locale)
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+#  include <using/locale>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/ostream b/src/STLport/wrap_std/ostream
new file mode 100644
index 0000000..d6d4fa8
--- /dev/null
+++ b/src/STLport/wrap_std/ostream
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_MSVC) && (_STLP_MSVC < 1200)
+// #  include <cwchar>
+// lower ifdef level
+#  include <ios>
+# endif
+
+# if defined (_STLP_USE_NEW_IOSTREAMS) || defined (__IN_STLPORT_OSTREAM)
+
+#  include _STLP_NATIVE_HEADER(ostream)
+
+#  if defined (_STLP_USE_OWN_NAMESPACE)
+_STLP_BEGIN_NAMESPACE
+# include <using/ostream>
+_STLP_END_NAMESPACE
+#   endif /* _STLP_OWN_NAMESPACE */
+
+# else
+
+#  include _STLP_NATIVE_OLD_STREAMS_HEADER(iostream.h)
+
+# if defined  (_STLP_USE_NAMESPACES) && ! defined (_STLP_BROKEN_USING_DIRECTIVE)
+_STLP_BEGIN_NAMESPACE
+# include <using/h/ostream.h>
+_STLP_END_NAMESPACE
+#   endif /* _STLP_NAMESPACE */
+# endif /* if defined (_STLP_USE_NEW_IOSTREAMS) */
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/sstream b/src/STLport/wrap_std/sstream
new file mode 100644
index 0000000..086c512
--- /dev/null
+++ b/src/STLport/wrap_std/sstream
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# include _STLP_NATIVE_HEADER(sstream)
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+#  include <using/sstream>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/streambuf b/src/STLport/wrap_std/streambuf
new file mode 100644
index 0000000..2c0dc58
--- /dev/null
+++ b/src/STLport/wrap_std/streambuf
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# if defined (_STLP_USE_NEW_IOSTREAMS)
+#  include _STLP_NATIVE_HEADER(streambuf)
+# else
+#  include <wrap_std/h/streambuf.h>		
+# endif
+
+# if defined (_STLP_USE_OWN_NAMESPACE) && defined (_STLP_USE_NEW_IOSTREAMS)
+_STLP_BEGIN_NAMESPACE
+#  include <using/streambuf> 
+_STLP_END_NAMESPACE
+# endif /* _STLP_OWN_NAMESPACE */
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/STLport/wrap_std/strstream b/src/STLport/wrap_std/strstream
new file mode 100644
index 0000000..28164cc
--- /dev/null
+++ b/src/STLport/wrap_std/strstream
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 1999 
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+# include _STLP_NATIVE_HEADER(strstream)
+
+# ifdef _STLP_USE_OWN_NAMESPACE
+_STLP_BEGIN_NAMESPACE
+#  include <using/strstream>
+_STLP_END_NAMESPACE
+#endif /* _STLP_OWN_NAMESPACE */
+
+
+// Local Variables:
+// mode:C++
+// End:
diff --git a/src/shapelib/dbfopen.c b/src/shapelib/dbfopen.c
new file mode 100644
index 0000000..edcab76
--- /dev/null
+++ b/src/shapelib/dbfopen.c
@@ -0,0 +1,1542 @@
+/******************************************************************************
+ * $Id: dbfopen.c,v 1.5 2004/11/01 15:11:39 juan Exp $
+ *
+ * Project:  Shapelib
+ * Purpose:  Implementation of .dbf access API documented in dbf_api.html.
+ * Author:   Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * This software is available under the following "MIT Style" license,
+ * or at the option of the licensee under the LGPL (see LICENSE.LGPL).  This
+ * option is discussed in more detail in shapelib.html.
+ *
+ * --
+ * 
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: dbfopen.c,v $
+ * Revision 1.5  2004/11/01 15:11:39  juan
+ * Warnings removidos
+ *
+ * Revision 1.4  2004/04/29 14:48:57  lubia
+ * modificacao de tempo
+ *
+ * Revision 1.3  2004/02/20 14:10:42  lubia
+ * Migrando para ultima versao da shapelib: 1.2.10
+ *
+ * Revision 1.48  2003/03/10 14:51:27  warmerda
+ * DBFWrite* calls now return FALSE if they have to truncate
+ *
+ * Revision 1.47  2002/11/20 03:32:22  warmerda
+ * Ensure field name in DBFGetFieldIndex() is properly terminated.
+ *
+ * Revision 1.46  2002/10/09 13:10:21  warmerda
+ * Added check that width is positive.
+ *
+ * Revision 1.45  2002/09/29 00:00:08  warmerda
+ * added FTLogical and logical attribute read/write calls
+ *
+ * Revision 1.44  2002/05/07 13:46:11  warmerda
+ * Added DBFWriteAttributeDirectly().
+ *
+ * Revision 1.43  2002/02/13 19:39:21  warmerda
+ * Fix casting issues in DBFCloneEmpty().
+ *
+ * Revision 1.42  2002/01/15 14:36:07  warmerda
+ * updated email address
+ *
+ * Revision 1.41  2002/01/15 14:31:49  warmerda
+ * compute rather than copying nHeaderLength in DBFCloneEmpty()
+ *
+ * Revision 1.40  2002/01/09 04:32:35  warmerda
+ * fixed to read correct amount of header
+ *
+ * Revision 1.39  2001/12/11 22:41:03  warmerda
+ * improve io related error checking when reading header
+ *
+ * Revision 1.38  2001/11/28 16:07:31  warmerda
+ * Cleanup to avoid compiler warnings as suggested by Richard Hash.
+ *
+ * Revision 1.37  2001/07/04 05:18:09  warmerda
+ * do last fix properly
+ *
+ * Revision 1.36  2001/07/04 05:16:09  warmerda
+ * fixed fieldname comparison in DBFGetFieldIndex
+ *
+ * Revision 1.35  2001/06/22 02:10:06  warmerda
+ * fixed NULL shape support with help from Jim Matthews
+ *
+ * Revision 1.33  2001/05/31 19:20:13  warmerda
+ * added DBFGetFieldIndex()
+ *
+ * Revision 1.32  2001/05/31 18:15:40  warmerda
+ * Added support for NULL fields in DBF files
+ *
+ * Revision 1.31  2001/05/23 13:36:52  warmerda
+ * added use of SHPAPI_CALL
+ *
+ * Revision 1.30  2000/12/05 14:43:38  warmerda
+ * DBReadAttribute() white space trimming bug fix
+ *
+ * Revision 1.29  2000/10/05 14:36:44  warmerda
+ * fix bug with writing very wide numeric fields
+ *
+ * Revision 1.28  2000/09/25 14:18:07  warmerda
+ * Added some casts of strlen() return result to fix warnings on some
+ * systems, as submitted by Daniel.
+ *
+ * Revision 1.27  2000/09/25 14:15:51  warmerda
+ * added DBFGetNativeFieldType()
+ *
+ * Revision 1.26  2000/07/07 13:39:45  warmerda
+ * removed unused variables, and added system include files
+ *
+ * Revision 1.25  2000/05/29 18:19:13  warmerda
+ * avoid use of uchar, and adding casting fix
+ *
+ * Revision 1.24  2000/05/23 13:38:27  warmerda
+ * Added error checks on return results of fread() and fseek().
+ *
+ * Revision 1.23  2000/05/23 13:25:49  warmerda
+ * Avoid crashing if field or record are out of range in dbfread*attribute().
+ *
+ * Revision 1.22  1999/12/15 13:47:24  warmerda
+ * Added stdlib.h to ensure that atof() is prototyped.
+ *
+ * Revision 1.21  1999/12/13 17:25:46  warmerda
+ * Added support for upper case .DBF extention.
+ *
+ * Revision 1.20  1999/11/30 16:32:11  warmerda
+ * Use atof() instead of sscanf().
+ *
+ * Revision 1.19  1999/11/05 14:12:04  warmerda
+ * updated license terms
+ *
+ * Revision 1.18  1999/07/27 00:53:28  warmerda
+ * ensure that whole old field value clear on write of string
+ *
+ * Revision 1.1  1999/07/05 18:58:07  warmerda
+ * New
+ *
+ * Revision 1.17  1999/06/11 19:14:12  warmerda
+ * Fixed some memory leaks.
+ *
+ * Revision 1.16  1999/06/11 19:04:11  warmerda
+ * Remoted some unused variables.
+ *
+ * Revision 1.15  1999/05/11 03:19:28  warmerda
+ * added new Tuple api, and improved extension handling - add from candrsn
+ *
+ * Revision 1.14  1999/05/04 15:01:48  warmerda
+ * Added 'F' support.
+ *
+ * Revision 1.13  1999/03/23 17:38:59  warmerda
+ * DBFAddField() now actually does return the new field number, or -1 if
+ * it fails.
+ *
+ * Revision 1.12  1999/03/06 02:54:46  warmerda
+ * Added logic to convert shapefile name to dbf filename in DBFOpen()
+ * for convenience.
+ *
+ * Revision 1.11  1998/12/31 15:30:34  warmerda
+ * Improved the interchangability of numeric and string attributes.  Add
+ * white space trimming option for attributes.
+ *
+ * Revision 1.10  1998/12/03 16:36:44  warmerda
+ * Use r+b instead of rb+ for binary access.
+ *
+ * Revision 1.9  1998/12/03 15:34:23  warmerda
+ * Updated copyright message.
+ *
+ * Revision 1.8  1997/12/04 15:40:15  warmerda
+ * Added newline character after field definitions.
+ *
+ * Revision 1.7  1997/03/06 14:02:10  warmerda
+ * Ensure bUpdated is initialized.
+ *
+ * Revision 1.6  1996/02/12 04:54:41  warmerda
+ * Ensure that DBFWriteAttribute() returns TRUE if it succeeds.
+ *
+ * Revision 1.5  1995/10/21  03:15:12  warmerda
+ * Changed to use binary file access, and ensure that the
+ * field name field is zero filled, and limited to 10 chars.
+ *
+ * Revision 1.4  1995/08/24  18:10:42  warmerda
+ * Added use of SfRealloc() to avoid pre-ANSI realloc() functions such
+ * as on the Sun.
+ *
+ * Revision 1.3  1995/08/04  03:15:16  warmerda
+ * Fixed up header.
+ *
+ * Revision 1.2  1995/08/04  03:14:43  warmerda
+ * Added header.
+ */
+
+/* static char rcsid[] = 
+  "$Id: dbfopen.c,v 1.5 2004/11/01 15:11:39 juan Exp $"; */
+
+#include "shapefil.h"
+
+#include <math.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <string.h>
+
+#ifndef FALSE
+#  define FALSE		0
+#  define TRUE		1
+#endif
+
+static int	nStringFieldLen = 0;
+static char * pszStringField = NULL;
+
+/************************************************************************/
+/*                             SfRealloc()                              */
+/*                                                                      */
+/*      A realloc cover function that will access a NULL pointer as     */
+/*      a valid input.                                                  */
+/************************************************************************/
+
+static void * SfRealloc( void * pMem, int nNewSize )
+
+{
+    if( pMem == NULL )
+        return( (void *) malloc(nNewSize) );
+    else
+        return( (void *) realloc(pMem,nNewSize) );
+}
+
+/************************************************************************/
+/*                           DBFWriteHeader()                           */
+/*                                                                      */
+/*      This is called to write out the file header, and field          */
+/*      descriptions before writing any actual data records.  This      */
+/*      also computes all the DBFDataSet field offset/size/decimals     */
+/*      and so forth values.                                            */
+/************************************************************************/
+
+static void DBFWriteHeader(DBFHandle psDBF)
+
+{
+    unsigned char	abyHeader[XBASE_FLDHDR_SZ];
+    int		i;
+
+    if( !psDBF->bNoHeader )
+        return;
+
+    psDBF->bNoHeader = FALSE;
+
+/* -------------------------------------------------------------------- */
+/*	Initialize the file header information.				*/
+/* -------------------------------------------------------------------- */
+    for( i = 0; i < XBASE_FLDHDR_SZ; i++ )
+        abyHeader[i] = 0;
+
+    abyHeader[0] = 0x03;		/* memo field? - just copying 	*/
+
+    /* date updated on close, record count preset at zero */
+
+    abyHeader[8] = psDBF->nHeaderLength % 256;
+    abyHeader[9] = psDBF->nHeaderLength / 256;
+    
+    abyHeader[10] = psDBF->nRecordLength % 256;
+    abyHeader[11] = psDBF->nRecordLength / 256;
+
+/* -------------------------------------------------------------------- */
+/*      Write the initial 32 byte file header, and all the field        */
+/*      descriptions.                                     		*/
+/* -------------------------------------------------------------------- */
+    fseek( psDBF->fp, 0, 0 );
+    fwrite( abyHeader, XBASE_FLDHDR_SZ, 1, psDBF->fp );
+    fwrite( psDBF->pszHeader, XBASE_FLDHDR_SZ, psDBF->nFields, psDBF->fp );
+
+/* -------------------------------------------------------------------- */
+/*      Write out the newline character if there is room for it.        */
+/* -------------------------------------------------------------------- */
+    if( psDBF->nHeaderLength > 32*psDBF->nFields + 32 )
+    {
+        char	cNewline;
+
+        cNewline = 0x0d;
+        fwrite( &cNewline, 1, 1, psDBF->fp );
+    }
+}
+
+/************************************************************************/
+/*                           DBFFlushRecord()                           */
+/*                                                                      */
+/*      Write out the current record if there is one.                   */
+/************************************************************************/
+
+static void DBFFlushRecord( DBFHandle psDBF )
+
+{
+    int		nRecordOffset;
+
+    if( psDBF->bCurrentRecordModified && psDBF->nCurrentRecord > -1 )
+    {
+	psDBF->bCurrentRecordModified = FALSE;
+
+	nRecordOffset = psDBF->nRecordLength * psDBF->nCurrentRecord 
+	                                             + psDBF->nHeaderLength;
+
+	fseek( psDBF->fp, nRecordOffset, 0 );
+	fwrite( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+    }
+}
+
+/************************************************************************/
+/*                              DBFOpen()                               */
+/*                                                                      */
+/*      Open a .dbf file.                                               */
+/************************************************************************/
+   
+DBFHandle SHPAPI_CALL
+DBFOpen( const char * pszFilename, const char * pszAccess )
+
+{
+    DBFHandle		psDBF;
+    unsigned char		*pabyBuf;
+    int			nFields, nHeadLen, nRecLen, iField, i;
+    char		*pszBasename, *pszFullname;
+
+/* -------------------------------------------------------------------- */
+/*      We only allow the access strings "rb" and "r+".                  */
+/* -------------------------------------------------------------------- */
+    if( strcmp(pszAccess,"r") != 0 && strcmp(pszAccess,"r+") != 0 
+        && strcmp(pszAccess,"rb") != 0 && strcmp(pszAccess,"rb+") != 0
+        && strcmp(pszAccess,"r+b") != 0 )
+        return( NULL );
+
+    if( strcmp(pszAccess,"r") == 0 )
+        pszAccess = "rb";
+ 
+    if( strcmp(pszAccess,"r+") == 0 )
+        pszAccess = "rb+";
+
+/* -------------------------------------------------------------------- */
+/*	Compute the base (layer) name.  If there is any extension	*/
+/*	on the passed in filename we will strip it off.			*/
+/* -------------------------------------------------------------------- */
+    pszBasename = (char *) malloc(strlen(pszFilename)+5);
+    strcpy( pszBasename, pszFilename );
+    for( i = strlen(pszBasename)-1; 
+	 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+	       && pszBasename[i] != '\\';
+	 i-- ) {}
+
+    if( pszBasename[i] == '.' )
+        pszBasename[i] = '\0';
+
+    pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+    sprintf( pszFullname, "%s.dbf", pszBasename );
+        
+    psDBF = (DBFHandle) calloc( 1, sizeof(DBFInfo) );
+    psDBF->fp = fopen( pszFullname, pszAccess );
+
+    if( psDBF->fp == NULL )
+    {
+        sprintf( pszFullname, "%s.DBF", pszBasename );
+        psDBF->fp = fopen(pszFullname, pszAccess );
+    }
+    
+    free( pszBasename );
+    free( pszFullname );
+    
+    if( psDBF->fp == NULL )
+    {
+        free( psDBF );
+        return( NULL );
+    }
+
+    psDBF->bNoHeader = FALSE;
+    psDBF->nCurrentRecord = -1;
+    psDBF->bCurrentRecordModified = FALSE;
+
+/* -------------------------------------------------------------------- */
+/*  Read Table Header info                                              */
+/* -------------------------------------------------------------------- */
+    pabyBuf = (unsigned char *) malloc(500);
+    if( fread( pabyBuf, 32, 1, psDBF->fp ) != 1 )
+    {
+        fclose( psDBF->fp );
+        free( pabyBuf );
+        free( psDBF );
+        return NULL;
+    }
+
+    psDBF->nRecords = 
+     pabyBuf[4] + pabyBuf[5]*256 + pabyBuf[6]*256*256 + pabyBuf[7]*256*256*256;
+
+    psDBF->nHeaderLength = nHeadLen = pabyBuf[8] + pabyBuf[9]*256;
+    psDBF->nRecordLength = nRecLen = pabyBuf[10] + pabyBuf[11]*256;
+    
+    psDBF->nFields = nFields = (nHeadLen - 32) / 32;
+
+    psDBF->pszCurrentRecord = (char *) malloc(nRecLen);
+
+/* -------------------------------------------------------------------- */
+/*  Read in Field Definitions                                           */
+/* -------------------------------------------------------------------- */
+    
+    pabyBuf = (unsigned char *) SfRealloc(pabyBuf,nHeadLen);
+    psDBF->pszHeader = (char *) pabyBuf;
+
+    fseek( psDBF->fp, 32, 0 );
+    if( fread( pabyBuf, nHeadLen-32, 1, psDBF->fp ) != 1 )
+    {
+        fclose( psDBF->fp );
+        free( pabyBuf );
+        free( psDBF );
+        return NULL;
+    }
+
+    psDBF->panFieldOffset = (int *) malloc(sizeof(int) * nFields);
+    psDBF->panFieldSize = (int *) malloc(sizeof(int) * nFields);
+    psDBF->panFieldDecimals = (int *) malloc(sizeof(int) * nFields);
+    psDBF->pachFieldType = (char *) malloc(sizeof(char) * nFields);
+
+    for( iField = 0; iField < nFields; iField++ )
+    {
+	unsigned char		*pabyFInfo;
+
+	pabyFInfo = pabyBuf+iField*32;
+
+	if( pabyFInfo[11] == 'N' || pabyFInfo[11] == 'F' )
+	{
+	    psDBF->panFieldSize[iField] = pabyFInfo[16];
+	    psDBF->panFieldDecimals[iField] = pabyFInfo[17];
+	}
+	else
+	{
+	    psDBF->panFieldSize[iField] = pabyFInfo[16] + pabyFInfo[17]*256;
+	    psDBF->panFieldDecimals[iField] = 0;
+	}
+
+	psDBF->pachFieldType[iField] = (char) pabyFInfo[11];
+	if( iField == 0 )
+	    psDBF->panFieldOffset[iField] = 1;
+	else
+	    psDBF->panFieldOffset[iField] = 
+	      psDBF->panFieldOffset[iField-1] + psDBF->panFieldSize[iField-1];
+    }
+
+    return( psDBF );
+}
+
+/************************************************************************/
+/*                              DBFClose()                              */
+/************************************************************************/
+
+void SHPAPI_CALL
+DBFClose(DBFHandle psDBF)
+{
+/* -------------------------------------------------------------------- */
+/*      Write out header if not already written.                        */
+/* -------------------------------------------------------------------- */
+    if( psDBF->bNoHeader )
+        DBFWriteHeader( psDBF );
+
+    DBFFlushRecord( psDBF );
+
+/* -------------------------------------------------------------------- */
+/*      Update last access date, and number of records if we have	*/
+/*	write access.                					*/
+/* -------------------------------------------------------------------- */
+    if( psDBF->bUpdated )
+    {
+	unsigned char		abyFileHeader[32];
+
+	fseek( psDBF->fp, 0, 0 );
+	fread( abyFileHeader, 32, 1, psDBF->fp );
+
+	abyFileHeader[1] = 95;			/* YY */
+	abyFileHeader[2] = 7;			/* MM */
+	abyFileHeader[3] = 26;			/* DD */
+
+	abyFileHeader[4] = psDBF->nRecords % 256;
+	abyFileHeader[5] = (psDBF->nRecords/256) % 256;
+	abyFileHeader[6] = (psDBF->nRecords/(256*256)) % 256;
+	abyFileHeader[7] = (psDBF->nRecords/(256*256*256)) % 256;
+
+	fseek( psDBF->fp, 0, 0 );
+	fwrite( abyFileHeader, 32, 1, psDBF->fp );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Close, and free resources.                                      */
+/* -------------------------------------------------------------------- */
+    fclose( psDBF->fp );
+
+    if( psDBF->panFieldOffset != NULL )
+    {
+        free( psDBF->panFieldOffset );
+        free( psDBF->panFieldSize );
+        free( psDBF->panFieldDecimals );
+        free( psDBF->pachFieldType );
+    }
+
+    free( psDBF->pszHeader );
+    free( psDBF->pszCurrentRecord );
+
+    free( psDBF );
+
+    if( pszStringField != NULL )
+    {
+        free( pszStringField );
+        pszStringField = NULL;
+        nStringFieldLen = 0;
+    }
+}
+
+/************************************************************************/
+/*                             DBFCreate()                              */
+/*                                                                      */
+/*      Create a new .dbf file.                                         */
+/************************************************************************/
+
+DBFHandle SHPAPI_CALL
+DBFCreate( const char * pszFilename )
+
+{
+    DBFHandle	psDBF;
+    FILE	*fp;
+    char	*pszFullname, *pszBasename;
+    int		i;
+
+/* -------------------------------------------------------------------- */
+/*	Compute the base (layer) name.  If there is any extension	*/
+/*	on the passed in filename we will strip it off.			*/
+/* -------------------------------------------------------------------- */
+    pszBasename = (char *) malloc(strlen(pszFilename)+5);
+    strcpy( pszBasename, pszFilename );
+    for( i = strlen(pszBasename)-1; 
+	 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+	       && pszBasename[i] != '\\';
+	 i-- ) {}
+
+    if( pszBasename[i] == '.' )
+        pszBasename[i] = '\0';
+
+    pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+    sprintf( pszFullname, "%s.dbf", pszBasename );
+    free( pszBasename );
+
+/* -------------------------------------------------------------------- */
+/*      Create the file.                                                */
+/* -------------------------------------------------------------------- */
+    fp = fopen( pszFullname, "wb" );
+    if( fp == NULL )
+        return( NULL );
+
+    fputc( 0, fp );
+    fclose( fp );
+
+    fp = fopen( pszFullname, "rb+" );
+    if( fp == NULL )
+        return( NULL );
+
+    free( pszFullname );
+
+/* -------------------------------------------------------------------- */
+/*	Create the info structure.					*/
+/* -------------------------------------------------------------------- */
+    psDBF = (DBFHandle) malloc(sizeof(DBFInfo));
+
+    psDBF->fp = fp;
+    psDBF->nRecords = 0;
+    psDBF->nFields = 0;
+    psDBF->nRecordLength = 1;
+    psDBF->nHeaderLength = 33;
+    
+    psDBF->panFieldOffset = NULL;
+    psDBF->panFieldSize = NULL;
+    psDBF->panFieldDecimals = NULL;
+    psDBF->pachFieldType = NULL;
+    psDBF->pszHeader = NULL;
+
+    psDBF->nCurrentRecord = -1;
+    psDBF->bCurrentRecordModified = FALSE;
+    psDBF->pszCurrentRecord = NULL;
+
+    psDBF->bNoHeader = TRUE;
+
+    return( psDBF );
+}
+
+/************************************************************************/
+/*                            DBFAddField()                             */
+/*                                                                      */
+/*      Add a field to a newly created .dbf file before any records     */
+/*      are written.                                                    */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFAddField(DBFHandle psDBF, const char * pszFieldName, 
+            DBFFieldType eType, int nWidth, int nDecimals )
+
+{
+    char	*pszFInfo;
+    int		i;
+
+/* -------------------------------------------------------------------- */
+/*      Do some checking to ensure we can add records to this file.     */
+/* -------------------------------------------------------------------- */
+    if( psDBF->nRecords > 0 )
+        return( -1 );
+
+    if( !psDBF->bNoHeader )
+        return( -1 );
+
+    if( eType != FTDouble && nDecimals != 0 )
+        return( -1 );
+
+    if( nWidth < 1 )
+        return -1;
+
+/* -------------------------------------------------------------------- */
+/*      SfRealloc all the arrays larger to hold the additional field      */
+/*      information.                                                    */
+/* -------------------------------------------------------------------- */
+    psDBF->nFields++;
+
+    psDBF->panFieldOffset = (int *) 
+      SfRealloc( psDBF->panFieldOffset, sizeof(int) * psDBF->nFields );
+
+    psDBF->panFieldSize = (int *) 
+      SfRealloc( psDBF->panFieldSize, sizeof(int) * psDBF->nFields );
+
+    psDBF->panFieldDecimals = (int *) 
+      SfRealloc( psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields );
+
+    psDBF->pachFieldType = (char *) 
+      SfRealloc( psDBF->pachFieldType, sizeof(char) * psDBF->nFields );
+
+/* -------------------------------------------------------------------- */
+/*      Assign the new field information fields.                        */
+/* -------------------------------------------------------------------- */
+    psDBF->panFieldOffset[psDBF->nFields-1] = psDBF->nRecordLength;
+    psDBF->nRecordLength += nWidth;
+    psDBF->panFieldSize[psDBF->nFields-1] = nWidth;
+    psDBF->panFieldDecimals[psDBF->nFields-1] = nDecimals;
+
+    if( eType == FTDate )
+        psDBF->pachFieldType[psDBF->nFields-1] = 'D';
+    else if( eType == FTLogical )
+        psDBF->pachFieldType[psDBF->nFields-1] = 'L';
+    else if( eType == FTString )
+        psDBF->pachFieldType[psDBF->nFields-1] = 'C';
+    else
+        psDBF->pachFieldType[psDBF->nFields-1] = 'N';
+
+/* -------------------------------------------------------------------- */
+/*      Extend the required header information.                         */
+/* -------------------------------------------------------------------- */
+    psDBF->nHeaderLength += 32;
+    psDBF->bUpdated = FALSE;
+
+    psDBF->pszHeader = (char *) SfRealloc(psDBF->pszHeader,psDBF->nFields*32);
+
+    pszFInfo = psDBF->pszHeader + 32 * (psDBF->nFields-1);
+
+    for( i = 0; i < 32; i++ )
+        pszFInfo[i] = '\0';
+
+    if( (int) strlen(pszFieldName) < 10 )
+        strncpy( pszFInfo, pszFieldName, strlen(pszFieldName));
+    else
+        strncpy( pszFInfo, pszFieldName, 10);
+
+    pszFInfo[11] = psDBF->pachFieldType[psDBF->nFields-1];
+
+    if( eType == FTDate )
+    {
+        pszFInfo[16] = 8 % 256;
+        pszFInfo[17] = 8 / 256;
+    }
+    else if( eType == FTString )
+    {
+        pszFInfo[16] = nWidth % 256;
+        pszFInfo[17] = nWidth / 256;
+    }
+    else
+    {
+        pszFInfo[16] = nWidth;
+        pszFInfo[17] = nDecimals;
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Make the current record buffer appropriately larger.            */
+/* -------------------------------------------------------------------- */
+    psDBF->pszCurrentRecord = (char *) SfRealloc(psDBF->pszCurrentRecord,
+					       psDBF->nRecordLength);
+
+    return( psDBF->nFields-1 );
+}
+
+/************************************************************************/
+/*                          DBFReadAttribute()                          */
+/*                                                                      */
+/*      Read one of the attribute fields of a record.                   */
+/************************************************************************/
+
+static void *DBFReadAttribute(DBFHandle psDBF, int hEntity, int iField,
+                              char chReqType )
+
+{
+    int	       	nRecordOffset;
+    unsigned char	*pabyRec;
+    void	*pReturnField = NULL;
+
+    static double dDoubleField;
+
+/* -------------------------------------------------------------------- */
+/*      Verify selection.                                               */
+/* -------------------------------------------------------------------- */
+    if( hEntity < 0 || hEntity >= psDBF->nRecords )
+        return( NULL );
+
+    if( iField < 0 || iField >= psDBF->nFields )
+        return( NULL );
+
+/* -------------------------------------------------------------------- */
+/*	Have we read the record?					*/
+/* -------------------------------------------------------------------- */
+    if( psDBF->nCurrentRecord != hEntity )
+    {
+	DBFFlushRecord( psDBF );
+
+	nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+	if( fseek( psDBF->fp, nRecordOffset, 0 ) != 0 )
+        {
+            fprintf( stderr, "fseek(%d) failed on DBF file.\n",
+                     nRecordOffset );
+            return NULL;
+        }
+
+	if( fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 
+                   1, psDBF->fp ) != 1 )
+        {
+            fprintf( stderr, "fread(%d) failed on DBF file.\n",
+                     psDBF->nRecordLength );
+            return NULL;
+        }
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+    pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+/* -------------------------------------------------------------------- */
+/*	Ensure our field buffer is large enough to hold this buffer.	*/
+/* -------------------------------------------------------------------- */
+    if( psDBF->panFieldSize[iField]+1 > nStringFieldLen )
+    {
+	nStringFieldLen = psDBF->panFieldSize[iField]*2 + 10;
+	pszStringField = (char *) SfRealloc(pszStringField,nStringFieldLen);
+    }
+
+/* -------------------------------------------------------------------- */
+/*	Extract the requested field.					*/
+/* -------------------------------------------------------------------- */
+    strncpy( pszStringField, 
+	     ((const char *) pabyRec) + psDBF->panFieldOffset[iField],
+	     psDBF->panFieldSize[iField] );
+    pszStringField[psDBF->panFieldSize[iField]] = '\0';
+
+    pReturnField = pszStringField;
+
+/* -------------------------------------------------------------------- */
+/*      Decode the field.                                               */
+/* -------------------------------------------------------------------- */
+    if( chReqType == 'D' )
+    {
+		char dateField[11];
+		sprintf(dateField,"%4s/%2s/%2s",pszStringField,pszStringField+4,pszStringField+6);
+		dateField[10] = '\0';
+		pReturnField = dateField;
+    }   
+	else if( chReqType == 'N' )
+    {
+        dDoubleField = atof(pszStringField);
+
+	pReturnField = &dDoubleField;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Should we trim white space off the string attribute value?      */
+/* -------------------------------------------------------------------- */
+#ifdef TRIM_DBF_WHITESPACE
+    else
+    {
+        char	*pchSrc, *pchDst;
+
+        pchDst = pchSrc = pszStringField;
+        while( *pchSrc == ' ' )
+            pchSrc++;
+
+        while( *pchSrc != '\0' )
+            *(pchDst++) = *(pchSrc++);
+        *pchDst = '\0';
+
+        while( pchDst != pszStringField && *(--pchDst) == ' ' )
+            *pchDst = '\0';
+    }
+#endif
+    
+    return( pReturnField );
+}
+
+/************************************************************************/
+/*                        DBFReadIntAttribute()                         */
+/*                                                                      */
+/*      Read an integer attribute.                                      */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFReadIntegerAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    double	*pdValue;
+
+    pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' );
+
+    if( pdValue == NULL )
+        return 0;
+    else
+        return( (int) *pdValue );
+}
+
+/************************************************************************/
+/*                        DBFReadDoubleAttribute()                      */
+/*                                                                      */
+/*      Read a double attribute.                                        */
+/************************************************************************/
+
+double SHPAPI_CALL
+DBFReadDoubleAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    double	*pdValue;
+
+    pdValue = (double *) DBFReadAttribute( psDBF, iRecord, iField, 'N' );
+
+    if( pdValue == NULL )
+        return 0.0;
+    else
+        return( *pdValue );
+}
+
+/************************************************************************/
+/*                        DBFReadStringAttribute()                      */
+/*                                                                      */
+/*      Read a string attribute.                                        */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadStringAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'C' ) );
+}
+
+/************************************************************************/
+/*                        DBFReadStringAttribute()                      */
+/*                                                                      */
+/*      Read a string attribute.                                        */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadDateAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'D' ) );
+}
+
+/************************************************************************/
+/*                        DBFReadLogicalAttribute()                     */
+/*                                                                      */
+/*      Read a logical attribute.                                       */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadLogicalAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    return( (const char *) DBFReadAttribute( psDBF, iRecord, iField, 'L' ) );
+}
+
+/************************************************************************/
+/*                         DBFIsAttributeNULL()                         */
+/*                                                                      */
+/*      Return TRUE if value for field is NULL.                         */
+/*                                                                      */
+/*      Contributed by Jim Matthews.                                    */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFIsAttributeNULL( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    const char	*pszValue;
+
+    pszValue = DBFReadStringAttribute( psDBF, iRecord, iField );
+
+    switch(psDBF->pachFieldType[iField])
+    {
+      case 'N':
+      case 'F':
+        /* NULL numeric fields have value "****************" */
+        return pszValue[0] == '*';
+
+      case 'D':
+        /* NULL date fields have value "00000000" */
+        return strncmp(pszValue,"00000000",8) == 0;
+
+      case 'L':
+        /* NULL boolean fields have value "?" */ 
+        return pszValue[0] == '?';
+
+      default:
+        /* empty string fields are considered NULL */
+        return strlen(pszValue) == 0;
+    }
+}
+
+/************************************************************************/
+/*                          DBFGetFieldCount()                          */
+/*                                                                      */
+/*      Return the number of fields in this table.                      */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFGetFieldCount( DBFHandle psDBF )
+
+{
+    return( psDBF->nFields );
+}
+
+/************************************************************************/
+/*                         DBFGetRecordCount()                          */
+/*                                                                      */
+/*      Return the number of records in this table.                     */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFGetRecordCount( DBFHandle psDBF )
+
+{
+    return( psDBF->nRecords );
+}
+
+/************************************************************************/
+/*                          DBFGetFieldInfo()                           */
+/*                                                                      */
+/*      Return any requested information about the field.               */
+/************************************************************************/
+
+DBFFieldType SHPAPI_CALL
+DBFGetFieldInfo( DBFHandle psDBF, int iField, char * pszFieldName,
+                 int * pnWidth, int * pnDecimals )
+
+{
+    if( iField < 0 || iField >= psDBF->nFields )
+        return( FTInvalid );
+
+    if( pnWidth != NULL )
+        *pnWidth = psDBF->panFieldSize[iField];
+
+    if( pnDecimals != NULL )
+        *pnDecimals = psDBF->panFieldDecimals[iField];
+
+    if( pszFieldName != NULL )
+    {
+	int	i;
+
+	strncpy( pszFieldName, (char *) psDBF->pszHeader+iField*32, 11 );
+	pszFieldName[11] = '\0';
+	for( i = 10; i > 0 && pszFieldName[i] == ' '; i-- )
+	    pszFieldName[i] = '\0';
+    }
+
+    if ( psDBF->pachFieldType[iField] == 'L' )
+	return( FTLogical);
+	else if ( psDBF->pachFieldType[iField] == 'D')
+		return (FTDate);
+    else if( psDBF->pachFieldType[iField] == 'N' || psDBF->pachFieldType[iField] == 'F')
+    {
+		if( psDBF->panFieldDecimals[iField] > 0 )
+			return( FTDouble );
+		else
+			return( FTInteger );
+    }
+    else
+    {
+		return( FTString );
+    }
+}
+
+/************************************************************************/
+/*                         DBFWriteAttribute()                          */
+/*																		*/
+/*	Write an attribute record to the file.								*/
+/************************************************************************/
+
+static int DBFWriteAttribute(DBFHandle psDBF, int hEntity, int iField,
+			     void * pValue )
+
+{
+    int	       	nRecordOffset, i, j, nRetResult = TRUE;
+    unsigned char	*pabyRec;
+    char	szSField[400], szFormat[20];
+
+/* -------------------------------------------------------------------- */
+/*	Is this a valid record?						*/
+/* -------------------------------------------------------------------- */
+    if( hEntity < 0 || hEntity > psDBF->nRecords )
+        return( FALSE );
+
+    if( psDBF->bNoHeader )
+        DBFWriteHeader(psDBF);
+
+/* -------------------------------------------------------------------- */
+/*      Is this a brand new record?                                     */
+/* -------------------------------------------------------------------- */
+    if( hEntity == psDBF->nRecords )
+    {
+	DBFFlushRecord( psDBF );
+
+	psDBF->nRecords++;
+	for( i = 0; i < psDBF->nRecordLength; i++ )
+	    psDBF->pszCurrentRecord[i] = ' ';
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Is this an existing record, but different than the last one     */
+/*      we accessed?                                                    */
+/* -------------------------------------------------------------------- */
+    if( psDBF->nCurrentRecord != hEntity )
+    {
+	DBFFlushRecord( psDBF );
+
+	nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+	fseek( psDBF->fp, nRecordOffset, 0 );
+	fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+    pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+    psDBF->bCurrentRecordModified = TRUE;
+    psDBF->bUpdated = TRUE;
+
+/* -------------------------------------------------------------------- */
+/*      Translate NULL value to valid DBF file representation.          */
+/*                                                                      */
+/*      Contributed by Jim Matthews.                                    */
+/* -------------------------------------------------------------------- */
+    if( pValue == NULL )
+    {
+        switch(psDBF->pachFieldType[iField])
+        {
+          case 'N':
+          case 'F':
+	    /* NULL numeric fields have value "****************" */
+            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '*', 
+                    psDBF->panFieldSize[iField] );
+            break;
+
+          case 'D':
+	    /* NULL date fields have value "00000000" */
+            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '0', 
+                    psDBF->panFieldSize[iField] );
+            break;
+
+          case 'L':
+	    /* NULL boolean fields have value "?" */ 
+            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '?', 
+                    psDBF->panFieldSize[iField] );
+            break;
+
+          default:
+            /* empty string fields are considered NULL */
+            memset( (char *) (pabyRec+psDBF->panFieldOffset[iField]), '\0', 
+                    psDBF->panFieldSize[iField] );
+            break;
+        }
+        return TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Assign all the record fields.                                   */
+/* -------------------------------------------------------------------- */
+	switch( psDBF->pachFieldType[iField] )
+	{
+	case 'N':
+	case 'F':
+		if( psDBF->panFieldDecimals[iField] == 0 )
+		{
+			int	nWidth = psDBF->panFieldSize[iField];
+
+			if( sizeof(szSField)-2 < (unsigned int)nWidth )
+			nWidth = sizeof(szSField)-2;
+
+			sprintf( szFormat, "%%%dd", nWidth );
+			sprintf(szSField, szFormat, (int) *((double *) pValue) );
+			if( (int)strlen(szSField) > psDBF->panFieldSize[iField] )
+			{
+				szSField[psDBF->panFieldSize[iField]] = '\0';
+				nRetResult = FALSE;
+			}
+
+			strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),
+			szSField, strlen(szSField) );
+		}
+		else
+		{
+			int		nWidth = psDBF->panFieldSize[iField];
+
+			if( sizeof(szSField)-2 < (unsigned int)nWidth )
+			nWidth = sizeof(szSField)-2;
+
+			sprintf( szFormat, "%%%d.%df", 
+			nWidth, psDBF->panFieldDecimals[iField] );
+			sprintf(szSField, szFormat, *((double *) pValue) );
+			if( (int) strlen(szSField) > psDBF->panFieldSize[iField] )
+			{
+				szSField[psDBF->panFieldSize[iField]] = '\0';
+				nRetResult = FALSE;
+			}
+			strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),
+			szSField, strlen(szSField) );
+		}
+		break;
+
+	case 'L':
+		if (psDBF->panFieldSize[iField] >= 1  && 
+			(*(char*)pValue == 'F' || *(char*)pValue == 'T'))
+			*(pabyRec+psDBF->panFieldOffset[iField]) = *(char*)pValue;
+		break;
+
+	default:
+		if( (int) strlen((char *) pValue) > psDBF->panFieldSize[iField] )
+		{
+			j = psDBF->panFieldSize[iField];
+			nRetResult = FALSE;
+		}
+		else
+		{
+			memset( pabyRec+psDBF->panFieldOffset[iField], ' ',
+			psDBF->panFieldSize[iField] );
+			j = strlen((char *) pValue);
+		}
+
+		strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),(char *) pValue, j );
+		break;
+	}
+
+    return( nRetResult );
+}
+
+/************************************************************************/
+/*                     DBFWriteAttributeDirectly()                      */
+/*                                                                      */
+/*      Write an attribute record to the file, but without any          */
+/*      reformatting based on type.  The provided buffer is written     */
+/*      as is to the field position in the record.                      */
+/************************************************************************/
+
+int DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,
+                              void * pValue )
+
+{
+    int	       	nRecordOffset, i, j;
+    unsigned char	*pabyRec;
+
+/* -------------------------------------------------------------------- */
+/*	Is this a valid record?						*/
+/* -------------------------------------------------------------------- */
+    if( hEntity < 0 || hEntity > psDBF->nRecords )
+        return( FALSE );
+
+    if( psDBF->bNoHeader )
+        DBFWriteHeader(psDBF);
+
+/* -------------------------------------------------------------------- */
+/*      Is this a brand new record?                                     */
+/* -------------------------------------------------------------------- */
+    if( hEntity == psDBF->nRecords )
+    {
+	DBFFlushRecord( psDBF );
+
+	psDBF->nRecords++;
+	for( i = 0; i < psDBF->nRecordLength; i++ )
+	    psDBF->pszCurrentRecord[i] = ' ';
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Is this an existing record, but different than the last one     */
+/*      we accessed?                                                    */
+/* -------------------------------------------------------------------- */
+    if( psDBF->nCurrentRecord != hEntity )
+    {
+	DBFFlushRecord( psDBF );
+
+	nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+	fseek( psDBF->fp, nRecordOffset, 0 );
+	fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+    pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+/* -------------------------------------------------------------------- */
+/*      Assign all the record fields.                                   */
+/* -------------------------------------------------------------------- */
+    if( (int)strlen((char *) pValue) > psDBF->panFieldSize[iField] )
+        j = psDBF->panFieldSize[iField];
+    else
+    {
+        memset( pabyRec+psDBF->panFieldOffset[iField], ' ',
+                psDBF->panFieldSize[iField] );
+        j = strlen((char *) pValue);
+    }
+
+    strncpy((char *) (pabyRec+psDBF->panFieldOffset[iField]),
+            (char *) pValue, j );
+
+    psDBF->bCurrentRecordModified = TRUE;
+    psDBF->bUpdated = TRUE;
+
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                      DBFWriteDoubleAttribute()                       */
+/*                                                                      */
+/*      Write a double attribute.                                       */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteDoubleAttribute( DBFHandle psDBF, int iRecord, int iField,
+                         double dValue )
+
+{
+    return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) );
+}
+
+/************************************************************************/
+/*                      DBFWriteIntegerAttribute()                      */
+/*                                                                      */
+/*      Write a integer attribute.                                      */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteIntegerAttribute( DBFHandle psDBF, int iRecord, int iField,
+                          int nValue )
+
+{
+    double	dValue = nValue;
+
+    return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) &dValue ) );
+}
+
+/************************************************************************/
+/*                      DBFWriteStringAttribute()                       */
+/*                                                                      */
+/*      Write a string attribute.                                       */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteStringAttribute( DBFHandle psDBF, int iRecord, int iField,
+                         const char * pszValue )
+
+{
+    return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) );
+}
+
+/************************************************************************/
+/*                      DBFWriteDateAttribute()		                    */
+/*                                                                      */
+/*      Write a date attribute.                                       */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteDateAttribute( DBFHandle psDBF, int iRecord, int iField,
+                         const char * pszValue )
+
+{
+    return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) pszValue ) );
+}
+
+/************************************************************************/
+/*                      DBFWriteNULLAttribute()                         */
+/*                                                                      */
+/*      Write a string attribute.                                       */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteNULLAttribute( DBFHandle psDBF, int iRecord, int iField )
+
+{
+    return( DBFWriteAttribute( psDBF, iRecord, iField, NULL ) );
+}
+
+/************************************************************************/
+/*                      DBFWriteLogicalAttribute()                      */
+/*                                                                      */
+/*      Write a logical attribute.                                      */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteLogicalAttribute( DBFHandle psDBF, int iRecord, int iField,
+		       const char lValue)
+
+{
+    return( DBFWriteAttribute( psDBF, iRecord, iField, (void *) (&lValue) ) );
+}
+
+/************************************************************************/
+/*                         DBFWriteTuple()                              */
+/*									*/
+/*	Write an attribute record to the file.				*/
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple )
+
+{
+    int	       	nRecordOffset, i;
+    unsigned char	*pabyRec;
+
+/* -------------------------------------------------------------------- */
+/*	Is this a valid record?						*/
+/* -------------------------------------------------------------------- */
+    if( hEntity < 0 || hEntity > psDBF->nRecords )
+        return( FALSE );
+
+    if( psDBF->bNoHeader )
+        DBFWriteHeader(psDBF);
+
+/* -------------------------------------------------------------------- */
+/*      Is this a brand new record?                                     */
+/* -------------------------------------------------------------------- */
+    if( hEntity == psDBF->nRecords )
+    {
+	DBFFlushRecord( psDBF );
+
+	psDBF->nRecords++;
+	for( i = 0; i < psDBF->nRecordLength; i++ )
+	    psDBF->pszCurrentRecord[i] = ' ';
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Is this an existing record, but different than the last one     */
+/*      we accessed?                                                    */
+/* -------------------------------------------------------------------- */
+    if( psDBF->nCurrentRecord != hEntity )
+    {
+	DBFFlushRecord( psDBF );
+
+	nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+	fseek( psDBF->fp, nRecordOffset, 0 );
+	fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+    pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+    memcpy ( pabyRec, pRawTuple,  psDBF->nRecordLength );
+
+    psDBF->bCurrentRecordModified = TRUE;
+    psDBF->bUpdated = TRUE;
+
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                          DBFReadTuple()                              */
+/*                                                                      */
+/*      Read one of the attribute fields of a record.                   */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+DBFReadTuple(DBFHandle psDBF, int hEntity )
+
+{
+    int	       	nRecordOffset;
+    unsigned char	*pabyRec;
+    static char	*pReturnTuple = NULL;
+
+    static int	nTupleLen = 0;
+
+/* -------------------------------------------------------------------- */
+/*	Have we read the record?					*/
+/* -------------------------------------------------------------------- */
+    if( hEntity < 0 || hEntity >= psDBF->nRecords )
+        return( NULL );
+
+    if( psDBF->nCurrentRecord != hEntity )
+    {
+	DBFFlushRecord( psDBF );
+
+	nRecordOffset = psDBF->nRecordLength * hEntity + psDBF->nHeaderLength;
+
+	fseek( psDBF->fp, nRecordOffset, 0 );
+	fread( psDBF->pszCurrentRecord, psDBF->nRecordLength, 1, psDBF->fp );
+
+	psDBF->nCurrentRecord = hEntity;
+    }
+
+    pabyRec = (unsigned char *) psDBF->pszCurrentRecord;
+
+    if ( nTupleLen < psDBF->nRecordLength) {
+      nTupleLen = psDBF->nRecordLength;
+      pReturnTuple = (char *) SfRealloc(pReturnTuple, psDBF->nRecordLength);
+    }
+    
+    memcpy ( pReturnTuple, pabyRec, psDBF->nRecordLength );
+        
+    return( pReturnTuple );
+}
+
+/************************************************************************/
+/*                          DBFCloneEmpty()                              */
+/*                                                                      */
+/*      Read one of the attribute fields of a record.                   */
+/************************************************************************/
+
+DBFHandle SHPAPI_CALL
+DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename ) 
+{
+    DBFHandle	newDBF;
+
+   newDBF = DBFCreate ( pszFilename );
+   if ( newDBF == NULL ) return ( NULL ); 
+   
+   newDBF->pszHeader = (char *) malloc ( 32 * psDBF->nFields );
+   memcpy ( newDBF->pszHeader, psDBF->pszHeader, 32 * psDBF->nFields );
+   
+   newDBF->nFields = psDBF->nFields;
+   newDBF->nRecordLength = psDBF->nRecordLength;
+   newDBF->nHeaderLength = 32 * (psDBF->nFields+1);
+    
+   newDBF->panFieldOffset = (int *) malloc ( sizeof(int) * psDBF->nFields ); 
+   memcpy ( newDBF->panFieldOffset, psDBF->panFieldOffset, sizeof(int) * psDBF->nFields );
+   newDBF->panFieldSize = (int *) malloc ( sizeof(int) * psDBF->nFields );
+   memcpy ( newDBF->panFieldSize, psDBF->panFieldSize, sizeof(int) * psDBF->nFields );
+   newDBF->panFieldDecimals = (int *) malloc ( sizeof(int) * psDBF->nFields );
+   memcpy ( newDBF->panFieldDecimals, psDBF->panFieldDecimals, sizeof(int) * psDBF->nFields );
+   newDBF->pachFieldType = (char *) malloc ( sizeof(int) * psDBF->nFields );
+   memcpy ( newDBF->pachFieldType, psDBF->pachFieldType, sizeof(int) * psDBF->nFields );
+
+   newDBF->bNoHeader = TRUE;
+   newDBF->bUpdated = TRUE;
+   
+   DBFWriteHeader ( newDBF );
+   DBFClose ( newDBF );
+   
+   newDBF = DBFOpen ( pszFilename, "rb+" );
+
+   return ( newDBF );
+}
+
+/************************************************************************/
+/*                       DBFGetNativeFieldType()                        */
+/*                                                                      */
+/*      Return the DBase field type for the specified field.            */
+/*                                                                      */
+/*      Value can be one of: 'C' (String), 'D' (Date), 'F' (Float),     */
+/*                           'N' (Numeric, with or without decimal),    */
+/*                           'L' (Logical),                             */
+/*                           'M' (Memo: 10 digits .DBT block ptr)       */
+/************************************************************************/
+
+char SHPAPI_CALL
+DBFGetNativeFieldType( DBFHandle psDBF, int iField )
+
+{
+    if( iField >=0 && iField < psDBF->nFields )
+        return psDBF->pachFieldType[iField];
+
+    return  ' ';
+}
+
+/************************************************************************/
+/*                            str_to_upper()                            */
+/************************************************************************/
+
+static void str_to_upper (char *string)
+{
+    int len;
+    short i = -1;
+
+    len = strlen (string);
+
+    while (++i < len)
+        if (isalpha(string[i]) && islower(string[i]))
+            string[i] = toupper ((int)string[i]);
+}
+
+/************************************************************************/
+/*                          DBFGetFieldIndex()                          */
+/*                                                                      */
+/*      Get the index number for a field in a .dbf file.                */
+/*                                                                      */
+/*      Contributed by Jim Matthews.                                    */
+/************************************************************************/
+
+int SHPAPI_CALL
+DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName)
+
+{
+    char          name[12], name1[12], name2[12];
+    int           i;
+
+    strncpy(name1, pszFieldName,11);
+    name1[11] = '\0';
+    str_to_upper(name1);
+
+    for( i = 0; i < DBFGetFieldCount(psDBF); i++ )
+    {
+        DBFGetFieldInfo( psDBF, i, name, NULL, NULL );
+        strncpy(name2,name,11);
+        str_to_upper(name2);
+
+        if(!strncmp(name1,name2,10))
+            return(i);
+    }
+    return(-1);
+}
diff --git a/src/shapelib/shapefil.h b/src/shapelib/shapefil.h
new file mode 100644
index 0000000..3e2aec6
--- /dev/null
+++ b/src/shapelib/shapefil.h
@@ -0,0 +1,496 @@
+#ifndef _SHAPEFILE_H_INCLUDED
+#define _SHAPEFILE_H_INCLUDED
+
+/******************************************************************************
+ * $Id: shapefil.h,v 1.3 2004/04/29 14:48:57 lubia Exp $
+ *
+ * Project:  Shapelib
+ * Purpose:  Primary include file for Shapelib.
+ * Author:   Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * This software is available under the following "MIT Style" license,
+ * or at the option of the licensee under the LGPL (see LICENSE.LGPL).  This
+ * option is discussed in more detail in shapelib.html.
+ *
+ * --
+ * 
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: shapefil.h,v $
+ * Revision 1.3  2004/04/29 14:48:57  lubia
+ * modificacao de tempo
+ *
+ * Revision 1.2  2004/02/20 14:10:42  lubia
+ * Migrando para ultima versao da shapelib: 1.2.10
+ *
+ * Revision 1.26  2002/09/29 00:00:08  warmerda
+ * added FTLogical and logical attribute read/write calls
+ *
+ * Revision 1.25  2002/05/07 13:46:30  warmerda
+ * added DBFWriteAttributeDirectly().
+ *
+ * Revision 1.24  2002/04/10 16:59:54  warmerda
+ * added SHPRewindObject
+ *
+ * Revision 1.23  2002/01/15 14:36:07  warmerda
+ * updated email address
+ *
+ * Revision 1.22  2002/01/15 14:32:00  warmerda
+ * try to improve SHPAPI_CALL docs
+ *
+ * Revision 1.21  2001/11/01 16:29:55  warmerda
+ * move pabyRec into SHPInfo for thread safety
+ *
+ * Revision 1.20  2001/07/20 13:06:02  warmerda
+ * fixed SHPAPI attribute for SHPTreeFindLikelyShapes
+ *
+ * Revision 1.19  2001/05/31 19:20:13  warmerda
+ * added DBFGetFieldIndex()
+ *
+ * Revision 1.18  2001/05/31 18:15:40  warmerda
+ * Added support for NULL fields in DBF files
+ *
+ * Revision 1.17  2001/05/23 13:36:52  warmerda
+ * added use of SHPAPI_CALL
+ *
+ * Revision 1.16  2000/09/25 14:15:59  warmerda
+ * added DBFGetNativeFieldType()
+ *
+ * Revision 1.15  2000/02/16 16:03:51  warmerda
+ * added null shape support
+ *
+ * Revision 1.14  1999/11/05 14:12:05  warmerda
+ * updated license terms
+ *
+ * Revision 1.13  1999/06/02 18:24:21  warmerda
+ * added trimming code
+ *
+ * Revision 1.12  1999/06/02 17:56:12  warmerda
+ * added quad'' subnode support for trees
+ *
+ * Revision 1.11  1999/05/18 19:11:11  warmerda
+ * Added example searching capability
+ *
+ * Revision 1.10  1999/05/18 17:49:38  warmerda
+ * added initial quadtree support
+ *
+ * Revision 1.9  1999/05/11 03:19:28  warmerda
+ * added new Tuple api, and improved extension handling - add from candrsn
+ *
+ * Revision 1.8  1999/03/23 17:22:27  warmerda
+ * Added extern "C" protection for C++ users of shapefil.h.
+ *
+ * Revision 1.7  1998/12/31 15:31:07  warmerda
+ * Added the TRIM_DBF_WHITESPACE and DISABLE_MULTIPATCH_MEASURE options.
+ *
+ * Revision 1.6  1998/12/03 15:48:15  warmerda
+ * Added SHPCalculateExtents().
+ *
+ * Revision 1.5  1998/11/09 20:57:16  warmerda
+ * Altered SHPGetInfo() call.
+ *
+ * Revision 1.4  1998/11/09 20:19:33  warmerda
+ * Added 3D support, and use of SHPObject.
+ *
+ * Revision 1.3  1995/08/23 02:24:05  warmerda
+ * Added support for reading bounds.
+ *
+ * Revision 1.2  1995/08/04  03:17:39  warmerda
+ * Added header.
+ *
+ */
+
+#include <stdio.h>
+
+#ifdef USE_DBMALLOC
+#include <dbmalloc.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/************************************************************************/
+/*                        Configuration options.                        */
+/************************************************************************/
+
+/* -------------------------------------------------------------------- */
+/*      Should the DBFReadStringAttribute() strip leading and           */
+/*      trailing white space?                                           */
+/* -------------------------------------------------------------------- */
+#define TRIM_DBF_WHITESPACE
+
+/* -------------------------------------------------------------------- */
+/*      Should we write measure values to the Multipatch object?        */
+/*      Reportedly ArcView crashes if we do write it, so for now it     */
+/*      is disabled.                                                    */
+/* -------------------------------------------------------------------- */
+#define DISABLE_MULTIPATCH_MEASURE
+
+/* -------------------------------------------------------------------- */
+/*      SHPAPI_CALL                                                     */
+/*                                                                      */
+/*      The following two macros are present to allow forcing           */
+/*      various calling conventions on the Shapelib API.                */
+/*                                                                      */
+/*      To force __stdcall conventions (needed to call Shapelib         */
+/*      from Visual Basic and/or Dephi I believe) the makefile could    */
+/*      be modified to define:                                          */
+/*                                                                      */
+/*        /DSHPAPI_CALL=__stdcall                                       */
+/*                                                                      */
+/*      If it is desired to force export of the Shapelib API without    */
+/*      using the shapelib.def file, use the following definition.      */
+/*                                                                      */
+/*        /DSHAPELIB_DLLEXPORT                                          */
+/*                                                                      */
+/*      To get both at once it will be necessary to hack this           */
+/*      include file to define:                                         */
+/*                                                                      */
+/*        #define SHPAPI_CALL __declspec(dllexport) __stdcall           */
+/*        #define SHPAPI_CALL1 __declspec(dllexport) * __stdcall        */
+/*                                                                      */
+/*      The complexity of the situtation is partly caused by the        */
+/*      peculiar requirement of Visual C++ that __stdcall appear        */
+/*      after any "*"'s in the return value of a function while the     */
+/*      __declspec(dllexport) must appear before them.                  */
+/* -------------------------------------------------------------------- */
+
+#ifdef SHAPELIB_DLLEXPORT
+#  define SHPAPI_CALL __declspec(dllexport)
+#  define SHPAPI_CALL1(x)  __declspec(dllexport) x
+#endif
+
+#ifndef SHPAPI_CALL
+#  define SHPAPI_CALL
+#endif
+
+#ifndef SHPAPI_CALL1
+#  define SHPAPI_CALL1(x)      x SHPAPI_CALL
+#endif
+    
+/************************************************************************/
+/*                             SHP Support.                             */
+/************************************************************************/
+typedef	struct
+{
+    FILE        *fpSHP;
+    FILE	*fpSHX;
+
+    int		nShapeType;				/* SHPT_* */
+    
+    int		nFileSize;				/* SHP file */
+
+    int         nRecords;
+    int		nMaxRecords;
+    int		*panRecOffset;
+    int		*panRecSize;
+
+    double	adBoundsMin[4];
+    double	adBoundsMax[4];
+
+    int		bUpdated;
+
+    unsigned char *pabyRec;
+    int         nBufSize;
+} SHPInfo;
+
+typedef SHPInfo * SHPHandle;
+
+/* -------------------------------------------------------------------- */
+/*      Shape types (nSHPType)                                          */
+/* -------------------------------------------------------------------- */
+#define SHPT_NULL	0
+#define SHPT_POINT	1
+#define SHPT_ARC	3
+#define SHPT_POLYGON	5
+#define SHPT_MULTIPOINT	8
+#define SHPT_POINTZ	11
+#define SHPT_ARCZ	13
+#define SHPT_POLYGONZ	15
+#define SHPT_MULTIPOINTZ 18
+#define SHPT_POINTM	21
+#define SHPT_ARCM	23
+#define SHPT_POLYGONM	25
+#define SHPT_MULTIPOINTM 28
+#define SHPT_MULTIPATCH 31
+
+
+/* -------------------------------------------------------------------- */
+/*      Part types - everything but SHPT_MULTIPATCH just uses           */
+/*      SHPP_RING.                                                      */
+/* -------------------------------------------------------------------- */
+
+#define SHPP_TRISTRIP	0
+#define SHPP_TRIFAN	1
+#define SHPP_OUTERRING	2
+#define SHPP_INNERRING	3
+#define SHPP_FIRSTRING	4
+#define SHPP_RING	5
+
+/* -------------------------------------------------------------------- */
+/*      SHPObject - represents on shape (without attributes) read       */
+/*      from the .shp file.                                             */
+/* -------------------------------------------------------------------- */
+typedef struct
+{
+    int		nSHPType;
+
+    int		nShapeId; /* -1 is unknown/unassigned */
+
+    int		nParts;
+    int		*panPartStart;
+    int		*panPartType;
+    
+    int		nVertices;
+    double	*padfX;
+    double	*padfY;
+    double	*padfZ;
+    double	*padfM;
+
+    double	dfXMin;
+    double	dfYMin;
+    double	dfZMin;
+    double	dfMMin;
+
+    double	dfXMax;
+    double	dfYMax;
+    double	dfZMax;
+    double	dfMMax;
+} SHPObject;
+
+/* -------------------------------------------------------------------- */
+/*      SHP API Prototypes                                              */
+/* -------------------------------------------------------------------- */
+SHPHandle SHPAPI_CALL
+      SHPOpen( const char * pszShapeFile, const char * pszAccess );
+SHPHandle SHPAPI_CALL
+      SHPCreate( const char * pszShapeFile, int nShapeType );
+void SHPAPI_CALL
+      SHPGetInfo( SHPHandle hSHP, int * pnEntities, int * pnShapeType,
+                  double * padfMinBound, double * padfMaxBound );
+
+SHPObject SHPAPI_CALL1(*)
+      SHPReadObject( SHPHandle hSHP, int iShape );
+int SHPAPI_CALL
+      SHPWriteObject( SHPHandle hSHP, int iShape, SHPObject * psObject );
+
+void SHPAPI_CALL
+      SHPDestroyObject( SHPObject * psObject );
+void SHPAPI_CALL
+      SHPComputeExtents( SHPObject * psObject );
+SHPObject SHPAPI_CALL1(*)
+      SHPCreateObject( int nSHPType, int nShapeId,
+                       int nParts, int * panPartStart, int * panPartType,
+                       int nVertices, double * padfX, double * padfY,
+                       double * padfZ, double * padfM );
+SHPObject SHPAPI_CALL1(*)
+      SHPCreateSimpleObject( int nSHPType, int nVertices,
+                             double * padfX, double * padfY, double * padfZ );
+
+int SHPAPI_CALL
+      SHPRewindObject( SHPHandle hSHP, SHPObject * psObject );
+
+void SHPAPI_CALL
+      SHPClose( SHPHandle hSHP );
+
+const char SHPAPI_CALL1(*)
+      SHPTypeName( int nSHPType );
+const char SHPAPI_CALL1(*)
+      SHPPartTypeName( int nPartType );
+
+/* -------------------------------------------------------------------- */
+/*      Shape quadtree indexing API.                                    */
+/* -------------------------------------------------------------------- */
+
+/* this can be two or four for binary or quad tree */
+#define MAX_SUBNODE	4
+
+typedef struct shape_tree_node
+{
+    /* region covered by this node */
+    double	adfBoundsMin[4];
+    double	adfBoundsMax[4];
+
+    /* list of shapes stored at this node.  The papsShapeObj pointers
+       or the whole list can be NULL */
+    int		nShapeCount;
+    int		*panShapeIds;
+    SHPObject   **papsShapeObj;
+
+    int		nSubNodes;
+    struct shape_tree_node *apsSubNode[MAX_SUBNODE];
+    
+} SHPTreeNode;
+
+typedef struct
+{
+    SHPHandle   hSHP;
+    
+    int		nMaxDepth;
+    int		nDimension;
+    
+    SHPTreeNode	*psRoot;
+} SHPTree;
+
+SHPTree SHPAPI_CALL1(*)
+      SHPCreateTree( SHPHandle hSHP, int nDimension, int nMaxDepth,
+                     double *padfBoundsMin, double *padfBoundsMax );
+void    SHPAPI_CALL
+      SHPDestroyTree( SHPTree * hTree );
+
+int	SHPAPI_CALL
+      SHPWriteTree( SHPTree *hTree, const char * pszFilename );
+SHPTree SHPAPI_CALL
+      SHPReadTree( const char * pszFilename );
+
+int	SHPAPI_CALL
+      SHPTreeAddObject( SHPTree * hTree, SHPObject * psObject );
+int	SHPAPI_CALL
+      SHPTreeAddShapeId( SHPTree * hTree, SHPObject * psObject );
+int	SHPAPI_CALL
+      SHPTreeRemoveShapeId( SHPTree * hTree, int nShapeId );
+
+void 	SHPAPI_CALL
+      SHPTreeTrimExtraNodes( SHPTree * hTree );
+
+int    SHPAPI_CALL1(*)
+      SHPTreeFindLikelyShapes( SHPTree * hTree,
+                               double * padfBoundsMin,
+                               double * padfBoundsMax,
+                               int * );
+int     SHPAPI_CALL
+      SHPCheckBoundsOverlap( double *, double *, double *, double *, int );
+
+/************************************************************************/
+/*                             DBF Support.                             */
+/************************************************************************/
+typedef	struct
+{
+    FILE	*fp;
+
+    int         nRecords;
+
+    int		nRecordLength;
+    int		nHeaderLength;
+    int		nFields;
+    int		*panFieldOffset;
+    int		*panFieldSize;
+    int		*panFieldDecimals;
+    char	*pachFieldType;
+
+    char	*pszHeader;
+
+    int		nCurrentRecord;
+    int		bCurrentRecordModified;
+    char	*pszCurrentRecord;
+    
+    int		bNoHeader;
+    int		bUpdated;
+} DBFInfo;
+
+typedef DBFInfo * DBFHandle;
+
+typedef enum {
+  FTString,
+  FTInteger,
+  FTDouble,
+  FTLogical,
+  FTInvalid,
+  FTDate,
+} DBFFieldType;
+
+#define XBASE_FLDHDR_SZ       32
+
+DBFHandle SHPAPI_CALL
+      DBFOpen( const char * pszDBFFile, const char * pszAccess );
+DBFHandle SHPAPI_CALL
+      DBFCreate( const char * pszDBFFile );
+
+int	SHPAPI_CALL
+      DBFGetFieldCount( DBFHandle psDBF );
+int	SHPAPI_CALL
+      DBFGetRecordCount( DBFHandle psDBF );
+int	SHPAPI_CALL
+      DBFAddField( DBFHandle hDBF, const char * pszFieldName,
+                   DBFFieldType eType, int nWidth, int nDecimals );
+
+DBFFieldType SHPAPI_CALL
+      DBFGetFieldInfo( DBFHandle psDBF, int iField, 
+                       char * pszFieldName, int * pnWidth, int * pnDecimals );
+
+int SHPAPI_CALL
+      DBFGetFieldIndex(DBFHandle psDBF, const char *pszFieldName);
+
+int 	SHPAPI_CALL
+      DBFReadIntegerAttribute( DBFHandle hDBF, int iShape, int iField );
+double 	SHPAPI_CALL
+      DBFReadDoubleAttribute( DBFHandle hDBF, int iShape, int iField );
+const char SHPAPI_CALL1(*)
+      DBFReadStringAttribute( DBFHandle hDBF, int iShape, int iField );
+const char SHPAPI_CALL1(*)
+      DBFReadDatettribute( DBFHandle hDBF, int iShape, int iField );
+const char SHPAPI_CALL1(*)
+      DBFReadLogicalAttribute( DBFHandle hDBF, int iShape, int iField );
+int     SHPAPI_CALL
+      DBFIsAttributeNULL( DBFHandle hDBF, int iShape, int iField );
+
+int SHPAPI_CALL
+      DBFWriteIntegerAttribute( DBFHandle hDBF, int iShape, int iField, 
+                                int nFieldValue );
+int SHPAPI_CALL
+      DBFWriteDoubleAttribute( DBFHandle hDBF, int iShape, int iField,
+                               double dFieldValue );
+int SHPAPI_CALL
+      DBFWriteStringAttribute( DBFHandle hDBF, int iShape, int iField,
+                               const char * pszFieldValue );
+int SHPAPI_CALL
+      DBFWriteDateAttribute( DBFHandle hDBF, int iShape, int iField,
+                               const char * pszFieldValue );
+int SHPAPI_CALL
+     DBFWriteNULLAttribute( DBFHandle hDBF, int iShape, int iField );
+
+int SHPAPI_CALL
+     DBFWriteLogicalAttribute( DBFHandle hDBF, int iShape, int iField,
+			       const char lFieldValue);
+int SHPAPI_CALL
+     DBFWriteAttributeDirectly(DBFHandle psDBF, int hEntity, int iField,
+                               void * pValue );
+const char SHPAPI_CALL1(*)
+      DBFReadTuple(DBFHandle psDBF, int hEntity );
+int SHPAPI_CALL
+      DBFWriteTuple(DBFHandle psDBF, int hEntity, void * pRawTuple );
+
+DBFHandle SHPAPI_CALL
+      DBFCloneEmpty(DBFHandle psDBF, const char * pszFilename );
+ 
+void	SHPAPI_CALL
+      DBFClose( DBFHandle hDBF );
+char    SHPAPI_CALL
+      DBFGetNativeFieldType( DBFHandle hDBF, int iField );
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ndef _SHAPEFILE_H_INCLUDED */
diff --git a/src/shapelib/shpopen.c b/src/shapelib/shpopen.c
new file mode 100644
index 0000000..b33b16b
--- /dev/null
+++ b/src/shapelib/shpopen.c
@@ -0,0 +1,1872 @@
+/******************************************************************************
+ * $Id: shpopen.c,v 1.4 2004/11/01 14:54:44 juan Exp $
+ *
+ * Project:  Shapelib
+ * Purpose:  Implementation of core Shapefile read/write functions.
+ * Author:   Frank Warmerdam, warmerdam at pobox.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, 2001, Frank Warmerdam
+ *
+ * This software is available under the following "MIT Style" license,
+ * or at the option of the licensee under the LGPL (see LICENSE.LGPL).  This
+ * option is discussed in more detail in shapelib.html.
+ *
+ * --
+ * 
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: shpopen.c,v $
+ * Revision 1.4  2004/11/01 14:54:44  juan
+ * Warning removed
+ *
+ * Revision 1.3  2004/02/20 14:10:42  lubia
+ * Migrando para ultima versao da shapelib: 1.2.10
+ *
+ * Revision 1.39  2002/08/26 06:46:56  warmerda
+ * avoid c++ comments
+ *
+ * Revision 1.38  2002/05/07 16:43:39  warmerda
+ * Removed debugging printf.
+ *
+ * Revision 1.37  2002/04/10 17:35:22  warmerda
+ * fixed bug in ring reversal code
+ *
+ * Revision 1.36  2002/04/10 16:59:54  warmerda
+ * added SHPRewindObject
+ *
+ * Revision 1.35  2001/12/07 15:10:44  warmerda
+ * fix if .shx fails to open
+ *
+ * Revision 1.34  2001/11/01 16:29:55  warmerda
+ * move pabyRec into SHPInfo for thread safety
+ *
+ * Revision 1.33  2001/07/03 12:18:15  warmerda
+ * Improved cleanup if SHX not found, provied by Riccardo Cohen.
+ *
+ * Revision 1.32  2001/06/22 01:58:07  warmerda
+ * be more careful about establishing initial bounds in face of NULL shapes
+ *
+ * Revision 1.31  2001/05/31 19:35:29  warmerda
+ * added support for writing null shapes
+ *
+ * Revision 1.30  2001/05/28 12:46:29  warmerda
+ * Add some checking on reasonableness of record count when opening.
+ *
+ * Revision 1.29  2001/05/23 13:36:52  warmerda
+ * added use of SHPAPI_CALL
+ *
+ * Revision 1.28  2001/02/06 22:25:06  warmerda
+ * fixed memory leaks when SHPOpen() fails
+ *
+ * Revision 1.27  2000/07/18 15:21:33  warmerda
+ * added better enforcement of -1 for append in SHPWriteObject
+ *
+ * Revision 1.26  2000/02/16 16:03:51  warmerda
+ * added null shape support
+ *
+ * Revision 1.25  1999/12/15 13:47:07  warmerda
+ * Fixed record size settings in .shp file (was 4 words too long)
+ * Added stdlib.h.
+ *
+ * Revision 1.24  1999/11/05 14:12:04  warmerda
+ * updated license terms
+ *
+ * Revision 1.23  1999/07/27 00:53:46  warmerda
+ * added support for rewriting shapes
+ *
+ * Revision 1.22  1999/06/11 19:19:11  warmerda
+ * Cleanup pabyRec static buffer on SHPClose().
+ *
+ * Revision 1.21  1999/06/02 14:57:56  kshih
+ * Remove unused variables
+ *
+ * Revision 1.20  1999/04/19 21:04:17  warmerda
+ * Fixed syntax error.
+ *
+ * Revision 1.19  1999/04/19 21:01:57  warmerda
+ * Force access string to binary in SHPOpen().
+ *
+ * Revision 1.18  1999/04/01 18:48:07  warmerda
+ * Try upper case extensions if lower case doesn't work.
+ *
+ * Revision 1.17  1998/12/31 15:29:39  warmerda
+ * Disable writing measure values to multipatch objects if
+ * DISABLE_MULTIPATCH_MEASURE is defined.
+ *
+ * Revision 1.16  1998/12/16 05:14:33  warmerda
+ * Added support to write MULTIPATCH.  Fixed reading Z coordinate of
+ * MULTIPATCH. Fixed record size written for all feature types.
+ *
+ * Revision 1.15  1998/12/03 16:35:29  warmerda
+ * r+b is proper binary access string, not rb+.
+ *
+ * Revision 1.14  1998/12/03 15:47:56  warmerda
+ * Fixed setting of nVertices in SHPCreateObject().
+ *
+ * Revision 1.13  1998/12/03 15:33:54  warmerda
+ * Made SHPCalculateExtents() separately callable.
+ *
+ * Revision 1.12  1998/11/11 20:01:50  warmerda
+ * Fixed bug writing ArcM/Z, and PolygonM/Z for big endian machines.
+ *
+ * Revision 1.11  1998/11/09 20:56:44  warmerda
+ * Fixed up handling of file wide bounds.
+ *
+ * Revision 1.10  1998/11/09 20:18:51  warmerda
+ * Converted to support 3D shapefiles, and use of SHPObject.
+ *
+ * Revision 1.9  1998/02/24 15:09:05  warmerda
+ * Fixed memory leak.
+ *
+ * Revision 1.8  1997/12/04 15:40:29  warmerda
+ * Fixed byte swapping of record number, and record length fields in the
+ * .shp file.
+ *
+ * Revision 1.7  1995/10/21 03:15:58  warmerda
+ * Added support for binary file access, the magic cookie 9997
+ * and tried to improve the int32 selection logic for 16bit systems.
+ *
+ * Revision 1.6  1995/09/04  04:19:41  warmerda
+ * Added fix for file bounds.
+ *
+ * Revision 1.5  1995/08/25  15:16:44  warmerda
+ * Fixed a couple of problems with big endian systems ... one with bounds
+ * and the other with multipart polygons.
+ *
+ * Revision 1.4  1995/08/24  18:10:17  warmerda
+ * Switch to use SfRealloc() to avoid problems with pre-ANSI realloc()
+ * functions (such as on the Sun).
+ *
+ * Revision 1.3  1995/08/23  02:23:15  warmerda
+ * Added support for reading bounds, and fixed up problems in setting the
+ * file wide bounds.
+ *
+ * Revision 1.2  1995/08/04  03:16:57  warmerda
+ * Added header.
+ *
+ */
+
+/* static char rcsid[] = 
+  "$Id: shpopen.c,v 1.4 2004/11/01 14:54:44 juan Exp $"; */
+
+#include "shapefil.h"
+
+#include <math.h>
+#include <limits.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+
+typedef unsigned char uchar;
+
+#if UINT_MAX == 65535
+typedef long	      int32;
+#else
+typedef int	      int32;
+#endif
+
+#ifndef FALSE
+#  define FALSE		0
+#  define TRUE		1
+#endif
+
+#define ByteCopy( a, b, c )	memcpy( b, a, c )
+#ifndef MAX
+#  define MIN(a,b)      ((a<b) ? a : b)
+#  define MAX(a,b)      ((a>b) ? a : b)
+#endif
+
+static int 	bBigEndian;
+
+
+/************************************************************************/
+/*                              SwapWord()                              */
+/*                                                                      */
+/*      Swap a 2, 4 or 8 byte word.                                     */
+/************************************************************************/
+
+static void	SwapWord( int length, void * wordP )
+
+{
+    int		i;
+    uchar	temp;
+
+    for( i=0; i < length/2; i++ )
+    {
+	temp = ((uchar *) wordP)[i];
+	((uchar *)wordP)[i] = ((uchar *) wordP)[length-i-1];
+	((uchar *) wordP)[length-i-1] = temp;
+    }
+}
+
+/************************************************************************/
+/*                             SfRealloc()                              */
+/*                                                                      */
+/*      A realloc cover function that will access a NULL pointer as     */
+/*      a valid input.                                                  */
+/************************************************************************/
+
+static void * SfRealloc( void * pMem, int nNewSize )
+
+{
+    if( pMem == NULL )
+        return( (void *) malloc(nNewSize) );
+    else
+        return( (void *) realloc(pMem,nNewSize) );
+}
+
+/************************************************************************/
+/*                          SHPWriteHeader()                            */
+/*                                                                      */
+/*      Write out a header for the .shp and .shx files as well as the	*/
+/*	contents of the index (.shx) file.				*/
+/************************************************************************/
+
+static void SHPWriteHeader( SHPHandle psSHP )
+
+{
+    uchar     	abyHeader[100];
+    int		i;
+    int32	i32;
+    double	dValue;
+    int32	*panSHX;
+
+/* -------------------------------------------------------------------- */
+/*      Prepare header block for .shp file.                             */
+/* -------------------------------------------------------------------- */
+    for( i = 0; i < 100; i++ )
+      abyHeader[i] = 0;
+
+    abyHeader[2] = 0x27;				/* magic cookie */
+    abyHeader[3] = 0x0a;
+
+    i32 = psSHP->nFileSize/2;				/* file size */
+    ByteCopy( &i32, abyHeader+24, 4 );
+    if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+    
+    i32 = 1000;						/* version */
+    ByteCopy( &i32, abyHeader+28, 4 );
+    if( bBigEndian ) SwapWord( 4, abyHeader+28 );
+    
+    i32 = psSHP->nShapeType;				/* shape type */
+    ByteCopy( &i32, abyHeader+32, 4 );
+    if( bBigEndian ) SwapWord( 4, abyHeader+32 );
+
+    dValue = psSHP->adBoundsMin[0];			/* set bounds */
+    ByteCopy( &dValue, abyHeader+36, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+36 );
+
+    dValue = psSHP->adBoundsMin[1];
+    ByteCopy( &dValue, abyHeader+44, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+44 );
+
+    dValue = psSHP->adBoundsMax[0];
+    ByteCopy( &dValue, abyHeader+52, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+52 );
+
+    dValue = psSHP->adBoundsMax[1];
+    ByteCopy( &dValue, abyHeader+60, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+60 );
+
+    dValue = psSHP->adBoundsMin[2];			/* z */
+    ByteCopy( &dValue, abyHeader+68, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+68 );
+
+    dValue = psSHP->adBoundsMax[2];
+    ByteCopy( &dValue, abyHeader+76, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+76 );
+
+    dValue = psSHP->adBoundsMin[3];			/* m */
+    ByteCopy( &dValue, abyHeader+84, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+84 );
+
+    dValue = psSHP->adBoundsMax[3];
+    ByteCopy( &dValue, abyHeader+92, 8 );
+    if( bBigEndian ) SwapWord( 8, abyHeader+92 );
+
+/* -------------------------------------------------------------------- */
+/*      Write .shp file header.                                         */
+/* -------------------------------------------------------------------- */
+    fseek( psSHP->fpSHP, 0, 0 );
+    fwrite( abyHeader, 100, 1, psSHP->fpSHP );
+
+/* -------------------------------------------------------------------- */
+/*      Prepare, and write .shx file header.                            */
+/* -------------------------------------------------------------------- */
+    i32 = (psSHP->nRecords * 2 * sizeof(int32) + 100)/2;   /* file size */
+    ByteCopy( &i32, abyHeader+24, 4 );
+    if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+    
+    fseek( psSHP->fpSHX, 0, 0 );
+    fwrite( abyHeader, 100, 1, psSHP->fpSHX );
+
+/* -------------------------------------------------------------------- */
+/*      Write out the .shx contents.                                    */
+/* -------------------------------------------------------------------- */
+    panSHX = (int32 *) malloc(sizeof(int32) * 2 * psSHP->nRecords);
+
+    for( i = 0; i < psSHP->nRecords; i++ )
+    {
+	panSHX[i*2  ] = psSHP->panRecOffset[i]/2;
+	panSHX[i*2+1] = psSHP->panRecSize[i]/2;
+	if( !bBigEndian ) SwapWord( 4, panSHX+i*2 );
+	if( !bBigEndian ) SwapWord( 4, panSHX+i*2+1 );
+    }
+
+    fwrite( panSHX, sizeof(int32) * 2, psSHP->nRecords, psSHP->fpSHX );
+
+    free( panSHX );
+}
+
+/************************************************************************/
+/*                              SHPOpen()                               */
+/*                                                                      */
+/*      Open the .shp and .shx files based on the basename of the       */
+/*      files or either file name.                                      */
+/************************************************************************/
+   
+SHPHandle SHPAPI_CALL
+SHPOpen( const char * pszLayer, const char * pszAccess )
+
+{
+    char		*pszFullname, *pszBasename;
+    SHPHandle		psSHP;
+    
+    uchar		*pabyBuf;
+    int			i;
+    double		dValue;
+    
+/* -------------------------------------------------------------------- */
+/*      Ensure the access string is one of the legal ones.  We          */
+/*      ensure the result string indicates binary to avoid common       */
+/*      problems on Windows.                                            */
+/* -------------------------------------------------------------------- */
+    if( strcmp(pszAccess,"rb+") == 0 || strcmp(pszAccess,"r+b") == 0
+        || strcmp(pszAccess,"r+") == 0 )
+        pszAccess = "r+b";
+    else
+        pszAccess = "rb";
+    
+/* -------------------------------------------------------------------- */
+/*	Establish the byte order on this machine.			*/
+/* -------------------------------------------------------------------- */
+    i = 1;
+    if( *((uchar *) &i) == 1 )
+        bBigEndian = FALSE;
+    else
+        bBigEndian = TRUE;
+
+/* -------------------------------------------------------------------- */
+/*	Initialize the info structure.					*/
+/* -------------------------------------------------------------------- */
+    psSHP = (SHPHandle) calloc(sizeof(SHPInfo),1);
+
+    psSHP->bUpdated = FALSE;
+
+/* -------------------------------------------------------------------- */
+/*	Compute the base (layer) name.  If there is any extension	*/
+/*	on the passed in filename we will strip it off.			*/
+/* -------------------------------------------------------------------- */
+    pszBasename = (char *) malloc(strlen(pszLayer)+5);
+    strcpy( pszBasename, pszLayer );
+    for( i = strlen(pszBasename)-1; 
+	 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+	       && pszBasename[i] != '\\';
+	 i-- ) {}
+
+    if( pszBasename[i] == '.' )
+        pszBasename[i] = '\0';
+
+/* -------------------------------------------------------------------- */
+/*	Open the .shp and .shx files.  Note that files pulled from	*/
+/*	a PC to Unix with upper case filenames won't work!		*/
+/* -------------------------------------------------------------------- */
+    pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+    sprintf( pszFullname, "%s.shp", pszBasename );
+    psSHP->fpSHP = fopen(pszFullname, pszAccess );
+    if( psSHP->fpSHP == NULL )
+    {
+        sprintf( pszFullname, "%s.SHP", pszBasename );
+        psSHP->fpSHP = fopen(pszFullname, pszAccess );
+    }
+    
+    if( psSHP->fpSHP == NULL )
+    {
+        free( psSHP );
+        free( pszBasename );
+        free( pszFullname );
+        return( NULL );
+    }
+
+    sprintf( pszFullname, "%s.shx", pszBasename );
+    psSHP->fpSHX = fopen(pszFullname, pszAccess );
+    if( psSHP->fpSHX == NULL )
+    {
+        sprintf( pszFullname, "%s.SHX", pszBasename );
+        psSHP->fpSHX = fopen(pszFullname, pszAccess );
+    }
+    
+    if( psSHP->fpSHX == NULL )
+    {
+        fclose( psSHP->fpSHP );
+        free( psSHP );
+        free( pszBasename );
+        free( pszFullname );
+        return( NULL );
+    }
+
+    free( pszFullname );
+    free( pszBasename );
+
+/* -------------------------------------------------------------------- */
+/*  Read the file size from the SHP file.				*/
+/* -------------------------------------------------------------------- */
+    pabyBuf = (uchar *) malloc(100);
+    fread( pabyBuf, 100, 1, psSHP->fpSHP );
+
+    psSHP->nFileSize = (pabyBuf[24] * 256 * 256 * 256
+			+ pabyBuf[25] * 256 * 256
+			+ pabyBuf[26] * 256
+			+ pabyBuf[27]) * 2;
+
+/* -------------------------------------------------------------------- */
+/*  Read SHX file Header info                                           */
+/* -------------------------------------------------------------------- */
+    fread( pabyBuf, 100, 1, psSHP->fpSHX );
+
+    if( pabyBuf[0] != 0 
+        || pabyBuf[1] != 0 
+        || pabyBuf[2] != 0x27 
+        || (pabyBuf[3] != 0x0a && pabyBuf[3] != 0x0d) )
+    {
+	fclose( psSHP->fpSHP );
+	fclose( psSHP->fpSHX );
+	free( psSHP );
+
+	return( NULL );
+    }
+
+    psSHP->nRecords = pabyBuf[27] + pabyBuf[26] * 256
+      + pabyBuf[25] * 256 * 256 + pabyBuf[24] * 256 * 256 * 256;
+    psSHP->nRecords = (psSHP->nRecords*2 - 100) / 8;
+
+    psSHP->nShapeType = pabyBuf[32];
+
+    if( psSHP->nRecords < 0 || psSHP->nRecords > 256000000 )
+    {
+        /* this header appears to be corrupt.  Give up. */
+	fclose( psSHP->fpSHP );
+	fclose( psSHP->fpSHX );
+	free( psSHP );
+
+	return( NULL );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Read the bounds.                                                */
+/* -------------------------------------------------------------------- */
+    if( bBigEndian ) SwapWord( 8, pabyBuf+36 );
+    memcpy( &dValue, pabyBuf+36, 8 );
+    psSHP->adBoundsMin[0] = dValue;
+
+    if( bBigEndian ) SwapWord( 8, pabyBuf+44 );
+    memcpy( &dValue, pabyBuf+44, 8 );
+    psSHP->adBoundsMin[1] = dValue;
+
+    if( bBigEndian ) SwapWord( 8, pabyBuf+52 );
+    memcpy( &dValue, pabyBuf+52, 8 );
+    psSHP->adBoundsMax[0] = dValue;
+
+    if( bBigEndian ) SwapWord( 8, pabyBuf+60 );
+    memcpy( &dValue, pabyBuf+60, 8 );
+    psSHP->adBoundsMax[1] = dValue;
+
+    if( bBigEndian ) SwapWord( 8, pabyBuf+68 );		/* z */
+    memcpy( &dValue, pabyBuf+68, 8 );
+    psSHP->adBoundsMin[2] = dValue;
+    
+    if( bBigEndian ) SwapWord( 8, pabyBuf+76 );
+    memcpy( &dValue, pabyBuf+76, 8 );
+    psSHP->adBoundsMax[2] = dValue;
+    
+    if( bBigEndian ) SwapWord( 8, pabyBuf+84 );		/* z */
+    memcpy( &dValue, pabyBuf+84, 8 );
+    psSHP->adBoundsMin[3] = dValue;
+
+    if( bBigEndian ) SwapWord( 8, pabyBuf+92 );
+    memcpy( &dValue, pabyBuf+92, 8 );
+    psSHP->adBoundsMax[3] = dValue;
+
+    free( pabyBuf );
+
+/* -------------------------------------------------------------------- */
+/*	Read the .shx file to get the offsets to each record in 	*/
+/*	the .shp file.							*/
+/* -------------------------------------------------------------------- */
+    psSHP->nMaxRecords = psSHP->nRecords;
+
+    psSHP->panRecOffset =
+        (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) );
+    psSHP->panRecSize =
+        (int *) malloc(sizeof(int) * MAX(1,psSHP->nMaxRecords) );
+
+    pabyBuf = (uchar *) malloc(8 * MAX(1,psSHP->nRecords) );
+    fread( pabyBuf, 8, psSHP->nRecords, psSHP->fpSHX );
+
+    for( i = 0; i < psSHP->nRecords; i++ )
+    {
+	int32		nOffset, nLength;
+
+	memcpy( &nOffset, pabyBuf + i * 8, 4 );
+	if( !bBigEndian ) SwapWord( 4, &nOffset );
+
+	memcpy( &nLength, pabyBuf + i * 8 + 4, 4 );
+	if( !bBigEndian ) SwapWord( 4, &nLength );
+
+	psSHP->panRecOffset[i] = nOffset*2;
+	psSHP->panRecSize[i] = nLength*2;
+    }
+    free( pabyBuf );
+
+    return( psSHP );
+}
+
+/************************************************************************/
+/*                              SHPClose()                              */
+/*								       	*/
+/*	Close the .shp and .shx files.					*/
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPClose(SHPHandle psSHP )
+
+{
+/* -------------------------------------------------------------------- */
+/*	Update the header if we have modified anything.			*/
+/* -------------------------------------------------------------------- */
+    if( psSHP->bUpdated )
+    {
+	SHPWriteHeader( psSHP );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Free all resources, and close files.                            */
+/* -------------------------------------------------------------------- */
+    free( psSHP->panRecOffset );
+    free( psSHP->panRecSize );
+
+    fclose( psSHP->fpSHX );
+    fclose( psSHP->fpSHP );
+
+    if( psSHP->pabyRec != NULL )
+    {
+        free( psSHP->pabyRec );
+    }
+    
+    free( psSHP );
+}
+
+/************************************************************************/
+/*                             SHPGetInfo()                             */
+/*                                                                      */
+/*      Fetch general information about the shape file.                 */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPGetInfo(SHPHandle psSHP, int * pnEntities, int * pnShapeType,
+           double * padfMinBound, double * padfMaxBound )
+
+{
+    int		i;
+    
+    if( pnEntities != NULL )
+        *pnEntities = psSHP->nRecords;
+
+    if( pnShapeType != NULL )
+        *pnShapeType = psSHP->nShapeType;
+
+    for( i = 0; i < 4; i++ )
+    {
+        if( padfMinBound != NULL )
+            padfMinBound[i] = psSHP->adBoundsMin[i];
+        if( padfMaxBound != NULL )
+            padfMaxBound[i] = psSHP->adBoundsMax[i];
+    }
+}
+
+/************************************************************************/
+/*                             SHPCreate()                              */
+/*                                                                      */
+/*      Create a new shape file and return a handle to the open         */
+/*      shape file with read/write access.                              */
+/************************************************************************/
+
+SHPHandle SHPAPI_CALL
+SHPCreate( const char * pszLayer, int nShapeType )
+
+{
+    char	*pszBasename, *pszFullname;
+    int		i;
+    FILE	*fpSHP, *fpSHX;
+    uchar     	abyHeader[100];
+    int32	i32;
+    double	dValue;
+    
+/* -------------------------------------------------------------------- */
+/*      Establish the byte order on this system.                        */
+/* -------------------------------------------------------------------- */
+    i = 1;
+    if( *((uchar *) &i) == 1 )
+        bBigEndian = FALSE;
+    else
+        bBigEndian = TRUE;
+
+/* -------------------------------------------------------------------- */
+/*	Compute the base (layer) name.  If there is any extension	*/
+/*	on the passed in filename we will strip it off.			*/
+/* -------------------------------------------------------------------- */
+    pszBasename = (char *) malloc(strlen(pszLayer)+5);
+    strcpy( pszBasename, pszLayer );
+    for( i = strlen(pszBasename)-1; 
+	 i > 0 && pszBasename[i] != '.' && pszBasename[i] != '/'
+	       && pszBasename[i] != '\\';
+	 i-- ) {}
+
+    if( pszBasename[i] == '.' )
+        pszBasename[i] = '\0';
+
+/* -------------------------------------------------------------------- */
+/*      Open the two files so we can write their headers.               */
+/* -------------------------------------------------------------------- */
+    pszFullname = (char *) malloc(strlen(pszBasename) + 5);
+    sprintf( pszFullname, "%s.shp", pszBasename );
+    fpSHP = fopen(pszFullname, "wb" );
+    if( fpSHP == NULL )
+        return( NULL );
+
+    sprintf( pszFullname, "%s.shx", pszBasename );
+    fpSHX = fopen(pszFullname, "wb" );
+    if( fpSHX == NULL )
+        return( NULL );
+
+    free( pszFullname );
+    free( pszBasename );
+
+/* -------------------------------------------------------------------- */
+/*      Prepare header block for .shp file.                             */
+/* -------------------------------------------------------------------- */
+    for( i = 0; i < 100; i++ )
+      abyHeader[i] = 0;
+
+    abyHeader[2] = 0x27;				/* magic cookie */
+    abyHeader[3] = 0x0a;
+
+    i32 = 50;						/* file size */
+    ByteCopy( &i32, abyHeader+24, 4 );
+    if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+    
+    i32 = 1000;						/* version */
+    ByteCopy( &i32, abyHeader+28, 4 );
+    if( bBigEndian ) SwapWord( 4, abyHeader+28 );
+    
+    i32 = nShapeType;					/* shape type */
+    ByteCopy( &i32, abyHeader+32, 4 );
+    if( bBigEndian ) SwapWord( 4, abyHeader+32 );
+
+    dValue = 0.0;					/* set bounds */
+    ByteCopy( &dValue, abyHeader+36, 8 );
+    ByteCopy( &dValue, abyHeader+44, 8 );
+    ByteCopy( &dValue, abyHeader+52, 8 );
+    ByteCopy( &dValue, abyHeader+60, 8 );
+
+/* -------------------------------------------------------------------- */
+/*      Write .shp file header.                                         */
+/* -------------------------------------------------------------------- */
+    fwrite( abyHeader, 100, 1, fpSHP );
+
+/* -------------------------------------------------------------------- */
+/*      Prepare, and write .shx file header.                            */
+/* -------------------------------------------------------------------- */
+    i32 = 50;						/* file size */
+    ByteCopy( &i32, abyHeader+24, 4 );
+    if( !bBigEndian ) SwapWord( 4, abyHeader+24 );
+    
+    fwrite( abyHeader, 100, 1, fpSHX );
+
+/* -------------------------------------------------------------------- */
+/*      Close the files, and then open them as regular existing files.  */
+/* -------------------------------------------------------------------- */
+    fclose( fpSHP );
+    fclose( fpSHX );
+
+    return( SHPOpen( pszLayer, "r+b" ) );
+}
+
+/************************************************************************/
+/*                           _SHPSetBounds()                            */
+/*                                                                      */
+/*      Compute a bounds rectangle for a shape, and set it into the     */
+/*      indicated location in the record.                               */
+/************************************************************************/
+
+static void	_SHPSetBounds( uchar * pabyRec, SHPObject * psShape )
+
+{
+    ByteCopy( &(psShape->dfXMin), pabyRec +  0, 8 );
+    ByteCopy( &(psShape->dfYMin), pabyRec +  8, 8 );
+    ByteCopy( &(psShape->dfXMax), pabyRec + 16, 8 );
+    ByteCopy( &(psShape->dfYMax), pabyRec + 24, 8 );
+
+    if( bBigEndian )
+    {
+        SwapWord( 8, pabyRec + 0 );
+        SwapWord( 8, pabyRec + 8 );
+        SwapWord( 8, pabyRec + 16 );
+        SwapWord( 8, pabyRec + 24 );
+    }
+}
+
+/************************************************************************/
+/*                         SHPComputeExtents()                          */
+/*                                                                      */
+/*      Recompute the extents of a shape.  Automatically done by        */
+/*      SHPCreateObject().                                              */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPComputeExtents( SHPObject * psObject )
+
+{
+    int		i;
+    
+/* -------------------------------------------------------------------- */
+/*      Build extents for this object.                                  */
+/* -------------------------------------------------------------------- */
+    if( psObject->nVertices > 0 )
+    {
+        psObject->dfXMin = psObject->dfXMax = psObject->padfX[0];
+        psObject->dfYMin = psObject->dfYMax = psObject->padfY[0];
+        psObject->dfZMin = psObject->dfZMax = psObject->padfZ[0];
+        psObject->dfMMin = psObject->dfMMax = psObject->padfM[0];
+    }
+    
+    for( i = 0; i < psObject->nVertices; i++ )
+    {
+        psObject->dfXMin = MIN(psObject->dfXMin, psObject->padfX[i]);
+        psObject->dfYMin = MIN(psObject->dfYMin, psObject->padfY[i]);
+        psObject->dfZMin = MIN(psObject->dfZMin, psObject->padfZ[i]);
+        psObject->dfMMin = MIN(psObject->dfMMin, psObject->padfM[i]);
+
+        psObject->dfXMax = MAX(psObject->dfXMax, psObject->padfX[i]);
+        psObject->dfYMax = MAX(psObject->dfYMax, psObject->padfY[i]);
+        psObject->dfZMax = MAX(psObject->dfZMax, psObject->padfZ[i]);
+        psObject->dfMMax = MAX(psObject->dfMMax, psObject->padfM[i]);
+    }
+}
+
+/************************************************************************/
+/*                          SHPCreateObject()                           */
+/*                                                                      */
+/*      Create a shape object.  It should be freed with                 */
+/*      SHPDestroyObject().                                             */
+/************************************************************************/
+
+SHPObject SHPAPI_CALL1(*)
+SHPCreateObject( int nSHPType, int nShapeId, int nParts,
+                 int * panPartStart, int * panPartType,
+                 int nVertices, double * padfX, double * padfY,
+                 double * padfZ, double * padfM )
+
+{
+    SHPObject	*psObject;
+    int		i, bHasM, bHasZ;
+
+    psObject = (SHPObject *) calloc(1,sizeof(SHPObject));
+    psObject->nSHPType = nSHPType;
+    psObject->nShapeId = nShapeId;
+
+/* -------------------------------------------------------------------- */
+/*	Establish whether this shape type has M, and Z values.		*/
+/* -------------------------------------------------------------------- */
+    if( nSHPType == SHPT_ARCM
+        || nSHPType == SHPT_POINTM
+        || nSHPType == SHPT_POLYGONM
+        || nSHPType == SHPT_MULTIPOINTM )
+    {
+        bHasM = TRUE;
+        bHasZ = FALSE;
+    }
+    else if( nSHPType == SHPT_ARCZ
+             || nSHPType == SHPT_POINTZ
+             || nSHPType == SHPT_POLYGONZ
+             || nSHPType == SHPT_MULTIPOINTZ
+             || nSHPType == SHPT_MULTIPATCH )
+    {
+        bHasM = TRUE;
+        bHasZ = TRUE;
+    }
+    else
+    {
+        bHasM = FALSE;
+        bHasZ = FALSE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Capture parts.  Note that part type is optional, and            */
+/*      defaults to ring.                                               */
+/* -------------------------------------------------------------------- */
+    if( nSHPType == SHPT_ARC || nSHPType == SHPT_POLYGON
+        || nSHPType == SHPT_ARCM || nSHPType == SHPT_POLYGONM
+        || nSHPType == SHPT_ARCZ || nSHPType == SHPT_POLYGONZ
+        || nSHPType == SHPT_MULTIPATCH )
+    {
+        psObject->nParts = MAX(1,nParts);
+
+        psObject->panPartStart = (int *)
+            malloc(sizeof(int) * psObject->nParts);
+        psObject->panPartType = (int *)
+            malloc(sizeof(int) * psObject->nParts);
+
+        psObject->panPartStart[0] = 0;
+        psObject->panPartType[0] = SHPP_RING;
+        
+        for( i = 0; i < nParts; i++ )
+        {
+            psObject->panPartStart[i] = panPartStart[i];
+            if( panPartType != NULL )
+                psObject->panPartType[i] = panPartType[i];
+            else
+                psObject->panPartType[i] = SHPP_RING;
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Capture vertices.  Note that Z and M are optional, but X and    */
+/*      Y are not.                                                      */
+/* -------------------------------------------------------------------- */
+    if( nVertices > 0 )
+    {
+        psObject->padfX = (double *) calloc(sizeof(double),nVertices);
+        psObject->padfY = (double *) calloc(sizeof(double),nVertices);
+        psObject->padfZ = (double *) calloc(sizeof(double),nVertices);
+        psObject->padfM = (double *) calloc(sizeof(double),nVertices);
+
+        assert( padfX != NULL );
+        assert( padfY != NULL );
+    
+        for( i = 0; i < nVertices; i++ )
+        {
+            psObject->padfX[i] = padfX[i];
+            psObject->padfY[i] = padfY[i];
+            if( padfZ != NULL && bHasZ )
+                psObject->padfZ[i] = padfZ[i];
+            if( padfM != NULL && bHasM )
+                psObject->padfM[i] = padfM[i];
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Compute the extents.                                            */
+/* -------------------------------------------------------------------- */
+    psObject->nVertices = nVertices;
+    SHPComputeExtents( psObject );
+
+    return( psObject );
+}
+
+/************************************************************************/
+/*                       SHPCreateSimpleObject()                        */
+/*                                                                      */
+/*      Create a simple (common) shape object.  Destroy with            */
+/*      SHPDestroyObject().                                             */
+/************************************************************************/
+
+SHPObject SHPAPI_CALL1(*)
+SHPCreateSimpleObject( int nSHPType, int nVertices,
+                       double * padfX, double * padfY,
+                       double * padfZ )
+
+{
+    return( SHPCreateObject( nSHPType, -1, 0, NULL, NULL,
+                             nVertices, padfX, padfY, padfZ, NULL ) );
+}
+                                  
+/************************************************************************/
+/*                           SHPWriteObject()                           */
+/*                                                                      */
+/*      Write out the vertices of a new structure.  Note that it is     */
+/*      only possible to write vertices at the end of the file.         */
+/************************************************************************/
+
+int SHPAPI_CALL
+SHPWriteObject(SHPHandle psSHP, int nShapeId, SHPObject * psObject )
+		      
+{
+    int	       	nRecordOffset, i, nRecordSize;
+    uchar	*pabyRec;
+    int32	i32;
+
+    psSHP->bUpdated = TRUE;
+
+/* -------------------------------------------------------------------- */
+/*      Ensure that shape object matches the type of the file it is     */
+/*      being written to.                                               */
+/* -------------------------------------------------------------------- */
+    assert( psObject->nSHPType == psSHP->nShapeType 
+            || psObject->nSHPType == SHPT_NULL );
+
+/* -------------------------------------------------------------------- */
+/*      Ensure that -1 is used for appends.  Either blow an             */
+/*      assertion, or if they are disabled, set the shapeid to -1       */
+/*      for appends.                                                    */
+/* -------------------------------------------------------------------- */
+    assert( nShapeId == -1 
+            || (nShapeId >= 0 && nShapeId < psSHP->nRecords) );
+
+    if( nShapeId != -1 && nShapeId >= psSHP->nRecords )
+        nShapeId = -1;
+
+/* -------------------------------------------------------------------- */
+/*      Add the new entity to the in memory index.                      */
+/* -------------------------------------------------------------------- */
+    if( nShapeId == -1 && psSHP->nRecords+1 > psSHP->nMaxRecords )
+    {
+	psSHP->nMaxRecords =(int) ( psSHP->nMaxRecords * 1.3 + 100);
+
+	psSHP->panRecOffset = (int *) 
+            SfRealloc(psSHP->panRecOffset,sizeof(int) * psSHP->nMaxRecords );
+	psSHP->panRecSize = (int *) 
+            SfRealloc(psSHP->panRecSize,sizeof(int) * psSHP->nMaxRecords );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Initialize record.                                              */
+/* -------------------------------------------------------------------- */
+    pabyRec = (uchar *) malloc(psObject->nVertices * 4 * sizeof(double) 
+			       + psObject->nParts * 8 + 128);
+    
+/* -------------------------------------------------------------------- */
+/*  Extract vertices for a Polygon or Arc.				*/
+/* -------------------------------------------------------------------- */
+    if( psObject->nSHPType == SHPT_POLYGON
+        || psObject->nSHPType == SHPT_POLYGONZ
+        || psObject->nSHPType == SHPT_POLYGONM
+        || psObject->nSHPType == SHPT_ARC 
+        || psObject->nSHPType == SHPT_ARCZ
+        || psObject->nSHPType == SHPT_ARCM
+        || psObject->nSHPType == SHPT_MULTIPATCH )
+    {
+	int32		nPoints, nParts;
+	int    		i;
+
+	nPoints = psObject->nVertices;
+	nParts = psObject->nParts;
+
+	_SHPSetBounds( pabyRec + 12, psObject );
+
+	if( bBigEndian ) SwapWord( 4, &nPoints );
+	if( bBigEndian ) SwapWord( 4, &nParts );
+
+	ByteCopy( &nPoints, pabyRec + 40 + 8, 4 );
+	ByteCopy( &nParts, pabyRec + 36 + 8, 4 );
+
+        nRecordSize = 52;
+
+        /*
+         * Write part start positions.
+         */
+	ByteCopy( psObject->panPartStart, pabyRec + 44 + 8,
+                  4 * psObject->nParts );
+	for( i = 0; i < psObject->nParts; i++ )
+	{
+	    if( bBigEndian ) SwapWord( 4, pabyRec + 44 + 8 + 4*i );
+            nRecordSize += 4;
+	}
+
+        /*
+         * Write multipatch part types if needed.
+         */
+        if( psObject->nSHPType == SHPT_MULTIPATCH )
+        {
+            memcpy( pabyRec + nRecordSize, psObject->panPartType,
+                    4*psObject->nParts );
+            for( i = 0; i < psObject->nParts; i++ )
+            {
+                if( bBigEndian ) SwapWord( 4, pabyRec + nRecordSize );
+                nRecordSize += 4;
+            }
+        }
+
+        /*
+         * Write the (x,y) vertex values.
+         */
+	for( i = 0; i < psObject->nVertices; i++ )
+	{
+	    ByteCopy( psObject->padfX + i, pabyRec + nRecordSize, 8 );
+	    ByteCopy( psObject->padfY + i, pabyRec + nRecordSize + 8, 8 );
+
+	    if( bBigEndian )
+                SwapWord( 8, pabyRec + nRecordSize );
+            
+	    if( bBigEndian )
+                SwapWord( 8, pabyRec + nRecordSize + 8 );
+
+            nRecordSize += 2 * 8;
+	}
+
+        /*
+         * Write the Z coordinates (if any).
+         */
+        if( psObject->nSHPType == SHPT_POLYGONZ
+            || psObject->nSHPType == SHPT_ARCZ
+            || psObject->nSHPType == SHPT_MULTIPATCH )
+        {
+            ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+            
+            ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+
+            for( i = 0; i < psObject->nVertices; i++ )
+            {
+                ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 );
+                if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+                nRecordSize += 8;
+            }
+        }
+
+        /*
+         * Write the M values, if any.
+         */
+        if( psObject->nSHPType == SHPT_POLYGONM
+            || psObject->nSHPType == SHPT_ARCM
+#ifndef DISABLE_MULTIPATCH_MEASURE            
+            || psObject->nSHPType == SHPT_MULTIPATCH
+#endif            
+            || psObject->nSHPType == SHPT_POLYGONZ
+            || psObject->nSHPType == SHPT_ARCZ )
+        {
+            ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+            
+            ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+
+            for( i = 0; i < psObject->nVertices; i++ )
+            {
+                ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 );
+                if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+                nRecordSize += 8;
+            }
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*  Extract vertices for a MultiPoint.					*/
+/* -------------------------------------------------------------------- */
+    else if( psObject->nSHPType == SHPT_MULTIPOINT
+             || psObject->nSHPType == SHPT_MULTIPOINTZ
+             || psObject->nSHPType == SHPT_MULTIPOINTM )
+    {
+	int32		nPoints;
+	int    		i;
+
+	nPoints = psObject->nVertices;
+
+        _SHPSetBounds( pabyRec + 12, psObject );
+
+	if( bBigEndian ) SwapWord( 4, &nPoints );
+	ByteCopy( &nPoints, pabyRec + 44, 4 );
+	
+	for( i = 0; i < psObject->nVertices; i++ )
+	{
+	    ByteCopy( psObject->padfX + i, pabyRec + 48 + i*16, 8 );
+	    ByteCopy( psObject->padfY + i, pabyRec + 48 + i*16 + 8, 8 );
+
+	    if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 );
+	    if( bBigEndian ) SwapWord( 8, pabyRec + 48 + i*16 + 8 );
+	}
+
+	nRecordSize = 48 + 16 * psObject->nVertices;
+
+        if( psObject->nSHPType == SHPT_MULTIPOINTZ )
+        {
+            ByteCopy( &(psObject->dfZMin), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+
+            ByteCopy( &(psObject->dfZMax), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+            
+            for( i = 0; i < psObject->nVertices; i++ )
+            {
+                ByteCopy( psObject->padfZ + i, pabyRec + nRecordSize, 8 );
+                if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+                nRecordSize += 8;
+            }
+        }
+
+        if( psObject->nSHPType == SHPT_MULTIPOINTZ
+            || psObject->nSHPType == SHPT_MULTIPOINTM )
+        {
+            ByteCopy( &(psObject->dfMMin), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+
+            ByteCopy( &(psObject->dfMMax), pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+            
+            for( i = 0; i < psObject->nVertices; i++ )
+            {
+                ByteCopy( psObject->padfM + i, pabyRec + nRecordSize, 8 );
+                if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+                nRecordSize += 8;
+            }
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Write point.							*/
+/* -------------------------------------------------------------------- */
+    else if( psObject->nSHPType == SHPT_POINT
+             || psObject->nSHPType == SHPT_POINTZ
+             || psObject->nSHPType == SHPT_POINTM )
+    {
+	ByteCopy( psObject->padfX, pabyRec + 12, 8 );
+	ByteCopy( psObject->padfY, pabyRec + 20, 8 );
+
+	if( bBigEndian ) SwapWord( 8, pabyRec + 12 );
+	if( bBigEndian ) SwapWord( 8, pabyRec + 20 );
+
+        nRecordSize = 28;
+        
+        if( psObject->nSHPType == SHPT_POINTZ )
+        {
+            ByteCopy( psObject->padfZ, pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+        }
+        
+        if( psObject->nSHPType == SHPT_POINTZ
+            || psObject->nSHPType == SHPT_POINTM )
+        {
+            ByteCopy( psObject->padfM, pabyRec + nRecordSize, 8 );
+            if( bBigEndian ) SwapWord( 8, pabyRec + nRecordSize );
+            nRecordSize += 8;
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Not much to do for null geometries.                             */
+/* -------------------------------------------------------------------- */
+    else if( psObject->nSHPType == SHPT_NULL )
+    {
+        nRecordSize = 12;
+    }
+
+    else
+    {
+        /* unknown type */
+        assert( FALSE );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Establish where we are going to put this record. If we are      */
+/*      rewriting and existing record, and it will fit, then put it     */
+/*      back where the original came from.  Otherwise write at the end. */
+/* -------------------------------------------------------------------- */
+    if( nShapeId == -1 || psSHP->panRecSize[nShapeId] < nRecordSize-8 )
+    {
+        if( nShapeId == -1 )
+            nShapeId = psSHP->nRecords++;
+
+        psSHP->panRecOffset[nShapeId] = nRecordOffset = psSHP->nFileSize;
+        psSHP->panRecSize[nShapeId] = nRecordSize-8;
+        psSHP->nFileSize += nRecordSize;
+    }
+    else
+    {
+        nRecordOffset = psSHP->panRecOffset[nShapeId];
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Set the shape type, record number, and record size.             */
+/* -------------------------------------------------------------------- */
+    i32 = nShapeId+1;					/* record # */
+    if( !bBigEndian ) SwapWord( 4, &i32 );
+    ByteCopy( &i32, pabyRec, 4 );
+
+    i32 = (nRecordSize-8)/2;				/* record size */
+    if( !bBigEndian ) SwapWord( 4, &i32 );
+    ByteCopy( &i32, pabyRec + 4, 4 );
+
+    i32 = psObject->nSHPType;				/* shape type */
+    if( bBigEndian ) SwapWord( 4, &i32 );
+    ByteCopy( &i32, pabyRec + 8, 4 );
+
+/* -------------------------------------------------------------------- */
+/*      Write out record.                                               */
+/* -------------------------------------------------------------------- */
+    if( fseek( psSHP->fpSHP, nRecordOffset, 0 ) != 0
+        || fwrite( pabyRec, nRecordSize, 1, psSHP->fpSHP ) < 1 )
+    {
+        printf( "Error in fseek() or fwrite().\n" );
+        free( pabyRec );
+        return -1;
+    }
+    
+    free( pabyRec );
+
+/* -------------------------------------------------------------------- */
+/*	Expand file wide bounds based on this shape.			*/
+/* -------------------------------------------------------------------- */
+    if( psSHP->adBoundsMin[0] == 0.0
+        && psSHP->adBoundsMax[0] == 0.0
+        && psSHP->adBoundsMin[1] == 0.0
+        && psSHP->adBoundsMax[1] == 0.0 
+        && psObject->nSHPType != SHPT_NULL )
+    {
+        psSHP->adBoundsMin[0] = psSHP->adBoundsMax[0] = psObject->padfX[0];
+        psSHP->adBoundsMin[1] = psSHP->adBoundsMax[1] = psObject->padfY[0];
+        psSHP->adBoundsMin[2] = psSHP->adBoundsMax[2] = psObject->padfZ[0];
+        psSHP->adBoundsMin[3] = psSHP->adBoundsMax[3] = psObject->padfM[0];
+    }
+
+    for( i = 0; i < psObject->nVertices; i++ )
+    {
+	psSHP->adBoundsMin[0] = MIN(psSHP->adBoundsMin[0],psObject->padfX[i]);
+	psSHP->adBoundsMin[1] = MIN(psSHP->adBoundsMin[1],psObject->padfY[i]);
+	psSHP->adBoundsMin[2] = MIN(psSHP->adBoundsMin[2],psObject->padfZ[i]);
+	psSHP->adBoundsMin[3] = MIN(psSHP->adBoundsMin[3],psObject->padfM[i]);
+	psSHP->adBoundsMax[0] = MAX(psSHP->adBoundsMax[0],psObject->padfX[i]);
+	psSHP->adBoundsMax[1] = MAX(psSHP->adBoundsMax[1],psObject->padfY[i]);
+	psSHP->adBoundsMax[2] = MAX(psSHP->adBoundsMax[2],psObject->padfZ[i]);
+	psSHP->adBoundsMax[3] = MAX(psSHP->adBoundsMax[3],psObject->padfM[i]);
+    }
+
+    return( nShapeId  );
+}
+
+/************************************************************************/
+/*                          SHPReadObject()                             */
+/*                                                                      */
+/*      Read the vertices, parts, and other non-attribute information	*/
+/*	for one shape.							*/
+/************************************************************************/
+
+SHPObject SHPAPI_CALL1(*)
+SHPReadObject( SHPHandle psSHP, int hEntity )
+
+{
+    SHPObject		*psShape;
+
+/* -------------------------------------------------------------------- */
+/*      Validate the record/entity number.                              */
+/* -------------------------------------------------------------------- */
+    if( hEntity < 0 || hEntity >= psSHP->nRecords )
+        return( NULL );
+
+/* -------------------------------------------------------------------- */
+/*      Ensure our record buffer is large enough.                       */
+/* -------------------------------------------------------------------- */
+    if( psSHP->panRecSize[hEntity]+8 > psSHP->nBufSize )
+    {
+	psSHP->nBufSize = psSHP->panRecSize[hEntity]+8;
+	psSHP->pabyRec = (uchar *) SfRealloc(psSHP->pabyRec,psSHP->nBufSize);
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Read the record.                                                */
+/* -------------------------------------------------------------------- */
+    fseek( psSHP->fpSHP, psSHP->panRecOffset[hEntity], 0 );
+    fread( psSHP->pabyRec, psSHP->panRecSize[hEntity]+8, 1, psSHP->fpSHP );
+
+/* -------------------------------------------------------------------- */
+/*	Allocate and minimally initialize the object.			*/
+/* -------------------------------------------------------------------- */
+    psShape = (SHPObject *) calloc(1,sizeof(SHPObject));
+    psShape->nShapeId = hEntity;
+
+    memcpy( &psShape->nSHPType, psSHP->pabyRec + 8, 4 );
+    if( bBigEndian ) SwapWord( 4, &(psShape->nSHPType) );
+
+/* ==================================================================== */
+/*  Extract vertices for a Polygon or Arc.				*/
+/* ==================================================================== */
+    if( psShape->nSHPType == SHPT_POLYGON || psShape->nSHPType == SHPT_ARC
+        || psShape->nSHPType == SHPT_POLYGONZ
+        || psShape->nSHPType == SHPT_POLYGONM
+        || psShape->nSHPType == SHPT_ARCZ
+        || psShape->nSHPType == SHPT_ARCM
+        || psShape->nSHPType == SHPT_MULTIPATCH )
+    {
+	int32		nPoints, nParts;
+	int    		i, nOffset;
+
+/* -------------------------------------------------------------------- */
+/*	Get the X/Y bounds.						*/
+/* -------------------------------------------------------------------- */
+        memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 +  4, 8 );
+        memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 );
+        memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 );
+        memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 );
+
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) );
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) );
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) );
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) );
+
+/* -------------------------------------------------------------------- */
+/*      Extract part/point count, and build vertex and part arrays      */
+/*      to proper size.                                                 */
+/* -------------------------------------------------------------------- */
+	memcpy( &nPoints, psSHP->pabyRec + 40 + 8, 4 );
+	memcpy( &nParts, psSHP->pabyRec + 36 + 8, 4 );
+
+	if( bBigEndian ) SwapWord( 4, &nPoints );
+	if( bBigEndian ) SwapWord( 4, &nParts );
+
+	psShape->nVertices = nPoints;
+        psShape->padfX = (double *) calloc(nPoints,sizeof(double));
+        psShape->padfY = (double *) calloc(nPoints,sizeof(double));
+        psShape->padfZ = (double *) calloc(nPoints,sizeof(double));
+        psShape->padfM = (double *) calloc(nPoints,sizeof(double));
+
+	psShape->nParts = nParts;
+        psShape->panPartStart = (int *) calloc(nParts,sizeof(int));
+        psShape->panPartType = (int *) calloc(nParts,sizeof(int));
+
+        for( i = 0; i < nParts; i++ )
+            psShape->panPartType[i] = SHPP_RING;
+
+/* -------------------------------------------------------------------- */
+/*      Copy out the part array from the record.                        */
+/* -------------------------------------------------------------------- */
+	memcpy( psShape->panPartStart, psSHP->pabyRec + 44 + 8, 4 * nParts );
+	for( i = 0; i < nParts; i++ )
+	{
+	    if( bBigEndian ) SwapWord( 4, psShape->panPartStart+i );
+	}
+
+	nOffset = 44 + 8 + 4*nParts;
+
+/* -------------------------------------------------------------------- */
+/*      If this is a multipatch, we will also have parts types.         */
+/* -------------------------------------------------------------------- */
+        if( psShape->nSHPType == SHPT_MULTIPATCH )
+        {
+            memcpy( psShape->panPartType, psSHP->pabyRec + nOffset, 4*nParts );
+            for( i = 0; i < nParts; i++ )
+            {
+                if( bBigEndian ) SwapWord( 4, psShape->panPartType+i );
+            }
+
+            nOffset += 4*nParts;
+        }
+        
+/* -------------------------------------------------------------------- */
+/*      Copy out the vertices from the record.                          */
+/* -------------------------------------------------------------------- */
+	for( i = 0; i < nPoints; i++ )
+	{
+	    memcpy(psShape->padfX + i,
+		   psSHP->pabyRec + nOffset + i * 16,
+		   8 );
+
+	    memcpy(psShape->padfY + i,
+		   psSHP->pabyRec + nOffset + i * 16 + 8,
+		   8 );
+
+	    if( bBigEndian ) SwapWord( 8, psShape->padfX + i );
+	    if( bBigEndian ) SwapWord( 8, psShape->padfY + i );
+	}
+
+        nOffset += 16*nPoints;
+        
+/* -------------------------------------------------------------------- */
+/*      If we have a Z coordinate, collect that now.                    */
+/* -------------------------------------------------------------------- */
+        if( psShape->nSHPType == SHPT_POLYGONZ
+            || psShape->nSHPType == SHPT_ARCZ
+            || psShape->nSHPType == SHPT_MULTIPATCH )
+        {
+            memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 );
+            memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 );
+            
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) );
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) );
+            
+            for( i = 0; i < nPoints; i++ )
+            {
+                memcpy( psShape->padfZ + i,
+                        psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+                if( bBigEndian ) SwapWord( 8, psShape->padfZ + i );
+            }
+
+            nOffset += 16 + 8*nPoints;
+        }
+
+/* -------------------------------------------------------------------- */
+/*      If we have a M measure value, then read it now.  We assume      */
+/*      that the measure can be present for any shape if the size is    */
+/*      big enough, but really it will only occur for the Z shapes      */
+/*      (options), and the M shapes.                                    */
+/* -------------------------------------------------------------------- */
+        if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints )
+        {
+            memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 );
+            memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 );
+            
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) );
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) );
+            
+            for( i = 0; i < nPoints; i++ )
+            {
+                memcpy( psShape->padfM + i,
+                        psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+                if( bBigEndian ) SwapWord( 8, psShape->padfM + i );
+            }
+        }
+        
+    }
+
+/* ==================================================================== */
+/*  Extract vertices for a MultiPoint.					*/
+/* ==================================================================== */
+    else if( psShape->nSHPType == SHPT_MULTIPOINT
+             || psShape->nSHPType == SHPT_MULTIPOINTM
+             || psShape->nSHPType == SHPT_MULTIPOINTZ )
+    {
+	int32		nPoints;
+	int    		i, nOffset;
+
+	memcpy( &nPoints, psSHP->pabyRec + 44, 4 );
+	if( bBigEndian ) SwapWord( 4, &nPoints );
+
+	psShape->nVertices = nPoints;
+        psShape->padfX = (double *) calloc(nPoints,sizeof(double));
+        psShape->padfY = (double *) calloc(nPoints,sizeof(double));
+        psShape->padfZ = (double *) calloc(nPoints,sizeof(double));
+        psShape->padfM = (double *) calloc(nPoints,sizeof(double));
+
+	for( i = 0; i < nPoints; i++ )
+	{
+	    memcpy(psShape->padfX+i, psSHP->pabyRec + 48 + 16 * i, 8 );
+	    memcpy(psShape->padfY+i, psSHP->pabyRec + 48 + 16 * i + 8, 8 );
+
+	    if( bBigEndian ) SwapWord( 8, psShape->padfX + i );
+	    if( bBigEndian ) SwapWord( 8, psShape->padfY + i );
+	}
+
+        nOffset = 48 + 16*nPoints;
+        
+/* -------------------------------------------------------------------- */
+/*	Get the X/Y bounds.						*/
+/* -------------------------------------------------------------------- */
+        memcpy( &(psShape->dfXMin), psSHP->pabyRec + 8 +  4, 8 );
+        memcpy( &(psShape->dfYMin), psSHP->pabyRec + 8 + 12, 8 );
+        memcpy( &(psShape->dfXMax), psSHP->pabyRec + 8 + 20, 8 );
+        memcpy( &(psShape->dfYMax), psSHP->pabyRec + 8 + 28, 8 );
+
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfXMin) );
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfYMin) );
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfXMax) );
+	if( bBigEndian ) SwapWord( 8, &(psShape->dfYMax) );
+
+/* -------------------------------------------------------------------- */
+/*      If we have a Z coordinate, collect that now.                    */
+/* -------------------------------------------------------------------- */
+        if( psShape->nSHPType == SHPT_MULTIPOINTZ )
+        {
+            memcpy( &(psShape->dfZMin), psSHP->pabyRec + nOffset, 8 );
+            memcpy( &(psShape->dfZMax), psSHP->pabyRec + nOffset + 8, 8 );
+            
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfZMin) );
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfZMax) );
+            
+            for( i = 0; i < nPoints; i++ )
+            {
+                memcpy( psShape->padfZ + i,
+                        psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+                if( bBigEndian ) SwapWord( 8, psShape->padfZ + i );
+            }
+
+            nOffset += 16 + 8*nPoints;
+        }
+
+/* -------------------------------------------------------------------- */
+/*      If we have a M measure value, then read it now.  We assume      */
+/*      that the measure can be present for any shape if the size is    */
+/*      big enough, but really it will only occur for the Z shapes      */
+/*      (options), and the M shapes.                                    */
+/* -------------------------------------------------------------------- */
+        if( psSHP->panRecSize[hEntity]+8 >= nOffset + 16 + 8*nPoints )
+        {
+            memcpy( &(psShape->dfMMin), psSHP->pabyRec + nOffset, 8 );
+            memcpy( &(psShape->dfMMax), psSHP->pabyRec + nOffset + 8, 8 );
+            
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfMMin) );
+            if( bBigEndian ) SwapWord( 8, &(psShape->dfMMax) );
+            
+            for( i = 0; i < nPoints; i++ )
+            {
+                memcpy( psShape->padfM + i,
+                        psSHP->pabyRec + nOffset + 16 + i*8, 8 );
+                if( bBigEndian ) SwapWord( 8, psShape->padfM + i );
+            }
+        }
+    }
+
+/* ==================================================================== */
+/*      Extract vertices for a point.                                   */
+/* ==================================================================== */
+    else if( psShape->nSHPType == SHPT_POINT
+             || psShape->nSHPType == SHPT_POINTM
+             || psShape->nSHPType == SHPT_POINTZ )
+    {
+        int	nOffset;
+        
+	psShape->nVertices = 1;
+        psShape->padfX = (double *) calloc(1,sizeof(double));
+        psShape->padfY = (double *) calloc(1,sizeof(double));
+        psShape->padfZ = (double *) calloc(1,sizeof(double));
+        psShape->padfM = (double *) calloc(1,sizeof(double));
+
+	memcpy( psShape->padfX, psSHP->pabyRec + 12, 8 );
+	memcpy( psShape->padfY, psSHP->pabyRec + 20, 8 );
+
+	if( bBigEndian ) SwapWord( 8, psShape->padfX );
+	if( bBigEndian ) SwapWord( 8, psShape->padfY );
+
+        nOffset = 20 + 8;
+        
+/* -------------------------------------------------------------------- */
+/*      If we have a Z coordinate, collect that now.                    */
+/* -------------------------------------------------------------------- */
+        if( psShape->nSHPType == SHPT_POINTZ )
+        {
+            memcpy( psShape->padfZ, psSHP->pabyRec + nOffset, 8 );
+        
+            if( bBigEndian ) SwapWord( 8, psShape->padfZ );
+            
+            nOffset += 8;
+        }
+
+/* -------------------------------------------------------------------- */
+/*      If we have a M measure value, then read it now.  We assume      */
+/*      that the measure can be present for any shape if the size is    */
+/*      big enough, but really it will only occur for the Z shapes      */
+/*      (options), and the M shapes.                                    */
+/* -------------------------------------------------------------------- */
+        if( psSHP->panRecSize[hEntity]+8 >= nOffset + 8 )
+        {
+            memcpy( psShape->padfM, psSHP->pabyRec + nOffset, 8 );
+        
+            if( bBigEndian ) SwapWord( 8, psShape->padfM );
+        }
+
+/* -------------------------------------------------------------------- */
+/*      Since no extents are supplied in the record, we will apply      */
+/*      them from the single vertex.                                    */
+/* -------------------------------------------------------------------- */
+        psShape->dfXMin = psShape->dfXMax = psShape->padfX[0];
+        psShape->dfYMin = psShape->dfYMax = psShape->padfY[0];
+        psShape->dfZMin = psShape->dfZMax = psShape->padfZ[0];
+        psShape->dfMMin = psShape->dfMMax = psShape->padfM[0];
+    }
+
+    return( psShape );
+}
+
+/************************************************************************/
+/*                            SHPTypeName()                             */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+SHPTypeName( int nSHPType )
+
+{
+    switch( nSHPType )
+    {
+      case SHPT_NULL:
+        return "NullShape";
+
+      case SHPT_POINT:
+        return "Point";
+
+      case SHPT_ARC:
+        return "Arc";
+
+      case SHPT_POLYGON:
+        return "Polygon";
+
+      case SHPT_MULTIPOINT:
+        return "MultiPoint";
+        
+      case SHPT_POINTZ:
+        return "PointZ";
+
+      case SHPT_ARCZ:
+        return "ArcZ";
+
+      case SHPT_POLYGONZ:
+        return "PolygonZ";
+
+      case SHPT_MULTIPOINTZ:
+        return "MultiPointZ";
+        
+      case SHPT_POINTM:
+        return "PointM";
+
+      case SHPT_ARCM:
+        return "ArcM";
+
+      case SHPT_POLYGONM:
+        return "PolygonM";
+
+      case SHPT_MULTIPOINTM:
+        return "MultiPointM";
+
+      case SHPT_MULTIPATCH:
+        return "MultiPatch";
+
+      default:
+        return "UnknownShapeType";
+    }
+}
+
+/************************************************************************/
+/*                          SHPPartTypeName()                           */
+/************************************************************************/
+
+const char SHPAPI_CALL1(*)
+SHPPartTypeName( int nPartType )
+
+{
+    switch( nPartType )
+    {
+      case SHPP_TRISTRIP:
+        return "TriangleStrip";
+        
+      case SHPP_TRIFAN:
+        return "TriangleFan";
+
+      case SHPP_OUTERRING:
+        return "OuterRing";
+
+      case SHPP_INNERRING:
+        return "InnerRing";
+
+      case SHPP_FIRSTRING:
+        return "FirstRing";
+
+      case SHPP_RING:
+        return "Ring";
+
+      default:
+        return "UnknownPartType";
+    }
+}
+
+/************************************************************************/
+/*                          SHPDestroyObject()                          */
+/************************************************************************/
+
+void SHPAPI_CALL
+SHPDestroyObject( SHPObject * psShape )
+
+{
+    if( psShape == NULL )
+        return;
+    
+    if( psShape->padfX != NULL )
+        free( psShape->padfX );
+    if( psShape->padfY != NULL )
+        free( psShape->padfY );
+    if( psShape->padfZ != NULL )
+        free( psShape->padfZ );
+    if( psShape->padfM != NULL )
+        free( psShape->padfM );
+
+    if( psShape->panPartStart != NULL )
+        free( psShape->panPartStart );
+    if( psShape->panPartType != NULL )
+        free( psShape->panPartType );
+
+    free( psShape );
+}
+
+/************************************************************************/
+/*                          SHPRewindObject()                           */
+/*                                                                      */
+/*      Reset the winding of polygon objects to adhere to the           */
+/*      specification.                                                  */
+/************************************************************************/
+
+int SHPAPI_CALL
+SHPRewindObject( SHPHandle hSHP, SHPObject * psObject )
+
+{
+    int  iOpRing, bAltered = 0;
+
+/* -------------------------------------------------------------------- */
+/*      Do nothing if this is not a polygon object.                     */
+/* -------------------------------------------------------------------- */
+    if( psObject->nSHPType != SHPT_POLYGON
+        && psObject->nSHPType != SHPT_POLYGONZ
+        && psObject->nSHPType != SHPT_POLYGONM )
+        return 0;
+
+/* -------------------------------------------------------------------- */
+/*      Process each of the rings.                                      */
+/* -------------------------------------------------------------------- */
+    for( iOpRing = 0; iOpRing < psObject->nParts; iOpRing++ )
+    {
+        int      bInner, iVert, nVertCount, nVertStart, iCheckRing;
+        double   dfSum, dfTestX, dfTestY;
+
+/* -------------------------------------------------------------------- */
+/*      Determine if this ring is an inner ring or an outer ring        */
+/*      relative to all the other rings.  For now we assume the         */
+/*      first ring is outer and all others are inner, but eventually    */
+/*      we need to fix this to handle multiple island polygons and      */
+/*      unordered sets of rings.                                        */
+/* -------------------------------------------------------------------- */
+        dfTestX = psObject->padfX[psObject->panPartStart[iOpRing]];
+        dfTestY = psObject->padfY[psObject->panPartStart[iOpRing]];
+
+        bInner = FALSE;
+        for( iCheckRing = 0; iCheckRing < psObject->nParts; iCheckRing++ )
+        {
+            int iEdge;
+
+            if( iCheckRing == iOpRing )
+                continue;
+            
+            nVertStart = psObject->panPartStart[iCheckRing];
+
+            if( iCheckRing == psObject->nParts-1 )
+                nVertCount = psObject->nVertices 
+                    - psObject->panPartStart[iCheckRing];
+            else
+                nVertCount = psObject->panPartStart[iCheckRing+1] 
+                    - psObject->panPartStart[iCheckRing];
+
+            for( iEdge = 0; iEdge < nVertCount; iEdge++ )
+            {
+                int iNext;
+
+                if( iEdge < nVertCount-1 )
+                    iNext = iEdge+1;
+                else
+                    iNext = 0;
+
+                if( (psObject->padfY[iEdge+nVertStart] < dfTestY 
+                     && psObject->padfY[iNext+nVertStart] >= dfTestY)
+                    || (psObject->padfY[iNext+nVertStart] < dfTestY 
+                        && psObject->padfY[iEdge+nVertStart] >= dfTestY) )
+                {
+                    if( psObject->padfX[iEdge+nVertStart] 
+                        + (dfTestY - psObject->padfY[iEdge+nVertStart])
+                           / (psObject->padfY[iNext+nVertStart]
+                              - psObject->padfY[iEdge+nVertStart])
+                           * (psObject->padfX[iNext+nVertStart]
+                              - psObject->padfX[iEdge+nVertStart]) < dfTestX )
+                        bInner = !bInner;
+                }
+            }
+        }
+
+/* -------------------------------------------------------------------- */
+/*      Determine the current order of this ring so we will know if     */
+/*      it has to be reversed.                                          */
+/* -------------------------------------------------------------------- */
+        nVertStart = psObject->panPartStart[iOpRing];
+
+        if( iOpRing == psObject->nParts-1 )
+            nVertCount = psObject->nVertices - psObject->panPartStart[iOpRing];
+        else
+            nVertCount = psObject->panPartStart[iOpRing+1] 
+                - psObject->panPartStart[iOpRing];
+
+        dfSum = 0.0;
+        for( iVert = nVertStart; iVert < nVertStart+nVertCount-1; iVert++ )
+        {
+            dfSum += psObject->padfX[iVert] * psObject->padfY[iVert+1]
+                - psObject->padfY[iVert] * psObject->padfX[iVert+1];
+        }
+
+        dfSum += psObject->padfX[iVert] * psObject->padfY[nVertStart]
+               - psObject->padfY[iVert] * psObject->padfX[nVertStart];
+
+/* -------------------------------------------------------------------- */
+/*      Reverse if necessary.                                           */
+/* -------------------------------------------------------------------- */
+        if( (dfSum < 0.0 && bInner) || (dfSum > 0.0 && !bInner) )
+        {
+            int   i;
+
+            bAltered++;
+            for( i = 0; i < nVertCount/2; i++ )
+            {
+                double dfSaved;
+
+                /* Swap X */
+                dfSaved = psObject->padfX[nVertStart+i];
+                psObject->padfX[nVertStart+i] = 
+                    psObject->padfX[nVertStart+nVertCount-i-1];
+                psObject->padfX[nVertStart+nVertCount-i-1] = dfSaved;
+
+                /* Swap Y */
+                dfSaved = psObject->padfY[nVertStart+i];
+                psObject->padfY[nVertStart+i] = 
+                    psObject->padfY[nVertStart+nVertCount-i-1];
+                psObject->padfY[nVertStart+nVertCount-i-1] = dfSaved;
+
+                /* Swap Z */
+                if( psObject->padfZ )
+                {
+                    dfSaved = psObject->padfZ[nVertStart+i];
+                    psObject->padfZ[nVertStart+i] = 
+                        psObject->padfZ[nVertStart+nVertCount-i-1];
+                    psObject->padfZ[nVertStart+nVertCount-i-1] = dfSaved;
+                }
+
+                /* Swap M */
+                if( psObject->padfM )
+                {
+                    dfSaved = psObject->padfM[nVertStart+i];
+                    psObject->padfM[nVertStart+i] = 
+                        psObject->padfM[nVertStart+nVertCount-i-1];
+                    psObject->padfM[nVertStart+nVertCount-i-1] = dfSaved;
+                }
+            }
+        }
+    }
+
+    return bAltered;
+}
diff --git a/src/terralib/PDI/.cvsignore b/src/terralib/PDI/.cvsignore
new file mode 100644
index 0000000..33ceb8f
--- /dev/null
+++ b/src/terralib/PDI/.cvsignore
@@ -0,0 +1 @@
+Makefile
\ No newline at end of file
diff --git a/src/terralib/PDI/Doxyfile b/src/terralib/PDI/Doxyfile
new file mode 100644
index 0000000..234bd7b
--- /dev/null
+++ b/src/terralib/PDI/Doxyfile
@@ -0,0 +1,214 @@
+# Doxyfile 1.3.9.1
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+PROJECT_NAME           = "TerraLib - Digital Image Processing Algorithms"
+PROJECT_NUMBER         = 
+OUTPUT_DIRECTORY       = docs
+CREATE_SUBDIRS         = YES
+OUTPUT_LANGUAGE        = English
+USE_WINDOWS_ENCODING   = YES
+BRIEF_MEMBER_DESC      = YES
+REPEAT_BRIEF           = NO
+ABBREVIATE_BRIEF       = 
+ALWAYS_DETAILED_SEC    = YES
+INLINE_INHERITED_MEMB  = YES
+FULL_PATH_NAMES        = NO
+STRIP_FROM_PATH        = 
+STRIP_FROM_INC_PATH    = 
+SHORT_NAMES            = YES
+JAVADOC_AUTOBRIEF      = YES
+MULTILINE_CPP_IS_BRIEF = NO
+DETAILS_AT_TOP         = YES
+INHERIT_DOCS           = YES
+DISTRIBUTE_GROUP_DOC   = NO
+TAB_SIZE               = 8
+ALIASES                = 
+OPTIMIZE_OUTPUT_FOR_C  = YES
+OPTIMIZE_OUTPUT_JAVA   = NO
+SUBGROUPING            = NO
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+EXTRACT_ALL            = YES
+EXTRACT_PRIVATE        = YES
+EXTRACT_STATIC         = YES
+EXTRACT_LOCAL_CLASSES  = YES
+EXTRACT_LOCAL_METHODS  = YES
+HIDE_UNDOC_MEMBERS     = NO
+HIDE_UNDOC_CLASSES     = NO
+HIDE_FRIEND_COMPOUNDS  = NO
+HIDE_IN_BODY_DOCS      = NO
+INTERNAL_DOCS          = YES
+CASE_SENSE_NAMES       = YES
+HIDE_SCOPE_NAMES       = NO
+SHOW_INCLUDE_FILES     = YES
+INLINE_INFO            = YES
+SORT_MEMBER_DOCS       = YES
+SORT_BRIEF_DOCS        = YES
+SORT_BY_SCOPE_NAME     = NO
+GENERATE_TODOLIST      = YES
+GENERATE_TESTLIST      = YES
+GENERATE_BUGLIST       = YES
+GENERATE_DEPRECATEDLIST= YES
+ENABLED_SECTIONS       = 
+MAX_INITIALIZER_LINES  = 30
+SHOW_USED_FILES        = YES
+SHOW_DIRECTORIES       = YES
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+QUIET                  = NO
+WARNINGS               = YES
+WARN_IF_UNDOCUMENTED   = YES
+WARN_IF_DOC_ERROR      = YES
+WARN_FORMAT            = "$file:$line: $text"
+WARN_LOGFILE           = 
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+INPUT                  = source
+FILE_PATTERNS          = 
+RECURSIVE              = YES
+EXCLUDE                = 
+EXCLUDE_SYMLINKS       = NO
+EXCLUDE_PATTERNS       = 
+EXAMPLE_PATH           = 
+EXAMPLE_PATTERNS       = 
+EXAMPLE_RECURSIVE      = YES
+IMAGE_PATH             = 
+INPUT_FILTER           = 
+FILTER_PATTERNS        = 
+FILTER_SOURCE_FILES    = YES
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+SOURCE_BROWSER         = YES
+INLINE_SOURCES         = YES
+STRIP_CODE_COMMENTS    = NO
+REFERENCED_BY_RELATION = YES
+REFERENCES_RELATION    = YES
+VERBATIM_HEADERS       = YES
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+ALPHABETICAL_INDEX     = YES
+COLS_IN_ALPHA_INDEX    = 5
+IGNORE_PREFIX          = 
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+GENERATE_HTML          = YES
+HTML_OUTPUT            = html
+HTML_FILE_EXTENSION    = .html
+HTML_HEADER            = 
+HTML_FOOTER            = 
+HTML_STYLESHEET        = 
+HTML_ALIGN_MEMBERS     = YES
+GENERATE_HTMLHELP      = YES
+CHM_FILE               = 
+HHC_LOCATION           = 
+GENERATE_CHI           = YES
+BINARY_TOC             = NO
+TOC_EXPAND             = YES
+DISABLE_INDEX          = NO
+ENUM_VALUES_PER_LINE   = 4
+GENERATE_TREEVIEW      = YES
+TREEVIEW_WIDTH         = 250
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+GENERATE_LATEX         = NO
+LATEX_OUTPUT           = latex
+LATEX_CMD_NAME         = latex
+MAKEINDEX_CMD_NAME     = makeindex
+COMPACT_LATEX          = NO
+PAPER_TYPE             = a4wide
+EXTRA_PACKAGES         = 
+LATEX_HEADER           = 
+PDF_HYPERLINKS         = NO
+USE_PDFLATEX           = NO
+LATEX_BATCHMODE        = NO
+LATEX_HIDE_INDICES     = NO
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+GENERATE_RTF           = NO
+RTF_OUTPUT             = rtf
+COMPACT_RTF            = NO
+RTF_HYPERLINKS         = NO
+RTF_STYLESHEET_FILE    = 
+RTF_EXTENSIONS_FILE    = 
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+GENERATE_MAN           = NO
+MAN_OUTPUT             = man
+MAN_EXTENSION          = .3
+MAN_LINKS              = NO
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+GENERATE_XML           = NO
+XML_OUTPUT             = xml
+XML_SCHEMA             = 
+XML_DTD                = 
+XML_PROGRAMLISTING     = YES
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+GENERATE_AUTOGEN_DEF   = NO
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+GENERATE_PERLMOD       = NO
+PERLMOD_LATEX          = NO
+PERLMOD_PRETTY         = YES
+PERLMOD_MAKEVAR_PREFIX = 
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+ENABLE_PREPROCESSING   = YES
+MACRO_EXPANSION        = NO
+EXPAND_ONLY_PREDEF     = NO
+SEARCH_INCLUDES        = YES
+INCLUDE_PATH           = 
+INCLUDE_FILE_PATTERNS  = 
+PREDEFINED             = 
+EXPAND_AS_DEFINED      = 
+SKIP_FUNCTION_MACROS   = NO
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+TAGFILES               = 
+GENERATE_TAGFILE       = 
+ALLEXTERNALS           = YES
+EXTERNAL_GROUPS        = YES
+PERL_PATH              = /usr/bin/perl
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+CLASS_DIAGRAMS         = YES
+HIDE_UNDOC_RELATIONS   = NO
+HAVE_DOT               = YES
+CLASS_GRAPH            = YES
+COLLABORATION_GRAPH    = YES
+UML_LOOK               = NO
+TEMPLATE_RELATIONS     = YES
+INCLUDE_GRAPH          = YES
+INCLUDED_BY_GRAPH      = YES
+CALL_GRAPH             = YES
+GRAPHICAL_HIERARCHY    = YES
+DOT_IMAGE_FORMAT       = png
+DOT_PATH               = 
+DOTFILE_DIRS           = 
+MAX_DOT_GRAPH_WIDTH    = 1024
+MAX_DOT_GRAPH_HEIGHT   = 1024
+MAX_DOT_GRAPH_DEPTH    = 0
+GENERATE_LEGEND        = YES
+DOT_CLEANUP            = YES
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+SEARCHENGINE           = YES
diff --git a/src/terralib/PDI/PDI.pro b/src/terralib/PDI/PDI.pro
new file mode 100755
index 0000000..0f63f80
--- /dev/null
+++ b/src/terralib/PDI/PDI.pro
@@ -0,0 +1,8 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+          source \
+          tests
+
+
diff --git a/src/terralib/PDI/bin/.cvsignore b/src/terralib/PDI/bin/.cvsignore
new file mode 100644
index 0000000..e69de29
diff --git a/src/terralib/PDI/bin/dynamic/.cvsignore b/src/terralib/PDI/bin/dynamic/.cvsignore
new file mode 100644
index 0000000..1f78391
--- /dev/null
+++ b/src/terralib/PDI/bin/dynamic/.cvsignore
@@ -0,0 +1 @@
+libterralibpdi*
diff --git a/src/terralib/PDI/bin/static/.cvsignore b/src/terralib/PDI/bin/static/.cvsignore
new file mode 100644
index 0000000..1f78391
--- /dev/null
+++ b/src/terralib/PDI/bin/static/.cvsignore
@@ -0,0 +1 @@
+libterralibpdi*
diff --git a/src/terralib/PDI/docs/.cvsignore b/src/terralib/PDI/docs/.cvsignore
new file mode 100644
index 0000000..1936cc1
--- /dev/null
+++ b/src/terralib/PDI/docs/.cvsignore
@@ -0,0 +1 @@
+html
diff --git a/src/terralib/PDI/source/.cvsignore b/src/terralib/PDI/source/.cvsignore
new file mode 100644
index 0000000..550bd25
--- /dev/null
+++ b/src/terralib/PDI/source/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+
diff --git a/src/terralib/PDI/source/TePDIAgnostic.cpp b/src/terralib/PDI/source/TePDIAgnostic.cpp
new file mode 100644
index 0000000..f19c24a
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAgnostic.cpp
@@ -0,0 +1,13 @@
+#include "TePDIAgnostic.hpp"
+
+#include "stdio.h"
+
+namespace TePDIAgnostic{
+
+  void redirect_log( char* log_file_name, char* error_log_file_name )
+  {
+    freopen( log_file_name, "w", stdout );
+    freopen( error_log_file_name, "w", stderr );
+  };
+
+};
diff --git a/src/terralib/PDI/source/TePDIAgnostic.hpp b/src/terralib/PDI/source/TePDIAgnostic.hpp
new file mode 100644
index 0000000..b33a1e0
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAgnostic.hpp
@@ -0,0 +1,257 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *  This file contains a set of macros, routines and classes to deal with
+ *  system checking and logging facility.
+ */
+
+#ifndef TEPDIAGNOSTIC_HPP
+  #define TEPDIAGNOSTIC_HPP
+
+  #include <stdlib.h>
+  #include <stdio.h>
+  #include <sstream>
+  #include <string>
+  #include <iostream>
+
+  #ifdef USETERRALIBLOG
+
+    #include <TeException.h>
+    #include <TeErrorLog.h>
+
+    /**
+     * Logs a message to stdout
+     *
+     * @param message Message to be logged.
+    */
+    #define PDIAGN_LOGMSG(message) \
+      TeErroLog::instance().insert( LOG_MESSAGE, std::string( __DATE__ ) + \
+      " - " + std::string( __TIME__ ) + " - " + std::string( __FILE__ ) + \
+      ":" + std::string( __LINE__ ) + " : " + \
+      TePDIAgnostic::to_string( message ) );
+
+    /**
+     * Logs a message to stderr
+     *
+     * @param message Message to be logged.
+    */
+    #define PDIAGN_LOGERR(message) \
+      TeErroLog::instance().insert( UNKNOWN_ERROR_TYPE, \
+      std::string( __DATE__ ) + \
+      " - " + std::string( __TIME__ ) + " - " + std::string( __FILE__ ) + \
+      ":" + std::string( __LINE__ ) + " : " + \
+      TePDIAgnostic::to_string( message ) );
+
+  #else // USETERRALIBLOG
+
+    /**
+    * Logs a message to stdout
+    *
+    * @param message Message to be logged.
+    */
+    #define PDIAGN_LOGMSG(message) \
+      std::cout << std::endl << "Message :" \
+        << " " << __DATE__ \
+        << " " << __TIME__ \
+        << " - " << __FILE__ \
+        << ":" << __LINE__ \
+        << " - " << TePDIAgnostic::to_string( message ) \
+        << std::endl;
+
+    /**
+    * Logs a error message to stderr
+    *
+    * @param message Message to be logged.
+    */
+    #define PDIAGN_LOGERR(message) \
+      std::cerr << std::endl << "Error :" \
+        << " " << __DATE__ \
+        << " " << __TIME__ \
+        << " - " << __FILE__ \
+        << ":" << __LINE__ \
+        << " - " << TePDIAgnostic::to_string( message ) \
+        << std::endl;
+
+  #endif // USETERRALIBLOG
+
+  /**
+   * Logs a message to stderr and throws.
+   *
+   * @param variable Variable to be logged.
+   */
+  #define PDIAGN_WATCH( variable ) \
+    { \
+      PDIAGN_LOGMSG( "WATCH - " + TePDIAgnostic::to_string( #variable ) + \
+      "=" + TePDIAgnostic::to_string( variable ) ); \
+    }
+
+  /**
+   * Logs a message to stderr and throws.
+   *
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_LOG_AND_THROW( message ) \
+    { \
+      PDIAGN_LOGERR( message ); \
+      throw; \
+    }
+
+  /**
+   *  Checks if value is true and throws an exception if not.
+   *
+   * @param value Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_TRUE_OR_THROW(value,message) \
+    if( value == 0 ) { \
+      PDIAGN_LOG_AND_THROW( message ); \
+    };
+
+  /**
+   *  Checks if value is true and logs an error message if not.
+   *
+   * @param value Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_TRUE_OR_LOG(value,message) \
+    if( value == 0 ) { \
+      PDIAGN_LOGERR( message ); \
+    };
+
+  /**
+   * Checks if value is true. if not a message will be logget and
+   * a return of context with false value will be done.
+   *
+   * @param value Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_TRUE_OR_RETURN(value,message) \
+    if( value == 0 ) { \
+      PDIAGN_LOGERR( message ); \
+      return false; \
+    };
+
+  /**
+   *  Checks if value is false and logs an error message if not.
+   *
+   * @param value Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_FALSE_OR_LOG(value,message) \
+    if( value != 0 ) { \
+      PDIAGN_LOGERR( message ); \
+    };
+
+  /**
+   *  Checks if two values are equal and throws an exception if not.
+   *
+   * @param value1 Value to be checked.
+   * @param value2 Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_CHECK_EQUAL(value1,value2,message) \
+    PDIAGN_TRUE_OR_THROW( ( value1 == value2 ), \
+    message + std::string( " [" ) + \
+    TePDIAgnostic::to_string( value1 ) + "!=" + \
+    TePDIAgnostic::to_string( value2 ) + "]" );
+
+  /**
+   *  Checks if two values are diferent and throws an exception if not.
+   *
+   * @param value1 Value to be checked.
+   * @param value2 Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_CHECK_NOTEQUAL(value1,value2,message) \
+    PDIAGN_TRUE_OR_THROW( ( value1 != value2 ), \
+    message + std::string( " [Values are equal]" ) );
+
+  /**
+   * Throws an exception for not implemented source.
+   */
+  #define PDIAGN_NOT_IMPLEMENTED \
+    PDIAGN_LOG_AND_THROW( "Not Implemented." );
+
+  /**
+   *  Checks if Debug mode is enabled and throws an exception if not.
+   */
+  #ifdef NDEBUG
+    #define PDIAGN_DEBUG_MODE_CHECK \
+      PDIAGN_LOG_AND_THROW( "Debug Mode Disabled." );
+  #else
+    #define PDIAGN_DEBUG_MODE_CHECK {};
+  #endif
+
+  /**
+   * Checks if value is true and throws an exception if not.
+   * This macro will be disabled for non debug mode.
+   *
+   * @param value Value to be checked.
+   * @param message Message to be logged.
+   */
+  #ifndef NDEBUG
+    #define PDIAGN_PRE_CONDITION(value,message) \
+      PDIAGN_TRUE_OR_THROW( value, message );
+  #else
+    #define PDIAGN_PRE_CONDITION(value,message) {};
+  #endif
+
+  /**
+   * Checks if value is true and throws an exception if not.
+   * This macro will be disabled for non debug mode.
+   *
+   * @param value Value to be checked.
+   * @param message Message to be logged.
+   */
+  #define PDIAGN_POS_CONDITION(value,message) \
+    PDIAGN_PRE_CONDITION(value,message);
+
+  namespace TePDIAgnostic{
+
+    /**
+     * Data convertion to string.
+     *
+     * @param data Data to be converted.
+     * @return The converted string.
+     */
+     template< class T >
+     std::string to_string( const T& data )
+     {
+        std::stringstream temp_ss;
+        temp_ss << data;
+        return temp_ss.str();
+     }
+
+    /**
+     * Redirects stdout and stderr to disk files.
+     *
+     * @param log_file_name stdout output file name.
+     * @param error_log_file_name stderr output file name.
+     */
+     void redirect_log( char* log_file_name, char* error_log_file_name );
+
+  };
+
+#endif //TEPDIAGNOSTIC_HPP
diff --git a/src/terralib/PDI/source/TePDIAlgorithm.cpp b/src/terralib/PDI/source/TePDIAlgorithm.cpp
new file mode 100755
index 0000000..8ae5b96
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAlgorithm.cpp
@@ -0,0 +1,42 @@
+#include "TePDIAlgorithm.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+TePDIAlgorithm::TePDIAlgorithm()
+{
+}
+
+TePDIAlgorithm::TePDIAlgorithm( const TePDIParameters& params )
+{
+  Reset( params );
+}
+
+
+TePDIAlgorithm::~TePDIAlgorithm()
+{
+}
+
+
+bool TePDIAlgorithm::Reset( const TePDIParameters& params )
+{
+  ResetState();
+
+  if( CheckParameters( params ) ) {
+    params_ = params;
+    return true;
+  } else {
+    PDIAGN_LOGERR( "Invalid supplied parameters" );
+    return false;
+  }
+}
+
+
+bool TePDIAlgorithm::Apply()
+{
+  if( CheckParameters( params_ ) ) {
+    return RunImplementation();
+  } else {
+    PDIAGN_LOGERR( "Invalid supplied parameters" );
+    return false;
+  }
+}
diff --git a/src/terralib/PDI/source/TePDIAlgorithm.hpp b/src/terralib/PDI/source/TePDIAlgorithm.hpp
new file mode 100644
index 0000000..5abd657
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIAlgorithm.hpp
@@ -0,0 +1,106 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *   This file contains the base class for digital image processing
+ *   algorithms.
+ */
+
+#ifndef TEPDIALGORITHM_HPP
+  #define TEPDIALGORITHM_HPP
+
+  #include "TePDIParameters.hpp"
+
+  #include "TePDISharedPtr.cpp"
+
+  class TePDIAlgorithm{
+    public :
+      typedef TePDISharedPtr< TePDIAlgorithm > pointer;
+      typedef const TePDISharedPtr< TePDIAlgorithm > const_pointer;
+
+      /**
+       * Default Destructor
+       */
+      virtual ~TePDIAlgorithm();
+
+      /**
+       * Applies the algorithm following the current state and
+       * internal stored parameters.
+       *
+       * @return true if OK. false on error.
+       */
+      bool Apply();
+
+      /**
+       * Reset the internal state with new supplied parameters.
+       *
+       * @param params The new supplied parameters.
+       * @return true if parameters OK, false on error.
+       */
+      bool Reset( const TePDIParameters& params );
+
+      /**
+       * Checks if the supplied parameters fits the requirements of each
+       * PDI algorithm implementation.
+       *
+       * Error log messages must be generated. No exceptions generated.
+       *
+       * @param parameters The parameters to be checked.
+       * @return true if the parameters are OK. false if not.
+       */
+      virtual bool CheckParameters( const TePDIParameters& parameters ) = 0;
+
+    protected :
+      /**
+       * Internal parameters reference
+       */
+      mutable TePDIParameters params_;
+
+      /**
+       * Default Constructor
+       */
+      TePDIAlgorithm();
+
+      /**
+       * Alternative Constructor
+       *
+       * @param params Algoritm parameters.
+       */
+      TePDIAlgorithm( const TePDIParameters& params );
+
+      /**
+       * Runs the current algorithm implementation.
+       *
+       * @return true if OK. false on error.
+       */
+      virtual bool RunImplementation() = 0;
+
+      /**
+       * Reset the internal state to the initial state.
+       */
+      virtual void ResetState() = 0;
+
+  };
+
+#endif //TEPDIALGORITHM_HPP
diff --git a/src/terralib/PDI/source/TePDIBox.cpp b/src/terralib/PDI/source/TePDIBox.cpp
new file mode 100755
index 0000000..f0f4bf3
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIBox.cpp
@@ -0,0 +1,37 @@
+#include "TePDIBox.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+
+TePDIBox::TePDIBox( unsigned long int top_left_x,
+                    unsigned long int top_left_y,
+                    unsigned long int bottom_right_x,
+                    unsigned long int bottom_right_y )
+{
+  Reset( top_left_x, top_left_y, bottom_right_x, bottom_right_y );
+}
+
+
+TePDIBox::~TePDIBox()
+{
+
+}
+
+
+void TePDIBox::Reset( unsigned long int top_left_x,
+                      unsigned long int top_left_y,
+                      unsigned long int bottom_right_x,
+                      unsigned long int bottom_right_y )
+{
+
+  PDIAGN_TRUE_OR_THROW( top_left_x < bottom_right_x,
+    "Invalid supplied parameter X" );
+
+  PDIAGN_TRUE_OR_THROW( top_left_y < bottom_right_y,
+    "Invalid supplied parameter Y" );
+
+  top_left_x_ = top_left_x;
+  top_left_y_ = top_left_y;
+  bottom_right_x_ = bottom_right_x;
+  bottom_right_y_ = bottom_right_y;
+}
diff --git a/src/terralib/PDI/source/TePDIBox.hpp b/src/terralib/PDI/source/TePDIBox.hpp
new file mode 100644
index 0000000..e1c46bf
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIBox.hpp
@@ -0,0 +1,77 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *   This file contains the base class for digital image processing
+ *   algorithms.
+ */
+
+#ifndef TEPDIBOX_HPP
+  #define TEPDIBOX_HPP
+
+  #include "TePDISharedPtr.cpp"
+
+  class TePDIBox{
+    public :
+      typedef TePDISharedPtr< TePDIBox > pointer;
+      typedef const TePDISharedPtr< TePDIBox > const_pointer;
+
+      /**
+       * Default Constructor
+       *
+       * @param top_left_x Top left X coord.
+       * @param top_left_y Top left Y coord.
+       * @param bottom_right_x Bottom right X coord.
+       * @param bottom_right_y Bottom right Y coord.
+       */
+      TePDIBox( unsigned long int top_left_x = 0,
+                unsigned long int top_left_y = 0,
+                unsigned long int bottom_right_x = 0,
+                unsigned long int bottom_right_y = 0 );
+
+      /**
+       * Default Destructor
+       */
+      ~TePDIBox();
+
+      /**
+       * Resets the current Box coords.
+       *
+       * @param top_left_x Top left X coord.
+       * @param top_left_y Top left Y coord.
+       * @param bottom_right_x Bottom right X coord.
+       * @param bottom_right_y Bottom right Y coord.
+       */
+      void Reset( unsigned long int top_left_x,
+                  unsigned long int top_left_y,
+                  unsigned long int bottom_right_x,
+                  unsigned long int bottom_right_y );
+    protected :
+      unsigned long int top_left_x_;
+      unsigned long int top_left_y_;
+      unsigned long int bottom_right_x_;
+      unsigned long int bottom_right_y_;
+  };
+
+#endif //TEPDIBOX_HPP
diff --git a/src/terralib/PDI/source/TePDIContrast.cpp b/src/terralib/PDI/source/TePDIContrast.cpp
new file mode 100755
index 0000000..f901344
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIContrast.cpp
@@ -0,0 +1,879 @@
+#include "TePDIContrast.hpp"
+
+#include "TePDIAgnostic.hpp"
+#include "TePDITypes.hpp"
+#include "TePDIUtils.hpp"
+
+#include <sstream>
+#include <cmath>
+
+
+TePDIContrast::TePDIContrast( const TePDIParameters& params )
+: TePDIAlgorithm( params )
+{
+}
+
+TePDIContrast::TePDIContrast()
+{
+}
+
+
+TePDIContrast::~TePDIContrast()
+{
+}
+
+
+bool TePDIContrast::RunImplementation()
+{
+  /* Getting general parameters */
+
+  int contrast_type;
+  params_.GetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster;
+  params_.GetParameter( "input_image", inRaster );
+
+  std::vector< int > channels;
+  params_.GetParameter( "channels", channels );
+
+  int histo_levels;
+  params_.GetParameter( "histo_levels", histo_levels );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  params_.GetParameter( "output_image", outRaster );
+
+  /* Generating histograms */
+
+  BuildHistograms( inRaster, (unsigned int)histo_levels, channels );
+
+  /* Processing each algorithm */
+
+  TePDITypes::TePDILutType lut;
+
+  switch( contrast_type ) {
+    case TePDIContrastMinMax :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetMinMaxLut( histo_cache_[ channels[ channels_index ] ] );
+
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+      }
+
+      break;
+    }
+    case TePDIContrastLinear :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      double min_level = 0;
+      double max_level = 0;
+
+      params_.GetParameter( "min_level", min_level );
+      params_.GetParameter( "max_level", max_level );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetLinearLut( histo_cache_[ channels[ channels_index ] ],
+          min_level, max_level );
+
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+      }
+
+      break;
+    }
+    case TePDIContrastSquareRoot :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      double min_level = 0;
+      double max_level = 0;
+
+      params_.GetParameter( "min_level", min_level );
+      params_.GetParameter( "max_level", max_level );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetSquareRootLut( histo_cache_[ channels[ channels_index ] ],
+          min_level, max_level );
+
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+      }
+
+      break;
+    }
+    case TePDIContrastSquare :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      double min_level = 0;
+      double max_level = 0;
+
+      params_.GetParameter( "min_level", min_level );
+      params_.GetParameter( "max_level", max_level );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetSquareLut( histo_cache_[ channels[ channels_index ] ],
+          min_level, max_level );
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+      }
+
+      break;
+    }
+    case TePDIContrastLog :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      double min_level = 0;
+      double max_level = 0;
+
+      params_.GetParameter( "min_level", min_level );
+      params_.GetParameter( "max_level", max_level );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetLogLut( histo_cache_[ channels[ channels_index ] ],
+          min_level, max_level );
+
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+      }
+
+      break;
+    }
+    case TePDIContrastNegative :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      double min_level = 0;
+      double max_level = 0;
+
+      params_.GetParameter( "min_level", min_level );
+      params_.GetParameter( "max_level", max_level );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetNegativeLut( histo_cache_[ channels[ channels_index ] ],
+          min_level, max_level );
+
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+
+      }
+
+      break;
+    }
+    case TePDIContrastHistEqualizer :
+    {
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, channels.size(),
+        inRaster->params().nlines_, inRaster->params().ncols_ ),
+        "Raster reset error" );
+
+      for( unsigned int channels_index = 0 ;
+           channels_index < channels.size() ;
+           ++channels_index ) {
+
+        lut = GetHistEqualizerLut( histo_cache_[ channels[ channels_index ] ] );
+
+        RemapLevels( inRaster, lut, channels[ channels_index ],
+          channels_index, outRaster );
+
+      }
+
+      break;
+    }
+    case TePDIContrastSimpleSlicer :
+    {
+      /* Getting user parameters */
+
+      TePDIRgbPalette::pointer palette;
+      params_.GetParameter( "rgb_palette", palette );
+
+      double min_level = 0;
+      double max_level = 0;
+      params_.GetParameter( "min_level", min_level );
+      params_.GetParameter( "max_level", max_level );
+
+      PDIAGN_TRUE_OR_RETURN(
+        TePDIUtils::TeResetRaster( outRaster, 1,
+        inRaster->params().nlines_, inRaster->params().ncols_,
+        palette.NakedPointer() ), "Raster reset error" );
+
+      /* Slicing process */
+
+      GetSimpleSlicerLut( histo_cache_[ channels[ 0 ] ],
+        palette,  min_level, max_level, lut );
+
+      RemapLevels( inRaster, lut, channels[ 0 ], 0,
+        outRaster );
+
+      break;
+    }
+    default :
+    {
+      PDIAGN_NOT_IMPLEMENTED;
+      break;
+    }
+  }
+
+
+  return true;
+}
+
+
+bool TePDIContrast::CheckParameters( const TePDIParameters& parameters )
+{
+  /* Checking for general required parameters */
+
+  TePDITypes::TePDIRasterPtrType inRaster;
+  if( ! parameters.GetParameter( "input_image", inRaster ) ) {
+
+    PDIAGN_LOGERR( "Missing parameter: input_image" );
+    return false;
+  }
+  if( ! inRaster.isActive() ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: input_image inactive" );
+    return false;
+  }
+  if( inRaster->status() == TeNOTREADY ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: input_image not ready" );
+    return false;
+  }
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  if( ! parameters.GetParameter( "output_image", outRaster ) ) {
+
+    PDIAGN_LOGERR( "Missing parameter: output_image" );
+    return false;
+  }
+  if( ! outRaster.isActive() ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: output_image inactive" );
+    return false;
+  }
+  if( inRaster->status() == TeREADYTOWRITE ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: output_image not ready" );
+    return false;
+  }
+
+  int histo_levels = 0;
+  if( ! parameters.GetParameter( "histo_levels", histo_levels ) ||
+      ( histo_levels <= 0 ) ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: histo_levels" );
+    return false;
+  }
+
+  /* Checking for the correct allowed contrast types */
+
+  int contrast_type;
+  if( ! parameters.GetParameter( "contrast_type", contrast_type ) ) {
+    PDIAGN_LOGERR( "Missing parameter: contrast_type" );
+    return false;
+  }
+  PDIAGN_CHECK_NOTEQUAL( contrast_type, 0 ,
+    "Invalid Contrast Type" );
+  if( ( contrast_type != TePDIContrastMinMax ) &&
+      ( contrast_type != TePDIContrastLinear ) &&
+      ( contrast_type != TePDIContrastSquareRoot ) &&
+      ( contrast_type != TePDIContrastSquare ) &&
+      ( contrast_type != TePDIContrastLog ) &&
+      ( contrast_type != TePDIContrastNegative ) &&
+      ( contrast_type != TePDIContrastHistEqualizer ) &&
+      ( contrast_type != TePDIContrastSimpleSlicer ) ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: contrast_type" );
+    return false;
+  }
+
+  /* channels parameter checking */
+
+  std::vector< int > channels;
+  if( ! parameters.GetParameter( "channels", channels ) ) {
+
+    PDIAGN_LOGERR( "Missing parameter: channels" );
+    return false;
+  }
+  for( unsigned int index = 0 ; index < channels.size() ; ++index ) {
+    if( channels[ index ] >= inRaster->nBands() ) {
+      PDIAGN_LOGERR( "Invalid parameter: channels" );
+      return false;
+    }
+  }
+  if( ( contrast_type == TePDIContrastSimpleSlicer ) ) {
+    if( channels.size() != 1 ) {
+      PDIAGN_LOGERR( "Invalid channels number" );
+      return false;
+    }
+  } else {
+    /* For the other algorithms */
+    if( channels.size() == 0 ) {
+      PDIAGN_LOGERR( "Invalid channels number" );
+      return false;
+    }
+  }
+
+  /* Checking for min and max required parameters */
+
+  if( ( contrast_type == TePDIContrastLinear ) ||
+      ( contrast_type == TePDIContrastSquareRoot ) ||
+      ( contrast_type == TePDIContrastSquare ) ||
+      ( contrast_type == TePDIContrastLog ) ||
+      ( contrast_type == TePDIContrastNegative ) ||
+      ( contrast_type == TePDIContrastSimpleSlicer ) ) {
+
+    if( ! parameters.CheckParameter( "min_level",
+          TePDIParameters::TePDIDoubleParam ) ) {
+
+      PDIAGN_LOGERR( "Missing parameter: min_level" );
+      return false;
+    }
+    if( ! parameters.CheckParameter( "max_level",
+          TePDIParameters::TePDIDoubleParam ) ) {
+
+      PDIAGN_LOGERR( "Missing parameter: max_level" );
+      return false;
+    }
+  }
+
+  /* Checking for RGB Palette required parameters */
+
+  if( ( contrast_type == TePDIContrastSimpleSlicer ) ) {
+    TePDIRgbPalette::pointer rgb_palette;
+
+    if( ( ! parameters.GetParameter( "rgb_palette", rgb_palette ) ) ||
+        ( ! rgb_palette.isActive() ) ) {
+
+      PDIAGN_LOGERR( "Missing parameter: rgb_palette" );
+      return false;
+    }
+  }
+
+  return true;
+}
+
+
+void TePDIContrast::ResetState()
+{
+  histo_cache_.clear();
+}
+
+
+void TePDIContrast::BuildHistograms(
+  TePDITypes::TePDIRasterPtrType& inRaster,
+  unsigned int histo_levels,
+  std::vector< int >& channels,
+  bool force )
+{
+  PDIAGN_TRUE_OR_THROW( inRaster.isActive(),
+    "inRaster inactive" );
+  PDIAGN_TRUE_OR_THROW( inRaster->status() != TeNOTREADY,
+    "inRaster not ready" );
+
+  for( unsigned int channels_index = 0 ; channels_index < channels.size() ;
+       ++channels_index ) {
+
+    PDIAGN_TRUE_OR_THROW( channels[ channels_index ] < inRaster->nBands(),
+      "Trying to creat histogram from an invalid band" );
+
+    bool hist_cached =
+      ( histo_cache_.find( channels[ channels_index ] ) !=
+        histo_cache_.end() ) ? true : false;
+
+    if( ( ! hist_cached ) || force ) {
+      if( hist_cached ) {
+        histo_cache_[ channels[ channels_index ] ].clear();
+      }
+
+      TePDITypes::TePDIHistogramType temp_hist;
+
+      PDIAGN_TRUE_OR_THROW( TePDIUtils::TeGenerateHistogram( inRaster,
+        histo_levels, channels[ channels_index ], temp_hist ),
+        "Histogram Generation Error" );
+
+      PDIAGN_CHECK_EQUAL( temp_hist.size(), histo_levels,
+        "Generated histogram size error" );
+
+      histo_cache_[ channels[ channels_index ] ] = temp_hist;
+    }
+  }
+}
+
+
+void TePDIContrast::RemapLevels(
+  TePDITypes::TePDIRasterPtrType& inRaster,
+  TePDITypes::TePDILutType& lut,
+  int in_channel,
+  int out_channel,
+  TePDITypes::TePDIRasterPtrType& outRaster )
+{
+  PDIAGN_TRUE_OR_THROW( inRaster.isActive(),
+    "inRaster inactive" );
+  PDIAGN_TRUE_OR_THROW( outRaster.isActive(),
+    "outRaster inactive" );
+  PDIAGN_TRUE_OR_THROW( inRaster->status() != TeNOTREADY,
+    "inRaster not ready" );
+  PDIAGN_TRUE_OR_THROW( outRaster->status() == TeREADYTOWRITE,
+    "outRaster not ready" );
+  PDIAGN_CHECK_EQUAL( inRaster->params().nlines_,
+    outRaster->params().nlines_,
+    "Lines number mismatch between input and output image" );
+  PDIAGN_CHECK_EQUAL( inRaster->params().ncols_,
+    outRaster->params().ncols_,
+    "Columns number mismatch between input and output image" );
+
+  int raster_lines = inRaster->params().nlines_;
+  int raster_columns = inRaster->params().ncols_;
+
+  double current_level;
+  double best_lut_reference;
+
+  TePDITypes::TePDILutType::iterator lut_it;
+  TePDITypes::TePDILutType::iterator lut_next_it;
+  TePDITypes::TePDILutType::iterator lut_it_end = lut.end();
+
+  for( int line = 0 ; line < raster_lines ; ++line ) {
+    for( int column = 0 ; column < raster_columns ; ++column ) {
+      if( inRaster->getElement( column, line, current_level,
+          in_channel ) ) {
+
+        /* Finding mapped level by using the best LUT reference Level */
+
+        lut_it = lut.begin();
+        lut_next_it = lut_it;
+        ++lut_next_it;
+
+        while( lut_next_it != lut_it_end ) {
+          if( lut_next_it->first >= current_level ) {
+            break;
+          }
+
+          ++lut_it;
+          ++lut_next_it;
+        }
+
+        if( lut_next_it == lut_it_end ) {
+          best_lut_reference = lut_it->first;
+        } else {
+          if( std::abs( lut_it->first - current_level ) <
+              std::abs( lut_next_it->first - current_level ) ) {
+
+            best_lut_reference = lut_it->first;
+          } else {
+            best_lut_reference = lut_next_it->first;
+          }
+        }
+
+        /* Pixel Output level mapping */
+
+        PDIAGN_TRUE_OR_THROW( outRaster->setElement( column, line,
+          lut[ best_lut_reference ], out_channel ),
+          "Level remmaping error at " + TePDIUtils::to_string( line ) +
+          "," + TePDIUtils::to_string( column ) );
+      }
+    }
+  }
+
+}
+
+double TePDIContrast::GetHistMax( TePDITypes::TePDIHistogramType& hist )
+{
+  PDIAGN_TRUE_OR_THROW( hist.size() != 0, "Invalid histogram" );
+
+  TePDITypes::TePDIHistogramType::reverse_iterator hist_it = hist.rbegin();
+  TePDITypes::TePDIHistogramType::reverse_iterator hist_it_end = hist.rend();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->second != 0 ) {
+      return hist_it->first;
+    }
+
+    ++hist_it;
+  }
+
+  PDIAGN_LOG_AND_THROW( "Empty invalid Histogram" );
+
+  return 0;
+}
+
+double TePDIContrast::GetHistMin( TePDITypes::TePDIHistogramType& hist )
+{
+  PDIAGN_TRUE_OR_THROW( hist.size() != 0, "Invalid histogram" );
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->second != 0 ) {
+      return hist_it->first;
+    }
+
+    ++hist_it;
+  }
+
+  PDIAGN_LOG_AND_THROW( "Empty invalid Histogram" );
+
+  return 0;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetMinMaxLut(
+  TePDITypes::TePDIHistogramType& hist )
+{
+  PDIAGN_TRUE_OR_THROW( hist.size() != 0, "Invalid histogram" );
+
+  return GetLinearLut( hist, GetHistMin( hist ), GetHistMax( hist ) );
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetLinearLut(
+  TePDITypes::TePDIHistogramType& hist,
+  double min, double max )
+{
+  PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+  PDIAGN_TRUE_OR_THROW( max > min, "Invalid max and min values" );
+
+  /* Calculating parameters */
+
+  unsigned int levels = hist.size();
+
+  double a = 0;
+  double b = 0;
+
+  if( max == min ) {
+    a = (double)levels;
+    b = -1. * ((double)levels) * min;
+  } else {
+    a = ((double)levels) / ( max - min );
+    b = ( -1. * ((double)levels) * min ) / ( max - min );
+  }
+
+  /* Generating LUT map using the existing histogram levels */
+
+  TePDITypes::TePDILutType out_lut;
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->first <= min ) {
+      out_lut[ hist_it->first ] = min;
+    } else if( hist_it->first >= max ) {
+      out_lut[ hist_it->first ] = max;
+    } else {
+      out_lut[ hist_it->first ] = ( a * hist_it->first ) + b;
+    }
+
+    ++hist_it;
+  }
+
+  return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetSquareRootLut(
+  TePDITypes::TePDIHistogramType& hist,
+  double min, double max )
+{
+  PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+  PDIAGN_TRUE_OR_THROW( min < max, "Invalid min and max values" );
+
+  unsigned int levels = hist.size();
+
+  double factor = ((double)levels) / std::sqrt( max - min );
+
+  /* Generating LUT map using the existing histogram levels */
+
+  TePDITypes::TePDILutType out_lut;
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->first <= min ) {
+      out_lut[ hist_it->first ] = min;
+    } else if( hist_it->first >= max ) {
+      out_lut[ hist_it->first ] = max;
+    } else {
+      out_lut[ hist_it->first ] = factor * std::sqrt( hist_it->first - min );
+    }
+
+    ++hist_it;
+  }
+
+  return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetSquareLut(
+  TePDITypes::TePDIHistogramType& hist,
+  double min, double max )
+{
+  PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+  PDIAGN_TRUE_OR_THROW( min < max, "Invalid min and max values" );
+
+  unsigned int levels = hist.size();
+
+  double factor = ((double)levels) / std::pow( (max - min), 2 );
+
+  /* Generating LUT map using the existing histogram levels */
+
+  TePDITypes::TePDILutType out_lut;
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->first <= min ) {
+      out_lut[ hist_it->first ] = min;
+    } else if( hist_it->first >= max ) {
+      out_lut[ hist_it->first ] = max;
+    } else {
+      out_lut[ hist_it->first ] =
+        factor * std::pow( hist_it->first - min, 2 );
+    }
+
+    ++hist_it;
+  }
+
+  return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetLogLut(
+  TePDITypes::TePDIHistogramType& hist,
+  double min, double max )
+{
+  PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+  PDIAGN_TRUE_OR_THROW( max > ( min+1 ), "Invalid min and max values" );
+
+  unsigned int levels = hist.size();
+
+  double factor = ((double)levels) / std::log10( max - min + 1 );
+
+  /* Generating LUT map using the existing histogram levels */
+
+  TePDITypes::TePDILutType out_lut;
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->first <= min ) {
+      out_lut[ hist_it->first ] = min;
+    } else if( hist_it->first >= max ) {
+      out_lut[ hist_it->first ] = max;
+    } else {
+      out_lut[ hist_it->first ] =
+        factor * std::log10( hist_it->first - min + 1 );
+    }
+
+    ++hist_it;
+  }
+
+  return out_lut;
+}
+
+
+TePDITypes::TePDILutType TePDIContrast::GetNegativeLut(
+  TePDITypes::TePDIHistogramType& hist,
+  double min, double max )
+{
+  PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+  PDIAGN_TRUE_OR_THROW( max > min, "Invalid max and min values" );
+
+  /* Calculating parameters */
+
+  unsigned int levels = hist.size();
+
+  double a = -1. * ((double)levels) / ( max - min );
+  double b = ( ((double)levels) * max ) / ( max - min );
+
+  /* Generating LUT map using the existing histogram levels */
+
+  TePDITypes::TePDILutType out_lut;
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = hist.end();
+
+  while( hist_it != hist_it_end ) {
+    if( hist_it->first <= min ) {
+      out_lut[ hist_it->first ] = max;
+    } else if( hist_it->first >= max ) {
+      out_lut[ hist_it->first ] = min;
+    } else {
+      out_lut[ hist_it->first ] = ( a * hist_it->first ) + b;
+    }
+
+    ++hist_it;
+  }
+
+  return out_lut;
+}
+
+TePDITypes::TePDILutType TePDIContrast::GetHistEqualizerLut(
+  TePDITypes::TePDIHistogramType& hist )
+{
+  PDIAGN_TRUE_OR_THROW( hist.size() > 1, "Invalid histogram size" );
+
+  TePDITypes::TePDIHistogramType::iterator in_hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator in_hist_it_past = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator in_hist_it_end = hist.end();
+
+  int hist_population = 0;
+
+  /* Generating the accumulative histogram */
+
+  TePDITypes::TePDIHistogramType accumulative_hist;
+
+  accumulative_hist[ in_hist_it->first ] = in_hist_it->second;
+  hist_population += in_hist_it->second;
+  ++in_hist_it;
+
+  TePDITypes::TePDIHistogramType::iterator accumulative_hist_it =
+    accumulative_hist.begin();
+  TePDITypes::TePDIHistogramType::iterator accumulative_hist_it_past =
+    accumulative_hist.begin();
+  ++accumulative_hist_it;
+
+  while( in_hist_it != in_hist_it_end ) {
+    hist_population += in_hist_it->second;
+
+    /* Building accumulative histogram */
+
+    accumulative_hist[ in_hist_it->first ] =
+      accumulative_hist_it_past->second + in_hist_it->second;
+
+    ++accumulative_hist_it_past;
+    ++accumulative_hist_it;
+
+    ++in_hist_it_past;
+    ++in_hist_it;
+  }
+
+  /* Creating the look-up table */
+
+  double levels = (double)hist.size();
+
+  TePDITypes::TePDILutType out_lut;
+
+  in_hist_it = hist.begin();
+
+  while( in_hist_it != in_hist_it_end ) {
+    out_lut[ in_hist_it->first ] = accumulative_hist[ in_hist_it->first ] *
+      levels / ((double)hist_population);
+
+    ++in_hist_it;
+  }
+
+  return out_lut;
+}
+
+
+void TePDIContrast::GetSimpleSlicerLut(
+  TePDITypes::TePDIHistogramType& hist,
+  TePDIRgbPalette::pointer in_palette,
+  double min,
+  double max,
+  TePDITypes::TePDILutType& out_lut )
+{
+  PDIAGN_CHECK_NOTEQUAL( hist.size(), 0, "Invalid histogram size" );
+  PDIAGN_TRUE_OR_THROW( max > min, "Invalid max and min values" );
+  PDIAGN_TRUE_OR_THROW( in_palette->size() > 0,
+    "Invalid input palette size" );
+
+  out_lut.clear();
+
+  /* Extracting palette levels */
+
+  std::vector< double > palette_levels;
+  TePDIRgbPalette::iterator pal_it = in_palette->begin();
+  TePDIRgbPalette::iterator pal_it_end = in_palette->end();
+
+  while( pal_it != pal_it_end ) {
+    palette_levels.push_back( pal_it.level() );
+
+    ++pal_it;
+  }
+
+  /* min and max adjusting to the supplied histogram range */
+
+  double in_hist_max = GetHistMax( hist );
+  double in_hist_min = GetHistMin( hist );
+
+  min = ( min < in_hist_min ) ? in_hist_min : min;
+  max = ( max > in_hist_max ) ? in_hist_max : max;
+
+  /* Output LUT generation */
+
+  double slice_size = ( max - min ) / ((double)in_palette->size());
+
+  double first_pal_level = palette_levels[ 0 ];
+  double last_pal_level = palette_levels[ palette_levels.size() - 1 ];
+
+  TePDITypes::TePDIHistogramType::iterator in_hist_it = hist.begin();
+  TePDITypes::TePDIHistogramType::iterator in_hist_it_end = hist.end();
+
+  double current_level;
+  unsigned int current_slice;
+
+  while( in_hist_it != in_hist_it_end ) {
+    current_level = in_hist_it->first;
+
+    if( current_level < min ) {
+      out_lut[ current_level ] = first_pal_level;
+    } else if ( current_level > max ) {
+      out_lut[ current_level ] = last_pal_level;
+    } else {
+      current_slice =
+        (unsigned int) std::floor( ( current_level - min ) / slice_size );
+
+      out_lut[ current_level ] = palette_levels[ current_slice ];
+    }
+
+    ++in_hist_it;
+  }
+
+
+}
diff --git a/src/terralib/PDI/source/TePDIContrast.hpp b/src/terralib/PDI/source/TePDIContrast.hpp
new file mode 100755
index 0000000..100a963
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIContrast.hpp
@@ -0,0 +1,278 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDICONTRAST_HPP
+  #define TEPDICONTRAST_HPP
+
+  #include "TePDIAlgorithm.hpp"
+  #include "TePDIRgbPalette.hpp"
+  #include "TePDITypes.hpp"
+
+  #include "TePDISharedPtr.cpp"
+
+  /**
+   *   This is the class for contrast image processing algorithms.
+   */
+  class TePDIContrast : public TePDIAlgorithm{
+    public :
+      typedef TePDISharedPtr< TePDIContrast > pointer;
+      typedef const TePDISharedPtr< TePDIContrast > const_pointer;
+
+      /**
+       * Allowed contrast types.
+       */
+      enum TePDIContrastType{
+        TePDIContrastMinMax = 1,
+        TePDIContrastLinear = 2,
+        TePDIContrastSquareRoot = 3,
+        TePDIContrastSquare = 4,
+        TePDIContrastLog = 5,
+        TePDIContrastNegative = 6,
+        TePDIContrastHistEqualizer = 7,
+        TePDIContrastSimpleSlicer = 8
+      };
+
+      /**
+       * Alternative Constructor.
+       *
+       * The general required parameters by any contrast type:
+       *
+       * contrast_type (TePDIContrastType),
+       * input_image (TePDITypes::TePDIRasterPtrType),
+       * output_image (TePDITypes::TePDIRasterPtrType),
+       * histo_levels (int) - Number of interpolated histogram levels.
+       *
+       * The specific required parameters ( by parameter type ):
+       *
+       * channels (std::vector<int>) - Band(s) to process. For
+       * TePDIContrastSimpleSlicer just one band is allowed.
+       *
+       * min_level (double) - Minimal level for Linear Luts
+       * Required by: TePDIContrastLinear, TePDIContrastSquareRoot,
+       * TePDIContrastSquare, TePDIContrastLog, TePDIContrastNegative,
+       * TePDIContrastSimpleSlicer
+       *
+       * max_level (double) - Minimal level for Linear Luts
+       * Required by: TePDIContrastLinear, TePDIContrastSquareRoot,
+       * TePDIContrastSquare, TePDIContrastLog, TePDIContrastNegative,
+       * TePDIContrastSimpleSlicer
+       *
+       * rgb_palette (TePDIRgbPalette::pointer) -
+       * Reference RGB palette.
+       * Required by: TePDIContrastSimpleSlicer
+       *
+       * @param params Algoritm parameters.
+       */
+      TePDIContrast( const TePDIParameters& params );
+
+      /**
+       * Default Constructor.
+       *
+       */
+      TePDIContrast();
+
+      /**
+       * Default Destructor
+       */
+      ~TePDIContrast();
+
+      /**
+       * Checks if the supplied parameters fits the requirements of each
+       * PDI algorithm implementation.
+       *
+       * Error log messages must be generated. No exceptions generated.
+       *
+       * @param parameters The parameters to be checked.
+       * @return true if the parameters are OK. false if not.
+       */
+      bool CheckParameters( const TePDIParameters& parameters );
+
+    protected :
+      /**
+       * A cache of level ordered histograms to avoid rebuilding
+       * histograms all the times.
+       */
+      TePDITypes::TePDIHistogramsMapType histo_cache_;
+
+      /**
+       * Runs the current algorithm implementation.
+       *
+       * @return true if OK. false on error.
+       */
+      bool RunImplementation();
+
+      /**
+       * Reset the internal state to the initial state.
+       */
+      void ResetState();
+
+      /**
+       * Build level ordered histograms from the required raster channels.
+       *
+       * The result histograms will remain inside the protected
+       * object histo_cache_
+       *
+       * @param inRaster The input Raster.
+       * @param histo_levels Number of histogram interpolated levels.
+       * @param channels Channels to use for histogram generation.
+       * @param force Force histogram regeneratin even if already in cache.
+       */
+      void BuildHistograms(
+        TePDITypes::TePDIRasterPtrType& inRaster,
+        unsigned int histo_levels,
+        std::vector< int >& channels,
+        bool force = false );
+
+      /**
+       * Do level remapping from one raster to another.
+       *
+       * @param inRaster The input Raster.
+       * @param outRaster The Output Raster.
+       * @param lut The look-up table.
+       * @param in_channel in_raster channel to remap.
+       * @param out_channel out_raster channel to write on.
+       */
+      void RemapLevels(
+        TePDITypes::TePDIRasterPtrType& inRaster,
+        TePDITypes::TePDILutType& lut,
+        int in_channel,
+        int out_channel,
+        TePDITypes::TePDIRasterPtrType& outRaster );
+
+      /**
+       * Get the maximum histogram level.
+       *
+       * Only for histograms with levels equal or greater than zero.
+       *
+       * @param hist The input LEVEL ORDERED histogram.
+       * @return the maximum level.
+       */
+      double GetHistMax( TePDITypes::TePDIHistogramType& hist );
+
+      /**
+       * Get the minimum histogram level.
+       *
+       * Only for histograms with levels equal or greater than zero.
+       *
+       * @param hist The input LEVEL ORDERED histogram.
+       * @return the minimum level.
+       */
+      double GetHistMin( TePDITypes::TePDIHistogramType& hist );
+
+      /**
+       * Build a min-max look-up table.
+       *
+       * @param hist Base histogram.
+       * @return  The look-up table.
+       */
+      TePDITypes::TePDILutType GetMinMaxLut(
+        TePDITypes::TePDIHistogramType& hist );
+
+      /**
+       * Build a Linear look-up table.
+       *
+       * @param min Minimal level value.
+       * @param max Maximum level value.
+       * @param hist Base histogram.
+       * @return The look-up table.
+       */
+      TePDITypes::TePDILutType GetLinearLut(
+        TePDITypes::TePDIHistogramType& hist,
+        double min, double max );
+
+      /**
+       * Build a Square Root look-up table.
+       *
+       * @param min Minimal level value.
+       * @param max Maximum level value.
+       * @param hist Base histogram.
+       * @return The look-up table.
+       */
+      TePDITypes::TePDILutType GetSquareRootLut(
+        TePDITypes::TePDIHistogramType& hist,
+        double min, double max );
+
+      /**
+       * Build a Square look-up table.
+       *
+       * @param min Minimal level value.
+       * @param max Maximum level value.
+       * @param hist Base histogram.
+       * @return The look-up table.
+       */
+      TePDITypes::TePDILutType GetSquareLut(
+        TePDITypes::TePDIHistogramType& hist,
+        double min, double max );
+
+      /**
+       * Build a Log look-up table.
+       *
+       * @param min Minimal level value.
+       * @param max Maximum level value.
+       * @param hist Base histogram.
+       * @return The look-up table.
+       */
+      TePDITypes::TePDILutType GetLogLut(
+        TePDITypes::TePDIHistogramType& hist,
+        double min, double max );
+
+      /**
+       * Build a Negative look-up table.
+       *
+       * @param min Minimal level value.
+       * @param max Maximum level value.
+       * @param hist Base histogram.
+       * @return The look-up table.
+       */
+      TePDITypes::TePDILutType GetNegativeLut(
+        TePDITypes::TePDIHistogramType& hist,
+        double min, double max );
+
+      /**
+       * Build a Histogram equalizer look-up table.
+       *
+       * @param hist A LEVEL-ORDERED Base histogram.
+       * @return The look-up table.
+       */
+      TePDITypes::TePDILutType GetHistEqualizerLut(
+        TePDITypes::TePDIHistogramType& hist );
+
+      /**
+       * Builds a Simple slicer look-up table.
+       *
+       * @param hist A LEVEL-ORDERED Base histogram.
+       * @param in_palette The reference RGB palette.
+       * @param min Minimal level value.
+       * @param max Maximum level value.
+       * @param out_lut The look-up table.
+       */
+      void GetSimpleSlicerLut(
+        TePDITypes::TePDIHistogramType& hist,
+        TePDIRgbPalette::pointer in_palette,
+        double min,
+        double max,
+        TePDITypes::TePDILutType& out_lut );
+  };
+
+#endif //TEPDICONTRAST_HPP
diff --git a/src/terralib/PDI/source/TePDIFilter.cpp b/src/terralib/PDI/source/TePDIFilter.cpp
new file mode 100755
index 0000000..0f7d1d5
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilter.cpp
@@ -0,0 +1,17 @@
+#include "TePDIFilter.hpp"
+
+
+TePDIFilter::TePDIFilter( const TePDIParameters& params )
+: TePDIAlgorithm( params )
+{
+}
+
+TePDIFilter::TePDIFilter()
+{
+}
+
+
+TePDIFilter::~TePDIFilter()
+{
+}
+
diff --git a/src/terralib/PDI/source/TePDIFilter.hpp b/src/terralib/PDI/source/TePDIFilter.hpp
new file mode 100755
index 0000000..b9708fd
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilter.hpp
@@ -0,0 +1,85 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDIFILTER_HPP
+  #define TEPDIFILTER_HPP
+
+  #include "TePDIAlgorithm.hpp"
+  #include "TePDIParameters.hpp"
+
+  #include "TePDISharedPtr.cpp"
+
+  /**
+   *   This is the base class for image filtering algorithms.
+   */
+  class TePDIFilter : public TePDIAlgorithm{
+    public :
+      typedef TePDISharedPtr< TePDIFilter > pointer;
+      typedef const TePDISharedPtr< TePDIFilter > const_pointer;
+
+      /**
+       * Default Destructor
+       */
+      ~TePDIFilter();
+
+      /**
+       * Checks if the supplied parameters fits the requirements of each
+       * PDI algorithm implementation.
+       *
+       * Error log messages must be generated. No exceptions generated.
+       *
+       * @param parameters The parameters to be checked.
+       * @return true if the parameters are OK. false if not.
+       */
+      virtual bool CheckParameters( const TePDIParameters& parameters ) = 0;
+
+    protected :
+      /**
+       * Default Constructor.
+       *
+       */
+      TePDIFilter();
+
+      /**
+       * Alternative Constructor
+       *
+       * @param params Algoritm parameters.
+       */
+      TePDIFilter( const TePDIParameters& params );
+
+      /**
+       * Runs the current algorithm implementation.
+       *
+       * @return true if OK. false on error.
+       */
+      virtual bool RunImplementation() = 0;
+
+      /**
+       * Reset the internal state to the initial state.
+       */
+      virtual void ResetState() = 0;
+
+  };
+
+#endif //TEPDIFILTER_HPP
diff --git a/src/terralib/PDI/source/TePDIFilterMask.cpp b/src/terralib/PDI/source/TePDIFilterMask.cpp
new file mode 100755
index 0000000..c5b086c
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilterMask.cpp
@@ -0,0 +1,17 @@
+#include "TePDIFilterMask.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+
+TePDIFilterMask::TePDIFilterMask()
+{
+}
+
+
+TePDIFilterMask::~TePDIFilterMask()
+{
+}
+
+
+
+
diff --git a/src/terralib/PDI/source/TePDIFilterMask.hpp b/src/terralib/PDI/source/TePDIFilterMask.hpp
new file mode 100755
index 0000000..ad6f98e
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIFilterMask.hpp
@@ -0,0 +1,53 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDIFILTERMASK_HPP
+  #define TEPDIFILTERMASK_HPP
+
+  #include <TeMatrix.h>
+
+  #include "TePDISharedPtr.cpp"
+
+  /**
+   *   This is the class for image Linear filtering processing.
+   */
+  class TePDIFilterMask : public TeMatrix{
+    public :
+      typedef TePDISharedPtr< TePDIFilterMask > pointer;
+      typedef const TePDISharedPtr< TePDIFilterMask > const_pointer;
+
+      /**
+       * Default Constructor.
+       *
+       */
+      TePDIFilterMask();
+
+      /**
+       * Default Destructor
+       */
+      ~TePDIFilterMask();
+
+  };
+
+#endif //TEPDIFILTERMASK_HPP
diff --git a/src/terralib/PDI/source/TePDILinearFilter.cpp b/src/terralib/PDI/source/TePDILinearFilter.cpp
new file mode 100755
index 0000000..0256cf6
--- /dev/null
+++ b/src/terralib/PDI/source/TePDILinearFilter.cpp
@@ -0,0 +1,90 @@
+#include "TePDILinearFilter.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+
+TePDILinearFilter::TePDILinearFilter( const TePDIParameters& params )
+: TePDIFilter( params )
+{
+}
+
+
+TePDILinearFilter::TePDILinearFilter()
+{
+}
+
+
+TePDILinearFilter::~TePDILinearFilter()
+{
+}
+
+
+bool TePDILinearFilter::CheckParameters( const TePDIParameters& parameters )
+{
+  /* Checking for general required parameters */
+
+  TePDITypes::TePDIRasterPtrType inRaster;
+  if( ! parameters.GetParameter( "input_image", inRaster ) ) {
+
+    PDIAGN_LOGERR( "Missing parameter: input_image" );
+    return false;
+  }
+  if( ! inRaster.isActive() ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: input_image inactive" );
+    return false;
+  }
+  if( inRaster->status() == TeNOTREADY ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: input_image not ready" );
+    return false;
+  }
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  if( ! parameters.GetParameter( "output_image", outRaster ) ) {
+
+    PDIAGN_LOGERR( "Missing parameter: output_image" );
+    return false;
+  }
+  if( ! outRaster.isActive() ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: output_image inactive" );
+    return false;
+  }
+  if( inRaster->status() == TeREADYTOWRITE ) {
+
+    PDIAGN_LOGERR( "Invalid parameter: output_image not ready" );
+    return false;
+  }
+
+  /* channels parameter checking */
+
+  std::vector< int > channels;
+  if( ! parameters.GetParameter( "channels", channels ) ) {
+
+    PDIAGN_LOGERR( "Missing parameter: channels" );
+    return false;
+  }
+  for( unsigned int index = 0 ; index < channels.size() ; ++index ) {
+    if( channels[ index ] >= inRaster->nBands() ) {
+      PDIAGN_LOGERR( "Invalid parameter: channels" );
+      return false;
+    }
+  }
+  return true;
+}
+
+
+bool TePDILinearFilter::RunImplementation()
+{
+  PDIAGN_NOT_IMPLEMENTED;
+
+  return false;
+}
+
+
+void TePDILinearFilter::ResetState()
+{
+  PDIAGN_NOT_IMPLEMENTED;
+}
+
diff --git a/src/terralib/PDI/source/TePDILinearFilter.hpp b/src/terralib/PDI/source/TePDILinearFilter.hpp
new file mode 100755
index 0000000..430b844
--- /dev/null
+++ b/src/terralib/PDI/source/TePDILinearFilter.hpp
@@ -0,0 +1,86 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDILINEARFILTER_HPP
+  #define TEPDILINEARFILTER_HPP
+
+  #include "TePDIFilter.hpp"
+  #include "TePDIParameters.hpp"
+
+  #include "TePDISharedPtr.cpp"
+
+  /**
+   *   This is the class for image Linear filtering processing.
+   */
+  class TePDILinearFilter : public TePDIFilter{
+    public :
+      typedef TePDISharedPtr< TePDILinearFilter > pointer;
+      typedef const TePDISharedPtr< TePDILinearFilter > const_pointer;
+
+      /**
+       * Default Constructor.
+       *
+       */
+      TePDILinearFilter();
+
+      /**
+       * Alternative Constructor
+       *
+       * @param params Algoritm parameters.
+       */
+      TePDILinearFilter( const TePDIParameters& params );
+
+      /**
+       * Default Destructor
+       */
+      ~TePDILinearFilter();
+
+      /**
+       * Checks if the supplied parameters fits the requirements of each
+       * PDI algorithm implementation.
+       *
+       * Error log messages must be generated. No exceptions generated.
+       *
+       * @param parameters The parameters to be checked.
+       * @return true if the parameters are OK. false if not.
+       */
+      bool CheckParameters( const TePDIParameters& parameters );
+
+    protected :
+
+      /**
+       * Runs the current algorithm implementation.
+       *
+       * @return true if OK. false on error.
+       */
+      bool RunImplementation();
+
+      /**
+       * Reset the internal state to the initial state.
+       */
+      void ResetState();
+
+  };
+
+#endif //TEPDILINEARFILTER_HPP
diff --git a/src/terralib/PDI/source/TePDIParameters.cpp b/src/terralib/PDI/source/TePDIParameters.cpp
new file mode 100644
index 0000000..93cd64e
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIParameters.cpp
@@ -0,0 +1,313 @@
+#include "TePDIParameters.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+TePDIParameters::TePDIParameters()
+{
+
+}
+
+
+TePDIParameters::~TePDIParameters()
+{
+
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+  const TePDITypes::TePDIRasterPtrType& data )
+{
+  unsigned int old_size = RasterMap_.size();
+
+  RasterMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != RasterMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+  TePDITypes::TePDIRasterPtrType& data ) const
+{
+  TePDIRasterMap::iterator it = RasterMap_.find( pname );
+
+  if( it != RasterMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+
+void TePDIParameters::SetParameter( const std::string& pname,
+  TePDIRgbPalette::const_pointer& data )
+{
+  unsigned int old_size = PDIRgbPaletteMap_.size();
+
+  PDIRgbPaletteMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != PDIRgbPaletteMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+  TePDIRgbPalette::pointer& data ) const
+{
+  TePDIRgbPaletteMap::iterator it = PDIRgbPaletteMap_.find( pname );
+
+  if( it != PDIRgbPaletteMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+
+void TePDIParameters::SetParameter( const std::string& pname,
+                                    int data )
+{
+  unsigned int old_size = IntegerMap_.size();
+
+  IntegerMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != IntegerMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+                                    int& data ) const
+{
+  TePDIIntegerMap::iterator it = IntegerMap_.find( pname );
+
+  if( it != IntegerMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+                                    std::vector< int >& data )
+{
+  unsigned int old_size = IntegerVectorMap_.size();
+
+  IntegerVectorMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != IntegerVectorMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+                                    std::vector< int >& data ) const
+{
+  TePDIIntegerVectorMap::iterator it = IntegerVectorMap_.find( pname );
+
+  if( it != IntegerVectorMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+                                    const std::string& data )
+{
+  unsigned int old_size = StringMap_.size();
+
+  StringMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != StringMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+                                    std::string& data ) const
+{
+  TePDIStringMap::iterator it = StringMap_.find( pname );
+
+  if( it != StringMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+                                    double data )
+{
+  unsigned int old_size = DoubleMap_.size();
+
+  DoubleMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != DoubleMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+                                    double& data ) const
+{
+  TePDIDoubleMap::iterator it = DoubleMap_.find( pname );
+
+  if( it != DoubleMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+                                    const TePDIBox::pointer& data )
+{
+  unsigned int old_size = PDIBoxMap_.size();
+
+  PDIBoxMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != PDIBoxMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+                                    TePDIBox::pointer& data ) const
+{
+  TePDIBoxMap::iterator it = PDIBoxMap_.find( pname );
+
+  if( it != PDIBoxMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+void TePDIParameters::SetParameter( const std::string& pname,
+                                    const TePDIFilterMask::pointer& data )
+{
+  unsigned int old_size = PDIFilterMaskMap_.size();
+
+  PDIFilterMaskMap_[ pname ] = data;
+
+  PDIAGN_TRUE_OR_THROW( old_size != PDIFilterMaskMap_.size(),
+    "Insertion failed." );
+}
+
+
+bool TePDIParameters::GetParameter( const std::string& pname,
+                                    TePDIFilterMask::pointer& data ) const
+{
+  TePDIFilterMaskMap::iterator it = PDIFilterMaskMap_.find( pname );
+
+  if( it != PDIFilterMaskMap_.end() ) {
+    data = it->second;
+    return true;
+  }
+
+  PDIAGN_LOGERR( "Invalid get: Parameter not stored" );
+
+  return false;
+}
+
+bool TePDIParameters::CheckParameter( const std::string& pname,
+                                      TePDIParamTypes type ) const
+{
+  switch( type ) {
+    case TePDIIntParam :
+    {
+      if( IntegerMap_.find( pname ) != IntegerMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIIntVectorParam :
+    {
+      if( IntegerVectorMap_.find( pname ) != IntegerVectorMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIRasterParam :
+    {
+      if( RasterMap_.find( pname ) != RasterMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIStringParam :
+    {
+      if( StringMap_.find( pname ) != StringMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIDoubleParam :
+    {
+      if( DoubleMap_.find( pname ) != DoubleMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIBoxParam :
+    {
+      if( PDIBoxMap_.find( pname ) != PDIBoxMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIRgbPaletteParam :
+    {
+      if( PDIRgbPaletteMap_.find( pname ) != PDIRgbPaletteMap_.end() ){
+        return true;
+      }
+      break;
+    }
+    case TePDIFilterMaskParam :
+    {
+      if( PDIFilterMaskMap_.find( pname ) != PDIFilterMaskMap_.end() ){
+        return true;
+      }
+      break;
+    }    default :
+    {
+      PDIAGN_LOG_AND_THROW( "Invalid Parameter Type" );
+      break;
+    }
+  }
+
+  return false;
+}
+
+void TePDIParameters::operator=( const TePDIParameters& ext_params )
+{
+  RasterMap_ = ext_params.RasterMap_;
+  IntegerMap_ = ext_params.IntegerMap_;
+  IntegerVectorMap_ = ext_params.IntegerVectorMap_;
+  StringMap_ = ext_params.StringMap_;
+  DoubleMap_ = ext_params.DoubleMap_;
+  PDIBoxMap_ = ext_params.PDIBoxMap_;
+  PDIRgbPaletteMap_ = ext_params.PDIRgbPaletteMap_;
+  PDIFilterMaskMap_ = ext_params.PDIFilterMaskMap_;
+}
diff --git a/src/terralib/PDI/source/TePDIParameters.hpp b/src/terralib/PDI/source/TePDIParameters.hpp
new file mode 100644
index 0000000..da1b40f
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIParameters.hpp
@@ -0,0 +1,306 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *   This file contains the class of structures and definitions
+ *   to deal with parameters used by all PDI classes.
+ */
+
+#ifndef TEPDIPARAMETERS_HPP
+  #define TEPDIPARAMETERS_HPP
+
+  #include "TePDIBox.hpp"
+  #include "TePDITypes.hpp"
+  #include "TePDIRgbPalette.hpp"
+  #include "TePDIFilterMask.hpp"
+
+  #include "TePDISharedPtr.cpp"
+
+  #include <TeRaster.h>
+
+  #include <map>
+  #include <string>
+  #include <vector>
+
+  class TePDIParameters {
+    public :
+      typedef TePDISharedPtr< TePDIParameters > pointer;
+      typedef const TePDISharedPtr< TePDIParameters > const_pointer;
+
+      /**
+       * Suported parameters.
+       */
+      enum TePDIParamTypes{
+        TePDIIntParam = 1,
+        TePDIIntVectorParam = 2,
+        TePDIRasterParam = 3,
+        TePDIDoubleParam = 4,
+        TePDIStringParam = 5,
+        TePDIBoxParam = 6,
+        TePDIRgbPaletteParam = 7,
+        TePDIFilterMaskParam = 8
+      };
+
+      /**
+       * Default Constructor
+       */
+      TePDIParameters();
+
+      /**
+       *  Default Destructor
+       */
+      ~TePDIParameters();
+
+      /**
+       * Sets a TeRaster parameter reference.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         const TePDITypes::TePDIRasterPtrType& data );
+
+      /**
+       * Gets a TeRaster parameter reference.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was not found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         TePDITypes::TePDIRasterPtrType& data ) const;
+
+      /**
+       * Sets a TePDIPalette parameter reference.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         TePDIRgbPalette::const_pointer& data );
+
+      /**
+       * Gets a TePDIPalette parameter reference.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was not found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         TePDIRgbPalette::pointer& data ) const;
+
+      /**
+       * Sets a Integer parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         int data );
+
+      /**
+       * Gets a Integer parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was no found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         int& data ) const;
+
+      /**
+       * Sets a Integer vector parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         std::vector< int >& data );
+
+      /**
+       * Gets a Integer vector parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was no found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         std::vector< int >& data ) const;
+
+      /**
+       * Sets a String parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         const std::string& data );
+
+      /**
+       * Gets a String parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was no found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         std::string& data ) const;
+
+      /**
+       * Sets a Double parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         double data );
+
+      /**
+       * Gets a Double parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was no found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         double& data ) const;
+
+      /**
+       * Sets a PDIBox parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         const TePDIBox::pointer& data );
+
+      /**
+       * Gets a PDIBox parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was no found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         TePDIBox::pointer& data ) const;
+
+      /**
+       * Sets a FilterMask parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       */
+      void SetParameter( const std::string& pname,
+                         const TePDIFilterMask::pointer& data );
+
+      /**
+       * Gets a FilterMask parameter.
+       *
+       * @param pname Parameter name.
+       * @param data Parameter data.
+       * @return true if OK, false if the parameter was no found or error.
+       */
+      bool GetParameter( const std::string& pname,
+                         TePDIFilterMask::pointer& data ) const;
+
+      /**
+       * Checks if the parameter was set.
+       *
+       * @param pname Parameter name.
+       * @param type Parameter type.
+       * @return true if OK, false if the parameter was not set.
+       */
+      bool CheckParameter( const std::string& pname,
+                           TePDIParamTypes type ) const;
+
+      /**
+       * Operator = overload.
+       *
+       * @param ext_params External instance TePDIParameters reference.
+       */
+      void operator=( const TePDIParameters& ext_params );
+
+    protected :
+      /**
+       * Internal Type definitions of suported parameters.
+       */
+      typedef std::map< std::string, std::string >
+        TePDIStringMap;
+      typedef std::map< std::string, int >
+        TePDIIntegerMap;
+      typedef std::map< std::string, std::vector< int > >
+        TePDIIntegerVectorMap;
+      typedef std::map< std::string, double >
+        TePDIDoubleMap;
+      typedef std::map< std::string, TePDITypes::TePDIRasterPtrType >
+        TePDIRasterMap;
+      typedef std::map< std::string, TePDIBox::pointer >
+        TePDIBoxMap;
+      typedef std::map< std::string, TePDIRgbPalette::pointer >
+        TePDIRgbPaletteMap;
+      typedef std::map< std::string, TePDIFilterMask::pointer >
+        TePDIFilterMaskMap;
+
+      /**
+       * Stored TeRaster references Map.
+       */
+      mutable TePDIRasterMap RasterMap_;
+
+      /**
+       * Stored integer references Map.
+       */
+      mutable TePDIIntegerMap IntegerMap_;
+
+      /**
+       * Stored integer vector references Map.
+       */
+      mutable TePDIIntegerVectorMap IntegerVectorMap_;
+
+      /**
+       * Stored double references Map.
+       */
+      mutable TePDIDoubleMap DoubleMap_;
+
+      /**
+       * Stored string references Map.
+       */
+      mutable TePDIStringMap StringMap_;
+
+      /**
+       * Stored PDIBox references Map.
+       */
+      mutable TePDIBoxMap PDIBoxMap_;
+
+      /**
+       * Stored PDIPalette references Map.
+       */
+      mutable TePDIRgbPaletteMap PDIRgbPaletteMap_;
+
+      /**
+       * Stored PDIFilterMask references Map.
+       */
+      mutable TePDIFilterMaskMap PDIFilterMaskMap_;
+};
+
+#endif //TEPDIPARAMETERS_HPP
diff --git a/src/terralib/PDI/source/TePDIRgbPalette.cpp b/src/terralib/PDI/source/TePDIRgbPalette.cpp
new file mode 100755
index 0000000..e825f04
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIRgbPalette.cpp
@@ -0,0 +1,194 @@
+#include "TePDIRgbPalette.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+#include <math.h>
+
+
+TePDIRgbPalette::iterator::iterator(
+  const std::map< double, unsigned int >::iterator& red_it,
+  const std::map< double, unsigned int >::iterator& green_it,
+  const std::map< double, unsigned int >::iterator& blue_it )
+{
+  red_it_ = red_it;
+  green_it_ = green_it;
+  blue_it_ = blue_it;
+}
+
+
+TePDIRgbPalette::iterator::~iterator()
+{
+}
+
+
+void TePDIRgbPalette::iterator::operator++()
+{
+  ++red_it_;
+  ++green_it_;
+  ++blue_it_;
+}
+
+
+void TePDIRgbPalette::iterator::operator--()
+{
+  --red_it_;
+  --green_it_;
+  --blue_it_;
+}
+
+
+void TePDIRgbPalette::iterator::operator=( const iterator& ext_ref )
+{
+  red_it_ = ext_ref.red_it_;
+  green_it_ = ext_ref.green_it_;
+  blue_it_ = ext_ref.blue_it_;
+}
+
+
+bool TePDIRgbPalette::iterator::operator!=( const iterator& ext_ref )
+{
+  return ( red_it_ != ext_ref.red_it_ ) ? true : false;
+}
+
+
+double TePDIRgbPalette::iterator::level() const
+{
+  return red_it_->first;
+}
+
+
+unsigned int TePDIRgbPalette::iterator::red() const
+{
+  return red_it_->second;
+}
+
+
+unsigned int TePDIRgbPalette::iterator::green() const
+{
+  return green_it_->second;
+}
+
+
+unsigned int TePDIRgbPalette::iterator::blue() const
+{
+  return blue_it_->second;
+}
+
+
+TePDIRgbPalette::TePDIRgbPalette()
+{
+}
+
+
+TePDIRgbPalette::~TePDIRgbPalette()
+{
+}
+
+void TePDIRgbPalette::set( double level, unsigned int red,
+  unsigned int green, unsigned int blue )
+{
+  red_map_[ level ] = red;
+  green_map_[ level ] = green;
+  blue_map_[ level ] = blue;
+}
+
+bool TePDIRgbPalette::get( double level, unsigned int& red,
+  unsigned int& green, unsigned int& blue ) const
+{
+  if( red_map_.find( level ) != red_map_.end() ) {
+    red = red_map_[ level ];
+    green = green_map_[ level ];
+    blue = blue_map_[ level ];
+
+    return true;
+  } else {
+    return false;
+  }
+}
+
+
+void TePDIRgbPalette::clear()
+{
+  red_map_.clear();
+  green_map_.clear();
+  blue_map_.clear();
+}
+
+
+unsigned long int TePDIRgbPalette::size() const
+{
+  return red_map_.size();
+}
+
+
+void TePDIRgbPalette::operator=( TePDIRgbPalette& external_reference )
+{
+  red_map_ = external_reference.red_map_;
+  green_map_ = external_reference.green_map_;
+  blue_map_ = external_reference.blue_map_;
+}
+
+
+TePDIRgbPalette::iterator TePDIRgbPalette::begin() const
+{
+  TePDIRgbPalette::iterator temp_it( red_map_.begin(), green_map_.begin(),
+    blue_map_.begin() );
+
+  return temp_it;
+}
+
+
+TePDIRgbPalette::iterator TePDIRgbPalette::end() const
+{
+  TePDIRgbPalette::iterator temp_it( red_map_.end(), green_map_.end(),
+    blue_map_.end() );
+
+  return temp_it;
+}
+
+
+TePDISharedPtr< TePDIRgbPalette > TePDIRgbPalette::createLB(
+  unsigned int levels )
+{
+  PDIAGN_TRUE_OR_THROW( levels > 0, "Invalid supplied Levels" );
+
+  unsigned int channel_levels =
+    (unsigned int) ceil( cbrtf( (float)levels ) );
+
+  unsigned int channel_step =
+    (unsigned int) floor( 256. / (float)(channel_levels + 1) );
+
+  unsigned int red_level = 0;
+  unsigned int green_level = 0;
+  unsigned int blue_level = 0;
+
+  TePDISharedPtr< TePDIRgbPalette > outPal( new TePDIRgbPalette );
+
+  unsigned int level = 0;
+
+  while( level < levels ) {
+    if( red_level > 255 ) {
+      red_level = red_level % 255;
+
+      green_level += channel_step;
+
+      if( green_level > 255 ) {
+        green_level = green_level % 255;
+
+        blue_level += channel_step;
+
+        if( blue_level > 255 ) {
+          blue_level = blue_level % 255;
+        }
+      }
+    }
+
+    outPal->set( (double)level, red_level, green_level, blue_level );
+
+    red_level += channel_step;
+
+    ++level;
+  }
+
+  return outPal;
+}
diff --git a/src/terralib/PDI/source/TePDIRgbPalette.hpp b/src/terralib/PDI/source/TePDIRgbPalette.hpp
new file mode 100644
index 0000000..abe8b62
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIRgbPalette.hpp
@@ -0,0 +1,238 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *   This file contains the class for RGB Palettes.
+ */
+
+#ifndef TEPDIRGBPALETTE_HPP
+  #define TEPDIRGBPALETTE_HPP
+
+  #include "TePDISharedPtr.cpp"
+
+  #include <map>
+  #include <cctype>
+
+  class TePDIRgbPalette{
+    public :
+      typedef TePDISharedPtr< TePDIRgbPalette > pointer;
+      typedef const TePDISharedPtr< TePDIRgbPalette > const_pointer;
+
+      /**
+       * Default Constructor
+       *
+       */
+      TePDIRgbPalette();
+
+      /**
+       * Default Destructor
+       */
+      virtual ~TePDIRgbPalette();
+
+      /**
+       * Stores RGB values associated with a paletted level.
+       *
+       * @param level Palette Level.
+       * @param red Red Level.
+       * @param green Green Level.
+       * @param blue Blue Level.
+       */
+      void set( double level, unsigned int red, unsigned int green,
+        unsigned int blue );
+
+      /**
+       * Retrives Stored RGB values associated with a paletted level.
+       *
+       * @param level Palette Level.
+       * @param red Red Level.
+       * @param green Green Level.
+       * @param blue Blue Level.
+       *
+       * @return true if the paletted level was found, false on error.
+       */
+      bool get( double level, unsigned int& red, unsigned int& green,
+        unsigned int& blue ) const;
+
+      /**
+       * Clears the entire palette.
+       */
+      void clear();
+
+      /**
+       * The current palette size.
+       *
+       * @return The current palette size.
+       */
+      unsigned long int size() const;
+
+      /**
+       * Operator = overload.
+       *
+       * @param external_reference A external palette reference.
+       */
+      void operator=( TePDIRgbPalette& external_reference );
+
+      /**
+       * Automatic Level Based Palette creation.
+       *
+       * @param levels The number of levels.
+       * @return The generated palette.
+       */
+      static TePDISharedPtr< TePDIRgbPalette > createLB( unsigned int levels );
+
+      /**
+       * Palette iterator.
+       */
+      class iterator{
+        public :
+          /**
+           * Default Constructor.
+           *
+           * @param red_it Red channel iterator.
+           * @param green_it Green channel iterator.
+           * @param blue_it Blue channel iterator.
+           */
+          explicit iterator(
+            const std::map< double, unsigned int >::iterator& red_it,
+            const std::map< double, unsigned int >::iterator& green_it,
+            const std::map< double, unsigned int >::iterator& blue_it );
+
+          /**
+           * Default Destructor.
+           */
+          ~iterator();
+
+          /**
+           * Operator ++ overload.
+           */
+          void operator++();
+
+          /**
+           * Operator -- overload.
+           */
+          void operator--();
+
+          /**
+           * Operator = overload.
+           *
+           * @param ext_ref External iterator reference.
+           */
+          void operator=( const iterator& ext_ref );
+
+          /**
+           * Operator != overload.
+           *
+           * @param ext_ref External iterator reference.
+           * @return true if both iterators are pointing to the same
+           * position.
+           */
+          bool operator!=( const iterator& ext_ref );
+
+          /**
+           * The current iterator pointed level.
+           *
+           * @return The current iterator pointed level.
+           */
+          double level() const;
+
+          /**
+           * The current iterator red channel value.
+           *
+           * @return The current iterator red channel value.
+           */
+          unsigned int red() const;
+
+          /**
+           * The current iterator green channel value.
+           *
+           * @return The current iterator green channel value.
+           */
+          unsigned int green() const;
+
+          /**
+           * The current iterator blue channel value.
+           *
+           * @return The current iterator blue channel value.
+           */
+          unsigned int blue() const;
+
+        protected :
+          /**
+           * Internal red map iterator;
+           */
+          mutable std::map< double, unsigned int >::iterator red_it_;
+
+          /**
+           * Internal green map iterator;
+           */
+          mutable std::map< double, unsigned int >::iterator green_it_;
+
+          /**
+           * Internal blue map iterator;
+           */
+          mutable std::map< double, unsigned int >::iterator blue_it_;
+      };
+
+      /**
+       * Iterator to the first element.
+       *
+       * @return An Iterator to the first element.
+       */
+      iterator begin() const;
+
+      /**
+       * Iterator pointing to the position after the
+       * last element.
+       *
+       * @return The iterator.
+       */
+      iterator end() const;
+
+    protected :
+      /**
+       * Internal Red channel map.
+       *
+       * @param double Paletted Level.
+       * @param unsigned int Relative Red Level.
+       */
+      mutable std::map< double, unsigned int > red_map_;
+
+      /**
+       * Internal Green channel map.
+       *
+       * @param double Paletted Level.
+       * @param unsigned int Relative Green Level.
+       */
+      mutable std::map< double, unsigned int > green_map_;
+
+      /**
+       * Internal Blue channel map.
+       *
+       * @param double Paletted Level.
+       * @param unsigned int Relative Blue Level.
+       */
+      mutable std::map< double, unsigned int > blue_map_;
+  };
+
+#endif //TEPDIRGBPALETTE_HPP
diff --git a/src/terralib/PDI/source/TePDISharedPtr.cpp b/src/terralib/PDI/source/TePDISharedPtr.cpp
new file mode 100644
index 0000000..dcb0aca
--- /dev/null
+++ b/src/terralib/PDI/source/TePDISharedPtr.cpp
@@ -0,0 +1,146 @@
+#ifndef TEPDISHAREDPTR_CPP
+#define TEPDISHAREDPTR_CPP
+
+#include "TePDISharedPtr.hpp"
+
+#include <iostream>
+
+
+template< class T >
+TePDISharedPtr< T >::TePDISharedPtr( T* pointer,
+  bool static_assignment )
+{
+  if( pointer == 0 ) {
+    counter_ = 0;
+    reference_ = 0;
+    static_assignment_ = false;
+  } else {
+    counter_ = new unsigned long int;
+    (*counter_) = 1;
+
+    reference_ = pointer;
+
+    static_assignment_ = static_assignment;
+  }
+}
+
+
+template< class T >
+TePDISharedPtr< T >::TePDISharedPtr( const TePDISharedPtr& external )
+{
+  counter_ = 0;
+  reference_ = 0;
+  static_assignment_ = false;
+
+  (*this) = external;
+}
+
+
+template< class T >
+  TePDISharedPtr< T >::~TePDISharedPtr()
+{
+  reset();
+}
+
+
+template< class T >
+bool TePDISharedPtr< T >::isActive() const
+{
+  return ( reference_ == 0 ) ? false : true;
+}
+
+
+template< class T >
+void TePDISharedPtr< T >::reset( T* pointer, bool static_assignment )
+{
+  if( isActive() ) {
+     --(*counter_);
+
+     if( (*counter_) == 0 ) {
+       delete counter_;
+
+       if( ! static_assignment_ ) {
+         delete reference_;
+       }
+     }
+  }
+
+  if( pointer != 0 ){
+    counter_ = new unsigned long int;
+    (*counter_) = 1;
+
+    reference_ = pointer;
+
+    static_assignment_ = static_assignment;
+  } else {
+    counter_ = 0;
+    reference_ = 0;
+    static_assignment_ = false;
+  }
+}
+
+
+template< class T >
+TePDISharedPtr< T >& TePDISharedPtr< T >::operator=(
+  const TePDISharedPtr< T >& external )
+{
+  reset();
+
+  if( external.isActive() ) {
+    counter_ = external.counter_;
+    (*counter_) = (*counter_) + 1;
+
+    reference_ = external.reference_;
+
+    static_assignment_ = external.static_assignment_;
+  }
+
+  return *this;
+}
+
+
+template< class T >
+T& TePDISharedPtr< T >::operator*()
+{
+  if( ! isActive() ) {
+    std::cout << std::endl
+      << "TePDISharedPtr::operator* - Invalid use of inactive instance"
+      << std::endl;
+    throw;
+  }
+
+  return *reference_;
+}
+
+
+template< class T >
+T* TePDISharedPtr< T >::operator->()
+{
+  return reference_;
+}
+
+
+template< class T >
+bool TePDISharedPtr< T >::operator==( const TePDISharedPtr& external )
+{
+  return ( ( reference_ == external.reference_ ) &&
+         ( counter_ == external.counter_ ) ) ? true : false;
+}
+
+
+template< class T >
+bool TePDISharedPtr< T >::operator!=( const TePDISharedPtr& external )
+{
+  return ( ( reference_ != external.reference_ ) ||
+    ( counter_ != external.counter_ ) ) ? true : false;
+}
+
+
+template< class T >
+T* TePDISharedPtr< T >::NakedPointer()
+{
+  return reference_;
+}
+
+
+#endif //TEPDISHAREDPTR_CPP
diff --git a/src/terralib/PDI/source/TePDISharedPtr.hpp b/src/terralib/PDI/source/TePDISharedPtr.hpp
new file mode 100644
index 0000000..f06ca4f
--- /dev/null
+++ b/src/terralib/PDI/source/TePDISharedPtr.hpp
@@ -0,0 +1,142 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *   This file contains the class to deal with automatic dynamic memory
+ *   allocation / desallocation.
+ */
+
+#ifndef TEPDISHAREDPTR_HPP
+  #define TEPDISHAREDPTR_HPP
+
+  template< class T >
+  class TePDISharedPtr{
+    public :
+      /**
+       * Default Constructor.
+       *
+       * @param pointer A pointer the the active object.
+       * @param static_assignment A flag indication for a static
+       * assignment (the pointed object will not be destroyed at the
+       * end ).
+       */
+      TePDISharedPtr( T* pointer = 0, bool static_assignment = false );
+
+      /**
+       * Alternative Constructor.
+       *
+       * @param external External object reference.
+       */
+      TePDISharedPtr( const TePDISharedPtr& external );
+
+      /**
+       * Default Destructor
+       */
+      ~TePDISharedPtr();
+
+      /**
+       * Verifies if the current pointer points to an active object.
+       *
+       * @return true if active, false if not.
+       */
+      bool isActive() const;
+
+      /**
+       * Reset the active instance the the new pointer.
+       *
+       * @param pointer A pointer the the active object.
+       * @param static_assignment A flag indication for a static
+       * assignment (the pointed object will not be destroyed at the
+       * end ).
+       */
+      void reset( T* pointer = 0, bool static_assignment = false );
+
+      /**
+       * Operator = overload.
+       *
+       * @param external External instance reference.
+       */
+      TePDISharedPtr< T >& operator=( const TePDISharedPtr< T >& external );
+
+      /**
+       * Operator * overload.
+       *
+       * @return The internal instance reference.
+       */
+      T& operator*();
+
+      /**
+       * Operator -> overload.
+       *
+       * @return The internal instance pointer.
+       */
+      T* operator->();
+
+      /**
+       * Operator == overload.
+       *
+       * @return true if the current pointer and the external pointer
+       * are pointing to the same object.
+       */
+      bool operator==( const TePDISharedPtr& external );
+
+      /**
+       * Operator != overload.
+       *
+       * @return true if the current pointer and the external pointer
+       * are not pointing to the same object.
+       */
+      bool operator!=( const TePDISharedPtr& external );
+
+      /**
+       * A Naked Pointer to the encapsulated object.
+       *
+       * @return The internal instance pointer.
+       */
+      T* NakedPointer();
+
+    protected :
+
+      /**
+       * A pointer to the current number of active users of this pointer.
+       */
+      mutable unsigned long int* counter_;
+
+      /**
+       * A pointer to the current object encapsulated by this
+       * shared pointer.
+       */
+      mutable T* reference_;
+
+      /**
+       * A flag indicating if this shared pointer was created by a
+       * dynamic assignment ( false value ) or by a static
+       * assignment( true value - the encapsulated object will not
+       * be destroyed at the end.
+       */
+      mutable bool static_assignment_;
+  };
+
+
+#endif //TEPDISHAREDPTR_HPP
diff --git a/src/terralib/PDI/source/TePDITypes.hpp b/src/terralib/PDI/source/TePDITypes.hpp
new file mode 100644
index 0000000..ae30194
--- /dev/null
+++ b/src/terralib/PDI/source/TePDITypes.hpp
@@ -0,0 +1,84 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+#ifndef TEPDITYPES_HPP
+  #define TEPDITYPES_HPP
+
+  #include "TePDIRgbPalette.hpp"
+
+  #include "TePDISharedPtr.cpp"
+
+  #include <TeRaster.h>
+
+  #include <map>
+  #include <vector>
+
+
+  /**
+   *  This namespace contains the global types used by all PDI classes.
+   */
+  namespace TePDITypes
+  {
+    /**
+     * Histogram alias definition.
+     *
+     * @param double level.
+     * @param int Pixel count.
+     */
+    typedef map< double, int > TePDIHistogramType;
+
+    /**
+     * Histograms vector alias definition.
+     */
+    typedef std::vector< TePDIHistogramType > TePDIHistogramsVectorType;
+
+    /**
+     * Histograms map alias definition.
+     *
+     * @param int Channel ( band ) number;
+     * @param TePDIHistogramType Related histogram.
+     */
+    typedef std::map< int, TePDIHistogramType > TePDIHistogramsMapType;
+
+    /**
+     * Type definition for a simple LUT - Look-Up Table.
+     *
+     * @param double (First) input level.
+     * @param double (Second) output level.
+     */
+    typedef map< double, double > TePDILutType;
+
+    /**
+     * Look-Up Table vector alias definition.
+     */
+    typedef std::vector< TePDILutType > TePDILutsVectorType;
+
+    /**
+     * TeRaster pointer definition.
+     */
+    typedef TePDISharedPtr< TeRaster > TePDIRasterPtrType;
+
+  };
+
+#endif //TEPDITYPES_HPP
diff --git a/src/terralib/PDI/source/TePDIUtils.cpp b/src/terralib/PDI/source/TePDIUtils.cpp
new file mode 100755
index 0000000..70b5822
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIUtils.cpp
@@ -0,0 +1,284 @@
+#include "TePDIUtils.hpp"
+
+#include "TePDIAgnostic.hpp"
+
+#include <TeDecoderMemory.h>
+#include <TeDecoderTIFF.h>
+#include <TeRaster.h>
+#include <TeRasterParams.h>
+
+#include <cmath>
+
+namespace TePDIUtils{
+
+  bool TeGenerateHistogram(
+    TePDITypes::TePDIRasterPtrType& in_raster,
+    unsigned int levels,
+    unsigned int band,
+    TePDITypes::TePDIHistogramType& out_hist,
+    bool force_zero_reference )
+  {
+    int bands_number = in_raster->nBands();
+
+    PDIAGN_TRUE_OR_RETURN( (int)band < bands_number,
+      "Invalid band" );
+
+    out_hist.clear();
+
+    TeRaster::iterator raster_it = in_raster->begin();
+
+    TeRaster::iterator raster_end_it = in_raster->end();
+
+    /* Finding the lowest end highest level */
+
+    double lowest_level = 0;
+    bool lowest_level_enabled = 0;
+    double highest_level = 0;
+    bool highest_level_enabled = 0;
+    double current_raster_level;
+
+    while( raster_it != raster_end_it ) {
+      current_raster_level = raster_it*( band );
+
+      if( lowest_level_enabled ) {
+        if( current_raster_level < lowest_level) {
+          lowest_level = current_raster_level;
+        }
+      } else {
+        lowest_level = current_raster_level;
+        lowest_level_enabled = true;
+      }
+
+      if( highest_level_enabled ) {
+        if( current_raster_level > highest_level) {
+          highest_level = current_raster_level;
+        }
+      } else {
+        highest_level = current_raster_level;
+        highest_level_enabled = true;
+      }
+
+      ++raster_it;
+    }
+
+    if( force_zero_reference ) {
+      if( highest_level > 0 ) {
+        lowest_level = 0;
+      } else {
+        highest_level = 0;
+      }
+    }
+
+    /* Calculating the histogram step */
+
+    double step = 1;
+    unsigned int hist_computed_levels = 1;
+
+    if( levels == 0 ) {
+      /* Auto step feature */
+      PDIAGN_TRUE_OR_RETURN( ( highest_level - lowest_level ) > 1,
+        "Unable to use the Histogram Auto-step feature" );
+
+      hist_computed_levels = 1 +
+        ( unsigned int ) std::floor( highest_level - lowest_level );
+    } else {
+      hist_computed_levels = levels;
+    }
+
+    PDIAGN_TRUE_OR_RETURN( hist_computed_levels > 1,
+      "Invalid levels number" );
+
+    step = ( highest_level - lowest_level ) / (double)hist_computed_levels;
+
+    /* Ordered Histogram pre-allocation */
+
+    for( unsigned int level = 0 ; level < ( hist_computed_levels - 1 ) ;
+         ++level ) {
+
+      out_hist[ ( level * step ) + lowest_level ] = 0;
+    }
+    out_hist[ highest_level ] = 0;
+
+    /* Histogram generation */
+
+    raster_it = in_raster->begin();
+    TePDITypes::TePDIHistogramType::iterator hist_it;
+    TePDITypes::TePDIHistogramType::iterator hist_next_it;
+    TePDITypes::TePDIHistogramType::iterator hist_end_it = out_hist.end();
+
+    while( raster_it != raster_end_it ) {
+      current_raster_level = raster_it*( band );
+
+      /* locating the raster level position relative to histogram levels */
+
+      hist_it = out_hist.begin();
+      hist_next_it = hist_it;
+      ++hist_next_it;
+
+      while( hist_next_it != hist_end_it ) {
+        if( current_raster_level <= hist_next_it->first ) {
+          break;
+        }
+
+        ++hist_it;
+        ++hist_next_it;
+      }
+
+      /* Interpolating level */
+
+      if( hist_next_it == hist_end_it ) {
+        (*hist_it).second = (*hist_it).second + 1;
+      } else {
+        if( std::abs( hist_it->first - current_raster_level ) <
+            std::abs( hist_next_it->first - current_raster_level ) ) {
+
+          (*hist_it).second = (*hist_it).second + 1;
+        } else {
+          (*hist_next_it).second = (*hist_next_it).second + 1;
+        }
+      }
+
+
+      ++raster_it;
+    }
+
+    return true;
+  }
+
+
+  bool TeAllocRAMRaster(
+    TePDITypes::TePDIRasterPtrType& template_raster,
+    TePDITypes::TePDIRasterPtrType& RAMRaster )
+  {
+    PDIAGN_TRUE_OR_RETURN( template_raster.isActive(),
+      "Inactive Input Raster" );
+    PDIAGN_TRUE_OR_RETURN( template_raster->status() != TeNOTREADY,
+      "Input not Ready" );
+
+    if( ! RAMRaster.isActive() ) {
+      RAMRaster.reset( new TeRaster() );
+    }
+
+    TeRasterParams temp_params = template_raster->params();
+    temp_params.mode_ = 'c';
+
+    /* Assigning a RAM decoder */
+    RAMRaster->setDecoder( new TeDecoderMemory( temp_params ) );
+
+    return RAMRaster->init();
+  }
+
+
+  bool TeRaster2Geotiff(
+    TePDITypes::TePDIRasterPtrType& in_raster,
+    const std::string& file_name )
+  {
+    PDIAGN_TRUE_OR_RETURN( in_raster.isActive(),
+      "Inactive Input Raster" );
+    PDIAGN_TRUE_OR_RETURN( in_raster->status() != TeNOTREADY,
+      "Input not Ready" );
+    PDIAGN_TRUE_OR_RETURN( file_name.size() != 0,
+      "Invalid file name" );
+
+    TeRasterParams temp_params = in_raster->params();
+
+    temp_params.mode_ = 'c';
+    temp_params.fileName_ = file_name;
+
+    TePDITypes::TePDIRasterPtrType outRaster( new TeRaster( temp_params ) );
+
+    outRaster->setDecoder( new TeDecoderTIFF( outRaster->params() ) );
+
+    PDIAGN_TRUE_OR_RETURN( outRaster->init(),
+      "Unable to init GeoTIFF Raster" );
+
+    return TeCopyRasterPixels( in_raster, outRaster );
+  }
+
+
+  bool TeCopyRasterPixels(
+    TePDITypes::TePDIRasterPtrType& source_raster,
+    TePDITypes::TePDIRasterPtrType& target_raster )
+  {
+    PDIAGN_TRUE_OR_RETURN( source_raster.isActive(),
+      "Inactive Input Raster" );
+    PDIAGN_TRUE_OR_RETURN( target_raster.isActive(),
+      "Inactive Output Raster" );
+    PDIAGN_TRUE_OR_RETURN( source_raster->status() != TeNOTREADY,
+      "Input not Ready" );
+    PDIAGN_TRUE_OR_RETURN( target_raster->status() == TeREADYTOWRITE,
+      "OutPut not Ready" );
+
+    TeRasterParams& source_params = source_raster->params();
+    TeRasterParams& target_params = target_raster->params();
+
+    PDIAGN_TRUE_OR_RETURN(
+      ( ( source_params.nBands() == target_params.nBands() ) &&
+      ( source_params.nlines_ == target_params.nlines_ ) &&
+      ( source_params.ncols_ == target_params.ncols_ ) ),
+      "Input and Output Raster's have different dimentions" );
+
+    double pixel_value;
+
+    for( int band = 0 ; band < source_params.nBands() ; ++band )
+      for( int line = 0 ; line < source_params.nlines_ ; ++line )
+        for( int column = 0 ; column < source_params.ncols_ ; ++column ) {
+          if( source_raster->getElement( column, line, pixel_value, band ) ) {
+            PDIAGN_TRUE_OR_THROW( target_raster->setElement( column, line,
+              pixel_value, band ), "Pixel copy error" );
+          }
+
+        }
+
+    return true;
+  }
+
+
+  bool TeResetRaster(TePDITypes::TePDIRasterPtrType& raster,
+      unsigned int bands, unsigned int lines, unsigned int columns,
+      TePDIRgbPalette* palette  )
+  {
+    PDIAGN_TRUE_OR_RETURN( raster.isActive(),
+      "Inactive Raster" );
+    PDIAGN_TRUE_OR_RETURN( raster->status() == TeREADYTOWRITE,
+      "Raster not ready" );
+
+    TeRasterParams params = raster->params();
+
+    params.nBands( (int) bands );
+
+    params.nlines_ = (int) lines;
+    params.ncols_ = (int) columns;
+    params.mode_ = 'c';
+    params.useDummy_ = false;
+
+    if( palette != 0 ) {
+      params.setPhotometric( TeRASTERPALETTE );
+      params.setNumberPalleteEntries( palette->size() );
+
+      TePDIRgbPalette::iterator pal_it = palette->begin();
+      TePDIRgbPalette::iterator pal_it_end = palette->end();
+
+      for( unsigned int lut_index = 0 ; lut_index < palette->size() ;
+           ++lut_index ) {
+
+        params.lutr_[ lut_index ] = (unsigned short)pal_it.red();
+        params.lutg_[ lut_index ] = (unsigned short)pal_it.green();
+        params.lutb_[ lut_index ] = (unsigned short)pal_it.blue();
+
+        ++pal_it;
+      }
+
+      params.lutr_[ palette->size() ] = 255;
+      params.lutg_[ palette->size() ] = 255;
+      params.lutb_[ palette->size() ] = 255;
+    }
+
+    PDIAGN_TRUE_OR_RETURN( raster->init( params ),
+      "Unable to init raster" );
+
+    return true;
+  }
+
+}
+
diff --git a/src/terralib/PDI/source/TePDIUtils.hpp b/src/terralib/PDI/source/TePDIUtils.hpp
new file mode 100644
index 0000000..1ac499e
--- /dev/null
+++ b/src/terralib/PDI/source/TePDIUtils.hpp
@@ -0,0 +1,132 @@
+/*
+TerraLib - a library for developing GIS applications.
+Copyright  2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular
+purpose. The library provided hereunder is on an "as is" basis, and the
+authors have no obligation to provide maintenance, support, updates,
+enhancements, or modifications.
+In no event shall INPE be held liable to any party
+for direct, indirect, special, incidental, or consequential damages arising
+out of the use of this library and its documentation.
+*/
+
+/**
+ *   This file contains utilitary functions.
+ */
+
+#ifndef TEPDIUTILS_HPP
+  #define TEPDIUTILS_HPP
+
+  #include "TePDITypes.hpp"
+
+  #include <TeRaster.h>
+
+  #include <sstream>
+  #include <string>
+  #include <iostream>
+  #include <map>
+
+  namespace TePDIUtils{
+
+    /**
+     * Data convertion to string.
+     *
+     * @param data Data to be converted.
+     * @return The converted string.
+     */
+     template< class T >
+     std::string to_string( const T& data )
+     {
+        std::stringstream temp_ss;
+        temp_ss << data;
+        return temp_ss.str();
+     }
+
+    /**
+     * Generates a discrete level-ordered histogram by interpolation, using
+     * the supplied parameters.
+     *
+     * @param in_raster Input raster.
+     * @param levels The number of interpolated levels, and if set to zero,
+     * the number of levels will be automaticlly found by using
+     * level step aproximation to one.
+     * @param band Band number.
+     * @param out_hist The generated histogram.
+     * @param force_zero_reference If true, the histogram will always
+     * start( or end ) with the zero level.
+     * @return true if the histogram has been generated, false on error.
+     */
+    bool TeGenerateHistogram(
+      TePDITypes::TePDIRasterPtrType& in_raster,
+      unsigned int levels,
+      unsigned int band,
+      TePDITypes::TePDIHistogramType& out_hist,
+      bool force_zero_reference = 0 );
+
+    /**
+     * Allocates one RAM raster using the info of another.
+     *
+     * @param template_raster Input raster.
+     * @param RAMRaster Output raster.
+     * @return true if OK. false on error.
+     */
+    bool TeAllocRAMRaster(
+      TePDITypes::TePDIRasterPtrType& template_raster,
+      TePDITypes::TePDIRasterPtrType& RAMRaster );
+
+    /**
+     * Save the raster to a GeoTIFF file.
+     *
+     * @param in_raster Input raster.
+     * @param file_name Output file name.
+     * @return true if OK. false on error.
+     */
+    bool TeRaster2Geotiff(
+      TePDITypes::TePDIRasterPtrType& in_raster,
+      const std::string& file_name );
+
+    /**
+     * Do pixel by pixel copy from on raster to another ( all bands ).
+     *
+     * @param source_raster Input raster.
+     * @param target_raster Output raster.
+     * @return true if OK. false on error.
+     */
+    bool TeCopyRasterPixels(
+      TePDITypes::TePDIRasterPtrType& source_raster,
+      TePDITypes::TePDIRasterPtrType& target_raster );
+
+    /**
+     * Reset the raster to the new parameters.
+     *
+     * If there are no decoder associated with the raster, a
+     * default MEMORY DECODER will be created.
+     *
+     * @param raster Input raster.
+     * @param bands The new number of bands.
+     * @param lines The new number of lines.
+     * @param columns The new number of columns.
+     * @param palette A palette reference, for generation of a paletted
+     * raster.
+     * @return true if OK. false on error.
+     */
+    bool TeResetRaster(
+      TePDITypes::TePDIRasterPtrType& raster,
+      unsigned int bands, unsigned int lines, unsigned int columns,
+      TePDIRgbPalette* palette = 0 );
+
+  };
+
+#endif //TEPDIUTILS_HPP
diff --git a/src/terralib/PDI/source/projects/.cvsignore b/src/terralib/PDI/source/projects/.cvsignore
new file mode 100644
index 0000000..550bd25
--- /dev/null
+++ b/src/terralib/PDI/source/projects/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+
diff --git a/src/terralib/PDI/source/projects/base/.cvsignore b/src/terralib/PDI/source/projects/base/.cvsignore
new file mode 100644
index 0000000..0236094
--- /dev/null
+++ b/src/terralib/PDI/source/projects/base/.cvsignore
@@ -0,0 +1,4 @@
+*.o
+*.obj
+
+
diff --git a/src/terralib/PDI/source/projects/base/base.pro b/src/terralib/PDI/source/projects/base/base.pro
new file mode 100755
index 0000000..79142f4
--- /dev/null
+++ b/src/terralib/PDI/source/projects/base/base.pro
@@ -0,0 +1,52 @@
+TEMPLATE = lib
+
+CONFIG = warn_on debug create_prl
+
+LANGUAGE = C++
+
+INCLUDEPATH = ../../../../kernel
+INCLUDEPATH += ../../../../functions
+INCLUDEPATH += ../../../../../tiff
+
+HEADERS = \
+          TePDIAgnostic.hpp \
+          TePDISharedPtr.hpp \
+          TePDIUtils.hpp \
+          TePDITypes.hpp \
+          TePDIBox.hpp \
+          TePDIRgbPalette.hpp \
+          TePDIParameters.hpp \
+          TePDIAlgorithm.hpp \
+          TePDIContrast.hpp \
+          TePDIFilter.hpp \
+          TePDIFilterMask.hpp \
+          TePDILinearFilter.hpp
+
+SOURCES = \
+          TePDIAgnostic.cpp \
+          TePDISharedPtr.cpp \
+          TePDIUtils.cpp \
+          TePDIBox.cpp \
+          TePDIRgbPalette.cpp \
+          TePDIParameters.cpp \
+          TePDIAlgorithm.cpp \
+          TePDIContrast.cpp \
+          TePDIFilter.cpp \
+          TePDIFilterMask.cpp \
+          TePDILinearFilter.cpp
+
+
+VPATH = ../..
+
+win32 {
+  INCLUDEPATH += ../../../../../STLport/
+
+  LIBS = ../../../../../../terralibw/terralib/terralib.lib
+  LIBS += ../../../../../../terralibw/tiff/tiff.lib
+}
+
+unix {
+  LIBS = -L../../../../../../terralibx/terralib -lterralib
+  LIBS += -L../../../../../../terralibx/tiff -ltiff
+}
+
diff --git a/src/terralib/PDI/source/projects/dynamic/.cvsignore b/src/terralib/PDI/source/projects/dynamic/.cvsignore
new file mode 100644
index 0000000..f896ca9
--- /dev/null
+++ b/src/terralib/PDI/source/projects/dynamic/.cvsignore
@@ -0,0 +1,4 @@
+Makefile
+*.obj
+*.o
+
diff --git a/src/terralib/PDI/source/projects/dynamic/dynamic.pro b/src/terralib/PDI/source/projects/dynamic/dynamic.pro
new file mode 100644
index 0000000..5b1a8f6
--- /dev/null
+++ b/src/terralib/PDI/source/projects/dynamic/dynamic.pro
@@ -0,0 +1,17 @@
+include( ../base/base.pro )
+
+CONFIG += dll
+
+TARGET  = ../../../bin/dynamic/terralibpdi
+
+unix {
+  QMAKE_CLEAN  += \
+    ../../../bin/dynamic/*.so.* \
+    ../../../bin/dynamic/*.prl
+}
+
+win32 {
+  QMAKE_CLEAN  += \
+    ../../../bin/dynamic/*.lib \
+    ../../../bin/dynamic/*.prl
+}
\ No newline at end of file
diff --git a/src/terralib/PDI/source/projects/projects.pro b/src/terralib/PDI/source/projects/projects.pro
new file mode 100755
index 0000000..ea32871
--- /dev/null
+++ b/src/terralib/PDI/source/projects/projects.pro
@@ -0,0 +1,6 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+          dynamic
+
diff --git a/src/terralib/PDI/source/projects/static/.cvsignore b/src/terralib/PDI/source/projects/static/.cvsignore
new file mode 100644
index 0000000..f896ca9
--- /dev/null
+++ b/src/terralib/PDI/source/projects/static/.cvsignore
@@ -0,0 +1,4 @@
+Makefile
+*.obj
+*.o
+
diff --git a/src/terralib/PDI/source/projects/static/static.pro b/src/terralib/PDI/source/projects/static/static.pro
new file mode 100644
index 0000000..5146d03
--- /dev/null
+++ b/src/terralib/PDI/source/projects/static/static.pro
@@ -0,0 +1,17 @@
+include( ../base/base.pro )
+
+CONFIG  += staticlib
+
+TARGET  = ../../../bin/static/terralibpdi
+
+unix {
+  QMAKE_CLEAN  += \
+    ../../../bin/static/*.so.* \
+    ../../../bin/static/*.prl
+}
+
+win32 {
+  QMAKE_CLEAN  += \
+    ../../../bin/static/*.lib \
+    ../../../bin/static/*.prl
+}
\ No newline at end of file
diff --git a/src/terralib/PDI/source/source.pro b/src/terralib/PDI/source/source.pro
new file mode 100755
index 0000000..3b1affe
--- /dev/null
+++ b/src/terralib/PDI/source/source.pro
@@ -0,0 +1,6 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+          projects
+
diff --git a/src/terralib/PDI/tests/.cvsignore b/src/terralib/PDI/tests/.cvsignore
new file mode 100644
index 0000000..f3c7a7c
--- /dev/null
+++ b/src/terralib/PDI/tests/.cvsignore
@@ -0,0 +1 @@
+Makefile
diff --git a/src/terralib/PDI/tests/bin/.cvsignore b/src/terralib/PDI/tests/bin/.cvsignore
new file mode 100644
index 0000000..620ec53
--- /dev/null
+++ b/src/terralib/PDI/tests/bin/.cvsignore
@@ -0,0 +1,3 @@
+*.tif
+Te*
+
diff --git a/src/terralib/PDI/tests/resources/.cvsignore b/src/terralib/PDI/tests/resources/.cvsignore
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/terralib/PDI/tests/resources/.cvsignore
@@ -0,0 +1 @@
+
diff --git a/src/terralib/PDI/tests/resources/cbers_b2_crop.tif b/src/terralib/PDI/tests/resources/cbers_b2_crop.tif
new file mode 100755
index 0000000..484acd4
Binary files /dev/null and b/src/terralib/PDI/tests/resources/cbers_b2_crop.tif differ
diff --git a/src/terralib/PDI/tests/source/.cvsignore b/src/terralib/PDI/tests/source/.cvsignore
new file mode 100644
index 0000000..550bd25
--- /dev/null
+++ b/src/terralib/PDI/tests/source/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+
diff --git a/src/terralib/PDI/tests/source/TePDIContrast/.cvsignore b/src/terralib/PDI/tests/source/TePDIContrast/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIContrast/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast.pro b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast.pro
new file mode 100755
index 0000000..d36c036
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast.pro
@@ -0,0 +1,7 @@
+include( ../base/base.pro )
+
+SOURCES += \
+  TePDIContrast_test.cpp
+
+QMAKE_CLEAN += \
+  ../../bin/TePDIContrast*
diff --git a/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast_test.cpp b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast_test.cpp
new file mode 100644
index 0000000..96d60db
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIContrast/TePDIContrast_test.cpp
@@ -0,0 +1,346 @@
+#include <TePDIContrast.hpp>
+#include <TePDIParameters.hpp>
+#include <TePDIUtils.hpp>
+#include <TePDIRgbPalette.hpp>
+
+#include <TeRaster.h>
+#include <TeDataTypes.h>
+#include <TeDecoderTIFF.h>
+#include <TeInitRasterDecoders.h>
+
+#include <TePDIAgnostic.hpp>
+
+#include <string>
+
+void TePDIContrastMinMax_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastMinMax;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastMinMax_test.tif" ), "GeoTIF generation error" );
+}
+
+
+void TePDIContrastLinear_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastLinear;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  params.SetParameter( "min_level", (double)46 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastLinear_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastSquareRoot_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastSquareRoot;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  params.SetParameter( "min_level", (double)46 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastSquareRoot_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastSquare_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastSquare;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  params.SetParameter( "min_level", (double)46 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastSquare_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastLog_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastLog;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  params.SetParameter( "min_level", (double)46 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastLog_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastNegative_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastNegative;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  params.SetParameter( "min_level", (double)46 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastNegative_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastHistEqualizer_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastHistEqualizer;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)256 );
+
+  params.SetParameter( "min_level", (double)46 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastHistEqualizer_test.tif" ), "GeoTIF generation error" );
+}
+
+void TePDIContrastSimpleSlicer_test()
+{
+  TePDIParameters params;
+
+  int contrast_type = TePDIContrast::TePDIContrastSimpleSlicer;
+  params.SetParameter( "contrast_type", contrast_type );
+
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+  params.SetParameter( "input_image", inRaster );
+
+  TePDITypes::TePDIRasterPtrType outRaster;
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster,
+    outRaster ), "RAM Raster Alloc error" );
+  params.SetParameter( "output_image", outRaster );
+
+  std::vector<int> channels;
+  channels.push_back( 0 );
+  params.SetParameter( "channels", channels );
+
+  params.SetParameter( "histo_levels", (int)( 102 - 47 + 1 ) );
+
+  params.SetParameter( "min_level", (double)47 );
+  params.SetParameter( "max_level", (double)102 );
+
+  TePDIRgbPalette::pointer pal =
+    TePDIRgbPalette::createLB( 20 );
+  params.SetParameter( "rgb_palette", pal );
+
+  TePDIContrast contra;
+
+  PDIAGN_TRUE_OR_THROW( contra.Reset( params ),
+    "Invalid Parameters" );
+
+  PDIAGN_TRUE_OR_THROW( contra.Apply(),
+    "Apply error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TePDIContrastSimpleSlicer_test.tif" ), "GeoTIF generation error" );
+}
+
+int main()
+{
+  PDIAGN_LOGMSG( "Test started." );
+
+  PDIAGN_DEBUG_MODE_CHECK;
+
+  try{
+    TeInitRasterDecoders();
+
+    TePDIContrastMinMax_test();
+    TePDIContrastLinear_test();
+    TePDIContrastSquareRoot_test();
+    TePDIContrastSquare_test();
+    TePDIContrastLog_test();
+    TePDIContrastNegative_test();
+    TePDIContrastHistEqualizer_test();
+    TePDIContrastSimpleSlicer_test();
+  }
+  catch(...){
+    PDIAGN_LOGERR( "Test Failed.");
+    return EXIT_FAILURE;
+  }
+
+  PDIAGN_LOGMSG( "Test OK." );
+  return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/TePDIParameters/.cvsignore b/src/terralib/PDI/tests/source/TePDIParameters/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIParameters/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters.pro b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters.pro
new file mode 100755
index 0000000..6295733
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters.pro
@@ -0,0 +1,6 @@
+include( ../base/base.pro )
+
+SOURCES += TePDIParameters_test.cpp
+
+QMAKE_CLEAN += \
+  ../../bin/TePDIParameters
diff --git a/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters_test.cpp b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters_test.cpp
new file mode 100644
index 0000000..bb5eba1
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIParameters/TePDIParameters_test.cpp
@@ -0,0 +1,103 @@
+#include <TePDIParameters.hpp>
+
+#include <TePDIAgnostic.hpp>
+
+#include <TeRaster.h>
+
+#include <stdlib.h>
+#include <iostream>
+
+int main()
+{
+  PDIAGN_LOGMSG( "Test started." );
+
+  PDIAGN_DEBUG_MODE_CHECK;
+
+  try{
+    /* Integer type test */
+
+    TePDIParameters tparam;
+
+    tparam.SetParameter( std::string("param_name_1"), (int)1 );
+    tparam.SetParameter( std::string("param_name_2"), (int)2 );
+
+    PDIAGN_TRUE_OR_THROW( tparam.CheckParameter( "param_name_1",
+      TePDIParameters::TePDIIntParam ),
+      "Parameter checking error for param_name_1" );
+
+    PDIAGN_TRUE_OR_THROW( tparam.CheckParameter( "param_name_2",
+      TePDIParameters::TePDIIntParam ),
+      "Parameter checking error for param_name_2" );
+
+    PDIAGN_TRUE_OR_THROW( false == tparam.CheckParameter(
+      "param_name_unknown", TePDIParameters::TePDIIntParam ),
+      "Unknown Parameter checking error" );
+
+    int temp_v1 = 0;
+    int temp_v2 = 0;
+
+    PDIAGN_TRUE_OR_THROW( tparam.GetParameter( "param_name_1", temp_v1 ),
+      "Invalid param_name_1 GET" );
+
+    PDIAGN_TRUE_OR_THROW( temp_v1 == 1,
+      "param_name_1 value checking" );
+
+    PDIAGN_TRUE_OR_THROW( tparam.GetParameter( "param_name_2", temp_v2 ),
+      "Invalid param_name_2 GET" );
+
+    PDIAGN_TRUE_OR_THROW( temp_v2 == 2,
+      "param_name_2 value checking" );
+
+    /* Vector type test */
+
+    std::vector< int > temp_vector_1;
+    temp_vector_1.push_back( 1 );
+
+    tparam.SetParameter( "temp_vector_1", temp_vector_1 );
+
+    std::vector< int > temp_vector_2;
+
+    PDIAGN_TRUE_OR_THROW(
+      tparam.GetParameter( "temp_vector_1", temp_vector_2 ),
+      "Invalid temp_vector_1 GET" );
+
+    PDIAGN_TRUE_OR_THROW( temp_vector_2.size() != 0,
+      "Invalid temp_vector_2.size()" );
+
+    /* Raster type test */
+
+    TePDISharedPtr < TeRaster > rast1( new TeRaster( 0, 0, 0, TeDOUBLE ) );
+
+    tparam.SetParameter( "rast1", rast1 );
+
+    TePDISharedPtr < TeRaster > rast2( new TeRaster( 0, 0, 0, TeDOUBLE ) );
+
+    PDIAGN_TRUE_OR_THROW(
+      tparam.GetParameter( "rast1", rast2 ),
+      "Invalid rast1 GET" );
+
+    /* Copy operator test */
+
+    TePDIParameters tparam2;
+
+    tparam2 = tparam;
+
+    PDIAGN_TRUE_OR_THROW( tparam2.GetParameter( "param_name_1", temp_v1 ),
+      "Invalid param_name_1 GET" );
+
+    PDIAGN_TRUE_OR_THROW(
+      tparam2.GetParameter( "temp_vector_1", temp_vector_2 ),
+      "Invalid temp_vector_1 GET" );
+
+    PDIAGN_TRUE_OR_THROW(
+      tparam2.GetParameter( "rast1", rast2 ),
+      "Invalid rast1 GET" );
+  }
+  catch(...){
+    PDIAGN_LOGERR( "Test Failed.");
+    return EXIT_FAILURE;
+  }
+
+  PDIAGN_LOGMSG( "Test OK." );
+  return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/TePDISharedPtr/.cvsignore b/src/terralib/PDI/tests/source/TePDISharedPtr/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDISharedPtr/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr.pro b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr.pro
new file mode 100755
index 0000000..3d079de
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr.pro
@@ -0,0 +1,7 @@
+include( ../base/base.pro )
+
+SOURCES += \
+           TePDISharedPtr_test.cpp
+
+QMAKE_CLEAN += \
+  ../../bin/TePDISharedPtr
diff --git a/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr_test.cpp b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr_test.cpp
new file mode 100644
index 0000000..bc33663
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDISharedPtr/TePDISharedPtr_test.cpp
@@ -0,0 +1,65 @@
+
+#include <TePDIAgnostic.hpp>
+
+#include <TePDISharedPtr.cpp>
+
+#include <string>
+
+int main()
+{
+  PDIAGN_LOGMSG( "Test started." );
+
+  PDIAGN_DEBUG_MODE_CHECK;
+
+  try{
+    TePDISharedPtr< int > sptr1( new int );
+
+    *sptr1 = 12345;
+
+    TePDISharedPtr< int > sptr2;
+
+    sptr2 = sptr1;
+
+    *sptr2 = 54321;
+
+    PDIAGN_TRUE_OR_THROW( *sptr2 == 54321,
+      "Invalid pointer 2 reference" );
+
+    PDIAGN_TRUE_OR_THROW( *sptr1 == 54321,
+      "Invalid pointer 1 reference" );
+
+    sptr1.reset( new int );
+
+    *sptr1 = 6789;
+
+    PDIAGN_TRUE_OR_THROW( *sptr1 == 6789,
+      "Invalid pointer 1 reference" );
+
+    PDIAGN_TRUE_OR_THROW( *sptr2 == 54321,
+      "Invalid pointer 2 reference" );
+
+    TePDISharedPtr< int > sptr3( sptr2 );
+
+    PDIAGN_TRUE_OR_THROW( *sptr3 == 54321,
+      "Invalid pointer 2 reference" );
+
+    /* Static shared pointer test */
+
+    int temp_int = 54321;
+    int* temp_int_ptr = &temp_int;
+
+    if( true ) {
+      TePDISharedPtr< int > sptr4( temp_int_ptr, true );
+    }
+
+    PDIAGN_TRUE_OR_THROW( *temp_int_ptr == 54321,
+      "Invalid naked pointer reference" );
+  }
+  catch(...){
+    PDIAGN_LOGERR( "Test Failed.");
+    return EXIT_FAILURE;
+  }
+
+  PDIAGN_LOGMSG( "Test OK." );
+  return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/TePDIUtils/.cvsignore b/src/terralib/PDI/tests/source/TePDIUtils/.cvsignore
new file mode 100644
index 0000000..ac63e51
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIUtils/.cvsignore
@@ -0,0 +1,3 @@
+Makefile
+*.o
+*.obj
diff --git a/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils.pro b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils.pro
new file mode 100755
index 0000000..8e41e21
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils.pro
@@ -0,0 +1,10 @@
+include( ../base/base.pro )
+
+SOURCES += TePDIUtils_test.cpp
+
+QMAKE_CLEAN += \
+  ../../bin/TePDIUtils \
+  ../../bin/TeRaster2Geotiff_test.tif \
+  ../../bin/TeAllocRAMRaster_test.tif \
+  ../../bin/TeResetRaster_test.tif
+
diff --git a/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils_test.cpp b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils_test.cpp
new file mode 100644
index 0000000..56a421d
--- /dev/null
+++ b/src/terralib/PDI/tests/source/TePDIUtils/TePDIUtils_test.cpp
@@ -0,0 +1,119 @@
+#include <TePDIUtils.hpp>
+
+//#include <TeRaster.h>
+//#include <TeDataTypes.h>
+//#include <TeDecoderTIFF.h>
+#include <TeInitRasterDecoders.h>
+
+#include <TePDIAgnostic.hpp>
+
+#include <string>
+
+void TeGenerateHistogram_test()
+{
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+  TePDITypes::TePDIHistogramType out_hist;
+
+  PDIAGN_TRUE_OR_THROW(
+    TePDIUtils::TeGenerateHistogram(inRaster, 0, 0, out_hist, true ),
+    "Histogram generation error" );
+
+  PDIAGN_CHECK_EQUAL( out_hist.size(), 256,
+    "Invalid Generated histogram" );
+
+  int pixels = 0;
+
+  TePDITypes::TePDIHistogramType::iterator hist_it = out_hist.begin();
+  TePDITypes::TePDIHistogramType::iterator hist_it_end = out_hist.end();
+
+  while( hist_it != hist_it_end ) {
+    pixels += hist_it->second;
+
+    ++hist_it;
+  }
+
+  PDIAGN_CHECK_EQUAL( pixels, inRaster->params().nlines_ *
+    inRaster->params().ncols_, "Invalid Generated historgram" );
+
+}
+
+void TeRaster2Geotiff_test()
+{
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( inRaster,
+    "TeRaster2Geotiff_test.tif" ), "GeoTIF generation error" );
+}
+
+void TeAllocRAMRaster_test()
+{
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+  TePDITypes::TePDIRasterPtrType RAMRaster;
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeAllocRAMRaster( inRaster, RAMRaster ),
+    "RAM Raster Allocation error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeCopyRasterPixels( inRaster, RAMRaster ),
+    "Raster pixel copy error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( RAMRaster,
+    "TeAllocRAMRaster_test.tif" ), "GeoTIF generation error" );
+}
+
+void TeResetRaster_test()
+{
+  TePDITypes::TePDIRasterPtrType inRaster( new TeRaster(
+    std::string( "../resources/cbers_b2_crop.tif" ), 'r' ) );
+
+  PDIAGN_TRUE_OR_THROW( inRaster->init(), "Unable to init inRaster" );
+
+  TePDITypes::TePDIRasterPtrType outRaster(
+    new TeRaster( inRaster->params().ncols_, inRaster->params().nlines_,
+    inRaster->nBands(), TeUNSIGNEDCHAR ) );
+  PDIAGN_TRUE_OR_THROW( outRaster->init(), "Unable to init outRaster" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeResetRaster( outRaster,
+    inRaster->nBands(), inRaster->params().nlines_,
+    inRaster->params().ncols_ ), "Raster reset error" );
+
+  PDIAGN_TRUE_OR_THROW(
+    TePDIUtils::TeCopyRasterPixels( inRaster, outRaster ),
+    "Raster pixel copy error" );
+
+  PDIAGN_TRUE_OR_THROW( TePDIUtils::TeRaster2Geotiff( outRaster,
+    "TeResetRaster_test.tif" ), "GeoTIF generation error" );
+}
+
+int main()
+{
+  PDIAGN_LOGMSG( "Test started." );
+
+  PDIAGN_DEBUG_MODE_CHECK;
+
+  try{
+    TeInitRasterDecoders();
+
+    TeGenerateHistogram_test();
+    TeRaster2Geotiff_test();
+    TeAllocRAMRaster_test();
+    TeResetRaster_test();
+  }
+  catch(...){
+    PDIAGN_LOGERR( "Test Failed.");
+    return EXIT_FAILURE;
+  }
+
+  PDIAGN_LOGMSG( "Test OK." );
+  return EXIT_SUCCESS;
+}
diff --git a/src/terralib/PDI/tests/source/base/.cvsignore b/src/terralib/PDI/tests/source/base/.cvsignore
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/src/terralib/PDI/tests/source/base/.cvsignore
@@ -0,0 +1,2 @@
+
+
diff --git a/src/terralib/PDI/tests/source/base/base.pro b/src/terralib/PDI/tests/source/base/base.pro
new file mode 100755
index 0000000..8b1ca8e
--- /dev/null
+++ b/src/terralib/PDI/tests/source/base/base.pro
@@ -0,0 +1,27 @@
+
+INCLUDEPATH = ../../../source
+INCLUDEPATH += ../../../../kernel
+INCLUDEPATH += ../../../../../tiff
+
+CONFIG = warn_on debug link_prl
+
+LANGUAGE = C++
+
+DESTDIR = ../../bin
+
+win32 {
+  TEMPLATE = vcapp
+
+  LIBS = ../../../bin/static/terralibpdi.lib
+}
+
+unix {
+  TEMPLATE = app
+
+  LIBS = -L../../../bin/dynamic -lterralibpdi
+}
+
+
+
+
+
diff --git a/src/terralib/PDI/tests/source/source.pro b/src/terralib/PDI/tests/source/source.pro
new file mode 100755
index 0000000..70d5dd9
--- /dev/null
+++ b/src/terralib/PDI/tests/source/source.pro
@@ -0,0 +1,10 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+          TePDIParameters \
+          TePDIUtils \
+          TePDISharedPtr \
+          TePDIContrast
+
+
diff --git a/src/terralib/PDI/tests/tests.pro b/src/terralib/PDI/tests/tests.pro
new file mode 100755
index 0000000..0635acc
--- /dev/null
+++ b/src/terralib/PDI/tests/tests.pro
@@ -0,0 +1,7 @@
+
+TEMPLATE = subdirs
+
+SUBDIRS = \
+          source
+
+
diff --git a/src/terralib/application/TeApplicationUtils.cpp b/src/terralib/application/TeApplicationUtils.cpp
new file mode 100644
index 0000000..94c7e02
--- /dev/null
+++ b/src/terralib/application/TeApplicationUtils.cpp
@@ -0,0 +1,409 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeApplicationUtils.h"
+#include "TeSlice.h"
+#include "TeDatabase.h"
+#include "TeDatabaseUtils.h"
+#include "TeColorUtils.h"
+
+template<class iterator> extern void
+TeGroupByEqualStep(iterator, iterator, int , vector<TeSlice>& , int);
+
+extern void TeGroupByUniqueValue(vector<string>& vec, TeAttrDataType tipo, vector<TeSlice>& result, int precision);
+
+bool generateCountLegends(TeThemeApplication* theme, string table, string field)
+{
+	if(theme == 0)
+		return false;
+
+	theme->groupObjects(TeAll);
+	TeAttributeRep rep;
+	rep.name_ = table + "." + field;
+	rep.type_ = TeINT;
+	
+	TeGrouping* group = new TeGrouping();
+	group->groupAttribute_ = rep;
+	group->groupNormAttribute_ = "";
+	group->groupMode_ = TeUniqueValue;
+	group->groupPrecision_ = 0;
+	theme->grouping(group);
+	
+	string	scor = "Cy-G-Y-Or-R";
+	theme->groupColor(scor);
+	theme->countObj(true);
+	theme->mixColor(true);
+	theme->groupColorDir(TeColorAscSatEnd);
+	
+	string	fieldId = theme->collectionTable() + ".c_object_id";
+	TeLayer* layer = theme->layer();
+	TeDatabase* db = layer->database();
+    vector<TeSlice> result;
+	vector<string> valVec;
+	vector<string> idVec;
+
+	string sel = "SELECT " + fieldId + ", " + field + theme->sqlFrom() + " ORDER BY " + field;
+
+	TeDatabasePortal* portal = db->getPortal();
+	if(portal->query(sel) == false)
+	{
+		delete portal;
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		string objectId = portal->getData(0);
+		string val = portal->getData(1);
+		if (val.empty() == false)
+		{
+			valVec.push_back(val);
+			idVec.push_back(objectId);
+		}
+	}
+	delete portal;
+
+	if(valVec.size()==0)
+		return false;
+
+	TeGroupByUniqueValue(valVec, TeINT, result, 0);
+	theme->grouping()->groupNumSlices_ = result.size();
+
+	vector<string> colorRamps;
+	colorRamps.push_back("CYAN");
+	colorRamps.push_back("GREEN");
+	colorRamps.push_back("YELLOW");
+	colorRamps.push_back("ORANGE");
+	colorRamps.push_back("RED");
+	vector<TeColor> colorVec;
+	getColors(colorRamps,10, colorVec);
+
+	TeVisual visual;
+	if((layer->geomRep() & TePOLYGONS) || (layer->geomRep() & TeCELLS))
+		visual = theme->defaultLegend().visual(TePOLYGONS);
+	else if((layer->geomRep() & TeLINES))
+		visual = theme->defaultLegend().visual(TeLINES);
+	else if((layer->geomRep() & TePOINTS))
+		visual = theme->defaultLegend().visual(TePOINTS);
+
+	TeLegendEntryVector legVec;
+	unsigned int i, j = 0;
+	for(i = 0; i < result.size(); i++)
+	{
+		TeColor cor = colorVec[i];
+		visual.color(cor);
+
+		TeLegendEntry leg;
+		leg.from(result[i].from_);
+		leg.to(result[i].to_);
+		if((layer->geomRep() & TePOLYGONS) || (layer->geomRep() & TeCELLS))
+			leg.setVisual(visual, TePOLYGONS);
+		else if((layer->geomRep() & TeLINES))
+			leg.setVisual(visual, TeLINES);
+		else if((layer->geomRep() & TePOINTS))
+			leg.setVisual(visual, TePOINTS);
+
+		int count = 0;
+		while(j < valVec.size())
+		{
+			if(valVec[j] == leg.from())
+			{
+				count++;
+				j++;
+			}
+			else
+				break;
+		}
+		leg.count(count);
+		leg.group(i);
+		leg.theme(theme->id());
+		string label = leg.from();
+		leg.label(label);
+		legVec.push_back(leg);
+	}
+
+	colorRamps.clear();
+	colorVec.clear();
+
+	db->deleteLegend(theme->id());
+	map<int, vector<string> > legMap;
+	for(i=j=0; i<legVec.size(); i++)
+	{
+		theme->legend().push_back(legVec[i]);
+		if (db->insertLegend(&(theme->legend()[i])) == false)
+			return false;
+
+		vector<string> ids;
+		TeLegendEntry& leg = theme->legend()[i];
+		while(j < valVec.size())
+		{
+			if(valVec[j] == leg.from())
+			{
+				ids.push_back(idVec[j]);
+				j++;
+			}
+			else
+				break;
+		}
+		legMap[leg.id()] = ids;
+	}
+
+	map<int, vector<string> > :: iterator it = legMap.begin();
+	while(it != legMap.end())
+	{
+		vector<string>::iterator itB = it->second.begin();
+		vector<string>::iterator itE = it->second.end();
+		vector<string> svec = generateInClauses(itB,itE,db);				
+
+		for(i=0; i<svec.size(); i++)
+		{
+			string up = "UPDATE " + theme->collectionTable() + " SET c_legend_id = " + Te2String(it->first);
+			up += " WHERE c_object_id IN " + svec[i];
+
+			if(db->execute(up) == false)
+				return false;
+		}
+		it++;
+	}
+
+	if(theme->legend().size())
+		theme->visibleRep(theme->visibleRep() | 0x40000000);
+	else
+		theme->visibleRep(theme->visibleRep() & 0xbfffffff);
+
+	if((db->updateGrouping (theme->id(), theme->grouping())) == false)
+		return false;
+
+	return(updateThemeApplication(db, theme));
+}
+
+void changeObjectStatus(ObjectInfo& info, string& uniqueId, string mode, int pointed)
+{
+	if(uniqueId.empty())
+	{
+		if(mode == "pointing")
+			info.status_ ^= 0x1; // toggle least significant bit
+		else if(mode == "shiftAndPointing")
+		{
+			if(pointed == 1)
+				info.status_ |= 0x1; // set least significant bit
+			else
+				info.status_ &= 0x2; // reset least significant bit
+		}
+		return;
+	}
+
+	int& gs = info.uniqueMap_[uniqueId];
+	int	os;
+
+	if(mode == "pointing")
+	{
+		gs ^= 0x1; // toggle least significant bit
+
+		set<int> statusSet;
+		map<string, int>::iterator it = info.uniqueMap_.begin();
+		while(it != info.uniqueMap_.end())
+		{
+			statusSet.insert(it->second);
+			it++;
+		}
+		if(statusSet.find(3) != statusSet.end())
+			os = 3;
+		else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) != statusSet.end())
+			os = 3;
+		else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) == statusSet.end())
+			os = 2;
+		else if(statusSet.find(2) == statusSet.end() && statusSet.find(1) != statusSet.end())
+			os = 1;
+		else
+			os = 0;
+	}
+	else if(mode == "shiftAndPointing")
+	{
+		if(pointed == 1)
+			gs |= 0x1; // set least significant bit
+		else
+			gs &= 0x2; // reset least significant bit
+
+		set<int> statusSet;
+		map<string, int>::iterator it = info.uniqueMap_.begin();
+		while(it != info.uniqueMap_.end())
+		{
+			statusSet.insert(it->second);
+			it++;
+		}
+		if(statusSet.find(3) != statusSet.end())
+			os = 3;
+		else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) != statusSet.end())
+			os = 3;
+		else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) == statusSet.end())
+			os = 2;
+		else if(statusSet.find(2) == statusSet.end() && statusSet.find(1) != statusSet.end())
+			os = 1;
+		else
+			os = 0;
+	}
+
+	info.status_ = os;
+}
+
+bool saveObjectStatus(TeThemeApplication *theme, set<string>& objectSet, map<string, ObjectInfo>& objectMap)
+{
+	unsigned int i;
+    int os, gs;
+	string	q, oid, uid;
+	TeDatabase *db = theme->layer()->database();
+	map<int, vector<string> > sameObjectStMap;
+	map<int, vector<string> > sameGridStMap;
+
+	set<string>::iterator setIt = objectSet.begin();
+	while(setIt != objectSet.end())
+	{
+		oid = *setIt;
+		ObjectInfo& info = objectMap[oid];
+		os = info.status_;
+		sameObjectStMap[os].push_back(oid);
+
+		map<string, int>& gridMap = info.uniqueMap_;
+		map<string, int>::iterator gridIt = gridMap.begin();
+		while(gridIt != gridMap.end())
+		{
+			uid = gridIt->first;
+			gs = gridIt->second;
+			sameGridStMap[gs].push_back(uid);
+			gridIt++;
+		}
+		setIt++;
+	}
+
+	string qUpdate = "UPDATE " + theme->collectionTable();
+	map<int, vector<string> >::iterator it;
+	for (it = sameObjectStMap.begin(); it != sameObjectStMap.end(); ++it)
+	{
+		vector<string>::iterator itB = it->second.begin();
+		vector<string>::iterator itE = it->second.end();
+		vector<string> inClauseVector = generateInClauses(itB,itE,db);				
+		for (i = 0; i < inClauseVector.size(); ++i)
+		{
+			q = qUpdate + " SET c_object_status = " + Te2String(it->first);
+			q += " WHERE c_object_id IN " + inClauseVector[i];
+
+			if (db->execute(q) == false)
+				return false;
+		}
+	}
+
+
+	qUpdate = "UPDATE " + theme->collectionAuxTable();
+	for (it = sameGridStMap.begin(); it != sameGridStMap.end(); ++it)
+	{
+		vector<string>::iterator itB = it->second.begin();
+		vector<string>::iterator itE = it->second.end();
+		vector<string> inClauseVector = generateInClauses(itB,itE,db);				
+		for (i = 0; i < inClauseVector.size(); ++i)
+		{
+			q = qUpdate + " SET grid_status = " + Te2String(it->first);
+			q += " WHERE unique_id IN " + inClauseVector[i];
+
+			if (db->execute(q) == false)
+				return false;
+		}
+	}
+	return true;
+}
+
+string getStringFromStatistic(TeStatisticType sType)
+{
+	string ss;
+
+	if(sType == TeSUM)
+		ss = "SUM";
+	else if(sType == TeMAXVALUE)
+		ss = "MAXVALUE";
+	else if(sType == TeMINVALUE)
+		ss = "MINVALUE";
+	else if(sType == TeCOUNT)
+		ss = "COUNT";
+	else if(sType == TeVALIDCOUNT)
+		ss = "VALIDCOUNT";
+	else if(sType == TeSTANDARDDEVIATION)
+		ss = "STANDARDDEVIATION";
+	else if(sType == TeKERNEL)
+		ss = "KERNEL";
+	else if(sType == TeMEAN)
+		ss = "MEAN";
+	else if(sType == TeVARIANCE)
+		ss = "VARIANCE";
+	else if(sType == TeSKEWNESS)
+		ss = "SKEWNESS";
+	else if(sType == TeKURTOSIS)
+		ss = "KURTOSIS";
+	else if(sType == TeAMPLITUDE)
+		ss = "AMPLITUDE";
+	else if(sType == TeMEDIAN)
+		ss = "MEDIAN";
+	else if(sType == TeVARCOEFF)
+		ss = "VARCOEFF";
+	else if(sType == TeMODE)
+		ss = "MODE";
+
+	return ss;
+}
+
+TeStatisticType getStatisticFromString(const string& s)
+{
+	TeStatisticType sType;
+
+	if(s == "TeSUM")
+		sType = TeSUM;
+	else if(s == "TeMAXVALUE")
+		sType = TeMAXVALUE;
+	else if(s == "TeMINVALUE")
+		sType = TeMINVALUE;
+	else if(s == "TeCOUNT")
+		sType = TeCOUNT;
+	else if(s == "TeVALIDCOUNT")
+		sType = TeVALIDCOUNT;
+	else if(s == "TeSTANDARDDEVIATION")
+		sType = TeSTANDARDDEVIATION;
+	else if(s == "TeKERNEL")
+		sType = TeKERNEL;
+	else if(s == "TeMEAN")
+		sType = TeMEAN;
+	else if(s == "TeVARIANCE")
+		sType = TeVARIANCE;
+	else if(s == "TeSKEWNESS")
+		sType = TeSKEWNESS;
+	else if(s == "TeKURTOSIS")
+		sType = TeKURTOSIS;
+	else if(s == "TeAMPLITUDE")
+		sType = TeAMPLITUDE;
+	else if(s == "TeMEDIAN")
+		sType = TeMEDIAN;
+	else if(s == "TeVARCOEFF")
+		sType = TeVARCOEFF;
+	else if(s == "TeMODE")
+		sType = TeMODE;
+
+	return sType;
+}
+	
+	
diff --git a/src/terralib/application/TeApplicationUtils.h b/src/terralib/application/TeApplicationUtils.h
new file mode 100644
index 0000000..2df0412
--- /dev/null
+++ b/src/terralib/application/TeApplicationUtils.h
@@ -0,0 +1,102 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeApplicationUtils.h
+    This contains some utilitary functions to deal with TerraLib databases
+*/
+#ifndef  __TERRALIB_INTERNAL_APPLICATIONUTILS_H
+#define  __TERRALIB_INTERNAL_APPLICATIONUTILS_H
+
+#include "TeThemeApplication.h"
+#include "TeVisual.h"
+#include "TeDatabase.h"
+
+#include <string>
+#include <vector>
+#include <set>
+using namespace std;
+
+struct ObjectInfo
+{
+	int	status_;						// collection: c_object_status
+	map<string, int> uniqueMap_;	// uniqueId to grid status (collection: grid_status)
+};
+
+//! Breaks a collection of strings into a series of IN clauses to be used in query expressions
+/*
+	\params begin Iterator that p oints to the beginning of the collection
+	\params end Iterator that points to the end of the collection
+	\param db pointer to the database where the query expression will be applied
+	\param addPlicae flat to indicate that the character ' should enclose each string
+*/
+template <typename Iterator>
+vector<string>
+generateInClauses(Iterator& begin, Iterator& end, TeDatabase* db, bool addPlicae=true)
+{
+	int i, chunkSize = 200;
+	string inClause;
+	vector<string> inClauseVector;
+
+	Iterator temp = begin;
+	i = 0;
+	while (temp != end)
+	{
+		if (i%chunkSize == 0)
+		{
+			if (!inClause.empty())
+			{
+				inClause[inClause.size() - 1] = ')';
+				inClauseVector.push_back(inClause);
+				inClause.clear();
+			}
+			inClause = "(";
+		}
+
+		if (addPlicae)
+			inClause += "'" + db->escapeSequence(*temp) + "',";
+		else
+			inClause += db->escapeSequence(*temp) + ",";
+		i++;
+		++temp;
+	}
+	if (!inClause.empty())
+	{
+		inClause[inClause.size() - 1] = ')';
+		inClauseVector.push_back(inClause);
+	}
+	return inClauseVector;
+}
+
+//! generate Count legends 
+bool generateCountLegends(TeThemeApplication* theme, string table, string field);
+
+void changeObjectStatus(ObjectInfo& info, string& uniqueId, string mode, int pointed = 1);
+
+bool saveObjectStatus(TeThemeApplication *theme, set<string>& objectSet, map<string, ObjectInfo>& objectMap);
+
+string getStringFromStatistic (TeStatisticType st);
+
+TeStatisticType getStatisticFromString(const string& s);
+
+#endif
+
+
diff --git a/src/terralib/application/TeColorUtils.cpp b/src/terralib/application/TeColorUtils.cpp
new file mode 100644
index 0000000..e688c14
--- /dev/null
+++ b/src/terralib/application/TeColorUtils.cpp
@@ -0,0 +1,198 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include "TeColorUtils.h"
+
+bool getColors(TeDatabase* db, vector<string>& ramps, int nc, bool asc, vector<TeColor> &colors)
+{
+	if (!db)
+		return false;
+
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+		return false;
+
+	if (ramps.empty())
+		ramps.push_back("RED");
+
+	vector<TeColor> allColors;
+
+	unsigned int i;
+	for (i=0; i<ramps.size(); i++)
+	{
+		string	query = "SELECT red, green, blue FROM te_color_scheme";
+		if (asc)
+			query = query + " WHERE ramp_name = '" + ramps[i] + "' ORDER BY color_order ASC";
+		else
+			query = query + " WHERE ramp_name = '" + ramps[i] + "' ORDER BY color_order DESC";
+	
+		TeColor color;
+		if (portal->query(query))
+		{
+			while(portal->fetchRow())
+			{
+				color.name_ = ramps[i];
+				color.red_ = portal->getInt(0);
+				color.green_ = portal->getInt(1);
+				color.blue_ = portal->getInt(2);
+				allColors.push_back(color);
+			}
+		}
+		portal->freeResult();
+	}
+	delete portal;
+
+	double step = 0.;
+	if (nc > 1)
+		step = (double)(allColors.size()) / (double)(nc-1);
+	for (int j=0; j<nc; j++)
+	{
+		int ind = (int)(step * (double)j + .5);
+		if(ind > (int)(allColors.size() - 1))
+			ind = allColors.size() - 1;
+		colors.push_back(allColors[ind]);
+	}
+	allColors.clear();
+	return true;
+}
+
+bool getColors(vector<string>& ramps, int nc, vector<TeColor> &colors)
+{
+	if (ramps.empty())
+		ramps.push_back("RED");
+
+	TeColor	RGB;
+	map<string, TeColor> mapcor;
+
+	RGB.name_ = "RED";
+	RGB.red_ = 240;
+	RGB.green_ = 0;
+	RGB.blue_ = 0;
+	mapcor["RED"] = RGB;
+
+	RGB.name_ = "GREEN";
+	RGB.red_ = 0;
+	RGB.green_ = 240;
+	RGB.blue_ = 0;
+	mapcor["GREEN"] = RGB;
+
+	RGB.name_ = "BLUE";
+	RGB.red_ = 0;
+	RGB.green_ = 0;
+	RGB.blue_ = 240;
+	mapcor["BLUE"] = RGB;
+
+	RGB.name_ = "YELLOW";
+	RGB.red_ = 255;
+	RGB.green_ = 255;
+	RGB.blue_ = 100;
+	mapcor["YELLOW"] = RGB;
+
+	RGB.name_ = "CYAN";
+	RGB.red_ = 100;
+	RGB.green_ = 255;
+	RGB.blue_ = 255;
+	mapcor["CYAN"] = RGB;
+
+	RGB.name_ = "MAGENTA";
+	RGB.red_ = 255;
+	RGB.green_ = 100;
+	RGB.blue_ = 255;
+	mapcor["MAGENTA"] = RGB;
+
+	RGB.name_ = "ORANGE";
+	RGB.red_ = 255;
+	RGB.green_ = 140;
+	RGB.blue_ = 0;
+	mapcor["ORANGE"] = RGB;
+
+	RGB.name_ = "GRAY";
+	RGB.red_ = 240;
+	RGB.green_ = 240;
+	RGB.blue_ = 240;
+	mapcor["GRAY"] = RGB;
+
+	RGB.name_ = "BLACK";
+	RGB.red_ = 0;
+	RGB.green_ = 0;
+	RGB.blue_ = 0;
+	mapcor["BLACK"] = RGB;
+
+	int	ii, jj;
+	int n = 200;
+	
+	TeColor cfrom = mapcor[ramps[0]];
+	TeColor	cto, cor;
+
+	vector<TeColor> allColors;
+	if (ramps.size() == 1)
+	{
+		cto.red_ = cfrom.red_ / 5;
+		cto.green_ = cfrom.green_ / 5;
+		cto.blue_ = cfrom.blue_ / 5;
+		double dr = (double)(cto.red_ - cfrom.red_) / (double)n;
+		double dg = (double)(cto.green_ - cfrom.green_) / (double)n;
+		double db = (double)(cto.blue_ - cfrom.blue_) / (double)n;
+
+		for(jj=0; jj<n; jj++)
+		{
+			cor.red_ = cfrom.red_ + (int)(dr * (double)jj);
+			cor.green_ = cfrom.green_ + (int)(dg * (double)jj);
+			cor.blue_ = cfrom.blue_ + (int)(db * (double)jj);
+			allColors.push_back(cor);
+		}
+	}
+	else
+	{
+		ii = 1;
+		while(ii < (int)ramps.size())
+		{
+			cto = mapcor[ramps[ii]];
+
+			double dr = (double)(cto.red_ - cfrom.red_) / (double)n;
+			double dg = (double)(cto.green_ - cfrom.green_) / (double)n;
+			double db = (double)(cto.blue_ - cfrom.blue_) / (double)n;
+
+			for(jj=0; jj<n; jj++)
+			{
+				cor.red_ = cfrom.red_ + (int)(dr * (double)jj);
+				cor.green_ = cfrom.green_ + (int)(dg * (double)jj);
+				cor.blue_ = cfrom.blue_ + (int)(db * (double)jj);
+				allColors.push_back(cor);
+			}
+			cfrom = cto;
+			ii++;
+		}
+	}
+	double step = 0.;
+	if (nc > 1)
+		step = (double)(allColors.size()) / (double)(nc-1);
+	for (int i=0; i<nc; i++)
+	{
+		int ind = (int)(step * (double)i + .5);
+		if (ind > (int)(allColors.size() - 1))
+			ind = allColors.size() - 1;
+		colors.push_back(allColors[ind]);
+	}
+	allColors.clear();
+	return true;
+}
diff --git a/src/terralib/application/TeColorUtils.h b/src/terralib/application/TeColorUtils.h
new file mode 100644
index 0000000..f52483d
--- /dev/null
+++ b/src/terralib/application/TeColorUtils.h
@@ -0,0 +1,58 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#ifndef  __TERRALIB_INTERNAL_COLORUTILS_H
+#define  __TERRALIB_INTERNAL_COLORUTILS_H
+
+#include "TeVisual.h"
+#include "TeDatabase.h"
+
+#include <vector>
+#include <string>
+
+//! Generates a graduated color scale following a set of color ramps, based on a color scheme table stored in a TerraLib database
+/*!
+	\param db pointer do a TerraLib database
+	\param ramps vector with the sequence color ramps used to build the scale 
+	\param nc desired number of colors on the scale
+	\param asc flag to indicate that within each ramp goes from light to dark colors
+	\param colors resulting color scale
+	\returns true if color scale was successfully generated and false otherwise
+*/
+bool getColors(TeDatabase* db, vector<string>& ramps, int nc, bool asc, vector<TeColor> &colors);
+
+
+//! Generates a graduated color scale following a set of color ramps
+/*!
+	\param ramps vector with the sequence color ramps used to build the scale 
+	\param nc desired number of colors on the scale
+	\param colors resulting color scale
+	\returns true if color scale was successfully generated and false otherwise
+	\note the available ramps are "RED", "GREEN", "BLUE", "YELLOW", "CYAN", "MAGENTA", "GRAY" and  "BLACK"
+*/
+bool getColors(vector<string>& ramps, int nc, vector<TeColor> &colors);
+
+#endif
+
+
+
+
diff --git a/src/terralib/application/TeDatabaseUtils.cpp b/src/terralib/application/TeDatabaseUtils.cpp
new file mode 100644
index 0000000..17ddd8f
--- /dev/null
+++ b/src/terralib/application/TeDatabaseUtils.cpp
@@ -0,0 +1,3269 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeDatabaseUtils.h"
+#include "TeApplicationUtils.h"
+#include "TeDatabase.h"
+#include "TeTable.h"
+#include "TeKernelParams.h"
+#include "TeLayerFunctions.h"
+#include "TeErrorLog.h"
+#include "TeStatistics.h"
+
+#include <algorithm>
+
+using std::string;
+
+bool createColorSchemeTable(TeDatabase* db, const string& tname)
+{
+	string table;
+
+	if (!db)
+		return false;
+	if (tname.empty())
+		table = "te_color_scheme";
+	else
+		table = tname;
+
+	TeAttributeList attList;
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeSTRING;
+	at1.rep_.numChar_ = 50;
+	at1.rep_.name_ = "ramp_name";
+	at1.rep_.isPrimaryKey_ = true;
+	attList.push_back(at1);	
+	
+	TeAttribute at2;
+	at2.rep_.type_ = TeINT;
+	at2.rep_.name_ = "color_order";
+	at2.rep_.isPrimaryKey_ = true;
+	attList.push_back(at2);	
+	
+	TeAttribute at3;
+	at3.rep_.type_ = TeINT;
+	at3.rep_.name_ = "red";
+	attList.push_back(at3);	
+	
+	
+	TeAttribute at4;
+	at4.rep_.type_ = TeINT;
+	at4.rep_.name_ = "green";
+	attList.push_back(at4);	
+	
+	TeAttribute at5;
+	at5.rep_.type_ = TeINT;
+	at5.rep_.name_ = "blue";
+	attList.push_back(at5);	
+	
+	bool status = db->createTable(table,attList);
+	attList.clear();
+	return status;
+}
+
+bool createChartParamsTable(TeDatabase* db, bool integrity)
+{
+	if (!db)
+		return false;
+	
+	string table = "te_chart_params";
+	
+	TeAttributeList attList;
+
+	TeAttribute at5;
+	at5.rep_.type_ = TeINT;
+	at5.rep_.name_ = "theme_id";
+	at5.rep_.isPrimaryKey_ = true;
+	attList.push_back(at5);	
+	
+	TeAttribute at1;
+	at1.rep_.type_ = TeSTRING;
+	at1.rep_.numChar_ = 50;
+	at1.rep_.name_ = "attr_name";
+	at1.rep_.isPrimaryKey_ = true;
+	attList.push_back(at1);	
+	
+	TeAttribute at2;
+	at2.rep_.type_ = TeINT;
+	at2.rep_.name_ = "red";
+	attList.push_back(at2);	
+	
+	TeAttribute at3;
+	at3.rep_.type_ = TeINT;
+	at3.rep_.name_ = "blue";
+	attList.push_back(at3);	
+	
+	TeAttribute at4;
+	at4.rep_.type_ = TeINT;
+	at4.rep_.name_ = "green";
+	attList.push_back(at4);	
+	
+	bool status = db->createTable(table,attList);
+	attList.clear();
+
+	if(status && integrity)
+	{
+		if(db->tableExist ("te_theme_application"))
+		{
+			if (!db->createRelation("fk_chartpar_theme_id", "te_chart_params", "theme_id", "te_theme_application", "theme_id", true))
+				return false;
+		}
+		else
+			return false;
+	}
+	return status;
+}
+
+
+bool createThemeApplicationTable(TeDatabase* db, bool integrity)
+{
+	if (!db)
+		return false;
+	
+	string table = "te_theme_application";
+	
+	TeAttributeList attList;
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeINT;
+	at1.rep_.name_ = "theme_id";
+	at1.rep_.isPrimaryKey_ = true;
+	attList.push_back(at1);
+	
+	TeAttribute at2;
+	at2.rep_.type_ = TeINT;
+	at2.rep_.name_ = "visible_out_coll";
+	attList.push_back(at2);	
+	
+	TeAttribute at3;
+	at3.rep_.type_ = TeINT;
+	at3.rep_.name_ = "visible_without_conn";
+	attList.push_back(at3);	
+
+	TeAttribute at31;
+	at31.rep_.type_ = TeSTRING;
+	at31.rep_.numChar_ = 255;
+	at31.rep_.name_ = "refine_attribute_where";
+	attList.push_back(at31);	
+
+	TeAttribute at32;
+	at32.rep_.type_ = TeSTRING;
+	at32.rep_.numChar_ = 255;
+	at32.rep_.name_ = "refine_spatial_where";
+	attList.push_back(at32);	
+
+	TeAttribute at33;
+	at33.rep_.type_ = TeSTRING;
+	at33.rep_.numChar_ = 255;
+	at33.rep_.name_ = "refine_temporal_where";
+	attList.push_back(at33);	
+
+	TeAttribute at4;
+	at4.rep_.type_ = TeSTRING;
+	at4.rep_.numChar_ = 50;
+	at4.rep_.name_ = "grouping_color";
+	attList.push_back(at4);	
+
+	TeAttribute at5;
+	at5.rep_.type_ = TeINT;
+	at5.rep_.name_ = "grouping_color_direction";
+	attList.push_back(at5);	
+
+	TeAttribute at6;
+	at6.rep_.type_ = TeINT;
+	at6.rep_.name_ = "grouping_objects";
+	attList.push_back(at6);	
+
+	TeAttribute at7;
+	at7.rep_.type_ = TeREAL;
+	at7.rep_.name_ = "pie_diameter";
+	attList.push_back(at7);	
+
+	TeAttribute at8;
+	at8.rep_.type_ = TeREAL;
+	at8.rep_.name_ = "pie_max_diameter";
+	attList.push_back(at8);	
+
+	TeAttribute at9;
+	at9.rep_.type_ = TeREAL;
+	at9.rep_.name_ = "pie_min_diameter";
+	attList.push_back(at9);	
+
+	TeAttribute at10;
+	at10.rep_.type_ = TeSTRING;
+	at10.rep_.numChar_ = 255;
+	at10.rep_.name_ = "pie_dimension_attr";
+	attList.push_back(at10);	
+
+	TeAttribute at11;
+	at11.rep_.type_ = TeREAL;
+	at11.rep_.name_ = "bar_max_height";
+	attList.push_back(at11);	
+
+	TeAttribute at12;
+	at12.rep_.type_ = TeREAL;
+	at12.rep_.name_ = "bar_min_height";
+	attList.push_back(at12);	
+
+	TeAttribute at13;
+	at13.rep_.type_ = TeREAL;
+	at13.rep_.name_ = "bar_width";
+	attList.push_back(at13);	
+
+	TeAttribute at14;
+	at14.rep_.type_ = TeREAL;
+	at14.rep_.name_ = "chart_max_value";
+	attList.push_back(at14);	
+
+	TeAttribute at15;
+	at15.rep_.type_ = TeREAL;
+	at15.rep_.name_ = "chart_min_value";
+	attList.push_back(at15);	
+
+	TeAttribute at16;
+	at16.rep_.type_ = TeINT;
+	at16.rep_.name_ = "chart_type";
+	attList.push_back(at16);	
+
+	TeAttribute at17;
+	at17.rep_.type_ = TeINT;
+	at17.rep_.name_ = "chart_objects";
+	attList.push_back(at17);
+	 
+	TeAttribute at18;
+	at18.rep_.type_ = TeINT;
+	at18.rep_.name_ = "keep_dimension";
+	attList.push_back(at18);
+
+	TeAttribute at19;
+	at19.rep_.type_ = TeINT;
+	at19.rep_.name_ = "show_canvas_leg";
+	attList.push_back(at19);
+
+	TeAttribute at20;
+	at20.rep_.type_ = TeREAL;
+	at20.rep_.name_ = "canvas_leg_x";
+	attList.push_back(at20);
+
+	TeAttribute at21;
+	at21.rep_.type_ = TeREAL;
+	at21.rep_.name_ = "canvas_leg_y";
+	attList.push_back(at21);
+
+	TeAttribute at22;
+	at22.rep_.type_ = TeINT;
+	at22.rep_.name_ = "mix_color";
+	attList.push_back(at22);
+
+	TeAttribute at23;
+	at23.rep_.type_ = TeINT;
+	at23.rep_.name_ = "count_obj";
+	attList.push_back(at23);
+
+	TeAttribute at24;
+	at24.rep_.type_ = TeSTRING;
+	at24.rep_.name_ = "text_table";
+	at24.rep_.numChar_ = 50;
+	attList.push_back(at24);
+	
+	TeAttribute at26;
+	at26.rep_.type_ = TeSTRING;
+	at26.rep_.name_ = "chart_function";
+	at26.rep_.numChar_ = 10;
+	attList.push_back(at26);
+	
+	bool status = db->createTable(table,attList);
+	attList.clear();
+	
+	if(status && integrity)
+	{
+		if (!db->createRelation("fk_themeAppl_theme_id", "te_theme_application", "theme_id", "te_theme", "theme_id", true))
+			return false;
+	}
+	return status;
+}
+
+
+bool populateThemeApplicationTable(TeDatabase* db)
+{
+	string sel, ins; 
+	
+	if(db->dbmsName()=="MySQL") //MySQL doesn�t support NOT EXISTS  
+	{
+		sel = " SELECT theme_id FROM te_theme ";
+	}
+	else
+	{
+		ins  = " INSERT INTO te_theme_application (theme_id) ";
+		ins += " SELECT t.theme_id FROM te_theme t ";
+		ins += " WHERE NOT EXISTS ";
+		ins += " ( SELECT ta.theme_id FROM ";
+		ins += " te_theme_application ta ";
+		ins += " WHERE ta.theme_id = t.theme_id ) ";
+
+		return (db->execute(ins));
+	}
+	
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	if(!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete portal;
+		return true;
+	}
+
+	do 
+	{
+		ins  = " INSERT INTO te_theme_application (theme_id) VALUES (";
+		ins += string(portal->getData(0));
+		ins += " )";
+		
+		db->execute(ins);
+
+	} while(portal->fetchRow());
+
+	delete portal;
+	return true;
+}
+
+
+bool createMediaTable(TeDatabase* db, const string& tname)
+{
+	if (!db)
+		return false;
+	
+	TeAttributeList attList;
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeSTRING;
+	at1.rep_.numChar_ = 255;
+	at1.rep_.name_ = "media_name";
+	at1.rep_.isPrimaryKey_ = true;
+	attList.push_back(at1);	
+
+	TeAttribute at2;
+	at2.rep_.type_ = TeSTRING;
+	at2.rep_.numChar_ = 50;
+	at2.rep_.name_ = "media_type";
+	attList.push_back(at2);	
+
+	TeAttribute at3;
+	at3.rep_.type_ = TeSTRING;
+	at3.rep_.numChar_ = 255;
+	at3.rep_.name_ = "description";
+	attList.push_back(at3);
+	
+	TeAttribute at4;
+	at4.rep_.type_ = TeBLOB;
+	at4.rep_.name_ = "media_blob";
+	attList.push_back(at4);	
+	
+	TeAttribute at5;
+	at5.rep_.type_ = TeSTRING;
+	at5.rep_.numChar_ = 255;
+	at5.rep_.name_ = "media_path";
+	attList.push_back(at5);
+	
+	vector<string> pkeys;
+	pkeys.push_back("media_name");
+	
+	bool status = db->createTable(tname,attList);
+	attList.clear();
+	return status;
+}
+
+
+bool createLayerMediaTable(TeDatabase* db, int layerId, const string& tname)
+{
+	if (!db)
+		return false;
+	
+	TeAttributeList attList;
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeSTRING;
+	at1.rep_.numChar_ = 50;
+	at1.rep_.name_ = "object_id";
+	at1.rep_.isPrimaryKey_ = true;
+	attList.push_back(at1);	
+
+	TeAttribute at3;
+	at3.rep_.type_ = TeSTRING;
+	at3.rep_.numChar_ = 255;
+	at3.rep_.name_ = "media_name";
+	at3.rep_.isPrimaryKey_ = true;
+	attList.push_back(at3);
+	
+	TeAttribute at2;
+	at2.rep_.type_ = TeSTRING;
+	at2.rep_.numChar_ = 50;
+	at2.rep_.name_ = "media_table";
+	at2.rep_.isPrimaryKey_ = true;
+	attList.push_back(at2);	
+
+	TeAttribute at4;
+	at4.rep_.type_ = TeINT;
+	at4.rep_.name_ = "show_default";
+	attList.push_back(at4);	
+	
+	if(!db->createTable(tname,attList))
+	{
+		attList.clear();
+		return false;
+	}
+
+	//insert in te_layer_table
+	TeTable table(tname, attList,"object_id", "object_id", TeAttrMedia);
+	
+	bool status = db->insertTableInfo(layerId, table); 
+	db->layerMap()[layerId]->addAttributeTable (table);
+		
+	attList.clear();
+	return status;
+}
+
+bool createKernelMetadataTable(TeDatabase* db)
+{
+	if (!db)
+		return false;
+	
+	TeAttributeList attList;
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeINT;
+	at1.rep_.name_ = "kernel_id";
+	at1.rep_.isPrimaryKey_ = true;
+	at1.rep_.isAutoNumber_ = true;
+	attList.push_back(at1);	
+
+	TeAttribute at2;
+	at2.rep_.type_ = TeINT;
+	at2.rep_.name_ = "event_theme_id_1";
+	attList.push_back(at2);	
+	
+	TeAttribute at3;
+	at3.rep_.type_ = TeSTRING;
+	at3.rep_.numChar_ = 255;
+	at3.rep_.name_ = "intensity_attr_name_1";
+	attList.push_back(at3);
+	
+	TeAttribute at4;
+	at4.rep_.type_ = TeSTRING;
+	at4.rep_.numChar_ = 255;
+	at4.rep_.name_ = "intensity_attr_table_1";
+	attList.push_back(at4);
+
+	TeAttribute at5;
+	at5.rep_.type_ = TeINT;
+	at5.rep_.name_ = "kernel_function_1";
+	attList.push_back(at5);	
+
+	TeAttribute at6;
+	at6.rep_.type_ = TeINT;
+	at6.rep_.name_ = "compute_type_1";
+	attList.push_back(at6);	
+
+	TeAttribute at7;
+	at7.rep_.type_ = TeREAL;
+	at7.rep_.name_ = "radius_value_1";
+	attList.push_back(at7);	
+
+	TeAttribute at8;
+	at8.rep_.type_ = TeINT;
+	at8.rep_.name_ = "combination_type";
+	attList.push_back(at8);	
+
+	TeAttribute at9;
+	at9.rep_.type_ = TeINT;
+	at9.rep_.name_ = "event_theme_id_2";
+	attList.push_back(at9);	
+	
+	TeAttribute at10;
+	at10.rep_.type_ = TeSTRING;
+	at10.rep_.numChar_ = 255;
+	at10.rep_.name_ = "intensity_attr_name_2";
+	attList.push_back(at10);
+	
+	TeAttribute at11;
+	at11.rep_.type_ = TeSTRING;
+	at11.rep_.numChar_ = 255;
+	at11.rep_.name_ = "intensity_attr_table_2";
+	attList.push_back(at11);
+
+	TeAttribute at12;
+	at12.rep_.type_ = TeINT;
+	at12.rep_.name_ = "kernel_function_2";
+	attList.push_back(at12);	
+
+	TeAttribute at13;
+	at13.rep_.type_ = TeINT;
+	at13.rep_.name_ = "compute_type_2";
+	attList.push_back(at13);	
+
+	TeAttribute at14;
+	at14.rep_.type_ = TeREAL;
+	at14.rep_.name_ = "radius_value_2";
+	attList.push_back(at14);
+	
+	TeAttribute at15;
+	at15.rep_.type_ = TeINT;
+	at15.rep_.name_ = "support_theme_id";
+	attList.push_back(at15);
+
+	TeAttribute at17;
+	at17.rep_.type_ = TeSTRING;
+	at17.rep_.numChar_ = 255;
+	at17.rep_.name_ = "support_theme_table";
+	attList.push_back(at17);
+
+	TeAttribute at18;
+	at18.rep_.type_ = TeSTRING;
+	at18.rep_.numChar_ = 255;
+	at18.rep_.name_ = "support_theme_attr";
+	attList.push_back(at18);
+
+	TeAttribute at19;
+	at19.rep_.type_ = TeINT;
+	at19.rep_.name_ = "generated_layer_id";
+	attList.push_back(at19);
+
+	if(!db->createTable("te_kernel_metadata",attList))
+	{
+		attList.clear();
+		return false;
+	}
+
+	db->createIndex("te_kernel_metadata", "kernel_meta_ind1", "support_theme_id, support_theme_table, support_theme_attr");
+	db->createIndex("te_kernel_metadata", "kernel_meta_ind2", "generated_layer_id");
+
+	return true;
+}
+
+
+bool insertMedia(TeDatabase* bd, const string& tableName, string fileName, const string& description, const string& type, bool blob)
+{
+	string ins;
+	if(blob)
+	{
+		 if(bd->dbmsName()!="OracleSpatial")
+		 {
+			ins = "  INSERT INTO "+ tableName +" (media_name, media_type, description) ";
+			ins += " VALUES (";
+			ins += "'"+ fileName + "'";
+			ins += ", '"+ type +"'";
+			ins += ", '"+ description +"'";
+			ins += ")";
+		 }
+		 else
+		 {
+			ins = "  INSERT INTO "+ tableName +" (media_name, media_type, description, media_blob) ";
+			ins += " VALUES (";
+			ins += "'"+ fileName + "'";
+			ins += ", '"+ type +"'";
+			ins += ", '"+ description +"'";
+			ins += ", EMPTY_BLOB()";
+			ins += " )";
+		 }
+	}
+	else
+	{
+		 ins = "  INSERT INTO "+ tableName +" (media_name, media_type, description, media_path) ";
+		 ins += " VALUES (";
+		 ins += "'"+ fileName + "'";
+		 ins += ", '"+ type +"'";
+		 ins += ", '"+ description +"'";
+		 ins += ", '"+ fileName +"'";
+		 ins += ")";
+	}
+
+	if(!bd->execute (ins))
+		return false;
+
+	//insert blob
+	TeAttributeRep rep;
+	rep.name_ = "media_name";
+	rep.type_ = TeSTRING;
+
+	if(blob)
+	{
+		if(!bd->insertBlob (tableName, "media_blob", rep, fileName, fileName))
+			return false;
+	}
+
+	return true;
+}
+
+bool insertMediaObjLayer (TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable)
+{
+	string table = layer->mediaTable();
+	int show = 0;
+
+	string ins = "  INSERT INTO "+ table +" (object_id, media_name, media_table, show_default) ";
+	ins += " VALUES (";
+	ins += "'"+  objectId + "'";
+	ins += ", '"+ mediaName +"'";
+	ins += ", '"+ mediaTable +"'";
+	ins += ", "+ Te2String(show);
+	ins += ")";
+
+	if(!db->execute (ins))
+		return false;
+
+	return true;
+}
+
+bool insertKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar)
+{
+	string ins = " INSERT INTO te_kernel_metadata (event_theme_id_1, intensity_attr_name_1, ";
+	ins += " intensity_attr_table_1, kernel_function_1, compute_type_1, radius_value_1, ";
+	ins += " combination_type, event_theme_id_2, intensity_attr_name_2, intensity_attr_table_2, ";
+	ins += " kernel_function_2, compute_type_2, radius_value_2, support_theme_id,  ";
+	ins += " support_theme_table, support_theme_attr, generated_layer_id)";
+	ins += " VALUES ( ";
+	ins += Te2String(kernelPar.eventThemeId1_) + ",";
+	ins += "'"+ kernelPar.intensityAttrName1_ + "',";
+	ins += "'"+ kernelPar.intensityAttrTable1_ + "',";
+	ins += Te2String((int)kernelPar.kernelFunction1_) + ",";
+	ins += Te2String((int)kernelPar.computeType1_) + ",";
+	ins += Te2String(kernelPar.radiusValue1_) + ",";
+	ins += Te2String((int)kernelPar.combinationType_) + ",";
+	ins += Te2String(kernelPar.eventThemeId2_) + ",";
+	ins += "'"+ kernelPar.intensityAttrName2_ + "',";
+	ins += "'"+ kernelPar.intensityAttrTable2_ + "',";
+	ins += Te2String((int)kernelPar.kernelFunction2_) + ",";
+	ins += Te2String((int)kernelPar.computeType2_) + ",";
+	ins += Te2String(kernelPar.radiusValue2_) + ",";
+	ins += Te2String(kernelPar.supportThemeId_)+ ",";
+	ins += "'"+ kernelPar.supportThemeTable_+ "',";
+	ins += "'"+ kernelPar.supportThemeAttr_+ "',";
+	ins += Te2String(kernelPar.generatedLayerId_);
+	ins += ")";
+
+	if(!db->execute (ins))
+		return false;
+
+	return true;
+}
+
+
+bool updateKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar)
+{
+  string del = "DELETE FROM te_kernel_metadata WHERE support_theme_id = ";
+  del += Te2String(kernelPar.supportThemeId_);
+
+  if (!db->execute(del)) 
+  {
+    return false;
+  }
+
+  return insertKernelMetadata(db,kernelPar);  
+}
+
+bool setDefaultMedia(TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable)
+{
+	string table = layer->mediaTable();
+	
+	string up = "UPDATE " + table + " SET show_default = 0 WHERE ";
+	up += "object_id = '" + objectId + "'";
+	if(!db->execute(up))
+		return false;
+	
+	up = "UPDATE "+ table +" SET ";
+	up += " show_default = 1 ";
+	up += "	WHERE 	object_id = '"+ objectId +"'";
+	up += " AND		media_name = '"+ mediaName +"'";
+	up += " AND		media_table = '"+ mediaTable +"'";
+
+	if(!db->execute (up))
+		return false;
+
+	return true;
+}
+
+
+bool updateMediaDescription(TeDatabase* db, const string& mediaName, const string& mediaTable, const string& desc)
+{
+	string up = "UPDATE " + mediaTable + " SET description = '" + desc.c_str() + "'";
+	up += " WHERE media_name = '" + mediaName + "'";
+	if(!db->execute(up))
+		return false;
+	return true;
+}
+
+
+bool populateColorSchemeTable(TeDatabase* db, const string& tname)
+{
+	string table;
+
+	if (!db)
+		return false;
+	if (tname.empty())
+		table = "te_color_scheme";
+	else
+		table = tname;
+	if (!db->tableExist(table))
+		createColorSchemeTable(db,table);
+	
+	string ins = "INSERT INTO " + table + " (ramp_name, color_order, red, green, blue)";
+	string insert;
+	insert = ins + " VALUES ('RED', 1, 255, 225, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 2, 255, 195, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 3, 255, 165, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 4, 255, 135, 135)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 5, 255, 112, 112)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 6, 255, 66, 66)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 7, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 8, 225, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 9, 200, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 10, 175, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 11, 150, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 12, 125, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED', 13, 100, 0, 0)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('GREEN', 1, 231, 255, 231)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 2, 206, 255, 206)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 3, 176, 255, 176)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 4, 136, 255, 135)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 5, 92, 255, 91)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 6, 47, 255, 46)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 7, 0, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 8, 3, 225, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 9, 2, 195, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 10, 2, 170, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 11, 2, 140, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 12, 1, 115, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN', 13, 1, 85, 0)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('BLUE', 1, 225, 226, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 2, 195, 196, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 3, 165, 167, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 4, 135, 137, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 5, 112, 114, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 6, 76, 79, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 7, 41, 44, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 8, 0, 0, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 9, 1, 4, 239)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 10, 1, 4, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 11, 1, 4, 185)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 12, 1, 3, 160)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE', 13, 1, 3, 135)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('CYAN', 1, 225, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 2, 195, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 3, 165, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 4, 135, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 5, 106, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 6, 76, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 7, 41, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 8, 0, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 9, 1, 235, 235)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 10, 1, 215, 215)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 11, 1, 195, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 12, 1, 175, 175)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN', 13, 1, 155, 155)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('ORANGE', 1, 255, 238, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 2, 255, 222, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 3, 255, 205, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 4, 255, 189, 135)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 5, 255, 172, 106)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 6, 255, 156, 76)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 7, 255, 136, 41)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 8, 255, 114, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 9, 239, 105, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 10, 210, 94, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 11, 185, 83, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 12, 160, 72, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ORANGE', 13, 135, 60, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('YELLOW', 1, 255, 250, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 2, 255, 245, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 3, 255, 241, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 4, 255, 236, 135)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 5, 255, 232, 106)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 6, 255, 227, 76)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 7, 255, 222, 41)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 8, 255, 215, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 9, 235, 198, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 10, 210, 177, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 11, 185, 156, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 12, 160, 135, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW', 13, 135, 114, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('MAGENTA', 1, 255, 225, 247)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 2, 255, 195, 239)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 3, 255, 165, 231)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 4, 255, 135, 222)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 5, 255, 106, 214)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 6, 255, 76, 206)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 7, 255, 41, 197)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 8, 255, 1, 186)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 9, 235, 1, 171)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 10, 210, 1, 153)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 11, 185, 1, 135)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 12, 160, 1, 116)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('MAGENTA', 13, 135, 1, 98)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('GRAY', 1, 245, 245, 245)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 2, 225, 225, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 3, 205, 205, 205)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 4, 185, 185, 185)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 5, 165, 165, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 6, 145, 145, 145)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 7, 125, 125, 125)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 8, 105, 105, 105)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 9, 85, 85, 85)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 10, 65, 65, 65)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 11, 45, 45, 45)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 12, 25, 25, 25)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY', 13, 5, 5, 5)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('CHARTREUSE', 1, 246, 255, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 2, 238, 255, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 3, 229, 255, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 4, 220, 255, 135)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 5, 211, 255, 106)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 6, 203, 255, 76)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 7, 193, 255, 41)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 8, 41, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 9, 238, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 10, 238, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 11, 132, 185, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 12, 114, 154, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CHARTREUSE', 13, 96, 135, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('PURPLE', 1, 251, 215, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 2, 249, 195, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 3, 248, 165, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 4, 246, 135, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 5, 242, 96, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 6, 235, 55, 250)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 7, 221, 1, 240)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 8, 207, 1, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 9, 184, 1, 205)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 10, 166, 1, 180)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 11, 138, 1, 150)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 12, 112, 0, 125)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE', 13, 92, 0, 100)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('BLUE TO RED', 1, 23, 1, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 2, 21, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 3, 85, 71, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 4, 101, 103, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 5, 165, 167, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 6, 210, 211, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 8, 255, 210, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 9, 255, 160, 160)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 10, 255, 111, 111)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 11, 255, 71, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 12, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO RED', 13, 220, 1, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('GRAY TO RED', 1, 85, 85, 85)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 2, 115, 115, 115)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 3, 145, 145, 145)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 4, 170, 170, 170)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 5, 195, 195, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 6, 225, 225, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 8, 255, 210, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 9, 255, 160, 160)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 10, 255, 111, 111)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 11, 255, 71, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 12, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GRAY TO RED', 13, 220, 1, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('BLUE TO ORANGE', 1, 23, 1, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 2, 21, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 3, 85, 71, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 4, 101, 103, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 5, 165, 167, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 6, 210, 211, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 8, 255, 230, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 9, 255, 205, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 10, 255, 178, 116)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 11, 255, 153, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 12, 255, 114, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('BLUE TO ORANGE', 13, 220, 98, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 1, 198, 1, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 2, 229, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 3, 236, 71, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 4, 240, 111, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 5, 246, 165, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 6, 250, 195, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 8, 255, 230, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 9, 255, 205, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 10, 255, 178, 116)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 11, 255, 153, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 12, 255, 114, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PURPLE TO ORANGE', 13, 220, 98, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('GREEN TO RED', 1, 3, 220, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 2, 0, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 3, 72, 255, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 4, 112, 255, 111)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 5, 166, 255, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 6, 196, 255, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 8, 255, 210, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 9, 255, 160, 160)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 10, 255, 111, 111)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 11, 255, 71, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 12, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO RED', 13, 220, 1, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('GREEN TO ORANGE', 1, 3, 220, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 2, 0, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 3, 72, 255, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 4, 112, 255, 111)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 5, 166, 255, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 6, 196, 255, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 8, 255, 230, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 9, 255, 205, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 10, 255, 178, 116)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 11, 255, 153, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 12, 255, 114, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO ORANGE', 13, 220, 98, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('CYAN TO RED', 1, 1, 220, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 2, 0, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 3, 71, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 4, 116, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 5, 165, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 6, 210, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 8, 255, 210, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 9, 255, 160, 160)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 10, 255, 111, 111)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 11, 255, 71, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 12, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO RED', 13, 220, 1, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('CYAN TO ORANGE', 1, 1, 220, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 2, 0, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 3, 71, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 4, 116, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 5, 165, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 6, 210, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 7, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 8, 255, 230, 210)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 9, 255, 220, 165)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 10, 255, 178, 116)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 11, 255, 153, 71)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 12, 255, 114, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('CYAN TO ORANGE', 13, 220, 98, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 1, 247, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 2, 255, 245, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 3, 255, 227, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 4, 255, 209, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 5, 255, 183, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 6, 255, 174, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 7, 255, 156, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 8, 255, 132, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 9, 255, 108, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 10, 255, 90, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 11, 255, 61, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 12, 255, 37, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO ORANGE TO RED', 13, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 1, 220, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 2, 240, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 3, 255, 1, 49)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 4, 255, 1, 96)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 5, 255, 1, 144)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 6, 255, 1, 204)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 7, 255, 0, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 8, 223, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 9, 187, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 10, 152, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 11, 116, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 12, 56, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('RED TO PURPLE TO BLUE', 13, 0, 255, 0)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 1, 1, 255, 58)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 2, 1, 255, 88)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 3, 1, 255, 118)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 4, 1, 255, 148)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 5, 1, 255, 178)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 6, 1, 255, 207)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 7, 1, 255, 237)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 8, 1, 243, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 9, 1, 213, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 10, 1, 184, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 11, 1, 124, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 12, 1, 94, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('GREEN TO CYAN TO BLUE', 13, 0, 0, 255)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 1, 255, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 2, 229, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 3, 205, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 4, 170, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 5, 116, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 6, 63, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 7, 3, 235, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 8, 1, 222, 103)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 9, 1, 220, 153)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 10, 1, 170, 138)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 11, 1, 135, 166)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 12, 1, 81, 166)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('YELLOW TO GREEN TO DARK BLUE', 13, 14, 1, 130)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('ELEVATION 1', 1, 175, 255, 231)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 2, 151, 255, 150)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 3, 255, 247, 130)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 4, 122, 205, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 5, 2, 130, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 6, 230, 162, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 7, 230, 125, 31)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 8, 220, 104, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 9, 200, 74, 36)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 10, 170, 1, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 11, 88, 52, 20)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 12, 185, 185, 185)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 1', 13, 255, 55, 255)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('ELEVATION 2', 1, 176, 231, 219)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 2, 228, 255, 180)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 3, 255, 251, 195)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 4, 250, 255, 156)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 5, 225, 212, 124)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 6, 219, 166, 32)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 7, 187, 165, 99)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 8, 161, 103, 51)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 9, 156, 123, 96)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 10, 157, 174, 176)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 11, 217, 192, 217)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 12, 198, 220, 221)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('ELEVATION 2', 13, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 1, 210, 255, 218)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 2, 198, 255, 231)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 3, 157, 255, 225)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 4, 116, 242, 248)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 5, 0, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 6, 83, 231, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 7, 127, 192, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 8, 65, 155, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 9, 1, 123, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 10, 0, 0, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 11, 23, 1, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 12, 16, 1, 200)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('SEA FLOOR ELEVATION', 13, 14, 1, 130)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('FULL SPECTRUM', 1, 255, 0, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 2, 255, 90, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 3, 255, 180, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 4, 241, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 5, 152, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 6, 3, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 7, 1, 255, 148)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 8, 1, 255, 237)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 9, 1, 184, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 10, 0, 0, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 11, 176, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 12, 254, 0, 245)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('FULL SPECTRUM', 13, 254, 0, 155)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('PRECIPITATION', 1, 206, 134, 63)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 2, 255, 166, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 3, 255, 216, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 4, 255, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 5, 186, 239, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 6, 111, 255, 39)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 7, 0, 206, 102)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 8, 3, 220, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 9, 2, 187, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 10, 0, 140, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 11, 0, 135, 140)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 12, 44, 102, 130)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('PRECIPITATION', 13, 32, 71, 146)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('TEMPERATURE', 1, 255, 255, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 2, 255, 101, 150)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 3, 176, 1, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 4, 0, 0, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 5, 1, 130, 255)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 6, 1, 210, 220)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 7, 1, 255, 178)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 8, 0, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 9, 185, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 10, 255, 255, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 11, 255, 180, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 12, 204, 72, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('TEMPERATURE', 13, 180, 1, 1)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('LAND COVER 1', 1, 255, 239, 140)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 2, 255, 201, 125)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 3, 239, 202, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 4, 239, 155, 73)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 5, 206, 174, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 6, 206, 191, 112)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 7, 163, 206, 90)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 8, 155, 206, 50)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 9, 0, 206, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 10, 69, 140, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 11, 122, 139, 53)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 12, 2, 130, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 1', 13, 1, 100, 99)";
+	if (!db->execute(insert)) return false;
+
+	insert = ins + " VALUES ('LAND COVER 2', 1, 222, 51, 51)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 2, 239, 155, 73)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 3, 239, 202, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 4, 255, 247, 144)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 5, 189, 239, 104)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 6, 182, 255, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 7, 172, 220, 119)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 8, 155, 206, 50)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 9, 0, 206, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 10, 69, 140, 0)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 11, 122, 139, 53)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 12, 2, 130, 1)";
+	if (!db->execute(insert)) return false;
+	insert = ins + " VALUES ('LAND COVER 2', 13, 1, 100, 0)";
+	if (!db->execute(insert)) return false;
+	return true;
+}
+
+bool locatePieBar (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt, double delta) 
+{
+	if (!db || !theme) 
+		return false;
+
+	theme->chartSelected_.clear();
+	string	TC = theme->collectionTable();
+	string xmin = Te2String(pt.x()-delta);
+	string xmax = Te2String(pt.x()+delta);
+	string ymin = Te2String(pt.y()-delta);
+	string ymax = Te2String(pt.y()+delta);
+
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+		return false;
+
+	string sel = "SELECT c_object_id FROM " + TC + " WHERE ";
+	sel += "label_x > " + xmin + " AND ";
+	sel += "label_x < " + xmax + " AND ";
+	sel += "label_y > " + ymin + " AND ";
+	sel += "label_y < " + ymax;
+
+	if(!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+
+	if(portal->fetchRow() == false)
+	{
+		delete portal;
+		return false;
+	}
+
+	theme->chartSelected_ = portal->getData("c_object_id");
+
+	delete portal;
+
+	return true;
+}
+
+
+bool loadChartParams (TeDatabase* db, TeThemeApplication *theme)
+{
+	if (!db || !theme) 
+		return false;
+
+	TeDatabasePortal* portal = db->getPortal();
+
+	string q ="SELECT * FROM te_chart_params WHERE theme_id= ";
+	q += Te2String (theme->id());
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+	while (portal->fetchRow())
+	{
+		TeColor cor = portal->getColor ();
+		string attname = portal->getData("attr_name");
+		int f = attname.find("(");
+		if(f >= 0)
+		{
+			string alias = attname;
+			attname.erase(f, attname.size()-f);
+			alias.erase(0, f+1);
+			alias.erase(alias.size()-1, 1);
+			map<string, string>& mapAA = db->mapThemeAlias()[theme->id()];
+			theme->concatTableName(attname);
+			mapAA[attname] = alias;
+		}
+		theme->chartAttributes_.push_back(attname);
+		theme->chartColors_.push_back(cor);
+	}
+	delete portal;
+	return true;
+}
+
+
+bool loadKernelParams (TeDatabase* db, int supThemeId, const string& supTableName, const string& supAttrName, TeKernelParams& KernelPar)
+{
+	if (!db) 
+		return false;
+
+	TeDatabasePortal* portal = db->getPortal();
+
+	string q ="SELECT event_theme_id_1, intensity_attr_name_1, ";
+	q += " intensity_attr_table_1, kernel_function_1, compute_type_1, radius_value_1, ";
+	q += " combination_type, event_theme_id_2, intensity_attr_name_2, intensity_attr_table_2, ";
+	q += " kernel_function_2, compute_type_2, radius_value_2, support_theme_id,  ";
+	q += " support_theme_table, support_theme_attr, generated_layer_id ";
+	q += " FROM te_kernel_metadata WHERE ";
+	q += " support_theme_id = "+ Te2String (supThemeId);
+	q += " AND support_theme_table = '"+ supTableName +"'";
+	q += " AND support_theme_attr = '"+ supAttrName +"'";
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+	
+	if (portal->fetchRow())
+	{
+		KernelPar.eventThemeId1_ = atoi(portal->getData(0));
+		KernelPar.intensityAttrName1_ = string(portal->getData(1));
+		KernelPar.intensityAttrTable1_ = string(portal->getData(2));
+		KernelPar.kernelFunction1_ = TeKernelFunctionType(atoi(portal->getData(3)));
+		KernelPar.computeType1_ = TeKernelComputeType(atoi(portal->getData(4)));
+		KernelPar.radiusValue1_ = portal->getDouble(5);
+		KernelPar.combinationType_ = TeKernelCombinationType(atoi(portal->getData(6)));
+		KernelPar.eventThemeId2_ = atoi(portal->getData(7));
+		KernelPar.intensityAttrName2_ = string(portal->getData(8));
+		KernelPar.intensityAttrTable2_ = string(portal->getData(9));
+		KernelPar.kernelFunction2_ = TeKernelFunctionType(atoi(portal->getData(10)));
+		KernelPar.computeType2_ = TeKernelComputeType(atoi(portal->getData(11)));
+		KernelPar.radiusValue2_ = portal->getDouble(12);
+		KernelPar.supportThemeId_ = atoi(portal->getData(13));
+		KernelPar.supportThemeTable_ = string(portal->getData(14));
+		KernelPar.supportThemeAttr_ = string(portal->getData(15));
+		KernelPar.generatedLayerId_ =  atoi(portal->getData(16));
+
+		vector<int> ids;
+		if(KernelPar.eventThemeId1_>0)
+			ids.push_back (KernelPar.eventThemeId1_);
+		if(KernelPar.eventThemeId2_>0)
+			ids.push_back (KernelPar.eventThemeId2_);
+		if(KernelPar.supportThemeId_>0)
+			ids.push_back (KernelPar.supportThemeId_);
+
+		string sqlIds; 
+		vector<int>::iterator it = ids.begin();
+		
+		while (it != ids.end ())
+		{
+			sqlIds += Te2String((*it)) +",";
+			++it;
+		}
+
+		sqlIds.replace (sqlIds.size()-1, 1, " ");
+		string sql = "SELECT theme_id, name FROM te_theme WHERE theme_id IN ("+ sqlIds +")";
+
+		portal->freeResult();
+		if(!portal->query(sql))
+		{
+			delete portal;
+			return false;
+		}
+
+		while(portal->fetchRow())
+		{
+			int themeId = atoi(portal->getData(0));
+			string themeName = string(portal->getData(1));
+
+			if(themeId==KernelPar.eventThemeId1_)
+				KernelPar.eventThemeName1_ = themeName;
+			else if (themeId==KernelPar.eventThemeId2_)
+				KernelPar.eventThemeName2_ = themeName;
+			else if (themeId==KernelPar.supportThemeId_)
+				KernelPar.supportThemeName_ = themeName;
+		}
+
+		if(KernelPar.generatedLayerId_>0)
+		{
+			sql = "SELECT name FROM te_layer WHERE layer_id = "+ KernelPar.generatedLayerId_;
+			
+			portal->freeResult();
+			if(!portal->query(sql) || !portal->fetchRow())
+			{
+				delete portal;
+				return false;
+			}
+			
+			KernelPar.generatedLayerName_= string(portal->getData(0));
+		}
+
+		delete portal;
+		return true;
+	}
+	
+	delete portal;
+	return false;
+}
+
+
+
+bool loadKernelParams (TeDatabase* db, int layerId, TeKernelParams& KernelPar)
+{
+	if (!db) 
+		return false;
+
+	TeDatabasePortal* portal = db->getPortal();
+
+	string q ="SELECT event_theme_id_1, intensity_attr_name_1, ";
+	q += " intensity_attr_table_1, kernel_function_1, compute_type_1, radius_value_1, ";
+	q += " combination_type, event_theme_id_2, intensity_attr_name_2, intensity_attr_table_2, ";
+	q += " kernel_function_2, compute_type_2, radius_value_2, support_theme_id,  ";
+	q += " support_theme_table, support_theme_attr, generated_layer_id ";
+	q += " FROM te_kernel_metadata WHERE ";
+	q += " generated_layer_id = "+ Te2String (layerId);
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+	
+	if (portal->fetchRow())
+	{
+		KernelPar.eventThemeId1_ = atoi(portal->getData(0));
+		KernelPar.intensityAttrName1_ = string(portal->getData(1));
+		KernelPar.intensityAttrTable1_ = string(portal->getData(2));
+		KernelPar.kernelFunction1_ = TeKernelFunctionType(atoi(portal->getData(3)));
+		KernelPar.computeType1_ = TeKernelComputeType(atoi(portal->getData(4)));
+		KernelPar.radiusValue1_ = portal->getDouble(5);
+		KernelPar.combinationType_ = TeKernelCombinationType(atoi(portal->getData(6)));
+		KernelPar.eventThemeId2_ = atoi(portal->getData(7));
+		KernelPar.intensityAttrName2_ = string(portal->getData(8));
+		KernelPar.intensityAttrTable2_ = string(portal->getData(9));
+		KernelPar.kernelFunction2_ = TeKernelFunctionType(atoi(portal->getData(10)));
+		KernelPar.computeType2_ = TeKernelComputeType(atoi(portal->getData(11)));
+		KernelPar.radiusValue2_ = portal->getDouble(12);
+		KernelPar.supportThemeId_ = atoi(portal->getData(13));
+		KernelPar.supportThemeTable_ = string(portal->getData(14));
+		KernelPar.supportThemeAttr_ = string(portal->getData(15));
+		KernelPar.generatedLayerId_ =  atoi(portal->getData(16));
+
+		vector<int> ids;
+		if(KernelPar.eventThemeId1_>0)
+			ids.push_back (KernelPar.eventThemeId1_);
+		if(KernelPar.eventThemeId2_>0)
+			ids.push_back (KernelPar.eventThemeId2_);
+		if(KernelPar.supportThemeId_>0)
+			ids.push_back (KernelPar.supportThemeId_);
+
+		string sqlIds; 
+		vector<int>::iterator it = ids.begin();
+		
+		while (it != ids.end ())
+		{
+			sqlIds += Te2String((*it)) +",";
+			++it;
+		}
+
+		sqlIds.replace (sqlIds.size()-1, 1, " ");
+		string sql = "SELECT theme_id, name FROM te_theme WHERE theme_id IN ("+ sqlIds +")";
+
+		portal->freeResult();
+		if(!portal->query(sql))
+		{
+			delete portal;
+			return false;
+		}
+
+		while(portal->fetchRow())
+		{
+			int themeId = atoi(portal->getData(0));
+			string themeName = string(portal->getData(1));
+
+			if(themeId==KernelPar.eventThemeId1_)
+				KernelPar.eventThemeName1_ = themeName;
+			else if (themeId==KernelPar.eventThemeId2_)
+				KernelPar.eventThemeName2_ = themeName;
+			else if (themeId==KernelPar.supportThemeId_)
+				KernelPar.supportThemeName_ = themeName;
+		}
+
+		if(KernelPar.generatedLayerId_>0)
+		{
+      sql = "";
+			sql = 
+        "SELECT name FROM te_layer WHERE layer_id = "
+        + Te2String(KernelPar.generatedLayerId_);
+			
+			portal->freeResult();
+			if(!portal->query(sql) || !portal->fetchRow())
+			{
+				delete portal;
+				return false;
+			}
+			
+			KernelPar.generatedLayerName_= string(portal->getData(0));
+		}
+
+		delete portal;
+		return true;
+	}
+	
+	delete portal;
+	return false;
+}
+
+
+bool updatePieBarLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt) 
+{
+	if (!db || !theme) 
+		return false;
+
+	if (theme->chartSelected_.empty() == true)
+		return false;
+
+	string	x = Te2String(pt.x());
+	string	y = Te2String(pt.y());
+	string	TC = theme->collectionTable();
+	string mover = "UPDATE " + TC + " SET label_x = " + x + ", label_y = " + y;
+	mover += " WHERE c_object_id = '" + theme->chartSelected_ + "'";
+	return db->execute(mover);
+}
+
+bool updatePointLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt) 
+{
+	if (!db || !theme) 
+		return false;
+
+	string	x = Te2String(pt.x());
+	string	y = Te2String(pt.y());
+	string	table = theme->layer()->tableName(TePOINTS);
+	string mover = "UPDATE " + table + " SET x = " + x + ", y = " + y;
+	mover += " WHERE geom_id = " + Te2String(theme->tePoint_.geomId());
+	return db->execute(mover);
+}
+
+
+bool insertChartParams(TeDatabase* db, TeThemeApplication *theme)
+{
+	if (!db || !theme) 
+		return false;
+
+	unsigned int n = theme->chartColors_.size();
+	int themeId = theme->id();
+	TeColor cor;
+	string ins, insert;
+	for (unsigned int i=0; i<n; i++)
+	{
+		cor = theme->chartColors_[i];
+		ins = "INSERT INTO te_chart_params (theme_id, attr_name, red, green, blue)";
+		insert = ins + " VALUES (" + Te2String(themeId) +",'";
+		string attname = theme->chartAttributes_[i];
+		map<int, map<string, string> > mapTAA = db->mapThemeAlias();
+		map<int, map<string, string> >::iterator tit = mapTAA.find(theme->id());
+		if(tit != mapTAA.end())
+		{
+			map<string, string> mapAA = tit->second;
+			theme->concatTableName(attname);
+			map<string, string>::iterator it = mapAA.find(attname);
+			if(it != mapAA.end())
+			{
+				string alias = it->second;
+				attname += "(" + alias + ")";
+			}
+		}
+		insert += attname +"',";
+		insert += Te2String(cor.red_) + ",";
+		insert += Te2String(cor.green_) + ",";
+		insert += Te2String(cor.blue_) + ")";
+		if (!db->execute(insert))
+			return false;
+	}
+	return true;
+}
+
+
+bool deleteChartParams (TeDatabase* db, TeThemeApplication* theme)
+{
+	if (!db || !theme) 
+		return false;
+
+	string id = Te2String(theme->id());
+	string del = "DELETE FROM te_chart_params WHERE theme_id = " + id;
+	return db->execute(del);
+}
+
+bool insertRampColor(TeDatabase* db, const string& name, int /* order */, TeColor& color, const string& tableName)
+{
+	if (!db) 
+		return false;
+
+	string ins = "INSERT INTO " + tableName + " (ramp_name, color_order, red, green, blue)";
+	ins += " VALUES ('" +  name + "', " + Te2String(color.red_);
+	ins += ", " + Te2String(color.green_);
+	ins += ", " + Te2String (color.blue_) + ")";
+	return db->execute(ins);
+}
+
+bool updateGridColor(TeDatabase* db, int themeId, TeObjectSelectionMode sel, TeColor& color)
+{
+	if (!db || themeId <= 0) 
+		return false;
+
+	string ins = "UPDATE te_legend SET red = " + Te2String(color.red_);
+	ins += ", green = " +  Te2String(color.green_);
+	ins += ", blue = "  + Te2String (color.blue_);
+	ins += " WHERE theme_id = " + Te2String(themeId) + " AND ";
+	if(sel == TeDefaultSelection)
+		ins += "group_id = -3";
+	else if(sel == TePointingSelection)
+		ins += "group_id = -4";
+	else if(sel == TeQuerySelection)
+		ins += "group_id = -5";
+	else
+		ins += "group_id = -6";
+	return db->execute(ins);
+}
+
+bool loadThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName)
+{
+	if (!db || !theme) 
+		return false;
+
+	if (!db->loadTheme(theme))
+		return false;
+
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+		return false;
+
+	string q = "SELECT * FROM " + tableName + " WHERE theme_id= ";
+	q += Te2String (theme->id());
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	theme->outOfCollectionVisibility(portal->getBool(1));
+	theme->withoutDataConnectionVisibility(portal->getBool(2));
+	theme->refineAttributeWhere(string(portal->getData (3)));
+	theme->refineSpatialWhere(string(portal->getData (4)));
+	theme->refineTemporalWhere(string(portal->getData (5)));
+
+	string name = portal->getData(6);
+	if (!name.empty())
+		theme->groupColor(name);
+	theme->groupColorDir(TeColorDirection(atoi(portal->getData(7))));
+	theme->groupObjects(TeSelectedObjects(atoi(portal->getData(8))));
+	theme->pieDiameter(portal->getDouble(9));
+	theme->pieMaxDiameter(portal->getDouble(10));
+	theme->pieMinDiameter(portal->getDouble(11));
+	name = portal->getData(12);
+	if (!name.empty())
+		theme->pieDimAttribute(name);
+	theme->barMaxHeight(portal->getDouble(13));
+	theme->barMinHeight(portal->getDouble(14));
+	theme->barWidth(portal->getDouble(15));
+	theme->chartMaxVal(portal->getDouble(16));
+	theme->chartMinVal(portal->getDouble(17));
+	theme->chartType(TeChartType(atoi(portal->getData(18))));
+	theme->chartObjects(TeSelectedObjects(atoi(portal->getData(19))));
+	theme->keepDimension(atoi(portal->getData(20)));
+	theme->showCanvasLegend(portal->getBool(21));
+	TeCoord2D p;
+	p.x(portal->getDouble(22));
+	p.y(portal->getDouble(23));
+	theme->canvasLegUpperLeft(p);
+	bool n = portal->getBool(24);
+	theme->mixColor(n);
+	n = portal->getBool(25);
+	theme->countObj(n);
+	name = portal->getData(26);
+	if (!name.empty())
+		theme->textTable(name);
+	theme->chartFunction(portal->getData(27));
+	portal->freeResult();
+	delete portal;
+	return loadChartParams(db,theme);
+}
+
+bool insertThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName)
+{
+	if (!db || !theme) 
+		return false;
+	if (!db->insertTheme((TeTheme*) theme))
+		return false;
+
+	string q = "INSERT INTO " + tableName + " (theme_id, visible_out_coll, visible_without_conn, ";
+	q += "refine_attribute_where, refine_spatial_where, refine_temporal_where, ";
+	q += "grouping_color, grouping_color_direction, grouping_objects, ";
+	q += "pie_diameter, pie_max_diameter, pie_min_diameter, pie_dimension_attr, ";
+	q += "bar_max_height, bar_min_height, bar_width, ";
+	q += "chart_max_value, chart_min_value, chart_type, chart_objects, ";
+	q += "keep_dimension, show_canvas_leg, canvas_leg_x, canvas_leg_y, ";
+	q += "mix_color, count_obj, text_table, chart_function) VALUES (";
+
+	q += Te2String(theme->id()) + ", ";
+	if (theme->outOfCollectionVisibility())
+		q += "1, ";
+	else
+		q += "0, ";
+	if (theme->withoutDataConnectionVisibility())
+		q += "1, '";
+	else
+		q += "0, '";
+	q += theme->refineAttributeWhere () + "', '" + theme->refineSpatialWhere() + "', '";
+	q += theme->refineTemporalWhere () + "', '" + theme->groupColor() + "', ";
+	q += Te2String(theme->groupColorDir()) + ", " + Te2String(theme->groupObjects()) + ", ";
+	q += Te2String(theme->pieDiameter(),8) + ", " + Te2String(theme->pieMaxDiameter(),8) + ", ";
+	q += Te2String(theme->pieMinDiameter(),8) + ", '" + theme->pieDimAttribute() + "', ";
+	q += Te2String(theme->barMaxHeight(),8) + ", " + Te2String(theme->barMinHeight(),8) + ", ";
+	q += Te2String(theme->barWidth(),8) + ", " + Te2String(theme->chartMaxVal(),8) + ", ";
+	q += Te2String(theme->chartMinVal(),8)+ ", " + Te2String(theme->chartType()) + ", ";
+	q += Te2String(theme->chartObjects()) + ", "; 
+	q += Te2String(theme->keepDimension()) + ", ";
+	if (theme->showCanvasLegend())
+		q += "1, ";
+	else
+		q += "0, ";
+	q += Te2String(theme->canvasLegWidth(),8) + ", ";
+	q += Te2String(theme->canvasLegHeight(),8) + ", ";
+	if (theme->mixColor())
+		q += "1, ";
+	else
+		q += "0, ";
+	if (theme->countObj())
+		q += "1, '";
+	else
+		q += "0, '";
+	q += theme->textTable() + "', '";
+	q += theme->chartFunction() + "')";
+	if(!db->execute(q))
+		return false;
+
+	for (unsigned int i=0; i<theme->chartAttributes_.size(); i++)
+	{
+		q = "INSERT INTO te_chart_params VALUES (attr_name, red, blue, green, theme_id) VALUES (";
+		string attname = theme->chartAttributes_[i];
+		map<int, map<string, string> > mapTAA = db->mapThemeAlias();
+		map<int, map<string, string> >::iterator tit = mapTAA.find(theme->id());
+		if(tit != mapTAA.end())
+		{
+			map<string, string> mapAA = tit->second;
+			theme->concatTableName(attname);
+			map<string, string>::iterator it = mapAA.find(attname);
+			if(it != mapAA.end())
+			{
+				string alias = it->second;
+				attname += "(" + alias + ")";
+			}
+		}
+		q += "'" + attname + "', " + Te2String(theme->chartColors_[i].red_)+ ", ";
+		q += Te2String(theme->chartColors_[i].green_)+ ", " + Te2String(theme->chartColors_[i].blue_) +", ";
+		q += Te2String(theme->id()) + ")";
+		if (!db->execute(q))
+			return false;
+	}
+	return true; 
+}
+
+bool loadViewSet(TeDatabase* db, const string& user)
+{
+	if (!db)
+		return false;
+
+	TeViewMap::iterator it = db->viewMap().begin();
+	while (it != db->viewMap().end())
+	{
+		delete it->second;
+		++it;
+	}
+	db->viewMap().clear();
+
+	
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+		return false;
+
+	string q = " SELECT * FROM te_view WHERE user_name = '" + user + "'";
+	
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+
+	TeDatabasePortal* themePortal = db->getPortal();
+	if (!themePortal)
+	{	
+		delete portal;
+		return false;
+	}
+
+	while (portal->fetchRow())
+	{
+		TeView *view = new TeView();
+		view->id (atoi(portal->getData("view_id")));
+		int projId = atoi(portal->getData("projection_id"));
+		TeProjection* proj = db->loadProjection(projId);
+		if (proj != 0)
+			view->projection(proj);
+		view->name(portal->getData("name"));
+		view->user(portal->getData("user_name"));
+		view->isVisible (portal->getBool("visibility"));
+		
+		loadViewTree(db, view, 0);
+
+		vector<TeViewNode*>& themes = view->themes();
+		for (unsigned int i = 0; i < themes.size(); i++)
+		{
+			TeTheme *theme = (TeTheme*)themes[i];
+			int id = theme->layerId();
+			TeLayerMap::iterator it = db->layerMap().find(id);
+			if (it == db->layerMap().end())
+			{
+				db->layerMap().clear();
+				db->loadLayerSet();
+			}
+			theme->layer(db->layerMap()[id]);
+		}
+		db->viewMap()[view->id()] = view;
+		themePortal->freeResult();
+	}
+
+	delete themePortal;
+	delete portal;
+	return true;
+}
+
+bool 
+updateView(TeDatabase* db, TeView *view)
+{
+	if(!db) return false;
+	if(!view) return false;
+
+	TeProjection* proj = view->projection();
+	if (proj)
+	{
+		if (proj->id() <= 0)
+			db->insertProjection(view->projection());
+		else
+			db->updateProjection(view->projection());
+	}
+	else
+		return false;
+
+	string sql = "UPDATE te_view SET projection_id=" + Te2String(proj->id());
+	sql+= ", name='" + view->name() + "'";
+	sql+= ", user_name='" + view->user() + "'";
+	sql+= ", visibility= " + Te2String((int)view->isVisible());
+	sql +=" WHERE view_id = " + Te2String(view->id());
+
+	if (!db->execute (sql))
+		return false;
+
+	TeViewTree* tree = view->root();
+	if(tree) 
+		updateViewTree(db, tree);
+
+	return true;
+}
+
+bool updateThemeApplication (TeDatabase* db, TeThemeApplication *theme)
+{
+	if (!db || !theme) 
+		return false;
+	if (!db->updateTheme((TeTheme*) theme))
+		return false;
+
+	string sql;
+
+	if (theme->id() <= 0 )  // theme doesn�t exist in the database yet
+	{
+		return insertThemeApplication (db, theme);
+	}
+	
+	// update theme metadata
+	sql = "UPDATE te_theme_application SET ";
+	sql += "  visible_out_coll=";
+	if (theme->outOfCollectionVisibility())
+		sql += "1";
+	else 
+		sql += "0";
+	sql += ", visible_without_conn=";
+	if (theme->withoutDataConnectionVisibility())
+		sql += "1";
+	else 
+		sql += "0";
+
+	sql += ", refine_attribute_where='" + theme->refineAttributeWhere()+"'";
+	sql += ", refine_spatial_where='" + theme->refineSpatialWhere()+"'";
+	sql += ", refine_temporal_where='" + theme->refineTemporalWhere()+"'";
+	sql += ", grouping_color='" + theme->groupColor() + "'";
+	sql += ", grouping_color_direction=" + Te2String(theme->groupColorDir());
+	sql += ", grouping_objects=" + Te2String (theme->groupObjects());
+	sql += ", pie_diameter=" + Te2String(theme->pieDiameter());
+	sql += ", pie_max_diameter=" + Te2String(theme->pieMaxDiameter());
+	sql += ", pie_min_diameter=" + Te2String(theme->pieMinDiameter());
+	sql += ", pie_dimension_attr='" + theme->pieDimAttribute()+"'";
+	sql += ", bar_max_height=" + Te2String(theme->barMaxHeight());
+	sql += ", bar_min_height=" + Te2String(theme->barMinHeight());
+	sql += ", bar_width=" + Te2String(theme->barWidth());
+	sql += ", chart_max_value=" + Te2String(theme->chartMaxVal());
+	sql += ", chart_min_value=" + Te2String(theme->chartMinVal());
+	sql += ", chart_type=" + Te2String (theme->chartType());
+	sql += ", chart_objects=" + Te2String (theme->chartObjects());
+	sql += ", keep_dimension=" + Te2String(theme->keepDimension());
+	sql += ", show_canvas_leg=";
+	if (theme->showCanvasLegend())
+		sql += "1";
+	else 
+		sql += "0";
+	sql += ", canvas_leg_x=" + Te2String(theme->canvasLegUpperLeft().x());
+	sql += ", canvas_leg_y=" + Te2String(theme->canvasLegUpperLeft().y());
+	sql += ", mix_color=";
+	if (theme->mixColor())
+		sql += "1";
+	else 
+		sql += "0";
+	sql += ", count_obj=";
+	if (theme->countObj())
+		sql += "1";
+	else 
+		sql += "0";
+	sql += ", text_table='" + theme->textTable () + "'";
+	sql += ", chart_function='" + theme->chartFunction () + "'";
+	sql += " WHERE theme_id=" + Te2String (theme->id());
+
+	if (!db->execute (sql))
+		return false;
+         
+	// remove it�s chart parameters and reinsert them
+	deleteChartParams(db, theme);
+	if(!insertChartParams (db, theme))
+		return false;
+
+	return true;
+
+//	return theme->mountSqlJoin (false);
+}
+
+
+bool deleteThemeApplication (TeDatabase* db, int themeId)
+{
+	if (!db || themeId < 1) 
+		return false;
+	if (!db->deleteTheme(themeId))
+		return false;
+
+	string sql = "DELETE FROM te_kernel_metadata WHERE event_theme_id_1 = "+ Te2String(themeId);
+	sql += " OR event_theme_id_2 = "+ Te2String(themeId);
+	db->execute(sql);
+
+	if (db->existRelation("te_theme_application", "fk_themeAppl_theme_id") != TeRICascadeDeletion)
+	{
+		// Delete all chart parameters associated to the theme
+		string sql = "DELETE FROM te_theme_application WHERE theme_id =" + Te2String(themeId);
+		if (!db->execute (sql))
+			return false;
+	}
+
+	if (db->existRelation("te_chart_params", "fk_chartpar_theme_id") != TeRICascadeDeletion)
+	{
+		// Delete all chart parameters associated to the theme
+		string sql = "DELETE FROM te_chart_params WHERE theme_id =" + Te2String(themeId);
+		if (!db->execute (sql))
+			return false;
+	}
+	return true;
+}
+
+TeViewTree* 
+loadViewTree(TeDatabase* db, TeView* view, int id)
+{
+	if(db == NULL) return NULL;
+	if(view == NULL) return NULL;
+	TeDatabasePortal* portal = db->getPortal();
+	string q;
+	TeViewTree *node = NULL;
+
+	if(id != 0)
+	{
+		q = "SELECT * FROM te_theme";
+		q += " WHERE view_id = " + Te2String (view->id());
+		q += " AND theme_id = " + Te2String(id);
+		if (!portal->query(q) || portal->fetchRow())
+		{
+			delete portal;
+			return NULL;
+		}
+
+		TeViewNodeType type = (TeViewNodeType)atoi(portal->getData("node_type"));
+		if(type != TeTREE)
+		{
+			portal->freeResult();
+			delete portal;
+			return NULL;
+		}
+
+		node = portal->getViewTree();
+		portal->freeResult();
+	}
+
+	q ="SELECT * FROM te_theme";
+	q += " WHERE view_id = " + Te2String (view->id());
+	q += " AND parent_id = " + Te2String(id);
+	q += " ORDER BY priority ASC";
+
+	if (!portal->query(q))
+	{
+		delete portal;
+		return node;
+	}
+
+	while (portal->fetchRow())
+	{
+		TeViewNodeType childType = (TeViewNodeType)atoi(portal->getData("node_type"));
+		TeViewNode *childNode;
+		if (childType == TeTHEME)
+		{
+			childNode = new TeThemeApplication();
+			childNode->id(atoi(portal->getData("theme_id")));
+			if(loadThemeApplication(db,(TeThemeApplication*) childNode))
+				db->themeMap()[childNode->id()] = (TeTheme*)childNode;
+			else
+				childNode = 0;
+		} 
+		else
+		{
+			childNode = loadViewTree(db, view, atoi(portal->getData("theme_id")));
+		}
+
+		if((id==0) && (childNode))
+		{
+			view->add(childNode);
+		} 
+		else if (childNode)
+		{
+//			view->addTheme(childNode);
+			node->add(childNode);
+		}
+	}
+	
+	delete portal;
+	return node;
+}
+
+bool updateViewTree (TeDatabase* db, TeViewTree *tree)
+{
+	if(tree->id() > 0)
+	{
+		string sql;
+		sql = "UPDATE te_theme SET ";
+		sql += "name='" + tree->name()+"'";
+		sql += ", parent_id=" + Te2String (tree->parentId());
+		sql += ", node_type=" + Te2String (tree->type());
+		sql += " ,priority=" + Te2String (tree->priority());
+//		sql += ", visible_rep=" + Te2String (tree->visible());
+		sql += " WHERE theme_id = " + Te2String(tree->id());
+
+		if(!db->execute (sql)) return false;
+	}
+
+	for (unsigned int th=0; th<tree->size(); th++)
+	{
+		TeViewNode* node = tree->retrieve(th);
+		if (node->type() == TeTHEME)
+		{
+			TeThemeApplication *theme = (TeThemeApplication*)node;
+			if(!updateThemeApplication(db, theme)) return false;
+		}
+		else
+		{
+			TeViewTree* tree = (TeViewTree*)node;
+			if(!updateViewTree(db, tree)) return false;
+		}
+	}
+
+	return true;
+}
+
+int createTeLayerMetadata(TeDatabase* db)
+{
+	TeAttributeList attr;
+	TeAttribute		at;
+
+	at.rep_.type_ = TeINT;
+	at.rep_.name_ = "layer_id";
+	at.rep_.isPrimaryKey_ = true;
+	attr.push_back(at);
+
+	at.rep_.isPrimaryKey_ = false;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "name";
+	at.rep_.numChar_ = 128;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "author";
+	at.rep_.numChar_ = 128;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "source";
+	at.rep_.numChar_ = 255;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "quality";
+	at.rep_.numChar_ = 128;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "description";
+	at.rep_.numChar_ = 255;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "date_";
+	at.rep_.numChar_ = 64;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "hour_";
+	at.rep_.numChar_ = 64;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeINT;
+	at.rep_.name_ = "transf";
+	attr.push_back(at);
+
+	if(db->createTable ("te_layer_metadata", attr) == false)
+		return 1;
+
+	bool b = db->tableExist("te_layer_metadata");
+	while(b == false)
+		b = db->tableExist("te_layer_metadata");
+
+	if (db->createRelation("fk_te_layer_met_id", "te_layer_metadata", "layer_id", "te_layer", "layer_id", true) == false)
+		return 2;
+	return 3;
+}
+
+int createTeTableMetadata(TeDatabase* db)
+{
+	TeAttributeList attr;
+	TeAttribute		at;
+
+	at.rep_.type_ = TeINT;
+	at.rep_.name_ = "table_id";
+	at.rep_.isPrimaryKey_ = true;
+	attr.push_back(at);
+
+	at.rep_.isPrimaryKey_ = false;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "name";
+	at.rep_.numChar_ = 128;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "author";
+	at.rep_.numChar_ = 128;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "source";
+	at.rep_.numChar_ = 255;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "quality";
+	at.rep_.numChar_ = 128;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "description";
+	at.rep_.numChar_ = 255;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "date_";
+	at.rep_.numChar_ = 64;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "hour_";
+	at.rep_.numChar_ = 64;
+	attr.push_back(at);
+
+	at.rep_.type_ = TeINT;
+	at.rep_.name_ = "transf";
+	attr.push_back(at);
+
+	if(db->createTable ("te_table_metadata", attr) == false)
+		return 1;
+
+	bool b = db->tableExist("te_table_metadata");
+	while(b == false)
+		b = db->tableExist("te_table_metadata");
+
+	if (db->createRelation("fk_te_table_met_id", "te_table_metadata", "table_id", "te_layer_table", "table_id", true) == false)
+		return 2;
+	return 3;
+}
+
+
+bool deleteTextVisual(TeLayer* layer)
+{
+	TeDatabase*	db = layer->database();
+	TeDatabasePortal*	portal = db->getPortal();
+
+	string sel = "SELECT geom_table FROM te_representation";
+	sel += " WHERE layer_id = " + Te2String(layer->id());
+	sel += " AND geom_type = " + Te2String(TeTEXT);
+
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			string s = portal->getData(0);
+			string drop = "DROP TABLE " + s + "_txvisual";
+			if(db->execute(drop) == false)
+			{
+				delete portal;
+				return false;	
+			}
+		}
+	}
+	delete portal;
+	return true;
+}
+
+
+bool isTerralibModel(TeDatabase* db)
+{
+	vector<string>::iterator it;
+	vector<string> tables;
+	db->listTables(tables);
+
+	for(unsigned int i = 0; i<tables.size(); i++)
+	{
+		if((it = find(tables.begin(), tables.end(), "te_projection")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_layer")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_layer_table")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_tables_relation")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_representation")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_view")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_theme")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_grouping")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_theme_table")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_legend")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_visual")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_visual_raster")) == tables.end())
+			return false;
+		if((it = find(tables.begin(), tables.end(), "te_database")) == tables.end())
+			return false;
+	}
+	if(tables.size() == 0)
+		return false;
+
+	return true;
+}
+
+string insertObjectIntoCollection(TeTheme* theme, TeCoord2D p, string newId, string newTId)
+{
+	string erro;
+	string sel;
+	TeLayer* layer = theme->layer();
+	TeDatabase* db = layer->database();
+	string CT = theme->collectionTable();
+	string CAT = theme->collectionAuxTable();
+
+	TeDatabasePortal* portal = db->getPortal();
+	if(newId.empty() == false)
+	{
+		sel = "SELECT * FROM " + CT + " WHERE c_object_id = '" + newId + "'";
+		if(portal->query(sel) && portal->fetchRow())
+		{
+//			erro = "There is already the object identifier:" + newId;
+//			erro += " in the collection table:" + CT;
+			delete portal;
+			return "There is already";
+		}
+	}
+
+//	if(newTId.empty() == false)
+//	{
+//		sel = "SELECT * FROM " + CAT + " WHERE aux0 = '" + newTId + "'";
+//		portal->freeResult();
+//		if(portal->query(sel) && portal->fetchRow())
+//		{
+//			erro = "There is already the object identifier:" + newTId;
+//			erro += " in the collection auxliar table:" + CAT;
+//			delete portal;
+//			return erro;
+//		}
+//	}
+	delete portal;
+
+	unsigned int i;
+	vector<TeTable> staticTableVec, eventTableVec, temporalTableVec;
+	TeAttrTableVector layerTablesVector;
+	if(layer->getAttrTables(layerTablesVector))
+	{
+		for(i=0; i<layerTablesVector.size(); i++)
+		{
+			TeTable t = layerTablesVector[i];
+			if(t.tableType() == TeAttrStatic)
+				staticTableVec.push_back(t);
+			else if(t.tableType() == TeAttrEvent)
+				eventTableVec.push_back(t);
+			else if(t.tableType() == TeFixedGeomDynAttr)
+				temporalTableVec.push_back(t);
+		}
+	}
+	else
+	{
+		erro = "Fail in the layer method to gets attribute table associated";
+		return erro;
+	}
+
+	bool ret;
+	if(newId.empty() == false)
+	{
+		string ins = "INSERT INTO " + CT + " (c_object_id, c_legend_id,";
+		ins += " label_x, label_y, c_legend_own, c_object_status) VALUES (";
+		ins += "'" + newId + "', 0, " + Te2String(p.x()) + ", " + Te2String(p.y());
+		ins += ", 0, 1)";
+		ret = db->execute(ins);
+		if(ret == false)
+			return db->errorMessage();
+
+		for(i=0; i<staticTableVec.size(); i++)
+		{
+			TeTable t = staticTableVec[i];
+			ins = "INSERT INTO " + t.name() + " (" + t.linkName() + ")";
+			ins += " VALUES ('" + newId + "')";
+			ret = db->execute(ins);
+			if(ret == false)
+				return db->errorMessage();
+		}
+		for(i=0; i<eventTableVec.size(); i++)
+		{
+			TeTable t = eventTableVec[i];
+			ins = "INSERT INTO " + t.name() + " (" + t.linkName() + ")";
+			ins += " VALUES ('" + newId + "')";
+			ret = db->execute(ins);
+			if(ret == false)
+				return db->errorMessage();
+		}
+	}
+
+	string uniqueId = newId;
+	if(newTId.empty() == false)
+	{
+		uniqueId = newId + newTId;
+		string ins = "INSERT INTO " + CAT + " (object_id, aux0, unique_id, grid_status) VALUES (";
+		ins += "'" + newId + "', '" + newTId + "', '" + uniqueId + "', 1)";
+		ret = db->execute(ins);
+		if(ret == false)
+			return db->errorMessage();
+
+		for(i=0; i<temporalTableVec.size(); i++)
+		{
+			TeTable t = temporalTableVec[i];
+			ins = "INSERT INTO " + t.name() + " (" + t.linkName() + ", " + t.uniqueName() + ")";
+			ins += " VALUES ('" + newId + "', '" + newTId + "')";
+			ret = db->execute(ins);
+			if(ret == false)
+				return db->errorMessage();
+		}
+	}
+	else
+	{
+		string ins = "INSERT INTO " + CAT + " (object_id, unique_id, grid_status) VALUES (";
+		ins += "'" + newId + "', '" + uniqueId + "', 1)";
+		ret = db->execute(ins);
+		if(ret == false)
+			return db->errorMessage();
+	}
+
+	return "";
+}
+
+string deletePointedObjects(TeTheme* theme, TeBox& box)
+{
+	unsigned int i;
+	TeLayer* layer = theme->layer();		
+	TeDatabase* db = layer->database();
+	TeThemeMap&	themeMap = db->themeMap();
+	string CT = theme->collectionTable();
+	string CAT = theme->collectionAuxTable();
+	string tsel, sel, del;
+	vector<TeTable> table;
+	vector<TeTable> ttable;
+	vector<string> selVec;
+	vector<string> selAuxVec;
+
+	TeAttrTableVector layerTablesVector;
+	layer->getAttrTables(layerTablesVector);
+
+// delete temporal instances of TeFixedGeomDynAttr tables
+	for(i=0; i<layerTablesVector.size(); i++)
+	{
+		TeTable t = layerTablesVector[i];
+		TeAttrTableType type = t.tableType();
+
+		if(type == TeFixedGeomDynAttr)
+			ttable.push_back(t);
+	}
+
+	if(ttable.size())
+	{
+		tsel = "(SELECT aux0 FROM " + CAT;
+		tsel += " WHERE grid_status = 1 OR grid_status = 3)";
+
+		for(i=0; i<ttable.size(); i++)
+		{
+			del = "DELETE FROM " + ttable[i].name() + " WHERE " + ttable[i].uniqueName() + " IN " + tsel;
+			if(db->execute(del) == false)
+				return db->errorMessage();
+		}
+	}
+
+// get selected object ids
+	TeDatabasePortal* portal = db->getPortal();
+	vector<string> oidVec;
+	sel = "SELECT DISTINCT object_id FROM " + CAT;
+	sel += " WHERE (grid_status = 1 OR grid_status = 3) AND object_id NOT IN";
+	sel += "(SELECT DISTINCT object_id FROM " + CAT;
+	sel += " WHERE grid_status = 0 OR grid_status = 2)";
+	portal->freeResult();
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			string oid = portal->getData(0);
+			oidVec.push_back(oid);
+		}
+	}
+
+	sel = "SELECT * FROM " + CT + " as T LEFT JOIN " + CAT + " as TT";
+	sel += " ON T.c_object_id = TT.object_id WHERE TT.grid_status is null";
+	sel += " AND (T.c_object_status = 1 OR T.c_object_status = 3)";
+	portal->freeResult();
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			string oid = portal->getData(0);
+			oidVec.push_back(oid);
+		}
+	}
+	vector<string>::iterator itB = oidVec.begin();
+	vector<string>::iterator itE = oidVec.end();
+	selVec = generateInClauses(itB,itE, db, true);
+
+// delete attributes of TeAttrStatic tables and TeAttrEvent tables
+	for(i=0; i<layerTablesVector.size(); i++)
+	{
+		TeTable t = layerTablesVector[i];
+		TeAttrTableType type = t.tableType();
+
+		if(type == TeAttrStatic || type == TeAttrEvent)
+			table.push_back(t);
+	}
+
+	for(i=0; i<table.size(); i++)
+	{
+		for(i=0; i<selVec.size(); i++)
+		{
+			del = "DELETE FROM " + table[i].name() + " WHERE ";
+			del += table[i].linkName() + " IN " + selVec[i];
+			if(db->execute(del) == false)
+			{
+				delete portal;
+				return db->errorMessage();
+			}
+		}
+	}
+
+	double minX = TeMAXFLOAT, minY = TeMAXFLOAT, maxX = -TeMAXFLOAT, maxY = -TeMAXFLOAT;
+// delete selected geometries
+	if(layer->geomRep() & TePOLYGONS)
+	{
+		string geo = layer->tableName(TePOLYGONS);
+		for(i=0; i<selVec.size(); i++)
+		{
+			string boxsel = "SELECT * FROM " + geo;
+			boxsel += " WHERE object_id IN " + selVec[i];
+
+			portal->freeResult();
+			if(portal->query(boxsel))
+			{
+				while(portal->fetchRow())
+				{
+					double x1 = portal->getDouble("lower_x");
+					double y1 = portal->getDouble("lower_y");
+					double x2 = portal->getDouble("upper_x");
+					double y2 = portal->getDouble("upper_y");
+					TeBox b(x1, y1, x2, y2);
+					box = TeUnion(box, b);
+				}
+			}
+			del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+			if(db->execute(del) == false)
+			{
+				delete portal;
+				return db->errorMessage();
+			}
+		}
+		string bb = "SELECT MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y) FROM " + geo;
+		portal->freeResult();
+		if(portal->query(bb) && portal->fetchRow())
+		{
+			minX = MIN(minX, portal->getDouble(0));
+			minY = MIN(minY, portal->getDouble(1));
+			maxX = MAX(maxX, portal->getDouble(2));
+			maxY = MAX(maxY, portal->getDouble(3));
+		}
+	}
+	if(layer->geomRep() & TePOINTS)
+	{
+		string geo = layer->tableName(TePOINTS);
+		for(i=0; i<selVec.size(); i++)
+		{
+			string boxsel = "SELECT * FROM " + geo;
+			boxsel += " WHERE object_id IN " + selVec[i];
+
+			portal->freeResult();
+			if(portal->query(boxsel))
+			{
+				while(portal->fetchRow())
+				{
+					double x = portal->getDouble("x");
+					double y = portal->getDouble("y");
+					TeBox b(x, y, x, y);
+					box = TeUnion(box, b);
+				}
+			}
+			del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+			if(db->execute(del) == false)
+			{
+				delete portal;
+				return db->errorMessage();
+			}
+		}
+		string bb = "SELECT MIN(x), MIN(y), MAX(x), MAX(y) FROM " + geo;
+		portal->freeResult();
+		if(portal->query(bb) && portal->fetchRow())
+		{
+			minX = MIN(minX, portal->getDouble(0));
+			minY = MIN(minY, portal->getDouble(1));
+			maxX = MAX(maxX, portal->getDouble(2));
+			maxY = MAX(maxY, portal->getDouble(3));
+		}
+	}
+	if(layer->geomRep() & TeCELLS)
+	{
+		string geo = layer->tableName(TeCELLS);
+		for(i=0; i<selVec.size(); i++)
+		{
+			string boxsel = "SELECT * FROM " + geo;
+			boxsel += " WHERE object_id IN " + selVec[i];
+
+			portal->freeResult();
+			if(portal->query(boxsel))
+			{
+				while(portal->fetchRow())
+				{
+					double x1 = portal->getDouble("lower_x");
+					double y1 = portal->getDouble("lower_y");
+					double x2 = portal->getDouble("upper_x");
+					double y2 = portal->getDouble("upper_y");
+					TeBox b(x1, y1, x2, y2);
+					box = TeUnion(box, b);
+				}
+			}
+			del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+			if(db->execute(del) == false)
+			{
+				delete portal;
+				return db->errorMessage();
+			}
+		}
+		string bb = "SELECT MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y) FROM " + geo;
+		portal->freeResult();
+		if(portal->query(bb) && portal->fetchRow())
+		{
+			minX = MIN(minX, portal->getDouble(0));
+			minY = MIN(minY, portal->getDouble(1));
+			maxX = MAX(maxX, portal->getDouble(2));
+			maxY = MAX(maxY, portal->getDouble(3));
+		}
+	}
+	if(layer->geomRep() & TeLINES)
+	{
+		string geo = layer->tableName(TePOINTS);
+		for(i=0; i<selVec.size(); i++)
+		{
+			string boxsel = "SELECT * FROM " + geo;
+			boxsel += " WHERE object_id IN " + selVec[i];
+
+			portal->freeResult();
+			if(portal->query(boxsel))
+			{
+				while(portal->fetchRow())
+				{
+					double x1 = portal->getDouble("lower_x");
+					double y1 = portal->getDouble("lower_y");
+					double x2 = portal->getDouble("upper_x");
+					double y2 = portal->getDouble("upper_y");
+					TeBox b(x1, y1, x2, y2);
+					box = TeUnion(box, b);
+				}
+			}
+			del = "DELETE FROM " + geo + " WHERE object_id IN " + selVec[i];
+			if(db->execute(del) == false)
+			{
+				delete portal;
+				return db->errorMessage();
+			}
+		}
+		string bb = "SELECT MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y) FROM " + geo;
+		portal->freeResult();
+		if(portal->query(bb) && portal->fetchRow())
+		{
+			minX = MIN(minX, portal->getDouble(0));
+			minY = MIN(minY, portal->getDouble(1));
+			maxX = MAX(maxX, portal->getDouble(2));
+			maxY = MAX(maxY, portal->getDouble(3));
+		}
+	}
+
+	double dx = maxX - minX;
+	double dy = maxY - minY;
+	minX -= dx/20.;
+	maxX += dx/20.;
+	minY -= dy/20.;
+	maxY += dy/20.;
+
+	string up = "UPDATE te_layer SET lower_x = " + Te2String(minX);
+	up += ", lower_y = " + Te2String(minY);
+	up += ", upper_x = " + Te2String(maxX);
+	up += ", upper_y = " + Te2String(maxY);
+	up += " WHERE layer_id = " + Te2String(layer->id());
+	if(db->execute(up) == false)
+	{
+		delete portal;
+		return db->errorMessage();
+	}
+	TeBox nbox(minX, minY, maxX, maxY);
+	layer->setLayerBox(nbox);
+
+// get collection names of all themes that use this layer
+	vector<string> CATFVec;
+	vector<string> CATVec;
+	vector<string> CTVec;
+	string ss = "SELECT theme_id FROM te_theme WHERE layer_id = " + Te2String(layer->id());
+	portal->freeResult();
+	if(portal->query(ss))
+	{
+		while(portal->fetchRow())
+		{
+			int id = atoi(portal->getData(0));
+			if(id != theme->id())
+			{
+				TeTheme* t = themeMap[id];
+				TeAttrTableVector& tableVec = t->attrTables();
+				for(i=0; i<tableVec.size(); i++)
+				{
+					string s = t->collectionAuxTable();
+					if(tableVec[i].tableType() == TeFixedGeomDynAttr)
+						CATFVec.push_back(s);
+					else
+						CATVec.push_back(s);
+				}
+				string s = t->collectionTable();
+				CTVec.push_back(s);
+			}
+		}
+	}
+	delete portal;
+
+// delete selected objects of the collections of other themes
+	for(i=0; i<CTVec.size(); i++)
+	{
+		for(i=0; i<selVec.size(); i++)
+		{
+			del = "DELETE FROM " + CTVec[i] + " WHERE c_object_id IN " + selVec[i];
+			if(db->execute(del) == false)
+				return db->errorMessage();
+		}
+	}
+
+// delete selected objects of the collection this theme
+	for(i=0; i<selVec.size(); i++)
+	{
+		del = "DELETE FROM " + CT + " WHERE c_object_id IN " + selVec[i];
+		if(db->execute(del) == false)
+			return db->errorMessage();
+	}
+
+	up = "UPDATE " + CT + " SET c_object_status = c_object_status - 1 WHERE (c_object_status = 1 OR c_object_status = 3)";
+	if(db->execute(up) == false)
+		return db->errorMessage();
+
+// delete selected instances of the auxiliar collection of other themes (only TeFixedGeomDynAttr)
+	if(ttable.size())
+	{
+		for(i=0; i<CATFVec.size(); i++)
+		{
+			del = "DELETE FROM " + CATFVec[i] + " WHERE aux0 IN " + tsel;
+			if(db->execute(del) == false)
+				return db->errorMessage();
+		}
+	}
+
+// delete selected instances of the auxiliar collection of other themes (TeAttrStatic and TeAttrEvent)
+	unsigned int j;
+	for(i=0; i<CATVec.size(); i++)
+	{
+		for(j=0; j<selVec.size(); j++)
+		{
+			del = "DELETE FROM " + CATVec[i] + " WHERE object_id IN " + selVec[j];
+			if(db->execute(del) == false)
+				return db->errorMessage();
+		}
+	}
+
+// delete selected instances of the auxiliar collection this theme
+	del = "DELETE FROM " + CAT + " WHERE grid_status = 1 OR grid_status = 3";
+	if(db->execute(del) == false)
+		return db->errorMessage();
+
+	return "";
+}
+
+bool TeCopyDatabase(TeDatabase* dbFrom, TeDatabase* dbTo)
+{
+	// -- Step 1 : copies the external tables
+	TeAttrTableVector externs;
+	dbFrom->getAttrTables(externs,TeAttrExternal);
+	if (!externs.empty())
+	{
+		TeDatabasePortal* portal = dbFrom->getPortal();
+		if (!portal)
+		{
+			// log error here
+			return false;
+		}
+
+		for (unsigned int nt=0; nt < externs.size(); nt++)
+		{
+			TeTable table = externs[nt];
+			table.setId(-1);
+			string sql = "select * from " + table.name();
+			if (!portal->query(sql) || portal->numRows() == 0)
+			{
+				portal->freeResult();
+				continue;
+			}
+			if (!dbTo->createTable(table.name(),table.attributeList()))
+			{
+				portal->freeResult();
+				continue;
+			}
+			unsigned int nr=0;
+			while (portal->fetchRow())
+			{
+				TeTableRow row;
+				for(int i = 0; i < portal->numFields(); i++)
+					row.push_back(portal->getData(i));
+				table.add(row);
+				nr++;
+				if (nr % 200)
+				{
+					dbTo->insertTable(table);
+					table.clear();
+					nr = 0;
+				}
+			}
+			if (table.size() >0)
+				dbTo->insertTable(table);
+				table.clear();	
+			dbTo->insertTableInfo(-1,table);
+			portal->freeResult();
+		}
+		delete portal;
+	}
+
+	// -- Step 2: Copies the layers
+	if(!dbFrom->loadLayerSet())
+	{
+		// log error here
+		return false;
+	}
+
+	TeLayerMap& fromLayerMap = dbFrom->layerMap();
+	TeLayerMap::iterator itFrom = fromLayerMap.begin();
+
+	while(itFrom != fromLayerMap.end())
+	{
+		TeLayer* fromLayer = (*itFrom).second;
+		TeLayer* toLayer = new TeLayer(fromLayer->name(), dbTo, fromLayer->projection());
+		map<string, string> tables;
+		if (!TeCopyLayerToLayer(fromLayer, toLayer, &tables))
+		{
+			// log error here: layer couldn�t be copied
+		}
+		++itFrom;
+	}
+	// -- Set 3: Copies the views and themes
+	if(!dbFrom->loadViewSet(dbFrom->user()))
+	{
+		// log error here
+		return false;
+	}
+
+	if(!dbTo->loadLayerSet())
+	{
+		// log error here
+		return false;
+	}
+
+	TeViewMap&	fromViewMap = dbFrom->viewMap();
+	TeViewMap::iterator itvFrom = fromViewMap.begin();
+	while (itvFrom != fromViewMap.end())
+	{
+		TeView* fromView = (*itvFrom).second;			
+		TeView* toView = new TeView();
+
+		TeProjection* toViewProjection = 0;
+		if (fromView->projection())
+			 toViewProjection = TeProjectionFactory::make(fromView->projection()->params());
+		
+		toView->projection(toViewProjection);
+		toView->name(fromView->name());
+		toView->user(dbTo->user());
+		toView->isVisible(fromView->isVisible());
+
+		if (!dbTo->insertView(toView))
+		{
+			// log error here
+			++itvFrom;
+			continue;
+		}
+
+		TeLayerMap& toLayerMap = dbTo->layerMap();			
+		vector<TeViewNode*>& themeVec = fromView->themes();
+		for (unsigned int i = 0; i < themeVec.size(); ++i)
+		{
+			TeTheme* themeFrom = (TeTheme*) themeVec[i];
+			string fromLayerName = themeFrom->layer()->name();
+			TeLayer* toLayer = 0;
+			TeLayerMap::iterator itTo = toLayerMap.begin();
+			while(itTo != toLayerMap.end())
+			{
+				if(itTo->second->name() == fromLayerName)
+				{
+					toLayer = itTo->second;
+					break;
+				}
+				++itTo;
+			}
+
+			if (!toLayer )
+			{
+				// log error here
+				continue;
+			}
+			
+			TeTheme* themeTo = new TeTheme(themeFrom->name(), toLayer);
+			toView->add(themeTo);
+						
+			themeTo->outOfCollectionLegend(themeFrom->outOfCollectionLegend());
+			themeTo->withoutDataConnectionLegend(themeFrom->withoutDataConnectionLegend ());
+			themeTo->defaultLegend(themeFrom->defaultLegend());
+			themeTo->pointingLegend(themeFrom->pointingLegend());
+			themeTo->queryLegend(themeFrom->queryLegend());
+
+			TeAttrTableVector tftablevec = themeFrom->attrTables();
+			TeAttrTableVector tttablevec;
+
+			for (unsigned int nt=0; nt<tftablevec.size(); nt++)
+			{
+				TeTable attTable(tftablevec[nt].name());
+				dbTo->loadTableInfo(attTable);
+				tttablevec.push_back(attTable);
+			}
+			themeTo->setAttTables(tttablevec);
+			themeTo->attributeRest(themeFrom->attributeRest());
+			themeTo->temporalRest(themeFrom->temporalRest());
+			themeTo->spatialRest(themeFrom->spatialRest());
+			themeTo->visibleRep(themeFrom->visibleRep());
+			if(!themeTo->save() || !themeTo->buildCollection())
+			{
+				// log error here
+				continue;
+			}
+			themeTo->generateLabelPositions();
+			
+			if(themeFrom->grouping())
+			{
+				TeGrouping* grouping = new TeGrouping();
+				(*grouping) = (*themeFrom->grouping());
+				
+				themeTo->buildGrouping(grouping);
+				TeLegendEntryVector& legends = themeFrom->legend();
+				for (unsigned int nl=0; nl<legends.size(); nl++)
+					themeTo->setGroupingVisual(nl+1,legends[nl].getVisualMap());
+				if (!themeTo->saveGrouping())
+				{
+						// log error here
+				}
+			}
+		} // end for each theme
+		++itvFrom;
+	} // end for each view
+	return true;
+}
+
+
+
diff --git a/src/terralib/application/TeDatabaseUtils.h b/src/terralib/application/TeDatabaseUtils.h
new file mode 100644
index 0000000..3901baa
--- /dev/null
+++ b/src/terralib/application/TeDatabaseUtils.h
@@ -0,0 +1,179 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeDatabaseUtils.h
+    This contains some utilitary functions to create some tables useful for 
+	TerraView like applications.
+*/
+#ifndef __TERRALIB_INTERNAL_DATABASEUTILS_H
+#define __TERRALIB_INTERNAL_DATABASEUTILS_H
+
+#include "TeThemeApplication.h"
+#include <TeDatabase.h>
+#include <string>
+#include <map>
+
+class	TeView;
+struct	TeKernelParams;
+
+ 
+/*!
+	\fn bool createColorSchemeTable(TeDatabase* db, const string& tname="te_color_scheme")
+	\brief Creates a standard TerraView table to store color ramps 
+ 	\param db pointer to an opened database connection
+ 	\note The table created will have the following scheme:
+ 
+   \par  --------------------------------------------------
+   \par | ramp_name  |  color_order  | red  | green | blue |
+   \par ----------------------------------------------------
+   \par | red        |      1        | 255  |  256  | 256  |
+   \par | red        |      2        | 196  |  195  | 256  |
+   \par | red        |      3        | 123  |  124  | 256  |
+   \par | green      |      1        | 0    |  256  | 123  |
+   \par | ...        |     ...       | ...  |  ...  | ...  |
+   \par ---------------------------------------------------
+*/
+bool createColorSchemeTable(TeDatabase* db, const string& tname="te_color_scheme");
+
+//! Populates a color scheme table with 30 ramp colors, each ramp with 13 shades
+bool populateColorSchemeTable(TeDatabase* db, const string& tname="te_color_scheme");
+
+//! Insert a ramp color entry in the database
+bool insertRampColor(TeDatabase* bd, const string& name, int order, TeColor& color, const string& tableName = "te_color_scheme");
+
+//! Insert some default colors a grid color table
+bool updateGridColor(TeDatabase* bd, int themeId, TeObjectSelectionMode sel, TeColor& color);
+
+//! Creates table to store information about the results of Kernel algorithm
+bool createKernelMetadataTable(TeDatabase* db);
+
+//! Inserts kernel parameters
+bool insertKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar);
+
+//! Updates kernel parameters in a database -- inserts if it does not exist
+bool updateKernelMetadata(TeDatabase* db, TeKernelParams& kernelPar);
+
+//! Creates a table to store multimedia documents 
+bool createMediaTable(TeDatabase* db, const string& tname);
+
+//! Creates a table to store the association between objects of a layer and its multimedia attributes
+bool createLayerMediaTable(TeDatabase* db, int layerId, const string& tname);
+
+//! Inserts a new media file in a database
+bool insertMedia(TeDatabase* db, const string& tableName, string fileName, const string& description, const string& type, bool blob=true);
+
+//! Associates a media data to an object of a layer
+bool insertMediaObjLayer (TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable); 
+
+//! Sets a media as a default media of an object of a layer
+bool setDefaultMedia(TeDatabase* db, TeLayer* layer, const string& objectId, const string& mediaName, const string& mediaTable);
+
+//! Updates a media description in a database
+bool updateMediaDescription(TeDatabase* db, const string& mediaName, const string& mediaTable, const string& desc);
+
+//! Load the kernel parameters 
+bool loadKernelParams (TeDatabase* db, int supThemeId, const string& supTableName, const string& supAttrName, TeKernelParams& KernelPar);
+
+//! Load the kernel parameters 
+bool loadKernelParams (TeDatabase* db, int LayerId, TeKernelParams& KernelPar);
+
+//! Creates a table to store parameters of bar and pie charts 
+bool createChartParamsTable(TeDatabase* db, bool integrity=false);	
+
+//! Retrieves the location of pie/bar charts over the objects of a theme
+bool locatePieBar (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt, double delta);
+
+//! Load the charts parameters of a theme in the database
+bool loadChartParams (TeDatabase* db, TeThemeApplication *theme);
+
+//! Sets the location of pie/bar charts over the objects of a theme
+bool updatePieBarLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt); 
+
+//! Sets the location of point of a layer
+bool updatePointLocation (TeDatabase* db, TeThemeApplication* theme, TeCoord2D pt); 
+
+//! Insert the chart parameters of a theme in the database
+bool insertChartParams(TeDatabase* bd, TeThemeApplication *theme);
+
+//! Delete the chart parameters of a theme in the database
+bool deleteChartParams (TeDatabase* bd, TeThemeApplication *theme);
+
+//! Loads a set of views that belongs to a user
+bool loadViewSet(TeDatabase* db, const string& user);
+
+//! Updates the parameters of a view
+bool updateView(TeDatabase* db, TeView *view);
+
+//! Creates a table to store other information about the theme 
+bool createThemeApplicationTable(TeDatabase* db, bool integrity=false);
+
+//! Populates the te_theme_application table with default parameters
+bool populateThemeApplicationTable(TeDatabase* db);
+
+//! Loads the parameters of a ThemeApplication
+bool loadThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName="te_theme_application");
+
+//! Saves the parameters of a ThemeApplication
+bool insertThemeApplication (TeDatabase* db, TeThemeApplication *theme, const string& tableName="te_theme_application");
+
+//! Updates the parameters of a theme application
+bool updateThemeApplication (TeDatabase* db, TeThemeApplication *theme);
+
+//! Delete a theme application
+bool deleteThemeApplication (TeDatabase* db, int themeId);
+
+//! Recursive load view tree from a database
+TeViewTree* loadViewTree(TeDatabase* db, TeView* view, int id);
+
+//! Updates a tree view structure in a database
+bool updateViewTree (TeDatabase* db, TeViewTree *tree);
+
+//! Creates a table to store metadata about layers 
+int createTeLayerMetadata(TeDatabase* db);
+
+//! Creates a table to store metadata about attribute tables 
+int createTeTableMetadata(TeDatabase* db);
+
+//! Removes tables that visual of texts associated to a layer
+bool deleteTextVisual(TeLayer* layer);
+
+//! Returns true whether a database contains the TerraLib data model
+bool isTerralibModel(TeDatabase* db);
+
+//! insert a new object into collection
+string insertObjectIntoCollection(TeTheme* theme, TeCoord2D p, string newId, string newTId = "");
+
+//! delete pointed objects
+string deletePointedObjects(TeTheme* theme, TeBox& box);
+
+//! \fn bool TeCopyDatabase(TeDatabase* dbFrom, TeDatabase* dbTo)
+/*
+    \brief This function copies the contents of a TerraLib database to another TerraLib database
+	\param dbFrom A pointer to the source database
+	\param dbTo	  A pointer to the destination database
+*/
+bool TeCopyDatabase(TeDatabase* dbFrom, TeDatabase* dbTo);
+
+
+#endif
+
diff --git a/src/terralib/application/TeGUIUtils.cpp b/src/terralib/application/TeGUIUtils.cpp
new file mode 100644
index 0000000..563e40f
--- /dev/null
+++ b/src/terralib/application/TeGUIUtils.cpp
@@ -0,0 +1,141 @@
+#include "TeGUIUtils.h"
+#include <TeViewNode.h>
+#include <TeThemeApplication.h>
+
+bool fillThemeCombo(TeGeomRep tg, TeView* view, QComboBox* cBox, string selName, bool clear)
+{
+	vector<TeViewNode *> themeVec = view->themes();
+//	bool enableWindow = false;
+	
+	if (clear)
+		cBox->clear();
+	
+	int idx = 0;
+	int count = 0;
+	
+	for(unsigned int i=0; i<themeVec.size(); i++)
+	{
+		TeThemeApplication* t = (TeThemeApplication *)themeVec[i];
+		if(t->layer()->hasGeometry(tg))
+		{
+			cBox->insertItem(t->name().c_str());
+			if (!t->name().compare(selName)) {
+				idx = count;
+			}
+			count++;
+		}
+	}
+  
+	if (count > 0) {
+		cBox->setCurrentItem(idx);
+	}
+	
+	return (count > 0);
+}
+
+
+bool fillTableCombo(TeView* view,
+                     QComboBox *cTableCombo, 
+                     QComboBox *cThemeCombo,
+                     string selName, bool clear)
+{
+	TeTable ttable;
+	string tableName;
+	string themeName =  string(cThemeCombo->currentText().ascii());
+	TeTheme* currTheme = view->get(themeName);
+
+	if (currTheme == NULL) 
+		return false;
+
+	TeAttrTableVector atvec;
+  currTheme->getAttTables(atvec);
+	
+	if (atvec.size() == 0)
+		return false;
+
+	if (clear)
+		cTableCombo->clear();
+	int idx = 0;
+	
+	for(unsigned int i=0; i<atvec.size(); i++)
+	{
+		TeTable ttable = atvec[i];
+		tableName = ttable.name();
+		cTableCombo->insertItem(tableName.c_str());
+		if (!selName.compare(tableName)) {
+			idx = i;
+		}
+	}
+	
+	cTableCombo->setCurrentItem(idx);
+	return true;
+}
+
+
+bool fillColumnCombo(TeAttrDataType aType,
+                      TeTheme* theme,
+                      QComboBox *cColumnCombo, 
+                      QComboBox *cTableCombo,
+                      string selName, bool clear) {
+
+//	bool done = false;
+  
+	TeAttributeList columns;
+	TeAttrTableVector atvec;
+  theme->getAttTables(atvec);
+
+	string tableName = string(cTableCombo->currentText().ascii());
+	unsigned int t;
+
+	for (t = 0; t < atvec.size(); t++) {
+		if (!tableName.compare(atvec[t].name()))
+			break;
+	}
+	
+	if (t == atvec.size())
+		return false;
+
+	TeTable ttable = atvec[t];
+	columns = ttable.attributeList();
+	
+	if (clear)
+		cColumnCombo->clear();
+	
+	int idx = 0;
+	int count = 0;
+	
+	for(unsigned int i=0; i<columns.size(); i++)
+	{
+		int type = columns[i].rep_.type_;
+		string colName = columns[i].rep_.name_;	
+		if ((aType == TeUNKNOWN) || (type == aType)) {
+			cColumnCombo->insertItem(colName.c_str());
+			if (!selName.compare(colName)) {
+				idx = count;
+			}
+			count++;
+		}
+	}
+	
+	if (count > 0) 
+		cColumnCombo->setCurrentItem(idx);
+	
+	return count> 0;
+}
+
+bool fillColumnCombo(vector<TeAttrDataType> &aTypeVec,
+                      TeTheme* theme,
+                      QComboBox *cColumnCombo, 
+                      QComboBox *cTableCombo,
+                      string selName, bool clear)
+{
+	bool result = true;
+	
+	for(unsigned int i = 0; i < aTypeVec.size(); i++)
+	{
+		result = fillColumnCombo(aTypeVec[i], theme, cColumnCombo, cTableCombo, selName, clear);
+		if(!result)
+			return false;
+	}
+	return true;
+}
diff --git a/src/terralib/application/TeGUIUtils.h b/src/terralib/application/TeGUIUtils.h
new file mode 100644
index 0000000..4fc5ecd
--- /dev/null
+++ b/src/terralib/application/TeGUIUtils.h
@@ -0,0 +1,42 @@
+#ifndef __GUIUTILSH
+#define __GUIUTILSH
+
+#include <TeDataTypes.h>
+#include <TeView.h>
+#include <qcombobox.h>
+/**
+ * Acha temas na vista que contenham geometria de um determinado tipo
+ **/
+bool fillThemeCombo(TeGeomRep tg, 
+                TeView* view, 
+                QComboBox* cBox, 
+                string selName, bool clear=true);
+
+/**
+ * Acha tabelas de um tema, de um determinado tipo 
+ **/
+
+bool fillTableCombo(TeView* view,
+                     QComboBox *cTableCombo, 
+                     QComboBox *cThemeCombo,
+                     string selName, bool clear=true);
+
+/**
+ * Acha colunas de uma tabela, com um determinado tipo
+ **/
+bool fillColumnCombo(TeAttrDataType aType,
+                     TeTheme* theme,
+                     QComboBox *cColumnCombo, 
+                     QComboBox *cTableCombo,
+                     string selName, bool clear=true);
+
+/**
+ * Acha colunas de uma tabela, com mais de um determinado tipo
+ **/
+bool fillColumnCombo(vector<TeAttrDataType> &aTypeVec,
+                      TeTheme* theme,
+                      QComboBox *cColumnCombo, 
+                      QComboBox *cTableCombo,
+                      string selName, bool clear=true);
+
+#endif
diff --git a/src/terralib/application/TeMSVFactory.cpp b/src/terralib/application/TeMSVFactory.cpp
new file mode 100644
index 0000000..3569ca9
--- /dev/null
+++ b/src/terralib/application/TeMSVFactory.cpp
@@ -0,0 +1,163 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeMSVFactory.h>
+#include <vector>
+
+using namespace std;
+
+static TeSemivariogram_Factory semivar("Semivariogram");
+static TeCorrelogram_Factory	 correlo("Correlogram");
+static TeSemimadogram_Factory  semimad("Semimadogram");
+static TeCovariance_Factory	 covaria("Covariance");
+
+
+///////////////////////////////
+TeMatrix
+TeSemivariogram :: calculate ()
+{
+	TeMatrix		msvar;
+	vector<double>	dis, gam, np;
+	double			dmin, dmax, dirmin, dirmax, tolincr, inc;
+	int				lin, col, nl, nrow, ncol;
+
+	// Le o n�mero de linha e coluna da matriz de entrada
+	nrow = MSVmatrix_->Nrow()-1;
+	ncol = MSVmatrix_->Ncol()-1;
+
+	// Inicializa a matriz de retorno
+	msvar.Init((int)MSVnlag_, 2.);
+
+	// Inicializa vetores auxiliares
+	for (nl=0; nl<MSVnlag_; ++nl)
+	{
+		np.push_back(0.);
+		dis.push_back(0.);
+		gam.push_back(0.);
+	}
+
+	// Define a tolerancia do incremento = 50% do increm.
+	tolincr = MSVincr_/2.;
+
+	// Define dire��o minima e m�xima
+	dirmin = dirmax = 0.0;
+	if (MSVtoldir_ != 90.0)
+	{
+		dirmin = MSVdir_ - MSVtoldir_;
+		dirmax = MSVdir_ + MSVtoldir_;
+	}
+
+	// Inicializa variavel auxiliar
+	inc = MSVincr_;
+
+	for (nl=0; nl<MSVnlag_; ++nl)
+	{
+		dmin = inc - tolincr;
+		dmax = inc + tolincr;
+
+		for (lin=0; lin<nrow; ++lin)
+		{
+			for (col=0; col<ncol; ++col)
+			{
+				if ( MSVtoldir_ == 90.0) // Omnidirecional
+				{
+					if ( lin<col && (*MSVmatrix_)(lin,col)>0. && (*MSVmatrix_)(lin,col)<=tolincr && nl==0 )
+					{
+						np[nl] = np[nl] + 1.;
+						dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+						gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+					}
+					else if ( lin<col && (*MSVmatrix_)(lin,col)>dmin && (*MSVmatrix_)(lin,col)<=dmax && nl!=0 )
+					{
+						np[nl] = np[nl] + 1.;
+						dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+						gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+					}
+				}
+				else // Direcional
+				{
+					if ( lin<col && (*MSVmatrix_)(lin,col)>0. && (*MSVmatrix_)(lin,col)<=tolincr && (*MSVmatrix_)(col,lin)>=dirmin && (*MSVmatrix_)(col,lin)<=dirmax && nl==0 )
+					{
+						np[nl] = np[nl] + 1.;
+						dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+						gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+					}
+					else if ( lin<col && (*MSVmatrix_)(lin,col)>dmin && (*MSVmatrix_)(lin,col)<=dmax && (*MSVmatrix_)(col,lin)>=dirmin && (*MSVmatrix_)(col,lin)<=dirmax && nl!=0 )
+					{
+						np[nl] = np[nl] + 1.;
+						dis[nl] = dis[nl] + (*MSVmatrix_)(lin,col);
+						gam[nl] = gam[nl] + (( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ) * ( (*MSVmatrix_)(lin,lin) - (*MSVmatrix_)(col,col) ));
+					}
+				}
+			}
+		}
+		if (nl != 0)
+			inc = MSVincr_ + inc;
+	}
+
+	// Reporta o semivariograma
+	for (nl=0; nl<MSVnlag_; ++nl)
+	{
+
+		if (np[nl] != 0)
+		{
+			dis[nl] = dis[nl] / np[nl];
+			gam[nl] = (gam[nl] / np[nl])*.5;
+		}
+    
+    	//Preenche a matriz de retorno da funcao
+    	msvar(nl,0) = dis[nl];
+    	msvar(nl,1) = gam[nl];
+	}
+	return msvar;
+}
+
+
+///////////////////////////////
+TeMatrix
+TeCorrelogram :: calculate ()
+{
+	TeMatrix		msvar;
+
+	return msvar;
+}
+
+
+///////////////////////////////
+TeMatrix
+TeSemimadogram :: calculate ()
+{
+	TeMatrix		msvar;
+
+	return msvar;
+}
+
+
+///////////////////////////////
+TeMatrix
+TeCovariance :: calculate ()
+{
+	TeMatrix		msvar;
+
+	return msvar;
+}
diff --git a/src/terralib/application/TeMSVFactory.h b/src/terralib/application/TeMSVFactory.h
new file mode 100644
index 0000000..e06b44b
--- /dev/null
+++ b/src/terralib/application/TeMSVFactory.h
@@ -0,0 +1,192 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef __TERRALIB_INTERNAL_SPATIALMEASUREFACTORY_H
+#define __TERRALIB_INTERNAL_SPATIALMEASUREFACTORY_H
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+
+#include <map>
+#include <string>
+#include <TeMatrix.h>
+#include <TeFactory.h>
+
+using namespace std;
+
+// -- Struct of Parameters 
+struct TeMSVParams
+{
+	TeMatrix	MSVPmatrix_;
+	double		MSVPdir_;
+	double		MSVPtoldir_;
+	double		MSVPincr_;
+	double		MSVPnlag_;
+};
+
+// -- Measures of Spatial Variability 
+class TeMSV		
+{
+public:
+	TeMSV (){};
+	virtual ~TeMSV () {}
+
+	virtual TeMatrix	calculate ()=0;
+	static TeMSV* DefaultObject(TeMSVParams){ return 0; }		
+	void setMatrix(TeMatrix* m) {MSVmatrix_ = m;}
+
+protected:
+	TeMatrix*	MSVmatrix_;
+	double		MSVdir_;
+	double		MSVtoldir_;
+	double		MSVincr_;
+	double		MSVnlag_;		
+};
+
+
+//////////////////////////////////
+class TeSemivariogram : public TeMSV
+{
+public:
+	TeSemivariogram(const TeMSVParams& params){
+		MSVdir_ = params.MSVPdir_;
+		MSVtoldir_ = params.MSVPtoldir_;
+		MSVincr_ = params.MSVPincr_;
+		MSVnlag_ = params.MSVPnlag_;
+	}
+	
+	~TeSemivariogram() { }
+
+	virtual TeMatrix	calculate ();	
+};
+
+
+////////////////////////////////////
+class TeCorrelogram : public TeMSV
+{
+public:
+		TeCorrelogram(const TeMSVParams& params){
+		MSVdir_ = params.MSVPdir_;
+		MSVtoldir_ = params.MSVPtoldir_;
+		MSVincr_ = params.MSVPincr_;
+		MSVnlag_ = params.MSVPnlag_;
+	}		
+	
+	~TeCorrelogram(){};
+
+	virtual TeMatrix	calculate ();	
+};
+
+////////////////////////////////////
+class TeSemimadogram : public TeMSV
+{
+public:
+		TeSemimadogram(const TeMSVParams& params){
+		MSVdir_ = params.MSVPdir_;
+		MSVtoldir_ = params.MSVPtoldir_;
+		MSVincr_ = params.MSVPincr_;
+		MSVnlag_ = params.MSVPnlag_;
+	}		
+	
+	~TeSemimadogram(){};
+
+	virtual TeMatrix	calculate ();	
+};
+
+////////////////////////////////////
+class TeCovariance : public TeMSV
+{
+public:
+		TeCovariance(const TeMSVParams& params){
+		MSVdir_ = params.MSVPdir_;
+		MSVtoldir_ = params.MSVPtoldir_;
+		MSVincr_ = params.MSVPincr_;
+		MSVnlag_ = params.MSVPnlag_;
+	}		
+	
+	~TeCovariance(){};
+
+	virtual TeMatrix	calculate ();	
+};
+
+
+
+
+
+
+//////////////////////////////////////////////
+// -- Factory: Measures of Spatial Variability 
+
+class TeMSVFactory : public TeFactory<TeMSV, TeMSVParams>
+{
+public:
+	TeMSVFactory(const string& name) : TeFactory<TeMSV, TeMSVParams>(name){}
+	virtual TeMSV* build(const TeMSVParams&) = 0;
+};
+
+
+/////////////////////////////
+class TeSemivariogram_Factory : public TeMSVFactory
+{
+public:
+	TeSemivariogram_Factory (const string& name) : TeMSVFactory(name){}
+
+	virtual TeMSV* build(const TeMSVParams& params){return new TeSemivariogram(params);}
+};
+
+
+/////////////////////////////
+class TeCorrelogram_Factory : public TeMSVFactory
+{
+public:
+	TeCorrelogram_Factory (const string& name) : TeMSVFactory (name){}
+
+	virtual TeMSV* build (const TeMSVParams& params){return new TeCorrelogram(params);}
+};
+
+
+/////////////////////////////
+class TeSemimadogram_Factory : public TeMSVFactory
+{
+public:
+	TeSemimadogram_Factory (const string& name) : TeMSVFactory (name){}
+
+	virtual TeMSV* build (const TeMSVParams& params){return new TeSemimadogram(params);}
+};
+
+
+/////////////////////////////
+class TeCovariance_Factory : public TeMSVFactory
+{
+public:
+	TeCovariance_Factory (const string& name) : TeMSVFactory (name){}
+
+	virtual TeMSV* build (const TeMSVParams& params){return new TeCovariance(params);}
+};
+
+
+#endif
+
+
diff --git a/src/terralib/application/TePlotTheme.h b/src/terralib/application/TePlotTheme.h
new file mode 100644
index 0000000..9bdee90
--- /dev/null
+++ b/src/terralib/application/TePlotTheme.h
@@ -0,0 +1,2155 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TePlotTheme.h
+    This file contains support to plot a theme on a canvas
+*/
+#ifndef  __TERRALIB_INTERNAL_PLOTTHEME_H
+#define  __TERRALIB_INTERNAL_PLOTTHEME_H
+
+#include "TeThemeApplication.h"
+#include "TeDatabase.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeVectorRemap.h"
+#include "TeDecoderMemory.h"
+#include <time.h>
+#include <set>
+#include "TeApplicationUtils.h"
+
+template<class Canvas, class Progress>
+void TePlotTextWV(TeThemeApplication* theme, Canvas* canvas, Progress * progress, TeBox box = TeBox())
+{
+	if ((theme->visibleRep() & TeTEXT) == 0)
+		return;
+
+	if(theme->textTable().empty())
+		return;
+	TeDatabase* db = theme->layer()->database();
+	if(db->tableExist(theme->textTable()) == false)
+		return;
+	canvas->setDataProjection (theme->layer()->projection());
+	TeDatabasePortal* plot = db->getPortal();
+
+	string	tabtx = theme->textTable();
+	string	tabs = theme->collectionTable();
+
+	string wherebox;
+	if(box.isValid())
+	{
+		wherebox = "NOT (x >= " + Te2String(box.x2()+4*box.width());
+		wherebox += " OR y >= " + Te2String(box.y2()+2*box.height());
+		wherebox += " OR x <= " + Te2String(box.x1()-4*box.width());
+		wherebox += " OR y <= " + Te2String(box.y1()-2*box.height()) + ")";
+	}
+	else
+	{
+		wherebox = getWhereBox(plot, theme, canvas, TeTEXT, box);
+		if(wherebox.empty())
+		{
+			TeBox box = canvas->getDataWorld();
+			wherebox = " x >= " + Te2String(box.x1());
+			wherebox += " AND x <= " + Te2String(box.x2());
+			wherebox += " AND y >= " + Te2String(box.y1());
+			wherebox += " AND y <= " + Te2String(box.y2());
+		}
+	}
+
+	// calculate initial filed number for collection and legenda (sind and vind)
+	int sind=0, vind=0;
+	string ind = "SELECT * FROM " + tabtx + " WHERE object_id < ' '";
+	plot->freeResult();
+	if (plot->query (ind))
+		sind = plot->AttributeList().size();
+
+	ind = "SELECT * FROM " + tabs + " WHERE c_object_id < ' '";
+	plot->freeResult();
+	if (plot->query (ind))
+		vind = plot->AttributeList().size() + sind;
+
+	int numrows = 0;
+	string conta = "SELECT COUNT(*) FROM " + tabs;
+	plot->freeResult();
+	if (plot->query (conta))
+	{
+		if(plot->fetchRow())
+			numrows = atoi(plot->getData(0));
+	}
+	delete plot;
+
+	string tabv = tabtx + "_txvisual";
+	string sa = "SELECT " + tabtx + ".*, " + tabv + ".*, " + tabs + ".* ";
+	sa += "FROM " + tabtx + ", " + tabv + ", " + tabs;
+	sa += " WHERE (" + tabs + ".c_object_id = " + tabtx + ".object_id";
+	sa += " AND " + tabtx + ".geom_id = " + tabv + ".geom_id)";
+	string squery;
+	squery = sa + " AND (" + wherebox + ")";
+	plotTextWV(theme, canvas, squery, progress);
+
+	string othersQuery = "SELECT " + tabtx + ".*, " + tabv + ".* ";
+	othersQuery += "FROM " + tabtx + ", " + tabv;
+	othersQuery += " WHERE " + tabtx + ".geom_id = " + tabv + ".geom_id";
+	othersQuery += " AND " + tabtx + ".object_id = 'TE_NONE_ID'";
+	plotTextWV(theme, canvas, othersQuery, progress);
+}
+
+template<class Canvas, class Progress>
+void plotTextWV(TeThemeApplication *theme, Canvas *canvas, string query, Progress *progress)
+{
+	TeText	text;
+	int	np = 0;
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	TeDatabasePortal* plot = theme->layer()->database()->getPortal();
+
+	if(progress == 0)
+	{
+		if(plot->query(query) && plot->fetchRow())
+		{
+			t1 = clock();
+			t2 = t1;
+			bool flag = true;
+			do
+			{
+				bool bold = false, italic = false;
+				int	size;
+				int dot_height = atoi(plot->getData(10));
+				bool fixedSize = atoi(plot->getData(11));
+				int rgb = atoi(plot->getData(12));
+				TeColor	cor((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff);
+				string	family = plot->getData(13);
+				if(atoi(plot->getData(14)))
+					bold = true;
+				if(atoi(plot->getData(15)))
+					italic = true;
+
+				flag = plot->fetchGeometry(text);
+				if(fixedSize == false && text.height() > 0.)
+				{
+					TeBox wbox = canvas->getDataWorld();
+					TeCoord2D p1(wbox.x1_, wbox.y1_);
+					TeCoord2D p2(p1.x() + text.height(), p1.y() + text.height());
+					TeBox box(p1, p2);
+					canvas->mapWtoV(box);
+					size = int(box.height());
+				}
+				else
+					size = dot_height;
+
+				canvas->setTextColor(cor.red_, cor.green_, cor.blue_);
+				canvas->setTextStyle (family, size, bold, italic );
+				TeVisual visual;
+				visual.size(size);
+				visual.family(family);
+				visual.bold(bold);
+				visual.italic(italic);
+				visual.fixedSize(fixedSize);
+				visual.ptAngle((int)text.angle());
+
+				canvas->plotText (text, visual);
+				np++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+				}
+			} while (flag);
+			canvas->copyPixmapToWindow();
+		}
+	}
+	else
+	{
+		int steps = 0;
+		string conta = query;
+		int ff;
+		if((ff=conta.find(" FROM ")) >= 0)
+			conta.replace(0, ff, "SELECT COUNT(*)");
+		if((ff=conta.find("ORDER BY")) >= 0)
+			conta.erase(ff, conta.size()-ff);
+		plot->freeResult();
+		if(plot->query(conta) && plot->fetchRow())
+			steps = atoi(plot->getData(0));
+
+		plot->freeResult();
+		if(plot->query(query) && plot->fetchRow())
+		{
+			string caption = "Plotando tema: " + theme->name();
+			progress->setCaption(caption.c_str());
+			progress->setLabelText("      Plotagem de textos em andamento, aguarde...      ");
+			progress->setTotalSteps(steps);
+			t2 = clock();
+			t0 = t1 = t2;
+			bool flag = true;
+			do
+			{
+				bool bold = false, italic = false;
+				int	size;
+				int dot_height = atoi(plot->getData(10));
+				bool fixedSize = atoi(plot->getData(11));
+				int rgb = atoi(plot->getData(12));
+				TeColor	cor((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff);
+				string	family = plot->getData(13);
+				if(atoi(plot->getData(14)))
+					bold = true;
+				if(atoi(plot->getData(15)))
+					italic = true;
+
+				flag = plot->fetchGeometry(text);
+				if(fixedSize == false && text.height() > 0.)
+				{
+					TeBox wbox = canvas->getDataWorld();
+					TeCoord2D p1(wbox.x1_, wbox.y1_);
+					TeCoord2D p2(p1.x() + text.height(), p1.y() + text.height());
+					TeBox box(p1, p2);
+					canvas->mapWtoV(box);
+					size = int(box.height());
+				}
+				else
+					size = dot_height;
+
+				canvas->setTextColor(cor.red_, cor.green_, cor.blue_);
+				canvas->setTextStyle (family, size, bold, italic );
+				TeVisual visual;
+				visual.size(size);
+				visual.family(family);
+				visual.bold(bold);
+				visual.italic(italic);
+				visual.fixedSize(fixedSize);
+				visual.ptAngle((int)text.angle());
+
+				canvas->plotText (text, visual);
+				np++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress->wasCancelled())
+					{
+						progress->reset();
+						break;
+					}
+					if((int)(t2-t0) > dt2)
+						progress->setProgress(np);
+				}
+			} while (flag);
+			canvas->copyPixmapToWindow();
+		}
+		progress->reset();
+	}
+	delete plot;
+}
+
+template<class Canvas, class Progress>
+void TePlotTexts(TeThemeApplication* theme, Canvas* canvas, Progress * progress)
+{
+	if ((theme->visibleRep() & TeTEXT) == 0)
+		return;
+
+	if(theme->textTable().empty())
+		return;
+	TeDatabase* db = theme->layer()->database();
+	if(db->tableExist(theme->textTable()) == false)
+		return;
+	canvas->setDataProjection (theme->layer()->projection());
+	TeDatabasePortal* plot = db->getPortal();
+
+	string	tabtx = theme->textTable();
+	string	tabs = theme->collectionTable();
+
+	string wherebox = getWhereBox(plot, theme, canvas, TeTEXT);
+	if(wherebox.empty())
+	{
+		TeBox box = canvas->getDataWorld();
+		wherebox = " x >= " + Te2String(box.x1());
+		wherebox += " AND x <= " + Te2String(box.x2());
+		wherebox += " AND y >= " + Te2String(box.y1());
+		wherebox += " AND y <= " + Te2String(box.y2());
+	}
+
+	// calculate initial filed number for collection and legenda (sind and vind)
+	int sind=0, vind=0;
+	string ind = "SELECT * FROM " + tabtx + " WHERE object_id < ' '";
+	plot->freeResult();
+	if (plot->query (ind))
+		sind = plot->AttributeList().size();
+
+	ind = "SELECT * FROM " + tabs + " WHERE c_object_id < ' '";
+	plot->freeResult();
+	if (plot->query (ind))
+		vind = plot->AttributeList().size() + sind;
+
+	int numrows = 0;
+	string conta = "SELECT COUNT(*) FROM " + tabs;
+	plot->freeResult();
+	if (plot->query (conta))
+	{
+		if(plot->fetchRow())
+			numrows = atoi(plot->getData(0));
+	}
+	string sa;
+	string sel;
+	if(plot->getDatabase()->dbmsName() == "OracleSpatial")	
+		sel = " SELECT /*+ ordered */ * "; 
+	else
+		sel = " SELECT * ";
+
+	delete plot;
+	if(numrows > 0)
+		sa = sel + " FROM (" + tabtx + " INNER JOIN " + tabs;
+	else
+		sa = sel + " FROM (" + tabtx + " LEFT JOIN " + tabs;
+
+	sa += " ON " + tabtx + ".object_id = " + tabs + ".c_object_id) WHERE ";
+
+	string squery;
+	squery = sa + wherebox;
+	plotTexts(theme, canvas, squery, progress);
+
+	string othersQuery = "SELECT * FROM " + tabtx + " WHERE object_id = 'TE_NONE_ID'";
+	plotTexts(theme, canvas, othersQuery, progress);
+}
+
+template<class Canvas, class Progress>
+void plotTexts(TeThemeApplication *theme, Canvas *canvas, string query, Progress *progress)
+{
+	TeText	text;
+	int	np = 0;
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	TeDatabasePortal* plot = theme->layer()->database()->getPortal();
+
+	if(progress == 0)
+	{
+		if(plot->query(query) && plot->fetchRow())
+		{
+			t1 = clock();
+			t2 = t1;
+			bool flag = true;
+			do
+			{
+				flag = plot->fetchGeometry(text);
+				setTextAttributes(theme, canvas, text);
+				canvas->plotText (text, theme->defaultLegend().visual(TeTEXT));
+				np++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+				}
+			} while (flag);
+			canvas->copyPixmapToWindow();
+		}
+	}
+	else
+	{
+		int steps = 0;
+		string conta = query;
+		conta.replace(0, strlen("SELECT *")+1, "SELECT COUNT(*)");
+		int ff;
+		if((ff=conta.find("ORDER BY")) >= 0)
+			conta.erase(ff, conta.size()-ff);
+		plot->freeResult();
+		if(plot->query(conta) && plot->fetchRow())
+			steps = atoi(plot->getData(0));
+
+		plot->freeResult();
+		if(plot->query(query) && plot->fetchRow())
+		{
+			string caption = "Plotando tema: " + theme->name();
+			progress->setCaption(caption.c_str());
+			progress->setLabelText("      Plotagem de textos em andamento, aguarde...      ");
+			progress->setTotalSteps(steps);
+			t2 = clock();
+			t0 = t1 = t2;
+			bool flag = true;
+			do
+			{
+				flag = plot->fetchGeometry(text);
+				setTextAttributes(theme, canvas, text);
+				canvas->plotText (text, theme->defaultLegend().visual(TeTEXT));
+				np++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress->wasCancelled())
+					{
+						progress->reset();
+						break;
+					}
+					if((int)(t2-t0) > dt2)
+						progress->setProgress(np);
+				}
+			} while (flag);
+			canvas->copyPixmapToWindow();
+		}
+		progress->reset();
+	}
+	delete plot;
+}
+
+template<class Canvas>
+void setTextAttributes(TeThemeApplication* theme, Canvas* canvas, TeText tx)
+{
+	TeColor	cor;
+	static	TeVisual snc;
+	string	family;
+	static int		ssize;
+	int		size = 0;
+	bool	bold, italic, fixedSize;
+
+	if(theme == 0)
+	{
+		ssize = 0;
+		snc.family("notFamily");
+		return;
+	}
+
+	fixedSize = theme->defaultLegend().visual(TeTEXT).fixedSize(); // font size is fixed
+	if(snc == theme->defaultLegend().visual(TeTEXT))
+	{
+		if(fixedSize == false && tx.height() > 0.)
+		{
+			TeBox wbox = canvas->getDataWorld();
+			TeCoord2D p1(wbox.x1_, wbox.y1_);
+			TeCoord2D p2(p1.x() + tx.height(), p1.y() + tx.height());
+			TeBox box(p1, p2);
+			canvas->mapWtoV(box);
+			size = int(box.height());
+		}
+		else
+			size = theme->defaultLegend().visual(TeTEXT).size(); // font size
+	}
+
+	if(size == 0)
+	{
+		if(fixedSize == false && tx.height() > 0.)
+		{
+			TeBox wbox = canvas->getDataWorld();
+			TeCoord2D p1(wbox.x1_, wbox.y1_);
+			TeCoord2D p2(p1.x() + tx.height(), p1.y() + tx.height());
+			TeBox box(p1, p2);
+			canvas->mapWtoV(box);
+			size = int(box.height());
+		}
+		else
+			size = theme->defaultLegend().visual(TeTEXT).size(); // font size
+	}
+
+	cor = theme->defaultLegend().visual(TeTEXT).color();
+	family = theme->defaultLegend().visual(TeTEXT).family();
+	bold = theme->defaultLegend().visual(TeTEXT).bold();
+	italic = theme->defaultLegend().visual(TeTEXT).italic();
+	fixedSize = theme->defaultLegend().visual(TeTEXT).fixedSize(); // font size is fixed
+
+	canvas->setTextColor(cor.red_, cor.green_, cor.blue_);
+	canvas->setTextStyle (family, size, bold, italic );
+	snc = theme->defaultLegend().visual(TeTEXT);
+	ssize = size;
+}
+
+template<class Canvas, class Progress>
+void plotPieBars(TeThemeApplication *theme, Canvas *canvas, Progress *progress, TeBox ebox = TeBox())
+{
+	if((theme->visibleRep() & 0x80000000) == 0)
+		return;
+
+	int steps = 0;
+	int	np = 0;
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 2;
+	clock_t	t0, t1, t2;
+	TeDatabasePortal* plot = theme->layer()->database()->getPortal();
+	canvas->setDataProjection (theme->layer()->projection());
+
+	if(theme->chartAttributes_.size() == 0)
+	{
+		delete plot;
+		return;
+	}
+	double	width = theme->barWidth();
+	double	maxh = theme->barMaxHeight();
+	double	minh = theme->barMinHeight();
+	double	maxd = theme->pieMaxDiameter();
+	double	mind = theme->pieMinDiameter();
+	double	diameter = theme->pieDiameter();
+	string FUNC = theme->chartFunction();
+
+	if(theme->keepDimension() != 0)
+	{
+		width = canvas->mapVtoData((int)width);
+		maxh = canvas->mapVtoData((int)maxh);
+		minh = canvas->mapVtoData((int)minh);
+		maxd = canvas->mapVtoData((int)maxd);
+		mind = canvas->mapVtoData((int)mind);
+		diameter = canvas->mapVtoData((int)diameter);
+	}
+
+	unsigned int i;
+	string	input, cinput;
+	TeSelectedObjects  selectedObjects = theme->chartObjects();
+	
+	if(selectedObjects == TeSelectedByPointing)
+	{
+		input = "(grid_status = 1 OR grid_status = 3";
+		input += " OR (grid_status is null AND (c_object_status = 1 OR c_object_status = 3)))";
+		cinput = "(c_object_status = 1 OR c_object_status = 3)";
+	}
+	else if(selectedObjects == TeNotSelectedByPointing)
+	{
+		input = "(grid_status = 0 OR grid_status = 2";
+		input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+		cinput = "(c_object_status = 0 OR c_object_status = 2)";
+	}
+	else if(selectedObjects == TeSelectedByQuery)
+	{
+		input = "(grid_status = 2 OR grid_status = 3";
+		input += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+		cinput = "(c_object_status = 2 OR c_object_status = 3)";
+	}
+	else if(selectedObjects == TeNotSelectedByQuery)
+	{
+		input = "(grid_status = 0 OR grid_status = 1";
+		input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+		cinput = "(c_object_status = 0 OR c_object_status = 1)";
+	}
+	else if(selectedObjects == TeGrouped)
+	{
+		input = "c_legend_id <> 0";
+		cinput = "c_legend_id <> 0";
+	}
+	else if(selectedObjects == TeNotGrouped)
+	{
+		input = "c_legend_id = 0";
+		cinput = "c_legend_id = 0";
+	}
+
+	canvas->setLineStyle(TeLnTypeContinuous, 0);
+	canvas->setLineColor(0, 0, 0);
+	TeChartType chartType = (TeChartType)theme->chartType();
+	if(chartType == TePieChart)
+	{
+		string wherebox;
+		double delta = diameter / 2.;
+		if(!(theme->pieDimAttribute() == "NONE"))
+			delta = maxd / 2.;
+
+		TeBox box;
+		if(ebox.isValid())
+			box = ebox;
+		else
+			box = canvas->getDataWorld();
+
+		box.x1_ = box.x1_ - delta;
+		box.x2_ = box.x2_ + delta;
+		box.y1_ = box.y1_ - delta;
+		box.y2_ = box.y2_ + delta;
+
+		wherebox = "NOT(label_x > " + Te2String(box.x2_, 10) + " OR ";
+		wherebox = wherebox + "label_x < " + Te2String(box.x1_, 10) + " OR ";
+		wherebox = wherebox + "label_y > " + Te2String(box.y2_, 10) + " OR ";
+		wherebox = wherebox + "label_y < " + Te2String(box.y1_, 10) + ")";
+
+		string attrs, q;
+		for(i=0; i<theme->chartAttributes_.size(); i++)
+			attrs += FUNC + "(" + theme->chartAttributes_[i] + "),";
+		attrs += "AVG(label_x),AVG(label_y)";
+		if(!(theme->pieDimAttribute() == "NONE"))
+			attrs += "," + FUNC + "(" + theme->pieDimAttribute() + ")";
+
+		if(wherebox.empty() && input.empty())
+			q = "SELECT " + attrs + theme->sqlGridFrom();
+		else if(wherebox.empty() && input.empty()==false)
+			q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input;
+		else if(wherebox.empty()==false && input.empty())
+			q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + wherebox;
+		else if(wherebox.empty()==false && input.empty()==false)
+			q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input + " AND " + wherebox;
+		q += " GROUP BY " + theme->collectionTable() + ".c_object_id";
+
+		string conta = "SELECT COUNT(*) FROM " + theme->collectionTable();
+		if(wherebox.empty() && cinput.empty()==false)
+			conta += " WHERE " + cinput;
+		else if(wherebox.empty()==false && cinput.empty())
+			conta += " WHERE " + wherebox;
+		else if(wherebox.empty()==false && cinput.empty()==false)
+			conta += " WHERE " + cinput + " AND " + wherebox;
+		
+		plot->freeResult();
+		if(plot->query(conta) && plot->fetchRow())
+			steps = atoi(plot->getData(0));
+
+		plot->freeResult();
+		if(plot->query(q))
+		{
+			if(progress)
+			{
+				string caption = "Plotando tema: " + theme->name();
+				progress->setCaption(caption.c_str());
+				progress->setLabelText("      Plotagem de tortas em andamento, aguarde...      ");
+				progress->setTotalSteps(steps);
+			}
+			t2 = clock();
+			t0 = t1 = t2;
+			bool b = plot->fetchRow(0);
+			while(b)
+			{
+				double tot = 0.;
+				for(i=0; i<theme->chartAttributes_.size(); i++)
+				{
+					string v = plot->getData(i);
+					if(v.empty())
+					{
+						tot = 0.;
+						break;
+					}
+					tot += atof(v.c_str());
+				}
+				if(tot == 0.)
+				{
+					b = plot->fetchRow();
+					np++;
+					continue;
+				}
+
+				if(!(theme->pieDimAttribute() == "NONE"))
+				{
+					if(theme->chartMaxVal() - theme->chartMinVal() == 0)
+						diameter = 0.;
+					else
+					{
+						double	adim = atof(plot->getData(theme->chartAttributes_.size()+2));
+						double a = (adim - theme->chartMinVal()) / (theme->chartMaxVal() - theme->chartMinVal());
+						diameter = a * (maxd - mind) + mind;
+					}
+				}
+				double	x = atof(plot->getData(theme->chartAttributes_.size())) - diameter / 2.;
+				double	y = atof(plot->getData(theme->chartAttributes_.size()+1)) - diameter / 2.;
+
+				double	a = 0.;
+				for(i=0; i<theme->chartAttributes_.size(); i++)
+				{
+					double b = atof(plot->getData(i)) / tot * 360.;
+					TeColor	cor = theme->chartColors_[i];
+					canvas->setPieColor(cor.red_, cor.green_, cor.blue_);
+					canvas->plotPie(x, y, diameter, diameter, a, b);
+					a += b;
+				}
+				np++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress)
+					{
+						if(progress->wasCancelled())
+						{
+							progress->reset();
+							break;
+						}
+						if((int)(t2-t0) > dt2)
+							progress->setProgress(np);
+					}
+				}
+				b = plot->fetchRow();
+			}
+			canvas->copyPixmapToWindow();
+		}
+	}
+	else
+	{
+		double	n = theme->chartAttributes_.size();
+		double	maxv = theme->chartMaxVal();
+		double	minv = theme->chartMinVal();
+		double delta = maxh / 2.;
+
+		string wherebox;
+
+		TeBox box;
+		if(ebox.isValid())
+			box = ebox;
+		else
+			box = canvas->getDataWorld();
+
+		box.x1_ = box.x1_ - delta;
+		box.x2_ = box.x2_ + delta;
+		box.y1_ = box.y1_ - delta;
+		box.y2_ = box.y2_ + delta;
+
+		wherebox = "NOT(label_x > " + Te2String(box.x2_, 10) + " OR ";
+		wherebox = wherebox + "label_x < " + Te2String(box.x1_, 10) + " OR ";
+		wherebox = wherebox + "label_y > " + Te2String(box.y2_, 10) + " OR ";
+		wherebox = wherebox + "label_y < " + Te2String(box.y1_, 10) + ")";
+
+		string attrs, q;
+		for(i=0; i<theme->chartAttributes_.size(); i++)
+			attrs += FUNC + "(" + theme->chartAttributes_[i] + "),";
+		attrs += "AVG(label_x),AVG(label_y)";
+
+		if(wherebox.empty() && input.empty())
+			q = "SELECT " + attrs + theme->sqlGridFrom();
+		else if (wherebox.empty() == false && input.empty() == false)
+			q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input + " AND " + wherebox;
+		else if (wherebox.empty() == false && input.empty())
+			q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + wherebox;
+		else if (wherebox.empty() && input.empty() == false)
+			q = "SELECT " + attrs + theme->sqlGridFrom() + " WHERE " + input;
+		q += " GROUP BY " + theme->collectionTable() + ".c_object_id";
+
+		string conta = "SELECT COUNT(*) FROM " + theme->collectionTable();
+		if(wherebox.empty() && cinput.empty()==false)
+			conta += " WHERE " + cinput;
+		else if(wherebox.empty()==false && cinput.empty())
+			conta += " WHERE " + wherebox;
+		else if(wherebox.empty()==false && cinput.empty()==false)
+			conta += " WHERE " + cinput + " AND " + wherebox;
+
+		plot->freeResult();
+		if(plot->query(conta) && plot->fetchRow())
+			steps = atoi(plot->getData(0));
+
+		vector<double> dvec;
+		plot->freeResult();
+		if(plot->query(q))
+		{
+			if(progress)
+			{
+				string caption = "Plotando tema: " + theme->name();
+				progress->setCaption(caption.c_str());
+				progress->setLabelText("      Plotagem de barras em andamento, aguarde...      ");
+				progress->setTotalSteps(steps);
+			}
+			t2 = clock();
+			t0 = t1 = t2;
+			bool b = plot->fetchRow(0);
+			while(b)
+			{
+				double	x = atof(plot->getData(theme->chartAttributes_.size())) - n * width / 2.;
+				double	y = atof(plot->getData(theme->chartAttributes_.size()+1));
+
+				dvec.clear();
+				for(i=0; i<theme->chartAttributes_.size(); i++)
+				{
+					string val = plot->getData(i);
+					if(val.empty())
+					{
+						dvec.clear();
+						break;
+					}
+					dvec.push_back(atof(val.c_str()));
+				}
+
+				for(i=0; i<dvec.size(); i++)
+				{
+					double height;
+					double v = dvec[i];
+					if(maxv - minv == 0)
+						height = 0.;
+					else
+						height = (v - minv) * (maxh - minh) / (maxv - minv) + minh;
+					TeColor	cor = theme->chartColors_[i];
+					canvas->setRectColor(cor.red_, cor.green_, cor.blue_);
+					canvas->plotRect(x, y, width, height);
+					x += width;
+				}
+				np++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress)
+					{
+						if(progress->wasCancelled())
+						{
+							progress->reset();
+							break;
+						}
+						if((int)(t2-t0) > dt2)
+							progress->setProgress(np);
+					}
+				}
+				b = plot->fetchRow();
+			}
+			canvas->copyPixmapToWindow();
+		}
+	}
+	if(progress)
+		progress->reset();
+	delete plot;
+}
+
+
+template<class Portal, class Canvas>
+string getWhereBox(Portal *plot, TeThemeApplication *theme, Canvas *canvas, TeGeomRep rep, TeBox bbox = TeBox())
+{
+	string wherebox;
+	if(theme->chartSelected_.empty() == true)
+	{
+		TeBox box;
+		if(bbox.isValid())
+			box = bbox;
+		else
+			box = canvas->getDataWorld ();
+		wherebox = plot->getDatabase()->getSQLBoxWhere(box, rep);
+	}
+	else
+	{
+		if (rep == TePOINTS)
+		{
+			double	width = theme->barWidth();
+			double	maxh = theme->barMaxHeight();
+			double	minh = theme->barMinHeight();
+			double	maxd = theme->pieMaxDiameter();
+			double	mind = theme->pieMinDiameter();
+			double	diameter = theme->pieDiameter();
+			double	delta;
+
+			if(theme->keepDimension() != 0)
+			{
+				width = canvas->mapVtoData((int)width);
+				maxh = canvas->mapVtoData((int)maxh);
+				minh = canvas->mapVtoData((int)minh);
+				maxd = canvas->mapVtoData((int)maxd);
+				mind = canvas->mapVtoData((int)mind);
+				diameter = canvas->mapVtoData((int)diameter);
+			}
+
+			TeChartType chartType = (TeChartType)theme->chartType();
+			if(chartType == TePieChart)
+			{
+				delta = diameter / 2.;
+				if(!(theme->pieDimAttribute() == "NONE"))
+					delta = maxd / 2.;
+			}
+			else
+				delta = maxh / 2.;
+
+			string sel = "SELECT label_x, label_y FROM " + theme->collectionTable();
+			sel += " WHERE c_object_id = '" + theme->chartSelected_ + "'";
+			plot->freeResult();
+			if(plot->query(sel))
+			{
+				bool b = plot->fetchRow(0);
+				if(b == false)
+					return wherebox;
+				if(b)
+				{
+					double x = atof(plot->getData(0));
+					double y = atof(plot->getData(1));
+					string xmin = Te2String(x - delta);
+					string xmax = Te2String(x + delta);
+					string ymin = Te2String(y - delta);
+					string ymax = Te2String(y + delta);
+					wherebox = "label_x > " + xmin + " AND ";
+					wherebox += "label_x < " + xmax + " AND ";
+					wherebox += "label_y > " + ymin + " AND ";
+					wherebox += "label_y < " + ymax;
+				}
+			}
+		}
+		else if(rep == TePOLYGONS || rep == TeLINES || rep == TeCELLS)
+		{
+			string tab;
+			if(rep == TePOLYGONS)
+				tab = theme->layer()->tableName(TePOLYGONS);
+			else if (rep == TeLINES)
+				tab = theme->layer()->tableName(TeLINES);
+			else if (rep == TeCELLS)
+				tab = theme->layer()->tableName(TeCELLS);
+			
+			plot->freeResult();
+
+			TeBox b;
+			bool result = plot->getDatabase()->getMBRGeom(tab, theme->chartSelected_, b, "spatial_data");
+			if(!result)
+				return wherebox;
+			else
+				wherebox = plot->getDatabase()->getSQLBoxWhere(b, rep);
+		}
+	}
+	return wherebox;
+}
+
+template<class Portal>
+TeVisual getVisual(Portal* portal, TeThemeApplication* theme, TeGeomRep GEOMREP, int resPos, int groPos, int ownPos)
+{
+	TeVisual visual;
+	TeDatabase* db = theme->layer()->database();
+	TeLegendEntry* legendEntry;
+
+	int status = atoi(portal->getData(resPos));
+	int groId = atoi(portal->getData(groPos));
+	int ownId = atoi(portal->getData(ownPos));
+
+	if(groId && (theme->visibleRep()&0x40000000))
+		legendEntry = db->legendMap()[groId];
+	else if(ownId != 0)
+		legendEntry = db->legendMap()[ownId];
+	else
+		legendEntry = &(theme->defaultLegend());
+	
+//	if(legendEntry)
+//		visual = legendEntry->visual(GEOMREP);
+//	else
+//		visual = TeVisual(GEOMREP);
+/////////////////////////////////////////////////////////
+	TeGeomRepVisualMap vm = legendEntry->getVisualMap();
+	if(legendEntry && vm.find(GEOMREP) != vm.end())
+		visual = legendEntry->visual(GEOMREP);
+	else
+	{
+		if(ownId != 0)
+			legendEntry = db->legendMap()[ownId];
+		else
+			legendEntry = &(theme->defaultLegend());
+
+		visual = legendEntry->visual(GEOMREP);
+	}
+/////////////////////////////////////////////////////////
+
+	if(status == 1)
+		visual.color(theme->pointingLegend().visual(TePOLYGONS).color());
+	else if(status == 2)
+		visual.color(theme->queryLegend().visual(TePOLYGONS).color());
+	else if(status == 3)
+		visual.color(theme->queryAndPointingLegend().visual(TePOLYGONS).color());
+
+	return visual;
+}
+
+template<class Canvas , class Progress>
+void TePlotObjects (TeThemeApplication *theme, Canvas *canvas, map<int, RepMap>& layerRepMap, Progress *progress = 0, TeBox box = TeBox())
+{
+	string tableName, objectId;
+	TeColor color;
+	TeVisual visual;
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	int nSteps, nLoops;
+
+
+	TeLayer *layer = theme->layer();
+	TeDatabase *db = layer->database();
+	TeDatabasePortal *portal = db->getPortal();
+	canvas->setDataProjection (layer->projection());
+	map<int, RepMap>::iterator it = layerRepMap.find(layer->id());
+
+	TeBox vb = box;
+	if(box.isValid())
+	{
+		canvas->mapDataWorldToCanvasWorld(vb);
+		canvas->mapCanvasWorldToViewport(vb);
+	}
+
+	if (layer->hasGeometry(TeRASTER) && (theme->visibleRep() & TeRASTER))
+	{
+		TeBox bIn;
+		if (box.isValid())
+		{
+			canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+			bIn = vb;	
+		}
+	
+		TeRaster* raster = theme->layer()->raster();
+		if (!theme->rasterVisual())
+			theme->createRasterVisual();
+	
+		canvas->plotRaster(raster,theme->rasterVisual(),progress);
+	}	
+	if(layer->hasGeometry(TePOLYGONS) && (theme->visibleRep() & TePOLYGONS))
+	{
+		nLoops = 0;
+		// query the database table containing the polygons� geometry
+		string wherebox = getWhereBox(portal, theme, canvas, TePOLYGONS, box);
+		tableName = layer->tableName(TePOLYGONS);
+
+		string queryPolygons  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+		queryPolygons += " FROM " + tableName + ", " + theme->collectionTable();
+		queryPolygons += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryPolygons += " AND " + wherebox;
+
+		if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+			queryPolygons += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+		else
+			queryPolygons += " ORDER BY object_id ASC";
+
+		//Calculate the number of polygons to be drawn
+		string selectPolyCount; 
+		if(db->dbmsName()=="SqlServerAdo")
+			selectPolyCount="SELECT COUNT(DISTINCT(parent_id)) FROM ";
+		else if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+			selectPolyCount = "SELECT DISTINCT parent_id FROM ";
+		else
+			selectPolyCount = "SELECT DISTINCT object_id FROM ";
+
+		selectPolyCount += tableName + ", " + theme->collectionTable() + " WHERE c_object_id = object_id";
+		if(wherebox.empty() == false)
+			selectPolyCount += " AND " + wherebox;
+
+		string polyCount;
+		if(db->dbmsName() =="SqlServerAdo")
+			polyCount=selectPolyCount;
+		else if(db->dbmsName() == "PostgreSQL" || db->dbmsName() == "PostGIS")
+			polyCount = "SELECT COUNT(*) FROM (" + selectPolyCount + ") AS r";		
+		else if(db->dbmsName() == "MySQL")
+		{
+			string createTempTable = "CREATE TEMPORARY TABLE count_table " + selectPolyCount;
+			db->execute(createTempTable);
+			polyCount = "SELECT COUNT(*) FROM count_table";
+		}
+		else 
+			polyCount = "SELECT COUNT(*) FROM (" + selectPolyCount + ")";
+		
+		if (portal->query(polyCount))
+		{
+			if (portal->fetchRow())
+				nSteps = atoi(portal->getData(0));
+		}
+		else
+		{
+			delete portal;
+			return;
+		}
+
+		if (db->dbmsName() == "MySQL")
+			db->execute("DROP TABLE count_table");
+
+		portal->freeResult();
+
+		//Plot the polygons whose number was placed in nSteps
+		if(db->dbmsName() == "PostgreSQL" || db->dbmsName() == "PostGIS")
+		{
+			 if(portal->query(queryPolygons, TeSERVERSIDE, TeUNIDIRECTIONAL, TeREADONLY, TeBINARYCURSOR) == false)
+			 {
+				delete portal;
+				return;
+			 } 
+		}
+		else
+		{
+			if (portal->query(queryPolygons) == false)
+			{
+				delete portal;
+				return;
+			}
+		}
+
+		int	groPos = portal->AttributeList().size() - 3;
+		int	ownPos = portal->AttributeList().size() - 2;
+		int	resPos = portal->AttributeList().size() - 1;
+		
+		progress->setTotalSteps(nSteps);
+		t2 = clock();
+		t0 = t1 = t2;
+		if(portal->fetchRow())
+		{
+			bool flag;
+			flag = true;
+			do
+			{
+				int geomId = atoi(portal->getData(0));					
+				TePolygon poly;
+				visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos);					
+				color = visual.color();
+				canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+				canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+				color = visual.contourColor();
+				canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+				canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+				if(box.isValid())
+					canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+				if(it == layerRepMap.end())
+				{
+					flag = portal->fetchGeometry(poly);
+					canvas->plotPolygon(poly);
+				}
+				else
+				{
+					canvas->plotPolygon(layerRepMap[layer->id()].polygonMap_[geomId]);
+					int parent_id = atoi(portal->getData(4));
+					int parent = parent_id;
+					while(parent == parent_id)
+					{
+						flag = portal->fetchRow();
+						if(flag)
+							parent = atoi(portal->getData(4));
+						else
+							parent = -1;
+					}
+				}
+				t2 = clock();
+				nLoops++;
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress->wasCancelled())
+					{
+						progress->reset();
+						break;
+					}
+					if((int)(t2-t0) > dt2)
+						progress->setProgress(nLoops);
+				}
+			}
+			while (flag);
+		}
+		progress->reset();
+	}
+
+	if(box.isValid())
+		canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+	if(layer->hasGeometry(TeCELLS) && (theme->visibleRep() & TeCELLS))
+	{
+		nLoops = 0;
+		// query the database table containing the polygons� geometry
+		string wherebox = getWhereBox(portal, theme, canvas, TeCELLS, box);
+		tableName = layer->tableName(TeCELLS);
+
+		string queryCells  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+		queryCells += " FROM " + tableName + ", " + theme->collectionTable();
+		queryCells += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryCells += " AND " + wherebox;
+
+		string cellsCount = "SELECT COUNT(*) FROM " + tableName + ", " + theme->collectionTable();
+		cellsCount += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			cellsCount += " AND " + wherebox;
+		
+		portal->freeResult();
+		if (portal->query(cellsCount))
+		{
+			if (portal->fetchRow())
+				nSteps = atoi(portal->getData(0));
+		}
+		else
+		{
+			delete portal;
+			return;
+		}
+
+		portal->freeResult();
+		if (portal->query(queryCells) == false)
+		{
+			delete portal;
+			return;
+		}
+		int	groPos = portal->AttributeList().size() - 3;
+		int	ownPos = portal->AttributeList().size() - 2;
+		int	resPos = portal->AttributeList().size() - 1;
+
+		progress->setTotalSteps(nSteps);
+		t2 = clock();
+		t0 = t1 = t2;
+		if(portal->fetchRow())
+		{
+			bool flag;
+			flag = true;
+			do
+			{
+				TeCell cell;
+				visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos);	//use TePOLYGONS				
+				color = visual.color();
+				canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+				canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+				color = visual.contourColor();
+				canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+				canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+				flag = portal->fetchGeometry(cell);
+				canvas->plotCell(cell);
+				t2 = clock();
+				nLoops++;
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress->wasCancelled())
+					{
+						progress->reset();
+						break;
+					}
+					if((int)(t2-t0) > dt2)
+						progress->setProgress(nLoops);
+				}
+			}
+			while (flag);
+		}
+		progress->reset();
+	}
+
+	if (layer->hasGeometry(TeLINES) && (theme->visibleRep() & TeLINES))
+	{
+		nLoops = 0;
+		string wherebox = getWhereBox(portal, theme, canvas, TeLINES, box);
+		// query the database table containing the lines� geometry
+		tableName = layer->tableName(TeLINES);
+
+		string queryLines  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+		queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+		queryLines += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryLines += " AND " + wherebox;
+
+		string linesCount = "SELECT COUNT(*) FROM " + tableName + ", " + theme->collectionTable();
+		linesCount += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			linesCount += " AND " + wherebox;
+
+		portal->freeResult();
+		if (portal->query(linesCount))
+		{
+			if (portal->fetchRow())
+				nSteps = atoi(portal->getData(0));
+		}
+		else
+		{
+			delete portal;
+			return;
+		}
+
+		portal->freeResult();
+		if (portal->query(queryLines) == false)
+		{
+			delete portal;
+			return;
+		}
+		int	groPos = portal->AttributeList().size() - 3;
+		int	ownPos = portal->AttributeList().size() - 2;
+		int	resPos = portal->AttributeList().size() - 1;
+
+		progress->setTotalSteps(nSteps);
+		t2 = clock();
+		t0 = t1 = t2;
+		if(portal->fetchRow())
+		{
+			bool flag = true;
+			do
+			{
+				int geomId = atoi(portal->getData(0));					
+				TeLine2D line;
+				visual = getVisual(portal, theme, TeLINES, resPos, groPos, ownPos);					
+				color = visual.color();
+				canvas->setLineColor(color.red_, color.green_, color.blue_);
+				canvas->setLineStyle((int)visual.style(),visual.width());
+				if(it == layerRepMap.end())
+				{
+					flag = portal->fetchGeometry(line);
+					canvas->plotLine(line);
+				}
+				else
+				{
+					canvas->plotLine(layerRepMap[layer->id()].lineMap_[geomId]);
+					flag = portal->fetchRow();
+				}
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress->wasCancelled())
+					{
+						progress->reset();
+						break;
+					}
+					if((int)(t2-t0) > dt2)
+						progress->setProgress(int(t2));
+				}
+			}
+			while (flag);
+		}
+		progress->reset();
+	}
+
+	if (layer->hasGeometry(TePOINTS) && (theme->visibleRep() & TePOINTS))
+	{
+		nLoops = 0;
+		string wherebox = getWhereBox(portal, theme, canvas, TePOINTS, box);
+		// query the database table containing the points� geometry
+		tableName = layer->tableName(TePOINTS);
+
+		string queryPoints  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+		queryPoints += " FROM " + tableName + ", " + theme->collectionTable();
+		queryPoints += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryPoints += " AND " + wherebox;
+
+		string pointsCount = "SELECT COUNT(*) FROM " + tableName + ", " + theme->collectionTable();
+		pointsCount += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			pointsCount += " AND " + wherebox;
+
+		portal->freeResult();
+		if (portal->query(pointsCount))
+		{
+			if (portal->fetchRow())
+				nSteps = atoi(portal->getData(0));
+		}
+		else
+		{
+			delete portal;
+			return;
+		}
+
+		portal->freeResult();
+		if (portal->query(queryPoints) == false)
+		{
+			delete portal;
+			return;
+		}
+		int	groPos = portal->AttributeList().size() - 3;
+		int	ownPos = portal->AttributeList().size() - 2;
+		int	resPos = portal->AttributeList().size() - 1;
+
+		progress->setTotalSteps(nSteps);
+		t2 = clock();
+		t0 = t1 = t2;
+		if(portal->fetchRow())
+		{
+			bool flag = true;
+			do
+			{
+				TePoint point;
+				visual = getVisual(portal, theme, TePOINTS, resPos, groPos, ownPos);					
+				color = visual.color();
+				canvas->setPointColor(color.red_, color.green_, color.blue_);
+				canvas->setPointStyle((int)visual.style(),visual.size());
+				flag = portal->fetchGeometry(point);
+				canvas->plotPoint(point);
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					canvas->copyPixmapToWindow();
+					if(progress->wasCancelled())
+					{
+						progress->reset();
+						break;
+					}
+					if((int)(t2-t0) > dt2)
+						progress->setProgress(int(t2));
+				}
+			}
+			while (flag);
+		}
+		progress->reset();
+	}
+	delete portal;
+
+	if(box.isValid())
+		canvas->setClipping(false);
+}
+
+
+
+template<class Canvas , class Progress>
+TeBox TePlotSelectedObjects(TeThemeApplication *theme, Canvas *canvas, set<string>& drawSet, map<int, RepMap>& layerRepMap, Progress * /* progress */ = 0, TeGeomRepVisualMap* visualMap = 0)
+{
+	TeBox	boxRet;
+	int i, nLoops;
+	int dt = CLOCKS_PER_SEC/4;
+	clock_t	t0, t1, t2;
+	vector<string> inClauseVector;
+
+	TeLayer *layer = theme->layer();
+	TeDatabase *db = layer->database();
+	TeDatabasePortal *portal = db->getPortal();
+	canvas->setDataProjection (layer->projection());
+	string TC = theme->collectionTable();
+
+	string tableName, objectId;
+	TeColor color;
+	TeVisual	visual;
+
+	set<string>::iterator itB = drawSet.begin();
+	set<string>::iterator itE = drawSet.end();
+	inClauseVector = generateInClauses(itB,itE, db);
+
+	if (layer->hasGeometry(TePOLYGONS) && (theme->visibleRep() & TePOLYGONS))
+	{
+		map<int, RepMap>::iterator it = layerRepMap.find(layer->id());
+//		nLoops = 0;
+//		progress->setTotalSteps(drawSet.size());
+		t2 = clock();
+		t0 = t1 = t2;
+
+		bool hasVisual = false;
+
+		if(visualMap)
+			hasVisual = (visualMap->find(TePOLYGONS) != visualMap->end());
+
+		TeVisual visualPol;
+
+		if(hasVisual)
+			visualPol = (*visualMap)[TePOLYGONS];
+
+
+		for (i = 0; i < (int)inClauseVector.size(); ++i)
+		{
+			// query the database table containing the polygons� geometry
+			tableName = layer->tableName(TePOLYGONS);
+			string queryPolygons  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+			queryPolygons += " FROM " + tableName + ", " + theme->collectionTable();
+			queryPolygons += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+			
+			if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+				queryPolygons += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+			else
+				queryPolygons += " ORDER BY object_id ASC";
+
+			portal->freeResult();
+			if (portal->query(queryPolygons) == false)
+			{
+				delete portal;
+				return boxRet;
+			}
+			int	groPos = portal->AttributeList().size() - 3;
+			int	ownPos = portal->AttributeList().size() - 2;
+			int	resPos = portal->AttributeList().size() - 1;
+
+			if(portal->fetchRow())
+			{
+				bool flag = true;
+				do
+				{
+					TePolygon poly;
+
+					if(hasVisual)
+					{
+						color = visualPol.color();
+						canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+						canvas->setPolygonStyle((int)visualPol.style(),visualPol.transparency());
+						color = visualPol.contourColor();
+						canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+						canvas->setPolygonLineStyle((int)visualPol.contourStyle(),visualPol.contourWidth());
+					}
+					else
+					{
+						visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos);					
+						color = visual.color();
+						canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+						canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+						color = visual.contourColor();
+						canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+						canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+					}
+
+					if(it == layerRepMap.end())
+					{
+						flag = portal->fetchGeometry(poly);
+						boxRet = TeUnion(boxRet, poly.box());
+						canvas->plotPolygon(poly);
+					}
+					else
+					{
+						int geomId = atoi(portal->getData(0));					
+						int parent_id = atoi(portal->getData(4));
+						int parent = parent_id;
+						while(parent == parent_id)
+						{
+							flag = portal->fetchRow();
+							if(flag)
+								parent = atoi(portal->getData(4));
+							else
+								parent = -1;
+						}
+						boxRet = TeUnion(boxRet, layerRepMap[layer->id()].polygonMap_[geomId].box());
+						canvas->plotPolygon(layerRepMap[layer->id()].polygonMap_[geomId]);
+					}
+					t2 = clock();
+//					nLoops++;
+					if (int(t2-t1) > dt)
+					{
+						t1 = t2;
+						canvas->copyPixmap1ToWindow();
+//						if(progress->wasCancelled())
+//							break;
+//						progress->setProgress(nLoops);
+					}
+				}
+				while (flag);
+			}
+		}
+//		progress->reset();
+	}
+
+	if (layer->hasGeometry(TeCELLS) && (theme->visibleRep() & TeCELLS))
+	{
+//		nLoops = 0;
+//		progress->setTotalSteps(drawSet.size());
+		t2 = clock();
+		t0 = t1 = t2;
+
+		bool hasVisual = false;
+
+		if(visualMap)
+			hasVisual = (visualMap->find(TeCELLS) != visualMap->end());
+
+		TeVisual visualCell;
+
+		if(hasVisual)
+			visualCell = (*visualMap)[TeCELLS];
+
+
+		for (i = 0; i < (int)inClauseVector.size(); ++i)
+		{
+			// query the database table containing the lines� geometry
+			tableName = layer->tableName(TeCELLS);
+			string queryCells  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+			queryCells += " FROM " + tableName + ", " + theme->collectionTable();
+			queryCells += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+			portal->freeResult();
+			if (portal->query(queryCells) == false)
+			{
+				delete portal;
+				return boxRet;
+			}
+			int	groPos = portal->AttributeList().size() - 3;
+			int	ownPos = portal->AttributeList().size() - 2;
+			int	resPos = portal->AttributeList().size() - 1;
+			
+			if(portal->fetchRow())
+			{
+				bool flag = true;
+				do
+				{
+					TeCell cell;
+
+					if(hasVisual)
+					{
+						color = visualCell.color();
+						canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+						canvas->setPolygonStyle((int)visualCell.style(),visualCell.transparency());
+						color = visualCell.contourColor();
+						canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+						canvas->setPolygonLineStyle((int)visualCell.contourStyle(),visualCell.contourWidth());
+					}
+					else
+					{
+
+						visual = getVisual(portal, theme, TePOLYGONS, resPos, groPos, ownPos);	//use TePOLYGONS				
+						color = visual.color();
+						canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+						canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+						color = visual.contourColor();
+						canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+						canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+					}
+
+					flag = portal->fetchGeometry(cell);
+					boxRet = TeUnion(boxRet, cell.box());
+					canvas->plotCell(cell);
+					t2 = clock();
+//					nLoops++;
+					if (int(t2-t1) > dt)
+					{
+						t1 = t2;
+						canvas->copyPixmap1ToWindow();
+//						if(progress->wasCancelled())
+//							break;
+//						progress->setProgress(nLoops);
+					}
+				}
+				while (flag);
+			}
+		}
+//		progress->reset();
+	}
+
+	if (layer->hasGeometry(TeLINES) && (theme->visibleRep() & TeLINES))
+	{
+//		nLoops = 0;
+//		progress->setTotalSteps(drawSet.size());
+		t2 = clock();
+		t0 = t1 = t2;
+
+		bool hasVisual = false;
+
+		if(visualMap)
+			hasVisual = (visualMap->find(TeLINES) != visualMap->end());
+
+		TeVisual visualLin;
+
+		if(hasVisual)
+			visualLin = (*visualMap)[TeLINES];
+
+
+		for (i = 0; i < (int)inClauseVector.size(); ++i)
+		{
+			// query the database table containing the lines� geometry
+			tableName = layer->tableName(TeLINES);
+			string queryLines  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+			queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+			queryLines += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+			portal->freeResult();
+			if (portal->query(queryLines) == false)
+			{
+				delete portal;
+				return boxRet;
+			}
+			int	groPos = portal->AttributeList().size() - 3;
+			int	ownPos = portal->AttributeList().size() - 2;
+			int	resPos = portal->AttributeList().size() - 1;
+
+			if(portal->fetchRow())
+			{
+				bool flag = true;
+				do
+				{
+					TeLine2D line;
+
+					if(hasVisual)
+					{
+						color = visualLin.color();
+						canvas->setLineColor(color.red_, color.green_, color.blue_);
+						canvas->setLineStyle((int)visualLin.style(),visualLin.width());
+					}
+					else
+					{
+						visual = getVisual(portal, theme, TeLINES, resPos, groPos, ownPos);					
+						color = visual.color();
+						canvas->setLineColor(color.red_, color.green_, color.blue_);
+						canvas->setLineStyle((int)visual.style(),visual.width());
+					}
+
+					flag = portal->fetchGeometry(line);
+					boxRet = TeUnion(boxRet, line.box());
+					canvas->plotLine(line);
+					t2 = clock();
+//					nLoops++;
+					if (int(t2-t1) > dt)
+					{
+						t1 = t2;
+						canvas->copyPixmap1ToWindow();
+//						if(progress->wasCancelled())
+//							break;
+//						progress->setProgress(nLoops);
+					}
+				}
+				while (flag);
+			}
+		}
+//		progress->reset();
+	}
+
+	if (layer->hasGeometry(TePOINTS) && (theme->visibleRep() & TePOINTS))
+	{
+		nLoops = 0;
+//		progress->setTotalSteps(drawSet.size());
+		t2 = clock();
+		t0 = t1 = t2;
+
+		bool hasVisual = false;
+
+		if(visualMap)
+			hasVisual = (visualMap->find(TePOINTS) != visualMap->end());
+
+		TeVisual visualPt;
+
+		if(hasVisual)
+			visualPt = (*visualMap)[TePOINTS];
+
+
+
+		for (i = 0; i < (int)inClauseVector.size(); ++i)
+		{
+			// query the database table containing the points� geometry
+			tableName = layer->tableName(TePOINTS);
+			string queryLines  = "SELECT " + tableName + ".*, c_legend_id, c_legend_own, c_object_status";
+			queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+			queryLines += " WHERE object_id = c_object_id AND object_id IN " + inClauseVector[i];
+
+			portal->freeResult();
+			if (portal->query(queryLines) == false)
+			{
+				delete portal;
+				return boxRet;
+			}
+			int	groPos = portal->AttributeList().size() - 3;
+			int	ownPos = portal->AttributeList().size() - 2;
+			int	resPos = portal->AttributeList().size() - 1;
+
+			if(portal->fetchRow())
+			{
+				bool flag = true;
+				do
+				{
+					TePoint point;
+
+					if(hasVisual)
+					{
+						color = visualPt.color();
+						canvas->setPointColor(color.red_, color.green_, color.blue_);
+						canvas->setPointStyle((int)visualPt.style(),visualPt.size());
+					}
+					else
+					{
+						visual = getVisual(portal, theme, TePOINTS, resPos, groPos, ownPos);					
+						color = visual.color();
+						canvas->setPointColor(color.red_, color.green_, color.blue_);
+						canvas->setPointStyle((int)visual.style(),visual.size());
+					}
+
+					flag = portal->fetchGeometry(point);
+					double dw = canvas->mapVtoDW(visual.size());
+					TeCoord2D p = point.location();
+					TeBox b(p.x()-dw, p.y()-dw, p.x()+dw, p.y()+dw);
+					boxRet = TeUnion(boxRet, b);
+					canvas->plotPoint(point);
+					t2 = clock();
+					nLoops++;
+					if (int(t2-t1) > dt)
+					{
+						t1 = t2;
+						canvas->copyPixmap1ToWindow();
+//						if(progress->wasCancelled())
+//							break;
+//						progress->setProgress(nLoops);
+					}
+				}
+				while (flag);
+			}
+		}
+//		progress->reset();
+	}
+	delete portal;
+	return boxRet;
+}
+
+template<class Canvas>
+bool objBoxInCanvas(TeThemeApplication *theme, Canvas *canvas, set<string>& drawSet, TeGeomRep repType, TeBox& bout, double tol)
+{
+	//calculate the box that contains all the objects in objectIdSet.
+	//If this box is inside the canvas box, return true to indicate that
+	//is enough to paint the objects selected. If this box is not inside
+	//the canvas box, center this box in the canvas, and return false
+	//to indicate that a plot in the whole canvas area is necessary.
+
+	TeLayer *layer = theme->layer();
+	TeDatabase *db = layer->database();
+	TeDatabasePortal *portal = db->getPortal();
+
+	string tableName;
+	if (repType & TePOLYGONS)
+		tableName = theme->layer()->tableName(TePOLYGONS);
+	else if (repType & TeLINES)
+		tableName = theme->layer()->tableName(TeLINES);
+	else if (repType & TePOINTS)
+		tableName = theme->layer()->tableName(TePOINTS);
+	else if (repType & TeCELLS)
+		tableName = theme->layer()->tableName(TeCELLS);
+
+	set<string>::iterator it, beginIt;
+	int i, chunk = 200, size = drawSet.size();
+	string inClause, plic, fields, queryString;
+
+	beginIt = drawSet.begin();
+	while (size > 0)
+	{
+		portal->freeResult();
+		inClause = "(";
+		plic = "'";
+		i = 0;
+		for (it = beginIt; it != drawSet.end(); ++it)
+		{
+			if (i >= chunk)
+				break;
+			inClause += plic + *it + "',";
+			++i;
+		}
+		inClause[inClause.size() - 1] = ')';
+		beginIt = it;
+		size -= chunk;
+
+		if((repType & TePOLYGONS) || (repType & TeLINES) || (repType & TeCELLS))
+		{
+			if(db->dbmsName() == "PostGIS")
+				fields = "MIN(xmin(spatial_data::box3d)), MIN(ymin(spatial_data::box3d)), MAX(xmax(spatial_data::box3d)), MAX(ymax(spatial_data::box3d))";
+			else
+				fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
+
+			queryString =  "SELECT " + fields;
+			queryString += " FROM " + tableName; 
+			queryString += " WHERE object_id IN " + inClause;
+			
+			if (portal->query(queryString))
+			{
+				while(portal->fetchRow())
+				{
+					string vxmin = portal->getData(0);
+					string vymin = portal->getData(1);
+					string vxmax = portal->getData(2);
+					string vymax = portal->getData(3);
+					if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
+						continue;
+					double xmin = atof(vxmin.c_str());
+					double ymin = atof(vymin.c_str());
+					double xmax = atof(vxmax.c_str());
+					double ymax = atof(vymax.c_str());
+					TeBox ibox(xmin+tol, ymin+tol, xmax-tol, ymax-tol);
+					updateBox (bout, ibox);
+				}
+			}
+		}
+		else if(repType & TePOINTS)
+		{
+			if(db->dbmsName() == "PostGIS")
+				fields = "MIN(xmin(spatial_data::box3d)), MIN(ymin(spatial_data::box3d)), MAX(xmax(spatial_data::box3d)), MAX(ymax(spatial_data::box3d))";
+			else
+				fields = "MIN(x), MIN(y), MAX(x), MAX(y)";
+
+			queryString =  "SELECT " + fields;
+			queryString += " FROM " + tableName; 
+			queryString += " WHERE object_id IN " + inClause;
+
+			if (portal->query(queryString))
+			{
+				while(portal->fetchRow())
+				{
+					string vx = portal->getData(0);
+					string vy = portal->getData(1);
+					if(vx.empty() || vy.empty())
+						continue;
+					double x = atof(vx.c_str());
+					double y = atof(vy.c_str()); 
+
+					TeBox ibox(x-tol, y-tol, x+tol, y+tol);
+					updateBox (bout, ibox);
+				}
+			}
+		}
+	}
+
+	TeBox cbox = canvas->getDataWorld();
+	if(TeWithin(bout, cbox) == true)
+	{
+		delete portal;
+		return true;
+	}
+
+	//box of the objects selected is not inside the canvas box
+	if(bout.width() < cbox.width())
+	{
+		double w = cbox.width();
+		double tw = bout.width();
+		double dw = (w - tw) / 2.;
+		bout.x1_ = bout.x1_ - dw;
+		bout.x2_ = bout.x2_ + dw;
+	}
+
+	if(bout.height() < cbox.height())
+	{
+		double h = cbox.height();
+		double th = bout.height();
+		double dh = (h - th) / 2.;
+		bout.y1_ = bout.y1_ - dh;
+		bout.y2_ = bout.y2_ + dh;
+	}
+
+	delete portal;
+
+	// layer to canvas projection
+	bout = TeRemapBox(bout, theme->layer()->projection(), canvas->projection());
+	return false;
+}
+
+
+template<class Canvas>
+void TePlotFrame(TeThemeApplication* theme, Canvas* canvas, map<int, RepMap>& layerRepMap, map<string, TeGeomRepVisualMap*>& objVisualMap)
+{
+	string tableName, objectId;
+	TeColor color;
+	TeVisual visual;
+
+	TeLayer *layer = theme->layer();
+	TeDatabase *db = layer->database();
+	TeDatabasePortal *portal = db->getPortal();
+	canvas->setDataProjection (layer->projection());
+	map<int, RepMap>::iterator it = layerRepMap.find(layer->id());
+	TeGeomRepVisualMap* vmap;
+
+	TeBox box;
+	TeBox vb = box;
+	if(box.isValid())
+	{
+		canvas->mapDataWorldToCanvasWorld(vb);
+		canvas->mapCanvasWorldToViewport(vb);
+	}
+
+	if (layer->hasGeometry(TeRASTER) && (theme->visibleRep() & TeRASTER))
+	{
+		TeBox bIn;
+		if (box.isValid())
+		{
+			canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+			bIn = vb;	
+		}
+	
+		TeRaster* raster = theme->layer()->raster();
+		if (!theme->rasterVisual())
+			theme->createRasterVisual();
+	
+		canvas->plotRaster(raster,theme->rasterVisual(), 0);
+	}	
+	if(layer->hasGeometry(TePOLYGONS) && (theme->visibleRep() & TePOLYGONS))
+	{
+		// query the database table containing the polygons� geometry
+		string wherebox = getWhereBox(portal, theme, canvas, TePOLYGONS, box);
+		tableName = layer->tableName(TePOLYGONS);
+
+		string queryPolygons  = "SELECT " + tableName + ".*";
+		queryPolygons += " FROM " + tableName + ", " + theme->collectionTable();
+		queryPolygons += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryPolygons += " AND " + wherebox;
+
+		if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+			queryPolygons += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+		else
+			queryPolygons += " ORDER BY object_id ASC";
+
+		portal->freeResult();
+
+		//Plot the polygons whose number was placed in nSteps
+		if (portal->query(queryPolygons) == false)
+		{
+			delete portal;
+			return;
+		}
+		
+		if(portal->fetchRow())
+		{
+			bool flag;
+			flag = true;
+			do
+			{
+				TePolygon poly;
+				int geomId = atoi(portal->getData(0));
+				string oid = portal->getData(1);
+				if (objVisualMap.find(oid) != objVisualMap.end())
+					vmap = objVisualMap[oid];
+				else
+				{
+					flag = portal->fetchGeometry(poly);
+					continue;
+				}
+
+				visual = vmap->operator[](TePOLYGONS);					
+				color = visual.color();
+				canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+				canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+				color = visual.contourColor();
+				canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+				canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+				if(box.isValid())
+					canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+				if(it == layerRepMap.end())
+				{
+					flag = portal->fetchGeometry(poly);
+					canvas->plotPolygon(poly);
+				}
+				else
+				{
+					canvas->plotPolygon(layerRepMap[layer->id()].polygonMap_[geomId]);
+					int parent_id = atoi(portal->getData(4));
+					int parent = parent_id;
+					while(parent == parent_id)
+					{
+						flag = portal->fetchRow();
+						if(flag)
+							parent = atoi(portal->getData(4));
+						else
+							parent = -1;
+					}
+				}
+			}
+			while (flag);
+		}
+	}
+
+	if(box.isValid())
+		canvas->setClipRegion((int)vb.x1(), (int)vb.y1(), (int)vb.width(), (int)vb.height());
+	if(layer->hasGeometry(TeCELLS) && (theme->visibleRep() & TeCELLS))
+	{
+		// query the database table containing the polygons� geometry
+		string wherebox = getWhereBox(portal, theme, canvas, TeCELLS, box);
+		tableName = layer->tableName(TeCELLS);
+
+		string queryCells  = "SELECT " + tableName + ".*";
+		queryCells += " FROM " + tableName + ", " + theme->collectionTable();
+		queryCells += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryCells += " AND " + wherebox;
+
+		portal->freeResult();
+		if (portal->query(queryCells) == false)
+		{
+			delete portal;
+			return;
+		}
+
+		if(portal->fetchRow())
+		{
+			bool flag;
+			flag = true;
+			do
+			{
+				TeCell cell;
+				string oid = portal->getData(1);
+				if (objVisualMap.find(oid) != objVisualMap.end())
+					vmap = objVisualMap[oid];
+				else
+				{
+					flag = portal->fetchGeometry(cell);
+					continue;
+				}
+				visual = vmap->operator[](TePOLYGONS);					
+				color = visual.color();
+				canvas->setPolygonColor(color.red_, color.green_, color.blue_);
+				canvas->setPolygonStyle((int)visual.style(),visual.transparency());
+				color = visual.contourColor();
+				canvas->setPolygonLineColor (color.red_, color.green_, color.blue_);
+				canvas->setPolygonLineStyle((int)visual.contourStyle(),visual.contourWidth());
+				flag = portal->fetchGeometry(cell);
+				canvas->plotCell(cell);
+			}
+			while (flag);
+		}
+	}
+
+	if (layer->hasGeometry(TeLINES) && (theme->visibleRep() & TeLINES))
+	{
+		string wherebox = getWhereBox(portal, theme, canvas, TeLINES, box);
+		// query the database table containing the lines� geometry
+		tableName = layer->tableName(TeLINES);
+
+		string queryLines  = "SELECT " + tableName + ".*";
+		queryLines += " FROM " + tableName + ", " + theme->collectionTable();
+		queryLines += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryLines += " AND " + wherebox;
+
+		portal->freeResult();
+		if (portal->query(queryLines) == false)
+		{
+			delete portal;
+			return;
+		}
+
+		if(portal->fetchRow())
+		{
+			bool flag = true;
+			do
+			{
+				TeLine2D line;
+				int geomId = atoi(portal->getData(0));					
+				string oid = portal->getData(1);
+				if (objVisualMap.find(oid) != objVisualMap.end())
+					vmap = objVisualMap[oid];
+				else
+				{
+					flag = portal->fetchGeometry(line);
+					continue;
+				}
+
+				visual = vmap->operator[](TeLINES);					
+				color = visual.color();
+				canvas->setLineColor(color.red_, color.green_, color.blue_);
+				canvas->setLineStyle((int)visual.style(),visual.width());
+				if(it == layerRepMap.end())
+				{
+					flag = portal->fetchGeometry(line);
+					canvas->plotLine(line);
+				}
+				else
+				{
+					canvas->plotLine(layerRepMap[layer->id()].lineMap_[geomId]);
+					flag = portal->fetchRow();
+				}
+			}
+			while (flag);
+		}
+	}
+
+	if (layer->hasGeometry(TePOINTS) && (theme->visibleRep() & TePOINTS))
+	{
+		string wherebox = getWhereBox(portal, theme, canvas, TePOINTS, box);
+		// query the database table containing the points� geometry
+		tableName = layer->tableName(TePOINTS);
+
+		string queryPoints  = "SELECT " + tableName + ".*";
+		queryPoints += " FROM " + tableName + ", " + theme->collectionTable();
+		queryPoints += " WHERE object_id = c_object_id";
+		if(wherebox.empty() == false)
+			queryPoints += " AND " + wherebox;
+
+		portal->freeResult();
+		if (portal->query(queryPoints) == false)
+		{
+			delete portal;
+			return;
+		}
+
+		if(portal->fetchRow())
+		{
+			bool flag = true;
+			do
+			{
+				TePoint point;
+				string oid = portal->getData(1);
+				if (objVisualMap.find(oid) != objVisualMap.end())
+					vmap = objVisualMap[oid];
+				else
+				{
+					flag = portal->fetchGeometry(point);
+					continue;
+				}
+
+				visual = vmap->operator[](TePOINTS);					
+				color = visual.color();
+				canvas->setPointColor(color.red_, color.green_, color.blue_);
+				canvas->setPointStyle((int)visual.style(),visual.size());
+				flag = portal->fetchGeometry(point);
+				canvas->plotPoint(point);
+			}
+			while (flag);
+		}
+	}
+	delete portal;
+
+	if(box.isValid())
+		canvas->setClipping(false);
+}
+
+#endif
+
diff --git a/src/terralib/application/TePlotView.h b/src/terralib/application/TePlotView.h
new file mode 100644
index 0000000..a400f82
--- /dev/null
+++ b/src/terralib/application/TePlotView.h
@@ -0,0 +1,41 @@
+//***********************************************************************
+//      TerraLib is a GIS Classes and Functions Library that 
+//      strongly explores Spatial Database Technologies 
+//
+//      Copyright � 2002 INPE and Tecgraf/PUC-Rio. 
+//
+//      This library is free software; you can redistribute it 
+//      and/or modify it under the terms of the GNU Lesser General 
+//      Public License as published by the Free Software Foundation
+//      version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//      
+//
+//      Send questions or suggestions about the TerraLib Project 
+//      to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TePlotTheme.h
+    This file contains support to plot a view on a canvas
+*/
+#ifndef TEPLOTVIEW_H
+#define TEPLOTVIEW_H
+#include <TeView.h>
+#include <TePlotTheme.h>
+#include <TeDatabase.h>
+
+template<class Portal, class Canvas>
+void TePlotView (Portal *portal, TeView *view, Canvas *canvas)
+{
+	if (view->themes().size() == 0)
+		portal->loadView (*view);
+
+	for (int i=0 ; i < view->themes().size() ; i++)
+	{
+		TeThemeApplication *theme = (TeTheme*)view->get(i);
+		if (theme->visible ())
+			TePlotTheme (portal, theme, canvas);
+	}
+}
+
+#endif
+
diff --git a/src/terralib/application/TeSemivarModelFactory.cpp b/src/terralib/application/TeSemivarModelFactory.cpp
new file mode 100644
index 0000000..457bdd3
--- /dev/null
+++ b/src/terralib/application/TeSemivarModelFactory.cpp
@@ -0,0 +1,198 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeSemivarModelFactory.h>
+#include <math.h>
+#include <vector>
+using namespace std;
+
+static TeEsfericSemivar_Factory mesf("Esferic");
+static TeExponentialSemivar_Factory mexp("Exponential");
+static TeGaussianSemivar_Factory mgau("Gaussian");
+
+
+TeMatrix
+TeEsfericSemivarModel :: calculate (TeMatrix& g)
+{
+	TeMatrix		mxesf;
+	vector<double>	esf;
+	int				i, nlag;
+	double			c0, c1, a;
+
+	c0=modeloefeitopepita_;
+	c1=modelocontribuicao_;
+	a=modeloalcance_;
+	nlag = g.Nrow();
+	mxesf.Init(nlag+1, 2);
+
+	for (i=0; i<nlag; ++i)
+	{
+		if (g(i,0) == 0)
+			esf.push_back(c0);
+
+		else if (g(i,0) > 0 && g(i,0) < 1000000.0)
+		{
+			esf.push_back( c0 + c1*(1.5*(g(i,0)/a)) - 0.5*(pow(g(i,0)/a,3) ));
+			if (esf[i] > c0+c1)
+				esf[i]=c0+c1;
+		}
+
+		else 
+            esf.push_back(c0+c1);
+    
+		// Escreve Saida
+		mxesf(i+1,0) = g(i,0); // h
+        mxesf(i+1,1) = esf[i]; // gama(h)
+    }
+
+	// quando h=0 => gama(h)=c0
+	mxesf(0,1)=c0;
+
+	// acrescentar o �ltimo valor
+	mxesf(nlag,0)= mxesf(nlag-1,0) + (mxesf(nlag-1,0) - mxesf(nlag-2,0));
+    mxesf(nlag,1)= mxesf(nlag-1,1);
+
+	return mxesf;
+}
+
+TeMatrix
+TeExponentialSemivarModel :: calculate (TeMatrix& g)
+{
+	TeMatrix		mxexp;
+	vector<double>	expo;
+	int				i, nlag;
+	double			c0, c1, a;
+
+	c0=modeloefeitopepita_;
+	c1=modelocontribuicao_;
+	a=modeloalcance_;
+	nlag = g.Nrow();
+	mxexp.Init(nlag+1, 2);
+
+	for (i=0; i<nlag; ++i)
+	{
+		if (g(i,0) == 0)
+			expo.push_back(c0);
+
+		//expo(i) = c0 + c1*( 1 - exp( -(3*g(i,1))/a) );
+		expo.push_back(c0 + c1*( 1 - exp( -(3*g(i,0))/a) ));
+
+		// Escreve Saida
+		mxexp(i+1,0) = g(i,0); // h
+        mxexp(i+1,1) = expo[i]; // gama(h)
+    }
+
+	// quando h=0 => gama(h)=c0
+	mxexp(0,1)=c0;
+
+	// acrescentar o �ltimo valor
+	mxexp(nlag,0)= mxexp(nlag-1,0) + (mxexp(nlag-1,0) - mxexp(nlag-2,0));
+    mxexp(nlag,1)= mxexp(nlag-1,1);
+
+	return mxexp;
+}
+
+TeMatrix
+TeGaussianSemivarModel :: calculate (TeMatrix& g)
+{
+	TeMatrix		mxgau;
+	vector<double>	gau;
+	int				i, nlag;
+	double			c0, c1, a;
+
+	c0=modeloefeitopepita_;
+	c1=modelocontribuicao_;
+	a=modeloalcance_;
+	nlag = g.Nrow();
+	mxgau.Init(nlag+1, 2);
+
+	for (i=0; i<nlag; ++i)
+	{
+		if (g(i,0) == 0)
+			gau.push_back(c0);
+
+	   // gaus(i) = c0 + c1*( 1 - exp(-3*(g(i,1)/a)^2) );
+		gau.push_back( c0 + c1*( 1 - exp(-3*pow(g(i,0)/a,2))) );
+
+		// Escreve Saida
+		mxgau(i+1,0) = g(i,0); // h
+        mxgau(i+1,1) = gau[i]; // gama(h)
+    }
+
+	// quando h=0 => gama(h)=c0
+	mxgau(0,1)=c0;
+
+	// acrescentar o �ltimo valor
+	mxgau(nlag,0)= mxgau(nlag-1,0) + (mxgau(nlag-1,0) - mxgau(nlag-2,0));
+    mxgau(nlag,1)= mxgau(nlag-1,1);
+
+	return mxgau;
+}
+
+
+/*
+for i=1:nlag;
+    if (g(i,1) == 0)
+        sphe(i) = c0;
+        gaus(i) = c0;
+        expo(i) = c0;
+    elseif (g(i,1) > 0 & g(i,1) < a)
+        sphe(i) = c0 + c1*((1.5*(g(i,1)/a) - 0.5*((g(i,1)/a)^3)));
+    else 
+        if (g(i,1) >= a)
+            sphe(i)=c0+c1;
+        end
+    end
+    gaus(i) = c0 + c1*( 1 - exp(-3*(g(i,1)/a)^2) );
+    expo(i) = c0 + c1*( 1 - exp( -(3*g(i,1))/a) );
+    
+    % Escreve Saida
+    m(i+1,1) = g(i,1);% lag distance
+
+    switch (model)
+        case 1
+            m(i+1,2) = sphe(i);
+        case 2
+            m(i+1,2) = expo(i);
+        case 3
+            m(i+1,2) = gaus(i);
+        otherwise      
+            m(i+1,2) = 0;
+    end
+end
+
+%Para o modelo quando h=0 => gamma(h)=c0
+m(1,2)=c0;
+
+%Para o modelo quando h >= a => gamma(h)=c0+c1
+switch (model)
+    case 1 %Para modelo esferico
+    m(nlag+2,2)= c0+c1;
+
+    case 2 %Para modelo exponencial
+    m(nlag+2,2)= m(nlag+1,2);
+    
+    case 3 %Para modelo gaussiano
+    m(nlag+2,2)= m(nlag+1,2);
+end
+*/
diff --git a/src/terralib/application/TeSemivarModelFactory.h b/src/terralib/application/TeSemivarModelFactory.h
new file mode 100644
index 0000000..d9d556d
--- /dev/null
+++ b/src/terralib/application/TeSemivarModelFactory.h
@@ -0,0 +1,153 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeFactorySemivarModel.h
+    This file contains support do deal with factory semivar model
+*/
+
+#ifndef __TERRALIB_INTERNAL_SEMIVARMODEL_H
+#define __TERRALIB_INTERNAL_SEMIVARMODEL_H
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include <TeMatrix.h>
+#include <TeFactory.h>
+
+struct TeSemivarModelParams
+{
+	double		efeitopepita_;
+	double		contribuicao_;
+	double		alcance_;
+};
+
+
+////////////////////////////////////
+class TeSemivarModel		
+{
+public:
+	TeSemivarModel (){};
+	virtual ~TeSemivarModel (){};
+
+	virtual TeMatrix	calculate (TeMatrix&)=0;
+	static TeSemivarModel* DefaultObject(TeSemivarModelParams){ return 0; }
+
+protected:
+	double		modeloefeitopepita_;
+	double		modelocontribuicao_;
+	double		modeloalcance_;
+};
+
+////////////////////////////////////
+class TeEsfericSemivarModel : public TeSemivarModel
+{
+public:
+		TeEsfericSemivarModel(const TeSemivarModelParams& params){
+		modeloefeitopepita_ = params.efeitopepita_;
+		modelocontribuicao_ = params.contribuicao_;
+		modeloalcance_ = params.alcance_;
+	}		
+	
+	virtual ~TeEsfericSemivarModel(){};
+
+	virtual TeMatrix	calculate (TeMatrix&);	
+};
+
+//////////////////////////////////
+class TeExponentialSemivarModel : public TeSemivarModel
+{
+public:
+		TeExponentialSemivarModel(const TeSemivarModelParams& params){
+		modeloefeitopepita_ = params.efeitopepita_;
+		modelocontribuicao_ = params.contribuicao_;
+		modeloalcance_ = params.alcance_;
+	}		
+	
+	virtual ~TeExponentialSemivarModel(){};
+
+	virtual TeMatrix	calculate (TeMatrix&);	
+};
+
+//////////////////////////////////
+class TeGaussianSemivarModel : public TeSemivarModel
+{
+public:
+		TeGaussianSemivarModel(const TeSemivarModelParams& params){
+		modeloefeitopepita_ = params.efeitopepita_;
+		modelocontribuicao_ = params.contribuicao_;
+		modeloalcance_ = params.alcance_;
+	}		
+	
+	virtual ~TeGaussianSemivarModel(){};
+
+	virtual TeMatrix	calculate (TeMatrix&);	
+};
+
+
+
+///////////////////////////////////////////////////////////
+// -- Fabrica de Modelos Teoricos de Variabilidade Espacial 
+
+class TeSemivarModelFactory : public TeFactory<TeSemivarModel, TeSemivarModelParams>
+{
+public:
+	TeSemivarModelFactory( const string& name) : TeFactory<TeSemivarModel, TeSemivarModelParams>(name){}
+
+	virtual TeSemivarModel* build( const TeSemivarModelParams&) = 0;
+};
+
+
+/////////////////////////////
+class TeEsfericSemivar_Factory : public TeSemivarModelFactory
+{
+public:
+	TeEsfericSemivar_Factory (const string& name) : TeSemivarModelFactory(name){}
+
+	virtual TeSemivarModel* build(const TeSemivarModelParams& params){return new TeEsfericSemivarModel(params);}
+};
+
+
+/////////////////////////////
+class TeExponentialSemivar_Factory : public TeSemivarModelFactory
+{
+public:
+	TeExponentialSemivar_Factory (const string& name) : TeSemivarModelFactory(name){}
+
+	virtual TeSemivarModel* build(const TeSemivarModelParams& params){return new TeExponentialSemivarModel(params);}
+};
+
+
+/////////////////////////////
+class TeGaussianSemivar_Factory : public TeSemivarModelFactory
+{
+public:
+	TeGaussianSemivar_Factory (const string& name) : TeSemivarModelFactory(name){}
+
+	virtual TeSemivarModel* build(const TeSemivarModelParams& params){return new TeGaussianSemivarModel(params);}
+};
+
+
+#endif
+
+
diff --git a/src/terralib/application/TeThemeApplication.cpp b/src/terralib/application/TeThemeApplication.cpp
new file mode 100644
index 0000000..1cdc086
--- /dev/null
+++ b/src/terralib/application/TeThemeApplication.cpp
@@ -0,0 +1,345 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeThemeApplication.h"
+#include "TeUtils.h"
+#include "TeDatabase.h"
+#include "TeDatabaseUtils.h"
+
+
+unsigned int TeThemeApplication::getTableIndexFromField(string fieldName)
+{
+	unsigned int i, n, index;
+	index = 0;
+	n = attTableVector_[0].attributeList().size();
+	for (i = 0; i < sqlAttList_.size(); ++i)
+	{
+		if (i > n - 1)
+		{
+			++index;
+			n += attTableVector_[index].attributeList().size();
+		}
+
+		if (sqlAttList_[i].rep_.name_ == fieldName)
+			break;
+	}
+	return index;
+}
+
+
+
+bool TeThemeApplication::locateText (TeCoord2D &pt, TeText &text, const double& tol)
+{
+	TeDatabasePortal* portal = layer()->database()->getPortal();
+	string table = textTable();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q = "SELECT " + table + ".* FROM " + table + ", " + collectionTable();
+	char buf [1024];
+	sprintf (buf," WHERE c_object_id = object_id AND (x < %f AND x > %f AND y < %f AND y > %f)",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	// Look for all texts
+	bool flag = true;
+	TeTextSet ts;
+	do
+	{
+		TeText p;
+		flag = portal->fetchGeometry(p);
+		ts.add ( p );
+	} while (flag);
+
+	delete portal;
+
+	int k;
+	if (TeNearest (pt, ts, k, tol))
+	{
+		text = ts[k];
+		return true;
+	}
+	return false;
+}
+
+TeVisual TeThemeApplication::getTextVisual(const TeText &text)
+{
+	int	dot_height, rgb;
+	string family;
+	string table = textTable() + "_txvisual";
+	bool fix_size = false, bold = false, italic = false;
+	TeDatabase* db = layer()->database();
+
+	string sel = "SELECT dot_height, fix_size, color, family, bold, italic FROM ";
+	sel += table + " WHERE geom_id = " + Te2String(text.geomId());
+
+	TeDatabasePortal* portal = db->getPortal();
+	if(portal->query(sel))
+	{
+		if(portal->fetchRow())
+		{
+			dot_height = atoi(portal->getData(0));
+			if(atoi(portal->getData(1)))
+				fix_size = true;
+			rgb = atoi(portal->getData(2));
+			family = portal->getData(3);
+			if(atoi(portal->getData(4)))
+				bold = true;
+			if(atoi(portal->getData(5)))
+				italic = true;
+		}
+	}
+	delete portal;
+	TeColor	cor((rgb >> 16) & 0xff, (rgb >> 8) & 0xff, rgb & 0xff);
+	TeVisual visual;
+	visual.size(dot_height);
+	visual.fixedSize(fix_size);
+	visual.color(cor);
+	visual.family(family);
+	visual.bold(bold);
+	visual.italic(italic);
+
+	return visual;
+}
+
+
+string TeThemeApplication::getLegendTitleAlias()
+{
+	string text;
+
+	TeLegendEntryVector& legendVector = legend();
+	if (legendVector.size() > 0)
+	{
+		TeDatabase* database = layer()->database();
+		TeAttributeRep rep; 
+		string nattr;
+		if(grouping())
+		{
+			rep = grouping()->groupAttribute_; 
+			nattr = grouping()->groupNormAttribute_;
+		}
+		text = rep.name_;
+		map<int, map<string, string> >::iterator it = database->mapThemeAlias().find(id());
+		if(it != database->mapThemeAlias().end())
+		{
+			map<string, string>& m = it->second;
+			map<string, string>::iterator tit = m.find(text);
+			if(tit != m.end())
+				text = tit->second;
+			if(!(nattr.empty() || nattr == "NONE"))
+			{
+				tit = m.find(nattr);
+        		if(tit != m.end()) {
+        		  if (!tit->second.empty()) {
+					text += "/" + tit->second;
+          		  }
+        		}
+        		else  //Deixando ficar sem barra 
+					text += "/" + nattr;
+			}
+		}
+	}
+	return text;
+}
+
+string TeThemeApplication::	getPieBarAlias(string atr)
+{
+	string text;
+
+	if (chartAttributes_.size() > 0)
+	{
+		TeDatabase* database = layer()->database();
+		map<int, map<string, string> >::iterator it = database->mapThemeAlias().find(id());
+		if(it != database->mapThemeAlias().end())
+		{
+			map<string, string>& m = it->second;
+			map<string, string>::iterator tit = m.find(atr);
+			if(tit != m.end())
+				text = tit->second;
+		}
+	}
+	return text;
+}
+
+bool TeThemeApplication::setAlias(string attr, string attAlias)
+{
+	TeDatabase* db = layer()->database();
+	map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+	map<string, string>& mapAA = mapThemeAlias[id()];
+	map<string, string>::iterator it = mapAA.begin();
+
+	while(it != mapAA.end())
+	{
+		if(it->first != attr && it->second == attAlias)
+			return false;
+		it++;
+	}
+
+	int f = attr.find("/");
+	int af = attAlias.find("/");
+	if(f >= 0 && af >= 0)
+	{
+		string nattr = attr;
+		attr.erase(f, attr.size()-f);
+		nattr.erase(0, f+1);
+
+		string alias = attAlias;
+		string nalias = alias;
+		alias.erase(af, alias.size()-af);
+		nalias.erase(0, af+1);
+
+		mapAA[attr] = alias;
+		mapAA[nattr] = nalias;
+		updateThemeApplication (db, this);
+		return true;
+	}
+	else
+	{
+    	//Alterando para deixar ficar sem /
+    	if(f >= 0) {
+      		string nattr = attr;
+      		nattr.erase(0, f+1);
+      		mapAA[nattr] = "";
+			attr.erase(f, attr.size()-f);
+    	}
+		mapAA[attr] = attAlias;
+		updateThemeApplication (db, this);
+		return true;
+	}
+}
+
+void TeThemeApplication::removeAlias(string attribute)
+{
+	string attr = attribute;
+	string nattr = attr;
+	TeDatabase* db = layer()->database();
+	map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+	map<string, string>& mapAA = mapThemeAlias[id()];
+
+	int f = attr.find("/");
+	if(f >= 0)
+	{
+		attr.erase(f, attr.size()-f);
+		nattr.erase(0, f+1);
+	}
+	map<string, string>::iterator it = mapAA.find(attr);
+	if(it != mapAA.end())
+	{
+		mapAA.erase(it);
+		if(mapAA.size() == 0)
+		{
+			map<int, map<string, string> >::iterator tit = mapThemeAlias.find(id());
+			if(tit != mapThemeAlias.end())
+				mapThemeAlias.erase(tit);
+		}
+	}
+	if(nattr != attr)
+	{
+		map<string, string>::iterator it = mapAA.find(nattr);
+		if(it != mapAA.end())
+		{
+			mapAA.erase(it);
+			if(mapAA.size() == 0)
+			{
+				map<int, map<string, string> >::iterator tit = mapThemeAlias.find(id());
+				if(tit != mapThemeAlias.end())
+					mapThemeAlias.erase(tit);
+			}
+		}
+	}
+
+	updateThemeApplication (db, this);
+}
+
+void TeThemeApplication::removeAllAlias()
+{
+	TeDatabase* db = layer()->database();
+	map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+	map<int, map<string, string> >::iterator it = mapThemeAlias.find(id());
+	if(it != mapThemeAlias.end())
+		mapThemeAlias.erase(it);
+	updateThemeApplication (db, this);
+}
+
+void TeThemeApplication::concatTableName(string& attr)
+{
+	string tableName;
+
+	if(attr.find(".") == attr.npos)
+	{
+		TeAttrTableVector::iterator it = attTableVector_.begin();
+
+		while(it != attTableVector_.end())
+		{
+			TeTable	t = *it;
+			TeAttributeList AL = t.attributeList();
+			TeAttributeList::iterator iit = AL.begin();
+
+			while(iit != AL.end())
+			{
+				if((*iit).rep_.name_ == attr)
+				{
+					tableName = (*it).name();
+					break;
+				}
+				iit++;
+			}
+
+			if(tableName.empty() == false)
+			{
+				tableName += ".";
+				attr.insert(0, tableName);
+				break;
+			}
+			it++;
+		}
+	}
+}
+
+
+
+int TeThemeApplication::numObjects() {
+
+  int numRows;
+
+  string s = "SELECT COUNT(*) " + sqlFrom();	
+  TeDatabasePortal* portal = layer_->database()->getPortal();
+  if(portal->query(s))
+  {
+    if(portal->fetchRow())
+    {
+      numRows = atoi(portal->getData(0));
+    }
+  }
+  
+  delete portal;
+  return numRows;
+  
+}
+
+TeBox TeThemeApplication::boundingBox() {
+    return layer_->database()->getThemeBox(this);
+}
diff --git a/src/terralib/application/TeThemeApplication.h b/src/terralib/application/TeThemeApplication.h
new file mode 100644
index 0000000..e6b8317
--- /dev/null
+++ b/src/terralib/application/TeThemeApplication.h
@@ -0,0 +1,314 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_THEMEAPLICATION_H
+#define  __TERRALIB_INTERNAL_THEMEAPLICATION_H
+
+#include "TeTheme.h"
+
+struct RepMap {
+	map<int, TePolygon> polygonMap_;
+	map<int, TeLine2D> lineMap_;
+};
+
+
+class TeThemeApplication: public TeTheme
+{
+public:
+
+	//! Constructor
+    TeThemeApplication( const string& name="", TeLayer* layer=0, TeViewNode* parent = 0, int view=0, int id=0)
+		: TeTheme(name, layer, parent, view, id),
+		outOfCollectionVisibility_(false),
+		withoutDataConnectionVisibility_(false),
+		refineAttributeWhere_(""),
+		refineSpatialWhere_(""), 
+		refineTemporalWhere_(""),
+		groupColorDir_(TeColorAscSatEnd),
+		groupObjects_(TeAll),
+		pieDiameter_ (0.0),
+		pieMinDiameter_(0.0),
+		pieMaxDiameter_(0.0),
+		barMinHeight_(0.0),
+		barMaxHeight_(0.0),
+		barWidth_(0.0),
+		chartMaxVal_(-1),
+		chartMinVal_(-1),
+		chartType_(TeBarChart),
+		chartObjects_(TeAll),
+		chartFunction_("AVG"),
+		keepDimension_(0),
+		showCanvasLegend_(false),
+		canvasLegWidth_(0.0),
+		canvasLegHeight_(0.0), 
+		editRep_ (TeGeomRep(0)),
+		mix_color_(false),
+		count_obj_(false), 
+		textTable_("")
+	{}
+	
+	//! Destructor
+	~TeThemeApplication () {}
+
+	//! Returns TRUE if objects of the layer that don�t belong to the theme are visible
+	bool outOfCollectionVisibility() 
+	{ return outOfCollectionVisibility_;}
+	//! Set whether objects of the layer that don�t belong to the theme are visible
+	void outOfCollectionVisibility(bool v) 
+	{ outOfCollectionVisibility_ = v;}
+	
+	//! Returns TRUE if objects whithout descriptive attributes are visible
+	bool withoutDataConnectionVisibility() 
+	{ return withoutDataConnectionVisibility_;}
+	//! Set whether objects whithout descriptive attributes are visible
+	void withoutDataConnectionVisibility(bool v) 
+	{ withoutDataConnectionVisibility_ = v;}
+
+	//! Returns a attribute restriction (where clause) used to refine the selection defined by the theme
+	string refineAttributeWhere() { return refineAttributeWhere_; }
+	//! Set a attribute restriction (where clause) to refine the selection defined by the theme
+	void refineAttributeWhere(const string& s) { refineAttributeWhere_ = s; }
+
+	//! Returns a spatial restriction (where clause) used to refine the selection defined by the theme
+	string refineSpatialWhere() { return refineSpatialWhere_; }
+	//! Set a spatial restriction (where clause) used to refine the selection defined by the theme
+	void refineSpatialWhere(const string& s) { refineSpatialWhere_ = s; }
+
+	//! Returns a temporal restriction (where clause) used to refine the selection defined by the theme
+	string refineTemporalWhere() { return refineTemporalWhere_; }
+	//! Set a temporal restriction (where clause) used to refine the selection defined by the theme
+	void refineTemporalWhere(const string& t) { refineTemporalWhere_ = t; }
+
+	//! Returns the grouping colors
+	string groupColor () { return groupColor_ ; }
+	//! Set the grouping colors
+	void groupColor (const string& c) { groupColor_ = c; }
+	
+	//! Returns the grouping colors direction
+	TeColorDirection groupColorDir() { return groupColorDir_; }
+	//! Set the grouping colors direction
+	void groupColorDir(TeColorDirection n){ groupColorDir_ = n; }
+
+	//! Returns a code identifying which objects should be grouped
+	TeSelectedObjects groupObjects() { return groupObjects_; }
+	//! Set a code identifying which objects should be  grouped
+	void groupObjects(TeSelectedObjects n) { groupObjects_ = n; }
+
+	//! Returns the diameter in pixels of the pie charts
+	double pieDiameter() { return pieDiameter_; };
+	//! Set the diameter in pixels of the pie charts
+	void pieDiameter(double n) { pieDiameter_ = n; };
+
+	//! Returns the name of the attribute which gives the dimension of the diameter in pixels of the pie charts
+	string pieDimAttribute() { return pieAttr_; }
+	//! Set the name of the attribute which gives the dimension of the diameter in pixels of the pie charts
+	void pieDimAttribute(const string& s) { pieAttr_ = s; }
+
+	//! Returns the minimum diameter in pixels of the pie charts
+	double pieMinDiameter() { return pieMinDiameter_; };
+	//! Set the minimum diameter in pixels of pie charts
+	void pieMinDiameter(double n) { pieMinDiameter_ = n; };
+
+	//! Returns the maximum diameter in pixels of the pie charts
+	double pieMaxDiameter() { return pieMaxDiameter_; };
+	//! Set the maximum diameter in pixels of pie charts
+	void pieMaxDiameter(double n) { pieMaxDiameter_ = n; };
+
+	//! Returns the minimum height in pixels of the bar charts
+	double barMinHeight() { return barMinHeight_; };
+	//! Set the minimum height in pixels of the bar charts
+	void barMinHeight(double n) { barMinHeight_ = n; };
+
+	//! Returns the maximum height in pixels of the bar charts
+	double barMaxHeight() { return barMaxHeight_; };
+	//! Set the maximum height in pixels of the bar charts
+	void barMaxHeight(double n) { barMaxHeight_ = n; };
+
+	//! Returns the bar width in pixels of the bar charts
+	double barWidth() { return barWidth_; };
+	//! Set the bar width in pixels of the bar charts
+	void barWidth(double n) { barWidth_ = n; };
+
+	//! Returns the type of the chart 
+	TeChartType	chartType() {return chartType_;}
+	//! Set the type of the chart 
+	void chartType(TeChartType n) { chartType_ = n; }
+
+	//! Get the chart aggregate function
+	string chartFunction() { return chartFunction_; }
+
+	//! Set the chart aggregate function
+	void chartFunction(string s) { chartFunction_ = s; }
+
+	//! Returns the objects where the charts should be plotted 
+	TeSelectedObjects chartObjects() { return chartObjects_; };
+	//! Set the objects where the charts should be plotted 
+	void chartObjects(TeSelectedObjects n) { chartObjects_ = n; };
+
+	//! Returns the maximum value used to plot charts
+	double chartMaxVal() { return chartMaxVal_; }
+	//! Set the maximum value used to plot charts
+	void chartMaxVal(double n) { chartMaxVal_ = n; }
+
+	//! Returns the minimum value used to plot charts
+	double chartMinVal() { return chartMinVal_; }
+	//! Set the minimum value used to plot charts
+	void chartMinVal(double n) { chartMinVal_ = n; }
+
+	//! Returns TRUE if charts keep its dimension in zooming operations 
+	int	keepDimension() { return keepDimension_; };
+	//! Set if charts keep its dimension in zooming operations 
+	void keepDimension(int n) { keepDimension_ = n; };
+
+	//! Returns TRUE if the legends of the grouping should be plot in the canvas
+	bool showCanvasLegend()
+	{	return showCanvasLegend_; }
+	//! Set whether the legends of the grouping should be plot in the canvas
+	void showCanvasLegend(bool cl)
+	{	showCanvasLegend_ = cl; }
+
+	//! Returns the upper left position of the canvas legend
+	TeCoord2D canvasLegUpperLeft()
+	{	return canvasLegUpperLeft_; }
+	//! Set the upper left position of the canvas legend
+	void canvasLegUpperLeft(TeCoord2D c)
+	{	canvasLegUpperLeft_ = c; }
+	//! Returns the canvas legend width
+	double canvasLegWidth()
+	{	return canvasLegWidth_; }
+	//! Set the canvas legend width
+	void canvasLegWidth(double w)
+	{	canvasLegWidth_ = w; }
+	//! Returns the canvas legend height
+	double canvasLegHeight()
+	{	return canvasLegHeight_; }
+	//! Set the canvas legend height
+	void canvasLegHeight(double h)
+	{	canvasLegHeight_ = h; }
+	
+	//! Returns the geometrical representation being edited
+	TeGeomRep editRep() {return editRep_;}
+	//! Set the geometrical representation being edited
+	void editRep(TeGeomRep r) {editRep_ = r;}
+
+	//! Get the table index from the list of the theme tables, through a given field
+	unsigned int getTableIndexFromField(string fieldName);
+
+	bool mixColor()
+	{	return mix_color_; }
+
+	void mixColor(bool mixcolor)
+	{	mix_color_ = mixcolor;	}
+
+	bool countObj()
+	{	return count_obj_; }
+
+	void countObj(bool countobj)
+	{	count_obj_ = countobj;	}
+
+	//! Returns the name of a text table that is visible by this theme (used to label objects)
+	string textTable() { return textTable_; }
+
+	//! Set the name of a text table that is visible by this theme (used to label objects)
+	void textTable(const string& t) { textTable_ = t; }
+
+	bool locateText	(TeCoord2D &pt, TeText &text, const double& tol = 0.0);
+
+	TeVisual getTextVisual(const TeText &text);
+
+	bool setAlias(string att, string attAlias);
+
+	string getLegendTitleAlias();
+
+	string getPieBarAlias(string atr);
+
+	void removeAlias(string att);
+
+	void removeAllAlias();
+
+	void concatTableName(string &attr);
+
+  //! Returns the number of objects in a theme
+  int  numObjects();
+  
+  //! Returns the bounding box of the theme
+  TeBox boundingBox();  
+  
+
+
+	//! Vector of colors used to plot the charts
+	vector<TeColor> chartColors_;	
+	//! Vector of attributes used to plot the charts
+	vector<string>	chartAttributes_;
+
+	string		chartSelected_;
+	TeCoord2D	chartPoint_;
+	TePoint		tePoint_;
+
+private:
+	
+	bool			outOfCollectionVisibility_; 
+	bool			withoutDataConnectionVisibility_; 
+
+	// Refining 
+	string			refineAttributeWhere_;
+	string			refineSpatialWhere_;
+	string			refineTemporalWhere_;
+
+	string				groupColor_;
+	TeColorDirection	groupColorDir_;
+	TeSelectedObjects	groupObjects_;
+		
+	double			pieDiameter_;
+	string			pieAttr_;
+	double			pieMinDiameter_;
+	double			pieMaxDiameter_;
+
+	double			barMinHeight_;
+	double			barMaxHeight_;
+	double			barWidth_;
+
+	double			  chartMaxVal_;
+	double			  chartMinVal_;
+	TeChartType		  chartType_;
+	TeSelectedObjects chartObjects_;
+	string			  chartFunction_;
+	
+	int				keepDimension_;
+	
+	bool			showCanvasLegend_;		//to show or not the legend in the canvas
+	TeCoord2D		canvasLegUpperLeft_;	//legend�s upper left point  
+	double			canvasLegWidth_;		//legend width
+	double			canvasLegHeight_;		//legend height
+
+	TeGeomRep		editRep_;
+
+	bool			mix_color_;
+	bool			count_obj_;
+
+	string			textTable_;
+};
+
+
+#endif
+
diff --git a/src/terralib/application/TeUpdateDBVersion.cpp b/src/terralib/application/TeUpdateDBVersion.cpp
new file mode 100644
index 0000000..686a623
--- /dev/null
+++ b/src/terralib/application/TeUpdateDBVersion.cpp
@@ -0,0 +1,545 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeUpdateDBVersion.h"
+
+bool needUpdateDB(TeDatabase* db, string& DBversion)
+{
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	string sql = " SELECT db_version FROM te_database ";
+	if(!portal->query(sql))
+	{
+		DBversion = "";
+		delete portal;
+		return true;
+	}
+
+	if(!portal->fetchRow())
+	{
+		DBversion = "";
+		delete portal;
+		return true;
+	}
+
+	DBversion = portal->getData(0);
+	if(DBversion=="3.0.2")  //3.0 Plus
+	{
+		delete portal;
+		return false;
+	}
+	
+	delete portal;
+	return true;
+}
+
+
+bool updateDBVersion(TeDatabase* db, string& DBversion, string& errorMessage)
+{
+	//from old version to 3.0
+	if(DBversion=="")
+	{
+		if(!updateDB30To301(db, errorMessage))
+			return false;
+
+		if(!updateDB20To30(db, errorMessage))
+			return false;
+		
+		DBversion = "3.0.1";
+	}
+
+	//from 3.0 to 3.0.1
+	if(DBversion=="3.0") 
+	{
+		if(!updateDB30To301(db, errorMessage))
+			return false;
+
+		DBversion = "3.0.1";
+	}
+
+	//from 3.0.1 to 3.0.2
+	if(DBversion=="3.0.1") 
+	{
+		if(!updateDB301To302(db, errorMessage))
+			return false;
+
+		DBversion = "3.0.2";
+	}
+
+	if(DBversion!="3.0.2")
+		return false;
+
+	string del= "DELETE FROM te_database"; 
+	if(!db->execute(del))
+		return false;
+
+	string ins = "INSERT INTO te_database (db_version) VALUES ('3.0.2')";
+	if(!db->execute(ins))
+		return false;
+
+	return true;
+}
+
+
+bool updateDB20To30(TeDatabase* db, string& errorMessage)
+{
+	TeAttribute fattr;
+
+	// ----- te_grouping 
+
+	if(db->columnExist("te_grouping", "grouping_function", fattr) == false)
+	{
+		TeAttributeRep atRep;
+		atRep.type_ = TeSTRING;
+		atRep.name_ = "grouping_function";
+		atRep.numChar_ = 10;
+		if(db->addColumn("te_grouping", atRep) == false)
+		{
+			errorMessage = "The column grouping_function could not be appended!";
+			return false;
+		}
+
+		string upd;
+		if(db->columnExist("te_theme_application", "group_function", fattr))
+		{
+			upd =	" UPDATE te_grouping g, te_theme_application ta ";
+			upd +=	" SET g.grouping_function = ta.group_function ";
+			upd +=	" WHERE ta.theme_id = g.theme_id ";
+
+			if(!db->execute (upd))
+				return false;
+
+			db->deleteColumn("te_theme_application", "group_function");
+		}
+		else
+		{
+			upd =	" UPDATE te_grouping g ";
+			upd +=	" SET g.grouping_function = 'AVG' ";
+			
+			if(!db->execute (upd))
+				return false;
+		}
+	}
+
+	// ----- te_theme_application
+
+	if(db->columnExist("te_theme_application", "chart_function", fattr) == false)
+	{
+		TeAttributeRep atRep;
+		atRep.type_ = TeSTRING;
+		atRep.name_ = "chart_function";
+		atRep.numChar_ = 10;
+		if(db->addColumn("te_theme_application", atRep) == false)
+		{
+			errorMessage = "The column chart_function could not be appended!";
+			return false;
+		}
+		db->execute("UPDATE te_theme_application SET chart_function = 'AVG'");
+	}
+
+	// ----- te_theme 
+	if(db->columnExist("te_theme", "visible_rep", fattr) == false)
+	{
+		TeAttributeRep atRep;
+		atRep.type_ = TeINT;
+		atRep.name_ = "visible_rep";
+		if(db->addColumn("te_theme", atRep) == false)
+		{
+			errorMessage = "The column visible_rep could not be appended!";
+			return false;
+		}
+
+		atRep.name_ = "enable_visibility";
+		if(db->addColumn("te_theme", atRep) == false)
+		{
+			errorMessage = "The column enable_visibility could not be appended!";
+			return false;
+		}
+
+		string upd = " UPDATE te_theme t, te_theme_application ta ";
+		upd +=       " SET t.visible_rep = ta.visible_rep ";
+		upd +=       " WHERE ta.theme_id = t.theme_id ";
+		if(!db->execute (upd))
+			return false;
+
+		upd =		 " UPDATE te_theme t, te_theme_application ta ";
+		upd +=       " SET t.enable_visibility = ta.enable_visibility ";
+		upd +=       " WHERE ta.theme_id = t.theme_id ";
+		if(!db->execute (upd))
+			return false;
+			
+		db->deleteColumn("te_theme_application", "visible_rep");
+		db->deleteColumn("te_theme_application", "enable_visibility");
+	}
+
+	//if for ADO passar todas as tabelas para aceitar comprimento iguel a zero!!!
+	if(db->dbmsName() == "Ado")
+	{
+		//te_layer 
+		//te_layer_table
+		db->allowEmptyString ("te_layer_table", "attr_initial_time");
+		db->allowEmptyString ("te_layer_table", "attr_final_time");
+		db->allowEmptyString ("te_layer_table", "user_name");
+
+		//te_representation
+		db->allowEmptyString ("te_representation", "description");
+		
+		//te_view
+		db->allowEmptyString ("te_view", "user_name");
+
+		//te_visual
+		db->allowEmptyString ("te_visual", "lib_name");
+		db->allowEmptyString ("te_visual", "contour_lib_name");
+		db->allowEmptyString ("te_visual", "family");
+
+		//te_legend
+		db->allowEmptyString ("te_legend", "lower_value");
+		db->allowEmptyString ("te_legend", "upper_value");
+		db->allowEmptyString ("te_legend", "label");
+		
+		//te_theme
+		db->allowEmptyString ("te_theme", "generate_attribute_where");
+		db->allowEmptyString ("te_theme", "generate_spatial_where");
+		db->allowEmptyString ("te_theme", "generate_temporal_where");
+		db->allowEmptyString ("te_theme", "collection_table");
+
+		//te_grouping
+		db->allowEmptyString ("te_grouping", "grouping_attr");
+		db->allowEmptyString ("te_grouping", "grouping_norm_attr");
+		db->allowEmptyString ("te_grouping", "grouping_function");
+
+		//te_theme_application
+		db->allowEmptyString ("te_theme_application", "refine_attribute_where");
+		db->allowEmptyString ("te_theme_application", "refine_spatial_where");
+		db->allowEmptyString ("te_theme_application", "refine_temporal_where");
+		db->allowEmptyString ("te_theme_application", "grouping_color");
+		db->allowEmptyString ("te_theme_application", "pie_dimension_attr");
+		db->allowEmptyString ("te_theme_application", "text_table");
+		db->allowEmptyString ("te_theme_application", "chart_function");
+	}
+
+	//------------ auxiliary collection  
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	string sql = " SELECT theme_id, visible_rep FROM te_theme ";
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return true;
+	}
+
+	while(portal->fetchRow ())
+	{
+		string	themeId = portal->getData(0);
+		int		visRep  = atoi(portal->getData(1));
+
+		string collExtTable = "te_collection_"+ themeId +"_aux";
+		
+		if	((db->tableExist("te_collection_"+ themeId)) && 
+			((visRep & TeRASTER) != TeRASTER)			 && 
+			(!db->tableExist(collExtTable)))
+		{
+			TeTheme* theme = new TeTheme();
+			theme->id(atoi(themeId.c_str()));
+			if(!db->loadTheme (theme))
+			{
+				delete portal;
+				return false;
+			}
+
+			string up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 0";
+			up += " WHERE c_object_status <> " + Te2String(theme->pointingLegend().id());
+			up += " AND c_object_status <> " + Te2String(theme->queryLegend().id());
+			up += " AND c_object_status <> " + Te2String(theme->queryAndPointingLegend().id());
+			db->execute(up);
+
+			up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 1";
+			up += " WHERE c_object_status = " + Te2String(theme->pointingLegend().id());
+			db->execute(up);
+
+			up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 2";
+			up += " WHERE c_object_status = " + Te2String(theme->queryLegend().id());
+			db->execute(up);
+
+			up = "UPDATE " + theme->collectionTable() + " SET c_object_status = 3";
+			up += " WHERE c_object_status = " + Te2String(theme->queryAndPointingLegend().id());
+			db->execute(up);
+
+			if ((!theme->createCollectionAuxTable()) || (!theme->populateCollectionAux())) 
+			{
+				errorMessage = "Fail to mount the auxiliary table of the collection!";
+				delete portal;
+				return false;
+			}
+
+			theme->collectionAuxTable(collExtTable);
+			theme->addThemeTable(collExtTable);
+					
+			string oldTCE = theme->collectionTable() + "_ext";
+			if (db->tableExist(oldTCE))
+			{
+				string delTable = "DROP TABLE " + oldTCE;
+				db->execute(delTable);
+			}
+		}
+		
+	}
+	//------------ end auxiliary collection  
+
+	portal->freeResult();
+
+	//------------ text table  
+	// if text table have not text visual table associated, create it
+	string sel = "SELECT geom_table FROM te_representation WHERE";
+	sel += " geom_type = " + Te2String(TeTEXT);
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			string table = portal->getData(0);
+			string tvis = table + "_txvisual";
+			if(!db->tableExist(tvis))
+			{
+				TeAttributeList atl;
+				TeAttribute		at;
+
+				at.rep_.name_ = "geom_id";
+				at.rep_.type_ = TeINT;
+				at.rep_.numChar_ = 0;
+				at.rep_.isPrimaryKey_ = true;
+				atl.push_back(at);
+
+				at.rep_.isPrimaryKey_ = false;
+				at.rep_.name_ = "dot_height";
+				at.rep_.type_ = TeINT;
+				atl.push_back(at);
+
+				at.rep_.name_ = "fix_size";
+				at.rep_.type_ = TeINT;
+				atl.push_back(at);
+
+				at.rep_.name_ = "color";
+				at.rep_.type_ = TeINT;
+				atl.push_back(at);
+
+				at.rep_.name_ = "family";
+				at.rep_.type_ = TeSTRING;
+				at.rep_.numChar_ = 128;
+				atl.push_back(at);
+
+				at.rep_.name_ = "bold";
+				at.rep_.type_ = TeINT;
+				at.rep_.numChar_ = 0;
+				atl.push_back(at);
+
+				at.rep_.name_ = "italic";
+				at.rep_.type_ = TeINT;
+				atl.push_back(at);
+
+				db->createTable(tvis, atl);
+				string fk = "fk_" + tvis;
+				db->createRelation(fk, tvis, "geom_id", table, "geom_id", true);
+				string ins = "INSERT INTO " + tvis + " (geom_id) SELECT geom_id FROM " + table;
+				db->execute(ins);
+
+				string popule = "UPDATE " + tvis;
+				popule += " SET dot_height = 12";
+				popule += ", fix_size = 0";
+				popule += ", color = 16711680";
+				popule += ", family = 'verdana'";
+				popule += ", bold = 1";
+				popule += ", italic = 0";
+				if(!db->execute(popule))
+				{
+					errorMessage = "Fail to generate the text visual table!";
+					delete portal;
+					return false;;
+				}
+			}
+		}
+	}
+	//------------ end text table  
+	delete portal;
+	return true;
+}
+
+
+bool updateDB30To301(TeDatabase* db, string& errorMessage)
+{
+	TeAttribute fattr;
+
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	// ----- collection_table
+
+	string sql = " SELECT collection_table FROM te_theme ";   
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		string collName = portal->getData(0);
+		if(	(db->tableExist(collName)) && 
+			(!db->columnExist(collName, "c_object_status", fattr)))
+		{
+			TeAttributeRep atRep;
+			atRep.type_ = TeINT;
+			atRep.name_ = "c_object_status";
+			if(db->addColumn(collName, atRep) == false)
+			{
+				errorMessage = "The column c_object_status could not be appended!";
+				delete portal;
+				return false;
+			}
+
+			string upd = " UPDATE "+collName+" t1, "+collName+" t2 ";
+			upd +=	" SET t1.c_object_status = t2.c_legend_result ";
+			upd +=	" WHERE t1.c_object_id = t2.c_object_id ";
+
+			if(!db->execute (upd))
+			{
+				delete portal;
+				return false;
+			}
+
+			db->deleteColumn(collName, "c_legend_result");
+		}
+	}
+
+	delete portal;
+	return true; 
+}
+
+
+bool updateDB301To302(TeDatabase* db, string& errorMessage)
+{
+		
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	// ----- valid attribute table 
+	
+	TeAttrTableVector attrTableVec;
+	if(db->getAttrTables(attrTableVec))
+	{
+		for(unsigned int i=0; i<attrTableVec.size(); ++i)
+		{
+			TeTable fromTable = attrTableVec[i];
+			bool	flag = false;
+			
+			if(fromTable.tableType()==TeAttrMedia)
+				continue;
+
+			//verify if there is another table with the same name
+			for(unsigned int j=0; j<i; ++j)
+			{
+				if(TeConvertToUpperCase(attrTableVec[j].name())==TeConvertToUpperCase(fromTable.name())) 
+				{
+					flag = true;
+					break;
+				}
+			}
+
+			if(flag)
+				continue;
+			
+			if(db->validTable(fromTable)) //fromTable was modified
+			{
+				TeAttributeList newAttrList = fromTable.attributeList();
+				TeAttributeList oldAttrList = attrTableVec[i].attributeList();
+				TeAttributeList::iterator newAttIt = newAttrList.begin();
+				TeAttributeList::iterator oldAttIt = oldAttrList.begin();
+
+				bool change = false;
+				while(newAttIt!=newAttrList.end())
+				{
+					if(((*oldAttIt).rep_.name_) != ((*newAttIt).rep_.name_))
+					{
+						TeAttributeRep rep = (*newAttIt).rep_;
+						if(db->alterTable(fromTable.name(), rep, (*oldAttIt).rep_.name_))
+							change = true;
+					}
+
+					++newAttIt;
+					++oldAttIt;
+				}
+
+				if(change)
+				{
+					// update te_layer_table
+					string upd = " UPDATE te_layer_table ";
+					upd +=	" SET unique_id = '"+ fromTable.uniqueName() +"'";
+					upd +=  ", attr_link = '"+ fromTable.linkName() +"'";
+					upd +=	" WHERE attr_table = '"+ fromTable.name() +"'";
+
+					if(!db->execute (upd))
+					{
+						delete portal;
+						errorMessage = "Error updating te_layer_table!";
+						return false;
+					}
+				}
+			}//if
+		}//for
+		portal->freeResult();
+	}
+
+	// ----- te_grouping table
+
+	string sel = " SELECT theme_id, grouping_attr, grouping_attr_type FROM te_grouping ";
+	if(!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		string themeId, gAttr;
+		themeId = portal->getData(0);
+		gAttr = portal->getData(1);
+		int gTypr = portal->getInt(2);
+		
+		if(((gAttr.empty()) || (gAttr=="NONE")) && (gTypr==0))
+		{
+			string del = " DELETE FROM te_grouping WHERE theme_id = "+ themeId; 
+			db->execute(del);
+		}
+	}
+
+	// ----- te_grouping table
+
+	delete portal;
+	return true; 
+}
+
diff --git a/src/terralib/application/TeUpdateDBVersion.h b/src/terralib/application/TeUpdateDBVersion.h
new file mode 100644
index 0000000..528f584
--- /dev/null
+++ b/src/terralib/application/TeUpdateDBVersion.h
@@ -0,0 +1,46 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_UPDATEDBVERSION_H
+#define  __TERRALIB_INTERNAL_UPDATEDBVERSION_H
+
+#include "TeDatabase.h"
+
+//! verify if the database needs update 
+bool needUpdateDB(TeDatabase* db, string& DBversion);
+
+//! update database version 
+bool updateDBVersion(TeDatabase* db, string& DBversion, string& errorMessage);
+
+//! update database from release 2.0 to release 3.0
+bool updateDB20To30(TeDatabase* db, string& errorMessage);
+
+//! update database from release 3.0 to release 3.0.1
+bool updateDB30To301(TeDatabase* db, string& errorMessage);
+
+//! update database from release 3.0.1 to release 3.0.2 (3.0 Plus)
+bool updateDB301To302(TeDatabase* db, string& errorMessage); 
+ 
+
+#endif
+
diff --git a/src/terralib/application/qt/TeDecoderQtImage.cpp b/src/terralib/application/qt/TeDecoderQtImage.cpp
new file mode 100644
index 0000000..cf4f005
--- /dev/null
+++ b/src/terralib/application/qt/TeDecoderQtImage.cpp
@@ -0,0 +1,102 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderQtImage.h>
+
+TeDecoderQtImage::TeDecoderQtImage ( const TeRasterParams& par )
+{
+	image_ = 0;
+	params_ = par;
+}
+
+TeDecoderQtImage::~TeDecoderQtImage ()
+{
+	clear ();
+}
+
+void
+TeDecoderQtImage::init()
+{
+	params_.status_= TeNOTREADY;
+	if (params_.mode_ == 'c')	// creating a new file
+	{
+		clear ();
+		image_ = new QImage (params_.ncols_,params_.nlines_,32);
+		image_->fill(qRgb(255,255,255));
+		params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'w')
+	{
+		if (image_)
+			params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'r')
+	{
+		if (image_)
+			params_.status_ = TeREADYTOREAD;	
+	}
+}
+
+bool
+TeDecoderQtImage::clear()
+{
+	if (image_ != 0)
+		delete image_;
+	image_ = 0;
+	return true;
+}
+
+bool 
+TeDecoderQtImage::getElement (int col, int lin, double &val,int band )
+{
+	QRgb cell = image_->pixel ( col, lin );
+
+	if (band == 0)
+		val = (double) qRed(cell);
+	if (band == 1)
+		val = (double) qGreen(cell);
+	if (band == 2)
+		val = (double) qBlue(cell);
+
+	return true;
+}
+
+bool 
+TeDecoderQtImage::setElement (int col, int lin, double val,int band )
+{
+	int r,g,b;
+	QRgb cell = image_->pixel ( col, lin );
+	r = qRed(cell);
+	g = qGreen(cell);
+	b = qBlue(cell);
+
+	if (band == 0)
+		r = (int)val;
+	if (band == 1)
+		g = (int)val;
+	if (band == 2)
+		b = (int)val;
+
+	image_->setPixel(col,lin, qRgb ( r,  g,  b));
+	return true;
+}
+
+
diff --git a/src/terralib/application/qt/TeDecoderQtImage.h b/src/terralib/application/qt/TeDecoderQtImage.h
new file mode 100644
index 0000000..cdb2ac6
--- /dev/null
+++ b/src/terralib/application/qt/TeDecoderQtImage.h
@@ -0,0 +1,61 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation. 
+*************************************************************************************/
+
+/*! \file TeDecoderQtImage_H.h
+    This file contais the definitions of a decoder to a QTImage
+*/
+#ifndef __TERRALIB_INTERNAL_DECODERQTIMAGE_H
+#define __TERRALIB_INTERNAL_DECODERQTIMAGE_H
+
+#include "TeDecoder.h"
+#include <qimage.h>
+
+//! Implements a decoder to access a Qt image as a TeRaster
+class TeDecoderQtImage : public TeDecoder
+{
+public:
+	TeDecoderQtImage ( const TeRasterParams& );
+	~TeDecoderQtImage ();
+
+	bool setElement (int col, int lin, double val, int band = 0);
+	bool getElement (int col, int lin, double &val, int band = 0);
+
+	void init	();
+	bool clear	();
+	QImage*	getImage () { return image_; }
+private:
+
+	QImage*	image_;
+};
+
+//! Implements a factory to build TeQtDecoders
+class TeDecoderQtImageFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderQtImageFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderQtImage(arg); }
+};
+
+#endif
+
diff --git a/src/terralib/application/qt/TeInitRasterQtDecoder.cpp b/src/terralib/application/qt/TeInitRasterQtDecoder.cpp
new file mode 100644
index 0000000..04a5aa5
--- /dev/null
+++ b/src/terralib/application/qt/TeInitRasterQtDecoder.cpp
@@ -0,0 +1,11 @@
+#include <TeDecoderQtImage.h>
+
+#include <map>
+
+void TeInitRasterQtDecoder();
+
+void 
+TeInitRasterQtDecoder()
+{
+	static TeDecoderQtImageFactory theDecoderQtImageFactory("QT");
+}
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtAnimaThread.cpp b/src/terralib/application/qt/TeQtAnimaThread.cpp
new file mode 100644
index 0000000..92907f0
--- /dev/null
+++ b/src/terralib/application/qt/TeQtAnimaThread.cpp
@@ -0,0 +1,117 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+#include <TeQtAnimaThread.h>
+#include <TeQtCanvas.h>
+#include <qpainter.h>
+#include <qpaintdevice.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+#include <qpushbutton.h>
+#include <qslider.h>
+#include <animation.h>
+#include <qdatetime.h>
+
+void TeQtAnimaThread::run()
+{
+	bool init = false;
+	stop_ = false;
+	frame_ = pauseFrame_;
+	frames_ = fileList_.count();
+	animation_->playingScrollBar->setMinValue(0);
+	animation_->playingScrollBar->setMaxValue(frames_-1);
+	animation_->playingScrollBar->setValue(frame_);
+	while(frame_ < frames_)
+	{
+		showFrame(frame_);
+		if(pause_)
+			frame_ = pauseFrame_;
+		if(pause_ || stop_)
+			break;
+
+		int t = 10000 / animation_->velocitySlider->value() - 10000 / animation_->velocitySlider->maxValue();
+		sleep(t);
+		frame_++;
+		if(frame_ == frames_)
+		{
+			if(animation_->loopCheckBox->isChecked())
+			{
+				sleep(t);
+				sleep(t);
+				frame_ = 0;
+			}
+			else
+				init = true;
+		}
+	}
+	if(init)
+	{
+		animation_->stopButton->setEnabled(false);
+		animation_->pauseButton->setEnabled(false);
+		animation_->playButton->setEnabled(true);
+		animation_->playingScrollBar->setEnabled(false);
+		showFrame(0);
+	}
+}
+
+void TeQtAnimaThread::showFrame(int i)
+{
+	if((unsigned int)i >= fileList_.count())
+		return;
+	pauseFrame_ = i;
+	QString s = *(fileList_.at(i));
+	QString ss = dir_.absPath() + "/" + s;
+	QPixmap pixmap(ss);
+	QRect rect = pixmap.rect();
+	QRect crect = canvas_->viewport()->rect();
+	rect = crect.intersect(rect);
+	QPaintDevice *device = canvas_->viewport();
+	bitBlt(device, 0, 0, &pixmap, 0, 0, rect.width(), rect.height(), Qt::CopyROP);
+	animation_->frameNumberLineEdit->setText(Te2String(pauseFrame_).c_str());
+	animation_->playingScrollBar->setValue(pauseFrame_);
+}
+
+void TeQtAnimaThread::setAnimation(Animation* a, QDir d)
+{
+	animation_ = a;
+	dir_ = d;
+	fileList_ = dir_.entryList(QDir::Files);
+}
+
+void TeQtAnimaThread::stop()
+{
+	if(pause_)
+		pause_=false;
+	stop_ = true; wait();
+}
+
+void TeQtAnimaThread::sleep(int t)
+{
+	QTime time;
+	time.start();
+
+	int vel = animation_->velocitySlider->value();
+	int frame = animation_->playingScrollBar->value();
+	while(time.elapsed() < t)
+	{
+		if(pause_ || stop_ || vel != animation_->velocitySlider->value() || frame != animation_->playingScrollBar->value())
+			break;
+	}
+}
diff --git a/src/terralib/application/qt/TeQtAnimaThread.h b/src/terralib/application/qt/TeQtAnimaThread.h
new file mode 100644
index 0000000..a1cb302
--- /dev/null
+++ b/src/terralib/application/qt/TeQtAnimaThread.h
@@ -0,0 +1,48 @@
+#ifndef  __TERRALIB_INTERNAL_QTANIMATHREAD_H
+#define  __TERRALIB_INTERNAL_QTANIMATHREAD_H
+#include <qthread.h>
+#include<qdir.h>
+#include<qstringlist.h>
+class TeQtCanvas;
+class Animation;
+
+class TeQtAnimaThread : public QThread
+{
+public:
+	TeQtAnimaThread(){
+		canvas_ = 0;
+		pause_ = false;
+		stop_ = true;
+		rate_ = 1;
+		frame_ = 0;
+		frames_ = 0;
+		pauseFrame_ = 0;
+	}
+
+	void run();
+	void stop();
+	void pause(bool b) {pause_ = b;}
+	bool pause() {return pause_;}
+	void frame(int n) {frame_ = n;}
+	int frame() {return frame_;}
+	void frames(int n) {frames_ = n;}
+	int frames() {return frames_;}
+	int pauseFrame(int pf) {return pauseFrame_ = pf;}
+	void canvas(TeQtCanvas* c) {canvas_ = c;}
+	void setAnimation(Animation* a, QDir d);
+	void showFrame(int i);
+
+private:
+	bool		pause_;
+	bool		stop_;
+	int			rate_;
+	int			frame_;
+	int			frames_;
+	int			pauseFrame_;
+	TeQtCanvas*	canvas_;
+	Animation*	animation_;
+	QDir		dir_;
+	QStringList	fileList_;
+	void sleep(int t);
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtBasicCanvas.cpp b/src/terralib/application/qt/TeQtBasicCanvas.cpp
new file mode 100644
index 0000000..a04c4be
--- /dev/null
+++ b/src/terralib/application/qt/TeQtBasicCanvas.cpp
@@ -0,0 +1,2428 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtBasicCanvas.h>
+#include <TeQtCanvas.h>
+#include <TeDecoderMemory.h>
+#include <TeQtProgress.h>
+#include <TeVectorRemap.h>
+#include <TeGeometryAlgorithms.h>
+#include <TeDefines.h>
+#include <TeRasterRemap.h>
+#include <TeDecoderQtImage.h>
+
+#include <qpaintdevice.h> 
+#include <qpaintdevicemetrics.h> 
+#include <qapplication.h>
+
+#include <algorithm>	
+#include <time.h>
+
+
+//TeQtBasicCanvas::TeQtBasicCanvas( )
+TeQtBasicCanvas::TeQtBasicCanvas(QWidget *parent, const char *name ) : QScrollView(parent,name,WNorthWestGravity)
+{
+	pixmap0_ = 0;
+	pixmap1_ = 0;
+	pixmap2_ = 0;
+	pixmap3_ = 0;
+	backRaster_ = 0;
+
+	canvasProjection_ = 0;
+	dataProjection_ = 0;
+	pointStyle_ = 0;
+	nodeStyle_ = 0;
+	pointSize_ = 3;
+	nodeSize_ = 4;
+
+#ifdef WIN32
+	int winVersion = qApp->winVersion();
+	if (winVersion == Qt::WV_2000 || winVersion == Qt::WV_NT)
+		setTextTTStyle (QString("c:/winnt/fonts/tahoma.ttf"),10);
+	else
+		setTextTTStyle (QString("c:/windows/fonts/tahoma.ttf"),10);
+#else
+	char *s = "/usr/share/fonts/ttf/western/Bluehigc.ttf";
+	QString qs = s;
+	setTextTTStyle (qs,10);
+#endif
+	textTT_ = true;
+	db_ = 0;
+
+	//Mounting the brushStyleMap
+	brushStyleMap_[TePolyTypeTransparent] = Qt::NoBrush;
+	brushStyleMap_[TePolyTypeFill] = Qt::SolidPattern;
+	brushStyleMap_[TePolyTypeHorizontal] = Qt::HorPattern;
+	brushStyleMap_[TePolyTypeVertical] = Qt::VerPattern;
+	brushStyleMap_[TePolyTypeFDiagonal] = Qt::FDiagPattern;
+	brushStyleMap_[TePolyTypeBDiagonal] = Qt::BDiagPattern;
+	brushStyleMap_[TePolyTypeCross] = Qt::CrossPattern;
+	brushStyleMap_[TePolyTypeDiagonalCross] = Qt::DiagCrossPattern;
+
+	//Mounting the penStyleMap
+	penStyleMap_[TeLnTypeContinuous] = Qt::SolidLine;
+	penStyleMap_[TeLnTypeDashed] = Qt::DashLine;
+	penStyleMap_[TeLnTypeDotted] = Qt::DotLine;
+	penStyleMap_[TeLnTypeDashDot] = Qt::DashDotLine;
+	penStyleMap_[TeLnTypeDashDotDot] = Qt::DashDotDotLine;
+	penStyleMap_[TeLnTypeNone] = Qt::NoPen;
+}
+
+TeQtBasicCanvas::~TeQtBasicCanvas()
+{
+	if (dataProjection_)
+		delete dataProjection_;
+	if (canvasProjection_)
+		delete canvasProjection_;
+}
+
+void
+TeQtBasicCanvas::setDataProjection ( TeProjection* proj )
+{	
+	if(dataProjection_)
+		delete dataProjection_;
+	dataProjection_ = TeProjectionFactory::make(proj->params());
+	if (canvasProjection_ && dataProjection_ && !(*canvasProjection_== *dataProjection_))
+	{
+		dataProjection_->setDestinationProjection(canvasProjection_);
+		canvasProjection_->setDestinationProjection(dataProjection_);
+	}
+}
+
+void
+TeQtBasicCanvas::setProjection ( TeProjection* proj )
+{	
+	if (canvasProjection_)
+		delete canvasProjection_;
+	canvasProjection_ = TeProjectionFactory::make(proj->params()); 
+	params_.projection(canvasProjection_);
+}
+
+void TeQtBasicCanvas::plotOnWindow ()
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev == viewport())
+		return;
+	if(dev)
+		painter_.end();
+	painter_.begin(viewport());
+}
+
+void TeQtBasicCanvas::plotOnPixmap0 ()
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev == pixmap0_)
+		return;
+	if(dev)
+		painter_.end();
+	painter_.begin(pixmap0_);
+}
+
+void TeQtBasicCanvas::plotOnPixmap1 ()
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev == pixmap1_)
+		return;
+	if(dev)
+		painter_.end();
+	painter_.begin(pixmap1_);
+}
+
+void TeQtBasicCanvas::setWorld(TeBox b, int w, int h, QPaintDevice *pd)
+{
+	xmin_= b.x1();
+	xmax_= b.x2();
+	ymin_= b.y1();
+	ymax_= b.y2();
+	setView (w,h,pd);
+	bool extend = pd ? false : true;
+	TeQtBasicCanvas::setTransformation (b.x1(),b.x2(),b.y1(),b.y2(),extend);
+	params_.nBands(3);
+	double resx = pixelSize();
+	double resy = pixelSize();
+	TeBox box(getWorld());
+	params_.lowerLeftResolutionSize(box.x1_+0.5*resx,box.y1_+0.5*resy,resx,resy,width_,height_);
+	params_.projection();
+	params_.mode_ = 'w';
+	params_.decoderIdentifier_ = "";
+}
+void TeQtBasicCanvas::setTransformation(double xmin, double xmax, double ymin, double ymax, bool extend)
+{
+	if (painter_.device() == 0)
+		return;
+	
+	xmin_= xmin;
+	xmax_= xmax;
+	ymin_= ymin;
+	ymax_= ymax;
+	double	dxw = xmax_ - xmin_,
+			dyw = ymax_ - ymin_,
+			dxv = width_,
+			dyv = height_;
+					
+	double	fx = dxv/dxw,
+			fy = dyv/dyw;
+
+	if (fx > fy)
+	{
+		f_ = fy;
+		if (extend)
+		{
+			dxw = width_/f_;
+			xmax_ = xmin_ + dxw;
+		}
+		else
+			width_ = (int)(f_*dxw + .5);
+	}
+	else
+	{
+		f_ = fx;
+		if (extend)
+		{
+			dyw = height_/f_;
+			ymax_ = ymin_ + dyw;
+		}
+		else
+			height_ = (int)(f_*dyw + .5);
+	}
+
+	wc_ = TeBox (xmin_,ymin_,xmax_,ymax_);
+	params_.boundingBoxResolution(xmin_,ymin_,xmax_,ymax_,params_.resx_,params_.resy_);
+
+	QPaintDeviceMetrics devMetric(viewport());
+	double wpixels = devMetric.width();
+	double wMM = devMetric.widthMM();
+	double wT = wMM;
+	if(canvasProjection_)
+	{
+		string unit = canvasProjection_->units();
+		if(unit == "Meters")
+			wT = wMM / 1000.;
+		else if(unit == "Kilometers")
+			wT = wMM / 1000000.;
+		else if(unit == "Centimeters")
+			wT = wMM / 100.;
+		else if(unit == "Millimeters")
+			wT = wMM;
+		else if(unit == "Feet")
+			wT = wMM / (12. * 25.4);
+		else if(unit == "Inches")
+			wT = wMM / 25.4;
+		else if(unit == "DecimalDegrees")
+			wT = wMM / 110000000.;
+	}
+	double wp = wT / wpixels;
+	scaleApx_ = (1. / f_) / wp;
+}
+
+void TeQtBasicCanvas::scaleApx(double scale)
+{
+	QPaintDeviceMetrics devMetric(viewport());
+	double wMM = devMetric.widthMM();
+	double wT = wMM;
+	if(canvasProjection_)
+	{
+		string unit = canvasProjection_->units();
+		if(unit == "Meters")
+			wT = wMM / 1000.;
+		else if(unit == "Kilometers")
+			wT = wMM / 1000000.;
+		else if(unit == "Centimeters")
+			wT = wMM / 100.;
+		else if(unit == "Millimeters")
+			wT = wMM;
+		else if(unit == "Feet")
+			wT = wMM / (12. * 25.4);
+		else if(unit == "Inches")
+			wT = wMM / 25.4;
+		else if(unit == "DecimalDegrees")
+			wT = wMM / 110000000.;
+	}
+
+	double ff = scale / scaleApx_;
+	double xmin, ymin, xmax, ymax;
+	if(ff < 1)
+	{
+		double dx = (wc_.width() - (wc_.width() * ff)) / 2.;
+		double dy = (wc_.height() - (wc_.height() * ff)) / 2.;
+		xmin = xmin_ + dx;
+		ymin = ymin_ + dy;
+		xmax = xmax_ - dx;
+		ymax = ymax_ - dy;
+	}
+	else
+	{
+		double dx = ((wc_.width() * ff) - wc_.width()) / 2.;
+		double dy = ((wc_.height() * ff) - wc_.height()) / 2.;
+		xmin = xmin_ - dx;
+		ymin = ymin_ - dy;
+		xmax = xmax_ + dx;
+		ymax = ymax_ + dy;
+	}
+
+	TeBox box(xmin, ymin, xmax, ymax);
+	setWorld(box);
+}
+
+double TeQtBasicCanvas::mapVtoDW (int pixels)
+{
+	TeBox wbox = getDataWorld();
+	TeCoord2D	wpc(wbox.x1_ + wbox.width()/2., wbox.y1_ + wbox.height()/2.);
+	QPoint pc = mapWtoV(wpc);
+	QPoint qp(pc.x()+pixels, pc.y());
+	TeCoord2D	wp = mapVtoDW(qp);
+	wpc = mapVtoDW(pc);
+	double d = fabs(wp.x() - wpc.x());
+	return d;
+}
+
+TeCoord2D TeQtBasicCanvas::mapVtoDW (QPoint v)
+{
+	TeCoord2D w((v.x()-x0_)/f_ + xmin_,
+		(height_ - y0_ - v.y())/f_ + ymin_);
+
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		w = canvasProjection_->PC2LL (w);
+		w = dataProjection_->LL2PC (w);
+	}
+	return w;
+}
+
+double TeQtBasicCanvas::mapVtoW (int pixels)
+{
+	TeBox wbox = getDataWorld();
+	TeCoord2D	wpc(wbox.x1_ + wbox.width()/2., wbox.y1_ + wbox.height()/2.);
+	QPoint pc = mapWtoV(wpc);
+	QPoint qp(pc.x()+pixels, pc.y());
+	TeCoord2D	wp = mapVtoW(qp);
+	wpc = mapVtoW(pc);
+	double d = fabs(wp.x() - wpc.x());
+	return d;
+}
+
+TeCoord2D TeQtBasicCanvas::mapVtoW (QPoint v)
+{
+	TeCoord2D w((v.x()-x0_)/f_ + xmin_,
+		(height_ - y0_ - v.y())/f_ + ymin_);
+	return w;
+}
+
+TeBox TeQtBasicCanvas::getDataWorld()
+{
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		TeBox b = TeRemapBox ( wc_, canvasProjection_, dataProjection_);
+		return b;
+	}
+	return wc_ ;
+}
+
+QPoint TeQtBasicCanvas::mapWtoV (TeCoord2D w)
+{
+	TeCoord2D tw = w;
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		tw = dataProjection_->PC2LL (tw);
+		tw = canvasProjection_->LL2PC (tw);
+	}
+
+	QPoint v((int)((tw.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((tw.y() - ymin_)*f_ + 0.5));
+	correctScrolling (v);
+	return v;
+}
+
+void TeQtBasicCanvas::mapWtoV (TeBox& w)
+{
+	TeCoord2D tw = w.lowerLeft();
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		tw = dataProjection_->PC2LL (tw);
+		tw = canvasProjection_->LL2PC (tw);
+	}
+
+	QPoint p1((int)((tw.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((tw.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p1);
+
+	tw = w.upperRight();
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		tw = dataProjection_->PC2LL (tw);
+		tw = canvasProjection_->LL2PC (tw);
+	}
+
+	QPoint p2((int)((tw.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((tw.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p2);
+	w.x1_ = p1.x();
+	w.y1_ = p2.y();
+	w.x2_ = p2.x();
+	w.y2_ = p1.y();
+}
+
+void TeQtBasicCanvas::mapCanvasWorldToDataWorld (TeBox& w)
+{
+	TeCoord2D wll = w.lowerLeft();
+	TeCoord2D wur = w.upperRight();
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		canvasProjection_->setDestinationProjection(dataProjection_);
+		wll = canvasProjection_->PC2LL (wll);
+		wll = dataProjection_->LL2PC (wll);
+		wur = canvasProjection_->PC2LL (wur);
+		wur = dataProjection_->LL2PC (wur);
+	}
+
+	w = TeBox(wll, wur);
+}
+
+void TeQtBasicCanvas::mapDataWorldToCanvasWorld (TeBox& w)
+{
+	TeCoord2D wll = w.lowerLeft();
+	TeCoord2D wur = w.upperRight();
+	if ( canvasProjection_ && dataProjection_ )
+	if ( canvasProjection_ != dataProjection_ && !(*canvasProjection_ == *dataProjection_) )
+	{
+		dataProjection_->setDestinationProjection(canvasProjection_);
+		wll = dataProjection_->PC2LL (wll);
+		wll = canvasProjection_->LL2PC (wll);
+		wur = dataProjection_->PC2LL (wur);
+		wur = canvasProjection_->LL2PC (wur);
+	}
+
+	w = TeBox(wll, wur);
+}
+
+void TeQtBasicCanvas::mapCanvasWorldToViewport (TeBox& w)
+{
+	QPoint p1((int)((w.x1() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((w.y1() - ymin_)*f_ + 0.5));
+	correctScrolling (p1);
+
+	QPoint p2((int)((w.x2() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((w.y2() - ymin_)*f_ + 0.5));
+	correctScrolling (p2);
+
+// swap y value
+	w.x1_ = p1.x();
+	w.y1_ = p2.y();
+	w.x2_ = p2.x();
+	w.y2_ = p1.y();
+}
+
+void TeQtBasicCanvas::mapViewportToCanvasWorld (TeBox& v)
+{
+// swap y value
+
+	TeCoord2D w1((v.x1()-x0_)/f_ + xmin_,
+		(height_ - y0_ - v.y2())/f_ + ymin_);
+
+	TeCoord2D w2((v.x2()-x0_)/f_ + xmin_,
+		(height_ - y0_ - v.y1())/f_ + ymin_);
+
+	v = TeBox(w1, w2);
+}
+
+QPoint TeQtBasicCanvas::mapCanvasWorldToViewport (TeCoord2D& c)
+{
+	QPoint p((int)((c.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((c.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p);
+
+	return p;
+}
+
+void TeQtBasicCanvas::setPolygonColor (int r, int g, int b)
+{
+//	polygonColor_.setRgb(r,g,b);
+//	polygonBrush_.setColor (polygonColor_);
+
+	QRgb cor = qRgba(r, g, b, 50);
+	polygonColor_.setRgb(cor);
+	polygonBrush_.setColor (polygonColor_);
+}
+
+void TeQtBasicCanvas::setPolygonStyle (int s, int t)
+{
+	polygonBrush_.setStyle(brushStyleMap_[(TePolyBasicType)s]);
+	polygonTransparency_ = t;
+}
+
+void TeQtBasicCanvas::setPolygonLineColor (int r, int g, int b)
+{
+	QColor cor(r, g, b);
+	polygonPen_.setColor (cor);
+}
+
+void TeQtBasicCanvas::setPolygonLineStyle (int s, int w)
+{
+	polygonPen_.setStyle(penStyleMap_[(TeLnBasicType)s]);
+	polygonPen_.setWidth(w);
+}
+
+void TeQtBasicCanvas::setLineColor (int r, int g, int b)
+{
+	lineColor_.setRgb(r,g,b);
+	linePen_.setColor (lineColor_);
+}
+
+void TeQtBasicCanvas::setLineStyle (int s, int w)
+{
+	linePen_.setStyle(penStyleMap_[(TeLnBasicType)s]);
+	linePen_.setWidth(w);
+}
+
+void TeQtBasicCanvas::setTextColor (int r, int g, int b)
+{
+	textColor_.setRgb(r,g,b);
+	textPen_.setColor (textColor_);
+}
+
+void TeQtBasicCanvas::setTextStyle (string& family, int size, bool bold, bool italic )
+{
+	textFont_.setFamily (family.c_str());
+	textFont_.setBold (bold);
+	textFont_.setItalic (italic);
+	if(size <= 0)
+		textSize_ = 1;
+	else
+		textSize_ = size;
+	textFont_.setPointSize (textSize_);
+}
+
+void TeQtBasicCanvas::setTextSize (int size)
+{
+	if(size <= 0)
+		textSize_ = 1;
+	else
+		textSize_ = size;
+	textFont_.setPointSize (textSize_);
+}
+
+void TeQtBasicCanvas::setTextTTStyle (QString& font, int size)
+{
+	textTTFont_ = font.latin1();
+	textSize_ = size;
+}
+
+void TeQtBasicCanvas::plotText (TeCoord2D &pt, string &str, double angle, double /*alignh*/, double /*alignv*/)
+{
+	painter_.setPen(textPen_);
+	painter_.setFont(textFont_);
+	QPoint p = mapWtoV (pt);
+	if (angle != 0.)
+	{
+		painter_.save ();
+		painter_.translate (p.x(),p.y());
+		painter_.rotate (-angle);
+		painter_.drawText (0,-4,QString(str.c_str()));
+		painter_.restore ();
+	}
+	else
+		painter_.drawText (p,QString(str.c_str()));
+}
+
+void TeQtBasicCanvas::plotText (TeText& tx, TeVisual& visual)
+{
+	if(tx.textValue().empty())
+		return;
+
+	int	x, y;
+
+	TeCoord2D pt = tx.location();
+	QPoint p = mapWtoV (pt);
+	double angle = tx.angle();
+
+	QRect brect = textRect(tx, visual);
+	painter_.setFont(textFont_);
+	painter_.setPen(textPen_);
+	painter_.setRasterOp (Qt::CopyROP);
+	string st = tx.textValue();
+
+	if (angle != 0.)
+	{
+		x = - brect.width()/2;
+		y = - brect.height()/2;
+		painter_.save ();
+		painter_.translate (p.x(), p.y());
+		painter_.rotate (-angle);
+		painter_.drawText(x, y, brect.width(), brect.height(), Qt::AlignLeft|Qt::DontClip, st.c_str());
+		painter_.restore ();
+	}
+	else
+	{
+		x = p.x() - brect.width()/2;
+		y = p.y() - brect.height()/2;
+		painter_.drawText(x, y, brect.width(), brect.height(), Qt::AlignLeft|Qt::DontClip, st.c_str());
+	}
+}
+
+QRect TeQtBasicCanvas::textRect (TeText& tx, TeVisual visual)
+{
+	QRect rect;
+	if(tx.textValue().empty())
+		return rect;
+
+	int size;
+	int fixedSize = visual.fixedSize(); // font size is fixed
+	if(fixedSize == false && tx.height() > 0.)
+	{
+		TeBox wbox = getDataWorld();
+		TeCoord2D p1(wbox.x1_, wbox.y1_);
+		TeCoord2D p2(double(p1.x() + tx.height()), double(p1.y() + tx.height()));
+		TeBox box(p1, p2);
+		mapWtoV(box);
+		size = int(box.height());
+	}
+	else
+		size = visual.size(); // font size
+	if(size == 0)
+		size = 1;
+
+	setTextSize(size);
+	textFont_.setFamily (visual.family().c_str());
+
+	TeCoord2D pt = tx.location();
+	QPoint p = mapWtoV (pt);
+
+	string st = tx.textValue();
+	QFontMetrics fm(textFont_);
+//	int hh = fm.height();							//hh is not used
+//	int ww = fm.width(st.c_str());			//ww is not used
+	rect = fm.boundingRect(st.c_str());
+	QPoint cc = rect.center();
+	QPoint tr = p;
+	tr = tr - cc;
+	rect.setRight(rect.right()+tr.x());
+	rect.setLeft(rect.left()+tr.x());
+	rect.setTop(rect.top()+tr.y());
+	rect.setBottom(rect.bottom()+tr.y());
+	QPoint o = offset();
+	rect.moveCenter(rect.center() + o); // do offset translation on window
+	return rect;
+}
+
+void TeQtBasicCanvas::plotXorPolyline (QPointArray& PA, bool cdev)
+{
+//	if(painter_ == 0)
+//		return;
+
+	QPoint o = offset();
+	QPen pen(QColor("green"));
+
+	plotOnPixmap0();
+	painter_.save ();
+	if(cdev == false)
+		painter_.translate(o.x(), o.y());
+	painter_.setRasterOp (Qt::XorROP);
+	painter_.setPen(pen);
+	painter_.drawPolyline(PA);
+	painter_.restore ();
+
+	plotOnWindow(); // do offset translation on window
+	painter_.save ();
+	if(cdev)
+		painter_.translate(-o.x(), -o.y());
+	painter_.setRasterOp (Qt::XorROP);
+	painter_.setPen(pen);
+	painter_.drawPolyline(PA);
+	painter_.restore ();
+
+}
+
+void TeQtBasicCanvas::plotTextRects (TeText& tx, TeVisual visual)
+{
+	if(tx.textValue().empty())
+		return;
+
+	QPoint o = offset();
+	QRect rect, l, r, t, b, c;
+
+	TeCoord2D pt = tx.location();
+	plotOnWindow();
+	QPoint p = mapWtoV (pt) + o;
+	double angle = tx.angle();
+
+	rect = textRect(tx, visual);
+	if(angle != 0.)
+	{
+		rect.setTop(rect.top()-p.y());
+		rect.setBottom(rect.bottom()-p.y());
+		rect.setLeft(rect.left()-p.x());
+		rect.setRight(rect.right()-p.x());
+	}
+
+	l = rect;
+	l.setTop(rect.top()+rect.height()/2-3);
+	l.setBottom(rect.top()+rect.height()/2+3);
+	l.setRight(rect.left() + 6);
+
+	r = rect;
+	r.setTop(l.top());
+	r.setBottom(l.bottom());
+	r.setLeft(rect.right() - 6);
+
+	t = rect;
+	t.setLeft(rect.left()+rect.width()/2-3);
+	t.setRight(rect.left()+rect.width()/2+3);
+	t.setBottom(rect.top() + 6);
+
+	b = rect;
+	b.setLeft(t.left());
+	b.setRight(t.right());
+	b.setTop(rect.bottom() - 6);
+
+	c.setLeft(rect.left()+rect.width()/2-3);
+	c.setRight(c.left() + 6);
+	c.setTop(rect.top()+rect.height()/2-3);
+	c.setBottom(c.top() + 6);
+
+	QPointArray parL(4);
+	parL.setPoint(0, l.bottomLeft());
+	parL.setPoint(1, l.bottomRight());
+	parL.setPoint(2, l.topRight());
+	parL.setPoint(3, l.topLeft());
+
+	QPointArray parR(4);
+	parR.setPoint(0, r.bottomRight());
+	parR.setPoint(1, r.bottomLeft());
+	parR.setPoint(2, r.topLeft());
+	parR.setPoint(3, r.topRight());
+
+	QPointArray parT(4);
+	parT.setPoint(0, t.topLeft());
+	parT.setPoint(1, t.bottomLeft());
+	parT.setPoint(2, t.bottomRight());
+	parT.setPoint(3, t.topRight());
+
+	QPointArray parB(4);
+	parB.setPoint(0, b.bottomLeft());
+	parB.setPoint(1, b.topLeft());
+	parB.setPoint(2, b.topRight());
+	parB.setPoint(3, b.bottomRight());
+
+	QBrush	brush(QColor("green"));
+
+	if (angle != 0.)
+	{
+		plotOnPixmap0();
+		painter_.save ();
+		painter_.setRasterOp (Qt::XorROP);
+		painter_.setBrush(Qt::NoBrush);
+		QPen pen(QColor("green"));
+		painter_.setPen(pen);
+		painter_.translate (p.x(), p.y());
+		painter_.rotate (-angle);
+		painter_.drawRect(rect);
+		painter_.drawPolyline(parL);
+		painter_.drawPolyline(parR);
+		painter_.drawPolyline(parT);
+		painter_.drawPolyline(parB);
+		painter_.fillRect(c, brush);
+		painter_.restore ();
+
+		plotOnWindow(); // do offset translation on window
+		painter_.save ();
+		painter_.setRasterOp (Qt::XorROP);
+		painter_.setBrush(Qt::NoBrush);
+		pen = QPen(QColor("green"));
+		painter_.setPen(pen);
+		painter_.translate (p.x()-o.x(), p.y()-o.y());
+		painter_.rotate (-angle);
+		painter_.drawRect(rect);
+		painter_.drawPolyline(parL);
+		painter_.drawPolyline(parR);
+		painter_.drawPolyline(parT);
+		painter_.drawPolyline(parB);
+		painter_.fillRect(c, brush);
+		painter_.restore ();
+	}
+	else
+	{
+		plotOnPixmap0();
+		painter_.save ();
+		painter_.setRasterOp (Qt::XorROP);
+		painter_.setBrush(Qt::NoBrush);
+		QPen pen(QColor("green"));
+		painter_.setPen(pen);
+		painter_.drawRect(rect);
+		painter_.drawPolyline(parL);
+		painter_.drawPolyline(parR);
+		painter_.drawPolyline(parT);
+		painter_.drawPolyline(parB);
+		painter_.fillRect(c, brush);
+		painter_.restore ();
+
+		plotOnWindow(); // do offset translation on window
+		painter_.save ();
+		painter_.setRasterOp (Qt::XorROP);
+		painter_.setBrush(Qt::NoBrush);
+		pen = QPen(QColor("green"));
+		painter_.setPen(pen);
+		painter_.translate (-o.x(), -o.y());
+		painter_.drawRect(rect);
+		painter_.drawPolyline(parL);
+		painter_.drawPolyline(parR);
+		painter_.drawPolyline(parT);
+		painter_.drawPolyline(parB);
+		painter_.fillRect(c, brush);
+		painter_.restore ();
+	}
+}
+
+void TeQtBasicCanvas::setArcColor (int r, int g, int b)
+{
+	arcColor_.setRgb(r,g,b);
+}
+
+void TeQtBasicCanvas::setArcStyle (int s, int w )
+{
+	arcPen_.setStyle ((Qt::PenStyle)s);
+	arcPen_.setWidth(w);
+}
+
+void TeQtBasicCanvas::setPointColor (int r, int g, int b)
+{
+	pointColor_.setRgb(r,g,b);
+}
+
+void TeQtBasicCanvas::setPointStyle (int s, int w)
+{
+	pointStyle_ = (TePtBasicType) s;
+	pointSize_ = w;
+}
+
+void TeQtBasicCanvas::plotPoint (TeCoord2D &pt)
+{	
+	pointPen_.setColor (pointColor_);
+	painter_.setPen(pointPen_);
+
+	QPoint p = mapWtoV (pt);
+
+	plotMark(p,pointStyle_, pointSize_);
+}
+
+void TeQtBasicCanvas::setNodeColor (int r, int g, int b)
+{
+	nodeColor_.setRgb(r,g,b);
+}
+
+void TeQtBasicCanvas::setNodeStyle (int s, int w)
+{
+	nodeStyle_ = s;
+	nodeSize_ = w;
+}
+
+void TeQtBasicCanvas::plotNode (TeNode &pt)
+{	
+	nodePen_.setColor (nodeColor_);
+	painter_.setPen(nodePen_);
+
+	QPoint p = mapWtoV (pt.location());
+	plotMark(p,nodeStyle_, nodeSize_);
+}
+
+
+void TeQtBasicCanvas::plotMark(QPoint &p, int s, int w)
+{
+	painter_.setPen(pointColor_);
+	if (s == TePtTypePlus)
+	{
+		painter_.drawLine (p.x()-w/2,p.y(),p.x()+w/2,p.y());
+		painter_.drawLine (p.x(),p.y()-w/2,p.x(),p.y()+w/2);
+	}
+	else if (s == TePtTypeStar)
+	{
+		painter_.save ();
+		painter_.translate (p.x(),p.y());
+		painter_.drawLine (0,-w/2,0,w/2);
+		painter_.rotate (45);
+		painter_.drawLine (0,-w/2,0,w/2);
+		painter_.rotate (-90);
+		painter_.drawLine (0,-w/2,0,w/2);
+		painter_.restore ();
+	}
+	else if (s == TePtTypeCircle)
+	{
+		painter_.setBrush(pointColor_);
+		painter_.drawChord (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+	}
+	else if (s == TePtTypeX)
+	{
+		painter_.drawLine (p.x()-w/2,p.y()-w/2,p.x()+w/2,p.y()+w/2);
+		painter_.drawLine (p.x()-w/2,p.y()+w/2,p.x()+w/2,p.y()-w/2);
+	}
+	else if (s == TePtTypeBox)
+	{
+		painter_.fillRect (p.x()-w/2,p.y()-w/2,w,w,pointColor_);
+	}
+	else if (s == TePtTypeDiamond)
+	{
+		QPointArray pa(5);
+		pa.setPoint(0, p.x()-w/2, p.y());
+		pa.setPoint(1, p.x(), p.y()-w/2);
+		pa.setPoint(2, p.x()+w/2, p.y());
+		pa.setPoint(3, p.x(), p.y()+w/2);
+ 		pa.setPoint(4, p.x()-w/2, p.y());
+		painter_.setBrush(pointColor_);
+		painter_.drawPolygon(pa);
+	}
+	else if (s == TePtTypeHollowCircle)
+	{
+		painter_.drawArc (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+	}
+	else if (s == TePtTypeHollowBox)
+	{
+		painter_.setBrush(Qt::NoBrush);
+		painter_.drawRect (p.x()-w/2,p.y()-w/2,w,w);
+	}
+	else if (s == TePtTypeHollowDiamond)
+	{
+		painter_.drawLine (p.x()-w/2,p.y(),p.x(),p.y()-w/2);
+		painter_.drawLine (p.x(),p.y()-w/2,p.x()+w/2,p.y());
+		painter_.drawLine (p.x()+w/2,p.y(),p.x(),p.y()+w/2);
+		painter_.drawLine (p.x(),p.y()+w/2,p.x()-w/2,p.y());
+	}
+}
+
+
+void TeQtBasicCanvas::plotCell (TeCell &cell)
+{
+	TeBox b = getDataWorld ();
+
+	if (!TeIntersects (b, cell.box ()))
+		return;
+
+	QPoint pfrom, pto;
+
+	pfrom = mapWtoV (cell.box().lowerLeft());
+	pto   = mapWtoV (cell.box().upperRight());
+
+	painter_.setBrush(polygonBrush_);
+	painter_.setPen (polygonPen_);
+
+	if((polygonTransparency_ == 0 && polygonBrush_.style() != Qt::NoBrush) || // 100% opaque or
+		(polygonTransparency_ == 100 || polygonBrush_.style() == Qt::NoBrush)) // 100% transparent
+	{
+		if(polygonTransparency_ == 100 && polygonBrush_.style() != Qt::NoBrush)
+			painter_.setBrush(Qt::NoBrush);
+		painter_.drawRect( pfrom.x()+1, pto.y()+1,pto.x()-pfrom.x(), pfrom.y()-pto.y() );
+	}
+	else
+	{
+		QRect viewRect = painter_.viewport();
+
+		TeBox	box = cell.box();
+		mapWtoV (box); // data coordinate to viewport coordinate
+		QRect polyRect((int)box.x1_, (int)box.y1_, (int)box.width(), (int)box.height());
+		QRect interRect = viewRect & polyRect;
+		QPoint pOffset = interRect.topLeft();
+
+		int width = interRect.width();
+		int height = interRect.height();
+
+		int r = width%8;
+		if(r)
+			width += (8-r);
+		r = height%8;
+		if(r)
+			height += (8-r);
+
+		QBitmap	bm;
+		bm.resize(width, height);
+		//Fill bitmap with 0-bits: clipping region
+		bm.fill(Qt::color0);
+		QPainter maskPainter(&bm);
+
+		// Draw cell with 1-bits: drawing region
+		QBrush bs(Qt::color1, polygonBrush_.style());
+		maskPainter.setBrush(bs);
+		QPen pen(Qt::color1, polygonPen_.width());
+		maskPainter.setPen(pen);
+		maskPainter.translate(-pOffset.x(), -pOffset.y());
+ 		maskPainter.drawRect( interRect );
+		maskPainter.end();
+
+		QRegion clipRegion(bm);
+		clipRegion.translate(pOffset.x(), pOffset.y());
+
+		int transp = 255 - (polygonTransparency_ * 255 / 100);
+		painter_.setClipRegion(clipRegion);
+		// restore background from pixmap2_
+//		bitBlt(painter_.device(), pOffset.x(), pOffset.y(), pixmap2_, pOffset.x(), pOffset.y(), interRect.width(), interRect.height());
+		painter_.drawPixmap(pOffset.x(), pOffset.y(), *pixmap2_, pOffset.x(),
+			pOffset.y(), interRect.width(), interRect.height());
+
+		// set alpha buffer and color
+		QImage img(interRect.width(), interRect.height(), 32);
+		unsigned int val = (transp << 24) | (polygonColor_.red() << 16) | (polygonColor_.green() << 8) | polygonColor_.blue();
+		img.fill(val);
+		img.setAlphaBuffer(true);
+
+		// plot transparency
+//		bitBlt(painter_.device(), pOffset.x(), pOffset.y(), &img);
+		painter_.drawPixmap(pOffset.x(), pOffset.y(), img);
+
+
+		// plot contours
+		painter_.setClipping(false);
+		painter_.setBrush(Qt::NoBrush);
+		painter_.drawRect( interRect );
+	}
+}
+
+void TeQtBasicCanvas::plotPolygon (TePolygon &poly)
+{
+	TeBox b = getDataWorld ();
+
+	if (!TeIntersects (b, poly.box ()))
+		return;
+
+	int		i, j, k, np;
+ 	QPoint	p;
+	painter_.setBrush(polygonBrush_);
+	painter_.setPen (polygonPen_);
+
+	if(polygonTransparency_==100 || polygonBrush_.style() == Qt::NoBrush) // contour
+	{
+		TeLinearRing ring = poly[0];
+ 		np = ring.size();
+ 		QPointArray parray(np);
+
+ 		for ( i = 0 ; i < np; i++)
+ 		{
+			p = mapWtoV (ring[i]);
+ 			parray.setPoint(i, p);
+ 		}
+		painter_.drawPolyline( parray );
+
+		for ( k = 1; k < (int)(poly.size()); k++ )
+  		{
+  			ring = poly[k];
+  			np = ring.size();
+  			QPointArray hole(np);
+
+  			for ( i = 0 ; i < np; i++)
+  			{
+				p = mapWtoV (ring[i]);
+				hole.setPoint(i, p);
+  			}
+  			painter_.drawPolyline( hole );
+  		}
+	}
+	else if(poly.size() == 1 && // no holes
+		polygonTransparency_ == 0  && // and is opaque
+		polygonBrush_.style() != Qt::NoBrush)
+	{
+		TeLinearRing ring = poly[0];
+ 		np = ring.size();
+ 		QPointArray parray(np);
+ 		for ( i = 0 ; i < np; i++)
+ 		{
+			p = mapWtoV (ring[i]);
+ 			parray.setPoint(i, p);
+ 		}
+		painter_.drawPolygon( parray );
+	}
+	else
+	{
+		QRect viewRect = painter_.viewport();
+
+		TeBox	box = poly.box();
+		mapWtoV (box); // data coordinate to viewport coordinate
+		if(box.width() <= 0 || box.height() <= 0)
+			return;
+		QRect polyRect((int)box.x1_, (int)box.y1_, (int)box.width(), (int)box.height());
+		if(polyRect.intersects(viewRect) == false)
+			return;
+		QRect interRect = viewRect & polyRect;
+
+		if(painter_.hasClipping())
+		{
+			QRegion interRegion = QRegion(interRect);
+			QRegion pclip = painter_.clipRegion();
+			interRegion = interRegion.intersect(pclip);
+			interRect = interRegion.boundingRect();
+		}
+
+		QPoint pOffset = interRect.topLeft();
+		int width = interRect.width();
+		int height = interRect.height();
+
+		int r = width%8;
+		if(r)
+			width += (8-r);
+		r = height%8;
+		if(r)
+			height += (8-r);
+
+		if(width == 0)
+			width = 8;
+		if(height == 0)
+			height = 8;
+
+		QBitmap	bm;
+		bm.resize(width, height);
+		//Fill bitmap with 0-bits: clipping region
+		bm.fill(Qt::color0);
+		QPainter maskPainter(&bm);
+
+		TeLinearRing ring = poly[0];
+ 		np = ring.size();
+ 		QPointArray parray(np);
+
+		// Draw polygon with 1-bits: drawing region
+		QBrush bs(Qt::color1, polygonBrush_.style());
+		maskPainter.setBrush(bs);
+		QPen pen(Qt::color1, polygonPen_.width());
+		maskPainter.setPen(pen);
+		maskPainter.translate(-pOffset.x(), -pOffset.y());
+		j = 0;
+		parray.setPoint(j, mapWtoV (ring[0]));
+ 		for ( i = 1 ; i < np; i++)
+ 		{
+			p = mapWtoV (ring[i]);
+ 			parray.setPoint(++j, p);
+ 		}
+ 		maskPainter.drawPolygon( parray );
+
+  		vector<QPointArray> holeVec;
+		if(poly.size() > 1)
+		{
+			// Draw holes with 0-bits: clipping region
+			maskPainter.setBrush(Qt::color0);
+			pen.setColor(Qt::color0);
+			maskPainter.setPen(pen);
+			for ( k = 1; k < (int)poly.size(); k++ )
+  			{
+  				ring = poly[k];
+  				np = ring.size();
+  				QPointArray hole(np);
+
+  				for ( i = 0 ; i < np; i++)
+  				{
+					p = mapWtoV (ring[i]);
+					hole.setPoint(i, p);
+  				}
+				holeVec.push_back(hole);
+  				maskPainter.drawPolygon( hole );
+  			}
+		}
+		maskPainter.end();
+
+		QRegion clipRegion(bm);
+		clipRegion.translate(pOffset.x(), pOffset.y());
+
+		if(polygonTransparency_ == 0)
+		{
+			painter_.setClipRegion(clipRegion);
+			painter_.drawPolygon( parray );
+			painter_.setClipping(false);
+			for(i = 0; i < (int)holeVec.size(); i++)
+				painter_.drawPolyline( holeVec[i] );
+		}
+		else
+		{
+			int transp = 255 - (polygonTransparency_ * 255 / 100);
+			painter_.setClipRegion(clipRegion);
+			// restore background from pixmap2_
+			painter_.drawPixmap(pOffset.x(), pOffset.y(), *pixmap2_, pOffset.x(),
+				pOffset.y(), interRect.width(), interRect.height());
+
+			// set alpha buffer and color
+			QImage img(interRect.width(), interRect.height(), 32);
+			unsigned int val = (transp << 24) | (polygonColor_.red() << 16) | (polygonColor_.green() << 8) | polygonColor_.blue();
+			img.fill(val);
+			img.setAlphaBuffer(true);
+
+			// plot transparency
+//			bitBlt(painter_.device(), pOffset.x(), pOffset.y(), &img);
+			painter_.drawPixmap(pOffset.x(), pOffset.y(), img);
+
+			// plot contours
+			painter_.setClipping(false);
+			painter_.drawPolyline( parray );
+			for(i = 0; i< (int)holeVec.size(); i++)
+				painter_.drawPolyline( holeVec[i] );
+		}
+	}
+}
+
+
+/*void TeQtBasicCanvas::plotPolygon (TePolygon &poly)
+{
+	TeBox b = getDataWorld ();
+
+	if (!TeIntersects (b, poly.box (), 0.0))
+		return;
+
+	int		i, np;
+
+	if(polygonTransparency_==0 &&
+		polygonBrush_.style()!=Qt::NoBrush)
+	{
+		painter_->setBrush(polygonBrush_);
+		painter_->setPen (polygonPen_);
+		if (poly.size() == 1)
+ 		{
+ 			TeLinearRing ring = poly[0];
+ 			np = ring.size();
+ 			QPointArray a(np);
+ 			QPoint p;
+
+		// Draw polygon with polygon brush and line pen
+ 			for ( i = 0 ; i < np; i++)
+ 			{
+				p = mapWtoV (ring[i]);
+ 				a.setPoint(i,p);
+ 			}
+			painter_->drawPolygon( a );
+		}
+		else
+		{
+			QRect rect = painter_->viewport();
+			int	w = rect.width();
+			int	h = rect.height();
+
+			int r = w%8;
+			if(r)
+				w += (8-r);
+			r = h%8;
+			if(r)
+				h += (8-r);
+
+			QBitmap	bm;
+			bm.resize(w, h);
+			//Fill bitmap with 0-bits:background(or transparent)
+			bm.fill(Qt::color0);
+			QPainter qp(&bm);
+ 
+			TeLinearRing ring = poly[0];
+ 			np = ring.size();
+ 			QPointArray a(np);
+ 			QPoint p;
+
+			// Draw outer polygon with 1-bits:foreground(or opaque)
+			qp.setBrush(Qt::color1);
+			QPen pen(Qt::color1, polygonPen_.width());
+			qp.setPen(pen);
+ 			for ( i = 0 ; i < np; i++)
+ 			{
+				p = mapWtoV (ring[i]);
+ 				a.setPoint(i,p);
+ 			}
+ 			qp.drawPolygon( a );
+
+			// Draw holes with 0-bits:background(or transparent)
+			qp.setBrush(Qt::color0);
+			pen.setColor(Qt::color0);
+			qp.setPen(pen);
+			unsigned int k;
+			for ( k = 1; k < poly.size(); k++ )
+  			{
+  				ring = poly[k];
+  				np = ring.size();
+  				QPointArray hole(np);
+
+  				for ( i = 0 ; i < np; i++)
+  				{
+					p = mapWtoV (ring[i]);
+					hole.setPoint(i,p);
+  				}
+  				qp.drawPolygon( hole );
+  			}
+			
+			QRegion region(bm);
+			painter_->setClipRegion(region);
+			painter_->drawPolygon( a );
+			painter_->setClipping(false);
+		}
+	}
+	else
+	{
+		Qt::BrushStyle bstyle = polygonBrush_.style();
+		int	transp = polygonTransparency_;
+		if(polygonBrush_.style()==Qt::NoBrush || polygonTransparency_==100)
+		{
+			polygonTransparency_ =  100;
+			polygonBrush_.setStyle(Qt::SolidPattern);
+		}
+
+		QRect rect = painter_->viewport();
+
+		int		j, xmin, ymin, xmax, ymax, height, width;
+		TeBox	box = poly.box();
+		QPoint	pll, pur;
+		pll = mapWtoV (box.lowerLeft());
+		pur = mapWtoV (box.upperRight());
+		xmin = MAX (pll.x(), rect.left());
+		xmax = MIN (pur.x(), rect.right());
+		ymin = MAX (pur.y(), rect.top());
+		ymax = MIN (pll.y(), rect.bottom());
+		height = ymax - ymin;
+		width = xmax - xmin;
+
+		int	w = rect.width();
+		int	h = rect.height();
+
+		int r = w%8;
+		if(r)
+			w += (8-r);
+		r = h%8;
+		if(r)
+			h += (8-r);
+
+		QBitmap	bm;
+		bm.resize(w, h);
+		//Fill bitmap with 0-bits:background(or transparent)
+		bm.fill(Qt::color0);
+		QPainter qp(&bm);
+
+		TeLinearRing ring = poly[0];
+ 		np = ring.size();
+ 		QPointArray a(np);
+ 		QPoint p;
+
+		// Draw outer polygon with 1-bits: foreground(or opaque)
+		qp.setBrush(Qt::color1);
+		QPen pen(Qt::color1, polygonPen_.width());
+		qp.setPen(pen);
+ 		for ( i = 0 ; i < np; i++)
+ 		{
+			p = mapWtoV (ring[i]);
+ 			a.setPoint(i,p);
+ 		}
+ 		qp.drawPolygon( a );
+
+		if(poly.size() > 1)
+		{
+			// Draw holes with 0-bits:background(or transparent)
+			qp.setBrush(Qt::color0);
+			pen.setColor(Qt::color0);
+			qp.setPen(pen);
+			unsigned int k;
+			for ( k = 1; k < poly.size(); k++ )
+  			{
+  				ring = poly[k];
+  				np = ring.size();
+  				QPointArray hole(np);
+
+  				for ( i = 0 ; i < np; i++)
+  				{
+					p = mapWtoV (ring[i]);
+					hole.setPoint(i,p);
+  				}
+  				qp.drawPolygon( hole );
+  			}
+		}
+
+		QRegion region(bm);
+		qp.end();
+		painter_->setClipRegion(region);
+
+		QPixmap pixmap(rect.width(), rect.height());
+		QPainter painter(&pixmap);
+		painter.setBrush(polygonBrush_);
+		if(bstyle == Qt::NoBrush)
+			painter.setPen(polygonColor_);
+		else
+			painter.setPen(polygonPen_);
+		painter.drawPolygon( a );
+
+		QImage imap = pixmap.convertToImage();
+		painter.end();
+
+		if(qimage_.width()==0 || qimage_.height()==0)
+		{
+			qimage_.reset();
+			qimage_ = pixmap2_->convertToImage();
+		}
+
+		QRgb polyRgb = polygonColor_.rgb() & 0x00ffffff;
+//		QRgb contourRgb = polygonPen_.color().rgb() & 0x00ffffff; //contourRgb not used
+		double alpha = (double)polygonTransparency_ / 100.;
+		double beta = 1. - alpha;
+		for(i=xmin; i<xmax; i++)
+		{
+			for(j=ymin; j<ymax; j++)
+			{
+				QRgb vp = imap.pixel(i, j);
+				if(vp == polyRgb)
+				{
+					QRgb v = qimage_.pixel(i, j);
+					int r = (int)((double)qRed(v) * alpha + (double)qRed(vp) * beta);
+					int g = (int)((double)qGreen(v) * alpha + (double)qGreen(vp) * beta);
+					int b = (int)((double)qBlue(v) * alpha + (double)qBlue(vp) * beta);
+					QRgb t = qRgb(r, g, b);
+					imap.setPixel(i, j, t);
+				}
+				else if(vp == 0)
+					imap.setPixel(i, j, qimage_.pixel(i, j));
+			}
+		}
+		pixmap.convertFromImage(imap);
+		bitBlt (painter_->device(),xmin,ymin,&pixmap,xmin,ymin,width,height,Qt::CopyROP,true);
+		painter_->setClipping(false);
+		polygonBrush_.setStyle(bstyle);
+		polygonTransparency_ = transp;
+	}
+}*/
+
+QRect TeQtBasicCanvas::getLegendRect (QPoint p, const QPixmap* pix, string tx)
+{
+	QRect rect;
+	TeVisual visual;
+	TeColor cor(0, 0, 0);
+
+	visual.fixedSize(true);
+	visual.size(8);
+	visual.bold(true);
+	visual.color(cor);
+	setTextColor (cor.red_, cor.green_, cor.blue_);
+	string fam(visual.family());
+	setTextStyle (fam, visual.size(), visual.bold(), visual.italic());
+
+	if(pix)
+	{
+		int x = p.x()+pix->width()+3;
+		int y = p.y()+13;
+		QFontMetrics fm(textFont_);
+		rect = fm.boundingRect(tx.c_str());
+		rect.setRight(rect.right() + x);
+		rect.setLeft(rect.left() + x);
+		rect.setTop(rect.top() + y);
+		rect.setBottom(rect.bottom() + y);
+		QRect prect = pix->rect();
+		prect.setRight(prect.right() + p.x());
+		prect.setLeft(prect.left() + p.x());
+		prect.setTop(prect.top() + p.y());
+		prect.setBottom(prect.bottom() + p.y());
+		rect |= prect;
+	}
+	else
+	{
+		int x = p.x()+1;
+		int y = p.y()+13;
+		QFontMetrics fm(textFont_);
+		rect = fm.boundingRect(tx.c_str());
+		rect = fm.boundingRect(tx.c_str());
+		rect.setRight(rect.right() + x);
+		rect.setLeft(rect.left() + x);
+		rect.setTop(rect.top() + y);
+		rect.setBottom(rect.bottom() + y);
+	}
+	return rect;
+}
+
+void TeQtBasicCanvas::plotLegend (QPoint p, const QPixmap* pix, string tx)
+{
+//	if(painter_ == 0)
+//		return;
+
+	TeVisual visual;
+	TeColor cor(0, 0, 0);
+
+	visual.fixedSize(true);
+	visual.size(8);
+	visual.bold(true);
+	visual.color(cor);
+	setTextColor (cor.red_, cor.green_, cor.blue_);
+	string fam = visual.family();
+	setTextStyle (fam, visual.size(), visual.bold(), visual.italic());
+	painter_.setFont(textFont_);
+	painter_.setPen(textPen_);
+
+	if(pix)
+	{
+		int x = p.x()+pix->width()+3;
+		int y = p.y()+13;
+		bitBlt (painter_.device(), p.x(), p.y(), pix, 0, 0, pix->width(), pix->height(), Qt::CopyROP, true);
+		painter_.drawText(x, y, tx.c_str());
+	}
+	else
+	{
+		int x = p.x()+1;
+		int y = p.y()+13;
+		painter_.drawText(x, y, tx.c_str());
+	}
+}
+
+void TeQtBasicCanvas::plotLine (TeLine2D &line)
+{
+	TeBox b = getDataWorld ();
+	if (!TeIntersects (b, line.box ()))
+		return;
+	int i,np;
+	
+	linePen_.setColor (lineColor_);
+	painter_.setPen(linePen_);
+
+	np = line.size();
+	QPointArray a(np);
+	QPoint p;
+	for ( i = 0 ; i < np; i++)
+	{
+		p = mapWtoV (line[i]);
+		a.setPoint(i,p);
+	}
+	painter_.drawPolyline( a );
+}
+
+void TeQtBasicCanvas::plotArc (TeArc &arc)
+{
+	TeBox b = getDataWorld ();
+	if (!TeIntersects (b, arc.box ()))
+		return;
+	
+	arcPen_.setColor (arcColor_);
+	painter_.setPen(arcPen_);
+
+	QPoint pfrom, pto;
+
+	pfrom = mapWtoV (arc.fromNode().location());
+	pto   = mapWtoV (arc.toNode().location());
+
+	painter_.drawLine( pfrom, pto );
+
+	double ang = atan2 (double(pfrom.y()-pto.y()), double (pfrom.x()-pto.x()));
+	QPoint pm((int)((pto.x()+pfrom.x())/2.+0.5),(int)((pto.y()+pfrom.y())/2.+0.5));
+	
+	double ang1 = ang + 25.*TeCDR;
+	double ang2 = ang - 25.*TeCDR;
+	QPoint	p1((int)(10.*cos(ang1)+0.5),(int)(10.*sin(ang1)+.5)),
+			p2((int)(10.*cos(ang2)+0.5),(int)(10.*sin(ang2)+.5));
+	p1 += pm;
+	p2 += pm;
+	painter_.drawLine( pm, p1 );
+	painter_.drawLine( pm, p2 );
+	painter_.drawLine( p1, p2 );
+
+}
+
+void TeQtBasicCanvas::plotPie (double x, double y, double w, double h, double a, double alen)
+{
+	int	dx, dy, dw, dh, da, df;
+
+	pieBrush_.setColor (pieColor_);
+	painter_.setBrush(pieBrush_);
+	painter_.setPen(linePen_);
+
+	TeCoord2D p(x, y);
+	QPoint	qp = mapWtoV(p);
+	dx = qp.x();
+	dy = qp.y();
+
+	TeCoord2D pt(x+w, y+h);
+	QPoint	qpt = mapWtoV(pt);
+	dw = abs(qpt.x() - dx);
+	dh = abs(qpt.y() - dy);
+
+	da = (int)(a * 16);
+	df = (int)(alen * 16);
+	painter_.drawPie(dx, dy-dh, dw, dh, da, df);
+}
+
+void TeQtBasicCanvas::setPieColor (int r, int g, int b)
+{
+	pieColor_.setRgb(r, g, b);
+	pieBrush_.setStyle(Qt::SolidPattern);
+}
+
+void TeQtBasicCanvas::plotRect (QRect& rect)
+{
+	rectBrush_.setColor (rectColor_);
+	painter_.setBrush(Qt::NoBrush);
+	painter_.setPen(linePen_);
+	painter_.drawRect(rect);
+}
+
+void TeQtBasicCanvas::plotRect (double x, double y, double w, double h, int transp, bool legend)
+{
+	if(pixmap1_ == 0)
+		return;
+
+	int	dx, dy, dw, dh;
+
+	TeCoord2D p(x, y);
+	QPoint	qp;
+	if(legend)
+		qp = QPoint((int)p.x(), (int)p.y());
+	else
+		qp = mapWtoV(p);
+	dx = qp.x();
+	dy = qp.y();
+
+	TeCoord2D pt(x+w, y+h);
+	QPoint	qpt;
+	if(legend)
+		qpt = QPoint((int)pt.x(), (int)pt.y());
+	else
+		qpt = mapWtoV(pt);
+	dw = abs(qpt.x() - dx);
+	dh = abs(qpt.y() - dy);
+
+	if(transp == 0)
+	{
+		rectBrush_.setColor (rectColor_);
+		painter_.setBrush(rectBrush_);
+		painter_.setPen(linePen_);
+		painter_.drawRect(dx, dy-dh, dw, dh);
+	}
+	else
+	{
+		double alpha = transp / 100.;
+		double beta = 1 - alpha;
+		double red = rectColor_.red() * beta;
+		double green = rectColor_.green() * beta;
+		double blue = rectColor_.blue() * beta;
+
+		int r = dw%8;
+		if(r)
+			dw += (8-r);
+		r = dh%8;
+		if(r)
+			dh += (8-r);
+
+//		QImage ima = pixmap1_->convertToImage();
+		QImage ima = pixmap0_->convertToImage();
+		QImage imap(dw, dh, 32);
+		int i, j;
+		int x = qp.x();
+		int	y = qp.y() - dh;
+		for(i=x; i-x<dw && i<ima.width(); i++)
+		{
+			if(i < 0)
+				continue;
+			for(j=y; j-y<dh && j<ima.height(); j++)
+			{
+				if(j < 0)
+					continue;
+				QRgb v = ima.pixel(i, j);
+				int r = (int)((double)qRed(v) * alpha + red);
+				int g = (int)((double)qGreen(v) * alpha + green);
+				int b = (int)((double)qBlue(v) * alpha + blue);
+				QRgb t = qRgb(r, g, b);
+				imap.setPixel(i-x, j-y, t);
+			}
+		}
+
+		QPixmap pm(dw, dh);
+		pm.convertFromImage(imap);
+		QRect rec = pm.rect();
+		rec &= painter_.viewport();
+		bitBlt (painter_.device(), x, y, &pm, 0, 0, rec.width(), rec.height(), Qt::CopyROP, true);
+	}
+}
+
+void TeQtBasicCanvas::setRectColor (int r, int g, int b)
+{
+	rectColor_.setRgb(r, g, b);
+	rectBrush_.setStyle(Qt::SolidPattern);
+}
+
+static inline int blendComponent( int back, int fore, int falpha )
+{
+	int balpha = 255 - falpha;
+    int a = falpha + balpha -(falpha*balpha)/255;
+    return (falpha*fore + balpha*back -(balpha*falpha*fore)/255)/a;  
+}
+
+int d2dms(double v)
+{
+    double av;
+    int d, m, s;
+    av = fabs(v);
+    d = (int)av;
+    av = av - d;
+    av = av * 60;
+    m = (int)av;
+    av = av - m;
+    av = av * 60;
+    s = (int)av;
+    int gms = d * 10000 + m * 100 + s ;
+	return gms;
+}
+
+double dms2d (int vs)
+{
+	int v = abs(vs);
+	int dd = v/10000;
+	int dm = (v-dd*10000)/100;
+	int ds = v - dd*10000 - dm*100;
+	double d = dd + dm/60. + ds/3600.;
+	if (vs < 0)
+		d = -d;
+	return d;
+}
+
+string buildMosaicName (int x, int y, int delta)
+{
+	int		lad,lam,las,lod,lom,los,dd,dm,ds;
+	char	hemis,hemiss;
+	int		lx1,ly1;
+
+	hemis = 'S';
+	if (y>=0)hemis = 'N';
+	ly1 = abs(y);
+	lad = ly1/3600;
+	lam = (ly1-lad*3600)/60;
+	las = ly1 - lad*3600 - lam*60;
+
+	hemiss = 'O';
+	if (x>=0)hemis = 'E';
+	lx1 = abs(x);
+	lod = lx1/3600;
+	lom = (lx1-lod*3600)/60;
+	los = lx1 - lod*3600 - lom*60;
+
+	dd = delta/10000;
+	dm = (delta-dd*10000)/100;
+	ds = delta - dd*10000 - dm*100;
+
+	char name[128];
+	sprintf(name,"%c%02d%02d%02d%c%02d%02d%02d%02d%02d%02d",
+		hemis,lad,lam,las,hemiss,lod,lom,los,dd,dm,ds);
+	return string(name);
+}
+
+void TeQtBasicCanvas::copyPixmap0ToPrinter()
+{
+	if (pixmap0_)
+	{
+		QPrinter printer;
+		if (printer.setup())
+		{
+			QPainter p(&printer);
+
+			QPaintDevice* dev = painter_.device();
+			if(dev == pixmap0_)
+				painter_.end();
+
+			p.drawPixmap(0, 0, *pixmap0_);
+			p.flush();
+			p.end();
+
+			if(dev && painter_.device() == 0)
+				painter_.begin(dev);
+		}
+	}
+}
+
+void TeQtBasicCanvas::copyPixmapToWindow(QPixmap* p, int ulx, int uly, int w, int h)
+{
+	bitBlt (viewport(),ulx,uly,p,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap0To(QPaintDevice* dev)
+{
+	if (pixmap0_)
+	{
+		bitBlt (dev,0,0,pixmap0_,0,0,width_,height_,Qt::CopyROP,true);
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap0ToWindow()
+{
+	if (pixmap0_)
+	{
+		bitBlt (viewport(),0,0,pixmap0_,0,0,width_,height_,Qt::CopyROP,true);
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap1ToWindow()
+{
+	if (pixmap1_)
+	{
+		bitBlt (viewport(),0,0,pixmap1_,0,0,width_,height_,Qt::CopyROP,true);
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap2ToWindow()
+{
+	if (pixmap2_)
+	{
+		bitBlt (viewport(),0,0,pixmap2_,0,0,width_,height_,Qt::CopyROP,true);
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap3ToWindow()
+{
+	if (pixmap3_)
+	{
+		bitBlt (viewport(),0,0,pixmap3_,0,0,width_,height_,Qt::CopyROP,true);
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap0ToWindow(int ulx, int uly, int w, int h)
+{
+	if (pixmap0_)
+	{
+		bitBlt (viewport(),ulx,uly,pixmap0_,ulx,uly,w,h,Qt::CopyROP,true);
+	}
+}
+
+void TeQtBasicCanvas::copyPanArea(int x, int y)
+{
+	if (pixmap0_)
+	{
+		QPaintDevice* dev = painter_.device();
+		if(dev)
+			painter_.end();
+		painter_.begin(viewport());
+		int	w, h;
+		QRect a, b;
+		int hh = pixmap0_->height();
+		int ww = pixmap0_->width();
+		if(x <= 0 && y <= 0)
+		{
+			a = QRect(0, 0, ww, -y);
+			b = QRect(0, -y, -x, hh+y);
+			w = ww + x;
+			h = hh + y;
+			painter_.fillRect(a, painter_.backgroundColor());
+			painter_.fillRect(b, painter_.backgroundColor());
+			bitBlt (viewport(), -x, -y, pixmap1_, 0, 0, w, h, Qt::CopyROP, true);
+		}
+		else if(x >= 0 && y >= 0)
+		{
+			a = QRect(0, hh-y, ww, y);
+			b = QRect(ww-x, 0, x, hh-y);
+			w = ww - x;
+			h = hh - y;
+			painter_.fillRect(a, painter_.backgroundColor());
+			painter_.fillRect(b, painter_.backgroundColor());
+			bitBlt (viewport(), 0, 0, pixmap1_, x, y, w, h, Qt::CopyROP, true);
+		}
+		else if(x >= 0 && y <= 0)
+		{
+			a = QRect(0, 0, ww, -y);
+			b = QRect(ww-x, -y, x, hh+y);
+			w = ww - x;
+			h = hh + y;
+			painter_.fillRect(a, painter_.backgroundColor());
+			painter_.fillRect(b, painter_.backgroundColor());
+			bitBlt (viewport(), 0, -y, pixmap1_, x, 0, w, h, Qt::CopyROP, true);
+		}
+		else
+		{
+			a = QRect(0, hh-y, ww, y);
+			b = QRect(0, 0, -x, hh-y);
+			w = ww + x;
+			h = hh - y;
+			painter_.fillRect(a, painter_.backgroundColor());
+			painter_.fillRect(b, painter_.backgroundColor());
+			bitBlt (viewport(), -x, 0, pixmap1_, 0, y, w, h, Qt::CopyROP, true);
+		}
+		if(dev)
+			painter_.begin(dev);
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap0ToPixmap1()
+{
+	if (pixmap1_ && pixmap0_)
+		bitBlt (pixmap1_,0,0,pixmap0_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap0ToPixmap1(int ulx, int uly, int w, int h)
+{
+	if (pixmap1_ && pixmap0_)
+		bitBlt (pixmap1_,ulx,uly,pixmap0_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap0()
+{
+	if (pixmap1_ && pixmap0_)
+		bitBlt (pixmap0_,0,0,pixmap1_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap0(int ulx, int uly, int w, int h)
+{
+	if (pixmap1_ && pixmap0_)
+		bitBlt (pixmap0_,ulx,uly,pixmap1_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap2()
+{
+	if (pixmap1_ && pixmap2_)
+	{
+		bitBlt (pixmap2_,0,0,pixmap1_,0,0,width_,height_,Qt::CopyROP,true);
+		qimage_.reset();
+		qimage_ = pixmap2_->convertToImage();
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap1ToPixmap2(int ulx, int uly, int w, int h)
+{
+	if (pixmap1_ && pixmap2_)
+	{
+		bitBlt (pixmap2_,ulx,uly,pixmap1_,ulx,uly,w,h,Qt::CopyROP,true);
+		qimage_.reset();
+		qimage_ = pixmap2_->convertToImage();
+	}
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap1()
+{
+	if (pixmap1_ && pixmap2_)
+		bitBlt (pixmap1_,0,0,pixmap2_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap1(int ulx, int uly, int w, int h)
+{
+	if (pixmap1_ && pixmap2_)
+		bitBlt (pixmap1_,ulx,uly,pixmap2_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap3()
+{
+	if (pixmap3_ && pixmap2_)
+		bitBlt (pixmap3_,0,0,pixmap2_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap2ToPixmap3(int ulx, int uly, int w, int h)
+{
+	if (pixmap3_ && pixmap2_)
+		bitBlt (pixmap3_,ulx,uly,pixmap2_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap3ToPixmap2()
+{
+	if (pixmap3_ && pixmap2_)
+		bitBlt (pixmap2_,0,0,pixmap3_,0,0,width_,height_,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::copyPixmap3ToPixmap2(int ulx, int uly, int w, int h)
+{
+	if (pixmap3_ && pixmap2_)
+		bitBlt (pixmap2_,ulx,uly,pixmap3_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtBasicCanvas::plotRaster(TeRaster* raster, TeRasterTransform* transf, TeQtProgress *progress)
+{
+	QPixmap* pix = (QPixmap*)(painter_.device());
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	params_.fileName_ = raster->params().fileName_;
+
+	if (buildRaster ())
+	{
+		// Calculates the box of input image that intersects the box of the canvas
+		TeBox bboxBackRaster = backRaster_->params().boundingBox();		
+		TeBox bboxSearched = TeRemapBox(bboxBackRaster, backRaster_->projection(), raster->projection());
+		TeBox bboxIntersection;
+		if (!TeIntersection (raster->params().boundingBox(),bboxSearched,bboxIntersection))
+			return ;			// no intersection 
+
+		// Create a remapping tool to back raster
+		TeDecoderQtImage* decqt = reinterpret_cast<TeDecoderQtImage*>(backRaster_->decoder());
+		TeRasterRemap remap;
+		if (transf)
+			remap.setTransformer(transf);
+		remap.setOutput(backRaster_);
+
+		// Calculates best resolution level to display the input image on this canvas
+		TeBox box = params_.boundingBox();
+		int nlines = params_.nlines_;
+		int ncols = params_.ncols_;
+		int res = raster->decoder()->bestResolution(box, nlines, ncols, params_.projection());
+
+		// Check if raster blocks in best level of resolution that intersects the canvas box
+		TeRasterParams parBlock;	
+		if (raster->selectBlocks(bboxIntersection,res,parBlock))        
+		{
+			params_.resolution_ = res;	
+			if (progress)
+				progress->setTotalSteps(raster->numberOfSelectedBlocks());
+			t2 = clock();
+			t0 = t1 = t2;
+			
+			// Process each block as an independent raster decoded in memory
+			TeRaster* block = new TeRaster;
+			TeDecoderMemory* decMem = new TeDecoderMemory(parBlock);
+			decMem->init();
+			remap.setInput(block);
+
+			// Portal of raster block selection behaves as portal of geometries
+			// use the "bool flag - do - while" scheme
+			int numBlockProcessed=0;
+			bool flag = true;
+			do
+			{
+				flag = raster->fetchRasterBlock(decMem);
+				block->setDecoder(decMem);
+				remap.apply();
+				numBlockProcessed++;
+
+				TeRasterParams par = decMem->params();
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					if((int)(t2-t0) > dt2)	// show progress and refresh painted area
+					{
+						if (progress)
+						{
+							if (progress->wasCancelled())
+								break;
+							else
+								progress->setProgress(numBlockProcessed);
+						}
+						if(pix == pixmap0_ || pix == pixmap1_ || pix == pixmap2_ || pix == pixmap3_)
+						{
+							QPaintDevice* dev = painter_.device();
+							if(dev)
+								painter_.end();
+							if(dev == pixmap0_)
+							{
+								pixmap0_->convertFromImage (*(decqt->getImage ()));
+								copyPixmap0ToWindow();
+							}
+							else if(dev == pixmap1_)
+							{
+								pixmap1_->convertFromImage (*(decqt->getImage ()));
+								copyPixmap1ToWindow();
+							}
+							else if(dev == pixmap2_)
+							{
+								pixmap2_->convertFromImage (*(decqt->getImage ()));
+								copyPixmap2ToWindow();
+							}
+							else if(dev == pixmap3_)
+							{
+								pixmap3_->convertFromImage (*(decqt->getImage ()));
+								copyPixmap3ToWindow();
+							}
+							if(dev)
+								painter_.begin(dev);
+						}
+						else
+							pix->convertFromImage (*(decqt->getImage ()));
+					}
+				}
+			} while (flag);
+			if (progress)
+				progress->reset();
+			decMem->clear();
+			delete block;
+			raster->clearBlockSelection();
+		}
+		else		// no blocks found try to remap the whole raster
+		{
+			remap.setInput(raster);
+			remap.apply(true);	
+		}
+
+		if(pix == pixmap0_ || pix == pixmap1_ || pix == pixmap2_ || pix == pixmap3_)
+		{
+			QPaintDevice* dev = painter_.device();
+			if(dev)
+				painter_.end();
+
+			if(dev == pixmap0_)
+			{
+				pixmap0_->convertFromImage (*(decqt->getImage ()));
+				copyPixmap0ToWindow();
+			}
+			else if(dev == pixmap1_)
+			{
+				pixmap1_->convertFromImage (*(decqt->getImage ()));
+				copyPixmap1ToWindow();
+			}
+			else if(dev == pixmap2_)
+			{
+				pixmap2_->convertFromImage (*(decqt->getImage ()));
+				copyPixmap2ToWindow();
+			}
+			else if(dev == pixmap3_)
+			{
+				pixmap3_->convertFromImage (*(decqt->getImage ()));
+				copyPixmap3ToWindow();
+			}
+			if(dev)
+				painter_.begin(dev);
+		}
+		else
+			pix->convertFromImage (*(decqt->getImage ()));
+	}
+}
+
+bool TeQtBasicCanvas::buildRaster ()
+{
+/*	if (backRaster_)
+	{
+		TeRasterParams  rparams = backRaster_->params();
+		if (!(rparams.box() == params_.box()) ||
+			  rparams.ncols_ != params_.ncols_ ||
+			  rparams.nlines_ != params_.nlines_)
+		{  
+			delete backRaster_;
+			backRaster_ = 0;
+		}
+		else
+		{
+			if (rparams.fileName_ != params_.fileName_)
+				return true;
+			return false;
+		}
+	}
+*/
+	if (!backRaster_)
+	{
+		backRaster_ = new TeRaster();
+		params_.mode_ = 'c';
+		params_.useDummy_ = true;
+		params_.setDummy(255);
+		TeDecoderQtImage *dec = new TeDecoderQtImage(params_);
+		backRaster_->setDecoder (dec);
+		backRaster_->init();
+	}
+	return true;
+}
+
+void TeQtBasicCanvas::endPrinting()
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev)
+		painter_.end();
+	if(pixmap0_)
+		painter_.begin(pixmap0_);
+}
+
+void TeQtBasicCanvas::plotGraphicScale(TeVisual& visual)
+{
+	TeColor	cor = visual.color();
+	string	family = visual.family();
+	int		size = visual.size();
+	bool	bold = visual.bold();
+	bool	italic = visual.italic();
+	TeBox	box = getWorld();
+	double	w = box.width();
+	double	dx = w / 9.;
+	long	idx = (long)dx;
+	double	f;
+	double	fa = 1.;
+	int		fw, fh;
+
+	if(box.isValid() == false)
+		return;
+
+	int conta = 1000;
+	if(idx > 0)
+	{
+		while(--conta)
+		{
+			dx /= 10.;
+			fa *= 10.;
+			idx = (long)dx;
+			if(idx == 0)
+			{
+				idx = (long)(dx * 10.);
+				f = idx * fa / 10.;
+				break;
+			}
+		}
+	}
+	else
+	{
+		while(--conta)
+		{
+			dx *= 10.;
+			fa /= 10.;
+			idx = (long)dx;
+			if(idx > 0)
+			{
+				f = idx * fa;
+				break;
+			}
+		}
+	}
+	if(conta == 0)
+		return;
+
+	double space = f * 3.;
+	double hini = box.x1_ + (w - space) / 2.;
+
+	QFont font(family.c_str(), size);
+	font.setBold (bold);
+	font.setItalic (italic);
+	painter_.setFont(font);
+
+	QFontMetrics fm(font);
+	QRect rect;
+	string unit = canvasProjection_->units();
+	rect = fm.boundingRect(unit.c_str());
+	fh = rect.height();
+	double vini = box.y1_ + mapVtoW(fh+6);
+
+	TeCoord2D wp(hini, vini);
+	QPoint p1((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p1);
+
+	wp.x(wp.x() + f);
+	QPoint p2((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p2);
+
+	wp.x(wp.x() + f);
+	QPoint p3((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p3);
+
+	wp.x(wp.x() + f);
+	QPoint p4((int)((wp.x() - xmin_)*f_ + 0.5)+x0_,
+		height_ - y0_ - (int)((wp.y() - ymin_)*f_ + 0.5));
+	correctScrolling (p4);
+
+	QPen pen(QColor(cor.red_, cor.green_, cor.blue_));
+	painter_.setPen(pen);
+
+	if(bold == false)
+	{
+		QPoint pa = p2;
+		QPoint pb = p3;
+		painter_.drawLine(pa, pb);
+
+		pa = p1;
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+
+		pa = p2; 
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+
+		pa = p3; 
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+
+		pa = p4; 
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+
+		pa = p1;
+		pb = p4;
+		pa.setY(pa.y() - 1);
+		pb.setY(pb.y() - 1);
+		painter_.drawLine(pa, pb);
+		pa.setY(pa.y() + 2);
+		pb.setY(pb.y() + 2);
+		painter_.drawLine(pa, pb);
+	}
+	else
+	{
+		QPoint pa = p2;
+		QPoint pb = p3;
+		painter_.drawLine(pa, pb);
+		pa.setY(pa.y()-1);
+		pb.setY(pb.y()-1);
+		painter_.drawLine(pa, pb);
+
+		pa = p1;
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+		pa.setX(pa.x()-1);
+		pb.setX(pb.x()-1);
+		painter_.drawLine(pa, pb);
+
+		pa = p2; 
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+		pa.setX(pa.x()-1);
+		pb.setX(pb.x()-1);
+		painter_.drawLine(pa, pb);
+
+		pa = p3; 
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+		pa.setX(pa.x()-1);
+		pb.setX(pb.x()-1);
+		painter_.drawLine(pa, pb);
+
+		pa = p4; 
+		pb = pa;
+		pa.setY(pa.y() - 5);
+		pb.setY(pb.y() + 4);
+		painter_.drawLine(pa, pb);
+		pa.setX(pa.x()-1);
+		pb.setX(pb.x()-1);
+		painter_.drawLine(pa, pb);
+
+		pa = p1;
+		pb = p4;
+		pa.setY(pa.y() - 2);
+		pb.setY(pb.y() - 2);
+		painter_.drawLine(pa, pb);
+		pa.setY(pa.y() + 3);
+		pb.setY(pb.y() + 3);
+		painter_.drawLine(pa, pb);
+	}
+
+	rect = fm.boundingRect("0");
+	fw = rect.width();
+	painter_.drawText (p1.x()-fw/2, p1.y()-8, "0");
+
+	char buf[50];
+	long n = (long)f;
+
+	if(n > 0)
+	{
+		sprintf(buf, "%ld", n);
+		QString s = buf;
+		rect = fm.boundingRect(s);
+		int fw1 = rect.width();
+
+		sprintf(buf, "%ld", n*2);
+		s = buf;
+		rect = fm.boundingRect(s);
+		int fw2 = rect.width();
+
+		sprintf(buf, "%ld", n*3);
+		s = buf;
+		rect = fm.boundingRect(s);
+		int fw3 = rect.width();
+
+		if((fw1 + fw2)/2 < p3.x()-p2.x() &&
+			(fw2 + fw3)/2 < p3.x()-p2.x())
+		{
+			sprintf(buf, "%ld", n);
+			QString s = buf;
+			rect = fm.boundingRect(s);
+			fw = rect.width();
+			painter_.drawText (p2.x()-fw/2, p2.y()-8, s);
+
+			sprintf(buf, "%ld", n*2);
+			s = buf;
+			rect = fm.boundingRect(s);
+			fw = rect.width();
+			painter_.drawText (p3.x()-fw/2, p3.y()-8, s);
+		}
+
+		sprintf(buf, "%ld", n*3);
+		s = buf;
+		rect = fm.boundingRect(s);
+		fw = rect.width();
+		painter_.drawText (p4.x()-fw/2, p4.y()-8, s);
+	}
+	else
+	{
+		int nn=0;
+		int fn = (int)fa;
+		while(fn == 0)
+		{
+			fa *= 10;
+			fn = (int)fa;
+			nn++;
+		}
+		sprintf (buf, "%.*f", nn, f);
+		QString s = buf;
+		rect = fm.boundingRect(s);
+		int fw1 = rect.width();
+
+		sprintf (buf, "%.*f", nn, f*2.);
+		s = buf;
+		rect = fm.boundingRect(s);
+		int fw2 = rect.width();
+
+		sprintf (buf, "%.*f", nn, f*3.);
+		s = buf;
+		rect = fm.boundingRect(s);
+		int fw3 = rect.width();
+
+		if((fw1 + fw2)/2 < p3.x()-p2.x() &&
+			(fw2 + fw3)/2 < p3.x()-p2.x())
+		{
+			sprintf (buf, "%.*f", nn, f);
+			QString s = buf;
+			rect = fm.boundingRect(s);
+			fw = rect.width();
+			painter_.drawText (p2.x()-fw/2, p2.y()-8, s);
+
+			sprintf (buf, "%.*f", nn, f*2.);
+			s = buf;
+			rect = fm.boundingRect(s);
+			fw = rect.width();
+			painter_.drawText (p3.x()-fw/2, p3.y()-8, s);
+		}
+
+		sprintf (buf, "%.*f", nn, f*3.);
+		s = buf;
+		rect = fm.boundingRect(s);
+		fw = rect.width();
+		painter_.drawText (p4.x()-fw/2, p4.y()-8, s);
+	}
+
+	int sw = p4.x() - p1.x();
+	rect = fm.boundingRect(unit.c_str());
+	fw = rect.width();
+	fh = rect.height();
+	int suini = (sw - fw) / 2 + p1.x();
+	painter_.drawText (suini, p1.y()+fh+2, unit.c_str());
+}
+
+void TeQtBasicCanvas::setClipRegion(int x, int y, int w, int h)
+{
+	QRegion region(x, y, w, h);
+	if(painter_.device())
+		painter_.setClipRegion(region);
+}
+
+void TeQtBasicCanvas::setClipRegion(QRegion region)
+{
+	if(painter_.device())
+		painter_.setClipRegion(region);
+}
+
+void TeQtBasicCanvas::setClipping(bool enable)
+{
+	if(painter_.device())
+		painter_.setClipping(enable);
+}
+
+void TeQtBasicCanvas::clearRaster()
+{
+	if (backRaster_)
+		delete backRaster_;
+	backRaster_ = 0;
+}
diff --git a/src/terralib/application/qt/TeQtBasicCanvas.h b/src/terralib/application/qt/TeQtBasicCanvas.h
new file mode 100644
index 0000000..066decf
--- /dev/null
+++ b/src/terralib/application/qt/TeQtBasicCanvas.h
@@ -0,0 +1,280 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTBASICCANVAS_H
+#define  __TERRALIB_INTERNAL_QTBASICCANVAS_H
+
+#include <TeDatabase.h>
+#include <TeRaster.h>
+
+#include <qpainter.h>
+#include <qbrush.h> 
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qbitmap.h>
+#include <qprinter.h>
+#include <qscrollview.h>   
+ 
+#include <string>
+using namespace std;
+
+class TeQtProgress;
+/**
+  *@author R Cartaxo
+  */
+
+class TeQtBasicCanvas : public QScrollView
+{
+public:
+	TeQtBasicCanvas(QWidget *parent, const char *name );
+	virtual ~TeQtBasicCanvas();
+	void setWorld(TeBox b, int w = 0, int h = 0, QPaintDevice *pd = 0);
+	virtual void setView(int /*w*/ = 0, int /*h*/ = 0, QPaintDevice * /* pd */ = 0) {}
+	void setTransformation(double xmin, double xmax, double ymin, double ymax, bool extend = true);
+	TeBox getWorld() {return wc_ ;}
+	TeBox getDataWorld();
+
+// Coordinates system transformation
+// Viewport to Canvas coordinates
+	double mapVtoW (int);
+	TeCoord2D mapVtoW (QPoint);
+// Viewport to Data World coordinates
+	double mapVtoDW (int);
+	TeCoord2D mapVtoDW (QPoint);
+// Data World to Viewport coordinates
+	QPoint mapWtoV (TeCoord2D);
+	void mapWtoV (TeBox& box);
+//  Canvas World to Data World coordinates
+	void mapCanvasWorldToDataWorld (TeBox& w);
+// Data World to Canvas World coordinates
+	void mapDataWorldToCanvasWorld (TeBox& w);
+// Data Canvas World to Viewport coordinates
+	void mapCanvasWorldToViewport (TeBox& w);
+// Viewport to Canvas World coordinates
+	void mapViewportToCanvasWorld (TeBox& w);
+	QPoint mapCanvasWorldToViewport (TeCoord2D& c);
+
+	virtual void correctScrolling (QPoint & ) {}
+	virtual QPoint offset () {QPoint p; return p;}
+// Pixel size in world coordinates
+	double pixelSize () { return (xmax_-xmin_)/(double)width_; }
+
+// Sets the projection of next incoming data
+	void  setDataProjection ( TeProjection* proj );
+
+// Sets the projection
+	void  setProjection ( TeProjection* proj );
+
+// Retrive the projection
+	TeProjection* projection()
+	{	return canvasProjection_; }
+
+// Plotting primitives
+
+//	void setPainter (QPainter* p) {painter_ = p;}
+	QPainter* getPainter () {return &painter_;}
+	void plotOnWindow ();
+	void plotOnPixmap0 ();
+	void plotOnPixmap1 ();
+	virtual void copyPixmapToWindow(QPixmap*, int, int, int, int);
+	virtual void copyPixmap0ToPrinter();
+	virtual void copyPixmap0To(QPaintDevice*);
+	virtual void copyPixmap0ToWindow();
+	virtual void copyPixmap1ToWindow();
+	virtual void copyPixmap2ToWindow();
+	virtual void copyPixmap3ToWindow();
+	virtual void copyPixmap0ToWindow(int, int, int, int);
+	virtual void copyPixmap0ToPixmap1();
+	virtual void copyPixmap0ToPixmap1(int, int, int, int);
+	virtual void copyPixmap1ToPixmap0();
+	virtual void copyPixmap1ToPixmap0(int, int, int, int);
+	virtual void copyPixmap1ToPixmap2();
+	virtual void copyPixmap1ToPixmap2(int, int, int, int);
+	virtual void copyPixmap2ToPixmap1();
+	virtual void copyPixmap2ToPixmap1(int, int, int, int);
+	virtual void copyPixmap2ToPixmap3();
+	virtual void copyPixmap2ToPixmap3(int, int, int, int);
+	virtual void copyPixmap3ToPixmap2();
+	virtual void copyPixmap3ToPixmap2(int, int, int, int);
+	virtual void copyPanArea(int, int);
+
+	void plotPoint (TeCoord2D &p);
+	void plotPoint (TePoint &p){ plotPoint(p.location()); }
+
+	void setPointColor (int r, int g, int b);
+	void setPointStyle (int s, int w = 3);
+	void setPointPixmap (char* p);
+
+	void plotCell (TeCell &s);
+
+	QRect getLegendRect (QPoint p, const QPixmap* pix, string tx);
+	void plotLegend (QPoint p, const QPixmap* pix, string tx);
+
+	void plotPolygon (TePolygon &p);
+	void setPolygonColor (int r, int g, int b);
+	void setPolygonStyle (int s, int width = 1);
+	void setPolygonLineColor (int r, int g, int b);
+	void setPolygonLineStyle (int s, int width = 1);
+
+	void plotLine (TeLine2D &l);
+	void setLineColor (int r, int g, int b);
+	void setLineStyle (int s, int w = 1);
+
+	void plotNode (TeNode &n);
+	void setNodeColor (int r, int g, int b);
+	void setNodeStyle (int s, int w = 4);
+	void setNodePixmap (char* p);
+
+	void plotArc (TeArc &a);
+	void setArcColor (int r, int g, int b);
+	void setArcStyle ( int s, int w = 1 );
+
+	void plotPie (double x, double y, double w, double h, double a, double alen);
+	void setPieColor (int r, int g, int b);
+	void plotRect (double x, double y, double w, double h, int transp=0, bool legend=false);
+	void plotRect (QRect&);
+	void setRectColor (int r, int g, int b);
+
+	void plotText (TeCoord2D &p, string &str, double angle = 0., double alignh = 0., double alignv = 0.);
+	void plotText (TeText &tx, TeVisual& visual);
+	QRect textRect (TeText &tx, TeVisual visual);
+	void plotTextRects (TeText &tx, TeVisual visual);
+	void setTextColor (int r, int g, int b);
+	void setTextSize (int size);
+	void setTextStyle (string& family, int size, bool bold, bool italic);
+	void setTextTTStyle (QString& font, int size);
+	void useTextTT (bool u) { textTT_ = u; }
+	void textExtent ( string &str, int &w, int &h, double angle = 0.);
+	void plotXorPolyline (QPointArray& PA, bool cdev=true);
+
+	void setDB (TeDatabase* db) { db_ = db; }
+	void plotRaster (TeRaster* raster, TeRasterTransform* transf, TeQtProgress *progress);
+	void clearRaster();
+	void endPrinting();
+
+	QPixmap* getPixmap0 () {return pixmap0_; }
+	QPixmap* getPixmap1 () {return pixmap1_; }
+	QPixmap* getPixmap2 () {return pixmap2_; }
+	QPixmap* getPixmap3 () {return pixmap3_; }
+
+	void plotGraphicScale(TeVisual& visual);
+
+	void setClipRegion(int x, int y, int w, int h);
+	void setClipRegion(QRegion region);
+	void setClipping (bool enable);
+
+	virtual void copyPixmapToWindow(){}
+
+	TeRasterParams& getParams()
+	{	return params_; }
+
+	double scaleApx() {return scaleApx_;}
+	void scaleApx(double);
+
+protected:
+
+	void plotMark(QPoint &p, int s, int w);
+	bool buildRaster ();
+
+// Sizes and transformation
+	TeBox		wc_;
+	double 		xmin_,
+				xmax_,
+				ymin_,
+				ymax_;
+	
+	int			x0_;
+	int			y0_;
+	int			width_;
+	int			height_;
+	double		f_;
+	double		scaleApx_;
+	TeProjection* canvasProjection_;
+	TeProjection* dataProjection_;
+
+// The Painter
+	QPainter	painter_;
+
+// Pie
+	QBrush		pieBrush_;
+	QColor		pieColor_;
+	QBrush		rectBrush_;
+	QColor		rectColor_;
+	
+// Polygon
+	int			polygonTransparency_;
+	QBrush		polygonBrush_;
+	QPen		polygonPen_;
+	QColor		polygonColor_;
+	map<TePolyBasicType, Qt::BrushStyle> brushStyleMap_;
+	
+// Line
+	QPen		linePen_;
+	QColor		lineColor_;
+	map<TeLnBasicType, Qt::PenStyle> penStyleMap_;
+	
+// Point
+	int			pointStyle_;
+	int			pointSize_;
+	QPen		pointPen_;
+	QColor		pointColor_;
+	QPixmap*	pointPixmap_;
+
+// Arc
+	QPen		arcPen_;
+	QColor		arcColor_;
+	
+// Node
+	int			nodeStyle_;
+	int			nodeSize_;
+	QPen		nodePen_;
+	QColor		nodeColor_;
+	QPixmap*	nodePixmap_;
+
+// Text
+	QPen		textPen_;
+	QColor		textColor_;
+	QFont		textFont_;
+	string		textTTFont_;
+	int			textSize_;
+	bool		textTT_;
+
+// Pixmap
+	QPixmap		*pixmap0_;
+	QPixmap		*pixmap1_;
+	QPixmap		*pixmap2_;
+	QPixmap		*pixmap3_;
+
+	QImage		qimage_;
+
+	int			scale_;
+	TeRaster	*backRaster_;
+	TeRasterParams	params_;
+	int			lx1_,
+				ly1_,
+				lx2_,
+				ly2_;
+
+	TeDatabase	*db_;
+};
+
+#endif
+
diff --git a/src/terralib/application/qt/TeQtCanvas.cpp b/src/terralib/application/qt/TeQtCanvas.cpp
new file mode 100644
index 0000000..051eb3e
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCanvas.cpp
@@ -0,0 +1,625 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtCanvas.h>
+#include <stdio.h>
+#include <qpainter.h>
+#include <qpixmap.h>
+#include <qimage.h>
+#include <qcursor.h>
+#include <qpaintdevicemetrics.h> 
+
+#define MIN(a,b) a<b?a:b
+#define MAX(a,b) a>b?a:b
+
+//TeQtCanvas::TeQtCanvas(QWidget *parent, const char *name ) : QScrollView(parent,name,WNorthWestGravity)
+TeQtCanvas::TeQtCanvas(QWidget *parent, const char *name ) : TeQtBasicCanvas(parent,name)
+{
+	setVScrollBarMode(QScrollView::Auto);
+	setHScrollBarMode(QScrollView::Auto);
+    viewport()->setMouseTracking( TRUE );
+    viewport()->setFocusPolicy( StrongFocus );
+    viewport()->setBackgroundColor( backgroundColor() );
+	setMargin (0);
+	width_ = viewport()->width();
+	height_ = viewport()->height();
+	popupCanvas_ = new QPopupMenu(this);
+}
+
+TeQtCanvas::~TeQtCanvas()
+{
+	if (backRaster_)
+		delete backRaster_;
+	backRaster_ = 0;
+
+	QPaintDevice* dev = painter_.device();
+	if(dev)
+		painter_.end();
+
+	if(pixmap0_)
+		delete pixmap0_;
+	pixmap0_ = 0;
+
+	if(pixmap1_)
+		delete pixmap1_;
+	pixmap1_ = 0;
+
+	if(pixmap2_)
+		delete pixmap2_;
+	pixmap2_ = 0;
+
+	if(pixmap3_)
+		delete pixmap3_;
+	pixmap3_ = 0;
+}
+
+void TeQtCanvas::setMode (CursorMode m)
+{
+	cursorMode_ = m;
+	down_ = false;
+}
+
+void TeQtCanvas::clear()
+{
+	int ww, hh;
+	ww = viewport()->width();
+	hh = viewport()->height();
+	resizeContents (ww,hh);
+
+// Clear the window
+	QPaintDevice* dev = painter_.device();
+	if(dev)
+		painter_.end();
+	painter_.begin(viewport());
+	painter_.eraseRect(0, 0, ww, hh);
+	painter_.end();
+	if(dev)
+	painter_.begin(dev);
+
+	emit windowClear();
+}
+
+void TeQtCanvas::clear(TeBox box)
+{
+	int ww, hh;
+	ww = viewport()->width();
+	hh = viewport()->height();
+	resizeContents (ww,hh);
+
+	mapCanvasWorldToViewport(box);
+// Clear the window
+	QPaintDevice* dev = painter_.device();
+	plotOnWindow();
+	painter_.eraseRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height());
+	painter_.end();
+	if(dev)
+		painter_.begin(dev);
+	emit windowClear();
+}
+
+void TeQtCanvas::clearAll()
+{
+	// Clear the window
+	clear();
+
+	// Clear the pixmap
+	if(pixmap0_)
+		pixmap0_->fill(paletteBackgroundColor());
+	if(pixmap1_)
+		pixmap1_->fill(paletteBackgroundColor());
+	if(pixmap2_)
+		pixmap2_->fill(paletteBackgroundColor());
+	if(pixmap3_)
+		pixmap3_->fill(paletteBackgroundColor());
+
+	if (backRaster_)
+		delete backRaster_;
+	backRaster_ = 0;
+
+}
+
+void TeQtCanvas::clearAll(TeBox box)
+{
+	// Clear the window
+	clear(box);
+
+	// Clear the pixmap
+	mapCanvasWorldToViewport(box);
+
+	QPaintDevice* dev = painter_.device();
+	if(dev)
+		painter_.end();
+
+	if(pixmap0_)
+	{
+		painter_.begin(pixmap0_);
+		painter_.fillRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height(), backgroundColor());
+		painter_.end();
+	}
+	if(pixmap1_)
+	{
+		painter_.begin(pixmap1_);
+		painter_.fillRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height(), backgroundColor());
+		painter_.end();
+	}
+	if(pixmap0_)
+	{
+		painter_.begin(pixmap2_);
+		painter_.fillRect((int)box.x1(), (int)box.y1(), (int)box.width(), (int)box.height(), backgroundColor());
+		painter_.end();
+	}
+
+	if(dev)
+		painter_.begin(dev);
+}
+
+void TeQtCanvas::setView(int w, int h, QPaintDevice *pd)
+{
+    int ww = w, 
+           hh = h;
+
+    int dpix, dpiy, ncolors, wmm, hmm, depth, pdepth;
+
+	if (pd == 0)
+	{
+		if (ww == 0)
+			ww = viewport()->width();
+		if (hh == 0)
+			hh = viewport()->height();
+		resizeContents (ww,hh);
+		x0_ = 0;
+		y0_ = 0;
+	}
+	else
+	{
+		QPaintDeviceMetrics pdm( pd );
+		if (ww == 0)
+			ww = pdm.width();
+		if (hh == 0)
+			hh = pdm.height ();
+//		x0_ = pdm.width()*.1;
+//		y0_ = pdm.height()*.1;
+		x0_ = 0;
+		y0_ = 0;
+		dpix = pdm.logicalDpiX();
+		dpiy = pdm.logicalDpiY();
+		ncolors = pdm.numColors ();
+		wmm = pdm.widthMM ();
+		hmm = pdm.heightMM ();
+		depth = pdm.depth ();
+		QPaintDevice* dev = painter_.device();
+		if(dev)
+			painter_.end();
+		painter_.begin(pd);
+	    painter_.setClipRect( x0_, y0_, ww, hh );
+	}
+
+// Build new pixmap if window has been resized
+	if (pixmap0_ == 0 || width_ != ww || height_ != hh)
+	{
+		QPaintDevice* dev = painter_.device();
+		if(dev)
+			painter_.end();
+
+		if (pixmap0_)
+			delete pixmap0_;
+		pixmap0_ = 0;
+
+		if (pixmap1_)
+			delete pixmap1_;
+		pixmap1_ = 0;
+
+		if (pixmap2_)
+			delete pixmap2_;
+		pixmap2_ = 0;
+
+		if (pixmap3_)
+			delete pixmap3_;
+		pixmap3_ = 0;
+
+// Build a new pixmap
+		pixmap0_ = new QPixmap (ww,hh);
+		pixmap1_ = new QPixmap (ww,hh);
+		pixmap2_ = new QPixmap (ww,hh);
+		pixmap3_ = new QPixmap (ww,hh);
+
+		pdepth = pixmap0_->depth ();
+	}
+
+	width_ = ww;
+	height_ = hh;
+	params_.ncols_ = width_;
+	params_.nlines_ = height_;
+
+	if (pd == 0)
+	{
+		QPaintDevice* dev = painter_.device();
+		if(dev)
+			painter_.end();
+		painter_.begin(pixmap0_);
+	}
+
+	down_ = false;
+	xul_ = xmin_;
+	yul_ = ymax_;
+	xlr_ = xmax_;
+	ylr_ = ymin_;
+	clearAll();
+}
+
+void TeQtCanvas::correctScrolling (QPoint &p)
+{
+	if(painter_.device() == viewport())
+	{
+		QPoint o (contentsX (), contentsY ());
+		p -= o;
+	}
+}
+
+void TeQtCanvas::initCursorArea(QPoint p)
+{
+	if (!pixmap0_)
+		return;
+
+	down_ = true;
+	TeCoord2D pw = mapVtoW(p);
+	xul_ = pw.x();
+	yul_ = pw.y();
+	ixul_ = ixlr_ = p.x();
+	iyul_ = iylr_ = p.y();
+}
+
+void TeQtCanvas::contentsMousePressEvent( QMouseEvent* e)
+{
+	if (!pixmap0_)
+		return;
+
+	QPoint m = e->pos();
+	TeCoord2D p = mapVtoW(m);
+
+	if(e->button() == LeftButton)
+	{
+		if (cursorMode_ == Area || cursorMode_ == Edit)
+		{
+			plotOnWindow();
+			down_ = true;
+			xul_ = p.x();
+			yul_ = p.y();
+			ixul_ = ixlr_ = e->pos().x();
+			iyul_ = iylr_ = e->pos().y();
+			emit mouseMoved (p, e->state(), m);
+		}
+		else
+			emit mousePressed (p, e->state(), m);
+	}
+	else if(e->button() == RightButton)
+		emit mouseRightButtonPressed (p, e->state(), m);
+}
+
+void TeQtCanvas::contentsMouseMoveEvent ( QMouseEvent* e)
+{
+	if (!pixmap0_)
+		return;
+	QPoint m = e->pos();
+	TeCoord2D p = mapVtoW(m);
+	if (down_)
+	{
+		QPoint o = offset();
+		painter_.setPen (green);
+		painter_.setRasterOp (Qt::XorROP);
+		painter_.drawLine(ixul_-o.x(),iyul_-o.y(),ixlr_-o.x()-1,iyul_-o.y());            
+		painter_.drawLine(ixlr_-o.x(),iyul_-o.y(),ixlr_-o.x(),iylr_-o.y() -1);            
+		painter_.drawLine(ixlr_-o.x(),iylr_-o.y(),ixul_-o.x()-1,iylr_-o.y() );            
+		painter_.drawLine(ixul_-o.x(),iylr_-o.y(),ixul_-o.x(),iyul_-o.y()-1 );            
+		ixlr_ = e->pos().x();
+		iylr_ = e->pos().y();
+		painter_.drawLine(ixul_-o.x(),iyul_-o.y(),ixlr_-o.x()-1,iyul_-o.y());            
+		painter_.drawLine(ixlr_-o.x(),iyul_-o.y(),ixlr_-o.x(),iylr_ -o.y()-1);            
+		painter_.drawLine(ixlr_-o.x(),iylr_-o.y(),ixul_-o.x()-1,iylr_-o.y() );            
+		painter_.drawLine(ixul_-o.x(),iylr_-o.y(),ixul_-o.x(),iyul_-o.y()-1 );            
+		painter_.setRasterOp (Qt::CopyROP);
+	}
+	emit mouseMoved (p, e->state(), m);
+}
+
+void TeQtCanvas::contentsMouseReleaseEvent( QMouseEvent* e)
+{
+	if (!pixmap0_)
+		return;
+	QPoint m = e->pos();
+	TeCoord2D p = mapVtoW(m);
+	if (down_)
+	{
+		ixlr_ = e->pos().x();
+		iylr_ = e->pos().y();
+		xlr_ = p.x();
+		ylr_ = p.y();
+		if(xul_ > xlr_)
+		{
+			double a = xlr_;
+			xlr_ = xul_;
+			xul_ = a;
+		}
+		if(ylr_ > yul_)
+		{
+			double a = ylr_;
+			ylr_ = yul_;
+			yul_ = a;
+		}
+		down_ = false;
+	}
+	emit mouseReleased (p, e->state(), m);
+}
+
+void TeQtCanvas::contentsMouseDoubleClickEvent ( QMouseEvent* e)
+{
+	if (!pixmap0_)
+		return;
+
+	QPoint m = e->pos();
+	TeCoord2D p = mapVtoW(m);
+
+	if(e->button() == LeftButton)
+		emit mouseDoublePressed (p, e->state(), m);
+}
+
+
+void TeQtCanvas::contentsContextMenuEvent( QContextMenuEvent* e)
+{
+//	popupCanvas_->exec(QCursor::pos());
+	QMouseEvent *m = (QMouseEvent *)e;
+	emit popupCanvasSignal(m);
+}
+
+
+void TeQtCanvas::leaveEvent ( QEvent * )
+{
+	emit mouseLeave();
+}
+
+void TeQtCanvas::keyPressEvent (QKeyEvent* e)
+{
+	emit keyPressed(e);
+}
+
+void TeQtCanvas::keyReleaseEvent (QKeyEvent* e)
+{
+	emit keyReleased(e);
+}
+
+void TeQtCanvas::viewportPaintEvent (QPaintEvent*)
+{
+	copyPixmapToWindow ();
+	emit paintEvent ();
+}
+
+void TeQtCanvas::resizeEvent ( QResizeEvent * e)
+{
+//	viewport()->resize(e->size());
+	QScrollView::resizeEvent(e);
+}
+
+void TeQtCanvas::copyPixmapToWindow()
+{
+	if (pixmap0_)
+	{
+		int cx = contentsX();
+		int cy = contentsY();
+		bitBlt (viewport(),0,0,pixmap0_,cx,cy,width_-cx,height_-cy,CopyROP,true);
+	}
+}
+
+double TeQtCanvas::mapVtoData (int pixels)
+{
+	TeBox dbox = getDataWorld();
+	double dwidth = dbox.width();
+	int	width = viewport()->width();
+
+	double d = (double)pixels * dwidth / (double)width;
+	return d;
+}
+
+int TeQtCanvas::mapDatatoV (double a)
+{
+	TeBox dbox = getDataWorld();
+	double dwidth = dbox.width();
+	int	pwidth = viewport()->width();
+
+	int d = (int)((double)pwidth * a / (double)dwidth);
+	return d;
+}
+
+TeBox 
+TeQtCanvas::getPieBarBox(TeThemeApplication* theme)
+{
+	TeBox	boxOut;
+
+	if(theme->chartAttributes_.size() == 0)
+		return boxOut;
+
+	string objectId = theme->chartSelected_;
+
+	string	TS = theme->collectionTable();
+	string	sel = "SELECT * FROM " + TS + " WHERE ";
+
+/*	if(theme->chartObjects() == TeSelectedByPointing)
+		sel += TS + ".sel_by_pointing = 1 AND ";
+	else if(theme->chartObjects() == TeNotSelectedByPointing)
+		sel += TS + ".sel_by_pointing = 0 AND ";
+	else if(theme->chartObjects() == TeSelectedByQuery)
+		sel += TS + ".sel_by_query = 1 AND ";
+	else if(theme->chartObjects() == TeNotSelectedByQuery)
+		sel += TS + ".sel_by_query = 0 AND ";
+	else if(theme->chartObjects() == TeGrouped)
+		sel += TS + ".c_legend_id <> 0 AND ";
+	else if(theme->chartObjects() == TeNotGrouped)
+		sel += TS + ".c_legend_id = 0 AND ";
+*/
+	sel += TS + ".c_object_id = '" + objectId + "'";
+
+	TeDatabasePortal *portal = theme->layer()->database()->getPortal();
+	if (!portal)
+		return false;
+
+	if (!portal->query(sel) || !portal->fetchRow())
+	{
+		delete portal;
+		return boxOut;
+	}
+
+	setDataProjection(theme->layer()->projection());
+
+	double	width = theme->barWidth();
+	double	maxh = theme->barMaxHeight();
+	double	minh = theme->barMinHeight();
+	double	maxd = theme->pieMaxDiameter();
+	double	mind = theme->pieMinDiameter();
+	double	diameter = theme->pieDiameter();
+
+
+	if(theme->keepDimension() != 0)
+	{
+		width = mapVtoData((int)width);
+		maxh = mapVtoData((int)maxh);
+		minh = mapVtoData((int)minh);
+		maxd = mapVtoData((int)maxd);
+		mind = mapVtoData((int)mind);
+		diameter = mapVtoData((int)diameter);
+	}
+
+	unsigned int i;
+
+	TeChartType chartType = (TeChartType)theme->chartType();
+	if(chartType == TePieChart)
+	{
+		double delta = diameter / 2.;
+		if(!(theme->pieDimAttribute() == "NONE"))
+			delta = maxd / 2.;
+
+		string attrs;
+		for(i=0; i<theme->chartAttributes_.size(); i++)
+			attrs += theme->chartAttributes_[i] + ",";
+		attrs += "label_x,label_y";
+		if(!(theme->pieDimAttribute() == "NONE"))
+			attrs += "," + theme->pieDimAttribute();
+
+		string q = "SELECT " + attrs + theme->sqlFrom() + " WHERE " + TS + ".c_object_id = '" + objectId + "'";
+		portal->freeResult();
+		if(portal->query(q))
+		{
+			if(portal->fetchRow())
+			{
+				double tot = 0.;
+				for(i=0; i<theme->chartAttributes_.size(); i++)
+				{
+					string v = portal->getData(i);
+					if(v.empty())
+					{
+						delete portal;
+						return boxOut;
+					}
+					tot += atof(v.c_str());
+				}
+				if(tot == 0.)
+				{
+					delete portal;
+					return boxOut;
+				}
+
+				if(!(theme->pieDimAttribute() == "NONE"))
+				{
+					if(theme->chartMaxVal() - theme->chartMinVal() == 0)
+						diameter = 0.;
+					else
+					{
+						double	adim = portal->getDouble(theme->chartAttributes_.size()+2);
+						double a = (adim - theme->chartMinVal()) / (theme->chartMaxVal() - theme->chartMinVal());
+						diameter = a * (maxd - mind) + mind;
+					}
+				}
+				double	x = theme->chartPoint_.x();
+				double	y = theme->chartPoint_.y();
+				boxOut.x1_ = x - diameter / 2.;
+				boxOut.y1_ = y - diameter / 2.;
+				boxOut.x2_ = x + diameter / 2.;
+				boxOut.y2_ = y + diameter / 2.;
+			}
+		}
+	}
+	else
+	{
+		double	n = theme->chartAttributes_.size();
+		double	maxv = theme->chartMaxVal();
+		double	minv = theme->chartMinVal();
+
+		string attrs;
+		for(i=0; i<theme->chartAttributes_.size(); i++)
+			attrs += theme->chartAttributes_[i] + ",";
+		attrs += "label_x,label_y";
+
+		string q = "SELECT " + attrs + theme->sqlFrom() + " WHERE " + TS + ".c_object_id = '" + objectId + "'";
+
+		vector<double> dvec;
+		portal->freeResult();
+		if(portal->query(q))
+		{
+			if(portal->fetchRow())
+			{
+				double	x = theme->chartPoint_.x();
+				double	xmin = x - n * width / 2.;
+				double	xmax = x + n * width / 2.;
+				double	y = theme->chartPoint_.y();
+
+				dvec.clear();
+				for(i=0; i<theme->chartAttributes_.size(); i++)
+				{
+					string val = portal->getData(i);
+					if(val.empty())
+					{
+						delete portal;
+						return boxOut;
+					}
+					dvec.push_back(atof(val.c_str()));
+				}
+
+				double mheight = -10;
+				for(i=0; i<dvec.size(); i++)
+				{
+					double height;
+					double v = dvec[i];
+					if(maxv - minv == 0)
+						height = 0.;
+					else
+						height = (v - minv) * (maxh - minh) / (maxv - minv) + minh;
+					mheight = MAX(height, mheight);
+				}
+				boxOut.x1_ = xmin;
+				boxOut.y1_ = y;
+				boxOut.x2_ = xmax;
+				boxOut.y2_ = y + mheight;
+			}
+		}
+	}
+	delete portal;
+	return boxOut;
+}
+
+
diff --git a/src/terralib/application/qt/TeQtCanvas.h b/src/terralib/application/qt/TeQtCanvas.h
new file mode 100644
index 0000000..993301e
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCanvas.h
@@ -0,0 +1,118 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTCANVAS_H
+#define  __TERRALIB_INTERNAL_QTCANVAS_H
+
+#include "TeQtBasicCanvas.h"
+#include "TeThemeApplication.h"
+//#include <qscrollview.h>
+#include <qpopupmenu.h>
+#include <qpixmap.h>
+
+/**
+  *@author R Cartaxo
+  */
+
+//class TeQtCanvas : public QScrollView ,public TeQtBasicCanvas {
+class TeQtCanvas : public TeQtBasicCanvas {
+   Q_OBJECT
+public:
+    enum CursorMode { Pointer, Area, Pan, Hand, SizeVer, SizeBDiag, UpArrow, Edit, Distance, Information, ZoomIn, ZoomOut };
+
+// Initialization
+	TeQtCanvas(QWidget *parent=0, const char *name=0);
+	~TeQtCanvas();
+
+	void setMode (CursorMode);
+	void initCursorArea (QPoint p);
+	TeBox getCursorBox (){ return TeBox (xul_,ylr_,xlr_,yul_); }
+
+	void copyPixmapToWindow();
+
+	void setView(int w = 0, int h = 0, QPaintDevice *pd = 0);
+	void clear();
+	void clear(TeBox box);
+	void clearAll();
+	void clearAll(TeBox box);
+	CursorMode getCursorMode() { return cursorMode_;}
+//	void drawTextTT (int x, int y, string &str, double angle = 0.);
+	double mapVtoData (int);
+	int mapDatatoV (double);
+	TeBox  getPieBarBox(TeThemeApplication* theme);
+	QPopupMenu* popupCanvas() { return popupCanvas_; }
+// scrollbar offset
+	QPoint offset () {return QPoint(contentsX(), contentsY());}
+
+signals:
+	void mousePressed (TeCoord2D&, int, QPoint&);
+	void mouseDoublePressed (TeCoord2D&, int, QPoint&);
+	void mouseRightButtonPressed (TeCoord2D&, int, QPoint&);
+	void mouseMoved (TeCoord2D&, int, QPoint&);
+	void mouseReleased (TeCoord2D&, int, QPoint&);
+	void mouseLeave ();
+	void paintEvent ();
+	void windowClear();
+	void popupCanvasSignal(QMouseEvent*);
+	void keyPressed(QKeyEvent*);
+	void keyReleased(QKeyEvent*);
+
+protected:
+
+// Mouse events
+	void contentsMousePressEvent( QMouseEvent* );
+	void contentsMouseMoveEvent ( QMouseEvent* );
+	void contentsMouseReleaseEvent ( QMouseEvent* );
+	void contentsMouseDoubleClickEvent ( QMouseEvent* );
+	void contentsContextMenuEvent( QContextMenuEvent* );
+
+// leave Event
+	void leaveEvent ( QEvent * );
+
+// Key events
+	void keyPressEvent ( QKeyEvent*);
+	void keyReleaseEvent ( QKeyEvent*);
+
+// Area Cursor section
+	CursorMode cursorMode_;
+	bool		down_;
+	double 		xul_, // cursor world coordinates
+				xlr_,
+				yul_,
+				ylr_;
+	int 		ixul_, // cursor screen coordinates
+				ixlr_,
+				iyul_,
+				iylr_;
+
+// Other events
+	void viewportPaintEvent (QPaintEvent* e);
+	void resizeEvent ( QResizeEvent * );
+
+// Mapping correction when scrollbars have been used
+	void correctScrolling (QPoint &p);
+
+// Menu de popup
+	QPopupMenu *popupCanvas_;
+
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtChartItem.cpp b/src/terralib/application/qt/TeQtChartItem.cpp
new file mode 100644
index 0000000..8e986a6
--- /dev/null
+++ b/src/terralib/application/qt/TeQtChartItem.cpp
@@ -0,0 +1,87 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <TeQtChartItem.h>
+#include <TeQtViewsListView.h>
+
+
+//Chart item constructor
+TeQtChartItem::TeQtChartItem(QListViewItem *parent,
+				QString text, TeColor color)
+	: TeQtCheckListItem(parent, text), color_(color)
+{
+	type_ = CHART;
+	name_ = text.latin1();
+	setRenameEnabled(0,true);
+	setSelected(false);
+	setEnabled(true);
+
+	order_ = parent->childCount();
+
+	//create pixmap
+	int	w = 21;
+	int	h = 16;
+
+	QPixmap pixmap(w, h);
+	pixmap.resize(w, h);
+	pixmap.fill();
+
+	QPainter p(&pixmap);
+	QBrush	 brush;
+	QColor	 qColor;
+
+	qColor.setRgb(color_.red_, color_.green_, color_.blue_);
+	brush.setColor(qColor);
+	brush.setStyle((Qt::BrushStyle)SolidPattern);
+
+	p.fillRect (1, 1, w-2, h-2, brush);
+	p.end();
+
+	setPixmap(0, pixmap);
+}
+
+void TeQtChartItem::changeColor(TeColor color)
+{
+	color_ = color;
+
+	int	w = 21;
+	int	h = 16;
+
+	QPixmap pixmap(w, h);
+	pixmap.resize(w, h);
+	pixmap.fill();
+
+	QPainter p(&pixmap);
+	QBrush	 brush;
+	QColor	 qColor;
+
+	qColor.setRgb(color_.red_, color_.green_, color_.blue_);
+	brush.setColor(qColor);
+	brush.setStyle((Qt::BrushStyle)SolidPattern);
+
+	p.fillRect (1, 1, w-2, h-2, brush);
+	p.end();
+
+	setPixmap(0, pixmap);
+	repaint();
+}
diff --git a/src/terralib/application/qt/TeQtChartItem.h b/src/terralib/application/qt/TeQtChartItem.h
new file mode 100644
index 0000000..7038b03
--- /dev/null
+++ b/src/terralib/application/qt/TeQtChartItem.h
@@ -0,0 +1,63 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTCHARTITEM_H
+#define  __TERRALIB_INTERNAL_QTCHARTITEM_H
+
+#include "TeQtCheckListItem.h"
+#include "TeVisual.h"
+
+
+class TeQtChartItem : public TeQtCheckListItem
+{
+public:
+    TeQtChartItem(QListViewItem *parent, QString text, TeColor color);
+
+	~TeQtChartItem () {}
+
+	TeColor color()
+		{ return color_; }
+
+	void changeColor(TeColor color);
+
+	string name() {return name_;}
+
+protected:
+	TeColor color_;
+	string name_;
+};
+
+
+class TeQtChartTitleItem : public TeQtCheckListItem
+{
+public:
+    TeQtChartTitleItem(QListViewItem *parent, QString text)
+	: TeQtCheckListItem(parent, text)
+	{
+		type_ = CHARTTITLE;
+		order_ = parent->childCount();
+	}
+
+	~TeQtChartTitleItem() {}
+};
+
+
+#endif
diff --git a/src/terralib/application/qt/TeQtCheckListItem.cpp b/src/terralib/application/qt/TeQtCheckListItem.cpp
new file mode 100644
index 0000000..5d0f62b
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCheckListItem.cpp
@@ -0,0 +1,95 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtCheckListItem.h>
+#include <TeUtils.h>
+#include <vector>
+
+
+int TeQtCheckListItem::compare (QListViewItem *i, int col, bool ascending) const
+{
+	int order1 = atoi(key(col, ascending).latin1());
+	int order2 = atoi(i->key(col, ascending).latin1());
+
+	if (order1 < order2)
+		return -1;
+	else if (order1 == order2)
+		return 0;
+	else 
+		return 1;
+}
+
+
+QString TeQtCheckListItem::key ( int /* col */, bool /* ascending */ ) const
+{
+	return Te2String(order_).c_str();
+}
+
+
+vector<QListViewItem*> TeQtCheckListItem::getChildren()
+{
+	vector<QListViewItem*> childrenVector;
+
+	QListViewItem *child = firstChild();
+    while (child)
+	{
+		childrenVector.push_back(child);
+        child = child->nextSibling();
+	}
+	return childrenVector;
+}
+
+
+void TeQtCheckListItem::unselectChildren()
+{
+	TeQtCheckListItem *item;
+	int n = childCount();
+	int i = 0;
+
+	if (n == 0)
+		return;
+
+	QListViewItemIterator it(this);
+	++it;
+	item = (TeQtCheckListItem*)(it.current());
+	while(item)
+	{
+		if (item->parent() == this)
+		{
+			item->setSelected(false);
+			item->repaint();
+			++i;
+		}
+		if (i == n)
+			break;
+		++it;
+		item = (TeQtCheckListItem*)(it.current());
+	}
+}
+
+
+bool TeQtCheckListItem::isChild(QListViewItem *item)
+{
+	if (item->parent() == this)
+		return true;
+	else
+		return false;
+}
diff --git a/src/terralib/application/qt/TeQtCheckListItem.h b/src/terralib/application/qt/TeQtCheckListItem.h
new file mode 100644
index 0000000..7d1d7da
--- /dev/null
+++ b/src/terralib/application/qt/TeQtCheckListItem.h
@@ -0,0 +1,72 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTCHECKLISTITEM_H
+#define  __TERRALIB_INTERNAL_QTCHECKLISTITEM_H
+
+#include <qlistview.h>
+#include <vector>
+using namespace std;
+
+
+class TeQtCheckListItem : public QCheckListItem
+{
+public:
+	enum ItemType {DATABASE, INFOLAYER, VIEW, THEME, LEGENDTITLE, LEGEND, CHARTTITLE, CHART};
+
+    TeQtCheckListItem(QListView *parent, QString text, QCheckListItem::Type ctype = QCheckListItem::Controller)
+		: QCheckListItem(parent, text, ctype) {}
+ 
+	TeQtCheckListItem(QListViewItem *parent, QString text, QCheckListItem::Type ctype = QCheckListItem::Controller)
+		: QCheckListItem(parent, text, ctype) {}
+
+	TeQtCheckListItem(QCheckListItem *parent, QString text, QCheckListItem::Type ctype = QCheckListItem::Controller)
+	: QCheckListItem(parent, text, ctype) {}
+	
+	virtual ~TeQtCheckListItem() {}
+
+	ItemType getType() {return type_;}
+	
+	int order()
+		{return order_;}
+
+	void order(int order)
+		{order_ = order;}
+
+	virtual int compare(QListViewItem * i, int col, bool ascending) const;
+
+	virtual QString key(int column, bool ascending) const;
+
+	vector<QListViewItem*> getChildren();
+
+	void unselectChildren();
+
+	bool isChild(QListViewItem *item);
+
+	void cancelRename(int col) {QListViewItem::cancelRename(col);}
+
+
+protected:
+	ItemType type_;
+	int order_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtDatabaseItem.cpp b/src/terralib/application/qt/TeQtDatabaseItem.cpp
new file mode 100644
index 0000000..4d78bd4
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabaseItem.cpp
@@ -0,0 +1,40 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <qpixmap.h>
+#include <TeQtDatabaseItem.h>
+#include <images/database.xpm>
+
+
+//Database item constructor
+TeQtDatabaseItem::TeQtDatabaseItem(QListView *parent,
+	QString text, TeDatabase *db)
+	: TeQtCheckListItem(parent,text), db_(db)
+{
+	type_ = DATABASE;
+	QPixmap p(database_xpm);
+	setPixmap(0,p);
+	sortChildItems(0, true);
+	setSelected(false);
+	setEnabled(true);
+}
+
+				
diff --git a/src/terralib/application/qt/TeQtDatabaseItem.h b/src/terralib/application/qt/TeQtDatabaseItem.h
new file mode 100644
index 0000000..af25fc0
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabaseItem.h
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTDATABASEITEM_H
+#define  __TERRALIB_INTERNAL_QTDATABASEITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeDatabase;
+
+
+class TeQtDatabaseItem : public TeQtCheckListItem
+{
+public:
+    TeQtDatabaseItem(QListView *parent, QString text,
+					 TeDatabase *db);
+
+	~TeQtDatabaseItem () {}
+
+	int compare(QListViewItem * i, int col, bool ascending) const
+		{ return QListViewItem::compare(i, col, ascending); }
+
+	QString key(int col, bool ascending) const
+		{ return QListViewItem::key(col, ascending); }
+
+	TeDatabase*	getDatabase()
+		{return db_;}
+
+protected:
+	TeDatabase	*db_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtDatabasesListView.cpp b/src/terralib/application/qt/TeQtDatabasesListView.cpp
new file mode 100644
index 0000000..cc07859
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabasesListView.cpp
@@ -0,0 +1,270 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtDatabasesListView.h>
+#include <TeQtCheckListItem.h>
+#include <TeQtDatabaseItem.h>
+#include <TeQtLayerItem.h>
+#include <qpopupmenu.h>
+
+
+TeQtDatabasesListView::TeQtDatabasesListView(QWidget *parent, const char *name)
+		: QListView(parent, name)
+{
+	currentDatabaseItem_ = 0;
+	currentLayerItem_ = 0;
+	rightMouseWasClicked_ = false;
+
+	setSelectionMode(QListView::Multi);
+    setRootIsDecorated( TRUE );
+
+	popupDatabase_ = new QPopupMenu(this);
+	popupLayer_ = new QPopupMenu(this);
+	popupOutItem_ = new QPopupMenu(this);
+
+	// rename action
+	setDefaultRenameAction(QListView::Accept);
+
+	connect(this,SIGNAL(clicked(QListViewItem*)),
+			this,SLOT(clicked(QListViewItem*)));
+	connect(this,SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&, int)),
+		    this,SLOT(contextMenuRequested(QListViewItem*,const QPoint&, int)));
+}
+
+
+TeQtDatabasesListView::~TeQtDatabasesListView()
+{
+	if (popupDatabase_)
+		delete popupDatabase_;
+	if (popupLayer_)
+		delete popupLayer_;
+	if (popupOutItem_)
+		delete popupOutItem_;
+}
+
+
+void TeQtDatabasesListView::selectItem(QListViewItem *item)
+{
+	clicked(item);
+}
+
+
+void TeQtDatabasesListView::selectLayerItem(TeLayer *layer)
+{
+	if (layer == 0)
+		return;
+
+	QListViewItem		*item;
+	TeQtCheckListItem	*checkListItem;
+	TeQtLayerItem		*layerItem;
+	TeQtDatabaseItem	*dbItem;
+
+	unselectAllItems();
+	QListViewItemIterator it(this);
+	item = it.current();
+	while(item)
+	{
+		checkListItem = (TeQtCheckListItem*)item;
+		if (checkListItem->getType() == TeQtCheckListItem::INFOLAYER)
+		{
+			layerItem = (TeQtLayerItem*)item;
+			if (layerItem->getLayer() == layer)
+			{
+				if (layerItem == currentLayerItem_)
+					break;
+				else
+				{
+					item->setSelected(true);
+					item->repaint();
+					currentLayerItem_ = layerItem;
+
+					dbItem = (TeQtDatabaseItem*)item->parent();
+					dbItem->setSelected(true);
+					dbItem->repaint();
+					currentDatabaseItem_ = dbItem;
+					emit itemChanged(item);
+					return;
+				}
+			}
+		}
+		it++;
+		item = it.current();
+	}
+}
+
+
+void TeQtDatabasesListView::removeItem(QListViewItem *item)
+{
+	TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+
+	if(checkListItem->getType() == TeQtCheckListItem::DATABASE)
+	{
+		TeQtDatabaseItem* dbItem = (TeQtDatabaseItem*)item;
+
+		vector<QListViewItem*> childrenVector;
+		childrenVector = dbItem->getChildren();
+
+		unsigned int i;
+		TeQtLayerItem *layerItem;
+		for (i = 0; i < childrenVector.size(); ++i)
+		{
+			layerItem = (TeQtLayerItem*)childrenVector[i];
+			delete layerItem;
+		}
+
+		if (currentDatabaseItem_ == dbItem)
+		{
+			currentDatabaseItem_ = 0;
+			currentLayerItem_ = 0;
+		}
+		delete dbItem;
+	}
+	else
+	{
+		// item is a layer
+		TeQtLayerItem *layerItem = (TeQtLayerItem*)item;
+		if (currentLayerItem_ == layerItem)
+			currentLayerItem_ = 0;
+		delete layerItem;
+	}
+}
+
+
+void TeQtDatabasesListView::clicked(QListViewItem *item)
+{
+	unselectAllItems();
+	if (item == 0 || rightMouseWasClicked_ == true)
+	{
+		if (currentDatabaseItem_ != 0)
+		{
+			currentDatabaseItem_->setSelected(true);
+			currentDatabaseItem_->repaint();
+		}
+
+		if (currentLayerItem_ != 0)
+		{
+			currentLayerItem_->setSelected(true);
+			currentLayerItem_->repaint();
+		}
+
+		rightMouseWasClicked_ = false;
+		return;
+	}
+
+	TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+	if (checkListItem->getType() == TeQtCheckListItem::DATABASE)
+	{
+		item->setSelected(true);
+		item->repaint();
+
+		TeQtDatabaseItem* dbItem = (TeQtDatabaseItem*)item;
+		if (dbItem != currentDatabaseItem_)
+		{
+			currentDatabaseItem_ = dbItem;
+			currentLayerItem_ = 0;
+			emit itemChanged(item);
+		}
+		else
+		{
+			if (currentLayerItem_ != 0)
+			{
+				currentLayerItem_->setSelected(true);
+				currentLayerItem_->repaint();
+			}
+		}
+	}
+	else if(checkListItem->getType() == TeQtCheckListItem::INFOLAYER)
+	{
+		item->parent()->setSelected(true);
+		item->parent()->repaint();
+		item->setSelected(true);
+		item->repaint();
+
+		TeQtDatabaseItem *dbItem = (TeQtDatabaseItem*)item->parent();
+		if (currentDatabaseItem_ != dbItem)
+		{
+			currentDatabaseItem_ = dbItem;
+			emit itemChanged(item->parent());
+		}
+
+		TeQtLayerItem* layerItem = (TeQtLayerItem*)item;
+		if (layerItem != currentLayerItem_)
+		{
+			currentLayerItem_ = layerItem;
+			emit itemChanged(item);
+		}
+	}
+}
+
+
+void TeQtDatabasesListView::contextMenuRequested(QListViewItem *item, const QPoint&, int)
+{
+	popupItem_ = (TeQtCheckListItem*)item;
+
+	unselectAllItems();
+	if (currentDatabaseItem_)
+	{
+		currentDatabaseItem_->setSelected(true);
+		currentDatabaseItem_->repaint();
+	}
+
+	if (currentLayerItem_)
+	{
+		currentLayerItem_->setSelected(true);
+		currentLayerItem_->repaint();
+	}
+
+	emit popupSignal();
+}
+
+
+void TeQtDatabasesListView::contentsMousePressEvent(QMouseEvent *e)
+{
+	if (e->button() == Qt::RightButton)
+	{
+		rightMouseWasClicked_ = true;
+		popupDatabase_->move(e->globalPos().x(), e->globalPos().y());
+		popupLayer_->move(e->globalPos().x(), e->globalPos().y());
+		popupOutItem_->move(e->globalPos().x(), e->globalPos().y());
+	}
+	QListView::contentsMousePressEvent(e);
+}
+
+
+void TeQtDatabasesListView::unselectAllItems()
+{
+	QListViewItem *item;
+
+	QListViewItemIterator it(this);
+	item = it.current();
+	while(item)
+	{
+		item->setSelected(false);
+		item->repaint();
+		it++;
+		item = it.current();
+	}
+}
+
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtDatabasesListView.h b/src/terralib/application/qt/TeQtDatabasesListView.h
new file mode 100644
index 0000000..2b29be9
--- /dev/null
+++ b/src/terralib/application/qt/TeQtDatabasesListView.h
@@ -0,0 +1,92 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTDATABASESLISTVIEW_H
+#define  __TERRALIB_INTERNAL_QTDATABASESLISTVIEW_H
+
+
+#include <qlistview.h>
+
+class QPopupMenu;
+class TeQtCheckListItem;
+class TeQtDatabaseItem;
+class TeQtLayerItem;
+class TeLayer;
+
+
+class TeQtDatabasesListView : public QListView
+{
+	Q_OBJECT
+
+public:
+    TeQtDatabasesListView(QWidget *parent = 0, const char *name = 0);
+
+	~TeQtDatabasesListView();
+
+	TeQtDatabaseItem* currentDatabaseItem() 
+		{ return currentDatabaseItem_; }
+
+	TeQtLayerItem* currentLayerItem() 
+		{ return currentLayerItem_; }
+
+	TeQtCheckListItem *popupItem()
+		{ return popupItem_; }
+
+	QPopupMenu* popupDatabase()
+		{ return popupDatabase_; }
+
+	QPopupMenu* popupLayer()
+		{ return popupLayer_; }
+
+	QPopupMenu* popupOutItem()
+		{ return popupOutItem_; }
+
+	void selectItem(QListViewItem *item);
+
+	void selectLayerItem(TeLayer *layer);
+
+	void removeItem(QListViewItem *item);
+
+signals:
+	void itemChanged(QListViewItem*);
+	void popupSignal();
+
+protected slots:
+	void clicked(QListViewItem *item);
+	void contextMenuRequested(QListViewItem*, const QPoint&, int);
+
+protected:
+	TeQtDatabaseItem	*currentDatabaseItem_;
+	TeQtLayerItem		*currentLayerItem_;
+	bool				rightMouseWasClicked_;
+	TeQtCheckListItem	*popupItem_;
+	QPopupMenu			*popupDatabase_;
+	QPopupMenu			*popupLayer_;
+	QPopupMenu			*popupOutItem_;
+
+	void contentsMousePressEvent(QMouseEvent *e);
+
+	void unselectAllItems();
+};
+
+
+#endif
+
diff --git a/src/terralib/application/qt/TeQtGraph.cpp b/src/terralib/application/qt/TeQtGraph.cpp
new file mode 100644
index 0000000..836266b
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGraph.cpp
@@ -0,0 +1,284 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtGraph.h>
+#include <TeCoord2D.h>
+#include <qpaintdevicemetrics.h> 
+#include <qprinter.h>
+
+TeQtGraphPlot::TeQtGraphPlot (QWidget *parent, const char * /* name */)
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev)
+		painter_.end();
+
+// Build a new pixmap
+	widget_ = parent;
+    QPaintDeviceMetrics pdm( widget_ );
+	pixmap_ = new QPixmap (pdm.width(), pdm.height());
+	pixmap_->fill(widget_->paletteBackgroundColor());
+
+	if(dev)
+		painter_.end();
+	painter_.begin(pixmap_);
+
+	pwidth_ = pdm.width();
+	pheight_ = pdm.height();
+
+	//Mounting the brushStyleMap
+	brushStyleMap_[TePolyTypeTransparent] = Qt::NoBrush;
+	brushStyleMap_[TePolyTypeFill] = Qt::SolidPattern;
+	brushStyleMap_[TePolyTypeHorizontal] = Qt::HorPattern;
+	brushStyleMap_[TePolyTypeVertical] = Qt::VerPattern;
+	brushStyleMap_[TePolyTypeFDiagonal] = Qt::FDiagPattern;
+	brushStyleMap_[TePolyTypeBDiagonal] = Qt::BDiagPattern;
+	brushStyleMap_[TePolyTypeCross] = Qt::CrossPattern;
+	brushStyleMap_[TePolyTypeDiagonalCross] = Qt::DiagCrossPattern;
+
+	//Mounting the penStyleMap
+	penStyleMap_[TeLnTypeContinuous] = Qt::SolidLine;
+	penStyleMap_[TeLnTypeDashed] = Qt::DashLine;
+	penStyleMap_[TeLnTypeDotted] = Qt::DotLine;
+	penStyleMap_[TeLnTypeDashDot] = Qt::DashDotLine;
+	penStyleMap_[TeLnTypeDashDotDot] = Qt::DashDotDotLine;
+	penStyleMap_[TeLnTypeNone] = Qt::NoPen;
+
+	QString family;
+#ifdef WIN32
+	family = "Verdana";
+#else
+	family = "Sans";
+#endif
+	QFont font(family);
+	font.setPointSize(10);
+	font.setBold(true);
+	painter_.setFont(font);
+}
+
+TeQtGraphPlot::~TeQtGraphPlot ()
+{
+	if(painter_.device())
+		painter_.end();
+
+	delete pixmap_;
+}
+
+void TeQtGraphPlot::resize (int w, int h)
+{
+	if(painter_.device())
+		painter_.end();
+	delete pixmap_;
+
+	pwidth_ = w;
+	pheight_ = h;
+	pixmap_ = new QPixmap (w, h);
+	pixmap_->fill(widget_->paletteBackgroundColor());
+	painter_.begin(pixmap_);
+}
+
+void TeQtGraphPlot::plot ()
+{
+	plotOnPixmap();
+	polygonBrush_ = QBrush(Qt::white);
+	fillRectangle (0, 0, pwidth_, pheight_);
+	plotCurves ();
+	copyPixmapToWindow();
+}
+
+int TeQtGraphPlot::getWidth ()
+{
+    return pwidth_;
+}
+
+int	TeQtGraphPlot::getHeight ()
+{
+    return pheight_;
+}
+
+void TeQtGraphPlot::setLineAttributes(TeColor c, int /* s */, int w)
+{
+	QColor cor(c.red_, c.green_, c.blue_);
+	linePen_.setColor (cor);
+	linePen_.setStyle(penStyleMap_[(TeLnBasicType)TeLnTypeContinuous]);
+	linePen_.setWidth(w);
+}
+
+void TeQtGraphPlot::setFillAreaColor (TeColor c)
+{
+	QColor cor(c.red_, c.green_, c.blue_);
+	polygonBrush_.setColor (cor);
+	polygonBrush_.setStyle(brushStyleMap_[(TePolyBasicType)TePolyTypeFill]);
+}
+
+void TeQtGraphPlot::setTextColor (TeColor c)
+{
+	QColor cor(c.red_, c.green_, c.blue_);
+	textPen_.setColor (cor);
+}
+
+void TeQtGraphPlot::fillRectangle (int x, int y, int dx, int dy)
+{
+	painter_.fillRect (x,y,dx,dy,polygonBrush_);
+}
+
+void TeQtGraphPlot::drawRectangle (int x, int y, int dx, int dy)
+{
+	painter_.setPen(linePen_);
+	painter_.moveTo(x,y);
+	painter_.lineTo(x+dx,y);
+	painter_.lineTo(x+dx,y+dy);
+	painter_.lineTo(x,y+dy);
+	painter_.lineTo(x,y);
+}
+
+void TeQtGraphPlot::drawLine (int sx, int sy, int dx, int dy)
+{
+	painter_.setPen(linePen_);
+	painter_.drawLine (sx,sy,dx,dy);
+}
+
+void TeQtGraphPlot::drawText (int x, int y, char* t, double angle)
+{
+	painter_.setPen(textPen_);
+
+	if(angle != 0)
+	{
+		painter_.save();
+		painter_.translate(x, y);
+		painter_.rotate(-angle);
+		painter_.drawText(0, 0, t);
+		painter_.restore();
+	}
+	else
+		painter_.drawText(x, y, t);
+}
+
+void TeQtGraphPlot::fillArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c)
+{
+	QColor cor(c.red_, c.green_, c.blue_);
+	painter_.setBrush(cor);
+	painter_.drawPie (xc,yc,w,h,(int)(a1*16),(int)((a2-a1)*16));
+}
+
+void TeQtGraphPlot::drawArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c)
+{
+	QColor cor(c.red_, c.green_, c.blue_);
+	painter_.setBrush(cor);
+	painter_.drawArc (xc,yc,w,h,(int)(a1*16),(int)((a2-a1)*16));
+}
+
+void TeQtGraphPlot::copyPixmapToWindow ()
+{
+	if (pixmap_)
+		bitBlt (widget_,0,0,pixmap_,0,0,pwidth_,pheight_,Qt::CopyROP,true);
+}
+
+void TeQtGraphPlot::copyPixmapToWindow(int ulx, int uly, int w, int h)
+{
+	if (pixmap_)
+		bitBlt (widget_,ulx,uly,pixmap_,ulx,uly,w,h,Qt::CopyROP,true);
+}
+
+void TeQtGraphPlot::plotOnWindow ()
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev == widget_)
+		return;
+	if(dev)
+		painter_.end();
+	painter_.begin(widget_);
+}
+
+void TeQtGraphPlot::plotOnPixmap ()
+{
+	QPaintDevice* dev = painter_.device();
+	if(dev == pixmap_)
+		return;
+	if(dev)
+		painter_.end();
+	painter_.begin(pixmap_);
+}
+
+TePlotWidget::TePlotWidget(QWidget *parent, const char *name):TeQtGraphPlot(parent,name)
+{
+	widget_ = parent;
+}
+
+void TePlotWidget::plot ()
+{
+	TeQtGraphPlot::plot ();
+}
+
+
+void TePlotWidget::erase( int order)
+{
+	kill (order);
+	plot ();
+}
+
+void TeQtGraphPlot::plotRectangle (int x, int y, int dx, int dy)
+{
+	painter_.setPen(linePen_);
+	painter_.moveTo(x,y);
+	painter_.lineTo(x+dx,y);
+	painter_.lineTo(x+dx,y+dy);
+	painter_.lineTo(x,y+dy);
+	painter_.lineTo(x,y);
+}
+
+void TeQtGraphPlot::value_to_pixel(double px, double py, int* x, int* y)
+{
+	TeGraphPlot::value_to_pixel(px, py, x, y);
+}
+
+void TeQtGraphPlot::copyPixmapToPrinter()
+{
+	if (pixmap_)
+	{
+		QPrinter printer;
+		if (printer.setup())
+		{
+			QPainter p(&printer);
+
+			QPaintDevice* dev = painter_.device();
+			if(dev == pixmap_)
+				painter_.end();
+
+			p.drawPixmap(0, 0, *pixmap_);
+			p.flush();
+			p.end();
+
+			if(dev && painter_.device() == 0)
+				painter_.begin(dev);
+		}
+	}
+}
+
+void TeQtGraphPlot::textExtent (string &str, int &w, int &h, double /* angle */)
+{
+	QFont font = painter_.font();
+	QFontMetrics fm(font);
+
+	w = fm.width(str.c_str());
+	h = fm.height();
+
+	//?????????????????? fazer codigo......
+}
diff --git a/src/terralib/application/qt/TeQtGraph.h b/src/terralib/application/qt/TeQtGraph.h
new file mode 100644
index 0000000..b14a606
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGraph.h
@@ -0,0 +1,83 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTGRAPH_H
+#define  __TERRALIB_INTERNAL_QTGRAPH_H
+
+#include <qwidget.h> 
+#include <qpainter.h>
+#include <qpixmap.h>
+#include "TeGraph.h"
+
+class TeQtGraphPlot : public TeGraphPlot
+{
+public :
+	TeQtGraphPlot (QWidget *parent=0, const char *name=0);
+	~TeQtGraphPlot ();
+	virtual void plot ();
+	void plotRectangle (int x, int y, int dx, int dy);
+	void value_to_pixel(double px, double py, int* x, int* y);
+	int	pwidth_;
+	int	pheight_;
+	int	 getWidth ();
+	int	 getHeight ();
+	QPixmap* getPixmap() {return pixmap_;}
+	QWidget* widget_;
+	void plotOnWindow();
+	void plotOnPixmap();
+	void copyPixmapToWindow();
+	void copyPixmapToWindow(int, int, int, int);
+	void copyPixmapToPrinter();
+   	void setLineAttributes (TeColor c, int , int );
+	void setFillAreaColor (TeColor c);
+	void setTextColor (TeColor c);
+	void fillRectangle (int x, int y, int dx, int dy);
+	void drawRectangle (int x, int y, int dx, int dy);
+	void drawLine (int sx, int sy, int dx, int dy);
+	void drawText (int x, int y, char*t, double angle = 0);
+	void fillArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c);
+	void drawArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c);
+	void textExtent ( string &str, int &w, int &h, double angle = 0.);
+	void resize(int, int);
+
+private :
+	QPainter	painter_;
+	QPixmap*	pixmap_;
+	QPen		linePen_;
+	QColor		lineColor_;
+	QBrush		polygonBrush_;
+	QColor		polygonColor_;
+	QPen		textPen_;
+	map<TePolyBasicType, Qt::BrushStyle> brushStyleMap_;
+	map<TeLnBasicType, Qt::PenStyle> penStyleMap_;
+};
+
+class TePlotWidget : public TeQtGraphPlot {
+public:
+
+// Initialization
+	TePlotWidget(QWidget *parent=0, const char *name=0);
+	~TePlotWidget() {}
+	void erase (int order = 0);
+	void plot ();
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtGrid.cpp b/src/terralib/application/qt/TeQtGrid.cpp
new file mode 100644
index 0000000..038f1f2
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGrid.cpp
@@ -0,0 +1,2765 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+************************************************************************************/
+#include "TeQtGrid.h"
+#include "TeWaitCursor.h"
+#include "TeApplicationUtils.h"
+#include <qtable.h>
+#include <qcolordialog.h>
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include <qdragobject.h>
+#include <algorithm>
+
+TeQtGrid::TeQtGrid(QWidget* parent, const char* name)
+	: QTable(parent, name)
+{
+	autoPromote_ = true;
+	gridX_ = -1;
+	gridY_ = -1;
+	iLine_ = -1;
+	fLine_ = -1;
+	iCol_ = -1;
+	fCol_ = -1;
+	gridWidth_  = -1;
+	gridHeight_ = -1;
+	portal_ = 0;
+	doRepaint_ = true;
+	doRefresh_ = false;
+	shiftKeyPressed_ = false;
+	lastLinePressed_ = -1;
+	verticalEdition_ = true;
+	rowToEdit_ = -1;
+	colToEdit_ = -1;
+	editing_ = false;
+	showGridInformation_ = true;
+	columnDragEnabled_ = false;
+	mousePressedOnHorizontalHeader_ = false;
+
+	setNumCols(0);
+	setNumRows(0);
+	setSelectionMode(QTable::Multi);
+
+	popupHorizHeader_ = new QPopupMenu;
+	popupVertHeader_ = new QPopupMenu;
+	popupViewport_ = new QPopupMenu;
+
+	horizontalHeader()->setAcceptDrops(true);
+
+	verticalHeader()->installEventFilter(this);
+	horizontalHeader()->installEventFilter(this);
+
+    connect(verticalHeader(), SIGNAL(released(int)),
+	     this, SLOT(mouseReleasedOnVerticalHeaderSlot(int))); // NOTE: QT send the pressed position in your argument
+
+	verticalHeader()->setResizeEnabled(false);
+}
+
+
+TeQtGrid::~TeQtGrid()
+{
+	if (portal_)
+	{
+		delete portal_;
+		portal_ = 0;
+	}
+	if (popupHorizHeader_)
+		delete popupHorizHeader_;
+	if (popupVertHeader_)
+		delete popupVertHeader_;
+	if (popupViewport_)
+		delete popupViewport_;
+}
+
+
+void TeQtGrid::init (TeThemeApplication *theme)
+{
+	int i, j, numRows, nCols, gs;
+	int collectionNumCols = 0;
+	char buf[20];
+	string oid, uid;
+	hide();
+	clear();
+
+	if (theme == 0)
+		return;
+
+	TeAttrTableVector attrTables; 
+	theme->getAttTables(attrTables); 
+
+	if (attrTables.size() == 0)
+		return;
+
+	TeWaitCursor wait;
+
+	theme_ = theme;
+	CT_ = theme->collectionTable();
+	CTE_ = theme->collectionAuxTable();
+	db_ = theme_->layer()->database();
+
+	sqlJoin_ = theme_->sqlGridJoin();
+
+	// Mount the vector of indexes (indexName_) from the tables
+	theme_->getAttTables(tableVector_);
+	for (i = 0; i < (int)tableVector_.size(); ++i)
+	{
+		TeTable t = tableVector_[i];
+		if(t.tableType() == TeAttrStatic || t.tableType() == TeAttrEvent)
+		{
+			if(tableVector_[i].linkName().empty())
+				indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].uniqueName());
+			else
+				indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].linkName());
+		}
+		else if(t.tableType() != TeAttrExternal)
+		{
+			if(tableVector_[i].uniqueName().empty() == false)
+				indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].uniqueName());
+			if(tableVector_[i].linkName().empty() == false)
+				indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].linkName());
+		}
+		else
+		{
+			if(tableVector_[i].uniqueName().empty() == false)
+				indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].uniqueName());
+			if(tableVector_[i].linkName().empty() == false)
+				indexVector_.push_back(tableVector_[i].name() + "." + tableVector_[i].linkName());
+			if(tableVector_[i].relatedAttribute().empty() == false)
+				indexVector_.push_back(tableVector_[i].relatedTableName() + "." + tableVector_[i].relatedAttribute());
+		}
+	}
+
+	TeAttributeList collAttrList;
+	db_->getAttributeList(CT_, collAttrList);
+	collectionNumCols = collAttrList.size();
+
+	if (portal_)
+		delete portal_;
+	portal_= db_->getPortal();
+
+	//read the objects and their legends
+	//from the collection table
+	orderBy_ = CTE_ + ".unique_id ";
+	sql_ = sqlJoin_ + " ORDER BY " + orderBy_ + "ASC ";
+	if (!portal_->query(sql_))
+	{
+		delete portal_;
+		portal_ = 0;
+		wait.resetWaitCursor();
+		return;
+	}
+
+	TeAttributeList extAttList;
+	db_->getAttributeList(CTE_, extAttList);
+
+	TeAttributeList attrList = portal_->AttributeList();
+	uniqueIdPos_ = attrList.size() - 2;
+	objectIdPos_ = attrList.size() - extAttList.size() - 6;
+	gridStatusPos_ = attrList.size() - 1;
+	resultIdPos_ = attrList.size() - extAttList.size() - 1;
+	i = 0;
+	while (portal_->fetchRow())
+	{
+		uid = portal_->getData(uniqueIdPos_);
+		oid = portal_->getData(objectIdPos_);
+		gs = atoi(portal_->getData(gridStatusPos_));
+
+		if(uid.empty())
+		{
+			unique2ObjectMap_[oid] = oid;
+			ObjectInfo	info;
+			info.status_ = atoi(portal_->getData(resultIdPos_));
+			objectMap_[oid] = info;
+			portalRow2UniqueIdVector_.push_back(oid);
+		}
+		else
+		{
+			unique2ObjectMap_[uid] = oid;
+
+			if(objectMap_.find(oid) == objectMap_.end())
+			{
+				ObjectInfo	info;
+				info.uniqueMap_[uid] = gs;
+				info.status_ = atoi(portal_->getData(resultIdPos_));
+				objectMap_[oid] = info;
+			}
+			else
+			{
+				objectMap_[oid].uniqueMap_[uid] = gs;
+
+				if(objectMap_[oid].status_ == 0 && gs > 0)
+					objectMap_[oid].status_ = gs;
+				else if(objectMap_[oid].status_ == 1 && gs == 2)
+					objectMap_[oid].status_ = 3;
+				else if(objectMap_[oid].status_ == 2 && gs == 1)
+					objectMap_[oid].status_ = 3;
+			}
+			portalRow2UniqueIdVector_.push_back(uid);
+		}
+		gridToPortalRowVector_.push_back(i);
+		++i;
+	}
+	numRows = i;
+	
+	//get the column names
+
+	nCols = theme->sqlAttList().size();
+	vector<string> colNamesVector;
+	for (j = 0; j < nCols; ++j)
+		colNamesVector.push_back(theme->sqlAttList()[j].rep_.name_);
+
+	doRepaint_ = false; // don�t repaint
+	setNumRows(numRows);
+	setNumCols(nCols);
+
+	for (i = 0; i < nCols; ++i)
+		horizontalHeader()->setLabel(i, colNamesVector[i].c_str());
+
+	// Set the vector that will contain the order the
+	// grid columns will be shown
+	for (i = 0; i < nCols; i++)
+	{
+		gridToPortalColVector_.push_back(i);
+		gridColVisVector_.push_back(true);
+	}
+
+	// Set the minimum width of the vertical header of the grid
+	sprintf(buf, "%d", numRows);
+	int minw = strlen(buf) + 1;
+	if (minw < 3)
+		minw = 3;
+	verticalHeader()->setMinimumWidth(minw*9); // supposing char width of 9 pixels
+	setLeftMargin(minw*9);
+
+
+	doRepaint_ = true; // do repaint
+	doRefresh_ = true; // do refresh
+
+	refresh();
+	int visibleCols = 0;
+	int scVal = horizontalScrollBar()->value();
+	for(i=0; i<numCols(); i++)
+	{
+		if(visibleWidth() < columnPos(i) - scVal)
+			break;
+		visibleCols++;
+	}
+
+	for (i = 0; i < visibleCols; ++i)
+		adjustColumn(i);
+	refresh();
+	emit gridChangedSignal();
+	show();
+	gridInformation();
+}
+
+
+void TeQtGrid::initPortal()
+{
+	TeWaitCursor wait;
+
+	int i, j;
+	int nCols = numCols();
+
+	doRepaint_ = false; // do not repaint
+
+	for (j = 0; j < nCols; ++j)
+		horizontalHeader()->removeLabel(j);
+
+	TeAttributeList collAttrList;
+	db_->getAttributeList(CT_, collAttrList);
+
+	portal_= db_->getPortal();
+
+	//read the objects and their legends
+	//from the collection table
+	if (!portal_->query(sql_))
+	{
+		delete portal_;
+		portal_ = 0;
+		wait.resetWaitCursor();
+		return;
+	}
+
+	TeAttrTableVector cTableVec = tableVector_;
+	tableVector_.clear();
+	theme_->getAttTables(tableVector_);
+
+	TeAttributeList extAttList;
+	db_->getAttributeList(CTE_, extAttList);
+
+	TeAttributeList attrList = portal_->AttributeList();
+	uniqueIdPos_ = attrList.size() - 2;
+	objectIdPos_ = attrList.size() - extAttList.size() - 6;
+	gridStatusPos_ = attrList.size() - 1;
+	resultIdPos_ = attrList.size() - extAttList.size() - 1;
+	
+	//get the column names
+	nCols = theme_->sqlAttList().size();
+	vector<string> colNamesVector;
+	for (j = 0; j < nCols; ++j)
+		colNamesVector.push_back(theme_->sqlAttList()[j].rep_.name_);
+
+	setNumCols(nCols);
+
+	arrangeColumns(cTableVec);	
+	for(i=0; (unsigned int)i<gridColVisVector_.size(); i++)
+		showColumn(i);
+
+	for (i = 0; i < nCols; ++i)
+	{
+		j = gridToPortalColVector_[i];
+		horizontalHeader()->setLabel(i, colNamesVector[j].c_str());
+	}
+	doRepaint_ = true; // do repaint
+	doRefresh_ = true; // do refresh
+
+	for(i=0; (unsigned int)i<gridColVisVector_.size(); i++)
+	{
+		bool b = gridColVisVector_[i];
+		if(b == false)
+			hideColumn(i);
+	}
+	refresh();
+	int visibleCols = 0;
+	int scVal = horizontalScrollBar()->value();
+	for(i=0; i<numCols(); i++)
+	{
+		if(visibleWidth() < columnPos(i) - scVal)
+			break;
+		visibleCols++;
+	}
+
+	for (i = 0; i < visibleCols; ++i)
+		adjustColumn(i);
+	refresh();
+	emit gridChangedSignal();
+	show();
+	gridInformation();
+}
+
+void TeQtGrid::updatePortalContents()
+{
+	TeWaitCursor wait;
+
+	if (portal_ == 0)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+
+	portal_->freeResult();
+
+	if (!portal_->query(sql_))
+	{
+		delete portal_;
+		portal_ = 0;
+	}
+}
+
+void TeQtGrid::clear()
+{
+	gridX_ = -1;
+	gridY_ = -1;
+	iLine_ = -1;
+	fLine_ = -1;
+	iCol_ = -1;
+	fCol_ = -1;
+	gridWidth_  = -1;
+	gridHeight_ = -1;
+	rowToEdit_ = -1;
+	colToEdit_ = -1;
+
+	shiftKeyPressed_ = false;
+	lastLinePressed_ = -1;
+
+	gridToPortalRowVector_.clear();
+	gridToPortalColVector_.clear();
+	objectMap_.clear();
+	unique2ObjectMap_.clear();
+	portalRow2UniqueIdVector_.clear();
+	gridColVisVector_.clear();
+	indexVector_.clear();
+	tableVector_.clear();
+
+	if (portal_)
+	{
+		delete portal_;
+		portal_ = 0;
+	}
+	setNumRows(0);
+	setNumCols(0);
+}
+
+void TeQtGrid::clearPortal()
+{
+	if (portal_)
+	{
+		delete portal_;
+		portal_ = 0;
+	}
+}
+
+
+bool TeQtGrid::eventFilter(QObject *o, QEvent *e)
+{
+	if (doRepaint_ == false) // do not repaint
+		return true; // stop event
+	static int stx, sty;
+
+	if(o == horizontalHeader())
+	{
+		QMouseEvent *m = (QMouseEvent *)e;
+		int gridCol = columnAt(m->x() + contentsX());
+		if(portal_)
+		{
+			TeTable table = findTable(gridCol);
+			QString msg = tr("Table:") + " ";
+			msg += table.name().c_str();
+			if(table.tableType() == TeAttrStatic)
+				msg += " - " + tr("Table type: TeAttrStatic");
+			else if(table.tableType() == TeAttrExternal)
+				msg += "  " + tr("Table type: TeAttrExternal");
+			else if(table.tableType() == TeAttrEvent)
+				msg += " - " + tr("Table type: TeAttrEvent");
+			else if(table.tableType() == TeFixedGeomDynAttr)
+				msg += " - " + tr("Table type: TeFixedGeomDynAttr");
+			else if(table.tableType() == TeDynGeomDynAttr)
+				msg += " - " + tr("Table type: TeDynGeomDynAttr");
+
+			TeAttributeList AL = portal_->AttributeList();
+			int pcol = gridToPortalColVector_[gridCol];
+			if(AL.size() > (unsigned int)pcol)
+			{
+				msg += " - " + tr("Column:");
+				msg += " ";
+				msg += AL[pcol].rep_.name_.c_str();
+				if(AL[pcol].rep_.type_ == TeSTRING)
+				{
+					msg += " - " + tr("Column type: TeSTRING");
+					msg += " - " + tr("Num char:");
+					msg += " ";
+					msg += Te2String(AL[pcol].rep_.numChar_).c_str();
+				}
+				else if(AL[pcol].rep_.type_ == TeREAL)
+					msg += "  " + tr("Column type: TeREAL");
+				else if(AL[pcol].rep_.type_ == TeINT)
+					msg += " - " + tr("Column type: TeINT");
+				else if(AL[pcol].rep_.type_ == TeDATETIME)
+					msg += " - " + tr("Column type: TeDATETIME");
+				if(isIndex(pcol))
+					msg += " - " + tr("Column is not editable");
+				else
+					msg += " - " + tr("Column is editable");
+			}
+
+			displayGridInformation(msg);
+		}
+		
+		if (e->type() == QEvent::MouseButtonPress)
+		{
+			stx = sty = -1;
+			if (m->button() == RightButton)
+			{
+				if(gridCol < 0)
+					return false;
+
+				int portalColToPopup = gridToPortalColVector_[gridCol];
+				popupHorizHeader_->move(m->globalPos().x(), m->globalPos().y());
+				emit horizHeaderSignal(portalColToPopup);
+				return true;
+			}
+			if (m->button() == LeftButton)
+			{
+				stx = contentsX();
+				sty = contentsY();
+				if(sty != 0)
+					mousePressedOnHorizontalHeader_ = true;
+				int p = horizontalHeader()->sectionPos(gridCol);
+				int ss = horizontalHeader()->sectionSize(gridCol);
+				int x = m->x() + horizontalHeader()->offset();
+				if(abs(x-p) <= 3 || abs(x-(p+ss)) <= 3)
+					return false;
+				columnDragEnabled_ = true;
+				return false;
+			}
+		}
+		else if(e->type() == QEvent::DragEnter) {
+			QDragEnterEvent *dg = (QDragEnterEvent *)e;
+			dg->accept(QTextDrag::canDecode(dg));
+			return true;
+		}
+		else if(e->type() == QEvent::DragMove) {
+			return true;
+		}
+		else if(e->type() == QEvent::MouseMove) {
+			if (columnDragEnabled_)
+			{
+				columnDragEnabled_ = false;
+				clearSelection(true);
+				setSelectionMode(QTable::NoSelection);
+				string t = "swap:" + Te2String(gridCol);
+				QTextDrag* tDrag = new QTextDrag(t.c_str(), this, "gridswap");
+				tDrag->drag();
+			}
+			return false;
+		}
+		else if(e->type() == QEvent::Drop) {
+			QDragEnterEvent *dg = (QDragEnterEvent *)e;
+			dg->accept(QTextDrag::canDecode(dg));
+			QDropEvent *dp = (QDropEvent *)e;
+
+			QString tx;
+			string dragText;
+			if(QTextDrag::decode(dp, tx))
+				dragText = tx.latin1();
+
+			string fName = dragText;
+			int f = fName.find("-fieldName:");
+			if(f >= 0)
+			{
+				fName.erase(0, f+strlen("-fieldName:"));
+
+				string table = dragText;
+				table.erase(f, table.size()-f);
+				f = table.find("table:", string::npos);
+				if(f == 0)
+					table.erase(0, strlen("table:"));
+
+				int col = columnAt(dg->pos().x() + contentsX());
+				string dropName = horizontalHeader()->label(col).latin1();
+				emit linkTable(table, fName, dropName);
+			}
+			else // swap column
+			{
+				f = fName.find("swap:", string::npos);
+				if(f >= 0)
+				{
+					TeWaitCursor wait;
+					string s = fName;
+					s.erase(0, strlen("swap:"));
+					int col1 = atoi(s.c_str());
+					int col2 = columnAt(dg->pos().x() + contentsX());
+					if(col1 < col2)
+						for(int i=col1; i<col2; i++)
+							swapColumns(i, i+1);
+					else
+						for(int i=col1; i>col2; i--)
+							swapColumns(i, i-1);
+					QPoint p = dg->pos();
+					QMouseEvent* e = new QMouseEvent(QEvent::MouseButtonRelease, p, Qt::LeftButton, Qt::LeftButton);
+					QApplication::postEvent(horizontalHeader(), e);
+				}
+			}
+			return true;
+		}
+		else if (e->type() == QEvent::MouseButtonRelease)
+		{
+			columnDragEnabled_ = false;
+			setSelectionMode(QTable::Multi);
+			if(stx > -1 && sty > -1)
+				setContentsPos(stx, sty);
+			return false;
+		}
+	}
+	else if(o == verticalHeader())
+	{
+		if (e->type() == QEvent::MouseButtonDblClick)
+		{
+			QMouseEvent *m = (QMouseEvent *)e;
+			if (m->button() == LeftButton)
+			{
+				int lin = rowAt(m->y() + contentsY());
+				if (lin >= 0)
+				{
+					int portalRowToPopup = gridToPortalRowVector_[lin];
+					emit vertHeaderLeftDblClickSignal(portalRowToPopup);
+				}
+			}
+		}
+		else if (e->type() == QEvent::MouseButtonPress)
+		{
+			QMouseEvent *m = (QMouseEvent *)e;
+			if (m->button() == LeftButton)
+			{
+				stx = contentsX();
+				sty = contentsY();
+				return false;
+			}
+			else if (m->button() == RightButton)
+			{
+				int lin = rowAt(m->y() + contentsY());
+				if (lin < 0)
+					return false;
+
+				int portalRowToPopup = gridToPortalRowVector_[lin];
+				popupVertHeader_->move(m->globalPos().x(), m->globalPos().y());
+				emit vertHeaderSignal(portalRowToPopup);
+				return true;
+			}
+		}
+		else if (e->type() == QEvent::MouseButtonRelease)
+		{
+			QMouseEvent *m = (QMouseEvent *)e;
+			if (m->button() == LeftButton)
+			{
+				if (m->state() & Qt::ShiftButton)
+					shiftKeyPressed_ = true;
+				else
+					shiftKeyPressed_ = false;
+				int lin = m->y();
+				dragLineReleased_ = rowAt(lin + contentsY());
+				setContentsPos(stx, sty);
+			}
+			return false;
+		}
+	}
+	else if (o == viewport())
+	{
+		if (e->type() == QEvent::MouseButtonPress)
+		{
+			if(rowToEdit_ > -1 && colToEdit_ > -1)
+				endEdit(rowToEdit_, colToEdit_, true, true);
+			rowToEdit_ = -1;
+			colToEdit_ = -1;
+			editing_ = false;
+
+			QMouseEvent *m = (QMouseEvent *)e;
+			if (m->button() == RightButton)
+			{
+				popupViewport_->move(m->globalPos().x(), m->globalPos().y());
+				emit viewportSignal();
+				return true;
+			}
+		}
+		else if (e->type() == QEvent::MouseButtonDblClick)
+		{
+			QMouseEvent *m = (QMouseEvent *)e;
+			if (m->button() == LeftButton)
+			{
+				int col = gridToPortalColVector_[currentColumn()];
+				if(isIndex(col))
+					return true;
+
+				refresh();
+				setEditMode(QTable::Editing, currentRow(), currentColumn());
+				beginEdit(currEditRow(), currEditCol(), false);
+				rowToEdit_ = currEditRow();
+				colToEdit_ = currEditCol();
+				return false;
+			}
+		}
+		else if (e->type() == QEvent::Enter)
+			gridInformation();
+	}
+	else
+	{
+		if (e->type() == QEvent::KeyPress)
+		{
+			if(rowToEdit_ == -1 || colToEdit_ == -1)
+				return true;
+
+			QKeyEvent *k = (QKeyEvent*)e;
+			if (k->state() & Qt::ControlButton)
+			{
+				if(k->key() == Qt::Key_PageDown)
+				{
+					scrollToNextPointedObjectSlot();
+					return true;
+				}
+				else if(k->key() == Qt::Key_PageUp)
+				{
+					scrollToPrevPointedObjectSlot();
+					return true;
+				}
+			}
+			else if (k->state() & Qt::AltButton)
+			{
+				if(k->key() == Qt::Key_PageDown)
+				{
+					scrollToNextQueriedObjectSlot();
+					return true;
+				}
+				else if(k->key() == Qt::Key_PageUp)
+				{
+					scrollToPrevQueriedObjectSlot();
+					return true;
+				}
+			}
+			else if (k->key() == Qt::Key_Return)
+			{
+				editing_ = true;
+				endEdit(rowToEdit_, colToEdit_, true, true);
+				goToEditNewCell();
+				return true;
+			}
+		}
+	}
+
+	return QTable::eventFilter(o, e);
+}
+
+
+void TeQtGrid::mouseReleasedOnVerticalHeaderSlot(int lin)     
+{
+	TeWaitCursor wait;
+	string uid, oid;
+	int i, begin, end;
+	set<string> drawSet;
+	
+	if (shiftKeyPressed_ == false) // single toggle
+	{
+		portal_->fetchRow(gridToPortalRowVector_[lin]);
+		uid = portal_->getData(uniqueIdPos_);
+		oid = portal_->getData(objectIdPos_);
+		drawSet.insert(oid);
+		ObjectInfo& info = objectMap_[oid];
+		changeObjectStatus(info, uid, "pointing");
+	}
+	else	// set or reset grid lines (shift and pointing operation)
+	{
+		if (lastLinePressed_ != -1)
+		{
+			portal_->fetchRow(gridToPortalRowVector_[lastLinePressed_]);
+			uid = portal_->getData(uniqueIdPos_);
+			oid = portal_->getData(objectIdPos_);
+			ObjectInfo& info = objectMap_[oid];
+			int pointed = info.status_  & 0x1;
+			if(uid.empty() == false)
+				pointed = info.uniqueMap_[uid] & 0x1;
+
+			if (lin > lastLinePressed_)
+			{
+				begin = lastLinePressed_ + 1;
+				end = lin;
+			}
+			else if (lin < lastLinePressed_)
+			{
+				begin = lin;
+				end = lastLinePressed_ - 1;
+			}
+			else
+				begin = end = lin;
+
+			for (i = begin ; i <= end; ++i)
+			{
+				portal_->fetchRow(gridToPortalRowVector_[i]);
+				uid = portal_->getData(uniqueIdPos_);
+				oid = portal_->getData(objectIdPos_);
+				ObjectInfo& info = objectMap_[oid];
+				changeObjectStatus(info, uid, "shiftAndPointing", pointed);
+				drawSet.insert(oid);
+			}
+		}
+	}
+
+	if (lin != dragLineReleased_)
+	{
+		if (dragLineReleased_ == -1)
+		{
+			int ini, fim;
+			for (ini = iLine_; ini <= fLine_; ini++)
+				if (isRowSelected(ini, true))
+					break;
+
+			for (fim = fLine_; fim >= iLine_; fim--)
+				if (isRowSelected(fim, true))
+					break;
+
+			if (fim > lin)
+				dragLineReleased_ = fim;
+			else
+				dragLineReleased_ = ini;
+		}
+		portal_->fetchRow(gridToPortalRowVector_[lin]);
+		uid = portal_->getData(uniqueIdPos_);
+		oid = portal_->getData(objectIdPos_);
+		ObjectInfo& info = objectMap_[oid];
+		int pointed = info.status_  & 0x1;
+		if(uid.empty() == false)
+			pointed = info.uniqueMap_[uid] & 0x1;
+
+		if (lin < dragLineReleased_)
+		{
+			begin = lin + 1;
+			end = dragLineReleased_;
+		}
+		else
+		{
+			begin = dragLineReleased_;
+			end = lin - 1;
+		}
+
+		for (i = begin ; i <= end; ++i)
+		{
+			portal_->fetchRow(gridToPortalRowVector_[i]);
+			uid = portal_->getData(uniqueIdPos_);
+			oid = portal_->getData(objectIdPos_);
+			ObjectInfo& info = objectMap_[oid];
+			changeObjectStatus(info, uid, "shiftAndPointing", pointed);
+			drawSet.insert(oid);
+		}
+	}
+
+	lastLinePressed_ = lin;
+	clearSelection(true);
+
+	refresh();
+	if (saveObjectStatus(theme_, drawSet, objectMap_) == false)
+	{
+		QMessageBox::critical(this, tr("Error"),
+			tr("Fail to update the \"c_object_status\" and \"grid_status\" fields in the collection table!"));
+		return;
+	}
+	emit putColorOnObject(theme_, drawSet);
+	gridInformation();
+}
+
+
+void TeQtGrid::putColorOnGrid(set<string> uidSet, set<string> oidSet, string operation, string /* attrQuery */)     
+{
+	int	x, y;
+	string oid, uid;
+	set<string> drawSet;
+	set<string>::iterator it, nit;
+	list<string>::iterator vit;
+	map<string, int>::iterator uit;
+	map<string, ObjectInfo>::iterator oit;
+	set<string> auxSet;
+
+	for (it = oidSet.begin(); it != oidSet.end(); ++it)
+	{
+		ObjectInfo& info = objectMap_[*it];
+		if(info.uniqueMap_.size())
+		{
+			for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+				uidSet.insert(uit->first);
+		}
+		else
+			auxSet.insert(*it);
+	}
+	oidSet = auxSet;
+
+	if (operation == "newQuery" || operation == "filterQuery" || operation == "addQuery")
+	{
+		//get the unique ids that were queried before this query
+		list<string> oldUQueriedList, oldOQueriedList;
+		for(oit =  objectMap_.begin(); oit != objectMap_.end(); oit++)
+		{
+			ObjectInfo& info = oit->second;
+			if(info.uniqueMap_.size())
+			{
+				for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+				{
+					if(uit->second & 0x2)
+						oldUQueriedList.push_back(uit->first);
+				}
+			}
+			else
+			{
+				if(info.status_ & 0x2)
+					oldOQueriedList.push_back(oit->first);
+			}
+		}
+
+		if(operation == "newQuery")
+		{
+			// remove intersection (new and old set)
+			vit = oldUQueriedList.begin();
+			while(vit != oldUQueriedList.end())
+			{
+				if((nit = uidSet.find(*vit)) != uidSet.end())
+				{
+					vit = oldUQueriedList.erase(vit);
+					uidSet.erase(nit);
+				}
+				else
+					vit++;
+			}
+			vit = oldOQueriedList.begin();
+			while(vit != oldOQueriedList.end())
+			{
+				if((nit = oidSet.find(*vit)) != oidSet.end())
+				{
+					vit = oldOQueriedList.erase(vit);
+					oidSet.erase(nit);
+				}
+				else
+					vit++;
+			}
+
+			// reset old queried
+			for(vit = oldUQueriedList.begin(); vit != oldUQueriedList.end(); vit++)
+			{
+				oid = unique2ObjectMap_[*vit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*vit] &= 0x1;
+				drawSet.insert(oid);
+			}
+			for(vit = oldOQueriedList.begin(); vit != oldOQueriedList.end(); vit++)
+			{
+				oid = *vit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ &= 0x1;
+				drawSet.insert(oid);
+			}
+
+			// set new queried
+			for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+			{
+				oid = unique2ObjectMap_[*nit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*nit] |= 0x2;
+				drawSet.insert(oid);
+			}
+			for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+			{
+				oid = *nit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ |= 0x2;
+				for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+					uit->second |= 0x2;
+				drawSet.insert(oid);
+			}
+		}
+		else if(operation == "filterQuery")
+		{
+			// remove intersection (old set)
+			for (nit = uidSet.begin(); nit != uidSet.end(); nit++)
+				if((vit = std::find(oldUQueriedList.begin(), oldUQueriedList.end(), *nit)) != oldUQueriedList.end())
+					oldUQueriedList.erase(vit);
+			for (nit = oidSet.begin(); nit != oidSet.end(); nit++)
+				if((vit = std::find(oldOQueriedList.begin(), oldOQueriedList.end(), *nit)) != oldOQueriedList.end())
+					oldOQueriedList.erase(vit);
+
+			// reset old queried
+			for(vit = oldUQueriedList.begin(); vit != oldUQueriedList.end(); vit++)
+			{
+				oid = unique2ObjectMap_[*vit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*vit] &= 0x1;
+				drawSet.insert(oid);
+			}
+			for(vit = oldOQueriedList.begin(); vit != oldOQueriedList.end(); vit++)
+			{
+				oid = *vit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ &= 0x1;
+				for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+					uit->second &= 0x1;
+				drawSet.insert(oid);
+			}
+		}
+		else if(operation == "addQuery")
+		{
+			// remove intersection (new set)
+			for (vit = oldUQueriedList.begin(); vit != oldUQueriedList.end(); vit++)
+				if((nit = uidSet.find(*vit)) != uidSet.end())
+					uidSet.erase(nit);
+			for (vit = oldOQueriedList.begin(); vit != oldOQueriedList.end(); vit++)
+				if((nit = oidSet.find(*vit)) != oidSet.end())
+					oidSet.erase(nit);
+
+			// set new queried
+			for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+			{
+				oid = unique2ObjectMap_[*nit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*nit] |= 0x2;
+				drawSet.insert(oid);
+			}
+			for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+			{
+				oid = *nit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ |= 0x2;
+				for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+					uit->second |= 0x2;
+				drawSet.insert(oid);
+			}
+		}
+	}
+	else if (operation == "newPointing" || operation == "togglePointing" || operation == "addPointing")
+	{
+		list<string> oldUPointedList, oldOPointedList;
+		if(operation != "togglePointing")
+		{
+			//get the object ids that were pointed before this pointing
+			for(oit =  objectMap_.begin(); oit != objectMap_.end(); oit++)
+			{
+				ObjectInfo& info = oit->second;
+				if(info.uniqueMap_.size())
+				{
+					for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+					{
+						if(uit->second & 0x1)
+							oldUPointedList.push_back(uit->first);
+					}
+				}
+				else
+				{
+					if(info.status_ & 0x1)
+						oldOPointedList.push_back(oit->first);
+				}
+			}
+		}
+
+		if(operation == "newPointing")
+		{
+			// remove intersection (new and old set)
+			vit = oldUPointedList.begin();
+			while(vit != oldUPointedList.end())
+			{
+				if((nit = uidSet.find(*vit)) != uidSet.end())
+					vit = oldUPointedList.erase(vit);
+				else
+					vit++;
+			}
+			vit = oldOPointedList.begin();
+			while(vit != oldOPointedList.end())
+			{
+				if((nit = oidSet.find(*vit)) != oidSet.end())
+					oldOPointedList.erase(vit);
+				else
+					vit++;
+			}
+
+			// reset old pointeds
+			for(vit = oldUPointedList.begin(); vit != oldUPointedList.end(); vit++)
+			{
+				oid = unique2ObjectMap_[*vit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*vit] &= 0x2;
+				drawSet.insert(oid);
+			}
+			for(vit = oldOPointedList.begin(); vit != oldOPointedList.end(); vit++)
+			{
+				oid = *vit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ &= 0x2;
+				drawSet.insert(oid);
+			}
+
+			// set new pointed
+			for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+			{
+				oid = unique2ObjectMap_[*nit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*nit] |= 0x1;
+				drawSet.insert(oid);
+			}
+			for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+			{
+				oid = *nit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ |= 0x1;
+				for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+					uit->second |= 0x1;
+				drawSet.insert(oid);
+			}
+		}
+		else if(operation == "togglePointing")
+		{
+			// toggle status (new pointed ids)
+			nit = oidSet.begin();
+			if(nit != oidSet.end())
+			{
+				oid = *nit;
+				ObjectInfo& info = objectMap_[oid];
+				int status = info.status_;
+
+				if(status & 0x1) // reset new pointed
+				{
+					while(nit != oidSet.end())
+					{
+						oid = *nit;
+						ObjectInfo& info = objectMap_[oid];
+						info.status_ &= 0x2;
+						for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+							uit->second &= 0x2;
+						nit++;
+						drawSet.insert(oid);
+					}
+				}
+				else // set new pointed
+				{
+					while(nit != oidSet.end())
+					{
+						oid = *nit;
+						ObjectInfo& info = objectMap_[oid];
+						info.status_ |= 0x1;
+						for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+							uit->second |= 0x1;
+						nit++;
+						drawSet.insert(oid);
+					}
+				}
+			}
+
+			nit = uidSet.begin();
+			if(nit != uidSet.end())
+			{
+				oid = unique2ObjectMap_[*nit];
+				ObjectInfo& info = objectMap_[oid];
+				int status = info.status_;
+
+				if(status & 0x1) // reset new pointed
+				{
+					for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+					{
+						oid = unique2ObjectMap_[*nit];
+						ObjectInfo& info = objectMap_[oid];
+						info.uniqueMap_[*nit] &= 0x2;
+						drawSet.insert(oid);
+					}
+				}
+				else // set new pointed
+				{
+					for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+					{
+						oid = unique2ObjectMap_[*nit];
+						ObjectInfo& info = objectMap_[oid];
+						info.uniqueMap_[*nit] |= 0x1;
+						drawSet.insert(oid);
+					}
+				}
+			}
+		}
+		else if(operation == "addPointing")
+		{
+			// remove intersection (new pointed ids)
+ // not erase (not optimize) - graphic plot need selectd objects
+
+			// set new pointeds
+			for(nit = uidSet.begin(); nit != uidSet.end(); nit++)
+			{
+				oid = unique2ObjectMap_[*nit];
+				ObjectInfo& info = objectMap_[oid];
+				info.uniqueMap_[*nit] |= 0x1;
+				drawSet.insert(oid);
+			}
+			for(nit = oidSet.begin(); nit != oidSet.end(); nit++)
+			{
+				oid = *nit;
+				ObjectInfo& info = objectMap_[oid];
+				info.status_ |= 0x1;
+				for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+					uit->second |= 0x1;
+				drawSet.insert(oid);
+			}
+		}
+	}
+
+	for(it = drawSet.begin(); it != drawSet.end(); it++)
+	{
+		oid = *it;
+		ObjectInfo& info = objectMap_[oid];
+		if(info.uniqueMap_.size())
+		{
+			set<int> statusSet;
+			uit = info.uniqueMap_.begin();
+			uid = uit->first;
+
+			while(uit != info.uniqueMap_.end())
+				statusSet.insert(uit++->second);
+			if(statusSet.find(3) != statusSet.end())
+				info.status_ = 3;
+			else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) != statusSet.end())
+				info.status_ = 3;
+			else if(statusSet.find(2) != statusSet.end() && statusSet.find(1) == statusSet.end())
+				info.status_ = 2;
+			else if(statusSet.find(2) == statusSet.end() && statusSet.find(1) != statusSet.end())
+				info.status_ = 1;
+			else
+				info.status_ = 0;
+		}
+	}
+
+	// If it is not a query operation (i.e., a pointing operation), scroll the grid if the
+	// single object is not visible in the grid.
+	if (operation == "togglePointing")
+	{
+		vector<string>::iterator itpos;
+		if(uid.empty() == false)
+			itpos = std::find(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end(), uid);
+		else
+			itpos = std::find(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end(), oid);
+		int pos = 0;
+		if(itpos != portalRow2UniqueIdVector_.end())
+			pos = itpos - portalRow2UniqueIdVector_.begin();
+
+		vector<int>::iterator itpos2;
+		itpos2 = std::find(gridToPortalRowVector_.begin(),gridToPortalRowVector_.end(), pos);
+		pos = itpos2 - gridToPortalRowVector_.begin();
+
+		if (pos <= iLine_ || pos >= fLine_)
+		{
+			// if editing, end edit to enable vertical scrolling
+			if(editing_ && (rowToEdit_ > -1 && colToEdit_ > -1))
+			{
+				endEdit(rowToEdit_, colToEdit_, true, true);
+				rowToEdit_ = -1;
+				colToEdit_ = -1;
+				editing_ = false;
+			}
+			doRepaint_ = true;
+			x = contentsX();
+			y = rowPos(pos);
+			setContentsPos(x, y);
+		}
+	}
+
+	clearSelection(true);
+	refresh();
+
+	if (saveObjectStatus(theme_, drawSet, objectMap_) == false)
+	{
+		QMessageBox::critical(this, tr("Error"),
+			tr("Fail to update the \"c_object_status\" and \"grid_status\" fields in the collection table!"));
+		return;
+	}
+
+	emit putColorOnObject(theme_, drawSet);
+
+	if(autoPromote_)
+	{
+		// if editing, end edit to enable vertical scrolling
+		if(editing_ && (rowToEdit_ > -1 && colToEdit_ > -1))
+		{
+			endEdit(rowToEdit_, colToEdit_, true, true);
+			rowToEdit_ = -1;
+			colToEdit_ = -1;
+			editing_ = false;
+		}
+		if (operation == "newPointing" || operation == "addPointing")
+			promotePointedObjectsSlot();
+		else if(operation == "newQuery" || operation == "addQuery" || operation == "filterQuery")
+			promoteQueriedObjectsSlot();
+	}
+
+	gridInformation();
+}
+
+
+void TeQtGrid::drawContents (QPainter *qp, int clipx, int clipy, int clipw, int cliph)
+{
+	if(doRepaint_ == true)
+	{
+		update();
+		QTable :: drawContents(qp, clipx, clipy, clipw, cliph);
+	}
+}
+
+
+void TeQtGrid::update()
+{
+	if(portal_ == 0)
+		return;
+	int ie = currEditRow();
+	int je = currEditCol();
+	QString vale;
+	if(ie >= 0 && je >= 0)
+	{
+		setCellContentFromEditor(ie, je);
+		vale = text(ie, je);
+		if(vale.isEmpty())
+		{
+			int pos = gridToPortalRowVector_[ie];
+			if(portal_->fetchRow(pos))
+			{
+				string s = portal_->getData(gridToPortalColVector_[je]);
+				if(s.empty() == false)
+					vale = s.c_str();
+			}
+		}
+	}
+
+	int	i, j, pos;
+
+	int gridY = contentsY();
+	int gridX = contentsX();
+
+	if(mousePressedOnHorizontalHeader_ && gridY == 0)
+	{
+		setContentsPos(gridX_, gridY_);
+		gridY = gridY_;
+		mousePressedOnHorizontalHeader_ = false;
+	}
+
+	int gridHeight = visibleHeight(); 
+	int gridWidth = visibleWidth(); 
+
+	if (doRefresh_ == false && 
+		gridX_ == gridX && gridY_ == gridY &&
+		gridHeight_ == gridHeight && 
+		gridWidth_ == gridWidth)
+		return;
+
+	gridX_ = gridX;
+	gridY_ = gridY;
+	gridHeight_ = gridHeight;
+	gridWidth_ = gridWidth;
+		
+// clear cells
+	doRepaint_ = false; // do not repaint
+	if (iLine_ >= 0 && iCol_ >= 0)
+	{
+		for (i = iLine_; i <= fLine_; ++i)
+		{
+			for (j = iCol_; j <= fCol_; ++j)
+			{
+				if(item(i, j))
+					clearCell(i, j);
+			}
+		}
+	}
+
+	iLine_ = rowAt(gridY_);
+	iCol_  = columnAt(gridX_);
+	visibleLines_ = rowAt(gridHeight_);
+	if (visibleLines_ == -1)
+		visibleLines_ = numRows();
+
+	visibleCols_ = 0;
+	int scVal = horizontalScrollBar()->value();
+	for(i=iCol_; i<numCols(); i++)
+	{
+		if(gridWidth_ < columnPos(i) - scVal)
+			break;
+		visibleCols_++;
+	}
+
+	if (iLine_ < 0 || iCol_ < 0)
+	{
+		gridX_ = gridY_ = iLine_ = fLine_ = iCol_ = fCol_ = -1;
+		doRepaint_ = true;
+		return;
+	}
+
+	fLine_ = iLine_ + visibleLines_;
+	if (fLine_ > numRows() - 1)
+		fLine_ = numRows() - 1;
+	fCol_ = iCol_ + visibleCols_ - 1;
+
+	int status;
+	string st, oid, uid;
+	QColor qc;
+	TeColor color;
+	for (i = iLine_; i <= fLine_ ; ++i)
+	{
+		pos = gridToPortalRowVector_[i];
+		if (portal_->fetchRow(pos) == false)
+			return;
+
+		oid = portal_->getData(objectIdPos_);
+		uid = portal_->getData(uniqueIdPos_);
+
+		ObjectInfo& info = objectMap_[oid];
+		if(uid.empty() == false)
+			status = info.uniqueMap_[uid];
+		else
+			status = info.status_;
+
+		if (status == 1)
+			color = theme_->pointingLegend().visual(TePOLYGONS).color();
+		else if (status == 2)
+			color = theme_->queryLegend().visual(TePOLYGONS).color();
+		else if (status == 3)
+			color = theme_->queryAndPointingLegend().visual(TePOLYGONS).color();
+		qc = QColor(color.red_,color.green_,color.blue_);
+
+		for (j = iCol_; j <= fCol_; ++j)
+		{
+			if (gridColVisVector_[j] == true)
+			{
+				st = portal_->getData(gridToPortalColVector_[j]);
+				if(status != 0)
+				{
+					TeQtGridItem *ti;
+					if(ie == i && je == j)
+						ti = new TeQtGridItem( this, QTableItem::OnTyping, vale);
+					else
+						ti = new TeQtGridItem( this, QTableItem::OnTyping, st.c_str());
+
+					ti->setColor(qc);
+					setItem(i, j, ti );
+				}
+				else
+				{
+					if(ie == i && je == j)
+						setText(i, j, vale);
+					else
+						setText(i, j, st.c_str());
+				}
+			}
+
+			if(i == fLine_ && j == fCol_- 1)
+			{
+				doRepaint_ = true; // do repaint
+				doRefresh_ = true;
+				updateCell(i, j);
+			}
+		}
+	}
+
+	doRepaint_ = true; // do repaint
+	doRefresh_ = false;
+
+	if(ie >= 0 && je >= 0)
+		endEdit(ie, je, true, true);
+
+	if(rowToEdit_ > -1 && colToEdit_ > -1 && editing_)
+	{
+		setEditMode(QTable::Editing, rowToEdit_, colToEdit_);
+		beginEdit(rowToEdit_, colToEdit_, false);
+	}
+}
+
+
+void TeQtGrid::adjustColumns()
+{
+	int	i;
+	for (i = 0; i < numCols(); ++i)
+		adjustColumn(i);
+	refresh();
+}
+
+
+void TeQtGrid::swapColumns(int col1, int col2)
+{
+	int	nc = numCols();
+	vector<int>	cols;
+	int	n;
+
+	if (col1 == -1 || col2 == -1)
+	{
+		for(n = 0; n < nc; n++)
+			if (isColumnSelected(n, true) == true)
+				cols.push_back(n);
+		if(cols.size() != 2)
+		{
+			QMessageBox::warning(this, tr("Warning"),
+				tr("Select the two grid columns to be exchanged!"));
+			return;
+		}
+		col1 = cols[0];
+		col2 = cols[1];
+	}
+
+	int c1 = gridToPortalColVector_[col1];
+	int c2 = gridToPortalColVector_[col2];
+
+	gridToPortalColVector_[col1] = c2;
+	gridToPortalColVector_[col2] = c1;
+
+	QTable::swapColumns(col1, col2);
+	for (n=0; n<nc; n++)
+	{
+		string st = portal_->getAttribute(gridToPortalColVector_[n]).rep_.name_;
+		horizontalHeader()->setLabel(n, st.c_str());
+	}
+	refresh();
+}
+
+
+void TeQtGrid::setVisColumn(bool vis, int col)
+{
+	unsigned int nc = numCols();
+	unsigned int n;
+	vector<int>	cols;
+
+	if (vis == false)
+	{
+		if (col == -1)
+		{
+			for(n=0; n<nc; n++)
+				if (isColumnSelected(n, true) == true)
+					cols.push_back(n);
+			if(cols.size() == 0)
+			{
+				QMessageBox::warning(this, tr("Warning"),
+					tr("Select the grid column(s) to be hidden!"));
+				return;
+			}
+		}
+		else
+			cols.push_back(col);
+
+		for(n=0; n<cols.size(); n++)
+		{
+			showColumn(cols[n]); // it is a BUG in the QT 3.2.0 
+			hideColumn(cols[n]);
+			gridColVisVector_[cols[n]] = false;
+		}
+	}
+	else
+	{
+		for(n=0; n<nc; n++)
+		{
+			if(gridColVisVector_[n] == false)
+			{
+				gridColVisVector_[n] = true;
+				showColumn(n);
+				cols.push_back(n);
+			}
+		}
+	}
+	refresh();
+}
+
+void TeQtGrid::refresh()
+{
+	doRefresh_ = true;
+	update();
+}
+
+
+void TeQtGrid::promotePointedObjectsSlot()
+{
+	TeWaitCursor	wait;
+	gridToPortalRowVector_.clear();
+	string	oid, uid;
+	TeDatabasePortal* portal = db_->getPortal();
+	vector<int> notByPointingVector;
+
+	unsigned int i=0;
+    int gs;
+	if (portal->query(sql_))
+	{
+		while (portal->fetchRow())
+		{
+			gs = atoi(portal->getData(gridStatusPos_));
+			if(gs &= 0x1)
+				gridToPortalRowVector_.push_back(i);
+			else
+				notByPointingVector.push_back(i);
+			++i;
+		}
+	}
+	delete portal;
+
+	for (i = 0; i < notByPointingVector.size(); ++i)
+		gridToPortalRowVector_.push_back(notByPointingVector[i]);
+	
+	doRepaint_ = true;
+
+	int x = contentsX();
+	int y = rowPos(0);
+	setContentsPos(x, y);
+
+	refresh();
+}
+
+
+void TeQtGrid::promoteQueriedObjectsSlot()
+{
+	TeWaitCursor	wait;
+	gridToPortalRowVector_.clear();
+	string	oid, uid, val;
+	TeDatabasePortal* portal = db_->getPortal();
+	vector<int> notByQueryVector;
+
+	unsigned int i=0;
+    int gs;
+	if (portal->query(sql_))
+	{
+		while (portal->fetchRow())
+		{
+			val =  portal->getData(gridStatusPos_);
+			if(val.empty())
+				gs = atoi(portal->getData(resultIdPos_));
+			else
+				gs = atoi(val.c_str());
+
+			if(gs &= 0x2)
+				gridToPortalRowVector_.push_back(i);
+			else
+				notByQueryVector.push_back(i);
+			++i;
+		}
+	}
+	delete portal;
+
+	for (i = 0; i < notByQueryVector.size(); ++i)
+		gridToPortalRowVector_.push_back(notByQueryVector[i]);
+	
+	doRepaint_ = true;
+
+	int x = contentsX();
+	int y = rowPos(0);
+	setContentsPos(x, y);
+
+	refresh();
+}
+
+
+void TeQtGrid::sortAscOrderSlot()    
+{
+	vector<int>	v;
+
+	sort(v, "ASC");
+}
+
+
+void TeQtGrid::sortDescOrderSlot()    
+{
+	vector<int>	v;
+
+	sort(v, "DESC");
+}
+
+
+void TeQtGrid::sort(vector<int> cols, string order)
+{
+	unsigned int nc = numCols();
+	unsigned int n;
+	string uid, oid;
+
+	if (portal_ == 0)
+		return;
+
+
+	if (cols.size() == 0)
+	{
+		for(n = 0; n < nc; ++n)
+			if (isColumnSelected(n, true) == true)
+				cols.push_back(n);
+	}
+
+	if (cols.size() == 0)
+	{
+		QMessageBox::warning(this, tr("Warning"),
+			tr("Select the grid column(s) to be sorted!"));
+		return;
+	}
+
+	orderBy_.clear();
+	for (n=0; n<cols.size(); n++)
+		orderBy_ += (horizontalHeader()->label(cols[n]) + " ").latin1() + order + ",";
+	orderBy_.erase(orderBy_.size()-1, 1);
+	doRepaint_ = true;
+
+	portal_->freeResult();
+	sql_ = sqlJoin_ + " ORDER BY " + orderBy_;
+	if (portal_->query(sql_) == false)
+	{
+		delete portal_;
+		portal_ = 0;
+		return;
+	}
+
+	gridToPortalRowVector_.clear();
+	portalRow2UniqueIdVector_.clear();
+	int i = 0;
+	while(portal_->fetchRow())
+	{
+		uid = portal_->getData(uniqueIdPos_);
+		if(uid.empty() == false)
+			portalRow2UniqueIdVector_.push_back(uid);
+		else
+		{
+			oid = portal_->getData(objectIdPos_);
+			portalRow2UniqueIdVector_.push_back(oid);
+		}
+		gridToPortalRowVector_.push_back(i);
+		++i;
+	}
+
+	refresh();
+}
+
+
+TeTable& TeQtGrid::findTable(int col) // grid column
+{
+	unsigned int i;
+    int nCols;
+	static	TeTable t;
+
+	int portalCol = gridToPortalColVector_[col];
+	TeAttributeList attrList;
+	
+	nCols = 0;
+	for (i = 0; i < tableVector_.size(); ++i)
+	{
+		attrList = tableVector_[i].attributeList();
+		nCols += attrList.size();
+		if (portalCol < nCols)
+			break;				
+	}
+	if(i == tableVector_.size())
+		return t;
+	return tableVector_[i];	
+}
+
+TeTable& TeQtGrid::findTable(string  colName)
+{
+	int	i;
+	for(i=0; i<numCols(); i++)
+	{
+		string cname = horizontalHeader()->label(i).latin1();
+		if(cname == colName)
+			break;
+	}
+	return findTable(i);
+}
+
+
+void TeQtGrid::setVerticalEdition(bool flag)
+{
+	verticalEdition_ = flag;				
+}
+
+bool TeQtGrid::writeCell()
+{
+	string	val;
+	QString qs;
+	unsigned int i;
+
+	if(rowToEdit_ == -1 || colToEdit_ == -1)
+		return false;
+
+	int portalRowToEdit = gridToPortalRowVector_[rowToEdit_];
+	int portalColToEdit = gridToPortalColVector_[colToEdit_];
+	endEdit(rowToEdit_, colToEdit_, true, false);
+
+	int col = gridToPortalColVector_[colToEdit_];
+	if(isIndex(col))
+		return false;
+
+	string colName = horizontalHeader()->label(colToEdit_).latin1();
+	qs = text(rowToEdit_, colToEdit_);
+//	if(qs.isEmpty() && db_->dbmsName() == "Ado")
+//		return false;
+	if(qs.isEmpty() == false)
+		val = qs.latin1();
+
+	TeAttributeList	attrList = portal_->AttributeList();
+	TeAttrDataType type = attrList[portalColToEdit].rep_.type_;
+
+	if (portal_->fetchRow(portalRowToEdit) == false)
+		return false;
+
+	TeWaitCursor wait;
+	TeTable& tableToEdit = findTable(colToEdit_);
+	string tableName = tableToEdit.name();
+	string linkName;
+	if(tableToEdit.tableType() == TeAttrStatic || tableToEdit.tableType() == TeAttrEvent)
+		linkName = tableToEdit.linkName();
+	else
+		linkName = tableToEdit.uniqueName();
+
+	i = linkName.find(".");
+	if(i == string::npos)
+		linkName = tableName + "." + linkName;
+
+	string id = portal_->getData(linkName);
+
+	string qString = "UPDATE " + tableName;
+	if(val.empty())
+	{
+		qString += " SET " + colName + " = null";
+		qString += " WHERE " + linkName + " = '" + id + "'";
+	}
+	else
+	{
+		if (type == TeSTRING)
+		{
+			qString += " SET " + colName + " = '" + val;
+			qString += "' WHERE " + linkName + " = '" + id + "'";
+		}
+		else
+		{
+			qString += " SET " + colName + " = " + val;
+			qString += " WHERE " + linkName + " = '" + id + "'";
+		}
+	}
+
+	if (db_->execute(qString) == false)
+		return false;
+
+	if (db_->dbmsName() != "Ado")
+		arrangeGridToPortalRowVector(col);
+
+	return true;
+}
+
+
+void TeQtGrid::editNextRow()
+{
+	if (rowToEdit_ < numRows()-1)
+		++rowToEdit_;
+	else
+	{
+		rowToEdit_ = 0;
+		editNextColumn();
+	}
+}
+
+
+void TeQtGrid::editNextColumn()
+{
+	bool editavel = false;
+	while(editavel == false)
+	{
+		if (colToEdit_ == numCols()-1)
+		{
+			colToEdit_ = 0;
+			if (rowToEdit_ == numRows()-1)
+				rowToEdit_ = 0;
+			else
+				++rowToEdit_;
+		}
+		else
+			++colToEdit_;
+
+		int col = gridToPortalColVector_[colToEdit_];
+		if(isIndex(col))
+			editavel = false;
+		else
+			editavel = true;
+	}
+}
+
+void TeQtGrid::goToEditNewCell()
+{
+	int	x = contentsX();
+	int y = contentsY();
+
+	if(verticalEdition_ == true)
+		editNextRow();
+	else
+		editNextColumn();
+
+	if(rowToEdit_ >= fLine_)
+		y = rowPos(iLine_+1);
+	if(colToEdit_ >= fCol_)
+		x = columnPos(iCol_+1);
+
+	setContentsPos(x, y);
+	refresh();
+
+	int i = currEditRow();
+	int j = currEditCol();
+	if(i != rowToEdit_ || j != colToEdit_)
+	{
+		if(i > 0 && j > 0)
+			endEdit(i, j, true, true);
+		setEditMode(QTable::Editing, rowToEdit_, colToEdit_);
+		beginEdit(rowToEdit_, colToEdit_, false);
+	}
+}
+
+void TeQtGrid::removeQueryColorSlot()
+{
+	TeWaitCursor wait;
+
+	set<string> drawSet;
+	map<string, int>::iterator uit;
+
+	map<string, ObjectInfo>::iterator oit;
+	for(oit =  objectMap_.begin(); oit != objectMap_.end(); oit++)
+	{
+		ObjectInfo& info = oit->second;
+		if(info.status_ & 0x2)
+		{
+			for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+				uit->second &= 0x1;
+			info.status_ &= 0x1;
+			drawSet.insert(oit->first);
+		}
+	}
+
+	clearSelection(true);
+	refresh();
+	string s = "UPDATE " + theme_->collectionTable();
+	s += " SET c_object_status = 0 WHERE c_object_status = 2";
+	db_->execute(s);
+
+	s = "UPDATE " + theme_->collectionTable();
+	s += " SET c_object_status = 1 WHERE c_object_status = 3";
+	db_->execute(s);
+
+	s = "UPDATE " + theme_->collectionAuxTable();
+	s += " SET grid_status = 0 WHERE grid_status = 2";
+	db_->execute(s);
+
+	s = "UPDATE " + theme_->collectionAuxTable();
+	s += " SET grid_status = 1 WHERE grid_status = 3";
+	db_->execute(s);
+
+	emit putColorOnObject(theme_, drawSet);
+}
+
+
+void TeQtGrid::removePointingColorSlot()
+{
+	TeWaitCursor wait;
+
+	set<string> drawSet;
+	map<string, int>::iterator uit;
+
+	map<string, ObjectInfo>::iterator oit;
+	for(oit =  objectMap_.begin(); oit != objectMap_.end(); oit++)
+	{
+		ObjectInfo& info = oit->second;
+		if(info.status_ & 0x1)
+		{
+			for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+				uit->second &= 0x2;
+			info.status_ &= 0x2;
+			drawSet.insert(oit->first);
+		}
+	}
+
+	clearSelection(true);
+	refresh();
+	string s = "UPDATE " + theme_->collectionTable();
+	s += " SET c_object_status = 0 WHERE c_object_status = 1";
+	db_->execute(s);
+
+	s = "UPDATE " + theme_->collectionTable();
+	s += " SET c_object_status = 2 WHERE c_object_status = 3";
+	db_->execute(s);
+
+	s = "UPDATE " + theme_->collectionAuxTable();
+	s += " SET grid_status = 0 WHERE grid_status = 1";
+	db_->execute(s);
+
+	s = "UPDATE " + theme_->collectionAuxTable();
+	s += " SET grid_status = 2 WHERE grid_status = 3";
+	db_->execute(s);
+
+	emit putColorOnObject(theme_, drawSet);
+}
+
+
+void TeQtGrid::scrollToNextPointedObjectSlot()
+{
+	TeWaitCursor wait;
+
+	int	rowpos, portalpos, nrows = numRows();
+	int	x, y;
+	string oid, uid;
+
+	x = contentsX();
+	y = contentsY();
+	rowpos = rowAt(y);
+
+	if(rowpos == numRows() - 1)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+	rowpos++;
+
+	while(rowpos < nrows)
+	{
+		portalpos = gridToPortalRowVector_[rowpos];
+		portal_->fetchRow(portalpos);
+
+		oid = portal_->getData(objectIdPos_);
+		uid = portal_->getData(uniqueIdPos_);
+
+		ObjectInfo& info = objectMap_[oid];
+		int status = info.status_;
+		if(uid.empty() == false)
+			status = info.uniqueMap_[uid];
+
+
+		if (status & 0x1)
+			break;
+		rowpos++;
+	}
+
+
+	if (rowpos == nrows)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+
+	y = rowPos(rowpos);
+	setContentsPos (x, y);
+
+	clearSelection(true);
+	refresh();
+}
+
+
+void TeQtGrid::scrollToPrevPointedObjectSlot()
+{
+	TeWaitCursor wait;
+
+	int	rowpos, portalpos;
+	int	x, y;
+	string oid, uid;
+
+	x = contentsX();
+	y = contentsY();
+	rowpos = rowAt(y);
+
+	if(rowpos == 0)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+	rowpos--;
+
+	while(rowpos >= 0)
+	{
+		portalpos = gridToPortalRowVector_[rowpos];
+		portal_->fetchRow(portalpos);
+
+		oid = portal_->getData(objectIdPos_);
+		uid = portal_->getData(uniqueIdPos_);
+
+		ObjectInfo& info = objectMap_[oid];
+		int status = info.status_;
+		if(uid.empty() == false)
+			status = info.uniqueMap_[uid];
+
+		if (status & 0x1)
+			break;
+		rowpos--;
+	}
+
+
+	if (rowpos < 0)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+
+	y = rowPos(rowpos);
+	setContentsPos (x, y);
+
+	clearSelection(true);
+	refresh();
+}
+
+
+void TeQtGrid::scrollToNextQueriedObjectSlot()
+{
+	TeWaitCursor wait;
+
+	int	rowpos, portalpos, nrows = numRows();
+	int	x, y;
+	string oid, uid;
+
+	x = contentsX();
+	y = contentsY();
+	rowpos = rowAt(y);
+
+	if(rowpos == numRows() - 1)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+	rowpos++;
+
+	while(rowpos < nrows)
+	{
+		portalpos = gridToPortalRowVector_[rowpos];
+		portal_->fetchRow(portalpos);
+
+		oid = portal_->getData(objectIdPos_);
+		uid = portal_->getData(uniqueIdPos_);
+
+		ObjectInfo& info = objectMap_[oid];
+		int status = info.status_;
+		if(uid.empty() == false)
+			status = info.uniqueMap_[uid];
+
+		if (status & 0x2)
+			break;
+		rowpos++;
+	}
+
+
+	if (rowpos == nrows)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+
+	y = rowPos(rowpos);
+	setContentsPos (x, y);
+
+	clearSelection(true);
+	refresh();
+}
+
+
+void TeQtGrid::scrollToPrevQueriedObjectSlot()
+{
+	TeWaitCursor wait;
+
+	int	rowpos, portalpos;
+	int	x, y;
+	string oid, uid;
+
+	x = contentsX();
+	y = contentsY();
+	rowpos = rowAt(y);
+
+	if(rowpos == 0)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+	rowpos--;
+
+	while(rowpos >= 0)
+	{
+		portalpos = gridToPortalRowVector_[rowpos];
+		portal_->fetchRow(portalpos);
+
+		oid = portal_->getData(objectIdPos_);
+		uid = portal_->getData(uniqueIdPos_);
+
+		ObjectInfo& info = objectMap_[oid];
+		int status = info.status_;
+		if(uid.empty() == false)
+			status = info.uniqueMap_[uid];
+
+		if (status & 0x2)
+			break;
+		rowpos--;
+	}
+
+
+	if (rowpos < 0)
+	{
+		wait.resetWaitCursor();
+		return;
+	}
+
+	y = rowPos(rowpos);
+	setContentsPos (x, y);
+
+	clearSelection(true);
+	refresh();
+}
+
+void TeQtGrid::invertSelectionSlot()
+{
+	TeWaitCursor wait;
+
+	set<string> drawSet;
+	map<string, int>::iterator uit;
+	string oid, uid;
+
+	map<string, ObjectInfo>::iterator oit;
+	for(oit =  objectMap_.begin(); oit != objectMap_.end(); oit++)
+	{
+		ObjectInfo& info = oit->second;
+		if(info.status_ & 0x2)	//queried object -> sets it to selected
+		{
+			for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+				uit->second &= 0x1;
+			info.status_ &= 0x1;
+			for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+				uit->second |= 0x1;
+			info.status_ |= 0x1;
+		}
+		for(uit = info.uniqueMap_.begin(); uit != info.uniqueMap_.end(); uit++)
+			uit->second ^= 0x1;
+		info.status_ ^= 0x1;			 
+		drawSet.insert(oit->first);
+	}
+	refresh();
+	if (saveObjectStatus(theme_, drawSet, objectMap_) == false)
+	{
+		QMessageBox::critical(this, tr("Error"),
+			tr("Fail to update the \"c_legend_result\" and \"grid_status\" fields in the collection table!"));
+		return;
+	}
+	emit putColorOnObject(theme_, drawSet);
+}
+
+bool TeQtGrid::getVisColumn(int col)
+{
+	if(col < (int)gridColVisVector_.size())
+		return gridColVisVector_[col];
+	return false;
+}
+
+
+bool TeQtGrid::isIndex(int col) // portal column
+{
+	unsigned int i;
+	string cname = portal_->getAttribute(col).rep_.name_;
+
+	if(cname.find(".") == string::npos)
+	{
+		TeAttributeList attrList;		
+		int nCols = 0;
+		for (i = 0; i < tableVector_.size(); ++i)
+		{
+			attrList = tableVector_[i].attributeList();
+			nCols += attrList.size();
+			if (col < nCols)
+				break;				
+		}
+		
+		if(i>0)
+			cname.insert(0, tableVector_[(i-1)].name() + ".");
+	}
+
+	for(i=0; i<indexVector_.size(); i++)
+	{
+		string s = indexVector_[i];
+		if(s.find(cname, string::npos) != string::npos)
+			return true;
+	}
+	return false;
+}
+
+bool TeQtGrid::isDateTimeRegistered(int col) // portal column
+{
+	string cname = portal_->getAttribute(col).rep_.name_;
+	TeTable& t = findTable(cname);
+	string name = cname;
+	int f = name.find(".");
+	if(f >= 0)
+		name.erase(0, f+1);
+	if(t.attInitialTime() == name || t.attFinalTime() == name)
+		return true;
+	return false;
+}
+
+bool TeQtGrid::isSortBy(int col) // portal column
+{
+	string cname = portal_->getAttribute(col).rep_.name_;
+	cname += " ";
+
+	if(orderBy_.find(cname, string::npos) == string::npos)
+		return false;
+	return true;
+}
+
+bool TeQtGrid::isExternalTable(int col) // portal column
+{
+	unsigned int c;
+	for(c=0; c<gridToPortalColVector_.size(); c++)
+	{
+		if(gridToPortalColVector_[c] == col)
+			break;
+	}
+
+	TeTable& T = findTable(c);
+	if(T.tableType() == TeAttrExternal)
+		return true;
+	else
+		return false;
+}
+
+string TeQtGrid::getObject(int row)
+{
+	int portalpos = gridToPortalRowVector_[row];
+	portal_->fetchRow(portalpos);
+
+	string oid = portal_->getData(objectIdPos_);
+	return oid;
+}
+
+void TeQtGrid::gridInformation()
+{
+	if(showGridInformation_ == false)
+		return;
+
+	int orows = 0, opointed = 0, oqueried = 0, opqs = 0;
+	int pointed = 0, queried = 0, pqs = 0;
+	int rows = numRows();
+	map<string, ObjectInfo>::iterator it = objectMap_.begin();
+
+	while (it != objectMap_.end())
+	{
+		orows++;
+		ObjectInfo& info = it->second;
+		int leg_res = info.status_;
+		if(leg_res == 1)
+			opointed++;
+		else if(leg_res == 2)
+			oqueried++;
+		else if(leg_res == 3)
+		{
+			opointed++;
+			oqueried++;
+			opqs++;
+		}
+
+		map<string, int> uMap = info.uniqueMap_;
+		if(uMap.size())
+		{
+			map<string, int>::iterator uit = uMap.begin();
+			while(uit != uMap.end())
+			{
+				int gStatus = uit->second;
+				if(gStatus == 1)
+					pointed++;
+				else if(gStatus == 2)
+					queried++;
+				else if(gStatus == 3)
+				{
+					pointed++;
+					queried++;
+					pqs++;
+				}
+				uit++;
+			}
+		}
+		it++;
+	}
+
+	string sorows = Te2String(orows);
+	string sopointed = Te2String(opointed);
+	string soqueried = Te2String(oqueried);
+	string sopqs = Te2String(opqs);
+	string srows = Te2String(rows);
+	string spointed = Te2String(pointed);
+	string squeried = Te2String(queried);
+	string spqs = Te2String(pqs);
+
+	if(orows != rows || opointed != pointed || oqueried != queried || opqs != pqs)
+	{
+		sorows += "/" + srows;
+		sopointed += "/" + spointed;
+		soqueried += "/" + squeried;
+		sopqs += "/" + spqs;
+	}
+
+	QString msg = tr("Number of Rows:") + " " + sorows.c_str() + ", " + tr("Pointed:") + " " + sopointed.c_str();
+	msg += ", " + tr("Queried:") + " " + soqueried.c_str() + ", " + tr("Pointed and Queried:") + " " + sopqs.c_str();
+	emit displayGridInformation(msg);
+}
+
+void TeQtGrid::endEdit(int row, int col, bool accept, bool replace)
+{
+	if(accept && replace)
+		writeCell();
+	else
+		QTable::endEdit(row, col, accept, replace);
+}
+
+
+void TeQtGrid::columnWidthChanged(int col)
+{
+	if(doRepaint_)
+		refresh();
+	QTable::columnWidthChanged(col);
+}
+
+void TeQtGrid::insertObjectIntoCollection(string newId, string newTId)
+{
+	doRepaint_ = false;
+	ObjectInfo	info;
+
+	string oid = newId;
+	string uid = newId;
+	if(newTId.empty() == false)
+	{
+		uid += newTId;
+		info.uniqueMap_[uid] = 1;
+		unique2ObjectMap_[uid] = oid;
+	}
+	else
+	{
+		info.uniqueMap_[oid] = 1;
+		unique2ObjectMap_[oid] = oid;
+	}
+
+	info.status_ = 1;
+	objectMap_[oid] = info;
+
+	portalRow2UniqueIdVector_.push_back(uid);
+
+	int numRows = portalRow2UniqueIdVector_.size();
+	gridToPortalRowVector_.push_back(numRows - 1);
+	doRepaint_ = true;
+	setNumRows(numRows);
+}
+
+void TeQtGrid::deletePointedLines()
+{
+	doRepaint_ = false;
+	unsigned int	i, j;
+	string oid, uid;
+	vector<string> oidVec;
+	map<string, vector<string> > uidMap;
+
+	map<string, ObjectInfo>::iterator it = objectMap_.begin();
+	while(it != objectMap_.end())
+	{
+		ObjectInfo	info = (*it).second;
+		if(info.status_ == 1 || info.status_ == 3)
+		{
+			oid = (*it).first;
+			uid.clear();
+			map<string, int>::iterator uit = info.uniqueMap_.begin();
+			vector<string> uidVec;
+			while(uit != info.uniqueMap_.end())
+			{
+				if((*uit).second == 1 || (*uit).second == 3)
+				{
+					uid = (*uit).first;
+					uidVec.push_back(uid);
+				}
+				uit++;
+			}
+
+			if(uidVec.size() == 0)
+			{
+				uidVec.push_back(oid);
+			}
+			uidMap[oid] = uidVec;
+			oidVec.push_back(oid);
+		}
+		it++;
+	}
+
+	vector<string> iVec;
+	for(i=0; i<oidVec.size(); i++)
+	{
+		oid = oidVec[i];
+		ObjectInfo&	info = objectMap_[oid];
+		vector<string> uidVec = uidMap[oid];
+
+		for(j=0; j<uidVec.size(); j++)
+		{
+			string s = uidVec[j];
+			iVec.push_back(s);
+			info.uniqueMap_.erase(s);
+			unique2ObjectMap_.erase(s);
+		}
+		if(info.uniqueMap_.size() == 0)
+			objectMap_.erase(oid);
+	}
+
+	vector<int> jVec;
+	vector<string> copy1(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end());
+	portalRow2UniqueIdVector_.clear();
+	for(i=0; i<copy1.size(); i++)
+	{
+		string ps = copy1[i];
+		for(j=0; j<iVec.size(); j++)
+		{
+			string s = iVec[j];
+			if(ps == s)
+			{
+				jVec.push_back(i);
+				break;
+			}
+		}
+		if(j == iVec.size())
+			portalRow2UniqueIdVector_.push_back(ps);
+	}
+
+	vector<int> copy2(gridToPortalRowVector_.begin(), gridToPortalRowVector_.end());
+	gridToPortalRowVector_.clear();
+	for(i=0; i<copy2.size(); i++)
+	{
+		int ps = copy2[i];
+		for(j=0; j<jVec.size(); j++)
+		{
+			int s = jVec[j];
+			if(ps == s)
+				break;
+		}
+		if(j == jVec.size())
+			gridToPortalRowVector_.push_back(ps);
+	}
+
+	for(i=jVec.size()-1; (int)i>=0; i--)
+	{
+		int s = jVec[i];
+		for(j=0; j<gridToPortalRowVector_.size(); j++)
+		{
+			int ss = gridToPortalRowVector_[j];
+			if(ss >= s)
+				gridToPortalRowVector_[j] = ss - 1;
+		}
+	}
+
+	int numRows = portalRow2UniqueIdVector_.size();
+	doRepaint_ = true;
+	setNumRows(numRows);
+}
+
+bool TeQtGrid::hasPointedLine()
+{
+	map<string, ObjectInfo>::iterator it = objectMap_.begin();
+
+	while(it != objectMap_.end())
+	{
+		ObjectInfo	info = (*it).second;
+		if(info.status_ == 1 || info.status_ == 3)
+			return true;
+		it++;
+	}
+
+	return false;
+}
+
+void TeQtGrid::goToLastLine()
+{
+	int nRows = numRows();
+	int iniRow = nRows - visibleLines_;
+
+	doRepaint_ = true;
+	int x = columnAt(gridX_);
+	int y = rowPos(iniRow);
+	setContentsPos(x, y);
+	refresh();
+}
+
+void TeQtGrid::goToLastColumn()
+{
+	int x = contentsWidth() - visibleWidth();
+
+	doRepaint_ = true;
+	int y = contentsY();
+	setContentsPos(x, y);
+	refresh();
+}
+
+vector<int> TeQtGrid::getSelectedColumns()
+{
+	int i, j;
+	vector<int> colVec;
+
+	for (i = 0; i < numCols(); i++)
+	{
+		if(gridColVisVector_[i])
+		{
+			if (isColumnSelected(i, true) == true)
+			{
+				j = gridToPortalColVector_[i];
+				colVec.push_back(j);
+			}
+		}
+	}
+	return colVec;
+}
+
+void TeQtGrid::arrangeColumns(TeAttrTableVector cTableVec)
+{
+	int	i, j, k, m;
+	TeAttributeList CAL;
+	TeAttributeList	AL;
+	vector<int> cVec;
+
+	for(i=m=0; (unsigned int)i<cTableVec.size(); i++)
+	{
+		TeTable ct = cTableVec[i];
+		CAL = ct.attributeList();
+
+		TeTable t = tableVector_[i];
+		AL = t.attributeList();
+
+		if(AL.size() > CAL.size())
+		{
+			for(j=0; (unsigned int)j<AL.size(); j++, m++)
+			{
+				TeAttribute a = AL[j];
+				for(k=0; (unsigned int)k<CAL.size(); k++)
+				{
+					TeAttribute ca = CAL[k];
+					if(TeConvertToUpperCase(a.rep_.name_) == TeConvertToUpperCase(ca.rep_.name_))
+						break;
+				}
+				if((unsigned int)k == CAL.size())
+					cVec.push_back(m);
+			}
+		}
+		else if(AL.size() < CAL.size())
+		{
+			for(j=0; (unsigned int)j<CAL.size(); j++, m++)
+			{
+				TeAttribute a = CAL[j];
+				for(k=0; (unsigned int)k<AL.size(); k++)
+				{
+					TeAttribute ca = AL[k];
+					if(TeConvertToUpperCase(a.rep_.name_) == TeConvertToUpperCase(ca.rep_.name_))
+						break;
+				}
+				if((unsigned int)k == AL.size())
+					cVec.push_back(m);
+			}
+		}
+		else
+			m += (int)AL.size();
+	}
+
+	TeAttributeList attrList = portal_->AttributeList();
+	int nCols = numCols();
+	int nOldCols = gridColVisVector_.size();
+	vector<bool> cVisVec(gridColVisVector_.begin(), gridColVisVector_.end());
+	vector<int> cSwapVec(gridToPortalColVector_.begin(), gridToPortalColVector_.end());
+	gridColVisVector_.clear();
+	gridToPortalColVector_.clear();
+
+	bool added = false;
+	if(nCols > nOldCols)
+		added = true;
+
+	std::sort(cVec.begin(), cVec.end());
+	if(cVec.size())
+	{
+		if(added)
+		{
+			for(i=nOldCols; i<nCols; i++)
+				cVisVec.push_back(true);
+			gridColVisVector_ = vector<bool>(cVisVec.begin(), cVisVec.end());
+
+			for(i=0; (unsigned int)i<cVec.size(); i++)
+			{
+				k = cVec[i];
+				for(j=0; (unsigned int)j<cSwapVec.size(); j++)
+				{
+					int v = cSwapVec[j];
+					if(v >= k)
+						cSwapVec[j] = v + 1;
+				}
+				cSwapVec.push_back(k);
+			}
+			gridToPortalColVector_ = vector<int>(cSwapVec.begin(), cSwapVec.end());
+		}
+		else
+		{
+			for(i=j=0; (unsigned int)i<cVec.size(); i++)
+			{
+				k = cVec[i];
+				while(j < k)
+				{
+					bool b = cVisVec[j];
+					gridColVisVector_.push_back(b);
+					j++;
+				}
+				j = k + 1;
+			}
+			while((unsigned int)j < cVisVec.size())
+			{
+				bool b = cVisVec[j];
+				gridColVisVector_.push_back(b);
+				j++;
+			}
+
+			for(i=0; (unsigned int)i<cVec.size(); i++)
+			{
+				k = cVec[i];
+				for(j=0; (unsigned int)j<cSwapVec.size(); j++)
+				{
+					int kk = cSwapVec[j];
+					if(kk != k)
+						gridToPortalColVector_.push_back(kk);
+				}
+				cSwapVec.clear();
+				cSwapVec = vector<int>(gridToPortalColVector_.begin(), gridToPortalColVector_.end());
+				gridToPortalColVector_.clear();
+			}
+
+			for(i = (int)cVec.size() - 1; i>=0; i--)
+			{
+				k = cVec[i];
+				for(j=0; (unsigned int)j<cSwapVec.size(); j++)
+				{
+					int v = cSwapVec[j];
+					if(v >= k)
+						cSwapVec[j] = v - 1;
+				}
+			}
+			gridToPortalColVector_ = vector<int>(cSwapVec.begin(), cSwapVec.end());
+		}
+	}
+	else
+	{
+		// Set the vector that will contain the order the
+		// grid columns will be shown
+		gridToPortalColVector_.clear();
+		gridColVisVector_.clear();
+		for (i = 0; i < nCols; i++)
+		{
+			gridToPortalColVector_.push_back(i);
+			gridColVisVector_.push_back(true);
+		}
+	}
+}
+
+void TeQtGrid::arrangeGridToPortalRowVector(int col)
+{
+	int i, p, pp;
+	string id, s, ss;
+
+	portal_->freeResult();
+	if (!portal_->query(sql_))
+	{
+		delete portal_;
+		portal_ = 0;
+		return;
+	}
+
+	if(isSortBy(col) == false)
+		return;
+
+	vector<int> cGridToPortal(gridToPortalRowVector_.begin(), gridToPortalRowVector_.end());
+	vector<string> cPortalToUnique(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end());
+	gridToPortalRowVector_.clear();
+	portalRow2UniqueIdVector_.clear();
+
+	while (portal_->fetchRow())
+	{
+		id = portal_->getData(uniqueIdPos_);
+		if(id.empty())
+			id = portal_->getData(objectIdPos_);
+		portalRow2UniqueIdVector_.push_back(id);
+	}
+
+	vector<string>::iterator it;
+	for(i=0; (unsigned int)i<cGridToPortal.size(); i++)
+	{
+		p = cGridToPortal[i];
+		s = cPortalToUnique[p];
+		ss = portalRow2UniqueIdVector_[p];
+		if(s == ss)
+			gridToPortalRowVector_.push_back(p);
+		else
+		{
+			it = std::find(portalRow2UniqueIdVector_.begin(), portalRow2UniqueIdVector_.end(), s);
+			if(it != portalRow2UniqueIdVector_.end())
+				pp = it - portalRow2UniqueIdVector_.begin();
+
+			gridToPortalRowVector_.push_back(pp);
+		}
+	}
+}
+
+void TeQtGridItem::paint(QPainter* p, const QColorGroup& cg,
+						 const QRect& cr, bool selected)
+{
+    QColorGroup g(cg);
+	g.setColor( QColorGroup::Base, color_);
+	QTableItem :: paint(p, g, cr, selected);
+}
+
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtGrid.h b/src/terralib/application/qt/TeQtGrid.h
new file mode 100644
index 0000000..ff89198
--- /dev/null
+++ b/src/terralib/application/qt/TeQtGrid.h
@@ -0,0 +1,251 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTGRID_H
+#define  __TERRALIB_INTERNAL_QTGRID_H
+
+#include <qwidget.h>
+#include <qtable.h>
+#include <qcolor.h> 
+#include <qlabel.h>
+#include <qpopupmenu.h>
+#include <vector>
+#include <map>
+#include <set>
+#include <string>
+#include "TeDatabase.h"
+#include "TeThemeApplication.h"
+#include "TeApplicationUtils.h"
+
+using namespace std;
+
+class TeQtGrid : public QTable
+{
+	Q_OBJECT
+
+protected:
+	TeDatabase				*db_;
+	TeThemeApplication		*theme_;
+	TeDatabasePortal		*portal_;
+	string					sqlJoin_;
+	string					orderBy_;
+	string					sql_;
+	string					CT_;
+	string					CTE_;
+	vector<string>			indexVector_;
+	vector<TeTable>			tableVector_;
+	bool					editing_;
+	bool					doRefresh_;
+	bool					doRepaint_;
+	bool					shiftKeyPressed_;
+	bool					showGridInformation_;
+	int						uniqueIdPos_;
+	int						objectIdPos_;
+	int						resultIdPos_;
+	int						gridStatusPos_;
+	int						gridX_, gridY_;
+	int						iLine_, fLine_;
+	int						iCol_, fCol_;
+	int						gridWidth_, gridHeight_;
+	int						visibleLines_, visibleCols_;
+	long					lastLinePressed_;
+	long					dragLineReleased_;
+	map<string, ObjectInfo>	objectMap_;
+	map<string, string>		unique2ObjectMap_;
+	vector<int>				gridToPortalRowVector_;
+	vector<int>				gridToPortalColVector_;
+	vector<bool>			gridColVisVector_;
+	vector<string>			portalRow2UniqueIdVector_;
+	int						rowToEdit_;
+	int						colToEdit_;
+	bool					verticalEdition_;
+	QPopupMenu				*popupHorizHeader_;
+	QPopupMenu				*popupVertHeader_;
+	QPopupMenu				*popupViewport_;
+	bool					columnDragEnabled_;
+	bool					mousePressedOnHorizontalHeader_;
+
+	virtual bool eventFilter(QObject*, QEvent*);
+
+	virtual void drawContents (QPainter *qp, int clipx, int clipy,
+							   int clipw, int cliph);
+
+	void sort(vector<int> cols, string order);
+
+	bool writeCell();
+
+	void editNextRow();
+
+	void editNextColumn();
+	
+	void update();
+
+	void goToEditNewCell();
+
+	virtual void endEdit(int row, int col, bool accept, bool replace);
+
+	void arrangeColumns(TeAttrTableVector cTableVec);
+	
+public:
+
+	bool autoPromote_;
+
+	TeQtGrid (QWidget* parent = 0, const char* name = 0);
+
+	~TeQtGrid();
+
+	void init(TeThemeApplication *theme);
+
+	void initPortal();
+
+	void updatePortalContents();
+
+	QPopupMenu* popupHorizHeader()
+		{ return popupHorizHeader_; }
+
+	QPopupMenu* popupVertHeader()
+		{ return popupVertHeader_; }
+
+	QPopupMenu* popupViewport()
+		{ return popupViewport_; }
+
+	TeDatabasePortal* getPortal()
+		{ return portal_; }
+	TeThemeApplication* getTheme() 
+    {  return theme_;} 
+
+
+	bool isIndex(int col);
+
+	bool isDateTimeRegistered(int col);
+
+	bool isSortBy(int col);
+
+	bool isExternalTable(int col);
+
+	TeTable& findTable(int col);
+
+	TeTable& findTable(string colName);
+
+	void adjustColumns();
+
+	void swapColumns(int col1 = -1, int col2 = -1);
+
+	int	getColumn(int col) {return gridToPortalColVector_[col];}
+
+	void setVisColumn (bool vis, int col=-1);
+
+	bool getVisColumn (int col);
+
+	void putColorOnGrid(set<string> uniqueIdSet, set<string> objectIdSet, string operation, string attrQuery = "");
+
+	void setVerticalEdition(bool flag);
+
+	void refresh();
+
+	void clear();
+
+	void clearPortal();
+
+	string	getObject(int row);
+
+	bool isVerticalEdition() { return verticalEdition_; }
+
+	bool showGridInformation() { return showGridInformation_;}
+
+	void showGridInformation(bool b) { showGridInformation_ = b;}
+
+	void gridInformation ();
+
+	void insertObjectIntoCollection(string newId, string newTId = "");
+
+	void goToLastLine();
+
+	void goToLastColumn();
+
+	bool hasPointedLine();
+
+	void deletePointedLines();
+
+	vector<int> getSelectedColumns();
+
+	void arrangeGridToPortalRowVector(int col);
+
+public slots:
+	void mouseReleasedOnVerticalHeaderSlot(int lin);
+
+	void promotePointedObjectsSlot();
+
+	void promoteQueriedObjectsSlot();
+
+	void sortAscOrderSlot();
+
+	void sortDescOrderSlot();
+
+	void removeQueryColorSlot();
+
+	void removePointingColorSlot();
+
+	void scrollToPrevPointedObjectSlot();
+
+	void scrollToNextPointedObjectSlot();
+
+	void scrollToPrevQueriedObjectSlot();
+
+	void scrollToNextQueriedObjectSlot();
+
+	void invertSelectionSlot();
+
+protected slots:
+	void columnWidthChanged(int col);
+
+signals:
+	void putColorOnObject(TeThemeApplication*, set<string>&);
+	void horizHeaderSignal(int);
+	void vertHeaderSignal(int);
+	void viewportSignal();
+	void vertHeaderLeftDblClickSignal(int);
+	void linkTable(string, string, string);
+	void gridChangedSignal();
+	void displayGridInformation(QString);
+	void clearGridInformation();
+};
+
+
+
+
+class TeQtGridItem : public QTableItem
+{
+	QColor color_;
+
+public:
+    TeQtGridItem(QTable *t, EditType et, const QString &txt)
+		: QTableItem( t, et, txt )
+	{}
+
+	void setColor(QColor& c)
+	{ color_.setRgb(c.red(), c.green(), c.blue()); }
+
+    void paint(QPainter *p, const QColorGroup &cg,
+		       const QRect &cr, bool selected );
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtLatEdit.cpp b/src/terralib/application/qt/TeQtLatEdit.cpp
new file mode 100644
index 0000000..b187d97
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLatEdit.cpp
@@ -0,0 +1,131 @@
+#include <qregexp.h>
+#include <qstringlist.h> 
+#include <math.h>
+
+#include "TeQtLatEdit.h"
+
+TeQtLatEdit::TeQtLatEdit(QWidget* parent, const char *name)
+	:QLineEdit(parent, name)
+{}
+
+bool
+TeQtLatEdit::decode(QString lado, short& dg, short& mn, float& sc, double& grauDec)
+{
+	short  	posat,lim = 90;
+
+	double	dd,pi;			
+	posat = 0;
+	pi = 4.*atan((double)1.);
+
+	// Longitude 
+	if(dg < 0 || dg > lim)	
+		return false;
+
+	if(mn < 0 || mn > 60)
+		return false;
+
+	if(sc < 0. || sc > 60.)
+		return false;
+
+	if(lado == "s" || lado == "S")
+	{
+		if(dg > 0) dg = dg * -1;
+		else if(mn > 0) mn = mn * -1;
+		     else sc = sc * -1.;
+	}
+
+	dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+	if (dg < 0 || mn < 0 || (int)sc < 0)
+		dd = -dd;
+
+//	dd = dd*pi/180.;
+	grauDec = dd;
+	return true;
+}
+
+
+void TeQtLatEdit::focusOutEvent( QFocusEvent *e )
+{
+	int mat;
+    QString str = text();
+	QStringList myList;
+	QRegExp exp1("^[nNsS][ ]\\d\\d?\\d?[ ]?\\d?\\d?[ ]?\\d?\\d?\\.?[0-9]?" );
+	QRegExp exp2("^[nNsS][;]\\d\\d?\\d?[;]?\\d?\\d?[;]?\\d?\\d?\\.?[0-9]?" ); 
+	QRegExp exp3("^[nNsS][:]\\d\\d?\\d?[:]?\\d?\\d?[:]?\\d?\\d?\\.?[0-9]?" ); 
+	QRegExp exp4("^[+-]?\\d\\d?\\d?\\.?[0-9]?" ); 
+	QString echo_;
+
+	double grauDec;
+
+    if ( (mat=exp1.match( str )) != -1 )
+	{
+		myList = QStringList::split(" ",str);
+	}
+	else if ((mat=exp2.match( str )) != -1 )
+	{
+		myList = QStringList::split(";",str);
+	}
+	else if ((mat=exp3.match( str )) != -1 )
+	{
+		myList = QStringList::split(":",str);
+	}
+	else if ((mat=exp4.match( str )) != -1 )
+	{
+		grauDec = str.toDouble();
+		if ((grauDec >= -90.0 && grauDec <=90.0))
+		{
+			echo_.sprintf("%3.10f",grauDec);
+			setText(echo_);
+			emit coordValidator(grauDec);
+			return;
+		}
+		else
+		{
+			setSelection( 0, text().length() );
+			emit coordValidator(TeLATINVALID);
+			return;
+		}
+	}
+	else
+	{
+		setSelection( 0, text().length() );
+		emit coordValidator(TeLATINVALID);
+		return;
+	}
+
+	int nelementos = myList.count();
+	short graus, minutos = 0;
+	float segundos = 0.0;
+	
+	graus = myList[1].toShort();
+
+	if (nelementos > 2)
+		minutos = myList[2].toShort();
+	
+	if (nelementos > 3)
+		segundos = myList[3].toFloat();
+
+	bool dec = decode(myList[0],graus, minutos, segundos, grauDec);
+	if (dec)
+	{
+		echo_.sprintf("%s %d %d %2.2f",(const char*) myList[0], abs(graus), minutos, segundos);
+		setText(echo_);
+		emit coordValidator(grauDec);
+		return;
+	}
+	else
+	{
+		setSelection( 0, text().length() );
+		emit coordValidator(TeLATINVALID);
+		return;
+	}
+}
+
+void TeQtLatEdit::keyPressEvent( QKeyEvent *e )
+{
+    QLineEdit::keyPressEvent( e );
+    if ( e->key() == Key_Enter || e->key() == Key_Return )
+    {
+        emit focusOutEvent(0);
+    }
+}
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtLatEdit.h b/src/terralib/application/qt/TeQtLatEdit.h
new file mode 100644
index 0000000..2b02b2a
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLatEdit.h
@@ -0,0 +1,24 @@
+#ifndef TEQTLATEDIT_H
+#define TEQTLATEDIT_H
+
+#include <qlineedit.h>
+#include <qstring.h> 
+#include <qwidget.h>
+
+#define TeLATINVALID -99.99
+
+class TeQtLatEdit : public QLineEdit
+{
+    Q_OBJECT
+public:
+	TeQtLatEdit(QWidget * parent, const char* name);
+	bool decode(QString lado, short& dg, short& mn, float& sc, double& grauDec);
+
+protected:
+    void focusOutEvent( QFocusEvent *e );
+    void keyPressEvent( QKeyEvent *e );
+
+signals:
+    void coordValidator(const double&);
+};
+#endif
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtLayerItem.cpp b/src/terralib/application/qt/TeQtLayerItem.cpp
new file mode 100644
index 0000000..12b8c57
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLayerItem.cpp
@@ -0,0 +1,43 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtLayerItem.h>
+#include <qpixmap.h>
+#include <images/infolayer.xpm>
+
+
+//Layer item constructor
+TeQtLayerItem::TeQtLayerItem(QListViewItem *parent, 
+		QString name, TeLayer* layer)
+		: TeQtCheckListItem(parent,name), layer_(layer) 
+{
+	type_ = INFOLAYER;
+	QPixmap p(infolayer_xpm);
+	setPixmap(0,p);
+	setRenameEnabled(0,true);
+	sortChildItems(0, true);
+	setSelected(false);
+	setEnabled(true);
+}
+
+
+
+				
diff --git a/src/terralib/application/qt/TeQtLayerItem.h b/src/terralib/application/qt/TeQtLayerItem.h
new file mode 100644
index 0000000..8410d7d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLayerItem.h
@@ -0,0 +1,49 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTLAYERITEM_H
+#define  __TERRALIB_INTERNAL_QTLAYERITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeLayer;
+
+
+class TeQtLayerItem : public TeQtCheckListItem
+{
+public:
+    TeQtLayerItem(QListViewItem *parent, QString text, TeLayer* layer);
+
+	~TeQtLayerItem () {}
+
+	int compare(QListViewItem * i, int col, bool ascending) const
+		{ return QListViewItem::compare(i, col, ascending); }
+
+	QString key(int col, bool ascending) const
+		{ return QListViewItem::key(col, ascending); }
+
+	TeLayer* getLayer() {return layer_;}
+
+protected:
+	TeLayer	*layer_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtLegendItem.cpp b/src/terralib/application/qt/TeQtLegendItem.cpp
new file mode 100644
index 0000000..9167c6c
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLegendItem.cpp
@@ -0,0 +1,319 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtLegendItem.h>
+#include <TeQtViewsListView.h>
+#include <TeLegendEntry.h>
+#include <qpixmap.h>
+#include <qpainter.h>
+#include <qbitmap.h>
+#include <qimage.h>
+
+
+//Legend item constructor
+TeQtLegendItem::TeQtLegendItem(QListViewItem *parent,
+				QString text, TeLegendEntry *legendEntry)
+	: TeQtCheckListItem(parent, text), legendEntry_(legendEntry)
+{
+	type_ = LEGEND;
+	setRenameEnabled(0,true);
+	setSelected(false);
+	setEnabled(true);
+
+	order_ = parent->childCount();
+
+	if (legendEntry_ != 0)
+		createPixmap();
+}
+
+
+void TeQtLegendItem::createPixmap()
+{
+	int	ww = 21;
+	int	pixh = 16;
+	int	pixw = ww;
+
+	QPixmap	pixmap(ww, pixh);
+	pixmap.fill();
+
+// TePOLYGONS = 1, TeLINES = 2, TePOINTS = 4, TeCELLS = 256
+	bool hasPolygons = true;
+	bool hasCells = true;
+	bool hasLines = true;
+	bool hasPoints = true;
+
+	if(legendEntry_->to().find("mean = ") == string::npos)
+	{
+		TeGeomRepVisualMap vm = legendEntry_->getVisualMap();
+		if(vm.find(TePOLYGONS) == vm.end())
+		{
+			hasPolygons = false;
+			hasCells = false;
+		}
+		if(vm.find(TeLINES) == vm.end())
+			hasLines = false;
+		if(vm.find(TePOINTS) == vm.end())
+			hasPoints = false;
+
+		if ((hasPolygons || hasCells) && (hasLines == false) && (hasPoints == false))
+			drawPolygonRep(pixw, pixh, 0, &pixmap);
+		else if ((hasPolygons || hasCells) && (hasLines == true) && (hasPoints == false))
+		{
+			pixmap.resize(2*ww, pixh);
+			pixmap.fill();
+			drawPolygonRep(pixw, pixh, 0, &pixmap);
+			drawLineRep(pixw, pixh, ww, &pixmap);
+		}
+		else if ((hasPolygons || hasCells) && (hasLines == false) && (hasPoints == true))
+		{
+			pixmap.resize(2*ww, pixh);
+			pixmap.fill();
+			drawPolygonRep(pixw, pixh, 0, &pixmap);
+			drawPointRep(pixw, pixh, ww, &pixmap);
+		}
+		else if ((hasPolygons || hasCells) && (hasLines == true) && (hasPoints == true))
+		{
+			pixmap.resize(3*ww, pixh);
+			pixmap.fill();
+			drawPolygonRep(pixw, pixh, 0, &pixmap);
+			drawLineRep(pixw, pixh, ww, &pixmap);
+			drawPointRep(pixw, pixh, 2*ww, &pixmap);
+		}
+		else if (hasPolygons == false && hasCells == false && hasLines == true && hasPoints == false)
+			drawLineRep(pixw, pixh, 0, &pixmap);
+		else if (hasPolygons == false && hasCells == false && hasLines == false && hasPoints == true)
+			drawPointRep(pixw, pixh, 0, &pixmap);
+		else if (hasPolygons == false && hasCells == false && hasLines == true && hasPoints == true)
+		{
+			pixmap.resize(2*ww, pixh);
+			pixmap.fill();
+			drawLineRep(pixw, pixh, 0, &pixmap);
+			drawPointRep(pixw, pixh, ww, &pixmap);
+		}
+	}
+	setPixmap(0, pixmap);
+}
+
+
+void TeQtLegendItem::changeVisual(TeLegendEntry *legendEntry)
+{
+	legendEntry_ = legendEntry;
+	createPixmap();
+}
+
+
+void TeQtLegendItem::drawPolygonRep(int w, int h, int offset, QPixmap *pixmap)
+{
+	QPainter p(pixmap);
+	QBrush	 brush;
+	QColor	 cor;
+	TeColor	 tcor;
+	Qt::BrushStyle	style;
+
+	TeVisual& visual = legendEntry_->visual(TePOLYGONS);
+	int transp = 255 - (visual.transparency() * 255 / 100);
+	tcor = visual.color();
+	cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+	TeQtViewsListView* viewsListView = (TeQtViewsListView*) listView();
+	map<TePolyBasicType, Qt::BrushStyle>& brushMap = viewsListView->getBrushStyleMap();
+
+	style = brushMap[(TePolyBasicType)(legendEntry_->visual(TePOLYGONS).style())];
+	brush.setStyle(style);
+	brush.setColor(cor);
+
+	QRect trect(offset+1, 1, w-2, h-2);
+	QRect rect(0, 0, offset+w-1, h-1);
+
+	int width = rect.width();
+	int height = rect.height();
+
+	int r = width%8;
+	if(r)
+		width += (8-r);
+	r = height%8;
+	if(r)
+		height += (8-r);
+
+	if(width == 0)
+		width = 8;
+	if(height == 0)
+		height = 8;
+
+	QBitmap	bm;
+	bm.resize(width, height);
+	//Fill bitmap with 0-bits: clipping region
+	bm.fill(Qt::color0);
+	QPainter maskPainter(&bm);
+
+	// Draw bitmap with 1-bits: drawing region
+	QBrush bs(Qt::color1, style);
+	QPen pen(Qt::color1, 1);
+	maskPainter.setPen(pen);
+ 	maskPainter.fillRect(trect, bs);
+	maskPainter.end();
+
+	QRegion clipRegion(bm);
+	p.setClipRegion(clipRegion);
+
+	if(visual.transparency() == 0)
+		p.fillRect(trect, brush);
+	else
+	{
+		// set alpha buffer and color
+		QImage img(rect.width(), rect.height(), 32);
+		unsigned int val = (transp << 24) | (cor.red() << 16) | (cor.green() << 8) | cor.blue();
+		img.fill(val);
+		img.setAlphaBuffer(true);
+
+		// plot transparency
+		p.drawPixmap(trect.x(), trect.y(), img);
+	}
+	p.setClipping(false);
+
+	Qt::PenStyle pstyle;
+	uint		pwidth;
+
+	tcor = visual.contourColor();
+	cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+	pen.setColor(cor);
+
+	map<TeLnBasicType, Qt::PenStyle>& penMap = viewsListView->getPenStyleMap();
+	pstyle = penMap[(TeLnBasicType)(visual.contourStyle())];
+	pen.setStyle(pstyle);
+
+	pwidth = (Qt::PenStyle) visual.contourWidth();
+	pen.setWidth (pwidth);
+
+	p.setPen(pen);
+	p.drawRect (offset+1+pwidth/2,1+pwidth/2,w-2-pwidth/2,h-2-pwidth/2);
+
+	p.end();
+}
+
+void TeQtLegendItem::drawLineRep( int w, int h, int offset, QPixmap *pixmap)
+{
+	QPainter	p(pixmap);
+	QPen		pen;
+	QColor		cor;
+	TeColor		tcor;
+	Qt::PenStyle style;
+	uint		width;
+
+	TeVisual& visual = legendEntry_->visual(TeLINES);
+
+	tcor = visual.color();
+	cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+	pen.setColor(cor);
+
+	TeQtViewsListView* viewsListView = (TeQtViewsListView*) listView();
+	map<TeLnBasicType, Qt::PenStyle>& penMap = viewsListView->getPenStyleMap();
+
+	style = penMap[(TeLnBasicType)(legendEntry_->visual(TeLINES).style())];
+	pen.setStyle(style);
+
+	width = (Qt::PenStyle) legendEntry_->visual(TeLINES).width();
+	pen.setWidth (width);
+
+	p.setPen(pen);
+	p.moveTo(offset+1, h-2);
+	p.lineTo(offset+w/3, 1);
+	p.lineTo(offset+w/3*2, h-3);
+	p.lineTo(offset+w-2, 1);
+	p.end();
+}
+
+
+void TeQtLegendItem::drawPointRep( int pw, int ph, int offset, QPixmap *pixmap)
+{
+	QPainter	painter(pixmap);
+	QColor		cor;
+	TeColor		tcor;
+
+	TeVisual& visual = legendEntry_->visual(TePOINTS);
+	tcor = visual.color();
+	cor.setRgb(tcor.red_, tcor.green_, tcor.blue_);
+	int s = visual.style();
+
+	int	w = visual.size();
+	QPoint	p;
+	p.setX(offset+pw/2);
+	p.setY(ph/2-1);
+
+	painter.setPen(cor);
+	if (s == TePtTypePlus)
+	{
+		painter.drawLine (p.x()-w/2,p.y(),p.x()+w/2,p.y());
+		painter.drawLine (p.x(),p.y()-w/2,p.x(),p.y()+w/2);
+	}
+	else if (s == TePtTypeStar)
+	{
+		painter.save ();
+		painter.translate (p.x(),p.y());
+		painter.drawLine (0,-w/2,0,w/2);
+		painter.rotate (45);
+		painter.drawLine (0,-w/2,0,w/2);
+		painter.rotate (-90);
+		painter.drawLine (0,-w/2,0,w/2);
+		painter.restore ();
+	}
+	else if (s == TePtTypeCircle)
+	{
+		painter.setBrush(cor);
+		painter.drawChord (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+	}
+	else if (s == TePtTypeX)
+	{
+		painter.drawLine (p.x()-w/2,p.y()-w/2,p.x()+w/2,p.y()+w/2);
+		painter.drawLine (p.x()-w/2,p.y()+w/2,p.x()+w/2,p.y()-w/2);
+	}
+	else if (s == TePtTypeBox)
+	{
+		painter.fillRect (p.x()-w/2,p.y()-w/2,w,w,cor);
+	}
+	else if (s == TePtTypeDiamond)
+	{
+		QPointArray pa(5);
+		pa.setPoint(0, p.x()-w/2, p.y());
+		pa.setPoint(1, p.x(), p.y()-w/2);
+		pa.setPoint(2, p.x()+w/2, p.y());
+		pa.setPoint(3, p.x(), p.y()+w/2);
+ 		pa.setPoint(4, p.x()-w/2, p.y());
+		painter.setBrush(cor);
+		painter.drawPolygon(pa);
+	}
+	else if (s == TePtTypeHollowCircle)
+	{
+		painter.drawArc (p.x()-w/2,p.y()-w/2,w,w,0,360*16);
+	}
+	else if (s == TePtTypeHollowBox)
+	{
+		painter.setBrush(Qt::NoBrush);
+		painter.drawRect (p.x()-w/2,p.y()-w/2,w,w);
+	}
+	else if (s == TePtTypeHollowDiamond)
+	{
+		painter.drawLine (p.x()-w/2,p.y(),p.x(),p.y()-w/2);
+		painter.drawLine (p.x(),p.y()-w/2,p.x()+w/2,p.y());
+		painter.drawLine (p.x()+w/2,p.y(),p.x(),p.y()+w/2);
+		painter.drawLine (p.x(),p.y()+w/2,p.x()-w/2,p.y());
+	}
+	painter.end();
+}
diff --git a/src/terralib/application/qt/TeQtLegendItem.h b/src/terralib/application/qt/TeQtLegendItem.h
new file mode 100644
index 0000000..a21ba3f
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLegendItem.h
@@ -0,0 +1,71 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTLEGENDITEM_H
+#define  __TERRALIB_INTERNAL_QTLEGENDITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeLegendEntry;
+
+
+class TeQtLegendItem : public TeQtCheckListItem
+{
+public:
+    TeQtLegendItem(QListViewItem *parent, QString text, TeLegendEntry *legendEntry);
+
+	~TeQtLegendItem() {}
+
+	TeLegendEntry* legendEntry()
+		{ return legendEntry_; }
+
+	void changeVisual(TeLegendEntry *legendEntry);
+
+protected:
+	TeLegendEntry *legendEntry_;
+
+	void createPixmap();
+
+	void drawPolygonRep(int w, int h, int offset, QPixmap *pixmap);
+
+	void drawLineRep(int w, int h, int offset, QPixmap *pixmap);
+
+	void drawPointRep(int w, int h, int offset, QPixmap *pixmap);
+};
+
+
+class TeQtLegendTitleItem : public TeQtCheckListItem
+{
+public:
+    TeQtLegendTitleItem(QListViewItem *parent, QString text)
+	: TeQtCheckListItem(parent, text)
+	{
+		type_ = LEGENDTITLE;
+		setRenameEnabled(0,true);
+		order_ = parent->childCount();
+	}
+
+	~TeQtLegendTitleItem() {}
+};
+
+
+
+#endif
diff --git a/src/terralib/application/qt/TeQtLongEdit.cpp b/src/terralib/application/qt/TeQtLongEdit.cpp
new file mode 100644
index 0000000..12be58b
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLongEdit.cpp
@@ -0,0 +1,130 @@
+#include <qregexp.h>
+#include <qstringlist.h> 
+#include <math.h>
+
+#include "TeQtLongEdit.h"
+
+TeQtLongEdit::TeQtLongEdit(QWidget * parent, const char *name)
+	:QLineEdit(parent, name)
+{}
+
+bool
+TeQtLongEdit::decode(QString lado, short& dg, short& mn, float& sc, double& grauDec)
+{
+	short  	posat,lim = 180;
+
+	double	dd,pi;			
+	posat = 0;
+	pi = 4.*atan((double)1.);
+
+	// Longitude 
+	if(dg < 0 || dg > lim)	
+		return false;
+
+	if(mn < 0 || mn > 60)
+		return false;
+
+	if(sc < 0. || sc > 60.)
+		return false;
+
+	if(lado == "W" || lado == "w"|| lado == "O"|| lado == "o")
+	{
+		if(dg > 0) dg = dg * -1;
+		else if(mn > 0) mn = mn * -1;
+		     else sc = sc * -1.;
+	}
+
+	dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+	if (dg < 0 || mn < 0 || (int)sc < 0)
+		dd = -dd;
+
+//	dd = dd*pi/180.;
+	grauDec = dd;
+	return true;
+}
+
+
+void TeQtLongEdit::focusOutEvent( QFocusEvent *e )
+{
+	int mat;
+    QString str = text();
+	QStringList myList;
+	QRegExp exp1("^[oOwWeElL][ ]\\d\\d?\\d?[ ]?\\d\\d?[ ]?\\d?\\d?\\.?[0-9]?" );
+	QRegExp exp2("^[oOwWeElL][;]\\d\\d?\\d?[;]?\\d\\d?[;]?\\d?\\d?\\.?[0-9]?" ); 
+	QRegExp exp3("^[oOwWeElL][:]\\d\\d?\\d?[:]?\\d\\d?[:]?\\d?\\d?\\.?[0-9]?" ); 
+	QRegExp exp4("^[+-]?\\d\\d?\\d?\\.?[0-9]?" ); 
+
+	double grauDec;
+	QString echo_;
+
+    if ( (mat=exp1.match( str )) != -1 )
+	{
+		myList = QStringList::split(" ",str);
+	}
+	else if ((mat=exp2.match( str )) != -1 )
+	{
+		myList = QStringList::split(";",str);
+	}
+	else if ((mat=exp3.match( str )) != -1 )
+	{
+		myList = QStringList::split(":",str);
+	}
+	else if ((mat=exp4.match( str )) != -1 )
+	{
+		grauDec = str.toDouble();
+		if ((grauDec >= -180.0 && grauDec <=180.0))
+		{
+			echo_.sprintf("%3.10f",grauDec);
+			setText(echo_);
+			emit coordValidator(grauDec);
+			return;
+		}
+		else
+		{
+			setSelection( 0, text().length() );
+			emit coordValidator(TeLONGINVALID);
+			return;
+		}
+	}
+	else
+	{
+		setSelection( 0, text().length() );
+		emit coordValidator(TeLONGINVALID);
+		return;
+	}
+	int nelementos = myList.count();
+	short graus, minutos = 0;
+	float segundos = 0.0;
+	
+	graus = myList[1].toShort();
+
+	if (nelementos > 2)
+		minutos = myList[2].toShort();
+	
+	if (nelementos > 3)
+		segundos = myList[3].toFloat();
+
+	bool dec = decode(myList[0],graus, minutos, segundos, grauDec);
+	if (dec)
+	{
+		echo_.sprintf("%s %d %d %2.2f",(const char*) myList[0], abs(graus), minutos, segundos);
+		setText(echo_);
+		emit coordValidator(grauDec);
+		return;
+	}
+	else
+	{
+		setSelection( 0, text().length() );
+		emit coordValidator(TeLONGINVALID);
+		return;
+	}
+}
+
+void TeQtLongEdit::keyPressEvent( QKeyEvent *e )
+{
+    QLineEdit::keyPressEvent( e );
+    if ( e->key() == Key_Enter || e->key() == Key_Return )
+    {
+        emit focusOutEvent(0);
+    }
+}
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtLongEdit.h b/src/terralib/application/qt/TeQtLongEdit.h
new file mode 100644
index 0000000..04cfb13
--- /dev/null
+++ b/src/terralib/application/qt/TeQtLongEdit.h
@@ -0,0 +1,24 @@
+#ifndef TEQTLONGEDIT_H
+#define TEQTLONGEDIT_H
+
+#include <qlineedit.h>
+#include <qstring.h>
+#include <qwidget.h>
+
+#define TeLONGINVALID -999.99
+
+class TeQtLongEdit : public QLineEdit
+{
+    Q_OBJECT
+public:
+	TeQtLongEdit(QWidget *parent, const char* name);
+	bool decode(QString lado, short& dg, short& mn, float& sc, double& grauDec);
+
+protected:
+    void focusOutEvent( QFocusEvent *e );
+    void keyPressEvent( QKeyEvent *e );
+
+signals:
+    void coordValidator(const double&);
+};
+#endif
\ No newline at end of file
diff --git a/src/terralib/application/qt/TeQtMethods.cpp b/src/terralib/application/qt/TeQtMethods.cpp
new file mode 100644
index 0000000..961cf06
--- /dev/null
+++ b/src/terralib/application/qt/TeQtMethods.cpp
@@ -0,0 +1,98 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTElementSet.h"
+#include "TeQtMethods.h"
+#include "TeSkaterFunctions.h"
+#include "TeQtTerraStat.h"
+#include "TeQtGrid.h"
+#include "TeSTEFunctionsDB.h"
+#include <qobject.h>
+#include <qapplication.h>
+
+/////////////////////////////////////////////////////////////////////////////////////
+
+
+bool TeSkaterMethod::apply(vector<double>& het) {
+
+
+
+  if (this->hasPop_) {
+    this->attrVector_.push_back(this->attrPop_);
+  }
+
+  TeSTElementSet stoSet(regTheme_);
+
+  if (!TeSTOSetBuildDB(&stoSet, true, false, attrVector_)) {
+    QMessageBox::critical(NULL, tr("Error"), 
+		tr("Unexpected: Regions and attributes could not be loaded!"));
+    return false;
+  }
+
+  if (!TeSkaterFunction(this->hasPop_, this->type_, this->nClusters_, this->minPop_,
+    stoSet, this->resName_, het) ) {
+    QMessageBox::critical(NULL, tr("Error"), 
+		tr("Choose a connected graph!"));
+    return false;
+  }
+
+  double h;
+  for(unsigned int i = 0; i < het.size(); i++) {
+    h = het[i];
+  }
+
+  
+  if (!insertPropertyColumn(stoSet, tableName_, resName_) ) 
+  {
+    QMessageBox::critical(NULL, tr("Error"), 
+		tr("Error storing results. Check result column name!"));
+    return false;
+  }
+
+  // ---------------------------------------------- load updated table from database 
+	// Update all the themes that uses this table
+	TeViewMap& viewMap = regTheme_->layer()->database()->viewMap();
+	TeViewMap::iterator it;
+	set<TeLayer*> layerSet;
+	for (it = viewMap.begin(); it != viewMap.end(); ++it)
+	{
+		TeView *view = it->second;
+		vector<TeViewNode*>& themesVector = view->themes();
+		for (unsigned int i = 0; i < themesVector.size(); ++i)
+		{
+			TeTheme *theme = (TeThemeApplication*)themesVector[i];
+			if (theme->isThemeTable(tableName_) == true)
+			{
+				theme->loadThemeTables();
+				layerSet.insert(theme->layer());
+			}
+		}
+	}
+
+	// Update the layer tables affected
+	set<TeLayer*>::iterator setIt;
+	for (setIt = layerSet.begin(); setIt != layerSet.end(); ++setIt)
+		(*setIt)->loadLayerTables();
+
+  return true;
+}
+
diff --git a/src/terralib/application/qt/TeQtMethods.h b/src/terralib/application/qt/TeQtMethods.h
new file mode 100644
index 0000000..d0a3860
--- /dev/null
+++ b/src/terralib/application/qt/TeQtMethods.h
@@ -0,0 +1,64 @@
+#ifndef  __TERRALIB_INTERNAL_QTTERRAMETHODS_H
+#define  __TERRALIB_INTERNAL_QTTERRAMETHODS_H
+/***
+ * Implementa suporte para as funcoes do TerraStat
+ * Objetivo -- soh nao manter a parte de geracao de eventos,
+ * etc no ui, que podera ser reaproveitado.
+ ****/
+
+#include "TeDatabase.h"
+#include "TeKernelParams.h"
+#include <qapplication.h>
+
+/////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////
+class TeThemeApplication;
+class TeQtGrid;
+
+class TeSkaterMethod : public QWidget {
+
+	Q_OBJECT
+
+protected:
+  //Method params
+  TeTheme*        regTheme_;    //Tema de regioes
+  vector<string>  attrVector_;  //Atributos a serem utilizados
+  bool            hasPop_;       //Usa populacao
+  string          attrPop_;     //Atributo de populacao
+  int             type_;
+  int             minPop_;
+  int             nClusters_;
+  string          tableName_;
+  string          resName_;
+
+public:
+
+  bool setTheme(string name, TeView* view) {
+    regTheme_ = view->get(name);
+    return (regTheme_ != NULL);
+  }
+
+  void setAttrVector(const vector<string>& vec) {
+    attrVector_ = vec;
+  }
+
+  void setHasPop(bool hp, const string& pop) {
+    hasPop_ = hp;
+    attrPop_ = pop;
+  }
+
+  void setType(int t, int mp, int nc) {
+    type_ = t; minPop_= mp; nClusters_= nc;
+  }
+
+  void setResName(string r, string t) {
+    resName_ = r;
+    tableName_ = t;
+  }
+
+  //Aplica o metodo skater
+  bool apply(vector<double>& het);
+
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtProgress.h b/src/terralib/application/qt/TeQtProgress.h
new file mode 100644
index 0000000..691b9ee
--- /dev/null
+++ b/src/terralib/application/qt/TeQtProgress.h
@@ -0,0 +1,138 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTPROGRESS_H
+#define  __TERRALIB_INTERNAL_QTPROGRESS_H
+
+#include <qprogressdialog.h>
+#include <qapplication.h>
+#include <qcursor.h>
+#include <qaction.h>
+#include "TeProgress.h"
+#include <qeventloop.h>
+
+class TeQtProgress : public QProgressDialog, public TeProgressBase
+{
+	Q_OBJECT
+
+protected:
+	int		numberOfCursors_;	//<! Number of cursors that were pushed on application stack.
+
+	void enterEvent ( QEvent * )
+	{
+		if(QApplication::overrideCursor())
+		{
+			if(QApplication::overrideCursor()->shape() != Qt::ArrowCursor)
+			{
+				QApplication::setOverrideCursor( Qt::ArrowCursor );
+				numberOfCursors_++;
+			}
+		}
+	}
+
+	void leaveEvent ( QEvent * )
+	{
+		if(QApplication::overrideCursor())
+		{
+			if(QApplication::overrideCursor()->shape() == Qt::ArrowCursor)
+			{
+				QApplication::restoreOverrideCursor();
+				numberOfCursors_--;
+			}
+		}
+	}
+
+public:
+	TeQtProgress( QWidget * creator = 0, const char * name = 0, bool modal = FALSE, WFlags f = 0)
+		: QProgressDialog(creator, name, modal, f)	
+	{
+		numberOfCursors_ = 0;
+	}
+
+	~TeQtProgress() {}
+
+	void reset()
+	{
+		int i;
+		QProgressDialog::reset();
+		QProgressDialog::setLabelText("");
+		QProgressDialog::setCaption("");
+
+		//Restore all cursors that were set by TeQtProgress.
+		for (i=0; i<numberOfCursors_; i++)
+		{
+			if(QApplication::overrideCursor())
+				QApplication::restoreOverrideCursor();
+		}
+		numberOfCursors_ = 0;
+	}
+
+	void setTotalSteps (int steps)
+	{
+		QProgressDialog::setTotalSteps(steps);
+		if(QApplication::overrideCursor())
+		{
+			if(QApplication::overrideCursor()->shape() != Qt::WaitCursor)
+			{
+				QApplication::setOverrideCursor( Qt::WaitCursor );
+				numberOfCursors_++;
+			}
+		}
+		else
+		{
+			QApplication::setOverrideCursor( Qt::WaitCursor );
+			numberOfCursors_++;
+		}
+	}
+
+	void setMessage(const string& text)
+	{
+		QProgressDialog::setLabelText(text.c_str());
+	}
+
+	string getMessage()
+	{
+		return QProgressDialog::labelText().latin1();
+	}
+
+	void setProgress(int steps)
+	{
+		QProgressDialog::setProgress(steps);
+	}
+
+	 bool wasCancelled()
+	 {
+		 hasMouse();
+		 return QProgressDialog::wasCancelled();
+	 }
+
+	 void setCaption(const string& cap)
+	 {
+		 QProgressDialog::setCaption(cap.c_str());
+	 }
+
+	 void cancel() 
+	 {
+		 QProgressDialog::cancel();
+	 }
+
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtShowMedia.cpp b/src/terralib/application/qt/TeQtShowMedia.cpp
new file mode 100644
index 0000000..1807781
--- /dev/null
+++ b/src/terralib/application/qt/TeQtShowMedia.cpp
@@ -0,0 +1,1444 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtShowMedia.h>
+#include <TeAttribute.h>
+#include <qfiledialog.h> 
+#include <qlineedit.h> 
+#include <qstring.h> 
+#include <qtextedit.h> 
+#include <qmessagebox.h>
+#include <qfile.h>
+#include <errno.h>
+
+#ifdef WIN32
+#include <windows.h>
+#include <process.h>
+#include <io.h>
+#include <direct.h>
+#else
+#include <unistd.h>
+#endif
+
+
+TeQtShowMedia :: TeQtShowMedia(QWidget* parent, const char* name)
+	: QTable(2, 2, parent, name)
+{
+	layer_ = 0;
+	db_ = 0;
+	cmdLocal_ = false;
+	popup_ = new QPopupMenu(this);
+	popup_->insertItem(tr("Show Media..."), this, SLOT(slotShow()));
+	popup_->insertItem(tr("Insert Media..."), this, SLOT(slotInsert()));
+	popup_->insertItem(tr("Insert URL..."), this, SLOT(slotInsertURL()));
+	popup_->insertItem(tr("Remove..."), this, SLOT(slotRemove()));
+	popup_->insertItem(tr("Set the Default Media"), this, SLOT(slotSetDefault()));
+	popup_->insertItem(tr("Description..."), this, SLOT(slotDescription()));
+
+	connect(this, SIGNAL(pressed(int, int, int, const QPoint&)),
+		 this, SLOT(slotpressed(int, int, int, const QPoint&)));
+
+	connect(this, SIGNAL(doubleClicked(int, int, int, const QPoint&)),
+		 this, SLOT(slotDoubleClicked(int, int, int, const QPoint&)));
+}
+
+TeQtShowMedia :: ~TeQtShowMedia()
+{
+}
+
+void TeQtShowMedia :: init(string objId, TeThemeApplication* theme, TeQtGrid* grid)
+{
+	setNumRows(0);
+	id_ = objId;
+	nattrs_ = grid->numCols();
+	layer_ = theme->layer();
+	table_ = layer_->mediaTable();
+	db_ = layer_->database();
+	TeDatabasePortal* portal = db_->getPortal();
+	
+	TeAttributeList	colAttrList;
+	db_->getAttributeList(theme->collectionTable(), colAttrList);
+
+	horizontalHeader()->setLabel(0, tr("Attribute"));
+	horizontalHeader()->setLabel(1, tr("Value"));
+
+	int	i, nMidias = 0;
+	if(table_.empty() == false)
+	{
+		string q = "SELECT COUNT(*) FROM " + table_;
+		q += " WHERE object_id = '" + id_ + "'";
+		if(portal->query(q))
+		{
+			if(portal->fetchRow())
+				nMidias = atoi(portal->getData(0));
+		}
+	}
+
+	string sel = theme->sqlJoin() + " WHERE c_object_id = '" + id_ + "'";
+
+	portal->freeResult();
+	if(portal->query(sel))
+	{
+		int ncol = portal->AttributeList().size() - colAttrList.size() + nMidias;
+
+		setNumRows(ncol);
+
+		if(portal->fetchRow())
+		{
+			for(i=0; i<grid->numCols(); i++)
+			{
+				string fname = portal->getAttribute(i).rep_.name_;
+				string data = portal->getData(i);
+				setText(i, 0, fname.c_str());
+				setText(i, 1, data.c_str());
+			}
+		}
+
+		if(table_.empty() == false)
+		{
+			string q = "SELECT media_name, media_table, show_default FROM " + table_;
+			q += " WHERE object_id = '" + id_ + "'";
+			portal->freeResult();
+			if(portal->query(q))
+			{
+				TeDatabasePortal* portal2 = db_->getPortal();
+				while(portal->fetchRow())
+				{
+					string type;
+					string mediaName = portal->getData(0);
+					string mediaTable = portal->getData(1);
+					bool showDefault = atoi(portal->getData(2));
+
+					string q = "SELECT media_type FROM " + mediaTable;
+					q += " WHERE media_name = '" + mediaName + "'";
+					portal2->freeResult();
+					if(portal2->query(q))
+					{
+						if(portal2->fetchRow())
+							type = portal2->getData(0);
+					}
+
+					string ss;
+					if(showDefault)
+						ss = "*media: "; // + type;
+					else
+						ss = "media: "; // + type;
+
+					setText(i, 0, ss.c_str());
+					setText(i, 1, mediaName.c_str());
+					i++;
+				}
+				delete portal2;
+			}
+		}
+		show();
+		moveDown();
+	}
+	delete portal;
+}
+
+bool TeQtShowMedia :: eventFilter(QObject* o, QEvent* e)
+{
+//	if (e->type() == QEvent::MouseButtonDblClick)
+//		return true;
+	return QTable::eventFilter(o, e);    // standard event processing
+}
+
+void TeQtShowMedia :: slotpressed( int row, int /* col */, int button, const QPoint & mousePos )
+{
+	if(button == RightButton)
+	{
+		cmdLocal_ = true;
+		row_ = row;
+		popup_->move(mousePos.x() + x() - contentsX(), mousePos.y() + y() - contentsY());
+		popup_->exec();
+		cmdLocal_ = false;
+	}
+}
+
+void TeQtShowMedia :: slotDoubleClicked( int row, int /* col */, int button, const QPoint & /*mousePos */)
+{
+	if(button == LeftButton)
+	{
+		row_ = row;
+		slotShow();
+	}
+}
+
+void TeQtShowMedia :: slotShow()
+{
+	if(row_ > 0 && nattrs_ > row_)
+		return;
+
+	string name;
+	if(row_ >= 0)
+		name = text(row_, 1).latin1();
+
+    int     pos;
+    char    buf[300];
+	vector<string>	varg;
+    string  cmd, arg, sname;
+	string	swdir;
+	string	mediaTable;
+	string	type;
+
+// load media data to archive from database
+	TeDatabasePortal *portal = db_->getPortal();
+	string query = "SELECT media_table, media_name FROM " + table_;
+	if(row_ >= 0)
+		query += " WHERE object_id = '" + id_ + "' AND media_name = '" + name + "'";
+	else
+		query += " WHERE object_id = '" + id_ + "' AND show_default = 1";
+	if(portal->query(query))
+	{
+		if(portal->fetchRow())
+		{
+			mediaTable = portal->getData(0);
+			name = portal->getData(1);
+		}
+	}
+
+	if(mediaTable.empty())
+	{
+		QMessageBox::warning(this, tr("Warning"),
+			tr("There is no media to show!\nInsert one first."));
+		delete portal;
+		return;
+	}
+
+	query = "SELECT * FROM " + mediaTable + " WHERE media_name = '" + name + "'";
+	portal->freeResult();
+	if(portal->query(query))
+		if(portal->fetchRow())
+			type = portal->getData("media_type");
+
+	if(type.empty())
+	{
+		QMessageBox::warning(this, tr("Warning"),
+			tr("There is no media in the table!"));
+		delete portal;
+		return;
+	}
+
+	string tempName =  name;
+	if(type != "url")
+	{
+        int f;
+#ifdef WIN32
+		char wdir[100];
+		GetWindowsDirectory((LPTSTR)wdir, 100);
+		swdir = wdir;
+		f = swdir.find(":\\");
+		if(f >= 0)
+			swdir.erase(f, swdir.size()-f);
+		swdir.append(":\\TERRAVIEW_TEMP");
+		if( access (swdir.c_str(), 06) == -1 ) // test if directory exists
+		{
+			if( errno == ENOENT )  // directory does not exist so create it
+			{
+				if ( _mkdir(swdir.c_str()) == -1)
+				{
+                    QString msg = tr("The directory ");
+                    msg += swdir.c_str();
+                    msg += tr(" could not be created");
+            		QMessageBox::critical(this, tr("Error"),
+            		    tr("The directory /tmp/TERRAVIEW_TEMP could not be created!"));
+					delete portal;
+					return;
+				}
+			}
+		}
+		swdir.append("\\");
+#else
+    	swdir = "/tmp/TERRAVIEW_TEMP";
+		if( access (swdir.c_str(), F_OK) == -1 ) // test if directory exists
+		{
+			if( errno == ENOENT )  // directory does not exist so create it
+			{
+                char buf[20];
+                sprintf(buf, "mkdir %s", swdir.c_str());
+				if (system(buf) != 0)
+				{
+            		QMessageBox::critical(this, tr("Error"),
+            		    tr("The directory /tmp/TERRAVIEW_TEMP could not be created!"));
+            		delete portal;
+            		return;
+				}
+			}
+		}        
+		swdir.append("/");
+#endif
+		f = tempName.rfind("/");
+		if(f < 0)
+			f = tempName.rfind("\\");
+		if(f >= 0)
+			tempName.erase(0, f+1);
+		tempName.insert(0, swdir);
+
+		pos = tempName.rfind(".");
+		if (pos < 0)
+		{
+			tempName.append(".");
+			tempName.append(type);
+		}
+		unsigned char *data = 0;
+		long size;
+//		string description;
+//		string type;
+		if((portal->getBlob("media_blob", data, size)) == false)
+		{
+			delete portal;
+			return;
+		}
+		FILE *fp = fopen(tempName.c_str(), "wb");
+		if(fp == 0)
+		{
+			delete portal;
+			return;
+		}
+		if(fwrite(data, sizeof(unsigned char), size, fp) < (unsigned long)size)
+		{
+			delete portal;
+			return;
+		}
+		if(data)
+			delete []data;
+		fclose(fp);
+
+		pos = tempName.rfind(".");
+		if (pos < 0)
+		{
+			delete portal;
+			return;
+		}
+
+		memset (buf, 0, 300);
+		tempName.copy (buf, tempName.size()-pos, pos);
+	}
+	else
+		strcpy(buf, ".html");
+
+	delete portal;
+
+#ifdef WIN32
+	if (TeConvertToUpperCase (buf) == ".EXE")
+	{
+		_spawnl (P_NOWAIT, tempName.c_str(), tempName.c_str(), NULL);
+		return;
+	}
+	// if application is user defined find current application
+	// else use default application
+	string key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\";
+	key += buf;
+
+	string keycmd = getSystemKeyValue(HKEY_CURRENT_USER, key, "Application");
+	if(keycmd.empty() == false)
+	{
+		string com = keycmd;
+		key = "Applications\\" + com + "\\SHELL\\PLAY\\COMMAND";
+		keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+		if(keycmd.empty())
+		{
+			key = "Applications\\" + com + "\\SHELL\\OPEN\\COMMAND";
+			keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			if(keycmd.empty())
+			{
+				key = "Applications\\" + com + "\\SHELL\\EDIT\\COMMAND";
+				keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			}
+		}
+	}
+	else
+	{
+		key = buf;
+		keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+		if(keycmd.size() <= 1)
+		{
+			key += "\\SHELL\\PLAY\\COMMAND";
+			keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			if(keycmd.empty())
+			{
+				key = buf;
+				key += "\\SHELL\\OPEN\\COMMAND";
+				keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				if(keycmd.empty())
+				{
+					key = buf;
+					key += "\\SHELL\\EDIT\\COMMAND";
+					keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				}
+			}
+		}
+		else
+		{
+			memset (buf, 0, 300);
+			strcpy(buf, keycmd.c_str());
+
+			key = buf;
+			key += "\\SHELL\\PLAY\\COMMAND";
+			keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			if(keycmd.empty())
+			{
+				key = buf;
+				key += "\\SHELL\\OPEN\\COMMAND";
+				keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				if(keycmd.empty())
+				{
+					key = buf;
+					key += "\\SHELL\\EDIT\\COMMAND";
+					keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				}
+			}
+		}
+	}
+
+	if(keycmd.empty())
+	{
+		QMessageBox::warning(this, tr("Warning"),
+			tr("The media cannot be shown!\nCheck if there is a program defined to open it."));
+		return;
+	}
+
+// get command and arguments from keycmd
+    getCommand(keycmd, cmd, varg);
+	if((pos = tempName.find(" ")) >= 0)
+		tempName = "\"" + tempName + "\"";
+
+	char curdir[256];
+	_getcwd(curdir, 256);
+	_chdir(swdir.c_str());
+
+	if (varg.size() == 0)
+		_spawnl (P_NOWAIT, cmd.c_str(), tempName.c_str(), NULL);
+	else if (varg.size() == 1)
+        _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+	else if (varg.size() == 2)
+	{
+		const char* p = varg[1].c_str();
+		if(varg[1] == "%L" || varg[1] == "%1")
+			_spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+		else
+			_spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, tempName.c_str(), NULL);
+	}
+	else if (varg.size() == 3)
+	{
+		const char* p = varg[1].c_str();
+		const char* p1 = varg[2].c_str();
+		int f = varg[0].find("/prefetch:", -1);
+		if(f >= 0 && (varg[2] == "%L" || varg[2] == "%1"))
+			_spawnl (P_NOWAIT, cmd.c_str(), p, tempName.c_str(), NULL);
+		else
+			_spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, p1, tempName.c_str(), NULL);
+
+
+	}
+
+	_chdir(curdir);
+#else
+    string command;
+    //Mount the vector of directory paths that are
+    //stored in the PATH environment variable
+    string path =  getenv("PATH");
+    vector<string> dirVector;
+    string dirPath;
+    size_t idx = 0;
+    size_t len = path.find(':', idx);
+    while (len != string::npos)
+    {
+        dirPath = path.substr(idx, len-idx);
+        dirVector.push_back(dirPath);
+        idx = len+1;
+        len = path.find(':', idx);
+    }
+
+
+    // get the last directory path
+    idx = path.rfind(':', path.size());
+    dirPath = path.substr(idx+1, path.size());
+    dirVector.push_back(dirPath);
+       
+	string fs; 
+    if(type != "url")
+	{
+        bool exists = false;
+        for (unsigned int i = 0; i < dirVector.size(); ++i)
+        {
+			QString qfs = dirVector[i].c_str();
+			qfs += "/konqueror";
+            QFile file(qfs);
+            if (file.exists() == true)
+            {
+                exists = true;
+                break;
+            }
+        }
+        if (exists == true)
+            command = "konqueror " + tempName + " &";
+        else
+        {
+			QString msg = tr("The program konqueror used to display your media is not") + "\n";
+			msg += tr("present in your PATH environment variable or KDE is not installed!");
+            QMessageBox::warning(this, tr("Warning"), msg);
+            return;
+        }      
+    }
+    else
+    {
+        unsigned int i;
+        for (i = 0; i < dirVector.size(); ++i)
+        {
+			QString qfs = dirVector[i].c_str();
+			qfs += "/netscape";
+            QFile file(qfs);
+            if (file.exists() == true)
+            {
+                command = "netscape -remote 'openURL(" + tempName + ")' &";              
+                break;
+            }
+        }
+
+        if (command.empty() == true)
+        {
+            for (i = 0; i < dirVector.size(); ++i)
+            {
+				QString qfs = dirVector[i].c_str();
+				qfs += "/mozilla";
+                QFile file(qfs);
+                if (file.exists() == true)
+                {
+                    command = "mozilla -remote 'openURL(" + tempName + ")' &";
+                    break;
+                }
+            }
+        }
+         
+        if (command.empty() == true)
+        {
+            for (i = 0; i < dirVector.size(); ++i)
+            {
+				QString qfs = dirVector[i].c_str();
+				qfs += "/konqueror";
+				QFile file(qfs);
+                if (file.exists() == true)
+                {
+                    command = "konqueror " + tempName + " &";
+                    break;
+                }
+           }
+        }
+        
+        if (command.empty() == true)
+        {
+ 			QString msg = tr("The program konqueror used to display your media is not") + "\n";
+			msg += tr("present in your PATH environment variable or KDE is not installed!");
+            QMessageBox::warning(this, tr("Warning"), msg);
+             return;
+        }
+    }
+    
+    system(command.c_str());
+#endif
+}
+
+void TeQtShowMedia :: slotInsert()
+{
+	if(cmdLocal_ == false)
+		hide();
+	QFileDialog filed("c:\\", QString::null, 0, 0, true);
+	QString qfile = filed.getOpenFileName (QString::null, QString::null, 0, 0);
+
+	if(qfile.isEmpty())
+	{
+		QMessageBox::warning(this, tr("Warning"), tr("No media was selected!"));
+		show();
+		return;
+	}
+
+	string file = qfile.latin1();
+	string type;
+	int f = file.rfind(".");
+	if (f >= 0)
+	{
+		type = file;
+		type.erase(0, f+1);
+	}
+
+	string mTable = "media_table_" + Te2String(layer_->id());
+	if(table_.empty())
+	{
+		string tname = "media_layer_" + Te2String(layer_->id());
+		if(createLayerMediaTable(db_, layer_->id(), tname) == false)
+		{
+			QMessageBox::critical(this, tr("Error"),
+				tr("Fail to create the table that will store media names!"));
+			return;
+		}
+		table_ = layer_->mediaTable();
+		if(createMediaTable(db_, mTable) == false)
+		{
+			QMessageBox::critical(this, tr("Error"),
+				tr("Fail to create the media table!"));
+			return;
+		}
+	}
+
+	int response = 1;
+
+	TeDatabasePortal *portal = db_->getPortal();
+	string sel = "SELECT media_name, object_id FROM "  + table_ + " WHERE media_table = '" + mTable + "'";
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			string s = portal->getData(0);
+			if(s == file)
+			{
+				response = QMessageBox::question(this, tr("Question"),
+				tr("The media already exists! Do you wish to use it even so?"), tr("Yes"), tr("No"));
+				if(response == 1)
+				{
+					QMessageBox::warning(this, tr("Warning"),
+						tr("Rename the file and try again!"));
+					delete portal;
+					return;
+				}
+				else
+				{
+					string s = portal->getData(1);
+					if(s == id_)
+					{
+						QMessageBox::warning(this, tr("Warning"),
+							tr("There is already a media associated to this object!"));
+						delete portal;
+						return;
+					}
+				}
+				break;
+			}
+		}
+	}
+
+	if(response == 1)
+	{
+		if(insertMedia(db_, mTable, file, "", type) == false)
+		{
+			QString msg = tr("Fail to insert media:") + " ";
+			msg += db_->errorMessage().c_str();
+			QMessageBox::critical(this, tr("Error"), msg);
+			delete portal;
+			return;
+		}
+	}
+	if(insertMediaObjLayer(db_, layer_, id_, file, mTable) == false)
+	{
+		QMessageBox::critical(this, tr("Error"),
+			tr("Fail to insert the \"media_name\" field in the table!"));
+		delete portal;
+		return;
+	}
+
+	setNumRows(numRows() + 1);
+	setText(numRows()-1, 1, file.c_str());
+
+	int nmidias = 0;
+	string conta = "SELECT COUNT(*) FROM "  + table_ + " WHERE object_id = '" + id_ + "'";
+	portal->freeResult();
+	if(portal->query(conta))
+	{
+		if(portal->fetchRow())
+			nmidias = atoi(portal->getData(0));
+	}
+
+	string title = "media: ";
+
+	if(nmidias <= 1)
+	{
+		title = "*media: "; // + type;
+		string up = "UPDATE " + table_ + " SET show_default = 1 WHERE object_id = '" + id_ + "'";
+		db_->execute(up);
+	}
+	delete portal;
+	setText(numRows()-1, 0, title.c_str());
+
+	if(cmdLocal_ == false)
+		hide();
+	else
+	{
+		moveDown();
+		show();
+		raise();
+
+	}
+}
+
+void TeQtShowMedia :: moveDown()
+{
+	int x = contentsX();
+	int height = visibleHeight(); 
+	int nlins = rowAt(height);
+	int y = rowPos(numRows()-nlins);
+	setContentsPos(x, y);
+	adjustColumn(0);
+	adjustColumn(1);
+}
+
+void TeQtShowMedia :: slotRemove()
+{
+	if(nattrs_ > row_)
+		return;
+
+	int x = contentsX();
+	int y = contentsY();
+
+	vector<string> atr;
+	vector<string> val;
+	int	i;
+
+	for(i=0; i<numRows(); i++)
+	{
+		string a = text(i, 0).latin1();
+		atr.push_back(a);
+		string b = text(i, 1).latin1();
+		val.push_back(b);
+	}
+
+	string	name = val[row_];
+	vector<string>::iterator ait = atr.begin();
+	ait += row_;
+	atr.erase(ait, ait+1);
+	vector<string>::iterator vit = val.begin();
+	vit += row_;
+	val.erase(vit, vit+1);
+
+	setNumRows(0);
+	string mTable = "media_table_" + Te2String(layer_->id());
+	string remover = "DELETE FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+	remover += " AND media_name = '" + name + "'" + " AND media_table = '" + mTable + "'";
+	db_->execute(remover);
+
+	bool aindaUsa = false;
+	TeDatabasePortal* portal = db_->getPortal();
+	string sel = "SELECT * FROM " + table_ + " WHERE media_name = '" + name + "'";
+	sel += " AND media_table = '" +  mTable + "'";
+	if(portal->query(sel))
+		if(portal->fetchRow())
+			aindaUsa = true;
+
+	if(aindaUsa == false)
+	{
+		string remover = "DELETE FROM " + mTable + " WHERE media_name = '" + name + "'";
+		db_->execute(remover);
+	}
+
+	string defname;
+	bool defshow = false;
+	sel = "SELECT media_name, show_default FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+	portal->freeResult();
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			defname = portal->getData(0);
+			defshow = atoi(portal->getData(1));
+			if(defshow)
+				break;
+		}
+	}
+	delete portal;
+
+	if(defshow ==  false && defname.empty() == false)
+	{
+		string up = "UPDATE " + table_ + " SET show_default = 1 WHERE media_name = '" + defname + "'";
+		db_->execute(up);
+	}
+
+	setNumRows(atr.size());
+
+	unsigned int k;
+	for(k=0; k<atr.size(); k++)
+	{
+		if(defshow ==  false && defname.empty() == false)
+		{
+			if(val[k] == defname)
+				atr[k].insert(0, "*");
+		}
+		setText(k, 0, atr[k].c_str());
+		setText(k, 1, val[k].c_str());
+	}
+	setContentsPos(x, y);
+	raise();
+}
+
+void TeQtShowMedia :: slotInsertURL()
+{
+	if(cmdLocal_ == false)
+		hide();
+
+	urlWindow_ = new URLWindow(this, "urlInsertion", true);
+	urlWindow_->exec();
+	QString qsite = urlWindow_->URLLineEdit->text();
+	delete urlWindow_;
+	if(qsite.isNull() || qsite.isEmpty())
+		return;
+
+	string site = qsite.latin1();
+	string type = "url";
+
+
+	string mTable = "media_table_" + Te2String(layer_->id());
+	if(table_.empty())
+	{
+		string tname = "media_layer_" + Te2String(layer_->id());
+		if(createLayerMediaTable(db_, layer_->id(), tname) == false)
+		{
+			QMessageBox::critical(this,tr("Error"),
+				tr("Fail to create the table to store media names!"));
+			return;
+		}
+		if(createMediaTable(db_, mTable) == false)
+		{
+			QMessageBox::critical(this, tr("Error"), tr("Fail to create the media tables!"));
+			return;
+		}
+	}
+
+
+	bool jatem = false;
+
+	TeDatabasePortal *portal = db_->getPortal();
+	string sel = "SELECT media_name, object_id FROM "  + table_ + " WHERE media_table = '" + mTable + "'";
+	if(portal->query(sel))
+	{
+		while(portal->fetchRow())
+		{
+			string s = portal->getData(0);
+			if(s == site)
+			{
+				jatem = true;
+				string ss = portal->getData(1);
+				if(ss == id_)
+				{
+					QMessageBox::warning(this, tr("Warning"),
+						tr("This URL is already associated to this object!"));
+					delete portal;
+					return;
+				}
+				break;
+			}
+		}
+	}
+
+	if(jatem == false)
+	{
+		if(insertMedia(db_, mTable, site, "", type, false) == false)
+		{
+			QMessageBox::critical(this, tr("Error"),
+				tr("Fail to insert the \"media_blob\" field in the table!"));
+			delete portal;
+			return;
+		}
+	}
+	if(insertMediaObjLayer(db_, layer_, id_, site, mTable) == false)
+	{
+		QMessageBox::critical(this, tr("Error"),
+			tr("Fail to insert the \"media_name\" field in the table!"));
+		delete portal;
+		return;
+	}
+
+	setNumRows(numRows() + 1);
+	setText(numRows()-1, 1, site.c_str());
+
+	int nmidias = 0;
+	string conta = "SELECT COUNT(*) FROM "  + table_ + " WHERE object_id = '" + id_ + "'";
+	portal->freeResult();
+	if(portal->query(conta))
+	{
+		if(portal->fetchRow())
+			nmidias = atoi(portal->getData(0));
+	}
+
+	string title;
+
+	if(nmidias <= 1)
+	{
+		title = "*media: "; // + type;
+		string up = "UPDATE " + table_ + " SET show_default = 1 WHERE object_id = '" + id_ + "'";
+		db_->execute(up);
+	}
+
+	delete portal;
+	setText(numRows()-1, 0, title.c_str());
+
+	if(cmdLocal_ == false)
+		hide();
+	else
+	{
+		moveDown();
+		show();
+		raise();
+	}
+}
+
+void TeQtShowMedia :: slotSetDefault()
+{
+	if(nattrs_ > row_)
+		return;
+
+	string media_name = text(row_, 1).latin1();
+	string mTable = "media_table_" + Te2String(layer_->id());
+	setDefaultMedia(db_, layer_, id_, media_name, mTable);
+
+	string type = text(row_, 0).latin1();
+	int f = type.find("*", string::npos);
+	if(f >= 0)
+		return;
+	else
+	{
+		int i;
+		for(i = nattrs_; i<numRows(); i++)
+		{
+			string s = text(i, 0).latin1();
+			f = s.find("*", 0);
+			if(f >= 0)
+			{
+
+				setText(i, 0, "media:");
+				break;
+			}
+		}
+		setText(row_, 0, "*media:");
+	}
+
+	if(cmdLocal_ == false)
+		hide();
+	else
+		raise();
+}
+
+void TeQtShowMedia :: slotDescription()
+{
+	if(row_ > 0 && nattrs_ > row_)
+		return;
+
+	string mTable = "media_table_" + Te2String(layer_->id());
+	TeDatabasePortal *ptal = db_->getPortal();
+	string name;
+
+	if(row_ < 0)
+	{
+		string s = "SELECT media_name FROM " + table_ + " WHERE object_id = '" + id_ + "'";
+		s += " AND show_default = 1";
+		if(ptal->query(s))
+		{
+			if(ptal->fetchRow())
+				name = ptal->getData(0);
+		}
+	}
+	else
+		name = text(row_, 1).latin1();
+
+	string q = "SELECT * FROM " + mTable + " WHERE media_name = '" + name + "'";
+
+	string description;
+	ptal->freeResult();
+	if(ptal->query(q))
+	{
+		if(ptal->fetchRow())
+			description = ptal->getData("description");
+	}
+	delete ptal;
+	descriptionWindow_ = new MediaDescription(this, "mediaDescription", true);
+	QString qdesc;
+	qdesc.setLatin1(description.c_str(), description.size());
+	descriptionWindow_->descriptionTextEdit->setText(qdesc);
+	descriptionWindow_->exec();
+
+	QString qtext = descriptionWindow_->descriptionTextEdit->text();
+	if(qtext.isEmpty() || qtext.isNull())
+		description.clear();
+	else
+		description = qtext.latin1();
+	if(description.size() > 255)
+	{
+		QMessageBox::warning(this, tr("Warning"),
+			tr("The description is longer than 255 caracteres!\nIt will be truncated."));
+		description.erase(255, description.size()-255);
+	}
+	if(description.empty() == false)
+		updateMediaDescription(db_, name, mTable, description);
+
+	delete descriptionWindow_;
+
+	if(cmdLocal_ == false)
+		hide();
+	else
+		raise();
+}
+
+#ifdef WIN32
+void TeQtShowMedia :: getCommand(string keycom, string& cmd, vector<string>& varg)
+{
+    string  s = keycom;
+    string  ss = keycom;
+    string  S = TeConvertToUpperCase(keycom);
+    unsigned int i;
+    int     pos, n;
+	string	arg;
+	bool	isDll = false;
+
+	varg.clear();
+    cmd.clear();
+    arg.clear();
+
+// find command
+	if((pos=s.find(".")) >= 0)
+	{
+		if((n=s.find(" ", pos)) >= 0)
+		{
+			s.erase(n, s.size()-n);
+			S.erase(n, S.size()-n);
+			ss.erase(0, n);
+		}
+	}
+
+// remove ""
+	while((pos=s.find("\"", -1)) >= 0)
+	{
+		s.erase(pos, 1);
+		S.erase(pos, 1);
+	}
+// replace %SystemRoot%
+	if((pos=S.find("%SYSTEMROOT%", -1)) >= 0)
+	{
+		int len = strlen("%SystemRoot%");
+		string systemRoot = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+			"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "SystemRoot");
+		s.replace(pos, len, systemRoot);
+		S.replace(pos, len, systemRoot);
+	}
+
+// replace %ProgramFiles%
+	if((pos=S.find("%PROGRAMFILES%", -1)) >= 0)
+	{
+		int len = strlen("%ProgramFiles%");
+		string programFiles = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+			"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", "ProgramFilesDir");
+		s.replace(pos, len, programFiles);
+		S.replace(pos, len, programFiles);
+	}
+
+// replace %CommonProgramFiles%
+	if((pos=S.find("%COMMOMFILES%", -1)) >= 0)
+	{
+		int len = strlen("%CommonFiles%");
+		string commonFiles = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+			"SOFTWARE\\Microsoft\\Windows\\CurrentVersion", "CommonFilesDir");
+		s.replace(pos, len, commonFiles);
+		S.replace(pos, len, commonFiles);
+	}
+
+// rundll32.exe
+	if((pos=S.find("RUNDLL32", -1)) == 0)
+	{
+		string dllDirectory = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+			"System\\ControlSet001\\Control\\Session Manager\\KnownDLLs", "DllDirectory");
+		string  DIR = TeConvertToUpperCase(dllDirectory);
+		if((pos=DIR.find("%SYSTEMROOT%", -1)) >= 0)
+		{
+
+			int len = strlen("%SystemRoot%");
+			string systemRoot = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+			"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "SystemRoot");
+			dllDirectory.replace(pos, len, systemRoot);
+		}
+		cmd = dllDirectory + "\\rundll32.exe";
+		isDll = true;
+	}
+	else
+		cmd = s;
+
+	string command = TeConvertToUpperCase(cmd);
+	bool percentOut = false;
+	if((pos=command.find("MSACCESS.EXE", -1)) >= 0)
+
+		percentOut = true;
+	if((pos=command.find("POWERPNT.EXE", -1)) >= 0)
+		percentOut = true;
+
+	s = ss; // arguments
+	if(isDll)
+	{
+		varg.push_back("rundll32.exe");
+		S = TeConvertToUpperCase(s);
+		if((pos=S.find("%SYSTEMROOT%", -1)) >= 0)
+		{
+			int len = strlen("%SystemRoot%");
+			string systemRoot = getSystemKeyValue(HKEY_LOCAL_MACHINE,
+			"SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "SystemRoot");
+			s.replace(pos, len, systemRoot);
+		}
+		if(s[0] == ' ')
+			s.erase(0, 1);
+
+		for(i=0; i<s.size(); i++)
+			if(s[i] == '/' || s[i] == '-' || s[i]=='%')
+				break;
+		string arg = s;
+		arg.erase(i-1, arg.size()-(i-1));
+		varg.push_back(arg);
+		s.erase(0, i-1);
+	}
+
+// if runddl32 the option has "/" or "-" and termineted with " " 
+// else the option has "/", "-" or "%" and termineted with " "
+	for(i=0; i<s.size(); i++)
+	{
+		if(isDll || percentOut)
+		{
+			if(s[i] == '/' || s[i] == '-')
+			{
+				if((pos=s.find(" ", i)) >=0)
+				{
+					string arg = s;
+
+					arg.erase(pos, arg.size()-pos);
+					arg.erase(0, i);
+					// remove ""
+					while((n=arg.find("\"", -1)) >= 0)
+						arg.erase(n, 1);
+
+					varg.push_back(arg);
+					i = pos;
+				}
+				else
+				{
+					string arg = s;
+					arg.erase(0, i);
+					// remove ""
+					while((n=arg.find("\"", -1)) >= 0)
+						arg.erase(n, 1);
+
+
+					varg.push_back(arg);
+					break;
+				}
+			}
+		}
+		else
+		{
+			if(s[i] == '/' || s[i] == '-' || s[i] == '%')
+			{
+				if((pos=s.find(" ", i)) >=0)
+				{
+					string arg = s;
+					arg.erase(pos, arg.size()-pos);
+					arg.erase(0, i);
+					// remove ""
+					while((n=arg.find("\"", -1)) >= 0)
+						arg.erase(n, 1);
+
+					varg.push_back(arg);
+					i = pos;
+				}
+				else
+				{
+					string arg = s;
+					arg.erase(0, i);
+					// remove ""
+					while((n=arg.find("\"", -1)) >= 0)
+						arg.erase(n, 1);
+
+					varg.push_back(arg);
+					break;
+				}
+			}
+		}
+	}
+}
+
+
+string TeQtShowMedia :: getSystemKeyValue(HKEY hkey, string key, string value)
+{
+	HKEY    hk;
+	DWORD	DataSize = 1024;
+    DWORD   Type = REG_SZ;
+    char    buf[1024];
+    string  keycmd;
+
+    if (RegOpenKeyEx(hkey, (LPCTSTR)key.c_str(), 0, KEY_READ, &hk) == ERROR_SUCCESS)
+	{
+		memset (buf, 0, 1024);
+		if (RegQueryValueEx(hk, (LPCTSTR)value.c_str(), NULL, &Type, (LPBYTE)buf, &DataSize) == ERROR_SUCCESS)
+
+			keycmd = buf;
+	}
+	if(hk)
+		RegCloseKey (hk);
+	return keycmd;
+
+
+//  key query example:
+//	HKEY key; LONG res;
+//	res = RegOpenKeyEx(HKEY_CURRENT_USER,"Identities",0,KEY_READ,&key);
+//	if (res!=ERROR_SUCCESS) return;
+//	list<string> ids = RegQuerySubkeys(key);
+//	string defid = RegQueryString(key,"Default User ID");
+//	RegCloseKey(key);
+//	if (ids.size()==0) return;
+}
+#endif
+
+void TeQtShowMedia :: slotShowFile(string file)
+{
+    int				pos;
+     string			cmd;
+	vector<string>	varg;
+	string			name = file;
+
+	string tempName = name;
+	pos = tempName.find("/");
+	while(pos >= 0)
+	{
+		tempName.replace(pos, 1, "\\");
+		pos = tempName.find("/");
+	}
+	
+	string	type = tempName;
+	pos = type.rfind(".");
+	if(pos >= 0)
+		type.erase(0, pos);
+	else
+		return;
+
+#ifdef WIN32
+   char	buf[300];
+
+	if (TeConvertToUpperCase (type) == ".EXE")
+	{
+		_spawnl (P_NOWAIT, tempName.c_str(), tempName.c_str(), NULL);
+		return;
+	}
+	// if application is user defined find current application
+	// else use default application
+	string key = "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts\\";
+	key += type;
+
+	string keycmd = getSystemKeyValue(HKEY_CURRENT_USER, key, "Application");
+	if(keycmd.empty() == false)
+	{
+		string com = keycmd;
+		key = "Applications\\" + com + "\\SHELL\\PLAY\\COMMAND";
+		keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+		if(keycmd.empty())
+		{
+			key = "Applications\\" + com + "\\SHELL\\OPEN\\COMMAND";
+			keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			if(keycmd.empty())
+			{
+				key = "Applications\\" + com + "\\SHELL\\EDIT\\COMMAND";
+				keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			}
+		}
+	}
+	else
+	{
+		key = type;
+		keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+		if(keycmd.size() <= 1)
+		{
+			key += "\\SHELL\\PLAY\\COMMAND";
+			keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			if(keycmd.empty())
+			{
+				key = type;
+				key += "\\SHELL\\OPEN\\COMMAND";
+				keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				if(keycmd.empty())
+				{
+					key = type;
+					key += "\\SHELL\\EDIT\\COMMAND";
+					keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				}
+			}
+		}
+		else
+		{
+			memset (buf, 0, 300);
+			strcpy(buf, keycmd.c_str());
+
+			key = buf;
+			key += "\\SHELL\\PLAY\\COMMAND";
+			keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+			if(keycmd.empty())
+			{
+				key = buf;
+				key += "\\SHELL\\OPEN\\COMMAND";
+				keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				if(keycmd.empty())
+				{
+					key = buf;
+					key += "\\SHELL\\EDIT\\COMMAND";
+					keycmd = getSystemKeyValue(HKEY_CLASSES_ROOT, key, "");
+				}
+			}
+		}
+	}
+
+	if(keycmd.empty())
+	{
+		QMessageBox::warning(this, tr("Warning"),
+			tr("The media cannot be shown!\nCheck if there is a program defined to open it."));
+		return;
+	}
+
+// get command and arguments from keycmd
+    getCommand(keycmd, cmd, varg);
+	if((pos = tempName.find(" ")) >= 0)
+		tempName = "\"" + tempName + "\"";
+
+	if (varg.size() == 0)
+		_spawnl (P_NOWAIT, cmd.c_str(), tempName.c_str(), NULL);
+	else if (varg.size() == 1)
+        _spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+	else if (varg.size() == 2)
+	{
+		const char* p = varg[1].c_str();
+		if(varg[1] == "%L" || varg[1] == "%1")
+			_spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), tempName.c_str(), NULL);
+		else
+			_spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, tempName.c_str(), NULL);
+	}
+	else if (varg.size() == 3)
+	{
+		const char* p = varg[1].c_str();
+		const char* p1 = varg[2].c_str();
+		int f = varg[0].find("/prefetch:", -1);
+		if(f >= 0 && (varg[2] == "%L" || varg[2] == "%1"))
+			_spawnl (P_NOWAIT, cmd.c_str(), p, tempName.c_str(), NULL);
+		else
+			_spawnl (P_NOWAIT, cmd.c_str(), varg[0].c_str(), p, p1, tempName.c_str(), NULL);
+	}
+
+#else
+    string command;
+    //Mount the vector of directory paths that are
+    //stored in the PATH environment variable
+    string path =  getenv("PATH");
+    vector<string> dirVector;
+    string dirPath;
+    size_t idx = 0;
+    size_t len = path.find(':', idx);
+    while (len != string::npos)
+    {
+        dirPath = path.substr(idx, len-idx);
+        dirVector.push_back(dirPath);
+        idx = len+1;
+        len = path.find(':', idx);
+    }
+
+
+    // get the last directory path
+    idx = path.rfind(':', path.size());
+    dirPath = path.substr(idx+1, path.size());
+    dirVector.push_back(dirPath);
+       
+	string fs; 
+    if(type != "url")
+	{
+        bool exists = false;
+        for (unsigned int i = 0; i < dirVector.size(); ++i)
+        {
+			fs = dirVector[i] + "/konqueror";
+            QFile file(fs.c_str());
+            if (file.exists() == true)
+            {
+                exists = true;
+                break;
+            }
+        }
+        if (exists == true)
+            command = "konqueror " + name + " &";
+        else
+        {
+			QString msg = tr("The program konqueror used to display your media is not") + "\n";
+			msg += tr("present in your PATH environment variable or KDE is not installed!");
+            QMessageBox::warning(this, tr("Warning"), msg);
+             return;
+        }      
+    }
+    else
+    {
+        unsigned int i;
+        for (i = 0; i < dirVector.size(); ++i)
+        {
+			QString qfs = dirVector[i].c_str();
+			qfs += "/netscape";
+            QFile file(qfs);
+            if (file.exists() == true)
+            {
+                command = "netscape -remote 'openURL(" + name + ")' &";              
+                break;
+            }
+        }
+
+        if (command.empty() == true)
+        {
+            for (i = 0; i < dirVector.size(); ++i)
+            {
+				QString qfs = dirVector[i].c_str();
+				qfs += "/mozilla";
+                QFile file(qfs);
+                if (file.exists() == true)
+                {
+                    command = "mozilla -remote 'openURL(" + name + ")' &";
+                    break;
+                }
+            }
+        }
+         
+        if (command.empty() == true)
+        {
+            for (i = 0; i < dirVector.size(); ++i)
+            {
+				QString qfs = dirVector[i].c_str();
+				qfs += "/konqueror";
+				QFile file(qfs);
+                if (file.exists() == true)
+                {
+                    command = "konqueror " + name + " &";
+                    break;
+                }
+           }
+        }
+        
+        if (command.empty() == true)
+        {
+			QString msg = tr("The program konqueror used to display your media is not") + "\n";
+			msg += tr("present in your PATH environment variable or KDE is not installed!");
+            QMessageBox::warning(this, tr("Warning"), msg);
+             return;
+        }
+    }
+    
+    system(command.c_str());
+#endif
+}
diff --git a/src/terralib/application/qt/TeQtShowMedia.h b/src/terralib/application/qt/TeQtShowMedia.h
new file mode 100644
index 0000000..cdb8cd1
--- /dev/null
+++ b/src/terralib/application/qt/TeQtShowMedia.h
@@ -0,0 +1,77 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTSHOWMEDIA_H
+#define  __TERRALIB_INTERNAL_QTSHOWMEDIA_H
+
+#ifdef WIN32
+#include <windows.h>
+#endif
+#include <TeDatabase.h>
+#include <qtable.h>
+#include <urlWindow.h> 
+#include <mediaDescription.h> 
+#include <qpopupmenu.h>
+#include <TeDatabaseUtils.h>
+#include <TeQtGrid.h>
+#include <string>
+using namespace std;
+
+class TeQtShowMedia : public QTable
+{
+	Q_OBJECT
+	QPopupMenu*			popup_;
+	URLWindow*			urlWindow_;
+	MediaDescription*	descriptionWindow_;
+
+public:
+	int				row_;
+	string			id_;
+	string			table_;
+	TeDatabase*		db_;
+	TeLayer*		layer_;
+	int				nattrs_;
+	bool			cmdLocal_;
+	TeQtShowMedia(QWidget* parent = 0, const char* name = 0);
+
+	~TeQtShowMedia();
+	void moveDown();
+	void init(string objId, TeThemeApplication* theme, TeQtGrid* grid);
+
+protected:
+	bool eventFilter(QObject*, QEvent*);
+#ifdef WIN32
+	void getCommand(string keycom, string& cmd, vector<string>& varg);
+	string getSystemKeyValue(HKEY hkey, string key, string value);
+#endif
+
+public slots:
+	void slotpressed(int, int, int, const QPoint&);
+	void slotDoubleClicked(int, int, int, const QPoint&);
+	void slotShow();
+	void slotShowFile(string file);
+	void slotInsert();
+	void slotInsertURL();
+	void slotRemove();
+	void slotSetDefault();
+	void slotDescription();
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtTable.cpp b/src/terralib/application/qt/TeQtTable.cpp
new file mode 100644
index 0000000..09f7c9d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTable.cpp
@@ -0,0 +1,316 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+************************************************************************************/
+#include "TeQtTable.h"
+#include <qmessagebox.h>
+#include <qapplication.h>
+#include <TeDatabase.h>
+
+TeQtTable::TeQtTable(QWidget* parent, QString name)
+	: QTable(parent, name)
+{
+	gridX_ = -1;
+	gridY_ = -1;
+	iLine_ = -1;
+	fLine_ = -1;
+	iCol_ = -1;
+	fCol_ = -1;
+	gridWidth_  = -1;
+	gridHeight_ = -1;
+	portal_ = 0;
+	db_ = 0;
+	doRepaint_ = true;
+
+	setNumCols(0);
+	setNumRows(0);
+	setSelectionMode(QTable::NoSelection);
+}
+
+TeQtTable::~TeQtTable()
+{
+	if (portal_)
+	{
+		delete portal_;
+		portal_ = 0;
+	}
+}
+
+
+void TeQtTable::openTable (TeDatabase* db, string& table)
+{
+	int i, numRows, nCols;
+
+	doRepaint_ = false; // don�t repaint
+
+	if (table.empty() || db == 0)
+		return;
+
+	db_ = db;
+
+	if (portal_)
+		delete portal_;
+	portal_= db_->getPortal();
+
+	string s = "SELECT * FROM " + table;
+
+	if (!portal_->query(s))
+	{
+		delete portal_;
+		portal_ = 0;
+		return;
+	}
+
+	TeAttributeList attrList = portal_->AttributeList();
+	numRows = portal_->numRows();
+
+	if(numRows <= 0)
+	{
+		numRows = 0;
+		while (portal_->fetchRow(numRows))
+			numRows += 1000;
+		numRows -= 1000;
+
+		portal_->fetchRow(numRows);
+		while (portal_->fetchRow())
+			numRows++;
+	}
+	
+	//get the column names
+	nCols = attrList.size();
+	setNumRows(numRows);
+	setNumCols(nCols);
+
+	for (i = 0; i < nCols; ++i)
+		horizontalHeader()->setLabel(i, attrList[i].rep_.name_.c_str());
+
+	// Set the minimum width of the vertical header of the grid
+	char buf[10];
+	sprintf(buf, "%d", numRows);
+	int minw = strlen(buf) + 1;
+	if (minw < 3)
+		minw = 3;
+	verticalHeader()->setMinimumWidth(minw*9); // supposing char width of 9 pixels
+	setLeftMargin(minw*9);
+
+
+	doRepaint_ = true; // do repaint
+
+	int visibleCols = 0;
+	int scVal = horizontalScrollBar()->value();
+	for(i=0; i<numCols(); i++)
+	{
+		if(visibleWidth() < columnPos(i) - scVal)
+			break;
+		visibleCols++;
+	}
+
+	repaint();
+}
+
+
+void TeQtTable::openSql(TeDatabase* db, string& sql)
+{
+	int i, numRows, nCols;
+
+	doRepaint_ = false; // don�t repaint
+
+	if (sql.empty() || db == 0)
+		return;
+
+	db_ = db;
+
+	if (portal_)
+		delete portal_;
+	portal_= db_->getPortal();
+
+	string s = sql;
+
+	if (!portal_->query(s))
+	{
+		delete portal_;
+		portal_ = 0;
+		return;
+	}
+
+	TeAttributeList attrList = portal_->AttributeList();
+	numRows = portal_->numRows();
+
+	if(numRows <= 0)
+	{
+		numRows = 0;
+		while (portal_->fetchRow())
+			++numRows;
+	}
+	
+	//get the column names
+	nCols = attrList.size();
+	setNumRows(numRows);
+	setNumCols(nCols);
+
+	for (i = 0; i < nCols; ++i)
+		horizontalHeader()->setLabel(i, attrList[i].rep_.name_.c_str());
+
+	// Set the minimum width of the vertical header of the grid
+	char buf[10];
+	sprintf(buf, "%d", numRows);
+	int minw = strlen(buf) + 1;
+	if (minw < 3)
+		minw = 3;
+	verticalHeader()->setMinimumWidth(minw*9); // supposing char width of 9 pixels
+	setLeftMargin(minw*9);
+
+
+	doRepaint_ = true; // do repaint
+
+	int visibleCols = 0;
+	int scVal = horizontalScrollBar()->value();
+	for(i=0; i<numCols(); i++)
+	{
+		if(visibleWidth() < columnPos(i) - scVal)
+			break;
+		visibleCols++;
+	}
+
+	repaint();
+}
+
+void TeQtTable::freePortal()
+{
+	gridX_ = -1;
+	gridY_ = -1;
+	iLine_ = -1;
+	fLine_ = -1;
+	iCol_ = -1;
+	fCol_ = -1;
+	gridWidth_  = -1;
+	gridHeight_ = -1;
+	portal_ = 0;
+	db_ = 0;
+	doRepaint_ = true;
+
+	if (portal_)
+	{
+		delete portal_;
+		portal_ = 0;
+	}
+
+	setNumRows(0);
+	setNumCols(0);
+}
+
+void TeQtTable::drawContents (QPainter *qp, int clipx, int clipy, int clipw, int cliph)
+{
+	if(doRepaint_ == false)
+		return;
+
+	update();
+	QTable :: drawContents(qp, clipx, clipy, clipw, cliph);
+}
+
+void TeQtTable::update ()
+{
+	if(portal_ == 0)
+		return;
+
+	int	i, j;
+
+	int gridY = contentsY();
+	int gridX = contentsX();
+
+	int gridHeight = visibleHeight(); 
+	int gridWidth = visibleWidth(); 
+
+	if (gridX_ == gridX && gridY_ == gridY &&
+		gridHeight_ == gridHeight && 
+		gridWidth_ == gridWidth)
+		return;
+
+	gridX_ = gridX;
+	gridY_ = gridY;
+	gridHeight_ = gridHeight;
+	gridWidth_ = gridWidth;
+		
+// clear cells
+	doRepaint_ = false; // do not repaint
+	if (iLine_ >= 0 && iCol_ >= 0)
+	{
+		for (i = iLine_; i <= fLine_; ++i)
+		{
+			for (j = iCol_; j <= fCol_; ++j)
+			{
+				if(item(i, j))
+					clearCell(i, j);
+			}
+		}
+	}
+
+	iLine_ = rowAt(gridY_);
+	iCol_  = columnAt(gridX_);
+	int visibleLines = rowAt(gridHeight_);
+	if (visibleLines == -1)
+		visibleLines = numRows();
+
+	int visibleCols = 0;
+	int scVal = horizontalScrollBar()->value();
+	for(i=iCol_; i<numCols(); i++)
+	{
+		if(gridWidth_ < columnPos(i) - scVal)
+			break;
+		visibleCols++;
+	}
+
+	if (iLine_ < 0 || iCol_ < 0)
+	{
+		gridX_ = gridY_ = iLine_ = fLine_ = iCol_ = fCol_ = -1;
+		doRepaint_ = true;
+		return;
+	}
+
+	fLine_ = iLine_ + visibleLines;
+	if (fLine_ > numRows() - 1)
+		fLine_ = numRows() - 1;
+	fCol_ = iCol_ + visibleCols - 1;
+
+	for (i = iLine_; i <= fLine_ ; ++i)
+	{
+		if (portal_->fetchRow(i) == false)
+			return;
+
+		string s;
+		for (j = iCol_; j <= fCol_; ++j)
+		{
+			s = portal_->getData(j);
+			setText(i, j, s.c_str());
+
+			if(i == fLine_ && j == fCol_- 1)
+			{
+				doRepaint_ = true; // do repaint
+				updateCell(i, j);
+			}
+		}
+	}
+
+	doRepaint_ = true; // do repaint
+}
+
+
+
+
+
diff --git a/src/terralib/application/qt/TeQtTable.h b/src/terralib/application/qt/TeQtTable.h
new file mode 100644
index 0000000..c6825ae
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTable.h
@@ -0,0 +1,67 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef TEQTTABLE_H
+#define TEQTTABLE_H
+
+#include <qtable.h>
+#include <string>
+using namespace std;
+
+class TeDatabase;
+class TeDatabasePortal;
+
+class TeQtTable : public QTable
+{
+protected:
+	TeDatabase			*db_;
+	TeDatabasePortal	*portal_;
+	int					gridX_, gridY_;
+	int					iLine_, fLine_;
+	int					iCol_, fCol_;
+	int					gridWidth_, gridHeight_;
+	bool				doRepaint_;
+
+	virtual void drawContents (QPainter *qp, int clipx, int clipy, int clipw, int cliph);
+
+	void update();
+
+public:
+
+    TeQtTable(QWidget *parent, QString name);
+
+	virtual ~TeQtTable();
+
+	virtual void endEdit(int row, int col, bool accept, bool replace)
+	{
+		QTable::endEdit(row, col, accept, replace);
+	}
+
+	void openTable(TeDatabase* db, string& table);
+
+	void openSql(TeDatabase* db, string& sql);
+
+	void freePortal();
+
+	TeDatabasePortal* getPortal() {return portal_;}
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtTerraStat.cpp b/src/terralib/application/qt/TeQtTerraStat.cpp
new file mode 100644
index 0000000..a1ed886
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTerraStat.cpp
@@ -0,0 +1,1184 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTElementSet.h"
+#include "TeKernelParams.h"
+#include "TeQtTerraStat.h"
+#include "TeKernelFunctions.h"
+#include "TeStatDataStructures.h"
+#include "TeQtDatabasesListView.h"
+#include "TeImportRaster.h"
+#include "TeQtViewsListView.h"
+#include "TeQtGrid.h"
+#include "TeSTEFunctionsDB.h"
+#include "TeWaitCursor.h"
+#include "TeColorUtils.h"
+#include "TeDatabaseUtils.h"
+#include "TeKernelParams.h"
+#include "TeQtLayerItem.h"
+#include <qobject.h>
+#include <qapplication.h>
+
+
+string getKernelFunction (TeKernelFunctionType t)
+{
+	string result;
+
+	switch (t)
+	{
+		case TeKQuartic:
+      result = QObject::tr("Quartic").latin1();
+			break;
+		case TeKNormal:
+			result = QObject::tr("Normal").latin1();
+			break;
+		case TeKUniform:
+			result = QObject::tr("Uniform").latin1();
+			break;
+		case TeKTriangular:
+			result = QObject::tr("Triangular").latin1();
+			break;
+		case TeKNegExponential:
+			result = QObject::tr("NegExponential").latin1();
+			break;
+	}
+	return result;
+}
+
+string getKernelComputeType (TeKernelComputeType t)
+{
+	string result;
+
+	switch (t)
+	{
+		case TeKDensity:
+			result = QObject::tr("Density").latin1();
+			break;
+		case TeKProbability:
+			result = QObject::tr("Probability").latin1();
+			break;
+		case TeKMovingAverage:
+			result = QObject::tr("Spatial Moving Average").latin1();
+			break;
+	}
+	return result;
+}
+
+string getCombinationType (TeKernelCombinationType /* t */)
+{
+	string result;
+
+  //COMPLETAR---
+
+//	switch (t)
+//	{
+//		case TeNone:
+//			result = "None";
+//			break;
+//  default:
+//    result = "DESCONHECIDO";
+//   break;
+//	}
+	result = "DESCONHECIDO";
+	return result;
+}
+
+
+/**
+ * Retorna legenda para kernel
+ **/
+bool getKernelLegend(TeKernelParams& par, vector<string>& result)
+{
+	string legend = QObject::tr("Kernel parameters").latin1();
+	result.push_back(legend); 
+	string numb = "";
+	
+	legend = QObject::tr("Event theme").ascii()+ numb +" : "+ par.eventThemeName1_ ;
+	result.push_back(legend);
+	
+	if(!par.intensityAttrName1_.empty())
+	{
+		legend = QObject::tr("Attribute name").ascii()+ numb +" : "+ par.intensityAttrTable1_+"."+ par.intensityAttrName1_;
+		result.push_back(legend);
+	}
+
+  if (par.radiusValue1_ > 0) {
+	  legend = QObject::tr("Radius value").ascii()+ numb +" : "+ Te2String(par.radiusValue1_);
+  }
+  else {
+    legend = QObject::tr("Adaptive radius").ascii();
+  }
+  result.push_back(legend);
+
+  legend = QObject::tr("Compute: ").ascii()+getKernelComputeType(par.computeType1_);
+  result.push_back(legend);
+
+  legend = QObject::tr("Function: ").ascii()+getKernelFunction(par.kernelFunction1_);
+  result.push_back(legend);
+
+  /*
+  	if(!eventThemeName2_.empty())
+	{
+		legend = "Combination type : "+ getCombinationType(combinationType_);
+		result.push_back(legend);
+		numb = "1";
+	}
+
+	if(!eventThemeName2_.empty())
+	{
+		legend = "Event theme 2 : "+ eventThemeName2_ ;
+		result.push_back(legend);
+		
+		if(!intensityAttrName2_.empty())
+		{
+			legend = "Intensity attribute name 2 : "+ intensityAttrName2_;
+			result.push_back(legend);
+			legend = "Intensity attribute table 2 : "+ intensityAttrTable2_;
+			result.push_back(legend);
+		}
+
+		legend = "Radius value 2 : "+ Te2String(radiusValue2_);
+		result.push_back(legend);
+	}
+  */
+	return true;
+}
+
+
+/**
+ * Grava uma coluna na tabela de atributos associada a um STOSet.
+ * Nome da coluna eh o mesmo nome da propriedade
+ **/
+bool insertPropertyColumn(TeSTElementSet& stoSet,
+                          const string& tableName,
+                          const string&  columnName) 
+{
+	
+	
+ 	vector<int> index;
+	int ind = stoSet.getAttributeIndex(columnName);
+	if(ind<0)
+	{
+		ind = stoSet.getAttributeIndex(tableName+"."+columnName);
+		if(ind>-1)
+			index.push_back (ind);
+	}
+	else
+		index.push_back (ind);
+  
+	if(!index.empty())
+	{
+		if (!TeUpdateDBFromSet (&stoSet, tableName, &index)) 
+			return false;
+	}
+	else
+	{
+		if (!TeUpdateDBFromSet (&stoSet, tableName)) 
+			return false;
+	}
+	return true;
+}
+
+/**
+ * Grava uma coluna na tabela de atributos associada a um STOSet.
+ * Nome da coluna eh o mesmo nome da propriedade
+ **/
+bool insertPropertyColumn(TeSTStatInstanceSet& stSet,
+                          int idxDoubleProp,
+                          TeTheme* theme,
+                          const string& tableName,
+                          const string& columnName) {
+
+  TeProperty prop;
+
+  prop.attr_.rep_.name_ = columnName;
+  prop.attr_.rep_.type_ = TeREAL;
+  double value;
+  TePropertyVector pVect;
+  pVect.push_back(prop);
+
+  //Constroi um de outro
+  TeSTElementSet rs(theme);
+
+  TeSTStatInstanceSet::iterator ito = stSet.begin();
+  while (ito != stSet.end()) {
+
+    //Cria uma nova propriedade no objeto
+    (*ito).getDoubleProperty(idxDoubleProp, value);
+    pVect[0].value_ = Te2String(value, STAT_PRECISION);
+    (*ito).properties(pVect);
+    rs.insertSTInstance(*ito);
+    ++ito;
+  }
+
+  return insertPropertyColumn(rs, tableName, columnName) ;
+}
+
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOSetFromTheme(TeTheme* theme, 
+                              vector<string>& attributes,
+                              TeSTElementSet* rs) {
+
+  TeSTElementSet newRS(theme);
+
+  if (TeSTOSetBuildDB(&newRS, true, false, attributes) ) {
+    *rs = newRS;
+    return true;
+  }
+  else return false;
+}
+
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOStatSetFromTheme(TeTheme* theme, 
+                               vector<string>& attributes,
+                               int additionalDouble,
+                               TeSTStatInstanceSet* rs) {
+
+  TeSTElementSet stoSet(theme);
+   if (!TeSTOSetBuildDB(&stoSet, true, false, attributes))
+     return false;
+   rs->Copy(stoSet, attributes.size(), additionalDouble);
+   return true;
+
+}
+
+
+
+void TeKernelMethod::error(TeKernelErrorType type, string message, QWidget* parent) {
+
+  QString title;
+  switch (type) {
+  case Uerror:
+	  title = tr("Unexpected Error");
+    break;
+  case Error:
+		title = tr("Error");
+    break;
+  case Warning:
+		title = tr("Warning");
+    break;
+  }
+
+  if (parent) {
+	  QMessageBox::information(parent, title, tr(message.c_str()));
+  }
+  else {
+    QMessageBox::information(0, (title), tr(message.c_str())); 
+  }
+
+}
+
+/**
+ * Defines name, theme pointer and id for a given theme 
+ * id = 0 -- support theme
+ * id = 1,2 -- first and second event theme
+ **/
+bool TeKernelMethod::setTheme(string name, int id, TeView* view) {
+  if (id == 0) {
+    params_.supportThemeName_ = name;
+    regTheme_ = (TeThemeApplication *)view->get(params_.supportThemeName_);
+    if (evTheme1_ == NULL) {
+      return false;
+    }
+    params_.supportThemeId_ = regTheme_->id(); 
+  }
+  else if (id == 1) {
+    params_.eventThemeName1_ = name;
+
+    evTheme1_ = view->get(params_.eventThemeName1_);
+    if (evTheme1_ == NULL) {
+      return false;
+    }
+    params_.eventThemeId1_ = evTheme1_->id();
+    
+  }
+  else if (id == 2) {
+    params_.eventThemeName2_ = name;
+
+    evTheme2_ = view->get(params_.eventThemeName2_);
+    if (evTheme2_ == NULL) {
+      return false;
+    }
+    params_.eventThemeId2_ = evTheme2_->id();
+    
+  }
+  return true;
+}
+
+
+enum TeGridType {GridFromSupport, GridFromEvent, GridFromBoth};
+
+
+/**
+ * Generates support set from parameters
+ *   If grid, generate box
+ *   If theme, generate column
+ **/
+bool TeKernelMethod::generateSupportSet() {
+ 
+  
+  bool isGrid = isGridReg_ || isGridEv_;
+  bool isRatio = (params_.eventThemeId2_ != -1);
+
+  justOnePolygon_ = false;
+
+  //support set is from type TeKernelGridSupport
+  if (isGrid) {
+
+    //Computes grid boundary and defines if just one set.
+    TeGridType t;
+    TeBox      gridBound;
+
+  
+    if (isRatio) {
+      t = GridFromBoth;
+    }
+    else if (isGridEv_) {
+      t = GridFromEvent;
+    }
+    else {
+      t = GridFromSupport;
+    }
+
+    if (db_ == NULL) {
+      error(Uerror, tr("There is no database. Please, contact support!").latin1());
+      return false;
+    }
+
+    TeBox bound1;
+    TeBox bound2;
+    
+    switch(t) {
+    case GridFromSupport:
+      if (regTheme_ == NULL) {
+		error(Uerror, tr("There is no support theme. Please, contact support!").latin1());
+        return false;
+      }
+      gridBound = db_->getThemeBox(regTheme_);
+      break;
+    case GridFromEvent:
+      if (evTheme1_ == NULL) {
+		error(Uerror, tr("There is no event theme. Please, contact support!").latin1());
+        return false;
+      }
+      gridBound = db_->getThemeBox(evTheme1_);
+      break;
+    case GridFromBoth:
+      if ((evTheme1_ == NULL) || (evTheme2_ == NULL)) {
+		error(Uerror, tr("There is no event theme. Please, contact support!").latin1());
+        return false;
+      }
+
+      bound1 = db_->getThemeBox(evTheme1_);
+      bound2 = db_->getThemeBox(evTheme2_);
+    
+      //Box is the rectangle that envolves both boxes
+      gridBound.x1_ = (bound1.x1_ < bound2.x1_) ? bound1.x1_ : bound2.x1_;
+      gridBound.y1_ = (bound1.y1_ < bound2.y1_) ? bound1.y1_ : bound2.y1_;
+      gridBound.x2_ = (bound1.x2_ > bound2.x2_) ? bound1.x2_ : bound2.x2_;
+      gridBound.y2_ = (bound1.y2_ < bound2.y2_) ? bound1.y2_ : bound2.y2_;
+
+      break;
+
+    default:
+		error(Uerror, tr("Invalid type. Please, contact support!").latin1());
+      return false;
+      break;
+    }
+    
+    
+    if (!gridBound.isValid()) {
+		error(Uerror, tr("Invalid grid box. Please, contact support!").latin1());
+        return false;
+    }
+
+
+    //Verifies if it has just one polygon
+    if (t == GridFromSupport) {
+
+      TeDatabasePortal* portal = this->db_->getPortal();
+
+      TeLayer* l = this->regTheme_->layer();
+
+      if (l->hasGeometry(TePOLYGONS))
+      {
+        string count = "SELECT COUNT(*) FROM " + l->tableName(TePOLYGONS);
+        count += ", " + regTheme_->collectionTable() + " WHERE ";
+        count += l->tableName(TePOLYGONS) + ".object_id = ";
+        count += regTheme_->collectionTable() + ".c_object_id";
+        portal->freeResult();
+        if(portal->query(count))
+        {
+          if(portal->fetchRow())
+          {
+            count = portal->getData(0);		
+          }
+          else {
+ 			error(Uerror, tr("There is no polygons. Please, contact support!").latin1());
+          }
+        }
+
+        int nPol = atoi(count.c_str());
+        this->justOnePolygon_ = (nPol == 1);
+		delete portal;
+      }
+    }
+
+    TeProjection* proj = db_->loadProjection(this->evTheme1_->layer()->projection()->id());
+
+    if (proj == NULL) {
+ 			error(Uerror, tr("There is no projection. Please, contact support!").latin1());
+       return false;
+    }
+
+    regSet_ = new TeKernelGridSupport(gridBound, gridCols_, proj);   
+  }
+  //Gera grid irregular a partir de poligonos do layer
+  else {
+    
+    //Define regioes a partir de tema -- aplicar restricao
+    if (regTheme_ == NULL) {
+ 		error(Uerror, tr("There is no support theme. Please, contact support!").latin1());
+      return false;
+    }
+
+	//Generates set from theme
+    vector<string> empty;
+    TeSTStatInstanceSet* rs = new TeSTStatInstanceSet();
+    createSTOStatSetFromTheme(regTheme_, 
+      empty, 1, rs);
+    resName_ = string(this->params_.supportThemeAttr_);
+    regSet_ = rs;
+  }
+  return true;
+}
+
+
+/**
+ * Generates event set from theme. If there is an attribute, set is initialize with it.
+ * Otherwise, just geometries are loaded. Geometries may be points or polygons
+ **/
+bool TeKernelMethod::generateEventSet(int which) {
+
+  bool     isPoint;
+  TeTheme* theme;
+  TeLayer* layer;
+  string   table;
+  string   column;
+    
+  if (which == 1) {
+    isPoint = this->isPoint1_;
+    theme = this->evTheme1_;
+    if (this->evTheme1_ == NULL) {
+ 		error(Uerror, tr("There is no event set for the kernel. Please, contact support!").latin1());
+      return false;
+    }
+    layer = this->evTheme1_->layer();
+    if (layer == NULL) {
+ 		error(Uerror, tr("There is no layer for the theme. Please, contact support!").latin1());
+      return false;
+    }
+    table = this->params_.intensityAttrTable1_;
+    column = this->params_.intensityAttrName1_;
+  }
+  else if (which == 2) {
+    isPoint = this->isPoint2_;
+    theme = this->evTheme2_;
+    if (this->evTheme2_ == NULL) {
+ 		error(Uerror, tr("There is no event set for the kernel. Please, contact support!").latin1());
+      return false;
+    }
+    layer = this->evTheme2_->layer();
+    if (layer == NULL) {
+ 		error(Uerror, tr("There is no layer for the theme. Please, contact support!").latin1());
+      return false;
+    }
+    table = this->params_.intensityAttrTable2_;
+    column = this->params_.intensityAttrName2_;
+  }
+  else {
+ 		error(Uerror, tr("Invalid event set. Please, contact support!").latin1());
+    return false;
+  }
+  
+  TeWaitCursor wait;
+
+  bool done;
+  vector<string> vecAttr;
+  if (column.compare("")) {
+      vecAttr.push_back(column);
+  }
+ if (isPoint) {
+
+    //Generates set from theme
+    TePointTInstanceSet* evs = new TePointTInstanceSet();
+    if (vecAttr.size() == 0) {
+      done =  createSTOStatSetFromTheme(theme, vecAttr, 1, evs);
+      //Deve inicializar com 1 toda a propriedade
+      TePointTInstanceSet::iterator itev = evs->begin();
+      while (itev != evs->end()) {
+        (*itev).setDoubleProperty(0, 1.0);
+        ++itev;
+      }
+    }
+    else {
+      done = createSTOStatSetFromTheme(theme, vecAttr, 0, evs);
+    }
+
+    if (!done)
+      return false;
+    if (which == 1) {
+      evSet1_ = evs;
+    }
+    else {
+      evSet2_ = evs;
+    }
+
+  }
+  else {
+
+      //Generates set from theme
+    TePointTInstanceSet* evs = new TePointTInstanceSet();
+    if (vecAttr.size() == 0) {
+      done =  createSTOStatSetFromTheme(theme, vecAttr, 1, evs);
+      //Deve inicializar com 1 toda a propriedade
+      TePointTInstanceSet::iterator itev = evs->begin();
+      while (itev != evs->end()) {
+        (*itev).setDoubleProperty(0, 1.0);
+        ++itev;
+      }
+  }
+  else {
+      done = createSTOStatSetFromTheme(theme, vecAttr, 0, evs);
+    }
+    if (!done)
+      return false;
+    if (which == 1) {
+      evSet1_ = evs;
+    }
+    else {
+      evSet2_ = evs;
+    }
+  }
+  return true;
+}
+
+
+bool TeKernelMethod::call() 
+{
+  bool isGrid = this->isGridEv_ || this->isGridReg_;
+  bool isRatio = this->params_.eventThemeName2_.compare("");
+
+//  bool justOnePolygon = false;
+
+  double totalArea;
+  if (isGrid)  {
+    totalArea = ((TeKernelGridSupport *)regSet_)->totalArea();
+  }
+  else {
+    //SUBSTITUIR
+    totalArea = TeGeometryArea(db_->getThemeBox(regTheme_));
+  }
+
+  int  totalRegions;
+  if (isGrid) {
+      totalRegions = ((TeKernelGridSupport *)regSet_)->numObjects();
+  }
+  else {
+      totalRegions = ((TeSTStatInstanceSet *)regSet_)->numObjects();
+  }
+
+  if (TeProgress::instance())
+  {
+		TeProgress::instance()->setTotalSteps(totalRegions);
+  }
+
+  //Kernel de razao
+  if (isRatio) {
+   
+   
+    TeStatKernelRatio kerRatio;
+    kerRatio.numReg_ = totalRegions;
+    kerRatio.kComb_ = params_.combinationType_;
+    kerRatio.ktype_ = params_.computeType1_;
+    kerRatio.kfunc1_ = params_.kernelFunction1_;
+    kerRatio.radius1_ = params_.radiusValue1_;
+    kerRatio.kfunc2_ = params_.kernelFunction2_;
+    kerRatio.radius2_ = params_.radiusValue2_;
+    kerRatio.totalArea_ = totalArea;
+
+
+    //Colocar janela com parametros para o usuario confirmar
+
+    if (isGrid) {
+      //Verifica se o iterador eh para um unico poligono
+      if (justOnePolygon_) {
+        TeDatabasePortal* portal = db_->getPortal();
+
+        string count = "SELECT c_object_id FROM " + regTheme_->layer()->tableName(TePOLYGONS)+",";
+        count += regTheme_->collectionTable() + " WHERE ";
+        count += regTheme_->layer()->tableName(TePOLYGONS) + ".object_id = ";
+        count += regTheme_->collectionTable() + ".c_object_id";
+        portal->freeResult();
+        if(portal->query(count))
+        {
+          if(portal->fetchRow())
+          {
+            count = portal->getData(0);		
+          }
+          else {
+ 			      error(Uerror, tr("There is no polygons. Please, contact support!").latin1());
+            return false;
+          }
+        }
+		    delete portal;
+        TePolygonSet polygon;
+        if (!regTheme_->layer()->loadGeometrySet(count, polygon)) {
+ 		    	error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+          return false;
+        }
+        boundary_ = polygon.first();
+        if (boundary_.empty()) {
+ 		    	error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+          return false;
+        }
+        return kerRatio.apply(*((TePointTInstanceSet *)evSet1_),
+            *((TePointTInstanceSet *)evSet2_),
+            (*((TeKernelGridSupport *)regSet_)).begin(boundary_), 
+            (*((TeKernelGridSupport *)regSet_)).end(boundary_));
+      }
+      else {
+        return kerRatio.apply(*((TePointTInstanceSet *)evSet1_),
+            *((TePointTInstanceSet *)evSet2_),
+            (*((TeKernelGridSupport *)regSet_)).begin(), 
+            (*((TeKernelGridSupport *)regSet_)).end());
+      }
+    }
+    else {
+       return kerRatio.apply(*((TePointTInstanceSet *)evSet1_), 
+         *((TePointTInstanceSet *)evSet2_),
+          (*((TeSTStatInstanceSet *)regSet_)).begin(), 
+          (*((TeSTStatInstanceSet *)regSet_)).end());
+    }
+  }  
+  //Kernel normal com um unico conjunto
+  else {
+   
+    TeStatKernel kernel;
+    kernel.radius_ = params_.radiusValue1_;
+    kernel.kfunc_ =  params_.kernelFunction1_;
+    kernel.ktype_ = params_.computeType1_;
+    kernel.totalArea_ = totalArea;
+    kernel.numReg_ = totalRegions;
+
+    //Colocar janela com parametros para o usuario confirmar
+
+    if (isGrid) {
+      //Verifica se o iterador eh para um unico poligono
+      if (justOnePolygon_) {
+        TeDatabasePortal* portal = db_->getPortal();
+
+        string count = "SELECT c_object_id FROM " + regTheme_->layer()->tableName(TePOLYGONS)+",";
+        count += regTheme_->collectionTable() + " WHERE ";
+        count += regTheme_->layer()->tableName(TePOLYGONS) + ".object_id = ";
+        count += regTheme_->collectionTable() + ".c_object_id";
+        portal->freeResult();
+        if(portal->query(count))
+        {
+          if(portal->fetchRow())
+          {
+            count = portal->getData(0);		
+          }
+          else {
+ 			      error(Uerror, tr("There is no polygons. Please, contact support!").latin1());
+            return false;
+          }
+        }
+		    delete portal;
+        TePolygonSet polygon;
+        if (!regTheme_->layer()->loadGeometrySet(count, polygon)) {
+ 		    	error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+          return false;
+        }
+        boundary_ = polygon.first();
+        if (boundary_.empty()) {
+ 		    	error(Uerror, tr("There is no polygon boundary. Please, contact support!").latin1());
+          return false;
+        }
+        return kernel.apply(*((TePointTInstanceSet *)evSet1_),
+            (*((TeKernelGridSupport *)regSet_)).begin(boundary_), 
+            (*((TeKernelGridSupport *)regSet_)).end(boundary_));
+      }
+      else {
+        return kernel.apply(*((TePointTInstanceSet *)evSet1_),
+            (*((TeKernelGridSupport *)regSet_)).begin(), 
+            (*((TeKernelGridSupport *)regSet_)).end());
+      }
+    }
+    else {
+       return kernel.apply(*((TePointTInstanceSet *)evSet1_), 
+          (*((TeSTStatInstanceSet *)regSet_)).begin(), 
+          (*((TeSTStatInstanceSet *)regSet_)).end());
+    }
+  }  
+  return true;
+}
+
+ 
+
+/**
+ * Apply kernel method based on parameters definition
+ *   Create event(s) set
+ *   Create support set
+ *   Execute suitable kernel method (basic, adaptive, ratio)
+ *   Returns support set region
+ **/
+bool TeKernelMethod::apply(void*& supportSet, QWidget* parent) 
+{
+	precision_ = -1;
+
+	//Verifies if there is an event theme
+	if (this->evTheme1_ == NULL) {
+		error(Uerror, tr("There is no event set for the kernel. Please, contact support!").latin1());
+		return false;
+	}
+
+	//Verifies if all themes are in the same projection
+	TeProjection* ev1 = this->evTheme1_->layer()->projection();
+	if (this->regTheme_ != NULL) {
+		TeProjection* reg = this->regTheme_->layer()->projection();
+		if (!(*reg == *ev1)) {
+			error(Warning,tr("All of the themes should be in the same projection!").latin1(),parent);
+			return false;
+		}
+	}
+
+	if (this->evTheme2_ != NULL) {
+		TeProjection* ev2 = this->evTheme2_->layer()->projection();
+		if (!(*ev1 == *ev2)) {
+			error(Warning,tr("All of the themes should be in the same projection!").latin1(),parent);
+			return false;
+		}
+	}
+
+	if (TeProgress::instance())
+	{
+		TeProgress::instance()->setTotalSteps(4);
+		TeProgress::instance()->setMessage(tr("Generating the support set...").latin1());
+		TeProgress::instance()->setProgress(1);
+	}
+	
+	// Generates support set
+	if (!this->generateSupportSet() ) {
+		if (TeProgress::instance())
+			TeProgress::instance()->reset();
+		error(Error, tr("It was not possible to create the support set!").latin1(), parent);
+		return false;
+	}
+	if (TeProgress::instance()) {
+		if (TeProgress::instance()->wasCancelled() ) {
+			TeProgress::instance()->reset();
+			return false;
+		}
+		else 
+		{
+			TeProgress::instance()->setMessage(tr("Generating the event set...").latin1());
+			TeProgress::instance()->setProgress(2);
+		}
+	}
+
+	// Generates first event set
+	if (!this->generateEventSet(1)) {
+		if (TeProgress::instance())
+			TeProgress::instance()->reset();
+		error(Error, tr("It was not possible to create the event set!").latin1(),parent);
+		return false;
+	}
+
+	if (TeProgress::instance()) {
+		if (TeProgress::instance()->wasCancelled()) {
+			TeProgress::instance()->reset();
+			return false;
+		}
+		else
+			TeProgress::instance()->setTotalSteps(4);
+	}
+
+
+	// Generates second event set
+	if (this->evTheme2_ != NULL) {
+		if (TeProgress::instance())
+		{
+			TeProgress::instance()->setTotalSteps(5);
+			TeProgress::instance()->setMessage(tr("Generating second event set...").latin1());
+			TeProgress::instance()->setProgress(3);
+		}
+		if (!this->generateEventSet(2)) {
+			if (TeProgress::instance())
+				TeProgress::instance()->reset();
+			error(Error, tr("It was not possible to create the event set 2!").latin1(),parent);
+			return false;
+		}
+	}
+
+	if (TeProgress::instance())
+	{
+		TeProgress::instance()->setTotalSteps(5);
+		TeProgress::instance()->setMessage(tr("Calculating Kernel Map...").latin1());
+		TeProgress::instance()->setProgress(4);
+	}
+
+	// Calls kernel functions
+	bool okKernel = this->call();
+	if (okKernel) 
+		supportSet = this->regSet_;
+
+  //Deallocate temporary values
+  if (this->evSet1_ != NULL)
+  {
+      delete (TePointTInstanceSet *)this->evSet1_;
+  }
+
+  if (this->evSet2_ != NULL)
+  {
+     delete (TePointTInstanceSet *)this->evSet2_;
+  }
+//    delete this->evSet2_;
+
+	return okKernel;
+}
+
+
+
+bool TeKernelMethod::getPrecision(int& prec) {
+
+  //Precisao ja foi calculada
+  if (precision_ >= 0) {
+    prec= precision_;
+    return true;
+  }
+
+  bool isGrid = isGridReg_ || isGridEv_;
+  if (isGrid) {
+    if (justOnePolygon_) {
+      if (this->getPrecision((*((TeKernelGridSupport *)regSet_)).begin(boundary_), 
+        (*((TeKernelGridSupport *)regSet_)).end(boundary_))) {
+        prec = precision_;
+        return true;
+      }
+      else
+        return false;
+    }
+    else {
+      if (this->getPrecision((*((TeKernelGridSupport *)regSet_)).begin(), 
+        (*((TeKernelGridSupport *)regSet_)).end())) {
+        prec = precision_;
+        return true;
+      }
+      else
+        return false;
+    }
+  }
+  if (this->getPrecision((*((TeSTStatInstanceSet *)regSet_)).begin(), 
+    (*((TeSTStatInstanceSet *)regSet_)).end())) {
+    prec = precision_;
+    return true;
+  }
+  else {
+    return false;
+  }
+
+}
+
+bool TeKernelMethod::setGridLayer(string name) {
+
+  this->resName_ = name;
+  this->gridLayer_ = NULL;
+
+  // Check whether there is a layer with this name in the database
+  TeLayerMap& layerMap = db_->layerMap();
+  TeLayerMap::iterator it;
+  for (it = layerMap.begin(); it != layerMap.end(); ++it)
+  {
+    if (it->second->name() == name)
+    {
+      this->gridLayer_ = it->second;
+      this->params_.generatedLayerId_ = it->second->id();
+      break;
+    }
+  }
+
+  //Vai criar uma nova -- verifica se nome esta ok
+  if (!gridLayer_)
+  {
+    size_t pos = name.find("-",string::npos,1);
+    if (pos != string::npos)
+    {
+		QMessageBox::warning( NULL, tr("Error"), 
+			tr("The layer name cannot have the \"-\" character!"));
+      return false;
+    }
+    char ch = name.at(0);
+    if (isdigit(ch))
+    {
+		QMessageBox::information( NULL, tr("Error"),
+			tr("The layer name cannot have numerical characters!"));
+      return false;
+    }
+  }
+
+  return true;
+}
+
+
+bool TeKernelMethod::createLayer(TeRaster* raster,
+                                 TerraViewBase* mWindow)
+{
+ 
+  TeQtDatabasesListView* dbView = mWindow->getDatabasesListView();
+  if (!isNewLayer())  {
+
+    //Recupera item associado ao layer para poder remover 
+    TeQtLayerItem* lItPrev = dbView->currentLayerItem();
+    dbView->selectLayerItem(gridLayer_);
+    TeQtLayerItem* layerItem = dbView->currentLayerItem();
+    if (lItPrev != layerItem) {
+      mWindow->removeItem((TeQtCheckListItem*)layerItem);
+      if (lItPrev != NULL)
+        dbView->selectLayerItem(lItPrev->getLayer());
+    }
+    else {
+      mWindow->removeItem(layerItem);
+    }
+  }
+  TeLayer* l = new TeLayer(resName_, db_, raster->projection());
+  int bw, bh;
+  if (raster->params().ncols_ > 512)
+  {
+	  bw = 256;
+	  bh = 256;
+  }
+  else
+  {
+	  bw = raster->params().ncols_;
+	  bh = raster->params().nlines_;
+  }
+  if (!TeImportRaster(l,raster,bw,bh, TeNoCompression,"", -TeMAXFLOAT, true, TeNoExpansible))
+  {  
+    return false;
+  }
+  
+  params_.generatedLayerId_ = l->id();
+  
+  TeQtDatabaseItem *dbItem = dbView->currentDatabaseItem();
+  
+  TeQtLayerItem *layerItem = 
+    new TeQtLayerItem((QListViewItem*)dbItem,l->name().c_str(), l);
+  layerItem->setEnabled(true);
+  if (!dbView->isOpen(layerItem->parent()))
+				dbView->setOpen(layerItem->parent(),true);
+  mWindow->checkWidgetEnabling();
+
+  //Verifica se existe tema com mesmo nome e remove
+  vector<TeViewNode*>& themeVec = mWindow->currentView()->themes();
+  TeThemeApplication* theme;
+  unsigned int i;
+  for (i = 0; i < themeVec.size(); i++) {
+    theme = (TeThemeApplication *)themeVec[i];
+    if (!resName_.compare(theme->name())) {
+      TeQtViewsListView* viewList = mWindow->getViewsListView();
+      TeQtThemeItem* themeItem = viewList->getThemeItem(theme);
+      if (themeItem != NULL)
+        mWindow->removeItem((TeQtCheckListItem*)themeItem);
+    }
+  }
+
+	TeAttrTableVector ATV;
+  if (! mWindow->createTheme(resName_, mWindow->currentView(), l, "", ATV))
+    return false;
+
+
+  //Recupera apontador para o tema criado
+
+  themeVec = mWindow->currentView()->themes();
+  for (i = 0; i < themeVec.size(); i++) {
+    theme = (TeThemeApplication *)themeVec[i];
+    if (!resName_.compare(theme->name())) {
+      this->rasterTheme_ = theme;
+    }
+  }
+  if (this->rasterTheme_ == NULL) {
+      QMessageBox::information( NULL, tr("Error"),
+		  tr("There is no theme with the raster representation!"));
+      return false;
+  }
+  return true;
+}
+
+bool TeKernelMethod::createColumn(TeThemeApplication* currTheme,
+                         TeQtGrid* grid) 
+{
+
+	grid->clear();
+	if(!insertPropertyColumn(*((TeSTStatInstanceSet *)this->regSet_),
+      0, this->regTheme_, params_.supportThemeTable_, params_.supportThemeAttr_))
+	  return false;
+
+	 // ---------------------------------------------- load updated table from database 
+	// Update all the themes that uses this table
+	TeViewMap& viewMap = this->db_->viewMap();
+	TeViewMap::iterator it;
+	set<TeLayer*> layerSet;
+	for (it = viewMap.begin(); it != viewMap.end(); ++it)
+	{
+		TeView *view = it->second;
+		vector<TeViewNode*>& themesVector = view->themes();
+		for (unsigned int i = 0; i < themesVector.size(); ++i)
+		{
+			TeTheme *theme = (TeThemeApplication*)themesVector[i];
+			if (theme->isThemeTable(params_.supportThemeTable_) == true)
+			{
+				theme->loadThemeTables();
+				layerSet.insert(theme->layer());
+			}
+		}
+	}
+
+	// Update the layer tables affected
+	set<TeLayer*>::iterator setIt;
+	for (setIt = layerSet.begin(); setIt != layerSet.end(); ++setIt)
+		(*setIt)->loadLayerTables();
+
+	// ---------------------------------------------- grid 
+	if(currTheme!= NULL)
+	{
+		grid->init(currTheme);
+		grid->refresh();
+		grid->goToLastColumn();
+	}
+
+	return true;
+}
+
+//Alterando pois soh precisa internamente
+bool TeKernelMethod::createKernelLegends(int nColors, bool /* color */)
+{
+  	int precision;
+	if (!getPrecision(precision)) 
+	{
+		QMessageBox::critical(NULL, tr("Error"), 
+		tr("Unexpected error in the evaluation of the kernel precision!"));
+		return false;
+	}
+  
+	// recupera o tema sobre o qual foi calculado kernel
+	TeThemeApplication* theme;
+	if (this->rasterTheme_ != NULL)
+		theme = this->rasterTheme_;
+	else
+		theme = this->regTheme_;
+
+	TeAttributeRep rep;				  
+	rep.type_ = TeREAL;
+
+	TeGrouping* groupKernel = new TeGrouping();
+	groupKernel->groupNumSlices_ = nColors;
+	groupKernel->groupPrecision_ = precision;
+
+	if (theme->layer()->geomRep() & TeRASTER)    // suporte foi grade
+	{
+		groupKernel->groupMode_ = TeRasterSlicing;
+		rep.name_ = "0";
+	}
+	else										// suporte foi regioes
+	{
+		groupKernel->groupMode_ = TeEqualSteps;
+		rep.name_ = this->params_.supportThemeTable_ + "." + this->params_.supportThemeAttr_;
+	}
+	groupKernel->groupAttribute_ = rep;
+
+	if (!theme->buildGrouping(groupKernel))
+		return false;
+  
+	theme->groupColor("Cy-G-Y-Or-R");
+	vector<string> colorRamp;
+	colorRamp.push_back("CYAN");
+	colorRamp.push_back("GREEN");
+	colorRamp.push_back("YELLOW");
+	colorRamp.push_back("ORANGE");
+	colorRamp.push_back("RED");
+
+	// cria rampa de cores default para dados de kernel e define visual de cada fatia
+	vector<TeColor> colorGrad;
+	getColors(colorRamp,10, colorGrad);
+	for (int g=0; g<theme->grouping()->groupNumSlices_; g++)
+	{
+		TeVisual visual(TePOLYGONS);            
+		visual.color(colorGrad[g]);
+		if((theme->layer()->geomRep() & TePOLYGONS) || 
+		   (theme->layer()->geomRep() & TeCELLS) || 
+		   (theme->layer()->geomRep() & TeRASTER))
+		{
+			visual.transparency(theme->defaultLegend().visual(TePOLYGONS).transparency());
+			visual.contourStyle(theme->defaultLegend().visual(TePOLYGONS).contourStyle());
+			visual.contourWidth(theme->defaultLegend().visual(TePOLYGONS).contourWidth());
+			visual.contourColor(theme->defaultLegend().visual(TePOLYGONS).contourColor());	
+			theme->setGroupingVisual(g+1,visual,TePOLYGONS);
+		}
+		if(theme->layer()->geomRep() & TeLINES)
+		{
+			visual.style(theme->defaultLegend().visual(TeLINES).style());
+			visual.width(theme->defaultLegend().visual(TeLINES).width());
+			theme->setGroupingVisual(g+1,visual,TeLINES);
+		}
+		else if(theme->layer()->geomRep() & TePOINTS)
+		{
+			visual.style(theme->defaultLegend().visual(TePOINTS).style());
+			visual.size(theme->defaultLegend().visual(TePOINTS).size());
+			theme->setGroupingVisual(g+1,visual,TePOINTS);
+		}
+	}
+	colorGrad.clear();
+
+	// acrescenta algumas informacoes relativas ao theme application
+	theme->countObj(false);
+	theme->mixColor(true);
+	theme->groupColorDir(TeColorAscSatEnd);
+	if (!theme->saveGrouping())
+		return false;
+	
+	theme->visibleRep(theme->visibleRep() | 0x40000000);
+	updateThemeApplication(this->db_,theme);
+
+	if (this->rasterTheme_ != NULL)
+		theme->setAlias("0",tr("Kernel Values").latin1());
+	return true;
+}
+
diff --git a/src/terralib/application/qt/TeQtTerraStat.h b/src/terralib/application/qt/TeQtTerraStat.h
new file mode 100644
index 0000000..2e53273
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTerraStat.h
@@ -0,0 +1,207 @@
+#ifndef  __TERRALIB_INTERNAL_QTTERRASTAT_H
+#define  __TERRALIB_INTERNAL_QTTERRASTAT_H
+/***
+ * Implementa suporte para as funcoes do TerraStat
+ * Objetivo -- soh nao manter a parte de geracao de eventos,
+ * etc no ui, que podera ser reaproveitado.
+ ****/
+
+#include "TeDatabase.h"
+#include "TeKernelParams.h"
+#include <qmessagebox.h>
+#include <terraViewBase.h>
+
+
+#define STAT_PRECISION   12
+/////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////
+
+class TeSTElementSet;
+class TeSTStatInstanceSet;
+
+/**
+ * Grava uma coluna na tabela de atributos associada a um STOSet.
+ * Nome da coluna eh o mesmo nome da propriedade
+ **/
+bool insertPropertyColumn(TeSTElementSet& stoSet,
+                          const string& tableName,
+                          const string& columnName);
+
+bool insertPropertyColumn(TeSTStatInstanceSet& stSet,
+                          int idxDoubleProp,
+                          TeTheme* theme,
+                          const string& tableName,
+                          const string& columnName);
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOSetFromTheme(TeTheme* theme, 
+                              vector<string>& attributes,
+                              TeSTElementSet* rs);
+
+
+/***
+ * Cria um STOSet a partir de um tema e um conjunto de atributos,
+ * colocando todas as tabelas do TEMA
+ ***/
+bool createSTOStatSetFromTheme(TeTheme* theme, 
+                               vector<string>& attributes,
+                               int additionalDouble,
+                               TeSTStatInstanceSet* rs);
+
+ 
+enum TeKernelErrorType {Uerror, Error, Warning};
+
+
+///Retorna legenda do kernel
+bool getKernelLegend(TeKernelParams& par, vector<string>& legend);
+
+/** Classe para aplicar o metodo de Kernel **/
+class TeKernelMethod : public QWidget {
+
+	Q_OBJECT
+
+protected:
+    TeTheme*                  evTheme1_;
+    TeTheme*                  evTheme2_;
+    TeThemeApplication*       regTheme_;
+    TeThemeApplication*       rasterTheme_;
+
+
+    /**
+     * Pointers to containers -- void since different types may apply
+     * should dispose them
+     **/
+    void*          evSet1_;
+    void*          evSet2_;
+    void*          regSet_;
+    int            precision_;
+    TeLayer*       gridLayer_;
+    bool           justOnePolygon_;
+    TePolygon      boundary_;
+
+    bool           call();
+    bool           generateEventSet(int which);
+    bool           generateSupportSet();
+    void           error(TeKernelErrorType type, string message, 
+						QWidget* parent = 0);
+
+
+    //Calcula a precisao para um conjunto de valores
+    template<typename SetIt> 
+    bool           getPrecision(SetIt itBegin, SetIt itEnd) {
+      
+      
+      SetIt it = itBegin;
+      
+      double max = -TeMAXFLOAT;
+      double min = TeMAXFLOAT;
+      
+      double kValue;
+      while (it != itEnd) {
+        
+        if ((*it).getDoubleProperty(0, kValue)) {
+          if (kValue > max)
+            max = kValue;
+          if ((kValue > 0) && (kValue < min))
+            min = kValue;
+        }
+        ++it;
+      }
+      
+      if (min == TeMAXFLOAT)
+        return false;
+      if (max == -TeMAXFLOAT)
+        return false;
+
+      double diff = max - min;
+
+      double prec = log10(diff);
+      //Diferenca esta antes da virgula
+      if (prec > 0) {
+        precision_ = 2;
+      }
+      else {
+        precision_ = (int)(ceil(fabs(prec)) + 3);
+      }
+      return true;
+    }
+    
+
+public:
+
+    TeKernelParams params_;
+
+    /** Geracao de conjuntos **/
+    bool           isPoint1_;
+    bool           isPoint2_;
+
+    bool           isGridEv_;
+    bool           isGridReg_;
+    int            gridCols_;
+    TeDatabase*    db_;
+    string         resName_; //Nome do layer ou da coluna gerada
+
+    TeKernelMethod():
+		evTheme1_(0),
+		evTheme2_(0),
+		regTheme_(0),
+		rasterTheme_(0),
+		evSet1_(0),
+		evSet2_(0),
+		regSet_(0),
+		precision_(-1),
+		isPoint1_(true),
+		isPoint2_(true),
+		isGridEv_(false),
+		isGridReg_(false),
+		gridCols_(0),
+		db_(0)
+		{}
+
+    //Recupera tema e inicializa os parametros necessarios
+    bool setTheme(string name, int id, TeView* view); 
+
+    //Define nome de layer para criacao de grid
+    bool setGridLayer(string name);
+
+    //Verifica se layer eh nova
+    bool isNewLayer() {
+      return gridLayer_ == NULL;
+    }
+
+    //Cria layer de grid para criar uma nova
+    bool createLayer(TeRaster* raster, TerraViewBase* mWindow);
+
+    bool createColumn(TeThemeApplication* currTheme, TeQtGrid* grid);
+
+    //Aplica o metodo de kernel
+    bool apply(void*& regSet, QWidget* parent);
+
+    //Recupera precisao dos dados
+    //Definida como prec(max - min) + 3
+    bool getPrecision(int& prec);
+
+    TeTheme* getTheme(int id) {
+      if (id == 0)
+        return (TeTheme *)regTheme_;
+      if (id == 1)
+        return evTheme1_;
+      if (id == 2)
+        return evTheme2_;
+      return NULL;
+    }
+
+    bool createKernelLegends(int nColors, bool color);
+
+	TeThemeApplication* regTheme()
+	{	return regTheme_; }
+
+	TeThemeApplication* rasterTheme()
+	{	return rasterTheme_; }
+
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtTextEdit.cpp b/src/terralib/application/qt/TeQtTextEdit.cpp
new file mode 100644
index 0000000..03f3a78
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTextEdit.cpp
@@ -0,0 +1,862 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtTextEdit.h>
+#include <TeDefines.h>
+
+TeQtTextEdit::TeQtTextEdit()
+{
+	canvas_ = 0;
+	edit_ = false;
+	mode_ = 0;
+}
+
+TeQtTextEdit::TeQtTextEdit(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas)
+{
+	edit_ = true;
+	mode_ = 0;
+	canvas_ = canvas;
+	text_ = tx;
+	visual_ = v;
+	change();
+}
+
+TeQtTextEdit::~TeQtTextEdit ()
+{
+}
+
+void 
+TeQtTextEdit::change(QPoint p, bool apxAngle)
+{
+	double angle, dx, dy;
+
+	if(mode_ == 1) // change angle from left
+	{
+		dx = -(p.x() - pCenter_.x());
+		dy = p.y() - pCenter_.y();
+
+		if(apxAngle)
+		{
+			double fdx = fabs(dx);
+			double fdy = fabs(dy);
+			if(fdx < fdy)
+			{
+				if(4*fdx < fdy)
+					dx = 0.;
+				else
+				{
+					fdx = fdy;
+					if(dx >= 0)
+						dx = fdx;
+					else
+						dx = -fdx;
+				}
+			}
+			else
+			{
+				if(4*fdy < fdx)
+					dy = 0.;
+				else
+				{
+					fdy = fdx;
+					if(dy >= 0)
+						dy = fdy;
+					else
+						dy = -fdy;
+				}
+			}
+		}
+		if(dx == 0)
+		{
+			if(dy > 0)
+				angle = 90;
+			else
+				angle = 270;
+		}
+		else
+		{
+			if(dx > 0)
+				angle = atan(dy/dx) * 180. / TePI;
+			else
+				angle = atan(dy/dx) * 180. / TePI + 180;
+		}
+		text_.setAngle(angle);
+	}
+	else if(mode_ == 2) // change angle from right
+	{
+		dx = p.x() - pCenter_.x();
+		dy = -(p.y() - pCenter_.y());
+
+		if(apxAngle)
+		{
+			double fdx = fabs(dx);
+			double fdy = fabs(dy);
+			if(fdx < fdy)
+			{
+				if(4*fdx < fdy)
+					dx = 0.;
+				else
+				{
+					fdx = fdy;
+					if(dx >= 0)
+						dx = fdx;
+					else
+						dx = -fdx;
+				}
+			}
+			else
+			{
+				if(4*fdy < fdx)
+					dy = 0.;
+				else
+				{
+					fdy = fdx;
+					if(dy >= 0)
+						dy = fdy;
+					else
+						dy = -fdy;
+				}
+			}
+		}
+		if(dx == 0)
+		{
+			if(dy > 0)
+				angle = 90;
+			else
+				angle = 270;
+		}
+		else
+		{
+			if(dx > 0)
+				angle = atan(dy/dx) * 180. / TePI;
+			else
+				angle = atan(dy/dx) * 180. / TePI + 180;
+		}
+		text_.setAngle(angle);
+	}
+	else if(mode_ == 3 || mode_ == 4) // change size
+	{
+		if(visual_.fixedSize() == false)
+		{
+			double dx = fabs(double(pCenter_.x() - p.x()));
+			double dy = fabs(double(pCenter_.y() - p.y()));
+			int h = apx(sqrt(dx*dx + dy*dy));
+
+			double dh, hc, c = 1.;
+
+			hc = h * c;
+			dh = canvas_->mapVtoDW((int)hc);
+			text_.setHeight(dh);
+			QRect r = canvas_->textRect (text_, visual_);
+			while(r.height()/2 <= h-1)
+			{
+				c *= 1.01;
+				hc = h * c;
+				dh = canvas_->mapVtoDW((int)hc);
+				text_.setHeight(dh);
+				r = canvas_->textRect (text_, visual_);
+			}
+		}
+	}
+	else if(mode_ == 5) // change position
+	{
+		TeCoord2D pt = canvas_->mapVtoDW(p);
+		text_.add(pt);
+	}
+	change();
+}
+
+void 
+TeQtTextEdit::init(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas)
+{
+	edit_ = true;
+	mode_ = 0;
+	canvas_ = canvas;
+	text_ = tx;
+	visual_ = v;
+	change();
+}
+
+void 
+TeQtTextEdit::change()
+{
+	QRect rect = canvas_->textRect(text_, visual_);
+
+	pCenter_ = rect.center();
+
+	pLeft_ = rect.center();
+	pLeft_.setX(rect.left()+3);
+
+	pRight_ = rect.center();
+	pRight_.setX(rect.right()-3);
+
+	pTop_ = rect.center();
+	pTop_.setY(rect.top()+3);
+
+	pBottom_ = rect.center();
+	pBottom_.setY(rect.bottom()-3);
+
+	double angle = text_.angle();
+	if(angle == 0)
+	{
+//		canvas_->plotOnWindow();
+//		canvas_->plotTextRects(text_, visual_);
+//		canvas_->plotOnPixmap0();
+		return;
+	}
+
+	int	nx, ny;
+	double	d;
+
+	d = fabs(double(pRight_.x() - pCenter_.x()));
+	nx = pCenter_.x() + apx(cos(angle*TePI/180.) * d);
+	ny = pCenter_.y() - apx(sin(angle*TePI/180.) * d);
+	pRight_ = QPoint(nx, ny);
+
+	d = fabs(double(pLeft_.x() - pCenter_.x()));
+	nx = pCenter_.x() + apx(cos((180.+angle)*TePI/180.) * d);
+	ny = pCenter_.y() - apx(sin((180.+angle)*TePI/180.) * d);
+	pLeft_ = QPoint(nx, ny);
+
+	d = fabs(double(pTop_.y() - pCenter_.y()));
+	nx = pCenter_.x() + apx(cos((90.+angle)*TePI/180.) * d);
+	ny = pCenter_.y() - apx(sin((90.+angle)*TePI/180.) * d);
+	pTop_ = QPoint(nx, ny);
+
+	d = fabs(double(pBottom_.y() - pCenter_.y()));
+	nx = pCenter_.x() + apx(cos((270.+angle)*TePI/180.) * d);
+	ny = pCenter_.y() - apx(sin((270.+angle)*TePI/180.) * d);
+	pBottom_ = QPoint(nx, ny);
+
+//	canvas_->plotTextRects(text_, visual_);
+}
+
+int
+TeQtTextEdit::apx(double d)
+{
+	if(d >= 0)
+		return (int)(d+.5);
+	else
+		return (int)(d-.5);
+}
+
+int
+TeQtTextEdit::located(QPoint& p)
+{
+	QRect rLeft(0, 0, 6, 6), rRight(0, 0, 6, 6), rTop(0, 0, 6, 6), rBottom(0, 0, 6, 6), rCenter(0, 0, 6, 6);
+	rLeft.moveCenter(pLeft_);
+	rRight.moveCenter(pRight_);
+	rTop.moveCenter(pTop_);
+	rBottom.moveCenter(pBottom_);
+	rCenter.moveCenter(pCenter_);
+
+	mode_ = 0;
+	double d, m = TeMAXFLOAT;
+
+	if(rLeft.contains(p))
+	{
+		QPoint a(rLeft.left() + rLeft.width()/2, rLeft.left() + rLeft.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 1;
+	}
+	if(rRight.contains(p))
+	{
+		QPoint a(rRight.left() + rRight.width()/2, rRight.left() + rRight.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 2;
+	}
+	if(rTop.contains(p))
+	{
+		QPoint a(rTop.left() + rTop.width()/2, rTop.left() + rTop.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 3;
+	}
+	if(rBottom.contains(p))
+	{
+		QPoint a(rBottom.left() + rBottom.width()/2, rBottom.left() + rBottom.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 4;
+	}
+	if(rCenter.contains(p))
+	{
+		QPoint a(rCenter.left() + rCenter.width()/2, rCenter.left() + rCenter.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		mode_ = 5;
+	}
+
+	if(mode_ == 1)
+		pLeft_ = p;
+	else if(mode_ == 2)
+		pRight_ = p;
+	else if(mode_ == 3)
+		pTop_ = p;
+	else if(mode_ == 4)
+		pBottom_ = p;
+	else if(mode_ == 5)
+		pCenter_ = p;
+
+	return mode_;
+}
+
+bool
+TeQtTextEdit::isHotPoint(QPoint& p)
+{
+	QRect rLeft(0, 0, 6, 6), rRight(0, 0, 6, 6), rTop(0, 0, 6, 6), rBottom(0, 0, 6, 6), rCenter(0, 0, 6, 6);
+	rLeft.moveCenter(pLeft_);
+	rRight.moveCenter(pRight_);
+	rTop.moveCenter(pTop_);
+	rBottom.moveCenter(pBottom_);
+	rCenter.moveCenter(pCenter_);
+
+	mode_ = 0;
+	double d, m = TeMAXFLOAT;
+
+	if(rLeft.contains(p))
+	{
+		QPoint a(rLeft.left() + rLeft.width()/2, rLeft.left() + rLeft.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 1;
+	}
+	if(rRight.contains(p))
+	{
+		QPoint a(rRight.left() + rRight.width()/2, rRight.left() + rRight.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 2;
+	}
+	if(rTop.contains(p))
+	{
+		QPoint a(rTop.left() + rTop.width()/2, rTop.left() + rTop.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 3;
+	}
+	if(rBottom.contains(p))
+	{
+		QPoint a(rBottom.left() + rBottom.width()/2, rBottom.left() + rBottom.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		if(m == d)
+			mode_ = 4;
+	}
+	if(rCenter.contains(p))
+	{
+		QPoint a(rCenter.left() + rCenter.width()/2, rCenter.left() + rCenter.height()/2);
+		d = (p.x()-a.x())*(p.x()-a.x()) + (p.y()-a.y())*(p.y()-a.y());
+		m = MIN(m, d);
+		mode_ = 5;
+	}
+
+	if(mode_ > 0)
+		return true;
+	return false;
+}
+
+void
+TeQtTextEdit::endEdit()
+{
+	edit_ = false;
+	mode_ = 0;
+}
+
+int
+TeQtTextEdit::mode()
+{
+	return mode_;
+}
+
+void
+TeQtTextEdit::mode(int mode)
+{
+	mode_ = mode;
+}
+
+bool
+TeQtTextEdit::edit()
+{
+	return edit_;
+}
+
+TeText
+TeQtTextEdit::text()
+{
+	return text_;
+}
+
+void
+TeQtTextEdit::text(TeText t)
+{
+	text_ = t;
+}
+
+void
+TeQtTextEdit::height(double h)
+{
+	text_.setHeight(h);
+}
+
+void
+TeQtTextEdit::angle(double a)
+{
+	text_.setAngle(a);
+}
+
+void
+TeQtTextEdit::addPosition(TeCoord2D p)
+{
+	TeCoord2D tp = text_.location();
+	tp += p;
+	text_.add(tp);
+}
+
+TeQtBasicCanvas*
+TeQtTextEdit::canvas()
+{
+	return canvas_;
+}
+
+QRect
+TeQtTextEdit::getRect()
+{
+	QRect rect = canvas_->textRect(text_, visual_);
+	int	x1 = rect.left();
+	int	y1 = rect.top();
+	int	x2 = rect.right();
+	int	y2 = rect.bottom();
+
+	double angle = text_.angle() * -1;
+	if(!(angle == 0 || angle == 90 || angle == 180 || angle == 270))
+	{
+		double d, dx, dy, alfa, beta;
+		QPoint c = rect.center();
+		QPoint p, p1, p2, p3, p4;
+
+		p = QPoint(x1, y1);
+		dx = p.x() - c.x();
+		dy = p.y() - c.y();
+		alfa = atan(dy/dx) * 180. / TePI;
+		if(dx<0)
+			alfa = 180. + alfa;
+		else if(dx>=0 && dy<0)
+			alfa = 360. + alfa;
+		beta = alfa + angle;
+		d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+		p1.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+		p1.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+		p = QPoint(x1, y2);
+		dx = p.x() - c.x();
+		dy = p.y() - c.y();
+		alfa = atan(dy/dx) * 180. / TePI;
+		if(dx<0)
+			alfa = 180. + alfa;
+		else if(dx>=0 && dy<0)
+			alfa = 360. + alfa;
+		beta = alfa + angle;
+		d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+		p2.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+		p2.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+		p = QPoint(x2, y1);
+		dx = p.x() - c.x();
+		dy = p.y() - c.y();
+		alfa = atan(dy/dx) * 180. / TePI;
+		if(dx<0)
+			alfa = 180. + alfa;
+		else if(dx>=0 && dy<0)
+			alfa = 360. + alfa;
+		beta = alfa + angle;
+		d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+		p3.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+		p3.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+		p = QPoint(x2, y2);
+		dx = p.x() - c.x();
+		dy = p.y() - c.y();
+		alfa = atan(dy/dx) * 180. / TePI;
+		if(dx<0)
+			alfa = 180. + alfa;
+		else if(dx>=0 && dy<0)
+			alfa = 360. + alfa;
+		beta = alfa + angle;
+		d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+		p4.setX(c.x() + TeRound(cos(beta*TePI/180.) * d));
+		p4.setY(c.y() + TeRound(sin(beta*TePI/180.) * d));
+
+		x1 = MIN(p1.x(), p2.x());
+		x1 = MIN(x1, p3.x());
+		x1 = MIN(x1, p4.x());
+		y1 = MIN(p1.y(), p2.y());
+		y1 = MIN(y1, p3.y());
+		y1 = MIN(y1, p4.y());
+		x2 = MAX(p1.x(), p2.x());
+		x2 = MAX(x2, p3.x());
+		x2 = MAX(x2, p4.x());
+		y2 = MAX(p1.y(), p2.y());
+		y2 = MAX(y2, p3.y());
+		y2 = MAX(y2, p4.y());
+
+		rect.setLeft(x1);
+		rect.setTop(y1);
+		rect.setRight(x2);
+		rect.setBottom(y2);
+	}
+	return rect;
+//	QRect rect;
+//	int	x1, y1, x2, y2;
+
+//	x1 = pLeft_.x();
+//	x1 = MIN(x1, pRight_.x());
+//	x1 = MIN(x1, pTop_.x());
+//	x1 = MIN(x1, pBottom_.x());
+
+//	y1 = pLeft_.y();
+//	y1 = MIN(y1, pRight_.y());
+//	y1 = MIN(y1, pTop_.y());
+//	y1 = MIN(y1, pBottom_.y());
+
+//	x2 = pLeft_.x();
+//	x2 = MAX(x2, pRight_.x());
+//	x2 = MAX(x2, pTop_.x());
+//	x2 = MAX(x2, pBottom_.x());
+
+//	y2 = pLeft_.y();
+//	y2 = MAX(y2, pRight_.y());
+//	y2 = MAX(y2, pTop_.y());
+//	y2 = MAX(y2, pBottom_.y());
+
+//	if(text_.angle() == 0 || text_.angle() == 90 || text_.angle() == 180 || text_.angle() == 270)
+//		rect = QRect(x1-3, y1-3, x2-x1+7, y2-y1+7);
+//	else
+//	{
+//		int h = y2 - y1;
+//		int w = x2 - x1;
+//		int	d = h;
+//		if(w < h)
+//			d = w;
+//		x1 -= d;
+//		y1 -= d;
+//		x2 += d;
+//		y2 += d;
+//		rect = QRect(x1, y1, x2-x1, y2-y1);
+//	}
+//	return rect;
+}
+
+QRect
+TeQtTextEdit::getHRect()
+{
+	return canvas_->textRect(text_, visual_);
+}
+
+TeQtMultiTextEdit::TeQtMultiTextEdit()
+{
+	current_ = -1;
+	selMode_ = false;
+}
+
+TeQtMultiTextEdit::~TeQtMultiTextEdit()
+{
+}
+
+int
+TeQtMultiTextEdit::size()
+{
+	return textVec_.size();
+}
+
+void
+TeQtMultiTextEdit::push(TeQtTextEdit t)
+{
+	int geomId = t.text().geomId();
+	if(geomIdSet_.find(geomId) == geomIdSet_.end())
+	{
+		geomIdSet_.insert(geomId);
+		textVec_.push_back(t);
+		current_ = textVec_.size() - 1;
+	}
+}
+
+void
+TeQtMultiTextEdit::change()
+{
+	if(current_ == -1)
+		return;
+
+//	canvas->plotOnWindow();
+	unsigned int i;
+	for(i=0; i<textVec_.size(); i++)
+	{
+		TeQtTextEdit& t = textVec_[i];
+		t.change();
+	}
+}
+
+void
+TeQtMultiTextEdit::change(QPoint p, bool apxAngle)
+{
+	if(current_ == -1)
+		return;
+
+	TeQtTextEdit& t = textVec_[current_];
+	TeCoord2D pa = t.text().location();
+	t.change(p, apxAngle);
+	TeCoord2D pb = t.text().location();
+	TeCoord2D poffset(pb.x()-pa.x(), pb.y()-pa.y());
+
+	if(t.mode()==1 || t.mode()==2)
+		angle(t.text().angle());
+	else if(t.mode()==3 || t.mode()==4)
+		height(t.text().height());
+	else if(t.mode() == 5)
+		addPosition(poffset);
+	change();
+}
+
+int 
+TeQtMultiTextEdit::located(QPoint& p)
+{
+	unsigned int i;
+	int mode = 0;
+	for(i=0; i<textVec_.size(); i++)
+	{
+		TeQtTextEdit& t = textVec_[i];
+		mode = t.located(p);
+		if(mode)
+		{
+			current_ = i;
+			break;
+		}
+	}
+	return mode;
+}
+
+bool
+TeQtMultiTextEdit::isHotPoint(QPoint& p)
+{
+	if(textVec_.size() == 0)
+		return false;
+
+	unsigned int i;
+	for(i=0; i<textVec_.size(); i++)
+	{
+		TeQtTextEdit& t = textVec_[i];
+		if(t.isHotPoint(p))
+		{
+			current_ = i;
+			break;
+		}
+	}
+	if(i < textVec_.size())
+		return true;
+	return false;
+}
+
+void
+TeQtMultiTextEdit::endEdit()
+{
+	unsigned int i;
+	for(i=0; i<textVec_.size(); i++)
+	{
+		TeQtTextEdit& t = textVec_[i];
+		t.endEdit();
+	}
+	textVec_.clear();
+	geomIdSet_.clear();
+}
+
+int
+TeQtMultiTextEdit::mode()
+{
+	if(current_ >= 0)
+		return textVec_[current_].mode();
+	return 0;
+}
+
+void
+TeQtMultiTextEdit::mode(int m)
+{
+	if(current_ >= 0)
+		textVec_[current_].mode(m);
+}
+
+bool
+TeQtMultiTextEdit::selMode()
+{
+	return selMode_;
+}
+
+void
+TeQtMultiTextEdit::selMode(bool m)
+{
+	selMode_ = m;
+}
+
+bool
+TeQtMultiTextEdit::edit()
+{
+	if(current_ >= 0)
+		return textVec_[current_].edit();
+	return false;
+}
+
+TeText
+TeQtMultiTextEdit::text(int i)
+{
+	TeText t;
+	if(i<(int)textVec_.size())
+		return textVec_[i].text();
+	else
+		return t;
+}
+
+TeVisual
+TeQtMultiTextEdit::visual(int i)
+{
+	TeVisual v;
+	if(i<(int)textVec_.size())
+		return textVec_[i].visual();
+	else
+		return v;
+}
+
+void
+TeQtMultiTextEdit::height(double h)
+{
+	int i;
+	for(i=0; i<(int)textVec_.size(); i++)
+	{
+		if(i == current_)
+			continue;
+		TeQtTextEdit& t = textVec_[i];
+		t.height(h);
+	}
+}
+
+void
+TeQtMultiTextEdit::angle(double a)
+{
+	int i;
+	for(i=0; i<(int)textVec_.size(); i++)
+	{
+		if(i == current_)
+			continue;
+		TeQtTextEdit& t = textVec_[i];
+		t.angle(a);
+	}
+}
+
+void
+TeQtMultiTextEdit::addPosition(TeCoord2D p)
+{
+	int i;
+	for(i=0; i<(int)textVec_.size(); i++)
+	{
+		if(i == current_)
+			continue;
+		TeQtTextEdit& t = textVec_[i];
+		t.addPosition(p);
+	}
+}
+
+QRect
+TeQtMultiTextEdit::getRect()
+{
+	QRect	rect;
+	int i;
+	for(i=0; i<(int)textVec_.size(); i++)
+	{
+		TeQtTextEdit& t = textVec_[i];
+		rect = rect | t.getRect();
+	}
+	return rect;
+}
+
+int
+TeQtMultiTextEdit::getTextIndex(QPoint p)
+{
+	int i;
+	for(i=0; i<(int)textVec_.size(); i++)
+	{
+		TeQtTextEdit& t = textVec_[i];
+		QRect rect = t.getHRect();
+		TeText tx = t.text();
+		double angle = tx.angle() * -1;
+
+		if(angle == 0)
+		{
+			if(rect.contains(p, true))
+				return i;
+		}
+		else
+		{
+			double d, dx, dy, alfa, beta;
+			QPoint c = rect.center();
+
+			dx = p.x() - c.x();
+			dy = p.y() - c.y();
+			alfa = atan(dy/dx) * 180. / TePI;
+			if(dx<0)
+				alfa = 180. + alfa;
+			else if(dx>=0 && dy<0)
+				alfa = 360. + alfa;
+			beta = alfa - angle;
+			d = sqrt(double((p.x()-c.x()) * (p.x()-c.x()) + (p.y()-c.y()) * (p.y()-c.y())));
+			int x = c.x() + TeRound(cos(beta*TePI/180.) * d);
+			int y = c.y() + TeRound(sin(beta*TePI/180.) * d);
+
+			QPoint pp(x, y);
+			if(rect.contains(pp))
+				return i;
+		}
+	}
+	return -1;
+}
+
+void
+TeQtMultiTextEdit::updateText(int index, string t)
+{
+	TeText tx = textVec_[index].text();
+	tx.setTextValue(t);
+	textVec_[index].text(tx);
+	textVec_[index].change();
+}
+
+void
+TeQtMultiTextEdit::visual(const TeVisual& visual)
+{
+	unsigned int i;
+	for(i=0; i<textVec_.size(); i++)
+		textVec_[i].visual(visual);
+}
diff --git a/src/terralib/application/qt/TeQtTextEdit.h b/src/terralib/application/qt/TeQtTextEdit.h
new file mode 100644
index 0000000..5404d3d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtTextEdit.h
@@ -0,0 +1,150 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTTEXTEDIT_H
+#define  __TERRALIB_INTERNAL_QTTEXTEDIT_H
+
+#include "TeCoord2D.h"
+#include "TeQtCanvas.h"
+#include "TeTheme.h"
+#include <qpoint.h>
+#include <set>
+
+class TeQtTextEdit
+{
+	QPoint				pLeft_;
+	QPoint				pRight_;
+	QPoint				pTop_;
+	QPoint				pBottom_;
+	QPoint				pCenter_;
+	bool				edit_;
+	int					mode_;
+	TeQtBasicCanvas*	canvas_;
+	TeTheme*			theme_;
+	TeVisual			visual_;
+	TeText				text_;
+
+public:
+
+    TeQtTextEdit();
+    TeQtTextEdit(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas);
+
+	~TeQtTextEdit ();
+
+	void init(TeText& tx, TeVisual v, TeQtBasicCanvas* canvas);
+
+	void change();
+
+	void change(QPoint p, bool apxAngle=false);
+
+	int	apx(double d);
+
+	int located(QPoint& p);
+
+	bool isHotPoint(QPoint& p);
+
+	void endEdit();
+
+	int mode();
+
+	void mode(int m);
+
+	bool edit();
+
+	TeText text();
+
+	void text(TeText t);
+
+	void height(double h);
+
+	void angle(double a);
+
+	void addPosition(TeCoord2D p);
+
+	TeQtBasicCanvas*	canvas();
+
+	TeVisual	visual() {return visual_;}
+
+	void	visual(const TeVisual& visual) {visual_ = visual;}
+
+	QRect	getRect();
+
+	QRect	getHRect();
+};
+
+
+class TeQtMultiTextEdit
+{
+	vector<TeQtTextEdit> textVec_;
+	set<int>			 geomIdSet_;
+	int					 current_;
+	bool				 selMode_;
+
+public:
+
+    TeQtMultiTextEdit();
+	~TeQtMultiTextEdit();
+
+	int size();
+
+	void push(TeQtTextEdit t);
+
+	void change();
+
+	void change(QPoint p, bool apxAngle=false);
+
+	int located(QPoint& p);
+
+	bool isHotPoint(QPoint& p);
+
+	void endEdit();
+
+	int mode();
+
+	void mode(int m);
+
+	bool selMode();
+
+	void selMode(bool m);
+
+	bool edit();
+
+	TeText text(int i);
+
+	TeVisual visual(int i);
+
+	void visual(const TeVisual&);
+
+	void height(double h);
+
+	void angle(double a);
+
+	void addPosition(TeCoord2D p);
+
+	void clear() {textVec_.clear(); geomIdSet_.clear();}
+
+	QRect	getRect();
+
+	int getTextIndex(QPoint p);
+
+	void updateText(int index, string t);
+};
+#endif
diff --git a/src/terralib/application/qt/TeQtThemeItem.cpp b/src/terralib/application/qt/TeQtThemeItem.cpp
new file mode 100644
index 0000000..498ed2d
--- /dev/null
+++ b/src/terralib/application/qt/TeQtThemeItem.cpp
@@ -0,0 +1,187 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtThemeItem.h>
+#include <TeQtViewsListView.h>
+#include <TeQtLegendItem.h>
+#include <TeQtChartItem.h>
+#include <TeDatabase.h>
+#include <qpixmap.h>
+#include <images/theme.xpm>
+#include <qimage.h>
+
+//Database item constructor
+TeQtThemeItem::TeQtThemeItem(QListViewItem *parent,
+	QString text, TeTheme *theme)
+	: TeQtCheckListItem(parent,text,CheckBox), theme_(theme)
+{
+	type_ = THEME;
+	QPixmap p(theme_xpm);
+	setPixmap(0,p);
+	setRenameEnabled(0,true);
+	setSelected(false);
+	setEnabled(true);
+
+	order_ = theme->priority();
+}
+
+
+void TeQtThemeItem::stateChange(bool visible)
+{
+	TeQtViewsListView *lView = (TeQtViewsListView*)listView();
+	lView->checkItemStateChanged(this, visible);
+}
+
+
+void TeQtThemeItem::removeLegends()
+{
+	vector<QListViewItem*> legendVector = getChildren();
+	unsigned int i;
+	for (i = 0; i < legendVector.size(); ++i)
+	{
+		TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+		if (checkItem->getType() == TeQtCheckListItem::LEGEND ||
+			checkItem->getType() == TeQtCheckListItem::LEGENDTITLE)
+			delete checkItem;
+	}
+}
+
+
+void TeQtThemeItem::removeCharts()
+{
+	vector<QListViewItem*> legendVector = getChildren();
+	unsigned int i;
+	for (i = 0; i < legendVector.size(); ++i)
+	{
+		TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+		if (checkItem->getType() == TeQtCheckListItem::CHART ||
+			checkItem->getType() == TeQtCheckListItem::CHARTTITLE)
+			delete checkItem;
+	}
+}
+
+
+void TeQtThemeItem::getLegends(vector<const QPixmap*>& pixmapVector, vector<string>& labelVector, string& title)
+{
+	vector<QListViewItem*> legendVector = getChildren();
+	unsigned int i;
+	for (i = 0; i < legendVector.size(); ++i)
+	{
+		TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+
+		if (checkItem->getType() == TeQtCheckListItem::LEGENDTITLE)
+		{
+			title = checkItem->text().latin1();
+		}
+		else if (checkItem->getType() == TeQtCheckListItem::LEGEND)
+		{
+			TeQtLegendItem *legendItem = (TeQtLegendItem*)checkItem;
+			pixmapVector.push_back(legendItem->pixmap(0));
+			labelVector.push_back(legendItem->text().latin1());
+		}
+	}
+}
+				
+TeQtCheckListItem* TeQtThemeItem::getLegendItem(TeLegendEntry* leg)
+{
+	vector<QListViewItem*> legendVector = getChildren();
+	unsigned int i;
+	for (i = 0; i < legendVector.size(); ++i)
+	{
+		TeQtCheckListItem *checkItem = (TeQtCheckListItem*)legendVector[i];
+
+		if (checkItem->getType() == TeQtCheckListItem::LEGEND)
+		{
+			TeQtLegendItem *legendItem = (TeQtLegendItem*)checkItem;
+			if(legendItem->legendEntry()->id() == leg->id())
+				return legendItem;
+		}
+	}
+	return (TeQtCheckListItem*)0;
+}
+
+void TeQtThemeItem::updateAlias()
+{
+	TeDatabase* db = theme_->layer()->database();
+	map<int, map<string, string> >& mapThemeAlias = db->mapThemeAlias();
+	map<string, string>& mapAA = mapThemeAlias[theme_->id()];
+
+	vector<QListViewItem*> itemVec = getChildren();
+
+	unsigned int i;
+	for (i = 0; i < itemVec.size(); ++i)
+	{
+		TeQtCheckListItem *checkItem = (TeQtCheckListItem*)itemVec[i];
+
+		if (checkItem->getType() == TeQtCheckListItem::LEGENDTITLE)
+		{
+			string attr, nattr;
+			if(theme_->grouping())
+			{
+				attr = theme_->grouping()->groupAttribute_.name_;
+				nattr = theme_->grouping()->groupNormAttribute_;
+			}
+
+			if(nattr.empty() || nattr == "NONE")
+			{
+				map<string, string>::iterator it = mapAA.find(attr);
+				if(it != mapAA.end())
+				{
+					string alias = it->second;
+					if(alias.empty())
+						checkItem->setText(0, attr.c_str());
+					else
+						checkItem->setText(0, alias.c_str());
+				}
+				else
+					checkItem->setText(0, attr.c_str());
+			}
+			else
+			{
+				string alias = attr;
+				map<string, string>::iterator it = mapAA.find(attr);
+				if(it != mapAA.end())
+					alias = it->second;
+
+				it = mapAA.find(nattr);
+				if(it != mapAA.end())
+					alias += "/" + it->second;
+				else
+					alias += "/" + nattr;
+
+				checkItem->setText(0, alias.c_str());
+			}
+		}
+		else if (checkItem->getType() == TeQtCheckListItem::CHART)
+		{
+			string attr = ((TeQtChartItem*)checkItem)->name();
+			map<string, string>::iterator it = mapAA.find(attr);
+			if(it != mapAA.end())
+			{
+				string alias = it->second;
+				checkItem->setText(0, alias.c_str());
+			}
+			else
+				checkItem->setText(0, attr.c_str());
+		}
+	}
+}
+
diff --git a/src/terralib/application/qt/TeQtThemeItem.h b/src/terralib/application/qt/TeQtThemeItem.h
new file mode 100644
index 0000000..585137f
--- /dev/null
+++ b/src/terralib/application/qt/TeQtThemeItem.h
@@ -0,0 +1,57 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTTHEMEITEM_H
+#define  __TERRALIB_INTERNAL_QTTHEMEITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeTheme;
+class TeLegendEntry;
+
+
+class TeQtThemeItem : public TeQtCheckListItem
+{
+public:
+    TeQtThemeItem(QListViewItem *parent, QString text, TeTheme* theme);
+
+	~TeQtThemeItem () {}
+
+	TeTheme* getTheme()
+		{return theme_;}
+
+	void removeLegends();
+
+	void removeCharts();
+
+	void getLegends(vector<const QPixmap*>& pixmapVector, vector<string>& labels, string& title);
+
+	TeQtCheckListItem* getLegendItem(TeLegendEntry* leg);
+
+	void updateAlias();
+
+protected:
+	TeTheme *theme_;
+
+	virtual void stateChange(bool);
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtViewItem.cpp b/src/terralib/application/qt/TeQtViewItem.cpp
new file mode 100644
index 0000000..5505a33
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewItem.cpp
@@ -0,0 +1,49 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtViewItem.h>
+#include <TeQtThemeItem.h>
+#include <qpixmap.h>
+#include <images/view.xpm>
+
+
+//Database item constructor
+TeQtViewItem::TeQtViewItem(QListView *parent,
+	QString text, TeView *view)
+	: TeQtCheckListItem(parent,text), view_(view)
+{
+	type_ = VIEW;
+//	QPixmap p("images/view.bmp");
+	QPixmap p((const char**)view_xpm);
+	setPixmap(0,p);
+	setRenameEnabled(0,true);
+	setSelected(false);
+	setEnabled(true);
+	setDragEnabled(false);
+}
+
+void	
+TeQtViewItem::resetAll()
+{
+	vector<QListViewItem*> childrenVector = this->getChildren();
+	for (int i = 0; i < (int)childrenVector.size(); ++i)
+		((TeQtThemeItem*)childrenVector[i])->setOn(false);
+}
diff --git a/src/terralib/application/qt/TeQtViewItem.h b/src/terralib/application/qt/TeQtViewItem.h
new file mode 100644
index 0000000..560df84
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewItem.h
@@ -0,0 +1,54 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTVIEWITEM_H
+#define  __TERRALIB_INTERNAL_QQTVIEWITEM_H
+
+#include <TeQtCheckListItem.h>
+
+class TeView;
+
+class TeQtViewItem : public TeQtCheckListItem
+{
+public:
+    TeQtViewItem(QListView *parent, QString text,
+				 TeView *view);
+
+	~TeQtViewItem () {}
+
+	int compare(QListViewItem * i, int col, bool ascending) const
+		{ return QListViewItem::compare(i, col, ascending); }
+
+	QString key(int col, bool ascending) const
+		{ return QListViewItem::key(col, ascending); }
+
+	TeView*	getView() {return view_;}
+
+	void setView(TeView *view)
+		{ view_ = view; }
+
+	void resetAll();
+
+protected:
+	TeView	*view_;
+};
+
+#endif
diff --git a/src/terralib/application/qt/TeQtViewsListView.cpp b/src/terralib/application/qt/TeQtViewsListView.cpp
new file mode 100644
index 0000000..1046300
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewsListView.cpp
@@ -0,0 +1,767 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include <TeQtViewsListView.h>
+#include <TeQtCheckListItem.h>
+#include <TeQtViewItem.h>
+#include <TeQtThemeItem.h>
+#include <TeWaitCursor.h>
+#include <qapplication.h>
+#include <qpopupmenu.h>
+#include <qdragobject.h>
+
+TeQtViewsListView::TeQtViewsListView(QWidget *parent, const char *name)
+		: QListView(parent, name)
+{
+	pressedThemeItem_ = 0;
+	currentViewItem_ = 0;
+	currentThemeItem_ = 0;
+	rightMouseWasClicked_ = false;
+	checkItemStateChanged_ = false;
+	leftButtonPressed_ = false;
+	drag_ = false;
+
+	setSelectionMode(QListView::Multi);
+    setRootIsDecorated( TRUE );
+//	setAcceptDrops(true);
+	viewport()->setAcceptDrops(true);
+
+	popupView_ = new QPopupMenu(this);
+	popupTheme_ = new QPopupMenu(this);
+	popupLegendTitle_ = new QPopupMenu(this);
+	popupLegend_ = new QPopupMenu(this);
+	popupChartTitle_ = new QPopupMenu(this);
+	popupChart_ = new QPopupMenu(this);
+	popupOutItem_ = new QPopupMenu(this);
+
+	//Mounting the brushStyleMap
+	brushStyleMap_[TePolyTypeTransparent] = Qt::NoBrush;
+	brushStyleMap_[TePolyTypeFill] = Qt::SolidPattern;
+	brushStyleMap_[TePolyTypeHorizontal] = Qt::HorPattern;
+	brushStyleMap_[TePolyTypeVertical] = Qt::VerPattern;
+	brushStyleMap_[TePolyTypeFDiagonal] = Qt::FDiagPattern;
+	brushStyleMap_[TePolyTypeBDiagonal] = Qt::BDiagPattern;
+	brushStyleMap_[TePolyTypeCross] = Qt::CrossPattern;
+	brushStyleMap_[TePolyTypeDiagonalCross] = Qt::DiagCrossPattern;
+
+	//Mounting the penStyleMap
+	penStyleMap_[TeLnTypeContinuous] = Qt::SolidLine;
+	penStyleMap_[TeLnTypeDashed] = Qt::DashLine;
+	penStyleMap_[TeLnTypeDotted] = Qt::DotLine;
+	penStyleMap_[TeLnTypeDashDot] = Qt::DashDotLine;
+	penStyleMap_[TeLnTypeDashDotDot] = Qt::DashDotDotLine;
+	penStyleMap_[TeLnTypeNone] = Qt::NoPen;
+
+	// rename action
+	setDefaultRenameAction(QListView::Accept);
+
+	connect(this,SIGNAL(clicked(QListViewItem*)),
+			this,SLOT(clicked(QListViewItem*)));
+	connect(this,SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&, int)),
+		    this,SLOT(contextMenuRequested(QListViewItem*,const QPoint&, int)));
+}
+
+
+TeQtViewsListView::~TeQtViewsListView()
+{
+	if (popupView_)
+		delete popupView_;
+	if (popupTheme_)
+		delete popupTheme_;
+	if (popupLegendTitle_)
+		delete popupLegendTitle_;
+	if (popupLegend_)
+		delete popupLegend_;
+	if (popupChartTitle_)
+		delete popupChartTitle_;
+	if (popupChart_)
+		delete popupChart_;
+	if (popupOutItem_)
+		delete popupOutItem_;
+}
+
+
+void TeQtViewsListView::selectItem(QListViewItem *item)
+{
+	checkItemStateChanged_ = false;
+	clicked(item);
+}
+
+
+void TeQtViewsListView::selectViewItem(TeView *view)
+{
+	if (view == 0)
+		return;
+
+	QListViewItem *child = firstChild();
+    while (child)
+	{
+		TeQtViewItem *viewItem = (TeQtViewItem*)child;
+		if (viewItem->getView() == view)
+		{
+			if (viewItem == currentViewItem_)
+				break;
+			else
+			{
+				unselectAllItems();
+				child->setSelected(true);
+				child->repaint();
+				currentViewItem_ = viewItem;
+				currentThemeItem_ = 0;
+				emit itemChanged(child);
+				return;
+			}
+		}
+        child = child->nextSibling();
+	}
+}
+
+
+TeQtViewItem* TeQtViewsListView::getViewItem(TeView *view)
+{
+	if (view == 0)
+		return 0;
+
+	QListViewItem *child = firstChild();
+    while (child)
+	{
+		TeQtViewItem *viewItem = (TeQtViewItem*)child;
+		if (viewItem->getView() == view)
+			return viewItem;
+		else
+			child = child->nextSibling();
+	}
+	return 0;
+}
+
+
+TeQtThemeItem* TeQtViewsListView::getThemeItem(TeTheme *theme)
+{
+	if (theme == 0)
+		return 0;
+
+	QListViewItem *item;
+	QListViewItemIterator it(this);
+	item = it.current();
+	while(item)
+	{
+		TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+		if (checkListItem->getType() == TeQtCheckListItem::THEME)
+		{
+			TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+			if (themeItem->getTheme() == theme)
+					return themeItem;
+		}
+		it++;
+		item = it.current();
+	}
+	return 0;
+}
+
+
+void TeQtViewsListView::removeViewItem(TeView *view)
+{
+	QListViewItem *item;
+
+	QListViewItemIterator it(this);
+	item = it.current();
+	while(item)
+	{
+		TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+		if (checkListItem->getType() == TeQtCheckListItem::VIEW)
+		{
+			TeQtViewItem* viewItem = (TeQtViewItem*)item;
+			if (viewItem->getView() == view)
+			{
+				if (viewItem == currentViewItem_)
+					currentViewItem_ = 0;
+				removeItem(item);
+				break;
+			}
+		}
+		it++;
+		item = it.current();
+	}	
+}
+
+
+void TeQtViewsListView::removeThemeItem(TeTheme *theme)
+{
+	QListViewItem *item;
+
+	QListViewItemIterator it(this);
+	item = it.current();
+	while(item)
+	{
+		TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+		if (checkListItem->getType() == TeQtCheckListItem::THEME)
+		{
+			TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+			if (themeItem->getTheme() == theme)
+			{
+				if (themeItem == currentThemeItem_)
+					currentThemeItem_ = 0;
+				removeItem(item);
+				break;
+			}
+		}
+		it++;
+		item = it.current();
+	}	
+}
+
+
+void TeQtViewsListView::removeItem(QListViewItem *item)
+{
+	TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+
+	if(checkListItem->getType() == TeQtCheckListItem::VIEW)
+	{
+		TeQtViewItem* viewItem = (TeQtViewItem*)item;
+
+		vector<QListViewItem*> childrenVector;
+		childrenVector = viewItem->getChildren();
+
+		int i;
+		TeQtThemeItem *themeItem;
+		for (i = 0; i < (int)childrenVector.size(); ++i)
+		{
+			themeItem = (TeQtThemeItem*)childrenVector[i];
+			delete themeItem;
+		}
+
+		if (currentViewItem_ == viewItem)
+		{
+			currentViewItem_ = 0;
+			currentThemeItem_ = 0;
+		}
+		delete viewItem;
+	}
+	else if (checkListItem->getType() == TeQtCheckListItem::THEME)
+	{
+		TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+		if (currentThemeItem_ == themeItem)
+			currentThemeItem_ = 0;
+		delete themeItem;
+	}
+	else
+		delete item;
+}
+
+
+void TeQtViewsListView::checkItemStateChanged(QCheckListItem *checkListItem, bool visible)
+{
+	checkItemStateChanged_ = true;
+	emit checkListItemVisChanged(checkListItem, visible);
+}
+
+
+void TeQtViewsListView::openViewItems()
+{
+	QListViewItem *child = firstChild();
+    while (child)
+	{
+		setOpen(child, true);
+		child = child->nextSibling();
+	}
+}
+
+
+void TeQtViewsListView::reset()
+{
+	unselectAllItems();
+	currentViewItem_ = 0;
+	currentThemeItem_ = 0;
+}
+
+
+void TeQtViewsListView::setOn(QCheckListItem *item, bool visible)
+{
+	TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+	if (checkListItem->getType() == TeQtCheckListItem::THEME)
+	{
+		TeQtThemeItem *themeItem = (TeQtThemeItem*)item;
+		themeItem->setOn(visible);
+		checkItemStateChanged_ = false;
+	}
+}
+
+void TeQtViewsListView::clicked(QListViewItem *item)
+{
+	if(item == 0)
+		return;
+	if(drag_ && pressedThemeItem_)
+		return;
+
+	unselectAllItems();
+
+	TeQtCheckListItem *checkListItem = (TeQtCheckListItem*)item;
+
+	if(	checkItemStateChanged_ && (checkListItem->getType() == TeQtCheckListItem::THEME))
+	{
+		checkItemStateChanged_ = false;
+		if(currentThemeItem_)
+		{
+			currentThemeItem_->parent()->setSelected(true);
+			currentThemeItem_->parent()->repaint();
+			currentThemeItem_->setSelected(true);
+			currentThemeItem_->repaint();
+			return;
+		}
+	}
+
+	if(checkListItem->getType() != TeQtCheckListItem::THEME)
+	{
+		if (rightMouseWasClicked_ == true || checkItemStateChanged_ == true ||
+			drag_ == true || checkListItem->getType() == TeQtCheckListItem::LEGEND ||
+			checkListItem->getType() == TeQtCheckListItem::CHART)
+		{
+			if (checkListItem->getType() == TeQtCheckListItem::LEGEND ||
+				checkListItem->getType() == TeQtCheckListItem::CHART)
+			{
+				checkListItem->setSelected(false);
+				checkListItem->repaint();
+			}
+
+			if (currentViewItem_ != 0)
+			{
+				currentViewItem_->setSelected(true);
+				currentViewItem_->repaint();
+			}
+
+			if (currentThemeItem_ != 0)
+			{
+				currentThemeItem_->setSelected(true);
+				currentThemeItem_->repaint();
+			}
+			rightMouseWasClicked_ = false;
+			checkItemStateChanged_ = false;
+			return;
+		}
+	}
+
+	if (checkListItem->getType() == TeQtCheckListItem::VIEW)
+	{
+		item->setSelected(true);
+		item->repaint();
+
+		TeQtViewItem *viewItem = (TeQtViewItem*)item;
+		if (viewItem != currentViewItem_)
+		{
+			currentViewItem_ = viewItem;
+			currentThemeItem_ = 0;
+			emit itemChanged(item);
+		}
+		else
+		{
+			if (currentThemeItem_ != 0)
+			{
+				currentThemeItem_->setSelected(true);
+				currentThemeItem_->repaint();
+			}
+		}
+	}
+	else if(checkListItem->getType() == TeQtCheckListItem::THEME)
+	{
+		item->parent()->setSelected(true);
+		item->parent()->repaint();
+		item->setSelected(true);
+		item->repaint();
+
+		TeQtViewItem *viewItem = (TeQtViewItem*)item->parent();
+		if (currentViewItem_ != viewItem && rightMouseWasClicked_ == false)
+		{
+			currentViewItem_ = viewItem;
+			emit itemChanged(item->parent());
+		}
+
+		TeQtThemeItem* themeItem = (TeQtThemeItem*)item;
+		if (themeItem != currentThemeItem_ && rightMouseWasClicked_ == false)
+		{
+			currentThemeItem_ = themeItem;
+			emit itemChanged(item);
+		}
+	}
+	rightMouseWasClicked_ = false;
+	checkItemStateChanged_ = false;
+}
+
+
+void TeQtViewsListView::contextMenuRequested(QListViewItem *item, const QPoint&, int)
+{
+	popupItem_ = (TeQtCheckListItem*)item;
+
+	unselectAllItems();
+	if (currentViewItem_)
+	{
+		currentViewItem_->setSelected(true);
+		currentViewItem_->repaint();
+	}
+
+	if (currentThemeItem_)
+	{
+		currentThemeItem_->setSelected(true);
+		currentThemeItem_->repaint();
+	}
+
+	emit popupSignal();	
+}
+
+void TeQtViewsListView::contentsMousePressEvent(QMouseEvent *e)
+{
+	rightMouseWasClicked_ = false;;
+	if (e->button() == RightButton)
+	{
+		rightMouseWasClicked_ = true;
+		popupView_->move(e->globalPos().x(), e->globalPos().y());
+		popupTheme_->move(e->globalPos().x(), e->globalPos().y());
+		popupLegendTitle_->move(e->globalPos().x(), e->globalPos().y());
+		popupLegend_->move(e->globalPos().x(), e->globalPos().y());
+		popupChartTitle_->move(e->globalPos().x(), e->globalPos().y());
+		popupChart_->move(e->globalPos().x(), e->globalPos().y());
+		popupOutItem_->move(e->globalPos().x(), e->globalPos().y());
+	}
+	else if (e->button() == LeftButton)
+	{
+		QPoint p( contentsToViewport( e->pos() ) );
+		pressedPosition_ = p;
+		TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p);
+		if (item != 0)
+		{
+			if(item->getType() == TeQtCheckListItem::THEME)
+			{
+				// don�t drag, if the user clicked into the root decoration of the item
+				if (p.x() > treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin())
+				{
+					pressedThemeItem_ = (TeQtThemeItem*)item;
+					themeOpen_ = isOpen(item);
+				}
+			}
+			else
+			{
+				item->setSelected(false);
+				item->repaint();
+				pressedThemeItem_ = 0;
+			}
+			leftButtonPressed_ = true;
+		}
+	}
+
+	QListView::contentsMousePressEvent(e);
+}
+
+
+void TeQtViewsListView::contentsMouseReleaseEvent(QMouseEvent *e)
+{
+	leftButtonPressed_ = false;
+	QListView::contentsMouseReleaseEvent(e);
+
+	if(currentThemeItem_)
+	{
+		unselectAllItems();
+		currentThemeItem_->parent()->setSelected(true);
+		currentThemeItem_->parent()->repaint();
+		currentThemeItem_->setSelected(true);
+		repaint();
+	}
+	drag_ = false;
+}
+
+
+void TeQtViewsListView::unselectAllItems()
+{
+	QListViewItem *item;
+
+	QListViewItemIterator it(this);
+	item = it.current();
+	while(item)
+	{
+		setSelected(item,false);
+		item->repaint();
+		it++;
+		item = it.current();
+	}
+}
+
+
+void TeQtViewsListView::contentsMouseMoveEvent(QMouseEvent* e)
+{
+	QPoint p( contentsToViewport( e->pos() ) );
+    if (leftButtonPressed_)
+	{
+		QPoint pdif = pressedPosition_ - p;
+		if(abs(pdif.x()) > 2 || abs(pdif.y()) > 2)
+		{
+			drag_ = true;
+			leftButtonPressed_ = false;
+			if(pressedThemeItem_)
+			{
+				TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p);
+				if (item && item->getType() == TeQtCheckListItem::THEME)
+				{
+	//				clicked(item);
+					QUriDrag* ud = new QUriDrag(viewport());
+					ud->drag();
+				}
+			}
+		}
+    }
+	if(drag_ && pressedThemeItem_)
+		pressedThemeItem_->setOpen(themeOpen_);
+}
+
+
+void TeQtViewsListView::contentsDragMoveEvent(QDragMoveEvent *e)
+{
+	if(pressedThemeItem_)
+		pressedThemeItem_->setOpen(themeOpen_);
+
+	if(e->source() != viewport())
+	{
+		e->ignore();
+		e->acceptAction(false);
+		return;
+	}
+
+    QPoint p = contentsToViewport(((QDragMoveEvent*)e)->pos());
+    TeQtCheckListItem *item = (TeQtCheckListItem*)itemAt(p);
+    if (item)
+	{
+		if (p.x() < treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)) + itemMargin())
+		{
+			e->ignore();
+			e->acceptAction(false);
+		}
+		else
+		{
+			if(item->getType() == TeQtCheckListItem::THEME || item->getType() == TeQtCheckListItem::VIEW)
+			{
+				e->accept();
+				e->acceptAction();
+			}
+			else
+			{
+				e->ignore();
+				e->acceptAction(false);
+				if(currentThemeItem_)
+				{
+					unselectAllItems();
+					currentThemeItem_->parent()->setSelected(true);
+					currentThemeItem_->parent()->repaint();
+					currentThemeItem_->setSelected(true);
+					repaint();
+				}
+			}
+		}
+    }
+	else
+	{
+		e->ignore();
+		e->acceptAction(false);
+	}
+}
+
+
+void TeQtViewsListView::contentsDropEvent(QDropEvent *e)
+{
+	if(e->source() != viewport())
+	{
+		e->ignore();
+		e->acceptAction(false);
+		pressedThemeItem_ = 0;
+		if(currentThemeItem_)
+		{
+			unselectAllItems();
+			currentThemeItem_->parent()->setSelected(true);
+			currentThemeItem_->parent()->repaint();
+			currentThemeItem_->setSelected(true);
+			repaint();
+		}
+		return;
+	}
+
+	int itemPriority;
+	TeQtThemeItem *themeItem;
+	bool viewChanged = false;
+
+    QPoint p = contentsToViewport(((QDragMoveEvent*)e)->pos());
+	TeQtCheckListItem *dropItem = (TeQtCheckListItem*)itemAt(p);
+
+	if (dropItem == 0)
+	{
+		e->ignore();
+		e->acceptAction(false);
+		pressedThemeItem_ = 0;
+		if(currentThemeItem_)
+		{
+			unselectAllItems();
+			currentThemeItem_->parent()->setSelected(true);
+			currentThemeItem_->parent()->repaint();
+			currentThemeItem_->setSelected(true);
+			repaint();
+		}
+		return;
+	}
+
+	if (dropItem == pressedThemeItem_)
+	{
+		e->ignore();
+		e->acceptAction(false);
+		pressedThemeItem_ = 0;
+		if(currentThemeItem_)
+		{
+			unselectAllItems();
+			currentThemeItem_->parent()->setSelected(true);
+			currentThemeItem_->parent()->repaint();
+			currentThemeItem_->setSelected(true);
+			repaint();
+		}
+		return;
+	}
+
+	e->accept();
+	e->acceptAction();
+
+	//Set the view item of the pressed item and the drop item
+	TeQtViewItem *pressedViewItem = (TeQtViewItem*)pressedThemeItem_->parent();
+	TeQtViewItem *dropViewItem;
+	if(dropItem->getType() == TeQtCheckListItem::THEME)
+		dropViewItem = (TeQtViewItem*)dropItem->parent();
+	else
+		dropViewItem = (TeQtViewItem*)dropItem;
+
+	//set a flag to indicate whether there was a view change
+	if (pressedViewItem != dropViewItem)
+		viewChanged = true;
+
+	//update the priorities and move the items accordingly
+	if (viewChanged)
+	{
+		vector<QListViewItem*> themeItemVector = dropViewItem->getChildren();
+		for (unsigned int i = 0; i < themeItemVector.size(); ++i)
+		{
+			themeItem = (TeQtThemeItem*)themeItemVector[i];
+			if(pressedThemeItem_->text(0) == themeItem->text(0))
+			{
+				emit dragDropItems(0, 0, 0);
+				pressedThemeItem_ = 0;
+				return;
+			}
+		}
+
+		if (dropItem->getType() == TeQtCheckListItem::THEME)
+		{
+			TeQtThemeItem *dropThemeItem = (TeQtThemeItem*)dropItem;
+			itemPriority = dropThemeItem->order();
+			pressedThemeItem_->order(itemPriority);
+			themeItem = dropThemeItem;
+		}
+		else
+		{
+			itemPriority = 0;
+			pressedThemeItem_->order(itemPriority);
+			themeItem = (TeQtThemeItem*)dropViewItem->firstChild();
+		}
+
+		while (themeItem)
+		{
+			themeItem->order(++itemPriority);
+			themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+		}
+		pressedViewItem->takeItem(pressedThemeItem_);
+		dropViewItem->insertItem(pressedThemeItem_);
+	}
+	else
+	{
+		if (dropItem->getType() == TeQtCheckListItem::THEME)
+		{
+			TeQtThemeItem *dropThemeItem = (TeQtThemeItem*)dropItem;
+			int pressedItemPriority = pressedThemeItem_->order();
+			int droppedItemPriority = dropThemeItem->order();
+			if (pressedItemPriority < droppedItemPriority)
+			{
+				itemPriority = pressedItemPriority;
+				pressedThemeItem_->order(droppedItemPriority);
+				themeItem = (TeQtThemeItem*)pressedThemeItem_->nextSibling();
+				while (themeItem != dropThemeItem)
+				{
+					themeItem->order(itemPriority++);
+					themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+				}
+				dropThemeItem->order(itemPriority);
+			}
+			else
+			{
+				itemPriority = droppedItemPriority;
+				pressedThemeItem_->order(itemPriority);
+				themeItem = (TeQtThemeItem*)dropThemeItem;
+
+				while (themeItem != pressedThemeItem_)
+				{
+					themeItem->order(++itemPriority);
+					themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+				}
+			}
+			pressedThemeItem_->moveItem(dropThemeItem);
+		}
+		else
+		{
+			itemPriority = 0;
+			pressedThemeItem_->order(itemPriority);
+			themeItem = (TeQtThemeItem*)dropItem->firstChild();
+			while (themeItem != pressedThemeItem_)
+			{
+				themeItem->order(++itemPriority);
+				themeItem = (TeQtThemeItem*)themeItem->nextSibling();
+			}
+			pressedViewItem->takeItem(pressedThemeItem_);
+			pressedViewItem->insertItem(pressedThemeItem_);
+			dropViewItem->setOpen(true);
+		}
+	}
+
+	if (pressedViewItem != dropViewItem)
+	{
+		// the drag and drop theme items belong to different views
+		if (pressedThemeItem_ == currentThemeItem_)
+		{
+			currentViewItem_ = dropViewItem;
+			clicked(pressedThemeItem_);
+		}
+	}
+
+//	emit dragDropItems(pressedViewItem, dropViewItem);
+	emit dragDropItems(pressedThemeItem_, pressedViewItem, dropViewItem);
+	pressedThemeItem_->setOpen(themeOpen_);
+
+	pressedThemeItem_ = 0;
+
+	if(currentThemeItem_)
+	{
+		unselectAllItems();
+		currentThemeItem_->parent()->setSelected(true);
+		currentThemeItem_->parent()->repaint();
+		currentThemeItem_->setSelected(true);
+		repaint();
+	}
+}
+
+
diff --git a/src/terralib/application/qt/TeQtViewsListView.h b/src/terralib/application/qt/TeQtViewsListView.h
new file mode 100644
index 0000000..820ef79
--- /dev/null
+++ b/src/terralib/application/qt/TeQtViewsListView.h
@@ -0,0 +1,146 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QTVIEWSLISTVIEW_H
+#define  __TERRALIB_INTERNAL_QTVIEWSLISTVIEW_H
+
+#include <qlistview.h>
+#include <TeDataTypes.h>
+
+class QPopupMenu;
+class TeView;
+class TeQtThemeItem;
+class TeQtViewItem;
+class TeQtCheckListItem;
+class TeTheme;
+
+class TeQtViewsListView : public QListView
+{
+	Q_OBJECT
+
+public:
+
+    TeQtViewsListView(QWidget *parent = 0, const char *name = 0);
+
+	~TeQtViewsListView();
+
+	TeQtViewItem* currentViewItem() 
+	{ return currentViewItem_; }
+
+	TeQtThemeItem* currentThemeItem() 
+	{ return currentThemeItem_; }
+
+	TeQtCheckListItem *popupItem()
+		{ return popupItem_; }
+
+	QPopupMenu* popupView()
+		{ return popupView_; }
+
+	QPopupMenu* popupTheme()
+		{ return popupTheme_; }
+
+	QPopupMenu* popupLegendTitle()
+		{ return popupLegendTitle_; }
+
+	QPopupMenu* popupLegend()
+		{ return popupLegend_; }
+
+	QPopupMenu* popupChartTitle()
+		{ return popupChartTitle_; }
+
+	QPopupMenu* popupChart()
+		{ return popupChart_; }
+
+	QPopupMenu* popupOutItem()
+		{ return popupOutItem_; }
+
+	void selectItem(QListViewItem *item);
+
+	void selectViewItem(TeView *view);
+
+	TeQtViewItem* getViewItem(TeView *view);
+
+	TeQtThemeItem* getThemeItem(TeTheme *theme);
+
+	void removeViewItem(TeView *view);
+
+	void removeThemeItem(TeTheme *theme);
+
+	void removeItem(QListViewItem *item);
+
+	void checkItemStateChanged(QCheckListItem*, bool);
+
+	void openViewItems();
+
+	void reset();
+
+	void setOn(QCheckListItem*, bool);
+
+	map<TePolyBasicType, Qt::BrushStyle>& getBrushStyleMap() {return brushStyleMap_;}
+
+	map<TeLnBasicType, Qt::PenStyle>& getPenStyleMap() {return penStyleMap_;}
+
+signals:
+	void itemChanged(QListViewItem*);
+	void popupSignal();
+	void checkListItemVisChanged(QCheckListItem*, bool);
+	void dragDropItems(TeQtThemeItem*, TeQtViewItem*, TeQtViewItem*);
+
+protected slots:
+	void clicked(QListViewItem *item);
+	void contextMenuRequested(QListViewItem*, const QPoint&, int);
+
+protected:
+	TeQtViewItem		*currentViewItem_;
+	TeQtThemeItem		*currentThemeItem_;
+	bool				rightMouseWasClicked_;
+	bool				checkItemStateChanged_;
+	bool				drag_;
+	bool				themeOpen_;
+	bool				leftButtonPressed_;
+	QPoint				pressedPosition_;
+	TeQtCheckListItem	*popupItem_;
+	QPopupMenu			*popupView_;
+	QPopupMenu			*popupTheme_;
+	QPopupMenu			*popupLegendTitle_;
+	QPopupMenu			*popupLegend_;
+	QPopupMenu			*popupChartTitle_;
+	QPopupMenu			*popupChart_;
+	QPopupMenu			*popupOutItem_;
+	map<TePolyBasicType, Qt::BrushStyle>	brushStyleMap_;
+	map<TeLnBasicType, Qt::PenStyle>		penStyleMap_;
+	TeQtThemeItem		*pressedThemeItem_;
+
+	void contentsMousePressEvent(QMouseEvent *e);
+
+	void contentsMouseReleaseEvent(QMouseEvent *e);
+
+	void contentsMouseMoveEvent(QMouseEvent* e);
+
+	void contentsDragMoveEvent(QDragMoveEvent *e);
+
+	void contentsDropEvent(QDropEvent *e);
+
+	void unselectAllItems();
+};
+
+
+#endif
diff --git a/src/terralib/application/qt/TeWaitCursor.cpp b/src/terralib/application/qt/TeWaitCursor.cpp
new file mode 100644
index 0000000..3194a98
--- /dev/null
+++ b/src/terralib/application/qt/TeWaitCursor.cpp
@@ -0,0 +1,59 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeWaitCursor.h"
+#include <qapplication.h>
+
+TeWaitCursor::TeWaitCursor ()
+{
+	if(QApplication::overrideCursor())
+	{
+		if(QApplication::overrideCursor()->shape() != Qt::WaitCursor)
+			QApplication::setOverrideCursor( Qt::WaitCursor );
+	}
+	else
+		QApplication::setOverrideCursor( Qt::WaitCursor );
+}
+
+TeWaitCursor::~TeWaitCursor ()
+{
+	if(QApplication::overrideCursor())
+		QApplication::restoreOverrideCursor();
+}
+
+
+void TeWaitCursor::setWaitCursor ()
+{
+	if(QApplication::overrideCursor())
+	{
+		if(QApplication::overrideCursor()->shape() != Qt::WaitCursor)
+			QApplication::setOverrideCursor( Qt::WaitCursor );
+	}
+	else
+		QApplication::setOverrideCursor( Qt::WaitCursor );
+}
+
+void TeWaitCursor::resetWaitCursor ()
+{
+	if(QApplication::overrideCursor())
+		QApplication::restoreOverrideCursor();
+}
+
diff --git a/src/terralib/application/qt/TeWaitCursor.h b/src/terralib/application/qt/TeWaitCursor.h
new file mode 100644
index 0000000..695cbc0
--- /dev/null
+++ b/src/terralib/application/qt/TeWaitCursor.h
@@ -0,0 +1,36 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_WAITCURSOR_H
+#define  __TERRALIB_INTERNAL_WAITCURSOR_H
+
+#include <qcursor.h>
+
+
+class TeWaitCursor : public QCursor  {
+public: 
+	TeWaitCursor();
+	~TeWaitCursor();
+	void setWaitCursor();
+	void resetWaitCursor();
+};
+
+#endif
diff --git a/src/terralib/application/qt/resultVisual.h b/src/terralib/application/qt/resultVisual.h
new file mode 100644
index 0000000..0ba8787
--- /dev/null
+++ b/src/terralib/application/qt/resultVisual.h
@@ -0,0 +1,37 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#ifndef RESULTVISUAL_H
+#define RESULTVISUAL_H
+
+
+#include <qwidget.h>
+
+class ResultVisual : public QWidget
+{
+public:
+	ResultVisual(QWidget *parent=0, const char *name=0)
+		:QWidget(parent,name) {}
+
+	~ResultVisual() {}
+};
+
+#endif
diff --git a/src/terralib/drivers/MrSID/TeDecoderMrSID.cpp b/src/terralib/drivers/MrSID/TeDecoderMrSID.cpp
new file mode 100644
index 0000000..19977dc
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeDecoderMrSID.cpp
@@ -0,0 +1,387 @@
+#include "TeDecoderMrSID.h"
+#include "TeMrSID.h"
+#include "TeDecoderMemory.h"
+#include "TeVectorRemap.h"
+#include "TeAsciiFile.h"
+#include "TeGeometryAlgorithms.h"
+
+
+TeDecoderMrSID::TeDecoderMrSID(const TeRasterParams& par) :
+	mrsid_(0),
+	nSelectedBlocks_(0),
+	data_(0),
+	dX_(0),
+	dY_(0)
+{
+	params_ = par; 
+	params_.decoderIdentifier_= "MrSID";
+	try
+	{
+		mrsid_ = new TeMrSIDReader(params_.fileName_.c_str());
+	}
+	catch(/*exception& e*/...)
+	{
+		return;
+	}
+	fillRasterParams();
+	originalLevel_ = currentLevel_;
+}
+
+TeDecoderMrSID::TeDecoderMrSID(const std::string& fname):
+	mrsid_(0),
+	nSelectedBlocks_(0),
+	data_(0),
+	dX_(0),
+	dY_(0)
+{
+	try
+	{
+		mrsid_ = new TeMrSIDReader(params_.fileName_.c_str());
+	}
+	catch(...)
+	{
+		return;
+	}
+	fillRasterParams();
+}
+
+TeProjection* 
+TeDecoderMrSID::readProjection()
+{
+	TeProjection* proj = 0;
+	try
+	{
+		string projFile = TeGetName(params_.fileName_.c_str()) + ".prj";
+		TeAsciiFile	pFile (projFile);
+		string name;
+		string pname, dname;
+		int zone;
+		TeProjectionParams projPar;
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (name == "Projection")
+			{
+				pname = pFile.readString();
+			}	
+			else if (name == "Datum")
+			{
+				name = pFile.readString();
+				if (name == "SOUTH_AMERICAN_1969")
+					dname = "SAD69";
+				if (name == "WGS84")
+					dname = "WGS84";
+
+			}
+			else if (name == "Zone")
+			{
+				zone = pFile.readInt();
+			}
+		}
+		if (pname == "UTM" && (dname == "SAD69" || "WGS84"))
+		{
+			TeDatum d = TeDatumFactory::make(dname);
+			proj = new TeUtm(d,zone*TeCDR);
+		}
+	}
+	catch(...)
+	{
+	}
+	if (!proj)
+		proj = new TeNoProjection();
+	return proj;
+}
+
+void TeDecoderMrSID::fillRasterParams()
+{
+	params_.projection(readProjection());
+	params_.nBands(mrsid_->nBands());
+	params_.setDataType(TeUNSIGNEDCHAR);
+	if(mrsid_->getColorModel() == TeMrSIDReader::ColorModelRGB)
+		params_.setPhotometric(TeRASTERRGB);
+	else
+		params_.setPhotometric(TeRASTERMULTIBAND);
+
+	// retrieves the original resolution (level 0) of MrSID
+	double oResx_ = mrsid_->resX();
+	double oResy_ = -mrsid_->resY();
+
+	// calculates the proper MrSID level accordingly to the asked TerraLib resolution
+	// lowest level where resolution is equal or greater than the asked resolution
+	double dResx_ = oResx_* params_.resolution_;
+	double dResy_ = oResy_* params_.resolution_;
+	currentLevel_ = 0;
+
+	while (oResx_ < dResx_ && oResy_ < dResy_ && currentLevel_ < mrsid_->nlev())
+	{
+		currentLevel_++;
+		mrsid_->zoomTo(currentLevel_);
+		mrsid_->getCurrentLevelResolution(oResx_, oResy_);
+	}
+	zoomToLevel(currentLevel_);
+	if (params_.blockHeight_ == 0 || params_.blockWidth_ != params_.ncols_)
+	{
+		params_.blockWidth_ = params_.ncols_;
+		params_.blockHeight_ = nLinesInBlock();
+	}
+}
+
+
+void TeDecoderMrSID::init()
+{
+	params_.status_= TeNOTREADY;
+	if (params_.mode_ != 'r')	
+		return;
+
+	if (mrsid_)
+	{
+		string curFile(mrsid_->fileName());
+		if (curFile.empty() || curFile != params_.fileName_)
+		{
+			delete mrsid_;
+			mrsid_ = 0;
+		}
+	}
+
+	if (!mrsid_)
+	{
+		try
+		{
+			mrsid_ = new TeMrSIDReader(params_.fileName_.c_str());
+		}
+		catch(...)
+		{
+			return;
+		}
+	}
+	
+	if (data_)
+	{
+		delete data_;
+		data_ = 0;
+	}
+	fillRasterParams();
+	originalLevel_ = currentLevel_;
+	if (!allocateMemory())
+		return;
+	params_.status_= TeREADYTOREAD;
+	return;
+}
+
+bool 
+TeDecoderMrSID::allocateMemory()
+{
+	curStrip_ = -1;
+	if (data_)
+		delete []data_;
+	data_ = 0;
+	data_ = new unsigned char[params_.blockWidth_ * params_.blockHeight_ * params_.nBands()];
+	return (data_ != 0);
+}
+
+bool 
+TeDecoderMrSID::clear()
+{
+	if (mrsid_)
+		mrsid_->clear();
+	if (data_)
+		delete data_;
+	data_ = 0;
+	dX_ = dY_ = 0;
+	curStrip_ = -1;
+	nSelectedBlocks_ = 0;
+	params_.status_= TeNOTREADY;
+	return true;
+}
+
+bool
+TeDecoderMrSID::getElement(int col, int lin, double& val, int band)
+{
+	if ((unsigned int)(lin/params_.blockHeight_) != (unsigned int)(curStrip_/params_.blockHeight_))
+	{
+		curStrip_ = ((unsigned int)(lin/params_.blockHeight_))*params_.blockHeight_;
+		if (!loadStrip())
+			return false;
+	}
+	unsigned int position  = params_.nBands()*(params_.ncols_*(lin-curStrip_)+col)+band;
+	val = (unsigned char) data_[position];
+	return true;
+}
+
+bool TeDecoderMrSID::loadLine(int row, unsigned char* buf, int nlines)
+{
+	try
+	{	
+		if (!mrsid_->selectArea(dX_,row+dY_,params_.blockWidth_,nlines))
+			return false;
+		mrsid_->getSelectedArea(buf);
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+
+bool
+TeDecoderMrSID::zoomToLevel(int level)
+{
+	if (level < 0 || level >= mrsid_->nlev())
+		return false;
+
+	mrsid_->zoomTo(level);
+	int ncols, nlines;
+	mrsid_->getDimensionAtLevel(level, ncols, nlines);
+	double x0,y0,x1,y1;
+	mrsid_->getCurrentBoundingBox(x0,y0,x1,y1);
+	params_.boundingBoxLinesColumns(x0,y0,x1,y1,nlines,ncols);
+	params_.resolution_ = (int)(params_.resx_/mrsid_->resX());
+	return true;
+}
+
+int 
+TeDecoderMrSID::bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj)
+{
+	if (!mrsid_)
+		return -1;
+
+	TeBox box = bb;
+	if (proj && !(*proj==*params_.projection()))
+		box = TeRemapBox(bb, proj, params_.projection());
+	
+	double resx = box.width()/ncols;		// desired resolution
+	double resy = box.height()/nlines;
+	double res = MIN(resx,resy);
+
+	int prevLevel = mrsid_->getCurrentLevel();			// save current level
+
+	int nlev = mrsid_->nlev();
+	int  sidscale_ = 0;
+	double mrsidresx, mrsidresy, mrsidres;
+	do 
+	{
+		mrsid_->zoomTo(sidscale_);
+		mrsid_->getCurrentLevelResolution(mrsidresx, mrsidresy);
+		mrsidres = std::min(mrsidresx, mrsidresy);
+		sidscale_++;
+	}while (res >= mrsidres && sidscale_< nlev);
+	
+	mrsid_->zoomTo(prevLevel);
+	return sidscale_-1;
+}
+
+bool TeDecoderMrSID::selectBlocks(TeBox& bbox, int resLevel, TeRasterParams& parBlock) 
+{
+	if (!mrsid_)
+		return false;
+
+	// check if desired resolution level is between the range of available levels
+	if (resLevel < 0 || resLevel >= mrsid_->nlev())
+		return false;
+
+	nSelectedBlocks_ = 0;
+	int prevLevel =  mrsid_->getCurrentLevel();				// save current level
+
+	// zoom to level and defines clipping area
+	zoomToLevel(resLevel);
+
+	// calculates width and height of the selected area
+	double bw = bbox.width();
+	double bh = bbox.height();
+	int w = TeRound(bbox.width()/params_.resx_);
+	int h = TeRound(bbox.height()/params_.resy_);
+
+	TeCoord2D ul = coord2Index(TeCoord2D(bbox.x1_,bbox.y2_));
+	int ulx = TeRoundRasterIndex(ul.x_);
+	int uly = TeRoundRasterIndex(ul.y_);
+
+	if (!mrsid_->selectArea(ulx,uly,w,h))
+	{
+		zoomToLevel(prevLevel);
+		return false;
+	}
+	params_.blockWidth_ = w;
+	params_.blockHeight_ = h;
+	
+	// defines parameters of the selected block
+	nSelectedBlocks_ = 1;			// always select only one block
+	parBlock = params_;
+	parBlock.boundingBoxResolution(bbox.x1_,bbox.y1_,bbox.x2_,bbox.y2_,parBlock.resx_,parBlock.resy_);
+	parBlock.interleaving_ = TePerPixel;
+	return true;
+}
+
+bool TeDecoderMrSID::getSelectedRasterBlock(TeDecoderMemory* memDec) 
+{
+  if (!mrsid_ || nSelectedBlocks_ <= 0)
+	  return false;
+  bool res = mrsid_->getSelectedArea((unsigned char*) memDec->data(0));
+  nSelectedBlocks_--;
+  return res;
+}
+
+void 
+TeDecoderMrSID::clearBlockSelection()
+{	
+	zoomToLevel(originalLevel_);
+	nSelectedBlocks_ = 0;	
+}
+
+int 
+TeDecoderMrSID::nLinesInBlock()
+{
+	int nlines = 1;
+	while (nlines*params_.ncols_*params_.nBands() < 200*1024*1024 && nlines < params_.nlines_)
+		nlines *= 2;
+	nlines /= 2;
+	return nlines;
+}
+
+void
+TeDecoderMrSID::setClippingArea(TeBox clipBox)
+{
+	zoomToLevel(originalLevel_);
+	TeBox clipBoxInter;
+	if (TeIntersection(params_.boundingBox(),clipBox,clipBoxInter))		//if there where a given box set in parameters
+	{
+		int nlines = params_.nlines_;
+		clipBox = params_.boundingBox();
+		params_.boundingBoxResolution(clipBoxInter.x1_,clipBoxInter.y1_,
+								      clipBoxInter.x2_,clipBoxInter.y2_,
+								      params_.resx_,params_.resy_);	
+	
+		dX_ = static_cast<int>((params_.boundingBox().x1_ - clipBox.x1_)/params_.resx_);
+		dY_ = nlines - static_cast<int>((params_.boundingBox().y1_ - clipBox.y1_)/params_.resy_)
+			  - params_.nlines_;
+	}
+	params_.blockWidth_ = params_.ncols_;
+	params_.blockHeight_ = nLinesInBlock();
+	allocateMemory();
+}
+
+void 
+TeDecoderMrSID::resetClippingArea()
+{
+	zoomToLevel(originalLevel_);
+	params_.blockWidth_ = params_.ncols_;
+	params_.blockHeight_ = nLinesInBlock();
+	allocateMemory();
+}
+
+bool
+TeDecoderMrSID::loadStrip()
+{
+	try
+	{	
+		//(int leftColumn, int topRow, int width, int height)
+		if (!mrsid_->selectArea(dX_,curStrip_+dY_,params_.blockWidth_, params_.blockHeight_))
+			return false;
+		mrsid_->getSelectedArea(data_);
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
diff --git a/src/terralib/drivers/MrSID/TeDecoderMrSID.h b/src/terralib/drivers/MrSID/TeDecoderMrSID.h
new file mode 100644
index 0000000..49ea060
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeDecoderMrSID.h
@@ -0,0 +1,163 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderMrSID.h
+    This file deals with decoding of raster images in MrSID Format
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERMRSID_H
+#define  __TERRALIB_INTERNAL_DECODERMRSID_H
+
+#include "TeDecoder.h"
+#include "TeMrSID.h"
+
+//! The TeMrSID driver provides access to decode MrSID Images
+class TeDecoderMrSID : public TeDecoder
+{
+public:
+
+	//! Constructor from parameters
+	TeDecoderMrSID(const TeRasterParams& par);
+
+	//! Constructor from file name
+	TeDecoderMrSID(const std::string& fname);
+
+	//! Destructor
+	~TeDecoderMrSID()
+	{
+		if (mrsid_)
+			delete mrsid_;
+		if (data_)
+			delete data_;
+	}
+
+	//! Initalizes internal structures to make decode able to read MrSID images
+	void init();
+
+	//! Releases internal structures and invalidates MrSID decoder
+	bool clear();
+
+	//! Provided for compatibility reasons only, this decoder can not encode data
+	bool setElement(int col, int lin, double val, int band=0) 
+	{ return false; }
+
+	//! Gets the value of an specific element (col, lin, band) of a raster data
+	/*!
+		\param col pixel column identifier
+		\param lin pixel line identifier
+		\param val pixel value being retrieved
+		\param band pixel band identifier
+	*/
+	bool getElement(int col, int lin, double& val, int band=0);
+
+	//! Returns the best resolution level in a MrSID image to cover a paricular area
+	/* 
+		\param bb bounding box geographical coordinates of the area to be covered
+		\param ncols number of columns of the area
+		\param nlines number of lines of the area
+		\param proj projection of the geographical coordinates
+		\returns A resolution level available in the MrSID files
+		\note Resolution level in decoder MrSid is a level in a multi-resolution pyramid
+		stored in the format. Original resolution has value 0 and following higher
+		levels assume integer values (1,2,3,4...)
+	*/	
+	int bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj);
+
+	//! Selects a portion of a MrSID image in a certain resolution level 
+	/*
+		\param bb bounding box (in geographical coordinates) of that area to be selected 
+		\param the resolution level desired
+		\param parBlock returns the parameters of the portion selected
+		\returns TRUE if could select the portion and FALSE otherwise
+		\note MrSID navigator will be bounded to the given resolution level
+	*/
+	bool selectBlocks(TeBox& bbox, int resLevel, TeRasterParams& parBlock);
+
+	//! Returns the contents of a portion of image previously selected
+	/*
+		\param memDec a pointer to a decoder to a raster in memory. This decoder
+		should be previously initialialized
+	*/
+	bool getSelectedRasterBlock(TeDecoderMemory* memDec);
+
+	//! Returns the number of blocks selected by the latest selection
+	int numberOfSelectedBlocks() 
+	{	return nSelectedBlocks_; }
+
+	//! Reset block selection. Returns navigator to the original resolution level
+	void clearBlockSelection();
+
+	//! Defines a decoding subarea
+	void setClippingArea(TeBox clipBox);
+
+	//! Resets decoding area
+	void resetClippingArea();
+
+	bool loadLine(int row, unsigned char* buf,int nlines);
+
+	void addDeltaY()
+	{ 	
+		params_.boxLinesColumns(params_.box().x1_, params_.box().y1_+10000000,
+	                            params_.box().x2_, params_.box().y2_+10000000, 
+								params_.nlines_, params_.ncols_); 
+	}
+
+private:
+
+	TeDecoderMrSID();  
+	
+	bool allocateMemory();
+
+	TeMrSIDReader* mrsid_;
+
+	int nSelectedBlocks_;
+	int originalLevel_;
+	int currentLevel_;
+
+	unsigned int curStrip_;
+	unsigned char* data_;
+	
+	void fillRasterParams();
+
+	bool zoomToLevel(int level);
+
+	bool loadStrip();
+
+	int nLinesInBlock();
+
+	TeProjection* readProjection();
+
+
+	int dX_, dY_;
+};
+
+//! Implements a factory to build TeQtDecoders
+class TeDecoderMrSIDFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderMrSIDFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderMrSID(arg); }
+};
+
+#endif
diff --git a/src/terralib/drivers/MrSID/TeMrSID.cpp b/src/terralib/drivers/MrSID/TeMrSID.cpp
new file mode 100644
index 0000000..653b170
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeMrSID.cpp
@@ -0,0 +1,465 @@
+#include "TeMrSID.h"
+#include "MrSIDNavigator.h" 
+#include "MrSIDImageFile.h" 
+#include "lt_xTrans.h" 
+#include "lt_exception.h"
+
+LT_USE_NAMESPACE(LizardTech)
+
+// MrSID not initialized yet
+bool TeMrSIDReader::mrsid_initialized = false; 
+
+// Constructor
+TeMrSIDReader::TeMrSIDReader(const char* fname) :
+	sidNav_(0),
+    sidImageFile_(0),
+	imgBuffer_(0),
+	mrsidFileName_(fname)
+{
+  if(!mrsid_initialized)
+  {
+    setlocale(LC_ALL,"English");
+    XTrans::initialize();
+    mrsid_initialized = true;
+  }
+
+  FileSpecification filespec(fname);
+  try
+  {
+	  sidImageFile_ = new MrSIDImageFile(filespec);
+	  sidNav_ = new MrSIDNavigator(*sidImageFile_);
+  }
+  catch(...)
+  {
+	  int j = 0;
+  }
+
+	return;
+};
+
+TeMrSIDReader::~TeMrSIDReader()
+{
+  if(sidNav_) delete sidNav_;
+ // if(sidImageFile_) delete sidImageFile_;		// ????!!!
+  clear();
+}
+
+void TeMrSIDReader::clear()
+{
+  if(imgBuffer_ != NULL) 
+  {
+    free(imgBuffer_);
+    imgBuffer_ = NULL;
+  }
+}
+
+int TeMrSIDReader::nBands() const
+{
+  return sidNav_->nband();
+}
+
+unsigned int TeMrSIDReader::bitsPerPixel() const
+{
+  return sidImageFile_->colorSpace().samplesPerPixel();
+}
+
+TeMrSIDReader::ColorModel TeMrSIDReader::getColorModel() const
+{
+	ColorSpace::Scheme scheme = sidImageFile_->colorSpace().scheme();
+	if (scheme == ColorSpace::RGB)
+		return ColorModelRGB;
+	else if (scheme == ColorSpace::GRAYSCALE)
+		return ColorModelGray;
+	else
+		return ColorModelUnknown;
+}
+
+unsigned int TeMrSIDReader::getWidth() const 
+{
+  return sidNav_->imageWidth();
+}
+
+unsigned int TeMrSIDReader::getHeight() const
+{
+  return sidNav_->imageHeight();
+}
+
+bool TeMrSIDReader::hasWorldInfo()
+{
+  return sidNav_->hasWorldInfo();
+}
+
+double TeMrSIDReader::originX()
+{
+  double x;
+
+  if(!sidImageFile_->xu(x))
+    return 0;
+
+  x-= resX() * 0.5;
+
+  return x;
+}
+
+double TeMrSIDReader::originY()
+{
+  double y;
+
+  if(!sidImageFile_->yu(y))
+    return 0;
+
+  y-= resY() * 0.5;
+
+  return y;
+}
+
+double TeMrSIDReader::resX()
+{
+  double res;
+
+  MetadataReader myReader = sidImageFile_->metadata();
+  if (myReader.empty()) return 1;
+  if (myReader.keyExists("IMAGE::X_RESOLUTION"))
+  {
+    MetadataElement element = myReader.getValue("IMAGE::X_RESOLUTION");
+    if (!(element.type() == MetadataValue::DOUBLE)) return 1;
+    res = (double) element.getMetadataValue();
+    return res;
+  }
+  else return 1;
+}
+
+double TeMrSIDReader::resY()
+{
+  double res;
+
+  MetadataReader myReader = sidImageFile_->metadata();
+  if (myReader.empty()) return -1;
+  if (myReader.keyExists("IMAGE::Y_RESOLUTION"))
+  {
+    MetadataElement element = myReader.getValue("IMAGE::Y_RESOLUTION");
+    if (!(element.type() == MetadataValue::DOUBLE)) return -1;
+    res = (double) element.getMetadataValue();
+    return -res;
+  }
+  else return -1;
+}
+
+void TeMrSIDReader::getWorld(double& x0, double& y0, double& x1, double& y1)
+{
+  double sx, sy;
+  unsigned int w, h;
+
+  getOrigin(x0, y0);
+  getResolution(sx, sy);
+  getDimensions(w, h);
+
+  x1 = x0 + w * sx;
+  y1 = y0 + h * sy;
+}
+
+void TeMrSIDReader::getCurrentBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax)
+{
+  double sx, sy;
+  unsigned int w, h;
+  double x0, y0, x1, y1;
+
+  sidNav_->xres(sx);
+  sidNav_->yres(sy);
+
+  sidNav_->panTo(0,0,IntRect::TOP_LEFT);
+  if(!sidNav_->xu(x0))
+    x0 = 0.0;
+  else
+    x0-= sx * 0.5;
+
+  if(!sidNav_->yu(y0))
+    y0 = 0.0;
+  else
+    y0-= sy * 0.5;
+
+  sy = -1*sy;
+  int l = sidNav_->level();
+
+  LizardTech::IntDimension dim = sidImageFile_->getDimensionsAtLevel(l);
+  w = dim.width;
+  h = dim.height;
+
+  x1 = x0 + w * sx;
+  y1 = y0 + h * sy;
+
+  if(x0 < x1)
+  {
+    xmin = x0;
+    xmax = x1;
+  }
+  else
+  {
+    xmin = x1;
+    xmax = x0;
+  }
+
+  if(y0 < y1)
+  {
+    ymin = y0;
+    ymax = y1;
+  }
+  else
+  {
+    ymin = y1;
+    ymax = y0;
+  }
+}
+
+void TeMrSIDReader::getBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax)
+{
+  double sx, sy;
+  unsigned int w, h;
+  double x0, y0, x1, y1;
+
+  sx = resX();
+  sy = resY();
+
+  if(!sidImageFile_->xu(x0))
+    x0 = 0.0;
+  else
+    x0-= sx * 0.5;
+
+  if(!sidImageFile_->yu(y0))
+    y0 = 0.0;
+  else
+    y0-= sy * 0.5;
+
+  w = sidNav_->imageWidth();
+  h = sidNav_->imageHeight();
+
+  x1 = x0 + w * sx;
+  y1 = y0 + h * sy;
+
+  if(x0 < x1)
+  {
+    xmin = x0;
+    xmax = x1;
+  }
+  else
+  {
+    xmin = x1;
+    xmax = x0;
+  }
+
+  if(y0 < y1)
+  {
+    ymin = y0;
+    ymax = y1;
+  }
+  else
+  {
+    ymin = y1;
+    ymax = y0;
+  }
+}
+
+ImageBuffer* TeMrSIDReader::getImageBuffer(unsigned int size, unsigned int nbands,
+                                           const unsigned int* bands, void* data)
+{
+	unsigned int i;
+	ImageBufferInfo properties;
+	int* sample_map;
+
+	if(data == NULL)
+		throw OutOfMemoryException();
+
+	// compute each band offset
+	sample_map = (int*)calloc(nbands, sizeof(int));
+	if (sample_map == NULL)
+		throw OutOfMemoryException();
+
+	for(i = 0;i < nbands;i++)
+		sample_map[i] = bands[i] * size;
+
+	/* 
+	Set image buffer properties
+	Attention! The order in which the ImageBufferInfo properties are set matters.
+	So, care must be taken during modification of code part.
+	*/
+	if(nBands() == 1)
+		properties.setColorSpace(ColorSpace::GRAYSCALE);
+	else
+		properties.setColorSpace(ColorSpace::RGB);
+
+	properties.setSampleMap((const int*)sample_map);
+	properties.setBandDistribution(ImageBufferInfo::BSQ);
+	properties.setSampleType(ImageBufferInfo::UINT8);
+	properties.setAlignment(ImageBufferInfo::NO_ALIGN);
+	properties.setStride(1);
+	free(sample_map);
+	return new ImageBuffer(properties, data);
+}
+
+ImageBuffer* TeMrSIDReader::getImageBuffer2(unsigned int size, unsigned int nbands,
+                                const unsigned int* bands, void* data[])
+{
+  unsigned int i;
+  ImageBufferInfo properties;
+  int* sample_map;
+
+  // allocate data for the image buffer
+  if(imgBuffer_ != NULL) 
+	  free(imgBuffer_);
+  imgBuffer_ = (unsigned char*)calloc(nbands, size);
+
+  if(imgBuffer_ == NULL)
+    throw OutOfMemoryException();
+
+  // compute each band offset
+  sample_map = (int*)calloc(nbands, sizeof(int));
+  if(sample_map == NULL)
+    throw OutOfMemoryException();
+
+  for(i = 0;i < nbands;i++)
+  {
+    sample_map[i] = bands[i] * size;
+    data[i] = imgBuffer_ + sample_map[i];
+  }
+
+  /* 
+    Set image buffer properties
+    Attention! The order in which the ImageBufferInfo properties are set matters.
+    So, care must be taken during modification of code part.
+  */
+  if(nBands() == 1)
+    properties.setColorSpace(ColorSpace::GRAYSCALE);
+  else
+    properties.setColorSpace(ColorSpace::RGB);
+
+  properties.setSampleMap((const int*)sample_map);
+  properties.setBandDistribution(ImageBufferInfo::BSQ);
+  properties.setSampleType(ImageBufferInfo::UINT8);
+  properties.setAlignment(ImageBufferInfo::NO_ALIGN);
+  properties.setStride(1);
+
+  free(sample_map);
+
+  return new ImageBuffer(properties, imgBuffer_);
+}
+
+int TeMrSIDReader::getMaxZoomLevel()
+{ 
+	if (sidNav_)
+		return sidNav_->getMaxZoomLevel();
+	return -1;
+}
+
+int TeMrSIDReader::nlev()
+{
+	if (sidNav_)
+		return sidNav_->nlev();
+	return 0;
+}
+
+int TeMrSIDReader::getCurrentLevel()
+{
+	if (sidNav_)
+		return sidNav_->level();
+	return 0;
+}
+
+void TeMrSIDReader::zoomTo(int level)
+{
+	if (sidNav_)
+		sidNav_->zoomTo(level);
+}
+
+void TeMrSIDReader::getCurrentLevelResolution(double& resx, double& resy)
+{
+	if (!sidNav_)
+		return;
+	sidNav_->yres(resy);
+	sidNav_->xres(resx);
+}
+
+void TeMrSIDReader::getCurrentRectangleDimension(int& w, int& h)
+{
+	if (!sidNav_)
+		return;
+	w = sidNav_->width();
+	h = sidNav_->height();
+}
+
+void TeMrSIDReader::getDimensionAtLevel(int level, int& w, int& h)
+{
+	if (!sidImageFile_)
+		return;
+	LizardTech::IntDimension dim;
+	dim = sidImageFile_->getDimensionsAtLevel(level);
+	w = dim.width;
+	h = dim.height;
+}
+
+/* Pans the specified rectangle navigator to a new point and redefines it's dimension*/
+bool 
+TeMrSIDReader::selectArea(int leftColumn, int topRow, int width, int height)
+{
+	if(!sidImageFile_)
+		return false;
+
+	if(!sidNav_)
+		return false;
+	try{
+		sidNav_->panTo(leftColumn, topRow, IntRect::TOP_LEFT);
+	    sidNav_->resize(width, height, IntRect::TOP_LEFT);
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+/* Loads the image selected by the navigator rectangle into memory.
+   Expects that the pointer to unsiged char was already allocated */
+bool 
+TeMrSIDReader::getSelectedArea(unsigned char* data)
+{
+	if(!sidImageFile_)
+		return false;
+
+	if(!sidNav_)
+		return false;
+
+	try{
+		ImageBuffer* sidBuffer = getImageBuffer(sidNav_->width() * sidNav_->height(), 
+			                                    nBands(), data);
+		sidNav_->loadImage(*sidBuffer);
+		delete sidBuffer;
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+
+/* Allocates an image buffer as expected from MrSID */
+ImageBuffer* 
+TeMrSIDReader::getImageBuffer(unsigned int size, unsigned int nbands, void* data)
+{
+	ImageBufferInfo properties;
+	if (nbands == 1)
+		properties.setColorSpace(ColorSpace::GRAYSCALE);
+	else
+		properties.setColorSpace(ColorSpace::RGB);
+    properties.setBandDistribution(ImageBufferInfo::BIP);
+    properties.setSampleType(ImageBufferInfo::UINT8);
+    properties.setAlignment(ImageBufferInfo::NO_ALIGN);
+	if (nbands == 3)
+	{
+	    properties.setStride(3);
+		int sampleMap[] = {0, 1, 2,};
+		properties.setSampleMap(sampleMap);
+	}
+	else
+	    properties.setStride(1);
+	return new ImageBuffer(properties, data);
+}
diff --git a/src/terralib/drivers/MrSID/TeMrSID.h b/src/terralib/drivers/MrSID/TeMrSID.h
new file mode 100644
index 0000000..50510a1
--- /dev/null
+++ b/src/terralib/drivers/MrSID/TeMrSID.h
@@ -0,0 +1,223 @@
+#ifndef TEMRSID_H
+#define TEMRSID_H
+
+/*
+#ifdef TEMRSIDDLL_EXPORTS
+#define DLL_IMP __declspec(dllexport)
+#else
+#define DLL_IMP __declspec(dllimport)
+#endif
+*/
+
+namespace LizardTech
+{
+class MrSIDNavigator;
+class MrSIDImageFile;
+class ImageBuffer;
+}
+
+#pragma warning(disable: 4275)
+
+//class DLL_IMP TeMrSIDReader
+class TeMrSIDReader
+{
+	LizardTech::MrSIDNavigator* sidNav_;
+	LizardTech::MrSIDImageFile* sidImageFile_;
+
+	unsigned char* imgBuffer_; //!< image buffer
+
+	const char* mrsidFileName_; 
+
+public:
+	//! Color Models 
+	typedef enum { 
+		ColorModelUnknown,  //!< unknown color model
+		ColorModelGray,     //!< gray scale, composed by one 8 bit channel 
+		ColorModelMap,      //!< indexed , composed by one 8 bit channel and a palette
+		ColorModelRGB,      //!< composed by three 8 bit channels
+		ColorModelRGBA      //!< composed by four 8 bit channels
+	} ColorModel;
+
+	static bool mrsid_initialized; //!< indicates if MrSID has already been initialized
+
+	//! Returns the color space
+	TeMrSIDReader::ColorModel getColorModel() const;	
+		
+	//! Constructor
+	TeMrSIDReader(const char* fname);
+
+	//! Destructor
+	~TeMrSIDReader();
+
+	//! Releases internal buffer image
+	void clear();
+
+	//! Returns the name of the data file
+	const char* fileName()
+	{	return mrsidFileName_; }
+
+	// { --- These methods are relative to the level 0 (or original) image
+	//@  
+	int nBands() const;  
+	unsigned int bitsPerPixel() const; 
+	unsigned int getWidth() const;
+	unsigned int getHeight() const;
+	void getDimensions(unsigned int& width, unsigned int& height) const;
+
+	bool hasWorldInfo();
+
+	double originX();
+	double originY();
+	void getOrigin(double& x, double& y);
+
+	double resX();
+	double resY();
+	void getResolution(double& rx, double& ry);
+
+	void getWorld(double& x0, double& y0, double& x1, double& y1);
+	void getBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax);
+	void world2Pixel(double wx, double wy, int& ix, int& iy);
+	void pixel2World(int ix, int iy, double& wx, double& wy);
+
+	// Returns the number of levels of resolution available on the image
+	int nlev();
+
+	// Returns the maxmum resolution level  available on the image
+	int getMaxZoomLevel();
+
+	//@}
+	//------- }
+
+	// { --- Methods to get ImageBuffer's
+	//@{
+	/*! Returns an ImageBuffer for loading an image from MrSIDNavigator.  
+	   \param size(in) size of the image buffer
+	   \param nbands(in) number of output bands
+	   \param bands(in) output bands vector indicating the desired output bands and its order
+	   \param data(out) image buffer  
+	   \note data must have been previously allocated and its content is band interleaved
+	*/
+	LizardTech::ImageBuffer* getImageBuffer (unsigned int size, 
+		                                     unsigned int nbands,
+	                                         const unsigned int* bands, 
+											 void* data);
+
+	/*! Returns an ImageBuffer for loading an image from MrSIDNavigator.
+	   \param size(in) size of the image buffer
+	   \param nbands(in) number of output bands
+	   \param bands(in) output bands vector indicating the desired output bands and its order
+	   \param data(out) bands image buffer vector
+	   \note data will be internally allocated and its content is band interleaved
+	*/
+	LizardTech::ImageBuffer* getImageBuffer2(unsigned int size, 
+											 unsigned int nbands,
+	                                         const unsigned int* bands, 
+											 void* data[]);
+
+	/*! Returns an ImageBuffer for loading an image from MrSIDNavigator.  
+	   \param size(in) size of the image buffer
+	   \param nbands(in) number of output bands
+	   \param data(out) image buffer  
+	   \note  
+		- data must have been previously allocated and its content is pixel interleaved
+		- band order is always set to 0, 1, 2
+	*/
+	LizardTech::ImageBuffer* getImageBuffer(unsigned int size, unsigned int nbands, void* data);
+	//@}
+
+	//@{
+	void getData(unsigned int& w, unsigned int& h, 
+		         double& x0, double& y0, 
+	             double& x1, double& y1, 
+				 unsigned int nbands, 
+	             const unsigned int* bands, 
+				 void *data[]);
+	//@}
+
+	// { --- Methods that are relative to the SidNavigator rectangle
+
+	//! Changes resolution level of MrSIDNavigator to the indicated level
+	void zoomTo(int level); 
+
+	//! Gets the current resolution level that navigator is bound
+	int getCurrentLevel();
+
+	//! Gets the number of lines and columns at the current level
+	void getDimensionAtLevel(int level, int& w, int& h);
+
+	//! Gets the dimension of the current Navigator rectangle 
+	void getCurrentRectangleDimension(int& w, int& h);
+
+	void getCurrentBoundingBox(double& xmin, double& ymin, double& xmax, double& ymax);
+	
+	//! Gets the pixel resolution at the current level
+	void getCurrentLevelResolution(double& resx, double& resy);
+
+	//! Move an redimension current rectangle navigator
+	/*!
+		\param leftColum X index of upper left corner of the rectangle
+		\param topRow Y index of the upper corner of the rectangle
+		\param width width of the rectangle
+		\param height height of the rectangle
+		\returns TRUE if the rectangle is valid and can be positioned and FALSE otherwise
+	*/
+	bool selectArea(int leftColumn, int topRow, int width, int height); 
+
+	//! Gets the image defines by the current rectangle navigator
+	/*!
+		\param pointer to a selected area of memory to hold the content of the
+		current rectangle navigator
+	*/
+	bool getSelectedArea(unsigned char* data);
+	// --- }
+
+};
+
+/*
+** ---------------------------------------------------------------
+** Inline methods:
+*/
+
+inline void TeMrSIDReader::getDimensions(unsigned int& width, unsigned int& height) const
+{
+  width = getWidth();
+  height = getHeight();
+}
+
+inline void TeMrSIDReader::getResolution(double& rx, double& ry)
+{
+  rx = resX();
+  ry = resY();
+}
+
+inline void TeMrSIDReader::getOrigin(double& x, double& y)
+{
+  x = originX();
+  y = originY();
+}
+
+inline void TeMrSIDReader::world2Pixel(double wx, double wy, int& ix, int& iy)
+{
+  double off_x, off_y;
+  double sx, sy;
+
+  getOrigin(off_x, off_y);
+  getResolution(sx, sy);
+
+  ix = (int) ((wx - off_x)/sx + 0.5);
+  iy = (int) ((wy - off_y)/sy + 0.5);
+}
+
+inline void TeMrSIDReader::pixel2World(int ix, int iy, double& wx, double& wy)
+{
+  double off_x, off_y;
+  double sx, sy;
+
+  getOrigin(off_x, off_y);
+  getResolution(sx, sy);
+
+  wx = off_x + ix * sx;
+  wy = off_y + iy * sy;
+}
+
+#endif
diff --git a/src/terralib/drivers/MySQL/TeMySQL.cpp b/src/terralib/drivers/MySQL/TeMySQL.cpp
new file mode 100644
index 0000000..6b2bb42
--- /dev/null
+++ b/src/terralib/drivers/MySQL/TeMySQL.cpp
@@ -0,0 +1,1893 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeMySQL.h"
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+extern "C" {
+extern char *strxmov(char* dest, const char* src, ...);
+}
+
+#define MAX(a,b) a>b?a:b
+#define MIN(a,b) a<b?a:b
+
+
+double swappd(double din)
+{
+	char  stri[8],stro[8];
+	double dout;
+
+	memcpy (stri,&din,8);
+	stro[0] = stri[7];
+	stro[1] = stri[6];
+	stro[2] = stri[5];
+	stro[3] = stri[4];
+	stro[4] = stri[3];
+	stro[5] = stri[2];
+	stro[6] = stri[1];
+	stro[7] = stri[0];
+	memcpy (&dout,stro,8);
+	return (dout);
+}
+
+
+TeMySQL::TeMySQL()
+{
+	isConnected_ = false;
+	dbmsName_ = "MySQL";
+	bufferBlob_ = 0;
+	bufferBlobSize_ = 0;
+	mysql_init (&mysql_);
+}
+
+
+TeMySQL::~TeMySQL()
+{
+	if (bufferBlob_)
+		delete bufferBlob_;
+	if (isConnected_)
+		close ();
+}
+
+void
+TeMySQL::close()
+{
+	clear();
+	if (bufferBlob_)
+		delete bufferBlob_;
+	bufferBlob_ = 0;
+	bufferBlobSize_ = 0;
+	mysql_close(&mysql_);
+}
+
+bool 
+TeMySQL::newDatabase(const string& database, const string& user, const string& password, const string& host, const int & /* port */, bool terralibModel)
+{
+	if (mysql_real_connect(&mysql_,host.c_str(),user.c_str(),password.c_str(),"",0,NULL,0) == NULL)
+	{
+		isConnected_ = false;
+		return false;
+	}
+
+	string create = "CREATE DATABASE " + database;
+	if (mysql_query(&mysql_,create.c_str()) != 0)
+//	if (mysql_create_db(&mysql_,database.c_str()) != 0)
+	{
+		isConnected_ = false;
+		return false;
+	}
+
+	if (mysql_select_db(&mysql_,database.c_str()) != 0)
+	{
+		isConnected_ = false;
+		return false;
+	}
+
+	if(terralibModel)
+	{
+		//create conceptual model
+		if(!this->createConceptualModel())
+			return false;
+	}
+	isConnected_ = true;
+	user_ = user;
+	host_ = host;
+	password_ = password;
+	database_ = database;
+	return true;
+}
+
+
+bool 
+TeMySQL::connect (const string& host, const string& user, const string& password, const string& database, int port)
+{
+	if (mysql_real_connect(&mysql_,host.c_str(),user.c_str(),password.c_str(),database.c_str(),port,NULL,0) == NULL)
+	{
+		isConnected_ = false;
+		return false;
+	}
+
+	isConnected_ = true;
+	user_ = user;
+	host_ = host;
+	password_ = password;
+	database_ = database;
+	return true;
+}
+
+
+bool 
+TeMySQL::showDatabases (const string& host, const string& user, const string& password, vector<string>& dbNames, int port)
+{
+	unsigned long i;
+	MYSQL_ROW row;
+
+	if (mysql_real_connect(&mysql_,host.c_str(),user.c_str(),password.c_str(),0,port,NULL,0) == NULL)
+	{
+		errorMessage_= string(mysql_error(&mysql_));
+		return false;
+	}
+
+	MYSQL_RES *result = mysql_list_dbs(&mysql_, "%");
+
+	unsigned int numRows = (unsigned int)mysql_num_rows(result);
+
+	for (i = 0; i < numRows; ++i)
+	{
+		row = mysql_fetch_row(result);
+		dbNames.push_back(row[0]);
+	}
+
+	close();
+
+	return true;
+}
+
+
+bool 
+TeMySQL::execute (const string &q)
+{
+	if (mysql_real_query(&mysql_, q.c_str(), q.size()) != 0)
+	{
+		errorMessage_= string(mysql_error(&mysql_));
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeMySQL::tableExist(const string& table)
+{
+	string q ="DESC "+ table;
+
+	if (mysql_real_query(&mysql_, q.c_str(), q.size()) != 0)
+	{
+		errorMessage_ = string(mysql_error(&mysql_));
+	}
+
+	MYSQL_RES*	res_ = mysql_use_result(&mysql_);
+
+	if (res_)
+	{
+		mysql_free_result(res_);
+		return true;
+	}
+	else
+		return false;
+}
+
+bool 
+TeMySQL::columnExist(const string& table, const string&  column ,TeAttribute& attr)
+{
+	string q = "SHOW COLUMNS FROM " + table + " LIKE \'" + column + "\'";
+	if (mysql_query(&mysql_, q.c_str()) != 0)
+	{
+		return false;
+	}
+	MYSQL_RES* fieldsres = mysql_use_result(&mysql_);
+	if (!fieldsres)
+		return false;
+	MYSQL_ROW row = mysql_fetch_row(fieldsres);
+	if (!row)
+		return false;
+	attr.rep_.name_ = column;
+	
+	string ftype(row[1]);
+	string fpk(row[3]);
+	if (ftype.find("char") != string::npos)
+		attr.rep_.type_ = TeSTRING;
+	else if (ftype.find("int") != string::npos)
+		attr.rep_.type_ = TeINT;
+	else if (ftype.find("double") != string::npos)
+		attr.rep_.type_ = TeREAL;
+	else if (ftype.find("blob") != string::npos)
+		attr.rep_.type_ = TeBLOB;
+	else if ((ftype.find("date") != string::npos) || (ftype.find("time") != string::npos))
+		attr.rep_.type_ = TeDATETIME;
+
+	unsigned int p1 = ftype.find("(");
+	unsigned int p2 = ftype.find(")");
+	if (p1 != string::npos && p2 != string::npos)
+		attr.rep_.numChar_ = atoi(ftype.substr(p1+1,p2-1).c_str());
+
+	if (fpk.find("PRI") != string::npos)
+		attr.rep_.isPrimaryKey_ = true;
+
+	mysql_free_result(fieldsres);
+	return true;
+}
+
+bool TeMySQL::addColumn (const string& table, TeAttributeRep &rep)
+{
+	string q ="ALTER TABLE " + table +" ADD ";
+	string type;
+	char	size[8];
+
+	string field = TeGetExtension(rep.name_.c_str());
+	if(field.empty())
+		field = rep.name_;
+
+	switch (rep.type_)
+	{
+		case TeSTRING:
+			type = " VARCHAR ";
+			sprintf (size,"(%d)",rep.numChar_);
+			type += string (size);
+			break;
+		case TeREAL:
+			type = " DOUBLE";
+			break;
+		case TeINT:
+			type = " INT";
+			break;
+		case TeCHARACTER:
+			type = " CHAR";
+			break;
+		case TeDATETIME:
+			type = " DATETIME";
+			break;
+		case TeBLOB:
+			type = " LONGBLOB";
+			break; 
+		default:
+		type = " VARCHAR ";
+		sprintf (size,"(%d)",rep.numChar_);
+		type += string (size);
+		break;
+	}
+	q += field;
+	q += type;
+	return execute(q);
+}
+
+TeDatabasePortal*  
+TeMySQL::getPortal ()
+{
+	TeMySQLPortal* portal = new TeMySQLPortal (this);
+	return portal;
+}
+
+bool 
+TeMySQL::createRasterTable (const string& table)
+{
+	if (table.empty())
+		return false;
+
+	string create = "CREATE TABLE "+table+" (";
+	create += "block_id VARCHAR(50) not null, ";
+	create += "lower_x double(24,15) not null, ";
+	create += "lower_y double(24,15) not null, ";
+	create += "upper_x double(24,15) not null, ";
+	create += "upper_y double(24,15) not null, ";
+	create += "band_id int(10) unsigned not null, ";
+	create += "resolution_factor int(10) unsigned , ";
+	create += "subband int(10) unsigned,";
+	create += "spatial_data LONGBLOB not null NOT NULL, ";
+	create += "block_size int(10) unsigned not null, ";
+	create += "PRIMARY KEY (block_id),";
+	create += "INDEX (band_id),";
+	create += "INDEX (subband),";
+	create += "INDEX (resolution_factor),";
+	create += "INDEX (lower_x,lower_y,upper_x,upper_y))";
+	return execute (create);
+}
+
+
+bool 
+TeMySQL::createPolygonGeometry (const string&  table)
+{
+	if (table.empty())
+		return false;
+
+	string q ="CREATE TABLE " + table +"(";
+	q += "geom_id INT UNSIGNED not null AUTO_INCREMENT,";
+	q += "object_id VARCHAR(50) NOT NULL ,";
+	q += "num_coords INT UNSIGNED not null ,";
+	q += "num_holes INT UNSIGNED not null ,";
+	q += "parent_id INT UNSIGNED not null ,";
+	q += "lower_x double(24,15) not null ,";
+	q += "lower_y double(24,15) not null ,";
+	q += "upper_x double(24,15) not null ,";
+	q += "upper_y double(24,15) not null ,";
+	q += "ext_max double(24,15) not null ,";
+	q += "spatial_data LONGBLOB not null ,";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX (ext_max),";
+	q += "INDEX (lower_x,lower_y,upper_x,upper_y))";
+	bool status = execute(q);
+	return status;
+}
+
+
+bool 
+TeMySQL::createLineGeometry (const string& table)
+{
+	if (table.empty())
+		return false;
+
+	string q ="CREATE TABLE " + table +"(";
+	q += "geom_id INT UNSIGNED not null AUTO_INCREMENT,";
+	q += "object_id VARCHAR(50) not null ,";
+	q += "num_coords INT UNSIGNED not null ,";
+	q += "lower_x double(24,15) not null ,";
+	q += "lower_y double(24,15) not null ,";
+	q += "upper_x double(24,15) not null ,";
+	q += "upper_y double(24,15) not null ,";
+	q += "ext_max double(24,15) not null ,";
+	q += "spatial_data LONGBLOB not null ,";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX (lower_x,lower_y,upper_x,upper_y))";
+	return execute(q);
+}
+
+
+bool
+TeMySQL::defineIntegrity(void)
+{
+	return true;		// mysql doesn't have referencial integrity
+						// there is nothing to be done
+}
+
+
+TeMySQLPortal::TeMySQLPortal ( TeMySQL  *m)
+{
+	mysql_ = m->getMySQL();
+	numRows_ = 0;
+	numFields_ = 0;
+	result_ = 0;
+	row_ = 0;
+	db_ = m;
+}
+
+
+TeMySQLPortal::TeMySQLPortal ( const TeMySQLPortal& p) : TeDatabasePortal()
+{
+	mysql_ = p.mysql_;
+	numRows_ = 0;
+	numFields_ = 0;
+	result_ = 0;
+	row_ = 0;
+}
+
+
+TeMySQLPortal::~TeMySQLPortal ()
+{
+	freeResult ();
+}
+
+
+string 
+TeMySQL::escapeSequence(const string& from)
+{
+	string ret = "";
+	if (!from.empty())
+	{
+		char	*to = new char[from.size()*2+1];
+		mysql_real_escape_string(&mysql_,to,from.c_str(),from.size());
+		ret = to;
+		delete  to;
+	}
+
+	return ret;
+}
+
+bool TeMySQLPortal::query (const string &q, TeCursorLocation /* l */, TeCursorType /* t */, TeCursorEditType /* e */, TeCursorDataType /*dt*/)
+{
+	if (result_)
+		freeResult();
+	attList_.clear ();
+
+	if (mysql_real_query(mysql_, q.c_str(), q.size()) != 0)
+	{
+		string erro = string(mysql_error(mysql_));
+		return false;
+	}
+
+	result_ = mysql_store_result(mysql_);
+	numRows_ = (int)mysql_num_rows(result_);
+	if (result_)  // there are rows
+	{
+		numFields_ = mysql_num_fields(result_);
+
+		MYSQL_FIELD *fields = mysql_fetch_fields(result_);
+
+		int i;
+		for(i = 0; i < numFields_; i++)
+		{
+			TeAttribute attribute;
+			switch (fields[i].type)
+			{
+			case FIELD_TYPE_DECIMAL:
+			case FIELD_TYPE_TINY:
+			case FIELD_TYPE_SHORT:
+			case FIELD_TYPE_LONG:
+			case FIELD_TYPE_INT24:
+				attribute.rep_.type_ = TeINT;
+				attribute.rep_.numChar_ = fields[i].length;
+				break;
+
+			case FIELD_TYPE_FLOAT:
+			case FIELD_TYPE_DOUBLE:
+			case FIELD_TYPE_LONGLONG:
+				attribute.rep_.type_ = TeREAL;
+				attribute.rep_.numChar_ = fields[i].length;
+				attribute.rep_.decimals_ = fields[i].decimals;
+				break;
+
+			case FIELD_TYPE_DATE:
+			case FIELD_TYPE_TIME:
+			case FIELD_TYPE_DATETIME:
+			case FIELD_TYPE_YEAR:
+			case FIELD_TYPE_NEWDATE:
+				attribute.rep_.type_ = TeDATETIME;
+				attribute.dateTimeFormat_ = "YYYYsMMsDDsHHsmmsSS24";
+				attribute.dateChronon_ = TeSECOND;
+				break;
+
+			case FIELD_TYPE_TINY_BLOB:
+			case FIELD_TYPE_MEDIUM_BLOB:
+			case FIELD_TYPE_LONG_BLOB:
+			case FIELD_TYPE_BLOB:
+				attribute.rep_.type_ = TeBLOB;
+				break;
+
+			case FIELD_TYPE_VAR_STRING:
+			case FIELD_TYPE_STRING:
+				attribute.rep_.type_ = TeSTRING;
+				attribute.rep_.numChar_ = fields[i].length;
+				break;
+
+			case FIELD_TYPE_ENUM:
+			case FIELD_TYPE_SET:
+			default :
+				attribute.rep_.type_ = TeUNKNOWN;
+				break;
+			}
+			if (fields[i].flags & PRI_KEY_FLAG)
+				attribute.rep_.isPrimaryKey_ = true;
+
+			if (fields[i].flags & AUTO_INCREMENT_FLAG)
+				attribute.rep_.isAutoNumber_ = true;
+
+			attribute.rep_.name_ = fields[i].name;
+			attList_.push_back ( attribute );
+		}
+    }
+    else  // mysql_store_result() returned nothing; should it have?
+    {
+        if(mysql_field_count(mysql_) == 0)
+        {
+	        // query does not return data
+            // (it was not a SELECT)
+			numFields_ = 0;
+            numRows_ = (int)mysql_affected_rows(mysql_);
+        }
+        else // mysql_store_result() should have returned data
+        {
+            return false;
+        }
+    }
+	return true;
+}
+
+
+bool 
+TeMySQLPortal::fetchRow ()
+{
+	if ((row_ = mysql_fetch_row(result_)))
+		return true;
+	else
+		return false;
+}
+
+
+bool 
+TeMySQLPortal::fetchRow (int i)
+{
+	if (i >= 0 && i < numRows_)
+	{
+		mysql_data_seek (result_, i);
+		return fetchRow ();
+	}
+	else
+		return false;
+}
+
+
+void TeMySQLPortal::freeResult ()
+{
+	if (result_)
+	{
+		mysql_free_result(result_);
+		result_ = 0;
+	}
+}
+
+
+int 
+TeMySQLPortal::insertId ()
+{
+	return (int)mysql_insert_id(mysql_);
+}
+
+
+int 
+TeMySQL::insertId ()
+{
+	return (int)mysql_insert_id(&mysql_);
+}
+
+
+
+bool 
+TeMySQL::insertProjection (TeProjection *proj)
+{
+	char q[512];
+	sprintf (q,"INSERT INTO te_projection VALUES('','%s',%.15f,%.15f,%.15f,%.15f,%.15f,%.15f,'%s',%.15f,%d,'%s',%.15f,%.15f,%.15f,%.15f,%.15f)",
+	proj->name().c_str(),
+		proj->params().lon0*TeCRD,
+		proj->params().lat0*TeCRD,
+		proj->params().offx,
+		proj->params().offy,
+		proj->params().stlat1*TeCRD,
+		proj->params().stlat2*TeCRD,
+		proj->params().units.c_str(),
+		proj->params().scale,
+		proj->params().hemisphere,
+		proj->datum().name().c_str(),
+		proj->datum().radius(),
+		proj->datum().flattening(),
+		proj->datum().xShift(),
+		proj->datum().yShift(),
+		proj->datum().zShift());
+
+	if (!execute(q))
+		return false;
+
+	proj->id(insertId());
+	return true;
+}
+
+
+bool 
+TeMySQL::insertView (TeView *view)
+{
+	TeProjection* proj = view->projection();
+	// save it�s projection
+	if (!proj || !insertProjection(proj))
+	{
+		errorMessage_ = "N�o � poss�vel inserir vista sem proje��o";
+		return false;
+	}
+
+	char q[512];
+	sprintf (q,"INSERT INTO te_view VALUES('',%d,'%s','%s',%d)",
+			proj->id(),view->name().c_str(),view->user().c_str(),view->isVisible());
+
+	if (!execute(q))
+		return false;
+
+	view->id(insertId());
+
+	for (unsigned int th=0; th<view->size(); th++)
+	{
+		TeViewNode* node = view->get (th);
+		if (node->type() == TeTHEME)
+		{
+			TeTheme *theme = (TeTheme*) node;
+			insertTheme (theme);
+		}
+		else
+		{
+			TeViewTree* tree = (TeViewTree*)node;
+			insertViewTree (tree);
+		}
+	}
+
+	viewMap_[view->id()] = view;
+	return true;
+}
+
+
+bool 
+TeMySQL::insertViewTree (TeViewTree *tree)
+{
+	string save;
+	save = "INSERT INTO te_theme (name, layer_id, node_type, view_id, priority) VALUES('','";
+	save += tree->name() +  "," + Te2String(tree->parentId()) + "," + Te2String((int)tree->type());
+	save += "," + Te2String(tree->view()) + "," + Te2String(tree->priority()) + ")";
+	if (!execute(save))
+		return false;
+	tree->id(insertId());
+	return true;
+}
+
+
+bool 
+TeMySQL::insertTheme (TeTheme *tem)
+{
+	string save;
+	save = "INSERT INTO te_theme ";
+	save += "(layer_id, view_id, name, parent_id, priority, node_type, min_scale, max_scale, ";
+	save += "generate_attribute_where, generate_spatial_where, generate_temporal_where, ";
+	save += "collection_table, visible_rep, enable_visibility) ";
+	save += " VALUES(";
+	save += Te2String(tem->layerId()) +", ";
+	save += Te2String(tem->view()) +", ";
+	save += "'" + tem->name() + "', ";
+	save += Te2String(tem->parentId()) +", ";
+	save += Te2String(tem->priority()) +", ";
+	save += Te2String(tem->type()) +", ";
+	save += Te2String(tem->minScale()) +", ";
+	save += Te2String(tem->maxScale()) +", ";
+	save += "'" + escapeSequence(tem->attributeRest()) + "', ";
+	save += "'" + escapeSequence(tem->spatialRest()) + "', ";
+	save += "'" + escapeSequence(tem->temporalRest()) + "', ";
+	save += "'" + escapeSequence(tem->collectionTable()) + "', ";
+	save += Te2String(tem->visibleRep()) +", ";
+	save += Te2String(tem->visibility()) +" ) ";
+
+	if (!this->execute(save))
+		return false;
+
+	tem->id(this->insertId());
+
+	if (tem->collectionTable().empty())
+	{
+		string colTab = "te_collection_" + Te2String(tem->id());
+		tem->collectionTable(colTab);
+		save = "UPDATE te_theme SET collection_table='" + colTab + "' WHERE theme_id=" ;
+		save += Te2String(tem->id());
+		this->execute(save);
+	}
+
+	bool status;
+
+	// insert grouping
+	int numSlices = 0;
+	if(tem->grouping())
+	{
+		if(!insertGrouping (tem->id(), tem->grouping()))
+			return false;
+		numSlices = tem->grouping()->groupNumSlices_;
+	}
+		
+	tem->outOfCollectionLegend().group(-1); 
+	tem->outOfCollectionLegend().theme(tem->id()); 
+	status = insertLegend (&(tem->outOfCollectionLegend())); 
+	if (!status)
+		return status;
+
+	tem->withoutDataConnectionLegend().group(-2); 
+	tem->withoutDataConnectionLegend().theme(tem->id()); 
+	status = insertLegend (&(tem->withoutDataConnectionLegend())); 
+	if (!status)
+		return status;
+
+	tem->defaultLegend().group(-3); 
+	tem->defaultLegend().theme(tem->id()); 
+	status = insertLegend (&(tem->defaultLegend())); 
+	if (!status)
+		return status;
+
+	tem->pointingLegend().group(-4); 
+	tem->pointingLegend().theme(tem->id()); 
+	status = insertLegend (&(tem->pointingLegend())); 
+	if (!status)
+		return status;
+
+	tem->queryLegend().group(-5); 
+	tem->queryLegend().theme(tem->id()); 
+	status = insertLegend (&(tem->queryLegend())); 
+	if (!status)
+		return status;
+
+	tem->queryAndPointingLegend().group(-6); 
+	tem->queryAndPointingLegend().theme(tem->id()); 
+	status = insertLegend (&(tem->queryAndPointingLegend())); 
+	if (!status)
+		return status;
+
+	for (int i = 0; i < numSlices; i++)
+	{
+		tem->legend()[i].group(i);
+		tem->legend()[i].theme(tem->id());
+		status = insertLegend (&(tem->legend()[i]));
+		if (!status)
+			return status;
+	}
+	if (!status)
+		return status;
+
+	themeMap_[tem->id()] = tem;
+	return updateThemeTable(tem);
+}
+
+bool 
+TeMySQL::insertThemeGroup (TeViewTree* tree)
+{
+	string save;
+	save = "INSERT INTO te_theme ";
+	save += "(name,parent_id,node_type,view_id,priority) ";
+	save += " VALUES ('" + tree->name() + "',1,1, ";
+	save += Te2String(tree->view()) +", ";
+	save += Te2String(tree->priority()) +") ";
+	if (!this->execute(save))
+		return false;
+	tree->id(this->insertId());
+	return true;
+}
+
+
+bool 
+TeMySQL::generateLabelPositions (TeTheme *theme)
+{
+	string	geomTable, query;
+	string	collTable = theme->collectionTable();
+
+	if((collTable.empty()) || (!tableExist(collTable)))
+		return false;
+
+	if (theme->layer()->hasGeometry(TeLINES))
+	{	
+		geomTable = theme->layer()->tableName(TeLINES);
+				
+		string extMax = "CREATE TEMPORARY TABLE maxTable";
+		extMax += " SELECT object_id, lower_x, lower_y, upper_x, upper_y";
+		extMax += " FROM " + geomTable + " ORDER BY object_id, ext_max DESC";
+		
+		if(!execute(extMax))
+			return false;
+
+		query = "UPDATE " + collTable + ",maxTable SET label_x = (lower_x + upper_x)/2,";
+		query += "label_y = (lower_y + upper_y)/2 WHERE c_object_id = object_id";
+
+		if (execute(query) == false)
+		{
+			execute("DROP TABLE maxTable");
+			return false;
+		}
+
+		execute("DROP TABLE maxTable");
+	}
+
+	if (theme->layer()->hasGeometry(TePOINTS))
+	{
+		geomTable = theme->layer()->tableName(TePOINTS);
+
+		query = "UPDATE " + collTable + "," + geomTable + " SET label_x = x,";
+		query += "label_y = y WHERE c_object_id = object_id";
+
+		if(execute(query) == false)
+			return false;
+	}
+	
+	if (theme->layer()->hasGeometry(TePOLYGONS))
+	{	
+		geomTable = theme->layer()->tableName(TePOLYGONS);
+				
+		string extMax = "CREATE TEMPORARY TABLE maxTable";
+		extMax += " SELECT object_id, lower_x, lower_y, upper_x, upper_y";
+		extMax += " FROM " + geomTable + " ORDER BY object_id, ext_max DESC";
+		
+		if(!execute(extMax))
+			return false;
+
+		query = "UPDATE " + collTable + ",maxTable SET label_x = (lower_x + upper_x)/2,";
+		query += "label_y = (lower_y + upper_y)/2 WHERE c_object_id = object_id";
+
+		if (execute(query) == false)
+		{
+			execute("DROP TABLE maxTable");
+			return false;
+		}
+		
+		execute("DROP TABLE maxTable");
+	}
+	
+	if(theme->layer()->hasGeometry(TeCELLS))
+	{
+		geomTable = theme->layer()->tableName(TeCELLS);
+
+		query = "UPDATE " + collTable + "," + geomTable + " SET label_x = (lower_x + upper_x)/2,";
+		query += "label_y = (lower_y + upper_y)/2 WHERE c_object_id = object_id";
+
+		if (execute(query) == false)
+			return false;	
+	}
+
+
+
+
+	
+	return true;
+}
+
+
+bool
+TeMySQL::insertLayer (TeLayer* layer)
+{
+	TeProjection* proj = layer->projection();
+	if (!proj || !insertProjection(proj))
+	{
+		errorMessage_ = "Layer sem proje��o ou falha na inser��o da proje��o";
+		return false;
+	}
+	int pid = proj->id();
+	string save = "INSERT INTO te_layer (layer_id,projection_id,name,lower_x,lower_y,upper_x,upper_y) VALUES('',";
+	save += Te2String(pid);
+	save += ",'" + layer->name() + "', ";
+	save += Te2String(layer->box().x1(),15)+ ", ";
+	save += Te2String(layer->box().y1(),15)+ ", ";
+	save += Te2String(layer->box().x2(),15)+ ", ";
+	save += Te2String(layer->box().y2(),15) + ")";
+
+	// if layer insertion fails remove projection
+	if (!this->execute (save))
+	{
+		string sql = "DELETE FROM te_projection WHERE  projection_id = " + Te2String(pid);
+		this->execute(sql);	
+		return false;
+	}
+
+	layer->id(this->insertId());
+	layerMap_[layer->id()] = layer;
+
+	return true;
+}
+
+
+bool TeMySQL::insertLegend (TeLegendEntry *legend)
+{
+	char q[1024];
+	string save;
+	sprintf (q,"INSERT INTO te_legend VALUES('',%d,%d,%d,'%s','%s','%s')",
+	legend->theme(),
+	legend->group(),
+	legend->count(),
+	legend->from().c_str(),
+	legend->to().c_str(),
+	legend->label().c_str());
+	save = q;
+
+	if (!this->execute(save))
+		return false;
+
+	int legId = insertId();
+	legend->id(legId);
+	legendMap_[legend->id()] = legend;
+	return insertVisual(legend);
+}
+
+
+bool
+TeMySQL::insertRepresentation (int layerId, TeRepresentation& rep)
+{
+	if (layerId <= 0)
+		return false;
+	
+	string sql;
+	sql = "INSERT INTO te_representation (layer_id, geom_type, geom_table, description,";
+	sql += "lower_x, lower_y, upper_x, upper_y, res_x, res_y, num_cols, num_rows) VALUES( ";
+	sql += Te2String(layerId) + ", ";
+	sql += Te2String(static_cast<int>(rep.geomRep_)) + ", ";
+	sql += "'" + rep.tableName_ + "', ";
+	sql += "'" + rep.description_ + "',";
+	sql += Te2String(rep.box_.x1(),15) + ", ";
+	sql += Te2String(rep.box_.y1(),15) + ", ";
+	sql += Te2String(rep.box_.x2(),15) + ", ";
+	sql += Te2String(rep.box_.y2(),15) + ", ";
+	sql += Te2String(rep.resX_,15) + ", ";
+	sql += Te2String(rep.resY_,15) + ", ";
+	sql += Te2String(rep.nCols_,15) + ", ";
+	sql += Te2String(rep.nLins_,15) + ") ";
+	if (execute(sql))
+	{
+		rep.id_ = (this->insertId());
+		return true;
+	}
+	return false;
+}
+
+bool 
+TeMySQL::insertRelationInfo(const int tableId, const string& tField,
+						    const string& eTable, const string& eField, int& relId)
+{
+	// check if relation already exists
+	TeMySQLPortal* portal = (TeMySQLPortal*) this->getPortal();
+	if (!portal)
+		return false;
+
+	relId = -1;
+	string sel = "SELECT relation_id FROM te_tables_relation WHERE";
+	sel += " related_table_id = " + Te2String(tableId);
+	sel += " AND related_attr = '" + tField + "'";
+	sel += " AND external_table_name = '" + eTable + "'";
+	sel += " AND external_attr = '" + eField + "'";
+	if (!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+
+	if (portal->fetchRow())
+	{
+		relId = atoi(portal->getData(0));
+		delete portal;
+		return true;
+	}
+	delete portal;
+
+	string sql = "INSERT INTO te_tables_relation(related_table_id, related_attr, external_table_name, external_attr) ";
+	sql += " VALUES( ";
+	sql += Te2String(tableId);
+	sql += ",'" + tField + "'";
+	sql += ",'" + eTable + "'";
+	sql += ",'" + eField + "')";
+	if (!this->execute(sql))
+		return false;
+	relId = this->insertId(); 
+	return true;
+}
+
+bool 
+TeMySQL::insertTableInfo (int layerId, TeTable &table, const string& user)
+{
+	string sql;
+
+	sql = "INSERT INTO te_layer_table (unique_id, attr_link,attr_initial_time, attr_final_time, attr_time_unit,attr_table_type, ";
+	sql += " user_name, attr_table ";
+	if (layerId > 0)
+		sql += ",layer_id";
+	sql += ") VALUES( ";
+	sql += "'" + table.uniqueName() + "', ";
+	sql += "'" + table.linkName() + "', ";
+	sql += "'" + table.attInitialTime() + "', ";
+	sql += "'" + table.attFinalTime() + "', ";
+	sql += "" + Te2String(table.attTimeUnit()) + ", ";
+	sql += ""+ Te2String(table.tableType()) + ", ";
+	sql += "'" + user + "','" + table.name() +"'";
+	if (layerId > 0)
+		sql += ", " + Te2String(layerId) ;
+	sql += ")";
+
+	if (!this->execute(sql))
+		return false;
+
+	int id = (this->insertId());
+	table.setId(id);
+	return true;
+}
+
+bool 
+TeMySQL::insertThemeTable (int themeId, int tableId, int relationId, int tableOrder)
+{
+	string relId;
+	if (relationId > 0)
+		relId = Te2String(relationId);
+	else
+		relId = "NULL";
+
+	string sql = "INSERT INTO te_theme_table VALUES ('',";
+	sql += Te2String(themeId) + "," + Te2String(tableId) + ",";
+	sql += relId + "," + Te2String(tableOrder) + ")";
+
+
+	if (!execute(sql))
+		return false;
+
+	return true;
+}
+
+
+bool 
+TeMySQL::insertPolygon (const string& table, TePolygon &poly )
+{
+	double	ext_max;
+
+	int	i,
+		ni,
+		size;
+	unsigned int k;
+	double	*points	= NULL;
+	char	buf[256], *query, *end;
+
+
+	int parentId = 0;
+	for ( k = 0; k < poly.size(); k++ )
+	{
+		TeLinearRing ring ( poly[k] );
+		TeBox b = ring.box();
+		size = ring.size();
+		ni = 0;
+		ext_max = MAX(b.width(),b.height());
+		if (k==0)
+			ni = poly.size()-1;
+		else
+			ni = 0;
+
+		// Create and save the BLOB
+		points = new double[2*sizeof(double)*size];
+
+		int iac = 0;
+		for (i=0;i<size;i++)
+		{
+			points[iac++]=swappd(ring[i].x());
+			points[iac++]=swappd(ring[i].y());
+		}
+
+		sprintf (buf,"INSERT INTO %s values('','%s',%d,%d,%d,%.15f,%.15f,%.15f,%.15f,%.15f,",
+			table.c_str(),escapeSequence(poly.objectId()).c_str(),size,ni,parentId,b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+
+		query = new char[size*4*sizeof(double)+strlen(buf)+4];
+		end = strxmov(query,buf,(char*)0);
+		*end++ = '\'';
+		end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+		*end++ = '\'';
+		*end++ = ')';
+		delete points;
+
+		if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+		{
+			errorMessage_ = string(mysql_error(&mysql_));
+			delete query;
+			return false;
+		}
+		delete query;
+		query = 0;
+		ring.geomId (insertId());
+		if (k==0)
+			parentId = ring.geomId();
+	}
+	sprintf(buf,"UPDATE %s SET parent_id=%d WHERE geom_id=%d",table.c_str(),parentId,parentId);
+	if (mysql_real_query(&mysql_,buf,(unsigned int)strlen(buf)) != 0)
+	{
+		errorMessage_ = string(mysql_error(&mysql_));
+		delete query;
+		return false;
+	}	
+	return true;
+}
+
+bool 
+TeMySQL::updatePolygon (const string& table, TePolygon &poly )
+{
+	double	ext_max;
+	int ni;
+	unsigned int i,k,size;
+	double	*points	= NULL;
+	char	buf[256], message[256], *query, *end;
+	TeBox b = poly.box();
+
+	for ( k = 0; k < poly.size(); k++ )
+	{
+		TeLinearRing ring ( poly[k] );
+		size = ring.size();
+		ni = 0;
+		if (k==0)
+		{
+			ext_max = MAX(b.width(),b.height());
+			ni = poly.size()-1;
+		}
+		else
+			ni = 0;
+
+// Create and save the BLOB
+		points = new double[2*sizeof(double)*size];
+		int iac = 0;
+		for (i=0;i<size;i++)
+		{
+			points[iac++]=swappd(ring[i].x());
+			points[iac++]=swappd(ring[i].y());
+		}
+
+		sprintf (buf,"UPDATE %s SET num_coords=%d, num_holes=%d, parent_id=%d, lower_x=%g, lower_y=%g, upper_x=%g, upper_y=%g, ext_max=%g, spatial_data=",
+			table.c_str(),size,ni,k,b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+		query = new char[size*4*sizeof(double)+strlen(buf)+50];
+		end = strxmov(query,buf,(char*)0);
+		*end++ = '\'';
+		end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+		*end++ = '\'';
+		sprintf (message," WHERE geom_id=%d",ring.geomId());
+		end = strxmov(end,message,0);
+		delete points;
+
+		if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+		{
+			errorMessage_ = string(mysql_error(&mysql_));
+			delete query;
+			return false;
+		}
+		delete query;
+		query = 0;
+	}
+	return true;
+}
+
+
+bool 
+TeMySQLPortal::fetchGeometry (TePolygon& poly)
+{
+	int ni,j;
+	TeLinearRing ring = this->getLinearRing(ni);
+	poly.objectId ( ring.objectId() );
+	poly.geomId ( ring.geomId() );
+	poly.add ( ring );
+	int parentId = poly.geomId();
+	while (fetchRow())
+	{
+		if (atoi(this->getData("parent_id")) == parentId)
+		{
+			TeLinearRing ring = getLinearRing(j);
+			poly.add ( ring );
+		}
+		else
+			return true;
+	}
+	return false;
+}
+
+
+TeLinearRing 
+TeMySQLPortal::getLinearRing (int &ni)
+{
+	int index = atoi(getData("geom_id"));
+	string object_id = getData("object_id");
+	int np = atoi (getData("num_coords"));
+	ni = atoi (getData("num_holes"));
+	TeBox b (getDouble("lower_x"),getDouble("lower_y"),getDouble("upper_x"),getDouble("upper_y"));
+	int k;
+	TeLine2D line;
+	double x,y,*data = (double*)getData("spatial_data");
+
+	for (k=0;k<np;k++)
+	{
+		x = swappd(*data++);
+		y = swappd(*data++);
+		TeCoord2D pt(x,y);
+		line.add(pt);
+	}
+
+	TeLinearRing ring ( line );
+	ring.objectId (object_id);
+	ring.geomId (index);
+	ring.setBox (b);
+	return ring;
+}
+
+
+bool 
+TeMySQL::insertLine (const string& table, TeLine2D &l)
+{
+	char	buf[256],
+			*query,
+			*end;
+	double	*points	= NULL,
+			ext_max;
+	int		size=l.size(),
+			i,
+			iac;
+	TeBox	b=l.box();
+
+	ext_max = MAX(b.width(),b.height());
+	points = new double[2*sizeof(double)*size];
+	iac = 0;
+
+	for (i=0;i<size;i++)
+	{
+		points[iac++]=l[i].x();
+		points[iac++]=l[i].y();
+	}
+
+	sprintf (buf,"INSERT INTO %s values('','%s',%d,%.15f,%.15f,%.15f,%.15f,%.15f,",
+	table.c_str(),
+	escapeSequence(l.objectId()).c_str(),
+	size,
+	b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+
+	query = new char[size*4*sizeof(double)+strlen(buf)+4];
+
+	end = strxmov(query,buf,0);
+	*end++ = '\'';
+	end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+	*end++ = '\'';
+	*end++ = ')';
+	delete points;
+
+	if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+	{
+		errorMessage_ = string(mysql_error(&mysql_));
+		delete query;
+		return false;
+	}
+
+	l.geomId (insertId());
+	delete query;
+	return true;
+}
+
+
+bool 
+TeMySQL::updateLine (const string& table, TeLine2D &l)
+{
+	char	buf[256],
+			message[256],
+			*query,
+			*end;
+	double	*points	= NULL,
+			ext_max;
+	int		size=l.size(),
+			i,
+			iac;
+	TeBox	b=l.box();
+
+	ext_max = MAX(b.width(),b.height());
+	points = new double[2*sizeof(double)*size];
+	iac = 0;
+
+	for (i=0;i<size;i++)
+	{
+		points[iac++]=l[i].x();
+		points[iac++]=l[i].y();
+	}
+
+	sprintf (buf,"UPDATE %s SET num_coords=%d, lower_x=%g, lower_y=%g, upper_x=%g, upper_y=%g, ext_max=%g, spatial_data=",
+	table.c_str(),size,b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),ext_max);
+	query = new char[size*4*sizeof(double)+strlen(buf)+50];
+	end = strxmov(query,buf,(char*)0);
+	*end++ = '\'';
+	end += mysql_real_escape_string(&mysql_,end,(char*)points,size*2*sizeof(double));
+	*end++ = '\'';
+	delete points;
+
+	sprintf (message," WHERE geom_id=%d",l.geomId());
+	end = strxmov(end,message,(char*)0);
+
+	if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)) != 0)
+	{
+		errorMessage_ = string(mysql_error(&mysql_));
+		delete query;
+		return false;
+	}
+	delete query;
+	return true;
+}
+
+
+
+bool
+TeMySQLPortal::fetchGeometry(TeLine2D& line)
+{
+	int index = atoi (getData ("geom_id"));
+	string object_id = getData ("object_id");
+	int np = atoi (getData("num_coords"));
+	TeBox b (atof(getData("lower_x")),atof(getData("lower_y")),atof(getData("upper_x")),atof(getData("upper_y")));
+	int k;
+	double x,y,*data = (double*)getData("spatial_data");
+
+	for (k=0;k<np;k++)
+	{
+		x = *data++;
+		y = *data++;
+		TeCoord2D pt(x,y);
+		line.add(pt);
+	}
+	line.objectId (object_id);
+	line.geomId (index);
+	line.setBox (b);
+	return (fetchRow());
+}
+
+
+bool 
+TeMySQL::insertPoint(const string& table,TePoint &p)
+{
+	string q = "INSERT INTO " + table + " VALUES('',";
+	q += "'" + escapeSequence(p.objectId()) + "',";
+	q += Te2String(p.location().x(),15) + ",";
+	q += Te2String(p.location().y(),15) + ")";
+	
+	if (!this->execute(string(q)))
+		return false;
+	p.geomId(this->insertId());
+	return true;
+}
+
+
+bool 
+TeMySQLPortal::fetchGeometry(TePoint& p)
+{
+	TeCoord2D c(atof (getData("x")), atof (getData("y")));
+	p.geomId( atoi(getData("geom_id")));
+	p.objectId( string(getData("object_id")));
+	p.add(c);
+	return (fetchRow());
+}
+
+
+bool 
+TeMySQL::insertText(const string& table, TeText &t)
+{
+	char q[256];
+	sprintf (q,"INSERT INTO %s values('','%s',%g,%g,'%s',%g, %g, %g, %g)",
+		table.c_str(), escapeSequence(t.objectId()).c_str(),
+		t.location().x(), t.location().y(),
+		t.textValue().c_str(), t.angle(), t.height(),t.alignmentVert(),t.alignmentHoriz());
+	if (!this->execute(string(q)))
+		return false;
+	t.geomId(this->insertId());
+
+	return true;
+}
+
+
+bool 
+TeMySQL::insertArc(const string& table, TeArc &arc)
+{
+	char q[256];
+	sprintf (q,"INSERT INTO %s values('','%s',%d,%d)",
+		table.c_str(),escapeSequence(arc.objectId()).c_str(),arc.fromNode().geomId(),arc.toNode().geomId());
+	if (!this->execute(string(q)))
+		return false;
+	arc.geomId(this->insertId());
+	return true;
+}
+
+
+bool
+TeMySQL::insertNode(const string& table, TeNode &node)
+{
+	char q[256];
+	sprintf (q,"INSERT INTO %s values('','%s',%g,%g)",table.c_str(),node.objectId().c_str(),node.location().x(),node.location().y());
+	if (!this->execute(string(q)))
+		return false;
+	node.geomId(this->insertId());
+	return true;
+}
+
+bool
+TeMySQL::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName)
+{
+	unsigned char	*cdata = 0;
+	int		size;
+	FILE	*fp = 0;
+	
+	struct	stat buf;
+	int		result;
+	
+	result = stat(fileName.c_str(), &buf);
+	
+	if( result != 0 )
+		return false;
+	
+	size = buf.st_size;
+
+	cdata = new unsigned char[size];
+	fp = fopen(fileName.c_str(), "rb");
+	fread(cdata, sizeof(unsigned char), size, fp); 
+
+	bool status = insertBlob (tableName, columnBlob, columnId,  valueId, cdata, size);
+
+	if(fp)
+		fclose(fp);
+
+	return status;
+}
+
+bool 
+TeMySQL::insertBlob (const string& tableName, const string& /* columnBlob */, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size)
+{
+	TeMySQLPortal* portal = (TeMySQLPortal*)this->getPortal();
+	if (!portal)
+		return false;
+
+	string q = "SELECT * FROM "+ tableName +" WHERE "+ columnId.name_ +" = ";
+	
+	switch (columnId.type_ )
+	{
+		case TeSTRING:
+			q += "'"+ valueId + "'";
+			break;
+		default:
+			q += valueId;
+			break;
+	}
+
+	if ((!portal->query(q)) || (!portal->fetchRow()))
+	{
+		delete portal;
+		return false;
+	}
+	delete portal;
+
+	char	message[256],
+			*query,
+			*end;
+	sprintf (message,"UPDATE %s SET media_blob= ",tableName.c_str());
+
+	query = new char[2*size+strlen(message)+4];
+	end = strxmov(query,message,0);
+	*end++ = '\'';
+	end += mysql_real_escape_string(&mysql_,end,(char*)data,size);
+	*end++ = '\'';
+
+	if (columnId.type_ == TeSTRING)
+		sprintf (message,"WHERE %s='%s'",columnId.name_.c_str(),valueId.c_str());
+	else
+		sprintf (message,"WHERE %s=%s",columnId.name_.c_str(),valueId.c_str());
+
+	end = strxmov(end,message,0);
+
+	if (mysql_real_query(&mysql_,query,(unsigned int) (end - query)))
+	{
+		errorMessage_ = string(mysql_error(&mysql_));
+		delete query;
+		return false;
+	}
+	delete query;	
+	return true;
+}
+	
+bool
+TeMySQL::insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, 
+						   unsigned char *buf,unsigned long size, int band, unsigned int res, unsigned int subband)
+{
+	if (blockId.empty()) // no block identifier provided
+	{
+		errorMessage_ = "bloco sem identificador";
+		return false;
+	}
+
+	TeMySQLPortal* portal = (TeMySQLPortal*) this->getPortal();
+	if (!portal)
+		return false;
+
+	bool update = false;
+	string q ="SELECT * FROM " + table; 
+	q += " WHERE block_id='" + blockId + "'";
+
+	if (!portal->query (q))
+	{
+		delete portal;
+		return false;
+	}
+		// check if this block is alread in the database
+	if (portal->fetchRow())
+		update = true;
+	delete portal;
+
+	char	message[256],
+			*end;
+	if (!update)
+	{
+		sprintf (message,"INSERT INTO %s values('%s',%f,%f,%f,%f,%d,%d,%d,",
+			table.c_str(),blockId.c_str(),ll.x(),ll.y(),ur.x(),ur.y(),band,res,subband);
+	}
+	else
+	{
+		sprintf (message,"UPDATE %s SET spatial_data=",table.c_str());
+	}
+
+	if (bufferBlobSize_ < (long)(2*size+strlen(message)+20))
+	{
+		if (bufferBlob_)
+			delete bufferBlob_;
+		bufferBlobSize_ = 2*size+strlen(message)+20;
+		bufferBlob_ = new char[bufferBlobSize_];
+	}
+	end = strxmov(bufferBlob_,message,0);
+	*end++ = '\'';
+	end += mysql_real_escape_string(&mysql_,end,(char*)buf,size);
+	*end++ = '\'';
+
+	if (update)
+	{
+		sprintf (message,", block_size=%ld WHERE block_id='%s'",size,blockId.c_str());
+		end = strxmov(end,message,0);
+	}
+	else
+	{
+		sprintf (message,",%ld)",size);
+		end = strxmov(end,message,0);
+	}
+
+	if (mysql_real_query(&mysql_,bufferBlob_,(unsigned int) (end - bufferBlob_)))
+	{
+		errorMessage_ = string(mysql_error(&mysql_));
+		delete bufferBlob_;
+		bufferBlobSize_ = 0;
+		bufferBlob_ = 0;
+		return false;
+	}
+	return true;
+}
+
+bool
+TeMySQLPortal::fetchGeometry(TeNode& n)
+{
+	TeCoord2D c(atof (getData("x")), atof (getData("y")));
+	n.geomId( atoi(getData("geom_id")));
+	n.objectId( string(getData("object_id")));
+	n.add(c);
+	return (fetchRow());
+}
+
+
+bool
+TeMySQL::insertCell(const string& table, TeCell &c)
+{
+	TeBox	b=c.box();
+	char	q[256];
+	sprintf (q,"INSERT INTO %s values('','%s',%.15f,%.15f,%.15f,%.15f,%d,%d)",
+		table.c_str(),c.objectId().c_str(),
+		b.lowerLeft().x(),b.lowerLeft().y(),b.upperRight().x(),b.upperRight().y(),
+		c.column(),c.line());
+
+	if (!this->execute (string(q)))
+		return false;
+	c.geomId(this->insertId());
+	return true;
+}
+
+
+TeTime
+TeMySQLPortal::getDate (int i)
+{ 
+	string s = getData(i);
+	TeTime t(s, TeSECOND, "YYYYsMMsDDsHHsmmsSS","-"); 
+	return t; 
+}
+
+TeTime
+TeMySQLPortal::getDate (const string& s)
+{ 
+	string sv = getData(s);
+	TeTime t(sv, TeSECOND, "YYYYsMMsDDsHHsmmsSS","-"); 
+	return t; 
+}
+
+string 
+TeMySQLPortal::getDateAsString(const string& s)
+{
+	TeTime t = this->getDate(s);
+	if (t.isValid())
+	{		
+		string tval = "\'"+t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-")+"\'";
+		return tval;
+	}
+	else
+		return "";
+}
+
+string 
+
+TeMySQLPortal::getDateAsString(int i)
+{
+	TeTime t = this->getDate(i);
+	if (t.isValid())
+	{		
+		string tval = "\'"+t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-")+"\'";
+		return tval;
+	}
+	else
+		return "";
+}
+
+double 
+TeMySQLPortal::getDouble (const string& s)
+{
+	return atof(getData(s));
+}
+
+
+double 
+TeMySQLPortal::getDouble (int i)
+{
+	if (row_ == 0)
+		return 0.;
+
+	if (row_[i])
+		return atof(row_[i]);
+	else
+		return 0.;
+}
+
+int 
+TeMySQLPortal::getInt (const string& s)
+{
+	return atoi(getData(s));
+}
+
+
+int 
+TeMySQLPortal::getInt (int i)
+{
+	if (row_ == 0)
+		return 0;
+
+	if (row_[i])
+		return atoi(row_[i]);
+	else
+		return 0;
+}
+
+
+char* 
+TeMySQLPortal::getData (int i)
+{
+	if (row_ == 0)
+		return "";
+
+	if (row_[i])
+		return row_[i];
+	else
+		return "";
+}
+
+
+char* 
+TeMySQLPortal::getData (const string& s)
+{
+	string fieldName;
+	size_t pos = s.find(".", string::npos,1);
+	if (pos != string::npos)
+		fieldName = s.substr(pos+1);
+	else
+		fieldName = s;
+
+	if (row_ == 0)
+		return "";
+
+	TeAttributeList::iterator it = attList_.begin();
+
+	int j = 0;
+	while ( it != attList_.end() )
+	{
+		if ((TeConvertToUpperCase(fieldName) == TeConvertToUpperCase((*it).rep_.name_)) ||
+		    (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_)))
+		{
+			if (row_[j])
+				return row_[j];
+			else
+				return "";
+		}
+		++it;
+		j++;
+	}
+	return "";
+}
+
+bool
+TeMySQLPortal::getBlob (const string& s, unsigned char* &data, long& size)
+{
+	string fieldName;
+	size_t pos = s.find(".", string::npos,1);
+	if (pos != string::npos)
+		fieldName = s.substr(pos+1);
+	else
+		fieldName = s;
+
+	TeAttributeList::iterator it = attList_.begin();
+	int j = 0, i=-1;
+	while ( it != attList_.end() )
+	{
+		if (fieldName == (*it).rep_.name_)
+		{
+			i=j;
+			break;
+		}
+		++it;
+		j++;
+	}
+	if (i<0)
+		return false;
+
+	unsigned long *lengths;
+	lengths = mysql_fetch_lengths(result_);
+	size = lengths[i];
+	if (row_[i])
+	{
+//		data = (unsigned char*) row_[i];
+		data = new unsigned char[size];
+		memcpy(data, (unsigned char*) row_[i], size * sizeof(char));
+		return true;
+	}
+	else
+	{
+		data = 0;
+		return false;
+	}
+}
+
+
+bool 
+TeMySQLPortal::getBool (const string& s)
+{
+	int val = atoi(getData(s));
+	return val ? true : false;
+}
+
+
+bool 
+TeMySQLPortal::getBool (int i)
+{
+	if (row_ == 0)
+		return false;
+	int val = atoi(getData(i));
+	return val ? true : false;
+}
+
+bool 
+TeMySQLPortal::getRasterBlock(unsigned long& size, unsigned char* ptData)
+{
+	
+	// get the actual length of the compressed data
+	size = atoi(getData("block_size"));
+	if ( (size>0) && row_[8])
+	{
+		memcpy((void*)ptData,(void*)(row_[8]),size);
+		return true;
+	}
+	else
+	{
+		ptData = 0;
+		return false;
+	}
+}
+
+bool
+TeMySQL::inClauseValues(const string& query, const string& attribute, vector<string>& inClauseVector)
+{
+	int i = 0, numRows = 0, count = 0, chunk = 200;
+	string id, inClause = "(", plic = "'";
+
+	TeDatabasePortal *pt = getPortal();
+	if(pt->query(query) == false)
+	{
+		delete pt;
+		return false;
+	}
+
+	while (numRows < pt->numRows())
+	{
+		if(count < chunk && pt->fetchRow())
+		{
+			id = pt->getData(attribute);
+			inClause = inClause + plic + id + "',";
+			++count;
+			++numRows;
+		}
+		else
+		{
+			inClause.erase(inClause.size()-1,1);
+			inClause += ")";
+			inClauseVector.push_back(inClause);
+			count = 0;
+			++i;
+			inClause = "(";
+		}
+	}
+	if (numRows == 0)
+	{
+		delete pt;
+		return true;
+	}
+	else
+	{
+		inClause.erase(inClause.size()-1,1);
+		inClause += ")";
+		inClauseVector.push_back(inClause);
+	}
+
+	delete pt;
+	return true;
+}
+
+string 
+TeMySQL::getSQLTime(TeTime& time)
+{
+	string result = "'"+ time.getDateTime("YYYYsMMsDDsHHsmmsSS", "-", ":") +"'";
+	return result;
+}
+
+string
+TeMySQL::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, 
+						   const string& initialTime, const string& finalTime)
+{
+	
+	//In MySQL the first day of the week is monday with index 0
+	if(chr==TeDAYOFWEEK)
+	{
+		time1 = time1-1;
+		if(time1<0)
+			time1=6;
+		time2 = time2-1;
+		if(time2<0)
+			time2=6;
+	}
+
+	return(TeDatabase::getSQLTemporalWhere(time1, time2, chr, rel, initialTime, finalTime));
+}
+		
+
+string TeMySQL::concatValues(vector<string>& values, const string& unionString)
+{
+	string concat = "CONCAT(";
+	
+	for(unsigned int i = 0; i < values.size(); ++i)
+	{
+		if(i != 0)
+		{
+			concat += ", ";
+
+			if(!unionString.empty())
+			{
+				concat += "'";
+				concat += unionString;
+				concat += "'";
+				concat += ", ";
+			}
+		}
+
+		concat += values[i];
+	}
+
+	concat += ")";
+
+	return concat;
+}
+
+string TeMySQL::toUpper(const string& value)
+{
+	string result  = "upper(";
+	       result += value;
+		   result += ")";
+
+	return result;
+}
diff --git a/src/terralib/drivers/MySQL/TeMySQL.h b/src/terralib/drivers/MySQL/TeMySQL.h
new file mode 100644
index 0000000..d268062
--- /dev/null
+++ b/src/terralib/drivers/MySQL/TeMySQL.h
@@ -0,0 +1,218 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_MYSQL_H
+#define  __TERRALIB_INTERNAL_MYSQL_H
+
+#ifdef WIN32
+#include <winsock.h>
+#endif
+
+#include <mysql.h>
+
+#include <TeTable.h>
+#include <TeDatabase.h>
+
+
+//! A concrete implementation of a driver to the MySQL SGDB
+class TeMySQL : public TeDatabase
+{
+friend class TeMySQLPortal;
+
+public: 
+
+	TeMySQL();
+
+	~TeMySQL();
+
+	MYSQL*	getMySQL () 
+	{	return &mysql_;	}	
+
+	string  escapeSequence(const string& from);
+
+	bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int &port=0, bool terralibModel=true);
+
+	bool connect (const string& host, const string& user, const string& password, const string& database, int port=0);
+
+	bool showDatabases (const string& host, const string& user, const string& password, vector<string>& dbNames, int port=0);
+
+	void close();
+
+	bool tableExist(const string& table);
+
+	bool columnExist(const string& table, const string& column, TeAttribute& attr);
+
+	bool addColumn (const string& table,TeAttributeRep &rep);
+
+	bool defineIntegrity(void);
+
+	bool createRelation (const string& /* relName */, const string& /* table */, const string& /* fieldName */,
+						const string& /* relatedTable */, const string& /* relatedField */, bool /* cascadeDeletion */)
+	{ return true; }
+
+	TeDBRelationType existRelation(const string& /* tableName */, const string& /* relName */)
+
+	{	return TeNoRelation; }
+
+	bool execute ( const string &q);
+
+	TeDatabasePortal* getPortal ();
+
+	string	errorMessage () 
+	{	return string(mysql_error(&mysql_));	} 
+
+	int	errorNum () 
+	{	return mysql_errno(&mysql_);	}
+	
+	bool createPolygonGeometry (const string&  table);
+	bool createLineGeometry (const string&  table);
+	bool createRasterTable (const string& table);
+
+// specific TerraLib database access methods
+
+	bool insertProjection (TeProjection *proj);
+	bool insertLayer(TeLayer* layer);
+	bool insertRepresentation(int layerId, TeRepresentation& rep);	
+	bool insertTableInfo (int layerId, TeTable &table, const string& user="");
+	bool insertRelationInfo(const int tableId, const string& tField,
+						    const string& eTable, const string& eField, int& relId);
+	bool insertView (TeView *view);
+	bool insertViewTree (TeViewTree *tree);	
+	bool insertTheme(TeTheme *theme);
+	bool insertThemeGroup (TeViewTree* tree);
+	bool generateLabelPositions (TeTheme *theme);
+	bool insertThemeTable (int themeId, int tableId, int relationId, int tableOrder);
+	bool insertLegend (TeLegendEntry *legend);
+	bool insertPolygon	(const string& table, TePolygon &p);	
+	bool updatePolygon	(const string& table, TePolygon &p);
+	bool insertLine (const string&  table, TeLine2D &l);
+	bool updateLine (const string& table, TeLine2D &l);
+	bool insertPoint (const string& table, TePoint &p);
+	bool insertText (const string& table, TeText &t);
+	bool insertArc (const string& table,TeArc &arc);
+	bool insertNode	(const string& table, TeNode &node);	
+	bool insertCell	(const string& table, TeCell &c);
+	int  insertId();
+
+	bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char *buf,unsigned long size, int band=0, unsigned int res=1, unsigned int subband=0);
+
+	string getSQLTime(TeTime& time);
+	string getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, 
+						   const string& initialTime, const string& finalTime);
+
+	bool inClauseValues(const string& query, const string& attribute, vector<string>& inClauseVector);
+
+	bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName);
+	bool insertBlob (const string& tableName, const string& columnBlob, 
+		TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size);
+
+	//! Concat values in a vector using unionString as the join between each value
+	string concatValues(vector<string>& values, const string& unionString);
+
+	//! Returns the SQL function for upper case
+	string toUpper(const string& value);
+
+private :
+
+	MYSQL	mysql_;
+	char*   bufferBlob_;	 // internal buffer used to write blob data
+	long	bufferBlobSize_; // size of the data already allocated
+
+};
+
+//! A concrete implementation of a portal to a MySQL database
+class TeMySQLPortal  : public TeDatabasePortal
+{
+private:
+
+	MYSQL			*mysql_;
+	MYSQL_RES*		result_;
+	MYSQL_ROW		row_;
+
+public :
+
+// Constructor / Destructor
+
+	TeMySQLPortal ( TeMySQL *m);
+
+	TeMySQLPortal ( const TeMySQLPortal& p);
+
+	~TeMySQLPortal ();
+
+// Basic database methods
+
+	int  insertId();
+
+	bool query (const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR );
+
+	bool fetchRow ();
+
+	bool fetchRow (int i);
+
+	void freeResult ();
+
+	string	errorMessage () 
+
+	{ return string(mysql_error(mysql_));} //: last error message()
+
+	int	errorNum () 
+
+	{ return mysql_errno(mysql_);}
+
+// specific SQL SELECT command methods
+
+	char*		getData (int i);
+	char*		getData (const string& s);
+	double		getDouble (int i);
+	double		getDouble (const string& s);
+	int			getInt (int i);
+	int			getInt (const string& s);
+	bool		getBool (const string& s);
+	bool		getBool (int i);
+
+	bool fetchGeometry(TePolygon& pol);
+	bool fetchGeometry(TeLine2D& line);
+	bool fetchGeometry(TeNode& n);
+	bool fetchGeometry(TePoint& p);
+	
+	bool setData (int /* field */, string /* val */)
+	{return true; }
+	MYSQL_RES* result()
+	{return result_; }
+
+	bool getBlob (const string& s, unsigned char* &data, long& size);
+	bool getRasterBlock(unsigned long& size, unsigned char* ptData);
+
+	TeTime getDate (int i);
+	TeTime getDate (const string& s);
+
+	string getDateAsString(int i);
+	string getDateAsString(const string& s);
+
+
+protected:
+	TeLinearRing getLinearRing (int &ni);
+};
+
+#endif
+
diff --git a/src/terralib/drivers/MySQL/include/config-netware.h b/src/terralib/drivers/MySQL/include/config-netware.h
new file mode 100644
index 0000000..3e145f5
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/config-netware.h
@@ -0,0 +1,119 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Header for NetWare compatible with MySQL */
+
+#ifndef _config_netware_h
+#define _config_netware_h
+
+/* required headers */
+#include <unistd.h>
+#include <stdio.h>
+#include <errno.h>
+#include <screen.h>
+#include <limits.h>
+#include <signal.h>
+#include <errno.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <time.h>
+#include <sys/time.h>
+#include <pthread.h>
+#include <termios.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* required adjustments */
+#undef HAVE_READDIR_R
+#undef HAVE_RWLOCK_INIT
+#undef HAVE_SCHED_H
+#undef HAVE_SYS_MMAN_H
+#undef HAVE_SYNCH_H
+#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
+#define HAVE_PTHREAD_SIGMASK 1
+#define HAVE_PTHREAD_YIELD_ZERO_ARG 1
+#define HAVE_BROKEN_REALPATH 1
+
+/* no libc crypt() function */
+#ifdef HAVE_OPENSSL
+  #define HAVE_CRYPT 1
+#else
+  #undef HAVE_CRYPT
+#endif /* HAVE_OPENSSL */
+
+/* Configure can't detect this because it uses AC_TRY_RUN */
+#undef HAVE_COMPRESS
+#define HAVE_COMPRESS
+
+/* include the old function apis */
+#define USE_OLD_FUNCTIONS 1
+
+/* no case sensitivity */
+#define FN_NO_CASE_SENCE 1
+
+/* the thread alarm is not used */
+#define DONT_USE_THR_ALARM 1
+
+/* signals do not interrupt sockets */
+#define SIGNALS_DONT_BREAK_READ 1
+
+/* signal by closing the sockets */
+#define SIGNAL_WITH_VIO_CLOSE 1
+
+/* On NetWare, stack grows towards lower address*/
+#define STACK_DIRECTION -1
+
+/* default directory information */
+#define	DEFAULT_MYSQL_HOME    "sys:/mysql"
+#define PACKAGE               "mysql"
+#define DEFAULT_BASEDIR       "sys:/"
+#define SHAREDIR              "share/"
+#define DEFAULT_CHARSET_HOME  "sys:/mysql/"
+#define DATADIR               "data/"
+
+/* 64-bit file system calls */
+#define SIZEOF_OFF_T          8
+#define off_t                 off64_t
+#define chsize                chsize64
+#define ftruncate             ftruncate64
+#define lseek                 lseek64
+#define pread                 pread64
+#define pwrite                pwrite64
+#define tell                  tell64
+
+/* do not use the extended time in LibC sys\stat.h */
+#define _POSIX_SOURCE
+
+/* Kernel call on NetWare that will only yield if our time slice is up */
+void kYieldIfTimeSliceUp(void);
+
+/* Some macros for portability */
+
+#define set_timespec(ABSTIME,SEC) { (ABSTIME).tv_sec=time(NULL)+(SEC); (ABSTIME).tv_nsec=0; }
+
+/* extra protection against CPU Hogs on NetWare */
+#define NETWARE_YIELD kYieldIfTimeSliceUp()
+/* Screen mode for help texts */
+#define NETWARE_SET_SCREEN_MODE(A) setscreenmode(A)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _config_netware_h */
diff --git a/src/terralib/drivers/MySQL/include/config-os2.h b/src/terralib/drivers/MySQL/include/config-os2.h
new file mode 100644
index 0000000..0402074
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/config-os2.h
@@ -0,0 +1,835 @@
+/* Copyright (C) 2000 MySQL AB & Yuri Dario
+   All the above parties has a full, independent copyright to
+   the following code, including the right to use the code in
+   any manner without any demands from the other parties.
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public
+   License as published by the Free Software Foundation; either
+   version 2 of the License, or (at your option) any later version.
+
+   This library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with this library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+   MA 02111-1307, USA */
+
+/* Defines for OS2 to make it compatible for MySQL */
+
+#ifndef __CONFIG_OS2_H__
+#define __CONFIG_OS2_H__
+
+#include <os2.h>
+#include <math.h>
+#include <io.h>
+#include <types.h>
+
+/* Define to name of system eg solaris*/
+#define SYSTEM_TYPE "IBM OS/2 Warp"
+/* Define to machine type name eg sun10 */
+#define MACHINE_TYPE "i686"
+/* Name of package */
+#define PACKAGE "mysql"
+/* Version number of package */
+#define VERSION MYSQL_SERVER_VERSION
+/* Default socket */
+#define MYSQL_UNIX_ADDR "\\socket\\MySQL"
+
+#define FN_LIBCHAR		 '\\'
+#define FN_ROOTDIR		 "\\"
+#define MY_NFILE		1024  /* This is only used to save filenames */
+
+#define HAVE_ACCESS
+
+#define DEFAULT_MYSQL_HOME	"c:\\mysql"
+#define DEFAULT_BASEDIR		"C:\\"
+#define SHAREDIR		"share"
+#define DEFAULT_CHARSET_HOME	"C:/mysql/"
+#define _POSIX_PATH_MAX		255
+#define DWORD			ULONG
+
+#define O_SHARE		0x1000		/* Open file in sharing mode */
+#define FILE_BINARY	O_BINARY	/* my_fopen in binary mode */
+#define S_IROTH		S_IREAD		/* for my_lib */
+
+#define CANT_DELETE_OPEN_FILES		/* saves open files in a list, for delayed delete */
+
+#define O_NONBLOCK	0x10
+
+#define NO_OPEN_3			/* For my_create() */
+#define SIGQUIT		SIGTERM		/* No SIGQUIT */
+#define SIGALRM		14		/* Alarm */
+
+#define NO_FCNTL_NONBLOCK
+
+#define EFBIG			   E2BIG
+/*#define ENFILE		  EMFILE    */
+/*#define ENAMETOOLONG		(EOS2ERR+2) */
+/*#define ETIMEDOUT		  145       */
+/*#define EPIPE			  146       */
+#define EROFS			147
+
+#define sleep(A)	DosSleep((A)*1000)
+#define closesocket(A)	soclose(A)
+
+#define F_OK		0
+#define W_OK		2
+
+#define bzero(x,y)	memset((x),'\0',(y))
+#define bcopy(x,y,z)	memcpy((y),(x),(z))
+#define bcmp(x,y,z)	memcmp((y),(x),(z))
+
+#define F_RDLCK		4	    /* Read lock.  */
+#define F_WRLCK		2	    /* Write lock.  */
+#define F_UNLCK		0	    /* Remove lock.  */
+
+#define S_IFMT		0x17000	    /* Mask for file type */
+#define F_TO_EOF	0L	    /* Param to lockf() to lock rest of file */
+
+#define HUGE_PTR
+
+#ifdef __cplusplus
+extern "C"
+#endif
+double _cdecl rint( double nr);
+
+DWORD	 TlsAlloc( void);
+BOOL	 TlsFree( DWORD);
+PVOID	 TlsGetValue( DWORD);
+BOOL	 TlsSetValue( DWORD, PVOID);
+
+/* support for > 2GB file size */
+#define SIZEOF_OFF_T	8
+#define lseek(A,B,C)	_lseek64( A, B, C)
+#define tell(A)		_lseek64( A, 0, SEEK_CUR)
+
+void* dlopen( char* path, int flag);
+char* dlerror( void);
+void* dlsym( void* hmod, char* fn);
+void  dlclose( void* hmod);
+
+/* Some typedefs */
+typedef unsigned long long os_off_t;
+
+/* config.h.  Generated automatically by configure.  */
+/* config.h.in.  Generated automatically from configure.in by autoheader.  */
+
+/* Define if using alloca.c.  */
+/* #undef C_ALLOCA */
+
+/* Define to empty if the keyword does not work.  */
+/* #undef const */
+
+/* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems.
+   This function is required for alloca.c support on those systems.  */
+/* #undef CRAY_STACKSEG_END */
+
+/* Define if you have alloca, as a function or macro.  */
+#define HAVE_ALLOCA 1
+
+/* Define if you have <alloca.h> and it should be used (not on Ultrix).  */
+/* #define HAVE_ALLOCA_H 1 */
+
+/* Define if you don't have vprintf but do have _doprnt.  */
+/* #undef HAVE_DOPRNT */
+
+/* Define if you have a working `mmap' system call.  */
+/* #undef HAVE_MMAP */
+
+/* Define if system calls automatically restart after interruption
+   by a signal.  */
+/* #undef HAVE_RESTARTABLE_SYSCALLS */
+
+/* Define if your struct stat has st_rdev.  */
+#define HAVE_ST_RDEV 1
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.	*/
+/* #define HAVE_SYS_WAIT_H 1 */
+
+/* Define if you don't have tm_zone but do have the external array
+   tzname.  */
+#define HAVE_TZNAME 1
+
+/* Define if utime(file, NULL) sets file's timestamp to the present.  */
+#define HAVE_UTIME_NULL 1
+
+/* Define if you have the vprintf function.  */
+#define HAVE_VPRINTF 1
+
+/* Define as __inline if that's what the C compiler calls it.  */
+/* #undef inline */
+
+/* Define to `long' if <sys/types.h> doesn't define.  */
+/* #undef off_t */
+
+/* Define as the return type of signal handlers (int or void).	*/
+#define RETSIGTYPE void
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+/* #undef size_t */
+
+/* If using the C implementation of alloca, define if you know the
+   direction of stack growth for your system; otherwise it will be
+   automatically deduced at run-time.
+ STACK_DIRECTION > 0 => grows toward higher addresses
+ STACK_DIRECTION < 0 => grows toward lower addresses
+ STACK_DIRECTION = 0 => direction of growth unknown
+ */
+#define STACK_DIRECTION -1
+
+/* Define if the `S_IS*' macros in <sys/stat.h> do not work properly.  */
+/* #undef STAT_MACROS_BROKEN */
+
+/* Define if you have the ANSI C header files.	*/
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+#define TIME_WITH_SYS_TIME 1
+
+/* Define if your <sys/time.h> declares struct tm.  */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define if your processor stores words with the most significant
+   byte first (like Motorola and SPARC, unlike Intel and VAX).	*/
+/* #undef WORDS_BIGENDIAN */
+
+/* Version of .frm files */
+#define DOT_FRM_VERSION 6
+
+/* READLINE: */
+#define FIONREAD_IN_SYS_IOCTL 1
+
+/* READLINE: Define if your system defines TIOCGWINSZ in sys/ioctl.h.  */
+/* #undef GWINSZ_IN_SYS_IOCTL */
+
+/* Do we have FIONREAD */
+#define FIONREAD_IN_SYS_IOCTL 1
+
+/* atomic_add() from <asm/atomic.h> (Linux only) */
+/* #undef HAVE_ATOMIC_ADD */
+
+/* atomic_sub() from <asm/atomic.h> (Linux only) */
+/* #undef HAVE_ATOMIC_SUB */
+
+/* bool is not defined by all C++ compilators */
+#define HAVE_BOOL 1
+
+/* Have berkeley db installed */
+/* #define HAVE_BERKELEY_DB 1 */
+
+/* DSB style signals ? */
+/* #undef HAVE_BSD_SIGNALS */
+
+/* Can netinet be included */
+/* #undef HAVE_BROKEN_NETINET_INCLUDES */
+
+/* READLINE: */
+/* #undef HAVE_BSD_SIGNALS */
+
+/* ZLIB and compress: */
+#define HAVE_COMPRESS 1
+
+/* Define if we are using OSF1 DEC threads */
+/* #undef HAVE_DEC_THREADS */
+
+/* Define if we are using OSF1 DEC threads on 3.2 */
+/* #undef HAVE_DEC_3_2_THREADS */
+
+/* fp_except from ieeefp.h */
+/* #undef HAVE_FP_EXCEPT */
+
+/* READLINE: */
+/* #undef HAVE_GETPW_DECLS */
+
+/* Solaris define gethostbyname_r with 5 arguments. glibc2 defines
+   this with 6 arguments */
+/* #undef HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE */
+
+/* In OSF 4.0f the 3'd argument to gethostname_r is hostent_data * */
+/* #undef HAVE_GETHOSTBYNAME_R_RETURN_INT */
+
+/* Define if int8, int16 and int32 types exist */
+/* #undef HAVE_INT_8_16_32 */
+
+/* Define if have -lwrap */
+/* #undef HAVE_LIBWRAP */
+
+/* Define if we are using Xavier Leroy's LinuxThreads */
+/* #undef HAVE_LINUXTHREADS */
+
+/* Do we use user level threads */
+/* #undef HAVE_mit_thread */
+
+/* For some non posix threads */
+/* #undef HAVE_NONPOSIX_PTHREAD_GETSPECIFIC */
+
+/* For some non posix threads */
+/* #undef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */
+
+/* READLINE: */
+#define HAVE_POSIX_SIGNALS 0
+
+/* sigwait with one argument */
+/* #undef HAVE_NONPOSIX_SIGWAIT */
+
+/* pthread_attr_setscope */
+#define HAVE_PTHREAD_ATTR_SETSCOPE 1
+
+/* POSIX readdir_r */
+/* #undef HAVE_READDIR_R */
+
+/* POSIX sigwait */
+/* #undef HAVE_SIGWAIT */
+
+/* crypt */
+#define HAVE_CRYPT 1
+
+/* Solaris define gethostbyaddr_r with 7 arguments. glibc2 defines
+   this with 8 arguments */
+/* #undef HAVE_SOLARIS_STYLE_GETHOST */
+
+/* Timespec has a ts_sec instead of tv_sev  */
+#define HAVE_TIMESPEC_TS_SEC 1
+
+/* Have the tzname variable */
+#define HAVE_TZNAME 1
+
+/* Define if the system files define uchar */
+/* #undef HAVE_UCHAR */
+
+/* Define if the system files define uint */
+/* #undef HAVE_UINT */
+
+/* Define if the system files define ulong */
+/* #undef HAVE_ULONG */
+
+/* UNIXWARE7 threads are not posix */
+/* #undef HAVE_UNIXWARE7_THREADS */
+
+/* new UNIXWARE7 threads that are not yet posix */
+/* #undef HAVE_UNIXWARE7_POSIX */
+
+/* READLINE: */
+/* #undef HAVE_USG_SIGHOLD */
+
+/* Define if want -lwrap */
+/* #undef LIBWRAP */
+
+/* mysql client protocoll version */
+#define PROTOCOL_VERSION 10
+
+/* Define if qsort returns void */
+#define QSORT_TYPE_IS_VOID 1
+
+/* Define as the return type of qsort (int or void). */
+#define RETQSORTTYPE void
+
+/* Define as the base type of the last arg to accept */
+#define SOCKET_SIZE_TYPE int
+
+/* Last argument to get/setsockopt */
+/* #undef SOCKOPT_OPTLEN_TYPE */
+
+/* #undef SPEED_T_IN_SYS_TYPES */
+/* #undef SPRINTF_RETURNS_PTR */
+#define SPRINTF_RETURNS_INT 1
+/* #undef SPRINTF_RETURNS_GARBAGE */
+
+/* #undef STRUCT_DIRENT_HAS_D_FILENO */
+#define STRUCT_DIRENT_HAS_D_INO 1
+
+/* Define if you want to have threaded code. This may be undef on client code */
+#define THREAD 1
+
+/* Should be client be thread safe */
+/* #undef THREAD_SAFE_CLIENT */
+
+/* READLINE: */
+/* #undef TIOCSTAT_IN_SYS_IOCTL */
+
+/* Use multi-byte character routines */
+/* #undef USE_MB */
+/* #undef USE_MB_IDENT */
+
+/* Use MySQL RAID */
+/* #undef USE_RAID */
+
+/* Use strcoll() functions when comparing and sorting. */
+/* #undef USE_STRCOLL */
+
+/* READLINE: */
+#define VOID_SIGHANDLER 1
+
+/* The number of bytes in a char.  */
+#define SIZEOF_CHAR 1
+
+/* The number of bytes in a int.  */
+#define SIZEOF_INT 4
+
+/* The number of bytes in a long.  */
+#define SIZEOF_LONG 4
+
+/* The number of bytes in a long long.	*/
+#define SIZEOF_LONG_LONG 8
+
+/* Define if you have the alarm function.  */
+#define HAVE_ALARM 1
+
+/* Define if you have the atod function.  */
+/* #undef HAVE_ATOD */
+
+/* Define if you have the bcmp function.  */
+#define HAVE_BCMP 1
+
+/* Define if you have the bfill function.  */
+/* #undef HAVE_BFILL */
+
+/* Define if you have the bmove function.  */
+/* #undef HAVE_BMOVE */
+
+/* Define if you have the bzero function.  */
+#define HAVE_BZERO 1
+
+/* Define if you have the chsize function.  */
+#define HAVE_CHSIZE 1
+
+/* Define if you have the cuserid function.  */
+/* #define HAVE_CUSERID 1 */
+
+/* Define if you have the dlerror function.  */
+#define HAVE_DLERROR 1
+
+/* Define if you have the dlopen function.  */
+#define HAVE_DLOPEN 1
+
+/* Define if you have the fchmod function.  */
+/* #undef HAVE_FCHMOD */
+
+/* Define if you have the fcntl function.  */
+/* #define HAVE_FCNTL 1 */
+
+/* Define if you have the fconvert function.  */
+/* #undef HAVE_FCONVERT */
+
+/* Define if you have the finite function.  */
+/* #undef HAVE_FINITE */
+
+/* Define if you have the fpresetsticky function.  */
+/* #undef HAVE_FPRESETSTICKY */
+
+/* Define if you have the fpsetmask function.  */
+/* #undef HAVE_FPSETMASK */
+
+/* Define if you have the fseeko function.  */
+/* #undef HAVE_FSEEKO */
+
+/* Define if you have the ftruncate function.  */
+/* #define HAVE_FTRUNCATE 1 */
+
+/* Define if you have the getcwd function.  */
+#define HAVE_GETCWD 1
+
+/* Define if you have the gethostbyaddr_r function.  */
+/* #undef HAVE_GETHOSTBYADDR_R */
+
+/* Define if you have the gethostbyname_r function.  */
+/* #undef HAVE_GETHOSTBYNAME_R */
+
+/* Define if you have the getpagesize function.  */
+#define HAVE_GETPAGESIZE 1
+
+/* Define if you have the getpass function.  */
+/*#define HAVE_GETPASS 1 */
+
+/* Define if you have the getpassphrase function.  */
+/* #undef HAVE_GETPASSPHRASE */
+
+/* Define if you have the getpwnam function.  */
+/* #define HAVE_GETPWNAM 1 */
+
+/* Define if you have the getpwuid function.  */
+/* #define HAVE_GETPWUID 1 */
+
+/* Define if you have the getrlimit function.  */
+/* #undef HAVE_GETRLIMIT */
+
+/* Define if you have the getrusage function.  */
+/* #undef HAVE_GETRUSAGE */
+
+/* Define if you have the getwd function.  */
+#define HAVE_GETWD 1
+
+/* Define to 1 if you have the `gmtime_r' function. */
+#define HAVE_GMTIME_R 1
+
+/* Define if you have the index function.  */
+#define HAVE_INDEX 1
+
+/* Define if you have the initgroups function.	*/
+/* #undef HAVE_INITGROUPS */
+
+/* Define if you have the localtime_r function.  */
+#define HAVE_LOCALTIME_R 1
+
+/* Define if you have the locking function.  */
+/* #undef HAVE_LOCKING */
+
+/* Define if you have the longjmp function.  */
+#define HAVE_LONGJMP 1
+
+/* Define if you have the lrand48 function.  */
+/* #undef HAVE_LRAND48 */
+
+/* Define if you have the lstat function.  */
+/* #undef HAVE_LSTAT */
+
+/* Define if you have the madvise function.  */
+/* #undef HAVE_MADVISE */
+
+/* Define if you have the memcpy function.  */
+#define HAVE_MEMCPY 1
+
+/* Define if you have the memmove function.  */
+#define HAVE_MEMMOVE 1
+
+/* Define if you have the mkstemp function.  */
+/* #define HAVE_MKSTEMP 1 */
+
+/* Define if you have the mlockall function.  */
+/* #undef HAVE_MLOCKALL */
+
+/* Define if you have the perror function.  */
+#define HAVE_PERROR 1
+
+/* Define if you have the poll function.  */
+/* #undef HAVE_POLL */
+
+/* Define if you have the pread function.  */
+/* #undef HAVE_PREAD */
+
+/* Define if you have the pthread_attr_create function.  */
+/* #undef HAVE_PTHREAD_ATTR_CREATE */
+
+/* Define if you have the pthread_attr_setprio function.  */
+#define HAVE_PTHREAD_ATTR_SETPRIO 1
+
+/* Define if you have the pthread_attr_setschedparam function.	*/
+/* #undef HAVE_PTHREAD_ATTR_SETSCHEDPARAM */
+
+/* Define if you have the pthread_attr_setstacksize function.  */
+#define HAVE_PTHREAD_ATTR_SETSTACKSIZE 1
+
+/* Define if you have the pthread_condattr_create function.  */
+/* #undef HAVE_PTHREAD_CONDATTR_CREATE */
+
+/* Define if you have the pthread_getsequence_np function.  */
+/* #undef HAVE_PTHREAD_GETSEQUENCE_NP */
+
+/* Define if you have the pthread_init function.  */
+/* #undef HAVE_PTHREAD_INIT */
+
+/* Define if you have the pthread_rwlock_rdlock function.  */
+/* #undef HAVE_PTHREAD_RWLOCK_RDLOCK */
+
+/* Define if you have the pthread_setprio function.  */
+#define HAVE_PTHREAD_SETPRIO 1
+
+/* Define if you have the pthread_setprio_np function.	*/
+/* #undef HAVE_PTHREAD_SETPRIO_NP */
+
+/* Define if you have the pthread_setschedparam function.  */
+/* #undef HAVE_PTHREAD_SETSCHEDPARAM */
+
+/* Define if you have the pthread_sigmask function.  */
+#define HAVE_PTHREAD_SIGMASK 1
+
+/* Define if you have the putenv function.  */
+#define HAVE_PUTENV 1
+
+/* Define if you have the readlink function.  */
+/* #undef HAVE_READLINK */
+
+/* Define if you have the realpath function.  */
+/* #undef HAVE_REALPATH */
+
+/* Define if you have the rename function.  */
+#define HAVE_RENAME 1
+
+/* Define if you have the rint function.  */
+#define HAVE_RINT 1
+
+/* Define if you have the rwlock_init function.  */
+/* #undef HAVE_RWLOCK_INIT */
+
+/* Define if you have the select function.  */
+#define HAVE_SELECT 1
+
+/* Define if you have the setenv function.  */
+/* #undef HAVE_SETENV */
+
+/* Define if you have the setlocale function.  */
+#define HAVE_SETLOCALE 1
+
+/* Define if you have the setupterm function.  */
+/* #undef HAVE_SETUPTERM */
+
+/* Define if you have the sighold function.  */
+/* #undef HAVE_SIGHOLD */
+
+/* Define if you have the sigset function.  */
+/* #undef HAVE_SIGSET */
+
+/* Define if you have the sigthreadmask function.  */
+/* #undef HAVE_SIGTHREADMASK */
+
+/* Define if you have the snprintf function.  */
+/* #define HAVE_SNPRINTF 1 */
+
+/* Define if you have the socket function.  */
+#define HAVE_SOCKET 1
+
+/* Define if you have the stpcpy function.  */
+/* #undef HAVE_STPCPY */
+
+/* Define if you have the strcasecmp function.	*/
+/* #undef HAVE_STRCASECMP */
+
+/* Define if you have the strcoll function.  */
+#define HAVE_STRCOLL 1
+
+/* Define if you have the strerror function.  */
+#define HAVE_STRERROR 1
+
+/* Define if you have the strnlen function.  */
+/* #undef HAVE_STRNLEN */
+
+/* Define if you have the strpbrk function.  */
+#define HAVE_STRPBRK 1
+
+/* Define if you have the strstr function.  */
+#define HAVE_STRSTR 1
+
+/* Define if you have the strtok_r function.  */
+/* #undef HAVE_STRTOK_R */
+
+/* Define if you have the strtol function.  */
+#define HAVE_STRTOL 1
+
+/* Define if you have the strtoul function.  */
+#define HAVE_STRTOUL 1
+
+/* Define if you have the strtoull function.  */
+/* #undef HAVE_STRTOULL */
+
+/* Define if you have the tcgetattr function.  */
+#define HAVE_TCGETATTR 1
+
+/* Define if you have the tell function.  */
+#define HAVE_TELL 1
+
+/* Define if you have the tempnam function.  */
+#define HAVE_TEMPNAM 1
+
+/* Define if you have the thr_setconcurrency function.	*/
+/* #undef HAVE_THR_SETCONCURRENCY */
+
+/* Define if you have the vidattr function.  */
+/* #undef HAVE_VIDATTR */
+
+/* Define if you have the <alloca.h> header file.  */
+/* #define HAVE_ALLOCA_H 1 */
+
+/* Define if you have the <arpa/inet.h> header file.  */
+#define HAVE_ARPA_INET_H 1
+
+/* Define if you have the <asm/termbits.h> header file.  */
+/* #undef HAVE_ASM_TERMBITS_H */
+
+/* Define if you have the <crypt.h> header file.  */
+#define HAVE_CRYPT_H 1
+
+/* Define if you have the <curses.h> header file.  */
+/* #define HAVE_CURSES_H 1 */
+
+/* Define if you have the <dirent.h> header file.  */
+/* #define HAVE_DIRENT_H 1 */
+
+/* Define if you have the <fcntl.h> header file.  */
+#define HAVE_FCNTL_H 1
+
+/* Define if you have the <float.h> header file.  */
+#define HAVE_FLOAT_H 1
+
+/* Define if you have the <floatingpoint.h> header file.  */
+/* #undef HAVE_FLOATINGPOINT_H */
+
+/* Define if you have the <grp.h> header file.	*/
+/* #define HAVE_GRP_H 1 */
+
+/* Define if you have the <ieeefp.h> header file.  */
+/* #undef HAVE_IEEEFP_H */
+
+/* Define if you have the <limits.h> header file.  */
+#define HAVE_LIMITS_H 1
+
+/* Define if you have the <locale.h> header file.  */
+#define HAVE_LOCALE_H 1
+
+/* Define if you have the <memory.h> header file.  */
+#define HAVE_MEMORY_H 1
+
+/* Define if you have the <ndir.h> header file.  */
+/* #undef HAVE_NDIR_H */
+
+/* Define if you have the <netinet/in.h> header file.  */
+#define HAVE_NETINET_IN_H 1
+
+/* Define if you have the <paths.h> header file.  */
+/* #undef HAVE_PATHS_H */
+
+/* Define if you have the <pwd.h> header file.	*/
+/* #define HAVE_PWD_H 1 */
+
+/* Define if you have the <sched.h> header file.  */
+/* #undef HAVE_SCHED_H */
+
+/* Define if you have the <select.h> header file.  */
+/* #undef HAVE_SELECT_H */
+
+/* Define if you have the <stdarg.h> header file.  */
+#define HAVE_STDARG_H 1
+
+/* Define if you have the <stddef.h> header file.  */
+#define HAVE_STDDEF_H 1
+
+/* Define if you have the <stdlib.h> header file.  */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the <string.h> header file.  */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <strings.h> header file.  */
+/* #define HAVE_STRINGS_H 1 */
+
+/* Define if you have the <synch.h> header file.  */
+/* #undef HAVE_SYNCH_H */
+
+/* Define if you have the <sys/dir.h> header file.  */
+/* #define HAVE_SYS_DIR_H 1 */
+
+/* Define if you have the <sys/file.h> header file.  */
+/* #define HAVE_SYS_FILE_H 1 */
+
+/* Define if you have the <sys/ioctl.h> header file.  */
+#define HAVE_SYS_IOCTL_H 1
+
+/* Define if you have the <sys/mman.h> header file.  */
+/* #undef HAVE_SYS_MMAN_H */
+
+/* Define if you have the <sys/ndir.h> header file.  */
+/* #undef HAVE_SYS_NDIR_H */
+
+/* Define if you have the <sys/pte.h> header file.  */
+/* #undef HAVE_SYS_PTE_H */
+
+/* Define if you have the <sys/ptem.h> header file.  */
+/* #undef HAVE_SYS_PTEM_H */
+
+/* Define if you have the <sys/select.h> header file.  */
+#define HAVE_SYS_SELECT_H 1
+
+/* Define if you have the <sys/socket.h> header file.  */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define if you have the <sys/stream.h> header file.  */
+/* #undef HAVE_SYS_STREAM_H */
+
+/* Define if you have the <sys/timeb.h> header file.  */
+#define HAVE_SYS_TIMEB_H 1
+
+/* Define if you have the <sys/types.h> header file.  */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define if you have the <sys/un.h> header file.  */
+#define HAVE_SYS_UN_H 1
+
+/* Define if you have the <sys/utime.h> header file.  */
+#define HAVE_SYS_UTIME_H 1
+
+/* Define if you have the <sys/vadvise.h> header file.	*/
+/* #undef HAVE_SYS_VADVISE_H */
+
+/* Define if you have the <sys/wait.h> header file.  */
+/* #define HAVE_SYS_WAIT_H 1 */
+
+/* Define if you have the <term.h> header file.  */
+/* #undef HAVE_TERM_H */
+
+/* Define if you have the <termbits.h> header file.  */
+/* #undef HAVE_TERMBITS_H */
+
+/* Define if you have the <termcap.h> header file.  */
+/* #define HAVE_TERMCAP_H 1 */
+
+/* Define if you have the <termio.h> header file.  */
+/* /#define HAVE_TERMIO_H 1 */
+
+/* Define if you have the <termios.h> header file.  */
+/* #define HAVE_TERMIOS_H 1 */
+
+/* Define if you have the <unistd.h> header file.  */
+#define HAVE_UNISTD_H 1
+
+/* Define if you have the <utime.h> header file.  */
+#define HAVE_UTIME_H 1
+
+/* Define if you have the <varargs.h> header file.  */
+#define HAVE_VARARGS_H 1
+
+/* Define if you have the bind library (-lbind).  */
+/* #undef HAVE_LIBBIND */
+
+/* Define if you have the c_r library (-lc_r).	*/
+/* #undef HAVE_LIBC_R */
+
+/* Define if you have the compat library (-lcompat).  */
+/* #undef HAVE_LIBCOMPAT */
+
+/* Define if you have the crypt library (-lcrypt).  */
+#define HAVE_LIBCRYPT 1
+
+/* Define if you have the dl library (-ldl).  */
+#define HAVE_LIBDL 1
+
+/* Define if you have the gen library (-lgen).	*/
+/* #undef HAVE_LIBGEN */
+
+/* Define if you have the m library (-lm).  */
+#define HAVE_LIBM 1
+
+/* Define if you have the nsl library (-lnsl).	*/
+/* #undef HAVE_LIBNSL */
+
+/* Define if you have the nsl_r library (-lnsl_r).  */
+/* #undef HAVE_LIBNSL_R */
+
+/* Define if you have the pthread library (-lpthread).	*/
+/* #undef HAVE_LIBPTHREAD */
+
+/* Define if you have the socket library (-lsocket).  */
+/* #undef HAVE_LIBSOCKET */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to make fseeko etc. visible, on some hosts. */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+#endif /* __CONFIG_OS2_H__ */
diff --git a/src/terralib/drivers/MySQL/include/config-win.h b/src/terralib/drivers/MySQL/include/config-win.h
new file mode 100644
index 0000000..d28bb25
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/config-win.h
@@ -0,0 +1,396 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Defines for Win32 to make it compatible for MySQL */
+
+#ifdef __WIN2000__
+/* We have to do this define before including windows.h to get the AWE API
+functions */
+#define _WIN32_WINNT     0x0500
+#endif
+
+#include <sys/locking.h>
+#include <windows.h>
+#include <math.h>			/* Because of rint() */
+#include <fcntl.h>
+#include <io.h>
+#include <malloc.h>
+
+#define HAVE_SMEM 1
+
+#if defined(__NT__)
+#define SYSTEM_TYPE	"NT"
+#elif defined(__WIN2000__)
+#define SYSTEM_TYPE	"WIN2000"
+#else
+#define SYSTEM_TYPE	"Win95/Win98"
+#endif
+
+#if defined(_WIN64) || defined(WIN64)
+#define MACHINE_TYPE	"ia64"		/* Define to machine type name */
+#else
+#define MACHINE_TYPE	"i32"		/* Define to machine type name */
+#ifndef _WIN32
+#define _WIN32				/* Compatible with old source */
+#endif
+#ifndef __WIN32__
+#define __WIN32__
+#endif
+#endif /* _WIN64 */
+#ifndef __WIN__
+#define __WIN__			      /* To make it easier in VC++ */
+#endif
+
+/* File and lock constants */
+#define O_SHARE		0x1000		/* Open file in sharing mode */
+#ifdef __BORLANDC__
+#define F_RDLCK		LK_NBLCK	/* read lock */
+#define F_WRLCK		LK_NBRLCK	/* write lock */
+#define F_UNLCK		LK_UNLCK	/* remove lock(s) */
+#else
+#define F_RDLCK		_LK_NBLCK	/* read lock */
+#define F_WRLCK		_LK_NBRLCK	/* write lock */
+#define F_UNLCK		_LK_UNLCK	/* remove lock(s) */
+#endif
+
+#define F_EXCLUSIVE	1		/* We have only exclusive locking */
+#define F_TO_EOF	(INT_MAX32/2)	/* size for lock of all file */
+#define F_OK		0		/* parameter to access() */
+
+#define S_IROTH		S_IREAD		/* for my_lib */
+
+#ifdef __BORLANDC__
+#define FILE_BINARY	O_BINARY	/* my_fopen in binary mode */
+#define O_TEMPORARY	0
+#define O_SHORT_LIVED	0
+#define SH_DENYNO	_SH_DENYNO
+#else
+#define O_BINARY	_O_BINARY	/* compability with MSDOS */
+#define FILE_BINARY	_O_BINARY	/* my_fopen in binary mode */
+#define O_TEMPORARY	_O_TEMPORARY
+#define O_SHORT_LIVED	_O_SHORT_LIVED
+#define SH_DENYNO	_SH_DENYNO
+#endif
+#define NO_OPEN_3			/* For my_create() */
+
+#define SIGQUIT		SIGTERM		/* No SIGQUIT */
+
+#undef _REENTRANT			/* Crashes something for win32 */
+#undef SAFE_MUTEX			/* Can't be used on windows */
+
+#define LONGLONG_MIN	((__int64) 0x8000000000000000)
+#define LONGLONG_MAX	((__int64) 0x7FFFFFFFFFFFFFFF)
+#define ULONGLONG_MAX	((unsigned __int64) 0xFFFFFFFFFFFFFFFF)
+#define LL(A)		((__int64) A)
+#define ULL(A)		((unsigned __int64) A)
+
+/* Type information */
+
+typedef unsigned short	ushort;
+typedef unsigned int	uint;
+typedef unsigned __int64 ulonglong;	/* Microsofts 64 bit types */
+typedef __int64 longlong;
+typedef int sigset_t;
+#define longlong_defined
+/* off_t should not be __int64 because of conflicts in header files;
+   Use my_off_t or os_off_t instead */
+typedef long off_t;
+typedef __int64 os_off_t;
+#ifdef _WIN64
+typedef UINT_PTR rf_SetTimer;
+#else
+typedef unsigned int size_t;
+typedef uint rf_SetTimer;
+#endif
+
+#define Socket_defined
+#define my_socket SOCKET
+#define bool BOOL
+#define SIGPIPE SIGINT
+#define RETQSORTTYPE void
+#define QSORT_TYPE_IS_VOID
+#define RETSIGTYPE void
+#define SOCKET_SIZE_TYPE int
+#define my_socket_defined
+#define bool_defined
+#define byte_defined
+#define HUGE_PTR
+#define STDCALL __stdcall	    /* Used by libmysql.dll */
+#define isnan(X) _isnan(X)
+#define finite(X) _finite(X)
+
+#ifndef UNDEF_THREAD_HACK
+#define THREAD
+#endif
+#define VOID_SIGHANDLER
+#define SIZEOF_CHAR		1
+#define SIZEOF_LONG		4
+#define SIZEOF_LONG_LONG	8
+#define SIZEOF_OFF_T		8
+#ifdef _WIN64
+#define SIZEOF_CHARP		8
+#else
+#define SIZEOF_CHARP		4
+#endif
+#define HAVE_BROKEN_NETINET_INCLUDES
+#ifdef __NT__
+#define HAVE_NAMED_PIPE			/* We can only create pipes on NT */
+#endif
+
+/* ERROR is defined in wingdi.h */
+#undef ERROR
+
+/* We need to close files to break connections on shutdown */
+#ifndef SIGNAL_WITH_VIO_CLOSE
+#define SIGNAL_WITH_VIO_CLOSE
+#endif
+
+/* Use all character sets in MySQL */
+#define USE_MB 1
+#define USE_MB_IDENT 1
+#define USE_STRCOLL 1
+
+/* All windows servers should support .sym files */
+#undef USE_SYMDIR
+#define USE_SYMDIR
+
+/* If LOAD DATA LOCAL INFILE should be enabled by default */
+#define ENABLED_LOCAL_INFILE 1
+
+/* Convert some simple functions to Posix */
+
+#define sigset(A,B) signal((A),(B))
+#define finite(A) _finite(A)
+#define sleep(A)  Sleep((A)*1000)
+
+#ifndef __BORLANDC__
+#define access(A,B) _access(A,B)
+#endif
+
+#if !defined(__cplusplus)
+#define inline __inline
+#endif /* __cplusplus */
+
+inline double rint(double nr)
+{
+  double f = floor(nr);
+  double c = ceil(nr);
+  return (((c-nr) >= (nr-f)) ? f :c);
+}
+
+#ifdef _WIN64
+#define ulonglong2double(A) ((double) (ulonglong) (A))
+#define my_off_t2double(A)  ((double) (my_off_t) (A))
+
+#else
+inline double ulonglong2double(ulonglong value)
+{
+  longlong nr=(longlong) value;
+  if (nr >= 0)
+    return (double) nr;
+  return (18446744073709551616.0 + (double) nr);
+}
+#define my_off_t2double(A) ulonglong2double(A)
+#endif /* _WIN64 */
+
+#if SIZEOF_OFF_T > 4
+#define lseek(A,B,C) _lseeki64((A),(longlong) (B),(C))
+#define tell(A) _telli64(A)
+#endif
+
+#define set_timespec(ABSTIME,SEC) { (ABSTIME).tv_sec=time((time_t*)0) + (time_t) (SEC); (ABSTIME).tv_nsec=0; }
+
+#define STACK_DIRECTION -1
+
+/* Optimized store functions for Intel x86 */
+
+#ifndef _WIN64
+#define sint2korr(A)	(*((int16 *) (A)))
+#define sint3korr(A)	((int32) ((((uchar) (A)[2]) & 128) ? \
+				  (((uint32) 255L << 24) | \
+				   (((uint32) (uchar) (A)[2]) << 16) |\
+				   (((uint32) (uchar) (A)[1]) << 8) | \
+				   ((uint32) (uchar) (A)[0])) : \
+				  (((uint32) (uchar) (A)[2]) << 16) |\
+				  (((uint32) (uchar) (A)[1]) << 8) | \
+				  ((uint32) (uchar) (A)[0])))
+#define sint4korr(A)	(*((long *) (A)))
+#define uint2korr(A)	(*((uint16 *) (A)))
+/*
+   ATTENTION !
+   
+    Please, note, uint3korr reads 4 bytes (not 3) !
+    It means, that you have to provide enough allocated space !
+*/
+#define uint3korr(A)	(long) (*((unsigned int *) (A)) & 0xFFFFFF)
+#define uint4korr(A)	(*((unsigned long *) (A)))
+#define uint5korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+				    (((uint32) ((uchar) (A)[1])) << 8) +\
+				    (((uint32) ((uchar) (A)[2])) << 16) +\
+				    (((uint32) ((uchar) (A)[3])) << 24)) +\
+				    (((ulonglong) ((uchar) (A)[4])) << 32))
+#define uint8korr(A)	(*((ulonglong *) (A)))
+#define sint8korr(A)	(*((longlong *) (A)))
+#define int2store(T,A)	*((uint16*) (T))= (uint16) (A)
+#define int3store(T,A)		{ *(T)=  (uchar) ((A));\
+				  *(T+1)=(uchar) (((uint) (A) >> 8));\
+				  *(T+2)=(uchar) (((A) >> 16)); }
+#define int4store(T,A)	*((long *) (T))= (long) (A)
+#define int5store(T,A)	{ *(T)= (uchar)((A));\
+			  *((T)+1)=(uchar) (((A) >> 8));\
+			  *((T)+2)=(uchar) (((A) >> 16));\
+			  *((T)+3)=(uchar) (((A) >> 24)); \
+			  *((T)+4)=(uchar) (((A) >> 32)); }
+#define int8store(T,A)	*((ulonglong *) (T))= (ulonglong) (A)
+
+#define doubleget(V,M)	{ *((long *) &V) = *((long*) M); \
+			  *(((long *) &V)+1) = *(((long*) M)+1); }
+#define doublestore(T,V) { *((long *) T) = *((long*) &V); \
+			   *(((long *) T)+1) = *(((long*) &V)+1); }
+#define float4get(V,M) { *((long *) &(V)) = *((long*) (M)); }
+#define floatstore(T,V) memcpy((byte*)(T), (byte*)(&V), sizeof(float))
+#define float8get(V,M) doubleget((V),(M))
+#define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float))
+#define float8store(V,M) doublestore((V),(M))
+#endif /* _WIN64 */
+
+#define HAVE_PERROR
+#define HAVE_VFPRINT
+#define HAVE_RENAME		/* Have rename() as function */
+#define HAVE_BINARY_STREAMS	/* Have "b" flag in streams */
+#define HAVE_LONG_JMP		/* Have long jump function */
+#define HAVE_LOCKING		/* have locking() call */
+#define HAVE_ERRNO_AS_DEFINE	/* errno is a define */
+#define HAVE_STDLIB		/* everything is include in this file */
+#define HAVE_MEMCPY
+#define HAVE_MEMMOVE
+#define HAVE_GETCWD
+#define HAVE_TELL
+#define HAVE_TZNAME
+#define HAVE_PUTENV
+#define HAVE_SELECT
+#define HAVE_SETLOCALE
+#define HAVE_SOCKET		/* Giangi */
+#define HAVE_FLOAT_H
+#define HAVE_LIMITS_H
+#define HAVE_STDDEF_H
+#define HAVE_RINT		/* defined in this file */
+#define NO_FCNTL_NONBLOCK	/* No FCNTL */
+#define HAVE_ALLOCA
+#define HAVE_STRPBRK
+#define HAVE_STRSTR
+#define HAVE_COMPRESS
+#define HAVE_CREATESEMAPHORE
+#define HAVE_ISNAN
+#define HAVE_FINITE
+#define HAVE_QUERY_CACHE
+#define SPRINTF_RETURNS_INT
+#define HAVE_SETFILEPOINTER
+#define HAVE_VIO
+
+#ifdef NOT_USED
+#define HAVE_SNPRINTF		/* Gave link error */
+#define _snprintf snprintf
+#endif
+
+#ifdef _MSC_VER
+#define HAVE_LDIV		/* The optimizer breaks in zortech for ldiv */
+#define HAVE_ANSI_INCLUDE
+#define HAVE_SYS_UTIME_H
+#define HAVE_STRTOUL
+#endif
+#define my_reinterpret_cast(A) reinterpret_cast <A>
+#define my_const_cast(A) const_cast<A>
+
+
+/* MYSQL OPTIONS */
+
+#ifdef _CUSTOMCONFIG_
+#include <custom_conf.h>
+#else
+#define DEFAULT_MYSQL_HOME	"c:\\mysql"
+#define PACKAGE			"mysql"
+#define DEFAULT_BASEDIR		"C:\\"
+#define SHAREDIR		"share"
+#define DEFAULT_CHARSET_HOME	"C:/mysql/"
+#endif
+
+/* File name handling */
+
+#define FN_LIBCHAR	'\\'
+#define FN_ROOTDIR	"\\"
+#define FN_NETWORK_DRIVES	/* Uses \\ to indicate network drives */
+#define FN_NO_CASE_SENCE	/* Files are not case-sensitive */
+#define OS_FILE_LIMIT	2048
+
+#define DO_NOT_REMOVE_THREAD_WRAPPERS
+#define thread_safe_increment(V,L) InterlockedIncrement((long*) &(V))
+/* The following is only used for statistics, so it should be good enough */
+#ifdef __NT__  /* This should also work on Win98 but .. */
+#define thread_safe_add(V,C,L) InterlockedExchangeAdd((long*) &(V),(C))
+#define thread_safe_sub(V,C,L) InterlockedExchangeAdd((long*) &(V),-(long) (C))
+#define statistic_add(V,C,L) thread_safe_add((V),(C),(L))
+#else
+#define thread_safe_add(V,C,L) \
+	pthread_mutex_lock((L)); (V)+=(C); pthread_mutex_unlock((L));
+#define thread_safe_sub(V,C,L) \
+	pthread_mutex_lock((L)); (V)-=(C); pthread_mutex_unlock((L));
+#define statistic_add(V,C,L)	 (V)+=(C)
+#endif
+#define statistic_increment(V,L) thread_safe_increment((V),(L))
+
+#define shared_memory_buffer_length 16000
+#define default_shared_memory_base_name "MYSQL"
+#define MYSQL_DEFAULT_CHARSET_NAME "latin1"
+#define MYSQL_DEFAULT_COLLATION_NAME "latin1_swedish_ci"
+
+#define HAVE_SPATIAL 1
+#define HAVE_RTREE_KEYS 1
+
+/* Define charsets you want */
+/* #undef HAVE_CHARSET_armscii8 */
+/* #undef HAVE_CHARSET_ascii */
+#define HAVE_CHARSET_big5 1
+#define HAVE_CHARSET_cp1250 1
+/* #undef HAVE_CHARSET_cp1251 */
+/* #undef HAVE_CHARSET_cp1256 */
+/* #undef HAVE_CHARSET_cp1257 */
+/* #undef HAVE_CHARSET_cp850 */
+/* #undef HAVE_CHARSET_cp852 */
+/* #undef HAVE_CHARSET_cp866 */
+/* #undef HAVE_CHARSET_dec8 */
+#define HAVE_CHARSET_euckr 1
+#define HAVE_CHARSET_gb2312 1
+#define HAVE_CHARSET_gbk 1
+/* #undef HAVE_CHARSET_greek */
+/* #undef HAVE_CHARSET_hebrew */
+/* #undef HAVE_CHARSET_hp8 */
+/* #undef HAVE_CHARSET_keybcs2 */
+/* #undef HAVE_CHARSET_koi8r */
+/* #undef HAVE_CHARSET_koi8u */
+#define HAVE_CHARSET_latin1 1
+#define HAVE_CHARSET_latin2 1
+/* #undef HAVE_CHARSET_latin5 */
+/* #undef HAVE_CHARSET_latin7 */
+/* #undef HAVE_CHARSET_macce */
+/* #undef HAVE_CHARSET_macroman */
+#define HAVE_CHARSET_sjis 1
+/* #undef HAVE_CHARSET_swe7 */
+#define HAVE_CHARSET_tis620 1
+#define HAVE_CHARSET_ucs2 1
+#define HAVE_CHARSET_ujis 1
+#define HAVE_CHARSET_utf8 1
+
diff --git a/src/terralib/drivers/MySQL/include/errmsg.h b/src/terralib/drivers/MySQL/include/errmsg.h
new file mode 100644
index 0000000..6115b24
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/errmsg.h
@@ -0,0 +1,92 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Error messages for MySQL clients */
+/* (Error messages for the daemon are in share/language/errmsg.sys) */
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+void	init_client_errs(void);
+extern const char *client_errors[];	/* Error messages */
+#ifdef	__cplusplus
+}
+#endif
+
+#define CR_MIN_ERROR		2000	/* For easier client code */
+#define CR_MAX_ERROR		2999
+#if defined(OS2) && defined(MYSQL_SERVER)
+#define CER(X) client_errors[(X)-CR_MIN_ERROR]
+#elif !defined(ER)
+#define ER(X) client_errors[(X)-CR_MIN_ERROR]
+#endif
+#define CLIENT_ERRMAP		2	/* Errormap used by my_error() */
+
+#define CR_UNKNOWN_ERROR	2000
+#define CR_SOCKET_CREATE_ERROR	2001
+#define CR_CONNECTION_ERROR	2002
+#define CR_CONN_HOST_ERROR	2003
+#define CR_IPSOCK_ERROR		2004
+#define CR_UNKNOWN_HOST		2005
+#define CR_SERVER_GONE_ERROR	2006
+#define CR_VERSION_ERROR	2007
+#define CR_OUT_OF_MEMORY	2008
+#define CR_WRONG_HOST_INFO	2009
+#define CR_LOCALHOST_CONNECTION 2010
+#define CR_TCP_CONNECTION	2011
+#define CR_SERVER_HANDSHAKE_ERR 2012
+#define CR_SERVER_LOST		2013
+#define CR_COMMANDS_OUT_OF_SYNC 2014
+#define CR_NAMEDPIPE_CONNECTION 2015
+#define CR_NAMEDPIPEWAIT_ERROR  2016
+#define CR_NAMEDPIPEOPEN_ERROR  2017
+#define CR_NAMEDPIPESETSTATE_ERROR 2018
+#define CR_CANT_READ_CHARSET	2019
+#define CR_NET_PACKET_TOO_LARGE 2020
+#define CR_EMBEDDED_CONNECTION	2021
+#define CR_PROBE_SLAVE_STATUS   2022
+#define CR_PROBE_SLAVE_HOSTS    2023
+#define CR_PROBE_SLAVE_CONNECT  2024
+#define CR_PROBE_MASTER_CONNECT 2025
+#define CR_SSL_CONNECTION_ERROR 2026
+#define CR_MALFORMED_PACKET     2027
+#define CR_WRONG_LICENSE	2028
+
+/* new 4.1 error codes */
+#define CR_NULL_POINTER		2029
+#define CR_NO_PREPARE_STMT	2030
+#define CR_PARAMS_NOT_BOUND	2031
+#define CR_DATA_TRUNCATED	2032
+#define CR_NO_PARAMETERS_EXISTS 2033
+#define CR_INVALID_PARAMETER_NO 2034
+#define CR_INVALID_BUFFER_USE	2035
+#define CR_UNSUPPORTED_PARAM_TYPE 2036
+
+#define CR_SHARED_MEMORY_CONNECTION             2037
+#define CR_SHARED_MEMORY_CONNECT_REQUEST_ERROR  2038
+#define CR_SHARED_MEMORY_CONNECT_ANSWER_ERROR   2039
+#define CR_SHARED_MEMORY_CONNECT_FILE_MAP_ERROR 2040
+#define CR_SHARED_MEMORY_CONNECT_MAP_ERROR      2041
+#define CR_SHARED_MEMORY_FILE_MAP_ERROR         2042
+#define CR_SHARED_MEMORY_MAP_ERROR              2043
+#define CR_SHARED_MEMORY_EVENT_ERROR     	2044
+#define CR_SHARED_MEMORY_CONNECT_ABANDONED_ERROR 2045
+#define CR_SHARED_MEMORY_CONNECT_SET_ERROR      2046
+#define CR_CONN_UNKNOW_PROTOCOL 		2047
+#define CR_INVALID_CONN_HANDLE			2048
+#define CR_SECURE_AUTH                          2049
+#define CR_FETCH_CANCELED                       2050
+#define CR_NO_DATA                              2051
diff --git a/src/terralib/drivers/MySQL/include/libmysql.def b/src/terralib/drivers/MySQL/include/libmysql.def
new file mode 100644
index 0000000..bc91e90
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/libmysql.def
@@ -0,0 +1,147 @@
+LIBRARY		LIBMYSQL
+DESCRIPTION	'MySQL 4.1 Client Library'
+VERSION		6.0
+EXPORTS
+	_dig_vec_lower
+	_dig_vec_upper
+	bmove_upp
+	delete_dynamic
+	free_defaults
+	getopt_compare_strings
+	getopt_ull_limit_value
+	handle_options
+	init_dynamic_array
+	insert_dynamic
+	int2str
+	is_prefix
+	list_add
+	list_delete
+	load_defaults
+	my_end
+	my_getopt_print_errors
+	my_init
+	my_malloc
+	my_memdup
+	my_no_flags_free
+	my_path
+	mysql_get_parameters
+	my_print_help
+	my_print_variables
+	my_realloc
+	my_strdup
+	mysql_thread_end
+	mysql_thread_init
+	myodbc_remove_escape
+	mysql_affected_rows
+	mysql_autocommit
+	mysql_stmt_bind_param
+	mysql_stmt_bind_result
+	mysql_change_user
+	mysql_character_set_name
+	mysql_close
+	mysql_commit
+	mysql_data_seek
+	mysql_debug
+	mysql_dump_debug_info
+	mysql_eof
+	mysql_errno
+	mysql_error
+	mysql_escape_string
+	mysql_stmt_execute
+	mysql_stmt_fetch
+	mysql_stmt_fetch_column
+	mysql_fetch_field
+	mysql_fetch_field_direct
+	mysql_fetch_fields
+	mysql_fetch_lengths
+	mysql_fetch_row
+	mysql_field_count
+	mysql_field_seek
+	mysql_field_tell
+	mysql_free_result
+	mysql_get_client_info
+	mysql_get_host_info
+	mysql_get_proto_info
+	mysql_get_server_info
+	mysql_get_client_version
+	mysql_info
+	mysql_init
+	mysql_insert_id
+	mysql_kill
+	mysql_set_server_option
+	mysql_list_dbs
+	mysql_list_fields
+	mysql_list_processes
+	mysql_list_tables
+	mysql_more_results
+	mysql_next_result
+	mysql_num_fields
+	mysql_num_rows
+	mysql_odbc_escape_string
+	mysql_options
+	mysql_stmt_param_count
+	mysql_stmt_param_metadata
+	mysql_ping
+	mysql_stmt_result_metadata
+	mysql_query
+	mysql_read_query_result
+	mysql_real_connect
+	mysql_real_escape_string
+	mysql_real_query
+	mysql_refresh
+	mysql_rollback
+	mysql_row_seek
+	mysql_row_tell
+	mysql_select_db
+	mysql_stmt_send_long_data
+	mysql_send_query
+	mysql_shutdown
+	mysql_ssl_set
+	mysql_stat
+	mysql_stmt_affected_rows
+	mysql_stmt_close
+	mysql_stmt_reset
+	mysql_stmt_data_seek
+	mysql_stmt_errno
+	mysql_stmt_error
+	mysql_stmt_free_result
+	mysql_stmt_num_rows
+	mysql_stmt_row_seek
+	mysql_stmt_row_tell
+	mysql_stmt_store_result
+	mysql_store_result
+	mysql_thread_id
+	mysql_thread_safe
+	mysql_use_result
+	mysql_warning_count
+	mysql_stmt_sqlstate
+	mysql_sqlstate
+	mysql_get_server_version
+	set_dynamic
+	strcend
+	strcont
+	strdup_root
+	strfill
+	strinstr
+	strmake
+	strmov
+	strxmov
+	mysql_stmt_prepare
+	mysql_stmt_init
+	mysql_stmt_insert_id
+	mysql_stmt_attr_get
+	mysql_stmt_attr_set
+	mysql_stmt_field_count
+	client_errors
+	mysql_set_local_infile_default
+	mysql_set_local_infile_handler
+	mysql_disable_reads_from_master
+	mysql_disable_rpl_parse
+	mysql_enable_reads_from_master
+	mysql_enable_rpl_parse
+	mysql_master_query
+	mysql_rpl_parse_enabled
+	mysql_rpl_probe
+	mysql_rpl_query_type
+	mysql_slave_query
+	mysql_embedded
diff --git a/src/terralib/drivers/MySQL/include/libmysqld.def b/src/terralib/drivers/MySQL/include/libmysqld.def
new file mode 100644
index 0000000..14c6725
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/libmysqld.def
@@ -0,0 +1,159 @@
+LIBRARY		LIBMYSQLD
+DESCRIPTION	'MySQL 4.1 Embedded Server Library'
+VERSION		4.1
+EXPORTS
+	_dig_vec_upper
+	_dig_vec_lower
+	bmove_upp
+	delete_dynamic
+	free_defaults
+	getopt_compare_strings
+	getopt_ull_limit_value
+	handle_options
+	init_dynamic_array
+	insert_dynamic
+	int2str
+	is_prefix
+	list_add
+	list_delete
+	load_defaults
+	max_allowed_packet
+	my_end
+	my_getopt_print_errors
+	my_init
+	my_malloc
+	my_memdup
+	my_no_flags_free
+	my_path
+	my_print_help
+	my_print_variables
+	my_realloc
+	my_strdup
+	my_thread_end
+	my_thread_init
+	myodbc_remove_escape
+	mysql_affected_rows
+	mysql_autocommit
+	mysql_change_user
+	mysql_character_set_name
+	mysql_close
+	mysql_commit
+	mysql_data_seek
+	mysql_debug
+	mysql_dump_debug_info
+	mysql_eof
+	mysql_errno
+	mysql_error
+	mysql_escape_string
+	mysql_fetch_field
+	mysql_fetch_field_direct
+	mysql_fetch_fields
+	mysql_fetch_lengths
+	mysql_fetch_row
+	mysql_field_count
+	mysql_field_seek
+	mysql_field_tell
+	mysql_free_result
+	mysql_get_client_info
+	mysql_get_host_info
+	mysql_get_proto_info
+	mysql_get_server_info
+	mysql_info
+	mysql_init
+	mysql_insert_id
+	mysql_kill
+	mysql_list_dbs
+	mysql_list_fields
+	mysql_list_processes
+	mysql_list_tables
+	mysql_more_results
+	mysql_next_result
+	mysql_num_fields
+	mysql_num_rows
+	mysql_odbc_escape_string
+	mysql_options
+	mysql_ping
+	mysql_query
+	mysql_read_query_result
+	mysql_real_connect
+	mysql_real_escape_string
+	mysql_real_query
+	mysql_refresh
+	mysql_rollback
+	mysql_row_seek
+	mysql_row_tell
+	mysql_select_db
+	mysql_send_query
+	mysql_shutdown
+	mysql_ssl_set
+	mysql_stat
+	mysql_store_result
+	mysql_sqlstate
+	mysql_thread_id
+	mysql_thread_safe
+	mysql_use_result
+	mysql_warning_count
+	set_dynamic
+	strcend
+	strcont
+	strdup_root
+	strfill
+	strinstr
+	strmake
+	strmov
+	strxmov
+	mysql_server_end
+	mysql_server_init
+	get_tty_password
+	sql_protocol_typelib
+	mysql_get_server_version
+	mysql_sqlstate
+	charsets_dir
+	disabled_my_option
+	my_charset_latin1
+	init_alloc_root
+	my_progname
+	get_charset_by_csname
+	print_defaults
+	find_type
+	strxnmov
+	strend
+	my_fopen
+	my_fclose
+	unpack_filename
+	str2int
+	int10_to_str
+	longlong10_to_str
+	my_snprintf_8bit
+	alloc_root
+	free_root
+	my_read
+	llstr
+	mysql_get_parameters
+	mysql_stmt_bind_param
+	mysql_stmt_bind_result
+	mysql_stmt_execute
+	mysql_stmt_fetch
+	mysql_stmt_fetch_column
+	mysql_stmt_param_count
+	mysql_stmt_param_metadata
+	mysql_stmt_result_metadata
+	mysql_stmt_send_long_data
+	mysql_stmt_affected_rows
+	mysql_stmt_close
+	mysql_stmt_reset
+	mysql_stmt_data_seek
+	mysql_stmt_errno
+	mysql_stmt_error
+	mysql_stmt_free_result
+	mysql_stmt_num_rows
+	mysql_stmt_row_seek
+	mysql_stmt_row_tell
+	mysql_stmt_store_result
+	mysql_stmt_sqlstate
+	mysql_stmt_prepare
+	mysql_stmt_init
+	mysql_stmt_insert_id
+	mysql_stmt_attr_get
+	mysql_stmt_attr_set
+	mysql_stmt_field_count
diff --git a/src/terralib/drivers/MySQL/include/m_ctype.h b/src/terralib/drivers/MySQL/include/m_ctype.h
new file mode 100644
index 0000000..ddc2107
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/m_ctype.h
@@ -0,0 +1,450 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/*
+  A better inplementation of the UNIX ctype(3) library.
+  Notes:   my_global.h should be included before ctype.h
+*/
+
+#ifndef _m_ctype_h
+#define _m_ctype_h
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#define MY_CS_NAME_SIZE			32
+#define MY_CS_CTYPE_TABLE_SIZE		257
+#define MY_CS_TO_LOWER_TABLE_SIZE	256
+#define MY_CS_TO_UPPER_TABLE_SIZE	256
+#define MY_CS_SORT_ORDER_TABLE_SIZE	256
+#define MY_CS_TO_UNI_TABLE_SIZE		256
+
+#define CHARSET_DIR	"charsets/"
+
+#define my_wc_t ulong
+
+typedef struct unicase_info_st
+{
+  uint16 toupper;
+  uint16 tolower;
+  uint16 sort;
+} MY_UNICASE_INFO;
+
+#define MY_CS_ILSEQ	0
+#define MY_CS_ILUNI	0
+#define MY_CS_TOOSMALL	-1
+#define MY_CS_TOOFEW(n)	(-1-(n))
+
+#define MY_SEQ_INTTAIL	1
+#define MY_SEQ_SPACES	2
+
+        /* My charsets_list flags */
+#define MY_CS_COMPILED  1      /* compiled-in sets               */
+#define MY_CS_CONFIG    2      /* sets that have a *.conf file   */
+#define MY_CS_INDEX     4      /* sets listed in the Index file  */
+#define MY_CS_LOADED    8      /* sets that are currently loaded */
+#define MY_CS_BINSORT	16     /* if binary sort order           */
+#define MY_CS_PRIMARY	32     /* if primary collation           */
+#define MY_CS_STRNXFRM	64     /* if strnxfrm is used for sort   */
+#define MY_CS_UNICODE	128    /* is a charset is full unicode   */
+#define MY_CS_READY	256    /* if a charset is initialized    */
+#define MY_CS_AVAILABLE	512    /* If either compiled-in or loaded*/
+
+#define MY_CHARSET_UNDEFINED 0
+
+
+typedef struct my_uni_idx_st
+{
+  uint16 from;
+  uint16 to;
+  uchar  *tab;
+} MY_UNI_IDX;
+
+typedef struct
+{
+  uint beg;
+  uint end;
+  uint mblen;
+} my_match_t;
+
+enum my_lex_states
+{
+  MY_LEX_START, MY_LEX_CHAR, MY_LEX_IDENT, 
+  MY_LEX_IDENT_SEP, MY_LEX_IDENT_START,
+  MY_LEX_REAL, MY_LEX_HEX_NUMBER,
+  MY_LEX_CMP_OP, MY_LEX_LONG_CMP_OP, MY_LEX_STRING, MY_LEX_COMMENT, MY_LEX_END,
+  MY_LEX_OPERATOR_OR_IDENT, MY_LEX_NUMBER_IDENT, MY_LEX_INT_OR_REAL,
+  MY_LEX_REAL_OR_POINT, MY_LEX_BOOL, MY_LEX_EOL, MY_LEX_ESCAPE, 
+  MY_LEX_LONG_COMMENT, MY_LEX_END_LONG_COMMENT, MY_LEX_SEMICOLON, 
+  MY_LEX_SET_VAR, MY_LEX_USER_END, MY_LEX_HOSTNAME, MY_LEX_SKIP, 
+  MY_LEX_USER_VARIABLE_DELIMITER, MY_LEX_SYSTEM_VAR,
+  MY_LEX_IDENT_OR_KEYWORD,
+  MY_LEX_IDENT_OR_HEX, MY_LEX_IDENT_OR_BIN, MY_LEX_IDENT_OR_NCHAR,
+  MY_LEX_STRING_OR_DELIMITER
+};
+
+struct charset_info_st;
+
+typedef struct my_collation_handler_st
+{
+  my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
+  /* Collation routines */
+  int     (*strnncoll)(struct charset_info_st *,
+		       const uchar *, uint, const uchar *, uint, my_bool);
+  int     (*strnncollsp)(struct charset_info_st *,
+		       const uchar *, uint, const uchar *, uint);
+  int     (*strnxfrm)(struct charset_info_st *,
+		      uchar *, uint, const uchar *, uint);
+  my_bool (*like_range)(struct charset_info_st *,
+			const char *s, uint s_length,
+			pchar w_prefix, pchar w_one, pchar w_many, 
+			uint res_length,
+			char *min_str, char *max_str,
+			uint *min_len, uint *max_len);
+  int     (*wildcmp)(struct charset_info_st *,
+  		     const char *str,const char *str_end,
+                     const char *wildstr,const char *wildend,
+                     int escape,int w_one, int w_many);
+
+  int  (*strcasecmp)(struct charset_info_st *, const char *, const char *);
+  
+  uint (*instr)(struct charset_info_st *,
+                const char *b, uint b_length,
+                const char *s, uint s_length,
+                my_match_t *match, uint nmatch);
+  
+  /* Hash calculation */
+  void (*hash_sort)(struct charset_info_st *cs, const uchar *key, uint len,
+		    ulong *nr1, ulong *nr2); 
+} MY_COLLATION_HANDLER;
+
+extern MY_COLLATION_HANDLER my_collation_mb_bin_handler;
+extern MY_COLLATION_HANDLER my_collation_8bit_bin_handler;
+extern MY_COLLATION_HANDLER my_collation_8bit_simple_ci_handler;
+extern MY_COLLATION_HANDLER my_collation_ucs2_uca_handler;
+
+
+typedef struct my_charset_handler_st
+{
+  my_bool (*init)(struct charset_info_st *, void *(*alloc)(uint));
+  /* Multibyte routines */
+  int     (*ismbchar)(struct charset_info_st *, const char *, const char *);
+  int     (*mbcharlen)(struct charset_info_st *, uint);
+  uint    (*numchars)(struct charset_info_st *, const char *b, const char *e);
+  uint    (*charpos)(struct charset_info_st *, const char *b, const char *e, uint pos);
+  uint    (*well_formed_len)(struct charset_info_st *,
+  			   const char *b,const char *e, uint nchars);
+  uint    (*lengthsp)(struct charset_info_st *, const char *ptr, uint length);
+  uint    (*numcells)(struct charset_info_st *, const char *b, const char *e);
+  
+  /* Unicode convertion */
+  int (*mb_wc)(struct charset_info_st *cs,my_wc_t *wc,
+	       const unsigned char *s,const unsigned char *e);
+  int (*wc_mb)(struct charset_info_st *cs,my_wc_t wc,
+	       unsigned char *s,unsigned char *e);
+  
+  /* Functions for case and sort convertion */
+  void    (*caseup_str)(struct charset_info_st *, char *);
+  void    (*casedn_str)(struct charset_info_st *, char *);
+  void    (*caseup)(struct charset_info_st *, char *, uint);
+  void    (*casedn)(struct charset_info_st *, char *, uint);
+  
+  /* Charset dependant snprintf() */
+  int  (*snprintf)(struct charset_info_st *, char *to, uint n, const char *fmt,
+		   ...);
+  int  (*long10_to_str)(struct charset_info_st *, char *to, uint n, int radix,
+			long int val);
+  int (*longlong10_to_str)(struct charset_info_st *, char *to, uint n,
+			   int radix, longlong val);
+  
+  void (*fill)(struct charset_info_st *, char *to, uint len, int fill);
+  
+  /* String-to-number convertion routines */
+  long        (*strntol)(struct charset_info_st *, const char *s, uint l,
+			 int base, char **e, int *err);
+  ulong      (*strntoul)(struct charset_info_st *, const char *s, uint l,
+			 int base, char **e, int *err);
+  longlong   (*strntoll)(struct charset_info_st *, const char *s, uint l,
+			 int base, char **e, int *err);
+  ulonglong (*strntoull)(struct charset_info_st *, const char *s, uint l,
+			 int base, char **e, int *err);
+  double      (*strntod)(struct charset_info_st *, char *s, uint l, char **e,
+			 int *err);
+  longlong (*my_strtoll10)(struct charset_info_st *cs,
+                           const char *nptr, char **endptr, int *error);
+  ulong        (*scan)(struct charset_info_st *, const char *b, const char *e,
+		       int sq);
+} MY_CHARSET_HANDLER;
+
+extern MY_CHARSET_HANDLER my_charset_8bit_handler;
+extern MY_CHARSET_HANDLER my_charset_ucs2_handler;
+
+
+typedef struct charset_info_st
+{
+  uint      number;
+  uint      primary_number;
+  uint      binary_number;
+  uint      state;
+  const char *csname;
+  const char *name;
+  const char *comment;
+  const char *tailoring;
+  uchar    *ctype;
+  uchar    *to_lower;
+  uchar    *to_upper;
+  uchar    *sort_order;
+  uint16   *contractions;
+  uint16   **sort_order_big;
+  uint16      *tab_to_uni;
+  MY_UNI_IDX  *tab_from_uni;
+  uchar     *state_map;
+  uchar     *ident_map;
+  uint      strxfrm_multiply;
+  uint      mbminlen;
+  uint      mbmaxlen;
+  uint16    min_sort_char;
+  uint16    max_sort_char; /* For LIKE optimization */
+  
+  MY_CHARSET_HANDLER *cset;
+  MY_COLLATION_HANDLER *coll;
+  
+} CHARSET_INFO;
+
+
+extern CHARSET_INFO my_charset_bin;
+extern CHARSET_INFO my_charset_big5_chinese_ci;
+extern CHARSET_INFO my_charset_big5_bin;
+extern CHARSET_INFO my_charset_euckr_korean_ci;
+extern CHARSET_INFO my_charset_euckr_bin;
+extern CHARSET_INFO my_charset_gb2312_chinese_ci;
+extern CHARSET_INFO my_charset_gb2312_bin;
+extern CHARSET_INFO my_charset_gbk_chinese_ci;
+extern CHARSET_INFO my_charset_gbk_bin;
+extern CHARSET_INFO my_charset_latin1;
+extern CHARSET_INFO my_charset_latin1_german2_ci;
+extern CHARSET_INFO my_charset_latin1_bin;
+extern CHARSET_INFO my_charset_latin2_czech_ci;
+extern CHARSET_INFO my_charset_sjis_japanese_ci;
+extern CHARSET_INFO my_charset_sjis_bin;
+extern CHARSET_INFO my_charset_tis620_thai_ci;
+extern CHARSET_INFO my_charset_tis620_bin;
+extern CHARSET_INFO my_charset_ucs2_general_ci;
+extern CHARSET_INFO my_charset_ucs2_bin;
+extern CHARSET_INFO my_charset_ucs2_general_uca;
+extern CHARSET_INFO my_charset_ujis_japanese_ci;
+extern CHARSET_INFO my_charset_ujis_bin;
+extern CHARSET_INFO my_charset_utf8_general_ci;
+extern CHARSET_INFO my_charset_utf8_bin;
+extern CHARSET_INFO my_charset_cp1250_czech_ci;
+
+/* declarations for simple charsets */
+extern int  my_strnxfrm_simple(CHARSET_INFO *, uchar *, uint, const uchar *,
+			       uint); 
+extern int  my_strnncoll_simple(CHARSET_INFO *, const uchar *, uint,
+				const uchar *, uint, my_bool);
+
+extern int  my_strnncollsp_simple(CHARSET_INFO *, const uchar *, uint,
+				const uchar *, uint);
+
+extern void my_hash_sort_simple(CHARSET_INFO *cs,
+				const uchar *key, uint len,
+				ulong *nr1, ulong *nr2); 
+
+extern uint my_lengthsp_8bit(CHARSET_INFO *cs, const char *ptr, uint length);
+
+extern uint my_instr_simple(struct charset_info_st *,
+                            const char *b, uint b_length,
+                            const char *s, uint s_length,
+                            my_match_t *match, uint nmatch);
+
+
+/* Functions for 8bit */
+extern void my_caseup_str_8bit(CHARSET_INFO *, char *);
+extern void my_casedn_str_8bit(CHARSET_INFO *, char *);
+extern void my_caseup_8bit(CHARSET_INFO *, char *, uint);
+extern void my_casedn_8bit(CHARSET_INFO *, char *, uint);
+
+extern int my_strcasecmp_8bit(CHARSET_INFO * cs, const char *, const char *);
+
+int my_mb_wc_8bit(CHARSET_INFO *cs,my_wc_t *wc, const uchar *s,const uchar *e);
+int my_wc_mb_8bit(CHARSET_INFO *cs,my_wc_t wc, uchar *s, uchar *e);
+
+ulong my_scan_8bit(CHARSET_INFO *cs, const char *b, const char *e, int sq);
+
+int my_snprintf_8bit(struct charset_info_st *, char *to, uint n,
+		     const char *fmt, ...);
+
+long        my_strntol_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+			    char **e, int *err);
+ulong      my_strntoul_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+			    char **e, int *err);
+longlong   my_strntoll_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+			    char **e, int *err);
+ulonglong my_strntoull_8bit(CHARSET_INFO *, const char *s, uint l, int base,
+			    char **e, int *err);
+double      my_strntod_8bit(CHARSET_INFO *, char *s, uint l,char **e,
+			    int *err);
+int  my_long10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
+			   long int val);
+int my_longlong10_to_str_8bit(CHARSET_INFO *, char *to, uint l, int radix,
+			      longlong val);
+
+longlong my_strtoll10_8bit(CHARSET_INFO *cs,
+                           const char *nptr, char **endptr, int *error);
+longlong my_strtoll10_ucs2(CHARSET_INFO *cs, 
+                           const char *nptr, char **endptr, int *error);
+
+void my_fill_8bit(CHARSET_INFO *cs, char* to, uint l, int fill);
+
+my_bool  my_like_range_simple(CHARSET_INFO *cs,
+			      const char *ptr, uint ptr_length,
+			      pbool escape, pbool w_one, pbool w_many,
+			      uint res_length,
+			      char *min_str, char *max_str,
+			      uint *min_length, uint *max_length);
+
+my_bool  my_like_range_mb(CHARSET_INFO *cs,
+			  const char *ptr, uint ptr_length,
+			  pbool escape, pbool w_one, pbool w_many,
+			  uint res_length,
+			  char *min_str, char *max_str,
+			  uint *min_length, uint *max_length);
+
+my_bool  my_like_range_ucs2(CHARSET_INFO *cs,
+			    const char *ptr, uint ptr_length,
+			    pbool escape, pbool w_one, pbool w_many,
+			    uint res_length,
+			    char *min_str, char *max_str,
+			    uint *min_length, uint *max_length);
+
+
+int my_wildcmp_8bit(CHARSET_INFO *,
+		    const char *str,const char *str_end,
+		    const char *wildstr,const char *wildend,
+		    int escape, int w_one, int w_many);
+
+uint my_numchars_8bit(CHARSET_INFO *, const char *b, const char *e);
+uint my_numcells_8bit(CHARSET_INFO *, const char *b, const char *e);
+uint my_charpos_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos);
+uint my_well_formed_len_8bit(CHARSET_INFO *, const char *b, const char *e, uint pos);
+int my_mbcharlen_8bit(CHARSET_INFO *, uint c);
+
+
+/* Functions for multibyte charsets */
+extern void my_caseup_str_mb(CHARSET_INFO *, char *);
+extern void my_casedn_str_mb(CHARSET_INFO *, char *);
+extern void my_caseup_mb(CHARSET_INFO *, char *, uint);
+extern void my_casedn_mb(CHARSET_INFO *, char *, uint);
+extern int my_strcasecmp_mb(CHARSET_INFO * cs,const char *, const char *);
+
+int my_wildcmp_mb(CHARSET_INFO *,
+		  const char *str,const char *str_end,
+		  const char *wildstr,const char *wildend,
+		  int escape, int w_one, int w_many);
+uint my_numchars_mb(CHARSET_INFO *, const char *b, const char *e);
+uint my_numcells_mb(CHARSET_INFO *, const char *b, const char *e);
+uint my_charpos_mb(CHARSET_INFO *, const char *b, const char *e, uint pos);
+uint my_well_formed_len_mb(CHARSET_INFO *, const char *b, const char *e, uint pos);
+uint my_instr_mb(struct charset_info_st *,
+                 const char *b, uint b_length,
+                 const char *s, uint s_length,
+                 my_match_t *match, uint nmatch);
+
+int my_wildcmp_unicode(CHARSET_INFO *cs,
+                       const char *str, const char *str_end,
+                       const char *wildstr, const char *wildend,
+                       int escape, int w_one, int w_many,
+                       MY_UNICASE_INFO **weights);
+
+extern my_bool my_parse_charset_xml(const char *bug, uint len,
+				    int (*add)(CHARSET_INFO *cs));
+
+#define	_MY_U	01	/* Upper case */
+#define	_MY_L	02	/* Lower case */
+#define	_MY_NMR	04	/* Numeral (digit) */
+#define	_MY_SPC	010	/* Spacing character */
+#define	_MY_PNT	020	/* Punctuation */
+#define	_MY_CTR	040	/* Control character */
+#define	_MY_B	0100	/* Blank */
+#define	_MY_X	0200	/* heXadecimal digit */
+
+
+#define	my_isascii(c)	(!((c) & ~0177))
+#define	my_toascii(c)	((c) & 0177)
+#define my_tocntrl(c)	((c) & 31)
+#define my_toprint(c)	((c) | 64)
+#define my_toupper(s,c)	(char) ((s)->to_upper[(uchar) (c)])
+#define my_tolower(s,c)	(char) ((s)->to_lower[(uchar) (c)])
+#define	my_isalpha(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L))
+#define	my_isupper(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_U)
+#define	my_islower(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_L)
+#define	my_isdigit(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_NMR)
+#define	my_isxdigit(s, c) (((s)->ctype+1)[(uchar) (c)] & _MY_X)
+#define	my_isalnum(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_U | _MY_L | _MY_NMR))
+#define	my_isspace(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_SPC)
+#define	my_ispunct(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_PNT)
+#define	my_isprint(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR | _MY_B))
+#define	my_isgraph(s, c)  (((s)->ctype+1)[(uchar) (c)] & (_MY_PNT | _MY_U | _MY_L | _MY_NMR))
+#define	my_iscntrl(s, c)  (((s)->ctype+1)[(uchar) (c)] & _MY_CTR)
+
+/* Some macros that should be cleaned up a little */
+#define my_isvar(s,c)                 (my_isalnum(s,c) || (c) == '_')
+#define my_isvar_start(s,c)           (my_isalpha(s,c) || (c) == '_')
+
+#define my_binary_compare(s)	      ((s)->state  & MY_CS_BINSORT)
+#define use_strnxfrm(s)               ((s)->state  & MY_CS_STRNXFRM)
+#define my_strnxfrm(s, a, b, c, d)    ((s)->coll->strnxfrm((s), (a), (b), (c), (d)))
+#define my_strnncoll(s, a, b, c, d) ((s)->coll->strnncoll((s), (a), (b), (c), (d), 0))
+#define my_like_range(s, a, b, c, d, e, f, g, h, i, j) \
+   ((s)->coll->like_range((s), (a), (b), (c), (d), (e), (f), (g), (h), (i), (j)))
+#define my_wildcmp(cs,s,se,w,we,e,o,m) ((cs)->coll->wildcmp((cs),(s),(se),(w),(we),(e),(o),(m)))
+#define my_strcasecmp(s, a, b)        ((s)->coll->strcasecmp((s), (a), (b)))
+#define my_charpos(cs, b, e, num)     (cs)->cset->charpos((cs), (const char*) (b), (const char *)(e), (num))
+
+
+#define use_mb(s)                     ((s)->cset->ismbchar != NULL)
+#define my_ismbchar(s, a, b)          ((s)->cset->ismbchar((s), (a), (b)))
+#ifdef USE_MB
+#define my_mbcharlen(s, a)            ((s)->cset->mbcharlen((s),(a)))
+#else
+#define my_mbcharlen(s, a)            1
+#endif
+
+#define my_caseup(s, a, l)            ((s)->cset->caseup((s), (a), (l)))
+#define my_casedn(s, a, l)            ((s)->cset->casedn((s), (a), (l)))
+#define my_caseup_str(s, a)           ((s)->cset->caseup_str((s), (a)))
+#define my_casedn_str(s, a)           ((s)->cset->casedn_str((s), (a)))
+#define my_strntol(s, a, b, c, d, e)  ((s)->cset->strntol((s),(a),(b),(c),(d),(e)))
+#define my_strntoul(s, a, b, c, d, e) ((s)->cset->strntoul((s),(a),(b),(c),(d),(e)))
+#define my_strntoll(s, a, b, c, d, e) ((s)->cset->strntoll((s),(a),(b),(c),(d),(e)))
+#define my_strntoull(s, a, b, c,d, e) ((s)->cset->strntoull((s),(a),(b),(c),(d),(e)))
+#define my_strntod(s, a, b, c, d)     ((s)->cset->strntod((s),(a),(b),(c),(d)))
+
+
+/* XXX: still need to take care of this one */
+#ifdef MY_CHARSET_TIS620
+#error The TIS620 charset is broken at the moment.  Tell tim to fix it.
+#define USE_TIS620
+#include "t_ctype.h"
+#endif
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _m_ctype_h */
diff --git a/src/terralib/drivers/MySQL/include/m_string.h b/src/terralib/drivers/MySQL/include/m_string.h
new file mode 100644
index 0000000..97d3442
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/m_string.h
@@ -0,0 +1,264 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* There may be prolems include all of theese. Try to test in
+   configure with ones are needed? */
+
+/*  This is needed for the definitions of strchr... on solaris */
+
+#ifndef _m_string_h
+#define _m_string_h
+#ifndef __USE_GNU
+#define __USE_GNU				/* We want to use stpcpy */
+#endif
+#if defined(HAVE_STRINGS_H)
+#include <strings.h>
+#endif
+#if defined(HAVE_STRING_H)
+#include <string.h>
+#endif
+
+/* need by my_vsnprintf */
+#include <stdarg.h> 
+
+/* Correct some things for UNIXWARE7 */
+#ifdef HAVE_UNIXWARE7_THREADS
+#undef HAVE_STRINGS_H
+#undef HAVE_MEMORY_H
+#define HAVE_MEMCPY
+#ifndef HAVE_MEMMOVE
+#define HAVE_MEMMOVE
+#endif
+#undef HAVE_BCMP
+#undef bcopy
+#undef bcmp
+#undef bzero
+#endif /* HAVE_UNIXWARE7_THREADS */
+#ifdef _AIX
+#undef HAVE_BCMP
+#endif
+
+/*  This is needed for the definitions of bzero... on solaris */
+#if defined(HAVE_STRINGS_H) && !defined(HAVE_mit_thread)
+#include <strings.h>
+#endif
+
+/*  This is needed for the definitions of memcpy... on solaris */
+#if defined(HAVE_MEMORY_H) && !defined(__cplusplus)
+#include <memory.h>
+#endif
+
+#if !defined(HAVE_MEMCPY) && !defined(HAVE_MEMMOVE)
+# define memcpy(d, s, n)	bcopy ((s), (d), (n))
+# define memset(A,C,B)		bfill((A),(B),(C))
+# define memmove(d, s, n)	bmove ((d), (s), (n))
+#elif defined(HAVE_MEMMOVE)
+# define bmove(d, s, n)		memmove((d), (s), (n))
+#else
+# define memmove(d, s, n)	bmove((d), (s), (n)) /* our bmove */
+#endif
+
+/* Unixware 7 */
+#if !defined(HAVE_BFILL)
+# define bfill(A,B,C)           memset((A),(C),(B))
+# define bmove_align(A,B,C)    memcpy((A),(B),(C))
+#endif
+
+#if !defined(HAVE_BCMP)
+# define bcopy(s, d, n)		memcpy((d), (s), (n))
+# define bcmp(A,B,C)		memcmp((A),(B),(C))
+# define bzero(A,B)		memset((A),0,(B))
+# define bmove_align(A,B,C)    memcpy((A),(B),(C))
+#endif
+
+#if defined(__cplusplus) && !defined(OS2)
+extern "C" {
+#endif
+
+#if defined(HAVE_STPCPY) && !defined(HAVE_mit_thread)
+#define strmov(A,B) stpcpy((A),(B))
+#ifndef stpcpy
+extern char *stpcpy(char *, const char *);	/* For AIX with gcc 2.95.3 */
+#endif
+#endif
+
+/* Declared in int2str() */
+extern char NEAR _dig_vec_upper[];
+extern char NEAR _dig_vec_lower[];
+
+#ifdef BAD_STRING_COMPILER
+#define strmov(A,B)  (memccpy(A,B,0,INT_MAX)-1)
+#else
+#define strmov_overlapp(A,B) strmov(A,B)
+#define strmake_overlapp(A,B,C) strmake(A,B,C)
+#endif
+
+#ifdef BAD_MEMCPY			/* Problem with gcc on Alpha */
+#define memcpy_fixed(A,B,C) bmove((A),(B),(C))
+#else
+#define memcpy_fixed(A,B,C) memcpy((A),(B),(C))
+#endif
+
+#ifdef MSDOS
+#undef bmove_align
+#define bmove512(A,B,C) bmove_align(A,B,C)
+extern	void bmove_align(gptr dst,const gptr src,uint len);
+#endif
+
+#if (!defined(USE_BMOVE512) || defined(HAVE_purify)) && !defined(bmove512)
+#define bmove512(A,B,C) memcpy(A,B,C)
+#endif
+
+#ifdef HAVE_purify
+#define memcpy_overlap(A,B,C) \
+DBUG_ASSERT((A) <= (B) || ((B)+(C)) <= (A)); \
+bmove((byte*) (A),(byte*) (B),(size_t) (C));
+#else
+#define memcpy_overlap(A,B,C) memcpy((A), (B), (C))
+#endif /* HAVE_purify */
+
+
+	/* Prototypes for string functions */
+
+#if !defined(bfill) && !defined(HAVE_BFILL)
+extern	void bfill(gptr dst,uint len,pchar fill);
+#endif
+
+#if !defined(bzero) && !defined(HAVE_BZERO)
+extern	void bzero(gptr dst,uint len);
+#endif
+
+#if !defined(bcmp) && !defined(HAVE_BCMP)
+extern	int bcmp(const char *s1,const char *s2,uint len);
+#endif
+#ifdef HAVE_purify
+extern	int my_bcmp(const char *s1,const char *s2,uint len);
+#undef bcmp
+#define bcmp(A,B,C) my_bcmp((A),(B),(C))
+#endif
+
+#ifndef bmove512
+extern	void bmove512(gptr dst,const gptr src,uint len);
+#endif
+
+#if !defined(HAVE_BMOVE) && !defined(bmove)
+extern	void bmove(char *dst, const char *src,uint len);
+#endif
+
+extern	void bmove_upp(char *dst,const char *src,uint len);
+extern	void bchange(char *dst,uint old_len,const char *src,
+		     uint new_len,uint tot_len);
+extern	void strappend(char *s,uint len,pchar fill);
+extern	char *strend(const char *s);
+extern  char *strcend(const char *, pchar);
+extern	char *strfield(char *src,int fields,int chars,int blanks,
+			   int tabch);
+extern	char *strfill(my_string s,uint len,pchar fill);
+extern	uint strinstr(const char *str,const char *search);
+extern  uint r_strinstr(reg1 my_string str,int from, reg4 my_string search);
+extern	char *strkey(char *dst,char *head,char *tail,char *flags);
+extern	char *strmake(char *dst,const char *src,uint length);
+#ifndef strmake_overlapp
+extern	char *strmake_overlapp(char *dst,const char *src, uint length);
+#endif
+
+#ifndef strmov
+extern	char *strmov(char *dst,const char *src);
+#endif
+extern	char *strnmov(char *dst,const char *src,uint n);
+extern	char *strsuff(const char *src,const char *suffix);
+extern	char *strcont(const char *src,const char *set);
+extern	char *strxcat _VARARGS((char *dst,const char *src, ...));
+extern	char *strxmov _VARARGS((char *dst,const char *src, ...));
+extern	char *strxcpy _VARARGS((char *dst,const char *src, ...));
+extern	char *strxncat _VARARGS((char *dst,uint len, const char *src, ...));
+extern	char *strxnmov _VARARGS((char *dst,uint len, const char *src, ...));
+extern	char *strxncpy _VARARGS((char *dst,uint len, const char *src, ...));
+
+/* Prototypes of normal stringfunctions (with may ours) */
+
+#ifdef WANT_STRING_PROTOTYPES
+extern char *strcat(char *, const char *);
+extern char *strchr(const char *, pchar);
+extern char *strrchr(const char *, pchar);
+extern char *strcpy(char *, const char *);
+extern int strcmp(const char *, const char *);
+#ifndef __GNUC__
+extern size_t strlen(const char *);
+#endif
+#endif
+#ifndef HAVE_STRNLEN
+extern uint strnlen(const char *s, uint n);
+#endif
+
+#if !defined(__cplusplus)
+#ifndef HAVE_STRPBRK
+extern char *strpbrk(const char *, const char *);
+#endif
+#ifndef HAVE_STRSTR
+extern char *strstr(const char *, const char *);
+#endif
+#endif
+extern int is_prefix(const char *, const char *);
+
+/* Conversion routines */
+double my_strtod(const char *str, char **end);
+double my_atof(const char *nptr);
+
+extern char *llstr(longlong value,char *buff);
+#ifndef HAVE_STRTOUL
+extern long strtol(const char *str, char **ptr, int base);
+extern ulong strtoul(const char *str, char **ptr, int base);
+#endif
+
+extern char *int2str(long val, char *dst, int radix, int upcase);
+extern char *int10_to_str(long val,char *dst,int radix);
+extern char *str2int(const char *src,int radix,long lower,long upper,
+			 long *val);
+longlong my_strtoll10(const char *nptr, char **endptr, int *error);
+#if SIZEOF_LONG == SIZEOF_LONG_LONG
+#define longlong2str(A,B,C) int2str((A),(B),(C),1)
+#define longlong10_to_str(A,B,C) int10_to_str((A),(B),(C))
+#undef strtoll
+#define strtoll(A,B,C) strtol((A),(B),(C))
+#define strtoull(A,B,C) strtoul((A),(B),(C))
+#ifndef HAVE_STRTOULL
+#define HAVE_STRTOULL
+#endif
+#ifndef HAVE_STRTOLL
+#define HAVE_STRTOLL
+#endif
+#else
+#ifdef HAVE_LONG_LONG
+extern char *longlong2str(longlong val,char *dst,int radix);
+extern char *longlong10_to_str(longlong val,char *dst,int radix);
+#if (!defined(HAVE_STRTOULL) || defined(HAVE_mit_thread)) || defined(NO_STRTOLL_PROTO)
+extern longlong strtoll(const char *str, char **ptr, int base);
+extern ulonglong strtoull(const char *str, char **ptr, int base);
+#endif
+#endif
+#endif
+
+/* my_vsnprintf.c */
+
+extern int my_vsnprintf( char *str, size_t n,
+                                const char *format, va_list ap );
+extern int my_snprintf(char* to, size_t n, const char* fmt, ...);
+
+#if defined(__cplusplus) && !defined(OS2)
+}
+#endif
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_alloc.h b/src/terralib/drivers/MySQL/include/my_alloc.h
new file mode 100644
index 0000000..a3dd35d
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_alloc.h
@@ -0,0 +1,52 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* 
+   Data structures for mysys/my_alloc.c (root memory allocator)
+*/
+
+#ifndef _my_alloc_h
+#define _my_alloc_h
+
+#define ALLOC_MAX_BLOCK_TO_DROP			4096
+#define ALLOC_MAX_BLOCK_USAGE_BEFORE_DROP	10
+
+typedef struct st_used_mem
+{				   /* struct for once_alloc (block) */
+  struct st_used_mem *next;	   /* Next block in use */
+  unsigned int	left;		   /* memory left in block  */
+  unsigned int	size;		   /* size of block */
+} USED_MEM;
+
+
+typedef struct st_mem_root
+{
+  USED_MEM *free;                  /* blocks with free memory in it */
+  USED_MEM *used;                  /* blocks almost without free memory */
+  USED_MEM *pre_alloc;             /* preallocated block */
+  /* if block have less memory it will be put in 'used' list */
+  unsigned int min_malloc;
+  unsigned int block_size;         /* initial block size */
+  unsigned int block_num;          /* allocated blocks counter */
+  /* 
+     first free block in queue test counter (if it exceed 
+     MAX_BLOCK_USAGE_BEFORE_DROP block will be droped in 'used' list)
+  */
+  unsigned int first_block_usage;
+
+  void (*error_handler)(void);
+} MEM_ROOT;
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_dbug.h b/src/terralib/drivers/MySQL/include/my_dbug.h
new file mode 100644
index 0000000..9174a8b
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_dbug.h
@@ -0,0 +1,94 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#ifndef _dbug_h
+#define _dbug_h
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+#if !defined(DBUG_OFF) && !defined(_lint)
+extern	int _db_on_,_no_db_;
+extern	FILE *_db_fp_;
+extern	char *_db_process_;
+extern	int _db_keyword_(const char *keyword);
+extern	void _db_setjmp_(void);
+extern	void _db_longjmp_(void);
+extern	void _db_push_(const char *control);
+extern	void _db_pop_(void);
+extern	void _db_enter_(const char *_func_,const char *_file_,uint _line_,
+			const char **_sfunc_,const char **_sfile_,
+			uint *_slevel_, char ***);
+extern	void _db_return_(uint _line_,const char **_sfunc_,const char **_sfile_,
+			 uint *_slevel_);
+extern	void _db_pargs_(uint _line_,const char *keyword);
+extern	void _db_doprnt_ _VARARGS((const char *format,...));
+extern	void _db_dump_(uint _line_,const char *keyword,const char *memory,
+		       uint length);
+extern	void _db_lock_file();
+extern	void _db_unlock_file();
+
+#define DBUG_ENTER(a) const char *_db_func_, *_db_file_; uint _db_level_; \
+	char **_db_framep_; \
+	_db_enter_ (a,__FILE__,__LINE__,&_db_func_,&_db_file_,&_db_level_, \
+		    &_db_framep_)
+#define DBUG_LEAVE \
+	(_db_return_ (__LINE__, &_db_func_, &_db_file_, &_db_level_))
+#define DBUG_RETURN(a1) {DBUG_LEAVE; return(a1);}
+#define DBUG_VOID_RETURN {DBUG_LEAVE; return;}
+#define DBUG_EXECUTE(keyword,a1) \
+	{if (_db_on_) {if (_db_keyword_ (keyword)) { a1 }}}
+#define DBUG_PRINT(keyword,arglist) \
+	{if (_db_on_) {_db_pargs_(__LINE__,keyword); _db_doprnt_ arglist;}}
+#define DBUG_PUSH(a1) _db_push_ (a1)
+#define DBUG_POP() _db_pop_ ()
+#define DBUG_PROCESS(a1) (_db_process_ = a1)
+#define DBUG_FILE (_db_fp_)
+#define DBUG_SETJMP(a1) (_db_setjmp_ (), setjmp (a1))
+#define DBUG_LONGJMP(a1,a2) (_db_longjmp_ (), longjmp (a1, a2))
+#define DBUG_DUMP(keyword,a1,a2)\
+	{if (_db_on_) {_db_dump_(__LINE__,keyword,a1,a2);}}
+#define DBUG_IN_USE (_db_fp_ && _db_fp_ != stderr)
+#define DEBUGGER_OFF _no_db_=1;_db_on_=0;
+#define DEBUGGER_ON  _no_db_=0
+#define DBUG_LOCK_FILE { _db_lock_file(); }
+#define DBUG_UNLOCK_FILE { _db_unlock_file(); }
+#define DBUG_ASSERT(A) assert(A)
+#else						/* No debugger */
+
+#define DBUG_ENTER(a1)
+#define DBUG_RETURN(a1) return(a1)
+#define DBUG_VOID_RETURN return
+#define DBUG_EXECUTE(keyword,a1) {}
+#define DBUG_PRINT(keyword,arglist) {}
+#define DBUG_PUSH(a1) {}
+#define DBUG_POP() {}
+#define DBUG_PROCESS(a1) {}
+#define DBUG_FILE (stderr)
+#define DBUG_SETJMP setjmp
+#define DBUG_LONGJMP longjmp
+#define DBUG_DUMP(keyword,a1,a2) {}
+#define DBUG_IN_USE 0
+#define DEBUGGER_OFF
+#define DEBUGGER_ON
+#define DBUG_LOCK_FILE
+#define DBUG_UNLOCK_FILE
+#define DBUG_ASSERT(A) {}
+#endif
+#ifdef	__cplusplus
+}
+#endif
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_getopt.h b/src/terralib/drivers/MySQL/include/my_getopt.h
new file mode 100644
index 0000000..e6ca113
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_getopt.h
@@ -0,0 +1,77 @@
+/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#ifndef _my_getopt_h
+#define _my_getopt_h
+
+C_MODE_START
+
+#define GET_NO_ARG     1
+#define GET_BOOL       2
+#define GET_INT        3
+#define GET_UINT       4
+#define GET_LONG       5
+#define GET_ULONG      6
+#define GET_LL         7
+#define GET_ULL        8
+#define GET_STR        9
+#define GET_STR_ALLOC 10
+#define GET_DISABLED  11
+
+#define GET_ASK_ADDR	 128
+#define GET_TYPE_MASK	 127
+
+enum get_opt_arg_type { NO_ARG, OPT_ARG, REQUIRED_ARG };
+
+struct my_option
+{
+  const char *name;                     /* Name of the option */
+  int        id;                        /* unique id or short option */
+  const char *comment;                  /* option comment, for autom. --help */
+  gptr       *value;                    /* The variable value */
+  gptr       *u_max_value;              /* The user def. max variable value */
+  const char **str_values;              /* Pointer to possible values */
+  ulong     var_type;
+  enum get_opt_arg_type arg_type;
+  longlong   def_value;                 /* Default value */
+  longlong   min_value;                 /* Min allowed value */
+  longlong   max_value;                 /* Max allowed value */
+  longlong   sub_size;                  /* Subtract this from given value */
+  long       block_size;                /* Value should be a mult. of this */
+  int        app_type;                  /* To be used by an application */
+};
+
+typedef my_bool (* my_get_one_option) (int, const struct my_option *, char * );
+typedef void (* my_error_reporter) (enum loglevel level, const char *format, ... );
+
+extern char *disabled_my_option;
+extern my_bool my_getopt_print_errors;
+extern my_error_reporter my_getopt_error_reporter;
+
+extern int handle_options (int *argc, char ***argv, 
+			   const struct my_option *longopts, my_get_one_option);
+extern void my_print_help(const struct my_option *options);
+extern void my_print_variables(const struct my_option *options);
+extern void my_getopt_register_get_addr(gptr* (*func_addr)(const char *, uint,
+							   const struct my_option *));
+
+ulonglong getopt_ull_limit_value(ulonglong num, const struct my_option *optp);
+my_bool getopt_compare_strings(const char *s, const char *t, uint length);
+
+C_MODE_END
+
+#endif /* _my_getopt_h */
+
diff --git a/src/terralib/drivers/MySQL/include/my_global.h b/src/terralib/drivers/MySQL/include/my_global.h
new file mode 100644
index 0000000..f620083
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_global.h
@@ -0,0 +1,1191 @@
+/* Copyright (C) 2000-2003 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* This is the include file that should be included 'first' in every C file. */
+
+#ifndef _global_h
+#define _global_h
+
+#ifndef EMBEDDED_LIBRARY
+#define HAVE_REPLICATION
+#define HAVE_EXTERNAL_CLIENT
+#endif
+
+#if defined( __EMX__) && !defined( MYSQL_SERVER)
+/* moved here to use below VOID macro redefinition */
+#define INCL_BASE
+#define INCL_NOPMAPI
+#include <os2.h>
+#endif /* __EMX__ */
+
+#ifdef __CYGWIN__
+/* We use a Unix API, so pretend it's not Windows */
+#undef WIN
+#undef WIN32
+#undef _WIN
+#undef _WIN32
+#undef _WIN64
+#undef __WIN__
+#undef __WIN32__
+#define HAVE_ERRNO_AS_DEFINE
+#endif /* __CYGWIN__ */
+
+#if defined(i386) && !defined(__i386__)
+#define __i386__
+#endif
+
+/* Macros to make switching between C and C++ mode easier */
+#ifdef __cplusplus
+#define C_MODE_START    extern "C" {
+#define C_MODE_END	}
+#else
+#define C_MODE_START
+#define C_MODE_END
+#endif
+
+#if defined(_WIN32) || defined(_WIN64) || defined(__WIN32__) || defined(WIN32)
+#include <config-win.h>
+#elif defined(OS2)
+#include <config-os2.h>
+#elif defined(__NETWARE__)
+#include <my_config.h>
+#include <config-netware.h>
+#if defined(__cplusplus) && defined(inline)
+#undef inline				/* fix configure problem */
+#endif
+#else
+#include <my_config.h>
+#if defined(__cplusplus) && defined(inline)
+#undef inline				/* fix configure problem */
+#endif
+#endif /* _WIN32... */
+
+/* Some defines to avoid ifdefs in the code */
+#ifndef NETWARE_YIELD
+#define NETWARE_YIELD
+#define NETWARE_SET_SCREEN_MODE(A)
+#endif
+
+/*
+  The macros below are borrowed from include/linux/compiler.h in the
+  Linux kernel. Use them to indicate the likelyhood of the truthfulness
+  of a condition. This serves two purposes - newer versions of gcc will be
+  able to optimize for branch predication, which could yield siginficant
+  performance gains in frequently executed sections of the code, and the
+  other reason to use them is for documentation
+*/
+
+#if !defined(__GNUC__) || (__GNUC__ == 2 && __GNUC_MINOR__ < 96)
+#define __builtin_expect(x, expected_value) (x)
+#endif
+
+#define likely(x)	__builtin_expect((x),1)
+#define unlikely(x)	__builtin_expect((x),0)
+
+
+/* Fix problem with S_ISLNK() on Linux */
+#if defined(HAVE_LINUXTHREADS)
+#undef  _GNU_SOURCE
+#define _GNU_SOURCE 1
+#endif
+
+/* The client defines this to avoid all thread code */
+#if defined(UNDEF_THREADS_HACK)
+#undef THREAD
+#undef HAVE_mit_thread
+#undef HAVE_LINUXTHREADS
+#undef HAVE_UNIXWARE7_THREADS
+#endif
+
+#ifdef HAVE_THREADS_WITHOUT_SOCKETS
+/* MIT pthreads does not work with unix sockets */
+#undef HAVE_SYS_UN_H
+#endif
+
+#define __EXTENSIONS__ 1	/* We want some extension */
+#ifndef __STDC_EXT__
+#define __STDC_EXT__ 1          /* To get large file support on hpux */
+#endif
+
+#if defined(THREAD) && !defined(__WIN__) && !defined(OS2)
+#ifndef _POSIX_PTHREAD_SEMANTICS
+#define _POSIX_PTHREAD_SEMANTICS /* We want posix threads */
+#endif
+
+#if !defined(SCO)
+#define _REENTRANT	1	/* Some thread libraries require this */
+#endif
+#if !defined(_THREAD_SAFE) && !defined(_AIX)
+#define _THREAD_SAFE            /* Required for OSF1 */
+#endif
+#ifndef HAVE_mit_thread
+#ifdef HAVE_UNIXWARE7_THREADS
+#include <thread.h>
+#else
+#include <pthread.h>		/* AIX must have this included first */
+#endif /* HAVE_UNIXWARE7_THREADS */
+#endif /* HAVE_mit_thread */
+#if !defined(SCO) && !defined(_REENTRANT)
+#define _REENTRANT	1	/* Threads requires reentrant code */
+#endif
+#endif /* THREAD */
+
+/* Go around some bugs in different OS and compilers */
+#ifdef _AIX			/* By soren at t.dk */
+#define _H_STRINGS
+#define _SYS_STREAM_H
+/* #define _AIX32_CURSES */	/* XXX: this breaks AIX 4.3.3 (others?). */
+#define ulonglong2double(A) my_ulonglong2double(A)
+#define my_off_t2double(A)  my_ulonglong2double(A)
+C_MODE_START
+double my_ulonglong2double(unsigned long long A);
+C_MODE_END
+#endif /* _AIX */
+
+#ifdef HAVE_BROKEN_SNPRINTF	/* HPUX 10.20 don't have this defined */
+#undef HAVE_SNPRINTF
+#endif
+#ifdef HAVE_BROKEN_PREAD
+/*
+  pread()/pwrite() are not 64 bit safe on HP-UX 11.0 without
+  installing the kernel patch PHKL_20349 or greater
+*/
+#undef HAVE_PREAD
+#undef HAVE_PWRITE
+#endif
+#if defined(HAVE_BROKEN_INLINE) && !defined(__cplusplus)
+#undef inline
+#define inline
+#endif
+
+#ifdef UNDEF_HAVE_GETHOSTBYNAME_R		/* For OSF4.x */
+#undef HAVE_GETHOSTBYNAME_R
+#endif
+#ifdef UNDEF_HAVE_INITGROUPS			/* For AIX 4.3 */
+#undef HAVE_INITGROUPS
+#endif
+
+/* gcc/egcs issues */
+
+#if defined(__GNUC) && defined(__EXCEPTIONS)
+#error "Please add -fno-exceptions to CXXFLAGS and reconfigure/recompile"
+#endif
+
+
+/* Fix a bug in gcc 2.8.0 on IRIX 6.2 */
+#if SIZEOF_LONG == 4 && defined(__LONG_MAX__)
+#undef __LONG_MAX__             /* Is a longlong value in gcc 2.8.0 ??? */
+#define __LONG_MAX__ 2147483647
+#endif
+
+/* Fix problem when linking c++ programs with gcc 3.x */
+#ifdef DEFINE_CXA_PURE_VIRTUAL
+#define FIX_GCC_LINKING_PROBLEM \
+extern "C" { int __cxa_pure_virtual() {\
+  DBUG_ASSERT("Pure virtual method called." == "Aborted");\
+  return 0;\
+} }
+#else
+#define FIX_GCC_LINKING_PROBLEM
+#endif
+
+/* egcs 1.1.2 has a problem with memcpy on Alpha */
+#if defined(__GNUC__) && defined(__alpha__) && ! (__GNUC__ > 2 || (__GNUC__ == 2 &&  __GNUC_MINOR__ >= 95))
+#define BAD_MEMCPY
+#endif
+
+/* In Linux-alpha we have atomic.h if we are using gcc */
+#if defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && defined(__alpha__) && (__GNUC__ > 2 || ( __GNUC__ == 2 &&  __GNUC_MINOR__ >= 95)) && !defined(HAVE_ATOMIC_ADD)
+#define HAVE_ATOMIC_ADD
+#define HAVE_ATOMIC_SUB
+#endif
+
+/* In Linux-ia64 including atomic.h will give us an error */
+#if (defined(HAVE_LINUXTHREADS) && defined(__GNUC__) && (defined(__ia64__)||defined(__powerpc64__))) || !defined(THREAD)
+#undef HAVE_ATOMIC_ADD
+#undef HAVE_ATOMIC_SUB
+#endif
+
+#if defined(_lint) && !defined(lint)
+#define lint
+#endif
+#if SIZEOF_LONG_LONG > 4 && !defined(_LONG_LONG)
+#define _LONG_LONG 1		/* For AIX string library */
+#endif
+
+#ifndef stdin
+#include <stdio.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#include <math.h>
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
+#ifdef HAVE_FLOAT_H
+#include <float.h>
+#endif
+
+#ifdef HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_SYS_TIMEB_H
+#include <sys/timeb.h>				/* Avoid warnings on SCO */
+#endif
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif /* TIME_WITH_SYS_TIME */
+#ifdef HAVE_UNISTD_H
+#if defined(HAVE_OPENSSL) && !defined(__FreeBSD__) && !defined(NeXT) && !defined(__OpenBSD__)
+#define crypt unistd_crypt
+#endif
+#include <unistd.h>
+#ifdef HAVE_OPENSSL
+#undef crypt
+#endif
+#endif
+#if defined(__cplusplus) && defined(NO_CPLUSPLUS_ALLOCA)
+#undef HAVE_ALLOCA
+#undef HAVE_ALLOCA_H
+#endif
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+#ifdef HAVE_ATOMIC_ADD
+#define __SMP__
+#ifdef HAVE_LINUX_CONFIG_H
+#include <linux/config.h>	/* May define CONFIG_SMP */
+#endif
+#ifndef CONFIG_SMP
+#define CONFIG_SMP
+#endif
+C_MODE_START
+#include <asm/atomic.h>
+C_MODE_END
+#endif
+#include <errno.h>				/* Recommended by debian */
+/* We need the following to go around a problem with openssl on solaris */
+#if defined(HAVE_CRYPT_H)
+#include <crypt.h>
+#endif
+
+/*
+  A lot of our programs uses asserts, so better to always include it
+  This also fixes a problem when people uses DBUG_ASSERT without including
+  assert.h
+*/
+#include <assert.h>
+
+/* Go around some bugs in different OS and compilers */
+#if defined(_HPUX_SOURCE) && defined(HAVE_SYS_STREAM_H)
+#include <sys/stream.h>		/* HPUX 10.20 defines ulong here. UGLY !!! */
+#define HAVE_ULONG
+#endif
+#ifdef DONT_USE_FINITE		/* HPUX 11.x has is_finite() */
+#undef HAVE_FINITE
+#endif
+#if defined(HPUX10) && defined(_LARGEFILE64_SOURCE) && defined(THREAD)
+/* Fix bug in setrlimit */
+#undef setrlimit
+#define setrlimit cma_setrlimit64
+#endif
+
+#ifdef __QNXNTO__
+/* This has to be after include limits.h */
+#define HAVE_ERRNO_AS_DEFINE
+#define HAVE_FCNTL_LOCK
+#undef  HAVE_FINITE
+#undef  LONGLONG_MIN            /* These get wrongly defined in QNX 6.2 */
+#undef  LONGLONG_MAX            /* standard system library 'limits.h' */
+#endif
+
+/* We can not live without the following defines */
+
+#define USE_MYFUNC 1		/* Must use syscall indirection */
+#define MASTER 1		/* Compile without unireg */
+#define ENGLISH 1		/* Messages in English */
+#define POSIX_MISTAKE 1		/* regexp: Fix stupid spec error */
+#define USE_REGEX 1		/* We want the use the regex library */
+/* Do not define for ultra sparcs */
+#ifndef OS2
+#define USE_BMOVE512 1		/* Use this unless system bmove is faster */
+#endif
+
+#define QUOTE_ARG(x)		#x	/* Quote argument (before cpp) */
+#define STRINGIFY_ARG(x) QUOTE_ARG(x)	/* Quote argument, after cpp */
+
+/* Paranoid settings. Define I_AM_PARANOID if you are paranoid */
+#ifdef I_AM_PARANOID
+#define DONT_ALLOW_USER_CHANGE 1
+#define DONT_USE_MYSQL_PWD 1
+#endif
+
+/* Does the system remember a signal handler after a signal ? */
+#ifndef HAVE_BSD_SIGNALS
+#define DONT_REMEMBER_SIGNAL
+#endif
+
+/* Define void to stop lint from generating "null effekt" comments */
+#ifndef DONT_DEFINE_VOID
+#ifdef _lint
+int	__void__;
+#define VOID(X)		(__void__ = (int) (X))
+#else
+#undef VOID
+#define VOID(X)		(X)
+#endif
+#endif /* DONT_DEFINE_VOID */
+
+#if defined(_lint) || defined(FORCE_INIT_OF_VARS)
+#define LINT_INIT(var)	var=0			/* No uninitialize-warning */
+#else
+#define LINT_INIT(var)
+#endif
+
+/* Define some useful general macros */
+#if defined(__cplusplus) && defined(__GNUC__)
+#define max(a, b)	((a) >? (b))
+#define min(a, b)	((a) <? (b))
+#elif !defined(max)
+#define max(a, b)	((a) > (b) ? (a) : (b))
+#define min(a, b)	((a) < (b) ? (a) : (b))
+#endif
+
+#if defined(__EMX__) || !defined(HAVE_UINT)
+typedef unsigned int uint;
+typedef unsigned short ushort;
+#endif
+
+#define CMP_NUM(a,b)    (((a) < (b)) ? -1 : ((a) == (b)) ? 0 : 1)
+#define sgn(a)		(((a) < 0) ? -1 : ((a) > 0) ? 1 : 0)
+#define swap_variables(t, a, b) { register t dummy; dummy= a; a= b; b= dummy; }
+#define test(a)		((a) ? 1 : 0)
+#define set_if_bigger(a,b)  do { if ((a) < (b)) (a)=(b); } while(0)
+#define set_if_smaller(a,b) do { if ((a) > (b)) (a)=(b); } while(0)
+#define test_all_bits(a,b) (((a) & (b)) == (b))
+#define set_bits(type, bit_count) (sizeof(type)*8 <= (bit_count) ? ~(type) 0 : ((((type) 1) << (bit_count)) - (type) 1))
+#define array_elements(A) ((uint) (sizeof(A)/sizeof(A[0])))
+#ifndef HAVE_RINT
+#define rint(A) floor((A)+(((A) < 0)? -0.5 : 0.5))
+#endif
+
+/* Define some general constants */
+#ifndef TRUE
+#define TRUE		(1)	/* Logical true */
+#define FALSE		(0)	/* Logical false */
+#endif
+
+#if defined(__GNUC__)
+#define function_volatile	volatile
+#define my_reinterpret_cast(A) reinterpret_cast<A>
+#define my_const_cast(A) const_cast<A>
+#elif !defined(my_reinterpret_cast)
+#define my_reinterpret_cast(A) (A)
+#define my_const_cast(A) (A)
+#endif
+#if !defined(__attribute__) && (defined(__cplusplus) || !defined(__GNUC__)  || __GNUC__ == 2 && __GNUC_MINOR__ < 8)
+#define __attribute__(A)
+#endif
+
+/* From old s-system.h */
+
+/*
+  Support macros for non ansi & other old compilers. Since such
+  things are no longer supported we do nothing. We keep then since
+  some of our code may still be needed to upgrade old customers.
+*/
+#define _VARARGS(X) X
+#define _STATIC_VARARGS(X) X
+#define _PC(X)	X
+
+#if defined(DBUG_ON) && defined(DBUG_OFF)
+#undef DBUG_OFF
+#endif
+
+#if defined(_lint) && !defined(DBUG_OFF)
+#define DBUG_OFF
+#endif
+
+#include <my_dbug.h>
+
+#define MIN_ARRAY_SIZE	0	/* Zero or One. Gcc allows zero*/
+#define ASCII_BITS_USED 8	/* Bit char used */
+#define NEAR_F			/* No near function handling */
+
+/* Some types that is different between systems */
+
+typedef int	File;		/* File descriptor */
+#ifndef Socket_defined
+typedef int	my_socket;	/* File descriptor for sockets */
+#define INVALID_SOCKET -1
+#endif
+/* Type for fuctions that handles signals */
+#define sig_handler RETSIGTYPE
+C_MODE_START
+typedef void	(*sig_return)();/* Returns type from signal */
+C_MODE_END
+#if defined(__GNUC__) && !defined(_lint)
+typedef char	pchar;		/* Mixed prototypes can take char */
+typedef char	puchar;		/* Mixed prototypes can take char */
+typedef char	pbool;		/* Mixed prototypes can take char */
+typedef short	pshort;		/* Mixed prototypes can take short int */
+typedef float	pfloat;		/* Mixed prototypes can take float */
+#else
+typedef int	pchar;		/* Mixed prototypes can't take char */
+typedef uint	puchar;		/* Mixed prototypes can't take char */
+typedef int	pbool;		/* Mixed prototypes can't take char */
+typedef int	pshort;		/* Mixed prototypes can't take short int */
+typedef double	pfloat;		/* Mixed prototypes can't take float */
+#endif
+C_MODE_START
+typedef int	(*qsort_cmp)(const void *,const void *);
+typedef int	(*qsort_cmp2)(void*, const void *,const void *);
+C_MODE_END
+#ifdef HAVE_mit_thread
+#define qsort_t void
+#undef QSORT_TYPE_IS_VOID
+#define QSORT_TYPE_IS_VOID
+#else
+#define qsort_t RETQSORTTYPE	/* Broken GCC cant handle typedef !!!! */
+#endif
+#ifdef HAVE_mit_thread
+#define size_socket socklen_t	/* Type of last arg to accept */
+#else
+#ifdef HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
+typedef SOCKET_SIZE_TYPE size_socket;
+#endif
+
+#ifndef SOCKOPT_OPTLEN_TYPE
+#define SOCKOPT_OPTLEN_TYPE size_socket
+#endif
+
+/* file create flags */
+
+#ifndef O_SHARE			/* Probably not windows */
+#define O_SHARE		0	/* Flag to my_open for shared files */
+#ifndef O_BINARY
+#define O_BINARY	0	/* Flag to my_open for binary files */
+#endif
+#ifndef FILE_BINARY
+#define FILE_BINARY	O_BINARY /* Flag to my_fopen for binary streams */
+#endif
+#ifdef HAVE_FCNTL
+#define HAVE_FCNTL_LOCK
+#define F_TO_EOF	0L	/* Param to lockf() to lock rest of file */
+#endif
+#endif /* O_SHARE */
+
+#ifndef O_TEMPORARY
+#define O_TEMPORARY	0
+#endif
+#ifndef O_SHORT_LIVED
+#define O_SHORT_LIVED	0
+#endif
+
+/* #define USE_RECORD_LOCK	*/
+
+	/* Unsigned types supported by the compiler */
+#define UNSINT8			/* unsigned int8 (char) */
+#define UNSINT16		/* unsigned int16 */
+#define UNSINT32		/* unsigned int32 */
+
+	/* General constants */
+#define SC_MAXWIDTH	256	/* Max width of screen (for error messages) */
+#define FN_LEN		256	/* Max file name len */
+#define FN_HEADLEN	253	/* Max length of filepart of file name */
+#define FN_EXTLEN	20	/* Max length of extension (part of FN_LEN) */
+#define FN_REFLEN	512	/* Max length of full path-name */
+#define FN_EXTCHAR	'.'
+#define FN_HOMELIB	'~'	/* ~/ is used as abbrev for home dir */
+#define FN_CURLIB	'.'	/* ./ is used as abbrev for current dir */
+#define FN_PARENTDIR	".."	/* Parent directory; Must be a string */
+#define FN_DEVCHAR	':'
+
+#ifndef FN_LIBCHAR
+#ifdef __EMX__
+#define FN_LIBCHAR	'\\'
+#define FN_ROOTDIR	"\\"
+#else
+#define FN_LIBCHAR	'/'
+#define FN_ROOTDIR	"/"
+#endif
+#endif
+#define MY_NFILE	64	/* This is only used to save filenames */
+#ifndef OS_FILE_LIMIT
+#define OS_FILE_LIMIT	65535
+#endif
+
+/* #define EXT_IN_LIBNAME     */
+/* #define FN_NO_CASE_SENCE   */
+/* #define FN_UPPER_CASE TRUE */
+
+/*
+  Io buffer size; Must be a power of 2 and a multiple of 512. May be
+  smaller what the disk page size. This influences the speed of the
+  isam btree library. eg to big to slow.
+*/
+#define IO_SIZE			4096
+/*
+  How much overhead does malloc have. The code often allocates
+  something like 1024-MALLOC_OVERHEAD bytes
+*/
+#ifdef SAFEMALLOC
+#define MALLOC_OVERHEAD (8+24+4)
+#else
+#define MALLOC_OVERHEAD 8
+#endif
+	/* get memory in huncs */
+#define ONCE_ALLOC_INIT		(uint) (4096-MALLOC_OVERHEAD)
+	/* Typical record cash */
+#define RECORD_CACHE_SIZE	(uint) (64*1024-MALLOC_OVERHEAD)
+	/* Typical key cash */
+#define KEY_CACHE_SIZE		(uint) (8*1024*1024-MALLOC_OVERHEAD)
+	/* Default size of a key cache block  */
+#define KEY_CACHE_BLOCK_SIZE	(uint) 1024
+
+
+	/* Some things that this system doesn't have */
+
+#define NO_HASH			/* Not needed anymore */
+#ifdef __WIN__
+#define NO_DIR_LIBRARY		/* Not standar dir-library */
+#define USE_MY_STAT_STRUCT	/* For my_lib */
+#endif
+
+/* Some defines of functions for portability */
+
+#undef remove		/* Crashes MySQL on SCO 5.0.0 */
+#ifndef __WIN__
+#ifdef OS2
+#define closesocket(A)	soclose(A)
+#else
+#define closesocket(A)	close(A)
+#endif
+#ifndef ulonglong2double
+#define ulonglong2double(A) ((double) (ulonglong) (A))
+#define my_off_t2double(A)  ((double) (my_off_t) (A))
+#endif
+#endif
+
+#ifndef offsetof
+#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
+#endif
+#define ulong_to_double(X) ((double) (ulong) (X))
+#define SET_STACK_SIZE(X)	/* Not needed on real machines */
+
+#if !defined(HAVE_mit_thread) && !defined(HAVE_STRTOK_R)
+#define strtok_r(A,B,C) strtok((A),(B))
+#endif
+
+/* Remove some things that mit_thread break or doesn't support */
+#if defined(HAVE_mit_thread) && defined(THREAD)
+#undef HAVE_PREAD
+#undef HAVE_REALPATH
+#undef HAVE_MLOCK
+#undef HAVE_TEMPNAM				/* Use ours */
+#undef HAVE_PTHREAD_SETPRIO
+#undef HAVE_FTRUNCATE
+#undef HAVE_READLINK
+#endif
+
+/* This is from the old m-machine.h file */
+
+#if SIZEOF_LONG_LONG > 4
+#define HAVE_LONG_LONG 1
+#endif
+
+/*
+  Some pre-ANSI-C99 systems like AIX 5.1 and Linux/GCC 2.95 define
+  ULONGLONG_MAX, LONGLONG_MIN, LONGLONG_MAX; we use them if they're defined.
+  Also on Windows we define these constants by hand in config-win.h.
+*/
+
+#if defined(HAVE_LONG_LONG) && !defined(LONGLONG_MIN)
+#define LONGLONG_MIN	((long long) 0x8000000000000000LL)
+#define LONGLONG_MAX	((long long) 0x7FFFFFFFFFFFFFFFLL)
+#endif
+
+#if defined(HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)
+/* First check for ANSI C99 definition: */
+#ifdef ULLONG_MAX
+#define ULONGLONG_MAX  ULLONG_MAX
+#else
+#define ULONGLONG_MAX ((unsigned long long)(~0ULL))
+#endif
+#endif /* defined (HAVE_LONG_LONG) && !defined(ULONGLONG_MAX)*/
+
+#define INT_MIN32       (~0x7FFFFFFFL)
+#define INT_MAX32       0x7FFFFFFFL
+#define UINT_MAX32      0xFFFFFFFFL
+#define INT_MIN24       (~0x007FFFFF)
+#define INT_MAX24       0x007FFFFF
+#define UINT_MAX24      0x00FFFFFF
+#define INT_MIN16       (~0x7FFF)
+#define INT_MAX16       0x7FFF
+#define UINT_MAX16      0xFFFF
+#define INT_MIN8        (~0x7F)
+#define INT_MAX8        0x7F
+
+/* From limits.h instead */
+#ifndef DBL_MIN
+#define DBL_MIN		4.94065645841246544e-324
+#define FLT_MIN		((float)1.40129846432481707e-45)
+#endif
+#ifndef DBL_MAX
+#define DBL_MAX		1.79769313486231470e+308
+#define FLT_MAX		((float)3.40282346638528860e+38)
+#endif
+
+#if !defined(HAVE_ISINF) && !defined(isinf)
+#define isinf(X)    0
+#endif
+
+/*
+  Max size that must be added to a so that we know Size to make
+  adressable obj.
+*/
+#if SIZEOF_CHARP == 4
+typedef long		my_ptrdiff_t;
+#else
+typedef long long	my_ptrdiff_t;
+#endif
+
+#define MY_ALIGN(A,L)	(((A) + (L) - 1) & ~((L) - 1))
+#define ALIGN_SIZE(A)	MY_ALIGN((A),sizeof(double))
+/* Size to make adressable obj. */
+#define ALIGN_PTR(A, t) ((t*) MY_ALIGN((A),sizeof(t)))
+			 /* Offset of field f in structure t */
+#define OFFSET(t, f)	((size_t)(char *)&((t *)0)->f)
+#define ADD_TO_PTR(ptr,size,type) (type) ((byte*) (ptr)+size)
+#define PTR_BYTE_DIFF(A,B) (my_ptrdiff_t) ((byte*) (A) - (byte*) (B))
+
+#define NullS		(char *) 0
+/* Nowdays we do not support MessyDos */
+#ifndef NEAR
+#define NEAR				/* Who needs segments ? */
+#define FAR				/* On a good machine */
+#ifndef HUGE_PTR
+#define HUGE_PTR
+#endif
+#endif
+#if defined(__IBMC__) || defined(__IBMCPP__)
+/* This was  _System _Export but caused a lot of warnings on _AIX43 */
+#define STDCALL
+#elif !defined( STDCALL)
+#define STDCALL
+#endif
+
+/* Typdefs for easyier portability */
+
+#if defined(VOIDTYPE)
+typedef void	*gptr;		/* Generic pointer */
+#else
+typedef char	*gptr;		/* Generic pointer */
+#endif
+#ifndef HAVE_INT_8_16_32
+typedef signed char int8;       /* Signed integer >= 8  bits */
+typedef short	int16;		/* Signed integer >= 16 bits */
+#endif
+#ifndef HAVE_UCHAR
+typedef unsigned char	uchar;	/* Short for unsigned char */
+#endif
+typedef unsigned char	uint8;	/* Short for unsigned integer >= 8  bits */
+typedef unsigned short	uint16; /* Short for unsigned integer >= 16 bits */
+
+#if SIZEOF_INT == 4
+#ifndef HAVE_INT_8_16_32
+typedef int		int32;
+#endif
+typedef unsigned int	uint32; /* Short for unsigned integer >= 32 bits */
+#elif SIZEOF_LONG == 4
+#ifndef HAVE_INT_8_16_32
+typedef long		int32;
+#endif
+typedef unsigned long	uint32; /* Short for unsigned integer >= 32 bits */
+#else
+error "Neither int or long is of 4 bytes width"
+#endif
+
+#if !defined(HAVE_ULONG) && !defined(HAVE_LINUXTHREADS) && !defined(__USE_MISC)
+typedef unsigned long	ulong;		  /* Short for unsigned long */
+#endif
+#ifndef longlong_defined
+#if defined(HAVE_LONG_LONG) && SIZEOF_LONG != 8
+typedef unsigned long long int ulonglong; /* ulong or unsigned long long */
+typedef long long int	longlong;
+#else
+typedef unsigned long	ulonglong;	  /* ulong or unsigned long long */
+typedef long		longlong;
+#endif
+#endif
+
+#if defined(NO_CLIENT_LONG_LONG)
+typedef unsigned long my_ulonglong;
+#elif defined (__WIN__)
+typedef unsigned __int64 my_ulonglong;
+#else
+typedef unsigned long long my_ulonglong;
+#endif
+
+#ifdef USE_RAID
+/*
+  The following is done with a if to not get problems with pre-processors
+  with late define evaluation
+*/
+#if SIZEOF_OFF_T == 4
+#define SYSTEM_SIZEOF_OFF_T 4
+#else
+#define SYSTEM_SIZEOF_OFF_T 8
+#endif
+#undef  SIZEOF_OFF_T
+#define SIZEOF_OFF_T	    8
+#else
+#define SYSTEM_SIZEOF_OFF_T SIZEOF_OFF_T
+#endif /* USE_RAID */
+
+#if SIZEOF_OFF_T > 4
+typedef ulonglong my_off_t;
+#else
+typedef unsigned long my_off_t;
+#endif
+#define MY_FILEPOS_ERROR	(~(my_off_t) 0)
+#if !defined(__WIN__) && !defined(OS2)
+typedef off_t os_off_t;
+#endif
+
+#if defined(__WIN__)
+#define socket_errno	WSAGetLastError()
+#define SOCKET_EINTR	WSAEINTR
+#define SOCKET_EAGAIN	WSAEINPROGRESS
+#define SOCKET_EWOULDBLOCK WSAEINPROGRESS
+#define SOCKET_ENFILE	ENFILE
+#define SOCKET_EMFILE	EMFILE
+#elif defined(OS2)
+#define socket_errno	sock_errno()
+#define SOCKET_EINTR	SOCEINTR
+#define SOCKET_EAGAIN	SOCEINPROGRESS
+#define SOCKET_EWOULDBLOCK SOCEWOULDBLOCK
+#define SOCKET_ENFILE	SOCENFILE
+#define SOCKET_EMFILE	SOCEMFILE
+#define closesocket(A)	soclose(A)
+#else /* Unix */
+#define socket_errno	errno
+#define closesocket(A)	close(A)
+#define SOCKET_EINTR	EINTR
+#define SOCKET_EAGAIN	EAGAIN
+#define SOCKET_EWOULDBLOCK EWOULDBLOCK
+#define SOCKET_ENFILE	ENFILE
+#define SOCKET_EMFILE	EMFILE
+#endif
+
+typedef uint8		int7;	/* Most effective integer 0 <= x <= 127 */
+typedef short		int15;	/* Most effective integer 0 <= x <= 32767 */
+typedef char		*my_string; /* String of characters */
+typedef unsigned long	size_s; /* Size of strings (In string-funcs) */
+typedef int		myf;	/* Type of MyFlags in my_funcs */
+#ifndef byte_defined
+typedef char		byte;	/* Smallest addressable unit */
+#endif
+typedef char		my_bool; /* Small bool */
+#if !defined(bool) && !defined(bool_defined) && (!defined(HAVE_BOOL) || !defined(__cplusplus))
+typedef char		bool;	/* Ordinary boolean values 0 1 */
+#endif
+	/* Macros for converting *constants* to the right type */
+#define INT8(v)		(int8) (v)
+#define INT16(v)	(int16) (v)
+#define INT32(v)	(int32) (v)
+#define MYF(v)		(myf) (v)
+
+#ifndef LL
+#ifdef HAVE_LONG_LONG
+#define LL(A) A ## LL
+#else
+#define LL(A) A ## L
+#endif
+#endif
+
+#ifndef ULL
+#ifdef HAVE_LONG_LONG
+#define ULL(A) A ## ULL
+#else
+#define ULL(A) A ## UL
+#endif
+#endif
+
+/*
+  Defines to make it possible to prioritize register assignments. No
+  longer that important with modern compilers.
+*/
+#ifndef USING_X
+#define reg1 register
+#define reg2 register
+#define reg3 register
+#define reg4 register
+#define reg5 register
+#define reg6 register
+#define reg7 register
+#define reg8 register
+#define reg9 register
+#define reg10 register
+#define reg11 register
+#define reg12 register
+#define reg13 register
+#define reg14 register
+#define reg15 register
+#define reg16 register
+#endif
+
+/*
+  Sometimes we want to make sure that the variable is not put into
+  a register in debugging mode so we can see its value in the core
+*/
+
+#ifndef DBUG_OFF
+#define dbug_volatile volatile
+#else
+#define dbug_volatile
+#endif
+
+/* Defines for time function */
+#define SCALE_SEC	100
+#define SCALE_USEC	10000
+#define MY_HOW_OFTEN_TO_ALARM	2	/* How often we want info on screen */
+#define MY_HOW_OFTEN_TO_WRITE	1000	/* How often we want info on screen */
+
+#ifndef set_timespec
+#ifdef HAVE_TIMESPEC_TS_SEC
+#define set_timespec(ABSTIME,SEC) { (ABSTIME).ts_sec=time(0) + (time_t) (SEC); (ABSTIME).ts_nsec=0; }
+#else
+#define set_timespec(ABSTIME,SEC) \
+{\
+  struct timeval tv;\
+  gettimeofday(&tv,0);\
+  (ABSTIME).tv_sec=tv.tv_sec+(time_t) (SEC);\
+  (ABSTIME).tv_nsec=tv.tv_usec*1000;\
+}
+#endif /* HAVE_TIMESPEC_TS_SEC */
+#endif /* set_timespec */
+
+/*
+  Define-funktions for reading and storing in machine independent format
+  (low byte first)
+*/
+
+/* Optimized store functions for Intel x86 */
+#if defined(__i386__) && !defined(_WIN64)
+#define sint2korr(A)	(*((int16 *) (A)))
+#define sint3korr(A)	((int32) ((((uchar) (A)[2]) & 128) ? \
+				  (((uint32) 255L << 24) | \
+				   (((uint32) (uchar) (A)[2]) << 16) |\
+				   (((uint32) (uchar) (A)[1]) << 8) | \
+				   ((uint32) (uchar) (A)[0])) : \
+				  (((uint32) (uchar) (A)[2]) << 16) |\
+				  (((uint32) (uchar) (A)[1]) << 8) | \
+				  ((uint32) (uchar) (A)[0])))
+#define sint4korr(A)	(*((long *) (A)))
+#define uint2korr(A)	(*((uint16 *) (A)))
+#ifdef HAVE_purify
+#define uint3korr(A)	(uint32) (((uint32) ((uchar) (A)[0])) +\
+				  (((uint32) ((uchar) (A)[1])) << 8) +\
+				  (((uint32) ((uchar) (A)[2])) << 16))
+#else
+/*
+   ATTENTION !
+   
+    Please, note, uint3korr reads 4 bytes (not 3) !
+    It means, that you have to provide enough allocated space !
+*/
+#define uint3korr(A)	(long) (*((unsigned int *) (A)) & 0xFFFFFF)
+#endif
+#define uint4korr(A)	(*((unsigned long *) (A)))
+#define uint5korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+				    (((uint32) ((uchar) (A)[1])) << 8) +\
+				    (((uint32) ((uchar) (A)[2])) << 16) +\
+				    (((uint32) ((uchar) (A)[3])) << 24)) +\
+				    (((ulonglong) ((uchar) (A)[4])) << 32))
+#define uint8korr(A)	(*((ulonglong *) (A)))
+#define sint8korr(A)	(*((longlong *) (A)))
+#define int2store(T,A)	*((uint16*) (T))= (uint16) (A)
+#define int3store(T,A)  do { *(T)=  (uchar) ((A));\
+                            *(T+1)=(uchar) (((uint) (A) >> 8));\
+                            *(T+2)=(uchar) (((A) >> 16)); } while (0)
+#define int4store(T,A)	*((long *) (T))= (long) (A)
+#define int5store(T,A)  do { *(T)= (uchar)((A));\
+                             *((T)+1)=(uchar) (((A) >> 8));\
+                             *((T)+2)=(uchar) (((A) >> 16));\
+                             *((T)+3)=(uchar) (((A) >> 24)); \
+                             *((T)+4)=(uchar) (((A) >> 32)); } while(0)
+#define int8store(T,A)	*((ulonglong *) (T))= (ulonglong) (A)
+
+typedef union {
+  double v;
+  long m[2];
+} doubleget_union;
+#define doubleget(V,M)	\
+do { doubleget_union _tmp; \
+     _tmp.m[0] = *((long*)(M)); \
+     _tmp.m[1] = *(((long*) (M))+1); \
+     (V) = _tmp.v; } while(0)
+#define doublestore(T,V) do { *((long *) T) = ((doubleget_union *)&V)->m[0]; \
+			     *(((long *) T)+1) = ((doubleget_union *)&V)->m[1]; \
+                         } while (0)
+#define float4get(V,M) do { *((long *) &(V)) = *((long*) (M)); } while(0)
+#define float8get(V,M) doubleget((V),(M))
+#define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float))
+#define floatstore(T,V) memcpy((byte*)(T), (byte*)(&V), sizeof(float))
+#define float8store(V,M) doublestore((V),(M))
+#endif /* __i386__ */
+
+#ifndef sint2korr
+/*
+  We're here if it's not a IA-32 architecture (Win32 and UNIX IA-32 defines
+  were done before)
+*/
+#define sint2korr(A)	(int16) (((int16) ((uchar) (A)[0])) +\
+				 ((int16) ((int16) (A)[1]) << 8))
+#define sint3korr(A)	((int32) ((((uchar) (A)[2]) & 128) ? \
+				  (((uint32) 255L << 24) | \
+				   (((uint32) (uchar) (A)[2]) << 16) |\
+				   (((uint32) (uchar) (A)[1]) << 8) | \
+				   ((uint32) (uchar) (A)[0])) : \
+				  (((uint32) (uchar) (A)[2]) << 16) |\
+				  (((uint32) (uchar) (A)[1]) << 8) | \
+				  ((uint32) (uchar) (A)[0])))
+#define sint4korr(A)	(int32) (((int32) ((uchar) (A)[0])) +\
+				(((int32) ((uchar) (A)[1]) << 8)) +\
+				(((int32) ((uchar) (A)[2]) << 16)) +\
+				(((int32) ((int16) (A)[3]) << 24)))
+#define sint8korr(A)	(longlong) uint8korr(A)
+#define uint2korr(A)	(uint16) (((uint16) ((uchar) (A)[0])) +\
+				  ((uint16) ((uchar) (A)[1]) << 8))
+#define uint3korr(A)	(uint32) (((uint32) ((uchar) (A)[0])) +\
+				  (((uint32) ((uchar) (A)[1])) << 8) +\
+				  (((uint32) ((uchar) (A)[2])) << 16))
+#define uint4korr(A)	(uint32) (((uint32) ((uchar) (A)[0])) +\
+				  (((uint32) ((uchar) (A)[1])) << 8) +\
+				  (((uint32) ((uchar) (A)[2])) << 16) +\
+				  (((uint32) ((uchar) (A)[3])) << 24))
+#define uint5korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+				    (((uint32) ((uchar) (A)[1])) << 8) +\
+				    (((uint32) ((uchar) (A)[2])) << 16) +\
+				    (((uint32) ((uchar) (A)[3])) << 24)) +\
+				    (((ulonglong) ((uchar) (A)[4])) << 32))
+#define uint8korr(A)	((ulonglong)(((uint32) ((uchar) (A)[0])) +\
+				    (((uint32) ((uchar) (A)[1])) << 8) +\
+				    (((uint32) ((uchar) (A)[2])) << 16) +\
+				    (((uint32) ((uchar) (A)[3])) << 24)) +\
+			(((ulonglong) (((uint32) ((uchar) (A)[4])) +\
+				    (((uint32) ((uchar) (A)[5])) << 8) +\
+				    (((uint32) ((uchar) (A)[6])) << 16) +\
+				    (((uint32) ((uchar) (A)[7])) << 24))) <<\
+				    32))
+#define int2store(T,A)       do { uint def_temp= (uint) (A) ;\
+                                  *((uchar*) (T))=  (uchar)(def_temp); \
+                                   *((uchar*) (T)+1)=(uchar)((def_temp >> 8)); \
+                             } while(0)
+#define int3store(T,A)       do { /*lint -save -e734 */\
+                                  *((uchar*)(T))=(uchar) ((A));\
+                                  *((uchar*) (T)+1)=(uchar) (((A) >> 8));\
+                                  *((uchar*)(T)+2)=(uchar) (((A) >> 16)); \
+                                  /*lint -restore */} while(0)
+#define int4store(T,A)       do { *((char *)(T))=(char) ((A));\
+                                  *(((char *)(T))+1)=(char) (((A) >> 8));\
+                                  *(((char *)(T))+2)=(char) (((A) >> 16));\
+                                  *(((char *)(T))+3)=(char) (((A) >> 24)); } while(0)
+#define int5store(T,A)       do { *((char *)(T))=((A));\
+                                  *(((char *)(T))+1)=(((A) >> 8));\
+                                  *(((char *)(T))+2)=(((A) >> 16));\
+                                  *(((char *)(T))+3)=(((A) >> 24)); \
+                                  *(((char *)(T))+4)=(((A) >> 32)); } while(0)
+#define int8store(T,A)       do { uint def_temp= (uint) (A), def_temp2= (uint) ((A) >> 32); \
+                                  int4store((T),def_temp); \
+                                  int4store((T+4),def_temp2); } while(0)
+#ifdef WORDS_BIGENDIAN
+#define float4store(T,A) do { *(T)= ((byte *) &A)[3];\
+                              *((T)+1)=(char) ((byte *) &A)[2];\
+                              *((T)+2)=(char) ((byte *) &A)[1];\
+                              *((T)+3)=(char) ((byte *) &A)[0]; } while(0)
+
+#define float4get(V,M)   do { float def_temp;\
+                              ((byte*) &def_temp)[0]=(M)[3];\
+                              ((byte*) &def_temp)[1]=(M)[2];\
+                              ((byte*) &def_temp)[2]=(M)[1];\
+                              ((byte*) &def_temp)[3]=(M)[0];\
+                              (V)=def_temp; } while(0)
+#define float8store(T,V) do { *(T)= ((byte *) &V)[7];\
+                              *((T)+1)=(char) ((byte *) &V)[6];\
+                              *((T)+2)=(char) ((byte *) &V)[5];\
+                              *((T)+3)=(char) ((byte *) &V)[4];\
+                              *((T)+4)=(char) ((byte *) &V)[3];\
+                              *((T)+5)=(char) ((byte *) &V)[2];\
+                              *((T)+6)=(char) ((byte *) &V)[1];\
+                              *((T)+7)=(char) ((byte *) &V)[0]; } while(0)
+
+#define float8get(V,M)   do { double def_temp;\
+                              ((byte*) &def_temp)[0]=(M)[7];\
+                              ((byte*) &def_temp)[1]=(M)[6];\
+                              ((byte*) &def_temp)[2]=(M)[5];\
+                              ((byte*) &def_temp)[3]=(M)[4];\
+                              ((byte*) &def_temp)[4]=(M)[3];\
+                              ((byte*) &def_temp)[5]=(M)[2];\
+                              ((byte*) &def_temp)[6]=(M)[1];\
+                              ((byte*) &def_temp)[7]=(M)[0];\
+                              (V) = def_temp; } while(0)
+#else
+#define float4get(V,M)   memcpy_fixed((byte*) &V,(byte*) (M),sizeof(float))
+#define float4store(V,M) memcpy_fixed((byte*) V,(byte*) (&M),sizeof(float))
+
+#if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN)
+#define doublestore(T,V) do { *(T)= ((byte *) &V)[4];\
+                              *(((char*)T)+1)=(char) ((byte *) &V)[5];\
+                              *(((char*)T)+2)=(char) ((byte *) &V)[6];\
+                              *(((char*)T)+3)=(char) ((byte *) &V)[7];\
+                              *(((char*)T)+4)=(char) ((byte *) &V)[0];\
+                              *(((char*)T)+5)=(char) ((byte *) &V)[1];\
+                              *(((char*)T)+6)=(char) ((byte *) &V)[2];\
+                              *(((char*)T)+7)=(char) ((byte *) &V)[3]; }\
+                         while(0)
+#define doubleget(V,M)   do { double def_temp;\
+                              ((byte*) &def_temp)[0]=(M)[4];\
+                              ((byte*) &def_temp)[1]=(M)[5];\
+                              ((byte*) &def_temp)[2]=(M)[6];\
+                              ((byte*) &def_temp)[3]=(M)[7];\
+                              ((byte*) &def_temp)[4]=(M)[0];\
+                              ((byte*) &def_temp)[5]=(M)[1];\
+                              ((byte*) &def_temp)[6]=(M)[2];\
+                              ((byte*) &def_temp)[7]=(M)[3];\
+                              (V) = def_temp; } while(0)
+#endif /* __FLOAT_WORD_ORDER */
+
+#define float8get(V,M)   doubleget((V),(M))
+#define float8store(V,M) doublestore((V),(M))
+#endif /* WORDS_BIGENDIAN */
+
+#endif /* sint2korr */
+
+/*
+  Macro for reading 32-bit integer from network byte order (big-endian)
+  from unaligned memory location.
+*/
+#define int4net(A)        (int32) (((uint32) ((uchar) (A)[3]))        |\
+				  (((uint32) ((uchar) (A)[2])) << 8)  |\
+				  (((uint32) ((uchar) (A)[1])) << 16) |\
+				  (((uint32) ((uchar) (A)[0])) << 24))
+/*
+  Define-funktions for reading and storing in machine format from/to
+  short/long to/from some place in memory V should be a (not
+  register) variable, M is a pointer to byte
+*/
+
+#ifdef WORDS_BIGENDIAN
+
+#define ushortget(V,M)  do { V = (uint16) (((uint16) ((uchar) (M)[1]))+\
+                                 ((uint16) ((uint16) (M)[0]) << 8)); } while(0)
+#define shortget(V,M)   do { V = (short) (((short) ((uchar) (M)[1]))+\
+                                 ((short) ((short) (M)[0]) << 8)); } while(0)
+#define longget(V,M)    do { int32 def_temp;\
+                             ((byte*) &def_temp)[0]=(M)[0];\
+                             ((byte*) &def_temp)[1]=(M)[1];\
+                             ((byte*) &def_temp)[2]=(M)[2];\
+                             ((byte*) &def_temp)[3]=(M)[3];\
+                             (V)=def_temp; } while(0)
+#define ulongget(V,M)   do { uint32 def_temp;\
+                            ((byte*) &def_temp)[0]=(M)[0];\
+                            ((byte*) &def_temp)[1]=(M)[1];\
+                            ((byte*) &def_temp)[2]=(M)[2];\
+                            ((byte*) &def_temp)[3]=(M)[3];\
+                            (V)=def_temp; } while(0)
+#define shortstore(T,A) do { uint def_temp=(uint) (A) ;\
+                             *(((char*)T)+1)=(char)(def_temp); \
+                             *(((char*)T)+0)=(char)(def_temp >> 8); } while(0)
+#define longstore(T,A)  do { *(((char*)T)+3)=((A));\
+                             *(((char*)T)+2)=(((A) >> 8));\
+                             *(((char*)T)+1)=(((A) >> 16));\
+                             *(((char*)T)+0)=(((A) >> 24)); } while(0)
+
+#define floatstore(T,V) memcpy_fixed((byte*)(T), (byte*)(&V), sizeof(float))
+#define doubleget(V,M)	 memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))
+#define doublestore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(double))
+#define longlongget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(ulonglong))
+#define longlongstore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(ulonglong))
+
+#else
+
+#define ushortget(V,M)	do { V = uint2korr(M); } while(0)
+#define shortget(V,M)	do { V = sint2korr(M); } while(0)
+#define longget(V,M)	do { V = sint4korr(M); } while(0)
+#define ulongget(V,M)   do { V = uint4korr(M); } while(0)
+#define shortstore(T,V) int2store(T,V)
+#define longstore(T,V)	int4store(T,V)
+#ifndef floatstore
+#define floatstore(T,V) memcpy_fixed((byte*)(T), (byte*)(&V), sizeof(float))
+#endif
+#ifndef doubleget
+#define doubleget(V,M)	 memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))
+#define doublestore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(double))
+#endif /* doubleget */
+#define longlongget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(ulonglong))
+#define longlongstore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(ulonglong))
+
+#endif /* WORDS_BIGENDIAN */
+
+/* sprintf does not always return the number of bytes :- */
+#ifdef SPRINTF_RETURNS_INT
+#define my_sprintf(buff,args) sprintf args
+#else
+#ifdef SPRINTF_RETURNS_PTR
+#define my_sprintf(buff,args) ((int)(sprintf args - buff))
+#else
+#define my_sprintf(buff,args) ((ulong) sprintf args, (ulong) strlen(buff))
+#endif
+#endif
+
+#ifndef THREAD
+#define thread_safe_increment(V,L) (V)++
+#define thread_safe_add(V,C,L)     (V)+=(C)
+#define thread_safe_sub(V,C,L)     (V)-=(C)
+#define statistic_increment(V,L)   (V)++
+#define statistic_add(V,C,L)       (V)+=(C)
+#endif
+
+#ifdef HAVE_CHARSET_utf8
+#define MYSQL_UNIVERSAL_CLIENT_CHARSET "utf8"
+#else
+#define MYSQL_UNIVERSAL_CLIENT_CHARSET MYSQL_DEFAULT_CHARSET_NAME
+#endif
+
+#if defined(EMBEDDED_LIBRARY) && !defined(HAVE_EMBEDDED_PRIVILEGE_CONTROL)
+#define NO_EMBEDDED_ACCESS_CHECKS
+#endif
+
+#endif /* my_global_h */
diff --git a/src/terralib/drivers/MySQL/include/my_list.h b/src/terralib/drivers/MySQL/include/my_list.h
new file mode 100644
index 0000000..f786621
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_list.h
@@ -0,0 +1,46 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#ifndef _list_h_
+#define _list_h_
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+typedef struct st_list {
+  struct st_list *prev,*next;
+  void *data;
+} LIST;
+
+typedef int (*list_walk_action)(void *,void *);
+
+extern LIST *list_add(LIST *root,LIST *element);
+extern LIST *list_delete(LIST *root,LIST *element);
+extern LIST *list_cons(void *data,LIST *root);
+extern LIST *list_reverse(LIST *root);
+extern void list_free(LIST *root,unsigned int free_data);
+extern unsigned int list_length(LIST *);
+extern int list_walk(LIST *,list_walk_action action,gptr argument);
+
+#define rest(a) ((a)->next)
+#define list_push(a,b) (a)=list_cons((b),(a))
+#define list_pop(A) {LIST *old=(A); (A)=list_delete(old,old) ; my_free((gptr) old,MYF(MY_FAE)); }
+
+#ifdef	__cplusplus
+}
+#endif
+#endif
diff --git a/src/terralib/drivers/MySQL/include/my_pthread.h b/src/terralib/drivers/MySQL/include/my_pthread.h
new file mode 100644
index 0000000..cd0cf49
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_pthread.h
@@ -0,0 +1,700 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Defines to make different thread packages compatible */
+
+#ifndef _my_pthread_h
+#define _my_pthread_h
+
+#include <errno.h>
+#ifndef ETIME
+#define ETIME ETIMEDOUT				/* For FreeBSD */
+#endif
+
+#ifdef  __cplusplus
+extern "C" {
+#endif /* __cplusplus */ 
+
+#if defined(__WIN__) || defined(OS2)
+
+#ifdef OS2
+typedef ULONG     HANDLE;
+typedef ULONG     DWORD;
+typedef int sigset_t;
+#endif
+
+#ifdef OS2
+typedef HMTX             pthread_mutex_t;
+#else
+typedef CRITICAL_SECTION pthread_mutex_t;
+#endif
+typedef HANDLE		 pthread_t;
+typedef struct thread_attr {
+    DWORD dwStackSize ;
+    DWORD dwCreatingFlag ;
+    int priority ;
+} pthread_attr_t ;
+
+typedef struct { int dummy; } pthread_condattr_t;
+
+/* Implementation of posix conditions */
+
+typedef struct st_pthread_link {
+  DWORD thread_id;
+  struct st_pthread_link *next;
+} pthread_link;
+
+typedef struct {
+  uint32 waiting;
+#ifdef OS2
+  HEV    semaphore;
+#else
+  HANDLE semaphore;
+#endif
+} pthread_cond_t;
+
+
+#ifndef OS2
+struct timespec {		/* For pthread_cond_timedwait() */
+    time_t tv_sec;
+    long tv_nsec;
+};
+#endif
+
+typedef int pthread_mutexattr_t;
+#define win_pthread_self my_thread_var->pthread_self
+#ifdef OS2
+#define pthread_handler_decl(A,B) void * _Optlink A(void *B)
+typedef void * (_Optlink *pthread_handler)(void *);
+#else
+#define pthread_handler_decl(A,B) void * __cdecl A(void *B)
+typedef void * (__cdecl *pthread_handler)(void *);
+#endif
+
+void win_pthread_init(void);
+int win_pthread_setspecific(void *A,void *B,uint length);
+int pthread_create(pthread_t *,pthread_attr_t *,pthread_handler,void *);
+int pthread_cond_init(pthread_cond_t *cond, const pthread_condattr_t *attr);
+int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
+int pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+			   struct timespec *abstime);
+int pthread_cond_signal(pthread_cond_t *cond);
+int pthread_cond_broadcast(pthread_cond_t *cond);
+int pthread_cond_destroy(pthread_cond_t *cond);
+int pthread_attr_init(pthread_attr_t *connect_att);
+int pthread_attr_setstacksize(pthread_attr_t *connect_att,DWORD stack);
+int pthread_attr_setprio(pthread_attr_t *connect_att,int priority);
+int pthread_attr_destroy(pthread_attr_t *connect_att);
+struct tm *localtime_r(const time_t *timep,struct tm *tmp);
+struct tm *gmtime_r(const time_t *timep,struct tm *tmp);
+
+
+void pthread_exit(void *a);	 /* was #define pthread_exit(A) ExitThread(A)*/
+
+#ifndef OS2
+#define ETIMEDOUT 145		    /* Win32 doesn't have this */
+#define getpid() GetCurrentThreadId()
+#endif
+#define pthread_self() win_pthread_self
+#define HAVE_LOCALTIME_R		1
+#define _REENTRANT			1
+#define HAVE_PTHREAD_ATTR_SETSTACKSIZE	1
+
+#ifdef USE_TLS					/* For LIBMYSQL.DLL */
+#undef SAFE_MUTEX				/* This will cause conflicts */
+#define pthread_key(T,V)  DWORD V
+#define pthread_key_create(A,B) ((*A=TlsAlloc())==0xFFFFFFFF)
+#define pthread_key_delete(A) TlsFree(A)
+#define pthread_getspecific(A) (TlsGetValue(A))
+#define my_pthread_getspecific(T,A) ((T) TlsGetValue(A))
+#define my_pthread_getspecific_ptr(T,V) ((T) TlsGetValue(V))
+#define my_pthread_setspecific_ptr(T,V) (!TlsSetValue((T),(V)))
+#define pthread_setspecific(A,B) (!TlsSetValue((A),(B)))
+#else
+#define pthread_key(T,V) __declspec(thread) T V
+#define pthread_key_create(A,B) pthread_dummy(0)
+#define pthread_key_delete(A) pthread_dummy(0)
+#define pthread_getspecific(A) (&(A))
+#define my_pthread_getspecific(T,A) (&(A))
+#define my_pthread_getspecific_ptr(T,V) (V)
+#define my_pthread_setspecific_ptr(T,V) ((T)=(V),0)
+#define pthread_setspecific(A,B) win_pthread_setspecific(&(A),(B),sizeof(A))
+#endif /* USE_TLS */
+
+#define pthread_equal(A,B) ((A) == (B))
+#ifdef OS2
+extern int pthread_mutex_init (pthread_mutex_t *, const pthread_mutexattr_t *);
+extern int pthread_mutex_lock (pthread_mutex_t *);
+extern int pthread_mutex_unlock (pthread_mutex_t *);
+extern int pthread_mutex_destroy (pthread_mutex_t *);
+#define my_pthread_setprio(A,B)  DosSetPriority(PRTYS_THREAD,PRTYC_NOCHANGE, B, A)
+#define pthread_kill(A,B) raise(B)
+#define pthread_exit(A) pthread_dummy()
+#else
+#define pthread_mutex_init(A,B)  InitializeCriticalSection(A)
+#define pthread_mutex_lock(A)	 (EnterCriticalSection(A),0)
+#define pthread_mutex_trylock(A) (WaitForSingleObject((A), 0) == WAIT_TIMEOUT)
+#define pthread_mutex_unlock(A)  LeaveCriticalSection(A)
+#define pthread_mutex_destroy(A) DeleteCriticalSection(A)
+#define my_pthread_setprio(A,B)  SetThreadPriority(GetCurrentThread(), (B))
+#define pthread_kill(A,B) pthread_dummy(0)
+#endif /* OS2 */
+
+/* Dummy defines for easier code */
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define my_pthread_attr_setprio(A,B) pthread_attr_setprio(A,B)
+#define pthread_attr_setscope(A,B)
+#define pthread_detach_this_thread()
+#define pthread_condattr_init(A)
+#define pthread_condattr_destroy(A)
+
+/*Irena: compiler does not like this: */
+/*#define my_pthread_getprio(pthread_t thread_id) pthread_dummy(0) */
+#define my_pthread_getprio(thread_id) pthread_dummy(0)
+
+#elif defined(HAVE_UNIXWARE7_THREADS)
+
+#include <thread.h>
+#include <synch.h>
+
+#ifndef _REENTRANT
+#define _REENTRANT
+#endif
+
+#define HAVE_NONPOSIX_SIGWAIT
+#define pthread_t thread_t
+#define pthread_cond_t cond_t
+#define pthread_mutex_t mutex_t
+#define pthread_key_t thread_key_t
+typedef int pthread_attr_t;			/* Needed by Unixware 7.0.0 */
+
+#define pthread_key_create(A,B) thr_keycreate((A),(B))
+#define pthread_key_delete(A) thr_keydelete(A)
+
+#define pthread_handler_decl(A,B) void *A(void *B)
+#define pthread_key(T,V) pthread_key_t V
+
+void *	my_pthread_getspecific_imp(pthread_key_t key);
+#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))
+#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,V)
+
+#define pthread_setspecific(A,B) thr_setspecific(A,B)
+#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,V)
+
+#define pthread_create(A,B,C,D) thr_create(NULL,65536L,(C),(D),THR_DETACHED,(A))
+#define pthread_cond_init(a,b) cond_init((a),USYNC_THREAD,NULL)
+#define pthread_cond_destroy(a) cond_destroy(a)
+#define pthread_cond_signal(a) cond_signal(a)
+#define pthread_cond_wait(a,b) cond_wait((a),(b))
+#define pthread_cond_timedwait(a,b,c) cond_timedwait((a),(b),(c))
+#define pthread_cond_broadcast(a) cond_broadcast(a)
+
+#define pthread_mutex_init(a,b) mutex_init((a),USYNC_THREAD,NULL)
+#define pthread_mutex_lock(a) mutex_lock(a)
+#define pthread_mutex_unlock(a) mutex_unlock(a)
+#define pthread_mutex_destroy(a) mutex_destroy(a)
+
+#define pthread_self() thr_self()
+#define pthread_exit(A) thr_exit(A)
+#define pthread_equal(A,B) (((A) == (B)) ? 1 : 0)
+#define pthread_kill(A,B) thr_kill((A),(B))
+#define HAVE_PTHREAD_KILL
+
+#define pthread_sigmask(A,B,C) thr_sigsetmask((A),(B),(C))
+
+extern int my_sigwait(const sigset_t *set,int *sig);
+
+#define pthread_detach_this_thread() pthread_dummy(0)
+
+#define pthread_attr_init(A) pthread_dummy(0)
+#define pthread_attr_destroy(A) pthread_dummy(0)
+#define pthread_attr_setscope(A,B) pthread_dummy(0)
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define my_pthread_setprio(A,B) pthread_dummy (0)
+#define my_pthread_getprio(A) pthread_dummy (0)
+#define my_pthread_attr_setprio(A,B) pthread_dummy(0)
+
+#else /* Normal threads */
+
+#ifdef HAVE_rts_threads
+#define sigwait org_sigwait
+#include <signal.h>
+#undef sigwait
+#endif
+#include <pthread.h>
+#ifndef _REENTRANT
+#define _REENTRANT
+#endif
+#ifdef HAVE_THR_SETCONCURRENCY
+#include <thread.h>			/* Probably solaris */
+#endif
+#ifdef HAVE_SCHED_H
+#include <sched.h>
+#endif
+#ifdef HAVE_SYNCH_H
+#include <synch.h>
+#endif
+#if defined(__EMX__) && (!defined(EMX_PTHREAD_REV) || (EMX_PTHREAD_REV < 2))
+#error Requires at least rev 2 of EMX pthreads library.
+#endif
+
+#ifdef __NETWARE__
+void my_pthread_exit(void *status);
+#define pthread_exit(A) my_pthread_exit(A)
+#endif
+
+extern int my_pthread_getprio(pthread_t thread_id);
+
+#define pthread_key(T,V) pthread_key_t V
+#define my_pthread_getspecific_ptr(T,V) my_pthread_getspecific(T,(V))
+#define my_pthread_setspecific_ptr(T,V) pthread_setspecific(T,(void*) (V))
+#define pthread_detach_this_thread()
+#define pthread_handler_decl(A,B) void *A(void *B)
+typedef void *(* pthread_handler)(void *);
+
+/* Test first for RTS or FSU threads */
+
+#if defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM)
+#define HAVE_rts_threads
+extern int my_pthread_create_detached;
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#define PTHREAD_CREATE_DETACHED &my_pthread_create_detached
+#define PTHREAD_SCOPE_SYSTEM  PTHREAD_SCOPE_GLOBAL
+#define PTHREAD_SCOPE_PROCESS PTHREAD_SCOPE_LOCAL
+#define USE_ALARM_THREAD
+#elif defined(HAVE_mit_thread)
+#define USE_ALARM_THREAD
+#undef	HAVE_LOCALTIME_R
+#define HAVE_LOCALTIME_R
+#undef	HAVE_GMTIME_R
+#define HAVE_GMTIME_R
+#undef	HAVE_PTHREAD_ATTR_SETSCOPE
+#define HAVE_PTHREAD_ATTR_SETSCOPE
+#undef HAVE_GETHOSTBYNAME_R_GLIBC2_STYLE	/* If we are running linux */
+#undef HAVE_RWLOCK_T
+#undef HAVE_RWLOCK_INIT
+#undef HAVE_PTHREAD_RWLOCK_RDLOCK
+#undef HAVE_SNPRINTF
+
+#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
+#define signal(A,B) pthread_signal((A),(void (*)(int)) (B))
+#define my_pthread_attr_setprio(A,B)
+#endif /* defined(PTHREAD_SCOPE_GLOBAL) && !defined(PTHREAD_SCOPE_SYSTEM) */
+
+#if defined(_BSDI_VERSION) && _BSDI_VERSION < 199910
+int sigwait(sigset_t *set, int *sig);
+#endif
+
+#if defined(HAVE_UNIXWARE7_POSIX)
+#undef HAVE_NONPOSIX_SIGWAIT
+#define HAVE_NONPOSIX_SIGWAIT	/* sigwait takes only 1 argument */
+#endif
+
+#ifndef HAVE_NONPOSIX_SIGWAIT
+#define my_sigwait(A,B) sigwait((A),(B))
+#else
+int my_sigwait(const sigset_t *set,int *sig);
+#endif
+
+#ifdef HAVE_NONPOSIX_PTHREAD_MUTEX_INIT
+#ifndef SAFE_MUTEX
+#define pthread_mutex_init(a,b) my_pthread_mutex_init((a),(b))
+extern int my_pthread_mutex_init(pthread_mutex_t *mp,
+				 const pthread_mutexattr_t *attr);
+#endif /* SAFE_MUTEX */
+#define pthread_cond_init(a,b) my_pthread_cond_init((a),(b))
+extern int my_pthread_cond_init(pthread_cond_t *mp,
+				const pthread_condattr_t *attr);
+#endif /* HAVE_NONPOSIX_PTHREAD_MUTEX_INIT */
+
+#if defined(HAVE_SIGTHREADMASK) && !defined(HAVE_PTHREAD_SIGMASK)
+#define pthread_sigmask(A,B,C) sigthreadmask((A),(B),(C))
+#endif
+
+#if !defined(HAVE_SIGWAIT) && !defined(HAVE_mit_thread) && !defined(HAVE_rts_threads) && !defined(sigwait) && !defined(alpha_linux_port) && !defined(HAVE_NONPOSIX_SIGWAIT) && !defined(HAVE_DEC_3_2_THREADS) && !defined(_AIX)
+int sigwait(sigset_t *setp, int *sigp);		/* Use our implemention */
+#endif
+#if !defined(HAVE_SIGSET) && !defined(HAVE_mit_thread) && !defined(sigset)
+#define sigset(A,B) do { struct sigaction s; sigset_t set;              \
+                         sigemptyset(&set);                             \
+                         s.sa_handler = (B);                            \
+                         s.sa_mask    = set;                            \
+                         s.sa_flags   = 0;                              \
+                         sigaction((A), &s, (struct sigaction *) NULL); \
+                       } while (0)
+#endif
+
+#ifndef my_pthread_setprio
+#if defined(HAVE_PTHREAD_SETPRIO_NP)		/* FSU threads */
+#define my_pthread_setprio(A,B) pthread_setprio_np((A),(B))
+#elif defined(HAVE_PTHREAD_SETPRIO)
+#define my_pthread_setprio(A,B) pthread_setprio((A),(B))
+#else
+extern void my_pthread_setprio(pthread_t thread_id,int prior);
+#endif
+#endif
+
+#ifndef my_pthread_attr_setprio
+#ifdef HAVE_PTHREAD_ATTR_SETPRIO
+#define my_pthread_attr_setprio(A,B) pthread_attr_setprio((A),(B))
+#else
+extern void my_pthread_attr_setprio(pthread_attr_t *attr, int priority);
+#endif
+#endif
+
+#if !defined(HAVE_PTHREAD_ATTR_SETSCOPE) || defined(HAVE_DEC_3_2_THREADS)
+#define pthread_attr_setscope(A,B)
+#undef	HAVE_GETHOSTBYADDR_R			/* No definition */
+#endif
+
+#if defined(HAVE_BROKEN_PTHREAD_COND_TIMEDWAIT) && !defined(SAFE_MUTEX)
+extern int my_pthread_cond_timedwait(pthread_cond_t *cond,
+				     pthread_mutex_t *mutex,
+				     struct timespec *abstime);
+#define pthread_cond_timedwait(A,B,C) my_pthread_cond_timedwait((A),(B),(C))
+#endif
+
+#if defined(OS2)
+#define my_pthread_getspecific(T,A) ((T) &(A))
+#define pthread_setspecific(A,B) win_pthread_setspecific(&(A),(B),sizeof(A))
+#elif !defined( HAVE_NONPOSIX_PTHREAD_GETSPECIFIC)
+#define my_pthread_getspecific(A,B) ((A) pthread_getspecific(B))
+#else
+#define my_pthread_getspecific(A,B) ((A) my_pthread_getspecific_imp(B))
+void *my_pthread_getspecific_imp(pthread_key_t key);
+#endif /* OS2 */
+
+#ifndef HAVE_LOCALTIME_R
+struct tm *localtime_r(const time_t *clock, struct tm *res);
+#endif
+
+#ifndef HAVE_GMTIME_R
+struct tm *gmtime_r(const time_t *clock, struct tm *res);
+#endif
+
+#ifdef HAVE_PTHREAD_CONDATTR_CREATE
+/* DCE threads on HPUX 10.20 */
+#define pthread_condattr_init pthread_condattr_create
+#define pthread_condattr_destroy pthread_condattr_delete
+#endif
+
+/* FSU THREADS */
+#if !defined(HAVE_PTHREAD_KEY_DELETE) && !defined(pthread_key_delete)
+#define pthread_key_delete(A) pthread_dummy(0)
+#endif
+
+#ifdef HAVE_CTHREADS_WRAPPER			/* For MacOSX */
+#define pthread_cond_destroy(A) pthread_dummy(0)
+#define pthread_mutex_destroy(A) pthread_dummy(0)
+#define pthread_attr_delete(A) pthread_dummy(0)
+#define pthread_condattr_delete(A) pthread_dummy(0)
+#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
+#define pthread_equal(A,B) ((A) == (B))
+#define pthread_cond_timedwait(a,b,c) pthread_cond_wait((a),(b))
+#define pthread_attr_init(A) pthread_attr_create(A)
+#define pthread_attr_destroy(A) pthread_attr_delete(A)
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#define pthread_kill(A,B) pthread_dummy(0)
+#undef	pthread_detach_this_thread
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
+#endif
+
+#ifdef HAVE_DARWIN_THREADS
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#define pthread_kill(A,B) pthread_dummy(0)
+#define pthread_condattr_init(A) pthread_dummy(0)
+#define pthread_condattr_destroy(A) pthread_dummy(0)
+#define pthread_signal(A,B) pthread_dummy(0)
+#undef	pthread_detach_this_thread
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
+#undef sigset
+#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
+#endif
+
+#if ((defined(HAVE_PTHREAD_ATTR_CREATE) && !defined(HAVE_SIGWAIT)) || defined(HAVE_DEC_3_2_THREADS)) && !defined(HAVE_CTHREADS_WRAPPER)
+/* This is set on AIX_3_2 and Siemens unix (and DEC OSF/1 3.2 too) */
+#define pthread_key_create(A,B) \
+		pthread_keycreate(A,(B) ?\
+				  (pthread_destructor_t) (B) :\
+				  (pthread_destructor_t) pthread_dummy)
+#define pthread_attr_init(A) pthread_attr_create(A)
+#define pthread_attr_destroy(A) pthread_attr_delete(A)
+#define pthread_attr_setdetachstate(A,B) pthread_dummy(0)
+#define pthread_create(A,B,C,D) pthread_create((A),*(B),(C),(D))
+#ifndef pthread_sigmask
+#define pthread_sigmask(A,B,C) sigprocmask((A),(B),(C))
+#endif
+#define pthread_kill(A,B) pthread_dummy(0)
+#undef	pthread_detach_this_thread
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
+#elif !defined(__NETWARE__) /* HAVE_PTHREAD_ATTR_CREATE && !HAVE_SIGWAIT */
+#define HAVE_PTHREAD_KILL
+#endif
+
+#endif /* defined(__WIN__) */
+
+#if defined(HPUX10) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS)
+#undef pthread_cond_timedwait
+#define pthread_cond_timedwait(a,b,c) my_pthread_cond_timedwait((a),(b),(c))
+int my_pthread_cond_timedwait(pthread_cond_t *cond, pthread_mutex_t *mutex,
+			      struct timespec *abstime);
+#endif
+
+#if defined(HPUX10)
+#define pthread_attr_getstacksize(A,B) my_pthread_attr_getstacksize(A,B)
+void my_pthread_attr_getstacksize(pthread_attr_t *attrib, size_t *size);
+#endif
+
+#if defined(HAVE_POSIX1003_4a_MUTEX) && !defined(DONT_REMAP_PTHREAD_FUNCTIONS)
+#undef pthread_mutex_trylock
+#define pthread_mutex_trylock(a) my_pthread_mutex_trylock((a))
+int my_pthread_mutex_trylock(pthread_mutex_t *mutex);
+#endif
+
+	/* safe_mutex adds checking to mutex for easier debugging */
+
+#if defined(__NETWARE__) && !defined(SAFE_MUTEX_DETECT_DESTROY)
+#define SAFE_MUTEX_DETECT_DESTROY
+#endif
+
+typedef struct st_safe_mutex_t
+{
+  pthread_mutex_t global,mutex;
+  const char *file;
+  uint line,count;
+  pthread_t thread;
+#ifdef SAFE_MUTEX_DETECT_DESTROY
+  struct st_safe_mutex_info_t *info;	/* to track destroying of mutexes */
+#endif
+} safe_mutex_t;
+
+#ifdef SAFE_MUTEX_DETECT_DESTROY
+/*
+  Used to track the destroying of mutexes. This needs to be a seperate
+  structure because the safe_mutex_t structure could be freed before
+  the mutexes are destroyed.
+*/
+
+typedef struct st_safe_mutex_info_t
+{
+  struct st_safe_mutex_info_t *next;
+  struct st_safe_mutex_info_t *prev;
+  const char *init_file;
+  uint32 init_line;
+} safe_mutex_info_t;
+#endif /* SAFE_MUTEX_DETECT_DESTROY */
+
+int safe_mutex_init(safe_mutex_t *mp, const pthread_mutexattr_t *attr,
+                    const char *file, uint line);
+int safe_mutex_lock(safe_mutex_t *mp,const char *file, uint line);
+int safe_mutex_unlock(safe_mutex_t *mp,const char *file, uint line);
+int safe_mutex_destroy(safe_mutex_t *mp,const char *file, uint line);
+int safe_cond_wait(pthread_cond_t *cond, safe_mutex_t *mp,const char *file,
+		   uint line);
+int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp,
+			struct timespec *abstime, const char *file, uint line);
+void safe_mutex_global_init(void);
+void safe_mutex_end(FILE *file);
+
+	/* Wrappers if safe mutex is actually used */
+#ifdef SAFE_MUTEX
+#undef pthread_mutex_init
+#undef pthread_mutex_lock
+#undef pthread_mutex_unlock
+#undef pthread_mutex_destroy
+#undef pthread_mutex_wait
+#undef pthread_mutex_timedwait
+#undef pthread_mutex_t
+#undef pthread_cond_wait
+#undef pthread_cond_timedwait
+#undef pthread_mutex_trylock
+#define pthread_mutex_init(A,B) safe_mutex_init((A),(B),__FILE__,__LINE__)
+#define pthread_mutex_lock(A) safe_mutex_lock((A),__FILE__,__LINE__)
+#define pthread_mutex_unlock(A) safe_mutex_unlock((A),__FILE__,__LINE__)
+#define pthread_mutex_destroy(A) safe_mutex_destroy((A),__FILE__,__LINE__)
+#define pthread_cond_wait(A,B) safe_cond_wait((A),(B),__FILE__,__LINE__)
+#define pthread_cond_timedwait(A,B,C) safe_cond_timedwait((A),(B),(C),__FILE__,__LINE__)
+#define pthread_mutex_trylock(A) pthread_mutex_lock(A)
+#define pthread_mutex_t safe_mutex_t
+#define safe_mutex_assert_owner(mp) DBUG_ASSERT((mp)->count > 0 && pthread_equal(pthread_self(),(mp)->thread))
+#else
+#define safe_mutex_assert_owner(mp)
+#endif /* SAFE_MUTEX */
+
+	/* READ-WRITE thread locking */
+
+#ifdef HAVE_BROKEN_RWLOCK			/* For OpenUnix */
+#undef HAVE_PTHREAD_RWLOCK_RDLOCK
+#undef HAVE_RWLOCK_INIT
+#undef HAVE_RWLOCK_T
+#endif
+
+#if defined(USE_MUTEX_INSTEAD_OF_RW_LOCKS)
+/* use these defs for simple mutex locking */
+#define rw_lock_t pthread_mutex_t
+#define my_rwlock_init(A,B) pthread_mutex_init((A),(B))
+#define rw_rdlock(A) pthread_mutex_lock((A))
+#define rw_wrlock(A) pthread_mutex_lock((A))
+#define rw_tryrdlock(A) pthread_mutex_trylock((A))
+#define rw_trywrlock(A) pthread_mutex_trylock((A))
+#define rw_unlock(A) pthread_mutex_unlock((A))
+#define rwlock_destroy(A) pthread_mutex_destroy((A))
+#elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK)
+#define rw_lock_t pthread_rwlock_t
+#define my_rwlock_init(A,B) pthread_rwlock_init((A),(B))
+#define rw_rdlock(A) pthread_rwlock_rdlock(A)
+#define rw_wrlock(A) pthread_rwlock_wrlock(A)
+#define rw_tryrdlock(A) pthread_rwlock_tryrdlock((A))
+#define rw_trywrlock(A) pthread_rwlock_trywrlock((A))
+#define rw_unlock(A) pthread_rwlock_unlock(A)
+#define rwlock_destroy(A) pthread_rwlock_destroy(A)
+#elif defined(HAVE_RWLOCK_INIT)
+#ifdef HAVE_RWLOCK_T				/* For example Solaris 2.6-> */
+#define rw_lock_t rwlock_t
+#endif
+#define my_rwlock_init(A,B) rwlock_init((A),USYNC_THREAD,0)
+#else
+/* Use our own version of read/write locks */
+typedef struct _my_rw_lock_t {
+	pthread_mutex_t lock;		/* lock for structure		*/
+	pthread_cond_t	readers;	/* waiting readers		*/
+	pthread_cond_t	writers;	/* waiting writers		*/
+	int		state;		/* -1:writer,0:free,>0:readers	*/
+	int		waiters;	/* number of waiting writers	*/
+} my_rw_lock_t;
+
+#define rw_lock_t my_rw_lock_t
+#define rw_rdlock(A) my_rw_rdlock((A))
+#define rw_wrlock(A) my_rw_wrlock((A))
+#define rw_tryrdlock(A) my_rw_tryrdlock((A))
+#define rw_trywrlock(A) my_rw_trywrlock((A))
+#define rw_unlock(A) my_rw_unlock((A))
+#define rwlock_destroy(A) my_rwlock_destroy((A))
+
+extern int my_rwlock_init(my_rw_lock_t *, void *);
+extern int my_rwlock_destroy(my_rw_lock_t *);
+extern int my_rw_rdlock(my_rw_lock_t *);
+extern int my_rw_wrlock(my_rw_lock_t *);
+extern int my_rw_unlock(my_rw_lock_t *);
+extern int my_rw_tryrdlock(my_rw_lock_t *);
+extern int my_rw_trywrlock(my_rw_lock_t *);
+#endif /* USE_MUTEX_INSTEAD_OF_RW_LOCKS */
+
+#define GETHOSTBYADDR_BUFF_SIZE 2048
+
+#ifndef HAVE_THR_SETCONCURRENCY
+#define thr_setconcurrency(A) pthread_dummy(0)
+#endif
+#if !defined(HAVE_PTHREAD_ATTR_SETSTACKSIZE) && ! defined(pthread_attr_setstacksize)
+#define pthread_attr_setstacksize(A,B) pthread_dummy(0)
+#endif
+
+/* Define mutex types */
+#define MY_MUTEX_INIT_SLOW   NULL
+#define MY_MUTEX_INIT_FAST   NULL
+#define MY_MUTEX_INIT_ERRCHK NULL
+#ifdef PTHREAD_ADAPTIVE_MUTEX_INITIALIZER_NP
+extern pthread_mutexattr_t my_fast_mutexattr;
+#undef  MY_MUTEX_INIT_FAST
+#define MY_MUTEX_INIT_FAST &my_fast_mutexattr
+#endif
+#ifdef PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP
+extern pthread_mutexattr_t my_errchk_mutexattr;
+#undef MY_INIT_MUTEX_ERRCHK
+#define MY_INIT_MUTEX_ERRCHK &my_errchk_mutexattr
+#endif
+
+extern my_bool my_thread_global_init(void);
+extern void my_thread_global_end(void);
+extern my_bool my_thread_init(void);
+extern void my_thread_end(void);
+extern const char *my_thread_name(void);
+extern long my_thread_id(void);
+extern int pthread_no_free(void *);
+extern int pthread_dummy(int);
+
+/* All thread specific variables are in the following struct */
+
+#define THREAD_NAME_SIZE 10
+#if defined(__ia64__)
+/*
+  MySQL can survive with 32K, but some glibc libraries require > 128K stack
+  To resolve hostnames
+*/
+#define DEFAULT_THREAD_STACK	(192*1024L)
+#else
+#define DEFAULT_THREAD_STACK	(192*1024)
+#endif
+
+struct st_my_thread_var
+{
+  int thr_errno;
+  pthread_cond_t suspend;
+  pthread_mutex_t mutex;
+  pthread_mutex_t * volatile current_mutex;
+  pthread_cond_t * volatile current_cond;
+  pthread_t pthread_self;
+  long id;
+  int cmp_length;
+  int volatile abort;
+  my_bool init;
+  struct st_my_thread_var *next,**prev;
+  void *opt_info;
+#ifndef DBUG_OFF
+  gptr dbug;
+  char name[THREAD_NAME_SIZE+1];
+#endif
+};
+
+extern struct st_my_thread_var *_my_thread_var(void) __attribute__ ((const));
+#define my_thread_var (_my_thread_var())
+#define my_errno my_thread_var->thr_errno
+/*
+  Keep track of shutdown,signal, and main threads so that my_end() will not
+  report errors with them
+*/
+extern pthread_t shutdown_th, main_th, signal_th;
+
+	/* statistics_xxx functions are for not essential statistic */
+
+#ifndef thread_safe_increment
+#ifdef HAVE_ATOMIC_ADD
+#define thread_safe_increment(V,L) atomic_add(1,(atomic_t*) &V);
+#define thread_safe_add(V,C,L)     atomic_add((C),(atomic_t*) &V);
+#define thread_safe_sub(V,C,L)     atomic_sub((C),(atomic_t*) &V);
+#else
+#define thread_safe_increment(V,L) \
+	pthread_mutex_lock((L)); (V)++; pthread_mutex_unlock((L));
+#define thread_safe_add(V,C,L) \
+	pthread_mutex_lock((L)); (V)+=(C); pthread_mutex_unlock((L));
+#define thread_safe_sub(V,C,L) \
+	pthread_mutex_lock((L)); (V)-=(C); pthread_mutex_unlock((L));
+#endif /* HAVE_ATOMIC_ADD */
+#ifdef SAFE_STATISTICS
+#define statistic_increment(V,L)   thread_safe_increment((V),(L))
+#define statistic_add(V,C,L)       thread_safe_add((V),(C),(L))
+#else
+#define statistic_increment(V,L) (V)++
+#define statistic_add(V,C,L)     (V)+=(C)
+#endif /* SAFE_STATISTICS */
+#endif /* thread_safe_increment */
+
+#ifdef  __cplusplus
+}
+#endif
+#endif /* _my_ptread_h */
diff --git a/src/terralib/drivers/MySQL/include/my_sys.h b/src/terralib/drivers/MySQL/include/my_sys.h
new file mode 100644
index 0000000..01a7482
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/my_sys.h
@@ -0,0 +1,785 @@
+/* Copyright (C) 2000-2003 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#ifndef _my_sys_h
+#define _my_sys_h
+C_MODE_START
+
+#ifdef HAVE_AIOWAIT
+#include <sys/asynch.h>			/* Used by record-cache */
+typedef struct my_aio_result {
+  aio_result_t result;
+  int	       pending;
+} my_aio_result;
+#endif
+
+#ifndef THREAD
+extern int NEAR my_errno;		/* Last error in mysys */
+#else
+#include <my_pthread.h>
+#endif
+
+#ifndef _m_ctype_h
+#include <m_ctype.h>                    /* for CHARSET_INFO */
+#endif
+
+#include <stdarg.h>
+#include <typelib.h>
+
+#define MYSYS_PROGRAM_USES_CURSES()  { error_handler_hook = my_message_curses;	mysys_uses_curses=1; }
+#define MYSYS_PROGRAM_DONT_USE_CURSES()  { error_handler_hook = my_message_no_curses; mysys_uses_curses=0;}
+#define MY_INIT(name);		{ my_progname= name; my_init(); }
+
+#define MAXMAPS		(4)	/* Number of error message maps */
+#define ERRMOD		(1000)	/* Max number of errors in a map */
+#define ERRMSGSIZE	(SC_MAXWIDTH)	/* Max length of a error message */
+#define NRERRBUFFS	(2)	/* Buffers for parameters */
+#define MY_FILE_ERROR	((uint) ~0)
+
+	/* General bitmaps for my_func's */
+#define MY_FFNF		1	/* Fatal if file not found */
+#define MY_FNABP	2	/* Fatal if not all bytes read/writen */
+#define MY_NABP		4	/* Error if not all bytes read/writen */
+#define MY_FAE		8	/* Fatal if any error */
+#define MY_WME		16	/* Write message on error */
+#define MY_WAIT_IF_FULL 32	/* Wait and try again if disk full error */
+#define MY_RAID         64      /* Support for RAID (not the "Johnson&Johnson"-s one ;) */
+#define MY_FULL_IO     512      /* For my_read - loop intil I/O
+				   is complete
+				*/
+#define MY_DONT_CHECK_FILESIZE 128	/* Option to init_io_cache() */
+#define MY_LINK_WARNING 32	/* my_redel() gives warning if links */
+#define MY_COPYTIME	64	/* my_redel() copys time */
+#define MY_DELETE_OLD	256	/* my_create_with_symlink() */
+#define MY_RESOLVE_LINK 128	/* my_realpath(); Only resolve links */
+#define MY_HOLD_ORIGINAL_MODES 128  /* my_copy() holds to file modes */
+#define MY_REDEL_MAKE_BACKUP 256
+#define MY_SEEK_NOT_DONE 32	/* my_lock may have to do a seek */
+#define MY_DONT_WAIT	64	/* my_lock() don't wait if can't lock */
+#define MY_ZEROFILL	32	/* my_malloc(), fill array with zero */
+#define MY_ALLOW_ZERO_PTR 64	/* my_realloc() ; zero ptr -> malloc */
+#define MY_FREE_ON_ERROR 128	/* my_realloc() ; Free old ptr on error */
+#define MY_HOLD_ON_ERROR 256	/* my_realloc() ; Return old ptr on error */
+#define MY_THREADSAFE	128	/* pread/pwrite:  Don't allow interrupts */
+#define MY_DONT_OVERWRITE_FILE 1024	/* my_copy; Don't overwrite file */
+
+#define MY_CHECK_ERROR	1	/* Params to my_end; Check open-close */
+#define MY_GIVE_INFO	2	/* Give time info about process*/
+
+#define ME_HIGHBYTE	8	/* Shift for colours */
+#define ME_NOCUR	1	/* Don't use curses message */
+#define ME_OLDWIN	2	/* Use old window */
+#define ME_BELL		4	/* Ring bell then printing message */
+#define ME_HOLDTANG	8	/* Don't delete last keys */
+#define ME_WAITTOT	16	/* Wait for errtime secs of for a action */
+#define ME_WAITTANG	32	/* Wait for a user action  */
+#define ME_NOREFRESH	64	/* Dont refresh screen */
+#define ME_NOINPUT	128	/* Dont use the input libary */
+#define ME_COLOUR1	((1 << ME_HIGHBYTE))	/* Possibly error-colours */
+#define ME_COLOUR2	((2 << ME_HIGHBYTE))
+#define ME_COLOUR3	((3 << ME_HIGHBYTE))
+
+	/* Bits in last argument to fn_format */
+#define MY_REPLACE_DIR		1	/* replace dir in name with 'dir' */
+#define MY_REPLACE_EXT		2	/* replace extension with 'ext' */
+#define MY_UNPACK_FILENAME	4	/* Unpack name (~ -> home) */
+#define MY_PACK_FILENAME	8	/* Pack name (home -> ~) */
+#define MY_RESOLVE_SYMLINKS	16	/* Resolve all symbolic links */
+#define MY_RETURN_REAL_PATH	32	/* return full path for file */
+#define MY_SAFE_PATH		64	/* Return NULL if too long path */
+#define MY_RELATIVE_PATH	128	/* name is relative to 'dir' */
+
+	/* My seek flags */
+#define MY_SEEK_SET	0
+#define MY_SEEK_CUR	1
+#define MY_SEEK_END	2
+
+	/* Some constants */
+#define MY_WAIT_FOR_USER_TO_FIX_PANIC	60	/* in seconds */
+#define MY_WAIT_GIVE_USER_A_MESSAGE	10	/* Every 10 times of prev */
+#define MIN_COMPRESS_LENGTH		50	/* Don't compress small bl. */
+#define DFLT_INIT_HITS  3
+
+	/* root_alloc flags */
+#define MY_KEEP_PREALLOC	1
+#define MY_MARK_BLOCKS_FREE     2  /* move used to free list and reuse them */
+
+	/* Internal error numbers (for assembler functions) */
+#define MY_ERRNO_EDOM		33
+#define MY_ERRNO_ERANGE		34
+
+	/* defines when allocating data */
+#ifdef SAFEMALLOC
+#define my_malloc(SZ,FLAG) _mymalloc((SZ), __FILE__, __LINE__, FLAG )
+#define my_malloc_ci(SZ,FLAG) _mymalloc((SZ), sFile, uLine, FLAG )
+#define my_realloc(PTR,SZ,FLAG) _myrealloc((PTR), (SZ), __FILE__, __LINE__, FLAG )
+#define my_checkmalloc() _sanity( __FILE__, __LINE__ )
+#define my_free(PTR,FLAG) _myfree((PTR), __FILE__, __LINE__,FLAG)
+#define my_memdup(A,B,C) _my_memdup((A),(B), __FILE__,__LINE__,C)
+#define my_strdup(A,C) _my_strdup((A), __FILE__,__LINE__,C)
+#define my_strdup_with_length(A,B,C) _my_strdup_with_length((A),(B),__FILE__,__LINE__,C)
+#define QUICK_SAFEMALLOC sf_malloc_quick=1
+#define NORMAL_SAFEMALLOC sf_malloc_quick=0
+extern uint sf_malloc_prehunc,sf_malloc_endhunc,sf_malloc_quick;
+extern ulonglong sf_malloc_mem_limit;
+
+#define CALLER_INFO_PROTO   , const char *sFile, uint uLine
+#define CALLER_INFO         , __FILE__, __LINE__
+#define ORIG_CALLER_INFO    , sFile, uLine
+#else
+#define my_checkmalloc()
+#undef TERMINATE
+#define TERMINATE(A) {}
+#define QUICK_SAFEMALLOC
+#define NORMAL_SAFEMALLOC
+extern gptr my_malloc(uint Size,myf MyFlags);
+#define my_malloc_ci(SZ,FLAG) my_malloc( SZ, FLAG )
+extern gptr my_realloc(gptr oldpoint,uint Size,myf MyFlags);
+extern void my_no_flags_free(gptr ptr);
+extern gptr my_memdup(const byte *from,uint length,myf MyFlags);
+extern char *my_strdup(const char *from,myf MyFlags);
+extern char *my_strdup_with_length(const byte *from, uint length,
+				   myf MyFlags);
+#define my_free(PTR,FG) my_no_flags_free(PTR)
+#define CALLER_INFO_PROTO   /* nothing */
+#define CALLER_INFO         /* nothing */
+#define ORIG_CALLER_INFO    /* nothing */
+#endif
+
+#ifdef HAVE_ALLOCA
+#if defined(_AIX) && !defined(__GNUC__) && !defined(_AIX43)
+#pragma alloca
+#endif /* _AIX */
+#if defined(__GNUC__) && !defined(HAVE_ALLOCA_H) && ! defined(alloca)
+#define alloca __builtin_alloca
+#endif /* GNUC */
+#define my_alloca(SZ) alloca((size_t) (SZ))
+#define my_afree(PTR) {}
+#else
+#define my_alloca(SZ) my_malloc(SZ,MYF(0))
+#define my_afree(PTR) my_free(PTR,MYF(MY_WME))
+#endif /* HAVE_ALLOCA */
+
+#ifdef MSDOS
+#ifdef __ZTC__
+void * __CDECL halloc(long count,size_t length);
+void   __CDECL hfree(void *ptr);
+#endif
+#if defined(USE_HALLOC)
+#if defined(_VCM_) || defined(M_IC80386)
+#undef USE_HALLOC
+#endif
+#endif
+#ifdef USE_HALLOC
+#define malloc(a) halloc((long) (a),1)
+#define free(a) hfree(a)
+#endif
+#endif /* MSDOS */
+
+#ifdef HAVE_ERRNO_AS_DEFINE
+#include <errno.h>			/* errno is a define */
+#else
+extern int errno;			/* declare errno */
+#endif
+extern const char ** NEAR my_errmsg[];
+extern char NEAR errbuff[NRERRBUFFS][ERRMSGSIZE];
+extern char *home_dir;			/* Home directory for user */
+extern char *my_progname;		/* program-name (printed in errors) */
+extern char NEAR curr_dir[];		/* Current directory for user */
+extern int (*error_handler_hook)(uint my_err, const char *str,myf MyFlags);
+extern int (*fatal_error_handler_hook)(uint my_err, const char *str,
+				       myf MyFlags);
+extern uint my_file_limit;
+
+/* charsets */
+extern CHARSET_INFO *default_charset_info;
+extern CHARSET_INFO *all_charsets[256];
+extern CHARSET_INFO compiled_charsets[];
+
+/* statistics */
+extern ulong	my_cache_w_requests, my_cache_write, my_cache_r_requests,
+		my_cache_read;
+extern ulong	my_blocks_used, my_blocks_changed;
+extern ulong	my_file_opened,my_stream_opened, my_tmp_file_created;
+extern my_bool	my_init_done;
+
+					/* Point to current my_message() */
+extern void (*my_sigtstp_cleanup)(void),
+					/* Executed before jump to shell */
+	    (*my_sigtstp_restart)(void),
+	    (*my_abort_hook)(int);
+					/* Executed when comming from shell */
+extern int NEAR my_umask,		/* Default creation mask  */
+	   NEAR my_umask_dir,
+	   NEAR my_recived_signals,	/* Signals we have got */
+	   NEAR my_safe_to_handle_signal, /* Set when allowed to SIGTSTP */
+	   NEAR my_dont_interrupt;	/* call remember_intr when set */
+extern my_bool NEAR mysys_uses_curses, my_use_symdir;
+extern ulong sf_malloc_cur_memory, sf_malloc_max_memory;
+
+extern ulong	my_default_record_cache_size;
+extern my_bool NEAR my_disable_locking,NEAR my_disable_async_io,
+               NEAR my_disable_flush_key_blocks, NEAR my_disable_symlinks;
+extern char	wild_many,wild_one,wild_prefix;
+extern const char *charsets_dir;
+extern char *defaults_extra_file;
+
+typedef struct wild_file_pack	/* Struct to hold info when selecting files */
+{
+  uint		wilds;		/* How many wildcards */
+  uint		not_pos;	/* Start of not-theese-files */
+  my_string	*wild;		/* Pointer to wildcards */
+} WF_PACK;
+
+enum loglevel {
+   ERROR_LEVEL,
+   WARNING_LEVEL,
+   INFORMATION_LEVEL
+};
+
+enum cache_type
+{
+  READ_CACHE,WRITE_CACHE,
+  SEQ_READ_APPEND		/* sequential read or append */,
+  READ_FIFO, READ_NET,WRITE_NET};
+
+enum flush_type
+{
+  FLUSH_KEEP, FLUSH_RELEASE, FLUSH_IGNORE_CHANGED, FLUSH_FORCE_WRITE
+};
+
+typedef struct st_record_cache	/* Used when cacheing records */
+{
+  File file;
+  int	rc_seek,error,inited;
+  uint	rc_length,read_length,reclength;
+  my_off_t rc_record_pos,end_of_file;
+  byte	*rc_buff,*rc_buff2,*rc_pos,*rc_end,*rc_request_pos;
+#ifdef HAVE_AIOWAIT
+  int	use_async_io;
+  my_aio_result aio_result;
+#endif
+  enum cache_type type;
+} RECORD_CACHE;
+
+enum file_type
+{
+  UNOPEN = 0, FILE_BY_OPEN, FILE_BY_CREATE, STREAM_BY_FOPEN, STREAM_BY_FDOPEN,
+  FILE_BY_MKSTEMP, FILE_BY_DUP
+};
+
+struct st_my_file_info
+{
+  my_string		name;
+  enum file_type	type;
+#if defined(THREAD) && !defined(HAVE_PREAD)
+  pthread_mutex_t	mutex;
+#endif
+};
+
+extern struct st_my_file_info *my_file_info;
+
+typedef struct st_my_tmpdir
+{
+  char **list;
+  uint cur, max;
+#ifdef THREAD
+  pthread_mutex_t mutex;
+#endif
+} MY_TMPDIR;
+
+typedef struct st_dynamic_array
+{
+  char *buffer;
+  uint elements,max_element;
+  uint alloc_increment;
+  uint size_of_element;
+} DYNAMIC_ARRAY;
+
+typedef struct st_dynamic_string
+{
+  char *str;
+  uint length,max_length,alloc_increment;
+} DYNAMIC_STRING;
+
+struct st_io_cache;
+typedef int (*IO_CACHE_CALLBACK)(struct st_io_cache*);
+
+#ifdef THREAD
+typedef struct st_io_cache_share
+{
+  /* to sync on reads into buffer */
+  pthread_mutex_t mutex;
+  pthread_cond_t  cond;
+  int             count, total;
+  /* actual IO_CACHE that filled the buffer */
+  struct st_io_cache *active;
+#ifdef NOT_YET_IMPLEMENTED
+  /* whether the structure should be free'd */
+  my_bool alloced;
+#endif
+} IO_CACHE_SHARE;
+#endif
+
+typedef struct st_io_cache		/* Used when cacheing files */
+{
+  /* Offset in file corresponding to the first byte of byte* buffer. */
+  my_off_t pos_in_file;
+  /*
+    The offset of end of file for READ_CACHE and WRITE_CACHE.
+    For SEQ_READ_APPEND it the maximum of the actual end of file and
+    the position represented by read_end.
+  */
+  my_off_t end_of_file;
+  /* Points to current read position in the buffer */
+  byte	*read_pos;
+  /* the non-inclusive boundary in the buffer for the currently valid read */
+  byte  *read_end;
+  byte  *buffer;				/* The read buffer */
+  /* Used in ASYNC_IO */
+  byte  *request_pos;
+
+  /* Only used in WRITE caches and in SEQ_READ_APPEND to buffer writes */
+  byte  *write_buffer;
+  /*
+    Only used in SEQ_READ_APPEND, and points to the current read position
+    in the write buffer. Note that reads in SEQ_READ_APPEND caches can
+    happen from both read buffer (byte* buffer) and write buffer
+    (byte* write_buffer).
+  */
+  byte *append_read_pos;
+  /* Points to current write position in the write buffer */
+  byte *write_pos;
+  /* The non-inclusive boundary of the valid write area */
+  byte *write_end;
+
+  /*
+    Current_pos and current_end are convenience variables used by
+    my_b_tell() and other routines that need to know the current offset
+    current_pos points to &write_pos, and current_end to &write_end in a
+    WRITE_CACHE, and &read_pos and &read_end respectively otherwise
+  */
+  byte  **current_pos, **current_end;
+#ifdef THREAD
+  /*
+    The lock is for append buffer used in SEQ_READ_APPEND cache
+    need mutex copying from append buffer to read buffer.
+  */
+  pthread_mutex_t append_buffer_lock;
+  /*
+    The following is used when several threads are reading the
+    same file in parallel. They are synchronized on disk
+    accesses reading the cached part of the file asynchronously.
+    It should be set to NULL to disable the feature.  Only
+    READ_CACHE mode is supported.
+  */
+  IO_CACHE_SHARE *share;
+#endif
+  /*
+    A caller will use my_b_read() macro to read from the cache
+    if the data is already in cache, it will be simply copied with
+    memcpy() and internal variables will be accordinging updated with
+    no functions invoked. However, if the data is not fully in the cache,
+    my_b_read() will call read_function to fetch the data. read_function
+    must never be invoked directly.
+  */
+  int (*read_function)(struct st_io_cache *,byte *,uint);
+  /*
+    Same idea as in the case of read_function, except my_b_write() needs to
+    be replaced with my_b_append() for a SEQ_READ_APPEND cache
+  */
+  int (*write_function)(struct st_io_cache *,const byte *,uint);
+  /*
+    Specifies the type of the cache. Depending on the type of the cache
+    certain operations might not be available and yield unpredicatable
+    results. Details to be documented later
+  */
+  enum cache_type type;
+  /*
+    Callbacks when the actual read I/O happens. These were added and
+    are currently used for binary logging of LOAD DATA INFILE - when a
+    block is read from the file, we create a block create/append event, and
+    when IO_CACHE is closed, we create an end event. These functions could,
+    of course be used for other things
+  */
+  IO_CACHE_CALLBACK pre_read;
+  IO_CACHE_CALLBACK post_read;
+  IO_CACHE_CALLBACK pre_close;
+  /*
+    Counts the number of times, when we were forced to use disk. We use it to
+    increase the binlog_cache_disk_use status variable.
+  */
+  ulong disk_writes;
+  void* arg;				/* for use by pre/post_read */
+  char *file_name;			/* if used with 'open_cached_file' */
+  char *dir,*prefix;
+  File file; /* file descriptor */
+  /*
+    seek_not_done is set by my_b_seek() to inform the upcoming read/write
+    operation that a seek needs to be preformed prior to the actual I/O
+    error is 0 if the cache operation was successful, -1 if there was a
+    "hard" error, and the actual number of I/O-ed bytes if the read/write was
+    partial.
+  */
+  int	seek_not_done,error;
+  /* buffer_length is memory size allocated for buffer or write_buffer */
+  uint	buffer_length;
+  /* read_length is the same as buffer_length except when we use async io */
+  uint  read_length;
+  myf	myflags;			/* Flags used to my_read/my_write */
+  /*
+    alloced_buffer is 1 if the buffer was allocated by init_io_cache() and
+    0 if it was supplied by the user.
+    Currently READ_NET is the only one that will use a buffer allocated
+    somewhere else
+  */
+  my_bool alloced_buffer;
+#ifdef HAVE_AIOWAIT
+  /*
+    As inidicated by ifdef, this is for async I/O, which is not currently
+    used (because it's not reliable on all systems)
+  */
+  uint inited;
+  my_off_t aio_read_pos;
+  my_aio_result aio_result;
+#endif
+} IO_CACHE;
+
+typedef int (*qsort2_cmp)(const void *, const void *, const void *);
+
+	/* defines for mf_iocache */
+
+	/* Test if buffer is inited */
+#define my_b_clear(info) (info)->buffer=0
+#define my_b_inited(info) (info)->buffer
+#define my_b_EOF INT_MIN
+
+#define my_b_read(info,Buffer,Count) \
+  ((info)->read_pos + (Count) <= (info)->read_end ?\
+   (memcpy(Buffer,(info)->read_pos,(size_t) (Count)), \
+    ((info)->read_pos+=(Count)),0) :\
+   (*(info)->read_function)((info),Buffer,Count))
+
+#define my_b_write(info,Buffer,Count) \
+ ((info)->write_pos + (Count) <=(info)->write_end ?\
+  (memcpy((info)->write_pos, (Buffer), (size_t)(Count)),\
+   ((info)->write_pos+=(Count)),0) : \
+   (*(info)->write_function)((info),(Buffer),(Count)))
+
+#define my_b_get(info) \
+  ((info)->read_pos != (info)->read_end ?\
+   ((info)->read_pos++, (int) (uchar) (info)->read_pos[-1]) :\
+   _my_b_get(info))
+
+	/* my_b_write_byte dosn't have any err-check */
+#define my_b_write_byte(info,chr) \
+  (((info)->write_pos < (info)->write_end) ?\
+   ((*(info)->write_pos++)=(chr)) :\
+   (_my_b_write(info,0,0) , ((*(info)->write_pos++)=(chr))))
+
+#define my_b_fill_cache(info) \
+  (((info)->read_end=(info)->read_pos),(*(info)->read_function)(info,0,0))
+
+#define my_b_tell(info) ((info)->pos_in_file + \
+			 (uint) (*(info)->current_pos - (info)->request_pos))
+
+/* tell write offset in the SEQ_APPEND cache */
+my_off_t my_b_append_tell(IO_CACHE* info);
+
+#define my_b_bytes_in_cache(info) (uint) (*(info)->current_end - \
+					  *(info)->current_pos)
+
+typedef uint32 ha_checksum;
+
+#include <my_alloc.h>
+
+	/* Prototypes for mysys and my_func functions */
+
+extern int my_copy(const char *from,const char *to,myf MyFlags);
+extern int my_append(const char *from,const char *to,myf MyFlags);
+extern int my_delete(const char *name,myf MyFlags);
+extern int my_getwd(my_string buf,uint size,myf MyFlags);
+extern int my_setwd(const char *dir,myf MyFlags);
+extern int my_lock(File fd,int op,my_off_t start, my_off_t length,myf MyFlags);
+extern gptr my_once_alloc(uint Size,myf MyFlags);
+extern void my_once_free(void);
+extern char *my_once_strdup(const char *src,myf myflags);
+extern char *my_once_memdup(const char *src, uint len, myf myflags);
+extern my_string my_tempnam(const char *dir,const char *pfx,myf MyFlags);
+extern File my_open(const char *FileName,int Flags,myf MyFlags);
+extern File my_register_filename(File fd, const char *FileName,
+				 enum file_type type_of_file,
+				 uint error_message_number, myf MyFlags);
+extern File my_create(const char *FileName,int CreateFlags,
+		      int AccsesFlags, myf MyFlags);
+extern int my_close(File Filedes,myf MyFlags);
+extern File my_dup(File file, myf MyFlags);
+extern int my_mkdir(const char *dir, int Flags, myf MyFlags);
+extern int my_readlink(char *to, const char *filename, myf MyFlags);
+extern int my_realpath(char *to, const char *filename, myf MyFlags);
+extern File my_create_with_symlink(const char *linkname, const char *filename,
+				   int createflags, int access_flags,
+				   myf MyFlags);
+extern int my_delete_with_symlink(const char *name, myf MyFlags);
+extern int my_rename_with_symlink(const char *from,const char *to,myf MyFlags);
+extern int my_symlink(const char *content, const char *linkname, myf MyFlags);
+extern uint my_read(File Filedes,byte *Buffer,uint Count,myf MyFlags);
+extern uint my_pread(File Filedes,byte *Buffer,uint Count,my_off_t offset,
+		     myf MyFlags);
+extern int my_rename(const char *from,const char *to,myf MyFlags);
+extern my_off_t my_seek(File fd,my_off_t pos,int whence,myf MyFlags);
+extern my_off_t my_tell(File fd,myf MyFlags);
+extern uint my_write(File Filedes,const byte *Buffer,uint Count,
+		     myf MyFlags);
+extern uint my_pwrite(File Filedes,const byte *Buffer,uint Count,
+		      my_off_t offset,myf MyFlags);
+extern uint my_fread(FILE *stream,byte *Buffer,uint Count,myf MyFlags);
+extern uint my_fwrite(FILE *stream,const byte *Buffer,uint Count,
+		      myf MyFlags);
+extern my_off_t my_fseek(FILE *stream,my_off_t pos,int whence,myf MyFlags);
+extern my_off_t my_ftell(FILE *stream,myf MyFlags);
+extern gptr _mymalloc(uint uSize,const char *sFile,
+		      uint uLine, myf MyFlag);
+extern gptr _myrealloc(gptr pPtr,uint uSize,const char *sFile,
+		       uint uLine, myf MyFlag);
+extern gptr my_multi_malloc _VARARGS((myf MyFlags, ...));
+extern void _myfree(gptr pPtr,const char *sFile,uint uLine, myf MyFlag);
+extern int _sanity(const char *sFile,unsigned int uLine);
+extern gptr _my_memdup(const byte *from,uint length,
+		       const char *sFile, uint uLine,myf MyFlag);
+extern my_string _my_strdup(const char *from, const char *sFile, uint uLine,
+			    myf MyFlag);
+extern char *_my_strdup_with_length(const byte *from, uint length,
+				    const char *sFile, uint uLine,
+				    myf MyFlag);
+
+
+#ifndef TERMINATE
+extern void TERMINATE(FILE *file);
+#endif
+extern void init_glob_errs(void);
+extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
+extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
+extern int my_fclose(FILE *fd,myf MyFlags);
+extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
+extern int my_sync(File fd, myf my_flags);
+extern int my_error _VARARGS((int nr,myf MyFlags, ...));
+extern int my_printf_error _VARARGS((uint my_err, const char *format,
+				     myf MyFlags, ...)
+				    __attribute__ ((format (printf, 2, 4))));
+extern int my_message(uint my_err, const char *str,myf MyFlags);
+extern int my_message_no_curses(uint my_err, const char *str,myf MyFlags);
+extern int my_message_curses(uint my_err, const char *str,myf MyFlags);
+extern my_bool my_init(void);
+extern void my_end(int infoflag);
+extern int my_redel(const char *from, const char *to, int MyFlags);
+extern int my_copystat(const char *from, const char *to, int MyFlags);
+extern my_string my_filename(File fd);
+
+#ifndef THREAD
+extern void dont_break(void);
+extern void allow_break(void);
+#else
+#define dont_break()
+#define allow_break()
+#endif
+
+extern my_bool init_tmpdir(MY_TMPDIR *tmpdir, const char *pathlist);
+extern char *my_tmpdir(MY_TMPDIR *tmpdir);
+extern void free_tmpdir(MY_TMPDIR *tmpdir);
+
+extern void my_remember_signal(int signal_number,sig_handler (*func)(int));
+extern uint dirname_part(my_string to,const char *name);
+extern uint dirname_length(const char *name);
+#define base_name(A) (A+dirname_length(A))
+extern int test_if_hard_path(const char *dir_name);
+extern char *convert_dirname(char *to, const char *from, const char *from_end);
+extern void to_unix_path(my_string name);
+extern my_string fn_ext(const char *name);
+extern my_string fn_same(my_string toname,const char *name,int flag);
+extern my_string fn_format(my_string to,const char *name,const char *dir,
+			   const char *form, uint flag);
+extern size_s strlength(const char *str);
+extern void pack_dirname(my_string to,const char *from);
+extern uint unpack_dirname(my_string to,const char *from);
+extern uint cleanup_dirname(my_string to,const char *from);
+extern uint system_filename(my_string to,const char *from);
+extern uint unpack_filename(my_string to,const char *from);
+extern my_string intern_filename(my_string to,const char *from);
+extern my_string directory_file_name(my_string dst, const char *src);
+extern int pack_filename(my_string to, const char *name, size_s max_length);
+extern my_string my_path(my_string to,const char *progname,
+			 const char *own_pathname_part);
+extern my_string my_load_path(my_string to, const char *path,
+			      const char *own_path_prefix);
+extern int wild_compare(const char *str,const char *wildstr,pbool str_is_pattern);
+extern WF_PACK *wf_comp(my_string str);
+extern int wf_test(struct wild_file_pack *wf_pack,const char *name);
+extern void wf_end(struct wild_file_pack *buffer);
+extern size_s strip_sp(my_string str);
+extern void get_date(my_string to,int timeflag,time_t use_time);
+extern void soundex(CHARSET_INFO *, my_string out_pntr, my_string in_pntr,pbool remove_garbage);
+extern int init_record_cache(RECORD_CACHE *info,uint cachesize,File file,
+			     uint reclength,enum cache_type type,
+			     pbool use_async_io);
+extern int read_cache_record(RECORD_CACHE *info,byte *to);
+extern int end_record_cache(RECORD_CACHE *info);
+extern int write_cache_record(RECORD_CACHE *info,my_off_t filepos,
+			      const byte *record,uint length);
+extern int flush_write_cache(RECORD_CACHE *info);
+extern long my_clock(void);
+extern sig_handler sigtstp_handler(int signal_number);
+extern void handle_recived_signals(void);
+
+extern sig_handler my_set_alarm_variable(int signo);
+extern void my_string_ptr_sort(void *base,uint items,size_s size);
+extern void radixsort_for_str_ptr(uchar* base[], uint number_of_elements,
+				  size_s size_of_element,uchar *buffer[]);
+extern qsort_t qsort2(void *base_ptr, size_t total_elems, size_t size,
+		      qsort2_cmp cmp, void *cmp_argument);
+extern qsort2_cmp get_ptr_compare(uint);
+extern int init_io_cache(IO_CACHE *info,File file,uint cachesize,
+			 enum cache_type type,my_off_t seek_offset,
+			 pbool use_async_io, myf cache_myflags);
+extern my_bool reinit_io_cache(IO_CACHE *info,enum cache_type type,
+			       my_off_t seek_offset,pbool use_async_io,
+			       pbool clear_cache);
+extern int _my_b_read(IO_CACHE *info,byte *Buffer,uint Count);
+#ifdef THREAD
+extern int _my_b_read_r(IO_CACHE *info,byte *Buffer,uint Count);
+extern void init_io_cache_share(IO_CACHE *info,
+				IO_CACHE_SHARE *s, uint num_threads);
+extern void remove_io_thread(IO_CACHE *info);
+#endif
+extern int _my_b_seq_read(IO_CACHE *info,byte *Buffer,uint Count);
+extern int _my_b_net_read(IO_CACHE *info,byte *Buffer,uint Count);
+extern int _my_b_get(IO_CACHE *info);
+extern int _my_b_async_read(IO_CACHE *info,byte *Buffer,uint Count);
+extern int _my_b_write(IO_CACHE *info,const byte *Buffer,uint Count);
+extern int my_b_append(IO_CACHE *info,const byte *Buffer,uint Count);
+extern int my_b_safe_write(IO_CACHE *info,const byte *Buffer,uint Count);
+
+extern int my_block_write(IO_CACHE *info, const byte *Buffer,
+			  uint Count, my_off_t pos);
+extern int my_b_flush_io_cache(IO_CACHE *info, int need_append_buffer_lock);
+
+#define flush_io_cache(info) my_b_flush_io_cache((info),1)
+
+extern int end_io_cache(IO_CACHE *info);
+extern uint my_b_fill(IO_CACHE *info);
+extern void my_b_seek(IO_CACHE *info,my_off_t pos);
+extern uint my_b_gets(IO_CACHE *info, char *to, uint max_length);
+extern my_off_t my_b_filelength(IO_CACHE *info);
+extern uint my_b_printf(IO_CACHE *info, const char* fmt, ...);
+extern uint my_b_vprintf(IO_CACHE *info, const char* fmt, va_list ap);
+extern my_bool open_cached_file(IO_CACHE *cache,const char *dir,
+				 const char *prefix, uint cache_size,
+				 myf cache_myflags);
+extern my_bool real_open_cached_file(IO_CACHE *cache);
+extern void close_cached_file(IO_CACHE *cache);
+File create_temp_file(char *to, const char *dir, const char *pfx,
+		      int mode, myf MyFlags);
+#define my_init_dynamic_array(A,B,C,D) init_dynamic_array(A,B,C,D CALLER_INFO)
+#define my_init_dynamic_array_ci(A,B,C,D) init_dynamic_array(A,B,C,D ORIG_CALLER_INFO)
+extern my_bool init_dynamic_array(DYNAMIC_ARRAY *array,uint element_size,
+	  uint init_alloc,uint alloc_increment CALLER_INFO_PROTO);
+extern my_bool insert_dynamic(DYNAMIC_ARRAY *array,gptr element);
+extern byte *alloc_dynamic(DYNAMIC_ARRAY *array);
+extern byte *pop_dynamic(DYNAMIC_ARRAY*);
+extern my_bool set_dynamic(DYNAMIC_ARRAY *array,gptr element,uint array_index);
+extern void get_dynamic(DYNAMIC_ARRAY *array,gptr element,uint array_index);
+extern void delete_dynamic(DYNAMIC_ARRAY *array);
+extern void delete_dynamic_element(DYNAMIC_ARRAY *array, uint array_index);
+extern void freeze_size(DYNAMIC_ARRAY *array);
+#define dynamic_array_ptr(array,array_index) ((array)->buffer+(array_index)*(array)->size_of_element)
+#define dynamic_element(array,array_index,type) ((type)((array)->buffer) +(array_index))
+#define push_dynamic(A,B) insert_dynamic(A,B)
+#define reset_dynamic(array) ((array)->elements= 0)
+
+extern my_bool init_dynamic_string(DYNAMIC_STRING *str, const char *init_str,
+				   uint init_alloc,uint alloc_increment);
+extern my_bool dynstr_append(DYNAMIC_STRING *str, const char *append);
+my_bool dynstr_append_mem(DYNAMIC_STRING *str, const char *append,
+			  uint length);
+extern my_bool dynstr_set(DYNAMIC_STRING *str, const char *init_str);
+extern my_bool dynstr_realloc(DYNAMIC_STRING *str, ulong additional_size);
+extern void dynstr_free(DYNAMIC_STRING *str);
+#ifdef HAVE_MLOCK
+extern byte *my_malloc_lock(uint length,myf flags);
+extern void my_free_lock(byte *ptr,myf flags);
+#else
+#define my_malloc_lock(A,B) my_malloc((A),(B))
+#define my_free_lock(A,B) my_free((A),(B))
+#endif
+#define alloc_root_inited(A) ((A)->min_malloc != 0)
+#define ALLOC_ROOT_MIN_BLOCK_SIZE (MALLOC_OVERHEAD + sizeof(USED_MEM) + 8)
+#define clear_alloc_root(A) do { (A)->free= (A)->used= (A)->pre_alloc= 0; (A)->min_malloc=0;} while(0)
+extern void init_alloc_root(MEM_ROOT *mem_root, uint block_size,
+			    uint pre_alloc_size);
+extern gptr alloc_root(MEM_ROOT *mem_root,unsigned int Size);
+extern void free_root(MEM_ROOT *root, myf MyFLAGS);
+extern void set_prealloc_root(MEM_ROOT *root, char *ptr);
+extern void reset_root_defaults(MEM_ROOT *mem_root, uint block_size,
+                                uint prealloc_size);
+extern char *strdup_root(MEM_ROOT *root,const char *str);
+extern char *strmake_root(MEM_ROOT *root,const char *str,uint len);
+extern char *memdup_root(MEM_ROOT *root,const char *str,uint len);
+extern int load_defaults(const char *conf_file, const char **groups,
+			 int *argc, char ***argv);
+extern void free_defaults(char **argv);
+extern void print_defaults(const char *conf_file, const char **groups);
+extern my_bool my_compress(byte *, ulong *, ulong *);
+extern my_bool my_uncompress(byte *, ulong *, ulong *);
+extern byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen);
+extern ha_checksum my_checksum(ha_checksum crc, const byte *mem, uint count);
+extern uint my_bit_log2(ulong value);
+extern uint my_count_bits(ulonglong v);
+extern void my_sleep(ulong m_seconds);
+extern ulong crc32(ulong crc, const uchar *buf, uint len);
+extern uint my_set_max_open_files(uint files);
+void my_free_open_file_info(void);
+
+ulonglong my_getsystime(void);
+my_bool my_gethwaddr(uchar *to);
+
+/* character sets */
+extern uint get_charset_number(const char *cs_name, uint cs_flags);
+extern uint get_collation_number(const char *name);
+extern const char *get_charset_name(uint cs_number);
+
+extern CHARSET_INFO *get_charset(uint cs_number, myf flags);
+extern CHARSET_INFO *get_charset_by_name(const char *cs_name, myf flags);
+extern CHARSET_INFO *get_charset_by_csname(const char *cs_name,
+					   uint cs_flags, myf my_flags);
+extern void free_charsets(void);
+extern char *get_charsets_dir(char *buf);
+extern my_bool my_charset_same(CHARSET_INFO *cs1, CHARSET_INFO *cs2);
+extern my_bool init_compiled_charsets(myf flags);
+extern void add_compiled_collation(CHARSET_INFO *cs);
+extern ulong escape_string_for_mysql(CHARSET_INFO *charset_info, char *to,
+                                     const char *from, ulong length);
+
+#ifdef __WIN__
+extern my_bool have_tcpip;		/* Is set if tcpip is used */
+#endif
+#ifdef __NETWARE__
+void netware_reg_user(const char *ip, const char *user,
+		      const char *application);
+#endif
+
+C_MODE_END
+#include "raid.h"
+#endif /* _my_sys_h */
diff --git a/src/terralib/drivers/MySQL/include/mysql.h b/src/terralib/drivers/MySQL/include/mysql.h
new file mode 100644
index 0000000..1c88602
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql.h
@@ -0,0 +1,742 @@
+/* Copyright (C) 2000-2003 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#ifndef _mysql_h
+#define _mysql_h
+
+#ifdef __CYGWIN__     /* CYGWIN implements a UNIX API */
+#undef WIN
+#undef _WIN
+#undef _WIN32
+#undef _WIN64
+#undef __WIN__
+#endif
+
+#ifdef	__cplusplus
+extern "C" {
+#endif
+
+#ifndef _global_h				/* If not standard header */
+#include <sys/types.h>
+#ifdef __LCC__
+#include <winsock.h>				/* For windows */
+#endif
+typedef char my_bool;
+#if (defined(_WIN32) || defined(_WIN64)) && !defined(__WIN__)
+#define __WIN__
+#endif
+#if !defined(__WIN__)
+#define STDCALL
+#else
+#define STDCALL __stdcall
+#endif
+typedef char * gptr;
+
+#ifndef my_socket_defined
+#ifdef __WIN__
+#define my_socket SOCKET
+#else
+typedef int my_socket;
+#endif /* __WIN__ */
+#endif /* my_socket_defined */
+#endif /* _global_h */
+
+#include "mysql_com.h"
+#include "mysql_time.h"
+#include "mysql_version.h"
+#include "typelib.h"
+
+#include "my_list.h" /* for LISTs used in 'MYSQL' and 'MYSQL_STMT' */
+
+extern unsigned int mysql_port;
+extern char *mysql_unix_port;
+
+#define CLIENT_NET_READ_TIMEOUT		365*24*3600	/* Timeout on read */
+#define CLIENT_NET_WRITE_TIMEOUT	365*24*3600	/* Timeout on write */
+
+#ifdef __NETWARE__
+#pragma pack(push, 8)		/* 8 byte alignment */
+#endif
+
+#define IS_PRI_KEY(n)	((n) & PRI_KEY_FLAG)
+#define IS_NOT_NULL(n)	((n) & NOT_NULL_FLAG)
+#define IS_BLOB(n)	((n) & BLOB_FLAG)
+#define IS_NUM(t)	((t) <= FIELD_TYPE_INT24 || (t) == FIELD_TYPE_YEAR)
+#define IS_NUM_FIELD(f)	 ((f)->flags & NUM_FLAG)
+#define INTERNAL_NUM_FIELD(f) (((f)->type <= FIELD_TYPE_INT24 && ((f)->type != FIELD_TYPE_TIMESTAMP || (f)->length == 14 || (f)->length == 8)) || (f)->type == FIELD_TYPE_YEAR)
+
+
+typedef struct st_mysql_field {
+  char *name;                 /* Name of column */
+  char *org_name;             /* Original column name, if an alias */ 
+  char *table;                /* Table of column if column was a field */
+  char *org_table;            /* Org table name, if table was an alias */
+  char *db;                   /* Database for table */
+  char *catalog;	      /* Catalog for table */
+  char *def;                  /* Default value (set by mysql_list_fields) */
+  unsigned long length;       /* Width of column (create length) */
+  unsigned long max_length;   /* Max width for selected set */
+  unsigned int name_length;
+  unsigned int org_name_length;
+  unsigned int table_length;
+  unsigned int org_table_length;
+  unsigned int db_length;
+  unsigned int catalog_length;
+  unsigned int def_length;
+  unsigned int flags;         /* Div flags */
+  unsigned int decimals;      /* Number of decimals in field */
+  unsigned int charsetnr;     /* Character set */
+  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
+} MYSQL_FIELD;
+
+typedef char **MYSQL_ROW;		/* return data as array of strings */
+typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */
+
+#ifndef _global_h
+#if defined(NO_CLIENT_LONG_LONG)
+typedef unsigned long my_ulonglong;
+#elif defined (__WIN__)
+typedef unsigned __int64 my_ulonglong;
+#else
+typedef unsigned long long my_ulonglong;
+#endif
+#endif
+
+#define MYSQL_COUNT_ERROR (~(my_ulonglong) 0)
+
+typedef struct st_mysql_rows {
+  struct st_mysql_rows *next;		/* list of rows */
+  MYSQL_ROW data;
+  unsigned long length;
+} MYSQL_ROWS;
+
+typedef MYSQL_ROWS *MYSQL_ROW_OFFSET;	/* offset to current row */
+
+#include "my_alloc.h"
+
+typedef struct st_mysql_data {
+  my_ulonglong rows;
+  unsigned int fields;
+  MYSQL_ROWS *data;
+  MEM_ROOT alloc;
+#if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)
+  MYSQL_ROWS **prev_ptr;
+#endif
+} MYSQL_DATA;
+
+enum mysql_option 
+{
+  MYSQL_OPT_CONNECT_TIMEOUT, MYSQL_OPT_COMPRESS, MYSQL_OPT_NAMED_PIPE,
+  MYSQL_INIT_COMMAND, MYSQL_READ_DEFAULT_FILE, MYSQL_READ_DEFAULT_GROUP,
+  MYSQL_SET_CHARSET_DIR, MYSQL_SET_CHARSET_NAME, MYSQL_OPT_LOCAL_INFILE,
+  MYSQL_OPT_PROTOCOL, MYSQL_SHARED_MEMORY_BASE_NAME, MYSQL_OPT_READ_TIMEOUT,
+  MYSQL_OPT_WRITE_TIMEOUT, MYSQL_OPT_USE_RESULT,
+  MYSQL_OPT_USE_REMOTE_CONNECTION, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
+  MYSQL_OPT_GUESS_CONNECTION, MYSQL_SET_CLIENT_IP, MYSQL_SECURE_AUTH
+};
+
+struct st_mysql_options {
+  unsigned int connect_timeout, read_timeout, write_timeout;
+  unsigned int port, protocol;
+  unsigned long client_flag;
+  char *host,*user,*password,*unix_socket,*db;
+  struct st_dynamic_array *init_commands;
+  char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
+  char *ssl_key;				/* PEM key file */
+  char *ssl_cert;				/* PEM cert file */
+  char *ssl_ca;					/* PEM CA file */
+  char *ssl_capath;				/* PEM directory of CA-s? */
+  char *ssl_cipher;				/* cipher to use */
+  char *shared_memory_base_name;
+  unsigned long max_allowed_packet;
+  my_bool use_ssl;				/* if to use SSL or not */
+  my_bool compress,named_pipe;
+ /*
+   On connect, find out the replication role of the server, and
+   establish connections to all the peers
+ */
+  my_bool rpl_probe;
+ /*
+   Each call to mysql_real_query() will parse it to tell if it is a read
+   or a write, and direct it to the slave or the master
+ */
+  my_bool rpl_parse;
+ /*
+   If set, never read from a master, only from slave, when doing
+   a read that is replication-aware
+ */
+  my_bool no_master_reads;
+#if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY)
+  my_bool separate_thread;
+#endif
+  enum mysql_option methods_to_use;
+  char *client_ip;
+  /* Refuse client connecting to server if it uses old (pre-4.1.1) protocol */
+  my_bool secure_auth;
+
+  /* function pointers for local infile support */
+  int (*local_infile_init)(void **, const char *, void *);
+  int (*local_infile_read)(void *, char *, unsigned int);
+  void (*local_infile_end)(void *);
+  int (*local_infile_error)(void *, char *, unsigned int);
+  void *local_infile_userdata;
+};
+
+enum mysql_status 
+{
+  MYSQL_STATUS_READY,MYSQL_STATUS_GET_RESULT,MYSQL_STATUS_USE_RESULT
+};
+
+enum mysql_protocol_type 
+{
+  MYSQL_PROTOCOL_DEFAULT, MYSQL_PROTOCOL_TCP, MYSQL_PROTOCOL_SOCKET,
+  MYSQL_PROTOCOL_PIPE, MYSQL_PROTOCOL_MEMORY
+};
+/*
+  There are three types of queries - the ones that have to go to
+  the master, the ones that go to a slave, and the adminstrative
+  type which must happen on the pivot connectioin
+*/
+enum mysql_rpl_type 
+{
+  MYSQL_RPL_MASTER, MYSQL_RPL_SLAVE, MYSQL_RPL_ADMIN
+};
+
+struct st_mysql_methods;
+
+typedef struct st_mysql
+{
+  NET		net;			/* Communication parameters */
+  gptr		connector_fd;		/* ConnectorFd for SSL */
+  char		*host,*user,*passwd,*unix_socket,*server_version,*host_info,*info;
+  char          *db;
+  struct charset_info_st *charset;
+  MYSQL_FIELD	*fields;
+  MEM_ROOT	field_alloc;
+  my_ulonglong affected_rows;
+  my_ulonglong insert_id;		/* id if insert on table with NEXTNR */
+  my_ulonglong extra_info;		/* Used by mysqlshow */
+  unsigned long thread_id;		/* Id for connection in server */
+  unsigned long packet_length;
+  unsigned int	port;
+  unsigned long client_flag,server_capabilities;
+  unsigned int	protocol_version;
+  unsigned int	field_count;
+  unsigned int 	server_status;
+  unsigned int  server_language;
+  unsigned int	warning_count;
+  struct st_mysql_options options;
+  enum mysql_status status;
+  my_bool	free_me;		/* If free in mysql_close */
+  my_bool	reconnect;		/* set to 1 if automatic reconnect */
+
+  /* session-wide random string */
+  char	        scramble[SCRAMBLE_LENGTH+1];
+
+ /*
+   Set if this is the original connection, not a master or a slave we have
+   added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
+ */
+  my_bool rpl_pivot;
+  /*
+    Pointers to the master, and the next slave connections, points to
+    itself if lone connection.
+  */
+  struct st_mysql* master, *next_slave;
+
+  struct st_mysql* last_used_slave; /* needed for round-robin slave pick */
+ /* needed for send/read/store/use result to work correctly with replication */
+  struct st_mysql* last_used_con;
+
+  LIST  *stmts;                     /* list of all statements */
+  const struct st_mysql_methods *methods;
+  void *thd;
+  /*
+    Points to boolean flag in MYSQL_RES  or MYSQL_STMT. We set this flag 
+    from mysql_stmt_close if close had to cancel result set of this object.
+  */
+  my_bool *unbuffered_fetch_owner;
+} MYSQL;
+
+typedef struct st_mysql_res {
+  my_ulonglong row_count;
+  MYSQL_FIELD	*fields;
+  MYSQL_DATA	*data;
+  MYSQL_ROWS	*data_cursor;
+  unsigned long *lengths;		/* column lengths of current row */
+  MYSQL		*handle;		/* for unbuffered reads */
+  MEM_ROOT	field_alloc;
+  unsigned int	field_count, current_field;
+  MYSQL_ROW	row;			/* If unbuffered read */
+  MYSQL_ROW	current_row;		/* buffer to current row */
+  my_bool	eof;			/* Used by mysql_fetch_row */
+  /* mysql_stmt_close() had to cancel this result */
+  my_bool       unbuffered_fetch_cancelled;  
+  const struct st_mysql_methods *methods;
+} MYSQL_RES;
+
+#define MAX_MYSQL_MANAGER_ERR 256  
+#define MAX_MYSQL_MANAGER_MSG 256
+
+#define MANAGER_OK           200
+#define MANAGER_INFO         250
+#define MANAGER_ACCESS       401
+#define MANAGER_CLIENT_ERR   450
+#define MANAGER_INTERNAL_ERR 500
+
+#if !defined(MYSQL_SERVER) && !defined(MYSQL_CLIENT)
+#define MYSQL_CLIENT
+#endif
+
+
+typedef struct st_mysql_manager
+{
+  NET net;
+  char *host,*user,*passwd;
+  unsigned int port;
+  my_bool free_me;
+  my_bool eof;
+  int cmd_status;
+  int last_errno;
+  char* net_buf,*net_buf_pos,*net_data_end;
+  int net_buf_size;
+  char last_error[MAX_MYSQL_MANAGER_ERR];
+} MYSQL_MANAGER;
+
+typedef struct st_mysql_parameters
+{
+  unsigned long *p_max_allowed_packet;
+  unsigned long *p_net_buffer_length;
+} MYSQL_PARAMETERS;
+
+#if !defined(MYSQL_SERVER) && !defined(EMBEDDED_LIBRARY)
+#define max_allowed_packet (*mysql_get_parameters()->p_max_allowed_packet)
+#define net_buffer_length (*mysql_get_parameters()->p_net_buffer_length)
+#endif
+
+/*
+  Set up and bring down the server; to ensure that applications will
+  work when linked against either the standard client library or the
+  embedded server library, these functions should be called.
+*/
+int STDCALL mysql_server_init(int argc, char **argv, char **groups);
+void STDCALL mysql_server_end(void);
+
+MYSQL_PARAMETERS *STDCALL mysql_get_parameters(void);
+
+/*
+  Set up and bring down a thread; these function should be called
+  for each thread in an application which opens at least one MySQL
+  connection.  All uses of the connection(s) should be between these
+  function calls.
+*/
+my_bool STDCALL mysql_thread_init(void);
+void STDCALL mysql_thread_end(void);
+
+/*
+  Functions to get information from the MYSQL and MYSQL_RES structures
+  Should definitely be used if one uses shared libraries.
+*/
+
+my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
+unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);
+my_bool STDCALL mysql_eof(MYSQL_RES *res);
+MYSQL_FIELD *STDCALL mysql_fetch_field_direct(MYSQL_RES *res,
+					      unsigned int fieldnr);
+MYSQL_FIELD * STDCALL mysql_fetch_fields(MYSQL_RES *res);
+MYSQL_ROW_OFFSET STDCALL mysql_row_tell(MYSQL_RES *res);
+MYSQL_FIELD_OFFSET STDCALL mysql_field_tell(MYSQL_RES *res);
+
+unsigned int STDCALL mysql_field_count(MYSQL *mysql);
+my_ulonglong STDCALL mysql_affected_rows(MYSQL *mysql);
+my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql);
+unsigned int STDCALL mysql_errno(MYSQL *mysql);
+const char * STDCALL mysql_error(MYSQL *mysql);
+const char *STDCALL mysql_sqlstate(MYSQL *mysql);
+unsigned int STDCALL mysql_warning_count(MYSQL *mysql);
+const char * STDCALL mysql_info(MYSQL *mysql);
+unsigned long STDCALL mysql_thread_id(MYSQL *mysql);
+const char * STDCALL mysql_character_set_name(MYSQL *mysql);
+
+MYSQL *		STDCALL mysql_init(MYSQL *mysql);
+my_bool		STDCALL mysql_ssl_set(MYSQL *mysql, const char *key,
+				      const char *cert, const char *ca,
+				      const char *capath, const char *cipher);
+my_bool		STDCALL mysql_change_user(MYSQL *mysql, const char *user, 
+					  const char *passwd, const char *db);
+MYSQL *		STDCALL mysql_real_connect(MYSQL *mysql, const char *host,
+					   const char *user,
+					   const char *passwd,
+					   const char *db,
+					   unsigned int port,
+					   const char *unix_socket,
+					   unsigned long clientflag);
+int		STDCALL mysql_select_db(MYSQL *mysql, const char *db);
+int		STDCALL mysql_query(MYSQL *mysql, const char *q);
+int		STDCALL mysql_send_query(MYSQL *mysql, const char *q,
+					 unsigned long length);
+int		STDCALL mysql_real_query(MYSQL *mysql, const char *q,
+					unsigned long length);
+MYSQL_RES *     STDCALL mysql_store_result(MYSQL *mysql);
+MYSQL_RES *     STDCALL mysql_use_result(MYSQL *mysql);
+
+/* perform query on master */
+my_bool		STDCALL mysql_master_query(MYSQL *mysql, const char *q,
+					   unsigned long length);
+my_bool		STDCALL mysql_master_send_query(MYSQL *mysql, const char *q,
+						unsigned long length);
+/* perform query on slave */  
+my_bool		STDCALL mysql_slave_query(MYSQL *mysql, const char *q,
+					  unsigned long length);
+my_bool		STDCALL mysql_slave_send_query(MYSQL *mysql, const char *q,
+					       unsigned long length);
+
+/* local infile support */
+
+#define LOCAL_INFILE_ERROR_LEN 512
+
+void
+mysql_set_local_infile_handler(MYSQL *mysql,
+                               int (*local_infile_init)(void **, const char *,
+                            void *),
+                               int (*local_infile_read)(void *, char *,
+							unsigned int),
+                               void (*local_infile_end)(void *),
+                               int (*local_infile_error)(void *, char*,
+							 unsigned int),
+                               void *);
+
+void
+mysql_set_local_infile_default(MYSQL *mysql);
+
+
+/*
+  enable/disable parsing of all queries to decide if they go on master or
+  slave
+*/
+void            STDCALL mysql_enable_rpl_parse(MYSQL* mysql);
+void            STDCALL mysql_disable_rpl_parse(MYSQL* mysql);
+/* get the value of the parse flag */  
+int             STDCALL mysql_rpl_parse_enabled(MYSQL* mysql);
+
+/*  enable/disable reads from master */
+void            STDCALL mysql_enable_reads_from_master(MYSQL* mysql);
+void            STDCALL mysql_disable_reads_from_master(MYSQL* mysql);
+/* get the value of the master read flag */  
+my_bool		STDCALL mysql_reads_from_master_enabled(MYSQL* mysql);
+
+enum mysql_rpl_type     STDCALL mysql_rpl_query_type(const char* q, int len);  
+
+/* discover the master and its slaves */  
+my_bool		STDCALL mysql_rpl_probe(MYSQL* mysql);
+
+/* set the master, close/free the old one, if it is not a pivot */
+int             STDCALL mysql_set_master(MYSQL* mysql, const char* host,
+					 unsigned int port,
+					 const char* user,
+					 const char* passwd);
+int             STDCALL mysql_add_slave(MYSQL* mysql, const char* host,
+					unsigned int port,
+					const char* user,
+					const char* passwd);
+
+int		STDCALL mysql_shutdown(MYSQL *mysql,
+                                       enum mysql_enum_shutdown_level
+                                       shutdown_level);
+int		STDCALL mysql_dump_debug_info(MYSQL *mysql);
+int		STDCALL mysql_refresh(MYSQL *mysql,
+				     unsigned int refresh_options);
+int		STDCALL mysql_kill(MYSQL *mysql,unsigned long pid);
+int		STDCALL mysql_set_server_option(MYSQL *mysql,
+						enum enum_mysql_set_option
+						option);
+int		STDCALL mysql_ping(MYSQL *mysql);
+const char *	STDCALL mysql_stat(MYSQL *mysql);
+const char *	STDCALL mysql_get_server_info(MYSQL *mysql);
+const char *	STDCALL mysql_get_client_info(void);
+unsigned long	STDCALL mysql_get_client_version(void);
+const char *	STDCALL mysql_get_host_info(MYSQL *mysql);
+unsigned long	STDCALL mysql_get_server_version(MYSQL *mysql);
+unsigned int	STDCALL mysql_get_proto_info(MYSQL *mysql);
+MYSQL_RES *	STDCALL mysql_list_dbs(MYSQL *mysql,const char *wild);
+MYSQL_RES *	STDCALL mysql_list_tables(MYSQL *mysql,const char *wild);
+MYSQL_RES *	STDCALL mysql_list_processes(MYSQL *mysql);
+int		STDCALL mysql_options(MYSQL *mysql,enum mysql_option option,
+				      const char *arg);
+void		STDCALL mysql_free_result(MYSQL_RES *result);
+void		STDCALL mysql_data_seek(MYSQL_RES *result,
+					my_ulonglong offset);
+MYSQL_ROW_OFFSET STDCALL mysql_row_seek(MYSQL_RES *result,
+						MYSQL_ROW_OFFSET offset);
+MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result,
+					   MYSQL_FIELD_OFFSET offset);
+MYSQL_ROW	STDCALL mysql_fetch_row(MYSQL_RES *result);
+unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result);
+MYSQL_FIELD *	STDCALL mysql_fetch_field(MYSQL_RES *result);
+MYSQL_RES *     STDCALL mysql_list_fields(MYSQL *mysql, const char *table,
+					  const char *wild);
+unsigned long	STDCALL mysql_escape_string(char *to,const char *from,
+					    unsigned long from_length);
+unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql,
+					       char *to,const char *from,
+					       unsigned long length);
+void		STDCALL mysql_debug(const char *debug);
+char *		STDCALL mysql_odbc_escape_string(MYSQL *mysql,
+						 char *to,
+						 unsigned long to_length,
+						 const char *from,
+						 unsigned long from_length,
+						 void *param,
+						 char *
+						 (*extend_buffer)
+						 (void *, char *to,
+						  unsigned long *length));
+void 		STDCALL myodbc_remove_escape(MYSQL *mysql,char *name);
+unsigned int	STDCALL mysql_thread_safe(void);
+my_bool		STDCALL mysql_embedded(void);
+MYSQL_MANAGER*  STDCALL mysql_manager_init(MYSQL_MANAGER* con);  
+MYSQL_MANAGER*  STDCALL mysql_manager_connect(MYSQL_MANAGER* con,
+					      const char* host,
+					      const char* user,
+					      const char* passwd,
+					      unsigned int port);
+void            STDCALL mysql_manager_close(MYSQL_MANAGER* con);
+int             STDCALL mysql_manager_command(MYSQL_MANAGER* con,
+						const char* cmd, int cmd_len);
+int             STDCALL mysql_manager_fetch_line(MYSQL_MANAGER* con,
+						  char* res_buf,
+						 int res_buf_size);
+my_bool         STDCALL mysql_read_query_result(MYSQL *mysql);
+
+
+/*
+  The following definitions are added for the enhanced 
+  client-server protocol
+*/
+
+/* statement state */
+enum enum_mysql_stmt_state
+{
+  MYSQL_STMT_INIT_DONE= 1, MYSQL_STMT_PREPARE_DONE, MYSQL_STMT_EXECUTE_DONE,
+  MYSQL_STMT_FETCH_DONE
+};
+
+
+/* bind structure */
+typedef struct st_mysql_bind
+{
+  unsigned long	*length;          /* output length pointer */
+  my_bool       *is_null;	  /* Pointer to null indicator */
+  void		*buffer;	  /* buffer to get/put data */
+  enum enum_field_types buffer_type;	/* buffer type */
+  unsigned long buffer_length;    /* buffer length, must be set for str/binary */  
+
+  /* Following are for internal use. Set by mysql_stmt_bind_param */
+  unsigned char *inter_buffer;    /* for the current data position */
+  unsigned long offset;           /* offset position for char/binary fetch */
+  unsigned long	internal_length;  /* Used if length is 0 */
+  unsigned int	param_number;	  /* For null count and error messages */
+  unsigned int  pack_length;	  /* Internal length for packed data */
+  my_bool       is_unsigned;      /* set if integer type is unsigned */
+  my_bool	long_data_used;	  /* If used with mysql_send_long_data */
+  my_bool	internal_is_null; /* Used if is_null is 0 */
+  void (*store_param_func)(NET *net, struct st_mysql_bind *param);
+  void (*fetch_result)(struct st_mysql_bind *, unsigned char **row);
+  void (*skip_result)(struct st_mysql_bind *, MYSQL_FIELD *,
+		      unsigned char **row);
+} MYSQL_BIND;
+
+
+/* statement handler */
+typedef struct st_mysql_stmt
+{
+  MEM_ROOT       mem_root;             /* root allocations */
+  LIST           list;                 /* list to keep track of all stmts */
+  MYSQL          *mysql;               /* connection handle */
+  MYSQL_BIND     *params;              /* input parameters */
+  MYSQL_BIND     *bind;                /* output parameters */
+  MYSQL_FIELD    *fields;              /* result set metadata */
+  MYSQL_DATA     result;               /* cached result set */
+  MYSQL_ROWS     *data_cursor;         /* current row in cached result */
+  /* copy of mysql->affected_rows after statement execution */
+  my_ulonglong   affected_rows;
+  my_ulonglong   insert_id;            /* copy of mysql->insert_id */
+  /*
+    mysql_stmt_fetch() calls this function to fetch one row (it's different
+    for buffered, unbuffered and cursor fetch).
+  */
+  int            (*read_row_func)(struct st_mysql_stmt *stmt, 
+                                  unsigned char **row);
+  unsigned long	 stmt_id;	       /* Id for prepared statement */
+  unsigned int	 last_errno;	       /* error code */
+  unsigned int   param_count;          /* input parameter count */
+  unsigned int   field_count;          /* number of columns in result set */
+  enum enum_mysql_stmt_state state;    /* statement state */
+  char		 last_error[MYSQL_ERRMSG_SIZE]; /* error message */
+  char		 sqlstate[SQLSTATE_LENGTH+1];
+  /* Types of input parameters should be sent to server */
+  my_bool        send_types_to_server;
+  my_bool        bind_param_done;      /* input buffers were supplied */
+  my_bool        bind_result_done;     /* output buffers were supplied */
+  /* mysql_stmt_close() had to cancel this result */
+  my_bool       unbuffered_fetch_cancelled;  
+  /*
+    Is set to true if we need to calculate field->max_length for 
+    metadata fields when doing mysql_stmt_store_result.
+  */
+  my_bool       update_max_length;     
+} MYSQL_STMT;
+
+enum enum_stmt_attr_type
+{
+  /*
+    When doing mysql_stmt_store_result calculate max_length attribute
+    of statement metadata. This is to be consistent with the old API, 
+    where this was done automatically.
+    In the new API we do that only by request because it slows down
+    mysql_stmt_store_result sufficiently.
+  */
+  STMT_ATTR_UPDATE_MAX_LENGTH
+};
+
+
+typedef struct st_mysql_methods
+{
+  my_bool (*read_query_result)(MYSQL *mysql);
+  my_bool (*advanced_command)(MYSQL *mysql,
+			      enum enum_server_command command,
+			      const char *header,
+			      unsigned long header_length,
+			      const char *arg,
+			      unsigned long arg_length,
+			      my_bool skip_check);
+  MYSQL_DATA *(*read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
+			   unsigned int fields);
+  MYSQL_RES * (*use_result)(MYSQL *mysql);
+  void (*fetch_lengths)(unsigned long *to, 
+			MYSQL_ROW column, unsigned int field_count);
+  void (*flush_use_result)(MYSQL *mysql);
+#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY)
+  MYSQL_FIELD * (*list_fields)(MYSQL *mysql);
+  my_bool (*read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
+  int (*stmt_execute)(MYSQL_STMT *stmt);
+  int (*read_binary_rows)(MYSQL_STMT *stmt);
+  int (*unbuffered_fetch)(MYSQL *mysql, char **row);
+  void (*free_embedded_thd)(MYSQL *mysql);
+  const char *(*read_statistics)(MYSQL *mysql);
+  my_bool (*next_result)(MYSQL *mysql);
+  int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd);
+#endif
+} MYSQL_METHODS;
+
+#ifdef HAVE_DEPRECATED_411_API
+/* Deprecated calls (since MySQL 4.1.2) */
+
+/* Use mysql_stmt_init + mysql_stmt_prepare instead */
+MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
+				   unsigned long length);
+#define mysql_execute mysql_stmt_execute
+#define mysql_fetch mysql_stmt_fetch
+#define mysql_fetch_column mysql_stmt_fetch_column
+#define mysql_bind_param mysql_stmt_bind_param
+#define mysql_bind_result mysql_stmt_bind_result
+#define mysql_param_count mysql_stmt_param_count
+#define mysql_param_result mysql_stmt_param_metadata
+#define mysql_get_metadata mysql_stmt_result_metadata
+#define mysql_send_long_data mysql_stmt_send_long_data
+
+#endif /* HAVE_DEPRECATED_411_API */
+
+MYSQL_STMT * STDCALL mysql_stmt_init(MYSQL *mysql);
+int STDCALL mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query,
+                               unsigned long length);
+int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch(MYSQL_STMT *stmt);
+int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, 
+                                    unsigned int column,
+                                    unsigned long offset);
+int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
+unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt,
+                                    enum enum_stmt_attr_type attr_type,
+                                    const void *attr);
+my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt,
+                                    enum enum_stmt_attr_type attr_type,
+                                    void *attr);
+my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
+my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_reset(MYSQL_STMT * stmt);
+my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt);
+my_bool STDCALL mysql_stmt_send_long_data(MYSQL_STMT *stmt, 
+                                          unsigned int param_number,
+                                          const char *data, 
+                                          unsigned long length);
+MYSQL_RES *STDCALL mysql_stmt_result_metadata(MYSQL_STMT *stmt);
+MYSQL_RES *STDCALL mysql_stmt_param_metadata(MYSQL_STMT *stmt);
+unsigned int STDCALL mysql_stmt_errno(MYSQL_STMT * stmt);
+const char *STDCALL mysql_stmt_error(MYSQL_STMT * stmt);
+const char *STDCALL mysql_stmt_sqlstate(MYSQL_STMT * stmt);
+MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_seek(MYSQL_STMT *stmt, 
+                                             MYSQL_ROW_OFFSET offset);
+MYSQL_ROW_OFFSET STDCALL mysql_stmt_row_tell(MYSQL_STMT *stmt);
+void STDCALL mysql_stmt_data_seek(MYSQL_STMT *stmt, my_ulonglong offset);
+my_ulonglong STDCALL mysql_stmt_num_rows(MYSQL_STMT *stmt);
+my_ulonglong STDCALL mysql_stmt_affected_rows(MYSQL_STMT *stmt);
+my_ulonglong STDCALL mysql_stmt_insert_id(MYSQL_STMT *stmt);
+unsigned int STDCALL mysql_stmt_field_count(MYSQL_STMT *stmt);
+
+my_bool STDCALL mysql_commit(MYSQL * mysql);
+my_bool STDCALL mysql_rollback(MYSQL * mysql);
+my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
+my_bool STDCALL mysql_more_results(MYSQL *mysql);
+int STDCALL mysql_next_result(MYSQL *mysql);
+void STDCALL mysql_close(MYSQL *sock);
+
+
+/* status return codes */
+#define MYSQL_NO_DATA      100
+
+#define mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
+
+#ifdef USE_OLD_FUNCTIONS
+MYSQL *		STDCALL mysql_connect(MYSQL *mysql, const char *host,
+				      const char *user, const char *passwd);
+int		STDCALL mysql_create_db(MYSQL *mysql, const char *DB);
+int		STDCALL mysql_drop_db(MYSQL *mysql, const char *DB);
+#define	 mysql_reload(mysql) mysql_refresh((mysql),REFRESH_GRANT)
+#endif
+#define HAVE_MYSQL_REAL_CONNECT
+
+/*
+  The following functions are mainly exported because of mysqlbinlog;
+  They are not for general usage
+*/
+
+#define simple_command(mysql, command, arg, length, skip_check) \
+  (*(mysql)->methods->advanced_command)(mysql, command,         \
+					NullS, 0, arg, length, skip_check)
+unsigned long net_safe_read(MYSQL* mysql);
+
+#ifdef __NETWARE__
+#pragma pack(pop)		/* restore alignment */
+#endif
+
+#ifdef	__cplusplus
+}
+#endif
+
+#endif /* _mysql_h */
diff --git a/src/terralib/drivers/MySQL/include/mysql_com.h b/src/terralib/drivers/MySQL/include/mysql_com.h
new file mode 100644
index 0000000..4686acc
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_com.h
@@ -0,0 +1,402 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/*
+** Common definition between mysql server & client
+*/
+
+#ifndef _mysql_com_h
+#define _mysql_com_h
+
+#define NAME_LEN	64		/* Field/table name length */
+#define HOSTNAME_LENGTH 60
+#define USERNAME_LENGTH 16
+#define SERVER_VERSION_LENGTH 60
+#define SQLSTATE_LENGTH 5
+
+#define LOCAL_HOST	"localhost"
+#define LOCAL_HOST_NAMEDPIPE "."
+
+
+#if defined(__WIN__) && !defined( _CUSTOMCONFIG_)
+#define MYSQL_NAMEDPIPE "MySQL"
+#define MYSQL_SERVICENAME "MySQL"
+#endif /* __WIN__ */
+
+enum enum_server_command
+{
+  COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
+  COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
+  COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
+  COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
+  COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
+  COM_PREPARE, COM_EXECUTE, COM_LONG_DATA, COM_CLOSE_STMT,
+  COM_RESET_STMT, COM_SET_OPTION,
+  /* don't forget to update const char *command_name[] in sql_parse.cc */
+
+  /* Must be last */
+  COM_END
+};
+
+
+/*
+  Length of random string sent by server on handshake; this is also length of
+  obfuscated password, recieved from client
+*/
+#define SCRAMBLE_LENGTH 20
+#define SCRAMBLE_LENGTH_323 8
+/* length of password stored in the db: new passwords are preceeded with '*' */
+#define SCRAMBLED_PASSWORD_CHAR_LENGTH (SCRAMBLE_LENGTH*2+1)
+#define SCRAMBLED_PASSWORD_CHAR_LENGTH_323 (SCRAMBLE_LENGTH_323*2)
+
+
+#define NOT_NULL_FLAG	1		/* Field can't be NULL */
+#define PRI_KEY_FLAG	2		/* Field is part of a primary key */
+#define UNIQUE_KEY_FLAG 4		/* Field is part of a unique key */
+#define MULTIPLE_KEY_FLAG 8		/* Field is part of a key */
+#define BLOB_FLAG	16		/* Field is a blob */
+#define UNSIGNED_FLAG	32		/* Field is unsigned */
+#define ZEROFILL_FLAG	64		/* Field is zerofill */
+#define BINARY_FLAG	128		/* Field is binary   */
+
+/* The following are only sent to new clients */
+#define ENUM_FLAG	256		/* field is an enum */
+#define AUTO_INCREMENT_FLAG 512		/* field is a autoincrement field */
+#define TIMESTAMP_FLAG	1024		/* Field is a timestamp */
+#define SET_FLAG	2048		/* field is a set */
+#define NUM_FLAG	32768		/* Field is num (for clients) */
+#define PART_KEY_FLAG	16384		/* Intern; Part of some key */
+#define GROUP_FLAG	32768		/* Intern: Group field */
+#define UNIQUE_FLAG	65536		/* Intern: Used by sql_yacc */
+#define BINCMP_FLAG	131072		/* Intern: Used by sql_yacc */
+
+#define REFRESH_GRANT		1	/* Refresh grant tables */
+#define REFRESH_LOG		2	/* Start on new log file */
+#define REFRESH_TABLES		4	/* close all tables */
+#define REFRESH_HOSTS		8	/* Flush host cache */
+#define REFRESH_STATUS		16	/* Flush status variables */
+#define REFRESH_THREADS		32	/* Flush thread cache */
+#define REFRESH_SLAVE           64      /* Reset master info and restart slave
+					   thread */
+#define REFRESH_MASTER          128     /* Remove all bin logs in the index
+					   and truncate the index */
+
+/* The following can't be set with mysql_refresh() */
+#define REFRESH_READ_LOCK	16384	/* Lock tables for read */
+#define REFRESH_FAST		32768	/* Intern flag */
+
+/* RESET (remove all queries) from query cache */
+#define REFRESH_QUERY_CACHE	65536
+#define REFRESH_QUERY_CACHE_FREE 0x20000L /* pack query cache */
+#define REFRESH_DES_KEY_FILE	0x40000L
+#define REFRESH_USER_RESOURCES	0x80000L
+
+#define CLIENT_LONG_PASSWORD	1	/* new more secure passwords */
+#define CLIENT_FOUND_ROWS	2	/* Found instead of affected rows */
+#define CLIENT_LONG_FLAG	4	/* Get all column flags */
+#define CLIENT_CONNECT_WITH_DB	8	/* One can specify db on connect */
+#define CLIENT_NO_SCHEMA	16	/* Don't allow database.table.column */
+#define CLIENT_COMPRESS		32	/* Can use compression protocol */
+#define CLIENT_ODBC		64	/* Odbc client */
+#define CLIENT_LOCAL_FILES	128	/* Can use LOAD DATA LOCAL */
+#define CLIENT_IGNORE_SPACE	256	/* Ignore spaces before '(' */
+#define CLIENT_PROTOCOL_41	512	/* New 4.1 protocol */
+#define CLIENT_INTERACTIVE	1024	/* This is an interactive client */
+#define CLIENT_SSL              2048	/* Switch to SSL after handshake */
+#define CLIENT_IGNORE_SIGPIPE   4096    /* IGNORE sigpipes */
+#define CLIENT_TRANSACTIONS	8192	/* Client knows about transactions */
+#define CLIENT_RESERVED         16384   /* Old flag for 4.1 protocol  */
+#define CLIENT_SECURE_CONNECTION 32768  /* New 4.1 authentication */
+#define CLIENT_MULTI_STATEMENTS 65536   /* Enable/disable multi-stmt support */
+#define CLIENT_MULTI_RESULTS    131072  /* Enable/disable multi-results */
+#define CLIENT_REMEMBER_OPTIONS	(((ulong) 1) << 31)
+
+#define SERVER_STATUS_IN_TRANS     1	/* Transaction has started */
+#define SERVER_STATUS_AUTOCOMMIT   2	/* Server in auto_commit mode */
+#define SERVER_STATUS_MORE_RESULTS 4	/* More results on server */
+#define SERVER_MORE_RESULTS_EXISTS 8    /* Multi query - next query exists */
+#define SERVER_QUERY_NO_GOOD_INDEX_USED 16
+#define SERVER_QUERY_NO_INDEX_USED      32
+
+#define MYSQL_ERRMSG_SIZE	512
+#define NET_READ_TIMEOUT	30		/* Timeout on read */
+#define NET_WRITE_TIMEOUT	60		/* Timeout on write */
+#define NET_WAIT_TIMEOUT	8*60*60		/* Wait for new query */
+
+struct st_vio;					/* Only C */
+typedef struct st_vio Vio;
+
+#define MAX_TINYINT_WIDTH       3       /* Max width for a TINY w.o. sign */
+#define MAX_SMALLINT_WIDTH      5       /* Max width for a SHORT w.o. sign */
+#define MAX_MEDIUMINT_WIDTH     8       /* Max width for a INT24 w.o. sign */
+#define MAX_INT_WIDTH           10      /* Max width for a LONG w.o. sign */
+#define MAX_BIGINT_WIDTH        20      /* Max width for a LONGLONG */
+#define MAX_CHAR_WIDTH		255	/* Max length for a CHAR colum */
+#define MAX_BLOB_WIDTH		8192	/* Default width for blob */
+
+typedef struct st_net {
+#if !defined(CHECK_EMBEDDED_DIFFERENCES) || !defined(EMBEDDED_LIBRARY)
+  Vio* vio;
+  unsigned char *buff,*buff_end,*write_pos,*read_pos;
+  my_socket fd;					/* For Perl DBI/dbd */
+  unsigned long max_packet,max_packet_size;
+  unsigned int pkt_nr,compress_pkt_nr;
+  unsigned int write_timeout, read_timeout, retry_count;
+  int fcntl;
+  my_bool compress;
+  /*
+    The following variable is set if we are doing several queries in one
+    command ( as in LOAD TABLE ... FROM MASTER ),
+    and do not want to confuse the client with OK at the wrong time
+  */
+  unsigned long remain_in_buf,length, buf_length, where_b;
+  unsigned int *return_status;
+  unsigned char reading_or_writing;
+  char save_char;
+  my_bool no_send_ok;
+  /*
+    Pointer to query object in query cache, do not equal NULL (0) for
+    queries in cache that have not stored its results yet
+  */
+#endif
+  char last_error[MYSQL_ERRMSG_SIZE], sqlstate[SQLSTATE_LENGTH+1];
+  unsigned int last_errno;
+  unsigned char error;
+  gptr query_cache_query;
+  my_bool report_error; /* We should report error (we have unreported error) */
+  my_bool return_errno;
+} NET;
+
+#define packet_error (~(unsigned long) 0)
+
+enum enum_field_types { MYSQL_TYPE_DECIMAL, MYSQL_TYPE_TINY,
+			MYSQL_TYPE_SHORT,  MYSQL_TYPE_LONG,
+			MYSQL_TYPE_FLOAT,  MYSQL_TYPE_DOUBLE,
+			MYSQL_TYPE_NULL,   MYSQL_TYPE_TIMESTAMP,
+			MYSQL_TYPE_LONGLONG,MYSQL_TYPE_INT24,
+			MYSQL_TYPE_DATE,   MYSQL_TYPE_TIME,
+			MYSQL_TYPE_DATETIME, MYSQL_TYPE_YEAR,
+			MYSQL_TYPE_NEWDATE,
+			MYSQL_TYPE_ENUM=247,
+			MYSQL_TYPE_SET=248,
+			MYSQL_TYPE_TINY_BLOB=249,
+			MYSQL_TYPE_MEDIUM_BLOB=250,
+			MYSQL_TYPE_LONG_BLOB=251,
+			MYSQL_TYPE_BLOB=252,
+			MYSQL_TYPE_VAR_STRING=253,
+			MYSQL_TYPE_STRING=254,
+			MYSQL_TYPE_GEOMETRY=255
+
+};
+
+/* For backward compatibility */
+#define CLIENT_MULTI_QUERIES    CLIENT_MULTI_STATEMENTS    
+#define FIELD_TYPE_DECIMAL     MYSQL_TYPE_DECIMAL
+#define FIELD_TYPE_TINY        MYSQL_TYPE_TINY
+#define FIELD_TYPE_SHORT       MYSQL_TYPE_SHORT
+#define FIELD_TYPE_LONG        MYSQL_TYPE_LONG
+#define FIELD_TYPE_FLOAT       MYSQL_TYPE_FLOAT
+#define FIELD_TYPE_DOUBLE      MYSQL_TYPE_DOUBLE
+#define FIELD_TYPE_NULL        MYSQL_TYPE_NULL
+#define FIELD_TYPE_TIMESTAMP   MYSQL_TYPE_TIMESTAMP
+#define FIELD_TYPE_LONGLONG    MYSQL_TYPE_LONGLONG
+#define FIELD_TYPE_INT24       MYSQL_TYPE_INT24
+#define FIELD_TYPE_DATE        MYSQL_TYPE_DATE
+#define FIELD_TYPE_TIME        MYSQL_TYPE_TIME
+#define FIELD_TYPE_DATETIME    MYSQL_TYPE_DATETIME
+#define FIELD_TYPE_YEAR        MYSQL_TYPE_YEAR
+#define FIELD_TYPE_NEWDATE     MYSQL_TYPE_NEWDATE
+#define FIELD_TYPE_ENUM        MYSQL_TYPE_ENUM
+#define FIELD_TYPE_SET         MYSQL_TYPE_SET
+#define FIELD_TYPE_TINY_BLOB   MYSQL_TYPE_TINY_BLOB
+#define FIELD_TYPE_MEDIUM_BLOB MYSQL_TYPE_MEDIUM_BLOB
+#define FIELD_TYPE_LONG_BLOB   MYSQL_TYPE_LONG_BLOB
+#define FIELD_TYPE_BLOB        MYSQL_TYPE_BLOB
+#define FIELD_TYPE_VAR_STRING  MYSQL_TYPE_VAR_STRING
+#define FIELD_TYPE_STRING      MYSQL_TYPE_STRING
+#define FIELD_TYPE_CHAR        MYSQL_TYPE_TINY
+#define FIELD_TYPE_INTERVAL    MYSQL_TYPE_ENUM
+#define FIELD_TYPE_GEOMETRY    MYSQL_TYPE_GEOMETRY
+
+
+/* Shutdown/kill enums and constants */ 
+
+/* Bits for THD::killable. */
+#define MYSQL_SHUTDOWN_KILLABLE_CONNECT    (unsigned char)(1 << 0)
+#define MYSQL_SHUTDOWN_KILLABLE_TRANS      (unsigned char)(1 << 1)
+#define MYSQL_SHUTDOWN_KILLABLE_LOCK_TABLE (unsigned char)(1 << 2)
+#define MYSQL_SHUTDOWN_KILLABLE_UPDATE     (unsigned char)(1 << 3)
+
+enum mysql_enum_shutdown_level {
+  /*
+    We want levels to be in growing order of hardness (because we use number
+    comparisons). Note that DEFAULT does not respect the growing property, but
+    it's ok.
+  */
+  SHUTDOWN_DEFAULT = 0,
+  /* wait for existing connections to finish */
+  SHUTDOWN_WAIT_CONNECTIONS= MYSQL_SHUTDOWN_KILLABLE_CONNECT,
+  /* wait for existing trans to finish */
+  SHUTDOWN_WAIT_TRANSACTIONS= MYSQL_SHUTDOWN_KILLABLE_TRANS,
+  /* wait for existing updates to finish (=> no partial MyISAM update) */
+  SHUTDOWN_WAIT_UPDATES= MYSQL_SHUTDOWN_KILLABLE_UPDATE,
+  /* flush InnoDB buffers and other storage engines' buffers*/
+  SHUTDOWN_WAIT_ALL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1),
+  /* don't flush InnoDB buffers, flush other storage engines' buffers*/
+  SHUTDOWN_WAIT_CRITICAL_BUFFERS= (MYSQL_SHUTDOWN_KILLABLE_UPDATE << 1) + 1,
+  /* Now the 2 levels of the KILL command */
+#if MYSQL_VERSION_ID >= 50000
+  KILL_QUERY= 254,
+#endif
+  KILL_CONNECTION= 255
+};
+
+/* options for mysql_set_option */
+enum enum_mysql_set_option
+{
+  MYSQL_OPTION_MULTI_STATEMENTS_ON,
+  MYSQL_OPTION_MULTI_STATEMENTS_OFF
+};
+
+#define net_new_transaction(net) ((net)->pkt_nr=0)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+my_bool	my_net_init(NET *net, Vio* vio);
+void	my_net_local_init(NET *net);
+void	net_end(NET *net);
+void	net_clear(NET *net);
+my_bool net_realloc(NET *net, unsigned long length);
+
+#ifndef EMBEDDED_LIBRARY /* To be removed by HF */
+my_bool	net_flush(NET *net);
+#else
+#define net_flush(A)
+#endif
+
+my_bool	my_net_write(NET *net,const char *packet,unsigned long len);
+my_bool	net_write_command(NET *net,unsigned char command,
+			  const char *header, unsigned long head_len,
+			  const char *packet, unsigned long len);
+int	net_real_write(NET *net,const char *packet,unsigned long len);
+unsigned long my_net_read(NET *net);
+
+/*
+  The following function is not meant for normal usage
+  Currently it's used internally by manager.c
+*/
+struct sockaddr;
+int my_connect(my_socket s, const struct sockaddr *name, unsigned int namelen,
+	       unsigned int timeout);
+
+struct rand_struct {
+  unsigned long seed1,seed2,max_value;
+  double max_value_dbl;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+  /* The following is for user defined functions */
+
+enum Item_result {STRING_RESULT, REAL_RESULT, INT_RESULT, ROW_RESULT};
+
+typedef struct st_udf_args
+{
+  unsigned int arg_count;		/* Number of arguments */
+  enum Item_result *arg_type;		/* Pointer to item_results */
+  char **args;				/* Pointer to argument */
+  unsigned long *lengths;		/* Length of string arguments */
+  char *maybe_null;			/* Set to 1 for all maybe_null args */
+} UDF_ARGS;
+
+  /* This holds information about the result */
+
+typedef struct st_udf_init
+{
+  my_bool maybe_null;			/* 1 if function can return NULL */
+  unsigned int decimals;		/* for real functions */
+  unsigned long max_length;		/* For string functions */
+  char	  *ptr;				/* free pointer for function data */
+  my_bool const_item;			/* 0 if result is independent of arguments */
+} UDF_INIT;
+
+  /* Constants when using compression */
+#define NET_HEADER_SIZE 4		/* standard header size */
+#define COMP_HEADER_SIZE 3		/* compression header extra size */
+
+  /* Prototypes to password functions */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+  These functions are used for authentication by client and server and
+  implemented in sql/password.c
+*/
+
+void randominit(struct rand_struct *, unsigned long seed1,
+                unsigned long seed2);
+double my_rnd(struct rand_struct *);
+void create_random_string(char *to, unsigned int length, struct rand_struct *rand_st);
+
+void hash_password(unsigned long *to, const char *password, unsigned int password_len);
+void make_scrambled_password_323(char *to, const char *password);
+void scramble_323(char *to, const char *message, const char *password);
+my_bool check_scramble_323(const char *, const char *message,
+                           unsigned long *salt);
+void get_salt_from_password_323(unsigned long *res, const char *password);
+void make_password_from_salt_323(char *to, const unsigned long *salt);
+
+void make_scrambled_password(char *to, const char *password);
+void scramble(char *to, const char *message, const char *password);
+my_bool check_scramble(const char *reply, const char *message,
+                       const unsigned char *hash_stage2);
+void get_salt_from_password(unsigned char *res, const char *password);
+void make_password_from_salt(char *to, const unsigned char *hash_stage2);
+
+/* end of password.c */
+
+char *get_tty_password(char *opt_message);
+const char *mysql_errno_to_sqlstate(unsigned int mysql_errno);
+
+/* Some other useful functions */
+
+my_bool my_init(void);
+int load_defaults(const char *conf_file, const char **groups,
+		  int *argc, char ***argv);
+my_bool my_thread_init(void);
+void my_thread_end(void);
+
+#ifdef _global_h
+ulong STDCALL net_field_length(uchar **packet);
+my_ulonglong net_field_length_ll(uchar **packet);
+char *net_store_length(char *pkg, ulonglong length);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#define NULL_LENGTH ((unsigned long) ~0) /* For net_store_length */
+#define MYSQL_STMT_HEADER       4
+#define MYSQL_LONG_DATA_HEADER  6
+
+#endif
diff --git a/src/terralib/drivers/MySQL/include/mysql_embed.h b/src/terralib/drivers/MySQL/include/mysql_embed.h
new file mode 100644
index 0000000..603af8e
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_embed.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Defines that are unique to the embedded version of MySQL */
+
+#ifdef EMBEDDED_LIBRARY
+
+/* Things we don't need in the embedded version of MySQL */
+/* TODO HF add #undef HAVE_VIO if we don't want client in embedded library */
+
+#undef HAVE_PSTACK				/* No stacktrace */
+#undef HAVE_DLOPEN				/* No udf functions */
+#undef HAVE_OPENSSL
+#undef HAVE_ISAM
+#undef HAVE_SMEM				/* No shared memory */
+#undef HAVE_NDBCLUSTER_DB /* No NDB cluster */
+
+#define DONT_USE_RAID
+
+#endif /* EMBEDDED_LIBRARY */
diff --git a/src/terralib/drivers/MySQL/include/mysql_time.h b/src/terralib/drivers/MySQL/include/mysql_time.h
new file mode 100644
index 0000000..ec67d60
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_time.h
@@ -0,0 +1,44 @@
+/* Copyright (C) 2004 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+#ifndef _mysql_time_h_
+#define _mysql_time_h_
+
+/*
+  Time declarations shared between the server and client API:
+  you should not add anything to this header unless it's used
+  (and hence should be visible) in mysql.h.
+  If you're looking for a place to add new time-related declaration,
+  it's most likely my_time.h. See also "C API Handling of Date
+  and Time Values" chapter in documentation.
+*/
+
+enum enum_mysql_timestamp_type
+{
+  MYSQL_TIMESTAMP_NONE= -2, MYSQL_TIMESTAMP_ERROR= -1,
+  MYSQL_TIMESTAMP_DATE= 0, MYSQL_TIMESTAMP_DATETIME= 1, MYSQL_TIMESTAMP_TIME= 2
+};
+
+
+typedef struct st_mysql_time
+{
+  unsigned int  year, month, day, hour, minute, second;
+  unsigned long second_part;
+  my_bool       neg;
+  enum enum_mysql_timestamp_type time_type;
+} MYSQL_TIME;
+
+#endif /* _mysql_time_h_ */
diff --git a/src/terralib/drivers/MySQL/include/mysql_version.h b/src/terralib/drivers/MySQL/include/mysql_version.h
new file mode 100644
index 0000000..6b53ce0
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysql_version.h
@@ -0,0 +1,29 @@
+/* Copyright Abandoned 1996, 1999, 2001 MySQL AB
+   This file is public domain and comes with NO WARRANTY of any kind */
+
+/* Version numbers for protocol & mysqld */
+
+#ifndef _mysql_version_h
+#define _mysql_version_h
+#ifdef _CUSTOMCONFIG_
+#include <custom_conf.h>
+#else
+#define PROTOCOL_VERSION		10
+#define MYSQL_SERVER_VERSION		"4.1.7"
+#define MYSQL_BASE_VERSION		"mysqld-4.1"
+#define MYSQL_SERVER_SUFFIX_DEF		""
+#define FRM_VER				6
+#define MYSQL_VERSION_ID		40107
+#define MYSQL_PORT			3306
+#define MYSQL_UNIX_ADDR			"/tmp/mysql.sock"
+#define MYSQL_CONFIG_NAME		"my"
+#define MYSQL_COMPILATION_COMMENT	"Source distribution"
+
+/* mysqld compile time options */
+#endif /* _CUSTOMCONFIG_ */
+
+#ifndef LICENSE
+#define LICENSE				GPL
+#endif /* LICENSE */
+
+#endif /* _mysql_version_h */
diff --git a/src/terralib/drivers/MySQL/include/mysqld_error.h b/src/terralib/drivers/MySQL/include/mysqld_error.h
new file mode 100644
index 0000000..776869f
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/mysqld_error.h
@@ -0,0 +1,322 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Definefile for error messagenumbers */
+
+#define ER_HASHCHK 1000
+#define ER_NISAMCHK 1001
+#define ER_NO 1002
+#define ER_YES 1003
+#define ER_CANT_CREATE_FILE 1004
+#define ER_CANT_CREATE_TABLE 1005
+#define ER_CANT_CREATE_DB 1006
+#define ER_DB_CREATE_EXISTS 1007
+#define ER_DB_DROP_EXISTS 1008
+#define ER_DB_DROP_DELETE 1009
+#define ER_DB_DROP_RMDIR 1010
+#define ER_CANT_DELETE_FILE 1011
+#define ER_CANT_FIND_SYSTEM_REC 1012
+#define ER_CANT_GET_STAT 1013
+#define ER_CANT_GET_WD 1014
+#define ER_CANT_LOCK 1015
+#define ER_CANT_OPEN_FILE 1016
+#define ER_FILE_NOT_FOUND 1017
+#define ER_CANT_READ_DIR 1018
+#define ER_CANT_SET_WD 1019
+#define ER_CHECKREAD 1020
+#define ER_DISK_FULL 1021
+#define ER_DUP_KEY 1022
+#define ER_ERROR_ON_CLOSE 1023
+#define ER_ERROR_ON_READ 1024
+#define ER_ERROR_ON_RENAME 1025
+#define ER_ERROR_ON_WRITE 1026
+#define ER_FILE_USED 1027
+#define ER_FILSORT_ABORT 1028
+#define ER_FORM_NOT_FOUND 1029
+#define ER_GET_ERRNO 1030
+#define ER_ILLEGAL_HA 1031
+#define ER_KEY_NOT_FOUND 1032
+#define ER_NOT_FORM_FILE 1033
+#define ER_NOT_KEYFILE 1034
+#define ER_OLD_KEYFILE 1035
+#define ER_OPEN_AS_READONLY 1036
+#define ER_OUTOFMEMORY 1037
+#define ER_OUT_OF_SORTMEMORY 1038
+#define ER_UNEXPECTED_EOF 1039
+#define ER_CON_COUNT_ERROR 1040
+#define ER_OUT_OF_RESOURCES 1041
+#define ER_BAD_HOST_ERROR 1042
+#define ER_HANDSHAKE_ERROR 1043
+#define ER_DBACCESS_DENIED_ERROR 1044
+#define ER_ACCESS_DENIED_ERROR 1045
+#define ER_NO_DB_ERROR 1046
+#define ER_UNKNOWN_COM_ERROR 1047
+#define ER_BAD_NULL_ERROR 1048
+#define ER_BAD_DB_ERROR 1049
+#define ER_TABLE_EXISTS_ERROR 1050
+#define ER_BAD_TABLE_ERROR 1051
+#define ER_NON_UNIQ_ERROR 1052
+#define ER_SERVER_SHUTDOWN 1053
+#define ER_BAD_FIELD_ERROR 1054
+#define ER_WRONG_FIELD_WITH_GROUP 1055
+#define ER_WRONG_GROUP_FIELD 1056
+#define ER_WRONG_SUM_SELECT 1057
+#define ER_WRONG_VALUE_COUNT 1058
+#define ER_TOO_LONG_IDENT 1059
+#define ER_DUP_FIELDNAME 1060
+#define ER_DUP_KEYNAME 1061
+#define ER_DUP_ENTRY 1062
+#define ER_WRONG_FIELD_SPEC 1063
+#define ER_PARSE_ERROR 1064
+#define ER_EMPTY_QUERY 1065
+#define ER_NONUNIQ_TABLE 1066
+#define ER_INVALID_DEFAULT 1067
+#define ER_MULTIPLE_PRI_KEY 1068
+#define ER_TOO_MANY_KEYS 1069
+#define ER_TOO_MANY_KEY_PARTS 1070
+#define ER_TOO_LONG_KEY 1071
+#define ER_KEY_COLUMN_DOES_NOT_EXITS 1072
+#define ER_BLOB_USED_AS_KEY 1073
+#define ER_TOO_BIG_FIELDLENGTH 1074
+#define ER_WRONG_AUTO_KEY 1075
+#define ER_READY 1076
+#define ER_NORMAL_SHUTDOWN 1077
+#define ER_GOT_SIGNAL 1078
+#define ER_SHUTDOWN_COMPLETE 1079
+#define ER_FORCING_CLOSE 1080
+#define ER_IPSOCK_ERROR 1081
+#define ER_NO_SUCH_INDEX 1082
+#define ER_WRONG_FIELD_TERMINATORS 1083
+#define ER_BLOBS_AND_NO_TERMINATED 1084
+#define ER_TEXTFILE_NOT_READABLE 1085
+#define ER_FILE_EXISTS_ERROR 1086
+#define ER_LOAD_INFO 1087
+#define ER_ALTER_INFO 1088
+#define ER_WRONG_SUB_KEY 1089
+#define ER_CANT_REMOVE_ALL_FIELDS 1090
+#define ER_CANT_DROP_FIELD_OR_KEY 1091
+#define ER_INSERT_INFO 1092
+#define ER_UPDATE_TABLE_USED 1093
+#define ER_NO_SUCH_THREAD 1094
+#define ER_KILL_DENIED_ERROR 1095
+#define ER_NO_TABLES_USED 1096
+#define ER_TOO_BIG_SET 1097
+#define ER_NO_UNIQUE_LOGFILE 1098
+#define ER_TABLE_NOT_LOCKED_FOR_WRITE 1099
+#define ER_TABLE_NOT_LOCKED 1100
+#define ER_BLOB_CANT_HAVE_DEFAULT 1101
+#define ER_WRONG_DB_NAME 1102
+#define ER_WRONG_TABLE_NAME 1103
+#define ER_TOO_BIG_SELECT 1104
+#define ER_UNKNOWN_ERROR 1105
+#define ER_UNKNOWN_PROCEDURE 1106
+#define ER_WRONG_PARAMCOUNT_TO_PROCEDURE 1107
+#define ER_WRONG_PARAMETERS_TO_PROCEDURE 1108
+#define ER_UNKNOWN_TABLE 1109
+#define ER_FIELD_SPECIFIED_TWICE 1110
+#define ER_INVALID_GROUP_FUNC_USE 1111
+#define ER_UNSUPPORTED_EXTENSION 1112
+#define ER_TABLE_MUST_HAVE_COLUMNS 1113
+#define ER_RECORD_FILE_FULL 1114
+#define ER_UNKNOWN_CHARACTER_SET 1115
+#define ER_TOO_MANY_TABLES 1116
+#define ER_TOO_MANY_FIELDS 1117
+#define ER_TOO_BIG_ROWSIZE 1118
+#define ER_STACK_OVERRUN 1119
+#define ER_WRONG_OUTER_JOIN 1120
+#define ER_NULL_COLUMN_IN_INDEX 1121
+#define ER_CANT_FIND_UDF 1122
+#define ER_CANT_INITIALIZE_UDF 1123
+#define ER_UDF_NO_PATHS 1124
+#define ER_UDF_EXISTS 1125
+#define ER_CANT_OPEN_LIBRARY 1126
+#define ER_CANT_FIND_DL_ENTRY 1127
+#define ER_FUNCTION_NOT_DEFINED 1128
+#define ER_HOST_IS_BLOCKED 1129
+#define ER_HOST_NOT_PRIVILEGED 1130
+#define ER_PASSWORD_ANONYMOUS_USER 1131
+#define ER_PASSWORD_NOT_ALLOWED 1132
+#define ER_PASSWORD_NO_MATCH 1133
+#define ER_UPDATE_INFO 1134
+#define ER_CANT_CREATE_THREAD 1135
+#define ER_WRONG_VALUE_COUNT_ON_ROW 1136
+#define ER_CANT_REOPEN_TABLE 1137
+#define ER_INVALID_USE_OF_NULL 1138
+#define ER_REGEXP_ERROR 1139
+#define ER_MIX_OF_GROUP_FUNC_AND_FIELDS 1140
+#define ER_NONEXISTING_GRANT 1141
+#define ER_TABLEACCESS_DENIED_ERROR 1142
+#define ER_COLUMNACCESS_DENIED_ERROR 1143
+#define ER_ILLEGAL_GRANT_FOR_TABLE 1144
+#define ER_GRANT_WRONG_HOST_OR_USER 1145
+#define ER_NO_SUCH_TABLE 1146
+#define ER_NONEXISTING_TABLE_GRANT 1147
+#define ER_NOT_ALLOWED_COMMAND 1148
+#define ER_SYNTAX_ERROR 1149
+#define ER_DELAYED_CANT_CHANGE_LOCK 1150
+#define ER_TOO_MANY_DELAYED_THREADS 1151
+#define ER_ABORTING_CONNECTION 1152
+#define ER_NET_PACKET_TOO_LARGE 1153
+#define ER_NET_READ_ERROR_FROM_PIPE 1154
+#define ER_NET_FCNTL_ERROR 1155
+#define ER_NET_PACKETS_OUT_OF_ORDER 1156
+#define ER_NET_UNCOMPRESS_ERROR 1157
+#define ER_NET_READ_ERROR 1158
+#define ER_NET_READ_INTERRUPTED 1159
+#define ER_NET_ERROR_ON_WRITE 1160
+#define ER_NET_WRITE_INTERRUPTED 1161
+#define ER_TOO_LONG_STRING 1162
+#define ER_TABLE_CANT_HANDLE_BLOB 1163
+#define ER_TABLE_CANT_HANDLE_AUTO_INCREMENT 1164
+#define ER_DELAYED_INSERT_TABLE_LOCKED 1165
+#define ER_WRONG_COLUMN_NAME 1166
+#define ER_WRONG_KEY_COLUMN 1167
+#define ER_WRONG_MRG_TABLE 1168
+#define ER_DUP_UNIQUE 1169
+#define ER_BLOB_KEY_WITHOUT_LENGTH 1170
+#define ER_PRIMARY_CANT_HAVE_NULL 1171
+#define ER_TOO_MANY_ROWS 1172
+#define ER_REQUIRES_PRIMARY_KEY 1173
+#define ER_NO_RAID_COMPILED 1174
+#define ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE 1175
+#define ER_KEY_DOES_NOT_EXITS 1176
+#define ER_CHECK_NO_SUCH_TABLE 1177
+#define ER_CHECK_NOT_IMPLEMENTED 1178
+#define ER_CANT_DO_THIS_DURING_AN_TRANSACTION 1179
+#define ER_ERROR_DURING_COMMIT 1180
+#define ER_ERROR_DURING_ROLLBACK 1181
+#define ER_ERROR_DURING_FLUSH_LOGS 1182
+#define ER_ERROR_DURING_CHECKPOINT 1183
+#define ER_NEW_ABORTING_CONNECTION 1184
+#define ER_DUMP_NOT_IMPLEMENTED    1185
+#define ER_FLUSH_MASTER_BINLOG_CLOSED 1186
+#define ER_INDEX_REBUILD  1187
+#define ER_MASTER 1188
+#define ER_MASTER_NET_READ 1189
+#define ER_MASTER_NET_WRITE 1190
+#define ER_FT_MATCHING_KEY_NOT_FOUND 1191
+#define ER_LOCK_OR_ACTIVE_TRANSACTION 1192
+#define ER_UNKNOWN_SYSTEM_VARIABLE 1193
+#define ER_CRASHED_ON_USAGE 1194
+#define ER_CRASHED_ON_REPAIR 1195
+#define ER_WARNING_NOT_COMPLETE_ROLLBACK 1196
+#define ER_TRANS_CACHE_FULL 1197
+#define ER_SLAVE_MUST_STOP 1198
+#define ER_SLAVE_NOT_RUNNING 1199
+#define ER_BAD_SLAVE 1200
+#define ER_MASTER_INFO 1201
+#define ER_SLAVE_THREAD 1202
+#define ER_TOO_MANY_USER_CONNECTIONS 1203
+#define ER_SET_CONSTANTS_ONLY 1204
+#define ER_LOCK_WAIT_TIMEOUT 1205
+#define ER_LOCK_TABLE_FULL 1206
+#define ER_READ_ONLY_TRANSACTION 1207
+#define ER_DROP_DB_WITH_READ_LOCK 1208
+#define ER_CREATE_DB_WITH_READ_LOCK 1209
+#define ER_WRONG_ARGUMENTS 1210
+#define ER_NO_PERMISSION_TO_CREATE_USER 1211
+#define ER_UNION_TABLES_IN_DIFFERENT_DIR 1212
+#define ER_LOCK_DEADLOCK 1213
+#define ER_TABLE_CANT_HANDLE_FT 1214
+#define ER_CANNOT_ADD_FOREIGN 1215
+#define ER_NO_REFERENCED_ROW 1216
+#define ER_ROW_IS_REFERENCED 1217
+#define ER_CONNECT_TO_MASTER 1218
+#define ER_QUERY_ON_MASTER 1219
+#define ER_ERROR_WHEN_EXECUTING_COMMAND 1220
+#define ER_WRONG_USAGE 1221
+#define ER_WRONG_NUMBER_OF_COLUMNS_IN_SELECT 1222
+#define ER_CANT_UPDATE_WITH_READLOCK 1223
+#define ER_MIXING_NOT_ALLOWED 1224
+#define ER_DUP_ARGUMENT 1225
+#define ER_USER_LIMIT_REACHED 1226
+#define ER_SPECIFIC_ACCESS_DENIED_ERROR 1227
+#define ER_LOCAL_VARIABLE 1228
+#define ER_GLOBAL_VARIABLE 1229
+#define ER_NO_DEFAULT 1230
+#define ER_WRONG_VALUE_FOR_VAR 1231
+#define ER_WRONG_TYPE_FOR_VAR 1232
+#define ER_VAR_CANT_BE_READ 1233
+#define ER_CANT_USE_OPTION_HERE 1234
+#define ER_NOT_SUPPORTED_YET	1235
+#define ER_MASTER_FATAL_ERROR_READING_BINLOG 1236
+#define ER_SLAVE_IGNORED_TABLE 1237
+#define ER_INCORRECT_GLOBAL_LOCAL_VAR 1238
+#define ER_WRONG_FK_DEF 1239
+#define ER_KEY_REF_DO_NOT_MATCH_TABLE_REF 1240
+#define ER_OPERAND_COLUMNS 1241
+#define ER_SUBQUERY_NO_1_ROW 1242
+#define ER_UNKNOWN_STMT_HANDLER 1243
+#define ER_CORRUPT_HELP_DB 1244
+#define ER_CYCLIC_REFERENCE 1245
+#define ER_AUTO_CONVERT 1246
+#define ER_ILLEGAL_REFERENCE 1247
+#define ER_DERIVED_MUST_HAVE_ALIAS 1248
+#define ER_SELECT_REDUCED 1249
+#define ER_TABLENAME_NOT_ALLOWED_HERE 1250
+#define ER_NOT_SUPPORTED_AUTH_MODE 1251
+#define ER_SPATIAL_CANT_HAVE_NULL 1252
+#define ER_COLLATION_CHARSET_MISMATCH 1253
+#define ER_SLAVE_WAS_RUNNING 1254
+#define ER_SLAVE_WAS_NOT_RUNNING 1255
+#define ER_TOO_BIG_FOR_UNCOMPRESS 1256
+#define ER_ZLIB_Z_MEM_ERROR 1257
+#define ER_ZLIB_Z_BUF_ERROR 1258
+#define ER_ZLIB_Z_DATA_ERROR 1259
+#define ER_CUT_VALUE_GROUP_CONCAT 1260
+#define ER_WARN_TOO_FEW_RECORDS 1261
+#define ER_WARN_TOO_MANY_RECORDS 1262
+#define ER_WARN_NULL_TO_NOTNULL 1263
+#define ER_WARN_DATA_OUT_OF_RANGE 1264
+#define ER_WARN_DATA_TRUNCATED 1265
+#define ER_WARN_USING_OTHER_HANDLER 1266
+#define ER_CANT_AGGREGATE_2COLLATIONS 1267
+#define ER_DROP_USER 1268
+#define ER_REVOKE_GRANTS 1269
+#define ER_CANT_AGGREGATE_3COLLATIONS 1270
+#define ER_CANT_AGGREGATE_NCOLLATIONS 1271
+#define ER_VARIABLE_IS_NOT_STRUCT 1272
+#define ER_UNKNOWN_COLLATION 1273
+#define ER_SLAVE_IGNORED_SSL_PARAMS 1274
+#define ER_SERVER_IS_IN_SECURE_AUTH_MODE 1275
+#define ER_WARN_FIELD_RESOLVED 1276
+#define ER_BAD_SLAVE_UNTIL_COND 1277
+#define ER_MISSING_SKIP_SLAVE 1278
+#define ER_UNTIL_COND_IGNORED 1279
+#define ER_WRONG_NAME_FOR_INDEX 1280
+#define ER_WRONG_NAME_FOR_CATALOG 1281
+#define ER_WARN_QC_RESIZE 1282
+#define ER_BAD_FT_COLUMN 1283
+#define ER_UNKNOWN_KEY_CACHE 1284
+#define ER_WARN_HOSTNAME_WONT_WORK 1285
+#define ER_UNKNOWN_STORAGE_ENGINE 1286
+#define ER_WARN_DEPRECATED_SYNTAX 1287
+#define ER_NON_UPDATABLE_TABLE 1288
+#define ER_FEATURE_DISABLED 1289
+#define ER_OPTION_PREVENTS_STATEMENT 1290
+#define ER_DUPLICATED_VALUE_IN_TYPE 1291
+#define ER_TRUNCATED_WRONG_VALUE 1292
+#define ER_TOO_MUCH_AUTO_TIMESTAMP_COLS 1293
+#define ER_INVALID_ON_UPDATE 1294
+#define ER_UNSUPPORTED_PS 1295
+#define ER_GET_ERRMSG 1296
+#define ER_GET_TEMPORARY_ERRMSG 1297
+#define ER_UNKNOWN_TIME_ZONE 1298
+#define ER_WARN_INVALID_TIMESTAMP 1299
+#define ER_INVALID_CHARACTER_STRING 1300
+#define ER_WARN_ALLOWED_PACKET_OVERFLOWED 1301
+#define ER_CONFLICTING_DECLARATIONS 1302
+#define ER_ERROR_MESSAGES 303
diff --git a/src/terralib/drivers/MySQL/include/raid.h b/src/terralib/drivers/MySQL/include/raid.h
new file mode 100644
index 0000000..b5a5e66
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/raid.h
@@ -0,0 +1,158 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+/* Parser needs these defines  always, even if USE_RAID is not defined */
+#define RAID_TYPE_0 1       /* Striping */
+#define RAID_TYPE_x 2       /* Some new modes */
+#define RAID_TYPE_y 3
+
+#define RAID_DEFAULT_CHUNKS 4
+#define RAID_DEFAULT_CHUNKSIZE 256*1024 /* 256kB */
+
+C_MODE_START
+#define my_raid_type(raid_type)  raid_type_string[(int)(raid_type)]
+extern const char *raid_type_string[];
+C_MODE_END
+
+#ifdef DONT_USE_RAID
+#undef USE_RAID
+#endif
+#if defined(USE_RAID)
+
+#ifdef __GNUC__
+#pragma interface			/* gcc class implementation */
+#endif
+#include "my_dir.h"
+
+/* Trap all occurences of my_...() in source and use our wrapper around this function */
+
+#ifdef MAP_TO_USE_RAID
+#define my_read(A,B,C,D)     my_raid_read(A,B,C,D)
+#define my_write(A,B,C,D)    my_raid_write(A,B,C,D)
+#define my_pwrite(A,B,C,D,E) my_raid_pwrite(A,B,C,D,E)
+#define my_pread(A,B,C,D,E)  my_raid_pread(A,B,C,D,E)
+#define my_chsize(A,B,C,D)   my_raid_chsize(A,B,C,D)
+#define my_close(A,B)        my_raid_close(A,B)
+#define my_tell(A,B)         my_raid_tell(A,B)
+#define my_seek(A,B,C,D)     my_raid_seek(A,B,C,D)
+#define my_lock(A,B,C,D,E)     my_raid_lock(A,B,C,D,E)
+#define my_fstat(A,B,C)     my_raid_fstat(A,B,C)
+#endif /* MAP_TO_USE_RAID */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+  void init_raid(void);
+  void end_raid(void);
+
+  bool is_raid(File fd);
+  File my_raid_create(const char *FileName, int CreateFlags, int access_flags,
+		      uint raid_type, uint raid_chunks, ulong raid_chunksize,
+		      myf MyFlags);
+  File my_raid_open(const char *FileName, int Flags,
+		    uint raid_type, uint raid_chunks, ulong raid_chunksize,
+		    myf MyFlags);
+  int my_raid_rename(const char *from, const char *to, uint raid_chunks,
+		     myf MyFlags);
+  int my_raid_delete(const char *from, uint raid_chunks, myf MyFlags);
+  int my_raid_redel(const char *old_name, const char *new_name,
+		    uint raid_chunks, myf MyFlags);
+
+  my_off_t my_raid_seek(File fd, my_off_t pos, int whence, myf MyFlags);
+  my_off_t my_raid_tell(File fd, myf MyFlags);
+
+  uint my_raid_write(File,const byte *Buffer, uint Count, myf MyFlags);
+  uint my_raid_read(File Filedes, byte *Buffer, uint Count, myf MyFlags);
+
+  uint my_raid_pread(File Filedes, byte *Buffer, uint Count, my_off_t offset,
+		     myf MyFlags);
+  uint my_raid_pwrite(int Filedes, const byte *Buffer, uint Count,
+		      my_off_t offset, myf MyFlags);
+
+  int my_raid_lock(File,int locktype, my_off_t start, my_off_t length,
+		   myf MyFlags);
+  int my_raid_chsize(File fd, my_off_t newlength, int filler, myf MyFlags);
+  int my_raid_close(File, myf MyFlags);
+  int my_raid_fstat(int Filedes, struct stat *buf,  myf MyFlags);
+
+#ifdef __cplusplus
+}
+
+class RaidName {
+  public:
+    RaidName(const char *FileName);
+    ~RaidName();
+    bool IsRaid();
+    int Rename(const char * from, const char * to, myf MyFlags);
+  private:
+    uint _raid_type;       /* RAID_TYPE_0 or RAID_TYPE_1 or RAID_TYPE_5 */
+    uint _raid_chunks;     /* 1..n */
+    ulong _raid_chunksize; /* 1..n in bytes */
+};
+
+class RaidFd {
+  public:
+    RaidFd(uint raid_type, uint raid_chunks , ulong raid_chunksize);
+    ~RaidFd();
+    File Create(const char *FileName, int CreateFlags, int access_flags,
+		myf MyFlags);
+    File Open(const char *FileName, int Flags, myf MyFlags);
+    my_off_t Seek(my_off_t pos,int whence,myf MyFlags);
+    my_off_t Tell(myf MyFlags);
+    int Write(const byte *Buffer, uint Count, myf MyFlags);
+    int Read(const byte *Buffer, uint Count, myf MyFlags);
+    int Lock(int locktype, my_off_t start, my_off_t length, myf MyFlags);
+    int Chsize(File fd, my_off_t newlength, int filler, myf MyFlags);
+    int Fstat(int fd, MY_STAT *stat_area, myf MyFlags );
+    int Close(myf MyFlags);
+    static bool IsRaid(File fd);
+    static DYNAMIC_ARRAY _raid_map;		/* Map of RaidFD* */
+  private:
+
+    uint _raid_type;       /* RAID_TYPE_0 or RAID_TYPE_1 or RAID_TYPE_5 */
+    uint _raid_chunks;     /* 1..n */
+    ulong _raid_chunksize; /* 1..n in bytes */
+
+    ulong _total_block;    /* We are operating with block no x (can be 0..many). */
+    uint _this_block;      /* can be 0.._raid_chunks */
+    uint _remaining_bytes; /* Maximum bytes that can be written in this block */
+
+    my_off_t _position;
+    my_off_t _size;        /* Cached file size for faster seek(SEEK_END) */
+    File _fd;
+    File *_fd_vector;		/* Array of File */
+    off_t *_seek_vector;	/* Array of cached seek positions */
+
+    inline void Calculate()
+    {
+      DBUG_ENTER("RaidFd::_Calculate");
+      DBUG_PRINT("info",("_position: %lu _raid_chunksize: %d, _size: %lu",
+			 (ulong) _position, _raid_chunksize, (ulong) _size));
+
+      _total_block = (ulong) (_position / _raid_chunksize);
+      _this_block = _total_block % _raid_chunks;    /* can be 0.._raid_chunks */
+      _remaining_bytes = (uint) (_raid_chunksize -
+				 (_position - _total_block * _raid_chunksize));
+      DBUG_PRINT("info",
+		 ("_total_block: %d  this_block: %d  _remaining_bytes:%d",
+		  _total_block, _this_block, _remaining_bytes));
+      DBUG_VOID_RETURN;
+    }
+};
+
+#endif /* __cplusplus */
+#endif /* USE_RAID */
diff --git a/src/terralib/drivers/MySQL/include/typelib.h b/src/terralib/drivers/MySQL/include/typelib.h
new file mode 100644
index 0000000..1b049d1
--- /dev/null
+++ b/src/terralib/drivers/MySQL/include/typelib.h
@@ -0,0 +1,33 @@
+/* Copyright (C) 2000 MySQL AB
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 2 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
+
+
+#ifndef _typelib_h
+#define _typelib_h
+
+typedef struct st_typelib {	/* Different types saved here */
+  unsigned int count;		/* How many types */
+  const char *name;		/* Name of typelib */
+  const char **type_names;
+} TYPELIB;
+
+extern int find_type(char *x,TYPELIB *typelib,unsigned int full_name);
+extern void make_type(char *to,unsigned int nr,TYPELIB *typelib);
+extern const char *get_type(TYPELIB *typelib,unsigned int nr);
+
+extern TYPELIB sql_protocol_typelib;
+
+#endif /* _typelib_h */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h b/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h
new file mode 100644
index 0000000..419543c
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h
@@ -0,0 +1,109 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/cdemodp0.h,v 1.2 2002/12/13 13:33:55 karine Exp $
+ */
+
+/* Copyright (c) 1998, 1999, Oracle Corporation.  All rights reserved.
+*/
+
+/*
+   NAME
+     cdemodp0.h - C Demo program for Direct Path api
+
+   DESCRIPTION
+     - Internal data structs, macros, & defines for cdemodp driver.
+
+   NOTES
+     Structures, macros, constants used only by cdemodp.c.
+
+   MODIFIED   (MM/DD/YY)
+   mjaeger     07/14/99 - bug 808870: OCCS: convert tabs, no long lines
+   abrumm      12/22/98 - lint
+   cmlim       11/17/98 - take away hardcoded MAX_RECLEN; now a session parm
+   cmlim       10/06/98 - correct typo
+   cmlim       10/02/98 - added externref
+   cmlim       09/16/98 - internal data structs, macros, & defines for cdemodp
+   cmlim       09/16/98 - Creation (abrumm 04/07/98)
+
+*/
+
+
+#ifndef cdemodp0_ORACLE
+# define cdemodp0_ORACLE
+
+# include <oratypes.h>
+# include <oci.h>
+
+/* partial field context structure, maintained by field setting function */
+struct pctx
+{
+  ub1   valid_pctx;                              /* partial context is valid */
+  ub4   pieceCnt_pctx;                            /* count of partial pieces */
+  ub4   row_pctx;                               /* which row in column array */
+  ub4   col_pctx;                            /* which column in column array */
+  ub4   len_pctx;                            /* length of this column so far */
+  int   fd_pctx;                 /* open file descriptor data is coming from */
+  char *fnm_pctx;                                /* filename for data source */
+};
+
+/* CLEAR_PCTX(struct pctx pctx)
+ *   Macro to clear the partial context state
+ */
+#define CLEAR_PCTX(pctx) \
+  ((pctx).valid_pctx = FALSE,   (pctx).pieceCnt_pctx = 0,    \
+   (pctx).row_pctx = UB4MAXVAL, (pctx).col_pctx = UB4MAXVAL, \
+   (pctx).len_pctx = 0,         (pctx).fd_pctx  = -1,        \
+   (pctx).fnm_pctx = (char *)0)
+
+#define SET_PCTX(pctx, rowoff, coloff, clen, fd, fnm) \
+  ((pctx).valid_pctx = TRUE,   (pctx).pieceCnt_pctx++,     \
+   (pctx).row_pctx = (rowoff), (pctx).col_pctx = (coloff), \
+   (pctx).len_pctx += (ub4)(clen), (pctx).fd_pctx = (fd),  \
+   (pctx).fnm_pctx = (fnm))
+
+#define LEN_PCTX(pctx) ((pctx).len_pctx)
+
+/* Does the input record correspond to the first piece of a row?
+ * Note that a row which is not pieced is a first piece too.
+ */
+#define FIRST_PIECE(pctx)       \
+( (pctx).valid_pctx == FALSE || \
+ ((pctx).valid_pctx == TRUE  && ((pctx).pieceCnt_pctx == 1)))
+
+/* return values from field_set() */
+#define FIELD_SET_COMPLETE   0
+#define FIELD_SET_ERROR      1
+#define FIELD_SET_BUF        2
+#define FIELD_SET_PARTIAL    3
+
+/* return values from do_convert() */
+#define CONVERT_SUCCESS      0
+#define CONVERT_ERROR        1
+#define CONVERT_NEED_DATA    2
+#define CONVERT_CONTINUE     3
+
+/* return values from do_load() */
+#define LOAD_SUCCESS     0
+#define LOAD_ERROR       1
+#define LOAD_NEED_DATA   2
+#define LOAD_NO_DATA     3
+
+/* state values for simple_load() */
+#define RESET             1 /* initial state, reset data structures to empty */
+#define GET_RECORD        2                             /* get input records */
+#define FIELD_SET         3     /* assign fields of input records to columns */
+#define DO_CONVERT        4   /* convert column array input to stream format */
+#define DO_LOAD           5                        /* load the direct stream */
+#define END_OF_INPUT      6                            /* no more input data */
+
+/* Secondary buffer sizes for OUTOFLINE fields; no science here, just a WAG */
+#define SECONDARY_BUF_SIZE (1024*1024)           /* size of secondary buffer */
+#define SECONDARY_BUF_SLOP (8*1024)  /* get another field if this much avail */
+
+#define STATICF
+
+#ifndef externref
+# define externref extern
+#endif
+
+
+#endif                                              /* cdemodp0_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h b/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h
new file mode 100644
index 0000000..9a51999
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h
@@ -0,0 +1,775 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/kusapi.h,v 1.2 2002/12/13 13:33:55 karine Exp $
+ */
+
+/* Copyright (c) Oracle Corporation 1996, 1997. All Rights Reserved. */ 
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     kusapi.h - Kernel Utility Statistics Application Programming Interface
+
+   DESCRIPTION 
+     Declarations of types and functions of the API used to retrieve 
+     statistics from the SGA
+
+   PUBLIC FUNCTION(S) 
+     kusdb_connect - connect to a database
+     kuscx_allocate - allocate continuation context
+     kuscx_free - free continuation context
+     kuscx_init - initialize continuation context
+     kusdb_get_info - retrieve database information
+     kusdb_get_memory - copy SGA contents into user-allocated memory
+     kusdb_disconnect - disconnect from database
+     kusdb_error_text - format message for last error
+     kustv_allocate_handle - allocate a TLV handle
+     kustv_dump - dump a TLV buffer
+     kustv_free_handle - free a TLV handle
+     kustv_get - get next entry in a TLV buffer
+     kustv_offset - return offset for current entry in TLV buffer
+     kussys_get_info - retrieve non-db-related info (noop for Oracle)
+     kussys_error_text - format message for last error (noop for Oracle)
+     kustvp1_put_one_byte - put TLV entry with 1 byte value into TLV buffer
+     kustvp2_put_two_bytes - put TLV entry with 2 byte value into TLV buffer
+     kustvp4_put_four_bytes - put TLV entry with 4 byte value into TLV buffer
+     kustv_put - put TLV entry into TLV buffer
+     kustvptg_put_tag - put TLV entry with empty value into TLV buffer
+     kustv_reinit_handle - reset offset for a TLV handle
+     kustv_buffer_state - return termination state for tlv buffer
+
+   NOTES
+     This interface is subject to change without notice
+
+   MODIFIED   (MM/DD/YY)
+   pabingha    03/14/97 - Add get_tagname argument
+   jstenois    11/05/96 - "Make kustv_dump() header CONST"
+   jstenois    11/01/96 - Use oratypes instead of sx.h
+   jstenois    08/15/96 - SGAAPI public include file
+   jstenois    08/15/96 - Creation
+
+*/
+
+ 
+#ifndef KUSAPI
+# define KUSAPI
+
+# ifndef ORATYPES
+#  include <oratypes.h>
+# endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/* values for status code returned by API calls */
+
+typedef enum kusst
+  {
+
+    KUSSTOK =		1,	/* Success                              */
+    KUSSTEOB =		2,	/* Cursor at end of buffer.	        */
+    KUSSTNWR =		3,	/* Attempt to write to TLV when no      */
+				/*    length specified at init time	*/
+    KUSSTILN =		4,	/* Invalid length specified when	*/
+				/*    passing by value			*/
+    KUSSTTRNC =		5,	/* buffer was truncated			*/
+    KUSSTCONT =		6,	/* buffer is continued			*/
+    KUSSTALLC =		7,	/* unable to allocate memory		*/
+    KUSSTUNKC =		8,	/* unknown class tag specified		*/
+    KUSSTICH =		9,	/* Invalid context handle		*/
+    KUSSTIDH =		10,	/* Invalid database handle		*/
+    KUSSTITH =		11,	/* Invalid TLV handle			*/
+    KUSSTDIS =		12,	/* Stats collection disabled for database */
+    KUSSTERR =		13,	/* Unexpected error encountered		*/
+    KUSSTBINF =		14,	/* Input buffer contained a bad tag	*/
+    KUSSTBDKY =         15,     /* Bad index value for class tag	*/
+    KUSSTBFSML =	16,	/* Buffer is too small for data		*/
+    KUSSTIBE =		17,	/* Information buffer is empty          */
+    KUSSTDBDOWN =       18,     /* Database is unavaliable              */
+    KUSSTFILACC =       19,     /* File cannot be accessed              */
+    KUSSTINVDB =        20,     /* File is not a db root file (Rdb only)*/
+    KUSSTNODB =         21,     /* Db root file doesn't exist (Rdb only)*/
+    KUSSTBADVER =       22,     /* Db root file wrong version (Rdb only)*/
+    KUSSTCIU =          23,     /* Context is already in use            */
+    KUSSTDMPOP =        24,     /* Unable to open dump output file      */
+    KUSSTDMPCL =        25      /* Unable to close dump output file     */
+  } kusst;
+
+
+/* values returned by kustvstate */ 
+
+typedef enum kustvs
+  {
+    KUSTVS_CONT =	1,	/* tlv buffer terminated with KUSSTCONT	*/
+    KUSTVS_END =	2,	/* tlv buffer terminated with KUSSTBEND	*/
+    KUSTVS_TRUNC =	3,	/* tlv buffer terminated with KUSSTTRNC	*/
+    KUSTVS_UNK =	4	/* handle specified has not been used	*/
+                                /* to read or write a termination tag   */
+  } kustvs;
+
+
+/* Type Definitions for handles */
+
+typedef dvoid *kusdb_handle;	/* handle for connected database */
+typedef dvoid *kuscx_handle;	/* handle for continuation context */
+typedef dvoid *kustv_handle;	/* handle for TLV context */
+
+/* Data structure for use by kusdb_get_memory */
+
+typedef struct kusmem
+  {
+    ub1 *sga_address_kusmem;    /* SGA memory address */
+    ub4 length_kusmem;          /* Number of bytes to copy */
+    ub1 *dest_address_kusmem;   /* User-allocated destination for SGA data */
+  } kusmem;
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/* ---------------------------- kuscx_allocate ----------------------------- */
+/*
+  NAME
+    kuscx_allocate -  allocate continuation context
+  DESCRIPTION
+    Allocate space to track information about continuation context for a 
+    kusdb_get_info call.
+  PARAMETERS
+    context_handle - handle for the continuation context (in/out)
+  RETURN VALUE
+    status of call
+  NOTES
+    kuscx_init can be used to reinitilize a context that has been allocated 
+    and is no longer used for a TLV buffer
+*/
+
+kusst kuscx_allocate (/*_ kuscx_handle *context_handle _*/);
+
+
+
+
+/* ------------------------------ kuscx_free_handle ------------------------ */
+/*
+  NAME
+    kuscx_free_handle -  free continuation context
+  DESCRIPTION
+    free space used to track information about continuation context for a 
+    kusdb_get_info call.
+  PARAMETERS
+    context_handle - handle for the continuation context (in/out)
+  RETURN VALUE
+    status of call
+  NOTES
+    kuscx_init can be used to reinitilize a context that has been allocated
+    and is no longer used for a TLV buffer
+*/
+
+kusst kuscx_free_handle (/*_ kuscx_handle *context_handle _*/);
+
+
+
+
+/* ------------------------------ kuscx_init ------------------------------- */
+/*
+  NAME
+    kuscx_init -  initialize continuation context
+  DESCRIPTION
+    Reinitialize a context handle that has been previously allocated and used.
+  PARAMETERS
+    context_handle - handle for the continuation context (in/out)
+  RETURN VALUE
+    status of call
+  NOTES
+    kuscx_init is the semantic equivalent of freeing a context handle and then
+    allocating a new one.
+*/
+
+kusst kuscx_init (/*_ kuscx_handle *context_handle _*/);
+
+
+
+/* ----------------------------- kusdb_allocate ---------------------------- */
+/*
+  NAME
+    kusdb_allocate - allocate a database handle
+  DESCRIPTION
+    allocate resources for a database handle
+  PARAMETERS
+    db_handle - handle for the database context (in/out)
+  RETURN VALUE
+    kusst - status of attempt to allocate
+*/
+
+kusst kusdb_allocate (/*_ kusdb_handle *db_handle _*/);
+
+
+
+
+/* ----------------------------- kusdb_connect ----------------------------- */
+/*
+  NAME
+    kusdb_connect - connect to a database
+  DESCRIPTION
+    Connects to a database so that statistics for that database can be
+    retrieved.
+  PARAMETERS
+    db_handle - handle for the database context (in/out)
+    database_name_length - number of bytes in database_name parameter
+    database name - name of database
+    security_info_length - number of bytes in security_info parameter
+    security_info - security information used to attach to database
+  RETURN VALUE
+    status of attempt to connect
+  NOTES
+    If the status is not successful, call kusdb_error_text to get more 
+    information about the failure.
+    Refer to the documentation for the format of information in the
+    database_name and security_info parameters.
+*/
+
+kusst kusdb_connect (/*_
+	kusdb_handle db_handle,
+	ub4 database_name_length,
+	char *database_name,
+	ub4 security_info_length,
+	char *security_info
+	_*/);
+
+
+
+
+/* ---------------------------- kusdb_disconnect --------------------------- */
+/*
+  NAME
+    kusdb_disconnect - disconnect from a database
+  DESCRIPTION
+    Disconnect from the current database
+  PARAMETERS
+    db_handle - handle for the database (in/out)
+  RETURN VALUE
+    status of call
+  NOTES
+*/
+
+kusst kusdb_disconnect (/*_ kusdb_handle db_handle _*/);
+
+
+
+
+/* ------------------------------- kusdb_free ------------------------------ */
+/*
+  NAME
+    kusdb_free - free a database handle
+  DESCRIPTION
+    free resources for a database handle
+  PARAMETERS
+    db_handle - handle for the database context (in/out)
+  RETURN VALUE
+    kusst - status of attempt to free the handle
+*/
+
+kusst kusdb_free (/*_ kusdb_handle *db_handle _*/);
+
+
+
+
+/* ----------------------------- kusdb_get_info ---------------------------- */
+/*
+  NAME
+    kusdb_get_info - retrieve statistics for a database
+  DESCRIPTION
+    Retrieve requested statistics for the current database
+  PARAMETERS
+    db_handle - handle for the database (in)
+    context_handle - handle for the continuation context (in/out)
+    info_buf - TLV buffer indicating data to be returned (in)
+    info_buf_len - number of bytes in info_buffer (in)
+    result_buf - allocated TLV buffer to hold data returned (in/out)
+    result_buf_len - number of bytes in result_buf (in/out)
+    buffer_termination_status - indicates how buffer was terminated (normally,
+      truncated, or continued) (out)
+  RETURN VALUE
+    status of call
+  NOTES
+    If the status is not successful, call kusdb_error_text to get more 
+    information about the failure.
+    Refer to documentation for information on the format of the information
+    buffer and the result buffer
+*/
+
+kusst kusdb_get_info (/*_
+	kusdb_handle db_handle,
+	kuscx_handle ctx_handle,
+	ub1 *info_buffer,
+	ub4 info_buffer_length,
+	ub1 *result_buffer,
+	ub4 *result_buffer_length,
+	kustvs *buffer_termination_status
+	_*/);
+
+
+
+/* ----------------------------- kusdb_get_memory -------------------------- */
+/*
+  NAME
+    kusdb_get_memory - copy SGA contents into user-allocated memory
+  DESCRIPTION
+    Copy SGA memory into user-allocated memory regions. User provides
+    an array of kusmem structures. Each kusmem structure in the array
+    describes a distinct copy to be done by this routine.
+  PARAMETERS
+    db_handle - handle for the database (in)
+    mem_array_length - number of elements in mem_array (in)
+    mem_array - address of an array of kusmem structures (in/out)
+  RETURN VALUE
+    status of call:
+        KUSSTOK - call succeeded, all requested data copied
+        KUSSTIDH - invalid database handle
+        KUSSTDBDOWN - database is down
+        KUSSTERR - unexpected error
+  NOTES
+     User should prepare each kusmem structure in array by filling in
+     values for sga_address_kusmem, length_kusmem and dest_address_kusmem
+     prior to making this call. 
+
+     User is reponsible for allocating and deallocating the memory used
+     by mem_array and each region that a dest_address_kusmem points to.
+*/
+
+kusst kusdb_get_memory (/*_
+	kusdb_handle db_handle,
+        ub4 mem_array_length,
+        kusmem *mem_array
+	_*/);
+
+
+
+
+/* ---------------------------- kusdb_error_text --------------------------- */
+/*
+  NAME
+    kusdb_error_text - error text
+  DESCRIPTION
+    Display information about status of last kusdb call
+  PARAMETERS
+    db_ctx - context whose errors are to be returned (in)
+    text_buf - buffer to hold error message (in/out)
+    text_buf_len - number of bytes in text buffer (in)
+    text_len_out - number of bytes written into text_buf
+  RETURN VALUE
+    status of call
+  NOTES
+*/
+
+kusst kusdb_error_text (/*_ kusdb_handle db_ctx, char *text_buf,
+			  ub4 text_buf_len, ub4 *text_len_out _*/);
+
+
+
+
+/* ------------------------ kustv_allocate_handle -------------------------- */
+/*
+  NAME
+    kustv_allocate_handle - allocate a handle for a TLV buffer
+  DESCRIPTION
+    allocates and initializes information for a TLV handle
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    tlv_buffer - address of the TLV buffer for this handle (in)
+    buf_size - number of bytes in tlv_buffer (in)
+  RETURN VALUE
+    KUSSTALL	Unable to allocate memory
+  NOTES
+    kustv_reinit can be used to reinitialize a TLV handle that is no longer
+    needed.
+*/
+
+kusst kustv_allocate_handle (/*_
+	kustv_handle *tlv_handle,
+	ub1 *tlv_buffer,
+	ub4 buf_size
+	_*/);
+
+
+#ifndef _WINDOWS
+
+
+/* ------------------------------- kustv_dump -------------------------------*/
+/*
+  NAME
+    kustv_dump - dump tlv buffer
+  DESCRIPTION
+    Formats the content of a TLV buffer into the file specified by the caller
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer to be dumped (in)
+    header - ASCIZ string to be displayed before dumping the buffer (in)
+    data_flg - flag to indicate if the contents of the value fueld in the TLV
+	should be displayed (in)
+    append_flg - flag to indicate if an existing instance of the output
+        file should be appended to (or replaced)
+    get_tagname - routine to get text associated with tags
+    directory - ASCIZ string containing a directory specification for the
+        output file (if absent, current default directory is used)
+    file_name - ASCIZ string containing a file name for the output file.
+        If absent, stderr is used and append_flg and directory are ignored.
+        If specified without an extension, the Oracle extension for an output
+        file on the given platform is used.
+  RETURN VALUE
+    KUSSTOK	Success
+    KUSSTITH	invalid tlv handle
+    KUSSTDMPOP  can't open dump file
+    KUSSTDMPCL  can't close dump file
+  NOTES
+*/
+
+kusst kustv_dump (/*_
+	kustv_handle tlv_handle,
+	CONST char *header,
+	int data_flg,
+        int append_flg,
+        CONST char *(*get_tagname)(ub2),
+        CONST char *directory,
+        CONST char *file_name
+	_*/);
+
+#endif
+
+
+/* ------------------------- kustv_free_handle ----------------------------- */
+/*
+  NAME
+    kustv_free_handle - free a handle for a TLV buffer
+  DESCRIPTION
+    Free a TLV handle that has already been created
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+  RETURN VALUE
+    status of call
+  NOTES
+    kustv_reinit_handle can be used to reinitialize a handle that is no 
+    longer needed.
+*/
+
+kusst kustv_free_handle (/*_ kustv_handle *tlv_handle _*/);
+
+/* ----------------------------- kussys_get_info --------------------------- */
+/*
+  NAME
+    kussys_get_info - retrieve non database specific data
+  DESCRIPTION
+    Retrieve non database specific information
+  PARAMETERS
+    context_handle - handle for the continuation context (in/out)
+    info_buf - TLV buffer indicating data to be returned (in)
+    info_buf_len - number of bytes in info_buffer (in)
+    result_buf - allocated TLV buffer to hold data returned (in/out)
+    result_buf_len - number of bytes in result_buf (in/out)
+    buffer_termination_status - indicates how buffer was terminated (normally,
+      truncated, or continued) (out)
+  RETURN VALUE
+    status of call
+  NOTES
+    This function is a noop for Oracle. It is included for compatability
+    with Rdb only.
+*/
+
+kusst kussys_get_info (/*_
+	kuscx_handle ctx_handle,
+	ub1 *info_buffer,
+	ub4 info_buffer_length,
+	ub1 *result_buffer,
+	ub4 *result_buffer_length,
+	kustvs *buffer_termination_status
+	_*/);
+
+
+
+
+
+/* ---------------------------- kussys_error_text -------------------------- */
+/*
+  NAME
+    kussys_error_text - error text
+  DESCRIPTION
+    Display information about status of last kustv call
+  PARAMETERS
+    text_buf - buffer to hold error message (in/out)
+    text_buf_len - number of bytes in text buffer (in)
+    text_len_out - number of bytes written into text_buf
+  RETURN VALUE
+    status of call
+  NOTES
+    This function is a noop for Oracle. It is included for compatability
+    with Rdb only.
+*/
+
+kusst kussys_error_text (/*_ char *text_buf,
+			  ub4 text_buf_len, ub4 *text_len_out _*/);
+
+
+
+
+/* ------------------------------ kustv_get -------------------------------- */
+/*
+  NAME
+    kustv_get - get next entry in tlv buffer
+  DESCRIPTION
+    Retrieves information about next entry in the tlv buffer and advances
+    pointer into the TLV buffer to the following entry.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in)
+    tag - tag for the next entry (out)
+    length - number of bytes in the value for the TLV entry (out)
+    value - pointer to value field for the TLV entry (out)
+  RETURN VALUE
+    KUSSTOK	Success
+    KUSSTITH	Invalid TLV handle
+  NOTES
+*/
+
+kusst kustv_get (/*_
+	kustv_handle tlv_handle,
+	ub2 *tag,
+	ub2 *length,
+	ub1 **value
+	_*/);
+
+
+
+
+
+/* ------------------------ kustv_reinit_handle ---------------------------- */
+/*
+  NAME
+    kustv_reinit_handle - reinitialize a TLV handle
+  DESCRIPTION
+    Reimitializes a TLV handle so that it can be used to read or write a new
+    TLV buffer.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    buffer - address of the TLV buffer
+    buffer_size - number of bytes in the TLV buffer
+  RETURN VALUE
+    KUSSTOK	Success
+    KUSSTITH	Invalid TLV handle
+  NOTES
+*/
+
+kusst kustv_reinit_handle (/*_ 
+	kustv_handle tlv_handle,
+	ub1 *buffer,
+	ub4 buffer_length
+	_*/);
+
+
+
+
+
+/* --------------------------- kustv_length -------------------------------- */
+
+/*
+  NAME
+    kustv_length - return length of a TLV buffer
+  DESCRIPTION
+    return the length of a TLV buffer associated with a TLV handle
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in)
+    buffer_length - number of bytes in the buffer (out)
+  RETURN VALUE
+    KUSSTOK	Success
+    KUSSTITL	Invalid TLV handle
+  NOTES
+*/
+
+kusst kustv_length (/*_ 
+	kustv_handle tlv_handle,
+	ub4 buffer_length
+	_*/);
+
+
+
+
+/* ---------------------------- kustv_offset ------------------------------- */
+
+/*
+  NAME
+    kustv_offset - return offset of a TLV buffer
+  DESCRIPTION
+    return the current offset of a TLV buffer associated with a TLV handle
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in)
+    offset - current offset for TLV buffer (out)
+  RETURN VALUE
+    KUSSTOK - success
+    KUSSTITH - invalid TLV handle
+  NOTES
+*/
+
+kusst kustv_offset (/*_ 
+	kustv_handle tlv_handle, 
+	ub4 *offset 
+	_*/);
+
+
+
+
+/* ------------------------ kustvp1_put_one_byte --------------------------- */
+
+/*
+  NAME
+    kustvp1_put_one_byte - Insert a TLV entry with a value field of 1 byte
+  DESCRIPTION
+    Adds a new TLV entry to the end of the current TLV buffer.  This entry
+    contains 1 byte.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    tag - tag for the new entry (in)
+    value - value for the new entry (in)
+  RETURN VALUE
+    status of the operation
+  NOTES
+*/
+
+kusst kustvp1_put_one_byte (/*_
+	kustv_handle tlv_handle,
+	ub2 tag,
+	ub1 value
+	_*/);
+
+
+
+
+/* ------------------------- kustvp2_put_two_bytes ------------------------- */
+
+/*
+  NAME
+    kustvp2_put_two_bytes - Insert a TLV entry with a value field of 2 byte
+  DESCRIPTION
+    Adds a new TLV entry to the end of the current TLV buffer.  This entry
+    contains 2 bytes.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    tag - tag for the new entry (in)
+    value - value for the new entry (in)
+  RETURN VALUE
+    status of the operation
+  NOTES
+*/
+
+kusst kustvp2_put_two_bytes (/*_
+	kustv_handle tlv_handle,
+	ub2 tag,
+	ub2 value
+	_*/);
+
+
+
+
+/* ----------------------- kustvp4_put_four_bytes -------------------------- */
+
+/*
+  NAME
+    kustvp4_put_four_bytes - Insert a TLV entry with a value field of 4 byte
+  DESCRIPTION
+    Adds a new TLV entry to the end of the current TLV buffer.  This entry
+    contains 4 bytes.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    tag - tag for the new entry (in)
+    value - value for the new entry (in)
+  RETURN VALUE
+    status of the operation
+  NOTES
+*/
+
+kusst kustvp4_put_four_bytes (/*_
+	kustv_handle tlv_handle,
+	ub2 tag,
+	ub4 value
+	_*/);
+
+
+
+
+/* ----------------------------- kustv_put --------------------------------- */
+
+/*
+  NAME
+    kustv_put - Insert a TLV entry
+  DESCRIPTION
+    Adds a new TLV entry to the end of the current TLV buffer.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    tag - tag for the new entry (in)
+    length - number of bytes in the new entry (in)
+    value - value for the new entry (in)
+  RETURN VALUE
+    status of the operation
+  NOTES
+*/
+
+kusst kustv_put (/*_
+	kustv_handle tlv_handle,
+	ub2 tag,
+	ub2 length,
+	dvoid *value
+	_*/);
+
+
+
+
+/* -------------------------- kustvptg_put_tag ----------------------------- */
+
+/*
+  NAME
+    kustvptg_put_tag - Insert a TLV entry with no value field
+  DESCRIPTION
+    Adds a new TLV entry to the end of the current TLV buffer.  the entry
+    contains a 0-length value field.
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in/out)
+    tag - tag for the new entry (in)
+  RETURN VALUE
+    status of the operation
+  NOTES
+*/
+
+kusst kustvptg_put_tag (/*_
+	kustv_handle tlv_handle,
+	ub2 tag
+	_*/);
+
+
+
+
+
+/* -------------------------- kustv_buffer_state --------------------------- */
+
+/*
+  NAME
+    kustv_buffer_state - return termination state of TLV buffer
+  DESCRIPTION
+    Returns informationon how a TLV buffer was terminated.  This call returns
+    useful information only if a TLV handle was used to read or write the
+    termination tag.  The termination information is preserved 
+  PARAMETERS
+    tlv_handle - handle of the TLV buffer (in)
+    state - termination state for the TLV (out)
+  RETURN VALUE
+    status of the operation
+  NOTES
+*/
+
+kusst kustv_buffer_state (/*_
+	kustv_handle tlv_handle,
+	kustvs *state
+	_*/);
+
+
+#endif                                              /* kusapi */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/kustags.h b/src/terralib/drivers/OracleSpatial/OCI/include/kustags.h
new file mode 100644
index 0000000..889e62a
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/kustags.h
@@ -0,0 +1,1034 @@
+/* copyright (c) Oracle Corporation 1995.  All Rights Reserved. */
+
+/*
+  NAME
+    kustags.h - definition of tags for statistics API
+  DESCRIPTION
+    Definitions of tags used for Oracle's statistics API.
+  PUBLIC FUNCTIONS
+    none
+  PRIVATE FUNCTIONS
+    none
+  NOTES
+    This file is a generated and should NOT BE EDITTED
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef KUSTAGS
+#define KUSTAGS
+
+/* DISABLE check_macro_naming */
+/* Lint exception approved 9/24/96 by BCCHANG and JMULLER */
+
+/* PUBLIC TYPES AND CONSTANTS */
+#define RMUST_T_ACCESS_MODE 15
+#define RMUST_T_ACTIVE_FLG 16
+#define RMUST_T_AIJ_COMMIT_FLG 17
+#define RMUST_T_AIJ_ENABLED_FLG 18
+#define RMUST_T_AIJ_STATUS 19
+#define RMUST_T_ALARM_ENABLED_FLG 20
+#define RMUST_T_ALLOCATION 21
+#define RMUST_T_ALS_MODE_FLG 22
+#define RMUST_T_ARPMS 23
+#define RMUST_T_ASCII_DEADLOCK 24
+#define RMUST_T_ASCII_STALL 25
+#define RMUST_T_ASCII_TIMEOUT 26
+#define RMUST_T_AUDIT_ENABLED_FLG 27
+#define RMUST_T_AUDIT_FIRST_FLG 28
+#define RMUST_T_AUDIT_FLUSH_FLG 29
+#define RMUST_T_AUTO_BKUP_FLG 30
+#define RMUST_T_FILID_SLOTNUM 31
+#define RMUST_T_BACKUP_DATE_ADT 32
+#define RMUST_T_BACKUP_DATE_FDT 33
+#define RMUST_T_BACKUP_DATE_TDT 34
+#define RMUST_T_BIOCNT 35
+#define RMUST_T_BKUP_ACTIVE_FLG 36
+#define RMUST_T_BKUP_VNO 37
+#define RMUST_T_CACHE_FILENAME 38
+#define RMUST_T_CALC_PNO 39
+#define RMUST_T_CKPT_BLOCKS 40
+#define RMUST_T_CKPT_TIME 41
+#define RMUST_T_CORRUPT_FLG 42
+#define RMUST_T_CPUTIM_RT 43
+#define RMUST_T_CREATE_DATE_ADT 44
+#define RMUST_T_CREATE_DATE_FDT 45
+#define RMUST_T_CREATE_DATE_TDT 46
+#define RMUST_T_CUR_ACTIVE_AIJ 47
+#define RMUST_T_CUR_AIJ_FILENAME 48
+#define RMUST_T_CUR_BKUP_FILENAME 49
+#define RMUST_T_CUR_BKUP_VNO 50
+#define RMUST_T_CUR_RCVR_VNO 51
+#define RMUST_T_DATA_CMIT_FLG 52
+#define RMUST_T_DBID 53
+#define RMUST_T_DBR_ACTIVITY 54
+#define RMUST_T_DBR_BUF_CNT 55
+#define RMUST_T_LSS_LAG_FDT 56
+#define RMUST_T_DB_BKUP_VNO 57
+#define RMUST_T_DEADLOCK_SEQ 58
+#define RMUST_T_DEADLOCK_SINCE_ADT 59
+#define RMUST_T_DEADLOCK_SINCE_TT 60
+#define RMUST_T_DEADLOCK_SINCE_RT 61
+#define RMUST_T_DEFERRED_SNAP_FLG 62
+#define RMUST_T_DEF_AIJ_FILENAME 63
+#define RMUST_T_DEF_ALLOCATION 64
+#define RMUST_T_DEF_BKUP_FILENAME 65
+#define RMUST_T_DEF_BUF_CNT 66
+#define RMUST_T_DEF_EXTENSION 67
+#define RMUST_T_DIOCNT 68
+#define RMUST_T_ENQCNT 69
+#define RMUST_T_EXTENSION 70
+#define RMUST_T_EXT_COUNT 71
+#define RMUST_T_EXT_ENABLED_FLG 72
+#define RMUST_T_EXT_PERCENT 73
+#define RMUST_T_FAST_COMMIT_FLG 74
+#define RMUST_T_FILENAME 75
+#define RMUST_T_FULL_BACKUP_TSN 76
+#define RMUST_T_GB_CNT 77
+#define RMUST_T_GB_ENABLED_FLG 78
+#define RMUST_T_HARD_DATA_LOSS_FLG 79
+#define RMUST_T_IMAGENAME 80
+#define RMUST_T_INCONSISTENT_FLG 81
+#define RMUST_T_INC_RES_DATE_ADT 82
+#define RMUST_T_INC_RES_DATE_FDT 83
+#define RMUST_T_INC_RES_DATE_TDT 84
+#define RMUST_T_INIT_ACTIVE_FLG 85
+#define RMUST_T_IS_STALLED 86
+#define RMUST_T_JOURNAL_CNT 87
+#define RMUST_T_JOURNAL_NAME 88
+#define RMUST_T_JOURNAL_STATUS 89
+#define RMUST_T_LAST_BKUP_VNO 90
+#define RMUST_T_LCKOPT_ENABLED_FLG 91
+#define RMUST_T_LINKAGE_DBID 92
+#define RMUST_T_LKID 93
+#define RMUST_T_LOCK_TIMEOUT 94
+#define RMUST_T_MAX_EXT_PAGCNT 95
+#define RMUST_T_MAX_GB_PER_USER 96
+#define RMUST_T_MAX_NODE_CNT 97
+#define RMUST_T_MAX_PNO 98
+#define RMUST_T_MAX_USER_CNT 99
+#define RMUST_T_MIN_EXT_PAGCNT 100
+#define RMUST_T_MIXED_FMT_FLG 101
+#define RMUST_T_MODIFIED_FLG 102
+#define RMUST_T_NEW_VERSION_FLG 104
+#define RMUST_T_NUMBIO 105
+#define RMUST_T_NUMDIO 106
+#define RMUST_T_OPEN_MODE_FLG 107
+#define RMUST_T_OPER_CLASS 108
+#define RMUST_T_OVERWRITE_FLG 109
+#define RMUST_T_OVERWRITTEN_FLG 110
+#define RMUST_T_PAG_BLKCNT 111
+#define RMUST_T_PGFCNT 112
+#define RMUST_T_PGFLTS 113
+#define RMUST_T_PID 114
+#define RMUST_T_PROCNAME 115
+#define RMUST_T_PSTATE 116
+#define RMUST_T_RESTORED_FLG 117
+#define RMUST_T_RTPMS 118
+#define RMUST_T_SFDB_FLG 119
+#define RMUST_T_SHUTDOWN_TIME 120
+#define RMUST_T_SNAPSHOT_FLG 121
+#define RMUST_T_SNAPS_ALLOWED_FLG 122
+#define RMUST_T_SNAPS_ENABLED_FLG 123
+#define RMUST_T_SOFT_DATA_LOSS_FLG 124
+#define RMUST_T_SPAMS_ENABLED_FLG 125
+#define RMUST_T_SPAMS_FLG 126
+#define RMUST_T_STALL_SINCE_ADT 127
+#define RMUST_T_STALL_SINCE_TT 128
+#define RMUST_T_STALL_SINCE_RT 129
+#define RMUST_T_STALL_THRESHOLD_RT 130
+#define RMUST_T_STAREA_NAME 131
+#define RMUST_T_STATS_ENABLED_FLG 132
+#define RMUST_T_STID 133
+#define RMUST_T_TIMEOUT_SEQ 134
+#define RMUST_T_TIMEOUT_SINCE_ADT 135
+#define RMUST_T_TIMEOUT_SINCE_TT 136
+#define RMUST_T_TIMEOUT_SINCE_RT 137
+#define RMUST_T_TSN_INTERVAL 138
+#define RMUST_T_USERNAME 139
+#define RMUST_T_VBN 140
+#define RMUST_T_VMSIZE 141
+#define RMUST_T_WSSIZE 142
+#define RMUST_T_THRESHOLD 143
+#define RMUST_T_BUF_BLOCK_CNT 144
+#define RMUST_T_FILID_CNT 145
+#define RMUST_T_STALL_INDEX 146
+#define RMUST_T_AIJ_LEOF 147
+#define RMUST_T_AIJ_PEOF 148
+#define RMUST_T_ALS_ACTIVE 149
+#define RMUST_T_CACHE_STATUS 150
+#define RMUST_T_AIJ_SHUTDOWN 151
+#define RMUST_T_RELATION_NAME 152
+#define RMUST_T_ISA_VIEW 153
+#define RMUST_T_FIELD_NAMES 154
+#define RMUST_T_INDEX_NAME 155
+#define RMUST_T_INDEX_UNIQUE 156
+#define RMUST_T_INDEX_TYPE 157
+#define RMUST_T_LSS_AIJ_VNO 158
+#define RMUST_T_LSS_AIJ_VBN 159
+#define RMUST_T_DELTA_HSEC 160
+#define RMUST_T_PLATFORM 161
+#define RMUST_T_LSS_STATE 162
+#define RMUST_T_AIJ_AUTO_SYNC 163
+#define RMUST_T_AIJ_DATA_SYNC 164
+#define RMUST_T_AIJ_VNO 165
+#define RMUST_T_AIJ_SRV_NAME 166
+#define RMUST_T_STBY_RT_FILNAM 167
+#define RMUST_T_AIJ_CUR_MSN 168
+#define RMUST_T_AIJ_STALLED_MSN 169
+#define RMUST_T_LCS_ACTIVE 170
+#define RMUST_T_LRS_STATE 171
+#define RMUST_T_LRS_ACTIVE 172
+#define RMUST_T_LSS_ACTIVE 173
+#define RMUST_T_GOVERNOR_ENABLED 174
+#define RMUST_T_LSS_REF_COUNT 175
+#define RMUST_T_AIJFB_INDEX 176
+#define RMUST_T_PROC_INDEX 177
+#define RMUST_T_DBR_INDEX 178
+#define RMUST_T_SAMPLE_INTERVAL 179
+#define RMUST_T_DBMSROOT 180
+#define RMUST_T_MAJ_VER 181
+#define RMUST_T_MIN_VER 182
+#define RMUST_T_CHECKSUM 183
+#define RMUST_T_VERSION_ADT 184
+#define RMUST_T_VERSION_FDT 185
+#define RMUST_T_VERSION_TDT 186
+#define RMUST_T_LADB_FLG 187
+#define RMUST_T_RUJ_CORRUPT_FLG 188
+#define RMUST_T_ROOT_CORRUPT_FLG 189
+#define RMUST_T_FIB_ENABLED_FLG 190
+#define RMUST_T_APF_ENABLED_FLG 191
+#define RMUST_T_ABW_ENABLED_FLG 192
+#define RMUST_T_PLT_ENABLED_FLG 193
+#define RMUST_T_OPT_ENABLED_FLG 194
+#define RMUST_T_STBY_READ_ONLY_FLG 195
+#define RMUST_T_DAPF_ENABLED_FLG 196
+#define RMUST_T_RCVR_QUIET_POINT_FLG 197
+#define RMUST_T_SSB_ENABLED_FLG 198
+#define RMUST_T_DB_MODIFIED_FLG 199
+#define RMUST_T_ACTIVE_VBN 200
+#define RMUST_T_AIJDB_VBN 201
+#define RMUST_T_AIJFB_VBN 202
+#define RMUST_T_CLIENT_VBN 203
+#define RMUST_T_COSI_VBN 204
+#define RMUST_T_CPT_VBN 205
+#define RMUST_T_FILID_VBN 206
+#define RMUST_T_MEMBIT_VBN 207
+#define RMUST_T_RTUPB_VBN 208
+#define RMUST_T_RUJBLK_VBN 209
+#define RMUST_T_SEQBLK_VBN 210
+#define RMUST_T_TSNBLK_VBN 211
+#define RMUST_T_AIJFB_CNT 212
+#define RMUST_T_RTUPB_BLKCNT 213
+#define RMUST_T_TSNBLK_CNT 214
+#define RMUST_T_ALG_COUNT 215
+#define RMUST_T_ALG_FACTORS 216
+#define RMUST_T_AUDIT_FLAGS 217
+#define RMUST_T_ALARM_NAME 218
+#define RMUST_T_MIN_PAG_BLKCNT 219
+#define RMUST_T_MAX_PAG_BLKCNT 220
+#define RMUST_T_MAX_PIB_COUNT 221
+#define RMUST_T_SEQBLK_CNT 222
+#define RMUST_T_APF_DEPTH 223
+#define RMUST_T_ABW_CLEAN_BUF_CNT 224
+#define RMUST_T_ABW_BATCH_MAX 225
+#define RMUST_T_CLIENT_BLKCNT 226
+#define RMUST_T_COSI_BLKCNT 227
+#define RMUST_T_RMU_CLIENT_VBN 228
+#define RMUST_T_RMU_CLIENT_BLKCNT 229
+#define RMUST_T_CLOSE_MODE 230
+#define RMUST_T_CLOSE_INTERVAL 231
+#define RMUST_T_RCACHE_VBN 232
+#define RMUST_T_RCACHE_CNT 233
+#define RMUST_T_DAPF_DEPTH 234
+#define RMUST_T_DAPF_THRESHOLD 235
+#define RMUST_T_TXN_MODE_FLAGS 236
+#define RMUST_T_RCS_SWEEP_INTERVAL 237
+#define RMUST_T_ACTIVE_BACKUP_TSN 238
+#define RMUST_T_BOOTSTRAP_DBK 239
+#define RMUST_T_HRL_FLG 241
+#define RMUST_T_WRL_FLG 242
+#define RMUST_T_RESTRICT_ACCESS_FLG 243
+#define RMUST_T_ALTER_CNT 244
+#define RMUST_T_ALTER_TAD_ADT 245
+#define RMUST_T_ALTER_TAD_FDT 246
+#define RMUST_T_ALTER_TAD_TDT 247
+#define RMUST_T_INC_RES_TAD_ADT 248
+#define RMUST_T_INC_RES_TAD_FDT 249
+#define RMUST_T_INC_RES_TAD_TDT 250
+#define RMUST_T_FULL_BCK_TAD_ADT 251
+#define RMUST_T_FULL_BCK_TAD_FDT 252
+#define RMUST_T_FULL_BCK_TAD_TDT 253
+#define RMUST_T_LAST_BACKUP_TSN 254
+#define RMUST_T_LAST_BACKUP_CSN 255
+#define RMUST_T_LAST_FULL_BACKUP_TSN 256
+#define RMUST_T_FULL_VER_TAD_ADT 257
+#define RMUST_T_FULL_VER_TAD_FDT 258
+#define RMUST_T_FULL_VER_TAD_TDT 259
+#define RMUST_T_INC_VER_TAD_ADT 260
+#define RMUST_T_INC_VER_TAD_FDT 261
+#define RMUST_T_INC_VER_TAD_TDT 262
+#define RMUST_T_FULL_RES_TAD_ADT 263
+#define RMUST_T_FULL_RES_TAD_FDT 264
+#define RMUST_T_FULL_RES_TAD_TDT 265
+#define RMUST_T_ALT_BOOTSTRAP_DBK 266
+#define RMUST_T_RESTORE_ROOT_TAD_ADT 267
+#define RMUST_T_RESTORE_ROOT_TAD_FDT 268
+#define RMUST_T_RESTORE_ROOT_TAD_TDT 269
+#define RMUST_T_PAG_DBID 271
+#define RMUST_T_RELATED_FLG 272
+#define RMUST_T_COUPLED_FLG 274
+#define RMUST_T_CSM_FLG 275
+#define RMUST_T_SPREAD_FLG 276
+#define RMUST_T_RESTRUCTURED_FLG 277
+#define RMUST_T_WORM_DEVFULL_FLG 278
+#define RMUST_T_2PPL_ENABLED_FLG 279
+#define RMUST_T_WORM_AIJ_ENABLED_FLG 280
+#define RMUST_T_WORM_CORRUPT_FLG 281
+#define RMUST_T_RCACHE_ENABLED_FLG 282
+#define RMUST_T_WORM_LEOF 285
+#define RMUST_T_P0_VBN 286
+#define RMUST_T_CLUMP_PAGCNT 287
+#define RMUST_T_PAGES_PER_SPAM 288
+#define RMUST_T_AIJ_RCVR_VNO 289
+#define RMUST_T_PAG_LEN 290
+#define RMUST_T_PPSP1 291
+#define RMUST_T_SPAM_T1 292
+#define RMUST_T_SPAM_T2 293
+#define RMUST_T_SPAM_T3 294
+#define RMUST_T_SPAMVEC_LEN 295
+#define RMUST_T_PAG_PAD_LEN 296
+#define RMUST_T_MAX_FREE_LEN 297
+#define RMUST_T_MAX_NEW_SEG_LEN 298
+#define RMUST_T_MAX_SEG_LEN 299
+#define RMUST_T_BACKUP_STATS 300
+#define RMUST_T_RCACHE_DBID 301
+#define RMUST_T_SNAPS_ENABLED_TSN 302
+#define RMUST_T_COMMIT_TSN 303
+#define RMUST_T_BACKUP_TSN 304
+#define RMUST_T_INCR_BACKUP_TSN 305
+#define RMUST_T_ABS_QUIET_POINT_FLG 306
+#define RMUST_T_LSS_ACTIVE_FLG 307
+#define RMUST_T_LRS_ACTIVE_FLG 308
+#define RMUST_T_MASTER_DB_FLG 309
+#define RMUST_T_LSS_ONLINE_FLG 310
+#define RMUST_T_LSS_QUIET_POINT_FLG 311
+#define RMUST_T_CUR_RCVR_VBN 312
+#define RMUST_T_LSS_CKPT_INTRVL 313
+#define RMUST_T_LSS_WAIT_INTRVL 314
+#define RMUST_T_LSS_TIMEOUT_INTRVL 315
+#define RMUST_T_LSS_BUFFER_CNT 316
+#define RMUST_T_LSS_ACCESS_MODE 317
+#define RMUST_T_LSS_RESOLVE_2PC 318
+#define RMUST_T_LSS_STARTUP_TAD_ADT 319
+#define RMUST_T_LSS_STARTUP_TAD_FDT 320
+#define RMUST_T_LSS_STARTUP_TAD_TDT 321
+#define RMUST_T_BKUP_EDITNAM 322
+#define RMUST_T_REMOTE_NODENAM 323
+#define RMUST_T_SERVER_NAME 324
+#define RMUST_T_BKUP_FAILED_FLG 325
+#define RMUST_T_EMERGENCY_FLG 326
+#define RMUST_T_ACTIVATE_TAD_ADT 327
+#define RMUST_T_ACTIVATE_TAD_FDT 328
+#define RMUST_T_ACTIVATE_TAD_TDT 329
+#define RMUST_T_RDB_CHECKSUM 330
+#define RMUST_T_MONID 332
+#define RMUST_T_TID 333
+#define RMUST_T_TSNBLK_INDEX 334
+#define RMUST_T_TSNBLK_SLOT 335
+#define RMUST_T_REMOTE_FLG 336
+#define RMUST_T_ALS_FLG 337
+#define RMUST_T_DBR_FLG 338
+#define RMUST_T_SERVER_FLG 339
+#define RMUST_T_UTILITY_FLG 340
+#define RMUST_T_LCS_FLG 341
+#define RMUST_T_LRS_FLG 342
+#define RMUST_T_RCS_FLG 343
+#define RMUST_T_LSS_FLG 344
+#define RMUST_T_CKPT_VNO 345
+#define RMUST_T_CKPT_VBN 346
+#define RMUST_T_QUIET_VNO 347
+#define RMUST_T_VLM_ENABLED_FLG 352
+#define RMUST_T_REPLACE_ENABLED_FLG 353
+#define RMUST_T_SLOT_LEN 354
+#define RMUST_T_SLOT_COUNT 355
+#define RMUST_T_MAX_WS_COUNT 356
+#define RMUST_T_NAME 357
+#define RMUST_T_HASHED_INDEX_FLG 358
+#define RMUST_T_LAPMS_INDEX 359
+#define RMUST_T_VLM_WINDOW_COUNT 360
+#define RMUST_T_CKPT_SEQ 361
+#define RMUST_T_DEVDIR 362
+#define RMUST_T_HASH_LDBID_PRIME 363
+#define RMUST_T_HASH_PNO_PRIME 364
+#define RMUST_T_SWEEP_THRESH_HIGH 365
+#define RMUST_T_SWEEP_THRESH_LOW 366
+#define RMUST_T_SWEEP_FREE_PCT 367
+#define RMUST_T_SWEEP_BATCH_COUNT 368
+#define RMUST_T_MAX_RESERVE_COUNT 369
+#define RMUST_T_ALLOC_BLKCNT 370
+#define RMUST_T_EXTEND_BLKCNT 371
+#define RMUST_T_LIMBO_FLG 373
+#define RMUST_T_PREPARED_FLG 374
+#define RMUST_T_XATM_FLG 375
+#define RMUST_T_RESOLVE_FLG 376
+#define RMUST_T_RESOLUTION_FLG 377
+#define RMUST_T_RUJ_FILNAM 378
+#define RMUST_T_TM_LOG_ID 381
+#define RMUST_T_RM_LOG_ID 382
+#define RMUST_T_RM_NAME 383
+#define RMUST_T_NODE_NAME 384
+#define RMUST_T_PARENT_NODE_NAME 385
+#define RMUST_T_WIPMAP 388
+#define RMUST_T_SIPMAP 389
+#define RMUST_T_OLDEST_TSN 390
+#define RMUST_T_COMMIT_CSN 392
+#define RMUST_T_TSN_VEC 393
+#define RMUST_T_COMMIT_TSN_VEC 394
+#define RMUST_T_NEXT_SEQ 396
+#define RMUST_T_GROUP_SIZE 397
+#define RMUST_T_IGNORE_FLG 399
+#define RMUST_T_RECOVER_FLG 400
+#define RMUST_T_UPTO_AREA_FLG 401
+#define RMUST_T_LAST_COMMIT_TSN 403
+#define RMUST_T_PNO 404
+#define RMUST_T_PDBID 405
+#define RMUST_T_ABM_PNO 406
+#define RMUST_T_LAREA_DBID 407
+#define RMUST_T_PAREA_DBID 408
+#define RMUST_T_LAREA_NAME 409
+#define RMUST_T_REC_LEN 411
+#define RMUST_T_LAREA_EXT_CNT 412
+#define RMUST_T_MODULO_HASH_FLG 414
+#define RMUST_T_DELETED_TID 415
+#define RMUST_T_MOD_HASH_KEY_OFFSET 417
+#define RMUST_T_BITMAP 419
+#define RMUST_T_XID_FORMAT_ID 422
+#define RMUST_T_XID_GTRID_LENGTH 423
+#define RMUST_T_XID_BQUAL_LENGTH 424
+#define RMUST_T_XID_DATA 425
+#define RMUST_T_ACE_SIZE 426
+#define RMUST_T_ACE_TYPE 427
+#define RMUST_T_DEFAULT_FLG 428
+#define RMUST_T_PROTECTED_FLG 429
+#define RMUST_T_HIDDEN_FLG 430
+#define RMUST_T_NOPROPAGATE_FLG 431
+#define RMUST_T_READ_PRV_FLG 432
+#define RMUST_T_WRITE_PRV_FLG 433
+#define RMUST_T_EXECUTE_PRV_FLG 434
+#define RMUST_T_DELETE_PRV_FLG 435
+#define RMUST_T_CONTROL_PRV_FLG 436
+#define RMUST_T_DB_VERSION 437
+#define RMUST_T_NODE 438
+#define RMUST_T_CURRENT_TAD_ADT 439
+#define RMUST_T_CURRENT_TAD_FDT 440
+#define RMUST_T_CURRENT_TAD_TDT 441
+#define RMUST_T_NODE_DATABASES 442
+#define RMUST_T_DATABASE 443
+#define RMUST_T_ACTIVE_USERS 444
+#define RMUST_T_MONITOR_LOG 445
+#define RMUST_T_MONITOR_BUFFERS 446
+#define RMUST_T_USER_ID 448
+#define RMUST_T_USER_STATUS 449
+#define RMUST_T_DEVICE_NAME 450
+#define RMUST_T_DEVICE_STATUS 451
+#define RMUST_T_DEVICE_ERROR_CNT 452
+#define RMUST_T_LABEL 453
+#define RMUST_T_FREE_BLOCKS 454
+#define RMUST_T_TRANSFER_CNT 455
+#define RMUST_T_MOUNT_CNT 456
+#define RMUST_T_DEVICE_TYPE 457
+#define RMUST_T_DEVICE_CHAR 458
+#define RMUST_T_TABLE_NAME 459
+#define RMUST_T_LOGICAL_AREA_ID 460
+#define RMUST_T_TABLE_ID 461
+#define RMUST_T_INDEX_ID 462
+#define RMUST_T_LAPMS 463
+#define RMUST_T_LOGICAL_AREA_COUNT 464
+#define RMUST_T_ALL_LOGICAL_AREA_IDS 465
+#define RMUST_T_ALL_LAPMS 466
+#define RMUST_T_AIJ_MAX_IO_BLKS 468
+#define RMUST_T_AIJ_MIN_IO_BLKS 469
+#define RMUST_T_AIJ_STALL 470
+#define RMUST_T_COMMIT_STALL 471
+#define RMUST_T_DAPF_DEPTH_BUF_CNT 475
+#define RMUST_T_DAPF_START_BUF_CNT 476
+#define RMUST_T_LIVE_BW_MAX 477
+#define RMUST_T_MAX_DBR_CNT 478
+#define RMUST_T_ABS_PRIORITY 479
+#define RMUST_T_ALS_PRIORITY 480
+#define RMUST_T_DBR_PRIORITY 481
+#define RMUST_T_LCS_PRIORITY 482
+#define RMUST_T_LRS_PRIORITY 483
+#define RMUST_T_RCS_PRIORITY 484
+#define RMUST_T_CKPT_TRANS_INTERVAL 487
+#define RMUST_T_CTJ_TSN_INTERVAL 488
+#define RMUST_T_APF_ENABLED 489
+#define RMUST_T_ABW_ENABLED 490
+#define RMUST_T_DAPF_ENABLED 491
+#define RMUST_T_ABS_QUIET_POINT 492
+#define RMUST_T_RCACHE_RCRL_COUNT 493
+#define RMUST_T_RCS_BATCH_COUNT 494
+#define RMUST_T_RCS_CHECKPOINT 495
+#define RMUST_T_HOT_NETWORK_TIMEOUT 496
+#define RMUST_T_RCS_SWP_INT 497
+#define RMUST_T_RCS_COLD_LOW 498
+#define RMUST_T_RCS_COLD_HIGH 499
+#define RMUST_T_RCS_COLD_RECORDS 500
+#define RMUST_T_DBR_BUFFER_CNT 501
+#define RMUST_T_SNAP_QUIET_POINT 502
+#define RMUST_T_LOCK_TIMEOUT_INTERVAL 503
+#define RMUST_T_HRL_ENABLED 504
+#define RMUST_T_CBL_ENABLED 505
+#define RMUST_T_RUJ_EXTEND_BLKCNT 506
+#define RMUST_T_RCACHE_INSERT_ENABLED 507
+#define RMUST_T_RCS_ABORT_SWEEP 508
+#define RMUST_T_AIJ_ARB_COUNT 509
+#define RMUST_T_RCACHE_LATCH_SPIN_COUNT 510
+#define RMUST_T_RCWS_UNMARK_THRESHO 511
+#define RMUST_T_RUJ_ALLOC_BLKCNT 512
+#define RMUST_T_HOT_DATA_SYNC_MODE 513
+#define RMUST_T_HOT_CHECKPOINT 514
+#define RMUST_T_LCS_CONNECT_TIMEOUT 515
+#define RMUST_T_LRS_GAP_TIMEOUT 516
+#define RMUST_T_LRS_GOVERNOR_ENABLED 517
+#define RMUST_T_AIJ_SWITCH_GBL_CKPT 518
+#define RMUST_T_AIJ_CHK_CONTROL_RECS 519
+#define RMUST_T_READY_AREA_SERIALLY 520
+#define RMUST_T_ABS_OVRWRT_ALLOWED 521
+#define RMUST_T_ABS_OVRWRT_IMMEDIATE 522
+#define RMUST_T_ALS_CREATE_AIJ 523
+#define RMUST_T_VNO 524
+#define RMUST_T_AIJ_MAX_IO_BYTES 525
+#define RMUST_T_AIJ_MIN_IO_BYTES 526
+#define RMUST_T_HOT_ABS_SUSPEND 527
+#define RMUST_T_BUF_CNT 529
+#define RMUST_T_RCS_CKPT_BUFFER_CNT 530
+#define RMUST_T_UDASH_INDEX 531
+#define RMUST_T_RCACHE_INDEX 532
+#define RMUST_T_RUJ_INDEX 533
+#define RMUST_T_TSN_INDEX 534
+#define RMUST_T_SEQ_INDEX 535
+#define RMUST_T_CPT_INDEX 536
+#define RMUST_T_CRL_ENABLED 546
+#define RMUST_T_RCWS_UNMARK_THRESHOLD 551
+#define RMUST_T_VOLUME_NAME 555
+#define RMUST_T_MAX_BLOCKS 556
+#define RMUST_T_ACE_FLAGS 557
+#define RMUST_T_ACE_ACCESS 558
+#define RMUST_T_ALTER_PRV_FLG 559
+#define RMUST_T_ANALYSE_PRV_FLG 560
+#define RMUST_T_BACKUP_PRV_FLG 561
+#define RMUST_T_CONVERT_PRV_FLG 562
+#define RMUST_T_COPY_PRV_FLG 563
+#define RMUST_T_DUMP_PRV_FLG 564
+#define RMUST_T_LOAD_PRV_FLG 565
+#define RMUST_T_MOVE_PRV_FLG 566
+#define RMUST_T_OPEN_PRV_FLG 567
+#define RMUST_T_RESTORE_PRV_FLG 568
+#define RMUST_T_SECURITY_PRV_FLG 569
+#define RMUST_T_SHOW_PRV_FLG 570
+#define RMUST_T_UNLOAD_PRV_FLG 571
+#define RMUST_T_VERIFY_PRV_FLG 572
+#define RMUST_T_IDENTIFIER 573
+#define RMUST_T_ACE_TEXT 574
+#define RMUST_T_MONITOR_UP_FLG 575
+#define RMUST_K_TAG_LAST_TAG 575
+#define KUSGTBEND 1000
+#define KUSGTBOG 1001
+#define KUSGTEOG 1002
+#define KUSGTBTRN 1003
+#define KUSGTBCNT 1004
+#define KUSGTBDTG 1005
+#define KUSGTBKEY 1006
+#define KUSGTWCLS 1007
+#define KUSGTUNST 1008
+#define KUSGTMD 1009
+#define KUSGTNP 1010
+#define RMUST_MRT_STAREA_MAPS 2000
+#define RMUST_MRT_RELINFO 2001
+#define RMUST_MRT_IDXINFO 2002
+#define RMUST_CT_AIJINFO 2100
+#define RMUST_CT_AIJJNLS 2101
+#define RMUST_CT_ARPMS_STATS 2102
+#define RMUST_CT_DBINFO 2103
+#define RMUST_CT_DBR 2104
+#define RMUST_CT_FILE 2105
+#define RMUST_CT_PROCESS 2106
+#define RMUST_CT_STALL 2107
+#define RMUST_CT_STALL_ACT 2108
+#define RMUST_CT_RTPMS_STATS 2109
+#define RMUST_CT_FILE_NODUP 2110
+#define RMUST_CT_REC_CACHE 2111
+#define RMUST_CT_RUJINFO 2112
+#define RMUST_CT_TSNINFO 2113
+#define RMUST_CT_SEQINFO 2114
+#define RMUST_CT_CPTINFO 2115
+#define RMUST_CT_AIPINFO 2116
+#define RMUST_CT_ACTIVE 2117
+#define RMUST_CT_CLUSTER 2118
+#define RMUST_CT_RMUACL 2119
+#define RMUST_CT_USERS 2120
+#define RMUST_CT_DATABASES 2121
+#define RMUST_CT_TAPE_DEVICES 2122
+#define RMUST_CT_DISK_DEVICES 2123
+#define RMUST_CT_DASH 2124
+#define RMUST_CT_USER_DASH 2125
+#define RMUST_CT_DB_MONITOR 2126
+#define RMUST_CT_LAPMS_TABLE 2127
+#define RMUST_CT_LAPMS_INDEX 2128
+#define RMUST_CT_LAPMS_TABLE_STATS 2129
+#define RMUST_CT_LAPMS_INDEX_STATS 2130
+#define RMUST_CT_LAPMS_STATS 2131
+#define KUSC2_FILE_ENTRY 2501
+#define KUSC3_FILE_STATS 2502
+#define KUSC4_LIBRARY_CACHE 2503
+#define KUSC5_PARAMETERS 2504
+#define KUSC6_FILE_HEADER 2505
+#define KUSC7_PROCESS 2506
+#define KUSC8_SQL_AREA 2507
+#define KUSC9_SESSIONS 2508
+#define KUSC10_SGA 2509
+#define KUSC11_SQL_TEXT 2510
+#define KUSC12_SESSTAT 2511
+#define KUSC13_SESSIONS_STAT 2512
+#define KUSC14_SYSSTAT 2513
+#define KUSC15_EVENT_DESCRIPTIONS 2514
+#define KUSC16_SESSION_WAIT 2515
+#define KUSC17_OPEN_CURSOR 2516
+#define KUSC18_LATCH_WHERE 2517
+#define KUSC19_LATCH_MISSES 2518
+#define KUSC20_LATCH_HOLDER 2519
+#define KUSC21_LATCH 2520
+#define KUSC23_RESOURCE 2522
+#define KUSC24_LOCKS_1 2523
+#define KUSC25_LOCKS_2 2524
+#define KUSC26_LOCKS_3 2525
+#define KUSC27_LOCKS_4 2526
+#define KUSC28_LOCKS_5 2527
+#define KUSC29_LOCK1_STAT 2528
+#define KUSC30_LOCK2_STAT 2529
+#define KUSC31_LOCK3_STAT 2530
+#define KUSC32_LOCK4_STAT 2531
+#define KUS1_FILE_NUMBER 3000
+#define KUS2_FILE_NAME 3001
+#define KUS4_FILE_STATUS 3003
+#define KUS5_FILE_BLOCK_SIZE 3004
+#define KUS6_FILE_CREATE_BLOCKS 3005
+#define KUS7_SERVER_TYPE 3006
+#define KUS8_CHECKPOINT_CHANGE_NUMBER 3007
+#define KUS9_PHYRDS 3008
+#define KUS10_PHYWRTS 3009
+#define KUS11_READTIM 3010
+#define KUS12_WRITETIM 3011
+#define KUS13_PHYBLKRD 3012
+#define KUS14_PHYBLKWRT 3013
+#define KUS15_LIBRARYCACHE_NDX 3014
+#define KUS16_GETS 3015
+#define KUS17_GETHITS 3016
+#define KUS18_PINS 3017
+#define KUS19_PINHITS 3018
+#define KUS20_RELOADS 3019
+#define KUS21_INVALIDATIONS 3020
+#define KUS22_DLM_LOCK_REQUESTS 3021
+#define KUS23_DLM_PIN_REQUESTS 3022
+#define KUS24_DLM_PIN_RELEASES 3023
+#define KUS25_DLM_INVALIDATION_REQUESTS 3024
+#define KUS26_DLM_INVALIDATIONS 3025
+#define KUS27_PARAM_NUM 3026
+#define KUS28_PARAM_NAME 3027
+#define KUS29_PARAM_TYPE 3028
+#define KUS30_PARAM_VALUE 3029
+#define KUS31_PARAM_IS_DEFAULT 3030
+#define KUS32_PARAM_IS_SESS_MODIFIABLE 3031
+#define KUS33_PARAM_IS_SYS_MODIFIABLE 3032
+#define KUS34_PROC_ADDR 3033
+#define KUS35_PID 3034
+#define KUS36_SPID 3035
+#define KUS37_USERNAME 3036
+#define KUS38_SERIAL_NUMBER 3037
+#define KUS39_TERMINAL 3038
+#define KUS40_PROGRAM 3039
+#define KUS41_PROCESS_BACKGROUND 3040
+#define KUS42_LATCHWAIT 3041
+#define KUS43_LATCHSPIN 3042
+#define KUS44_PROCESS_ACTIVE 3043
+#define KUS45_SQL_TEXT 3044
+#define KUS46_SHARABLE_MEM 3045
+#define KUS47_PERSISTENT_MEM 3046
+#define KUS48_RUNTIME_MEM 3047
+#define KUS49_CURS_SORTS 3048
+#define KUS50_VERSION_COUNT 3049
+#define KUS51_LOADED_VERSIONS 3050
+#define KUS52_OPEN_VERSIONS 3051
+#define KUS53_USERS_OPENING 3052
+#define KUS54_EXECUTIONS 3053
+#define KUS55_USERS_EXECUTING 3054
+#define KUS56_LOADS 3055
+#define KUS57_FIRST_LOAD_TIME 3056
+#define KUS58_INVALIDATIONS 3057
+#define KUS59_PARSE_CALLS 3058
+#define KUS60_DISK_READS 3059
+#define KUS61_BUFFER_GETS 3060
+#define KUS62_COMMAND_TYPE 3061
+#define KUS63_ROWS_PROCESSED 3062
+#define KUS64_OPTIMIZER_MODE 3063
+#define KUS65_PARSING_USER_ID 3064
+#define KUS66_PARSING_SCHEMA_ID 3065
+#define KUS67_KEPT_VERSIONS 3066
+#define KUS68_PARENT_ADDRESS 3067
+#define KUS69_OBJECT_HASH 3068
+#define KUS70_MODULE 3069
+#define KUS71_MODULE_HASH 3070
+#define KUS72_ACTION 3071
+#define KUS73_ACTION_HASH 3072
+#define KUS74_SESSION_ADDR 3073
+#define KUS75_SID 3074
+#define KUS76_SERIAL_NUM 3075
+#define KUS77_AUDSID 3076
+#define KUS78_PADDR 3077
+#define KUS79_USER_NUM 3078
+#define KUS80_USERNAME 3079
+#define KUS81_COMMAND 3080
+#define KUS82_TADDR 3081
+#define KUS83_LOCKWAIT 3082
+#define KUS84_STATUS 3083
+#define KUS85_SERIALIZABLE_ABORTS 3084
+#define KUS86_SCHEMA_NUM 3085
+#define KUS87_SCHEMA_NAME 3086
+#define KUS88_OSUSER 3087
+#define KUS89_PROCESS 3088
+#define KUS90_MACHINE 3089
+#define KUS91_TERMINAL 3090
+#define KUS92_PROGRAM 3091
+#define KUS93_SESSION_TYPE 3092
+#define KUS94_SQL_ADDRESS 3093
+#define KUS95_SQL_HASH_VALUE 3094
+#define KUS96_PREV_SQL_ADDR 3095
+#define KUS97_PREV_HASH_VALUE 3096
+#define KUS98_MODULE 3097
+#define KUS99_MODULE_HASH 3098
+#define KUS100_ACTION 3099
+#define KUS101_ACTION_HASH 3100
+#define KUS102_CLIENT_INFO 3101
+#define KUS103_FIXED_TABLE_SEQUENCE 3102
+#define KUS104_ROW_WAIT_OBJECT 3103
+#define KUS105_ROW_WAIT_FILE 3104
+#define KUS106_ROW_WAIT_BLOCK 3105
+#define KUS107_ROW_WAIT_ROW 3106
+#define KUS108_LOGON_TIME 3107
+#define KUS109_LAST_CALL_ELAPSE_TIME 3108
+#define KUS110_OBJECT_STATE 3109
+#define KUS111_SESSION_FLAGS 3110
+#define KUS112_SGA_NAME 3111
+#define KUS113_SGA_SIZE 3112
+#define KUS114_SQL_TEXT_ADDR 3113
+#define KUS115_HASH_VALUE 3114
+#define KUS116_SQL_TEXT_PIECE 3115
+#define KUS117_SQL_TEXT 3116
+#define KUS118_SESSION_STATS_ARRAY 3117
+#define KUS119_SYS_STATISTIC_NUM 3118
+#define KUS121_SYS_STATISTIC_NAME 3120
+#define KUS122_SYS_STATISTIC_CLASS 3121
+#define KUS123_SYS_STATISTIC_VALUE 3122
+#define KUS124_EVENT_NUMBER 3123
+#define KUS125_EVENT_NAME 3124
+#define KUS126_PARAM_1_TEXT 3125
+#define KUS127_PARAM_2_TEXT 3126
+#define KUS128_PARAM_3_TEXT 3127
+#define KUS129_SESSION_SEQ_NUM 3128
+#define KUS130_P1 3129
+#define KUS131_P1_RAW 3130
+#define KUS132_P2 3131
+#define KUS133_P2_RAW 3132
+#define KUS134_P3 3133
+#define KUS135_P3_RAW 3134
+#define KUS136_WAIT_TIME 3135
+#define KUS137_SECONDS_IN_WAIT 3136
+#define KUS138_OBJECT_STATE_FLAGS 3137
+#define KUS139_LATCH_ADDRESS 3138
+#define KUS140_USER_NAME 3139
+#define KUS141_CURSOR_ADDRESS 3140
+#define KUS142_CURSOR_HASH_VALUE 3141
+#define KUS143_CURSOR_SQL_TEXT 3142
+#define KUS144_CURSOR_OBJ_NAME_SPACE 3143
+#define KUS145_CURSOR_OBJ_HANDLE 3144
+#define KUS146_LATCH_NUMBER 3145
+#define KUS147_LATCH_WHERE 3146
+#define KUS148_LATCH_PARENT_NAME 3147
+#define KUS149_LATCH_NO_WAIT_FAIL_COUNT 3148
+#define KUS150_LATCH_NAME 3149
+#define KUS151_LATCH_LEVEL_NUMBER 3150
+#define KUS152_LATCH_GETS 3151
+#define KUS153_LATCH_MISSES 3152
+#define KUS154_SLEEPS 3153
+#define KUS155_IMMEDIATE_GETS 3154
+#define KUS156_IMMEDIATE_MISSES 3155
+#define KUS157_WAITERS_WOKEN 3156
+#define KUS158_WAITS_HOLDING_LATCH 3157
+#define KUS159_SPIN_GETS 3158
+#define KUS160_SLEEP1 3159
+#define KUS161_SLEEP2 3160
+#define KUS162_SLEEP3 3161
+#define KUS163_SLEEP4 3162
+#define KUS164_SLEEP5 3163
+#define KUS165_SLEEP6 3164
+#define KUS166_SLEEP7 3165
+#define KUS167_SLEEP8 3166
+#define KUS168_SLEEP9 3167
+#define KUS169_SLEEP10 3168
+#define KUS170_SLEEP11 3169
+#define KUS171_SLEEP12 3170
+#define KUS172_SLEEP13 3171
+#define KUS173_RESOURCE_ADDR 3172
+#define KUS174_RESOURCE_TYPE 3173
+#define KUS175_RESOURCE_ID_1 3174
+#define KUS176_RESOURCE_ID_2 3175
+#define KUS177_RESOURCE_FLAG 3176
+#define KUS178_LOCK_STATE_ADDRESS 3177
+#define KUS179_LOCK_ADDRESS 3178
+#define KUS180_LOCK_MODE_HELD 3179
+#define KUS181_LOCK_MODE_REQUESTED 3180
+#define KUS182_LOCK_HELD_TIME 3181
+#define KUS183_BLOCKING 3182
+#define KUS184_LATCH_SLEEP_COUNT 3183
+#define KUS185_CURRENT_FILE_BLOCKS 3184
+#define KUS203_FILE_ENABLED 3202
+#define KUS204_CACHE_NAMESPACE 3203
+#define KUS205_PARAM_IS_MODIFIED 3204
+#define KUS206_PARAM_IS_ADJUSTED 3205
+#define KUS207_PARAM_DESCRIPTION 3206
+#define KUSST1 5000
+#define KUSST2 5001
+#define KUSST3 5002
+#define KUSST4 5003
+#define KUSST5 5004
+#define KUSST6 5005
+#define KUSST7 5006
+#define KUSST8 5007
+#define KUSST9 5008
+#define KUSST10 5009
+#define KUSST11 5010
+#define KUSST12 5011
+#define KUSST13 5012
+#define KUSST14 5013
+#define KUSST15 5014
+#define KUSST16 5015
+#define KUSST17 5016
+#define KUSST18 5017
+#define KUSST19 5018
+#define KUSST20 5019
+#define KUSST21 5020
+#define KUSST22 5021
+#define KUSST23 5022
+#define KUSST24 5023
+#define KUSST25 5024
+#define KUSST26 5025
+#define KUSST27 5026
+#define KUSST28 5027
+#define KUSST29 5028
+#define KUSST30 5029
+#define KUSST31 5030
+#define KUSST32 5031
+#define KUSST33 5032
+#define KUSST34 5033
+#define KUSST35 5034
+#define KUSST36 5035
+#define KUSST37 5036
+#define KUSST38 5037
+#define KUSST39 5038
+#define KUSST40 5039
+#define KUSST41 5040
+#define KUSST42 5041
+#define KUSST43 5042
+#define KUSST44 5043
+#define KUSST45 5044
+#define KUSST46 5045
+#define KUSST47 5046
+#define KUSST48 5047
+#define KUSST49 5048
+#define KUSST50 5049
+#define KUSST51 5050
+#define KUSST52 5051
+#define KUSST53 5052
+#define KUSST54 5053
+#define KUSST55 5054
+#define KUSST56 5055
+#define KUSST57 5056
+#define KUSST58 5057
+#define KUSST59 5058
+#define KUSST60 5059
+#define KUSST61 5060
+#define KUSST62 5061
+#define KUSST63 5062
+#define KUSST64 5063
+#define KUSST65 5064
+#define KUSST66 5065
+#define KUSST67 5066
+#define KUSST68 5067
+#define KUSST69 5068
+#define KUSST70 5069
+#define KUSST71 5070
+#define KUSST72 5071
+#define KUSST73 5072
+#define KUSST74 5073
+#define KUSST75 5074
+#define KUSST76 5075
+#define KUSST77 5076
+#define KUSST78 5077
+#define KUSST79 5078
+#define KUSST80 5079
+#define KUSST81 5080
+#define KUSST82 5081
+#define KUSST83 5082
+#define KUSST84 5083
+#define KUSST85 5084
+#define KUSST86 5085
+#define KUSST87 5086
+#define KUSST88 5087
+#define KUSST89 5088
+#define KUSST90 5089
+#define KUSST91 5090
+#define KUSST92 5091
+#define KUSST93 5092
+#define KUSST94 5093
+#define KUSST95 5094
+#define KUSST96 5095
+#define KUSST97 5096
+#define KUSST98 5097
+#define KUSST99 5098
+#define KUSST100 5099
+#define KUSST101 5100
+#define KUSST102 5101
+#define KUSST103 5102
+#define KUSST104 5103
+#define KUSST105 5104
+#define KUSST106 5105
+#define KUSST107 5106
+#define KUSST108 5107
+#define KUSST109 5108
+#define KUSST110 5109
+#define KUSST111 5110
+#define KUSST112 5111
+#define KUSST113 5112
+#define KUSST114 5113
+#define KUSST115 5114
+#define KUSST116 5115
+#define KUSST117 5116
+#define KUSST118 5117
+#define KUSST119 5118
+#define KUSST120 5119
+#define KUSST121 5120
+#define KUSST122 5121
+#define KUSST123 5122
+#define KUSST124 5123
+#define KUSST125 5124
+#define KUSST126 5125
+#define KUSST127 5126
+#define KUSST128 5127
+#define KUSST129 5128
+#define KUSST130 5129
+#define KUSST131 5130
+#define KUSST132 5131
+#define KUSST133 5132
+#define KUSST134 5133
+#define KUSST135 5134
+#define KUSST136 5135
+#define KUSST137 5136
+#define KUSST138 5137
+#define KUSST139 5138
+#define KUSST140 5139
+#define KUSST141 5140
+#define KUSST142 5141
+#define KUSST143 5142
+#define KUSST144 5143
+#define KUSST145 5144
+#define KUSST146 5145
+#define KUSST147 5146
+#define KUSST148 5147
+#define KUSST149 5148
+#define KUSST150 5149
+#define KUSST151 5150
+#define KUSST152 5151
+#define KUSST153 5152
+#define KUSST154 5153
+#define KUSST155 5154
+#define KUSST156 5155
+#define KUSST157 5156
+#define KUSST158 5157
+#define KUSST159 5158
+#define KUSST160 5159
+#define KUSST161 5160
+#define KUSST162 5161
+#define KUSST163 5162
+#define KUSST164 5163
+#define KUSST165 5164
+#define KUSST166 5165
+#define KUSST167 5166
+#define KUSST168 5167
+#define KUSST169 5168
+#define KUSST170 5169
+#define KUSST171 5170
+#define KUSST172 5171
+#define KUSST173 5172
+#define KUSST174 5173
+#define KUSST175 5174
+#define KUSST176 5175
+#define KUSST177 5176
+#define KUSST178 5177
+#define KUSST179 5178
+#define KUSST180 5179
+#define KUSST181 5180
+#define KUSST182 5181
+#define KUSST183 5182
+#define KUSST184 5183
+#define KUSST185 5184
+#define KUSST186 5185
+#define KUSST187 5186
+#define KUSST188 5187
+#define KUSST189 5188
+#define KUSST190 5189
+#define KUSST191 5190
+#define KUSST192 5191
+#define KUSST193 5192
+#define KUSST194 5193
+#define KUSST195 5194
+#define KUSST196 5195
+#define KUSST197 5196
+#define KUSST198 5197
+#define KUSST199 5198
+
+/* 0-based count of tags */
+
+#define KUSTAGCOUNT 975
+
+/* Oracle Rdb tags (0-999)*/
+
+#define KUSRTAGSTART 0
+#define KUSRTAGEND 999
+
+/* global tags (1000 - 1999) */
+
+#define KUSGTTAGSTART 1000
+#define KUSGTTAGEND 1999
+
+/* Oracle Rdb class tags */
+
+#define KUSRCTAGSTART 2000
+#define KUSRCTAGEND 2499
+
+/* Oracle class tags */
+
+#define KUSOCTAGSTART 2500
+#define KUSOCTAGEND 2999
+
+/* oracle tags (3000 - 9999) */
+
+#define KUSOTAGSTART 3000
+#define KUSOTAGMAX 9999
+
+/* ENABLE check_macro_naming */
+
+#endif
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h b/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h
new file mode 100644
index 0000000..bd2a63a
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h
@@ -0,0 +1,647 @@
+/* DISABLE check_long_lines  */
+
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/nzerror.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ *
+ * Copyright (c) 1995, 2003, Oracle Corporation.  All rights reserved.  
+ */
+
+/* ENABLE check_long_lines  */
+/*
+  NAME
+     nzerror.h - error numbers for the Oracle Security Server
+  DESCRIPTION
+     None.
+  PUBLIC FUNCTION(S)
+     None.
+  PRIVATE FUNCTION(S)
+     None.
+  NOTES
+     A pragma is used to silence olint about the enum value names not being
+     unique within 7 characters. This limit is being changed to 30.
+  MODIFIED
+     rchahal    10/15/03 - bug 2513821 
+     rchahal    08/14/03 - new error range (43000 - 43499) 
+     skalyana   08/25/03 - Error changes 
+     rchahal    06/27/03 - RSA errors
+     rchahal    05/27/03 - convert wallet
+     skalyana   03/07/03 - Move FIPS errors
+     rchahal    02/28/03 - bug 2648177
+     rchahal    01/20/03 - use sltsky
+     rchahal    11/11/02 - pkcs11 support
+     skalyana   11/29/02 - Add mutex errors
+     akoyfman   11/01/02 - adding crl cache
+     rchahal    10/23/02 - crldp error
+     rchahal    10/15/02 - fetch crl from ldap
+     rchahal    10/07/02 - crl support
+     akoyfman   10/16/02 - Update with SSL PLus 4.2 errors
+     skalyana   10/04/02 - Certicom SSL Plus 4.2 Upgrade changes
+     akoyfman   08/06/02 - adding sso wallet errors
+     akoyfman   07/12/02 - adding secret store errors
+     skalyana   07/07/02 - Add more errors for FIPS self tests
+     skalyana   07/01/02 - Add more errors
+     skalyana   06/03/02 - Add NZ error for self test failure.
+     ajacobs    02/22/01 - Add some entrust errors
+     vle        02/09/01 - add error mesg
+     lkethana   08/11/00 - Extension Errors
+     lkethana   07/30/00 - add pkcs12 errors
+     lkethana   06/17/00 - mult cert errors
+     lkethana   06/11/00 - multiple cert support
+     rturlapa   03/29/00 - Add error meesage for Entrust Login failure.
+     rwessman   07/07/99 - Deleted include of sslerrs.h. It caused the RDBMS bu
+     rwessman   07/02/99 - fixed merge errors
+     rwessman   07/01/99 - moved NZOS errors to nzerror to make them visible
+     supriya    12/16/98 - add new error for cert chain.
+     arswamin   12/04/98 - add NZERROR_NO_MATCHING_PRIVATE_KEY
+     qdinh      11/12/98 - add NZERROR_VALIDITY_EXPIRED.
+     arswamin   06/17/98 - add INIT_FAILED
+     sdange     06/10/98 - change wrong password to bad password
+     amthakur   06/09/98 - adding error messages
+     wliau      03/10/97 - Add new error message for snzdfo.c.
+     rwessman   03/14/97 - Consolidated PL/SQL toolkit errors into generic erro
+     rwessman   02/26/97 - Added NZERROR_UNSUPPORTED. Corrected values of
+                           errors outside the valid range.
+     asriniva   03/02/97 - Fix olint warning
+     rwessman   02/26/97 - Added NZERROR_UNSUPPORTED
+     rwessman   01/02/97 - Changed PLSQL package errors to be TK_PLSQL to
+                           separate them from the errors generated by the
+                           Oracle interface.
+     rwessman   12/30/96 - Merged in PL/SQL toolkit errors
+     sdange     11/14/96 - (Added NZERROR_DECRYPT_FAILED to the enum list)
+     rwessman   12/02/96 -
+     rwessman   11/25/96 - Added error messages for PL/SQL functions.
+     asriniva   10/31/96 - Include oratypes.h
+     asriniva   10/29/96 - Fix numbering.
+     asriniva   10/29/96 - Fix error numbers
+     asriniva   10/29/96 - Correct type-o
+     asriniva   10/28/96 - Add more TK errors
+     asriniva   10/28/96 - Convert OKAPI errors to TK errors.
+     rwessman   10/17/96 - still more OSS TK errors
+     asriniva   10/16/96 - OKAPI errors
+     asriniva   10/15/96 - OSSTK errors
+     rwessman   10/15/96 - Added more OSS TK errors
+     asriniva   10/09/96 - Add OSSTK errors.
+     rwessman   09/05/96 - Added errors for PL/SQL functions.
+     wliau      09/05/96 - correct error numbers.
+     $Log: nzerror.h,v $
+     Revision 1.3  2005/05/06 16:48:55  karine
+     nova versao OCI 10.1.0.2
+
+ * Revision 1.26  1996/07/15  23:07:23  wliau
+ * Added NZERROR_AUTH_SHARED_MEMORY
+ *
+ * Revision 1.25  1996/07/01  20:40:15  asriniva
+ * Finished RSA verify/sign.
+ *
+ * Revision 1.24  1996/06/27  20:39:41  rwessman
+ * Added more errors.
+ *
+ * Revision 1.23  1996/05/31  17:33:40  rwessman
+ * Updated nzerror.h to contain bug # for olint enum bug.
+ *
+ * Revision 1.22  1996/05/31  17:12:30  rwessman
+ * Assigned values to the various errors.
+ *
+ * Revision 1.21  1996/05/13  20:46:58  ggilchri
+ * Added more attribute related error conditions
+ *
+*/
+
+#ifndef NZERROR_ORACLE
+# define NZERROR_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif /* ORATYPES */
+
+/*
+** Errors - when an error is added here, a message corresponding to the
+** error number must be added to the message file.
+** New errors must be assigned numbers, otherwise the compiler can assign any
+** value that it wants, which may lead to invalid error numbers being
+** generated.
+** The number range currently assigned to the OSS is 28750 - 29249
+** New number range 43000 - 43499
+*/
+
+typedef enum nzerror
+{
+  NZERROR_OK = 0,
+  NZERROR_GENERIC = 28750,                          /* A catchall for errors */
+  NZERROR_NO_MEMORY = 28751,                               /* No more memory */
+  NZERROR_DATA_SOURCE_INIT_FAILED = 28752,     /* Failed to init data source */
+  NZERROR_DATA_SOURCE_TERM_FAILED = 28753,/* Failed to terminate data source */
+  NZERROR_OBJECT_STORE_FAILED = 28754, /* Store object in data source failed */
+  NZERROR_OBJECT_GET_FAILED = 28755,
+                                 /* Failed to obtain object from data source */
+  NZERROR_MEMORY_ALLOC_FAILED = 28756,
+                                       /* Callback failed to allocate memory */
+  NZERROR_MEMORY_ALLOC_0_BYTES = 28757,
+                                   /* Attempted to ask for 0 bytes of memory */
+  NZERROR_MEMORY_FREE_FAILED = 28758,
+                                           /* Callback failed to free memory */
+  NZERROR_FILE_OPEN_FAILED = 28759,
+                                                      /* Open of file failed */
+  NZERROR_LIST_CREATION_FAILED = 28760,
+                                                  /* Creation of list failed */
+  NZERROR_NO_ELEMENT = 28761,
+                                                    /* No list element found */
+  NZERROR_ELEMENT_ADD_FAILED = 28762,
+                                          /* Addition of list element failed */
+  NZERROR_PARAMETER_BAD_TYPE = 28763,
+                                   /* Retrieval of an unknown parameter type */
+  NZERROR_PARAMETER_RETRIEVAL = 28764,      /* Retrieval of parameter failed */
+                             
+  NZERROR_NO_LIST = 28765,                /* Data method list does not exist */
+  NZERROR_TERMINATE_FAIL = 28766,                     /* Failed to terminate */
+  NZERROR_BAD_VERSION_NUMBER = 28767,                  /* Bad version number */
+  NZERROR_BAD_MAGIC_NUMBER = 28768,                      /* Bad magic number */
+  NZERROR_METHOD_NOT_FOUND = 28769,
+                           /* Data retrieval method specified does not exist */
+  NZERROR_ALREADY_INITIALIZED = 28770,
+                                    /*The data source is already initialized */
+  NZERROR_NOT_INITIALIZED = 28771,     /* The data source is not initialized */
+  NZERROR_BAD_FILE_ID = 28772,                             /* File ID is bad */
+  NZERROR_WRITE_MAGIC_VERSION = 28773,  /* Failed to write magic and version */
+  NZERROR_FILE_WRITE_FAILED = 28774,              /* Failed to write to file */
+  NZERROR_FILE_CLOSE_FAILED = 28775,                 /* Failed to close file */
+  NZERROR_OUTPUT_BUFFER_TOO_SMALL = 28776,
+                           /* The buffer supplied by the caller is too small */
+  NZERROR_BINDING_CREATION_FAILED = 28777,/* NL failed in creating a binding */
+  NZERROR_PARAMETER_MALFORMED = 28778,    /* A parameter was in a bad format */
+  NZERROR_PARAMETER_NO_METHOD = 28779,
+                                  /* No method was specified for a data type */
+  NZERROR_BAD_PARAMETER_METHOD = 28780,      /* Illegal method for data type */
+  NZERROR_PARAMETER_NO_DATA = 28781,    /* No method specified when required */
+  NZERROR_NOT_ALLOCATED = 28782,             /* Data source is not allocated */
+  NZERROR_INVALID_PARAMETER = 28783,               /* Invalid parameter name */
+  NZERROR_FILE_NAME_TRANSLATION = 28784,/* Could not translate OSD file name */
+  NZERROR_NO_SUCH_PARAMETER = 28785,   /* Selected parameter is non-existent */
+
+  NZERROR_DECRYPT_FAILED = 28786,  
+                                 /* Encrypted private key decryption failure */ 
+  NZERROR_ENCRYPT_FAILED = 28787,     /* Private key encryption failed */
+ 
+  NZERROR_INVALID_INPUT = 28788,     /* Incorrect input or unknown error */ 
+
+  NZERROR_NAME_TYPE_NOT_FOUND = 28789,
+                                  /* Type of name requested is not available */
+  NZERROR_NLS_STRING_OPEN_FAILED = 28790,
+                                        /* Failure to generate an NLS string */
+  NZERROR_CERTIFICATE_VERIFY = 28791,      /* Failed to verify a certificate */
+  NZERROR_OCI_PLSQL_FAILED = 28792,
+                                 /* an OCI call to process some plsql failed */
+  NZERROR_OCI_BIND_FAILED = 28793,
+                              /* an OCI call to bind an internal var. failed */
+  NZERROR_ATTRIBUTE_INIT = 28794,           /* failed to init role retrieval */
+  NZERROR_ATTRIBUTE_FINISH_FAILED = 28795,/* Did not complete role retrieval */
+  NZERROR_UNSUPPORTED_METHOD = 28796, /* Data method specified not supported */
+  NZERROR_INVALID_KEY_DATA_TYPE = 28797,
+                                      /* Invalid data type specified for key */
+  NZEROR_BIND_SUBKEY_COUNT = 28798,
+       /* Number of sub-keys to bind does not match count in initialized key */
+  NZERROR_AUTH_SHARED_MEMORY = 28799,
+    /* Failed to retreieve authentication information from the shared memory */
+  NZERROR_RIO_OPEN = 28800,                               /* RIO Open Failed */
+  NZERROR_RIO_OBJECT_TYPE = 28801,                /* RIO object type invalid */
+  NZERROR_RIO_MODE = 28802,                              /* RIO mode invalid */
+  NZERROR_RIO_IO = 28803,                     /* RIO io set or numberinvalid */
+  NZERROR_RIO_CLOSE = 28804,                             /* RIO close failed */
+  NZERROR_RIO_RETRIEVE = 28805,                       /* RIO retrieve failed */
+  NZERROR_RIO_STORE = 28806,                             /* RIO store failed */
+  NZERROR_RIO_UPDATE = 28807,                           /* RIO update failed */
+  NZERROR_RIO_INFO = 28808,                               /* RIO info failed */
+  NZERROR_RIO_DELETE = 28809,                           /* RIO delete failed */
+  NZERROR_KD_CREATE = 28810,                 /* Key descriptor create failed */
+  NZERROR_RIO_ACCESS_DESCRIPTOR = 28811,        /* access descriptor invalid */
+  NZERROR_RIO_RECORD = 28812,                              /* record invalid */
+  NZERROR_RIO_RECORD_TYPE = 28813,    /* record type and AD type not matched */
+  NZERROR_PLSQL_ORACLE_TO_REAL = 28814,
+          /* A number passed to PL/SQL could not be converted to real format */
+  NZERROR_PLSQL_REAL_TO_ORACLE = 28815,
+       /* A number in machine format could not be converted to Oracle format */
+  NZERROR_TK_PLSQL_NO_PASSWORD = 28816,
+                         /* A password was not provided to a PL/SQL function */
+  NZERROR_TK_PLSQL_GENERIC = 28817,
+                                      /* A PL/SQL function returned an error */
+  NZERROR_TK_PLSQL_NO_CONTEXT = 28818,
+               /* The package context was not specified to a PL/SQL function */
+  NZERROR_TK_PLSQL_NO_DIST_NAME = 28819,
+      /* The user's distinguished name was not provided to a PL/SQL function */
+  NZERROR_TK_PLSQL_NO_STATE = 28820,
+/* The state of either a signature or decryption/encryption was not provided */
+  NZERROR_TK_PLSQL_NO_INPUT = 28821,
+                       /* An input buffer was specified to a PL/SQL function */
+  NZERROR_TK_PLSQL_NO_SEED = 28822,
+         /* No seed was specified to the PL/SQL seed initialization function */
+  NZERROR_TK_PLSQL_NO_BYTES = 28823,
+  /* Number of bytes was not specified to the PL/SQL random number generator */
+  NZERROR_TK_INVALID_STATE = 28824,
+                     /* Invalid encryption/decryption/signature state passed */
+  NZERROR_TK_PLSQL_NO_ENG_FUNC = 28825,
+                                  /* No crypto engine function was passed in */
+  NZERROR_TK_INV_ENG_FUNC = 28826,
+                          /* An invalid crypto engine function was passed in */
+  NZERROR_TK_INV_CIPHR_TYPE = 28827,
+                                     /* An invalid cipher type was passed in */
+  NZERROR_TK_INV_IDENT_TYPE = 28828,
+                                   /* An invalid identity type was specified */
+  NZERROR_TK_PLSQL_NO_CIPHER_TYPE = 28829,
+                                             /* No cipher type was specified */
+  NZERROR_TK_PLSQL_NO_IDENT_TYPE = 28830,
+                                           /* No identity type was specified */
+  NZERROR_TK_PLSQL_NO_DATA_FMT = 28831,
+                                        /* No data unit format was specified */
+  NZERROR_TK_INV_DATA_FMT = 28832,
+                        /* Invalid data unit format was provided to function */
+  NZERROR_TK_PLSQL_INSUFF_INFO = 28833,
+       /* Not enough info (usually parameters) provided to a PL/SQL function */
+  NZERROR_TK_PLSQL_BUF_TOO_SMALL = 28834,
+           /* Buffer provided by PL/SQL is too small for data to be returned */
+  NZERROR_TK_PLSQL_INV_IDENT_DESC = 28835,
+                             /* Identity descriptor not present or too small */
+  NZERROR_TK_PLSQL_WALLET_NOTOPEN = 28836,
+                                           /* Wallet has not been opened yet */
+  NZERROR_TK_PLSQL_NO_WALLET = 28837,
+                        /* No wallet descriptor specified to PL/SQL function */
+  NZERROR_TK_PLSQL_NO_IDENTITY = 28838,
+                      /* No identity descriptor specified to PL/SQL function */
+  NZERROR_TK_PLSQL_NO_PERSONA = 28839,
+                   /* No persona descriptor was specified to PL/SQL function */
+  NZERROR_TK_PLSQL_WALLET_OPEN = 28840,
+                                                /* Wallet was already opened */
+  NZERROR_UNSUPPORTED = 28841,                 /* Operation is not supported */
+  NZERROR_FILE_BAD_PERMISSION = 28842,      /* Bad file permission specified */
+  NZERROR_FILE_OSD_ERROR = 28843,             /* OSD error when opening file */
+  NZERROR_NO_WALLET  = 28844,  /* cert + privkey + tp files do not exist */
+  NZERROR_NO_CERTIFICATE_ALERT    = 28845,  /* no certificate */
+  NZERROR_NO_PRIVATE_KEY          = 28846,  /* no private-key */
+  NZERROR_NO_CLEAR_PRIVATE_KEY_FILE   = 28847,   /* no clear key-file */
+  NZERROR_NO_ENCRYPTED_PRIVATE_KEY_FILE = 28848,  /* no encrypted priv key */
+  NZERROR_NO_TRUSTPOINTS     = 28849,       /* no trustpoints */
+  NZERROR_NO_CLEAR_TRUSTPOINT_FILE    = 28850,   /* no clear trustpoints */
+  NZERROR_NO_ENCRYPTED_TRUSTPOINT_FILE = 28851,   /* no encrypted trustpoints */
+  NZERROR_BAD_PASSWORD    = 28852,   /* bad password */
+  NZERROR_INITIALIZATION_FAILED   =  28853, /* init failed or 
+					       module loading failed */
+  /******************************* SSL ERRORS ********************************/
+  /*
+   * In order to allow SSL errors to be mapped to Oracle errors, space is
+   * provided here. One Oracle error is provided for each SSL error to make
+   * error handling easier. A macro is provided to do the conversion.
+   * NOTE: ANY CHANGE IN SSL ERRORS MUST BE REFLECTED HERE.
+   * To add an SSL error, use the following formula to calculate the Oracle
+   * error:
+   * new_oracle_error = (new_ssl_error - SSLMemoryError) + NZERROR_SSLMemoryErr
+   * or numerically:
+   * new_oracle_error = (new_ssl_error - -7000) + 28854
+   */
+  NZERROR_SSLMemoryErr = 28854,
+  NZERROR_SSLUnsupportedErr = 28855,
+  NZERROR_SSLOverflowErr = 28856,
+  NZERROR_SSLUnknownErr = 28857,
+  NZERROR_SSLProtocolErr = 28858,
+  NZERROR_SSLNegotiationErr = 28859,
+  NZERROR_SSLFatalAlert = 28860,
+  NZERROR_SSLWouldBlockErr = 28861,
+  NZERROR_SSLIOErr = 28862,
+  NZERROR_SSLSessionNotFoundErr = 28863,
+  NZERROR_SSLConnectionClosedGraceful = 28864,
+  NZERROR_SSLConnectionClosedError = 28865,
+  NZERROR_ASNBadEncodingErr = 28866,
+  NZERROR_ASNIntegerTooBigErr = 28867,
+  NZERROR_X509CertChainInvalidErr = 28868,
+  NZERROR_X509CertExpiredErr = 28869,
+  NZERROR_X509NamesNotEqualErr = 28870,
+  NZERROR_X509CertChainIncompleteErr = 28871,
+  NZERROR_X509DataNotFoundErr = 28872,
+  NZERROR_SSLBadParameterErr = 28873,
+  NZERROR_SSLIOClosedOverrideGoodbyeKiss = 28874,
+  NZERROR_X509MozillaSGCErr  =  28875,
+  NZERROR_X509IESGCErr       =  28876,
+  NZERROR_ImproperServerCredentials = 28877,
+  NZERROR_ImproperClientCredentials = 28878,
+  NZERROR_NoProtocolSideSet = 28879,
+  NZERROR_setPersonaFailed = 28880,
+  NZERROR_setCertFailed = 28881,
+  NZERROR_setVKeyFailed = 28882,
+  NZERROR_setTPFailed = 28883,
+  NZERROR_BadCipherSuite = 28884,
+  NZERROR_NoKeyPairForKeyUsage = 28885,
+
+/* ============>>>  ENTRUST ERRORS */
+  NZERROR_EntrustLoginFailed = 28890,
+  NZERROR_EntrustGetInfoFailed = 28891,
+  NZERROR_EntrustLoadCertificateFailed = 28892,
+  NZERROR_EntrustGetNameFailed = 28893,
+
+/* ============>>> NZERRORS CONTINUED */
+  NZERROR_CertNotInstalled = 29000,
+  NZERROR_ServerDNMisMatched = 29002,
+  NZERROR_ServerDNMisConfigured = 29003,
+
+/* ============>>> PKI VENDORS ERRORS 29050 - 29099 */
+
+/* ============>>> SSL Errors CONTINUED */
+  NZERROR_CIC_ERR_SSL_ALERT_CB_FAILURE = 29004,
+  NZERROR_CIC_ERR_SSL_BAD_CERTIFICATE = 29005,
+  NZERROR_CIC_ERR_SSL_BAD_CERTIFICATE_REQUEST = 29006,
+  NZERROR_CIC_ERR_SSL_BAD_CLEAR_KEY_LEN = 29007,
+  NZERROR_CIC_ERR_SSL_BAD_DHPARAM_KEY_LENGTH = 29008,
+  NZERROR_CIC_ERR_SSL_BAD_ENCRYPTED_KEY_LEN = 29009,
+  NZERROR_CIC_ERR_SSL_BAD_EXPORT_KEY_LENGTH = 29010,
+  NZERROR_CIC_ERR_SSL_BAD_FINISHED_MESSAGE = 29011,
+  NZERROR_CIC_ERR_SSL_BAD_KEY_ARG_LEN = 29012,
+  NZERROR_CIC_ERR_SSL_BAD_MAC = 29013,
+  NZERROR_CIC_ERR_SSL_BAD_MAX_FRAGMENT_LENGTH_EXTENSION = 29014,
+  NZERROR_CIC_ERR_SSL_BAD_MESSAGE_LENGTH = 29015,
+  NZERROR_CIC_ERR_SSL_BAD_PKCS1_PADDING = 29016,
+  NZERROR_CIC_ERR_SSL_BAD_PREMASTER_SECRET_LENGTH = 29017,
+  NZERROR_CIC_ERR_SSL_BAD_PREMASTER_SECRET_VERSION = 29018,
+  NZERROR_CIC_ERR_SSL_BAD_PROTOCOL_VERSION = 29019,
+  NZERROR_CIC_ERR_SSL_BAD_RECORD_LENGTH = 29020,
+  NZERROR_CIC_ERR_SSL_BAD_SECRET_KEY_LEN = 29021,
+  NZERROR_CIC_ERR_SSL_BAD_SIDE = 29022,
+  NZERROR_CIC_ERR_SSL_BUFFERS_NOT_EMPTY = 29023,
+  NZERROR_CIC_ERR_SSL_CERTIFICATE_VALIDATE_FAILED = 29024,
+  NZERROR_CIC_ERR_SSL_CERT_CHECK_CALLBACK = 29025,
+  NZERROR_CIC_ERR_SSL_DECRYPT_FAILED = 29026,
+  NZERROR_CIC_ERR_SSL_ENTROPY_COLLECTION = 29027,
+  NZERROR_CIC_ERR_SSL_FAIL_SERVER_VERIFY = 29028,
+  NZERROR_CIC_ERR_SSL_HANDSHAKE_ALREADY_COMPLETED = 29029,
+  NZERROR_CIC_ERR_SSL_HANDSHAKE_REQUESTED = 29030,
+  NZERROR_CIC_ERR_SSL_HANDSHAKE_REQUIRED = 29031,
+  NZERROR_CIC_ERR_SSL_INCOMPLETE_IDENTITY = 29032,
+  NZERROR_CIC_ERR_SSL_INVALID_PFX = 29033,
+  NZERROR_CIC_ERR_SSL_NEEDS_CIPHER_OR_CLIENTAUTH = 29034,
+  NZERROR_CIC_ERR_SSL_NEEDS_PRNG = 29035,
+  NZERROR_CIC_ERR_SSL_NOT_SUPPORTED = 29036,
+  NZERROR_CIC_ERR_SSL_NO_CERTIFICATE = 29037,
+  NZERROR_CIC_ERR_SSL_NO_MATCHING_CERTIFICATES = 29038,
+  NZERROR_CIC_ERR_SSL_NO_MATCHING_CIPHER_SUITES = 29039,
+  NZERROR_CIC_ERR_SSL_NO_SUPPORTED_CIPHER_SUITES = 29040,
+  NZERROR_CIC_ERR_SSL_NULL_CB = 29041,
+  NZERROR_CIC_ERR_SSL_READ_BUFFER_NOT_EMPTY = 29042,
+  NZERROR_CIC_ERR_SSL_READ_REQUIRED = 29043,
+  NZERROR_CIC_ERR_SSL_RENEGOTIATION_ALREADY_REQUESTED = 29044,
+  NZERROR_CIC_ERR_SSL_RENEGOTIATION_REFUSED = 29045,
+  NZERROR_CIC_ERR_SSL_RESUMABLE_SESSION = 29046,
+  NZERROR_CIC_ERR_SSL_TLS_EXTENSION_MISMATCH = 29047,
+  NZERROR_CIC_ERR_SSL_UNEXPECTED_MSG = 29048,
+  NZERROR_CIC_ERR_SSL_UNKNOWN_RECORD = 29049,
+  NZERROR_CIC_ERR_SSL_UNSUPPORTED_CLIENT_AUTH_MODE = 29050,
+  NZERROR_CIC_ERR_SSL_UNSUPPORTED_PUBKEY_TYPE = 29051,
+  NZERROR_CIC_ERR_SSL_WRITE_BUFFER_NOT_EMPTY = 29052,
+  NZERROR_CIC_ERR_PKCS12_MISSING_ALG = 29053,
+  NZERROR_CIC_ERR_PKCS_AUTH_FAILED = 29054,
+  NZERROR_CIC_ERR_PKCS_BAD_CONTENT_TYPE = 29055,
+  NZERROR_CIC_ERR_PKCS_BAD_INPUT = 29056,
+  NZERROR_CIC_ERR_PKCS_BAD_PADDING = 29057,
+  NZERROR_CIC_ERR_PKCS_BAD_SN = 29058,
+  NZERROR_CIC_ERR_PKCS_BAD_SN_LENGTH = 29059,
+  NZERROR_CIC_ERR_PKCS_BAD_VERSION = 29060,
+  NZERROR_CIC_ERR_PKCS_BASE = 29061,
+  NZERROR_CIC_ERR_PKCS_FIELD_NOT_PRESENT = 29062,
+  NZERROR_CIC_ERR_PKCS_NEED_CERTVAL = 29063,
+  NZERROR_CIC_ERR_PKCS_NEED_PASSWORD = 29064,
+  NZERROR_CIC_ERR_PKCS_NEED_PKC = 29065,
+  NZERROR_CIC_ERR_PKCS_NEED_PRV_KEY = 29066,
+  NZERROR_CIC_ERR_PKCS_NEED_TRUSTED = 29067,
+  NZERROR_CIC_ERR_PKCS_UNSUPPORTED_CERT_FORMAT = 29068,
+  NZERROR_CIC_ERR_PKCS_UNSUP_PRVKEY_TYPE = 29069,
+  NZERROR_CIC_ERR_CODING_BAD_PEM = 29070,
+  NZERROR_CIC_ERR_CODING_BASE = 29071, 
+  NZERROR_CIC_ERR_DER_BAD_ENCODING = 29072,
+  NZERROR_CIC_ERR_DER_BAD_ENCODING_LENGTH = 29073,
+  NZERROR_CIC_ERR_DER_BASE = 29074,
+  NZERROR_CIC_ERR_DER_ELEMENT_TOO_LONG = 29075,
+  NZERROR_CIC_ERR_DER_INDEFINITE_LENGTH = 29076,
+  NZERROR_CIC_ERR_DER_NO_MORE_ELEMENTS = 29077,
+  NZERROR_CIC_ERR_DER_OBJECT_TOO_LONG = 29078,
+  NZERROR_CIC_ERR_DER_TAG_SIZE = 29079,
+  NZERROR_CIC_ERR_DER_TIME_OUT_OF_RANGE = 29080,
+  NZERROR_CIC_ERR_DER_UNUSED_BITS_IN_BIT_STR = 29081,
+  NZERROR_CIC_ERR_GENERAL_BASE = 29082,
+  NZERROR_CIC_ERR_HASH_BASE = 29083,
+  NZERROR_CIC_ERR_ILLEGAL_PARAM = 29084,
+  NZERROR_CIC_ERR_MEM_NOT_OURS = 29085,
+  NZERROR_CIC_ERR_MEM_OVERRUN = 29086,
+  NZERROR_CIC_ERR_MEM_UNDERRUN = 29087,
+  NZERROR_CIC_ERR_MEM_WAS_FREED = 29088,
+  NZERROR_CIC_ERR_NOT_FOUND = 29090,
+  NZERROR_CIC_ERR_NO_PTR = 29091,
+  NZERROR_CIC_ERR_TIMEOUT = 29092,
+  NZERROR_CIC_ERR_UNIT_MASK = 29093,
+  NZERROR_CIC_ERR_BAD_CTX = 29094,
+  NZERROR_CIC_ERR_BAD_INDEX = 29095,
+  NZERROR_CIC_ERR_BAD_LENGTH = 29096,
+  NZERROR_CIC_ERR_CODING_BAD_ENCODING = 29097,
+
+  /* ============>>> PKCS12 error 29100 - 29149  */
+  
+  NZERROR_LOCKEYID_CREATE_FAILED = 29100,
+  NZERROR_P12_ADD_PVTKEY_FAILED = 29101,
+  NZERROR_P12_ADD_CERT_FAILED = 29102,
+  NZERROR_P12_WLT_CREATE_FAILED = 29103,
+  NZERROR_P12_ADD_CERTREQ_FAILED = 29104,
+  NZERROR_P12_WLT_EXP_FAILED = 29105,
+  NZERROR_P12_WLT_IMP_FAILED = 29106,
+  NZERROR_P12_CREATE_FAILED = 29107,
+  NZERROR_P12_DEST_FAILED = 29107,
+  NZERROR_P12_RAND_ERROR = 29108, 
+  NZERROR_P12_PVTKEY_CRT_FAILED = 29109,
+  NZERROR_P12_INVALID_BAG = 29110,
+  NZERROR_P12_INVALID_INDEX = 29111,
+  NZERROR_P12_GET_CERT_FAILED = 29112,
+  NZERROR_P12_GET_PVTKEY_FAILED = 29113,
+  NZERROR_P12_IMP_PVTKEY_FAILED = 29114,
+  NZERROR_P12_EXP_PVTKEY_FAILED = 29115,
+  NZERROR_P12_GET_ATTRIB_FAILED = 29116,
+  NZERROR_P12_ADD_ATTRIB_FAILED = 29117,
+  NZERROR_P12_CRT_ATTRIB_FAILED = 29118,
+  NZERROR_P12_IMP_CERT_FAILED = 29119,
+  NZERROR_P12_EXP_CERT_FAILED = 29120,
+  NZERROR_P12_ADD_SECRET_FAILED = 29121,
+  NZERROR_P12_ADD_PKCS11INFO_FAILED = 29122,
+  NZERROR_P12_GET_PKCS11INFO_FAILED = 29123,
+  NZERROR_P12_MULTIPLE_PKCS11_LIBNAME = 29124,
+  NZERROR_P12_MULTIPLE_PKCS11_TOKENLABEL = 29125,
+  NZERROR_P12_MULTIPLE_PKCS11_TOKENPASSPHRASE = 29126,
+  NZERROR_P12_UNKNOWN_PKCS11INFO = 29127,
+  NZERROR_P12_PKCS11_LIBNAME_NOT_SET = 29128,
+  NZERROR_P12_PKCS11_TOKENLABEL_NOT_SET = 29129,
+  NZERROR_P12_PKCS11_TOKENPASSPHRASE_NOT_SET = 29130,
+
+/* ===========>>> SSL Errors CONTINUED 29135 - 29139 */
+  NZERROR_CIC_ERR_RANDOM = 29135,
+  NZERROR_CIC_ERR_SMALL_BUFFER = 29136,
+  NZERROR_CIC_ERR_SSL_BAD_CONTEXT = 29137,
+
+/* ==========>>> Mutex Errors 29138 - 29139 */
+  NZERROR_MUTEX_INITIALIZE_FAILED = 29138,
+  NZERROR_MUTEX_DESTROY_FAILED = 29139,
+
+
+/* ============>>> EXTENSIONS Errors 29140 - 29149 */
+  NZERROR_BS_CERTOBJ_CREAT_FAILED = 29140,
+  NZERROR_BS_DER_IMP_FAILED = 29141,
+
+
+/* ============>>> FIPS ERRORS 29150 - 29175 */
+  NZERROR_DES_SELF_TEST_FAILED = 29150,
+  NZERROR_3DES_SELF_TEST_FAILED = 29151,
+  NZERROR_SHA_SELF_TEST_FAILED = 29152,
+  NZERROR_RSA_SELF_TEST_FAILED = 29153,
+  NZERROR_DRNG_SELF_TEST_FAILED = 29154,
+  NZERROR_CKEYPAIR_SELF_TEST_FAILED = 29155,
+  NZERROR_CRNG_SELF_TEST_FAILED = 29156,
+  NZERROR_FIPS_PATHNAME_ERROR = 29157,
+  NZERROR_FIPS_LIB_OPEN_FAILED = 29158,
+  NZERROR_FIPS_LIB_READ_ERROR = 29159,
+  NZERROR_FIPS_LIB_DIFFERS = 29160,
+  NZERROR_DAC_SELF_TEST_FAILED = 29161,
+  NZERROR_NONFIPS_CIPHERSUITE = 29162,
+  NZERROR_VENDOR_NOT_SUPPORTED_FIPS_MODE = 29163,
+  NZERROR_EXTERNAL_PKCS12_NOT_SUPPORTED_FIPS_MODE = 29164,
+
+/* ============>>> CRL ERRORS 29176 - 29200 */
+  NZERROR_CRL_SIG_VERIFY_FAILED = 29176, /*CRL signature verification failed*/ 
+  NZERROR_CERT_NOT_IN_CRL = 29177, 
+                                 /*Cert is not in CRL - cert is not revoked*/ 
+  NZERROR_CERT_IN_CRL = 29178,           /*Cert is in CRL - cert is revoked*/ 
+  NZERROR_CERT_IN_CRL_CHECK_FAILED = 29179, /*Cert revocation check failed */ 
+  NZERROR_INVALID_CERT_STATUS_PROTOCOL = 29180, 
+  NZERROR_LDAP_OPEN_FAILED = 29181,  /* ldap_open failed */
+  NZERROR_LDAP_BIND_FAILED = 29182,  /* ldap_bind failed */
+  NZERROR_LDAP_SEARCH_FAILED = 29183,  /* ldap_search failed */
+  NZERROR_LDAP_RESULT_FAILED = 29184,  /* ldap_result failed */
+  NZERROR_LDAP_FIRSTATTR_FAILED = 29185,  /* ldap_first_attribute failed */
+  NZERROR_LDAP_GETVALUESLEN_FAILED = 29186,  /* ldap_get_values_len failed */
+  NZERROR_LDAP_UNSUPPORTED_VALMEC = 29187, 
+                                       /* unsupported validation mechanism */
+  NZERROR_LDAP_COUNT_ENTRIES_FAILED = 29188,/* ldap_count_entries failed */
+  NZERROR_LDAP_NO_ENTRY_FOUND = 29189, /* No entry found in OID */
+  NZERROR_LDAP_MULTIPLE_ENTRIES_FOUND = 29190, /* Multiple entries in OID*/
+  NZERROR_OID_INFO_NOT_SET = 29191, 
+  NZERROR_LDAP_VALMEC_NOT_SET = 29192,  
+                                     /* Validation mechanism not set in OID*/
+  NZERROR_CRLDP_NO_CRL_FOUND = 29193,  
+                                     /* No CRL found using CRLDP mechanism */
+  NZERROR_CRL_NOT_IN_CACHE = 29194,  /* No CRL found in the cache*/
+  NZERROR_CRL_EXPIRED = 29195,       /* CRL nextUpdate time is in the past */
+
+/* ============>>>  ADD ERRORS HERE -- NOTE DECREASING numbers */
+  NZERROR_DN_MATCH  =            29222,  /* for nztCompareDN */
+  NZERROR_CERT_CHAIN_CREATION  = 29223,  /* unable to create a cert chain
+					  * with the existing TPs for the 
+					  * cert to be installed. 
+					  */
+  NZERROR_NO_MATCHING_CERT_REQ = 29224,  /* No matching cert_req was 
+					  * found the corresponding to
+					  * the privatekey which
+					  * matches the cert to be
+					  * installed */
+  NZERROR_CERT_ALREADY_INSTALLED = 29225, /* we are attempting to
+					   * install a cert again into
+					   * a persona which already 
+					   * has it installed.
+					   */
+  NZERROR_NO_MATCHING_PRIVATE_KEY = 29226, /* could not find a matching 
+					    * persona-private(privatekey) in
+					    * the Persona, for the given
+					    * cert(public key). 
+					    */
+  NZERROR_VALIDITY_EXPIRED = 29227, /* certificate validity date expired */
+  NZERROR_TK_BYTES_NEEDED = 29228,   /* Couldn't determine # of bytes needed */
+  NZERROR_TK_BAD_MAGIC_NUMBER = 29229,
+                     /* Magic number found in header does not match expected */
+  NZERROR_TK_BAD_HEADER_LENGTH = 29230,
+                /* Header length passed in not sufficient for message header */
+  NZERROR_TK_CE_INIT = 29231,          /* Crypto engine failed to initialize */
+  NZERROR_TK_CE_KEYINIT = 29232,  /* Crypto engine key initialization failed */
+  NZERROR_TK_CE_ENCODE_KEY = 29233,           /* Count not encode key object */
+  NZERROR_TK_CE_DECODE_KEY = 29234,      /* Could not decode key into object */
+  NZERROR_TK_CE_GEYKEYINFO = 29235,  /* Crypto engine failed to get key info */
+  NZERROR_TK_SEED_RANDOM = 29236,   /* Couldn't seed random number generator */
+  NZERROR_TK_CE_ALGFINISH = 29237,              /* Couldn't finish algorithm */
+  NZERROR_TK_CE_ALGAPPLY = 29238,        /* Couldn't apply algorithm to data */
+  NZERROR_TK_CE_ALGINIT = 29239,           /* Couldn't init CE for algorithm */
+  NZERROR_TK_ALGORITHM = 29240,      /* Have no idea what algorithm you want */
+  NZERROR_TK_CANNOT_GROW = 29241,         /* Cannot grow output buffer block */
+  NZERROR_TK_KEYSIZE = 29242,               /* Key not large enough for data */
+  NZERROR_TK_KEYTYPE = 29243,                           /* Unknown key type. */
+
+  NZERROR_TK_PLSQL_NO_WRL = 29244,
+                 /* Wallet resource locator not specified to PL/SQL function */
+
+  NZERROR_TK_CE_FUNC = 29245,              /* Unknown crypto engine function */
+  NZERROR_TK_TDU_FORMAT = 29246,                       /* Unknown TDU format */
+  NZERROR_TK_NOTOPEN = 29247,                         /* Object must be open */
+  NZERROR_TK_WRLTYPE = 29248,                                /* Bad WRL type */
+  NZERROR_TK_CE_STATE = 29249,  /* Bad state specified for the crypto engine */
+
+  /* After 29249, use error numbers in block 43000 - 43499 */
+  NZERROR_PKCS11_LIBRARY_NOT_FOUND = 43000, /* PKCS #11 library not found */
+  NZERROR_PKCS11_TOKEN_NOT_FOUND = 43001, 
+                                         /* can't find token with given label*/
+  NZERROR_PKCS11_BAD_PASSPHRASE = 43002,  /* passphrase is incorrect/expired */
+  NZERROR_PKCS11_GET_FUNC_LIST = 43003,  /* C_GetFunctionList returned error */
+  NZERROR_PKCS11_INITIALIZE = 43004,     /* C_Initialize returned error */
+  NZERROR_PKCS11_NO_TOKENS_PRESENT = 43005, /* No tokens present */
+  NZERROR_PKCS11_GET_SLOT_LIST = 43006,  /* C_GetSlotList returned error */
+
+  NZERROR_PKCS11_GET_TOKEN_INFO = 43008,  /* C_GetTokenInfo returned error */
+  NZERROR_PKCS11_SYMBOL_NOT_FOUND = 43009, /* Symbol not found in PKCS11 lib */
+
+  NZERROR_PKCS11_TOKEN_LOGIN_FAILED = 43011, /* Token login failed */
+
+  NZERROR_PKCS11_CHANGE_PROVIDERS_ERROR = 43013, /* Change providers error */
+  NZERROR_PKCS11_GET_PRIVATE_KEY_ERROR = 43014, 
+                              /* Error trying to find private key on token */
+  NZERROR_PKCS11_CREATE_KEYPAIR_ERROR = 43015, /* Key pair gen error */
+  NZERROR_PKCS11_WALLET_CONTAINS_P11_INFO = 43016, /* Wallet already contains
+                                                      pkcs11 info */
+
+  /* RSA ERRORS 43050 - 43059 */
+  NZERROR_BIND_SERVICE_ERROR = 43050,    /* C_BindService returned error */
+  NZERROR_CREATE_KEY_OBJ_ERROR = 43051,  /* B_CreateKeyObject returned error */
+  NZERROR_GET_CERT_FIELDS = 43052,       /* C_GetCertFields returned error */
+  NZERROR_CREATE_PKCS10_OBJECT = 43053,  
+                                      /* C_CreatePKCS10Object returned error */
+  NZERROR_SET_PKCS10_FIELDS = 43054,     /* C_SetPKCS10Fields returned error */
+  NZERROR_SIGN_CERT_REQUEST = 43055,     /* C_SignCertRequest returned error */
+  NZERROR_GET_PKCS10_DER = 43056,        /* C_GetPKCS10DER returned error */
+  NZERROR_INITIALIZE_CERTC = 43057,      /* C_InitializeCertC returned error */
+  NZERROR_INSERT_PRIVATE_KEY = 43058,   /* C_InsertPrivateKey returned error */
+  /* slts ERRORS 43060 - 43069 */
+  NZERROR_SLTSCTX_INIT_FAILED = 43060,    /* sltsini() returned error */
+  NZERROR_SLTSKYC_FAILED = 43061,         /* sltskyc() returned error */
+  NZERROR_SLTSCTX_TERM_FAILED = 43062,    /* sltster() returned error */
+  NZERROR_SLTSKYS_FAILED = 43063,         /* sltskys() returned error */
+
+  NZERROR_INVALID_HEADER_LENGTH = 43070,       /* bad sso header length */
+
+  NZERROR_LAST_ERROR = 43499,                        /* Last available error */
+                                            /* MAXIMUM ERROR NUMBER IS 43499 */
+
+  /*
+   * DO NOT JUST INSERT NEW ERRORS IN ANY OLD PLACE.  New errors should be
+   * added such the current error retains their integer values. Duplicate
+   * values will cause compiler errors.
+   */
+  NZERROR_THIS_MUST_BE_LAST
+
+} nzerror;
+
+/*
+ * Macro to convert SSL errors to Oracle errors. As SSL errors are negative
+ * and Oracle numbers are positive, the following needs to be done.
+ * 1. The base error number, which is the highest, is added to the
+ *    SSL error to get the index into the number range.
+ * 2. The result is added to the base Oracle number to get the Oracle error.
+ */
+#define NZERROR_SSL_TO_ORACLE(ssl_error_) \
+  ((ssl_error_ == SSLNoErr) \
+   ? NZERROR_OK \
+   : (nzerror) ((ssl_error_ - SSLMemoryErr) + (uword) NZERROR_SSLMemoryErr))
+#endif /* NZERROR_ORACLE */ 
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h b/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h
new file mode 100644
index 0000000..abf604d
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h
@@ -0,0 +1,2750 @@
+/* DISABLE check_long_lines */
+
+/* Copyright (c) 1996, 2003, Oracle Corporation.  All rights reserved.  */
+/* Copyright (c) 1996, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/nzt.h,v 1.3 2005/05/06 16:48:55 karine Exp $ 
+ */
+
+/* 
+ * NAME
+ *    nzt.h
+ * 
+ * DESCRIPTION
+ *    Toolkit public declarations.
+ *    
+ * PUBLIC FUNCTIONS
+ *    nztwOpenWallet           - Open a wallet based on a WRL and pwd.
+ *    nztwCloseWallet          - Close a wallet.
+ * +  nztwCreateWallet         - Create a new wallet.
+ * +  nztwDestroyWallet        - Destroy an existing wallet.
+ *    nztwRetrievePersonaCopy  - Retieve a copy of a particular persona.
+ * +  nzteStorePersona         - Store a persona in the wallet.
+ *    nzteOpenPersona          - Open a persona.
+ *    nzteClosePersona         - Close a persona.
+ * +  nzteRemovePersona        - Remove a persona from a wallet.
+ * +  nzteCreatePersona        - Create a persona.
+ *    nzteDestroyPersona       - Destroy a persona.
+ *    nztiStoreTrustedIdentity - Store an identity with associated trust.
+ *    nzteRetrieveTrustedIdentCopy - Retrieves a trusted identity from persona
+ * +  nzteSetProtection        - Modify the protection set in a persona.
+ * +  nzteGetProtection        - Get the protection set in a persona
+ *    nztePriKey               - Get the Private Key (X509 Only)
+ *    nzteMyCert               - Get the Certificate (X509 only)
+ *    nzteX509CreatePersona    - Create a persona given an X509 Certificate.
+ * +  nztiRemoveIdentity       - Remove an identity from a persona.
+ *    nztiCreateIdentity       - Create an identity.
+ *    nztiDuplicateIdentity    - Create a complete copy of an identity.
+ *    nztiAbortIdentity        - Discard an unstored identity.
+ *    nztidGetIdentityDesc     - Gets Identity Description from Identity.
+ *    nztidFreeIdentityDesc    - Frees memory for Identity Desc object.
+ *    nztSign                  - Generate an attached signature.
+ * +  nztxSignExpansion        - Determine size of signature.
+ *    nztVerify                - Verify an attached signature.               
+ *    nztValidate              - Validate an identity.                       
+ *    nztsd_SignDetached       - Generate a detached signature.
+ * +  nztxsd_SignDetachedExpansion - Determine size of detached signature.
+ *    nztved_VerifyDetached    - Verify a detached signature.                 
+ * +  nztEncrypt               - Symmetric key encryption.   
+ * +  nztxEncryptExpansion     - Determine the tdu length for encryption.
+ * +  nztDecrypt               - Symmetric key decryption.                   
+ * +  nztEnvelope              - Sign then encrypt data for recipient(s).    
+ * +  nztDeEnvelope            - Reverse nztEnvelope.                        
+ * +  nztKeyedHash             - Generate keyed hash.                        
+ * +  nztxKeyedHashExpansion   - Determine size of TDU for keyed hash.
+ *    nztHash                  - Generate hash.   
+ * +  nztxHashExpansion        - Determine the size of the TDU for a hash.
+ *    nztSeedRandom            - See the random number generator.
+ *    nztrb_RandomBytes        - Generate a series of random bytes.          
+ *    nztrn_RandomNumber       - Generate a random number.                   
+ *    nztbbInitBlock           - Initialize a buffer block.                  
+ *    nztbbReuseBlock          - Reuse a buffer block.           
+ *    nztbbSizeBlock           - Find the size of the buffer block.
+ *    nztbbGrowBlock           - Grow initialized buffer block by 'inc' bytes.
+ *    nztbbPurgeBlock          - Purge the memory used within a buffer block.
+ *    nztbbSetBlock            - Set block to known state.
+ *    nztkec_PKEncrypt         - Encrypt data then encrypt key for recipient.
+ *    nztkdc_PKDecrypt         - Decrypt PKEncrypt'ed data.                  
+ *    nztific_FreeIdentityContent - Free the contents of an identity.
+ *    nztifdn                  - Create an identity from a distinguished name
+ *    nztcts_CipherSpecToStr   - Converts the Cipher Spec Code To String
+ *    nztiae_IsAuthEnabled     - Checks to see if Authentication is Enabled
+ *                               in the current Cipher Spec.
+ *    nztiae_IsEncrEnabled     - Checks to see if Encryption is Enabled
+ *                               in the current Cipher Spec.
+ *    nztiae_IsHashEnabled     - Checks to see if Hashing is Enabled
+ *                               in the current Cipher Spec.
+ *    nztwGetCertInfo          - Get peer certificate info
+ *
+ * NOTE: the '+' indicates that these functions are UNSUPPORTED at this time.
+ * 
+ * NOTES
+ *    
+ * MODIFIED
+ *    srtata     11/10/03 - fix nztSetAppDefaultLocation header 
+ *    rchahal    10/15/03 - bug 2513821 
+ *    rchahal    11/11/02 - pkcs11 support
+ *    akoyfman   07/05/02 - adding secret store to persona
+ *    supriya    10/11/01 - Fix for bug # 2015732
+ *    ajacobs    04/04/01 - make NZT_REGISTRY_WRL always available
+ *    ajacobs    03/06/01 - olint fix
+ *    ajacobs    03/02/01 - Add GetCertInfo
+ *    supriya    02/23/01 - Move nzttKPUsage from nzt0.h
+ *    rchahal    01/26/01 - olint fixes
+ *    supriya    12/07/00 - Change fn name
+ *    supriya    12/01/00 - Certificate API's needed for iAS
+ *    supriya    06/19/00 - Adding definitions for MCS and ENTR
+ *    lkethana   05/31/00 - multiple cert support
+ *    skanjila   06/25/99 - Remove nztcts_CipherSpecToStr() to NZOS.
+ *    skanjila   06/23/99 - Change API of nztcts_CipherSpecToStr.
+ *    lkethana   06/18/99 - rem nztIPrivateAlloc, etc
+ *    lkethana   06/10/99 - changing size_t to ub4
+ *    lkethana   06/02/99 - add api for getting auth/encry/hash capability of c
+ *    arswamin   12/28/98 - add NZT_MAX_MD5.
+ *    arswamin   12/21/98 - change signature of compareDN
+ *    qdinh      12/21/98 - change size_t to ub4.
+ *    inetwork   11/22/98 - Removing NZDEPRECATED definition
+ *    amthakur   09/14/98 - deprecating and updating the c-structures.
+ *    arswamin   09/24/98 - adding NZTTWRL_NULL for SSO support.
+ *    amthakur   07/30/98 - changing the prototype of nztGetCertChain.
+ *    qdinh      05/01/98 - add NZTTIDENTTYPE_INVALID_TYPE
+ *    qdinh      04/17/98 - add NZTTWRL_ORACLE.
+ *    ascott     10/08/97 - implement nztiStoreTrustedIdentity
+ *    ascott     10/07/97 - add nztiGetIdentityDesc
+ *    ascott     09/28/97 - clarify prototype comments and error codes
+ *    ascott     09/05/97 - update identity: create, destroy, duplicate
+ *    ascott     08/21/97 - add GetCert and GetPriKey
+ *    ascott     08/07/97 - add other WRL settings
+ *    asriniva   03/25/97 - Add ANSI prototypes
+ *    rwessman   03/19/97 - Added prototypes for nztific_FreeIdentityContent()
+ *    asriniva   03/11/97 - Fix olint errors
+ *    sdange     02/28/97 - Removed inclusion of nz0decl.h
+ *    sdange     02/18/97 - Moved nzt specific declarations from nz0decl.h
+ *    asriniva   01/21/97 - Remove prototypes.
+ *    asriniva   10/31/96 - Include oratypes.h
+ *    asriniva   10/15/96 - Declare buffer block helper functions
+ *    asriniva   10/08/96 - First pass at wallet open/close
+ *    asriniva   10/04/96 - Add random number seed function
+ *    asriniva   10/03/96 - Reorder parameters in nztbbSetBlock
+ *    asriniva   10/03/96 - Keep editing.
+ *    asriniva   10/03/96 - Continued edits.
+ *    asriniva   10/02/96 - Continue editing.
+ *    asriniva   09/26/96 -
+ */
+   
+/* ENABLE check_long_lines */
+
+#ifndef NZT_ORACLE
+#define NZT_ORACLE
+
+#ifndef ORATYPES
+# include <oratypes.h>
+#endif /* ORATYPES */
+
+#ifndef NZERROR_ORACLE
+# include <nzerror.h>         /* NZ error type */
+#endif /* NZERROR_ORACLE */
+
+
+#define NZT_MAX_SHA1 20
+#define NZT_MAX_MD5  16
+
+/***************************************/
+/* PUBLIC CONSTANTS, MACROS, AND TYPES */
+/***************************************/
+
+/*
+ * Wallet Resource Locator Type Strings
+ *
+ * WRL TYPE        PARAMETERS      BEHAVIOR
+ * ========        ==========      =====================================
+ * default:          <none>        Uses directory defined by the parameter
+ *                                 SNZD_DEFAULT_FILE_DIRECTORY which in 
+ *                                 unix is "$HOME/oracle/oss"
+ * 
+ * file:            file path      Find the Oracle wallet in this directory.
+ *                                 example: file:<dir-path>
+ * 
+ * sqlnet:           <none>        In this case, the directory path will be 
+ *                                 retrieved from the sqlnet.ora file under
+ *                                 the oss.source.my_wallet parameter.
+ *
+ * mcs:              <none>        Microsoft WRL.
+ *
+ * entr:             dir path      Entrust WRL. eg: ENTR:<dir-path>   
+ * 
+ */
+/* Note that there is no NZT_NULL_WRL.  Instead look in snzd.h for DEFAULT_WRP
+ * which is used in our new defaulting mechanism.  The NZT_DEFAULT_WRL
+ * should be deprecated.
+ */
+#define NZT_DEFAULT_WRL    ((text *)"default:")
+#define NZT_SQLNET_WRL     ((text *)"sqlnet:")
+#define NZT_FILE_WRL       ((text *)"file:")
+#define NZT_ENTR_WRL       ((text *)"entr:")
+#define NZT_MCS_WRL        ((text *)"mcs:")
+#define NZT_ORACLE_WRL	   ((text *)"oracle:")
+#define NZT_REGISTRY_WRL   ((text *)"reg:")
+          
+enum nzttwrl 
+{
+   NZTTWRL_DEFAULT = 1,    /* Default, use SNZD_DEFAULT_FILE_DIRECTORY */
+   NZTTWRL_SQLNET,         /* Use oss.source.my_wallet in sqlnet.ora file */
+   NZTTWRL_FILE,           /* Find the oracle wallet in this directory */
+   NZTTWRL_ENTR,           /* Find the entrust profile in this directory */
+   NZTTWRL_MCS,            /* WRL for Microsoft */
+   NZTTWRL_ORACLE,	   /* Get the wallet from OSS db */
+   NZTTWRL_NULL,           /* New SSO defaulting mechanism */
+   NZTTWRL_REGISTRY        /* Find the wallet in Windows Registry */
+};
+typedef enum nzttwrl nzttwrl;
+
+#ifndef NZ0DECL_ORACLE
+   /*
+    * With the elimination of nz0decl.h from public, we need this
+    * redundant typedef.
+    */
+   typedef struct nzctx nzctx;
+   typedef struct nzstrc nzstrc;
+   typedef struct nzosContext nzosContext;
+#endif /* NZ0DECL_ORACLE */
+
+/* Moved from nz0decl.h */
+
+typedef struct nzttIdentity nzttIdentity;
+typedef struct nzttIdentityPrivate nzttIdentityPrivate;
+typedef struct nzttPersona nzttPersona;
+typedef struct nzttPersonaPrivate nzttPersonaPrivate;
+typedef struct nzttWallet nzttWallet;
+typedef struct nzttWalletPrivate nzttWalletPrivate;
+typedef struct nzttWalletObj nzttWalletObj; /* For wallet object */
+typedef struct nzssEntry nzssEntry; /* For secretstore */
+typedef struct nzpkcs11_Info nzpkcs11_Info;
+
+/*
+ * Crypto Engine State
+ *
+ * Once the crypto engine (CE) has been initialized for a particular
+ * cipher, it is either at the initial state, or it is continuing to
+ * use the cipher.  NZTCES_END is used to change the state back to
+ * initialized and flush any remaining output.  NZTTCES_RESET can be
+ * used to change the state back to initialized and throw away any
+ * remaining output.
+ */
+enum nzttces 
+{
+   NZTTCES_CONTINUE = 1,    /* Continue processing input */
+   NZTTCES_END,             /* End processing input */
+   NZTTCES_RESET            /* Reset processing and skip generating output */
+};
+typedef enum nzttces nzttces;
+
+/*
+ * Crypto Engine Functions
+ *
+ * List of crypto engine categories; used to index into protection
+ * vector.
+ */
+enum nzttcef
+{
+   NZTTCEF_DETACHEDSIGNATURE = 1,   /* Signature, detached from content */
+   NZTTCEF_SIGNATURE,               /* Signature combined with content */
+   NZTTCEF_ENVELOPING,              /* Signature and encryption with content */
+   NZTTCEF_PKENCRYPTION,            /* Encryption for one or more recipients */
+   NZTTCEF_ENCRYPTION,              /* Symmetric encryption */
+   NZTTCEF_KEYEDHASH,               /* Keyed hash/checkusm */
+   NZTTCEF_HASH,                    /* Hash/checsum */
+   NZTTCEF_RANDOM,                  /* Random byte generation */
+
+   NZTTCEF_LAST                     /* Used for array size */
+};
+typedef enum nzttcef nzttcef;
+
+/*
+ * State of the persona.
+ */
+enum nzttState
+{
+   NZTTSTATE_EMPTY = 0,     /* is not in any state(senseless???) */
+   NZTTSTATE_REQUESTED,     /* cert-request */
+   NZTTSTATE_READY,         /* certificate */
+   NZTTSTATE_INVALID,         /* certificate */
+   NZTTSTATE_RENEWAL        /* renewal-requested */
+};
+typedef enum nzttState nzttState;
+
+/*
+ * Cert-version types
+ * 
+ * This is used to quickly look-up the cert-type
+ */
+enum nzttVersion
+{
+   NZTTVERSION_X509v1 = 1,        /* X.509v1 */
+   NZTTVERSION_X509v3,            /* X.509v3 */
+#ifdef NZDEPRECATED
+   NZTTVERSION_SYMMETRIC,         /* Symmetric */
+#endif
+   NZTTVERSION_INVALID_TYPE       /* For Initialization */
+};
+typedef enum nzttVersion nzttVersion;
+
+/*
+ * Cipher Types
+ *
+ * List of all cryptographic algorithms, some of which may not be
+ * available.
+ */
+enum nzttCipherType 
+{
+   NZTTCIPHERTYPE_RSA = 1,          /* RSA public key */
+   NZTTCIPHERTYPE_DES,              /* DES */
+   NZTTCIPHERTYPE_RC4,              /* RC4 */
+   NZTTCIPHERTYPE_MD5DES,           /* DES encrypted MD5 with salt (PBE) */
+   NZTTCIPHERTYPE_MD5RC2,           /* RC2 encrypted MD5 with salt (PBE) */
+   NZTTCIPHERTYPE_MD5,              /* MD5 */
+   NZTTCIPHERTYPE_SHA               /* SHA */
+};
+typedef enum nzttCipherType nzttCipherType;
+
+/*
+ * TDU Formats
+ *
+ * List of possible toolkit data unit (TDU) formats.  Depending on the
+ * function and cipher used some may be not be available.
+ */
+enum nztttdufmt
+{
+   NZTTTDUFMT_PKCS7 = 1,            /* PKCS7 format */
+   NZTTTDUFMT_RSAPAD,               /* RSA padded format */
+   NZTTTDUFMT_ORACLEv1,             /* Oracle v1 format */
+   NZTTTDUFMT_LAST                  /* Used for array size */
+};
+typedef enum nztttdufmt nztttdufmt;
+
+/*
+ * Validate State
+ *
+ * Possible validation states an identity can be in.
+ */
+enum nzttValState
+{
+   NZTTVALSTATE_NONE = 1,        /* Needs to be validated */
+   NZTTVALSTATE_GOOD,            /* Validated */
+   NZTTVALSTATE_REVOKED          /* Failed to validate */
+};
+typedef enum nzttValState nzttValState;
+
+/*
+ * Policy Fields <----NEW (09/14/98)
+ *
+ * Policies enforced
+ */
+enum nzttPolicy
+{
+   NZTTPOLICY_NONE = 0,
+   NZTTPOLICY_RETRY_1, /* number of retries for decryption = 1 */
+   NZTTPOLICY_RETRY_2, /* number of retries for decryption = 2 */
+   NZTTPOLICY_RETRY_3  /* number of retries for decryption = 3 */
+};
+typedef enum nzttPolicy nzttPolicy;
+
+/*
+ * Persona Usage <----NEW (09/14/98)
+ *
+ * what a persona will be used for?
+ */
+
+#ifdef NZDEPRECATED_MULTIPLECERTS
+enum nzttUsage
+{
+   NZTTUSAGE_NONE = 0,
+   NZTTUSAGE_SSL  /* persona for SSL usage */
+};
+typedef enum nzttUsage nzttUsage;
+#endif
+
+/*
+ * Personas and identities have unique id's that are represented with
+ * 128 bits.
+ */
+typedef ub1 nzttID[16];
+
+/*
+ * Identity Types
+ *
+ * List of all Identity types..
+ */
+enum nzttIdentType 
+{
+   NZTTIDENTITYTYPE_INVALID_TYPE = 0,  
+   NZTTIDENTITYTYPE_CERTIFICTAE,      
+   NZTTIDENTITYTYPE_CERT_REQ,      
+   NZTTIDENTITYTYPE_RENEW_CERT_REQ,      
+   NZTTIDENTITYTYPE_CLEAR_ETP,      
+   NZTTIDENTITYTYPE_CLEAR_UTP,      
+   NZTTIDENTITYTYPE_CLEAR_PTP       
+};
+typedef enum nzttIdentType nzttIdentType;
+
+typedef ub4 nzttKPUsage;
+/* IF new types are added nztiMUS should be changed */
+#define NZTTKPUSAGE_NONE 0
+#define NZTTKPUSAGE_SSL 1
+#define NZTTKPUSAGE_SMIME_ENCR 2
+#define NZTTKPUSAGE_SMIME_SIGN 4
+#define NZTTKPUSAGE_CODE_SIGN 8
+#define NZTTKPUSAGE_CERT_SIGN 16
+#define NZTTKPUSAGE_INVALID_USE 0xffff
+
+
+/*
+ * Timestamp as 32 bit quantity in UTC.
+ */
+typedef ub1 nzttTStamp[4];
+
+/*
+ * Buffer Block
+ *
+ * A function that needs to fill (and possibly grow) an output buffer
+ * uses an output parameter block to describe each buffer.
+ *
+ * The flags_nzttBufferBlock member tells the function whether the
+ * buffer can be grown or not.  If flags_nzttBufferBlock is 0, then
+ * the buffer will be realloc'ed automatically.  
+ *
+ * The buflen_nzttBufferBLock member is set to the length of the
+ * buffer before the function is called and will be the length of the
+ * buffer when the function is finished.  If buflen_nzttBufferBlock is
+ * 0, then the initial pointer stored in pobj_nzttBufferBlock is
+ * ignored.
+ *
+ * The objlen_nzttBufferBlock member is set to the length of the
+ * object stored in the buffer when the function is finished.  If the
+ * initial buffer had a non-0 length, then it is possible that the
+ * object length is shorter than the buffer length.
+ *
+ * The pobj_nzttBufferBlock member is a pointer to the output object.
+ */
+struct nzttBufferBlock
+{
+# define NZT_NO_AUTO_REALLOC     0x1
+
+   uword flags_nzttBufferBlock;     /* Flags */
+   ub4 buflen_nzttBufferBlock;   /* Total length of buffer */
+   ub4 usedlen_nzttBufferBlock;  /* Length of used buffer part */
+   ub1 *buffer_nzttBufferBlock;     /* Pointer to buffer */
+};
+typedef struct nzttBufferBlock nzttBufferBlock;
+
+/*
+ * Wallet.
+ */
+struct nzttWallet
+{
+   ub1 *ldapName_nzttWallet;              /* user's LDAP Name */
+   ub4  ldapNamelen_nzttWallet;           /* len of user's LDAP Name */
+   nzttPolicy securePolicy_nzttWallet;    /* secured-policy of the wallet */
+   nzttPolicy openPolicy_nzttWallet;      /* open-policy of the wallet */
+   nzttPersona *persona_nzttWallet;       /* List of personas in wallet */
+   nzttWalletPrivate *private_nzttWallet; /* Private wallet information */
+#ifdef NZDEPRECATED
+   ub4 npersona_nzttWallet;            /* Number of personas */
+#endif
+};
+
+/*
+ * The wallet contains, one or more personas.  A persona always
+ * contains its private key and its identity.  It may also contain
+ * other 3rd party identites.  All identities qualified with trust
+ * where the qualifier can indicate anything from untrusted to trusted
+ * for specific operations.
+ */
+
+/*
+ * Persona
+ *
+ * Structure containing information about a persona.
+ */
+struct nzttPersona
+{
+   ub1 *genericName_nzttPersona;              /* user-friendly persona name  */
+   ub4  genericNamelen_nzttPersona;           /* persona-name length */
+   nzttPersonaPrivate *private_nzttPersona;   /* Opaque part of persona */
+   nzttIdentity *mycertreqs_nzttPersona;      /* My cert-requests */
+   nzttIdentity *mycerts_nzttPersona;         /* My certificates */
+   nzttIdentity *mytps_nzttPersona;           /* List of trusted identities */
+   nzssEntry *mystore_nzttPersona;            /* List of secrets */
+   nzpkcs11_Info *mypkcs11Info_nzttPersona;   /* PKCS11 token info */
+   struct nzttPersona *next_nzttPersona;      /* Next persona */
+#ifdef NZDEPRECATED_MULTIPLECERTS
+  /* As Persona has multiple certs for different
+     usages, Persona Usage does not mean anything. Similarly
+     each key pair has its own state and Persona state itself
+     does not mean anything. - lk 5/31/00
+  */
+   nzttUsage usage_nzttPersona;               /* persona usage; SSL/SET/.. */
+   nzttState state_nzttPersona;               /* persona state-requested/ready */
+   ub4 ntps_nzttPersona;                   /* Num of trusted identities */
+#endif
+};
+
+/*
+ * Identity
+ *
+ * Structure containing information about an identity.
+ *
+ * NOTE
+ *  -- the next_trustpoint field only applies to trusted identities and
+ *     has no meaning (i.e. is NULL) for self identities.
+ */
+struct nzttIdentity
+{
+   text *dn_nzttIdentity;                      /* Alias */
+   ub4 dnlen_nzttIdentity;                  /* Length of alias */
+   text *comment_nzttIdentity;                 /* Comment  */
+   ub4 commentlen_nzttIdentity;             /* Length of comment */
+   nzttIdentityPrivate *private_nzttIdentity;  /* Opaque part of identity */
+   nzttIdentity *next_nzttIdentity;            /* next identity in list */
+};
+
+struct nzttB64Cert
+{
+   ub1 *b64Cert_nzttB64Cert;
+   ub4  b64Certlen_nzttB64Cert;
+   struct nzttB64Cert *next_nzttB64Cert;
+};
+typedef struct nzttB64Cert nzttB64Cert;
+
+
+struct nzttPKCS7ProtInfo
+{
+   nzttCipherType mictype_nzttPKCS7ProtInfo;    /* Hash cipher */
+   nzttCipherType symmtype_nzttPKCS7ProtInfo;   /* Symmetric cipher */
+   ub4 keylen_nzttPKCS7ProtInfo;             /* Length of key to use */
+};
+typedef struct nzttPKCS7ProtInfo nzttPKCS7ProtInfo;
+
+/*
+ * Protection Information.
+ *
+ * Information specific to a type of protection.
+ */
+union nzttProtInfo
+{
+   nzttPKCS7ProtInfo pkcs7_nzttProtInfo;
+};
+typedef union nzttProtInfo nzttProtInfo;
+
+/*
+ * A description of a persona so that the toolkit can create one.  A
+ * persona can be symmetric or asymmetric and both contain an
+ * identity.  The identity for an asymmetric persona will be the
+ * certificate and the identity for the symmetric persona will be
+ * descriptive information about the persona.  In either case, an
+ * identity will have been created before the persona is created.
+ *
+ * A persona can be stored separately from the wallet that references
+ * it.  By default, a persona is stored with the wallet (it inherits
+ * with WRL used to open the wallet).  If a WRL is specified, then it
+ * is used to store the actuall persona and the wallet will have a
+ * reference to it.
+ */
+struct nzttPersonaDesc
+{
+   ub4 privlen_nzttPersonaDesc;        /* Length of private info (key)*/
+   ub1 *priv_nzttPersonaDesc;             /* Private information */
+   ub4 prllen_nzttPersonaDesc;         /* Length of PRL */
+   text *prl_nzttPersonaDesc;             /* PRL for storage */
+   ub4 aliaslen_nzttPersonaDesc;       /* Length of alias */
+   text *alias_nzttPersonaDesc;           /* Alias */
+   ub4 longlen_nzttPersonaDesc;        /* Length of longer description*/
+   text *long_nzttPersonaDesc;            /* Longer persona description */
+};
+typedef struct nzttPersonaDesc nzttPersonaDesc;
+
+/*
+ * A description of an identity so that the toolkit can create one.
+ * Since an identity can be symmetric or asymmetric, the asymmetric
+ * identity information will not be used when a symmetric identity is
+ * created.  This means the publen_nzttIdentityDesc and
+ * pub_nzttIdentityDesc members will not be used when creating a
+ * symmetric identity.
+ */
+struct nzttIdentityDesc
+{
+   ub4 publen_nzttIdentityDesc;        /* Length of identity */
+   ub1 *pub_nzttIdentityDesc;             /* Type specific identity */
+   ub4 dnlen_nzttIdentityDesc;         /* Length of alias */
+   text *dn_nzttIdentityDesc;             /* Alias */
+   ub4 longlen_nzttIdentityDesc;       /* Length of longer description */
+   text *long_nzttIdentityDesc;           /* Longer description */
+   ub4 quallen_nzttIdentityDesc;       /* Length of trust qualifier */
+   text *trustqual_nzttIdentityDesc;      /* Trust qualifier */
+};
+typedef struct nzttIdentityDesc nzttIdentityDesc;
+
+/********************************/
+/* PUBLIC FUNCTION DECLARATIONS */
+/********************************/
+
+/*---------------------- nztwOpenWallet ----------------------*/
+
+/*
+ * NAME
+ *    nztwOpenWallet - Open a wallet based on a wallet Resource Locator (WRL).
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    wrllen   {IN}     Length of WRL.
+ *    wrl      {IN}     WRL.
+ *    pwdlen   {IN}     Length of password.
+ *    pwd      {IN}     Password.
+ *    wallet   {IN/OUT} Initialized wallet structure.   
+ * 
+ * NOTES
+ *    The syntax for a WRL is <Wallet Type>:<Wallet Type Parameters>.
+ *
+ *    Wallet Type       Wallet Type Parameters.
+ *    -----------       ----------------------
+ *    File              Pathname (e.g. "file:/home/asriniva")
+ *    Oracle            Connect string (e.g. "oracle:scott/tiger at oss")
+ *
+ *    There are also defaults.  If the WRL is NZT_DEFAULT_WRL, then
+ *    the platform specific WRL default is used.  If only the wallet
+ *    type is specified, then the WRL type specific default is used
+ *    (e.g. "oracle:")
+ *
+ *    There is an implication with Oracle that should be stated: An
+ *    Oracle based wallet can be implemented in a user's private space
+ *    or in world readable space.
+ *
+ *    When the wallet is opened, the password is verified by hashing
+ *    it and comparing against the password hash stored with the
+ *    wallet.  The list of personas (and their associated identities)
+ *    is built and stored into the wallet structure.
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_RIO_OPEN     RIO could not open wallet (see network trace file).
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_TK_WRLTYPE   WRL type is not known.
+ *    NZERROR_TK_WRLPARM   WRL parm does not match type.
+ */
+#ifdef __STDC__
+nzerror nztwOpenWallet(nzctx *, ub4, text *, ub4, text *, 
+                           nzttWallet *);
+#else
+nzerror nztwOpenWallet(/*_ nzctx *, ub4, text *, ub4, text *, 
+                           nzttWallet * _*/);
+#endif /* __STDC __*/
+
+
+/*---------------------- nztwCloseWallet ----------------------*/
+
+/*
+ * NAME
+ *    nztwCloseWallet - Close a wallet
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wallet   {IN/OUT} Wallet.
+ * 
+ * NOTES
+ *    Closing a wallet also closes all personas associated with that
+ *    wallet.  It does not cause a persona to automatically be saved
+ *    if it has changed.  The implication is that a persona can be
+ *    modified by an application but if it is not explicitly saved it
+ *    reverts back to what was in the wallet.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_RIO_CLOSE    RIO could not close wallet (see network trace file).
+ */
+#ifdef __STDC__
+nzerror nztwCloseWallet(nzctx *, nzttWallet *);
+#else
+nzerror nztwCloseWallet(/*_ nzctx *, nzttWallet * _*/);
+#endif /* __STDC__ */
+
+/*--------------------nztwGetCertInfo----------------------------*/
+/****NOTE: This function is a temporary hack.****/
+/****DO NOT CALL.  It will soon disappear.****/
+nzerror nztwGetCertInfo(/*_ nzctx *nz_context,
+                            nzosContext *nzosCtx,
+                            nzttWallet *walletRef,
+                            void *peerCert _*/);
+
+
+/*------------------------ nztwConstructWallet -----------------------*/
+/*
+ * 
+ * nzerror nztwConstructWallet( nzctx *oss_context, 	
+ *				  nzttPolicy openPolicy,
+ *				  nzttPolicy securePolicy,
+ *				  ub1 *ldapName,
+ *				  ub4 ldapNamelen,
+ *				  nzstrc *wrl,
+ *				  nzttPersona *personas,
+ *				  nzttWallet **wallet );
+ */
+
+/*---------------------- nztwRetrievePersonaCopy ----------------------*/
+
+/*
+ * NAME
+ *    nztwRetrievePersonaCopy - Retrieves a persona based from wallet
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    wallet   {IN}     Wallet.
+ *    index    {IN}     Which wallet index to remove (first persona is zero).
+ *    persona  {OUT}    Persona found.
+ * 
+ * NOTES
+ *    Retrieves a persona from the wallet based on the index number passed
+ *    in.  This persona is a COPY of the one stored in the wallet, therefore
+ *    it is perfectly fine for the wallet to be closed after this call is 
+ *    made.
+ *
+ *    The caller is responsible for disposing of the persona when completed.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ */
+#ifdef __STDC__
+nzerror nztwRetrievePersonaCopy(nzctx *, nzttWallet *, ub4, nzttPersona **);
+#else
+nzerror nztwRetrievePersonaCopy(/*_ nzctx *, nzttWallet *, ub4, 
+                           nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+
+/*---------------------- nztwRetrievePersonaCopyByName ----------------------*/
+
+/*
+ * NAME
+ *    nztwRetrievePersonaCopyByName - Retrieves a persona based on its name.
+ *
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wallet   {IN}     Wallet.
+ *    name    {IN}     Name of the persona 
+ *    persona  {OUT}    Persona found.
+ *
+ * NOTES
+ *    Retrieves a persona from the wallet based on the name of the persona. 
+ *    This persona is a COPY of the one stored in the wallet, therefore
+ *    it is perfectly fine for the wallet to be closed after this call is
+ *    made.
+ *
+ *    The caller is responsible for disposing of the persona when completed.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ */
+#ifdef __STDC__
+nzerror nztwRetrievePersonaCopyByName(nzctx *, nzttWallet *, 
+                                      char *, nzttPersona **);
+#else
+nzerror nztwRetrievePersonaCopyByName(/*_ nzctx *, nzttWallet *, char *,
+                           nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nzteOpenPersona ----------------------*/
+
+/*
+ * NAME
+ *    nzteOpenPersona - Open a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    persona  {IN/OUT} Persona.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password failed to decrypt persona.
+ *    NZERROR_TK_BADPRL    Persona resource locator did not work.
+ *    NZERROR_RIO_OPEN     Could not open persona (see network trace file).
+ */
+#ifdef __STDC__
+nzerror nzteOpenPersona(nzctx *, nzttPersona *);
+#else
+nzerror nzteOpenPersona(/*_ nzctx *, nzttPersona * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteClosePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteClosePersona - Close a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN/OUT} Persona.
+ * 
+ * NOTES
+ *    Closing a persona does not store the persona, it simply releases
+ *    the memory associated with the crypto engine.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nzteClosePersona(nzctx *, nzttPersona *);
+#else
+nzerror nzteClosePersona(/*_ nzctx *, nzttPersona * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteDestroyPersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteDestroyPersona - Destroy a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}        OSS context.
+ *    persona  {IN/OUT}    Persona.
+ * 
+ * NOTES
+ *    The persona is destroyd in the open state, but it will
+ *    not be associated with a wallet.
+ *    
+ *    The persona parameter is doubly indirect so that at the
+ *    conclusion of the function, the pointer can be set to NULL.
+ *
+ *
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_TK_TYPE   Unsupported itype/ctype combination.
+ *    NZERROR_TK_PARMS  Error in persona description.
+ */
+#ifdef __STDC__
+nzerror nzteDestroyPersona(nzctx *,  nzttPersona **);
+#else
+nzerror nzteDestroyPersona(/*_ nzctx *, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nzteRetrieveTrustedIdentCopy ----------------------*/
+
+/*
+ * NAME
+ *    nzteRetrieveTrustedIdentCopy - Retrieves a trusted identity from persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    persona  {IN}     Persona.
+ *    index    {IN}     Which wallet index to remove (first element is zero).
+ *    identity {OUT}    Trusted Identity from this persona.
+ * 
+ * NOTES
+ *    Retrieves a trusted identity from the persona based on the index 
+ *    number passed in.  This identity is a COPY of the one stored in 
+ *    the persona, therefore it is perfectly fine to close the persona
+ *    after this call is made.
+ *
+ *    The caller is responsible for freeing the memory of this object 
+ *    by calling nztiAbortIdentity it is no longer needed
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ */
+#ifdef __STDC__
+nzerror nzteRetrieveTrustedIdentCopy(nzctx *, nzttPersona *, ub4, 
+				     nzttIdentity **);
+#else
+nzerror nzteRetrieveTrustedIdentCopy(/*_ nzctx *, nzttPersona *, ub4, 
+                           nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztePriKey ---------------------*/
+
+/*
+ * NAME
+ *    nztePriKey - Get the decrypted Private Key for the Persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    vkey     {OUT}    Private Key [B_KEY_OBJ]
+ *    vkey_len {OUT}    Private Key Length
+ * 
+ * NOTES
+ *    This funiction will only work for X.509 based persona which contain
+ *    a private key.  
+ *    A copy of the private key is returned to the caller so that they do not 
+ *    have to worry about the key changeing "underneath them".
+ *    Memory will be allocated for the vkey and therefore, the CALLER
+ *    will be responsible for freeing this memory.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_NO_MEMORY    ossctx is null.
+ *    NZERROR_TK_BADPRL    Persona resource locator did not work.
+ */
+#ifdef __STDC__
+nzerror nztePriKey(nzctx *, nzttPersona *, ub1 **, ub4 *);
+#else
+nzerror nztePriKey(/*_ nzctx *, nzttPersona *, ub1 **, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteMyCert ---------------------*/
+
+/*
+ * NAME
+ *    nzteMyCert - Get the X.509 Certificate for a persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    cert     {OUT}    X.509 Certificate [BER encoded]
+ *    cert_len {OUT}    Certificate length
+ * 
+ * NOTES
+ *    This funiction will only work for X.509 based persona which contain
+ *    a certificate for the self identity. 
+ *    A copy of the certificate is returned to the caller so that they do not 
+ *    have to worry about the certificate changeing "underneath them".
+ *    Memory will be allocated for the cert and therefore, the CALLER
+ *    will be responsible for freeing this memory.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_NO_MEMORY    ossctx is null.
+ */
+#ifdef __STDC__
+nzerror nzteMyCert(nzctx *, nzttPersona *, ub1 **, ub4 *);
+#else
+nzerror nzteMyCert(/*_ nzctx *, nzttPersona *, ub1 **, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteX509CreatePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteX509CreatePersona - Given a BER X.509 cert, create a persona
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    cert     {IN}     X.509 Certificate [BER encoded]
+ *    cert_len {IN}     Certificate length
+ *    persona  {OUT}    Persona.
+ * 
+ * NOTES
+ *    Memory will be allocated for the persona and therefore, the CALLER
+ *    will be responsible for freeing this memory.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_NO_MEMORY    ossctx is null.
+ */
+#ifdef __STDC__
+nzerror nzteX509CreatePersona(nzctx *, ub1 *, ub4, nzttPersona **);
+#else
+nzerror nzteX509CreatePersona(/*_ nzctx *, ub1 *, ub4, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztiCreateIdentity --------------------*/
+
+/*
+ * NAME
+ *    nztiCreateIdentity - Create an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    itype    {IN}     Identity type.
+ *    desc     {IN}     Description of identity.
+ *    identity {IN/OUT} Identity.
+ * 
+ * NOTES
+ *    Memory is only allocated for the identity structure.  The elements in
+ *    the description struct are not copied.  Rather their pointers are copied
+ *    into the identity structure.  Therefore, the caller should not free
+ *    the elements referenced by the desc.  These elements will be freed
+ *    when the nztiDestroyIdentity is called.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_PARMS     Error in description.
+ */
+#ifdef __STDC__
+nzerror nztiCreateIdentity(nzctx *, nzttVersion, nzttIdentityDesc *,
+                               nzttIdentity **);
+#else
+nzerror nztiCreateIdentity(/*_ nzctx *, nzttVersion, nzttIdentityDesc *,
+                               nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+#ifdef NZ_OLD_TOOLS
+/*-------------------- nztiDuplicateIdentity --------------------*/
+
+/*
+ * NAME
+ *    nztiDuplicateIdentity - Duplicate an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt     {IN}     OSS context.
+ *    identity     {IN}     Target Identity.
+ *    new_identity {IN}     New Identity.
+ * 
+ * NOTES
+ *    Memory for the identity is allocated inside the function, and all
+ *    internal identity elements as well.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_TK_NOTFOUND  Identity not found.
+ *    NZERROR_PARMS     Error in description.
+ */
+#ifdef __STDC__
+nzerror nztiDuplicateIdentity(nzctx *, nzttIdentity *, 
+                              nzttIdentity **);
+#else
+nzerror nztiDuplicateIdentity(/*_ nzctx *, nzttIdentity *, 
+                              nzttIdentity ** _*/);
+#endif /* __STDC __*/
+#endif /* NZ_OLD_TOOLS */
+
+/*--------------------- nztiAbortIdentity ---------------------*/
+
+/*
+ * NAME
+ *    nztiAbortIdentity - Abort an unassociated identity.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    identity {IN/OUT} Identity.
+ * 
+ * NOTES
+ *    It is an error to try to abort an identity that can be
+ *    referenced through a persona.
+ *    
+ *    The identity pointer is set to NULL at the conclusion.
+ * 
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_CANTABORT    Identity is associated with persona.
+ */
+#ifdef __STDC__
+nzerror nztiAbortIdentity(nzctx *, nzttIdentity **);
+#else
+nzerror nztiAbortIdentity(/*_ nzctx *, nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+#ifdef NZ_OLD_TOOLS
+/*----------------- nztidGetIdentityDesc -----------------*/
+
+/*
+ * NAME
+ *    nztidGetIdentityDesc - Gets an Identity Description from the identity
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     Success.
+ *    identity    {IN}     Identity.
+ *    description {IN/OUT} Identity Description.
+ * 
+ * NOTES
+ *    Memory is allocated for the Identity Description. It
+ *    is the callers responsibility to free this memory by calling 
+ *    nztiFreeIdentityDesc.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+#ifdef __STDC__
+nzerror nztidGetIdentityDesc(nzctx *, nzttIdentity *, 
+                             nzttIdentityDesc **);
+#else
+nzerror nztidGetIdentityDesc(/*_ nzctx *, nzttIdentity *,
+                                     nzttIdentityDesc ** _*/);
+#endif /* __STDC __*/
+
+/*----------------- nztidFreeIdentityDesc -----------------*/
+
+/*
+ * NAME
+ *    nztidFreeIdentityDesc - Frees memory for Identity Desc object.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     oss context.
+ *    description {IN/OUT} Identity Description.
+ * 
+ * NOTES
+ *    Memory is freed for all Identity description elements.  Pointer is 
+ *    then set to null.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+#ifdef __STDC__
+nzerror nztidFreeIdentityDesc(nzctx *, nzttIdentityDesc **);
+#else
+nzerror nztidFreeIdentityDesc(/*_ nzctx *, nzttIdentityDesc ** _*/);
+#endif /* __STDC __*/
+#endif /* NZ_OLD_TOOLS */
+
+/*---------------- nztific_FreeIdentityContent ----------------*/
+
+/*
+ * NAME
+ *     nztific_FreeIdentityContent - free the contents of an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt         {IN}     OSS context.
+ *    identity         {IN/OUT} freed identity
+ * 
+ * NOTES
+ *    Free a created identity.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+/*
+ * Free the identity content.
+ */
+#ifdef __STDC__
+nzerror nztific_FreeIdentityContent(nzctx *ossctx,
+                                        nzttIdentity *identity);
+#else
+nzerror nztific_FreeIdentityContent(/*_ nzctx *ossctx,
+                                        nzttIdentity *identity _*/);
+#endif /* __STDC __*/
+
+
+/*-------------------------- nztSign --------------------------*/
+
+/*
+ * NAME
+ *    nztSign - Create an attached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Open persona acting as signer.
+ *    state    {IN}     State of signature.
+ *    inlen    {IN}     Length of this input part.
+ *    in       {IN}     This input part.
+ *    tdubuf   {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztSign(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                    nzttBufferBlock *);
+#else
+nzerror nztSign(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                    nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------------- nztVerify -------------------------*/
+
+/*
+ * NAME
+ *    nztVerify - Verify an attached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of verification.
+ *    intdulen {IN}     TDU length.
+ *    intdu    {IN}     TDU.
+ *    out      {IN/OUT} Extracted message.
+ *    verified {OUT}    TRUE if signature verified.
+ *    validated{OUT}    TRUE if signing identity validated.
+ *    identity {OUT} Identity of signing party.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow outptu buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztVerify(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                      nzttBufferBlock *, boolean *, boolean *,
+                      nzttIdentity **);
+#else
+nzerror nztVerify(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                      nzttBufferBlock *, boolean *, boolean *,
+                      nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztValidate ------------------------*/
+
+/*
+ * NAME
+ *    nztValidate - Validate an identity.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    identity {IN}  Identity.
+ *    validated{OUT} TRUE if identity was validated.  
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztValidate(nzctx *, nzttPersona *, nzttIdentity *, boolean *);
+#else
+nzerror nztValidate(/*_ nzctx *, nzttPersona *, nzttIdentity *, boolean * _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztsd_SignDetached --------------------*/
+
+/*
+ * NAME
+ *    nztsd_SignDetached - Generate a detached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of signature.
+ *    inlen    {IN}     Length of this input part.
+ *    in       {IN}     This input part.
+ *    tdubuf   {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztsd_SignDetached(nzctx *, nzttPersona *, nzttces, ub4, ub1 *, 
+                               nzttBufferBlock *);
+#else
+nzerror nztsd_SignDetached(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *, 
+                               nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------- nztved_VerifyDetached -------------------*/
+
+/*
+ * NAME
+ *    nztved_VerifyDetached - Verify a detached signature.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of verification.
+ *    inlen    {IN}     Length of data.
+ *    in       {IN}     Data.
+ *    intdulen {IN}     Input TDU length.
+ *    tdu      {IN}     Input TDU.
+ *    verified {OUT}    TRUE if signature verified.
+ *    validated{OUT}    TRUE if signing identity validated.
+ *    identity {OUT} Identity of signing party.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztved_VerifyDetached(nzctx *, nzttPersona *, nzttces, ub4, 
+                                  ub1 *, ub4, ub1 *, boolean *, boolean *, 
+                                  nzttIdentity **);
+#else
+nzerror nztved_VerifyDetached(/*_ nzctx *, nzttPersona *, nzttces, ub4, 
+                                  ub1 *, ub4, ub1 *, boolean *, boolean *, 
+                                  nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztkec_PKEncrypt ---------------------*/
+
+/*
+ * NAME
+ *    nztkec_PKEncrypt - Encrypt data symmetrically, encrypt key asymmetrically
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    nrecipients {IN}     Number of recipients for this encryption.
+ *    recipients  {IN}     List of recipients.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    There is a limitation of 1 recipient (nrecipients = 1) at this
+ *    time.
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztkec_PKEncrypt(nzctx *, nzttPersona *, ub4, nzttIdentity *, 
+                             nzttces, ub4, ub1 *, nzttBufferBlock *);
+#else
+nzerror nztkec_PKEncrypt(/*_ nzctx *, nzttPersona *, ub4, nzttIdentity *, 
+                             nzttces, ub4, ub1 *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------- nztxkec_PKEncryptExpansion ----------------*/
+
+/*
+ * NAME
+ *    nztxkec_PKEncryptExpansion - Determine the buffer needed for PKEncrypt
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context. 
+ *    persona     {IN}     Persona.
+ *    nrecipients {IN}     Number of recipients.
+ *    inlen       {IN}     Length of input.
+ *    tdulen      {out}    Length of buffer need.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxkec_PKEncryptExpansion(nzctx *, nzttPersona *, ub4, ub4,
+                                       ub4 *);
+#else
+nzerror nztxkec_PKEncryptExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4,
+                                       ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztkdc_PKDecrypt ---------------------*/
+
+/*
+ * NAME
+ *    nztkdc_PKDecrypt - Decrypt a PKEncrypted message.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztkdc_PKDecrypt(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                             nzttBufferBlock *);
+#else
+nzerror nztkdc_PKDecrypt(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                             nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*-------------------------- nztHash --------------------------*/
+
+/*
+ * NAME
+ *    nztHash - Generate a hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of hash.
+ *    inlen    {IN}     Length of this input.
+ *    in       {IN}     This input.
+ *    tdu      {IN/OUT} Output tdu.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztHash(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                    nzttBufferBlock *);
+#else
+nzerror nztHash(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                    nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztSeedRandom -----------------------*/
+
+/*
+ * NAME
+ *    nztSeedRandom - Seed the random function
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    seedlen  {IN}  Length of seed.
+ *    seed     {IN}  Seed.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztSeedRandom(nzctx *, nzttPersona *, ub4, ub1 *);
+#else
+nzerror nztSeedRandom(/*_ nzctx *, nzttPersona *, ub4, ub1 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztrb_RandomBytes ---------------------*/
+
+/*
+ * NAME
+ *    nztrb_RandomBytes - Generate a buffer random bytes.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    nbytes   {IN}     Number of bytes desired.
+ *    out      {IN/OUT} Buffer block for bytes.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztrb_RandomBytes(nzctx *, nzttPersona *, ub4, 
+                              nzttBufferBlock *);
+#else
+nzerror nztrb_RandomBytes(/*_ nzctx *, nzttPersona *, ub4, 
+                              nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztrn_RandomNumber --------------------*/
+
+/*
+ * NAME
+ *    nztrn_RandomNumber - Generate a random number
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    num      {OUT}    Number.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztrn_RandomNumber(nzctx *, nzttPersona *, uword *);
+#else
+nzerror nztrn_RandomNumber(/*_ nzctx *, nzttPersona *, uword * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbInitBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbInitBlock - Initialize a buffer block.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    block    {IN/OUT} Buffer block.
+ * 
+ * NOTES
+ *    The buffer block is initialized to be empty (all members are set
+ *    to 0/NULL).  Such a block will be allocated memory as needed.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nztbbInitBlock(nzctx *, nzttBufferBlock *);
+#else
+nzerror nztbbInitBlock(/*_ nzctx *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbReuseBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbReuseBlock - Reuse an already initialized and possibly used block.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    block    {IN/OUT} Buffer block.
+ * 
+ * NOTES
+ *    This function simply sets the used length member of the buffer
+ *    block to 0.  If the block already has memory allocated to it,
+ *    this will cause it to be reused.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nztbbReuseBlock(nzctx *, nzttBufferBlock *);
+#else
+nzerror nztbbReuseBlock(/*_ nzctx *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbSizeBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbSizeBlock - Size an initialized block to a particular size.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    len      {IN}     Minimum number of unused bytes desired.
+ *    block    {IN/OUT} Buffer block.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nztbbSizeBlock(nzctx *, ub4, nzttBufferBlock *);
+#else
+nzerror nztbbSizeBlock(/*_ nzctx *, ub4, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztbbGrowBlock -----------------------*/
+
+/*
+ * NAME
+ *    nzbbGrowBlock - Increase the size of the buffer block.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    inc      {IN}     Number of bytes to increase.
+ *    block    {IN/OUT} Buffer block.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nztbbGrowBlock(nzctx *, ub4, nzttBufferBlock *);
+#else
+nzerror nztbbGrowBlock(/*_ nzctx *, ub4, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*---------------------- nztbbPurgeBlock ----------------------*/
+
+/*
+ * NAME
+ *    nztbbPurgeBlock - Purge a buffer block of its memory.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    block    {IN/OUT} Buffer block.
+ * 
+ * NOTES
+ *    The memory used by the buffer block as the buffer is released.
+ *    The buffer block itself is not affected.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nztbbPurgeBlock(nzctx *, nzttBufferBlock *);
+#else
+nzerror nztbbPurgeBlock(/*_ nzctx *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztbbSetBlock -----------------------*/
+
+/*
+ * NAME
+ *    nztbbSetBlock - Set a buffer block to a known state.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    flags    {IN}     Flags to set.
+ *    buflen   {IN}     Length of buffer.
+ *    usedlen  {IN}     Used length.
+ *    buffer   {IN}     Buffer.
+ *    block    {IN/OUT} Buffer block
+ * 
+ * NOTES
+ *    If buflen > 0, objlen == 0, and obj == NULL, then buflen bytes
+ *    of memory is allocated and a pointer is stored in the buffer
+ *    block.
+ *
+ *    The buffer parameter remains unchanged.
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nztbbSetBlock(nzctx *,  uword, ub4, ub4, ub1 *, 
+                          nzttBufferBlock *);
+#else
+nzerror nztbbSetBlock(/*_ nzctx *,  uword, ub4, ub4, ub1 *, 
+                          nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+
+/*--------------------- nztiGetSecInfo ---------------------*/
+
+/*
+ * NAME
+ * 	nztiGetSecInfo - Get some security information for SSL
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *    	persona  {IN}		persona
+ *    	dname    {OUT}    	distinguished name of the certificate
+ *    	dnamelen {OUT}    	length of the distinguished name 
+ *    	issuername {OUT}  	issuer name of the certificate
+ *    	certhash {OUT}		SHA1 hash of the certificate
+ *	certhashlen{OUT}	length of the hash
+ * NOTES
+ * 	This function allocate memories for issuername, certhash, and dname.
+ *	To deallocate memory for those params, you should call nztdbuf_DestroyBuf.
+ * RETURNS
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztiGetSecInfo(nzctx *, nzttPersona *, text **, ub4 *,
+			 text **, ub4 *, ub1 **, ub4 *);
+#else
+nzerror nztiGetSecInfo(/*_ nzctx *, nzttPersona *, text **, ub4 *,
+			   text **, ub4 *, ub1 **, ub4 * _*/);
+#endif	/* __STDC__ */
+
+
+/*---------------------- nztiGetDName ----------------------*/
+
+/*
+ * NAME
+ * 	nztiGetDName - Get the distinguished name for the given identity
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	identity {IN}		identity need to get dname from
+ *	dn	{OUT}		distinguished name
+ *	dnlen	{OUT}		length of the dname
+ *
+ * NOTES
+ * 	
+ * RETURNS
+ * 	
+ */
+
+#ifdef __STDC__
+nzerror nztiGetDName(nzctx *, nzttIdentity *,
+		     text **, ub4 *);
+#else
+nzerror nztiGetDName(/*_ nzctx *, nzttIdentity *,
+			     text **, ub4 * _*/);
+#endif /* __STDC__ */
+
+/*------------------- nztiGetIssuerName -------------------*/
+
+/*
+ * NAME
+ * 	nztiGetIssuerName -  Get IssuerName for the given identity 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	identity {IN}		identity need to get issuername from
+ *	issuername {OUT}       	issuer's name
+ *	issuernamelen {OUT}	length of the issuer's name
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztiGetIssuerName(nzctx *, nzttIdentity *,
+			     text **, ub4 *);
+#else
+nzerror nztiGetIssuerName(/*_ nzctx *, nzttIdentity *,
+			      text **, ub4 * _*/);
+#endif /* __STDC__ */
+
+
+/*-------------------- nztgch_GetCertHash --------------------*/
+
+/*
+ * NAME
+ * 	nztgch_GetCertHash -  Get SHA1 hash for the certificate of the identity 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	identity {IN}		identity need to get issuername from
+ *	certHash {OUT}          certHash buffer 
+ *	hashLen {OUT}		length of the certHash 
+ * 
+ * NOTES
+ * 	Need to call nztdbuf_DestroyBuf to deallocate memory for certHash.	
+ * RETURNS
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztgch_GetCertHash(nzctx *, nzttIdentity *,
+			     ub1 **, ub4 *);
+#else
+nzerror nztgch_GetCertHash(/*_ nzctx *, nzttIdentity *,
+			     ub1 **, ub4 * _*/);
+#endif /* __STDC__ */
+
+/*-------------------- nztdbuf_DestroyBuf --------------------*/
+
+/*
+ * NAME
+ * 	nztdbuf_DestroyBuf - Deallocation funtions for ub1 and text buffer 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	buf      {IN}		Allocated buffer to be destroyed.
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztdbuf_DestroyBuf( nzctx *, dvoid **);
+#else
+nzerror nztdbuf_DestroyBuf(/*_ nzctx *, dvoid ** _*/);
+#endif /* __STDC__ */
+
+
+/*----------------------- nztGetCertChain -----------------------*/
+
+/*
+ * NAME
+ * 	nztGetCertChain - 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztGetCertChain(nzctx *, nzttWallet * );
+#else
+nzerror nztGetCertChain(/*_ nzctx *, nzttWallet _*/);
+#endif /* __STDC__ */
+
+/*----------------------- nztCompareDN -----------------------*/
+
+/*
+ * NAME
+ * 	nztCompareDN - 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	dn1	{IN}		distinguished name 1
+ *	dn2     {IN}		distinguished name 2
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztCompareDN(nzctx *, ub1 *, ub4,  ub1 *, ub4, boolean * );
+#else
+nzerror nztCompareDN(/*_ nzctx *, ub1 *,ub4 ,  ub1 *, ub4, boolean * _*/);
+#endif/* __STDC__ */
+
+
+#ifdef NZ_OLD_TOOLS
+/*--------------------- nztIdentityAlloc ---------------------*/
+
+/*
+ * NAME
+ * 	nztIdentityAlloc - Allocate memory for nzttIdentity context
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	identity {OUT}		nzttIdentity context
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztIdentityAlloc(nzctx *, nzttIdentity **);
+#else
+nzerror nztIdentityAlloc(/*_ nzctx *, nzttIdentity ** _*/);
+#endif/* __STDC__ */
+
+/*--------------------- nztIPrivateAlloc ---------------------*/
+
+/*
+ * NAME
+ * 	nztIPrivateAlloc - Allocate memory for nzttIdentityPrivate
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ * 
+ *    	osscntxt {IN}     	OSS context.
+ *	ipriv	{OUT}		identityPrivate structure
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+
+#ifdef __STDC__
+nzerror nztIPrivateAlloc( nzctx *, nzttIdentityPrivate **);
+#else
+nzerror nztIPrivateAlloc( nzctx *, nzttIdentityPrivate **);
+#endif /* __STDC__ */
+
+
+/*---------------------- nztIDupContent ----------------------*/
+
+/*
+ * NAME
+ * 	nztIDupContent - 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ * 	targetIdentity{OUT}	target identity
+ *	sourceIdentity {IN}	source identity
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+
+#ifdef __STDC__
+nzerror nztIDupContent( nzctx *, nzttIdentity *, nzttIdentity *);
+#else
+nzerror nztIDupContent(/*_ nzctx *, nzttIdentity *, nzttIdentity * _*/);
+#endif
+/*---------------------- nztIPDuplicate ----------------------*/
+
+/*
+ * NAME
+ * 	nztIPDuplicate - 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	target_ipriv {OUT}	target identityPrivate
+ *	source_ipriv {IN}	source identityPrivate
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztIPDuplicate( nzctx *, nzttIdentityPrivate **,
+			nzttIdentityPrivate *);
+#else
+nzerror nztIPDuplicate(/*_ nzctx *, nzttIdentityPrivate **,
+			 nzttIdentityPrivate * _*/);
+#endif /* __STDC__ */
+
+/*--------------------- nztiDupIdentList ---------------------*/
+
+/*
+ * NAME
+ * 	nztiDupIdentList - 
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	source_identities {IN}	source identity list
+ *	numIdent {OUT}		number of identity in the list
+ *	ppidentity {OUT}	Target of identity	
+ *	
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztiDupIdentList( nzctx *, nzttIdentity  *, ub4 *, 
+                          nzttIdentity **);
+#else
+
+nzerror nztiDupIdentList(/*_ nzctx *, nzttIdentity  *, ub4 *, 
+                             nzttIdentity ** _*/);
+#endif
+
+/*--------------------- nztFreeIdentList ---------------------*/
+
+/*
+ * NAME
+ * 	nztFreeIdentList - Free memory for a list of Identities
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	identity {IN}		identity context
+ *
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztFreeIdentList( nzctx *, nzttIdentity **);
+#else
+nzerror nztFreeIdentList(/*_ nzctx *, nzttIdentity ** _*/);
+#endif
+#endif /* NZ_OLD_TOOLS */
+
+/*--------------------- nztCheckVaLidity ---------------------*/
+
+/*
+ * NAME
+ * 	nztCheckVaLidity -  Check the validity of certificate
+ * 
+ * PARAMETERS
+ * 	Name	{IN/OUT}	Description
+ *    	osscntxt {IN}     	OSS context.
+ *	start_time		Start time of the certificate
+ *	end_time		End time of the certificate
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ * 	NZERROR_OK	 	succeeded
+ *	others			failed
+ * 	
+ */
+#ifdef __STDC__
+nzerror nztCheckValidity( nzctx *, ub4 , ub4 );
+#else
+nzerror nztCheckValidity(/*_ nzctx *, ub4 , ub4 _*/);
+#endif
+
+/*--------------------- nztwCreateWallet ---------------------*/
+
+/*
+ * NAME
+ *    nztwCreateWallet - Create a new wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wrllen   {IN}     Length of wallet resource locator.
+ *    wrl      {IN}     WRL.
+ *    pwdlen   {IN}     Length of password (see notes below).
+ *    pwd      {IN}     Password.
+ *    wallet   {IN/OUT} Wallet. 
+ * 
+ * NOTES
+ *    It is an error to try to create a wallet that already exists.
+ *    The previously existing wallet must be destroyed first.
+ *
+ *    The wallet itself is not encrypted.  Rather, all the personas in
+ *    the wallet are encrypted under the same password.  A hash of the
+ *    password is stored in the wallet.
+ *
+ *    Upon success, an empty open wallet is stored in the wallet
+ *    parameter.
+ *    
+ * RETURNS
+ *    NZERROR_OK                 Sucess.
+ *    NZERROR_TK_WALLET_EXISTS   Wallet already exists.
+ *    NZERROR_RIO_OPEN           RIO could not create wallet (see trace file).
+ */
+#ifdef __STDC__
+nzerror nztwCreateWallet(nzctx *, ub4, text *, ub4, text *, 
+                             nzttWallet *);
+#else
+nzerror nztwCreateWallet(/*_ nzctx *, ub4, text *, ub4, text *, 
+                             nzttWallet * _*/);
+#endif /* __STDC__ */
+
+
+/*--------------------- nztwDestroyWallet ---------------------*/
+
+/*
+ * NAME
+ *    nztwDestroyWallet - Destroy an existing wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    wrllen   {IN}     Length of wallet resource locator.
+ *    wrl      {IN}     WRL.
+ *    pwdlen   {IN}     Length of password.
+ *    pwd      {IN}     Password.
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_RIO_OPEN     RIO could not open wallet (see trace file).
+ *    NZERROR_RIO_DELETE   Delete failed (see trace file).
+ */
+#ifdef __STDC__
+nzerror nztwDestroyWallet(nzctx *, ub4, text *, ub4, text *);
+#else
+nzerror nztwDestroyWallet(/*_ nzctx *, ub4, text *, ub4, text * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteStorePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteStorePersona - Store an open persona in a wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    persona  {IN/OUT} Persona.
+ *    wallet   {IN/OUT} Wallet.
+ * 
+ * NOTES
+ *    If the open persona is not associated with any wallet (it was
+ *    created via the nzteClosePersona function), then storing the
+ *    persona creates that association.  The wallet will also have an
+ *    updated persona list that reflects this association.
+ *
+ *    If the open persona was associated with wallet 'A' (it was
+ *    opened via the nztwOpenWallet function), and is stored back into
+ *    wallet 'A', then then the old persona is overwritten by the new
+ *    persona if the password can be verified.  Recall that all
+ *    personas have a unique identity id.  If that id changes then
+ *    storing the persona will put a new persona in the wallet.
+ *
+ *    If the open persona was associated with wallet 'A' and is stored
+ *    into wallet 'B', and if wallet 'B' does not contain a persona
+ *    with that unique identity id, then the persona will be copied
+ *    into wallet 'B', wallet 'B''s persona list will be updated, and
+ *    the persona structure will be updated to be associated with
+ *    wallet 'B'.  If wallet 'B' already contained the persona, it
+ *    would be overwritten by the new persona.
+ *
+ *    The persona parameter is doubly indirect so that at the
+ *    conclusion of the function call, the pointer can be directed to
+ *    the persona in the wallet.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_RIO_STORE    Store failed (see network trace file).
+ */
+#ifdef __STDC__
+nzerror nzteStorePersona(nzctx *, nzttPersona **, nzttWallet *);
+#else
+nzerror nzteStorePersona(/*_ nzctx *, nzttPersona **, nzttWallet * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteRemovePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteRemovePersona - Remove a persona from the wallet.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN/OUT} Persona.
+ * 
+ * NOTES
+ *    The password is verified before trying to remove the persona.
+ *    
+ *    If the persona is open, it is closed.  The persona is removed
+ *    from the wallet list and the persona pointer is set to NULL.
+ *    
+ *    A double indirect pointer to the persona is required so that the
+ *    persona pointer can be set to NULL upon completion.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_PASSWORD  Password verification failed.
+ *    NZERROR_RIO_DELETE   Delete failed.
+ */
+#ifdef __STDC__
+nzerror nzteRemovePersona(nzctx *, nzttPersona **);
+#else
+nzerror nzteRemovePersona(/*_ nzctx *, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteCreatePersona ---------------------*/
+
+/*
+ * NAME
+ *    nzteCreatePersona - Create a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    itype    {IN}     Identity type.
+ *    ctype    {IN}     Cipher type.
+ *    desc     {IN}     Persona description.
+ *    persona  {OUT}    Persona.
+ * 
+ * NOTES
+ *    The resulting persona is created in the open state, but it will
+ *    not be associated with a wallet.
+ *    
+ *    The memory for the persona is allocated by the function.
+ *
+ * RETURNS
+ *    NZERROR_OK        Success.
+ *    NZERROR_TK_TYPE   Unsupported itype/ctype combination.
+ *    NZERROR_TK_PARMS  Error in persona description.
+ */
+#ifdef __STDC__
+nzerror nzteCreatePersona(nzctx *, nzttVersion, nzttCipherType, 
+			  nzttPersonaDesc *, nzttPersona **);
+#else
+nzerror nzteCreatePersona(/*_ nzctx *, nzttVersion, nzttCipherType, 
+                              nzttPersonaDesc *, nzttPersona ** _*/);
+#endif /* __STDC __*/
+
+
+/*----------------- nztiStoreTrustedIdentity -----------------*/
+
+/*
+ * NAME
+ *    nztiStoreTrustedIdentity - Store an identity into a persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     Success.
+ *    identity {IN/OUT} Trusted Identity.
+ *    persona  {IN/OUT} Persona.    
+ * 
+ * NOTES
+ *    The identity is not saved with the persona in the wallet until
+ *    the persona is stored.
+ *    
+ *    The identity parameter is double indirect so that it can point
+ *    into the persona at the conclusion of the call.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+#ifdef __STDC__
+nzerror nztiStoreTrustedIdentity(nzctx *, nzttIdentity **,
+                                     nzttPersona *);
+#else
+nzerror nztiStoreTrustedIdentity(/*_ nzctx *, nzttIdentity **,
+                                     nzttPersona * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteSetProtection ---------------------*/
+
+/*
+ * NAME
+ *    nzteSetProtection - Set the protection type for a CE function.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN/OUT} Persona.
+ *    func     {IN}     CE function.
+ *    tdufmt   {IN}     TDU Format.
+ *    protinfo {IN}     Protection information specific to this format.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK              Success.
+ *    NZERROR_TK_PROTECTION   Unsupported protection.
+ *    NZERROR_TK_PARMS        Error in protection info.
+ */
+#ifdef __STDC__
+nzerror nzteSetProtection(nzctx *, nzttPersona *, nzttcef, nztttdufmt,
+                              nzttProtInfo *);
+#else
+nzerror nzteSetProtection(/*_ nzctx *, nzttPersona *, nzttcef, nztttdufmt,
+                              nzttProtInfo * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nzteGetProtection ---------------------*/
+
+/*
+ * NAME
+ *    nzteGetProtection - Get the protection type for a CE function.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    func     {IN}     CE function.
+ *    tdufmt   {OUT}    TDU format.
+ *    protinfo {OUT}    Protection information.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK        Success.
+ */
+#ifdef __STDC__
+nzerror nzteGetProtection(nzctx *, nzttPersona *, nzttcef, nztttdufmt *,
+                              nzttProtInfo *);
+#else
+nzerror nzteGetProtection(/*_ nzctx *, nzttPersona *, nzttcef, nztttdufmt *,
+                              nzttProtInfo * _*/);
+#endif /* __STDC __*/
+
+/*-------------------- nztiRemoveIdentity --------------------*/
+
+/*
+ * NAME
+ *    nztiRemoveIdentity - Remove an identity from an open persona.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context. 
+ *    identity {IN/OUT}     Identity.
+ * 
+ * NOTES
+ *    If the persona is not stored, this identity will still be in the
+ *    persona stored in the wallet.
+ *    
+ *    The identity parameter is doubly indirect so that at the
+ *    conclusion of the function, the pointer can be set to NULL.
+ *
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTFOUND  Identity not found.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ */
+#ifdef __STDC__
+nzerror nztiRemoveIdentity(nzctx *, nzttIdentity **);
+#else
+nzerror nztiRemoveIdentity(/*_ nzctx *, nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*----------------- nztifdn -----------------*/
+
+/*
+ * NAME
+ *    nztifdn - create an Identity From a Distinguished Name
+ * 
+ * PARAMETERS
+ *    osscntxt           {IN}  OSS context.
+ *    length             {IN}  Length of the distinguished name
+ *    distinguished_name {IN}  distinguished name string
+ *    ppidentity         {OUT} created identity
+ * 
+ * NOTES
+ *    Given a distinguished name, return the identity that corresponds to it.
+ *
+ * RETURNS
+ *    NZERROR_OK     Success.
+ */
+#ifdef __STDC__
+nzerror nztifdn(nzctx         *ossctx,
+                    ub4         length,
+                    text          *distinguished_name,
+                    nzttIdentity **ppidentity);
+#else
+nzerror nztifdn(/*_ nzctx         *ossctx,
+                    ub4         length,
+                    text          *distinguished_name,
+                    nzttIdentity **ppidentity _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztxSignExpansion ---------------------*/
+
+/*
+ * NAME
+ *    nztxSignExpansion - Determine the size of the attached signature buffer.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of input.
+ *    tdulen   {OUT} Buffer needed for signature.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxSignExpansion(nzctx *, nzttPersona *, ub4, ub4 *);
+#else
+nzerror nztxSignExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------- nztxsd_SignDetachedExpansion ---------------*/
+
+/*
+ * NAME
+ *    nztxsd_SignDetachedExpansion - Determine the size of buffer needed.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of input.
+ *    tdulen   {OUT} Buffer needed for signature.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxsd_SignDetachedExpansion(nzctx *, nzttPersona *, ub4,
+                                         ub4 *);
+#else
+nzerror nztxsd_SignDetachedExpansion(/*_ nzctx *, nzttPersona *, ub4,
+                                         ub4 * _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztEncrypt ------------------------*/
+
+/*
+ * NAME
+ *    nztEncrypt - Symmetrically encrypt
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztEncrypt(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                       nzttBufferBlock *);
+#else
+nzerror nztEncrypt(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                       nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------- nztxEncryptExpansion -------------------*/
+
+/*
+ * NAME
+ *    nztxEncryptExpansion - Determine the size of the TDU to encrypt.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}  OSS context.
+ *    persona     {IN}  Persona.
+ *    inlen       {IN}  Length of this input part.
+ *    tdulen      {OUT} Length of TDU.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxEncryptExpansion(nzctx *, nzttPersona *, ub4, ub4 *);
+#else
+nzerror nztxEncryptExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztDecrypt ------------------------*/
+
+/*
+ * NAME
+ *    nztDecrypt - Decrypt an Encrypted message.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of decryption.
+ *    inlen    {IN}     Length of this input part.
+ *    in       {IN}     This input part.
+ *    out      {IN/OUT} Cleartext message.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztDecrypt(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                       nzttBufferBlock *);
+#else
+nzerror nztDecrypt(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                       nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------------ nztEnvelope ------------------------*/
+
+/*
+ * NAME
+ *    nztEnvelope - Sign and PKEncrypt a message.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    nrecipients {IN}     Number of recipients for this encryption.
+ *    recipients  {IN}     List of recipients.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    tdubuf      {IN/OUT} TDU buffer.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow output buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztEnvelope(nzctx *, nzttPersona *, ub4, nzttIdentity *,
+                        nzttces, ub4, ub1 *, nzttBufferBlock *);
+#else
+nzerror nztEnvelope(/*_ nzctx *, nzttPersona *, ub4, nzttIdentity *,
+                        nzttces, ub4, ub1 *, nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztDeEnvelope -----------------------*/
+
+/*
+ * NAME
+ *    nztDeEnvelope - PKDecrypt and verify a message.
+ * 
+ * PARAMETERS
+ *    osscntxt    {IN}     OSS context.
+ *    persona     {IN}     Persona.
+ *    state       {IN}     State of encryption.
+ *    inlen       {IN}     Length of this input part.
+ *    in          {IN}     This input part.
+ *    out         {OUT}    Message from TDU.
+ *    verified    {OUT}    TRUE if verified.
+ *    validated   {OUT}    TRUE if validated.
+ *    sender      {OUT}    Identity of sender.
+ *
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztDeEnvelope(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                          nzttBufferBlock *, boolean *, boolean *,
+                          nzttIdentity **);
+#else
+nzerror nztDeEnvelope(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                          nzttBufferBlock *, boolean *, boolean *,
+                          nzttIdentity ** _*/);
+#endif /* __STDC __*/
+
+/*----------------------- nztKeyedHash -----------------------*/
+
+/*
+ * NAME
+ *    nztKeyedHash - Generate a keyed hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}     OSS context.
+ *    persona  {IN}     Persona.
+ *    state    {IN}     State of hash.
+ *    inlen    {IN}     Length of this input.
+ *    in       {IN}     This input.
+ *    tdu      {IN/OUT} Output tdu.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_CANTGROW  Needed to grow TDU buffer but could not.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztKeyedHash(nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                         nzttBufferBlock *);
+#else
+nzerror nztKeyedHash(/*_ nzctx *, nzttPersona *, nzttces, ub4, ub1 *,
+                         nzttBufferBlock * _*/);
+#endif /* __STDC __*/
+
+/*------------------ nztxKeyedHashExpansion ------------------*/
+
+/*
+ * NAME
+ *    nztxKeyedHashExpansion - Determine the space needed for a keyed hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of this input.
+ *    tdulen   {OUT} TDU length.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxKeyedHashExpansion(nzctx *, nzttPersona *, ub4, 
+                                   ub4 *);
+#else
+nzerror nztxKeyedHashExpansion(/*_ nzctx *, nzttPersona *, ub4, 
+                                   ub4 * _*/);
+#endif /* __STDC __*/
+
+/*--------------------- nztxHashExpansion ---------------------*/
+
+/*
+ * NAME
+ *    nztxHashExpansion - Determine the size of the TDU for a hash.
+ * 
+ * PARAMETERS
+ *    osscntxt {IN}  OSS context.
+ *    persona  {IN}  Persona.
+ *    inlen    {IN}  Length of this input.
+ *    tdulen   {OUT} TDU length.
+ * 
+ * NOTES
+ *    
+ * RETURNS
+ *    NZERROR_OK           Success.
+ *    NZERROR_TK_NOTOPEN   Persona is not open.
+ *    NZERROR_TK_NOTSUPP   Function not supported with persona.
+ */
+#ifdef __STDC__
+nzerror nztxHashExpansion(nzctx *, nzttPersona *, ub4, ub4 *);
+#else
+nzerror nztxHashExpansion(/*_ nzctx *, nzttPersona *, ub4, ub4 * _*/);
+#endif /* __STDC __*/
+
+/*---------------- nztiae_IsAuthEnabled ----------------*/
+
+/*
+ * NAME
+ * 	nztiae_IsAuthEnabled -  Checks to see if Authentication is Enabled
+ *                               in the current Cipher Spec.
+ * 
+ * PARAMETERS
+ * 	ctx	{IN}	Oracle SSL Context
+ *      ncipher {IN}    CipherSuite
+ *      authEnabled {OUT} Boolean for is Auth Enabled?
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ *      NZERROR_OK on success.
+ *      NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+#ifdef __STDC__
+nzerror nztiae_IsAuthEnabled( nzctx *, ub2, boolean *);
+#else
+nzerror nztiae_IsAuthEnabled(/*_ nzctx *ctx, 
+                                  ub2 ncipher, 
+                                  boolean *authEnabled _*/);
+#endif
+
+/*---------------- nztiee_IsEncrEnabled ----------------*/
+/*
+ * NAME
+ * 	nztiee_IsEncrEnabled -  Checks to see if Encryption is Enabled
+ *                               in the current Cipher Spec.
+ * 
+ * PARAMETERS
+ * 	ctx	{IN}	Oracle SSL Context
+ *      ncipher {IN}    CipherSuite
+ *      EncrEnabled {OUT} Boolean for is Auth Enabled?
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ *      NZERROR_OK on success.
+ *      NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+#ifdef __STDC__
+nzerror nztiee_IsEncrEnabled( nzctx *, ub2, boolean *);
+#else
+nzerror nztiee_IsEncrEnabled(/*_ nzctx *ctx, 
+                                  ub2 ncipher, 
+                                  boolean *EncrEnabled _*/);
+#endif
+/*---------------- nztihe_IsHashEnabled ----------------*/
+/*
+ * NAME
+ * 	nztihe_IsHashEnabled -  Checks to see if HAshing is Enabled
+ *                               in the current Cipher Spec.
+ * 
+ * PARAMETERS
+ * 	ctx	{IN}	Oracle SSL Context
+ *      ncipher {IN}    CipherSuite
+ *      hashEnabled {OUT} Boolean for is Auth Enabled?
+ * 
+ * NOTES
+ * 	
+ * RETURNS
+ *      NZERROR_OK on success.
+ *      NZERROR_TK_INV_CIPHR_TYPE if Cipher Spec is not Recognized.
+ */
+
+#ifdef __STDC__
+nzerror nztihe_IsHashEnabled( nzctx *, ub2, boolean *);
+#else
+nzerror nztihe_IsHashEnabled(/*_ nzctx *ctx, 
+                                  ub2 ncipher, 
+                                  boolean *hashEnabled _*/);
+#endif
+
+/*
+ *
+ */
+
+#ifdef _STDC_
+nzerror nztGetIssuerName(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetIssuerName(/*_ nzctx *ctx,
+                             nzttIdentity *identity,
+                             ub1  **issuername,
+                             ub4   *issuernamelen _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetSubjectName(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetSubjectName(/*_ nzctx *ctx,
+                              nzttIdentity *identity,
+                              ub1  **subjectname,
+                              ub4   *subjectnamelen _*/);
+#endif
+
+
+#ifdef _STDC_
+nzerror nztGetBase64Cert(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetBase64Cert(/*_ nzctx *ctx,
+                              nzttIdentity *identity,
+                              ub1  **b64cert,
+                              ub4   *b64certlen _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetSerialNumber(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetSerialNumber(/*_ nzctx *ctx,
+                              nzttIdentity *identity,
+                              ub1   **serialnum,
+                              ub4    *serialnumlen _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetValidDate(nzctx *, nzttIdentity *, ub4 *, ub4 *);
+#else
+nzerror nztGetValidDate(/*_ nzctx *ctx,
+                            nzttIdentity *identity,
+                            ub4  *startdate, 
+                            ub4  *enddate  _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetVersion(nzctx *, nzttIdentity *, nzstrc *); 
+#else
+nzerror nztGetVersion(/*_ nzctx *ctx,
+                          nzttIdentity *identity,
+                          nzstrc *pVerStr  _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztGetPublicKey(nzctx *, nzttIdentity *, ub1 **, ub4 *);
+#else
+nzerror nztGetPublicKey(/*_ nzctx *ctx,
+                            nzttIdentity *identity,
+                            ub1  **pubKey,
+                            ub4   *pubKeylen _*/);
+#endif
+
+
+#ifdef _STDC_
+nzerror nztGenericDestroy(nzctx *, ub1 **);
+#else
+nzerror nztGenericDestroy(/*_ nzctx *ctx,
+                              ub1  **var _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztSetAppDefaultLocation(nzctx *, text *, size_t);
+#else
+nzerror nztSetAppDefaultLocation(/*_ nzctx *ctx,
+                                     text *,
+                                     size_t _*/);
+#endif
+
+#ifdef _STDC_
+nzerror nztSearchNZDefault(nzctx *, boolean *);
+#else
+nzerror nztSearchNZDefault(/*_ nzctx *ctx,
+                               boolean *search _*/);
+#endif
+
+
+#endif /* NZT_ORACLE */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occi.h b/src/terralib/drivers/OracleSpatial/OCI/include/occi.h
new file mode 100644
index 0000000..2dca9e6
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occi.h
@@ -0,0 +1,78 @@
+/* Copyright (c) 2000, 2002, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     occi.h - Oracle C++ Interface header files.
+
+   DESCRIPTION 
+     <short description of facility this file declares/defines> 
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+      descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   vvinay      08/19/02 - 
+   aahluwal    06/03/02 - bug 2360115
+   gayyappa    01/03/01 - removed inclusions before occiCommon.h
+   kmohan      04/11/00 - include oci.h and occiCommon.h also
+   rkasamse    04/03/00 - header file for all the OCCI classes
+   rkasamse    04/03/00 - Creation
+
+*/
+
+#ifndef OCCI_ORACLE
+# define OCCI_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef OCCIDATA_ORACLE
+#include <occiData.h>
+#endif
+
+#ifndef OCCICONTROL_ORACLE
+#include <occiControl.h>
+#endif
+
+#ifndef OCCIOBJECTS_ORACLE
+#include <occiObjects.h>
+#endif
+
+#ifndef OCCIAQ_ORACLE
+#include <occiAQ.h>
+#endif
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* OCCI_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiAQ.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiAQ.h
new file mode 100644
index 0000000..9b68f41
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiAQ.h
@@ -0,0 +1,374 @@
+/* Copyright (c) 2002, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     occiAQ.h - Header file for occi AQ classes
+
+   DESCRIPTION 
+     Class declarations for Producer, Consumer, Message, Agent
+     Listener, Subscription
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+     descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   cparampa    10/12/02 - creation
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCIAQ_ORACLE
+# define OCCIAQ_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+namespace oracle {
+namespace occi {
+namespace aq{
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+class Message
+{
+  public:
+
+     enum MessageState
+     {
+        MSG_READY = OCI_MSG_READY,
+        MSG_WAITING = OCI_MSG_WAITING,
+        MSG_PROCESSED = OCI_MSG_PROCESSED,
+        MSG_EXPIRED = OCI_MSG_EXPIRED
+     };
+     enum PayloadType
+     {
+        RAW,
+        ANYDATA,
+        OBJECT
+     };
+
+     Message( const Environment *env );
+     Message( const Message& rhs);
+     ~Message();
+     
+     void operator=(const Message& rhs);
+     int getAttemptsToDequeue() const ;
+     void setCorrelationId( const OCCI_STD_NAMESPACE::string& corr_id ) ;
+     OCCI_STD_NAMESPACE::string getCorrelationId() const ;
+     void setDelay( int delay ) ;
+     int getDelay() const ;
+     Date getMessageEnqueuedTime() const ;
+     void setExceptionQueueName( const OCCI_STD_NAMESPACE::string& queue ) ;
+     OCCI_STD_NAMESPACE::string getExceptionQueueName() const ;
+     void setExpiration( int exp ) ;
+     int getExpiration() const ;
+     MessageState getMessageState() const ;
+     void setPriority( int priority ) ;
+     int getPriority() const ;
+     void setRecipientList( OCCI_STD_NAMESPACE::vector<Agent>& ag_list ) ;
+     void setSenderId( const Agent& sender ) ;
+     Agent getSenderId() const ;
+     void setOriginalMessageId( const Bytes& queue ) ;
+     Bytes getOriginalMessageId() const ;
+     void setNull();
+     bool isNull() const;
+
+     void setBytes( const Bytes& bytes); 
+     void setObject( PObject* pobj);
+     void setAnyData( const AnyData& any);
+
+     Bytes getBytes() const ;
+     PObject *getObject() ;
+     AnyData getAnyData() const ;
+
+     PayloadType getPayloadType( ) const;
+
+   private:
+     Ptr<MessageImpl> ptr;
+     OCIAQMsgProperties* getOCIMsgProperties() const;
+     Message( const Environment *env, const Connection *con, 
+          OCIAQMsgProperties *msgprop, void *data, unsigned int dataLen, 
+          PayloadType pType);
+     friend class ConsumerImpl;
+     friend class ProducerImpl;
+     friend class NotifyResult;
+};
+
+class Producer
+{
+   public:
+
+     enum EnqueueSequence
+     {
+       ENQ_BEFORE = OCI_ENQ_BEFORE,
+       ENQ_TOP    = OCI_ENQ_TOP
+     };
+     enum Visibility
+     {
+       ENQ_IMMEDIATE = OCI_ENQ_IMMEDIATE,
+       ENQ_ON_COMMIT = OCI_ENQ_ON_COMMIT
+     };
+     
+     Producer( const Connection *conn ); 
+     Producer( const Connection *conn, 
+               const OCCI_STD_NAMESPACE::string& queue ); 
+     Producer( const Producer& rhs);
+     ~Producer();
+
+     void operator=(const Producer& prod);
+     void setRelativeMessageId( const Bytes& msgid );
+     Bytes getRelativeMessageId() const;
+     void setSequenceDeviation( EnqueueSequence option );
+     EnqueueSequence getSequenceDeviation() const;
+     void setVisibility( Visibility option );
+     Visibility getVisibility() const;
+     void setQueueName( const OCCI_STD_NAMESPACE::string& queue );
+     OCCI_STD_NAMESPACE::string getQueueName() const;
+     void setTransformation( const OCCI_STD_NAMESPACE::string& fName);
+     OCCI_STD_NAMESPACE::string getTransformation() const;
+     Bytes send( Message& msg, const OCCI_STD_NAMESPACE::string& queue );
+     Bytes send( Message& msg );
+     void setNull();
+     bool isNull() const;
+
+  private:
+     Ptr<ProducerImpl> ptr; 
+};
+
+class Consumer
+{
+   public:
+
+     enum DequeueMode
+     {
+       DEQ_BROWSE  = OCI_DEQ_BROWSE,
+       DEQ_LOCKED  = OCI_DEQ_LOCKED,
+       DEQ_REMOVE  = OCI_DEQ_REMOVE,
+       DEQ_REMOVE_NODATA = OCI_DEQ_REMOVE_NODATA
+     };
+     enum Navigation
+     {
+       DEQ_FIRST_MSG        = OCI_DEQ_FIRST_MSG,
+       DEQ_NEXT_TRANSACTION = OCI_DEQ_NEXT_TRANSACTION,
+       DEQ_NEXT_MSG         = OCI_DEQ_NEXT_MSG
+     };
+     enum Visibility
+     {
+       DEQ_IMMEDIATE = OCI_DEQ_IMMEDIATE,
+       DEQ_ON_COMMIT = OCI_DEQ_ON_COMMIT
+     };
+     enum
+     {
+       DEQ_WAIT_FOREVER = OCI_DEQ_WAIT_FOREVER,
+       DEQ_NO_WAIT      = OCI_DEQ_NO_WAIT
+     };
+     
+     Consumer( const Connection *conn ); 
+     Consumer( const Connection * conn, const Agent& agent); 
+     Consumer( const Connection *conn,
+               const OCCI_STD_NAMESPACE::string& queue ); 
+     Consumer(const Consumer& con);
+     ~Consumer();
+    
+     void operator=(const Consumer& con);
+     void setAgent(const Agent& agent);
+     void setConsumerName( const OCCI_STD_NAMESPACE::string& name );
+     OCCI_STD_NAMESPACE::string getConsumerName() const;
+     void setCorrelationId( const OCCI_STD_NAMESPACE::string& cor_id );
+     OCCI_STD_NAMESPACE::string getCorrelationId() const;
+     void setDequeueMode( DequeueMode mode );
+     DequeueMode getDequeueMode() const;
+     void setMessageIdToDequeue( const Bytes& msgid );
+     Bytes getMessageIdToDequeue() const;
+     void setPositionOfMessage( Navigation pos );
+     Navigation getPositionOfMessage() const;
+     void setVisibility( Visibility option );
+     Visibility getVisibility() const;
+     void setWaitTime( unsigned int wait );
+     unsigned int getWaitTime() const;
+     void setQueueName( const OCCI_STD_NAMESPACE::string& queue );
+     OCCI_STD_NAMESPACE::string getQueueName() const;
+     void setTransformation( const OCCI_STD_NAMESPACE::string& fName);
+     OCCI_STD_NAMESPACE::string getTransformation() const;
+     Message receive( Message::PayloadType pType,
+                      const OCCI_STD_NAMESPACE::string& type="",
+                      const OCCI_STD_NAMESPACE::string& schema="");
+     void setNull();
+     bool isNull() const;
+
+   private:
+     Ptr<ConsumerImpl> ptr; 
+};
+
+class Agent
+{
+   public:
+     Agent( const Environment *env ); 
+     Agent( const Environment *env, 
+            const OCCI_STD_NAMESPACE::string& name, 
+            const OCCI_STD_NAMESPACE::string& address, 
+            unsigned int protocol=0 ) ; 
+     Agent(const Agent& a);
+     ~Agent() ;
+ 
+     void operator=(const Agent& a);
+     void setName( const OCCI_STD_NAMESPACE::string& name );
+     OCCI_STD_NAMESPACE::string getName() const;
+     void setAddress( const OCCI_STD_NAMESPACE::string& addr );
+     OCCI_STD_NAMESPACE::string getAddress() const;
+     void setProtocol(unsigned int protocol = 0);
+     unsigned int getProtocol() const; 
+     void setNull(); 
+     bool isNull() const;
+     OCIAQAgent* getOCIAQAgent() const;
+
+   private:
+     Ptr<AgentImpl> ptr;
+     Agent( const Environment *env, OCIAQAgent *rhs, bool toFree = false );
+     friend class Listener;
+     friend class MessageImpl;
+};
+
+class Listener
+{
+   public:
+     Listener( const Connection *conn ); 
+     Listener( const Connection *conn, 
+               OCCI_STD_NAMESPACE::vector<Agent> &agList, 
+               int waitTime=0 );
+     ~Listener();
+     
+     Agent listen();
+     void setAgentList(OCCI_STD_NAMESPACE::vector<Agent> &agList);
+     void setTimeOutForListen(int waitTime);
+     OCCI_STD_NAMESPACE::vector<Agent> getAgentList() const;
+     int getTimeOutForListen() const; 
+
+   private:
+     const ConnectionImpl *conn; 
+     OCIAQAgent** agentList; 
+     unsigned int numAgents;
+     int timeOut;
+     void *listenerExt;
+};
+
+
+class Subscription
+{
+  public:
+    enum Presentation
+    {
+       PRES_DEFAULT = OCI_SUBSCR_PRES_DEFAULT,
+       PRES_XML = OCI_SUBSCR_PRES_XML
+    };
+    enum Protocol
+    {
+       PROTO_CBK = OCI_SUBSCR_PROTO_OCI,
+       PROTO_MAIL = OCI_SUBSCR_PROTO_MAIL,
+       PROTO_SERVER = OCI_SUBSCR_PROTO_SERVER,
+       PROTO_HTTP = OCI_SUBSCR_PROTO_HTTP
+    };
+    enum Namespace
+    {
+       NS_ANONYMOUS = OCI_SUBSCR_NAMESPACE_ANONYMOUS,
+       NS_AQ = OCI_SUBSCR_NAMESPACE_AQ
+    }; 
+    
+    Subscription(const Environment* env);
+    Subscription(const Environment* env, OCISubscription* sub);
+    Subscription(const Subscription& sub);
+    ~Subscription();
+    
+    void operator=(const Subscription& sub);
+    unsigned int getDatabaseServersCount() const;
+    void setDatabaseServerNames(
+        const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string>& dbsrv);
+    OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string>
+                      getDatabaseServerNames() const ;
+    void setNotifyCallback(unsigned int (*callback)(Subscription& sub, 
+                                                    NotifyResult *nr));
+    unsigned int  (*getNotifyCallback() const)(Subscription& sub, 
+                                               NotifyResult *nr); 
+    void setCallbackContext(void* ctx);
+    void* getCallbackContext() const;
+    void setSubscriptionName(const OCCI_STD_NAMESPACE::string& name);
+    OCCI_STD_NAMESPACE::string getSubscriptionName() const ;
+    void setSubscriptionNamespace(Namespace nameSpace);
+    Namespace getSubscriptionNamespace() const ;
+    void setPayload(const Bytes& payload);
+    Bytes getPayload() const ;
+    void setRecipientName( const OCCI_STD_NAMESPACE::string& name);
+    OCCI_STD_NAMESPACE::string getRecipientName() const;
+    void setPresentation( Presentation pres) ;
+    Presentation getPresentation() const ;
+    void setProtocol( Protocol prot) ;
+    Protocol getProtocol() const ;
+    OCISubscription* getOCISubscription() const;
+    void setNull();
+    bool isNull() const;
+    Environment* getEnvironment() const;
+
+  private:
+    Ptr<SubscriptionImpl> ptr;
+};
+
+class NotifyResult
+{
+   public:
+     Bytes getPayload() const;
+     Message getMessage() const;
+     Bytes getMessageId() const;
+     OCCI_STD_NAMESPACE::string getConsumerName() const;
+     OCCI_STD_NAMESPACE::string getQueueName() const;
+
+  private:
+     const EnvironmentImpl *env;
+     void *payload;
+     unsigned int payloadLen;
+     dvoid *desc;
+     ub4 mode;
+     void *notifyResultExt;
+
+     //private constructor
+     NotifyResult(const Environment *env, void *payload, ub4 payloadLen, 
+                  void *pdescriptor, ub4 mode);
+
+     friend class SubscriptionImpl;
+};
+      
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+} /* end of namespace aq */
+} /* end of namespace occi */
+} /* end of namespace oracle */
+
+#endif                                              /* OCCIAQ_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiCommon.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiCommon.h
new file mode 100644
index 0000000..91a796c
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiCommon.h
@@ -0,0 +1,872 @@
+/* Copyright (c) 2000, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     occiCommon.h - header file for doing forward references
+
+   DESCRIPTION 
+     Just declare all the classes
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+      descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   cparampa    09/03/03 - Added NotifyResult
+   rvallam     02/12/03 - modified BFloat/BDouble interface - BFloat/BDouble
+                          type is now a struct  
+   shiyer      01/02/03 - add setVector(vector<UString>,string schema/type)
+   rvallam     11/19/02 - added objects support for interval classes
+   cparampa    12/11/02 - removed declaration for Payload
+   srseshad    11/14/02 - Add OCCIIBFLOAT/OCCIIBDOUBLE
+   cparampa    10/17/02 - prototypes for getVectorOf BDouble and BFloat taking
+                          anydata.
+   cparampa    10/09/02 - Declarations for AQ classes
+   rvallam     10/12/02 - added new method for array pin - pinVectorOfRefs
+   rvallam     10/10/02 - objects performance enhancement - modified
+                          getObject and getVector<T *> to take the
+                          schName and typeName of the object
+   rvallam     10/11/02 - added native float/double API - get(set)vector
+                          methods, added the enum values for BFLOAT and
+                          BDOUBLE and typecodes for the same
+   shiyer      07/31/02 - 10iR1, OCCI Globalization support
+   cparampa    08/27/02 - Added forward reference for StatelessConnnectionPool
+                          and StatelessConnectionPoolImpl  
+   vvinay      06/25/02 - fix #2415021:const of string changed
+   aahluwal    06/03/02 - bug 2360115
+   gayyappa    12/27/01 - fix bug 2073482 - remove include <map> 
+   gayyappa    10/29/01 - removed CharSet - bug 1853748 
+   gayyappa    09/21/01 - #include <map>
+   rratnam     06/18/01 - fixed bug1777042 -- HP support for "std"
+   rvallam     06/11/01 - fixed NT porting problem with template functions-
+                          added generic method get(set)VectorOfRefs
+   rratnam     04/25/01 - fixed NT porting bug1673780
+   rvallam     04/12/01 - added dummy parameter in getVector of AnyData
+                          for PObject *
+   rratnam     04/10/01 - removed references to wstring
+   rvallam     04/02/01 - fixed linux porting bug 1654670
+   gayyappa    03/29/01 - remove get/set vector methods for int/float/double/
+                          unsigned int for anydata.
+   rvallam     03/20/01 - added dummy parameter for Type in getVector for
+                          void * in statement and ResultSet
+                          added setVector of Ref<T> and Number prototype
+                          for statement
+   gayyappa    03/15/01 - added parameter to getvector on anydata with void*.
+   rratnam     03/13/01 - added virtual destructor to RefCounted
+   rkasamse    03/15/01 - add an arg, Type, to getVector of void*
+   rratnam     03/06/01 - removed references() from RefCounted
+   slari       02/15/01 - suppress lint warnings
+   rratnam     02/12/01 - removed #include <iostream.h>
+   rvallam     02/07/01 - added enum OCCI_MAX_PREFETCH_DEPTH
+   gayyappa    01/15/01 - change ub4 to unsigned int for
+                          get/set vector methods..
+   gayyappa    01/03/01 - put "using namespace std" in a ifndef
+   gayyappa    12/14/00 - add forward declaration for ResultSetImpl 
+                          and StatementImpl.
+                          Remove commented #defines
+   gayyappa    11/17/00 - change Session to Connection
+   gayyappa    09/12/00 - remove OCCI_SQLT_INT, OCCI_SQLT_FLT 
+                          remove OCCIUNSIGNED_CHAR, OCCISHORT, 
+                          OCCIUNSIGNED_SHORT, OCCILONG ,OCCI_LONGDOUBLE,
+                          OCCI_UNSIGNEDLONG  from enum Type.
+   gayyappa    08/25/00 - add const to get/set vector mthds of anydata.
+   rvallam     08/10/00 - updated Type enum
+   slari       08/04/00 - add OCCIROWID and OCCICURSOR
+   rkasamse    08/04/00 - add setVector methods
+   slari       07/24/00 - add BytesImpl
+   rratnam     07/25/00 - Added forward declarations for LobStreamImpl,
+                          ConnectionPool[Impl], removed those for
+                          Connection[Impl]
+   rkasamse    07/28/00 - add getVector(ResultSet*...) methods
+   rratnam     06/14/00 - Added forward declaration for RefImpl,
+                          added DefaultCharSet to the CharSet 
+                          enum
+   rratnam     06/13/00 - Added DefaultCharSet to the CharSet enum
+   kmohan      05/31/00 - RefCounted no more templated
+   rratnam     22/05/00 - Added forward declaration of ConnectionImpl, and the
+                         LobOpenMode enum
+   kmohan      05/05/00 - Added global routine prototypes
+   rkasamse    05/23/00 -
+   slari       04/28/00 - add forward declaration of SQLExceptionImpl
+   kmohan      04/19/00 - Added enums Type,CharSet,CharSetForm
+   gayyappa    04/18/00 - removed checkStatus. added checkOCICall and 
+                          createSQLEXception functions 
+   kmohan      04/11/00 - Creation
+
+*/
+
+
+#ifndef OCCICOMMON_ORACLE
+# define OCCICOMMON_ORACLE
+
+#ifndef _olint
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORASTRINGSTL
+#define ORASTRINGSTL
+#include <string>
+#endif
+
+#ifndef ORAVECTORSTL
+#include <vector>
+#define ORAVECTORSTL
+#endif
+
+#ifndef ORALISTSTL
+#include <list>
+#define ORALISTSTL
+#endif
+
+#define OCCI_STD_NAMESPACE std
+#define OCCI_HAVE_STD_NAMESPACE 1
+
+namespace oracle {
+namespace occi {
+
+//UString is the class for UTF16 characterset
+typedef OCCI_STD_NAMESPACE::basic_string<utext> UString;
+
+class Environment;
+class EnvironmentImpl;
+class Connection;
+class ConnectionImpl;
+class ConnectionPool;
+class ConnectionPoolImpl;
+class StatelessConnectionPool;
+class StatelessConnectionPoolImpl;
+class Statement;
+class StatementImpl;
+class ResultSet;
+class ResultSetImpl;
+class SQLException;
+class SQLExceptionImpl;
+class Stream;
+class PObject;
+class Number;
+class Bytes;
+class BytesImpl;
+class Date;
+class Timestamp;
+
+class MetaData;
+class MetaDataImpl;
+template <class T> class Ref;
+class RefImpl;
+class RefAny;
+class Blob;
+class Bfile;
+class Clob;
+class LobStreamImpl;
+class AnyData;
+class AnyDataImpl;
+class Map;
+class IntervalDS;
+class IntervalYM;
+
+namespace aq {
+class Message;
+class MessageImpl;
+class Agent;
+class AgentImpl;
+class Producer;
+class ProducerImpl;
+class Consumer;
+class ConsumerImpl;
+class Listener;
+class Subscription;
+class SubscriptionImpl;
+class NotifyResult;
+}
+
+typedef struct BFloat BFloat;
+typedef struct BDouble BDouble;
+
+/*---------------------------------------------------------------------------
+                           ENUMERATORS
+  ---------------------------------------------------------------------------*/
+enum Type
+{
+ OCCI_SQLT_CHR=SQLT_CHR,
+ OCCI_SQLT_NUM=SQLT_NUM,
+ OCCIINT = SQLT_INT,
+ OCCIFLOAT = SQLT_FLT,
+ OCCIBFLOAT = SQLT_BFLOAT,
+ OCCIBDOUBLE = SQLT_BDOUBLE,
+ OCCIIBFLOAT = SQLT_IBFLOAT,
+ OCCIIBDOUBLE = SQLT_IBDOUBLE,
+ OCCI_SQLT_STR=SQLT_STR,
+ OCCI_SQLT_VNU=SQLT_VNU,
+ OCCI_SQLT_PDN=SQLT_PDN,
+ OCCI_SQLT_LNG=SQLT_LNG,
+ OCCI_SQLT_VCS=SQLT_VCS,
+ OCCI_SQLT_NON=SQLT_NON,
+ OCCI_SQLT_RID=SQLT_RID,
+ OCCI_SQLT_DAT=SQLT_DAT,
+ OCCI_SQLT_VBI=SQLT_VBI,
+ OCCI_SQLT_BIN=SQLT_BIN,
+ OCCI_SQLT_LBI=SQLT_LBI,
+ OCCIUNSIGNED_INT = SQLT_UIN,
+ OCCI_SQLT_SLS=SQLT_SLS,
+ OCCI_SQLT_LVC=SQLT_LVC,
+ OCCI_SQLT_LVB=SQLT_LVB,
+ OCCI_SQLT_AFC=SQLT_AFC,
+ OCCI_SQLT_AVC=SQLT_AVC,
+ OCCI_SQLT_CUR=SQLT_CUR,
+ OCCI_SQLT_RDD=SQLT_RDD,
+ OCCI_SQLT_LAB=SQLT_LAB,
+ OCCI_SQLT_OSL=SQLT_OSL,
+ OCCI_SQLT_NTY=SQLT_NTY,
+ OCCI_SQLT_REF=SQLT_REF,
+ OCCI_SQLT_CLOB=SQLT_CLOB,
+ OCCI_SQLT_BLOB=SQLT_BLOB,
+ OCCI_SQLT_BFILEE=SQLT_BFILEE,
+ OCCI_SQLT_CFILEE=SQLT_CFILEE,
+ OCCI_SQLT_RSET=SQLT_RSET,
+ OCCI_SQLT_NCO=SQLT_NCO,
+ OCCI_SQLT_VST=SQLT_VST,
+ OCCI_SQLT_ODT=SQLT_ODT,
+ OCCI_SQLT_DATE=SQLT_DATE,
+ OCCI_SQLT_TIME=SQLT_TIME,
+ OCCI_SQLT_TIME_TZ=SQLT_TIME_TZ,
+ OCCI_SQLT_TIMESTAMP=SQLT_TIMESTAMP,
+ OCCI_SQLT_TIMESTAMP_TZ=SQLT_TIMESTAMP_TZ,
+ OCCI_SQLT_INTERVAL_YM=SQLT_INTERVAL_YM,
+ OCCI_SQLT_INTERVAL_DS=SQLT_INTERVAL_DS,
+ OCCI_SQLT_TIMESTAMP_LTZ=SQLT_TIMESTAMP_LTZ,
+ OCCI_SQLT_FILE=SQLT_FILE,
+ OCCI_SQLT_CFILE=SQLT_CFILE,
+ OCCI_SQLT_BFILE=SQLT_BFILE,
+ 
+ OCCICHAR = 32 *1024,
+ OCCIDOUBLE,
+ OCCIBOOL,
+ OCCIANYDATA ,
+ OCCINUMBER,
+ OCCIBLOB,
+ OCCIBFILE,
+ OCCIBYTES,
+ OCCICLOB ,
+ OCCIVECTOR,
+ OCCIMETADATA,
+ OCCIPOBJECT,
+ OCCIREF ,
+ OCCIREFANY,
+ OCCISTRING  ,
+ OCCISTREAM  ,
+ OCCIDATE  ,
+ OCCIINTERVALDS  ,
+ OCCIINTERVALYM  ,
+ OCCITIMESTAMP,
+ OCCIROWID,
+ OCCICURSOR
+
+
+};
+
+enum LockOptions {OCCI_LOCK_NONE = OCI_LOCK_NONE,
+                      OCCI_LOCK_X = OCI_LOCK_X, 
+                      OCCI_LOCK_X_NOWAIT = OCI_LOCK_X_NOWAIT
+                     };
+
+enum {OCCI_MAX_PREFETCH_DEPTH = UB4MAXVAL};
+
+enum TypeCode
+{
+
+OCCI_TYPECODE_REF = OCI_TYPECODE_REF,
+OCCI_TYPECODE_DATE = OCI_TYPECODE_DATE,
+OCCI_TYPECODE_REAL = OCI_TYPECODE_REAL,
+OCCI_TYPECODE_DOUBLE = OCI_TYPECODE_DOUBLE,
+OCCI_TYPECODE_BDOUBLE = OCI_TYPECODE_BDOUBLE,
+OCCI_TYPECODE_FLOAT = OCI_TYPECODE_FLOAT,
+OCCI_TYPECODE_BFLOAT = OCI_TYPECODE_BFLOAT,
+OCCI_TYPECODE_NUMBER = OCI_TYPECODE_NUMBER,
+OCCI_TYPECODE_DECIMAL = OCI_TYPECODE_DECIMAL,
+OCCI_TYPECODE_OCTET = OCI_TYPECODE_OCTET,
+OCCI_TYPECODE_INTEGER = OCI_TYPECODE_INTEGER,
+OCCI_TYPECODE_SMALLINT= OCI_TYPECODE_SMALLINT,
+OCCI_TYPECODE_RAW = OCI_TYPECODE_RAW,
+OCCI_TYPECODE_VARCHAR2 = OCI_TYPECODE_VARCHAR2,
+OCCI_TYPECODE_VARCHAR = OCI_TYPECODE_VARCHAR,
+OCCI_TYPECODE_CHAR = OCI_TYPECODE_CHAR,
+OCCI_TYPECODE_VARRAY= OCI_TYPECODE_VARRAY,
+OCCI_TYPECODE_TABLE = OCI_TYPECODE_TABLE,
+OCCI_TYPECODE_CLOB = OCI_TYPECODE_CLOB,
+OCCI_TYPECODE_BLOB = OCI_TYPECODE_BLOB,
+OCCI_TYPECODE_BFILE = OCI_TYPECODE_BFILE,
+OCCI_TYPECODE_OBJECT = OCI_TYPECODE_OBJECT,
+OCCI_TYPECODE_NAMEDCOLLECTION = OCI_TYPECODE_NAMEDCOLLECTION
+};
+
+enum CharSetForm
+{
+  OCCI_SQLCS_IMPLICIT = SQLCS_IMPLICIT // use local db char set
+ ,OCCI_SQLCS_NCHAR = SQLCS_NCHAR // use local db nchar set
+ ,OCCI_SQLCS_EXPLICIT = SQLCS_EXPLICIT // char set explicitly specified
+ ,OCCI_SQLCS_FLEXIBLE = SQLCS_FLEXIBLE // pl/sql flexible parameter
+};
+
+enum LobOpenMode
+{ OCCI_LOB_READONLY = OCI_LOB_READONLY
+ ,OCCI_LOB_READWRITE = OCI_LOB_READWRITE
+};
+
+class RefCounted {
+public:
+    RefCounted();
+    virtual ~RefCounted(){} 
+    const RefCounted * newRef() const;
+    void deleteRef() const;
+
+private:
+
+    void onZeroReferences();
+    unsigned long references_;
+  };
+
+template <class T> 
+class ConstPtr
+{
+
+public:
+
+ConstPtr( const T* ptr = 0 );
+ConstPtr( const ConstPtr<T>& mp );
+~ConstPtr();
+const T * operator->() const;
+const T* rawPtr() const;
+
+#ifdef MEMBER_TEMPLATE
+template<class OtherType> operator ConstPtr<OtherType>();
+#endif
+
+protected:
+
+void operator=( const ConstPtr<T>& mp );
+const T* rawPtr_;
+
+};
+
+template <class T>
+class Ptr : public ConstPtr<T> {
+
+public:
+
+Ptr( T* ptr = 0 );
+Ptr( const Ptr<T>& mp );
+void operator=( const Ptr<T>& mp );
+const T * operator->() const;
+T * operator->();
+T* rawPtr() ;
+const T* rawPtr() const;
+
+
+
+#ifdef MEMBER_TEMPLATE
+  template<class OtherType>
+  operator Ptr<OtherType>();
+#endif
+
+};
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+  void getVector(const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect);
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<UString> &vect);
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<BFloat> &vect);
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<BDouble> &vect);
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void getVector( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void getVector( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  template <class T>
+  void getVectorOfRefs( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #ifndef WIN32COMMON
+  template <class T>
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #endif
+  #ifdef WIN32COMMON
+  template <class T>
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<T> &vect,
+  void *(*rSQL)(void *));
+  #else
+  template <class T>
+  void getVector(const AnyData &any,
+  OCCI_STD_NAMESPACE::vector<T *> &vect,
+  void *(*rSQL)(void *));
+  #endif
+
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<UString> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<BFloat> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<BDouble> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  template <class T>
+  void setVectorOfRefs( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #ifndef WIN32COMMON
+  template <class T>
+  void setVector( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) ;
+  #endif
+  #ifdef WIN32COMMON
+  template <class T>
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector< T > &vect) ;
+  #else
+  template <class T>
+  void setVector( AnyData &any,
+  const OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+  #endif
+
+  void getVector( ResultSet *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<int> &vect) ;
+  void getVector( ResultSet *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+  void getVector( ResultSet *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<UString> &vect) ;//UTF16 support
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<unsigned int> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<float> &vect); 
+  void getVector(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BFloat> &vect);
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<double> &vect);
+  void getVector(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BDouble> &vect);
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void getVector(ResultSet  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  template <class T>
+  void getVectorOfRefs(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #ifndef WIN32COMMON
+  template <class T>
+  void getVector(ResultSet  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #endif
+  #ifdef WIN32COMMON
+  template <class T>
+  void getVector( ResultSet *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T > &vect) ;
+  #else
+  template <class T>
+  void getVector( ResultSet *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+  #endif
+
+
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Bfile> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+  void getVector( Statement *rs, unsigned int index, 
+  OCCI_STD_NAMESPACE::vector<int> &vect) ;
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect) ;
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<UString> &vect) ;//UTF16 support
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<unsigned int> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<float> &vect) ;
+  void getVector(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BFloat> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<double> &vect) ;
+  void getVector(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<BDouble> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  void getVector(Statement  *rs, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+  template <class T>
+  void getVectorOfRefs(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #ifndef WIN32COMMON
+  template <class T>
+  void getVector(Statement  *rs, unsigned int,
+  OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) ;
+  #endif
+  #ifdef WIN32COMMON
+  template <class T>
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T > &vect) ;
+  #else
+  template <class T>
+  void getVector( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector< T* > &vect) ;
+  #endif
+
+
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<unsigned int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<double> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<float> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<Number> &vect,
+                 const OCCI_STD_NAMESPACE::string &sqltype);
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+         const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect,
+         const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<RefAny> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Blob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Clob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Bfile> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Date> &vect, 
+                 const OCCI_STD_NAMESPACE::string &sqltype) ;
+  template  <class T>
+  void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  #ifndef WIN32COMMON
+  template  <class T>
+  void setVector(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  #endif
+  #ifdef WIN32COMMON
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex, 
+                  const OCCI_STD_NAMESPACE::vector< T > &vect, 
+                  const OCCI_STD_NAMESPACE::string   &sqltype) ;
+  #else
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex,
+                  const OCCI_STD_NAMESPACE::vector<T* > &vect, 
+                  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  #endif
+
+/* -----------------------------------------------------------------------------------
+   Statement setVector functions, schema & type separate arguments - multibyte support
+   -----------------------------------------------------------------------------------
+*/
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<unsigned int> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<double> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<float> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<Number> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName);
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+         const OCCI_STD_NAMESPACE::vector<OCCI_STD_NAMESPACE::string> &vect,
+         const OCCI_STD_NAMESPACE::string &schemaName,
+         const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<RefAny> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Blob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Clob> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Bfile> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Date> &vect, 
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  template  <class T>
+  void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+
+  #ifndef WIN32COMMON
+  template  <class T>
+  void setVector(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+  #endif
+
+  #ifdef WIN32COMMON
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex, 
+                  const OCCI_STD_NAMESPACE::vector< T > &vect, 
+                  const OCCI_STD_NAMESPACE::string &schemaName,
+                  const OCCI_STD_NAMESPACE::string &typeName) ;
+  #else
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<T* > &vect, const OCCI_STD_NAMESPACE::string
+  &schemaName, const OCCI_STD_NAMESPACE::string &typeName) ;
+  #endif
+
+/*-------------------------------------------------------------------------
+  Statement setVector function - UTF16 support
+  -------------------------------------------------------------------------
+*/
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<int> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<unsigned int> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<double> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BDouble> &vect,
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<float> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<BFloat> &vect,
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex,
+                 const OCCI_STD_NAMESPACE::vector<Number> &vect,
+                 const UString &schemaName,
+                 const UString &typeName);
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<UString> &vect,
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<UString> &vect,
+                 const OCCI_STD_NAMESPACE::string &schemaName,
+                 const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<RefAny> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Blob> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Clob> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Bfile> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  void setVector(Statement *stmt, unsigned int paramIndex, 
+                 const OCCI_STD_NAMESPACE::vector<Date> &vect, 
+                 const UString &schemaName,
+                 const UString &typeName) ;
+  template  <class T>
+  void setVectorOfRefs(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const UString &schemaName,
+  const UString &typeName) ;
+
+  #ifndef WIN32COMMON
+  template  <class T>
+  void setVector(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+  const UString &schemaName,
+  const UString &typeName) ;
+  #endif
+
+  #ifdef WIN32COMMON
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex, 
+                  const OCCI_STD_NAMESPACE::vector< T > &vect, 
+                  const UString &schemaName,
+                  const UString &typeName) ;
+  #else
+  template <class T>
+  void setVector( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<T* > &vect, const UString
+  &schemaName, const UString &typeName) ;
+  #endif
+
+
+/* Global method for array pins */
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+OCCI_STD_NAMESPACE::vector<T* > &vectObj, 
+LockOptions lockOpt = OCCI_LOCK_NONE );
+
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+LockOptions lockOpt = OCCI_LOCK_NONE );
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif /* _olint */
+
+#endif                                              /* OCCICOMMON_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiControl.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiControl.h
new file mode 100644
index 0000000..aaeee82
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiControl.h
@@ -0,0 +1,2060 @@
+/* Copyright  Oracle Corporation 2000, 2001. All Rights Reserved. */ 
+ 
+/* 
+   NAME 
+     occiControl.h - header file for OCCI control classes
+
+   DESCRIPTION 
+     Class definitions for MetaData,SQLException,Environment,
+     Connection,Statement, ConnectionPool, StatelessConnectionPool
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+     descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   rvadraha    09/30/03 - New Binary/CharacterStreamMode for Statement class
+   rvallam     02/12/03 - modify BFloat/BDouble interface to use the new 
+                          BFloat/BDouble type 
+   shiyer      01/21/03 - add getPoolNameUString to ConnectionPool
+   shiyer      12/19/02 - Add cache sorted flush get/set to Environment
+   shiyer      12/31/02 - added OCI_ATTR_CHAR_SIZE to typeattr attrs
+   shiyer      12/09/02 - ensure new virtual interfaces are in order
+   cparampa    10/12/02 - AQ Additions
+   rvallam     10/12/02 - added  new methods for array pin 
+   shiyer      10/09/02 - Statement caching, Stateless Connection
+                          Pooling - UTF16 support. Added NLS versions
+                          of getErrorMessage in SQLException
+   rvallam     10/11/02 - added native float/double API - get(set) methods
+                          for Statement and ResultSet class
+   cparampa    09/23/02 - added methods for statement caching
+   shiyer      10/01/02 - setVector versions for Windows
+   shiyer      07/31/02 - 10iR1, OCCI Globalization support
+   cparampa    09/23/02 - added methods for statement caching 
+   praghuna    09/23/02 - 2333038:Fwd merge to 10i/MAIN 
+   cparampa    08/26/02 - added class StatelessConnectionPool
+                          added create/terminateStatelessConnnectionPool in Env 
+   vvinay      08/06/02 - XA additions
+   vvinay      06/25/02 - fix #2415021: math moved to occiHeapAlloc.h
+   aahluwal    06/04/02 - bug 2360115
+   vvinay      02/21/02 - operator= added for SQLException
+   gayyappa    12/27/01 - add set/getDatabaseNCharParam 
+   gayyappa    11/22/01 - modify interface to use strings for CharSet
+   gayyappa    10/01/01 - call reserve() on vector in set/getVector 
+   rkasamse    07/30/01 - 
+   rkasamse    07/26/01 - add env handle attrs - cache max/opt size
+   rvallam     07/23/01 - bug 1891228 - added throw() in destructor
+                          of SQLException
+   rvallam     06/14/01 - replace call to get(set)VectorOfRefs in 
+                          get(set)Vector for Ref<T> with code in 
+                          get(set)VectorOfRefs
+   rvallam     11/06/01 - renamed internal methods in get/setVector to
+                          get(set)VectorOfPObjects/get(set)VectorOfOCIRefs
+                          as part of NT porting fix
+                          added destructors to SQLException and MetaData
+   rvallam     05/03/01 - added const to the vector parameter in setVector
+                          of Statement for Ref<T>
+   rratnam     04/10/01 - removed references to wstring
+   kmohan      04/04/01 - include math.h for WIN32COMMON
+   rvallam     04/02/01 - fixed linux porting bug 1654670
+   gayyappa    03/27/01 - add code for templated getVector on stmt for objects.
+   rvallam     03/20/01 - passed dummy parameter for Type in getVector for
+                          void * in statement and ResultSet
+   rratnam     03/15/01 - fixed set and getRef / get and setVector for NULL 
+                          Refs
+   rkasamse    03/19/01 - 1676579: HP compilation errors
+   rratnam     03/07/01 - derived SQLException from exception, added what()
+   chliang     03/05/01 - disable olint
+   rvallam     02/23/01 - made getReadSQL/getWriteSQL methods const
+   rratnam     01/29/01 - add closeStream() to Statement/ResultSet 
+   rvallam     01/30/01 - added private method getListType() to
+                          MetaData
+   rratnam     01/03/01 - removed preTruncationLength() and isTruncated(),
+                          added setBinary/CharacterStreamMode()
+   rratnam     01/03/01 - added new method setErrorOnBusy in ConnectionPool 
+   rratnam     12/29/00 - added a createProxyConnection without roles
+   gayyappa    12/14/00 - add virtual functions getStatement/getConnection
+                          to resultset and statement (fix bug# 1529888)
+   gayyappa    12/13/00 - remove setErrorOnTruncate from Statement/resultset.
+   rvallam     11/30/00 - removed #define NEVER
+   gayyappa    11/17/00 - split get method in Map to getReadSQL
+                          and getWriteSQL    
+   rvallam     10/20/00 - modify cacheflush() to flushCache()
+                          added enums to MetaData
+   rvallam     09/14/00 - uncomment result set getMetaData method
+                          rename it to getColumnListMetaData.
+                          add get/set interval methods to stmt.
+                          add getinterval methods to resultset.
+   gayyappa    08/30/00 - added virtual destructor to occiconnection.
+                          add default values to registerOutParam in
+                          occistatement.
+                          removed get/set vector and anydata in statement.
+                          removed Stream header in ifdef directive.
+   rvallam     08/10/00 - uncomment gets(), update occiConnection, update
+                          Stream
+   slari       08/06/00 - add statement stream methods
+   slari       08/04/00 - add Statement::getXXX methods
+   slari       08/02/00 - add Stream
+   rratnam     08/04/00 - put in connection-cloning, proxy connections
+   rvallam     08/04/00 - changed metadata header - method signatures
+   rkasamse    08/04/00 - add setObject,setRef methods on Statement
+   slari       07/27/00 - add Statement::setNull
+   slari       07/26/00 - disable getBytes
+   slari       07/25/00 - enable getBytes and getRowid
+   rratnam     07/25/00 - Conn Pooling changes - added ConnectionPool,
+                          Connection, removed Session
+                          modified Environment (made getOCIEnvironment(),
+                          getMap() and getMode() const,
+                          added create/terminateConnectionPool(),
+                          added userName and password to createConnection() )
+   rkasamse    07/26/00 - uncomment getObject methods
+   slari       07/10/00 - enable getString
+   slari       07/05/00 - add result set methods
+   rkasamse    07/17/00 - add get function to Map
+   rratnam     06/16/00 - updated Session::getMetaData() to take the
+                          parameter type
+   rvallam     06/13/00 - updated MetaData
+   rratnam     06/13/00 - added getRef() to Statement
+                           and ResultSet,
+                           made getOCIError(), getOCIEnvironment()
+                           and getOCIServiceContext() in
+                           Connection const
+   kmohan      05/31/00 - Datamember Session * changed to 
+                          SessionImpl *
+                          in the class MetaData
+                          change ORASTRINGSTL to ORASTRING
+   slari       05/26/00 - change ORAVECTOR to ORAVECTORSTL
+   slari       05/22/00 - add initial Statement class methods
+   slari       05/10/00 - enable Connection and Session methods
+   slari       04/21/00 - provide trivial implementation for 
+                          ~Connection
+   slari       04/17/00 - make Environment methods abstract
+   slari       04/13/00 - add Environment
+   gayyappa    04/18/00 - changed defn of SQLException
+   kmohan      04/11/00 - added class definitions
+   rkasamse    04/03/00 - header (interface) files for OCCI 
+                          control classes.
+   rkasamse    04/03/00 - Creation
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCICONTROL_ORACLE
+# define OCCICONTROL_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef ORAEXCEPTION
+#define ORAEXCEPTION
+#include <exception>
+#endif
+
+namespace oracle {
+namespace occi {
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+class MetaData
+{
+  public :
+    
+      enum AttrId 
+      {ATTR_PTYPE = OCI_ATTR_PTYPE,
+      ATTR_TIMESTAMP = OCI_ATTR_TIMESTAMP, 
+      ATTR_OBJ_ID = OCI_ATTR_OBJ_ID,
+      ATTR_OBJ_NAME = OCI_ATTR_OBJ_NAME, 
+      ATTR_OBJ_SCHEMA = OCI_ATTR_OBJ_SCHEMA,
+      ATTR_OBJID = OCI_ATTR_OBJID,
+      ATTR_NUM_COLS = OCI_ATTR_NUM_COLS,
+      ATTR_LIST_COLUMNS = OCI_ATTR_LIST_COLUMNS,
+      ATTR_REF_TDO = OCI_ATTR_REF_TDO,
+      ATTR_IS_TEMPORARY = OCI_ATTR_IS_TEMPORARY,
+      ATTR_IS_TYPED = OCI_ATTR_IS_TYPED,
+      ATTR_DURATION = OCI_ATTR_DURATION,
+      ATTR_COLLECTION_ELEMENT = OCI_ATTR_COLLECTION_ELEMENT,
+      ATTR_RDBA = OCI_ATTR_RDBA,
+      ATTR_TABLESPACE = OCI_ATTR_TABLESPACE,
+      ATTR_CLUSTERED = OCI_ATTR_CLUSTERED,
+      ATTR_PARTITIONED = OCI_ATTR_PARTITIONED,
+      ATTR_INDEX_ONLY = OCI_ATTR_INDEX_ONLY,
+      ATTR_LIST_ARGUMENTS = OCI_ATTR_LIST_ARGUMENTS,
+      ATTR_IS_INVOKER_RIGHTS = OCI_ATTR_IS_INVOKER_RIGHTS,
+      ATTR_LIST_SUBPROGRAMS = OCI_ATTR_LIST_SUBPROGRAMS,
+      ATTR_NAME = OCI_ATTR_NAME,
+      ATTR_OVERLOAD_ID = OCI_ATTR_OVERLOAD_ID,
+      ATTR_TYPECODE = OCI_ATTR_TYPECODE,
+      ATTR_COLLECTION_TYPECODE = OCI_ATTR_COLLECTION_TYPECODE,
+      ATTR_VERSION = OCI_ATTR_VERSION,
+      ATTR_IS_INCOMPLETE_TYPE = OCI_ATTR_IS_INCOMPLETE_TYPE,
+      ATTR_IS_SYSTEM_TYPE = OCI_ATTR_IS_SYSTEM_TYPE,
+      ATTR_IS_PREDEFINED_TYPE = OCI_ATTR_IS_PREDEFINED_TYPE,
+      ATTR_IS_TRANSIENT_TYPE = OCI_ATTR_IS_TRANSIENT_TYPE,
+      ATTR_IS_SYSTEM_GENERATED_TYPE = 
+              OCI_ATTR_IS_SYSTEM_GENERATED_TYPE,
+      ATTR_HAS_NESTED_TABLE = OCI_ATTR_HAS_NESTED_TABLE,
+      ATTR_HAS_LOB = OCI_ATTR_HAS_LOB,
+      ATTR_HAS_FILE = OCI_ATTR_HAS_FILE,
+      ATTR_NUM_TYPE_ATTRS = OCI_ATTR_NUM_TYPE_ATTRS,
+      ATTR_LIST_TYPE_ATTRS = OCI_ATTR_LIST_TYPE_ATTRS,
+      ATTR_NUM_TYPE_METHODS = OCI_ATTR_NUM_TYPE_METHODS, 
+      ATTR_LIST_TYPE_METHODS = OCI_ATTR_LIST_TYPE_METHODS,
+      ATTR_MAP_METHOD = OCI_ATTR_MAP_METHOD,
+      ATTR_ORDER_METHOD = OCI_ATTR_ORDER_METHOD,
+      ATTR_DATA_SIZE = OCI_ATTR_DATA_SIZE,
+      ATTR_DATA_TYPE = OCI_ATTR_DATA_TYPE,
+      ATTR_PRECISION = OCI_ATTR_PRECISION,
+      ATTR_SCALE = OCI_ATTR_SCALE,
+      ATTR_TYPE_NAME = OCI_ATTR_TYPE_NAME,
+      ATTR_SCHEMA_NAME = OCI_ATTR_SCHEMA_NAME,
+      ATTR_CHARSET_ID = OCI_ATTR_CHARSET_ID,
+      ATTR_CHARSET_FORM = OCI_ATTR_CHARSET_FORM,
+      ATTR_ENCAPSULATION = OCI_ATTR_ENCAPSULATION,
+      ATTR_IS_CONSTRUCTOR = OCI_ATTR_IS_CONSTRUCTOR,
+      ATTR_IS_DESTRUCTOR = OCI_ATTR_IS_DESTRUCTOR,
+      ATTR_IS_OPERATOR = OCI_ATTR_IS_OPERATOR,
+      ATTR_IS_SELFISH = OCI_ATTR_IS_SELFISH,
+      ATTR_IS_MAP = OCI_ATTR_IS_MAP,
+      ATTR_IS_ORDER = OCI_ATTR_IS_ORDER,
+      ATTR_IS_RNDS = OCI_ATTR_IS_RNDS,
+      ATTR_IS_RNPS = OCI_ATTR_IS_RNPS,
+      ATTR_IS_WNDS = OCI_ATTR_IS_WNDS,
+      ATTR_IS_WNPS = OCI_ATTR_IS_WNPS,
+      ATTR_NUM_ELEMS = OCI_ATTR_NUM_ELEMS,
+      ATTR_LINK = OCI_ATTR_LINK,
+      ATTR_MIN = OCI_ATTR_MIN,
+      ATTR_MAX = OCI_ATTR_MAX,
+      ATTR_INCR = OCI_ATTR_INCR,
+      ATTR_CACHE = OCI_ATTR_CACHE,
+      ATTR_ORDER = OCI_ATTR_ORDER,
+      ATTR_HW_MARK  = OCI_ATTR_HW_MARK,
+      ATTR_IS_NULL = OCI_ATTR_IS_NULL,
+      ATTR_POSITION = OCI_ATTR_POSITION,
+      ATTR_HAS_DEFAULT =  OCI_ATTR_HAS_DEFAULT,
+      ATTR_LEVEL = OCI_ATTR_LEVEL,
+      ATTR_IOMODE = OCI_ATTR_IOMODE,
+      ATTR_RADIX = OCI_ATTR_RADIX,
+      ATTR_SUB_NAME = OCI_ATTR_SUB_NAME,
+      ATTR_LIST_OBJECTS = OCI_ATTR_LIST_OBJECTS,
+      ATTR_NCHARSET_ID = OCI_ATTR_NCHARSET_ID,
+      ATTR_LIST_SCHEMAS = OCI_ATTR_LIST_SCHEMAS,
+      ATTR_MAX_PROC_LEN = OCI_ATTR_MAX_PROC_LEN,
+      ATTR_MAX_COLUMN_LEN = OCI_ATTR_MAX_COLUMN_LEN,
+      ATTR_CURSOR_COMMIT_BEHAVIOR = 
+          OCI_ATTR_CURSOR_COMMIT_BEHAVIOR,
+      ATTR_MAX_CATALOG_NAMELEN = OCI_ATTR_MAX_CATALOG_NAMELEN,
+      ATTR_CATALOG_LOCATION = OCI_ATTR_CATALOG_LOCATION,
+      ATTR_SAVEPOINT_SUPPORT =  OCI_ATTR_SAVEPOINT_SUPPORT,
+      ATTR_NOWAIT_SUPPORT =  OCI_ATTR_NOWAIT_SUPPORT,
+      ATTR_AUTOCOMMIT_DDL =  OCI_ATTR_AUTOCOMMIT_DDL,
+      ATTR_LOCKING_MODE =  OCI_ATTR_LOCKING_MODE,
+      ATTR_IS_FINAL_TYPE = OCI_ATTR_IS_FINAL_TYPE,
+      ATTR_IS_INSTANTIABLE_TYPE = OCI_ATTR_IS_INSTANTIABLE_TYPE,
+      ATTR_IS_SUBTYPE = OCI_ATTR_IS_SUBTYPE,
+      ATTR_SUPERTYPE_SCHEMA_NAME = OCI_ATTR_SUPERTYPE_SCHEMA_NAME,
+      ATTR_SUPERTYPE_NAME = OCI_ATTR_SUPERTYPE_NAME,
+      ATTR_FSPRECISION = OCI_ATTR_FSPRECISION,
+      ATTR_LFPRECISION = OCI_ATTR_LFPRECISION,
+      ATTR_IS_FINAL_METHOD = OCI_ATTR_IS_FINAL_METHOD,
+      ATTR_IS_INSTANTIABLE_METHOD = OCI_ATTR_IS_INSTANTIABLE_METHOD,
+      ATTR_IS_OVERRIDING_METHOD = OCI_ATTR_IS_OVERRIDING_METHOD,
+      ATTR_CHAR_USED = OCI_ATTR_CHAR_USED,
+      ATTR_CHAR_SIZE = OCI_ATTR_CHAR_SIZE
+     };
+
+     enum ParamType
+         { 
+           PTYPE_TABLE = OCI_PTYPE_TABLE
+          ,PTYPE_VIEW = OCI_PTYPE_VIEW
+          ,PTYPE_PROC = OCI_PTYPE_PROC
+          ,PTYPE_FUNC = OCI_PTYPE_FUNC
+          ,PTYPE_PKG = OCI_PTYPE_PKG
+          ,PTYPE_TYPE = OCI_PTYPE_TYPE
+          ,PTYPE_TYPE_ATTR = OCI_PTYPE_TYPE_ATTR
+          ,PTYPE_TYPE_COLL = OCI_PTYPE_TYPE_COLL
+          ,PTYPE_TYPE_METHOD = OCI_PTYPE_TYPE_METHOD
+          ,PTYPE_SYN = OCI_PTYPE_SYN
+          ,PTYPE_SEQ = OCI_PTYPE_SEQ
+          ,PTYPE_COL = OCI_PTYPE_COL
+          ,PTYPE_ARG = OCI_PTYPE_ARG
+          ,PTYPE_TYPE_ARG = OCI_PTYPE_TYPE_ARG
+          ,PTYPE_TYPE_RESULT = OCI_PTYPE_TYPE_RESULT
+          ,PTYPE_SCHEMA = OCI_PTYPE_SCHEMA
+          ,PTYPE_DATABASE = OCI_PTYPE_DATABASE
+          ,PTYPE_UNK = OCI_PTYPE_UNK
+         };
+
+
+     enum { DURATION_SESSION = OCI_DURATION_SESSION
+          ,DURATION_TRANS = OCI_DURATION_TRANS
+          ,DURATION_NULL = OCI_DURATION_NULL
+          ,TYPEENCAP_PRIVATE = OCI_TYPEENCAP_PRIVATE
+          ,TYPEENCAP_PUBLIC = OCI_TYPEENCAP_PUBLIC
+          ,TYPEPARAM_IN = OCI_TYPEPARAM_IN
+          ,TYPEPARAM_OUT = OCI_TYPEPARAM_OUT
+          ,TYPEPARAM_INOUT = OCI_TYPEPARAM_INOUT
+          ,CURSOR_OPEN = OCI_CURSOR_OPEN
+          ,CURSOR_CLOSED = OCI_CURSOR_CLOSED
+          ,CL_START = OCI_CL_START
+          ,CL_END = OCI_CL_END
+          ,SP_SUPPORTED = OCI_SP_SUPPORTED
+          ,SP_UNSUPPORTED = OCI_SP_UNSUPPORTED
+          ,NW_SUPPORTED = OCI_NW_SUPPORTED
+          ,NW_UNSUPPORTED = OCI_NW_UNSUPPORTED
+          ,AC_DDL = OCI_AC_DDL
+          ,NO_AC_DDL = OCI_NO_AC_DDL
+          ,LOCK_IMMEDIATE = OCI_LOCK_IMMEDIATE
+          ,LOCK_DELAYED = OCI_LOCK_DELAYED  
+         }; 
+
+      MetaData(const MetaData &omd);
+      unsigned int getAttributeCount() const 
+      ;
+      AttrId getAttributeId(unsigned int attributenum) const 
+      ;
+      Type getAttributeType(unsigned int attributenum) const 
+      ;
+      int getInt(MetaData::AttrId attrid) const 
+      ;
+      bool getBoolean(MetaData::AttrId attrid) const 
+      ;
+      unsigned int getUInt(MetaData::AttrId attrid) const 
+      ;
+      OCCI_STD_NAMESPACE::string getString(MetaData::AttrId attrid) const 
+      ;
+      UString getUString(MetaData::AttrId attrid) const 
+      ;
+      Number getNumber(MetaData::AttrId attrid) const
+      ;
+      RefAny getRef(MetaData::AttrId attrid) const 
+      ;
+      Timestamp getTimestamp(MetaData::AttrId attrid) const 
+      ;
+      MetaData getMetaData(MetaData::AttrId attrid) const
+      ;
+      OCCI_STD_NAMESPACE::vector<MetaData> getVector(MetaData::AttrId attrid)
+      const ;
+      void  operator  =(const MetaData &omd);
+
+      ~MetaData();  
+     
+   private:
+
+  enum ociAttrType { OCI_UB1, 
+                         OCI_UB2, 
+                         OCI_UB4,
+                         OCI_SB1, 
+                         OCI_WORD,
+                         OCI_UB1_BOOL,     
+                         OCI_UB1PTR_TIMESTAMP,
+                         OCI_UB1PTR_NUMBER,
+                         OCI_TEXTPTR,
+                         OCI_DVOIDPTR_PARAM,
+                         OCI_DVOIDPTR_PARAMLIST,
+                         OCI_OCIREFPTR,
+                         OCI_OCIDURATION,
+                         OCI_OCITYPECODE,
+                         OCI_OCITYPEENCAP,
+                         OCI_OCITYPEPARAMMODE,
+                         OCI_OCIPRECISION
+                      };
+
+  enum AttrCount {COMMON_ATTR_COUNT = 5,
+        TABLE_ATTR_COUNT = 12,
+        VIEW_ATTR_COUNT = 7, 
+        FUNCPROC_ATTR_COUNT = 4,
+        PKG_ATTR_COUNT = 2,
+        TYP_ATTR_COUNT = 27, 
+        TYPEATTR_ATTR_COUNT = 14,
+        TYPEMTHD_ATTR_COUNT = 16,
+        COLL_ATTR_COUNT = 12,
+        SYN_ATTR_COUNT = 4,
+        SEQ_ATTR_COUNT = 7,
+        COL_ATTR_COUNT = 13,
+        ARG_TYPARG_TYPRES_ATTR_COUNT = 20, 
+        SCHEMA_ATTR_COUNT = 1,
+        DATABASE_ATTR_COUNT = 13,
+        UNK_ATTR_COUNT = 0
+        };
+
+  static const AttrId commonAttrId[COMMON_ATTR_COUNT];
+  static const ociAttrType commonAttrType[COMMON_ATTR_COUNT];
+  static const AttrId tableAttrId[TABLE_ATTR_COUNT];
+  static const ociAttrType tableAttrType[TABLE_ATTR_COUNT];
+  static const AttrId viewAttrId[VIEW_ATTR_COUNT];
+  static const ociAttrType viewAttrType[VIEW_ATTR_COUNT];
+  static const AttrId funcprocAttrId[FUNCPROC_ATTR_COUNT];
+  static const ociAttrType funcprocAttrType[FUNCPROC_ATTR_COUNT];
+  static const AttrId pkgAttrId[PKG_ATTR_COUNT];
+  static const ociAttrType pkgAttrType[PKG_ATTR_COUNT];
+  static const AttrId typAttrId[TYP_ATTR_COUNT];
+  static const ociAttrType typAttrType[TYP_ATTR_COUNT];
+  static const AttrId typeattrAttrId[TYPEATTR_ATTR_COUNT];
+  static const ociAttrType typeattrAttrType[TYPEATTR_ATTR_COUNT];
+  static const AttrId typmethdAttrId[TYPEMTHD_ATTR_COUNT];
+  static const ociAttrType typemthdAttrType[TYPEMTHD_ATTR_COUNT];
+  static const AttrId collAttrId[COLL_ATTR_COUNT];
+  static const ociAttrType collAttrType[COLL_ATTR_COUNT];
+  static const AttrId synAttrId[SYN_ATTR_COUNT];
+  static const ociAttrType synAttrType[SYN_ATTR_COUNT];
+  static const AttrId seqAttrId[SEQ_ATTR_COUNT];
+  static const ociAttrType seqAttrType[SEQ_ATTR_COUNT];
+  static const AttrId colAttrId[COL_ATTR_COUNT];
+  static const ociAttrType colAttrType[COL_ATTR_COUNT];
+  static const AttrId argtargtresAttrId[ARG_TYPARG_TYPRES_ATTR_COUNT];
+  static const ociAttrType argtargtresAttrType[
+                   ARG_TYPARG_TYPRES_ATTR_COUNT];
+  static const AttrId schemaAttrId[SCHEMA_ATTR_COUNT];
+  static const ociAttrType schemaAttrType[SCHEMA_ATTR_COUNT];
+  static const AttrId databaseAttrId[DATABASE_ATTR_COUNT];
+  static const ociAttrType databaseAttrType[DATABASE_ATTR_COUNT];
+
+  Ptr<MetaDataImpl> metaDataImplPtr;
+  const OCIParam* paramhp;
+  const ConnectionImpl* sesn;
+  const AttrId* attrIdArray;
+  const ociAttrType* attrTypeArray;
+  AttrCount attrCount;
+  
+  MetaData(const Connection *sessp, const OCCI_STD_NAMESPACE::string& objName,
+  ParamType prmtyp ) ;
+  MetaData(const Connection *sessp, const UString& objName,
+  ParamType prmtyp ) ;
+  MetaData(const Connection *sessp, 
+  const RefAny& ref) ;
+  MetaData(const Connection *sessp, MetaDataImpl *implPtr,
+  OCIParam* parm) ;
+  MetaData(const Connection *sessp, MetaDataImpl *implPtr,
+  OCIParam *parm, ub1 parmTyp) ;
+  ub1 getParamType(OCIParam* prm) const ;
+  const AttrId* getAttrIdArrayAddr(ub1 prmTyp) const;
+  const ociAttrType* getAttrTypeArrayAddr(ub1 prmTyp) const;
+  AttrCount getAttrCount(ub1 prmTyp) const; 
+  Type getType(ociAttrType typ) const;
+  bool isListTypeAttribute(AttrId attrid,ub1 ptyp) const;
+  boolean isInvalidAttrId(AttrId attrid,sb4* pos, 
+            boolean* isTypeSpecificAttrPtr) const;
+  ociAttrType getValidAttrType(sb4 index, boolean isTypeSpecificAttr)
+  const;
+
+  int getListType (const OCIParam *plist) const;
+  unsigned int getLowerBound(int ltype) const;
+  unsigned int getUpperBound(unsigned int ltype, 
+    unsigned int paramnum) const;
+  friend class ConnectionImpl;
+  friend class ResultSetImpl;
+
+};
+
+class Connection
+{
+   public :
+
+      // specifies the type of proxy to be created,
+      // used for future enhancements
+      enum ProxyType
+      {PROXY_DEFAULT
+      };
+
+      virtual ~Connection() { }
+      virtual Statement* createStatement(
+        const OCCI_STD_NAMESPACE::string  &sql = "") 
+         =0; 
+      virtual void terminateStatement(Statement *statement) =0;
+      virtual void commit()  =0; 
+      virtual void rollback()  =0;
+      virtual MetaData getMetaData(const OCCI_STD_NAMESPACE::string &object, 
+        MetaData::ParamType prmtyp 
+        = MetaData::PTYPE_UNK) const 
+         =0; 
+      virtual MetaData getMetaData(const RefAny &ref) const
+         =0; 
+      virtual OCCI_STD_NAMESPACE::string getClientCharSet() const 
+         =0; 
+      virtual OCCI_STD_NAMESPACE::string getClientNCHARCharSet() const 
+         =0; 
+      virtual void changePassword(const OCCI_STD_NAMESPACE::string &user,
+        const OCCI_STD_NAMESPACE::string &oldPassword,
+        const OCCI_STD_NAMESPACE::string &newPassword) 
+         =0; 
+      virtual void flushCache()  =0; 
+
+      virtual OCIServer*  getOCIServer() const =0;
+      virtual OCISvcCtx*  getOCIServiceContext() const =0;
+      virtual OCISession* getOCISession() const =0;
+
+      //new interfaces
+
+      virtual Statement* createStatement(const UString &sql) = 0;
+      virtual MetaData getMetaData(const UString &object, 
+        MetaData::ParamType prmtyp 
+        = MetaData::PTYPE_UNK) const 
+         =0; 
+      virtual UString getClientCharSetUString() const 
+         =0; 
+      virtual UString getClientNCHARCharSetUString() const 
+         =0; 
+      virtual void changePassword(const UString &user,
+        const UString &oldPassword,
+        const UString &newPassword) 
+         =0; 
+      virtual OCCI_STD_NAMESPACE::string getTag() const =0;
+      virtual void setStmtCacheSize(unsigned int cacheSize) = 0;
+      virtual unsigned int getStmtCacheSize() const =0;
+      virtual Statement* createStatement(const OCCI_STD_NAMESPACE::string &sql,
+                    const OCCI_STD_NAMESPACE::string &tag) = 0;
+      virtual void terminateStatement(Statement* stmt, 
+                    const OCCI_STD_NAMESPACE::string &tag) = 0;
+      virtual bool isCached(const OCCI_STD_NAMESPACE::string &sql,
+                    const OCCI_STD_NAMESPACE::string &tag = "") = 0;
+      virtual void registerSubscriptions(
+       const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+      virtual void unregisterSubscription(const aq::Subscription& sub) =0;
+      virtual void postToSubscriptions(
+       const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+      virtual Statement* createStatement(const UString &sql,
+                    const UString &tag) = 0;
+      virtual void terminateStatement(Statement* stmt, 
+                    const UString &tag) = 0;
+      virtual bool isCached(const UString &sql,
+                    const UString &tag) = 0;
+};
+
+class StatelessConnectionPool
+{
+  public :
+
+    enum PoolType
+    {
+      HETEROGENEOUS = OCI_DEFAULT,
+      HOMOGENEOUS = OCI_SPC_HOMOGENEOUS
+    };
+
+    enum BusyOption
+    {
+       WAIT = OCI_SPOOL_ATTRVAL_WAIT,
+       NOWAIT = OCI_SPOOL_ATTRVAL_NOWAIT,
+       FORCEGET = OCI_SPOOL_ATTRVAL_FORCEGET
+    };
+
+    enum DestroyMode
+    {
+       DEFAULT = OCI_DEFAULT,
+       SPD_FORCE = OCI_SPD_FORCE
+    };
+
+    virtual ~StatelessConnectionPool() {}
+    virtual unsigned int getBusyConnections() const =0;
+    virtual unsigned int getOpenConnections() const =0;
+    virtual unsigned int getMinConnections() const =0;
+    virtual unsigned int getMaxConnections() const =0;
+    virtual unsigned int getIncrConnections() const =0;
+    virtual OCCI_STD_NAMESPACE::string getPoolName() const =0;
+    virtual unsigned int getTimeOut() const =0;
+    virtual void setBusyOption(BusyOption busyOption) =0;
+    virtual BusyOption getBusyOption() const =0;
+    virtual void setTimeOut(unsigned int connTimeOut =0) =0;
+    virtual void setPoolSize(unsigned int maxConn =1,
+      unsigned int minConn =0, unsigned int incrConn =1) =0;
+    virtual Connection* getConnection( 
+      const OCCI_STD_NAMESPACE::string &tag ="") =0;
+    virtual Connection* getConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &password,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual Connection* getAnyTaggedConnection(
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual Connection* getAnyTaggedConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &Password,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual Connection* getProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+    virtual Connection* getProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      const OCCI_STD_NAMESPACE::string &tag = "" ,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+    virtual Connection* getAnyTaggedProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const OCCI_STD_NAMESPACE::string &tag = "",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT) =0;
+    virtual Connection* getAnyTaggedProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      const OCCI_STD_NAMESPACE::string &tag="",
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT ) =0;
+    virtual void releaseConnection (Connection *connection,
+      const OCCI_STD_NAMESPACE::string &tag = "") =0;
+    virtual void terminateConnection (Connection *connection) =0;
+    virtual void setStmtCacheSize(unsigned int cacheSize) =0;
+    virtual unsigned int getStmtCacheSize() const =0;
+
+    virtual Connection* getConnection(const UString &tag)=0;
+    virtual Connection* getConnection(const UString &userName,
+      const UString &password,
+      const UString &tag)=0;
+    virtual Connection* getAnyTaggedConnection(const UString &tag)=0;
+    virtual Connection* getAnyTaggedConnection( const UString &userName,
+      const UString &Password, const UString &tag)=0 ;
+    virtual Connection* getProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const UString &tag,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT)=0;
+    virtual Connection* getProxyConnection(const UString &name,
+      const UString &tag, Connection::ProxyType
+      proxyType = Connection::PROXY_DEFAULT)=0;
+    virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      const UString &tag,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT)=0;
+    virtual Connection* getAnyTaggedProxyConnection(const UString &name,
+      const UString &tag,
+      Connection::ProxyType proxyType = Connection::PROXY_DEFAULT )=0;
+    virtual void releaseConnection(Connection *connection,
+      const UString  &tag)=0;
+
+};
+
+
+class ConnectionPool
+{
+  public :
+
+    virtual ~ConnectionPool() {}
+    virtual unsigned int getBusyConnections() const 
+       =0; 
+    virtual unsigned int getOpenConnections() const 
+       =0; 
+    virtual unsigned int getMinConnections() const 
+       =0; 
+    virtual unsigned int getMaxConnections() const 
+       =0; 
+    virtual unsigned int getIncrConnections() const 
+       =0; 
+    virtual OCCI_STD_NAMESPACE::string getPoolName() const 
+       =0; 
+    virtual unsigned int getTimeOut() const 
+       =0; 
+    virtual void setErrorOnBusy() 
+       =0; 
+    virtual void setTimeOut(unsigned int connTimeOut =0) 
+       =0; 
+    virtual void setPoolSize(unsigned int minConn =0,
+      unsigned int maxConn =1, unsigned int incrConn =1) 
+       =0; 
+    virtual Connection* createConnection(
+      const OCCI_STD_NAMESPACE::string &userName,
+      const OCCI_STD_NAMESPACE::string &password)  =0; 
+
+    virtual Connection* createProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      Connection::ProxyType proxyType = 
+      Connection::PROXY_DEFAULT)  =0; 
+
+    virtual Connection* createProxyConnection(
+      const OCCI_STD_NAMESPACE::string &name,
+      Connection::ProxyType proxyType =
+      Connection::PROXY_DEFAULT)  =0;
+
+    virtual void terminateConnection
+      (Connection *connection) =0;
+
+    //new interfaces
+
+    virtual Connection* createConnection(
+      const UString &userName,
+      const UString &password)  =0; 
+    
+    virtual Connection* createProxyConnection(const UString &name,
+      OCCI_STD_NAMESPACE::string roles[], unsigned int numRoles,
+      Connection::ProxyType proxyType = 
+      Connection::PROXY_DEFAULT)  =0; 
+    
+    virtual Connection* createProxyConnection(const UString &name,
+      Connection::ProxyType proxyType =
+      Connection::PROXY_DEFAULT)  =0;
+    
+    virtual void setStmtCacheSize(unsigned int cacheSize) =0;
+    virtual unsigned int getStmtCacheSize() const =0;
+
+    virtual UString getPoolNameUString() const 
+       =0; 
+};
+
+class   Environment     
+{
+ public:
+                    // class constants
+
+  enum Mode
+  {
+    DEFAULT = OCI_DEFAULT,
+    OBJECT = OCI_OBJECT,
+    SHARED = OCI_SHARED,
+    NO_USERCALLBACKS = OCI_NO_UCB,
+    THREADED_MUTEXED = OCI_THREADED,
+    THREADED_UNMUTEXED = OCI_THREADED | OCI_ENV_NO_MUTEX,
+    EVENTS = OCI_EVENTS,
+    USE_LDAP = OCI_USE_LDAP
+  };
+
+  virtual ~Environment(){}
+
+                    // public methods
+
+  static Environment * createEnvironment(
+                              Mode mode = DEFAULT,
+                              void *ctxp = 0,
+                              void *(*malocfp)(void *ctxp, size_t size) = 0,
+                              void *(*ralocfp)(void *ctxp, void *memptr,
+                                               size_t newsize) = 0,
+                              void (*mfreefp)(void *ctxp, void *memptr) = 0);
+  
+  static Environment * createEnvironment(
+                              const OCCI_STD_NAMESPACE::string &charset,
+                              const OCCI_STD_NAMESPACE::string &ncharset,
+                              Mode mode = DEFAULT,
+                              void *ctxp = 0,
+                              void *(*malocfp)(void *ctxp, size_t size) = 0,
+                              void *(*ralocfp)(void *ctxp, void *memptr,
+                                               size_t newsize) = 0,
+                              void (*mfreefp)(void *ctxp, void *memptr) = 0);
+
+  static void terminateEnvironment(Environment *env);
+  
+  static Environment* getXAEnvironment(const 
+                           OCCI_STD_NAMESPACE::string& dbname);
+
+  static void releaseXAEnvironment(Environment *env);
+  
+  virtual Connection * createConnection(
+    const OCCI_STD_NAMESPACE::string &userName,
+    const OCCI_STD_NAMESPACE::string &password, 
+    const OCCI_STD_NAMESPACE::string &connectString = "") = 0;
+
+  virtual void terminateConnection(Connection *connection) = 0;
+
+  virtual ConnectionPool* createConnectionPool(
+    const OCCI_STD_NAMESPACE::string &poolUserName,
+    const OCCI_STD_NAMESPACE::string &poolPassword, 
+    const OCCI_STD_NAMESPACE::string &connectString ="", 
+    unsigned int minConn =0,
+    unsigned int maxConn =1, unsigned int incrConn =1) = 0;
+
+  virtual void terminateConnectionPool(ConnectionPool *poolp) = 0;
+
+  virtual unsigned int getCurrentHeapSize() const = 0;
+
+  virtual OCIEnv * getOCIEnvironment() const = 0;
+
+  virtual Map *getMap() const = 0;
+ 
+  virtual void setCacheMaxSize(unsigned int maxSize) = 0; 
+  
+  virtual unsigned int getCacheMaxSize() const = 0; 
+  
+  virtual void setCacheOptSize(unsigned int OptSize) = 0; 
+  
+  virtual unsigned int getCacheOptSize() const = 0; 
+
+
+  //new interfaces
+
+  virtual Connection * createConnection(const UString &userName,
+    const UString &password, const UString &connectString) = 0;
+  
+  virtual ConnectionPool* createConnectionPool(
+    const UString &poolUserName,
+    const UString &poolPassword, const UString &connectString, 
+    unsigned int minConn =0,
+    unsigned int maxConn =1, unsigned int incrConn =1) = 0;
+
+  virtual Connection* getXAConnection(const 
+                           OCCI_STD_NAMESPACE::string& dbname) = 0;
+
+  virtual void releaseXAConnection(Connection* conn) =0;
+  
+  virtual StatelessConnectionPool* createStatelessConnectionPool(
+    const OCCI_STD_NAMESPACE::string &poolUserName,
+    const OCCI_STD_NAMESPACE::string &poolPassword,
+    const OCCI_STD_NAMESPACE::string &connectString = "",
+    unsigned int maxConn = 1, unsigned int minConn = 0,
+    unsigned int incrConn = 1,
+    StatelessConnectionPool::PoolType pType 
+                                 = StatelessConnectionPool::HETEROGENEOUS) = 0;
+  
+  virtual StatelessConnectionPool* createStatelessConnectionPool(
+    const UString &poolUserName,
+    const UString &poolPassword,
+    const UString &connectString,
+    unsigned int maxConn = 1, unsigned int minConn = 0,
+    unsigned int incrConn = 1,
+    StatelessConnectionPool::PoolType pType 
+                                 = StatelessConnectionPool::HETEROGENEOUS) = 0;
+
+  virtual void terminateStatelessConnectionPool(StatelessConnectionPool *poolp,
+  StatelessConnectionPool::DestroyMode mode = StatelessConnectionPool::DEFAULT)
+      = 0;
+  virtual void setLDAPAuthentication(unsigned int mode) =0;
+
+  virtual unsigned int getLDAPAuthentication() const =0;
+  
+  virtual void setLDAPLoginNameAndPassword(
+     const OCCI_STD_NAMESPACE::string &login,
+     const OCCI_STD_NAMESPACE::string &passwd) =0;
+
+  virtual void setLDAPAdminContext(const OCCI_STD_NAMESPACE::string &ctx)=0;
+
+  virtual OCCI_STD_NAMESPACE::string getLDAPAdminContext() const =0;
+
+  virtual void setLDAPHostAndPort(const OCCI_STD_NAMESPACE::string &host,
+     unsigned int port) =0;
+
+  virtual OCCI_STD_NAMESPACE::string getLDAPHost() const =0;
+
+  virtual unsigned int getLDAPPort() const =0;  
+ 
+  virtual void registerSubscriptions(
+     const OCCI_STD_NAMESPACE::vector<aq::Subscription>& sub) =0;
+
+  virtual void unregisterSubscription(const aq::Subscription& sub) =0; 
+ 
+  virtual void enableSubscription(const aq::Subscription& sub) =0;
+  
+  virtual void disableSubscription(const aq::Subscription& sub) =0;
+  
+  virtual bool getCacheSortedFlush() const = 0;
+
+  virtual void setCacheSortedFlush(bool flag) = 0;
+
+  private:
+
+};
+
+
+
+class Map
+{
+ public:
+
+  virtual ~Map(){}
+  virtual void put(const OCCI_STD_NAMESPACE::string&, void *(*)(void *), 
+                void (*)(void *, void *)) = 0;
+  virtual void getReadSQL(
+    void *, unsigned int, void *, unsigned int, void **) const = 0;
+  virtual void getWriteSQL(
+    void *, unsigned int, void *, unsigned int, void **) const = 0;
+  virtual void put(const OCCI_STD_NAMESPACE::string&, 
+                const OCCI_STD_NAMESPACE::string&, void *(*)(void *), 
+                void (*)(void *, void *)) = 0;
+  virtual void putUTF16(const OCCI_STD_NAMESPACE::string&, 
+                const OCCI_STD_NAMESPACE::string&, void *(*)(void *), 
+                void (*)(void *, void *)) = 0;
+
+ private:
+};
+
+
+   
+class SQLException : public OCCI_STD_NAMESPACE::exception
+{
+ public:
+
+  virtual int getErrorCode() const;
+  
+  virtual OCCI_STD_NAMESPACE::string getMessage() const;
+
+  const char *what() const throw();
+
+  virtual void setErrorCtx(void *ctx);
+  
+  SQLException();
+
+  SQLException(const SQLException &e);
+
+  void operator=(const SQLException &other);
+
+  virtual ~SQLException() throw();
+
+  virtual int getXAErrorCode(const OCCI_STD_NAMESPACE::string& dbname) const;
+  
+  virtual UString getUStringMessage() const;
+
+  virtual OCCI_STD_NAMESPACE::string getNLSMessage(Environment *env) const;
+  
+  virtual UString getNLSUStringMessage(Environment *env) const;
+
+ private:
+
+  Ptr<SQLExceptionImpl> ptr_;
+  SQLException(SQLExceptionImpl *ptr);
+  friend SQLException SQLExceptionCreate(int errorCode);
+  friend SQLException SQLExceptionCreate(dvoid *handle,
+  int handleType);
+
+};
+
+
+class Statement 
+{
+ public:
+                                // class constants
+
+  virtual ~Statement() {}
+  
+  enum Status                                   
+  {
+    UNPREPARED,
+    PREPARED,
+    RESULT_SET_AVAILABLE,
+    UPDATE_COUNT_AVAILABLE,
+    NEEDS_STREAM_DATA,
+    STREAM_DATA_AVAILABLE
+  };
+  
+                                // common methods
+  
+  virtual void setSQL(const OCCI_STD_NAMESPACE::string &sql) = 0; 
+
+  virtual OCCI_STD_NAMESPACE::string getSQL() const = 0;
+
+  virtual Status execute(const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+  
+  virtual ResultSet * getResultSet() = 0;
+  
+  virtual unsigned int getUpdateCount() const = 0; 
+  
+  virtual ResultSet * executeQuery(
+    const OCCI_STD_NAMESPACE::string &sql = "") = 0;
+  
+  virtual unsigned int executeUpdate(
+    const OCCI_STD_NAMESPACE::string &sql = "") = 0; 
+  
+  virtual Status status() const = 0;  
+                                        
+  virtual void closeResultSet(ResultSet *resultSet) = 0;
+  
+  virtual void setPrefetchRowCount(unsigned int rowCount) = 0; 
+  
+  virtual void setPrefetchMemorySize(unsigned int bytes) = 0;
+  
+  virtual void setAutoCommit(bool autoCommit) = 0;
+  
+  virtual bool getAutoCommit() const = 0;
+  
+  virtual OCIStmt * getOCIStatement() const = 0;
+
+
+                    // methods for prepared statements with IN
+                    // parameters  
+
+  virtual void setMaxParamSize(unsigned int paramIndex,unsigned int maxSize)=0;
+  
+  virtual unsigned int getMaxParamSize(unsigned int paramIndex) const = 0;
+
+  virtual void setNull(unsigned int paramIndex, Type type) = 0;
+ 
+  virtual void setInt(unsigned int paramIndex, int x) = 0; 
+  
+  virtual void setUInt(unsigned int paramIndex, unsigned int x) = 0; 
+  
+  virtual void setFloat(unsigned int paramIndex, float x) = 0; 
+
+  virtual void setDouble(unsigned int paramIndex, double x) = 0; 
+
+  virtual void setNumber(unsigned int paramIndex, const Number &x) = 0; 
+  
+  virtual void setString(unsigned int paramIndex, 
+    const OCCI_STD_NAMESPACE::string &x) = 0; 
+
+  virtual void setBytes(unsigned int paramIndex, const Bytes &x) = 0; 
+
+  virtual void setDate(unsigned int paramIndex, const Date &x) = 0; 
+  
+  virtual void setTimestamp(unsigned int paramIndex, const Timestamp &x) = 0; 
+
+  virtual void setBlob(unsigned int paramIndex, const Blob &x) = 0;
+
+  virtual void setClob(unsigned int paramIndex, const Clob &x) = 0;
+
+  virtual void setBfile(unsigned int paramIndex, const Bfile &x) = 0;
+
+  virtual void setIntervalYM(unsigned int paramIndex, const IntervalYM &x) = 0;
+ 
+  virtual void setIntervalDS(unsigned int paramIndex, const IntervalDS &x) = 0;
+ 
+  virtual void setRowid(unsigned int paramIndex, const Bytes &x) = 0; 
+  
+  virtual void setRef(unsigned int paramIndex, const RefAny &x) = 0; 
+
+  virtual void setObject(unsigned int paramIndex, PObject * x) = 0; 
+  
+  virtual void setDataBuffer(unsigned int paramIndex, void *buffer, 
+                             Type type,
+                             sb4 size, ub2 *length, sb2 *ind = NULL,
+                             ub2 *rc = NULL) = 0; 
+
+  virtual void setDataBufferArray(unsigned int paramIndex, void *buffer, 
+                                  Type type,
+                                  ub4 arraySize, ub4 *arrayLength,
+                                  sb4 elementSize,
+                                  ub2 *elementLength, sb2 *ind = NULL,
+                                  ub2 *rc = NULL) = 0;
+
+  virtual void setCharSet(unsigned int paramIndex, 
+  const OCCI_STD_NAMESPACE::string & charSet) = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getCharSet(unsigned int paramIndex) 
+  const = 0; 
+  
+  virtual void setDatabaseNCHARParam(
+    unsigned int paramIndex, bool isNCHAR) = 0;
+                                         
+  virtual bool getDatabaseNCHARParam(unsigned int paramIndex) const = 0;       
+
+  virtual void closeStream(Stream *stream) =0;
+
+  virtual Stream * getStream(unsigned int paramIndex) = 0; 
+  
+  virtual unsigned int getCurrentStreamParam() const = 0; 
+  
+  virtual unsigned int getCurrentStreamIteration() const = 0;
+
+  virtual void setBinaryStreamMode(unsigned int colIndex, 
+    unsigned int size) =0;
+
+  virtual void setCharacterStreamMode(unsigned int colIndex, 
+    unsigned int size) =0;
+  
+  virtual void setMaxIterations(unsigned int maxIterations) = 0;
+  
+  virtual unsigned int getMaxIterations() const = 0; 
+
+  virtual void addIteration() = 0; 
+  
+  virtual unsigned int getCurrentIteration() const = 0; 
+
+  virtual Status executeArrayUpdate(unsigned int arrayLength) = 0;
+  
+
+                    // methods for Callable Statements
+
+  virtual void registerOutParam(unsigned int paramIndex, Type type, 
+  unsigned int maxSize=0, const OCCI_STD_NAMESPACE::string &sqltype="") = 0;
+  
+  virtual bool isNull(unsigned int paramIndex) const = 0;
+
+  virtual bool isTruncated(unsigned int paramIndex) const
+   =0;
+
+  
+  virtual void setErrorOnNull(unsigned int paramIndex, 
+    bool causeException) = 0;
+                               
+  virtual void setErrorOnTruncate(unsigned int paramIndex,
+  bool causeException)  = 0;
+
+  virtual int preTruncationLength(unsigned int paramIndex) const
+   =0;
+
+
+  virtual int getInt(unsigned int paramIndex)  = 0; 
+  
+  virtual unsigned int getUInt(unsigned int paramIndex)  = 0; 
+  
+  virtual float getFloat(unsigned int paramIndex)  = 0; 
+
+  virtual double getDouble(unsigned int paramIndex)  = 0; 
+  
+  virtual Number getNumber(unsigned int paramIndex)  = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getString(unsigned int paramIndex)  = 0; 
+  
+  virtual Bytes getBytes(unsigned int paramIndex)  = 0; 
+
+  virtual Date getDate(unsigned int paramIndex)  = 0; 
+  
+  virtual Timestamp getTimestamp(unsigned int paramIndex)  = 0; 
+
+  virtual Bytes getRowid(unsigned int paramIndex)  = 0; 
+  
+  virtual PObject * getObject(unsigned int paramIndex)  = 0; 
+  
+  virtual Blob getBlob(unsigned int paramIndex)  = 0; 
+  
+  virtual Clob getClob(unsigned int paramIndex)  = 0; 
+  
+  virtual Bfile getBfile(unsigned int paramIndex)  = 0; 
+
+  virtual IntervalYM getIntervalYM(unsigned int paramIndex)  = 0; 
+ 
+  virtual IntervalDS getIntervalDS(unsigned int paramIndex)  = 0; 
+
+  virtual RefAny getRef(unsigned int paramIndex)  = 0;  
+
+  virtual ResultSet * getCursor(unsigned int paramIndex)   = 0;
+
+  virtual Connection* getConnection() const =0; 
+
+  //new interfaces
+
+  virtual void setRef(unsigned int paramIndex, const RefAny &x, 
+                      const OCCI_STD_NAMESPACE::string &typName, 
+                      const OCCI_STD_NAMESPACE::string &schName = "") = 0; 
+  
+  virtual void setSQLUString(const UString &sql) = 0;
+  
+  virtual UString getSQLUString() const = 0;
+  
+  virtual Status execute(const UString &sql) = 0;
+                                
+  virtual ResultSet * executeQuery(
+    const UString &sql) = 0;
+  
+  virtual unsigned int executeUpdate(
+    const UString &sql) = 0; 
+  
+  virtual void setBFloat(unsigned int paramIndex, const BFloat &fval) = 0;
+  
+  virtual void setBDouble(unsigned int paramIndex, const BDouble &dval) = 0;
+  
+  virtual void setUString(unsigned int paramIndex,
+    const UString &x) = 0;
+  
+  virtual void setCharSetUString(unsigned int paramIndex, 
+  const UString & charSet) = 0; 
+  
+  virtual UString getCharSetUString(unsigned int paramIndex) 
+  const = 0; 
+  
+  virtual void registerOutParam(unsigned int paramIndex, Type type, 
+  unsigned int maxSize, const OCCI_STD_NAMESPACE::string &typName,
+  const OCCI_STD_NAMESPACE::string &schName) = 0;
+  
+  virtual void registerOutParam(unsigned int paramIndex, Type type, 
+  unsigned int maxSize, const UString &typName, 
+  const UString &schName) = 0;
+  
+  virtual BFloat getBFloat(unsigned int paramIndex)  = 0;
+  
+  virtual BDouble getBDouble(unsigned int paramIndex)  = 0;
+
+  virtual UString getUString(unsigned int paramIndex)  = 0; 
+  
+  virtual void disableCaching() =0;
+  
+  virtual void setRef(unsigned int paramIndex, const RefAny &x, 
+                      const UString &typName, 
+                      const UString &schName) = 0; 
+
+  virtual void setBinaryStreamMode(unsigned int colIndex, 
+    unsigned int size, bool INArg) =0;
+
+  virtual void setCharacterStreamMode(unsigned int colIndex, 
+    unsigned int size, bool INArg) =0;
+
+};
+
+
+
+class ResultSet 
+{
+ public:
+                                // class constants
+  
+  enum Status                                   
+  {
+    END_OF_FETCH = 0,
+    DATA_AVAILABLE,
+    STREAM_DATA_AVAILABLE
+  };
+  virtual ~ResultSet(){}
+ 
+                                // public methods
+
+  virtual Status next(unsigned int numRows = 1) = 0;
+  
+  virtual Status status() const = 0;            
+  
+  virtual unsigned int getNumArrayRows()  const = 0;
+  
+  virtual void cancel() = 0;
+
+  virtual void setMaxColumnSize(unsigned int colIndex, unsigned int max) = 0;
+  
+  virtual unsigned int getMaxColumnSize(unsigned int colIndex) const = 0;
+  
+  virtual bool isNull(unsigned int colIndex) const = 0;
+  
+  virtual bool isTruncated(unsigned int paramIndex) const
+   =0;
+
+  virtual void setErrorOnNull(unsigned int colIndex, bool causeException) = 0;
+  virtual void setErrorOnTruncate(unsigned int paramIndex,
+  bool causeException)   =0;
+
+  virtual int preTruncationLength(unsigned int paramIndex) const
+   =0;
+
+  virtual int getInt(unsigned int colIndex)   = 0; 
+  
+  virtual unsigned int getUInt(unsigned int colIndex)   = 0; 
+  
+  virtual float getFloat(unsigned int colIndex)  = 0; 
+
+  virtual double getDouble(unsigned int colIndex)  = 0; 
+
+  virtual Number getNumber(unsigned int colIndex)  = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getString(unsigned int colIndex)  = 0; 
+  
+  virtual Bytes getBytes(unsigned int colIndex)  = 0; 
+
+  virtual Date getDate(unsigned int colIndex)  = 0; 
+  
+  virtual Timestamp getTimestamp(unsigned int colIndex)  = 0; 
+  
+  virtual Bytes getRowid(unsigned int colIndex)  = 0; 
+  
+  virtual PObject * getObject(unsigned int colIndex)  = 0; 
+  
+  virtual Blob getBlob(unsigned int colIndex)  = 0; 
+  
+  virtual Clob getClob(unsigned int colIndex)  =0; 
+  
+  virtual Bfile getBfile(unsigned int colIndex)  = 0; 
+
+  virtual  IntervalYM getIntervalYM(unsigned int colIndex)  =0;
+   
+  virtual  IntervalDS getIntervalDS(unsigned int colIndex)  =0;
+   
+  virtual RefAny getRef(unsigned int colIndex)  = 0; 
+
+  virtual Bytes getRowPosition() const = 0; 
+
+  virtual ResultSet * getCursor(unsigned int colIndex)  = 0; 
+  
+  virtual void setDataBuffer(unsigned int colIndex, void *buffer, Type type,
+                             sb4 size = 0, ub2 *length = NULL,
+                             sb2 *ind = NULL, ub2 *rc = NULL) = 0;
+
+  virtual void setCharSet(unsigned int colIndex, 
+  const OCCI_STD_NAMESPACE::string & charSet) = 0; 
+  
+  virtual OCCI_STD_NAMESPACE::string getCharSet(unsigned int colIndex) 
+  const = 0; 
+  
+  virtual void setBinaryStreamMode(unsigned int colIndex, unsigned int size)
+    = 0;
+
+  virtual void setCharacterStreamMode(unsigned int colIndex, unsigned int size)
+    = 0;
+  
+  virtual void setDatabaseNCHARParam(unsigned int paramIndex, 
+    bool isNCHAR) = 0;
+  
+  virtual bool getDatabaseNCHARParam(unsigned int paramIndex) const = 0;       
+                                         
+  virtual Stream * getStream(unsigned int colIndex)  = 0; 
+
+  virtual void closeStream(Stream *stream) =0;
+  
+  virtual unsigned int getCurrentStreamColumn() const= 0; 
+  
+  virtual unsigned int getCurrentStreamRow() const= 0;       
+  
+  virtual OCCI_STD_NAMESPACE::vector<MetaData> getColumnListMetaData() const 
+    = 0;
+
+  virtual Statement* getStatement() const=0;
+
+  //new interfaces
+
+  virtual BFloat getBFloat(unsigned int colIndex)  = 0;
+  
+  virtual BDouble getBDouble(unsigned int colIndex)  = 0;
+  
+  virtual UString getUString(unsigned int colIndex)  = 0; 
+  
+  virtual void setCharSetUString(unsigned int colIndex, 
+  const UString & charSet) = 0; 
+  
+  virtual UString getCharSetUString(unsigned int colIndex) 
+  const = 0; 
+
+};
+
+
+class Stream
+{
+  public : 
+
+    enum Status {READY_FOR_READ, READY_FOR_WRITE, INACTIVE};
+
+    virtual ~Stream(){}
+    virtual int readBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual int readLastBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual void writeBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual void writeLastBuffer(char *buffer, unsigned int size)
+       =0;
+    virtual Status status() const  =0;
+
+};
+
+/*---------------------------------------------------------------------------
+                PROTOTYPES USED BY FUNCTION TEMPLATES
+ -------------------------------------------------------------------------*/
+  void getVectorOfPObjects( ResultSet *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<PObject *> &vect) ;
+  void getVectorOfOCIRefs(ResultSet  *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<void *> &vect) ;
+  void getVectorOfPObjects( Statement *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<PObject *> &vect) ;
+  void getVectorOfOCIRefs(Statement  *rs, unsigned int index,
+  OCCI_STD_NAMESPACE::vector<void *> &vect) ;
+  void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<PObject *> &vect, 
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<PObject *> &vect, 
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVectorOfPObjects( Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<PObject *> &vect, 
+  const UString &schemaName,
+  const UString &typeName) ;
+  void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+  const  OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+  const OCCI_STD_NAMESPACE::string &sqltype) ;
+  void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+  const  OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+  const OCCI_STD_NAMESPACE::string &schemaName,
+  const OCCI_STD_NAMESPACE::string &typeName) ;
+  void setVectorOfOCIRefs(Statement *stmt, unsigned int paramIndex,
+  const  OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector<OCIInd> &vecind,
+  const UString &schemaName,
+  const UString &typeName) ;
+  void pinVectorOfOCIRefs(const Connection *conn, 
+  OCCI_STD_NAMESPACE::vector<void *> & vecRef,
+  OCCI_STD_NAMESPACE::vector<void *> & vecCor,
+  OCCI_STD_NAMESPACE::vector<PObject *> &vecPObj,LockOptions &lockOpt );
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------------ getVector for objects ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of objects
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of objects(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of RefAny.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with objects.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : NTY
+
+        will call getVector(..., vector<PObject*>)
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void getVector( ResultSet *rs, unsigned int index,OCCI_STD_NAMESPACE::vector<T>
+& vect) 
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(rs, index, vec_pobj);
+
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for ( unsigned int i=0; i< size; i++)
+    vect.push_back((T)vec_pobj[i]);
+}
+
+#else
+template <class T>
+void getVector( ResultSet *rs, unsigned int index, OCCI_STD_NAMESPACE::vector<T
+ *> &vect)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(rs, index, vec_pobj);
+
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+    vect.push_back((T *)vec_pobj[i]);
+}
+#endif
+
+/*------------------------ getVector for objects ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of objects
+
+   PARAMETERS
+      stmt - Statement
+      vect- reference to vector of objects(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of RefAny.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with objects.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : NTY
+
+        will call getVector(..., vector<PObject*>)
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void getVector( Statement *stmt, unsigned int index, 
+OCCI_STD_NAMESPACE::vector<T> &vect) 
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(stmt, index, vec_pobj);
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+    vect.push_back((T)vec_pobj[i]);
+}
+#else
+template <class T>
+void getVector( Statement *stmt, unsigned int index,
+OCCI_STD_NAMESPACE::vector<T *> &vect)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  getVectorOfPObjects(stmt, index, vec_pobj);
+  vect.clear();
+  unsigned int size = vec_pobj.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+    vect.push_back((T *)vec_pobj[i]);
+}
+#endif
+
+/*------------------------ getVector for Ref<T> ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of Ref<T>
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+#ifndef WIN32COMMON
+template <class T>
+void getVector( ResultSet *rs, unsigned int index, 
+                OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) 
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(rs, index, vec_ref);
+
+  const Connection *sess = rs->getStatement()->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+}
+#endif
+
+/*------------------------ setVector for PObject*---------------------------*/
+/*
+   NAME
+      SetVector - overloaded function. Binds the attribute in the current
+      position with a vector of objects.
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of objects(OUT parameter).
+
+   DESCRIPTION
+     Binds the column in the specified position with a vector of signed int .
+   The column at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with objects .
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : SQLT_NTY
+ 
+     This will be calling setVector(..., vector<PObject*>,..)
+
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<T> &vect, 
+                const OCCI_STD_NAMESPACE::string &sqltype) 
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+  
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T> &vect, const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T> &vect, const UString &schemaName,
+const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+#else
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const OCCI_STD_NAMESPACE::string &sqltype)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, const OCCI_STD_NAMESPACE::
+vector<T *> &vect, const UString &schemaName,
+const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<PObject *> vec_pobj;
+  unsigned int size = vect.size();
+  vec_pobj.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+    vec_pobj.push_back((PObject *)vect[i]);
+
+  setVectorOfPObjects(stmt, index, vec_pobj, schemaName, typeName);
+}
+#endif
+
+/*------------------------ setVector for Ref<T>---------------------------*/
+/*
+   NAME
+      setVector - overloaded function. Binds the attribute in the current
+      position with a vector of Ref<T>.
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of REF
+
+   DESCRIPTION
+     Binds the column in the specified position with a vector of signed int .
+   The column at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with OCIRef* .
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : REF 
+
+     This will just call setVector(..., vector<OCIRef*>,..)
+
+
+*/
+#ifndef WIN32COMMON
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+                const OCCI_STD_NAMESPACE::string &sqltype)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, sqltype);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+                const OCCI_STD_NAMESPACE::string &schemaName,
+                const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+template <class T>
+void setVector( Statement *stmt, unsigned int index, 
+                const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+                const UString &schemaName,
+                const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+#endif
+
+/*------------------------ getVector for Ref<T> ---------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the current
+position as a vector of Ref<T>
+
+   PARAMETERS
+      stmt - Statement
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+#ifndef WIN32COMMON
+template <class T>
+void getVector( Statement *stmt, unsigned int index, 
+                OCCI_STD_NAMESPACE::vector<Ref<T> > &vect) 
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(stmt, index, vec_ref);
+
+  const Connection *sess = stmt->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref <T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T> (sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+ 
+}
+#endif
+
+// Platform independent get/setVectorOfRefs method added
+// get(set)Vector of Ref<T> and get(set)VectorOfRefs are identical 
+// in functionality. 
+
+/*------------------------ getVectorOfRefs for Ref<T> ----------------------*/
+/*
+   NAME
+      getVectorOfRefs - overloaded function. Retrieves the attribute in the
+      current position as a vector of Ref<T>
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+
+template <class T>
+void getVectorOfRefs( ResultSet *rs, unsigned int index, 
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(rs, index, vec_ref);
+
+  const Connection *sess = rs->getStatement()->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+}
+
+/*------------------------ setVectorOfRefs for Ref<T>-----------------------*/
+/*
+   NAME
+      setVectorOfRefs - overloaded function. Binds the attribute in the current
+      position with a vector of Ref<T>.
+
+   PARAMETERS
+      rs - ResultSet
+      vect- reference to vector of REF
+
+   DESCRIPTION
+     Binds the column in the specified position with a vector of signed int .
+   The column at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with OCIRef* .
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : REF
+
+     This will just call setVector(..., vector<OCIRef*>,..)
+
+
+*/
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index, 
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+const OCCI_STD_NAMESPACE::string &sqltype)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, sqltype);
+}
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index, 
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+template <class T>
+void setVectorOfRefs( Statement *stmt, unsigned int index, 
+const OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+const UString &schemaName,
+const UString &typeName)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+  unsigned int size = vect.size();
+  vec_ref.reserve( size );
+  vec_ind.reserve( size );
+
+  for (unsigned int i = 0; i < size; i++)
+  {
+    vec_ref.push_back((void *)vect[i].getRef());
+    vec_ind.push_back( vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+  }
+
+  setVectorOfOCIRefs(stmt, index, vec_ref, vec_ind, schemaName, typeName);
+}
+
+/*------------------------ getVectorOfRefs for Ref<T> ----------------------*/
+/*
+   NAME
+      getVectorOfRefs - overloaded function. Retrieves the attribute in the
+      current position as a vector of Ref<T>
+
+   PARAMETERS
+      stmt - Statement
+      vect- reference to vector of Ref<T>(OUT parameter).
+
+   DESCRIPTION
+     Retrieves the column in the specified position as a vector of Ref<T>.
+   The attribute at the current position should be a collection type (varray or
+   nested table). The SQL type of the elements in the collection should be
+   compatible with Ref<T>.
+
+   RETURNS
+     nothing
+
+   NOTES
+        compatible SQL types : REF
+*/
+
+template <class T>
+void getVectorOfRefs( Statement *stmt, unsigned int index, 
+OCCI_STD_NAMESPACE::vector <Ref<T> > &vect)
+{
+  OCCI_STD_NAMESPACE::vector<void *> vec_ref;
+  getVectorOfOCIRefs(stmt, index, vec_ref);
+
+  const Connection *sess = stmt->getConnection();
+
+  vect.clear();
+  unsigned int size = vec_ref.size();
+  vect.reserve( size );
+  for (unsigned int i=0; i< size; i++)
+  {
+    if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref <T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T> (sess, (OCIRef *)vec_ref[i], FALSE));
+  }
+}
+/*----------------------------- pinVectorOfRefs---------------------*/
+/*
+   NAME
+    pinVectorOfRefs - array pin implementation
+
+   PARAMETERS
+     conn- Connection object
+     vecRef - vector of OCIRefs *
+     vecCor - vector of OCIComplexObject *
+     vecPOBj - vector of PObject * ( OUT )
+
+   DESCRIPTION
+    implements the array pin of refs passed and returns the corresponding
+    PObject s
+
+   RETURNS
+
+   NOTES
+*/
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect, 
+OCCI_STD_NAMESPACE::vector<T* > &vectObj, LockOptions lockOpt) 
+{
+   
+ OCCI_STD_NAMESPACE::vector<void *> vecRef;
+ OCCI_STD_NAMESPACE::vector<void *> vecCor;
+ OCCI_STD_NAMESPACE::vector<PObject *> vecPObj;
+ unsigned int sz = vect.size();
+ vecRef.reserve( sz );
+ vecCor.reserve( sz );
+
+ for ( unsigned int  i=0; i < sz; i++)
+ {
+   vecRef.push_back((void *)vect[i].getRef());
+   vecCor.push_back((void *)vect[i].getCor());
+ }
+ pinVectorOfOCIRefs(conn, vecRef, vecCor, vecPObj, lockOpt);
+ for ( unsigned int  k=0; k < sz; k++)
+ {
+   vectObj.push_back((T *)vecPObj[k]);
+   vect[k].setPinnedObject(vecPObj[k]);
+ }
+}
+
+/*----------------------------- pinVectorOfRefs---------------------*/
+/*
+   NAME
+    pinVectorOfRefs - array pin implementation
+
+   PARAMETERS
+     conn- Connection object
+     vecRef - vector of OCIRefs *
+     vecCor - vector of OCIComplexObject *
+
+   DESCRIPTION
+    implements the array pin of refs passed 
+
+   RETURNS
+
+   NOTES
+*/
+template <class T>
+void pinVectorOfRefs( const Connection *conn,
+OCCI_STD_NAMESPACE::vector<Ref<T> > &vect,
+LockOptions lockOpt)
+{
+  
+ OCCI_STD_NAMESPACE::vector<void *> vecRef;
+ OCCI_STD_NAMESPACE::vector<void *> vecCor;
+ OCCI_STD_NAMESPACE::vector<PObject *> vecPObj;
+ unsigned int sz = vect.size();
+ vecRef.reserve( sz );
+ vecCor.reserve( sz );
+
+ for ( unsigned int  i=0; i < sz; i++)
+ {
+   vecRef.push_back((void *)vect[i].getRef());
+   vecCor.push_back((void *)vect[i].getCor());
+ }
+ pinVectorOfOCIRefs(conn, vecRef, vecCor,vecPObj, lockOpt);
+ for ( unsigned int  k=0; k < sz; k++)
+   vect[k].setPinnedObject(vecPObj[k]);
+}
+
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif                                              /* OCCICONTROL_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiData.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiData.h
new file mode 100644
index 0000000..fe76fe4
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiData.h
@@ -0,0 +1,936 @@
+/* Copyright (c) 2000, 2003, Oracle Corporation.  All rights reserved.  */
+   
+/* 
+   NAME 
+     occiData.h - header file for OCCI data classes
+
+   DESCRIPTION 
+     Class definitions for Stream, Blob, Clob ,Bfile,
+     Number, Date, IntervalYM, IntervalDS, Time,
+     Timestamp
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+   <external functions declared for use outside package - one-line descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   shiyer      10/31/03 - Timestamp constructors issue 
+   rvallam     10/07/03 - bug 3089939 - add private method in Date to compute 
+                          hour and min component in daysBetween to be passed 
+                          to set method of IntervalDS.
+   cparampa    08/21/03 - added toCopy to IntervalDS and IntervalYM
+   cparampa    07/14/03 - make SubscriptionImpl friend of Bytes class. 
+   rvallam     02/12/03 - modified BFloat/BDouble interface - BFloat/BDouble
+                          type is now a struct
+   cparampa    01/20/03 - made ProducerImpl friend of Bytes class
+   rvallam     11/19/02 - objects support for interval class
+   shiyer      11/15/02 - Add UTF16 support to IntervalYM & IntervalDS
+   cparampa    12/11/02 - removed references to class Payload
+   cparampa    10/12/02 - AQ additions
+   shiyer      10/12/02 - Added UTF16 version of get/set CharsetId in Clob
+   shiyer      09/06/02 - OCCI globalization support
+   aahluwal    06/04/02 - bug 2360115
+   vvinay      02/21/02 - operator= added for Bytes
+   gayyappa    10/23/01 - fix bug 2073327 , use string instead of enum CharSet  
+   vvinay      12/21/01 - signed char constructor and cast operator
+                          (bug 2073334)
+                          binary operator methods not friends any more
+   gayyappa    15/10/01 - add parameter toCopy to Lob/Timestamp private 
+                          constructors 
+   rvallam     04/09/01 - change private constructor in Number to pass
+                          parameter by reference and made it const
+   chliang     03/05/01 - disable olint
+   rvallam     01/27/02 - remove #include <ostream>
+   gayyappa    01/17/01 - add methods/operators to Interval and
+                          timestamp classes..
+   gayyappa    12/15/00 - interface changes in set methods
+   rvallam     11/29/00 - change method signature in Bytes
+                          added 3 new methods in Number  
+   rvallam     10/20/00  - change method signatures in Date
+   rvallam     09/15/00 - make StmtImpl/ResultSetImpl friend to 
+                          interval classes 
+   gayyappa    08/21/00 - modified timestamp, interval headers.
+                          add OCIEnv to constructor of Bytes.,
+                          removed getOCIRaw from Bytes.
+                          add const to setVector mthds of anydata.
+                          add dvoid* data member to Timestamp/Interval.
+   rvallam     08/10/00 - modified CORE class headers to add friends , 
+                          added private constructor in Bytes
+   slari       08/02/00 - comment out Stream
+   rratnam     08/04/00 - updated the LOB stream interface
+   rkasamse    08/07/00 - make getVector friend of Time
+   slari       07/31/00 - add const to Bytes methods
+   slari       07/25/00 - disable Bytes(Bytes *)
+   slari       07/23/00 - add Bytes
+   gayyappa    07/26/00 - update Timestamp, IntervalYM, IntervalDS.
+   gayyappa    07/04/00 - for fixing a problem in occiNumber
+   rratnam     06/13/00 - Updated LOB class headers
+   kmohan      05/31/00 - Change Environment to Environment * in 
+			  Date constructor
+   kmohan      05/29/00 - No string
+   rkasamse    04/25/00 - Added string class header
+   etucker     04/19/00 - Added CORE class headers
+   kmohan      04/11/00 - Creation
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCIDATA_ORACLE
+# define OCCIDATA_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+#ifndef OCCICONTROL_ORACLE
+#include <occiControl.h>
+#endif
+
+namespace oracle {
+namespace occi {
+class Bytes
+{
+ 
+ public:
+ 
+  Bytes(const Environment *env = NULL);      // default constructor
+ 
+  Bytes(unsigned char *value, unsigned int count, 
+            unsigned int offset = 0, const Environment *env = NULL); 
+
+  Bytes(const Bytes &e); // copy constructor
+
+ 
+                    // public methods
+ 
+  void getBytes(unsigned char *dst, unsigned int count, 
+                        unsigned int srcBegin = 0,
+                        unsigned int dstBegin = 0) const; 
+ 
+  unsigned int length() const;
+ 
+  unsigned char byteAt(unsigned int index) const;
+
+  bool isNull() const;
+ 
+  void setNull();
+
+  void operator=(const Bytes &other);
+ 
+  ~Bytes();
+
+private:
+                                // private data members
+  Bytes(OCIEnv *,OCIRaw *) ;
+  Bytes(Ptr<BytesImpl> bytesPtr) ;
+  Ptr<BytesImpl> ptr_;
+  friend class AnyDataImpl;
+  friend class aq::MessageImpl;
+  friend class aq::ProducerImpl;
+  friend class aq::SubscriptionImpl;
+  friend  void getVector(const AnyData &any, 
+                         OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+  friend  void setVector(AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Bytes> &vect) ;
+
+};
+ 
+class Bfile
+{
+  public :
+
+    Bfile();
+    Bfile(const Connection *connectionp) ;
+    Bfile(const Bfile &srcBfile) ;
+    ~Bfile();
+    unsigned int length() const ;
+    OCCI_STD_NAMESPACE::string getDirAlias() const ;
+    UString getUStringDirAlias() const ;
+    OCCI_STD_NAMESPACE::string getFileName() const ;
+    UString getUStringFileName() const ;
+    void setName(const OCCI_STD_NAMESPACE::string &dirAlias, 
+                 const OCCI_STD_NAMESPACE::string &fileName) ;
+    void setName(const UString &dirAlias, const UString &fileName) ;
+    bool fileExists() const ; 
+    Bfile& operator =(const Bfile &srcBfile) ;
+    bool operator ==(const Bfile &srcBfile) const ;
+    bool operator !=(const Bfile &srcBfile) const ;
+    void setNull() ;
+    bool isNull() const ;
+    bool isInitialized() const;
+    void open() ;
+    void close() ;
+    bool isOpen() const ;
+    unsigned int read(unsigned int  amt, unsigned char *buffer,
+      unsigned int  bufsize, unsigned int offset = 1) const ;
+    Stream* getStream(unsigned int offset = 1,
+      unsigned int amount =0)  ;
+    void closeStream(Stream *stream);
+
+  private:
+
+    //Data Members:
+
+    // pointer to the FILE locator
+    OCIBFileLocator *filep; 
+
+    // pointer to the ConnectionImpl instance
+    const ConnectionImpl *connp; 
+
+    // pointer to the LobStreamImpl instance obtained from this FILE
+    LobStreamImpl *streamp;
+
+    void *bfileExt;
+
+    //Enumerations:
+    enum {MAXDIRNAMELEN = 32, MAXFILENAMELEN = 256};
+
+    //Constructor: 
+    Bfile(const Connection *connectionp, 
+    OCIBFileLocator *locatorp, bool toCopy = true) ;
+  
+    //Methods:
+    OCIBFileLocator* getLocator() const;
+    void do_getDirAlias( void * dirAlias, ub2 * dirAliasLen) const ;
+    void do_getFileName( void * fileName, ub2 * fileNameLen) const ;
+    void do_setName( void * alias, ub2 aliasLen,
+                     void *fileName, ub2 fileNameLen);   
+  // Friends
+  friend class AnyDataImpl;
+  friend class StatementImpl;
+  friend class ResultSetImpl;
+  friend class Blob;
+  friend class Clob;
+  friend class aq::MessageImpl;
+
+  friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void getVector(Statement*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void getVector(ResultSet*, unsigned int , 
+  OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Bfile>&) ;
+  friend void do_setVectorOfBfile(Statement*, unsigned int, 
+  const OCCI_STD_NAMESPACE::vector<Bfile>&, void *, unsigned int, void *, unsigned int ) ;
+};
+
+class Blob
+{
+  public:
+
+    Blob();
+    Blob(const Connection *connectionp) ;
+    Blob(const Blob &srcBlob) ;
+    ~Blob();
+    unsigned int getChunkSize() const ;
+    unsigned int length() const ;
+    Blob& operator =(const Blob &srcBlob) ;
+    bool operator ==(const Blob &srcBlob) const ;
+    bool operator !=(const Blob &srcBlob) const ;
+    void setNull() ;
+    bool isNull() const ;
+    void setEmpty() ;
+    void setEmpty(const Connection *connectionp) ;
+    bool isInitialized() const;
+    void open(LobOpenMode mode=OCCI_LOB_READWRITE) ;
+    void close() ;
+    bool isOpen() const ;
+    void copy(const Blob &srcBlob, unsigned int numBytes,
+      unsigned int  dstOffset =1, unsigned int srcOffset =1) ;
+    void copy(const Bfile &srcBfile, unsigned int numBytes,
+      unsigned int  dstOffset =1, unsigned int srcOffset =1) ;
+    void append(const Blob &srcBlob) ;
+    unsigned int read(unsigned int  amt, unsigned char *buffer,
+      unsigned int  bufsize, unsigned int offset = 1) const ;
+    unsigned int write(unsigned int amt, unsigned char *buffer,
+      unsigned int bufsize, unsigned int offset = 1) ;
+    unsigned int writeChunk(unsigned int amt, unsigned char *buffer,
+      unsigned int bufsize, unsigned int offset = 1) ;
+    void trim(unsigned int newlen) ;
+    Stream* getStream(unsigned int offset = 1,
+      unsigned int amount =0)  ;
+    void closeStream(Stream *stream);
+
+  private:
+
+    //Data Members:
+
+    // pointer to the BLOB locator
+    OCIBlobLocator *lobp; 
+
+    // pointer to the ConnectionImpl instance
+    const ConnectionImpl *connp; 
+
+    // pointer to the LobStreamImpl instance obtained from this LOB
+    LobStreamImpl *streamp; 
+
+    //for future use !
+    void *blobExt;
+
+    //Constructor: 
+    Blob(const Connection *connectionp, 
+    OCIBlobLocator *locatorp, bool toCopy=true) ;
+
+    //Methods:
+    OCIBlobLocator* getLocator() const;
+
+  // Friends
+  friend class AnyDataImpl;
+  friend class StatementImpl;
+  friend class ResultSetImpl;
+
+  friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void getVector(Statement*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void getVector(ResultSet*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Blob>&) ;
+  friend void do_setVectorOfBlob(Statement*, unsigned int, 
+  const OCCI_STD_NAMESPACE::vector<Blob>&, void *, unsigned int, void *, unsigned int ) ;
+};
+
+class Clob
+{
+  public:
+
+    Clob();
+    Clob(const Connection *connectionp) ;
+    Clob(const Clob &srcClob) ;
+    ~Clob();
+    unsigned int getChunkSize() const ;
+    unsigned int length() const ;
+    OCCI_STD_NAMESPACE::string getCharSetId() const;
+    CharSetForm getCharSetForm() const;
+    void setCharSetId( const OCCI_STD_NAMESPACE::string &charset) ;
+    void setCharSetForm( CharSetForm csfrm) ;
+    Clob& operator =(const Clob &srcClob) ;
+    bool operator ==(const Clob &srcClob) const ;
+    bool operator !=(const Clob &srcClob) const ;
+    void setNull() ;
+    bool isNull() const ;
+    void setEmpty() ;
+    void setEmpty(const Connection *connectionp) ;
+    bool isInitialized() const;
+    void open(LobOpenMode mode=OCCI_LOB_READWRITE) ;
+    void close() ;
+    bool isOpen() const ;
+    void copy(const Clob &srcClob, unsigned int numBytes,
+              unsigned int  dstOffset = 1, unsigned int srcOffset = 1) ;
+    void copy(const Bfile &srcBfile, unsigned int numBytes,
+              unsigned int  dstOffset = 1, unsigned int srcOffset = 1) ;
+    void append(const Clob &srcClob) ;
+    unsigned int read(unsigned int  amt, unsigned char *buffer,
+                      unsigned int  bufsize,  unsigned int offset = 1) const;
+    unsigned int read(unsigned int  amt, utext *buffer,
+                      unsigned int  bufsize,  unsigned int offset = 1) const;
+    unsigned int write(unsigned int amt, unsigned char *buffer,
+                       unsigned int bufsize,  unsigned int offset = 1 );
+    unsigned int write(unsigned int amt, utext *buffer,
+                       unsigned int bufsize,  unsigned int offset = 1 );
+    unsigned int writeChunk(unsigned int amt, unsigned char *buffer,
+                            unsigned int bufsize, unsigned int offset = 1 );
+    unsigned int writeChunk(unsigned int amt, utext *buffer,
+                            unsigned int bufsize, unsigned int offset = 1 );
+    void trim(unsigned int newlen) ;
+    Stream* getStream(unsigned int offset = 1,
+      unsigned int amount =0 );
+    void closeStream(Stream *stream);
+    
+    UString getCharSetIdUString() const;
+    void setCharSetIdUString( const UString &charset) ;
+
+  private:
+
+    //Data Members:
+
+    // pointer to the CLOB locator
+    OCIClobLocator *lobp; 
+
+    // pointer to the ConnectionImpl instance
+    const ConnectionImpl *connp; 
+
+    // pointer to the LobStreamImpl instance obtained from this LOB
+    LobStreamImpl *streamp; 
+
+    //charset id
+    ub2 charsetId;
+
+    //charset form
+    CharSetForm charsetForm;
+
+    //for future use !
+    void *clobExt;
+
+    //Constructor: 
+    Clob(const Connection *connectionp, 
+    OCIClobLocator *locatorp, bool toCopy =true ) ;
+
+    //Methods:
+    OCIClobLocator* getLocator() const;
+    unsigned int do_read( unsigned int amt, void *buffer, 
+    unsigned int bufsize, unsigned int offset) const;
+    unsigned int do_write( unsigned int amt, void *buffer, 
+    unsigned int bufsize, unsigned int offset) ;
+    unsigned int do_writeChunk( unsigned int amt, void *buffer, 
+    unsigned int bufsize, unsigned int offset) ;
+   
+  // Friends
+  friend class AnyDataImpl;
+  friend class StatementImpl;
+  friend class ResultSetImpl;
+
+  friend void getVector(const AnyData&, OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void getVector(Statement*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void getVector(ResultSet*, unsigned int, 
+  OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void setVector(AnyData&, const OCCI_STD_NAMESPACE::vector<Clob>&) ;
+  friend void do_setVectorOfClob(Statement*, unsigned int, 
+  const OCCI_STD_NAMESPACE::vector<Clob>&, void *, unsigned int, void *, unsigned int ) ;
+};
+
+class Number
+{
+ 
+ public:
+
+ // Constructors
+  /* default constructor added  */
+  Number();
+  Number(const Number &srcNum);
+  Number(long double val) ;
+  Number(double val) ;
+  Number(float val) ;
+  Number(long val) ;
+  Number(int val) ;
+  Number(short val) ;
+  Number(char val) ;
+  Number(signed char val);
+  Number(unsigned long val) ;
+  Number(unsigned int val) ;
+  Number(unsigned short val) ;
+  Number(unsigned char val) ;
+
+  ~Number();
+  // Methods
+  const Number abs() const ;
+  // unary negate
+  const Number operator-() ;
+  // unary increment
+  Number& operator++() ;
+  const Number operator++(int) ;
+  // unary decrement
+  Number& operator--() ;
+  const Number operator--(int) ;
+  // assigment operator
+  Number& operator=(const Number &a);
+  // add and assign
+  Number& operator+=(const Number &a) ;
+  // subtract and assign
+  Number& operator-=(const Number &a) ;
+  // Mulitply an assign
+  Number& operator*=(const Number &a) ;
+   // divide and assign
+  Number& operator/=(const Number &a) ;
+  // Modulo and assign
+  Number& operator%=(const Number &a) ;
+  // casting operators
+  operator long() const;
+  operator int() const;
+  operator short() const;
+  operator char() const;
+  operator signed char() const;
+  operator unsigned long() const;
+  operator unsigned int() const;
+  operator unsigned short() const;
+  operator unsigned char() const;
+  operator long double() const;
+  operator double() const;
+  operator float() const;
+  // Decimal shift
+  const Number shift(int val) const ;
+  // Integer Power
+  const Number intPower(int val) const ;
+  const Number ceil() const ;
+  const Number floor() const ;
+  const Number squareroot() const ;
+  const int sign() const ;
+  // conversion routines
+  //  Format Number and return as a OCCI_STD_NAMESPACE::string
+  OCCI_STD_NAMESPACE::string toText(const Environment *envp,
+                const OCCI_STD_NAMESPACE::string &fmt,const OCCI_STD_NAMESPACE::string &nlsParam="") const
+                ;
+  UString toText(const Environment *envp,
+                const UString &fmt,const UString &nlsParam) const
+                ;
+  // Create an Number from formatted text
+  void fromText(const Environment *envp,const OCCI_STD_NAMESPACE::string &number,
+                const OCCI_STD_NAMESPACE::string &fmt, const OCCI_STD_NAMESPACE::string &nlsParam = "")
+               ;
+  void fromText(const Environment *envp,
+  const UString &number, 
+  const UString &fmt, const UString &nlsParam);
+  void fromBytes(const Bytes &s) ;
+  Bytes toBytes() const;
+  // truncate digits
+  const Number trunc(int decplace) const ;
+   // round to the decplace place.
+  const Number round(int decplace) const ;
+  // returns an Number with digits decimal digits
+  const Number prec(int digits) const ;
+  const Number sin() const ;
+  const Number cos() const ;
+  const Number tan() const ;
+  const Number hypSin() const ;
+  const Number hypCos() const ;
+  const Number hypTan() const ;
+  const Number arcSin() const ;
+  const Number arcCos() const ;
+  const Number arcTan() const ;
+  const Number arcTan2(const Number &val) const;
+  const Number power(const Number &val) const;
+  const Number exp() const ;
+  const Number ln() const ;
+  const Number log(const Number &val) const;
+  bool isNull() const;
+  void setNull();
+ private:
+  /* Private constructor for constructing number from methods inside  */
+  Number(const OCINumber &result);
+  OCINumber getOCINumber() const;
+
+  OCINumber data;
+  /* a flag to indicate if the  Number  is null */
+  bool numberIsNull;
+  void *numberExt;
+
+  // a >= b
+  friend bool operator>=(const Number &a, const Number &b);
+  // a < = b
+  friend bool operator<=(const Number &a, const Number &b);
+  // a > b
+  friend bool operator>(const Number &a, const Number &b);
+  // a < b
+  friend bool operator<(const Number &a, const Number &b);
+
+  friend class IntervalDS;
+  friend class IntervalYM;
+  friend const IntervalYM operator*(const IntervalYM &a,
+  const Number& factor) ;
+  friend const IntervalDS operator*(const IntervalDS &a,
+  const Number& factor) ;
+  friend const IntervalYM operator/(const IntervalYM &a,
+  const Number &factor) ;
+  friend const IntervalDS operator/(const IntervalDS &a,
+  const Number &factor) ;
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend class AnyDataImpl;
+  friend void getVector(const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<Number> &vect);
+  friend void setVector(AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  friend Number MetaData::getNumber(MetaData::AttrId attrid)          const ;
+  friend void getVector(Statement  *stmt, unsigned int paramIndex,
+  OCCI_STD_NAMESPACE::vector<Number> &vect) ;
+  friend void do_setVectorOfNumber(Statement *stmt, unsigned int paramIndex,
+  const OCCI_STD_NAMESPACE::vector<Number> &vect, void *schemaName, unsigned int schemaNameLen,
+  void *typeName, unsigned int typeNameLen);
+  friend void getVector(ResultSet  *rs, unsigned int colIndex,
+  OCCI_STD_NAMESPACE::vector<Number> &vect);
+
+};
+
+class Date
+{
+ public:
+
+  // Constructors
+  Date();
+  Date(const Date &a);
+  Date(const Environment *envp,int year = 1,unsigned int month = 1,
+           unsigned int day = 1,unsigned  int hour = 0,
+           unsigned int minute = 0, unsigned int seconds = 0);
+  ~Date();
+  // Methods
+
+  void setDate(int year = 1,unsigned int month = 1,unsigned int day = 1,
+               unsigned int hour = 0,unsigned int minute = 0,
+               unsigned int seconds = 0);
+  void getDate(int &year,unsigned int &month,unsigned int &day,
+           unsigned int &hour ,unsigned int &min ,unsigned int &sec) const;
+  Bytes toBytes() const ;
+  void fromBytes(const Bytes &byteStream, 
+  const Environment *envp = NULL);
+  OCCI_STD_NAMESPACE::string toText(
+                 const OCCI_STD_NAMESPACE::string &fmt = "",
+                 const OCCI_STD_NAMESPACE::string &nlsParam = "") const;
+  UString toText(
+                 const UString &fmt ,
+                 const UString &nlsParam ) const;
+  void fromText(const OCCI_STD_NAMESPACE::string &datestr,
+                const OCCI_STD_NAMESPACE::string &fmt = "",
+                const OCCI_STD_NAMESPACE::string &nlsParam = "",
+                const Environment *envp = NULL);
+  void fromText(const UString &datestr,
+                const UString &fmt , const UString &nlsParam ,
+                const Environment *envp = NULL);
+  Date toZone(const OCCI_STD_NAMESPACE::string &zone1, const OCCI_STD_NAMESPACE::string &zone2) const;
+  Date& operator=(const Date &d);
+  Date addMonths(int i) const;
+  Date addDays(int i) const ;
+  Date lastDay() const ;
+  IntervalDS daysBetween(const Date &d) const;
+  Date nextDay(const OCCI_STD_NAMESPACE::string &dow) const;
+  Date nextDay(const UString &dow) const;
+  bool isNull() const;
+  void setNull();
+  static Date getSystemDate(const Environment *envp) ;
+
+ private:
+  OCIDate date;
+  OCIEnv *envhp;
+  bool dateIsNull;
+  void *dateExt;
+
+  /* private constructor */
+  Date(OCIEnv *envp,OCIDate dateval);
+  OCIDate getOCIDate() const;
+  void do_toText( void * fmt, ub1 fmtLen, void * nlsParam, 
+                  ub4 nlsParamLen, void * buf, ub4 * bufLen, 
+                  bool isUTF16) const;
+  void do_fromText( void * datestr, ub4 datestrLen,
+                  void * fmt, ub1 fmtLen,
+                  void * nlsParam, ub4 nlsParamLen,
+                  const Environment * envp,
+                  bool isUTF16);
+  Date do_nextDay( void * dow, size_t dowLen, bool isUTF16) const;
+  void constructHourAndMinute(sb4 &seconds, sb4 &hours, sb4 &minutes) const;
+  friend bool operator==(const Date &a,const Date &b);
+  friend bool operator>(const Date &a,const Date &b);
+  friend bool operator<(const Date &a,const Date &b);
+  friend bool operator!=(const Date &a,const Date &b);
+  friend bool operator>=(const Date &a,const Date &b);
+  friend bool operator<=(const Date &a,const Date &b);
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend class AnyDataImpl;
+  friend class aq::MessageImpl;
+  friend void getVector(const AnyData &any, 
+                        OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+  friend void setVector(AnyData &any, 
+                        const OCCI_STD_NAMESPACE::vector<Date> &vect);
+  friend void getVector(Statement  *stmt, unsigned int paramIndex,
+   OCCI_STD_NAMESPACE::vector<Date> &vect)  ;
+  friend void do_setVectorOfDate(Statement *stmt, unsigned int paramIndex, 
+   const OCCI_STD_NAMESPACE::vector<Date> &vect, void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+  friend void getVector(ResultSet  *rs, unsigned int colIndex, 
+  OCCI_STD_NAMESPACE::vector<Date> &vect) ;
+
+}; //class Date
+
+class Timestamp
+{
+  public:
+  Timestamp() ;
+
+  Timestamp( const Environment *env, int year=1,
+             unsigned int month=1, unsigned int day=1, unsigned int hour=0,
+             unsigned int min=0 ,unsigned int sec=0, unsigned int fs=0, 
+             int tzhour=0, int tzmin=0) ;
+  Timestamp( const Environment *env, int year,
+             unsigned int month, unsigned int day, unsigned int hour,
+             unsigned int min ,unsigned int sec, unsigned int fs, 
+             const OCCI_STD_NAMESPACE::string &timezone);
+  Timestamp( const Environment *env, int year,
+             unsigned int month, unsigned int day, unsigned int hour,
+             unsigned int min ,unsigned int sec, unsigned int fs, 
+             const UString &timezone);
+  Timestamp( const Timestamp &src) ;
+  ~Timestamp();
+
+  void getTimeZoneOffset( int &hour, int &minute) const ;
+  void getTime( unsigned int &hour, unsigned int &minute,
+  unsigned int &second, unsigned int &fs) const ;
+  void getDate( int &year, unsigned int &month, unsigned int &day )const ;
+  OCCI_STD_NAMESPACE::string toText(const OCCI_STD_NAMESPACE::string &fmt, 
+                     unsigned int fsprec, 
+                     const OCCI_STD_NAMESPACE::string &nlsParam ="") const   ;
+  UString toText(const UString &fmt, 
+                 unsigned int fsprec, const UString &nlsParam ) const   ;
+  void setTimeZoneOffset( int hour,  int minute)  ;
+  void setTime( unsigned int hour, unsigned int minute,
+  unsigned int second, unsigned int fs)  ;
+  void setDate( int year, unsigned int month, unsigned int day ) ;
+  void setNull() ;
+  void fromText( const OCCI_STD_NAMESPACE::string &timestmpStr, 
+                 const OCCI_STD_NAMESPACE::string &fmt ,
+                 const OCCI_STD_NAMESPACE::string &nlsParam= "", 
+                 const Environment *env =NULL);
+  void fromText( const UString &timestmpStr, 
+                 const UString &fmt , const UString &nlsParam, 
+                 const Environment *env =NULL);
+  bool isNull() const;
+  Timestamp & operator =( const Timestamp &src) ;
+  const IntervalYM subYM(const Timestamp& val) const ;
+  const IntervalDS subDS(const Timestamp& val) const ;
+  const Timestamp intervalAdd(const IntervalDS& val) const ;
+  const Timestamp intervalSub(const IntervalDS& val) const ;
+  const Timestamp intervalAdd(const IntervalYM& val) const ;
+  const Timestamp intervalSub(const IntervalYM& val) const ;
+
+  friend bool operator==(const Timestamp &a,const Timestamp &b);
+  friend bool operator>(const Timestamp &a,const Timestamp &b);
+  friend bool operator<(const Timestamp &a,const Timestamp &b);
+  friend bool operator !=(const Timestamp &a,const Timestamp &b);
+  friend bool operator >=(const Timestamp &a,const Timestamp &b);
+  friend bool operator <=(const Timestamp &a,const Timestamp &b);
+
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend class AnyDataImpl;
+
+  private:
+   OCIDateTime *ocidatetime;
+   OCIEnv *ocienv;
+   void *timestampExt;
+
+   OCIDateTime *getOCIDateTime() const;
+   Timestamp( OCIEnv *env, OCIDateTime *dt, bool toCopy = true) ;
+   void allocateDataMembers( OCIEnv *env) ;
+   void do_TimestampConstruct( const Environment *env, int year, 
+   unsigned int month, unsigned int day, unsigned int hour, unsigned int min, 
+   unsigned int sec, unsigned int fs, void *tzinter);
+
+   friend  void getVector(const AnyData &any,
+   OCCI_STD_NAMESPACE::vector<Timestamp> &vect);
+   friend  void setVector(AnyData &any, 
+   const OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+   friend Timestamp MetaData::getTimestamp(
+   MetaData::AttrId attrid) const ;
+   friend void getVector(ResultSet  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+   friend void getVector(Statement  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<Timestamp> &vect) ;
+   friend void do_setVectorOfTimestamp(Statement *stmt, unsigned int paramIndex,
+   const OCCI_STD_NAMESPACE::vector<Timestamp> &vect, void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+}; // class Timestamp
+
+class IntervalDS
+{
+
+  public:
+  IntervalDS() ;
+  IntervalDS( const Environment *env,int day=0, 
+  int hour=0, int minute=0, int second=0, 
+  int fs=0) ;
+  IntervalDS( const IntervalDS &src) ;
+
+  ~IntervalDS();
+
+  int getDay () const ;
+  int getHour () const ;
+  int getMinute () const ;
+  int getSecond() const ;
+  int getFracSec () const ;
+  void set( int day, int hour, int minute, int second, int fracsec) ;
+  void setNull() ;
+  void fromText( const OCCI_STD_NAMESPACE::string &inpstr, const OCCI_STD_NAMESPACE::string &nlsParam ="",
+  const Environment *env=NULL)  ;
+  OCCI_STD_NAMESPACE::string toText( unsigned int lfprec, unsigned int fsprec,
+  const OCCI_STD_NAMESPACE::string &nlsParam="") const ;
+  bool isNull() const;
+  IntervalDS& operator =( const IntervalDS &src) ;
+  IntervalDS& operator +=( const IntervalDS &a);
+  IntervalDS& operator -=( const IntervalDS &a);
+  IntervalDS& operator *=( const Number &factor);
+  IntervalDS& operator /=( const Number &factor);
+
+  friend bool operator>(const IntervalDS &a,
+  const IntervalDS &b) ;
+  friend bool operator<(const IntervalDS &a,
+  const IntervalDS &b) ;
+  friend bool operator >=( const IntervalDS &a, 
+  const IntervalDS &b);
+  friend bool operator <=( const IntervalDS &a, 
+  const IntervalDS &b);
+  
+  //UTF16 support
+  void fromUText( const UString &inpstr, const Environment *env=NULL );
+  UString toUText( unsigned int lfprec, unsigned int fsprec) const;
+
+  private:
+   OCIInterval *ociinter;
+   OCIEnv *ocienv;
+   void *intervalDSExt;
+
+   IntervalDS( OCIEnv *env, OCIInterval *inter, bool toCopy = true) ;
+   OCIInterval * getOCIInterval() const;
+
+   void allocateDataMembers( OCIEnv *env) ;
+   friend const IntervalDS Timestamp::subDS(
+   const Timestamp& val) const ;
+   friend const Timestamp Timestamp::intervalAdd(
+   const IntervalDS& val) const ;
+   friend const Timestamp Timestamp::intervalSub(
+   const IntervalDS& val) const ;
+   friend class Date;
+   friend void getVector(ResultSet  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+   friend void getVector(Statement  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+   friend void do_setVectorOfIntervalDS(Statement *stmt, unsigned int paramIndex,
+   const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect, void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+   friend class StatementImpl;
+   friend class ResultSetImpl;
+   friend class AnyDataImpl;
+   friend  void getVector(const AnyData &any,
+   OCCI_STD_NAMESPACE::vector<IntervalDS> &vect);
+   friend  void setVector(AnyData &any,
+   const OCCI_STD_NAMESPACE::vector<IntervalDS> &vect) ;
+
+ 
+};  //class IntervalDS
+
+class IntervalYM
+{
+
+  public:
+  IntervalYM() ;
+  IntervalYM( const Environment *env,int year=0, int month=0) ;
+  IntervalYM( const IntervalYM &src) ;
+  ~IntervalYM();
+
+  int getYear() const ;
+  int getMonth() const ;
+
+  void set( int year, int month) ;
+  void setNull() ;
+  void fromText( const OCCI_STD_NAMESPACE::string &inpstr, const OCCI_STD_NAMESPACE::string &nlsParam="",
+  const Environment *env=NULL) ;
+  OCCI_STD_NAMESPACE::string toText( unsigned int lfprec, const OCCI_STD_NAMESPACE::string &nlsParam="") const;
+  bool isNull() const;
+  IntervalYM & operator =( const IntervalYM &src) ;
+  IntervalYM& operator +=( const IntervalYM &a);
+  IntervalYM& operator -=( const IntervalYM &a);
+  IntervalYM& operator *=( const Number &factor);
+  IntervalYM& operator /=( const Number &factor);
+
+  friend bool operator>(const IntervalYM &a, const IntervalYM &b) ;
+  friend bool operator<( const IntervalYM &a, const IntervalYM &b) ;
+  friend bool operator >=(const IntervalYM &a, const IntervalYM &b);
+  friend bool operator <=(const IntervalYM &a, const IntervalYM &b);
+  
+  //UTF16 support
+  void fromUText( const UString &inpstr, const Environment *env=NULL );
+  UString toUText( unsigned int lfprec ) const;
+
+  private:
+   OCIInterval *ociinter;
+   OCIEnv *ocienv;
+   void *intervalYMExt;
+
+   IntervalYM( OCIEnv *env, OCIInterval *inter, bool toCopy = true) ;
+   OCIInterval *getOCIInterval() const;
+   void allocateDataMembers( OCIEnv *env) ;
+   friend const IntervalYM Timestamp :: subYM(
+   const Timestamp& val) const ;
+   friend const Timestamp Timestamp::intervalAdd(
+   const IntervalYM &val) const ;
+   friend const Timestamp Timestamp::intervalSub(
+   const IntervalYM &val) const ;
+
+   friend void getVector(ResultSet  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+   friend void getVector(Statement  *rs, unsigned int,
+   OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+   friend void do_setVectorOfIntervalYM(Statement *stmt, unsigned int paramIndex,
+   const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect, void *schemaName, unsigned int schemaNameLen,
+   void *typeName, unsigned int typeNameLen) ;
+
+   friend class StatementImpl;
+   friend class ResultSetImpl;
+   friend class AnyDataImpl;
+   friend  void getVector(const AnyData &any,
+   OCCI_STD_NAMESPACE::vector<IntervalYM> &vect);
+   friend  void setVector(AnyData &any,
+   const OCCI_STD_NAMESPACE::vector<IntervalYM> &vect) ;
+
+}; //class IntervalYM
+
+
+Number operator+(const Number &a, const Number &b) ;
+Number operator/(const Number &dividend, const Number &divisor) ;
+Number operator*(const Number &a, const Number &b) ;
+Number operator%(const Number &a, const Number &b) ;
+Number operator-(const Number &subtrahend, const Number &subtractor) ;
+bool operator==(const Number &a, const Number &b);
+bool operator!=(const Number &a, const Number &b);
+
+const IntervalYM operator+(const IntervalYM &a, const IntervalYM &b) ;
+const IntervalYM operator-(const IntervalYM &a, const IntervalYM &b) ;
+const IntervalYM operator*(const IntervalYM &a, const Number& factor);
+const IntervalYM operator/(const IntervalYM &a, const Number &factor);
+bool operator==(const IntervalYM &a, const IntervalYM &b) ;
+bool operator!=(const IntervalYM &a, const IntervalYM &b) ;
+
+const IntervalDS operator+(const IntervalDS &a, const IntervalDS &b) ;
+const IntervalDS operator-(const IntervalDS &a, const IntervalDS &b) ;
+const IntervalDS operator*(const IntervalDS &a, const Number& factor);
+const IntervalDS operator/(const IntervalDS &a, const Number &factor);
+bool operator==(const IntervalDS &a, const IntervalDS &b) ;
+bool operator!=(const IntervalDS &a, const IntervalDS &b) ;
+
+
+typedef struct BFloat
+{
+ float value;
+ bool  isNull;
+
+ BFloat()
+ {
+   isNull = false;
+   value = 0.;
+ }
+} BFloat;
+
+typedef struct BDouble
+{
+ double value;
+ bool   isNull;
+
+ BDouble()
+ {
+   isNull = false;
+   value = 0.;
+ }
+} BDouble;
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif                                              /* OCCIDATA_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/occiObjects.h b/src/terralib/drivers/OracleSpatial/OCI/include/occiObjects.h
new file mode 100644
index 0000000..35d0c0e
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/occiObjects.h
@@ -0,0 +1,990 @@
+/* Copyright (c) 2000, 2003, Oracle Corporation.  All rights reserved.  */
+
+/* 
+   NAME 
+     occiObjects.h - header file for OCCI object classes
+
+   DESCRIPTION 
+     Class definitions for Ref, RefAny, AnyData
+
+   RELATED DOCUMENTS 
+     <note any documents related to this facility>
+ 
+   EXPORT FUNCTION(S) 
+     <external functions declared for use outside package - one-line 
+     descriptions>
+
+   INTERNAL FUNCTION(S)
+     <other external functions declared - one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   cparampa    10/28/03 - add PObject::getSQLTypeName
+   shiyer      01/01/03 - add PObject::refresh
+   cparampa    02/19/03 - bug2732941-setFromRef takes schema and typename
+   rvallam     02/12/03 - modify Bfloat/Bdouble interface to use the new
+                          Bfloat/Bdouble type
+   rvallam     11/19/02 - objects support for interval classes
+   cparampa    12/26/02 - Added getType for AnyData,
+                          removed getAs/setFrom methods for Blob/Clob
+   cparampa    10/12/02 - making AnyData a public type
+   rvallam     10/12/02 - added method getCor to get the COR handle and the 
+                          setPinnedObject method - arrayPin 
+   rvallam     10/10/02 - objects performance enhancement - modified
+                          getObject and getVector<T *> to take the
+                          schName and typeName of the object
+   rvallam     10/11/02 - added native float/double API - get(set) methods
+                          for AnyData class
+   shiyer      09/17/02 - Refs performance improvement
+   shiyer      08/14/02 - 10iR1, OCCI Globalization support
+   aahluwal    06/04/02 - bug 2360115
+   vvinay      12/24/01 - declarations for setNull() and isClear() in RefImpl
+   rvallam     11/17/01 - implemented transactional consistency of refs
+   gayyappa    10/01/01 - reserve memory for vectors in set/getVector 
+   rkasamse    07/31/01 - add PObject::new(size_t, void*)
+   gayyappa    07/17/01 - use C style comment in end of #ifdef WIN32COMMON.
+   gayyappa    06/20/01 - fix linux porting bug 1801312.
+   rvallam     06/14/01 - replace call to get(set)VectorOfRefs in 
+                          get(set)Vector for Ref<T> with code in 
+                          get(set)VectorOfRefs
+   rvallam     11/06/01 - renamed internal methods in get/setVector to 
+                          get(set)VectorOfPObjects/get(set)VectorOfOCIRefs
+                          as part of NT porting fix
+                          added destructor to AnyData
+   rratnam     06/07/01 - fixed bug 1816387.
+   rvallam     06/07/01 - fixed bug 1811749 :replaced .data() to .c_str()
+                          for string to char* conversion.
+   rvallam     04/30/01 - modified const methods in Ref (->, *, ptr)
+   rvallam     04/12/01 - passed dummy argument OCCIPOBJECT in getVector
+                          of AnyData for PObject *
+   rvallam     04/09/01 - fixed bug 1721365- call RefAny default constructor
+                          for a NULL Ref in operator RefAny
+   gayyappa    03/29/01 - remove methods for get/set int/float/double/unsigned 
+                          int , wasLastAttrNull, setAttrNull , geSQLTypeName
+                          from AnyData 
+                          as OTT does not use them.
+   gayyappa    03/15/01 - add OCCItype parameter to getVector for OCCIRef.
+   rratnam     03/15/01 - fixed set and getRef / get and setVector for NULL 
+                          Refs, fixed NT compilation errors
+   rratnam     03/13/01 - changed AnyData constructor to take a freeImg flag,
+   rkasamse    03/15/01 - pass OCCI_SQLT_REF to getVector
+   chliang     03/05/01 - disable olint.
+   rvallam     03/01/01 - changed getSessionPtr() to getConnection()
+                          added const methods for dereferencing in Ref
+   gayyappa    02/23/01 - correct template code for setVector
+   gayyappa    12/13/00 - remove allocator from list member for PObject.
+                          bug#1529973
+                          nullify object pointer in clear method of Ref
+   rvallam     11/08/00 - make RefAny constructor public
+   gayyappa    08/21/00 - replace objPtr by objptr.
+                          move templated get/set vector code of anydata 
+                          to header.
+   rkasamse    08/07/00 - make getVector friend of RefAny
+   rkasamse    07/11/00 - take void* instead of AnyDataCtx*
+   rkasamse    07/26/00 - make ResultSetImp friend of RefAny
+   rratnam     06/19/00 - added getConnection in PObject 
+   rvallam     06/13/00 - added Ref<T> and occiRefImpl code
+   rvallam     06/05/00 - to add the Ref<T> code
+   kmohan      06/02/00 -
+   kmohan      05/31/00 - Datamember Connection * changed to ConnectionImpl * 
+                          in class RefAny
+   kmohan      04/11/00 - Ref, RefAny, AnyData class definitions
+                          added
+   rkasamse    04/03/00 - header (interface) files for OCCI Objects clases
+   rkasamse    04/03/00 - Creation
+
+*/
+
+#ifndef _olint   /* disable olint check */
+
+#ifndef OCCIOBJECTS_ORACLE
+# define OCCIOBJECTS_ORACLE
+
+#ifndef OCCICOMMON_ORACLE
+#include <occiCommon.h>
+#endif
+
+namespace oracle {
+namespace occi {
+struct AnyDataCtx {
+   ConnectionImpl *occiSession;
+   OCIAnyData *anyData;
+   dvoid *objHeader;
+   ub4 errNum;
+};
+typedef struct AnyDataCtx AnyDataCtx;
+
+class PObject
+{
+  public:
+        enum LockOption {OCCI_LOCK_WAIT, OCCI_LOCK_NOWAIT};
+        enum UnpinOption {OCCI_PINCOUNT_DECR, OCCI_PINCOUNT_RESET};
+        static void destroy(void *);
+        static void refresh(void *); 
+        PObject();
+        PObject(const void *ctx);
+        PObject(const PObject& obj);
+        virtual ~PObject();
+        PObject& operator=(const PObject& obj);
+        void *operator new(size_t size);
+        void *operator new(size_t size, const Connection *x,
+                           const OCCI_STD_NAMESPACE::string& tablename, 
+                           const char *typeName);
+        void *operator new(size_t size, const Connection *sess,
+               const OCCI_STD_NAMESPACE::string& tablename,
+               const OCCI_STD_NAMESPACE::string& typName ,
+               const OCCI_STD_NAMESPACE::string& schTabName="",
+               const OCCI_STD_NAMESPACE::string& schTypName = "");
+        void *operator new(size_t size, const Connection *sess,
+               const UString& tablename, const UString &typName,
+               const UString& schTabName, const UString& schTypName);
+        void *operator new(size_t size, void *adctx);
+        void operator delete(void *obj, size_t size);
+        RefAny getRef() const;
+        bool isLocked() const;
+        void unpin(UnpinOption mode=OCCI_PINCOUNT_DECR);
+        void pin();
+        void lock(PObject::LockOption lock_option);
+        void unmark();
+        void flush();
+        void markDelete();
+        void markModified();
+        bool isNull() const;
+        void setNull();
+        const Connection *getConnection() const;
+        virtual OCCI_STD_NAMESPACE::string getSQLTypeName() const = 0;
+        virtual void getSQLTypeName(Environment *env, void **schName,
+                     unsigned int &schNameLen, void **typeName,
+                     unsigned int &typeNameLen) const = 0;
+        void getSQLTypeName(Environment *env, void *(*rSQL)(void *),
+                            void **schname, unsigned int &schnamelen,
+                            void **typname, unsigned int &typnamelen) const;
+        virtual void writeSQL(AnyData& stream) = 0;
+        virtual void readSQL(AnyData& stream) = 0;
+  private:
+       static void initialise( void * obj, const Connection * sess,
+              void *schTabName, unsigned int schTabLen,
+              void *tableName, unsigned int tabLen,
+              void *schTypName, unsigned int schTypLen,
+              void *typeName, unsigned int typLen);
+
+        ConnectionImpl  *occiSession_;
+        dvoid *objHeader_;
+        ub2 customNewed_;
+        enum {CUSTOM_NEWED = 0x5cde};
+        ub2 flags_;
+        enum {NULL_INFO = 0x0001, GARBAGE_COLLECTED = 0x0002,
+              REFRESH_OBJECT = 0x0004};
+        // for future use 
+        void *pobjectExt;
+        friend class RefImpl;
+};
+
+class AnyData
+{
+    public:
+    ~AnyData();
+    AnyData(void *any) ;
+    AnyData(const Connection *sessp);
+    AnyData(const Connection *sessp, OCIAnyData *any, bool freeImg = true) ; 
+ 
+    AnyData(const AnyData &src);
+    AnyData& operator = (const AnyData &src);
+
+    OCIAnyData* getOCIAnyData() const;
+    const Connection* getConnection() const;
+
+
+    bool isNull() const ;
+    void setNull() ;
+    OCCI_STD_NAMESPACE::string getString() const ;
+    UString getUString() const ;
+    Blob getBlob() const ;
+    Clob getClob() const ;
+    Bfile getBfile() const ;
+    BFloat  getBFloat() const ;
+    BDouble getBDouble() const ;
+    Number getNumber() const ;
+    Bytes getBytes() const ;
+    Date getDate() const ;
+    Timestamp getTimestamp() const ;
+    IntervalYM getIntervalYM() const ;
+    IntervalDS getIntervalDS() const ;
+    PObject *getObject(void *(*rSQL)(void *)) const ;
+    RefAny getRef() const ;
+
+    void setString(const OCCI_STD_NAMESPACE::string &str)  ;
+    void setUString(const UString &str)  ;
+    void setBlob(const Blob &blob) ;
+    void setClob(const Clob &clob) ;
+    void setBfile(const Bfile &bfile) ;
+    void setBFloat(const BFloat &n) ;
+    void setBDouble(const BDouble &n) ;
+    void setNumber(const Number &n) ;
+    void setBytes(const Bytes &bytes) ;
+    void setDate(const Date &date) ;
+    void setTimestamp(const Timestamp &timestamp)  ;
+    void setIntervalYM(const IntervalYM &intervalym)  ;
+    void setIntervalDS(const IntervalDS &intervalds)  ;
+    void setObject(const PObject *objptr) ;
+    void setRef(const RefAny &ref) ;
+
+    void setFromString(const OCCI_STD_NAMESPACE::string &str)  ;
+    void setFromBfile(const Bfile &bfile) ;
+    void setFromBFloat(const BFloat &n) ;
+    void setFromBDouble(const BDouble &n) ;
+    void setFromNumber(const Number &n) ;
+    void setFromBytes(const Bytes &bytes) ;
+    void setFromDate(const Date &date) ;
+    void setFromTimestamp(const Timestamp &timestamp)  ;
+    void setFromIntervalYM(const IntervalYM &intervalym)  ;
+    void setFromIntervalDS(const IntervalDS &intervalds)  ;
+    void setFromObject(const PObject *objptr) ;
+    void setFromRef(const RefAny &ref,
+                    const OCCI_STD_NAMESPACE::string &typname,
+                    const OCCI_STD_NAMESPACE::string &schname) ;
+
+    OCCI_STD_NAMESPACE::string getAsString() const ;
+    Bfile getAsBfile() const ;
+    BFloat  getAsBFloat() const ;
+    BDouble getAsBDouble() const ;
+    Number getAsNumber() const ;
+    Bytes getAsBytes() const ;
+    Date getAsDate() const ;
+    Timestamp getAsTimestamp() const ;
+    IntervalYM getAsIntervalYM() const ;
+    IntervalDS getAsIntervalDS() const ;
+    PObject *getAsObject() const ;
+    RefAny getAsRef() const ;
+
+    TypeCode getType() const;
+    
+    private:
+
+                                 
+    // private data members
+    Ptr<AnyDataImpl> anyDataImplPtr;              
+   
+
+};
+
+template <class T>
+class Ref
+{
+  public:
+
+  Ref();
+  Ref(const T *obj) ;
+  Ref(const RefAny &refAny) ;
+  Ref(const Ref<T> &src) ;
+  Ref(const Connection *sessp, OCIRef *tref, bool copy=TRUE) 
+  ;
+ ~Ref();
+  Ref<T>& operator=(const Ref<T> &src) 
+  ;
+  Ref<T>& operator=(const T *obj) ;
+  Ref<T>& operator=(const RefAny &src);
+  T * operator->() ;
+  T * ptr() ;
+  T & operator *() ;
+  const T * operator->() const;
+  const T * ptr()  const;
+  const T & operator *() const ;
+  void markDelete() ;
+  void unmarkDelete() ;
+  void setNull();
+  bool isNull() const;
+  void clear() ;
+  bool isClear() const;
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &typeName, 
+                   unsigned int depth);
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &schName,
+                   const OCCI_STD_NAMESPACE::string &typeName,
+                   unsigned int depth);
+  void setPrefetch(const UString &schName,
+                   const UString &typeName,
+                   unsigned int depth);
+  void setPrefetch(unsigned int depth) ;
+  void setLock(LockOptions );
+  operator RefAny() const;
+  OCIRef *getRef() const;
+  const Connection *getConnection() const;
+  bool operator == (const Ref<T> &ref) const;
+  bool operator != (const Ref<T> &ref) const;
+  bool operator == (const RefAny &refAnyR) const ;
+  bool operator != (const RefAny &refAnyR) const ;
+  OCIComplexObject *getCor() const;
+  void destroy();
+  void setPinnedObject(PObject *objPtr); 
+ private:
+
+  RefImpl  *rimplPtr;
+};
+
+
+class RefImpl
+{
+  public:
+
+  RefImpl();
+  RefImpl(PObject *obj) ;
+  RefImpl(const RefAny &refAny) ;
+  RefImpl(const RefImpl &src) ;
+  RefImpl(const Connection *sessp, OCIRef *tref, 
+  bool copy=TRUE) ;
+  ~RefImpl();
+  bool isNull() const ;
+  void setNull() ;
+  void markDelete() ;
+  void unmarkDelete() ;
+  void clear() ;
+  bool isClear() const ;
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &typeName, 
+                   unsigned int depth) ;
+  void setPrefetch(const OCCI_STD_NAMESPACE::string &schName,
+                   const OCCI_STD_NAMESPACE::string &typeName,
+                   unsigned int depth);
+  void setPrefetch(const UString &schName,
+                   const UString &typeName,
+                   unsigned int depth);
+  void setPrefetch(unsigned int depth) ;
+  void setLock(LockOptions lckOption) ;
+  PObject *pin() ;
+  void unpin(PObject *obj) ;
+  void setRefFromObjPtr(const PObject *obj) ;
+  OCIRef* getRef() const;
+  void setRefImpl(RefImpl *rptr);
+  const Connection * getConnection() const;
+  bool operator == (const RefImpl &refI) const ;
+  bool operator == (const RefAny &refAnyR) const ;
+  void assignObj(PObject *newObjPtr) ;
+  void assignRefAny(const RefAny &src) ;
+  // added following methods
+  bool isEqual(PObject *obj);
+  void operator = ( const RefImpl &src);
+  void destroy();
+  OCIComplexObject *getCor() const;
+  void setPinnedObject( PObject *objPtr);
+ private:
+
+  OCIRef *ref;
+  const ConnectionImpl *sessp;
+  OCIComplexObject *corhp;
+  OCCI_STD_NAMESPACE::list<void *> descriptorList;
+  LockOptions lockOption;
+  // added data member for object header
+  dvoid *objHeader;
+  //common implementation function for setPrefetch
+  void do_setPrefetch(void *schName, unsigned int schNameLen,
+                      void *typeName, unsigned int typeNameLen,
+                      unsigned int depth);
+};
+
+
+class RefAny
+{
+  public:
+
+  RefAny();
+  RefAny (const Connection *sessptr, const OCIRef *ref);
+  RefAny (const Connection *sessptr, const OCIRef *ref, bool isowner);
+  ~RefAny() ;
+  RefAny(const RefAny& src) ;
+  RefAny& operator=(const RefAny& src) ;
+  void markDelete() ;
+  void unmarkDelete() ;
+  void clear() ;
+  bool isNull() const;
+  OCIRef * getRef() const;
+  const Connection * getConnection() const;
+  bool operator == (const RefAny &refAnyR) const;
+  bool operator != (const RefAny &refAnyR) const;
+  bool isOwner() const;
+
+  private:
+
+  OCIRef *ref;
+  const ConnectionImpl *sessp;
+  // for future use
+  void *refanyExt;
+  bool owner;
+
+  friend RefAny MetaData::getRef(MetaData::AttrId) const;
+  friend RefAny PObject::getRef() const;
+  friend class AnyDataImpl;
+  friend class ResultSetImpl;
+  friend class StatementImpl;
+  friend void getVector(const ResultSet  *rs,
+                        unsigned int colIndex,
+                        OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+  friend void getVector(const Statement  *stmt,
+                        unsigned int colIndex,
+                        OCCI_STD_NAMESPACE::vector<RefAny> &vect) ;
+};
+
+template <class T>
+Ref<T>::Ref()
+{
+   rimplPtr = new RefImpl();
+}
+
+template <class T>
+Ref<T>::Ref(const T *obj)
+{
+   rimplPtr = new RefImpl((PObject *)obj);
+}
+
+template <class T>
+Ref<T>::Ref(const RefAny &refAny)
+
+{
+  rimplPtr = new RefImpl(refAny);
+}
+
+template <class T>
+Ref<T>::Ref(const Ref<T>& src)
+
+{
+    rimplPtr = new RefImpl(*(src.rimplPtr));
+}
+
+template <class T>
+Ref<T>::Ref(const Connection *sessp, OCIRef *tref, bool copy)
+
+{
+   rimplPtr = new RefImpl(sessp, tref, copy);
+}
+
+template <class T>
+Ref<T>::~Ref()
+{
+  delete rimplPtr;
+}
+
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const Ref<T> &src)
+{
+   if (&src == this)
+     return *this;
+   *rimplPtr = *(src.rimplPtr);
+   return *this;
+}
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const T *obj)
+{
+  if (rimplPtr->isEqual((PObject *)obj))
+    return *this;
+  rimplPtr->assignObj((PObject *)obj);
+  return *this;
+}
+
+template <class T>
+Ref<T>& Ref<T>::operator=(const RefAny &src)
+{
+  rimplPtr->assignRefAny(src);
+  return *this;
+}
+
+template <class T>
+T* Ref<T>::operator->()
+{
+  return ((T *)rimplPtr->pin());
+}
+
+template <class T>
+T* Ref<T>::ptr()
+{
+  return ((T *)rimplPtr->pin());
+}
+
+template <class T>
+T& Ref<T>::operator * ()
+{
+  return ((T &)(*(rimplPtr->pin())));
+}
+
+template <class T>
+const T* Ref<T>::operator->() const
+{
+  return ((const T *)rimplPtr->pin());
+}
+
+template <class T>
+const T* Ref<T>::ptr() const
+{
+  return ((const T *)rimplPtr->pin());
+}
+
+template <class T>
+const T& Ref<T>::operator * () const
+{
+  return ((const T &)(*(rimplPtr->pin())));
+}
+
+template <class T>
+void Ref<T>::markDelete ()
+{
+   rimplPtr->markDelete();
+}
+
+template <class T>
+void Ref<T>::unmarkDelete ()
+{
+   rimplPtr->unmarkDelete();
+}
+
+template <class T>
+void Ref<T>::setNull()
+{
+   rimplPtr->setNull();
+}
+
+template <class T>
+bool Ref<T>::isNull() const
+{
+  return rimplPtr->isNull();
+}
+
+template <class T>
+void Ref<T>::clear ()
+{
+   rimplPtr->clear();
+}
+
+template <class T>
+bool Ref<T>::isClear() const
+{
+   return rimplPtr->isClear();
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const OCCI_STD_NAMESPACE::string &typeName,
+unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const OCCI_STD_NAMESPACE::string &schemaName,
+const OCCI_STD_NAMESPACE::string &typeName,
+unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(schemaName,typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (const UString &schemaName,
+const UString &typeName,
+unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(schemaName,typeName,depth);
+}
+
+template <class T>
+void Ref<T>::setPrefetch (unsigned int depth)
+
+{
+  rimplPtr->setPrefetch(depth);
+}
+
+template <class T>
+void Ref<T>::setLock (LockOptions lckOption)
+{
+  rimplPtr->setLock(lckOption);
+}
+
+template <class T>
+OCIRef* Ref<T>::getRef() const
+{
+  return (rimplPtr->getRef());
+}
+
+template<class T>
+const Connection* Ref<T>::getConnection () const
+{
+  return (rimplPtr->getConnection());
+}
+
+template <class T>
+Ref<T>::operator RefAny () const
+{
+  if (isNull())
+    return  RefAny();
+  return (RefAny(rimplPtr->getConnection(), rimplPtr->getRef()));
+}
+
+template <class T>
+bool Ref<T>::operator ==(const Ref<T> &ref) const
+
+{
+  return ( (*rimplPtr) == (*(ref.rimplPtr)) );
+}
+
+template <class T>
+bool Ref<T>::operator !=(const Ref<T> &ref) const
+
+{
+  return ( !((*rimplPtr) == (*(ref.rimplPtr))) );
+}
+
+template <class T>
+bool Ref<T>::operator == (const RefAny & refAnyR) const
+
+{
+  return ( (*rimplPtr) == refAnyR );
+}
+
+template <class T>
+bool Ref<T>::operator != (const RefAny & refAnyR) const
+
+{
+  return ( !((*rimplPtr) == refAnyR ));
+}
+
+template <class T>
+void Ref<T>::destroy()
+{
+   rimplPtr->destroy();
+}
+
+template <class T>
+OCIComplexObject * Ref<T>::getCor() const
+{
+  return (rimplPtr->getCor());
+}
+
+template < class T>
+void Ref<T>::setPinnedObject( PObject *objPtr)
+{
+   rimplPtr->setPinnedObject(objPtr);
+}
+
+/*---------------------------------------------------------------------------
+                PROTOTYPES USED BY FUNCTION TEMPLATES
+ ---------------------------------------------------------------------------*/
+  void getVectorOfOCIRefs( const AnyData &any, 
+  OCCI_STD_NAMESPACE::vector<void *> &vect);
+  void getVectorOfPObjects( const AnyData &any,
+  OCCI_STD_NAMESPACE::vector< PObject* > &vect,
+  void *(*rSQL)(void *))  ;
+  void setVectorOfOCIRefs( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector<void *> &vect,
+  const OCCI_STD_NAMESPACE::vector< OCIInd> &vec_ind) ;
+  void setVectorOfPObjects( AnyData &any, 
+  const OCCI_STD_NAMESPACE::vector< PObject* > &vect) ;
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------- getVector for POBject----------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the
+   current position as a vector of PObject
+
+   PARAMETERS
+      any - AnyData
+      vect- reference to vector of PObject (OUT parameter).
+
+   DESCRIPTION
+   Retrieves the attribute in the current position as a vector
+   of PObject
+   The attribute at the current position should be a collection
+   type (varray or nested table). The SQL type of the elements in
+   the collection should be compatible with PObject
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+ template <class T>
+ void getVector(const AnyData &any, OCCI_STD_NAMESPACE::vector<T> &vect,
+ void *(*rSQL)(void *))
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   getVectorOfPObjects( any, vec_pobj, rSQL);
+
+   vect.clear();
+   unsigned int size= vec_pobj.size();
+   vect.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vect.push_back( (T)vec_pobj[i] );
+ }
+#else
+ template <class T>
+ void getVector(const AnyData &any, OCCI_STD_NAMESPACE::vector<T*> &vect,
+ void *(*rSQL)(void *)) 
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   getVectorOfPObjects( any, vec_pobj, rSQL);
+
+   vect.clear();
+   unsigned int size= vec_pobj.size();
+   vect.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vect.push_back( (T*)vec_pobj[i] );
+ }
+#endif /* end of #ifdef WIN32COMMON */
+
+ /*------------------- getVector for Ref<T>----------------------------*/
+/*
+   NAME
+      getVector - overloaded function. Retrieves the attribute in the
+   current position as a vector of PObject
+
+   PARAMETERS
+      any - AnyData
+      vect- reference to vector of PObject (OUT parameter).
+
+   DESCRIPTION
+   Retrieves the attribute in the current position as a vector
+   of PObject
+   The attribute at the current position should be a collection
+   type (varray or nested table). The SQL type of the elements in
+   the collection should be compatible with PObject
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+#ifndef WIN32COMMON
+ template <class T>
+ void getVector(const AnyData &any,OCCI_STD_NAMESPACE::vector< Ref<T> > &vect) 
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   getVectorOfOCIRefs( any, vec_ref);
+
+   vect.clear();
+   unsigned int size = vec_ref.size();
+   vect.reserve( size );
+   const Connection *sess = any.getConnection();
+
+   for (unsigned int i=0; i< size; i++)
+   {
+     if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+   }
+ }
+#endif /* end of #ifndef WIN32COMMON  */
+ 
+/*-----------------------setVector for PObject--------------------------*/
+/*
+   NAME
+     setVector - overloaded function. sets the attribute in the current
+   position of anydata with the vector elements.
+
+   PARAMETERS
+      none.
+
+   DESCRIPTION
+      sets the attribute in the current position in anydata with the
+   vector elements.
+  The attribute in the current position of anydata should be a
+  collection type. If the collection type is a varray, the input vector
+  size should be equal to the size of the varray. Also the SQL type of
+  the collection's elements should be compatible with PObject.
+
+   RETURNS
+     nothing.
+
+   NOTES
+     compatible SQL types : SQLT_NTY  (user defined types).
+*/
+#ifdef WIN32COMMON
+// and other platforms that do not support
+// partial function template specialization
+
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector<T> &vect) 
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   unsigned int size= vect.size();
+   vec_pobj.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vec_pobj.push_back( vect[i] );
+   setVectorOfPObjects( any, vec_pobj);
+
+ }
+ 
+#else
+
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector<T*> &vect)
+ {
+   OCCI_STD_NAMESPACE::vector< PObject *> vec_pobj;
+   unsigned int size= vect.size();
+   vec_pobj.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+      vec_pobj.push_back( vect[i] );
+   setVectorOfPObjects( any, vec_pobj);
+
+ }
+#endif /* end of #ifdef WIN32COMMON */
+
+/*-----------------------setVector for Ref<T>--------------------------*/
+/*
+   NAME
+     setVector - overloaded function. sets the attribute in the current
+   position of anydata with the vector elements.
+
+   PARAMETERS
+      none.
+
+   DESCRIPTION
+      sets the attribute in the current position in anydata with the
+   vector elements.
+  The attribute in the current position of anydata should be a
+  collection type. If the collection type is a varray, the input vector
+  size should be equal to the size of the varray. Also the SQL type of
+  the collection's elements should be compatible with PObject.
+
+   RETURNS
+     nothing.
+
+   NOTES
+     compatible SQL types : SQLT_NTY  (user defined types).
+*/
+#ifndef WIN32COMMON
+ template <class T>
+ void setVector(AnyData &any, const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+
+   unsigned int size= vect.size();
+   vec_ref.reserve( size );
+   vec_ind.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+   {
+      vec_ref.push_back( vect[i].getRef() );
+      vec_ind.push_back(vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+   }
+   setVectorOfOCIRefs( any, vec_ref, vec_ind);
+
+ }
+#endif  /* end of #ifndef WIN32COMMON */
+ 
+// Platform independent get/setVectorOfRefs method added 
+// get(set)Vector of Ref<T> and get(set)VectorOfRefs are identical
+// in functionality.
+
+ /*------------------- getVectorOfRefs for Ref<T>----------------------------*/
+/*
+   NAME
+      getVectorOfRefs - overloaded function. Retrieves the attribute in the
+   current position as a vector of PObject
+
+   PARAMETERS
+      any - AnyData
+      vect- reference to vector of PObject (OUT parameter).
+
+   DESCRIPTION
+   Retrieves the attribute in the current position as a vector
+   of PObject
+   The attribute at the current position should be a collection
+   type (varray or nested table). The SQL type of the elements in
+   the collection should be compatible with PObject
+
+   RETURNS
+     nothing
+
+   NOTES
+     compatible SQL types : user defined types (SQLT_NTY) etc.
+*/
+
+ template <class T>
+ void getVectorOfRefs(const AnyData &any,
+                      OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   getVectorOfOCIRefs( any, vec_ref);
+
+   vect.clear();
+   unsigned int size = vec_ref.size();
+   vect.reserve( size );
+   const Connection *sess = any.getConnection();
+
+   for (unsigned int i=0; i< size; i++)
+   {
+     if (vec_ref[i] == (OCIRef *)0)
+       vect.push_back(Ref<T>());     // pushing a default-constructed Ref
+     else
+       vect.push_back(Ref<T>(sess, (OCIRef *)vec_ref[i], FALSE));
+   }
+ }
+
+/*-----------------------setVectorOfRefs for Ref<T>--------------------------*/
+/*
+   NAME
+     setVectorOfRefs - overloaded function. sets the attribute in the current
+   position of anydata with the vector elements.
+
+   PARAMETERS
+      none.
+
+   DESCRIPTION
+      sets the attribute in the current position in anydata with the
+   vector elements.
+  The attribute in the current position of anydata should be a
+  collection type. If the collection type is a varray, the input vector
+  size should be equal to the size of the varray. Also the SQL type of
+  the collection's elements should be compatible with PObject.
+
+   RETURNS
+     nothing.
+
+   NOTES
+     compatible SQL types : SQLT_NTY  (user defined types).
+*/
+
+ template <class T>
+ void setVectorOfRefs(AnyData &any, 
+                      const OCCI_STD_NAMESPACE::vector< Ref<T> > &vect)
+
+ {
+   OCCI_STD_NAMESPACE::vector< void *> vec_ref;
+   OCCI_STD_NAMESPACE::vector<OCIInd> vec_ind;
+
+   unsigned int size= vect.size();
+   vec_ref.reserve( size );
+   vec_ind.reserve( size );
+   for( unsigned int i=0; i< size; i++)
+   {
+      vec_ref.push_back( vect[i].getRef() );
+      vec_ind.push_back(vect[i].isNull() ? OCI_IND_NULL : OCI_IND_NOTNULL);
+   }
+   setVectorOfOCIRefs( any, vec_ref, vec_ind);
+
+ }
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+} /* end of namespace occi */
+} /* end of namespace oracle */
+#endif                                              /* OCCIOBJECTS_ORACLE */
+
+#endif                                              /* _olint */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oci.h b/src/terralib/drivers/OracleSpatial/OCI/include/oci.h
new file mode 100644
index 0000000..a5d8b01
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oci.h
@@ -0,0 +1,2366 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oci.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) 1995, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     oci.h - V8 Oracle Call Interface public definitions
+
+   DESCRIPTION 
+     This file defines all the constants and structures required by a V8
+     OCI programmer.
+
+   RELATED DOCUMENTS 
+     V8 OCI Functional Specification 
+     Oracle Call Interface Programmer's Guide Vol 1 and 2
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     None
+
+   PRIVATE FUNCTION(S) 
+     None
+ 
+   EXAMPLES 
+ 
+   NOTES 
+
+
+   MODIFIED   (MM/DD/YY)
+   chliang     11/26/03 - add OCI_ATTR_RESERVED_19 
+   preilly     10/23/03 - Make OCI_ATTR_DIRPATH_METADATA_BUF private 
+   chliang     08/07/03 - add OCI_ATTR_SKIP_BUFFER
+   srseshad    03/12/03 - convert public oci api to ansi
+   weiwang     05/14/03 - remove iot creation for rule sets
+   rkoti       04/15/03 - [2746515] add fntcodes for Unlimited size LOB 6003
+   tcruanes    05/13/03 - add slave SQL OCI execution mode
+   rkoti       02/21/03 - [2761455] add OCI_FNCODE_AQENQARRAY,
+                          OCI_FNCODE_AQDEQARRAY and update OCI_FNCODE_MAXFCN
+   tkeefe      01/29/03 - bug-2773794: Add new interface for setting Kerb attrs
+   aahluwal    02/06/03 - add OCI_ATTR_TRANSFORMATION_NO
+   weiwang     12/05/02 - add OCI_ATTR_USER_PROPERTY
+   ataracha    01/03/03 - include ocixmldb.h
+   preilly     12/05/02 - Add wait attribute for locking when using dir path
+   tkeefe      01/03/03 - bug-2623771: Added OCI_ATTR_KERBEROS_KEY
+   lchidamb    12/13/02 - end-to-end tracing attributes
+   msakayed    10/28/02 - Bug #2643907: add OCI_ATTR_DIRPATH_SKIPINDEX_METHOD
+   rphillip    11/13/02 - Add OCIP_ATTR_DIRPATH_INDEX
+   sagrawal    10/13/02 - liniting
+   sagrawal    10/03/02 - PL/SQL Compiler warnings
+   jstenois    11/07/02 - remove ocixad.h
+   chliang     10/21/02 - add OCI_ATTR_RESERVED_16,17
+   hsbedi      10/30/02 - grabtrans 'jstenois_fix_xt_convert'
+   aahluwal    10/12/02 - add OCI_ATTR_AQ_NUM_E_ERRORS/OCI_ATTR_AQ_ERROR_INDEX
+   bdagevil    10/21/02 - add SQL analyze internal exec mode
+   csteinba    10/11/02 - add OCI_ATTR_RESERVED_16
+   chliang     10/12/02 - add bind row callback attributes
+   preilly     10/25/02 - Add new reserved parameters
+   tkeefe      10/31/02 - bug-2623771: Added OCI_ATTR_AUDIT_SESSION_ID
+   csteinba    10/04/02 - Add OCI_ATTR_RESERVED_15
+   mhho        10/11/02 - add new credential constant
+   thoang      09/25/02 - Add OCI_XMLTYPE_CREATE_CLOB
+   skaluska    10/07/02 - describe rules objects
+   csteinba    09/16/02 - Remove OCI_CACHE
+   gtarora     10/03/02 - OCI_ATTR_COL_SUBS => OCI_ATTR_OBJ_SUBS
+   msakayed    09/09/02 - Bug #2482469: add OCI_ATTR_DIRPATH_RESERVED_[3-6]
+   aahluwal    08/30/02 - adding dequeue across txn group
+   srseshad    04/24/02 - Add attribute OCI_ATTR_SPOOL_STMTCACHESIZE.
+   ebatbout    07/22/02 - Remove OCI_ATTR_RESERVED_11.
+   abande      01/17/02 - Bug 1788921; Add external attribute.
+   aahluwal    06/04/02 - bug 2360115
+   pbagal      05/24/02 - Incorporate review comments
+   pbagal      05/22/02 - Introduce instance type attribute.
+   whe         07/01/02 - add OCI_BIND_DEFINE_SOFT flags
+   gtarora     07/01/02 - Add OCI_ATTR_COL_SUBS
+   tkeefe      05/30/02 - Add support for new proxy authentication credentials
+   dgprice     12/18/01 - bug 2102779 add reserved force describe
+   schandir    11/19/01 - add/modify modes.
+   schandir    11/15/01 - add OCI_SPC_STMTCACHE.
+   schandir    12/06/01 - change mode value of OCI_SPOOL.
+   msakayed    11/02/01 - Bug #2094292: add OCI_ATTR_DIRPATH_INPUT
+   dsaha       11/09/01 - add OCI_DTYPE_RESERVED1
+   skabraha    11/05/01 - new method flag
+   skabraha    10/25/01 - another flag for XML
+   skabraha    10/11/01 - describe flags for subtypes
+   nbhatt      09/18/01 - new reserved AQ flags
+   celsbern    10/19/01 - merge LOG to MAIN
+   ksurlake    10/12/01 - add OCI_ATTR_RESERVED_13
+   ksurlake    08/13/01 - add OCI_ATTR_RESERVED_12
+   schandir    09/24/01 - Adding stmt caching
+   abande      09/04/01 - Adding session pooling
+   sagrawal    10/23/01 - add new bit for OCIPHandleFree
+   preilly     10/25/01 - Add support for specifying metadata on DirPathCtx
+   skabraha    09/24/01 - describe flags for XML type
+   schandir    09/24/01 - Adding stmt caching
+   abande      09/04/01 - Adding session pooling
+   stakeda     09/17/01 - add OCI_NLS_CHARSET_ID
+   whe         09/19/01 - add OCIXMLType create options
+   rpingte     09/11/01 - add OCI_MUTEX_ENV_ONLY and OCI_NO_MUTEX_STMT
+   cmlim       08/28/01 - mod datecache attrs to use same naming as dpapi attrs
+   wzhang      08/24/01 - Add new keywords for OCINlsNameMap.
+   rphillip    05/02/01 - Add date cache attributes
+   rphillip    08/22/01 - Add new stream version
+   ebatbout    04/13/01 - add definition, OCI_ATTR_RESERVED_11
+   chliang     04/12/01 - add shortnames for newer oci funcation
+   wzhang      04/11/01 - Add new OCI NLS constants.
+   cmlim       04/13/01 - remove attrs not used by dpapi (151 & 152 avail)
+   rkambo      03/23/01 - bugfix 1421793
+   cmlim       04/02/01 - remove OCI_ATTR_DIRPATH_{NESTED_TBL, SUBST_OBJ_TBL}
+                        - note: attribute #s 186 & 205 available
+   whe         03/28/01 - add OCI_AFC_PAD_ON/OFF mode
+   preilly     03/05/01 - Add stream versioning support to DirPath context
+   schandir    12/18/00 - remove attr CONN_INCR_DELAY.
+   schandir    12/12/00 - change mode from OCI_POOL to OCI_CPOOL.
+   cbarclay    01/12/01 - add atribute for OCIP_ATTR_TMZ
+   whe         01/07/01 - add attributes related to UTF16 env mode
+   slari       12/29/00 - add blank line
+   slari       12/28/00 - OCI_ATTR_RESERVED_10
+   whe         12/19/00 - add OCI_ENVCR_RESERVED3
+   rpang       11/29/00 - Added OCI_ATTR_ORA_DEBUG_JDWP attribute
+   cmlim       11/28/00 - support substitutable object tables in dpapi
+   akatti      10/09/00 - [198379]:add OCIRowidToChar
+   sgollapu    10/11/00 - Add OCI_PREP_RESERVED_1
+   sgollapu    08/27/00 - add attribute to get erroneous column
+   sgollapu    07/29/00 - Add snapshot attributes
+   kmohan      09/18/00 - add OCI_FNCODE_LOGON2
+   abrumm      10/08/00 - include ocixad.h
+   mbastawa    10/04/00 - add OCI_ATTR_ROWS_FETCHED
+   nbhatt      08/24/00 - add transformation attribute
+   dmwong      08/22/00 - OCI_ATTR_CID_VALUE -> OCI_ATTR_CLIENT_IDENTIFIER.
+   cmlim       08/30/00 - add OCI_ATTR_DIRPATH_SID
+   dsaha       08/18/00 - add OCI_ATTR_RESERVED_5
+   amangal     08/17/00 - Merge into 8.2 : 1194361
+   slari       08/03/00 - add OCI_ATTR_HANDLE_POSITION
+   dsaha       07/20/00 - 2rt exec
+   sgollapu    07/04/00 - Add virtual session flag
+   cmlim       07/07/00 - add OCI_ATTR_DIRPATH_OID, OCI_ATTR_DIRPATH_NESTED_TBL
+   etucker     07/28/00 - add OCIIntervalFromTZ
+   rwessman    06/26/00 - N-tier: added new credential attributes
+   whe         07/27/00 - add OCI_UTF16 mode
+   vjayaram    07/18/00 - add connection pooling changes
+   etucker     07/12/00 - add dls apis
+   cmlim       07/07/00 - add OCI_ATTR_DIRPATH_OID, OCI_ATTR_DIRPATH_NESTED_TBL
+   sgollapu    07/04/00 - Add virtual session flag
+   najain      05/01/00 - AQ Signature support
+   sgollapu    06/14/00 - Add reserved OCI mode
+   rkambo      06/08/00 - notification presentation support
+   sagrawal    06/04/00 - ref cursor to c
+   ksurlake    06/07/00 - define OCI_POOL
+   mbastawa    06/05/00 - added scrollable cursor attributes
+   weiwang     03/31/00 - add LDAP support
+   whe         05/30/00 - add OCI_ATTR_MAXCHAR_SIZE
+   whe         05/23/00 - validate OCI_NO_CACHE mode
+   dsaha       02/02/00 - Add no-cache attr in statement handle
+   whe         05/23/00 - add OCIP_ICACHE
+   allee       05/17/00 - describe support for JAVA implmented TYPE
+   preilly     05/30/00 - Continue adding support for objects in direct path lo
+   cmlim       05/16/00 - 8.2 dpapi support of ADTs
+   rxgovind    05/04/00 - OCIAnyDataSet changes
+   rkasamse    05/25/00 - add OCIAnyDataCtx
+   rmurthy     04/26/00 - describe support for inheritance
+   ksurlake    04/18/00 - Add credential type
+   whe         05/24/00 - add OCI_ATTR_CHAR_ attrs
+   rkambo      04/19/00 - subscription enhancement
+   rmurthy     04/26/00 - describe support for inheritance
+   delson      03/28/00 - add OCI_ATTR_RESERVED_2
+   abrumm      03/31/00 - external table support
+   rkasamse    03/13/00 - add declarations for OCIAnyData
+   najain      02/24/00 - support for dequeue as select
+   dsaha       03/10/00 - Add OCI_ALWAYS_BLOCKING
+   esoyleme    04/25/00 - separated transactions
+   sgollapu    12/23/99 - OCIServerAttach extensions
+   slari       08/23/99 - add OCI_DTYPE_UCB
+   slari       08/20/99 - add OCI_UCBTYPE_REPLACE
+   hsbedi      08/31/99 - Memory Stats .
+   sgollapu    08/02/99 - oci sql routing
+   slari       08/06/99 - rename values for OCI_SERVER_STATUS
+   slari       08/02/99 - add OCI_ATTR_SERVER_STATUS
+   tnbui       07/28/99 - Remove OCI_DTYPE_TIMESTAMP_ITZ                       
+   amangal     07/19/99 - Merge into 8.1.6 : bug 785797
+   tnbui       07/07/99 - Change ADJUSTMENT modes                              
+   dsaha       07/07/99 - OCI_SAHRED_EXT
+   dmwong      06/08/99 - add OCI_ATTR_APPCTX_*
+   vyanaman    06/23/99 -
+   vyanaman    06/21/99 - Add new OCI Datetime and Interval descriptors
+   esoyleme    06/29/99 - expose MTS performance enhancements                  
+   rshaikh     04/23/99 - add OCI_SQL_VERSION_*
+   tnbui       05/24/99 - Remove OCIAdjStr                                     
+   dsaha       05/21/99 - Add OCI_ADJUST_UNK
+   mluong      05/17/99 - fix merge
+   tnbui       04/05/99 - ADJUSTMENT values
+   abrumm      04/16/99 - dpapi: more attributes
+   dsaha       02/24/99 - Add OCI_SHOW_DML_WARNINGS
+   jiyang      12/07/98 - Add OCI_NLS_DUAL_CURRENCY
+   slari       12/07/98 - change OCI_NOMUTEX to OCI_NO_MUTEX
+   aroy        11/30/98 - change OCI_NOCALLBACK to OCI_NO_UCB
+   aroy        11/13/98 - add env modes to process modes
+   slari       09/08/98 - add OCI_FNCODE_SVC2HST and _SVCRH
+   aroy        09/04/98 - Add OCI_ATTR_MIGSESSION
+   skray       08/14/98 - server groups for session switching
+   mluong      08/11/98 - add back OCI_HTYPE_LAST.
+   aroy        05/25/98 - add process handle type                              
+   aroy        04/06/98 - add shared mode                                      
+   slari       07/13/98 -  merge forward to 8.1.4
+   slari       07/09/98 -  add OCI_BIND_RESERVED_2
+   slari       07/08/98 -  add OCI_EXACT_FETCH_RESERVED_1
+   dsaha       07/07/98 -  Add OCI_PARSE_ONLY
+   dsaha       06/29/98 -  Add OCI_PARSE_ONLY
+   slari       07/01/98 -  add OCI_BIND_RESERVED_2
+   sgollapu    06/25/98 -  Fix bug 683565
+   slari       06/17/98 -  remove OC_FETCH_RESERVED_2
+   slari       06/11/98 -  add OCI_FETCH_RESERVED_1 and 2
+   jhasenbe    05/27/98 -  Remove definitions for U-Calls (Unicode)
+   jiyang      05/18/98 - remove OCI_ATTR_CARTLANG
+   nbhatt      05/20/98 -  OCI_DEQ_REMOVE_NODATA
+   nbhatt      05/19/98 - correct AQ opcode
+   skmishra    05/06/98 - Add precision attribute to Attributes list
+   aroy        04/20/98 - merge forward 8.0.5 -> 8.1.3
+   schandra    05/01/98 - OCI sender id
+   sgollapu    02/19/98 - enhanced array DML
+   nbhatt      05/15/98 -  AQ listen call
+   sgollapu    04/27/98 - more attributes
+   skaluska    04/06/98 - Add OCI_PTYPE_SCHEMA, OCI_PTYPE_DATABASE
+   slari       04/28/98 - add OCI_ATTR_PDPRC
+   lchidamb    05/05/98 - change OCI_NAMESPACE_AQ to 1
+   nbhatt      04/27/98 - AQ Notification Descriptor
+   abrumm      06/24/98 - more direct path attributes
+   abrumm      05/27/98 - OCI direct path interface support
+   abrumm      05/08/98 - OCI direct path interface support
+   lchidamb    03/02/98 - client notification additions
+   kkarun      04/17/98 - Add more Interval functions
+   vyanaman    04/16/98 - Add get/set TZ
+   kkarun      04/14/98 - Add OCI Datetime shortnames
+   vyanaman    04/13/98 - Add OCI DateTime and Interval check error codes
+   kkarun      04/07/98 - Add OCI_DTYPE_DATETIME and OCI_DTYPE_INTERVAL
+   esoyleme    12/15/97 - support failover callback retry
+   esoyleme    04/22/98 - merge support for failover callback retry
+   mluong      04/16/98 - add OCI_FNCODE_LOBLOCATORASSIGN
+   rkasamse    04/17/98 - add short names for OCIPickler(Memory/Ctx) cart servi
+   slari       04/10/98 - add OCI_FNCODE_SVCCTXTOLDA
+   slari       04/09/98 - add OCI_FNCODE_RESET
+   slari       04/07/98 - add OCI_FNCODE_LOBFILEISOPEN
+   slari       04/06/98 - add OCI_FNCODE_LOBOPEN
+   slari       03/20/98 - change OCI_CBTYPE_xxx to OCI_UCBTYPE_xxx
+   slari       03/18/98 - add OCI_FNCODE_MAXFCN
+   slari       02/12/98 - add OCI_ENV_NO_USRCB
+   skabraha    04/09/98 - adding shortnames for OCIFile
+   rhwu        04/03/98 - Add short names for the OCIThread package
+   tanguyen    04/03/98 - add OCI_ATTR_xxxx for type inheritance
+   rkasamse    04/02/98 - add OCI_ATTR_UCI_REFRESH
+   nramakri    04/01/98 - Add short names for the OCIExtract package
+   ewaugh      03/31/98 - Add short names for the OCIFormat package.
+   jhasenbe    04/06/98 - Add definitions for U-Calls (Unicode)
+                          (OCI_TEXT, OCI_UTEXT, OCI_UTEXT4)
+   skmishra    03/03/98 - Add OCI_ATTR_PARSE_ERROR_OFFSET
+   rwessman    03/11/98 - Added OCI_CRED_PROXY for proxy authentication
+   abrumm      03/31/98 - OCI direct path interface support
+   nmallava    03/03/98 - add constants for temp lob apis
+   skotsovo    03/05/98 - resolve merge conflicts
+   skotsovo    02/24/98 - add OCI_DTYPE_LOC
+   skaluska    01/21/98 - Add OCI_ATTR_LTYPE
+   rkasamse    01/06/98 - add OCI_ATTR* for obj cache enhancements
+   dchatter    01/08/98 - more comments
+   skabraha    12/02/97 - moved oci1.h to the front of include files.
+   jiyang      12/18/97 - Add OCI_NLS_MAX_BUFSZ
+   rhwu        12/02/97 - move oci1.h up
+   ewaugh      12/15/97 - Add short names for the OCIFormat package.
+   rkasamse    12/02/97 - Add a constant for memory cartridge services -- OCI_M
+   nmallava    12/31/97 - open/close for internal lobs
+   khnguyen    11/27/97 - add OCI_ATTR_LFPRECISION, OCI_ATTR_FSPRECISION
+   rkasamse    11/03/97 - add types for pickler cartridge services
+   mluong      11/20/97 - changed ubig_ora to ub4 per skotsovo
+   ssamu       11/14/97 - add oci1.h
+   jiyang      11/13/97 - Add NLS service for cartridge
+   esoyleme    12/15/97 - support failover callback retry
+   jwijaya     10/21/97 - change OCILobOffset/Length from ubig_ora to ub4
+   cxcheng     07/28/97 - fix compile with SLSHORTNAME
+   schandra    06/25/97 - AQ OCI interface
+   sgollapu    07/25/97 - Add OCI_ATTR_DESC_PUBLIC
+   cxcheng     06/16/97 - add OCI_ATTR_TDO
+   skotsovo    06/05/97 - add fntcodes for lob buffering subsystem
+   esoyleme    05/13/97 - move failover callback prototype
+   skmishra    05/06/97 - stdc compiler fixes
+   skmishra    04/22/97 - Provide C++ compatibility
+   lchidamb    04/19/97 - add OCI_ATTR_SESSLANG
+   ramkrish    04/15/97 - Add OCI_LOB_BUFFER_(NO)FREE
+   sgollapu    04/18/97 - Add OCI_ATTR_TABLESPACE
+   skaluska    04/17/97 - Add OCI_ATTR_SUB_NAME
+   schandra    04/10/97 - Use long OCI names
+   aroy        03/27/97 - add OCI_DTYPE_FILE
+   sgollapu    03/26/97 - Add OCI_OTYPEs
+   skmishra    04/09/97 - Added constant OCI_ROWID_LEN
+   dchatter    03/21/97 - add attr OCI_ATTR_IN_V8_MODE
+   lchidamb    03/21/97 - add OCI_COMMIT_ON_SUCCESS execution mode
+   skmishra    03/20/97 - Added OCI_ATTR_LOBEMPTY
+   sgollapu    03/19/97 - Add OCI_ATTR_OVRLD_ID
+   aroy        03/17/97 - add postprocessing callback
+   sgollapu    03/15/97 - Add OCI_ATTR_PARAM
+   cxcheng     02/07/97 - change OCI_PTYPE codes for type method for consistenc
+   cxcheng     02/05/97 - add OCI_PTYPE_TYPE_RESULT
+   cxcheng     02/04/97 - rename OCI_PTYPE constants to be more consistent
+   cxcheng     02/03/97 - add OCI_ATTR, OCI_PTYPE contants for describe type
+   esoyleme    01/23/97 - merge neerja callback
+   sgollapu    12/30/96 - Remove OCI_DTYPE_SECURITY
+   asurpur     12/26/96 - CHanging OCI_NO_AUTH to OCI_AUTH
+   sgollapu    12/23/96 - Add more attrs to COL, ARG, and SEQ
+   sgollapu    12/12/96 - Add OCI_DESCRIBE_ONLY
+   slari       12/11/96 - change prototype of OCICallbackInBind
+   nbhatt      12/05/96 - "callback"
+   lchidamb    11/19/96 - handle subclassing
+   sgollapu    11/09/96 - OCI_PATTR_*
+   dchatter    11/04/96 - add attr OCI_ATTR_CHRCNT
+   mluong      11/01/96 - test
+   cxcheng     10/31/96 - add #defines for OCILobLength etc
+   dchatter    10/31/96 - add lob read write call back fp defs
+   dchatter    10/30/96 - more changes
+   rhari       10/30/96 - Include ociextp.h at the very end
+   lchidamb    10/22/96 - add fdo attribute for bind/server handle
+   dchatter    10/22/96 - change attr defn for prefetch parameters & lobs/file
+                          calls
+   slari       10/21/96 - add OCI_ENV_NO_MUTEX
+   rhari       10/25/96 - Include ociextp.h
+   rxgovind    10/25/96 - add OCI_LOBMAXSIZE, remove OCI_FILE_READWRITE
+   sgollapu    10/24/96 - Correct OCILogon and OCILogoff
+   sgollapu    10/24/96 - Correct to OCILogon and OCILogoff
+   sgollapu    10/21/96 - Add ocilon and ociloff
+   skaluska    10/31/96 - Add OCI_PTYPE values
+   sgollapu    10/17/96 - correct OCI_ATTR_SVCCTX to OCI_ATTR_SERVER
+   rwessman    10/16/96 - Added security functions and fixed olint errors.
+   sthakur     10/14/96 - add more COR attributes
+   cxcheng     10/14/96 - re-enable LOB functions
+   sgollapu    10/10/96 - Add ocibdp and ocibdn
+   slari       10/07/96 - add back OCIRowid
+   aroy        10/08/96 -  add typedef ocibfill for PRO*C
+   mluong      10/11/96 - replace OCI_ATTR_CHARSET* with OCI_ATTR_CHARSET_*
+   cxcheng     10/10/96 - temporarily take out #define for lob functions
+   sgollapu    10/02/96 - Rename OCI functions and datatypes
+   skotsovo    10/01/96 - move orl lob fnts to oci
+   aroy        09/10/96 - fix merge errors
+   aroy        08/19/96 - NCHAR support
+   jboonleu    09/05/96 - add OCI attributes for object cache
+   dchatter    08/20/96 - HTYPE ranges from 1-50; DTYPE from 50-255
+   slari       08/06/96 - define OCI_DTYPE_ROWID
+   sthakur     08/14/96 - complex object support
+   schandra    06/17/96 - Convert XA to use new OCI
+   abrik       08/15/96 - OCI_ATTR_HEAPALLOC added
+   aroy        07/17/96 - terminology change: ocilobd => ocilobl
+   aroy        07/03/96 - add lob typedefs for Pro*C
+   slari       06/28/96 - add OCI_ATTR_STMT_TYPE
+   lchidamb    06/26/96 - reorg #ifndef
+   schandra    05/31/96 - attribute types for internal and external client name
+   asurpur     05/30/96 - Changing the value of mode
+   schandra    05/18/96 - OCI_TRANS_TWOPHASE -> 0x00000001 to 0x00100000
+   slari       05/30/96 - add callback function prototypes
+   jbellemo    05/23/96 - remove ociisc
+   schandra    04/23/96 - loosely-coupled branches
+   asurpur     05/15/96 - New mode for ocicpw
+   aroy        04/24/96 - making ocihandles opaque
+   slari       04/18/96 - add missing defines
+   schandra    03/27/96 - V8OCI - add transaction related calls
+   dchatter    04/01/96 - add OCI_FILE options
+   dchatter    03/21/96 - add oci2lda conversion routines
+   dchatter    03/07/96 - add OCI piece definition
+   slari       03/12/96 - add describe attributes
+   slari       03/12/96 - add OCI_OTYPE_QUERY
+   aroy        02/28/96 - Add column attributes
+   slari       02/09/96 - add OCI_OBJECT
+   slari       02/07/96 - add OCI_HYTPE_DSC
+   aroy        01/10/96 - adding function code defines...
+   dchatter    01/03/96 - define OCI_NON_BLOCKING
+   dchatter    01/02/96 - Add Any descriptor
+   dchatter    01/02/96 - Add Select List descriptor
+   dchatter    12/29/95 - V8 OCI definitions
+   dchatter    12/29/95 - Creation
+
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef ORATYPES 
+#include <oratypes.h> 
+#endif
+ 
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+# define OCI_ORACLE
+
+ 
+/*--------------------------------------------------------------------------- 
+ Short names provided for platforms which do not allow extended symbolic names 
+  ---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+/* Translation of the long function/type names to short names for IBM only */
+/* maybe lint will use this too */
+#define OCISessionEnd              ocitac
+#define OCIResultSetToStmt         ocirs2sh
+#define OCISessionBegin            ociauth
+#define OCIServerAttach            ociatch
+#define OCIDescriptorAlloc         ocigdesc
+#define OCIServerDetach            ocidtch
+#define OCIDescriptorFree          ocifdesc
+#define OCIServerVersion           ocivers
+#define OCIDescribeAny             ocidsca
+#define OCIBindDynamic             ocibda
+#define OCIBindByName              ocibdn
+#define OCIBindByPos               ocibdp
+#define OCIErrorGet                ocigdr
+#define OCIBindArrayOfStruct       ocibsa
+#define OCIEnvInit                 ociinit
+#define OCIBindObject              ocibndt
+#define OCIHandleAlloc             ocighndl
+#define OCIHandleFree              ocifhndl
+#define OCIRowidToChar             ociri2c
+#ifdef NEVER
+#define OCIStmtBindByPos           ocibndp
+#define OCIStmtBindByName          ocibndn
+#endif
+#define OCIAttrGet                 ocigattr
+#define OCIDefineByPos             ocidfne
+#define OCIAttrSet                 ocisattr
+#define OCIDefineDynamic           ociddf
+#define OCILdaToSvcCtx             ocild2sv
+#define OCIDefineArrayOfStruct     ocidarr
+#define OCIInitialize              ocipi
+#define OCIDefineObject            ocidndt
+#define OCIStmtExecute             ociexec
+#define OCILobAppend               ocilfap
+#define OCILobOpenFile             ocifopn
+#define OCILobCloseFile            ocifcls
+#define OCILobLocator              ocilobd
+#define OCILobCopy                 ocilfcp
+#define OCILobFileCreate           ocifcrt
+#define OCILobFileDelete           ocifdel
+#define OCILobGetLength            ocilfln
+#define OCILobWrite                ocilfwr
+#define OCILobRead                 ocilfrd
+#define OCILobErase                ocilfer
+#define OCILobTrim                 ocilftr
+
+#define OCIStmtFetch               ocifch
+#define OCIStmtGetBindInfo         ocigbp
+#define OCIStmtGetPieceInfo        ocigpi
+#define OCIStmtPrepare             ocireq
+#define OCIStmtSetPieceInfo        ocispi
+#define OCISvcCtxToLda             ocisv2ld
+#define OCITransCommit             ocitxcm
+#define OCITransDetach             ocitxdt
+#define OCITransForget             ocitxfgt
+#define OCITransPrepare            ocitxpre
+#define OCITransRollback           ocitxrl
+#define OCIPasswordChange          ocicpw
+#define OCITransStart              ocitxst
+#define OCITransMultiPrepare       ocitxmp
+
+#define OCIBreak                   ocibreak
+#define OCIParamGet                ocigparm
+#define OCIParamSet                ocisparm
+
+#define OCISecurityOpenWallet           ocizwOpenWallet
+#define OCISecurityCloseWallet          ocizwCloseWallet
+#define OCISecurityCreateWallet         ocizwCreateWallet
+#define OCISecurityDestroyWallet        ocizwDestroyWallet
+#define OCISecurityStorePersona         ocizeStorePersona
+#define OCISecurityOpenPersona          ocizeOpenPersona
+#define OCISecurityClosePersona         ocizeClosePersona
+#define OCISecurityRemovePersona        ocizeRemovePersona
+#define OCISecurityCreatePersona        ocizeCreatePersona
+#define OCISecuritySetProtection        ocizeSetProtection
+#define OCISecurityGetProtection        ocizeGetProtection
+#define OCISecurityRemoveIdentity       ociziRemoveIdentity
+#define OCISecurityCreateIdentity       ociziCreateIdentity
+#define OCISecurityAbortIdentity        ociziAbortIdentity
+#define OCISecurityFreeIdentity         ociziFreeIdentity
+#define OCISecurityStoreTrustedIdentity ociziStoreTrustedIdentity
+#define OCISecuritySign                 ocizSign
+#define OCISecuritySignExpansion        ocizxSignExpansion
+#define OCISecurityVerify               ocizVerify
+#define OCISecurityValidate             ocizValidate
+#define OCISecuritySignDetached         ocizsd_SignDetached
+#define OCISecuritySignDetExpansion     ocizxsd_SignDetachedExpansion
+#define OCISecurityVerifyDetached       ocizved_VerifyDetached
+#define OCISecurity_PKEncrypt           ocizkec_PKEncrypt
+#define OCISecurityPKEncryptExpansion   ocizxkec_PKEncryptExpansion
+#define OCISecurityPKDecrypt            ocizkdc_PKDecrypt
+#define OCISecurityEncrypt              ocizEncrypt
+#define OCISecurityEncryptExpansion     ocizxEncryptExpansion
+#define OCISecurityDecrypt              ocizDecrypt
+#define OCISecurityEnvelope             ocizEnvelope
+#define OCISecurityDeEnvelope           ocizDeEnvelope
+#define OCISecurityKeyedHash            ocizKeyedHash
+#define OCISecurityKeyedHashExpansion   ocizxKeyedHashExpansion
+#define OCISecurityHash                 ocizHash
+#define OCISecurityHashExpansion        ocizxHashExpansion
+#define OCISecuritySeedRandom           ocizSeedRandom
+#define OCISecurityRandomBytes          ocizrb_RandomBytes
+#define OCISecurityRandomNumber         ocizrn_RandomNumber
+#define OCISecurityInitBlock            ocizibInitBlock
+#define OCISecurityReuseBlock           ocizrbReuseBlock
+#define OCISecurityPurgeBlock           ocizpbPurgeBlock
+#define OCISecuritySetBlock             ocizsbSetBlock
+#define OCISecurityGetIdentity          ocizgi_GetIdentity
+
+#define OCIExtractInit             ocixeini
+#define OCIExtractTerm             ocixetrm
+#define OCIExtractReset            ocixerst
+#define OCIExtractSetNumKeys       ocixesnk
+#define OCIExtractSetKey           ocixesk
+#define OCIExtractFromFile         ocixeff
+#define OCIExtractFromStr          ocixefs
+#define OCIExtractToInt            ocixeti
+#define OCIExtractToBool           ocixetb
+#define OCIExtractToStr            ocixets
+#define OCIExtractToOCINum         ocixeton
+#define OCIExtractToList           ocixetl
+#define OCIExtractFromList         ocixefl
+
+#define OCIDateTimeGetTime         ocidt01_GetTime
+#define OCIDateTimeGetDate         ocidt02_GetDate
+#define OCIDateTimeGetTimeZoneOffset     ocidt03_GetTZ
+#define OCIDateTimeSysTimeStamp    ocidt07_SysTS
+#define OCIDateTimeAssign          ocidt08_Assign 
+#define OCIDateTimeToText          ocidt09_ToText
+#define OCIDateTimeFromText        ocidt10_FromText
+#define OCIDateTimeCompare         ocidt11_Compare
+#define OCIDateTimeCheck           ocidt12_Check
+#define OCIDateTimeConvert         ocidt13_Convert
+#define OCIDateTimeSubtract        ocidt14_Subtract
+#define OCIDateTimeIntervalAdd     ocidt15_IntervalAdd
+#define OCIDateTimeIntervalSub     ocidt16_IntervalSub
+#define OCIDateTimeGetTimeZoneName ocidt17_Gettzname
+#define OCIDateTimeToArray         ocidt18_ToArray  
+#define OCIDateTimeFromArray       ocidt19_FromArray
+
+#define OCIIntervalSubtract        ociint01_Subtract  
+#define OCIIntervalAdd             ociint02_Add  
+#define OCIIntervalMultiply        ociint03_Multiply  
+#define OCIIntervalDivide          ociint04_Divide  
+#define OCIIntervalCompare         ociint05_Compare  
+#define OCIIntervalFromText        ociint06_FromText  
+#define OCIIntervalToText          ociint07_ToText  
+#define OCIIntervalToNumber        ociint08_ToNumber  
+#define OCIIntervalCheck           ociint09_Check  
+#define OCIIntervalAssign          ociint10_Assign  
+#define OCIIntervalGetYearMonth    ociint11_GetYearMonth
+#define OCIIntervalSetYearMonth    ociint12_SetYearMonth
+#define OCIIntervalGetDaySecond    ociint13_GetDaySecond
+#define OCIIntervalSetDaySecond    ociint14_SetDaySecond
+#define OCIIntervalFromNumber      ociint15_FromNumber
+#define OCIIntervalFromTZ          ociint16_FromTZ 
+
+#define OCIFormatInit              ocixs01_Init
+#define OCIFormatString            ocixs02_Format
+#define OCIFormatTerm              ocixs03_Term
+#define OCIFormatTUb1              ocixs04_TUb1
+#define OCIFormatTUb2              ocixs05_TUb2
+#define OCIFormatTUb4              ocixs06_TUb4
+#define OCIFormatTUword            ocixs07_TUword
+#define OCIFormatTUbig_ora         ocixs08_TUbig_ora
+#define OCIFormatTSb1              ocixs09_TSb1
+#define OCIFormatTSb2              ocixs10_TSb2
+#define OCIFormatTSb4              ocixs11_TSb4
+#define OCIFormatTSword            ocixs12_TSword
+#define OCIFormatTSbig_ora         ocixs13_TSbig_ora
+#define OCIFormatTEb1              ocixs14_TEb1
+#define OCIFormatTEb2              ocixs15_TEb2
+#define OCIFormatTEb4              ocixs16_TEb4
+#define OCIFormatTEword            ocixs17_TEword
+#define OCIFormatTChar             ocixs18_TChar
+#define OCIFormatTText             ocixs19_TText
+#define OCIFormatTDouble           ocixs20_TDouble
+#define OCIFormatTDvoid            ocixs21_TDvoid
+#define OCIFormatTEnd              ocixs22_TEnd
+
+#define OCIFileInit                ocifinit
+#define OCIFileTerm                ocifterm
+#define OCIFileOpen                ocifopen
+#define OCIFileClose               ocifclose
+#define OCIFileRead                ocifread
+#define OCIFileWrite               ocifwrite
+#define OCIFileSeek                ocifseek
+#define OCIFileExists              ocifexists
+#define OCIFileGetLength           ocifglen
+#define OCIFileFlush               ocifflush
+
+
+/* OCIThread short name */
+#define OCIThreadProcessInit       ocitt01_ProcessInit
+#define OCIThreadInit              ocitt02_Init
+#define OCIThreadTerm              ocitt03_Term
+#define OCIThreadIsMulti           ocitt04_IsMulti
+#define OCIThreadMutexInit         ocitt05_MutexInit
+#define OCIThreadMutexDestroy      ocitt06_MutexDestroy
+#define OCIThreadMutexAcquire      ocitt07_MutexAcquire
+#define OCIThreadMutexRelease      ocitt08_MutexRelease
+#define OCIThreadKeyInit           ocitt09_KeyInit
+#define OCIThreadKeyDestroy        ocitt10_KeyDestroy
+#define OCIThreadKeyGet            ocitt11_KeyGet
+#define OCIThreadKeySet            ocitt12_KeySet
+#define OCIThreadIdInit            ocitt13_IdInit
+#define OCIThreadIdDestroy         ocitt14_IdDestroy
+#define OCIThreadIdSet             ocitt15_IdSet
+#define OCIThreadIdSetNull         ocitt16_IdSetNull
+#define OCIThreadIdGet             ocitt17_IdGet
+#define OCIThreadIdSame            ocitt18_IdSame
+#define OCIThreadIdNull            ocitt19_IdNull
+#define OCIThreadHndInit           ocitt20_HndInit
+#define OCIThreadHndDestroy        ocitt21_HndDestroy
+#define OCIThreadCreate            ocitt22_Create
+#define OCIThreadJoin              ocitt23_Join
+#define OCIThreadClose             ocitt24_Close
+#define OCIThreadHandleGet         ocitt25_HandleGet
+
+/* Translation between the old and new datatypes */
+
+#define OCISession                 ociusrh
+#define OCIBind                    ocibndh
+#define OCIDescribe                ocidsch
+#define OCIDefine                  ocidfnh
+#define OCIEnv                     ocienvh
+#define OCIError                   ocierrh
+
+#define OCICPool                   ocicpool
+
+#define OCISPool                   ocispool
+#define OCIAuthInfo                ociauthinfo
+
+
+#define OCILob                     ocilobd
+#define OCILobLength               ocillen
+#define OCILobMode                 ocilmo
+#define OCILobOffset               ociloff
+
+#define OCILobLocator              ocilobd
+#define OCIBlobLocator             ociblobl
+#define OCIClobLocator             ociclobl
+#define OCIBFileLocator            ocibfilel
+
+#define OCIParam                   ocipard
+#define OCIResult                  ocirstd
+#define OCISnapshot                ocisnad
+#define OCIServer                  ocisrvh
+#define OCIStmt                    ocistmh
+#define OCISvcCtx                  ocisvch
+#define OCITrans                   ocitxnh
+#define OCICallbackInBind          ocibicfp
+#define OCICallbackOutBind         ocibocfp
+#define OCICallbackDefine          ocidcfp
+#define OCICallbackLobRead         ocilrfp
+#define OCICallbackLobWrite        ocilwfp
+#define OCISecurity                ociossh
+#define OCIComplexObject           ocicorh
+#define OCIComplexObjectComp       ocicord
+#define OCIRowid                   ociridd
+
+#define OCIAQDeq                   ociaqdeq                  
+#define OCIAQEnq                   ociaqenq
+#define OCIConnectionPoolCreate    ociconpc
+#define OCIConnectionPoolDestroy   ociconpd
+#define OCIEnvCreate               ocienvct
+#define OCILobAssign               ociloass
+#define OCILobCharSetForm          ocilocfm
+#define OCILobCharSetId            ocilocid
+#define OCILobDisableBuffering     ocilodbf
+#define OCILobEnableBuffering      ociloebf
+#define OCILobFileClose            ocilofcl
+#define OCILobFileCloseAll         ocilofca
+#define OCILobFileExists           ocilofex
+#define OCILobFileGetName          ocilofgn
+#define OCILobFileIsOpen           ocifiopn
+#define OCILobFileOpen             ocilofop
+#define OCILobFileSetName          ocilofsn
+#define OCILobFlushBuffer          ocilofbf
+#define OCILobIsEqual              ociloieq
+#define OCILobLoadFromFile         ocilolff
+#define OCILobLocatorIsInit        ocilolii
+#define OCILobLocatorAssign        ocilolas
+#define OCILogon                   ocilogon
+#define OCILogon2                  ocilgon2
+#define OCILogoff                  ocilgoff
+#endif /* ifdef SLSHORTNAME */
+
+/*--------------------------------------------------------------------------- 
+                     PUBLIC TYPES AND CONSTANTS 
+  ---------------------------------------------------------------------------*/
+
+/*-----------------------------Handle Types----------------------------------*/
+                                           /* handle types range from 1 - 49 */
+#define OCI_HTYPE_FIRST          1             /* start value of handle type */
+#define OCI_HTYPE_ENV            1                     /* environment handle */
+#define OCI_HTYPE_ERROR          2                           /* error handle */
+#define OCI_HTYPE_SVCCTX         3                         /* service handle */
+#define OCI_HTYPE_STMT           4                       /* statement handle */
+#define OCI_HTYPE_BIND           5                            /* bind handle */
+#define OCI_HTYPE_DEFINE         6                          /* define handle */
+#define OCI_HTYPE_DESCRIBE       7                        /* describe handle */
+#define OCI_HTYPE_SERVER         8                          /* server handle */
+#define OCI_HTYPE_SESSION        9                  /* authentication handle */
+#define OCI_HTYPE_AUTHINFO      OCI_HTYPE_SESSION  /* SessionGet auth handle */
+#define OCI_HTYPE_TRANS         10                     /* transaction handle */
+#define OCI_HTYPE_COMPLEXOBJECT 11        /* complex object retrieval handle */
+#define OCI_HTYPE_SECURITY      12                        /* security handle */
+#define OCI_HTYPE_SUBSCRIPTION  13                    /* subscription handle */
+#define OCI_HTYPE_DIRPATH_CTX   14                    /* direct path context */
+#define OCI_HTYPE_DIRPATH_COLUMN_ARRAY 15        /* direct path column array */
+#define OCI_HTYPE_DIRPATH_STREAM       16              /* direct path stream */
+#define OCI_HTYPE_PROC                 17                  /* process handle */
+#define OCI_HTYPE_DIRPATH_FN_CTX       18    /* direct path function context */
+#define OCI_HTYPE_DIRPATH_FN_COL_ARRAY 19          /* dp object column array */
+#define OCI_HTYPE_XADSESSION    20                  /* access driver session */
+#define OCI_HTYPE_XADTABLE      21                    /* access driver table */
+#define OCI_HTYPE_XADFIELD      22                    /* access driver field */
+#define OCI_HTYPE_XADGRANULE    23                  /* access driver granule */
+#define OCI_HTYPE_XADRECORD     24                   /* access driver record */
+#define OCI_HTYPE_XADIO         25                      /* access driver I/O */
+#define OCI_HTYPE_CPOOL         26                 /* connection pool handle */
+#define OCI_HTYPE_SPOOL         27                    /* session pool handle */
+
+#define OCI_HTYPE_LAST          27            /* last value of a handle type */
+
+/*---------------------------------------------------------------------------*/
+
+
+/*-------------------------Descriptor Types----------------------------------*/
+                                    /* descriptor values range from 50 - 255 */
+#define OCI_DTYPE_FIRST 50                 /* start value of descriptor type */
+#define OCI_DTYPE_LOB 50                                     /* lob  locator */
+#define OCI_DTYPE_SNAP 51                             /* snapshot descriptor */
+#define OCI_DTYPE_RSET 52                           /* result set descriptor */
+#define OCI_DTYPE_PARAM 53  /* a parameter descriptor obtained from ocigparm */
+#define OCI_DTYPE_ROWID  54                              /* rowid descriptor */
+#define OCI_DTYPE_COMPLEXOBJECTCOMP  55
+                                      /* complex object retrieval descriptor */
+#define OCI_DTYPE_FILE 56                                /* File Lob locator */
+#define OCI_DTYPE_AQENQ_OPTIONS 57                        /* enqueue options */
+#define OCI_DTYPE_AQDEQ_OPTIONS 58                        /* dequeue options */
+#define OCI_DTYPE_AQMSG_PROPERTIES 59                  /* message properties */
+#define OCI_DTYPE_AQAGENT 60                                     /* aq agent */
+#define OCI_DTYPE_LOCATOR 61                                  /* LOB locator */
+#define OCI_DTYPE_INTERVAL_YM 62                      /* Interval year month */
+#define OCI_DTYPE_INTERVAL_DS 63                      /* Interval day second */
+#define OCI_DTYPE_AQNFY_DESCRIPTOR  64               /* AQ notify descriptor */
+#define OCI_DTYPE_DATE 65                            /* Date */
+#define OCI_DTYPE_TIME 66                            /* Time */
+#define OCI_DTYPE_TIME_TZ 67                         /* Time with timezone */
+#define OCI_DTYPE_TIMESTAMP 68                       /* Timestamp */
+#define OCI_DTYPE_TIMESTAMP_TZ 69                /* Timestamp with timezone */
+#define OCI_DTYPE_TIMESTAMP_LTZ 70             /* Timestamp with local tz */
+#define OCI_DTYPE_UCB           71               /* user callback descriptor */
+#define OCI_DTYPE_SRVDN         72              /* server DN list descriptor */
+#define OCI_DTYPE_SIGNATURE     73                              /* signature */
+#define OCI_DTYPE_RESERVED_1    74              /* reserved for internal use */
+#define OCI_DTYPE_LAST          74        /* last value of a descriptor type */
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------------LOB types ---------------------------------*/
+#define OCI_TEMP_BLOB 1                /* LOB type - BLOB ------------------ */
+#define OCI_TEMP_CLOB 2                /* LOB type - CLOB ------------------ */
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------Object Ptr Types----------------------------------*/
+#define OCI_OTYPE_NAME 1                                      /* object name */
+#define OCI_OTYPE_REF  2                                       /* REF to TDO */
+#define OCI_OTYPE_PTR  3                                       /* PTR to TDO */
+/*---------------------------------------------------------------------------*/
+
+/*=============================Attribute Types===============================*/
+/* 
+   Note: All attributes are global.  New attibutes should be added to the end
+   of the list. Before you add an attribute see if an existing one can be 
+   used for your handle. 
+
+   If you see any holes please use the holes first. 
+ 
+*/
+/*===========================================================================*/
+
+
+#define OCI_ATTR_FNCODE  1                          /* the OCI function code */
+#define OCI_ATTR_OBJECT   2 /* is the environment initialized in object mode */
+#define OCI_ATTR_NONBLOCKING_MODE  3                    /* non blocking mode */
+#define OCI_ATTR_SQLCODE  4                                  /* the SQL verb */
+#define OCI_ATTR_ENV  5                            /* the environment handle */
+#define OCI_ATTR_SERVER 6                               /* the server handle */
+#define OCI_ATTR_SESSION 7                        /* the user session handle */
+#define OCI_ATTR_TRANS   8                         /* the transaction handle */
+#define OCI_ATTR_ROW_COUNT   9                  /* the rows processed so far */
+#define OCI_ATTR_SQLFNCODE 10               /* the SQL verb of the statement */
+#define OCI_ATTR_PREFETCH_ROWS  11    /* sets the number of rows to prefetch */
+#define OCI_ATTR_NESTED_PREFETCH_ROWS 12 /* the prefetch rows of nested table*/
+#define OCI_ATTR_PREFETCH_MEMORY 13         /* memory limit for rows fetched */
+#define OCI_ATTR_NESTED_PREFETCH_MEMORY 14   /* memory limit for nested rows */
+#define OCI_ATTR_CHAR_COUNT  15 
+                    /* this specifies the bind and define size in characters */
+#define OCI_ATTR_PDSCL   16                          /* packed decimal scale */
+#define OCI_ATTR_FSPRECISION OCI_ATTR_PDSCL   
+                                          /* fs prec for datetime data types */
+#define OCI_ATTR_PDPRC   17                         /* packed decimal format */
+#define OCI_ATTR_LFPRECISION OCI_ATTR_PDPRC 
+                                          /* fs prec for datetime data types */
+#define OCI_ATTR_PARAM_COUNT 18       /* number of column in the select list */
+#define OCI_ATTR_ROWID   19                                     /* the rowid */
+#define OCI_ATTR_CHARSET  20                      /* the character set value */
+#define OCI_ATTR_NCHAR   21                                    /* NCHAR type */
+#define OCI_ATTR_USERNAME 22                           /* username attribute */
+#define OCI_ATTR_PASSWORD 23                           /* password attribute */
+#define OCI_ATTR_STMT_TYPE   24                            /* statement type */
+#define OCI_ATTR_INTERNAL_NAME   25             /* user friendly global name */
+#define OCI_ATTR_EXTERNAL_NAME   26      /* the internal name for global txn */
+#define OCI_ATTR_XID     27           /* XOPEN defined global transaction id */
+#define OCI_ATTR_TRANS_LOCK 28                                            /* */
+#define OCI_ATTR_TRANS_NAME 29    /* string to identify a global transaction */
+#define OCI_ATTR_HEAPALLOC 30                /* memory allocated on the heap */
+#define OCI_ATTR_CHARSET_ID 31                           /* Character Set ID */
+#define OCI_ATTR_CHARSET_FORM 32                       /* Character Set Form */
+#define OCI_ATTR_MAXDATA_SIZE 33       /* Maximumsize of data on the server  */
+#define OCI_ATTR_CACHE_OPT_SIZE 34              /* object cache optimal size */
+#define OCI_ATTR_CACHE_MAX_SIZE 35   /* object cache maximum size percentage */
+#define OCI_ATTR_PINOPTION 36             /* object cache default pin option */
+#define OCI_ATTR_ALLOC_DURATION 37
+                                 /* object cache default allocation duration */
+#define OCI_ATTR_PIN_DURATION 38        /* object cache default pin duration */
+#define OCI_ATTR_FDO          39       /* Format Descriptor object attribute */
+#define OCI_ATTR_POSTPROCESSING_CALLBACK 40
+                                         /* Callback to process outbind data */
+#define OCI_ATTR_POSTPROCESSING_CONTEXT 41
+                                 /* Callback context to process outbind data */
+#define OCI_ATTR_ROWS_RETURNED 42
+               /* Number of rows returned in current iter - for Bind handles */
+#define OCI_ATTR_FOCBK        43              /* Failover Callback attribute */
+#define OCI_ATTR_IN_V8_MODE   44 /* is the server/service context in V8 mode */
+#define OCI_ATTR_LOBEMPTY     45                              /* empty lob ? */
+#define OCI_ATTR_SESSLANG     46                  /* session language handle */
+
+#define OCI_ATTR_VISIBILITY             47                     /* visibility */
+#define OCI_ATTR_RELATIVE_MSGID         48            /* relative message id */
+#define OCI_ATTR_SEQUENCE_DEVIATION     49             /* sequence deviation */
+
+#define OCI_ATTR_CONSUMER_NAME          50                  /* consumer name */
+#define OCI_ATTR_DEQ_MODE               51                   /* dequeue mode */
+#define OCI_ATTR_NAVIGATION             52                     /* navigation */
+#define OCI_ATTR_WAIT                   53                           /* wait */
+#define OCI_ATTR_DEQ_MSGID              54             /* dequeue message id */
+
+#define OCI_ATTR_PRIORITY               55                       /* priority */
+#define OCI_ATTR_DELAY                  56                          /* delay */
+#define OCI_ATTR_EXPIRATION             57                     /* expiration */
+#define OCI_ATTR_CORRELATION            58                 /* correlation id */
+#define OCI_ATTR_ATTEMPTS               59                  /* # of attempts */
+#define OCI_ATTR_RECIPIENT_LIST         60                 /* recipient list */
+#define OCI_ATTR_EXCEPTION_QUEUE        61           /* exception queue name */
+#define OCI_ATTR_ENQ_TIME               62 /* enqueue time (only OCIAttrGet) */
+#define OCI_ATTR_MSG_STATE              63/* message state (only OCIAttrGet) */
+                                                   /* NOTE: 64-66 used below */
+#define OCI_ATTR_AGENT_NAME             64                     /* agent name */
+#define OCI_ATTR_AGENT_ADDRESS          65                  /* agent address */
+#define OCI_ATTR_AGENT_PROTOCOL         66                 /* agent protocol */
+#define OCI_ATTR_USER_PROPERTY          67                  /* user property */
+#define OCI_ATTR_SENDER_ID              68                      /* sender id */
+#define OCI_ATTR_ORIGINAL_MSGID         69            /* original message id */
+
+#define OCI_ATTR_QUEUE_NAME             70                     /* queue name */
+#define OCI_ATTR_NFY_MSGID              71                     /* message id */
+#define OCI_ATTR_MSG_PROP               72             /* message properties */
+
+#define OCI_ATTR_NUM_DML_ERRORS         73       /* num of errs in array DML */
+#define OCI_ATTR_DML_ROW_OFFSET         74        /* row offset in the array */
+
+              /* AQ array error handling uses DML method of accessing errors */
+#define OCI_ATTR_AQ_NUM_ERRORS          OCI_ATTR_NUM_DML_ERRORS
+#define OCI_ATTR_AQ_ERROR_INDEX         OCI_ATTR_DML_ROW_OFFSET
+
+#define OCI_ATTR_DATEFORMAT             75     /* default date format string */
+#define OCI_ATTR_BUF_ADDR               76                 /* buffer address */
+#define OCI_ATTR_BUF_SIZE               77                    /* buffer size */
+#define OCI_ATTR_DIRPATH_MODE           78  /* mode of direct path operation */
+#define OCI_ATTR_DIRPATH_NOLOG          79               /* nologging option */
+#define OCI_ATTR_DIRPATH_PARALLEL       80     /* parallel (temp seg) option */
+#define OCI_ATTR_NUM_ROWS               81 /* number of rows in column array */
+                                  /* NOTE that OCI_ATTR_NUM_COLS is a column
+                                   * array attribute too.
+                                   */
+#define OCI_ATTR_COL_COUNT              82        /* columns of column array
+                                                     processed so far.       */
+#define OCI_ATTR_STREAM_OFFSET          83  /* str off of last row processed */
+#define OCI_ATTR_SHARED_HEAPALLOC       84    /* Shared Heap Allocation Size */
+
+#define OCI_ATTR_SERVER_GROUP           85              /* server group name */
+
+#define OCI_ATTR_MIGSESSION             86   /* migratable session attribute */
+
+#define OCI_ATTR_NOCACHE                87                 /* Temporary LOBs */
+
+#define OCI_ATTR_MEMPOOL_SIZE           88                      /* Pool Size */
+#define OCI_ATTR_MEMPOOL_INSTNAME       89                  /* Instance name */
+#define OCI_ATTR_MEMPOOL_APPNAME        90               /* Application name */
+#define OCI_ATTR_MEMPOOL_HOMENAME       91            /* Home Directory name */
+#define OCI_ATTR_MEMPOOL_MODEL          92     /* Pool Model (proc,thrd,both)*/
+#define OCI_ATTR_MODES                  93                          /* Modes */
+
+#define OCI_ATTR_SUBSCR_NAME            94           /* name of subscription */
+#define OCI_ATTR_SUBSCR_CALLBACK        95            /* associated callback */
+#define OCI_ATTR_SUBSCR_CTX             96    /* associated callback context */
+#define OCI_ATTR_SUBSCR_PAYLOAD         97             /* associated payload */
+#define OCI_ATTR_SUBSCR_NAMESPACE       98           /* associated namespace */
+
+#define OCI_ATTR_PROXY_CREDENTIALS      99         /* Proxy user credentials */
+#define OCI_ATTR_INITIAL_CLIENT_ROLES  100       /* Initial client role list */
+
+#define OCI_ATTR_UNK              101                   /* unknown attribute */
+#define OCI_ATTR_NUM_COLS         102                   /* number of columns */
+#define OCI_ATTR_LIST_COLUMNS     103        /* parameter of the column list */
+#define OCI_ATTR_RDBA             104           /* DBA of the segment header */
+#define OCI_ATTR_CLUSTERED        105      /* whether the table is clustered */
+#define OCI_ATTR_PARTITIONED      106    /* whether the table is partitioned */
+#define OCI_ATTR_INDEX_ONLY       107     /* whether the table is index only */
+#define OCI_ATTR_LIST_ARGUMENTS   108      /* parameter of the argument list */
+#define OCI_ATTR_LIST_SUBPROGRAMS 109    /* parameter of the subprogram list */
+#define OCI_ATTR_REF_TDO          110          /* REF to the type descriptor */
+#define OCI_ATTR_LINK             111              /* the database link name */
+#define OCI_ATTR_MIN              112                       /* minimum value */
+#define OCI_ATTR_MAX              113                       /* maximum value */
+#define OCI_ATTR_INCR             114                     /* increment value */
+#define OCI_ATTR_CACHE            115   /* number of sequence numbers cached */
+#define OCI_ATTR_ORDER            116     /* whether the sequence is ordered */
+#define OCI_ATTR_HW_MARK          117                     /* high-water mark */
+#define OCI_ATTR_TYPE_SCHEMA      118                  /* type's schema name */
+#define OCI_ATTR_TIMESTAMP        119             /* timestamp of the object */
+#define OCI_ATTR_NUM_ATTRS        120                /* number of sttributes */
+#define OCI_ATTR_NUM_PARAMS       121                /* number of parameters */
+#define OCI_ATTR_OBJID            122       /* object id for a table or view */
+#define OCI_ATTR_PTYPE            123           /* type of info described by */
+#define OCI_ATTR_PARAM            124                /* parameter descriptor */
+#define OCI_ATTR_OVERLOAD_ID      125     /* overload ID for funcs and procs */
+#define OCI_ATTR_TABLESPACE       126                    /* table name space */
+#define OCI_ATTR_TDO              127                       /* TDO of a type */
+#define OCI_ATTR_LTYPE            128                           /* list type */
+#define OCI_ATTR_PARSE_ERROR_OFFSET 129                /* Parse Error offset */
+#define OCI_ATTR_IS_TEMPORARY     130          /* whether table is temporary */
+#define OCI_ATTR_IS_TYPED         131              /* whether table is typed */
+#define OCI_ATTR_DURATION         132         /* duration of temporary table */
+#define OCI_ATTR_IS_INVOKER_RIGHTS 133                  /* is invoker rights */
+#define OCI_ATTR_OBJ_NAME         134           /* top level schema obj name */
+#define OCI_ATTR_OBJ_SCHEMA       135                         /* schema name */
+#define OCI_ATTR_OBJ_ID           136          /* top level schema object id */
+
+#define OCI_ATTR_DIRPATH_SORTED_INDEX    137 /* index that data is sorted on */
+
+            /* direct path index maint method (see oci8dp.h) */
+#define OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD 138
+
+    /* parallel load: db file, initial and next extent sizes */
+
+#define OCI_ATTR_DIRPATH_FILE               139      /* DB file to load into */
+#define OCI_ATTR_DIRPATH_STORAGE_INITIAL    140       /* initial extent size */
+#define OCI_ATTR_DIRPATH_STORAGE_NEXT       141          /* next extent size */
+
+
+#define OCI_ATTR_TRANS_TIMEOUT              142       /* transaction timeout */
+#define OCI_ATTR_SERVER_STATUS              143/* state of the server handle */
+#define OCI_ATTR_STATEMENT                  144 /* statement txt in stmt hdl */
+
+            /* direct path index maint method (see oci8dp.h) */
+#define OCI_ATTR_DIRPATH_SKIPINDEX_METHOD   145
+
+#define OCI_ATTR_DEQCOND                    146         /* dequeue condition */
+#define OCI_ATTR_RESERVED_2                 147                  /* reserved */
+
+  
+#define OCI_ATTR_SUBSCR_RECPT               148 /* recepient of subscription */
+#define OCI_ATTR_SUBSCR_RECPTPROTO          149    /* protocol for recepient */
+
+    /* 8.2 dpapi support of ADTs */
+#define OCI_ATTR_DIRPATH_EXPR_TYPE  150        /* expr type of OCI_ATTR_NAME */
+
+#define OCI_ATTR_DIRPATH_INPUT      151    /* input in text or stream format */
+#define OCI_DIRPATH_INPUT_TEXT     0x01
+#define OCI_DIRPATH_INPUT_STREAM   0x02
+#define OCI_DIRPATH_INPUT_UNKNOWN  0x04
+
+#define OCI_ATTR_LDAP_HOST       153              /* LDAP host to connect to */
+#define OCI_ATTR_LDAP_PORT       154              /* LDAP port to connect to */
+#define OCI_ATTR_BIND_DN         155                              /* bind DN */
+#define OCI_ATTR_LDAP_CRED       156       /* credentials to connect to LDAP */
+#define OCI_ATTR_WALL_LOC        157               /* client wallet location */
+#define OCI_ATTR_LDAP_AUTH       158           /* LDAP authentication method */
+#define OCI_ATTR_LDAP_CTX        159        /* LDAP adminstration context DN */
+#define OCI_ATTR_SERVER_DNS      160      /* list of registration server DNs */
+
+#define OCI_ATTR_DN_COUNT        161             /* the number of server DNs */
+#define OCI_ATTR_SERVER_DN       162                  /* server DN attribute */
+
+#define OCI_ATTR_MAXCHAR_SIZE               163     /* max char size of data */
+
+#define OCI_ATTR_CURRENT_POSITION           164 /* for scrollable result sets*/
+
+/* Added to get attributes for ref cursor to statement handle */
+#define OCI_ATTR_RESERVED_3                 165                  /* reserved */
+#define OCI_ATTR_RESERVED_4                 166                  /* reserved */
+#define OCI_ATTR_DIRPATH_FN_CTX             167  /* fn ctx ADT attrs or args */
+#define OCI_ATTR_DIGEST_ALGO                168          /* digest algorithm */
+#define OCI_ATTR_CERTIFICATE                169               /* certificate */
+#define OCI_ATTR_SIGNATURE_ALGO             170       /* signature algorithm */
+#define OCI_ATTR_CANONICAL_ALGO             171    /* canonicalization algo. */
+#define OCI_ATTR_PRIVATE_KEY                172               /* private key */
+#define OCI_ATTR_DIGEST_VALUE               173              /* digest value */
+#define OCI_ATTR_SIGNATURE_VAL              174           /* signature value */
+#define OCI_ATTR_SIGNATURE                  175                 /* signature */
+
+/* attributes for setting OCI stmt caching specifics in svchp */
+#define OCI_ATTR_STMTCACHESIZE              176     /* size of the stm cache */
+
+/* --------------------------- Connection Pool Attributes ------------------ */
+#define OCI_ATTR_CONN_NOWAIT               178
+#define OCI_ATTR_CONN_BUSY_COUNT            179
+#define OCI_ATTR_CONN_OPEN_COUNT            180
+#define OCI_ATTR_CONN_TIMEOUT               181
+#define OCI_ATTR_STMT_STATE                 182
+#define OCI_ATTR_CONN_MIN                   183
+#define OCI_ATTR_CONN_MAX                   184
+#define OCI_ATTR_CONN_INCR                  185
+
+#define OCI_ATTR_DIRPATH_OID                187   /* loading into an OID col */
+
+#define OCI_ATTR_NUM_OPEN_STMTS             188     /* open stmts in session */
+#define OCI_ATTR_DESCRIBE_NATIVE            189  /* get native info via desc */
+
+#define OCI_ATTR_BIND_COUNT                 190   /* number of bind postions */
+#define OCI_ATTR_HANDLE_POSITION            191 /* pos of bind/define handle */
+#define OCI_ATTR_RESERVED_5                 192                 /* reserverd */
+#define OCI_ATTR_SERVER_BUSY                193 /* call in progress on server*/
+
+#define OCI_ATTR_DIRPATH_SID                194   /* loading into an SID col */
+/* notification presentation for recipient */
+#define OCI_ATTR_SUBSCR_RECPTPRES           195
+#define OCI_ATTR_TRANSFORMATION             196 /* AQ message transformation */
+
+#define OCI_ATTR_ROWS_FETCHED               197 /* rows fetched in last call */
+
+/* --------------------------- Snapshot attributes ------------------------- */
+#define OCI_ATTR_SCN_BASE                   198             /* snapshot base */
+#define OCI_ATTR_SCN_WRAP                   199             /* snapshot wrap */
+
+/* --------------------------- Miscellanous attributes --------------------- */
+#define OCI_ATTR_RESERVED_6                 200                  /* reserved */
+#define OCI_ATTR_READONLY_TXN               201           /* txn is readonly */
+#define OCI_ATTR_RESERVED_7                 202                  /* reserved */
+#define OCI_ATTR_ERRONEOUS_COLUMN           203 /* position of erroneous col */
+#define OCI_ATTR_RESERVED_8                 204                  /* reserved */
+
+/* -------------------- 8.2 dpapi support of ADTs continued ---------------- */
+#define OCI_ATTR_DIRPATH_OBJ_CONSTR         206 /* obj type of subst obj tbl */
+#define OCI_ATTR_INST_TYPE                  207      /* oracle instance type */
+/******USED attribute 208 for  OCI_ATTR_SPOOL_STMTCACHESIZE*******************/
+
+#define OCI_ATTR_ENV_UTF16                  209     /* is env in utf16 mode? */
+#define OCI_ATTR_RESERVED_9                 210          /* reserved for TMZ */
+#define OCI_ATTR_RESERVED_10                211                  /* reserved */
+
+/* Attr to allow setting of the stream version PRIOR to calling Prepare */
+#define OCI_ATTR_DIRPATH_STREAM_VERSION     212      /* version of the stream*/
+
+#define OCIP_ATTR_DIRPATH_VARRAY_INDEX      213       /* varray index column */
+
+#define OCI_ATTR_RESERVED_12                214                  /* reserved */
+#define OCI_ATTR_RESERVED_13                215                  /* reserved */
+#define OCI_ATTR_IS_EXTERNAL                216 /* whether table is external */
+
+
+/* -------------------------- Statement Handle Attributes ------------------ */
+
+#define OCI_ATTR_RESERVED_15                217                  /* reserved */
+#define OCI_ATTR_STMT_IS_RETURNING          218 /* stmt has returning clause */
+#define OCI_ATTR_RESERVED_16                219                  /* reserved */
+#define OCI_ATTR_RESERVED_17                220                  /* reserved */
+#define OCI_ATTR_RESERVED_18                221                  /* reserved */
+
+/* --------------------------- session attributes ---------------------------*/
+#define OCI_ATTR_RESERVED_19                222                  /* reserved */
+
+/*------------- Supported Values for Direct Path Stream Version -------------*/
+#define OCI_DIRPATH_STREAM_VERSION_1        100
+#define OCI_DIRPATH_STREAM_VERSION_2        200
+#define OCI_DIRPATH_STREAM_VERSION_3        300                   /* default */
+
+/* ----------------------- row callback attributes ------------------------- */
+#define OCI_ATTR_BIND_ROWCBK                301         /* bind row callback */
+#define OCI_ATTR_BIND_ROWCTX                302 /* ctx for bind row callback */
+#define OCI_ATTR_SKIP_BUFFER                303  /* skip buffer in array ops */
+
+/* -------- client side character and national character set ids ----------- */
+#define OCI_ATTR_ENV_CHARSET_ID   OCI_ATTR_CHARSET_ID   /* charset id in env */
+#define OCI_ATTR_ENV_NCHARSET_ID  OCI_ATTR_NCHARSET_ID /* ncharset id in env */
+
+
+/*------------- Supported Values for protocol for recepient -----------------*/
+#define OCI_SUBSCR_PROTO_OCI                0                         /* oci */
+#define OCI_SUBSCR_PROTO_MAIL               1                        /* mail */
+#define OCI_SUBSCR_PROTO_SERVER             2                      /* server */
+#define OCI_SUBSCR_PROTO_HTTP               3                        /* http */
+#define OCI_SUBSCR_PROTO_MAX                4       /* max current protocols */
+
+/*------------- Supported Values for presentation for recepient -------------*/
+#define OCI_SUBSCR_PRES_DEFAULT             0                     /* default */
+#define OCI_SUBSCR_PRES_XML                 1                         /* xml */
+#define OCI_SUBSCR_PRES_MAX                 2   /* max current presentations */
+                                                   
+
+/* ----- Temporary attribute value for UCS2/UTF16 character set ID -------- */ 
+#define OCI_UCS2ID            1000                        /* UCS2 charset ID */
+#define OCI_UTF16ID           1000                       /* UTF16 charset ID */
+
+/*============================== End OCI Attribute Types ====================*/
+
+/*---------------- Server Handle Attribute Values ---------------------------*/
+
+/* OCI_ATTR_SERVER_STATUS */
+#define OCI_SERVER_NOT_CONNECTED        0x0 
+#define OCI_SERVER_NORMAL               0x1 
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- Supported Namespaces  ---------------------------*/
+#define OCI_SUBSCR_NAMESPACE_ANONYMOUS   0            /* Anonymous Namespace */
+#define OCI_SUBSCR_NAMESPACE_AQ          1                /* Advanced Queues */
+#define OCI_SUBSCR_NAMESPACE_MAX         2          /* Max Name Space Number */
+
+
+/*-------------------------Credential Types----------------------------------*/
+#define OCI_CRED_RDBMS      1                  /* database username/password */
+#define OCI_CRED_EXT        2             /* externally provided credentials */
+#define OCI_CRED_PROXY      3                        /* proxy authentication */
+#define OCI_CRED_RESERVED_1 4                                    /* reserved */
+#define OCI_CRED_RESERVED_2 5                                    /* reserved */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Error Return Values--------------------------------*/
+#define OCI_SUCCESS 0                      /* maps to SQL_SUCCESS of SAG CLI */
+#define OCI_SUCCESS_WITH_INFO 1             /* maps to SQL_SUCCESS_WITH_INFO */
+#define OCI_RESERVED_FOR_INT_USE 200                            /* reserved */ 
+#define OCI_NO_DATA 100                               /* maps to SQL_NO_DATA */
+#define OCI_ERROR -1                                    /* maps to SQL_ERROR */
+#define OCI_INVALID_HANDLE -2                  /* maps to SQL_INVALID_HANDLE */
+#define OCI_NEED_DATA 99                            /* maps to SQL_NEED_DATA */
+#define OCI_STILL_EXECUTING -3123                   /* OCI would block error */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------- User Callback Return Values -------------------------*/
+#define OCI_CONTINUE -24200    /* Continue with the body of the OCI function */
+#define OCI_ROWCBK_DONE   -24201              /* done with user row callback */
+/*---------------------------------------------------------------------------*/
+
+/*------------------DateTime and Interval check Error codes------------------*/
+
+/* DateTime Error Codes used by OCIDateTimeCheck() */
+#define   OCI_DT_INVALID_DAY         0x1                          /* Bad day */
+#define   OCI_DT_DAY_BELOW_VALID     0x2      /* Bad DAy Low/high bit (1=low)*/
+#define   OCI_DT_INVALID_MONTH       0x4                       /*  Bad MOnth */
+#define   OCI_DT_MONTH_BELOW_VALID   0x8   /* Bad MOnth Low/high bit (1=low) */
+#define   OCI_DT_INVALID_YEAR        0x10                        /* Bad YeaR */
+#define   OCI_DT_YEAR_BELOW_VALID    0x20  /*  Bad YeaR Low/high bit (1=low) */
+#define   OCI_DT_INVALID_HOUR        0x40                       /*  Bad HouR */
+#define   OCI_DT_HOUR_BELOW_VALID    0x80   /* Bad HouR Low/high bit (1=low) */
+#define   OCI_DT_INVALID_MINUTE      0x100                     /* Bad MiNute */
+#define   OCI_DT_MINUTE_BELOW_VALID  0x200 /*Bad MiNute Low/high bit (1=low) */
+#define   OCI_DT_INVALID_SECOND      0x400                    /*  Bad SeCond */
+#define   OCI_DT_SECOND_BELOW_VALID  0x800  /*bad second Low/high bit (1=low)*/
+#define   OCI_DT_DAY_MISSING_FROM_1582 0x1000     
+                                 /*  Day is one of those "missing" from 1582 */
+#define   OCI_DT_YEAR_ZERO           0x2000       /* Year may not equal zero */
+#define   OCI_DT_INVALID_TIMEZONE    0x4000                 /*  Bad Timezone */
+#define   OCI_DT_INVALID_FORMAT      0x8000         /* Bad date format input */
+
+
+/* Interval Error Codes used by OCIInterCheck() */
+#define   OCI_INTER_INVALID_DAY         0x1                       /* Bad day */
+#define   OCI_INTER_DAY_BELOW_VALID     0x2  /* Bad DAy Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_MONTH       0x4                     /* Bad MOnth */
+#define   OCI_INTER_MONTH_BELOW_VALID   0x8 /*Bad MOnth Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_YEAR        0x10                     /* Bad YeaR */
+#define   OCI_INTER_YEAR_BELOW_VALID    0x20 /*Bad YeaR Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_HOUR        0x40                     /* Bad HouR */
+#define   OCI_INTER_HOUR_BELOW_VALID    0x80 /*Bad HouR Low/high bit (1=low) */
+#define   OCI_INTER_INVALID_MINUTE      0x100                  /* Bad MiNute */
+#define   OCI_INTER_MINUTE_BELOW_VALID  0x200 
+                                            /*Bad MiNute Low/high bit(1=low) */
+#define   OCI_INTER_INVALID_SECOND      0x400                  /* Bad SeCond */
+#define   OCI_INTER_SECOND_BELOW_VALID  0x800   
+                                            /*bad second Low/high bit(1=low) */
+#define   OCI_INTER_INVALID_FRACSEC     0x1000      /* Bad Fractional second */
+#define   OCI_INTER_FRACSEC_BELOW_VALID 0x2000  
+                                           /* Bad fractional second Low/High */
+
+
+/*------------------------Parsing Syntax Types-------------------------------*/
+#define OCI_V7_SYNTAX 2       /* V815 language - for backwards compatibility */
+#define OCI_V8_SYNTAX 3       /* V815 language - for backwards compatibility */
+#define OCI_NTV_SYNTAX 1    /* Use what so ever is the native lang of server */
+                     /* these values must match the values defined in kpul.h */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Scrollable Cursor Fetch Options------------------- 
+ * For non-scrollable cursor, the only valid (and default) orientation is 
+ * OCI_FETCH_NEXT
+ */
+#define OCI_FETCH_CURRENT 0x01               /* refetching current position  */
+#define OCI_FETCH_NEXT 0x02                                      /* next row */
+#define OCI_FETCH_FIRST 0x04                  /* first row of the result set */
+#define OCI_FETCH_LAST 0x08                /* the last row of the result set */
+#define OCI_FETCH_PRIOR 0x10         /* the previous row relative to current */
+#define OCI_FETCH_ABSOLUTE 0x20                /* absolute offset from first */
+#define OCI_FETCH_RELATIVE 0x40                /* offset relative to current */
+#define OCI_FETCH_RESERVED_1 0x80                                /* reserved */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Bind and Define Options----------------------------*/
+#define OCI_SB2_IND_PTR       0x00000001                           /* unused */
+#define OCI_DATA_AT_EXEC      0x00000002             /* data at execute time */
+#define OCI_DYNAMIC_FETCH     0x00000002                /* fetch dynamically */
+#define OCI_PIECEWISE         0x00000004          /* piecewise DMLs or fetch */
+#define OCI_DEFINE_RESERVED_1 0x00000008                         /* reserved */
+#define OCI_BIND_RESERVED_2   0x00000010                         /* reserved */
+#define OCI_DEFINE_RESERVED_2 0x00000020                         /* reserved */
+#define OCI_BIND_SOFT         0x00000040              /* soft bind or define */
+#define OCI_DEFINE_SOFT       0x00000080              /* soft bind or define */
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------------  Various Modes ------------------------------*/
+#define OCI_DEFAULT         0x00000000 
+                          /* the default value for parameters and attributes */
+/*-------------OCIInitialize Modes / OCICreateEnvironment Modes -------------*/
+#define OCI_THREADED        0x00000001      /* appl. in threaded environment */
+#define OCI_OBJECT          0x00000002  /* application in object environment */
+#define OCI_EVENTS          0x00000004  /* application is enabled for events */
+#define OCI_RESERVED1       0x00000008                           /* reserved */
+#define OCI_SHARED          0x00000010  /* the application is in shared mode */
+#define OCI_RESERVED2       0x00000020                           /* reserved */
+/* The following *TWO* are only valid for OCICreateEnvironment call */
+#define OCI_NO_UCB          0x00000040 /* No user callback called during ini */
+#define OCI_NO_MUTEX        0x00000080 /* the environment handle will not be */
+                                         /*  protected by a mutex internally */
+#define OCI_SHARED_EXT      0x00000100              /* Used for shared forms */
+/************************** 0x00000200 free **********************************/
+#define OCI_ALWAYS_BLOCKING 0x00000400    /* all connections always blocking */
+/************************** 0x00000800 free **********************************/
+#define OCI_USE_LDAP        0x00001000            /* allow  LDAP connections */
+#define OCI_REG_LDAPONLY    0x00002000              /* only register to LDAP */
+#define OCI_UTF16           0x00004000        /* mode for all UTF16 metadata */
+#define OCI_AFC_PAD_ON      0x00008000 
+                             /* turn on AFC blank padding when rlenp present */
+#define OCI_ENVCR_RESERVED3 0x00010000                           /* reserved */
+#define OCI_NEW_LENGTH_SEMANTICS  0x00020000   /* adopt new length semantics */
+       /* the new length semantics, always bytes, is used by OCIEnvNlsCreate */
+#define OCI_NO_MUTEX_STMT   0x00040000           /* Do not mutex stmt handle */
+#define OCI_MUTEX_ENV_ONLY  0x00080000  /* Mutex only the environment handle */
+#define OCI_STM_RESERVED4   0x00100000                           /* reserved */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------OCIConnectionpoolCreate Modes----------------------*/
+
+#define OCI_CPOOL_REINITIALIZE 0x111
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------------- OCILogon2 Modes -------------------------*/
+
+#define OCI_LOGON2_SPOOL       0x0001     /* Use session pool */
+#define OCI_LOGON2_CPOOL       OCI_CPOOL  /* Use connection pool */
+#define OCI_LOGON2_STMTCACHE   0x0004     /* Use Stmt Caching */
+#define OCI_LOGON2_PROXY       0x0008     /* Proxy authentiaction */
+
+/*---------------------------------------------------------------------------*/
+/*------------------------- OCISessionPoolCreate Modes ----------------------*/
+
+#define OCI_SPC_REINITIALIZE 0x0001   /* Reinitialize the session pool */
+#define OCI_SPC_HOMOGENEOUS  0x0002   /* Session pool is homogeneneous */
+#define OCI_SPC_STMTCACHE    0x0004   /* Session pool has stmt cache */
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------- OCISessionGet Modes ---------------------------*/
+
+#define OCI_SESSGET_SPOOL      0x0001     /* SessionGet called in SPOOL mode */
+#define OCI_SESSGET_CPOOL      OCI_CPOOL  /* SessionGet called in CPOOL mode */
+#define OCI_SESSGET_STMTCACHE  0x0004                 /* Use statement cache */
+#define OCI_SESSGET_CREDPROXY  0x0008     /* SessionGet called in proxy mode */
+#define OCI_SESSGET_CREDEXT    0x0010     
+#define OCI_SESSGET_SPOOL_MATCHANY 0x0020
+/*---------------------------------------------------------------------------*/
+/*------------------------ATTR Values for Session Pool-----------------------*/
+/* Attribute values for OCI_ATTR_SPOOL_GETMODE */
+#define OCI_SPOOL_ATTRVAL_WAIT     0         /* block till you get a session */
+#define OCI_SPOOL_ATTRVAL_NOWAIT   1    /* error out if no session avaliable */
+#define OCI_SPOOL_ATTRVAL_FORCEGET 2  /* get session even if max is exceeded */
+
+/*---------------------------------------------------------------------------*/
+/*--------------------------- OCISessionRelease Modes -----------------------*/
+
+#define OCI_SESSRLS_DROPSESS 0x0001                    /* Drop the Session */
+#define OCI_SESSRLS_RETAG    0x0002                   /* Retag the session */
+
+/*---------------------------------------------------------------------------*/
+/*----------------------- OCISessionPoolDestroy Modes -----------------------*/
+
+#define OCI_SPD_FORCE        0x0001       /* Force the sessions to terminate. 
+                                             Even if there are some busy 
+                                             sessions close them */
+ 
+/*---------------------------------------------------------------------------*/
+/*----------------------------- Statement States ----------------------------*/
+
+#define OCI_STMT_STATE_INITIALIZED  0x0001
+#define OCI_STMT_STATE_EXECUTED     0x0002
+#define OCI_STMT_STATE_END_OF_FETCH 0x0003
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- OCIMemStats Modes ---------------------------*/
+#define OCI_MEM_INIT        0x01 
+#define OCI_MEM_CLN         0x02 
+#define OCI_MEM_FLUSH       0x04 
+#define OCI_DUMP_HEAP       0x80
+
+#define OCI_CLIENT_STATS    0x10 
+#define OCI_SERVER_STATS    0x20 
+
+/*----------------------------- OCIEnvInit Modes ----------------------------*/
+/* NOTE: NO NEW MODES SHOULD BE ADDED HERE BECAUSE THE RECOMMENDED METHOD 
+ * IS TO USE THE NEW OCICreateEnvironment MODES.
+ */
+#define OCI_ENV_NO_UCB 0x01         /* A user callback will not be called in
+                                       OCIEnvInit() */
+#define OCI_ENV_NO_MUTEX 0x08 /* the environment handle will not be protected
+                                 by a mutex internally */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Prepare Modes ------------------------------------*/
+#define OCI_NO_SHARING        0x01      /* turn off statement handle sharing */
+#define OCI_PREP_RESERVED_1   0x02                               /* reserved */
+#define OCI_PREP_AFC_PAD_ON   0x04          /* turn on blank padding for AFC */
+#define OCI_PREP_AFC_PAD_OFF  0x08         /* turn off blank padding for AFC */
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------- Execution Modes -----------------------------------*/
+#define OCI_BATCH_MODE        0x01  /* batch the oci statement for execution */
+#define OCI_EXACT_FETCH       0x02         /* fetch the exact rows specified */
+#define OCI_KEEP_FETCH_STATE  0x04                                 /* unused */
+#define OCI_STMT_SCROLLABLE_READONLY 0x08     /* if result set is scrollable */
+#define OCI_DESCRIBE_ONLY     0x10            /* only describe the statement */
+#define OCI_COMMIT_ON_SUCCESS 0x20        /* commit, if successful execution */
+#define OCI_NON_BLOCKING      0x40                           /* non-blocking */
+#define OCI_BATCH_ERRORS      0x80             /* batch errors in array dmls */
+#define OCI_PARSE_ONLY        0x100              /* only parse the statement */
+#define OCI_EXACT_FETCH_RESERVED_1 0x200                         /* reserved */
+#define OCI_SHOW_DML_WARNINGS 0x400   
+         /* return OCI_SUCCESS_WITH_INFO for delete/update w/no where clause */
+#define OCI_EXEC_RESERVED_2   0x800                              /* reserved */
+#define OCI_DESC_RESERVED_1   0x1000                             /* reserved */
+#define OCI_EXEC_RESERVED_3   0x2000                             /* reserved */
+#define OCI_EXEC_RESERVED_4   0x4000                             /* reserved */  
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Authentication Modes-------------------------------*/
+#define OCI_MIGRATE         0x0001                /* migratable auth context */
+#define OCI_SYSDBA          0x0002               /* for SYSDBA authorization */
+#define OCI_SYSOPER         0x0004              /* for SYSOPER authorization */
+#define OCI_PRELIM_AUTH     0x0008          /* for preliminary authorization */
+#define OCIP_ICACHE         0x0010 /* Private OCI cache mode to notify cache */
+#define OCI_AUTH_RESERVED_1 0x0020                               /* reserved */
+#define OCI_STMT_CACHE      0x0040                /* enable OCI Stmt Caching */
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Session End Modes----------------------------------*/
+#define OCI_SESSEND_RESERVED_1 0x0001                            /* reserved */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------Attach Modes---------------------------------------*/
+
+/* The following attach modes are the same as the UPI modes defined in 
+ * UPIDEF.H.  Do not use these values externally.
+ */
+
+#define OCI_FASTPATH         0x0010              /* Attach in fast path mode */
+#define OCI_ATCH_RESERVED_1  0x0020                              /* reserved */
+#define OCI_ATCH_RESERVED_2  0x0080                              /* reserved */
+#define OCI_ATCH_RESERVED_3  0x0100                              /* reserved */
+#define OCI_CPOOL            0x0200  /* Attach using server handle from pool */
+#define OCI_ATCH_RESERVED_4  0x0400                              /* reserved */
+
+/*---------------------OCIStmtPrepare2 Modes---------------------------------*/
+#define OCI_PREP2_CACHE_SEARCHONLY    0x0010                  /* ONly Search */
+#define OCI_PREP2_GET_PLSQL_WARNINGS  0x0020         /* Get PL/SQL warnings  */
+
+/*---------------------OCIStmtRelease Modes----------------------------------*/
+#define OCI_STRLS_CACHE_DELETE      0x0010              /* Delete from Cache */
+
+/*-----------------------------End Various Modes ----------------------------*/
+
+/*------------------------Piece Information----------------------------------*/
+#define OCI_PARAM_IN 0x01                                    /* in parameter */
+#define OCI_PARAM_OUT 0x02                                  /* out parameter */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Transaction Start Flags --------------------------*/
+/* NOTE: OCI_TRANS_JOIN and OCI_TRANS_NOMIGRATE not supported in 8.0.X       */
+#define OCI_TRANS_NEW          0x00000001 /* starts a new transaction branch */
+#define OCI_TRANS_JOIN         0x00000002    /* join an existing transaction */
+#define OCI_TRANS_RESUME       0x00000004         /* resume this transaction */
+#define OCI_TRANS_STARTMASK    0x000000ff
+
+#define OCI_TRANS_READONLY     0x00000100   /* starts a readonly transaction */
+#define OCI_TRANS_READWRITE    0x00000200 /* starts a read-write transaction */
+#define OCI_TRANS_SERIALIZABLE 0x00000400
+                                        /* starts a serializable transaction */
+#define OCI_TRANS_ISOLMASK     0x0000ff00
+
+#define OCI_TRANS_LOOSE        0x00010000        /* a loosely coupled branch */
+#define OCI_TRANS_TIGHT        0x00020000        /* a tightly coupled branch */
+#define OCI_TRANS_TYPEMASK     0x000f0000
+
+#define OCI_TRANS_NOMIGRATE    0x00100000      /* non migratable transaction */
+#define OCI_TRANS_SEPARABLE    0x00200000  /* separable transaction (8.1.6+) */
+
+
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Transaction End Flags ----------------------------*/
+#define OCI_TRANS_TWOPHASE      0x01000000           /* use two phase commit */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- AQ Constants ------------------------------------
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ * The following constants must match the PL/SQL dbms_aq constants
+ * NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
+ */
+/* ------------------------- Visibility flags -------------------------------*/
+#define OCI_ENQ_IMMEDIATE       1   /* enqueue is an independent transaction */
+#define OCI_ENQ_ON_COMMIT       2  /* enqueue is part of current transaction */
+
+/* ----------------------- Dequeue mode flags -------------------------------*/
+#define OCI_DEQ_BROWSE          1   /* read message without acquiring a lock */
+#define OCI_DEQ_LOCKED          2   /* read and obtain write lock on message */
+#define OCI_DEQ_REMOVE          3          /* read the message and delete it */
+#define OCI_DEQ_REMOVE_NODATA   4    /* delete message w'o returning payload */
+#define OCI_DEQ_GETSIG          5                      /* get signature only */
+
+/* ----------------- Dequeue navigation flags -------------------------------*/
+#define OCI_DEQ_FIRST_MSG        1     /* get first message at head of queue */
+#define OCI_DEQ_NEXT_MSG         3         /* next message that is available */
+#define OCI_DEQ_NEXT_TRANSACTION 2    /* get first message of next txn group */
+#define OCI_DEQ_MULT_TRANSACTION 5        /* array dequeue across txn groups */
+
+/* ----------------- Dequeue Option Reserved flags ------------------------- */
+#define OCI_DEQ_RESERVED_1      0x000001
+
+/* --------------------- Message states -------------------------------------*/
+#define OCI_MSG_WAITING         1 /* the message delay has not yet completed */
+#define OCI_MSG_READY           0    /* the message is ready to be processed */
+#define OCI_MSG_PROCESSED       2          /* the message has been processed */
+#define OCI_MSG_EXPIRED         3    /* message has moved to exception queue */
+
+/* --------------------- Sequence deviation ---------------------------------*/
+#define OCI_ENQ_BEFORE          2  /* enqueue message before another message */
+#define OCI_ENQ_TOP             3     /* enqueue message before all messages */
+
+/* ------------------------- Visibility flags -------------------------------*/
+#define OCI_DEQ_IMMEDIATE       1   /* dequeue is an independent transaction */
+#define OCI_DEQ_ON_COMMIT       2  /* dequeue is part of current transaction */
+
+/* ------------------------ Wait --------------------------------------------*/
+#define OCI_DEQ_WAIT_FOREVER    -1   /* wait forever if no message available */
+#define OCI_DEQ_NO_WAIT         0  /* do not wait if no message is available */
+
+/* ------------------------ Delay -------------------------------------------*/
+#define OCI_MSG_NO_DELAY        0        /* message is available immediately */
+
+/* ------------------------- Expiration -------------------------------------*/
+#define OCI_MSG_NO_EXPIRATION -1                /* message will never expire */
+
+/* ------------------------- Reserved ---------------------------------------*/
+#define OCI_AQ_RESERVED_1      0x0002
+#define OCI_AQ_RESERVED_2      0x0004
+#define OCI_AQ_RESERVED_3      0x0008
+
+/* -------------------------- END AQ Constants ----------------------------- */
+
+/* --------------------END DateTime and Interval Constants ------------------*/
+
+/*-----------------------Object Types----------------------------------------*/
+/*-----------Object Types **** Not to be Used **** --------------------------*/
+/* Deprecated */
+#define OCI_OTYPE_UNK           0
+#define OCI_OTYPE_TABLE         1
+#define OCI_OTYPE_VIEW          2
+#define OCI_OTYPE_SYN           3
+#define OCI_OTYPE_PROC          4
+#define OCI_OTYPE_FUNC          5
+#define OCI_OTYPE_PKG           6
+#define OCI_OTYPE_STMT          7
+/*---------------------------------------------------------------------------*/
+
+/*=======================Describe Handle Parameter Attributes ===============*/
+/* 
+   These attributes are orthogonal to the other set of attributes defined 
+   above.  These attrubutes are tobe used only for the desscribe handle 
+*/
+/*===========================================================================*/
+/* Attributes common to Columns and Stored Procs */
+#define OCI_ATTR_DATA_SIZE      1                /* maximum size of the data */
+#define OCI_ATTR_DATA_TYPE      2     /* the SQL type of the column/argument */
+#define OCI_ATTR_DISP_SIZE      3                        /* the display size */
+#define OCI_ATTR_NAME           4         /* the name of the column/argument */
+#define OCI_ATTR_PRECISION      5                /* precision if number type */
+#define OCI_ATTR_SCALE          6                    /* scale if number type */
+#define OCI_ATTR_IS_NULL        7                            /* is it null ? */
+#define OCI_ATTR_TYPE_NAME      8
+  /* name of the named data type or a package name for package private types */
+#define OCI_ATTR_SCHEMA_NAME    9             /* the schema name */
+#define OCI_ATTR_SUB_NAME       10      /* type name if package private type */
+#define OCI_ATTR_POSITION       11
+                    /* relative position of col/arg in the list of cols/args */
+/* complex object retrieval parameter attributes */
+#define OCI_ATTR_COMPLEXOBJECTCOMP_TYPE         50 
+#define OCI_ATTR_COMPLEXOBJECTCOMP_TYPE_LEVEL   51
+#define OCI_ATTR_COMPLEXOBJECT_LEVEL            52
+#define OCI_ATTR_COMPLEXOBJECT_COLL_OUTOFLINE   53
+
+/* Only Columns */
+#define OCI_ATTR_DISP_NAME      100                      /* the display name */
+
+/*Only Stored Procs */
+#define OCI_ATTR_OVERLOAD       210           /* is this position overloaded */
+#define OCI_ATTR_LEVEL          211            /* level for structured types */
+#define OCI_ATTR_HAS_DEFAULT    212                   /* has a default value */
+#define OCI_ATTR_IOMODE         213                         /* in, out inout */
+#define OCI_ATTR_RADIX          214                       /* returns a radix */
+#define OCI_ATTR_NUM_ARGS       215             /* total number of arguments */
+
+/* only named type attributes */
+#define OCI_ATTR_TYPECODE                  216       /* object or collection */
+#define OCI_ATTR_COLLECTION_TYPECODE       217     /* varray or nested table */
+#define OCI_ATTR_VERSION                   218      /* user assigned version */
+#define OCI_ATTR_IS_INCOMPLETE_TYPE        219 /* is this an incomplete type */
+#define OCI_ATTR_IS_SYSTEM_TYPE            220              /* a system type */
+#define OCI_ATTR_IS_PREDEFINED_TYPE        221          /* a predefined type */
+#define OCI_ATTR_IS_TRANSIENT_TYPE         222           /* a transient type */
+#define OCI_ATTR_IS_SYSTEM_GENERATED_TYPE  223      /* system generated type */
+#define OCI_ATTR_HAS_NESTED_TABLE          224 /* contains nested table attr */
+#define OCI_ATTR_HAS_LOB                   225        /* has a lob attribute */
+#define OCI_ATTR_HAS_FILE                  226       /* has a file attribute */
+#define OCI_ATTR_COLLECTION_ELEMENT        227 /* has a collection attribute */
+#define OCI_ATTR_NUM_TYPE_ATTRS            228  /* number of attribute types */
+#define OCI_ATTR_LIST_TYPE_ATTRS           229    /* list of type attributes */
+#define OCI_ATTR_NUM_TYPE_METHODS          230     /* number of type methods */
+#define OCI_ATTR_LIST_TYPE_METHODS         231       /* list of type methods */
+#define OCI_ATTR_MAP_METHOD                232         /* map method of type */
+#define OCI_ATTR_ORDER_METHOD              233       /* order method of type */
+
+/* only collection element */
+#define OCI_ATTR_NUM_ELEMS                 234         /* number of elements */
+
+/* only type methods */
+#define OCI_ATTR_ENCAPSULATION             235        /* encapsulation level */
+#define OCI_ATTR_IS_SELFISH                236             /* method selfish */
+#define OCI_ATTR_IS_VIRTUAL                237                    /* virtual */
+#define OCI_ATTR_IS_INLINE                 238                     /* inline */
+#define OCI_ATTR_IS_CONSTANT               239                   /* constant */
+#define OCI_ATTR_HAS_RESULT                240                 /* has result */
+#define OCI_ATTR_IS_CONSTRUCTOR            241                /* constructor */
+#define OCI_ATTR_IS_DESTRUCTOR             242                 /* destructor */
+#define OCI_ATTR_IS_OPERATOR               243                   /* operator */
+#define OCI_ATTR_IS_MAP                    244               /* a map method */
+#define OCI_ATTR_IS_ORDER                  245               /* order method */
+#define OCI_ATTR_IS_RNDS                   246  /* read no data state method */
+#define OCI_ATTR_IS_RNPS                   247      /* read no process state */
+#define OCI_ATTR_IS_WNDS                   248 /* write no data state method */
+#define OCI_ATTR_IS_WNPS                   249     /* write no process state */
+
+#define OCI_ATTR_DESC_PUBLIC               250              /* public object */
+
+/* Object Cache Enhancements : attributes for User Constructed Instances     */
+#define OCI_ATTR_CACHE_CLIENT_CONTEXT      251
+#define OCI_ATTR_UCI_CONSTRUCT             252
+#define OCI_ATTR_UCI_DESTRUCT              253
+#define OCI_ATTR_UCI_COPY                  254
+#define OCI_ATTR_UCI_PICKLE                255
+#define OCI_ATTR_UCI_UNPICKLE              256
+#define OCI_ATTR_UCI_REFRESH               257
+
+/* for type inheritance */
+#define OCI_ATTR_IS_SUBTYPE                258
+#define OCI_ATTR_SUPERTYPE_SCHEMA_NAME     259
+#define OCI_ATTR_SUPERTYPE_NAME            260
+
+/* for schemas */
+#define OCI_ATTR_LIST_OBJECTS              261  /* list of objects in schema */
+
+/* for database */
+#define OCI_ATTR_NCHARSET_ID               262                /* char set id */
+#define OCI_ATTR_LIST_SCHEMAS              263            /* list of schemas */
+#define OCI_ATTR_MAX_PROC_LEN              264       /* max procedure length */
+#define OCI_ATTR_MAX_COLUMN_LEN            265     /* max column name length */
+#define OCI_ATTR_CURSOR_COMMIT_BEHAVIOR    266     /* cursor commit behavior */
+#define OCI_ATTR_MAX_CATALOG_NAMELEN       267         /* catalog namelength */
+#define OCI_ATTR_CATALOG_LOCATION          268           /* catalog location */
+#define OCI_ATTR_SAVEPOINT_SUPPORT         269          /* savepoint support */
+#define OCI_ATTR_NOWAIT_SUPPORT            270             /* nowait support */
+#define OCI_ATTR_AUTOCOMMIT_DDL            271             /* autocommit DDL */
+#define OCI_ATTR_LOCKING_MODE              272               /* locking mode */
+
+/* for externally initialized context */
+#define OCI_ATTR_APPCTX_SIZE               273 /* count of context to be init*/
+#define OCI_ATTR_APPCTX_LIST               274 /* count of context to be init*/
+#define OCI_ATTR_APPCTX_NAME               275 /* name  of context to be init*/
+#define OCI_ATTR_APPCTX_ATTR               276 /* attr  of context to be init*/
+#define OCI_ATTR_APPCTX_VALUE              277 /* value of context to be init*/
+
+/* for client id propagation */
+#define OCI_ATTR_CLIENT_IDENTIFIER         278   /* value of client id to set*/
+
+/* for inheritance - part 2 */
+#define OCI_ATTR_IS_FINAL_TYPE             279            /* is final type ? */
+#define OCI_ATTR_IS_INSTANTIABLE_TYPE      280     /* is instantiable type ? */
+#define OCI_ATTR_IS_FINAL_METHOD           281          /* is final method ? */
+#define OCI_ATTR_IS_INSTANTIABLE_METHOD    282   /* is instantiable method ? */
+#define OCI_ATTR_IS_OVERRIDING_METHOD      283     /* is overriding method ? */
+
+/* slot 284 available */
+
+#define OCI_ATTR_CHAR_USED                 285      /* char length semantics */
+#define OCI_ATTR_CHAR_SIZE                 286                /* char length */
+
+/* SQLJ support */
+#define OCI_ATTR_IS_JAVA_TYPE              287 /* is java implemented type ? */
+
+/* N-Tier support */
+#define OCI_ATTR_DISTINGUISHED_NAME        300        /* use DN as user name */
+#define OCI_ATTR_KERBEROS_TICKET           301   /* Kerberos ticket as cred. */
+ 
+/* for multilanguage debugging */
+#define OCI_ATTR_ORA_DEBUG_JDWP            302   /* ORA_DEBUG_JDWP attribute */
+
+#define OCI_ATTR_RESERVED_14               303                   /* reserved */
+
+
+/*---------------------------End Describe Handle Attributes -----------------*/
+
+/*------------- Supported Values for Direct Path Date cache -----------------*/
+#define OCI_ATTR_DIRPATH_DCACHE_NUM        303         /* date cache entries */
+#define OCI_ATTR_DIRPATH_DCACHE_SIZE       304           /* date cache limit */
+#define OCI_ATTR_DIRPATH_DCACHE_MISSES     305          /* date cache misses */
+#define OCI_ATTR_DIRPATH_DCACHE_HITS       306            /* date cache hits */
+#define OCI_ATTR_DIRPATH_DCACHE_DISABLE    307 /* on set: disable datecache 
+                                                * on overflow.
+                                                * on get: datecache disabled? 
+                                                * could be due to overflow
+                                                * or others                  */
+
+/* ----------------------- Session Pool Attributes ------------------------- */
+#define OCI_ATTR_SPOOL_TIMEOUT              308           /* session timeout */
+#define OCI_ATTR_SPOOL_GETMODE              309          /* session get mode */
+#define OCI_ATTR_SPOOL_BUSY_COUNT           310        /* busy session count */
+#define OCI_ATTR_SPOOL_OPEN_COUNT           311        /* open session count */
+#define OCI_ATTR_SPOOL_MIN                  312         /* min session count */
+#define OCI_ATTR_SPOOL_MAX                  313         /* max session count */
+#define OCI_ATTR_SPOOL_INCR                 314   /* session increment count */
+#define OCI_ATTR_SPOOL_STMTCACHESIZE        208   /*Stmt cache size of pool  */
+/*------------------------------End Session Pool Attributes -----------------*/
+/*---------------------------- For XML Types ------------------------------- */
+/* For table, view and column */
+#define OCI_ATTR_IS_XMLTYPE          315         /* Is the type an XML type? */
+#define OCI_ATTR_XMLSCHEMA_NAME      316               /* Name of XML Schema */
+#define OCI_ATTR_XMLELEMENT_NAME     317              /* Name of XML Element */
+#define OCI_ATTR_XMLSQLTYPSCH_NAME   318    /* SQL type's schema for XML Ele */
+#define OCI_ATTR_XMLSQLTYPE_NAME     319     /* Name of SQL type for XML Ele */
+#define OCI_ATTR_XMLTYPE_STORED_OBJ  320       /* XML type stored as object? */
+
+/*---------------------------- For Subtypes ------------------------------- */
+/* For type */
+#define OCI_ATTR_HAS_SUBTYPES        321                    /* Has subtypes? */
+#define OCI_ATTR_NUM_SUBTYPES        322               /* Number of subtypes */
+#define OCI_ATTR_LIST_SUBTYPES       323                 /* List of subtypes */
+
+/* XML flag */
+#define OCI_ATTR_XML_HRCHY_ENABLED   324               /* hierarchy enabled? */
+
+/* Method flag */
+#define OCI_ATTR_IS_OVERRIDDEN_METHOD 325           /* Method is overridden? */
+
+/*------------- Attributes for 10i Updates to the DirPath API ---------------*/
+#define OCI_ATTR_DIRPATH_RESERVED_7         326                 /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_8         327                 /* reserved */
+#define OCI_ATTR_DIRPATH_CONVERT            328 /* stream conversion needed? */
+#define OCI_ATTR_DIRPATH_BADROW             329        /* info about bad row */
+#define OCI_ATTR_DIRPATH_BADROW_LENGTH      330    /* length of bad row info */
+#define OCI_ATTR_DIRPATH_WRITE_ORDER        331         /* column fill order */
+#define OCI_ATTR_DIRPATH_GRANULE_SIZE       332   /* granule size for unload */
+#define OCI_ATTR_DIRPATH_GRANULE_OFFSET     333    /* offset to last granule */
+#define OCI_ATTR_DIRPATH_RESERVED_1         334                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_2         335                  /* reserved */
+
+/*------------- Attributes for 10i Distributed Objects ----------------------*/
+#define OCI_ATTR_OBJ_SUBS                   336 /* obj col/tab substitutable */
+
+/*------ Attributes for 10i DirPathAPI conversion (NLS lang, terr, cs) ------*/
+#define OCI_ATTR_DIRPATH_RESERVED_3         337                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_4         338                  /* reserved */
+
+
+/*---------- Attributes for 10i XADFIELD (NLS language, territory -----------*/
+#define OCI_ATTR_XADFIELD_RESERVED_1        339                  /* reserved */
+#define OCI_ATTR_XADFIELD_RESERVED_2        340                  /* reserved */
+/*------------- Kerberos Secure Client Identifier ---------------------------*/
+#define OCI_ATTR_KERBEROS_CID               341 /* Kerberos db service ticket*/
+
+
+/*------------------------ Attributes for Rules objects ---------------------*/
+#define OCI_ATTR_CONDITION                  342            /* rule condition */
+#define OCI_ATTR_COMMENT                    343                   /* comment */
+#define OCI_ATTR_VALUE                      344             /* Anydata value */
+#define OCI_ATTR_EVAL_CONTEXT_OWNER         345        /* eval context owner */
+#define OCI_ATTR_EVAL_CONTEXT_NAME          346         /* eval context name */
+#define OCI_ATTR_EVALUATION_FUNCTION        347        /* eval function name */
+#define OCI_ATTR_VAR_TYPE                   348             /* variable type */
+#define OCI_ATTR_VAR_VALUE_FUNCTION         349   /* variable value function */
+#define OCI_ATTR_VAR_METHOD_FUNCTION        350  /* variable method function */
+#define OCI_ATTR_ACTION_CONTEXT             351            /* action context */
+#define OCI_ATTR_LIST_TABLE_ALIASES         352     /* list of table aliases */
+#define OCI_ATTR_LIST_VARIABLE_TYPES        353    /* list of variable types */
+#define OCI_ATTR_TABLE_NAME                 356                /* table name */
+
+#define OCI_ATTR_DIRPATH_RESERVED_5         357                  /* reserved */
+#define OCI_ATTR_DIRPATH_RESERVED_6         358                  /* reserved */
+
+#define OCI_ATTR_DIRPATH_LOCK_WAIT          359    /* wait for lock in dpapi */
+
+#define OCI_ATTR_MESSAGE_CSCN               360              /* message cscn */
+#define OCI_ATTR_MESSAGE_DSCN               361              /* message dscn */
+
+/*--------------------- Audit Session ID ------------------------------------*/
+#define OCI_ATTR_AUDIT_SESSION_ID           362          /* Audit session ID */
+
+/*--------------------- Kerberos TGT Keys -----------------------------------*/
+#define OCI_ATTR_KERBEROS_KEY               363  /* n-tier Kerberos cred key */
+#define OCI_ATTR_KERBEROS_CID_KEY           364    /* SCID Kerberos cred key */
+
+
+#define OCI_ATTR_TRANSACTION_NO             365         /* AQ enq txn number */
+
+/*----------------------- Attributes for End To End Tracing -----------------*/
+#define OCI_ATTR_MODULE                     366        /* module for tracing */
+#define OCI_ATTR_ACTION                     367        /* action for tracing */
+#define OCI_ATTR_CLIENT_INFO                368               /* client info */
+#define OCI_ATTR_COLLECT_CALL_TIME          369         /* collect call time */
+#define OCI_ATTR_CALL_TIME                  370         /* extract call time */
+#define OCI_ATTR_ECONTEXT_ID                371      /* execution-id context */
+#define OCI_ATTR_ECONTEXT_SEQ               372  /*execution-id sequence num */
+
+
+/*---------------- Describe Handle Parameter Attribute Values ---------------*/
+
+/* OCI_ATTR_CURSOR_COMMIT_BEHAVIOR */
+#define OCI_CURSOR_OPEN   0 
+#define OCI_CURSOR_CLOSED 1
+
+/* OCI_ATTR_CATALOG_LOCATION */
+#define OCI_CL_START 0
+#define OCI_CL_END   1
+
+/* OCI_ATTR_SAVEPOINT_SUPPORT */
+#define OCI_SP_SUPPORTED   0
+#define OCI_SP_UNSUPPORTED 1
+
+/* OCI_ATTR_NOWAIT_SUPPORT */
+#define OCI_NW_SUPPORTED   0
+#define OCI_NW_UNSUPPORTED 1
+
+/* OCI_ATTR_AUTOCOMMIT_DDL */
+#define OCI_AC_DDL    0
+#define OCI_NO_AC_DDL 1
+
+/* OCI_ATTR_LOCKING_MODE */
+#define OCI_LOCK_IMMEDIATE 0
+#define OCI_LOCK_DELAYED   1
+
+/* ------------------- Instance type attribute values -----------------------*/
+#define OCI_INSTANCE_TYPE_UNKNOWN  0
+#define OCI_INSTANCE_TYPE_RDBMS    1
+#define OCI_INSTANCE_TYPE_OSM      2
+
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------OCIPasswordChange-------------------------------*/
+#define OCI_AUTH         0x08        /* Change the password but do not login */
+
+
+/*------------------------Other Constants------------------------------------*/
+#define OCI_MAX_FNS   100                     /* max number of OCI Functions */
+#define OCI_SQLSTATE_SIZE 5  
+#define OCI_ERROR_MAXMSG_SIZE   1024         /* max size of an error message */
+#define OCI_LOBMAXSIZE MINUB4MAXVAL                 /* maximum lob data size */
+#define OCI_ROWID_LEN             23 
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Fail Over Events ---------------------------------*/
+#define OCI_FO_END          0x00000001
+#define OCI_FO_ABORT        0x00000002   
+#define OCI_FO_REAUTH       0x00000004
+#define OCI_FO_BEGIN        0x00000008 
+#define OCI_FO_ERROR        0x00000010
+/*---------------------------------------------------------------------------*/
+
+/*------------------------ Fail Over Callback Return Codes ------------------*/
+#define OCI_FO_RETRY        25410
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- Fail Over Types ---------------------------------*/
+#define OCI_FO_NONE           0x00000001
+#define OCI_FO_SESSION        0x00000002
+#define OCI_FO_SELECT         0x00000004
+#define OCI_FO_TXNAL          0x00000008
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------Function Codes--------------------------------------*/
+#define OCI_FNCODE_INITIALIZE     1                         /* OCIInitialize */
+#define OCI_FNCODE_HANDLEALLOC  2                          /* OCIHandleAlloc */
+#define OCI_FNCODE_HANDLEFREE  3                            /* OCIHandleFree */
+#define OCI_FNCODE_DESCRIPTORALLOC  4                  /* OCIDescriptorAlloc */
+#define OCI_FNCODE_DESCRIPTORFREE  5                    /* OCIDescriptorFree */
+#define OCI_FNCODE_ENVINIT   6                                 /* OCIEnvInit */
+#define OCI_FNCODE_SERVERATTACH   7                       /* OCIServerAttach */
+#define OCI_FNCODE_SERVERDETACH   8                       /* OCIServerDetach */
+/* unused         9 */ 
+#define OCI_FNCODE_SESSIONBEGIN  10                       /* OCISessionBegin */
+#define OCI_FNCODE_SESSIONEND   11                          /* OCISessionEnd */
+#define OCI_FNCODE_PASSWORDCHANGE   12                  /* OCIPasswordChange */
+#define OCI_FNCODE_STMTPREPARE   13                        /* OCIStmtPrepare */
+                                                      /* unused       14- 16 */
+#define OCI_FNCODE_BINDDYNAMIC   17                        /* OCIBindDynamic */
+#define OCI_FNCODE_BINDOBJECT  18                           /* OCIBindObject */
+                                                                /* 19 unused */
+#define OCI_FNCODE_BINDARRAYOFSTRUCT   20            /* OCIBindArrayOfStruct */
+#define OCI_FNCODE_STMTEXECUTE  21                         /* OCIStmtExecute */
+                                                             /* unused 22-24 */
+#define OCI_FNCODE_DEFINEOBJECT  25                       /* OCIDefineObject */
+#define OCI_FNCODE_DEFINEDYNAMIC   26                    /* OCIDefineDynamic */
+#define OCI_FNCODE_DEFINEARRAYOFSTRUCT  27         /* OCIDefineArrayOfStruct */
+#define OCI_FNCODE_STMTFETCH   28                            /* OCIStmtFetch */
+#define OCI_FNCODE_STMTGETBIND   29                    /* OCIStmtGetBindInfo */
+                                                            /* 30, 31 unused */
+#define OCI_FNCODE_DESCRIBEANY  32                         /* OCIDescribeAny */
+#define OCI_FNCODE_TRANSSTART  33                           /* OCITransStart */
+#define OCI_FNCODE_TRANSDETACH  34                         /* OCITransDetach */
+#define OCI_FNCODE_TRANSCOMMIT  35                         /* OCITransCommit */
+                                                                /* 36 unused */
+#define OCI_FNCODE_ERRORGET   37                              /* OCIErrorGet */
+#define OCI_FNCODE_LOBOPENFILE  38                         /* OCILobFileOpen */
+#define OCI_FNCODE_LOBCLOSEFILE  39                       /* OCILobFileClose */
+                                             /* 40 was LOBCREATEFILE, unused */
+                                         /* 41 was OCILobFileDelete, unused  */
+#define OCI_FNCODE_LOBCOPY  42                                 /* OCILobCopy */
+#define OCI_FNCODE_LOBAPPEND  43                             /* OCILobAppend */
+#define OCI_FNCODE_LOBERASE  44                               /* OCILobErase */
+#define OCI_FNCODE_LOBLENGTH  45                          /* OCILobGetLength */
+#define OCI_FNCODE_LOBTRIM  46                                 /* OCILobTrim */
+#define OCI_FNCODE_LOBREAD  47                                 /* OCILobRead */
+#define OCI_FNCODE_LOBWRITE  48                               /* OCILobWrite */
+                                                                /* 49 unused */
+#define OCI_FNCODE_SVCCTXBREAK 50                                /* OCIBreak */
+#define OCI_FNCODE_SERVERVERSION  51                     /* OCIServerVersion */
+
+#define OCI_FNCODE_KERBATTRSET 52                          /* OCIKerbAttrSet */
+
+/* unused 53 */
+
+#define OCI_FNCODE_ATTRGET 54                                  /* OCIAttrGet */
+#define OCI_FNCODE_ATTRSET 55                                  /* OCIAttrSet */
+#define OCI_FNCODE_PARAMSET 56                                /* OCIParamSet */
+#define OCI_FNCODE_PARAMGET 57                                /* OCIParamGet */
+#define OCI_FNCODE_STMTGETPIECEINFO   58              /* OCIStmtGetPieceInfo */
+#define OCI_FNCODE_LDATOSVCCTX 59                          /* OCILdaToSvcCtx */
+                                                                /* 60 unused */
+#define OCI_FNCODE_STMTSETPIECEINFO   61              /* OCIStmtSetPieceInfo */
+#define OCI_FNCODE_TRANSFORGET 62                          /* OCITransForget */
+#define OCI_FNCODE_TRANSPREPARE 63                        /* OCITransPrepare */
+#define OCI_FNCODE_TRANSROLLBACK  64                     /* OCITransRollback */
+#define OCI_FNCODE_DEFINEBYPOS 65                          /* OCIDefineByPos */
+#define OCI_FNCODE_BINDBYPOS 66                              /* OCIBindByPos */
+#define OCI_FNCODE_BINDBYNAME 67                            /* OCIBindByName */
+#define OCI_FNCODE_LOBASSIGN  68                             /* OCILobAssign */
+#define OCI_FNCODE_LOBISEQUAL  69                           /* OCILobIsEqual */
+#define OCI_FNCODE_LOBISINIT  70                      /* OCILobLocatorIsInit */
+
+#define OCI_FNCODE_LOBENABLEBUFFERING  71           /* OCILobEnableBuffering */
+#define OCI_FNCODE_LOBCHARSETID  72                       /* OCILobCharSetID */
+#define OCI_FNCODE_LOBCHARSETFORM  73                   /* OCILobCharSetForm */
+#define OCI_FNCODE_LOBFILESETNAME  74                   /* OCILobFileSetName */
+#define OCI_FNCODE_LOBFILEGETNAME  75                   /* OCILobFileGetName */
+#define OCI_FNCODE_LOGON 76                                      /* OCILogon */
+#define OCI_FNCODE_LOGOFF 77                                    /* OCILogoff */
+#define OCI_FNCODE_LOBDISABLEBUFFERING 78          /* OCILobDisableBuffering */
+#define OCI_FNCODE_LOBFLUSHBUFFER 79                    /* OCILobFlushBuffer */
+#define OCI_FNCODE_LOBLOADFROMFILE 80                  /* OCILobLoadFromFile */
+
+#define OCI_FNCODE_LOBOPEN  81                                 /* OCILobOpen */
+#define OCI_FNCODE_LOBCLOSE  82                               /* OCILobClose */
+#define OCI_FNCODE_LOBISOPEN  83                             /* OCILobIsOpen */
+#define OCI_FNCODE_LOBFILEISOPEN  84                     /* OCILobFileIsOpen */
+#define OCI_FNCODE_LOBFILEEXISTS  85                     /* OCILobFileExists */
+#define OCI_FNCODE_LOBFILECLOSEALL  86                 /* OCILobFileCloseAll */
+#define OCI_FNCODE_LOBCREATETEMP  87                /* OCILobCreateTemporary */
+#define OCI_FNCODE_LOBFREETEMP  88                    /* OCILobFreeTemporary */
+#define OCI_FNCODE_LOBISTEMP  89                        /* OCILobIsTemporary */
+
+#define OCI_FNCODE_AQENQ  90                                     /* OCIAQEnq */
+#define OCI_FNCODE_AQDEQ  91                                     /* OCIAQDeq */
+#define OCI_FNCODE_RESET  92                                     /* OCIReset */
+#define OCI_FNCODE_SVCCTXTOLDA  93                         /* OCISvcCtxToLda */
+#define OCI_FNCODE_LOBLOCATORASSIGN 94                /* OCILobLocatorAssign */
+
+#define OCI_FNCODE_UBINDBYNAME 95
+
+#define OCI_FNCODE_AQLISTEN  96                               /* OCIAQListen */
+
+#define OCI_FNCODE_SVC2HST 97                                    /* reserved */
+#define OCI_FNCODE_SVCRH   98                                    /* reserved */
+                           /* 97 and 98 are reserved for Oracle internal use */
+
+#define OCI_FNCODE_TRANSMULTIPREPARE   99            /* OCITransMultiPrepare */
+
+#define OCI_FNCODE_CPOOLCREATE  100               /* OCIConnectionPoolCreate */
+#define OCI_FNCODE_CPOOLDESTROY 101              /* OCIConnectionPoolDestroy */
+#define OCI_FNCODE_LOGON2 102                                   /* OCILogon2 */
+#define OCI_FNCODE_ROWIDTOCHAR  103                        /* OCIRowidToChar */
+
+#define OCI_FNCODE_SPOOLCREATE  104                  /* OCISessionPoolCreate */
+#define OCI_FNCODE_SPOOLDESTROY 105                 /* OCISessionPoolDestroy */
+#define OCI_FNCODE_SESSIONGET   106                         /* OCISessionGet */
+#define OCI_FNCODE_SESSIONRELEASE 107                   /* OCISessionRelease */
+#define OCI_FNCODE_STMTPREPARE2 108                       /* OCIStmtPrepare2 */
+#define OCI_FNCODE_STMTRELEASE 109                         /* OCIStmtRelease */
+#define OCI_FNCODE_AQENQARRAY  110                          /* OCIAQEnqArray */
+#define OCI_FNCODE_AQDEQARRAY  111                          /* OCIAQDeqArray */
+#define OCI_FNCODE_LOBCOPY2    112                            /* OCILobCopy2 */
+#define OCI_FNCODE_LOBERASE2   113                           /* OCILobErase2 */
+#define OCI_FNCODE_LOBLENGTH2  114                       /* OCILobGetLength2 */
+#define OCI_FNCODE_LOBLOADFROMFILE2  115              /* OCILobLoadFromFile2 */
+#define OCI_FNCODE_LOBREAD2    116                            /* OCILobRead2 */
+#define OCI_FNCODE_LOBTRIM2    117                            /* OCILobTrim2 */
+#define OCI_FNCODE_LOBWRITE2   118                           /* OCILobWrite2 */
+#define OCI_FNCODE_LOBGETSTORAGELIMIT 119           /* OCILobGetStorageLimit */
+
+#define OCI_FNCODE_MAXFCN 119                   /* maximum OCI function code */
+
+
+/*---------------------------------------------------------------------------*/
+
+/*-----------------------Handle Definitions----------------------------------*/
+typedef struct OCIEnv           OCIEnv;            /* OCI environment handle */
+typedef struct OCIError         OCIError;                /* OCI error handle */
+typedef struct OCISvcCtx        OCISvcCtx;             /* OCI service handle */
+typedef struct OCIStmt          OCIStmt;             /* OCI statement handle */
+typedef struct OCIBind          OCIBind;                  /* OCI bind handle */
+typedef struct OCIDefine        OCIDefine;              /* OCI Define handle */
+typedef struct OCIDescribe      OCIDescribe;          /* OCI Describe handle */
+typedef struct OCIServer        OCIServer;              /* OCI Server handle */
+typedef struct OCISession       OCISession;     /* OCI Authentication handle */
+typedef struct OCIComplexObject OCIComplexObject;          /* OCI COR handle */
+typedef struct OCITrans         OCITrans;          /* OCI Transaction handle */
+typedef struct OCISecurity      OCISecurity;          /* OCI Security handle */
+typedef struct OCISubscription  OCISubscription;      /* subscription handle */
+
+typedef struct OCICPool         OCICPool;          /* connection pool handle */
+typedef struct OCISPool         OCISPool;             /* session pool handle */
+typedef struct OCIAuthInfo      OCIAuthInfo;                  /* auth handle */
+
+/*-----------------------Descriptor Definitions------------------------------*/
+typedef struct OCISnapshot      OCISnapshot;      /* OCI snapshot descriptor */
+typedef struct OCIResult        OCIResult;      /* OCI Result Set Descriptor */
+typedef struct OCILobLocator    OCILobLocator; /* OCI Lob Locator descriptor */
+typedef struct OCIParam         OCIParam;        /* OCI PARameter descriptor */
+typedef struct OCIComplexObjectComp OCIComplexObjectComp;
+                                                       /* OCI COR descriptor */
+typedef struct OCIRowid OCIRowid;                    /* OCI ROWID descriptor */
+
+typedef struct OCIDateTime OCIDateTime;           /* OCI DateTime descriptor */
+typedef struct OCIInterval OCIInterval;           /* OCI Interval descriptor */
+
+typedef struct OCIUcb           OCIUcb;      /* OCI User Callback descriptor */
+typedef struct OCIServerDNs     OCIServerDNs;    /* OCI server DN descriptor */
+
+/*-------------------------- AQ Descriptors ---------------------------------*/
+typedef struct OCIAQEnqOptions    OCIAQEnqOptions; /* AQ Enqueue Options hdl */
+typedef struct OCIAQDeqOptions    OCIAQDeqOptions; /* AQ Dequeue Options hdl */
+typedef struct OCIAQMsgProperties OCIAQMsgProperties;  /* AQ Mesg Properties */
+typedef struct OCIAQAgent         OCIAQAgent;         /* AQ Agent descriptor */
+typedef struct OCIAQNfyDescriptor OCIAQNfyDescriptor;   /* AQ Nfy descriptor */
+typedef struct OCIAQSignature     OCIAQSignature;            /* AQ Siganture */
+/*---------------------------------------------------------------------------*/
+ 
+/* Lob typedefs for Pro*C */
+typedef struct OCILobLocator OCIClobLocator;    /* OCI Character LOB Locator */
+typedef struct OCILobLocator OCIBlobLocator;       /* OCI Binary LOB Locator */
+typedef struct OCILobLocator OCIBFileLocator; /* OCI Binary LOB File Locator */
+/*---------------------------------------------------------------------------*/
+
+/* Undefined value for tz in interval types*/
+#define OCI_INTHR_UNK 24
+
+  /* These defined adjustment values */
+#define OCI_ADJUST_UNK            10
+#define OCI_ORACLE_DATE           0
+#define OCI_ANSI_DATE             1
+
+/*------------------------ Lob-specific Definitions -------------------------*/
+
+/*
+ * ociloff - OCI Lob OFFset
+ *
+ * The offset in the lob data.  The offset is specified in terms of bytes for
+ * BLOBs and BFILes.  Character offsets are used for CLOBs, NCLOBs.
+ * The maximum size of internal lob data is 4 gigabytes.  FILE LOB 
+ * size is limited by the operating system.
+ */
+typedef ub4 OCILobOffset;
+
+/*
+ * ocillen - OCI Lob LENgth (of lob data)
+ *
+ * Specifies the length of lob data in bytes for BLOBs and BFILes and in 
+ * characters for CLOBs, NCLOBs.  The maximum length of internal lob
+ * data is 4 gigabytes.  The length of FILE LOBs is limited only by the
+ * operating system.
+ */
+typedef ub4 OCILobLength;
+/*
+ * ocilmo - OCI Lob open MOdes
+ *
+ * The mode specifies the planned operations that will be performed on the
+ * FILE lob data.  The FILE lob can be opened in read-only mode only.
+ * 
+ * In the future, we may include read/write, append and truncate modes.  Append
+ * is equivalent to read/write mode except that the FILE is positioned for
+ * writing to the end.  Truncate is equivalent to read/write mode except that
+ * the FILE LOB data is first truncated to a length of 0 before use.
+ */
+enum OCILobMode
+{
+  OCI_LOBMODE_READONLY = 1,                                     /* read-only */
+  OCI_LOBMODE_READWRITE = 2             /* read_write for internal lobs only */
+};
+typedef enum OCILobMode OCILobMode;
+
+/*---------------------------------------------------------------------------*/
+
+
+/*----------------------------Piece Definitions------------------------------*/
+
+/* if ocidef.h is being included in the app, ocidef.h should precede oci.h */
+
+/* 
+ * since clients may  use oci.h, ocidef.h and ocidfn.h the following defines
+ * need to be guarded, usually internal clients
+ */
+
+#ifndef OCI_FLAGS
+#define OCI_FLAGS
+#define OCI_ONE_PIECE 0                                         /* one piece */
+#define OCI_FIRST_PIECE 1                                 /* the first piece */
+#define OCI_NEXT_PIECE 2                          /* the next of many pieces */
+#define OCI_LAST_PIECE 3                                   /* the last piece */
+#endif
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- FILE open modes -------------------------------*/
+#define OCI_FILE_READONLY 1             /* readonly mode open for FILE types */
+/*---------------------------------------------------------------------------*/
+/*--------------------------- LOB open modes --------------------------------*/
+#define OCI_LOB_READONLY 1              /* readonly mode open for ILOB types */
+#define OCI_LOB_READWRITE 2                /* read write mode open for ILOBs */
+
+/*----------------------- LOB Buffering Flush Flags -------------------------*/
+#define OCI_LOB_BUFFER_FREE   1 
+#define OCI_LOB_BUFFER_NOFREE 2
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCI Statement Types ---------------------------*/
+
+#define  OCI_STMT_SELECT  1                              /* select statement */
+#define  OCI_STMT_UPDATE  2                              /* update statement */
+#define  OCI_STMT_DELETE  3                              /* delete statement */
+#define  OCI_STMT_INSERT  4                              /* Insert Statement */
+#define  OCI_STMT_CREATE  5                              /* create statement */
+#define  OCI_STMT_DROP    6                                /* drop statement */
+#define  OCI_STMT_ALTER   7                               /* alter statement */
+#define  OCI_STMT_BEGIN   8                   /* begin ... (pl/sql statement)*/
+#define  OCI_STMT_DECLARE 9                /* declare .. (pl/sql statement ) */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCI Parameter Types ---------------------------*/
+#define OCI_PTYPE_UNK                 0                         /* unknown   */
+#define OCI_PTYPE_TABLE               1                         /* table     */
+#define OCI_PTYPE_VIEW                2                         /* view      */
+#define OCI_PTYPE_PROC                3                         /* procedure */
+#define OCI_PTYPE_FUNC                4                         /* function  */
+#define OCI_PTYPE_PKG                 5                         /* package   */
+#define OCI_PTYPE_TYPE                6                 /* user-defined type */
+#define OCI_PTYPE_SYN                 7                         /* synonym   */
+#define OCI_PTYPE_SEQ                 8                         /* sequence  */
+#define OCI_PTYPE_COL                 9                         /* column    */
+#define OCI_PTYPE_ARG                 10                        /* argument  */
+#define OCI_PTYPE_LIST                11                        /* list      */
+#define OCI_PTYPE_TYPE_ATTR           12    /* user-defined type's attribute */
+#define OCI_PTYPE_TYPE_COLL           13        /* collection type's element */
+#define OCI_PTYPE_TYPE_METHOD         14       /* user-defined type's method */
+#define OCI_PTYPE_TYPE_ARG            15   /* user-defined type method's arg */
+#define OCI_PTYPE_TYPE_RESULT         16/* user-defined type method's result */
+#define OCI_PTYPE_SCHEMA              17                           /* schema */
+#define OCI_PTYPE_DATABASE            18                         /* database */
+#define OCI_PTYPE_RULE                19                             /* rule */
+#define OCI_PTYPE_RULE_SET            20                         /* rule set */
+#define OCI_PTYPE_EVALUATION_CONTEXT  21               /* evaluation context */
+#define OCI_PTYPE_TABLE_ALIAS         22                      /* table alias */
+#define OCI_PTYPE_VARIABLE_TYPE       23                    /* variable type */
+#define OCI_PTYPE_NAME_VALUE          24                  /* name value pair */
+
+/*---------------------------------------------------------------------------*/
+
+/*----------------------------- OCI List Types ------------------------------*/
+#define OCI_LTYPE_UNK           0                               /* unknown   */
+#define OCI_LTYPE_COLUMN        1                             /* column list */
+#define OCI_LTYPE_ARG_PROC      2                 /* procedure argument list */
+#define OCI_LTYPE_ARG_FUNC      3                  /* function argument list */
+#define OCI_LTYPE_SUBPRG        4                         /* subprogram list */
+#define OCI_LTYPE_TYPE_ATTR     5                          /* type attribute */
+#define OCI_LTYPE_TYPE_METHOD   6                             /* type method */
+#define OCI_LTYPE_TYPE_ARG_PROC 7    /* type method w/o result argument list */
+#define OCI_LTYPE_TYPE_ARG_FUNC 8      /* type method w/result argument list */
+#define OCI_LTYPE_SCH_OBJ       9                      /* schema object list */
+#define OCI_LTYPE_DB_SCH        10                   /* database schema list */
+#define OCI_LTYPE_TYPE_SUBTYPE  11                           /* subtype list */
+#define OCI_LTYPE_TABLE_ALIAS   12                       /* table alias list */
+#define OCI_LTYPE_VARIABLE_TYPE 13                     /* variable type list */
+#define OCI_LTYPE_NAME_VALUE    14                        /* name value list */
+
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------- Memory Cartridge Services ---------------------*/
+#define OCI_MEMORY_CLEARED  1
+
+/*-------------------------- Pickler Cartridge Services ---------------------*/
+typedef struct OCIPicklerTdsCtx OCIPicklerTdsCtx;
+typedef struct OCIPicklerTds OCIPicklerTds;
+typedef struct OCIPicklerImage OCIPicklerImage;
+typedef struct OCIPicklerFdo OCIPicklerFdo;
+typedef ub4 OCIPicklerTdsElement;
+
+typedef struct OCIAnyData OCIAnyData;
+
+typedef struct OCIAnyDataSet OCIAnyDataSet;
+typedef struct OCIAnyDataCtx OCIAnyDataCtx;
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- User Callback Constants -----------------------*/
+#define OCI_UCBTYPE_ENTRY       1                          /* entry callback */
+#define OCI_UCBTYPE_EXIT        2                           /* exit callback */
+#define OCI_UCBTYPE_REPLACE     3                    /* replacement callback */
+
+/*---------------------------------------------------------------------------*/
+
+/*--------------------- NLS service type and constance ----------------------*/
+#define OCI_NLS_DAYNAME1      1                    /* Native name for Monday */
+#define OCI_NLS_DAYNAME2      2                   /* Native name for Tuesday */
+#define OCI_NLS_DAYNAME3      3                 /* Native name for Wednesday */
+#define OCI_NLS_DAYNAME4      4                  /* Native name for Thursday */
+#define OCI_NLS_DAYNAME5      5                    /* Native name for Friday */
+#define OCI_NLS_DAYNAME6      6              /* Native name for for Saturday */
+#define OCI_NLS_DAYNAME7      7                /* Native name for for Sunday */
+#define OCI_NLS_ABDAYNAME1    8        /* Native abbreviated name for Monday */
+#define OCI_NLS_ABDAYNAME2    9       /* Native abbreviated name for Tuesday */
+#define OCI_NLS_ABDAYNAME3    10    /* Native abbreviated name for Wednesday */
+#define OCI_NLS_ABDAYNAME4    11     /* Native abbreviated name for Thursday */
+#define OCI_NLS_ABDAYNAME5    12       /* Native abbreviated name for Friday */
+#define OCI_NLS_ABDAYNAME6    13 /* Native abbreviated name for for Saturday */
+#define OCI_NLS_ABDAYNAME7    14   /* Native abbreviated name for for Sunday */
+#define OCI_NLS_MONTHNAME1    15                  /* Native name for January */
+#define OCI_NLS_MONTHNAME2    16                 /* Native name for February */
+#define OCI_NLS_MONTHNAME3    17                    /* Native name for March */
+#define OCI_NLS_MONTHNAME4    18                    /* Native name for April */
+#define OCI_NLS_MONTHNAME5    19                      /* Native name for May */
+#define OCI_NLS_MONTHNAME6    20                     /* Native name for June */
+#define OCI_NLS_MONTHNAME7    21                     /* Native name for July */
+#define OCI_NLS_MONTHNAME8    22                   /* Native name for August */
+#define OCI_NLS_MONTHNAME9    23                /* Native name for September */
+#define OCI_NLS_MONTHNAME10   24                  /* Native name for October */
+#define OCI_NLS_MONTHNAME11   25                 /* Native name for November */
+#define OCI_NLS_MONTHNAME12   26                 /* Native name for December */
+#define OCI_NLS_ABMONTHNAME1  27      /* Native abbreviated name for January */
+#define OCI_NLS_ABMONTHNAME2  28     /* Native abbreviated name for February */
+#define OCI_NLS_ABMONTHNAME3  29        /* Native abbreviated name for March */
+#define OCI_NLS_ABMONTHNAME4  30        /* Native abbreviated name for April */
+#define OCI_NLS_ABMONTHNAME5  31          /* Native abbreviated name for May */
+#define OCI_NLS_ABMONTHNAME6  32         /* Native abbreviated name for June */
+#define OCI_NLS_ABMONTHNAME7  33         /* Native abbreviated name for July */
+#define OCI_NLS_ABMONTHNAME8  34       /* Native abbreviated name for August */
+#define OCI_NLS_ABMONTHNAME9  35    /* Native abbreviated name for September */
+#define OCI_NLS_ABMONTHNAME10 36      /* Native abbreviated name for October */
+#define OCI_NLS_ABMONTHNAME11 37     /* Native abbreviated name for November */
+#define OCI_NLS_ABMONTHNAME12 38     /* Native abbreviated name for December */
+#define OCI_NLS_YES           39   /* Native string for affirmative response */
+#define OCI_NLS_NO            40                 /* Native negative response */
+#define OCI_NLS_AM            41           /* Native equivalent string of AM */
+#define OCI_NLS_PM            42           /* Native equivalent string of PM */
+#define OCI_NLS_AD            43           /* Native equivalent string of AD */
+#define OCI_NLS_BC            44           /* Native equivalent string of BC */
+#define OCI_NLS_DECIMAL       45                        /* decimal character */
+#define OCI_NLS_GROUP         46                          /* group separator */
+#define OCI_NLS_DEBIT         47                   /* Native symbol of debit */
+#define OCI_NLS_CREDIT        48                  /* Native sumbol of credit */
+#define OCI_NLS_DATEFORMAT    49                       /* Oracle date format */
+#define OCI_NLS_INT_CURRENCY  50            /* International currency symbol */
+#define OCI_NLS_LOC_CURRENCY  51                   /* Locale currency symbol */
+#define OCI_NLS_LANGUAGE      52                            /* Language name */
+#define OCI_NLS_ABLANGUAGE    53           /* Abbreviation for language name */
+#define OCI_NLS_TERRITORY     54                           /* Territory name */
+#define OCI_NLS_CHARACTER_SET 55                       /* Character set name */
+#define OCI_NLS_LINGUISTIC_NAME    56                     /* Linguistic name */
+#define OCI_NLS_CALENDAR      57                            /* Calendar name */
+#define OCI_NLS_DUAL_CURRENCY 78                     /* Dual currency symbol */
+#define OCI_NLS_WRITINGDIR    79               /* Language writing direction */
+#define OCI_NLS_ABTERRITORY   80                   /* Territory Abbreviation */
+#define OCI_NLS_DDATEFORMAT   81               /* Oracle default date format */
+#define OCI_NLS_DTIMEFORMAT   82               /* Oracle default time format */
+#define OCI_NLS_SFDATEFORMAT  83       /* Local string formatted date format */
+#define OCI_NLS_SFTIMEFORMAT  84       /* Local string formatted time format */
+#define OCI_NLS_NUMGROUPING   85                   /* Number grouping fields */
+#define OCI_NLS_LISTSEP       86                           /* List separator */
+#define OCI_NLS_MONDECIMAL    87               /* Monetary decimal character */
+#define OCI_NLS_MONGROUP      88                 /* Monetary group separator */
+#define OCI_NLS_MONGROUPING   89                 /* Monetary grouping fields */
+#define OCI_NLS_INT_CURRENCYSEP 90       /* International currency separator */
+#define OCI_NLS_CHARSET_MAXBYTESZ 91     /* Maximum character byte size      */
+#define OCI_NLS_CHARSET_FIXEDWIDTH 92    /* Fixed-width charset byte size    */
+#define OCI_NLS_CHARSET_ID    93                         /* Character set id */
+#define OCI_NLS_NCHARSET_ID   94                        /* NCharacter set id */
+
+#define OCI_NLS_MAXBUFSZ   100 /* Max buffer size may need for OCINlsGetInfo */
+
+#define OCI_NLS_BINARY            0x1           /* for the binary comparison */
+#define OCI_NLS_LINGUISTIC        0x2           /* for linguistic comparison */
+#define OCI_NLS_CASE_INSENSITIVE  0x10    /* for case-insensitive comparison */
+
+#define OCI_NLS_UPPERCASE         0x20               /* convert to uppercase */
+#define OCI_NLS_LOWERCASE         0x40               /* convert to lowercase */
+
+#define OCI_NLS_CS_IANA_TO_ORA   0   /* Map charset name from IANA to Oracle */
+#define OCI_NLS_CS_ORA_TO_IANA   1   /* Map charset name from Oracle to IANA */
+#define OCI_NLS_LANG_ISO_TO_ORA  2   /* Map language name from ISO to Oracle */
+#define OCI_NLS_LANG_ORA_TO_ISO  3   /* Map language name from Oracle to ISO */
+#define OCI_NLS_TERR_ISO_TO_ORA  4   /* Map territory name from ISO to Oracle*/
+#define OCI_NLS_TERR_ORA_TO_ISO  5   /* Map territory name from Oracle to ISO*/
+#define OCI_NLS_TERR_ISO3_TO_ORA 6   /* Map territory name from 3-letter ISO */
+                                     /* abbreviation to Oracle               */
+#define OCI_NLS_TERR_ORA_TO_ISO3 7   /* Map territory name from Oracle to    */
+                                     /* 3-letter ISO abbreviation            */
+
+typedef struct OCIMsg  OCIMsg;
+typedef ub4            OCIWchar;
+
+#define OCI_XMLTYPE_CREATE_OCISTRING 1
+#define OCI_XMLTYPE_CREATE_CLOB      2
+#define OCI_XMLTYPE_CREATE_BLOB      3
+
+/*------------------------- Kerber Authentication Modes ---------------------*/
+#define OCI_KERBCRED_PROXY               1 /* Apply Kerberos Creds for Proxy */
+#define OCI_KERBCRED_CLIENT_IDENTIFIER   2/*Apply Creds for Secure Client ID */
+
+/*--------------------------------------------------------------------------- 
+                     PRIVATE TYPES AND CONSTANTS 
+  ---------------------------------------------------------------------------*/
+ 
+/* None */
+
+/*--------------------------------------------------------------------------- 
+                           PUBLIC FUNCTIONS 
+  ---------------------------------------------------------------------------*/
+
+/* see ociap.h or ocikp.h */
+ 
+/*--------------------------------------------------------------------------- 
+                          PRIVATE FUNCTIONS 
+  ---------------------------------------------------------------------------*/
+
+/* None */
+
+ 
+#endif                                              /* OCI_ORACLE */
+
+
+/* more includes */
+
+#ifndef OCI1_ORACLE
+#include <oci1.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORI_ORACLE
+#include <ori.h>
+#endif
+
+#ifndef ORL_ORACLE
+#include <orl.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+#include <ociapr.h>
+#include <ociap.h>
+
+#ifndef OCIXMLDB_ORACLE
+#include <ocixmldb.h>
+#endif
+
+#ifndef OCI8DP_ORACLE
+#include <oci8dp.h>         /* interface definitions for the direct path api */
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h b/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h
new file mode 100644
index 0000000..21a86b9
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h
@@ -0,0 +1,183 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oci1.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) Oracle Corporation 1997, 1998. All Rights Reserved. */ 
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     oci1.h - Cartridge Service definitions
+
+   DESCRIPTION 
+     <short description of component this file declares/defines> 
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     <list of external functions declared/defined - with one-line descriptions>
+
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   nramakri    01/16/98 - remove #ifdef NEVER clause
+   ewaugh      12/18/97 - Turn type wrappers into functions.
+   skabraha    12/02/97 - Adding data structures & constants for OCIFile
+   rhwu        12/02/97 - OCI Thread
+   nramakri    12/15/97 - move to core4
+   ewaugh      12/11/97 - add OCIFormat package constants
+   ssamu       12/10/97 - do not include s.h
+   nramakri    11/19/97 - add OCIExtract definitions
+   ssamu       11/14/97 - creation
+
+*/
+
+
+#ifndef OCI1_ORACLE
+# define OCI1_ORACLE
+
+# ifndef ORATYPES
+#  include <oratypes.h>
+# endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/* Constants required by the OCIFormat package. */
+
+#define OCIFormatUb1(variable)      OCIFormatTUb1(),      &(variable)
+#define OCIFormatUb2(variable)      OCIFormatTUb2(),      &(variable)
+#define OCIFormatUb4(variable)      OCIFormatTUb4(),      &(variable)
+#define OCIFormatUword(variable)    OCIFormatTUword(),    &(variable)
+#define OCIFormatUbig_ora(variable) OCIFormatTUbig_ora(), &(variable)
+#define OCIFormatSb1(variable)      OCIFormatTSb1(),      &(variable)
+#define OCIFormatSb2(variable)      OCIFormatTSb2(),      &(variable)
+#define OCIFormatSb4(variable)      OCIFormatTSb4(),      &(variable)
+#define OCIFormatSword(variable)    OCIFormatTSword(),    &(variable)
+#define OCIFormatSbig_ora(variable) OCIFormatTSbig_ora(), &(variable)
+#define OCIFormatEb1(variable)      OCIFormatTEb1(),      &(variable)
+#define OCIFormatEb2(variable)      OCIFormatTEb2(),      &(variable)
+#define OCIFormatEb4(variable)      OCIFormatTEb4(),      &(variable)
+#define OCIFormatEword(variable)    OCIFormatTEword(),    &(variable)
+#define OCIFormatChar(variable)     OCIFormatTChar(),     &(variable)
+#define OCIFormatText(variable)     OCIFormatTText(),      (variable)
+#define OCIFormatDouble(variable)   OCIFormatTDouble(),   &(variable)
+#define OCIFormatDvoid(variable)    OCIFormatTDvoid(),     (variable)
+#define OCIFormatEnd                OCIFormatTEnd()
+
+#define OCIFormatDP 6
+
+
+/*----------------- Public Constants for OCIFile -------------------------*/
+
+/* flags for open.*/
+/* flags for mode */
+#define OCI_FILE_READ_ONLY         1   /* open for read only */
+#define OCI_FILE_WRITE_ONLY        2   /* open for write only */
+#define OCI_FILE_READ_WRITE        3   /* open for read & write */
+/* flags for create */
+#define OCI_FILE_EXIST             0   /* the file should exist */
+#define OCI_FILE_CREATE            1   /* create if the file doesn't exist */
+#define OCI_FILE_EXCL              2   /* the file should not exist */
+#define OCI_FILE_TRUNCATE          4   /* create if the file doesn't exist, 
+                                          else truncate file the file to 0 */
+#define OCI_FILE_APPEND            8   /* open the file in append mode */
+
+/* flags for seek */
+#define OCI_FILE_SEEK_BEGINNING    1  /* seek from the beginning of the file */
+#define OCI_FILE_SEEK_CURRENT      2  /* seek from the current position */
+#define OCI_FILE_SEEK_END          3  /* seek from the end of the file */
+
+#define OCI_FILE_FORWARD     1     /* seek forward		*/
+#define OCI_FILE_BACKWARD    2     /* seek backward		*/
+
+/* file type */
+#define   OCI_FILE_BIN      0    /* binary file */
+#define   OCI_FILE_TEXT     1    /* text file */
+#define   OCI_FILE_STDIN    2    /* standard i/p */
+#define   OCI_FILE_STDOUT   3    /* standard o/p */
+#define   OCI_FILE_STDERR   4    /* standard error */
+
+/* Represents an open file */
+typedef struct OCIFileObject OCIFileObject;
+
+
+/*--------------------- OCI Thread Object Definitions------------------------*/
+
+/* OCIThread Context */
+typedef struct OCIThreadContext OCIThreadContext;
+
+/* OCIThread Mutual Exclusion Lock */
+typedef struct OCIThreadMutex   OCIThreadMutex; 
+
+/* OCIThread Key for Thread-Specific Data */
+typedef struct OCIThreadKey     OCIThreadKey;  
+
+/* OCIThread Thread ID */
+typedef struct OCIThreadId      OCIThreadId;  
+
+/* OCIThread Thread Handle */
+typedef struct OCIThreadHandle  OCIThreadHandle;  
+
+
+/*-------------------- OCI Thread Callback Function Pointers ----------------*/
+
+/* OCIThread Key Destructor Function Type */
+typedef void (*OCIThreadKeyDestFunc)(/*_ dvoid * _*/);
+
+
+/* Flags passed into OCIExtractFromXXX routines to direct processing         */
+#define OCI_EXTRACT_CASE_SENSITIVE     0x1 /* matching is case sensitive     */
+#define OCI_EXTRACT_UNIQUE_ABBREVS     0x2 /* unique abbreviations for keys
+                                              are allowed                    */
+#define OCI_EXTRACT_APPEND_VALUES      0x4 /* if multiple values for a key
+                                              exist, this determines if the 
+                                              new value should be appended 
+                                              to (or replace) the current 
+                                              list of values                 */
+
+/* Constants passed into OCIExtractSetKey routine */
+#define OCI_EXTRACT_MULTIPLE           0x8 /* key can accept multiple values */
+#define OCI_EXTRACT_TYPE_BOOLEAN         1 /* key type is boolean            */
+#define OCI_EXTRACT_TYPE_STRING          2 /* key type is string             */
+#define OCI_EXTRACT_TYPE_INTEGER         3 /* key type is integer            */
+#define OCI_EXTRACT_TYPE_OCINUM          4 /* key type is ocinum             */
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* OCI1_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h b/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h
new file mode 100644
index 0000000..eea652f
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h
@@ -0,0 +1,315 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oci8dp.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) 1998, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     oci8dp.h - OCI: Direct Path API interface prototypes.
+
+   DESCRIPTION 
+     Public types, constants, and interfaces to the direct path API.
+
+   RELATED DOCUMENTS 
+ 
+   NOTES
+     This file is not directly included by the application, this file
+     is included by "oci.h", which the application should include.
+
+   MODIFIED   (MM/DD/YY)
+   srseshad    03/12/03 - convert oci public api to ansi
+   msakayed    10/28/02 - Bug #2643907: add OCI_ATTR_DIRPATH_SKIPINDEX_METHOD
+   cmlim       04/13/01 - remove OCIDirPathStreamToStream - not used by dpapi
+   cmlim       04/02/01 - OCI_DIRPATH_EXPR_OPQ_SQL_FN to OCI_DIRPATH_EXPR_SQL
+   ebatbout    01/22/01 - PARTIAL value for OCIDirPathDataSave action parameter
+   cmlim       07/20/00 - support opaques/sql strings in 8.2 dpapi
+   cmlim       08/14/00 - support refs in 8.2 dpapi
+   cmlim       04/17/00 - add defines for OCIDirPathFuncCtx handle & OCI_ATTR_D
+   whe         09/01/99 - 976457:check __cplusplus for C++ code
+   abrumm      04/16/99 - dpapi: more attributes
+   abrumm      02/26/99 - add defines for DataSave action
+   abrumm      10/04/98 - clen must be a ub4
+   abrumm      05/27/98 - add column array flag values
+   abrumm      05/12/98 - direct path api support
+   abrumm      03/31/98 - OCI direct path interface support
+   abrumm      03/18/98 - Creation
+
+*/
+
+#ifndef OCI8DP_ORACLE
+# define OCI8DP_ORACLE
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/*----- Handles and descriptors for direct path operations (OCIDirPath*) ----*/
+
+typedef struct OCIDirPathCtx      OCIDirPathCtx;                  /* context */
+typedef struct OCIDirPathFuncCtx  OCIDirPathFuncCtx;     /* function context */
+typedef struct OCIDirPathColArray OCIDirPathColArray;        /* column array */
+typedef struct OCIDirPathStream   OCIDirPathStream;                /* stream */
+typedef struct OCIDirPathDesc     OCIDirPathDesc;  /* direct path descriptor */
+
+                 /*----- Defines for Direct Path Options -----*/
+
+                 /* values for OCI_ATTR_DIRPATH_MODE attribute */
+#define OCI_DIRPATH_LOAD         1             /* direct path load operation */
+#define OCI_DIRPATH_UNLOAD       2           /* direct path unload operation */
+#define OCI_DIRPATH_CONVERT      3     /* direct path convert only operation */
+
+    /*----- values for OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD attribute -----*/
+#define OCI_DIRPATH_INDEX_MAINT_SINGLE_ROW     1
+
+/* Note that there are two attributes dealing with index maintenance -
+ * OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD and OCI_ATTR_DIRPATH_SKIPINDEX_METHOD.
+ * OCI_ATTR_DIRPATH_SKIPINDEX_METHOD exists to isolate the behavior for
+ * skipping index maintenance since maintenance of unusable indexes is 
+ * orthogonal to that of single row insertion.
+ * For backwards compatibility we still allow users to specify skip
+ * methods in OCI_ATTR_DIRPATH_INDEX_MAINT_METHOD so make sure the
+ * enumerations for the two attributes are distinct.
+ */
+    /*----- values for OCI_ATTR_DIRPATH_SKIPINDEX_METHOD attribute -----*/
+#define OCI_DIRPATH_INDEX_MAINT_SKIP_UNUSABLE       2
+#define OCI_DIRPATH_INDEX_MAINT_DONT_SKIP_UNUSABLE  3
+#define OCI_DIRPATH_INDEX_MAINT_SKIP_ALL            4
+
+           /* values for OCI_ATTR_STATE attribute of OCIDirPathCtx */
+#define OCI_DIRPATH_NORMAL       1     /* can accept rows, last row complete */
+#define OCI_DIRPATH_PARTIAL      2                   /* last row was partial */
+#define OCI_DIRPATH_NOT_PREPARED 3    /* direct path context is not prepared */
+
+     /*----- values for cflg argument to OCIDirpathColArrayEntrySet -----*/
+#define OCI_DIRPATH_COL_COMPLETE 0                /* column data is complete */
+#define OCI_DIRPATH_COL_NULL     1                         /* column is null */
+#define OCI_DIRPATH_COL_PARTIAL  2                 /* column data is partial */
+
+          /*----- values for action parameter to OCIDirPathDataSave -----*/
+#define OCI_DIRPATH_DATASAVE_SAVEONLY 0              /* data save point only */
+#define OCI_DIRPATH_DATASAVE_FINISH   1           /* execute finishing logic */
+/* save portion of input data (before space error occurred) and finish */
+#define OCI_DIRPATH_DATASAVE_PARTIAL  2       
+
+  /*- OCI_ATTR_DIRPATH_EXPR_TYPE values (describes OCI_ATTR_NAME expr type) -*/
+#define OCI_DIRPATH_EXPR_OBJ_CONSTR  1      /* NAME is an object constructor */
+#define OCI_DIRPATH_EXPR_SQL         2  /* NAME is an opaque or sql function */
+#define OCI_DIRPATH_EXPR_REF_TBLNAME 3 /* NAME is table name if ref is scoped*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*------------------------ OCIDirPathCtx Operations -------------------------*/
+
+/*
+  NAME
+    OCIDirPathAbort - OCI: Abort a direct path operation.
+
+  DESCRIPTION
+    Aborts a direct path operation.  Upon successful completion
+    the direct path context is no longer valid.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathAbort( OCIDirPathCtx *dpctx, OCIError *errhp );
+
+/*
+  NAME
+    OCIDirPathDataSave - OCI: Execute a data save point.
+
+  DESCRIPTION
+    Successful return of this function indicates that a data save
+    point has been executed.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathDataSave( OCIDirPathCtx *dpctx, OCIError *errhp, ub4 action );
+
+/*
+  NAME
+    OCIDirPathFinish - OCI: Finish a direct path operation.
+
+  DESCRIPTION
+    Finishes a direct path operation.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathFinish( OCIDirPathCtx *dpctx, OCIError  *errhp );
+
+/*
+  NAME
+    OCIDirPathFlushRow - OCI: Flush a partial row from the server.
+
+  DESCRIPTION
+    Flushes a partially loaded row from the server.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathFlushRow( OCIDirPathCtx *dpctx, OCIError  *errhp );
+
+/*
+  NAME
+    OCIDirPathPrepare - OCI: Prepare a direct path operation.
+
+  DESCRIPTION
+    Prepares a table/partition for a direct path operation.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathPrepare( OCIDirPathCtx *dpctx, OCISvcCtx *svchp,
+                      OCIError  *errhp );
+
+/*
+  NAME
+    OCIDirPathLoadStream - OCI: Load a direct path stream.
+
+  DESCRIPTION
+    Load a direct path stream to the object associated with
+    the direct path context.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathLoadStream( OCIDirPathCtx *dpctx, OCIDirPathStream *dpstr,
+                         OCIError      *errhp );
+
+
+/*---------------------- OCIDirPathColArray Operations ----------------------*/
+
+/*
+  NAME
+    OCIDirPathColArrayEntryGet - OCI:  Get column array entry.
+
+  DESCRIPTION
+    Column array function which is used to get a specified entry in
+    a column array.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayEntryGet( OCIDirPathColArray *dpca, OCIError *errhp,
+                              ub4 rownum, ub2 colIdx, ub1 **cvalpp, ub4 *clenp,
+                              ub1 *cflgp );
+
+/*
+  NAME
+    OCIDirPathColArrayEntrySet - OCI:  Set column array entry.
+
+  DESCRIPTION
+    Column array function which is used to set a specified entry in
+    a column array.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayEntrySet( OCIDirPathColArray *dpca, OCIError *errhp,
+                               ub4 rownum, ub2 colIdx, ub1 *cvalp, ub4 clen,
+                               ub1 cflg );
+
+/*
+  NAME
+    OCIDirPathColArrayRowGet - OCI:  Get column array row pointers.
+
+  DESCRIPTION
+    Column array function which is used to get the base row pointers
+    for a specified row in a column array.
+    To be used in lieu of OCIDirPathColArrayEntryGet() and
+    OCIDirPathColArrayEntrySet().
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayRowGet( OCIDirPathColArray *dpca, OCIError *errhp,
+                         ub4 rownum, ub1 ***cvalppp, ub4 **clenpp,
+                         ub1 **cflgpp );
+
+/*
+  NAME
+    OCIDirPathColArrayReset - OCI: Reset Column Array State
+
+  DESCRIPTION
+    Function which resets the column array state.
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+    Resetting the column array state is necessary when piecing in a large
+    column and an error occurs in the middle of loading the column.
+ */
+sword
+OCIDirPathColArrayReset( OCIDirPathColArray *dpca, OCIError *errhp );
+
+/*
+  NAME
+    OCIDirPathColArrayToStream - OCI: Convert Column Array to Stream Format.
+
+  DESCRIPTION
+    Convert from column array format to stream format which is suitable
+    for loading via OCIDirPathLoadStream().
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathColArrayToStream( OCIDirPathColArray *dpca,  OCIDirPathCtx *dpctx,
+                               OCIDirPathStream   *dpstr, OCIError      *errhp,
+                               ub4 rowcnt, ub4 rowoff );
+
+
+
+/*----------------------- OCIDirPathStream Operations -----------------------*/
+
+/*
+  NAME
+    OCIDirPathStreamReset - OCI:
+
+  DESCRIPTION
+
+  RETURNS
+    An OCI error code, Oracle errors are returned via the error handle.
+  NOTES
+ */
+sword
+OCIDirPathStreamReset( OCIDirPathStream *dpstr, OCIError *errhp );
+
+#endif                                              /* OCI8DP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h b/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h
new file mode 100644
index 0000000..3132df7
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h
@@ -0,0 +1,10240 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ociap.h,v 1.3 2005/05/06 16:48:55 karine Exp $
+ */
+
+/* Copyright (c) 1996, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     ociap.h - Oracle Call Interface - Ansi Prototypes
+
+   DESCRIPTION 
+     <short description of component this file declares/defines> 
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     <list of external functions declared/defined - with one-line descriptions>
+
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   debanerj    08/26/03 - 6003: Lob interface changes
+   sgollapu    06/23/03 - Add OCIPing
+   debanerj    01/16/03 - Bug 2753018: Lob Locator parameter for 
+                          OCILobGetStorageLimit
+   tkeefe      02/17/03 - bug-2773794: Add new interface for setting Kerb attrs
+   ataracha    01/03/03 - Move OCIXMLType functions to ocixml.h
+   akatti      11/28/02 - [2521361]:add OCIRowidToChar prototype
+   chliang     10/23/02 - add OCIFetchRowCallback
+   cparampa    10/13/02 - Fix the prototype of OCIAQListen(ansi prototype)
+   chliang     10/12/02 - add OCIBindRowCallback
+   debanerj    09/30/02 - Unlimited size LOB 6003
+   thoang      09/25/02 - Add csid to XMLType create functions
+   thoang      04/19/02 - Add OCIXMLTypeGetNS
+   aahluwal    08/09/02 - adding OCIAQDeqArray
+   aahluwal    06/03/02 - bug 2360115
+   skabraha    04/16/02 - fix compiler warnings
+   sichandr    02/12/02 - fix OCIXMLTypeExists
+   gayyappa    02/01/02 - fix 2210776 : change Dom to DOM 
+   sichandr    10/24/01 - OCISvcCtx for XMLType create routines
+   schandir    09/14/01 - Add prototypes for Stmt Caching
+   abande      09/04/01 - Add Prototypes for Session Pooling Methods
+   stakeda     09/12/01 - add OCINlsCharSetConvert
+   whe         08/28/01 - add OCIEnvNlsCreate
+   wzhang      08/22/01 - Add OCINlsCharSetNameToId.
+   whe         10/05/01 - add prototype for OCIXMLType functions
+   mdmehta     04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+   schandir    12/12/00 - modify the ociconnectionpoolcreate() interface.
+   porangas    12/04/00 - Forward merge bug#974710 to 9i
+   rpingte     11/29/00 - Fix bug# 1485795.
+   gtarora     11/30/00 - fix comment for OCILobIsTemporary
+   akatti      11/07/00 - [1198379]:add OCIRowidToChar
+   bpalaval    10/15/00 - Forward merge 892654.
+   kmohan      09/18/00 - add OCILogon2
+   etucker     07/28/00 - add OCIIntervalFromTZ
+   vjayaram    07/18/00 - add connection pooling changes
+   etucker     07/13/00 - add dls apis for oci
+   hmasaki     07/05/00 - fix 1230846: forward merge into 8.2
+   mbastawa    06/05/00 - add OCIStmtFetch2
+   rxgovind    06/07/00 - update OCIAnyData interfaces
+   rxgovind    05/04/00 - add OCIAnyDataSet interfaces
+   rkasamse    05/01/00 - remove attrno from OCIAnyDataAttrGet
+   rkasamse    03/13/00 - add prototype s for OCCIAnyData
+   slari       09/01/99 - remove OCIEnvCallback
+   slari       08/23/99 - add OCIUcb in user callback functions
+   dsaha       07/07/99 - Add OCIFEnvCreate for forms
+   vyanaman    06/21/99 - Change OCI DateTime/Interval APIs.
+   esoyleme    07/01/99 - expose MTS performance enhancements                  
+   whe         06/14/99 - bug727872:add CONST to match definitions
+   kkarun      02/23/99 - Fix OCIDateTime APIs
+   jiyang      12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+   aroy        12/01/98 - add OCIEnvCreate
+   slari       11/23/98 - use ORASTDARG
+   slari       11/21/98 - replace ellipsis by arglist in OCIUserCallback
+   thchang     10/20/98 - correct comment on OCILobCreateTemporary
+   slari       09/08/98 - allow envh to receive error info also in CallbackReg/
+   kkarun      09/02/98 - Change const to CONST
+   aroy        08/04/98 - add OCITerminate calls                               
+   nramakri    06/25/98 - remove CONST from some OCIPickler APIs
+   jiyang      06/22/98 - Fix a lint error
+   nmallava    06/08/98 - ociistemporary -> envhp
+   jhasenbe    05/27/98 - Remove definitions for U-Calls (Unicode)
+   nmallava    05/18/98 - add comments
+   sgollapu    05/19/98 - Change text to OraText
+   aroy        04/20/98 - merge forward 8.0.5 -> 8.1.3
+   nbhatt      05/14/98 -  aq listen call
+   lchidamb    03/02/98 - Client Notification prototypes
+   vyanaman    04/19/98 - System Timestamp
+   kkarun      04/17/98 - Add more Interval functions
+   vyanaman    04/17/98 - Fix min (proc error)
+   vyanaman    04/16/98 - Add get/set TZ
+   kkarun      04/13/98 - Add Datetime prototypes
+   rkasamse    04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+   rkasamse    04/15/98 - chage pickler cart interface
+   slari       03/20/98 - change proto of OCIUserCallback
+   slari       02/17/98 - add OCIUserCallback
+   jiyang      04/02/98 - Accept both env and user handles for NLS
+   rkasamse    03/20/98 - remove prototypes for OCIMemoryDuration* functions.
+   tsaulys     03/20/98 - use environment or session handle
+   nmallava    04/09/98 - OCILobLocatorAssign
+   nmallava    04/07/98 - lobgetchunksize and writeappend apis
+   jhasenbe    04/06/98 - Add new interfaces for Unicode support
+   nmallava    03/17/98 - add interfaces
+   nmallava    03/16/98 - add open/close apis
+   nmallava    03/10/98 - add temporary lobs apis
+   sgollapu    07/10/97 - Add OCIReset
+   sgollapu    02/09/98 - OCI non-blocking
+   nramakri    01/16/98 - remove #ifdef NEVER clause for OCIExtract
+   rmurthy     01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+   ewaugh      12/18/97 - Turn type wrappers into functions.
+   skabraha    12/02/97 - adding OCIFile functions
+   rhwu        12/02/97 - add OCI Thread
+   nramakri    12/15/97 - move to core4
+   nramakri    12/11/97 - modify OCIExtract prototype
+   ewaugh      12/10/97 - add OCIFormat prototypes
+   nmallava    12/17/97 - Add ilob open and close apis
+   rkasamse    12/03/97 - Change some of the function names for pickler cartrid
+   nramakri    11/12/97 - add OCIExtract prototypes
+   rkasamse    11/21/97 - add prototypes for memory cartridge services and cont
+   rkasamse    11/03/97 - Add pickler cartridge interfaces.
+   jiyang      11/11/97 - Add NLS service for cartridge
+   tanguyen    08/19/97 -
+   cxcheng     07/30/97 - replace OCISvcCtx with OCISvcCtx
+   schandra    06/25/97 - AQ OCI interface
+   bnainani    07/21/97 - add prototypes for Oracle XA extensions
+   esoyleme    05/13/97 - move failover callback prototype
+   skmishra    05/06/97 - stdc compiler fixes
+   skmishra    04/24/97 - C++ Compatibility changes
+   skotsovo    04/21/97 - make lob parameter names consistent
+   rwhitman    04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+   ramkrish    04/15/97 - Add free flag to OCILobFlushBuffer
+   dchatter    04/10/97 - add nzt.h inclusion
+   cxcheng     04/09/97 - change objnamp from CONST text* to dvoid*
+   cxcheng     04/08/97 - fix prototype of OCIDescribeAny()
+   skotsovo    03/31/97 - remove OCILobLocatorSize
+   skotsovo    03/27/97 - add OCILobLoadFromFile
+   bcchang     02/18/97 - Fix syntax error
+   dchatter    01/13/97 - fix comments on LOB calls
+   aroy        01/10/97 - remove ocilobfilecreate delete
+   sgollapu    12/27/96 - Correct OCILogon prototype
+   dchatter    01/04/97 - comments to describe the functions
+   sgollapu    11/25/96 - Change OCILobFileIsExistent
+   schandra    11/18/96 - Remove xa.h include
+   sgollapu    11/09/96 - Change prototype of OCIDescribeAny
+   dchatter    10/31/96 - delete CONST from lob write cb fn
+   dchatter    10/30/96 - more changes
+   dchatter    10/26/96 - lob/file long name corrections
+   slari       10/16/96 - delete unused calls
+   rwessman    10/29/96 - Fixed OCISecurityGetIdentity prototype
+   bcchang     10/25/96 - Fix syntax error
+   sgollapu    10/22/96 - Add OCILogon and OCILogoff
+   rwessman    10/16/96 - Added cryptographic and digital signature functions
+   sgollapu    10/10/96 - Add ocibdp and ocibdn
+   rxgovind    10/07/96 - add oci file calls
+   skotsovo    10/01/96 - move orl lob fnts to oci
+   skotsovo    09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+   aroy        08/29/96 - change prototype for Nchar Lob support
+   dchatter    08/21/96 - OCIResultSetToStmt prototype change
+   sthakur     08/14/96 - add OCIParamSet
+   schandra    07/26/96 - TX OCI return values - sb4->sword
+   aroy        07/17/96 - terminology change: OCILobLocator => OCILobLocator
+   dchatter    07/01/96 - create ANSI prototypes
+   dchatter    07/01/96 - Creation
+
+*/
+
+ 
+#ifndef OCIAP_ORACLE
+# define OCIAP_ORACLE
+
+# ifndef ORATYPES 
+#  include <oratypes.h> 
+# endif 
+ 
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+ 
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please 
+maintain the arrangement when adding a new function description. The actual 
+prototypes are below this comment section and donot follow any alphabetical 
+ordering. 
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle. 
+Syntax
+sword OCIAttrGet ( CONST dvoid    *trgthndlp,
+                 ub4            trghndltyp,
+                 dvoid          *attributep,
+                 ub4            *sizep,
+                 ub4            attrtype,
+                 OCIError       *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B,  "Handle Attributes",  for a list of handle types and their 
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type. 
+trghndltyp (IN) - is the handle type. 
+attributep (OUT) - is a pointer to the storage for an attribute value. The 
+attribute value is filled in. 
+sizep (OUT) - is the size of the attribute value. 
+This can be passed in as NULL for most parameters as the size is well known. 
+For text* parameters, a pointer to a ub4 must be passed in to get the length 
+of the string. 
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor. 
+Syntax
+sword OCIAttrSet ( dvoid       *trgthndlp,
+                 ub4         trghndltyp,
+                 dvoid       *attributep,
+                 ub4         size,
+                 ub4         attrtype,
+                 OCIError    *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor. 
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets 
+modified. 
+trghndltyp (IN/OUT) - is the handle type. 
+attributep (IN) - a pointer to an attribute value. 
+The attribute value is copied into the target handle. If the attribute value 
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for 
+most attributes as the size is already known by the OCI library. For text*
+attributes, a ub4 must be passed in set to the length of the string. 
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind     *bindp,
+                           OCIError    *errhp,
+                           ub4         pvskip, 
+                           ub4         indskip, 
+                           ub4         alskip, 
+                           ub4         rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind 
+handle returned by that initial bind call is used as a parameter for the 
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures" 
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value. 
+indskip (IN) - skip parameter for the next indicator value or structure. 
+alskip (IN) - skip parameter for the next actual length value. 
+rcskip (IN) - skip parameter for the next column-level return code value. 
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+              OCIStmt       *stmtp, 
+              OCIBind       **bindp,
+              OCIError      *errhp,
+              CONST OraText    *placeholder,
+              sb4           placeh_len,
+              dvoid         *valuep,
+              sb4           value_sz,
+              ub2           dty,
+              dvoid         *indp,
+              ub2           *alenp,
+              ub2           *rcodep,
+              ub4           maxarr_len,
+              ub4           *curelep, 
+              ub4           mode ); 
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information 
+for this particular input value. The handle is feed implicitly when the 
+statement handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+placeholder (IN) - the placeholder attributes are specified by name if 
+ocibindn() is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is
+the maximum size of any element possible with the actual sizes being specified 
+in the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). 
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic(). 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindByPos-----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos ( 
+              OCIStmt      *stmtp, 
+              OCIBind      **bindp,
+              OCIError     *errhp,
+              ub4          position,
+              dvoid        *valuep,
+              sb4          value_sz,
+              ub2          dty,
+              dvoid        *indp,
+              ub2          *alenp,
+              ub2          *rcodep,
+              ub4          maxarr_len,
+              ub4          *curelep, 
+              ub4          mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information 
+for this particular input value. The handle is feed implicitly when the 
+statement handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+position (IN) - the placeholder attributes are specified by position if 
+ocibindp() is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is
+the maximum size of any element possible with the actual sizes being specified
+in the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). Ignored 
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic() . 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation. 
+Syntax
+sword OCIBindDynamic( OCIBind     *bindp,
+                    OCIError    *errhp,
+                    dvoid       *ictxp, 
+                    OCICallbackInBind         (icbfp)(
+                                dvoid            *ictxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                dvoid            **bufpp,
+                                ub4              *alenp,
+                                ub1              *piecep, 
+                                dvoid            **indp ),
+                    dvoid       *octxp,
+                    OCICallbackOutBind         (ocbfp)(
+                                dvoid            *octxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                dvoid            **bufp, 
+                                ub4              **alenpp,
+                                ub1              *piecep,
+                                dvoid            **indpp, 
+                                ub2              **rcodepp)   );
+Comments
+This call is used to register user-defined callback functions for providing 
+data for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a 
+previous call to OCIBindByName() or OCIBindByPos(). 
+The callback function pointers must return OCI_CONTINUE if it the call is 
+successful. Any return code other than OCI_CONTINUE signals that the client 
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or 
+OCIBindByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ictxp (IN) - the context pointer required by the call back function icbfp. 
+icbfp (IN) - the callback function which returns a pointer to the IN bind 
+value or piece at run time. The callback takes in the following parameters. 
+ictxp (IN/OUT) - the context pointer for this callback function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. 1 based not 
+greater than curele parameter of the bind call. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and may not be greater than curele parameter of the bind call. 
+bufpp (OUT) - the pointer to the buffer. 
+piecep (OUT) - which piece of the bind value. This can be one of the 
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE, 
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an 
+sb2 value or a pointer to an indicator structure for binding named data 
+types. 
+indszp (OUT) - contains the indicator value size. A pointer containing 
+the size of either an sb2 or an indicator structure pointer. 
+octxp (IN) - the context pointer required by the callback function ocbfp. 
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind 
+value or piece at run time. The callback takes in the following parameters. 
+octxp (IN/OUT) - the context pointer for this call back function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and must not be greater than curele parameter of the bind call. 
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece. 
+buflp (OUT) - returns the buffer size. 
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind 
+value/piece after it has been read. 
+piecep (IN/OUT) - which piece of the bind value. It will be set by the 
+library to be one of the following values - OCI_ONE_PIECE or 
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set 
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default - 
+OCI_ONE_PIECE. 
+indpp (OUT) - returns a pointer to contain the indicator value which 
+either an sb2 value or a pointer to an indicator structure for named data 
+types. 
+indszpp (OUT) - returns a pointer to return the size of the indicator 
+value which is either size of an sb2 or size of an indicator structure. 
+rcodepp (OUT) - returns a pointer to contains the return code. 
+Related Functions
+OCIAttrGet()
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named 
+data type (object)  bind.
+Syntax
+sword OCIBindObject ( OCIBind          *bindp,
+                    OCIError         *errhp, 
+                    CONST OCIType    *type,
+                    dvoid            **pgvpp, 
+                    ub4              *pvszsp, 
+                    dvoid            **indpp, 
+                    ub4              *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type 
+or a REF. An error will be returned if this function is called when the OCI 
+environment has been initialized in non-object mode. 
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the 
+pointers to the IN buffers are obtained either using the callback icbfp 
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call. 
+The buffers are dynamically allocated for the OUT data and the pointers to 
+these buffers are returned either by calling ocbfp() registered by the 
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed 
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned 
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be 
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName() 
+or OCIBindByPos(). 
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program 
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an 
+array, pgvpp points to an array of pointers. When the bind variable is also an 
+OUT variable, the OUT Named Data Type value or REF is allocated 
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points 
+to an array of pointer(s) to these newly allocated named data types in the 
+object cache. 
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named 
+Data Type buffers are requested at runtime. For static array binds, skip 
+factors may be specified using the OCIBindArrayOfStruct() call. The skip 
+factors are used to compute the address of the next pointer to the value, the 
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the 
+named data type is not required on input. For an array, pvszsp is an array of 
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named 
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC 
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array 
+of pointers. When the bind variable is also an OUT bind variable, memory is 
+allocated in the object cache, to store the unpickled OUT indicator values. At 
+the end of the execute when all OUT values have been received, indpp points 
+to the pointer(s) to these newly allocated indicator structure(s). 
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program 
+variable. For an array, it is an array of sb2s. On return for OUT bind 
+variables, this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( dvoid      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server. It is normally used 
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context 
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Creates the connections in the pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                         OraText **poolName, sb4 *poolNameLen, 
+                         CONST Oratext *dblink, sb4 dblinkLen,
+                         ub4 connMin, ub4 connMax, ub4 connIncr,
+                         CONST OraText *poolUsername, sb4 poolUserLen,
+                         CONST OraText *poolPassword, sb4 poolPassLen, 
+                         ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT)  - A pointer to the environment where the Conencton Pool
+                  is to be created
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name. 
+poolNameLen (OUT) - The length of the connection pool name 
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+                  be used as the default pool name.
+dblinkLen (IN)  - The length of the string pointed to by dblink.
+connMin (IN)    - Specifies the minimum number of connections in the
+                  Connection Pool at any instant.
+                  connMin number of connections are started when
+                  OCIConnectionPoolCreate() is called.
+connMax (IN)    - Specifies the maximum number of connections that can be
+                  opened to the database. Once this value is reached, no
+                  more connections are opened.
+connIncr (IN)   - Allows application to set the next increment for
+                  connections to be opened to the database if the current
+                  number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+                         session and this attribute provides a username
+                         for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+                        above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and 
+OCI_CPOOL_REINITIALIZE 
+
+Related Functions
+OCIConnectionPoolDestroy()
+
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Terminates the connections in the pool
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An initialiazed pool handle.
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+mode (IN)       - Currently, OCIConnectionPoolDestroy() will support only
+                  the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name: 
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp, 
+                      OraText **poolName, ub4 *poolNameLen, 
+                      CONST OraText *connStr, ub4 connStrLen,
+                      ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                      OraText *userid,  ub4 useridLen,
+                      OraText *password, ub4 passwordLen,
+                      ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+                 pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+               These are the number of sessions opened in the beginning, if
+               in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+               Once this value is reached, no more sessions are opened,
+               unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+           OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                    OCIAuthInfo *authhp,
+                    OraText *poolName, ub4 poolName_len,
+                    CONST OraText *tagInfo, ub4 tagInfo_len,
+                    OraText **retTagInfo, ub4 *retTagInfo_len,
+                    boolean *found,
+                    ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+                 filled with a server and session handle, attached to the
+                 pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+                session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+                In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+                   user wants a default session, he must specify a NULL here.
+                   Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+                   the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+              set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+            OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+            OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS -  if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+                    total number of sessions > maxsessions. Only valid for
+                    Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+                          OraText *tag, ub4 tag_len,
+                          ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+           This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+           specified. In this case, the session is labelled with this tag and
+           returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode 
+               OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+            OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+            When OCI_RLS_SPOOL_DROPSESS is specified, the session
+            will be removed from the session pool. If OCI_RLS_SPOOL_RETAG 
+            is set, the tag on the session will be altered. If this mode is 
+            not set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from, 
+                        OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+        Performs date assignment. The type of the output will be same as that
+        of input
+
+------------------------------OCIDateTimeCheck----------------------------
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                 ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - date to be checked
+valid (OUT) -  returns zero for a valid date, otherwise 
+                the ORed combination of all error bits specified below:
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID  0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_TIMEZONE    0x4000          Bad Timezone
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the error returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+        Check if the given date is valid.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare----------------------------
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1, 
+                     CONST OCIDateTime *date2,  sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+                1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if 
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is 
+greater than date2.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate, 
+                                OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime 
+DESCRIPTION: Converts one datetime type to another. The result type is
+       the type of the 'outdate' descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            conversion not possible.
+   
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str, 
+             size_t d_str_length, CONST OraText *fmt, ub1 fmt_length,
+             CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+                    conversion takes place in session NLS_LANGUAGE and
+                    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+                then 'date_str' is treated as a null terminated  string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in the default format for
+                the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+                days and months are specified, if null i.e. (OraText *)0,
+                the default language of session is used, 
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+        Converts the given string to Oracle datetime type set in the 
+        OCIDateTime descriptor according to the specified format. Refer to 
+        "TO_DATE" conversion function described in "Oracle SQL Language 
+        Reference Manual" for a description of format.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid format
+          unknown language
+          invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err,  CONST OCIDateTime *date, 
+                           sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)  
+                                portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+year      (OUT) - year value
+month     (OUT) - month value
+day       (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+                 ub1 *hour, ub1 *minute, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second, 
+                        fractional second)  of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - hour value
+minute       (OUT) - minute value
+sec       (OUT) - second value
+fsec      (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,CONST 
+              OCIDateTime *datetime,sb1 *hour,sb1  *minute);
+
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)  
+                         portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - TimeZone Hour value
+minute     (OUT) - TimeZone Minute value
+
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err, 
+              OCIDateTime *sys_date );
+ 
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with 
+                      timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+ 
+DESCRIPTION: 
+        Gets the system current date and time as a timestamp with timezone
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+         OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+                                will be of same type as input datetime
+DESCRIPTION: 
+        Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if:
+                resulting date is before Jan 1, -4713
+                resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+              OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+                                will be of same type as input datetime
+DESCRIPTION: 
+        Subtracts an interval from a datetime and stores the result in a
+        datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if:
+                resulting date is before Jan 1, -4713
+                resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(dvoid  *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+       fields for the OCIDateTime descriptor types are used.
+PARAMETERS:
+        hndl (IN) - Session/Env handle. 
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        datetime (IN) - Pointer to OCIDateTime 
+        year      (IN) - year value
+        month     (IN) - month value
+        day       (IN) - day value        
+        hour      (IN) - hour value
+        min       (IN) - minute value
+        sec       (IN) - second value
+        fsec      (IN) - Fractional Second value
+        timezone  (IN) - Timezone string
+        timezone_length(IN) - Length of timezone string
+
+DESCRIPTION:
+       Constructs a DateTime descriptor. The type of the datetime is the
+       type of the OCIDateTime descriptor. Only the relevant fields based
+       on the type are used. For Types with timezone, the date and time
+       fields are assumed to be in the local time of the specified timezone.
+       If timezone is not specified, then session default timezone is
+       assumed.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR if datetime is not valid.
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1, 
+                OCIDateTime *indate2, OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter  (OUT) - pointer to output interval
+DESCRIPTION: 
+        Takes two datetimes as input and stores their difference in an 
+        interval. The type of the interval is the type of the 'inter'
+        descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+           datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                        CONST OraText *fmt, ub1 fmt_length, ub1 fsprec, 
+                        CONST OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String 
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+                    conversion takes place in session NLS_LANGUAGE and
+                    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+                the date is converted to a character string in the
+                default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+               fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and 
+                abbreviations of months and days are returned;
+                default language of session is used if 'lang_name' 
+                is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          buffer too small
+          invalid format
+          unknown language
+          overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, 
+                                 OCIError *err,
+                                 CONST OCIDateTime *datetime,
+                                 ub1 *buf,
+                                 ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to an OCIDateTime.
+buf (OUT)       - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+        Returns either the timezone region name or the absolute hour and minute
+        offset. If the DateTime was created with a region id then the region 
+        name will be returned in the buf.  If the region id is zero, then the 
+        hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+---------------------------------OCIDateTimeToArray----------------------------
+sword OCIDateTimeToArray(dvoid *hndl, 
+                         OCIError *err,
+                         CONST OCIDateTime *datetime,
+                         CONST OCIInterval *reftz,
+                         ub1 *outarray,
+                         ub4 *len
+                         ub1 *fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to OCIDateTime to be converted.
+outarray (OUT)  - Result array storage
+len (OUT)        - pointer to  length of outarray.
+fsprec (IN)     - Number of fractional seconds digits.
+DESCRIPTION:
+        Returns an array representing the input DateTime descriptor.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+--------------------------------OCIDateTimeFromArray---------------------------
+sword OCIDateTimeFromArray(dvoid *hndl, 
+                         OCIError *err,
+                         ub1 *inarray,
+                         ub4 len
+                         ub1 type
+                         OCIDateTime *datetime,
+                         OCIInterval *reftz,
+                         ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+inarray (IN)   - Pointer to input array representtion of DateTime
+len (IN)       - len of inarray.
+type (IN)      - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+                 SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN)     - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN)    - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+        Returns a pointer to an OCIDateTime of type type converted from 
+        the inarray.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64) 
+representation into user provided buffer outbfp of length outbflp. After 
+execution outbflp contains amount of bytes converted.In case of truncation 
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc, 
+                      OraText *outbfp, 
+                      ub2 *outbflp, 
+                      OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID. 
+
+Parameters
+rowidDesc (IN)   - rowid DESCriptor which is allocated from OCIDescritorAlloc
+                   and populated by a prior SQL statement execution
+outbfp (OUT)     - pointer to the buffer where converted rowid in character 
+                   representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+                   Before execution (IN mode) *outbflp contains the size of
+                   outbfp, after execution (OUT mode) *outbflp contains amount
+                   of bytes converted. In an event of truncation during 
+                   conversion *outbflp contains the required length to make
+                   conversion successful.
+errhp (IN/OUT)   - an error handle which can be passed to OCIErrorGet() for
+                   diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine   *defnp,
+                             OCIError    *errhp,
+                             ub4         pvskip, 
+                             ub4         indskip, 
+                             ub4         rlskip,
+                             ub4         rcskip );
+Comments
+This call specifies additional attributes necessary for an array define, 
+used in an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters" 
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call 
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location. 
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer. 
+Syntax
+sb4 OCIDefineByPos ( 
+              OCIStmt     *stmtp, 
+              OCIDefine   **defnp,
+              OCIError    *errhp,
+              ub4         position,
+              dvoid       *valuep,
+              sb4         value_sz,
+              ub2         dty,
+              dvoid       *indp,
+              ub2         *rlenp,
+              ub2         *rcodep,
+              ub4         mode );
+Comments
+This call defines an output buffer which will receive data retreived from 
+Oracle. The define is a local step which is necessary when a SELECT statement 
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The 
+first call is to OCIDefineByPos(), which defines the minimal attributes 
+required to specify the fetch. 
+This call takes as a parameter a define handle, which must have been 
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be 
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters 
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate 
+attributes of a named data type fetch. In this case the data buffer pointer 
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called 
+after ocidefn() in order to fetch multiple rows with a column of named 
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type 
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not 
+LOB values, are always returned for a LOB column. LOB values can then be 
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an 
+array of bytes sufficient for holding the required NCHAR characters. 
+Nested table columns are defined and fetched like any other named data type. 
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client 
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a 
+subsequent call to OCIDefineDynamic(). When the client library needs a 
+buffer to return the fetched data, the callback will be invoked and the 
+runtime buffers provided will return a piece or the whole data. 
+a polling mechanism using calls supplied by the OCI. This mode is 
+assumed if no callbacks are defined. In this case, the fetch call returns the 
+OCI_NEED_DATA error code, and a piecewise polling method is used 
+to provide the data.
+Related Functions: For more information about using the 
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data 
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining" 
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly 
+allocated by this call.  This handle is used to  store the define information 
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are 
+1-based and are numbered from left to right. For example, in the SELECT 
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type 
+specified in the dty parameter. A number of buffers can be specified when 
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored 
+internally in VARCHAR2 format, the number of characters desired, if different 
+from the buffer size in bytes, may be additionally specified by the using 
+OCIAttrSet(). 
+In an NLS conversion environment, a truncation error will be generated if the 
+number of bytes specified is insufficient to handle the number of characters 
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF) 
+are valid only if the environment has been intialized with in object mode. 
+indp - pointer to an indicator variable or array. For scalar data types, 
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named 
+data types, a pointer to a named data type indicator structure or an array of 
+named data type indicator structures is associated by a subsequent 
+OCIDefineObject() call. 
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in 
+rlenp is the length of the data in the corresponding element in the row after 
+the fetch. 
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically 
+allocated data at the time of fetch, this mode must be used. The user may 
+additionally call OCIDefineDynamic() to set up a callback function that 
+will be invoked to receive the dynamically allocated buffers and to set 
+up the memory allocate/free callbacks and the context for the callbacks. 
+valuep and value_sz are ignored in this mode. 
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos(). 
+Syntax
+sword OCIDefineDynamic( OCIDefine   *defnp,
+                      OCIError    *errhp,
+                      dvoid       *octxp, 
+                      OCICallbackDefine (ocbfp)(
+                                  dvoid             *octxp,
+                                  OCIDefine         *defnp,
+                                  ub4               iter, 
+                                  dvoid             **bufpp,
+                                  ub4               **alenpp,
+                                  ub1               *piecep,
+                                  dvoid             **indpp,
+                                  ub2               **rcodep)  );
+Comments
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode has been selected in a call to 
+OCIDefineByPos(). 
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be 
+dynamically allocated for REF, and named data type, values to receive the 
+data. The pointers to these buffers will be returned. 
+If OCI_DYNAMIC_FETCH mode was selected, and the call to 
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise 
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to 
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+octxp (IN) - points to a context for the callback function. 
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get 
+a pointer to the buffer into which the fetched data or a piece of it will be 
+retreived. The callback also specifies the indicator, the return code and the 
+lengths of the data piece and indicator. The callback has the following 
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback 
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie. 
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp 
+contains the size of the buffer after return from callback. Gets set to 
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or 
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was 
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if 
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or 
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE. 
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine       *defnp,
+                      OCIError        *errhp,
+                      CONST OCIType   *type,
+                      dvoid           **pgvpp, 
+                      ub4             *pvszsp, 
+                      dvoid           **indpp, 
+                      ub4             *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.
+An error will be returned if this function is called when the OCI environment 
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information 
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to 
+OCIDefineByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which 
+describes the type of the program variable. Only used for program variables 
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL 
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an 
+array, pgvpp points to an array of pointers. Memory for the fetched named data 
+type instance(s) is dynamically allocated in the object cache. At the end of 
+the fetch when all the values have been received, pgvpp points to the 
+pointer(s) to these newly allocated named data type instance(s). The 
+application must call OCIObjectMarkDel() to deallocate the named data type 
+instance(s) when they are no longer needed. 
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it 
+is an array of ub4s. On return points to the size(s) of unpickled fetched 
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array 
+of pointers. Memory is allocated to store the indicator structures in the 
+object cache. At the end of the fetch when all values have been received, 
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program 
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as 
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( CONST dvoid   *parenth,
+                   dvoid         **descpp, 
+                   ub4           type,
+                   size_t        xtramem_sz,
+                   dvoid         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL descriptor or LOB locator is returned 
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if 
+an out-of-memory error occurs. 
+Parameters
+parenth (IN) - an environment handle. 
+descpp (OUT) - returns a descriptor or LOB locator of desired type. 
+type (IN) - specifies the type of descriptor or LOB locator to be allocated. 
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C 
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C 
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type 
+OCIResult that references a result set (a number of rows as a result of a 
+query). This descriptor is bound to a bind variable of data type 
+SQLT_RSET (result set). The descriptor has to be converted into a 
+statement handle using a function - OCIResultSetToStmt() - which can 
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the 
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C 
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a 
+complex object retrieval descriptor of C type 
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use 
+by the application. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( dvoid    *descp,
+                  ub4      type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE. 
+All descriptors must be explicitly deallocated. OCI will not deallocate a 
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor. 
+type (IN) - specifies the type of storage to be freed. The specific types are: 
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number 
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval 
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx     *svchp,
+                     OCIError      *errhp,
+                     dvoid         *objptr,
+                     ub4           objnm_len,
+                     ub1           objptr_typ,
+                     ub1           info_level,
+                     ub1           objtype,
+                     OCIDesc       *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a 
+result of this call, the describe handle is populated with the object-specific 
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a 
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on 
+the parameter descriptor returns the specific attributes of a stored procedure 
+or function parameter or a table column descriptor as the case may be. 
+These subsequent calls do not need an extra round trip to the server because 
+the entire schema object description cached on the client side by 
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return 
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe 
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be 
+described. Only procedure or function names are valid when connected to an 
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - object type.
+dschp (IN/OUT) - a describe handle that is populated with describe 
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under.  This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate  ( OCIEnv        **envhpp, 
+                      ub4           mode, 
+                      CONST dvoid   *ctxp, 
+                      CONST dvoid   *(*malocfp) 
+                                    (dvoid *ctxp, 
+                                        size_t size), 
+                      CONST dvoid   *(*ralocfp) 
+                                    (dvoid *ctxp, 
+                                       dvoid *memptr, 
+                                       size_t newsize), 
+                      CONST void    (*mfreefp) 
+                                    ( dvoid *ctxp, 
+                                       dvoid *memptr))
+                      size_t    xtramemsz,
+                      dvoid     **usrmempp );
+ 
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes.  This function 
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode. 
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility. 
+ 
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode.
+Syntax
+sword OCIEnvNlsCreate(OCIEnv        **envhpp,
+                      ub4           mode,
+                      dvoid         *ctxp,
+                      dvoid         *(*malocfp)
+                                    (dvoid *ctxp,
+                                        size_t size),
+                      dvoid         *(*ralocfp)
+                                    (dvoid *ctxp,
+                                       dvoid *memptr,
+                                       size_t newsize),
+                      void          (*mfreefp)
+                                    (dvoid *ctxp,
+                                       dvoid *memptr),
+                      size_t        xtramemsz,
+                      dvoid         **usrmempp,
+                      ub2           charset,
+                      ub2           ncharset)
+Comments
+The charset and ncharset must be both zero or non-zero.
+The parameters have the same meaning as the ones in OCIEnvCreate().
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function. 
+Applications can achieve the same effects by setting 
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv    **envp,
+                 ub4       mode,
+                 size_t    xtramemsz,
+                 dvoid     **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized 
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the 
+environment handle can be used to obtain ORACLE specific errors and 
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of an environment mode. The only valid 
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing 
+the use of OCIEnvInit(). 
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( dvoid      *hndlp, 
+                  ub4        recordno,
+                  OraText       *sqlstate,
+                  ub4        *errcodep, 
+                  OraText       *bufp,
+                  ub4        bufsiz,
+                  ub4        type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error. 
+Currently does not support SQL state. This call can be called a multiple 
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for 
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks 
+info. Starts from 1. 
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize 
+Purpose
+This function initializes the parameter manager. 
+Syntax
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS 
+information is stored inside the parameter manager context and used in 
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform 
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and 
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with 
+               OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name, 
+                       ub1 type, ub4 flag, CONST dvoid *defval,
+                       CONST sb4 *intrange, CONST OraText *CONST *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before 
+calling OCIExtractFromFile() or OCIExtractFromStr().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER, 
+            OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or 
+            OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values 
+            or 0 otherwise.
+defval (IN) - Set to the default value for the key.  May be NULL if there is 
+               no default.  A string default must be a (text*) type, an 
+               integer default must be an (sb4*) type, and a boolean default 
+               must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer 
+                values.  May be NULL if the key is not an integer type or if 
+                all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key.  May be NULL 
+               if the key is not a string type or if all text values are 
+               acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed. 
+Syntax
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag, 
+                         OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed. 
+Syntax
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key. 
+Syntax
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname, 
+                       uword valno, ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored 
+in memory. 
+Syntax
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, 
+                         OraText *name, ub1 *type, uword *numvals, 
+                         dvoid ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior 
+to calling this routine to generate the parameter list from the parameter 
+structures that are stored in memory. 
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING, 
+             OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or 
+             OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************  OCIFileClose() ***********************************
+ 
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( dvoid             *hndl, 
+                      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR. 
+ 
+Parameters
+ hndl  (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.  
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( dvoid           *hndl, 
+                      OCIError         *err, 
+                      OraText          *filename,
+                      OraText          *path,
+                      ub1              *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR. 
+
+Parameters
+ hndl(IN) - OCI environment or session handle
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+     
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( dvoid             *hndl, 
+                      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters 
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(dvoid           *hndl, 
+                  OCIError        *err,
+                  OraText         *filename,
+                  OraText         *path,
+                  ubig_ora        *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+   
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( dvoid *hndl, 
+                     OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+     
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+     Open a file.
+
+Syntax
+ sword OCIFileOpen ( dvoid               *hndl, 
+                     OCIError            *err,
+                     OCIFileObject      **filep,
+                     OraText             *filename,
+                     OraText             *path,
+                     ub4                  mode,
+                     ub4                  create, 
+                     ub4                  type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened. 
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the 
+ appropriate type (see the parameter type). If any of the standard files 
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are: 
+     OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists. 
+                        If the file already exists overwrite it.
+     OCI_FILE_EXIST - open it if it exists, else fail.
+     OCI_FILE_EXCL - fail if the file exists, else create.
+     OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+     OCI_FILE_APPEND - set the file pointer to the end of the file prior to 
+                      writing(this flag can be OR'ed with OCI_FILE_EXIST or
+                      OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN, 
+       OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+       If any of the standard files are specified then filename, path, mode
+       and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+   
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( dvoid            *hndl, 
+                     OCIError         *err,
+                     OCIFileObject    *filep,
+                     dvoid            *bufp,
+                     ub4               bufl,
+                     ub4              *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The 
+ length of the allocated memory is assumed to be bufl. 
+ bufl - the length of the buffer in bytes. 
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( dvoid           *hndl, 
+                     OCIError        *err,  
+                     OCIFileObject   *filep,
+                     uword            origin,
+                     ubig_ora         offset,
+                     sb1              dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting 
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT 
+ (current position), or OCI_FILE_SEEK_END (end of file). 
+ offset - The number of bytes from the origin we want to start reading from. 
+ dir - The direction we want to go from the origin. NOTE: The direction 
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD. 
+ 
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( dvoid *hndl, 
+                     OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure. 
+  
+Related Functions 
+ OCIFileInit   
+ 
+
+********************************* OCIFileWrite() **************************** 
+
+Name 
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+  Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( dvoid            *hndl, 
+                      OCIError         *err,  
+                      OCIFileObject    *filep,
+                      dvoid            *bufp, 
+                      ub4               buflen
+                      ub4              *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written. 
+ The length of the allocated memory is assumed to be the value passed
+ in bufl. 
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+ 
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead 
+
+
+
+
+
+OCIHandleAlloc() 
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( CONST dvoid   *parenth,
+                     dvoid         **hndlpp, 
+                     ub4           type, 
+                     size_t        xtramem_sz,
+                     dvoid         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL handle is returned on success. Bind 
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is 
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if 
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed 
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle. 
+hndlpp (OUT) - returns a handle to a handle type. 
+type (IN) - specifies the type of handle to be allocated. The specific types 
+are: 
+OCI_HTYPE_ERROR - specifies generation of an error report handle of 
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle 
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application 
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle 
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition 
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE  - specifies generation of a select list 
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle 
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication 
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex 
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C 
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( dvoid     *hndlp,
+                    ub4       type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type 
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child 
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types 
+are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE  - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4           mode,
+                    CONST dvoid   *ctxp, 
+                    CONST dvoid   *(*malocfp) 
+                                  ( dvoid *ctxp,
+                                    size_t size ),
+                    CONST dvoid   *(*ralocfp)
+                                  ( dvoid *ctxp,
+                                    dvoid *memp,
+                                    size_t newsize ),
+                    CONST void    (*mfreefp)
+                                  ( dvoid *ctxp,
+                                    dvoid *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call. 
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIInitialize().
+Related Functions
+
+-------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate (ub4 mode);
+
+Comments
+This call performs  OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+---------------------- OCIIntervalAssign --------------------------------- 
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err, 
+                    CONST OCIInterval *inpinter, OCIInterval *outinter );
+
+  DESCRIPTION
+    Copies one interval to another to create a replica
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpinter - Input Interval 
+    (OUT) outinter - Output Interval 
+  RETURNS
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck ------------------------------------ 
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+                         ub4 *valid );
+
+  DESCRIPTION
+    Checks the validity of an interval
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  interval - Interval to be checked 
+    (OUT) valid     - Zero if the interval is valid, else returns an Ored
+        combination of the following codes.
+
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_INTER_INVALID_DAY         0x1           Bad day
+   OCI_INTER_DAY_BELOW_VALID     0x2           Bad DAy Low/high bit (1=low)
+   OCI_INTER_INVALID_MONTH       0x4           Bad MOnth
+   OCI_INTER_MONTH_BELOW_VALID   0x8           Bad MOnth Low/high bit (1=low)
+   OCI_INTER_INVALID_YEAR        0x10          Bad YeaR
+   OCI_INTER_YEAR_BELOW_VALID    0x20          Bad YeaR Low/high bit (1=low)
+   OCI_INTER_INVALID_HOUR        0x40          Bad HouR
+   OCI_INTER_HOUR_BELOW_VALID    0x80          Bad HouR Low/high bit (1=low)
+   OCI_INTER_INVALID_MINUTE      0x100         Bad MiNute
+   OCI_INTER_MINUTE_BELOW_VALID  0x200         Bad MiNute Low/high bit(1=low)
+   OCI_INTER_INVALID_SECOND      0x400         Bad SeCond
+   OCI_INTER_SECOND_BELOW_VALID  0x800         bad second Low/high bit(1=low)
+   OCI_INTER_INVALID_FRACSEC     0x1000        Bad Fractional second
+   OCI_INTER_FRACSEC_BELOW_VALID 0x2000        Bad fractional second Low/High
+
+        
+  RETURNS
+    OCI_SUCCESS if interval is okay
+    OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare ----------------------------------- 
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1, 
+                        OCIInterval *inter2, sword *result );
+
+  DESCRIPTION
+        Compares two intervals, returns 0 if equal, -1 if inter1 < inter2, 
+        1 if inter1 > inter2
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter1  (IN)   - Interval to be compared 
+     inter2  (IN)   - Interval to be compared 
+     result  (OUT)  -   comparison result, 0 if equal, -1 if inter1 < inter2, 
+                        1 if inter1 > inter2
+
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if 
+        the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide ------------------------------------ 
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend, 
+                OCINumber *divisor, OCIInterval *result );
+ 
+  DESCRIPTION
+     Divides an interval by an Oracle Number to produce an interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     dividend  (IN)   - Interval to be divided 
+     divisor   (IN)   - Oracle Number dividing `dividend' 
+     result    (OUT)  - resulting interval (dividend / divisor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalFromNumber -------------------- 
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, 
+               OCIInterval *inter, OCINumber *number);
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (OUT)  interval - Interval to be converted 
+    (IN) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_SUCCESS on success 
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR on error.
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+ ---------------------- OCIIntervalFromText --------------------------------- 
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr, 
+                size_t str_len, OCIInterval *result );
+
+  DESCRIPTION
+    Given an interval string produce the interval represented by the string.
+    The type of the interval is the type of the 'result' descriptor.
+  PARAMETERS
+
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpstr - Input string 
+    (IN)  str_len - Length of input string 
+    (OUT) result - Resultant interval 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR if
+        there are too many fields in the literal string
+        the year is out of range (-4713 to 9999)
+        if the month is out of range (1 to 12)
+        if the day of month is out of range (1 to 28...31)
+        if hour is not in range (0 to 23)
+        if hour is not in range (0 to 11)
+        if minute is not in range (0 to 59)
+        if seconds in minute not in range (0 to 59)
+        if seconds in day not in range (0 to 86399)
+        if the interval is invalid
+
+
+ ---------------------- OCIIntervalGetDaySecond -------------------- 
+
+  DESCRIPTION
+     Gets values of day second interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (OUT) - number of days
+        hour    (OUT) - number of hours
+        min     (OUT) - number of mins
+        sec     (OUT) - number of secs
+        fsec    (OUT) - number of fractional seconds
+        result     (IN)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalGetYearMonth -------------------- 
+
+  DESCRIPTION
+     Gets year month from an interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        year    (OUT)   - year value
+        month   (OUT)   - month value
+        result     (IN)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+
+-------------------------- OCIIntervalAdd ------------------------------
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1, 
+                        OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals 
+PARAMETERS
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+addend1  (IN)   - Interval to be added 
+addend2  (IN)   - Interval to be added 
+result   (OUT)  - resulting interval (addend1 + addend2) 
+DESCRIPTION
+     Adds two intervals to produce a resulting interval
+RETURNS
+     OCI_SUCCESS on success
+     OCI_ERROR if:
+        the two input intervals are not mutually comparable.
+        the resulting year would go above SB4MAXVAL
+        the resulting year would go below SB4MINVAL
+     OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+     The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract ------------------------------- 
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend, 
+                            OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+minuend    (IN)   - interval to be subtracted from 
+subtrahend (IN)   - interval subtracted from minuend 
+result     (OUT)  - resulting interval (minuend - subtrahend) 
+DESCRIPTION
+     Subtracts two intervals and stores the result in an interval
+RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if:
+           the two input intervals are not mutually comparable.
+           the resulting leading field would go below SB4MINVAL 
+           the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply --------------------------------- 
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                        OCINumber *nfactor, OCIInterval *result );
+
+  DESCRIPTION
+     Multiplies an interval by an Oracle Number to produce an interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter  (IN)   - Interval to be multiplied 
+     nfactor  (IN)   - Oracle Number to be multiplied 
+     result   (OUT)  - resulting interval (ifactor * nfactor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if:
+        the resulting year would go above SB4MAXVAL
+        the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond -------------------- 
+
+  DESCRIPTION
+     Sets day second interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (IN) - number of days
+        hour    (IN) - number of hours
+        min     (IN) - number of mins
+        sec     (IN) - number of secs
+        fsec    (IN) - number of fractional seconds
+        result     (OUT)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalSetYearMonth -------------------- 
+
+  DESCRIPTION
+     Sets year month interval
+  PARAMETERS
+        hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        year    (IN)   - year value
+        month   (IN)   - month value
+        result     (OUT)  - resulting interval 
+  RETURNS
+        OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+----------------------- OCIIntervalToNumber ---------------------------------
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                          OCINumber *number);
+
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inter - Interval to be converted 
+    (OUT) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_SUCCESS on success 
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+------------------------------- OCIIntervalToText -------------------------
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                        ub1 lfprec, ub1 fsprec, OraText *buffer, 
+                        size_t buflen, size_t *resultlen );
+
+  DESCRIPTION
+    Given an interval, produces a string representing the interval.
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inter - Interval to be converted 
+    (IN)  lfprec  - Leading field precision. Number of digits used to
+                represent the leading field.
+    (IN)  fsprec  - Fractional second precision of the interval. Number of
+                digits used to represent the fractional seconds.
+    (OUT) buffer - buffer to hold result 
+    (IN)  buflen - length of above buffer 
+    (OUT) resultlen - length of result placed into buffer 
+ 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR 
+        if the buffer is not large enough to hold the result
+  NOTES
+    The interval literal will be output as `year' or `[year-]month' for
+    YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+    `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+    DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ---------------------- OCIIntervalFromTZ -------------------- 
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+                        size_t str_len, OCIInterval *result);
+
+  DESCRIPTION
+    Retuns an OCI_DTYPE_INTERVAL_DS OCIInterval with the region id (if
+    the region is specified in the input string) set and the current
+    absolute offset or an absolut offset with the region id set to 0.
+  PARAMETERS
+    hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    inpstring (IN) - pointer to the input string
+    str_len (IN) - inpstring length
+    result - Output Interval 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR on error
+        Bad interval type
+        Timezone errors
+  NOTES
+     The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+ ----------------------- OCIKerbAttrSet ---------------------
+sword OCIKerbAttrSet(OCISession *trgthndlp, ub4 auth_mode, 
+                     ub1 *ftgt_ticket, ub4 ftgt_ticket_len, 
+                     ub1 *ftgt_sesskey, ub4 ftgt_sesskey_len, 
+                     ub2 ftgt_keytype, ub4 ftgt_ticket_flags, 
+                     sb4 ftgt_auth_time, sb4 ftgt_start_time, 
+                     sb4 ftgt_end_time, sb4 ftgt_renew_time, 
+                     text *ftgt_principal, ub4 ftgt_principal_len,
+                     text *ftgt_realm, ub4 ftgt_realm_len, 
+                     OCIError *errhp);
+
+  DESCRIPTION
+    This call sets the attributes required for Kerberos authentication
+    on the user handle.
+
+  PARAMETERS
+    trgthndlp (IN) - The pointer to a user handle.
+    auth_mode (IN) - Indicates what type of Kerberos credentials should
+                    be set. Options are:
+
+                    OCI_KERBCRED_PROXY 
+                                         - Set Kerberos credentials for use with
+                                           proxy authentication.
+                    OCI_KERBCRED_CLIENT_IDENTIFIER 
+                                         - Set Kerberos credentials for use
+                                           with secure client identifier.
+
+    ftgt_ticket (IN) - Forwardable Ticket Granting Ticket (FTGT).
+    ftgt_ticket_len (IN) - Length of FTGT.
+    ftgt_sesskey(IN) - Session Key associated with FTGT.
+    ftgt_sesskey_len (IN) - Length of session key.
+    ftgt_keytype (IN) -  Type of encryption key used to encrypt FTGT.
+    ftgt_ticket_flags (IN) - Flags associated with  encryption of FTGT.
+    ftgt_auth_time (IN) - Authentication time compatible with that in FTGT.
+    ftgt_start_time (IN) - Start time compatible with that indicated in FTGT.
+    ftgt_end_time (IN) - End time compatible with that indicated in FTGT.
+    ftgt_renew_time (IN) - Renew time compatible with that indicated in FTGT.
+    ftgt_principal (IN) - Client principal name from FTGT.
+    ftgt_principal_len (IN) - Length of client principal name.
+    ftgt_realm (IN) - Client realm name from FTGT.
+    ftgt_realm_len (IN) - Client realm name length.
+    errhp (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_ERROR on error
+  NOTES
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx  **svchpp,
+                     OCIError   *errhp,
+                     Lda_Def    *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call 
+can be reversed by passing the resulting service context handle to the 
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from 
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB. 
+
+Syntax
+sword OCILobAppend ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is 
+copied from the source to the destination at the end of the destination. The 
+source and the destination must already exist. The destination LOB is 
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv                *envhp, 
+                     OCIError              *errhp, 
+                     CONST OCILobLocator   *src_locp, 
+                     OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv                    *envhp, 
+                          OCIError                  *errhp, 
+                          CONST OCILobLocator       *locp, 
+                          ub1                       *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator.  If the input 
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept 
+of a character set for binary LOBs/FILEs.  The caller must allocate space for 
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv                    *envhp, 
+                        OCIError                  *errhp, 
+                        CONST OCILobLocator       *locp, 
+                        ub2                       *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator.  If the input locator 
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a 
+character set for binary LOBs/FILEs.  The caller must allocate space for the 
+character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp,
+                   ub4              amount,
+                   ub4              dst_offset,
+                   ub4              src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data 
+is copied from the source to the destination. The source (src_locp) and the 
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+Comments
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB, 
+               OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)-  TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one 
+              of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+              Note: OCI_DURATION_TRANSACTION is NOT supported in 8.1
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+Comments
+
+Disable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used.  Note that this call does *not*
+implicitly flush the changes made in the buffering subsystem.  The 
+user must explicitly call OCILobFlushBuffer() to do this.
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlushBuffer()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx      *svchp,
+                              OCIError       *errhp,
+                              OCILobLocator  *locp);
+
+Comments
+
+Enable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.  
+
+Once lob buffering is enabled for a locator, if that locator is passed to 
+one of the following routines, an error is returned:
+        OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlushBuffer()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx       *svchp,
+                  OCIError        *errhp,
+                  OCILobLocator   *locp,
+                  ub4             *amount,
+                  ub4             offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number 
+of characters/bytes and the requested number of characters/bytes will differ 
+if the end of the LOB data is reached before erasing the requested number of 
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is 
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT, 
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which 
+to start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+
+Purpose
+Opens an internal or external Lob.
+
+Syntax
+sword OCILobOpen( OCISvcCtx        *svchp,
+                  OCIError         *errhp,
+                  OCILobLocator    *locp,
+                  ub1               mode );
+
+Comments
+It is an error if the same lob is opened more than once in
+the same transaction. Lobs are opened implicitly if they are
+not opened before using them. A LOB has to be closed before
+the transaction commits else the transaction is rolled back.
+Open locators are closed if the transaction aborts. Multiple 
+users can open the same lob on different locators.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - locator points to the LOB to be opened
+mode (IN) - mode in which to open the lob. The valid modes are
+read-only - OCI_FILE_READONLY, read-write - OCI_FILE_READWRITE 
+
+OCILobClose()
+
+Name
+OCI Lob Close
+
+Purpose
+Closes an open internal or external Lob.
+
+Syntax
+sword OCILobClose( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp );
+
+
+Comments
+It is an error if the lob is not open at this time. All LOBs
+that have been opened in a transaction have to be closed 
+before the transaction commits, else the transaction gets
+rolled back.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp  (IN)  - A locator that was opened using OCILobOpen()
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx            *svchp,
+                        OCIError             *errhp,
+                        OCILobLocator        *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp, 
+                           OCIError  *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx     *svchp,
+                         OCIError      *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, 
+it is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv                   *envhp,
+                          OCIError                 *errhp, 
+                          CONST OCILobLocator      *filep, 
+                          OraText                     *dir_alias,
+                          ub2                      *d_length, 
+                          OraText                     *filename, 
+                          ub2                      *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.  
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in 
+errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The 
+caller must allocate enough space for the directory alias name and must not 
+write into the space.
+d_length (IN/OUT)                 
+        - IN: length of the input dir_alias string;
+        - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must 
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT) 
+        - IN: length of the input filename string;
+         - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+                         OCIError  *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file 
+locator was never passed to OCILobFileOpen(), the file is considered not to 
+be opened by this locator. However, a different locator may have opened the 
+file. More than one file opens can be performed on the same file using 
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if 
+it is not. 
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE 
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx            *svchp,
+                     OCIError             *errhp,
+                     OCILobLocator        *filep,
+                     ub1                  mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not 
+be written to throough ORACLE.
+
+Parameters 
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a 
+FILE. 
+mode (IN) - mode in which to open the file. The only valid mode is 
+read-only - OCI_FILE_READONLY. 
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen, 
+OCILobFileSetName, CREATE DIRECTORY 
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv             *envhp,
+                          OCIError           *errhp,
+                          OCILobLocator      **filepp,
+                          OraText               *dir_alias,
+                          ub2                d_length, 
+                          OraText               *filename, 
+                          ub2                f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.  
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by calling
+OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the 
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx       *svchp,
+                          OCIError        *errhp,
+                          OCILobLocator   *locp,
+                          ub4              flag);
+
+Comments
+
+Flushes to the server, changes made to the buffering subsystem that 
+are associated with the lob referenced by the input locator.  This 
+routine will actually write the data in the buffer to the lob in 
+the database.  Lob buffering must have already been enabled for the 
+input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+flag    (IN)     - to indicate if the buffer resources need to be freed
+                   after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+                   Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+                   resources to be freed.
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp);
+
+Comments
+  Frees the contents of the temporary Lob this locator is pointing to. Note
+  that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store 
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx      *svchp,
+                           OCIError       *errhp,
+                           OCILobLocator  *locp,
+                           ub4            *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added 
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch 
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE. 
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx      *svchp,
+                        OCIError       *errhp,
+                        OCILobLocator  *locp,
+                        ub4            *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is 
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv                  *envhp,
+                      CONST OCILobLocator     *x,
+                      CONST OCILobLocator     *y,
+                      boolean                 *is_equal );
+
+Comments
+Compares the given LOB locators for equality.  Two LOB locators are equal if 
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign,
+OCILobIsOpen()
+
+Name
+
+OCI Lob Is Open
+sword OCILobIsOpen(svchp, errhp, locp, flag)
+OCISvcCtx     *svchp;
+OCIError      *errhp;
+OCILobLocator *locp;
+boolean       *flag;
+
+Comments
+   Checks if the LOB locator was opened before. flag is set to TRUE
+   if opened; FALSE otherwise 
+
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+flag(OUT) - TRUE, if the LOB locator points to is open
+                    FALSE, if not.
+
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+  Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv            *envhp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envhp (IN) - the environment handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+                    FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx        *svchp,
+                           OCIError         *errhp,
+                           OCILobLocator    *dst_locp,
+                           OCILobLocator    *src_filep,
+                           ub4              amount,
+                           ub4              dst_offset,
+                           ub4              src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as 
+specified.  The data is copied from the source file to the destination 
+internal LOB (BLOB/CLOB).  No character set conversions are performed 
+when copying the bfile data to a clob/nclob.  The bfile data must already
+be in the same character set as the clob/nclob in the database.  No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dst_locp) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal 
+LOB which may be of type blob, clob, or nclob. 
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE. 
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE.  It is 
+the number of bytes from the beginning of the LOB.  The offset starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+OCILobLocatorAssign()
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx             *svchp, 
+                            OCIError              *errhp, 
+                            CONST OCILobLocator   *src_locp, 
+                            OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv   *envhp,
+                            OCIError *errhp,
+                            CONST OCILobLocator *locp,
+                            boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized; 
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer. 
+
+Syntax
+sword OCILobRead ( OCISvcCtx       *svchp,
+                   OCIError        *errhp,
+                   OCILobLocator   *locp,
+                   ub4             offset,
+                   ub4             *amtp,
+                   dvoid           *bufp,
+                   ub4             bufl,
+                   dvoid           *ctxp,  
+                   OCICallbackLobRead cbfp,
+                   ub2             csid,
+                   ub1             csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data 
+read from a hole is returned as 0s. It is an error to try to read from a NULL
+LOB/FILE. The OS FILE must already exist on the server and must have been 
+opened using the input locator. Oracle must hav epermission to read the OS 
+file and user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in the 
+number of characters from the beginning of the LOB, for binary LOBs it is the 
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On 
+output, the actual number of bytes or characters read. 
+If the amount of bytes to be read is larger than the buffer length it is 
+assumed that the LOB is being read in a streamed mode. On input if this value 
+is 0, then the data shall be read in streamed mode from the LOB until the end 
+of LOB. If the data is read in pieces, *amtp always contains the length of 
+the last piece read.  If a callback function is defined, then this callback 
+function will be invoked each time bufl bytes are read off the pipe. Each 
+piece will be written into bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will 
+be returned. The application must invoke the LOB read over and over again to 
+read more pieces of the LOB until the OCI_NEED_DATA error code is not 
+returned. The buffer pointer and the length can be different in each call 
+if the pieces are being read into different sizes and location. 
+bufp (IN) - the pointer to a buffer into which the piece will be read. The 
+length of the allocated memory is assumed to be bufl. 
+bufl (IN) - the length of the buffer in octets. 
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If 
+this is NULL, then OCI_NEED_DATA will be returned for each piece. 
+The callback function must return OCI_CONTINUE for the read to continue. 
+If any other error code is returned, the LOB read is aborted. 
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN) - a buffer pointer for the piece.
+  len (IN) - the length of length of current piece in bufp.
+  piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or 
+  OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob  Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx       *svchp,
+                 OCIError        *errhp,
+                 OCILobLocator   *locp,
+                 ub4             newlen );
+
+Comments
+Truncates LOB data to a specified shorter length. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator 
+must be a locator that was obtained from the server specified by svchp. 
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length. 
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             offset,
+                    ub4             *amtp,
+                    dvoid           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    dvoid           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    dvoid    *ctxp,
+                                    dvoid    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to 
+the pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWrite() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in 
+the number of characters from the beginning of the LOB, for binary LOBs it 
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. 
+Even if the data is being written in pieces, bufp must contain the first 
+piece of the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in 
+a piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             *amtp,
+                    dvoid           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    dvoid           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    dvoid    *ctxp,
+                                    dvoid    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to the 
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. Even 
+if the data is being written in pieces, bufp must contain the first piece of 
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a 
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+OCILobGetStorageLimit()
+
+Name
+OCI Lob Get Storage Limit
+
+Purpose
+To get the maximum Length of a LOB in bytes that can be stored in the database.
+
+Syntax
+sword OCILobGetStorageLimit ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    oraub8          *limitp);
+
+
+Comments
+With unlimited size LOB support the limit for a LOB is no longer restricted to 4GB.
+This interface should be used to get the actual limit for storing data for a specific
+LOB locator. Note that if the compatibality is set to 9.2 or older the limit would still 
+be 4GB.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+limitp (OUT)  - The storage limit for a LOB in bytes.
+Related Functions
+
+
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx      *svchp
+                   OCIError       *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().  
+This call implicitly deallocates the server, authentication, and service 
+context handles.
+Note: For more information on logging on and off in an application, 
+refer to the section "Application Initialization, Connection, and 
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to 
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       *svchp,
+                       CONST OraText      *username,
+                       ub4             uname_len,
+                       CONST OraText      *password,
+                       ub4             passwd_len,
+                       CONST OraText      *dbname,
+                       ub4             dbname_len );
+Comments
+This function is used to create a simple logon session for an application. 
+Note: Users requiring more complex session (e.g., TP monitor 
+applications) should refer to the section "Application Initialization, 
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       **svchp,
+                       CONST OraText      *username,
+                       ub4             uname_len,
+                       CONST OraText      *password,
+                       ub4             passwd_len,
+                       CONST OraText      *dbname,
+                       ub4             dbname_len,
+                       ub4             mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to 
+OCILogon() call.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle. This call assumes that 
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+                proxy session has to be created and the required grants on 
+                the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+            using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( CONST OCIStmt   *stmhp,
+                     dvoid           *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using 
+either the default memory free function or the registered memory free 
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call 
+to OCIInitialize(). 
+This call is always successful. 
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library. 
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe 
+handle or statement handle.
+Syntax
+sword OCIParamGet ( CONST dvoid       *hndlp,
+                  ub4         htype,
+                  OCIError    *errhp,
+                  dvoid    **parmdpp,
+                  ub4         pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the 
+describe handle or statement handle. Parameter descriptors are always 
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this 
+position. 
+See Appendix B for more detailed information about parameter descriptor 
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet() 
+function will return a parameter descriptor for this handle. 
+htype (IN) - the type of the handle passed in the handle parameter. Valid 
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a 
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos 
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A 
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter 
+descriptors for this position. 
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object 
+retrieval handle.
+Syntax
+sword   OCIParamGet ( dvoid *hndlp,
+                       ub4 htyp,
+                      OCIError *errhp,
+                      CONST dvoid *dscp,
+                      ub4 dtyp,
+                      ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex 
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and 
+the descriptor must have been previously allocated using OCIDescAlloc(). 
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) - 
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx     *svchp,
+                        OCIError      *errhp,
+                        CONST OraText    *user_name,
+                        ub4           usernm_len,
+                        CONST OraText    *opasswd,
+                        ub4           opasswd_len,
+                        CONST OraText    *npasswd,
+                        sb4           npasswd_len,
+                        ub4           mode);
+Comments
+This call allows the password of an account to be changed. This call is 
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates 
+the account using the old password and then changes the 
+password to the new password
+If the user authentication is not established, it establishes a user 
+authentication and authenticates the account using the old 
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and 
+OCISessionBegin() returns an error or warning which indicates that the 
+password has expired. 
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle 
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string, 
+whose length is specified in usernm_len. This parameter must be NULL if the 
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name. 
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character 
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd. 
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character 
+string, whose length is specified in npasswd_len which must be non-zero for a 
+valid password string. If the password complexity verification routine is 
+specified in the user's profile to verify the new password's complexity, the 
+new password must meet the complexity requirements of the verification 
+function.
+npasswd_len (IN)  - then length of the new password string specified in 
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( dvoid      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call 
+had been issued while a non-blocking operation was in progress. 
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult     *rsetdp,
+                         OCIError      *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer    *srvhp,
+                      OCIError     *errhp,
+                      CONST OraText   *dblink,
+                      sb4          dblink_len,
+                      ub4          mode);
+Comments
+This call is used to create an association between an OCI application and a 
+particular server. 
+This call initializes a server context handle, which must have been previously 
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a 
+service context through a call to OCIAttrSet(). Once that association has been 
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server 
+context handles can be maintained. OCI operations are performed against 
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets 
+initialized by this call. Passing in an initialized server handle causes an 
+error. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the 
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid 
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation.  For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context 
+are made in blocking mode. 
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer   *svrhp,
+                      OCIError    *errhp,
+                      ub4         mode); 
+Comments
+This call deletes an access to data source for OCI operations, which was 
+established by a call to OCIServerAttach(). 
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to 
+uninitialized state. The handle is not de-allocated. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+mode (IN) - specifies the various modes of operation. The only valid mode is 
+OCI_DEFAULT for the default mode. 
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( dvoid        *hndlp, 
+                       OCIError     *errhp, 
+                       OraText         *bufp,
+                       ub4          bufsz
+                       ub1          hndltype );
+Comments
+This call returns the version string of the Oracle server. 
+For example, the following might be returned as the version string if your 
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx     *svchp,
+                      OCIError      *errhp,
+                      OCISession    *usrhp,
+                      ub4           credt,
+                      ub4           mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle 
+before requests can be made against it. Also, OCISessionBegin() only supports 
+authenticating the user for access to the Oracle server specified by the 
+server handle in the service context. In other words, after OCIServerAttach() 
+is called to initialize a server handle, OCISessionBegin() must be called to 
+authenticate the user for that given server. 
+When OCISessionBegin() is called for the first time for the given server 
+handle, the initialized authentication handle is called a primary 
+authentication context. A primary authentication context may not be created 
+with the OCI_MIGRATE mode. Also, only one primary authentication context can 
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication 
+context is set in a service handle with a different server handle, then an 
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary 
+authentication context is set in the service handle, OCISessionBegin() may be 
+called again to initialize another authentication handle with different (or 
+the same) credentials. When OCISessionBegin() is called with a service handle 
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication 
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode. 
+If the OCI_MIGRATE mode is not specified, then the user authentication 
+context can only ever be used with the same server handle set in svchp. If 
+OCI_MIGRATE mode is specified, then the user authentication may be set 
+with different server handles. However, the user authentication context is 
+restricted to use with only server handles which resolve to the same database 
+instance and that have equivalent primary authentication contexts. Equivalent 
+authentication contexts are those which were authenticated as the same 
+database user.
+OCI_SYSDBA, OCI_SYSOPER, and OCI_PRELIM_AUTH may only be used 
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are 
+supported. The first is to provide a valid username and password pair for 
+database authentication in the user authentication handle passed to 
+OCISessionBegin(). This involves using OCIAttrSet() to set the 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the 
+authentication handle. Then OCISessionBegin() is called with 
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using 
+OCISessionEnd(), the username and password attributes remain 
+unchanged and thus can be re-used in a future call to OCISessionBegin(). 
+Otherwise, they must be reset to new values before the next 
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No 
+attributes need to be set on the authentication handle before calling 
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent 
+to the Oracle7 `connect /' syntax. If values have been set for 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are 
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server 
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized 
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication. 
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and 
+password pair as credentials. The attributes OCI_ATTR_USERNAME 
+and OCI_ATTR_PASSWORD should be set on the authentication 
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username 
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may 
+only ever be set with the same server context specified in svchp. This 
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be 
+set in a service handle with a different server handle. This mode 
+establishes the user authentication context. 
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA 
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER 
+access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA 
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCISession      *usrhp,
+                    ub4             mode);
+
+Comments
+The user security context associated with the service context is invalidated 
+by this call. Storage for the authentication context is not freed. The 
+transaction specified by the service context is implicitly committed. The 
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server 
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL, 
+the user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx           *svchp,
+                     OCIStmt             *stmtp,
+                     OCIError            *errhp,
+                     ub4                 iters,
+                     ub4                 rowoff,
+                     CONST OCISnapshot   *snap_in,
+                     OCISnapshot         *snap_out,
+                     ub4                 mode );
+Comments
+This function  is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On 
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows 
+implicitly as a response. This description is buffered on the client side for 
+describes, fetches and define type conversions. Hence it is optimal to 
+describe a select list only after an execute. 
+Also for SELECT statements, some results are available implicitly. Rows will 
+be received and buffered at the end of the execute. For queries with small row 
+count, a prefetch causes memory to be released in the server if the end of 
+fetch is reached, an optimization that may result in memory usage reduction. 
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle 
+implicitly maintains a reference to the service context on which it is 
+executed. It is the user's responsibility to maintain the integrity of the 
+service context. If the attributes of a service context is changed for 
+executing some operations on this service context, the service context must 
+be restored to have the same attributes, that a statement was executed with, 
+prior to a fetch on the statement handle. The implicit reference is maintained 
+until the statement handle is freed or the fetch is cancelled or an end of 
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a 
+call to OCIStmtExecute(), the number of rows specified by iters will be 
+fetched directly into the defined output buffers and additional rows 
+equivalent to the prefetch count will be prefetched. If there are no 
+additional rows, then the fetch is complete without calling 
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that 
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle. 
+stmtp (IN/OUT) - an statement handle - defines the statement and the 
+associated data to be executed at the server. It is invalid to pass in a 
+statement handle that has bind of data types only supported in release 8.0 
+when srvchp points to an Oracle7 server. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. If the statement is being 
+batched and it is successful, then this handle will contain this particular 
+statement execution specific errors returned from the server when the batch is 
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select 
+statements. For Select statements, if iters is non-zero, then defines must 
+have been done for the statement handle. The execution fetches iters rows into 
+these predefined buffers and prefetches more rows depending upon the prefetch 
+row count. This function returns an error if iters=0 for non-SELECT 
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for 
+this multiple row execution. 
+snap_in (IN) - this parameter is optional. if supplied, must point to a 
+snapshot descriptor of type OCI_DTYPE_SNAP.  The contents of this descriptor 
+must be obtained from the snap_out parameter of a previous call.  The 
+descriptor is ignored if the SQL is not a SELECT.  This facility allows 
+multiple service contexts to ORACLE to see the same consistent snapshot of the 
+database's committed data.  However, uncommitted data in one context is not 
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a 
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an 
+opaque representation which is the current ORACLE "system change 
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().  
+This descriptor should not be used any longer than necessary in order to avoid 
+"snapshot too old" errors. 
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is 
+immediately executed. Error handle contains diagnostics on error if any. 
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is 
+only valid if the application has set the prefetch row count prior to this 
+call. In this mode, the OCI library will get up to the number of rows 
+specified (i.e., prefetch row count plus iters). If the number of rows 
+returned by the query is greater than this value, OCI_ERROR will be 
+returned with ORA-01422 as the implementation specific error in a 
+diagnostic record. If the number of rows returned by the query is 
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will 
+be returned with ORA-01403 as the implementation specific error. The 
+prefetch buffer size is ignored and the OCI library tries to allocate all the 
+space required to contain the prefetched rows. The exact fetch semantics 
+apply to only the top level rows. No more rows can be fetched for this 
+query at the end of the call. 
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this 
+statement executed in this transaction will be maintained when the 
+transaction is detached for migration. By default, a query is cancelled 
+when a transaction is detached for migration. This mode is the default 
+mode when connected to a V7 server. 
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is 
+OCI_FETCH_NEXT, which is also the default value. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         scrollOffset,
+                   ub4         mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the 
+addition of the fetchOffset parameter. It can be used on any 
+statement handle, whether it is scrollable or not. For a 
+non-scrollable statement handle, the only acceptable value 
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be 
+ignored. Applications are encouraged to use this new call. 
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to 
+OCI_FETCH_CURRENT with a value of 0, is equivalent to 
+OCI_FETCH_NEXT with a value of 1, and equivalent to 
+OCI_FETCH_PRIOR with a value of -1. Note that the range of 
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an 
+error could be raised if sufficient rows do not exist in 
+
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) -  The acceptable values are as follows, with 
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row, 
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set, 
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set, 
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and 
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is 
+ignored for non-scrollable result sets. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( CONST OCIStmt  *stmtp,
+                         OCIError       *errhp,
+                         dvoid          **hndlpp,
+                         ub4            *typep,
+                         ub1            *in_outp,
+                         ub4            *iterp, 
+                         ub4            *idxp,
+                         ub1            *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a 
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the 
+relevant information: bind/define handle, iteration or index number and 
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page 
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or 
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND 
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind 
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind 
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values - 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and 
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     CONST OraText   *stmt, 
+                     ub4          stmt_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The 
+OCIStmtPrepare() call defines an application request. 
+This is a purely local call. Data values for this statement initialized in 
+subsequent bind calls will be stored in a bind handle which will hang off this 
+statement handle.
+This call does not create an association between this statement handle and any 
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information 
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-terminated 
+string. The pointer to the OraText of the statement must be available as long 
+as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server. 
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode. 
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI 
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+                     OCIStmt      **stmtp,
+                     OCIError     *errhp,
+                     CONST OraText   *stmt,
+                     ub4          stmt_len,
+                     CONST OraText *key,
+                     ub4          key_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect.It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+             this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+              and prepared  statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+            terminated string. The pointer to the OraText of the statement 
+            must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+               caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     cONST OraText *key,
+                     ub4          key_len,
+                     ub4          mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+               caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+            OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( dvoid             *hndlp,
+                          ub4               type,
+                          OCIError          *errhp,
+                          CONST dvoid       *bufp,
+                          ub4               *alenp, 
+                          ub1               piece,
+                          CONST dvoid       *indp, 
+                          ub2               *rcodep ); 
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT 
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the 
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or 
+the piece when it is an IN bind variable, otherwise bufp is a pointer to 
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value. 
+piece (IN) - the piece parameter. The following are valid values: 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or 
+OCI_LAST_PIECE. 
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind 
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator 
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp 
+is either an sb2 or a dvoid * depending upon the data type.
+rcodep (IN/OUT) - return code. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      CONST OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use.  When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl         (IN/OUT) - OCI environment or session handle
+err          (IN/OUT) - OCI error handle
+buffer       (OUT)    - text buffer for the string
+bufferLength (IN)     - length of the text buffer
+returnLength (OUT)    - length of the formatted string
+formatString (IN)     - format specification string
+...          (IN)     - variable argument list
+Related Functions
+
+
+OCIFormatTerm 
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package dvoid Type
+Purpose
+Return the type value for the dvoid type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx    *srvhp,
+                     OCIError     *errhp,
+                     Lda_Def      *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly 
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in 
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server 
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to 
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized 
+by this call. 
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags );
+Comments
+The transaction currently associated with the service context is committed. If 
+it is a distributed transaction that the server cannot commit, this call 
+additionally retrieves the state of the transaction from the database to be 
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates 
+on the transaction currently associated with the service context. If the 
+application is working with only the implicit local transaction created when 
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated 
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed 
+transactions. If the transaction is non-distributed, the flags parameter is 
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications 
+managing global transactions should pass a value of 
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The 
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status 
+indicating that the transaction has either been committed or rolled back. With 
+distributed transactions, it is possible that the transaction is now in-doubt 
+(i.e., neither committed nor aborted). In this case, OCITransCommit() 
+attempts to retrieve the status of the transaction from the server. 
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction 
+currently attached to the service context handle becomes inactive at the end 
+of this call. The transaction may be resumed later by calling OCITransStart(), 
+specifying  a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout 
+parameter of OCITransStart() when the transaction was started is used to 
+determine the amount of time the branch can remain inactive before being 
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one 
+that detached it, provided that the transaction has the same 
+authorization.
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx     *svchp, 
+                     OCIError      *errhp,
+                     ub4           flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the 
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the 
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+OCITransMultiPrepare() 
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx    *svchp,
+                             ub4           numBranches,
+                             OCITrans     **txns,
+                             OCIError     **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction. 
+Parameters
+srvcp (IN) - the service context handle. 
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx    *svchp, 
+                      OCIError     *errhp,
+                      ub4          flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made 
+any changes. The error handle will indicate that the transaction is read-only. 
+The flag parameter is not currently used. 
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( dvoid        *svchp, 
+                       OCIError     *errhp,
+                       ub4          flags );
+Comments
+The current transaction- defined as the set of statements executed since the 
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated 
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction 
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the 
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx    *svchp, 
+                    OCIError     *errhp, 
+                    uword        timeout,
+                    ub4          flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The 
+transaction context currently associated with the service context handle is 
+initialized at the end of the call if the flags parameter specifies that a new 
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle 
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the 
+service context handle is initialized at the end of the call if the flag 
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+err and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become 
+available for resumption when OCI_TRANS_RESUME is specified. When 
+OCI_TRANS_NEW is specified, this value is stored and may be used later by 
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an 
+existing transaction is being resumed. Also specifies serializiability or 
+read-only status. More than a single value can be specified. By default, 
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a 
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch. 
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+
+
+
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+ 
+ 
+typedef sb4 (*OCICallbackInBind)(dvoid *ictxp, OCIBind *bindp, ub4 iter,
+                                  ub4 index, dvoid **bufpp, ub4 *alenp,
+                                  ub1 *piecep, dvoid **indp);
+ 
+typedef sb4 (*OCICallbackOutBind)(dvoid *octxp, OCIBind *bindp, ub4 iter,
+                                 ub4 index, dvoid **bufpp, ub4 **alenp,
+                                 ub1 *piecep, dvoid **indp,
+                                 ub2 **rcodep);
+ 
+typedef sb4 (*OCICallbackDefine)(dvoid *octxp, OCIDefine *defnp, ub4 iter,
+                                 dvoid **bufpp, ub4 **alenp, ub1 *piecep,
+                                 dvoid **indp, ub2 **rcodep);
+
+typedef sword (*OCIUserCallback)(dvoid *ctxp, dvoid *hndlp, ub4 type,
+                                 ub4 fcode, ub4 when, sword returnCode,
+                                 sb4 *errnop, va_list arglist);
+
+typedef sword (*OCIEnvCallbackType)(OCIEnv *env, ub4 mode,
+                                   size_t xtramem_sz, dvoid *usrmemp,
+                                   OCIUcb *ucbDesc); 
+
+typedef sb4 (*OCICallbackLobRead)(dvoid *ctxp, CONST dvoid *bufp,
+                                             ub4 len, ub1 piece);
+
+typedef sb4 (*OCICallbackLobWrite)(dvoid *ctxp, dvoid *bufp, 
+                                          ub4 *lenp, ub1 *piece);
+
+#ifdef ORAXB8_DEFINED
+
+typedef sb4 (*OCICallbackLobRead2)(dvoid *ctxp, CONST dvoid *bufp, oraub8 len,
+                                   ub1 piece, dvoid **changed_bufpp,
+                                   oraub8 *changed_lenp);
+
+typedef sb4 (*OCICallbackLobWrite2)(dvoid *ctxp, dvoid *bufp, oraub8 *lenp,
+                                    ub1 *piece, dvoid **changed_bufpp,
+                                    oraub8 *changed_lenp);
+#endif
+
+typedef sb4 (*OCICallbackAQEnq)(dvoid *ctxp, dvoid **payload, 
+                                dvoid **payload_ind);
+
+typedef sb4 (*OCICallbackAQDeq)(dvoid *ctxp, dvoid **payload, 
+                                dvoid **payload_ind);
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(dvoid *svcctx, dvoid *envctx,
+                                   dvoid *fo_ctx, ub4 fo_type,
+                                   ub4 fo_event);
+
+typedef struct
+{
+  OCICallbackFailover callback_function;
+  dvoid *fo_ctx;
+} 
+OCIFocbkStruct;
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+sword   OCIInitialize   (ub4 mode, dvoid *ctxp, 
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr) );
+
+sword   OCITerminate( ub4 mode);
+
+sword   OCIEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp);
+
+sword   OCIEnvNlsCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp,
+                 ub2 charset, ub2 ncharset);
+
+sword   OCIFEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp, dvoid *fupg);
+
+sword   OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, CONST ub4 type, 
+                       CONST size_t xtramem_sz, dvoid **usrmempp);
+
+sword   OCIHandleFree(dvoid *hndlp, CONST ub4 type);
+
+
+sword   OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp, 
+                           CONST ub4 type, CONST size_t xtramem_sz, 
+                           dvoid **usrmempp);
+
+sword   OCIDescriptorFree(dvoid *descp, CONST ub4 type);
+
+sword   OCIEnvInit (OCIEnv **envp, ub4 mode, 
+                    size_t xtramem_sz, dvoid **usrmempp);
+
+sword   OCIServerAttach  (OCIServer *srvhp, OCIError *errhp,
+                          CONST OraText *dblink, sb4 dblink_len, ub4 mode);
+
+sword   OCIServerDetach  (OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+sword   OCISessionBegin  (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+                          ub4 credt, ub4 mode);
+
+sword   OCISessionEnd   (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, 
+                         ub4 mode);
+
+sword   OCILogon (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, 
+                  CONST OraText *username, ub4 uname_len, 
+                  CONST OraText *password, ub4 passwd_len, 
+                  CONST OraText *dbname, ub4 dbname_len);
+
+sword   OCILogon2 (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                  CONST OraText *username, ub4 uname_len,
+                  CONST OraText *password, ub4 passwd_len,
+                  CONST OraText *dbname, ub4 dbname_len,
+                  ub4 mode);
+
+sword   OCILogoff (OCISvcCtx *svchp, OCIError *errhp);
+
+
+sword   OCIPasswordChange   (OCISvcCtx *svchp, OCIError *errhp, 
+                             CONST OraText *user_name, ub4 usernm_len, 
+                             CONST OraText *opasswd, ub4 opasswd_len, 
+                             CONST OraText *npasswd, ub4 npasswd_len, 
+                             ub4 mode);
+
+sword   OCIStmtPrepare   (OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+                          ub4 stmt_len, ub4 language, ub4 mode);
+
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+                     CONST OraText *stmt, ub4 stmt_len, CONST OraText *key,
+                     ub4 key_len, ub4 language, ub4 mode);
+
+sword OCIStmtRelease ( OCIStmt *stmtp, OCIError *errhp, CONST OraText *key,
+                       ub4 key_len, ub4 mode);
+
+sword   OCIBindByPos  (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+                       ub4 position, dvoid *valuep, sb4 value_sz,
+                       ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+                       ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   OCIBindByName   (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+                         CONST OraText *placeholder, sb4 placeh_len, 
+                         dvoid *valuep, sb4 value_sz, ub2 dty, 
+                         dvoid *indp, ub2 *alenp, ub2 *rcodep, 
+                         ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   OCIBindObject  (OCIBind *bindp, OCIError *errhp, CONST OCIType *type, 
+                        dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, 
+                        ub4 *indszp);
+
+sword   OCIBindDynamic   (OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+                          OCICallbackInBind icbfp, dvoid *octxp,
+                          OCICallbackOutBind ocbfp);
+
+sword   OCIBindArrayOfStruct   (OCIBind *bindp, OCIError *errhp, 
+                                ub4 pvskip, ub4 indskip,
+                                ub4 alskip, ub4 rcskip);
+
+sword   OCIStmtGetPieceInfo   (OCIStmt *stmtp, OCIError *errhp, 
+                               dvoid **hndlpp, ub4 *typep,
+                               ub1 *in_outp, ub4 *iterp, ub4 *idxp, 
+                               ub1 *piecep);
+
+sword   OCIStmtSetPieceInfo   (dvoid *hndlp, ub4 type, OCIError *errhp, 
+                               CONST dvoid *bufp, ub4 *alenp, ub1 piece, 
+                               CONST dvoid *indp, ub2 *rcodep);
+
+sword   OCIStmtExecute  (OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, 
+                         ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in, 
+                         OCISnapshot *snap_out, ub4 mode);
+
+sword   OCIDefineByPos  (OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+                         ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+                         dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+sword   OCIDefineObject  (OCIDefine *defnp, OCIError *errhp, 
+                          CONST OCIType *type, dvoid **pgvpp, 
+                          ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+sword   OCIDefineDynamic   (OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+                            OCICallbackDefine ocbfp);
+
+sword   OCIRowidToChar  (OCIRowid *rowidDesc, OraText *outbfp, ub2 *outbflp,
+                         OCIError *errhp);
+
+sword   OCIDefineArrayOfStruct  (OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+                                 ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+sword   OCIStmtFetch   (OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+                        ub2 orientation, ub4 mode);
+
+sword   OCIStmtFetch2   (OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+                        ub2 orientation, sb4 scrollOffset, ub4 mode);
+
+sword   OCIStmtGetBindInfo   (OCIStmt *stmtp, OCIError *errhp, ub4 size, 
+                              ub4 startloc,
+                              sb4 *found, OraText *bvnp[], ub1 bvnl[],
+                              OraText *invp[], ub1 inpl[], ub1 dupl[],
+                              OCIBind **hndl);
+
+sword   OCIDescribeAny  (OCISvcCtx *svchp, OCIError *errhp, 
+                         dvoid *objptr, 
+                         ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+                         ub1 objtyp, OCIDescribe *dschp);
+
+sword   OCIParamGet (CONST dvoid *hndlp, ub4 htype, OCIError *errhp, 
+                     dvoid **parmdpp, ub4 pos);
+
+sword   OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+                    ub4 dtyp, ub4 pos);
+
+sword   OCITransStart  (OCISvcCtx *svchp, OCIError *errhp, 
+                        uword timeout, ub4 flags );
+
+sword   OCITransDetach  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+sword   OCITransCommit  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransRollback  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransPrepare (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransMultiPrepare (OCISvcCtx *svchp, ub4 numBranches, 
+                              OCITrans **txns, OCIError **errhp);
+
+sword   OCITransForget (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCIErrorGet   (dvoid *hndlp, ub4 recordno, OraText *sqlstate,
+                       sb4 *errcodep, OraText *bufp, ub4 bufsiz, ub4 type);
+
+sword   OCILobAppend  (OCISvcCtx *svchp, OCIError *errhp, 
+                       OCILobLocator *dst_locp,
+                       OCILobLocator *src_locp);
+
+sword   OCILobAssign (OCIEnv *envhp, OCIError *errhp, 
+                      CONST OCILobLocator *src_locp, 
+                      OCILobLocator **dst_locpp);
+
+sword   OCILobCharSetForm (OCIEnv *envhp, OCIError *errhp, 
+                           CONST OCILobLocator *locp, ub1 *csfrm);
+
+sword   OCILobCharSetId (OCIEnv *envhp, OCIError *errhp, 
+                         CONST OCILobLocator *locp, ub2 *csid);
+
+sword   OCILobCopy (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+                    OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, 
+                    ub4 src_offset);
+
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+sword OCILobClose( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp );
+
+
+sword   OCILobDisableBuffering (OCISvcCtx      *svchp,
+                                OCIError       *errhp,
+                                OCILobLocator  *locp);
+
+sword   OCILobEnableBuffering (OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+sword   OCILobErase (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      ub4 *amount, ub4 offset);
+
+sword   OCILobFileClose (OCISvcCtx *svchp, OCIError *errhp, 
+                         OCILobLocator *filep);
+
+sword   OCILobFileCloseAll (OCISvcCtx *svchp, OCIError *errhp);
+
+sword   OCILobFileExists (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *filep,
+                          boolean *flag);
+
+sword   OCILobFileGetName (OCIEnv *envhp, OCIError *errhp, 
+                           CONST OCILobLocator *filep, 
+                           OraText *dir_alias, ub2 *d_length, 
+                           OraText *filename, ub2 *f_length);
+
+sword   OCILobFileIsOpen (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *filep,
+                          boolean *flag);
+
+sword   OCILobFileOpen (OCISvcCtx *svchp, OCIError *errhp, 
+                        OCILobLocator *filep,
+                        ub1 mode);
+
+sword   OCILobFileSetName (OCIEnv *envhp, OCIError *errhp, 
+                           OCILobLocator **filepp, 
+                           CONST OraText *dir_alias, ub2 d_length, 
+                           CONST OraText *filename, ub2 f_length);
+
+sword   OCILobFlushBuffer (OCISvcCtx       *svchp,
+                           OCIError        *errhp,
+                           OCILobLocator   *locp,
+                           ub4              flag);
+
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp);
+
+sword OCILobGetChunkSize(OCISvcCtx         *svchp,
+                         OCIError          *errhp,
+                         OCILobLocator     *locp,
+                         ub4               *chunksizep);
+
+sword   OCILobGetLength  (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp,
+                          ub4 *lenp);
+
+sword   OCILobIsEqual  (OCIEnv *envhp, CONST OCILobLocator *x, 
+                        CONST OCILobLocator *y, 
+                        boolean *is_equal);
+
+sword OCILobIsOpen( OCISvcCtx     *svchp,
+                    OCIError      *errhp,
+                    OCILobLocator *locp,
+                    boolean       *flag);
+
+sword OCILobIsTemporary(OCIEnv            *envp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+sword   OCILobLoadFromFile (OCISvcCtx *svchp, OCIError *errhp, 
+                            OCILobLocator *dst_locp,
+                            OCILobLocator *src_filep, 
+                            ub4 amount, ub4 dst_offset, 
+                            ub4 src_offset);
+
+sword   OCILobLocatorAssign  (OCISvcCtx *svchp, OCIError *errhp, 
+                            CONST OCILobLocator *src_locp, 
+                            OCILobLocator **dst_locpp);
+
+
+sword   OCILobLocatorIsInit (OCIEnv *envhp, OCIError *errhp, 
+                             CONST OCILobLocator *locp, 
+                             boolean *is_initialized);
+
+sword   OCILobOpen( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp,
+                   ub1               mode );
+ 
+sword   OCILobRead  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, dvoid *ctxp,
+                     OCICallbackLobRead cbfp, ub2 csid, ub1 csfrm);
+
+sword   OCILobTrim  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     ub4 newlen);
+
+sword   OCILobWrite  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, ub1 piece,
+                      dvoid *ctxp, OCICallbackLobWrite cbfp, ub2 csid,
+                      ub1 csfrm);
+
+sword OCILobWriteAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp,
+                        ub4 *amtp, dvoid *bufp, ub4 bufl, ub1 piece, dvoid *ctxp,
+                        OCICallbackLobWrite cbfp, ub2 csid, ub1 csfrm);
+
+sword   OCIBreak (dvoid *hndlp, OCIError *errhp);
+
+sword   OCIReset (dvoid *hndlp, OCIError *errhp);
+
+sword   OCIServerVersion  (dvoid *hndlp, OCIError *errhp, OraText *bufp, 
+                           ub4 bufsz,
+                           ub1 hndltype);
+
+sword   OCIServerRelease  (dvoid *hndlp, OCIError *errhp, OraText *bufp,
+                           ub4 bufsz,
+                           ub1 hndltype, ub4 *version);
+
+sword   OCIAttrGet (CONST dvoid *trgthndlp, ub4 trghndltyp, 
+                    dvoid *attributep, ub4 *sizep, ub4 attrtype, 
+                    OCIError *errhp);
+
+sword   OCIAttrSet (dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+                    ub4 size, ub4 attrtype, OCIError *errhp);
+
+sword   OCISvcCtxToLda (OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+sword   OCILdaToSvcCtx (OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+sword   OCIResultSetToStmt (OCIResult *rsetdp, OCIError *errhp);
+
+sword OCIFileClose ( dvoid  *hndl, OCIError *err, OCIFileObject *filep );
+
+sword   OCIUserCallbackRegister(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+                                    OCIUserCallback callback, dvoid *ctxp,
+                                    ub4 fcode, ub4 when, OCIUcb *ucbDesc);
+
+sword   OCIUserCallbackGet(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+                               ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+                               dvoid **ctxpp, OCIUcb *ucbDesc);
+
+sword   OCISharedLibInit(dvoid *metaCtx, dvoid *libCtx, ub4 argfmt, sword argc,
+                         dvoid **argv, OCIEnvCallbackType envCallback);
+
+sword OCIFileExists ( dvoid  *hndl, OCIError *err, OraText *filename,
+                     OraText *path, ub1 *flag  );
+
+sword OCIFileFlush( dvoid *hndl, OCIError *err, OCIFileObject *filep  );
+
+
+sword OCIFileGetLength( dvoid *hndl, OCIError *err, OraText *filename,
+                        OraText *path, ubig_ora *lenp  );
+
+sword OCIFileInit ( dvoid *hndl, OCIError *err );
+
+sword OCIFileOpen ( dvoid *hndl, OCIError *err, OCIFileObject **filep,
+                    OraText *filename, OraText *path, ub4 mode, ub4 create, 
+                    ub4 type );
+
+sword OCIFileRead ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+                    dvoid *bufp, ub4 bufl, ub4 *bytesread );
+
+sword OCIFileSeek ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+                     uword origin, ubig_ora offset, sb1 dir );
+
+sword OCIFileTerm ( dvoid *hndl, OCIError *err );
+
+
+sword OCIFileWrite ( dvoid *hndl, OCIError *err, OCIFileObject   *filep,
+                     dvoid *bufp, ub4 buflen, ub4 *byteswritten );
+
+
+#ifdef ORAXB8_DEFINED
+
+sword   OCILobCopy2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+                     OCILobLocator *src_locp, oraub8 amount, oraub8 dst_offset, 
+                     oraub8 src_offset);
+
+sword   OCILobErase2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      oraub8 *amount, oraub8 offset);
+
+sword   OCILobGetLength2 (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp, oraub8 *lenp);
+
+sword   OCILobLoadFromFile2 (OCISvcCtx *svchp, OCIError *errhp, 
+                             OCILobLocator *dst_locp,
+                             OCILobLocator *src_filep, 
+                             oraub8 amount, oraub8 dst_offset, 
+                             oraub8 src_offset);
+
+sword   OCILobRead2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset,
+                     dvoid *bufp, oraub8 bufl, ub1 piece, dvoid *ctxp,
+                     OCICallbackLobRead2 cbfp, ub2 csid, ub1 csfrm);
+
+sword   OCILobTrim2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     oraub8 newlen);
+
+sword   OCILobWrite2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      oraub8 *byte_amtp, oraub8 *char_amtp, oraub8 offset,
+                      dvoid *bufp, oraub8 buflen, ub1 piece, dvoid *ctxp, 
+                      OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobWriteAppend2 (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp,
+                          oraub8 *byte_amtp, oraub8 *char_amtp, dvoid *bufp,
+                          oraub8 bufl, ub1 piece, dvoid *ctxp,
+                          OCICallbackLobWrite2 cbfp, ub2 csid, ub1 csfrm);
+
+sword OCILobGetStorageLimit (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *lobp, oraub8 *limitp);
+
+#endif
+
+/*
+ ** Initialize the security package
+ */
+sword   OCISecurityInitialize (OCISecurity *sechandle, OCIError *error_handle);
+
+sword   OCISecurityTerminate (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityOpenWallet(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            size_t wrllen,
+                            OraText *wallet_resource_locator,
+                            size_t pwdlen,
+                            OraText *password,
+                            nzttWallet *wallet);
+
+sword OCISecurityCloseWallet(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttWallet *wallet);
+
+sword OCISecurityCreateWallet(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              size_t wrllen,
+                              OraText *wallet_resource_locator,
+                              size_t pwdlen,
+                              OraText *password,
+                              nzttWallet *wallet);
+
+sword OCISecurityDestroyWallet(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               size_t wrllen,
+                               OraText *wallet_resource_locator,
+                               size_t pwdlen,
+                               OraText *password);
+
+sword OCISecurityStorePersona(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona **persona,
+                              nzttWallet *wallet);
+
+sword OCISecurityOpenPersona(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttPersona *persona);
+
+sword OCISecurityClosePersona(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona);
+
+sword OCISecurityRemovePersona(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona **persona);
+
+sword OCISecurityCreatePersona(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttIdentType identity_type,
+                               nzttCipherType cipher_type,
+                               nzttPersonaDesc *desc,
+                               nzttPersona **persona);
+
+sword OCISecuritySetProtection(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               nzttcef crypto_engine_function,
+                               nztttdufmt data_unit_format,
+                               nzttProtInfo *protection_info);
+
+sword OCISecurityGetProtection(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               nzttcef crypto_engine_function,
+                               nztttdufmt * data_unit_format_ptr,
+                               nzttProtInfo *protection_info);
+
+sword OCISecurityRemoveIdentity(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttIdentity **identity_ptr);
+
+sword OCISecurityCreateIdentity(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttIdentType type,
+                                nzttIdentityDesc *desc,
+                                nzttIdentity **identity_ptr);
+
+sword OCISecurityAbortIdentity(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttIdentity **identity_ptr);
+
+sword OCISecurityFreeIdentity(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttIdentity **identity_ptr);
+
+
+sword OCISecurityStoreTrustedIdentity(OCISecurity *osshandle,
+                                      OCIError *error_handle,
+                                      nzttIdentity **identity_ptr,
+                                      nzttPersona *persona);
+
+sword OCISecuritySign(OCISecurity *osshandle,
+                      OCIError *error_handle,
+                      nzttPersona *persona,
+                      nzttces signature_state,
+                      size_t input_length,
+                      ub1 *input,
+                      nzttBufferBlock *buffer_block);
+
+sword OCISecuritySignExpansion(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               size_t inputlen,
+                               size_t *signature_length);
+
+sword OCISecurityVerify(OCISecurity *osshandle,
+                        OCIError *error_handle,
+                        nzttPersona *persona,
+                        nzttces signature_state,
+                        size_t siglen,
+                        ub1 *signature,
+                        nzttBufferBlock *extracted_message,
+                        boolean *verified,
+                        boolean *validated,
+                        nzttIdentity **signing_party_identity);
+
+sword OCISecurityValidate(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          nzttPersona *persona,
+                          nzttIdentity *identity,
+                          boolean *validated);
+
+sword OCISecuritySignDetached(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona,
+                              nzttces signature_state,
+                              size_t input_length,
+                              ub1 * input,
+                              nzttBufferBlock *signature);
+
+sword OCISecuritySignDetExpansion(OCISecurity *osshandle,
+                                  OCIError *error_handle,
+                                  nzttPersona *persona,
+                                  size_t input_length,
+                                  size_t *required_buffer_length);
+
+sword OCISecurityVerifyDetached(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttPersona *persona,
+                                nzttces signature_state,
+                                size_t data_length,
+                                ub1 *data,
+                                size_t siglen,
+                                ub1 *signature,
+                                boolean *verified,
+                                boolean *validated,
+                                nzttIdentity **signing_party_identity);
+
+sword OCISecurity_PKEncrypt(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            size_t number_of_recipients,
+                            nzttIdentity *recipient_list,
+                            nzttces encryption_state,
+                            size_t input_length,
+                            ub1 *input,
+                            nzttBufferBlock *encrypted_data);
+
+sword OCISecurityPKEncryptExpansion(OCISecurity *osshandle,
+                                    OCIError *error_handle,
+                                    nzttPersona *persona,
+                                    size_t number_recipients,
+                                    size_t input_length,
+                                    size_t *buffer_length_required);
+
+sword OCISecurityPKDecrypt(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttPersona *persona,
+                           nzttces encryption_state,
+                           size_t input_length,
+                           ub1 *input,
+                           nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncrypt(OCISecurity *osshandle,
+                         OCIError *error_handle,
+                         nzttPersona *persona,
+                         nzttces encryption_state,
+                         size_t input_length,
+                         ub1 *input,
+                         nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncryptExpansion(OCISecurity *osshandle,
+                                  OCIError *error_handle,
+                                  nzttPersona *persona,
+                                  size_t input_length,
+                                  size_t *encrypted_data_length);
+
+sword OCISecurityDecrypt(OCISecurity *osshandle,
+                         OCIError *error_handle,
+                         nzttPersona *persona,
+                         nzttces decryption_state,
+                         size_t input_length,
+                         ub1 *input,
+                         nzttBufferBlock *decrypted_data);
+
+sword OCISecurityEnvelope(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          nzttPersona *persona,
+                          size_t number_of_recipients,
+                          nzttIdentity *identity,
+                          nzttces encryption_state,
+                          size_t input_length,
+                          ub1 *input,
+                          nzttBufferBlock *enveloped_data);
+
+sword OCISecurityDeEnvelope(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            nzttces decryption_state,
+                            size_t input_length,
+                            ub1 *input,
+                            nzttBufferBlock *output_message,
+                            boolean *verified,
+                            boolean *validated,
+                            nzttIdentity **sender_identity);
+
+sword OCISecurityKeyedHash(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttPersona *persona,
+                           nzttces hash_state,
+                           size_t input_length,
+                           ub1 *input,
+                           nzttBufferBlock *keyed_hash);
+
+sword OCISecurityKeyedHashExpansion(OCISecurity *osshandle,
+                                    OCIError *error_handle,
+                                    nzttPersona *persona,
+                                    size_t input_length,
+                                    size_t *required_buffer_length);
+
+sword OCISecurityHash(OCISecurity *osshandle,
+                      OCIError *error_handle,
+                      nzttPersona *persona,
+                      nzttces hash_state,
+                      size_t input,
+                      ub1 *input_length,
+                      nzttBufferBlock *hash);
+
+sword OCISecurityHashExpansion(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               size_t input_length,
+                               size_t *required_buffer_length);
+
+sword OCISecuritySeedRandom(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            size_t seed_length,
+                            ub1 *seed);
+
+sword OCISecurityRandomBytes(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttPersona *persona,
+                             size_t number_of_bytes_desired,
+                             nzttBufferBlock *random_bytes);
+
+sword OCISecurityRandomNumber(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona,
+                              uword *random_number_ptr);
+
+sword OCISecurityInitBlock(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttBufferBlock *buffer_block);
+
+sword OCISecurityReuseBlock(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttBufferBlock *buffer_block);
+
+sword OCISecurityPurgeBlock(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttBufferBlock *buffer_block);
+
+sword OCISecuritySetBlock(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          uword flags_to_set,
+                          size_t buffer_length,
+                          size_t used_buffer_length,
+                          ub1 *buffer,
+                          nzttBufferBlock *buffer_block);
+
+sword OCISecurityGetIdentity(OCISecurity   *osshandle,
+                             OCIError      *error_handle,
+                             size_t         namelen,
+                             OraText          *distinguished_name,
+                             nzttIdentity **identity);
+
+sword OCIAQEnq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                 OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop,
+                 OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, 
+                 OCIRaw **msgid, ub4 flags); 
+
+sword OCIAQDeq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                 OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop,
+                 OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, 
+                 OCIRaw **msgid, ub4 flags); 
+
+sword OCIAQEnqArray(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                    OCIAQEnqOptions *enqopt, ub4 *iters,
+                    OCIAQMsgProperties **msgprop, OCIType *payload_tdo,
+                    dvoid **payload, dvoid **payload_ind, OCIRaw **msgid,
+                    dvoid *ctxp, OCICallbackAQEnq enqcbfp, ub4 flags);
+
+sword OCIAQDeqArray(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                    OCIAQDeqOptions *deqopt, ub4 *iters,
+                    OCIAQMsgProperties **msgprop, OCIType *payload_tdo,
+                    dvoid **payload, dvoid **payload_ind, OCIRaw **msgid,
+                    dvoid *ctxp, OCICallbackAQDeq deqcbfp, ub4 flags);
+
+sword OCIAQListen(OCISvcCtx *svchp, OCIError *errhp, 
+                      OCIAQAgent **agent_list, ub4 num_agents,
+                      sb4 wait, OCIAQAgent **agent,
+                      ub4 flags);
+
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name, 
+                       ub1 type, ub4 flag, CONST dvoid *defval, 
+                       CONST sb4 *intrange, CONST OraText *CONST *strlist);
+
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag, 
+                         OraText *filename);
+
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, sb4 *retval);
+
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname, 
+                       uword valno, ub1 *retval);
+
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, OraText *retval, uword buflen);
+
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, 
+                         OraText **name, 
+                         ub1 *type, uword *numvals, dvoid ***values);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(dvoid *hdl, OCIError *err, dvoid **mem,
+        OCIDuration dur, ub4 size, ub4 flags);
+
+sword OCIMemoryResize(dvoid *hdl, OCIError *err, dvoid **mem,
+                        ub4 newsize, ub4 flags);
+                        
+sword OCIMemoryFree(dvoid *hdl, OCIError *err, dvoid *mem);
+
+sword OCIContextSetValue(dvoid *hdl, OCIError *err, OCIDuration duration,
+                        ub1 *key, ub1 keylen, dvoid *ctx_value);
+
+sword OCIContextGetValue(dvoid *hdl, OCIError *err, ub1 *key,
+                        ub1 keylen, dvoid **ctx_value);
+
+sword OCIContextClearValue(dvoid *hdl, OCIError *err, ub1 *key, 
+                        ub1 keylen);
+
+sword OCIContextGenerateKey(dvoid *hdl, OCIError *err, ub4 *key);
+
+sword OCIMemorySetCurrentIDs(dvoid *hdl, OCIError *err, 
+                             ub4 curr_session_id, ub4 curr_trans_id, 
+                             ub4 curr_stmt_id);
+
+sword OCIPicklerTdsCtxInit(OCIEnv *env, OCIError *err, 
+                           OCIPicklerTdsCtx **tdsc);
+
+sword OCIPicklerTdsCtxFree(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc);
+
+sword OCIPicklerTdsInit(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc, 
+                                        OCIPicklerTds **tdsh);
+
+sword OCIPicklerTdsFree(OCIEnv *env, OCIError *err, OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsCreateElementNumber(OCIEnv *env, OCIError *err, 
+                                        OCIPicklerTds *tdsh, ub1 prec, 
+                                        sb1 scale, OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementChar(OCIEnv *env, OCIError *err, 
+                                     OCIPicklerTds *tdsh, ub2 len, 
+                                     OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementVarchar(OCIEnv *env, OCIError *err, 
+                                        OCIPicklerTds *tdsh, ub2 len, 
+                                        OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementRaw(OCIEnv *env, OCIError *err, 
+                                    OCIPicklerTds *tdsh, ub2 len, 
+                                    OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElement(OCIEnv *env, OCIError *err, 
+                                 OCIPicklerTds *tdsh, OCITypeCode dty, 
+                                 OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsAddAttr(OCIEnv *env, OCIError *err, 
+                           OCIPicklerTds *tdsh, OCIPicklerTdsElement elt);
+
+sword OCIPicklerTdsGenerate(OCIEnv *env, OCIError *err, 
+                                OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsGetAttr(OCIEnv *env, OCIError *err, 
+                                CONST OCIPicklerTds *tdsh, ub1  attrno,
+                                OCITypeCode *typ, ub2  *len);
+
+sword OCIPicklerFdoInit(OCIEnv *env, OCIError *err, 
+                                OCIPicklerFdo **fdoh);
+
+sword OCIPicklerFdoFree(OCIEnv *env, OCIError *err, 
+                                OCIPicklerFdo *fdoh);
+
+sword OCIPicklerImageInit(OCIEnv *env, OCIError *err, 
+                          OCIPicklerFdo *fdoh, 
+                          OCIPicklerTds *tdsh,
+                          OCIPicklerImage **imgh);
+
+sword OCIPicklerImageFree(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageAddScalar(OCIEnv *env, OCIError *err,  
+                               OCIPicklerImage *imgh, 
+                               dvoid *scalar, ub4  len);
+ 
+sword OCIPicklerImageAddNullScalar(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageGenerate(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageGetScalarSize(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh, 
+                                ub4  attrno, ub4  *size);
+ 
+sword OCIPicklerImageGetScalar(OCIEnv *env, OCIError *err, 
+                                OCIPicklerImage *imgh, ub4  attrno, 
+                                dvoid *buf, ub4  *len, OCIInd *ind);
+
+sword OCIPicklerImageCollBegin(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, CONST OCIPicklerTds *colltdsh);
+ 
+sword OCIPicklerImageCollAddScalar( OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, dvoid *scalar,
+                ub4 buflen, OCIInd ind);
+ 
+sword OCIPicklerImageCollEnd(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh);
+ 
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, CONST OCIPicklerTds *coll_tdsh,
+                ub4 attrnum, ub4 startidx, OCIInd *ind);
+ 
+sword OCIPicklerImageCollGetScalarSize(OCIEnv *env, OCIError *err,
+                CONST OCIPicklerTds *coll_tdsh, ub4 *size);
+ 
+sword OCIPicklerImageCollGetScalar(OCIEnv *env, OCIError *err,
+                                   OCIPicklerImage *imgh, dvoid *buf,
+                                   ub4 *buflen, OCIInd *ind);
+
+sword OCIAnyDataGetType(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode *tc, OCIType **type);
+
+sword OCIAnyDataIsNull(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        boolean *isnull);
+
+sword OCIAnyDataConvert(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, dvoid *ind, dvoid *data_val,
+        ub4 len, OCIAnyData **sdata);
+
+sword OCIAnyDataBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, OCIAnyData **sdata);
+
+sword OCIAnyDataDestroy(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata);
+
+sword OCIAnyDataAttrSet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 length, boolean is_any);
+
+sword OCIAnyDataCollAddElem(OCISvcCtx *svchp, OCIError *errhp,
+        OCIAnyData *sdata, OCITypeCode tc, OCIType *type, dvoid *ind,
+        dvoid *attr_val, ub4 length, boolean is_any, boolean last_elem);
+
+sword OCIAnyDataEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+                          OCIAnyData *sdata);
+
+sword OCIAnyDataAccess(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 *length);
+
+sword OCIAnyDataGetCurrAttrNum(OCISvcCtx *svchp, OCIError *errhp, 
+                               OCIAnyData *sdata, ub4 *attrnum);
+
+sword OCIAnyDataAttrGet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 *length, boolean is_any);
+
+sword OCIAnyDataCollGetElem(OCISvcCtx *svchp, OCIError *errhp,
+  OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *celem_val,
+  ub4 *length, boolean is_any);
+
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+   NAME
+     OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+   PARAMETERS
+     svchp (IN/OUT) - The OCI service context.
+     errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+                      recorded in errhp and this function returns OCI_ERROR.
+                      Diagnostic information can be obtained by calling
+                      OCIErrorGet().
+     typecode       - typecode corresponding to the OCIAnyDataSet.
+     type (IN)      - type corresponding to the OCIAnyDataSet. If the typecode
+                      corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+                      , this parameter can be NULL. It should be non NULL for
+                      user defined types (OCI_TYPECODE_OBJECT,
+                      OCI_TYPECODE_REF, collection types etc.)
+     dur (IN)       - duration for which OCIAnyDataSet is allocated.
+     data_set (OUT) - Initialized OCIAnyDataSet.
+     RETURNS        - error code
+   NOTES
+     This call allocates an OCIAnyDataSet for the duration of dur and
+     initializes it with the type information. The OCIAnyDataSet can hold
+     multiple instances of the given type. For performance reasons, the 
+     OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+     It is the responsibility of the caller to ensure that the OCIType is
+     longer lived (has allocation duration >= the duration of the OCIAnyData
+     if the OCIType is a transient one, allocation/pin duration >= duration of
+     the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(OCISvcCtx *svchp, OCIError *errhp,
+     OCITypeCode typecode, CONST OCIType *type, OCIDuration dur,
+     OCIAnyDataSet ** data_set);
+
+/*
+   NAME
+     OCIAnyDataSetDestroy  - OCIAnyDataSet Destroy
+   DESCRIPTION
+     This call frees the OCIAnyDataSet allocated using
+     OCIAnyDataSetBeginCreate().
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)    - The OCI service context.
+     errhp (IN/OUT)    - The OCI Error handle.
+     data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set);
+
+
+/*
+   NAME
+     OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+   DESCRIPTION
+     This call adds a new skeleton instance to the OCIAnyDataSet and all the
+     attributes of the instance are set to NULL. It returns this skeleton
+     instance through the OCIAnyData parameter which can be constructed
+     subsequently by invoking the OCIAnyData API.
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN/OUT)   - OCIAnyDataSet to which a new instance is added.
+     data (IN/OUT)       - OCIAnyData corresponding to the newly added
+                           instance. If (*data) is NULL, a new OCIAnyData will
+                           be allocated for same duration as the OCIAnyDataSet.
+                           If (*data) is not NULL, it will get reused. This
+                           OCIAnyData can be subseqently constructed using the
+                           OCIAnyDataConvert() call or it can be constructed
+                           piece-wise using the OCIAnyDataAttrSet and
+                           OCIAnyDataCollAddElem calls.
+   NOTES
+     No Destruction of the old value is done here. It is the responsibility of
+     the caller to destroy the old value pointed to by (*data) and set (*data)
+     to a null pointer before beginning to make a sequence of this call. No
+     deep copying (of OCIType information nor the data part.) is done in the
+     returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+     duration of the OCIAnyDataSet (it is like a reference into the
+     OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+     to this function, to sequentially add new data instances to the
+     OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*
+   NAME
+     OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+   DESCRIPTION
+     This call marks the end of OCIAnyDataSet creation. It should be called
+     after constructing all of its instance(s).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)        - The OCI service context.
+     errhp (IN/OUT)        - The OCI error handle. If there is an error, it is
+                             recorded in errhp and this function returns
+                             OCI_ERROR. Diagnostic information can be obtained
+                             by calling OCIErrorGet().
+     data_set (IN/OUT)     - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set);
+
+/*
+   NAME
+     OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+   DESCRIPTION
+     Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+     pointer to the type maintained inside an OCIAnyDataSet. No copying is
+     done for performance reasons. The client is responsible for not using
+     this type once the OCIAnyDataSet is freed (or its duration ends).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN)       - Initialized OCIAnyDataSet.
+     tc (OUT)            - The typecode of the type.
+     type (OUT)          - The type corresponding to the OCIAnyDataSet. This
+                           could be null if the OCIAnyData corresponds to a
+                           built-in type.
+*/
+sword OCIAnyDataSetGetType (OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type);
+
+/*
+  NAME
+    OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+  DESCRIPTION
+    This call gets the number of instances in the OCIAnyDataSet.
+  RETURNS
+    error code.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet.
+    count (OUT)         - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, ub4 *count);
+
+/*
+  NAME
+    OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+  DESCRIPTION
+    Only sequential access to the instances in an OCIAnyDataSet is allowed.
+    This call returns the OCIAnyData corresponding to an instance at the
+    current position and updates the current position. Subsequently, the
+    OCIAnyData access routines may be used to access the instance.
+  RETURNS
+    error code. Returns OCI_NO_DATA if the current position is at the end of
+    the set, OCI_SUCCESS otherwise.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet
+    data (IN/OUT)       - OCIAnyData corresponding to the instance. If (*data)
+                          is NULL, a new OCIAnyData will be allocated for same
+                          duration as the OCIAnyDataSet. If (*data) is not NULL
+                          , it will get reused. This OCIAnyData can be
+                          subsequently accessed using the OCIAnyDataAccess()
+                          call or piece-wise by using the OCIAnyDataAttrGet()
+                          call.
+  NOTE
+    No Destruction of the old value is done here. It is the responsibility of
+    the caller to destroy the old value pointed to by (*data) and set (*data)
+    to a null pointer before beginning to make a sequence of this call. No deep
+    copying (of OCIType information nor the data part.) is done in the returned
+    OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+    of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+    returned OCIAnyData can be reused on subsequent calls to this function to
+    sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      CONST OraText *formatString, ...);
+
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+
+sword OCIFormatTUb1(void);
+sword OCIFormatTUb2(void);
+sword OCIFormatTUb4(void);
+sword OCIFormatTUword(void);
+sword OCIFormatTUbig_ora(void);
+sword OCIFormatTSb1(void);
+sword OCIFormatTSb2(void);
+sword OCIFormatTSb4(void);
+sword OCIFormatTSword(void);
+sword OCIFormatTSbig_ora(void);
+sword OCIFormatTEb1(void);
+sword OCIFormatTEb2(void);
+sword OCIFormatTEb4(void);
+sword OCIFormatTEword(void);
+sword OCIFormatTChar(void);
+sword OCIFormatTText(void);
+sword OCIFormatTDouble(void);
+sword OCIFormatTDvoid(void);
+sword OCIFormatTEnd(void);
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+   NAME
+     xaosvch  -  XA Oracle get SerViCe Handle
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(OraText *dbname);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+   NAME
+     xaoSvcCtx  -  XA Oracle get SerViCe ConTeXt
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the service
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCISvcCtx *xaoSvcCtx(OraText *dbname);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+   NAME
+     xaoEnv  -  XA Oracle get ENvironment Handle
+   DESCRIPTION
+     Given a database name return the environment handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the environment
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCIEnv *xaoEnv(OraText *dbname);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+   NAME
+     xaosterr  -  XA Oracle get xa STart ERRor code
+   DESCRIPTION
+     Given an oracle error code return the XA error code
+ */
+int xaosterr(OCISvcCtx *svch, sb4 error);
+/*-------------------------- End Extensions ---------------------------------*/
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+   NAME
+     OCINlsGetInfo - Get NLS info from OCI environment handle
+   REMARKS
+     This function generates language information specified by item from OCI 
+     environment handle envhp into an array pointed to by buf within size 
+     limitation as buflen.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   buf(OUT)
+     Pointer to the destination buffer.
+   buflen(IN)
+     The size of destination buffer. The maximum length for each information
+     is 32 bytes.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_DAYNAME1 : Native name for Monday.
+       OCI_NLS_DAYNAME2 : Native name for Tuesday.
+       OCI_NLS_DAYNAME3 : Native name for Wednesday.
+       OCI_NLS_DAYNAME4 : Native name for Thursday.
+       OCI_NLS_DAYNAME5 : Native name for Friday.
+       OCI_NLS_DAYNAME6 : Native name for for Saturday.
+       OCI_NLS_DAYNAME7 : Native name for for Sunday.
+       OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+       OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+       OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+       OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+       OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+       OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+       OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+       OCI_NLS_MONTHNAME1 : Native name for January.
+       OCI_NLS_MONTHNAME2 : Native name for February.
+       OCI_NLS_MONTHNAME3 : Native name for March.
+       OCI_NLS_MONTHNAME4 : Native name for April.
+       OCI_NLS_MONTHNAME5 : Native name for May.
+       OCI_NLS_MONTHNAME6 : Native name for June.
+       OCI_NLS_MONTHNAME7 : Native name for July.
+       OCI_NLS_MONTHNAME8 : Native name for August.
+       OCI_NLS_MONTHNAME9 : Native name for September.
+       OCI_NLS_MONTHNAME10 : Native name for October.
+       OCI_NLS_MONTHNAME11 : Native name for November.
+       OCI_NLS_MONTHNAME12 : Native name for December.
+       OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+       OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+       OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+       OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+       OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+       OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+       OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+       OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+       OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+       OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+       OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+       OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+       OCI_NLS_YES : Native string for affirmative response.
+       OCI_NLS_NO : Native negative response. 
+       OCI_NLS_AM : Native equivalent string of AM.
+       OCI_NLS_PM : Native equivalent string of PM.
+       OCI_NLS_AD : Native equivalent string of AD.
+       OCI_NLS_BC : Native equivalent string of BC.
+       OCI_NLS_DECIMAL : decimal character.
+       OCI_NLS_GROUP : group separator.
+       OCI_NLS_DEBIT : Native symbol of debit.
+       OCI_NLS_CREDIT : Native sumbol of credit.
+       OCI_NLS_DATEFORMAT : Oracle date format.
+       OCI_NLS_INT_CURRENCY: International currency symbol.
+       OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+       OCI_NLS_LANGUAGE : Language name.
+       OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+       OCI_NLS_TERRITORY : Territory name.
+       OCI_NLS_CHARACTER_SET : Character set name.
+       OCI_NLS_LINGUISTIC : Linguistic name.
+       OCI_NLS_CALENDAR : Calendar name.
+       OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(dvoid *envhp, OCIError *errhp, OraText *buf,
+                    size_t buflen, ub2 item);
+
+/* ----------------------- OCINlsNumericInfoGet -----------------------------*/
+/*
+   NAME
+     OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+   REMARKS
+     This function generates numeric language information specified by item 
+     from OCI environment handle envhp into an output number variable.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   val(OUT)
+     Pointer to the output number variable. On OCI_SUCCESS return, it will
+     contain the requested NLS numeric info.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+                                   environment or session handle charset
+       OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+                                   0 for variable-width charset 
+*/
+sword OCINlsNumericInfoGet(dvoid *envhp, OCIError *errhp, sb4 *val, ub2 item);
+
+/* ----------------------- OCINlsCharSetNameToId ----------------------------*/
+/*
+   NAME
+     OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+   REMARKS
+     This function will get the Oracle character set id corresponding to
+     the given Oracle character set name.
+   RETURNS
+     Oracle character set id for the given Oracle character set name if
+     character set name and OCI handle are valid; otherwise returns 0.
+   envhp(IN/OUT)
+     OCI environment handle.
+   name(IN)
+     Pointer to a null-terminated Oracle character set name whose id 
+     will be returned.
+*/
+ub2 OCINlsCharSetNameToId(dvoid *envhp, const oratext *name);
+
+/* ----------------------- OCINlsCharSetIdToName ----------------------------*/
+/*
+   NAME
+     OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+   REMARKS
+     This function will get the Oracle character set name corresponding to
+     the given Oracle character set id.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+     the null-terminated string for character set name.
+   buflen(IN)
+     Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+     guarantee to store an Oracle character set name. If it's smaller than
+     the length of the character set name, the function will return OCI_ERROR.
+   id(IN)
+     Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(dvoid *envhp, oratext *buf, size_t buflen, ub2 id);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+   NAME
+     OCINlsNameMap - Map NLS naming from Oracle to other standards and vice 
+                     versa
+   REMARKS
+     This function will map NLS naming from Oracle to other standards (such
+     as ISO, IANA) and vice versa.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will 
+     contain null-terminated string for requested mapped name.
+   buflen(IN)
+     The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+     for guarantee to store an NLS name. If it is smaller than the length
+     of the name, the function will return OCI_ERROR.
+   srcbuf(IN)
+     Pointer to null-terminated NLS name. If it is not a valid name in its
+     define scope, the function will return OCI_ERROR.
+   flag(IN)
+     It specifies name mapping direction and can take the following values:
+       OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+       OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+       OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+       OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+       OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+       OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+                                  abbreviation to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+                                  ISO abbreviation
+*/
+sword OCINlsNameMap(dvoid *envhp, oratext *buf, size_t buflen,
+                    const oratext *srcbuf, ub4 flag);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+   NAME
+     OCIMultiByteToWideChar - Convert a null terminated multibyte string into 
+                              wchar
+   REMARKS
+     This routine converts an entire null-terminated string into the wchar 
+     format. The wchar output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for wchar.
+   src (IN)
+     Source string to be converted.
+   rsize (OUT)
+     Number of characters converted including null-terminator.
+     If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(dvoid *envhp, OCIWchar *dst, CONST OraText *src,
+                             size_t *rsize);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+   NAME
+     OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+                                    wchar
+   REMARKS
+     This routine converts part of string into the wchar format. It will
+     convert as many complete characters as it can until it reaches output
+     buffer size or input buffer size or it reaches a null-terminator in
+     source string. The output buffer will be null-terminated if space permits.
+     If dstsz is zero, this function will only return number of characters not
+     including ending null terminator for converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Pointer to a destination buffer for wchar. It can be NULL pointer when
+     dstsz is zero.
+   dstsz(IN)
+     Destination buffer size in character. If it is zero, this function just
+     returns number of characters will be need for the conversion.
+   src (IN)
+     Source string to be converted.
+   srcsz(IN)
+     Length of source string in byte.
+   rsize(OUT)
+     Number of characters written into destination buffer, or number of
+     characters for converted string is dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(dvoid *envhp, OCIWchar *dst,
+                                  size_t dstsz, CONST OraText *src, 
+                                  size_t srcsz, size_t *rsize);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharToMultiByte - Convert a null terminated wchar string into
+                              multibyte
+   REMARKS
+     This routine converts an entire null-terminated wide character string into
+     multi-byte string. The output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte string.
+   src (IN)
+     Source wchar string to be converted.
+   rsize (OUT)
+     Number of bytes written into the destination buffer.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(dvoid *envhp, OraText *dst, CONST OCIWchar *src,
+                             size_t *rsize);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+   NAME
+     OCIWideCharInSizeToMultiByte - Convert a wchar string in length into 
+                                    mulitbyte
+   REMARKS
+     This routine converts part of wchar string into the multi-byte format.
+     It will convert as many complete characters as it can until it reaches
+     output buffer size or input buffer size or it reaches a null-terminator
+     in source string. The output buffer will be null-terminated if space
+     permits. If dstsz is zero, the function just returns the size of byte not 
+     including ending null-terminator need to store the converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte. It can be NULL pointer if dstsz is
+     zero.
+   dstsz(IN)
+     Destination buffer size in byte. If it is zero, it just returns the size
+     of bytes need for converted string.
+   src (IN)
+     Source wchar string to be converted.
+   srcsz(IN)
+     Length of source string in character.
+   rsize(OUT)
+     Number of bytes written into destination buffer, or number of bytes need
+     to store the converted string if dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(dvoid *envhp, OraText *dst,
+                                    size_t dstsz, CONST OCIWchar *src,
+                                    size_t srcsz, size_t *rsize);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+   REMARKS
+     It tests whether wc is a letter or decimal digit.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+   REMARKS
+     It tests whether wc is an alphabetic letter
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+   NAME
+     OCIWideCharIsCntrl - test whether wc is a control character
+   REMARKS
+     It tests whether wc is a control character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsDigit - test whether wc is a decimal digit character
+   REMARKS
+     It tests whether wc is a decimal digit character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsGraph - test whether wc is a graph character
+   REMARKS
+     It tests whether wc is a graph character. A graph character is character
+     with a visible representation and normally includes alphabetic letter,
+     decimal digit, and punctuation.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsLower - test whether wc is a lowercase letter
+   REMARKS
+     It tests whether wc is a lowercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPrint - test whether wc is a printable character
+   REMARKS
+     It tests whether wc is a printable character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPunct - test whether wc is a punctuation character
+   REMARKS
+     It tests whether wc is a punctuation character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsSpace - test whether wc is a space character
+   REMARKS
+     It tests whether wc is a space character. A space character only causes
+     white space in displayed text(for example, space, tab, carriage return,
+     newline, vertical tab or form feed).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsUpper - test whether wc is a uppercase letter
+   REMARKS
+     It tests whether wc is a uppercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(dvoid *envhp, OCIWchar wc);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+   REMARKS
+     It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharIsSingleByte - test whether wc is a single-byte character
+   REMARKS
+     It tests whether wc is a single-byte character when converted into
+     multi-byte.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharToLower - Convert a wchar into the lowercase
+   REMARKS
+     If there is a lower-case character mapping for wc in the specified locale,
+     it will return the lower-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharToUpper - Convert a wchar into the uppercase
+   REMARKS
+     If there is a upper-case character mapping for wc in the specified locale,
+     it will return the upper-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcmp - compare two null terminated wchar string
+   REMARKS
+     It compares two wchar string in binary ( based on wchar encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if wstr1 == wstr2.
+     Positive, if wstr1 > wstr2.
+     Negative, if wstr1 < wstr2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   wstr1(IN)
+     Pointer to a null-terminated wchar string.
+   wstr2(IN)
+     Pointer to a null-terminated wchar string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+     comparison.
+*/
+int OCIWideCharStrcmp(dvoid *envhp, CONST OCIWchar *wstr1, 
+                CONST OCIWchar *wstr2, int flag);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncmp - compare twe wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcmp(), except that at most len1
+     characters from wstr1 and len2 characters from wstr1 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if wstr1 = wstr2
+     Positive, if wstr1 > wstr2
+     Negative, if wstr1 < wstr2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr1(IN)
+     Pointer to the first wchar string
+   len1(IN)
+     The length for the first string for comparison
+   wstr2(IN)
+     Pointer to the second wchar string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIWideCharStrncmp(dvoid *envhp, CONST OCIWchar *wstr1, size_t len1,
+                 CONST OCIWchar *wstr2, size_t len2, int flag);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcat - concatenate two wchar strings
+   REMARKS
+     This function appends a copy of the wchar string pointed to by wsrcstr,
+     including the null-terminator to the end of wchar string pointed to by
+     wdststr. It returns the number of character in the result string not
+     including the ending null-terminator.
+   RETURNS
+     number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(dvoid *envhp, OCIWchar *wdststr,
+                         CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+   REMARKS
+     This function searchs for the first occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(dvoid *envhp, CONST OCIWchar *wstr,
+                            OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcpy - copy a wchar string
+   REMARKS
+     This function copies the wchar string pointed to by wsrcstr, including the
+     null-terminator, into the array pointed to by wdststr. It returns the
+     number of character copied not including the ending null-terminator.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(dvoid *envhp, OCIWchar *wdststr,
+                         CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrlen - Return number of character in a wchar string
+   REMARKS
+     This function computes the number of characters in the wchar string
+     pointed to by wstr, not including the null-terminator, and returns
+    this number. 
+   RETURNS
+     number of characters not including ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(dvoid *envhp, CONST OCIWchar *wstr);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncat - Concatenate wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcat(), except that at most n
+     characters from wsrcstr are appended to wdststr. Note that the
+     null-terminator in wsrcstr will stop appending. wdststr will be
+     null-terminated.. 
+   RETURNS
+     Number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+   n(IN)
+     Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(dvoid *envhp, OCIWchar *wdststr,
+                          CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncpy - Copy wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcpy(), except that at most n
+     characters are copied from the array pointed to by wsrcstr to the array
+     pointed to by wdststr. Note that the null-terminator in wdststr will
+     stop coping and result string will be null-terminated.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+   n(IN)
+     Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(dvoid *envhp, OCIWchar *wdststr,
+                          CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+   REMARKS
+     This function searchs for the last occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(dvoid *envhp, CONST OCIWchar *wstr,
+                             OCIWchar wc);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+   NAME
+     OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+                                    uppercase
+   REMARKS
+     This function convert the wide char string pointed to by wsrcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by wdststr. The result string will be null-terminated.
+   RETURNS
+     number of characters for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   wdststr(OUT)
+     Pointer to destination array.
+   wsrcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE : convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(dvoid *envhp, OCIWchar *wdststr,
+                                    CONST OCIWchar *wsrcstr, ub4 flag);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+   NAME
+     OCIWideCharDisplayLength - Calculate the display length for a wchar
+   REMARKS
+     This function determines the number of column positions required for wc
+     in display. It returns number of column positions, or 0 if wc is 
+     null-terminator.
+   RETURNS
+     Number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharDisplayLength(dvoid *envhp, OCIWchar wc );
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+   NAME
+     OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+   REMARKS
+     This function determines the number of byte required for wc in multi-byte
+     encoding. It returns number of bytes in multi-byte for wc.
+   RETURNS
+     Number of bytes.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcmp - Compare two multi-byte strings
+   REMARKS
+     It compares two multi-byte strings in binary ( based on encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if str1 == str2.
+     Positive, if str1 > str2.
+     Negative, if str1 < str2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to a null-terminated string.
+   str2(IN)
+     Pointer to a null-terminated string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrcmp(dvoid *envhp, CONST OraText *str1,
+                       CONST OraText *str2, int flag);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncmp - compare two strings in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcmp(), except that at most
+     len1 bytes from str1 and len2 bytes from str2 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if str1 = str2
+     Positive, if str1 > str2
+     Negative, if str1 < str2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to the first string
+   len1(IN)
+     The length for the first string for comparison
+   str2(IN)
+     Pointer to the second string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrncmp(dvoid *envhp, CONST OraText *str1, size_t len1,
+                        OraText *str2, size_t len2, int flag);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcat - concatenate multibyte strings
+   REMARKS
+     This function appends a copy of the multi-byte string pointed to by
+     srcstr, including the null-terminator to the end of string pointed to by
+     dststr. It returns the number of bytes in the result string not including
+     the ending null-terminator.
+   RETURNS
+     number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle
+   dststr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   srcstr(IN)
+     Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(dvoid *envhp, OraText *dststr,
+                          CONST OraText *srcstr);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcpy - copy multibyte string
+   REMARKS
+     This function copies the multi-byte string pointed to by srcstr,
+     including the null-terminator, into the array pointed to by dststr. It
+     returns the number of bytes copied not including the ending 
+     null-terminator.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to the OCI environment handle.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(dvoid *envhp, OraText *dststr,
+                          CONST OraText *srcstr);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrlen - Calculate multibyte string length
+   REMARKS
+     This function computes the number of bytes in the multi-byte string
+     pointed to by str, not including the null-terminator, and returns this
+     number. 
+   RETURNS
+     number of bytes not including ending null-terminator.
+   str(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(dvoid *envhp, CONST OraText *str);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncat - concatenate string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcat(), except that at most n
+     bytes from srcstr are appended to dststr. Note that the null-terminator in
+     srcstr will stop appending and the function will append as many character
+     as possible within n bytes. dststr will be null-terminated. 
+   RETURNS
+     Number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle.
+   srcstr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   dststr(IN)
+     Pointer to the source multi-byte string to append.
+   n(IN)
+     Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(dvoid *envhp, OraText *dststr,
+                           CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncpy - copy multibyte string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcpy(), except that at most n
+     bytes are copied from the array pointed to by srcstr to the array pointed
+     to by dststr. Note that the null-terminator in srcstr will stop coping and
+     the function will copy as many character as possible within n bytes. The 
+     result string will be null-terminated.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to a OCI environment handle.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   n(IN)
+     Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(dvoid *envhp, OraText *dststr,
+                           CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrnDisplayLength - calculate the display length for a
+                                     multibyt string
+   REMARKS
+     This function returns the number of display positions occupied by the 
+     complete characters within the range of n bytes.
+   RETURNS
+     number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle.
+   str(IN)
+     Pointer to a multi-byte string.
+   n(IN)
+     Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(dvoid *envhp, CONST OraText *str1,
+                                     size_t n);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion  ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrCaseConversion
+   REMARKS
+     This function convert the multi-byte string pointed to by srcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by dststr. The result string will be null-terminated.
+   RETURNS
+     number of bytes for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   dststr(OUT)
+     Pointer to destination array.
+   srcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE: convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the 
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(dvoid *envhp, OraText *dststr,
+                                     CONST OraText *srcstr, ub4 flag);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+   NAME
+     OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+   REMARKS
+     This function converts a multi-byte string pointed to by src to Unicode 
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. 
+     The function will return number of characters converted into Unicode.
+     If dstlen is zero, it will just return the number of characters for the
+     result without real conversion.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle
+   dst(OUT)
+     Pointer to a destination buffer
+   dstlen(IN)
+     Size of destination buffer in character
+   src(IN)
+     Pointer to multi-byte source string.
+   srclen(IN)
+     Size of source string in bytes.
+   rsize(OUT)
+     Number of characters converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(dvoid *envhp, ub2 *dst, size_t dstlen,
+                          CONST OraText *src, size_t  srclen, size_t *rsize);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+   NAME
+     OCIUnicodeToCharSet - convert Unicode into multibyte
+   REMARKS
+     This function converts a Unicode string pointed to by src to multi-byte
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. The function will
+     return number of bytes converted into multi-byte. If dstlen is zero, it
+     will just return the number of bytes for the result without real 
+     conversion. If a Unicode character is not convertible for the character
+     set specified in OCI environment handle, a replacement character will be
+     used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+     return ture.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle.
+   dst(OUT)
+     Pointer to a destination buffer.
+   dstlen(IN)
+     Size of destination buffer in byte.
+   src(IN)
+     Pointer to a Unicode string.
+   srclen(IN)
+     Size of source string in characters.
+   rsize(OUT)
+     Number of bytes converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(dvoid *envhp, OraText *dst, size_t dstlen, 
+                           CONST ub2 *src, size_t srclen, size_t *rsize);
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+   NAME
+     OCINlsCharSetConvert - convert between any two character set.
+   REMARKS
+     This function converts a string pointed to by src in the character set
+     specified with srcid to the array pointed to by dst in the character set
+     specified with dstid. The conversion will stop when it reaches the source
+     limitation or destination limitation. The function will return the number
+     of bytes converted into the destination buffer. Even though either source
+     or destination character set id is OCI_UTF16ID, given and return data
+     length will be represented with the byte length as this function is
+     intended for generic purpose. Note the conversion will not stop at null
+     data.
+     To get character set id from name, OCINlsCharSetNameToId can be used.
+     To check if derived data in the destination buffer contains any
+     replacement character resulting from conversion failure,
+     OCICharSetConversionIsReplacementUsed can be used to get the status.
+     Data alignment should be guaranteed by a caller. For example, UTF-16 data
+     should be aligned to ub2 type.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+   errhp(IN/OUT)
+     OCI error handle. If there is an error, it is recorded in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained
+     by calling OCIErrorGet().
+   dstid(IN)
+     Character set id for the destination buffer.
+   dstp(OUT)
+     Pointer to the destination buffer.
+   dstlen(IN)
+     The maximum byte size of destination buffer.
+   srcid(IN)
+     Character set id for the source buffer.
+   srcp(IN)
+     Pointer to the source buffer.
+   srclen(IN)
+     The length byte size of source buffer.
+   rsize(OUT)
+     The number of characters converted. If it is a NULL pointer, nothing to
+     return.
+*/
+sword OCINlsCharSetConvert(dvoid *envhp, OCIError *errhp, 
+                        ub2 dstid, dvoid *dstp, size_t dstlen,
+                        ub2 srcid, CONST dvoid *srcp, size_t srclen,
+                        size_t *rsize);
+
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+   NAME
+     OCICharsetConversionIsReplacementUsed - chech if replacement is used in 
+                                             conversion
+   REMARKS
+     This function indicates whether or not the replacement character was used
+     for nonconvertible characters in character set conversion in last invoke
+     of OCICharsetUcs2ToMb().
+   RETURNS
+     TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+     invoking, else FALSE.
+   envhp(IN/OUT)
+     OCI environment handle. This should be the first handle passed to 
+     OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(dvoid *envhp);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+   NAME
+     OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+   DESCRIPTION
+     This function retrieves a value of NLS environment variable to the buffer
+     pointed to by val. Data type is determined by the parameter specified by
+     item. Either numeric data or string data can be retrieved.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+
+   PARAMETERS
+   valp(OUT) -
+     Pointer to the buffer.
+   size(IN) -
+     Size of the buffer. This argument is only applicable to string data type,
+     but not to numerical data, in such case, it is ignored.
+   item(IN) -
+     NLS item value, which can be one of following values:
+       OCI_NLS_CHARSET_ID  - NLS_LANG character set id in ub2 data type.
+       OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+   charset(IN) -
+     Character set id for retrieved string data. If it is 0, NLS_LANG will be
+     used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+     is ignored.
+   rsize(OUT) -
+     Size of return value.
+
+   NOTE
+     This functions is mainly used for retrieving character set id from either
+     NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+     the default character set id is returned.
+     For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(dvoid  *valp, size_t size, ub2 item,
+                                   ub2 charset, size_t *rsize);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+   NAME
+     OCIMessageOpen - open a locale message file
+   REMARKS
+     This function opens a message handle for facility of product in a language
+     pointed to by envhp. It first try to open the message file corresponding
+     to envhp for the facility. If it successes, it will use that file to
+     initialize a message handle, else it will use the default message file
+     which is for American language for the facility. The function return a
+     pointer pointed to a message handle into msghp parameter.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(OUT)
+     a message handle for return
+   product(IN)
+     A pointer to a product name. Product name is used to locate the directory
+     for message in a system dependent way. For example, in Solaris, the
+     directory of message files for the product `rdbms' is
+     `${ORACLE_HOME}/rdbms'.
+   facility(IN)
+     A pointer to a facility name in the product. It is used to construct a
+     message file name. A message file name follows the conversion with 
+     facility as prefix. For example, the message file name for facility
+     `img' in American language will be `imgus.msb' where `us' is the 
+     abbreviation of American language and `msb' as message binary file 
+     extension.
+   dur(IN)
+     Duration for memory allocation for the return message handle. It can be
+     the following values:
+        OCI_DURATION_CALL
+        OCI_DURATION_STATEMENT
+        OCI_DURATION_SESSION
+        OCI_DURATION_TRANSACTION
+     For the detail description, please refer to Memory Related Service
+     Interfaces section.
+*/
+sword OCIMessageOpen(dvoid *envhp, OCIError *errhp, OCIMsg **msghp,
+                      CONST OraText *product, CONST OraText *facility, 
+                      OCIDuration dur);
+ 
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+   NAME
+     OCIMessageGet - get a locale message from a message handle
+   REMARKS
+     This function will get message with message number identified by msgno and
+     if buflen is not zero, the function will copy the message into the buffer
+     pointed to by msgbuf. If buflen is zero, the message will be copied into
+     a message buffer inside the message handle pointed to by msgh. For both
+     cases. it will return the pointer to the null-terminated message string.
+     If it cannot get the message required, it will return a NULL pointer.
+   RETURNS
+     A pointer to a null-terminated message string on success, otherwise a NULL
+     pointer.
+   msgh(IN/OUT)
+     Pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+   msgno(IN)
+     The message number for getting message.
+   msgbuf(OUT)
+     Pointer to a destination buffer to the message retrieved. If buflen is
+     zero, it can be NULL pointer.
+   buflen(IN)
+     The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+                       size_t buflen);
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+   NAME
+     OCIMessageClose - close a message handle
+   REMARKS
+     This function closes a message handle pointed to by msgh and frees any
+     memory associated with this handle.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(IN/OUT)
+     A pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+*/
+sword OCIMessageClose(dvoid *envhp, OCIError *errhp, OCIMsg *msghp);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers.  It offers a portable interface to
+threading capabilities native to various platforms.  It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded 
+facilities.  It only serves as a set of portable covers for native 
+multithreaded facilities.  Therefore, platforms that do not have native 
+support for multi-threading will only be able to support a limited 
+implementation of OCIThread.  As a result, products that rely on all of 
+OCIThread's functionality will not port to all platforms.  Products that must 
+port to all platforms must use only a subset of OCIThread's functionality.  
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts.  Each part is described
+briefly here.  The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+     These calls deal with the initialization and termination of OCIThread.
+     Initialization of OCIThread initializes the OCIThread context which is
+     a member of the OCI environment or session handle.  This context is 
+     required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+     The passive threading primitives include primitives to manipulate mutual
+     exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+     The reason that these primitives are described as 'passive' is that while
+     their specifications allow for the existence of multiple threads, they do
+     not require it.  This means that it is possible for these primitives to
+     be implemented according to specification in both single-threaded and
+     multi-threaded environments.
+
+     As a result, OCIThread clients that use only these primitives will not
+     require the existence of multiple threads in order to work correctly,
+     i.e., they will be able to work in single-threaded environments without 
+     branching code.
+
+ 3. Active Threading Primitives
+
+     Active threading primitives include primitives dealing with the creation,
+     termination, and other manipulation of threads.
+
+     The reason that these primitives are described as 'active' is that they
+     can only be used in true multi-threaded environments.  Their
+     specifications explicitly require that it be possible to have multiple
+     threads.  If you need to determine at runtime whether or not you are in a
+     multi-threaded environment, call OCIThreadIsMulti() before calling an
+     OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package.  OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment.  It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+  OCIThreadContext - OCIThread Context
+  -------------------------------------
+
+    Most calls to OCIThread functions take the OCI environment or session 
+    handle as a parameter.  The OCIThread context is part of the OCI 
+    environment or session handle and it must be initialized by calling 
+    'OCIThreadInit()'.  Termination of the OCIThread context occurs by calling
+    'OCIThreadTerm()'.
+
+    The OCIThread context is a private data structure.  Clients must NEVER
+    attempt to examine the contents of the context.
+
+1.1.2  OCIThreadProcessInit
+
+  OCIThreadProcessInit - OCIThread Process INITialization
+  --------------------------------------------------------
+
+    Description
+
+      This function should be called to perform OCIThread process
+      initialization.
+
+    Prototype
+
+      void OCIThreadProcessInit();
+
+    Returns
+
+      Nothing.
+
+    Notes
+
+      Whether or not this function needs to be called depends on how OCI
+      Thread is going to be used.
+
+        * In a single-threaded application, calling this function is optional.
+          If it is called at all, the first call to it must occur before calls
+          to any other OCIThread functions.  Subsequent calls can be made
+          without restriction; they will not have any effect.
+
+        * In a multi-threaded application, this function MUST be called.  The
+          first call to it MUST occur 'strictly before' any other OCIThread
+          calls; i.e., no other calls to OCIThread functions (including other
+          calls to this one) can be concurrent with the first call.
+          Subsequent calls to this function can be made without restriction;
+          they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+  OCIThreadInit - OCIThread INITialize
+  -------------------------------------
+
+    Description
+
+      This initializes OCIThread context.
+
+    Prototype
+
+      sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal for OCIThread clients to try an examine the memory
+      pointed to by the returned pointer.
+
+      It is safe to make concurrent calls to 'OCIThreadInit()'.  Unlike
+      'OCIThreadProcessInit()',  there is no need to have a first call
+      that occurs before all the others.
+
+      The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+      Thread context.  It also saves a pointer to the context in some system
+      dependent manner.  Subsequent calls to 'OCIThreadInit()' will return
+      the same context.
+
+      Each call to 'OCIThreadInit()' must eventually be matched by a call to
+      'OCIThreadTerm()'.
+
+  OCIThreadTerm - OCIThread TERMinate
+  ------------------------------------
+
+    Description
+
+      This should be called to release the OCIThread context.  It should be
+      called exactly once for each call made to 'OCIThreadInit()'.
+
+    Prototype
+
+      sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+      'OCIThreadTerm()' will not do anything until it has been called as
+      many times as 'OCIThreadInit()' has been called.  When that happens,
+      it terminates the OCIThread layer and frees the memory allocated for
+      the context.  Once this happens, the context should not be re-used.
+      It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+  OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+  ------------------------------------------------
+
+    Description
+
+      This tells the caller whether the application is running in a
+      multi-threaded environment or a single-threaded environment.
+
+    Prototype
+      boolean OCIThreadIsMulti(void);
+
+    Returns
+
+      TRUE if the environment is multi-threaded;
+      FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex, 
+thread ID's, and thread-specific data.  Since the specifications of these 
+primitives do not require the existence of multiple threads, they can be 
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1  OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+  The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+  (mutex).  A mutex is typically used for one of two purposes: (i) to
+  ensure that only one thread accesses a given set of data at a time, or
+  (ii) to ensure that only one thread executes a given critical section of
+  code at a time.
+
+  Mutexes pointer can be declared as parts of client structures or as 
+  stand-alone variables.  Before they can be used, they must be initialized 
+  using 'OCIThreadMutexInit()'.  Once they are no longer needed, they must be
+  destroyed using 'OCIThreadMutexDestroy()'.  A mutex pointer must NOT be 
+  used after it is destroyed.
+
+  A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+  'OCIThreadMutexTry()'.  They both ensure that only one thread at a time is
+  allowed to hold a given mutex.  A thread that holds a mutex can release it
+  by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2  OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+  A key can be thought of as a process-wide variable that has a
+  thread-specific value.  What this means is that all the threads in a
+  process can use any given key.  However, each thread can examine or modify
+  that key independently of the other threads.  The value that a thread sees
+  when it examines the key will always be the same as the value that it last
+  set for the key.  It will not see any values set for the key by the other
+  threads.
+
+  The type of the value held by a key is a 'dvoid *' generic pointer.
+
+  Keys can be created using 'OCIThreadKeyInit()'.  When a key is created, its
+  value is initialized to 'NULL' for all threads.
+
+  A thread can set a key's value using 'OCIThreadKeySet()'.  A thread can
+  get a key's value using 'OCIThreadKeyGet()'.
+
+  The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+  THREAD.  When clients maintain a pool of threads and assign the threads to
+  different tasks, it *may not* be appropriate for a task to use OCIThread
+  key functions to save data associated with it.  Here is a scenario of how
+  things can fail: A thread is assigned to execute the initialization of a
+  task.  During the initialization, the task stored some data related to it
+  in the thread using OCIThread key functions.  After the initialization,
+  the thread is returned back to the threads pool.  Later, the threads pool
+  manager assigned another thread to perform some operations on the task,
+  and the task needs to retrieve those data it stored earlier in
+  initialization.  Since the task is running in another thread, it will not
+  be able to retrieve the same data back!  Applications that use thread
+  pools should be aware of this and be cautious when using OCIThread key
+  functions.
+
+
+1.2.1.3  OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+  This is the type of a pointer to a key's destructor routine.  Keys can be
+  associated with a destructor routine when they are created (see
+  'OCIThreadKeyInit()').
+
+  A key's destructor routine will be called whenever a thread that has a
+  non-NULL value for the key terminates.
+
+  The destructor routine returns nothing and takes one parameter.  The
+  parameter will be the value that was set for key when the thread
+  terminated.
+
+  The destructor routine is guaranteed to be called on a thread's value
+  in the key after the termination of the thread and before process
+  termination.  No more precise guarantee can be made about the timing
+  of the destructor routine call; thus no code in the process may assume
+  any post-condition of the destructor routine.  In particular, the
+  destructor is not guaranteed to execute before a join call on the
+  terminated thread returns.
+
+
+1.2.1.4  OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+  Type 'OCIThreadId' is the type that will be used to identify a thread.
+  At any given time, no two threads will ever have the same 'OCIThreadId'.
+  However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+  a new thread may be created that has the same 'OCIThreadId' as the one
+  that died.  In particular, the thread ID must uniquely identify a thread
+  T within a process, and it must be consistent and valid in all threads U
+  of the process for which it can be guaranteed that T is running
+  concurrently with U.  The thread ID for a thread T must be retrievable
+  within thread T.  This will be done via OCIThreadIdGet().
+
+  The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+  thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+  OCIThreadMutexInit - OCIThread MuteX Initialize
+  -----------------------------------------------
+
+    Description
+
+      This allocate and initializes a mutex.  All mutexes must be 
+      initialized prior to use.
+
+    Prototype
+
+      sword OCIThreadMutexInit(dvoid *hndl, OCIError *err, 
+                               OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(OUT):  The mutex to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Multiple threads must not initialize the same mutex simultaneously.
+      Also, a mutex must not be reinitialized until it has been destroyed (see
+      'OCIThreadMutexDestroy()').
+
+  OCIThreadMutexDestroy - OCIThread MuteX Destroy
+  -----------------------------------------------
+
+    Description
+
+      This destroys and deallocate a mutex.  Each mutex must be destroyed 
+      once it is no longer needed.
+
+    Prototype
+
+      sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+                                  OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is not legal to destroy a mutex that is uninitialized or is currently
+      held by a thread.  The destruction of a mutex must not occur concurrently
+      with any other operations on the mutex.  A mutex must not be used after
+      it has been destroyed.
+
+
+  OCIThreadMutexAcquire - OCIThread MuteX Acquire
+  -----------------------------------------------
+
+    Description
+
+      This acquires a mutex for the thread in which it is called.  If the mutex
+      is held by another thread, the calling thread is blocked until it can
+      acquire the mutex.
+
+    Prototype
+
+     sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+                                 OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to acquire.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to acquire an uninitialized mutex.
+
+      This function's behavior is undefined if it is used by a thread to
+      acquire a mutex that is already held by that thread.
+
+
+
+  OCIThreadMutexRelease - OCIThread MuteX Release
+  -----------------------------------------------
+
+    Description
+
+      This releases a mutex.  If there are any threads blocked on the mutex,
+      one of them will acquire it and become unblocked.
+
+    Prototype
+
+      sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+                                  OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to release.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to release an uninitialized mutex.  It is also
+      illegal for a thread to release a mutex that it does not hold.
+
+
+  OCIThreadKeyInit - OCIThread KeY Initialize
+  -------------------------------------------
+
+    Description
+
+      This creates a key.  Each call to this routine allocate and generates 
+      a new key that is distinct from all other keys.
+
+    Prototype
+
+      sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+                             OCIThreadKeyDestFunc destFn);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(OUT):    The 'OCIThreadKey' in which to create the new key.
+
+        destFn(IN):  The destructor for the key.  NULL is permitted.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Once this function executes successfully, a pointer to an allocated and 
+      initialized key is return.  That key can be used with 'OCIThreadKeyGet()'
+      and 'OCIThreadKeySet()'.  The initial value of the key will be 'NULL' for
+      all threads.
+
+      It is illegal for this function to be called more than once to create the
+      same key (i.e., to be called more than once with the same value for the
+      'key' parameter).
+
+      If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+      will be called whenever a thread that has a non-NULL value for the key
+      terminates.  The routine will be called with one parameter.  The
+      parameter will be the key's value for the thread at the time at which the
+      thread terminated.
+      If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+  OCIThreadKeyDestroy - OCIThread KeY DESTROY
+  -------------------------------------------
+
+   Description
+
+     Destroy and deallocate the key pointed to by 'key'.
+
+    Prototype
+
+      sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err, 
+                                OCIThreadKey **key);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT):  The 'OCIThreadKey' in which to destroy the key.
+ 
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      This is different from the destructor function callback passed to the
+      key create routine.  This new destroy function 'OCIThreadKeyDestroy' is 
+      used to terminate any resources OCI THREAD acquired when it created 
+      'key'.  [The 'OCIThreadKeyDestFunc' callback type is a key VALUE 
+      destructor; it does in no way operate on the key itself.]
+
+      This must be called once the user has finished using the key.  Not
+      calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+  OCIThreadKeyGet - OCIThread KeY Get value
+  -----------------------------------------
+
+    Description
+
+      This gets the calling thread's current value for a key.
+
+    Prototype
+
+      sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                            dvoid **pValue);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN):          The key.
+
+        pValue(IN/OUT):   The location in which to place the thread-specific
+                          key value.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+      If the calling thread has not yet assigned a value to the key, 'NULL' is
+      placed in the location pointed to by 'pValue'.
+
+
+  OCIThreadKeySet - OCIThread KeY Set value
+  -----------------------------------------
+
+    Description
+
+      This sets the calling thread's value for a key.
+
+    Prototype
+
+      sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                            dvoid *value);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT): The key.
+
+        value(IN):   The thread-specific value to set in the key.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+1.2.2.3  Thread Id
+--------------------
+
+  OCIThreadIdInit - OCIThread Thread Id INITialize
+  --------------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid (OUT):   Pointer to the thread ID to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+  --------------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN/OUT):        Pointer to the thread ID to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Note
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSet - OCIThread Thread Id Set
+  -----------------------------------------
+
+    Description
+
+      This sets one 'OCIThreadId' to another.
+
+    Prototype
+
+      sword OCIThreadIdSet(dvoid *hndl, OCIError *err, 
+                           OCIThreadId *tidDest,
+                           OCIThreadId *tidSrc);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tidDest(OUT):   This should point to the location of the 'OCIThreadId'
+                        to be set to.
+
+        tidSrc(IN):     This should point to the 'OCIThreadId' to set from.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSetNull - OCIThread Thread Id Set Null
+  ---------------------------------------------------------
+
+    Description
+
+      This sets the NULL thread ID to a given 'OCIThreadId'.
+
+    Prototype
+
+      sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err,
+                               OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        tid(OUT):    This should point to the 'OCIThreadId' in which to put
+                     the NULL thread ID.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdGet - OCIThread Thread Id Get
+  ------------------------------------------
+
+    Description
+
+      This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadIdGet(dvoid *hndl, OCIError *err,
+                           OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(OUT):    This should point to the location in which to place the
+                     ID of the calling thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      When OCIThread is used in a single-threaded environment,
+      OCIThreadIdGet() will always place the same value in the location
+      pointed to by 'tid'.  The exact value itself is not important.  The
+      important thing is that it is not the same as the NULL thread ID and
+      that it is always the same value.
+
+
+  OCIThreadIdSame - OCIThread Thread Ids Same?
+  ----------------------------------------------
+
+    Description
+
+      This determines whether or not two 'OCIThreadId's represent the same
+      thread.
+
+    Prototype
+
+      sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+                            OCIThreadId *tid1, OCIThreadId *tid2,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid1(IN):   Pointer to the first 'OCIThreadId'.
+
+        tid2(IN):   Pointer to the second 'OCIThreadId'.
+        
+        result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+      Otherwise, 'result' is set to FALSE.
+
+      'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+      'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdNull - OCIThread Thread Id NULL?
+  ---------------------------------------------
+
+    Description
+
+      This determines whether or not a given 'OCIThreadId' is the NULL thread
+      ID.
+
+    Prototype
+
+      sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+                            OCIThreadId *tid,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN):    Pointer to the 'OCIThreadId' to check.
+
+        result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid' is the NULL thread ID, 'result' is set to TRUE.  Otherwise, 
+      'result' is set to FALSE.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads.  Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure.  The exception is OCIThreadHandleGet(); it may be called in a 
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment.  You can call OCIThreadIsMulti() to determine whether the 
+environment is multi-threaded or single-threaded.
+
+
+1.3.1  Types
+--------------
+
+1.3.1.1    OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+  Type 'OCIThreadHandle' is used to manipulate a thread in the active
+  primitives:  OCIThreadJoin()and OCIThreadClose().  A thread handle opened by
+  OCIThreadCreate() must be closed in a matching call to
+  OCIThreadClose().  A thread handle is invalid after the call to
+  OCIThreadClose().
+
+  The distinction between a thread ID and a thread handle in OCIThread usage
+  follows the distinction between the thread ID and the thread handle on
+  Windows NT.  On many platforms, the underlying native types are the same.
+
+
+1.3.2  Functions
+------------------
+
+  OCIThreadHndInit - OCIThread HaNDle Initialize
+  ----------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndInit(dvoid *hndl, OCIError *err, 
+                             OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(OUT):   The address of pointer to the thread handle to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadHndDestroy - OCIThread HaNDle Destroy
+  ----------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, 
+                                OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(IN/OUT):  The address of pointer to the thread handle to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+  OCIThreadCreate - OCIThread Thread Create
+  -----------------------------------------
+
+    Description
+
+      This creates a new thread.
+
+    Prototype
+
+      sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+                            void (*start)(dvoid *), dvoid *arg,
+                            OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        start(IN):    The function in which the new thread should begin
+                      execution.
+
+        arg(IN):      The argument to give the function pointed to by 'start'.
+
+        tid(IN/OUT):  If not NULL, gets the ID for the new thread.
+
+        tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      The new thread will start by executing a call to the function pointed
+      to by 'start' with the argument given by 'arg'.  When that function
+      returns, the new thread will terminate.  The function should not
+      return a value and should accept one parameter, a 'dvoid *'.
+
+      The call to OCIThreadCreate() must be matched by a call to
+      OCIThreadClose() if and only if tHnd is non-NULL.
+
+      If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+      calling thread because the timing of the spawned thread's termination
+      is unknown.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+  OCIThreadJoin - OCIThread Thread Join
+  -------------------------------------
+
+    Description
+
+      This function allows the calling thread to 'join' with another thread.
+      It blocks the caller until the specified thread terminates.
+
+    Prototype
+
+      sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN):    The 'OCIThreadHandle' of the thread to join with.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      The result of multiple threads all trying to join with the same thread is
+      undefined.
+
+
+  OCIThreadClose - OCIThread Thread Close
+  ---------------------------------------
+
+   Description
+
+     This function should be called to close a thread handle.
+
+   Prototype
+
+     sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):    The OCIThread thread handle to close.
+
+   Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+   Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      Both thread handle and the thread ID that was returned by the same call
+      to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+  OCIThreadHandleGet - OCIThread Thread Get Handle
+  ------------------------------------------------
+
+    Description
+
+      Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadHandleGet(dvoid *hndl, OCIError *err,
+                               OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):      If not NULL, the location to place the thread
+                           handle for the thread.
+
+     Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().   
+
+      The thread handle 'tHnd' retrieved by this function must be closed 
+      with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+      is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+  * Process initialization
+
+    OCIThread only requires that the process initialization function
+    ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+    multi-threaded application.  Failing to call 'OCIThreadProcessInit()' in
+    a single-threaded application is not an error.
+
+  * OCIThread initialization
+
+    Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+    context.
+
+    Also, remember that each call to 'OCIThreadInit()' must eventually be
+    matched by a call to 'OCIThreadTerm()'.
+
+  * Active vs. Passive Threading primitives
+
+    OCIThread client code written without using any active primitives can be
+    compiled and used without change on both single-threaded and
+    multi-threaded platforms.
+
+    OCIThread client code written using active primitives will only work
+    correctly on multi-threaded platforms.  In order to write a version of the
+    same application to run on single-threaded platform, it is necessary to 
+    branch the your code, whether by branching versions of the source file or 
+    by branching at runtime with the OCIThreadIsMulti() call.
+
+******************************************************************************/
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit();
+
+sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+boolean OCIThreadIsMulti();
+
+sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,  
+                         OCIThreadMutex **mutex); 
+
+sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err, 
+                            OCIThreadMutex **mutex);
+
+sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+                            OCIThreadMutex *mutex);
+
+sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+                            OCIThreadMutex *mutex);
+
+sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+                       OCIThreadKeyDestFunc destFn);
+
+sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err, 
+                          OCIThreadKey **key);
+
+sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                      dvoid **pValue);
+
+sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                      dvoid *value);
+
+sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdSet(dvoid *hndl, OCIError *err, 
+                     OCIThreadId *tidDest, OCIThreadId *tidSrc);
+
+sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdGet(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+                      OCIThreadId *tid1, OCIThreadId *tid2,
+                      boolean *result);
+
+sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+                      OCIThreadId *tid, boolean *result);
+
+sword OCIThreadHndInit(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+                      void (*start)(dvoid *), dvoid *arg,
+                      OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadHandleGet(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*------------------ Begin OCI Row Callback Interfaces ----------------------*/
+
+typedef sword (*OCIBindRowCallback)(dvoid *ctx);
+typedef sword (*OCIFetchRowCallback)(dvoid *ctx);
+
+/*------------------ Begin OCI Row Callback Interfaces ----------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(dvoid *ctx, OCISubscription *subscrhp, 
+                                     dvoid *pay, ub4 payl, 
+                                     dvoid *desc, ub4 mode);
+
+sword OCISubscriptionRegister(OCISvcCtx *svchp, OCISubscription **subscrhpp, 
+                              ub2 count, OCIError *errhp, ub4 mode);
+
+
+sword OCISubscriptionPost(OCISvcCtx *svchp, OCISubscription **subscrhpp, 
+                              ub2 count, OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionUnRegister(OCISvcCtx *svchp, OCISubscription *subscrhp, 
+                              OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionDisable(OCISubscription *subscrhp, 
+                           OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionEnable(OCISubscription *subscrhp, 
+                          OCIError *errhp, ub4 mode);
+
+/*------------------- End OCI Publish/Subscribe Interfaces ------------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+/*--------------------- Actual Prototypes -----------------------------------*/
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime, 
+                         ub1 *hr, ub1 *mm, ub1 *ss, ub4 *fsec);
+
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err,  CONST OCIDateTime *date, 
+                 sb2 *yr, ub1 *mnth, ub1 *dy );
+
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,
+                                   CONST OCIDateTime *datetime,
+                                   sb1 *hr,sb1 *mm);
+
+sword OCIDateTimeConstruct(dvoid  *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err, 
+                              OCIDateTime *sys_date );
+
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from, 
+                       OCIDateTime *to);
+
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                        CONST OraText *fmt, ub1 fmt_length, ub1 fsprec, 
+                        CONST OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str, 
+             size_t dstr_length, CONST OraText *fmt, ub1 fmt_length,
+             CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1, 
+                     CONST OCIDateTime *date2,  sword *result );
+
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                 ub4 *valid );
+
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+                                OCIDateTime *outdate);
+
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1, 
+                OCIDateTime *indate2,    OCIInterval *inter);
+
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+         OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+         OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend, 
+                            OCIInterval *subtrahend, OCIInterval *result );
+
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1, 
+                        OCIInterval *addend2, OCIInterval *result );
+
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                        OCINumber *nfactor, OCIInterval *result );
+
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend, 
+                OCINumber *divisor, OCIInterval *result );
+
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1, 
+                        OCIInterval *inter2, sword *result );
+
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, OCIInterval *inter, 
+                        OCINumber *number);
+
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr, 
+                size_t str_len, OCIInterval *result );
+
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                         ub1 lfprec, ub1 fsprec, 
+                        OraText *buffer, size_t buflen, size_t *resultlen );
+
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err,CONST OCIInterval *inter, 
+                        OCINumber *number);
+
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+                         ub4 *valid );
+
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err, CONST OCIInterval *ininter,
+                        OCIInterval *outinter );
+
+sword OCIIntervalSetYearMonth(dvoid *hndl, OCIError *err, sb4 yr, sb4 mnth,
+                        OCIInterval *result );
+
+sword OCIIntervalGetYearMonth(dvoid *hndl, OCIError *err, sb4 *yr, sb4 *mnth,
+                        CONST OCIInterval *result );
+
+sword OCIIntervalSetDaySecond(dvoid *hndl, OCIError *err, sb4 dy, sb4 hr,
+                        sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result );
+
+sword OCIIntervalGetDaySecond(dvoid *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+                     sb4 *mm, sb4 *ss, sb4 *fsec, CONST OCIInterval *result );
+
+sword OCIDateTimeToArray(dvoid *hndl, OCIError *err,
+                         CONST OCIDateTime *datetime, CONST OCIInterval *reftz,
+                         ub1 *outarray, ub4 *len, ub1 fsprec);
+
+sword OCIDateTimeFromArray(dvoid *hndl, OCIError *err, ub1 *inarray, ub4 len,
+                           ub1 type, OCIDateTime *datetime,
+                           CONST OCIInterval *reftz, ub1 fsprec);
+
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, OCIError *err,
+                                 CONST OCIDateTime *datetime, 
+                                 ub1 *buf, ub4 *buflen);
+
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+                        size_t str_len, OCIInterval *result);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*----------------- Connection Pooling prototypes ---------------------------*/
+sword OCIConnectionPoolCreate(OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                              OraText **poolName, sb4 *poolNameLen,  
+                              CONST OraText *dblink, sb4 dblinkLen,
+                              ub4 connMin, ub4 connMax, ub4 connIncr,
+                              CONST OraText *poolUserName, sb4 poolUserLen,
+                              CONST OraText *poolPassword, sb4 poolPassLen,
+                              ub4 mode);
+
+sword OCIConnectionPoolDestroy(OCICPool *poolhp,
+                               OCIError *errhp, ub4 mode);
+
+/*----------------- End Connection Pooling prototypes -----------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISPool *spoolhp, 
+                            OraText **poolName, ub4 *poolNameLen, 
+                            CONST OraText *connStr, ub4 connStrLen,
+                            ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                            OraText *userid, ub4 useridLen,
+                            OraText *password, ub4 passwordLen,
+                            ub4 mode);
+                                                  
+sword OCISessionPoolDestroy (OCISPool *spoolhp,
+                             OCIError *errhp,
+                             ub4 mode);
+                             
+sword OCISessionGet (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                     OCIAuthInfo *authhp,
+                     OraText *poolName, ub4 poolName_len, 
+                     CONST OraText *tagInfo, ub4 tagInfo_len,
+                     OraText **retTagInfo, ub4 *retTagInfo_len,
+                     boolean *found, ub4 mode);
+
+sword OCISessionRelease (OCISvcCtx *svchp, OCIError *errhp,
+                         OraText *tag, ub4 tag_len,
+                         ub4 mode);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+/*-------------------------------- OCIPing ----------------------------------*/
+sword OCIPing (OCISvcCtx *svchp, OCIError *errhp);
+
+
+/*----------------- Kerberos Authentication prototypes ----------------------*/
+
+sword OCIKerbAttrSet(OCISession *trgthndlp, ub4 cred_use, ub1 *ftgt_ticket, 
+                     ub4 ticket_len, ub1 *session_key, ub4 skey_len, 
+                     ub2 ftgt_keytype, ub4 ftgt_ticket_flags, 
+                     sb4 ftgt_auth_time, sb4 ftgt_start_time, 
+                     sb4 ftgt_end_time, sb4 ftgt_renew_time, 
+                     text *ftgt_client_principal, 
+                     ub4 ftgt_client_principal_len, text *ftgt_client_realm,
+                     ub4 ftgt_client_realm_len, OCIError *errhp);
+
+/*------------------- End Kerberos Authentication prototypes ----------------*/
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+            /* the following functions are depracated and should not be used */
+#ifdef NEVER
+sword   OCIStmtBindByPos  (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                  ub4 position, dvoid *valuep, sb4 value_sz,
+                  ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+                  ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+sword   OCIStmtBindByName  (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                  CONST OraText *placeholder, sb4 placeh_len, dvoid *valuep, 
+                  sb4 value_sz, ub2 dty, dvoid *indp, ub2 *alenp, 
+                  ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   ocidefn  (OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+                  ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+                  dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+#endif /* NEVER */
+
+#endif                                                       /* OCIAP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h b/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h
new file mode 100644
index 0000000..c1e6978
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h
@@ -0,0 +1,157 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ociapr.h,v 1.3 2005/05/06 16:48:56 karine Exp $ 
+ */
+
+/* Copyright (c) 1991, 1996, 1998, 2000 by Oracle Corporation */
+/*
+   NAME
+     ociapr.h
+   MODIFIED   (MM/DD/YY)
+    dsaha      05/19/00 -  Fix lint
+    sgollapu   05/19/98 -  Change text to OraText
+    dchatter   11/10/95 -  add ognfd() - get native fd
+    lchidamb   04/06/95 -  drop maxdsz from obindps/odefinps
+    slari      04/07/95 -  add opinit
+    dchatter   03/08/95 -  osetpi and ogetpi
+    lchidamb   12/09/94 -  add obindps() and odefinps()
+    dchatter   03/06/95 -  merge changes from branch 1.1.720.2
+    dchatter   11/14/94 -  merge changes from branch 1.1.720.1
+    dchatter   02/08/95 -  olog call; drop onblon
+    dchatter   10/31/94 -  new functions for non-blocking oci
+    rkooi2     11/27/92 -  Changing datatypes to agree with ocidef.h 
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/18/92 -  Changed to agree with oci.c 
+    sjain      03/16/92 -  Creation 
+*/
+/*
+ *  Declare the OCI functions.
+ *  Prototype information is included.
+ *  Use this header for ANSI C compilers.
+ */
+
+#ifndef OCIAPR
+#define OCIAPR
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif 
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif 
+
+/*
+ * Oci BIND (Piecewise or with Skips) 
+ */
+sword  obindps(struct cda_def *cursor, ub1 opcode, OraText *sqlvar, 
+	       sb4 sqlvl, ub1 *pvctx, sb4 progvl, 
+	       sword ftype, sword scale,
+	       sb2 *indp, ub2 *alen, ub2 *arcode, 
+	       sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip,
+	       ub4 maxsiz, ub4 *cursiz,
+	       OraText *fmt, sb4 fmtl, sword fmtt);
+sword  obreak(struct cda_def *lda);
+sword  ocan  (struct cda_def *cursor);
+sword  oclose(struct cda_def *cursor);
+sword  ocof  (struct cda_def *lda);
+sword  ocom  (struct cda_def *lda);
+sword  ocon  (struct cda_def *lda);
+
+
+/*
+ * Oci DEFINe (Piecewise or with Skips) 
+ */
+sword  odefinps(struct cda_def *cursor, ub1 opcode, sword pos,ub1 *bufctx,
+		sb4 bufl, sword ftype, sword scale, 
+		sb2 *indp, OraText *fmt, sb4 fmtl, sword fmtt, 
+		ub2 *rlen, ub2 *rcode,
+		sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip);
+sword  odessp(struct cda_def *cursor, OraText *objnam, size_t onlen,
+              ub1 *rsv1, size_t rsv1ln, ub1 *rsv2, size_t rsv2ln,
+              ub2 *ovrld, ub2 *pos, ub2 *level, OraText **argnam,
+              ub2 *arnlen, ub2 *dtype, ub1 *defsup, ub1* mode,
+              ub4 *dtsiz, sb2 *prec, sb2 *scale, ub1 *radix,
+              ub4 *spare, ub4 *arrsiz);
+sword  odescr(struct cda_def *cursor, sword pos, sb4 *dbsize,
+                 sb2 *dbtype, sb1 *cbuf, sb4 *cbufl, sb4 *dsize,
+                 sb2 *prec, sb2 *scale, sb2 *nullok);
+sword  oerhms   (struct cda_def *lda, sb2 rcode, OraText *buf,
+                 sword bufsiz);
+sword  oermsg   (sb2 rcode, OraText *buf);
+sword  oexec    (struct cda_def *cursor);
+sword  oexfet   (struct cda_def *cursor, ub4 nrows,
+                 sword cancel, sword exact);
+sword  oexn     (struct cda_def *cursor, sword iters, sword rowoff);
+sword  ofen     (struct cda_def *cursor, sword nrows);
+sword  ofetch   (struct cda_def *cursor);
+sword  oflng    (struct cda_def *cursor, sword pos, ub1 *buf,
+                 sb4 bufl, sword dtype, ub4 *retl, sb4 offset);
+sword  ogetpi   (struct cda_def *cursor, ub1 *piecep, dvoid **ctxpp, 
+                 ub4 *iterp, ub4 *indexp);
+sword  oopt     (struct cda_def *cursor, sword rbopt, sword waitopt);
+sword  opinit   (ub4 mode);
+sword  olog     (struct cda_def *lda, ub1* hda,
+                 OraText *uid, sword uidl,
+                 OraText *pswd, sword pswdl, 
+                 OraText *conn, sword connl, 
+                 ub4 mode);
+sword  ologof   (struct cda_def *lda);
+sword  oopen    (struct cda_def *cursor, struct cda_def *lda,
+                 OraText *dbn, sword dbnl, sword arsize,
+                 OraText *uid, sword uidl);
+sword  oparse   (struct cda_def *cursor, OraText *sqlstm, sb4 sqllen,
+                 sword defflg, ub4 lngflg);
+sword  orol     (struct cda_def *lda);
+sword  osetpi   (struct cda_def *cursor, ub1 piece, dvoid *bufp, ub4 *lenp);
+
+void sqlld2     (struct cda_def *lda, OraText *cname, sb4 *cnlen);
+void sqllda     (struct cda_def *lda);
+
+/* non-blocking functions */
+sword onbset    (struct cda_def *lda ); 
+sword onbtst    (struct cda_def *lda ); 
+sword onbclr    (struct cda_def *lda ); 
+sword ognfd     (struct cda_def *lda, dvoid *fdp);
+
+
+/* 
+ * OBSOLETE CALLS 
+ */
+
+/* 
+ * OBSOLETE BIND CALLS
+ */
+sword  obndra(struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, ub2 *alen, ub2 *arcode, ub4 maxsiz,
+                 ub4 *cursiz, OraText *fmt, sword fmtl, sword fmtt);
+sword  obndrn(struct cda_def *cursor, sword sqlvn, ub1 *progv,
+                 sword progvl, sword ftype, sword scale, sb2 *indp,
+                 OraText *fmt, sword fmtl, sword fmtt);
+sword  obndrv(struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, OraText *fmt, sword fmtl, sword fmtt);
+
+/*
+ * OBSOLETE DEFINE CALLS
+ */
+sword  odefin(struct cda_def *cursor, sword pos, ub1 *buf,
+	      sword bufl, sword ftype, sword scale, sb2 *indp,
+	      OraText *fmt, sword fmtl, sword fmtt, ub2 *rlen, ub2 *rcode);
+
+/* older calls ; preferred equivalent calls above */
+
+sword  oname    (struct cda_def *cursor, sword pos, sb1 *tbuf,
+                 sb2 *tbufl, sb1 *buf, sb2 *bufl);
+sword  orlon    (struct cda_def *lda, ub1 *hda, 
+                 OraText *uid, sword uidl, 
+                 OraText *pswd, sword pswdl, 
+                 sword audit);
+sword  olon     (struct cda_def *lda, OraText *uid, sword uidl,
+                 OraText *pswd, sword pswdl, sword audit);
+sword  osql3    (struct cda_def *cda, OraText *sqlstm, sword sqllen);
+sword  odsc     (struct cda_def *cursor, sword pos, sb2 *dbsize,
+                 sb2 *fsize, sb2 *rcode, sb2 *dtype, sb1 *buf,
+                 sb2 *bufl, sb2 *dsize);
+
+#endif /* OCIAPR */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h
new file mode 100644
index 0000000..1fde105
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h
@@ -0,0 +1,888 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocidef.h,v 1.3 2005/05/06 16:48:56 karine Exp $ ocidef.h 
+ */
+
+/* Copyright (c) 1981, 2003, Oracle Corporation.  All rights reserved.  */
+/* Copyright (c) 1984, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/*
+NAME
+  ocidef
+CONTENTS
+  Oracle Call Interface cursor area and LDA definitions
+NOTES
+  none
+OWNER
+  Oates
+DATE
+  09/07/82
+MODIFIED
+    srseshad   03/25/03  - convert oci public api to ansi
+    csteinba   11/05/02  - bug 2521931: redefine OTYACL
+    aahluwal   06/03/02  - bug 2360115
+    bpalaval   02/08/01  - Change text to oratext.
+    chliang    02/01/01  - fix olint error.
+    bpalaval   11/16/00  - Bug 1244685 : Fix ALTER CLUSTER issue..
+    slari      11/08/00  - remove functions duplicated in ociapr.h
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    skmishra   04/23/97 -  Provide C++ compatibility
+    lchidamb   06/26/96 -  put upidef.h, riddef.h within #ifndef
+    slari      06/12/96 -  add ocigft_getFcnType
+    dchatter   11/10/95 -  ocignfd - oci get native file descriptor
+    slari      05/11/95 -  change OCIEVDEF/OCIEVTSF to UPIEVDEF/UPIEVTSF
+    dchatter   04/06/95 -  add ifdef flags around OCI_flags
+    lchidamb   04/06/95 -  drop maxdsz from ocibndps/ocidfnps
+    slari      04/07/95 -  rename opinit to ocipin
+    slari      03/13/95 -  thread safety changes
+    dchatter   03/08/95 -  piece definitions OCI_*_PIECE
+    lchidamb   12/06/94 -  add support for binding/defining with skips
+    dchatter   03/06/95 -  merge changes from branch 1.12.720.1
+    dchatter   02/06/95 -  add defines for login mode parameters
+    dchatter   07/06/94 -  Deleting CRSCHK, with refcursor, no way to set this
+    dchatter   06/13/94 -  add a new LDA flag LDANBL
+    rkooi      11/18/92 -  update ocidpr interface 
+    mmoore     10/31/92 -  add ocidpr 
+    gpongrac   11/17/92 -  fix oexfet prototype 
+    sjain      01/03/92 -  Add ocibra 
+    rjenkins   11/04/91 -  adding prototypes for oparse and oexfet 
+    sjain      04/15/91 -         Change ocistf proto 
+    sjain      04/01/91 -         Rearrange oty codes. Add new ones 
+    Jain       12/03/90 - Add #define for new describe call
+    Jain       11/29/90 - Add new function code for the new oci calls
+    Mendels    01/20/89 - fix 19170: make ocitbl CONST_DATA
+    Kabcene    01/27/88 - change interfaces to match V5
+    Navab      12/09/87 - add a parameter to ocierr call
+    Navab      11/30/87 - add ocierr, rename ocioer
+    Navab      10/08/87 - add prototypes for procedure declarations
+    Howard     09/07/87 - endif blah
+    Howard     05/11/87 - Add OTY types
+    Howard     04/27/87 - move ocldef defines here
+    Oates      10/15/85 - Add OCANCEL
+    Oates      09/30/85 - Implement ORA*Net
+    Oates      06/27/85 - Make datatype compatible with upidef.h
+    Andy       05/07/85 - delete CSRFBPIC
+*/
+
+#ifndef UPIDEF 
+#include <upidef.h>
+#endif
+
+#ifndef RIDDEF
+#include <riddef.h>
+#endif
+
+#include <ociapr.h>
+
+#ifndef OCIDEF
+#define OCIDEF
+ 
+ 
+#define CSRCHECK 172                                   /* csrdef is a cursor */
+#define LDACHECK 202                          /* csrdef is a login data area */
+struct csrdef
+{
+   b2      csrrc;                /* return code: v2 codes, v4 codes negative */
+   ub2     csrft;                                           /* function type */
+   ub4     csrrpc;                                   /* rows processed count */
+   ub2     csrpeo;                                     /* parse error offset */
+   ub1     csrfc;                                           /* function code */
+   ub1     csrlfl;                     /* lda flag to indicate type of login */
+   ub2     csrarc;                        /* actual untranslated return code */
+   ub1     csrwrn;                                          /* warning flags */
+   ub1     csrflg;                                           /* error action */
+   word    csrcn;                                           /* cursor number */
+   riddef  csrrid;                                        /* rowid structure */
+   word    csrose;                                /* os dependent error code */
+   ub1     csrchk;                      /* check byte = CSRCHECK - in cursor */
+                                        /* check byte = LDACHECK - in    LDA */
+   struct hstdef *csrhst;                              /* pointer to the hst */
+};
+typedef struct csrdef csrdef;
+typedef struct csrdef ldadef;                    /* lda is the same as a csr */
+ 
+ 
+/* values for csrlfl */
+#define LDAFLG 1                                            /* ...via ologon */
+#define LDAFLO 2                                     /* ...via olon or orlon */
+#define LDANBL 3                                  /* ...nb logon in progress */
+ 
+/* valuses for crsfc */
+#define csrfpa 2                                                  /* ...OSQL */
+#define csrfex 4                                                 /* ...OEXEC */
+#define csrfbi 6                                                 /* ...OBIND */
+#define csrfdb 8                                                /* ...ODFINN */
+#define csrfdi 10                                               /* ...ODSRBN */
+#define csrffe 12                                               /* ...OFETCH */
+#define csrfop 14                                                /* ...OOPEN */
+#define csrfcl 16                                               /* ...OCLOSE */
+#define csrfds 22                                                 /* ...ODSC */
+#define csrfnm 24                                                /* ...ONAME */
+#define csrfp3 26                                                /* ...OSQL3 */
+#define csrfbr 28                                               /* ...OBNDRV */
+#define csrfbx 30                                               /* ...OBNDRN */
+/*#defe csrfdf 32*/                                                  /* ???? */
+#define csrfso 34                                                 /* ...OOPT */
+#define csrfre 36                                               /* ...ORESUM */
+#define csrfbn 50                                               /* ...OBINDN */
+#define csrfca 52                                               /* ..OCANCEL */
+#define csrfsd 54                                                 /* ..OSQLD */
+#define csrfef 56                                                /* ..OEXFEN */
+#define csrfln 58                                                 /* ..OFLNG */
+#define csrfdp 60                                                /* ..ODSCSP */
+#define csrfba 62                                                /* ..OBNDRA */
+#define csrfbps 63                                               /*..OBINDPS */
+#define csrfdps 64                                              /*..ODEFINPS */
+#define csrfgpi 65                                              /* ...OGETPI */
+#define csrfspi 66                                              /* ...OSETPI */
+
+/* values for csrwrn */
+#define CSRWANY  0x01                         /* there is a warning flag set */
+#define CSRWTRUN 0x02                           /* a data item was truncated */
+#define CSRWNVIC 0x04      /* NULL values were used in an aggregate function */
+#define CSRWITCE 0x08           /* column count not equal to into list count */
+#define CSRWUDNW 0x10               /* update or delete without where clause */
+#define CSRWRSV0 0x20
+#define CSRWROLL 0x40                                   /* rollback required */
+#define CSRWRCHG 0x80       /* change after query start on select for update */
+ 
+/* values fro csrflg */
+#define CSRFSPND 0x01                         /* current operation suspended */
+#define CSRFATAL 0x02            /* fatal operation: transaction rolled back */
+#define CSRFBROW 0x04                              /* current row backed out */
+#define CSRFREFC 0x08     /* ref cursor type CRSCHK disabled for this cursor */
+#define CSRFNOAR 0x10     /* ref cursor type binds, so no array bind/execute */
+ 
+/* define function codes; in order of octdef.h */
+#define OTYCTB 1                                             /* CREATE TABLE */
+#define OTYSER 2                                                 /* set role */
+#define OTYINS 3                                                   /* INSERT */
+#define OTYSEL 4                                                   /* SELECT */
+#define OTYUPD 5                                                   /* UPDATE */
+#define OTYDRO 6                                                /* drop role */
+#define OTYDVW 7                                                /* DROP VIEW */
+                                                  /* once was validate index */
+                                                /* once was create partition */
+                                                 /* once was alter partition */
+#define OTYDTB 8                                               /* DROP TABLE */
+                                                     /* once was alter space */
+                                                      /* once was drop space */
+#define OTYDEL 9                                                   /* DELETE */
+#define OTYCVW 10                                             /* create view */
+#define OTYDUS 11                                               /* drop user */
+#define OTYCRO 12                                             /* create role */
+#define OTYCSQ 13                                         /* create sequence */
+#define OTYASQ 14                                          /* alter sequence */
+#define OTYACL 15                                           /* alter cluster */
+#define OTYDSQ 16                                           /* drop sequence */
+#define OTYCSC 17                                           /* create schema */
+#define OTYCCL 18                                          /* CREATE CLUSTER */
+                                                   /* once was alter cluster */
+#define OTYCUS 19                                             /* create user */
+#define OTYCIX 20                                            /* CREATE INDEX */
+#define OTYDIX 21                                              /* DROP INDEX */
+#define OTYDCL 22                                            /* DROP CLUSTER */
+#define OTYVIX 23                                          /* validate index */
+#define OTYCPR 24                                        /* create procedure */
+#define OTYAPR 25                                         /* alter procedure */
+#define OTYATB 26                                             /* alter table */
+                                                        /* once was evaluate */
+#define OTYXPL 27                                                 /* explain */
+#define OTYGRA 28                                                   /* grant */
+#define OTYREV 29                                                  /* revoke */
+#define OTYCSY 30                                          /* create synonym */
+#define OTYDSY 31                                            /* drop synonym */
+#define OTYASY 32                                 /* alter system switch log */
+#define OTYSET 33                                         /* set transaction */
+#define OTYPLS 34                                          /* pl/sql execute */
+#define OTYLTB 35                                                    /* lock */
+#define OTYNOP 36                                                    /* noop */
+#define OTYRNM 37                                                  /* rename */
+#define OTYCMT 38                                                 /* comment */
+#define OTYAUD 39                                                   /* audit */
+#define OTYNOA 40                                                /* no audit */
+#define OTYAIX 41                                             /* ALTER INDEX */
+#define OTYCED 42                                /* create external database */
+#define OTYDED 43                                  /* drop external database */
+#define OTYCDB 44                                         /* create database */
+#define OTYADB 45                                          /* alter database */
+#define OTYCRS 46                                 /* create rollback segment */
+#define OTYARS 47                                  /* alter rollback segment */
+#define OTYDRS 48                                   /* drop rollback segment */
+#define OTYCTS 49                                       /* create tablespace */
+#define OTYATS 50                                        /* alter tablespace */
+#define OTYDTS 51                                         /* drop tablespace */
+#define OTYASE 52                                           /* alter session */
+#define OTYAUR 53                                              /* alter user */
+#define OTYCWK 54                                           /* commit (work) */
+#define OTYROL 55                                                /* rollback */
+#define OTYSPT 56                                               /* savepoint */
+ 
+/* For number greater than 56 the the type is the same as defined in 
+** octdef.h for that number. So for completion look at octdef.h 
+*/
+
+#define OTYDEV OTYCVW                       /* old DEFINE VIEW = create view */
+ 
+/* FUNCTION CODES */
+#define OCLFPA  2                                            /* parse - OSQL */
+#define OCLFEX  4                                         /* execute - OEXEC */
+#define OCLFBI  6                                    /* BIND by name - OBIND */
+#define OCLFDB  8                                 /* define buffer -  ODEFIN */
+#define OCLFDI  10                                   /* describe item - ODSC */
+#define OCLFFE  12                                         /* fetch - OFETCH */
+#define OCLFOC  14                                    /* open cursor - OOPEN */
+#       define OCLFLI  OCLFOC            /* old name for open cursor - OOPEN */
+#define OCLFCC  16                                  /* close cursor - OCLOSE */
+#       define OCLFLO  OCLFCC          /* old name for close cursor - OCLOSE */
+#define OCLFDS  22                                        /* describe - ODSC */
+#define OCLFON  24                     /* get table and column names - ONAME */
+#define OCLFP3  26                                          /* parse - OSQL3 */
+#define OCLFBR  28                        /* bind reference by name - OBNDRV */
+#define OCLFBX  30                        /* bind referecne numeric - OBNDRN */
+#define OCLFSO  34                                /* special function - OOPT */
+#define OCLFRE  36                                        /* resume - ORESUM */
+#define OCLFBN  50                                                  /* bindn */
+#define OCLFMX  52                                /* maximum function number */
+
+#ifdef NEVER                                                 /* unused codes */
+# define OCLFLK  18                           /* open  for kernel operations */
+# define OCLFEK  20                             /* execute kernel operations */
+# define OCLFOK  22                                          /* kernel close */
+# define OCLFIN  28                                       /* logon to oracle */
+# define OCLFOF  30                                    /* logoff from oracle */
+# define OCLFAX  32                               /* allocate a context area */
+# define OCLFPI  34                                  /* page in context area */
+# define OCLFIS  36                                  /* special system logon */
+# define OCLFCO  38                          /* cancel the current operation */
+# define OCLFGI  40                                       /* get database id */
+# define OCLFJN  42                                     /* journal operation */
+# define OCLFCL  44                       /* cleanup prior execute operation */
+# define OCLFMC  46                                     /* map a cursor area */
+# define OCLFUC  48                  /* unmap cursor and restore user maping */
+#endif /*NEVER                                           *//* obsolete codes */
+ 
+
+/* values for ocimode in ocipin call */
+
+#define OCIEVDEF UPIEVDEF           /* default : non-thread safe enivronment */
+#define OCIEVTSF UPIEVTSF                         /* thread-safe environment */
+
+
+/* OCIL* flags used to determine the mode of login, using ocilog().
+** Currently defined only for non-blocking and thread-safe logins.
+*/
+
+#define OCILMDEF        UPILMDEF                   /* default, regular login */
+#define OCILMNBL        UPILMNBL                       /* non-blocking logon */
+#define OCILMESY        UPILMESY            /* thread safe but external sync */
+#define OCILMISY        UPILMISY                  /* internal sync, we do it */
+#define OCILMTRY        UPILMTRY        /* try to, but do not block on mutex */
+
+
+/* 
+ * since sqllib uses both ocidef and ocidfn the following defines
+ * need to be guarded
+ */
+#ifndef OCI_FLAGS 
+#define OCI_FLAGS
+
+/* OCI_*_PIECE defines the piece types that are returned or set
+*/
+
+#define OCI_ONE_PIECE   UPI_ONE_PIECE     /* there or this is the only piece */
+#define OCI_FIRST_PIECE UPI_FIRST_PIECE          /* the first of many pieces */
+#define OCI_NEXT_PIECE  UPI_NEXT_PIECE            /* the next of many pieces */
+#define OCI_LAST_PIECE  UPI_LAST_PIECE      /* the last piece of this column */
+#endif
+
+/*
+**  OCITAB: define return code pairs for version 2 to 3 conversions
+*/
+struct  ocitab
+{
+   b2   ocitv3;                                   /* Version 3/4 return code */
+   b2   ocitv2;                          /* Version 2 equivalent return code */
+};
+typedef struct ocitab ocitab;
+ 
+externref CONST_DATA ocitab ocitbl[];
+ 
+/* macros to check cursors and LDA's.  */
+/* macros to set error codes           */
+
+# define CRSCHK(c)     if ((c->csrchk != CSRCHECK)\
+                            && !bit(c->csrflg, CSRFREFC))\
+                          return(ocir32(c, OER(1001)))
+# define ldaerr(l, e)  ( l->csrrc = (b2)(-( l->csrarc = (ub2)(e)) ) )
+# define LDACHK(l)     if (l->csrchk != LDACHECK) \
+                          return(ldaerr(l, OER(1001)))
+ 
+
+/************************************************/
+/*         OCI PROCEDURE DECLARATIONS           */
+/************************************************/ 
+
+
+
+
+/*****************************/
+/*  Database logon/logout    */
+/*****************************/
+sword ocilog( /*_ ldadef *lda, struct hstdef *hst, oratext *uid, sword uidl, 
+                  oratext *psw, sword pswl, oratext* conn, sword connl,
+                  ub4 mode _*/);
+sword ocilon( /*_ ldadef *lda, oratext *uid, word uidl, oratext *psw, 
+                  word pswl, word audit _*/);
+sword  ocilgi( /*_ ldadef *lda, b2 areacount _*/ );
+sword ocirlo( /*_ ldadef *lda, struct hstdef *hst, oratext *uid, word uidl,
+            oratext *psw, word pswl, word audit _*/ );
+     /* ocilon - logon to oracle
+     ** ocilgi - version 2 compatible ORACLE logon call.
+     **          no login to ORACLE is performed: the LDA is initialized
+     ** ocirlo - version 5 compatible ORACLE Remote Login call,
+     **          oracle login is executed.
+     **   lda     - pointer to ldadef
+     **   uid     - user id [USER[/PASSWORD]]
+     **   uidl    - length of uid, if -1 strlen(uid) is used
+     **   psw     - password string; ignored if specified in uid
+     **   pswl    - length of psw, if -1 strlen(psw) is used
+     **   audit   - is not supported; the only permissible value is 0
+     **   areacount - unused
+     */
+
+sword ocilof( /*_ ldadef *lda _*/ );
+     /*
+     ** ocilof - disconnect from ORACLE
+     **   lda     - pointer to ldadef
+     */
+
+
+/*********************/
+/*   Error Messages  */
+/*********************/
+sword ocierr( /*_ ldadef *lda, b2 rcode, oratext *buffer, word bufl _*/ );
+sword ocidhe( /*_ b2 rcode, oratext *buffer _*/ );
+    /* 
+    ** Move the text explanation for an ORACLE error to a user defined buffer
+    **  ocierr - will return the message associated with the hstdef stored 
+    **           in the lda.
+    **  ocidhe - will return the message associated with the default host.
+    **    lda    - lda associated with the login session
+    **    rcode  - error code as returned by V3 call interface
+    **    buffer - address of a user buffer of at least 132 characters
+    */
+
+
+/***********************/
+/*  Cursor Open/Close  */
+/***********************/
+sword ociope( /*_ struct csrdef *cursor, ldadef *lda, oratext *dbn, word dbnl, 
+                 word areasize, oratext *uid, word uidl _*/ );
+
+sword ociclo( /*_ struct csrdef *cursor _*/ );
+   /* 
+   ** open or close a cursor.
+   **   cursor - pointer to csrdef
+   **   ldadef - pointer to ldadef
+   **   dbn    - unused
+   **   dbnl   - unused
+   **   areasize - if (areasize == -1)  areasize <- system default initial size
+   **              else if (areasize IN [1..256]) areasize <- areasize * 1024;
+   **              most applications should use the default size since context
+   **              areas are extended as needed until memory is exhausted.
+   **   uid    - user id
+   **   uidl   - userid length
+   */
+
+/***********************************/
+/*      CONTROL AND OPTIONS        */
+/***********************************/
+sword ocibre( /*_ ldadef *lda _*/ );
+   /*
+   **  ocibrk - Oracle Call Interface send BReaK Sends a break to
+   **  oracle.  If oracle is  active,  the  current  operation  is
+   **  cancelled.  May be called  asynchronously.   DOES  NOT  SET
+   **  OERRCD in the hst.  This is because ocibrk  may  be  called
+   **  asynchronously.  Callers must test the return code.
+   **    lda  - pointer to a ldadef 
+   */
+
+sword ocican( /*_ struct csrdef *cursor _*/ );
+   /*
+   **  cancel the operation on the cursor, no additional OFETCH calls
+   **  will be issued for the existing cursor without an intervening 
+   **  OEXEC call.
+   **   cursor  - pointer to csrdef
+   */
+
+sword ocisfe( /*_ struct csrdef *cursor, word erropt, word waitopt _*/ );
+   /* 
+   ** ocisfe - user interface set error options
+   ** set the error and cursor options.
+   ** allows user to set the options for dealing with fatal dml errors
+   ** and other cursor related options
+   ** see oerdef for valid settings
+   **   cursor  - pointer to csrdef
+   **   erropt  - error optionsn
+   **   waitopr - wait options
+   */
+
+
+/***************************************/
+/* COMMIT/ROLLBACK/AUTOCOMMIT          */
+/***************************************/
+sword   ocicom( /*_ ldadef *lda _*/ );
+sword   ocirol( /*_ ldadef *lda _*/ );
+   /*
+   ** ocicom - commit the current transaction
+   ** ocirol - roll back the current transaction
+   */
+ 
+sword   ocicon( /*_ ldadef *lda _*/ );
+sword   ocicof( /*_ ldadef *lda _*/ );
+   /*
+   ** ocicon - auto Commit ON
+   ** ocicof - auto Commit OFf
+   */
+
+
+ 
+/************************/
+/*     parsing          */
+/************************/
+sword    ocisq3( /*_ struct csrdef *cursor, oratext *sqlstm, word sqllen _*/ );
+   /*
+   ** ocisq3 - user interface parse sql statement
+   **   cursor - pointer to csrdef
+   **   sqlstm - pointer to SQL statement
+   **   sqllen - length of SQL statement.  if -1, strlen(sqlstm) is used
+   */
+
+
+
+/***************************/
+/*      BINDING            */
+/***************************/
+/* these are for the opcode in ocibndps, ocidfnps */
+#define OCI_PCWS 0
+#define OCI_SKIP 1
+
+sword ocibin( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl, 
+                  ub1 *progv, word progvl, word ftype, word scale, 
+                  oratext *fmt, word fmtl, word fmtt _*/ );
+sword  ocibrv( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl, 
+                   ub1 *progv, word progvl, word ftype, word scale, b2 *indp,
+                   oratext *fmt, word fmtl, word fmtt _*/ );
+sword  ocibra( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl, 
+                   ub1 *progv, word progvl, word ftype, word scale, 
+                   b2 *indp, ub2 *aln, ub2 *rcp, ub4 mal, ub4 *cal, 
+                   oratext *fmt, word fmtl, word fmtt _*/ );
+sword  ocibndps( /*_ struct csrdef *cursor, ub1 opcode, oratext *sqlvar, 
+                     sb4 sqlvl, ub1 *progv, sb4 progvl, word ftype, 
+                     word scale, b2 *indp, ub2 *aln, ub2 *rcp, sb4 pv_skip, 
+                     sb4 ind_skip, sb4 len_skip, sb4 rc_skip, ub4 mal, 
+                     ub4 *cal, oratext *fmt, sb4 fmtl, word fmtt _*/ );
+sword ocibnn ( /*_ struct csrdef *cursor, ub2 sqlvn, ub1 *progv, word progvl,
+                   word ftype, word scale, oratext *fmt, word fmtl, 
+                   word fmtt _*/ );
+sword  ocibrn( /*_ struct csrdef *cursor, word sqlvn, ub1 *progv, word progvl,
+                  word ftype, word scale, b2 *indp, oratext *fmt, word fmtl, 
+                  word fmtt _*/ );
+    /*
+    ** ocibin - bind by value by name
+    ** ocibrv - bind by reference by name
+    ** ocibra - bind by reference by name (array)
+    ** ocibndps - bind by reference by name (array) piecewise or with skips
+    ** ocibnn - bind by value numeric
+    ** ocibrn - bind by reference numeric
+    **
+    ** the contents of storage specified in bind-by-value calls are
+    ** evaluated immediately.
+    ** the addresses of storage specified in bind-by-reference calls are
+    ** remembered, and the contents are examined at every execute.
+    **
+    **  cursor  - pointer to csrdef
+    **  sqlvn   - the number represented by the name of the bind variables
+    **            for variables of the form :n or &n for n in [1..256)
+    **            (i.e. &1, :234).  unnecessarily using larger numbers
+    **            in the range wastes space.
+    **  sqlvar  - the name of the bind variable (:name or &name)
+    **  sqlval  - the length of the name;
+    **            in bindif -1, strlen(bvname) is used
+    **  progv   - pointer to the object to bind.
+    **  progvl  - length of object to bind.
+    **            in bind-by-value if specified as -1 then strlen(bfa) is
+    **              used (really only makes sends with character types)
+    **            in bind-by-value, if specified as -1 then UB2MAXVAL
+    **              is used.  Again this really makes sense only with
+    **              SQLT_STR.
+    **  ftype   - datatype of object
+    **  indp    - pointer to indicator variable.
+    **              -1     means to ignore bfa/bfl and bind NULL;
+    **              not -1 means to bind the contents of bfa/bfl
+    **              bind the contents pointed to by bfa
+    **  aln     - Alternate length pointer
+    **  rcp     - Return code pointer
+    **  mal     - Maximum array length
+    **  cal     - Current array length pointer
+    **  fmt     - format string
+    **  fmtl    - length of format string; if -1, strlen(fmt) is used
+    **  fmtt    - desired output type after applying forat mask. Not
+    **            really yet implemented
+    **  scale   - number of decimal digits in a cobol packed decimal (type 7)
+    **
+    ** Note that the length of bfa when bound as SQLT_STR is reduced
+    ** to strlen(bfa).
+    ** Note that trailing blanks are stripped of storage of SQLT_STR.
+    */
+    
+/***************************/
+/*        DESCRIBING       */
+/***************************/
+sword ocidsc ( /*_ struct csrdef *cursor, word pos, b2 *dbsize, b2 *fsize,
+             b2 *rcode, b2 *dtype, b1 *buf, b2 *bufl, b2 *dsize _*/ );
+sword ocidsr( /*_ struct csrdef *cursor, word pos, b2 *dbsize, b2 *dtype, 
+            b2 *fsize _*/ );
+sword   ocinam( /*_ struct csrdef *cursor, word pos, b1 *tbuf, b2 *tbufl,
+                b1 *buf, b2 *bufl _*/);
+    /*
+    **  ocidsc, ocidsr: Obtain information about a column
+    **  ocinam : get the name of a column
+    **   cursor  - pointer to csrdef
+    **   pos     - position in select list from [1..N]
+    **   dbsize  - place to store the database size
+    **   fsize   - place to store the fetched size
+    **   rcode   - place to store the fetched column returned code
+    **   dtype   - place to store the data type
+    **   buf     - array to store the column name
+    **   bufl    - place to store the column name length
+    **   dsize   - maximum display size
+    **   tbuf    - place to store the table name
+    **   tbufl   - place to store the table name length
+    */
+
+sword ocidsp ( /*_ struct csrdef *cursor, word pos, sb4 *dbsize, sb2 *dbtype,
+                   sb1 *cbuf, sb4 *cbufl, sb4 *dsize, sb2 *pre, sb2 *scl,
+                   sb2 *nul _*/);
+
+sword ocidpr(/*_ ldadef *lda, oratext *object_name, size_t object_length,
+                ptr_t reserved1, size_t reserved1_length, ptr_t reserved2,
+                size_t reserved2_length, ub2 *overload, ub2 *position,
+                ub2 *level, oratext **argument_name, ub2 *argument_length, 
+                ub2 *datatype, ub1 *default_supplied, ub1 *in_out, 
+                ub4 *length, sb2 *precision, sb2 *scale, ub1 *radix, 
+                ub4 *spare, ub4 *total_elements _*/);
+   /*
+   ** OCIDPR - User Program Interface: Describe Stored Procedure
+   **
+   ** This routine is used to obtain information about the calling
+   ** arguments of a stored procedure.  The client provides the 
+   ** name of the procedure using "object_name" and "database_name"
+   ** (database name is optional).  The client also supplies the 
+   ** arrays for OCIDPR to return the values and indicates the 
+   ** length of array via the "total_elements" parameter.  Upon return
+   ** the number of elements used in the arrays is returned in the 
+   ** "total_elements" parameter.  If the array is too small then 
+   ** an error will be returned and the contents of the return arrays 
+   ** are invalid.
+   **
+   **
+   **   EXAMPLE :
+   **
+   **   Client provides -
+   **
+   **   object_name    - SCOTT.ACCOUNT_UPDATE at BOSTON
+   **   total_elements - 100
+   **   
+   **
+   **   ACCOUNT_UPDATE is an overloaded function with specification :
+   **
+   **     type number_table is table of number index by binary_integer;
+   **     table account (account_no number, person_id number,
+   **                    balance number(7,2))
+   **     table person  (person_id number(4), person_nm varchar2(10))
+   **
+   **      function ACCOUNT_UPDATE (account number, 
+   **         person person%rowtype, amounts number_table,
+   **         trans_date date) return accounts.balance%type;
+   **
+   **      function ACCOUNT_UPDATE (account number, 
+   **         person person%rowtype, amounts number_table,
+   **         trans_no number) return accounts.balance%type;
+   **
+   **
+   **   Values returned -
+   **
+   **   overload position   argument  level  datatype length prec scale rad
+   **   -------------------------------------------------------------------
+   **          0        0                0   NUMBER     22    7     2   10
+   **          0        1   ACCOUNT      0   NUMBER     22    0     0    0
+   **          0        2   PERSON       0   RECORD      0    0     0    0
+   **          0        2     PERSON_ID  1   NUMBER     22    4     0   10
+   **          0        2     PERSON_NM  1   VARCHAR2   10    0     0    0
+   **          0        3   AMOUNTS      0   TABLE       0    0     0    0
+   **          0        3                1   NUMBER     22    0     0    0
+   **          0        4   TRANS_NO     0   NUMBER     22    0     0    0
+   **
+   **          1        0                0   NUMBER     22    7     2   10
+   **          1        1   ACCOUNT      0   NUMBER     22    0     0    0
+   **          1        2   PERSON       0   RECORD      0    0     0    0
+   **          1        2    PERSON_ID   1   NUMBER     22    4     0   10
+   **          1        2    PERSON_NM   1   VARCHAR2   10    0     0    0
+   **          1        3   AMOUNTS      0   TABLE       0    0     0    0
+   **          1        3                1   NUMBER     22    0     0    0
+   **          1        4   TRANS_DATE   0   NUMBER     22    0     0    0
+   **
+   **
+   **  OCIDPR Argument Descriptions -
+   **
+   **  ldadef           - pointer to ldadef
+   **  object_name      - object name, synonyms are also accepted and will 
+   **                     be translate, currently only procedure and function
+   **                     names are accepted, also NLS names are accepted.
+   **                     Currently, the accepted format of a name is 
+   **                     [[part1.]part2.]part3[@dblink] (required)
+   **  object_length    - object name length (required)
+   **  reserved1        - reserved for future use
+   **  reserved1_length - reserved for future use
+   **  reserved2        - reserved for future use
+   **  reserved2_length - reserved for future use
+   **  overload         - array indicating overloaded procedure # (returned)
+   **  position         - array of argument positions, position 0 is a 
+   **                     function return argument (returned)
+   **  level            - array of argument type levels, used to describe
+   **                     sub-datatypes of data structures like records
+   **                     and arrays (returned)
+   **  argument_name    - array of argument names, only returns first 
+   **                     30 characters of argument names, note storage
+   **                     for 30 characters is allocated by client (returned)
+   **  argument_length  - array of argument name lengths (returned)
+   **  datatype         - array of oracle datatypes (returned)
+   **  default_supplied - array indicating parameter has default (returned)
+   **                     0 = no default, 1 = default supplied
+   **  in_out           - array indicating if argument is IN or OUT (returned
+   **                     0 = IN param, 1 = OUT param, 2 = IN/OUT param
+   **  length           - array of argument lengths (returned)
+   **  precision        - array of precisions (if number type)(returned)
+   **  scale            - array of scales (if number type)(returned)
+   **  radix            - array of radix (if number type)(returned)
+   **  spare            - array of spares.
+   **  total_elements   - size of arrays supplied by client (required),
+   **                     total number of elements filled (returned)
+   */
+
+/*************************************/
+/* DEFINING                          */
+/*************************************/
+sword ocidfi( /*_ struct csrdef *cursor, word pos, ub1 *buf, word bufl,
+                  word ftype, b2 *rc, word scale _*/ );
+sword ocidfn( /*_ struct csrdef *cursor, word pos, ub1 *buf, word bufl,
+                 word ftype, word scale, b2 *indp, oratext *fmt, word fmtl,
+                 word fmtt, ub2 *rl, ub2 *rc _*/ );
+sword ocidfnps( /*_ struct csrdef *cursor, ub1 opcode, word pos, ub1 *buf, 
+                    sb4 bufl, word ftype, word scale,  
+                    b2 *indp, oratext *fmt, sb4 fmtl,
+                    word fmtt, ub2 *rl, ub2 *rc,
+                    sb4 pv_skip, sb4 ind_skip, sb4 len_skip, 
+                    sb4 rc_skip _*/ );
+
+
+   /*  Define a user data buffer using upidfn
+   **   cursor  - pointer to csrdef
+   **   pos     - position of a field or exp in the select list of a query
+   **   bfa/bfl - address and length of client-supplied storage
+                  to receive data
+   **   ftype   - user datatype
+   **   scale   - number of fractional digits for cobol packed decimals
+   **   indp    - place to store the length of the returned value. If returned
+   **             value is:
+   **             negative, the field fetched was NULL
+   **             zero    , the field fetched was same length or shorter than
+   **               the buffer provided
+   **             positive, the field fetched was truncated
+   **   fmt    - format string
+   **   fmtl   - length of format string, if -1 strlent(fmt) used
+   **   rl     - place to store column length after each fetch
+   **   rc     - place to store column error code after each fetch
+   **   fmtt   - fomat type
+   */
+ 
+/********************************/
+/*    PIECE INFORMATION GET/SET */
+/********************************/
+sword           ocigetpi( /*_ struct csrdef *cursor, ub1 *piecep,
+                              dvoid **ctxpp, ub4 *iterp, ub4 *indexp _*/ );
+sword           ocisetpi( /*_ struct csrdef *cursor, ub1 piece,
+                              dvoid *bufp, ub4 *lenp _*/ );
+
+
+/********************************/
+/*   EXECUTE                    */
+/********************************/
+sword ociexe( /*_ struct csrdef *cursor _*/ );
+sword ociexn( /*_ struct csrdef *cursor, word iters, word roff _*/ );
+sword ociefn( /*_ struct csrdef *cursor, ub4 nrows, word can, word exact _*/);
+    /* 
+    ** ociexe  - execute a cursor
+    ** ociexn  - execute a cursosr N times
+    **  cursor   - pointer to a csrdef
+    **  iters    - number of times to execute cursor
+    **  roff     - offset within the bind variable array at which to begin 
+    **             operations.
+    */
+
+
+/*********************************/
+/*     FETCHING                  */
+/*********************************/
+sword ocifet( /*_ struct csrdef *cursor _*/ );
+sword ocifen( /*_ struct csrdef *cursor, word nrows _*/ );
+    /* ocifet - fetch the next row
+    ** ocifen - fetch n rows 
+    ** cursor   - pointer to csrdef
+    ** nrows    - number of rows to be fetched
+    */
+
+sword ocilng(/*_ struct csrdef *cursor, word posit, ub1 *bfa, sb4 bfl,
+                 word dty, ub4 *rln, sb4 off _*/);
+
+/*********************************/
+/*         CONVERSION            */
+/*********************************/
+sword ocic32( /*_ struct csrdef *cursor _*/ );
+    /*
+    **   Convert selected version 3 return codes to the equivalent
+    **   version 2 code.
+    **   csrdef->csrrc is set to the converted code
+    **   csrdef->csrft is set to v2 oracle statment type
+    **   csrdef->csrrpc is set to the rows processed count
+    **   csrdef->csrpeo is set to error postion
+    ** 
+    **     cursor - pointer to csrdef
+    */
+
+
+sword ocir32( /*_ struct csrdef *cursor, word retcode _*/ );
+   /*   
+   ** Convert selected version 3 return codes to the equivalent version 2 
+   ** code.
+   **
+   **    cursor - pointer to csrdef
+   **    retcode - place to store the return code
+   */
+
+
+VOID ociscn( /*_ word **arglst, char *mask_addr, word **newlst _*/ );
+   /*
+   ** Convert call-by-ref to call-by-value:
+   ** takes an arg list and a mask address, determines which args need 
+   ** conversion to a value, and creates a new list begging at the address
+   ** of newlst.
+   **
+   **    arglst    - list of arguments
+   **    mast_addr _ mask address determines args needing conversion
+   **    newlst    - new list of args
+   */
+
+word     ocistf ( /*_ word typ, word bufl, word rdig, oratext *fmt, 
+                      struct csrdef *cursor, sword *err _*/ );
+/*  Convert a packed  decimal buffer  length  (bytes) and scale to a format
+**  string of the form mm.+/-nn, where  mm is the number of packed 
+**  decimal digits, and nn is the scaling factor.   A positive scale name 
+**  nn digits to the rights of the decimal; a negative scale means nn zeros 
+**  should be supplied to the left of the decimal.
+**     bufl   - length of the packed decimal buffer
+**     rdig   - number of fractional digits
+**     fmt    - pointer to a string holding the conversion format
+**     cursor - pointer to csrdef 
+**     err    - pointer to word storing error code
+*/ 
+
+
+/******************************************/
+/*         Non-blocking operations        */
+/******************************************/
+sword ocinbs( /*_ ldadef *lda _*/ );  /* set a connection to non-blocking   */
+sword ocinbt( /*_ ldadef *lda _*/ );  /* test if connection is non-blocking */
+sword ocinbc( /*_ ldadef *lda _*/ );  /* clear a connection to blocking     */
+sword ocinlo( /*_ ldadef *lda, struct hstdef *hst, oratext *conn,
+                  sword connl, oratext *uid, sword uidl,
+                  oratext *psw, sword pswl, sword audit _*/ );  
+              /* logon in non-blocking fashion */
+/* ocinlo allows an application to logon in non-blocking fashion.
+**   lda     - pointer to ldadef
+**   hst     - pointer to a 256 byte area, must be cleared to zero before call
+**   conn    - the database link (if specified @LINK in uid will be ignored)
+**   connl   - length of conn; if -1 strlen(conn) is used   
+**   uid     - user id [USER[/PASSWORD][@LINK]]
+**   uidl    - length of uid, if -1 strlen(uid) is used
+**   psw     - password string; ignored if specified in uid
+**   pswl    - length of psw, if -1 strlen(psw) is used
+**   audit   - is not supported; the only permissible value is 0
+*/
+
+/***************************************************/
+/*         Procedure Declaration for Pro*C         */
+/***************************************************/
+/* Note: The following routines are used in Pro*C and have the
+   same interface as their couterpart in OCI. 
+   Althought the interface follows for more details please refer 
+   to the above routines */
+
+/******************************************/
+/*         initialization/logon/logof     */
+/******************************************/
+sword ocipin( /*_ ub4 mode _*/ );
+
+sword ologin( /*_ ldadef *lda, b2 areacount _*/ );
+sword ologon( /*_ ldadef *lda, b2 areacount _*/ );
+
+/*****************************************/
+/*        Open/Close/Parse Cursor        */
+/*****************************************/
+
+/* 
+** ocisqd - oci delayed parse (Should be used only with deferred upi/oci)
+** FUNCTION: Call upidpr to delay the parse of the sql statement till the
+**           time that a call needs to be made to the kernel (execution or
+**           describe time )
+** RETURNS: Oracle return code.
+*/ 
+sword ocisq7(/*_ struct csrdef *cursor, oratext *sqlstm, sb4 sqllen,
+                 word defflg, ub4 sqlt _*/);
+
+/*****************************************/
+/*            Bind                       */
+/*****************************************/
+sword obind( /*_ struct csrdef *cursor, oratext *sqlvar, word sqlvl, 
+                 ub1 *progv, word progvl, word ftype, word scale, 
+                 oratext *fmt, word fmtl, word fmtt _*/ );
+sword obindn( /*_ struct csrdef *cursor, ub2 sqlvn, ub1 *progv, word progvl,
+                  word ftype, word scale, oratext *fmt, word fmtl, 
+                  word fmtt _*/ );
+
+/**********************************************/
+/*                 Define                     */
+/**********************************************/
+sword odfinn( /*_ struct csrdef *cursor, word pos, ub1 *buf, word bufl,
+                  word ftype, b2 *rc, word scale _*/ );
+
+/**********************************************/
+/*                 Describe                   */
+/**********************************************/
+sword odsrbn( /*_ struct csrdef *cursor, word pos, b2 *dbsize, b2 *dtype, 
+            b2 *fsize _*/ );
+
+
+/******************************************/
+/*         Non-blocking operations        */
+/******************************************/
+sword onblon( /*_ ldadef *lda, struct hstdef *hst, oratext *conn,
+                  sword connl, oratext *uid, sword uidl,
+                  oratext *psw, sword pswl, sword audit _*/ );  
+              /* logon in non-blocking fashion */
+sword ocignfd( /*_ ldadef *lda, dvoid *nfdp _*/);           /* get native fd */
+
+ub2   ocigft_getFcnType( /*_ ub2 oertyp _*/ );      /* get sql function code */
+
+#endif
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h
new file mode 100644
index 0000000..1826876
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h
@@ -0,0 +1,112 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocidem.h,v 1.3 2005/05/06 16:48:56 karine Exp $ 
+ */
+
+/* Copyright (c) 1991, 1996, 1997, 1999 by Oracle Corporation */
+/* Copyright (c) 1991, 1997, 1999 by Oracle Corporation */
+/*
+   NAME
+     ocidem.h - OCI demo header
+   MODIFIED   (MM/DD/YY)
+    whe        04/07/99 -  bug#810071
+    whe        03/19/99 -  lrg 32079 etc.: putting static back for oci_func_tab
+    nmacnaug   02/02/99 -  static declarations should not be in header files
+    mygopala   09/22/97 -  Fix for bug 550351
+    surman     03/14/97 -  Merge 413362 to 8.0.3
+    surman     11/08/96 -  413362: Add SS_64BIT_SERVER macro
+    emendez    04/07/94 -  merge changes from branch 1.6.710.1
+    emendez    02/02/94 -  Fix for bug 157576
+    jnlee      01/05/93 -  include oratypes.h once, make oci_func_tab static
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/22/92 -  Change text back to char to avoid casts 
+    rkooi2     10/20/92 -  Changes to make it portable 
+    sjain      03/16/92 -  Creation 
+*/
+
+/*
+ *  ocidem.h
+ *
+ *  Declares additional functions and data structures
+ *  used in the OCI C sample programs.
+ */
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif /* ORATYPES */
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif /* OCIDFN */
+
+#ifndef OCIDEM
+#define OCIDEM
+
+
+/*  internal/external datatype codes */
+#define VARCHAR2_TYPE            1
+#define NUMBER_TYPE              2
+#define INT_TYPE		 3
+#define FLOAT_TYPE               4
+#define STRING_TYPE              5
+#define ROWID_TYPE              11
+#define DATE_TYPE               12
+
+/*  ORACLE error codes used in demonstration programs */
+#define VAR_NOT_IN_LIST       1007
+#ifndef NO_DATA_FOUND
+#  define NO_DATA_FOUND         1403
+#endif
+#define NULL_VALUE_RETURNED   1405
+
+/*  some SQL and OCI function codes */
+#define FT_INSERT                3
+#define FT_SELECT                4
+#define FT_UPDATE                5
+#define FT_DELETE                9
+
+#define FC_OOPEN                14
+
+/*
+ *  OCI function code labels,
+ *  corresponding to the fc numbers
+ *  in the cursor data area.
+ */
+static CONST text  *oci_func_tab[] =  {(text *) "not used",
+/* 1-2 */       (text *) "not used", (text *) "OSQL",
+/* 3-4 */       (text *) "not used", (text *) "OEXEC, OEXN",
+/* 5-6 */       (text *) "not used", (text *) "OBIND",
+/* 7-8 */       (text *) "not used", (text *) "ODEFIN",
+/* 9-10 */      (text *) "not used", (text *) "ODSRBN",
+/* 11-12 */     (text *) "not used", (text *) "OFETCH, OFEN",
+/* 13-14 */     (text *) "not used", (text *) "OOPEN",
+/* 15-16 */     (text *) "not used", (text *) "OCLOSE",
+/* 17-18 */     (text *) "not used", (text *) "not used",
+/* 19-20 */     (text *) "not used", (text *) "not used",
+/* 21-22 */     (text *) "not used", (text *) "ODSC",
+/* 23-24 */     (text *) "not used", (text *) "ONAME",
+/* 25-26 */     (text *) "not used", (text *) "OSQL3",
+/* 27-28 */     (text *) "not used", (text *) "OBNDRV",
+/* 29-30 */     (text *) "not used", (text *) "OBNDRN",
+/* 31-32 */     (text *) "not used", (text *) "not used",
+/* 33-34 */     (text *) "not used", (text *) "OOPT",
+/* 35-36 */     (text *) "not used", (text *) "not used",
+/* 37-38 */     (text *) "not used", (text *) "not used",
+/* 39-40 */     (text *) "not used", (text *) "not used",
+/* 41-42 */     (text *) "not used", (text *) "not used",
+/* 43-44 */     (text *) "not used", (text *) "not used",
+/* 45-46 */     (text *) "not used", (text *) "not used",
+/* 47-48 */     (text *) "not used", (text *) "not used",
+/* 49-50 */     (text *) "not used", (text *) "not used",
+/* 51-52 */     (text *) "not used", (text *) "OCAN",
+/* 53-54 */     (text *) "not used", (text *) "OPARSE",
+/* 55-56 */     (text *) "not used", (text *) "OEXFET",
+/* 57-58 */     (text *) "not used", (text *) "OFLNG",
+/* 59-60 */     (text *) "not used", (text *) "ODESCR",
+/* 61-62 */     (text *) "not used", (text *) "OBNDRA",
+/* 63-64 */     (text *) "OBINDPS",  (text *) "ODEFINPS",
+/* 65-66 */     (text *) "OGETPI",   (text *) "OSETPI"
+};
+
+#endif      /* OCIDEM */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h
new file mode 100644
index 0000000..0364eec
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h
@@ -0,0 +1,251 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocidfn.h,v 1.3 2005/05/06 16:48:56 karine Exp $ 
+ */
+
+/* Copyright (c) 1991, 2002, Oracle Corporation.  All rights reserved.  */
+/* Copyright (c) 1991, 2002, Oracle Corporation.  All rights reserved.  */
+/*
+   NAME
+     ocidfn.h - OCI Definations
+   NOTES
+     Shipped to users.
+   MODIFIED   (MM/DD/YY)
+    srseshad   11/25/02 - change binary float/double codes
+    srseshad   11/14/02 - Add SQLT_IBFLOAT, SQLT_IBDOUBLE
+    mxyang     09/17/02 - grabtrans 'mmorsi_obj_float'
+    srseshad   09/06/02 - Add binary float/double
+    aahluwal   06/04/02 - bug 2360115
+    kmuthukk   05/02/00 - add SQLT_PNTY
+    amangal    07/30/99 - Merge into 8.1.6 : Bug 879031
+    tnbui      07/28/99 - Remove SQLT_TIMESTAMP_ITZ                            
+    tnbui      07/21/99 - SQLT_TIMESTAMP_LTZ                                   
+    tnbui      06/16/99 - TIMESTAMP WITH IMPLICIT TIME ZONE                    
+    whe        04/07/99 - bug#810075
+    whe        03/19/99 - lrg 32079 etc.: move HDA def from ocidem.h to ocidfn.
+    skmishra   05/10/98 -
+    vyanaman   04/16/98 - update sql92 datatypes
+    khnguyen   01/16/98 -
+    khnguyen   12/23/97 - SQLT* for datetimes and intervals
+    tanguyen   08/19/97 -
+    dchatter   03/18/97 -  porting exception 390897
+    dchatter   05/02/97 -   merge porting exception
+    dalpern    12/04/96 -   SQLCS_LIT_NULL added
+    cxcheng    11/14/96 -   add SQLT_BFILE/SQLT_CFILE to fix compile prob
+    cxcheng    11/12/96 -   add SQLT_NCO for named collection
+    lchidamb   10/17/96 -   add SQLT_VST and SQLT_ODT
+    sgollapu   10/14/96 -   Mutual exclusion of ocidfn and sqldef
+    sgollapu   10/07/96 -   OCI Simplification
+    aroy       09/09/96 -   add SQLCS* definitions
+    slari      08/07/96 -  add SQLT_RDD, rowid descriptor
+    slari      06/12/96 -  remove SQLT_TTBL
+    dchatter   04/21/96 -  prepare for merge into main
+    slari      08/24/95 -  b299432, define CDA_SIZE
+    zwalcott   02/28/96 -  add SQLT_BFILEE and SQLT_CFILEE.
+    lchidamb   02/22/96 -  make dtys consistent with dtydef.h
+    lchidamb   02/16/96 -  add SQLT_BFILEE and SQLT_CFILEE
+    lchidamb   01/30/96 -  rename new datatypes for v8
+    lchidamb   09/06/95 -  add new datatypes
+    slari      05/11/95 -  add OCI_EV_DEF and OCI_EV_TSF
+    dchatter   04/06/95 -  add ifdef flags around OCI_flags
+    dchatter   03/08/95 -  piece values
+    dchatter   03/06/95 -  merge changes from branch 1.2.720.3
+    jfbrown    02/17/95 -  merge changes from branch 1.2.720.2
+    dchatter   02/08/95 -  olog call modes
+    jfbrown    02/03/95 -  remove non-printable characters
+    lchidamb   12/06/94 -  merge changes from branch 1.2.720.1
+    lchidamb   10/04/94 -  added field chk to cda_head, cda_def
+    dchatter   07/05/94 -  SQLT_CUR added
+    rkooi2     11/27/92 -  Changing e* datatypes to s* 
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/22/92 -  Added #ifndef ORATYPES ... 
+    rkooi2     10/18/92 -  Changes to make it portable. 
+    sjain      03/16/92 -  Creation 
+*/
+
+/*
+ *  ocidfn.h
+ *
+ *  Common header file for OCI C sample programs.
+ *  This header declares the cursor and logon data area structure.
+ *  The types used are defined in <oratypes.h>.
+ *
+ */
+ 
+#ifndef OCIDFN
+#define OCIDFN
+
+#include <oratypes.h>
+
+/* The cda_head struct is strictly PRIVATE.  It is used
+   internally only. Do not use this struct in OCI programs. */
+
+struct cda_head {
+    sb2          v2_rc;
+    ub2          ft;
+    ub4          rpc;
+    ub2          peo;
+    ub1          fc;
+    ub1          rcs1;
+    ub2          rc;
+    ub1          wrn;
+    ub1          rcs2;
+    sword        rcs3;
+    struct {
+        struct {
+           ub4    rcs4;
+           ub2    rcs5;
+           ub1    rcs6;
+        } rd;
+        ub4    rcs7;
+        ub2    rcs8;
+    } rid;
+    sword        ose;
+    ub1           chk;
+    dvoid        *rcsp;
+};
+
+/*
+** Size of HDA area:
+** 512 for 64 bit arquitectures
+** 256 for 32 bit arquitectures
+*/
+
+#if defined(SS_64BIT_SERVER) || defined(__64BIT__)
+# define HDA_SIZE 512
+#else
+# define HDA_SIZE 256
+#endif
+
+#if defined(SS_64BIT_SERVER) || defined(__64BIT__)
+#define CDA_SIZE 88
+#else
+# define CDA_SIZE 64
+#endif
+
+/* the real CDA, padded to CDA_SIZE bytes in size */
+struct cda_def {
+    sb2          v2_rc;                                    /* V2 return code */
+    ub2          ft;                                    /* SQL function type */
+    ub4          rpc;                                /* rows processed count */
+    ub2          peo;                                  /* parse error offset */
+    ub1          fc;                                    /* OCI function code */
+    ub1          rcs1;                                        /* filler area */
+    ub2          rc;                                       /* V7 return code */
+    ub1          wrn;                                       /* warning flags */
+    ub1          rcs2;                                           /* reserved */
+    sword        rcs3;                                           /* reserved */
+    struct {                                              /* rowid structure */
+        struct {
+           ub4    rcs4;
+           ub2    rcs5;
+           ub1    rcs6;
+        } rd;
+        ub4    rcs7;
+        ub2    rcs8;
+    } rid;
+    sword        ose;                                 /* OSD dependent error */
+    ub1           chk;
+    dvoid        *rcsp;                          /* pointer to reserved area */
+    ub1          rcs9[CDA_SIZE - sizeof (struct cda_head)];        /* filler */
+};
+
+typedef struct cda_def Cda_Def;
+
+/* the logon data area (LDA)
+   is the same shape as the CDA */
+typedef struct cda_def Lda_Def;
+
+/* OCI Environment Modes for opinit call */
+#define OCI_EV_DEF 0                  /* default single-threaded environment */
+#define OCI_EV_TSF 1                              /* thread-safe environment */
+
+/* OCI Logon Modes for olog call */
+#define OCI_LM_DEF 0                                        /* default login */
+#define OCI_LM_NBL 1                                   /* non-blocking logon */
+
+/* 
+ * since sqllib uses both ocidef and ocidfn the following defines
+ * need to be guarded
+ */
+#ifndef OCI_FLAGS 
+#define OCI_FLAGS
+
+/* OCI_*_PIECE defines the piece types that are returned or set
+*/
+#define OCI_ONE_PIECE   0                 /* there or this is the only piece */
+#define OCI_FIRST_PIECE 1                        /* the first of many pieces */
+#define OCI_NEXT_PIECE  2                         /* the next of many pieces */
+#define OCI_LAST_PIECE  3                   /* the last piece of this column */
+#endif
+
+#ifndef SQLDEF 
+
+/* input data types */
+#define SQLT_CHR  1                        /* (ORANET TYPE) character string */
+#define SQLT_NUM  2                          /* (ORANET TYPE) oracle numeric */
+#define SQLT_INT  3                                 /* (ORANET TYPE) integer */
+#define SQLT_FLT  4                   /* (ORANET TYPE) Floating point number */
+#define SQLT_STR  5                                /* zero terminated string */
+#define SQLT_VNU  6                        /* NUM with preceding length byte */
+#define SQLT_PDN  7                  /* (ORANET TYPE) Packed Decimal Numeric */
+#define SQLT_LNG  8                                                  /* long */
+#define SQLT_VCS  9                             /* Variable character string */
+#define SQLT_NON  10                      /* Null/empty PCC Descriptor entry */
+#define SQLT_RID  11                                                /* rowid */
+#define SQLT_DAT  12                                /* date in oracle format */
+#define SQLT_VBI  15                                 /* binary in VCS format */
+#define SQLT_BFLOAT 21                                /* Native Binary float*/
+#define SQLT_BDOUBLE 22                             /* NAtive binary double */
+#define SQLT_BIN  23                                  /* binary data(DTYBIN) */
+#define SQLT_LBI  24                                          /* long binary */
+#define SQLT_UIN  68                                     /* unsigned integer */
+#define SQLT_SLS  91                        /* Display sign leading separate */
+#define SQLT_LVC  94                                  /* Longer longs (char) */
+#define SQLT_LVB  95                                   /* Longer long binary */
+#define SQLT_AFC  96                                      /* Ansi fixed char */
+#define SQLT_AVC  97                                        /* Ansi Var char */
+#define SQLT_IBFLOAT  100                           /* binary float canonical */
+#define SQLT_IBDOUBLE 101                          /* binary double canonical */
+#define SQLT_CUR  102                                        /* cursor  type */
+#define SQLT_RDD  104                                    /* rowid descriptor */
+#define SQLT_LAB  105                                          /* label type */
+#define SQLT_OSL  106                                        /* oslabel type */
+
+#define SQLT_NTY  108                                   /* named object type */
+#define SQLT_REF  110                                            /* ref type */
+#define SQLT_CLOB 112                                       /* character lob */
+#define SQLT_BLOB 113                                          /* binary lob */
+#define SQLT_BFILEE 114                                   /* binary file lob */
+#define SQLT_CFILEE 115                                /* character file lob */
+#define SQLT_RSET 116                                     /* result set type */
+#define SQLT_NCO  122      /* named collection type (varray or nested table) */
+#define SQLT_VST  155                                      /* OCIString type */
+#define SQLT_ODT  156                                        /* OCIDate type */
+
+/* datetimes and intervals */
+#define SQLT_DATE                      184                      /* ANSI Date */
+#define SQLT_TIME                      185                           /* TIME */
+#define SQLT_TIME_TZ                   186            /* TIME WITH TIME ZONE */
+#define SQLT_TIMESTAMP                 187                      /* TIMESTAMP */
+#define SQLT_TIMESTAMP_TZ              188       /* TIMESTAMP WITH TIME ZONE */
+#define SQLT_INTERVAL_YM               189         /* INTERVAL YEAR TO MONTH */
+#define SQLT_INTERVAL_DS               190         /* INTERVAL DAY TO SECOND */
+#define SQLT_TIMESTAMP_LTZ             232        /* TIMESTAMP WITH LOCAL TZ */
+
+#define SQLT_PNTY   241              /* pl/sql representation of named types */
+
+/* cxcheng: this has been added for backward compatibility -
+   it needs to be here because ocidfn.h can get included ahead of sqldef.h */
+#define SQLT_FILE SQLT_BFILEE                             /* binary file lob */
+#define SQLT_CFILE SQLT_CFILEE
+#define SQLT_BFILE SQLT_BFILEE
+ 
+/* CHAR/NCHAR/VARCHAR2/NVARCHAR2/CLOB/NCLOB char set "form" information */
+#define SQLCS_IMPLICIT 1     /* for CHAR, VARCHAR2, CLOB w/o a specified set */
+#define SQLCS_NCHAR    2                  /* for NCHAR, NCHAR VARYING, NCLOB */
+#define SQLCS_EXPLICIT 3   /* for CHAR, etc, with "CHARACTER SET ..." syntax */
+#define SQLCS_FLEXIBLE 4                 /* for PL/SQL "flexible" parameters */
+#define SQLCS_LIT_NULL 5      /* for typecheck of NULL and empty_clob() lits */
+
+#endif  /* SQLDEF */
+#endif  /* OCIDFN */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h b/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h
new file mode 100644
index 0000000..e20a832
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h
@@ -0,0 +1,281 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ociextp.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1996, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     ociextp.h - Interface Definitions for PL/SQL External Procedures
+
+   DESCRIPTION 
+     This header file contains C language callable interface from 
+     PL/SQL External Procedures.
+
+   PUBLIC FUNCTION(S) 
+     OCIExtProcAllocCallMemory  - Allocate Call memory
+     OCIExtProcRaiseExcp        - Raise Exception
+     OCIExtProcRaiseExcpWithMsg - Raise Exception with message
+     OCIExtProcGetEnv           - Get OCI Environment
+
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   srseshad    03/12/03 - convert oci public api to ansi
+   rdecker     01/10/02 - change 32k to MAX_OEN for error numbers
+   sagrawal    07/20/01 - Statement Handle to safe cal outs
+   abrumm      04/19/01 - move include of oci.h after defines/typedef
+   rdecker     02/22/01 - lint fix
+   bpalaval    02/08/01 - Change text to oratext.
+   sagrawal    06/16/00 - ref cursor in callouts
+   whe         09/01/99 - 976457:check __cplusplus for C++ code
+   asethi      04/15/99 - Created (by moving ociextp.h from /vobs/plsql/public)
+   rhari       03/25/97 - Use ifndef
+   rhari       12/18/96 - Include oratypes.h
+   rhari       12/11/96 - #416977, Flip values of return codes
+   rhari       12/02/96 - Define Return Code Macros
+   rhari       11/18/96 - Error number is int
+   rhari       10/30/96 - Fix OCIExtProcRaiseExcpWithMsg
+   rhari       10/30/96 - Get rid of warnings
+   rhari       10/04/96 - Fix OCIExtProcRaiseExcpWithMsg
+   rhari       09/23/96 - Creation
+
+*/
+
+ 
+#ifndef OCIEXTP_ORACLE
+# define OCIEXTP_ORACLE
+
+# ifndef ORATYPES 
+#  include <oratypes.h> 
+# endif
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/* ----------------------------- Return Codes ----------------------------- */
+/* Success and Error return codes for certain external procedure interface 
+ * functions. If a particular interface function returns OCIEXTPROC_SUCCESS
+ * or OCIEXTPROC_ERROR, then applications must use these macros to check
+ * for return values.
+ *
+ *     OCIEXTPROC_SUCCESS  -- External Procedure Success Return Code 
+ *     OCIEXTPROC_ERROR    -- External Procedure Failure Return Code 
+ */
+#define OCIEXTPROC_SUCCESS 0
+#define OCIEXTPROC_ERROR   1
+
+
+/* --------------------------- With-Context Type --------------------------- */
+/*
+ * The C callable interface to PL/SQL External Procedures require the 
+ * With-Context parameter to be passed. The type of this structure is 
+ * OCIExtProcContext is is opaque to the user.
+ *
+ * The user can declare the With-Context parameter in the application as
+ *
+ *    OCIExtProcContext *with_context;
+ */
+typedef struct OCIExtProcContext OCIExtProcContext;
+
+/* NOTE: OCIExtProcContext must be visible prior to including <oci.h> */
+
+# ifndef OCI_ORACLE
+#  include <oci.h>
+# endif
+
+
+/* ----------------------- OCIExtProcAllocCallMemory ----------------------- */
+/* OCIExtProcAllocCallMemory
+ *    Allocate N bytes of memory for the duration of the External Procedure.
+ *
+ *    Memory thus allocated will be freed by PL/SQL upon return from the
+ *    External Procedure. You must not use any kind of 'free' function on 
+ *    memory allocated by OCIExtProcAllocCallMemory.
+ *    Use this function to allocate memory for function returns.
+ * 
+ * PARAMETERS
+ * Input : 
+ *    with_context - The with_context pointer that is passed to the C 
+ *                   External Procedure.
+ *                  Type of with_context : OCIExtProcContext *
+ *    amount       - The number of bytes to allocate.
+ *                   Type of amount : size_t
+ *
+ * Output :
+ *    Nothing
+ *
+ * Return :
+ *    An untyped (opaque) Pointer to the allocated memory. 
+ *
+ * Errors :
+ *    A 0 return value should be treated as an error
+ *
+ * EXAMPLE 
+ *  text *ptr = (text *)OCIExtProcAllocCallMemory(wctx, 1024)
+ *
+ */
+#define OCIExtProcAllocCallMemory(with_context, amount) \
+ociepacm(with_context, (size_t)amount)
+
+
+
+
+/* -------------------------- OCIExtProcRaiseExcp -------------------------- */
+/* OCIExtProcRaiseExcp
+ *    Raise an Exception to PL/SQL.
+ *
+ *  Calling this function signalls an exception back to PL/SQL. After a
+ *  successful return from this function, the External Procedure must start 
+ *  its exit handling and return back to PL/SQL. Once an exception is 
+ *  signalled to PL/SQL, INOUT and OUT arguments, if any, are not processed 
+ *  at all.
+ * 
+ * PARAMETERS
+ * Input :
+ *   with_context - The with_context pointer that is passed to the C
+ *                  External Procedure. 
+ *                  Type of with_context : OCIExtProcContext *
+ *   errnum       - Oracle Error number to signal to PL/SQL. errnum
+ *                  must be a positive number and in the range 1 to MAX_OEN
+ *                  Type of errnum : int
+ * Output :
+ *   Nothing
+ *
+ * Return :
+ *   OCIEXTPROC_SUCCESS - If the call was successful.
+ *   OCIEXTPROC_ERROR   - If the call failed.
+ *
+ */
+#define OCIExtProcRaiseExcp(with_context, errnum) \
+ocieperr(with_context, (int)errnum)
+
+
+
+
+
+/* ---------------------- OCIExtProcRaiseExcpWithMsg ---------------------- */
+/* OCIExtProcRaiseExcpWithMsg
+ *    Raise an exception to PL/SQL. In addition, substitute the
+ *    following error message string within the standard Oracle error 
+ *    message string. See note for OCIExtProcRaiseExcp
+ * 
+ * PARAMETERS
+ * Input :
+ *   with_context  - The with_context pointer that is passed to the C
+ *                   External Procedure.
+ *                   Type of with_context : OCIExtProcContext *
+ *   errnum        - Oracle Error number to signal to PL/SQL. errnum
+ *                   must be a positive number and in the range 1 to MAX_OEN
+ *                   Type of errnum : int
+ *   errmsg        - The error message associated with the errnum.
+ *                   Type of errmsg : char *
+ *   len           - The length of the error message. 0 if errmsg is
+ *                   null terminated string.
+ *                   Type of len : size_t
+ * Output :
+ *   Nothing
+ *
+ * Return :
+ *  OCIEXTPROC_SUCCESS - If the call was successful.
+ *  OCIEXTPROC_ERROR   - If the call failed.
+ *
+ */
+#define OCIExtProcRaiseExcpWithMsg(with_context, errnum, errmsg, msglen) \
+ociepmsg(with_context, (int)errnum, errmsg, (size_t)msglen)
+
+
+
+/* --------------------------- OCIExtProcGetEnv --------------------------- */
+/* OCIExtProcGetEnv
+ *    Get OCI Environment
+ * 
+ * PARAMETERS
+ * Input :
+ *    with_context - The with_context pointer that is passed to the C
+ *                   External Procedure.
+ *
+ * Output :
+ *    envh - The OCI Environment handle.
+ *    svch - The OCI Service handle.
+ *    errh - The OCI Error handle.
+ *
+ * Return :
+ *  OCI_SUCCESS - Successful completion of the function.
+ *  OCI_ERROR   - Error.
+ *
+ */
+#define OCIExtProcGetEnv(with_context, envh, svch, errh) \
+ociepgoe(with_context, envh, svch, errh)
+
+
+
+/* ------------------------ OCIInitializeStatementHandle ------------------- */
+/* OCIreateStatementHandle
+ *    Initialize Statement Handle
+ * 
+ * PARAMETERS
+ * Input :
+ *    wctx     - The 
+ *    cursorno - The cursor number for which we need to initialize
+ *               the statement handle
+ *    svch     - The OCI Service handle.
+ *
+ * Output :
+ *    stmthp - The OCI Statement handle.
+ *    errh   - The OCI Error handle.
+ *
+ * Return :
+ *  OCI_SUCCESS - Successful completion of the function.
+ *  OCI_ERROR   - Error.
+ *
+ */
+#define OCIInitializeStatementHandle(wctx, cursorno,  svch, stmthp, errh) \
+ociepish(wctx, cursor, svch, stmthp, errh)
+
+
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+
+dvoid *ociepacm(OCIExtProcContext *with_context, size_t amount);
+
+
+
+size_t ocieperr(OCIExtProcContext *with_context, int error_number);
+
+
+
+size_t ociepmsg(OCIExtProcContext *with_context, int error_number,
+                oratext *error_message, size_t len );
+
+
+
+sword ociepgoe(OCIExtProcContext *with_context, OCIEnv **envh, 
+               OCISvcCtx **svch, OCIError **errh);
+
+
+#endif                                                     /* OCIEXTP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h
new file mode 100644
index 0000000..f6de3db
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h
@@ -0,0 +1,10223 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocikp.h,v 1.2 2002/12/13 13:33:58 karine Exp $
+ */
+/* Copyright (c) 1996, 2002, Oracle Corporation.  All rights reserved.  */
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     ocikp.h - Prototypes of V8 OCI functions in K&R style
+
+   DESCRIPTION 
+     defines the prototypes of V8 OCI functions in K&R style
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     <list of external functions declared/defined - with one-line descriptions>
+
+   PRIVATE FUNCTION(S) 
+     <list of static functions defined in .c file - with one-line descriptions>
+ 
+   EXAMPLES 
+ 
+   NOTES 
+     <other useful comments, qualifications, etc.> 
+
+   MODIFIED   (MM/DD/YY)
+   sichandr    02/12/02 - fix OCIXMLTypeExists
+   gayyappa    02/01/02 - fix 2210776 : change Dom to DOM 
+   sichandr    10/24/01 - OCISvcCtx for XMLType create routines
+   schandir    09/24/01 - Add prototypes for Stmt Caching
+   abande      09/04/01 - Add Prototypes for Session Pooling Methods
+   stakeda     09/24/01 - add OCINlsCharSetConvert and 
+                          OCINlsEnvironmentVariableGet.
+   whe         08/28/01 - add OCIEnvNlsCreate
+   wzhang      08/22/01 - Add OCINlsCharSetNameToId.
+   whe         10/05/01 - add prototype for OCIXMLType functions
+   mdmehta     04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+   schandir    12/12/00 - modify the ociconnectionpoolcreate() interface.
+   porangas    12/04/00 - Forward merge bug#974710 to 9i
+   gtarora     11/30/00 - fix comment for OCILobIsTemporary
+   akatti      11/07/00 - [1198379]:add OCIRowidToChar
+   bpalaval    10/15/00 - Forward merge 892654.
+   kmohan      09/18/00 - add OCILogon2
+   etucker     07/28/00 - add OCIIntervalFromTZ
+   vjayaram    07/18/00 - add connection pooling changes
+   etucker     07/13/00 - add dls apis for oci
+   hmasaki     07/05/00 - fix 1230846: forward merge into 8.2
+   mbastawa    06/05/00 - add OCIStmtFetch2
+   rxgovind    06/07/00 - update OCIAnyData interfaces
+   rxgovind    05/04/00 - add OCIAnyDataSet interfaces
+   rkasamse    05/01/00 - add ocianydata i/f
+   slari       09/01/99 - remove OCIEnvCallback
+   slari       08/23/99 - add OCIUcb in user callback functions
+   whe         09/01/99 - 976457:check __cplusplus for C++ code
+   dsaha       07/07/99 - Add OCIFEnvCreate for forms
+  vyanaman    06/21/99 - Change OCI DateTime/Interval APIs.
+   esoyleme    07/01/99 - expose MTS performance enhancements                  
+   whe         06/14/99 - bug727872:add CONST to match definitions
+   kkarun      02/23/99 - Fix OCIDateTime APIs
+   jiyang      12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+   aroy        12/01/98 - add OCIEnvCreate
+   slari       11/23/98 - use ORASTDARG
+   slari       11/22/98 - use arglist in OCIUserCallback
+   slari       11/21/98 - replace ellipsis by arglist in OCIUserCallback
+   thchang     10/20/98 - correct comment on OCILobCreateTemporary
+   sgollapu    09/30/98 - Fix bug 725473
+   slari       09/08/98 - allow envh to receive error info also in CallbackReg/
+   lchidamb    07/07/98 - change comments
+   aroy        08/04/98 - add OCITerminate calls                               
+   sgollapu    06/30/98 - Add OCISubscription* prototypes
+   nramakri    06/25/98 - remove CONST from some OCIPickler APIs
+   jiyang      06/22/98 - Fix a lint error
+   nmallava    06/08/98 - ociistemporary -> envhp
+   jhasenbe    05/27/98 - Remove definitions for U-Calls (Unicode)
+   nmallava    05/18/98 - correct comment
+   sgollapu    05/19/98 - Change text to OraText
+   aroy        04/20/98 - merge forward 8.0.5 -> 8.1.3
+   nbhatt      05/14/98 - aq listen call
+   vyanaman    04/19/98 - system timestamp
+   kkarun      04/17/98 - Add more Interval functions
+   vyanaman    04/16/98 - Add get/set TZ
+   kkarun      04/13/98 - add datetime prototypes
+   rkasamse    04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+   rkasamse    04/15/98 - chage pickler cart interface
+   slari       03/20/98 - change proto of OCIUserCallback
+   slari       02/17/98 - add OCIEnvCallback
+   jiyang      04/02/98 - Accept both env and user handles for NLS
+   nmallava    04/09/98 - OCILobLocatorAssign
+   nmallava    04/07/98 - fix compiler warnings
+   jhasenbe    04/06/98 - Add new interfaces for Unicode support
+   skabraha    03/24/98 - fixing prototype mismatch
+   tsaulys     03/20/98 - use environment or session handle
+   rkasamse    03/20/98 - remove prototypes for OCIMemoryDuration* functions
+   nmallava    03/17/98 - add interfaces
+   nmallava    03/16/98 - add open/close apis
+   nmallava    03/10/98 - add temporary lobs apis
+   sgollapu    07/10/97 - Add OCIReset
+   sgollapu    02/09/98 - OCI non-blocking
+   nramakri    01/16/98 - remove #ifdef NEVER clause for OCIExtract
+   rmurthy     01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+   ewaugh      01/02/98 - remove VAFP from OCIFormatString prototype
+   ewaugh      12/18/97 - Turn type wrappers into functions.
+   rtaranto    12/17/97 - Resolve merge conflicts
+   jiyang      11/13/97 - Add NLS service for cartridge
+   rhwu        12/02/97 - add OCI Thread
+   nramakri    12/15/97 - move to core4
+   nramakri    12/11/97 - modify OCIExtract prototype
+   ewaugh      12/10/97 - add OCIFormat prototypes
+   skabraha    12/02/97 - adding OCIFile functions
+   nramakri    11/12/97 - add OCIExtract prototypes
+   rkasamse    11/21/97 - add prototypes for memory cartridge services and cont
+   rkasamse    11/03/97 - Add pickler cartridge service interfaces
+   tanguyen    08/19/97 -
+   schandra    06/25/97 - AQ OCI interface
+   bnainani    07/21/97 - add prototypes for Oracle XA extensions
+   rtaranto    05/20/97 - remove OCILobLocatorSize (again)
+   esoyleme    05/13/97 - move failover callback prototype
+   skmishra    05/06/97 - stdc compiler fixes
+   skmishra    04/23/97 - Provide C++ compatibility
+   skotsovo    04/21/97 - make lob parameter names consistent
+   rwhitman    04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+   ramkrish    04/15/97 - Add free flag to OCILobFlushBuffer
+   cxcheng     04/09/97 - change objnamp from CONST text* to dvoid*
+   cxcheng     04/08/97 - fix prototype for OCIDescribeAny
+   skotsovo    03/31/97 - remove OCILobLocatorSize
+   skotsovo    03/27/97 - add OCILobLoadFromFile
+   sgollapu    03/26/97 - Change OCIDescribeAny prototype
+   skotsovo    03/26/97 - add svchp to ocienablebuffering
+   skotsovo    03/26/97 - change OCILobFlushBuffers to OCILobFlushBuffer
+   skotsovo    03/18/97 - add interface for lob buffering.
+   dchatter    01/13/97 - fix comments on LOB calls
+   aroy        01/10/97 - remove ocilobfilecreate delete
+   sgollapu    12/27/96 - Correct OCILogon prototype
+   dchatter    01/04/97 - comments to describe the functions
+   sgollapu    11/25/96 - Change OCILobFileIsExistent
+   schandra    11/18/96 - Remove xa.h include
+   sgollapu    11/09/96 - Change prototype of OCIDescribeAny
+   dchatter    11/01/96 - lint error
+   dchatter    10/31/96 - delete CONST from lob write cb fn
+   dchatter    10/30/96 - more changes
+   dchatter    10/26/96 - lob/file long name corrections
+   slari       10/16/96 - delete unused calls
+   rwessman    10/29/96 - Fixed OCISecurityGetIdentity prototype
+   sgollapu    10/22/96 - Add OCILogon and OCILogoff prototypes
+   rwessman    10/16/96 - Added cryptographic and digital signature functions
+   rxgovind    10/07/96 - add oci file calls
+   skotsovo    09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+   skotsovo    10/01/96 - move orl lob fnts to oci
+   skotsovo    09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+   aroy        08/29/96 - change prototype for Nchar Lob support
+   dchatter    08/21/96 - OCIResultSetToStmt prototype change
+   sthakur     08/14/96 - add OCIParamSet
+   schandra    06/17/96 - Convert XA to use new OCI
+   aroy        07/17/96 - terminology change: OCILobLocator => OCILobLocator
+   dchatter    07/01/96 - drop prototypes not in beta1
+   dchatter    06/29/96 - OCIParamGet prototype change
+   dchatter    06/19/96 - add OCISvcCtxBreak, OCILdaToSvcCtx
+   slari       06/12/96 - inlcude oratypes.h instead of s.h
+   schandra    05/31/96 - remove client DBID parameters from OCITransStart
+   asurpur     06/05/96 - Changing the prototype for OCIPasswordChange
+   dchatter    05/30/96 - change OCIStmtGetBind prototype
+   schandra    05/29/96 - Add timeout parameter to OCITransDetach
+   slari       05/30/96 - add OCIBindDynamic/OCIDefineDynamic
+   slari       05/28/96 - fix gpi/spi protos
+   slari       05/28/96 - change proto for OCIParamGet
+   jbellemo    05/23/96 - remove ociisc
+   schandra    05/15/96 - Remove ocitgti type
+   schandra    04/18/96 - OCITransCommitt -> OCITransCommit
+   schandra    03/27/96 - V8OCI - add transaction related calls
+   dchatter    04/01/96 - change return types to sword to be compatible with oo
+   dchatter    03/21/96 - add oci2lda conversion routines
+   aroy        03/12/96 - change parameter order for lob functions
+   dchatter    03/08/96 - minor parameter renaming for lob calls
+   slari       03/14/96 - change proto of OCITransRollback
+   slari       03/12/96 - remove ocidqry
+   slari       03/01/96 - change proto for OCIInitialize
+   slari       02/07/96 - update prototypes
+   slari       02/06/96 - add OCITransCommit()
+   slari       02/02/96 - ociisc: rm dblink info
+   dchatter    01/08/96 - V8 OCI K&R prototype file
+   dchatter    01/08/96 - Creation
+
+*/
+ 
+#ifndef OCIKP_ORACLE
+# define OCIKP_ORACLE
+ 
+# ifndef ORATYPES 
+#  include <oratypes.h> 
+# endif 
+ 
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+ 
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif 
+
+/*--------------------------------------------------------------------------- 
+                     PUBLIC TYPES AND CONSTANTS 
+  ---------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------------- 
+                     PRIVATE TYPES AND CONSTANTS 
+  ---------------------------------------------------------------------------*/
+ 
+ 
+/*--------------------------------------------------------------------------- 
+                           PUBLIC FUNCTIONS 
+  ---------------------------------------------------------------------------*/
+
+/*------------------Oracle Version 8 Call Interface--------------------------*/
+
+
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please 
+maintain the arrangement when adding a new function description. The actual 
+prototypes are below this comment section and donot follow any alphabetical 
+ordering. 
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle. 
+Syntax
+sword OCIAttrGet ( CONST dvoid    *trgthndlp,
+                 ub4            trghndltyp,
+                 dvoid          *attributep,
+                 ub4            *sizep,
+                 ub4            attrtype,
+                 OCIError       *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B,  "Handle Attributes",  for a list of handle types and their 
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type. 
+trghndltyp (IN) - is the handle type. 
+attributep (OUT) - is a pointer to the storage for an attribute value. The 
+attribute value is filled in. 
+sizep (OUT) - is the size of the attribute value. 
+This can be passed in as NULL for most parameters as the size is well known. 
+For OraText* parameters, a pointer to a ub4 must be passed in to get the length 
+of the string. 
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor. 
+Syntax
+sword OCIAttrSet ( dvoid       *trgthndlp,
+                 ub4         trghndltyp,
+                 dvoid       *attributep,
+                 ub4         size,
+                 ub4         attrtype,
+                 OCIError    *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor. 
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets 
+modified. 
+trghndltyp (IN/OUT) - is the handle type. 
+attributep (IN) - a pointer to an attribute value. 
+The attribute value is copied into the target handle. If the attribute value 
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for 
+most attributes as the size is already known by the OCI library. For OraText*
+attributes, a ub4 must be passed in set to the length of the string. 
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind     *bindp,
+                           OCIError    *errhp,
+                           ub4         pvskip, 
+                           ub4         indskip, 
+                           ub4         alskip, 
+                           ub4         rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind 
+handle returned by that initial bind call is used as a parameter for the 
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures" 
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value. 
+indskip (IN) - skip parameter for the next indicator value or structure. 
+alskip (IN) - skip parameter for the next actual length value. 
+rcskip (IN) - skip parameter for the next column-level return code value. 
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+              OCIStmt       *stmtp, 
+              OCIBind       **bindp,
+              OCIError      *errhp,
+              CONST OraText    *placeholder,
+              sb4           placeh_len,
+              dvoid         *valuep,
+              sb4           value_sz,
+              ub2           dty,
+              dvoid         *indp,
+              ub2           *alenp,
+              ub2           *rcodep,
+              ub4           maxarr_len,
+              ub4           *curelep, 
+              ub4           mode ); 
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information for 
+this particular input value. The handle is feed implicitly when the statement 
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+placeholder (IN) - the placeholder attributes are specified by name if ocibindn() 
+is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the 
+maximum size of any element possible with the actual sizes being specified in 
+the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than 
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). 
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic(). 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+-------------------------------OCIBindByPos----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos ( 
+              OCIStmt      *stmtp, 
+              OCIBind      **bindp,
+              OCIError     *errhp,
+              ub4          position,
+              dvoid        *valuep,
+              sb4          value_sz,
+              ub2          dty,
+              dvoid        *indp,
+              ub2          *alenp,
+              ub2          *rcodep,
+              ub4          maxarr_len,
+              ub4          *curelep, 
+              ub4          mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information for 
+this particular input value. The handle is feed implicitly when the statement 
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+position (IN) - the placeholder attributes are specified by position if ocibindp() 
+is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the 
+maximum size of any element possible with the actual sizes being specified in 
+the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than 
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). Ignored 
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic() . 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation. 
+Syntax
+sword OCIBindDynamic( OCIBind     *bindp,
+                    OCIError    *errhp,
+                    dvoid       *ictxp, 
+                    OCICallbackInBind         (icbfp)(
+                                dvoid            *ictxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                dvoid            **bufpp,
+                                ub4              *alenp,
+                                ub1              *piecep, 
+                                dvoid            **indp ),
+                    dvoid       *octxp,
+                    OCICallbackOutBind         (ocbfp)(
+                                dvoid            *octxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                dvoid            **bufp, 
+                                ub4              **alenpp,
+                                ub1              *piecep,
+                                dvoid            **indpp, 
+                                ub2              **rcodepp)   );
+Comments
+This call is used to register user-defined callback functions for providing data 
+for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a 
+previous call to OCIBindByName() or OCIBindByPos(). 
+The callback function pointers must return OCI_CONTINUE if it the call is 
+successful. Any return code other than OCI_CONTINUE signals that the client 
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or 
+OCIBindByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ictxp (IN) - the context pointer required by the call back function icbfp. 
+icbfp (IN) - the callback function which returns a pointer to the IN bind 
+value or piece at run time. The callback takes in the following parameters. 
+ictxp (IN/OUT) - the context pointer for this callback function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. 1 based not 
+greater than curele parameter of the bind call. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and may not be greater than curele parameter of the bind call. 
+bufpp (OUT) - the pointer to the buffer. 
+piecep (OUT) - which piece of the bind value. This can be one of the 
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE, 
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an 
+sb2 value or a pointer to an indicator structure for binding named data 
+types. 
+indszp (OUT) - contains the indicator value size. A pointer containing 
+the size of either an sb2 or an indicator structure pointer. 
+octxp (IN) - the context pointer required by the callback function ocbfp. 
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind 
+value or piece at run time. The callback takes in the following parameters. 
+octxp (IN/OUT) - the context pointer for this call back function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and must not be greater than curele parameter of the bind call. 
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece. 
+buflp (OUT) - returns the buffer size. 
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind 
+value/piece after it has been read. 
+piecep (IN/OUT) - which piece of the bind value. It will be set by the 
+library to be one of the following values - OCI_ONE_PIECE or 
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set 
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default - 
+OCI_ONE_PIECE. 
+indpp (OUT) - returns a pointer to contain the indicator value which 
+either an sb2 value or a pointer to an indicator structure for named data 
+types. 
+indszpp (OUT) - returns a pointer to return the size of the indicator 
+value which is either size of an sb2 or size of an indicator structure. 
+rcodepp (OUT) - returns a pointer to contains the return code. 
+Related Functions
+OCIAttrGet()
+
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named 
+data type (object)  bind.
+Syntax
+sword OCIBindObject ( OCIBind          *bindp,
+                    OCIError         *errhp, 
+                    CONST OCIType    *type,
+                    dvoid            **pgvpp, 
+                    ub4              *pvszsp, 
+                    dvoid            **indpp, 
+                    ub4              *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type 
+or a REF. An error will be returned if this function is called when the OCI 
+environment has been initialized in non-object mode. 
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the 
+pointers to the IN buffers are obtained either using the callback icbfp 
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call. 
+The buffers are dynamically allocated for the OUT data and the pointers to 
+these buffers are returned either by calling ocbfp() registered by the 
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed 
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned 
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be 
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName() 
+or OCIBindByPos(). 
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program 
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an 
+array, pgvpp points to an array of pointers. When the bind variable is also an 
+OUT variable, the OUT Named Data Type value or REF is allocated 
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points 
+to an array of pointer(s) to these newly allocated named data types in the 
+object cache. 
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named 
+Data Type buffers are requested at runtime. For static array binds, skip 
+factors may be specified using the OCIBindArrayOfStruct() call. The skip 
+factors are used to compute the address of the next pointer to the value, the 
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the 
+named data type is not required on input. For an array, pvszsp is an array of 
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named 
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC 
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array of 
+pointers. When the bind variable is also an OUT bind variable, memory is 
+allocated in the object cache, to store the unpickled OUT indicator values. At 
+the end of the execute when all OUT values have been received, indpp points 
+to the pointer(s) to these newly allocated indicator structure(s). 
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program 
+variable. For an array, it is an array of sb2s. On return for OUT bind variables, 
+this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( dvoid      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server. It is normally used 
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context 
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Initializes the Connection Pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                         OraText **poolName, sb4 *poolNameLen,
+                         CONST Oratext *dblink, sb4 dblinkLen,
+                         ub4 connMin, ub4 connMax, ub4 connIncr,
+                         CONST OraText *poolUsername, sb4 poolUserLen,
+                         CONST OraText *poolPassword, sb4 poolPassLen, ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT)  - A pointer to the environment where the Conencton Pool
+                  is to be created
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name. 
+poolNameLen (OUT) - The length of the connection pool name 
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+                  be used as the default pool name.
+dblinkLen (IN)  - The length of the string pointed to by dblink.
+connMin (IN)    - Specifies the minimum number of connections in the
+                  Connection Pool at any instant.
+                  connMin number of connections are started when
+                  OCIConnectionPoolCreate() is called.
+connMax (IN)    - Specifies the maximum number of connections that can be
+                  opened to the database. Once this value is reached, no
+                  more connections are opened.
+connIncr (IN)   - Allows application to set the next increment for
+                  connections to be opened to the database if the current
+                  number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+                         session and this attribute provides a username
+                         for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+                        above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and OCI_REINITIALIZE
+
+Related Functions
+OCIConnectionPoolDestroy()
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Destroys the Connection Pool.
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+mode (IN)       - Currently, OCIConnectionPoolDestroy() will support only
+                  the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name:
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp,
+                      OraText **poolName, ub4 *poolNameLen,
+                      CONST OraText *connStr, ub4 connStrLen,
+                      ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                      OraText *userid,  ub4 useridLen,
+                      OraText *password, ub4 passwordLen,
+                      ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+                 pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+               These are the number of sessions opened in the beginning, if
+               in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+               Once this value is reached, no more sessions are opened,
+               unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+           OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                    OCIAuthInfo *authhp,
+                    OraText *poolName, ub4 poolName_len,
+                    CONST OraText *tagInfo, ub4 tagInfo_len,
+                    OraText **retTagInfo, ub4 *retTagInfo_len,
+                    boolean *found,
+                    ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+                 filled with a server and session handle, attached to the
+                 pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+                session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+                In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+                   user wants a default session, he must specify a NULL here.
+                   Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+                   the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+              set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+            OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+            OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS -  if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+                    total number of sessions > maxsessions. Only valid for
+                    Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+                          OraText *tag, ub4 tag_len,
+                          ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+           This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+           specified. In this case, the session is labelled with this tag and
+           returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode 
+               OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+            OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+            When OCI_RLS_SPOOL_DROPSESS is specified, the session
+            will be removed from the session pool. If OCI_RLS_SPOOL_RETAG is 
+            set, the tag on the session will be altered. If this mode is not 
+            set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from, 
+			 OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+        Performs date assignment. The type of the output will be same as that
+	of input
+
+------------------------------OCIDateTimeCheck--------------------
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+		 ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - date to be checked
+type (IN) - type of the input datetime(OCI_DATE, OCI_TIME, 
+				OCI_TIMESTAMP,	OCI_TZTIMESTAMP, OCI_TZTIME)
+valid (OUT) -  returns zero for a valid date, otherwise 
+  		the ORed combination of all error bits specified below:
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID	0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_TIMEZONE    0x4000          Bad Timezone
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the error returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+  	Check if the given date is valid.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare-------------------------
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1, 
+                     CONST OCIDateTime *date2,  sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+type (IN)  - Type of datetime to be compared. Both input datetimes
+			should be of same type.(OCI_DATE, OCI_TIME, 
+				OCI_TIMESTAMP, OCI_TZTIMESTAMP, OCI_TZTIME)
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+  		1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if 
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is 
+greater than date2.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  invalid date
+	  input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate, 
+				OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime 
+DESCRIPTION: Converts one datetime type to another. The result type is
+       the type of the 'outdate' descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if
+	    conversion not possible.
+   
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str, 
+                     size_t d_str_length, CONST OraText *fmt, ub1 fmt_length, 
+                     CONST OraText *lang_name, size_t lang_length, 
+                     OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+		    conversion takes place in session NLS_LANGUAGE and
+		    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+  		then 'date_str' is treated as a null terminated  string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in the default format for
+		the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+  	        days and months are specified, if null i.e. (OraText *)0,
+  		the default language of session is used, 
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+  	Converts the given string to Oracle datetime type set in the 
+        OCIDateTime descriptor according to the specified format. Refer to 
+        "TO_DATE" conversion function described in "Oracle SQL Language 
+        Reference Manual" for a description of format.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  invalid format
+  	  unknown language
+  	  invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+void OCIDateTimeGetDate(dvoid *hndl, OCIError *err,  CONST OCIDateTime *date, 
+		 sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)  
+				portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+year      (OUT) - year value
+month     (OUT) - month value
+day       (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+void OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime, 
+		 ub1 *hour, ub1 *min, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second, 
+			fractional second)  of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - hour value
+min       (OUT) - minute value
+sec       (OUT) - second value
+fsec      (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,CONST 
+              OCIDateTime *datetime,sb1 *hour,sb1  *minute);
+ 
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)  
+                         portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - TimeZone Hour value
+minute     (OUT) - TimeZone Minute value
+ 
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+	 OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+				will be of same type as input datetime
+DESCRIPTION: 
+	Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if:
+		resulting date is before Jan 1, -4713
+		resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+	 OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+				will be of same type as input datetime
+DESCRIPTION: 
+ 	Subtracts an interval from a datetime and stores the result in a
+     	datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if:
+		resulting date is before Jan 1, -4713
+		resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(dvoid  *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+   NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+       fields for the OCIDateTime descriptor types are used.
+   PARAMETERS:
+        hndl (IN) - Session/Env handle. 
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        datetime (IN) - Pointer to OCIDateTime 
+        year      (IN) - year value
+        month     (IN) - month value
+        day       (IN) - day value        
+        hour      (IN) - hour value
+        min       (IN) - minute value
+        sec       (IN) - second value
+        fsec      (IN) - Fractional Second value
+        timezone  (IN) - Timezone string
+        timezone_length(IN) - Length of timezone string
+DESCRIPTION:
+       Constructs a DateTime descriptor. The type of the datetime is the
+       type of the OCIDateTime descriptor. Only the relevant fields based
+       on the type are used. For Types with timezone, the date and time
+       fields are assumed to be in the local time of the specified timezone.
+       If timezone is not specified, then session default timezone is
+       assumed.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR if datetime is not valid.
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err, 
+              OCIDateTime *sys_date );
+ 
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with 
+                      timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+ 
+DESCRIPTION: 
+        Gets the system current date and time as a timestamp with timezone
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+ 
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1, 
+		OCIDateTime *indate2,	OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter  (OUT) - pointer to output interval
+DESCRIPTION: 
+	Takes two datetimes as input and stores their difference in an 
+        interval. The type of the result interval is the type of the 
+        'inter' descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if
+	   datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                        CONST OraText *fmt, ub1 fmt_length, ub1 fsprec,
+                        CONST OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String 
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+		    conversion takes place in session NLS_LANGUAGE and
+		    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+                the date is converted to a character string in the
+                default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+               fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and 
+  	        abbreviations of months and days are returned;
+  	        default language of session is used if 'lang_name' 
+  		is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  buffer too small
+  	  invalid format
+  	  unknown language
+          overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, 
+                                 OCIError *err,
+                                 CONST OCIDateTime *datetime,
+                                 ub1 *buf,
+                                 ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to an OCIDateTime.
+buf (OUT)       - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+        Returns either the timezone region name or the absolute hour and minute
+        offset. If the DateTime was created with a region id then the region 
+        name will be returned in the buf.  If the region id is zero, then the 
+        hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+----------------------------OCIDateTimeFromArray-------------------------------
+sword OCIDateTimeFromArray(dvoid *hndl, 
+                         OCIError *err,
+                         ub1 *inarray,
+                         ub4 len
+                         ub1 type
+                         OCIDateTime *datetime,
+                         OCIInterval *reftz,
+                         ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+inarray (IN)   - Pointer to input array representtion of DateTime
+len (IN)       - len of inarray.
+type (IN)      - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+                 SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN)     - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN)    - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+        Returns a pointer to an OCIDateTime of type type converted from 
+        the inarray.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+-----------------------------OCIDateTimeToArray------------------------------
+sword OCIDateTimeToArray(dvoid *hndl, 
+                         OCIError *err,
+                         CONST OCIDateTime *datetime,
+                         CONST OCIInterval *reftz,
+                         ub1 *outarray,
+                         ub4 len,
+                         ub1 fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)  - Pointer to the OCIDateTime to convert.
+reftz (IN)     - Interval defining the timezone for SQLT_TIMESTAMP_LTZ.
+outarray (OUT) - result array.
+len (IN)       - length of outarray.
+fsprec (IN)    - number of fractional seconds digits. 
+DESCRIPTION:
+        Returns an array representing the input DateTime descriptor.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64)
+representation into user provided buffer outbfp of length outbflp. After
+execution outbflp contains amount of bytes converted.In case of truncation
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc,
+                      OraText *outbfp,
+                      ub2 *outbflp,
+                      OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID.
+
+Parameters
+rowidDesc (IN)   - rowid DESCriptor which is allocated from OCIDescritorAlloc
+                   and populated by a prior SQL statement execution
+outbfp (OUT)     - pointer to the buffer where converted rowid in character
+                   representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+                   Before execution (IN mode) *outbflp contains the size of
+                   outbfp, after execution (OUT mode) *outbflp contains amount
+                   of bytes converted. In an event of truncation during
+                   conversion *outbflp contains the required length to make
+                   conversion successful.
+errhp (IN/OUT)   - an error handle which can be passed to OCIErrorGet() for
+                   diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine   *defnp,
+                             OCIError    *errhp,
+                             ub4         pvskip, 
+                             ub4         indskip, 
+                             ub4         rlskip,
+                             ub4         rcskip );
+Comments
+This call specifies additional attributes necessary for an array define, used in 
+an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters" 
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call 
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location. 
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer. 
+Syntax
+sb4 OCIDefineByPos ( 
+              OCIStmt     *stmtp, 
+              OCIDefine   **defnp,
+              OCIError    *errhp,
+              ub4         position,
+              dvoid       *valuep,
+              sb4         value_sz,
+              ub2         dty,
+              dvoid       *indp,
+              ub2         *rlenp,
+              ub2         *rcodep,
+              ub4         mode );
+Comments
+This call defines an output buffer which will receive data retreived from 
+Oracle. The define is a local step which is necessary when a SELECT statement 
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The 
+first call is to OCIDefineByPos(), which defines the minimal attributes 
+required to specify the fetch. 
+This call takes as a parameter a define handle, which must have been 
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be 
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters 
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate 
+attributes of a named data type fetch. In this case the data buffer pointer 
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called 
+after ocidefn() in order to fetch multiple rows with a column of named 
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type 
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not 
+LOB values, are always returned for a LOB column. LOB values can then be 
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an 
+array of bytes sufficient for holding the required NCHAR characters. 
+Nested table columns are defined and fetched like any other named data type. 
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client 
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a 
+subsequent call to OCIDefineDynamic(). When the client library needs a 
+buffer to return the fetched data, the callback will be invoked and the 
+runtime buffers provided will return a piece or the whole data. 
+a polling mechanism using calls supplied by the OCI. This mode is 
+assumed if no callbacks are defined. In this case, the fetch call returns the 
+OCI_NEED_DATA error code, and a piecewise polling method is used 
+to provide the data.
+Related Functions: For more information about using the 
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data 
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining" 
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly 
+allocated by this call.  This handle is used to  store the define information 
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are 
+1-based and are numbered from left to right. For example, in the SELECT 
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type 
+specified in the dty parameter. A number of buffers can be specified when 
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored 
+internally in VARCHAR2 format, the number of characters desired, if different 
+from the buffer size in bytes, may be additionally specified by the using 
+OCIAttrSet(). 
+In an NLS conversion environment, a truncation error will be generated if the 
+number of bytes specified is insufficient to handle the number of characters 
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF) 
+are valid only if the environment has been intialized with in object mode. 
+indp - pointer to an indicator variable or array. For scalar data types, 
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named 
+data types, a pointer to a named data type indicator structure or an array of 
+named data type indicator structures is associated by a subsequent 
+OCIDefineObject() call. 
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in 
+rlenp is the length of the data in the corresponding element in the row after 
+the fetch. 
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically 
+allocated data at the time of fetch, this mode must be used. The user may 
+additionally call OCIDefineDynamic() to set up a callback function that 
+will be invoked to receive the dynamically allocated buffers and to set 
+up the memory allocate/free callbacks and the context for the callbacks. 
+valuep and value_sz are ignored in this mode. 
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos(). 
+Syntax
+sword OCIDefineDynamic( OCIDefine   *defnp,
+                      OCIError    *errhp,
+                      dvoid       *octxp, 
+                      OCICallbackDefine (ocbfp)(
+                                  dvoid             *octxp,
+                                  OCIDefine         *defnp,
+                                  ub4               iter, 
+                                  dvoid             **bufpp,
+                                  ub4               **alenpp,
+                                  ub1               *piecep,
+                                  dvoid             **indpp,
+                                  ub2               **rcodep)  );
+Comments
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode has been selected in a call to 
+OCIDefineByPos(). 
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be 
+dynamically allocated for REF, and named data type, values to receive the 
+data. The pointers to these buffers will be returned. 
+If OCI_DYNAMIC_FETCH mode was selected, and the call to 
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise 
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to 
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+octxp (IN) - points to a context for the callback function. 
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get 
+a pointer to the buffer into which the fetched data or a piece of it will be 
+retreived. The callback also specifies the indicator, the return code and the 
+lengths of the data piece and indicator. The callback has the following 
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback 
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie. 
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp 
+contains the size of the buffer after return from callback. Gets set to 
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or 
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was 
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if 
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or 
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE. 
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine       *defnp,
+                      OCIError        *errhp,
+                      CONST OCIType   *type,
+                      dvoid           **pgvpp, 
+                      ub4             *pvszsp, 
+                      dvoid           **indpp, 
+                      ub4             *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.An error will be returned if this function is called when the OCI environment 
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information 
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to 
+OCIDefineByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which 
+describes the type of the program variable. Only used for program variables 
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL 
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an 
+array, pgvpp points to an array of pointers. Memory for the fetched named data 
+type instance(s) is dynamically allocated in the object cache. At the end of the 
+fetch when all the values have been received, pgvpp points to the pointer(s) to
+these newly allocated named data type instance(s). The application must call 
+OCIObjectMarkDel() to deallocate the named data type instance(s) when they 
+are no longer needed. 
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it 
+is an array of ub4s. On return points to the size(s) of unpickled fetched 
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array 
+of pointers. Memory is allocated to store the indicator structures in the 
+object cache. At the end of the fetch when all values have been received, 
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program 
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as 
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( CONST dvoid   *parenth,
+                   dvoid         **descpp, 
+                   ub4           type,
+                   size_t        xtramem_sz,
+                   dvoid         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL descriptor or LOB locator is returned 
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if 
+an out-of-memory error occurs. 
+Parameters
+parenth (IN) - an environment handle. 
+descpp (OUT) - returns a descriptor or LOB locator of desired type. 
+type (IN) - specifies the type of descriptor or LOB locator to be allocated. 
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C 
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C 
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type 
+OCIResult that references a result set (a number of rows as a result of a 
+query). This descriptor is bound to a bind variable of data type 
+SQLT_RSET (result set). The descriptor has to be converted into a 
+statement handle using a function - OCIResultSetToStmt() - which can 
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the 
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C 
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a 
+complex object retrieval descriptor of C type 
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use 
+by the application. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( dvoid    *descp,
+                  ub4      type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE. 
+All descriptors must be explicitly deallocated. OCI will not deallocate a 
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor. 
+type (IN) - specifies the type of storage to be freed. The specific types are: 
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number 
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval 
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx     *svchp,
+                     OCIError      *errhp,
+                     dvoid         *objptr,
+                     ub4           objptr_len,
+   		     ub1           objptr_typ,
+                     ub1           info_level,
+		     ub1           objtype,
+                     OCIDesc       *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a 
+result of this call, the describe handle is populated with the object-specific 
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a 
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on 
+the parameter descriptor returns the specific attributes of a stored procedure 
+or function parameter or a table column descriptor as the case may be. 
+These subsequent calls do not need an extra round trip to the server because 
+the entire schema object description cached on the client side by 
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return 
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe 
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be 
+described. Only procedure or function names are valid when connected to an 
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - Object type.
+dschp (IN/OUT) - a describe handle that is populated with describe 
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under.  This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate  ( OCIEnv        **envhpp, 
+                      ub4           mode, 
+                      dvoid         *ctxp, 
+                      dvoid         *(*malocfp) 
+                                    (dvoid *ctxp, 
+                                        size_t size), 
+                      dvoid         *(*ralocfp) 
+                                    (dvoid *ctxp, 
+                                       dvoid *memptr, 
+                                       size_t newsize), 
+                      void          (*mfreefp) 
+                                    (dvoid *ctxp, 
+                                       dvoid *memptr))
+                      size_t        xtramemsz,
+                      dvoid         **usrmempp );
+ 
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes.  This function 
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode. 
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility. 
+ 
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode. 
+Syntax
+sword OCIEnvNlsCreate(OCIEnv        **envhpp,
+                      ub4           mode,
+                      dvoid         *ctxp,
+                      dvoid         *(*malocfp)
+                                    (dvoid *ctxp,
+                                        size_t size),
+                      dvoid         *(*ralocfp)
+                                    (dvoid *ctxp,
+                                       dvoid *memptr,
+                                       size_t newsize),
+                      void          (*mfreefp)
+                                    (dvoid *ctxp,
+                                       dvoid *memptr),
+                      size_t        xtramemsz,
+                      dvoid         **usrmempp,
+                      ub2           charset,
+                      ub2           ncharset)
+Comments
+The parameters have the same meaning as the ones in OCIEnvCreate().
+The charset and ncharset must be both zero or non-zero.
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function. 
+Applications can achieve the same effects by setting 
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv    **envp,
+                 ub4       mode,
+                 size_t    xtramemsz,
+                 dvoid     **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized 
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the 
+environment handle can be used to obtain ORACLE specific errors and 
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of an environment mode. The only valid 
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing 
+the use of OCIEnvInit(). 
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( dvoid      *hndlp, 
+                  ub4        recordno,
+                  OraText       *sqlstate,
+                  ub4        *errcodep, 
+                  OraText       *bufp,
+                  ub4        bufsiz,
+                  ub4        type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error. 
+Currently does not support SQL state. This call can be called a multiple 
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for 
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks 
+info. Starts from 1. 
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize 
+Purpose
+This function initializes the parameter manager. 
+Syntax
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS 
+information is stored inside the parameter manager context and used in 
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform 
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and 
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with 
+               OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name, ub1 type,
+                       ub4 flag, CONST dvoid *defval, CONST sb4 *intrange, 
+                       CONST OraText *CONST *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before 
+calling OCIExtractFromFile() or OCIExtractFromStr().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER, 
+            OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or 
+            OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values 
+            or 0 otherwise.
+defval (IN) - Set to the default value for the key.  May be NULL if there is 
+               no default.  A string default must be a (text*) type, an 
+               integer default must be an (sb4*) type, and a boolean default 
+               must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer 
+                values.  May be NULL if the key is not an integer type or if 
+                all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key.  May be NULL 
+               if the key is not a string type or if all text values are 
+               acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed. 
+Syntax
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag, OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed. 
+Syntax
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, uword valno, 
+                      sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key. 
+Syntax
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname, uword valno,
+                       ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname, uword valno, 
+                      OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored 
+in memory. 
+Syntax
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, OraText *name, 
+                         ub1 *type, uword *numvals, dvoid ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior 
+to calling this routine to generate the parameter list from the parameter 
+structures that are stored in memory. 
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING, 
+             OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or 
+             OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************  OCIFileClose() ***********************************
+ 
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( dvoid             *hndl, 
+             	      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR. 
+ 
+Parameters
+ hndl  (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.  
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( dvoid           *hndl, 
+            	      OCIError         *err, 
+                      OraText          *filename,
+                      OraText          *path,
+                      ub1              *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR. 
+
+Parameters
+ hndl(IN) - OCI environment or session handleenv
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+     
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( dvoid             *hndl, 
+             	      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters 
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(dvoid           *hndl, 
+	          OCIError        *err,
+                  OraText         *filename,
+                  OraText         *path,
+                  ubig_ora        *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+   
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( dvoid *hndl, 
+                     OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+     
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+     Open a file.
+
+Syntax
+ sword OCIFileOpen ( dvoid               *hndl, 
+	             OCIError            *err,
+                     OCIFileObject      **filep,
+                     OraText             *filename,
+                     OraText             *path,
+                     ub4                  mode,
+                     ub4                  create, 
+                     ub4                  type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened. 
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the 
+ appropriate type (see the parameter type). If any of the standard files 
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are: 
+     OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists. 
+                        If the file already exists overwrite it.
+     OCI_FILE_EXCL - fail if the file exists, else create.
+     OCI_FILE_EXIST - open it if it exists, else fail.
+     OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+     OCI_FILE_APPEND - set the file pointer to the end of the file prior to 
+                      writing(this flag can be OR'ed with OCI_FILE_EXIST or
+                      OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN, 
+       OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+       If any of the standard files are specified then filename, path, mode
+       and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+   
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( dvoid            *hndl, 
+          	     OCIError         *err,
+                     OCIFileObject    *filep,
+                     dvoid            *bufp,
+                     ub4               bufl,
+                     ub4              *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The 
+ length of the allocated memory is assumed to be bufl. 
+ bufl - the length of the buffer in bytes. 
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( dvoid           *hndl, 
+        	     OCIError        *err,  
+                     OCIFileObject   *filep,
+                     uword            origin,
+                     ubig_ora         offset,
+                     sb1              dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting 
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT 
+ (current position), or OCI_FILE_SEEK_END (end of file). 
+ offset - The number of bytes from the origin we want to start reading from. 
+ dir - The direction we want to go from the origin. NOTE: The direction 
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD. 
+ 
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( dvoid *hndl, 
+                     OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure. 
+  
+Related Functions 
+ OCIFileInit   
+ 
+
+********************************* OCIFileWrite() **************************** 
+
+Name 
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+  Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( dvoid            *hndl, 
+            	      OCIError         *err,  
+                      OCIFileObject    *filep,
+                      dvoid            *bufp, 
+                      ub4               buflen
+                      ub4              *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written. 
+ The length of the allocated memory is assumed to be the value passed
+ in bufl. 
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+ 
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead
+
+
+
+OCIHandleAlloc()
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( CONST dvoid   *parenth,
+                     dvoid         **hndlpp, 
+                     ub4           type, 
+                     size_t        xtramem_sz,
+                     dvoid         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL handle is returned on success. Bind 
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is 
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if 
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed 
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle. 
+hndlpp (OUT) - returns a handle to a handle type. 
+type (IN) - specifies the type of handle to be allocated. The specific types 
+are: 
+OCI_HTYPE_ERROR - specifies generation of an error report handle of 
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle 
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application 
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle 
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition 
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE  - specifies generation of a select list 
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle 
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication 
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context 
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex 
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C 
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( dvoid     *hndlp,
+                    ub4       type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type 
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child 
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE  - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4           mode,
+                    CONST dvoid   *ctxp, 
+                    CONST dvoid   *(*malocfp) 
+                                  ( dvoid *ctxp,
+                                    size_t size ),
+                    CONST dvoid   *(*ralocfp)
+                                  ( dvoid *ctxp,
+                                    dvoid *memp,
+                                    size_t newsize ),
+                    CONST void    (*mfreefp)
+                                  ( dvoid *ctxp,
+                                    dvoid *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call. 
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIInitialize().
+Related Functions
+
+
+--------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate ( ub4           mode);
+
+Comments
+This call performs  OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+ ---------------------- OCIIntervalAssign -------------------- 
+void OCIIntervalAssign(dvoid *hndl, OCIError *err, CONST OCIInterval *inpinter,
+			OCIInterval *outinter );
+
+  DESCRIPTION
+    Copies one interval to another to create a replica
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpinter - Input Interval 
+    (OUT) outinter - Output Interval 
+  RETURNS
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck -------------------- 
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+			 ub4 *valid );
+
+  DESCRIPTION
+    Checks the validity of an interval
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  interval - Interval to be checked 
+    (OUT) valid     - Zero if the interval is valid, else returns an Ored
+	combination of the following codes.
+
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_INTER_INVALID_DAY         0x1           Bad day
+   OCI_INTER_DAY_BELOW_VALID     0x2           Bad DAy Low/high bit (1=low)
+   OCI_INTER_INVALID_MONTH       0x4           Bad MOnth
+   OCI_INTER_MONTH_BELOW_VALID   0x8           Bad MOnth Low/high bit (1=low)
+   OCI_INTER_INVALID_YEAR        0x10          Bad YeaR
+   OCI_INTER_YEAR_BELOW_VALID    0x20          Bad YeaR Low/high bit (1=low)
+   OCI_INTER_INVALID_HOUR        0x40          Bad HouR
+   OCI_INTER_HOUR_BELOW_VALID    0x80          Bad HouR Low/high bit (1=low)
+   OCI_INTER_INVALID_MINUTE      0x100         Bad MiNute
+   OCI_INTER_MINUTE_BELOW_VALID	 0x200         Bad MiNute Low/high bit(1=low)
+   OCI_INTER_INVALID_SECOND      0x400         Bad SeCond
+   OCI_INTER_SECOND_BELOW_VALID  0x800         bad second Low/high bit(1=low)
+   OCI_INTER_INVALID_FRACSEC     0x1000        Bad Fractional second
+   OCI_INTER_FRACSEC_BELOW_VALID 0x2000        Bad fractional second Low/High
+
+	
+  RETURNS
+    OCI_SUCCESS if interval is okay
+    OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare -------------------- 
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1, 
+			OCIInterval *inter2, sword *result );
+
+  DESCRIPTION
+	Compares two intervals, returns 0 if equal, -1 if inter1 < inter2, 
+      	1 if inter1 > inter2
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter1  (IN)   - Interval to be compared 
+     inter2  (IN)   - Interval to be compared 
+     result  (OUT)  - 	comparison result, 0 if equal, -1 if inter1 < inter2, 
+                	1 if inter1 > inter2
+
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if 
+	the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide -------------------- 
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend, 
+		OCINumber *divisor, OCIInterval *result );
+ 
+  DESCRIPTION
+     Divides an interval by an Oracle Number to produce an interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     dividend  (IN)   - Interval to be divided 
+     divisor   (IN)   - Oracle Number dividing `dividend' 
+     result    (OUT)  - resulting interval (dividend / divisor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+ 
+ ---------------------- OCIIntervalFromNumber -------------------- 
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, 
+               OCIInterval *inter, OCINumber *number);
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (OUT)  interval - Interval to be converted 
+    (IN) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_SUCCESS on success 
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR on error.
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+ ---------------------- OCIIntervalFromText -------------------- 
+sword OCIIntervalFromText(dvoid *hndl, OCIError *err, CONST OraText *inpstring,
+		size_t str_len, OCIInterval *result );
+
+  DESCRIPTION
+    Given an interval string produce the interval represented by the string. 
+    The type of the interval is the type of the 'result' descriptor.
+  PARAMETERS
+
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpstring - Input string 
+    (IN)  str_len - Length of input string 
+    (OUT) result - Resultant interval 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR if
+     	there are too many fields in the literal string
+	the year is out of range (-4713 to 9999)
+  	if the month is out of range (1 to 12)
+ 	if the day of month is out of range (1 to 28...31)
+    	if hour is not in range (0 to 23)
+     	if hour is not in range (0 to 11)
+  	if minute is not in range (0 to 59)
+    	if seconds in minute not in range (0 to 59)
+   	if seconds in day not in range (0 to 86399)
+  	if the interval is invalid
+
+ ---------------------- OCIIntervalGetDaySecond -------------------- 
+
+  DESCRIPTION
+     Gets values of day second interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (OUT) - number of days
+        hour    (OUT) - number of hours
+        min     (OUT) - number of mins
+        sec     (OUT) - number of secs
+        fsec    (OUT) - number of fractional seconds
+	result     (IN)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalGetYearMonth -------------------- 
+
+  DESCRIPTION
+     Gets year month from an interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+	year    (OUT)   - year value
+	month   (OUT)   - month value
+	result     (IN)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+---------------------- OCIIntervalAdd -------------------- 
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1, 
+			OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals 
+PARAMETERS
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+addend1  (IN)   - Interval to be added 
+addend2  (IN)   - Interval to be added 
+result   (OUT)  - resulting interval (addend1 + addend2) 
+DESCRIPTION
+     Adds two intervals to produce a resulting interval
+RETURNS
+     OCI_SUCCESS on success
+     OCI_ERROR if:
+	the two input intervals are not mutually comparable.
+	the resulting year would go above SB4MAXVAL
+	the resulting year would go below SB4MINVAL
+     OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+     The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract -------------------- 
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend, 
+			    OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+minuend    (IN)   - interval to be subtracted from 
+subtrahend (IN)   - interval subtracted from minuend 
+result     (OUT)  - resulting interval (minuend - subtrahend) 
+DESCRIPTION
+     Subtracts two intervals and stores the result in an interval
+RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if:
+	   the two input intervals are not mutually comparable.
+	   the resulting leading field would go below SB4MINVAL	
+	   the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply -------------------- 
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			OCINumber *nfactor, OCIInterval *result );
+
+  DESCRIPTION
+     Multiplies an interval by an Oracle Number to produce an interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     ifactor  (IN)   - Interval to be multiplied 
+     nfactor  (IN)   - Oracle Number to be multiplied 
+     result   (OUT)  - resulting interval (ifactor * nfactor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if:
+	the resulting year would go above SB4MAXVAL
+	the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond -------------------- 
+
+  DESCRIPTION
+     Sets day second interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (IN) - number of days
+        hour    (IN) - number of hours
+        min     (IN) - number of mins
+        sec     (IN) - number of secs
+        fsec    (IN) - number of fractional seconds
+	result     (OUT)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalSetYearMonth -------------------- 
+
+  DESCRIPTION
+     Sets year month interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+	year    (IN)   - year value
+	month   (IN)   - month value
+	result     (OUT)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalToNumber -------------------- 
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			OCINumber *number, uword units );
+
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  interval - Interval to be converted 
+    (OUT) number - Oracle number result   (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_SUCCESS on success 
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+ ---------------------- OCIIntervalToText -------------------- 
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                        ub1 lfprec, ub1 fsprec, OraText *buffer, 
+                        size_t buflen, size_t *resultlen );
+
+  DESCRIPTION
+    Given an interval, produces a string representing the interval.
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  interval - Interval to be converted 
+    (IN)  lfprec  - Leading field precision. Number of digits used to
+                represent the leading field.
+    (IN)  fsprec  - Fractional second precision of the interval. Number of
+                digits used to represent the fractional seconds.
+    (OUT) buffer - buffer to hold result 
+    (IN)  buflen - length of above buffer 
+    (OUT) resultlen - length of result placed into buffer 
+ 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR 
+    	if the buffer is not large enough to hold the result
+  NOTES
+    The interval literal will be output as `year' or `[year-]month' for
+    YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+    `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+    DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ----------------------- OCIIntervalFromTZ --------------------- 
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+			size_t str_len, OCIInterval *results );
+
+  DESCRIPTION
+    Returns am OCIInmterval of type OCI_DTYPE_INTERVAL_DS with the region id
+    set and the current region offset or an absolute offset with the region id
+    set to 0.
+  PARAMETERS
+    hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    inpstring (IN) - pointer to the input string
+    str_len (IN) - inpstring length
+    result - Output Interval 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR on error
+        Bad interval type
+        Timezone errors
+  NOTES
+     The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx  **svchpp,
+                     OCIError   *errhp,
+                     Lda_Def    *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call 
+can be reversed by passing the resulting service context handle to the 
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from 
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB. 
+
+Syntax
+sword OCILobAppend ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is 
+copied from the source to the destination at the end of the destination. The 
+source and the destination must already exist. The destination LOB is 
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv                *envhp, 
+                     OCIError              *errhp, 
+                     CONST OCILobLocator   *src_locp, 
+                     OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For FILEs
+only the locator that refers to the OS file is copied to the table. The OS file
+is not copied.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv                    *envhp, 
+                          OCIError                  *errhp, 
+                          CONST OCILobLocator       *locp, 
+                          ub1                       *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic information 
+can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator.  If the input 
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept 
+of a character set for binary LOBs/FILEs.  The caller must allocate space for 
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv                    *envhp, 
+                        OCIError                  *errhp, 
+                        CONST OCILobLocator       *locp, 
+                        ub2                       *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic information 
+can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator.  If the input locator 
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a 
+character set for binary LOBs/FILEs.  The caller must allocate space for the character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp,
+                   ub4              amount,
+                   ub4              dst_offset,
+                   ub4              src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data 
+is copied from the source to the destination. The source (src_locp) and the 
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+Comments
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB, 
+               OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)-  TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one 
+              of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+	      Note: OCI_DURATION_TRANSACTION is not supported in 8.1. 
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+Comments
+
+Disable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used.  
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlush()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx      *svchp,
+                              OCIError       *errhp,
+                              OCILobLocator  *locp);
+
+Comments
+
+Enable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.  
+
+Once lob buffering is enabled for a locator, if that locator is passed to 
+one of the following routines, an error is returned:
+        OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlush()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx       *svchp,
+                  OCIError        *errhp,
+                  OCILobLocator   *locp,
+                  ub4             *amount,
+                  ub4             offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number 
+of characters/bytes and the requested number of characters/bytes will differ 
+if the end of the LOB data is reached before erasing the requested number of 
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is 
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT, 
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which to 
+start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx            *svchp,
+                        OCIError             *errhp,
+                        OCILobLocator        *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp, 
+                           OCIError  *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx     *svchp,
+                         OCIError      *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, 
+it is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv                   *envhp,
+                          OCIError                 *errhp, 
+                          CONST OCILobLocator      *filep, 
+                          OraText                     *dir_alias,
+                          ub2                      *d_length, 
+                          OraText                     *filename, 
+                          ub2                      *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.  
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in 
+errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The 
+caller must allocate enough space for the directory alias name and must not 
+write into the space.
+d_length (IN/OUT)                 
+        - IN: length of the input dir_alias string;
+        - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must 
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT) 
+        - IN: length of the input filename string;
+         - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+                         OCIError  *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic information 
+can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file 
+locator was never passed to OCILobFileOpen(), the file is considered not to 
+be opened by this locator. However, a different locator may have opened the 
+file. More than one file opens can be performed on the same file using 
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if 
+it is not. 
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE 
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx            *svchp,
+                     OCIError             *errhp,
+                     OCILobLocator        *filep,
+                     ub1                  mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not 
+be written to throough ORACLE.
+
+Parameters 
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a 
+FILE. 
+mode (IN) - mode in which to open the file. The only valid mode is read-only - 
+OCI_FILE_READONLY. 
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen, 
+OCILobFileSetName, CREATE DIRECTORY 
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv             *envhp,
+                          OCIError           *errhp,
+                          OCILobLocator      **filepp,
+                          OraText               *dir_alias,
+                          ub2                d_length, 
+                          OraText               *filename, 
+                          ub2                f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.  
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by
+calling OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the 
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx       *svchp,
+                          OCIError        *errhp,
+                          OCILobLocator   *locp,
+                          ub4              flag);
+
+Comments
+
+Flushes all buffers, associated with the lob referenced by the input
+locator, to the server.  This routine will actually write the data in
+the buffer to the lob in the database.  Lob buffering must have been
+enabled for the input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+flag    (IN)     - to indicate if the buffer resources need to be freed
+                   after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+                   Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+                   resources to be freed.
+
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp,
+
+Comments
+  Frees the contents of the temporary Lob this locator is pointing to. Note
+  that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store 
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx      *svchp,
+                           OCIError       *errhp,
+                           OCILobLocator  *locp,
+                           ub4            *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added 
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch 
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE. 
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx      *svchp,
+                        OCIError       *errhp,
+                        OCILobLocator  *locp,
+                        ub4            *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is 
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv                  *envhp,
+                      CONST OCILobLocator     *x,
+                      CONST OCILobLocator     *y,
+                      boolean                 *is_equal );
+
+Comments
+Compares the given LOB locators for equality.  Two LOB locators are equal if 
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign()
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+  Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv            *envp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envp (IN) - the environment handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+                    FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx        *svchp,
+                           OCIError         *errhp,
+                           OCILobLocator    *dst_locp,
+                           OCILobLocator    *src_filep,
+                           ub4              amount,
+                           ub4              dst_offset,
+                           ub4              src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as 
+specified.  The data is copied from the source file to the destination 
+internal LOB (BLOB/CLOB).  No character set conversions are performed 
+when copying the bfile data to a clob/nclob.  The bfile data must already
+be in the same character set as the clob/nclob in the database.  No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal 
+LOB which may be of type blob, clob, or nclob. 
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE. 
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE.  It is the 
+number of bytes from the beginning of the LOB.  The offset starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx             *svchp, 
+                            OCIError              *errhp, 
+                            CONST OCILobLocator   *src_locp, 
+                            OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv   *envhp,
+                            OCIError *errhp,
+                            CONST OCILobLocator *locp,
+                            boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic information 
+can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized; 
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+Purpose
+ Open an internal LOB or BFILE locator.
+Syntax
+sword OCILobOpen( OCISvcCtx      *svchp,
+                  OCIError       *errhp,
+                  OCILobLocator  *locp,
+                  ub1             mode);
+
+Comments
+Opens an internal LOB or a Bfile. A LOB can be opened only once in a 
+transaction. A LOB opened in a transaction has to be closed before 
+committing the transaction. Otherwise, the transaction is rolled back.
+A LOB cannot be opened in read_write mode without starting a transaction.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+mode(IN) - mode can be OCI_LOB_READONLY, OCI_LOB_READWRITE
+
+Related functions
+OCILobClose(), OCIIsLobOpen()
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer. 
+
+Syntax
+sword OCILobRead ( OCISvcCtx       *svchp,
+                   OCIError        *errhp,
+                   OCILobLocator   *locp,
+                   ub4             offset,
+                   ub4             *amtp,
+                   dvoid           *bufp,
+                   ub4             bufl,
+                   dvoid           *ctxp,  
+                   OCICallbackLobRead (cbfp)
+                                   (
+                                    dvoid         *ctxp,
+                                    CONST dvoid   *bufp,
+                                    ub4           len,
+                                    ub1           piece )
+                   ub2             csid,
+                   ub1             csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data read
+from a hole is returned as 0s. It is an error to try to read from a NULL LOB/
+FILE. The OS FILE must already exist on the server and must have been opened
+using the input locator. Oracle must hav epermission to read the OS file and 
+user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in the 
+number of characters from the beginning of the LOB, for binary LOBs it is the 
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On 
+output, the actual number of bytes or characters read. 
+If the amount of bytes to be read is larger than the buffer length it is 
+assumed that the LOB is being read in a streamed mode. On input if this value 
+is 0, then the data shall be read in streamed mode from the LOB until the end 
+of LOB. If the data is read in pieces, *amtp always contains the length of the last piece read.
+If a callback function is defined, then this callback function will be invoked 
+each time bufl bytes are read off the pipe. Each piece will be written into 
+bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will 
+be returned. The application must invoke the LOB read over and over again to 
+read more pieces of the LOB until the OCI_NEED_DATA error code is not 
+returned. The buffer pointer and the length can be different in each call 
+if the pieces are being read into different sizes and location. 
+bufp (IN) - the pointer to a buffer into which the piece will be read. The 
+length of the allocated memory is assumed to be bufl. 
+bufl (IN) - the length of the buffer in octets. 
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If 
+this is NULL, then OCI_NEED_DATA will be returned for each piece. 
+The callback function must return OCI_CONTINUE for the read to continue. 
+If any other error code is returned, the LOB read is aborted. 
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN) - a buffer pointer for the piece.
+  len (IN) - the length of length of current piece in bufp.
+  piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or 
+  OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob  Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx       *svchp,
+                 OCIError        *errhp,
+                 OCILobLocator   *locp,
+                 ub4             newlen );
+
+Comments
+Truncates LOB data to a specified shorter length. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator 
+must be a locator that was obtained from the server specified by svchp. 
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length. 
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             offset,
+                    ub4             *amtp,
+                    dvoid           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    dvoid           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    dvoid    *ctxp,
+                                    dvoid    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to the 
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWrite() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in 
+the number of characters from the beginning of the LOB, for binary LOBs it 
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. Even 
+if the data is being written in pieces, bufp must contain the first piece of 
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a 
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             *amtp,
+                    dvoid           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    dvoid           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    dvoid    *ctxp,
+                                    dvoid    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to the 
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in 
+the number of characters from the beginning of the LOB, for binary LOBs it 
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. Even 
+if the data is being written in pieces, bufp must contain the first piece of 
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a 
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx      *svchp
+                   OCIError       *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().
+This call implicitly deallocates the server, authentication, and service 
+context handles.
+Note: For more information on logging on and off in an application, 
+refer to the section "Application Initialization, Connection, and 
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to 
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       *svchp,
+                       CONST OraText      *username,
+                       ub4             uname_len,
+                       CONST OraText      *password,
+                       ub4             passwd_len,
+                       CONST OraText      *dbname,
+                       ub4             dbname_len );
+Comments
+This function is used to create a simple logon session for an application. 
+Note: Users requiring more complex session (e.g., TP monitor 
+applications) should refer to the section "Application Initialization, 
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       **svchp,
+                       CONST OraText      *username,
+                       ub4             uname_len,
+                       CONST OraText      *password,
+                       ub4             passwd_len,
+                       CONST OraText      *dbname,
+                       ub4             dbname_len,
+                       ub4             mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to 
+OCILogon() call.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle. This call assumes that 
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+                proxy session has to be created and the required grants on 
+                the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+            using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( CONST OCIStmt   *stmhp,
+                     dvoid           *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using 
+either the default memory free function or the registered memory free 
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call 
+to OCIInitialize(). 
+This call is always successful. 
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library. 
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe 
+handle or statement handle.
+Syntax
+sword OCIParamGet ( CONST dvoid       *hndlp,
+                  ub4         htype,
+                  OCIError    *errhp,
+                  dvoid    **parmdpp,
+                  ub4         pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the 
+describe handle or statement handle. Parameter descriptors are always 
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this 
+position. 
+See Appendix B for more detailed information about parameter descriptor 
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet() 
+function will return a parameter descriptor for this handle. 
+htype (IN) - the type of the handle passed in the handle parameter. Valid 
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a 
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos 
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A 
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter 
+descriptors for this position. 
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object 
+retrieval handle.
+Syntax
+sword   OCIParamGet ( dvoid *hndlp,
+                       ub4 htyp,
+                      OCIError *errhp,
+                      CONST dvoid *dscp,
+                      ub4 dtyp,
+                      ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex 
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and 
+the descriptor must have been previously allocated using OCIDescAlloc(). 
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) - 
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx     *svchp,
+                        OCIError      *errhp,
+                        CONST OraText    *user_name,
+                        ub4           usernm_len,
+                        CONST OraText    *opasswd,
+                        ub4           opasswd_len,
+                        CONST OraText    *npasswd,
+                        sb4           npasswd_len,
+                        ub4           mode);
+Comments
+This call allows the password of an account to be changed. This call is 
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates 
+the account using the old password and then changes the 
+password to the new password
+If the user authentication is not established, it establishes a user 
+authentication and authenticates the account using the old 
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and 
+OCISessionBegin() returns an error or warning which indicates that the 
+password has expired. 
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle 
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string, 
+whose length is specified in usernm_len. This parameter must be NULL if the 
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name. 
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character 
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd. 
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character 
+string, whose length is specified in npasswd_len which must be non-zero for a 
+valid password string. If the password complexity verification routine is 
+specified in the user's profile to verify the new password's complexity, the 
+new password must meet the complexity requirements of the verification 
+function.
+npasswd_len (IN)  - then length of the new password string specified in 
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( dvoid      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call 
+had been issued while a non-blocking operation was in progress. 
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult     *rsetdp,
+                         OCIError      *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer    *srvhp,
+                      OCIError     *errhp,
+                      CONST OraText   *dblink,
+                      sb4          dblink_len,
+                      ub4          mode);
+Comments
+This call is used to create an association between an OCI application and a 
+particular server. 
+This call initializes a server context handle, which must have been previously 
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a 
+service context through a call to OCIAttrSet(). Once that association has been 
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server 
+context handles can be maintained. OCI operations are performed against 
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets 
+initialized by this call. Passing in an initialized server handle causes an 
+error. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the 
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid 
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation.  For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context 
+are made in blocking mode. 
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer   *svrhp,
+                      OCIError    *errhp,
+                      ub4         mode); 
+Comments
+This call deletes an access to data source for OCI operations, which was 
+established by a call to OCIServerAttach(). 
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to 
+uninitialized state. The handle is not de-allocated. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+mode (IN) - specifies the various modes of operation. The only valid mode is 
+OCI_DEFAULT for the default mode. 
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( dvoid        *hndlp, 
+                       OCIError     *errhp, 
+                       OraText         *bufp,
+                       ub4          bufsz
+                       ub1          hndltype );
+Comments
+This call returns the version string of the Oracle server. 
+For example, the following might be returned as the version string if your 
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx     *svchp,
+                      OCIError      *errhp,
+                      OCISession    *usrhp,
+                      ub4           credt,
+                      ub4           mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle 
+before requests can be made against it. Also, OCISessionBegin() only supports 
+authenticating the user for access to the Oracle server specified by the 
+server handle in the service context. In other words, after OCIServerAttach() 
+is called to initialize a server handle, OCISessionBegin() must be called to 
+authenticate the user for that given server. 
+When OCISessionBegin() is called for the first time for the given server 
+handle, the initialized authentication handle is called a primary 
+authentication context. A primary authentication context may not be created 
+with the OCI_MIGRATE mode. Also, only one primary authentication context can 
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication 
+context is set in a service handle with a different server handle, then an 
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary 
+authentication context is set in the service handle, OCISessionBegin() may be 
+called again to initialize another authentication handle with different (or 
+the same) credentials. When OCISessionBegin() is called with a service handle 
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication 
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode. 
+If the OCI_MIGRATE mode is not specified, then the user authentication 
+context can only ever be used with the same server handle set in svchp. If 
+OCI_MIGRATE mode is specified, then the user authentication may be set 
+with different server handles. However, the user authentication context is 
+restricted to use with only server handles which resolve to the same database 
+instance and that have equivalent primary authentication contexts. Equivalent 
+authentication contexts are those which were authenticated as the same 
+database user.
+OCI_SYSDBA, OCI_SYSOPER, and OCI_PRELIM_AUTH may only be used 
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are 
+supported. The first is to provide a valid username and password pair for 
+database authentication in the user authentication handle passed to 
+OCISessionBegin(). This involves using OCIAttrSet() to set the 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the 
+authentication handle. Then OCISessionBegin() is called with 
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using 
+OCISessionEnd(), the username and password attributes remain 
+unchanged and thus can be re-used in a future call to OCISessionBegin(). 
+Otherwise, they must be reset to new values before the next 
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No 
+attributes need to be set on the authentication handle before calling 
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent 
+to the Oracle7 `connect /' syntax. If values have been set for 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are 
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server 
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized 
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication. 
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and 
+password pair as credentials. The attributes OCI_ATTR_USERNAME 
+and OCI_ATTR_PASSWORD should be set on the authentication 
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username 
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may 
+only ever be set with the same server context specified in svchp. This 
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be 
+set in a service handle with a different server handle. This mode 
+establishes the user authentication context. 
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA 
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER 
+access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA 
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCISession      *usrhp,
+                    ub4             mode);
+
+Comments
+The user security context associated with the service context is invalidated 
+by this call. Storage for the authentication context is not freed. The 
+transaction specified by the service context is implicitly committed. The 
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server 
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL, the 
+user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx           *svchp,
+                     OCIStmt             *stmtp,
+                     OCIError            *errhp,
+                     ub4                 iters,
+                     ub4                 rowoff,
+                     CONST OCISnapshot   *snap_in,
+                     OCISnapshot         *snap_out,
+                     ub4                 mode );
+Comments
+This function  is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On 
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows 
+implicitly as a response. This description is buffered on the client side for 
+describes, fetches and define type conversions. Hence it is optimal to 
+describe a select list only after an execute. 
+Also for SELECT statements, some results are available implicitly. Rows will 
+be received and buffered at the end of the execute. For queries with small row 
+count, a prefetch causes memory to be released in the server if the end of 
+fetch is reached, an optimization that may result in memory usage reduction. 
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle 
+implicitly maintains a reference to the service context on which it is 
+executed. It is the user's responsibility to maintain the integrity of the 
+service context. If the attributes of a service context is changed for 
+executing some operations on this service context, the service context must 
+be restored to have the same attributes, that a statement was executed with, 
+prior to a fetch on the statement handle. The implicit reference is maintained 
+until the statement handle is freed or the fetch is cancelled or an end of 
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a 
+call to OCIStmtExecute(), the number of rows specified by iters will be 
+fetched directly into the defined output buffers and additional rows 
+equivalent to the prefetch count will be prefetched. If there are no 
+additional rows, then the fetch is complete without calling 
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that 
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle. 
+stmtp (IN/OUT) - an statement handle - defines the statement and the 
+associated data to be executed at the server. It is invalid to pass in a 
+statement handle that has bind of data types only supported in release 8.0 
+when srvchp points to an Oracle7 server. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. If the statement is being 
+batched and it is successful, then this handle will contain this particular 
+statement execution specific errors returned from the server when the batch is 
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select 
+statements. For Select statements, if iters is non-zero, then defines must 
+have been done for the statement handle. The execution fetches iters rows into 
+these predefined buffers and prefetches more rows depending upon the prefetch 
+row count. This function returns an error if iters=0 for non-SELECT 
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for 
+this multiple row execution. 
+snap_in (IN) - this parameter is optional. if supplied, must point to a 
+snapshot descriptor of type OCI_DTYPE_SNAP.  The contents of this descriptor 
+must be obtained from the snap_out parameter of a previous call.  The 
+descriptor is ignored if the SQL is not a SELECT.  This facility allows 
+multiple service contexts to ORACLE to see the same consistent snapshot of the 
+database's committed data.  However, uncommitted data in one context is not 
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a 
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an 
+opaque representation which is the current ORACLE "system change 
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().  
+This descriptor should not be used any longer than necessary in order to avoid 
+"snapshot too old" errors. 
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is 
+immediately executed. Error handle contains diagnostics on error if any. 
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is 
+only valid if the application has set the prefetch row count prior to this 
+call. In this mode, the OCI library will get up to the number of rows 
+specified (i.e., prefetch row count plus iters). If the number of rows 
+returned by the query is greater than this value, OCI_ERROR will be 
+returned with ORA-01422 as the implementation specific error in a 
+diagnostic record. If the number of rows returned by the query is 
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will 
+be returned with ORA-01403 as the implementation specific error. The 
+prefetch buffer size is ignored and the OCI library tries to allocate all the 
+space required to contain the prefetched rows. The exact fetch semantics 
+apply to only the top level rows. No more rows can be fetched for this 
+query at the end of the call. 
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this 
+statement executed in this transaction will be maintained when the 
+transaction is detached for migration. By default, a query is cancelled 
+when a transaction is detached for migration. This mode is the default 
+mode when connected to a V7 server. 
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is 
+OCI_FETCH_NEXT, which is also the default value. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         scrollOffset,
+                   ub4         mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the 
+addition of the fetchOffset parameter. It can be used on any 
+statement handle, whether it is scrollable or not. For a 
+non-scrollable statement handle, the only acceptable value 
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be 
+ignored. Applications are encouraged to use this new call. 
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to 
+OCI_FETCH_CURRENT with a value of 0, is equivalent to 
+OCI_FETCH_NEXT with a value of 1, and equivalent to 
+OCI_FETCH_PRIOR with a value of -1. Note that the range of 
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an 
+error could be raised if sufficient rows do not exist in 
+
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) -  The acceptable values are as follows, with 
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row, 
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set, 
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set, 
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and 
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is 
+ignored for non-scrollable result sets. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+
+OCIStmtGetBindInfo()
+Name
+OCI Get Bind Parameters
+Purpose
+Gets the bind and indicator variable names.
+Syntax
+sword OCIStmtGetBindInfo ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     ub4          size,
+                     ub4          startloc,
+                     sb4          *found,
+                     OraText         *bvnp[],
+                     ub1          bvnl[],
+                     OraText         *invp[],
+                     ub1          inpl[],
+                     ub1          dupl[],
+                     OCIBind      *hndl[] );
+
+Comments
+Gets the bind and indicator variable names. It returns the information for all 
+the bind variables (even the duplicate ones) and sets the found parameter to 
+the total number of bind variables and not just the number of distinct bind 
+variables.
+The statement must have been prepared with a call to OCIStmtPrepare() prior 
+to this call. 
+This call is processed locally.
+Parameters
+stmtp (IN) - the statement handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+size (IN) - the number of elements in each array.
+startloc (IN) - position of the  bind variable at which to start getting  bind 
+information.
+found (IN) - abs(found) gives the total number of bind variables in the 
+statement irrespective of the start position. Positive value if the number of 
+bind variables returned is less than the size provided, otherwise negative.
+bvnp (OUT) - array of pointers to hold bind variable names.
+bvnl (OUT) - array to hold the length of the each bvnp element.
+invp (OUT) - array of pointers to hold indicator variable names.
+inpl (OUT) - array of pointers to hold the length of the each invp element.
+dupl (OUT) - an array whose element value is 0 or 1 depending on whether the 
+bind position is duplicate of another.
+hndl  (OUT) - an array which returns the bind handle if binds have been done 
+for the bind position. No handle is returned for duplicates.
+Related Functions
+OCIStmtPrepare()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( CONST OCIStmt  *stmtp,
+                         OCIError       *errhp,
+                         dvoid          **hndlpp,
+                         ub4            *typep,
+                         ub1            *in_outp,
+                         ub4            *iterp, 
+                         ub4            *idxp,
+                         ub1            *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a 
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the 
+relevant information: bind/define handle, iteration or index number and 
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page 
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or 
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND 
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind 
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind 
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values - 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and 
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     CONST OraText   *stmt, 
+                     ub4          stmt_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The 
+OCIStmtPrepare() call defines an application request. 
+This is a purely local call. Data values for this statement initialized in 
+subsequent bind calls will be stored in a bind handle which will hang off this 
+statement handle.
+This call does not create an association between this statement handle and any 
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information 
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+terminated string. The pointer to the text of the statement must be available 
+as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server. 
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode. 
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI 
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+                     OCIStmt      **stmtp,
+                     OCIError     *errhp,
+                     CONST OraText   *stmt,
+                     ub4          stmt_len,
+                     CONST OraText *key,
+                     ub4          key_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect. It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+             this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+              and prepared  statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+            terminated string. The pointer to the OraText of the statement 
+            must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+               caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     cONST OraText *key,
+                     ub4          key_len,
+                     ub4          mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+               caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+            OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( dvoid             *hndlp,
+                          ub4               type,
+                          OCIError          *errhp,
+                          CONST dvoid       *bufp,
+                          ub4               *alenp, 
+                          ub1               piece,
+                          CONST dvoid       *indp, 
+                          ub2               *rcodep ); 
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT 
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the 
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or 
+the piece when it is an IN bind variable, otherwise bufp is a pointer to 
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value. 
+piece (IN) - the piece parameter. The following are valid values: 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or 
+OCI_LAST_PIECE. 
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind 
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator 
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp 
+is either an sb2 or a dvoid * depending upon the data type.
+rcodep (IN/OUT) - return code. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(dvoid *hndl, OCIError *err, text *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      CONST OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use.  When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl         (IN/OUT) - OCI environment or session handle
+err          (IN/OUT) - OCI error handle
+buffer       (OUT)    - text buffer for the string
+bufferLength (IN)     - length of the text buffer
+returnLength (OUT)    - length of the formatted string
+formatString (IN)     - format specification string
+...          (IN)     - variable argument list
+Related Functions
+
+
+OCIFormatTerm 
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package dvoid Type
+Purpose
+Return the type value for the dvoid type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx    *srvhp,
+                     OCIError     *errhp,
+                     Lda_Def      *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly 
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in 
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server 
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to 
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized 
+by this call. 
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags );
+Comments
+The transaction currently associated with the service context is committed. If 
+it is a distributed transaction that the server cannot commit, this call 
+additionally retrieves the state of the transaction from the database to be 
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates 
+on the transaction currently associated with the service context. If the 
+application is working with only the implicit local transaction created when 
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated 
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed 
+transactions. If the transaction is non-distributed, the flags parameter is 
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications 
+managing global transactions should pass a value of 
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The 
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status 
+indicating that the transaction has either been committed or rolled back. With 
+distributed transactions, it is possible that the transaction is now in-doubt 
+(i.e., neither committed nor aborted). In this case, OCITransCommit() 
+attempts to retrieve the status of the transaction from the server. 
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction 
+currently attached to the service context handle becomes inactive at the end 
+of this call. The transaction may be resumed later by calling OCITransStart(), 
+specifying  a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout 
+parameter of OCITransStart() when the transaction was started is used to 
+determine the amount of time the branch can remain inactive before being 
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one 
+that detached it, provided that the transaction has the same 
+authorization.
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx     *svchp, 
+                     OCIError      *errhp,
+                     ub4           flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the 
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the 
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+
+OCITransMultiPrepare() 
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx    *svchp,
+                             ub4           numBranches,
+                             OCITrans     **txns,
+                             OCIError     **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction. 
+Parameters
+srvcp (IN) - the service context handle. 
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx    *svchp, 
+                      OCIError     *errhp,
+                      ub4          flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made 
+any changes. The error handle will indicate that the transaction is read-only. 
+The flag parameter is not currently used. 
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( dvoid        *svchp, 
+                       OCIError     *errhp,
+                       ub4          flags );
+Comments
+The current transaction- defined as the set of statements executed since the 
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated 
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction 
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the 
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx    *svchp, 
+                    OCIError     *errhp, 
+                    uword        timeout,
+                    ub4          flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The 
+transaction context currently associated with the service context handle is 
+initialized at the end of the call if the flags parameter specifies that a new 
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle 
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the 
+service context handle is initialized at the end of the call if the flag 
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+err and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become 
+available for resumption when OCI_TRANS_RESUME is specified. When 
+OCI_TRANS_NEW is specified, this value is stored and may be used later by 
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an 
+existing transaction is being resumed. Also specifies serializiability or 
+read-only status. More than a single value can be specified. By default, 
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a 
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch. 
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+******************************************************************************/
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+typedef sb4 (*OCICallbackInBind)(/*_ dvoid *ictxp, OCIBind *bindp, ub4 iter,
+                                   ub4 index, dvoid **bufpp, ub4 *alenp,
+                                   ub1 *piecep, dvoid **indp _*/);
+ 
+typedef sb4 (*OCICallbackOutBind)(/*_ dvoid *octxp, OCIBind *bindp, ub4 iter,
+                                    ub4 index, dvoid **bufpp, ub4 **alenp,
+                                    ub1 *piecep, dvoid **indp,
+                                    ub2 **rcodep _*/);
+ 
+typedef sb4 (*OCICallbackDefine)(/*_ dvoid *octxp, OCIDefine *defnp, ub4 iter,
+                                   dvoid **bufpp, ub4 **alenp, ub1 *piecep,
+                                   dvoid **indp, ub2 **rcodep _*/);
+
+typedef sword (*OCIUserCallback)(/*_ dvoid *ctxp, dvoid *hndlp, ub4 type,
+                                     ub4 fcode, ub4 when, sword returnCode,
+                                     sb4 *errnop, va_list arglist _*/);
+
+typedef sword (*OCIEnvCallbackType)(/*_ OCIEnv *env, ub4 mode,
+                                       size_t xtramem_sz, dvoid *usrmemp,
+                                       OCIUcb *ucbDesc _*/); 
+
+typedef sb4 (*OCICallbackLobRead)(/*_ dvoid *ctxp,
+                                      CONST dvoid *bufp,
+                                      ub4 len,
+                                      ub1 piece _*/);
+
+/*
+ * Called multiple times when the data is being read from the pipe
+ * ctxp (IN) - is the context passed in by the user in OCILobRead call
+ * bufp (IN) - the buffer containing the read data
+ * len  (IN) - the length of the data in the buffer that is relevant
+ * piece (IN) - one of the following, OCI_FIRST_PIECE, OCI_NEXT_PIECE
+ */
+
+typedef sb4 (*OCICallbackLobWrite)(/*_ dvoid *ctxp,
+                                       dvoid *bufp,
+                                       ub4 *lenp,
+                                       ub1 *piece _*/);
+
+/*
+ * Called multiple times when the data is being written to the pipe
+ * ctxp (IN) - is the context passed in by the user in OCILobRead call
+ * bufp (IN/OUT) - the buffer into which the data to be written is copied
+ * lenp  (OUT) - the length of the data in the buffer that is relevant
+ * piece (OUT) - one of the following, OCI_NEXT_PIECE or OCI_LAST_PIECE
+ */
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(/*_ dvoid *svcctx, dvoid *envctx,
+                                       dvoid *fo_ctx, ub4 fo_type,
+                                       ub4 fo_event _*/);
+/* Called at failover time if client has registered it. */
+typedef struct
+{
+  OCICallbackFailover callback_function;
+  dvoid *fo_ctx;
+} 
+OCIFocbkStruct;
+
+
+
+sword   OCIInitialize(/*_ ub4 mode, dvoid *ctxp,
+                          dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                          dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr,
+                                            size_t newsize),
+                          void (*mfreefp)(dvoid *ctxp, dvoid *memptr) _*/);
+
+sword   OCITerminate(ub4 mode);
+
+sword   OCIEnvCreate (/*_ OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp _*/);
+
+sword   OCIEnvNlsCreate (/*_ OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp,
+                 ub2 charset, ub2 ncharset _*/);
+
+sword   OCIFEnvCreate (/*_ OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp, dvoid *fupg _*/);
+
+sword   OCIHandleAlloc(/*_ CONST dvoid *parenth, dvoid **hndlpp, 
+                           CONST ub4 type, CONST size_t xtramem_sz,
+                           dvoid **usrmempp _*/);
+
+sword   OCIHandleFree(/*_ dvoid *hndlp, CONST ub4 type _*/);
+
+sword   OCIDescriptorAlloc(/*_ CONST dvoid *parenth, dvoid **descpp, 
+                               CONST ub4 type, CONST size_t xtramem_sz, 
+                               dvoid **usrmempp _*/);
+
+sword   OCIDescriptorFree(/*_ dvoid *descp, CONST ub4 type _*/);
+
+sword   OCIEnvInit(/*_ OCIEnv **envp, ub4 mode,
+                       size_t xtramem_sz, dvoid **usrmempp _*/);
+
+sword   OCIServerAttach(/*_ OCIServer *srvhp, OCIError *errhp,
+                            CONST OraText *dblink, sb4 dblink_len, 
+                            ub4 mode _*/);
+
+sword   OCIServerDetach(/*_ OCIServer *srvhp, OCIError *errhp, ub4 mode _*/);
+
+sword   OCISessionBegin(/*_ OCISvcCtx *svchp, OCIError *errhp,
+                            OCISession *usrhp, ub4 credt, ub4 mode _*/);
+
+sword   OCISessionEnd(/*_ OCISvcCtx *svchp, OCIError *errhp,
+                          OCISession *usrhp, ub4 mode _*/);
+
+sword OCILogon       (/*_ OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, 
+			CONST OraText *username, ub4 uname_len, 
+			CONST OraText *password, ub4 passwd_len, 
+			CONST OraText *dbname, ub4 dbname_len _*/);
+
+sword OCILogon2       (/*_ OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                        CONST OraText *username, ub4 uname_len,
+                        CONST OraText *password, ub4 passwd_len,
+                        CONST OraText *dbname, ub4 dbname_len,
+                        ub4 mode _*/);
+
+sword OCILogoff      (/*_ OCISvcCtx *svchp, OCIError *errhp _*/);
+
+sword OCIPasswordChange (/*_ OCISvcCtx *svchp, OCIError *errhp,
+                           CONST OraText *user_name, ub4 usernm_len,
+                           CONST OraText *opasswd, ub4 opasswd_len,
+                           CONST OraText *npasswd, ub4 npasswd_len, 
+                            ub4 mode _*/);
+
+sword   OCIStmtPrepare(/*_ OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+                           ub4 stmt_len, ub4 language, ub4 mode _*/);
+
+sword OCIStmtPrepare2 (/*_ OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+                     CONST OraText *stmt, ub4 stmt_len, CONST OraText *key,
+                     ub4 key_len, ub4 language, ub4 mode _*/);
+
+sword OCIStmtRelease (/*_ OCIStmt *stmtp, OCIError *errhp, CONST OraText *key,
+                       ub4 key_len, ub4 mode _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIBindByPos   (/*_ OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+			ub4 position, dvoid *valuep, sb4 value_sz,
+			ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+			ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIBindByName  (/*_ OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+			CONST OraText *placeholder, sb4 placeh_len, 
+                        dvoid *valuep, sb4 value_sz, ub2 dty, 
+                        dvoid *indp, ub2 *alenp, ub2 *rcodep, 
+                        ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+#endif /* __STDC__ */
+
+sword   OCIBindObject(/*_ OCIBind *bindp, OCIError *errhp,
+                          CONST OCIType *type, dvoid **pgvpp,
+                          ub4 *pvszsp, dvoid **indpp, ub4 *indszp _*/);
+
+sword   OCIBindDynamic(/*_ OCIBind *bindp, OCIError *errhp,
+                           dvoid *ictxp, OCICallbackInBind icbfp,
+                           dvoid *octxp, OCICallbackOutBind ocbfp _*/);
+
+sword   OCIBindArrayOfStruct(/*_ OCIBind *bindp, OCIError *errhp, ub4 pvskip,
+                                 ub4 indskip, ub4 alskip, ub4 rcskip _*/);
+
+sword   OCIStmtGetPieceInfo(/*_ OCIStmt *stmtp, OCIError *errhp,
+                                dvoid **hndlpp, ub4 *typep, ub1 *in_outp,
+                                ub4 *iterp, ub4 *idxp, ub1 *piecep _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCIStmtSetPieceInfo(/*_ dvoid *hndlp, ub4 type, OCIError *errhp,
+                                CONST dvoid *bufp, ub4 *alenp, ub1 piece,
+                                CONST dvoid *indp, ub2 *rcodep _*/);
+#endif /* __STDC__ */
+
+sword   OCIStmtExecute(/*_ OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp,
+                           ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in,
+                           OCISnapshot *snap_out, ub4 mode _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCIDefineByPos (/*_ OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+			ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+			dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode _*/);
+#endif /* __STDC__ */
+
+sword   OCIDefineObject(/*_ OCIDefine *defnp, OCIError *errhp,
+                            CONST OCIType *type, dvoid **pgvpp,
+                            ub4 *pvszsp, dvoid **indpp, ub4 *indszp _*/);
+
+sword   OCIDefineDynamic(/*_ OCIDefine *defnp, OCIError *errhp,
+                             dvoid *octxp, OCICallbackDefine ocbfp _*/);
+
+sword   OCIDefineArrayOfStruct(/*_ OCIDefine *defnp, OCIError *errhp, 
+                                 ub4 pvskip, ub4 indskip, ub4 rlskip, 
+                                 ub4 rcskip _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCIStmtFetch(/*_ OCIStmt *stmtp, OCIError *errhp,
+                         ub4 nrows, ub2 orientation, ub4 mode _*/);
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCIStmtFetch2(/*_ OCIStmt *stmtp, OCIError *errhp,
+                         ub4 nrows, ub2 orientation, sb4 scrollOffset, ub4 mode _*/);
+#endif /* __STDC__ */
+
+sword   OCIStmtGetBindInfo(/*_ OCIStmt *stmtp, OCIError *errhp, ub4 size, 
+                               ub4 startloc, sb4 *found, 
+                               OraText *bvnp[], ub1 bvnl[], OraText *invp[],
+                               ub1 inpl[], ub1 dupl[], OCIBind *hndl[] _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCIDescribeAny(/*_ OCISvcCtx *svchp, OCIError *errhp,
+                           dvoid *objptr, ub4 objnm_len, ub1 objptr_typ,
+                           ub1 info_level, ub1 objtyp, OCIDescribe *dschp _*/);
+#endif /* __STDC__ */
+
+sword   OCIParamGet(/*_ CONST dvoid *hndlp, ub4 htype, OCIError *errhp,
+                        dvoid **parmdpp, ub4 pos _*/);
+
+sword   OCIParamSet(/*_ dvoid *hdlp, ub4 htyp, OCIError *errhp,
+                        CONST dvoid *dscp, ub4 dtyp, ub4 pos _*/);
+
+sword   OCITransStart(/*_ OCISvcCtx *svchp, OCIError *errhp,
+                          uword timeout, ub4 flags _*/);
+
+sword   OCITransDetach(/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword   OCITransCommit(/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword   OCITransRollback(/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword   OCITransPrepare (/*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword   OCITransMultiPrepare (/*_ OCISvcCtx *svchp, ub4 numBranches, 
+                                  OCITrans **txns, OCIError **errhp _*/);
+
+sword   OCITransForget ( /*_ OCISvcCtx *svchp, OCIError *errhp, ub4 flags _*/);
+
+sword   OCIErrorGet   ( /*_ dvoid *hndlp, ub4 recordno, OraText *sqlstate,
+			    sb4 *errcodep, OraText *bufp, ub4 bufsiz, 
+			    ub4 type _*/ );
+
+sword   OCILobAppend  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                            OCILobLocator *dst_locp,
+                            OCILobLocator *src_locp _*/ );
+
+sword   OCILobAssign  ( /*_ OCIEnv *envhp, OCIError *errhp, 
+                            CONST OCILobLocator *src_locp, 
+                            OCILobLocator **dst_locpp _*/ );
+
+sword   OCILobCharSetForm  ( /*_ OCIEnv *envhp, OCIError *errhp, 
+                                 CONST OCILobLocator *locp, 
+                                 ub1 *csfrm _*/ );
+
+sword   OCILobCharSetId ( /*_ OCIEnv *envhp, OCIError *errhp, 
+                              CONST OCILobLocator *locp, ub2 *csid _*/ );
+
+sword   OCILobCopy  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *dst_locp,
+		          OCILobLocator *src_locp, 
+                          ub4 amount, ub4 dst_offset, 
+                          ub4 src_offset _*/ );
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobCreateTemporary(/*_ OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration _*/);
+#endif /* __STDC__ */
+
+sword OCILobClose( /*_ OCISvcCtx        *svchp,
+                       OCIError         *errhp,
+                       OCILobLocator    *locp _*/);
+
+
+sword   OCILobDisableBuffering ( /*_ OCISvcCtx      *svchp,
+                                     OCIError       *errhp,
+                                     OCILobLocator  *locp _*/ );
+
+sword   OCILobEnableBuffering ( /*_ OCISvcCtx      *svchp,
+                                    OCIError       *errhp,
+                                    OCILobLocator  *locp _*/ );
+
+sword   OCILobErase  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                           OCILobLocator *locp,
+                           ub4 *amount, ub4 offset _*/ );
+
+sword   OCILobFileClose  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                               OCILobLocator *filep _*/ );
+
+sword   OCILobFileCloseAll (/*_ OCISvcCtx *svchp, OCIError *errhp _*/);
+
+sword   OCILobFileExists   (/*_ OCISvcCtx *svchp, OCIError *errhp, 
+			      OCILobLocator *filep,
+			      boolean *flag _*/);
+ 
+sword   OCILobFileGetName  ( /*_ OCIEnv *envhp, OCIError *errhp, 
+                                 CONST OCILobLocator *filep,
+                                 OraText *dir_alias, ub2 *d_length, 
+                                 OraText *filename, ub2 *f_length _*/ );
+                            
+sword   OCILobFileIsOpen  (/*_ OCISvcCtx *svchp, OCIError *errhp, 
+                               OCILobLocator *filep,
+                               boolean *flag _*/);
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCILobFileOpen  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                            OCILobLocator *filep, ub1 mode _*/ );
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCILobFileSetName  ( /*_ OCIEnv *envhp, OCIError *errhp, 
+                                 OCILobLocator **filepp, 
+                                 CONST OraText *dir_alias, ub2 d_length, 
+                                 CONST OraText *filename, ub2 f_length _*/ );
+#endif /* __STDC__ */
+
+sword   OCILobFlushBuffer ( /*_ OCISvcCtx       *svchp,
+                                OCIError        *errhp,
+                                OCILobLocator   *locp,
+                                ub4              flag _*/ );
+
+sword OCILobFreeTemporary(/*_ OCISvcCtx          *svchp,
+                              OCIError           *errhp,
+                              OCILobLocator      *locp _*/);
+
+
+sword OCILobGetChunkSize(/*_ OCISvcCtx         *svchp,
+                             OCIError          *errhp,
+                             OCILobLocator     *locp,
+                             ub4               *chunksizep _*/);
+
+sword   OCILobGetLength  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                               OCILobLocator *locp,
+		               ub4 *lenp _*/ );
+
+sword   OCILobIsEqual  ( /*_ OCIEnv *envhp, CONST OCILobLocator *x, 
+                             CONST OCILobLocator *y, boolean *is_equal _*/ );
+
+sword OCILobIsOpen(/*_ OCISvcCtx     *svchp,
+                       OCIError      *errhp,
+                       OCILobLocator *locp,
+                       boolean       *flag _*/);
+
+sword OCILobIsTemporary(/*_ OCIEnv            *envp,
+                            OCIError          *errhp,
+                            OCILobLocator     *locp,
+                            boolean           *is_temporary _*/);
+
+sword   OCILobLoadFromFile  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                                  OCILobLocator *dst_locp,
+       	                          OCILobLocator *src_filep, 
+                                  ub4 amount, ub4 dst_offset, 
+                                  ub4 src_offset _*/ );
+
+sword   OCILobLocatorAssign  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                            CONST OCILobLocator *src_locp, 
+                            OCILobLocator **dst_locpp _*/ );
+
+
+sword   OCILobLocatorIsInit ( /*_ OCIEnv *envhp, OCIError *errhp, 
+                                CONST OCILobLocator *locp, 
+                                boolean *is_initialized _*/ );
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCILobOpen(/*_ OCISvcCtx        *svchp,
+                       OCIError         *errhp,
+                       OCILobLocator    *locp,
+                       ub1               mode _*/);
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCILobRead  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp,
+                          ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, 
+                          dvoid *ctxp, 
+                          sb4 (*cbfp)( dvoid *ctxp, 
+                                       CONST dvoid *bufp, 
+                                       ub4 len, 
+                                       ub1 piece),
+                          ub2 csid, ub1 csfrm _*/ );
+#endif /* __STDC__ */
+
+sword   OCILobTrim  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp,
+                          ub4 newlen _*/ );
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCILobWrite  ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                         OCILobLocator *locp,
+                         ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, 
+                         ub1 piece, dvoid *ctxp, 
+                         sb4 (*cbfp)(dvoid *ctxp, 
+                                     dvoid *bufp, 
+                                     ub4 *len, 
+                                     ub1 *piece),
+                         ub2 csid, ub1 csfrm _*/ );
+#endif /* __STDC__ */
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword OCILobWriteAppend(/*_
+OCISvcCtx         *svchp,
+OCIError          *errhp,
+OCILobLocator     *lobp,
+ub4              *amtp,
+dvoid            *bufp,
+ub4               bufl,
+ub1               piece,
+dvoid            *ctxp,
+sb4             (*cbfp)(dvoid  *ctxp,
+                        dvoid  *bufp,
+                        ub4    *len,
+                        ub1    *piece),
+ub2               csid,
+ub1               csfrm _*/);
+#endif /* __STDC__ */
+
+sword   OCIBreak ( /*_ dvoid *hndlp, OCIError *errhp _*/ );
+
+sword   OCIReset ( /*_ dvoid *hndlp, OCIError *errhp _*/ );
+
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCIServerVersion  ( /*_ dvoid *hndlp, OCIError *errhp, OraText *bufp, 
+                                ub4 bufsz, ub1 hndltype _*/ );
+
+sword   OCIServerRelease  ( /*_ dvoid *hndlp, OCIError *errhp, OraText *bufp,
+                                ub4 bufsz, ub1 hndltype, ub4 *version _*/ );
+
+#endif /* __STDC__ */
+
+sword   OCIAttrGet ( /*_ CONST dvoid *trgthndlp, ub4 trghndltyp, 
+                         dvoid *attributep, ub4 *sizep, ub4 attrtype, 
+                         OCIError *errhp _*/ );
+
+sword   OCIAttrSet ( /*_ dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+                         ub4 size, ub4 attrtype, OCIError *errhp _*/ );
+
+sword   OCISvcCtxToLda ( /*_ OCISvcCtx *svchp, OCIError *errhp, 
+                             Lda_Def *ldap _*/ );
+
+sword   OCILdaToSvcCtx ( /*_ OCISvcCtx **svchpp, OCIError *errhp, 
+                             Lda_Def *ldap _*/ );
+
+sword   OCIResultSetToStmt ( /*_ OCIResult *rsetdp, OCIError *errhp _*/ );
+
+
+sword	OCIUserCallbackRegister(/*_ dvoid *hndlp, ub4 type, dvoid *ehndlp,
+                                    OCIUserCallback callback, dvoid *ctxp,
+                                    ub4 fcode, ub4 when, OCIUcb *ucbDesc _*/);
+
+sword	OCIUserCallbackGet(/*_ dvoid *hndlp, ub4 type, dvoid *ehndlp,
+                               ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+                               dvoid **ctxpp, OCIUcb *ucbDesc _*/);
+
+sword   OCISharedLibInit(/*_ dvoid *metaCtx, dvoid *libCtx, ub4 argfmt,
+                             sword argc, dvoid *argv[],
+                             OCIEnvCallbackType envCallback _*/);
+
+sword   OCISecurityInitialize (/*_ OCISecurity *osshandle,
+                                 OCIError *error_handle _*/);
+
+sword   OCISecurityTerminate (/*_ OCISecurity *osshandle,
+				OCIError *error_handle _*/);
+
+sword OCISecurityOpenWallet(/*_ OCISecurity *osshandle,
+			      OCIError *error_handle,
+			      size_t wrllen,
+			      OraText *wallet_resource_locator,
+			      size_t pwdlen,
+			      OraText *password,
+			      nzttWallet *wallet _*/);
+
+sword OCISecurityCloseWallet(/*_ OCISecurity *osshandle,
+			       OCIError *error_handle,
+			       nzttWallet *wallet _*/);
+
+sword OCISecurityCreateWallet(/*_ OCISecurity *osshandle,
+				OCIError *error_handle,
+				size_t wrllen,
+				OraText *wallet_resource_locator,
+				size_t pwdlen,
+				OraText *password,
+				nzttWallet *wallet _*/);
+
+sword OCISecurityDestroyWallet(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 size_t wrllen,
+				 OraText *wallet_resource_locator,
+				 size_t pwdlen,
+				 OraText *password _*/);
+
+sword OCISecurityStorePersona(/*_ OCISecurity *osshandle,
+				OCIError *error_handle,
+				nzttPersona **persona,
+				nzttWallet *wallet _*/);
+
+sword OCISecurityOpenPersona(/*_ OCISecurity *osshandle,
+			       OCIError *error_handle,
+			       nzttPersona *persona _*/);
+
+sword OCISecurityClosePersona(/*_ OCISecurity *osshandle,
+				OCIError *error_handle,
+				nzttPersona *persona _*/);
+
+sword OCISecurityRemovePersona(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttPersona **persona _*/);
+
+sword OCISecurityCreatePersona(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttIdentType identity_type,
+				 nzttCipherType cipher_type,
+				 nzttPersonaDesc *desc,
+				 nzttPersona **persona _*/);
+
+sword OCISecuritySetProtection(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttPersona *persona,
+				 nzttcef crypto_engine_function,
+				 nztttdufmt data_unit_format,
+				 nzttProtInfo *protection_info _*/);
+
+sword OCISecurityGetProtection(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttPersona *persona,
+				 nzttcef crypto_engine_function,
+				 nztttdufmt * data_unit_format_ptr,
+				 nzttProtInfo *protection_info _*/);
+
+sword OCISecurityRemoveIdentity(/*_ OCISecurity *osshandle,
+				  OCIError *error_handle,
+				  nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityCreateIdentity(/*_ OCISecurity *osshandle,
+				  OCIError *error_handle,
+				  nzttIdentType type,
+				  nzttIdentityDesc *desc,
+				  nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityAbortIdentity(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityFreeIdentity(/*_ OCISecurity *osshandle,
+			       	  OCIError *error_handle,
+				  nzttIdentity **identity_ptr _*/);
+
+sword OCISecurityStoreTrustedIdentity(/*_ OCISecurity *osshandle,
+					OCIError *error_handle,
+					nzttIdentity **identity_ptr,
+					nzttPersona *persona _*/);
+
+sword OCISecuritySign(/*_ OCISecurity *osshandle,
+			OCIError *error_handle,
+			nzttPersona *persona,
+			nzttces signature_state,
+			size_t input_length,
+			ub1 *input,
+			nzttBufferBlock *buffer_block _*/);
+
+sword OCISecuritySignExpansion(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttPersona *persona,
+				 size_t inputlen,
+				 size_t *signature_length _*/);
+
+sword OCISecurityVerify(/*_ OCISecurity *osshandle,
+			  OCIError *error_handle,
+			  nzttPersona *persona,
+			  nzttces signature_state,
+			  size_t siglen,
+			  ub1 *signature,
+			  nzttBufferBlock *extracted_message,
+			  boolean *verified,
+			  boolean *validated,
+			  nzttIdentity **signing_party_identity _*/);
+
+sword OCISecurityValidate(/*_ OCISecurity *osshandle,
+			    OCIError *error_handle,
+			    nzttPersona *persona,
+			    nzttIdentity *identity,
+			    boolean *validated _*/);
+
+sword OCISecuritySignDetached(/*_ OCISecurity *osshandle,
+				OCIError *error_handle,
+				nzttPersona *persona,
+				nzttces signature_state,
+				size_t input_length,
+				ub1 * input,
+				nzttBufferBlock *signature _*/);
+
+sword OCISecuritySignDetExpansion(/*_ OCISecurity *osshandle,
+				    OCIError    *error_handle,
+				    nzttPersona *persona,
+				    size_t       input_length,
+				    size_t *required_buffer_length _*/);
+
+sword OCISecurityVerifyDetached(/*_ OCISecurity *osshandle,
+				  OCIError *error_handle,
+				  nzttPersona *persona,
+				  nzttces signature_state,
+				  size_t data_length,
+				  ub1 *data,
+				  size_t siglen,
+				  ub1 *signature,
+				  boolean *verified,
+				  boolean *validated,
+				  nzttIdentity **signing_party_identity _*/);
+
+sword OCISecurity_PKEncrypt(/*_ OCISecurity *osshandle,
+			      OCIError *error_handle,
+			      nzttPersona *persona,
+			      size_t number_of_recipients,
+			      nzttIdentity *recipient_list,
+			      nzttces encryption_state,
+			      size_t input_length,
+			      ub1 *input,
+			      nzttBufferBlock *encrypted_data _*/);
+
+sword OCISecurityPKEncryptExpansion(/*_ OCISecurity *osshandle,
+				      OCIError *error_handle,
+				      nzttPersona *persona,
+				      size_t number_recipients,
+				      size_t input_length,
+				      size_t *buffer_length_required _*/);
+
+sword OCISecurityPKDecrypt(/*_ OCISecurity *osshandle,
+			     OCIError *error_handle,
+			     nzttPersona *persona,
+			     nzttces encryption_state,
+			     size_t input_length,
+			     ub1 *input,
+			     nzttBufferBlock *encrypted_data _*/);
+
+sword OCISecurityEncrypt(/*_ OCISecurity *osshandle,
+			   OCIError *error_handle,
+			   nzttPersona *persona,
+			   nzttces encryption_state,
+			   size_t input_length,
+			   ub1 *input,
+			   nzttBufferBlock *encrypted_data _*/);
+
+sword OCISecurityEncryptExpansion(/*_ OCISecurity *osshandle,
+				    OCIError *error_handle,
+				    nzttPersona *persona,
+				    size_t input_length,
+				    size_t *encrypted_data_length _*/);
+
+sword OCISecurityDecrypt(/*_ OCISecurity *osshandle,
+			   OCIError *error_handle,
+			   nzttPersona *persona,
+			   nzttces decryption_state,
+			   size_t input_length,
+			   ub1 *input,
+			   nzttBufferBlock *decrypted_data _*/);
+
+sword OCISecurityEnvelope(/*_ OCISecurity *osshandle,
+			    OCIError *error_handle,
+			    nzttPersona *persona,
+			    size_t number_of_recipients,
+			    nzttIdentity *identity,
+			    nzttces encryption_state,
+			    size_t input_length,
+			    ub1 *input,
+			    nzttBufferBlock *enveloped_data _*/);
+
+sword OCISecurityDeEnvelope(/*_ OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttPersona *persona,
+                                nzttces decryption_state,
+                                size_t input_length,
+                                ub1 *input,
+                                nzttBufferBlock *output_message,
+                                boolean *verified,
+                                boolean *validated,
+                                nzttIdentity **sender_identity _*/);
+
+sword OCISecurityKeyedHash(/*_ OCISecurity *osshandle,
+			     OCIError *error_handle,
+			     nzttPersona *persona,
+			     nzttces hash_state,
+			     size_t input_length,
+			     ub1 *input,
+			     nzttBufferBlock *keyed_hash _*/);
+
+sword OCISecurityKeyedHashExpansion(/*_ OCISecurity *osshandle,
+				      OCIError *error_handle,
+				      nzttPersona *persona,
+				      size_t input_length,
+				      size_t *required_buffer_length _*/);
+
+sword OCISecurityHash(/*_ OCISecurity *osshandle,
+			OCIError *error_handle,
+			nzttPersona *persona,
+			nzttces hash_state,
+			size_t input,
+			ub1 *input_length,
+			nzttBufferBlock *hash _*/);
+
+sword OCISecurityHashExpansion(/*_ OCISecurity *osshandle,
+				 OCIError *error_handle,
+				 nzttPersona *persona,
+				 size_t input_length,
+				 size_t *required_buffer_length _*/);
+
+sword OCISecuritySeedRandom(/*_ OCISecurity *osshandle,
+			      OCIError *error_handle,
+			      nzttPersona *persona,
+			      size_t seed_length,
+			      ub1 *seed _*/);
+
+sword OCISecurityRandomBytes(/*_ OCISecurity *osshandle,
+			       OCIError *error_handle,
+			       nzttPersona *persona,
+			       size_t number_of_bytes_desired,
+			       nzttBufferBlock *random_bytes _*/);
+
+sword OCISecurityRandomNumber(/*_ OCISecurity *osshandle,
+				OCIError *error_handle,
+				nzttPersona *persona,
+				uword *random_number_ptr _*/);
+
+sword OCISecurityInitBlock(/*_ OCISecurity *osshandle,
+			     OCIError *error_handle,
+			     nzttBufferBlock *buffer_block _*/);
+
+sword OCISecurityReuseBlock(/*_ OCISecurity *osshandle,
+			      OCIError *error_handle,
+			      nzttBufferBlock *buffer_block _*/);
+
+sword OCISecurityPurgeBlock(/*_ OCISecurity *osshandle,
+			      OCIError *error_handle,
+			      nzttBufferBlock *buffer_block _*/);
+
+sword OCISecuritySetBlock(/*_ OCISecurity *osshandle,
+			    OCIError *error_handle,
+			    uword flags_to_set,
+			    size_t buffer_length,
+			    size_t used_buffer_length,
+			    ub1 *buffer,
+			    nzttBufferBlock *buffer_block _*/);
+
+sword OCISecurityGetIdentity(/*_ OCISecurity  *osshandle,
+			       OCIError       *error_handle,
+			       size_t          namelen,
+			       OraText           *distinguished_name,
+			       nzttIdentity  **identity _*/);
+
+sword OCIAQEnq(/*_ OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+                     OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop, 
+                     OCIType *payload_tdo,dvoid **payload, dvoid **payload_ind,
+		     OCIRaw **msgid, ub4 flags _*/);
+
+sword OCIAQDeq(/*_ OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+		     OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop, 
+                     OCIType *payload_tdo,dvoid **payload, dvoid **payload_ind,
+		     OCIRaw **msgid, ub4 flags _*/);
+
+sword OCIAQListen(/*_ OCISvcCtx *svchp, OCIError *errhp, 
+		      OCIAQAgent **agent_list, ub4 num_agents,
+		      sb4 wait, OCIAQAgent **agent,
+		      ub4 flags _*/);
+
+sword OCIExtractInit(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIExtractTerm(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIExtractReset(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIExtractSetNumKeys(/*_ dvoid *hndl, OCIError *err, uword numkeys _*/);
+
+sword OCIExtractSetKey(/*_ dvoid *hndl, OCIError *err, CONST OraText *name, 
+                           ub1 type, ub4 flag, CONST dvoid *defval, 
+                           CONST sb4 *intrange, 
+                           CONST OraText *CONST *strlist _*/);
+
+sword OCIExtractFromFile(/*_ dvoid *hndl, OCIError *err, ub4 flag, 
+                             OraText *filename _*/);
+
+sword OCIExtractFromStr(/*_ dvoid *hndl, OCIError *err, ub4 flag, 
+                               OraText *input _*/);
+
+sword OCIExtractToInt(/*_ dvoid *hndl, OCIError *err, OraText *keyname, 
+                          uword valno, sb4 *retval _*/);
+
+sword OCIExtractToBool(/*_ dvoid *hndl, OCIError *err, OraText *keyname, 
+                           uword valno, ub1 *retval _*/);
+
+sword OCIExtractToStr(/*_ dvoid *hndl, OCIError *err, OraText *keyname, 
+                          uword valno, OraText *retval, uword buflen _*/);
+
+sword OCIExtractToOCINum(/*_ dvoid *hndl, OCIError *err, OraText *keyname, 
+                             uword valno, OCINumber *retval _*/);
+
+sword OCIExtractToList(/*_ dvoid *hndl, OCIError *err, uword *numkeys _*/);
+
+sword OCIExtractFromList(/*_ dvoid *hndl, OCIError *err, uword index, 
+                             OraText **name, ub1 *type, uword *numvals, 
+                             dvoid ***values _*/);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(/*_ dvoid *hdl, OCIError *err, dvoid **mem,
+		OCIDuration dur, ub4 size, ub4 flags _*/);
+ 
+sword OCIMemoryResize(/*_ dvoid *hdl, OCIError *err, dvoid **mem,
+                        ub4 newsize, ub4 flags _*/);
+
+sword OCIMemoryFree(/*_ dvoid *hdl, OCIError *err, dvoid *mem _*/);
+
+sword OCIContextSetValue(/*_ dvoid *hdl, OCIError *err, OCIDuration duration,
+                        ub1 *key, ub1 keylen, dvoid *ctx_value _*/);
+ 
+sword OCIContextGetValue(/*_ dvoid *hdl, OCIError *err, ub1 *key,
+                        ub1 keylen, dvoid **ctx_value _*/);
+ 
+sword OCIContextClearValue(/*_ dvoid *hdl, OCIError *err, ub1 *key, 
+                        ub1 keylen _*/);
+ 
+sword OCIContextGenerateKey(/*_ dvoid *hdl, OCIError *err, ub4 *key _*/);
+
+sword OCIMemorySetCurrentIDs(/*_ dvoid *hdl, OCIError *err, 
+        ub4 curr_session_id, ub4 curr_trans_id, ub4 curr_stmt_id _*/);
+ 
+sword OCIPicklerTdsCtxInit(/*_ OCIEnv *env, OCIError *err, 
+			OCIPicklerTdsCtx **tdsc _*/);
+ 
+sword OCIPicklerTdsCtxFree(/*_ OCIEnv *env, OCIError *err, 
+			OCIPicklerTdsCtx *tdsc _*/);
+ 
+sword OCIPicklerTdsInit(/*_ OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc,
+			OCIPicklerTds **tdsh _*/);
+ 
+sword OCIPicklerTdsFree(/*_ OCIEnv *env, OCIError *err, 
+			OCIPicklerTds *tdsh _*/);
+ 
+sword OCIPicklerTdsCreateElementNumber(/*_ OCIEnv *env, OCIError *err,
+                                           OCIPicklerTds *tdsh, ub1 prec,
+                                           sb1 scale, 
+                                           OCIPicklerTdsElement *elt _*/);
+ 
+sword OCIPicklerTdsCreateElementChar(/*_ OCIEnv *env, OCIError *err,
+                                         OCIPicklerTds *tdsh, ub2 len, 
+                                         OCIPicklerTdsElement *elt _*/);
+ 
+sword OCIPicklerTdsCreateElementVarchar(/*_ OCIEnv *env, OCIError *err,
+                                            OCIPicklerTds *tdsh, ub2 len, 
+                                            OCIPicklerTdsElement *elt _*/);
+
+sword OCIPicklerTdsCreateElementRaw(/*_ OCIEnv *env, OCIError *err,
+                                        OCIPicklerTds *tdsh, ub2 len, 
+                                        OCIPicklerTdsElement *elt _*/);
+ 
+sword OCIPicklerTdsCreateElement(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerTds *tdsh, OCITypeCode dty, 
+				OCIPicklerTdsElement *elt _*/);
+ 
+sword OCIPicklerTdsAddAttr(/*_ OCIEnv *env, OCIError *err,
+                               OCIPicklerTds *tdsh, 
+                               OCIPicklerTdsElement elt _*/);
+ 
+sword OCIPicklerTdsGenerate(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerTds *tdsh _*/);
+ 
+sword OCIPicklerTdsGetAttr(/*_ OCIEnv *env, OCIError *err,
+                                CONST OCIPicklerTds *tdsh, ub1  attrno,
+                                OCITypeCode *typ, ub2  *len _*/);
+ 
+sword OCIPicklerFdoInit(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerFdo **fdoh _*/);
+ 
+sword OCIPicklerFdoFree(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerFdo *fdoh _*/);
+ 
+sword OCIPicklerImageInit(/*_ OCIEnv *env, OCIError *err,
+                              OCIPicklerFdo *fdoh, OCIPicklerTds *tdsh,
+                              OCIPicklerImage **imgh _*/);
+ 
+sword OCIPicklerImageFree(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerImage *imgh _*/);
+ 
+sword OCIPicklerImageAddScalar(/*_ OCIEnv *env, OCIError *err,
+                                   OCIPicklerImage *imgh, dvoid *scalar, 
+                                   ub4 len _*/);
+ 
+sword OCIPicklerImageAddNullScalar(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerImage *imgh _*/);
+ 
+sword OCIPicklerImageGenerate(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerImage *imgh _*/);
+ 
+sword OCIPicklerImageGetScalarSize(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerImage *imgh, 
+				ub4  attrno, ub4  *size _*/);
+ 
+sword OCIPicklerImageGetScalar(/*_ OCIEnv *env, OCIError *err,
+                                OCIPicklerImage *imgh, ub4  attrno, 
+				dvoid *buf, ub4  *len, OCIInd *ind _*/);
+
+sword OCIPicklerImageCollBegin(/*_ OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, CONST OCIPicklerTds *colltdsh _*/);
+ 
+sword OCIPicklerImageCollAddScalar(/*_  OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, dvoid *scalar,
+                ub4 buflen, OCIInd ind _*/);
+ 
+sword OCIPicklerImageCollEnd(/*_ OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh _*/);
+ 
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(/*_ OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, CONST OCIPicklerTds *coll_tdsh,
+                ub4 attrnum, ub4 startidx, OCIInd *ind _*/);
+ 
+sword OCIPicklerImageCollGetScalarSize(/*_ OCIEnv *env, OCIError *err,
+                CONST OCIPicklerTds *coll_tdsh, ub4 *size _*/);
+ 
+sword OCIPicklerImageCollGetScalar(/*_ OCIEnv *env, OCIError *err,
+                                       OCIPicklerImage *imgh, dvoid *buf,
+                                       ub4 *buflen, OCIInd *ind _*/);
+
+sword OCIAnyDataGetType(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode *tc, OCIType **type _*/);
+
+sword OCIAnyDataIsNull(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        boolean *isnull _*/);
+
+sword OCIAnyDataConvert(/*_ OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, dvoid *ind, dvoid *data_val,
+        ub4 len, OCIAnyData **sdata _*/);
+
+sword OCIAnyDataBeginCreate(/*_ OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, OCIAnyData **sdata _*/);
+
+sword OCIAnyDataDestroy(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata _*/);
+
+sword OCIAnyDataAttrSet(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 length, boolean is_any _*/);
+
+sword OCIAnyDataCollAddElem(/*_ OCISvcCtx *svchp, OCIError *errhp,
+        OCIAnyData *sdata, OCITypeCode tc, OCIType *type, dvoid *ind,
+        dvoid *attr_val, ub4 length, boolean is_any, boolean last_elem _*/);
+
+sword OCIAnyDataEndCreate(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata _*/);
+
+sword OCIAnyDataAccess(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, dvoid *ind, dvoid **attr_val,
+        ub4 *length _*/);
+
+sword OCIAnyDataGetCurrAttrNum(/*_ OCISvcCtx *svchp, OCIError *errhp, 
+		OCIAnyData *sdata, ub4 *attrnum _*/);
+
+sword OCIAnyDataAttrGet(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, dvoid *ind, dvoid **attr_val,
+        ub4 *length, boolean is_any _*/);
+
+sword OCIAnyDataCollGetElem(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, dvoid *ind, dvoid **celem_val,
+        ub4 *length, boolean is_any _*/);
+
+sword OCIFormatInit(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFormatString(/*_ dvoid *hndl, OCIError *err, OraText *buffer,
+                          sbig_ora bufferLength, sbig_ora *returnLength,
+                          CONST OraText *formatString, ... _*/);
+
+sword OCIFormatTerm(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFormatTUb1(/*_ void _*/);
+sword OCIFormatTUb2(/*_ void _*/);
+sword OCIFormatTUb4(/*_ void _*/);
+sword OCIFormatTUword(/*_ void _*/);
+sword OCIFormatTUbig_ora(/*_ void _*/);
+sword OCIFormatTSb1(/*_ void _*/);
+sword OCIFormatTSb2(/*_ void _*/);
+sword OCIFormatTSb4(/*_ void _*/);
+sword OCIFormatTSword(/*_ void _*/);
+sword OCIFormatTSbig_ora(/*_ void _*/);
+sword OCIFormatTEb1(/*_ void _*/);
+sword OCIFormatTEb2(/*_ void _*/);
+sword OCIFormatTEb4(/*_ void _*/);
+sword OCIFormatTEword(/*_ void _*/);
+sword OCIFormatTChar(/*_ void _*/);
+sword OCIFormatTText(/*_ void _*/);
+sword OCIFormatTDouble(/*_ void _*/);
+sword OCIFormatTDvoid(/*_ void _*/);
+sword OCIFormatTEnd(/*_ void _*/);
+
+sword OCIFileClose (/*_ dvoid  *hndl, OCIError *err, OCIFileObject *filep _*/);
+
+
+sword OCIFileExists (/*_ dvoid  *hndl, OCIError *err, OraText *filename,
+                     OraText *path, ub1 *flag _*/ );
+
+sword OCIFileFlush(/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep _*/ );
+
+sword OCIFileGetLength(/*_ dvoid *hndl, OCIError *err, OraText *filename,
+                        OraText *path, ubig_ora *lenp _*/ );
+
+sword OCIFileInit (/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFileOpen (/*_ dvoid *hndl, OCIError *err, OCIFileObject **filep,
+                    OraText *filename, OraText *path, ub4 mode, ub4 create, 
+                    ub4 type _*/);
+
+sword OCIFileRead (/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep,
+                    dvoid *bufp, ub4 bufl, ub4 *bytesread _*/);
+
+sword OCIFileSeek (/*_ dvoid *hndl, OCIError *err, OCIFileObject *filep,
+                     uword origin, ubig_ora offset, sb1 dir _*/);
+
+sword OCIFileTerm (/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIFileWrite (/*_ dvoid *hndl, OCIError *err, OCIFileObject   *filep,
+                     dvoid *bufp, ub4 buflen, ub4 *byteswritten _*/);
+
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+   NAME
+     xaosvch  -  XA Oracle get SerViCe Handle
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(/*_ OraText *dbname _*/);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+   NAME
+     xaoSvcCtx  -  XA Oracle get SerViCe ConTeXt
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the service
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCISvcCtx *xaoSvcCtx(/*_ OraText *dbname _*/);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+   NAME
+     xaoEnv  -  XA Oracle get ENvironment Handle
+   DESCRIPTION
+     Given a database name return the environment handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the environment
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCIEnv *xaoEnv(/*_ OraText *dbname _*/);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+   NAME
+     xaosterr  -  XA Oracle get xa STart ERRor code
+   DESCRIPTION
+     Given an oracle error code return the XA error code
+ */
+int xaosterr(/*_ OCISvcCtx *svch, sb4 error _*/);
+/*-------------------------- End Extensions ---------------------------------*/
+
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+   NAME
+     OCINlsGetInfo - Get NLS info from OCI environment handle
+   REMARKS
+     This function generates language information specified by item from OCI 
+     environment handle envhp into an array pointed to by buf within size 
+     limitation as buflen.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   buf(OUT)
+     Pointer to the destination buffer.
+   buflen(IN)
+     The size of destination buffer. The maximum length for each information
+     is 32 bytes.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_DAYNAME1 : Native name for Monday.
+       OCI_NLS_DAYNAME2 : Native name for Tuesday.
+       OCI_NLS_DAYNAME3 : Native name for Wednesday.
+       OCI_NLS_DAYNAME4 : Native name for Thursday.
+       OCI_NLS_DAYNAME5 : Native name for Friday.
+       OCI_NLS_DAYNAME6 : Native name for for Saturday.
+       OCI_NLS_DAYNAME7 : Native name for for Sunday.
+       OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+       OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+       OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+       OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+       OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+       OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+       OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+       OCI_NLS_MONTHNAME1 : Native name for January.
+       OCI_NLS_MONTHNAME2 : Native name for February.
+       OCI_NLS_MONTHNAME3 : Native name for March.
+       OCI_NLS_MONTHNAME4 : Native name for April.
+       OCI_NLS_MONTHNAME5 : Native name for May.
+       OCI_NLS_MONTHNAME6 : Native name for June.
+       OCI_NLS_MONTHNAME7 : Native name for July.
+       OCI_NLS_MONTHNAME8 : Native name for August.
+       OCI_NLS_MONTHNAME9 : Native name for September.
+       OCI_NLS_MONTHNAME10 : Native name for October.
+       OCI_NLS_MONTHNAME11 : Native name for November.
+       OCI_NLS_MONTHNAME12 : Native name for December.
+       OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+       OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+       OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+       OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+       OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+       OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+       OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+       OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+       OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+       OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+       OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+       OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+       OCI_NLS_YES : Native string for affirmative response.
+       OCI_NLS_NO : Native negative response. 
+       OCI_NLS_AM : Native equivalent string of AM.
+       OCI_NLS_PM : Native equivalent string of PM.
+       OCI_NLS_AD : Native equivalent string of AD.
+       OCI_NLS_BC : Native equivalent string of BC.
+       OCI_NLS_DECIMAL : decimal character.
+       OCI_NLS_GROUP : group separator.
+       OCI_NLS_DEBIT : Native symbol of debit.
+       OCI_NLS_CREDIT : Native sumbol of credit.
+       OCI_NLS_DATEFORMAT : Oracle date format.
+       OCI_NLS_INT_CURRENCY: International currency symbol.
+       OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+       OCI_NLS_LANGUAGE : Language name.
+       OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+       OCI_NLS_TERRITORY : Territory name.
+       OCI_NLS_CHARACTER_SET : Character set name.
+       OCI_NLS_LINGUISTIC : Linguistic name.
+       OCI_NLS_CALENDAR : Calendar name.
+       OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(/*_ dvoid *envhp, OCIError *errhp, OraText *buf,
+                    size_t buflen, ub2 item _*/);
+
+/* ----------------------- OCINlsNumericInfoGet ----------------------------*/
+/*
+   NAME
+     OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+   REMARKS
+     This function generates numeric language information specified by item 
+     from OCI environment handle envhp into an output number variable.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   val(OUT)
+     Pointer to the output number variable. On OCI_SUCCESS return, it will
+     contain the requested NLS numeric info.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+                                   environment or session handle charset
+       OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+                                   0 for variable-width charset
+*/
+sword OCINlsNumericInfoGet(/*_ dvoid *envhp, OCIError *errhp, sb4 *val, 
+                           ub2 item _*/);
+
+/* ----------------------- OCINlsCharSetNameToId -----------------------------*/
+/*
+   NAME
+     OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+   REMARKS
+     This function will get the Oracle character set id corresponding to
+     the given Oracle character set name.
+   RETURNS
+     Oracle character set id for the given Oracle character set name if
+     character set name and OCI handle are valid; otherwise returns 0.
+   envhp(IN/OUT)
+     OCI environment handle.
+   name(IN)
+     Pointer to a null-terminated Oracle character set name whose id 
+     will be returned.
+*/
+ub2 OCINlsCharSetNameToId(/*_ dvoid *envhp, const oratext *name _*/);
+
+/* ----------------------- OCINlsCharSetIdToName -----------------------------*/
+/*
+   NAME
+     OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+   REMARKS
+     This function will get the Oracle character set name corresponding to
+     the given Oracle character set id.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+     the null-terminated string for character set name.
+   buflen(IN)
+     Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+     guarantee to store an Oracle character set name. If it's smaller than
+     the length of the character set name, the function will return OCI_ERROR.
+   id(IN)
+     Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(/*_ dvoid *envhp, oratext *buf, size_t buflen, 
+                            ub2 id _*/);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+   NAME
+     OCINlsNameMap - Map NLS naming from Oracle to other standards and vice 
+                     versa
+   REMARKS
+     This function will map NLS naming from Oracle to other standards (such
+     as ISO, IANA) and vice versa.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will 
+     contain null-terminated string for requested mapped name.
+   buflen(IN)
+     The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+     for guarantee to store an NLS name. If it is smaller than the length
+     of the name, the function will return OCI_ERROR.
+   srcbuf(IN)
+     Pointer to null-terminated NLS name. If it is not a valid name in its
+     define scope, the function will return OCI_ERROR.
+   flag(IN)
+     It specifies name mapping direction and can take the following values:
+       OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+       OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+       OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+       OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+       OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+       OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+                                  abbreviation to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+                                  ISO abbreviation
+*/
+sword OCINlsNameMap(/*_ dvoid *envhp, oratext *buf, size_t buflen,
+                    const oratext *srcbuf, ub4 flag _*/);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+   NAME
+     OCIMultiByteToWideChar - Convert a null terminated multibyte string into 
+                              wchar
+   REMARKS
+     This routine converts an entire null-terminated string into the wchar 
+     format. The wchar output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for wchar.
+   src (IN)
+     Source string to be converted.
+   rsize (OUT)
+     Number of characters converted including null-terminator.
+     If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(/*_ dvoid *envhp, OCIWchar *dst, 
+                            CONST OraText *src, size_t *rsize _*/);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+   NAME
+     OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+                                    wchar
+   REMARKS
+     This routine converts part of string into the wchar format. It will
+     convert as many complete characters as it can until it reaches output
+     buffer size or input buffer size or it reaches a null-terminator in
+     source string. The output buffer will be null-terminated if space permits.
+     If dstsz is zero, this function will only return number of characters not
+     including ending null terminator for converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Pointer to a destination buffer for wchar. It can be NULL pointer when
+     dstsz is zero.
+   dstsz(IN)
+     Destination buffer size in character. If it is zero, this function just
+     returns number of characters will be need for the conversion.
+   src (IN)
+     Source string to be converted.
+   srcsz(IN)
+     Length of source string in byte.
+   rsize(OUT)
+     Number of characters written into destination buffer, or number of
+     characters for converted string is dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(/*_ dvoid *envhp, OCIWchar *dst,
+                                  size_t dstsz, CONST OraText *src, 
+                                  size_t srcsz, size_t *rsize _*/);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharToMultiByte - Convert a null terminated wchar string into
+                              multibyte
+   REMARKS
+     This routine converts an entire null-terminated wide character string into
+     multi-byte string. The output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte string.
+   src (IN)
+     Source wchar string to be converted.
+   rsize (OUT)
+     Number of bytes written into the destination buffer.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(/*_ dvoid *envhp, OraText *dst, 
+                            CONST OCIWchar *src, size_t *rsize _*/);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+   NAME
+     OCIWideCharInSizeToMultiByte - Convert a wchar string in length into 
+                                    mulitbyte
+   REMARKS
+     This routine converts part of wchar string into the multi-byte format.
+     It will convert as many complete characters as it can until it reaches
+     output buffer size or input buffer size or it reaches a null-terminator
+     in source string. The output buffer will be null-terminated if space
+     permits. If dstsz is zero, the function just returns the size of byte not 
+     including ending null-terminator need to store the converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte. It can be NULL pointer if dstsz is zero.
+   dstsz(IN)
+     Destination buffer size in byte. If it is zero, it just returns the size
+     of bytes need for converted string.
+   src (IN)
+     Source wchar string to be converted.
+   srcsz(IN)
+     Length of source string in character.
+   rsize(OUT)
+     Number of bytes written into destination buffer, or number of bytes need
+     to store the converted string if dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(/*_ dvoid *envhp, OraText *dst,
+                                    size_t dstsz, CONST OCIWchar *src,
+                                    size_t srcsz, size_t *rsize _*/);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+   REMARKS
+     It tests whether wc is a letter or decimal digit.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+   REMARKS
+     It tests whether wc is an alphabetic letter
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+   NAME
+     OCIWideCharIsCntrl - test whether wc is a control character
+   REMARKS
+     It tests whether wc is a control character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsDigit - test whether wc is a decimal digit character
+   REMARKS
+     It tests whether wc is a decimal digit character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsGraph - test whether wc is a graph character
+   REMARKS
+     It tests whether wc is a graph character. A graph character is character
+     with a visible representation and normally includes alphabetic letter,
+     decimal digit, and punctuation.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsLower - test whether wc is a lowercase letter
+   REMARKS
+     It tests whether wc is a lowercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsLower(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPrint - test whether wc is a printable character
+   REMARKS
+     It tests whether wc is a printable character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPunct - test whether wc is a punctuation character
+   REMARKS
+     It tests whether wc is a punctuation character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsSpace - test whether wc is a space character
+   REMARKS
+     It tests whether wc is a space character. A space character only causes
+     white space in displayed text(for example, space, tab, carriage return,
+     newline, vertical tab or form feed).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsUpper - test whether wc is a uppercase letter
+   REMARKS
+     It tests whether wc is a uppercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+   REMARKS
+     It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharIsSingleByte - test whether wc is a single-byte character
+   REMARKS
+     It tests whether wc is a single-byte character when converted into
+     multi-byte.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharToLower - Convert a wchar into the lowercase
+   REMARKS
+     If there is a lower-case character mapping for wc in the specified locale,
+     it will return the lower-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharToUpper - Convert a wchar into the uppercase
+   REMARKS
+     If there is a upper-case character mapping for wc in the specified locale,
+     it will return the upper-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcmp - compare two null terminated wchar string
+   REMARKS
+     It compares two wchar string in binary ( based on wchar encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if wstr1 == wstr2.
+     Positive, if wstr1 > wstr2.
+     Negative, if wstr1 < wstr2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   wstr1(IN)
+     Pointer to a null-terminated wchar string.
+   wstr2(IN)
+     Pointer to a null-terminated wchar string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+     comparison.
+*/
+int OCIWideCharStrcmp(/*_ dvoid *envhp, CONST OCIWchar *wstr1, 
+                CONST OCIWchar *wstr2, int flag _*/);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncmp - compare twe wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcmp(), except that at most len1
+     characters from wstr1 and len2 characters from wstr1 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if wstr1 = wstr2
+     Positive, if wstr1 > wstr2
+     Negative, if wstr1 < wstr2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr1(IN)
+     Pointer to the first wchar string
+   len1(IN)
+     The length for the first string for comparison
+   wstr2(IN)
+     Pointer to the second wchar string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIWideCharStrncmp(/*_ dvoid *envhp, CONST OCIWchar *wstr1, size_t len1,
+                 CONST OCIWchar *wstr2, size_t len2, int flag _*/);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcat - concatenate two wchar strings
+   REMARKS
+     This function appends a copy of the wchar string pointed to by wsrcstr,
+     including the null-terminator to the end of wchar string pointed to by
+     wdststr. It returns the number of character in the result string not
+     including the ending null-terminator.
+   RETURNS
+     number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(/*_ dvoid *envhp, OCIWchar *wdststr,
+                         CONST OCIWchar *wsrcstr _*/);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+   REMARKS
+     This function searchs for the first occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(/*_ dvoid *envhp, CONST OCIWchar *wstr,
+                            OCIWchar wc _*/);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcpy - copy a wchar string
+   REMARKS
+     This function copies the wchar string pointed to by wsrcstr, including the 
+     null-terminator, into the array pointed to by wdststr. It returns the
+     number of character copied not including the ending null-terminator.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(/*_ dvoid *envhp, OCIWchar *wdststr,
+                         CONST OCIWchar *wsrcstr _*/);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrlen - Return number of character in a wchar string
+   REMARKS
+     This function computes the number of characters in the wchar string
+     pointed to by wstr, not including the null-terminator, and returns
+    this number. 
+   RETURNS
+     number of characters not including ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(/*_ dvoid *envhp, CONST OCIWchar *wstr _*/);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncat - Concatenate wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcat(), except that at most n
+     characters from wsrcstr are appended to wdststr. Note that the
+     null-terminator in wsrcstr will stop appending. wdststr will be
+     null-terminated.. 
+   RETURNS
+     Number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+   n(IN)
+     Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(/*_ dvoid *envhp, OCIWchar *wdststr,
+                          CONST OCIWchar *wsrcstr, size_t n _*/);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncpy - Copy wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcpy(), except that at most n
+     characters are copied from the array pointed to by wsrcstr to the array
+     pointed to by wdststr. Note that the null-terminator in wdststr will
+     stop coping and result string will be null-terminated.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+   n(IN)
+     Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(/*_ dvoid *envhp, OCIWchar *wdststr,
+                          CONST OCIWchar *wsrcstr, size_t n _*/);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+   REMARKS
+     This function searchs for the last occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(/*_ dvoid *envhp, CONST OCIWchar *wstr,
+                             OCIWchar wc _*/);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+   NAME
+     OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+                                    uppercase
+   REMARKS
+     This function convert the wide char string pointed to by wsrcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by wdststr. The result string will be null-terminated.
+   RETURNS
+     number of characters for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   wdststr(OUT)
+     Pointer to destination array.
+   wsrcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE : convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(/*_ dvoid *envhp, OCIWchar *wdststr,
+                                    CONST OCIWchar *wsrcstr, ub4 flag _*/);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+   NAME
+     OCIWideCharDisplayLength - Calculate the display length for a wchar
+   REMARKS
+     This function determines the number of column positions required for wc
+     in display. It returns number of column positions, or 0 if wc is 
+     null-terminator.
+   RETURNS
+     Number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharDisplayLength(/*_ dvoid *envhp, OCIWchar wc  _*/);
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+   NAME
+     OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+   REMARKS
+     This function determines the number of byte required for wc in multi-byte
+     encoding. It returns number of bytes in multi-byte for wc.
+   RETURNS
+     Number of bytes.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(/*_ dvoid *envhp, OCIWchar wc _*/);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcmp - Compare two multi-byte strings
+   REMARKS
+     It compares two multi-byte strings in binary ( based on encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if str1 == str2.
+     Positive, if str1 > str2.
+     Negative, if str1 < str2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to a null-terminated string.
+   str2(IN)
+     Pointer to a null-terminated string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrcmp(/*_ dvoid *envhp, CONST OraText *str1,
+                       CONST OraText *str2, int flag _*/);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncmp - compare two strings in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcmp(), except that at most len1 bytes
+     from str1 and len2 bytes from str2 are compared. The null-terminator will
+     be taken into the comparison.
+   RETURNS
+     0, if str1 = str2
+     Positive, if str1 > str2
+     Negative, if str1 < str2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to the first string
+   len1(IN)
+     The length for the first string for comparison
+   str2(IN)
+     Pointer to the second string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrncmp(/*_ dvoid *envhp, CONST OraText *str1, size_t len1,
+                        OraText *str2, size_t len2, int flag _*/);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcat - concatenate multibyte strings
+   REMARKS
+     This function appends a copy of the multi-byte string pointed to by
+     srcstr, including the null-terminator to the end of string pointed to by
+     dststr. It returns the number of bytes in the result string not including
+     the ending null-terminator.
+   RETURNS
+     number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle
+   dststr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   srcstr(IN)
+     Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(/*_ dvoid *envhp, OraText *dststr,
+                          CONST OraText *srcstr _*/);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcpy - copy multibyte string
+   REMARKS
+     This function copies the multi-byte string pointed to by srcstr,
+     including the null-terminator, into the array pointed to by dststr. It
+     returns the number of bytes copied not including the ending 
+     null-terminator.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to the OCI environment handle.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(/*_ dvoid *envhp, OraText *dststr,
+                          CONST OraText *srcstr _*/);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrlen - Calculate multibyte string length
+   REMARKS
+     This function computes the number of bytes in the multi-byte string
+     pointed to by str, not including the null-terminator, and returns this
+     number. 
+   RETURNS
+     number of bytes not including ending null-terminator.
+   str(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(/*_ dvoid *envhp, CONST OraText *str _*/);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncat - concatenate string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcat(), except that at most n
+     bytes from srcstr are appended to dststr. Note that the null-terminator in
+     srcstr will stop appending and the function will append as many character
+     as possible within n bytes. dststr will be null-terminated. 
+   RETURNS
+     Number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle.
+   srcstr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   dststr(IN)
+     Pointer to the source multi-byte string to append.
+   n(IN)
+     Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(/*_ dvoid *envhp, OraText *dststr,
+                           CONST OraText *srcstr, size_t n _*/);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncpy - copy multibyte string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcpy(), except that at most n
+     bytes are copied from the array pointed to by srcstr to the array pointed
+     to by dststr. Note that the null-terminator in srcstr will stop coping and
+     the function will copy as many character as possible within n bytes. The 
+     result string will be null-terminated.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to a OCI environment handle.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   n(IN)
+     Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(/*_ dvoid *envhp, OraText *dststr,
+                           CONST OraText *srcstr, size_t n _*/);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrnDisplayLength - calculate the display length for a
+                                     multibyt string
+   REMARKS
+     This function returns the number of display positions occupied by the 
+     complete characters within the range of n bytes.
+   RETURNS
+     number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle.
+   str(IN)
+     Pointer to a multi-byte string.
+   n(IN)
+     Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(/*_ dvoid *envhp, CONST OraText *str1,
+                                     size_t n _*/);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion  ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrCaseConversion
+   REMARKS
+     This function convert the multi-byte string pointed to by srcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by dststr. The result string will be null-terminated.
+   RETURNS
+     number of bytes for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   dststr(OUT)
+     Pointer to destination array.
+   srcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE: convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the 
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(/*_ dvoid *envhp, OraText *dststr,
+                                     CONST OraText *srcstr, ub4 flag _*/);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+   NAME
+     OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+   REMARKS
+     This function converts a multi-byte string pointed to by src to Unicode 
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. 
+     The function will return number of characters converted into Unicode.
+     If dstlen is zero, it will just return the number of characters for the
+     result without real conversion.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle
+   dst(OUT)
+     Pointer to a destination buffer
+   dstlen(IN)
+     Size of destination buffer in character
+   src(IN)
+     Pointer to multi-byte source string.
+   srclen(IN)
+     Size of source string in bytes.
+   rsize(OUT)
+     Number of characters converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(/*_ dvoid *envhp, ub2 *dst, size_t dstlen,
+                        CONST OraText *src, size_t  srclen, size_t *rsize _*/);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+   NAME
+     OCIUnicodeToCharSet - convert Unicode into multibyte
+   REMARKS
+     This function converts a Unicode string pointed to by src to multi-byte
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. The function will
+     return number of bytes converted into multi-byte. If dstlen is zero, it
+     will just return the number of bytes for the result without real 
+     conversion. If a Unicode character is not convertible for the character
+     set specified in OCI environment handle, a replacement character will be
+     used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+     return ture.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle.
+   dst(OUT)
+     Pointer to a destination buffer.
+   dstlen(IN)
+     Size of destination buffer in byte.
+   src(IN)
+     Pointer to a Unicode string.
+   srclen(IN)
+     Size of source string in characters.
+   rsize(OUT)
+     Number of bytes converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(/*_ dvoid *envhp, OraText *dst, size_t dstlen, 
+                           CONST ub2 *src, size_t srclen, size_t *rsize _*/);
+
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+   NAME
+     OCINlsCharSetConvert - convert between any two character set.
+   REMARKS
+     This function converts a string pointed to by src in the character set
+     specified with srcid to the array pointed to by dst in the character set
+     specified with dstid. The conversion will stop when it reaches the source
+     limitation or destination limitation. The function will return the number
+     of bytes converted into the destination buffer. Even though either source
+     or destination character set id is OCI_UTF16ID, given and return data
+     length will be represented with the byte length as this function is
+     intended for generic purpose. Note the conversion will not stop at null
+     data.
+     To get character set id from name, OCINlsCharSetNameToId can be used.
+     To check if derived data in the destination buffer contains any
+     replacement character resulting from conversion failure,
+     OCICharSetConversionIsReplacementUsed can be used to get the status.
+     Data alignment should be guaranteed by a caller. For example, UTF-16 data
+     should be aligned to ub2 type.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+   errhp(IN/OUT)
+     OCI error handle. If there is an error, it is recorded in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained
+     by calling OCIErrorGet().
+   dstid(IN)
+     Character set id for the destination buffer.
+   dstp(OUT)
+     Pointer to the destination buffer.
+   dstlen(IN)
+     The maximum byte size of destination buffer.
+   srcid(IN)
+     Character set id for the source buffer.
+   srcp(IN)
+     Pointer to the source buffer.
+   srclen(IN)
+     The length byte size of source buffer.
+   rsize(OUT)
+     The number of characters converted. If it is a NULL pointer, nothing to
+     return.
+*/
+sword OCINlsCharSetConvert(/*_ dvoid *envhp, OCIError *errhp, 
+                        ub2 dstid, dvoid *dstp, size_t dstlen,
+                        ub2 srcid, CONST dvoid *srcp, size_t srclen,
+                        size_t *rsize _*/);
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+   NAME
+     OCICharsetConversionIsReplacementUsed - chech if replacement is used in 
+                                             conversion
+   REMARKS
+     This function indicates whether or not the replacement character was used
+     for nonconvertible characters in character set conversion in last invoke
+     of OCICharsetUcs2ToMb().
+   RETURNS
+     TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+     invoking, else FALSE.
+   envhp(IN/OUT)
+     OCI environment handle. This should be the first handle passed to 
+     OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(/*_ dvoid *envhp _*/);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+   NAME
+     OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+   DESCRIPTION
+     This function retrieves a value of NLS environment variable to the buffer
+     pointed to by val. Data type is determined by the parameter specified by
+     item. Either numeric data or string data can be retrieved.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+
+   PARAMETERS
+   valp(OUT) -
+     Pointer to the buffer.
+   size(IN) -
+     Size of the buffer. This argument is only applicable to string data type,
+     but not to numerical data, in such case, it is ignored.
+   item(IN) -
+     NLS item value, which can be one of following values:
+       OCI_NLS_CHARSET_ID  - NLS_LANG character set id in ub2 data type.
+       OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+   charset(IN) -
+     Character set id for retrieved string data. If it is 0, NLS_LANG will be
+     used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+     is ignored.
+   rsize(OUT) -
+     Size of return value.
+
+   NOTE
+     This functions is mainly used for retrieving character set id from either
+     NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+     the default character set id is returned.
+     For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(/*_ dvoid  *valp, size_t size, ub2 item,
+                                   ub2 charset, size_t *rsize _*/);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+   NAME
+     OCIMessageOpen - open a locale message file
+   REMARKS
+     This function opens a message handle for facility of product in a language
+     pointed to by envhp. It first try to open the message file corresponding
+     to envhp for the facility. If it successes, it will use that file to
+     initialize a message handle, else it will use the default message file
+     which is for American language for the facility. The function return a
+     pointer pointed to a message handle into msghp parameter.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(OUT)
+     a message handle for return
+   product(IN)
+     A pointer to a product name. Product name is used to locate the directory
+     for message in a system dependent way. For example, in Solaris, the
+     directory of message files for the product `rdbms' is
+     `${ORACLE_HOME}/rdbms'.
+   facility(IN)
+     A pointer to a facility name in the product. It is used to construct a
+     message file name. A message file name follows the conversion with 
+     facility as prefix. For example, the message file name for facility
+     `img' in American language will be `imgus.msb' where `us' is the 
+     abbreviation of American language and `msb' as message binary file 
+     extension.
+   dur(IN)
+     Duration for memory allocation for the return message handle. It can be
+     the following values:
+        OCI_DURATION_CALL
+        OCI_DURATION_STATEMENT
+        OCI_DURATION_SESSION
+        OCI_DURATION_TRANSACTION
+     For the detail description, please refer to Memory Related Service
+     Interfaces section.
+*/
+sword OCIMessageOpen(/*_ dvoid *envhp, OCIError *errhp, OCIMsg **msghp,
+                      CONST OraText *product, CONST OraText *facility, 
+                      OCIDuration dur _*/);
+ 
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+   NAME
+     OCIMessageGet - get a locale message from a message handle
+   REMARKS
+     This function will get message with message number identified by msgno and
+     if buflen is not zero, the function will copy the message into the buffer
+     pointed to by msgbuf. If buflen is zero, the message will be copied into
+     a message buffer inside the message handle pointed to by msgh. For both
+     cases. it will return the pointer to the null-terminated message string.
+     If it cannot get the message required, it will return a NULL pointer.
+   RETURNS
+     A pointer to a null-terminated message string on success, otherwise a NULL
+     pointer.
+   msgh(IN/OUT)
+     Pointer to a message handle which was previously opened by OCIMessageOpen().
+   msgno(IN)
+     The message number for getting message.
+   msgbuf(OUT)
+     Pointer to a destination buffer to the message retrieved. If buflen is
+     zero, it can be NULL pointer.
+   buflen(IN)
+     The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(/*_ OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+                        size_t buflen _*/);
+
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+   NAME
+     OCIMessageClose - close a message handle
+   REMARKS
+     This function closes a message handle pointed to by msgh and frees any
+     memory associated with this handle.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(IN/OUT)
+     A pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+*/
+sword OCIMessageClose(/*_ dvoid *envhp, OCIError *errhp, OCIMsg *msghp _*/);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers.  It offers a portable interface to
+threading capabilities native to various platforms.  It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded 
+facilities.  It only serves as a set of portable covers for native 
+multithreaded facilities.  Therefore, platforms that do not have native 
+support for multi-threading will only be able to support a limited 
+implementation of OCIThread.  As a result, products that rely on all of 
+OCIThread's functionality will not port to all platforms.  Products that must 
+port to all platforms must use only a subset of OCIThread's functionality.  
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts.  Each part is described
+briefly here.  The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+     These calls deal with the initialization and termination of OCIThread.
+     Initialization of OCIThread initializes the OCIThread context which is
+     a member of the OCI environment or session handle.  This context is 
+     required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+     The passive threading primitives include primitives to manipulate mutual
+     exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+     The reason that these primitives are described as 'passive' is that while
+     their specifications allow for the existence of multiple threads, they do
+     not require it.  This means that it is possible for these primitives to
+     be implemented according to specification in both single-threaded and
+     multi-threaded environments.
+
+     As a result, OCIThread clients that use only these primitives will not
+     require the existence of multiple threads in order to work correctly,
+     i.e., they will be able to work in single-threaded environments without 
+     branching code.
+
+ 3. Active Threading Primitives
+
+     Active threading primitives include primitives dealing with the creation,
+     termination, and other manipulation of threads.
+
+     The reason that these primitives are described as 'active' is that they
+     can only be used in true multi-threaded environments.  Their
+     specifications explicitly require that it be possible to have multiple
+     threads.  If you need to determine at runtime whether or not you are in a
+     multi-threaded environment, call OCIThreadIsMulti() before calling an
+     OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package.  OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment.  It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+  OCIThreadContext - OCIThread Context
+  -------------------------------------
+
+    Most calls to OCIThread functions take the OCI environment or session 
+    handle as a parameter.  The OCIThread context is part of the OCI 
+    environment or session handle and it must be initialized by calling 
+    'OCIThreadInit()'.  Termination of the OCIThread context occurs by calling
+    'OCIThreadTerm()'.
+
+    The OCIThread context is a private data structure.  Clients must NEVER
+    attempt to examine the contents of the context.
+
+1.1.2  OCIThreadProcessInit
+
+  OCIThreadProcessInit - OCIThread Process INITialization
+  --------------------------------------------------------
+
+    Description
+
+      This function should be called to perform OCIThread process
+      initialization.
+
+    Prototype
+
+      void OCIThreadProcessInit();
+
+    Returns
+
+      Nothing.
+
+    Notes
+
+      Whether or not this function needs to be called depends on how OCI
+      Thread is going to be used.
+
+        * In a single-threaded application, calling this function is optional.
+          If it is called at all, the first call to it must occur before calls
+          to any other OCIThread functions.  Subsequent calls can be made
+          without restriction; they will not have any effect.
+
+        * In a multi-threaded application, this function MUST be called.  The
+          first call to it MUST occur 'strictly before' any other OCIThread
+          calls; i.e., no other calls to OCIThread functions (including other
+          calls to this one) can be concurrent with the first call.
+          Subsequent calls to this function can be made without restriction;
+          they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+  OCIThreadInit - OCIThread INITialize
+  -------------------------------------
+
+    Description
+
+      This initializes OCIThread context.
+
+    Prototype
+
+      sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal for OCIThread clients to try an examine the memory
+      pointed to by the returned pointer.
+
+      It is safe to make concurrent calls to 'OCIThreadInit()'.  Unlike
+      'OCIThreadProcessInit()',  there is no need to have a first call
+      that occurs before all the others.
+
+      The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+      Thread context.  It also saves a pointer to the context in some system
+      dependent manner.  Subsequent calls to 'OCIThreadInit()' will return
+      the same context.
+
+      Each call to 'OCIThreadInit()' must eventually be matched by a call to
+      'OCIThreadTerm()'.
+
+  OCIThreadTerm - OCIThread TERMinate
+  ------------------------------------
+
+    Description
+
+      This should be called to release the OCIThread context.  It should be
+      called exactly once for each call made to 'OCIThreadInit()'.
+
+    Prototype
+
+      sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+      'OCIThreadTerm()' will not do anything until it has been called as
+      many times as 'OCIThreadInit()' has been called.  When that happens,
+      it terminates the OCIThread layer and frees the memory allocated for
+      the context.  Once this happens, the context should not be re-used.
+      It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+  OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+  ------------------------------------------------
+
+    Description
+
+      This tells the caller whether the application is running in a
+      multi-threaded environment or a single-threaded environment.
+
+    Prototype
+      boolean OCIThreadIsMulti(void);
+
+    Returns
+
+      TRUE if the environment is multi-threaded;
+      FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex, 
+thread ID's, and thread-specific data.  Since the specifications of these 
+primitives do not require the existence of multiple threads, they can be 
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1  OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+  The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+  (mutex).  A mutex is typically used for one of two purposes: (i) to
+  ensure that only one thread accesses a given set of data at a time, or
+  (ii) to ensure that only one thread executes a given critical section of
+  code at a time.
+
+  Mutexes pointer can be declared as parts of client structures or as 
+  stand-alone variables.  Before they can be used, they must be initialized 
+  using 'OCIThreadMutexInit()'.  Once they are no longer needed, they must be
+  destroyed using 'OCIThreadMutexDestroy()'.  A mutex pointer must NOT be 
+  used after it is destroyed.
+
+  A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+  'OCIThreadMutexTry()'.  They both ensure that only one thread at a time is
+  allowed to hold a given mutex.  A thread that holds a mutex can release it
+  by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2  OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+  A key can be thought of as a process-wide variable that has a
+  thread-specific value.  What this means is that all the threads in a
+  process can use any given key.  However, each thread can examine or modify
+  that key independently of the other threads.  The value that a thread sees
+  when it examines the key will always be the same as the value that it last
+  set for the key.  It will not see any values set for the key by the other
+  threads.
+
+  The type of the value held by a key is a 'dvoid *' generic pointer.
+
+  Keys can be created using 'OCIThreadKeyInit()'.  When a key is created, its
+  value is initialized to 'NULL' for all threads.
+
+  A thread can set a key's value using 'OCIThreadKeySet()'.  A thread can
+  get a key's value using 'OCIThreadKeyGet()'.
+
+  The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+  THREAD.  When clients maintain a pool of threads and assign the threads to
+  different tasks, it *may not* be appropriate for a task to use OCIThread
+  key functions to save data associated with it.  Here is a scenario of how
+  things can fail: A thread is assigned to execute the initialization of a
+  task.  During the initialization, the task stored some data related to it
+  in the thread using OCIThread key functions.  After the initialization,
+  the thread is returned back to the threads pool.  Later, the threads pool
+  manager assigned another thread to perform some operations on the task,
+  and the task needs to retrieve those data it stored earlier in
+  initialization.  Since the task is running in another thread, it will not
+  be able to retrieve the same data back!  Applications that use thread
+  pools should be aware of this and be cautious when using OCIThread key
+  functions.
+
+
+1.2.1.3  OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+  This is the type of a pointer to a key's destructor routine.  Keys can be
+  associated with a destructor routine when they are created (see
+  'OCIThreadKeyInit()').
+
+  A key's destructor routine will be called whenever a thread that has a
+  non-NULL value for the key terminates.
+
+  The destructor routine returns nothing and takes one parameter.  The
+  parameter will be the value that was set for key when the thread
+  terminated.
+
+  The destructor routine is guaranteed to be called on a thread's value
+  in the key after the termination of the thread and before process
+  termination.  No more precise guarantee can be made about the timing
+  of the destructor routine call; thus no code in the process may assume
+  any post-condition of the destructor routine.  In particular, the
+  destructor is not guaranteed to execute before a join call on the
+  terminated thread returns.
+
+
+1.2.1.4  OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+  Type 'OCIThreadId' is the type that will be used to identify a thread.
+  At any given time, no two threads will ever have the same 'OCIThreadId'.
+  However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+  a new thread may be created that has the same 'OCIThreadId' as the one
+  that died.  In particular, the thread ID must uniquely identify a thread
+  T within a process, and it must be consistent and valid in all threads U
+  of the process for which it can be guaranteed that T is running
+  concurrently with U.  The thread ID for a thread T must be retrievable
+  within thread T.  This will be done via OCIThreadIdGet().
+
+  The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+  thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+  OCIThreadMutexInit - OCIThread MuteX Initialize
+  -----------------------------------------------
+
+    Description
+
+      This allocate and initializes a mutex.  All mutexes must be 
+      initialized prior to use.
+
+    Prototype
+
+      sword OCIThreadMutexInit(dvoid *hndl, OCIError *err, 
+                               OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(OUT):  The mutex to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Multiple threads must not initialize the same mutex simultaneously.
+      Also, a mutex must not be reinitialized until it has been destroyed (see
+      'OCIThreadMutexDestroy()').
+
+  OCIThreadMutexDestroy - OCIThread MuteX Destroy
+  -----------------------------------------------
+
+    Description
+
+      This destroys and deallocate a mutex.  Each mutex must be destroyed 
+      once it is no longer needed.
+
+    Prototype
+
+      sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+                                  OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is not legal to destroy a mutex that is uninitialized or is currently
+      held by a thread.  The destruction of a mutex must not occur concurrently
+      with any other operations on the mutex.  A mutex must not be used after
+      it has been destroyed.
+
+
+  OCIThreadMutexAcquire - OCIThread MuteX Acquire
+  -----------------------------------------------
+
+    Description
+
+      This acquires a mutex for the thread in which it is called.  If the mutex
+      is held by another thread, the calling thread is blocked until it can
+      acquire the mutex.
+
+    Prototype
+
+     sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+                                 OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to acquire.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to acquire an uninitialized mutex.
+
+      This function's behavior is undefined if it is used by a thread to
+      acquire a mutex that is already held by that thread.
+
+
+
+  OCIThreadMutexRelease - OCIThread MuteX Release
+  -----------------------------------------------
+
+    Description
+
+      This releases a mutex.  If there are any threads blocked on the mutex,
+      one of them will acquire it and become unblocked.
+
+    Prototype
+
+      sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+                                  OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to release.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to release an uninitialized mutex.  It is also
+      illegal for a thread to release a mutex that it does not hold.
+
+
+  OCIThreadKeyInit - OCIThread KeY Initialize
+  -------------------------------------------
+
+    Description
+
+      This creates a key.  Each call to this routine allocate and generates 
+      a new key that is distinct from all other keys.
+
+    Prototype
+
+      sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+                             OCIThreadKeyDestFunc destFn);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(OUT):    The 'OCIThreadKey' in which to create the new key.
+
+        destFn(IN):  The destructor for the key.  NULL is permitted.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Once this function executes successfully, a pointer to an allocated and 
+      initialized key is return.  That key can be used with 'OCIThreadKeyGet()'
+      and 'OCIThreadKeySet()'.  The initial value of the key will be 'NULL' for
+      all threads.
+
+      It is illegal for this function to be called more than once to create the
+      same key (i.e., to be called more than once with the same value for the
+      'key' parameter).
+
+      If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+      will be called whenever a thread that has a non-NULL value for the key
+      terminates.  The routine will be called with one parameter.  The
+      parameter will be the key's value for the thread at the time at which the
+      thread terminated.
+      If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+  OCIThreadKeyDestroy - OCIThread KeY DESTROY
+  -------------------------------------------
+
+   Description
+
+     Destroy and deallocate the key pointed to by 'key'.
+
+    Prototype
+
+      sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err, 
+                                OCIThreadKey **key);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT):  The 'OCIThreadKey' in which to destroy the key.
+ 
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      This is different from the destructor function callback passed to the
+      key create routine.  This new destroy function 'OCIThreadKeyDestroy' is 
+      used to terminate any resources OCI THREAD acquired when it created 
+      'key'.  [The 'OCIThreadKeyDestFunc' callback type is a key VALUE 
+      destructor; it does in no way operate on the key itself.]
+
+      This must be called once the user has finished using the key.  Not
+      calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+  OCIThreadKeyGet - OCIThread KeY Get value
+  -----------------------------------------
+
+    Description
+
+      This gets the calling thread's current value for a key.
+
+    Prototype
+
+      sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                            dvoid **pValue);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN):          The key.
+
+        pValue(IN/OUT):   The location in which to place the thread-specific
+                          key value.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+      If the calling thread has not yet assigned a value to the key, 'NULL' is
+      placed in the location pointed to by 'pValue'.
+
+
+  OCIThreadKeySet - OCIThread KeY Set value
+  -----------------------------------------
+
+    Description
+
+      This sets the calling thread's value for a key.
+
+    Prototype
+
+      sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                            dvoid *value);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT): The key.
+
+        value(IN):   The thread-specific value to set in the key.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+1.2.2.3  Thread Id
+--------------------
+
+  OCIThreadIdInit - OCIThread Thread Id INITialize
+  --------------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid (OUT):   Pointer to the thread ID to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+  --------------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN/OUT):        Pointer to the thread ID to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Note
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSet - OCIThread Thread Id Set
+  -----------------------------------------
+
+    Description
+
+      This sets one 'OCIThreadId' to another.
+
+    Prototype
+
+      sword OCIThreadIdSet(dvoid *hndl, OCIError *err, 
+                           OCIThreadId *tidDest,
+                           OCIThreadId *tidSrc);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tidDest(OUT):   This should point to the location of the 'OCIThreadId'
+                        to be set to.
+
+        tidSrc(IN):     This should point to the 'OCIThreadId' to set from.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSetNull - OCIThread Thread Id Set Null
+  ---------------------------------------------------------
+
+    Description
+
+      This sets the NULL thread ID to a given 'OCIThreadId'.
+
+    Prototype
+
+      sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err,
+                               OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        tid(OUT):    This should point to the 'OCIThreadId' in which to put
+                     the NULL thread ID.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdGet - OCIThread Thread Id Get
+  ------------------------------------------
+
+    Description
+
+      This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadIdGet(dvoid *hndl, OCIError *err,
+                           OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(OUT):    This should point to the location in which to place the
+                     ID of the calling thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      When OCIThread is used in a single-threaded environment,
+      OCIThreadIdGet() will always place the same value in the location
+      pointed to by 'tid'.  The exact value itself is not important.  The
+      important thing is that it is not the same as the NULL thread ID and
+      that it is always the same value.
+
+
+  OCIThreadIdSame - OCIThread Thread Ids Same?
+  ----------------------------------------------
+
+    Description
+
+      This determines whether or not two 'OCIThreadId's represent the same
+      thread.
+
+    Prototype
+
+      sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+                            OCIThreadId *tid1, OCIThreadId *tid2,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid1(IN):   Pointer to the first 'OCIThreadId'.
+
+        tid2(IN):   Pointer to the second 'OCIThreadId'.
+	
+	result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+      Otherwise, 'result' is set to FALSE.
+
+      'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+      'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdNull - OCIThread Thread Id NULL?
+  ---------------------------------------------
+
+    Description
+
+      This determines whether or not a given 'OCIThreadId' is the NULL thread
+      ID.
+
+    Prototype
+
+      sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+                            OCIThreadId *tid,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN):    Pointer to the 'OCIThreadId' to check.
+
+	result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid' is the NULL thread ID, 'result' is set to TRUE.  Otherwise, 
+      'result' is set to FALSE.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads.  Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure.  The exception is OCIThreadHandleGet(); it may be called in a 
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment.  You can call OCIThreadIsMulti() to determine whether the 
+environment is multi-threaded or single-threaded.
+
+
+1.3.1  Types
+--------------
+
+1.3.1.1    OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+  Type 'OCIThreadHandle' is used to manipulate a thread in the active
+  primitives:  OCIThreadJoin()and OCIThreadClose().  A thread handle opened by
+  OCIThreadCreate() must be closed in a matching call to
+  OCIThreadClose().  A thread handle is invalid after the call to
+  OCIThreadClose().
+
+  The distinction between a thread ID and a thread handle in OCIThread usage
+  follows the distinction between the thread ID and the thread handle on
+  Windows NT.  On many platforms, the underlying native types are the same.
+
+
+1.3.2  Functions
+------------------
+
+  OCIThreadHndInit - OCIThread HaNDle Initialize
+  ----------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndInit(dvoid *hndl, OCIError *err, 
+                             OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(OUT):   The address of pointer to the thread handle to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadHndDestroy - OCIThread HaNDle Destroy
+  ----------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, 
+                                OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(IN/OUT):  The address of pointer to the thread handle to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+  OCIThreadCreate - OCIThread Thread Create
+  -----------------------------------------
+
+    Description
+
+      This creates a new thread.
+
+    Prototype
+
+      sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+                            void (*start)(dvoid *), dvoid *arg,
+                            OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        start(IN):    The function in which the new thread should begin
+                      execution.
+
+        arg(IN):      The argument to give the function pointed to by 'start'.
+
+        tid(IN/OUT):  If not NULL, gets the ID for the new thread.
+
+        tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      The new thread will start by executing a call to the function pointed
+      to by 'start' with the argument given by 'arg'.  When that function
+      returns, the new thread will terminate.  The function should not
+      return a value and should accept one parameter, a 'dvoid *'.
+
+      The call to OCIThreadCreate() must be matched by a call to
+      OCIThreadClose() if and only if tHnd is non-NULL.
+
+      If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+      calling thread because the timing of the spawned thread's termination
+      is unknown.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+  OCIThreadJoin - OCIThread Thread Join
+  -------------------------------------
+
+    Description
+
+      This function allows the calling thread to 'join' with another thread.
+      It blocks the caller until the specified thread terminates.
+
+    Prototype
+
+      sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN):    The 'OCIThreadHandle' of the thread to join with.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      The result of multiple threads all trying to join with the same thread is
+      undefined.
+
+
+  OCIThreadClose - OCIThread Thread Close
+  ---------------------------------------
+
+   Description
+
+     This function should be called to close a thread handle.
+
+   Prototype
+
+     sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):    The OCIThread thread handle to close.
+
+   Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+   Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      Both thread handle and the thread ID that was returned by the same call
+      to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+  OCIThreadHandleGet - OCIThread Thread Get Handle
+  ------------------------------------------------
+
+    Description
+
+      Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadHandleGet(dvoid *hndl, OCIError *err,
+                               OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):      If not NULL, the location to place the thread
+                           handle for the thread.
+
+     Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().   
+
+      The thread handle 'tHnd' retrieved by this function must be closed 
+      with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+      is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+  * Process initialization
+
+    OCIThread only requires that the process initialization function
+    ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+    multi-threaded application.  Failing to call 'OCIThreadProcessInit()' in
+    a single-threaded application is not an error.
+
+  * OCIThread initialization
+
+    Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+    context.
+
+    Also, remember that each call to 'OCIThreadInit()' must eventually be
+    matched by a call to 'OCIThreadTerm()'.
+
+  * Active vs. Passive Threading primitives
+
+    OCIThread client code written without using any active primitives can be
+    compiled and used without change on both single-threaded and
+    multi-threaded platforms.
+
+    OCIThread client code written using active primitives will only work
+    correctly on multi-threaded platforms.  In order to write a version of the
+    same application to run on single-threaded platform, it is necessary to 
+    branch the your code, whether by branching versions of the source file or 
+    by branching at runtime with the OCIThreadIsMulti() call.
+******************************************************************************/
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit(/*_ _*/);
+
+sword OCIThreadInit(/*_ dvoid *hndl, OCIError *err _*/);
+
+sword OCIThreadTerm(/*_ dvoid *hndl, OCIError *err _*/);
+
+boolean OCIThreadIsMulti(/*_ void _*/);
+
+sword OCIThreadMutexInit(/*_ dvoid *hndl, OCIError *err, 
+                             OCIThreadMutex **mutex _*/);
+
+sword OCIThreadMutexDestroy(/*_ dvoid *hndl, OCIError *err, 
+                                OCIThreadMutex **mutex _*/);
+
+sword OCIThreadMutexAcquire(/*_ dvoid *hndl, OCIError *err,
+                                OCIThreadMutex *mutex _*/);
+
+sword OCIThreadMutexRelease(/*_ dvoid *hndl, OCIError *err,
+                                OCIThreadMutex *mutex _*/);
+
+sword OCIThreadKeyInit(/*_ dvoid *hndl, OCIError *err, OCIThreadKey **key,
+                           OCIThreadKeyDestFunc destFn _*/);
+
+sword OCIThreadKeyDestroy(/*_ dvoid *hndl, OCIError *err, 
+                              OCIThreadKey **key _*/);
+
+sword OCIThreadKeyGet(/*_ dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                          dvoid **pValue _*/);
+
+sword OCIThreadKeySet(/*_ dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                          dvoid *value _*/);
+
+sword OCIThreadIdInit(/*_ dvoid *hndl, OCIError *err, OCIThreadId **tid _*/);
+
+sword OCIThreadIdDestroy(/*_ dvoid *hndl, OCIError *err, 
+                             OCIThreadId **tid _*/);
+
+sword OCIThreadIdSet(/*_ dvoid *hndl, OCIError *err, 
+                         OCIThreadId *tidDest, OCIThreadId *tidSrc _*/);
+
+sword OCIThreadIdSetNull(/*_ dvoid *hndl, OCIError *err, OCIThreadId *tid _*/);
+
+sword OCIThreadIdGet(/*_ dvoid *hndl, OCIError *err, OCIThreadId *tid _*/);
+
+sword OCIThreadIdSame(/*_ dvoid *hndl, OCIError *err,
+                          OCIThreadId *tid1, OCIThreadId *tid2,
+                          boolean *result _*/);
+
+sword OCIThreadIdNull(/*_ dvoid *hndl, OCIError *err,
+                          OCIThreadId *tid, boolean *result _*/);
+
+sword OCIThreadHndInit(/*_ dvoid *hndl, OCIError *err, 
+                           OCIThreadHandle **thnd _*/);
+
+sword OCIThreadHndDestroy(/*_ dvoid *hndl, OCIError *err, 
+                              OCIThreadHandle **thnd _*/);
+
+sword OCIThreadCreate(/*_ dvoid *hndl, OCIError *err,
+                          void (*start)(dvoid *), dvoid *arg,
+                          OCIThreadId *tid, OCIThreadHandle *tHnd _*/);
+
+sword OCIThreadJoin(/*_ dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd _*/);
+
+sword OCIThreadClose(/*_ dvoid *hndl, OCIError *err, 
+                         OCIThreadHandle *tHnd _*/);
+
+sword OCIThreadHandleGet(/*_ dvoid *hndl, OCIError *err, 
+                             OCIThreadHandle *tHnd _*/);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(/*_ dvoid *ctx, OCISubscription *subscrhp,
+                                         dvoid *pay, ub4 payl,
+                                         dvoid *desc, ub4 mode _*/);
+
+sword OCISubscriptionRegister (/*_ OCISvcCtx *svchp, 
+                              OCISubscription **subscrhpp, ub2 count, 
+                              OCIError *errhp, ub4 mode _*/);
+
+sword OCISubscriptionPost (/*_ OCISvcCtx *svchp, OCISubscription **subscrhpp,
+                               ub2 count, OCIError *errhp, ub4 mode _*/);
+
+sword OCISubscriptionUnRegister (/*_ OCISvcCtx *svchp, 
+                                OCISubscription *subscrhp, OCIError *errhp, 
+                                ub4 mode _*/);
+
+sword OCISubscriptionDisable (/*_ OCISubscription *subscrhp,
+                                  OCIError *errhp, ub4 mode _*/);
+
+sword OCISubscriptionEnable (/*_ OCISubscription *subscrhp,
+                                 OCIError *errhp, ub4 mode _*/);
+
+/*------------------- End OCI Client Notification Interfaces ----------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+
+sword OCIDateTimeGetTime(/*_ dvoid *hndl, OCIError *err, 
+			   OCIDateTime *datetime, ub1 *hour, ub1 *min, 
+			   ub1 *sec, ub4 *fsec_*/);
+
+sword OCIDateTimeGetDate(/*_dvoid *hndl, OCIError *err, 
+			   CONST OCIDateTime *date,
+			   sb2 *year, ub1 *month, ub1 *day _*/);
+
+sword OCIDateTimeGetTimeZoneOffset(/*_ dvoid *hndl,OCIError *err,
+                  CONST OCIDateTime   *datetime,sb1 *hour,sb1 *minute _*/);
+
+sword OCIDateTimeConstruct(/*_ dvoid  *hndl,OCIError *err,
+               OCIDateTime *datetime,
+               sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+               OraText  *timezone,size_t timezone_length _*/);
+
+sword OCIDateTimeSysTimeStamp(/*_ dvoid *hndl, OCIError *err, 
+                              OCIDateTime *sys_date _*/);
+
+sword OCIDateTimeAssign(/*_dvoid *hndl, OCIError *err, CONST OCIDateTime *from,
+			 OCIDateTime *to_*/);
+
+sword OCIDateTimeToText(/*_ dvoid *hndl, OCIError *err, 
+                  CONST OCIDateTime *date, CONST OraText *fmt, 
+                  ub1 fmt_length, ub1 fsprec, CONST OraText *lang_name, 
+                  size_t lang_length,
+                  ub4 *buf_size, OraText *buf _*/);
+
+sword OCIDateTimeFromText(/*_ dvoid *hndl, OCIError *err, CONST OraText *dstr,
+                     size_t d_str_length, CONST OraText *fmt, ub1 fmt_length, 
+                     CONST OraText *lang_name, size_t lang_length, 
+                     OCIDateTime *date _*/);
+
+sword OCIDateTimeCompare(/*_ dvoid *hndl, OCIError *err, 
+                     CONST OCIDateTime *date1, CONST OCIDateTime *date2, 
+                     sword *result _*/);
+
+sword OCIDateTimeCheck(/*_ dvoid *hndl, OCIError *err, CONST OCIDateTime *date,
+		 ub4 *valid _*/);
+
+sword OCIDateTimeConvert(/*_ dvoid *hndl, OCIError *err, OCIDateTime *indate, 
+                      OCIDateTime *outdate_*/);
+
+sword OCIDateTimeSubtract(/*_ dvoid *hndl, OCIError *err, OCIDateTime *indate1,
+        OCIDateTime *indate2,	 OCIInterval *inter_*/);
+
+sword OCIDateTimeIntervalAdd(/*_ dvoid *hndl, OCIError *err, 
+                        OCIDateTime *datetime, OCIInterval *inter, 
+                        OCIDateTime *outdatetime_*/);
+
+sword OCIDateTimeIntervalSub(/*_ dvoid *hndl, OCIError *err, 
+                        OCIDateTime *datetime, OCIInterval *inter, 
+                        OCIDateTime *outdatetime_*/);
+
+sword OCIIntervalSubtract(/*_ dvoid *hndl, OCIError *err, 
+       OCIInterval *minuend, OCIInterval *subtrahend, OCIInterval *result _*/);
+
+sword OCIIntervalAdd(/*_ dvoid *hndl, OCIError *err, OCIInterval *addend1, 
+			OCIInterval *addend2, OCIInterval *result _*/);
+
+sword OCIIntervalMultiply(/*_ dvoid *hndl, OCIError *err, 
+                        CONST OCIInterval *ifactor, OCINumber *nfactor, 
+                        OCIInterval *result _*/);
+
+sword OCIIntervalDivide(/*_ dvoid *hndl, OCIError *err, OCIInterval *dividend, 
+		OCINumber *divisor, OCIInterval *result _*/);
+
+sword OCIIntervalCompare(/*_ dvoid *hndl, OCIError *err, OCIInterval *inter1, 
+			OCIInterval *inter2, sword *result _*/);
+
+sword OCIIntervalFromNumber(/*_ dvoid *hndl, OCIError *err, 
+              OCIInterval *interval, OCINumber *number _*/);
+
+sword OCIIntervalFromText(/*_dvoid *hndl, OCIError *err, CONST OraText *inpstr,
+		size_t str_len, OCIInterval *result _*/);
+
+sword OCIIntervalToText(/*_  dvoid *hndl, OCIError *err,
+                     CONST OCIInterval *interval, ub1 lfprec, ub1 fsprec, 
+                     OraText *buffer, size_t buflen, size_t *resultlen _*/);
+
+sword OCIIntervalToNumber(/*_ dvoid *hndl, OCIError *err, 
+              CONST OCIInterval *interval, OCINumber *number _*/);
+
+sword OCIIntervalCheck(/*_dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			 ub4 *valid _*/);
+
+sword OCIIntervalAssign(/*_ dvoid *hndl, OCIError *err, 
+                  CONST OCIInterval *inpinter, OCIInterval *outinter _*/);
+
+sword OCIIntervalSetYearMonth(/*_dvoid *hndl, OCIError *err, sb4 yr, sb4 mnth,
+                        OCIInterval *result _*/);
+
+sword OCIIntervalGetYearMonth(/*_dvoid *hndl, OCIError *err, sb4 *yr, sb4 *mnt,
+                        CONST OCIInterval *result _*/);
+
+sword OCIIntervalSetDaySecond(/*_dvoid *hndl, OCIError *err, sb4 dy, sb4 hr,
+                        sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result _*/);
+
+sword OCIIntervalGetDaySecond(/*_dvoid *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+                   sb4 *mm, sb4 *ss, sb4 *fsec, CONST OCIInterval *result _*/);
+
+sword OCIDateTimeToArray(/*_dvoid *hndl, OCIError *err,
+                         CONST OCIDateTime *datetime, CONST OCIInterval *reftz,
+                         ub1 *outarray, ub4 len, ub1 fsprec _*/);
+
+sword OCIDateTimeFromArray(/*_dvoid *hndl, OCIError *err, ub1 *inarray,
+                           ub4 len, ub1 type, OCIDateTime *datetime,
+                           CONST OCIInterval *reftz, ub1 fsprec _*/);
+
+sword OCIDateTimeGetTimeZoneName(/*_dvoid *hndl, OCIError *err,
+                                 CONST OCIDateTime *datetime, 
+                                 ub1 *buf, ub4 *buflen _*/);
+
+sword OCIIntervalFromTZ(/*_ dvoid *hndl, OCIError *err,
+                        CONST oratext *inpstring, size_t str_len,
+                        OCIInterval *result _*/);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+   NAME
+     OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+   PARAMETERS
+     svchp (IN/OUT) - The OCI service context.
+     errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+                      recorded in errhp and this function returns OCI_ERROR.
+                      Diagnostic information can be obtained by calling
+                      OCIErrorGet().
+     typecode       - typecode corresponding to the OCIAnyDataSet.
+     type (IN)      - type corresponding to the OCIAnyDataSet. If the typecode
+                      corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+                      , this parameter can be NULL. It should be non NULL for
+                      user defined types (OCI_TYPECODE_OBJECT,
+                      OCI_TYPECODE_REF, collection types etc.)
+     dur (IN)       - duration for which OCIAnyDataSet is allocated.
+     data_set (OUT) - Initialized OCIAnyDataSet.
+     RETURNS        - error code
+   NOTES
+     This call allocates an OCIAnyDataSet for the duration of dur and
+     initializes it with the type information. The OCIAnyDataSet can hold
+     multiple instances of the given type. For performance reasons, the 
+     OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+     It is the responsibility of the caller to ensure that the OCIType is
+     longer lived (has allocation duration >= the duration of the OCIAnyData
+     if the OCIType is a transient one, allocation/pin duration >= duration of
+     the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCITypeCode typecode, CONST OCIType *type, OCIDuration dur,
+     OCIAnyDataSet ** data_set _*/);
+
+/*
+   NAME
+     OCIAnyDataSetDestroy  - OCIAnyDataSet Destroy
+   DESCRIPTION
+     This call frees the OCIAnyDataSet allocated using
+     OCIAnyDataSetBeginCreate().
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)    - The OCI service context.
+     errhp (IN/OUT)    - The OCI Error handle.
+     data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set _*/);
+
+/*
+   NAME
+     OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+   DESCRIPTION
+     This call adds a new skeleton instance to the OCIAnyDataSet and all the
+     attributes of the instance are set to NULL. It returns this skeleton
+     instance through the OCIAnyData parameter which can be constructed
+     subsequently by invoking the OCIAnyData API.
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN/OUT)   - OCIAnyDataSet to which a new instance is added.
+     data (IN/OUT)       - OCIAnyData corresponding to the newly added
+                           instance. If (*data) is NULL, a new OCIAnyData will
+                           be allocated for same duration as the OCIAnyDataSet.
+                           If (*data) is not NULL, it will get reused. This
+                           OCIAnyData can be subseqently constructed using the
+                           OCIAnyDataConvert() call or it can be constructed
+                           piece-wise using the OCIAnyDataAttrSet and
+                           OCIAnyDataCollAddElem calls.
+   NOTES
+     No Destruction of the old value is done here. It is the responsibility of
+     the caller to destroy the old value pointed to by (*data) and set (*data)
+     to a null pointer before beginning to make a sequence of this call. No
+     deep copying (of OCIType information nor the data part.) is done in the
+     returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+     duration of the OCIAnyDataSet (it is like a reference into the
+     OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+     to this function, to sequentially add new data instances to the
+     OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data _*/);
+
+/*
+   NAME
+     OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+   DESCRIPTION
+     This call marks the end of OCIAnyDataSet creation. It should be called
+     after constructing all of its instance(s).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)        - The OCI service context.
+     errhp (IN/OUT)        - The OCI error handle. If there is an error, it is
+                             recorded in errhp and this function returns
+                             OCI_ERROR. Diagnostic information can be obtained
+                             by calling OCIErrorGet().
+     data_set (IN/OUT)     - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set _*/);
+
+/*
+   NAME
+     OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+   DESCRIPTION
+     Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+     pointer to the type maintained inside an OCIAnyDataSet. No copying is
+     done for performance reasons. The client is responsible for not using
+     this type once the OCIAnyDataSet is freed (or its duration ends).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN)       - Initialized OCIAnyDataSet.
+     tc (OUT)            - The typecode of the type.
+     type (OUT)          - The type corresponding to the OCIAnyDataSet. This
+                           could be null if the OCIAnyData corresponds to a
+                           built-in type.
+*/
+sword OCIAnyDataSetGetType (/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type _*/);
+
+/*
+  NAME
+    OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+  DESCRIPTION
+    This call gets the number of instances in the OCIAnyDataSet.
+  RETURNS
+    error code.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet.
+    count (OUT)         - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, ub4 *count _*/);
+
+/*
+  NAME
+    OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+  DESCRIPTION
+    Only sequential access to the instances in an OCIAnyDataSet is allowed.
+    This call returns the OCIAnyData corresponding to an instance at the
+    current position and updates the current position. Subsequently, the
+    OCIAnyData access routines may be used to access the instance.
+  RETURNS
+    error code. Returns OCI_NO_DATA if the current position is at the end of
+    the set, OCI_SUCCESS otherwise.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet
+    data (IN/OUT)       - OCIAnyData corresponding to the instance. If (*data)
+                          is NULL, a new OCIAnyData will be allocated for same
+                          duration as the OCIAnyDataSet. If (*data) is not NULL
+                          , it will get reused. This OCIAnyData can be
+                          subsequently accessed using the OCIAnyDataAccess()
+                          call or piece-wise by using the OCIAnyDataAttrGet()
+                          call.
+  NOTE
+    No Destruction of the old value is done here. It is the responsibility of
+    the caller to destroy the old value pointed to by (*data) and set (*data)
+    to a null pointer before beginning to make a sequence of this call. No deep
+    copying (of OCIType information nor the data part.) is done in the returned
+    OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+    of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+    returned OCIAnyData can be reused on subsequent calls to this function to
+    sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(/*_ OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data _*/);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+/*--------------------- Connection Pooling prototypes -----------------------*/
+sword OCIConnectionPoolCreate(/*_ OCIEnv *envhp, OCIError *errhp,
+                              OCICPool *poolhp,
+                              OraText **poolName, sb4 *poolNameLen,
+                              CONST OraText *dblink, sb4 dblinkLen,
+                              ub4 connMin, ub4 connMax, ub4 connIncr,
+                              CONST OraText *poolUserName, sb4 poolUserLen,
+                              CONST OraText *poolPassword, sb4 poolPassLen,
+                              ub4 mode _*/);
+
+sword OCIConnectionPoolDestroy(/*_ OCICPool *poolhp,
+                               OCIError *errhp, ub4 mode _*/);
+
+/*----------------- End of Connection Pooling prototypes --------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (/*_ OCIEnv *envhp, OCIError *errhp, 
+                              OCISPool *spoolhp, 
+                              OraText **poolName, ub4 *poolNameLen, 
+                              CONST OraText *connStr, ub4 connStrLen,
+                              ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                              OraText *userid, ub4 useridLen,
+                              OraText *password, ub4 passwordLen,
+                              ub4 mode _*/);
+                                                  
+sword OCISessionPoolDestroy (/*_ OCISPool *spoolhp,
+                               OCIError *errhp,
+                               ub4 mode _*/);
+                             
+sword OCISessionGet (/*_ OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                       OCIAuthInfo *authhp,
+                       OraText *poolName, ub4 poolName_len, 
+                       CONST OraText *tagInfo, ub4 tagInfo_len,
+                       OraText **retTagInfo, ub4 *retTagInfo_len,
+                       boolean *found, ub4 mode _*/);
+
+sword OCISessionRelease (/*_ OCISvcCtx *svchp, OCIError *errhp,
+                         OraText *tag, ub4 tag_len,
+                         ub4 mode _*/);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+sword  OCIXMLTypeNew(/*_ OCISvcCtx *svchp, OCIError *errhp, OCIDuration dur,
+                     OraText *elname, ub4 elname_Len,
+                     OraText *schemaURL, ub4 schemaURL_Len,
+                     OCIXMLType **retInstance _*/);
+
+sword  OCIXMLTypeCreateFromSrc(/*_ OCISvcCtx *svchp, OCIError *errhp,
+                     OCIDuration dur, ub1 src_type, dvoid *src_ptr,
+                     sb4 ind, OCIXMLType **retInstance _*/);
+
+sword OCIXMLTypeExtract(/*_ OCIError *errhp,
+              OCIXMLType *doc, OCIDuration dur,
+              OraText *xpathexpr, ub4 xpathexpr_Len,
+              OraText *nsmap, ub4 nsmap_Len,
+              OCIXMLType **retDoc _*/);
+
+sword OCIXMLTypeTransform(/*_ OCIError *errhp, OCIDuration dur,
+               OCIXMLType *doc, OCIXMLType *xsldoc,
+               OCIXMLType **retDoc _*/);
+
+sword OCIXMLTypeExists(/*_ OCIError *errhp, OCIXMLType *doc,
+                 OraText *xpathexpr, ub4 xpathexpr_Len,
+                 OraText *nsmap, ub4 nsmap_Len,
+                 boolean *retval _*/);
+
+sword OCIXMLTypeIsSchemaBased(/*_ OCIError *errhp,
+                              OCIXMLType *doc, boolean *retval _*/);
+
+sword OCIXMLTypeGetSchema(/*_ OCIError *errhp, OCIXMLType *doc,
+             OCIXMLType **schemadoc,
+             OraText **schemaURL, ub4 *schemaURL_Len,
+             OraText **rootelem, ub4 *rootelem_Len _*/);
+
+sword OCIXMLTypeValidate(/*_ OCIError *errhp, OCIXMLType *doc,
+                   OraText *schemaURL, ub4 schemaURL_Len, boolean *retval _*/);
+
+sword OCIXMLTypeGetDOM(/*_ OCIError *errhp, OCIXMLType *doc, OCIDuration dur,
+                       OCIDOMDocument **retDom _*/);
+
+sword OCIXMLTypeGetFromDOM(/*_ OCIError *errhp, OCIDOMDocument *domdoc,
+                           OCIXMLType **retXMLType _*/);
+
+sword OCIDOMFree(/*_ OCIError *errhp, OCIDOMDocument *domdoc _*/);
+
+/*--------------------------------------------------------------------------- 
+  PRIVATE FUNCTIONS 
+  ---------------------------------------------------------------------------*/
+
+/* these calls are deprecated and should not be used */
+#ifdef NEVER 
+#if !defined(__STDC__) && !defined(__cplusplus)
+sword   OCIStmtBindByPos (/*_ OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp, 
+                     ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty, 
+                     dvoid *indp, ub2 *alenp, ub2 *rcodep, 
+                     ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+
+sword   OCIStmtBindByName(/*_ OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                    CONST OraText *placeholder, sb4 placeh_len, dvoid *valuep,
+                    sb4 value_sz, ub2 dty, dvoid *indp, ub2 *alenp,
+                    ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode _*/);
+
+sword   ocidefn(/*_ OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+                    ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+                    dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode _*/);
+
+#endif /* __STDC__ */
+#endif /* NEVER */
+
+#endif                                                              /* ocikp */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h
new file mode 100644
index 0000000..b86b389
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h
@@ -0,0 +1,168 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/ocikpr.h,v 1.3 2005/05/06 16:48:56 karine Exp $ 
+ */
+
+/* Copyright (c) 1991, 1995, 1996, 1998 by Oracle Corporation */
+/*
+   NAME
+     ocikpr.h - header of K & R compilers
+   MODIFIED   (MM/DD/YY)
+    porangas   12/04/00 - Forward merge bug#974710 to 9i
+    sgollapu   05/19/98 - Change text to OraText
+    dchatter   04/21/96 -
+    dchatter   11/10/95 -  add ognfd() - get native fd
+    lchidamb   04/06/95 -  drop maxdsz from obindps/odefinps
+    slari      04/07/95 -  add opinit
+    dchatter   03/08/95 -  osetpi and ogetpi
+    lchidamb   12/09/94 -  add obindps() and odefinps()
+    dchatter   03/06/95 -  merge changes from branch 1.1.720.2
+    dchatter   11/14/94 -  merge changes from branch 1.1.720.1
+    dchatter   02/08/95 -  olog call; drop onblon
+    dchatter   10/31/94 -  new functions for non-blocking oci
+    rkooi2     11/27/92 -  Changing datatypes (in comments) and return types 
+    rkooi2     10/26/92 -  More portability mods 
+    rkooi2     10/18/92 -  Changed to agree with oci.c 
+    sjain      03/16/92 -  Creation 
+*/
+
+/*
+ *  Declare the OCI functions.
+ *  Prototype information is commented out.
+ *  Use this header for non-ANSI C compilers.
+ *  Note that you will need to include ocidfn.h in the .c files
+ *    to get the definition for cda_def.
+ */
+
+#ifndef OCIKPR
+#define OCIKPR
+
+#include <oratypes.h>
+
+/*
+ * Oci BIND (Piecewise or with Skips) 
+ */
+sword  obindps( /*_ struct cda_def *cursor, ub1 opcode, OraText *sqlvar, 
+		  sb4 sqlvl, ub1 *pvctx, sb4 progvl, 
+		  sword ftype, sword scale,
+		  sb2 *indp, ub2 *alen, ub2 *arcode, 
+		  sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip,
+		  ub4 maxsiz, ub4 *cursiz, 
+		  OraText *fmt, sb4 fmtl, sword fmtt _*/ );
+sword  obreak( /*_ struct cda_def *lda _*/ );
+sword  ocan  ( /*_ struct cda_def *cursor _*/ );
+sword  oclose( /*_ struct cda_def *cursor _*/ );
+sword  ocof  ( /*_ struct cda_def *lda _*/ );
+sword  ocom  ( /*_ struct cda_def *lda _*/ );
+sword  ocon  ( /*_ struct cda_def *lda _*/ );
+
+
+/*
+ * Oci DEFINe (Piecewise or with Skips) 
+ */
+sword  odefinps( /*_ struct cda_def *cursor, ub1 opcode, sword pos,ub1 *bufctx,
+		   sb4 bufl, sword ftype, sword scale, 
+		   sb2 *indp, OraText *fmt, sb4 fmtl, sword fmtt, 
+		   ub2 *rlen, ub2 *rcode,
+		   sb4 pv_skip, sb4 ind_skip, sb4 alen_skip, sb4 rc_skip _*/ );
+sword  odescr( /*_ struct cda_def *cursor, sword pos, sb4 *dbsize,
+                   sb2 *dbtype, sb1 *cbuf, sb4 *cbufl, sb4 *dsize,
+                   sb2 *prec, sb2 *scale, sb2 *nullok _*/ );
+sword  odessp( /*_ struct cda_def *cursor, OraText *objnam, size_t onlen,
+                   ub1 *rsv1, size_t rsv1ln, ub1 *rsv2, size_t rsv2ln,
+                   ub2 *ovrld, ub2 *pos, ub2 *level, OraText **argnam,
+                   ub2 *arnlen, ub2 *dtype, ub1 *defsup, ub1* mode,
+                   ub4 *dtsiz, sb2 *prec, sb2 *scale, ub1 *radix,
+                   ub4 *spare, ub4 *arrsiz _*/ );
+sword  oerhms( /*_ struct cda_def *lda, sb2 rcode, OraText *buf,
+                   sword bufsiz _*/ );
+sword  oermsg( /*_ sb2 rcode, OraText *buf _*/ );
+sword  oexec ( /*_ struct cda_def *cursor _*/ );
+sword  oexfet( /*_ struct cda_def *cursor, ub4 nrows,
+                   sword cancel, sword exact _*/ );
+sword  oexn  ( /*_ struct cda_def *cursor, sword iters, sword rowoff _*/ );
+sword  ofen  ( /*_ struct cda_def *cursor, sword nrows _*/ );
+sword  ofetch( /*_ struct cda_def *cursor _*/ );
+sword  oflng ( /*_ struct cda_def *cursor, sword pos, ub1 *buf,
+                   sb4 bufl, sword dtype, ub4 *retl, sb4 offset _*/ );
+sword  ogetpi( /*_ struct cda_def *cursor, ub1 *piecep, dvoid **ctxpp, 
+                   ub4 *iterp, ub4 *indexp _*/ );
+sword  opinit( /*_ ub4 mode _*/ );
+sword  olog  ( /*_ struct cda_def *lda, ub1 *hst, 
+                   OraText *uid, sword uidl,
+                   OraText *psw, sword pswl, 
+                   OraText *conn, sword connl, 
+                   ub4 mode _*/ );
+sword  ologof( /*_ struct cda_def *lda _*/ );
+sword  oopen ( /*_ struct cda_def *cursor, struct cda_def *lda,
+                   OraText *dbn, sword dbnl, sword arsize,
+                   OraText *uid, sword uidl _*/ );
+sword  oopt  ( /*_ struct cda_def *cursor, sword rbopt, sword waitopt _*/ );
+sword  oparse( /*_ struct cda_def *cursor, OraText *sqlstm, sb4 sqllen,
+                   sword defflg, ub4 lngflg _*/ );
+sword  orol  ( /*_ struct cda_def *lda _*/ );
+sword  osetpi( /*_ struct cda_def *cursor, ub1 piece, dvoid *bufp, 
+                   ub4 *lenp _*/ );
+void sqlld2  ( /*_ struct cda_def *lda, OraText *cname, sb4 *cnlen _*/ );
+void sqllda  ( /*_ struct cda_def *lda _*/ );
+
+/* non-blocking functions */
+sword onbset( /*_ struct cda_def *lda _*/ ); 
+sword onbtst( /*_ struct cda_def *lda _*/ ); 
+sword onbclr( /*_ struct cda_def *lda _*/ ); 
+sword ognfd ( /*_ struct cda_def *lda, dvoid *fdp _*/ );
+
+
+
+/* 
+ * OBSOLETE FUNCTIONS 
+ */
+
+/* 
+ * OBSOLETE BIND CALLS-- use obindps() 
+ */
+sword  obndra( /*_ struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, ub2 *alen, ub2 *arcode, ub4 maxsiz,
+                 ub4 *cursiz, OraText *fmt, sword fmtl, sword fmtt _*/ );
+sword  obndrn( /*_ struct cda_def *cursor, sword sqlvn, ub1 *progv,
+                 sword progvl, sword ftype, sword scale, sb2 *indp,
+                 OraText *fmt, sword fmtl, sword fmtt _*/ );
+sword  obndrv( /*_ struct cda_def *cursor, OraText *sqlvar, sword sqlvl,
+                 ub1 *progv, sword progvl, sword ftype, sword scale,
+                 sb2 *indp, OraText *fmt, sword fmtl, sword fmtt _*/ );
+
+/* 
+ * OBSOLETE DEFINE CALLS-- use odefinps() 
+ */
+sword  odefin( /*_ struct cda_def *cursor, sword pos, ub1 *buf,
+                 sword bufl, sword ftype, sword scale, sb2 *indp,
+                 OraText *fmt, sword fmtl, sword fmtt, ub2 *rlen, 
+                 ub2 *rcode _*/ );
+
+
+/* older calls ; preferred equivalent calls above */
+sword  odsc  ( /*_ struct cda_def *cursor, sword pos, sb2 *dbsize,
+                   sb2 *fsize, sb2 *rcode, sb2 *dtype, sb1 *buf,
+                   sb2 *bufl, sb2 *dsize _*/ );
+sword  oname ( /*_ struct cda_def *cursor, sword pos, sb1 *tbuf,
+                   sb2 *tbufl, sb1 *buf, sb2 *bufl _*/ );
+sword  olon  ( /*_ struct cda_def *lda, OraText *uid, sword uidl,
+                   OraText *pswd, sword pswdl, sword audit _*/ );
+sword  orlon ( /*_ struct cda_def *lda, ub1 *hda, OraText *uid,
+                   sword uidl, OraText *pswd, sword pswdl, sword audit _*/ );
+sword  osql3 ( /*_ struct cda_def *cda, OraText *sqlstm, sword sqllen _*/ );
+
+
+
+
+
+
+
+#endif  /* OCIKPR */
+
+
+
+
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocixad.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocixad.h
new file mode 100644
index 0000000..3f1eefa
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocixad.h
@@ -0,0 +1,316 @@
+/* Copyright (c) 1999, 2001, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     ocixad.h - OCI eXtensible Access Driver (for external tables)
+
+   DESCRIPTION 
+     Provides handles for XAD support.
+
+   RELATED DOCUMENTS 
+     External Tables Design specification (external_tab_ds.doc)
+ 
+   EXPORT FUNCTION(S) 
+
+   INTERNAL FUNCTION(S)
+
+   EXAMPLES
+
+   NOTES
+     Currently these interfaces are for Oracle internal use only.
+
+   MODIFIED   (MM/DD/YY)
+   cmlim       08/10/01 - date cache: add XADSESSION attrs: DCACHE_SIZE 
+   abrumm      04/18/01 - define interface method signatures in OCIXAD
+   abrumm      02/20/01 - add attributes for ACCESS_PARM_TYPE
+   abrumm      01/18/01 - more OCI_ATTR_XADSESSION attributes
+   abrumm      10/09/00 - use oratypes.h, not s.h
+   abrumm      03/30/00 - external table support
+   abrumm      03/30/00 - Creation
+
+*/
+
+#ifndef OCIXAD_ORACLE
+#define OCIXAD_ORACLE
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef OCIEXTP_ORACLE
+#include <ociextp.h>
+#endif
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/*----- Handles and descriptors for access driver operations (OCIXAD*)  -----*/
+typedef struct OCIXADSession      OCIXADSession;           /* session handle */
+typedef struct OCIXADTable        OCIXADTable;               /* table handle */
+typedef struct OCIXADField        OCIXADField;               /* field handle */
+typedef struct OCIXADGranule      OCIXADGranule;           /* granule handle */
+
+/*---------------- Access Driver method interface signatures ----------------*/
+
+/* Each of the following access driver methods are logically member functions
+ * of the OCIXADSession handle.  As such, the first argument to the method is
+ * the OCIXADSession handle (i.e. "this").
+ *
+ * An access driver writer must provide these entry points at configure
+ * time via the OCIXADMethodEntry structure.
+ */
+
+typedef sword (*OCIXADMethodOpen)(OCIXADSession *xadses,
+                                  OCIExtProcContext *withCtx,
+                                  OCIXADTable *xadtbl,
+                                  OCILobLocator *accessParm);
+
+typedef sword (*OCIXADMethodFetchInit)(OCIXADSession *xadses,
+                                       OCIExtProcContext *withCtx,
+                                       OCIXADTable *xadtbl,
+                                       OCINumber *gnum, ub4 maxRowCnt);
+
+typedef sword (*OCIXADMethodFetch)(OCIXADSession *xadses,
+                                   OCIExtProcContext *withCtx,
+                                   OCIXADTable *xadtbl, void *opaqueCtx,
+                                   ub4 rowCnt, sb4 rejctLmt,
+                                   sb4 *rejctCntp);
+
+typedef void (*OCIXADMethodPopulateInit)(OCIXADSession *xadses,
+                                         OCIExtProcContext *withCtx);
+
+typedef void (*OCIXADMethodPopulate)(OCIXADSession *xadses,
+                                     OCIExtProcContext *withCtx);
+
+typedef void (*OCIXADMethodPopulateTerm)(OCIXADSession *xadses,
+                                         OCIExtProcContext *withCtx);
+
+typedef sword  (*OCIXADMethodClose)(OCIXADSession *xadses,
+                                    OCIExtProcContext *withCtx,
+                                    OCIXADTable *xadtbl);
+
+typedef void (*OCIXADMethodErrorCallback)(OCIXADSession *xadses,
+                                          OCIExtProcContext *withCtx,
+                                          void *opaqueCtx, OCIError *errhp,
+                                          ub4 rowidx, ub2 colIdx);
+
+/* Access Driver Method Entry points provided at "configure" time. */
+struct OCIXADMethodEntry
+{
+  ub4                       Version_OCIXADMethodEntry;
+#define OCIXAD_METHOD_ENTRY_VERSION_1   100
+#define OCIXAD_METHOD_ENTRY_VERSION_CUR OCIXAD_METHOD_ENTRY_VERSION_1
+
+  OCIXADMethodOpen          Open_OCIXADMethodEntry;
+  OCIXADMethodFetchInit     FetchInit_OCIXADMethodEntry;
+  OCIXADMethodFetch         Fetch_OCIXADMethodEntry;
+  OCIXADMethodPopulateInit  PopulateInit_OCIXADMethodEntry;
+  OCIXADMethodPopulate      Populate_OCIXADMethodEntry;
+  OCIXADMethodPopulateTerm  PopulateTerm_OCIXADMethodEntry;
+  OCIXADMethodClose         Close_OCIXADMethodEntry;
+  OCIXADMethodErrorCallback ErrorCallback_OCIXADMethodEntry;
+};
+typedef struct OCIXADMethodEntry OCIXADMethodEntry;
+
+/* Each access driver type (e.g. "ORACLE_LOADER") must provide a
+ * configure function (currently via the kpxdconf[] array).
+ * The configure function must set the
+ * OCI_ATTR_XADSESSION_METHOD_ENTRY_POINTS attribute of the passed in
+ * 'hndl' argument.  The OCI_ATTR_XADSESSION_METHOD_ENTRY_POINTS attribute
+ * is a pointer to an OCIXADMethodEntry structure.
+ */
+typedef sword (*OCIXADConfig)(OraText *driverType,       /* driver type name */
+                              void     *hndl,        /* OCIXADSession handle */
+                              ub4       hndlType,             /* handle type */
+                              OCIError *errhp);          /* OCI error handle */
+
+/* Granule handle client callback prototypes for external tables.
+ * The granulesPerSrc vector is allocated with numsrc_kpxg entries.
+ * The access drivers granule info method (if present) should populate
+ * each entry of the granulesPerSrc vector with the number of granules
+ * for the corresponding source number.
+ */
+typedef void (*OCIXADMethodGranuleInfo)(OCIXADGranule *xadgran,
+                                        OCIExtProcContext *withCtx,
+                                        ub4 *granulesPerSrc);
+
+/*------------------------------ OCIXADSession ------------------------------*/
+               /*----- Defines for OCIXADSession Attributes -----*/
+#define OCI_ATTR_XADSESSION_TABLE                 1
+#define OCI_ATTR_XADSESSION_LOCATIONS             2
+#define OCI_ATTR_XADSESSION_NAMES                 2 /* synonym for locations */
+#define OCI_ATTR_XADSESSION_DIRECTORIES           3
+#define OCI_ATTR_XADSESSION_GRANULE               4
+#define OCI_ATTR_XADSESSION_OPCODE                5
+#define OCI_ATTR_XADSESSION_CALLERID              6
+#define OCI_ATTR_XADSESSION_GRANULESIZE           7
+#define OCI_ATTR_XADSESSION_DATAMODE              8
+#define OCI_ATTR_XADSESSION_AGENT_NUMBER          9
+#define OCI_ATTR_XADSESSION_OPAQUECTX            10
+
+      /*----- OCIXADSession virtual methods (methods as attributes) -----*/
+#define OCI_ATTR_XADSESSION_METHOD_ENTRY_POINTS  11
+                                                        /* type for GET, SET */
+                              /* (OCIXADMethodEntry **, OCIXADMethodEntry *) */
+
+      /* more OCIXADSession Attributes (numbering starts after entry points) */
+                                                        /* type for GET, SET */
+#define OCI_ATTR_XADSESSION_DEFAULT_DIRECTORY    12     /* (text **, text *) */
+#define OCI_ATTR_XADSESSION_DRIVER_TYPE          13     /* (text **, text *) */
+#define OCI_ATTR_XADSESSION_SAMPLE_TYPE          14     /* (ub4 *,   ub4 *)  */
+#define OCI_ATTR_XADSESSION_SAMPLE_PERCENT       15     /* (ub4 *,   ub4 *)  */
+#define OCI_ATTR_XADSESSION_ACCESS_PARM_TYPE     16     /* (ub1 *,   ub1 *)  */
+#define OCI_ATTR_XADSESSION_DCACHE_SIZE          17     /* (ub4 *,   ub4 *)  */
+#define OCI_ATTR_XADSESSION_DCACHE_NUM           18     /* (ub4 *),  n/a  )  */
+#define OCI_ATTR_XADSESSION_DCACHE_DISABLE       19     /* (ub1 *),  n/a  )  */
+#define OCI_ATTR_XADSESSION_DCACHE_HITS          20     /* (ub4 *),  n/a  )  */
+#define OCI_ATTR_XADSESSION_DCACHE_MISSES        21     /* (ub4 *),  n/a  )  */
+
+
+             /*----- Values for OCI_ATTR_XADSESSION_OPCODE -----*/
+#define OCI_XADSESSION_OPCODE_FETCH               1
+#define OCI_XADSESSION_OPCODE_POPULATE            2
+
+            /*----- Values for OCI_ATTR_XADSESSION_CALLERID -----*/
+#define OCI_XADSESSION_CALLERID_QC                1     /* query coordinator */
+#define OCI_XADSESSION_CALLERID_SHADOW            2
+#define OCI_XADSESSION_CALLERID_SLAVE             3
+
+            /*----- Values for OCI_ATTR_XADSESSION_DATAMODE -----*/
+#define OCI_XADSESSION_DATAMODE_STREAM            1
+#define OCI_XADSESSION_DATAMODE_FIELD             2
+
+            /*----- Values for OCI_ATTR_XADSESSION_SAMPLE_TYPE -----*/
+#define OCI_XADSESSION_SAMPLE_NONE                0          /* not sampling */
+#define OCI_XADSESSION_SAMPLE_ROW                 1    /* row level sampling */
+#define OCI_XADSESSION_SAMPLE_BLOCK               2  /* block level sampling */
+
+           /*----- Values for OCI_ATTR_XADSESSION_ACCESS_PARM_TYPE -----*/
+#define OCI_XADSESSION_ACCESS_PARM_TYPE_CLOB      1    /* accessParm is CLOB */
+#define OCI_XADSESSION_ACCESS_PARM_TYPE_BLOB      2    /* accessParm is BLOB */
+
+/*------------------------------- OCIXADTable -------------------------------*/
+                /*----- Defines for OCIXADTable Attributes -----*/
+#define OCI_ATTR_XADTABLE_SESSION                 1
+#define OCI_ATTR_XADTABLE_NAME                    2
+#define OCI_ATTR_XADTABLE_COLUMNS                 3
+#define OCI_ATTR_XADTABLE_REF_COLUMNS             4
+#define OCI_ATTR_XADTABLE_FIELDS                  5
+#define OCI_ATTR_XADTABLE_NUM_FIELDS              6
+#define OCI_ATTR_XADTABLE_OPAQUECTX               7
+#define OCI_ATTR_XADTABLE_NUM_COLS                8
+#define OCI_ATTR_XADTABLE_NUM_REF_COLS            9
+#define OCI_ATTR_XADTABLE_SCHEMA                 10
+
+/*------------------------------- OCIXADField -------------------------------*/
+                /*----- Defines for OCIXADField Attributes -----*/
+#define OCI_ATTR_XADFIELD_COLUMN_NUM              1
+#define OCI_ATTR_XADFIELD_DATA_TYPE               2
+#define OCI_ATTR_XADFIELD_PRECISION               3
+#define OCI_ATTR_XADFIELD_SCALE                   4
+#define OCI_ATTR_XADFIELD_CHARSET_ID              5
+#define OCI_ATTR_XADFIELD_FORMAT_MASK             6
+#define OCI_ATTR_XADFIELD_ADDR                    7
+#define OCI_ATTR_XADFIELD_LENGTH                  8
+#define OCI_ATTR_XADFIELD_ISNULL                  9
+#define OCI_ATTR_XADFIELD_ISPARTIAL              10
+#define OCI_ATTR_XADFIELD_OPAQUECTX              11
+
+/*------------------------------ OCIXADGranule ------------------------------*/
+               /*----- Defines for OCIXADGranule Attributes -----*/
+#define OCI_ATTR_XADGRANULE_NUM_GRANULES          1
+#define OCI_ATTR_XADGRANULE_NUM_SRC               2
+#define OCI_ATTR_XADGRANULE_INTRA_SRC_CONCURRENCY 3
+#define OCI_ATTR_XADGRANULE_OPAQUECTX             4
+
+      /*----- OCIXADGranule virtual methods (methods as attributes) -----*/
+#define OCI_ATTR_XADGRANULE_INFO_METHOD           5
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+/* NONE */
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*-------------------------- OCIXADSession Methods --------------------------*/
+/* NONE */
+
+/*--------------------------- OCIXADTable Methods ---------------------------*/
+/*
+  NAME
+    OCIXADTableSetRowValues
+
+  DESCRIPTION
+    To set the individual column values for a row by iterating through the
+    OCIXADField handle vector which is attached to the passed in OCIXADTable
+    handle.  The OCIXADTableSetRowValues method is called once for complete
+    rows, multiple times for pieced rows.
+    The column array row index is returned as an OUT parameter (*rowIdxp).
+    
+  RETURNS
+    OCI_SUCCESS:  all column array entries set.
+    OCI_CONTINUE: a partial Field was encountered.
+    OCI_ERROR:    a partial field encountered for a column which
+                  does not allow partial fields (partials are only allowed
+                  for LOB and LONG columns).
+  NOTES
+ */
+sword
+#if defined(__STDC__) || defined(__cplusplus)
+OCIXADTableSetRowValues(OCIXADTable *tblhp, ub4 *rowIdxp,OCIError *errhp);
+#else
+OCIXADTableSetRowValues(/*_ OCIXADTable *tblhp, ub4 *rowIdxp ,
+                            OCIError *errhp _*/);
+#endif
+
+
+/*--------------------------- OCIXADField Methods ---------------------------*/
+/*
+  NAME
+    OCIXADFieldSet
+
+  DESCRIPTION
+    Sets run-time (data dependent) attributes of the OCIXADField handle.
+    
+  RETURNS
+    OCI_SUCCESS:  Field attributes successfully set.
+    OCI_ERROR:    Invalid combination of flags,
+                  or NULL addr value for a non-NULL field,
+                  or length of zero for a non-NULL field,
+  NOTES
+    Basically for convenience and efficiency, so the application does
+    not have to do four OCIAttrSet calls to set these attributes.
+ */
+sword
+#if defined(__STDC__) || defined(__cplusplus)
+OCIXADFieldSet(OCIXADField *fldhp, ub1 *addr, ub4 length, ub1 isnull,
+               ub1 ispartial);
+#else
+OCIXADFieldSet(/*_ OCIXADField *fldhp, ub1 *addr, ub4 length, ub1 isnull,
+                   ub1 ispartial _*/);
+#endif
+
+/*-------------------------- OCIXADGranule Methods --------------------------*/
+/* NONE */
+
+
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+/* NONE */
+
+
+#endif                                                      /* OCIXAD_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ocixmldb.h b/src/terralib/drivers/OracleSpatial/OCI/include/ocixmldb.h
new file mode 100644
index 0000000..3057831
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ocixmldb.h
@@ -0,0 +1,139 @@
+/* Copyright (c) 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     ocixmldb.h - XDB public functions
+
+   DESCRIPTION 
+     This file contains XDB specific public functions required for DOM C-API. 
+
+   RELATED DOCUMENTS 
+
+ 
+   EXPORT FUNCTION(S) 
+   struct xmlctx *OCIXmlDbInitXmlCtx(OCIEnv *, OCISvcCtx *, OCIError *,
+                               ocixmldbparam *params, int num_params);
+
+   void    OCIXmlDbFreeXmlCtx(struct xmlctx *xctx);
+
+
+  ------------------------------------------------------------------------
+   EXAMPLES
+   
+   NOTES
+
+   MODIFIED   (MM/DD/YY)
+   ataracha    05/28/03 - change names
+   ataracha    02/18/03 - add oratypes, remove XMLERR_*
+   imacky      02/01/03 - remove xml.h; xdbs fix
+   ataracha    01/24/03 - use "struct xmlctx" instead of xmlctx
+   imacky      01/28/03 - fix XMLERR defs
+   ataracha    01/21/03 - ataracha_uni_capi_cleanup
+   ataracha    01/09/03 - Creation
+
+*/
+
+#ifndef ORATYPES 
+#include <oratypes.h> 
+#endif
+ 
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+
+#ifndef OCIXMLDB_ORACLE
+# define OCIXMLDB_ORACLE
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+#ifndef XMLCTX_DEFINED
+# define XMLCTX_DEFINED
+/* DATATYPE xmlctx - XML top-level context
+*/
+struct xmlctx; typedef struct xmlctx xmlctx;
+#endif
+
+typedef enum 
+{
+  XCTXINIT_OCIDUR  = 1,
+  XCTXINIT_ERRHDL  = 2
+} ocixmldbpname;
+
+typedef struct ocixmldbparam
+{
+  ocixmldbpname   name_ocixmldbparam;
+  void           *value_ocixmldbparam;
+} ocixmldbparam;
+
+#define NUM_OCIXMLDBPARAMS 2
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           EXPORT FUNCTIONS
+  ---------------------------------------------------------------------------*/
+/*****************************************************************************
+                              DESCRIPTION
+
+-----------------------------OCIXmlDbInitXmlCtx---------------------------------
+Name
+OCIXmlDbInitXmlCtx
+Purpose
+To get a xmlctx structure initialized with error-handler and XDB callbacks. 
+Syntax
+struct xmlctx *OCIXmlDbInitXmlCtx (OCIEnv           *envhp,
+                                 OCISvcCtx        *svchp, 
+                                 OCIError         *err, 
+                                 params_ocixmldb *params,
+                                 int               num_params);
+Parameters
+envhp (IN) - The OCI environment handle
+svchp (IN) - The OCI service handle
+errhp (IN) - The OCI error handle
+params (IN)- This contains the following optional parameters :
+   (a) OCIDuration dur (IN - The OCI Duration (Default: OCI_DURATION_SESSION)
+   (b) void (*err_handler) (sword, (const oratext *) (IN) - 
+       Pointer to the error handling function (Default: null)
+num_params (IN) - Number of parameters to be read from parameter params.
+                  If the value of num_params exceeds the size of array 
+                  "params", unexpected behavior will result.
+
+Returns
+A pointer to xmlctx structure, with xdb context, error handler and callbacks 
+populated with appropriate values. This is later used for all API calls. NULL
+if no database connection available.
+
+-----------------------------OCIXmlDbFreeXmlCtx----------------------------
+Name
+OCIXmlDbFreeXmlCtx
+Pupose
+To free any allocations done during OCIXmlDbInitXmlCtx.
+Syntax
+void OCIXmlDbFreeXmlCtx (struct xmlctx *xctx)
+Parameters
+xctx (IN) - The xmlctx to terminate
+Returns
+-
+******************************************************************************/
+
+struct xmlctx *OCIXmlDb_CtxInit(OCIEnv *, OCISvcCtx *, OCIError *, 
+                            ocixmldbparam *, int);
+
+void    OCIXmlDb_CtxFree(struct xmlctx *xctx);
+
+struct xmlctx *OCIXmlDbInitXmlCtx(OCIEnv *, OCISvcCtx *, OCIError *, 
+                            ocixmldbparam *, int);
+
+void    OCIXmlDbFreeXmlCtx(struct xmlctx *xctx);
+/*---------------------------------------------------------------------------
+                          INTERNAL FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* OCIXMLDB_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/odci.h b/src/terralib/drivers/OracleSpatial/OCI/include/odci.h
new file mode 100644
index 0000000..550ee8f
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/odci.h
@@ -0,0 +1,657 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/odci.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+
+/* Copyright (c) 1998, 2003, Oracle Corporation.  All rights reserved.  */
+ 
+/* 
+   NAME 
+     odci.h - Oracle Data Cartridge Interface definitions
+
+   DESCRIPTION 
+     This file contains Oracle Data Cartridge Interface definitions. These
+     include the ODCI Types and Constants.
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     None.
+
+   PRIVATE FUNCTION(S)
+     None.
+
+   EXAMPLES
+
+   NOTES
+     - The constants defined here are replica of the constants defined 
+       in ODCIConst Package defined as part of catodci.sql. If you change
+       these do make the similar change in catodci.sql.
+
+   MODIFIED   (MM/DD/YY)
+   ayoaz       04/21/03 - add CursorNum to ODCIEnv
+   abrumm      12/30/02 - Bug #2223225: add define for
+                          ODCI_ARG_DESC_LIST_MAXSIZE
+   ayoaz       10/14/02 - Add Cardinality to ODCIArgDesc
+   ayoaz       09/11/02 - add ODCIQueryInfo to ODCIIndexCtx
+   yhu         09/19/02 - add ODCI_DEBUGGING_ON for ODCIEnv.EnvFlags
+   hsbedi      10/10/02 - add object number into ODCIExtTableInfo
+   ayoaz       08/30/02 - add ODCITable2 types
+   tchorma     07/29/02 - Add ODCIFuncCallInfo type for WITH COLUMN CONTEXT
+   hsbedi      06/29/02 - External table populate
+   yhu         07/20/01 - add parallel degree in ODCIIndexInfo.
+   abrumm      02/20/01 - ODCIExtTableInfo: add AccessParmBlob attribute
+   abrumm      01/18/01 - ODCIExtTableInfo: add default directory
+   spsundar    08/24/00 - Update attrbiute positions
+   abrumm      08/04/00 - external tables changes: ODCIExtTableInfo, constants
+   tchorma     09/11/00 - Add return code ODCI_FATAL
+   tchorma     08/08/00 - Add Update Block References Option for Alter Index
+   ayoaz       08/01/00 - Add ODCI_AGGREGATE_REUSE_CTX
+   spsundar    06/19/00 - add ODCIEnv type
+   abrumm      06/27/00 - add defines for ODCIExtTable flags
+   abrumm      06/04/00 - external tables: ODCIExtTableInfo change; add ODCIEnv
+   ddas        04/28/00 - extensible optimizer enhancements for 8.2
+   yhu         06/05/00 - add a bit in IndexInfoFlags for trans. tblspc
+   yhu         04/10/00 - add ODCIPartInfo & remove ODCIIndexPartList
+   abrumm      03/29/00 - external table support
+   spsundar    02/14/00 - update odci definitions for 8.2
+   nagarwal    03/07/99 - bug# 838308 - set estimate_stats=1
+   rmurthy     11/09/98 - add blocking flag
+   ddas        10/31/98 - add ODCI_QUERY_SORT_ASC and ODCI_QUERY_SORT_DESC
+   ddas        05/26/98 - fix ODCIPredInfo flag bits
+   rmurthy     06/03/98 - add macro for RegularCall
+   spsundar    05/08/98 - add constants related to ODCIIndexAlter options
+   rmurthy     04/30/98 - remove include s.h
+   rmurthy     04/20/98 - name fixes
+   rmurthy     04/13/98 - add C mappings for odci types
+   alsrivas    04/10/98 - adding defines for ODCI_INDEX1
+   jsriniva    04/04/98 - Creation
+
+*/
+
+#ifndef OCI_ORACLE
+# include <oci.h>
+#endif
+#ifndef ODCI_ORACLE
+# define ODCI_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* The following are short names that are only supported on IBM mainframes
+ *   with the SLSHORTNAME defined.
+ * With this all subsequent long names will actually be substituted with
+ *  the short names here
+ */
+
+#define ODCIColInfo_ref             odcicir
+#define ODCIColInfoList             odcicil
+#define ODCIColInfoList2            odcicil2
+#define ODCIIndexInfo_ref           odciiir
+#define ODCIPredInfo_ref            odcipir
+#define ODCIRidList                 odcirl
+#define ODCIIndexCtx_ref            odciicr
+#define ODCIObject_ref              odcior
+#define ODCIObjectList              odciol
+#define ODCIQueryInfo_ref           odciqir
+#define ODCIFuncInfo_ref            odcifir
+#define ODCICost_ref                odcicr
+#define ODCIArgDesc_ref             odciadr
+#define ODCIArgDescList             odciadl
+#define ODCIStatsOptions_ref        odcisor
+#define ODCIColInfo                 odcici
+#define ODCIColInfo_ind             odcicii
+#define ODCIIndexInfo               odciii
+#define ODCIIndexInfo_ind           odciiii
+#define ODCIPredInfo                odcipi
+#define ODCIPredInfo_ind            odcipii
+#define ODCIIndexCtx                odciic
+#define ODCIIndexCtx_ind            odciici
+#define ODCIObject                  odcio
+#define ODCIObject_ind              odcioi
+#define ODCIQueryInfo               odciqi
+#define ODCIQueryInfo_ind           odciqii
+#define ODCIFuncInfo                odcifi
+#define ODCIFuncInfo_infd           odcifii
+#define ODCICost                    odcic
+#define ODCICost_ind                odcici
+#define ODCIArgDesc                 odciad
+#define ODCIArgDesc_ind             odciadi
+#define ODCIStatsOptions            odciso
+#define ODCIStatsOptions_ind        odcisoi
+#define ODCIPartInfo                odcipti
+#define ODCIPartInfo_ind            odciptii
+#define ODCIPartInfo_ref            odciptir
+#define ODCIExtTableInfo            odcixt
+#define ODCIExtTableInfo_ind        odcixti
+#define ODCIExtTableInfo_ref        odcixtr
+#define ODCIExtTableQCInfo          odcixq
+#define ODCIExtTableQCInfo_ind      odcixqi
+#define ODCIExtTableQCInfo_ref      odcixqr
+#define ODCIFuncCallInfo            odcifc
+#define ODCIFuncCall_ind            odcifci
+#define ODCIFuncCall_ref            odcifcr
+
+#endif                                                        /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+/* Constants for Return Status */
+#define ODCI_SUCCESS             0
+#define ODCI_ERROR               1
+#define ODCI_WARNING             2
+#define ODCI_ERROR_CONTINUE      3
+#define ODCI_FATAL               4
+
+/* Constants for ODCIPredInfo.Flags */
+#define ODCI_PRED_EXACT_MATCH    0x0001
+#define ODCI_PRED_PREFIX_MATCH   0x0002
+#define ODCI_PRED_INCLUDE_START  0x0004
+#define ODCI_PRED_INCLUDE_STOP   0x0008
+#define ODCI_PRED_OBJECT_FUNC    0x0010
+#define ODCI_PRED_OBJECT_PKG     0x0020
+#define ODCI_PRED_OBJECT_TYPE    0x0040
+#define ODCI_PRED_MULTI_TABLE    0x0080
+
+/* Constants for QueryInfo.Flags */
+#define ODCI_QUERY_FIRST_ROWS    0x01
+#define ODCI_QUERY_ALL_ROWS      0x02
+#define ODCI_QUERY_SORT_ASC      0x04
+#define ODCI_QUERY_SORT_DESC     0x08
+#define ODCI_QUERY_BLOCKING      0x10
+
+/* Constants for ScnFlg(Func /w Index Context) */
+#define ODCI_CLEANUP_CALL        1
+#define ODCI_REGULAR_CALL        2
+
+/* Constants for ODCIFuncInfo.Flags */
+#define ODCI_OBJECT_FUNC         0x01
+#define ODCI_OBJECT_PKG          0x02
+#define ODCI_OBJECT_TYPE         0x04
+
+/* Constants for ODCIArgDesc.ArgType */
+#define ODCI_ARG_OTHER           1
+#define ODCI_ARG_COL             2                                 /* column */
+#define ODCI_ARG_LIT             3                                /* literal */
+#define ODCI_ARG_ATTR            4                       /* object attribute */
+#define ODCI_ARG_NULL            5
+#define ODCI_ARG_CURSOR          6
+
+/* Maximum size of ODCIArgDescList array */
+#define ODCI_ARG_DESC_LIST_MAXSIZE 32767
+
+/* Constants for ODCIStatsOptions.Options */
+#define ODCI_PERCENT_OPTION      1
+#define ODCI_ROW_OPTION          2
+
+/* Constants for ODCIStatsOptions.Flags */
+#define ODCI_ESTIMATE_STATS     0x01
+#define ODCI_COMPUTE_STATS      0x02
+#define ODCI_VALIDATE           0x04
+
+/* Constants for ODCIIndexAlter parameter alter_option */
+#define ODCI_ALTIDX_NONE               0
+#define ODCI_ALTIDX_RENAME             1
+#define ODCI_ALTIDX_REBUILD            2
+#define ODCI_ALTIDX_REBUILD_ONL        3
+#define ODCI_ALTIDX_MODIFY_COL         4
+#define ODCI_ALTIDX_UPDATE_BLOCK_REFS  5
+
+/* Constants for ODCIIndexInfo.IndexInfoFlags */
+#define ODCI_INDEX_LOCAL         0x0001
+#define ODCI_INDEX_RANGE_PARTN   0x0002
+#define ODCI_INDEX_HASH_PARTN    0x0004
+#define ODCI_INDEX_ONLINE        0x0008
+#define ODCI_INDEX_PARALLEL      0x0010
+#define ODCI_INDEX_UNUSABLE      0x0020
+#define ODCI_INDEX_ONIOT         0x0040
+#define ODCI_INDEX_TRANS_TBLSPC  0x0080
+#define ODCI_INDEX_FUNCTION_IDX  0x0100
+
+/* Constants for ODCIIndexInfo.IndexParaDegree */
+#define ODCI_INDEX_DEFAULT_DEGREE 32767
+
+/* Constants for ODCIEnv.EnvFlags */
+#define ODCI_DEBUGGING_ON        0x01
+
+/* Constants for ODCIEnv.CallProperty */
+#define ODCI_CALL_NONE           0
+#define ODCI_CALL_FIRST          1
+#define ODCI_CALL_INTERMEDIATE   2
+#define ODCI_CALL_FINAL          3
+
+/* Constants for ODCIExtTableInfo.OpCode */
+#define ODCI_EXTTABLE_INFO_OPCODE_FETCH           1
+#define ODCI_EXTTABLE_INFO_OPCODE_POPULATE        2
+
+/* Constants (bit definitions) for ODCIExtTableInfo.Flag */
+    /* sampling type: row or block */
+#define ODCI_EXTTABLE_INFO_FLAG_SAMPLE           0x00000001
+#define ODCI_EXTTABLE_INFO_FLAG_SAMPLE_BLOCK     0x00000002
+    /* AccessParmClob, AccessParmBlob discriminator */
+#define ODCI_EXTTABLE_INFO_FLAG_ACCESS_PARM_CLOB 0x00000004
+#define ODCI_EXTTABLE_INFO_FLAG_ACCESS_PARM_BLOB 0x00000008
+
+/* Constants for ODCIExtTableInfo.IntraSourceConcurrency */
+#define ODCI_TRUE  1
+#define ODCI_FALSE 0
+
+/* Constants (bit definitions) for ODCIExtTable{Open,Fetch,Populate,Close}
+ * Flag argument.
+ */
+#define ODCI_EXTTABLE_OPEN_FLAGS_QC     0x00000001  /* caller is Query Coord */
+#define ODCI_EXTTABLE_OPEN_FLAGS_SHADOW 0x00000002  /* caller is shadow proc */
+#define ODCI_EXTTABLE_OPEN_FLAGS_SLAVE  0x00000004  /* caller is slave  proc */
+
+#define ODCI_EXTTABLE_FETCH_FLAGS_EOS   0x00000001 /* end-of-stream on fetch */
+
+/* Constants for Flags argument to ODCIAggregateTerminate */
+#define ODCI_AGGREGATE_REUSE_CTX  1
+
+/*---------------------------------------------------------------------------
+                     ODCI TYPES
+  ---------------------------------------------------------------------------*/
+/*
+ * These are C mappings for the OTS types defined in catodci.sql
+ */
+
+typedef OCIRef   ODCIColInfo_ref;
+typedef OCIArray ODCIColInfoList;
+typedef OCIArray ODCIColInfoList2;
+typedef OCIRef   ODCIIndexInfo_ref;
+typedef OCIRef   ODCIPredInfo_ref;
+typedef OCIArray ODCIRidList;
+typedef OCIRef   ODCIIndexCtx_ref;
+typedef OCIRef   ODCIObject_ref;
+typedef OCIArray ODCIObjectList;
+typedef OCIRef   ODCIQueryInfo_ref;
+typedef OCIRef   ODCIFuncInfo_ref;
+typedef OCIRef   ODCICost_ref;
+typedef OCIRef   ODCIArgDesc_ref;
+typedef OCIArray ODCIArgDescList;
+typedef OCIRef   ODCIStatsOptions_ref;
+typedef OCIRef ODCIPartInfo_ref;
+typedef OCIRef   ODCIEnv_ref;
+typedef OCIRef   ODCIExtTableInfo_ref;             /* external table support */
+typedef OCIArray ODCIGranuleList;                  /* external table support */
+typedef OCIRef   ODCIExtTableQCInfo_ref;           /* external table support */
+typedef OCIRef   ODCIFuncCallInfo_ref;
+typedef OCIArray ODCINumberList;
+ 
+struct ODCIColInfo
+{
+   OCIString* TableSchema;
+   OCIString* TableName;
+   OCIString* ColName;
+   OCIString* ColTypName;
+   OCIString* ColTypSchema;
+   OCIString* TablePartition;
+};
+typedef struct ODCIColInfo ODCIColInfo;
+ 
+struct ODCIColInfo_ind
+{
+   OCIInd atomic;
+   OCIInd TableSchema;
+   OCIInd TableName;
+   OCIInd ColName;
+   OCIInd ColTypName;
+   OCIInd ColTypSchema;
+   OCIInd TablePartition;
+};
+typedef struct ODCIColInfo_ind ODCIColInfo_ind;
+
+struct ODCIFuncCallInfo
+{
+   struct ODCIColInfo ColInfo;
+};
+
+struct ODCIFuncCallInfo_ind
+{
+  struct ODCIColInfo_ind ColInfo;
+};
+ 
+struct ODCIIndexInfo
+{
+   OCIString*       IndexSchema;
+   OCIString*       IndexName;
+   ODCIColInfoList* IndexCols;
+   OCIString*       IndexPartition;
+   OCINumber        IndexInfoFlags;
+   OCINumber        IndexParaDegree;
+};
+typedef struct ODCIIndexInfo ODCIIndexInfo;
+ 
+struct ODCIIndexInfo_ind
+{
+   OCIInd atomic;
+   OCIInd IndexSchema;
+   OCIInd IndexName;
+   OCIInd IndexCols;
+   OCIInd IndexPartition;
+   OCIInd IndexInfoFlags;
+   OCIInd IndexParaDegree;
+};
+typedef struct ODCIIndexInfo_ind ODCIIndexInfo_ind;
+ 
+struct ODCIPredInfo
+{
+   OCIString* ObjectSchema;
+   OCIString* ObjectName;
+   OCIString* MethodName;
+   OCINumber  Flags;
+};
+typedef struct ODCIPredInfo ODCIPredInfo;
+ 
+struct ODCIPredInfo_ind
+{
+   OCIInd atomic;
+   OCIInd ObjectSchema;
+   OCIInd ObjectName;
+   OCIInd MethodName;
+   OCIInd Flags;
+};
+typedef struct ODCIPredInfo_ind ODCIPredInfo_ind;
+ 
+struct ODCIObject
+{
+   OCIString* ObjectSchema;
+   OCIString* ObjectName;
+};
+typedef struct ODCIObject ODCIObject;
+ 
+struct ODCIObject_ind
+{
+   OCIInd atomic;
+   OCIInd ObjectSchema;
+   OCIInd ObjectName;
+};
+typedef struct ODCIObject_ind ODCIObject_ind;
+ 
+struct ODCIQueryInfo
+{
+   OCINumber       Flags;
+   ODCIObjectList* AncOps;
+};
+typedef struct ODCIQueryInfo ODCIQueryInfo;
+
+ 
+struct ODCIQueryInfo_ind
+{
+   OCIInd atomic;
+   OCIInd Flags;
+   OCIInd AncOps;
+};
+typedef struct ODCIQueryInfo_ind ODCIQueryInfo_ind;
+ 
+struct ODCIIndexCtx
+{
+   struct ODCIIndexInfo IndexInfo;
+   OCIString*           Rid;
+   struct ODCIQueryInfo QueryInfo;
+};
+typedef struct ODCIIndexCtx ODCIIndexCtx;
+ 
+struct ODCIIndexCtx_ind
+{
+   OCIInd                   atomic;
+   struct ODCIIndexInfo_ind IndexInfo;
+   OCIInd                   Rid;
+   struct ODCIQueryInfo_ind QueryInfo;
+};
+typedef struct ODCIIndexCtx_ind ODCIIndexCtx_ind;
+ 
+struct ODCIFuncInfo
+{
+   OCIString* ObjectSchema;
+   OCIString* ObjectName;
+   OCIString* MethodName;
+   OCINumber Flags;
+};
+typedef struct ODCIFuncInfo ODCIFuncInfo;
+ 
+struct ODCIFuncInfo_ind
+{
+   OCIInd atomic;
+   OCIInd ObjectSchema;
+   OCIInd ObjectName;
+   OCIInd MethodName;
+   OCIInd Flags;
+};
+typedef struct ODCIFuncInfo_ind ODCIFuncInfo_ind;
+ 
+struct ODCICost
+{
+   OCINumber  CPUcost;
+   OCINumber  IOcost;
+   OCINumber  NetworkCost;
+   OCIString* IndexCostInfo;
+};
+typedef struct ODCICost ODCICost;
+ 
+struct ODCICost_ind
+{
+   OCIInd atomic;
+   OCIInd CPUcost;
+   OCIInd IOcost;
+   OCIInd NetworkCost;
+   OCIInd IndexCostInfo;
+};
+typedef struct ODCICost_ind ODCICost_ind;
+ 
+struct ODCIArgDesc
+{
+   OCINumber  ArgType;
+   OCIString* TableName;
+   OCIString* TableSchema;
+   OCIString* ColName;
+   OCIString* TablePartitionLower;
+   OCIString* TablePartitionUpper;
+   OCINumber  Cardinality;
+};
+typedef struct ODCIArgDesc ODCIArgDesc;
+ 
+struct ODCIArgDesc_ind
+{
+   OCIInd atomic;
+   OCIInd ArgType;
+   OCIInd TableName;
+   OCIInd TableSchema;
+   OCIInd ColName;
+   OCIInd TablePartitionLower;
+   OCIInd TablePartitionUpper;
+   OCIInd Cardinality;
+};
+typedef struct ODCIArgDesc_ind ODCIArgDesc_ind;
+ 
+struct ODCIStatsOptions
+{
+   OCINumber Sample;
+   OCINumber Options;
+   OCINumber Flags;
+};
+typedef struct ODCIStatsOptions ODCIStatsOptions;
+ 
+struct ODCIStatsOptions_ind
+{
+   OCIInd atomic;
+   OCIInd Sample;
+   OCIInd Options;
+   OCIInd Flags;
+};
+typedef struct ODCIStatsOptions_ind ODCIStatsOptions_ind;
+
+struct ODCIEnv
+{
+   OCINumber EnvFlags;
+   OCINumber CallProperty;
+   OCINumber DebugLevel;
+   OCINumber CursorNum;
+};
+typedef struct ODCIEnv ODCIEnv;
+
+struct ODCIEnv_ind
+{
+   OCIInd _atomic;
+   OCIInd EnvFlags;
+   OCIInd CallProperty;
+   OCIInd DebugLevel;
+   OCIInd CursorNum;
+};
+typedef struct ODCIEnv_ind ODCIEnv_ind;
+ 
+struct ODCIPartInfo
+{
+   OCIString* TablePartition;
+   OCIString* IndexPartition;
+};
+typedef struct ODCIPartInfo ODCIPartInfo;
+ 
+struct ODCIPartInfo_ind
+{
+   OCIInd atomic;
+   OCIInd TablePartition;
+   OCIInd IndexPartition;
+};
+typedef struct ODCIPartInfo_ind ODCIPartInfo_ind;
+
+/*---------- External Tables ----------*/
+struct ODCIExtTableInfo
+{
+   OCIString*       TableSchema;
+   OCIString*       TableName;
+   ODCIColInfoList* RefCols;
+   OCIClobLocator*  AccessParmClob;
+   OCIBlobLocator*  AccessParmBlob;
+   ODCIArgDescList* Locations;
+   ODCIArgDescList* Directories;
+   OCIString*       DefaultDirectory;
+   OCIString*       DriverType;
+   OCINumber        OpCode;
+   OCINumber        AgentNum;
+   OCINumber        GranuleSize;
+   OCINumber        Flag;
+   OCINumber        SamplePercent;
+   OCINumber        MaxDoP;
+   OCIRaw*          SharedBuf;
+   OCIString*       MTableName;
+   OCIString*       MTableSchema;
+   OCINumber        TableObjNo;
+};
+typedef struct ODCIExtTableInfo ODCIExtTableInfo;
+
+struct ODCIExtTableInfo_ind
+{
+   OCIInd _atomic;
+   OCIInd TableSchema;
+   OCIInd TableName;
+   OCIInd RefCols;
+   OCIInd AccessParmClob;
+   OCIInd AccessParmBlob;
+   OCIInd Locations;
+   OCIInd Directories;
+   OCIInd DefaultDirectory;
+   OCIInd DriverType;
+   OCIInd OpCode;
+   OCIInd AgentNum;
+   OCIInd GranuleSize;
+   OCIInd Flag;
+   OCIInd SamplePercent;
+   OCIInd MaxDoP;
+   OCIInd SharedBuf;
+   OCIInd MTableName;
+   OCIInd MTableSchema;
+   OCIInd TableObjNo;
+};
+typedef struct ODCIExtTableInfo_ind ODCIExtTableInfo_ind;
+
+struct ODCIExtTableQCInfo
+{
+   OCINumber        NumGranules;
+   OCINumber        NumLocations;
+   ODCIGranuleList* GranuleInfo;
+   OCINumber        IntraSourceConcurrency;
+   OCINumber        MaxDoP;
+   OCIRaw*          SharedBuf;
+};
+typedef struct ODCIExtTableQCInfo ODCIExtTableQCInfo;
+
+struct ODCIExtTableQCInfo_ind
+{
+   OCIInd _atomic;
+   OCIInd NumGranules;
+   OCIInd NumLocations;
+   OCIInd GranuleInfo;
+   OCIInd IntraSourceConcurrency;
+   OCIInd MaxDoP;
+   OCIInd SharedBuf;
+};
+typedef struct ODCIExtTableQCInfo_ind ODCIExtTableQCInfo_ind;
+
+/*********************************************************/
+/* Table Function Info types (used by ODCITablePrepare)  */
+/*********************************************************/
+
+struct ODCITabFuncInfo
+{
+  ODCINumberList*  Attrs;
+  OCIType*         RetType;
+};
+typedef struct ODCITabFuncInfo ODCITabFuncInfo;
+
+struct ODCITabFuncInfo_ind
+{
+  OCIInd _atomic;
+  OCIInd Attrs;
+  OCIInd RetType;
+};
+typedef struct ODCITabFuncInfo_ind ODCITabFuncInfo_ind;
+
+/*********************************************************************/
+/* Table Function Statistics types (used by ODCIStatsTableFunction)  */
+/*********************************************************************/
+
+struct ODCITabFuncStats
+{
+  OCINumber num_rows;
+};
+typedef struct ODCITabFuncStats ODCITabFuncStats;
+
+struct ODCITabFuncStats_ind
+{
+  OCIInd _atomic;
+  OCIInd num_rows;
+};
+typedef struct ODCITabFuncStats_ind ODCITabFuncStats_ind;
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+
+#endif                                              /* ODCI_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h b/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h
new file mode 100644
index 0000000..4cd47bb
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h
@@ -0,0 +1,307 @@
+/*
+  Copyright (c) 1982, 2003, Oracle.  All rights reserved.
+*/
+
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/OCI/include/oratypes.h,v 1.3 2005/05/06 16:48:56 karine Exp $
+ */
+ 
+
+ 
+#ifndef ORATYPES
+# define ORATYPES
+# define SX_ORACLE
+# define SX3_ORACLE 
+
+
+#ifndef ORASTDDEF
+# include <stddef.h>
+# define ORASTDDEF
+#endif
+
+#ifndef ORALIMITS
+# include <limits.h>
+# define ORALIMITS
+#endif
+
+
+#ifndef TRUE
+# define TRUE  1
+# define FALSE 0
+#endif
+
+
+#ifndef lint 
+typedef unsigned char  ub1;                   
+typedef   signed char  sb1;                  
+#else 
+#define ub1 unsigned char 
+#define sb1 signed char 
+#endif 
+ 
+#define UB1MAXVAL ((ub1)UCHAR_MAX) 
+#define UB1MINVAL ((ub1)        0) 
+#define SB1MAXVAL ((sb1)SCHAR_MAX) 
+#define SB1MINVAL ((sb1)SCHAR_MIN) 
+#define MINUB1MAXVAL ((ub1)  255) 
+#define MAXUB1MINVAL ((ub1)    0) 
+#define MINSB1MAXVAL ((sb1)  127) 
+#define MAXSB1MINVAL ((sb1) -127) 
+ 
+ 
+
+ 
+#ifndef lint 
+typedef unsigned short    ub2;                
+typedef   signed short    sb2;               
+#else 
+#define ub2  unsigned short 
+#define sb2  signed short 
+#endif
+
+#define UB2MAXVAL ((ub2)USHRT_MAX) 
+#define UB2MINVAL ((ub2)        0) 
+#define SB2MAXVAL ((sb2) SHRT_MAX) 
+#define SB2MINVAL ((sb2) SHRT_MIN) 
+#define MINUB2MAXVAL ((ub2) 65535) 
+#define MAXUB2MINVAL ((ub2)     0) 
+#define MINSB2MAXVAL ((sb2) 32767) 
+#define MAXSB2MINVAL ((sb2)-32767) 
+  
+
+
+
+#ifndef lint 
+typedef unsigned int  ub4;                   
+typedef   signed int  sb4;                   
+#else 
+#define eb4 int 
+#define ub4 unsigned int 
+#define sb4 signed int 
+#endif 
+ 
+#define UB4MAXVAL ((ub4)UINT_MAX) 
+#define UB4MINVAL ((ub4)        0) 
+#define SB4MAXVAL ((sb4) INT_MAX) 
+#define SB4MINVAL ((sb4) INT_MIN) 
+#define MINUB4MAXVAL ((ub4) 4294967295) 
+#define MAXUB4MINVAL ((ub4)          0) 
+#define MINSB4MAXVAL ((sb4) 2147483647) 
+#define MAXSB4MINVAL ((sb4)-2147483647) 
+
+
+/* --- Signed/Unsigned eight-byte scalar (orasb8/oraub8) --- */
+
+#define ORAXB8_DEFINED
+#ifndef lint
+ typedef unsigned _int64 oraub8;
+ typedef signed _int64 orasb8;
+ typedef oraub8 ub8;
+ typedef orasb8 sb8;
+#else
+# define ub8 oraub8
+# define sb8 orasb8
+# define oraub8 unsigned _int64
+# define orasb8 signed _int64
+#endif /* !lint */
+
+#define ORAUB8MINVAL    ((oraub8)0)
+#define ORAUB8MAXVAL    ((oraub8)18446744073709551615)
+#define ORASB8MINVAL    ((orasb8)-9223372036854775808)
+#define ORASB8MAXVAL    ((orasb8) 9223372036854775807)
+
+#define MAXORAUB8MINVAL ((oraub8)0)
+#define MINORAUB8MAXVAL ((oraub8)18446744073709551615)
+#define MAXORASB8MINVAL ((orasb8)-9223372036854775807)
+#define MINORASB8MAXVAL ((orasb8) 9223372036854775807)
+
+
+#define UB1BITS          CHAR_BIT
+#define UB1MASK          ((1 << ((uword)CHAR_BIT)) - 1)
+
+
+#ifdef lint
+# define oratext unsigned char
+#else
+  typedef  unsigned char oratext;
+#endif
+
+
+#ifndef lint 
+typedef          char     eb1;
+typedef          short    eb2;               
+typedef          int      eb4;               
+#else
+# define         eb1      char
+# define         eb2      short
+# define         eb4      int
+#endif
+
+#define EB1MAXVAL      ((eb1)SCHAR_MAX) 
+#define EB1MINVAL      ((eb1)        0) 
+#define MINEB1MAXVAL   ((eb1)  127) 
+#define MAXEB1MINVAL   ((eb1)    0) 
+#define EB2MAXVAL      ((eb2) SHRT_MAX) 
+#define EB2MINVAL      ((eb2)        0) 
+#define MINEB2MAXVAL   ((eb2) 32767) 
+#define MAXEB2MINVAL   ((eb2)     0) 
+#define EB4MAXVAL      ((eb4) INT_MAX) 
+#define EB4MINVAL      ((eb4)        0) 
+#define MINEB4MAXVAL   ((eb4) 2147483647) 
+#define MAXEB4MINVAL   ((eb4)          0) 
+
+
+
+
+#ifndef lint 
+typedef         sb1  b1;                   
+#else 
+#define         b1 sb1 
+#endif  
+#define  B1MAXVAL  SB1MAXVAL 
+#define  B1MINVAL  SB1MINVAL 
+ 
+#ifndef lint 
+typedef         sb2      b2;              
+#else 
+#define         b2 sb2 
+#endif  
+#define  B2MAXVAL  SB2MAXVAL 
+#define  B2MINVAL  SB2MINVAL 
+ 
+#ifndef lint 
+typedef         sb4    b4;                
+#else 
+#define         b4 sb4 
+#endif  
+# define  B4MAXVAL  SB4MAXVAL 
+# define  B4MINVAL  SB4MINVAL 
+ 
+
+#if !defined(LUSEMFC)
+# ifdef lint
+#  define text unsigned char
+# else
+   typedef oratext text;
+# endif
+#endif
+
+#ifdef lint
+# define OraText unsigned char
+#else
+  typedef oratext OraText;
+#endif
+
+#ifndef lint
+typedef          int eword;                  
+typedef unsigned int uword;                  
+typedef   signed int sword;                  
+#else
+#define eword int
+#define uword unsigned int
+#define sword signed int
+#endif 
+
+#define  EWORDMAXVAL  ((eword) INT_MAX)
+#define  EWORDMINVAL  ((eword)       0)
+#define  UWORDMAXVAL  ((uword)UINT_MAX)
+#define  UWORDMINVAL  ((uword)       0)
+#define  SWORDMAXVAL  ((sword) INT_MAX)
+#define  SWORDMINVAL  ((sword) INT_MIN)
+#define  MINEWORDMAXVAL  ((eword)  2147483647)
+#define  MAXEWORDMINVAL  ((eword)      0)
+#define  MINUWORDMAXVAL  ((uword)  4294967295)
+#define  MAXUWORDMINVAL  ((uword)           0)
+#define  MINSWORDMAXVAL  ((sword)  2147483647)
+#define  MAXSWORDMINVAL  ((sword) -2147483647)
+
+ 
+#ifdef _WIN64
+
+#ifndef lint
+typedef unsigned _int64 ubig_ora;     
+typedef   signed _int64 sbig_ora;     
+#else
+#define ubig_ora unsigned _int64
+#define sbig_ora signed _int64
+#endif 
+
+#define UBIG_ORAMAXVAL ((ubig_ora)_UI64_MAX)
+#define UBIG_ORAMINVAL ((ubig_ora)        0)
+#define SBIG_ORAMAXVAL ((sbig_ora) _I64_MAX)
+#define SBIG_ORAMINVAL ((sbig_ora) _I64_MIN)
+#define MINUBIG_ORAMAXVAL ((ubig_ora) 4294967295)
+#define MAXUBIG_ORAMINVAL ((ubig_ora)          0)
+#define MINSBIG_ORAMAXVAL ((sbig_ora) 2147483647)
+#define MAXSBIG_ORAMINVAL ((sbig_ora)-2147483647)
+
+#else
+
+#ifndef lint
+typedef unsigned long  ubig_ora;             
+typedef   signed long  sbig_ora;             
+#else
+#define ubig_ora unsigned long
+#define sbig_ora signed long
+#endif 
+
+#define UBIG_ORAMAXVAL ((ubig_ora)ULONG_MAX)
+#define UBIG_ORAMINVAL ((ubig_ora)        0)
+#define SBIG_ORAMAXVAL ((sbig_ora) LONG_MAX)
+#define SBIG_ORAMINVAL ((sbig_ora) LONG_MIN)
+#define MINUBIG_ORAMAXVAL ((ubig_ora) 4294967295)
+#define MAXUBIG_ORAMINVAL ((ubig_ora)          0)
+#define MINSBIG_ORAMAXVAL ((sbig_ora) 2147483647)
+#define MAXSBIG_ORAMINVAL ((sbig_ora)-2147483647)
+
+#endif                                                             /* _WIN64 */
+
+#define UBIGORABITS      (UB1BITS * sizeof(ubig_ora))
+
+
+#undef CONST
+#define CONST const
+
+
+#define dvoid void
+
+
+typedef void (*lgenfp_t)( void );
+
+
+
+#ifndef ORASYS_TYPES
+# include <sys/types.h>
+# define ORASYS_TYPES
+#endif 
+
+
+
+#ifndef boolean
+# define boolean int
+#endif 
+
+
+
+#ifdef sparc
+# define SIZE_TMAXVAL SB4MAXVAL               
+#else
+# define SIZE_TMAXVAL UB4MAXVAL              
+#endif 
+
+#define MINSIZE_TMAXVAL (size_t)4294967295
+
+
+#if !defined(MOTIF) && !defined(LISPL)  && !defined(__cplusplus) && !defined(LUSEMFC)
+typedef  oratext *string;        
+#endif 
+
+#ifndef lint
+typedef unsigned short  utext;
+#else
+#define utext  unsigned short
+#endif
+
+ 
+#endif 
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ori.h b/src/terralib/drivers/OracleSpatial/OCI/include/ori.h
new file mode 100644
index 0000000..8a19577
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ori.h
@@ -0,0 +1,2094 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+  NAME
+    ORI - OCI navigational interface
+
+  DESCRIPTION
+
+    This section is intended to give a brief introduction to the navigational
+    interfaces.  Readers can refer to the documents listed in the section 
+    'RELATED DOCUMENTS' for more information. 
+
+    PURPOSE 
+       The Oracle Call Interface (OCI) supports navigational access of objects.
+       In the navigational paradigm, data is represented as a graph of objects 
+       connected by references.  Objects in the graph are reached by following
+       the references.
+
+    OBJECT ENVIRONMENT
+
+      The object environment is initialized when the OCI environment handle is
+      initialized with the object option.  An object environment contains a
+      heap which buffers type instances in memory.  The object environment also
+      contains an object cache which keeps track of the objects in the object 
+      environment.  Readers can refer to the "Functional Specification for 
+      Programmatic Interface" for more information about the object 
+      environment. 
+
+    INSTANCE, OBJECT AND VALUE
+
+      An OTS instance is an occurence of a type specified by the Oracle Type 
+      System (OTS). This section describes how an OTS instance can be 
+      represented in OCI. In OCI, an OTS instance can be classified based on
+      the type, the lifetime and referencability (see the figure below):
+
+      1) A persistent object is an instance of an object type. A persistent
+         object resides in a row of a table in the server and can exist longer
+         than the duration of a session (connection). Persistent objects can be
+         identified by object references which contain the object identifiers.
+         A persistent object is obtained by pinning its object reference.
+
+      2) A transient object is an instance of an object type. A transient 
+         object cannot exist longer than the duration of a session, and it is 
+         used to contain temporary computing results. Transient objects can 
+         also be identified by references which contain transient object
+         identifiers.
+
+      3) A value is an instance of an user-defined type (object type or 
+         collection type) or any built-in OTS type.  Unlike objects, values of 
+         object types are identified by memory pointers, rather than by 
+         references.  
+
+         A value can be standalone or embbeded.  A standalone value is usually
+         obtained by issuing a select statement.  OCI also allows the client
+         program to select a row of object table into a value by issuing a SQL
+         statement.  Thus, a referenceable object (in the database) can be 
+         represented as a value (which cannot be identified by a reference).
+         A standalone value can also be an out-of-line attribute in an object 
+         (e.g varchar, raw) or an out-of-line element in a collection (e.g.
+         varchar, raw, object).
+      
+         An embedded value is phyiscally included in a containing instance.
+         An embedded value can be an in-line attribute in an object (e.g.
+         number, nested object) or an in-line element in a collection.
+
+         All values are considered to be transient by OCI, e.g. OCI does not
+         support automatic flushing a value to the database, and the client has
+         to explicitly execute a SQL statement to store a value into the 
+         database. For embedded values, they are flushed when their containing
+         instance are flushed.
+
+
+                                OTS instance
+                                 |        |  
+                                 v        v
+                               object    value         (type)
+                               |    |
+                               v    v
+                       persistent  transient           (lifetime)
+                  
+ 
+                     persistent obj   transient obj     value  
+      ---------------------------------------------------------------
+      |              |              |               |  object type, |
+      | type         | object type  |  object type  |  built-in,    |
+      |              |              |               |  collection   |
+      ---------------------------------------------------------------
+      | maximum      | until object |  session      | session       |
+      | lifetime     | is deleted   |               |               | 
+      ---------------------------------------------------------------
+      | referencable |    yes       |     yes       |    no         |    
+      ---------------------------------------------------------------
+      | embeddable   |    no        |     no        |    yes        |    
+      ---------------------------------------------------------------
+
+    REFERENCEABLE OBJECT, STANDALONE OBJECT, EMBEDDED OBJECT
+
+       In the reminding of this include file, the following term will be used:
+       1) The term 'object' can be generally referred to a persistent object,
+          a transient object, a standalone value of object type, or an embedded
+          value of object type.
+       2) The term 'referenceable object' refers to a persistent object or a 
+          transient object.
+       3) The term 'standalone object' refers to a persistent object, a
+          transient object or a standalone value of object type.
+       4) The term 'embedded object' referes to a embbeded value of object 
+          type.
+
+    META ATTRIBUTES 
+
+      There is a set of meta-attributes that are defined for standalone 
+      objects.  A meta-attribute can be transient or persistent. A 
+      transient meta-attribute is applicable to an instance only when it is 
+      in memory. A persistent meta-attribute can be applicable to an instance 
+      that is in the disk. 
+
+      The set of user visible meta-attributes for persistent objects are:
+      1) existent (persistent) : Does the object exist?
+      2) nullness (persistent) : Null information of the instance
+      3) locked   (persistent) : Is the object locked?
+      4) pinned    (transient) : Is the object being accessed by the client?
+      5) dirty     (transient) : Has the object been modified?
+      6) allocation duration (transient) : see below
+      7) pin duration        (transient) : see below
+
+      The set of user visible meta-attributes for transient objects are:
+      1) existent  (transient) : Does the object exist?
+      2) nullness  (transient) : Null information of the instance 
+      3) pinned    (transient) : Is the object being accessed by the client? 
+      4) dirty     (transient) : Has the object been modified?
+      4) allocation duration (transient) : see below
+      5) pin duration        (transient) : see below
+
+      The set of user visible meta-attributes for standalone values of object  
+      type or collections are:
+      1) allocation duration (transient) : see below
+      2) nullness            (transient) : Null information of the instance 
+                                           (of an object type)
+
+    NULLNESS OF AN INSTANCE 
+
+      Each standalone object is associated with a null structure which keeps 
+      the null information about the object.  A null indicates the absence of 
+      data. The null structure itself contains null indicators that represent:
+        1) atomic nullness : a null value that pertains to the whole object 
+        2) null status of the individual attribute in the object 
+
+      The layout of a null structure in memory resembles that of the object,
+      except that the null structure has additional indicators to represent 
+      the atomic nullness for each object. 
+
+      An non-existent object is different than an object that is atomically 
+      null. A atomically null object is an existing object that has no data. 
+
+    MEMORY LAYOUT OF AN OBJECT
+
+      A standalone object in memory is composed of a top level memory chunk, 
+      a null structure and optionally, a number of secondary memory chunks. 
+      For a DEPARTMENT object type,
+
+          OBJECT TYPE department
+          {
+              dep_name      varchar2(20),
+              budget        number,
+              manager       person,              /o person is an object type o/
+              employees     collection of person
+          }
+
+      Each instance of DEPARTMENT will has a top level memory chunk which
+      contains the top level attributes such as dep_name, budget, manager and
+      employees.  The attributes dep_name and employees are themselves pointers
+      to the additional memory (the secondary memory chunks). The secondary
+      memory is for the out-of-line attribute (e.g. varray).
+
+    CONSISTENCY MODEL
+
+      Each pin operation behaves like a distinct SQL select.  Thus, the object 
+      cache does not guarantee consistency for a graph of objects.  In order to
+      retrieve a consistent graph of objects, the user has to explicitly start 
+      a serializable transaction or a read-only transaction. 
+
+    DURATION
+      In OCI, a duration is used to specify 
+
+        1) the length of memory allocation of an instance 
+           When each instance is allocated, it is associate with an allocation
+           duration.  The memory occupied by the object is freed automatically 
+           at the end of its allocation duration. The allocation duration of an
+           instance cannot be changed.  
+
+        2) the length of pinning of an object
+           When each object is pinned, the client has to give a pin duration 
+           which specify the length of time that the object is intended to be
+           used.  It is an user error to specify a pin duration longer than an
+           allocation duration of the object. An object is completely unpinned 
+           at the end of its pin duration (see OCIObjectUnpin()). 
+
+      An OCI program can use the allocation duration and the pin duration to 
+      automatically free the memory of the instances:
+       1) Transient objects and values are freed at the end of the allocation
+          duration.
+       2) Persistent objects ARE freed at the end of the allocation duration.
+          Persistent objects CAN be freed at the end of the pin duration when
+          the objects are completely unpinned. The persistent objects are said
+          to be aged out. See OCIObjectUnpin() for more details.
+
+      There are 3 predefined duration: session, transaction, call.  The time 
+      spans of these durations are defined based on the programming model 
+      presented by OCI. The call duration is mapped to the transaction 
+      duration in the client-side environment. See oro.h for the macros defined
+      for these 3 durations.
+
+      A pin duration can be promoted. For example, if an object is pinned with
+      duration 1, and the object is later pinned with duration 2, the pin 
+      routine will try to find a duration that is longer or equal to the 
+      length of both duration 1 and duration 2.  The pin duration of the object
+      is set to the that duration. The object is automatically unpinned only 
+      after both duration 1 and duration 2 are terminated. 
+
+  RELATED DOCUMENTS
+    "Functional Specification for Oracle Object RDBMS" 
+    "Functional Specification for Programmatic Interfaces" 
+    "Functional Specification for the Oracle Type System (OTS)" 
+
+  INSPECTION STATUS 
+    Inspection date:
+    Inspection status:
+    Estimated increasing cost defects per page:
+    Rule sets:        
+
+  ACCEPTANCE REVIEW STATUS 
+    Review date:   
+    Review status:
+    Reviewers: 
+
+  PUBLIC FUNCTIONS
+    OCIObjectNew - OCI new a standalone instance 
+    OCIObjectPin - OCI pin an object by reference
+    OCIObjectUnpin - OCI unpin a referenceable object
+    OCIObjectPinCountReset - OCI reset the pin count of a referenceable object 
+    OCIObjectLock - OCI lock a persistent object
+    OCIObjectLockNoWait - OCI lock a persistent object
+    OCIObjectMarkUpdate - OCI mark a referenceable object as updated
+    OCIObjectUnmark - OCI unmark a dirtied referenceable object 
+    OCIObjectUnmarkByRef - OCI unmark a dirtied object by reference 
+    OCIObjectFree - OCI free a standalone instance 
+    OCIObjectMarkDelete - OCI mark a referenceable object as deleted 
+    OCIObjectMarkDeleteByRef - OCI mark a referenceable object as deleted by 
+                               giving a reference
+    OCIObjectFlush - OCI flush a persistent object
+    OCIObjectRefresh - OCI refresh a persistent object 
+    OCIObjectCopy - OCI CoPy one object to another
+    OCIObjectGetTypeRef - OCI get the Type Reference of a standalone object 
+    OCIObjectGetObjectRef - OCI get the Object's Reference 
+    OCIObjectGetInd - OCI get Null Structure of an standalone object 
+    OCIObjectExists - OCI get the existence of a referenceable object
+    OCIObjectGetProperty - get object property
+    OCIObjectIsLocked - OCI get the lock status of a referenceable object
+    OCIObjectIsDirty - OCI get the dirty status of a referenceable object
+    OCIObjectPinTable - OCI get Table object 
+    OCIObjectArrayPin - OCI pin array of objects 
+    OCIObjectGetPrimayKeyTypeRef - OCI get the Ref for the primary key OID's 
+                                   type 
+    OCIObjectMakeObjectRef - OCI Create a pk or sys generated REF  
+
+    OCIObjectGetNewOID - OCI Create a new Object ID
+
+    OCICacheFlush - OCI flsuh the modified persistent objects in the cache
+    OCICacheRefresh - OCI refresh persistent objects in the cache 
+    OCICacheUnpin - OCI unpin referenceable objects in the cache
+    OCICacheFree - OCI free all instances in the environment
+    OCICacheUnmark - OCI unmark all dirty referenceable objects in the cache 
+
+  PRIVATE FUNCTIONS
+    None
+
+  EXAMPLES 
+
+    The following types will be used in the examples in this section: 
+
+    OBJECT TYPE professor
+    (
+        varchar2  name;
+        number    department;
+        number    num_of_students; 
+    );
+
+    OBJECT TYPE course 
+    (
+        varchar2   name;
+        number     grade; 
+    );
+
+    OBJECT TYPE student
+    (
+        vstring      name;
+        number       department;
+        ref          advisor;                      /o advisor is a professor o/
+        collection   courses;
+    );
+
+    EXAMPLE 1
+
+      Here is a set of examples to illustrate the usages of some of the
+      orio and oric functions.  
+
+      OCIenv    *env;              /o OCI environment handle o/
+      OCIError  *err;              /o OCI error handle o/
+      OCISvcCtx *svc;              /o OCI service handle o/
+
+      dvoid   *stu_tbl;            /o pointer to the student table o/
+      OCIType *stu_tdo;            /o student type tdo o/
+
+      OCIRef    *stu2_ref;         /o object reference to student object o/
+      student   *stu1;             /o pointer to the student object o/
+      student   *stu2;             /o pointer to the student object o/
+      professor *pro;              /o pointer to the professor object o/
+
+      /o Initialize the OCI environment handle, error handle and service
+         handle and login to the database o/ 
+      ...
+
+      /o CREATE A PERSISTENT OBJECT o/
+
+      /o get the table object of student o/
+      if (OCIObjectPinTable(env, err, svc, "ORACLEU", sizeof("ORACLEU"), 
+          "STUDENT_TABLE", sizeof("STUDENT_TABLE"), (OCIRef *)0, 
+          OCI_DURATION_NULL, &stu_tbl) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o get type object of student o/
+      if (OCITypeByName(env, err, svc, "ORACLEU", sizeof("ORACLEU"), 
+          "STUDENT", sizeof("STUDENT"), OCI_DURATION_NULL, OCI_TYPEGET_HEADER,
+          &stu_tdo) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o create a persistent object 'mark' (of type student) o/ 
+      if (OCIObjectNew(env, err, svc, OCI_TYPECODE_ADT, stu_tdo, stu_tbl, 
+            OCI_DURATION_TRANS, (ub1)FALSE, (dvoid **)&stu1) != OCI_SUCCESS)
+          /o error handling code o/
+
+      /o RETRIEVE OBJECTS IN PERSISTENT STORES o/ 
+
+      /o Use OCI to retrieve a reference to student object 'joe'.
+       o The retrieved reference is bound to the variable stu2_ref.
+       o/ 
+
+      /o pin/retrieve the student "joe" by reference o/ 
+      if (OCIObjectPin(env, err, &stu2_ref, (OCIComplexObject *)0, OCI_PIN_ANY,
+                  OCI_DURATION_TRANS, OCI_LOCK_X, &stu2) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o pin/retrieve the advisor of student "joe" by reference o/ 
+      if (OCIObjectPin(env, err, &stu2->advisor, (OCIComplexObject *)0,
+          OCI_PIN_ANY, OCI_DURATION_TRANS, OCI_LOCK_X, &pro) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o MODIFY OBJECTS o/
+
+      /o initialize the newly created object "mark" o/
+      DISCARD OCIStringAssignText(env, err, "mark", sizeof("mark"), 
+                                    &stu1->name);
+      department = 522;
+      DISCARD OCINumberFromInt(err, &department, sizeof(department), 
+                                    OCI_NUMBER_UNSIGNED, &stu1->department);
+
+      /o assign advisor to student "mark" o/
+      DISCARD OCIRefAssign(env, err, &stu2->advisor, &stu1->advisor);
+
+      /o update student "joe". o/  
+      department = 533;
+      DISCARD OCINumberFromInt(err, &department, sizeof(department), 
+                                    OCI_NUMBER_UNSIGNED, &stu2->department);
+      DISCARD OCIObjectMarkUpdate(env, err, stu2);
+
+      /o UNPIN OBJECTS AFTER FINSIHED PROCESSING THEM o/ 
+
+      /o unpin the student object "mark" o/
+      if (OCIObjectUnpin(env, err, stu1) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the student object "joe" o/
+      if (OCIObjectUnpin(env, err, stu2) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the professor object o/
+      if (OCIObjectUnpin(env, err, pro) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the type object o/
+      if (OCIObjectUnpin(env, err, stu_tdo) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o unpin the table object o/
+      if (OCIObjectUnpin(env, err, stu_tbl) != OCI_SUCCESS)
+          /o error handling code o/ 
+
+      /o FLUSH MODIFIED OBJECTS BACK TO PERSISTENT STORE o/
+
+      if (OCICacheFlush(env, err, svc, (dvoid *)0, ((OCIRef*)(*)())0, 
+                       (OCIRef *)0) != OCI_SUCCESS)
+          /o error handling code o/
+
+      /o commit transaction o/
+
+    END OF EXAMPLE 1
+
+  NOTES
+    This file has been subsetted to contain only the routines that will
+    be in the first release.
+
+  MODIFIED
+    srseshad   03/12/03 - convert oci public api to ansi
+    aahluwal   06/03/02 - bug 2360115
+    bpalaval   02/09/01 - Change text to oratext.
+    rkasamse   06/21/00 - add ociobjectgetnewoid
+    rkasamse   05/24/00 - add OCIObjectSetData
+    whe        09/01/99 - 976457:check __cplusplus for C++ code
+    smuralid   10/29/98 - add comments for OCIObjectMakeObjectRef              
+    mkrishna   08/19/98 - change OCIGetPkTypeRef to OCIObjectGetPrimaryKeyTypeR
+    mkrishna   08/10/98 - add OCIObjectMakeObjectRef & OCIObjectGetPkTypeRef
+    rkasamse   06/22/98 - add comments for OCIDurationBegin(End)
+    pmitra     04/01/98 - OCIObjectLockNoWait added                            
+    pmitra     11/05/97 - [573769] OCIObjectArrayPin pos parameter cannot be NU
+    cxcheng    07/29/97 - fix compile for short names
+    skrishna   07/14/97 - add OCIObjectGetProperty
+    skrishna   04/30/97 - OCIObjectFlushRefresh: remove duplicate declaration
+    skrishna   04/24/97 - flag unsupported functions
+    sthakur    03/20/97 - modify flag argument to OCIObjectFree
+    skrishna   03/18/97 - fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/19/97 - remove short names support
+    cxcheng    02/06/97 - take out short name support except with SLSHORTNAME
+    sthakur    12/20/96 - fix a typepo in OCIOBjectArrayPin
+    jboonleu   11/07/96 - modify comments
+    cxcheng    10/28/96 - more beautification changes
+    jboonleu   10/24/96 - add flag to OCIObjectFree
+    jboonleu   10/22/96 - change interface of OCICacheFlush
+    cxcheng    10/18/96 - rename OCIObjectPinArray to OCIObjectArrayPin
+    cxcheng    10/14/96 - more renaming of types
+    jboonleu   10/09/96 - add new interfaces
+    cxcheng    10/09/96 - more lint fixes
+    cxcheng    10/08/96 - more lint fixes
+    jboonleu   09/27/96 - fix lint errors
+    jboonleu   10/07/96 - beautify ori.h after conversion to long names
+    cxcheng    10/04/96 - replace short names with long names
+    sthakur    08/20/96 - add COR context to OCIObjectPin
+    mluong     07/17/96 - add back orioglk, oriogdr, oriogiv, and oriocur.
+    jboonleu   07/17/96 - rename refresh option to conherency option 
+    jboonleu   07/16/96 - change comment for cache consistency
+    jwijaya    07/03/96 - add ANSI prototypes
+    jboonleu   06/12/96 - update comment
+    jboonleu   05/08/96 -  change description of OCIDurationGetParent
+    jboonleu   05/01/96 -  add OROOCOSFN
+    skrishna   04/08/96 -  change ori*() to take OCIEnv* and OCIError* instead
+                           of oroenv*
+    jboonleu   01/04/96 -  interface change
+    jboonleu   10/24/95 -  support of variable ref
+    jboonleu   02/15/95 -  new interface
+    sthakur    01/05/95 -  pass username to origrgc 
+    skotsovo   12/07/94 -  update example 
+    jwijaya    11/15/94 -  rename ORONSPTAB to ORONSPEXT 
+    jwijaya    10/06/94 -  add namespace to oriopnm() 
+    jwijaya    10/02/94 -  connection handle -> connection number 
+    jboonleu   08/16/94 -  fix lint errors 
+    jboonleu   07/20/94 -  change interface of OCICacheFlush 
+    tanguyen   07/18/94 -  add oriocpe, change OCIObjectCopy to oriocps
+    tcheng     07/15/94 -  add init param maximum_sga_heap_size 
+    tcheng     07/13/94 -  change origini to get param string 
+    jboonleu   07/05/94 -  change sccs string from sccid to a comment 
+    jboonleu   07/01/94 -  Add examples to ORIO* and ORIC* functions 
+    tanguyen   06/30/94 -  Fix the ORI_ORACLE ifdef
+    skotsovo   06/27/94 -  include all public functions in public functions 
+                           list at top of header file
+    tcheng     06/27/94 -  modify comments according to new template 
+    tanguyen   06/24/94 -  fix comments for OCIObjectCopy 
+    tcheng     06/24/94 -  fix comments in origrgc()
+    tanguyen   06/21/94 -  fix comments and format 
+    tcheng     06/20/94 -  commenting origini/trm/err/rgc/urg() functions
+    tanguyen   06/16/94 -  fix descriptions of ref operations 
+    tanguyen   06/16/94 -  clarifies refs comparison 
+    tanguyen   05/12/94 -  adds more interfaces (OCIObjectMarkUpdate)
+    jwijaya    05/10/94 -  fix examples, add origurg, change origcon to origrgc
+    tanguyen   05/03/94 -  remove unnecessary 'type' argument from 
+                           'OCIObjectCopy'
+    tanguyen   03/08/94 -  clarifies comments
+    jwijaya    02/16/94 -  more questions
+    jwijaya    02/11/94 -  more comments
+    jwijaya    02/10/94 -  identify optional arguments
+    jwijaya    02/07/94 -  Creation
+*/
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef ORI_ORACLE
+#define ORI_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIDurationBegin                 origbgu
+#define OCIDurationEnd                   origedu
+#define OCIDurationGetParent             origpdr
+#define OCICacheFlushRefresh             oricfrh
+#define OCICacheUnpin                    oricunp
+#define OCICacheFree                     oricfre
+#define OCICacheUnmark                   oricumk
+#define OCICacheGetObjects               oricgpr
+#define OCICacheRegister                 oricscb
+#define OCIObjectUnpin                   oriounp
+#define OCIObjectPinCountReset           orioupz
+#define OCIObjectLock                    oriolck
+#define OCIObjectLockNoWait              oriolnw
+#define OCIObjectMarkUpdate              orioupd
+#define OCIObjectUnmark                  orioumk
+#define OCIObjectUnmarkByRef             orioumr
+#define OCIObjectAlwaysLatest            oriomkl
+#define OCIObjectNotAlwaysLatest         oriouml
+#define OCIObjectMarkDeleteByRef         oriordl
+#define OCIObjectMarkDelete              oriopdl
+#define OCIObjectFlush                   oriofls
+#define OCIObjectFlushRefresh            oriofrh
+#define OCIObjectCopy                    oriocpy
+#define OCIObjectGetTypeRef              oriogtr
+#define OCIObjectGetObjectRef            oriogor
+#define OCIObjectGetInd                  oriogns
+#define OCIObjectExists                  oriogex
+#define OCIObjectGetProperty             oriogpr
+#define OCIObjectRefresh                 oriorfs
+#define OCIObjectPinTable                oriogtb
+#define OCIObjectGetPrimaryKeyTypeRef    oriogpf
+#define OCIObjectMakeObjectRef           oriomrf
+
+#define OCIObjectNew                     orionew
+#define OCIObjectPin                     oriopin
+#define OCIObjectFree                    oriofre
+#define OCIObjectArrayPin                orioapn
+#define OCIObjectIsDirty                 oriodrt
+#define OCIObjectIsDirtied               oriodrd
+#define OCIObjectIsLoaded                orioldd
+#define OCICacheFlush                    oricfls
+#define OCICacheRefresh                  oricrfs
+
+#endif                                                        /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------*/
+/*                       PUBLIC TYPES AND CONSTANTS                          */
+/*---------------------------------------------------------------------------*/
+
+/* Also see oro.h. */
+
+/*---------------------------------------------------------------------------*/
+/*                           PUBLIC FUNCTIONS                                */
+/*---------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/*                       OBJECT/INSTANCE OPERATIONS                          */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCIObjectNew ----------------------------------*/
+sword OCIObjectNew(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+                       OCITypeCode typecode, OCIType *tdo, dvoid *table, 
+                       OCIDuration duration, boolean value, 
+                       dvoid **instance    );
+/*
+   NAME: OCIObjectNew - OCI new (create) a standalone instance
+   PARAMETERS:
+        env  (IN/OUT) - OCI environment handle initialized in object mode
+        err  (IN/OUT) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                        OCIErrorGet().
+        svc      (IN) - OCI service handle.  
+        typecode (IN) - the typecode of the type of the instance. 
+        tdo      (IN, optional) - pointer to the type descriptor object. The 
+                        TDO describes the type of the instance that is to be 
+                        created. Refer to OCITypeByName() for obtaining a TDO. 
+                        The TDO is required for creating a named type (e.g. an
+                        object or a collection).
+        table (IN, optional) - pointer to a table object which specifies a 
+                        table in the server.  This parameter can be set to NULL
+                        if no table is given. See the description below to find
+                        out how the table object and the TDO are used together
+                        to determine the kind of instances (persistent, 
+                        transient, value) to be created. Also see 
+                        OCIObjectPinTable() for retrieving a table object.
+        duration (IN) - this is an overloaded parameter. The use of this
+                        parameter is based on the kind of the instance that is 
+                        to be created.
+                        a) persistent object. This parameter specifies the
+                           pin duration.
+                        b) transient object. This parameter specififes the 
+                           allocation duration and pin duration. 
+                        c) value. This parameter specifies the allocation
+                           duration. 
+        value    (IN)  - specifies whether the created object is a value.
+                         If TRUE, then a value is created. Otherwise, a 
+                         referenceable object is created.  If the instance is 
+                         not an object, then this parameter is ignored.
+        instance (OUT) - address of the newly created instance
+                  
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function creates a new instance of the type specified by the 
+        typecode or the TDO. Based on the parameters 'typecode' (or 'tdo'), 
+        'value' and 'table', different kinds of instances can be created:
+            
+                                     The parameter 'table' is not NULL?
+
+                                               yes              no
+             ----------------------------------------------------------------
+             | object type (value=TRUE)   |   value         |   value       |
+             ----------------------------------------------------------------
+             | object type (value=FALSE)  | persistent obj  | transient obj |
+       type  ----------------------------------------------------------------
+             | built-in type              |   value         |   value       |
+             ----------------------------------------------------------------
+             | collection type            |   value         |   value       |
+             ----------------------------------------------------------------
+
+        This function allocates the top level memory chunk of an OTS instance.
+        The attributes in the top level memory are initialized (e.g. an 
+        attribute of varchar2 is initialized to a vstring of 0 length). 
+
+        If the instance is an object, the object is marked existed but is 
+        atomically null. 
+
+        FOR PERSISTENT OBJECTS:
+        The object is marked dirty and existed.  The allocation duration for 
+        the object is session. The object is pinned and the pin duration is 
+        specified by the given parameter 'duration'.
+
+        FOR TRANSIENT OBJECTS:
+        The object is pinned. The allocation duration and the pin duration are 
+        specified by the given parameter 'duration'.
+
+        FOR VALUES:
+        The allocation duration is specified by the given parameter 'duration'.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectPin ----------------------------------*/
+sword OCIObjectPin(    OCIEnv *env, OCIError *err, OCIRef *object_ref, 
+                       OCIComplexObject *corhdl, OCIPinOpt pin_option, 
+                       OCIDuration pin_duration, 
+                       OCILockOpt lock_option, dvoid **object    );
+/*
+   NAME: OCIObjectPin - OCI pin a referenceable object
+   PARAMETERS:
+        env        (IN/OUT) - OCI environment handle initialized in object mode
+        err        (IN/OUT) - error handle. If there is an error, it is
+                              recorded in 'err' and this function returns 
+                              OCI_ERROR. The error recorded in 'err' can be 
+                              retrieved by calling OCIErrorGet().
+        object_ref     (IN) - the reference to the object. 
+        corhdl         (IN) - handle for complex object retrieval. 
+        pin_option     (IN) - See description below.
+        pin_duration   (IN) - The duration of which the object is being accesed
+                              by a client. The object is implicitly unpinned at
+                              the end of the pin duration. 
+                              If OCI_DURATION_NULL is passed, there is no pin 
+                              promotion if the object is already loaded into 
+                              the cache. If the object is not yet loaded, then 
+                              the pin duration is set to OCI_DURATION_DEFAULT. 
+        lock_option    (IN) - lock option (e.g., exclusive). If a lock option
+                              is specified, the object is locked in the server.
+                              See 'oro.h' for description about lock option. 
+        object        (OUT) - the pointer to the pinned object.
+
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+
+        This function pins a referenceable object instance given the object
+        reference. The process of pinning serves three purposes:
+
+        1) locate an object given its reference. This is done by the object
+           cache which keeps track of the objects in the object heap.  
+
+        2) notify the object cache that an object is being in use. An object 
+           can be pinned many times. A pinned object will remain in memory 
+           until it is completely unpinned (see OCIObjectUnpin()). 
+
+        3) notify the object cache that a persistent object is being in use 
+           such that the persistent object cannot be aged out.  Since a 
+           persistent object can be loaded from the server whenever is needed, 
+           the memory utilization can be increased if a completely unpinned 
+           persistent object can be freed (aged out), even before the 
+           allocation duration is expired.  
+
+        Also see OCIObjectUnpin() for more information about unpinning.
+
+        FOR PERSISTENT OBJECTS:
+
+        When pinning a persistent object, if it is not in the cache, the object
+        will be fetched from the persistent store. The allocation duration of
+        the object is session. If the object is already in the cache, it is
+        returned to the client.  The object will be locked in the server if a 
+        lock option is specified. 
+
+        This function will return an error for a non-existent object.  
+
+        A pin option is used to specify the copy of the object that is to be 
+        retrieved: 
+
+        1) If option is OCI_PIN_ANY (pin any), if the object is already 
+           in the environment heap, return this object. Otherwise, the object 
+           is retrieved from the database.  This option is useful when the 
+           client knows that he has the exclusive access to the data in a 
+           session.
+
+        2) If option is OCI_PIN_LATEST (pin latest), if the object is 
+           not cached, it is retrieved from the database.  If the object is 
+           cached, it is refreshed with the latest version. See 
+           OCIObjectRefresh() for more information about refreshing.
+
+        3) If option is OCI_PIN_RECENT (pin recent), if the object is loaded
+           into the cache in the current transaction, the object is returned.
+           If the object is not loaded in the current transaction, the object
+           is refreshed from the server.
+
+        FOR TRANSIENT OBJECTS:
+
+        This function will return an error if the transient object has already 
+        been freed. This function does not return an error if an exclusive 
+        lock is specified in the lock option. 
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------------ OCIObjectUnpin -----------------------------*/
+sword OCIObjectUnpin(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectUnpin - OCI unpin a referenceable object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by 
+                         calling OCIErrorGet().
+        object    (IN) - pointer to an object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function unpins an object.  An object is completely unpinned when 
+          1) the object was unpinned N times after it has been pinned N times
+             (by calling OCIObjectPin()).
+          2) it is the end of the pin duration
+          3) the function OCIObjectPinCountReset() is called 
+
+        There is a pin count associated with each object which is incremented
+        whenever an object is pinned. When the pin count of the object is zero,
+        the object is said to be completely unpinned. An unpinned object can
+        be freed without error.
+
+        FOR PERSISTENT OBJECTS:
+        When a persistent object is completely unpinned, it becomes a candidate
+        for aging. The memory of an object is freed when it is aged out. Aging
+        is used to maximize the utilization of memory.  An dirty object cannot 
+        be aged out unless it is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The pin count of the object is decremented. A transient can be freed
+        only at the end of its allocation duration or when it is explicitly
+        deleted by calling OCIObjectFree().
+
+        FOR VALUE:
+        This function will return an error for value.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectPinCountReset -----------------------*/
+sword OCIObjectPinCountReset(    OCIEnv *env, OCIError *err, dvoid *object   );
+/*
+   NAME: OCIObjectPinCountReset - OCI resets the pin count of a referenceable
+                                  object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to an object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function completely unpins an object.  When an object is 
+        completely unpinned, it can be freed without error.  
+
+        FOR PERSISTENT OBJECTS:
+        When a persistent object is completely unpinned, it becomes a candidate
+        for aging. The memory of an object is freed when it is aged out. Aging
+        is used to maximize the utilization of memory.  An dirty object cannot 
+        be aged out unless it is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The pin count of the object is decremented. A transient can be freed
+        only at the end of its allocation duration or when it is explicitly
+        freed by calling OCIObjectFree().
+
+        FOR VALUE:
+        This function will return an error for value.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectLock ---------------------------------*/
+sword OCIObjectLock(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectLock - OCI lock a persistent object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function locks a persistent object at the server. Unlike
+        OCIObjectLockNoWait() this function waits if another user currently
+        holds a lock on the desired object. This function
+        returns an error if:
+          1) the object is non-existent.
+
+        This function will return an error for transient objects and values.
+        The lock of an object is released at the end of a transaction.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*------------------------ OCIObjectLockNoWait ------------------------------*/
+sword OCIObjectLockNoWait(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectLockNoWait - OCI lock a persistent object, do not wait for
+                               the lock, return error if lock not available
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function locks a persistent object at the server. Unlike
+        OCIObjectLock() this function will not wait if another user holds
+        the lock on the desired object. This function returns an error if:
+          1) the object is non-existent.
+          2) the object is currently locked by another user in which
+             case this function returns with an error.
+
+        This function will return an error for transient objects and values.
+        The lock of an object is released at the end of a transaction.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*--------------------------- OCIObjectMarkUpdate ---------------------------*/
+sword OCIObjectMarkUpdate(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectMarkUpdate - OCI marks an object as updated
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        FOR PERSISTENT OBJECTS:
+        This function marks the specified persistent object as updated. The
+        persistent objects will be written to the server when the object cache
+        is flushed.  The object is not locked or flushed by this function. It
+        is an error to update a deleted object.  
+
+        After an object is marked updated and flushed, this function must be
+        called again to mark the object as updated if it has been dirtied
+        after it is being flushed.
+
+        FOR TRANSIENT OBJECTS:
+        This function marks the specified transient object as updated. The
+        transient objects will NOT be written to the server. It is an error
+        to update a deleted object.
+
+        FOR VALUES:
+        It is an no-op for values.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*----------------------------- OCIObjectUnmark -----------------------------*/
+sword OCIObjectUnmark(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectUnmark - OCI unmarks an object 
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        object    (IN) - pointer to the persistent object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        FOR PERSISTENT OBJECTS AND TRANSIENT OBJECTS:
+        This function unmarks the specified persistent object as dirty. Changes
+        that are made to the object will not be written to the server. If the
+        object is marked locked, it remains marked locked.  The changes that
+        have already made to the object will not be undone implicitly. 
+ 
+        FOR VALUES:
+        It is an no-op for values.
+ 
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*----------------------------- OCIObjectUnmarkByRef ------------------------*/
+sword OCIObjectUnmarkByRef(    OCIEnv *env, OCIError *err, OCIRef *ref    );
+/*
+   NAME: OCIObjectUnmarkByRef - OCI unmarks an object by Ref
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns OCI_ERROR.
+                         The error recorded in 'err' can be retrieved by
+                         calling OCIErrorGet().
+        ref   (IN) - reference of the object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        FOR PERSISTENT OBJECTS AND TRANSIENT OBJECTS:
+        This function unmarks the specified persistent object as dirty. Changes
+        that are made to the object will not be written to the server. If the
+        object is marked locked, it remains marked locked.  The changes that
+        have already made to the object will not be undone implicitly.
+ 
+        FOR VALUES:
+        It is an no-op for values.
+ 
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectFree ---------------------------------*/
+sword OCIObjectFree(    OCIEnv *env, OCIError *err, dvoid *instance, 
+                        ub2 flags   );
+/*
+   NAME: OCIObjectFree - OCI free (and unpin) an standalone instance 
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        instance   (IN) - pointer to a standalone instance.
+        flags      (IN) - If OCI_OBJECT_FREE_FORCE is set, free the object
+                          even if it is pinned or dirty.
+                          If OCI_OBJECT_FREE_NONULL is set, the null
+                          structure will not be freed. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance to be freed must be standalone.
+        - If the instance is a referenceable object, the object must be pinned.
+   DESCRIPTION:
+        This function deallocates all the memory allocated for an OTS instance,
+        including the null structure.
+
+        FOR PERSISTENT OBJECTS:
+        This function will return an error if the client is attempting to free 
+        a dirty persistent object that has not been flushed. The client should 
+        either flush the persistent object or set the parameter 'flag' to  
+        OCI_OBJECT_FREE_FORCE.
+
+        This function will call OCIObjectUnpin() once to check if the object 
+        can be completely unpin. If it succeeds, the rest of the function will 
+        proceed to free the object.  If it fails, then an error is returned 
+        unless the parameter 'flag' is set to OCI_OBJECT_FREE_FORCE.
+ 
+        Freeing a persistent object in memory will not change the persistent 
+        state of that object at the server.  For example, the object will 
+        remain locked after the object is freed.
+
+        FOR TRANSIENT OBJECTS:
+
+        This function will call OCIObjectUnpin() once to check if the object 
+        can be completely unpin. If it succeeds, the rest of the function will 
+        proceed to free the object.  If it fails, then an error is returned 
+        unless the parameter 'flag' is set to OCI_OBJECT_FREE_FORCE. 
+
+        FOR VALUES:
+        The memory of the object is freed immediately. 
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*----------------------- OCIObjectMarkDeleteByRef --------------------------*/
+sword OCIObjectMarkDeleteByRef(    OCIEnv *env, OCIError *err, 
+                                   OCIRef *object_ref);
+/*
+   NAME: OCIObjectMarkDeleteByRef - OCI "delete" (and unpin) an object given
+                                    a reference
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        object_ref  (IN) - ref of the object to be deleted
+
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function marks the object designated by 'object_ref' as deleted.
+
+        FOR PERSISTENT OBJECTS:
+        If the object is not loaded, then a temporary object is created and is 
+        marked deleted. Otherwise, the object is marked deleted.  
+
+        The object is deleted in the server when the object is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The object is marked deleted.  The object is not freed until it is
+        unpinned.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectMarkDelete ---------------------------*/
+sword OCIObjectMarkDelete(    OCIEnv *env, OCIError *err, dvoid *instance    );
+/*
+   NAME: OCIObjectMarkDelete - OCI "delete" an instance given a Pointer 
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        instance   (IN) - pointer to the instance 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - If the instance is a referenceable object, then it must be pinned.
+   DESCRIPTION:
+
+        FOR PERSISTENT OBJECTS:
+        The object is marked deleted.  The memory of the object is not freed.
+        The object is deleted in the server when the object is flushed.
+
+        FOR TRANSIENT OBJECTS:
+        The object is marked deleted.  The memory of the object is not freed.
+
+        FOR VALUES: 
+        This function frees a value immediately. 
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectFlush -------------------------------*/
+sword OCIObjectFlush(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectFlush - OCI flush a persistent object
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        object     (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function flushes a modified persistent object to the server.
+        An exclusive lock is obtained implicitly for the object when flushed.
+
+        When the object is written to the server, triggers may be fired.
+        Objects can be modified by the triggers at the server.  To keep the  
+        objects in the object cache being coherent with the database, the
+        clients can free or refresh the objects in the cache. 
+
+        This function will return an error for transient objects and values.
+        
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------ OCIObjectRefresh ---------------------------------*/
+sword OCIObjectRefresh(    OCIEnv *env, OCIError *err, dvoid *object    );
+/*
+   NAME: OCIObjectRefresh - OCI refresh a persistent object
+   PARAMETERS:
+        env    (IN/OUT) - OCI environment handle initialized in object mode
+        err    (IN/OUT) - error handle. If there is an error, it is
+                          recorded in 'err' and this function returns 
+                          OCI_ERROR.  The error recorded in 'err' can be 
+                          retrieved by calling OCIErrorGet().
+        object     (IN) - pointer to the persistent object 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+   DESCRIPTION:
+        This function refreshes an unmarked object with data retrieved from the
+        latest snapshot in the server. An object should be refreshed when the 
+        objects in the cache are inconsistent with the objects at 
+        the server:
+        1) When an object is flushed to the server, triggers can be fired to
+           modify more objects in the server.  The same objects (modified by 
+           the triggers) in the object cache become obsolete.
+        2) When the user issues a SQL or executes a PL/SQL procedure to modify
+           any object in the server, the same object in the cache becomes
+           obsolete.
+
+        The object that is refreshed will be 'replaced-in-place'. When an
+        object is 'replaced-in-place', the top level memory of the object will 
+        be reused so that new data can be loaded into the same memory address. 
+        The top level memory of the null structre is also reused. Unlike the
+        top level memory chunk, the secondary memory chunks may be resized and
+        reallocated.  The client should be careful when holding onto a pointer 
+        to the secondary memory chunk (e.g. assigning the address of a 
+        secondary memory to a local variable), since this pointer can become 
+        invalid after the object is refreshed.
+
+        The object state will be modified as followed after being refreshed: 
+          - existent : set to appropriate value
+          - pinned   : unchanged 
+          - allocation duration : unchanged 
+          - pin duration : unchanged 
+        
+        This function is an no-op for transient objects or values.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectCopy --------------------------------*/
+sword OCIObjectCopy(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                        dvoid *source, dvoid *null_source,
+                        dvoid *target, dvoid *null_target, OCIType *tdo, 
+                        OCIDuration duration, ub1 option    );
+/*
+   NAME: OCIObjectCopy - OCI copy one instance to another
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        svc         (IN) - OCI service context handle
+        source      (IN) - pointer to the source instance 
+        null_source (IN) - pointer to the null structure of the source
+        target      (IN) - pointer to the target instance
+        null_target (IN) - pointer to the null structure of the target 
+        tdo         (IN) - the TDO for both source and target
+        duration    (IN) - allocation duration of the target memory
+        option      (IN) - specify the copy option:
+                        OROOCOSFN - Set Reference to Null. All references
+                        in the source will not be copied to the target. The
+                        references in the target are set to null. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - If source or target is referenceable, it must be pinned.
+        - The target or the containing instance of the target must be already
+          be instantiated (e.g. created by OCIObjectNew()).
+        - The source and target instances must be of the same type. If the
+          source and target are located in a different databases, then the
+          same type must exist in both databases.
+   DESCRIPTION:
+        This function copies the contents of the 'source' instance to the
+        'target' instance. This function performs a deep-copy such that the 
+        data that is copied/duplicated include:
+        a) all the top level attributes (see the exceptions below)
+        b) all the secondary memory (of the source) that is reachable from the
+           top level attributes.
+        c) the null structure of the instance
+
+        Memory is allocated with the specified allocation duration. 
+
+        Certain data items are not copied: 
+        a) If the option OCI_OBJECTCOPY_NOREF is specified, then all references
+           in the source are not copied. Instead, the references in the target
+           are set to null.
+        b) If the attribute is a LOB, then it is set to null.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCIObjectGetTypeRef --------------------------*/
+sword OCIObjectGetTypeRef(    OCIEnv *env, OCIError *err, dvoid *instance, 
+                              OCIRef *type_ref    );
+/*
+   NAME: OCIObjectGetTypeRef - get the type reference of a standalone object
+   PARAMETERS:
+        env   (IN/OUT) - OCI environment handle initialized in object mode
+        err   (IN/OUT) - error handle. If there is an error, it is
+                         recorded in 'err' and this function returns 
+                         OCI_ERROR.  The error recorded in 'err' can be 
+                         retrieved by calling OCIErrorGet().
+        instance  (IN) - pointer to an standalone instance 
+        type_ref (OUT) - reference to the type of the object.  The reference 
+                         must already be allocated.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - If the object is referenceable, the specified object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function returns a reference to the TDO of a standalone instance. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectGetObjectRef -------------------------*/
+sword OCIObjectGetObjectRef(    OCIEnv *env, OCIError *err, dvoid *object, 
+                                OCIRef *object_ref    );
+/*
+   NAME: OCIObjectGetObjectRef - OCI get the object reference of an 
+                                 referenceable object
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        object      (IN) - pointer to a persistent object
+        object_ref (OUT) - reference of the given object. The reference must 
+                           already be allocated.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function returns a reference to the given object.  It returns an 
+        error for values. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectMakeObjectRef -----------------------*/
+sword OCIObjectMakeObjectRef(    OCIEnv *env, OCIError *err, 
+                                 CONST OCISvcCtx *svc, dvoid * table,
+                                 dvoid **values, ub4 array_len, 
+                                 OCIRef *object_ref    );
+/*
+   NAME: OCIObjectMakeObjectRef - OCI Create an object reference to a 
+                                 referenceable object.
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        svc         (IN) - the service context
+        table       (IN) - A pointer to the table object (must be pinned)
+        attrlist    (IN) - A list of values (OCI type values) from which
+                           the ref is to be created.
+        attrcnt     (IN)  - The length of the attrlist array. 
+        object_ref (OUT) - reference of the given object. The reference must 
+                           already be allocated. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified table object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function creates a reference given the values that make up the 
+        reference and also a pointer to the table object. 
+        Based on the table's OID property, whether it is a pk based OID or
+        a system generated OID, the function creates a sys-generated REF or
+        a pk based REF.
+        In case of system generated REFs pass in a OCIRaw which is 16 bytes
+        long contatining the sys generated OID.
+        In case of PK refs pass in the OCI equivalent for numbers, chars etc..
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCIObjectGetPrimaryKeyTypeRef --------------- */ 
+sword OCIObjectGetPrimaryKeyTypeRef( OCIEnv *env, OCIError *err,
+                                     CONST OCISvcCtx *svc, dvoid *table, 
+                                     OCIRef *type_ref );
+/*
+   NAME: OCIObjectGetPrimaryKeyTypeRef - OCI get the REF to the pk OID type 
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        svc     (IN)     - the service context 
+        table   (IN)     - pointer to the table object
+        type_ref   (OUT) - reference of the pk type. The reference must 
+                           already be allocated.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The specified table object must be pinned.
+        - The reference must already be allocated.
+   DESCRIPTION:
+        This function returns a reference to the pk type.  It returns an 
+        error for values.  If the table is not a Pk oid table/view, then
+        it returns error.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*-------------------------- OCIObjectGetInd --------------------------------*/
+sword OCIObjectGetInd(    OCIEnv *env, OCIError *err, dvoid *instance, 
+                          dvoid **null_struct    );
+/*
+   NAME: OCIObjectGetInd - OCI get the null structure of a standalone object  
+   PARAMETERS:
+        env     (IN/OUT) - OCI environment handle initialized in object mode
+        err     (IN/OUT) - error handle. If there is an error, it is
+                           recorded in 'err' and this function returns 
+                           OCI_ERROR.  The error recorded in 'err' can be 
+                           retrieved by calling OCIErrorGet().
+        instance      (IN) - pointer to the instance 
+        null_struct (OUT) - null structure 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The object must be standalone.
+        - If the object is referenceable, the specified object must be pinned.
+   DESCRIPTION:
+        This function returns the null structure of an instance. This function
+        will allocate the top level memory of the null structure if it is not
+        already allocated. If an null structure cannot be allocated for the 
+        instance, then an error is returned. This function only works for 
+        ADT or row type instance. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------- OCIObjectExists --------------------------------*/
+sword OCIObjectExists(OCIEnv *env, OCIError *err, dvoid *ins, boolean *exist); 
+/*
+   NAME: OCIObjectExist - OCI checks if the object exists 
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns 
+                             OCI_ERROR.  The error recorded in 'err' can be 
+                             retrieved by calling OCIErrorGet().
+        ins           (IN) - pointer to an instance 
+        exist        (OUT) - return TRUE if the object exists
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The object must be standalone.
+        - if object is a referenceable, it must be pinned.
+   DESCRIPTION:
+        This function returns the existence of an instance. If the instance
+        is a value, this function always returns TRUE.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------- OCIObjectGetProperty ---------------------------*/
+sword OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, CONST dvoid *obj, 
+                           OCIObjectPropId propertyId,
+                           dvoid *property, ub4 *size );
+/*
+   NAME: OCIObjectGetProperty - OCIObject Get Property of given object
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns
+                             OCI_ERROR.  The error recorded in 'err' can be
+                             retrieved by calling OCIErrorGet().
+        obj           (IN) - object whose property is returned
+        propertyId    (IN) - id which identifies the desired property
+        property     (OUT) - buffer into which the desired property is
+                             copied
+        size      (IN/OUT) - on input specifies the size of the property buffer
+                             passed by caller, on output will contain the 
+                             size in bytes of the property returned.
+                             This parameter is required for string type 
+                             properties only (e.g OCI_OBJECTPROP_SCHEMA,
+                             OCI_OBJECTPROP_TABLE). For non-string
+                             properties this parameter is ignored since
+                             the size is fixed.
+   DESCRIPTION:
+        This function returns the specified property of the object.
+        The desired property is identified by 'propertyId'. The property
+        value is copied into 'property' and for string typed properties
+        the string size is returned via 'size'. 
+        
+        Objects are classified as persistent, transient and value
+        depending upon the lifetime and referenceability of the object.
+        Some of the properties are applicable only to persistent
+        objects and some others only apply to persistent and 
+        transient objects. An error is returned if the user tries to 
+        get a property which in not applicable to the given object. 
+        To avoid such an error, the user should first check whether
+        the object is persistent or transient or value 
+        (OCI_OBJECTPROP_LIFETIME property) and then appropriately
+        query for other properties.
+
+        The different property ids and the corresponding type of 
+        'property' argument is given below.
+
+          OCI_OBJECTPROP_LIFETIME 
+            This identifies whether the given object is a persistent
+            object (OCI_OBJECT_PERSISTENT) or a 
+            transient object (OCI_OBJECT_TRANSIENT) or a
+            value instance (OCI_OBJECT_VALUE).
+            'property' argument must be a pointer to a variable of 
+            type OCIObjectLifetime.
+            
+          OCI_OBJECTPROP_SCHEMA
+            This returns the schema name of the table in which the 
+            object exists. An error is returned if the given object 
+            points to a transient instance or a value. If the input 
+            buffer is not big enough to hold the schema name an error 
+            is returned, the error message will communicate the 
+            required size. Upon success, the size of the returned 
+            schema name in bytes is returned via 'size'.
+            'property' argument must be an array of type text and 'size'
+            should be set to size of array in bytes by the caller.
+
+          OCI_OBJECTPROP_TABLE
+            This returns the table name in which the object exists. An 
+            error is returned if the given object points to a 
+            transient instance or a value. If the input buffer is not 
+            big enough to hold the table name an error is returned, 
+            the error message will communicate the required size. Upon 
+            success, the size of the returned table name in bytes is 
+            returned via 'size'. 'property' argument must be an array 
+            of type text and 'size' should be set to size of array in 
+            bytes by the caller.
+            
+          OCI_OBJECTPROP_PIN_DURATION
+            This returns the pin duration of the object.
+            An error is returned if the given object points to a value 
+            instance. Valid pin durations are: OCI_DURATION_SESSION and
+            OCI_DURATION_TRANS.
+            'property' argument must be a pointer to a variable of type 
+            OCIDuration.
+            
+          OCI_OBJECTPROP_ALLOC_DURATION
+            This returns the allocation duration of the object.
+            Valid allocation durations are: OCI_DURATION_SESSION and
+            OCI_DURATION_TRANS.
+            'property' argument must be a pointer to a variable of type 
+            OCIDuration.
+            
+          OCI_OBJECTPROP_LOCK
+            This returns the lock status of the 
+            object. The possible lock status is enumerated by OCILockOpt.
+            An error is returned if the given object points to a transient
+            or value instance.
+            'property' argument must be a pointer to a variable of 
+            type OCILockOpt.
+            Note, the lock status of an object can also be retrieved by
+            calling OCIObjectIsLocked().
+
+          OCI_OBJECTPROP_MARKSTATUS
+            This returns the status flag which indicates whether the
+            object is a new object, updated object and/or deleted object.
+            The following macros can be used to test the mark status
+            flag:
+
+              OCI_OBJECT_IS_UPDATED(flag)
+              OCI_OBJECT_IS_DELETED(flag)
+              OCI_OBJECT_IS_NEW(flag)
+              OCI_OBJECT_IS_DIRTY(flag)
+
+            An object is dirty if it is a new object or marked deleted or 
+            marked updated.
+            An error is returned if the given object points to a transient
+            or value instance. 'property' argument must be of type 
+            OCIObjectMarkStatus.
+            
+          OCI_OBJECTPROP_VIEW
+            This identifies whether the specified object is a view object
+            or not. If property value returned is TRUE, it indicates the
+            object is a view otherwise it is not.
+            'property' argument must be of type boolean.
+
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR. Possible errors are TBD
+ */
+
+/*---------------------------- OCIObjectIsLocked --------------------------*/
+sword OCIObjectIsLocked(    OCIEnv *env, OCIError *err, dvoid *ins,
+                              boolean *lock);
+/*
+   NAME: OCIObjectIsLocked - OCI get the lock status of a standalone object
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns
+                             OCI_ERROR.  The error recorded in 'err' can be
+                             retrieved by calling OCIErrorGet().
+        ins           (IN) - pointer to an instance
+        lock         (OUT) - return value for the lock status.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - If the object is referenceable, the specified object must be pinned.
+   DESCRIPTION:
+        This function returns the lock status of an instance. If the instance
+        is a value, this function always returns FALSE.
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*------------------------- OCIObjectIsDirty ------------------------------*/
+sword OCIObjectIsDirty(    OCIEnv *env, OCIError *err, dvoid *ins,
+                           boolean *dirty);
+/*
+   NAME: OCIObjectIsDirty - OCI get the dirty status of a standalone object
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns
+                             OCI_ERROR.  The error recorded in 'err' can be
+                             retrieved by calling OCIErrorGet().
+        ins           (IN) - pointer to an instance
+        dirty        (OUT) - return value for the dirty status.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+        - The instance must be standalone.
+        - if instance is an object, the instance must be pinned.
+   DESCRIPTION:
+        This function returns the dirty status of an instance. If the instance
+        is a value, this function always returns FALSE.
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/*--------------------------- OCIObjectPinTable -----------------------------*/
+sword OCIObjectPinTable(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                  CONST oratext *schema_name, 
+                  ub4 s_n_length, CONST oratext *object_name, ub4 o_n_length, 
+                  CONST OCIRef *scope_obj_ref, OCIDuration pin_duration, 
+                  dvoid** object    );
+/*
+   NAME: OCIObjectPinTable - OCI get table object 
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns 
+                             OCI_ERROR.  The error recorded in 'err' can be 
+                             retrieved by calling OCIErrorGet().
+        svc                     (IN) - OCI service context handle
+        schema_name   (IN, optional) - schema name of the table 
+        s_n_length    (IN, optional) - length of the schema name
+        object_name   (IN) - name of the table 
+        o_n_length    (IN) - length of the table name
+        scope_obj_ref (IN, optional) - reference of the scoping object
+        pin_duration  (IN) - pin duration. See description in OCIObjectPin(). 
+        object       (OUT) - the pinned table object
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function pin a table object with the specified pin duration. 
+        The client can unpin the object by calling OCIObjectUnpin(). See 
+        OCIObjectPin() and OCIObjectUnpin() for more information about pinning
+        and unpinning. 
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*------------------------- OCIObjectArrayPin -------------------------------*/
+sword OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array, 
+                  ub4 array_size, OCIComplexObject **cor_array,
+                  ub4 cor_array_size, OCIPinOpt pin_option, 
+                  OCIDuration pin_duration, OCILockOpt lock, 
+                  dvoid **obj_array, ub4 *pos    );
+/*
+   NAME: OCIObjectArrayPin - ORIO array pin 
+   PARAMETERS:
+        env       (IN/OUT) - OCI environment handle initialized in object mode
+        err       (IN/OUT) - error handle. If there is an error, it is
+                             recorded in 'err' and this function returns 
+                             OCI_ERROR.  The error recorded in 'err' can be 
+                             retrieved by calling OCIErrorGet().
+        ref_array     (IN) - array of references to be pinned 
+        array_size    (IN) - number of elements in the array of references 
+        pin_option    (IN) - pin option. See OCIObjectPin().
+        pin_duration  (IN) - pin duration. See OCIObjectPin(). 
+        lock_option   (IN) - lock option. See OCIObjectPin().
+        obj_array    (OUT) - If this argument is not NULL, the pinned objects 
+                             will be returned in the array. The user must 
+                             allocate this array with element type being 
+                             'dvoid *'. The size of this array is identical to
+                             'array'. 
+        pos          (OUT) - If there is an error, this argument will contain
+                             the element that is causing the error.  Note that
+                             this argument is set to 1 for the first element in
+                             the ref_array. 
+   REQUIRE:
+        - a valid OCI environment handle must be given.
+        - If 'obj_array' is not NULL, then it must already be allocated and
+             the size of 'obj_array' is 'array_size'. 
+   DESCRIPTION:
+        This function pin an array of references.  All the pinned objects are 
+        retrieved from the database in one network roundtrip.  If the user 
+        specifies an output array ('obj_array'), then the address of the 
+        pinned objects will be assigned to the elements in the array. See
+        OCIObjectPin() for more information about pinning.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------------------------------------------------------*/
+/*                           HEAP/CACHE OPERATIONS                           */
+/*---------------------------------------------------------------------------*/
+
+/*--------------------------- OCICacheFlush ---------------------------------*/
+sword OCICacheFlush(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                  dvoid *context, OCIRef *(*get)(dvoid *context, ub1 *last),
+                  OCIRef **ref  );
+/*
+   NAME: OCICacheFlush - OCI flush persistent objects 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                      recorded in 'err' and this function returns 
+                      OCI_ERROR.  The error recorded in 'err' can be 
+                      retrieved by calling OCIErrorGet().
+        svc      (IN) [optional] - OCI service context.  If null pointer is
+                      specified, then the dirty objects in all connections
+                      will be flushed.
+        context  (IN) [optional] - specifies an user context that is an 
+                      argument to the client callback function 'get'. This 
+                      parameter is set to NULL if there is no user context.
+        get      (IN) [optional] - an client-defined function which acts an 
+                      iterator to retrieve a batch of dirty objects that need 
+                      to be flushed. If the function is not NULL, this function
+                      will be called to get a reference of a dirty object.  
+                      This is repeated until a null reference is returned by 
+                      the client function or the parameter 'last' is set to 
+                      TRUE. The parameter 'context' is passed to get() 
+                      for each invocation of the client function.  This 
+                      parameter should be NULL if user callback is not given.
+                      If the object that is returned by the client function is
+                      not a dirtied persistent object, the object is ignored.
+                      All the objects that are returned from the client
+                      function must be from newed or pinned the same service 
+                      context, otherwise, an error is signalled. Note that the 
+                      returned objects are flushed in the order in which they
+                      are marked dirty.
+        ref     (OUT) [optional] - if there is an error in flushing the 
+                      objects, (*ref) will point to the object that
+                      is causing the error.  If 'ref' is NULL, then the object 
+                      will not be returned.  If '*ref' is NULL, then a 
+                      reference will be allocated and set to point to the 
+                      object.  If '*ref' is not NULL, then the reference of
+                      the object is copied into the given space. If the
+                      error is not caused by any of the dirtied object,
+                      the given ref is initalized to be a NULL reference
+                      (OCIRefIsNull(*ref) is TRUE).
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function flushes the modified persistent objects from the 
+        environment heap to the server. The objects are flushed in the order 
+        that they are marked updated or deleted. 
+
+        See OCIObjectFlush() for more information about flushing.
+
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*--------------------------- OCICacheRefresh -------------------------------*/
+sword OCICacheRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+                  OCIRefreshOpt option, dvoid *context,
+                  OCIRef *(*get)(dvoid *context), OCIRef **ref);
+/*
+   NAME: OCICacheRefresh - OCI ReFreSh persistent objects 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns 
+                       OCI_ERROR.  The error recorded in 'err' can be 
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context.  If null pointer is
+                      specified, then the persistent objects in all connections
+                      will be refreshed. 
+        option   (IN) [optional] - if OCI_REFRESH_LOAD is specified, all
+                      objects that is loaded within the transaction are
+                      refreshed. If the option is OCI_REFERSH_LOAD and the
+                      parameter 'get' is not NULL, this function will ignore
+                      the parameter. 
+        context  (IN) [optional] - specifies an user context that is an 
+                      argument to the client callback function 'get'. This 
+                      parameter is set to NULL if there is no user context.
+        get      (IN) [optional] - an client-defined function which acts an 
+                      iterator to retrieve a batch of objects that need to be
+                      refreshed. If the function is not NULL, this function
+                      will be called to get a reference of an object.  If 
+                      the reference is not NULL, then the object will be 
+                      refreshed.  These steps are repeated until a null 
+                      reference is returned by this function.  The parameter
+                      'context' is passed to get() for each invocation of the
+                      client function.  This parameter should be NULL if user 
+                      callback is not given.
+        ref     (OUT) [optional] - if there is an error in refreshing the
+                      objects, (*ref) will point to the object that
+                      is causing the error.  If 'ref' is NULL, then the object
+                      will not be returned.  If '*ref' is NULL, then a
+                      reference will be allocated and set to point to the
+                      object.  If '*ref' is not NULL, then the reference of
+                      the object is copied into the given space. If the
+                      error is not caused by any of the object,
+                      the given ref is initalized to be a NULL reference
+                      (OCIRefIsNull(*ref) is TRUE).
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function refreshes all pinned persistent objects. All unpinned 
+        persistent objects are freed.  See OCIObjectRefresh() for more 
+        information about refreshing.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*---------------------------- OCICacheUnpin --------------------------------*/
+sword OCICacheUnpin(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc    );
+/*
+   NAME: OCICacheUnpin - OCI UNPin objects 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns 
+                       OCI_ERROR.  The error recorded in 'err' can be 
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context. If null pointer is
+                       specified, then the objects in all connections
+                       will be unpinned.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        If a connection is specified, this function completely unpins the 
+        persistent objects in that connection. Otherwise, all persistent 
+        objects in the heap are completely unpinned. All transient objects in 
+        the heap are also completely unpinned. See OCIObjectUnpin() for more 
+        information about unpinning.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+ */
+
+/*----------------------------- OCICacheFree --------------------------------*/
+sword OCICacheFree(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc    ); 
+/*
+   NAME: OCICacheFree - OCI FREe instances 
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns 
+                       OCI_ERROR.  The error recorded in 'err' can be 
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context. If null pointer is
+                       specified, then the objects in all connections
+                       will be freed.
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        If a connection is specified, this function frees the persistent 
+        objects, transient objects and values allocated for that connection.  
+        Otherwise, all persistent objects, transient objects and values in the 
+        heap are freed. Objects are freed regardless of their pin count.  See 
+        OCIObjectFree() for more information about freeing an instance.
+   RETURNS:
+        if environment handle or error handle is null, return 
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS. 
+        if operation fails, return OCI_ERROR. 
+*/
+
+/*---------------------------- OCICacheUnmark -------------------------------*/
+sword OCICacheUnmark(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc    );
+/*
+   NAME: OCICacheUnmark - OCI Unmark all dirty objects
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                       recorded in 'err' and this function returns
+                       OCI_ERROR.  The error recorded in 'err' can be
+                       retrieved by calling OCIErrorGet().
+        svc     (IN) [optional] - OCI service context. If null pointer is
+                       specified, then the objects in all connections
+                       will be unmarked. 
+   REQUIRES:
+        - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        If a connection is specified, this function unmarks all dirty objects 
+        in that connection.  Otherwise, all dirty objects in the cache are
+        unmarked. See OCIObjectUnmark() for more information about unmarking
+        an object.
+   RETURNS:
+        if environment handle or error handle is null, return
+        OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+
+sword OCIDurationBegin(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                           OCIDuration parent, OCIDuration *dur    );
+/*
+   NAME: OCIDurationBegin - OCI DURATION BEGIN
+   PARAMETERS:
+        env  (IN/OUT) - OCI environment handle initialized in object mode
+                        This should be passed NULL, when cartridge services
+                        are to be used.
+        err  (IN/OUT) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                       OCIErrorGet().
+        svc  (IN/OUT) - OCI service handle.  
+        parent   (IN) - parent for the duration to be started.
+        dur     (OUT) - newly created user duration 
+   REQUIRES:
+        - a valid OCI environment handle must be given for non-cartridge
+          services.
+        - For cartridge services, NULL should be given for environment handle
+        - A valid service handle must be given in all cases.
+   DESCRIPTION:
+        This function starts a new user duration.  A user can have multiple
+        active user durations simultaneously. The user durations do not have
+        to be nested.
+ 
+        The object subsystem predefines 3 durations :
+          1) session     - memory allocated with session duration comes from
+                           the UGA heap (OCI_DURATION_SESSION). A session 
+                           duration terminates at the end of the user session.
+          2) transaction - memory allocated with transaction duration comes
+                           from the UGA heap (OCI_DURATION_TRANS). A trans-
+                           action duration terminates at the end of the user
+                           transaction.
+          3) call        - memory allocated with call duration comes from PGA
+                           heap (OCI_DURATION_CALL). A call duration terminates
+                           at the end of the user call.
+ 
+        Each user duration has a parent duration.  A parent duration can be a
+        predefined duration or another user duration.  The relationship between
+        a user duration and its parent duration (child duration) are:
+ 
+         1) An user duration is nested within the parent duration. When its
+             parent duration terminates, the user duration will also terminate.
+         2) The memory allocated with an user duration comes from the heap of
+             its parent duration. For example, if the parent duration of an
+             user duration is call, then the memory allocated with the user
+             duration will also come from the PGA heap.
+
+        This function can be used as both part of cartridge services as well 
+        as without cartridge services.
+        The difference in the function in the case of cartridge and 
+        non-cartridge services is:
+                In case of cartridge services, as descibed above a new user
+        duration is created as a child of the "parent" duration.
+                But when used for non-cartridge purposes, when a pre-defined
+        duration is passed in as parent, it is mapped to the cache duration
+        for that connection (which is created if not already present) and 
+        the new user duration will be child of the cache duration.
+
+   RETURNS:
+        if environment handle and service handle is null or if error 
+        handle is null return OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+
+sword OCIDurationEnd(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                         OCIDuration duration    );
+/*
+   NAME: OCIDurationEnd - OCI DURATION END
+   PARAMETERS:
+        env  (IN/OUT) - OCI environment handle initialized in object mode
+                        This should be passed NULL, when cartridge services
+                        are to be used.
+        err  (IN/OUT) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                       OCIErrorGet().
+        svc  (IN/OUT) - OCI service handle.  
+        dur     (OUT) - a previously created user duration using 
+                        OCIDurationBegin()
+   REQUIRES:
+        - a valid OCI environment handle must be given for non-cartridge
+          services.
+        - For cartridge services, NULL should be given for environment handle
+        - A valid service handle must be given in all cases.
+   DESCRIPTION:
+        This function terminates a user duration.  All memory allocated for
+        this duration is freed.
+
+        This function can be used as both part of cartridge services as well 
+        as without cartridge services.  In both cased, the heap duration
+        is freed and all the allocated memory for that duration is freed.
+        The difference in the function in the case of cartridge and 
+        non-cartridge services is:
+                In case of non-cartridge services, if the duration is pre-
+        defined, the associated cache duration (see OCIDurationBegin())
+        is also terminated and the following is done.
+          1) The child durations are terminated.
+          2) All objects pinned for this duration are unpinned.
+          3) All instances allocated for this duration are freed.
+
+                In case of cartridge services, only the heap duration is
+        freed.  All the context entries allocated for that duration are 
+        freed from the context hash table..
+
+   RETURNS:
+        if environment handle and service handle is null or if error 
+        handle is null return OCI_INVALID_HANDLE.
+        if operation suceeds, return OCI_SUCCESS.
+        if operation fails, return OCI_ERROR.
+ */
+
+/******************************************************************************
+**          DO  NOT  USE  THE  FUNCTIONS  BELOW!                             **
+**          UNSUPPORTED INTERFACE                                            **
+**          WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                      **
+******************************************************************************/
+
+sword OCIDurationGetParent(    OCIEnv *env, OCIError *err, 
+                               OCIDuration duration, OCIDuration *parent    );
+
+sword OCIObjectAlwaysLatest(    OCIEnv *env, OCIError *err, dvoid *object    );
+
+sword OCIObjectNotAlwaysLatest(    OCIEnv *env, OCIError *err, 
+                                   dvoid *object    );
+
+sword OCIObjectFlushRefresh(    OCIEnv *env, OCIError *err, dvoid *object);
+
+sword OCIObjectIsLoaded(    OCIEnv *env, OCIError *err, dvoid *ins, 
+                              boolean *load);
+
+sword OCIObjectIsDirtied(    OCIEnv *env, OCIError *err, dvoid *ins,
+                              boolean *dirty);
+
+sword OCICacheGetObjects(       OCIEnv *env, OCIError *err,
+                                CONST OCISvcCtx *svc,
+                                OCIObjectProperty property,
+                                dvoid *client_context,
+                                void (*client_callback)(
+                                    dvoid *client_context,
+                                    dvoid *object  ));
+
+sword OCICacheRegister(      OCIEnv *env, OCIError *err,
+                             OCIObjectEvent event,
+                             dvoid *client_context,
+                             void (*client_callback)(
+                                    dvoid *client_context,
+                                    OCIObjectEvent event,
+                                    dvoid *object));
+
+sword OCICacheFlushRefresh(    OCIEnv *env, OCIError *err, 
+                               CONST OCISvcCtx *svc, dvoid *context,
+                               OCIRef *(*get)(dvoid *context, ub1 *last),
+                               OCIRef **ref    );
+
+sword OCIObjectSetData(OCIEnv *env, OCIError *err, dvoid *obj_hdr, 
+        dvoid *data);
+
+sword OCIObjectGetNewOID(OCIEnv *env, OCIError *err, OCISvcCtx *svc, 
+        ub1 *oid);
+
+
+#endif /* ORI_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/orid.h b/src/terralib/drivers/OracleSpatial/OCI/include/orid.h
new file mode 100644
index 0000000..c78bf96
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/orid.h
@@ -0,0 +1,372 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+  Author:             Tin Nguyen
+  Date:               02/07/94
+  Source documents:   "Functional Specification for C Object Interface, Object
+                       Management Subsystem", "Oracle C Coding Standards
+                       version 2.2", and the header file template
+  Rule sets:          the generic and .h file rule sets
+  Quality status:     not exited
+  Identification tag: [ one or more letters to identify the .h file ] 
+  Revision code:      [ date of the last revision of the .h file ]
+
+  Note to the user of this header file:
+
+    Anything in this header file that is marked private is not supported and
+    must not be used.  Private sections are included in the header file to 
+    improve internal maintenance.
+
+  NAME
+
+    ORID - Oracle Object Interface for Dynamic Data Access
+
+  DESCRIPTION
+
+    This file contains declarations for C object interface functions including
+    the dynamic object data access operations that allow callers to dynamically
+    access and manipulate objects; these operations include getting and setting
+    attributes of an object.  These dynamic object operations are for accessing
+    and manipulation objects whose types are not known at compile-time.
+
+  RELATED DOCUMENTS
+  
+     Functional Specification for C Object Interface / Object Management System
+
+  PUBLIC FUNCTIONS
+
+    OCIObjectSetAttr - ORID SET attribute value
+    OCIObjectGetAttr - ORID GET attribute value
+
+  PRIVATE FUNCTIONS
+
+    None
+
+  EXAMPLES 
+
+    EXAMPLE 1
+
+    /o
+     o This example illustrates how an interative program can use the dynamic
+     o attribute access to display and modify attributes of an ADT instance.
+     o The interactive program does not know the type of the object at 
+     o compile time.
+     o/
+
+    void display(adt_ref, object, null_struct, names, names_count, 
+                          names_length, indexes, indexes_count)
+    {
+      /o Pin the ADT o/
+      if (OCIObjectPin(env, &adt_ref, OROOPOCUR, OROOPDTRA, OROOLMNON, &adt) 
+            != OROSTASUC)
+         /o error handling code o/ 
+
+      /o 
+       o Call the type manager to obtain all the attributes in the object.
+       o Display the content of each attribute in the ADT instance. If the 
+       o attribute is an array, display each element of the array. If the
+       o attribute is an ADT instance, recursively call this routine to
+       o display the embedded ADT instance.
+       o/ 
+      numAttrs = OCITypeAttrs(env, adt);
+      for (i= 1; i <= numAttrs; i++)
+      {
+         /o get attribute descriptor o/
+         if (ortgabp(env, adt, i, &ado_ref, &ado) != OROSTASUC)
+           /o error handling code o/ 
+
+         /o get attribute name o/
+         names[names_count] = OCITypeElemName(env, ado, 
+                   &names_length[names_count]);
+      
+         /o dynamically get the attr o/
+         if (OCIObjectGetAttr(env, object, null_struct, 0, adt_ref, names, 
+                     names_length, names_count+1, indexes, indexes_count, 0, 
+                     &null, &null_info, &attr) != OROSTASUC)
+            /o error handling code o/  
+
+         /o check if attribute is null o/
+         if (null) continue;
+
+         /o get typecode of attribute o/
+         typecode = OCITypeElemTypeCode(env, ado);
+
+         /o if attribute is a varray, display each element in varray o/
+         if (typecode == OCI_TYPECODE_VARRAY)
+         {
+            /o get the reference to the type of the element of the array o/ 
+            if (OCITypeElemParameterizedTyper(env, ado, &attr_type_ref) 
+               != OROSTASUC)
+               /o error handling code o/ 
+
+            /o get the size of array o/
+            if (orlasiz(env, &attr_type_ref, (orlva *)attr,  
+                         &numElm) != OROSTASUC)
+               /o error handling code o/  
+
+            /o get the typecode of the element of the array o/
+            if (ortty2r(env, attr_type_ref, &typecode) != OROSTASUC)
+               /o error handling code o/  
+
+            /o iterate the array o/
+            for (j=0; j < numElm; j++)
+            {
+              /o get an element in the array o/
+              if (OCIObjectGetAttr(env, attr, null_info, j+1, attr_type_ref,
+                  names, names_length, 0, indexes, 0, 0, &null, &null_info, 
+                  &element) != OROSTASUC)
+                  /o error handling code o/  
+
+              /o check if element is null o/
+              if (null) continue;
+
+              /o if attr is an ADT instance, recursively call this routine o/
+              if (typecode == OCI_TYPECODE_ADT || typecode == 
+                  OCI_TYPECODE_UNNAMEDADT) 
+              {
+                /o display the element as an adt o/
+                display(attr_type_ref, element, null_info, names, lengths, 
+                   0, indexes, 0);
+              }
+      
+              /o if attribute is scalar, print the value to the screen o/
+              else output_to_screen(element, typecode);
+            }
+         }
+
+         /o if attribute is an ADT instance, recursively call this routine o/
+         else if (typecode == OCI_TYPECODE_ADT || typecode == 
+              OCI_TYPECODE_UNNAMEDADT)
+         {
+            /o get the type ref of the attribute o/
+            if (ortgarf(env, ado, &attr_type_ref) != OROSTASUC)
+               /o error handling code o/ 
+
+             display(attr_type_ref, attr, null_info, 0, names, 0, names_length,
+                      indexes, 0);
+         }
+
+         /o if attribute is scalar, print the value to the screen o/
+         else output_to_screen(attr, typecode);
+      }
+    }
+
+    /o ******** main routine *********** o/
+    .... 
+
+    /o 
+     o Allocate the arrays for storing the path expression 
+     o/
+
+    /o get the tdo of type 'long' o/
+    if (orttypget(&env, con, "SYS", sizeof("SYS"), "SINT32", sizeof("SINT32"), 
+          OROOPDSES, &long_ref, &long_tdo) != OROSTASUC)
+          /o error handling code o/
+
+    /o get the tdo of type 'varchar' o/
+    if (orttypget(&env, con, "SYS", sizeof("SYS"), "SQL_VARCHAR2", 
+          sizeof("SQL_VARCHAR2"), OROOPDSES, &vchar_ref, &vchar_tdo) 
+          != OROSTASUC)
+          /o error handling code o/
+
+    /o allocate the varrays for the path expression o/ 
+    if (orlalloc(env, &vchar_ref, MAX_ARR_SIZE, &attr_names) != OROSTASUC)
+       /o error handling code o/ 
+
+    if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_lengths) 
+                != OROSTASUC)
+       /o error handling code o/ 
+
+    if (orlalloc(env, &long_ref, MAX_ARR_SIZE, &attr_name_indexes) 
+                != OROSTASUC)
+       /o error handling code o/ 
+
+    /o 
+     o Get an ADT instance. The ref to the ADT instance can be obtained
+     o by through ORI or OSCI. 
+     o/
+    if (OCIObjectPin(env, &obj_ref, OROOPOCUR, OROOPDTRA, OROOLMUPD, &object) 
+          != OROSTASUC)
+       /o error handling code o/ 
+
+    /o get the null structure of the ADT instance o/
+    if (OCIObjectGetInd(gp, object, &null_struct) != OROSTASUC)
+       /o error handling code o/ 
+
+    /o 
+     o Get the type of the ADT instance
+     o/
+
+    /o find out the type of the ADT instance o/
+    if (oriogto(env, object, &adt_ref) != OROSTASUC)
+       /o error handling code o/ 
+
+    /o display the object o/
+    display(adt_ref, object, null_struct, attr_names, 0, attr_names_lengths,
+                     attr_names_indexes, 0);
+
+    /o After the object is displayed, the program waits for the user to 
+     o respond.  The user modifies the values of an attribute and the
+     o program generates a path expression for the attribute and calls 
+     o OCIObjectSetAttr() to set the value. 
+     o/
+
+    if (OCIObjectSetAttr(env, object, null_struct, adt_ref, 
+                (text **)attr_names, (ub4 *)attr_name_lengths, 
+                attr_names_count, (ub4 *)attr_array_indexes, 
+                attr_array_indexes_count, 
+                (dvoid *)0, FALSE, (dvoid *)value) != OROSTASUC)
+       /o error handling code o/ 
+
+    END OF EXAMPLE 1
+
+  NOTES
+
+    This file has been subsetted to contain only the routines that will
+    be in the first release.
+
+  MODIFIED
+    srseshad   03/12/03  - convert oci public api to ansi
+    aahluwal   06/03/02  - bug 2360115
+    bpalaval   02/09/01  - Change text to oratext.
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    sthakur    09/18/97 -  collection indexing not supported
+    cxcheng    08/05/97 -  fix compile with short names
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    cxcheng    10/17/96 -  final renaming of functions
+    jboonleu   10/07/96 -  beautify with OCI long names
+    cxcheng    10/07/96 -  change short names to long names for readability
+    jboonleu   09/27/96 -  fix lint
+    jwijaya    07/03/96 -  add ANSI prototypes
+    jboonleu   04/13/95 -  new interface
+    jwijaya    10/11/94 -  fix the sccs header and add namespace
+    tanguyen   08/22/94 -  fix example 
+    tanguyen   08/09/94 -  remove Sccsid declaration 
+    tanguyen   07/20/94 -  fix OCIObjectSetAttr and OCIObjectGetAttr to 
+                           use position descriptor 
+    tanguyen   07/18/94 -  change 'object' type to become ptr to object 
+    tanguyen   06/30/94 -  Fix the ORID_ORACLE ifdef 
+    tanguyen   06/27/94 -  update to template format 
+    skotsovo   05/12/94 -  replace ado with attribute position 
+    jweisz     05/11/94 -  test new checkin facility 
+    jwijaya    05/05/94 - orienv/ref/typ -> oroenv/ref/typ
+    jwijaya    02/07/94 - Creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORID_ORACLE
+#define ORID_ORACLE
+
+#ifdef SLSHORTNAME
+
+#define OCIObjectSetAttr oridset
+#define OCIObjectGetAttr oridget
+
+#endif /* SLSHORTNAME */
+
+/*---------------------------------------------------------------------------*/
+/*                           PUBLIC FUNCTIONS                                */
+/*---------------------------------------------------------------------------*/
+
+/*-------------------------- OCIObjectSetAttr ----------------------------*/
+sword OCIObjectSetAttr(    OCIEnv *env, OCIError *err, dvoid *instance, 
+                  dvoid *null_struct, struct OCIType *tdo, 
+                  CONST oratext **names, CONST ub4 *lengths, 
+                  CONST ub4 name_count, CONST ub4 *indexes, 
+                  CONST ub4 index_count, CONST OCIInd null_status, 
+                  CONST dvoid *attr_null_struct, CONST dvoid *attr_value    );
+/*
+   NAME: OCIObjectSetAttr - ORID SET value
+   PARAMETERS:
+        env  (IN) - OCI environment handle initialized in object mode
+        err  (IN) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                        OCIErrorGet().
+        instance    (IN) - pointer to an ADT instance
+        null_struct (IN) - the null structure of the ADT instance or array
+        tdo         (IN) - pointer to the TDO
+        names       (IN) - array of attribute names. This is used to specify
+                           the names of the attributes in the path expression.
+        lengths     (IN) - array of lengths of attribute names.
+        name_count  (IN) - number of element in the array 'names'.
+        indexes     (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
+        index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
+        attr_null_status (IN) - the null status of the attribute if the type of
+                                 attribute is primitive.
+        attr_null_struct (IN) - the null structure of an ADT or collection
+                                 attribute.
+        attr_value       (IN) - pointer to the attribute value.
+   REQUIRES:
+   DESCRIPTION:
+        This function set the attribute of the given object with the given 
+        value.  The position of the attribute is specified as a path 
+        expression which is an array of names and an array of indexes. 
+   RETURNS:
+        one of OROSTA*
+   EXAMPLES:
+        For path expression stanford.cs.stu[5].addr, the arrays will look like
+          names = {"stanford", "cs", "stu", "addr"} 
+          lengths = {8, 2, 3, 4}
+          indexes = {5}
+        
+        Also see the above example.
+ */
+
+/*-------------------------- OCIObjectGetAttr ----------------------------*/
+sword OCIObjectGetAttr(    OCIEnv *env, OCIError *err, dvoid *instance, 
+                  dvoid *null_struct, struct OCIType *tdo, 
+                  CONST oratext **names, CONST ub4 *lengths, 
+                  CONST ub4 name_count, CONST ub4 *indexes, 
+                  CONST ub4 index_count, OCIInd *attr_null_status, 
+                  dvoid **attr_null_struct, dvoid **attr_value, 
+                  struct OCIType **attr_tdo    );
+/*
+   NAME: OCIObjectGetAttr - ORID GET value
+   PARAMETERS:
+        env  (IN) - OCI environment handle initialized in object mode
+        err  (IN) - error handle. If there is an error, it is
+                        recorded in 'err' and this function returns OCI_ERROR.
+                        The error recorded in 'err' can be retrieved by calling
+                        OCIErrorGet().
+        instance    (IN) - pointer to an ADT instance 
+        null_struct (IN) - the null structure of the ADT instance or array
+        tdo         (IN) - pointer to the TDO 
+        names       (IN) - array of attribute names. This is used to specify
+                           the names of the attributes in the path expression.
+        lengths     (IN) - array of lengths of attribute names. 
+        name_count  (IN) - number of element in the array 'names'.
+        indexes     (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4 *)0.
+        index_count (IN) [OPTIONAL] - currently NOT SUPPORTED, pass (ub4)0.
+        attr_null_status (OUT) - the null status of the attribute if the type 
+                                 of attribute is primitive. 
+        attr_null_struct (OUT) - the null structure of an ADT or collection
+                                 attribute.
+        attr_value       (OUT) - pointer to the attribute value.
+        attr_tdo         (OUT) - pointer to the TDO of the attribute.
+   REQUIRES:
+      - a valid OCI environment handle must be given.
+   DESCRIPTION:
+        This function gets a value from an ADT instance or from an array.
+        If the parameter 'instance' points to an ADT instance, then the path
+        expression specifies the location of the attribute in the ADT. 
+        It is assumed that the object is pinned and that the value returned 
+        is valid until the object is unpinned.
+   RETURNS:
+        one of OROSTA*
+   EXAMPLES:
+        See example in OCIObjectSetAttr(). Also see the above example.
+ */
+
+#endif /* ORID_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/orl.h b/src/terralib/drivers/OracleSpatial/OCI/include/orl.h
new file mode 100644
index 0000000..f55d466
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/orl.h
@@ -0,0 +1,3628 @@
+/* Copyright (c) 1993, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+  Author:             Srinath Krishnaswamy
+  Date:               11/24/93
+  Source documents:   "Functional Specification for C Language Mapping of
+                      OTS Types, Object Management Subsystem", "Oracle C
+                      Coding Standards version 2.2", and the header file
+                      template
+  Rule sets:          the generic and .h file rule sets
+  Quality status:     not exited
+  Identification tag: [ one or more letters to identify the .h file ]
+  Revision code:      11/24/93
+ 
+  NAME
+
+    ORL - ORacle's external C Language interface to primitive OTS types
+ 
+  DESCRIPTION
+
+    This header file contains C langauge interface to the OTS primitive
+    types. The interface includes C mapping of OTS primitive types and
+    the prototype of the pre-defined operations on the primitive types.
+ 
+    ***********************************************************************
+    *** NOTE: The OCI functions for objects requires the                ***
+    ***       application to be running in OBJECT mode. That is, during ***
+    ***       process initialization OCIInitialize(), the mode          ***
+    ***       specified should be OBJECT mode.                          ***
+    **                OCIInitialize(OCI_OBJECT, ..);                    ***
+    ***********************************************************************
+
+  RELATED DOCUMENTS
+
+    [1] Krishnaswamy, Srinath and Nguyen, Tin A., "Functional Specification
+        for C Language Mapping of OTS Types, Object Management Subsystem",
+        March 1994.
+    [2] Nguyen, Tin A., "The Open Type System", Oracle Corporation,
+        February 1994.
+    [3] Klein, Jonathan D., "Large Field Management", Oracle Corporation,
+        October 1993.
+ 
+  PUBLIC FUNCTIONS
+ 
+    OCI - OCI functions to manipulate Oracle Number, float and decimal
+      ARITHMETIC
+        OCINumberInc - OCINumber INCrement (optimized)
+        OCINumberDec - OCINumber DECrement (optimized)
+        OCINumberAdd - OCINumber ADD numbers
+        OCINumberSub - OCINumber SUBtract numbers
+        OCINumberMul - OCINumber MULtiply numbers
+        OCINumberDiv - OCINumber DIVide numbers
+        OCINumberMod - OCINumber MODulo division
+        OCINumberIntPower - OCINumber integer PoWeR
+        OCINumberShift - OCINumber decimal ShiFT number
+        OCINumberNeg - OCINumber NEGate number
+        OCINumberAbs - OCINumber ABSolute value
+        OCINumberCeil - OCINumber CEiling of number
+        OCINumberFloor - OCINumber FLooR of number
+        OCINumberSqrt - OCINumber SQuare Root of number
+        OCINumberSign - OCINumber get SIGN of number
+      NATIVE TYPE CONVERSION
+        OCINumberToInt  - OCINumber convert number TO machine-format Integer
+        OCINumberFromInt - OCINumber convert machine-format Integer TO Number
+        OCINumberToReal  - OCINumber convert number TO machine-format Real
+        OCINumberToRealArray  - OCINumber convert array of numbers TO
+                                machine-format Real
+        OCINumberFromReal - OCINumber convert machine-format Real TO Number
+      TEXT STRING CONVERSION
+        OCINumberToText  - OCINumber convert number TO String
+        OCINumberFromText - OCINumber convert String TO Number
+      COMPARISON
+        OCINumberCmp - OCINumber CoMPare numbers
+        OCINumberIsZero - OCINumber comparison with ZERo
+        OCINumberIsInt - OCINumber Is an Integer
+      ASSIGNMENT
+        OCINumberAssign - OCINumber ASsiGn number
+        OCINumberSetZero - OCINumber Set number to Zero value
+        OCINumberSetPi - OCINumber Set number to Pi
+      ROUNDING
+        OCINumberTrunc - OCINumber TRUncate an Oracle number
+        OCINumberRound - OCINumber ROUnd number
+        OCINumberPrec - OCINumber round to Precision digits
+      TRANSCENDENTAL
+        OCINumberSin - OCINumber SINe
+        OCINumberArcSin - OCINumber Arc SINe
+        OCINumberHypSin - OCINumber SiNe Hyperbolic
+        OCINumberCos - OCINumber COSine
+        OCINumberArcCos - OCINumber Arc COSine
+        OCINumberHypCos - OCINumber CoSine Hyperbolic
+        OCINumberTan - OCINumber TANgent
+        OCINumberArcTan - OCINumber Arc TANgent
+        OCINumberArcTan2 - OCINumber Arc TaNgent 2
+        OCINumberHypTan - OCINumber TaNgent Hyperbolic
+        OCINumberPower - OCINumber arbitrary Base EXponentiation
+        OCINumberExp - OCINumber EXPonentiation to base e
+        OCINumberLn  - OCINumber Logarithm Natural
+        OCINumberLog - OCINumber LOGarithm to arbitrary base
+
+    OCIDate - OCI functions to manipulate OCI Date
+      OCIDateToExternal - OCIDate convert date to external form
+      OCIDateFromExternal - OCIDate convert external form of date into OCIDate
+      OCIDateAssign - OCIDate Assignment
+      OCIDateToText  - OCIDate convert date TO String
+      OCIDateFromText - OCIDate convert String TO Date
+      OCIDateZoneToZone - OCIDate convert date from one time 
+                        Zone TO another Zone
+      OCIDateCompare - OCIDate CoMPare dates
+      OCIDateAddMonths - OCIDate ADd or subtract Months
+      OCIDateAddDays - OCIDate ADd or subtract Days
+      OCIDateLastDay - OCIDate get date of LaST day of month
+      OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+      OCIDateNextDay - OCIDate get date of Next DaY
+      OCIDateCheck - OCIDate CHecK if the given date is valid
+      OCIDateSysDate - OCIDate get current SYStem date and time
+
+    OCIString - OCI String functions to manipulate Variable-length string
+      OCIStringAssign - OCIString Assign string to string
+      OCIStringAssignText - OCIString Assign Text string to string
+      OCIStringResize - OCIString ReSiZe string
+      OCIStringSize - OCIString get String Size
+      OCIStringPtr - OCIString get String PoinTeR
+      OCIStringAllocSize - OCIString get Allocated SiZe
+ 
+    OCIRaw - OCI Raw functions to manipulate variable-length raW
+      OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to raw
+                        (of type OCIRaw*)
+      OCIRawResize - OCIRaw Resize raw
+      OCIRawSize - OCIRaw get Raw Size
+      OCIRawPtr  - OCIRaw get Raw data Pointer
+      OCIRawAllocSize - OCIRaw get Allocated Size
+
+    OCIColl - OCI Collection generic functions. These functions can be 
+                used to manipulate both variable-length array (varray) and 
+                nested table.
+      OCICollSize  - OCIColl return current SIZe of the given collection
+                (in number of elements)
+      OCICollMax  - OCIColl return the MAXimum number of elements in the
+                collection (i.e. upper-bound)
+      OCICollGetElem  - OCIColl GET pointer to the element at the given 
+                position
+      OCICollAssignElem  - OCIColl assign to element at given index
+      OCICollAssign  - OCIColl ASsiGn collection; perform deep-copy of source 
+                collection to target collection
+      OCICollAppend  - OCIColl aPPend the given element to the end of the
+                collection
+      OCICollTrim  - OCIColl trim (delete) the given number of elements 
+                from the end of the collection
+      OCICollIsLocator - OCIColl indicates whether a collection is locator
+                         based or not.
+      OCIIterCreate  - OCIColl Create an ITerator to scan the collection 
+                elements
+      OCIIterDelete  - OCIColl Delete ITerator
+      OCIIterInit  - OCIColl Initialize ITerator to scan the given collection
+      OCIIterGetCurrent - OCIColl Iterator based, get CURrent 
+                collection element
+      OCIIterNext - OCIColl Iterator based, get NeXT collection element
+      OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+ 
+      OCITable - OCI functions to manipulate nested Table. The OCIColl*() and 
+                OCITable*() functions can be used to manipulate nested table
+      OCITableDelete(i) - OCITable if element(i) exists then the element is 
+                marked as deleted else the function returns false. So 
+                delete's create "holes".
+      OCITableExists(i) - OCITable return true iff an element at
+                position i EXIsts
+      OCITableFirst  - OCITable return the smallest value of i for which
+                exists(i) is true.
+      OCITableLast  - OCITable return the largest value of i for which 
+                exists(i) is true.
+      OCITableNext(i) - OCITable return pointer to the smallest position j, 
+                greater than i, such that OCITableExists(j) is true
+      OCITablePrev(i) - OCITable return pointer to the largest position j,
+                less than i, such that OCITableExists(j) is true
+      OCITableSize - OCITable return current SIZe of the given nested table not
+                including deleted elements
+
+    OCIRef - OCI functions to manipulate object Reference
+      OCIRefClear  - OCIRef CLeaR or nullify a ref
+      OCIRefAssign  - OCIRef ASsiGn a ref to another
+      OCIRefIsEqual  - OCIRef compare two refs for EQUality
+      OCIRefIsNull  - OCIRef test if a ref is NULl 
+      OCIRefFromHex  - OCIRef convert a Hexadecimal string TO a Ref
+      OCIRefToHex   - OCIRef convert a ref to a Hexadecimal string
+      OCIRefHexSize  - OCIRef get size of buffer in bytes to store hexadecimal
+                string
+
+  OBSOLETE: to be replaced by functions from oci.h:
+
+    ORLL - ORL functions to manipulate lob Locators
+      orllasg   - ORLL AsiGn one locator to another
+      orllequ   - ORLL compare two locators for EQUality
+      orlliini  - ORLL Is the locator INItialized?
+      orllgsz   - ORLL Get locator SiZe
+      orllgcid  - ORLL Get Character set ID
+
+      NOTE: The following are specific to FILE lobs:
+
+      orllsnm - ORLL Set directory alias and file NaMe in the locator
+      orllgnm - ORLL Get directory alias and file NaMe from the locator
+ 
+  EXAMPLES
+
+    Examples are given in the description of each function where
+    relevant.
+ 
+  NOTES
+
+    This file has been subsetted to contain ONLY the routines that will
+    be in the first release.
+ 
+  QUESTIONS
+     
+  MODIFIED
+    srseshad   03/12/03 - convert oci public api to ansi
+    rpingte    11/21/02 - Add OCICollGetElemArray and OCINumberToRealArray
+    aahluwal   06/03/02 - bug 2360115
+    gayyappa   02/01/02 - fix 2210776 : change Dom to DOM 
+    whe        09/25/01 - add OCIXMLType & OCIDomDocument opaque types
+    bpalaval   02/09/01   - Change text to oratext.
+    rkasamse   09/20/99 -   lint changes
+    whe        09/01/99 -   976457:check __cplusplus for C++ code
+    hsbedi     08/11/99 -   Add macro
+    rxgovind   10/14/98 -  make non exposed calls (OCIRowType etc) private
+    rxgovind   06/09/98 -  update OCIRowTypeCreate
+    nmantrav   05/11/98 -  add OCIRowTypeGetCount
+    rxgovind   03/29/98 -  add OCIRowType and OCIRowData interfaces
+    jwijaya    05/06/98  - add OCICollIsLocator                                
+    rxgovind   03/18/98 -  opaque types: move to kolo.h
+    etucker    02/02/98 -  add comments for Dec and Inc
+    etucker    01/29/98 -  Finish core5 integration
+    rxgovind   11/11/97 -  opaque types
+    etucker    10/28/97 -  add ORLN functions for SDK
+    cxcheng    07/28/97 -  remove OCILobLocator #define
+    skmishra   05/13/97 -  stdcc compatibility changes
+    skrishna   04/25/97 -  rename OCINumber*(): Exp Power TanHyp Zero Init
+                           TanToArc Sqr Truncate and Compare 
+    skotsovo   03/31/97 -  remove OCILobLocatorSize
+    skrishna   03/25/97 -  remove orld2i and orldi2d
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    skrishna   01/06/97 -  update OCITableSize() comments
+    skrishna   12/27/96 -  fix OCIDateGet/OCIDateSet
+    skrishna   12/12/96 -  update OCICollGelElem comments
+    skrishna   11/07/96 -  OCICollGetElem: interface change
+    skrishna   11/05/96 -  add OCIDate Get/Set and OCIDateAssign
+    cxcheng    10/31/96 -  change OCINumberTanHyp to OCINumberHypTan
+    cxcheng    10/30/96 -  #define orll short names to long names
+    dchatter   10/26/96 -  fix some OCI file long names
+    cxcheng    10/24/96 -  remove unnecessary comment in front
+    cxcheng    10/14/96 -  disable long name mapping for LOB functions
+    skrishna   10/13/96 -  continue beautification
+    skotsovo   10/16/96 -  update ocilob names
+    cxcheng    10/09/96 -  add structure members in #define for date/time
+    cxcheng    10/09/96 -  more lint fixes
+    skrishna   10/09/96 -  continue beautification
+    cxcheng    10/09/96 -  more fixes
+    skrishna   10/09/96 -  change fixed-char rep. to orlvstr*
+    jwijaya    10/08/96 -  continue beautification
+    jwijaya    10/07/96 -  beautify
+    cxcheng    10/07/96 -  more changes
+    cxcheng    10/04/96 -  replace short names with long names
+    skrishna   10/01/96 -  orlcsiz, orltsiz: change prototype to take errhdl
+    skrishna   09/23/96 -  fix lint errors
+    skotsovo   09/23/96 -  remove orllmkcur().
+    jwijaya    09/17/96 -  comments on null ref
+    skrishna   09/19/96 -  change orlraw format
+    skotsovo   09/19/96 -  add orlliini and remove orllnul
+    skrishna   08/14/96 -  orlvstr: change format to ub4 followed by text
+    jboonleu   08/06/96 -  update comment
+    skotsovo   08/08/96 -  revert to locators instead of descriptors as input t
+    jboonleu   07/23/96 -  remove orlrcur
+    skrishna   07/06/96 -  add orltsiz
+    skrishna   07/05/96 -  add orld2i and orldi2d
+    jwijaya    07/03/96 -  add ANSI prototypes
+    skrishna   06/27/96 -  document default string format in orlds2d & orld2s
+    skrishna   06/25/96 -  change max date value
+    skrishna   06/18/96 -  modify orld2s() comments
+    skotsovo   06/13/96 -  orll functions take lob descriptors instead of locat
+    rxgovind   06/05/96 -  change prototype of orlrcur to take ocienvh
+    skrishna   05/30/96 -  support collection trimming
+    skrishna   05/30/96 -  remove orlralo/fre and orllalo/fre instead use 
+                           orionew/fre
+    skrishna   05/28/96 -  add orlt*() and modify orla*()
+    skotsovo   05/23/96 -  add orlbl typedefs for pro*c
+    jboonleu   05/14/96 -  add orlrcur
+    rxgovind   05/08/96 -  changes for 3gl callbacks
+    skotsovo   05/01/96 -  in orllasg, no need to alloc orlbl*
+    skrishna   04/21/96 -  merge changes from 960418 object branch into big
+    skrishna   04/17/96 -  rename orlrcpy to orlrasg
+    skrishna   04/12/96 -  add orlr2h and orlrh2r functions
+    skotsovo   04/15/96 -  add fnt to make the lob locator current
+    skrishna   04/08/96 -  change orl*() to take ocienvh* and ocierrh* instead
+                           of oroenv*
+    skotsovo   03/22/96 -  add locator functions
+    skotsovo   03/22/96 -  add locator functions
+    skrishna   02/27/96 -  remove mlslabel interface
+    skotsovo   02/20/96 -  remove orlbty and use dty type instead.
+    skotsovo   02/14/96 -  add text file lobs.
+    skrishna   01/31/96 -  update comments of orln2r, orldchk, orlds2d & orld2s
+    skrishna   01/31/96 -  change orld2s() and orln2s() to return string length
+    skrishna   01/21/96 -  remove old raw interface 
+    skrishna   12/14/95 -  add raw interface
+    skotsovo   01/03/96 -  change LOB offsets and lengths from ub4 to ubig_ora
+                           to support 64 bit machines.
+    skotsovo   10/30/95 -  add orlblsiz() to get lob locator size
+    skrishna   10/24/95 -  move ref functions from ori and update the ref
+                           functions to support variable-length ref
+    cxcheng    10/20/95 -  add more comments on number versions
+    cxcheng    10/13/95 -  add more number functions
+    cxcheng    08/29/95 -  Support for segmented varrays
+    cxcheng    08/18/95 -  modifiy orlmls structure
+    skrishna   06/06/95 -  rename orln, orld, orlvs and orlva to orlnum,
+                           orldat, orlvstr and orlvary respectively 
+    skrishna   11/15/94 -  remove orlnget() function 
+    skrishna   09/20/94 -  modify orldbtw() to return number of days only 
+    skrishna   08/24/94 -  change format string length type from ub4 to ub1 
+    skrishna   07/19/94 -  Rename orln2c & orlnc2n to orln2s & orlns2n 
+    skrishna   06/29/94 -  Add blob interface; add examples 
+    skrishna   06/23/94 -  Update comments and format 
+    skrishna   05/19/94 -  update varray append comments 
+    skrishna    05/05/94 -  Subsetting 
+    skrishna    11/24/93 -  Creation
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORL_ORACLE
+#define ORL_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIArray                        orlvary
+#define OCIColl                         orlcol
+#define OCICollAppend                   orlcapp
+#define OCICollAssign                   orlcasg
+#define OCICollAssignElem               orlcase
+#define OCICollGetElem                  orlcget
+#define OCICollGetElemArray             orlcgeta
+#define OCICollMax                      orlcmax
+#define OCICollSize                     orlcsiz
+#define OCICollTrim                     orlctrm
+#define OCICollIsLocator                orlcilc
+#define OCIDate                         orldat
+#define OCIDateAddDays                  orldadd
+#define OCIDateAddMonths                orldadm
+#define OCIDateCheck                    orldchk
+#define OCIDateCompare                  orldcmp
+#define OCIDateDD                       day_orldat
+#define OCIDateDaysBetween              orldbtw
+#define OCIDateFromText                 orlds2d
+#define OCIDateLastDay                  orldlst
+#define OCIDateMM                       mon_orldat
+#define OCIDateNextDay                  orldndy
+#define OCIDateSysDate                  orldsys
+#define OCIDateTime                     time_orldat
+#define OCIDateYYYY                     gye_orldat
+#define OCIDateZoneToZone               orldz2z
+#define OCIIter                         orlcitr
+#define OCIIterCreate                   orlccit
+#define OCIIterDelete                   orlcdit
+#define OCIIterGetCurrent               orlcicur
+#define OCIIterInit                     orlciit
+#define OCIIterNext                     orlcinxt
+#define OCIIterPrev                     orlciprv
+#define OCINumber                       orlnum
+#define OCINumberAbs                    orlnabs
+#define OCINumberAdd                    orlnadd
+#define OCINumberArcCos                 orlnacos
+#define OCINumberArcSin                 orlnasin
+#define OCINumberArcTan                 orlnatan
+#define OCINumberAssign                 orlnasg
+#define OCINumberCeil                   orlncel
+#define OCINumberCos                    orlncos
+#define OCINumberDiv                    orlndiv
+#define OCINumberPower                  orlnbex
+#define OCINumberFloor                  orlnflr
+#define OCINumberFromInt                orlni2n
+#define OCINumberFromReal               orlnr2n
+#define OCINumberFromText               orlns2n
+#define OCINumberHypCos                 orlncsh
+#define OCINumberHypSin                 orlnsnh
+#define OCINumberSetZero                orlnini
+#define OCINumberSetPi                  orlnspi
+#define OCINumberInc                    orlninc
+#define OCINumberDec                    orlndec
+#define OCINumberIntPower               orlnpwr
+#define OCINumberLn                     orlnln
+#define OCINumberLog                    orlnlog
+#define OCINumberMod                    orlnmod
+#define OCINumberMul                    orlnmul
+#define OCINumberNeg                    orlnneg
+#define OCINumberPart                   orlnpart
+#define OCINumberExp                    orlnexp
+#define OCINumberRound                  orlnrou
+#define OCINumberPrec                   orlnpre
+#define OCINumberShift                  orlnsft
+#define OCINumberSign                   orlnsgn
+#define OCINumberSin                    orlnsin
+#define OCINumberSqrt                   orlnsqr
+#define OCINumberSub                    orlnsub
+#define OCINumberTan                    orlntan
+#define OCINumberHypTan                 orlntnh
+#define OCINumberArcTan2                orlnatn2
+#define OCINumberToInt                  orln2i
+#define OCINumberToReal                 orln2r
+#define OCINumberToRealArray            orln2ra
+#define OCINumberToText                 orln2s
+#define OCINumberTrunc                  orlntru
+#define OCINumberCmp                    orlncmp
+#define OCINumberIsZero                 orlnzer
+#define OCINumberIsInt                  orlnint
+#define OCIRaw                          orlraw
+#define OCIRawAllocSize                 orlwasz
+#define OCIRawAssignBytes               orlwabr
+#define OCIRawAssignRaw                 orlwarr
+#define OCIRawPtr                       orlwgrp
+#define OCIRawResize                    orlwrsz
+#define OCIRawSize                      orlwgsz
+#define OCIRefAssign                    orlrasg
+#define OCIRefClear                     orlrclr
+#define OCIRefFromHex                   orlrh2r
+#define OCIRefHexSize                   orlrhsz
+#define OCIRefIsEqual                   orlrequ
+#define OCIRefIsNull                    orlrnul
+#define OCIRefToHex                     orlr2h
+#define OCIString                       orlvstr
+#define OCIStringAllocSize              orlvasz
+#define OCIStringAssign                 orlvass
+#define OCIStringAssignText             orlvats
+#define OCIStringPtr                    orlvgsp
+#define OCIStringResize                 orlvrsz
+#define OCIStringSize                   orlvgsz
+#define OCITable                        orltbl
+#define OCITableDelete                  orltdel
+#define OCITableExists                  orltexi
+#define OCITableFirst                   orltfst
+#define OCITableLast                    orltlst
+#define OCITableNext                    orltnxt
+#define OCITablePrev                    orltprv
+#define OCITableSize                    orltsiz
+#define OCITime                         orldtm
+#define OCITimeHH                       orldtmhh
+#define OCITimeMI                       orldtmmm
+#define OCITimeSS                       orldtmss
+#define OCI_LOBMODE_READONLY            ORLBMORO
+#define OCI_LOBMODE_READWRITE           ORLBMORW
+
+#endif                                                        /* SLSHORTNAME */
+
+/*****************************************************************************/
+/*                         NUMBER/FLOAT/DECIMAL TYPE                         */
+/*****************************************************************************/
+
+#define OCI_NUMBER_SIZE 22
+struct OCINumber
+{
+  ub1 OCINumberPart[OCI_NUMBER_SIZE];
+};
+typedef struct OCINumber OCINumber;
+
+/* 
+ * OCINumber - OCI Number mapping in c
+ *
+ * The OTS types: NUMBER, NUMERIC, INT, SHORTINT, REAL, DOUBLE PRECISION,
+ * FLOAT and DECIMAL are represented by OCINumber.
+ * The contents of OCINumber is opaque to clients. 
+ *
+ * For binding variables of type OCINumber in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_VNU.
+ */
+
+/*
+   EXAMPLE 
+
+   The following example shows how to manipulate an attribute of type 
+   oracle number.
+  
+     struct person
+     {
+       OCINumber sal;
+     };
+     typedef struct person person;
+
+     OCIError *err;
+     person* joe;
+     person* tom;
+     person* debbie;
+     OCINumber  *joesal;
+     OCINumber  *tomsal;
+     OCINumber *debsal;
+     sword   status;
+     int     inum;
+     double  dnum;
+     OCINumber ornum;
+     char    buffer[21];
+     ub4     buflen;
+     sword   result;
+     
+     /o See oci.h for an example of how to initialize OCIError.
+      o For this example, assume the OCIEnv and OCIError has been
+      o initialized.
+      o/
+
+     /o Pin joe, tom and debbie person objects in the object cache. See ori.h
+      o for an example on pinning objects. For this example, assume that
+      o joe, tom and debbie are pointing to pinned objects.
+      o/
+     joesal = &joe->sal;
+     tomsal = &tom->sal;
+     debsal = &debbie->sal;
+
+     /o initialize joe's salary to be $12,000 o/
+     inum = 12000;
+     status = OCINumberFromInt(err, &inum, sizeof(inum), OCI_NUMBER_SIGNED,
+                               joesal);
+     if (status != OCI_SUCCESS)
+                              /o goto to handle error from OCINumberFromInt o/;
+
+     /o initialize tom's salary to be same as joe o/
+     OCINumberAssign(err, joesal, tomsal);
+
+     /o initialize debbie's salary to be 20% more than joe's o/
+     dnum = 1.2;
+     status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromReal o/;
+     status = OCINumberMul(err, joesal, &ornum, debsal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberMul o/;
+
+     /o give tom a 50% raise o/
+     dnum = 1.5;
+     status = OCINumberFromReal(err, &dnum, sizeof(double), &ornum);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromReal o/;
+     status = OCINumberMul(err, tomsal, &ornum, tomsal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberMul o/;
+
+     /o double joe's salary o/
+     status = OCINumberAdd(err, joesal, joesal, joesal);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberAdd o/;
+
+     /o get joe's salary in integer o/
+     status = OCINumberToInt(err, joesal, sizeof(inum), OCI_NUMBER_SIGNED,
+                             &inum);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToInt o/;
+     /o inum is set to 24000 o/
+
+     /o get debbie's salary in double o/
+     status = OCINumberToReal(err, debsal, sizeof(dnum), &dnum);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToReal o/;
+     /o dnum is set to 14400 o/
+
+     /o print tom's salary as DEM0001`8000.00 o/
+     buflen = sizeof(buffer);
+     status = OCINumberToText(err, tomsal, "C0999G9999D99", 13, 
+                 "NLS_NUMERIC_CHARACTERS='.`' NLS_ISO_CURRENCY='Germany'", 54,
+                 &buflen, buffer);
+     if (status != OCI_SUCCESS)/o goto to handle error from OCINumberToText o/;
+     printf("tom's salary = %s\n", buffer);
+
+     /o compare joe and tom's salary o/
+     status = OCINumberCmp(err, joesal, tomsal, &result);
+     if (status != OCI_SUCCESS)  /o goto to handle error from OCINumberCmp o/;
+     /o result is positive o/
+
+     /o read debbie's new salary from string o/
+     status = OCINumberFromText(err, "48`000.00", 9, "99G999D99", 9,
+                      "NLS_NUMERIC_CHARACTERS='.`'", 27, debsal);
+     if (status != OCI_SUCCESS)
+                            /o goto to handle error from OCINumberFromText o/;
+     /o debbie's salary is now 48000.00 o/
+
+*/
+
+/*----------------------------- OCINumberInc --------------------------------*/
+
+sword OCINumberInc(    OCIError *err, OCINumber *number    );
+/*
+   NAME: OCINumberInc - OCINumber INCrement numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN/OUT) a positive Oracle number to be incremented
+   DESCRIPTION:
+        Increment Oracle number in place. It is assumed that the input is
+        an integer between 0 and 100^21-2. If the is input too large, it will
+        be treated as 0 - the result will be an Oracle number 1. If the input
+        is not a positive integer, the result will be unpredictable.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDec --------------------------------*/
+
+sword OCINumberDec(    OCIError *err, OCINumber *number    );
+/*
+   NAME: OCINumberDec - OCINumber DECrement numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN/OUT) - a positive Oracle number to be decremented
+   DESCRIPTION:
+        Decrement Oracle number in place. It is assumed that the input is an
+        integer between 1 and 100^21-2. If the input is too large, it will be
+        treated as 1 - the result will be an Oracle number 0. If the input is
+        not a positive integer, the result will be unpredictable.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberSetZero -------------------------------*/
+
+void OCINumberSetZero(    OCIError *err, OCINumber *num    );
+/*
+   NAME: OCINumberSetZero - OCINumber Set number to Zero value
+   PARAMETERS:
+        err (IN/OUT) - pointer to OCI error handle
+        num (OUT) - set to zero value
+   DESCRIPTION:
+        Initialize the given number to value 0.
+ */
+
+/*--------------------------- OCINumberSetPi --------------------------------*/
+
+void OCINumberSetPi(    OCIError *err, OCINumber *num    );
+/*
+   NAME: OCINumberSetPi - OCINumber Set number to Pi
+        err (IN/OUT) - pointer to OCI error handle
+        num (OUT) - set to zero value
+   DESCRIPTION:
+        Initialize the given number to value Pi.
+ */
+
+/*----------------------------- OCINumberAdd --------------------------------*/
+
+sword OCINumberAdd(    OCIError *err, CONST OCINumber *number1, 
+                       CONST OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberAdd - OCINumber ADD numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be added
+        result (OUT) - result of adding 'number1' with 'number2'
+   DESCRIPTION:
+        Add 'number1' with 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSub --------------------------------*/
+
+sword OCINumberSub(    OCIError *err, CONST OCINumber *number1, 
+                       CONST OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberSub - OCINumber SUBtract numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - 'number2' subtracted from 'number1'
+        result (OUT) - subtraction result
+   DESCRIPTION:
+        Subtract 'number2' from 'number1' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberMul --------------------------------*/
+
+sword OCINumberMul(    OCIError *err, CONST OCINumber *number1, 
+                       CONST OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberMul - OCINumber MULtiply numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be multiplied
+        result (OUT) - multiplication result
+   DESCRIPTION:
+        Multiply 'number1' with 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberDiv --------------------------------*/
+
+sword OCINumberDiv(    OCIError *err, CONST OCINumber *number1, 
+                       CONST OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberDiv - OCINumber DIVide numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - pointer to the numerator
+        number2 (IN) - pointer to the denominator
+        result (OUT) - division result
+   DESCRIPTION:
+        Divide 'number1' by 'number2' and return result in 'result'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          underflow errorr
+          overflow errorr
+          divide by zero errorr
+ */
+
+/*----------------------------- OCINumberMod --------------------------------*/
+
+sword OCINumberMod(    OCIError *err, CONST OCINumber *number1, 
+                       CONST OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberMod - OCINumber MODulous
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - pointer to the numerator
+        number2 (IN) - pointer to the denominator
+        result (OUT) - remainder of the result
+   DESCRIPTION:
+        Finds the remainder of the division of two Oracle numbers.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          divide by zero errorr
+ */
+
+/*------------------------ OCINumberIntPower --------------------------------*/
+
+sword OCINumberIntPower(    OCIError *err, CONST OCINumber *base,
+                            CONST sword exp, OCINumber *result    );
+/*
+   NAME: OCINumberIntPower - OCINumber takes an arbitary base to an arbitary
+                             integer PoWeR
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the exponentiation
+        exp (IN) - exponent to which the base is to be raised
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Takes an arbitary base to an arbitary integer power.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberShift ---------------------------------*/
+
+sword OCINumberShift(    OCIError *err, CONST OCINumber *number,
+                            CONST sword nDig, OCINumber *result    );
+/*
+   NAME: OCINumberShift - OCINumber multiplies by a power of 10.
+
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Oracle Number to be shifted.
+        nDig   (IN) - number of decimal places to shift.
+        result (OUT) - shift result.
+   DESCRIPTION:
+        Multiplies number by 10^NDig and sets product to the result.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberNeg --------------------------------*/
+
+sword OCINumberNeg(    OCIError *err, CONST OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberNeg - OCINumber NEGate number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be negated
+        result (OUT) - will contain negated value of 'number'
+   DESCRIPTION:
+        Negates an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*------------------------- OCINumberToText ---------------------------------*/
+
+sword OCINumberToText(    OCIError *err, CONST OCINumber *number, 
+                          CONST oratext *fmt, ub4 fmt_length,
+                          CONST oratext *nls_params, ub4 nls_p_length,
+                          ub4 *buf_size, oratext *buf    );
+/*
+   NAME: OCINumberToText - OCINumber convert number TO String 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Oracle number to be converted
+        fmt (IN) - conversion format
+        fmt_length (IN) - length of the 'fmt' parameter
+        nls_params (IN) - nls format specification, if null string 
+                i.e. (oratext *)0, then the default parameters for the 
+                session is used
+        nls_p_length (IN) - length of the 'nls_params' parameter
+        buf_size (IN/OUT) - size of the buffer must be passed as input by
+                the caller, this function will return the length of the 
+                resulting string in bytes via this parameter. The length 
+                does not include the terminating null ('\0').
+        buf (OUT) - buffer into which the converted string is placed. The
+                resulting string is null terminated.
+   DESCRIPTION:
+        Converts the given number to a character string 
+        according to the specified format. Refer to "TO_NUMBER" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format and NLS parameters.
+        The converted number string is stored in the buffer 'buf', up to 
+        a max of '*buf_size' bytes. Length of the resulting string is
+        returned via 'buf_size'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'buf' is null
+          buffer too small
+          invalid format
+          invalid nls format
+          number to text translation for the given format causes overflow
+ */
+
+/*-------------------------- OCINumberFromText ------------------------------*/
+
+sword OCINumberFromText(    OCIError *err, CONST oratext *str, 
+                          ub4 str_length, CONST oratext *fmt, ub4 fmt_length, 
+                          CONST oratext *nls_params, ub4 nls_p_length, 
+                          OCINumber *number    );
+/*
+   NAME: OCINumberFromText - OCINumber convert String TO Number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        str (IN) - input string to be converted to Oracle number
+        str_length (IN) - size of the input string
+        fmt (IN) - conversion format
+        fmt_length (IN) - length of the 'fmt' parameter
+        nls_params (IN) - nls format specification, if null string 
+                i.e. (oratext *)0, then the default parameters for the 
+                session is used
+        nls_p_length (IN) - length of the 'nls_params' parameter
+        number (OUT) - given string converted to number
+   DESCRIPTION:
+        Converts the given string to a number
+        according to the specified format. Refer to "TO_NUMBER" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format and NLS parameters.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'str' is null
+          'str_length' is 0
+          invalid format
+          invalid nls format
+          invalid input string
+ */
+
+/*-------------------------- OCINumberToInt ---------------------------------*/
+
+#define OCI_NUMBER_UNSIGNED 0                        /* Unsigned type -- ubX */
+#define OCI_NUMBER_SIGNED   2                          /* Signed type -- sbX */
+
+sword OCINumberToInt(    OCIError *err, CONST OCINumber *number,
+                         uword rsl_length, uword rsl_flag, dvoid *rsl    );
+/*
+   NAME: OCINumberToInt - OCINumber convert number TO Integer
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be converted
+        rsl_length (IN) - size of the desired result
+        rsl_s_flag (IN) - flag denoting the desired sign of the output; valid 
+                values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+        rsl (OUT) - pointer to space for the result
+   DESCRIPTION:
+        Native type conversion function.
+        Converts the given Oracle number into an xbx (e.g. ub2, ub4, sb2 etc.)
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          integer value of 'number' is too big -- overflow
+          integer value of 'number' is too small -- underflow
+          invalid sign flag value ('rsl_s_flag')
+ */
+
+/*--------------------------- OCINumberFromInt ------------------------------*/
+
+sword OCINumberFromInt(    OCIError *err, CONST dvoid *inum, uword inum_length,
+                         uword inum_s_flag, OCINumber *number    );
+/*
+   NAME: OCINumberFromInt - OCINumber convert Integer TO Number 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        inum (IN) - pointer to the integer to be converted
+        inum_length (IN) - size of the integer
+        inum_s_flag (IN) - flag that designates the sign of the integer; valid 
+                values are OCI_NUMBER_UNSIGNED, OCI_NUMBER_SIGNED
+        number (OUT) - given integer converted to Oracle number
+   DESCRIPTION:
+        Native type conversion function. Converts any Oracle standard
+        machine-native integer type (xbx) to an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'inum' is null
+          integer too BIG -- the number is too large to fit into an Oracle
+                number
+          invalid sign flag value ('inum_s_flag')
+ */
+
+/*------------------------- OCINumberToReal ---------------------------------*/
+
+sword OCINumberToReal(    OCIError *err, CONST OCINumber *number,
+                          uword rsl_length, dvoid *rsl    );
+/*
+   NAME: OCINumberToReal - OCINumber convert number TO Real
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be converted
+        rsl_length (IN) - is the size of the desired result, 
+                sizeof( float | double | long double)
+        rsl (OUT) - pointer to space for storing the result
+   DESCRIPTION:
+        Native type conversion function. Converts an Oracle number into a
+        machine-native real type. This function only converts numbers up to
+        LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+        trailing zeroes. The above constants are defined in float.h
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          'rsl_length' is 0
+ */
+
+/*------------------------- OCINumberToRealArray ----------------------------*/
+
+sword OCINumberToRealArray(  OCIError *err, CONST OCINumber **number,
+                             uword elems, uword rsl_length, dvoid *rsl    );
+/*
+   NAME: OCINumberToRealArray - OCINumber convert array of numbers TO Real
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - Pointer to array of number to be converted
+        elems (IN) - Upper bound of number array
+        rsl_length (IN) - is the size of the desired result,
+                                          sizeof( float | double | long double)
+        rsl (OUT) - pointer to array of space for storing the result
+   DESCRIPTION:
+        Native type conversion function. Converts an Oracle number into a
+        machine-native real type. This function only converts numbers up to
+        LDBL_DIG, DBL_DIG, or FLT_DIG digits of precision and removes
+        trailing zeroes. The above constants are defined in float.h
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rsl' is null
+          'rsl_length' is 0
+ */
+
+/*-------------------------- OCINumberFromReal ------------------------------*/
+
+sword OCINumberFromReal(    OCIError *err, CONST dvoid *rnum,
+                            uword rnum_length, OCINumber *number    );
+/*
+   NAME: OCINumberFromReal - OCINumber convert Real TO Number 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rnum (IN) - pointer to the floating point number to be converted
+        rnum_length (IN) - size of the desired result, i.e.
+                sizeof({float | double | long double})
+        number (OUT) - given float converted to Oracle number
+   DESCRIPTION:
+        Native type conversion function. Converts a machine-native floating
+        point type to an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'number' or 'rnum' is null
+          'rnum_length' is 0
+ */
+
+/*----------------------------- OCINumberCmp --------------------------------*/
+
+sword OCINumberCmp(    OCIError *err, CONST OCINumber *number1, 
+                       CONST OCINumber *number2, sword *result    );
+/*
+   NAME: OCINumberCmp - OCINumber CoMPare numbers 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1, number2 (IN) - numbers to be compared
+        result (OUT) - 0 if equal, negative if number1 < number2, 
+                positive if number1 > number2 
+   DESCRIPTION:
+        The function OCINumberCmp compares two numbers.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number1' or 'number2' or 'result' is null 
+ */
+
+/*---------------------------- OCINumberSign --------------------------------*/
+
+sword OCINumberSign(    OCIError *err, CONST OCINumber *number,
+                        sword *result    );
+/*
+   NAME: OCINumberSign - OCINumber obtains SiGN of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number whose sign is returned
+        result (OUT) - 0 if number == 0, -1 if number < 0, 
+                1 if number > 0 
+   DESCRIPTION:
+        Obtains sign of an Oracle number
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsZero ------------------------------*/
+
+sword OCINumberIsZero(    OCIError *err, CONST OCINumber *number,
+                          boolean *result    );
+/*
+   NAME: OCINumberIsZero - OCINumber comparison with ZERo
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - numbers to be compared
+        result (OUT) - set to TRUE if equal to zero else FALSE
+   DESCRIPTION:
+        Test if the given number is equal to zero.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*---------------------------- OCINumberIsInt -------------------------------*/
+
+sword OCINumberIsInt(    OCIError *err, CONST OCINumber *number,
+                          boolean *result    );
+/*
+   NAME: OCINumberIsInt - OCINumber Is Integer value.
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number to be tested
+        result (OUT) - set to TRUE if integer value else FALSE
+   DESCRIPTION:
+        Test if the given number is an integer value.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+            'number' or 'result' is null
+ */
+
+/*-------------------------- OCINumberAssign --------------------------------*/
+ 
+sword OCINumberAssign(    OCIError *err, CONST OCINumber *from,
+                          OCINumber *to    );
+/*
+   NAME: OCINumberAssign - OCINumber ASsiGn number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        from (IN) - number to be assigned
+        to (OUT) - number copied into
+   DESCRIPTION:
+        Assign number 'from' to 'to'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'from' or 'to' is null
+ */
+
+/*----------------------------- OCINumberAbs --------------------------------*/
+
+sword OCINumberAbs(    OCIError *err, CONST OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberAbs - OCINumber compute ABSolute value
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the absolue value of the
+                input number
+   DESCRIPTION:
+        Computes the absolute value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*---------------------------- OCINumberCeil --------------------------------*/
+
+sword OCINumberCeil(    OCIError *err, CONST OCINumber *number,
+                        OCINumber *result    );
+/*
+   NAME: OCINumberCeil - OCINumber compute the CEiL value of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the ceil value of the
+                input number
+   DESCRIPTION:
+        Computes the ceil value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberFloor --------------------------------*/
+
+sword OCINumberFloor(    OCIError *err, CONST OCINumber *number, 
+                         OCINumber *result    );
+/*
+   NAME: OCINumberFloor - OCINumber compute the FLooR value of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the floor value of the
+                input number
+   DESCRIPTION:
+        Computes the floor value of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSqrt -------------------------------*/
+
+sword OCINumberSqrt(    OCIError *err, CONST OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberSqrt - OCINumber compute the SQuare Root of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        result (OUT) - output which will contain the square root of the
+                input number
+   DESCRIPTION:
+        Computes the square root of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is negative
+ */
+
+/*--------------------------- OCINumberTrunc --------------------------------*/
+
+sword OCINumberTrunc(    OCIError *err, CONST OCINumber *number, 
+                         sword decplace, OCINumber *result    );
+/*
+   NAME: OCINumberTrunc - OCINumber TRUncate an Oracle number at a 
+                          specified decimal place
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - input number
+        decplace (IN) - number of decimal digits to the right of the 
+                decimal point to truncate at. Negative values are allowed.
+        result (OUT) - output of truncation
+   DESCRIPTION:
+        Truncate an Oracle number at a specified decimal place
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberPower ------------------------------*/
+
+sword OCINumberPower(    OCIError *err, CONST OCINumber *base, 
+                         CONST OCINumber *number, OCINumber *result    );
+/*
+   NAME: OCINumberPower - OCINumber takes an arbitary Base to an 
+                          arbitary Power
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the exponentiation
+        number (IN) - exponent to which the base is to be raised
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Takes an arbitary base to an arbitary power.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberRound --------------------------------*/
+
+sword OCINumberRound(    OCIError *err, CONST OCINumber *number,
+                         sword decplace, OCINumber *result    );
+/*
+   NAME: OCINumberRound - OCINumber ROUnds an Oracle number to a specified 
+                  decimal place
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - round this number and return result in 'result'
+        decplace (IN) - number of decimal digits to the right of the 
+                decimal point to round to. Negative values are allowed.
+        result (OUT) - output of rounding
+   DESCRIPTION:
+        Rounds an Oracle number to a specified decimal place
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*--------------------------- OCINumberPrec ---------------------------------*/
+
+sword OCINumberPrec(    OCIError *err, CONST OCINumber *number,
+                         eword nDigs, OCINumber *result    );
+/*
+   NAME: OCINumberPrec - Rounds an Oracle number to a specified number of
+                         decimal digits.
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - number for which to set precision.
+        nDig   (IN) - number of decimal digits desired in the result.
+        result (OUT) - result.
+   DESCRIPTION:
+        Performs a floating point round with respect to the number
+        of digits.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberSin --------------------------------*/
+
+sword OCINumberSin(    OCIError *err, CONST OCINumber *number,
+                       OCINumber *result    );
+/*
+   NAME: OCINumberSin - OCINumber takes the SINe of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the sine in radians
+        result (OUT) - result of the sine
+   DESCRIPTION:
+        Takes the sine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcSin --------------------------------*/
+
+sword OCINumberArcSin(    OCIError *err, CONST OCINumber *number,
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcSin - OCINumber takes the Arc SINe of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc sine
+        result (OUT) - result of the arc sine in radians
+   DESCRIPTION:
+        Takes the arc sine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypSin --------------------------------*/
+
+sword OCINumberHypSin(    OCIError *err, CONST OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypSin - OCINumber takes the SiNe Hyperbolic of an 
+                           Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the sine hyperbolic
+        result (OUT) - result of the sine hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic sine of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberCos --------------------------------*/
+
+sword OCINumberCos(    OCIError *err, CONST OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberCos - OCINumber takes the COSine of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the cosine in radians
+        result (OUT) - result of the cosine
+   DESCRIPTION:
+        Takes the cosine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcCos --------------------------------*/
+
+sword OCINumberArcCos(    OCIError *err, CONST OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcCos - OCINumber takes the Arc COSine of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc cosine
+        result (OUT) - result of the arc cosine in radians
+   DESCRIPTION:
+        Takes the arc cosine in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is < -1 or 'number' is > 1.
+ */
+
+/*-------------------------- OCINumberHypCos --------------------------------*/
+
+sword OCINumberHypCos(    OCIError *err, CONST OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypCos - OCINumber takes the CoSine Hyperbolic of an 
+                           Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the cosine hyperbolic
+        result (OUT) - result of the cosine hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic cosine of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*----------------------------- OCINumberTan --------------------------------*/
+
+sword OCINumberTan(    OCIError *err, CONST OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberTan - OCINumber takes the TANgent of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the tangent in radians
+        result (OUT) - result of the tangent
+   DESCRIPTION:
+        Takes the tangent in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*-------------------------- OCINumberArcTan --------------------------------*/
+
+sword OCINumberArcTan(    OCIError *err, CONST OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberArcTan - OCINumber takes the Arc TANgent of an Oracle number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the arc tangent
+        result (OUT) - result of the arc tangent in radians
+   DESCRIPTION:
+        Takes the arc tangent in radians of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*------------------------ OCINumberArcTan2 ---------------------------------*/
+
+sword OCINumberArcTan2(    OCIError *err, CONST OCINumber *number1, 
+                           CONST OCINumber *number2, OCINumber *result    );
+/*
+   NAME: OCINumberArcTan2 - OCINumber takes the ATan2 of 2 Oracle numbers
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number1 (IN) - first argument of atan2(y,x) function which 
+                corresponds to 'y' parameter in the function
+        number2 (IN) - second argument of atan2(y,x) function which 
+                corresponds to 'x' parameter in the function
+        result (OUT) - result of the atan2() in radians
+   DESCRIPTION:
+        Takes the atan2(number1, number2).
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number2' is 0
+ */
+
+/*----------------------------- OCINumberHypTan -----------------------------*/
+
+sword OCINumberHypTan(    OCIError *err, CONST OCINumber *number, 
+                          OCINumber *result    );
+/*
+   NAME: OCINumberHypTan - OCINumber takes the TaNgent Hyperbolic of an Oracle
+                           number
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - argument of the tangent hyperbolic
+        result (OUT) - result of the tangent hyperbolic
+   DESCRIPTION:
+        Takes the hyperbolic tangent of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+   NOTES:
+        An Oracle number overflow causes an unpredictable result value.
+ */
+
+/*--------------------------- OCINumberExp ----------------------------------*/
+
+sword OCINumberExp(    OCIError *err, CONST OCINumber *number, 
+                       OCINumber *result    );
+/*
+   NAME: OCINumberExp - OCINumber EXPonential
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - e raised to this Oracle number power
+        result (OUT) - output of exponentiation
+   DESCRIPTION:
+        Raises e to the specified Oracle number power
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+ */
+
+/*----------------------------- OCINumberLn ---------------------------------*/
+
+sword OCINumberLn(    OCIError *err, CONST OCINumber *number, 
+                      OCINumber *result    );
+/*
+   NAME: OCINumberLn - OCINumber Logarithm Natural
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        number (IN) - logarithm of this number is computed
+        result (OUT) - logarithm result
+   DESCRIPTION:
+        Takes the logarithm of the given Oracle number with respect
+        to the given base.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is <= 0
+ */
+
+/*----------------------------- OCINumberLog --------------------------------*/
+
+sword OCINumberLog(    OCIError *err, CONST OCINumber *base, 
+                       CONST OCINumber *number, OCINumber *result    );
+/*
+   NAME: OCINumberLog - OCINumber LOGarithm any base
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        base (IN) - base of the logarithm
+        number (IN) - opearnd
+        result (OUT) - logarithm result
+   DESCRIPTION:
+        Takes the logarithm with the specified base of an Oracle number.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          any of the number arguments is null
+          'number' is <= 0
+          'base' is <= 0
+ */
+
+/*****************************************************************************/
+/*                             ORACLE DATE TYPE                              */
+/*****************************************************************************/
+ 
+struct OCITime
+{
+  ub1 OCITimeHH;                          /* hours; range is 0 <= hours <=23 */
+  ub1 OCITimeMI;                     /* minutes; range is 0 <= minutes <= 59 */
+  ub1 OCITimeSS;                     /* seconds; range is 0 <= seconds <= 59 */
+};
+typedef struct OCITime OCITime;
+
+/* 
+ * OCITime - OCI TiMe portion of date
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetTime/OCIDateSetTime 
+ * to manipulate time portion of OCIDate.
+ */
+
+struct OCIDate
+{
+  sb2 OCIDateYYYY;         /* gregorian year; range is -4712 <= year <= 9999 */
+  ub1 OCIDateMM;                          /* month; range is 1 <= month < 12 */
+  ub1 OCIDateDD;                             /* day; range is 1 <= day <= 31 */
+  OCITime OCIDateTime;                                               /* time */
+};
+typedef struct OCIDate OCIDate;
+
+/* 
+ * OCIDate - OCI oracle Date representation in C
+ *
+ * OCIDate represents the C mapping of Oracle date.
+ *
+ * This structure should be treated as an opaque structure as the format
+ * of this structure may change. Use OCIDateGetDate/OCIDateSetDate
+ * to access/initialize OCIDate.
+ *
+ * For binding variables of type OCIDate in OCI calls (OCIBindByName(),
+ * OCIBindByPos(), and OCIDefineByPos()) use the type code SQLT_ODT.
+ */
+
+/*
+   EXAMPLE 
+
+   The following example shows how to manipulate an attribute of type 
+   oracle date.
+  
+     #define FMT "Month dd, YYYY, HH:MI A.M."
+     #define LANG "American"
+
+     struct person
+     {
+       OCIDate start_date;
+     };
+     typedef struct person person;
+
+     OCIError *err;
+     person *joe;
+     sword status;                                           /o error status o/
+     
+     /o See oci.h for an example of how to initialize OCIError.
+      o For this example, assume the OCIEnv and OCIError has been
+      o initialized.
+      o/
+
+     /o Pin joe person object in the object cache. See ori.h
+      o for an example on pinning objects. For this example, assume that
+      o joe is pointing to the pinned object.
+      o/
+
+     /o set the start date of joe o/
+     OCIDateSetTime(&joe->start_date, 8, 0, 0);
+     OCIDateSetDate(&joe->start_date, 1990, 10, 5); 
+
+     /o check if the date is valid o/
+     uword invalid;
+     if (OCIDateCheck(err, &joe->start_date, &invalid) != OCI_SUCCESS)
+       /o error handling code o/
+     if (invalid)
+       /o error handling code o/
+
+     /o convert date for display purposes o/
+     char str[100];
+     ub4 strlen = sizeof(str);
+     if (OCIDateToText(err, &joe->start_date, FMT, sizeof(FMT)-1, LANG,
+                sizeof(LANG)-1, &strlen, str) != OCI_SUCCESS)
+       /o error handling code o/
+
+ */
+
+/*--------------------------- OCIDateGetTime --------------------------------*/
+/* void OCIDateGetTime(/o_ CONST OCIDate *date, ub1 *hour, ub1 *min, 
+                           ub1 *sec _o/); */
+#define OCIDateGetTime(date, hour, min, sec) \
+  { \
+     *hour = (date)->OCIDateTime.OCITimeHH; \
+     *min = (date)->OCIDateTime.OCITimeMI; \
+     *sec = (date)->OCIDateTime.OCITimeSS; \
+  }
+/*
+   NAME: OCIDateGetTime - OCIDate Get Time portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose time data is retrieved
+        hour (OUT) - hour value returned
+        min (OUT) - minute value returned
+        sec (OUT) - second value returned
+   DESCRIPTION:
+        Return time inforamtion stored in the given date. The time
+        information returned is: hour, minute and seconds.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateGetDate --------------------------------*/
+/* void OCIDateGetDate(/o_ CONST OCIDate *date, sb2 *year, ub1 *month, 
+                           ub1 *day _o/); */
+#define OCIDateGetDate(date, year, month, day) \
+  { \
+     *year = (date)->OCIDateYYYY; \
+     *month = (date)->OCIDateMM; \
+     *day = (date)->OCIDateDD; \
+  }
+/*
+   NAME: OCIDateGetDate - OCIDate Get Date (year, month, day) portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose year, month, day data is retrieved
+        year (OUT) - year value returned
+        month (OUT) - month value returned
+        day (OUT) - day value returned
+   DESCRIPTION:
+        Return year, month, day inforamtion stored in the given date.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateSetTime --------------------------------*/
+/* void OCIDateSetTime(/o_ OCIDate *date, ub1 hour, ub1 min, 
+                           ub1 sec _o/); */
+#define OCIDateSetTime(date, hour, min, sec) \
+  { \
+     (date)->OCIDateTime.OCITimeHH = hour; \
+     (date)->OCIDateTime.OCITimeMI = min; \
+     (date)->OCIDateTime.OCITimeSS = sec; \
+  }
+/*
+   NAME: OCIDateSetTime - OCIDate Set Time portion of date
+   PARAMETERS:
+        date (OUT) - Oracle date whose time data is set
+        hour (IN) - hour value to be set 
+        min (IN) - minute value to be set
+        sec (IN) - second value to be set
+   DESCRIPTION:
+        Set the date with the given time inforamtion.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateSetDate --------------------------------*/
+/* void OCIDateSetDate(/o_ OCIDate *date, sb2 year, ub1 month, ub1 day _o/); */
+#define OCIDateSetDate(date, year, month, day) \
+  { \
+     (date)->OCIDateYYYY = year; \
+     (date)->OCIDateMM = month; \
+     (date)->OCIDateDD = day; \
+  }
+/*
+   NAME: OCIDateSetDate - OCIDate Set Date (year, month, day) portion of date
+   PARAMETERS:
+        date (IN) - Oracle date whose year, month, day data is set
+        year (OUT) - year value to be set
+        month (OUT) - month value to be set
+        day (OUT) - day value to be set
+   DESCRIPTION:
+        Set the date with the given year, month, day inforamtion.
+   RETURNS:
+        NONE
+ */
+
+/*--------------------------- OCIDateAssign ---------------------------------*/
+
+sword OCIDateAssign(    OCIError *err, CONST OCIDate *from, 
+                        OCIDate *to    );
+/*
+   NAME: OCIDateAssign - OCIDate Assignment
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        from (IN) - date to be assigned
+        to (OUT) - lhs of assignment
+   DESCRIPTION:
+        Performs date assignment.
+   RETURNS:
+        OCI_SUCCESS
+ */
+
+/*--------------------------- OCIDateToText ---------------------------------*/
+
+sword OCIDateToText(    OCIError *err, CONST OCIDate *date, 
+                        CONST oratext *fmt, ub1 fmt_length, 
+                        CONST oratext *lang_name, ub4 lang_length, 
+                        ub4 *buf_size, oratext *buf    );
+/*
+   NAME: OCIDateToText - OCIDate convert date TO String 
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - Oracle date to be converted
+        fmt (IN) - conversion format, if null string pointer (oratext*)0, then
+                the date is converted to a character string in the
+                date format "DD-MON-YY".
+        fmt_length (IN) - length of the 'fmt' parameter
+        lang_name (IN) - specifies the language in which the names and 
+                abbreviations of months and days are returned;
+                default language of session is used if 'lang_name' 
+                is null i.e. (oratext *)0
+        lang_length (IN) - length of the 'nls_params' parameter
+        buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+        buf (OUT) - buffer into which the converted string is placed
+   DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+ 
+        An error is reported upon overflow, e.g. trying to convert a number
+        of value 10 using format '9' causes an overflow.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          buffer too small
+          invalid format
+          unknown language
+          overflow error
+ */
+
+/*---------------------------- OCIDateFromText ------------------------------*/
+
+sword OCIDateFromText(    OCIError *err, CONST oratext *date_str, 
+                        ub4 d_str_length, CONST oratext *fmt, ub1 fmt_length, 
+                        CONST oratext *lang_name, ub4 lang_length, 
+                        OCIDate *date    );
+/*
+   NAME: OCIDateFromText - OCIDate convert String TO Date
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date_str (IN) - input string to be converted to Oracle date
+        d_str_length (IN) - size of the input string, if the length is -1
+                then 'date_str' is treated as a null terminated  string
+        fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in 'DD-MON-YY' format.
+        fmt_length (IN) - length of the 'fmt' parameter
+        lang_name (IN) - language in which the names and abbreviations of
+                days and months are specified, if null i.e. (oratext *)0,
+                the default language of session is used, 
+        lang_length (IN) - length of the 'lang_name' parameter
+        date (OUT) - given string converted to date
+   DESCRIPTION:
+        Converts the given string to Oracle date
+        according to the specified format. Refer to "TO_DATE" conversion
+        function described in "Oracle SQL Language Reference Manual" for a
+        description of format.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid format
+          unknown language
+          invalid input string
+          <to be discovered>
+ */
+
+/*----------------------------- OCIDateCompare ------------------------------*/
+
+sword OCIDateCompare(    OCIError *err, CONST OCIDate *date1, 
+                     CONST OCIDate *date2, sword *result    );
+/*
+   NAME: OCIDateCompare - OCIDate CoMPare dates
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1, date2 (IN) - dates to be compared
+        result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+                1 if date1 > date2
+   DESCRIPTION:
+        The function OCIDateCompare compares two dates. It returns -1 if date1 
+        is smaller than date2, 0 if they are equal, and 1 if date1 is greater 
+        than date2.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*------------------------- OCIDateAddMonths --------------------------------*/
+
+sword OCIDateAddMonths(    OCIError *err, CONST OCIDate *date, sb4 num_months,
+                           OCIDate *result    );
+/*
+   NAME: OCIDateAddMonths - OCIDate ADd or subtract Months
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - 'num_months' added or subtracted from 'date'
+        num_months (IN) - number of months to be added or subtracted 
+                (a negative value will be subtracted)
+        result (IN/OUT) - result of adding or subtracting to 'date'
+   DESCRIPTION:
+        The function OCIDateAddDays adds or subtracts num_months from the 
+        date 'date'.
+          If the input 'date' is the last day of a month, then 
+        appropriate adjustments are made to ensure that the output date is 
+        also the last day of the month. For example, Feb. 28 + 1 month =
+        March 31, and November 30 - 3 months = August 31. Otherwise the
+        'result' date has the same day component as 'date'. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateAddDays --------------------------------*/
+
+sword OCIDateAddDays(    OCIError *err, CONST OCIDate *date, sb4 num_days,
+                         OCIDate *result    );
+/*
+   NAME: OCIDateAddDays - OCIDate ADd or subtract Days
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - 'num_days' added or subtracted from 'date'
+        num_days (IN) - number of days to be added or subtracted 
+                (a negative value will be subtracted)
+        result (IN/OUT) - result of adding or subtracting to 'date'
+   DESCRIPTION:
+        The function OCIDateAddDays adds or subtracts num_days from the 
+        date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateLastDay --------------------------------*/
+
+sword OCIDateLastDay(    OCIError *err, CONST OCIDate *date, 
+                         OCIDate *last_day    );
+/*
+   NAME: OCIDateLastDay - OCIDate get date of the LaST day of the month
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - input date
+        last_day (OUT) - last day of the month in date 'date'
+   DESCRIPTION:
+        The function OCIDateLastDay returns the date of the last day of the
+        month in date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*----------------------- OCIDateDaysBetween --------------------------------*/
+
+sword OCIDateDaysBetween(    OCIError *err, CONST OCIDate *date1, 
+                             CONST OCIDate *date2, sb4 *num_days    );
+/*
+   NAME: OCIDateDaysBetween - OCIDate get number of days BeTWeen two dates
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1, date2 (IN) - input dates
+        num_days (OUT) - number of days between date1 and date2
+   DESCRIPTION:
+        The function OCIDateDaysBetween returns the number of days between 
+        date1 and date2. The time is ignored in this computation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          <to be discovered>
+ */
+
+/*------------------------ OCIDateZoneToZone --------------------------------*/
+
+sword OCIDateZoneToZone(    OCIError *err, CONST OCIDate *date1,
+                            CONST oratext *zon1,
+                            ub4 zon1_length, CONST oratext *zon2, 
+                            ub4 zon2_length, OCIDate *date2    );
+/*
+   NAME: OCIDateZoneToZone - OCIDate convert date from one Zone TO another Zone
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date1 (IN) - date to be converted
+        zon1 (IN) - zone of input date
+        zon1_length (IN) - length in bytes of string 'zon1'
+        zon2 (IN) - zone to be converted to
+        zon2_length (IN) - length in bytes of string 'zon2'
+        date2 (OUT) - converted date (in 'zon2')
+   DESCRIPTION:
+        Converts date from one time zone to another. Given date 'date1' 
+        in time zone 'zon1' returns date 'date2' in time zone 'zon2'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invlid date
+          invald input time zone
+          invald output time zone
+          <to be discovered>
+ */
+
+/*--------------------------- OCIDateNextDay --------------------------------*/
+
+sword OCIDateNextDay(    OCIError *err, CONST OCIDate *date, 
+                         CONST oratext *day_p, ub4 day_length, 
+                         OCIDate *next_day    );
+/*
+   NAME: OCIDateNextDay - OCIDate get date of Next DaY
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - returned date should be later than this date
+        day (IN) - first day of week named by this is returned
+        day_length (IN) - length in bytes of string 'day'
+        next_day (OUT) - first day of the week named by 'day' later than 'date'
+   DESCRIPTION:
+        Returns the date of the first day of the
+        week named by 'day' that is later than date 'date'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          invalid date
+          invalid day
+          <to be discovered>
+ */
+
+/*----------------------------- OCIDateCheck --------------------------------*/
+
+/* Listing of error bits used by OCIDateCheck() */
+#define OCI_DATE_INVALID_DAY            0x1                       /* Bad DAy */
+#define OCI_DATE_DAY_BELOW_VALID        0x2   /* Bad DAy Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MONTH          0x4                     /* Bad MOnth */
+#define OCI_DATE_MONTH_BELOW_VALID      0x8 /* Bad MOnth Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_YEAR           0x10                     /* Bad YeaR */
+#define OCI_DATE_YEAR_BELOW_VALID       0x20 /* Bad YeaR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_HOUR           0x40                     /* Bad HouR */
+#define OCI_DATE_HOUR_BELOW_VALID       0x80 /* Bad HouR Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_MINUTE         0x100                  /* Bad MiNute */
+#define OCI_DATE_MINUTE_BELOW_VALID     0x200
+                                           /* Bad MiNute Low/high bit (1=low)*/
+#define OCI_DATE_INVALID_SECOND         0x400                  /* Bad SeCond */
+#define OCI_DATE_SECOND_BELOW_VALID     0x800
+                                           /* bad second Low/high bit (1=low)*/
+#define OCI_DATE_DAY_MISSING_FROM_1582  0x1000
+                                  /* Day is one of those "missing" from 1582 */
+#define OCI_DATE_YEAR_ZERO              0x2000    /* Year may not equal zero */
+#define OCI_DATE_INVALID_FORMAT         0x8000      /* Bad date format input */
+
+sword OCIDateCheck(    OCIError *err, CONST OCIDate *date, uword *valid    );
+/*
+   NAME: OCIDateCheck - OCIDate CHecK if the given date is valid
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        date (IN) - date to be checked
+        valid (OUT) -  returns zero for a valid date, otherwise 
+                the ORed combination of all error bits specified below:
+  
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID  0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+  
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the erroor returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+   DESCRIPTION:
+        Check if the given date is valid.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          'date' and 'valid' pointers are NULL pointers
+ */
+
+/*--------------------------- OCIDateSysDate --------------------------------*/
+
+sword OCIDateSysDate(    OCIError *err, OCIDate *sys_date    );
+/*
+   NAME: OCIDateSysDate - OCIDate get current SYStem date and time
+   PARAMETERS:
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        sys_date (OUT) - current system date and time
+   DESCRIPTION:
+        Returns the current system date and time.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+          <to be discovered>
+ */
+
+/*****************************************************************************/
+/*                  FIXED-LENGTH STRING - CHAR (N)                           */
+/*****************************************************************************/
+
+/*
+ * An ADT attribute declared as "x CHAR(n)" is mapped to "OCIString *x;".
+ * The representation of OCIString * is shown below.
+ */
+
+/*****************************************************************************/
+/*                  VARIABLE-LENGTH STRING                                   */
+/*****************************************************************************/
+
+/*
+ * The variable-length string is represented in C as a pointer to OCIString
+ * structure. The OCIString structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length string.
+ *     
+ * A variable-length string can be declared as:
+ *
+ * OCIString *vstr;
+ *
+ * For binding variables of type OCIString* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_VST.
+ */
+typedef struct OCIString OCIString;
+
+/*-------------------------- OCIStringAssign --------------------------------*/
+ 
+sword OCIStringAssign(    OCIEnv *env, OCIError *err, CONST OCIString *rhs, 
+                          OCIString **lhs    );
+/*
+   NAME: OCIStringAssign - OCIString Assign String to String
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is also OCIString
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+        resized depending upon the size of the 'rhs'. The assigned string is
+        null-terminated. The 'length' field will not include the extra byte
+        needed for null termination.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+ 
+/*---------------------- OCIStringAssignText --------------------------------*/
+ 
+sword OCIStringAssignText(    OCIEnv *env, OCIError *err, CONST oratext *rhs, 
+                              ub4 rhs_len, OCIString **lhs    );
+/*
+   NAME: OCIStringAssignText - OCIString Assign Text string to String
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is a text string
+        rhs_len (IN) - length of the 'rhs' string
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' string to 'lhs' string. The 'lhs' string may be
+        resized depending upon the size of the 'rhs'. The assigned string is
+        null-terminated. The 'length' field will not include the extra byte
+        needed for null termination.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*-------------------------- OCIStringResize --------------------------------*/
+
+sword OCIStringResize(    OCIEnv *env, OCIError *err, ub4 new_size, 
+                          OCIString **str    );
+/*
+   NAME: OCIStringResize - OCIString ReSiZe string memory
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        new_size (IN) - new memory size of the string in bytes
+        str (IN/OUT) - allocated memory for the string is freed from the 
+                OOCI heap
+   DESCRIPTION:
+        This function resizes the memory of the given variable-length string in
+        the object cache. The contents of the string are NOT preserved.
+        This function may allocate the string in a new memory region in
+        which case the original memory occupied by the given string will
+        be freed. If the input string is null (str == NULL), then this
+        function will allocate memory for the string.
+ 
+        If the new_size is 0, then this function frees the memory occupied
+        by 'str' and a null pointer value is returned.
+ 
+        NOTE: The caller must compute 'new_size' taking into account space
+        for the null character ('\0').
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*---------------------------- OCIStringSize --------------------------------*/
+
+ub4 OCIStringSize(    OCIEnv *env, CONST OCIString *vs    );
+/*
+   NAME: OCIStringSize - OCIString Get String siZe
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        vs (IN) - string whose size is returned
+   DESCRIPTION:
+        Return the size of the given string.
+   RETURNS:
+        size of the string in bytes is returned
+ */
+
+/*----------------------------- OCIStringPtr --------------------------------*/
+
+oratext *OCIStringPtr(    OCIEnv *env, CONST OCIString *vs    );
+/*
+   NAME: OCIStringPtr - OCIString Get String Pointer
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        vs (IN) - pointer to the text of this string is returned
+   DESCRIPTION:
+        Return the pointer to the text of the given string.
+   RETURNS:
+        pointer to the text of the string is returned
+ */
+
+/*----------------------- OCIStringAllocSize --------------------------------*/
+ 
+sword OCIStringAllocSize(    OCIEnv *env, OCIError *err, CONST OCIString *vs, 
+                             ub4 *allocsize    );
+/*
+   NAME: OCIStringAllocSize - OCIString get Allocated SiZe of string memory 
+                              in bytes
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        vs (IN) - string whose allocated size in bytes is returned
+        allocsize (OUT) - allocated size of string memory in bytes is returned
+   DESCRIPTION:
+        Return the allocated size of the string memory in bytes. The
+        allocated size is >= actual string size.
+   REQUIRES:
+        vs is a non-null pointer
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR on error
+ */
+
+/*****************************************************************************/
+/*                       VARIABLE-LENGTH RAW                                 */
+/*****************************************************************************/
+
+/*
+ * The variable-length raw is represented in C as a pointer to OCIRaw
+ * structure. The OCIRaw structure is opaque to the user. Functions are
+ * provided to allow the user to manipulate a variable-length raw.
+ *     
+ * A variable-length raw can be declared as:
+ *
+ * OCIRaw *raw;
+ *
+ * For binding variables of type OCIRaw* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the external type code SQLT_LVB.
+ */
+typedef struct OCIRaw OCIRaw;
+
+/*-------------------------- OCIRawAssignRaw --------------------------------*/
+ 
+sword OCIRawAssignRaw(    OCIEnv *env, OCIError *err, CONST OCIRaw *rhs, 
+                          OCIRaw **lhs    );
+/*
+   NAME: OCIRawAssignRaw - OCIRaw Assign Raw (of type OCIRaw*) to
+                   Raw (of type OCIRaw*)
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is also OCIRaw
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+        resized depending upon the size of the 'rhs'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+ 
+/*------------------------ OCIRawAssignBytes --------------------------------*/
+ 
+sword OCIRawAssignBytes(    OCIEnv *env, OCIError *err, CONST ub1 *rhs, 
+                            ub4 rhs_len, OCIRaw **lhs    );
+/*
+   NAME: OCIRawAssignBytes - OCIRaw Assign raw Bytes (of type ub1*) to Raw 
+                   (of type OCIRaw*)
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - RHS of the assignment, the type of rhs is ub1 *
+        rhs_len (IN) - length of the 'rhs' raw
+        lhs (IN/OUT) - LHS of the assignment
+   DESCRIPTION:
+        Assign 'rhs' raw to 'lhs' raw. The 'lhs' raw may be
+        resized depending upon the size of the 'rhs'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*---------------------------- OCIRawResize ---------------------------------*/
+ 
+sword OCIRawResize(    OCIEnv *env, OCIError *err, ub4 new_size, 
+                       OCIRaw **raw    );
+/*
+   NAME: OCIRawResize - OCIRaw ReSiZe memory of variable-length raw
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        new_size (IN) - new size of the raw data in bytes
+        raw (IN) - variable-length raw pointer; the raw is
+                resized to 'new_size'
+   DESCRIPTION:
+        This function resizes the memory of the given variable-length raw in
+        the object cache. 
+        The previous contents of the raw are NOT preserved.
+        This function may allocate the raw in a new memory region in
+        which case the original memory occupied by the given raw will
+        be freed. If the input raw is null (raw == NULL), then this
+        function will allocate memory for the raw data.
+ 
+        If the new_size is 0, then this function frees the memory occupied
+        by 'raw' and a null pointer value is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          out of space error
+ */
+
+/*------------------------------- OCIRawSize --------------------------------*/
+
+ub4 OCIRawSize(    OCIEnv * env, CONST OCIRaw *raw    );
+/*
+   NAME: OCIRawSize - OCIRaw Get Raw siZe
+   PARAMETERS:
+        env (IN)  - pointer to OCI environment handle
+        raw (INT) - raw whose size is returned
+   DESCRIPTION:
+        Return the size of the given raw.
+   RETURNS:
+        size of the raw in bytes is returned
+ */
+
+/*--------------------------------- OCIRawPtr -------------------------------*/
+ub1 *OCIRawPtr(    OCIEnv * env, CONST OCIRaw *raw    );
+/*
+   NAME: OCIRawPtr - OCIRaw Get Raw data Pointer
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        raw (IN) - pointer to the data of this raw is returned
+   DESCRIPTION:
+        Return the pointer to the data of the given raw.
+   RETURNS:
+        pointer to the data of the raw is returned
+ */
+
+/*------------------------------ OCIRawAllocSize ----------------------------*/
+ 
+sword OCIRawAllocSize(    OCIEnv *env, OCIError *err, CONST OCIRaw *raw,
+                          ub4 *allocsize    );
+/*
+   NAME: OCIRawAllocSize - OCIRaw get Allocated SiZe of raw memory in bytes
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        raw (IN) - raw whose allocated size in bytes is returned
+        allocsize (OUT) - allocated size of raw memory in bytes is returned
+   DESCRIPTION:
+        Return the allocated size of the raw memory in bytes. The
+        allocated size is >= actual raw size.
+   REQUIRES:
+        raw is a non-null pointer
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR upon error
+ */
+
+/*****************************************************************************/
+/*                     OBJECT REFERENCE OPERATIONS                           */
+/*****************************************************************************/
+
+/* 
+ * See the definition of OCIRef in oro.h.
+ *
+ * For binding variables of type OCIRef* in OCI calls (OCIBindByName(),
+ * OCIBindByPos() and OCIDefineByPos()) use the code SQLT_REF.
+ * 
+ */
+
+/*---------------------------- OCIRefClear ----------------------------------*/
+void OCIRefClear(    OCIEnv *env, OCIRef *ref    );
+/*
+   NAME: OCIRefClear - OCIRef CLeaR or nullify a ref
+   PARAMETERS:
+        env (IN)     - pointer to OCI environment handle
+        ref (IN/OUT) - ref to clear
+   DESCRIPTION:
+        Clear or nullify the given ref. A ref is considered to be a null ref
+        if it does not contain a valid OID (and thus doesn't point to an
+        object). Logically, a null ref is a dangling ref.
+
+        Note that a null ref is still a valid SQL value and is not SQL-ly null.
+        It can be used as a valid non-null constant ref value for NOT NULL
+        column or attribute of a row in a table.
+        
+        If a null pointer value is passed as a ref,
+        then this function is a no-op.
+ */
+
+/*--------------------------- OCIRefAssign ----------------------------------*/
+sword OCIRefAssign(    OCIEnv *env, OCIError *err, CONST OCIRef *source, 
+                       OCIRef **target    );
+/*
+   NAME: OCIRefAssign - OCIRef CoPY a ref to another
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        source (IN) - ref to copy from
+        target (IN/OUT) - ref to copy to
+   DESCRIPTION:
+        Copy 'source' ref to 'target' ref; both then reference the same
+        object. If the target ref pointer is null (i.e. *target == NULL)
+        then the copy function will allocate memory for the target ref
+        in OOCI heap prior to the copy.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          1) out of memory
+ */
+
+/*-------------------------- OCIRefIsEqual ----------------------------------*/
+boolean OCIRefIsEqual(    OCIEnv *env, CONST OCIRef *x, CONST OCIRef *y    );
+/*
+   NAME: OCIRefIsEqual - OCIRef compare two refs for EQUality
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        x (IN)   - ref to compare
+        y (IN)   - ref to compare
+   DESCRIPTION:
+        Compare the given refs for equality.
+        Two refs are equal if and only if:
+          - they are both referencing the same persistent object, or
+          - they are both referencing the same transient object.
+
+        NOTE THAT TWO NULL REFS ARE CONSIDERED NOT EQUAL BY THIS FUNCTION.
+   RETURNS:
+        TRUE if the two refs are equal
+        FALSE if the two refs are not equal, or X is NULL, or Y is NULL
+ */
+
+/*--------------------------- OCIRefIsNull ----------------------------------*/
+boolean OCIRefIsNull(    OCIEnv *env, CONST OCIRef *ref    );
+/*
+   NAME: OCIRefIsNull - OCIRef test if a ref is NULl
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        ref (IN) - ref to test for null
+   DESCRIPTION:
+        Return TRUE if the given ref is null; otherwise, return FALSE.
+        A ref is null if and only if:
+        - it is supposed to be referencing a persistent object, but
+          its OID is null, or
+        - it is supposed to be referencing a transient object, but it is
+          currently not pointing to an object.
+        A ref is a dangling ref if the object that it points to does not
+        exist.
+   RETURNS:
+        TRUE if the given ref is NULL
+        FALSE if the given ref is not NULL
+ */
+
+/*-------------------------- OCIRefHexSize ----------------------------------*/
+ub4 OCIRefHexSize(    OCIEnv *env, CONST OCIRef *ref    );
+/*
+   NAME: OCIRefHexSize - OCIRef Hexadecimal buffer SiZe in bytes
+   PARAMETERS:
+        env (IN) - pointer to OCI environment handle
+        ref (IN) - ref whose size in hexadecimal representation in bytes is
+                returned
+   DESCRIPTION:
+        Return the size of the buffer in bytes required for the hexadecimal
+        representation of the ref. A buffer of at-least this size must be
+        passed to ref-to-hex (OCIRefToHex) conversion function.
+   RETURNS:
+        size of hexadecimal representation of ref
+ */
+
+/*-------------------------- OCIRefFromHex ---------------------------------*/
+sword OCIRefFromHex(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                        CONST oratext *hex, ub4 length, OCIRef **ref    );
+/*
+   NAME:
+        OCIRefFromHex - OCIRef convert a Hexadecimal string TO a Ref
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by
+                calling OCIErrorGet().
+        svc (IN) - OCI service context handle; if the resulting ref is
+                initialized with this service context
+        hex (IN) - hexadecimal string (that was produced by 'OCIRefToHex()"
+                previously) to be convert into a ref
+        length (IN) - length of the hexadecimal string
+        ref (IN/OUT) - ref is initialized with the given value ('hex').
+                If *ref is null, then space for the ref is allocated in the
+                object cache, otherwise the memory occupied by the given ref
+                is re-used.
+   DESCRIPTION:
+        Convert the given hexadecimal string into a ref. This function
+        ensures that the resulting ref is well formed. It does NOT ensure
+        that the object pointed to by the resulting ref exists or not.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+ */
+
+/*--------------------------- OCIRefToHex -----------------------------------*/
+sword OCIRefToHex(    OCIEnv *env, OCIError *err, CONST OCIRef *ref, 
+                      oratext *hex, ub4 *hex_length    );
+/*
+   NAME:
+        OCIRefToHex - OCIRef convert ref to a Hexadecimal string
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by
+                calling OCIErrorGet().
+        ref (IN) - ref to be converted into a hexadecimal string; if the
+                ref is a null ref (i.e. OCIRefIsNull(ref) == TRUE) then
+                a zero hex_length value is returned
+        hex (OUT) - buffer that is large enough to contain the resulting
+                hexadecimal string; the contents of the string is opaque
+                to the caller
+        hex_length (IN/OUT) - on input specifies the size of the 'hex' buffer,
+                on output specifies the actual size of the hexadecimal
+                string being returned in 'hex'
+   DESCRIPTION:
+        Convert the given ref into a hexadecimal string, and return the length
+        of the string. The resulting string is opaque to the caller.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          the given buffer is not big enough to hold the resulting string
+ */
+
+
+/*****************************************************************************/
+/*                          COLLECTION FUNCTIONS                             */
+/*****************************************************************************/
+
+/* 
+   The generic collection is represented by the type 'OCIColl'. The following
+   operations OCIColl*() are provided on a generic collection:
+     - get current size of collection
+     - get upper bound of collection
+     - get pointer to an element given its index
+     - set element at given index (assign element)
+     - append an element 
+     - trim the given number of elements from the end of the collection
+     - collection assignment
+
+   The following iterator based scanning functions are also provided on a
+   generic collection. These functions make use of an iterator which is
+   defined to be of type OCIIter.
+
+     - create an iterator for scanning collection
+     - destroy iterator
+     - reset iterator to the beginning of collection
+     - get pointer to current element pointed by iterator
+     - get pointer to next element
+     - get pointer to previous element
+
+   The collections variable-length array (varray) and nested table
+   are sub-types of generic collection. This means that the OCIColl*() 
+   functions can also be used to manipulate varray and nested table.
+
+   The varray is represented by OCIArray type and nested table by OCITable.
+   Besides OCIColl*() functions no additional functions are provided for
+   manipulating varrays. The OCIColl*() functions are a complete set of 
+   functions to manipulate varrays.
+
+   Besides OCIColl*() functions, the following functions OCITable*() can be 
+   used to manipulate nested table. The OCITable*() functions operate on 
+   nested tables only and should not be used on a varray.
+
+     - delete an element at index i. Note that the position
+       ordinals of the remaining elements of the table is not changed by the
+       delete operation. So delete creates "holes" in the table.
+     - check if an element exists at the given index i
+     - return the smallest value of i for which exists(i) is true
+     - return the largest value of i for which exists(i) is true
+     - return pointer to the smallest position j, greater than i, such that 
+       OCITableExists(j) is true
+     - return pointer to the largest position j, less than i, such that 
+       OCITableExists(j) is true
+
+   For binding variables of type OCIColl* or OCITable* in OCI calls
+   (OCIBindByName(), OCIBindByPos() and OCIDefineByPos()) use the external
+   type code SQLT_NTY.
+ */
+
+/* OCIColl - generic collection type */
+typedef struct OCIColl OCIColl;
+
+/* OCIArray - varray collection type */
+typedef OCIColl OCIArray;
+
+/* OCITable - nested table collection type */
+typedef OCIColl OCITable;
+
+/* OCIIter - collection iterator */
+typedef struct OCIIter OCIIter;
+
+/*----------------------------- OCICollSize ---------------------------------*/
+
+sword OCICollSize( OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+                   sb4 *size );
+/*
+   NAME: OCICollSize - OCIColl return current SIZe of the given collection
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection whose number of elements is returned
+        size (OUT) - current number of elements in the collection
+   DESCRIPTION:
+          Returns the current number of elements in the given collection.
+
+          For collections of type nested table wherein 'delete element'
+          operation is allowed, the count returned by OCICollSize() will
+          NOT be decremented upon deleting elements. For example:
+
+            OCICollSize(...); 
+            // assume 'size' returned is equal to 5
+            OCITableDelete(...); // delete one element
+            OCICollSize(...);
+            // 'size' returned will still be 5
+
+          To get the count minus the deleted elements use OCITableSize(). 
+          Continuing the above example,
+
+            OCITableSize(...)
+            // 'size' returned will be equal to 4
+
+          Note, a trim operation (OCICollTrim) will decrement the count 
+          by the number of trimmed elements. Continuing the above example,
+
+            OCICollTrim(..,1..); // trim one element
+            OCICollSize(...);
+            // 'size' returned will be equal to 4
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          error during loading of collection into object cache
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCICollMax ---------------------------------*/
+
+sb4 OCICollMax(    OCIEnv *env, CONST OCIColl *coll    );
+/*
+   NAME: OCICollMax - OCIColl return MAXimum size (upper-bound) of the
+                   given collection (in number of elements)
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        coll (IN) - collection whose upper-bound in number of elements 
+                is returned
+   DESCRIPTION:
+        Returns the max number of elements that the given collection can hold.
+        A value 0 indicates that the collection has no upper-bound.
+   REQUIRES:
+        coll must point to a valid collection descriptor
+   RETURNS:
+        upper-bound of the given collection
+ */
+
+/*-------------------------- OCICollGetElem ---------------------------------*/
+
+sword OCICollGetElem(    OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+                         sb4 index, boolean *exists, dvoid **elem, 
+                         dvoid **elemind    );
+/*
+   NAME: OCICollGetElem - OCIColl GET pointer to the element at the given index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - pointer to the element in this collection is returned
+        index (IN) - index of the element whose pointer is returned
+        exists (OUT) - set to FALSE if element at the specified index does 
+                not exist else TRUE
+        elem (OUT) - address of the desired element is returned
+        elemind (OUT) [optional] - address of the null indicator information 
+                is returned; if (elemind == NULL) then the null indicator
+                information will NOT be returned
+   DESCRIPTION:
+        Get the address of the element at the given position. Optionally
+        this function also returns the address of the element's null indicator
+        information.
+ 
+        The following table describes for each collection element type
+        what the corresponding element pointer type is. The element pointer
+        is returned via the 'elem' parameter of OCICollGetElem().
+ 
+           Element Type                       *elem is set to
+        -----------------------               ---------------
+         Oracle Number (OCINumber)              OCINumber*
+         Date (OCIDate)                         OCIDate*
+         Variable-length string (OCIString*)    OCIString**
+         Variable-length raw (OCIRaw*)          OCIRaw**
+         object reference (OCIRef*)             OCIRef**
+         lob locator (OCILobLocator*)           OCILobLocator**
+         object type (e.g. person)              person*
+ 
+        The element pointer returned by OCICollGetElem() is in a form
+        such that it can not only be used to access the
+        element data but also is in a form that can be used as the target
+        (i.e left-hand-side) of an assignment statement.
+ 
+        For example, assume the user is iterating over the elements of
+        a collection whose element type is object reference (OCIRef*). A call
+        to OCICollGetElem() returns pointer to a reference handle
+        (i.e. OCIRef**). After getting, the pointer to the collection
+        element, the user may wish to modify it by assigning a new reference.
+        This can be accomplished via the ref assignment function shown below:
+ 
+        sword OCIRefAssign( OCIEnv *env, OCIError *err, CONST OCIRef *source,
+                            OCIRef **target );
+ 
+        Note that the 'target' parameter of OCIRefAssign() is of type
+        'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+        If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+        and returned via the 'target' parameter.
+ 
+        Similarly, if the collection element was of type string (OCIString*),
+        OCICollGetElem() returns pointer to string handle
+        (i.e. OCIString**). If a new string is assigned, via
+        OCIStringAssign() or OCIStringAssignText() the type of the target
+        must be 'OCIString **'.
+ 
+        If the collection element is of type Oracle number, OCICollGetElem()
+        returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+ 
+        sword OCINumberAssign(OCIError *err, CONST OCINumber *from,
+                              OCINumber *to);
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------- OCICollGetElemArray -----------------------------*/
+
+sword OCICollGetElemArray(  OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+                            sb4 index, boolean *exists, dvoid **elem, 
+                            dvoid **elemind, uword *nelems);
+/*
+   NAME: OCICollGetElemArray - OCIColl GET pointers to elements from given index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - pointers to the elements in this collection is returned
+        index (IN) - starting index of the element
+        exists (OUT) - set to FALSE if element at the specified index does 
+                not exist else TRUE
+        elem (OUT) - address of the desired elements is returned
+        elemind (OUT) [optional] - address of the null indicators information 
+                is returned; if (elemind == NULL) then the null indicator
+                information will NOT be returned
+        nelems(IN/OUT) - Upper bound of elem and/or elemind array
+   DESCRIPTION:
+        Get the address of the elements from the given position. Optionally
+        this function also returns the address of the element's null indicator
+        information.
+ 
+        The following table describes for each collection element type
+        what the corresponding element pointer type is. The element pointer
+        is returned via the 'elem' parameter of OCICollGetElem().
+ 
+           Element Type                       *elem is set to
+        -----------------------               ---------------
+         Oracle Number (OCINumber)              OCINumber*
+         Date (OCIDate)                         OCIDate*
+         Variable-length string (OCIString*)    OCIString**
+         Variable-length raw (OCIRaw*)          OCIRaw**
+         object reference (OCIRef*)             OCIRef**
+         lob locator (OCILobLocator*)           OCILobLocator**
+         object type (e.g. person)              person*
+ 
+        The element pointer returned by OCICollGetElem() is in a form
+        such that it can not only be used to access the
+        element data but also is in a form that can be used as the target
+        (i.e left-hand-side) of an assignment statement.
+ 
+        For example, assume the user is iterating over the elements of
+        a collection whose element type is object reference (OCIRef*). A call
+        to OCICollGetElem() returns pointer to a reference handle
+        (i.e. OCIRef**). After getting, the pointer to the collection
+        element, the user may wish to modify it by assigning a new reference.
+        This can be accomplished via the ref assignment function shown below:
+ 
+        sword OCIRefAssign( OCIEnv *env, OCIError *err, CONST OCIRef *source,
+                            OCIRef **target );
+ 
+        Note that the 'target' parameter of OCIRefAssign() is of type
+        'OCIRef**'. Hence OCICollGetElem() returns 'OCIRef**'.
+        If '*target == NULL' a new ref will be allocated by OCIRefAssign()
+        and returned via the 'target' parameter.
+ 
+        Similarly, if the collection element was of type string (OCIString*),
+        OCICollGetElem() returns pointer to string handle
+        (i.e. OCIString**). If a new string is assigned, via
+        OCIStringAssign() or OCIStringAssignText() the type of the target
+        must be 'OCIString **'.
+ 
+        If the collection element is of type Oracle number, OCICollGetElem()
+        returns OCINumber*. The prototype of OCINumberAssign() is shown below:
+ 
+        sword OCINumberAssign(OCIError *err, CONST OCINumber *from,
+                              OCINumber *to);
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*----------------------- OCICollAssignElem ---------------------------------*/
+
+sword OCICollAssignElem(    OCIEnv *env, OCIError *err, sb4 index, 
+                            CONST dvoid *elem, 
+                            CONST dvoid *elemind, OCIColl *coll    );
+/*
+   NAME: OCICollAssignElem - OCIColl ASsign Element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - index of the element whose is assigned to
+        elem (IN) - element which is assigned from (source element)
+        elemind (IN) [optional] - pointer to the element's null indicator 
+                information; if (elemind == NULL) then the null indicator
+                information of the assigned element will be set to non-null.
+        coll (IN/OUT) - collection to be updated
+   DESCRIPTION:
+        Assign the given element value 'elem' to the element at coll[index].
+        If the collection is of type nested table, the element at the given 
+        index may not exist (i.e. may have been deleted). In this case, the 
+        given element is inserted at index 'index'.
+        Otherwise, the element at index 'index' is updated with the value
+        of 'elem'.
+  
+        Note that the given element is deep-copied and 
+        'elem' is strictly an input parameter.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          given index is out of bounds of the given collection
+ */
+
+/*--------------------------- OCICollAssign ---------------------------------*/
+
+sword OCICollAssign(    OCIEnv *env, OCIError *err, CONST OCIColl *rhs, 
+                        OCIColl *lhs    );
+/*
+   NAME: OCICollAssign - OCIColl ASsiGn collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        rhs (IN) - collection to be assigned from
+        lhs (OUT) - collection to be assigned to
+   DESCRIPTION:
+        Assign 'rhs' to 'lhs'. The 'lhs' collection may be decreased or 
+        increased depending upon the size of 'rhs'. If the 'lhs' contains 
+        any elements then the elements will be deleted prior to the 
+        assignment. This function performs a deep-copy. The memory for the 
+        elements comes from the object cache.
+ 
+        An error is returned if the element types of the lhs and rhs 
+        collections do not match. Also, an error is returned if the 
+        upper-bound of the lhs collection is less than the current number of 
+        elements in the rhs collection.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          type mis-match of lhs and rhs collections
+          upper-bound of lhs collection is less than the current number of 
+          elements in the rhs collection
+ */
+
+/*--------------------------- OCICollAppend ---------------------------------*/
+
+sword OCICollAppend(    OCIEnv *env, OCIError *err, CONST dvoid *elem, 
+                        CONST dvoid *elemind, OCIColl *coll    );
+/*
+   NAME: OCICollAppend - OCIColl APPend collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the element which is appended to the end
+                of the given collection
+        elemind (IN) [optional] - pointer to the element's null indicator 
+                information; if (elemind == NULL) then the null indicator
+                information of the appended element will be set to non-null.
+        coll (IN/OUT) - updated collection
+   DESCRIPTION:
+        Append the given element to the end of the given collection. 
+        Appending an element is equivalent to:
+          - increasing the size of the collection by 1 element
+          - updating (deep-copying) the last element's data with the given 
+            element's data
+  
+        Note that the pointer to the given element 'elem' will not be saved 
+        by this function. So 'elem' is strictly an input parameter.
+        An error is returned if the current size of the collection
+        is equal to the max size (upper-bound) of the collection prior to 
+        appending the element.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+          current size of collection == max size of the collection
+ */
+
+/*----------------------------- OCICollTrim ---------------------------------*/
+
+sword OCICollTrim(    OCIEnv *env, OCIError *err, sb4 trim_num, 
+                      OCIColl *coll    );
+/*
+   NAME: OCICollTrim - OCIColl Trim elements from the end of the collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        trim_num (IN) - number of elements to trim
+        coll (IN/OUT) - 'trim_num' of elements are removed (freed) from the
+                end of the collection
+   DESCRIPTION:
+        Trim the collection by the given number of elements. The elements are 
+        removed from the end of the collection.
+  
+        An error is returned if the 'trim_num' is greater than the current 
+        size of the collection.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          'trim_num' is greater than the current size of the collection.
+ */
+
+/*--------------------------- OCICollIsLocator ------------------------------*/
+
+sword OCICollIsLocator(OCIEnv *env, OCIError *err, CONST OCIColl *coll,
+                       boolean *result );
+/*
+Name: OCICollIsLocator - OCIColl indicates whether a collection is locator
+                         based or not.
+Parameters:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection item.
+        result (OUT) - TRUE if the collection item is a locator, FALSE
+                       otherwise
+Description:
+        Returns TRUE in the result OUT parameter if the collection item is a
+        locator, otherwise returns FALSE.
+Returns:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+*/
+
+/*---------------------------- OCIIterCreate --------------------------------*/
+
+sword OCIIterCreate(    OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+                        OCIIter **itr    );
+/*
+   NAME: OCIIterCreate - OCIColl Create an ITerator to scan the collection
+                      elements
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection which will be scanned; the different 
+                collection types are varray and nested table
+        itr (OUT) - address to the allocated collection iterator is
+                returned by this function
+   DESCRIPTION:
+        Create an iterator to scan the elements of the collection. The
+        iterator is created in the object cache. The iterator is initialized
+        to point to the beginning of the collection.
+  
+        If the next function (OCIIterNext) is called immediately 
+        after creating the iterator then the first element of the collection 
+        is returned. 
+        If the previous function (OCIIterPrev) is called immediately after 
+        creating the iterator then "at beginning of collection" error is 
+        returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          out of memory error
+ */
+
+/*----------------------------- OCIIterDelete ------------------------------*/
+
+sword OCIIterDelete(    OCIEnv *env, OCIError *err, OCIIter **itr    );
+/*
+   NAME: OCIIterDelete - OCIColl Delete ITerator
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - the allocated collection iterator is destroyed and
+                the 'itr' is set to NULL prior to returning
+   DESCRIPTION:
+        Delete the iterator which was previously created by a call to 
+        OCIIterCreate.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          to be discovered
+ */
+
+/*----------------------------- OCIIterInit ---------------------------------*/
+
+sword OCIIterInit(    OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+                      OCIIter *itr    );
+/*
+   NAME: OCIIterInit - OCIColl Initialize ITerator to scan the given 
+                   collection
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        coll (IN) - collection which will be scanned; the different 
+                collection types are varray and nested table
+        itr (IN/OUT) - pointer to an allocated  collection iterator
+   DESCRIPTION:
+        Initializes the given iterator to point to the beginning of the 
+        given collection. This function can be used to:
+  
+        a. reset an iterator to point back to the beginning of the collection 
+        b. reuse an allocated iterator to scan a different collection
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------ OCIIterGetCurrent --------------------------------*/
+
+sword OCIIterGetCurrent(    OCIEnv *env, OCIError *err, CONST OCIIter *itr, 
+                            dvoid **elem, dvoid **elemind    );
+/*
+   NAME: OCIIterGetCurrent - OCIColl Iterator based, get CURrent collection
+                    element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN) - iterator which points to the current element
+        elem (OUT) - address of the element pointed by the iterator is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+   DESCRIPTION:
+        Returns pointer to the current element and its corresponding null
+        information.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterNext --------------------------------*/
+
+sword OCIIterNext(    OCIEnv *env, OCIError *err, OCIIter *itr, 
+                      dvoid **elem, dvoid **elemind, boolean *eoc    );
+/*
+   NAME: OCIIterNext - OCIColl Iterator based, get NeXT collection element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - iterator is updated to point to the next element
+        elem (OUT) - after updating the iterator to point to the next element,
+                address of the element is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+        eoc (OUT) - TRUE if iterator is at End Of Collection (i.e. next
+                element does not exist) else FALSE
+   DESCRIPTION:
+        Returns pointer to the next element and its corresponding null
+        information. The iterator is updated to point to the next element.
+  
+        If the iterator is pointing to the last element of the collection
+        prior to executing this function, then calling this function will 
+        set eoc flag to TRUE. The iterator will be left unchanged in this
+        situation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*------------------------------ OCIIterPrev --------------------------------*/
+
+sword OCIIterPrev(    OCIEnv *env, OCIError *err, OCIIter *itr, 
+                      dvoid **elem, dvoid **elemind, boolean *boc    );
+/*
+   NAME: OCIIterPrev - OCIColl Iterator based, get PReVious collection element
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        itr (IN/OUT) - iterator is updated to point to the previous 
+                element
+        elem (OUT) - after updating the iterator to point to the previous 
+                element, address of the element is returned
+        elemind (OUT) [optional] - address of the element's null indicator 
+                information is returned; if (elemind == NULL) then the null 
+                indicator information will NOT be returned
+        boc (OUT) - TRUE if iterator is at Beginning Of Collection (i.e.
+                previous element does not exist) else FALSE.
+   DESCRIPTION:
+        Returns pointer to the previous element and its corresponding null
+        information. The iterator is updated to point to the previous element.
+  
+        If the iterator is pointing to the first element of the collection
+        prior to executing this function, then calling this function will 
+        set 'boc' to TRUE. The iterator will be left unchanged in this 
+        situation.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*****************************************************************************/
+/*           FUNCTIONS WHICH OPERATE ONLY ON NESTED TABLE OCITable*()        */
+/*****************************************************************************/
+
+/*---------------------------- OCITableSize ---------------------------------*/
+
+sword OCITableSize( OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+                    sb4 *size);
+/*
+   NAME: OCITableSize - OCITable return current SIZe of the given 
+                   nested table (not including deleted elements)
+   PARAMETERS:
+        env(IN) - pointer to OCI environment handle
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - nested table whose number of elements is returned
+        size (OUT) - current number of elements in the nested table. The count
+                does not include deleted elements.
+   DESCRIPTION:
+        Returns the count of elements in the given nested table. 
+
+        The count returned by OCITableSize() will be decremented upon 
+        deleting elements from the nested table. So, this count DOES NOT 
+        includes any "holes" created by deleting elements. 
+        For example:
+
+            OCITableSize(...); 
+            // assume 'size' returned is equal to 5
+            OCITableDelete(...); // delete one element
+            OCITableSize(...);
+            // 'size' returned will be equal to 4
+
+        To get the count plus the count of deleted elements use 
+        OCICollSize(). Continuing the above example,
+
+            OCICollSize(...)
+            // 'size' returned will still be equal to 5
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          error during loading of nested table into object cache
+          any of the input parameters is null
+ */
+
+/*---------------------- OCITableExists ---------------------------------*/
+
+sword OCITableExists(    OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+                             sb4 index, boolean *exists    );
+/*
+   NAME: OCITableExists - OCITable test whether element at the given index
+                    EXIsts
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table in which the given index is checked
+        index (IN) - index of the element which is checked for existence
+        exists (OUT) - set to TRUE if element at given 'index' exists
+                else set to FALSE
+   DESCRIPTION:
+        Test whether an element exists at the given 'index'.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+ */
+
+/*--------------------------- OCITableDelete -------------------------------*/
+
+sword OCITableDelete(    OCIEnv *env, OCIError *err, sb4 index, 
+                      OCITable *tbl    );
+/*
+   NAME: OCITableDelete - OCITable DELete element at the specified index
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - index of the element which must be deleted
+        tbl (IN) - table whose element is deleted
+   DESCRIPTION:
+        Delete the element at the given 'index'. Note that the position
+        ordinals of the remaining elements of the table is not changed by the
+        delete operation. So delete creates "holes" in the table.
+
+        An error is returned if the element at the specified 'index' has
+        been previously deleted.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          any of the input parameters is null
+          given index is not valid
+ */
+
+/*--------------------------- OCITableFirst ---------------------------------*/
+
+sword OCITableFirst(    OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+                        sb4 *index     );
+/*
+   NAME: OCITableFirst - OCITable return FirST index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table which is scanned
+        index (OUT) - first index of the element which exists in the given 
+                table is returned
+   DESCRIPTION:
+        Return the first index of the element which exists in the given 
+        table. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          table is empty
+ */
+
+/*---------------------------- OCITableLast ---------------------------------*/
+
+sword OCITableLast(    OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+                       sb4 *index     );
+/*
+   NAME: OCITableFirst - OCITable return LaST index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tbl (IN) - table which is scanned
+        index (OUT) - last index of the element which exists in the given 
+                table is returned
+   DESCRIPTION:
+        Return the last index of the element which exists in the given 
+        table. 
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          table is empty
+ */
+
+/*---------------------------- OCITableNext ---------------------------------*/
+
+sword OCITableNext(    OCIEnv *env, OCIError *err, sb4 index, 
+                       CONST OCITable *tbl, sb4 *next_index,
+                       boolean *exists    );
+/*
+   NAME: OCITableNext - OCITable return NeXT available index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - starting at 'index' the index of the next element
+                which exists is returned
+        tbl (IN) - table which is scanned
+        next_index (OUT) - index of the next element which exists 
+                is returned
+        exists (OUT) - FALSE if no next index available else TRUE
+   DESCRIPTION:
+        Return the smallest position j, greater than 'index', such that 
+        exists(j) is TRUE.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          no next index available
+ */
+
+/*---------------------------- OCITablePrev ---------------------------------*/
+
+sword OCITablePrev(    OCIEnv *env, OCIError *err, sb4 index, 
+                       CONST OCITable *tbl, sb4 *prev_index,
+                       boolean *exists    );
+/*
+   NAME: OCITablePrev - OCITable return PReVious available index of table
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        index (IN) - starting at 'index' the index of the previous element
+                which exists is returned
+        tbl (IN) - table which is scanned
+        prev_index (OUT) - index of the previous element which exists 
+                is returned
+        exists (OUT) - FALSE if no next index available else TRUE
+   DESCRIPTION:
+        Return the largest position j, less than 'index', such that 
+        exists(j) is TRUE.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is NULL.
+        OCI_ERROR if
+          no previous index available
+ */
+
+/*------------------------ OCINumberToLnx -----------------------------------*/
+/* void OCINumberToLnx(/o_ OCINumber *num _o/); */
+
+#define OCINumberToLnx(num) ((lnxnum_t *)num)
+
+/* 
+   NAME:   OCINumberToLnx
+   PARAMETERS:
+           num (IN) - OCINumber to convert ;
+   DESCRIPTION: 
+           Converts OCINumber to its internal lnx format 
+           This is not to be used in Public interfaces , but
+           has been provided due to special requirements from 
+           SQLPLUS development group as they require to call 
+           Core funtions directly . 
+*/
+
+/* OCI representation of XMLType */
+typedef struct OCIXMLType OCIXMLType;
+
+/* OCI representation of OCIDomDocument */
+typedef struct OCIDOMDocument OCIDOMDocument;
+
+#endif /* ORL_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/oro.h b/src/terralib/drivers/OracleSpatial/OCI/include/oro.h
new file mode 100644
index 0000000..e825a5c
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/oro.h
@@ -0,0 +1,883 @@
+/* Copyright (c) 1994, 2003, Oracle Corporation.  All rights reserved.  */
+
+/*
+  NAME
+    OCI - Oracle Object Interface for External/Internal/Kernel Clients
+
+  DESCRIPTION
+    This header file contains Oracle object interface definitions which
+    can be included by external user applications, tools, as well as
+    the kernel.  It defines types and constants that are common to all
+    object interface which is being defined in several other header files
+    (e.g., ori.h, ort.h, and orl.h).
+
+  RELATED DOCUMENTS
+    TBD
+
+  INSPECTION STATUS [[ deletable if no inspection ]]
+    Inspection date:    [[ date of the last logging meeting ]]
+    Inspection status:  [[ exited, not exited, or N/A if exit is not a goal ]]
+    Estimated increasing cost defects per page:
+    Rule sets:          [[ rule sets inspected against or planned to be 
+                           inspected against ]]
+
+  ACCEPTANCE REVIEW STATUS [[ deletable if no approval review ]]
+    Review date:    [[ date of the meeting where issues were logged and the 
+                       approval status was decided ]] 
+    Review status:  [[ current status:  accepted, conditionally accepted, 
+                       major revision required, rejected ]]
+    Reviewers:      [[ names of the members on the review team ]]
+
+  PUBLIC FUNCTIONS
+
+  EXAMPLES
+    Examples are given in the description of each function or macro where
+    relevant.
+
+  MODIFIED
+    mnanal     06/09/03 - backout of fix 2836388
+    mnanal     05/14/03 - bug-2836388
+    srseshad   11/27/02 - Change OCI_TYPECODE_BFLOAT/BDOUBLE codes
+    rxgovind   10/09/02 - add OCI_TYPECODE_UROWID
+    mxyang     09/17/02 - grabtrans 'mmorsi_obj_float'
+    srseshad   09/11/02 - 
+    srseshad   09/01/02 - 
+    aahluwal   06/03/02 - bug 2360115
+    celsbern   10/19/01 - merge LOG to MAIN
+    rxgovind   10/16/01 - update typecodes
+    rxgovind   09/19/01 - add typecodes
+    rkasamse   08/15/01 - add OCI_DURATION_USER_CALLBACK
+    jchai      09/24/01 - add type code for PLS_INTEGER
+    porangas   08/22/01 - Fix bug#1776434
+    schatter   04/09/01 - merge 1456235: define OCI_DURATION_INVALID
+    rdani      10/12/00 - 1449943 NOCOPY and PIPELINE
+    ciyer      05/26/00 - short names for abstract, overriding
+    rkasamse   05/25/00 - OCCI enhancements
+    smuralid   05/11/00 - OCITypeMethodFlags - add NOT INSTANTIABLE, OVERRIDING
+    rxgovind   05/09/00 - add OCI_TYPECODE_NONE
+    tnbui      07/28/99 - Remove OCI_TYPECODE_TIMESTAMP_ITZ                    
+    tnbui      07/21/99 - TS LOCAL TZ                                          
+    thoang     06/21/99 - Add OCI_TYPECODE_TIMESTAMP_ITZ
+    thoang     03/04/99 - Add datetime datatypes
+    rkasamse   10/20/98 - add OCI_ATTR_CACHE_ARRAYFLUSH
+    rkasamse   10/29/98 - add OCI_DURATION_CALLOUT
+    rkasamse   04/28/98 - OCI_OBJECT_DETECTCHANGE -> OCI_ATTR_OBJECT_DETECTCHAN
+    rkasamse   04/28/98 - OCI_OBJECT_NEWNOTNULL -> OCI_ATTR_OBJECT_NEWNOTNULL  
+    rkasamse   04/23/98 - add OCI_OBJECT_DETECTCHANGE
+    rkasamse   04/03/98 - add OCI_OBJECT_NEWNOTNULL                            
+    pmitra     04/01/98 - OCI_LOCK_X_NOWAIT added                              
+    rxgovind   02/18/98 - add OCI_TYPECODE_OPAQUE
+    rkasamse   02/13/98 - Add OCI_DURATION_PROCESS
+    cxcheng    07/28/97 - fix compile with SLSHORTNAME
+    skrishna   07/14/97 - add OCIObjectGetProperty
+    cxcheng    04/30/97 - make OCITypeParamMode values consistent with PL/SQL
+    skrishna   04/28/97 - undocument OCIObjectProperty & OCIObjectEvent
+    cxcheng    03/29/97 - remove all remaining short names
+    sthakur    03/20/97 - add casts to constants
+    cxcheng    02/21/97 - temporarily put SLSHORTNAME for PL/SQL
+    cxcheng    02/06/97 - take out short name support except with SLSHORTNAME
+    lchidamb   01/20/97 - update OCIRef comments
+    sgollapu   11/19/96 - Add OCI type codes for BOOL,REC,and TAB
+    cxcheng    11/19/96 - more typecode changes
+    cxcheng    11/13/96 - add #include for ocidfn.h
+    cxcheng    11/13/96 - add OCI_TYPECODE_ADT for compatibility
+    cxcheng    11/12/96 - add SQLT_NCO for named collection
+    cxcheng    11/11/96 - more changes to typecodes
+    cxcheng    11/07/96 - #define OCI_TYPECODE_MLSLABEL to SQLT_LAB
+    cxcheng    11/06/96 - fix #define omission for OROTCNAT
+    cxcheng    10/30/96 - move OCI_TYPECODE_* to ocidfn.h as SQLT_*
+    cxcheng    10/28/96 - more beautification changes
+    jboonleu   10/29/96 - add flags for freeing object
+    dchatter   10/26/96 - delete redef of OCISvcCtx, OCIError, OCIEnv
+    cxcheng    10/15/96 - more changes
+    cxcheng    10/14/96 - more final fixes to constants
+    mluong     10/11/96 -
+    mluong     10/11/96 -  KOCON and KONSP are in lowercase
+    mluong     10/11/96 -  add some define per Calvin
+    cxcheng    10/09/96 -  add #define for OROOCOSFN to OCI_COPY_NOREF
+    jboonleu   10/08/96 -  change OROOCOSFN to OCICopyFlag
+    jboonleu   10/07/96 -  use new OCI names for cache options
+    cxcheng    10/07/96 -  add OROTCS02 for KOTTCBRI and OROTCS03 as spare
+    cxcheng    10/07/96 -  more lint fixes
+    cxcheng    10/02/96 -  move oronsp to ko.h as konsp
+    cxcheng    10/01/96 -  add long names for readability
+    cxcheng    10/01/96 -  remove orotty and orotal
+    rjenkins   09/28/96 -  2k char 4k varchar2
+    jboonleu   09/27/96 -  add macro used only in beta2
+    cxcheng    09/27/96 -  move oroenv to oroenv.h
+    cxcheng    09/24/96 -  remove unnecessary orotyp
+    cxcheng    09/25/96 -  add typecode OROTCS01 as placeholder for lob pointer
+    cxcheng    09/20/96 -  add TDO load option orotgo
+    jboonleu   09/18/96 -  add OROOPOREC
+    jboonleu   09/10/96 -  add OROOPODFL
+    jweisz     08/27/96 -  add SQL internal typecode OROTCS00
+    cxcheng    08/02/96 -  add PLSQL internal typecodes OROTCP..
+    cxcheng    08/01/96 -  add OROTCFAR to fill up space left by OROTCCAR
+    jboonleu   07/16/96 -  new pin option
+    cxcheng    06/18/96 -  add casts to OROTNOPRE and OROTNOSCL
+    cxcheng    05/29/96 -  change OROTCNPT back to OROTCDOM
+    vkrishna   05/27/96 -  add OROTCCAR
+    cxcheng    05/17/96 -  replace OROTCFAR with OROTCCAR
+    cxcheng    05/08/96 -  change orotmf from ub1 to ub2
+    cxcheng    05/07/96 -  fix public defines for method types
+    cxcheng    04/30/96 -  change OROTCDOM to OROTCNPT
+    cxcheng    04/15/96 -  remove obsolete OROTTYICT
+    jboonleu   04/12/96 -  add new pin option
+    sthakur    04/12/96 -  add indicator type and indicator status
+    cxcheng    04/10/96 -  add function parameter codes for ORT/KOT
+    cxcheng    04/03/96 -  replace OROTCFAR as OROTCCAR
+    jwijaya    03/29/96 -  add OROTTCCAR
+    jwijaya    03/27/96 -  better comments for orotc
+    cxcheng    02/23/96 -  add typecodes for SMALLINT and VARCHAR2
+    skrishna   02/22/96 -  add oroind - null indicator type
+    cxcheng    02/21/96 -  change lob character codes to OROTCCLB, OROTCBLB...
+    jboonleu   02/06/96 -  new value for predefined duration
+    cxcheng    01/12/96 -  add OROTCCLO, OROTCBLO, OROTCFIL to orotc
+    cxcheng    12/05/95 -  add OROTCDOM and OROTCAAT to orotc
+    skotsovo   10/30/95 -  reserve space for internal 'oid' type
+    jwijaya    10/20/95 -  support variable-length ref
+    cxcheng    10/03/95 -  add OROTMFOR for ordering function to orotmf
+    cxcheng    10/03/95 -  Adding the ordering function type to orotmf
+    jboonleu   09/28/95 -  set OROODTPRE 
+    jboonleu   09/25/95 -  add oroodt
+    skotsovo   03/10/95 -  update to only include release 1 
+    jboonleu   02/15/95 -  add OROOPOREC, remove orocro, oroolo
+    skotsovo   01/30/95 -  add default max lengths for varrays and vstrings 
+    skotsovo   01/24/95 -  categorize sint32, double, and real as number types 
+                           (with precision and scale) instead of scalar types.
+    skotsovo   12/20/94 -  add release 1 types 
+    skotsovo   12/12/94 -  update according to new ots doc
+    skotsovo   12/01/94 -  add default precision and scale 
+    jwijaya    11/15/94 -  rename ORONSPTAB to ORONSPEXT 
+    jwijaya    10/25/94 -  tint 
+    jwijaya    10/06/94 -  add namespace 
+    jwijaya    10/02/94 -  connection handle -> connection number 
+    skotsovo   09/12/94 -  keep 0 as uninitialized value for ORT consts 
+    skotsovo   08/24/94 -  fix orotec 
+    skotsovo   08/17/94 -  modify type code names 
+    skotsovo   08/12/94 -  fix 141 lint errors 
+    skotsovo   07/25/94 -  modify categorization of complex types (orotc) 
+    skotsovo   07/07/94 -  change typecode enum values & add decimal type
+    skotsovo   07/01/94 -  change order of typecodes 
+    jwijaya    06/15/94 -  review 
+    jboonleu   06/13/94 -  add comments for the object cache options
+    jwijaya    06/13/94 -  adhere to the header file template 
+    skotsovo   06/09/94 -  make ots scalar type names consistent with the ots 
+                           document 
+    jwijaya    06/07/94 -  include oratypes.h instead of s.h 
+    skotsovo   05/24/94 -  change typecodes 
+    jwijaya    05/23/94 -  fix comments of ororef 
+    skotsovo   05/19/94 -  remove type composition 
+    skotsovo   05/09/94 -  modified orotc according to new OTS document
+    jwijaya    05/03/94 -  oroid and ororef
+    jwijaya    01/26/94 -  Creation
+*/
+
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+
+#ifndef OCIDFN_ORACLE
+#include <ocidfn.h>
+#endif
+
+#ifndef ORO_ORACLE
+#define ORO_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCIDuration                     oroodt
+#define OCIInd                          oroind
+#define OCILockOpt                      oroolm
+#define OCIMarkOpt                      oroomo
+#define OCIObjectEvent                  orocev
+#define OCIObjectProperty               oroopr
+#define OCIPinOpt                       oroopo
+#define OCIRef                          ororef
+#define OCIRefreshOpt                   orooro
+#define OCITypeCode                     orotc
+#define OCITypeEncap                    orotec
+#define OCITypeGetOpt                   orotgo
+#define OCITypeMethodFlag               orotmf
+#define OCITypeParamMode                orotpm
+#define OCIObjectPropId                 oroopi
+#define OCIObjectLifetime               oroolft
+#define OCIObjectMarkstatus             oroomst
+#define OCI_LOCK_NONE                   OROOLMNUL
+#define OCI_LOCK_X                      OROOLMX
+#define OCI_LOCK_X_NOWAIT               OROOLMXNW
+#define OCI_MARK_DEFAULT                OROOMODFL
+#define OCI_MARK_NONE                   OROOMONON
+#define OCI_MARK_UPDATE                 OROOMOUPD
+#define OCI_OBJECTEVENT_AFTER_FLUSH     OROCEVAFL
+#define OCI_OBJECTEVENT_AFTER_REFRESH   OROCEVARF
+#define OCI_OBJECTEVENT_BEFORE_FLUSH    OROCEVBFL
+#define OCI_OBJECTEVENT_BEFORE_REFRESH  OROCEVBRF
+#define OCI_OBJECTEVENT_WHEN_LOCK       OROCEVWLK
+#define OCI_OBJECTEVENT_WHEN_MARK_DELETED OROCEVWDL
+#define OCI_OBJECTEVENT_WHEN_MARK_UPDATED OROCEVWUP
+#define OCI_OBJECTEVENT_WHEN_UNMARK     OROCEVWUM
+#define OCI_OBJECTPROP_DIRTIED          OROOPRDRT
+#define OCI_OBJECTPROP_LOADED           OROOPRLOD
+#define OCI_OBJECTPROP_LOCKED           OROOPRLCK
+#define OCI_PIN_ANY                     OROOPOANY
+#define OCI_PIN_DEFAULT                 OROOPODFL
+#define OCI_PIN_LATEST                  OROOPOLST
+#define OCI_PIN_RECENT                  OROOPOREC
+#define OCI_REFRESH_LOADED              OROOROLOD
+#define OCI_TYPEENCAP_PRIVATE           OROTECPVT
+#define OCI_TYPEENCAP_PUBLIC            OROTECPUB
+#define OCI_TYPEGET_ALL                 OROTGOALL
+#define OCI_TYPEGET_HEADER              OROTGOHDR
+#define OCI_TYPEMETHOD_CONSTANT         OROTMCON
+#define OCI_TYPEMETHOD_CONSTRUCTOR      OROTMCSTR
+#define OCI_TYPEMETHOD_DESTRUCTOR       OROTMDSTR
+#define OCI_TYPEMETHOD_INLINE           OROTMINL
+#define OCI_TYPEMETHOD_MAP              OROTMMAP
+#define OCI_TYPEMETHOD_OPERATOR         OROTMOP
+#define OCI_TYPEMETHOD_ORDER            OROTMOR
+#define OCI_TYPEMETHOD_RNDS             OROTMRDS
+#define OCI_TYPEMETHOD_RNPS             OROTMRPS
+#define OCI_TYPEMETHOD_SELFISH          OROTMSLF
+#define OCI_TYPEMETHOD_VIRTUAL          OROTMVRT
+#define OCI_TYPEMETHOD_WNDS             OROTMWDS
+#define OCI_TYPEMETHOD_WNPS             OROTMWPS
+#define OCI_TYPEMETHOD_ABSTRACT         OROTMABSTRACT
+#define OCI_TYPEMETHOD_OVERRIDING       OROTMOVERRIDING
+#define OCI_TYPEMETHOD_PIPELINED        OROTMPIPELINED
+#define OCI_TYPEPARAM_BYREF             OROTPMREF
+#define OCI_TYPEPARAM_IN                OROTPMIN
+#define OCI_TYPEPARAM_INOUT             OROTPMIO
+#define OCI_TYPEPARAM_OUT               OROTPMOUT
+#define OCI_TYPEPARAM_OUTNCPY           OROTPMOUTNCPY
+#define OCI_TYPEPARAM_INOUTNCPY         OROTPMIONCPY
+
+#endif                                                        /* SLSHORTNAME */
+
+
+/*---------------------------------------------------------------------------*/
+/*                    PUBLIC TYPES, CONSTANTS AND MACROS                     */
+/*---------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------*/
+/*                  GENERAL OBJECT TYPES, CONSTANTS, MACROS                  */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------- OBJECT REFERENCE (REF) --------------------------*/
+
+typedef struct OCIRef OCIRef;
+/*
+ * OCIRef - OCI object REFerence
+ *
+ * In the Oracle object runtime environment, an object is identified by an 
+ * object reference (ref) which contains the object identifier plus other 
+ * runtime information.  The contents of a ref is opaque to clients.  Use
+ * OCIObjectNew() to construct a ref.
+ */
+
+
+/*--------------------------- OBJECT INDICATOR ------------------------------*/
+
+typedef sb2 OCIInd;
+/*
+ * OCIInd -- a variable of this type contains (null) indicator information
+ */
+
+#define OCI_IND_NOTNULL (OCIInd)0                                /* not NULL */
+#define OCI_IND_NULL (OCIInd)(-1)                                    /* NULL */
+#define OCI_IND_BADNULL (OCIInd)(-2)                             /* BAD NULL */
+#define OCI_IND_NOTNULLABLE (OCIInd)(-3)                     /* not NULLable */
+
+/*---------------------------------------------------------------------------*/
+/*                               OBJECT CACHE                                */
+/*---------------------------------------------------------------------------*/
+
+/* To enable object change detection mode, set this to TRUE */
+#define OCI_ATTR_OBJECT_DETECTCHANGE            0x00000020
+
+/* To enable object creation with  non-NULL attributes by default, set the
+   following to TRUE.
+   By default, object is created with NULL attributes
+*/
+#define OCI_ATTR_OBJECT_NEWNOTNULL   0x00000010
+
+/* To enable sorting of the objects that belong to the same table
+   before being flushed through OCICacheFlush.
+   Please note that by enabling this object cache will not be flushing
+   the objects in the same order they were dirtied */
+#define OCI_ATTR_CACHE_ARRAYFLUSH 0x00000040
+
+/*--------------------------- OBJECT PIN OPTION -----------------------------*/
+
+enum OCIPinOpt
+{
+  /* 0 = uninitialized */
+  OCI_PIN_DEFAULT = 1,                                 /* default pin option */
+  OCI_PIN_ANY = 3,                          /* pin any copy of the object */
+  OCI_PIN_RECENT = 4,                    /* pin recent copy of the object */
+  OCI_PIN_LATEST = 5                     /* pin latest copy of the object */
+};
+typedef enum OCIPinOpt OCIPinOpt;
+
+/*
+ * OCIPinOpt - OCI object Pin Option 
+ *
+ * In the Oracle object runtime environment, the program has the option to
+ * specify which copy of the object to pin.  
+ *
+ * OCI_PINOPT_DEFAULT pins an object using the default pin option.  The default
+ * pin option can be set as an attribute of the OCI environment handle 
+ * (OCI_ATTR_PINTOPTION).  The value of the default pin option can be
+ * OCI_PINOPT_ANY, OCI_PINOPT_RECENT, or OCI_PIN_LATEST. The default option
+ * is initialized to OCI_PINOPT_ANY.
+ *
+ * OCI_PIN_ANY pins any copy of the object.  The object is pinned 
+ * using the following criteria:
+ *   If the object copy is not loaded, load it from the persistent store.
+ *   Otherwise, the loaded object copy is returned to the program. 
+ * 
+ * OCI_PIN_RECENT pins the latest copy of an object.  The object is 
+ * pinned using the following criteria:
+ *   If the object is not loaded, load the object from the persistent store
+ *       from the latest version.
+ *   If the object is not loaded in the current transaction and it is not 
+ *       dirtied, the object is refreshed from the latest version.
+ *   Otherwise, the loaded object copy is returned to the program. 
+ *
+ * OCI_PINOPT_LATEST pins the latest copy of an object.  The object copy is 
+ * pinned using the following criteria:
+ *   If the object copy is not loaded, load it from the persistent store.
+ *   If the object copy is loaded and dirtied, it is returned to the program.
+ *   Otherwise, the loaded object copy is refreshed from the persistent store.
+ */
+
+
+
+/*--------------------------- OBJECT LOCK OPTION ----------------------------*/
+
+enum OCILockOpt
+{
+  /* 0 = uninitialized */
+  OCI_LOCK_NONE = 1,                               /* null (same as no lock) */
+  OCI_LOCK_X = 2,                                          /* exclusive lock */
+  OCI_LOCK_X_NOWAIT = 3                      /* exclusive lock, do not wait  */
+};
+typedef enum OCILockOpt OCILockOpt;
+/*
+ * OCILockOpt - OCI object LOCK Option 
+ *
+ * This option is used to specify the locking preferences when an object is
+ * loaded from the server.
+ */
+
+
+/*------------------------- OBJECT MODIFYING OPTION -------------------------*/
+
+enum OCIMarkOpt
+{
+  /* 0 = uninitialized */
+  OCI_MARK_DEFAULT = 1,        /* default (the same as OCI_MARK_NONE) */
+  OCI_MARK_NONE = OCI_MARK_DEFAULT,   /* object has not been modified */
+  OCI_MARK_UPDATE                               /* object is to be updated */
+};
+typedef enum OCIMarkOpt OCIMarkOpt;
+/*
+ * OCIMarkOpt - OCI object Mark option
+ *
+ * When the object is marked updated, the client has to specify how the
+ * object is intended to be changed.  
+ */
+
+/*-------------------------- OBJECT Duration --------------------------------*/
+ 
+typedef ub2 OCIDuration;
+
+#define  OCI_DURATION_INVALID 0xFFFF                     /* Invalid duration */
+#define  OCI_DURATION_BEGIN (OCIDuration)10
+                                           /* beginning sequence of duration */
+#define  OCI_DURATION_NULL (OCIDuration)(OCI_DURATION_BEGIN-1)
+                                                            /* null duration */
+#define  OCI_DURATION_DEFAULT (OCIDuration)(OCI_DURATION_BEGIN-2) /* default */
+#define  OCI_DURATION_USER_CALLBACK (OCIDuration)(OCI_DURATION_BEGIN-3)
+#define  OCI_DURATION_NEXT (OCIDuration)(OCI_DURATION_BEGIN-4)
+                                                    /* next special duration */
+#define  OCI_DURATION_SESSION (OCIDuration)(OCI_DURATION_BEGIN)
+                                                  /* the end of user session */
+#define  OCI_DURATION_TRANS (OCIDuration)(OCI_DURATION_BEGIN+1)
+                                              /* the end of user transaction */
+/******************************************************************************
+**  DO NOT USE OCI_DURATION_CALL. IT  IS UNSUPPORTED                         **
+**  WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                              **
+******************************************************************************/
+#define  OCI_DURATION_CALL (OCIDuration)(OCI_DURATION_BEGIN+2)
+                                       /* the end of user client/server call */
+#define  OCI_DURATION_STATEMENT (OCIDuration)(OCI_DURATION_BEGIN+3)
+
+/* This is to be used only during callouts.  It is similar to that 
+of OCI_DURATION_CALL, but lasts only for the duration of a callout.
+Its heap is from PGA */
+#define  OCI_DURATION_CALLOUT (OCIDuration)(OCI_DURATION_BEGIN+4)
+
+#define  OCI_DURATION_LAST OCI_DURATION_CALLOUT 
+                                             /* last of predefined durations */
+
+/* This is not being treated as other predefined durations such as 
+   SESSION, CALL etc, because this would not have an entry in the duration
+   table and its functionality is primitive such that only allocate, free,
+   resize memory are allowed, but one cannot create subduration out of this
+*/ 
+#define  OCI_DURATION_PROCESS (OCIDuration)(OCI_DURATION_BEGIN-5) 
+ 
+/*
+ * OCIDuration - OCI object duration
+ *
+ * A client can specify the duration of which an object is pinned (pin
+ * duration) and the duration of which the object is in memory (allocation
+ * duration).  If the objects are still pinned at the end of the pin duration,
+ * the object cache manager will automatically unpin the objects for the
+ * client. If the objects still exist at the end of the allocation duration,
+ * the object cache manager will automatically free the objects for the client.
+ *
+ * Objects that are pinned with the option OCI_DURATION_TRANS will get unpinned
+ * automatically at the end of the current transaction.
+ *
+ * Objects that are pinned with the option OCI_DURATION_SESSION will get
+ * unpinned automatically at the end of the current session (connection).
+ *
+ * The option OCI_DURATION_NULL is used when the client does not want to set
+ * the pin duration.  If the object is already loaded into the cache, then the
+ * pin duration will remain the same.  If the object is not yet loaded, the
+ * pin duration of the object will be set to OCI_DURATION_DEFAULT.
+ */
+
+/*----------------------------- OBJECT PROPERTY -----------------------------*/
+ 
+/******************************************************************************
+**  DO NOT USE OCIObjectProperty. IT IS UNSUPPORTED                          **
+**  WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                              **
+******************************************************************************/
+enum OCIObjectProperty
+{
+  /* 0 = uninitialized */
+  OCI_OBJECTPROP_DIRTIED = 1,                               /* dirty objects */
+  OCI_OBJECTPROP_LOADED,                /* objects loaded in the transaction */
+  OCI_OBJECTPROP_LOCKED                                    /* locked objects */
+};
+typedef enum OCIObjectProperty OCIObjectProperty;
+/*
+ * OCIObjectProperty -- OCI Object Property
+ * This specifies the properties of objects in the object cache.
+ */
+
+/*------------------------- CACHE REFRESH OPTION ---------------------------*/
+
+enum OCIRefreshOpt
+{
+  /* 0 = uninitialized */
+  OCI_REFRESH_LOADED = 1        /* refresh objects loaded in the transaction */
+};
+typedef enum OCIRefreshOpt OCIRefreshOpt; 
+/*
+ * OCIRefreshOpt - OCI cache Refresh Option
+ * This option is used to specify the set of objects to be refreshed. 
+ *
+ * OCI_REFRESH_LOAD refreshes the objects that are loaded in the current  
+ * transaction. 
+ */
+
+/*-------------------------------- OBJECT EVENT -----------------------------*/
+
+/******************************************************************************
+**  DO NOT USE OCIObjectEvent. IT IS UNSUPPORTED                             **
+**  WILL BE REMOVED/CHANGED IN A FUTURE RELEASE                              **
+******************************************************************************/
+enum OCIObjectEvent
+{
+   /* 0 = uninitialized */
+   OCI_OBJECTEVENT_BEFORE_FLUSH = 1,            /* before flushing the cache */
+   OCI_OBJECTEVENT_AFTER_FLUSH,                  /* after flushing the cache */
+   OCI_OBJECTEVENT_BEFORE_REFRESH,            /* before refreshing the cache */
+   OCI_OBJECTEVENT_AFTER_REFRESH,              /* after refreshing the cache */
+   OCI_OBJECTEVENT_WHEN_MARK_UPDATED,    /* when an object is marked updated */
+   OCI_OBJECTEVENT_WHEN_MARK_DELETED,    /* when an object is marked deleted */
+   OCI_OBJECTEVENT_WHEN_UNMARK,          /* when an object is being unmarked */
+   OCI_OBJECTEVENT_WHEN_LOCK               /* when an object is being locked */
+};
+typedef enum OCIObjectEvent OCIObjectEvent;
+/*
+ * OCIObjectEvent -- OCI Object Event 
+ * This specifies the kind of event that is supported by the object
+ * cache.  The program can register a callback that is invoked when the  
+ * specified event occurs.
+ */
+
+/*----------------------------- OBJECT COPY OPTION --------------------------*/
+#define OCI_OBJECTCOPY_NOREF (ub1)0x01 
+/*
+ * OCIObjectCopyFlag - Object copy flag
+ *
+ * If OCI_OBJECTCOPY_NOREF is specified when copying an instance, the 
+ * reference and lob will not be copied to the target instance.
+ */
+
+/*----------------------------- OBJECT FREE OPTION --------------------------*/
+#define OCI_OBJECTFREE_FORCE      (ub2)0x0001
+#define OCI_OBJECTFREE_NONULL     (ub2)0x0002
+#define OCI_OBJECTFREE_HEADER     (ub2)0x0004
+/*
+ * OCIObjectFreeFlag - Object free flag
+ *
+ * If OCI_OBJECTCOPY_FORCE is specified when freeing an instance, the instance
+ * is freed regardless it is pinned or diritied.
+ * If OCI_OBJECTCOPY_NONULL is specified when freeing an instance, the null 
+ * structure is not freed.
+ */
+
+/*----------------------- OBJECT PROPERTY ID -------------------------------*/
+
+typedef ub1 OCIObjectPropId;
+#define OCI_OBJECTPROP_LIFETIME 1       /* persistent or transient or value */
+#define OCI_OBJECTPROP_SCHEMA 2   /* schema name of table containing object */
+#define OCI_OBJECTPROP_TABLE 3     /* table name of table containing object */
+#define OCI_OBJECTPROP_PIN_DURATION 4             /* pin duartion of object */
+#define OCI_OBJECTPROP_ALLOC_DURATION 5         /* alloc duartion of object */
+#define OCI_OBJECTPROP_LOCK 6                      /* lock status of object */
+#define OCI_OBJECTPROP_MARKSTATUS 7                /* mark status of object */
+#define OCI_OBJECTPROP_VIEW 8            /* is object a view object or not? */
+
+/*
+ * OCIObjectPropId - OCI Object Property Id
+ * Identifies the different properties of objects.
+ */
+
+/*----------------------- OBJECT LIFETIME ----------------------------------*/
+
+enum OCIObjectLifetime
+{
+   /* 0 = uninitialized */
+   OCI_OBJECT_PERSISTENT = 1,                          /* persistent object */
+   OCI_OBJECT_TRANSIENT,                                /* transient object */
+   OCI_OBJECT_VALUE                                         /* value object */
+};
+typedef enum OCIObjectLifetime OCIObjectLifetime;
+/*
+ * OCIObjectLifetime - OCI Object Lifetime
+ * Classifies objects depending upon the lifetime and referenceability 
+ * of the object.
+ */
+
+/*----------------------- OBJECT MARK STATUS -------------------------------*/
+
+typedef uword OCIObjectMarkStatus;
+#define OCI_OBJECT_NEW     0x0001                             /* new object */
+#define OCI_OBJECT_DELETED 0x0002                  /* object marked deleted */
+#define OCI_OBJECT_UPDATED 0x0004                  /* object marked updated */
+/*
+ * OCIObjectMarkStatus - OCI Object Mark Status
+ * Status of the object - new or updated or deleted
+ */
+
+/* macros to test the object mark status */ 
+#define OCI_OBJECT_IS_UPDATED(flag) bit((flag), OCI_OBJECT_UPDATED)
+#define OCI_OBJECT_IS_DELETED(flag) bit((flag), OCI_OBJECT_DELETED)
+#define OCI_OBJECT_IS_NEW(flag) bit((flag), OCI_OBJECT_NEW)
+#define OCI_OBJECT_IS_DIRTY(flag) \
+  bit((flag), OCI_OBJECT_UPDATED|OCI_OBJECT_NEW|OCI_OBJECT_DELETED)
+
+/*---------------------------------------------------------------------------*/
+/*                               TYPE MANAGER                                */
+/*---------------------------------------------------------------------------*/
+
+/*------------------------------ TYPE CODE ----------------------------------*/
+
+/*
+ * Type manager typecodes
+ *
+ * These are typecodes designed to be used with the type manager;
+ * they also include longer, more readable versions of existing SQLT names.
+ * Those types that are directly related to existing SQLT types are #define'd
+ * to their SQLT equivalents.
+ *
+ * The type manager typecodes are designed to be useable for all OCI calls.
+ * They are in the range from 192 to 320 for typecodes, so as not to conflict
+ * with existing OCI SQLT typecodes (see ocidfn.h).
+ */
+
+#define OCI_TYPECODE_REF         SQLT_REF        /* SQL/OTS OBJECT REFERENCE */
+#define OCI_TYPECODE_DATE        SQLT_DAT              /* SQL DATE  OTS DATE */
+#define OCI_TYPECODE_SIGNED8     27      /* SQL SIGNED INTEGER(8)  OTS SINT8 */
+#define OCI_TYPECODE_SIGNED16    28    /* SQL SIGNED INTEGER(16)  OTS SINT16 */
+#define OCI_TYPECODE_SIGNED32    29    /* SQL SIGNED INTEGER(32)  OTS SINT32 */
+#define OCI_TYPECODE_REAL        21                /* SQL REAL  OTS SQL_REAL */
+#define OCI_TYPECODE_DOUBLE      22  /* SQL DOUBLE PRECISION  OTS SQL_DOUBLE */
+#define OCI_TYPECODE_BFLOAT      SQLT_IBFLOAT       /* Binary float */ 
+#define OCI_TYPECODE_BDOUBLE     SQLT_IBDOUBLE  /* Binary double */
+#define OCI_TYPECODE_FLOAT       SQLT_FLT      /* SQL FLOAT(P)  OTS FLOAT(P) */
+#define OCI_TYPECODE_NUMBER      SQLT_NUM/* SQL NUMBER(P S)  OTS NUMBER(P S) */
+#define OCI_TYPECODE_DECIMAL     SQLT_PDN
+                                       /* SQL DECIMAL(P S)  OTS DECIMAL(P S) */
+#define OCI_TYPECODE_UNSIGNED8   SQLT_BIN
+                                       /* SQL UNSIGNED INTEGER(8)  OTS UINT8 */
+#define OCI_TYPECODE_UNSIGNED16  25  /* SQL UNSIGNED INTEGER(16)  OTS UINT16 */
+#define OCI_TYPECODE_UNSIGNED32  26  /* SQL UNSIGNED INTEGER(32)  OTS UINT32 */
+#define OCI_TYPECODE_OCTET       245                   /* SQL ???  OTS OCTET */
+#define OCI_TYPECODE_SMALLINT    246           /* SQL SMALLINT  OTS SMALLINT */
+#define OCI_TYPECODE_INTEGER     SQLT_INT        /* SQL INTEGER  OTS INTEGER */
+#define OCI_TYPECODE_RAW         SQLT_LVB          /* SQL RAW(N)  OTS RAW(N) */
+#define OCI_TYPECODE_PTR         32              /* SQL POINTER  OTS POINTER */
+#define OCI_TYPECODE_VARCHAR2    SQLT_VCS
+                                     /* SQL VARCHAR2(N)  OTS SQL_VARCHAR2(N) */
+#define OCI_TYPECODE_CHAR        SQLT_AFC    /* SQL CHAR(N)  OTS SQL_CHAR(N) */
+#define OCI_TYPECODE_VARCHAR     SQLT_CHR
+                                       /* SQL VARCHAR(N)  OTS SQL_VARCHAR(N) */
+#define OCI_TYPECODE_MLSLABEL    SQLT_LAB                    /* OTS MLSLABEL */
+#define OCI_TYPECODE_VARRAY      247         /* SQL VARRAY  OTS PAGED VARRAY */
+#define OCI_TYPECODE_TABLE       248              /* SQL TABLE  OTS MULTISET */
+#define OCI_TYPECODE_OBJECT      SQLT_NTY       /* SQL/OTS NAMED OBJECT TYPE */
+#define OCI_TYPECODE_OPAQUE       58                /*  SQL/OTS Opaque Types */
+#define OCI_TYPECODE_NAMEDCOLLECTION  SQLT_NCO
+                                            /* SQL/OTS NAMED COLLECTION TYPE */
+#define OCI_TYPECODE_BLOB        SQLT_BLOB    /* SQL/OTS BINARY LARGE OBJECT */
+#define OCI_TYPECODE_BFILE       SQLT_BFILE    /* SQL/OTS BINARY FILE OBJECT */
+#define OCI_TYPECODE_CLOB        SQLT_CLOB /* SQL/OTS CHARACTER LARGE OBJECT */
+#define OCI_TYPECODE_CFILE       SQLT_CFILE /* SQL/OTS CHARACTER FILE OBJECT */
+
+/* the following are ANSI datetime datatypes added in 8.1 */
+#define OCI_TYPECODE_TIME        SQLT_TIME                   /* SQL/OTS TIME */
+#define OCI_TYPECODE_TIME_TZ     SQLT_TIME_TZ             /* SQL/OTS TIME_TZ */
+#define OCI_TYPECODE_TIMESTAMP   SQLT_TIMESTAMP         /* SQL/OTS TIMESTAMP */
+#define OCI_TYPECODE_TIMESTAMP_TZ  SQLT_TIMESTAMP_TZ /* SQL/OTS TIMESTAMP_TZ */
+
+#define OCI_TYPECODE_TIMESTAMP_LTZ  SQLT_TIMESTAMP_LTZ /* TIMESTAMP_LTZ */
+
+#define OCI_TYPECODE_INTERVAL_YM SQLT_INTERVAL_YM   /* SQL/OTS INTRVL YR-MON */
+#define OCI_TYPECODE_INTERVAL_DS SQLT_INTERVAL_DS  /* SQL/OTS INTRVL DAY-SEC */
+#define OCI_TYPECODE_UROWID      SQLT_RDD                     /* Urowid type */
+
+
+#define OCI_TYPECODE_OTMFIRST    228     /* first Open Type Manager typecode */
+#define OCI_TYPECODE_OTMLAST     320                    /* last OTM typecode */
+#define OCI_TYPECODE_SYSFIRST    228     /* first OTM system type (internal) */
+#define OCI_TYPECODE_SYSLAST     235      /* last OTM system type (internal) */
+#define OCI_TYPECODE_PLS_INTEGER   266     /* type code for PLS_INTEGER */
+
+/* the following are PL/SQL-only internal. They should not be used */
+#define OCI_TYPECODE_ITABLE      SQLT_TAB             /* PLSQL indexed table */
+#define OCI_TYPECODE_RECORD      SQLT_REC                    /* PLSQL record */
+#define OCI_TYPECODE_BOOLEAN     SQLT_BOL                   /* PLSQL boolean */
+
+/* NOTE : The following NCHAR related codes are just short forms for saying
+   OCI_TYPECODE_VARCHAR2 with a charset form of SQLCS_NCHAR. These codes are
+   intended for use in the OCIAnyData API only and nowhere else. */
+#define OCI_TYPECODE_NCHAR       286
+#define OCI_TYPECODE_NVARCHAR2   287
+#define OCI_TYPECODE_NCLOB       288
+
+
+/* To indicate absence of typecode being specified */
+#define OCI_TYPECODE_NONE          0
+/* To indicate error has to be taken from error handle - reserved for
+   sqlplus use */
+#define OCI_TYPECODE_ERRHP         283
+
+/* The OCITypeCode type is interchangeable with the existing SQLT type
+   which is a ub2 */
+typedef ub2 OCITypeCode;
+
+
+/*----------------------- GET OPTIONS FOR TDO  ------------------------------*/
+
+enum OCITypeGetOpt
+{
+  OCI_TYPEGET_HEADER,
+                /* load only the header portion of the TDO when getting type */
+  OCI_TYPEGET_ALL       /* load all attribute and method descriptors as well */
+};
+typedef enum OCITypeGetOpt OCITypeGetOpt;
+
+/*
+ * OCITypeGetOpt
+ *
+ * This is the flag passed to OCIGetTypeArray() to indicate how the TDO is
+ * going to be loaded into the object cache.
+ * OCI_TYPEGET_HEADER implies that only the header portion is to be loaded
+ * initially, with the rest loaded in on a 'lazy' basis. Only the header is
+ * needed for PL/SQL and OCI operations. OCI_TYPEGET_ALL implies that ALL
+ * the attributes and methods belonging to a TDO will be loaded into the
+ * object cache in one round trip. Hence it will take much longer to execute,
+ * but will ensure that no more loading needs to be done when pinning ADOs
+ * etc. This is only needed if your code needs to examine and manipulate
+ * attribute and method information.
+ *
+ * The default is OCI_TYPEGET_HEADER.
+ */
+
+
+/*------------------------ TYPE ENCAPSULTATION LEVEL ------------------------*/
+
+enum OCITypeEncap
+{
+  /* 0 = uninitialized */
+  OCI_TYPEENCAP_PRIVATE,                /* private: only internally visible */
+  OCI_TYPEENCAP_PUBLIC /* public: visible to both internally and externally */
+};
+typedef enum OCITypeEncap OCITypeEncap;
+/*
+ * OCITypeEncap - OCI Encapsulation Level
+ */
+
+
+/*---------------------------- TYPE METHOD FLAGS ----------------------------*/
+
+enum OCITypeMethodFlag
+{
+  OCI_TYPEMETHOD_INLINE = 0x0001,                                  /* inline */
+  OCI_TYPEMETHOD_CONSTANT = 0x0002,                              /* constant */
+  OCI_TYPEMETHOD_VIRTUAL = 0x0004,                                /* virtual */
+  OCI_TYPEMETHOD_CONSTRUCTOR = 0x0008,                        /* constructor */
+  OCI_TYPEMETHOD_DESTRUCTOR = 0x0010,                          /* destructor */
+  OCI_TYPEMETHOD_OPERATOR  = 0x0020,                             /* operator */
+  OCI_TYPEMETHOD_SELFISH = 0x0040,     /* selfish method (generic otherwise) */
+
+  OCI_TYPEMETHOD_MAP = 0x0080,                    /* map (relative ordering) */
+  OCI_TYPEMETHOD_ORDER  = 0x0100,               /* order (relative ordering) */
+  /* OCI_TYPEMETHOD_MAP and OCI_TYPEMETHOD_ORDER are mutually exclusive */
+
+  OCI_TYPEMETHOD_RNDS= 0x0200,               /* Read no Data State (default) */
+  OCI_TYPEMETHOD_WNDS= 0x0400,                        /* Write no Data State */
+  OCI_TYPEMETHOD_RNPS= 0x0800,                      /* Read no Process State */
+  OCI_TYPEMETHOD_WNPS= 0x1000,                     /* Write no Process State */
+  OCI_TYPEMETHOD_ABSTRACT = 0x2000,    /* abstract (not instantiable) method */
+  OCI_TYPEMETHOD_OVERRIDING = 0x4000,                   /* overriding method */
+  OCI_TYPEMETHOD_PIPELINED = 0x8000                   /* method is pipelined */
+};
+typedef enum OCITypeMethodFlag OCITypeMethodFlag;
+
+/* macros to test the type method flags */
+#define OCI_METHOD_IS_INLINE(flag) bit((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_METHOD_IS_CONSTANT(flag) bit((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_METHOD_IS_VIRTUAL(flag) bit((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_METHOD_IS_CONSTRUCTOR(flag) bit((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_METHOD_IS_DESTRUCTOR(flag) bit((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_METHOD_IS_OPERATOR(flag) bit((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_METHOD_IS_SELFISH(flag) bit((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_METHOD_IS_MAP(flag) bit((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_METHOD_IS_ORDER(flag) bit((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_METHOD_IS_RNDS(flag) bit((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_METHOD_IS_WNDS(flag) bit((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_METHOD_IS_RNPS(flag) bit((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_METHOD_IS_WNPS(flag) bit((flag), OCI_TYPEMETHOD_WNPS)
+#define OCI_METHOD_IS_ABSTRACT(flag) bit((flag), OCI_TYPEMETHOD_ABSTRACT)
+#define OCI_METHOD_IS_OVERRIDING(flag) bit((flag), OCI_TYPEMETHOD_OVERRIDING)
+#define OCI_METHOD_IS_PIPELINED(flag) bit((flag), OCI_TYPEMETHOD_PIPELINED)
+
+#define OCI_TYPEMETHOD_IS_INLINE(flag) bit((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_IS_CONSTANT(flag) bit((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_IS_VIRTUAL(flag) bit((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_IS_CONSTRUCTOR(flag) \
+  bit((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_IS_DESTRUCTOR(flag) \
+  bit((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_IS_OPERATOR(flag) bit((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_IS_SELFISH(flag) bit((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_IS_MAP(flag) bit((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_IS_ORDER(flag) bit((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_IS_RNDS(flag) bit((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_IS_WNDS(flag) bit((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_IS_RNPS(flag) bit((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_IS_WNPS(flag) bit((flag), OCI_TYPEMETHOD_WNPS)
+#define OCI_TYPEMETHOD_IS_ABSTRACT(flag) bit((flag), OCI_TYPEMETHOD_ABSTRACT)
+#define OCI_TYPEMETHOD_IS_OVERRIDING(flag) \
+  bit((flag), OCI_TYPEMETHOD_OVERRIDING)
+#define OCI_TYPEMETHOD_IS_PIPELINED(flag) bit((flag), OCI_TYPEMETHOD_PIPELINED)
+
+/* macros to set the type method flags */
+#define OCI_TYPEMETHOD_SET_INLINE(flag) bis((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_SET_CONSTANT(flag) bis((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_SET_VIRTUAL(flag) bis((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_SET_CONSTRUCTOR(flag) \
+  bis((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_SET_DESTRUCTOR(flag) \
+  bis((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_SET_OPERATOR(flag) bis((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_SET_SELFISH(flag) bis((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_SET_MAP(flag) bis((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_SET_ORDER(flag) bis((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_SET_RNDS(flag) bis((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_SET_WNDS(flag) bis((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_SET_RNPS(flag) bis((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_SET_WNPS(flag) bis((flag), OCI_TYPEMETHOD_WNPS)
+
+/* macros to clear the type method flags */
+#define OCI_TYPEMETHOD_CLEAR_INLINE(flag) bic((flag), OCI_TYPEMETHOD_INLINE)
+#define OCI_TYPEMETHOD_CLEAR_CONSTANT(flag) \
+  bic((flag), OCI_TYPEMETHOD_CONSTANT)
+#define OCI_TYPEMETHOD_CLEAR_VIRTUAL(flag) bic((flag), OCI_TYPEMETHOD_VIRTUAL)
+#define OCI_TYPEMETHOD_CLEAR_CONSTRUCTOR(flag) \
+  bic((flag), OCI_TYPEMETHOD_CONSTRUCTOR)
+#define OCI_TYPEMETHOD_CLEAR_DESTRUCTOR(flag) \
+  bic((flag), OCI_TYPEMETHOD_DESTRUCTOR)
+#define OCI_TYPEMETHOD_CLEAR_OPERATOR(flag) \
+  bic((flag), OCI_TYPEMETHOD_OPERATOR)
+#define OCI_TYPEMETHOD_CLEAR_SELFISH(flag) bic((flag), OCI_TYPEMETHOD_SELFISH)
+#define OCI_TYPEMETHOD_CLEAR_MAP(flag) bic((flag), OCI_TYPEMETHOD_MAP)
+#define OCI_TYPEMETHOD_CLEAR_ORDER(flag) bic((flag), OCI_TYPEMETHOD_ORDER)
+#define OCI_TYPEMETHOD_CLEAR_RNDS(flag) bic((flag), OCI_TYPEMETHOD_RNDS)
+#define OCI_TYPEMETHOD_CLEAR_WNDS(flag) bic((flag), OCI_TYPEMETHOD_WNDS)
+#define OCI_TYPEMETHOD_CLEAR_RNPS(flag) bic((flag), OCI_TYPEMETHOD_RNPS)
+#define OCI_TYPEMETHOD_CLEAR_WNPS(flag) bic((flag), OCI_TYPEMETHOD_WNPS)
+
+/*--------------------------- TYPE PARAMETER MODE ---------------------------*/
+
+enum OCITypeParamMode
+{
+  /* PL/SQL starts this from 0 */
+  OCI_TYPEPARAM_IN = 0,                                                /* in */
+  OCI_TYPEPARAM_OUT,                                                  /* out */
+  OCI_TYPEPARAM_INOUT,                                             /* in-out */
+  OCI_TYPEPARAM_BYREF,              /* call by reference (implicitly in-out) */
+  OCI_TYPEPARAM_OUTNCPY,                         /* OUT with NOCOPY modifier */
+  OCI_TYPEPARAM_INOUTNCPY                     /* IN OUT with NOCOPY modifier */
+};
+typedef enum OCITypeParamMode OCITypeParamMode;
+
+
+/*-------------------------------- DEFAULTS ---------------------------------*/
+
+/* default binary and decimal precision and scale */
+
+#define OCI_NUMBER_DEFAULTPREC ((ub1)0)            /* no precision specified */
+#define OCI_NUMBER_DEFAULTSCALE ((sb1)MAXSB1MINVAL)
+                                        /* no binary/decimal scale specified */
+
+/* default maximum length for varrays and vstrings (used in sql.bsq) */
+
+#define OCI_VARRAY_MAXSIZE 4000
+                          /* default maximum number of elements for a varray */
+#define OCI_STRING_MAXLEN  4000     /* default maximum length of a vstring */
+
+/*---------------------------------------------------------------------------*/
+/* This set of macro is used only in beta2. They should be removed as soon as
+ * PLSQL has made the changes of not using these macros.
+ */
+ 
+/* Special duration for allocating memory only. No instance can be allocated
+ * given these durations.
+ */
+#define OCICoherency OCIRefreshOpt
+#define OCI_COHERENCY_NONE   (OCIRefreshOpt)2
+#define OCI_COHERENCY_NULL   (OCIRefreshOpt)4
+#define OCI_COHERENCY_ALWAYS (OCIRefreshOpt)5
+
+#endif /* ORO_ORACLE */
+
diff --git a/src/terralib/drivers/OracleSpatial/OCI/include/ort.h b/src/terralib/drivers/OracleSpatial/OCI/include/ort.h
new file mode 100644
index 0000000..3dda9fc
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/OCI/include/ort.h
@@ -0,0 +1,2593 @@
+/* @(#)ort.h    1.44 95/07/07 */
+
+/* Copyright (c) 1994, 2003, Oracle Corporation.  All rights reserved.  */
+
+/* 
+  NAME
+
+    ORT - ORacle's external open Type interface to the open type manager (OTM)
+
+  DESCRIPTION
+
+    The open type manager interface includes dynamic type operations to
+    create, delete, update, and access types.  See the "Functional
+    Specification for Oracle Object Call Interface (Objects Project),
+    Version 1.0" for a user level description of the OTM.  For a more
+    detailed description, see the "Component Document for the Open Type
+    Manager, Version 1.0".
+
+    NOTE: MOST Of the functions in this header file are being desupported.
+          Please use the OCIDescribeAny interface as described in oci.h
+          instead.
+          The OCIType, OCITypeElem, OCITypeMethod abstract types continue
+          to be supported. The only two functions that remain to be documented
+          are OCITypeArrayByName and OCITypeArrayByRef.
+          All obsolete types/functions are marked accordingly below.
+
+  RELATED DOCUMENTS
+
+    For the functional specification for the OTM, see: 
+        [1] Kotsovolos, Susan, "Functional Specification for Oracle Object
+            Call Interface (Objects Project), Version 1.0", Oracle
+            Corporation, February 1995.
+    For the internal design of the OTM, see the following:
+        [2] Kotsovolos, Susan, "Component Document for the Open Type Manager",
+            Oracle Corporation, November 1994. 
+        [3] Kotsovolos, Susan, "Design for The Open Type Manager, Oracle 
+            Object Management Subsystem Version 1.0", Oracle Corporation, 
+            March 1994.
+        [4] Kotsovolos, Susan and Tin A. Nguyen, "The Open Type Manager",
+            Oracle Corporation, March 1994.
+        [5] Kotsovolos, Susan and Tin A. Nguyen, "Schema Evolution",
+            Oracle Corporation, March 1994.
+    For a description of the types the OTM must support, see:
+        [6] Nguyen, Tin A., "The Open Type System", Oracle Corporation, 
+            February 1994. 
+
+  INSPECTION STATUS 
+
+    Inspection date:    
+    Inspection status: 
+    Estimated increasing cost defects per page:
+    Rule sets:        
+
+  ACCEPTANCE REVIEW STATUS 
+
+    Review date:    
+    Review status:
+    Reviewers:  
+
+
+  **** ALL OBSOLETE FUNCTIONS/TYPES ARE MARKED ACCORDINGLY ***
+
+  EXPORT FUNCTIONS
+
+    None
+
+  PUBLIC DATA STRUCTURES
+
+      OCIType - type descriptor in the object cache
+      OCITypeElem - type element descriptor in the object cache
+            (used for attributes and paramters)
+      OCITypeCode  - Open Type System type code.
+      OCITypeMethod - method descriptor in the object cache
+      OCITypeParamMode - parameter modes (ie. IN, IN-OUT etc)
+
+  PUBLIC FUNCTIONS
+
+    ITERATOR (for OCITypeAttrNext and OCITypeMethodNext)
+
+      OCITypeIterNew  - ** OBSOLETE ** Create new instance of an iteraton.
+      OCITypeIterSet  - ** OBSOLETE ** Initialize iterator.
+      OCITypeIterFree - ** OBSOLETE ** Free instance of iterator.
+
+    TYPE GET
+
+      OCITypeByName      - ** OBSOLETE ** Get a type by name.
+      OCITypeArrayByName - Get an array of types by their names.
+      OCITypeByRef       - ** OBSOLETE ** Get a type by its CREF.
+      OCITypeArrayByRef  - Get an array of types by their CREFs.
+
+    TYPE ACCESSORS
+
+      OCITypeName     - ** OBSOLETE ** OCI Get a type's name.
+      OCITypeSchema   - ** OBSOLETE ** OCI Get a type's schema name.
+      OCITypeTypeCode - ** OBSOLETE ** OCI Get a type's type code.
+      OCITypeVersion  - ** OBSOLETE ** OCI Get a Type's user-readable Version.
+      OCITypeAttrs    - ** OBSOLETE ** OCI Get a Type's Number of Attributes.
+      OCITypeMethods  - ** OBSOLETE ** OCI Get a Type's Number of Methods.
+
+    TYPE ELEMENT ACCESSORS (they represent attributes/parameters/results)
+
+      OCITypeElemName      - ** OBSOLETE ** Get a type element's (only for
+                                attributes) name.
+      OCITypeElemType      - ** OBSOLETE ** Get a type element's type
+                                descriptor.
+      OCITypeElemTypeCode  - ** OBSOLETE ** Get a type element's typecode.
+      OCITypeElemParameterizedType - ** OBSOLETE ** Get a type element's
+                                        parameterized type's type descriptor.
+      OCITypeElemNumPrec   - ** OBSOLETE ** Get a number's precision.
+      OCITypeElemNumScale  - ** OBSOLETE ** Get a decimal or oracle Number's
+                                            Scale
+      OCITypeElemCharSetID - ** OBSOLETE ** Get a fixed or variable length
+                                            string's character set ID.
+      OCITypeElemCharSetForm - ** OBSOLETE ** Get a fixed or variable length
+                                              string's character set form (how
+                                              character set information has
+                                              been specified).
+      OCITypeElemLength    - ** OBSOLETE ** Get a raw, fixed or variable
+                                            length string's length.
+      OCITypeElemParamMode - ** OBSOLETE ** Get element's parameter's mode
+                                            (only valid for parameter).
+      OCITypeElemDefaultValue - ** OBSOLETE ** Get element's Default Value.
+
+    ATTRIBUTE ACCESSORS
+
+      OCITypeAttrByName - ** OBSOLETE ** Get an Attribute by Name.
+      OCITypeAttrNext   - ** OBSOLETE ** Get an Attribute by Iteration.
+
+    COLLECTION ACCESSORS
+
+      OCITypeCollTypeCode - ** OBSOLETE ** Get a named collection's typecode.
+      OCITypeCollElem     - ** OBSOLETE ** Get a named collection's element's
+                               type element information.
+      OCITypeCollSize     - ** OBSOLETE ** Get a named collection's size in
+                               number of elements.
+
+    METHOD ACCESSORS
+
+      OCITypeMethodOverload - ** OBSOLETE ** Get number of overloaded methods
+                                             with the given method name.
+                                             (no direct equivalent for
+                                              OCIDescribe interface)
+      OCITypeMethodByName   - ** OBSOLETE ** Get one or more methods by name.
+      OCITypeMethodNext     - ** OBSOLETE ** Iterate to the next method to
+                                             retrieve.
+      OCITypeMethodName     - ** OBSOLETE ** Get method's name.
+      OCITypeMethodEncap    - ** OBSOLETE ** Get method's encapsulation level. 
+      OCITypeMethodFlags    - ** OBSOLETE ** et method's flags.
+      OCITypeMethodMap      - ** OBSOLETE ** Get type's map function.
+      OCITypeMethodOrder    - ** OBSOLETE ** Get type's order function.
+      OCITypeMethodParams   - ** OBSOLETE ** Get a method's number of
+                                             parameters.
+
+    RESULT ACCESSORS
+
+      OCITypeResult - ** OBSOLETE ** OCI Get a method's Result.
+
+      See also ATTRIBUTE/PARAMETER/RESULT TYPE ACCESSORS.
+
+    PARAMETER ACCESSORS
+
+      OCITypeParamByPos  - ** OBSOLETE ** Get a Parameter in a method By
+                                          Position.
+      OCITypeParamByName - ** OBSOLETE ** Get a Parameter in a method By Name.
+      OCITypeParamPos    - ** OBSOLETE ** Get a Parameter's PoSition in a
+                                          method.
+
+  CALL GRAPHS:
+
+  Only type accessors are supported for 8.0.
+  ** OBSOLETE ** please use OCIDescribe interface
+
+  TYPE ACCESSOR EXAMPLE
+
+      CREATE TYPE CAR
+      (
+        name   vstring,
+        age    number,
+          number   car_age;                           /o Oracle number o/
+          weight   car_weight;                        /o abstract type o/
+
+        PUBLIC: 
+
+          /o methods o/
+          car(orlvs a_name, number an_age, WEIGHT a_weight);
+          ~car();
+          inline number get_age() const;
+          
+          /o relative ordering (map) functions o/
+          number car_map
+      );
+
+      /o the following code accesses the type created above o/
+
+      ub1      meth_flags;
+      ub4      i, j; 
+      ub4      text_len, position;
+      ub4      count;
+      ub4      length;
+      OCITypeCode    typecode;
+      OCIRef  *attr_ref;
+      OCIRef  *param_ref;
+      OCIType  *tdo, new_tdo, final_tdo;
+      OCITypeElem  *elem;
+      OCITypeIter  *iterator_ort;
+      oratext   (*names)[];
+      ub4      lengths[];
+      ub4     *positions;
+      oratext    *name;
+      oratext     name_buffer[M_IDEN];
+
+      /o initialize the references o/
+      DISCARD orlrini(env, err, (dvoid *)&attr_ref);
+      DISCARD orlrini(env, err, (dvoid *)&param_ref);
+
+      /o ----------------- GET INFORMATION ABOUT A TYPE ----------------- o/
+
+      /o start a transaction o/
+      
+      /o Pin the type until the end of the transaction.  Pinning the type is 
+       o required before using any type accessors. 
+       o/
+      if (OCITypeByName(env, err, svc, (oratext *)0, 0, "CAR", strlen("CAR"), 
+                  OCI_DURATION_TRANS, &car_ref, &car_tdo) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get the type's name o/
+      if (!memcmp(OCITypeName(env, err, car_tdo, &text_len), "person",
+                              text_len))
+        /o do something o/ ;
+
+      /o get the type's schema name o/
+      if (!memcmp(OCITypeSchema(env, err, car_tdo, &text_len), "john",
+                  text_len))
+        /o do something o/ ;
+
+      /o get the type code of the type o/
+      if (OCITypeTypeCode(env, err, car_tdo) == OCI_TYPECODE_ADT)
+        /o do something o/ ; 
+
+      /o get the type version o/
+      if (!memcmp(OCITypeVersion(env, err, car_tdo, &text_len), "1", text_len))
+         /o do something o/  ;
+
+      /o ------- GET FLATTENED POSITION OF AN ATTRIBUTES IN A TYPE ------- o/
+
+      names = malloc(sizeof(oratext *) * 2);
+      names[0] = malloc(strlen("car_weight"));
+      names[1] = malloc(strlen("ounces"));
+      memcpy(names[0], "car_weight", strlen("car_weight"));
+      memcpy(names[1], "ounces", strlen("ounces"));
+
+      lengths = malloc(sizeof(ub4) * 2);
+      lengths[0] = strlen("car_weight");
+      lengths[1] = strlen("ounces");
+
+      /o ---------- GET IMMEDIATE ATTRIBUTES IN A TYPE ---------- o/
+
+      /o loop through all attributes in the type with iterator o/
+      if (OCITypeIterNew(env, err, car_tdo, &iterator_ort) != OCI_SUCCESS)
+        /o do something o/
+
+      while (OCITypeAttrNext(env, err, iterator_ort, &ado) != OCI_NO_DATA)
+      {
+        /o get the attribute's name o/
+        if (!memcmp(OCITypeElemName(env, err, ado, &text_len),
+                                    "tiger", text_len))
+          /o do something o/  ;
+
+        /o get the attribute's type descriptor o/
+        if (OCITypeElemType(env, err, ado, &tdo) != OCI_SUCCESS)
+          /o error o/ ;
+
+        /o get the attribute's type code o/
+        typecode = OCITypeElemTypeCode(env, err, ado);
+
+        switch (typecode)
+        {
+        /o scalar types o/
+        case OCI_TYPECODE_DATE:                                     /o date o/
+        case OCI_TYPECODE_SIGNED8:                                  /o byte o/
+        case OCI_TYPECODE_SIGNED16:                                /o short o/
+        case OCI_TYPECODE_UNSIGNED8:                       /o unsigned byte o/
+        case OCI_TYPECODE_UNSIGNED16:                     /o unsigned short o/
+        case OCI_TYPECODE_OCTET:                                   /o octet o/
+        case OCI_TYPECODE_TABLE:                            /o nested table o/
+        case OCI_TYPECODE_CLOB:                            /o character lob o/
+        case OCI_TYPECODE_BLOB:                               /o binary lob o/
+        case OCI_TYPECODE_CFILE:                   /o character file object o/
+        case OCI_TYPECODE_BFILE:                      /o binary file object o/
+
+          /o do something o/
+          break;
+
+        /o number types o/
+        case OCI_TYPECODE_NUMBER:                          /o oracle number o/
+        case OCI_TYPECODE_DECIMAL:                               /o decimal o/
+          {
+            /o get the scale of the number o/
+            if (OCITypeElemNumScale(env, err, ado) == 3)
+              /o do something o/ ;
+          }
+          /o fall through to get the precision o/
+
+        case OCI_TYPECODE_FLOAT:                                   /o float o/
+        case OCI_TYPECODE_SIGNED32:                                 /o long o/
+        case OCI_TYPECODE_UNSIGNED32:                      /o unsigned long o/
+        case OCI_TYPECODE_REAL:                                     /o real o/
+        case OCI_TYPECODE_DOUBLE:                                 /o double o/
+          {
+            /o get the precision of the number o/
+            if (OCITypeElemNumPrec(env, err, ado) == 2)
+              /o do something o/ ;
+          }
+          break;
+
+        /o string types o/
+        case OCI_TYPECODE_CHAR:                      /o fixed length string o/
+        case OCI_TYPECODE_VARCHAR2:               /o variable length string o/
+        case OCI_TYPECODE_RAW:                                       /o raw o/
+          {
+            /o get the length of the fixed or variable length string o/
+            if (OCITypeElemLength(env, err, ado) < 100)
+              /o do something o/
+          }
+          break;
+
+        /o parameterized types o/
+        case OCI_TYPECODE_REF:                          /o reference o/
+        case OCI_TYPECODE_PTR:                            /o pointer o/
+          {
+            /o get the type stored in the parameterized type o/
+            if (OCITypeElemParameterizedType(env, err, ado, &tdo)
+                 != OCI_SUCCESS)
+              /o error o/ ;
+
+            /o do something o/
+            if (OCI_TYPEELEM_IS_REF(OCITypeElemFlags(env, err, ado)))...
+          }
+          break;
+
+        /o domain type o/
+        case OCI_TYPECODE_NAMEDCOLLECTION:
+          switch (OCITypeCollTypeCode(env, err, tdo))
+          {
+          case OCI_TYPECODE_VARRAY:                   /o variable array o/
+            ub4   num_elems;
+            OCIType *element_type;
+
+            /o get the number of elements in the farray or the maximum number
+             o of elements in the varray.
+             o/
+            OCITypeCollSize(env, err, tdo, &num_elems);
+
+            /o get the type of the array o/
+            OCITypeElemType(env, err, tdo, &element_type);
+          }
+          break;
+
+          case OCI_TYPECODE_TABLE:                         /o multiset o/
+          {
+            OCIType *table_type;
+
+            /o get the type of the multiset o/
+            OCITypeElemType(env, err, tdo, &table_type);
+
+            /o do something o/
+          }
+        }
+
+        /o abstract type o/
+        case OCI_TYPECODE_ADT:                 /o abstract data type o/
+          {
+            /o get the adt information o/
+            if (OCITypeElemType(env, err, ado, &tdo) != OCI_SUCCESS)
+              /o error o/ ;
+
+            /o do something o/
+          }
+          break;
+
+        default:
+          DISCARD printf("Error:  invalid type code\n");
+
+        } /o end of typecode switch o/
+
+      } /o end of loop through all attributes in a type o/
+
+
+      /o ------------ GET THE IMMEDIATE METHODS OF A TYPE ------------ o/
+
+      /o loop through all methods in the type by reusing iterator o/
+      if (OCITypeIterSet(env, err, car_tdo, iterator_ort) != OCI_SUCCESS)
+        /o do something o/
+
+      while (OCITypeMethodNext(env, err, iterator_ort) != OCI_NO_DATA)
+      {
+        /o get the method's name o/
+        if (!memcmp(OCITypeMethodName(env, err, mdo, &text_len), "car",
+                    text_len))
+          /o do something o/  ;
+
+        /o get the method's encapsulation o/
+        if (OCITypeMethodEncap(env, err, mdo) == OCI_TYPEENCAP_PUBLIC)
+          /o do something o/  ;
+
+        /o get the method's flags o/
+        meth_flags = OCITypeMethodFlags(env, err, mdo);
+        if (meth_flags & OCI_TYPEMETHOD_VIRTUAL)  
+          /o do something o/  ;
+
+
+        /o ------------ GET THE PARAMETERS IN A METHOD ------------ o/
+
+        /o loop through all parameters in the method o/
+        count = OCITypeMethodParams(env, err, mdo);
+        for (j = 1; j <= count; j++)
+        {
+          /o get the parameter information by position o/
+          if (OCITypeParamByPos(env, err, mdo, i, &elem) != OCI_SUCCESS)
+            /o error o/ ;
+
+          /o get the parameter's name o/
+          if (!memcmp(OCITypeElemName(env, err, elem, &text_len), "an_age",
+                      text_len))
+            /o do something o/ ;
+
+          /o get the parameter's mode o/
+          if (OCITypeElemMode(env, err, elem) == OCI_PARAM_OUT)
+            /o do something o/ ;
+   
+          /o get the parameter's required flag o/
+          if (ortgprq(env, err, elem))
+            /o do something o/ ;
+        }
+      }
+
+      /o get a method by name o/
+      if (OCITypeMethodByName(env, err, car_tdo, "car_constructor", 
+                              strlen("car_constructor"), NULLP(OCIRef), &mdo) 
+                              != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get a parameter in a method by name o/
+      if (OCITypeParamByName(env, err, mdo, "an_age", strlen("an_age"), &elem) 
+                  != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get a parameter's typecode o/
+      typecode = OCITypeElemTypeCode(env, err, elem);
+   
+      /o get a parameter's type object o/
+      if (OCITypeElemType(env, err, elem, &tdo)) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get a parameter's position in a method o/
+      if (ortgpps(env, err, mdo, "an_age", strlen("an_age"), 
+                  &position, NULLP(OCIRef), NULLP(OCITypeElem)) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o ------------ GET THE METHOD's RESULT ------------ o/
+     
+      /o get a method by name o/
+      if (OCITypeMethodByName(env, err, car_tdo, "get_age", strlen("get_age"),
+                  &mdo) != OCI_SUCCESS)
+        /o error o/ ;
+
+      /o get the typecode of the method's result o/
+      typecode = OCITypeElemTypeCode(env, err, mdo);
+
+
+      /o ----------------- END ---------------- o/
+
+      /o free the references implicitly allocated o/
+      DISCARD orlrfre(env, err, (dvoid *)&attr_ref);
+      DISCARD orlrfre(env, err, (dvoid *)&param_ref);
+
+  NOTES
+
+  MODIFIED
+    srseshad   03/12/03  - convert oci public api to ansi
+    aahluwal   06/03/02  - bug 2360115
+    skabraha   04/16/02  - fix compiler warnings
+    rkasamse   03/02/01  - do not use iterator : keyword in MSVB
+    bpalaval   02/09/01  - Change text to oratext.
+    rxgovind   01/31/00  - add OCIType interfaces for transient types
+    whe        09/01/99 -  976457:check __cplusplus for C++ code
+    cxcheng    05/06/97 -  make OCI_TYPE?? test macros return either 1 or 0
+    cxcheng    04/22/97 -  add comment on desupporting OCIType functions
+    skrishna   03/18/97 -  fix ifdef for supporting ansi and k&r proto-types
+    cxcheng    02/26/97 -  fix lint problem with oro names
+    cxcheng    02/06/97 -  take out short name support except with SLSHORTNAME
+    cxcheng    01/15/97 -  change prototype of OCITypeElemParameterizedType()
+    cxcheng    01/03/97 -  replace bit in OCI_TYPEPARAM_IS_REQUIRED with bitwis
+    cxcheng    12/31/96 -  replace OCI_PARAM_IS_REQUIRED with OCI_TYPEPARAM_IS_
+    cxcheng    12/09/96 -  add prototype for OCITypeElemExtTypeCode and OCIType
+    cxcheng    11/25/96 -  add schema name parameter to OCITypeVTInsert()
+    cxcheng    11/20/96 -  fix prototype for OCITypeByName()
+    cxcheng    11/11/96 -  fix prototype for OCITypeByName()
+    cxcheng    11/05/96 -  remove OCITypeElemExtTypeCode and OCITypeCollExtType
+    dchatter   10/28/96 -  change ortgatyp to be OCITypeArrayByName
+    cxcheng    10/25/96 -  fix problem with ortgatyp at end
+    cxcheng    10/22/96 -  add OCITypeByRef and OCITypeArrayByRef
+    cxcheng    10/20/96 -  remove ortgtyp() from #define section at end
+    cxcheng    10/18/96 -  rename OCITypeGetArray to OCITypeArrayByName
+    cxcheng    10/17/96 -  final change to prototype for OCI_TYPEPARAM_IS_REQUI
+    cxcheng    10/15/96 -  rename OCIEncapLevel and OCIMethodFlag
+    cxcheng    10/14/96 -  change prototype of OCITypeResult
+    mluong     10/11/96 -  fix compile error
+    jwijaya    10/10/96 -  fix bug on OCI_PARAM_IS_REQUIRED
+    cxcheng    10/09/96 -  more lint and link fixes
+    cxcheng    10/08/96 -  more lint fixes
+    cxcheng    10/07/96 -  more changes
+    cxcheng    10/04/96 -  replace short names with long names
+    cxcheng    10/01/96 -  change to long names for readability
+    cxcheng    09/27/96 -  rename ortgatyp() to ortgtya() for lint
+    cxcheng    09/20/96 -  add ortgatyp() for array get type
+    cxcheng    09/18/96 -  add array pin and iterator functions
+    cxcheng    08/09/96 -  add version table calls
+    cxcheng    07/22/96 -  add OCITypeElemType() to top
+    jwijaya    07/03/96 -  add ANSI prototypes
+    cxcheng    06/28/96 -  add OCITypeElemCharSetForm()
+    cxcheng    06/26/96 -  fix comment on OCITypeParamByPos()/ortgpps()
+    cxcheng    06/18/96 -  fix comments on OCITypeResult()
+    cxcheng    06/17/96 -  improve comments
+    skrishna   06/03/96 -  change OCITypeCollElem() prototype
+    vkrishna   05/29/96 -  replace OROTCFAR with OROTCCAR
+    cxcheng    05/28/96 -  fix comments, remove non-beta1 functions
+    cxcheng    05/02/96 -  fix prototype bugs
+    cxcheng    04/29/96 -  rename OCITypeElemm() to ortanct()
+    cxcheng    04/26/96 -  add ortgrbp and ortftyi,
+                           fix comments and examples
+    cxcheng    04/22/96 -  big merge to main branch
+    cxcheng    04/17/96 -  fix syntax
+    cxcheng    04/08/96 -  change prototype to ortaty()
+    skrishna   04/08/96 -  change ort*() to take OCIEnv* and OCIError* instead
+                           of oroenv*
+    cxcheng    03/28/96 -  add ortslob(), change ortsstr() prototype
+    cxcheng    03/13/96 -  change alter type interface
+    cxcheng    03/11/96 -  ORT interface changes
+    cxcheng    02/27/96 -  correct comments
+    jboonleu   02/09/96 -  rename oroopd to OCIDuration
+    cxcheng    01/19/96 -  change ORTCTYVAL to ORTCTYEMB for embedded ADT
+    cxcheng    02/14/96 -  add more comments
+    jboonleu   02/09/96 -  rename oroopd to OCIDuration
+    cxcheng    02/07/96 -  fix comments and examples
+    cxcheng    01/19/96 -  new ORT interface without korfc's
+    cxcheng    01/08/96 -  consolidate collection functions
+    cxcheng    12/14/95 -  remove obsolete ortgcol() and ortrelease()
+    jweisz     12/12/95 -  merge screwup: ortdth twice
+    cxcheng    12/05/95 -  change multiset interface for new standard
+    skotsovo   12/01/95 -  merge from /vobs/rdbms/public/ort.h@@/main/
+                           st_rdbms_big_dev/st_rdbms_obj/
+                           st_rdbms_jwijaya_variable_ref
+    cxcheng    11/13/95 -  add ortaty()/orteaty()
+    cxcheng    11/13/95 -  add new collection type accessors
+    skotsovo   10/30/95 -  add 'oid' type b/c extent type uses it.
+    skotsovo   10/24/95 -  update according to new variable length ref
+    cxcheng    10/05/95 -  add null support, change prototypes to calls
+    cxcheng    10/03/95 -  add OCITypeMethodOrder() to get ORDER method
+    cxcheng    09/28/95 -  add OCITypeElemm() for collection types support
+    skotsovo   06/05/95 -  add adt_type parameter to ortsab() 
+    skotsovo   05/10/95 -  ifdef'd out ortgafp() 
+    skotsovo   03/07/95 -  update interface to only include release 1
+    skotsovo   02/22/95 -  add multiset accessors 
+    skotsovo   02/09/95 -  update according to new ots doc 
+    skotsovo   01/31/95 -  add rest of release 1 types 
+    skotsovo   01/24/95 -  categorize sint32, double, and real as number types 
+                           (with precision and scale) instead of scalar types.
+    skotsovo   01/12/95 -  remove dependency from ortdty interface 
+    skotsovo   01/03/95 -  remove orotyp accessors 
+    skotsovo   12/12/94 -  update comments 
+    skotsovo   12/05/94 -  change OCITypeElemParameterizedTyper interface 
+    skotsovo   10/26/94 -  add type version table 
+    skotsovo   10/17/94 -  fix ortgafp() comments 
+    skotsovo   10/14/94 -  modify ortgafp() parameters 
+    skotsovo   10/14/94 -  add examples 
+    skotsovo   10/13/94 -  add a few new routines 
+    jwijaya    10/07/94 -  add namespace to pin by name 
+    jwijaya    10/02/94 -  connection handle -> connection number 
+    skotsovo   09/13/94 -  modify example to use updated oririni interface 
+    skotsovo   08/25/94 -  change scale to sb1 from sb2 
+    skotsovo   07/28/94 -  add ortbeg() and ortend() 
+    skotsovo   07/14/94 -  add decimal type & call graph
+    skotsovo   06/28/94 -  subset by removing miscellaneous functions 
+    skotsovo   06/28/94 -  consistently put comments before typedefs 
+    skotsovo   06/27/94 -  modify according to new header file template, add
+                           more examples, and change ortcty() to return a
+                           reference to the type
+    skotsovo   06/24/94 -  add functions to get type information from orotyp 
+    skotsovo   06/20/94 -  finish modifying according to header template 
+    skotsovo   06/09/94 -  modify according to header file template 
+    skotsovo   06/08/94 -  replace s.h with oratypes.h 
+    skotsovo   05/24/94 -  modify comments & update example
+    skotsovo   05/23/94 -  modify fnt names for create, alter and drop type 
+    skotsovo   05/18/94 -  remove ortdme() -- delete a method 
+    skotsovo   05/17/94 -  add tdo parameter to all type modifiers 
+    skotsovo   05/11/94 -  return text* instead of including it in arglist 
+    skotsovo   11/16/93 -  creation
+
+*/
+
+#ifndef ORATYPES
+#include <oratypes.h>
+#endif
+#ifndef ORO_ORACLE
+#include <oro.h>
+#endif
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#define ORT_ORACLE
+
+/*---------------------------------------------------------------------------*/
+/*                         SHORT NAMES SUPPORT SECTION                       */
+/*---------------------------------------------------------------------------*/
+
+#ifdef SLSHORTNAME
+
+/* the following are short names that are only supported on IBM mainframes
+   with the SLSHORTNAME defined.
+   With this all subsequent long names will actually be substituted with
+   the short names here */
+
+#define OCITypeArrayByName              ortgatyp
+#define OCITypeAttrByName               ortgabn
+#define OCITypeAttrNext                 ortgabi
+#define OCITypeAttrs                    ortgtna
+#define OCITypeByRef                    ortgtbrf
+#define OCITypeCollElem                 ortgcel
+#define OCITypeCollExtTypeCode          ortgcsqt
+#define OCITypeCollSize                 ortgcne
+#define OCITypeCollTypeCode             ortgdttc
+#define OCITypeElem                     ortado
+#define OCITypeElemCharSetForm          ortgscform
+#define OCITypeElemCharSetID            ortgscid
+#define OCITypeElemDefaultValue         ortgpdv
+#define OCITypeElemExtTypeCode          ortgasqt
+#define OCITypeElemLength               ortgsl
+#define OCITypeElemName                 ortganm
+#define OCITypeElemNumPrec              ortgnp
+#define OCITypeElemNumScale             ortgns
+#define OCITypeElemParamMode            ortgpmo
+#define OCITypeElemParameterizedType    ortgpa
+#define OCITypeElemType                 ortgaty
+#define OCITypeElemTypeCode             ortgatc
+#define OCITypeIter                     ortitr
+#define OCITypeIterFree                 ortifre
+#define OCITypeIterNew                  ortinew
+#define OCITypeIterSet                  ortiset
+#define OCITypeMethod                   ortmdo
+#define OCITypeMethodByName             ortgmbn
+#define OCITypeMethodEncap              ortgmen
+#define OCITypeMethodFlags              ortgmfl
+#define OCITypeMethodMap                ortgmmap
+#define OCITypeMethodName               ortgmnm
+#define OCITypeMethodNext               ortgmbi
+#define OCITypeMethodOrder              ortgmor
+#define OCITypeMethodOverload           ortgmno
+#define OCITypeMethodParams             ortgmnp
+#define OCITypeMethods                  ortgtnm
+#define OCITypeName                     ortgtme
+#define OCITypeParamByName              ortgpbn
+#define OCITypeParamPos                 ortgpps
+#define OCITypeSchema                   ortgtsch
+#define OCITypeTypeCode                 ortgttc
+#define OCITypeVTInit                   ortvini
+#define OCITypeVTInsert                 ortvins
+#define OCITypeVTSelect                 ortvsel
+#define OCITypeVersion                  ortgtvn
+
+#endif                                                        /* SLSHORTNAME */
+
+
+/*============================*/        
+/* PUBLIC TYPES AND CONSTANTS */
+/*============================*/
+
+/*----------------------------- TYPE DESCRIPTION ----------------------------*/
+
+/*
+ * OCIType - OCI Type Description Object 
+ *
+ * The contents of an 'OCIType' is private/opaque to clients.  Clients just 
+ * need to declare and pass 'OCIType' pointers in to the type manage
+ * functions.
+ * The pointer points to the type in the object cache.  Thus, clients don't
+ * need to allocate space for this type and must NEVER free the pointer to the
+ * 'OCIType'.
+ */
+
+typedef struct OCIType OCIType;
+
+/*------------------------- TYPE ELEMENT DESCRIPTION ------------------------*/
+
+
+/*
+ * OCITypeElem - OCI Type Element object
+ *
+ * The contents of an 'OCITypeElem' is private/opaque to clients. Clients just 
+ * need to declare and pass 'OCITypeElem' pointers in to the type manager 
+ * functions.
+ *
+ * 'OCITypeElem' objects contains type element information such as the numeric
+ * precision for example, for number objects, and the number of elements for
+ * arrays.
+ * They ARE used to describe type attributes, collection elements,
+ * method parameters, and method results. Hence they are pass in or returned
+ * by attribute, collection, and method parameter/result accessors.
+ */
+
+typedef struct OCITypeElem OCITypeElem;
+
+
+/*--------------------------- METHOD DESCRIPTION ---------------------------*/
+
+
+/*
+ * OCITypeMethod - OCI Method Description object 
+ *
+ * The contents of an 'OCITypeMethod' is private/opaque to clients.  Clients
+ * just need to declare and pass 'OCITypeMethod' pointers in to the type
+ * manager functions.
+ * The pointer points to the method in the object cache.  Thus, clients don't
+ * need to allocate space for this type and must NEVER free the pointer to 
+ * the 'OCITypeMethod'.
+ */
+
+typedef struct OCITypeMethod OCITypeMethod;
+
+
+/*--------------------------- TYPE ACCESS ITERATOR --------------------------*/
+
+/*
+ * OCITypeIter- OCI Type Iterator
+ *
+ * The contents of an 'orti' is private/opaque to clients.  Clients just 
+ * need to declare and pass 'orti' pointers in to the type manager functions.
+ * The iterator is used to retreive MDO's and ADO's that belong to the TDO
+ * one at a time. It needs to be allocated by the 'OCITypeIterNew()' function
+ * call and deallocated with the 'OCITypeIterFree()' function call.
+ */
+
+typedef struct OCITypeIter OCITypeIter;
+
+
+/*==================*/
+/* PUBLIC FUNCTIONS */
+/*==================*/
+
+/*--------------------------------------------------------------------------*/
+/*                                  ITERATOR                                */
+/*--------------------------------------------------------------------------*/
+
+/*-----------------------_- OCITypeIterNew ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterNew(    OCIEnv *env, OCIError *err, OCIType *tdo, 
+                         OCITypeIter **iterator_ort    );
+
+/*
+  NAME: OCITypeIterNew - OCI Iterator NEW
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       tdo (IN) - pointer to the pinned type in the object cache to
+                initialize the iterator with
+       iterator_ort (OUT) - pointer to the pointer to the new iterator created
+  DESCRIPTION:
+       Create a new instance of a method/attribute iterator and initalize
+       it's values.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) error while allocating space for the iterator.
+*/
+
+/*------------------------ OCITypeIterSet ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterSet(    OCIEnv *env, OCIError *err, OCIType *tdo, 
+                  OCITypeIter *iterator_ort    );
+
+/*
+  NAME: OCITypeIterSet - OCI Iterator SET
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       tdo (IN) - pointer to the pinned type in the object cache to
+                initialize the iterator with
+       iterator_ort (IN/OUT) - pointer to the iterator to set
+  DESCRIPTION:
+       Initializes the iterator. This is used to reset the state of the
+       iterator.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+*/
+
+/*------------------------ OCITypeIterFree ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeIterFree(    OCIEnv *env, OCIError *err, OCITypeIter
+                          *iterator_ort    );
+
+/*
+  NAME: OCITypeIterFree - OCI Iterator FREe
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       iterator_ort (IN/OUT) - pointer to the iterator to free
+  DESCRIPTION:
+       Free space allocated for the iterator.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) error while freeing the iterator, probably bad iterator pointer.
+*/
+
+
+/*--------------------------------------------------------------------------*/
+/*                                  TYPE GET                                */
+/*--------------------------------------------------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeByName(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+                        CONST oratext *schema_name, ub4 s_length,
+                        CONST oratext *type_name, ub4 t_length,
+                        CONST oratext *version_name, ub4 v_length,
+                        OCIDuration pin_duration, OCITypeGetOpt get_option,
+                        OCIType **tdo    );
+/*
+  NAME: OCITypeByName - OCI Get the most current version of an existing TYPe
+                  by name.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       svc (IN) - OCI service handle
+       schema_name (IN, optional) - name of schema associated with the 
+                  type.  By default, the user's schema name is used.
+       s_length (IN) - length of the 'schema_name' parameter
+       type_name (IN) - name of the type to get
+       t_length (IN) - length of the 'type_name' parameter
+       version_name (IN, optional) - user readable version of the type.
+                  Pass (oratext *)0 for the most current version.
+       v_length (IN) - length of version_name in bytes. Should be 0 if
+                  the most current version is to be retrieved.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction).  See 'oro.h' for a description of
+                  each option.
+       get_option (IN) - options for loading the types. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - pointer to the pinned type in the object cache
+  DESCRIPTION:
+       Get a pointer to a version of the existing type associated
+       with schema/type name.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) the adt type associated with schema/type name does not exist.
+  NOTE:
+       Schema and type names are CASE-SENSITIVE. If they have been created
+       via SQL, you need to use uppercase names.
+*/
+
+sword OCITypeArrayByName(    OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+                             ub4 array_len,
+                             CONST oratext *schema_name[], ub4 s_length[],
+                             CONST oratext *type_name[], ub4 t_length[],
+                             CONST oratext *version_name[], ub4 v_length[],
+                             OCIDuration pin_duration,
+                             OCITypeGetOpt get_option, OCIType **tdo    );
+
+/*
+  NAME: OCITypeArrayByName - OCI Get array of TYPes by name.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       svc (IN) - OCI service handle
+       array_len (IN) - number of schema_name/type_name/version_name entries to
+                  be retrieved.
+       schema_name (IN, optional) - array of schema names associated with the
+                  types to be retrieved.  The array must have array_len
+                  elements if specified.
+                  If 0 is supplied, the default schema is assumed, otherwise
+                  it MUST have array_len number of elements.
+                  0 can be supplied for one or more of the entries to indicate
+                  that the default schema is desired for those entries.
+       s_length (IN) - array of schema_name lengths with each entry
+                  corresponding to the length of the corresponding schema_name
+                  entry in the schema_name array in bytes.
+                  The array must either have array_len number of elements or
+                  it MUST be 0 if schema_name is not specified.
+       type_name (IN) - array of the names of the types to retrieve. This
+                  MUST have array_len number of elements.
+       t_length (IN) - array of the lengths of type names in the type_name
+                  array in bytes.
+       version_name (IN) - array of the version names of the types to retrieve
+                  corresponding. This can be 0 to indicate retrieval of the
+                  most current versions, or it MUST have array_len number of
+                  elements.
+                  If 0 is supplied, the most current version is assumed,
+                  otherwise it MUST have array_len number of elements.
+                  0 can be supplied for one or more of the entries to indicate
+                  that the current version is desired for those entries.
+       v_length (IN) - array of the lengths of version names in the
+                  version_name array in bytes.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction) for the types retreieve.  See 'oro.h' for a
+                  description of each option.
+       get_option (IN) - options for loading the types. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - output array for the pointers to each pinned type in the
+                  object cache. It must have space for array_len pointers.
+                  Use OCIObjectGetObjectRef() to obtain the CREF to each
+                  pinned type descriptor.
+  DESCRIPTION:
+       Get pointers to the existing types associated with the schema/type name
+       array. This is similar to OCITypeByName() except that all the TDO's are
+       retreived via a single network roundtrip.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) one or more adt types associated with a schema/type name entry
+              does not exist.
+*/
+
+sword   OCITypeByRef(    OCIEnv *env, OCIError *err,
+                         CONST OCIRef *type_ref, OCIDuration pin_duration,
+                         OCITypeGetOpt get_option, OCIType **tdo    );
+
+/*
+  NAME: OCITypeArrayByRef - OCI Get array of TYPes by REF.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       type_ref (IN) - OCIRef * pointing to the particular version of
+                  the type descriptor object to obtain.
+                  The array must have array_len elements if specified.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction) for the type to retreieve.  See 'oro.h' for a
+                  description of each option.
+       get_option (IN) - options for loading the type. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - pointer to the pinned type in the object cache
+  DESCRIPTION:
+       Get pointers to the 
+       with the schema/type name array. This is similar to OCITypeByName()
+       except that all the TDO's are retreived via a single network roundtrip.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) one or more adt types associated with a schema/type name entry
+              does not exist.
+*/
+
+sword   OCITypeArrayByRef(    OCIEnv *env, OCIError *err,
+                              ub4 array_len, CONST OCIRef **type_ref,
+                              OCIDuration pin_duration,
+                              OCITypeGetOpt get_option, OCIType **tdo    );
+
+/*
+  NAME: OCITypeArrayByRef - OCI Get array of TYPes by REF.
+  PARAMETERS:
+       env (IN/OUT) - OCI environment handle initialized in object mode
+       err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+       array_len (IN) - number of schema_name/type_name/version_name entries to
+                  be retrieved.
+       type_ref (IN) - array of OCIRef * pointing to the particular version of
+                  the type descriptor object to obtain.
+                  The array must have array_len elements if specified.
+       pin_duration (IN) - pin duration (e.g. until the end of current
+                  transaction) for the types retreieve.  See 'oro.h' for a
+                  description of each option.
+       get_option (IN) - options for loading the types. It can be one of two
+                   values:
+                  OCI_TYPEGET_HEADER for only the header to be loaded, or
+                  OCI_TYPEGET_ALL for the TDO and all ADO and MDOs to be
+                    loaded.
+       tdo (OUT) - output array for the pointers to each pinned type in the
+                  object cache. It must have space for array_len pointers.
+                  Use OCIObjectGetObjectRef() to obtain the CREF to each
+                  pinned type descriptor.
+  DESCRIPTION:
+       Get pointers to the 
+       with the schema/type name array. This is similar to OCITypeByName()
+       except that all the TDO's are retreived via a single network roundtrip.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+           1) any of the required parameters is null.
+           2) one or more adt types associated with a schema/type name entry
+              does not exist.
+*/
+
+
+/*--------------------------------------------------------------------------*/
+/*                              TYPE ACCESSORS                              */
+/*--------------------------------------------------------------------------*/
+
+/*---------------------------- OCITypeName ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeName(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                      ub4 *n_length    );
+/*
+   NAME: OCITypeName -  ORT Get a Type's naME.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the returned type name.  The
+               caller must allocate space for the ub4 before calling this
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) All input parameters must not be NULL and must be valid.
+        3) 'n_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the name of the type.
+   RETURNS:
+        the name of the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------ OCITypeSchema ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeSchema(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                   ub4 *n_length    );
+/*
+   NAME: OCITypeSchema -  ORT Get a Type's SCHema name.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the returned schema name.  The
+               caller must allocate space for the ub4 before calling this
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'n_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the schema name of the type.
+   RETURNS:
+        the schema name of the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------ OCITypeTypeCode ---------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeTypeCode(    OCIEnv *env, OCIError *err,
+                                CONST OCIType *tdo    );
+/*
+   NAME: OCITypeTypeCode - OCI Get a Type's Type Code.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the type code of the type.
+   RETURNS:
+        The type code of the type.
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*----------------------- OCITypeCollTypeCode -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeCollTypeCode(    OCIEnv *env, OCIError *err,
+                                    CONST OCIType *tdo    );
+/*
+   NAME: OCITypeCollTypeCode - OCI Get a Domain Type's Type Code.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'tdo' MUST point to a named collection type.
+   DESCRIPTION:
+        Get the type code of the named collection type. For V8.0, named
+        collection types can only be variable length arrays and nested tables.
+   RETURNS:
+        OCI_TYPECODE_VARRAY for variable length array, and
+        OCI_TYPECODE_TABLE for nested tables.
+   NOTES:
+        The type descriptor, 'tdo', should be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------- OCITypeVersion ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeVersion(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                         ub4 *v_length    );
+/*
+   NAME: OCITypeVersion - OCI Get a Type's user-readable VersioN. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        v_length (OUT) - length (in bytes) of the returned user-readable 
+               version.  The caller must allocate space for the ub4 before 
+               calling this routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'v_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the user-readable version of the type.
+   RETURNS:
+        The user-readable version of the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*--------------------------- OCITypeAttrs ---------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeAttrs(    OCIEnv *env, OCIError *err, CONST OCIType *tdo    );
+/*
+   NAME: OCITypeAttrs - OCI Get a Type's Number of Attributes. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the number of attributes in the type.
+   RETURNS:
+        The number of attributes in the type. 0 for ALL non-ADTs.
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+/*------------------------- OCITypeMethods ---------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethods(    OCIEnv *env, OCIError *err, CONST OCIType *tdo    );
+/*
+   NAME: OCITypeMethods - OCI Get a Type's Number of Methods. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the number of methods in a type.
+   RETURNS:
+        The number of methods in the type
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/*                     TYPE ELEMENT INFORMATION ACCESSORS                   */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeElemName ---------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeElemName(    OCIEnv *env, OCIError *err, 
+                           CONST OCITypeElem *elem, ub4 *n_length    );
+/*
+   NAME: OCITypeElemName - OCI Get an Attribute's NaMe. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the returned attribute name.  
+               The caller must allocate space for the ub4 before calling this 
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+        3) 'n_length' must point to an allocated ub4.
+   DESCRIPTION:
+        Get the name of the attribute.
+   RETURNS:
+        the name of the attribute and the length in n_length
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeElemTypeCode ------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeElemTypeCode(    OCIEnv *env, OCIError *err,
+                                    CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemTypeCode - OCI Get an Attribute's TypeCode. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the typecode of an attribute's type.
+   RETURNS:
+        the typecode of the attribute's type.  If this is a scalar type, the 
+        typecode sufficiently describes the scalar type and no further calls 
+        need to be made.  Valid scalar types include: OCI_TYPECODE_SIGNED8,
+        OCI_TYPECODE_UNSIGNED8, OCI_TYPECODE_SIGNED16, OCI_TYPECODE_UNSIGNED16,
+        OCI_TYPECODE_SIGNED32, OCI_TYPECODE_UNSIGNED32, OCI_TYPECODE_REAL,
+        OCI_TYPECODE_DOUBLE, OCI_TYPECODE_DATE,
+        OCI_TYPECODE_MLSLABEL, OROTCOID, OCI_TYPECODE_OCTET, or OROTCLOB.
+        This function converts the CREF (stored in the attribute) into a
+        typecode.
+   NOTES:
+       The type must be unpinned when the accessed information is no 
+       longer needed.
+ */
+
+/*------------------------ OCITypeElemType ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeElemType(    OCIEnv *env, OCIError *err, CONST OCITypeElem *elem, 
+                          OCIType **elem_tdo    );
+/*
+  PARAMETERS
+     env (IN/OUT) - OCI environment handle initialized in object mode
+     err (IN/OUT) - error handle. If there is an error, it is
+             recorded in 'err' and this function returns OCI_ERROR.
+             The error recorded in 'err' can be retrieved by calling
+             OCIErrorGet().
+     elem (IN) - pointer to the type element descriptor in the object cache
+     elem_tdo (OUT) - If the function completes successfully, 'elem_tdo'
+            points to the type descriptor (in the object cache) of the type of
+            the element.
+
+  REQUIRES
+     1) All type accessors require that the type be pinned before calling
+        any accessor.  This can be done by calling 'OCITypeByName()'.
+     2) if 'elem' is not null, it must point to a valid type element descriptor
+        in the object cache.
+
+  DESCRIPTION
+     Get the type tdo of the type of this element.
+  RETURNS
+     OCI_SUCCESS if the function completes successfully.
+     OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+     OCI_ERROR if
+         1) any of the parameters is null.
+
+  NOTES
+     The type must be unpinned when the accessed information is no
+     longer needed.  This can be done by calling 'OCIObjectUnpin()'.
+ */
+
+/*------------------------- OCITypeElemFlags -------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeElemFlags(    OCIEnv *env, OCIError *err,
+                         CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemFlags - OCI Get a Elem's FLags
+                              (inline, constant, virtual, constructor,
+                              destructor). 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the flags of a type element (attribute, parameter).
+   RETURNS:
+        The flags of the type element.
+   NOTES:
+        The flag bits are not externally documented. Use only the macros
+        in the last section (ie. OCI_TYPEPARAM_IS_REQUIRED, and
+        OCI_TYPEELEM_IS_REF) to test for them only. The type must be unpinned
+        when the accessed information is no longer needed.
+ */
+
+/*------------------------ OCITypeElemNumPrec ------------------------------*/
+
+/* ** OBSOLETE ** */
+ub1 OCITypeElemNumPrec(    OCIEnv *env, OCIError *err,
+                           CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemNumPrec - Get a Number's Precision.  This includes float,
+                              decimal, real, double, and oracle number.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the precision of a float, decimal, long, unsigned long, real, 
+        double, or Oracle number type. 
+   RETURNS:
+        the precision of the float, decimal, long, unsigned long, real, double,
+        or Oracle number 
+ */
+
+/*------------------------- OCITypeElemNumScale -----------------------------*/
+
+/* ** OBSOLETE ** */
+sb1 OCITypeElemNumScale(    OCIEnv *env, OCIError *err,
+                            CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemNumScale - Get a decimal or oracle Number's Scale 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the scale of a decimal, or Oracle number type. 
+   RETURNS:
+        the scale of the decimal, or Oracle number 
+ */
+
+/*------------------------ OCITypeElemLength -------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeElemLength(    OCIEnv *env, OCIError *err,
+                          CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemLength - Get a raw, fixed or variable length String's
+                             length in bytes.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the length of a raw, fixed or variable length string type. 
+   RETURNS:
+        length of the raw, fixed or variable length string
+ */
+
+/*----------------------- OCITypeElemCharSetID -----------------------------*/
+
+/* ** OBSOLETE ** */
+ub2 OCITypeElemCharSetID(    OCIEnv *env, OCIError *err,
+                             CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemCharSetID - Get a fixed or variable length String's
+                                character set ID
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the character set ID of a fixed or variable length string type. 
+   RETURNS:
+        character set ID of the fixed or variable length string
+ */
+
+/*---------------------- OCITypeElemCharSetForm ----------------------------*/
+
+/* ** OBSOLETE ** */
+ub2 OCITypeElemCharSetForm(    OCIEnv *env, OCIError *err,
+                               CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemCharSetForm - Get a fixed or variable length String's
+                                  character set specification form.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the attribute information in the object cache
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the character form of a fixed or variable length string type.
+        The character form is an enumerated value that can be one of the
+        4 values below:
+               SQLCS_IMPLICIT for CHAR, VARCHAR2, CLOB w/o a specified set
+               SQLCS_NCHAR    for NCHAR, NCHAR VARYING, NCLOB
+               SQLCS_EXPLICIT for CHAR, etc, with "CHARACTER SET ..." syntax
+               SQLCS_FLEXIBLE for PL/SQL "flexible" parameters
+   RETURNS:
+        character form of the fixed or variable string
+ */
+
+/*--------------------- OCITypeElemParameterizedType ------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeElemParameterizedType(    OCIEnv *env, OCIError *err,
+                                       CONST OCITypeElem *elem, 
+                                       OCIType **type_stored    );
+/*
+   NAME: OCITypeElemParameterizedType 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+        type_stored (OUT) - If the function completes successfully, 
+               and the parameterized type is complex, 'type_stored' is NULL.
+               Otherwise, 'type_stored' points to the type descriptor (in the 
+               object cache) of the type that is stored in the parameterized 
+               type.  The caller must allocate space for the OCIType* 
+               before calling this routine and must not write into the space.
+   REQUIRES:
+        All input parameters must be valid.
+   DESCRIPTION:
+        Get a descriptor to the parameter type of a parameterized type.
+        Parameterized types are types of the form:
+          REF T
+          VARRAY (n) OF T
+        etc, where T is the parameter in the parameterized type.
+        Additionally is_ref is set if the parameter is a PTR or REF.
+        For example, it is set for REF T or VARRAY(n) OF REF T.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) 'type_stored' is not NULL but points to NULL data.
+   NOTES:
+        Complex parameterized types will be in a future release (once 
+        typedefs are supported.  When setting the parameterized type 
+        information, the user must typedef the contents if it's a
+        complex parameterized type.  Ex. for varray<varray<car>>, use
+        'typedef varray<car> varcar' and then use varray<varcar>. 
+ */
+
+/*----------------------- OCITypeElemExtTypeCode ----------------------------*/
+ 
+/* ** OBSOLETE ** */
+OCITypeCode OCITypeElemExtTypeCode(    OCIEnv *env, OCIError *err,
+                                       CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemExtTypeCode - OCI Get an element's SQLT constant.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the type element descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the internal Oracle typecode associated with an attribute's type.
+        This is the actual typecode for the attribute when it gets mapped
+        to a column in the Oracle database.
+   RETURNS:
+        The Oracle typecode associated with the attribute's type.
+   NOTES:
+        The type must be unpinned when the accessed information is no
+        longer needed.
+ */
+
+/*--------------------------------------------------------------------------*/
+/*                           ATTRIBUTE ACCESSORS                            */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeAttrByName -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeAttrByName(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                            CONST oratext *name, ub4 n_length,
+                            OCITypeElem **elem    );
+/*
+   NAME: OCITypeAttrByName - OCI Get an Attribute By Name. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        name (IN) - the attribute's name 
+        n_length (IN) - length (in bytes) of the 'name' parameter
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected type element descriptor pertaining to the
+               attributein the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get an attribute given its name.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) the type does not contain an attribute with the input 'name'. 
+            3) 'name' is NULL.
+   NOTES:
+        The type descriptor, 'tdo', must be unpinned when the accessed 
+        information is no longer needed.
+        Schema and type names are CASE-SENSITIVE. If they have been created
+        via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeAttrNext ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeAttrNext(    OCIEnv *env, OCIError *err, 
+                        OCITypeIter *iterator_ort, OCITypeElem **elem    );
+
+/*
+   NAME: OCITypeAttrNext - OCI Get an Attribute By Iteration.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        iterator_ort (IN/OUT) - iterator for retrieving the next attribute;
+               see OCITypeIterNew() to initialize iterator.
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected type element descriptor pertaining to the
+               attributein the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+            any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Iterate to the next attribute to retrieve.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_NO_DATA if there are no more attributes to iterate on; use
+            OCITypeIterSet() to reset the iterator if necessary.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*--------------------------------------------------------------------------*/
+/*                           COLLECTION ACCESSORS                           */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeCollElem ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollElem(    OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+                          OCITypeElem **element    );
+/*
+   NAME: OCITypeCollElem
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to the type descriptor in the object cache
+        element (IN/OUT) - If the function completes successfully, this
+               points to the descriptor for the collection's element.
+               It is stored in the same format as an ADT attribute's
+               descriptor.
+               If *element is NULL, OCITypeCollElem() implicitly allocates a
+               new instance of OCITypeElem in the object cache. This instance
+               will be
+               automatically freed at the end of the session, and does not have
+               to be freed explicitly.
+               If *element is not NULL, OCITypeCollElem() assumes that it
+               points to a valid OCITypeElem descriptor and will copy the
+               results into it.
+   REQUIRES:
+        All input parameters must be valid.
+   DESCRIPTION:
+        Get a pointer to the descriptor (OCITypeElem) of the element of an
+        array or the rowtype of a nested table.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) the type TDO does not point to a valid collection's type.
+   NOTES:
+        Complex parameterized types will be in a future release (once 
+        typedefs are supported.  When setting the parameterized type 
+        information, the user must typedef the contents if it's a
+        complex parameterized type.  Ex. for varray<varray<car>>, use
+        'typedef varray<car> varcar' and then use varray<varcar>. 
+ */
+
+/*------------------------ OCITypeCollSize ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeCollSize(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                          ub4 *num_elems    );
+/*
+   NAME: OCITypeCollSize - OCI Get a Collection's Number of Elements.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to the type descriptor in the object cache
+        num_elems (OUT) - number of elements in collection
+   REQUIRES:
+        All input parameters must be valid. tdo points to an array type
+        defined as a domain.
+   DESCRIPTION:
+        Get the number of elements stored in a fixed array or the maximum 
+        number of elements in a variable array.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) 'tdo' does not point to a domain with a collection type.
+   NOTES:
+        Complex parameterized types will be in a future release (once 
+        typedefs are supported.  When setting the parameterized type 
+        information, the user must typedef the contents if it's a
+        complex parameterized type.  Ex. for varray<varray<car>>, use
+        'typedef varray<car> varcar' and then use varray<varcar>. 
+ */
+
+/*------------------------ OCITypeCollExtTypeCode ---------------------------*/
+ 
+/* ** OBSOLETE ** */
+sword OCITypeCollExtTypeCode(    OCIEnv *env, OCIError *err,
+                               CONST OCIType *tdo, OCITypeCode *sqt_code    );
+/*
+   NAME: ortcsqt - OCI Get a Collection element's DTY constant.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to the type descriptor in the object cache
+        sqt_code (OUT) - SQLT code of type element.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the SQLT constant associated with an domain's element type.
+        The SQLT codes are defined in <sqldef.h> and are needed for OCI/OOCI
+        use.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) 'tdo' does not point to a domain with a collection type.
+   NOTES:
+        The type must be unpinned when the accessed information is no
+        longer needed.
+ */
+ 
+
+/*--------------------------------------------------------------------------*/
+/*                             METHOD ACCESSORS                             */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------- OCITypeMethodOverload --------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethodOverload(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                              CONST oratext *method_name, ub4 m_length    );
+/*
+   NAME: OCITypeMethodOverload - OCI Get type's Number of Overloaded names
+                                 for the given method name.
+   PARAMETERS:
+        gp (IN/OUT) - pga environment handle.  Any errors are recorded here.
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        method_name (IN) - the method's name
+        m_length (IN) - length (in bytes) of the 'method_name' parameter
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling
+           any accessor.
+        2) if 'tdo' is not null, it must point to a valid type descriptor
+           in the object cache.
+   DESCRIPTION:
+        Overloading of methods implies that more than one method may have the
+        same method name.  This routine returns the number of methods that
+        have the given method name.  If there are no methods with the input
+        method name, 'num_methods' is 0.  The caller uses this information when
+        allocating space for the array of mdo and/or position pointers before
+        calling 'OCITypeMethodByName()' or 'ortgmps()'.
+   RETURNS:
+        The number of methods with the given name. 0 if none contains the
+        name.
+   NOTES:
+        Schema and type names are CASE-SENSITIVE. If they have been created
+        via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeMethodByName ------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodByName(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                              CONST oratext *method_name, ub4 m_length,
+                              OCITypeMethod **mdos    );
+/*
+   NAME: OCITypeMethodByName - OCI Get one or more Methods with Name. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        method_name (IN) - the methods' name  
+        m_length (IN) - length (in bytes) of the 'name' parameter
+        mdos (OUT) - If this function completes successfully, 'mdos' points to
+                the selected methods in the object cache.  The caller must
+                allocate space for the array of OCITypeMethod pointers before
+                calling this routine and must not write into the space.
+                The number of OCITypeMethod pointers that will be returned can
+                be obtained by calling 'OCITypeMethodOverload()'.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get one or more methods given the name.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) No methods in type has name 'name'.
+            3) 'mdos' is not NULL but points to NULL data.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+        Schema and type names are CASE-SENSITIVE. If they have been created
+        via SQL, you need to use uppercase names.
+ */
+
+/*------------------------ OCITypeMethodNext --------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodNext(    OCIEnv *env, OCIError *err, 
+                            OCITypeIter *iterator_ort,
+                            OCITypeMethod **mdo   );
+
+/*
+   NAME: OCITypeMethodNext - OCI Get a Method By Iteration.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        iterator_ort (IN/OUT) - iterator for retrieving the next method;
+               see OCITypeIterNew() to set iterator.
+        mdo (OUT) - If this function completes successfully, 'mdo' points to 
+               the selected method descriptor in the object cache.  Positions 
+               start at 1.  The caller must allocate space for the
+               OCITypeMethod* before calling this routine and must not write 
+               nto the space. 
+   REQUIRES:
+         1) All type accessors require that the type be pinned before calling 
+            any accessor. 
+        2) if 'tdo' is not null, it must point to a valid type descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Iterate to the next method to retrieve.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_NO_DATA if there are no more attributes to iterate on; use
+            OCITypeIterSet() to reset the iterator if necessary.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) 'mdo' is not NULL but points to NULL data.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodName --------------------------------*/
+
+/* ** OBSOLETE ** */
+oratext *OCITypeMethodName(    OCIEnv *env, OCIError *err,
+                            CONST OCITypeMethod *mdo, ub4 *n_length    );
+/*
+   NAME: OCITypeMethodName - OCI Get a Method's NaMe. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        n_length (OUT) - length (in bytes) of the 'name' parameter.  The caller
+               must allocate space for the ub4 before calling this routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the (non-unique) real name of the method.
+   RETURNS:
+        the non-unique name of the method or NULL if there is an error.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodEncap -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeEncap OCITypeMethodEncap(    OCIEnv *env, OCIError *err,
+                                    CONST OCITypeMethod *mdo    );
+/*
+   NAME: OCITypeMethodEncap - Get a Method's ENcapsulation (private/public). 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the encapsulation (private, or public) of a method.
+   RETURNS:
+        the encapsulation (private, or public) of the method
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodFlags -------------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeMethodFlag OCITypeMethodFlags(    OCIEnv *env, OCIError *err,
+                                         CONST OCITypeMethod *mdo    );
+/*
+   NAME: OCITypeMethodFlags - OCI Get a Method's FLags
+                              (inline, constant, virtual, constructor,
+                              destructor). 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the flags (inline, constant, virutal, constructor, destructor) of
+        a method.
+   RETURNS:
+        the flags (inline, constant, virutal, constructor, destructor) of
+        the method
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodMap ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodMap(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                           OCITypeMethod **mdo    );
+/*
+   NAME: OCITypeMethodMap - OCI Get the Method's MAP function.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        mdo (OUT) - If this function completes successfully, and there is a 
+               map function for this type, 'mdo' points to the selected method 
+               descriptor in the object cache.  Otherwise, 'mdo' is null.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All required input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        A type may have only one map function.  'OCITypeMethodMap()' finds
+        this function, if it exists, and returns a reference and a pointer to
+        the method descriptor in the object cache.  If the type does not have a
+        map (relative ordering) function, then 'mdo_ref' and 'mdo' are set
+        to null and an error is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            the type does not contain a map function.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodOrder -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeMethodOrder(    OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+                             OCITypeMethod **mdo    );
+/*
+   NAME: OCITypeMethodOrder - OCI Get the Method's ORder function.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        tdo (IN) - pointer to to the type descriptor in the object cache
+        mdo (OUT) - If this function completes successfully, and there is a 
+               map function for this type, 'mdo' points to the selected method 
+               descriptor in the object cache.  Otherwise, 'mdo' is null.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All required input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        A type may have only one ORder or MAP function. 'OCITypeMethodOrder()'
+        finds this function, if it exists, and returns a ref and a pointer
+        to the method descriptor in the object cache.  If the type does not
+        have a map (relative ordering) function, then 'mdo_ref' and 'mdo' are
+        set to null and an error is returned.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            the type does not contain a map function.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeMethodParams ------------------------------*/
+
+/* ** OBSOLETE ** */
+ub4 OCITypeMethodParams(    OCIEnv *env, OCIError *err,
+                            CONST OCITypeMethod *mdo    );
+/*
+   NAME: OCITypeMethodParams - OCI Get a Method's Number of Parameters. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the number of parameters in a method.
+   RETURNS:
+        the number of parameters in the method
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/*                             RESULT ACCESSORS                             */
+/*--------------------------------------------------------------------------*/
+
+/*-------------------------- OCITypeResult ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeResult(    OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+                        OCITypeElem **elem    );
+/*
+   NAME: OCITypeResult - OCI Get a method's result type descriptor.
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        elem (OUT) - If this function completes successfully, 'rdo' points to 
+               the selected result (parameter) descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor.
+        2) 'elem' MUST be the address of an OCITypeElem pointer.
+   DESCRIPTION:
+        Get the result of a method.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) method returns no results.
+   NOTES:
+        The method must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+
+/*--------------------------------------------------------------------------*/
+/*                           PARAMETER ACCESSORS                            */
+/*--------------------------------------------------------------------------*/
+
+/*------------------------ OCITypeParamByPos -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamByPos(    OCIEnv *env, OCIError *err,
+                            CONST OCITypeMethod *mdo, ub4 position, 
+                            OCITypeElem **elem    );
+/*
+   NAME: OCITypeParamByPos - OCI Get a Parameter in a method By Position. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        position (IN) - the parameter's position.  Positions start at 1.
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected parameter descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+   DESCRIPTION:
+        Get a parameter given its position in the method.  Positions start 
+        at 1.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) 'position' is not >= 1 and <= the number of parameters in the
+               method.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeParamByName -------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamByName(    OCIEnv *env, OCIError *err,
+                             CONST OCITypeMethod *mdo, 
+                             CONST oratext *name, ub4 n_length,
+                             OCITypeElem **elem    );
+/*
+   NAME: OCITypeParamByName - OCI Get a Parameter in a method By Name. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        name (IN) - the parameter's name
+        n_length (IN) - length (in bytes) of the 'name' parameter
+        elem (OUT) - If this function completes successfully, 'elem' points to 
+               the selected parameter descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'mdo' is not null, it must point to a valid method descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get a parameter given its name.  
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the required parameters is null.
+            2) the method does not contain a parameter with the input 'name'. 
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeParamPos ---------------------------------*/
+
+/* ** OBSOLETE ** */
+sword OCITypeParamPos(    OCIEnv *env, OCIError *err,
+                          CONST OCITypeMethod *mdo, 
+                          CONST oratext *name, ub4 n_length, ub4 *position, 
+                          OCITypeElem **elem    );
+/*
+   NAME: OCITypeParamPos - OCI Get a parameter's position in a method
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        mdo (IN) - pointer to the method descriptor in the object cache
+        name (IN) - the parameter's name
+        n_length (IN) - length (in bytes) of the 'name' parameter
+        position (OUT) - If this function completes successfully, 'position' 
+               points to the position of the parameter in the method starting 
+               at position 1. position MUST point to space for a ub4.
+        elem (OUT) - If this function completes successfully, and 
+               the input 'elem' is not NULL, 'elem' points to the selected 
+               parameter descriptor in the object cache.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) if 'mdo' is not null, it must point to a valid method descriptor 
+           in the object cache.
+   DESCRIPTION:
+        Get the position of a parameter in a method.  Positions start at 1.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null. 
+        OCI_ERROR if
+            1) any of the parameters is null.
+            2) the method does not contain a parameter with the input 'name'. 
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------ OCITypeParamElemMode -----------------------------*/
+
+/* ** OBSOLETE ** */
+OCITypeParamMode OCITypeElemParamMode(    OCIEnv *env, OCIError *err,
+                                          CONST OCITypeElem *elem    );
+/*
+   NAME: OCITypeElemParamMode - OCI Get a parameter's mode
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the parameter descriptor in the object cache
+                (represented by an OCITypeElem)
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the mode (in, out, or in/out) of the parameter.
+   RETURNS:
+        the mode (in, out, or in/out) of the parameter
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+
+/*------------------------- OCITypeElemDefaultValue -------------------------*/
+
+/* ** OBSOLETE ** */
+oratext* OCITypeElemDefaultValue(    OCIEnv *env, OCIError *err,
+                                  CONST OCITypeElem *elem,
+                                  ub4 *d_v_length    );
+/*
+   NAME: OCITypeElemDefaultValue - OCI Get the element's Default Value. 
+   PARAMETERS: 
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        elem (IN) - pointer to the parameter descriptor in the object cache
+                (represented by an OCITypeElem)
+        d_v_length (OUT) - length (in bytes) of the returned default value.
+               The caller must allocate space for the ub4 before calling this 
+               routine.
+   REQUIRES:
+        1) All type accessors require that the type be pinned before calling 
+           any accessor. 
+        2) All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Get the default value in text form (PL/SQL) of an element. For V8.0,
+        this only makes sense for a method parameter.
+   RETURNS:
+        The default value (text) of the parameter.
+   NOTES:
+        The type must be unpinned when the accessed information is no 
+        longer needed.
+ */
+ 
+
+/*--------------------------------------------------------------------------*/
+/*                           TYPE VERSION TABLE                             */
+/*--------------------------------------------------------------------------*/
+
+/* For V8.0, the type version table is meant to be an internal data structure
+   only for Oracle clients for type version maintanence purposes. A more
+   general version of the API may be made public in subsequent releases. */
+
+
+/*--------------------------- OCITypeVTInit --------------------------------*/
+ 
+/* ** OBSOLETE ** */
+sword OCITypeVTInit(    OCIEnv *env, OCIError *err    );
+/*
+   NAME: OCITypeVTInit - OCI type Version table INItialize
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+   REQUIRES:
+        none
+   DESCRIPTION:
+        Allocate space for and initialize the type version table and the type
+        version table's index.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if internal errors occurrs during initialization.
+ */
+ 
+/*--------------------------- OCITypeVTInsert -------------------------------*/
+ 
+/* ** OBSOLETE ** */
+sword OCITypeVTInsert(    OCIEnv *env, OCIError *err, 
+                          CONST oratext *schema_name, ub4 s_n_length, 
+                          CONST oratext *type_name, ub4 t_n_length, 
+                          CONST oratext *user_version, ub4 u_v_length    );
+/*
+   NAME: OCITypeVTInsert - OCI type Version table INSert entry.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        schema_name (IN, optional) - name of schema associated with the 
+                  type.  By default, the user's schema name is used.
+        s_n_length (IN) - length of the 'schema_name' parameter
+        type_name (IN) - type name to insert
+        t_n_length (IN) - length (in bytes) of the 'type_name' parameter
+        user_version (IN) - user readable version of the type
+        u_v_length (IN) - length (in bytes) of the 'user_version' parameter
+   REQUIRES:
+        none
+   DESCRIPTION:
+        Insert an entry into the type version table and the type version
+        table's index.  The entry's type name and user readable version
+        fields are updated with the input values.  All other fields are
+        initialized to null.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if
+            1) any of the parameters is invalid.
+            2) an entry for 'type_name' has already been registered in the
+               type version table.
+ */
+
+/*------------------------------ OCITypeVTSelect ----------------------------*/
+
+/* OCITypeVTSelect - OCI type VERSion table SELECT entry */
+/* ** OBSOLETE ** */
+sword OCITypeVTSelect(    OCIEnv *env, OCIError *err, 
+                          CONST oratext *schema_name, ub4 s_n_length, 
+                          CONST oratext *type_name, ub4 t_n_length, 
+                          oratext **user_version, ub4 *u_v_length,
+                        ub2 *version );
+/*
+   NAME: OCITypeVTSelect - OCI type Version table SELect entry.
+   PARAMETERS:
+        env (IN/OUT) - OCI environment handle initialized in object mode
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        schema_name (IN, optional) - name of schema associated with the 
+                  type.  By default, the user's schema name is used.
+        s_n_length (IN) - length of the 'schema_name' parameter
+        type_name (IN) - type name to select
+        t_n_length (IN) - length (in bytes) of the 'type_name' parameter
+        user_version (OUT, optional) - pointer to user readable version of the
+                 type
+        u_v_length (OUT, optional) - length (in bytes) of the 'user_version'
+                 parameter
+        version (OUT, optional) - internal type version
+   REQUIRES:
+        All input parameters must not be NULL and must be valid.
+   DESCRIPTION:
+        Select an entry in the type version table by name.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'env' or 'err' is null.
+        OCI_ERROR if
+            1) any of the parameters is invalid.
+            2) an entry with 'type_name' does not exist.
+ */
+
+/* Compatibility function - following function prototype retained for 
+   compatibility only */
+sword ortgcty(    OCIEnv *env, OCIError *err, OCIType *coll_tdo,
+                  OCIType **collelem_tdo    );
+
+/*---------------------------------------------------------------------------*/
+/*               Transient Type Construction functions                       */
+/*---------------------------------------------------------------------------*/
+
+sword OCITypeBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+                         OCIDuration dur, OCIType **type);
+/*
+   NAME: OCITypeBeginCreate - OCI Type Begin Creation of a transient type.
+   REMARKS
+       Begins the construction process for a transient type. The type will be
+       anonymous (no name). To create a persistent named type, the CREATE TYPE
+       statement should be used from SQL. Transient types have no identity.
+       They are pure values.
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context.
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       tc               - The TypeCode for the type. The Typecode could
+                          correspond to a User Defined Type or a Built-in type.
+                          Currently, the permissible values for User Defined 
+                          Types are OCI_TYPECODE_OBJECT for an Object Type
+                          (structured), OCI_TYPECODE_VARRAY for a VARRAY
+                          collection type or OCI_TYPECODE_TABLE for a nested
+                          table collection type. For Object types,
+                          OCITypeAddAttr() needs to be called to add each of
+                          the attribute types. For Collection types,
+                          OCITypeSetCollection() needs to be called.
+                          Subsequently, OCITypeEndCreate() needs to be called 
+                          to finish the creation process.
+                          The permissible values for Built-in type codes are
+                          specified in the user manual. Additional information
+                          on built-ins if any (like precision, scale for
+                          numbers, character set info for VARCHAR2s etc.) must
+                          be set with a subsequent call to OCITypeSetBuiltin().
+                          Subsequently OCITypeEndCreate() needs to be called
+                          to finish the creation process.
+       dur              - The allocation duration for the Type. Could be a
+                          predefined or a user defined duration.
+       type(OUT)        - The OCIType (Type Descriptor) that is being
+                          constructed.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+
+sword OCITypeSetCollection(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+                           OCIParam *collelem_info, ub4 coll_count);
+/*
+   NAME: OCITypeSetCollection - OCI Type Set Collection information
+   REMARKS :
+       Set Collection type information. This call can be called only if the
+       OCIType has been constructed with a collection typecode.
+   PARAMETERS:
+       svchp (IN)      -  The OCI Service Context.
+       errhp (IN/OUT)  -  The OCI error handle. If there is an error, it is 
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type(IN OUT)    -  The OCIType (Type Descriptor) that is being
+                          constructed.
+       collelem_info   -  collelem_info provides information on the collection
+                          element. It is obtained by allocating an OCIParam
+                          (parameter handle) and setting type information in
+                          the OCIParam using OCIAttrSet() calls.
+       coll_count      -  The count of elements in the collection. Pass 0 for
+                          a nested table (unbounded).
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+sword OCITypeSetBuiltin(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+                        OCIParam *builtin_info);
+/*
+   NAME: OCITypeSetBuiltin - OCI Type Set Builtin information.
+   REMARKS:
+       Set Built-in type information. This call can be called only if the
+       OCIType has been constructed with a built-in typecode
+       (OCI_TYPECODE_NUMBER etc.).
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context.
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is 
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type(IN OUT)     - The OCIType (Type Descriptor) that is being
+                          constructed.
+       builtin_info     - builtin_info provides information on the built-in
+                          (like precision, scale, charater set etc.). It is
+                          obtained by allocating an OCIParam (parameter handle)
+                          and setting type information in the OCIParam using
+                           OCIAttrSet() calls.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+sword OCITypeAddAttr(OCISvcCtx *svchp, OCIError *errhp, OCIType *type,
+                     CONST oratext *a_name, ub4 a_length, 
+                     OCIParam *attr_info);
+/*
+   NAME: OCITypeAddAttr - OCI Type Add Attribute to an Object Type.
+   REMARKS:
+       Adds an attribute to an Object type (that was constructed earlier with
+       typecode OCI_TYPECODE_OBJECT).
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type (IN/OUT)    - The Type description that is being constructed.
+       a_name(IN)       - Optional. gives the name of the attribute.
+       a_length         - Optional. gives length of attribute name.
+       attr_info        - Information on the attribute. It is obtained by
+                          allocating an OCIParam (parameter handle) and setting
+                          type information in the OCIParam using OCIAttrSet()
+                          calls.
+  RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+sword OCITypeEndCreate(OCISvcCtx *svchp, OCIError *errhp, OCIType *type);
+/*
+   NAME: OCITypeEndCreate - OCI Type End Creation
+   REMARKS:
+       Finishes construction of a type description.Subsequently, only access
+       will be allowed.
+   PARAMETERS:
+       svchp (IN)       - The OCI Service Context
+       errhp (IN/OUT)   - The OCI error handle. If there is an error, it is
+                          recorded in errhp and this function returns
+                          OCI_ERROR. Diagnostic information can be obtained by
+                          calling OCIErrorGet().
+       type (IN/OUT)    - The Type description that is being constructed.
+   RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR on error.
+*/
+
+/*=========================*/
+/* PUBLIC MACROS AND FLAGS */
+/*=========================*/
+
+/*--------------------------------------------------------------------------*/
+/*                          TYPE ELEMENT FLAGS                              */
+/*--------------------------------------------------------------------------*/
+
+#define OCI_TYPEELEM_REF        0x8000                   /* element is a REF */
+#define OCI_TYPEPARAM_REQUIRED  0x0800              /* parameter is required */
+
+/* macros to test flags */
+#define OCI_TYPEELEM_IS_REF(elem_flag) \
+  (((elem_flag) & OCI_TYPEELEM_REF)!=0)
+#define OCI_TYPEPARAM_IS_REQUIRED(param_flag) \
+  (((param_flag) & OCI_TYPEPARAM_REQUIRED)!=0)
+
+
+#endif /* ORT_ORACLE */
+
diff --git a/src/terralib/drivers/OracleSpatial/TeOracleSpatial.cpp b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.cpp
new file mode 100644
index 0000000..95938a9
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.cpp
@@ -0,0 +1,6810 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeOracleSpatial.h"
+
+#include <zlib.h>
+#include <jpeg.h>
+#include <sys/stat.h>
+#include "TeSpatialOperations.h"
+#include "TeGeometryAlgorithms.h"
+
+
+#define MAX(a,b) a>b?a:b
+#define MIN(a,b) a<b?a:b
+
+string 
+getOracleSpatialRelation(int relation)
+{
+	string spatialRel="";
+	switch (relation)
+	{
+		case TeDISJOINT:
+		case TeINTERSECTS:
+			spatialRel = "ANYINTERACT";	
+		break;
+
+		case TeTOUCHES:
+			spatialRel = "TOUCH";
+		break;
+
+		case TeOVERLAPS:
+			spatialRel = "OVERLAPBDYINTERSECT";
+		break;
+
+		case TeCOVERS:
+			spatialRel = "COVERS"; 
+		break;
+
+		case TeCOVEREDBY:
+			spatialRel = "COVEREDBY";
+		break;
+		
+		case TeCONTAINS:
+			spatialRel = "CONTAINS";
+		break;
+		
+		case TeWITHIN:
+			spatialRel = "INSIDE";
+		break;
+		
+		case TeEQUALS:
+			spatialRel = "EQUAL";
+		break;
+		
+		case TeCROSSES:
+			spatialRel = "OVERLAPBDYDISJOINT";
+		break;
+		default:
+			spatialRel = "";
+		break;
+	}
+	
+	return spatialRel;
+}
+
+
+TeOracleSpatial::TeOracleSpatial() 
+{
+	Conn = new OCIConnection();  
+	dbmsName_ = "OracleSpatial";
+}
+
+
+TeOracleSpatial::~TeOracleSpatial() 
+{
+	delete (Conn); //disconnect
+	Conn = NULL;
+}
+
+void
+TeOracleSpatial::close () 
+{
+	clear();
+	Conn->Disconnect();
+	isConnected_ = false;
+}
+
+
+bool
+TeOracleSpatial::connect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+	if (Conn->IsConnected())
+	{ 
+		delete (Conn);
+		Conn = new OCIConnection();
+	}
+
+	isConnected_ = false;
+	if (Conn->Connect(host.c_str(),user.c_str(),password.c_str()))
+	{
+		isConnected_ = true;
+		host_ = host;
+		user_ = user;
+		password_ = password;
+		database_ = database;
+		portNumber_ = port;
+		return true;
+	}
+	else
+	{
+		isConnected_ = false;
+		errorMessage_ = "Error connecting to database server!";
+		delete (Conn); //disconect
+		return false;
+	}
+}
+
+
+bool 
+TeOracleSpatial::tableExist(const string& table)
+{
+	bool	status;
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string exist = " SELECT table_name FROM all_tables WHERE";
+	exist += " TABLE_NAME = '" + TeConvertToUpperCase(table) + "'";
+	exist += " AND OWNER = '" + TeConvertToUpperCase(user_) + "'";
+
+	if(!ocip->query(exist))
+	{
+		delete ocip;
+		return false;
+	}
+
+	if(ocip->fetchRow())
+		status = true;
+	else
+		status = false;
+
+	delete ocip;
+	return (status);
+}
+
+
+bool 
+TeOracleSpatial::columnExist(const string& table, const string& column, TeAttribute& attr)
+{
+	bool	status = false;
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string exist = " SELECT DATA_TYPE, DATA_LENGTH, DATA_SCALE FROM ALL_TAB_COLUMNS WHERE";
+	exist += " TABLE_NAME = '" + TeConvertToUpperCase(table) + "'";
+	exist += " AND COLUMN_NAME = '" + TeConvertToUpperCase(column) + "'";
+	exist += " AND OWNER = '" + TeConvertToUpperCase(user_) + "'";
+
+	if(!ocip->query(exist))
+	{
+		delete ocip;
+		return false;
+	}
+	
+	if(ocip->fetchRow())
+	{	
+		attr.rep_.name_ = column;
+		
+		string	dataType = string(ocip->getData(0)); 
+		int		dataLength = atoi(ocip->getData(1)); 
+		int		dataScale = atoi(ocip->getData(2));
+		bool    number = false;
+		
+		if(dataType=="VARCHAR2")
+		{
+			attr.rep_.type_ = TeSTRING;
+			attr.rep_.numChar_ = dataLength;
+		}
+		else if (dataType=="BLOB")
+		{
+			attr.rep_.type_ = TeBLOB;
+			attr.rep_.numChar_ = dataLength;
+		}
+		else if (dataType=="NUMBER")
+		{
+			number = true;
+		}
+		else if (dataType=="SDO_GEOMETRY")
+		{
+			attr.rep_.type_ = TeOBJECT;
+			attr.rep_.numChar_ = dataLength;
+		}
+		else if (dataType== "CHAR")
+		{	
+			attr.rep_.type_ = TeCHARACTER;
+			attr.rep_.numChar_ = dataLength;
+		}
+		else if (dataType=="DATE")
+		{
+			attr.rep_.type_ = TeDATETIME;
+		}
+		else
+		{
+			attr.rep_.type_ = TeSTRING;
+			attr.rep_.numChar_ = dataLength;
+		}
+
+		if(number)
+		{
+			if(dataScale > 0)
+				attr.rep_.type_ = TeREAL;
+			else
+				attr.rep_.type_ = TeINT;
+		}
+		status = true;
+	}
+	
+	delete ocip;
+	return (status);
+}
+
+bool 
+TeOracleSpatial::execute (const string &q)
+{
+	bool result = Conn->Execute(q);
+	
+	if(!result)
+		errorMessage_ = Conn->getErrorMessage();
+
+	return result;
+}
+
+
+bool
+TeOracleSpatial::createTable(const string& table, TeAttributeList &attr)
+{
+	short	cont=0;
+	string pkeys ="";
+	bool	hasAutoNumber=false;
+	string	fieldName="";
+
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+
+	TeAttributeList::iterator it = attr.begin();
+	string tablec;
+	tablec = "CREATE TABLE " + table +" (";
+	
+	while ( it != attr.end())
+	{
+		if (cont)
+			tablec += ", ";
+			
+		switch ((*it).rep_.type_)
+		{
+			case TeSTRING:
+				tablec += (*it).rep_.name_ + " VARCHAR2(" + Te2String((*it).rep_.numChar_) + ")";
+			break;
+			
+			case TeREAL:
+				if((*it).rep_.decimals_>0)
+					tablec += (*it).rep_.name_ +" NUMBER(*,"+ Te2String((*it).rep_.decimals_) +") ";
+				else
+					tablec += (*it).rep_.name_ +" NUMBER(*,38) ";
+			break;
+			
+			case TeINT:
+				tablec += (*it).rep_.name_ + " NUMBER(32) ";
+				if((*it).rep_.isAutoNumber_)
+				{
+					hasAutoNumber=true;
+					fieldName=(*it).rep_.name_;
+				}
+			break;
+
+			case TeDATETIME:
+				tablec += (*it).rep_.name_ + " DATE ";
+			break;
+
+			case TeCHARACTER:
+				tablec += (*it).rep_.name_ + " CHAR ";
+			break;
+
+			case TeBLOB:
+				tablec += (*it).rep_.name_ + " BLOB ";
+			break;
+
+			default:
+				tablec += (*it).rep_.name_ + " VARCHAR2(255) ";
+			break;
+		}
+
+		// check if column is part of primary key
+		if ((*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
+		{
+			if (!pkeys.empty())
+				pkeys += ", ";
+			pkeys += (*it).rep_.name_;
+			tablec += " NOT NULL";
+		}
+
+		++it;
+		cont++;
+	}
+
+	if(!pkeys.empty())
+		tablec += ", PRIMARY KEY (" + pkeys + ") ";
+
+	tablec += ")";
+
+	if(!execute(tablec))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table " + table;
+
+		return false;
+	}
+
+	if(hasAutoNumber)
+	{
+		string dropSql = " DROP TRIGGER "+ getNameTrigger(table); 
+		execute(dropSql);
+		dropSql = " DROP SEQUENCE "+ getNameSequence(table); 
+		execute(dropSql);
+
+		if(!createSequence(table))
+		{
+			deleteTable(table);
+			return false;
+		}
+		
+		if(!createAutoIncrementTrigger(table,fieldName))
+		{
+			deleteTable(table);
+			string sql= "DROP SEQUENCE "+ getNameSequence(table);
+			execute(sql); 
+			return false;
+		}
+	}
+	return true;
+}
+
+
+TeDatabasePortal*  
+TeOracleSpatial::getPortal ()
+{
+	TeOracleSpatialPortal* ocip = new TeOracleSpatialPortal (this);
+	return ocip;
+}
+
+
+bool 
+TeOracleSpatial::addColumn (const string& table, TeAttributeRep &rep)
+{
+	if(!tableExist(table))
+		return false;
+
+	string field = TeGetExtension(rep.name_.c_str());
+	if(field.empty())
+		field = rep.name_;
+
+	string tab;
+	tab = " ALTER TABLE " + table + " ADD ( ";
+	tab += field + "  ";
+	
+	switch (rep.type_)
+	{
+		case TeSTRING:
+			tab += "VARCHAR2(" + Te2String(rep.numChar_) + ") ";
+			break;
+			
+		case TeREAL:
+			tab += "NUMBER(*,38)";	
+			break;
+			
+		case TeINT:
+			tab += "NUMBER(32)";
+			break;
+
+		case TeDATETIME:
+			tab += "DATE";
+
+		case TeCHARACTER:
+			tab += "CHAR";
+		
+		case TeBLOB:
+			tab += "BLOB";
+		
+		default:
+			tab += "VARCHAR2(" + Te2String(rep.numChar_) + ") ";
+			break;
+	}
+
+	tab += " ) ";
+
+	if(!Conn->Execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting a column to table " + table + " !";
+		return false;
+	}
+
+	return true;
+}
+
+bool
+TeOracleSpatial::deleteTable (const string& table)
+{
+	int f =	table.find ("te_collection", std::string::npos);
+
+	if( table=="te_theme" ||
+		table=="te_layer" ||
+		table=="te_representation" ||
+		table=="te_tables_relation" ||
+		table=="te_layer_table" ||
+		table=="te_color_scheme" ||
+		table=="te_raster_metadata" ||
+		table=="te_projection" ||
+		table=="te_view" ||
+		table=="te_chart_params" ||
+		table=="te_legend" ||
+		table=="te_visual" ||
+		f == 0)
+	{
+		errorMessage_ = "N�o � poss�vel deletar tabelas do modelo!";
+		return false;
+	}
+
+	string del = "DROP TABLE " + table;
+	if(!execute(del))
+		return false;
+
+	string seq = "DROP SEQUENCE " + getNameSequence(table);
+	if(!execute(seq))
+		return false;
+
+	return true;
+}
+ 
+
+bool 
+TeOracleSpatial::createViewTable ()
+{
+	string table;
+	table = "CREATE TABLE te_view ( ";
+	table += "view_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", projection_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += " CONSTRAINT view_proj UNIQUE ";
+	table += ", name ";
+	table += "VARCHAR2(255) NOT NULL";
+	table += ", user_name ";
+	table += "VARCHAR2(255) ";
+	table += ", visibility ";
+	table += "NUMBER(32) ";
+
+	table += ", PRIMARY KEY(view_id))";
+	
+	if(!execute(table))
+	{	
+		errorMessage_ = "Error creating table te_view!";
+		return false;
+	}
+	
+	//creates a sequence to table 
+	if(!createSequence("te_view"))
+	{
+		errorMessage_ = "Error creating sequence to table te_view!";
+		return false;
+	}
+
+	//creates index
+	createIndex ("te_view", "view_index", "name, user_name");
+	return true;
+}
+
+bool 
+TeOracleSpatial::createThemeTable ()
+{
+	string table;
+	table = "CREATE TABLE te_theme (";
+	table += "theme_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", layer_id ";
+	table += "NUMBER(32) NULL";
+	table += ", view_id ";
+	table += "NUMBER(32) NULL";
+	table += ", name ";
+	table += "VARCHAR2(255) NOT NULL";
+	table += ", parent_id ";
+	table += "NUMBER(32) ";
+	table += ", priority ";
+	table += "NUMBER(32) ";	
+	table += ", node_type ";
+	table += "NUMBER(32) NOT NULL";	
+		
+	table += ", min_scale ";
+	table += "NUMBER(*,38)";
+	table += ", max_scale ";
+	table += "NUMBER(*,38)";
+
+	table += ", generate_attribute_where ";
+	table += "VARCHAR2(500)";
+	table += ", generate_spatial_where ";
+	table += "VARCHAR2(500)";
+	table += ", generate_temporal_where ";
+	table += "VARCHAR2(500)";
+	
+	table += ", collection_table ";
+	table += "VARCHAR2(255)";
+
+	table += ", visible_rep ";
+	table += "NUMBER(32) NULL";
+	table += ", enable_visibility ";
+	table += "NUMBER(32) NULL";
+
+	table += ", PRIMARY KEY (theme_id))";
+	
+	if(!execute(table))
+	{	
+		errorMessage_ = "Error creating table te_theme!";
+		return false;
+	}
+
+	//creates a sequence to the tabela
+	if(!createSequence("te_theme"))
+	{
+		errorMessage_ = "Error creating sequence to table te_theme!";
+		return false;
+	}
+
+	//creates index
+	createIndex ("te_theme", "theme_view_index", "view_id");
+	return true;
+}
+
+
+bool
+TeOracleSpatial::createGroupingTable()
+{
+	string table;
+	table = "CREATE TABLE te_grouping (";
+	table += "theme_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", grouping_number ";
+	table += "NUMBER(32)";
+	table += ", grouping_attr ";
+	table += "VARCHAR2(255)";
+	table += ", grouping_attr_type ";
+	table += "NUMBER(32)";
+	table += ", grouping_mode ";
+	table += "NUMBER(32)";
+	table += ", grouping_norm_attr ";
+	table += "VARCHAR2(255)";
+	table += ", grouping_std_dev ";
+	table += "NUMBER(*,38) DEFAULT 0.0";
+	table += ", grouping_precision ";
+	table += "NUMBER(32)";
+	table += ", grouping_function ";
+	table += "VARCHAR2(20)";
+	table += ", PRIMARY KEY (theme_id))";
+	
+	if(!execute(table))
+	{	
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table te_grouping!";
+		return false;
+	}
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createThemeTablesTable()
+{
+	string table = "CREATE TABLE te_theme_table  (";
+	table += " theme_table_id ";
+	table += " NUMBER(32) NOT NULL";
+	table += ", theme_id ";
+	table += " NUMBER(32) NOT NULL ";
+	table += ", table_id ";
+	table += " NUMBER(32) NOT NULL ";
+	table += ", relation_id ";
+	table += " NUMBER(32)";
+	table += ", table_order ";
+	table += " NUMBER(32) ";
+	table += ", PRIMARY KEY (theme_table_id) ";
+	table += ")";
+	
+	if(!execute(table))
+	{	
+		errorMessage_ = "Error creating table te_theme_table!";
+		return false;
+	}
+
+	//creates a sequence to the tabela
+	if(!createSequence("te_theme_table"))
+	{
+		errorMessage_ = "Error creating sequence to table te_theme_table!";
+		return false;
+	}
+
+	//creates index
+	createIndex ("te_theme_table", "theme_table_index", "theme_id");
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createLayerTable()
+{
+	string table;
+	table = "CREATE TABLE te_layer (";
+	table += "layer_id ";
+	table += "NUMBER(32) NOT NULL ";
+	table += ", projection_id ";
+	table += "NUMBER(32) NOT NULL ";
+	table += "CONSTRAINT layer_proj UNIQUE ";
+	table += ", name ";
+	table += "VARCHAR2(255) NOT NULL ";
+	table += ", lower_x ";
+	table += "NUMBER(*,38)";
+	table += ", lower_y ";
+	table += "NUMBER(*,38)";
+	table += ", upper_x ";
+	table += "NUMBER(*,38) ";
+	table += ", upper_y ";
+	table += "NUMBER(*,38) ";
+	table += ", initial_time ";
+	table += "DATE ";
+	table += ", final_time ";
+	table += "DATE ";
+
+	table += ", PRIMARY KEY (layer_id))";
+
+	if(!execute(table))
+	{
+		errorMessage_ = "Error creating table te_layer!";
+		return false;
+	}
+
+	//creates a sequence to table 
+	if(!createSequence("te_layer"))
+	{
+		errorMessage_ = "Error creating sequence to table te_layer!";
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createLayerTableTable()
+{
+	string table;
+	table = "CREATE TABLE te_layer_table (";
+	table += "table_id ";
+	table += " NUMBER(32) NOT NULL ";
+	table += ", layer_id ";
+	table += "NUMBER(32) ";
+	table += ", attr_table ";
+	table += "VARCHAR2(255) NOT NULL ";
+	table += ", unique_id ";
+	table += "VARCHAR2(255) ";
+	table += ", attr_link ";
+	table += "VARCHAR2(255) ";
+	table += ", attr_initial_time ";
+	table += "VARCHAR2(255) ";
+	table += ", attr_final_time ";
+	table += "VARCHAR2(255) ";
+	table += ", attr_time_unit ";
+	table += "NUMBER(32) ";
+	table += ", attr_table_type ";
+	table += "NUMBER(32) ";
+	table += ", user_name ";
+	table += "VARCHAR2(255) ";
+	table += ", initial_time ";
+	table += "DATE ";
+	table += ", final_time ";
+	table += "DATE ";
+
+	table += ", PRIMARY KEY (table_id))";
+
+	if(!execute(table))
+	{
+		errorMessage_ = "Error creating table te_layer_table!";
+		return false;
+	}
+
+	//creates a sequence to table 
+	if(!createSequence("te_layer_table"))
+	{
+		errorMessage_ = "Error creating sequence to table te_layer_table!";
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createTablesRelationTable()
+{
+	string table;
+	table = "CREATE TABLE te_tables_relation (";
+	table += "relation_id ";
+	table += "NUMBER(32) NOT NULL ";
+	table += ", related_table_id ";
+	table += "NUMBER(32) NOT NULL ";
+	table += ", related_attr ";
+	table += "VARCHAR2(255) NOT NULL";
+	table += ", external_table_name ";
+	table += "VARCHAR2(255) NOT NULL";
+	table += ", external_attr ";
+	table += "VARCHAR2(255) NOT NULL ";
+
+	table += ", PRIMARY KEY (relation_id))";
+
+	if(!execute(table))
+	{
+		errorMessage_ = "Error creating table te_tables_relation!";
+		return false;
+	}
+
+	//creates a sequence to table 
+	if(!createSequence("te_tables_relation"))
+	{
+		errorMessage_ = "Error creating sequence to table te_tables_relation!";
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createRepresentationTable ()
+{
+	string table;
+	table = "CREATE TABLE te_representation (";
+	table += " repres_id ";
+	table += " NUMBER(32) NOT NULL "; 
+	table += ", layer_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", geom_type ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", geom_table ";
+	table += "VARCHAR2(255) ";
+	table += ", description "; 
+	table += "VARCHAR2(255) ";
+	table += ", lower_x ";
+	table += "NUMBER(*,38) ";
+	table += ", lower_y ";
+	table += "NUMBER(*,38) ";
+	table += ", upper_x ";
+	table += "NUMBER(*,38) ";
+	table += ", upper_y ";
+	table += "NUMBER(*,38) ";
+	table += ", res_x ";
+	table += "NUMBER(*,38) ";
+	table += ", res_y ";
+	table += "NUMBER(*,38) ";
+	table += ", num_cols ";
+	table += "NUMBER(32)";
+	table += ", num_rows ";
+	table += "NUMBER(32)";
+	table += ", initial_time ";
+	table += "DATE";
+	table += ", final_time ";
+	table += "DATE";
+	
+	table += ", PRIMARY KEY (repres_id))";
+
+	if(!execute(table))
+	{	
+		errorMessage_ = "Error creating table te_representation!";
+		return false;
+	}
+	//creates a sequence to table 
+	if(!createSequence("te_representation"))
+	{
+		errorMessage_ = "Error creating sequence to table te_representation!";
+		return false;
+	}
+
+	//creates index
+	createIndex ("te_representation", "representation_index", "layer_id, geom_type");
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createLegendTable ()
+{
+	string table;
+	table = "CREATE TABLE te_legend (";
+	table += "  legend_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", theme_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", group_id ";
+	table += "NUMBER(32)";
+	table += ", num_objs ";
+	table += "NUMBER(32)";
+	table += ", lower_value ";
+	table += "VARCHAR2(255)";
+	table += ", upper_value ";
+	table += "VARCHAR2(255)";
+	table += ", label ";
+	table += "VARCHAR2(255)";
+
+	table += ", PRIMARY KEY (legend_id))";
+
+	if(!execute(table))
+	{
+		errorMessage_ = "Error creating table te_legend!";
+		return false;
+	}
+	
+	//creates a sequence to the table 
+	if(!createSequence("te_legend"))
+	{
+		errorMessage_ = "Error creating sequence to table te_legend!";
+		return false;
+	}
+
+	//creates index
+	createIndex ("te_legend", "legend_index", "theme_id");
+	return true;
+}
+
+
+
+bool 
+TeOracleSpatial::createVisualTable()
+{
+	string table;
+	table = "CREATE TABLE te_visual (";
+	table += "  legend_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", geom_type ";
+	table += "NUMBER(32) NOT NULL";
+
+	table += ", lib_name ";
+	table += "VARCHAR2(255) ";
+	table += ", symb_id ";
+	table += "NUMBER(32) ";
+	table += ", red ";
+	table += "NUMBER(32) ";
+	table += ", green ";
+	table += "NUMBER(32) ";
+	table += ", blue ";
+	table += "NUMBER(32) ";
+	table += ", transparency ";
+	table += "NUMBER(32) ";
+	table += ", width ";
+	table += "NUMBER(32) ";
+	
+	table += ", contour_lib_name ";
+	table += "VARCHAR2(255) ";
+	table += ", contour_symb_id ";
+	table += "NUMBER(32) ";
+	table += ", contour_red ";
+	table += "NUMBER(32) ";
+	table += ", contour_green ";
+	table += "NUMBER(32) ";
+	table += ", contour_blue ";
+	table += "NUMBER(32) ";
+	table += ", contour_transp ";
+	table += "NUMBER(32) ";
+	table += ", contour_width ";
+	table += "NUMBER(32) ";
+
+	table += ", size_value ";
+	table += "NUMBER(32) ";
+	table += ", pt_angle ";
+	table += "NUMBER(32) ";
+	
+	table += ", family ";
+	table += "VARCHAR2(100)";
+	table += ", bold ";
+	table += "NUMBER(32) ";
+	table += ", italic ";
+	table += "NUMBER(32) ";
+	table += ", alignment_vert ";
+	table += "NUMBER(*,38)";
+	table += ", alignment_horiz ";
+	table += "NUMBER(*,38)";
+	table += ", tab_size ";
+	table += "NUMBER(32) ";
+	table += ", line_space ";
+	table += "NUMBER(32) ";
+	table += ", fixed_size ";
+	table += "NUMBER(32) ";
+
+	table += ", PRIMARY KEY (legend_id, geom_type))";
+
+	if(!execute(table))
+	{
+		errorMessage_ = "Error creating table te_visual!";
+		return false;
+	}
+	
+	return true;
+}
+
+bool 
+TeOracleSpatial::createVisualRasterTable()
+{
+	string create = "CREATE TABLE te_visual_raster (";
+	create += " theme_id		NUMBER(32) NOT NULL,";
+	create += " band_in			NUMBER(32) NOT NULL,";
+	create += " band_out		NUMBER(32), ";
+	create += " transf_type		NUMBER(32), ";
+	create += " param1			FLOAT,";
+	create += " param2			FLOAT,";
+	create += " lut_table		VARCHAR2(255), ";
+	create += " PRIMARY KEY (theme_id, band_in))";
+	
+	if(!execute(create))
+	{
+		errorMessage_ = "Error creating table te_visual_raster!";
+		return false;
+	}
+	
+	return true;
+}
+
+bool 
+TeOracleSpatial::createDatabaseTable()
+{
+	string create = "CREATE TABLE te_database (";
+	create += "db_version		VARCHAR(50) NOT NULL,";
+	create += "db_creation		DATE,";
+	create += "PRIMARY KEY (db_version))";
+	return (execute (create));
+}
+
+bool 
+TeOracleSpatial::createProjectionTable ()
+{
+	string table;
+	table = "CREATE TABLE te_projection (";
+	table += "projection_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", name ";
+	table += "VARCHAR2(255) NOT NULL";
+	table += ", long0 ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", lat0 ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", offx ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", offy ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", stlat1 ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", stlat2 ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", unit ";
+	table += "VARCHAR2(100) ";
+	table += ", scale ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", hemis ";
+	table += "NUMBER(32) ";
+	table += ", datum ";
+	table += "VARCHAR2(100) ";
+	table += ", radius ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", flattening ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", dx ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", dy ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	table += ", dz ";
+	table += "NUMBER(*,38) DEFAULT 0.0000 NOT NULL ";
+	
+	table += ", PRIMARY KEY (projection_id))";
+
+	if(!execute(table))
+	{
+		errorMessage_ = "Error creating table te_projection!";
+		return false;
+	}
+	
+	//creates a sequence to table 
+	if(!createSequence("te_projection"))
+	{
+		errorMessage_ = "Error creating sequence to table te_projection!";
+		return false;
+	}
+
+	return true;
+}
+
+bool
+TeOracleSpatial::createRasterMetadataTable(const string& tableName)
+{
+	if(tableExist(tableName))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string table;
+	table = "CREATE TABLE "+ tableName +" (";
+	table += " geom_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", band_id ";
+	table += "NUMBER(32) NOT NULL";
+	table += ", min_value ";
+	table += "NUMBER(*,38) DEFAULT 0.0 ";
+	table += ", max_value ";
+	table += "NUMBER(*,38) DEFAULT 0.0 ";
+	table += ", num_bits ";
+	table += "NUMBER(32)";
+	table += ", data_type ";
+	table += "NUMBER(32)";
+	table += ", photometric_type ";
+	table += "NUMBER(32)";
+	table += ", compression_type ";
+	table += "NUMBER(32)";
+	table += ", dummy ";
+	table += "NUMBER(*,38) DEFAULT 0.0";
+	
+	table += ", PRIMARY KEY (geom_id, band_id))";
+
+	if(!execute(table))
+	{	
+		errorMessage_ = "Error creating table "+ tableName +"!";
+		return false;
+	}
+	
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createLUTTable(const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string tab;
+	tab = "CREATE TABLE " + table + " ( ";
+	tab += "index_id ";
+	tab += "NUMBER(32) NOT NULL ";
+	tab += ", r_val ";
+	tab += "NUMBER(32) NOT NULL ";
+	tab += ", g_val ";
+	tab += "NUMBER(32) NOT NULL ";
+	tab += ", b_val ";
+	tab += "NUMBER(32) NOT NULL ";
+	
+	tab += ", PRIMARY KEY (index_id))";
+
+	if(!execute(tab))
+	{
+		errorMessage_ = "Error creating table " + table ;
+		return false;
+	}
+
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table,"index_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+
+bool
+TeOracleSpatial::createCollectionTable(const string& tableName)
+{
+	
+	if(tableExist(tableName))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string table = "CREATE TABLE "+ tableName +" (";
+	table += " c_object_id ";
+	table += "VARCHAR2(255) NOT NULL";
+	table += ", c_legend_id  ";
+	table += "NUMBER(32) ";
+	table += ", label_x ";
+	table += "NUMBER(*,38) ";
+	table += ", label_y ";
+	table += "NUMBER(*,38) ";
+	table += ", c_legend_own ";
+	table += "NUMBER(32) ";
+	table += ", c_object_status ";
+	table += "NUMBER(32) ";
+	
+	table += ", PRIMARY KEY (c_object_id))";
+
+	if(!execute(table))
+	{	
+		errorMessage_ = "Error creating table " + tableName + "!";
+		return false;
+	}
+
+	createIndex (tableName, tableName+"_index_1", "c_legend_id");
+	createIndex (tableName, tableName+"_index_2", "c_legend_own");
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createCellGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string tab;
+	tab = "CREATE TABLE " + table + "(";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255) NULL";
+	tab += ", col_number ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", row_number ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", spatial_data ";
+	tab += "MDSYS.SDO_GEOMETRY";	
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if (!execute(tab))
+	{
+		errorMessage_ = "Error creating table " + table + " !" ;
+		return false;
+	}
+
+	//creates indexes
+	createIndex (table, table + "obj_idx", "object_id"); 	
+	createIndex(table, table + "rc_idx", "row_number, col_number"); 
+
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table,"geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createTextGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string tab;
+	tab = "CREATE TABLE " + table +"(";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255) ";
+	tab += ", x ";
+	tab += "NUMBER(*,38) NULL";
+	tab += ", y ";
+	tab += "NUMBER(*,38) NULL";
+	tab += ", text_value ";
+	tab += "VARCHAR2(255) NULL";
+	tab += ", angle ";
+	tab += "NUMBER(*,38) ";
+	tab += ", height ";
+	tab += "NUMBER(*,38) ";
+	tab += ", alignment_vert ";
+	tab += "NUMBER(*,38) ";
+	tab += ", alignment_horiz ";
+	tab += "NUMBER(*,38) ";
+	
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if(!execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table  " + table + " !";
+		return false;
+	}
+
+	//creates indexes
+	createIndex(table, table + "obj_idx", "object_id");
+	createIndex(table, table + "xy_idx", "x,y"); 
+		
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table, "geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createArcGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+
+	string tab;
+	tab = "CREATE TABLE " + table +"(";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255) NULL";
+	tab += ", from_node ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", to_node ";
+	tab += "NUMBER(32) NOT NULL";
+	
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if(!execute(tab))
+	{
+		errorMessage_ = "Error creating table " + table ;
+		return false;
+	}
+
+	//creates indexes
+	createIndex(table, table + "obj_idx", "object_id");
+	createIndex(table, table + "fn_idx", "from_node"); 
+	createIndex(table, table + "tn_idx", "to_node"); 
+		
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table,"geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createNodeGeometry (const string& table)
+{
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+		
+	string tab;
+	tab = "CREATE TABLE " + table + " (";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL ";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255) NULL";
+	tab += ", spatial_data ";
+	tab += "MDSYS.SDO_GEOMETRY";
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if(!execute(tab))
+	{
+		errorMessage_ = "Error creating table  " + table + " !";
+		return false;
+	}
+	
+	//creates indexes
+	createIndex(table, table + "obj_idx", "object_id"); 
+				
+	///creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table,"geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createRasterGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+
+	string create = "CREATE TABLE " + table + " (";
+	create += "geom_id		NUMBER(32) NOT NULL,";
+	create += "object_id	VARCHAR2(255) NOT NULL,";
+	create += "raster_table VARCHAR2(255) NOT NULL,";
+	create += "lut_table	VARCHAR2(255) ,";
+	create += "res_x		NUMBER(*,38) DEFAULT 0.0,";
+	create += "res_y		NUMBER(*,38) DEFAULT 0.0,";
+	create += "num_bands	NUMBER(32),";
+	create += "num_cols		NUMBER(32),";
+	create += "num_rows		NUMBER(32),";
+	create += "block_height NUMBER(32),";
+	create += "block_width	NUMBER(32),";
+	create += "lower_x		NUMBER(*,38) DEFAULT 0.0,";
+	create += "lower_y		NUMBER(*,38) DEFAULT 0.0,";
+	create += "upper_x		NUMBER(*,38) DEFAULT 0.0,";
+	create += "upper_y		NUMBER(*,38) DEFAULT 0.0,";
+	create += "tiling_type  NUMBER(32),";
+	create += "PRIMARY KEY (geom_id))";
+	
+	if(!execute (create))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table " + table + " !" ;
+		return false;
+	}
+	
+	createIndex(table, table + "obj_idx", "object_id"); 
+	
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table,"geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+	
+	return true;
+}
+
+bool 
+TeOracleSpatial::createRasterTable (const string& tableName)
+{
+	string tab;
+	tab = "CREATE TABLE "+ tableName + " ( ";
+	tab += "block_id ";
+	tab += " VARCHAR2(50) NOT NULL";
+	tab += ", band_id ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", resolution_factor ";
+	tab += "NUMBER(32) ";
+	tab += ", subband ";
+	tab += "NUMBER(32) ";
+	tab += ", block_box ";
+	tab += "MDSYS.SDO_GEOMETRY ";
+	tab += ", block_size ";
+	tab += "NUMBER(32) ";
+	tab += ", spatial_data ";
+	tab += "BLOB ";
+	
+	tab += ", PRIMARY KEY (block_id))";
+
+	if(!execute(tab))
+	{
+		errorMessage_ = "Error creating table " + tableName ;
+		return false;
+	}
+	
+	createIndex(tableName, tableName + "band_idx", "band_id"); 
+	createIndex(tableName, tableName + "sbnd_idx", "subband");
+	createIndex(tableName, tableName + "rf_idx", "resolution_factor");
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createPolygonGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string tab;
+	tab = "CREATE TABLE " + table + " ( ";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL ";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255) NULL";
+	tab += ", spatial_data ";
+	tab += "MDSYS.SDO_GEOMETRY";
+
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if(!execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table " + table ;
+		return false;
+	}
+
+	//creates indexes
+	createIndex(table, table + "obj_idx", "object_id");
+		
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	//creates trigger
+	if(!createAutoIncrementTrigger(table, "geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createLineGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+	
+	string tab;
+	tab = "CREATE TABLE " + table + " ( ";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255)  NULL";
+	tab += ", spatial_data ";
+	tab += "MDSYS.SDO_GEOMETRY";
+	
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if(!execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table " + table + " !" ;
+		return false;
+	}
+
+	//creates indexes
+	createIndex(table, table + "obj_idx", "object_id");
+			
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	//creates trigger
+	if(!createAutoIncrementTrigger(table, "geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::createPointGeometry (const string& table)
+{
+	
+	if(tableExist(table))
+	{
+		errorMessage_= "Table already exist!";
+		return false;
+	}
+
+	string tab;
+	tab = "CREATE TABLE " + table + " ( ";
+	tab += "geom_id ";
+	tab += "NUMBER(32) NOT NULL";
+	tab += ", object_id ";
+	tab += "VARCHAR2(255) NULL";
+	tab += ", spatial_data ";
+	tab += "MDSYS.SDO_GEOMETRY";
+	
+	tab += ", PRIMARY KEY (geom_id))";
+
+	if(!execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating table " + table + " !" ;
+		return false;
+	}	
+		
+	//creates indexes
+	createIndex(table, table + "obj_idx", "object_id");
+		
+	//creates a sequence to table 
+	if(!createSequence(table))
+	{
+		deleteTable(table);
+		return false;
+	}
+
+	if(!createAutoIncrementTrigger(table,"geom_id"))
+	{
+		deleteTable(table);
+		string sql= "DROP SEQUENCE "+ getNameSequence(table);
+		execute(sql); 
+		return false;
+	}
+
+	return true;
+}
+
+bool 
+TeOracleSpatial::insertRelationInfo(const int tableId, const string& tField,
+						  const string& rName, const string& rField, int& relId)
+{
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	relId = -1;
+	string sel = "SELECT relation_id FROM te_tables_relation WHERE";
+	sel += " table_id = " + Te2String(tableId);
+	sel += " AND attr_link = '" + tField + "'";
+	sel += " AND related_table = '" + rName + "'";
+	sel += " AND related_link = '" + rField + "'";
+	if (!ocip->query(sel))
+	{
+		delete ocip;
+		return false;
+	}
+
+	if (ocip->fetchRow())
+	{
+		relId = atoi(ocip->getData(0));
+		delete ocip;
+		return true;
+	}
+
+	string seq, ins;
+	seq = getNameSequence("te_tables_relation");	
+	ins = " INSERT INTO te_tables_relation ( "; 
+	ins += " relation_id, attr_link, table_id, ";
+	ins += " related_table, related_link) VALUES ( ";
+	ins += seq +".NEXTVAL "; 
+	ins += ",  " + Te2String(tableId);
+	ins += ", '" + escapeSequence(tField) + "'";
+	ins += ", '" +  escapeSequence(rName) + "'";
+	ins += ", '" +  escapeSequence(rField) + "'";
+	ins += ")";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting tables information!";   
+		delete ocip;
+		return false;
+	}
+
+	ins = "SELECT "+ seq +".CURRVAL FROM DUAL";
+	if (!ocip->query(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_table_relation_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	relId = atoi((const char*)ocip->getData(0));
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::insertTableInfo (int layerId, TeTable &table, const string& user)
+{
+	string ins, seq;
+
+	seq = getNameSequence("te_layer_table");
+	ins = "INSERT INTO te_layer_table ( "; 
+	ins += " table_id, layer_id, attr_table, unique_id, attr_link, ";
+	ins += " attr_initial_time, attr_final_time, attr_time_unit, ";
+	ins += " attr_table_type, user_name) VALUES ( ";
+	ins += seq + ".NEXTVAL "; 
+	
+	if(layerId>0)
+		ins += ", " + Te2String(layerId);
+	else
+		ins += ", " + NULL;
+	
+	ins += ", '" + escapeSequence(table.name()) + "'";
+	ins += ", '" + escapeSequence(table.uniqueName()) + "'";
+	ins += ", '" + escapeSequence(table.linkName()) + "'";
+	ins += ", '" + escapeSequence(table.attInitialTime()) + "'";
+	ins += ", '" + escapeSequence(table.attFinalTime()) + "'";
+	ins += ",  " + Te2String(table.attTimeUnit());
+	ins += ",  " + Te2String(table.tableType());
+	ins += ", '" +  escapeSequence(user) + "'";
+	ins += ")";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting tables information!";   
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	ins = "SELECT "+ seq +".CURRVAL FROM DUAL";
+	if (!ocip->query(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_layer_table_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0));
+	table.setId(index);
+	delete ocip;
+	return true;
+}
+
+
+TeDBRelationType 
+TeOracleSpatial::existRelation(const string& tableName, const string& relName)
+{
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return TeNoRelation;
+	
+	string integ = " SELECT DELETE_RULE  ";
+	integ += " FROM   all_constraints ";
+	integ += " WHERE  CONSTRAINT_TYPE = 'R'"; 
+	integ += " AND    OWNER = '" + TeConvertToUpperCase(user_) + "'";
+	integ += " AND    CONSTRAINT_NAME = '" + TeConvertToUpperCase(relName) + "'";
+	
+	string temp = " AND    TABLE_NAME = '" + TeConvertToUpperCase(tableName) + "' ";   
+	integ += temp;
+	
+	if(!ocip->query(integ))
+	{
+		delete ocip;
+		return TeNoRelation;
+	}
+
+	string cascade;
+	if(ocip->fetchRow())
+	{
+		cascade = string(ocip->getData(0));
+		if(cascade== "CASCADE")
+		{
+			delete ocip;
+			return TeRICascadeDeletion;
+		}
+		
+		delete ocip;
+		return TeRINoCascadeDeletion;
+	}
+
+	delete ocip;
+	return TeNoRelation;	
+}
+
+
+bool 
+TeOracleSpatial::createRelation (const string& name, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion)
+{
+	string relation = "ALTER TABLE " + table + " ADD ";
+	relation += " CONSTRAINT " + name;
+	relation += " FOREIGN KEY ( " + fieldName + ") "; 
+	relation += " REFERENCES " + relatedTable + "(" + relatedField + ")";
+		
+	if (cascadeDeletion)
+		relation += " ON DELETE CASCADE ";
+
+	if(!execute(relation))
+		return false;
+
+	return true;
+}
+
+string 
+TeOracleSpatial::getSQLBoxWhere (TeBox &box, TeGeomRep rep)
+{
+	string wherebox;
+	string colname = "spatial_data";
+
+	if(rep == TeRASTER)
+		colname = "block_box";
+
+	if(rep == TeTEXT)
+	{
+		wherebox = TeDatabase::getSQLBoxWhere (box, rep);
+		return wherebox;
+	}
+
+	wherebox = "mdsys.sdo_filter (" + colname +",";
+	wherebox += "mdsys.sdo_geometry(2003,null,null,";
+	wherebox += "mdsys.sdo_elem_info_array(1,1003,3),";
+	wherebox += "mdsys.sdo_ordinate_array(";
+	wherebox += Te2String(box.x1(),10) + ", " + Te2String(box.y1(),10);
+	wherebox += ", " + Te2String(box.x2(),10) + ", " + Te2String(box.y2(),10) + ")),";
+	wherebox += "'mask=anyinteract querytype = window') = 'TRUE'";
+
+	return wherebox;
+}
+
+
+string 
+TeOracleSpatial::getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1)
+{
+	string wherebox;
+	string colname1, colname2; 
+	colname1 = colname2 = "spatial_data";
+	
+	if(rep1 == TeRASTER) 
+		colname1 = "block_box";
+
+	if(rep2 == TeRASTER)
+		colname2 = "block_box";
+		
+	wherebox =  "MDSYS.SDO_FILTER ("+ table1 +"."+ colname1 +",";
+	wherebox += table2 +"."+ colname2 +", 'querytype = window') = 'TRUE'";  
+
+	return wherebox;
+}
+
+
+string 
+TeOracleSpatial::getSQLBoxSelect (const string& tableName, TeGeomRep rep)
+{
+	
+	string select;
+	string colname = "spatial_data";
+
+	if(rep == TeRASTER)
+		colname = "block_box";
+
+	select =  tableName +".* , ";
+	select += " SDO_GEOM.SDO_MIN_MBR_ORDINATE("+ tableName +"."+ colname +", 1) as lower_x,";
+	select += " SDO_GEOM.SDO_MIN_MBR_ORDINATE("+ tableName +"."+ colname +", 2) as lower_y,";
+	select += " SDO_GEOM.SDO_MAX_MBR_ORDINATE("+ tableName +"."+ colname +", 1) as upper_x,"; 
+	select += " SDO_GEOM.SDO_MAX_MBR_ORDINATE("+ tableName +"."+ colname +", 2) as upper_y ";
+	return select;
+}
+
+bool 
+TeOracleSpatial::getMBRSelectedObjects(string geomTable,string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep /* repType */,TeBox &bout, const double& tol)
+{
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	if (!portal)
+		return false;
+
+	string sql = "SELECT SDO_AGGR_MBR(" + colGeom + ") ";
+	sql += " FROM " + fromClause;
+	
+	if(!whereClause.empty())
+		sql += " WHERE " + whereClause;  
+	
+	if(!portal->query(sql)) 
+	{
+		delete portal;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	try
+	{
+		TeCoord2D coord1,coord2;
+		portal->GetCoordinates (1, coord1);
+		portal->GetCoordinates (2, coord2);
+		TeBox b(coord1.x()-tol, coord1.y()-tol, coord2.x()+tol, coord2.y()+tol);
+		bout = b;
+	}
+	
+	catch(...)
+	{
+		delete portal;
+		return false;
+	}
+	
+	delete portal;
+	return true;
+}
+
+
+string
+TeOracleSpatial::getSQLStatistics (TeGroupingAttr& attrs)
+{
+	string sql = "";
+	string virg = "";
+
+	TeGroupingAttr::iterator it = attrs.begin();
+	int count = 0;
+	while(it != attrs.end())
+	{
+		if(count>0)
+			virg = ",";
+
+		switch ((*it).second)
+		{
+			case TeSUM:
+				sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMAXVALUE:
+				sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMINVALUE:
+				sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeCOUNT:
+				sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMEAN:
+				sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeSTANDARDDEVIATION:
+				sql += virg +" STDDEV( "+ (*it).first.name_ +") AS STDDEV_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeVARIANCE:
+				sql += virg +" VARIANCE( "+ (*it).first.name_ +") AS VAR_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			default:
+				break;
+		}
+		++it;
+	}
+	return sql;
+}
+
+string 
+TeOracleSpatial::getSQLAutoNumber(const string& table)
+{
+	string aut = getNameSequence(table) +".NEXTVAL";
+	return aut;
+}
+
+bool 
+TeOracleSpatial::getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	if (!portal)
+		return false;
+
+	string sql = "SELECT SDO_GEOM.SDO_MBR(" + tableGeom + "." + colGeom + ") ";
+	sql += " FROM " + tableGeom;
+	sql += " WHERE object_id = '" + object_id + "'";
+
+	if((!portal->query(sql)) || (!portal->fetchRow()))
+	{
+		delete portal;
+		return false;
+	}
+	
+	TeCoord2D coord1,coord2;
+	portal->GetCoordinates (1, coord1);
+	portal->GetCoordinates (2, coord2);
+	TeBox b(coord1.x(), coord1.y(), coord2.x(), coord2.y());
+	box = b;
+	
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, 
+								   unsigned char *buf,unsigned long size, int band, unsigned int res, unsigned int subband)
+{
+
+	if (blockId.empty()) // no block identifier provided
+	{
+		errorMessage_ = "bloco sem identificador";
+		return false;
+	}
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) this->getPortal();
+	if (!portal)
+		return false;
+
+	bool update = false;
+	string q ="SELECT * FROM " + table; 
+	q += " WHERE block_id='" + blockId + "' FOR UPDATE ";
+
+	if (!portal->query (q))
+	{
+		delete portal;
+		return false;
+	}
+		// check if this block is alread in the database
+	if (portal->fetchRow())
+		update = true;
+
+	string sdo_geom = " MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+	sdo_geom += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+	sdo_geom += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+	sdo_geom += Te2String(ll.x());
+	sdo_geom += ", " + Te2String(ll.y());
+	sdo_geom += ", " + Te2String(ur.x());
+	sdo_geom += ", " + Te2String(ur.y());
+	sdo_geom += ")) ";
+
+	try
+	{
+		if (!update)
+		{
+			portal->freeResult();
+
+			q = "INSERT INTO "+ table +" (block_id, band_id, subband, ";
+			q += " resolution_factor, block_box, block_size, spatial_data) VALUES ( ";
+			q += "'" + blockId + "'";
+			q += ", " + Te2String(band);
+			q += ", " + Te2String(subband);
+			q += ", " + Te2String(res);
+			q += ", " + sdo_geom;
+			q += ", " + Te2String(size);
+			q += ", EMPTY_BLOB()";
+			q += ")";
+	
+			if (!this->Conn->Execute(q))
+				return false;
+			
+			q = "SELECT * FROM " + table; 
+			q += " WHERE block_id= '" + blockId + "' FOR UPDATE ";
+			
+			if((!portal->query(q)) || (!portal->fetchRow()))
+			{
+				delete portal;
+				return false;
+			}
+		}
+		
+		portal->getCursor()->WriteBlob(buf, size);
+		portal->freeResult();		
+	}
+	catch(...)
+	{
+		errorMessage_ = "Oppps !";
+		delete portal;
+		return false;
+	}
+	delete portal;
+	return true;
+	
+}
+
+bool 
+TeOracleSpatial::insertBlob (const string& tableName, const string& /* columnBlob */, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size)
+{
+	
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	if (!portal)
+		return false;
+
+	try
+	{
+		string q = "SELECT * FROM "+ tableName +" WHERE "+ columnId.name_ +" = ";
+	
+		switch (columnId.type_ )
+		{
+			case TeSTRING:
+				q += "'"+ valueId + "'";
+				break;
+			default:
+				q += valueId;
+				break;
+		}
+		q += " FOR UPDATE ";
+
+		if((!portal->query(q)) || (!portal->fetchRow()))
+		{
+			delete portal;
+			return false;
+		}
+				
+		portal->getCursor()->WriteBlob(data, size);
+		portal->freeResult();		
+	}
+
+	catch(...)
+	{
+		errorMessage_ = "Error!";
+		delete portal;
+		return false;
+	}
+
+	delete portal;
+	if(data)
+		delete []data;
+	return true;
+}
+	
+
+bool 
+TeOracleSpatial::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName)
+{
+	unsigned char	*cdata = 0;
+	int		size;
+	FILE	*fp = 0;
+	
+	struct	_stat stat;
+	int		result;
+	
+	result = _stat(fileName.c_str(), &stat);
+	
+	if( result != 0 )
+		return false;
+	
+	size = stat.st_size;
+
+	cdata = new unsigned char[size];
+	fp = fopen(fileName.c_str(), "rb");
+	fread(cdata, sizeof(unsigned char), size, fp); 
+
+	bool status = insertBlob (tableName, columnBlob, columnId,  valueId, cdata, size);
+
+	if(fp)
+		fclose(fp);
+
+	return status;
+}
+	
+
+bool 
+TeOracleSpatial::dropConceptualModel()
+{
+	//drop tables
+	string drop = "	DROP TABLE te_raster_metadata";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_representation";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_tables_relation";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_layer_table";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_visual";
+	if(!execute(drop))
+		return false;
+	
+	drop = "DROP TABLE te_legend";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_theme";
+	if(!execute(drop))
+		return false;
+	
+	drop = "DROP TABLE te_theme_table";
+	if(!execute(drop))
+		return false;
+	
+	drop = "DROP TABLE te_view";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_layer";
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP TABLE te_projection";
+	if(!execute(drop))
+		return false;
+
+	//drop sequences
+	drop = "DROP SEQUENCE "+ getNameSequence("te_tables_relation"); 
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_layer_table");  
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_legend");
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_theme");
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_theme_table");
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_view"); 
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_layer");
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_projection");
+	if(!execute(drop))
+		return false;
+
+	drop = "DROP SEQUENCE "+ getNameSequence("te_representation");
+	if(!execute(drop))
+		return false;
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)this->getPortal();
+		
+	//tabelas geometricas com SDO_GEOMETRY
+	string sql = "SELECT TABLE_NAME FROM USER_SDO_GEOM_METADATA ";
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	while(portal->fetchRow())
+	{
+		string tableName = portal->getData(0);
+		string del = "drop table " + tableName;
+		this->execute (del);
+	}
+	
+	portal->freeResult();
+
+	sql = "DELETE USER_SDO_GEOM_METADATA ";
+	this->execute(sql);
+	
+	//spatial index
+	sql = "SELECT INDEX_NAME FROM USER_SDO_INDEX_INFO";
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	while(portal->fetchRow())
+	{
+		string indexName = portal->getData(0);
+		string del = "drop index " + indexName;
+		this->execute(del);
+	}
+	
+	delete portal;
+	return true;
+}
+
+TeOracleSpatialPortal::TeOracleSpatialPortal ( TeOracleSpatial*  pDatabase) 
+{
+	cursor = new OCICursor(pDatabase->Conn);
+	db_ = pDatabase;
+}
+
+
+TeOracleSpatialPortal::~TeOracleSpatialPortal () 
+{
+	delete cursor;
+	cursor = NULL;
+}
+
+
+bool TeOracleSpatialPortal::isConnected()
+{
+	return (cursor->Conn()->IsConnected());
+}
+
+
+bool TeOracleSpatialPortal::isEOF() 
+{
+	if (!isConnected())
+		return true;
+
+	return false;
+}
+
+
+bool
+TeOracleSpatialPortal::moveFirst() 
+{
+	if (cursor->MoveFirst())
+		return true;
+	else
+		return false;
+}
+
+
+bool 
+TeOracleSpatialPortal::moveNext() 
+{
+	if(cursor->MoveNext())
+		return true;
+	return false;
+}
+
+
+bool TeOracleSpatialPortal::query (const string &q,TeCursorLocation /* l */ , TeCursorType /* t */, TeCursorEditType /* e */, TeCursorDataType /* dt */)  //Ok
+{
+	errorMessage_.clear ();
+
+	if (!cursor->isOpen())
+	{
+		if(!cursor->Open())
+		{
+			numRows_ = 0;
+			return false;
+		}
+	}
+
+	if (!cursor->Query(q))
+	{
+		this->errorMessage_ = cursor->getErrorMessage();
+		numRows_ = 0;
+		return false;
+	}
+	
+	numFields_= this->cursor->NumCol();
+	
+	attList_.clear ();
+	int i;
+	for(i = 1; i <= numFields_ ; i++)
+	{
+		TeAttribute attribute;
+
+		switch (cursor->ColType(i))
+		{
+			case 3: //INTEGER
+			attribute.rep_.type_ = TeINT;
+			break;
+
+			case 2:  //NUMBER
+			case 4: //FLOAT DOUBLE
+			attribute.rep_.type_ = TeREAL;
+			break;
+
+			case 12: //Date
+			attribute.rep_.type_ = TeDATETIME;
+			attribute.dateChronon_ = TeSECOND;
+			attribute.dateTimeFormat_ = "DD/MM/YYYY HH24:MI:SS";
+			break;
+
+			case 113: //Blob
+			attribute.rep_.type_ = TeBLOB;
+			break;
+
+			case 96: //CHAR
+			case 9: //VARCHAR:
+			case 1: //VARCHAR2:
+			attribute.rep_.type_ = TeSTRING;
+			break;
+
+			case 108: //OBJECT: // SDO_GEOMETRY
+			attribute.rep_.type_ = TeOBJECT;
+			break;
+			default :
+			attribute.rep_.type_ = TeUNKNOWN;
+			break;
+		} 
+		
+		//attribute.rep_.name_ = TeConvertToLowerCase(cursor->ColName(i)); 
+		attribute.rep_.name_ = cursor->ColName(i); 
+		attribute.rep_.numChar_ = cursor->ColSize(i);
+		attList_.push_back ( attribute );
+
+	}
+
+	curRow_=-1;
+	return true;
+}
+
+
+
+bool TeOracleSpatialPortal::querySDO (const string &q)  
+{
+	errorMessage_.clear ();
+
+	if (!cursor->isOpen())
+	{
+		if(!cursor->Open())
+		{
+			numRows_ = 0;
+			return false;
+		}
+	}
+
+	if (!cursor->QuerySDO(q))
+	{
+		this->errorMessage_ = cursor->getErrorMessage();
+		numRows_ = 0;
+		return false;
+	}
+	
+	numFields_= this->cursor->NumCol();
+	
+	attList_.clear ();
+	int i;
+	for(i = 1; i <= numFields_ ; i++)
+	{
+		TeAttribute attribute;
+
+		switch (cursor->ColType(i))
+		{
+			case 3: //INTEGER
+			attribute.rep_.type_ = TeINT;
+			break;
+
+			case 2:  //NUMBER
+			case 4: //FLOAT DOUBLE
+			attribute.rep_.type_ = TeREAL;
+			break;
+
+			case 12: //Date
+			attribute.rep_.type_ = TeDATETIME;
+			break;
+
+			case 113: //Blob
+			attribute.rep_.type_ = TeBLOB;
+			break;
+
+			case 96: //CHAR
+			case 9: //VARCHAR:
+			case 1: //VARCHAR2:
+			attribute.rep_.type_ = TeSTRING;
+			break;
+
+			case 108: //OBJECT: // SDO_GEOMETRY
+			attribute.rep_.type_ = TeOBJECT;
+			break;
+			default :
+			attribute.rep_.type_ = TeUNKNOWN;
+			break;
+		} 
+		
+		attribute.rep_.name_ = cursor->ColName(i); 
+		attribute.rep_.numChar_ = cursor->ColSize(i);
+		attList_.push_back ( attribute );
+	}
+
+	curRow_=-1;
+	return true;
+}
+
+
+void TeOracleSpatialPortal::freeResult () 
+{
+	cursor->FreeResult();
+}
+
+
+bool TeOracleSpatialPortal::fetchRow () 
+{
+	try
+	{	
+		if( !isConnected() )
+			return false;
+		if( numFields_ == 0/* || numRows_ < 1*/)
+			return false;
+		
+		if (curRow_ == -1)
+		{
+			if(moveFirst())
+				curRow_++;
+			else
+				return false;
+		}
+		else
+		if (moveNext())
+		{
+			curRow_++;
+			return true;
+		}
+		else
+			return false;
+	}
+	
+	catch(...) //_com_error &e)
+	{
+		return false;
+	}
+
+	return true;
+}
+
+bool TeOracleSpatialPortal ::fetchRow (int i)
+{
+	
+	if(curRow_ == i)
+		return true;
+
+	if (cursor->MoveTo(i))
+	{
+		curRow_ = cursor->CurrentRow()
+			;
+		return true;
+	}
+	
+	return false;
+}
+
+string  
+TeOracleSpatial::escapeSequence (const string& from)
+{
+	string aux = "";
+	unsigned int size = from.length ();
+	unsigned int i;
+
+	for(i=0; i < size; i++)
+	{
+		if(from[i] == 39) 
+			aux += from[i] + unsigned char(39);
+		else
+			aux += from[i];
+    }
+	return aux;
+}
+
+bool 
+TeOracleSpatial::insertTable(TeTable &table)
+{
+	string tableName = table.name();
+	int size = table.size();
+	TeAttributeList att = table.attributeList();
+	TeAttributeList::iterator it = att.begin();
+	TeAttributeList::iterator itEnd = att.end();
+
+	TeTableRow row;
+	int i;
+	unsigned int j;
+	for ( i = 0; i < size; i++  )
+	{
+		row = table[i];
+		it = att.begin();
+		string q = 	"INSERT INTO "+tableName+" VALUES(";
+		j = 1;
+		int jj = 0;
+		while ( it != itEnd )
+		{
+			if (j != 1)
+				q += ", ";
+
+  			string oracleFormat="";
+			string dateTime="";
+			if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
+			{
+				TeTime t  (row[jj], (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_,
+						   (*it).timeSeparator_, (*it).indicatorPM_);
+				
+				dateTime = t.getDateTime("DDsMMsYYYYsHHsmmsSS");
+				oracleFormat = " TO_DATE('" + dateTime + "', 'DD/MM/YYYY HH24:MI:SS')";
+			}
+			
+			switch ((*it).rep_.type_)
+  			{
+  				case TeSTRING:
+					q += "'"+ escapeSequence(row[jj]) +"'";
+  				break;
+  				case TeREAL:
+					q += row[jj]; 
+  				break;
+  				case TeINT:
+					q += row[jj];
+  				break;
+				case TeDATETIME:
+					q += oracleFormat;
+  				break;
+				case TeCHARACTER:
+					q += "'" + escapeSequence(row[jj]) + "'";
+  				break;
+				case TeBLOB:
+					q += " EMPTY_BLOB() ";
+				break;
+  				default:
+					q += "'"+ escapeSequence(row[jj]) +"'";
+  				break;
+  			}
+			++it;
+			j++;
+			jj++;
+		}
+		q += ")";
+		
+		if (!execute(q))
+			continue;
+	}
+	return true;
+}
+	
+	
+bool
+TeOracleSpatial::updateTable (TeTable &table)
+{
+	string tableName = table.name();
+	TeAttributeList att = table.attributeList();
+	TeAttributeList::iterator it = att.begin();
+
+	TeTableRow row;
+	unsigned int i;
+	unsigned int j;
+	string uniqueName = table.uniqueName();
+	string uniqueVal;
+	for ( i = 0; i < table.size(); i++  )
+	{
+		row = table[i];
+		it = att.begin();
+		string q = 	"UPDATE "+tableName+" SET ";
+		j = 1;
+		int jj = 0;
+		while ( it != att.end() )
+		{
+			string oracleFormat;
+			string dateTime; 
+			if((*it).rep_.type_==TeDATETIME)
+			{
+				TeTime t  (row[jj], (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_,
+						   (*it).timeSeparator_, (*it).indicatorPM_);
+				
+				dateTime = t.getDateTime();
+				oracleFormat = "DD/MM/YYYY HH24:MI:SS"; 
+			}
+			
+			if (uniqueName != (*it).rep_.name_)
+			{
+				q += (*it).rep_.name_ + "=";
+  				switch ((*it).rep_.type_)
+  				{
+  					case TeSTRING:
+						q += "'"+escapeSequence(row[jj])+"'";
+  					break;
+  					case TeREAL:
+						q += row[jj];
+  					break;
+  					case TeINT:
+						q += row[jj];
+  					break;
+					case TeDATETIME:
+						q += " TO_DATE('" + dateTime + "', '"+ oracleFormat +"')";
+  					break;
+					case TeCHARACTER:
+						q += "'" + escapeSequence(row[jj]) + "'";
+  					break;
+  					default:
+						q += "'"+escapeSequence(row[jj])+"'";
+  					break;
+  				}
+				if (j<att.size())
+					q+= ",";
+			}
+			else
+				uniqueVal = row[jj];
+
+			++it;
+			j++;
+			jj++;
+		}
+		q += " WHERE " + uniqueName + " = " + uniqueVal;
+		if (!execute(q))
+			continue;
+	}
+	return true;
+}
+	
+
+bool 
+TeOracleSpatial::insertProjection (TeProjection *proj)
+{
+	string insert = "INSERT INTO te_projection (projection_id, name, long0, lat0,";
+	insert += " offx, offy, stlat1, stlat2, unit, scale, hemis, datum, ";
+	insert += " radius, flattening, dx , dy, dz ) VALUES ( ";
+	insert += "te_projection_seq.NEXTVAL";
+	insert += ", '" + escapeSequence(proj->name()) + "'";
+	insert += ", " + Te2String(proj->params().lon0*TeCRD,10);
+	insert += ", " + Te2String(proj->params().lat0*TeCRD,10);
+	insert += ", " + Te2String(proj->params().offx,10);
+	insert += ", " + Te2String(proj->params().offy,10);
+	insert += ", " + Te2String(proj->params().stlat1*TeCRD,10);
+	insert += ", " + Te2String(proj->params().stlat2*TeCRD,10);
+	insert += ", '" + escapeSequence(proj->params().units) + "'";
+	insert += ", " + Te2String(proj->params().scale,10);
+	insert += ", " + Te2String(proj->params().hemisphere);
+	insert += ", '" + escapeSequence(proj->params().datum.name()) + "'";
+	insert += ", " + Te2String(proj->params().datum.radius(),10);
+	insert += ", " + Te2String(proj->params().datum.flattening(),10);
+	insert += ", " + Te2String(proj->params().datum.xShift(),10);
+	insert += ", " + Te2String(proj->params().datum.yShift(),10);
+	insert += ", " + Te2String(proj->params().datum.zShift(),10);
+	insert += ")";
+
+	if(!execute(insert))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table te_projection!";   
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*) getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT te_projection_seq.CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_projection_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	proj->id(atoi((const char*)ocip->getData(0))); 
+	delete ocip;
+
+	return true;
+}
+
+
+
+bool
+TeOracleSpatial::insertRepresentation (int layerId, TeRepresentation& rep)
+{
+	if (layerId <= 0)
+		return false;
+	
+	string ins;
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*) getPortal();
+	if(!ocip)
+		return false;
+
+	try
+	{
+		ins = " INSERT INTO te_representation (repres_id, layer_id, geom_type, geom_table, ";
+		ins += " description, lower_x, lower_y, upper_x, upper_y, res_x, res_y, num_cols, ";
+		ins += " num_rows) VALUES (";
+		ins += " te_representation_seq.NEXTVAL ";
+		ins += ", " + Te2String(layerId);
+		ins += ", " + Te2String(static_cast<int>(rep.geomRep_));
+		ins += ", '" + escapeSequence(rep.tableName_) + "'";
+		ins += ", '" + escapeSequence(rep.description_) + "'";
+		ins += ", " + Te2String(rep.box_.x1(),10);
+		ins += ", " + Te2String(rep.box_.y1(),10);
+		ins += ", " + Te2String(rep.box_.x2(),10);
+		ins += ", " + Te2String(rep.box_.y2(),10);
+		ins += ", " + Te2String(rep.resX_,10);
+		ins += ", " + Te2String(rep.resY_,10);
+		ins += ", " + Te2String(rep.nCols_);
+		ins += ", " + Te2String(rep.nLins_);
+		ins += ")";
+
+		if(!execute(ins))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error inserting in the table te_representation!";   
+			return false;
+		}
+		
+		string seq = "SELECT te_representation_seq.CURRVAL FROM DUAL";
+		if(!ocip->query(seq))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error in the sequence te_representation_seq!";  
+			delete ocip;
+			return false;
+		}
+
+		if(!ocip->fetchRow())
+		{
+			errorMessage_ = "Sequence value not found!";
+			delete ocip;
+			return false;
+		}
+
+		int id = atoi((const char*)ocip->getData(0)); 
+		rep.id_ = id;
+	}
+
+	catch(...)
+	{
+		errorMessage_ = "Error inserting in the table te_representation!"; 
+		delete ocip;
+		return false;
+	}
+
+	delete ocip;
+	return true;
+}
+
+
+bool
+TeOracleSpatial::insertLegend (TeLegendEntry* leg)
+{
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	try
+	{
+		string ins = "INSERT INTO te_legend (legend_id, theme_id, group_id, ";
+		ins += " num_objs, lower_value, upper_value, label) VALUES ( ";
+		ins += "te_legend_seq.NEXTVAL";
+		ins += ", " + Te2String(leg->theme());
+		ins += ", " + Te2String(leg->group());
+		ins += ", " + Te2String(leg->count());
+		ins += ", '" + escapeSequence(leg->from()) + "'";
+		ins += ", '" + escapeSequence(leg->to()) + "'";
+		ins += ", '" + escapeSequence(leg->label()) + "'";
+		ins += ")";
+			
+		if (!execute(ins))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error inserting in the table te_legend!"; 
+			return false;
+		}
+
+		string seq = "SELECT te_legend_seq.CURRVAL FROM DUAL";
+		if(!ocip->query(seq))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error in the sequence te_theme_seq!";  
+			delete ocip;
+			return false;
+		}
+
+		if(!ocip->fetchRow())
+		{
+			errorMessage_ = "Sequence value not found!";;
+			delete ocip;
+			return false;
+		}
+
+		int index = atoi((const char*)ocip->getData(0)); 
+		leg->id(index);
+	}
+	catch(...)
+	{
+		errorMessage_ = "Error inserting in the table te_legend!"; 
+		delete ocip;
+		return false;
+	}
+		
+	delete ocip;
+	legendMap_[leg->id()] = leg;
+	return insertVisual(leg);
+}
+
+
+bool 
+TeOracleSpatial::AllocateOrdinatesObject(TePolygon &poly, string& elInfo, OCICursor* cursor)
+{
+	int		totalsize, ni, size;
+	double	xult, yult;
+	short	orient;
+
+	ni = poly.size () - 1;
+
+	xult = -9999.99;
+	yult = -9999.99;
+
+	totalsize = 0;
+
+	try
+	{
+		//OCI: create the ordinates array
+		if(!cursor)
+			Conn->AllocateObjectOrdinates();
+		
+		for (int k = 0; k <= ni; k++ )
+		{
+			TeLinearRing ring ( poly[k] );
+			totalsize += ring.size();
+			size = ring.size();
+			orient = TeOrientation(ring);
+			
+			if (k==0)  //external polygon: UNCLOCKWISE
+			{
+				elInfo = "1, 1003, 1";
+				if(orient == TeCOUNTERCLOCKWISE)   
+				{
+					for (int i=0;i<size;i++)
+					{
+						if(xult != ring[i].x() || yult != ring[i].y())
+						{
+							if(cursor)
+							{
+								cursor->AppendOrdinates(ring[i].x());
+								cursor->AppendOrdinates (ring[i].y());	
+							}
+							else
+							{
+								Conn->AppendOrdinates(ring[i].x());
+								Conn->AppendOrdinates (ring[i].y());	
+							}
+						
+							xult = ring[i].x();
+							yult = ring[i].y();
+						}
+					}
+				}
+				//keep UNCLOCKWISE ring 
+				else
+				{
+					for (int i=0;i<size;i++)
+					{
+						if(xult != ring[size-1-i].x() || yult != ring[size-1-i].y())
+						{
+							if(cursor)
+							{
+								cursor->AppendOrdinates(ring[size-1-i].x());
+								cursor->AppendOrdinates (ring[size-1-i].y());
+							}
+							else
+							{
+								Conn->AppendOrdinates(ring[size-1-i].x());
+								Conn->AppendOrdinates (ring[size-1-i].y());
+							}
+							
+							xult = ring[size-1-i].x();
+							yult = ring[size-1-i].y();
+						}
+					}
+				}
+			}
+
+			else  //internal polygon: CLOCKWISE
+			{
+				int pos = ((totalsize - size) * 2) + 1; 
+				elInfo += ", " + Te2String(pos) + ", 2003, 1";
+						
+				if(orient == TeCLOCKWISE)   
+				{
+					for (int i=0;i<size;i++)
+					{
+						if(xult != ring[i].x() || yult != ring[i].y())
+						{
+							if(cursor)
+							{
+								cursor->AppendOrdinates(ring[i].x());
+								cursor->AppendOrdinates (ring[i].y());
+							}
+							else
+							{
+								Conn->AppendOrdinates(ring[i].x());
+								Conn->AppendOrdinates (ring[i].y());
+							}
+
+							xult = ring[i].x();
+							yult = ring[i].y();
+						}
+					}
+				}
+				//keep CLOCKWISE ring
+				else
+				{
+					for (int i=0;i<size;i++)
+					{
+						if(xult != ring[size-1-i].x() || yult != ring[size-1-i].y())
+						{
+							Conn->AppendOrdinates(ring[size-1-i].x());
+							Conn->AppendOrdinates (ring[size-1-i].y());
+							
+							xult = ring[size-1-i].x();
+							yult = ring[size-1-i].y();
+						}
+					}
+				}
+			}
+		}//for all rings
+	}
+	catch(...)
+	{
+		return false;
+	}
+	
+	return true;	
+}
+
+bool 
+TeOracleSpatial::AllocateOrdinatesObject(TeLine2D &line, OCICursor* cursor)
+{
+	int size = line.size();
+	double	xult, yult;
+	xult = -9999.99;
+	yult = -9999.99;
+
+	try
+	{
+		//OCI: create the ordinates array
+		if(!cursor)
+			Conn->AllocateObjectOrdinates ();
+
+		for (int i=0;i<size;i++)
+		{		
+			if(xult != line[i].x() || yult != line[i].y())
+			{
+				if(cursor)
+				{
+					cursor->AppendOrdinates(line[i].x());
+					cursor->AppendOrdinates(line[i].y());
+				}
+				else
+				{
+					Conn->AppendOrdinates(line[i].x());
+					Conn->AppendOrdinates(line[i].y());
+				}
+				xult = line[i].x();
+				yult = line[i].y();
+			}
+		}
+	}
+	catch(...)
+	{
+		return false;
+	}
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::insertPolygon (const string& table, TePolygon &poly)
+{
+	
+	string	elinfo;
+	
+	if(!AllocateOrdinatesObject(poly, elinfo))
+		return false;
+	
+
+	string ins = "INSERT INTO " + table + " ( ";
+	ins += " geom_id, object_id, spatial_data) VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(poly.objectId()) + "'";
+	ins += ", MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+	ins += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+	ins += ", :ordinates) ";
+	ins += " )";
+
+	if(!Conn->ExecuteSDOSTM(ins))
+	{
+		errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	/*
+	string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	poly.geomId(index); 
+	delete ocip;
+	*/
+
+	return true;
+}
+
+bool 
+TeOracleSpatial::updatePolygon (const string& table, TePolygon &poly)
+{
+	if(!tableExist(table))
+	{	
+		errorMessage_ = "Table not exist!";
+		return false;
+	}
+	
+	string elinfo;
+
+	if(!AllocateOrdinatesObject(poly, elinfo))
+		return false;
+		
+	string sql;
+	sql =  "UPDATE " + table + " SET ";
+	sql += ", object_id = '" + poly.objectId() + "'";
+	sql += ", spatial_data = ";
+	sql += " MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+	sql += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+	sql += ", :ordinates) ";
+	sql += " WHERE geom_id = " + poly.geomId();
+
+	//OCI
+	if(!Conn->ExecuteSDOSTM(sql))
+	{
+		errorMessage_ = "Error updating in the table " + table + "!"; 
+		return false;
+	}
+	
+	return true;
+}
+
+bool 
+TeOracleSpatial::selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps)
+{
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string sql ="SELECT * FROM " + table;
+	if (!criteria.empty())
+		sql += " WHERE " + criteria;
+	sql += " ORDER BY object_id ASC ";
+	 
+	if (!ocip->query(sql) || !ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+	
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = ocip->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps)
+{
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string q ="SELECT * FROM " + table;
+
+	if (geoid != "")
+		q += " WHERE object_id = '" + geoid +"'";
+	
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{	
+		delete ocip;
+		return false;
+	}
+
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = ocip->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+	delete ocip;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::loadPolygonSet (const string& table, TeBox &box, TePolygonSet &ps)
+{
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string q = "SELECT * FROM " + table;
+	q += this->getSQLBoxWhere (box, TePOLYGONS);
+	q += " ORDER BY object_id ";
+
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{	
+		delete ocip;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = ocip->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::loadPolygonSet(TeTheme* theme, TePolygonSet &ps)
+{
+	string collTable = theme->collectionTable();
+	if (collTable.empty())
+		return false;
+
+	TeLayer* themeLayer = theme->layer();
+	if (!themeLayer->hasGeometry(TePOLYGONS))
+		return false;
+	
+	string polygonTable = themeLayer->tableName(TePOLYGONS);
+	if (polygonTable.empty())
+		return false;
+
+	string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
+	sql += " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
+	
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	if (!ocip->query(sql) || !ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = ocip->fetchGeometry(poly);
+		ps.add ( poly );
+	}
+	while (flag);		
+	delete ocip;
+	return true;
+}
+
+TeDatabasePortal* 
+TeOracleSpatial::loadPolygonSet(const string& table, TeBox &box)
+{
+	TeOracleSpatialPortal *portal = (TeOracleSpatialPortal*)this->getPortal();
+	if (!portal)
+		return 0;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (box, TePOLYGONS);
+	q += " ORDER BY object_id ";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return 0;
+	}
+	else 
+		return portal;
+}
+
+
+//Spatial query
+//retornam um portal
+bool 
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+	string Ids = getStringIds(actIdsIn);
+	string actGeomColl = "spatial_data";
+	
+	string spatialRel = getOracleSpatialRelation(relate);
+	
+	//Montar a sql para passar para o Oracle
+	string sql = "SELECT geomTable1.* ";
+	sql += " FROM "+ actGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!actCollTable.empty())
+	{
+		sql += ", "+ actCollTable +" collTable ";
+		sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+	
+	sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+	if(relate==TeEQUALS)
+		sql += " geomTable1.object_id NOT IN (" + Ids + ") AND ";  
+	
+	if(relate==TeDISJOINT)
+		sql += " NOT ";  // NOT ANYINTERACT
+
+	sql += " SDO_RELATE(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'mask= "; 
+	sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+	portal->freeResult();
+	if(!((TeOracleSpatialPortal*)portal)->querySDO (sql)) 
+		return false;
+
+	return (portal->fetchRow());
+}
+
+bool 
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, const string& visGeomTable, TeGeomRep /* visRep */, TeDatabasePortal *portal, int relate, const string& visCollTable)
+{
+	string Ids = getStringIds(actIdsIn);
+	string spatialRel = getOracleSpatialRelation(relate);
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+	
+	//Montar a sql para passar para o Oracle
+	string sql = "SELECT geomTable1.* ";
+	sql += " FROM "+ visGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!visCollTable.empty())
+	{
+		sql += ", "+ visCollTable +" collTable";
+		sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+	
+	sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+	if(relate==TeDISJOINT)
+		sql += " NOT ";  // NOT ANYINTERACT
+
+	sql += " SDO_RELATE(geomTable1."+ visGeomColl +", geomTable2."+ actGeomColl +", 'mask= "; 
+	sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+	portal->freeResult();
+	if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+		return false;
+	
+	return (portal->fetchRow());
+		
+}
+
+bool 
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable) 
+{
+	portal->freeResult();
+	string elinfo, sdo;
+	
+	OCICursor	*cursor = ((TeOracleSpatialPortal*)portal)->getCursor();	
+	string spatialRel = getOracleSpatialRelation(relate);
+	string actGeomColl = "spatial_data";
+
+	if(geom->elemType()==TePOLYGONS)
+	{
+		TePolygon poly, *pPoly;
+		pPoly = new TePolygon();
+		pPoly = (TePolygon*)geom;
+		poly = *pPoly;
+
+		if(!AllocateOrdinatesObject(poly, elinfo, cursor))
+		{
+			delete cursor;
+			return false;
+		}
+
+		sdo = " MDSYS.SDO_GEOMETRY(2003, NULL, NULL, ";
+		sdo += " MDSYS.SDO_ELEM_INFO_ARRAY(" + elinfo + "), ";
+		sdo += " :ordinates)";
+
+		//delete pPoly;  //delete tamb�m o geom, talvez deixar para aplicacao
+	}
+	
+	else if (geom->elemType()==TeLINES)
+	{
+		TeLine2D line, *pLine;
+		pLine = new TeLine2D();
+		pLine = (TeLine2D*)geom;
+		line = *pLine;
+
+		if(!AllocateOrdinatesObject(line, cursor))
+		{
+			delete cursor;
+			return false;
+		}
+
+		elinfo = "1, 2, 1";
+
+		sdo = " MDSYS.SDO_GEOMETRY(2002, NULL, NULL, ";
+		sdo += " MDSYS.SDO_ELEM_INFO_ARRAY(" + elinfo + "), ";
+		sdo += " :ordinates)";
+
+		//delete pLine;  //delete tamb�m o geom
+	}
+	
+	else if (geom->elemType()==TePOINTS)
+	{
+		TePoint point, *pPoint;
+		pPoint = new TePoint();
+		pPoint = (TePoint*)geom;
+		point = *pPoint;
+		
+		sdo = " MDSYS.SDO_GEOMETRY(2001, NULL, ";
+		sdo += " MDSYS.SDO_POINT_TYPE( ";
+		sdo += Te2String(point.location().x());
+		sdo += ", " + Te2String(point.location().y());
+		sdo += ", NULL )";
+		sdo += ", NULL, NULL))";
+		
+		//delete pPoint;
+	}
+
+	else if (geom->elemType()==TeCELLS)
+	{
+		TeCell cell, *pCell;
+		pCell = new TeCell();
+		pCell = (TeCell*)geom;
+		cell = *pCell;
+
+		TeBox b = cell.box();
+		
+		sdo = " MDSYS.SDO_GEOMETRY(2003, NULL, NULL ";
+		sdo += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+		sdo += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+		sdo += Te2String(b.lowerLeft().x());
+		sdo += ", " + Te2String(b.lowerLeft().y());
+		sdo += ", " + Te2String(b.upperRight().x());
+		sdo += ", " + Te2String(b.upperRight().y());
+		sdo += ")) ";
+
+		//delete pCell;
+	}
+	
+	//Montar a sql para passar para o Oracle
+	string sql = "SELECT geomTable.* ";
+	sql += " FROM " + actGeomTable + " geomTable ";
+
+	if(!actCollTable.empty())
+	{
+		sql += ", "+ actCollTable +" collTable ";
+		sql += " WHERE geomTable.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+	
+	
+	if(relate==TeDISJOINT)
+		sql += " NOT ";  // NOT ANYINTERACT
+
+	sql += " MDSYS.SDO_RELATE(geomTable."+ actGeomColl +", "+ sdo +", 'mask= "; 
+	sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+	if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+		return false;
+
+	return (portal->fetchRow());
+	
+}
+
+
+//retornam um vetor de object_ids resultantes da consulta
+bool 
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal(); 
+		
+	string Ids = getStringIds(actIdsIn);
+	string spatialRel = getOracleSpatialRelation(relate);
+	string actGeomColl = "spatial_data";
+
+	//Montar a sql para passar para o Oracle
+	string sql = "SELECT geomTable1.object_id ";
+	sql += " FROM "+ actGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!actCollTable.empty())
+	{
+		sql += ", "+ actCollTable +" collTable ";
+		sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+	
+	sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+	if(relate==TeEQUALS)
+		sql += " geomTable1.object_id NOT IN (" + Ids + ") AND ";  
+	
+	if(relate==TeDISJOINT)
+		sql += " NOT ";  // NOT ANYINTERACT
+
+	sql += " SDO_RELATE(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'mask= "; 
+	sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	actIdsOut.clear();
+	while(portal->fetchRow())
+	{
+		string objId = portal->getData (0);
+		actIdsOut.push_back(objId);
+	}
+
+	sort(actIdsOut.begin(), actIdsOut.end());
+	unique(actIdsOut.begin(), actIdsOut.end());
+
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, const string& visGeomTable, TeGeomRep /* visRep */, Keys& visIdsOut, int relate, const string& visCollTable)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal(); 
+	
+	string Ids = getStringIds(actIdsIn);
+	string spatialRel = getOracleSpatialRelation(relate);
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+	
+	//Montar a sql para passar para o Oracle
+	string sql = "SELECT geomTable1.object_id ";
+	sql += " FROM "+ visGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!visCollTable.empty())
+	{
+		sql += ", "+ visCollTable +" collTable";
+		sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+	
+	sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+
+	if(relate==TeDISJOINT)
+		sql += " NOT ";  // NOT ANYINTERACT
+
+	sql += " SDO_RELATE(geomTable1."+ visGeomColl +", geomTable2."+ actGeomColl +", 'mask= "; 
+	sql += spatialRel + " querytype=WINDOW') = 'TRUE'";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	visIdsOut.clear();
+	while(portal->fetchRow())
+	{
+		string objId = portal->getData (0);
+		visIdsOut.push_back(objId);
+	}
+
+	sort(visIdsOut.begin(), visIdsOut.end());
+	unique(visIdsOut.begin(), visIdsOut.end());
+
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal(); 
+		
+	if(!spatialRelation(actGeomTable, actRep, geom, portal, relate, actCollTable))
+	{
+		delete portal;
+		return false;
+	}
+		
+	actIdsOut.clear();
+	do
+	{
+		string objId = portal->getData ("object_id");
+		actIdsOut.push_back(objId);
+	}while(portal->fetchRow());
+
+	sort(actIdsOut.begin(), actIdsOut.end());
+	unique(actIdsOut.begin(), actIdsOut.end());
+
+	delete portal;
+	return true;
+}
+
+// metric functions
+bool
+TeOracleSpatial::calculateArea(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, double &area)
+{
+	string Ids = getStringIds(actIdsIn);
+	string actGeomColl = "spatial_data";
+	
+	string sql = "SELECT SUM(SDO_GEOM.SDO_AREA(g."+ actGeomColl +", m.diminfo))";
+	sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	area = portal->getDouble(0);
+	delete portal;
+	return true;
+}
+
+bool
+TeOracleSpatial::calculateLength(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIdsIn, double &length)
+{
+	string Ids = getStringIds(actIdsIn);
+	string actGeomColl = "spatial_data";
+	
+	string sql = "SELECT SUM(SDO_GEOM.SDO_LENGTH(g."+ actGeomColl +", m.diminfo))";
+	sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	length = portal->getDouble(0);
+	delete portal;
+	return true;
+}
+
+
+//distancia entre objetos de um mesma tabela
+bool
+TeOracleSpatial::calculateDistance(const string& actGeomTable, TeGeomRep /* actRep */, Keys& Ids, double& distance)
+{
+	string Id1 = Ids[0];
+	string Id2 = Ids[1];
+	string actGeomColl = "spatial_data";
+
+	string sql = "SELECT MIN(SDO_GEOM.SDO_DISTANCE(g1."+ actGeomColl +", m.diminfo, ";
+	sql += " g2."+ actGeomColl +", m.diminfo))";
+	sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ Id1 +"'"; 
+	sql += " AND g2.object_id = '"+ Id2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	distance = portal->getDouble(0);
+	delete portal;
+	return true;
+}
+
+
+//distancia entre objetos de duas tabelas distintas
+bool
+TeOracleSpatial::calculateDistance(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, double& distance)
+{
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+	
+	string sql = "SELECT MIN(SDO_GEOM.SDO_DISTANCE(g1."+ actGeomColl +", m1.diminfo, ";
+	sql += " g2."+ visGeomColl +", m2.diminfo))";
+	sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+	sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+	sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+	sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'";
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	distance = portal->getDouble(0);
+	delete portal;
+	return true;
+}
+
+/*
+bool 
+TeOracleSpatial::withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal(); 
+		
+	string Ids = getStringIds(actIdsIn);
+	string actGeomColl = "spatial_data";
+
+	//Montar a sql para passar para o Oracle
+	string sql = "SELECT geomTable1.object_id ";
+	sql += " FROM "+ actGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!actCollTable.empty())
+	{
+		sql += ", "+ actCollTable +" collTable ";
+		sql += " WHERE geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+	
+	sql += " geomTable2.object_id IN (" + Ids + ") AND ";
+	sql += " SDO_WITHIN_DISTANCE(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'distance= "; 
+	sql += Te2String(max_distance) + " querytype=WINDOW') = 'TRUE'";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	actIdsOut.clear();
+	while(portal->fetchRow())
+	{
+		string objId = portal->getData (0);
+		actIdsOut.push_back(objId);
+	}
+
+	sort(actIdsOut.begin(), actIdsOut.end());
+	unique(actIdsOut.begin(), actIdsOut.end());
+
+	delete portal;
+	return true;
+}
+*/
+
+// functions that return a new geometry
+
+//Euclidean distance value: dist
+bool
+TeOracleSpatial::Buffer(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TePolygonSet& bufferSet, double dist)
+{
+	string Ids = getStringIds(actIds);
+	string actGeomColl = "spatial_data";
+
+	string sql = "SELECT g.geom_id, g.object_id,";
+	sql += " SDO_GEOM.SDO_BUFFER(g."+ actGeomColl +", m.diminfo, "+ Te2String(dist) +")";
+	sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		TePolygonSet polySet;
+		flag = portal->fetchGeometry(polySet);
+		//teste c/ buffer com filhos
+		for(unsigned int i=0; i<polySet.size(); i++)
+			bufferSet.add(polySet[i]);
+
+	}while(flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeOracleSpatial::ConvexHull(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TePolygonSet& convexHullSet)
+{
+	string Ids = getStringIds(actIds);
+	string actGeomColl = "spatial_data";
+	
+	string sql = "SELECT g.geom_id, g.object_id,";
+	sql += " SDO_GEOM.SDO_CONVEXHULL(g."+ actGeomColl +", m.diminfo )";
+	sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		convexHullSet.add(poly);
+	}while(flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeOracleSpatial::Centroid(const string&  actGeomTable , TeGeomRep /* actRep */, TePointSet& centroidSet, Keys actIds, const string& /* actCollTable */)
+{
+	string Ids = getStringIds(actIds);
+	string actGeomColl = "spatial_data";
+	
+	string sql = "SELECT g.geom_id, g.object_id,";
+	sql += " SDO_GEOM.SDO_CENTROID(g."+ actGeomColl +", m.diminfo )";
+	sql += " FROM "+ actGeomTable +" g, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	
+	//if empty it calculates the centroids to all geometries 
+	if(!Ids.empty())
+		sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do 
+	{
+		TePoint point;
+		flag = portal->fetchGeometry(point);
+		centroidSet.add(point);
+	}while(flag);
+
+	delete portal;
+	return true;
+	
+}
+
+bool 
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep actRep, const string& objId1, Keys& actIdsOut, int numRes)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal(); 
+	
+	if(!nearestNeighbors(actGeomTable, actCollTable, actRep, objId1, portal, numRes))
+	{
+		delete portal;
+		return false;
+	}
+		
+	actIdsOut.clear();
+	while(portal->fetchRow())
+	{
+		string objId = portal->getData ("object_id");
+		actIdsOut.push_back(objId);
+	}
+
+	sort(actIdsOut.begin(), actIdsOut.end());
+	unique(actIdsOut.begin(), actIdsOut.end());
+
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep visRep, Keys& visIdsOut, int numRes)
+{
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) getPortal(); 
+	
+	if(!nearestNeighbors(actGeomTable, actRep, objId1, visGeomTable, visCollTable, visRep, portal, numRes))
+	{
+		delete portal;
+		return false;
+	}
+		
+	visIdsOut.clear();
+	while(portal->fetchRow())
+	{
+		string objId = portal->getData ("object_id");
+		visIdsOut.push_back(objId);
+	}
+
+	sort(visIdsOut.begin(), visIdsOut.end());
+	unique(visIdsOut.begin(), visIdsOut.end());
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep /* actRep */, const string& objId1, TeDatabasePortal* portal, int numRes)
+{
+	string actGeomColl = "spatial_data";
+
+	//select the spatial index
+	string index = " SELECT INDEX_NAME FROM USER_SDO_INDEX_INFO";
+	index += " WHERE TABLE_NAME = '"+ TeConvertToUpperCase(actGeomTable) +"'"; 
+
+	portal->freeResult();
+	if(!portal->query(index) || !portal->fetchRow())
+		return false;
+
+	string indexName = string(portal->getData(0));
+	string perf = "/*+ INDEX("+ TeConvertToUpperCase(actGeomTable) +" "+ indexName +") */ ";
+	
+	string sql = "SELECT "+ perf +"  geomTable1.* ";
+	sql += " FROM "+ actGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!actCollTable.empty())
+	{
+		sql += ", "+ actCollTable +" collTable ";
+		sql += " WHERE ";
+		sql += " geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+		
+	sql += " SDO_NN(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl +", 'sdo_batch_size=10')='TRUE' AND ";
+	sql += " geomTable2.object_id = '" + objId1 + "' AND ";
+	sql += " geomTable1.object_id <> '"+ objId1 +"' AND ";
+	sql += " ROWNUM <= "+ Te2String(numRes);
+
+	portal->freeResult();
+	if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+		return false;
+	
+	return true;
+}
+	
+bool 
+TeOracleSpatial::nearestNeighbors(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep /* visRep */, TeDatabasePortal* portal, int numRes)
+{
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+
+	//select the spatial index
+	string index = " SELECT INDEX_NAME FROM USER_SDO_INDEX_INFO";
+	index += " WHERE TABLE_NAME = '"+ TeConvertToUpperCase(visGeomTable) +"'"; 
+
+	portal->freeResult();
+	if(!portal->query(index) || !portal->fetchRow())
+		return false;
+
+	string indexName = string(portal->getData(0));
+	string perf = "/*+ INDEX("+ TeConvertToUpperCase(visGeomTable) +" "+ indexName +") */ ";
+	string nres = " ROWNUM <= "+ numRes;
+	
+	string sql = "SELECT "+ perf +"  geomTable1.* ";
+	sql += " FROM "+ visGeomTable +" geomTable1,";
+	sql += actGeomTable + " geomTable2 ";
+	
+	if(!visCollTable.empty())
+	{
+		sql += ", "+ visCollTable +" collTable";
+		sql += " WHERE ";
+		sql += " geomTable1.object_id = collTable.c_object_id AND ";
+	}
+	else
+		sql += " WHERE ";
+		
+	sql += " SDO_NN(geomTable1."+ actGeomColl +", geomTable2."+ actGeomColl;
+	sql += ", 'sdo_batch_size=10') = 'TRUE' AND ";
+	sql += " geomTable2.object_id = '" + objId1 + "' AND ";
+	sql += " ROWNUM <= "+ Te2String(numRes);
+	
+	portal->freeResult();
+	if(!((TeOracleSpatialPortal*)portal)->querySDO(sql))
+		return false;
+	
+	return true;
+}
+
+
+//Intersection entre dois objetos geogr�ficos de uma mesma tabela
+
+
+bool 
+TeOracleSpatial::geomIntersection(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+	string Ids = getStringIds(actIds);
+
+	string sql = "SELECT SDO_GEOM.SDO_INTERSECTION(g1."+ actGeomColl +", m.diminfo, ";
+	sql += " g2."+ actGeomColl +", m.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if((!portal->query(sql))||(!portal->fetchRow()))
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+		
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::geomIntersection(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+	
+	string sql = "SELECT SDO_GEOM.SDO_INTERSECTION(g1."+ actGeomColl +", m1.diminfo, ";
+	sql += " g2."+ visGeomColl +", m2.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+	sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+	sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+	sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;        
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+		
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::geomDifference(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+
+	string sql = "SELECT SDO_GEOM.SDO_DIFFERENCE(g1."+ actGeomColl +", m1.diminfo, ";
+	sql += " g2."+ visGeomColl +", m2.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+	sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+	sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+	sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+		
+	delete portal;
+	return true;
+}
+
+bool 
+TeOracleSpatial::geomDifference(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+
+	string sql = "SELECT SDO_GEOM.SDO_DIFFERENCE(g1."+ actGeomColl +", m.diminfo, ";
+	sql += " g2."+ actGeomColl +", m.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+		
+	delete portal;
+	return true;
+}
+
+bool 
+TeOracleSpatial::geomXOr(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+
+	string sql = "SELECT SDO_GEOM.SDO_XOR(g1."+ actGeomColl +", m.diminfo, ";
+	sql += " g2."+ actGeomColl +", m.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::geomXOr(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+
+	string sql = "SELECT SDO_GEOM.SDO_XOR(g1."+ actGeomColl +", m1.diminfo, ";
+	sql += " g2."+ visGeomColl +", m2.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+	sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+	sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+	sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+		
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::geomUnion(const string& actGeomTable, TeGeomRep /* actRep */, Keys& actIds, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+	string Ids = getStringIds(actIds);
+
+	string sql = "SELECT SDO_GEOM.SDO_UNION(g1."+ actGeomColl +", m.diminfo, ";
+	sql += " g2."+ actGeomColl +", m.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ actGeomTable +" g2, USER_SDO_GEOM_METADATA m";
+	sql += " WHERE m.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND object_id IN ("+ Ids +")";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+			
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::geomUnion(const string& actGeomTable, TeGeomRep /* actRep */, const string& objId1, const string& visGeomTable, TeGeomRep /* visRep */, const string& objId2, TeGeometryVect& geomVect)
+{
+	string actGeomColl = "spatial_data";
+	string visGeomColl = "spatial_data";
+
+	string sql = "SELECT SDO_GEOM.SDO_UNION(g1."+ actGeomColl +", m1.diminfo, ";
+	sql += " g2."+ visGeomColl +", m2.diminfo)";
+	sql += " FROM "+ actGeomTable +" g1,"+ visGeomTable +" g2, ";
+	sql += " USER_SDO_GEOM_METADATA m1, USER_SDO_GEOM_METADATA m2 ";
+	sql += " WHERE m1.table_name = '"+ TeConvertToUpperCase(actGeomTable) +"'";
+	sql += " AND m1.column_name = '"+ TeConvertToUpperCase(actGeomColl) +"'"; 
+	sql += " AND m2.table_name = '"+ TeConvertToUpperCase(visGeomTable) +"'";
+	sql += " AND m2.column_name = '"+ TeConvertToUpperCase(visGeomColl) +"'"; 
+	sql += " AND g1.object_id = '"+ objId1 +"'"; 
+	sql += " AND g2.object_id = '"+ objId2 +"'";
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*)getPortal();
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+
+	bool flag = true;
+	do 
+	{
+		bool result=false;
+		TeGeometry* geom = new TeGeometry(); 
+		TeGeometry* geom2 = geom;
+		flag = portal->getGeometry(&geom, result);
+		if(result)
+			geomVect.push_back (geom);
+		delete geom2;
+	}while(flag);
+		
+	delete portal;
+	return true;
+}
+
+
+//End Spatial Query
+
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TePolygon& poly)
+{
+	int			elem,elemnext,i,k,elemType, sdoInterp;
+
+	try
+	{
+		int ndim = GetDimArraySize();
+
+		if(ndim==0)
+			return false;
+
+		vector<TeCoord2D> coordinates;
+		if(!cursor->GetCoordinates (coordinates))
+			return false;
+
+		//number of the oordinates in the SDO_GEOMETRY
+		int noords = NumberOfOrdinates();
+	
+		//Indicates the type of the SDO_GEOMETRY
+		int sdoEType;  
+		GetDimElement(2,sdoEType);
+	
+		int geomId = atoi(getData("geom_id"));
+		string objId = string(getData("object_id"));
+		
+		// 1005: compound polygon: Compound polygon with some vertices connected by straight
+		//line segments and some by circular arcs.
+		if((sdoEType==1005) || (sdoEType==2005))  
+		{					   
+			TeLine2D	lin;   
+			//nelem: number of elemnts
+			int nelem; 
+			GetDimElement(3,nelem);  
+			
+			//posinit is initial position in the vector 
+			int posinit=0; //1;
+			//ipoxmax: second element position in the ordinates array
+			int iposmax=7;			
+			
+			int posmax;
+			bool thisElemArc = false; 
+
+			//keep the last point of the element
+			//TePoint lastPoint;
+			
+			//for each element
+			for(elem=1; elem<=nelem; elem++)  
+			{
+				//to catch the last position of the element: iposmax
+				if(elem==nelem)
+					posmax = noords+1;
+				else
+					GetDimElement(iposmax, posmax);
+
+				//verify if the element is a arc 
+				GetDimElement((iposmax-1), elemType);
+				if(elemType == 2)
+					thisElemArc = true;   
+				else 
+					thisElemArc = false;
+
+				//ptSet: ordinates of the element
+				TePointSet ptSet;
+
+				//to catch all coords of the element
+				int pos=0;
+									
+				for(pos=posinit; pos<((posmax-1)/2);++pos)
+				{
+					TePoint pt(coordinates[pos]);
+					ptSet.add(pt);
+				}
+
+				if(thisElemArc) 
+				{
+					//pegar o pr�ximo
+					if(elem!=nelem)
+					{
+						TePoint pt(coordinates[pos]);
+						ptSet.add(pt);
+					}
+
+					int size = ptSet.size();
+					for(int s=1; (s+1)<size; s=s+2)
+					{
+						TeLine2D arc;
+						TeGenerateArc (ptSet[s-1], ptSet[s], ptSet[s+1], arc, 10);
+
+						int sz = arc.size();
+						for(int i=0; i<sz; i++)
+							lin.add(arc[i]);
+					}
+				}
+
+				else //line segment
+				{
+					int size = ptSet.size();
+					for(int s=0; s<size; s++)
+						lin.add(ptSet[s].location());
+				}
+
+				iposmax+=3;
+				posinit=pos;  //skip first coordinate: equal last point of previous element 
+			
+			} //for each element
+
+			TeLinearRing rg(lin);
+			rg.objectId(objId);
+			rg.geomId(geomId);
+			poly.add(rg);
+		}
+
+		else if((sdoEType==1003)||(sdoEType==2003))  //no complex
+		{
+			for(i=1;i<=ndim;i+=3)
+			{
+				TeLine2D	line;
+				GetDimElement(i,elem);	// oordinate position
+				if((i+3) > ndim)
+					elemnext = noords+1;
+				else
+					GetDimElement(i+3,elemnext);
+
+				GetDimElement(i+2,sdoInterp);	// sdo interpretation 
+				// sdoInterp = 3: Rectangle type
+				// sdoInterp = 2: Polygon made up of a connected sequence of circular arcs 
+
+				if(sdoInterp==2)
+				{
+					//para gerar o arco
+					TePoint pt1;
+					TePoint pt2;
+					TePoint pt3;
+										
+					int cont=0;
+					int k = elem/2;
+					while (k<(elemnext/2))
+					{
+						for(int i=0; i<3; i++)
+						{
+							TeCoord2D pt = coordinates[k];
+						
+							if(i==0)
+							{
+								if(!cont)
+									pt1.add(pt);
+								else
+								{
+									pt1.add(pt3.location());
+									pt2.add(pt);
+									++i;
+								}
+							}
+							else if (i==1)
+								pt2.add(pt);
+							else if (i==2)
+								pt3.add(pt);
+
+							++cont;
+							++k;
+						}
+
+						TeLine2D arc;
+						TeGenerateArc (pt1, pt2, pt3, arc, 20);
+						
+						int s = arc.size();
+						for(int j=0; j<s; j++)
+							line.add(arc[j]);
+					}
+				}
+				else
+				{
+					// ler os pontos
+					for(k=(elem/2);k<(elemnext/2);k++)
+					{
+						TeCoord2D pt = coordinates[k];
+						line.add(pt);
+					}
+
+					if(sdoInterp==3) // rectangle
+					{
+						double xmin,ymin, xmax, ymax;
+						xmin = line.box().x1();
+						ymin = line.box().y1();
+						xmax = line.box().x2();
+						ymax = line.box().y2();
+
+						line.clear();
+						TeCoord2D pt1(xmin,ymin);
+						line.add(pt1);
+						TeCoord2D pt2(xmin,ymax);
+						line.add(pt2);
+						TeCoord2D pt3(xmax,ymax);
+						line.add(pt3);
+						TeCoord2D pt4(xmax,ymin);
+						line.add(pt4);
+						line.add(pt1);
+					}
+				}
+
+				TeLinearRing ring(line);
+				ring.objectId (objId);
+				ring.geomId(geomId);
+				poly.add(ring);
+			}
+		}
+		poly.objectId(objId);
+		poly.geomId(geomId);
+		return(this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+
+bool
+TeOracleSpatialPortal::getGeometry (TeGeometry** geom, bool& result)
+{
+	TeSDOGType gType;
+	bool flag=true;	
+	
+	try
+	{
+		this->GetGeometryType(gType);
+			
+		if(gType==TeSDOPOLYGON)
+		{
+			TePolygon   poly, *pol;
+			flag = this->fetchGeometry(poly); 
+			pol = new TePolygon();
+			*pol = poly;
+			*geom = pol;
+			result = true;
+			return flag;
+		}
+		else if(gType==TeSDOLINE)
+		{
+			TeLine2D	line, *lin;
+			flag = this->fetchGeometry(line); 
+			lin = new TeLine2D();
+			*lin = line;
+			*geom = lin;
+			result = true;
+			return flag;
+		}
+		else if(gType==TeSDOPOINT)
+		{
+			TePoint		point, *pnt;
+			flag = this->fetchGeometry(point); 
+			pnt = new TePoint();
+			*pnt = point;
+			*geom = pnt;
+			result = true;
+			return flag;
+		}
+
+		else if(gType==TeSDOMULTIPOLYGON)
+		{
+			TePolygonSet   polySet, *polSet;
+			flag = this->fetchGeometry(polySet); 
+			polSet = new TePolygonSet();
+			*polSet = polySet;
+			*geom = polSet;
+			result = true;
+			return flag;
+		}
+		else if(gType==TeSDOMULTILINE)
+		{
+			TeLineSet	lineSet, *linSet;
+			flag = this->fetchGeometry(lineSet); 
+			linSet = new TeLineSet();
+			*linSet = lineSet;
+			*geom = linSet;
+			result = true;
+			return flag;
+		}
+		else if(gType==TeSDOMULTIPOINT)
+		{
+			TePointSet		pointSet, *pntSet;
+			flag = this->fetchGeometry(pointSet); 
+			pntSet = new TePointSet();
+			*pntSet = pointSet;
+			*geom = pntSet;
+			result = true;
+			return flag;
+		}
+		
+	}
+	catch(...)
+	{
+		result = false;
+		return false;
+	}
+		
+	result = false;
+	return (this->fetchRow());
+}
+
+
+bool
+TeOracleSpatialPortal::fetchGeometry (TePolygonSet& polySet)
+{
+	int					elem,elemnext,i,k,sdoInterp;
+	vector<TeCoord2D>	coordinates;
+	
+	try
+	{
+		int ndim = GetDimArraySize();
+		if(ndim==0)
+			return false;
+		
+		TePolygonSet polyHoles;
+		TeSDOGType gType;
+		
+		GetGeometryType(gType);
+
+		if(gType==TeSDOPOLYGON)  
+		{
+			TePolygon poly;
+			bool res = fetchGeometry(poly);
+			polySet.add(poly);
+			return res;
+		}
+
+		if(!cursor->GetCoordinates(coordinates))
+			return false;
+
+		int noords = NumberOfOrdinates();
+	
+		int geomId = atoi(getData("geom_id"));
+		string objId = string(getData("object_id"));
+		
+		bool hasHole = false;
+
+		for(i=1;i<=ndim;i+=3)
+		{
+			int			eType;
+			TeLine2D	line;
+			TePolygon	poly;
+			GetDimElement(i,elem);	// oordinate position
+			if((i+3) > ndim)
+				elemnext = noords+1;
+			else
+				GetDimElement(i+3,elemnext);
+
+			GetDimElement(i+1, eType);		// sdo_etype do proximo elemento
+			GetDimElement(i+2,sdoInterp);	// sdo_interpretation
+			
+			if(eType==2003)
+				poly = polyHoles.last();
+
+			// ler os pontos
+			for(k=(elem/2);k<(elemnext/2);k++)
+			{
+				TeCoord2D pt(coordinates[k]);
+				line.add(pt);
+			}
+
+			if(sdoInterp == 3) // rectangle
+			{
+				
+				double xmin,ymin, xmax, ymax;
+				xmin = line.box().x1();
+				ymin = line.box().y1();
+				xmax = line.box().x2();
+				ymax = line.box().y2();
+
+				line.clear();
+				TeCoord2D pt1(xmin,ymin);
+				line.add(pt1);
+				TeCoord2D pt2(xmin,ymax);
+				line.add(pt2);
+				TeCoord2D pt3(xmax,ymax);
+				line.add(pt3);
+				TeCoord2D pt4(xmax,ymin);
+				line.add(pt4);
+				line.add(pt1);
+			}
+			TeLinearRing ring(line);
+			ring.objectId (objId);
+			ring.geomId(geomId);
+			
+			poly.add(ring);
+	
+			//verificar se o proximo � hole
+			hasHole=false;
+			if(i+4<ndim)
+			{
+				GetDimElement(i+4, eType);		// sdo_etype do proximo elemento
+				if(eType == 2003)
+					hasHole = true;
+			}
+			poly.objectId(objId);
+			poly.geomId(geomId);
+			
+			if(!hasHole)
+				polySet.add(poly);
+			else	
+				polyHoles.add(poly);
+		} //for
+
+		polySet.objectId(objId);
+		polySet.geomId(geomId);
+
+		return(this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+
+bool
+TeOracleSpatial::insertLine (const string& table, TeLine2D &line)
+{
+	
+	string	elinfo = "1, 2, 1";
+	
+	if(!AllocateOrdinatesObject(line))
+		return false;
+
+	string ins = "INSERT INTO " + table + " ( ";
+	ins += " geom_id, object_id, spatial_data) VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(line.objectId()) + "'";
+	ins += ", MDSYS.SDO_GEOMETRY(2002, NULL, NULL";
+	ins += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+	ins += ", :ordinates) ";
+	ins += " )";
+
+	//OCI
+	if(!Conn->ExecuteSDOSTM(ins))
+	{
+		errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	/*
+	string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	line.geomId(index); 
+	delete ocip;
+	*/
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::updateLine(const string& table, TeLine2D &line)
+{
+	string	elinfo = "1, 2, 1";
+	
+	if(!AllocateOrdinatesObject(line))
+		return false;
+	
+	string sql;
+	sql =  "UPDATE " + table + " SET ";
+	sql += "  object_id= '" + line.objectId() + "'";
+	sql += ", spatial_data = ";
+	sql += " MDSYS.SDO_GEOMETRY(2002, NULL, NULL";
+	sql += ", MDSYS.SDO_ELEM_INFO_ARRAY( " + elinfo + " )";
+	sql += ", :ordinates) ";
+	sql += " WHERE geom_id = " +  line.geomId ();
+
+	//OCI
+	if(!Conn->ExecuteSDOSTM(sql))
+	{
+		errorMessage_ = "Error updating in the table " + table + "!"; 
+		return false;
+	}
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::loadLineSet (const string& table, const string& geoid, TeLineSet &ls)
+{
+	
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string q ="SELECT * FROM " + table;
+	if (geoid != "")
+		q += " WHERE object_id = '" + geoid +"'";
+	
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{	
+		delete ocip;
+		return false;
+	}
+
+	bool flag = true;
+	do 
+	{
+		TeLine2D line;
+		flag = ocip->fetchGeometry(line);
+		ls.add ( line );
+	}while(flag);
+
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::loadLineSet (const string& table, TeBox &bb, TeLineSet &linSet)
+{
+	TeOracleSpatialPortal *portal = (TeOracleSpatialPortal*)getPortal();
+	if (!portal)
+		return false;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (bb, TeLINES);
+	q += " ORDER BY object_id";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TeLine2D lin;
+		flag = portal->fetchGeometry(lin);
+		linSet.add(lin);
+	}
+	while (flag);
+	delete portal;
+	return true;
+}
+
+TeDatabasePortal* 
+TeOracleSpatial::loadLineSet (const string& table, TeBox &box)
+{
+	TeOracleSpatialPortal *portal = (TeOracleSpatialPortal*) getPortal();
+	if (!portal)
+		return 0;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (box, TeLINES);
+	q += " ORDER BY object_id";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return 0;
+	}
+	return portal;
+}
+
+bool 
+TeOracleSpatialPortal::fetchGeometry (TeLine2D& line)
+{
+	int					i;
+	vector<TeCoord2D>	coordinates;
+
+	try
+	{
+		if(!cursor->GetCoordinates(coordinates))
+			return false;
+		
+		int noords = NumberOfOrdinates();
+		if(noords==0)
+			return false;
+
+		for(i=0;i<noords/2;i++)
+			line.add(coordinates[i]);
+			
+		line.geomId (atoi(getData("geom_id")));
+		line.objectId(string(getData("object_id")));
+		return (this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+
+bool 
+TeOracleSpatialPortal::fetchGeometry (TeLineSet& lineSet)
+{
+	vector<TeCoord2D>	coordinates;
+	int					elem,elemnext,i,k;
+
+	try
+	{
+		int ndim = GetDimArraySize();
+		if(ndim==0)
+			return false;
+		
+		int noords = NumberOfOrdinates();
+		int geomId = atoi(getData("geom_id"));
+		string objId = string(getData("object_id"));
+		
+		TeSDOGType gType;
+		GetGeometryType(gType);
+
+		if(gType==TeSDOLINE)  
+		{
+			TeLine2D line;
+			fetchGeometry(line);
+			lineSet.add(line);
+			return true;
+		}
+
+		if(!cursor->GetCoordinates(coordinates))
+			return false;
+
+		for(i=1;i<=ndim;i+=3)
+		{
+			TeLine2D	line;
+			GetDimElement(i,elem);		// oordinate position
+			if((i+3) > ndim)
+				elemnext = noords+1;
+			else
+				GetDimElement(i+3,elemnext);
+			
+			// ler os pontos
+			for(k=(elem/2);k<(elemnext/2);k++)
+			{
+				TeCoord2D pt(coordinates[k]);
+				line.add(pt);
+			}
+			line.objectId (objId);
+			line.geomId(geomId);
+			lineSet.add(line);
+		}
+
+		lineSet.objectId(objId);
+		lineSet.geomId(geomId);
+		
+		return (this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+
+bool 
+TeOracleSpatial::insertPoint(const string& table, TePoint &point)
+{
+	
+	string ins = "INSERT INTO " + table + " ( ";
+	ins += " geom_id, object_id, spatial_data) ";
+	ins += " VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(point.objectId()) + "'";
+	ins += ", MDSYS.SDO_GEOMETRY(2001, NULL, ";
+	ins += "MDSYS.SDO_POINT_TYPE( ";
+	ins += Te2String(point.location().x());
+	ins += ", " + Te2String(point.location().y());
+	ins += ", NULL )";
+	ins += ", NULL, NULL)";
+	ins += " ) ";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	TeOracleSpatialPortal	*ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	point.geomId(index); 
+	delete ocip;
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::updatePoint (const string& table, TePoint &point)
+{
+	string sql;
+	sql =  "UPDATE " + table + " SET ";
+	sql += "object_id = '" + point.objectId() + "'";
+	sql += ", spatial_data = ";
+	sql += " MDSYS.SDO_GEOMETRY(2001, NULL";
+	sql += ", MDSYS.SDO_POINT_TYPE( ";
+	sql += Te2String(point.location ().x());
+	sql += ", " + Te2String(point.location ().y());
+	sql += ", NULL )";
+	sql += ", NULL, NULL)";
+	sql += " WHERE geom_id = " + Te2String(point.geomId());
+
+	if(!execute(sql))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error updating in the table " + table + "!"; 
+		return false;
+	}
+
+	return true;
+}
+	
+
+bool 
+TeOracleSpatialPortal::fetchGeometry(TePoint& p)
+{
+	double		x,y;
+	
+	try
+	{
+		if(!GetPointXYZ(x,y))
+			return false;		//point in SDO_POINT
+
+		TeCoord2D c(x,y);
+		p.add(c);
+		p.objectId(string(getData("object_id")));
+		p.geomId(atoi(getData("geom_id")));
+		return(this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+
+
+bool 
+TeOracleSpatial::insertText	(const string& table, TeText &text)
+{
+	
+	string ins = "INSERT INTO " + table + " (geom_id, ";
+	ins += " object_id, x, y, text_value, angle, height, alignment_vert, ";
+	ins += " alignment_horiz) VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(text.objectId()) + "'";
+	ins += ",  " + Te2String(text.location().x(),10);
+	ins += ",  " + Te2String(text.location().y(),10);
+	ins += ", '" + escapeSequence(text.textValue()) + "'";
+	ins += ",  " + Te2String(text.angle(),10);
+	ins += ",  " + Te2String(text.height(),10);
+	ins += ",  " + Te2String(text.alignmentVert(),10);
+	ins += ",  " + Te2String(text.alignmentHoriz(),10);
+	ins += " )";
+	
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	text.geomId(index); 
+	delete ocip;
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::insertArc (const string& table, TeArc &arc)
+{
+	
+	string ins = "INSERT INTO " + table + " (geom_id, ";
+	ins += " object_id, from_node, to_node ) ";
+	ins += " VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(arc.objectId()) + "'";
+	ins += ",  " + Te2String(arc.fromNode().geomId());
+	ins += ",  " + Te2String(arc.toNode().geomId());
+	ins += " )";
+	
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	arc.geomId(index); 
+	delete ocip;
+
+	return true;
+}
+
+bool 
+TeOracleSpatialPortal::fetchGeometry(TePointSet& pointSet)
+{
+	double		x,y;
+	vector<TeCoord2D> coordinates;
+
+	x=y=-99999.;
+	try
+	{
+		int noords = NumberOfOrdinates();
+		if(noords==0)
+			return false;
+
+		TeSDOGType gType;
+		GetGeometryType(gType);
+
+		if(gType==TeSDOPOINT)  
+		{
+			TePoint point;
+			fetchGeometry(point);
+			pointSet.add(point);
+			return true;
+		}
+
+		if(!cursor->GetCoordinates(coordinates))
+			return false;
+
+		int geomId = atoi(getData("geom_id"));
+		string objId = string(getData("object_id"));
+		
+		for(int i=1;i<=noords/2;i++)
+		{
+			TePoint pt(coordinates[i-1]);
+			pt.geomId (geomId);
+			pt.objectId (objId);
+			pointSet.add(pt);
+		}
+		
+		pointSet.objectId(objId);
+		pointSet.geomId(geomId);
+		
+		return(this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+	
+
+bool 
+TeOracleSpatial::insertNode (const string& table, TeNode &node)
+{	
+	string ins = "INSERT INTO " + table + " ( ";
+	ins += " geom_id, object_id, spatial_data) ";
+	ins += " VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(node.objectId()) + "'";
+	ins += ", MDSYS.SDO_GEOMETRY(2001, NULL, ";
+	ins += "MDSYS.SDO_POINT_TYPE( ";
+	ins += Te2String(node.location().x());
+	ins += ", " + Te2String(node.location ().y());
+	ins += ", NULL )";
+	ins += ", NULL, NULL)";
+	ins += " ) ";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT "+ getNameSequence(table) + ".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	node.geomId(index); 
+	delete ocip;
+
+	return true;
+}
+	
+
+bool
+TeOracleSpatial::updateNode (const string& table, TeNode &node)
+{	
+	string sql;
+	sql =  "UPDATE " + table + " SET ";
+	sql += " object_id = '" + node.objectId() + "'";
+	sql += ", spatial_data = ";
+	sql += " MDSYS.SDO_GEOMETRY(2001, NULL";
+	sql += ", MDSYS.SDO_POINT_TYPE( ";
+	sql += Te2String(node.location ().x());
+	sql += ", " + Te2String(node.location ().y());
+	sql += ", NULL )";
+	sql += ", NULL, NULL)";
+	sql += " WHERE geom_id = " + Te2String(node.geomId());
+	
+	if(!execute(sql))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error updating in the table " + table + "!"; 
+		return false;
+	}
+	return true;
+}
+
+bool 
+TeOracleSpatialPortal::fetchGeometry(TeNode& n)
+{
+	double	x,y;
+	x=y=-99999.;
+	try
+	{
+		if(!GetPointXYZ(x,y))
+			return false;
+
+		TeCoord2D point(x,y);
+		n.add(point);
+		n.geomId(atoi(getData("geom_id")));
+		n.objectId(string(getData("object_id")));
+		return(this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+
+
+bool 
+TeOracleSpatial::insertCell (const string& table, TeCell &cell )
+{
+	
+	TeBox b = cell.box();
+
+	string ins = "INSERT INTO " + table + " ( ";
+	ins += " geom_id, object_id, col_number, row_number, spatial_data) ";
+	ins += " VALUES ( ";
+	ins += getNameSequence(table) +".NEXTVAL";
+	ins += ", '" + escapeSequence(cell.objectId ()) + "'";
+	ins += ",  " + Te2String(cell.column ());
+	ins += ",  " + Te2String(cell.line ());
+	ins += ", MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+	ins += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+	ins += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+	ins += Te2String(b.lowerLeft().x());
+	ins += ", " + Te2String(b.lowerLeft().y());
+	ins += ", " + Te2String(b.upperRight().x());
+	ins += ", " + Te2String(b.upperRight().y());
+	ins += ")) ";
+	ins += " )";
+		
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table " + table + "!"; 
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT "+ getNameSequence(table) +".CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence " + table + "_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	cell.geomId(index); 
+	delete ocip;
+	
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::updateCell(const string& table, TeCell &cell)
+{
+	TeBox b = cell.box ();
+	
+	string sql;
+	sql =  "UPDATE " + table + " SET ";
+	sql += " object_id= '" + cell.objectId() + "'";
+	sql += " col_number= " + Te2String(cell.column ());
+	sql += " row_number= " + Te2String(cell.line ());
+	sql += " spatial_data= ";
+	sql += " MDSYS.SDO_GEOMETRY(2003, NULL, NULL";
+	sql += ", MDSYS.SDO_ELEM_INFO_ARRAY( 1, 1003, 3 )";
+	sql += ", MDSYS.SDO_ORDINATE_ARRAY( " ;
+	sql += Te2String(b.lowerLeft().x());
+	sql += ", " + Te2String(b.lowerLeft().y());
+	sql += ", " + Te2String(b.upperRight().x());
+	sql += ", " + Te2String(b.upperRight().y());
+	sql += ")) ";
+	sql += " WHERE geom_id = " +  cell.geomId ();
+	
+	if(!execute(sql))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error updating in the table " + table + "!"; 
+		return false;
+	}
+	
+	return true;
+}
+
+
+char* TeOracleSpatialPortal ::getData (int i) 
+{
+
+	char* result;
+	if (i > numFields_ || i < 0)
+		return "";
+	
+	try
+	{
+		result = cursor->GetFieldValue(i+1);
+	}
+	catch(...)
+	{
+		errorMessage_ = "Error!";
+		return "";
+	}
+	return result;
+	
+}
+
+char* TeOracleSpatialPortal ::getData (const string &s)
+{
+	string	attstr;
+	char* result;
+
+	string fieldName;
+	size_t pos = s.find(".", string::npos,1);
+	if (pos != string::npos)
+		fieldName = s.substr(pos+1);
+	else
+		fieldName = s;
+
+	attstr = strupr((char*)(fieldName.c_str()));
+	int index = getColumnIndex (attstr);
+	if(index == -1)
+		return "";
+	else
+		result = getData(index);
+
+	return result;
+}
+
+
+int TeOracleSpatialPortal ::getInt (int i) 
+{
+	double field;
+	char* fieldChar;
+	
+	fieldChar = cursor->GetFieldValue(i+1);
+	field = atoi((const char*)fieldChar);
+
+	return (int)field;
+}
+
+int  
+TeOracleSpatialPortal::getInt (const string& s)
+{
+	string	attstr;
+
+	attstr = strupr((char*)(s.c_str()));
+	int index = getColumnIndex (attstr);
+	if(index == -1)
+		return (int)-1.;
+
+	return (getInt(index));
+}
+
+double TeOracleSpatialPortal ::getDouble (int i) 
+{
+	double field;
+	char* fieldChar;
+	
+	fieldChar = cursor->GetFieldValue(i+1);
+	field = atof((const char*)fieldChar);
+
+	return field;
+}
+
+double  
+TeOracleSpatialPortal::getDouble (const string& s)
+{
+	string	attstr;
+
+	attstr = strupr((char*)(s.c_str()));
+	int index = getColumnIndex (attstr);
+	if(index == -1)
+		return -1.;
+
+	return (getDouble(index));
+}
+
+
+bool
+TeOracleSpatialPortal::getBool(int i)
+{
+	char* fieldChar=0;
+	
+	fieldChar = cursor->GetFieldValue(i+1);
+	if(fieldChar == 0)
+		return false;
+	
+	return true;
+}
+
+
+bool    
+TeOracleSpatialPortal::getBool (const string& s)
+{
+	string	attstr;
+
+	attstr = strupr((char*)(s.c_str()));
+	int index = getColumnIndex (attstr);
+	if(index == -1)
+		return 0;
+
+	return (getBool(index));
+}
+
+bool
+TeOracleSpatial::insertMetadata(const string &table, const string &column, double tolx,double toly,TeBox &box,short /* srid */)
+{	
+	TeOracleSpatialPortal	*ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string check = "SELECT * FROM USER_SDO_GEOM_METADATA ";
+	check += " WHERE TABLE_NAME = '" + TeConvertToUpperCase(table);
+	check += "' AND COLUMN_NAME = '" + TeConvertToUpperCase(column) + "'";
+	if(!ocip->query(check))
+	{
+		delete ocip;
+		return false;
+	}
+
+	if(ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+			
+	delete ocip;
+	
+	double xmin = box.x1();
+	double ymin = box.y1();
+	double xmax = box.x2();
+	double ymax = box.y2();
+
+	string inser = "INSERT INTO USER_SDO_GEOM_METADATA VALUES ( ";
+	inser += "'" + TeConvertToUpperCase(table) + "' ," ;
+	inser += "'" + TeConvertToUpperCase(column) + "' ," ; 
+	inser += " MDSYS.SDO_DIM_ARRAY(";
+	inser += " MDSYS.SDO_DIM_ELEMENT('X',";
+	inser += Te2String(xmin) + "," + Te2String(xmax,10) + "," + Te2String(tolx,10) + "), ";
+	inser += " MDSYS.SDO_DIM_ELEMENT('Y',";
+	inser += Te2String(ymin) + "," + Te2String(ymax,10) + "," + Te2String(toly,10) + ")), ";
+	inser += " NULL ) ";
+
+	if(!(execute(inser.c_str()))) 
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table USER_SDO_GEOM_METADATA! "; 
+		return false;
+	}
+
+	return true;
+}
+
+bool
+TeOracleSpatial::DeleteMetadata(const string &table, const string &column)
+{
+	string del = "DELETE FROM USER_SDO_GEOM_METADATA ";
+	del += " WHERE TABLE_NAME = '" + TeConvertToUpperCase(table);
+	del += "' AND COLUMN_NAME = '" + TeConvertToUpperCase(column) + "'";
+	if(!(execute(del.c_str ())))
+		return false;
+	return true;
+}
+
+
+bool
+TeOracleSpatial::createSpatialIndex(const string &table, const string &column,TeSpatialIndexType type, short level, short tile)
+{
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	
+	string name;
+	if(table.size()>21)
+		name = TeConvertToUpperCase(table.substr(0,20)) + "_IDX";
+	else
+		name = TeConvertToUpperCase(table) + "_IDX";
+
+	
+	string index = "SELECT * FROM USER_SDO_INDEX_INFO";
+	index += " WHERE table_name = '" + TeConvertToUpperCase(table) + "'";
+	if(!ocip->query(index))
+	{
+		delete ocip;
+		return false;
+	}
+	
+	if(ocip->fetchRow())
+	{
+		errorMessage_ = "Spatial Index table already exist!";
+		delete ocip;
+		return false;
+	}
+		
+	delete ocip;
+
+	index = " CREATE INDEX " + name;
+	index += " ON " + table + "(" + column + ")";
+	index += " INDEXTYPE IS MDSYS.SPATIAL_INDEX ";
+	
+	if(type == TeQUADTREE)
+	{
+		if(level==0)
+			return false;
+
+		index += " PARAMETERS ('";
+		index += "SDO_LEVEL = " + Te2String(level);
+		index += " SDO_NUMTILES = " + Te2String(tile) + "'";
+	}
+
+	if(!execute(index))
+		return false;
+	
+	return true;
+}
+
+bool
+TeOracleSpatial::RebuildSpatialIndex(const string &table)
+{
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string tabIndex;
+
+	string ind = "SELECT index_name FROM USER_SDO_INDEX_INFO";
+	ind += " WHERE table_name = '" + TeConvertToUpperCase(table) + "'";
+	if (!ocip->query(ind))
+	{
+		delete ocip;
+		return false;
+	}
+	
+	if(!ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+
+	tabIndex = string(ocip->getData(0));
+	delete ocip;
+		
+	string reb = "ALTER INDEX ";
+	reb += tabIndex + " REBUILD";
+	if(!execute(reb))
+		return false;
+
+	return true;
+}
+
+bool
+TeOracleSpatial::DeleteSpatialIndex(const string &table)
+{
+	TeOracleSpatialPortal	*ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string tabIndex;
+
+	string ind = "SELECT index_name FROM USER_SDO_INDEX_INFO";
+	ind += " WHERE table_name = '"+ TeConvertToUpperCase(table) +"'";
+	if (!ocip->query(ind))
+	{
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+
+	tabIndex = string(ocip->getData(0));
+	ocip->freeResult();
+	delete ocip;
+
+	string drop = "DROP INDEX "+ tabIndex;
+	if (!(execute(drop.c_str ())))
+		return false;
+	return true;
+}
+
+bool	
+TeOracleSpatial::createSequence(const string &tableName)
+{
+	string nameSeq = getNameSequence(tableName);
+	
+	string seq = " CREATE SEQUENCE " + nameSeq;
+	seq += " START WITH 1 INCREMENT BY 1 ORDER ";
+	if (!execute(seq))
+	{	
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating sequence to table " + tableName + " !";
+		return false;
+	}
+
+	return true;
+}
+
+bool
+TeOracleSpatial::createAutoIncrementTrigger(const string &tableName, const string &fieldName)
+{
+	string nameTri = getNameTrigger(tableName);
+	string nameSeq = getNameSequence(tableName);
+
+	string tri;
+	tri = "CREATE TRIGGER " + nameTri; 
+	tri += " BEFORE INSERT ON "+tableName; 
+	tri += " for each row";
+	tri += " begin";
+	tri += " select "+nameSeq+".nextval";
+	tri += " into :new."+fieldName;
+	tri += " from dual;";
+	tri += " end;";
+
+	if(!execute(tri))
+	{	
+		if(errorMessage_.empty())
+			errorMessage_ = "Error creating trigger to table " + tableName + " !";
+		return false;
+	}
+	return true;
+}
+
+string
+TeOracleSpatial::getNameSequence(const string &tableName)
+{
+	string name;
+	if(tableName.size()>21)
+		name = tableName.substr(0,20) + "_seq";
+	else
+		name = tableName + "_seq";
+
+	return name;
+}
+
+string
+TeOracleSpatial::getNameTrigger(const string &tableName)
+{
+	string name;
+	if(tableName.size()>21)
+		name = tableName.substr(0,20) + "_tri";
+	else
+		name = tableName + "_tri";
+
+	return name;
+}
+
+
+int 
+TeOracleSpatialPortal::GetDimArraySize()
+{
+	if(!cursor)
+		return 0;
+
+	return(cursor->GetDimArraySize());
+}
+
+bool 
+TeOracleSpatialPortal::GetDimElement(int i,int &elem)
+{
+	if(!cursor)
+		return false;
+
+	return (cursor->GetDimElement(i,elem));
+}
+
+int 
+TeOracleSpatialPortal::NumberOfOrdinates()
+{
+	if(!cursor)
+		return 0;
+
+	return(cursor->GetNumberOrdinates());
+}
+
+bool
+TeOracleSpatialPortal::GetCoordinates(int i,TeCoord2D& coord)
+{
+	if(!cursor)
+		return false;
+
+	return (cursor->GetCoordinates((i*2)-1,coord));
+}
+
+bool
+TeOracleSpatialPortal::GetGeometryType(TeSDOGType& gType)
+{
+	if(!cursor)
+		return false;
+
+	int type = cursor->GetGeometryType(); 
+	
+	switch(type)
+	{ 
+		case 2000:
+			gType=TeSDOUNKNOWN;
+			break;
+
+		case 2001:
+			gType=TeSDOPOINT;
+			break;
+
+		case 2002:
+			gType=TeSDOLINE;
+			break;
+
+		case 2003:
+			gType=TeSDOPOLYGON;
+			break;
+
+		case 2004:
+			gType=TeSDOCOLLECTION;
+			break;
+
+		case 2005:
+			gType=TeSDOMULTIPOINT;
+			break;
+
+		case 2006:
+			gType=TeSDOMULTILINE;
+			break;
+		
+		case 2007:
+			gType=TeSDOMULTIPOLYGON;
+			break;
+		default:
+			return false;
+	};
+	return true;
+}
+
+int
+TeOracleSpatialPortal::GetSpatialReferenceId()
+{
+	if(!cursor)
+		return -1;
+
+	return (cursor->GetSpatialReferenceId());
+}
+
+bool
+TeOracleSpatialPortal::GetPointXYZ (double& x,double& y)
+{
+	if(!cursor)
+		return false;
+
+	return (cursor->GetXYZcoord(x,y));
+}
+
+
+bool 
+TeOracleSpatial::insertLayer(TeLayer* layer)
+{	
+	int index;
+	TeProjection* proj = layer->projection();
+	if (!proj || !insertProjection(proj))
+	{
+		errorMessage_ = "N�o � poss�vel inserir layer sem proje��o";
+		return false;
+	}
+	string ins = "INSERT INTO te_layer (layer_id, projection_id, name ";
+	ins += ", lower_x, lower_y, upper_x, upper_y) ";
+	ins += " VALUES ( ";
+	ins += "te_layer_seq.NEXTVAL";
+	ins += ", " + Te2String(proj->id());
+	ins += ", '" + escapeSequence(layer->name()) + "'";
+	ins += ", " + Te2String(layer->box().x1(),10);
+	ins += ", " + Te2String(layer->box().y1(),10);
+	ins += ", " + Te2String(layer->box().x2(),10);
+	ins += ", " + Te2String(layer->box().y2(),10);
+	ins += ")";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table te_layer!";   
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	ins = "SELECT te_layer_seq.CURRVAL FROM DUAL";
+	if (!ocip->query(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_layer_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	index = atoi((const char*)ocip->getData(0));
+	layer->id(index);
+	delete ocip;
+	layerMap_[layer->id()] = layer;
+	return true;
+}
+
+bool 
+TeOracleSpatial::deleteLayer (int layerId)
+{
+	//Delete attributes tables
+	if(!deleteLayerTable(layerId))
+		return false;
+
+	TeOracleSpatialPortal* portal = (TeOracleSpatialPortal*) this->getPortal();
+	if (!portal)
+		return false;
+
+	string geomTable;
+	string sql = "SELECT projection_id FROM te_layer WHERE layer_id = ";
+	sql += Te2String(layerId);
+
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	string projId = portal->getData("projection_id");
+	portal->freeResult();
+
+	// Get all representations that are associated to this layer
+	sql = "SELECT * FROM te_representation WHERE layer_id = "+ Te2String(layerId);
+	if (!portal->query (sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	while (portal->fetchRow())
+	{	// Delete the geometry tables
+		geomTable = portal->getData("geom_table");
+	
+		// Delete lut table
+		TeGeomRep rep = TeGeomRep(atoi(portal->getData("geom_type")));
+		if (rep == TeRASTER)
+		{
+			TeOracleSpatialPortal* portal2 = (TeOracleSpatialPortal*)this->getPortal();
+			sql = "SELECT lut_table, raster_table FROM " + geomTable;
+			string tabName;
+			if (!portal2->query (sql))
+			{
+				delete portal2;
+				continue;
+			}
+
+			while (portal2->fetchRow())
+			{
+				// remove lut table
+				tabName = portal2->getData(0);
+				if (!tabName.empty() && this->tableExist(tabName))
+				{
+					sql = "DROP TABLE " + tabName;
+					this->execute(sql);
+
+					sql= "DROP SEQUENCE "+ getNameSequence(tabName);
+					this->execute(sql); 
+				}
+				// remove raster table
+				tabName = portal2->getData(1);
+				if (!tabName.empty() && this->tableExist(tabName))
+				{
+					sql = "DROP TABLE " + tabName;
+					this->execute(sql);
+
+					DeleteMetadata(tabName, "block_box");
+					DeleteSpatialIndex(tabName);
+				}
+			}
+			delete portal2;
+			// remove raster metadata table
+			tabName = geomTable + "_metadata";
+			if (!tabName.empty() && this->tableExist(tabName))
+			{
+				sql = "DROP TABLE " + tabName;
+				this->execute(sql);
+			}
+		}
+		if (this->tableExist(geomTable))
+		{
+			sql = "DROP TABLE " + geomTable;
+			if (!this->execute(sql) )
+			{
+				delete portal;
+				return false;
+			}
+			
+			sql= "DROP SEQUENCE "+ getNameSequence(geomTable);
+			this->execute(sql);
+			DeleteMetadata(geomTable, "spatial_data");
+			DeleteSpatialIndex(geomTable);
+		}
+	}
+
+	portal->freeResult();
+	if (existRelation("te_representation","fk_rep_layer_id") != TeRICascadeDeletion)
+	{
+		// Delete entries into representations table
+		sql = "DELETE FROM te_representation WHERE layer_id = " +Te2String(layerId);
+		if (!this->execute(sql) )
+		{
+			delete portal;
+			return false;
+		}
+	}
+
+	// delete layer themes
+	sql = "SELECT theme_id FROM te_theme WHERE layer_id=" + Te2String(layerId);
+	if (!portal->query (sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	int themeId;
+	while (portal->fetchRow())
+	{	
+		themeId = atoi(portal->getData("theme_id"));
+		this->deleteTheme(themeId);
+	}
+	
+	sql = "DELETE FROM te_layer WHERE layer_id=" + Te2String(layerId);
+	if (!this->execute(sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	// delete layer projection
+	sql = "DELETE FROM te_projection WHERE projection_id = "+ projId;
+	if (!this->execute(sql))
+	{	
+		delete portal;
+		return false;
+	}
+
+	// remove all the items� themes associated to the layer to be removed
+	TeThemeMap::iterator it;
+	for (it = themeMap_.begin(); it != themeMap_.end(); ++it)
+	{
+		TeTheme *theme = it->second;
+		if (theme->layer()->id() == layerId)
+		{
+			themeMap_.erase(theme->id());
+			delete theme;
+		}
+	}
+
+	// Delete layer and its entry in the layer map
+	TeLayer* layer = layerMap_[layerId];
+	layerMap_.erase(layerId);
+	delete layer;
+
+	delete portal;
+	return true;
+}
+
+
+bool
+TeOracleSpatial::insertTheme (TeTheme *theme)
+{
+	double maxScale = theme->maxScale ();
+	if(maxScale==TeMAXFLOAT)
+		maxScale = 0.;
+
+	string ins = "INSERT INTO te_theme (theme_id, layer_id, view_id, name, ";
+	ins += " parent_id, priority, node_type, min_scale, max_scale, ";
+	ins += " generate_attribute_where, generate_spatial_where, generate_temporal_where, ";
+	ins += " collection_table, visible_rep, enable_visibility) VALUES (";
+	ins += "te_theme_seq.NEXTVAL";
+	ins += ", " + Te2String(theme->layerId());
+	ins += ", " + Te2String(theme->view());
+	ins += ", '" + escapeSequence(theme->name()) + "'";
+	ins += ", " + Te2String(theme->parentId ());
+	ins += ", " + Te2String(theme->priority());
+	ins += ", " + Te2String(theme->type ());
+	ins += ", " + Te2String (theme->minScale(),9);
+	ins += ", " + Te2String (maxScale);
+	ins += ", '" + escapeSequence(theme->attributeRest()) + "'";
+	ins += ", '" + escapeSequence(theme->spatialRest()) + "'";
+	ins += ", '" + escapeSequence(theme->temporalRest()) + "'";
+	ins += ", '" + escapeSequence(theme->collectionTable()) + "'";
+	ins += ", " + Te2String(theme->visibleRep());
+	ins += ", " + Te2String(theme->visibility());
+	ins += ")";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table te_theme!";   
+		return false;
+	}
+
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT te_theme_seq.CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_theme_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	theme->id(index);
+	delete ocip;
+	string colName = theme->collectionTable(); 
+
+	//insert collection name
+	if(colName.empty())
+	{
+		colName = "te_collection_" + Te2String(index);
+		theme->collectionTable(colName);	
+		
+		ins = "UPDATE te_theme SET ";
+		ins += " collection_table = '" + escapeSequence(colName) + "'";
+		ins += " WHERE theme_id = " + Te2String (index);
+		
+		if(!execute(ins))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error inserting in the table te_theme!";   
+			return false;
+		}
+	}
+	
+	bool status;
+
+	// insert grouping
+	int numSlices = 0;
+	if(theme->grouping())
+	{
+		if(!insertGrouping (theme->id(), theme->grouping()))
+			return false;
+		numSlices = theme->grouping()->groupNumSlices_;
+	}
+
+	// insert legend
+	theme->outOfCollectionLegend().group(-1); 
+	theme->outOfCollectionLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->outOfCollectionLegend())); 
+	if (!status)
+		return status;
+
+	theme->withoutDataConnectionLegend().group(-2); 
+	theme->withoutDataConnectionLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->withoutDataConnectionLegend())); 
+	if (!status)
+		return status;
+
+	theme->defaultLegend().group(-3); 
+	theme->defaultLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->defaultLegend())); 
+	if (!status)
+		return status;
+
+	theme->pointingLegend().group(-4); 
+	theme->pointingLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->pointingLegend())); 
+	if (!status)
+		return status;
+
+	theme->queryLegend().group(-5); 
+	theme->queryLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->queryLegend())); 
+	if (!status)
+		return status;
+
+	theme->queryAndPointingLegend().group(-6); 
+	theme->queryAndPointingLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->queryAndPointingLegend())); 
+	if (!status)
+		return status;
+
+	for (int i = 0; i < numSlices; i++)
+	{
+		theme->legend()[i].group(i);
+		theme->legend()[i].theme(theme->id());
+		status = insertLegend (&(theme->legend()[i]));
+		if (!status)
+			return status;
+	}
+	if (!status)
+		return status;
+
+	themeMap_[theme->id()] = theme;
+	return updateThemeTable(theme);
+}
+
+
+bool 
+TeOracleSpatial::insertThemeTable (int themeId, int tableId, int relationId, int tableOrder)
+{
+	string ins = "INSERT INTO te_theme_table ";
+	ins += " (theme_table_id, theme_id, table_id, relation_id, table_order)";
+	ins += " VALUES ( ";
+	ins += getNameSequence("te_theme_table") +".NEXTVAL ";
+	ins += ", "+ Te2String(themeId);
+	ins += ", "+ Te2String(tableId);
+	
+	if(relationId>0)
+		ins += ", "+ Te2String(relationId);
+	else
+		ins += ", null ";
+
+	ins += ", "+ Te2String(tableOrder);
+	ins += ")";
+
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table te_theme_table!";   
+		return false;
+	}
+
+	return true;
+}
+
+bool 
+TeOracleSpatial::insertThemeGroup(TeViewTree* tree)
+{
+	string ins = "INSERT INTO te_theme (theme_id, view_id, name, ";
+	ins += " parent_id, priority, node_type ) VALUES (";
+	ins += "te_theme_seq.NEXTVAL";
+	ins += ", " + Te2String(tree->view());
+	ins += ", '" + escapeSequence(tree->name()) + "'";
+	ins += ", " + Te2String(tree->parentId ());
+	ins += ", " + Te2String(tree->priority());
+	ins += ", " + Te2String(1);
+	ins += ")";
+
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+	
+	try
+	{
+		if(!execute(ins))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error inserting in the table te_theme!";   
+			return false;
+		}
+
+		string seq = "SELECT te_theme_seq.CURRVAL FROM DUAL";
+		if(!ocip->query(seq))
+		{
+			if(errorMessage_.empty())
+				errorMessage_ = "Error in the sequence te_theme_seq!";  
+			delete ocip;
+			return false;
+		}
+
+		if(!ocip->fetchRow())
+		{
+			errorMessage_ = "Sequence value not found!";
+			delete ocip;
+			return false;
+		}
+
+		int index = atoi((const char*)ocip->getData(0)); 
+		tree->id(index);
+		
+	}
+	catch(...)
+	{
+		errorMessage_ = "Error inserting in the table te_theme!";
+		if(ocip)
+			delete ocip;
+		return false;
+	}
+
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::generateLabelPositions	(TeTheme *theme)
+{
+	
+	string	geomTable, upd;
+	string	collTable = theme->collectionTable();
+	
+	if((collTable.empty()) || (!tableExist(collTable)))
+		return false;
+
+	if( theme->layer()->hasGeometry(TeCELLS)    || 
+		theme->layer()->hasGeometry(TePOLYGONS) ||
+		theme->layer()->hasGeometry(TeLINES) )
+	{
+		geomTable = theme->layer()->tableName(TeCELLS);
+		
+		if(geomTable.empty())
+		{
+			geomTable = theme->layer()->tableName(TePOLYGONS);
+			if(geomTable.empty())
+				geomTable = theme->layer()->tableName(TeLINES);
+		}
+		
+		upd= " UPDATE " + collTable + " SET ";
+		upd += " label_x = (SELECT MAX(SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+		upd += geomTable + ".spatial_data, 1) + (SDO_GEOM.SDO_MAX_MBR_ORDINATE( ";
+		upd += geomTable + ".spatial_data, 1) -  SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+		upd += geomTable + ".spatial_data, 1))/2) ";
+		upd += "FROM " + geomTable + " WHERE object_id = c_object_id), ";
+		
+		upd += " label_y = (SELECT MAX(SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+		upd += geomTable + ".spatial_data, 2) + (SDO_GEOM.SDO_MAX_MBR_ORDINATE( ";
+		upd += geomTable + ".spatial_data, 2) -  SDO_GEOM.SDO_MIN_MBR_ORDINATE( ";
+		upd += geomTable + ".spatial_data, 2))/2) ";
+		upd += "FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+		upd += " WHERE label_x IS NULL OR label_y IS NULL";
+
+	}
+	
+	else if (theme->layer()->hasGeometry(TePOINTS))
+	{
+		geomTable = theme->layer()->tableName(TePOINTS);
+		
+		upd= " UPDATE "+ collTable +" SET ";
+		upd += " label_x = (SELECT MAX(p.spatial_data.SDO_POINT.X) ";
+		upd += " FROM " + geomTable + " p WHERE object_id = c_object_id), ";
+		
+		upd += " label_y = (SELECT MAX(p.spatial_data.SDO_POINT.Y) ";
+		upd += " FROM " + geomTable + " p WHERE object_id = c_object_id) ";
+		upd += " WHERE label_x IS NULL OR label_y IS NULL";
+	}
+
+	if(!execute(upd))
+		return false;
+
+	return true;
+}
+
+
+bool 
+TeOracleSpatial::insertView(TeView *view)
+{
+	// save it�s projection
+	TeProjection* proj = view->projection();
+	if ( !proj || !insertProjection(proj))
+	{
+		errorMessage_ = "N�o � poss�vel inserir vista sem proje��o";
+		return false;
+	}
+
+	string ins = "INSERT INTO te_view (view_id, projection_id, name, user_name, visibility)";
+	ins += " VALUES (";
+	ins += "te_view_seq.NEXTVAL";
+	ins += ", " + Te2String(proj->id());
+	ins += ", '" + escapeSequence(view->name ()) + "'";
+	ins += ", '" + escapeSequence(view->user ()) + "'";
+	ins += ", " + Te2String((int)view->isVisible());
+	ins += " )";
+	
+	if(!execute (ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table te_view!";   
+		return false;
+	}
+
+	TeOracleSpatialPortal *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	ins = "SELECT te_view_seq.CURRVAL FROM DUAL";
+	if (!ocip->query(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_view_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0));
+	view->id(index);
+	delete ocip;
+
+	int size = view->size();
+
+	for (int th=0; th<size; th++)
+	{
+		TeViewNode* node = view->get(th);
+		if (node->type() == TeTHEME)
+		{
+			TeTheme *theme = (TeTheme*) node;
+			insertTheme (theme);
+		}
+		else
+		{
+			TeViewTree* tree = (TeViewTree*)node;
+			insertViewTree (tree);
+		}
+	}
+
+	// Insert view in the view map
+	viewMap_[view->id()] = view;
+	return true;
+}
+
+
+
+bool
+TeOracleSpatial::insertViewTree (TeViewTree *tree)
+{
+	
+	string ins = "INSERT INTO te_theme (theme_id, view_id, name, ";
+	ins += " parent_id, node_type, priority) VALUES (";
+	ins += " te_theme_seq.NEXTVAL";
+	ins += ", " + Te2String(tree->view());
+	ins += ", '" + escapeSequence(tree->name()) + "'";
+	ins += ", " + Te2String(tree->parentId());
+	ins += ", " + Te2String(tree->type());
+	ins += ", " + Te2String(tree->priority());
+	ins += ")";
+	
+	if(!execute(ins))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error inserting in the table te_theme!";
+		return false;
+	}
+
+	TeOracleSpatialPortal	*ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string seq = "SELECT te_theme_seq.CURRVAL FROM DUAL";
+	if(!ocip->query(seq))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error in the sequence te_theme_seq!";  
+		delete ocip;
+		return false;
+	}
+
+	if(!ocip->fetchRow())
+	{
+		errorMessage_ = "Sequence value not found!";
+		delete ocip;
+		return false;
+	}
+
+	int index = atoi((const char*)ocip->getData(0)); 
+	tree->id(index);
+	delete ocip;
+	
+	return true;
+}
+
+bool 
+TeOracleSpatial::locatePolygon (const string& table, TeCoord2D &pt, TePolygon & /* polygon */, const double& /* tol */)
+{
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string q = "SELECT * FROM " + table;
+	q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+	q += "MDSYS.SDO_GEOMETRY(2001,NULL, MDSYS.SDO_POINT_TYPE(";
+	q += Te2String(pt.x(),10) + ", " + Te2String(pt.y(), 10);
+	q += ", NULL), NULL, NULL), ";
+	q += " 'mask=contains querytype = window') = 'TRUE'";
+
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{	
+		delete ocip;
+		return false;
+	}
+	
+//	bool flag = ocip->fetchGeometry(polygon);
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::locateLine (const string& table, TeCoord2D &pt, TeLine2D & /* line */, const double& tol)
+{
+
+	TeOracleSpatialPortal	*ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	
+	string sdoGeom = "mdsys.sdo_geometry(2003,null,null,";
+	sdoGeom += "mdsys.sdo_elem_info_array(1,1003,3),";
+	sdoGeom += "mdsys.sdo_ordinate_array(";
+	sdoGeom += Te2String(box.x1(),10) + ", " + Te2String(box.y1(),10);
+	sdoGeom += ", " + Te2String(box.x2(),10) + ", " + Te2String(box.y2(),10) + "))";
+		
+	string q = "SELECT * FROM " + table;
+	q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+	q += sdoGeom +","; 
+	q += "'mask=anyinteract querytype = window') = 'TRUE'";
+
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+
+//	bool flag = ocip->fetchGeometry(line);
+	delete ocip;
+	return true;
+}
+
+bool 
+TeOracleSpatial::locatePoint (const string& table, TeCoord2D &pt, TePoint & /* point */, const double& tol)
+{
+	TeOracleSpatialPortal	*ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	
+	string sdoGeom = "mdsys.sdo_geometry(2003,null,null,";
+	sdoGeom += "mdsys.sdo_elem_info_array(1,1003,3),";
+	sdoGeom += "mdsys.sdo_ordinate_array(";
+	sdoGeom += Te2String(box.x1(),10) + ", " + Te2String(box.y1(),10);
+	sdoGeom += ", " + Te2String(box.x2(),10) + ", " + Te2String(box.y2(),10) + "))";
+		
+	string q = "SELECT * FROM " + table;
+	q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+	q += sdoGeom +","; 
+	q += "'mask=anyinteract querytype = window') = 'TRUE'";
+	
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{
+		delete ocip;
+		return false;
+	}
+
+//	bool flag = ocip->fetchGeometry(point);
+	delete ocip;
+	return true;
+}
+
+bool	
+TeOracleSpatialPortal::fetchGeometry (TeCell& cell)
+{
+	TeCoord2D coord1,coord2;
+	try
+	{
+		GetCoordinates (1, coord1);
+		GetCoordinates (2, coord2);
+		TeBox b(coord1.x(), coord1.y(), coord2.x(), coord2.y());
+		
+		cell.setBox (b);
+		cell.geomId(atoi(getData("geom_id")));
+		cell.objectId (string(getData("object_id")));
+		cell.column(atoi(getData("col_number")));
+		cell.line(atoi(getData("row_number")));
+		return(this->fetchRow());
+	}
+	catch(...)
+	{
+		errorMessage_ = cursor->getErrorMessage();
+		return false;
+	}
+}
+
+bool 
+TeOracleSpatial::locateCell(const string& table, TeCoord2D &pt, TeCell & /* cell */, const double& /* tol */)
+{
+	TeOracleSpatialPortal  *ocip = (TeOracleSpatialPortal*)getPortal();
+	if(!ocip)
+		return false;
+
+	string q = "SELECT * FROM " + table;
+	q += " WHERE MDSYS.SDO_RELATE (spatial_data,";
+	q += "MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE(";
+	q += Te2String(pt.x(),10) + ", " + Te2String(pt.y(), 10);
+	q += ", NULL), NULL, NULL), ";
+	q += " 'mask=contains querytype = window') = 'TRUE'";
+
+	if (!ocip->query(q) || !ocip->fetchRow())
+	{	
+		delete ocip;
+		return false;
+	}
+	
+//	bool flag = ocip->fetchGeometry(cell);
+	delete ocip;
+	return true;
+}
+
+
+bool		
+TeOracleSpatialPortal::getBlob(const string& /* s */, unsigned char* &data, long& size)
+{
+	try
+	{
+		size = getCursor()->SizeBlob();
+		if(size>0)
+		{
+			data = new unsigned char[size];
+			cursor->ReadBlob((unsigned char*)data, size);
+		}
+	}
+	catch(...)
+	{
+		errorMessage_ = "Error getting media!";
+		return false;
+	}
+	return true;
+}
+
+
+TeTime 
+TeOracleSpatialPortal::getDate (int i) 
+{ 
+	TeTime temp;
+	string result;
+
+	if (i > numFields_ || i < 0)
+		return temp;
+	
+	try
+	{
+		result = cursor->GetFieldValue(i+1);
+	}
+	catch(...)
+	{
+		errorMessage_ = "Error!";
+		return temp;
+	}
+		
+	TeTime t(result, TeSECOND, "DDsMMsYYYYsHHsmmsSS");
+	return t;
+}
+	
+
+TeTime 
+TeOracleSpatialPortal::getDate (const string& s) 
+{ 
+	string	attstr;
+	string  result;
+	TeTime temp;
+
+	string fieldName;
+	size_t pos = s.find(".", string::npos,1);
+	if (pos != string::npos)
+		fieldName = s.substr(pos+1);
+	else
+		fieldName = s;
+
+	attstr = strupr((char*)(fieldName.c_str()));
+	int index = getColumnIndex (attstr);
+	if(index == -1)
+		return temp;
+	else
+		result = getData(index);
+
+	TeTime t(result, TeSECOND, "DDsMMsYYYYsHHsmmsSS") ;
+	return t;
+}
+
+string
+TeOracleSpatialPortal::getDateAsString(int i)
+{
+	TeTime t = this->getDate(i);
+	string date = t.getDateTime ();
+
+	if (!date.empty())
+	{		string tval = " TO_DATE ('"+ date +"','DDsMMsYYYYsHHsmmsSS') ";
+		return tval;
+	}
+	else
+		return "";
+}
+
+string 
+TeOracleSpatialPortal::getDateAsString(const string& s)
+{
+	TeTime t = this->getDate(s);
+	string date = t.getDateTime ();
+
+	if (!date.empty())
+	{		string tval = " TO_DATE ('"+ date +"','DDsMMsYYYYsHHsmmsSS') ";
+		return tval;
+	}
+	else
+		return "";
+}
+
+ 
+bool
+TeOracleSpatialPortal::getRasterBlock(unsigned long& size, unsigned char* ptData)
+{
+	// gets the spatial data
+	// expects that the data size will be a block of double maximum
+	unsigned long	len;
+	try
+	{
+		// get the actual length of the compressed data
+		len = getCursor()->SizeBlob();
+		size = len;
+		if(len > 0)
+			getCursor()->ReadBlob(ptData, len);
+	}
+	catch(...)
+	{
+		size = 0;
+		errorMessage_ = "ERRO!";
+		return false;
+	}
+	return true;
+}
+
+string TeOracleSpatial::concatValues(vector<string>& values, const string& unionString)
+{
+	string concat = "";
+	
+	for(unsigned int i = 0; i < values.size(); ++i)
+	{
+		if(i != 0)
+		{
+			concat += " || ";
+
+			if(!unionString.empty())
+			{
+				concat += "'";
+				concat += unionString;
+				concat += "'";
+				concat += " || ";
+			}
+		}
+
+		concat += values[i];
+	}
+
+	return concat;
+}
+
+string TeOracleSpatial::toUpper(const string& value)
+{
+	string result  = "upper(";
+	       result += value;
+		   result += ")";
+
+	return result;
+}
\ No newline at end of file
diff --git a/src/terralib/drivers/OracleSpatial/TeOracleSpatial.h b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.h
new file mode 100644
index 0000000..9fa3fd8
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/TeOracleSpatial.h
@@ -0,0 +1,392 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_ORACLESPATIAL_H
+#define  __TERRALIB_INTERNAL_ORACLESPATIAL_H
+#if _MSC_VER > 1000
+#pragma once
+#endif 
+
+#include "connect.h"
+#include "cursor.h"
+#include <TeDatabase.h>
+
+#ifndef COMMIT
+#define COMMIT 1
+#define ROLLBACK 2
+#endif
+
+#ifdef AFX_DLL
+#define EXPORT_WIN __declspec( dllexport )
+#else
+#define EXPORT_WIN
+#endif
+
+//SDO_GEOMETRY types  (number of dimensions=2 and LRS=0)
+enum TeSDOGType  
+{ TeSDOUNKNOWN, TeSDOPOINT, TeSDOLINE, TeSDOPOLYGON,TeSDOCOLLECTION, 
+  TeSDOMULTIPOINT, TeSDOMULTILINE, TeSDOMULTIPOLYGON};
+
+//! A concrete implementation of a driver to the Oracle Spatial SGDB
+class EXPORT_WIN TeOracleSpatial : public TeDatabase
+{
+
+friend class TeOracleSpatialPortal;
+
+private:
+
+	//! Inserting geometric table in the metadata table USER_SDO_GEOM_METADATA  
+	bool	insertMetadata(const string &table, const string &column, double tolx,double toly,TeBox &box,short srid=0);
+
+	//! Deleting geometric table in the metadata table USER_SDO_GEOM_METADATA  
+	bool	DeleteMetadata(const string &table, const string &column);
+	
+	//! Create/Rebuild/Delete spatial index
+	bool	createSpatialIndex(const string &table, const string &column,TeSpatialIndexType type= TeRTREE,short level=0,short tile=0);
+	bool	RebuildSpatialIndex(const string &table);
+	bool	DeleteSpatialIndex(const string &table);
+
+	bool	createSequence(const string &seqName);
+	bool	createAutoIncrementTrigger(const string &tableName, const string &fieldName);
+	string	getNameSequence(const string &tableName);
+	string  getNameTrigger(const string &tableName);
+
+	//! Connection to ORACLE database   
+	OCIConnection  *Conn;  
+
+public:
+	
+	TeOracleSpatial();
+
+	~TeOracleSpatial();
+
+
+	string  escapeSequence(const string& from); 
+
+	bool newDatabase(const string& /*database*/, const string& /*user*/, const string& /*password*/, const string& /*host*/, const int& /*port=0*/, bool /*terralibModel=true*/) { return false; }
+
+	bool connect (const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+	void  close();
+
+	bool tableExist(const string& table);
+
+	bool columnExist(const string& table, const string& column, TeAttribute& attr);
+
+	bool createTable (const string& table, TeAttributeList &attr);
+
+	bool addColumn (const string& table,TeAttributeRep &rep);
+
+	bool deleteTable (const string& table);
+
+	bool execute (const string &sql);
+	
+	TeDatabasePortal* getPortal ();
+
+	TeDBRelationType existRelation(const string& tableName, const string& relName);
+
+	bool createRelation (const string& name, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion);
+		
+	// --- create metadata tables 
+	bool createViewTable ();
+	
+	bool createThemeTable ();  
+
+	bool createGroupingTable();
+
+	bool createThemeTablesTable();
+
+	bool createLayerTable ();
+
+	bool createLayerTableTable ();
+
+	bool createTablesRelationTable();
+
+	bool createRepresentationTable();
+
+	bool createLegendTable();
+
+	bool createVisualRasterTable();
+
+	bool createVisualTable();
+
+	bool createDatabaseTable();
+	
+	bool createProjectionTable ();
+	
+	bool createRasterMetadataTable(const string& tableName);
+	
+	bool createLUTTable(const string& table);
+	
+	bool createCollectionTable(const string& tableName);
+	// ---
+
+	// --- create geometry tables
+	bool createCellGeometry (const string& table);
+ 
+	bool createTextGeometry (const string& table);
+
+	bool createArcGeometry (const string& table);
+
+	bool createNodeGeometry (const string& table);
+
+	bool createRasterGeometry (const string& table);
+
+	bool createRasterTable (const string& tableName);
+
+	bool createPolygonGeometry (const string& table);
+
+	bool createLineGeometry (const string& table);
+
+	bool createPointGeometry (const string& table);
+	// -----
+
+	// ----- Insert/Update/Delete metadata tables
+	bool insertTableInfo (int layerId, TeTable &table, const string& user="");
+	bool insertRelationInfo(const int tableId, const string& tField, const string& rName, const string& rField, int& relId);
+
+	bool insertTable	(TeTable &table);
+	bool updateTable	(TeTable &table);
+	
+	bool insertProjection (TeProjection *proj);
+	
+	bool insertView		(TeView *view);	
+	bool insertViewTree (TeViewTree *tree);	
+
+	bool insertTheme		(TeTheme *theme);
+	bool insertThemeTable	(int themeId, int tableId, int relationId, int tableOrder);
+	bool insertThemeGroup	(TeViewTree* tree);
+	bool generateLabelPositions	(TeTheme *theme); 
+	
+	bool insertLayer	(TeLayer *layer);	
+	bool deleteLayer	(int layerId);
+	
+	bool insertRepresentation (int layerId, TeRepresentation& rep);
+
+	bool insertLegend	(TeLegendEntry *legend);	
+	// ----------------
+
+	// ----- Insert/Update/Delete geometry tables
+	//polygon
+	bool insertPolygon		(const string& table, TePolygon &p);	
+	bool updatePolygon		(const string& table, TePolygon &p);
+	bool locatePolygon		(const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+	
+	bool selectPolygonSet	(const string& table, const string& criteria, TePolygonSet &ps); 
+	bool loadPolygonSet		(const string& table, const string& geoid, TePolygonSet &ps);  
+	bool loadPolygonSet		(const string& table, TeBox &box, TePolygonSet &ps); 
+	bool loadPolygonSet		(TeTheme* theme, TePolygonSet &ps); 
+	TeDatabasePortal*		loadPolygonSet(const string& table, TeBox &box); 
+	
+	bool AllocateOrdinatesObject(TePolygon &poly, string& elInfo, OCICursor* cursor=0);
+	
+	//line
+	bool insertLine		(const string& table, TeLine2D &l);		
+	bool updateLine		(const string& table, TeLine2D &l);
+	bool locateLine		(const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+
+	bool loadLineSet	(const string& table, const string& geoid, TeLineSet &ls); 
+	bool loadLineSet	(const string& table, TeBox &box, TeLineSet &linSet); 
+	TeDatabasePortal*   loadLineSet (const string& table, TeBox &box);
+	
+	bool AllocateOrdinatesObject(TeLine2D &line, OCICursor* cursor=0);
+			
+    //point
+	bool insertPoint	(const string& table, TePoint &p);	
+	bool updatePoint	(const string& table, TePoint &p);
+	bool locatePoint	(const string& table, TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+    
+	//text
+	bool insertText		(const string& table, TeText &t);	
+
+	//arc
+	bool insertArc		(const string& table,TeArc &arc);
+
+	//node
+	bool insertNode		(const string& table, TeNode &node);	
+	bool updateNode		(const string& table, TeNode &node);	
+
+	//cell
+	bool insertCell		(const string& table, TeCell &c);
+	bool updateCell		(const string& table, TeCell &c);
+	bool locateCell		(const string& table, TeCoord2D &pt, TeCell &cell, const double& tol = 0.0);
+	
+	//raster
+	bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char *buf,unsigned long size, int band=0, unsigned int res=1, unsigned int subband=0);
+	// ----------
+
+	// ----- blob
+	bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size);
+	bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName);
+	// -----
+	
+	//---------- SQLs
+	string getSQLBoxWhere (TeBox &box, TeGeomRep rep); 
+	
+	string getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1); 
+	
+	string getSQLBoxSelect (const string& tableName, TeGeomRep rep); 
+
+	string getSQLStatistics (TeGroupingAttr& attrs);
+
+	string  getSQLAutoNumber(const string& table);
+	// ------
+	
+	bool getMBRSelectedObjects(string geomTable,string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol = 0.0);
+
+	bool dropConceptualModel();
+	
+	bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom);
+
+	//Spatial query
+	//spatial relate between a set of geometry of the table actTable and all other geometry 
+	//return a portal
+	bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable="");
+	bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, int relate, const string& visCollTable=""); 
+	bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable=""); 
+	
+	//spatial relate between a set of geometry of the table actTable and all other geometry 
+	//return a object_id vector
+	bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable="");
+	bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, const string& visCollTable=""); 
+	bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable=""); 
+	
+	//metric functions
+	bool calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsOut, double &area);
+	bool calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &length);
+	
+	bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance);
+	bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, double& distance);
+
+	//fazer para TeGeometry*
+	//bool withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable="");
+
+	// functions that generate new geometry
+	bool Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist);
+	bool ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet);
+	bool Centroid(const string&  actGeomTable , TeGeomRep actRep, TePointSet& centroidSet, Keys actIds = vector<string>(), const string& actCollTable = "");
+
+	//return the objects identificators of the nearest neighbors  
+	bool nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep actRep, const string& objId1, Keys& actIdsOut, int numRes=1);
+	bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep visRep, Keys& visIdsOut, int numRes=1); 
+
+	//return a portal with the nearest neighbors
+	bool nearestNeighbors(const string& actGeomTable, const string& actCollTable, TeGeomRep actRep, const string& objId1, TeDatabasePortal* portal, int numRes=1);
+	bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, const string& visCollTable, TeGeomRep visRep, TeDatabasePortal* portal, int numRes=1); 
+
+	bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+	bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+	bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect);
+	bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+	bool geomUnion(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+	bool geomUnion(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+	bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect);
+	bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);	
+
+	//! Concat values in a vector using unionString as the join between each value
+	string concatValues(vector<string>& values, const string& unionString);
+
+	//! Returns the SQL function for upper case
+	string toUpper(const string& value);
+	
+};
+
+//! A concrete implementation of a portal to a Oracle Spatial database
+class EXPORT_WIN TeOracleSpatialPortal : public TeDatabasePortal
+{
+private:
+	OCICursor		*cursor;
+	string		Value_;
+	long		curRow_;
+
+    bool isConnected ();
+    bool isEOF();
+
+	
+public:
+
+	TeOracleSpatialPortal(TeOracleSpatial *pDatabase);
+	~TeOracleSpatialPortal();
+
+	OCICursor*	getCursor() { return cursor; }
+
+    //! Move operations
+	bool moveFirst();
+    bool moveNext();
+
+	bool query ( const string &q,TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR );
+	bool querySDO (const string &q);
+	
+	bool fetchRow ();
+	bool fetchRow (int i);
+
+	void freeResult ();
+
+	char* getData (int i);
+	char* getData (const string& s);
+
+	double getDouble (int i);
+	double getDouble (const string& s);
+	int	getInt (int i);
+	int	getInt (const string& s);
+
+	bool getBool (const string& s);
+	bool getBool (int i);
+
+	bool getGeometry (TeGeometry** geom, bool& result);
+	bool fetchGeometry (TePolygon& poly);
+	bool fetchGeometry (TePolygonSet& polySet);
+	bool fetchGeometry (TeLine2D& line);
+	bool fetchGeometry (TeLineSet& lineSet);
+	bool fetchGeometry (TeNode& n);
+	bool fetchGeometry (TePoint& p);
+	bool fetchGeometry (TePointSet& pointSet);
+	bool fetchGeometry (TeCell& cell);
+	
+	bool getRasterBlock(unsigned long& size, unsigned char*);
+	
+	bool getBlob(const string& s, unsigned char* &data, long& size);
+		
+	TeTime getDate (int i);
+	TeTime getDate (const string& s);
+
+	string getDateAsString(int i);
+	string getDateAsString(const string& s);
+
+	//! Oci geometry methods: Get SDO_GEOMETRY informations   
+	int			GetDimArraySize();
+	bool		GetDimElement(int i,int &elem);
+	int			NumberOfOrdinates();
+	bool		GetCoordinates(int i,TeCoord2D& coord);
+	bool		GetGeometryType(TeSDOGType& gType);
+	int			GetSpatialReferenceId();
+	bool		GetPointXYZ (double& x,double& y);
+};
+
+#endif 
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/connect.cpp b/src/terralib/drivers/OracleSpatial/connect.cpp
new file mode 100644
index 0000000..4187f64
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/connect.cpp
@@ -0,0 +1,425 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "connect.h"
+#include "sdo_oci.h"
+
+
+OCIConnection::OCIConnection() 
+{
+	connected = false;
+
+	envhp = 0;
+	errhp = 0;
+	srvhp = 0;
+	svchp = 0;
+	usrhp = 0;
+	txnhp = 0;
+	stmthp = 0;
+	tdo_geometry = 0;
+	tdo_ordinates = 0;
+	ordinates = 0;
+}
+
+
+bool OCIConnection::Connect(const char* dblink, const char* username, const char* password) 
+{
+	sword status;
+
+	int mode = OCI_THREADED|OCI_OBJECT;
+	
+
+	//create and initialize the environment
+	status = SDO_OCIEnvCreate(&envhp, (ub4)mode, (dvoid *)0, 
+				      (dvoid*(*)(dvoid *ctxp, size_t size))0, 
+				      (dvoid*(*)(dvoid *ctxp, dvoid *memptr, size_t newsize))0, 
+				      (void (*)(dvoid *ctxp, dvoid *memptr))0, 
+					  (size_t)0, (dvoid**)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// Allocate handles - errhp(OCIError) and srvhp (OCIServer)
+	status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&errhp, (ub4)OCI_HTYPE_ERROR,
+					   (size_t)0, (dvoid**)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&srvhp, (ub4)OCI_HTYPE_SERVER,
+					   (size_t)0, (dvoid**)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// Multiple Sessions or Connections
+	status = SDO_OCIServerAttach(srvhp, errhp, (text*)dblink, 
+						 (sb4)strlen(dblink), (ub4)OCI_DEFAULT);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// Allocate handles: svchp(OCISvcCtx)
+	status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&svchp, (ub4)OCI_HTYPE_SVCCTX, 
+					   (size_t)0, (dvoid**)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// Set the server attribute in the service context handle
+	status = SDO_OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)srvhp, (ub4)0, 
+				   (ub4)OCI_ATTR_SERVER, errhp);
+	if(!CheckError(errhp, status))
+		return false;
+
+	/// Allocate a user session handle
+	status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&usrhp, (ub4)OCI_HTYPE_SESSION, 
+					   (size_t)0, (dvoid**)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// set user name attribute in user session handle 
+	status = SDO_OCIAttrSet((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)username, 
+				   (ub4)strlen(username), (ub4)OCI_ATTR_USERNAME, errhp);
+	if(!CheckError(errhp, status))
+		return false;
+	
+	// set password attribute in user session handle
+	status = SDO_OCIAttrSet((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION, (dvoid*)password, 
+				   (ub4)strlen(password), (ub4)OCI_ATTR_PASSWORD, errhp);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// Session begins - establishes a session for a user against a particular
+	// server. This call is required for the user to execute operations on the server.
+	status = SDO_OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, 
+								 OCI_DEFAULT);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// set the user session attribute in the service context handle
+	status = SDO_OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)usrhp, (ub4)0, 
+				   (ub4)OCI_ATTR_SESSION, errhp);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// allocate transaction handle 1 and set it in the service handle (OCITrans)
+	status = OCIHandleAlloc((dvoid *)envhp, (dvoid **)&txnhp, OCI_HTYPE_TRANS, 0, 0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	status = OCIAttrSet((dvoid *)svchp, OCI_HTYPE_SVCCTX, (dvoid *)txnhp, 0,OCI_ATTR_TRANS, errhp);
+	if(!CheckError(errhp, status))
+		return false;
+
+	// locate stmthp
+	status = SDO_OCIHandleAlloc((dvoid*)envhp, (dvoid**)&stmthp, 
+								  (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	//load the tdo type to sdo_geometry (OCIType)
+	status = OCITypeByName(envhp, errhp, svchp, (const text *)
+			"MDSYS", (ub4) strlen((char *)"MDSYS"),
+			(const text *) "SDO_GEOMETRY",	(ub4) strlen((char *)"SDO_GEOMETRY"),
+			(text *)0, 0, OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, &tdo_geometry);
+	if(!CheckError(errhp, status))
+		return false;
+
+	//load the tdo type to sdo_ordinates (OCIType)
+	status = OCITypeByName(envhp, errhp, svchp, (const text *)
+			"MDSYS", (ub4) strlen((char *)"MDSYS"),
+			(const text *) "SDO_ORDINATE_ARRAY", (ub4) strlen((char *)"SDO_ORDINATE_ARRAY"),
+			(text *)0, 0, OCI_DURATION_SESSION, OCI_TYPEGET_HEADER, &tdo_ordinates);
+	if(!CheckError(errhp, status))
+		return false;
+
+	connected = true;
+	return true;
+}
+
+
+void OCIConnection::Disconnect()  
+{
+	// Session ends
+	SDO_OCISessionEnd(svchp, errhp, usrhp, (ub4)OCI_DEFAULT);
+	SDO_OCIServerDetach(srvhp, errhp, (ub4)OCI_DEFAULT);
+
+	// Finalize svchp, srvhp, errhp and stmthp
+	SDO_OCIHandleFree((dvoid*)txnhp, (ub4)OCI_HTYPE_TRANS);
+	SDO_OCIHandleFree((dvoid*)srvhp, (ub4)OCI_HTYPE_SERVER);
+	SDO_OCIHandleFree((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX);
+	SDO_OCIHandleFree((dvoid*)errhp, (ub4)OCI_HTYPE_ERROR);
+	SDO_OCIHandleFree((dvoid*)usrhp, (ub4)OCI_HTYPE_SESSION);
+	SDO_OCIHandleFree((dvoid*)stmthp, (ub4)OCI_HTYPE_STMT);
+
+	connected = false;		
+	envhp = 0;
+	errhp = 0;
+	srvhp = 0;
+	svchp = 0;
+	usrhp = 0;
+	txnhp = 0;
+	tdo_geometry = 0;
+	tdo_ordinates = 0;
+	ordinates = 0;
+	stmthp = 0;
+}
+
+
+bool OCIConnection::Prepare(const string& stmt)
+{	
+	if (!connected)
+		return false;
+	
+	ub4 size = stmt.size();
+	sword status = SDO_OCIStmtPrepare(svchp, (OCIStmt *)stmthp, errhp, (text*)stmt.c_str(), (ub4)size,  
+		(text*)0, (ub4)0, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+
+bool OCIConnection::BindByPos(int pos, void* value, int size, void* indicator, int type)
+{
+	if (!connected)
+		return false;
+
+	OCIBind *bindp = NULL;
+
+	sword status = SDO_OCIBindByPos(stmthp, &bindp, errhp, pos, (dvoid *)value, 
+								(sb4)size, type, (dvoid *)indicator, (ub2 *)0, 
+								(ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+	if(!CheckError(errhp, status))
+		return false;
+	return true;
+}
+
+
+bool OCIConnection::BindByName(char* name, void* value, int size, void* indicator, int type)
+{
+	if (!connected)
+		return false;
+
+	OCIBind *bindp = NULL;
+	sword status = SDO_OCIBindByName(stmthp, &bindp, errhp, (text*)name, 
+								 (sb4)-1, (dvoid *)value, (sb4)size, type, 
+								 (dvoid *)indicator, (ub2 *)0, (ub2 *)0, 
+								 (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+	if(!CheckError(errhp, status))
+		return false;
+	return true;
+}
+
+bool OCIConnection::BindOrdinates()
+{
+	OCIBind		*bnd1p = NULL;
+	
+	/* bind coordinate varray object */
+	sword status = OCIBindByName(stmthp, &bnd1p, errhp, 
+	    (text *)":ordinates", (sb4)-1, (dvoid *)0, (sb4)0, SQLT_NTY, (dvoid *)0, 
+		(ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+	if(!CheckError(errhp, status))
+		return false;
+
+	status = OCIBindObject(bnd1p, errhp, tdo_ordinates, (dvoid **)&ordinates, (ub4 *)0, 
+	    (dvoid **)0, (ub4 *)0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+
+int OCIConnection::QueryType()  
+{	
+	ub2 querytype_;
+		
+	sword status = OCIAttrGet((dvoid *)stmthp, (ub4)OCI_HTYPE_STMT, (ub2 *)&querytype_,
+	(ub4*)NULL, (ub4)OCI_ATTR_STMT_TYPE, (OCIError *)errhp);
+	if(!CheckError(errhp, status))
+		return -1;
+	return (querytype_);
+}
+
+
+bool OCIConnection::AllocateObjectOrdinates()
+{
+	sword status = SDO_OCIObjectNew(envhp, errhp, svchp, OCI_TYPECODE_VARRAY, tdo_ordinates, (dvoid*)NULL, 
+					OCI_DURATION_SESSION, TRUE, (dvoid**)&ordinates);
+
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+
+bool OCIConnection::AppendOrdinates(const double& val)
+{
+	
+	OCINumber	oci_number;
+	sword       status;
+	
+	status = OCINumberFromReal(errhp, (dvoid *)&(val), 
+		(uword)sizeof(double),&oci_number);
+
+	status = OCICollAppend(envhp, errhp, 
+		(dvoid *) &oci_number,
+		(dvoid *)0, (OCIColl *)ordinates);
+
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+bool OCIConnection::TransStart()
+{
+	sword status = OCITransStart (svchp, errhp, 60, OCI_TRANS_NEW); 
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+bool OCIConnection::TransRollback()
+{
+	sword status = OCITransRollback(svchp, errhp, (ub4) 0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+bool OCIConnection::TransCommit()
+{
+	sword status = OCITransCommit(svchp, errhp, (ub4) 0);
+	if(!CheckError(errhp, status))
+		return false;
+
+	return true;
+}
+
+bool OCIConnection::Execute(const string& stm)
+{
+	if(!Prepare(stm))
+		return false;
+	
+	if ((QueryType()<0) || (QueryType()==1))
+		return false;  //return records (query)
+	
+	TransStart();
+	sword status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, 
+								  (OCISnapshot *)NULL, (ub4)OCI_DEFAULT);
+	
+	if(!CheckError(errhp, status))
+	{
+		TransRollback();
+		return false;
+	}
+
+	TransCommit();
+	return true; 
+}
+
+
+bool OCIConnection::ExecuteSDOSTM(const string& stm)  
+{
+	if(!Prepare(stm))
+		return false;
+
+	if(!BindOrdinates())
+		return false;
+
+	if((QueryType()<0) || (QueryType()==1))
+		return false;  //return records (query)
+		
+	TransStart();
+	sword status = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, (OCISnapshot *)NULL, 
+								  (OCISnapshot *)NULL, (ub4)OCI_DEFAULT);
+	
+	if(!CheckError(errhp, status))
+	{		
+		OCIObjectFree(envhp, errhp, (dvoid *)ordinates, (ub2)OCI_OBJECTFREE_FORCE);
+		TransRollback();
+		return false;
+	}
+
+	TransCommit();
+	OCIObjectFree(envhp, errhp, (dvoid *)ordinates, (ub2)OCI_OBJECTFREE_FORCE);
+	return true; 
+}
+
+
+bool OCIConnection::CheckError(OCIError* errhp, int status) 
+{
+	char errbuf[512];
+	sb4 errcode = 0;
+	bool returnedVal = false;
+		
+	if (status == OCI_ERROR)
+	{
+		SDO_OCIErrorGet((dvoid*)errhp, (ub4)1, (text*)NULL, &errcode, 
+						(text*)errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR);
+		errorMess = errbuf;
+		return false;
+	}
+
+	switch (status)
+	{ 
+		case OCI_SUCCESS:
+			errorMess = "Success!";
+			returnedVal = true;
+			break;
+
+		case OCI_SUCCESS_WITH_INFO:
+			errorMess = "Success with information!";
+			returnedVal = true;
+			break;
+
+		case OCI_NEED_DATA:
+			errorMess = "Need data!";
+			break;
+		
+		case OCI_NO_DATA:
+			errorMess = "No data!";
+			break;
+
+		//An invalid handle was passed as a parameter or a user callback is passed an
+		//invalid handle or invalid context. No further diagnostics are available.
+		case OCI_INVALID_HANDLE:
+			errorMess = "Invalid handle!";
+			break;
+
+		case OCI_STILL_EXECUTING:
+			errorMess = "Still executing!";
+			break;
+
+		case OCI_CONTINUE:
+			errorMess = "Continue!";
+			break;
+		default:
+			break;
+	}
+
+	return returnedVal;
+}
diff --git a/src/terralib/drivers/OracleSpatial/connect.h b/src/terralib/drivers/OracleSpatial/connect.h
new file mode 100644
index 0000000..14108f9
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/connect.h
@@ -0,0 +1,111 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef CONNECT_H
+#define CONNECT_H
+
+#include <oci.h>
+#include <string>
+
+using namespace std;
+
+//! This class represents a connection to ORACLE database.
+class OCIConnection
+{
+protected:
+	bool	     connected;		// if it is connected or not
+	string       errorMess;		// error message
+
+public:
+	// OCI connection handles
+	OCIEnv*			envhp;  //environment handle - ambiente       
+	OCIError*		errhp;	//environment handle - error handle
+
+	OCIServer*		srvhp;	//service context handle - identifica uma conexao com o banco
+	OCISvcCtx*		svchp;	//service context handle
+	OCISession*		usrhp;	//service context handle - define as permissoes e privilegios dos usuarios 
+	OCITrans*		txnhp;	//service context handle - transacao
+
+	OCIStmt*		stmthp;		// environment handle - statement handle
+
+	OCIType*		tdo_geometry; 	//describe the sdo_geometry type 
+	OCIType*		tdo_ordinates;  //describe the sdo_ordinates type 
+	OCIArray*		ordinates;		//store the ordinates to insert into database (bind)	
+
+public:
+	
+	//! Connection constructor
+	OCIConnection();
+
+	//! Connection destructor
+	~OCIConnection() { Disconnect(); }
+
+	//! Connect to ORACLE
+	bool Connect(const char* dblink, const char* username, const char* password);
+
+	//! Disconnect to ORACLE
+	void Disconnect();
+
+	//! Prepare the statement to be executed
+	bool Prepare(const string& stmt);
+
+	//! Bind
+	bool BindByPos(int pos, void* value, int size, void* indicator, int type);
+	bool BindByName(char* name, void* value, int size, void* indicator, int type);
+	bool BindOrdinates();
+
+	//! Append ordinates to be inserted or updated
+	bool AppendOrdinates(const double& val);
+
+	//! Locate memory to ordinates 
+	bool AllocateObjectOrdinates();
+
+	//! Return query type 
+	int	QueryType(void);
+
+	//! Starts a transaction 
+	bool TransStart();
+
+	//! Returns a transaction
+	bool TransRollback();
+
+	//! Commits a transaction
+	bool TransCommit();
+	
+	//! Execute only commands that do not return rows (INSERT, UPDATE, DELETE, etc)
+	bool Execute(const string& stm);
+	
+	//! Execute only commands that insert or update rows with SDO Objects 
+	bool ExecuteSDOSTM(const string& stm);
+
+	//! Check if there is an opened conection
+	bool IsConnected() { return connected; }
+
+	//! Check OCI error
+	bool CheckError(OCIError* errhp, int status);
+
+	//! Gets the error message
+	string getErrorMessage() { return errorMess; }
+};
+
+#endif
diff --git a/src/terralib/drivers/OracleSpatial/cursor.cpp b/src/terralib/drivers/OracleSpatial/cursor.cpp
new file mode 100644
index 0000000..fae9b56
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/cursor.cpp
@@ -0,0 +1,1172 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "cursor.h"
+#include "sdo_oci.h"
+#include "TeUtils.h"
+
+
+//Given a string, remove all blanks and tabs (rigth)
+char* StrClean(char *name)
+{
+    int j;
+	
+	if ((name == NULL)) /*SGError.Handler(NULLPOINTER,FATAL);*/ 
+		return 0;
+
+	for (j = strlen(name)-1; j>=0; j--)
+	{
+		if ( !((name[j]==' ') || (name[j]=='\t') || (name[j]== '\0')) ) 
+			break;
+	}
+	
+	name[j+1] = '\0';
+
+	return name;
+}
+
+
+OCICursor::OCICursor(OCIConnection* connec)
+{
+	int i;
+	conn = connec;
+	stmthpToQuery = NULL;
+	dschp = NULL;
+	fieldValue = "";
+	ordinates = 0;
+
+	isOpen_ = false;
+	for(i=0;i<MAX_ROWS;i++)
+	{
+		global_geom_obj[i] = NULL;
+		global_geom_ind[i] = NULL;
+		lobp[i] = NULL; 
+	}
+	
+	row_Index = -1;
+	rows_Fetched = 0;
+	rows_Mem = 0;
+	row_Cur = -1;
+	last_Row = false;
+	errorMessage = "";
+	numColls_ = -1;
+}
+
+bool OCICursor::Open()  
+{
+	
+	sword status;
+	if(isOpen_)
+		this->Close();
+	
+	isOpen_ = false;
+
+	// Initialize statement handle 
+	status = SDO_OCIHandleAlloc((dvoid*)conn->envhp, (dvoid**)&stmthpToQuery, 
+								  (ub4)OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
+	if(!CheckError(status))
+		return false;
+	
+	// describe spatial object types (OCIDescribe)
+	status = SDO_OCIHandleAlloc((dvoid*)conn->envhp, (dvoid**)&dschp, 
+								(ub4)OCI_HTYPE_DESCRIBE, (size_t)0, (dvoid **)0);
+	if(!CheckError(status))
+		return false;
+
+	status = SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp, OCI_TYPECODE_VARRAY, 
+					conn->tdo_ordinates, (dvoid*)NULL, OCI_DURATION_SESSION, TRUE, 
+					(dvoid**)&ordinates);
+
+	if(!CheckError(status))
+		return false;
+
+	isOpen_ = true;
+	return true;
+}
+
+void OCICursor::Close()
+{
+	// Finalize stmthpToQuery and dschp
+	if(isOpen_)
+	{
+		SDO_OCIHandleFree((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT);
+		SDO_OCIHandleFree((dvoid*)dschp, (ub4)OCI_HTYPE_DESCRIBE);
+		FreeResult();
+		isOpen_ = false;
+	}
+	numColls_ = -1;
+	stmthpToQuery = NULL;
+	dschp = NULL;
+}
+
+void OCICursor::FreeResult()
+{	
+	int i;
+	if(global_geom_obj)
+	{
+		for(i=0;i<rows_Mem;i++)  // O que est� em mem�ria ou max rows??????
+		{
+		/// free the spatial object instance 
+			CheckError(OCIObjectFree(conn->envhp, conn->errhp, (dvoid *)global_geom_obj[i], 
+				   (ub2)OCI_OBJECTFREE_FORCE));
+
+			global_geom_obj[i] = NULL;
+			global_geom_ind[i] = NULL;
+		}
+	}
+
+	if (lobp)
+	{
+		for(i=0;i<MAX_ROWS;i++)
+		{
+			CheckError(OCIDescriptorFree((dvoid *) lobp, (ub4) OCI_DTYPE_LOB));
+			lobp[i] = NULL;
+		}
+	}
+
+	OCIObjectFree(conn->envhp, conn->errhp, (dvoid *)ordinates, (ub2)OCI_OBJECTFREE_FORCE);
+	ordinates = 0;
+
+	vector<void *>::iterator itb = buffers.begin();
+	for (itb; itb!=buffers.end(); itb++)
+		delete(*(itb));
+	
+	buffers.clear();
+	defines.clear(); // ver se o freestmtp desaloca os OCIDefines 
+	ind.clear();
+	colType_.clear();
+	colSize_.clear();
+	colScale_.clear();
+	colName_.clear();
+	numColls_ = -1;
+}
+
+
+void OCICursor::DefineByPos(int pos, void* value, int size, void* indicator, 
+						 int type)
+{
+	OCIDefine *defnp = NULL;
+
+	CheckError(SDO_OCIDefineByPos(stmthpToQuery, &defnp, conn->errhp, (ub4)pos, 
+								  (dvoid *)value, (sb4)size, type, 
+								  (dvoid *)indicator, (ub2 *)0, (ub2 *)0,
+								  (ub4)OCI_DEFAULT));
+}
+
+
+bool OCICursor::Fetch(int rows)
+{
+	sword status;
+	status = OCIStmtFetch(stmthpToQuery, conn->errhp, (ub4) rows, (ub4) OCI_FETCH_NEXT,
+                               (ub4) OCI_DEFAULT);
+
+	CheckError(status);
+
+	if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO)
+		return true;
+	else
+		return false;
+
+}
+
+bool OCICursor::AppendOrdinates(const double& val)
+{
+	
+	OCINumber	oci_number;
+	sword       status;
+
+	if(!ordinates)
+	{
+		status = SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp, OCI_TYPECODE_VARRAY, 
+					conn->tdo_ordinates, (dvoid*)NULL, OCI_DURATION_SESSION, TRUE, 
+					(dvoid**)&ordinates);
+
+		if(!CheckError(status))
+			return false;
+	}
+	
+	status = OCINumberFromReal(conn->errhp, (dvoid *)&(val), 
+		(uword)sizeof(double),&oci_number);
+
+	status = OCICollAppend(conn->envhp, conn->errhp, 
+		(dvoid *) &oci_number,
+		(dvoid *)0, (OCIColl *)ordinates);
+
+	if(!CheckError(status))
+		return false;
+
+	return true;
+}
+
+bool OCICursor::BindOrdinates()
+{
+	OCIBind		*bnd1p = NULL;
+	sword		status; 
+
+	if(!ordinates)
+	{
+		status = SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp, OCI_TYPECODE_VARRAY, 
+					conn->tdo_ordinates, (dvoid*)NULL, OCI_DURATION_SESSION, TRUE, 
+					(dvoid**)&ordinates);
+
+		if(!CheckError(status))
+			return false;
+	}
+	
+	/* bind coordinate varray object */
+	status = OCIBindByName(stmthpToQuery, &bnd1p, conn->errhp, 
+	    (text *)":ordinates", (sb4)-1, (dvoid *)0, (sb4)0, SQLT_NTY, (dvoid *)0, 
+		(ub2 *)0, (ub2 *)0, (ub4)0, (ub4 *)0, (ub4)OCI_DEFAULT);
+	if(!CheckError(status))
+		return false;
+
+	status = OCIBindObject(bnd1p, conn->errhp, conn->tdo_ordinates, (dvoid **)&ordinates, (ub4 *)0, 
+	    (dvoid **)0, (ub4 *)0);
+	if(!CheckError(status))
+		return false;
+
+	return true;
+}
+
+bool OCICursor::MoveFirst()
+{
+	// this is for scroolable cursor
+	sword status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4)MAX_ROWS, OCI_FETCH_FIRST, (sb4) 0, OCI_DEFAULT);
+
+	if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO  || status == OCI_NO_DATA)
+	{
+		OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT,
+			     (dvoid *)&rows_Fetched, (ub4 *)0, 
+			     (ub4)OCI_ATTR_ROW_COUNT, conn->errhp);
+
+		if(!rows_Fetched)  
+			return false;
+
+		if(status == OCI_NO_DATA)
+			last_Row = true;
+
+		row_Index = 0;
+
+		if(rows_Fetched < MAX_ROWS)  
+			rows_Mem = rows_Fetched;
+		else
+			rows_Mem = MAX_ROWS;
+
+		row_Cur = 0;
+		return true;
+	}
+
+	return false;
+}
+
+bool OCICursor::MoveNext()
+{
+	sword status;
+	
+	if((row_Index+1) >= rows_Mem) 
+	{
+		if(last_Row)
+			return false;
+		
+		// this is for scroolable cursor
+		status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS, /*OCI_DEFAULT*/ OCI_FETCH_NEXT, (sb4) 0, OCI_DEFAULT);
+
+		if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO || status == OCI_NO_DATA)
+		{
+		
+			OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT,
+					 (dvoid *)&rows_Fetched, (ub4 *)0, 
+					 (ub4)OCI_ATTR_ROWS_FETCHED, conn->errhp);
+
+			if(!rows_Fetched)
+				return false;
+
+			if(status == OCI_NO_DATA)
+			{
+				if(last_Row)
+					return false;
+				else
+					last_Row = true;
+			}
+
+			row_Index = 0;
+
+			if(rows_Fetched < MAX_ROWS)
+				rows_Mem = rows_Fetched;
+			else
+				rows_Mem = MAX_ROWS;
+
+			row_Cur++;
+			return true;
+		}
+		else
+			return false;
+	}
+	else
+		row_Index++;
+
+	row_Cur++;
+	return true;
+}
+
+bool OCICursor::MoveLast()  
+{
+
+	sword status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) 1, 
+                               OCI_FETCH_LAST, (sb4) 0, OCI_DEFAULT);
+	//podemos pegar informacao da ultima linha
+
+	if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO)
+	{
+		last_Row = true;
+		return true;
+	}
+	else
+		return false;
+
+}
+
+bool OCICursor::MoveTo(int pos) //begin in 0
+{
+	
+	sword status;
+	int auxPos = MAX_ROWS*int(pos/MAX_ROWS);
+
+	// row_Cur = absolute current row 
+	// row_Index = relative current row - client side
+	if(int(row_Cur/MAX_ROWS) == int(pos/MAX_ROWS)) 
+	{
+		row_Index = pos - (MAX_ROWS*int(pos/MAX_ROWS));
+		row_Cur = pos;
+		return true;
+	}
+
+	if(pos<row_Cur)
+	{
+		if(!MoveFirst())
+			return false;
+	}
+
+	status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS, OCI_FETCH_ABSOLUTE, (sb4)auxPos+1, OCI_DEFAULT); 
+	row_Index = pos-auxPos;
+	row_Cur = pos;
+
+	CheckError(status);
+
+	if (status == OCI_SUCCESS || status == OCI_SUCCESS_WITH_INFO || status == OCI_NO_DATA)
+	{
+		OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT,
+				 (dvoid *)&rows_Fetched, (ub4 *)0, 
+				 (ub4)OCI_ATTR_ROWS_FETCHED, conn->errhp);
+
+		if(!rows_Fetched)
+			return false;
+		
+		if(status == OCI_NO_DATA)
+			last_Row = true;
+		return true;
+	}
+
+	return false;
+
+	/*  // funciona mas fica lento
+	sword status;
+	// this part is for scroolable cursor
+	if(pos >= 0)
+	{
+		status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS, 
+                      OCI_FETCH_ABSOLUTE, (sb4) pos+1, OCI_DEFAULT);
+	}
+	else
+	{
+		status = OCIStmtFetch2(stmthpToQuery, conn->errhp, (ub4) MAX_ROWS, 
+                      OCI_FETCH_RELATIVE, (sb4) pos+1, OCI_DEFAULT);
+	}
+
+	*/
+}
+
+// Throw CCursorException if OCI error found
+bool OCICursor::CheckError(sword status)
+{
+	sb4 errcode = 0;
+	char message[256];
+	bool returnedVal = false;
+
+	if (status == OCI_ERROR)
+	{
+		SDO_OCIErrorGet((dvoid*)conn->errhp, (ub4)1, (text*)NULL, &errcode, 
+						(text*)message, (ub4)256, OCI_HTYPE_ERROR);
+
+		errorMessage = message;
+		return false;
+	}
+	
+	switch (status)
+	{ 
+		case OCI_SUCCESS:
+			errorMessage = "Success!";
+			returnedVal = true;
+			break;
+
+		case OCI_SUCCESS_WITH_INFO:
+			errorMessage = "Success with information!";
+			returnedVal = true;
+			break;
+
+		case OCI_NEED_DATA:
+			errorMessage = "Need data!";
+			break;
+		
+		case OCI_NO_DATA:
+			errorMessage = "No data!";
+			break;
+
+		//An invalid handle was passed as a parameter or a user callback is passed an
+		//invalid handle or invalid context. No further diagnostics are available.
+		case OCI_INVALID_HANDLE:
+			errorMessage = "Invalid handle!";
+			break;
+
+		case OCI_STILL_EXECUTING:
+			errorMessage = "Still executing!";
+			break;
+
+		case OCI_CONTINUE:
+			errorMessage = "Continue!";
+			break;
+		default:
+			break;
+	}
+
+	return returnedVal;
+
+}
+
+
+bool OCICursor::Prepare(const string& stmt)
+{	
+	ub4 size = stmt.size();
+	sword status = SDO_OCIStmtPrepare(conn->svchp, (OCIStmt *)stmthpToQuery, conn->errhp, (text*)stmt.c_str(), (ub4)size,  
+		(text*)0, (ub4)0, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
+	if(!CheckError(status))
+		return false;
+
+	return true;
+}
+
+
+int OCICursor::QueryType()  
+{	
+	ub2 querytype_;
+		
+	sword status = OCIAttrGet((dvoid *)stmthpToQuery, (ub4)OCI_HTYPE_STMT, (ub2 *)&querytype_,
+	(ub4*)NULL, (ub4)OCI_ATTR_STMT_TYPE, (OCIError *)conn->errhp);
+	if(!CheckError(status))
+		return -1;
+	return (querytype_);
+}
+
+bool OCICursor::Query(const string& query)
+{
+	if (!isOpen_)
+		Open();
+			
+	row_Index = -1;
+	rows_Fetched = 0;
+	rows_Mem = 0;
+	row_Cur = -1;
+	last_Row = false;
+
+	if(!Prepare(query))
+		return false;	
+	
+	// query type equal to 1 = OCI_STMT_SELECT
+	if(QueryType()!=1) 
+		return false;
+		
+	//iters equal to zero because the defines (OCIDefines) have not located yet 
+	sword status = OCIStmtExecute(conn->svchp, stmthpToQuery, conn->errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, 
+								  (OCISnapshot *)NULL, OCI_STMT_SCROLLABLE_READONLY);
+	if (!CheckError(status))
+		return false;
+
+	loadCollDescription(); // load columns description
+	if(!AllocateCursor())
+		return false;
+	
+	return true; 
+}
+
+
+bool OCICursor::QuerySDO(const string& query)
+{
+	if (!isOpen_)
+		Open();
+
+	row_Index = -1;
+	rows_Fetched = 0;
+	rows_Mem = 0;
+	row_Cur = -1;
+	last_Row = false;
+
+	if(!Prepare(query))
+		return false;
+
+	if(!BindOrdinates())
+		return false;	
+
+	// query type equal to 1 = OCI_STMT_SELECT
+	if (QueryType() != 1) //must be executed by OCIConnection->execute()
+		return false;
+		
+	//iters equal to zero because the defines (OCIDefines) have not located yet 
+	sword status = OCIStmtExecute(conn->svchp, stmthpToQuery, conn->errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, 
+								  (OCISnapshot *)NULL, OCI_STMT_SCROLLABLE_READONLY);
+	
+	if (!CheckError(status))
+		return false;
+	
+	loadCollDescription(); // load columns description
+	if(!AllocateCursor())
+		return false;
+
+	return true; 
+}
+
+
+int OCICursor::NumCol()  
+{	
+	if(numColls_>=0)
+		return numColls_;
+	
+	int numcols_;
+
+	/* Get the number of columns in the query */
+	CheckError(OCIAttrGet(stmthpToQuery, OCI_HTYPE_STMT, &numcols_,
+	0, OCI_ATTR_PARAM_COUNT, conn->errhp));
+	return (numcols_);
+}
+
+
+int OCICursor::NumRows()
+{
+	int numrows_ = 0;
+	
+	/* Get the number of rows in the query */
+	CheckError(SDO_OCIAttrGet((dvoid*)stmthpToQuery, (ub4)OCI_HTYPE_STMT, (dvoid*)&numrows_,
+	(ub4*)0, (ub4)OCI_ATTR_ROW_COUNT, (OCIError*)conn->errhp));
+	return (numrows_);
+
+}
+
+
+void OCICursor::loadCollDescription() 
+{
+	OCIParam* colhd=NULL;
+	//int		dtype;
+	ub2	dtype = 0;
+	string	colname;
+	//int		colsize;
+	ub2  colsize = (ub2) 0;
+	//int		colscale;
+	sb1  colscale = (sb1) 0;
+	
+	numColls_ = NumCol();
+
+	int i;
+	for(i=1; i<=numColls_; ++i)
+	{
+
+		// get parameter for i-th column
+		CheckError(SDO_OCIParamGet((dvoid*)stmthpToQuery, (ub4)OCI_HTYPE_STMT, (OCIError *)conn->errhp, (dvoid**)&colhd, (ub4)i));
+
+		// get data type 
+		CheckError(SDO_OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid *)&dtype, (ub4*)0, (ub4)OCI_ATTR_DATA_TYPE, (OCIError *)conn->errhp));
+
+		// get coll name 
+		text *colname_ = NULL;
+		ub4	colnamesz_;
+				
+		CheckError(OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid **)&colname_, (ub4*)&colnamesz_, (ub4)OCI_ATTR_NAME, (OCIError *)conn->errhp ));
+
+		char temp[100];
+		for(i=0;i<(int)colnamesz_;i++)
+			temp[i] = colname_[i];
+		temp[colnamesz_] = '\0';
+		colname = temp;
+
+		// retrieve the column size attribute
+		CheckError(SDO_OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid *)&colsize, (ub4*)0, (ub4)OCI_ATTR_DATA_SIZE, (OCIError *)conn->errhp ));
+
+		// retrieve the column scale attribute
+		CheckError(SDO_OCIAttrGet((dvoid *)colhd, (ub4)OCI_DTYPE_PARAM, (dvoid *)&colscale, (ub4*)0, (ub4)OCI_ATTR_SCALE, (OCIError *)conn->errhp ));
+
+		colName_.push_back(colname);
+		colType_.push_back((int)dtype);
+		colSize_.push_back((int)colsize);
+		colScale_.push_back((int)colscale);
+	}
+}
+
+
+int OCICursor::ColType (int colnumber)   
+{
+	//first coll number is 1
+	if((colnumber==0) || (colnumber>(int)colType_.size()))
+		return 0;
+
+	return colType_[colnumber-1];
+}
+
+
+string OCICursor::ColName (int colnumber) 
+{	
+	//first coll number is 1
+	if((colnumber==0) || (colnumber>(int)colName_.size()))
+		return "";
+
+	return colName_[colnumber-1];
+}
+
+
+int OCICursor::ColSize (int colnumber) 
+{
+	//first coll number is 1
+	if((colnumber==0) || (colnumber>(int)colSize_.size()))
+		return 0;
+
+	return colSize_[colnumber-1];
+}
+
+
+int OCICursor::ColScale (int colnumber) 
+{
+	//first coll number is 1
+	if((colnumber==0) || (colnumber>(int)colScale_.size()))
+		return 0;
+
+	return colScale_[colnumber-1];
+}
+
+
+ bool OCICursor::AllocateCursor()
+ {
+	
+	int			size;
+	int			coltype=0;
+	int			colsize=0;
+	int			colscale=0;
+		
+	try
+	{
+		ind.resize(numColls_);
+
+		for(int nc=0; nc<numColls_; ++nc)
+		{
+			defines.push_back (0);
+			buffers.push_back (0);
+		}
+
+		for(int i=1; i<=numColls_;i++)
+		{
+			coltype = colType_[i-1];
+			colsize = colSize_[i-1];
+			colscale = colScale_[i-1];
+
+			switch (coltype)
+			{
+				case 3: //INTEGER
+			
+					buffers[i-1] = new signed int[MAX_ROWS];
+					colsize = sizeof(signed int);
+
+					if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i, 
+							(dvoid *)(signed int*)buffers[i-1], (sb4)colsize, coltype, 
+							(dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+							return false; 
+
+					break;
+
+			
+				case 2: //NUMBER
+										
+					buffers[i-1] = (OCINumber *) new OCINumber[MAX_ROWS]; //();								
+					if(!CheckError(OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i, 
+							(dvoid *)buffers[i-1], sizeof(OCINumber), SQLT_VNU, 
+							(dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+							return false; 
+			
+					break;
+							
+
+				case 4: //FLOAT DOUBLE
+					
+					buffers[i-1] = new double[MAX_ROWS];
+					colsize = sizeof(double);
+					coltype = 4;
+				
+					if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i, 
+							(dvoid *)(double*)buffers[i-1], (sb4)colsize, coltype, 
+							(dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT)))
+							return false; 
+				
+				
+					break;
+
+				case 96: //CHAR
+				case 9: //VARCHAR:
+				case 1: //VARCHAR2:	
+					buffers[i-1] = (char *) new char[MAX_ROWS*(colsize+1)];
+			
+					if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i, 
+							(dvoid *)buffers[i-1], (sb4)(colsize+1), SQLT_STR, 
+							(dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+							return false; 
+				
+					break;
+
+				case 12: //Date
+					buffers[i-1] = (OCIDate *) new OCIDate[MAX_ROWS]; //();								
+					if(!CheckError(OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i, 
+							(dvoid *)buffers[i-1], sizeof(OCIDate), SQLT_ODT, 
+							(dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0,(ub4)OCI_DEFAULT)))
+							return false; 
+				
+					break;
+
+
+				case 108: //OBJECT SDO_GEOMETRY
+				
+					if(!CheckError(SDO_OCIObjectNew(conn->envhp, conn->errhp, conn->svchp,
+							OCI_TYPECODE_OBJECT, conn->tdo_geometry, (dvoid*)NULL, 
+							OCI_DURATION_SESSION, TRUE, 
+							(dvoid**)global_geom_obj)))
+							return false;
+					
+					defines[i-1] = NULL;
+								
+					if(!CheckError(SDO_OCIDefineByPos(stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i, 
+							(dvoid *)0, (sb4)0, SQLT_NTY, (dvoid *)&ind[i-1],
+							(ub2 *)0, (ub2 *)0, (ub4)OCI_DEFAULT)))
+							return false;
+					
+					if(!CheckError(OCIDefineObject(defines[i-1], conn->errhp, conn->tdo_geometry, 
+							(dvoid **)global_geom_obj, (ub4 *)0, 
+							(dvoid **)global_geom_ind, (ub4 *)0)))
+							return false;
+
+					break;
+
+				case 113 :	//SQLT_BLOB
+
+					//  Allocate lob descriptors.
+					for(size=0;size<MAX_ROWS;size++)
+					{
+						if(!CheckError(OCIDescriptorAlloc((dvoid *) conn->envhp, (dvoid **) &lobp[size],
+							(ub4) OCI_DTYPE_LOB,
+							(size_t) 0, (dvoid **) 0)))
+							return false;
+					}
+					if(!CheckError(OCIDefineByPos (stmthpToQuery, &(defines[i-1]), conn->errhp, (ub4)i,
+							(dvoid *)lobp, 0 , SQLT_BLOB,
+							(dvoid *)&ind[i-1], (ub2 *)0, (ub2 *)0, OCI_DEFAULT)))
+							
+							return false;
+					break;
+
+				default:
+					break;
+			
+			} //switch
+	
+		} //for
+	}//try
+
+	catch(...) 
+	{
+		return false;
+	}
+
+	return true;
+}	
+
+char* OCICursor::GetFieldValue(int i)  //inicia em 1
+{ 
+	
+	int				tempInt;
+	double			tempDouble;
+	char			str[30];
+	unsigned int	size; 
+	string			tempDate;
+		
+	if(i < 1)
+		return (char*)0;
+
+	int coltype = colType_[i-1]; 
+	int colsize = colSize_[i-1]; 
+	
+	//OBS:	When the SQL use grouping functions (MAX, MIN, etc), the returned value always has
+	//		colscale equal to zero, even when it is double
+//	int colscale = colScale_[i-1]; 
+
+	int indica = ind[i-1].sbind[row_Index];
+
+	switch (coltype)
+		{
+			case 3: //INTEGER
+
+				if(indica == -1)
+					return "0";
+
+				tempInt = *((int*)buffers[i-1]+row_Index);
+				fieldValue = Te2String(tempInt);
+				return ((char*)fieldValue.c_str());
+				break;
+
+			case 2: //NUMBER
+				
+				if(indica == -1)
+					return "0";
+				
+				if(!CheckError(OCINumberToReal(conn->errhp, ((OCINumber *)buffers[i-1]+row_Index), 
+					(uword)sizeof(double), (dvoid *)&tempDouble)))
+					return "0";
+				
+				fieldValue = Te2String(tempDouble);
+				return ((char*)fieldValue.c_str());
+				break;
+				
+
+			case 4: //FLOAT DOUBLE
+					
+				if(indica == -1)
+					return "0";
+				
+				tempDouble = *((const double*)buffers[i-1]+row_Index);
+				fieldValue = Te2String(tempDouble);
+				return ((char*)fieldValue.c_str());
+				break;
+
+			case 96: //CHAR
+			case 9: //VARCHAR:
+			case 1: //VARCHAR2:
+				
+				if(indica == -1)
+					return "";
+
+				fieldValue = ((char*)buffers[i-1]+((colsize+1)*row_Index));
+				fieldValue = StrClean((char*)fieldValue.c_str());
+				return ((char*)fieldValue.c_str());
+				break;
+
+			case 12: //Date
+				
+				if(indica == -1)
+					return "";
+
+				fieldValue = "";
+				size = sizeof(OCIDate);
+																	
+				if(!CheckError(OCIDateToText(conn->errhp, ((OCIDate *)buffers[i-1]+row_Index), 
+					NULL, 0, NULL, 0, &size, (unsigned char*)tempDate.c_str())))
+					return "";
+				memcpy(str, tempDate.c_str(), size);
+				strncat((char*)fieldValue.c_str(), str, size);
+
+				return ((char*)fieldValue.c_str());
+				break;
+
+			case 108: //OBJECT SDO_GEOMETRY
+			default:
+				break;
+								
+		} //switch
+		
+	return (char*)0;
+}
+
+int OCICursor::GetDimArraySize()
+{
+	int ndim=-1;
+
+	// Get the size of the elem info array
+    CheckError(OCICollSize(conn->envhp, conn->errhp, 
+				(OCIColl *)(global_geom_obj[row_Index]->sdo_elem_info), 
+				&ndim));
+
+	return(ndim);
+}
+
+bool OCICursor::GetDimElement(int i,int &elem)
+{
+	int				exists;
+	OCINumber		*oci_number;
+	double			el;
+
+
+	OCICollGetElem(conn->envhp, conn->errhp, 
+	   (OCIColl *)(global_geom_obj[row_Index]->sdo_elem_info), 
+	   (sb4)i-1, (int *)&exists, 
+	   (dvoid **)&oci_number, (dvoid **)0);
+
+	OCINumberToReal(conn->errhp, oci_number, (uword)sizeof(double),
+		(dvoid *)&el);
+	
+	elem = (int)el;
+	return true;
+}
+
+
+int OCICursor::GetNumberOrdinates()
+{
+	int nOrds=-1;
+
+	/* Get the size of the ordinates array */
+    CheckError(OCICollSize(conn->envhp, conn->errhp, 
+				(OCIColl *)(global_geom_obj[row_Index]->sdo_ordinates), 
+				&nOrds));
+
+	return(nOrds);
+}
+
+bool OCICursor::GetCoordinates(int i, TeCoord2D& coord)
+{
+	int				exists;
+	OCINumber		*oci_number;
+	double			coor_x;
+	double			coor_y;
+
+	int pos = i;
+
+	OCICollGetElem(conn->envhp, conn->errhp, 
+	   (OCIColl *)(global_geom_obj[row_Index]->sdo_ordinates), 
+	   (sb4)(pos-1), (int *)&exists, 
+	   (dvoid **)&oci_number, (dvoid **)0);
+
+	OCINumberToReal(conn->errhp, oci_number, (uword)sizeof(double),
+		(dvoid *)&coor_x);
+	
+	pos++;
+
+	OCICollGetElem(conn->envhp, conn->errhp, 
+	   (OCIColl *)(global_geom_obj[row_Index]->sdo_ordinates),  
+	   (sb4)(pos-1), (int *)&exists, 
+	   (dvoid **)&oci_number, (dvoid **)0);
+
+	OCINumberToReal(conn->errhp, oci_number, (uword)sizeof(double),
+		(dvoid *)&coor_y);
+
+	coord.x(coor_x);
+	coord.y(coor_y);
+
+	return true;
+}
+
+
+bool OCICursor::GetCoordinates(vector<TeCoord2D>& result)
+{
+	
+	OCIIter		*iterator;
+	dvoid		*elem;
+	OCIInd		*elemind ;
+	double		ordinate1, ordinate2; 
+	OCINumber	*aux1;
+	OCINumber	*aux2;
+	boolean		eoc;
+
+	sword status = OCIIterCreate(conn->envhp, conn->errhp, 
+		(OCIArray *)(global_geom_obj[row_Index]->sdo_ordinates), &iterator);
+	if (status != OCI_SUCCESS)
+		return false;
+	
+	/* Get the first and second element of the clients varray */
+	status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+		(dvoid **) &elemind, &eoc);
+	if (status != OCI_SUCCESS)
+	{
+		OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+		return false;
+	}
+
+	aux1 = (OCINumber *)elem;
+	OCINumberToReal(conn->errhp, (OCINumber *)aux1, (uword)sizeof(double),
+					(dvoid *)&ordinate1);
+
+	status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+				(dvoid **)&elemind, &eoc);
+	if (status != OCI_SUCCESS)
+	{
+		OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+		return false;
+	}
+
+	aux2 = (OCINumber *)elem;
+	OCINumberToReal(conn->errhp, (OCINumber *) aux2, (uword)sizeof(double),
+					(dvoid *)&ordinate2);
+
+	TeCoord2D coord(ordinate1, ordinate2);
+	result.push_back (coord);
+	
+	while (!eoc && (status == OCI_SUCCESS))
+	{
+		status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+				(dvoid **)&elemind, &eoc);
+		if (status != OCI_SUCCESS)
+		{
+			OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+			return false;
+		}
+
+		aux1 = (OCINumber *)elem;
+		OCINumberToReal(conn->errhp, (OCINumber *)aux1, (uword)sizeof(double),
+					(dvoid *)&ordinate1);
+
+		status = OCIIterNext(conn->envhp, conn->errhp, iterator, &elem,
+				(dvoid **)&elemind, &eoc);
+		if (status != OCI_SUCCESS)
+		{
+			OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+			return false;
+		}
+
+		aux2 = (OCINumber *)elem;
+		OCINumberToReal(conn->errhp, (OCINumber *) aux2, (uword)sizeof(double),
+					(dvoid *)&ordinate2);
+
+		TeCoord2D coord(ordinate1, ordinate2);
+		result.push_back (coord);
+	}
+
+	/* destroy the iterator */
+	status = OCIIterDelete(conn->envhp, conn->errhp, &iterator);
+	return true;
+}
+
+
+int
+OCICursor::GetGeometryType()
+{
+	int gtype=-1;
+
+	CheckError(OCINumberToInt(conn->errhp, &(global_geom_obj[row_Index]->sdo_gtype),
+				 (uword)sizeof(int), OCI_NUMBER_SIGNED,
+				 (dvoid *)&gtype));
+
+	return gtype;
+}
+
+int
+OCICursor::GetSpatialReferenceId()
+{
+	int srid=-1;
+
+	CheckError(OCINumberToInt(conn->errhp, &(global_geom_obj[row_Index]->sdo_srid),
+				 (uword)sizeof(int), OCI_NUMBER_SIGNED,
+				 (dvoid *)&srid));
+
+	return srid;
+}
+
+bool
+OCICursor::GetXYZcoord(double& x, double& y)
+{
+	if (global_geom_ind[row_Index]->sdo_point._atomic == OCI_IND_NOTNULL)
+	{
+		if (global_geom_ind[row_Index]->sdo_point.x == OCI_IND_NOTNULL)
+		{
+			if(!CheckError(OCINumberToReal(conn->errhp, &(global_geom_obj[row_Index]->sdo_point.x), 
+										 (uword)sizeof(double),(dvoid *)&x)))
+
+				return false;
+		}
+
+		if (global_geom_ind[row_Index]->sdo_point.y == OCI_IND_NOTNULL)
+		{
+			if(!CheckError(OCINumberToReal(conn->errhp, &(global_geom_obj[row_Index]->sdo_point.y), 
+										 (uword)sizeof(double),(dvoid *)&y)))
+				return false;
+		}
+
+		/*
+		if (z && (global_geom_ind[row_Index]->sdo_point.z == OCI_IND_NOTNULL))
+		{
+			if(!CheckError(OCINumberToReal(conn->errhp, &(global_geom_obj[row_Index]->sdo_point.z), 
+										 (uword)sizeof(double),(dvoid *)&z)))
+				return false;
+		}*/
+
+		return true;
+	}
+	else
+		return false;
+}
+
+
+bool
+OCICursor::WriteBlob(const unsigned char* buffer, unsigned int bufsize)
+{
+	
+	int		offset = 1;
+	sword	status;
+	
+	status = SDO_OCILobWrite(conn->svchp, conn->errhp, *lobp, &bufsize, offset,
+        (dvoid *) buffer, (ub4) bufsize, OCI_ONE_PIECE,
+        (dvoid *)0, (sb4 (*)(dvoid *, dvoid *, ub4 *, ub1 *)) 0,
+		(ub2) 0, (ub1) SQLCS_IMPLICIT);
+	
+	CheckError(status);
+	if (status == OCI_SUCCESS)
+		return true;
+
+	return false;
+}
+
+int 
+OCICursor::SizeBlob()
+{
+	ub4 lenp=0;
+	CheckError(OCILobGetLength(conn->svchp, conn->errhp, lobp[row_Index], &lenp));
+	return lenp;
+}
+
+
+bool
+OCICursor::ReadBlob(unsigned char* buffer, unsigned int bufsize)
+{
+	sword	status;
+	int		offset = 1;
+			
+	status = SDO_OCILobRead(conn->svchp, conn->errhp, lobp[row_Index], &bufsize, offset,
+              (dvoid *) buffer, (ub4)bufsize , (dvoid *) 0, 0, (ub2) 0, 
+			   (ub1) SQLCS_IMPLICIT);
+    
+	if (status == OCI_SUCCESS )
+      return true;
+
+	return false;
+}
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/cursor.h b/src/terralib/drivers/OracleSpatial/cursor.h
new file mode 100644
index 0000000..f7e3864
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/cursor.h
@@ -0,0 +1,225 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef OCICursor_H
+#define OCICursor_H
+
+#include <connect.h>
+#include <vector>
+#include <TeCoord2D.h>
+
+using namespace std;
+
+// Object SDO_GEOMETRY - Oracle Spatial
+#define TYPE_OWNER				"MDSYS"
+#define SDO_ORDINATE_ARRAY      TYPE_OWNER".SDO_ORDINATE_ARRAY"
+#define SDO_ELEM_INFO_ARRAY     TYPE_OWNER".SDO_ELEM_INFO_ARRAY"
+#define SDO_GEOMETRY			TYPE_OWNER".SDO_GEOMETRY"
+
+#define MAX_ROWS				500	// number of lines to be fetched into memory
+
+// type point in Oracle Spatial
+struct sdo_point_type
+{
+   OCINumber x;
+   OCINumber y;
+   OCINumber z;
+};
+
+typedef struct sdo_point_type sdo_point_type;
+
+//type geometry in oracle spatial
+struct sdo_geometry
+{
+   OCINumber       sdo_gtype;
+   OCINumber       sdo_srid;
+   sdo_point_type  sdo_point;
+   OCIArray        *sdo_elem_info;
+   OCIArray        *sdo_ordinates;
+};
+
+typedef struct sdo_geometry SDO_GEOMETRY_TYPE;
+
+
+//Indicator structures for SDO_GEOMETRY_TYPE
+struct sdo_point_type_ind
+{
+   OCIInd _atomic;
+   OCIInd x;
+   OCIInd y;
+   OCIInd z;
+};
+
+typedef struct sdo_point_type_ind sdo_point_type_ind;
+
+struct SDO_GEOMETRY_ind
+{
+   OCIInd                    _atomic;
+   OCIInd                    sdo_gtype;
+   OCIInd                    sdo_srid;
+   struct sdo_point_type_ind sdo_point;
+   OCIInd                    sdo_elem_info;
+   OCIInd                    sdo_ordinates;
+};
+
+typedef struct SDO_GEOMETRY_ind SDO_GEOMETRY_ind;
+
+struct sb2ind
+{
+	sb2		sbind[MAX_ROWS];
+};
+typedef struct sb2ind	indarray;
+
+
+//! Oracle generic Cursor class 
+
+class OCICursor
+{
+protected:
+	OCIConnection*		conn;			// pointer to connection, environment, etc
+	OCIStmt*			stmthpToQuery;  // OCI statement handle to query
+	OCIDescribe*		dschp;			//environment describe handle - contem informacoes sobre esquemas de objetos
+	bool				isOpen_;		// if the cursor is open or not (if the stmthpToQuery was allocated)
+	string				errorMessage;
+			
+	
+	//-------- buffers to store data in memory - client side
+	vector<void *>			buffers;	// buffer to store simple data type (varchar, number, date, etc)
+	vector <indarray>		ind;		// buffer to store null indicator
+				
+	SDO_GEOMETRY_TYPE*		global_geom_obj[MAX_ROWS];	// buffer to store spatial object  
+	SDO_GEOMETRY_ind*		global_geom_ind[MAX_ROWS];	// buffer to store spatial object indicator  
+
+	OCILobLocator*			lobp[MAX_ROWS];				// buffer to store blob
+	
+	vector<OCIDefine *>		defines;	// OCIDefine to link buffers in client side and the statement handle
+
+	string					fieldValue;
+
+	OCIArray*				ordinates;		//store the ordinates to be used in a query (bind)
+
+	//-------- information to handle the cursor
+	short				row_Index;		// relative current row index in the memory buffer
+	int					row_Cur;		// absolute current cursor row
+	int					rows_Fetched;	// rows fetched from database
+	int					rows_Mem;		// rows on memory buffer - client side
+	bool				last_Row;		// if is last row
+	
+
+	//-------- information about columns of the cursor
+	int					numColls_;  // number of columns
+	vector<string>		colName_;	// name of columns
+	vector<int>			colType_;	// type of columns
+	vector<int>			colSize_;	// size of columns
+	vector<int>			colScale_;  // sclae of columns
+
+public:
+	
+	//! Cursor constructor
+	OCICursor(OCIConnection* conn);
+
+	//! Cursor destructor
+	~OCICursor() { Close(); }
+
+	//! Open the Cursor
+	bool		Open();
+
+	
+	//! return the error message 
+	string			getErrorMessage() { return errorMessage;}
+	//! Check if the cursor is open
+	bool			isOpen()	{ return isOpen_; }
+	OCIConnection*	Conn()		{ return conn; }
+	//! Return the current row 
+	int				CurrentRow() { return row_Cur; }
+
+
+	//! Close the Cursor
+	void			Close();
+	
+	//! Define
+	void		DefineByPos(int pos, void* value, int size, void* indicator, int type);
+
+	//! Execute and Fetch
+	bool		Execute();
+	bool		Fetch(int rows);
+
+	bool		Query(const string& query);
+	bool		QuerySDO(const string& query);
+
+	//! Move operations
+	bool		MoveFirst();
+	bool		MoveNext();
+	bool		MoveTo(int pos);
+	bool		MoveLast();
+	
+	//! Return the columns number 
+	int			NumCol(void);
+
+	//! Return the rows number 
+	int			NumRows(void);
+	
+	//! Load all column descriptions (name, type, size and scale)
+	void		loadCollDescription (); 
+	
+	//! Return the column type (SQLT)
+	int			ColType (int colnumber);
+
+	//! Return the column name 
+	string		ColName (int colnumber);
+
+	//! Return the column size 
+	int			ColSize (int colnumber);
+
+	//! Return the column scale (number of digits after decimal point) 
+	int			ColScale (int colnumber);
+
+	bool		AppendOrdinates(const double& val);
+	bool		BindOrdinates();
+	
+	bool		Prepare(const string& stmt);
+	int			QueryType(); 
+
+	bool		AllocateCursor(void);
+	char*		GetFieldValue(int i);
+	int			GetDimArraySize();
+	bool		GetDimElement(int i,int &elem);
+	int			GetNumberOrdinates(void);
+	bool		GetCoordinates(int i,TeCoord2D& coord);
+	bool		GetCoordinates(vector<TeCoord2D>& result);
+	int			GetGeometryType();
+	int			GetSpatialReferenceId();
+	bool		GetXYZcoord (double& x, double& y);
+	void		FreeResult(void);
+
+	bool		WriteBlob(const unsigned char* buffer, unsigned int bufsize);
+	int			SizeBlob();
+	bool		ReadBlob(unsigned char* buffer, unsigned int bufsize);
+
+protected:
+	// Throws exception if error found
+	bool		CheckError(sword status);
+};
+
+#endif // OCICursor_H
+
diff --git a/src/terralib/drivers/OracleSpatial/ociap.h b/src/terralib/drivers/OracleSpatial/ociap.h
new file mode 100644
index 0000000..56ff182
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/ociap.h
@@ -0,0 +1,10097 @@
+/*
+ * $Header: /home/terralib/src/terralib/drivers/OracleSpatial/ociap.h,v 1.2 2002/12/13 13:35:48 karine Exp $
+ */
+
+/* Copyright (c) 1996, 2002, Oracle Corporation.  All rights reserved.  */
+ 
+/* NOTE:  See 'header_template.doc' in the 'doc' dve under the 'forms' 
+      directory for the header file template that includes instructions. 
+*/
+ 
+/* 
+   NAME 
+     ociap.h - Oracle Call Interface - Ansi Prototypes
+
+   DESCRIPTION 
+     <short description of component this file declares/defines> 
+
+   RELATED DOCUMENTS 
+ 
+   INSPECTION STATUS 
+     Inspection date: 
+     Inspection status: 
+     Estimated increasing cost defects per page: 
+     Rule sets: 
+ 
+   ACCEPTANCE REVIEW STATUS 
+     Review date: 
+     Review status: 
+     Reviewers: 
+ 
+   PUBLIC FUNCTION(S) 
+     <list of external functions declared/defined - with one-line descriptions>
+
+   PRIVATE FUNCTION(S)
+     <list of static functions defined in .c file - with one-line descriptions>
+
+   EXAMPLES
+
+   NOTES
+     <other useful comments, qualifications, etc.>
+
+   MODIFIED   (MM/DD/YY)
+   sichandr    02/12/02 - fix OCIXMLTypeExists
+   gayyappa    02/01/02 - fix 2210776 : change Dom to DOM 
+   sichandr    10/24/01 - OCISvcCtx for XMLType create routines
+   schandir    09/14/01 - Add prototypes for Stmt Caching
+   abande      09/04/01 - Add Prototypes for Session Pooling Methods
+   stakeda     09/12/01 - add OCINlsCharSetConvert
+   whe         08/28/01 - add OCIEnvNlsCreate
+   wzhang      08/22/01 - Add OCINlsCharSetNameToId.
+   whe         10/05/01 - add prototype for OCIXMLType functions
+   mdmehta     04/06/01 - Bug 1683763, OCIDateTimeToText: buf_size to ub4*
+   schandir    12/12/00 - modify the ociconnectionpoolcreate() interface.
+   porangas    12/04/00 - Forward merge bug#974710 to 9i
+   rpingte     11/29/00 - Fix bug# 1485795.
+   gtarora     11/30/00 - fix comment for OCILobIsTemporary
+   akatti      11/07/00 - [1198379]:add OCIRowidToChar
+   bpalaval    10/15/00 - Forward merge 892654.
+   kmohan      09/18/00 - add OCILogon2
+   etucker     07/28/00 - add OCIIntervalFromTZ
+   vjayaram    07/18/00 - add connection pooling changes
+   etucker     07/13/00 - add dls apis for oci
+   hmasaki     07/05/00 - fix 1230846: forward merge into 8.2
+   mbastawa    06/05/00 - add OCIStmtFetch2
+   rxgovind    06/07/00 - update OCIAnyData interfaces
+   rxgovind    05/04/00 - add OCIAnyDataSet interfaces
+   rkasamse    05/01/00 - remove attrno from OCIAnyDataAttrGet
+   rkasamse    03/13/00 - add prototype s for OCCIAnyData
+   slari       09/01/99 - remove OCIEnvCallback
+   slari       08/23/99 - add OCIUcb in user callback functions
+   dsaha       07/07/99 - Add OCIFEnvCreate for forms
+   vyanaman    06/21/99 - Change OCI DateTime/Interval APIs.
+   esoyleme    07/01/99 - expose MTS performance enhancements                  
+   whe         06/14/99 - bug727872:add CONST to match definitions
+   kkarun      02/23/99 - Fix OCIDateTime APIs
+   jiyang      12/07/98 - Add comments for OCI_NLS_DUAL_CURRENCY
+   aroy        12/01/98 - add OCIEnvCreate
+   slari       11/23/98 - use ORASTDARG
+   slari       11/21/98 - replace ellipsis by arglist in OCIUserCallback
+   thchang     10/20/98 - correct comment on OCILobCreateTemporary
+   slari       09/08/98 - allow envh to receive error info also in CallbackReg/
+   kkarun      09/02/98 - Change const to CONST
+   aroy        08/04/98 - add OCITerminate calls                               
+   nramakri    06/25/98 - remove CONST from some OCIPickler APIs
+   jiyang      06/22/98 - Fix a lint error
+   nmallava    06/08/98 - ociistemporary -> envhp
+   jhasenbe    05/27/98 - Remove definitions for U-Calls (Unicode)
+   nmallava    05/18/98 - add comments
+   sgollapu    05/19/98 - Change text to OraText
+   aroy        04/20/98 - merge forward 8.0.5 -> 8.1.3
+   nbhatt      05/14/98 -  aq listen call
+   lchidamb    03/02/98 - Client Notification prototypes
+   vyanaman    04/19/98 - System Timestamp
+   kkarun      04/17/98 - Add more Interval functions
+   vyanaman    04/17/98 - Fix min (proc error)
+   vyanaman    04/16/98 - Add get/set TZ
+   kkarun      04/13/98 - Add Datetime prototypes
+   rkasamse    04/13/98 - change OCIEnv* to dvoid* for context/memory cart serv
+   rkasamse    04/15/98 - chage pickler cart interface
+   slari       03/20/98 - change proto of OCIUserCallback
+   slari       02/17/98 - add OCIUserCallback
+   jiyang      04/02/98 - Accept both env and user handles for NLS
+   rkasamse    03/20/98 - remove prototypes for OCIMemoryDuration* functions.
+   tsaulys     03/20/98 - use environment or session handle
+   nmallava    04/09/98 - OCILobLocatorAssign
+   nmallava    04/07/98 - lobgetchunksize and writeappend apis
+   jhasenbe    04/06/98 - Add new interfaces for Unicode support
+   nmallava    03/17/98 - add interfaces
+   nmallava    03/16/98 - add open/close apis
+   nmallava    03/10/98 - add temporary lobs apis
+   sgollapu    07/10/97 - Add OCIReset
+   sgollapu    02/09/98 - OCI non-blocking
+   nramakri    01/16/98 - remove #ifdef NEVER clause for OCIExtract
+   rmurthy     01/08/98 - OCIContextGenerateKey: change ub1 to ub4
+   ewaugh      12/18/97 - Turn type wrappers into functions.
+   skabraha    12/02/97 - adding OCIFile functions
+   rhwu        12/02/97 - add OCI Thread
+   nramakri    12/15/97 - move to core4
+   nramakri    12/11/97 - modify OCIExtract prototype
+   ewaugh      12/10/97 - add OCIFormat prototypes
+   nmallava    12/17/97 - Add ilob open and close apis
+   rkasamse    12/03/97 - Change some of the function names for pickler cartrid
+   nramakri    11/12/97 - add OCIExtract prototypes
+   rkasamse    11/21/97 - add prototypes for memory cartridge services and cont
+   rkasamse    11/03/97 - Add pickler cartridge interfaces.
+   jiyang      11/11/97 - Add NLS service for cartridge
+   tanguyen    08/19/97 -
+   cxcheng     07/30/97 - replace OCISvcCtx with OCISvcCtx
+   schandra    06/25/97 - AQ OCI interface
+   bnainani    07/21/97 - add prototypes for Oracle XA extensions
+   esoyleme    05/13/97 - move failover callback prototype
+   skmishra    05/06/97 - stdc compiler fixes
+   skmishra    04/24/97 - C++ Compatibility changes
+   skotsovo    04/21/97 - make lob parameter names consistent
+   rwhitman    04/16/97 - Fix LOB prototypes - Olint OCI 8.0.3
+   ramkrish    04/15/97 - Add free flag to OCILobFlushBuffer
+   dchatter    04/10/97 - add nzt.h inclusion
+   cxcheng     04/09/97 - change objnamp from CONST text* to dvoid*
+   cxcheng     04/08/97 - fix prototype of OCIDescribeAny()
+   skotsovo    03/31/97 - remove OCILobLocatorSize
+   skotsovo    03/27/97 - add OCILobLoadFromFile
+   bcchang     02/18/97 - Fix syntax error
+   dchatter    01/13/97 - fix comments on LOB calls
+   aroy        01/10/97 - remove ocilobfilecreate delete
+   sgollapu    12/27/96 - Correct OCILogon prototype
+   dchatter    01/04/97 - comments to describe the functions
+   sgollapu    11/25/96 - Change OCILobFileIsExistent
+   schandra    11/18/96 - Remove xa.h include
+   sgollapu    11/09/96 - Change prototype of OCIDescribeAny
+   dchatter    10/31/96 - delete CONST from lob write cb fn
+   dchatter    10/30/96 - more changes
+   dchatter    10/26/96 - lob/file long name corrections
+   slari       10/16/96 - delete unused calls
+   rwessman    10/29/96 - Fixed OCISecurityGetIdentity prototype
+   bcchang     10/25/96 - Fix syntax error
+   sgollapu    10/22/96 - Add OCILogon and OCILogoff
+   rwessman    10/16/96 - Added cryptographic and digital signature functions
+   sgollapu    10/10/96 - Add ocibdp and ocibdn
+   rxgovind    10/07/96 - add oci file calls
+   skotsovo    10/01/96 - move orl lob fnts to oci
+   skotsovo    09/20/96 - in OCILobGetLength(), remove the 'isnull' parameter.
+   aroy        08/29/96 - change prototype for Nchar Lob support
+   dchatter    08/21/96 - OCIResultSetToStmt prototype change
+   sthakur     08/14/96 - add OCIParamSet
+   schandra    07/26/96 - TX OCI return values - sb4->sword
+   aroy        07/17/96 - terminology change: OCILobLocator => OCILobLocator
+   dchatter    07/01/96 - create ANSI prototypes
+   dchatter    07/01/96 - Creation
+
+*/
+
+ 
+#ifndef OCIAP_ORACLE
+# define OCIAP_ORACLE
+
+# ifndef ORATYPES 
+#  include <oratypes.h> 
+# endif 
+ 
+#ifndef ORASTDARG
+#include <stdarg.h>
+#define ORASTDARG
+#endif
+
+#ifndef OCIDFN
+#include <ocidfn.h>
+#endif
+
+#ifndef NZT_ORACLE
+#include <nzt.h>
+#endif /* NZT_ORACLE */
+ 
+#ifndef OCI_ORACLE
+#include <oci.h>
+#endif
+
+#ifndef ORT_ORACLE
+#include <ort.h>
+#endif
+
+
+
+/*---------------------------------------------------------------------------
+                     PUBLIC TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                     PRIVATE TYPES AND CONSTANTS
+  ---------------------------------------------------------------------------*/
+
+
+/*---------------------------------------------------------------------------
+                           PUBLIC FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+Note: the descriptions of the functions are alphabetically arranged. Please 
+maintain the arrangement when adding a new function description. The actual 
+prototypes are below this comment section and donot follow any alphabetical 
+ordering. 
+
+
+--------------------------------OCIAttrGet------------------------------------
+
+OCIAttrGet()
+Name
+OCI Attribute Get
+Purpose
+This call is used to get a particular attribute of a handle. 
+Syntax
+sword OCIAttrGet ( CONST dvoid    *trgthndlp,
+                 ub4            trghndltyp,
+                 dvoid          *attributep,
+                 ub4            *sizep,
+                 ub4            attrtype,
+                 OCIError       *errhp );
+Comments
+This call is used to get a particular attribute of a handle.
+See Appendix B,  "Handle Attributes",  for a list of handle types and their 
+readable attributes.
+Parameters
+trgthndlp (IN) - is the pointer to a handle type. 
+trghndltyp (IN) - is the handle type. 
+attributep (OUT) - is a pointer to the storage for an attribute value. The 
+attribute value is filled in. 
+sizep (OUT) - is the size of the attribute value. 
+This can be passed in as NULL for most parameters as the size is well known. 
+For text* parameters, a pointer to a ub4 must be passed in to get the length 
+of the string. 
+attrtype (IN) - is the type of attribute.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+OCIAttrSet()
+
+--------------------------------OCIAttrSet------------------------------------
+
+
+OCIAttrSet()
+Name
+OCI Attribute Set
+Purpose
+This call is used to set a particular attribute of a handle or a descriptor. 
+Syntax
+sword OCIAttrSet ( dvoid       *trgthndlp,
+                 ub4         trghndltyp,
+                 dvoid       *attributep,
+                 ub4         size,
+                 ub4         attrtype,
+                 OCIError    *errhp );
+Comments
+This call is used to set a particular attribute of a handle or a descriptor. 
+See Appendix B for a list of handle types and their writeable attributes.
+Parameters
+trghndlp (IN/OUT) - the pointer to a handle type whose attribute gets 
+modified. 
+trghndltyp (IN/OUT) - is the handle type. 
+attributep (IN) - a pointer to an attribute value. 
+The attribute value is copied into the target handle. If the attribute value 
+is a pointer, then only the pointer is copied, not the contents of the pointer.
+size (IN) - is the size of an attribute value. This can be passed in as 0 for 
+most attributes as the size is already known by the OCI library. For text*
+attributes, a ub4 must be passed in set to the length of the string. 
+attrtype (IN) - the type of attribute being set.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIAttrGet()
+
+
+
+--------------------------------OCIBindArrayOfStruct--------------------------
+
+
+
+OCIBindArrayOfStruct()
+Name
+OCI Bind for Array of Structures
+Purpose
+This call sets up the skip parameters for a static array bind.
+Syntax
+sword OCIBindArrayOfStruct ( OCIBind     *bindp,
+                           OCIError    *errhp,
+                           ub4         pvskip, 
+                           ub4         indskip, 
+                           ub4         alskip, 
+                           ub4         rcskip );
+Comments
+This call sets up the skip parameters necessary for a static array bind.
+This call follows a call to OCIBindByName() or OCIBindByPos(). The bind 
+handle returned by that initial bind call is used as a parameter for the 
+OCIBindArrayOfStruct() call.
+For information about skip parameters, see the section "Arrays of Structures" 
+on page 4-16.
+Parameters
+bindp (IN) - the handle to a bind structure. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value. 
+indskip (IN) - skip parameter for the next indicator value or structure. 
+alskip (IN) - skip parameter for the next actual length value. 
+rcskip (IN) - skip parameter for the next column-level return code value. 
+Related Functions
+OCIAttrGet()
+
+
+--------------------------------OCIBindByName---------------------------------
+
+OCIBindByName()
+Name
+OCI Bind by Name
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByName (
+              OCIStmt       *stmtp, 
+              OCIBind       **bindp,
+              OCIError      *errhp,
+              CONST OraText    *placeholder,
+              sb4           placeh_len,
+              dvoid         *valuep,
+              sb4           value_sz,
+              ub2           dty,
+              dvoid         *indp,
+              ub2           *alenp,
+              ub2           *rcodep,
+              ub4           maxarr_len,
+              ub4           *curelep, 
+              ub4           mode ); 
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information for 
+this particular input value. The handle is feed implicitly when the statement 
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+placeholder (IN) - the placeholder attributes are specified by name if ocibindn() 
+is being called.
+placeh_len (IN) - the length of the placeholder name specified in placeholder.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the 
+maximum size of any element possible with the actual sizes being specified in 
+the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than 
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). 
+Ignored for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic(). 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindByPos-----------------------------------
+
+
+OCIBindByPos()
+Name
+OCI Bind by Position
+Purpose
+Creates an association between a program variable and a placeholder in a SQL 
+statement or PL/SQL block.
+Syntax
+sword OCIBindByPos ( 
+              OCIStmt      *stmtp, 
+              OCIBind      **bindp,
+              OCIError     *errhp,
+              ub4          position,
+              dvoid        *valuep,
+              sb4          value_sz,
+              ub2          dty,
+              dvoid        *indp,
+              ub2          *alenp,
+              ub2          *rcodep,
+              ub4          maxarr_len,
+              ub4          *curelep, 
+              ub4          mode);
+
+Description
+This call is used to perform a basic bind operation. The bind creates an 
+association between the address of a program variable and a placeholder in a 
+SQL statement or PL/SQL block. The bind call also specifies the type of data 
+which is being bound, and may also indicate the method by which data will be 
+provided at runtime.
+This function also implicitly allocates the bind handle indicated by the bindp 
+parameter.
+Data in an OCI application can be bound to placeholders statically or 
+dynamically. Binding is static when all the IN bind data and the OUT bind 
+buffers are well-defined just before the execute. Binding is dynamic when the 
+IN bind data and the OUT bind buffers are provided by the application on 
+demand at execute time to the client library. Dynamic binding is indicated by 
+setting the mode parameter of this call to OCI_DATA_AT_EXEC.
+Related Functions: For more information about dynamic binding, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16
+Both OCIBindByName() and OCIBindByPos() take as a parameter a bind handle, 
+which is implicitly allocated by the bind call A separate bind handle is 
+allocated for each placeholder the application is binding.
+Additional bind calls may be required to specify particular attributes 
+necessary when binding certain data types or handling input data in certain 
+ways:
+If arrays of structures are being utilized, OCIBindArrayOfStruct() must 
+be called to set up the necessary skip parameters.
+If data is being provided dynamically at runtime, and the application 
+will be using user-defined callback functions, OCIBindDynamic() must 
+be called to register the callbacks.
+If a named data type is being bound, OCIBindObject() must be called to 
+specify additional necessary information.
+Parameters
+stmth (IN/OUT) - the statement handle to the SQL or PL/SQL statement 
+being processed.
+bindp (IN/OUT) - a pointer to a pointer to a bind handle which is implicitly 
+allocated by this call.  The bind handle  maintains all the bind information for 
+this particular input value. The handle is feed implicitly when the statement 
+handle is deallocated.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+position (IN) - the placeholder attributes are specified by position if ocibindp() 
+is being called.
+valuep (IN/OUT) - a pointer to a data value or an array of data values of the 
+type specified in the dty parameter. An array of data values can be specified 
+for mapping into a PL/SQL table or for providing data for SQL multiple-row 
+operations. When an array of bind values is provided, this is called an array 
+bind in OCI terms. Additional attributes of the array bind (not bind to a 
+column of ARRAY type) are set up in OCIBindArrayOfStruct() call. 
+For a REF, named data type  bind, the valuep parameter is used only for IN 
+bind data. The pointers to OUT buffers are set in the pgvpp parameter 
+initialized by OCIBindObject(). For named data type and REF binds, the bind 
+values are unpickled into the Object Cache. The OCI object navigational calls 
+can then be used to navigate the objects and the refs in the Object Cache.
+If the OCI_DATA_AT_EXEC mode is specified in the mode parameter, valuep 
+is ignored for all data types. OCIBindArrayOfStruct() cannot be used and 
+OCIBindDynamic() must be invoked to provide callback functions if desired. 
+value_sz (IN) - the size of a data value. In the case of an array bind, this is the 
+maximum size of any element possible with the actual sizes being specified in 
+the alenp parameter. 
+If the OCI_DATA_AT_EXEC mode is specified, valuesz defines the maximum 
+size of the data that can be ever provided at runtime for data types other than 
+named data types or REFs. 
+dty (IN) - the data type of the value(s) being bound. Named data types 
+(SQLT_NTY) and REFs (SQLT_REF) are valid only if the application has been 
+initialized in object mode. For named data types, or REFs, additional calls 
+must be made with the bind handle to set up the datatype-specific attributes.
+indp (IN/OUT) - pointer to an indicator variable or array. For scalar data 
+types, this is a pointer to sb2 or an array of sb2s. For named data types, 
+this pointer is ignored and the actual pointer to the indicator structure or 
+an array of indicator structures is initialized by OCIBindObject(). Ignored 
+for dynamic binds.
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+alenp (IN/OUT) - pointer to array of actual lengths of array elements. Each 
+element in alenp is the length of the data in the corresponding element in the 
+bind value array before and after the execute. This parameter is ignored for 
+dynamic binds.
+rcodep (OUT) - pointer to array of column level return codes. This parameter 
+is ignored for dynamic binds.
+maxarr_len (IN) - the maximum possible number of elements of type dty in a 
+PL/SQL binds. This parameter is not required for non-PL/SQL binds. If 
+maxarr_len is non-zero, then either OCIBindDynamic() or 
+OCIBindArrayOfStruct() can be invoked to set up additional bind attributes. 
+curelep(IN/OUT) - a pointer to the actual number of elements. This parameter 
+is only required for PL/SQL binds.
+mode (IN) - the valid modes for this parameter are:
+OCI_DEFAULT. This is default mode.
+OCI_DATA_AT_EXEC. When this mode is selected, the value_sz 
+parameter defines the maximum size of the data that can be ever 
+provided at runtime. The application must be ready to provide the OCI 
+library runtime IN data buffers at any time and any number of times. 
+Runtime data is provided in one of the two ways:
+callbacks using a user-defined function which must be registered 
+with a subsequent call to OCIBindDynamic() . 
+a polling mechanism using calls supplied by the OCI. This mode 
+is assumed if no callbacks are defined.
+For more information about using the OCI_DATA_AT_EXEC mode, see 
+the section "Runtime Data Allocation and Piecewise Operations" on 
+page 5-16.
+When the allocated buffers are not required any more, they should be 
+freed by the client. 
+Related Functions
+OCIBindDynamic(), OCIBindObject(), OCIBindArrayOfStruct(), OCIAttrGet()
+
+
+
+-------------------------------OCIBindDynamic---------------------------------
+
+OCIBindDynamic()
+Name
+OCI Bind Dynamic Attributes
+Purpose
+This call is used to register user callbacks for dynamic data allocation. 
+Syntax
+sword OCIBindDynamic( OCIBind     *bindp,
+                    OCIError    *errhp,
+                    dvoid       *ictxp, 
+                    OCICallbackInBind         (icbfp)(
+                                dvoid            *ictxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                dvoid            **bufpp,
+                                ub4              *alenp,
+                                ub1              *piecep, 
+                                dvoid            **indp ),
+                    dvoid       *octxp,
+                    OCICallbackOutBind         (ocbfp)(
+                                dvoid            *octxp,
+                                OCIBind          *bindp,
+                                ub4              iter, 
+                                ub4              index, 
+                                dvoid            **bufp, 
+                                ub4              **alenpp,
+                                ub1              *piecep,
+                                dvoid            **indpp, 
+                                ub2              **rcodepp)   );
+Comments
+This call is used to register user-defined callback functions for providing 
+data for an UPDATE or INSERT if OCI_DATA_AT_EXEC mode was specified in a 
+previous call to OCIBindByName() or OCIBindByPos(). 
+The callback function pointers must return OCI_CONTINUE if it the call is 
+successful. Any return code other than OCI_CONTINUE signals that the client 
+wishes to abort processing immediately.
+For more information about the OCI_DATA_AT_EXEC mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+bindp (IN/OUT) - a bind handle returned by a call to OCIBindByName() or 
+OCIBindByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ictxp (IN) - the context pointer required by the call back function icbfp. 
+icbfp (IN) - the callback function which returns a pointer to the IN bind 
+value or piece at run time. The callback takes in the following parameters. 
+ictxp (IN/OUT) - the context pointer for this callback function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. 1 based not 
+greater than curele parameter of the bind call. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and may not be greater than curele parameter of the bind call. 
+bufpp (OUT) - the pointer to the buffer. 
+piecep (OUT) - which piece of the bind value. This can be one of the 
+following values - OCI_ONE_PIECE, OCI_FIRST_PIECE, 
+OCI_NEXT_PIECE and OCI_LAST_PIECE.
+indp (OUT) - contains the indicator value. This is apointer to either an 
+sb2 value or a pointer to an indicator structure for binding named data 
+types. 
+indszp (OUT) - contains the indicator value size. A pointer containing 
+the size of either an sb2 or an indicator structure pointer. 
+octxp (IN) - the context pointer required by the callback function ocbfp. 
+ocbfp (IN) - the callback function which returns a pointer to the OUT bind 
+value or piece at run time. The callback takes in the following parameters. 
+octxp (IN/OUT) - the context pointer for this call back function. 
+bindp (IN) - the bind handle passed in to uniquely identify this bind 
+variable. 
+iter (IN) - 1-based execute iteration value. 
+index (IN) - index of the current array, for an array bind. This parameter 
+is 1-based, and must not be greater than curele parameter of the bind call. 
+bufpp (OUT) - a pointer to a buffer to write the bind value/piece. 
+buflp (OUT) - returns the buffer size. 
+alenpp (OUT) - a pointer to a storage for OCI to fill in the size of the bind 
+value/piece after it has been read. 
+piecep (IN/OUT) - which piece of the bind value. It will be set by the 
+library to be one of the following values - OCI_ONE_PIECE or 
+OCI_NEXT_PIECE. The callback function can leave it unchanged or set 
+it to OCI_FIRST_PIECE or OCI_LAST_PIECE. By default - 
+OCI_ONE_PIECE. 
+indpp (OUT) - returns a pointer to contain the indicator value which 
+either an sb2 value or a pointer to an indicator structure for named data 
+types. 
+indszpp (OUT) - returns a pointer to return the size of the indicator 
+value which is either size of an sb2 or size of an indicator structure. 
+rcodepp (OUT) - returns a pointer to contains the return code. 
+Related Functions
+OCIAttrGet()
+
+
+---------------------------------OCIBindObject--------------------------------
+
+
+OCIBindObject()
+Name
+OCI Bind Object
+Purpose
+This function sets up additional attributes which are required for a named 
+data type (object)  bind.
+Syntax
+sword OCIBindObject ( OCIBind          *bindp,
+                    OCIError         *errhp, 
+                    CONST OCIType    *type,
+                    dvoid            **pgvpp, 
+                    ub4              *pvszsp, 
+                    dvoid            **indpp, 
+                    ub4              *indszp, );
+Comments
+This function sets up additional attributes which binding a named data type 
+or a REF. An error will be returned if this function is called when the OCI 
+environment has been initialized in non-object mode. 
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+If the OCI_DATA_AT_EXEC mode was specified in ocibindn() or ocibindp(), the 
+pointers to the IN buffers are obtained either using the callback icbfp 
+registered in the OCIBindDynamic() call or by the OCIStmtSetPieceInfo() call. 
+The buffers are dynamically allocated for the OUT data and the pointers to 
+these buffers are returned either by calling ocbfp() registered by the 
+OCIBindDynamic() or by setting the pointer to the buffer in the buffer passed 
+in by OCIStmtSetPieceInfo() called when OCIStmtExecute() returned 
+OCI_NEED_DATA. The memory of these client library- allocated buffers must be 
+freed when not in use anymore by using the OCIObjectFreee() call.
+Parameters
+bindp ( IN/OUT) - the bind handle returned by the call to OCIBindByName() 
+or OCIBindByPos(). 
+errhp ( IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type ( IN) - points to the TDO which describes the type of the program 
+variable being bound. Retrieved by calling OCITypeByName().
+pgvpp ( IN/OUT) - points to a pointer to the program variable buffer. For an 
+array, pgvpp points to an array of pointers. When the bind variable is also an 
+OUT variable, the OUT Named Data Type value or REF is allocated 
+(unpickled) in the Object Cache, and a pointer to the value or REF is returned,
+At the end of execute, when all OUT values have been received, pgvpp points 
+to an array of pointer(s) to these newly allocated named data types in the 
+object cache. 
+pgvpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the Named 
+Data Type buffers are requested at runtime. For static array binds, skip 
+factors may be specified using the OCIBindArrayOfStruct() call. The skip 
+factors are used to compute the address of the next pointer to the value, the 
+indicator structure and their sizes.
+pvszsp ( IN/OUT) - points to the size of the program variable. The size of the 
+named data type is not required on input. For an array, pvszsp is an array of 
+ub4s. On return, for OUT bind variables, this points to size(s) of the Named 
+Data Types and REFs received. pvszsp is ignored if the OCI_DATA_AT_EXEC 
+mode is set. Then the size of the buffer is taken at runtime.
+indpp ( IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array of 
+pointers. When the bind variable is also an OUT bind variable, memory is 
+allocated in the object cache, to store the unpickled OUT indicator values. At 
+the end of the execute when all OUT values have been received, indpp points 
+to the pointer(s) to these newly allocated indicator structure(s). 
+indpp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+is requested at runtime.
+indszp ( IN/OUT) - points to the size of the IN indicator structure program 
+variable. For an array, it is an array of sb2s. On return for OUT bind variables, 
+this points to size(s) of the received OUT indicator structures.
+indszp is ignored if the OCI_DATA_AT_EXEC mode is set. Then the indicator 
+size is requested at runtime.
+Related Functions
+OCIAttrGet()
+
+
+
+----------------------------------OCIBreak------------------------------------
+
+
+OCIBreak()
+Name
+OCI Break
+Purpose
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server .
+Syntax
+sword OCIBreak ( dvoid      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call performs an immediate (asynchronous) abort of any currently 
+executing OCI function that is associated with a server. It is normally used 
+to stop a long-running OCI call being processed on the server.
+This call can take either the service context handle or the server context 
+handle as a parameter to identify the function to be aborted.
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+-----------------------------OCIConnectionPoolCreate --------------------------
+Name:
+OCIConnectionPoolCreate
+
+Purpose:
+Creates the connections in the pool
+
+Syntax:
+OCIConnectionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                         OraText **poolName, sb4 *poolNameLen, 
+                         CONST Oratext *dblink, sb4 dblinkLen,
+                         ub4 connMin, ub4 connMax, ub4 connIncr,
+                         CONST OraText *poolUsername, sb4 poolUserLen,
+                         CONST OraText *poolPassword, sb4 poolPassLen, ub4 mode)
+Comments:
+This call is used to create a connection pool. conn_min connections
+to the database are started on calling OCIConnectionPoolCreate.
+
+Parameters:
+envhp (IN/OUT)  - A pointer to the environment where the Conencton Pool
+                  is to be created
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+poolhp (IN/OUT) - An uninitialiazed pool handle.
+poolName (OUT) - The connection pool name. 
+poolNameLen (OUT) - The length of the connection pool name 
+dblink (IN/OUT) - Specifies the database(server) to connect. This will also
+                  be used as the default pool name.
+dblinkLen (IN)  - The length of the string pointed to by dblink.
+connMin (IN)    - Specifies the minimum number of connections in the
+                  Connection Pool at any instant.
+                  connMin number of connections are started when
+                  OCIConnectionPoolCreate() is called.
+connMax (IN)    - Specifies the maximum number of connections that can be
+                  opened to the database. Once this value is reached, no
+                  more connections are opened.
+connIncr (IN)   - Allows application to set the next increment for
+                  connections to be opened to the database if the current
+                  number of connections are less than conn_max.
+poolUsername (IN/OUT) - Connection pooling requires an implicit proxy
+                         session and this attribute provides a username
+                         for that session.
+poolUserLen (IN) - This represents the length of pool_username.
+poolPassword (IN/OUT) - The password for the parameter pool_username passed
+                        above.
+poolPassLen (IN) - This represents the length of pool_password.
+
+mode (IN) - The modes supported are OCI_DEFAULT and 
+OCI_CPOOL_REINITIALIZE 
+
+Related Functions
+OCIConnectionPoolDestroy()
+
+---------------------------------------------------------------------------
+
+----------------------------OCIConnectionPoolDestroy-------------------------
+Name:
+OCIConnectionPoolDestroy
+
+Purpose:
+Terminates the connections in the pool
+
+Syntax:
+OCIConnectionPoolDestroy (OCICPool *poolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+On calling OCIConnectionPoolDestroy, all the open connections in the pool
+are closed and the pool is destroyed.
+
+Parameters:
+poolhp (IN/OUT) - An initialiazed pool handle.
+errhp (IN/OUT)  - An error handle which can be passed to OCIErrorGet().
+mode (IN)       - Currently, OCIConnectionPoolDestroy() will support only
+                  the OCI_DEFAULT mode.
+
+Related Functions:
+OCIConnectionPoolCreate()
+
+-----------------------------------------------------------------------------
+----------------------------OCISessionPoolCreate-----------------------------
+Name: 
+OCISessionPoolCreate
+
+Purpose:
+Creates the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISpool *spoolhp, 
+                      OraText **poolName, ub4 *poolNameLen, 
+                      CONST OraText *connStr, ub4 connStrLen,
+                      ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                      OraText *userid, 	ub4 useridLen,
+                      OraText *password, ub4 passwordLen,
+                      ub4 mode)
+
+Comments:
+When OCISessionPoolCreate is called, a session pool is initialized for
+the associated environment and the database specified by the
+connStr parameter. This pool is named uniquely and the name
+is returned to the user in the poolname parameter.
+
+Parameters:
+envhp (IN/OUT) - A pointer to the environment handle in which the session
+                 pool needs to be created.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+spoolhp (IN/OUT) - A pointer to the session pool handle that is created.
+poolName (OUT) - Session pool name returned to the user.
+poolNameLen (OUT) - Length of the PoolName
+connStr (IN) - The TNS alias of the database to connect to.
+connStrLen (IN) - Length of the connStr.
+sessMin (IN) - Specifies the minimum number of sessions in the Session Pool.
+               These are the number of sessions opened in the beginning, if
+               in Homogeneous mode. Else, the parameter is ignored.
+sessMax (IN) - Specifies the maximum number of sessions in the Session Pool.
+               Once this value is reached, no more sessions are opened,
+               unless the OCI_ATTR_SPOOL_FORCEGET is set.
+userid (IN) - Specifies the userid with which to start up the sessions.
+useridLen (IN) - Length of userid.
+password (IN) - Specifies the password for the corresponding userid.
+passwordLen (IN) - Specifies the length of the password
+mode(IN) - May be OCI_DEFAULT, OCI_SPC_SPOOL_REINITIALIZE, or
+           OCI_SPC_SPOOL_HOMOGENEOUS.
+
+Returns:
+SUCCESS - If pool could be allocated and created successfully.
+ERROR - If above conditions could not be met.
+
+Related Functions:
+OCISessionPoolDestroy()
+-----------------------------------------------------------------------------
+-----------------------------OCISessionPoolDestroy---------------------------
+Name:
+OCISessionPoolDestroy
+
+Purpose:
+Terminates all the sessions in the session pool.
+
+Syntax:
+sword OCISessionPoolDestroy (OCISPool *spoolhp, OCIError *errhp, ub4 mode)
+
+Comments:
+spoolhp (IN/OUT) - The pool handle of the session pool to be destroyed.
+errhp (IN/OUT) - An error handle which can be passed to OCIErrorGet().
+mode (IN) - Currently only OCI_DEFAULT mode is supported.
+
+Returns:
+SUCCESS - All the sessions could be closed.
+ERROR - If the above condition is not met.
+
+Related Functions:
+OCISessionPoolCreate()
+-----------------------------------------------------------------------------
+-------------------------------OCISessionGet---------------------------------
+Name:
+OCISessionGet
+
+Purpose:
+Get a session. This could be from a session pool, connection pool or
+a new standalone session.
+
+Syntax:
+sword OCISessionGet(OCIenv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                    OCIAuthInfo *authhp,
+                    OraText *poolName, ub4 poolName_len,
+                    CONST OraText *tagInfo, ub4 tagInfo_len,
+                    OraText **retTagInfo, ub4 *retTagInfo_len,
+                    boolean *found,
+                    ub4 mode)
+
+Comments:
+envhp (IN/OUT) - OCI environment handle.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+svchp (IN/OUT) - Address of an OCI service context pointer. This will be
+                 filled with a server and session handle, attached to the
+                 pool.
+authhp (IN/OUT) - OCI Authentication Information handle.
+poolName (IN) - This indicates the session/connection pool to get the
+                session/connection from in the OCI_SPOOL/OCI_CPOOL mode.
+                In the OCI_DEFAULT mode it refers to the connect string.
+poolName_len (IN) - length of poolName.
+tagInfo (IN) - indicates the tag of the session that the user wants. If the
+                   user wants a default session, he must specify a NULL here.
+                   Only used for Session Pooling.
+tagInfo_len (IN) - the length of tagInfo.
+retTagInfo (OUT) - This indicates the type of session that is returned to
+                   the user. Only used for Session Pooling.
+retTagInfo_len (OUT) - the length of retTagInfo.
+found (OUT) - set to true if the user gets a session he had requested, else
+              set to false. Only used for Session Pooling.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_CRED_PROXY and
+            OCI_GET_SPOOL_MATCHANY, OCI_SPOOL and OCI_CPOOL. OCI_SPOOL and
+            OCI_CPOOL are mutually exclusive.
+
+Returns:
+SUCCESS -  if a session was successfully returned into svchp.
+SUCCESS_WITH_INFO - if a session was successfully returned into svchp and the
+                    total number of sessions > maxsessions. Only valid for
+                    Session Pooling.
+ERROR - If a session could not be retrieved.
+
+Related Functions:
+OCISessionRelease()
+-----------------------------------------------------------------------------
+---------------------------OCISessionRelease---------------------------------
+Name:
+OCISessionRelease
+
+Purpose:
+Release the session.
+
+Syntax:
+sword OCISessionRelease ( OCISvcCtx *svchp, OCIError *errhp,
+                          OraText *tag, ub4 tag_len,
+                          ub4 mode);
+
+Comments:
+svchp (IN/OUT) - The service context associated with the session/connection.
+errhp (IN/OUT) - OCI error handle to be passed to OCIErrorGet().
+tag (IN) - Only used for Session Pooling.
+           This parameter will be ignored unless mode OCI_RLS_SPOOL_RETAG is
+           specified. In this case, the session is labelled with this tag and
+           returned to the pool. If this is NULL, then the session is untagged.
+tag_len (IN) - Length of the tag. This is ignored unless mode 
+               OCI_RLS_SPOOL_RETAG is set.
+mode (IN) - The supported modes are OCI_DEFAULT, OCI_RLS_SPOOL_DROPSESS,
+            OCI_RLS_SPOOL_RETAG. The last 2 are only valid for Session Pooling.
+            When OCI_RLS_SPOOL_DROPSESS is specified, the session
+            will be removed from the session pool. If OCI_RLS_SPOOL_RETAG 
+            is set, the tag on the session will be altered. If this mode is 
+            not set, the tag and tag_len parameters will be ignored.
+
+Returns:
+ERROR - If the session could not be released successfully.
+SUCCESS - In all other cases.
+
+Related Functions:
+OCISessionGet().
+-----------------------------------------------------------------------------
+------------------------------OCIDateTimeAssign --------------------------
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from, 
+		        OCIDateTime *to);
+NAME: OCIDateTimeAssign - OCIDateTime Assignment
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+from (IN) - datetime to be assigned
+to (OUT) - lhs of assignment
+DESCRIPTION:
+        Performs date assignment. The type of the output will be same as that
+	of input
+
+------------------------------OCIDateTimeCheck----------------------------
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+		 ub4 *valid );
+NAME: OCIDateTimeCheck - OCIDateTime CHecK if the given date is valid
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - date to be checked
+valid (OUT) -  returns zero for a valid date, otherwise 
+  		the ORed combination of all error bits specified below:
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_DATE_INVALID_DAY         0x1             Bad day
+   OCI_DATE_DAY_BELOW_VALID     0x2             Bad DAy Low/high bit (1=low)
+   OCI_DATE_INVALID_MONTH       0x4             Bad MOnth
+   OCI_DATE_MONTH_BELOW_VALID   0x8             Bad MOnth Low/high bit (1=low)
+   OCI_DATE_INVALID_YEAR        0x10            Bad YeaR
+   OCI_DATE_YEAR_BELOW_VALID    0x20            Bad YeaR Low/high bit (1=low)
+   OCI_DATE_INVALID_HOUR        0x40            Bad HouR
+   OCI_DATE_HOUR_BELOW_VALID    0x80            Bad HouR Low/high bit (1=low)
+   OCI_DATE_INVALID_MINUTE      0x100           Bad MiNute
+   OCI_DATE_MINUTE_BELOW_VALID	0x200           Bad MiNute Low/high bit (1=low)
+   OCI_DATE_INVALID_SECOND      0x400           Bad SeCond
+   OCI_DATE_SECOND_BELOW_VALID  0x800           bad second Low/high bit (1=low)
+   OCI_DATE_DAY_MISSING_FROM_1582 0x1000        Day is one of those "missing"
+                                                from 1582
+   OCI_DATE_YEAR_ZERO           0x2000          Year may not equal zero
+   OCI_DATE_INVALID_TIMEZONE    0x4000          Bad Timezone
+   OCI_DATE_INVALID_FORMAT      0x8000          Bad date format input
+
+   So, for example, if the date passed in was 2/0/1990 25:61:10 in
+   (month/day/year hours:minutes:seconds format), the error returned
+   would be OCI_DATE_INVALID_DAY | OCI_DATE_DAY_BELOW_VALID |
+   OCI_DATE_INVALID_HOUR | OCI_DATE_INVALID_MINUTE
+
+DESCRIPTION:
+  	Check if the given date is valid.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  'date' and 'valid' pointers are NULL pointers
+
+------------------------------- OCIDateTimeCompare----------------------------
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1, 
+                     CONST OCIDateTime *date2,  sword *result );
+NAME: OCIDateTimeCompare - OCIDateTime CoMPare dates
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date1, date2 (IN) - dates to be compared
+result (OUT) - comparison result, 0 if equal, -1 if date1 < date2, 
+  		1 if date1 > date2
+DESCRIPTION:
+The function OCIDateCompare compares two dates. It returns -1 if 
+date1 is smaller than date2, 0 if they are equal, and 1 if date1 is 
+greater than date2.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  invalid date
+	  input dates are not mutually comparable
+
+------------------------------OCIDateTimeConvert----------------------
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate, 
+				OCIDateTime *outdate);
+NAME: OCIDateTimeConvert - Conversion between different DATETIME types
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate (IN) - pointer to input date
+outdate (OUT) - pointer to output datetime 
+DESCRIPTION: Converts one datetime type to another. The result type is
+       the type of the 'outdate' descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if
+	    conversion not possible.
+   
+---------------------------- OCIDateTimeFromText-----------------------
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str, 
+             size_t d_str_length, CONST OraText *fmt, ub1 fmt_length,
+             CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+NAME: OCIDateTimeFromText - OCIDateTime convert String FROM Date
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+		    conversion takes place in session NLS_LANGUAGE and
+		    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date_str (IN) - input string to be converted to Oracle date
+d_str_length (IN) - size of the input string, if the length is -1
+  		then 'date_str' is treated as a null terminated  string
+fmt (IN) - conversion format; if 'fmt' is a null pointer, then
+                the string is expected to be in the default format for
+		the datetime type.
+fmt_length (IN) - length of the 'fmt' parameter
+lang_name (IN) - language in which the names and abbreviations of
+  	        days and months are specified, if null i.e. (OraText *)0,
+  		the default language of session is used, 
+lang_length (IN) - length of the 'lang_name' parameter
+date (OUT) - given string converted to date
+DESCRIPTION:
+  	Converts the given string to Oracle datetime type set in the 
+        OCIDateTime descriptor according to the specified format. Refer to 
+        "TO_DATE" conversion function described in "Oracle SQL Language 
+        Reference Manual" for a description of format.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  invalid format
+  	  unknown language
+  	  invalid input string
+
+--------------------------- OCIDateTimeGetDate-------------------------
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err,  CONST OCIDateTime *date, 
+	                   sb2 *year, ub1 *month, ub1 *day );
+NAME: OCIDateTimeGetDate - OCIDateTime Get Date (year, month, day)  
+				portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+year      (OUT) - year value
+month     (OUT) - month value
+day       (OUT) - day value
+
+--------------------------- OCIDateTimeGetTime ------------------------
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+		 ub1 *hour, ub1 *minute, ub1 *sec, ub4 *fsec);
+NAME: OCIDateTimeGetTime - OCIDateTime Get Time (hour, min, second, 
+			fractional second)  of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - hour value
+minute       (OUT) - minute value
+sec       (OUT) - second value
+fsec      (OUT) - Fractional Second value
+
+--------------------------- OCIDateTimeGetTimeZoneOffset ----------------------
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,CONST 
+              OCIDateTime *datetime,sb1 *hour,sb1  *minute);
+
+NAME: OCIDateTimeGetTimeZoneOffset - OCIDateTime Get TimeZone (hour, minute)  
+                         portion of DATETIME. 
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - Pointer to OCIDateTime 
+hour      (OUT) - TimeZone Hour value
+minute     (OUT) - TimeZone Minute value
+
+--------------------------- OCIDateTimeSysTimeStamp---------------------
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err, 
+              OCIDateTime *sys_date );
+ 
+NAME: OCIDateTimeSysTimeStamp - Returns system date/time as a TimeStamp with 
+                      timezone
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+sys_date (OUT) - Pointer to output timestamp
+ 
+DESCRIPTION: 
+        Gets the system current date and time as a timestamp with timezone
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+------------------------------OCIDateTimeIntervalAdd----------------------
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+	 OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalAdd - Adds an interval to datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+				will be of same type as input datetime
+DESCRIPTION: 
+	Adds an interval to a datetime to produce a resulting datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if:
+		resulting date is before Jan 1, -4713
+		resulting date is after Dec 31, 9999
+
+------------------------------OCIDateTimeIntervalSub----------------------
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+              OCIInterval *inter, OCIDateTime *outdatetime);
+NAME: OCIDateTimeIntervalSub - Subtracts an interval from a datetime
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+datetime (IN) - pointer to input datetime
+inter    (IN) - pointer to interval 
+outdatetime (IN) - pointer to output datetime. The output datetime 
+				will be of same type as input datetime
+DESCRIPTION: 
+ 	Subtracts an interval from a datetime and stores the result in a
+     	datetime
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if:
+		resulting date is before Jan 1, -4713
+		resulting date is after Dec 31, 9999
+
+--------------------------- OCIDateTimeConstruct-------------------------
+sword OCIDateTimeConstruct(dvoid  *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 year,ub1 month,ub1 day,ub1 hour,ub1 min,ub1 sec,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+NAME: OCIDateTimeConstruct - Construct an OCIDateTime. Only the relevant
+       fields for the OCIDateTime descriptor types are used.
+PARAMETERS:
+        hndl (IN) - Session/Env handle. 
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+        datetime (IN) - Pointer to OCIDateTime 
+        year      (IN) - year value
+        month     (IN) - month value
+        day       (IN) - day value        
+        hour      (IN) - hour value
+        min       (IN) - minute value
+        sec       (IN) - second value
+        fsec      (IN) - Fractional Second value
+        timezone  (IN) - Timezone string
+        timezone_length(IN) - Length of timezone string
+
+DESCRIPTION:
+       Constructs a DateTime descriptor. The type of the datetime is the
+       type of the OCIDateTime descriptor. Only the relevant fields based
+       on the type are used. For Types with timezone, the date and time
+       fields are assumed to be in the local time of the specified timezone.
+       If timezone is not specified, then session default timezone is
+       assumed.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_ERROR if datetime is not valid.
+
+------------------------------OCIDateTimeSubtract-----------------------
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1, 
+		OCIDateTime *indate2, OCIInterval *inter);
+NAME: OCIDateTimeSubtract - subtracts two datetimes to return an interval
+PARAMETERS:
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+indate1(IN) - pointer to subtrahend
+indate2(IN) - pointer to minuend
+inter  (OUT) - pointer to output interval
+DESCRIPTION: 
+	Takes two datetimes as input and stores their difference in an 
+        interval. The type of the interval is the type of the 'inter'
+        descriptor.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if
+	   datetimes are not comparable.
+
+--------------------------- OCIDateTimeToText--------------------------
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                        CONST OraText *fmt, ub1 fmt_length, ub1 fsprec, 
+                        CONST OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+NAME: OCIDateTimeToText - OCIDateTime convert date TO String 
+PARAMETERS:
+hndl (IN) - Session/Env handle. If Session Handle is passed, the 
+		    conversion takes place in session NLS_LANGUAGE and
+		    session NLS_CALENDAR, otherwise the default is used.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+date (IN) - Oracle datetime to be converted
+fmt (IN) - conversion format, if null string pointer (OraText*)0, then
+                the date is converted to a character string in the
+                default format for that type.
+fmt_length (IN) - length of the 'fmt' parameter
+fsprec (IN) - specifies the fractional second precision in which the
+               fractional seconds is returned.
+lang_name (IN) - specifies the language in which the names and 
+  	        abbreviations of months and days are returned;
+  	        default language of session is used if 'lang_name' 
+  		is null i.e. (OraText *)0
+lang_length (IN) - length of the 'nls_params' parameter
+buf_size (IN/OUT) - size of the buffer; size of the resulting string
+                is returned via this parameter
+buf (OUT) - buffer into which the converted string is placed
+DESCRIPTION:
+        Converts the given date to a string according to the specified format.
+        Refer to "TO_DATE" conversion function described in
+        "Oracle SQL Language Reference Manual" for a description of format
+        and NLS arguments. The converted null-terminated date string is
+        stored in the buffer 'buf'.
+RETURNS:
+        OCI_SUCCESS if the function completes successfully.
+        OCI_INVALID_HANDLE if 'err' is NULL.
+        OCI_ERROR if
+  	  buffer too small
+  	  invalid format
+  	  unknown language
+          overflow error
+
+----------------------------OCIDateTimeGetTimeZoneName------------------------
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, 
+                                 OCIError *err,
+                                 CONST OCIDateTime *datetime,
+                                 ub1 *buf,
+                                 ub4 *buflen);
+NAME OCIDateTimeGetTimeZoneName - OCI DateTime Get the Time Zone Name
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to an OCIDateTime.
+buf (OUT)       - User allocated storage for name string.
+buflen (IN/OUT) - length of buf on input, length of name on out
+DESCRIPTION:
+        Returns either the timezone region name or the absolute hour and minute
+        offset. If the DateTime was created with a region id then the region 
+        name will be returned in the buf.  If the region id is zero, then the 
+        hour and minute offset is returned as "[-]HH:MM".
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+---------------------------------OCIDateTimeToArray----------------------------
+sword OCIDateTimeToArray(dvoid *hndl, 
+                         OCIError *err,
+                         CONST OCIDateTime *datetime,
+                         CONST OCIInterval *reftz,
+                         ub1 *outarray,
+                         ub4 *len
+                         ub1 *fsprec);
+NAME OCIDateTimeToArray - OCI DateTime convert To Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+datetime (IN)   - Pointer to OCIDateTime to be converted.
+outarray (OUT)  - Result array storage
+len (OUT)        - pointer to  length of outarray.
+fsprec (IN)     - Number of fractional seconds digits.
+DESCRIPTION:
+        Returns an array representing the input DateTime descriptor.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+--------------------------------OCIDateTimeFromArray---------------------------
+sword OCIDateTimeFromArray(dvoid *hndl, 
+                         OCIError *err,
+                         ub1 *inarray,
+                         ub4 len
+                         ub1 type
+                         OCIDateTime *datetime,
+                         OCIInterval *reftz,
+                         ub1 fsprec);
+NAME OCIDateTimeFromArray - OCI DateTime convert From Array format
+PARAMETERS:
+hndl (IN)      - Session/Env handle.
+err (IN/OUT)   - error handle. If there is an error, it is
+                 recorded in 'err' and this function returns OCI_ERROR.
+                 The error recorded in 'err' can be retrieved by calling
+                 OCIErrorGet().
+inarray (IN)   - Pointer to input array representtion of DateTime
+len (IN)       - len of inarray.
+type (IN)      - One of SQLT_DATE, SQLT_TIME, SQLT_TIME_TZ, SQLT_TIMESTAMP,
+                 SQLT_TIMESTAMP_TZ, or SQLT_TIMESTAMP_LTZ.
+datetime (OUT) - Pointer to the result OCIDateTime.
+reftz (IN)     - timezone interval used with SQLT_TIMESTAMP_LTZ.
+fsprec (IN)    - fractionl seconds digits of precision (0-9).
+DESCRIPTION:
+        Returns a pointer to an OCIDateTime of type type converted from 
+        the inarray.
+RETURNS:
+       OCI_SUCCESS if the function completes successfully.
+       OCI_INVALID_HANDLE if 'err' is NULL.
+       OCI_ERROR if
+         buffer too small
+         error retrieving timezone data
+         invalid region 
+         invalid LdiDateTime type
+
+----------------------------------OCIRowidToChar-----------------------------
+Name
+OCIRowidToChar
+
+Purpose
+Converts physical/logical (universal) ROWID to chracter extended (Base 64) 
+representation into user provided buffer outbfp of length outbflp. After 
+execution outbflp contains amount of bytes converted.In case of truncation 
+error, outbflp contains required size to make this conversion successful
+and returns ORA-1405.
+
+Syntax
+sword OCIRowidToChar( OCIRowid *rowidDesc, 
+                      OraText *outbfp, 
+                      ub2 *outbflp, 
+                      OCIError *errhp)
+
+Comments
+After this conversion, ROWID in character format can be bound using
+OCIBindByPos or OCIBindByName call and used to query a row at a
+desired ROWID. 
+
+Parameters
+rowidDesc (IN)   - rowid DESCriptor which is allocated from OCIDescritorAlloc
+                   and populated by a prior SQL statement execution
+outbfp (OUT)     - pointer to the buffer where converted rowid in character 
+                   representation is stored after successful execution.
+outbflp (IN/OUT) - pointer to output buffer length variable.
+                   Before execution (IN mode) *outbflp contains the size of
+                   outbfp, after execution (OUT mode) *outbflp contains amount
+                   of bytes converted. In an event of truncation during 
+                   conversion *outbflp contains the required length to make
+                   conversion successful.
+errhp (IN/OUT)   - an error handle which can be passed to OCIErrorGet() for
+                   diagnostic information in the event of an error.
+
+------------------------------OCIDefineArrayOfStruct--------------------------
+
+
+OCIDefineArrayOfStruct()
+Name
+OCI Define for Array of Structures
+Purpose
+This call specifies additional attributes necessary for a static array define.
+Syntax
+sword OCIDefineArrayOfStruct ( OCIDefine   *defnp,
+                             OCIError    *errhp,
+                             ub4         pvskip, 
+                             ub4         indskip, 
+                             ub4         rlskip,
+                             ub4         rcskip );
+Comments
+This call specifies additional attributes necessary for an array define, used in 
+an array of structures (multi-row, multi-column) fetch.
+For more information about skip parameters, see the section "Skip Parameters" 
+on page 4-17.
+Parameters
+defnp (IN) - the handle to the define structure which was returned by a call 
+to OCIDefineByPos().
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+pvskip (IN) - skip parameter for the next data value.
+indskip (IN) - skip parameter for the next indicator location. 
+rlskip (IN) - skip parameter for the next return length value.
+rcskip (IN) - skip parameter for the next return code.
+Related Functions
+OCIAttrGet()
+
+
+
+
+
+OCIDefineByPos()
+Name
+OCI Define By Position
+Purpose
+Associates an item in a select-list with the type and output data buffer. 
+Syntax
+sb4 OCIDefineByPos ( 
+              OCIStmt     *stmtp, 
+              OCIDefine   **defnp,
+              OCIError    *errhp,
+              ub4         position,
+              dvoid       *valuep,
+              sb4         value_sz,
+              ub2         dty,
+              dvoid       *indp,
+              ub2         *rlenp,
+              ub2         *rcodep,
+              ub4         mode );
+Comments
+This call defines an output buffer which will receive data retreived from 
+Oracle. The define is a local step which is necessary when a SELECT statement 
+returns data to your OCI application.
+This call also implicitly allocates the define handle for the select-list item.
+Defining attributes of a column for a fetch is done in one or more calls. The 
+first call is to OCIDefineByPos(), which defines the minimal attributes 
+required to specify the fetch. 
+This call takes as a parameter a define handle, which must have been 
+previously allocated with a call to OCIHandleAlloc().
+Following the call to OCIDefineByPos() additional define calls may be 
+necessary for certain data types or fetch modes:
+A call to OCIDefineArrayOfStruct() is necessary to set up skip parameters 
+for an array fetch of multiple columns.
+A call to OCIDefineObject() is necessary to set up the appropriate 
+attributes of a named data type fetch. In this case the data buffer pointer 
+in ocidefn() is ignored.
+Both OCIDefineArrayOfStruct() and OCIDefineObject() must be called 
+after ocidefn() in order to fetch multiple rows with a column of named 
+data types.
+For a LOB define, the buffer pointer must be a lob locator of type 
+OCILobLocator , allocated by the OCIDescAlloc() call. LOB locators, and not 
+LOB values, are always returned for a LOB column. LOB values can then be 
+fetched using OCI LOB calls on the fetched locator.
+For NCHAR (fixed and varying length), the buffer pointer must point to an 
+array of bytes sufficient for holding the required NCHAR characters. 
+Nested table columns are defined and fetched like any other named data type. 
+If the mode parameter is this call is set to OCI_DYNAMIC_FETCH, the client 
+application can fetch data dynamically at runtime.
+Runtime data can be provided in one of two ways:
+callbacks using a user-defined function which must be registered with a 
+subsequent call to OCIDefineDynamic(). When the client library needs a 
+buffer to return the fetched data, the callback will be invoked and the 
+runtime buffers provided will return a piece or the whole data. 
+a polling mechanism using calls supplied by the OCI. This mode is 
+assumed if no callbacks are defined. In this case, the fetch call returns the 
+OCI_NEED_DATA error code, and a piecewise polling method is used 
+to provide the data.
+Related Functions: For more information about using the 
+OCI_DYNAMIC_FETCH mode, see the section "Runtime Data 
+Allocation and Piecewise Operations" on page 5-16 of Volume 1..
+For more information about the define step, see the section "Defining" 
+on page 2-30.
+Parameters
+stmtp (IN) - a handle to the requested SQL query operation.
+defnp (IN/OUT) - a pointer to a pointer to a define handle which is implicitly 
+allocated by this call.  This handle is used to  store the define information 
+for this column.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+position (IN) - the position of this value in the select list. Positions are 
+1-based and are numbered from left to right. For example, in the SELECT 
+statement
+SELECT empno, ssn, mgrno FROM employees;
+empno is at position 1, ssn is at position 2, and mgrno is at position 3.
+valuep (IN/OUT) - a pointer to a buffer or an array of buffers of the type 
+specified in the dty parameter. A number of buffers can be specified when 
+results for more than one row are desired in a single fetch call.
+value_sz (IN) - the size of each valuep buffer in bytes. If the data is stored 
+internally in VARCHAR2 format, the number of characters desired, if different 
+from the buffer size in bytes, may be additionally specified by the using 
+OCIAttrSet(). 
+In an NLS conversion environment, a truncation error will be generated if the 
+number of bytes specified is insufficient to handle the number of characters 
+desired.
+dty (IN) - the data type. Named data type (SQLT_NTY) and REF (SQLT_REF) 
+are valid only if the environment has been intialized with in object mode. 
+indp - pointer to an indicator variable or array. For scalar data types, 
+pointer to sb2 or an array of sb2s. Ignored for named data types. For named 
+data types, a pointer to a named data type indicator structure or an array of 
+named data type indicator structures is associated by a subsequent 
+OCIDefineObject() call. 
+See the section "Indicator Variables" on page 2-43 for more information about 
+indicator variables.
+rlenp (IN/OUT) - pointer to array of length of data fetched. Each element in 
+rlenp is the length of the data in the corresponding element in the row after 
+the fetch. 
+rcodep (OUT) - pointer to array of column-level return codes
+mode (IN) - the valid modes are:
+OCI_DEFAULT. This is the default mode.
+OCI_DYNAMIC_FETCH. For applications requiring dynamically 
+allocated data at the time of fetch, this mode must be used. The user may 
+additionally call OCIDefineDynamic() to set up a callback function that 
+will be invoked to receive the dynamically allocated buffers and to set 
+up the memory allocate/free callbacks and the context for the callbacks. 
+valuep and value_sz are ignored in this mode. 
+Related Functions
+OCIDefineArrayOfStruct(), OCIDefineDynamic(), OCIDefineObject()
+
+
+
+
+OCIDefineDynamic()
+Name
+OCI Define Dynamic Fetch Attributes
+Purpose
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode was selected in OCIDefineByPos(). 
+Syntax
+sword OCIDefineDynamic( OCIDefine   *defnp,
+                      OCIError    *errhp,
+                      dvoid       *octxp, 
+                      OCICallbackDefine (ocbfp)(
+                                  dvoid             *octxp,
+                                  OCIDefine         *defnp,
+                                  ub4               iter, 
+                                  dvoid             **bufpp,
+                                  ub4               **alenpp,
+                                  ub1               *piecep,
+                                  dvoid             **indpp,
+                                  ub2               **rcodep)  );
+Comments
+This call is used to set the additional attributes required if the 
+OCI_DYNAMIC_FETCH mode has been selected in a call to 
+OCIDefineByPos(). 
+When the OCI_DYNAMIC_FETCH mode is selected, buffers will be 
+dynamically allocated for REF, and named data type, values to receive the 
+data. The pointers to these buffers will be returned. 
+If OCI_DYNAMIC_FETCH mode was selected, and the call to 
+OCIDefineDynamic() is skipped, then the application can fetch data piecewise 
+using OCI calls.
+For more information about OCI_DYNAMIC_FETCH mode, see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+defnp (IN/OUT) - the handle to a define structure returned by a call to 
+OCIDefineByPos().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+octxp (IN) - points to a context for the callback function. 
+ocbfp (IN) - points to a callback function. This is invoked at runtime to get 
+a pointer to the buffer into which the fetched data or a piece of it will be 
+retreived. The callback also specifies the indicator, the return code and the 
+lengths of the data piece and indicator. The callback has the following 
+parameters:
+octxp (IN) - a context pointer passed as an argument to all the callback 
+functions.
+defnp (IN) - the define handle.
+iter (IN) - which row of this current fetch.
+bufpp (OUT) - returns a pointer to a buffer to store the column value, ie. 
+*bufp points to some appropriate storage for the column value.
+alenpp (OUT) - returns a pointer to the length of the buffer. *alenpp 
+contains the size of the buffer after return from callback. Gets set to 
+actual data size after fetch.
+piecep (IN/OUT) - returns a piece value, as follows:
+The IN value can be OCI_ONE_PIECE, OCI_FIRST_PIECE or 
+OCI_NEXT_PIECE.
+The OUT value can be OCI_ONE_PIECE if the IN value was 
+OCI_ONE_PIECE.
+The OUT value can be OCI_ONE_PIECE or OCI_FIRST_PIECE if 
+the IN value was OCI_FIRST_PIECE.
+The OUT value can only be OCI_NEXT_PIECE or 
+OCI_LAST_PIECE if the IN value was OCI_NEXT_PIECE. 
+indpp (IN) - indicator variable pointer
+rcodep (IN) - return code variable pointer
+Related Functions
+OCIAttrGet()
+OCIDefineObject()
+
+
+
+
+OCIDefineObject()
+Name
+OCI Define Named Data Type attributes
+Purpose
+Sets up additional attributes necessary for a Named Data Type define.
+Syntax
+sword OCIDefineObject ( OCIDefine       *defnp,
+                      OCIError        *errhp,
+                      CONST OCIType   *type,
+                      dvoid           **pgvpp, 
+                      ub4             *pvszsp, 
+                      dvoid           **indpp, 
+                      ub4             *indszp );
+Comments
+This call sets up additional attributes necessary for a Named Data Type define.An error will be returned if this function is called when the OCI environment 
+has been initialized in non-Object mode.
+This call takes as a paramter a type descriptor object (TDO) of datatype 
+OCIType for the named data type being defined.  The TDO can be retrieved 
+with a call to OCITypeByName().
+See the description of OCIInitialize() on page 13 - 43 for more information 
+about initializing the OCI process environment.
+Parameters
+defnp (IN/OUT) - a define handle previously allocated in a call to 
+OCIDefineByPos(). 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+type (IN, optional) - points to the Type Descriptor Object (TDO) which 
+describes the type of the program variable. Only used for program variables 
+of type SQLT_NTY. This parameter is optional, and may be passed as NULL 
+if it is not being used.
+pgvpp (IN/OUT) - points to a pointer to a program variable buffer. For an 
+array, pgvpp points to an array of pointers. Memory for the fetched named data 
+type instance(s) is dynamically allocated in the object cache. At the end of the 
+fetch when all the values have been received, pgvpp points to the pointer(s) to
+these newly allocated named data type instance(s). The application must call 
+OCIObjectMarkDel() to deallocate the named data type instance(s) when they 
+are no longer needed. 
+pvszsp (IN/OUT) - points to the size of the program variable. For an array, it 
+is an array of ub4s. On return points to the size(s) of unpickled fetched 
+values.
+indpp (IN/OUT) - points to a pointer to the program variable buffer 
+containing the parallel indicator structure. For an array, points to an array 
+of pointers. Memory is allocated to store the indicator structures in the 
+object cache. At the end of the fetch when all values have been received, 
+indpp points to the pointer(s) to these newly allocated indicator structure(s).
+indszp (IN/OUT) - points to the size(s) of the indicator structure program 
+variable. For an array, it is an array of ub4s. On return points to the size(s)
+of the unpickled fetched indicator values.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIDescAlloc()
+Name
+OCI Get DESCriptor or lob locator
+Purpose
+Allocates storage to hold certain data types. The descriptors can be used as 
+bind or define variables.
+Syntax
+sword OCIDescAlloc ( CONST dvoid   *parenth,
+                   dvoid         **descpp, 
+                   ub4           type,
+                   size_t        xtramem_sz,
+                   dvoid         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL descriptor or LOB locator is returned 
+on success. No diagnostics are available on error.
+This call returns OCI_SUCCESS if successful, or OCI_INVALID_HANDLE if 
+an out-of-memory error occurs. 
+Parameters
+parenth (IN) - an environment handle. 
+descpp (OUT) - returns a descriptor or LOB locator of desired type. 
+type (IN) - specifies the type of descriptor or LOB locator to be allocated. 
+The specific types are:
+OCI_DTYPE_SNAP - specifies generation of snapshot descriptor of C 
+type - OCISnapshot
+OCI_DTYPE_LOB - specifies generation of a LOB data type locator of C 
+type - OCILobLocator
+OCI_DTYPE_RSET - specifies generation of a descriptor of C type 
+OCIResult that references a result set (a number of rows as a result of a 
+query). This descriptor is bound to a bind variable of data type 
+SQLT_RSET (result set). The descriptor has to be converted into a 
+statement handle using a function - OCIResultSetToStmt() - which can 
+then be passed to OCIDefineByPos() and OCIStmtFetch() to retrieve the 
+rows of the result set.
+OCI_DTYPE_ROWID - specifies generation of a ROWID descriptor of C 
+type OCIRowid.
+OCI_DTYPE_COMPLEXOBJECTCOMP - specifies generation of a 
+complex object retrieval descriptor of C type 
+OCIComplexObjectComp.
+xtramemsz (IN) - specifies an amount of user memory to be allocated for use 
+by the application. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIDescFree()
+
+
+
+
+OCIDescFree()
+Name
+OCI Free DESCriptor
+Purpose
+Deallocates a previously allocated descriptor.
+Syntax
+sword OCIDescFree ( dvoid    *descp,
+                  ub4      type);
+Comments
+This call frees up storage associated with the descriptor, corresponding to the
+type specified in type. Returns OCI_SUCCESS or OCI_INVALID_HANDLE. 
+All descriptors must be explicitly deallocated. OCI will not deallocate a 
+descriptor if the environment handle is deallocated.
+Parameters
+descp (IN) - an allocated descriptor. 
+type (IN) - specifies the type of storage to be freed. The specific types are: 
+OCI_DTYPE_SNAP - snapshot descriptor
+OCI_DTYPE_LOB - a LOB data type descriptor
+OCI_DTYPE_RSET - a descriptor that references a result set (a number 
+of rows as a result of a query).
+OCI_DTYPE_ROWID - a ROWID descriptor
+OCI_DTYPE_COMPLEXOBJECTCOMP - a complex object retrieval 
+descriptor
+Related Functions
+OCIDescAlloc()
+
+
+
+OCIDescribeAny()
+Name
+OCI DeSCribe Any
+Purpose
+Describes existing schema objects.
+Syntax
+sword OCIDescribeAny ( OCISvcCtx     *svchp,
+                     OCIError      *errhp,
+                     dvoid         *objptr,
+                     ub4           objnm_len,
+		     ub1           objptr_typ,
+                     ub1 	   info_level,
+		     ub1           objtype,
+                     OCIDesc       *dschp );
+Comments
+This is a generic describe call that describes existing schema objects: tables,
+views, synonyms, procedures, functions, packages, sequences, and types. As a 
+result of this call, the describe handle is populated with the object-specific 
+attributes which can be obtained through an OCIAttrGet() call.
+An OCIParamGet() on the describe handle returns a parameter descriptor for a 
+specified position. Parameter positions begin with 1. Calling OCIAttrGet() on 
+the parameter descriptor returns the specific attributes of a stored procedure 
+or function parameter or a table column descriptor as the case may be. 
+These subsequent calls do not need an extra round trip to the server because 
+the entire schema object description cached on the client side by 
+OCIDescribeAny(). Calling OCIAttrGet() on the describe handle can also return 
+the total number of positions.
+See the section "Describing" on page 2-33 for more information about describe 
+operations.
+Parameters
+TO BE UPDATED
+svchp (IN/OUT) - a service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+objptr (IN) - the name of the object (a null-terminated string) to be 
+described. Only procedure or function names are valid when connected to an 
+Oracle7 Server.
+objptr_len (IN) - the length of the string. Must be non-zero.
+objptr_typ (IN) - Must be OCI_OTYPE_NAME, OCI_OTYPE_REF, or OCI_OTYPE_PTR.
+info_level (IN) - reserved for future extensions. Pass OCI_DEFAULT.
+objtype (IN/OUT) - object type.
+dschp (IN/OUT) - a describe handle that is populated with describe 
+information about the object after the call.
+Related Functions
+OCIAttrGet()
+
+
+
+OCIEnvCreate()
+Name
+OCI ENVironment CREATE
+Purpose
+This function creates and initializes an environment for the rest of
+the OCI functions to work under.  This call is a replacement for both
+the OCIInitialize and OCIEnvInit calls.
+Syntax
+sword OCIEnvCreate  ( OCIEnv        **envhpp, 
+                      ub4           mode, 
+                      CONST dvoid   *ctxp, 
+                      CONST dvoid   *(*malocfp) 
+                                    (dvoid *ctxp, 
+                                        size_t size), 
+                      CONST dvoid   *(*ralocfp) 
+                                    (dvoid *ctxp, 
+                                       dvoid *memptr, 
+                                       size_t newsize), 
+                      CONST void    (*mfreefp) 
+                                    ( dvoid *ctxp, 
+                                       dvoid *memptr))
+                      size_t    xtramemsz,
+                      dvoid     **usrmempp );
+ 
+Comments
+This call creates an environment for all the OCI calls using the modes
+specified by the user. This call can be used instead of the two calls
+OCIInitialize and OCIEnvInit. This function returns an environment handle
+which is then used by the remaining OCI functions. There can be multiple
+environments in OCI each with its own environment modes.  This function 
+also performs any process level initialization if required by any mode.
+For example if the user wants to initialize an environment as OCI_THREADED,
+then all libraries that are used by OCI are also initialized in the
+threaded mode. 
+
+This call should be invoked before anny other OCI call and should be used
+instead of the OCIInitialize and OCIEnvInit calls. This is the recommended
+call, although OCIInitialize and OCIEnvInit calls will still be supported
+for backward compatibility. 
+ 
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+
+Example
+
+Related Functions
+OCIInitialize, OCIEnvInit
+
+OCIEnvNlsCreate()
+Name
+OCI ENVironment CREATE with NLS info
+Purpose
+This function does almost everything OCIEnvCreate does, plus enabling setting
+of charset and ncharset programmatically, except OCI_UTF16 mode.
+Syntax
+sword OCIEnvNlsCreate(OCIEnv        **envhpp,
+                      ub4           mode,
+                      dvoid         *ctxp,
+                      dvoid         *(*malocfp)
+                                    (dvoid *ctxp,
+                                        size_t size),
+                      dvoid         *(*ralocfp)
+                                    (dvoid *ctxp,
+                                       dvoid *memptr,
+                                       size_t newsize),
+                      void          (*mfreefp)
+                                    (dvoid *ctxp,
+                                       dvoid *memptr),
+                      size_t        xtramemsz,
+                      dvoid         **usrmempp,
+                      ub2           charset,
+                      ub2           ncharset)
+Comments
+The charset and ncharset must be both zero or non-zero.
+The parameters have the same meaning as the ones in OCIEnvCreate().
+When charset or ncharset is non-zero, the corresponding character set will
+be used to replace the ones specified in NLS_LANG or NLS_NCHAR. Moreover,
+OCI_UTF16ID is allowed to be set as charset and ncharset.
+On the other hand, OCI_UTF16 mode is deprecated with this function. 
+Applications can achieve the same effects by setting 
+both charset and ncharset as OCI_UTF16ID.
+
+
+OCIEnvInit()
+Name
+OCI INITialize environment
+Purpose
+This call initializes the OCI environment handle.
+Syntax
+sword OCIEnvInit ( OCIEnv    **envp,
+                 ub4       mode,
+                 size_t    xtramemsz,
+                 dvoid     **usrmempp );
+Comments
+Initializes the OCI environment handle. No changes are done on an initialized 
+handle. If OCI_ERROR or OCI_SUCCESS_WITH_INFO is returned, the 
+environment handle can be used to obtain ORACLE specific errors and 
+diagnostics.
+This call is processed locally, without a server round-trip.
+Parameters
+envpp (OUT) - a pointer to a handle to the environment. 
+mode (IN) - specifies initialization of an environment mode. The only valid 
+mode is OCI_DEFAULT for default mode
+xtramemsz (IN) - specifies the amount of user memory to be allocated. 
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user.
+Example
+See the description of OCISessionBegin() on page 13-84 for an example showing 
+the use of OCIEnvInit(). 
+Related Functions
+
+
+
+
+OCIErrorGet()
+Name
+OCI Get Diagnostic Record
+Purpose
+Returns an error message in the buffer provided and an ORACLE error.
+Syntax
+sword OCIErrorGet ( dvoid      *hndlp, 
+                  ub4        recordno,
+                  OraText       *sqlstate,
+                  ub4        *errcodep, 
+                  OraText       *bufp,
+                  ub4        bufsiz,
+                  ub4        type );
+Comments
+Returns an error message in the buffer provided and an ORACLE error. 
+Currently does not support SQL state. This call can be called a multiple 
+number of times if there are more than one diagnostic record for an error.
+The error handle is originally allocated with a call to OCIHandleAlloc().
+Parameters
+hndlp (IN) - the error handle, in most cases, or the environment handle (for 
+errors on OCIEnvInit(), OCIHandleAlloc()).
+recordno (IN) - indicates the status record from which the application seeks 
+info. Starts from 1. 
+sqlstate (OUT) - Not supported in Version 8.0.
+errcodep (OUT) - an ORACLE Error is returned.
+bufp (OUT) - the error message text is returned.
+bufsiz (IN) - the size of the buffer provide to get the error message.
+type (IN) - the type of the handle.
+Related Functions
+OCIHandleAlloc()
+
+OCIExtractInit
+Name
+OCI Extract Initialize 
+Purpose
+This function initializes the parameter manager. 
+Syntax
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+Comments
+It must be called before calling any other parameter manager routine. The NLS 
+information is stored inside the parameter manager context and used in 
+subsequent calls to OCIExtract routines.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractTerm()
+
+OCIExtractTerm
+Name
+OCI Extract Terminate
+Purpose
+This function releases all dynamically allocated storage and may perform 
+other internal bookkeeping functions.
+Syntax
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called when the parameter manager is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+OCIExtractInit()
+
+OCIExtractReset
+Name
+OCI Extract Reset
+Purpose
+The memory currently used for parameter storage, key definition storage, and 
+parameter value lists is freed and the structure is reinitialized.
+Syntax
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+Related Functions
+
+OCIExtractSetNumKeys
+Name
+OCI Extract Set Number of Keys
+Purpose
+Informs the parameter manager of the number of keys that will be registered.
+Syntax
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+Comments
+This routine must be called prior to the first call of OCIExtractSetKey().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (IN) - The number of keys that will be registered with 
+               OCIExtractSetKey().
+Related Functions
+OCIExtractSetKey()
+
+OCIExtractSetKey
+Name
+OCI Extract Set Key definition
+Purpose
+Registers information about a key with the parameter manager.
+Syntax
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name, 
+                       ub1 type, ub4 flag, CONST dvoid *defval,                                        CONST sb4 *intrange, CONST OraText *CONST *strlist);
+Comments
+This routine must be called after calling OCIExtractSetKey() and before 
+calling OCIExtractFromFile() or OCIExtractFromStr().  
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (IN) - The name of the key.
+type (IN) - The type of the key (OCI_EXTRACT_TYPE_INTEGER, 
+            OCI_EXTRACT_TYPE_OCINUM, OCI_EXTRACT_TYPE_STRING, or 
+            OCI_EXTRACT_TYPE_BOOLEAN).
+flag (IN) - Set to OCI_EXTRACT_MULTIPLE if the key can take multiple values 
+            or 0 otherwise.
+defval (IN) - Set to the default value for the key.  May be NULL if there is 
+               no default.  A string default must be a (text*) type, an 
+               integer default must be an (sb4*) type, and a boolean default 
+               must be a (ub1*) type.
+intrange (IN) - Starting and ending values for the allowable range of integer 
+                values.  May be NULL if the key is not an integer type or if 
+                all integer values are acceptable.
+strlist (IN) - List of all acceptable text strings for the key.  May be NULL 
+               if the key is not a string type or if all text values are 
+               acceptable.
+Related Functions
+OCIExtractSetNumKeys()
+
+OCIExtractFromFile
+Name
+OCI Extract parameters From File
+Purpose
+The keys and their values in the given file are processed. 
+Syntax
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag, 
+                         OraText *filename);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+filename (IN) - Null-terminated filename string.
+Related Functions
+
+OCIExtractFromStr
+Name
+OCI Extract parameters From String
+Purpose
+The keys and their values in the given string are processed. 
+Syntax
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+Comments
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+flag (IN) - Zero or has one or more of the following bits set: 
+           OCI_EXTRACT_CASE_SENSITIVE, OCI_EXTRACT_UNIQUE_ABBREVS, or 
+           OCI_EXTRACT_APPEND_VALUES. 
+input (IN) - Null-terminated input string.
+Related Functions
+
+OCIExtractToInt
+Name
+OCI Extract To Integer
+Purpose
+Gets the integer value for the specified key.
+Syntax
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, uword valno, 
+                      sb4 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual integer value.
+Related Functions
+
+OCIExtractToBool
+Name
+OCI Extract To Boolean
+Purpose
+Gets the boolean value for the specified key. 
+Syntax
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname, 
+                       uword valno, ub1 *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual boolean value.
+Related Functions
+
+OCIExtractToStr
+Name
+OCI Extract To String
+Purpose
+Gets the string value for the specified key.
+Syntax
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, OraText *retval, uword buflen);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual null-terminated string value.
+buflen (IN) - The length of the buffer for retval.
+Related Functions
+
+Note: The following OCIExtract functions are unavailable in this release
+
+OCIExtractToOCINum
+Name
+OCI Extract To OCI Number
+Purpose
+Gets the OCINumber value for the specified key.
+Syntax
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+Comments
+The valno'th value (starting with 0) is returned.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, OCI_NO_DATA, or OCI_ERROR. 
+OCI_NO_DATA means that there is no valno'th value for this key.
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+keyname (IN) - Key name.
+valno (IN) - Which value to get for this key.
+retval (OUT) - The actual OCINumber value.
+Related Functions
+
+OCIExtractToList
+Name
+OCI Extract To parameter List
+Purpose
+Generates a list of parameters from the parameter structures that are stored 
+in memory. 
+Syntax
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+Comments
+Must be called before OCIExtractValues() is called.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+numkeys (OUT) - Number of distinct keys stored in memory.
+Related Functions
+OCIExtractFromList()
+
+OCIExtractFromList
+Name
+OCI Extract From parameter List
+Purpose
+Generates a list of values for the a parameter in the parameter list.
+Syntax
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, OraText *name, 
+                         ub1 *type, uword *numvals, dvoid ***values);
+Comments
+Parameters are specified by an index. OCIExtractToList() must be called prior 
+to calling this routine to generate the parameter list from the parameter 
+structures that are stored in memory. 
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN) - The OCI environment or session handle.
+err (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+               err and this function returns OCI_ERROR. Diagnostic information 
+               can be obtained by calling OCIErrorGet().
+name (OUT) - Name of the key for the current parameter.
+type (OUT) - Type of the current parameter (OCI_EXTRACT_TYPE_STRING, 
+             OCI_EXTRACT_TYPE_INTEGER, OCI_EXTRACT_TYPE_OCINUM, or 
+             OCI_EXTRACT_TYPE_BOOLEAN)
+numvals (OUT) - Number of values for this parameter.
+values (OUT) - The values for this parameter.
+Related Functions
+OCIExtractToList()
+
+
+************************  OCIFileClose() ***********************************
+ 
+Name
+ OCIFileClose - Oracle Call Interface FILE i/o CLOSE
+
+Purpose
+ Close a previously opened file.
+
+Syntax
+ sword OCIFileClose ( dvoid             *hndl, 
+             	      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ This function will close a previously opened file. If the function succeeds
+ then OCI_SUCCESS will be returned, else OCI_ERROR. 
+ 
+Parameters
+ hndl  (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen.  
+
+
+
+********************* OCIFileExists() **************************************
+
+Name
+ OCIFileExists - Oracle Call Interface FILE i/o EXIST
+
+Purpose
+ Check to see if the file exists.
+
+Syntax
+ sword OCIFileExists ( dvoid           *hndl, 
+            	      OCIError         *err, 
+                      OraText          *filename,
+                      OraText          *path,
+                      ub1              *flag )
+
+Comments
+ This function will set the flag to TRUE if the file exists else it will
+ be set to FALSE.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR. 
+
+Parameters
+ hndl(IN) - OCI environment or session handle
+ err(OUT) - OCI error handle
+ filename(IN) - filename
+ path(IN) - path of the file
+ flag(OUT) - whether the file exists or not
+
+Related Functions.
+ None.
+     
+
+ **************************** OCIFileFlush() ******************************
+
+
+Name
+ OCIFileFlush - Oracle Call Interface File i/o FLUSH
+
+Purpose
+ Flush the buffers associated with the file to the disk.
+
+Syntax
+ sword OCIFileFlush ( dvoid             *hndl, 
+             	      OCIError          *err,
+                      OCIFileObject     *filep )
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters 
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle
+ filep (IN) - the OCIFile file object
+
+Related Functions
+ OCIFileOpen, OCIFileWrite
+
+
+
+ *************************** OCIFileGetLength() ****************************
+
+Name
+ OCIFileGetLength - Oracle Call Interface FILE i/o GET file LENGTH
+
+Purpose
+ Get the length of a file.
+
+Syntax
+ OCIFileGetLength(dvoid           *hndl, 
+	          OCIError        *err,
+                  OraText         *filename,
+                  OraText         *path,
+                  ubig_ora        *lenp )
+
+Comments
+ The length of the file will be returned in lenp.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filename (IN) - file name.
+ path (IN) - path of the file.
+ lenp (OUT) - On output, it is the length of the file in bytes.
+ is the number of bytes in the file.
+
+Related Functions
+ None.
+
+
+
+******************************** OCIFileInit() *****************************
+   
+Name
+ OCIFileInit - Oracle Call Interface FILE i/o INITialize
+
+Purpose
+ Initialize the OCI File I/O package and create the OCIFile context.
+
+Syntax
+ sword OCIFileInit ( dvoid *hndl, 
+                     OCIError *err)
+
+Comments
+ This function should be called before any of the OCIFile functions are
+ used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure.
+
+Related Functions
+ OCIFileTerm
+     
+
+
+********************************* OCIFileOpen() *****************************
+
+Name
+ OCIFileOpen - Oracle Call Interface File i/o OPEN
+
+Purpose
+     Open a file.
+
+Syntax
+ sword OCIFileOpen ( dvoid               *hndl, 
+	             OCIError            *err,
+                     OCIFileObject      **filep,
+                     OraText             *filename,
+                     OraText             *path,
+                     ub4                  mode,
+                     ub4                  create, 
+                     ub4                  type )
+
+Comments
+ OCIFileOpen returns a handle to the open file in filep if the file is
+ successfully opened. 
+ If one wants to use the standard file objects (stdin, stdout & stderr)
+ then OCIFileOpen whould be called with the type filed containing the 
+ appropriate type (see the parameter type). If any of the standard files 
+ are specified then filename, path, mode and create are ignored.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (OUT) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (OUT) - the file object to be returned.
+ filename (IN) - file name (NULL terminated string).
+ path (IN) - path of the file (NULL terminated string).
+ mode - mode in which to open the file (valid modes are OCI_FILE_READONLY,
+ OCI_FILE_WRITEONLY, OCI_FILE_READ_WRITE).
+ create - should the file be created if it does not exist. Valid values
+ are: 
+     OCI_FILE_TRUNCATE - create a file regardless of whether or not it exists. 
+                        If the file already exists overwrite it.
+     OCI_FILE_EXIST - open it if it exists, else fail.
+     OCI_FILE_EXCL - fail if the file exists, else create.
+     OCI_FILE_CREATE - open the file if it exists, and create it if it doesn't.
+     OCI_FILE_APPEND - set the file pointer to the end of the file prior to 
+                      writing(this flag can be OR'ed with OCI_FILE_EXIST or
+                      OCI_FILE_CREATE).
+type - file type. Valid values are OCI_FILE_TEXT, OCI_FILE_BIN, 
+       OCI_FILE_STDIN, OCI_FILE_STDOUT and OCI_FILE_STDERR.
+       If any of the standard files are specified then filename, path, mode
+       and create are ignored.
+
+Related Functions.
+ OCIFileClose
+
+
+
+************************** OCIFileRead() ************************************
+   
+Name
+ OCIFileRead - Oracle Call Interface FILE i/o READ
+
+Purpose
+ Read from a file into a buffer.
+
+Syntax
+ sword OCIFileRead ( dvoid            *hndl, 
+          	     OCIError         *err,
+                     OCIFileObject    *filep,
+                     dvoid            *bufp,
+                     ub4               bufl,
+                     ub4              *bytesread )
+
+Comments
+ Upto bufl bytes from the file will be read into bufp. The user should
+ allocate memory for the buffer.
+ The number of bytes read would be in bytesread.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a File Object that uniquely references the file.
+ bufp (IN) - the pointer to a buffer into which the data will be read. The 
+ length of the allocated memory is assumed to be bufl. 
+ bufl - the length of the buffer in bytes. 
+ bytesread (OUT) - the number of bytes read.
+
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileWrite
+
+
+
+****************************** OCIFileSeek() ******************************
+
+Name
+ OCIFileSeek - Oracle Call Interface FILE i/o SEEK
+
+Purpose
+ Perfom a seek to a byte position.
+
+Syntax
+ sword OCIFileSeek ( dvoid           *hndl, 
+        	     OCIError        *err,  
+                     OCIFileObject   *filep,
+                     uword            origin,
+                     ubig_ora         offset,
+                     sb1              dir)
+
+Comments
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ origin - The starting point we want to seek from. NOTE: The starting 
+ point may be OCI_FILE_SEEK_BEGINNING (beginning), OCI_FILE_SEEK_CURRENT 
+ (current position), or OCI_FILE_SEEK_END (end of file). 
+ offset - The number of bytes from the origin we want to start reading from. 
+ dir - The direction we want to go from the origin. NOTE: The direction 
+ can be either OCI_FILE_FORWARD or OCI_FILE_BACKWARD. 
+ 
+Related Function
+ OCIFileOpen, OCIFileRead, OCIFileWrite
+
+
+
+*************************** OCIFileTerm() **********************************
+
+Name
+ OCIFileTerm - Oracle Call Interface FILE i/o TERMinate
+
+Purpose
+ Terminate the OCI File I/O package and destroy the OCI File context.
+
+Syntax
+ sword OCIFileTerm ( dvoid *hndl, 
+                     OCIError *err )
+
+Comments
+ After this function has been called no OCIFile function should be used.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+ 
+Parameters
+ hndl(IN) - OCI environment or session handle.
+ err(OUT) - OCI error structure. 
+  
+Related Functions 
+ OCIFileInit   
+ 
+
+********************************* OCIFileWrite() **************************** 
+
+Name 
+ OCIFileWrite - Oracle Call Interface FILE i/o WRITE
+
+Purpose
+  Write data from buffer into a file.
+
+Syntax
+ sword OCIFileWrite ( dvoid            *hndl, 
+            	      OCIError         *err,  
+                      OCIFileObject    *filep,
+                      dvoid            *bufp, 
+                      ub4               buflen
+                      ub4              *byteswritten )
+
+Comments
+ The number of bytes written will be in *byteswritten.
+ The function will return OCI_ERROR if any error is encountered, else
+ it will return OCI_ERROR.
+
+Parameters
+ hndl (IN) - the OCI environment or session handle.
+ err (OUT) - the OCI error handle.  If  there is an error, it is recorded 
+ in err and this function returns OCI_ERROR.  Diagnostic information can be 
+ obtained by calling OCIErrorGet().
+ filep (IN/OUT) - a file handle that uniquely references the file.
+ bufp (IN) - the pointer to a buffer from which the data will be written. 
+ The length of the allocated memory is assumed to be the value passed
+ in bufl. 
+ bufl - the length of the buffer in bytes.
+ byteswritten (OUT) - the number of bytes written.
+ 
+Related Functions
+ OCIFileOpen, OCIFileSeek, OCIFileRead 
+
+
+
+
+
+OCIHandleAlloc() 
+Name
+OCI Get HaNDLe
+Purpose
+This call returns a pointer to an allocated and initialized handle.
+Syntax
+sword OCIHandleAlloc ( CONST dvoid   *parenth,
+                     dvoid         **hndlpp, 
+                     ub4           type, 
+                     size_t        xtramem_sz,
+                     dvoid         **usrmempp);
+Comments
+Returns a pointer to an allocated and initialized structure, corresponding to 
+the type specified in type. A non-NULL handle is returned on success. Bind 
+handle and define handles are allocated with respect to a statement handle. All
+other handles are allocated with respect to an environment handle which is 
+passed in as a parent handle.
+No diagnostics are available on error. This call returns OCI_SUCCESS if 
+successful, or OCI_INVALID_HANDLE if an out-of-memory error occurs.
+Handles must be allocated using OCIHandleAlloc() before they can be passed 
+into an OCI call.
+Parameters
+parenth (IN) - an environment or a statement handle. 
+hndlpp (OUT) - returns a handle to a handle type. 
+type (IN) - specifies the type of handle to be allocated. The specific types 
+are: 
+OCI_HTYPE_ERROR - specifies generation of an error report handle of 
+C type OCIError
+OCI_HTYPE_SVCCTX - specifies generation of a service context handle 
+of C type OCISvcCtx
+OCI_HTYPE_STMT - specifies generation of a statement (application 
+request) handle of C type OCIStmt
+OCI_HTYPE_BIND - specifies generation of a bind information handle 
+of C type OCIBind
+OCI_HTYPE_DEFINE - specifies generation of a column definition 
+handle of C type OCIDefine
+OCI_HTYPE_DESCRIBE  - specifies generation of a select list 
+description handle of C type OCIDesc
+OCI_HTYPE_SERVER - specifies generation of a server context handle 
+of C type OCIServer
+OCI_HTYPE_SESSION - specifies generation of an authentication 
+context handle of C type OCISession
+OCI_HTYPE_TRANS - specifies generation of a transaction context
+handle of C type OCITrans
+OCI_HTYPE_COMPLEXOBJECT - specifies generation of a complex 
+object retrieval handle of C type OCIComplexObject
+OCI_HTYPE_SECURITY - specifies generation of a security handle of C 
+type OCISecurity
+xtramem_sz (IN) - specifies an amount of user memory to be allocated.
+usrmempp (OUT) - returns a pointer to the user memory of size xtramemsz 
+allocated by the call for the user. 
+Related Functions
+OCIHandleFree()
+
+
+
+OCIHandleFree()
+Name
+OCI Free HaNDLe
+Purpose
+This call explicitly deallocates a handle.
+Syntax
+sword OCIHandleFree ( dvoid     *hndlp,
+                    ub4       type);
+Comments
+This call frees up storage associated with a handle, corresponding to the type 
+specified in the type parameter.
+This call returns either OCI_SUCCESS or OCI_INVALID_HANDLE.
+All handles must be explicitly deallocated. OCI will not deallocate a child 
+handle if the parent is deallocated.
+Parameters
+hndlp (IN) - an opaque pointer to some storage.
+type (IN) - specifies the type of storage to be allocated. The specific types are:
+OCI_HTYPE_ENV - an environment handle
+OCI_HTYPE_ERROR - an error report handle
+OCI_HTYPE_SVCCTX - a service context handle
+OCI_HTYPE_STMT - a statement (application request) handle
+OCI_HTYPE_BIND - a bind information handle
+OCI_HTYPE_DEFINE - a column definition handle
+OCI_HTYPE_DESCRIBE  - a select list description handle
+OCI_HTYPE_SERVER - a server handle
+OCI_HTYPE_SESSION - a user authentication handle
+OCI_HTYPE_TRANS - a transaction handle
+OCI_HTYPE_COMPLEXOBJECT - a complex object retrieval handle
+OCI_HTYPE_SECURITY - a security handle
+Related Functions
+OCIHandleAlloc()
+
+
+
+
+OCIInitialize()
+Name
+OCI Process Initialize
+Purpose
+Initializes the OCI process environment.
+Syntax
+sword OCIInitialize ( ub4           mode,
+                    CONST dvoid   *ctxp, 
+                    CONST dvoid   *(*malocfp) 
+                                  ( dvoid *ctxp,
+                                    size_t size ),
+                    CONST dvoid   *(*ralocfp)
+                                  ( dvoid *ctxp,
+                                    dvoid *memp,
+                                    size_t newsize ),
+                    CONST void    (*mfreefp)
+                                  ( dvoid *ctxp,
+                                    dvoid *memptr ));
+Comments
+This call initializes the OCI process environment.
+OCIInitialize() must be invoked before any other OCI call. 
+Parameters
+mode (IN) - specifies initialization of the mode. The valid modes are:
+OCI_DEFAULT - default mode.
+OCI_THREADED - threaded environment. In this mode, internal data 
+structures are protected from concurrent accesses by multiple threads. 
+OCI_OBJECT - will use navigational object interface. 
+ctxp (IN) - user defined context for the memory call back routines. 
+malocfp (IN) - user-defined memory allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory allocation function.
+size - size of memory to be allocated by the user-defined memory 
+allocation function
+ralocfp (IN) - user-defined memory re-allocation function. If mode is 
+OCI_THREADED, this memory allocation routine must be thread safe.
+ctxp - context pointer for the user-defined memory reallocation 
+function.
+memp - pointer to memory block
+newsize - new size of memory to be allocated
+mfreefp (IN) - user-defined memory free function. If mode is 
+OCI_THREADED, this memory free routine must be thread safe.
+ctxp - context pointer for the user-defined memory free function.
+memptr - pointer to memory to be freed
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIInitialize().
+Related Functions
+
+--------------------------------OCITerminate------------------------------------
+
+OCITerminate()
+Name
+OCI process Terminate
+Purpose
+Do cleanup before process termination
+Syntax
+sword OCITerminate (ub4 mode);
+
+Comments
+This call performs  OCI related clean up before the OCI process terminates.
+If the process is running in shared mode then the OCI process is disconnected
+from the shared memory subsystem.
+
+OCITerminate() should be the last OCI call in any process.
+
+Parameters
+mode (IN) - specifies different termination modes.
+
+OCI_DEFAULT - default mode.
+
+Example
+
+Related Functions
+OCIInitialize()
+
+---------------------- OCIIntervalAssign --------------------------------- 
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err, 
+                    CONST OCIInterval *inpinter, OCIInterval *outinter );
+
+  DESCRIPTION
+    Copies one interval to another to create a replica
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpinter - Input Interval 
+    (OUT) outinter - Output Interval 
+  RETURNS
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_SUCCESS otherwise
+
+ ---------------------- OCIIntervalCheck ------------------------------------ 
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+			 ub4 *valid );
+
+  DESCRIPTION
+    Checks the validity of an interval
+  PARAMETERS
+     hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  interval - Interval to be checked 
+    (OUT) valid     - Zero if the interval is valid, else returns an Ored
+	combination of the following codes.
+
+   Macro name                   Bit number      Error
+   ----------                   ----------      -----
+   OCI_INTER_INVALID_DAY         0x1           Bad day
+   OCI_INTER_DAY_BELOW_VALID     0x2           Bad DAy Low/high bit (1=low)
+   OCI_INTER_INVALID_MONTH       0x4           Bad MOnth
+   OCI_INTER_MONTH_BELOW_VALID   0x8           Bad MOnth Low/high bit (1=low)
+   OCI_INTER_INVALID_YEAR        0x10          Bad YeaR
+   OCI_INTER_YEAR_BELOW_VALID    0x20          Bad YeaR Low/high bit (1=low)
+   OCI_INTER_INVALID_HOUR        0x40          Bad HouR
+   OCI_INTER_HOUR_BELOW_VALID    0x80          Bad HouR Low/high bit (1=low)
+   OCI_INTER_INVALID_MINUTE      0x100         Bad MiNute
+   OCI_INTER_MINUTE_BELOW_VALID	 0x200         Bad MiNute Low/high bit(1=low)
+   OCI_INTER_INVALID_SECOND      0x400         Bad SeCond
+   OCI_INTER_SECOND_BELOW_VALID  0x800         bad second Low/high bit(1=low)
+   OCI_INTER_INVALID_FRACSEC     0x1000        Bad Fractional second
+   OCI_INTER_FRACSEC_BELOW_VALID 0x2000        Bad fractional second Low/High
+
+	
+  RETURNS
+    OCI_SUCCESS if interval is okay
+    OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalCompare ----------------------------------- 
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1, 
+			OCIInterval *inter2, sword *result );
+
+  DESCRIPTION
+	Compares two intervals, returns 0 if equal, -1 if inter1 < inter2, 
+      	1 if inter1 > inter2
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter1  (IN)   - Interval to be compared 
+     inter2  (IN)   - Interval to be compared 
+     result  (OUT)  - 	comparison result, 0 if equal, -1 if inter1 < inter2, 
+                	1 if inter1 > inter2
+
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if 
+	the two input datetimes are not mutually comparable.
+
+---------------------- OCIIntervalDivide ------------------------------------ 
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend, 
+		OCINumber *divisor, OCIInterval *result );
+ 
+  DESCRIPTION
+     Divides an interval by an Oracle Number to produce an interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     dividend  (IN)   - Interval to be divided 
+     divisor   (IN)   - Oracle Number dividing `dividend' 
+     result    (OUT)  - resulting interval (dividend / divisor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+
+ ---------------------- OCIIntervalFromNumber -------------------- 
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, 
+               OCIInterval *inter, OCINumber *number);
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (OUT)  interval - Interval to be converted 
+    (IN) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_SUCCESS on success 
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR on error.
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+ ---------------------- OCIIntervalFromText --------------------------------- 
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr, 
+		size_t str_len, OCIInterval *result );
+
+  DESCRIPTION
+    Given an interval string produce the interval represented by the string.
+    The type of the interval is the type of the 'result' descriptor.
+  PARAMETERS
+
+     hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inpstr - Input string 
+    (IN)  str_len - Length of input string 
+    (OUT) result - Resultant interval 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR if
+     	there are too many fields in the literal string
+	the year is out of range (-4713 to 9999)
+  	if the month is out of range (1 to 12)
+ 	if the day of month is out of range (1 to 28...31)
+    	if hour is not in range (0 to 23)
+     	if hour is not in range (0 to 11)
+  	if minute is not in range (0 to 59)
+    	if seconds in minute not in range (0 to 59)
+   	if seconds in day not in range (0 to 86399)
+  	if the interval is invalid
+
+
+ ---------------------- OCIIntervalGetDaySecond -------------------- 
+
+  DESCRIPTION
+     Gets values of day second interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (OUT) - number of days
+        hour    (OUT) - number of hours
+        min     (OUT) - number of mins
+        sec     (OUT) - number of secs
+        fsec    (OUT) - number of fractional seconds
+	result     (IN)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalGetYearMonth -------------------- 
+
+  DESCRIPTION
+     Gets year month from an interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+	year    (OUT)   - year value
+	month   (OUT)   - month value
+	result     (IN)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+
+-------------------------- OCIIntervalAdd ------------------------------
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1, 
+			OCIInterval *addend2, OCIInterval *result );
+NAME OCIIntervalAdd - Adds two intervals 
+PARAMETERS
+hndl (IN) - Session/Env handle. 
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+addend1  (IN)   - Interval to be added 
+addend2  (IN)   - Interval to be added 
+result   (OUT)  - resulting interval (addend1 + addend2) 
+DESCRIPTION
+     Adds two intervals to produce a resulting interval
+RETURNS
+     OCI_SUCCESS on success
+     OCI_ERROR if:
+	the two input intervals are not mutually comparable.
+	the resulting year would go above SB4MAXVAL
+	the resulting year would go below SB4MINVAL
+     OCI_INVALID_HANDLE if 'err' is NULL.
+NOTES
+     The two input intervals must be mutually comparable
+
+ ---------------------- OCIIntervalSubtract ------------------------------- 
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend, 
+			    OCIInterval *subtrahend, OCIInterval *result );
+NAME - OCIIntervalSubtract - subtracts two intervals
+PARAMETERS
+hndl (IN) - Session/Env handle.
+err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+minuend    (IN)   - interval to be subtracted from 
+subtrahend (IN)   - interval subtracted from minuend 
+result     (OUT)  - resulting interval (minuend - subtrahend) 
+DESCRIPTION
+     Subtracts two intervals and stores the result in an interval
+RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+	OCI_ERROR if:
+	   the two input intervals are not mutually comparable.
+	   the resulting leading field would go below SB4MINVAL	
+	   the resulting leading field would go above SB4MAXVAL
+
+---------------------- OCIIntervalMultiply --------------------------------- 
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			OCINumber *nfactor, OCIInterval *result );
+
+  DESCRIPTION
+     Multiplies an interval by an Oracle Number to produce an interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle. 
+     err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+     inter  (IN)   - Interval to be multiplied 
+     nfactor  (IN)   - Oracle Number to be multiplied 
+     result   (OUT)  - resulting interval (ifactor * nfactor) 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR if:
+	the resulting year would go above SB4MAXVAL
+	the resulting year would go below SB4MINVAL
+
+
+ ---------------------- OCIIntervalSetDaySecond -------------------- 
+
+  DESCRIPTION
+     Sets day second interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+        day     (IN) - number of days
+        hour    (IN) - number of hours
+        min     (IN) - number of mins
+        sec     (IN) - number of secs
+        fsec    (IN) - number of fractional seconds
+	result     (OUT)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+ ---------------------- OCIIntervalSetYearMonth -------------------- 
+
+  DESCRIPTION
+     Sets year month interval
+  PARAMETERS
+	hndl (IN) - Session/Env handle.
+        err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().     
+	year    (IN)   - year value
+	month   (IN)   - month value
+	result     (OUT)  - resulting interval 
+  RETURNS
+	OCI_SUCCESS on success
+        OCI_INVALID_HANDLE if 'err' is NULL.
+
+
+----------------------- OCIIntervalToNumber ---------------------------------
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			  OCINumber *number);
+
+  DESCRIPTION
+    Converts an interval to an Oracle Number
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inter - Interval to be converted 
+    (OUT) number - Oracle number result  (in years for YEARMONTH interval
+                     and in days for DAYSECOND)
+  RETURNS
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_SUCCESS on success 
+  NOTES
+    Fractional portions of the date (for instance, minutes and seconds if
+    the unit chosen is hours) will be included in the Oracle number produced.
+    Excess precision will be truncated.
+ 
+------------------------------- OCIIntervalToText -------------------------
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			ub1 lfprec, ub1 fsprec, OraText *buffer, 
+                        size_t buflen, size_t *resultlen );
+
+  DESCRIPTION
+    Given an interval, produces a string representing the interval.
+  PARAMETERS
+     hndl (IN) - Session/Env handle. 
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    (IN)  inter - Interval to be converted 
+    (IN)  lfprec  - Leading field precision. Number of digits used to
+                represent the leading field.
+    (IN)  fsprec  - Fractional second precision of the interval. Number of
+                digits used to represent the fractional seconds.
+    (OUT) buffer - buffer to hold result 
+    (IN)  buflen - length of above buffer 
+    (OUT) resultlen - length of result placed into buffer 
+ 
+  RETURNS
+    OCI_SUCCESS on success
+    OCI_INVALID_HANDLE if 'err' is NULL.
+    OCI_ERROR 
+    	if the buffer is not large enough to hold the result
+  NOTES
+    The interval literal will be output as `year' or `[year-]month' for
+    YEAR-MONTH intervals and as `seconds' or `minutes[:seconds]' or
+    `hours[:minutes[:seconds]]' or `days[ hours[:minutes[:seconds]]]' for
+    DAY-TIME intervals (where optional fields are surrounded by brackets).
+
+ ---------------------- OCIIntervalFromTZ -------------------- 
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+                        size_t str_len, OCIInterval *result);
+
+  DESCRIPTION
+    Retuns an OCI_DTYPE_INTERVAL_DS OCIInterval with the region id (if
+    the region is specified in the input string) set and the current
+    absolute offset or an absolut offset with the region id set to 0.
+  PARAMETERS
+    hndl (IN) - Session/Env handle.
+    err (IN/OUT) - error handle. If there is an error, it is
+                recorded in 'err' and this function returns OCI_ERROR.
+                The error recorded in 'err' can be retrieved by calling
+                OCIErrorGet().
+    inpstring (IN) - pointer to the input string
+    str_len (IN) - inpstring length
+    result - Output Interval 
+  RETURNS
+     OCI_SUCCESS on success
+     OCI_INVALID_HANDLE if 'err' is NULL.
+     OCI_ERROR on error
+        Bad interval type
+        Timezone errors
+  NOTES
+     The input string must be of the form [+/-]TZH:TZM or 'TZR [TZD]'
+
+OCILdaToSvcCtx()
+Name
+OCI toggle version 7 Lda_Def to SerVice context handle
+Purpose
+Converts a V7 Lda_Def to a V8 service context handle.
+Syntax
+sword OCILdaToSvcCtx ( OCISvcCtx  **svchpp,
+                     OCIError   *errhp,
+                     Lda_Def    *ldap );
+Comments
+Converts a V7 Lda_Def to a V8 service context handle. The action of this call 
+can be reversed by passing the resulting service context handle to the 
+OCISvcCtxToLda() function.
+Parameters
+svchpp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+ldap (IN/OUT) - the V7 logon data area returned by OCISvcCtxToLda() from 
+this service context.
+Related Functions
+OCISvcCtxToLda()
+
+
+
+
+OCILobAppend()
+
+Name
+OCI Lob APpend
+
+Purpose
+Appends a LOB value at the end of another LOB. 
+
+Syntax
+sword OCILobAppend ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp );
+Comments
+Appends a LOB value at the end of LOB. The data is 
+copied from the source to the destination at the end of the destination. The 
+source and the destination must already exist. The destination LOB is 
+extended to accommodate the newly written data.
+
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+
+Related Functions
+OCILobTrim()
+OCIErrorGet()
+OCILobWrite()
+OCILobCopy()
+
+
+
+OCILobAssign()
+
+Name
+OCI Lob ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobAssign ( OCIEnv                *envhp, 
+                     OCIError              *errhp, 
+                     CONST OCILobLocator   *src_locp, 
+                     OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note: The only difference between this and OCILobLocatorAssign is that this
+takes an environment handle whereas OCILobLocatorAssign takes an OCI service
+handle
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobLocatorAssign()
+
+
+OCILobCharSetForm()
+
+Name
+OCI Lob Get Character Set Form
+
+Purpose
+Gets the LOB locator's character set fpr,, if any.
+
+Syntax
+sword OCILobCharSetForm ( OCIEnv                    *envhp, 
+                          OCIError                  *errhp, 
+                          CONST OCILobLocator       *locp, 
+                          ub1                       *csfrm );
+
+Comments
+Returns the character set form of the input LOB locator in the csfrm output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set form.
+csfrm(OUT) - character set form of the input LOB locator.  If the input 
+locator is for a BLOB or a BFILE, csfrm is set to 0 since there is no concept 
+of a character set for binary LOBs/FILEs.  The caller must allocate space for 
+the csfrm (ub1) and not write into the space.
+See also
+OCIErrorGet(), OCILobCharSetId(), OCILobLocatorIsInit
+
+
+
+OCILobCharSetId()
+
+Name
+OCI Lob get Character Set IDentifier
+
+Purpose
+Gets the LOB locator's character set ID, if any.
+
+Syntax
+sword OCILobCharSetId ( OCIEnv                    *envhp, 
+                        OCIError                  *errhp, 
+                        CONST OCILobLocator       *locp, 
+                        ub2                       *csid );
+
+Comments
+Returns the character set ID of the input LOB locator in the cid output 
+parameter. 
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - LOB locator for which to get the character set ID.
+csid (OUT) - character set ID of the input LOB locator.  If the input locator 
+is for a BLOB or a BFILE, csid is set to 0 since there is no concept of a 
+character set for binary LOBs/FILEs.  The caller must allocate space for the 
+character set id of type ub2 and not write into the space.
+
+See also
+OCIErrorGet(), OCILobCharSetForm(), OCILobLocatorIsInit()
+
+
+
+OCILobCopy()
+
+Name
+OCI Lob Copy
+
+Purpose
+Copies a portion of a LOB value into another LOB value.
+
+Syntax
+sword OCILobCopy ( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *dst_locp,
+                   OCILobLocator    *src_locp,
+                   ub4              amount,
+                   ub4              dst_offset,
+                   ub4              src_offset );
+
+Comments
+Copies a portion of a LOB value into another LOB as specified. The data 
+is copied from the source to the destination. The source (src_locp) and the 
+destination (dlopb) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination LOB. 
+src_locp (IN/OUT) - a locator uniquely referencing the source LOB. 
+amount (IN) - the number of character or bytes, as appropriate, to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB, for binary LOBs it is the number of bytes. Starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim()
+
+OCILobCreateTemporary()
+
+Name
+OCI Lob Create Temporary
+
+Purpose
+Create a Temporary Lob
+
+Syntax
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+Comments
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator which points to the temporary Lob
+csid (IN) - the character set id
+csfrm(IN) - the character set form
+lobtype (IN) - the lob type - one of the three constants OCI_TEMP_BLOB, 
+               OCI_TEMP_CLOB and OCI_TEMP_NCLOB
+cache(IN)-  TRUE if the temporary LOB goes through the cache; FALSE, if not.
+duration(IN)- duration of the temporary LOB; Can be a valid duration id or one 
+              of the values: OCI_DURATION_SESSION, OCI_DURATION_CALL
+              Note: OCI_DURATION_TRANSACTION is NOT supported in 8.1
+Related functions
+OCILobFreeTemporary()
+OCILobIsTemporary()
+
+OCILobDisableBuffering()
+
+Name
+OCI Lob Disable Buffering
+
+Purpose
+Disable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobDisableBuffering ( OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+Comments
+
+Disable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is *not* used.  Note that this call does *not*
+implicitly flush the changes made in the buffering subsystem.  The 
+user must explicitly call OCILobFlushBuffer() to do this.
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobEnableBuffering()
+OCIErrorGet()
+OCILobFlushBuffer()
+
+
+
+
+OCILobEnableBuffering()
+
+Name
+OCI Lob Enable Buffering
+
+Purpose
+Enable lob buffering for the input locator.
+
+
+Syntax
+sword OCILobEnableBuffering ( OCISvcCtx      *svchp,
+                              OCIError       *errhp,
+                              OCILobLocator  *locp);
+
+Comments
+
+Enable lob buffering for the input locator.  The next time data is
+read/written from/to the lob through the input locator, the lob
+buffering subsystem is used.  
+
+Once lob buffering is enabled for a locator, if that locator is passed to 
+one of the following routines, an error is returned:
+        OCILobCopy, OCILobAppend, OCILobErase, OCILobGetLength, OCILobTrim
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+
+Related Functions
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+OCILobFlushBuffer()
+
+
+
+
+OCILobErase()
+
+Name
+OCI Lob ERase
+
+Purpose
+Erases a specified portion of the LOB data starting at a specified offset.
+
+Syntax
+sword OCILobErase ( OCISvcCtx       *svchp,
+                  OCIError        *errhp,
+                  OCILobLocator   *locp,
+                  ub4             *amount,
+                  ub4             offset );
+
+Comments
+Erases a specified portion of the LOB data starting at a specified offset.
+The actual number of characters/bytes erased is returned. The actual number 
+of characters/bytes and the requested number of characters/bytes will differ 
+if the end of the LOB data is reached before erasing the requested number of 
+characters/bytes.
+If a section of data from the middle of the LOB data is erased, a hole is 
+created. When data from that hole is read, 0's are returned. If the LOB is
+NULL, this routine will indicate that 0 characters/bytes were erased.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - the LOB for which to erase a section of data.
+amount (IN/OUT) - On IN, the number of characters/bytes to erase. On OUT, 
+the actual number of characters/bytes erased.
+offset (IN) - absolute offset from the beginning of the LOB data from which 
+to start erasing data. Starts at 1.
+
+See Also
+OCIErrorGet(), OCILobRead(), OCILobWrite()
+
+OCILobOpen()
+
+Name
+OCI Lob Open
+
+Purpose
+Opens an internal or external Lob.
+
+Syntax
+sword OCILobOpen( OCISvcCtx        *svchp,
+                  OCIError         *errhp,
+                  OCILobLocator    *locp,
+                  ub1               mode );
+
+Comments
+It is an error if the same lob is opened more than once in
+the same transaction. Lobs are opened implicitly if they are
+not opened before using them. A LOB has to be closed before
+the transaction commits else the transaction is rolled back.
+Open locators are closed if the transaction aborts. Multiple 
+users can open the same lob on different locators.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - locator points to the LOB to be opened
+mode (IN) - mode in which to open the lob. The valid modes are
+read-only - OCI_FILE_READONLY, read-write - OCI_FILE_READWRITE 
+
+OCILobClose()
+
+Name
+OCI Lob Close
+
+Purpose
+Closes an open internal or external Lob.
+
+Syntax
+sword OCILobClose( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp );
+
+
+Comments
+It is an error if the lob is not open at this time. All LOBs
+that have been opened in a transaction have to be closed 
+before the transaction commits, else the transaction gets
+rolled back.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp  (IN)  - A locator that was opened using OCILobOpen()
+
+
+OCILobFileClose()
+
+Name
+OCI Lob File CLoSe
+
+Purpose
+Closes a previously opened FILE.
+
+Syntax
+sword OCILobFileClose ( OCISvcCtx            *svchp,
+                        OCIError             *errhp,
+                        OCILobLocator        *filep );
+
+Comments
+Closes a previously opened FILE. It is an error if this function is called for
+an internal LOB. No error is returned if the FILE exists but is not opened.
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - a pointer to a FILE locator to be closed.
+
+See Also
+OCIErrorGet(), OCILobFileOpen(), OCILobFileCloseAll(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileCloseAll()
+
+Name
+OCI LOB FILE Close All
+
+Purpose
+Closes all open FILEs on a given service context.
+
+Syntax
+sword OCILobFileCLoseAll ( OCISvcCtx *svchp, 
+                           OCIError  *errhp );
+
+Comments
+Closes all open FILEs on a given service context.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+
+See also
+OCILobFileClose(),
+OCIErrorGet(), OCILobFileOpen(), OCILobFileIsOpen(),
+OCILobFileExists(), CREATE DIRECTORY DDL
+
+
+
+
+OCILobFileExists()
+
+Name
+OCI LOB FILE exists
+
+Purpose
+Tests to see if the FILE exists on the server
+
+Syntax
+sword OCILobFileExists ( OCISvcCtx     *svchp,
+                         OCIError      *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if a FILE exists for on the server.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, 
+it is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator that refers to the file.
+flag (OUT) - returns TRUE if the FILE exists; FALSE if it does not.
+
+See also
+OCIErrorGet, CREATE DIRECTORY (DDL)
+
+
+
+
+OCILobFileGetName()
+
+Name
+OCI LOB FILE Get file Name
+
+Purpose
+Gets the FILE locator's directory alias and file name.
+
+Syntax
+sword OCILobFileGetName ( OCIEnv                   *envhp,
+                          OCIError                 *errhp, 
+                          CONST OCILobLocator      *filep, 
+                          OraText                     *dir_alias,
+                          ub2                      *d_length, 
+                          OraText                     *filename, 
+                          ub2                      *f_length );
+
+Comments
+Returns the directory alias and file name associated with this file locator.  
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) -The OCI error handle. If there is an error, it is recorded in 
+errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filep (IN) - FILE locator for which to get the directory alias and file name.
+dir_alias (OUT) - buffer into which the directory alias name is placed. The 
+caller must allocate enough space for the directory alias name and must not 
+write into the space.
+d_length (IN/OUT)                 
+        - IN: length of the input dir_alias string;
+        - OUT: length of the returned dir_alias string.
+filename (OUT) - buffer into which the file name is placed. The caller must 
+allocate enough space for the file name and must not write into the space.
+f_length (IN/OUT) 
+        - IN: length of the input filename string;
+         - OUT: lenght of the returned filename string.
+
+See also
+OCILobFileSetName(), OCIErrorGet()
+
+
+
+
+OCILobFileIsOpen()
+
+Name
+OCI LOB FILE Is Open?
+
+Purpose
+Tests to see if the FILE is open
+
+Syntax
+sword OCILobFileIsOpen ( OCISvcCtx *svchp,
+                         OCIError  *errhp,
+                         OCILobLocator *filep,
+                         boolean       *flag );
+
+Comments
+Checks to see if the FILE on the server is open for a given LobLocator.
+
+Parameters
+svchp (IN) - the OCI service context handle.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+filep (IN) - pointer to the FILE locator being examined. If the input file 
+locator was never passed to OCILobFileOpen(), the file is considered not to 
+be opened by this locator. However, a different locator may have opened the 
+file. More than one file opens can be performed on the same file using 
+different locators.
+flag (OUT) - returns TRUE if the FILE is opened using this locator; FALSE if 
+it is not. 
+
+See also
+OCIErrorGet, OCILobFileOpen, OCILobFileClose, OCILobFileCloseAll, CREATE 
+DIRECTORY SQL command
+
+
+OCILobFileOpen()
+
+Name
+OCI LOB FILE open
+
+Purpose
+Opens a FILE for read-only access
+
+Syntax
+sword OCILobFileOpen ( OCISvcCtx            *svchp,
+                     OCIError             *errhp,
+                     OCILobLocator        *filep,
+                     ub1                  mode );
+
+Comments
+Opens a FILE. The FILE can be opened for read-only access only. FILEs may not 
+be written to throough ORACLE.
+
+Parameters 
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+filep (IN/OUT) - the FILE to open. Error if the locator does not refer to a 
+FILE. 
+mode (IN) - mode in which to open the file. The only valid mode is 
+read-only - OCI_FILE_READONLY. 
+
+See Also
+OCILobFileClose, OCIErrorGet, OCILobFileCloseAll, OCILobFileIsOpen, 
+OCILobFileSetName, CREATE DIRECTORY 
+
+
+
+
+OCILobFileSetName()
+
+Name
+OCI Lob File Set NaMe
+
+Purpose
+Sets directory alias and file name in the FILE locator.
+
+Syntax
+sword OCILobFileSetName ( OCIEnv             *envhp,
+                          OCIError           *errhp,
+                          OCILobLocator      **filepp,
+                          OraText               *dir_alias,
+                          ub2                d_length, 
+                          OraText               *filename, 
+                          ub2                f_length );
+Comments
+Sets the directory alias and file name in the LOB file locator.  
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+filepp (IN/OUT) - FILE locator for which to set the directory alias name.
+The caller must have already allocated space for the locator by calling
+OCIDescriptorAlloc().
+dir_alias (IN) - buffer that contains the directory alias name to set in the 
+locator.
+d_length (IN) - length of the input dir_alias parameter.
+filename (IN) - buffer that contains the file name is placed.
+f_length (IN) - length of the input filename parameter.
+See also
+OCILobFileGetName, OCIErrorGet, CREATE DIRECTORY
+
+
+
+
+OCILobFlushBuffer()
+
+Name
+OCI Lob Flush all Buffers for this lob.
+
+Purpose
+Flush/write all buffers for this lob to the server.
+
+
+Syntax
+sword OCILobFlushBuffer ( OCISvcCtx       *svchp,
+                          OCIError        *errhp,
+                          OCILobLocator   *locp,
+                          ub4              flag);
+
+Comments
+
+Flushes to the server, changes made to the buffering subsystem that 
+are associated with the lob referenced by the input locator.  This 
+routine will actually write the data in the buffer to the lob in 
+the database.  Lob buffering must have already been enabled for the 
+input lob locator.
+
+This routine, by default, does not free the buffer resources for
+reallocation to another buffered LOB operation. However, if you
+want to free the buffer explicitly, you can set the flag parameter
+to OCI_LOB_BUFFER_FREE.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB. 
+flag    (IN)     - to indicate if the buffer resources need to be freed
+                   after a flush. Default value is OCI_LOB_BUFFER_NOFREE.
+                   Set it to OCI_LOB_BUFFER_FREE if you want the buffer
+                   resources to be freed.
+Related Functions
+OCILobEnableBuffering()
+OCILobDisableBuffering()
+OCIErrorGet()
+OCILobWrite()
+OCILobRead()
+
+
+OCILobFreeTemporary()
+
+Name
+OCI Lob Free Temporary
+
+Purpose
+Free a temporary LOB
+
+Syntax
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp);
+
+Comments
+  Frees the contents of the temporary Lob this locator is pointing to. Note
+  that the locator itself is not freed until a OCIDescriptorFree is done.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a locator uniquely referencing the LOB
+
+Related functions
+OCILobCreateTemporary()
+OCILobIsTemporary()
+
+
+Name
+OCI Lob/File Get Chunk Size
+
+Purpose
+When creating the table, the user can specify the chunking factor, which can
+be a multiple of Oracle blocks. This corresponds to the chunk size used by the
+LOB data layer when accessing/modifying the LOB value. Part of the chunk is
+used to store system-related information and the rest stores the LOB value.
+This function returns the amount of space used in the LOB chunk to store 
+the LOB value.
+
+Syntax
+sword OCILobGetChunkSize ( OCISvcCtx      *svchp,
+                           OCIError       *errhp,
+                           OCILobLocator  *locp,
+                           ub4            *chunksizep );
+
+Comments
+ Performance will be improved if the user issues read/write
+requests using a multiple of this chunk size. For writes, there is an added 
+benefit since LOB chunks are versioned and, if all writes are done on chunk
+basis, no extra/excess versioning is done nor duplicated. Users could batch 
+up the write until they have enough for a chunk instead of issuing several
+write calls for the same chunk.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+chunksizep (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+
+OCILobGetLength()
+
+Name
+OCI Lob/File Length
+
+Purpose
+Gets the length of a LOB/FILE. 
+
+Syntax
+sword OCILobGetLength ( OCISvcCtx      *svchp,
+                        OCIError       *errhp,
+                        OCILobLocator  *locp,
+                        ub4            *lenp );
+
+Comments
+Gets the length of a LOB/FILE. If the LOB/FILE is NULL, the length is 
+undefined.
+
+Parameters
+svchp (IN) - the service context handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. For internal
+LOBs, this locator must be a locator that was obtained from the server 
+specified by svchp. For FILEs, this locator can be initialized by a Select or
+OCILobFileSetName.
+lenp (OUT) - On output, it is the length of the LOB if not NULL - for 
+character LOBs it is the number of characters, for binary LOBs it is the 
+number of bytes in the LOB.
+
+Related Functions
+OCIErrorGet, OCIFileSetName
+
+
+
+OCILobIsEqual()
+
+Name
+
+OCI Lob Is Equal
+
+Purpose
+Compares two LOB locators for equality.
+
+Syntax
+sword OCILobIsEqual ( OCIEnv                  *envhp,
+                      CONST OCILobLocator     *x,
+                      CONST OCILobLocator     *y,
+                      boolean                 *is_equal );
+
+Comments
+Compares the given LOB locators for equality.  Two LOB locators are equal if 
+and only if they both refer to the same LOB data.
+Two NULL locators are considered not equal by this function.
+Parameters
+envhp (IN) - the OCI environment handle.
+x (IN) - LOB locator to compare.
+y (IN) - LOB locator to compare.
+is_equal (OUT) - TRUE, if the LOB locators are equal; FALSE if they are not.
+
+See also
+OCILobAssign, OCILobLocatorIsInit
+OCILobLocatorAssign,
+OCILobIsOpen()
+
+Name
+
+OCI Lob Is Open
+sword OCILobIsOpen(svchp, errhp, locp, flag)
+OCISvcCtx     *svchp;
+OCIError      *errhp;
+OCILobLocator *locp;
+boolean       *flag;
+
+Comments
+   Checks if the LOB locator was opened before. flag is set to TRUE
+   if opened; FALSE otherwise 
+
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+flag(OUT) - TRUE, if the LOB locator points to is open
+                    FALSE, if not.
+
+OCILobIsTemporary()
+
+Name
+
+OCI Lob Is Temporary
+
+Purpose
+  Tests if this locator points to a temporary LOB
+
+Syntax
+sword OCILobIsTemporary(OCIEnv            *envhp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+Comments
+Tests the locator to determine if it points to a temporary LOB.
+If so, is_temporary is set to TRUE. If not, is_temporary is set
+to FALSE.
+
+Parameters
+envhp (IN) - the environment handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN) - the locator to test for temporary LOB
+is_temporary(OUT) - TRUE, if the LOB locator points to a temporary LOB;
+                    FALSE, if not.
+
+See Also
+OCILobCreateTemporary, OCILobFreeTemporary
+
+
+OCILobLoadFromFile()
+
+Name
+OCI Lob Load From File
+
+Purpose
+Load/copy all or a portion of the file into an internal LOB.
+
+Syntax
+sword OCILobLoadFromFile ( OCISvcCtx        *svchp,
+                           OCIError         *errhp,
+                           OCILobLocator    *dst_locp,
+                           OCILobLocator    *src_filep,
+                           ub4              amount,
+                           ub4              dst_offset,
+                           ub4              src_offset );
+
+Comments
+Loads/copies a portion or all of a file value into an internal LOB as 
+specified.  The data is copied from the source file to the destination 
+internal LOB (BLOB/CLOB).  No character set conversions are performed 
+when copying the bfile data to a clob/nclob.  The bfile data must already
+be in the same character set as the clob/nclob in the database.  No
+error checking is performed to verify this.
+The source (src_filep) and the destination (dst_locp) LOBs must already exist.
+If the data already exists at the destination's start position, it is 
+overwritten with the source data. If the destination's start position is 
+beyond the end of the current data, a hole is created from the end of the data
+to the beginning of the newly written data from the source. The destination 
+LOB is extended to accommodate the newly written data if it extends 
+beyond the current length of the destination LOB. 
+It is an error to extend the destination LOB beyond the maximum length 
+allowed or to try to copy from a NULL LOB.
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+dst_locp (IN/OUT) - a locator uniquely referencing the destination internal 
+LOB which may be of type blob, clob, or nclob. 
+src_filep (IN/OUT) - a locator uniquely referencing the source BFILE. 
+amount (IN) - the number of bytes to be copied.
+dst_offset (IN) - this is the absolute offset for the destination LOB. 
+For character LOBs it is the number of characters from the beginning of the 
+LOB at which to begin writing. For binary LOBs it is the number of bytes from 
+the beginning of the lob from which to begin reading. The offset starts at 1.
+src_offset (IN) - this is the absolute offset for the source BFILE.  It is 
+the number of bytes from the beginning of the LOB.  The offset starts at 1.
+
+See Also 
+OCIErrorGet(), OCILobAppend(), OCILobWrite(), OCILobTrim(), OCILobCopy()
+
+OCILobLocatorAssign()
+
+Name
+OCI Lob LOCATOR ASsiGn
+
+Purpose
+Assigns one LOB/FILE locator to another.
+
+Syntax
+sword OCILobLocatorAssign ( OCISvcCtx             *svchp, 
+                            OCIError              *errhp, 
+                            CONST OCILobLocator   *src_locp, 
+                            OCILobLocator         **dst_locpp );
+
+Comments
+Assign source locator to destination locator.  After the assignment, both 
+locators refer to the same LOB data.  For internal LOBs, the source locator's 
+LOB data gets copied to the destination locator's LOB data only when the 
+destination locator gets stored in the table.  Therefore, issuing a flush of 
+the object containing the destination locator will copy the LOB data. For 
+FILEs only the locator that refers to the OS file is copied to the table. The
+OS file is not copied.
+Note : the only difference between this and OCILobAssign is that this takes
+a OCI service handle pointer instead of a OCI environment handle pointer
+
+Parameters
+svchp (IN/OUT) - OCI service handle initialized in object mode.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded 
+in errhp and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+src_locp (IN) - LOB locator to copy from.
+dst_locpp (IN/OUT) - LOB locator to copy to.  The caller must allocate space 
+for the OCILobLocator by calling OCIDescriptorAlloc().
+
+See also
+OCIErrorGet()
+OCILobIsEqual()
+OCILobLocatorIsInit()
+OCILobAssign()
+
+
+
+
+OCILobLocatorIsInit()
+
+Name
+OCI LOB locator is initialized?
+
+Purpose
+Tests to see if a given LOB locator is initialized.
+
+Syntax
+sword OCILobLocatorIsInit ( OCIEnv   *envhp,
+                            OCIError *errhp,
+                            CONST OCILobLocator *locp,
+                            boolean *is_initialized );
+
+Comments
+Tests to see if a given LOB locator is initialized.
+
+Parameters
+envhp (IN/OUT) - OCI environment handle initialized in object mode.
+errhp (IN/OUT) - error handle. The OCI error handle. If there is an error, it 
+is recorded in err and this function returns OCI_ERROR. Diagnostic 
+information can be obtained by calling OCIErrorGet().
+locp (IN) - the LOB locator being tested
+is_initialized (OUT) - returns TRUE if the given LOB locator is initialized; 
+FALSE if it is not.
+
+See also
+OCIErrorGet, OCILobIsEqual
+
+
+
+
+OCILobRead()
+
+Name
+OCI Lob/File ReaD
+
+Purpose
+Reads a portion of a LOB/FILE as specified by the call into a buffer. 
+
+Syntax
+sword OCILobRead ( OCISvcCtx       *svchp,
+                   OCIError        *errhp,
+                   OCILobLocator   *locp,
+                   ub4             offset,
+                   ub4             *amtp,
+                   dvoid           *bufp,
+                   ub4             bufl,
+                   dvoid           *ctxp,  
+                   OCICallbackLobRead (cbfp)
+                                   (
+                                    dvoid         *ctxp,
+                                    CONST dvoid   *bufp,
+                                    ub4           len,
+                                    ub1           piece )
+                   ub2             csid,
+                   ub1             csfrm );
+
+Comments
+Reads a portion of a LOB/FILE as specified by the call into a buffer. Data 
+read from a hole is returned as 0s. It is an error to try to read from a NULL
+LOB/FILE. The OS FILE must already exist on the server and must have been 
+opened using the input locator. Oracle must hav epermission to read the OS 
+file and user must have read permission on the directory object.
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in the 
+number of characters from the beginning of the LOB, for binary LOBs it is the 
+number of bytes. Starts from 1.
+amtp (IN/OUT) - On input, the number of character or bytes to be read. On 
+output, the actual number of bytes or characters read. 
+If the amount of bytes to be read is larger than the buffer length it is 
+assumed that the LOB is being read in a streamed mode. On input if this value 
+is 0, then the data shall be read in streamed mode from the LOB until the end 
+of LOB. If the data is read in pieces, *amtp always contains the length of 
+the last piece read.  If a callback function is defined, then this callback 
+function will be invoked each time bufl bytes are read off the pipe. Each 
+piece will be written into bufp.
+If the callback function is not defined, then OCI_NEED_DATA error code will 
+be returned. The application must invoke the LOB read over and over again to 
+read more pieces of the LOB until the OCI_NEED_DATA error code is not 
+returned. The buffer pointer and the length can be different in each call 
+if the pieces are being read into different sizes and location. 
+bufp (IN) - the pointer to a buffer into which the piece will be read. The 
+length of the allocated memory is assumed to be bufl. 
+bufl (IN) - the length of the buffer in octets. 
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece. If 
+this is NULL, then OCI_NEED_DATA will be returned for each piece. 
+The callback function must return OCI_CONTINUE for the read to continue. 
+If any other error code is returned, the LOB read is aborted. 
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN) - a buffer pointer for the piece.
+  len (IN) - the length of length of current piece in bufp.
+  piece (IN) - which piece - OCI_FIRST_PIECE, OCI_NEXT_PIECE or 
+  OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCILobFileOpen, OCILobFileSetName, CREATE DIRECTORY
+
+
+
+
+OCILobTrim()
+
+Name
+
+OCI Lob  Trim
+
+Purpose
+Trims the lob value to a shorter length
+
+Syntax
+sword OCILobTrim ( OCISvcCtx       *svchp,
+                 OCIError        *errhp,
+                 OCILobLocator   *locp,
+                 ub4             newlen );
+
+Comments
+Truncates LOB data to a specified shorter length. 
+
+Parameters
+svchp (IN) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references the LOB. This locator 
+must be a locator that was obtained from the server specified by svchp. 
+newlen (IN) - the new length of the LOB data, which must be less than or equal
+to the current length. 
+
+Related Functions
+OCIErrorGet, OCILobWrite, OCiLobErase, OCILobAppend, OCILobCopy
+
+
+
+
+
+OCILobWrite()
+
+Name
+OCI Lob Write
+
+Purpose
+Writes a buffer into a LOB
+
+Syntax
+sword OCILobWrite ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             offset,
+                    ub4             *amtp,
+                    dvoid           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    dvoid           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    dvoid    *ctxp,
+                                    dvoid    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer into a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to 
+the pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWrite() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWrite() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+offset (IN) - On input, it is the absolute offset, for character LOBs in 
+the number of characters from the beginning of the LOB, for binary LOBs it 
+is the number of bytes. Starts at 1.
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. 
+Even if the data is being written in pieces, bufp must contain the first 
+piece of the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in 
+a piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+OCILobWriteAppend()
+
+Name
+OCI Lob Write Append
+
+Purpose
+Writes data to the end of a LOB value. This call provides the ability
+to get the length of the data and append it to the end of the LOB in
+a single round trip to the server.
+
+Syntax
+sword OCILobWriteAppend ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCILobLocator   *locp,
+                    ub4             *amtp,
+                    dvoid           *bufp, 
+                    ub4             buflen,
+                    ub1             piece,
+                    dvoid           *ctxp,  
+                    OCICallbackLobWrite   (cbfp)
+                                    (
+                                    dvoid    *ctxp,
+                                    dvoid    *bufp,
+                                    ub4      *lenp,
+                                    ub1      *piecep ) 
+                    ub2             csid
+                    ub1             csfrm );
+
+
+Comments
+Writes a buffer to the end of a LOB as specified. If LOB data already exists 
+it is overwritten with the data stored in the buffer.
+The buffer can be written to the LOB in a single piece with this call, or
+it can be provided piecewise using callbacks or a standard polling method.
+If this value of the piece parameter is OCI_FIRST_PIECE, data must be 
+provided through callbacks or polling.
+If a callback function is defined in the cbfp parameter, then this callback 
+function will be invoked to get the next piece after a piece is written to the 
+pipe. Each piece will be written from bufp.
+If no callback function is defined, then OCILobWriteAppend() returns the 
+OCI_NEED_DATA error code. The application must all OCILobWriteAppend() again 
+to write more pieces of the LOB. In this mode, the buffer pointer and the 
+length can be different in each call if the pieces are of different sizes and 
+from different locations. A piece value of OCI_LAST_PIECE terminates the 
+piecewise write. 
+
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+locp (IN/OUT) - a LOB locator that uniquely references a LOB. 
+bufp (IN) - the pointer to a buffer from which the piece will be written. The 
+length of the allocated memory is assumed to be the value passed in bufl. Even 
+if the data is being written in pieces, bufp must contain the first piece of 
+the LOB when this call is invoked.
+bufl (IN) - the length of the buffer in bytes.
+Note: This parameter assumes an 8-bit byte. If your platform uses a 
+longer byte, the value of bufl must be adjusted accordingly.
+piece (IN) - which piece of the buffer is being written. The default value for
+this parameter is OCI_ONE_PIECE, indicating the buffer will be written in a 
+single piece.
+The following other values are also possible for piecewise or callback mode: 
+OCI_FIRST_PIECE, OCI_NEXT_PIECE and OCI_LAST_PIECE.
+amtp (IN/OUT) - On input, takes the number of character or bytes to be 
+written. On output, returns the actual number of bytes or characters written. 
+If the data is written in pieces, *amtp will contain the total length of the 
+pieces written at the end of the call (last piece written) and is undefined in
+between. 
+(Note it is different from the piecewise read case)
+ctxp (IN) - the context for the call back function. Can be NULL.
+cbfp (IN) - a callback that may be registered to be called for each piece in a 
+piecewise write. If this is NULL, the standard polling method will be used.
+The callback function must return OCI_CONTINUE for the write to continue. 
+If any other error code is returned, the LOB write is aborted. The 
+callback takes the following parameters:
+  ctxp (IN) - the context for the call back function. Can be NULL.
+  bufp (IN/OUT) - a buffer pointer for the piece.
+  lenp (IN/OUT) - the length of the buffer (in octets) and the length of 
+  current piece in bufp (out octets).
+  piecep (OUT) - which piece - OCI_NEXT_PIECE or OCI_LAST_PIECE.
+csid - the character set ID of the buffer data
+csfrm - the character set form of the buffer data
+Related Functions
+
+
+
+
+OCILogoff()
+Name
+OCI simplified Logoff
+Purpose
+This function is used to terminate a session created with OCILogon() or
+OCILogon2().
+Syntax
+sword OCILogoff ( OCISvcCtx      *svchp
+                   OCIError       *errhp );
+Comments
+This call is used to terminate a session which was created with OCILogon() or
+OCILogon2().  
+This call implicitly deallocates the server, authentication, and service 
+context handles.
+Note: For more information on logging on and off in an application, 
+refer to the section "Application Initialization, Connection, and 
+Authorization" on page 2-16.
+Parameters
+svchp (IN) - the service context handle which was used in the call to 
+OCILogon() or OCILogon2().
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+See Also
+OCILogon(), OCILogon2().
+
+
+
+
+
+
+OCILogon()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a simple logon session.
+Syntax
+sword OCILogon ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       *svchp,
+                       CONST OraText      *username,
+                       ub4             uname_len,
+                       CONST OraText      *password,
+                       ub4             passwd_len,
+                       CONST OraText      *dbname,
+                       ub4             dbname_len );
+Comments
+This function is used to create a simple logon session for an application. 
+Note: Users requiring more complex session (e.g., TP monitor 
+applications) should refer to the section "Application Initialization, 
+Connection, and Authorization" on page 2-16.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+See Also
+OCILogoff()
+
+
+
+
+
+OCILogon2()
+Name
+OCI Service Context Logon
+Purpose
+This function is used to create a logon session in connection pooling mode.
+Syntax
+sword OCILogon2 ( OCIEnv          *envhp,
+                       OCIError        *errhp,
+                       OCISvcCtx       **svchp,
+                       CONST OraText      *username,
+                       ub4             uname_len,
+                       CONST OraText      *password,
+                       ub4             passwd_len,
+                       CONST OraText      *dbname,
+                       ub4             dbname_len,
+                       ub4             mode);
+Comments
+This function is used to create a simple logon session for an application in
+Connection Pooling mode. The valid values for mode are currently OCI_POOL and
+OCI_DEFAULT. Call to this function with OCI_DEFAULT mode is equivalent to 
+OCILogon() call.
+This call allocates the error and service context handles which are passed to 
+it. This call also implicitly allocates server and authentication handles 
+associated with the session.  These handles can be retrieved by calling 
+OCIAttrGet() on the service context handle. This call assumes that 
+OCIConnectionPoolCreate() has already been called for the same dbname.
+Parameters
+envhp (IN) - the OCI environment handle.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+svchp (OUT) - the service context pointer.
+username (IN) - the username.
+uname_len (IN) - the length of username.
+password (IN) - the user's password. If this is null, it is assumed that a
+                proxy session has to be created and the required grants on 
+                the database are already done.
+passwd_len (IN) - the length of password.
+dbname (IN) - the name of the database to connect to.
+dbname_len (IN) - the length of dbname.
+mode (IN) - the mode for doing the server attach. Should be OCI_POOL for
+            using Connection Pooling.
+
+
+See Also
+OCILogoff()
+
+
+
+
+
+OCIMemoryFree()
+Name
+OCI FREE Memory
+Purpose
+Frees up storage associated with the pointer.
+Syntax
+void OCIMemoryFree ( CONST OCIStmt   *stmhp,
+                     dvoid           *memptr);
+Comments
+Frees up dynamically allocated data pointers associated with the pointer using 
+either the default memory free function or the registered memory free 
+function, as the case may be.
+A user-defined memory free function can be registered during the initial call 
+to OCIInitialize(). 
+This call is always successful. 
+Parameters
+stmhp (IN) - statement handle which returned this data buffer.
+memptr (IN) - pointer to data allocated by the client library. 
+Related Functions
+OCIInitialize()
+
+
+
+
+
+OCIParamGet()
+Name
+OCI Get PARaMeter
+Purpose
+Returns a descriptor of a parameter specified by position in the describe 
+handle or statement handle.
+Syntax
+sword OCIParamGet ( CONST dvoid       *hndlp,
+                  ub4         htype,
+                  OCIError    *errhp,
+                  dvoid    **parmdpp,
+                  ub4         pos );
+Comments
+This call returns a descriptor of a parameter specified by position in the 
+describe handle or statement handle. Parameter descriptors are always 
+allocated internally by the OCI library. They are read-only.
+OCI_NO_DATA may be returned if there are no parameter descriptors for this 
+position. 
+See Appendix B for more detailed information about parameter descriptor 
+attributes.
+Parameters
+hndlp (IN) - a statement handle or describe handle. The OCIParamGet() 
+function will return a parameter descriptor for this handle. 
+htype (IN) - the type of the handle passed in the handle parameter. Valid 
+types are OCI_HTYPE_DESCRIBE, for a describe handle OCI_HTYPE_STMT, for a 
+statement handle
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+parmdpp (OUT) - a descriptor of the parameter at the position given in the pos 
+parameter.
+pos (IN) - position number in the statement handle or describe handle. A 
+parameter descriptor will be returned for this position.
+Note: OCI_NO_DATA may be returned if there are no parameter 
+descriptors for this position. 
+Related Functions
+OCIAttrGet(), OCIAttrSet()
+
+
+
+
+
+OCIParamSet()
+Name
+OCI Parameter Set in handle
+Purpose
+Used to set a complex object retrieval descriptor into a complex object 
+retrieval handle.
+Syntax
+sword   OCIParamGet ( dvoid *hndlp,
+                       ub4 htyp,
+                      OCIError *errhp,
+                      CONST dvoid *dscp,
+                      ub4 dtyp,
+                      ub4 pos );
+Comments
+This call sets a given complex object retrieval descriptor into a complex 
+object retrieval handle.
+The handle must have been previously allocated using OCIHandleAlloc(), and 
+the descriptor must have been previously allocated using OCIDescAlloc(). 
+Attributes of the descriptor are set using OCIAttrSet().
+Parameters
+hndlp (IN/OUT) - handle pointer.
+htype (IN) - handle type.
+errhp (IN/OUT) - error handle.
+dscp (IN) - complex object retrieval descriptor pointer.
+dtyp (IN) - 
+pos (IN) - position number.
+See Also
+
+
+
+
+
+OCIPasswordChange()
+Name
+OCI Change PassWord
+Purpose
+This call allows the password of an account to be changed.
+Syntax
+sword OCIPasswordChange ( OCISvcCtx     *svchp,
+                        OCIError      *errhp,
+                        CONST OraText    *user_name,
+                        ub4           usernm_len,
+                        CONST OraText    *opasswd,
+                        ub4           opasswd_len,
+                        CONST OraText    *npasswd,
+                        sb4           npasswd_len,
+                        ub4           mode);
+Comments
+This call allows the password of an account to be changed. This call is 
+similar to OCISessionBegin() with the following differences:
+If the user authentication is already established, it authenticates 
+the account using the old password and then changes the 
+password to the new password
+If the user authentication is not established, it establishes a user 
+authentication and authenticates the account using the old 
+password, then changes the password to the new password.
+This call is useful when the password of an account is expired and 
+OCISessionBegin() returns an error or warning which indicates that the 
+password has expired. 
+Parameters
+svchp (IN/OUT) - a handle to a service context. The service context handle 
+must be initialized and have a server context handle associated with it.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+user_name (IN) - specifies the user name. It points to a character string, 
+whose length is specified in usernm_len. This parameter must be NULL if the 
+service context has been initialized with an authentication handle.
+usernm_len (IN) - the length of the user name string specified in user_name. 
+For a valid user name string, usernm_len must be non-zero.
+opasswd (IN) - specifies the user's old password. It points to a character 
+string, whose length is specified in opasswd_len .
+opasswd_len (IN) - the length of the old password string specified in opasswd. 
+For a valid password string, opasswd_len must be non-zero.
+npasswd (IN) - specifies the user's new password. It points to a character 
+string, whose length is specified in npasswd_len which must be non-zero for a 
+valid password string. If the password complexity verification routine is 
+specified in the user's profile to verify the new password's complexity, the 
+new password must meet the complexity requirements of the verification 
+function.
+npasswd_len (IN)  - then length of the new password string specified in 
+npasswd. For a valid password string, npasswd_len must be non-zero.
+mode - pass as OCI_DEFAULT.
+Related Functions
+OCISessionBegin()
+
+
+----------------------------------OCIReset------------------------------------
+
+
+OCIReset()
+Name
+OCI Reset
+Purpose
+Resets the interrupted asynchronous operation and protocol. Must be called
+if a OCIBreak call had been issued while a non-blocking operation was in
+progress.
+Syntax
+sword OCIReset ( dvoid      *hndlp,
+                 OCIError   *errhp);
+Comments
+This call is called in non-blocking mode ONLY. Resets the interrupted
+asynchronous operation and protocol. Must be called if a OCIBreak call 
+had been issued while a non-blocking operation was in progress. 
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+Related Functions
+
+
+OCIResultSetToStmt()
+Name
+OCI convert Result Set to Statement Handle
+Purpose
+Converts a descriptor to statement handle for fetching rows.
+Syntax
+sword OCIResultSetToStmt ( OCIResult     *rsetdp,
+                         OCIError      *errhp );
+Comments
+Converts a descriptor to statement handle for fetching rows.
+A result set descriptor can be allocated with a call to OCIDescAlloc().
+Parameters
+rsetdp (IN/OUT) - a result set descriptor pointer. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+Related Functions
+OCIDescAlloc()
+
+
+
+
+OCIServerAttach()
+Name
+OCI ATtaCH to server
+Purpose
+Creates an access path to a data source for OCI operations.
+Syntax
+sword OCIServerAttach ( OCIServer    *srvhp,
+                      OCIError     *errhp,
+                      CONST OraText   *dblink,
+                      sb4          dblink_len,
+                      ub4          mode);
+Comments
+This call is used to create an association between an OCI application and a 
+particular server. 
+This call initializes a server context handle, which must have been previously 
+allocated with a call to OCIHandleAlloc().
+The server context handle initialized by this call can be associated with a 
+service context through a call to OCIAttrSet(). Once that association has been 
+made, OCI operations can be performed against the server.
+If an application is operating against multiple servers, multiple server 
+context handles can be maintained. OCI operations are performed against 
+whichever server context is currently associated with the service context.
+Parameters
+srvhp (IN/OUT) - an uninitialized server context handle, which gets 
+initialized by this call. Passing in an initialized server handle causes an 
+error. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+dblink (IN) - specifies the database (server) to use. This parameter points to
+a character string which specifies a connect string or a service point. If the 
+connect string is NULL, then this call attaches to the default host. The length
+of connstr is specified in connstr_len. The connstr pointer may be freed by the
+caller on return.
+dblink_len (IN) - the length of the string pointed to by connstr. For a valid 
+connect string name or alias, connstr_len must be non-zero.
+mode (IN) - specifies the various modes of operation.  For release 8.0, pass as
+OCI_DEFAULT - in this mode, calls made to the server on this server context 
+are made in blocking mode. 
+Example
+See the description of OCIStmtPrepare() on page 13-96 for an example showing 
+the use of OCIServerAttach().
+Related Functions
+OCIServerDetach()
+
+
+
+OCIServerDetach()
+Name
+OCI DeTaCH server
+Purpose
+Deletes an access to a data source for OCI operations.
+Syntax
+sword OCIServerDetach ( OCIServer   *svrhp,
+                      OCIError    *errhp,
+                      ub4         mode); 
+Comments
+This call deletes an access to data source for OCI operations, which was 
+established by a call to OCIServerAttach(). 
+Parameters
+srvhp (IN) - a handle to an initialized server context, which gets reset to 
+uninitialized state. The handle is not de-allocated. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+mode (IN) - specifies the various modes of operation. The only valid mode is 
+OCI_DEFAULT for the default mode. 
+Related Functions
+OCIServerAttach()
+
+
+
+OCIServerVersion()
+Name
+OCI VERSion
+Purpose
+Returns the version string of the Oracle server.
+Syntax
+sword OCIServerVersion ( dvoid        *hndlp, 
+                       OCIError     *errhp, 
+                       OraText         *bufp,
+                       ub4          bufsz
+                       ub1          hndltype );
+Comments
+This call returns the version string of the Oracle server. 
+For example, the following might be returned as the version string if your 
+application is running against a 7.3.2 server:
+Oracle7 Server Release 7.3.2.0.0 - Production Release
+PL/SQL Release 2.3.2.0.0 - Production
+CORE Version 3.5.2.0.0 - Production
+TNS for SEQUENT DYNIX/ptx: Version 2.3.2.0.0 - Production
+NLSRTL Version 3.2.2.0.0 - Production
+
+Parameters
+hndlp (IN) - the service context handle or the server context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN) - the buffer in which the version information is returned.
+bufsz (IN) - the length of the buffer.
+hndltype (IN) - the type of handle passed to the function.
+Related Functions
+
+
+
+
+
+OCISessionBegin()
+Name
+OCI Session Begin and authenticate user
+Purpose
+Creates a user authentication and begins a user session for a given server.
+Syntax
+sword OCISessionBegin ( OCISvcCtx     *svchp,
+                      OCIError      *errhp,
+                      OCISession    *usrhp,
+                      ub4           credt,
+                      ub4           mode);
+
+Comments
+For Oracle8, OCISessionBegin() must be called for any given server handle 
+before requests can be made against it. Also, OCISessionBegin() only supports 
+authenticating the user for access to the Oracle server specified by the 
+server handle in the service context. In other words, after OCIServerAttach() 
+is called to initialize a server handle, OCISessionBegin() must be called to 
+authenticate the user for that given server. 
+When OCISessionBegin() is called for the first time for the given server 
+handle, the initialized authentication handle is called a primary 
+authentication context. A primary authentication context may not be created 
+with the OCI_MIGRATE mode. Also, only one primary authentication context can 
+be created for a given server handle and the primary authentication context c
+an only ever be used with that server handle. If the primary authentication 
+context is set in a service handle with a different server handle, then an 
+error will result.
+After OCISessionBegin() has been called for the server handle, and the primary 
+authentication context is set in the service handle, OCISessionBegin() may be 
+called again to initialize another authentication handle with different (or 
+the same) credentials. When OCISessionBegin() is called with a service handle 
+set with a primary authentication context, the returned authentication context
+in authp is called a user authentication context. As many user authentication 
+contexts may be initialized as desired.
+User authentication contexts may be created with the OCI_MIGRATE mode. 
+If the OCI_MIGRATE mode is not specified, then the user authentication 
+context can only ever be used with the same server handle set in svchp. If 
+OCI_MIGRATE mode is specified, then the user authentication may be set 
+with different server handles. However, the user authentication context is 
+restricted to use with only server handles which resolve to the same database 
+instance and that have equivalent primary authentication contexts. Equivalent 
+authentication contexts are those which were authenticated as the same 
+database user.
+OCI_SYSDBA, OCI_SYSOPER, and OCI_PRELIM_AUTH may only be used 
+with a primary authentication context.
+To provide credentials for a call to OCISessionBegin(), one of two methods are 
+supported. The first is to provide a valid username and password pair for 
+database authentication in the user authentication handle passed to 
+OCISessionBegin(). This involves using OCIAttrSet() to set the 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD attributes on the 
+authentication handle. Then OCISessionBegin() is called with 
+OCI_CRED_RDBMS.
+Note: When the authentication handle is terminated using 
+OCISessionEnd(), the username and password attributes remain 
+unchanged and thus can be re-used in a future call to OCISessionBegin(). 
+Otherwise, they must be reset to new values before the next 
+OCISessionBegin() call.
+The second type of credentials supported are external credentials. No 
+attributes need to be set on the authentication handle before calling 
+OCISessionBegin(). The credential type is OCI_CRED_EXT. This is equivalent 
+to the Oracle7 `connect /' syntax. If values have been set for 
+OCI_ATTR_USERNAME and OCI_ATTR_PASSWORD, then these are 
+ignored if OCI_CRED_EXT is used.
+Parameters
+svchp (IN) - a handle to a service context. There must be a valid server 
+handle set in svchp.
+errhp (IN) - an error handle to the retrieve diagnostic information.
+usrhp (IN/OUT) - a handle to an authentication context, which is initialized 
+by this call.
+credt (IN) - specifies the type of credentials to use for authentication. 
+Valid values for credt are:
+OCI_CRED_RDBMS - authenticate using a database username and 
+password pair as credentials. The attributes OCI_ATTR_USERNAME 
+and OCI_ATTR_PASSWORD should be set on the authentication 
+context before this call.
+OCI_CRED_EXT - authenticate using external credentials. No username 
+or password is provided.
+mode (IN) - specifies the various modes of operation. Valid modes are:
+OCI_DEFAULT - in this mode, the authentication context returned may 
+only ever be set with the same server context specified in svchp. This 
+establishes the primary authentication context.
+OCI_MIGRATE - in this mode, the new authentication context may be 
+set in a service handle with a different server handle. This mode 
+establishes the user authentication context. 
+OCI_SYSDBA - in this mode, the user is authenticated for SYSDBA 
+access.
+OCI_SYSOPER - in this mode, the user is authenticated for SYSOPER 
+access.
+OCI_PRELIM_AUTH - this mode may only be used with OCI_SYSDBA 
+or OCI_SYSOPER to authenticate for certain administration tasks.
+Related Functions
+OCISessionEnd()
+
+
+
+
+
+
+OCISessionEnd()
+Name
+OCI Terminate user Authentication Context
+Purpose
+Terminates a user authentication context created by OCISessionBegin()
+Syntax
+sword OCISessionEnd ( OCISvcCtx       *svchp,
+                    OCIError        *errhp,
+                    OCISession      *usrhp,
+                    ub4             mode);
+
+Comments
+The user security context associated with the service context is invalidated 
+by this call. Storage for the authentication context is not freed. The 
+transaction specified by the service context is implicitly committed. The 
+transaction handle, if explicitly allocated, may be freed if not being used.
+Resources allocated on the server for this user are freed.
+The authentication handle may be reused in a new call to OCISessionBegin().
+Parameters
+svchp (IN/OUT) - the service context handle. There must be a valid server 
+handle and user authentication handle associated with svchp.
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+usrhp (IN) - de-authenticate this user. If this parameter is passed as NULL, the 
+user in the service context handle is de-authenticated.
+mode (IN) - the only valid mode is OCI_DEFAULT.
+Example
+In this example, an authentication context is destroyed.
+Related Functions
+OCISessionBegin()
+
+
+
+
+OCIStmtExecute()
+Name
+OCI EXECute
+Purpose
+This call associates an application request with a server.
+Syntax
+sword OCIStmtExecute ( OCISvcCtx           *svchp,
+                     OCIStmt             *stmtp,
+                     OCIError            *errhp,
+                     ub4                 iters,
+                     ub4                 rowoff,
+                     CONST OCISnapshot   *snap_in,
+                     OCISnapshot         *snap_out,
+                     ub4                 mode );
+Comments
+This function  is used to execute a prepared SQL statement.
+Using an execute call, the application associates a request with a server. On 
+success, OCI_SUCCESS is returned.
+If a SELECT statement is executed, the description of the select list follows 
+implicitly as a response. This description is buffered on the client side for 
+describes, fetches and define type conversions. Hence it is optimal to 
+describe a select list only after an execute. 
+Also for SELECT statements, some results are available implicitly. Rows will 
+be received and buffered at the end of the execute. For queries with small row 
+count, a prefetch causes memory to be released in the server if the end of 
+fetch is reached, an optimization that may result in memory usage reduction. 
+Set attribute call has been defined to set the number of rows to be prefetched
+per result set.
+For SELECT statements, at the end of the execute, the statement handle 
+implicitly maintains a reference to the service context on which it is 
+executed. It is the user's responsibility to maintain the integrity of the 
+service context. If the attributes of a service context is changed for 
+executing some operations on this service context, the service context must 
+be restored to have the same attributes, that a statement was executed with, 
+prior to a fetch on the statement handle. The implicit reference is maintained 
+until the statement handle is freed or the fetch is cancelled or an end of 
+fetch condition is reached.
+Note: If output variables are defined for a SELECT statement before a 
+call to OCIStmtExecute(), the number of rows specified by iters will be 
+fetched directly into the defined output buffers and additional rows 
+equivalent to the prefetch count will be prefetched. If there are no 
+additional rows, then the fetch is complete without calling 
+OCIStmtFetch().
+The execute call will return errors if the statement has bind data types that 
+are not supported in an Oracle7 server.
+Parameters
+svchp (IN/OUT) - service context handle. 
+stmtp (IN/OUT) - an statement handle - defines the statement and the 
+associated data to be executed at the server. It is invalid to pass in a 
+statement handle that has bind of data types only supported in release 8.0 
+when srvchp points to an Oracle7 server. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. If the statement is being 
+batched and it is successful, then this handle will contain this particular 
+statement execution specific errors returned from the server when the batch is 
+flushed.
+iters (IN) - the number of times this statement is executed for non-Select 
+statements. For Select statements, if iters is non-zero, then defines must 
+have been done for the statement handle. The execution fetches iters rows into 
+these predefined buffers and prefetches more rows depending upon the prefetch 
+row count. This function returns an error if iters=0 for non-SELECT 
+statements.
+rowoff (IN) - the index from which the data in an array bind is relevant for 
+this multiple row execution. 
+snap_in (IN) - this parameter is optional. if supplied, must point to a 
+snapshot descriptor of type OCI_DTYPE_SNAP.  The contents of this descriptor 
+must be obtained from the snap_out parameter of a previous call.  The 
+descriptor is ignored if the SQL is not a SELECT.  This facility allows 
+multiple service contexts to ORACLE to see the same consistent snapshot of the 
+database's committed data.  However, uncommitted data in one context is not 
+visible to another context even using the same snapshot.
+snap_out (OUT) - this parameter optional. if supplied, must point to a 
+descriptor of type OCI_DTYPE_SNAP. This descriptor is filled in with an 
+opaque representation which is the current ORACLE "system change 
+number" suitable as a snap_in input to a subsequent call to OCIStmtExecute().  
+This descriptor should not be used any longer than necessary in order to avoid 
+"snapshot too old" errors. 
+mode (IN) - The modes are:
+If OCI_DEFAULT_MODE, the default mode, is selected, the request is 
+immediately executed. Error handle contains diagnostics on error if any. 
+OCI_EXACT_FETCH - if the statement is a SQL SELECT, this mode is 
+only valid if the application has set the prefetch row count prior to this 
+call. In this mode, the OCI library will get up to the number of rows 
+specified (i.e., prefetch row count plus iters). If the number of rows 
+returned by the query is greater than this value, OCI_ERROR will be 
+returned with ORA-01422 as the implementation specific error in a 
+diagnostic record. If the number of rows returned by the query is 
+smaller than the prefetch row count, OCI_SUCCESS_WITH_INFO will 
+be returned with ORA-01403 as the implementation specific error. The 
+prefetch buffer size is ignored and the OCI library tries to allocate all the 
+space required to contain the prefetched rows. The exact fetch semantics 
+apply to only the top level rows. No more rows can be fetched for this 
+query at the end of the call. 
+OCI_KEEP_FETCH_STATE - the result set rows (not yet fetched) of this 
+statement executed in this transaction will be maintained when the 
+transaction is detached for migration. By default, a query is cancelled 
+when a transaction is detached for migration. This mode is the default 
+mode when connected to a V7 server. 
+Related Functions
+OCIStmtPrepare()
+
+
+
+
+
+OCIStmtFetch()
+Name
+OCI FetCH
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         mode);
+Comments
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+orientation (IN) - for release 8.0, the only acceptable value is 
+OCI_FETCH_NEXT, which is also the default value. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+OCIStmtFetch2()
+Name
+OCI FetCH2
+Purpose
+Fetches rows from a query.
+Syntax
+sword OCIStmtFetch2 ( OCIStmt     *stmtp,
+                   OCIError    *errhp, 
+                   ub4         nrows,
+                   ub2         orientation,
+                   ub4         scrollOffset,
+                   ub4         mode);
+Comments
+The fetch call works similar to the OCIStmtFetch call with the 
+addition of the fetchOffset parameter. It can be used on any 
+statement handle, whether it is scrollable or not. For a 
+non-scrollable statement handle, the only acceptable value 
+will be OCI_FETCH_NEXT, and the fetchOffset parameter will be 
+ignored. Applications are encouraged to use this new call. 
+
+A fetchOffset with OCI_FETCH_RELATIVE is equivalent to 
+OCI_FETCH_CURRENT with a value of 0, is equivalent to 
+OCI_FETCH_NEXT with a value of 1, and equivalent to 
+OCI_FETCH_PRIOR with a value of -1. Note that the range of 
+accessible rows is [1,OCI_ATTR_ROW_COUNT] beyond which an 
+error could be raised if sufficient rows do not exist in 
+
+The fetch call is a local call, if prefetched rows suffice. However, this is 
+transparent to the application. If LOB columns are being read, LOB locators 
+are fetched for subsequent LOB operations to be performed on these locators. 
+Prefetching is turned off if LONG columns are involved. 
+A fetch with nrows set to 0 rows effectively cancels the fetch for this 
+statement.
+Parameters
+stmtp (IN) - a statement (application request) handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+nrows (IN) - number of rows to be fetched from the current position.
+It defaults to 1 for orientation OCI_FETCH_LAST.
+orientation (IN) -  The acceptable values are as follows, with 
+OCI_FETCH_NEXT being the default value.
+OCI_FETCH_CURRENT gets the current row, 
+OCI_FETCH_NEXT gets the next row from the current position,
+OCI_FETCH_FIRST gets the first row in the result set,
+OCI_FETCH_LAST gets the last row in the result set, 
+OCI_FETCH_PRIOR gets the previous row from the current row in the result set, 
+OCI_FETCH_ABSOLUTE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using absolute positioning,
+OCI_FETCH_RELATIVE will fetch the row number (specified by fetchOffset 
+parameter) in the result set using relative positioning.
+scrollOffset(IN) - offset used with the OCI_FETCH_ABSOLUTE and 
+OCI_FETCH_RELATIVE orientation parameters only. It specify
+the new current position for scrollable result set. It is 
+ignored for non-scrollable result sets. 
+mode (IN) - for release 8.0, beta-1, the following mode is defined.
+OCI_DEFAULT - default mode
+OCI_EOF_FETCH - indicates that it is the last fetch from the result set. 
+If nrows is non-zero, setting this mode effectively cancels fetching after 
+retrieving nrows, otherwise it cancels fetching immediately. 
+Related Functions
+OCIAttrGet()
+
+
+
+OCIStmtGetPieceInfo()
+Name
+OCI Get Piece Information
+Purpose
+Returns piece information for a piecewise operation.
+Syntax
+sword OCIStmtGetPieceInfo( CONST OCIStmt  *stmtp,
+                         OCIError       *errhp,
+                         dvoid          **hndlpp,
+                         ub4            *typep,
+                         ub1            *in_outp,
+                         ub4            *iterp, 
+                         ub4            *idxp,
+                         ub1            *piecep );
+
+Comments
+When an execute/fetch call returns OCI_NEED_DATA to get/return a 
+dynamic bind/define value or piece, OCIStmtGetPieceInfo() returns the 
+relevant information: bind/define handle, iteration or index number and 
+which piece.
+See the section "Runtime Data Allocation and Piecewise Operations" on page 
+5-16 for more information about using OCIStmtGetPieceInfo().
+Parameters
+stmtp (IN) - the statement when executed returned OCI_NEED_DATA. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+hndlpp (OUT) - returns a pointer to the bind or define handle of the bind or 
+define whose runtime data is required or is being provided.
+typep (OUT) - the type of the handle pointed to by hndlpp: OCI_HTYPE_BIND 
+(for a bind handle) or OCI_HTYPE_DEFINE (for a define handle).
+in_outp (OUT) - returns OCI_PARAM_IN if the data is required for an IN bind 
+value. Returns OCI_PARAM_OUT if the data is available as an OUT bind 
+variable or a define position value.
+iterp (OUT) - returns the row number of a multiple row operation.
+idxp (OUT) - the index of an array element of a PL/SQL array bind operation.
+piecep (OUT) - returns one of the following defined values - 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE and 
+OCI_LAST_PIECE. The default value is always OCI_ONE_PIECE. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtSetPieceInfo()
+
+
+
+
+OCIStmtPrepare()
+Name
+OCI Statement REQuest
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     CONST OraText   *stmt, 
+                     ub4          stmt_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The 
+OCIStmtPrepare() call defines an application request. 
+This is a purely local call. Data values for this statement initialized in 
+subsequent bind calls will be stored in a bind handle which will hang off this 
+statement handle.
+This call does not create an association between this statement handle and any 
+particular server.
+See the section "Preparing Statements" on page 2-21 for more information 
+about using this call.
+Parameters
+stmtp (IN) - a statement handle.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+terminated string. The pointer to the OraText of the statement must be available 
+as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server. 
+mode (IN) - the only defined mode is OCI_DEFAULT for default mode. 
+Example
+This example demonstrates the use of OCIStmtPrepare(), as well as the OCI 
+application initialization calls.
+Related Functions
+OCIAttrGet(), OCIStmtExecute()
+
+
+OCIStmtPrepare2()
+Name
+OCI Statement REQuest with (a) early binding to svchp and/or
+(b) stmt caching
+Purpose
+This call defines the SQL/PLSQL statement to be executed.
+Syntax
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp,
+                     OCIStmt      **stmtp,
+                     OCIError     *errhp,
+                     CONST OraText   *stmt,
+                     ub4          stmt_len,
+                     CONST OraText *key,
+                     ub4          key_len,
+                     ub4          language,
+                     ub4          mode);
+Comments
+This call is used to prepare a SQL or PL/SQL statement for execution. The
+OCIStmtPrepare() call defines an application request.
+This is a purely local call. Data values for this statement initialized in
+subsequent bind calls will be stored in a bind handle which will hang off this
+statement handle.
+This call creates an association between the statement handle and a service
+context. It differs from OCIStmtPrepare in that respect.It also supports
+stmt caching. The stmt will automatically be cached if the authp of the stmt
+has enabled stmt caching.
+Parameters
+svchp (IN) - the service context handle that contains the session that
+             this stmt handle belongs to.
+stmtp (OUT) - an unallocated stmt handle must be pased in. An allocated
+              and prepared  statement handle will be returned.
+errhp (IN) - an error handle to retrieve diagnostic information.
+stmt (IN) - SQL or PL/SQL statement to be executed. Must be a null-
+            terminated string. The pointer to the OraText of the statement 
+            must be available as long as the statement is executed.
+stmt_len (IN) - length of the statement. Must not be zero.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to search with. It thus optimizes the search in the cache.
+key_len (IN) - the length of the key. This, too, is onlly valid for stmt
+               caching.
+language (IN) - V7, V8, or native syntax. Possible values are:
+OCI_V7_SYNTAX - V7 ORACLE parsing syntax
+OCI_V8_SYNTAX - V8 ORACLE parsing syntax
+OCI_NTV_SYNTAX - syntax depending upon the version of the server.
+mode (IN) - the defined modes are OCI_DEFAULT and OCI_PREP2_CACHE_SEARCHONLY.
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtRelease()
+
+
+OCIStmtRelease()
+Name
+OCI Statement Release. This call is used to relesae the stmt that
+was retreived using OCIStmtPrepare2(). If the stmt is release
+using this call, OCIHandleFree() must not be called on the stmt
+handle.
+Purpose
+This call releases the statement obtained by OCIStmtPrepare2
+Syntax
+sword OCIStmtRelease ( OCIStmt      *stmtp,
+                     OCIError     *errhp,
+                     cONST OraText *key,
+                     ub4          key_len,
+                     ub4          mode);
+Comments
+This call is used to release a handle obtained via OCIStmtPrepare2().
+It also frees the memory associated with the handle.
+This is a purely local call.
+Parameters
+stmtp (IN/OUT) - The statement handle to be released/freed.
+errhp (IN) - an error handle to retrieve diagnostic information.
+key (IN) - This is only Valid for OCI Stmt Caching. It indicates the
+           key to tag the stmt with.
+key_len (IN) - the length of the key. This, too, is only valid for stmt
+               caching.
+mode (IN) - the defined modes are OCI_DEFAULT for default mode and
+            OCI_STRLS_CACHE_DELETE (only used for Stmt Caching).
+Example
+Related Functions
+OCIStmtExecute(), OCIStmtPrepare2()
+
+
+OCIStmtSetPieceInfo()
+Name
+OCI Set Piece Information
+Purpose
+Sets piece information for a piecewise operation.
+Syntax
+sword OCIStmtSetPieceInfo ( dvoid             *hndlp,
+                          ub4               type,
+                          OCIError          *errhp,
+                          CONST dvoid       *bufp,
+                          ub4               *alenp, 
+                          ub1               piece,
+                          CONST dvoid       *indp, 
+                          ub2               *rcodep ); 
+Comments
+When an execute call returns OCI_NEED_DATA to get a dynamic IN/OUT 
+bind value or piece, OCIStmtSetPieceInfo() sets the piece information: the 
+buffer, the length, the indicator and which piece is currently being processed.
+For more information about using OCIStmtSetPieceInfo() see the section 
+"Runtime Data Allocation and Piecewise Operations" on page 5-16.
+Parameters
+hndlp (IN/OUT) - the bind/define handle.
+type (IN) - type of the handle. 
+errhp (OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+bufp (IN/OUT) - bufp is a pointer to a storage containing the data value or 
+the piece when it is an IN bind variable, otherwise bufp is a pointer to 
+storage for getting a piece or a value for OUT binds and define variables. For
+named data types or REFs, a pointer to the object or REF is returned.
+alenp (IN/OUT) - the length of the piece or the value. 
+piece (IN) - the piece parameter. The following are valid values: 
+OCI_ONE_PIECE, OCI_FIRST_PIECE, OCI_NEXT_PIECE, or 
+OCI_LAST_PIECE. 
+The default value is OCI_ONE_PIECE. This parameter is used for IN bind 
+variables only.
+indp (IN/OUT) - indicator. A pointer to a sb2 value or pointer to an indicator 
+structure for named data types (SQLT_NTY) and REFs (SQLT_REF), i.e., *indp 
+is either an sb2 or a dvoid * depending upon the data type.
+rcodep (IN/OUT) - return code. 
+Related Functions
+OCIAttrGet(), OCIAttrGet(), OCIStmtExecute(), OCIStmtFetch(), 
+OCIStmtGetPieceInfo()
+
+
+OCIFormatInit
+Name
+OCIFormat Package Initialize
+Purpose
+Initializes the OCIFormat package.
+Syntax
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+Comments
+This routine must be called before calling any other OCIFormat routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatTerm()
+
+
+OCIFormatString
+Name
+OCIFormat Package Format String
+Purpose
+Writes a text string into the supplied text buffer using the argument
+list submitted to it and in accordance with the format string given.
+Syntax
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      CONST OraText *formatString, ...);
+Comments
+The first call to this routine must be preceded by a call to the
+OCIFormatInit routine that initializes the OCIFormat package
+for use.  When this routine is no longer needed then terminate
+the OCIFormat package by a call to the OCIFormatTerm routine.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl         (IN/OUT) - OCI environment or session handle
+err          (IN/OUT) - OCI error handle
+buffer       (OUT)    - text buffer for the string
+bufferLength (IN)     - length of the text buffer
+returnLength (OUT)    - length of the formatted string
+formatString (IN)     - format specification string
+...          (IN)     - variable argument list
+Related Functions
+
+
+OCIFormatTerm 
+Name
+OCIFormat Package Terminate
+Purpose
+Terminates the OCIFormat package.
+Syntax
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+Comments
+It must be called after the OCIFormat package is no longer being used.
+Returns OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+Parameters
+hndl (IN/OUT) - OCI environment or session handle
+err (IN/OUT) - OCI error handle
+Related Functions
+OCIFormatInit()
+
+
+OCIFormatTUb1
+Name
+OCIFormat Package ub1 Type
+Purpose
+Return the type value for the ub1 type.
+Syntax
+sword OCIFormatTUb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb2
+Name
+OCIFormat Package ub2 Type
+Purpose
+Return the type value for the ub2 type.
+Syntax
+sword OCIFormatTUb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUb4
+Name
+OCIFormat Package ub4 Type
+Purpose
+Return the type value for the ub4 type.
+Syntax
+sword OCIFormatTUb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUword
+Name
+OCIFormat Package uword Type
+Purpose
+Return the type value for the uword type.
+Syntax
+sword OCIFormatTUword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTUbig_ora
+Name
+OCIFormat Package ubig_ora Type
+Purpose
+Return the type value for the ubig_ora type.
+Syntax
+sword OCIFormatTUbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb1
+Name
+OCIFormat Package sb1 Type
+Purpose
+Return the type value for the sb1 type.
+Syntax
+sword OCIFormatTSb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb2
+Name
+OCIFormat Package sb2 Type
+Purpose
+Return the type value for the sb2 type.
+Syntax
+sword OCIFormatTSb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSb4
+Name
+OCIFormat Package sb4 Type
+Purpose
+Return the type value for the sb4 type.
+Syntax
+sword OCIFormatTSb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSword
+Name
+OCIFormat Package sword Type
+Purpose
+Return the type value for the sword type.
+Syntax
+sword OCIFormatTSword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTSbig_ora
+Name
+OCIFormat Package sbig_ora Type
+Purpose
+Return the type value for the sbig_ora type.
+Syntax
+sword OCIFormatTSbig_ora(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb1
+Name
+OCIFormat Package eb1 Type
+Purpose
+Return the type value for the eb1 type.
+Syntax
+sword OCIFormatTEb1(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb2
+Name
+OCIFormat Package eb2 Type
+Purpose
+Return the type value for the eb2 type.
+Syntax
+sword OCIFormatTEb2(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEb4
+Name
+OCIFormat Package eb4 Type
+Purpose
+Return the type value for the eb4 type.
+Syntax
+sword OCIFormatTEb4(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEword
+Name
+OCIFormat Package eword Type
+Purpose
+Return the type value for the eword type.
+Syntax
+sword OCIFormatTEword(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTChar
+Name
+OCIFormat Package text Type
+Purpose
+Return the type value for the text type.
+Syntax
+sword OCIFormatTChar(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTText
+Name
+OCIFormat Package *text Type
+Purpose
+Return the type value for the *text type.
+Syntax
+sword OCIFormatTText(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTDouble
+Name
+OCIFormat Package double Type
+Purpose
+Return the type value for the double type.
+Syntax
+sword OCIFormatTDouble(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatDvoid
+Name
+OCIFormat Package dvoid Type
+Purpose
+Return the type value for the dvoid type.
+Syntax
+sword OCIFormatTDvoid(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCIFormatTEnd
+Name
+OCIFormat Package end Type
+Purpose
+Return the list terminator's "type".
+Syntax
+sword OCIFormatTEnd(void);
+Comments
+None
+Parameters
+None
+Related Functions
+None
+
+
+OCISvcCtxToLda()
+Name
+OCI toggle SerVice context handle to Version 7 Lda_Def
+Purpose
+Toggles between a V8 service context handle and a V7 Lda_Def.
+Syntax
+sword OCISvcCtxToLda ( OCISvcCtx    *srvhp,
+                     OCIError     *errhp,
+                     Lda_Def      *ldap );
+Comments
+Toggles between an Oracle8 service context handle and an Oracle7 Lda_Def.
+This function can only be called after a service context has been properly 
+initialized.
+Once the service context has been translated to an Lda_Def, it can be used in 
+release 7.x OCI calls (e.g., obindps(), ofen()).
+Note: If there are multiple service contexts which share the same server 
+handle, only one can be in V7 mode at any time.
+The action of this call can be reversed by passing the resulting Lda_Def to 
+the OCILdaToSvcCtx() function.
+Parameters
+svchp (IN/OUT) - the service context handle. 
+errhp (IN/OUT) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error. 
+ldap (IN/OUT) - a Logon Data Area for V7-style OCI calls which is initialized 
+by this call. 
+Related Functions
+OCILdaToSvcCtx()
+
+
+
+
+OCITransCommit()
+Name
+OCI TX (transaction) CoMmit
+Purpose
+Commits the transaction associated with a specified service context.
+Syntax
+sword OCITransCommit ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags );
+Comments
+The transaction currently associated with the service context is committed. If 
+it is a distributed transaction that the server cannot commit, this call 
+additionally retrieves the state of the transaction from the database to be 
+returned to the user in the error handle.
+If the application has defined multiple transactions, this function operates 
+on the transaction currently associated with the service context. If the 
+application is working with only the implicit local transaction created when 
+database changes are made, that implicit transaction is committed.
+If the application is running in the object mode, then the modified or updated 
+objects in the object cache for this transaction are also committed.
+The flags parameter is used for one-phase commit optimization in distributed 
+transactions. If the transaction is non-distributed, the flags parameter is 
+ignored, and OCI_DEFAULT can be passed as its value. OCI applications 
+managing global transactions should pass a value of 
+OCI_TRANS_TWOPHASE to the flags parameter for a two-phase commit. The 
+default is one-phase commit.
+Under normal circumstances, OCITransCommit() returns with a status 
+indicating that the transaction has either been committed or rolled back. With 
+distributed transactions, it is possible that the transaction is now in-doubt 
+(i.e., neither committed nor aborted). In this case, OCITransCommit() 
+attempts to retrieve the status of the transaction from the server. 
+The status is returned.
+Parameters
+srvcp (IN) - the service context handle.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags -see the "Comments" section above.
+Related Functions
+OCITransRollback()
+
+
+
+
+OCITransDetach()
+Name
+OCI TX (transaction) DeTach
+Purpose
+Detaches a transaction.
+Syntax
+sword OCITransDetach ( OCISvcCtx    *srvcp,
+                     OCIError     *errhp,
+                     ub4          flags);
+Comments
+Detaches a global transaction from the service context handle. The transaction 
+currently attached to the service context handle becomes inactive at the end 
+of this call. The transaction may be resumed later by calling OCITransStart(), 
+specifying  a flags value of OCI_TRANS_RESUME.
+When a transaction is detached, the value which was specified in the timeout 
+parameter of OCITransStart() when the transaction was started is used to 
+determine the amount of time the branch can remain inactive before being 
+deleted by the server's PMON process.
+Note: The transaction can be resumed by a different process than the one 
+that detached it, provided that the transaction has the same 
+authorization.
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransStart()
+
+
+
+OCITransForget()
+Name
+OCI TX (transaction) ForGeT
+Purpose
+Causes the server to forget a heuristically completed global transaction.
+Syntax
+sword OCITransForget ( OCISvcCtx     *svchp, 
+                     OCIError      *errhp,
+                     ub4           flags);
+
+Comments
+
+Forgets a heuristically completed global transaction. The server deletes the 
+status of the transaction from the system's pending transaction table.
+The XID of the transaction to be forgotten is set as an attribute of the 
+transaction handle (OCI_ATTR_XID).
+Parameters
+srvcp (IN) - the service context handle - the transaction is rolled back.
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransRollback()
+
+
+OCITransMultiPrepare() 
+Name
+OCI Trans(action) Multi-Branch Prepare
+Purpose
+Prepares a transaction with multiple branches in a single call.
+Syntax
+sword OCITransMultiPrepare ( OCISvcCtx    *svchp,
+                             ub4           numBranches,
+                             OCITrans     **txns,
+                             OCIError     **errhp);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+This call is an advanced performance feature intended for use only in
+situations where the caller is responsible for preparing all the branches
+in a transaction. 
+Parameters
+srvcp (IN) - the service context handle. 
+numBranches (IN) - This is the number of branches expected. It is also the
+array size for the next two parameters.
+txns (IN) - This is the array of transaction handles for the branches to
+prepare. They should all have the OCI_ATTR_XID set. The global transaction
+ID should be the same.
+errhp (IN) - This is the array of error handles. If OCI_SUCCESS is not
+returned, then these will indicate which branches received which errors.
+Related Functions
+OCITransPrepare()
+
+
+OCITransPrepare()
+Name
+OCI TX (transaction) PREpare
+Purpose
+Prepares a transaction for commit.
+Syntax
+sword OCITransPrepare ( OCISvcCtx    *svchp, 
+                      OCIError     *errhp,
+                      ub4          flags);
+
+Comments
+
+Prepares the specified global transaction for commit.
+This call is valid only for distributed transactions.
+The call returns OCI_SUCCESS_WITH_INFO if the transaction has not made 
+any changes. The error handle will indicate that the transaction is read-only. 
+The flag parameter is not currently used. 
+Parameters
+srvcp (IN) - the service context handle. 
+errhp (IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags (IN) - you must pass OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit(), OCITransForget()
+
+
+
+
+OCITransRollback()
+Name
+OCI TX (transaction) RoLlback
+Purpose
+Rolls back the current transaction.
+Syntax
+sword OCITransRollback ( dvoid        *svchp, 
+                       OCIError     *errhp,
+                       ub4          flags );
+Comments
+The current transaction- defined as the set of statements executed since the 
+last OCITransCommit() or since OCISessionBegin()-is rolled back.
+If the application is running under object mode then the modified or updated 
+objects in the object cache for this transaction are also rolled back.
+An error is returned if an attempt is made to roll back a global transaction 
+that is not currently active.
+Parameters
+svchp (IN) - a service context handle. The transaction currently set in the 
+service context handle is rolled back.
+errhp -(IN) - an error handle which can be passed to OCIErrorGet() for 
+diagnostic information in the event of an error.
+flags - you must pass a value of OCI_DEFAULT for this parameter.
+Related Functions
+OCITransCommit()
+
+
+
+
+OCITransStart()
+Name
+OCI TX (transaction) STart
+Purpose
+Sets the beginning of a transaction.
+Syntax
+sword OCITransStart ( OCISvcCtx    *svchp, 
+                    OCIError     *errhp, 
+                    uword        timeout,
+                    ub4          flags);
+
+Comments
+This function sets the beginning of a global or serializable transaction. The 
+transaction context currently associated with the service context handle is 
+initialized at the end of the call if the flags parameter specifies that a new 
+transaction should be started.
+The XID of the transaction is set as an attribute of the transaction handle 
+(OCI_ATTR_XID)
+Parameters
+svchp (IN/OUT) - the service context handle. The transaction context in the 
+service context handle is initialized at the end of the call if the flag 
+specified a new transaction to be started.
+errhp (IN/OUT) - The OCI error handle. If there is an error, it is recorded in 
+err and this function returns OCI_ERROR. Diagnostic information can be 
+obtained by calling OCIErrorGet().
+timeout (IN) - the time, in seconds, to wait for a transaction to become 
+available for resumption when OCI_TRANS_RESUME is specified. When 
+OCI_TRANS_NEW is specified, this value is stored and may be used later by 
+OCITransDetach().
+flags (IN) - specifies whether a new transaction is being started or an 
+existing transaction is being resumed. Also specifies serializiability or 
+read-only status. More than a single value can be specified. By default, 
+a read/write transaction is started. The flag values are:
+OCI_TRANS_NEW - starts a new transaction branch. By default starts a 
+tightly coupled and migratable branch.
+OCI_TRANS_TIGHT - explicitly specifies a tightly coupled branch
+OCI_TRANS_LOOSE - specifies a loosely coupled branch
+OCI_TRANS_RESUME - resumes an existing transaction branch. 
+OCI_TRANS_READONLY - start a readonly transaction
+OCI_TRANS_SERIALIZABLE - start a serializable transaction
+Related Functions
+OCITransDetach()
+
+
+
+
+
+******************************************************************************/
+/*-----------------------Dynamic Callback Function Pointers------------------*/
+ 
+ 
+typedef sb4 (*OCICallbackInBind)(dvoid *ictxp, OCIBind *bindp, ub4 iter,
+                                  ub4 index, dvoid **bufpp, ub4 *alenp,
+                                  ub1 *piecep, dvoid **indp);
+ 
+typedef sb4 (*OCICallbackOutBind)(dvoid *octxp, OCIBind *bindp, ub4 iter,
+                                 ub4 index, dvoid **bufpp, ub4 **alenp,
+                                 ub1 *piecep, dvoid **indp,
+                                 ub2 **rcodep);
+ 
+typedef sb4 (*OCICallbackDefine)(dvoid *octxp, OCIDefine *defnp, ub4 iter,
+                                 dvoid **bufpp, ub4 **alenp, ub1 *piecep,
+                                 dvoid **indp, ub2 **rcodep);
+
+typedef sword (*OCIUserCallback)(dvoid *ctxp, dvoid *hndlp, ub4 type,
+                                 ub4 fcode, ub4 when, sword returnCode,
+                                 sb4 *errnop, va_list arglist);
+
+typedef sword (*OCIEnvCallbackType)(OCIEnv *env, ub4 mode,
+                                   size_t xtramem_sz, dvoid *usrmemp,
+                                   OCIUcb *ucbDesc); 
+
+typedef sb4 (*OCICallbackLobRead)(dvoid *ctxp, CONST dvoid *bufp,
+                                             ub4 len, ub1 piece);
+
+typedef sb4 (*OCICallbackLobWrite)(dvoid *ctxp, dvoid *bufp, 
+                                          ub4 *lenp, ub1 *piece);
+
+/*--------------------------Failover Callback Structure ---------------------*/
+typedef sb4 (*OCICallbackFailover)(dvoid *svcctx, dvoid *envctx,
+                                   dvoid *fo_ctx, ub4 fo_type,
+                                   ub4 fo_event);
+
+typedef struct
+{
+  OCICallbackFailover callback_function;
+  dvoid *fo_ctx;
+} 
+OCIFocbkStruct;
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+sword   OCIInitialize   (ub4 mode, dvoid *ctxp, 
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr) );
+
+sword   OCITerminate( ub4 mode);
+
+sword   OCIEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp);
+
+sword   OCIEnvNlsCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp,
+                 ub2 charset, ub2 ncharset);
+
+sword   OCIFEnvCreate (OCIEnv **envp, ub4 mode, dvoid *ctxp,
+                 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+                 dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+                 void   (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+                 size_t xtramem_sz, dvoid **usrmempp, dvoid *fupg);
+
+sword   OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, CONST ub4 type, 
+                       CONST size_t xtramem_sz, dvoid **usrmempp);
+
+sword   OCIHandleFree(dvoid *hndlp, CONST ub4 type);
+
+
+sword   OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp, 
+                           CONST ub4 type, CONST size_t xtramem_sz, 
+                           dvoid **usrmempp);
+
+sword   OCIDescriptorFree(dvoid *descp, CONST ub4 type);
+
+sword   OCIEnvInit (OCIEnv **envp, ub4 mode, 
+                    size_t xtramem_sz, dvoid **usrmempp);
+
+sword   OCIServerAttach  (OCIServer *srvhp, OCIError *errhp,
+                          CONST OraText *dblink, sb4 dblink_len, ub4 mode);
+
+sword   OCIServerDetach  (OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+sword   OCISessionBegin  (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp,
+                          ub4 credt, ub4 mode);
+
+sword   OCISessionEnd   (OCISvcCtx *svchp, OCIError *errhp, OCISession *usrhp, 
+                         ub4 mode);
+
+sword   OCILogon (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, 
+		  CONST OraText *username, ub4 uname_len, 
+		  CONST OraText *password, ub4 passwd_len, 
+		  CONST OraText *dbname, ub4 dbname_len);
+
+sword   OCILogon2 (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                  CONST OraText *username, ub4 uname_len,
+                  CONST OraText *password, ub4 passwd_len,
+                  CONST OraText *dbname, ub4 dbname_len,
+                  ub4 mode);
+
+sword   OCILogoff (OCISvcCtx *svchp, OCIError *errhp);
+
+
+sword   OCIPasswordChange   (OCISvcCtx *svchp, OCIError *errhp, 
+                             CONST OraText *user_name, ub4 usernm_len, 
+                             CONST OraText *opasswd, ub4 opasswd_len, 
+                             CONST OraText *npasswd, ub4 npasswd_len, ub4 mode);
+
+sword   OCIStmtPrepare   (OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+                          ub4 stmt_len, ub4 language, ub4 mode);
+
+sword OCIStmtPrepare2 ( OCISvcCtx *svchp, OCIStmt **stmtp, OCIError *errhp,
+                     CONST OraText *stmt, ub4 stmt_len, CONST OraText *key,
+                     ub4 key_len, ub4 language, ub4 mode);
+
+sword OCIStmtRelease ( OCIStmt *stmtp, OCIError *errhp, CONST OraText *key,
+                       ub4 key_len, ub4 mode);
+
+sword   OCIBindByPos  (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+		       ub4 position, dvoid *valuep, sb4 value_sz,
+		       ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+		       ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   OCIBindByName   (OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+			 CONST OraText *placeholder, sb4 placeh_len, 
+                         dvoid *valuep, sb4 value_sz, ub2 dty, 
+                         dvoid *indp, ub2 *alenp, ub2 *rcodep, 
+                         ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   OCIBindObject  (OCIBind *bindp, OCIError *errhp, CONST OCIType *type, 
+			dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, 
+			ub4 *indszp);
+
+sword   OCIBindDynamic   (OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+			  OCICallbackInBind icbfp, dvoid *octxp,
+			  OCICallbackOutBind ocbfp);
+
+sword   OCIBindArrayOfStruct   (OCIBind *bindp, OCIError *errhp, 
+                                ub4 pvskip, ub4 indskip,
+                                ub4 alskip, ub4 rcskip);
+
+sword   OCIStmtGetPieceInfo   (OCIStmt *stmtp, OCIError *errhp, 
+                               dvoid **hndlpp, ub4 *typep,
+                               ub1 *in_outp, ub4 *iterp, ub4 *idxp, 
+                               ub1 *piecep);
+
+sword   OCIStmtSetPieceInfo   (dvoid *hndlp, ub4 type, OCIError *errhp, 
+                               CONST dvoid *bufp, ub4 *alenp, ub1 piece, 
+                               CONST dvoid *indp, ub2 *rcodep);
+
+sword   OCIStmtExecute  (OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, 
+                         ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in, 
+                         OCISnapshot *snap_out, ub4 mode);
+
+sword   OCIDefineByPos  (OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+			 ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+			 dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+sword   OCIDefineObject  (OCIDefine *defnp, OCIError *errhp, 
+                          CONST OCIType *type, dvoid **pgvpp, 
+                          ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+sword   OCIDefineDynamic   (OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+                            OCICallbackDefine ocbfp);
+
+sword   OCIDefineArrayOfStruct  (OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+                                 ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+sword   OCIStmtFetch   (OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+                        ub2 orientation, ub4 mode);
+
+sword   OCIStmtFetch2   (OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+                        ub2 orientation, sb4 scrollOffset, ub4 mode);
+
+sword   OCIStmtGetBindInfo   (OCIStmt *stmtp, OCIError *errhp, ub4 size, 
+                              ub4 startloc,
+                              sb4 *found, OraText *bvnp[], ub1 bvnl[],
+                              OraText *invp[], ub1 inpl[], ub1 dupl[],
+                              OCIBind *hndl[]);
+
+sword   OCIDescribeAny  (OCISvcCtx *svchp, OCIError *errhp, 
+                         dvoid *objptr, 
+                         ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+			 ub1 objtyp, OCIDescribe *dschp);
+
+sword   OCIParamGet (CONST dvoid *hndlp, ub4 htype, OCIError *errhp, 
+                     dvoid **parmdpp, ub4 pos);
+
+sword   OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+                    ub4 dtyp, ub4 pos);
+
+sword   OCITransStart  (OCISvcCtx *svchp, OCIError *errhp, 
+                        uword timeout, ub4 flags );
+
+sword   OCITransDetach  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+sword   OCITransCommit  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransRollback  (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransPrepare (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCITransMultiPrepare (OCISvcCtx *svchp, ub4 numBranches, 
+                              OCITrans **txns, OCIError **errhp);
+
+sword   OCITransForget (OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+sword   OCIErrorGet   (dvoid *hndlp, ub4 recordno, OraText *sqlstate,
+                       sb4 *errcodep, OraText *bufp, ub4 bufsiz, ub4 type);
+
+sword   OCILobAppend  (OCISvcCtx *svchp, OCIError *errhp, 
+                       OCILobLocator *dst_locp,
+                       OCILobLocator *src_locp);
+
+sword   OCILobAssign (OCIEnv *envhp, OCIError *errhp, 
+                      CONST OCILobLocator *src_locp, 
+                      OCILobLocator **dst_locpp);
+
+sword   OCILobCharSetForm (OCIEnv *envhp, OCIError *errhp, 
+                           CONST OCILobLocator *locp, ub1 *csfrm);
+
+sword   OCILobCharSetId (OCIEnv *envhp, OCIError *errhp, 
+                         CONST OCILobLocator *locp, ub2 *csid);
+
+sword   OCILobCopy (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+                    OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, 
+                    ub4 src_offset);
+
+sword OCILobCreateTemporary(OCISvcCtx          *svchp,
+                            OCIError           *errhp,
+                            OCILobLocator      *locp,
+                            ub2                 csid,
+                            ub1                 csfrm,
+                            ub1                 lobtype,
+                            boolean             cache,
+                            OCIDuration         duration);
+
+
+sword OCILobClose( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp );
+
+
+sword   OCILobDisableBuffering (OCISvcCtx      *svchp,
+                                OCIError       *errhp,
+                                OCILobLocator  *locp);
+
+sword   OCILobEnableBuffering (OCISvcCtx      *svchp,
+                               OCIError       *errhp,
+                               OCILobLocator  *locp);
+
+sword   OCILobErase (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      ub4 *amount, ub4 offset);
+
+sword   OCILobFileClose (OCISvcCtx *svchp, OCIError *errhp, 
+                         OCILobLocator *filep);
+
+sword   OCILobFileCloseAll (OCISvcCtx *svchp, OCIError *errhp);
+
+sword   OCILobFileExists (OCISvcCtx *svchp, OCIError *errhp, 
+			  OCILobLocator *filep,
+			  boolean *flag);
+
+sword   OCILobFileGetName (OCIEnv *envhp, OCIError *errhp, 
+                           CONST OCILobLocator *filep, 
+                           OraText *dir_alias, ub2 *d_length, 
+                           OraText *filename, ub2 *f_length);
+
+sword   OCILobFileIsOpen (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *filep,
+                          boolean *flag);
+
+sword   OCILobFileOpen (OCISvcCtx *svchp, OCIError *errhp, 
+                        OCILobLocator *filep,
+                        ub1 mode);
+
+sword   OCILobFileSetName (OCIEnv *envhp, OCIError *errhp, 
+                           OCILobLocator **filepp, 
+                           CONST OraText *dir_alias, ub2 d_length, 
+                           CONST OraText *filename, ub2 f_length);
+
+sword   OCILobFlushBuffer (OCISvcCtx       *svchp,
+                           OCIError        *errhp,
+                           OCILobLocator   *locp,
+                           ub4              flag);
+
+sword OCILobFreeTemporary(OCISvcCtx          *svchp,
+                          OCIError           *errhp,
+                          OCILobLocator      *locp);
+
+sword OCILobGetChunkSize(OCISvcCtx         *svchp,
+                         OCIError          *errhp,
+                         OCILobLocator     *locp,
+                         ub4               *chunksizep);
+
+sword   OCILobGetLength  (OCISvcCtx *svchp, OCIError *errhp, 
+                          OCILobLocator *locp,
+                          ub4 *lenp);
+
+sword   OCILobIsEqual  (OCIEnv *envhp, CONST OCILobLocator *x, 
+                        CONST OCILobLocator *y, 
+                        boolean *is_equal);
+
+sword OCILobIsOpen( OCISvcCtx     *svchp,
+                    OCIError      *errhp,
+                    OCILobLocator *locp,
+                    boolean       *flag);
+
+sword OCILobIsTemporary(OCIEnv            *envp,
+                        OCIError          *errhp,
+                        OCILobLocator     *locp,
+                        boolean           *is_temporary);
+
+sword   OCILobLoadFromFile (OCISvcCtx *svchp, OCIError *errhp, 
+                            OCILobLocator *dst_locp,
+       	                    OCILobLocator *src_filep, 
+                            ub4 amount, ub4 dst_offset, 
+                            ub4 src_offset);
+
+sword   OCILobLocatorAssign  (OCISvcCtx *svchp, OCIError *errhp, 
+                            CONST OCILobLocator *src_locp, 
+                            OCILobLocator **dst_locpp);
+
+
+sword   OCILobLocatorIsInit (OCIEnv *envhp, OCIError *errhp, 
+                             CONST OCILobLocator *locp, 
+                             boolean *is_initialized);
+
+sword   OCILobOpen( OCISvcCtx        *svchp,
+                   OCIError         *errhp,
+                   OCILobLocator    *locp,
+                   ub1               mode );
+ 
+sword   OCILobRead  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, 
+                     dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, 
+                                              CONST dvoid *bufp, 
+                                              ub4 len, 
+                                              ub1 piece),
+                     ub2 csid, ub1 csfrm);
+
+sword   OCILobTrim  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                     ub4 newlen);
+
+sword   OCILobWrite  (OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+                      ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, 
+                      ub1 piece, dvoid *ctxp, 
+                      sb4 (*cbfp)(dvoid *ctxp, 
+                                  dvoid *bufp, 
+                                  ub4 *len, 
+                                  ub1 *piece),
+                      ub2 csid, ub1 csfrm);
+
+sword OCILobWriteAppend(OCISvcCtx *svchp, OCIError *errhp, 
+                        OCILobLocator *lobp, ub4 *amtp, 
+                        dvoid *bufp, ub4 bufl, ub1 piece, dvoid *ctxp,
+                       sb4 (*cbfp)(dvoid *ctxp, dvoid *bufp, ub4 *len, 
+                       ub1 *piece), 
+                      ub2 csid, ub1 csfrm);
+
+sword   OCIBreak (dvoid *hndlp, OCIError *errhp);
+
+sword   OCIReset (dvoid *hndlp, OCIError *errhp);
+
+sword   OCIServerVersion  (dvoid *hndlp, OCIError *errhp, OraText *bufp, 
+                           ub4 bufsz,
+                           ub1 hndltype);
+
+sword   OCIServerRelease  (dvoid *hndlp, OCIError *errhp, OraText *bufp,
+                           ub4 bufsz,
+                           ub1 hndltype, ub4 *version);
+
+sword   OCIAttrGet (CONST dvoid *trgthndlp, ub4 trghndltyp, 
+                    dvoid *attributep, ub4 *sizep, ub4 attrtype, 
+                    OCIError *errhp);
+
+sword   OCIAttrSet (dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+                    ub4 size, ub4 attrtype, OCIError *errhp);
+
+sword   OCISvcCtxToLda (OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+sword   OCILdaToSvcCtx (OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+sword   OCIResultSetToStmt (OCIResult *rsetdp, OCIError *errhp);
+
+sword OCIFileClose ( dvoid  *hndl, OCIError *err, OCIFileObject *filep );
+
+sword	OCIUserCallbackRegister(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+                                    OCIUserCallback callback, dvoid *ctxp,
+                                    ub4 fcode, ub4 when, OCIUcb *ucbDesc);
+
+sword	OCIUserCallbackGet(dvoid *hndlp, ub4 type, dvoid *ehndlp,
+                               ub4 fcode, ub4 when, OCIUserCallback *callbackp,
+                               dvoid **ctxpp, OCIUcb *ucbDesc);
+
+sword   OCISharedLibInit(dvoid *metaCtx, dvoid *libCtx, ub4 argfmt, sword argc,
+                         dvoid *argv[], OCIEnvCallbackType envCallback);
+
+sword OCIFileExists ( dvoid  *hndl, OCIError *err, OraText *filename,
+                     OraText *path, ub1 *flag  );
+
+sword OCIFileFlush( dvoid *hndl, OCIError *err, OCIFileObject *filep  );
+
+
+sword OCIFileGetLength( dvoid *hndl, OCIError *err, OraText *filename,
+                        OraText *path, ubig_ora *lenp  );
+
+sword OCIFileInit ( dvoid *hndl, OCIError *err );
+
+sword OCIFileOpen ( dvoid *hndl, OCIError *err, OCIFileObject **filep,
+                    OraText *filename, OraText *path, ub4 mode, ub4 create, 
+                    ub4 type );
+
+sword OCIFileRead ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+                    dvoid *bufp, ub4 bufl, ub4 *bytesread );
+
+sword OCIFileSeek ( dvoid *hndl, OCIError *err, OCIFileObject *filep,
+                     uword origin, ubig_ora offset, sb1 dir );
+
+sword OCIFileTerm ( dvoid *hndl, OCIError *err );
+
+
+sword OCIFileWrite ( dvoid *hndl, OCIError *err, OCIFileObject   *filep,
+                     dvoid *bufp, ub4 buflen, ub4 *byteswritten );
+
+
+/*
+ ** Initialize the security package
+ */
+sword   OCISecurityInitialize (OCISecurity *sechandle, OCIError *error_handle);
+
+sword   OCISecurityTerminate (OCISecurity *sechandle, OCIError *error_handle);
+
+sword OCISecurityOpenWallet(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            size_t wrllen,
+                            OraText *wallet_resource_locator,
+                            size_t pwdlen,
+                            OraText *password,
+                            nzttWallet *wallet);
+
+sword OCISecurityCloseWallet(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttWallet *wallet);
+
+sword OCISecurityCreateWallet(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              size_t wrllen,
+                              OraText *wallet_resource_locator,
+                              size_t pwdlen,
+                              OraText *password,
+                              nzttWallet *wallet);
+
+sword OCISecurityDestroyWallet(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               size_t wrllen,
+                               OraText *wallet_resource_locator,
+                               size_t pwdlen,
+                               OraText *password);
+
+sword OCISecurityStorePersona(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona **persona,
+                              nzttWallet *wallet);
+
+sword OCISecurityOpenPersona(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttPersona *persona);
+
+sword OCISecurityClosePersona(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona);
+
+sword OCISecurityRemovePersona(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona **persona);
+
+sword OCISecurityCreatePersona(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttIdentType identity_type,
+                               nzttCipherType cipher_type,
+                               nzttPersonaDesc *desc,
+                               nzttPersona **persona);
+
+sword OCISecuritySetProtection(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               nzttcef crypto_engine_function,
+                               nztttdufmt data_unit_format,
+                               nzttProtInfo *protection_info);
+
+sword OCISecurityGetProtection(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               nzttcef crypto_engine_function,
+                               nztttdufmt * data_unit_format_ptr,
+                               nzttProtInfo *protection_info);
+
+sword OCISecurityRemoveIdentity(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttIdentity **identity_ptr);
+
+sword OCISecurityCreateIdentity(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttIdentType type,
+                                nzttIdentityDesc *desc,
+                                nzttIdentity **identity_ptr);
+
+sword OCISecurityAbortIdentity(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttIdentity **identity_ptr);
+
+sword OCISecurityFreeIdentity(OCISecurity *osshandle,
+			      OCIError *error_handle,
+			      nzttIdentity **identity_ptr);
+
+
+sword OCISecurityStoreTrustedIdentity(OCISecurity *osshandle,
+                                      OCIError *error_handle,
+                                      nzttIdentity **identity_ptr,
+                                      nzttPersona *persona);
+
+sword OCISecuritySign(OCISecurity *osshandle,
+                      OCIError *error_handle,
+                      nzttPersona *persona,
+                      nzttces signature_state,
+                      size_t input_length,
+                      ub1 *input,
+                      nzttBufferBlock *buffer_block);
+
+sword OCISecuritySignExpansion(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               size_t inputlen,
+                               size_t *signature_length);
+
+sword OCISecurityVerify(OCISecurity *osshandle,
+                        OCIError *error_handle,
+                        nzttPersona *persona,
+                        nzttces signature_state,
+                        size_t siglen,
+                        ub1 *signature,
+                        nzttBufferBlock *extracted_message,
+                        boolean *verified,
+                        boolean *validated,
+                        nzttIdentity **signing_party_identity);
+
+sword OCISecurityValidate(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          nzttPersona *persona,
+                          nzttIdentity *sidentity,
+                          boolean *validated);
+
+sword OCISecuritySignDetached(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona,
+                              nzttces signature_state,
+                              size_t input_length,
+                              ub1 * input,
+                              nzttBufferBlock *signature);
+
+sword OCISecuritySignDetExpansion(OCISecurity *osshandle,
+                                  OCIError *error_handle,
+                                  nzttPersona *persona,
+                                  size_t input_length,
+                                  size_t *required_buffer_length);
+
+sword OCISecurityVerifyDetached(OCISecurity *osshandle,
+                                OCIError *error_handle,
+                                nzttPersona *persona,
+                                nzttces signature_state,
+                                size_t data_length,
+                                ub1 *data,
+                                size_t siglen,
+                                ub1 *signature,
+                                boolean *verified,
+                                boolean *validated,
+                                nzttIdentity **signing_party_identity);
+
+sword OCISecurity_PKEncrypt(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            size_t number_of_recipients,
+                            nzttIdentity *recipient_list,
+                            nzttces encryption_state,
+                            size_t input_length,
+                            ub1 *input,
+                            nzttBufferBlock *encrypted_data);
+
+sword OCISecurityPKEncryptExpansion(OCISecurity *osshandle,
+                                    OCIError *error_handle,
+                                    nzttPersona *persona,
+                                    size_t number_recipients,
+                                    size_t input_length,
+                                    size_t *buffer_length_required);
+
+sword OCISecurityPKDecrypt(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttPersona *persona,
+                           nzttces encryption_state,
+                           size_t input_length,
+                           ub1 *input,
+                           nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncrypt(OCISecurity *osshandle,
+                         OCIError *error_handle,
+                         nzttPersona *persona,
+                         nzttces encryption_state,
+                         size_t input_length,
+                         ub1 *input,
+                         nzttBufferBlock *encrypted_data);
+
+sword OCISecurityEncryptExpansion(OCISecurity *osshandle,
+                                  OCIError *error_handle,
+                                  nzttPersona *persona,
+                                  size_t input_length,
+                                  size_t *encrypted_data_length);
+
+sword OCISecurityDecrypt(OCISecurity *osshandle,
+                         OCIError *error_handle,
+                         nzttPersona *persona,
+                         nzttces decryption_state,
+                         size_t input_length,
+                         ub1 *input,
+                         nzttBufferBlock *decrypted_data);
+
+sword OCISecurityEnvelope(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          nzttPersona *persona,
+                          size_t number_of_recipients,
+                          nzttIdentity *sidentity,
+                          nzttces encryption_state,
+                          size_t input_length,
+                          ub1 *input,
+                          nzttBufferBlock *enveloped_data);
+
+sword OCISecurityDeEnvelope(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            nzttces decryption_state,
+                            size_t input_length,
+                            ub1 *input,
+                            nzttBufferBlock *output_message,
+                            boolean *verified,
+                            boolean *validated,
+                            nzttIdentity **sender_identity);
+
+sword OCISecurityKeyedHash(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttPersona *persona,
+                           nzttces hash_state,
+                           size_t input_length,
+                           ub1 *input,
+                           nzttBufferBlock *keyed_hash);
+
+sword OCISecurityKeyedHashExpansion(OCISecurity *osshandle,
+                                    OCIError *error_handle,
+                                    nzttPersona *persona,
+                                    size_t input_length,
+                                    size_t *required_buffer_length);
+
+sword OCISecurityHash(OCISecurity *osshandle,
+                      OCIError *error_handle,
+                      nzttPersona *persona,
+                      nzttces hash_state,
+                      size_t input,
+                      ub1 *input_length,
+                      nzttBufferBlock *shash);
+
+sword OCISecurityHashExpansion(OCISecurity *osshandle,
+                               OCIError *error_handle,
+                               nzttPersona *persona,
+                               size_t input_length,
+                               size_t *required_buffer_length);
+
+sword OCISecuritySeedRandom(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttPersona *persona,
+                            size_t seed_length,
+                            ub1 *seed);
+
+sword OCISecurityRandomBytes(OCISecurity *osshandle,
+                             OCIError *error_handle,
+                             nzttPersona *persona,
+                             size_t number_of_bytes_desired,
+                             nzttBufferBlock *random_bytes);
+
+sword OCISecurityRandomNumber(OCISecurity *osshandle,
+                              OCIError *error_handle,
+                              nzttPersona *persona,
+                              uword *random_number_ptr);
+
+sword OCISecurityInitBlock(OCISecurity *osshandle,
+                           OCIError *error_handle,
+                           nzttBufferBlock *buffer_block);
+
+sword OCISecurityReuseBlock(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttBufferBlock *buffer_block);
+
+sword OCISecurityPurgeBlock(OCISecurity *osshandle,
+                            OCIError *error_handle,
+                            nzttBufferBlock *buffer_block);
+
+sword OCISecuritySetBlock(OCISecurity *osshandle,
+                          OCIError *error_handle,
+                          uword flags_to_set,
+                          size_t buffer_length,
+                          size_t used_buffer_length,
+                          ub1 *buffer,
+                          nzttBufferBlock *buffer_block);
+
+sword OCISecurityGetIdentity(OCISecurity   *osshandle,
+                             OCIError      *error_handle,
+                             size_t         namelen,
+                             OraText          *distinguished_name,
+                             nzttIdentity **sidentity);
+
+sword OCIAQEnq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+		 OCIAQEnqOptions *enqopt, OCIAQMsgProperties *msgprop,
+		 OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, 
+		 OCIRaw **msgid, ub4 flags); 
+
+sword OCIAQDeq(OCISvcCtx *svchp, OCIError *errhp, OraText *queue_name,
+		 OCIAQDeqOptions *deqopt, OCIAQMsgProperties *msgprop,
+		 OCIType *payload_tdo, dvoid **payload, dvoid **payload_ind, 
+		 OCIRaw **msgid, ub4 flags); 
+
+sword OCIAQListen(/*_ OCISvcCtx *svchp, OCIError *errhp, 
+		      OCIAQAgent **agent_list, ub4 num_agents,
+		      sb4 wait, OCIAQAgent **agent,
+		      ub4 flags _*/);
+
+sword OCIExtractInit(dvoid *hndl, OCIError *err);
+
+sword OCIExtractTerm(dvoid *hndl, OCIError *err);
+
+sword OCIExtractReset(dvoid *hndl, OCIError *err);
+
+sword OCIExtractSetNumKeys(dvoid *hndl, OCIError *err, uword numkeys);
+
+sword OCIExtractSetKey(dvoid *hndl, OCIError *err, CONST OraText *name, 
+                       ub1 type, ub4 flag, CONST dvoid *defval, 
+                       CONST sb4 *intrange, CONST OraText *CONST *strlist);
+
+sword OCIExtractFromFile(dvoid *hndl, OCIError *err, ub4 flag, 
+                         OraText *filename);
+
+sword OCIExtractFromStr(dvoid *hndl, OCIError *err, ub4 flag, OraText *input);
+
+sword OCIExtractToInt(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, sb4 *retval);
+
+sword OCIExtractToBool(dvoid *hndl, OCIError *err, OraText *keyname, 
+                       uword valno, ub1 *retval);
+
+sword OCIExtractToStr(dvoid *hndl, OCIError *err, OraText *keyname, 
+                      uword valno, OraText *retval, uword buflen);
+
+sword OCIExtractToOCINum(dvoid *hndl, OCIError *err, OraText *keyname, 
+                         uword valno, OCINumber *retval);
+
+sword OCIExtractToList(dvoid *hndl, OCIError *err, uword *numkeys);
+
+sword OCIExtractFromList(dvoid *hndl, OCIError *err, uword index, 
+			 OraText **name, 
+                         ub1 *type, uword *numvals, dvoid ***values);
+
+/* Memory Related Service Interfaces */
+
+sword OCIMemoryAlloc(dvoid *hdl, OCIError *err, dvoid **mem,
+	OCIDuration dur, ub4 size, ub4 flags);
+
+sword OCIMemoryResize(dvoid *hdl, OCIError *err, dvoid **mem,
+			ub4 newsize, ub4 flags);
+			
+sword OCIMemoryFree(dvoid *hdl, OCIError *err, dvoid *mem);
+
+sword OCIContextSetValue(dvoid *hdl, OCIError *err, OCIDuration duration,
+			ub1 *key, ub1 keylen, dvoid *ctx_value);
+
+sword OCIContextGetValue(dvoid *hdl, OCIError *err, ub1 *key,
+			ub1 keylen, dvoid **ctx_value);
+
+sword OCIContextClearValue(dvoid *hdl, OCIError *err, ub1 *key, 
+			ub1 keylen);
+
+sword OCIContextGenerateKey(dvoid *hdl, OCIError *err, ub4 *key);
+
+sword OCIMemorySetCurrentIDs(dvoid *hdl, OCIError *err, 
+	ub4 curr_session_id, ub4 curr_trans_id, ub4 curr_stmt_id);
+
+sword OCIPicklerTdsCtxInit(OCIEnv *env, OCIError *err, 
+                           OCIPicklerTdsCtx **tdsc);
+
+sword OCIPicklerTdsCtxFree(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc);
+
+sword OCIPicklerTdsInit(OCIEnv *env, OCIError *err, OCIPicklerTdsCtx *tdsc, 
+					OCIPicklerTds **tdsh);
+
+sword OCIPicklerTdsFree(OCIEnv *env, OCIError *err, OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsCreateElementNumber(OCIEnv *env, OCIError *err, 
+					OCIPicklerTds *tdsh, ub1 prec, 
+					sb1 scale, OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementChar(OCIEnv *env, OCIError *err, 
+				     OCIPicklerTds *tdsh, ub2 len, 
+				     OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementVarchar(OCIEnv *env, OCIError *err, 
+                                        OCIPicklerTds *tdsh, ub2 len, 
+                                        OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElementRaw(OCIEnv *env, OCIError *err, 
+                                    OCIPicklerTds *tdsh, ub2 len, 
+                                    OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsCreateElement(OCIEnv *env, OCIError *err, 
+                                 OCIPicklerTds *tdsh, OCITypeCode dty, 
+                                 OCIPicklerTdsElement *elt);
+
+sword OCIPicklerTdsAddAttr(OCIEnv *env, OCIError *err, 
+                           OCIPicklerTds *tdsh, OCIPicklerTdsElement elt);
+
+sword OCIPicklerTdsGenerate(OCIEnv *env, OCIError *err, 
+				OCIPicklerTds *tdsh);
+
+sword OCIPicklerTdsGetAttr(OCIEnv *env, OCIError *err, 
+				CONST OCIPicklerTds *tdsh, ub1  attrno,
+				OCITypeCode *typ, ub2  *len);
+
+sword OCIPicklerFdoInit(OCIEnv *env, OCIError *err, 
+				OCIPicklerFdo **fdoh);
+
+sword OCIPicklerFdoFree(OCIEnv *env, OCIError *err, 
+				OCIPicklerFdo *fdoh);
+
+sword OCIPicklerImageInit(OCIEnv *env, OCIError *err, 
+                          OCIPicklerFdo *fdoh, 
+                          OCIPicklerTds *tdsh,
+			  OCIPicklerImage **imgh);
+
+sword OCIPicklerImageFree(OCIEnv *env, OCIError *err, 
+				OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageAddScalar(OCIEnv *env, OCIError *err,  
+                               OCIPicklerImage *imgh, dvoid *scalar, ub4  len);
+ 
+sword OCIPicklerImageAddNullScalar(OCIEnv *env, OCIError *err, 
+				OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageGenerate(OCIEnv *env, OCIError *err, 
+				OCIPicklerImage *imgh);
+ 
+sword OCIPicklerImageGetScalarSize(OCIEnv *env, OCIError *err, 
+				OCIPicklerImage *imgh, 
+				ub4  attrno, ub4  *size);
+ 
+sword OCIPicklerImageGetScalar(OCIEnv *env, OCIError *err, 
+				OCIPicklerImage *imgh, ub4  attrno, 
+				dvoid *buf, ub4  *len, OCIInd *ind);
+
+sword OCIPicklerImageCollBegin(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, CONST OCIPicklerTds *colltdsh);
+ 
+sword OCIPicklerImageCollAddScalar( OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, dvoid *scalar,
+                ub4 buflen, OCIInd ind);
+ 
+sword OCIPicklerImageCollEnd(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh);
+ 
+/* should take svcctx for locator stuff */
+sword OCIPicklerImageCollBeginScan(OCIEnv *env, OCIError *err,
+                OCIPicklerImage *imgh, CONST OCIPicklerTds *coll_tdsh,
+                ub4 attrnum, ub4 startidx, OCIInd *ind);
+ 
+sword OCIPicklerImageCollGetScalarSize(OCIEnv *env, OCIError *err,
+                CONST OCIPicklerTds *coll_tdsh, ub4 *size);
+ 
+sword OCIPicklerImageCollGetScalar(OCIEnv *env, OCIError *err,
+                                   OCIPicklerImage *imgh, dvoid *buf,
+                                   ub4 *buflen, OCIInd *ind);
+
+sword OCIAnyDataGetType(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode *tc, OCIType **type);
+
+sword OCIAnyDataIsNull(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        boolean *isnull);
+
+sword OCIAnyDataConvert(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, dvoid *ind, dvoid *data_val,
+        ub4 len, OCIAnyData **sdata);
+
+sword OCIAnyDataBeginCreate(OCISvcCtx *svchp, OCIError *errhp, OCITypeCode tc,
+        OCIType *type, OCIDuration dur, OCIAnyData **sdata);
+
+sword OCIAnyDataDestroy(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata);
+
+sword OCIAnyDataAttrSet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 length, boolean is_any);
+
+sword OCIAnyDataCollAddElem(OCISvcCtx *svchp, OCIError *errhp,
+        OCIAnyData *sdata, OCITypeCode tc, OCIType *type, dvoid *ind,
+        dvoid *attr_val, ub4 length, boolean is_any, boolean last_elem);
+
+sword OCIAnyDataEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+                          OCIAnyData *sdata);
+
+sword OCIAnyDataAccess(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+        OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 *length);
+
+sword OCIAnyDataGetCurrAttrNum(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+			ub4 *attrnum);
+
+sword OCIAnyDataAttrGet(OCISvcCtx *svchp, OCIError *errhp, OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *attr_val,
+        ub4 *length, boolean is_any);
+
+sword OCIAnyDataCollGetElem(OCISvcCtx *svchp, OCIError *errhp,
+  OCIAnyData *sdata,
+  OCITypeCode tc, OCIType *type, dvoid *ind, dvoid *celem_val,
+  ub4 *length, boolean is_any);
+
+
+/*------------------------ OCIAnyDataSet interfaces -------------------------*/
+
+/*
+   NAME
+     OCIAnyDataSetBeginCreate - OCIAnyDataSet Begin Creation
+   PARAMETERS
+     svchp (IN/OUT) - The OCI service context.
+     errhp (IN/OUT) - The OCI error handle. If there is an error, it is
+                      recorded in errhp and this function returns OCI_ERROR.
+                      Diagnostic information can be obtained by calling
+                      OCIErrorGet().
+     typecode       - typecode corresponding to the OCIAnyDataSet.
+     type (IN)      - type corresponding to the OCIAnyDataSet. If the typecode
+                      corresponds to a built-in type (OCI_TYPECODE_NUMBER etc.)
+                      , this parameter can be NULL. It should be non NULL for
+                      user defined types (OCI_TYPECODE_OBJECT,
+                      OCI_TYPECODE_REF, collection types etc.)
+     dur (IN)       - duration for which OCIAnyDataSet is allocated.
+     data_set (OUT) - Initialized OCIAnyDataSet.
+     RETURNS        - error code
+   NOTES
+     This call allocates an OCIAnyDataSet for the duration of dur and
+     initializes it with the type information. The OCIAnyDataSet can hold
+     multiple instances of the given type. For performance reasons, the 
+     OCIAnyDataSet will end up pointing to the passed in OCIType parameter.
+     It is the responsibility of the caller to ensure that the OCIType is
+     longer lived (has allocation duration >= the duration of the OCIAnyData
+     if the OCIType is a transient one, allocation/pin duration >= duration of
+     the OCIAnyData if the OCIType is a persistent one).
+
+*/
+sword OCIAnyDataSetBeginCreate(OCISvcCtx *svchp, OCIError *errhp,
+     OCITypeCode typecode, CONST OCIType *type, OCIDuration dur,
+     OCIAnyDataSet ** data_set);
+
+/*
+   NAME
+     OCIAnyDataSetDestroy  - OCIAnyDataSet Destroy
+   DESCRIPTION
+     This call frees the OCIAnyDataSet allocated using
+     OCIAnyDataSetBeginCreate().
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)    - The OCI service context.
+     errhp (IN/OUT)    - The OCI Error handle.
+     data_set (IN/OUT) - OCIAnyDataSet to be freed.
+*/
+sword OCIAnyDataSetDestroy(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set);
+
+
+/*
+   NAME
+     OCIAnyDataSetAddInstance - OCIAnyDataSet Add an instance
+   DESCRIPTION
+     This call adds a new skeleton instance to the OCIAnyDataSet and all the
+     attributes of the instance are set to NULL. It returns this skeleton
+     instance through the OCIAnyData parameter which can be constructed
+     subsequently by invoking the OCIAnyData API.
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN/OUT)   - OCIAnyDataSet to which a new instance is added.
+     data (IN/OUT)       - OCIAnyData corresponding to the newly added
+                           instance. If (*data) is NULL, a new OCIAnyData will
+                           be allocated for same duration as the OCIAnyDataSet.
+                           If (*data) is not NULL, it will get reused. This
+                           OCIAnyData can be subseqently constructed using the
+                           OCIAnyDataConvert() call or it can be constructed
+                           piece-wise using the OCIAnyDataAttrSet and
+                           OCIAnyDataCollAddElem calls.
+   NOTES
+     No Destruction of the old value is done here. It is the responsibility of
+     the caller to destroy the old value pointed to by (*data) and set (*data)
+     to a null pointer before beginning to make a sequence of this call. No
+     deep copying (of OCIType information nor the data part.) is done in the
+     returned OCIAnyData. This OCIAnyData cannot be used beyond the allocation
+     duration of the OCIAnyDataSet (it is like a reference into the
+     OCIAnyDataSet). The returned OCIAnyData can be reused on subsequent calls
+     to this function, to sequentially add new data instances to the
+     OCIAnyDataSet.
+*/
+sword OCIAnyDataSetAddInstance(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*
+   NAME
+     OCIAnyDataSetEndCreate - OCIAnyDataSet End Creation process.
+   DESCRIPTION
+     This call marks the end of OCIAnyDataSet creation. It should be called
+     after constructing all of its instance(s).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)        - The OCI service context.
+     errhp (IN/OUT)        - The OCI error handle. If there is an error, it is
+                             recorded in errhp and this function returns
+                             OCI_ERROR. Diagnostic information can be obtained
+                             by calling OCIErrorGet().
+     data_set (IN/OUT)     - OCIAnyDataSet that has been fully constructed.
+*/
+sword OCIAnyDataSetEndCreate(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set);
+
+/*
+   NAME
+     OCIAnyDataSetGetType - OCIAnyDataSet Get Type of an OCIAnyDataSet
+   DESCRIPTION
+     Gets the Type corresponding to an OCIAnyDataSet. It returns the actual
+     pointer to the type maintained inside an OCIAnyDataSet. No copying is
+     done for performance reasons. The client is responsible for not using
+     this type once the OCIAnyDataSet is freed (or its duration ends).
+   RETURNS
+     error code.
+   PARAMETERS
+     svchp (IN/OUT)      - The OCI service context.
+     errhp (IN/OUT)      - The OCI Error handle.
+     data_set (IN)       - Initialized OCIAnyDataSet.
+     tc (OUT)            - The typecode of the type.
+     type (OUT)          - The type corresponding to the OCIAnyDataSet. This
+                           could be null if the OCIAnyData corresponds to a
+                           built-in type.
+*/
+sword OCIAnyDataSetGetType (OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCITypeCode *tc, OCIType **type);
+
+/*
+  NAME
+    OCIAnyDataSetGetCount - OCIAnyDataSet Get Count of instances.
+  DESCRIPTION
+    This call gets the number of instances in the OCIAnyDataSet.
+  RETURNS
+    error code.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet.
+    count (OUT)         - number of instances in OCIAnyDataSet
+*/
+sword OCIAnyDataSetGetCount(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, ub4 *count);
+
+/*
+  NAME
+    OCIAnyDataSetGetInstance - OCIAnyDataSet Get next instance.
+  DESCRIPTION
+    Only sequential access to the instances in an OCIAnyDataSet is allowed.
+    This call returns the OCIAnyData corresponding to an instance at the
+    current position and updates the current position. Subsequently, the
+    OCIAnyData access routines may be used to access the instance.
+  RETURNS
+    error code. Returns OCI_NO_DATA if the current position is at the end of
+    the set, OCI_SUCCESS otherwise.
+  PARAMETERS
+    svchp (IN/OUT)      - OCI Service Context
+    errhp (IN/OUT)      - OCI Error handle
+    data_set (IN)       - Well formed OCIAnyDataSet
+    data (IN/OUT)       - OCIAnyData corresponding to the instance. If (*data)
+                          is NULL, a new OCIAnyData will be allocated for same
+                          duration as the OCIAnyDataSet. If (*data) is not NULL
+                          , it will get reused. This OCIAnyData can be
+                          subsequently accessed using the OCIAnyDataAccess()
+                          call or piece-wise by using the OCIAnyDataAttrGet()
+                          call.
+  NOTE
+    No Destruction of the old value is done here. It is the responsibility of
+    the caller to destroy the old value pointed to by (*data) and set (*data)
+    to a null pointer before beginning to make a sequence of this call. No deep
+    copying (of OCIType information nor the data part.) is done in the returned
+    OCIAnyData. This OCIAnyData cannot be used beyond the allocation duration
+    of the OCIAnyDataSet (it is like a reference into the OCIAnyDataSet). The
+    returned OCIAnyData can be reused on subsequent calls to this function to
+    sequentially access the OCIAnyDataSet.
+*/
+sword OCIAnyDataSetGetInstance(OCISvcCtx *svchp, OCIError *errhp,
+     OCIAnyDataSet *data_set, OCIAnyData **data);
+
+/*--------------------- End of OCIAnyDataSet interfaces ---------------------*/
+
+sword OCIFormatInit(dvoid *hndl, OCIError *err);
+
+sword OCIFormatString(dvoid *hndl, OCIError *err, OraText *buffer,
+                      sbig_ora bufferLength, sbig_ora *returnLength,
+                      CONST OraText *formatString, ...);
+
+sword OCIFormatTerm(dvoid *hndl, OCIError *err);
+
+sword OCIFormatTUb1(void);
+sword OCIFormatTUb2(void);
+sword OCIFormatTUb4(void);
+sword OCIFormatTUword(void);
+sword OCIFormatTUbig_ora(void);
+sword OCIFormatTSb1(void);
+sword OCIFormatTSb2(void);
+sword OCIFormatTSb4(void);
+sword OCIFormatTSword(void);
+sword OCIFormatTSbig_ora(void);
+sword OCIFormatTEb1(void);
+sword OCIFormatTEb2(void);
+sword OCIFormatTEb4(void);
+sword OCIFormatTEword(void);
+sword OCIFormatTChar(void);
+sword OCIFormatTText(void);
+sword OCIFormatTDouble(void);
+sword OCIFormatTDvoid(void);
+sword OCIFormatTEnd(void);
+
+/*-------------------------- Extensions to XA interface ---------------------*/
+/* ------------------------- xaosvch ----------------------------------------*/
+/*
+   NAME
+     xaosvch  -  XA Oracle get SerViCe Handle
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This macro has been provided for backward compatibilty with 8.0.2
+*/
+OCISvcCtx *xaosvch(OraText *dbname);
+
+/* ------------------------- xaoSvcCtx --------------------------------------*/
+/*
+   NAME
+     xaoSvcCtx  -  XA Oracle get SerViCe ConTeXt
+   DESCRIPTION
+     Given a database name return the service handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the service
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCISvcCtx *xaoSvcCtx(OraText *dbname);
+
+/* ------------------------- xaoEnv -----------------------------------------*/
+/*
+   NAME
+     xaoEnv  -  XA Oracle get ENvironment Handle
+   DESCRIPTION
+     Given a database name return the environment handle that is used by the
+     XA library
+   NOTE
+     This routine has been provided for APs to get access to the environment
+     handle that XA library uses. Without this routine APs must use SQLLIB
+     routine sqlld2 to get access to the Logon data area registered by the
+     XA library
+*/
+OCIEnv *xaoEnv(OraText *dbname);
+
+/* ------------------------- xaosterr ---------------------------------------*/
+/*
+   NAME
+     xaosterr  -  XA Oracle get xa STart ERRor code
+   DESCRIPTION
+     Given an oracle error code return the XA error code
+ */
+int xaosterr(OCISvcCtx *svch, sb4 error);
+/*-------------------------- End Extensions ---------------------------------*/
+/*---------------------- Extensions to NLS cartridge service ----------------*/
+/* ----------------------- OCINlsGetInfo ------------------------------------*/
+/*
+   NAME
+     OCINlsGetInfo - Get NLS info from OCI environment handle
+   REMARKS
+     This function generates language information specified by item from OCI 
+     environment handle envhp into an array pointed to by buf within size 
+     limitation as buflen.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   buf(OUT)
+     Pointer to the destination buffer.
+   buflen(IN)
+     The size of destination buffer. The maximum length for each information
+     is 32 bytes.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_DAYNAME1 : Native name for Monday.
+       OCI_NLS_DAYNAME2 : Native name for Tuesday.
+       OCI_NLS_DAYNAME3 : Native name for Wednesday.
+       OCI_NLS_DAYNAME4 : Native name for Thursday.
+       OCI_NLS_DAYNAME5 : Native name for Friday.
+       OCI_NLS_DAYNAME6 : Native name for for Saturday.
+       OCI_NLS_DAYNAME7 : Native name for for Sunday.
+       OCI_NLS_ABDAYNAME1 : Native abbreviated name for Monday.
+       OCI_NLS_ABDAYNAME2 : Native abbreviated name for Tuesday.
+       OCI_NLS_ABDAYNAME3 : Native abbreviated name for Wednesday.
+       OCI_NLS_ABDAYNAME4 : Native abbreviated name for Thursday.
+       OCI_NLS_ABDAYNAME5 : Native abbreviated name for Friday.
+       OCI_NLS_ABDAYNAME6 : Native abbreviated name for for Saturday.
+       OCI_NLS_ABDAYNAME7 : Native abbreviated name for for Sunday.
+       OCI_NLS_MONTHNAME1 : Native name for January.
+       OCI_NLS_MONTHNAME2 : Native name for February.
+       OCI_NLS_MONTHNAME3 : Native name for March.
+       OCI_NLS_MONTHNAME4 : Native name for April.
+       OCI_NLS_MONTHNAME5 : Native name for May.
+       OCI_NLS_MONTHNAME6 : Native name for June.
+       OCI_NLS_MONTHNAME7 : Native name for July.
+       OCI_NLS_MONTHNAME8 : Native name for August.
+       OCI_NLS_MONTHNAME9 : Native name for September.
+       OCI_NLS_MONTHNAME10 : Native name for October.
+       OCI_NLS_MONTHNAME11 : Native name for November.
+       OCI_NLS_MONTHNAME12 : Native name for December.
+       OCI_NLS_ABMONTHNAME1 : Native abbreviated name for January.
+       OCI_NLS_ABMONTHNAME2 : Native abbreviated name for February.
+       OCI_NLS_ABMONTHNAME3 : Native abbreviated name for March.
+       OCI_NLS_ABMONTHNAME4 : Native abbreviated name for April.
+       OCI_NLS_ABMONTHNAME5 : Native abbreviated name for May.
+       OCI_NLS_ABMONTHNAME6 : Native abbreviated name for June.
+       OCI_NLS_ABMONTHNAME7 : Native abbreviated name for July.
+       OCI_NLS_ABMONTHNAME8 : Native abbreviated name for August.
+       OCI_NLS_ABMONTHNAME9 : Native abbreviated name for September.
+       OCI_NLS_ABMONTHNAME10 : Native abbreviated name for October.
+       OCI_NLS_ABMONTHNAME11 : Native abbreviated name for November.
+       OCI_NLS_ABMONTHNAME12 : Native abbreviated name for December.
+       OCI_NLS_YES : Native string for affirmative response.
+       OCI_NLS_NO : Native negative response. 
+       OCI_NLS_AM : Native equivalent string of AM.
+       OCI_NLS_PM : Native equivalent string of PM.
+       OCI_NLS_AD : Native equivalent string of AD.
+       OCI_NLS_BC : Native equivalent string of BC.
+       OCI_NLS_DECIMAL : decimal character.
+       OCI_NLS_GROUP : group separator.
+       OCI_NLS_DEBIT : Native symbol of debit.
+       OCI_NLS_CREDIT : Native sumbol of credit.
+       OCI_NLS_DATEFORMAT : Oracle date format.
+       OCI_NLS_INT_CURRENCY: International currency symbol.
+       OCI_NLS_LOC_CURRENCY : Locale currency symbol.
+       OCI_NLS_LANGUAGE : Language name.
+       OCI_NLS_ABLANGUAGE : Abbreviation for language name.
+       OCI_NLS_TERRITORY : Territory name.
+       OCI_NLS_CHARACTER_SET : Character set name.
+       OCI_NLS_LINGUISTIC : Linguistic name.
+       OCI_NLS_CALENDAR : Calendar name.
+       OCI_NLS_DUAL_CURRENCY : Dual currency symbol.
+*/
+sword OCINlsGetInfo(dvoid *envhp, OCIError *errhp, OraText *buf,
+                    size_t buflen, ub2 item);
+
+/* ----------------------- OCINlsNumericInfoGet -----------------------------*/
+/*
+   NAME
+     OCINlsNumericInfoGet - Get NLS numeric info from OCI environment handle
+   REMARKS
+     This function generates numeric language information specified by item 
+     from OCI environment handle envhp into an output number variable.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR on wrong item.
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and 
+     this function returns a NULL pointer. Diagnostic information can be 
+     obtained by calling OCIErrorGet().
+   val(OUT)
+     Pointer to the output number variable. On OCI_SUCCESS return, it will
+     contain the requested NLS numeric info.
+   item(IN)
+     It specifies to get which item in OCI environment handle and can be one
+     of following values:
+       OCI_NLS_CHARSET_MAXBYTESZ : Maximum character byte size for OCI
+                                   environment or session handle charset
+       OCI_NLS_CHARSET_FIXEDWIDTH: Character byte size for fixed-width charset;
+                                   0 for variable-width charset 
+*/
+sword OCINlsNumericInfoGet(dvoid *envhp, OCIError *errhp, sb4 *val, ub2 item);
+
+/* ----------------------- OCINlsCharSetNameToId -----------------------------*/
+/*
+   NAME
+     OCINlsCharSetNameToId - Get Oracle charset id given Oracle charset name
+   REMARKS
+     This function will get the Oracle character set id corresponding to
+     the given Oracle character set name.
+   RETURNS
+     Oracle character set id for the given Oracle character set name if
+     character set name and OCI handle are valid; otherwise returns 0.
+   envhp(IN/OUT)
+     OCI environment handle.
+   name(IN)
+     Pointer to a null-terminated Oracle character set name whose id 
+     will be returned.
+*/
+ub2 OCINlsCharSetNameToId(dvoid *envhp, const oratext *name);
+
+/* ----------------------- OCINlsCharSetIdToName -----------------------------*/
+/*
+   NAME
+     OCINlsCharSetIdToName - Get Oracle charset name given Oracle charset id
+   REMARKS
+     This function will get the Oracle character set name corresponding to
+     the given Oracle character set id.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will contain
+     the null-terminated string for character set name.
+   buflen(IN)
+     Size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ for
+     guarantee to store an Oracle character set name. If it's smaller than
+     the length of the character set name, the function will return OCI_ERROR.
+   id(IN)
+     Oracle character set id.
+*/
+sword OCINlsCharSetIdToName(dvoid *envhp, oratext *buf, size_t buflen, ub2 id);
+
+/* ----------------------- OCINlsNameMap ------------------------------------*/
+/*
+   NAME
+     OCINlsNameMap - Map NLS naming from Oracle to other standards and vice 
+                     versa
+   REMARKS
+     This function will map NLS naming from Oracle to other standards (such
+     as ISO, IANA) and vice versa.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE, or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle. If handle invalid, returns OCI_INVALID_HANDLE.
+   buf(OUT)
+     Pointer to the destination buffer. On OCI_SUCCESS return, it will 
+     contain null-terminated string for requested mapped name.
+   buflen(IN)
+     The size of destination buffer. Recommended size is OCI_NLS_MAXBUFSZ
+     for guarantee to store an NLS name. If it is smaller than the length
+     of the name, the function will return OCI_ERROR.
+   srcbuf(IN)
+     Pointer to null-terminated NLS name. If it is not a valid name in its
+     define scope, the function will return OCI_ERROR.
+   flag(IN)
+     It specifies name mapping direction and can take the following values:
+       OCI_NLS_CS_IANA_TO_ORA : Map character set name from IANA to Oracle
+       OCI_NLS_CS_ORA_TO_IANA : Map character set name from Oracle to IANA
+       OCI_NLS_LANG_ISO_TO_ORA : Map language name from ISO to Oracle
+       OCI_NLS_LANG_ORA_TO_ISO : Map language name from Oracle to ISO
+       OCI_NLS_TERR_ISO_TO_ORA : Map territory name from ISO to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO : Map territory name from Oracle to ISO
+       OCI_NLS_TERR_ISO3_TO_ORA : Map territory name from 3-letter ISO
+                                  abbreviation to Oracle
+       OCI_NLS_TERR_ORA_TO_ISO3 : Map territory name from Oracle to 3-letter
+                                  ISO abbreviation
+*/
+sword OCINlsNameMap(dvoid *envhp, oratext *buf, size_t buflen,
+                    const oratext *srcbuf, ub4 flag);
+
+/* -------------------- OCIMultiByteToWideChar ------------------------------*/
+/*
+   NAME
+     OCIMultiByteToWideChar - Convert a null terminated multibyte string into 
+                              wchar
+   REMARKS
+     This routine converts an entire null-terminated string into the wchar 
+     format. The wchar output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for wchar.
+   src (IN)
+     Source string to be converted.
+   rsize (OUT)
+     Number of characters converted including null-terminator.
+     If it is a NULL pointer, no number return
+*/
+sword OCIMultiByteToWideChar(dvoid *envhp, OCIWchar *dst, CONST OraText *src,
+                             size_t *rsize);
+
+
+/* --------------------- OCIMultiByteInSizeToWideChar -----------------------*/
+/*
+   NAME
+     OCIMultiByteInSizeToWideChar - Convert a mulitbyte string in length into
+                                    wchar
+   REMARKS
+     This routine converts part of string into the wchar format. It will
+     convert as many complete characters as it can until it reaches output
+     buffer size or input buffer size or it reaches a null-terminator in
+     source string. The output buffer will be null-terminated if space permits.
+     If dstsz is zero, this function will only return number of characters not
+     including ending null terminator for converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Pointer to a destination buffer for wchar. It can be NULL pointer when
+     dstsz is zero.
+   dstsz(IN)
+     Destination buffer size in character. If it is zero, this function just
+     returns number of characters will be need for the conversion.
+   src (IN)
+     Source string to be converted.
+   srcsz(IN)
+     Length of source string in byte.
+   rsize(OUT)
+     Number of characters written into destination buffer, or number of
+     characters for converted string is dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIMultiByteInSizeToWideChar(dvoid *envhp, OCIWchar *dst,
+                                  size_t dstsz, CONST OraText *src, 
+                                  size_t srcsz, size_t *rsize);
+
+
+/* ---------------------- OCIWideCharToMultiByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharToMultiByte - Convert a null terminated wchar string into
+                              multibyte
+   REMARKS
+     This routine converts an entire null-terminated wide character string into
+     multi-byte string. The output buffer will be null-terminated.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte string.
+   src (IN)
+     Source wchar string to be converted.
+   rsize (OUT)
+     Number of bytes written into the destination buffer.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharToMultiByte(dvoid *envhp, OraText *dst, CONST OCIWchar *src,
+                             size_t *rsize);
+
+
+/* ---------------------- OCIWideCharInSizeToMultiByte ----------------------*/
+/*
+   NAME
+     OCIWideCharInSizeToMultiByte - Convert a wchar string in length into 
+                                    mulitbyte
+   REMARKS
+     This routine converts part of wchar string into the multi-byte format.
+     It will convert as many complete characters as it can until it reaches
+     output buffer size or input buffer size or it reaches a null-terminator
+     in source string. The output buffer will be null-terminated if space
+     permits. If dstsz is zero, the function just returns the size of byte not 
+     including ending null-terminator need to store the converted string.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set of string.
+   dst (OUT)
+     Destination buffer for multi-byte. It can be NULL pointer if dstsz is
+     zero.
+   dstsz(IN)
+     Destination buffer size in byte. If it is zero, it just returns the size
+     of bytes need for converted string.
+   src (IN)
+     Source wchar string to be converted.
+   srcsz(IN)
+     Length of source string in character.
+   rsize(OUT)
+     Number of bytes written into destination buffer, or number of bytes need
+     to store the converted string if dstsz is zero.
+     If it is NULL pointer, nothing to return.
+*/
+sword OCIWideCharInSizeToMultiByte(dvoid *envhp, OraText *dst,
+                                    size_t dstsz, CONST OCIWchar *src,
+                                    size_t srcsz, size_t *rsize);
+
+
+
+/* ----------------------- OCIWideCharIsAlnum -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlnum - test whether wc is a letter or decimal digit
+   REMARKS
+     It tests whether wc is a letter or decimal digit.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlnum(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsAlpha -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsAlpha - test whether wc is an alphabetic letter
+   REMARKS
+     It tests whether wc is an alphabetic letter
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsAlpha(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsCntrl ---------------------------------*/
+/*
+   NAME
+     OCIWideCharIsCntrl - test whether wc is a control character
+   REMARKS
+     It tests whether wc is a control character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsCntrl(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsDigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsDigit - test whether wc is a decimal digit character
+   REMARKS
+     It tests whether wc is a decimal digit character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsDigit(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsGraph -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsGraph - test whether wc is a graph character
+   REMARKS
+     It tests whether wc is a graph character. A graph character is character
+     with a visible representation and normally includes alphabetic letter,
+     decimal digit, and punctuation.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsGraph(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsLower - test whether wc is a lowercase letter
+   REMARKS
+     It tests whether wc is a lowercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPrint -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPrint - test whether wc is a printable character
+   REMARKS
+     It tests whether wc is a printable character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPrint(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsPunct -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsPunct - test whether wc is a punctuation character
+   REMARKS
+     It tests whether wc is a punctuation character.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsPunct(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsSpace -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsSpace - test whether wc is a space character
+   REMARKS
+     It tests whether wc is a space character. A space character only causes
+     white space in displayed text(for example, space, tab, carriage return,
+     newline, vertical tab or form feed).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSpace(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharIsUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsUpper - test whether wc is a uppercase letter
+   REMARKS
+     It tests whether wc is a uppercase letter.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsUpper(dvoid *envhp, OCIWchar wc);
+
+
+/*----------------------- OCIWideCharIsXdigit -------------------------------*/
+/*
+   NAME
+     OCIWideCharIsXdigit - test whether wc is a hexadecimal digit
+   REMARKS
+     It tests whether wc is a hexadecimal digit ( 0-9, A-F, a-f ).
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsXdigit(dvoid *envhp, OCIWchar wc);
+
+
+/* --------------------- OCIWideCharIsSingleByte ----------------------------*/
+/*
+   NAME
+     OCIWideCharIsSingleByte - test whether wc is a single-byte character
+   REMARKS
+     It tests whether wc is a single-byte character when converted into
+     multi-byte.
+   RETURNS
+     TRUE or FLASE.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for testing.
+*/
+boolean OCIWideCharIsSingleByte(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToLower -------------------------------*/
+/*
+   NAME
+     OCIWideCharToLower - Convert a wchar into the lowercase
+   REMARKS
+     If there is a lower-case character mapping for wc in the specified locale,
+     it will return the lower-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for lowercase mapping.
+*/
+OCIWchar OCIWideCharToLower(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharToUpper -------------------------------*/
+/*
+   NAME
+     OCIWideCharToUpper - Convert a wchar into the uppercase
+   REMARKS
+     If there is a upper-case character mapping for wc in the specified locale,
+     it will return the upper-case in wchar, else return wc itself.
+   RETURNS
+     A wchar
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar for uppercase mapping.
+*/
+OCIWchar OCIWideCharToUpper(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcmp --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcmp - compare two null terminated wchar string
+   REMARKS
+     It compares two wchar string in binary ( based on wchar encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if wstr1 == wstr2.
+     Positive, if wstr1 > wstr2.
+     Negative, if wstr1 < wstr2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   wstr1(IN)
+     Pointer to a null-terminated wchar string.
+   wstr2(IN)
+     Pointer to a null-terminated wchar string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive
+     comparison.
+*/
+int OCIWideCharStrcmp(dvoid *envhp, CONST OCIWchar *wstr1, 
+                CONST OCIWchar *wstr2, int flag);
+
+
+/* ----------------------- OCIWideCharStrncmp -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncmp - compare twe wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcmp(), except that at most len1
+     characters from wstr1 and len2 characters from wstr1 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if wstr1 = wstr2
+     Positive, if wstr1 > wstr2
+     Negative, if wstr1 < wstr2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr1(IN)
+     Pointer to the first wchar string
+   len1(IN)
+     The length for the first string for comparison
+   wstr2(IN)
+     Pointer to the second wchar string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY : for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC : for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIWideCharStrncmp(dvoid *envhp, CONST OCIWchar *wstr1, size_t len1,
+                 CONST OCIWchar *wstr2, size_t len2, int flag);
+
+
+/* ----------------------- OCIWideCharStrcat --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcat - concatenate two wchar strings
+   REMARKS
+     This function appends a copy of the wchar string pointed to by wsrcstr,
+     including the null-terminator to the end of wchar string pointed to by
+     wdststr. It returns the number of character in the result string not
+     including the ending null-terminator.
+   RETURNS
+     number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+*/
+size_t OCIWideCharStrcat(dvoid *envhp, OCIWchar *wdststr,
+                         CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrchr --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrchr - Search the first occurrence of wchar in a wchar string
+   REMARKS
+     This function searchs for the first occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrchr(dvoid *envhp, CONST OCIWchar *wstr,
+                            OCIWchar wc);
+
+
+/* ----------------------- OCIWideCharStrcpy --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrcpy - copy a wchar string
+   REMARKS
+     This function copies the wchar string pointed to by wsrcstr, including the
+     null-terminator, into the array pointed to by wdststr. It returns the
+     number of character copied not including the ending null-terminator.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrcpy(dvoid *envhp, OCIWchar *wdststr,
+                         CONST OCIWchar *wsrcstr);
+
+
+/* ----------------------- OCIWideCharStrlen --------------------------------*/
+/*
+   NAME
+     OCIWideCharStrlen - Return number of character in a wchar string
+   REMARKS
+     This function computes the number of characters in the wchar string
+     pointed to by wstr, not including the null-terminator, and returns
+    this number. 
+   RETURNS
+     number of characters not including ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the source wchar string.
+*/
+size_t OCIWideCharStrlen(dvoid *envhp, CONST OCIWchar *wstr);
+
+
+/* ----------------------- OCIWideCharStrncat -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncat - Concatenate wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcat(), except that at most n
+     characters from wsrcstr are appended to wdststr. Note that the
+     null-terminator in wsrcstr will stop appending. wdststr will be
+     null-terminated.. 
+   RETURNS
+     Number of characters in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(IN/OUT)
+     Pointer to the destination wchar string for appending.
+   wsrcstr(IN)
+     Pointer to the source wchar string to append.
+   n(IN)
+     Number of characters from wsrcstr to append.
+*/
+size_t OCIWideCharStrncat(dvoid *envhp, OCIWchar *wdststr,
+                          CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrncpy -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrncpy - Copy wchar string in length
+   REMARKS
+     This function is similar to OCIWideCharStrcpy(), except that at most n
+     characters are copied from the array pointed to by wsrcstr to the array
+     pointed to by wdststr. Note that the null-terminator in wdststr will
+     stop coping and result string will be null-terminated.
+   RETURNS
+     number of characters copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wdststr(OUT)
+     Pointer to the destination wchar buffer.
+   wsrcstr(IN)
+     Pointer to the source wchar string.
+   n(IN)
+     Number of characters from wsrcstr to copy.
+*/
+size_t OCIWideCharStrncpy(dvoid *envhp, OCIWchar *wdststr,
+                          CONST OCIWchar *wsrcstr, size_t n);
+
+
+/* ----------------------- OCIWideCharStrrchr -------------------------------*/
+/*
+   NAME
+     OCIWideCharStrrchr - search the last occurrence of a wchar in wchar string
+   REMARKS
+     This function searchs for the last occurrence of wc in the wchar string
+     pointed to by wstr. It returns a pointer to the whcar if successful, or
+     a null pointer.
+   RETURNS
+     wchar pointer if successful, otherwise a null pointer.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wstr(IN)
+     Pointer to the wchar string to search
+   wc(IN)
+     Wchar to search for.
+*/
+OCIWchar *OCIWideCharStrrchr(dvoid *envhp, CONST OCIWchar *wstr,
+                             OCIWchar wc);
+
+
+/* --------------------- OCIWideCharStrCaseConversion -----------------------*/
+/*
+   NAME
+     OCIWideCharStrCaseConversion - convert a wchar string into lowercase or
+                                    uppercase
+   REMARKS
+     This function convert the wide char string pointed to by wsrcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by wdststr. The result string will be null-terminated.
+   RETURNS
+     number of characters for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   wdststr(OUT)
+     Pointer to destination array.
+   wsrcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE : convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIWideCharStrCaseConversion(dvoid *envhp, OCIWchar *wdststr,
+                                    CONST OCIWchar *wsrcstr, ub4 flag);
+
+
+/*---------------------- OCIWideCharDisplayLength ---------------------------*/
+/*
+   NAME
+     OCIWideCharDisplayLength - Calculate the display length for a wchar
+   REMARKS
+     This function determines the number of column positions required for wc
+     in display. It returns number of column positions, or 0 if wc is 
+     null-terminator.
+   RETURNS
+     Number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharDisplayLength(dvoid *envhp, OCIWchar wc );
+
+
+/*---------------------- OCIWideCharMultiByteLength -------------------------*/
+/*
+   NAME
+     OCIWideCharMultiByteLength - Determine byte size in multi-byte encoding
+   REMARKS
+     This function determines the number of byte required for wc in multi-byte
+     encoding. It returns number of bytes in multi-byte for wc.
+   RETURNS
+     Number of bytes.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set .
+   wc(IN)
+     Wchar character.
+*/
+size_t OCIWideCharMultiByteLength(dvoid *envhp, OCIWchar wc);
+
+
+/* ----------------------- OCIMultiByteStrcmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcmp - Compare two multi-byte strings
+   REMARKS
+     It compares two multi-byte strings in binary ( based on encoding value ),
+     linguistic, or case-insensitive.
+   RETURNS
+     0, if str1 == str2.
+     Positive, if str1 > str2.
+     Negative, if str1 < str2.
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to a null-terminated string.
+   str2(IN)
+     Pointer to a null-terminated string.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrcmp(dvoid *envhp, CONST OraText *str1,
+                       CONST OraText *str2, int flag);
+
+
+/*----------------------- OCIMultiByteStrncmp -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncmp - compare two strings in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcmp(), except that at most
+     len1 bytes from str1 and len2 bytes from str2 are compared. The
+     null-terminator will be taken into the comparison.
+   RETURNS
+     0, if str1 = str2
+     Positive, if str1 > str2
+     Negative, if str1 < str2
+   envhp(IN/OUT)
+     OCI environment handle to determine the character set.
+   str1(IN)
+     Pointer to the first string
+   len1(IN)
+     The length for the first string for comparison
+   str2(IN)
+     Pointer to the second string
+   len2(IN)
+     The length for the second string for comparison.
+   flag(IN)
+     It is used to decide the comparison method. It can be taken one of the
+     following values:
+       OCI_NLS_BINARY: for the binary comparison, this is default value.
+       OCI_NLS_LINGUISTIC: for linguistic comparison specified in the locale.
+     This flag can be ORed with OCI_NLS_CASE_INSENSITIVE for case-insensitive 
+     comparison.
+*/
+int OCIMultiByteStrncmp(dvoid *envhp, CONST OraText *str1, size_t len1,
+                        OraText *str2, size_t len2, int flag);
+
+
+/*----------------------- OCIMultiByteStrcat --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcat - concatenate multibyte strings
+   REMARKS
+     This function appends a copy of the multi-byte string pointed to by
+     srcstr, including the null-terminator to the end of string pointed to by
+     dststr. It returns the number of bytes in the result string not including
+     the ending null-terminator.
+   RETURNS
+     number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle
+   dststr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   srcstr(IN)
+     Pointer to the source string to append.
+*/
+size_t OCIMultiByteStrcat(dvoid *envhp, OraText *dststr,
+                          CONST OraText *srcstr);
+
+
+/*------------------------- OCIMultiByteStrcpy ------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrcpy - copy multibyte string
+   REMARKS
+     This function copies the multi-byte string pointed to by srcstr,
+     including the null-terminator, into the array pointed to by dststr. It
+     returns the number of bytes copied not including the ending 
+     null-terminator.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to the OCI environment handle.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrcpy(dvoid *envhp, OraText *dststr,
+                          CONST OraText *srcstr);
+
+
+/*----------------------- OCIMultiByteStrlen --------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrlen - Calculate multibyte string length
+   REMARKS
+     This function computes the number of bytes in the multi-byte string
+     pointed to by str, not including the null-terminator, and returns this
+     number. 
+   RETURNS
+     number of bytes not including ending null-terminator.
+   str(IN)
+     Pointer to the source multi-byte string.
+*/
+size_t OCIMultiByteStrlen(dvoid *envhp, CONST OraText *str);
+
+
+/*----------------------- OCIMultiByteStrncat -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncat - concatenate string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcat(), except that at most n
+     bytes from srcstr are appended to dststr. Note that the null-terminator in
+     srcstr will stop appending and the function will append as many character
+     as possible within n bytes. dststr will be null-terminated. 
+   RETURNS
+     Number of bytes in the result string not including the ending
+     null-terminator.
+   envhp(IN/OUT)
+     Pointer to OCI environment handle.
+   srcstr(IN/OUT)
+     Pointer to the destination multi-byte string for appending.
+   dststr(IN)
+     Pointer to the source multi-byte string to append.
+   n(IN)
+     Number of bytes from srcstr to append.
+*/
+size_t OCIMultiByteStrncat(dvoid *envhp, OraText *dststr,
+                           CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrncpy -------------------------------*/
+/*
+   NAME
+     OCIMultiByteStrncpy - copy multibyte string in length
+   REMARKS
+     This function is similar to OCIMultiBytestrcpy(), except that at most n
+     bytes are copied from the array pointed to by srcstr to the array pointed
+     to by dststr. Note that the null-terminator in srcstr will stop coping and
+     the function will copy as many character as possible within n bytes. The 
+     result string will be null-terminated.
+   RETURNS
+     number of bytes copied not including the ending null-terminator.
+   envhp(IN/OUT)
+     Pointer to a OCI environment handle.
+   dststr(IN)
+     Pointer to the source multi-byte string.
+   srcstr(OUT)
+     Pointer to the destination buffer.
+   n(IN)
+     Number of bytes from srcstr to copy.
+*/
+size_t OCIMultiByteStrncpy(dvoid *envhp, OraText *dststr,
+                           CONST OraText *srcstr, size_t n);
+
+
+/*----------------------- OCIMultiByteStrnDisplayLength ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrnDisplayLength - calculate the display length for a
+                                     multibyt string
+   REMARKS
+     This function returns the number of display positions occupied by the 
+     complete characters within the range of n bytes.
+   RETURNS
+     number of display positions.
+   envhp(IN/OUT)
+     OCI environment handle.
+   str(IN)
+     Pointer to a multi-byte string.
+   n(IN)
+     Number of bytes to examine.
+*/
+size_t OCIMultiByteStrnDisplayLength(dvoid *envhp, CONST OraText *str1,
+                                     size_t n);
+
+
+/*---------------------- OCIMultiByteStrCaseConversion  ---------------------*/
+/*
+   NAME
+     OCIMultiByteStrCaseConversion
+   REMARKS
+     This function convert the multi-byte string pointed to by srcstr into the
+     uppercase or lowercase specified by flag and copies the result into the
+     array pointed to by dststr. The result string will be null-terminated.
+   RETURNS
+     number of bytes for result string not including null-terminator.
+   envhp(IN/OUT)
+     OCI environment handle.
+   dststr(OUT)
+     Pointer to destination array.
+   srcstr(IN)
+     Pointer to source string.
+   flag(IN)
+     Specify the case to convert:
+       OCI_NLS_UPPERCASE: convert to uppercase.
+       OCI_NLS_LOWERCASE: convert to lowercase.
+     This flag can be ORed with OCI_NLS_LINGUISTIC to specify that the 
+     linguistic setting in the locale will be used for case conversion.
+*/
+size_t OCIMultiByteStrCaseConversion(dvoid *envhp, OraText *dststr,
+                                     CONST OraText *srcstr, ub4 flag);
+
+
+/*------------------------- OCICharSetToUnicode -----------------------------*/
+/*
+   NAME
+     OCICharSetToUnicode - convert multibyte string into Unicode as UCS2
+   REMARKS
+     This function converts a multi-byte string pointed to by src to Unicode 
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. 
+     The function will return number of characters converted into Unicode.
+     If dstlen is zero, it will just return the number of characters for the
+     result without real conversion.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle
+   dst(OUT)
+     Pointer to a destination buffer
+   dstlen(IN)
+     Size of destination buffer in character
+   src(IN)
+     Pointer to multi-byte source string.
+   srclen(IN)
+     Size of source string in bytes.
+   rsize(OUT)
+     Number of characters converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCICharSetToUnicode(dvoid *envhp, ub2 *dst, size_t dstlen,
+                          CONST OraText *src, size_t  srclen, size_t *rsize);
+
+
+/*------------------------- OCIUnicodeToCharSet -----------------------------*/
+/*
+   NAME
+     OCIUnicodeToCharSet - convert Unicode into multibyte
+   REMARKS
+     This function converts a Unicode string pointed to by src to multi-byte
+     into the array pointed to by dst. The conversion will stop when it reach
+     to the source limitation or destination limitation. The function will
+     return number of bytes converted into multi-byte. If dstlen is zero, it
+     will just return the number of bytes for the result without real 
+     conversion. If a Unicode character is not convertible for the character
+     set specified in OCI environment handle, a replacement character will be
+     used for it. In this case, OCICharSetConversionIsReplacementUsed() will
+     return ture.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     Pointer to an OCI environment handle.
+   dst(OUT)
+     Pointer to a destination buffer.
+   dstlen(IN)
+     Size of destination buffer in byte.
+   src(IN)
+     Pointer to a Unicode string.
+   srclen(IN)
+     Size of source string in characters.
+   rsize(OUT)
+     Number of bytes converted.
+     If it is a NULL pointer, nothing to return.
+*/
+sword OCIUnicodeToCharSet(dvoid *envhp, OraText *dst, size_t dstlen, 
+                           CONST ub2 *src, size_t srclen, size_t *rsize);
+
+/*----------------------- OCINlsCharSetConvert ------------------------------*/
+/*
+   NAME
+     OCINlsCharSetConvert - convert between any two character set.
+   REMARKS
+     This function converts a string pointed to by src in the character set
+     specified with srcid to the array pointed to by dst in the character set
+     specified with dstid. The conversion will stop when it reaches the source
+     limitation or destination limitation. The function will return the number
+     of bytes converted into the destination buffer. Even though either source
+     or destination character set id is OCI_UTF16ID, given and return data
+     length will be represented with the byte length as this function is
+     intended for generic purpose. Note the conversion will not stop at null
+     data.
+     To get character set id from name, OCINlsCharSetNameToId can be used.
+     To check if derived data in the destination buffer contains any
+     replacement character resulting from conversion failure,
+     OCICharSetConversionIsReplacementUsed can be used to get the status.
+     Data alignment should be guaranteed by a caller. For example, UTF-16 data
+     should be aligned to ub2 type.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+   errhp(IN/OUT)
+     OCI error handle. If there is an error, it is recorded in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained
+     by calling OCIErrorGet().
+   dstid(IN)
+     Character set id for the destination buffer.
+   dstp(OUT)
+     Pointer to the destination buffer.
+   dstlen(IN)
+     The maximum byte size of destination buffer.
+   srcid(IN)
+     Character set id for the source buffer.
+   srcp(IN)
+     Pointer to the source buffer.
+   srclen(IN)
+     The length byte size of source buffer.
+   rsize(OUT)
+     The number of characters converted. If it is a NULL pointer, nothing to
+     return.
+*/
+sword OCINlsCharSetConvert(dvoid *envhp, OCIError *errhp, 
+                        ub2 dstid, dvoid *dstp, size_t dstlen,
+                        ub2 srcid, CONST dvoid *srcp, size_t srclen,
+                        size_t *rsize);
+
+
+/* ------------------- OCICharsetConversionIsReplacementUsed ----------------*/
+/*
+   NAME
+     OCICharsetConversionIsReplacementUsed - chech if replacement is used in 
+                                             conversion
+   REMARKS
+     This function indicates whether or not the replacement character was used
+     for nonconvertible characters in character set conversion in last invoke
+     of OCICharsetUcs2ToMb().
+   RETURNS
+     TRUE is the replacement character was used in last OCICharsetUcs2ToMb()
+     invoking, else FALSE.
+   envhp(IN/OUT)
+     OCI environment handle. This should be the first handle passed to 
+     OCICharsetUcs2ToMb().
+*/
+boolean OCICharSetConversionIsReplacementUsed(dvoid *envhp);
+
+/*------------------- OCINlsEnvironmentVariableGet -----------------*/
+/*
+   NAME
+     OCINlsEnvironmentVariableGet - get a value of NLS environment variable.
+
+   DESCRIPTION
+     This function retrieves a value of NLS environment variable to the buffer
+     pointed to by val. Data type is determined by the parameter specified by
+     item. Either numeric data or string data can be retrieved.
+
+   RETURNS
+     OCI_SUCCESS or OCI_ERROR.
+
+   PARAMETERS
+   valp(OUT) -
+     Pointer to the buffer.
+   size(IN) -
+     Size of the buffer. This argument is only applicable to string data type,
+     but not to numerical data, in such case, it is ignored.
+   item(IN) -
+     NLS item value, which can be one of following values:
+       OCI_NLS_CHARSET_ID  - NLS_LANG character set id in ub2 data type.
+       OCI_NLS_NCHARSET_ID - NLS_NCHAR character set id in ub2 data type.
+   charset(IN) -
+     Character set id for retrieved string data. If it is 0, NLS_LANG will be
+     used. OCI_UTF16ID is a valid id. In case of numeric data, this argument
+     is ignored.
+   rsize(OUT) -
+     Size of return value.
+
+   NOTE
+     This functions is mainly used for retrieving character set id from either
+     NLS_LANG or NLS_NCHAR environment variables. If NLS_LANG is not set,
+     the default character set id is returned.
+     For future extension, the buffer is capable for storing other data types.
+*/
+sword OCINlsEnvironmentVariableGet(dvoid  *valp, size_t size, ub2 item,
+                                   ub2 charset, size_t *rsize);
+
+
+/*------------------------- OCIMessageOpen ----------------------------------*/
+/*
+   NAME
+     OCIMessageOpen - open a locale message file
+   REMARKS
+     This function opens a message handle for facility of product in a language
+     pointed to by envhp. It first try to open the message file corresponding
+     to envhp for the facility. If it successes, it will use that file to
+     initialize a message handle, else it will use the default message file
+     which is for American language for the facility. The function return a
+     pointer pointed to a message handle into msghp parameter.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(OUT)
+     a message handle for return
+   product(IN)
+     A pointer to a product name. Product name is used to locate the directory
+     for message in a system dependent way. For example, in Solaris, the
+     directory of message files for the product `rdbms' is
+     `${ORACLE_HOME}/rdbms'.
+   facility(IN)
+     A pointer to a facility name in the product. It is used to construct a
+     message file name. A message file name follows the conversion with 
+     facility as prefix. For example, the message file name for facility
+     `img' in American language will be `imgus.msb' where `us' is the 
+     abbreviation of American language and `msb' as message binary file 
+     extension.
+   dur(IN)
+     Duration for memory allocation for the return message handle. It can be
+     the following values:
+        OCI_DURATION_CALL
+        OCI_DURATION_STATEMENT
+        OCI_DURATION_SESSION
+        OCI_DURATION_TRANSACTION
+     For the detail description, please refer to Memory Related Service
+     Interfaces section.
+*/
+sword OCIMessageOpen(dvoid *envhp, OCIError *errhp, OCIMsg **msghp,
+                      CONST OraText *product, CONST OraText *facility, 
+                      OCIDuration dur);
+ 
+
+/*------------------------- OCIMessageGet -----------------------------------*/
+/*
+   NAME
+     OCIMessageGet - get a locale message from a message handle
+   REMARKS
+     This function will get message with message number identified by msgno and
+     if buflen is not zero, the function will copy the message into the buffer
+     pointed to by msgbuf. If buflen is zero, the message will be copied into
+     a message buffer inside the message handle pointed to by msgh. For both
+     cases. it will return the pointer to the null-terminated message string.
+     If it cannot get the message required, it will return a NULL pointer.
+   RETURNS
+     A pointer to a null-terminated message string on success, otherwise a NULL
+     pointer.
+   msgh(IN/OUT)
+     Pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+   msgno(IN)
+     The message number for getting message.
+   msgbuf(OUT)
+     Pointer to a destination buffer to the message retrieved. If buflen is
+     zero, it can be NULL pointer.
+   buflen(IN)
+     The size of the above destination buffer.
+*/
+OraText *OCIMessageGet(OCIMsg *msgh, ub4 msgno, OraText *msgbuf,
+                       size_t buflen);
+
+/*------------------------- OCIMessageClose ---------------------------------*/
+/*
+   NAME
+     OCIMessageClose - close a message handle
+   REMARKS
+     This function closes a message handle pointed to by msgh and frees any
+     memory associated with this handle.
+   RETURNS
+     OCI_SUCCESS, OCI_INVALID_HANDLE or OCI_ERROR
+   envhp(IN/OUT)
+     A pointer to OCI environment handle for message language.
+   errhp(IN/OUT)
+     The OCI error handle. If there is an error, it is record in errhp and this
+     function returns a NULL pointer. Diagnostic information can be obtained by
+     calling OCIErrorGet().
+   msghp(IN/OUT)
+     A pointer to a message handle which was previously opened by
+     OCIMessageOpen().
+*/
+sword OCIMessageClose(dvoid *envhp, OCIError *errhp, OCIMsg *msghp);
+
+/*--------------- End of Extensions to NLS cartridge service ----------------*/
+
+
+/*----------------- Extensions to OCI Thread interface ---------------------*/
+/*****************************************************************************
+                              DESCRIPTION
+******************************************************************************
+1 Threads Interface
+
+The OCIThread package provides a number of commonly used threading
+primitives for use by Oracle customers.  It offers a portable interface to
+threading capabilities native to various platforms.  It does not implement
+threading on platforms which do not have native threading capability.
+
+OCIThread does not provide a portable implementation of multithreaded 
+facilities.  It only serves as a set of portable covers for native 
+multithreaded facilities.  Therefore, platforms that do not have native 
+support for multi-threading will only be able to support a limited 
+implementation of OCIThread.  As a result, products that rely on all of 
+OCIThread's functionality will not port to all platforms.  Products that must 
+port to all platforms must use only a subset of OCIThread's functionality.  
+This issue is discussed further in later sections of this document.
+
+The OCIThread API is split into four main parts.  Each part is described
+briefly here.  The following subsections describe each in greater detail.
+
+ 1. Initialization and Termination Calls
+
+     These calls deal with the initialization and termination of OCIThread.
+     Initialization of OCIThread initializes the OCIThread context which is
+     a member of the OCI environment or session handle.  This context is 
+     required for other OCIThread calls.
+
+ 2. Passive Threading Primitives
+
+     The passive threading primitives include primitives to manipulate mutual
+     exclusion (mutex) locks, thread ID's, and thread-specific data keys.
+
+     The reason that these primitives are described as 'passive' is that while
+     their specifications allow for the existence of multiple threads, they do
+     not require it.  This means that it is possible for these primitives to
+     be implemented according to specification in both single-threaded and
+     multi-threaded environments.
+
+     As a result, OCIThread clients that use only these primitives will not
+     require the existence of multiple threads in order to work correctly,
+     i.e., they will be able to work in single-threaded environments without 
+     branching code.
+
+ 3. Active Threading Primitives
+
+     Active threading primitives include primitives dealing with the creation,
+     termination, and other manipulation of threads.
+
+     The reason that these primitives are described as 'active' is that they
+     can only be used in true multi-threaded environments.  Their
+     specifications explicitly require that it be possible to have multiple
+     threads.  If you need to determine at runtime whether or not you are in a
+     multi-threaded environment, call OCIThreadIsMulti() before calling an
+     OCIThread active primitive.
+
+
+1.1 Initialization & Termination
+==================================
+
+The types and functions described in this section are associated with the
+initialization and termination of the OCIThread package.  OCIThread must
+be properly initialized before any of its functionality can be used.
+OCIThread's process initialization function, 'OCIThreadProcessInit()',
+must be called with care; see below.
+
+The observed behavior of the initialization and termination functions is the
+same regardless of whether OCIThread is in single-threaded or multi-threaded
+environment.  It is OK to call the initialization functions from both generic
+and operating system specific (OSD) code.
+
+1.1.1 Types
+
+  OCIThreadContext - OCIThread Context
+  -------------------------------------
+
+    Most calls to OCIThread functions take the OCI environment or session 
+    handle as a parameter.  The OCIThread context is part of the OCI 
+    environment or session handle and it must be initialized by calling 
+    'OCIThreadInit()'.  Termination of the OCIThread context occurs by calling
+    'OCIThreadTerm()'.
+
+    The OCIThread context is a private data structure.  Clients must NEVER
+    attempt to examine the contents of the context.
+
+1.1.2  OCIThreadProcessInit
+
+  OCIThreadProcessInit - OCIThread Process INITialization
+  --------------------------------------------------------
+
+    Description
+
+      This function should be called to perform OCIThread process
+      initialization.
+
+    Prototype
+
+      void OCIThreadProcessInit();
+
+    Returns
+
+      Nothing.
+
+    Notes
+
+      Whether or not this function needs to be called depends on how OCI
+      Thread is going to be used.
+
+        * In a single-threaded application, calling this function is optional.
+          If it is called at all, the first call to it must occur before calls
+          to any other OCIThread functions.  Subsequent calls can be made
+          without restriction; they will not have any effect.
+
+        * In a multi-threaded application, this function MUST be called.  The
+          first call to it MUST occur 'strictly before' any other OCIThread
+          calls; i.e., no other calls to OCIThread functions (including other
+          calls to this one) can be concurrent with the first call.
+          Subsequent calls to this function can be made without restriction;
+          they will not have any effect.
+
+
+1.1.3 OCIThreadInit
+
+  OCIThreadInit - OCIThread INITialize
+  -------------------------------------
+
+    Description
+
+      This initializes OCIThread context.
+
+    Prototype
+
+      sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal for OCIThread clients to try an examine the memory
+      pointed to by the returned pointer.
+
+      It is safe to make concurrent calls to 'OCIThreadInit()'.  Unlike
+      'OCIThreadProcessInit()',  there is no need to have a first call
+      that occurs before all the others.
+
+      The first time 'OCIThreadInit()' is called, it initilaizes the OCI
+      Thread context.  It also saves a pointer to the context in some system
+      dependent manner.  Subsequent calls to 'OCIThreadInit()' will return
+      the same context.
+
+      Each call to 'OCIThreadInit()' must eventually be matched by a call to
+      'OCIThreadTerm()'.
+
+  OCIThreadTerm - OCIThread TERMinate
+  ------------------------------------
+
+    Description
+
+      This should be called to release the OCIThread context.  It should be
+      called exactly once for each call made to 'OCIThreadInit()'.
+
+    Prototype
+
+      sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is safe to make concurrent calls to 'OCIThreadTerm()'.
+
+      'OCIThreadTerm()' will not do anything until it has been called as
+      many times as 'OCIThreadInit()' has been called.  When that happens,
+      it terminates the OCIThread layer and frees the memory allocated for
+      the context.  Once this happens, the context should not be re-used.
+      It will be necessary to obtain a new one by calling 'OCIThreadInit()'.
+
+
+  OCIThreadIsMulti - OCIThread Is Multi-Threaded?
+  ------------------------------------------------
+
+    Description
+
+      This tells the caller whether the application is running in a
+      multi-threaded environment or a single-threaded environment.
+
+    Prototype
+      boolean OCIThreadIsMulti(void);
+
+    Returns
+
+      TRUE if the environment is multi-threaded;
+      FALSE if the environment is single-threaded.
+
+
+1.2 Passive Threading Primitives
+==================================
+
+1.2.1 Types
+
+The passive threading primitives deal with the manipulation of mutex, 
+thread ID's, and thread-specific data.  Since the specifications of these 
+primitives do not require the existence of multiple threads, they can be 
+used both on multithreaded and single-threaded platforms.
+
+1.2.1.1  OCIThreadMutex - OCIThread Mutual Exclusion Lock
+-----------------------------------------------------------
+
+  The type 'OCIThreadMutex' is used to represent a mutual exclusion lock
+  (mutex).  A mutex is typically used for one of two purposes: (i) to
+  ensure that only one thread accesses a given set of data at a time, or
+  (ii) to ensure that only one thread executes a given critical section of
+  code at a time.
+
+  Mutexes pointer can be declared as parts of client structures or as 
+  stand-alone variables.  Before they can be used, they must be initialized 
+  using 'OCIThreadMutexInit()'.  Once they are no longer needed, they must be
+  destroyed using 'OCIThreadMutexDestroy()'.  A mutex pointer must NOT be 
+  used after it is destroyed.
+
+  A thread can acquire a mutex by using either 'OCIThreadMutexAcquire()' or
+  'OCIThreadMutexTry()'.  They both ensure that only one thread at a time is
+  allowed to hold a given mutex.  A thread that holds a mutex can release it
+  by calling 'OCIThreadMutexRelease()'.
+
+
+1.2.1.2  OCIThreadKey - OCIThread Key for Thread-Specific Data
+----------------------------------------------------------------
+
+  A key can be thought of as a process-wide variable that has a
+  thread-specific value.  What this means is that all the threads in a
+  process can use any given key.  However, each thread can examine or modify
+  that key independently of the other threads.  The value that a thread sees
+  when it examines the key will always be the same as the value that it last
+  set for the key.  It will not see any values set for the key by the other
+  threads.
+
+  The type of the value held by a key is a 'dvoid *' generic pointer.
+
+  Keys can be created using 'OCIThreadKeyInit()'.  When a key is created, its
+  value is initialized to 'NULL' for all threads.
+
+  A thread can set a key's value using 'OCIThreadKeySet()'.  A thread can
+  get a key's value using 'OCIThreadKeyGet()'.
+
+  The OCIThread key functions will save and retrieve data SPECIFIC TO THE
+  THREAD.  When clients maintain a pool of threads and assign the threads to
+  different tasks, it *may not* be appropriate for a task to use OCIThread
+  key functions to save data associated with it.  Here is a scenario of how
+  things can fail: A thread is assigned to execute the initialization of a
+  task.  During the initialization, the task stored some data related to it
+  in the thread using OCIThread key functions.  After the initialization,
+  the thread is returned back to the threads pool.  Later, the threads pool
+  manager assigned another thread to perform some operations on the task,
+  and the task needs to retrieve those data it stored earlier in
+  initialization.  Since the task is running in another thread, it will not
+  be able to retrieve the same data back!  Applications that use thread
+  pools should be aware of this and be cautious when using OCIThread key
+  functions.
+
+
+1.2.1.3  OCIThreadKeyDestFunc - OCIThread Key Destructor Function Type
+------------------------------------------------------------------------
+
+  This is the type of a pointer to a key's destructor routine.  Keys can be
+  associated with a destructor routine when they are created (see
+  'OCIThreadKeyInit()').
+
+  A key's destructor routine will be called whenever a thread that has a
+  non-NULL value for the key terminates.
+
+  The destructor routine returns nothing and takes one parameter.  The
+  parameter will be the value that was set for key when the thread
+  terminated.
+
+  The destructor routine is guaranteed to be called on a thread's value
+  in the key after the termination of the thread and before process
+  termination.  No more precise guarantee can be made about the timing
+  of the destructor routine call; thus no code in the process may assume
+  any post-condition of the destructor routine.  In particular, the
+  destructor is not guaranteed to execute before a join call on the
+  terminated thread returns.
+
+
+1.2.1.4  OCIThreadId - OCIThread Thread ID
+--------------------------------------------
+
+  Type 'OCIThreadId' is the type that will be used to identify a thread.
+  At any given time, no two threads will ever have the same 'OCIThreadId'.
+  However, 'OCIThreadId' values can be recycled; i.e., once a thread dies,
+  a new thread may be created that has the same 'OCIThreadId' as the one
+  that died.  In particular, the thread ID must uniquely identify a thread
+  T within a process, and it must be consistent and valid in all threads U
+  of the process for which it can be guaranteed that T is running
+  concurrently with U.  The thread ID for a thread T must be retrievable
+  within thread T.  This will be done via OCIThreadIdGet().
+
+  The 'OCIThreadId' type supports the concept of a NULL thread ID: the NULL
+  thread ID will never be the same as the ID of an actual thread.
+
+
+
+1.2.2 Function prototypes for passive primitives
+--------------------------------------------------
+
+1.2.2.1 Mutex functions
+-------------------------
+
+  OCIThreadMutexInit - OCIThread MuteX Initialize
+  -----------------------------------------------
+
+    Description
+
+      This allocate and initializes a mutex.  All mutexes must be 
+      initialized prior to use.
+
+    Prototype
+
+      sword OCIThreadMutexInit(dvoid *hndl, OCIError *err, 
+                               OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(OUT):  The mutex to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Multiple threads must not initialize the same mutex simultaneously.
+      Also, a mutex must not be reinitialized until it has been destroyed (see
+      'OCIThreadMutexDestroy()').
+
+  OCIThreadMutexDestroy - OCIThread MuteX Destroy
+  -----------------------------------------------
+
+    Description
+
+      This destroys and deallocate a mutex.  Each mutex must be destroyed 
+      once it is no longer needed.
+
+    Prototype
+
+      sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err,
+                                  OCIThreadMutex **mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is not legal to destroy a mutex that is uninitialized or is currently
+      held by a thread.  The destruction of a mutex must not occur concurrently
+      with any other operations on the mutex.  A mutex must not be used after
+      it has been destroyed.
+
+
+  OCIThreadMutexAcquire - OCIThread MuteX Acquire
+  -----------------------------------------------
+
+    Description
+
+      This acquires a mutex for the thread in which it is called.  If the mutex
+      is held by another thread, the calling thread is blocked until it can
+      acquire the mutex.
+
+    Prototype
+
+     sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+                                 OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to acquire.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to acquire an uninitialized mutex.
+
+      This function's behavior is undefined if it is used by a thread to
+      acquire a mutex that is already held by that thread.
+
+
+
+  OCIThreadMutexRelease - OCIThread MuteX Release
+  -----------------------------------------------
+
+    Description
+
+      This releases a mutex.  If there are any threads blocked on the mutex,
+      one of them will acquire it and become unblocked.
+
+    Prototype
+
+      sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+                                  OCIThreadMutex *mutex);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        mutex(IN/OUT):   The mutex to release.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to attempt to release an uninitialized mutex.  It is also
+      illegal for a thread to release a mutex that it does not hold.
+
+
+  OCIThreadKeyInit - OCIThread KeY Initialize
+  -------------------------------------------
+
+    Description
+
+      This creates a key.  Each call to this routine allocate and generates 
+      a new key that is distinct from all other keys.
+
+    Prototype
+
+      sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+                             OCIThreadKeyDestFunc destFn);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(OUT):    The 'OCIThreadKey' in which to create the new key.
+
+        destFn(IN):  The destructor for the key.  NULL is permitted.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      Once this function executes successfully, a pointer to an allocated and 
+      initialized key is return.  That key can be used with 'OCIThreadKeyGet()'
+      and 'OCIThreadKeySet()'.  The initial value of the key will be 'NULL' for
+      all threads.
+
+      It is illegal for this function to be called more than once to create the
+      same key (i.e., to be called more than once with the same value for the
+      'key' parameter).
+
+      If the 'destFn' parameter is not NULL, the routine pointed to by 'destFn'
+      will be called whenever a thread that has a non-NULL value for the key
+      terminates.  The routine will be called with one parameter.  The
+      parameter will be the key's value for the thread at the time at which the
+      thread terminated.
+      If the key does not need a destructor function, pass NULL for 'destFn'.
+
+
+  OCIThreadKeyDestroy - OCIThread KeY DESTROY
+  -------------------------------------------
+
+   Description
+
+     Destroy and deallocate the key pointed to by 'key'.
+
+    Prototype
+
+      sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err, 
+                                OCIThreadKey **key);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT):  The 'OCIThreadKey' in which to destroy the key.
+ 
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      This is different from the destructor function callback passed to the
+      key create routine.  This new destroy function 'OCIThreadKeyDestroy' is 
+      used to terminate any resources OCI THREAD acquired when it created 
+      'key'.  [The 'OCIThreadKeyDestFunc' callback type is a key VALUE 
+      destructor; it does in no way operate on the key itself.]
+
+      This must be called once the user has finished using the key.  Not
+      calling the key destroy function may result in memory leaks.
+
+
+
+
+1.2.2.2 Thread Key operations
+-------------------------------
+
+  OCIThreadKeyGet - OCIThread KeY Get value
+  -----------------------------------------
+
+    Description
+
+      This gets the calling thread's current value for a key.
+
+    Prototype
+
+      sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                            dvoid **pValue);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN):          The key.
+
+        pValue(IN/OUT):   The location in which to place the thread-specific
+                          key value.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+      If the calling thread has not yet assigned a value to the key, 'NULL' is
+      placed in the location pointed to by 'pValue'.
+
+
+  OCIThreadKeySet - OCIThread KeY Set value
+  -----------------------------------------
+
+    Description
+
+      This sets the calling thread's value for a key.
+
+    Prototype
+
+      sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                            dvoid *value);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        key(IN/OUT): The key.
+
+        value(IN):   The thread-specific value to set in the key.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      It is illegal to use this function on a key that has not been created
+      using 'OCIThreadKeyInit()'.
+
+1.2.2.3  Thread Id
+--------------------
+
+  OCIThreadIdInit - OCIThread Thread Id INITialize
+  --------------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid (OUT):   Pointer to the thread ID to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadIdDestroy - OCIThread Thread Id DESTROY
+  --------------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread id 'tid'.
+
+    Prototype
+
+      sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN/OUT):        Pointer to the thread ID to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Note
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSet - OCIThread Thread Id Set
+  -----------------------------------------
+
+    Description
+
+      This sets one 'OCIThreadId' to another.
+
+    Prototype
+
+      sword OCIThreadIdSet(dvoid *hndl, OCIError *err, 
+                           OCIThreadId *tidDest,
+                           OCIThreadId *tidSrc);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tidDest(OUT):   This should point to the location of the 'OCIThreadId'
+                        to be set to.
+
+        tidSrc(IN):     This should point to the 'OCIThreadId' to set from.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdSetNull - OCIThread Thread Id Set Null
+  ---------------------------------------------------------
+
+    Description
+
+      This sets the NULL thread ID to a given 'OCIThreadId'.
+
+    Prototype
+
+      sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err,
+                               OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error, it is 
+                     recorded in err and this function returns OCI_ERROR.  
+                     Diagnostic information can be obtained by calling 
+                     OCIErrorGet().
+
+        tid(OUT):    This should point to the 'OCIThreadId' in which to put
+                     the NULL thread ID.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdGet - OCIThread Thread Id Get
+  ------------------------------------------
+
+    Description
+
+      This retrieves the 'OCIThreadId' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadIdGet(dvoid *hndl, OCIError *err,
+                           OCIThreadId *tid);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(OUT):    This should point to the location in which to place the
+                     ID of the calling thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      When OCIThread is used in a single-threaded environment,
+      OCIThreadIdGet() will always place the same value in the location
+      pointed to by 'tid'.  The exact value itself is not important.  The
+      important thing is that it is not the same as the NULL thread ID and
+      that it is always the same value.
+
+
+  OCIThreadIdSame - OCIThread Thread Ids Same?
+  ----------------------------------------------
+
+    Description
+
+      This determines whether or not two 'OCIThreadId's represent the same
+      thread.
+
+    Prototype
+
+      sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+                            OCIThreadId *tid1, OCIThreadId *tid2,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid1(IN):   Pointer to the first 'OCIThreadId'.
+
+        tid2(IN):   Pointer to the second 'OCIThreadId'.
+	
+	result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid1' and 'tid2' represent the same thread, 'result' is set to TRUE.
+      Otherwise, 'result' is set to FALSE.
+
+      'result' is set to TRUE if both 'tid1' and 'tid2' are the NULL thread ID.
+
+      'ti1d' and 'tid2' should be initialized by OCIThreadIdInit().
+
+
+  OCIThreadIdNull - OCIThread Thread Id NULL?
+  ---------------------------------------------
+
+    Description
+
+      This determines whether or not a given 'OCIThreadId' is the NULL thread
+      ID.
+
+    Prototype
+
+      sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+                            OCIThreadId *tid,
+                            boolean *result);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tid(IN):    Pointer to the 'OCIThreadId' to check.
+
+	result(IN/OUT): Pointer to the result.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      If 'tid' is the NULL thread ID, 'result' is set to TRUE.  Otherwise, 
+      'result' is set to FALSE.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+
+1.3 Active Threading Primitives
+=================================
+
+The active threading primitives deal with the manipulation of actual
+threads.  Because the specifications of most of these primitives require
+that it be possible to have multiple threads, they work correctly only in
+the enabled OCIThread; In the disabled OCIThread, they always return
+failure.  The exception is OCIThreadHandleGet(); it may be called in a 
+single-threaded environment, in which case it will have no effect.
+
+Active primitives should only be called by code running in a multi-threaded
+environment.  You can call OCIThreadIsMulti() to determine whether the 
+environment is multi-threaded or single-threaded.
+
+
+1.3.1  Types
+--------------
+
+1.3.1.1    OCIThreadHandle - OCIThread Thread Handle
+------------------------------------------------------
+
+  Type 'OCIThreadHandle' is used to manipulate a thread in the active
+  primitives:  OCIThreadJoin()and OCIThreadClose().  A thread handle opened by
+  OCIThreadCreate() must be closed in a matching call to
+  OCIThreadClose().  A thread handle is invalid after the call to
+  OCIThreadClose().
+
+  The distinction between a thread ID and a thread handle in OCIThread usage
+  follows the distinction between the thread ID and the thread handle on
+  Windows NT.  On many platforms, the underlying native types are the same.
+
+
+1.3.2  Functions
+------------------
+
+  OCIThreadHndInit - OCIThread HaNDle Initialize
+  ----------------------------------------------
+
+    Description
+
+      Allocate and initialize the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndInit(dvoid *hndl, OCIError *err, 
+                             OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(OUT):   The address of pointer to the thread handle to initialize.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+
+  OCIThreadHndDestroy - OCIThread HaNDle Destroy
+  ----------------------------------------------
+
+    Description
+
+      Destroy and deallocate the thread handle.
+
+    Prototype
+
+      sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, 
+                                OCIThreadHandle **thnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        thnd(IN/OUT):  The address of pointer to the thread handle to destroy.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+  OCIThreadCreate - OCIThread Thread Create
+  -----------------------------------------
+
+    Description
+
+      This creates a new thread.
+
+    Prototype
+
+      sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+                            void (*start)(dvoid *), dvoid *arg,
+                            OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        start(IN):    The function in which the new thread should begin
+                      execution.
+
+        arg(IN):      The argument to give the function pointed to by 'start'.
+
+        tid(IN/OUT):  If not NULL, gets the ID for the new thread.
+
+        tHnd(IN/OUT): If not NULL, gets the handle for the new thread.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      The new thread will start by executing a call to the function pointed
+      to by 'start' with the argument given by 'arg'.  When that function
+      returns, the new thread will terminate.  The function should not
+      return a value and should accept one parameter, a 'dvoid *'.
+
+      The call to OCIThreadCreate() must be matched by a call to
+      OCIThreadClose() if and only if tHnd is non-NULL.
+
+      If tHnd is NULL, a thread ID placed in *tid will not be valid in the
+      calling thread because the timing of the spawned thread's termination
+      is unknown.
+
+      'tid' should be initialized by OCIThreadIdInit().
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+
+
+  OCIThreadJoin - OCIThread Thread Join
+  -------------------------------------
+
+    Description
+
+      This function allows the calling thread to 'join' with another thread.
+      It blocks the caller until the specified thread terminates.
+
+    Prototype
+
+      sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN):    The 'OCIThreadHandle' of the thread to join with.
+
+    Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      The result of multiple threads all trying to join with the same thread is
+      undefined.
+
+
+  OCIThreadClose - OCIThread Thread Close
+  ---------------------------------------
+
+   Description
+
+     This function should be called to close a thread handle.
+
+   Prototype
+
+     sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):    The OCIThread thread handle to close.
+
+   Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+   Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().
+
+      Both thread handle and the thread ID that was returned by the same call
+      to OCIThreadCreate() are invalid after the call to OCIThreadClose().
+
+
+
+  OCIThreadHandleGet - OCIThread Thread Get Handle
+  ------------------------------------------------
+
+    Description
+
+      Retrieve the 'OCIThreadHandle' of the thread in which it is called.
+
+    Prototype
+
+      sword OCIThreadHandleGet(dvoid *hndl, OCIError *err,
+                               OCIThreadHandle *tHnd);
+
+        hndl(IN/OUT): The OCI environment or session handle.
+
+        err(IN/OUT): The OCI error handle.  If there is an error and OCI_ERROR
+                     is returned, the error is recorded in err and diagnostic 
+                     information can be obtained by calling OCIErrorGet().
+
+        tHnd(IN/OUT):      If not NULL, the location to place the thread
+                           handle for the thread.
+
+     Returns
+
+      OCI_SUCCESS, OCI_ERROR or OCI_INVALID_HANDLE.
+
+    Notes
+
+      'thnd' should be initialized by OCIThreadHndInit().   
+
+      The thread handle 'tHnd' retrieved by this function must be closed 
+      with OCIThreadClose() and destroyed by OCIThreadHndDestroy() after it
+      is used.
+
+
+
+
+1.4 Using OCIThread
+=====================
+
+This section summarizes some of the more important details relating to the use
+of OCIThread.
+
+  * Process initialization
+
+    OCIThread only requires that the process initialization function
+    ('OCIThreadProcessInit()') be called when OCIThread is being used in a
+    multi-threaded application.  Failing to call 'OCIThreadProcessInit()' in
+    a single-threaded application is not an error.
+
+  * OCIThread initialization
+
+    Separate calls to 'OCIThreadInit()' will all return the same OCIThread
+    context.
+
+    Also, remember that each call to 'OCIThreadInit()' must eventually be
+    matched by a call to 'OCIThreadTerm()'.
+
+  * Active vs. Passive Threading primitives
+
+    OCIThread client code written without using any active primitives can be
+    compiled and used without change on both single-threaded and
+    multi-threaded platforms.
+
+    OCIThread client code written using active primitives will only work
+    correctly on multi-threaded platforms.  In order to write a version of the
+    same application to run on single-threaded platform, it is necessary to 
+    branch the your code, whether by branching versions of the source file or 
+    by branching at runtime with the OCIThreadIsMulti() call.
+
+******************************************************************************/
+
+/*****************************************************************************
+                         ACTUAL PROTOTYPE DECLARATIONS
+******************************************************************************/
+
+void OCIThreadProcessInit();
+
+sword OCIThreadInit(dvoid *hndl, OCIError *err);
+
+sword OCIThreadTerm(dvoid *hndl, OCIError *err);
+
+boolean OCIThreadIsMulti();
+
+sword OCIThreadMutexInit(dvoid *hndl, OCIError *err,  
+                         OCIThreadMutex **mutex); 
+
+sword OCIThreadMutexDestroy(dvoid *hndl, OCIError *err, 
+                            OCIThreadMutex **mutex);
+
+sword OCIThreadMutexAcquire(dvoid *hndl, OCIError *err,
+                            OCIThreadMutex *mutex);
+
+sword OCIThreadMutexRelease(dvoid *hndl, OCIError *err,
+                            OCIThreadMutex *mutex);
+
+sword OCIThreadKeyInit(dvoid *hndl, OCIError *err, OCIThreadKey **key,
+                       OCIThreadKeyDestFunc destFn);
+
+sword OCIThreadKeyDestroy(dvoid *hndl, OCIError *err, 
+                          OCIThreadKey **key);
+
+sword OCIThreadKeyGet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                      dvoid **pValue);
+
+sword OCIThreadKeySet(dvoid *hndl, OCIError *err, OCIThreadKey *key,
+                      dvoid *value);
+
+sword OCIThreadIdInit(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdDestroy(dvoid *hndl, OCIError *err, OCIThreadId **tid);
+
+sword OCIThreadIdSet(dvoid *hndl, OCIError *err, 
+                     OCIThreadId *tidDest, OCIThreadId *tidSrc);
+
+sword OCIThreadIdSetNull(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdGet(dvoid *hndl, OCIError *err, OCIThreadId *tid);
+
+sword OCIThreadIdSame(dvoid *hndl, OCIError *err,
+                      OCIThreadId *tid1, OCIThreadId *tid2,
+                      boolean *result);
+
+sword OCIThreadIdNull(dvoid *hndl, OCIError *err,
+                      OCIThreadId *tid, boolean *result);
+
+sword OCIThreadHndInit(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadHndDestroy(dvoid *hndl, OCIError *err, OCIThreadHandle **thnd);
+
+sword OCIThreadCreate(dvoid *hndl, OCIError *err,
+                      void (*start)(dvoid *), dvoid *arg,
+                      OCIThreadId *tid, OCIThreadHandle *tHnd);
+
+sword OCIThreadJoin(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadClose(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+
+sword OCIThreadHandleGet(dvoid *hndl, OCIError *err, OCIThreadHandle *tHnd);
+/*----------------- End OCI Thread interface Extensions ---------------------*/
+
+/*--------------- Begin OCI Client Notification Interfaces ------------------*/
+
+typedef ub4 (*OCISubscriptionNotify)(dvoid *ctx, OCISubscription *subscrhp, 
+				     dvoid *pay, ub4 payl, 
+				     dvoid *desc, ub4 mode);
+
+sword OCISubscriptionRegister(OCISvcCtx *svchp, OCISubscription **subscrhpp, 
+			      ub2 count, OCIError *errhp, ub4 mode);
+
+
+sword OCISubscriptionPost(OCISvcCtx *svchp, OCISubscription **subscrhpp, 
+			      ub2 count, OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionUnRegister(OCISvcCtx *svchp, OCISubscription *subscrhp, 
+			      OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionDisable(OCISubscription *subscrhp, 
+			   OCIError *errhp, ub4 mode);
+
+sword OCISubscriptionEnable(OCISubscription *subscrhp, 
+			  OCIError *errhp, ub4 mode);
+
+/*------------------- End OCI Publish/Subscribe Interfaces ------------------*/
+
+/*----------------- Extensions to Datetime interfaces -----------------------*/
+/*--------------------- Actual Prototypes -----------------------------------*/
+sword OCIDateTimeGetTime(dvoid *hndl, OCIError *err, OCIDateTime *datetime, 
+			 ub1 *hr, ub1 *mm, ub1 *ss, ub4 *fsec);
+
+sword OCIDateTimeGetDate(dvoid *hndl, OCIError *err,  CONST OCIDateTime *date, 
+		 sb2 *yr, ub1 *mnth, ub1 *dy );
+
+sword OCIDateTimeGetTimeZoneOffset(dvoid *hndl,OCIError *err,
+		  CONST OCIDateTime   *datetime,sb1 *hr,sb1 *mm);
+
+sword OCIDateTimeConstruct(dvoid  *hndl,OCIError *err,OCIDateTime *datetime,
+               sb2 yr,ub1 mnth,ub1 dy,ub1 hr,ub1 mm,ub1 ss,ub4 fsec,
+               OraText  *timezone,size_t timezone_length);
+
+sword OCIDateTimeSysTimeStamp(dvoid *hndl, OCIError *err, 
+			      OCIDateTime *sys_date );
+
+sword OCIDateTimeAssign(dvoid *hndl, OCIError *err, CONST OCIDateTime *from, 
+		       OCIDateTime *to);
+
+sword OCIDateTimeToText(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+                        CONST OraText *fmt, ub1 fmt_length, ub1 fsprec, 
+                        CONST OraText *lang_name, size_t lang_length, 
+                        ub4 *buf_size, OraText *buf );
+
+sword OCIDateTimeFromText(dvoid *hndl, OCIError *err, CONST OraText *date_str, 
+             size_t dstr_length, CONST OraText *fmt, ub1 fmt_length,
+             CONST OraText *lang_name, size_t lang_length, OCIDateTime *date );
+
+sword OCIDateTimeCompare(dvoid *hndl, OCIError *err, CONST OCIDateTime *date1, 
+                     CONST OCIDateTime *date2,  sword *result );
+
+sword OCIDateTimeCheck(dvoid *hndl, OCIError *err, CONST OCIDateTime *date, 
+		 ub4 *valid );
+
+sword OCIDateTimeConvert(dvoid *hndl, OCIError *err, OCIDateTime *indate,
+				OCIDateTime *outdate);
+
+sword OCIDateTimeSubtract(dvoid *hndl, OCIError *err, OCIDateTime *indate1, 
+		OCIDateTime *indate2,	 OCIInterval *inter);
+
+sword OCIDateTimeIntervalAdd(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+	 OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIDateTimeIntervalSub(dvoid *hndl, OCIError *err, OCIDateTime *datetime,
+	 OCIInterval *inter, OCIDateTime *outdatetime);
+
+sword OCIIntervalSubtract(dvoid *hndl, OCIError *err, OCIInterval *minuend, 
+			    OCIInterval *subtrahend, OCIInterval *result );
+
+sword OCIIntervalAdd(dvoid *hndl, OCIError *err, OCIInterval *addend1, 
+			OCIInterval *addend2, OCIInterval *result );
+
+sword OCIIntervalMultiply(dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+			OCINumber *nfactor, OCIInterval *result );
+
+sword OCIIntervalDivide(dvoid *hndl, OCIError *err, OCIInterval *dividend, 
+		OCINumber *divisor, OCIInterval *result );
+
+sword OCIIntervalCompare(dvoid *hndl, OCIError *err, OCIInterval *inter1, 
+			OCIInterval *inter2, sword *result );
+
+sword OCIIntervalFromNumber(dvoid *hndl, OCIError *err, OCIInterval *inter, 
+			OCINumber *number);
+
+sword OCIIntervalFromText( dvoid *hndl, OCIError *err, CONST OraText *inpstr, 
+		size_t str_len, OCIInterval *result );
+
+sword OCIIntervalToText( dvoid *hndl, OCIError *err, CONST OCIInterval *inter,
+                         ub1 lfprec, ub1 fsprec, 
+			OraText *buffer, size_t buflen, size_t *resultlen );
+
+sword OCIIntervalToNumber(dvoid *hndl, OCIError *err,CONST OCIInterval *inter, 
+			OCINumber *number);
+
+sword OCIIntervalCheck(dvoid *hndl, OCIError *err, CONST OCIInterval *interval,
+			 ub4 *valid );
+
+sword OCIIntervalAssign(dvoid *hndl, OCIError *err, CONST OCIInterval *ininter,
+			OCIInterval *outinter );
+
+sword OCIIntervalSetYearMonth(dvoid *hndl, OCIError *err, sb4 yr, sb4 mnth,
+                        OCIInterval *result );
+
+sword OCIIntervalGetYearMonth(dvoid *hndl, OCIError *err, sb4 *yr, sb4 *mnth,
+                        CONST OCIInterval *result );
+
+sword OCIIntervalSetDaySecond(dvoid *hndl, OCIError *err, sb4 dy, sb4 hr,
+                        sb4 mm, sb4 ss, sb4 fsec, OCIInterval *result );
+
+sword OCIIntervalGetDaySecond(dvoid *hndl, OCIError *err, sb4 *dy, sb4 *hr,
+                     sb4 *mm, sb4 *ss, sb4 *fsec, CONST OCIInterval *result );
+
+sword OCIDateTimeToArray(dvoid *hndl, OCIError *err,
+                         CONST OCIDateTime *datetime, CONST OCIInterval *reftz,
+                         ub1 *outarray, ub4 *len, ub1 fsprec);
+
+sword OCIDateTimeFromArray(dvoid *hndl, OCIError *err, ub1 *inarray, ub4 len,
+                           ub1 type, OCIDateTime *datetime,
+                           CONST OCIInterval *reftz, ub1 fsprec);
+
+sword OCIDateTimeGetTimeZoneName(dvoid *hndl, OCIError *err,
+                                 CONST OCIDateTime *datetime, 
+                                 ub1 *buf, ub4 *buflen);
+
+sword OCIIntervalFromTZ(dvoid *hndl, OCIError *err, CONST oratext *inpstring,
+                        size_t str_len, OCIInterval *result);
+
+/*----------------- End Datetime interface Extensions -----------------------*/
+
+/*----------------- Connection Pooling prototypes ---------------------------*/
+sword OCIConnectionPoolCreate(OCIEnv *envhp, OCIError *errhp, OCICPool *poolhp,
+                              OraText **poolName, sb4 *poolNameLen,  
+                              CONST OraText *dblink, sb4 dblinkLen,
+                              ub4 connMin, ub4 connMax, ub4 connIncr,
+                              CONST OraText *poolUserName, sb4 poolUserLen,
+                              CONST OraText *poolPassword, sb4 poolPassLen,
+                              ub4 mode);
+
+sword OCIConnectionPoolDestroy(OCICPool *poolhp,
+                               OCIError *errhp, ub4 mode);
+
+/*----------------- End Connection Pooling prototypes -----------------------*/
+
+/*-------------------- Session Pooling prototypes ---------------------------*/
+
+sword OCISessionPoolCreate (OCIEnv *envhp, OCIError *errhp, OCISPool *spoolhp, 
+                            OraText **poolName, ub4 *poolNameLen, 
+                            CONST OraText *connStr, ub4 connStrLen,
+                            ub4 sessMin, ub4 sessMax, ub4 sessIncr,
+                            OraText *userid, ub4 useridLen,
+                            OraText *password, ub4 passwordLen,
+                            ub4 mode);
+                                                  
+sword OCISessionPoolDestroy (OCISPool *spoolhp,
+                             OCIError *errhp,
+                             ub4 mode);
+                             
+sword OCISessionGet (OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp,
+                     OCIAuthInfo *authhp,
+                     OraText *poolName, ub4 poolName_len, 
+                     CONST OraText *tagInfo, ub4 tagInfo_len,
+                     OraText **retTagInfo, ub4 *retTagInfo_len,
+                     boolean *found, ub4 mode);
+
+sword OCISessionRelease (OCISvcCtx *svchp, OCIError *errhp,
+                         OraText *tag, ub4 tag_len,
+                         ub4 mode);
+
+/*-------------------- End Session Pooling prototypes -----------------------*/
+
+sword  OCIXMLTypeNew(OCISvcCtx *svchp, OCIError *errhp, OCIDuration dur,
+                     OraText *elname, ub4 elname_Len,
+                     OraText *schemaURL, ub4 schemaURL_Len,
+                     OCIXMLType **retInstance);
+
+sword  OCIXMLTypeCreateFromSrc(OCISvcCtx *svchp, OCIError *errhp,
+                     OCIDuration dur, ub1 src_type, dvoid *src_ptr,
+                     sb4 ind, OCIXMLType **retInstance);
+
+sword OCIXMLTypeExtract(OCIError *errhp,
+              OCIXMLType *doc, OCIDuration dur,
+              OraText *xpathexpr, ub4 xpathexpr_Len,
+              OraText *nsmap, ub4 nsmap_Len,
+              OCIXMLType **retDoc);
+
+sword OCIXMLTypeTransform(OCIError *errhp, OCIDuration dur,
+               OCIXMLType *doc, OCIXMLType *xsldoc,
+               OCIXMLType **retDoc);
+
+sword OCIXMLTypeExists(OCIError *errhp, OCIXMLType *doc,
+                 OraText *xpathexpr, ub4 xpathexpr_Len,
+                 OraText *nsmap, ub4 nsmap_Len,
+                 boolean *retval);
+
+sword OCIXMLTypeIsSchemaBased(OCIError *errhp,
+                              OCIXMLType *doc, boolean *retval);
+
+sword OCIXMLTypeGetSchema(OCIError *errhp, OCIXMLType *doc,
+             OCIXMLType **schemadoc,
+             OraText **schemaURL, ub4 *schemaURL_Len,
+             OraText **rootelem, ub4 *rootelem_Len);
+
+sword OCIXMLTypeValidate(OCIError *errhp, OCIXMLType *doc,
+                   OraText *schemaURL, ub4 schemaURL_Len, boolean *retval);
+
+sword OCIXMLTypeGetDOM(OCIError *errhp, OCIXMLType *doc, OCIDuration dur,
+                       OCIDOMDocument **retDom);
+
+sword OCIXMLTypeGetFromDOM(OCIError *errhp, OCIDOMDocument *domdoc,
+                           OCIXMLType **retXMLType);
+
+sword OCIDOMFree(OCIError *errhp, OCIDOMDocument *domdoc);
+
+
+/*---------------------------------------------------------------------------
+                          PRIVATE FUNCTIONS
+  ---------------------------------------------------------------------------*/
+
+            /* the following functions are depracated and should not be used */
+#ifdef NEVER
+sword   OCIStmtBindByPos  (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                  ub4 position, dvoid *valuep, sb4 value_sz,
+                  ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+                  ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+sword   OCIStmtBindByName  (OCIStmt *stmtp, OCIBind *bindp, OCIError *errhp,
+                  CONST OraText *placeholder, sb4 placeh_len, dvoid *valuep, 
+                  sb4 value_sz, ub2 dty, dvoid *indp, ub2 *alenp, 
+                  ub2 *rcodep, ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+sword   ocidefn  (OCIStmt *stmtp, OCIDefine *defnp, OCIError *errhp,
+                  ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+                  dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+#endif /* NEVER */
+
+#endif                                                       /* OCIAP_ORACLE */
diff --git a/src/terralib/drivers/OracleSpatial/sdo_oci.cpp b/src/terralib/drivers/OracleSpatial/sdo_oci.cpp
new file mode 100644
index 0000000..36194d2
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/sdo_oci.cpp
@@ -0,0 +1,3097 @@
+/*	Delegate OCI calls -- Ran Wei, Oracle SDO, 9/10/1998
+	Copyright 1998, Oracle Corp. */
+
+
+
+#include <oci.h>
+#include <sdo_oci.h>
+
+//extern "C"
+//{
+//	#include <oci.h>
+//	#include "sdo_oci.h"
+//}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part I -- OCI fundamental interfaces                                         */
+
+/********************************************************************************/
+
+/*
+Note: OCIEnvCreate() should be used instead of the
+OCIInitialize() and OCIEnvInit() calls.
+OCIInitialize() and OCIEnvInit() calls will be supported
+for backward compatibility.
+*/
+
+sword SDO_OCIEnvCreate(OCIEnv **envhpp, ub4 mode, dvoid *ctxp, 
+
+						 dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+						dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+						void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+						
+						size_t xtramensz, dvoid **usrmempp)
+
+{
+
+	return OCIEnvCreate (envhpp, mode, ctxp, malocfp, ralocfp,  mfreefp, xtramensz, usrmempp);
+}
+
+
+
+sword SDO_OCIInitialize(ub4 mode, dvoid *ctxp, 
+
+						dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+						dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+						void (*mfreefp)(dvoid *ctxp, dvoid *memptr))
+
+{
+
+	return OCIInitialize(mode, ctxp, malocfp, ralocfp, mfreefp);
+
+}
+
+
+
+sword SDO_OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, ub4 type, 
+
+						 size_t xtramem_sz, dvoid **usrmempp)
+
+{
+
+	//aloca todas as handles do ambiente passado como parametro
+	return OCIHandleAlloc(parenth, hndlpp, type, xtramem_sz, usrmempp);
+
+}
+
+
+
+sword SDO_OCIHandleFree(dvoid *hndlp, ub4 type)
+
+{
+
+	return OCIHandleFree(hndlp, type);
+
+}
+
+
+
+sword SDO_OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp, ub4 type,
+
+							 size_t xtramem_sz, dvoid **usrmempp)
+
+{
+
+	return OCIDescriptorAlloc(parenth, descpp, type, xtramem_sz, usrmempp);
+
+}
+
+
+
+sword SDO_OCIDescriptorFree(dvoid *descp, ub4 type)
+
+{
+
+	return OCIDescriptorFree(descp, type);
+
+}
+
+
+
+sword SDO_OCIEnvInit(OCIEnv **envp, ub4 mode, size_t xtramem_sz, 
+
+					 dvoid **usrmempp)
+
+{
+
+	return OCIEnvInit(envp, mode, xtramem_sz, usrmempp);
+
+}
+
+
+
+sword SDO_OCIServerAttach(OCIServer *srvhp, OCIError *errhp,
+
+						  CONST text *dblink, sb4 dblink_len, ub4 mode)
+
+{
+
+	return OCIServerAttach(srvhp, errhp, dblink, dblink_len, mode);
+
+}
+
+
+
+sword SDO_OCIServerDetach(OCIServer *srvhp, OCIError *errhp, ub4 mode)
+
+{
+
+	return OCIServerDetach(srvhp, errhp, mode);
+
+}
+
+
+
+sword SDO_OCISessionBegin(OCISvcCtx *svchp, OCIError *errhp, 
+
+						  OCISession *usrhp, ub4 credt, ub4 mode)
+
+{
+
+	return OCISessionBegin(svchp, errhp, usrhp, credt, mode);
+
+}
+
+
+
+sword SDO_OCISessionEnd(OCISvcCtx *svchp, OCIError *errhp, 
+
+						OCISession *usrhp, ub4 mode)
+
+{
+
+	return OCISessionEnd(svchp, errhp, usrhp, mode);
+
+}
+
+
+
+sword SDO_OCILogon(OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, 
+
+				   CONST text *username, ub4 uname_len, CONST text *password, 
+
+				   ub4 passwd_len, CONST text *dbname, ub4 dbname_len)
+
+{
+
+	return OCILogon(envhp, errhp, svchp, username, uname_len, password, 
+
+				    passwd_len, dbname, dbname_len);
+
+}
+
+
+
+sword SDO_OCILogoff(OCISvcCtx *svchp, OCIError *errhp)
+
+{
+
+	return OCILogoff(svchp, errhp);
+
+}
+
+
+
+sword SDO_OCIPasswordChange(OCISvcCtx *svchp, OCIError *errhp, 
+
+							CONST text *user_name, ub4 usernm_len, 
+
+							CONST text *opasswd, ub4 opasswd_len, 
+
+							CONST text *npasswd, ub4 npasswd_len, ub4 mode)
+
+{
+
+	return OCIPasswordChange(svchp, errhp, user_name, usernm_len, 
+
+							 opasswd, opasswd_len, npasswd, npasswd_len, mode);
+
+}
+
+
+
+sword SDO_OCIStmtPrepare(OCISvcCtx * /* svchp */, OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+
+						 ub4 stmt_len, CONST OraText * /* key */, ub4 /* keylen */, ub4 language, ub4 mode)
+
+{
+	//return OCIStmtPrepare2 (svchp, stmtp, errhp, stmt, stmt_len, key, keylen, language, mode );
+	
+	return OCIStmtPrepare(stmtp, errhp, stmt, stmt_len, language, mode);
+}
+
+
+
+sword SDO_OCIBindByPos(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+					   ub4 position, dvoid *valuep, sb4 value_sz,
+
+					   ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+
+					   ub4 maxarr_len, ub4 *curelep, ub4 mode)
+
+{
+
+	return OCIBindByPos(stmtp, bindp, errhp, position, valuep, value_sz,
+
+					    dty, indp, alenp, rcodep, maxarr_len, curelep, mode);
+
+}
+
+
+
+sword SDO_OCIBindByName(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+						CONST text *placeholder, sb4 placeh_len, 
+
+						dvoid *valuep, sb4 value_sz, ub2 dty, 
+
+						dvoid *indp, ub2 *alenp, ub2 *rcodep, 
+
+						ub4 maxarr_len, ub4 *curelep, ub4 mode)
+
+{
+
+	return OCIBindByName(stmtp, bindp, errhp, placeholder, placeh_len, 
+
+						 valuep, value_sz, dty, indp, alenp, rcodep, 
+
+						 maxarr_len, curelep, mode);
+
+}
+
+
+
+sword SDO_OCIBindObject(OCIBind *bindp, OCIError *errhp, CONST OCIType *type, 
+
+						dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, ub4 *indszp)
+
+{
+
+	return OCIBindObject(bindp, errhp, type, pgvpp, pvszsp, indpp, indszp);
+
+}
+
+
+
+sword SDO_OCIBindDynamic(OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+
+						 OCICallbackInBind icbfp, dvoid *octxp,
+
+						 OCICallbackOutBind ocbfp)
+
+{
+
+	return OCIBindDynamic(bindp, errhp, ictxp, icbfp, octxp, ocbfp);
+
+}
+
+
+
+sword SDO_OCIBindArrayOfStruct(OCIBind *bindp, OCIError *errhp, 
+
+                               ub4 pvskip, ub4 indskip, ub4 alskip, ub4 rcskip)
+
+{
+
+	return OCIBindArrayOfStruct(bindp, errhp, pvskip, indskip, alskip, rcskip);
+
+}
+
+
+
+sword SDO_OCIStmtGetPieceInfo(OCIStmt *stmtp, OCIError *errhp, 
+
+                              dvoid **hndlpp, ub4 *typep, ub1 *in_outp, 
+
+							  ub4 *iterp, ub4 *idxp, ub1 *piecep)
+
+{
+
+	return OCIStmtGetPieceInfo(stmtp, errhp, hndlpp, typep, in_outp, iterp, 
+
+							   idxp, piecep);
+
+}
+
+
+
+sword SDO_OCIStmtSetPieceInfo(dvoid *hndlp, ub4 type, OCIError *errhp, 
+
+                              CONST dvoid *bufp, ub4 *alenp, ub1 piece, 
+
+                              CONST dvoid *indp, ub2 *rcodep)
+
+{
+
+	return OCIStmtSetPieceInfo(hndlp, type, errhp, bufp, alenp, piece, 
+
+							   indp, rcodep);
+
+}
+
+
+
+sword SDO_OCIStmtExecute(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, 
+
+						 ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in, 
+
+						 OCISnapshot *snap_out, ub4 mode)
+
+{
+
+	return OCIStmtExecute(svchp, stmtp, errhp, iters, rowoff, snap_in, 
+
+						  snap_out, mode);
+
+}
+
+
+
+sword SDO_OCIDefineByPos(OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+
+						 ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+
+						 dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode)
+
+{
+
+	return OCIDefineByPos(stmtp, defnp, errhp, position, valuep, value_sz, dty,
+
+						  indp, rlenp, rcodep, mode);
+
+}
+
+
+
+sword SDO_OCIDefineObject(OCIDefine *defnp, OCIError *errhp, 
+
+                          CONST OCIType *type, dvoid **pgvpp, 
+
+                          ub4 *pvszsp, dvoid **indpp, ub4 *indszp)
+
+{	
+
+	return OCIDefineObject(defnp, errhp, type, pgvpp, pvszsp, indpp, indszp);
+
+}
+
+
+
+sword SDO_OCIDefineDynamic(OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+
+                           OCICallbackDefine ocbfp)
+
+{
+
+	return OCIDefineDynamic(defnp, errhp, octxp, ocbfp);
+
+}
+
+
+
+sword SDO_OCIDefineArrayOfStruct(OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+
+                                 ub4 indskip, ub4 rlskip, ub4 rcskip)
+
+{
+
+	return OCIDefineArrayOfStruct(defnp, errhp, pvskip, indskip, rlskip, rcskip);
+
+}
+
+
+
+sword SDO_OCIStmtFetch(OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+
+                       ub2 orientation, ub4 mode)
+
+{
+
+	return OCIStmtFetch(stmtp, errhp, nrows, orientation, mode);
+
+}
+
+
+
+sword SDO_OCIStmtGetBindInfo(OCIStmt *stmtp, OCIError *errhp, ub4 size, 
+
+                             ub4 startloc, sb4 *found, text *bvnp[], ub1 bvnl[],
+
+                             text *invp[], ub1 inpl[], ub1 dupl[], OCIBind *hndl[])
+
+{
+
+	return OCIStmtGetBindInfo(stmtp, errhp, size, startloc, found, bvnp, bvnl,
+
+                              invp, inpl, dupl, hndl);
+
+}
+
+
+
+sword SDO_OCIDescribeAny(OCISvcCtx *svchp, OCIError *errhp, dvoid *objptr, 
+
+                         ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+
+						 ub1 objtyp, OCIDescribe *dschp)
+
+{
+
+	return OCIDescribeAny(svchp, errhp, objptr, objnm_len, objptr_typ, info_level,
+
+						  objtyp, dschp);
+
+}
+
+
+
+sword SDO_OCIParamGet(CONST dvoid *hndlp, ub4 htype, OCIError *errhp, 
+
+                      dvoid **parmdpp, ub4 pos)
+
+{
+
+	return OCIParamGet(hndlp, htype, errhp, parmdpp, pos);
+
+}
+
+
+
+sword SDO_OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+
+                      ub4 dtyp, ub4 pos)
+
+{
+
+	return OCIParamSet(hdlp, htyp, errhp, dscp, dtyp, pos);
+
+}
+
+
+
+sword SDO_OCITransStart(OCISvcCtx *svchp, OCIError *errhp, uword timeout, ub4 flags)
+
+{
+
+	return OCITransStart(svchp, errhp, timeout, flags);
+
+}
+
+
+
+sword SDO_OCITransDetach(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+	return OCITransDetach(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransCommit(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+	return OCITransCommit(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransRollback(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+	return OCITransRollback(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransPrepare(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+	return OCITransPrepare(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCITransForget(OCISvcCtx *svchp, OCIError *errhp, ub4 flags)
+
+{
+
+	return OCITransForget(svchp, errhp, flags);
+
+}
+
+
+
+sword SDO_OCIErrorGet(dvoid *hndlp, ub4 recordno, text *sqlstate,
+
+                      sb4 *errcodep, text *bufp, ub4 bufsiz, ub4 type)
+
+{
+
+	return OCIErrorGet(hndlp, recordno, sqlstate, errcodep, bufp, bufsiz, type);
+
+}
+
+
+
+sword SDO_OCILobAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+                       OCILobLocator *src_locp)
+
+{
+
+	return OCILobAppend(svchp, errhp, dst_locp, src_locp);
+
+}
+
+
+
+sword SDO_OCILobAssign(OCIEnv *envhp, OCIError *errhp, CONST OCILobLocator *src_locp, 
+
+                       OCILobLocator **dst_locpp)
+
+{
+
+	return OCILobAssign(envhp, errhp, src_locp, dst_locpp);
+
+}
+
+
+
+sword SDO_OCILobCharSetForm(OCIEnv *envhp, OCIError *errhp, 
+
+							CONST OCILobLocator *locp, ub1 *csfrm)
+
+{
+
+	return OCILobCharSetForm(envhp, errhp, locp, csfrm);
+
+}
+
+
+
+sword SDO_OCILobCharSetId(OCIEnv *envhp, OCIError *errhp, 
+
+						  CONST OCILobLocator *locp, ub2 *csid)
+
+{
+
+	return OCILobCharSetId(envhp, errhp, locp, csid);
+
+}
+
+
+
+sword SDO_OCILobCopy(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+                     OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, 
+
+                     ub4 src_offset)
+
+{
+
+	return OCILobCopy(svchp, errhp, dst_locp, src_locp, amount, dst_offset, 
+
+                      src_offset);
+
+}
+
+
+
+sword SDO_OCILobDisableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+								 OCILobLocator *locp)
+
+{
+
+	return OCILobDisableBuffering(svchp, errhp, locp);
+
+}
+
+
+
+sword SDO_OCILobEnableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+								OCILobLocator *locp)
+
+{
+
+	return OCILobEnableBuffering(svchp, errhp, locp);
+
+}
+
+
+
+sword SDO_OCILobErase(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                      ub4 *amount, ub4 offset)
+
+{
+
+	return OCILobErase(svchp, errhp, locp, amount, offset);
+
+}
+
+
+
+sword SDO_OCILobFileClose(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep)
+
+{
+
+	return OCILobFileClose(svchp, errhp, filep);
+
+}
+
+
+
+sword SDO_OCILobFileCloseAll(OCISvcCtx *svchp, OCIError *errhp)
+
+{
+
+	return OCILobFileCloseAll(svchp, errhp);
+
+}
+
+
+
+sword SDO_OCILobFileExists(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+						   boolean *flag)
+
+{
+
+	return OCILobFileExists(svchp, errhp, filep, flag);
+
+}
+
+
+
+sword SDO_OCILobFileGetName(OCIEnv *envhp, OCIError *errhp, 
+
+							CONST OCILobLocator *filep, text *dir_alias, 
+
+							ub2 *d_length, text *filename, ub2 *f_length)
+
+{
+
+	return OCILobFileGetName(envhp, errhp, filep, dir_alias, d_length, 
+
+							 filename, f_length);
+
+}
+
+
+
+sword SDO_OCILobFileIsOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+                           boolean *flag)
+
+{
+
+	return OCILobFileIsOpen(svchp, errhp, filep, flag);
+
+}
+
+
+
+sword SDO_OCILobFileOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+                         ub1 mode)
+
+{
+
+	return OCILobFileOpen(svchp, errhp, filep, mode);
+
+}
+
+
+
+sword SDO_OCILobFileSetName(OCIEnv *envhp, OCIError *errhp, OCILobLocator **filepp, 
+
+                            CONST text *dir_alias, ub2 d_length, 
+
+                            CONST text *filename, ub2 f_length)
+
+{
+
+	return OCILobFileSetName(envhp, errhp, filepp, dir_alias, d_length, 
+
+                             filename, f_length);
+
+}
+
+
+
+sword SDO_OCILobFlushBuffer(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                            ub4 flag)
+
+{
+
+	return OCILobFlushBuffer(svchp, errhp, locp, flag);
+
+}
+
+
+
+sword SDO_OCILobGetLength(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                          ub4 *lenp)
+
+{
+
+	return OCILobGetLength(svchp, errhp, locp, lenp);
+
+}
+
+
+
+sword SDO_OCILobIsEqual(OCIEnv *envhp, CONST OCILobLocator *x, 
+
+						CONST OCILobLocator *y, boolean *is_equal)
+
+{
+
+	return OCILobIsEqual(envhp, x, y, is_equal);
+
+}
+
+
+
+sword SDO_OCILobLoadFromFile(OCISvcCtx *svchp, OCIError *errhp, 
+
+							 OCILobLocator *dst_locp, OCILobLocator *src_filep, 
+
+                             ub4 amount, ub4 dst_offset, ub4 src_offset)
+
+{
+
+	return OCILobLoadFromFile(svchp, errhp, dst_locp, src_filep, amount, 
+
+							  dst_offset, src_offset);
+
+}
+
+
+
+sword SDO_OCILobLocatorIsInit(OCIEnv *envhp, OCIError *errhp, 
+
+							  CONST OCILobLocator *locp, boolean *is_initialized)
+
+{
+
+	return OCILobLocatorIsInit(envhp, errhp, locp, is_initialized);
+
+}
+
+
+
+sword SDO_OCILobRead(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                     ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, 
+
+                     dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, CONST dvoid *bufp, 
+
+					 ub4 len, ub1 piece), ub2 csid, ub1 csfrm)
+
+{
+
+	return OCILobRead(svchp, errhp, locp, amtp, offset, bufp, bufl, 
+
+                      ctxp, cbfp, csid, csfrm);
+
+}
+
+
+
+sword SDO_OCILobTrim(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                     ub4 newlen)
+
+{
+
+	return OCILobTrim(svchp, errhp, locp, newlen);
+
+}
+
+
+
+sword SDO_OCILobWrite(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                      ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, ub1 piece, 
+
+					  dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, dvoid *bufp, ub4 *len, 
+
+					  ub1 *piece), ub2 csid, ub1 csfrm)
+
+{
+
+	return OCILobWrite(svchp, errhp, locp, amtp, offset, bufp, buflen, piece, 
+
+					   ctxp, cbfp, csid, csfrm);
+
+}
+
+
+
+sword SDO_OCIBreak(dvoid *hndlp, OCIError *errhp)
+
+{
+
+	return OCIBreak(hndlp, errhp);
+
+}
+
+
+
+sword SDO_OCIServerVersion(dvoid *hndlp, OCIError *errhp, text *bufp, ub4 bufsz,
+
+                           ub1 hndltype)
+
+{
+
+	return OCIServerVersion(hndlp, errhp, bufp, bufsz, hndltype);
+
+}
+
+
+
+sword SDO_OCIAttrGet(CONST dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep, 
+
+					 ub4 *sizep, ub4 attrtype, OCIError *errhp)
+
+{
+
+	return OCIAttrGet(trgthndlp, trghndltyp, attributep, sizep, attrtype, errhp);
+
+}
+
+
+
+sword SDO_OCIAttrSet(dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+
+					 ub4 size, ub4 attrtype, OCIError *errhp)
+
+{
+
+	return OCIAttrSet(trgthndlp, trghndltyp, attributep, size, attrtype, errhp);
+
+}
+
+
+
+sword SDO_OCISvcCtxToLda(OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap)
+
+{
+
+	return OCISvcCtxToLda(svchp, errhp, ldap);
+
+}
+
+
+
+sword SDO_OCILdaToSvcCtx(OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap)
+
+{
+
+	return OCILdaToSvcCtx(svchpp, errhp, ldap);
+
+}
+
+
+
+sword SDO_OCIResultSetToStmt(OCIResult *rsetdp, OCIError *errhp)
+
+{
+
+	return OCIResultSetToStmt(rsetdp, errhp);
+
+}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part II -- OCI navigational interfaces                                       */
+
+/********************************************************************************/
+
+sword SDO_OCIObjectNew(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+					   OCITypeCode typecode, OCIType *tdo, dvoid *table, 
+
+					   OCIDuration duration, boolean value, dvoid **instance)
+
+{
+
+	return OCIObjectNew(env, err, svc, typecode, tdo, table, duration, 
+
+						value, instance);
+
+}
+
+
+
+sword SDO_OCIObjectPin(OCIEnv *env, OCIError *err, OCIRef *object_ref, 
+
+					   OCIComplexObject *corhdl, OCIPinOpt pin_option, 
+
+					   OCIDuration pin_duration, OCILockOpt lock_option, 
+
+					   dvoid **object)
+
+{
+
+	return OCIObjectPin(env, err, object_ref, corhdl, pin_option, 
+
+					    pin_duration, lock_option, object);
+
+}
+
+
+
+sword SDO_OCIObjectUnpin(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectUnpin(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectPinCountReset(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectPinCountReset(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectLock(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectLock(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectMarkUpdate(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectMarkUpdate(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectUnmark(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectUnmark(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectUnmarkByRef(OCIEnv *env, OCIError *err, OCIRef *ref)
+
+{
+
+	return OCIObjectUnmarkByRef(env, err, ref);
+
+}
+
+
+
+sword SDO_OCIObjectFree(OCIEnv *env, OCIError *err, dvoid *instance, 
+
+                        ub2 flags)
+
+{
+
+	return OCIObjectFree(env, err, instance, flags);
+
+}
+
+
+
+sword SDO_OCIObjectMarkDeleteByRef(OCIEnv *env, OCIError *err, OCIRef *object_ref)
+
+{
+
+	return OCIObjectMarkDeleteByRef(env, err, object_ref);
+
+}
+
+
+
+sword SDO_OCIObjectMarkDelete(OCIEnv *env, OCIError *err, dvoid *instance)
+
+{
+
+	return OCIObjectMarkDelete(env, err, instance);
+
+}
+
+
+
+sword SDO_OCIObjectFlush(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectFlush(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectRefresh(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectRefresh(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectCopy(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                        dvoid *source, dvoid *null_source, dvoid *target, 
+
+						dvoid *null_target, OCIType *tdo, OCIDuration duration, 
+
+						ub1 option)
+
+{
+
+	return OCIObjectCopy(env, err, svc, source, null_source, target, 
+
+						 null_target, tdo, duration, option);
+
+}
+
+
+
+sword SDO_OCIObjectGetTypeRef(OCIEnv *env, OCIError *err, dvoid *instance, 
+
+                              OCIRef *type_ref)
+
+{
+
+	return OCIObjectGetTypeRef(env, err, instance, type_ref);
+
+}
+
+
+
+sword SDO_OCIObjectGetObjectRef(OCIEnv *env, OCIError *err, dvoid *object, 
+
+                                OCIRef *object_ref)
+
+{
+
+	return OCIObjectGetObjectRef(env, err, object, object_ref);
+
+}
+
+
+
+sword SDO_OCIObjectGetInd(OCIEnv *env, OCIError *err, dvoid *instance, 
+
+                          dvoid **null_struct)
+
+{
+
+	return OCIObjectGetInd(env, err, instance, null_struct);
+
+}
+
+
+
+sword SDO_OCIObjectExists(OCIEnv *env, OCIError *err, dvoid *ins, boolean *exist)
+
+{
+
+	return OCIObjectExists(env, err, ins, exist);
+
+}
+
+
+
+sword SDO_OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, CONST dvoid *obj, 
+
+							   OCIObjectPropId propertyId, dvoid *property, 
+
+							   ub4 *size)
+
+{
+
+	return OCIObjectGetProperty(envh, errh, obj, propertyId, property, size);
+
+}
+
+
+
+sword SDO_OCIObjectIsLocked(OCIEnv *env, OCIError *err, dvoid *ins, boolean *lock)
+
+{
+
+	return OCIObjectIsLocked(env, err, ins, lock);
+
+}
+
+
+
+sword SDO_OCIObjectIsDirty(OCIEnv *env, OCIError *err, dvoid *ins, boolean *dirty)
+
+{
+
+	return OCIObjectIsDirty(env, err, ins, dirty);
+
+}
+
+
+
+sword SDO_OCIObjectPinTable(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+							CONST text *schema_name, ub4 s_n_length, 
+
+							CONST text *object_name, ub4 o_n_length, 
+
+							CONST OCIRef *scope_obj_ref, OCIDuration pin_duration, 
+
+							dvoid** object)
+
+{
+
+	return OCIObjectPinTable(env, err, svc, schema_name, s_n_length, 
+
+							 object_name, o_n_length, scope_obj_ref, pin_duration, 
+
+							 object);
+
+}
+
+
+
+sword SDO_OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array, 
+
+							ub4 array_size, OCIComplexObject **cor_array,
+
+							ub4 cor_array_size, OCIPinOpt pin_option, 
+
+							OCIDuration pin_duration, OCILockOpt lock, 
+
+							dvoid **obj_array, ub4 *pos)
+
+{
+
+	return OCIObjectArrayPin(env, err, ref_array, array_size, cor_array,
+
+							 cor_array_size, pin_option, pin_duration, lock, 
+
+							 obj_array, pos);
+
+}
+
+
+
+sword SDO_OCICacheFlush(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+						dvoid *context, OCIRef *(*get)(dvoid *context, ub1 *last),
+
+						OCIRef **ref)
+
+{
+
+	return OCICacheFlush(env, err, svc, context, get, ref);
+
+}
+
+
+
+sword SDO_OCICacheRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+						  OCIRefreshOpt option, dvoid *context,
+
+						  OCIRef *(*get)(dvoid *context), OCIRef **ref)
+
+{
+
+	return OCICacheRefresh(env, err, svc, option, context, get, ref);
+
+}
+
+
+
+sword SDO_OCICacheUnpin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc)
+
+{
+
+	return OCICacheUnpin(env, err, svc);
+
+}
+
+
+
+sword SDO_OCICacheFree(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc)
+
+{
+
+	return OCICacheFree(env, err, svc);
+
+} 
+
+
+
+sword SDO_OCICacheUnmark(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc)
+
+{
+
+	return OCICacheUnmark(env, err, svc);
+
+}
+
+
+
+sword SDO_OCIDurationBegin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                           OCIDuration parent, OCIDuration *dur)
+
+{
+
+	return OCIDurationBegin(env, err, svc, parent, dur);
+
+}
+
+
+
+sword SDO_OCIDurationEnd(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                         OCIDuration duration)
+
+{
+
+	return OCIDurationEnd(env, err, svc, duration);
+
+}
+
+
+
+sword SDO_OCIDurationGetParent(OCIEnv *env, OCIError *err, 
+
+                               OCIDuration duration, OCIDuration *parent)
+
+{
+
+	return OCIDurationGetParent(env, err, duration, parent);
+
+}
+
+
+
+sword SDO_OCIObjectAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectAlwaysLatest(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectNotAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectNotAlwaysLatest(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectFlushRefresh(OCIEnv *env, OCIError *err, dvoid *object)
+
+{
+
+	return OCIObjectFlushRefresh(env, err, object);
+
+}
+
+
+
+sword SDO_OCIObjectIsLoaded(OCIEnv *env, OCIError *err, dvoid *ins, 
+
+							boolean *load)
+
+{
+
+	return OCIObjectIsLoaded(env, err, ins, load);
+
+}
+
+
+
+sword SDO_OCIObjectIsDirtied(OCIEnv *env, OCIError *err, dvoid *ins,
+
+							 boolean *dirty)
+
+{
+
+	return OCIObjectIsDirtied(env, err, ins, dirty);
+
+}
+
+
+
+sword SDO_OCICacheGetObjects(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+							 OCIObjectProperty property, dvoid *client_context,
+
+							 void (*client_callback)(dvoid *client_context,
+
+							 dvoid *object))
+
+{
+
+	return OCICacheGetObjects(env, err, svc, property, client_context,
+
+							  client_callback);
+
+}
+
+
+
+sword SDO_OCICacheRegister(OCIEnv *env, OCIError *err, OCIObjectEvent event,
+
+						   dvoid *client_context, void (*client_callback)(
+
+						   dvoid *client_context, OCIObjectEvent event,
+
+						   dvoid *object))
+
+{
+
+	return OCICacheRegister(env, err, event, client_context, client_callback);
+
+}
+
+
+
+sword SDO_OCICacheFlushRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+							   dvoid *context, OCIRef *(*get)(dvoid *context, 
+
+							   ub1 *last), OCIRef **ref)
+
+{
+
+	return OCICacheFlushRefresh(env, err, svc, context, get, ref);
+
+}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part III -- OCI primitive OTS interfaces                                     */
+
+/********************************************************************************/
+
+void SDO_OCINumberSetZero(OCIError *err, OCINumber *num)
+
+{
+
+	OCINumberSetZero(err, num);
+
+}
+
+
+
+sword SDO_OCINumberAdd(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result)
+
+{
+
+	return OCINumberAdd(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberSub(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result)
+
+{
+
+	return OCINumberSub(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberMul(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result)
+
+{
+
+	return OCINumberMul(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberDiv(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result)
+
+{
+
+	return OCINumberDiv(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberMod(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result)
+
+{
+
+	return OCINumberMod(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberIntPower(OCIError *err, CONST OCINumber *base,
+
+                            CONST sword exp, OCINumber *result)
+
+{
+
+	return OCINumberIntPower(err, base, exp, result);
+
+}
+
+
+
+sword SDO_OCINumberNeg(OCIError *err, CONST OCINumber *number,
+
+                       OCINumber *result)
+
+{
+
+	return OCINumberNeg(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberToText(OCIError *err, CONST OCINumber *number, 
+
+                          CONST text *fmt, ub4 fmt_length,
+
+                          CONST text *nls_params, ub4 nls_p_length,
+
+                          ub4 *buf_size, text *buf)
+
+{
+
+	return OCINumberToText(err, number, fmt, fmt_length, nls_params, 
+
+						   nls_p_length, buf_size, buf);
+
+}
+
+
+
+sword SDO_OCINumberFromText(OCIError *err, CONST text *str, ub4 str_length, 
+
+							CONST text *fmt, ub4 fmt_length, 
+
+							CONST text *nls_params, ub4 nls_p_length, 
+
+							OCINumber *number)
+
+{
+
+	return OCINumberFromText(err, str, str_length, fmt, fmt_length, 
+
+							 nls_params, nls_p_length, number);
+
+}
+
+
+
+sword SDO_OCINumberToInt(OCIError *err, CONST OCINumber *number,
+
+                         uword rsl_length, uword rsl_flag, dvoid *rsl)
+
+{
+
+	return OCINumberToInt(err, number, rsl_length, rsl_flag, rsl);
+
+}
+
+
+
+sword SDO_OCINumberFromInt(OCIError *err, CONST dvoid *inum, uword inum_length,
+
+						   uword inum_s_flag, OCINumber *number)
+
+{
+
+	return OCINumberFromInt(err, inum, inum_length, inum_s_flag, number);
+
+}
+
+
+
+sword SDO_OCINumberToReal(OCIError *err, CONST OCINumber *number,
+
+                          uword rsl_length, dvoid *rsl)
+
+{
+
+	return OCINumberToReal(err, number, rsl_length, rsl);
+
+}
+
+
+
+sword SDO_OCINumberFromReal(OCIError *err, CONST dvoid *rnum,
+
+                            uword rnum_length, OCINumber *number)
+
+{
+
+	return OCINumberFromReal(err, rnum, rnum_length, number);
+
+}
+
+
+
+sword SDO_OCINumberCmp(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, sword *result)
+
+{
+
+	return OCINumberCmp(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberSign(OCIError *err, CONST OCINumber *number,
+
+                        sword *result)
+
+{
+
+	return OCINumberSign(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberIsZero(OCIError *err, CONST OCINumber *number,
+
+                          boolean *result)
+
+{
+
+	return OCINumberIsZero(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberAssign(OCIError *err, CONST OCINumber *from,
+
+                          OCINumber *to)
+
+{
+
+	return OCINumberAssign(err, from, to);
+
+}
+
+
+
+sword SDO_OCINumberAbs(OCIError *err, CONST OCINumber *number,
+
+                       OCINumber *result)
+
+{
+
+	return OCINumberAbs(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberCeil(OCIError *err, CONST OCINumber *number,
+
+                        OCINumber *result)
+
+{
+
+	return OCINumberCeil(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberFloor(OCIError *err, CONST OCINumber *number, 
+
+                         OCINumber *result)
+
+{
+
+	return OCINumberFloor(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberSqrt(OCIError *err, CONST OCINumber *number, 
+
+                        OCINumber *result)
+
+{
+
+	return OCINumberSqrt(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberTrunc(OCIError *err, CONST OCINumber *number, 
+
+                         sword decplace, OCINumber *result)
+
+{
+
+	return OCINumberTrunc(err, number, decplace, result);
+
+}
+
+
+
+sword SDO_OCINumberPower(OCIError *err, CONST OCINumber *base, 
+
+                         CONST OCINumber *number, OCINumber *result)
+
+{
+
+	return OCINumberPower(err, base, number, result);
+
+}
+
+
+
+sword SDO_OCINumberRound(OCIError *err, CONST OCINumber *number,
+
+                         sword decplace, OCINumber *result)
+
+{
+
+	return OCINumberRound(err, number, decplace, result);
+
+}
+
+
+
+sword SDO_OCINumberSin(OCIError *err, CONST OCINumber *number,
+
+                       OCINumber *result)
+
+{
+
+	return OCINumberSin(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcSin(OCIError *err, CONST OCINumber *number,
+
+                          OCINumber *result)
+
+{
+
+	return OCINumberArcSin(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberHypSin(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result)
+
+{
+
+	return OCINumberHypSin(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberCos(OCIError *err, CONST OCINumber *number, 
+
+                       OCINumber *result)
+
+{
+
+	return OCINumberCos(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcCos(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result)
+
+{
+
+	return OCINumberArcCos(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberHypCos(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result)
+
+{
+
+	return OCINumberHypCos(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberTan(OCIError *err, CONST OCINumber *number, 
+
+                       OCINumber *result)
+
+{
+
+	return OCINumberTan(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcTan(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result)
+
+{
+
+	return OCINumberArcTan(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberArcTan2(OCIError *err, CONST OCINumber *number1, 
+
+                           CONST OCINumber *number2, OCINumber *result)
+
+{
+
+	return OCINumberArcTan2(err, number1, number2, result);
+
+}
+
+
+
+sword SDO_OCINumberHypTan(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result)
+
+{
+
+	return OCINumberHypTan(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberExp(OCIError *err, CONST OCINumber *number, 
+
+                       OCINumber *result)
+
+{
+
+	return OCINumberExp(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberLn(OCIError *err, CONST OCINumber *number, 
+
+                      OCINumber *result)
+
+{
+
+	return OCINumberLn(err, number, result);
+
+}
+
+
+
+sword SDO_OCINumberLog(OCIError *err, CONST OCINumber *base, 
+
+                       CONST OCINumber *number, OCINumber *result)
+
+{
+
+	return OCINumberLog(err, base, number, result);
+
+}
+
+
+
+sword SDO_OCIDateAssign(OCIError *err, CONST OCIDate *from, OCIDate *to)
+
+{
+
+	return OCIDateAssign(err, from, to);
+
+}
+
+
+
+sword SDO_OCIDateToText(OCIError *err, CONST OCIDate *date, 
+
+                        CONST text *fmt, ub1 fmt_length, 
+
+                        CONST text *lang_name, ub4 lang_length, 
+
+                        ub4 *buf_size, text *buf)
+
+{
+
+	return OCIDateToText(err, date, fmt, fmt_length, lang_name, lang_length, 
+
+						 buf_size, buf);
+
+}
+
+
+
+sword SDO_OCIDateFromText(OCIError *err, CONST text *date_str, 
+
+						  ub4 d_str_length, CONST text *fmt, ub1 fmt_length, 
+
+						  CONST text *lang_name, ub4 lang_length, 
+
+						  OCIDate *date)
+
+{
+
+	return OCIDateFromText(err, date_str, d_str_length, fmt, fmt_length, 
+
+						   lang_name, lang_length, date);
+
+}
+
+
+
+sword SDO_OCIDateCompare(OCIError *err, CONST OCIDate *date1, 
+
+						 CONST OCIDate *date2, sword *result)
+
+{
+
+	return OCIDateCompare(err, date1, date2, result);
+
+}
+
+
+
+sword SDO_OCIDateAddMonths(OCIError *err, CONST OCIDate *date, sb4 num_months,
+
+                           OCIDate *result)
+
+{
+
+	return OCIDateAddMonths(err, date, num_months, result);
+
+}
+
+
+
+sword SDO_OCIDateAddDays(OCIError *err, CONST OCIDate *date, sb4 num_days,
+
+                         OCIDate *result)
+
+{
+
+	return OCIDateAddDays(err, date, num_days, result);
+
+}
+
+
+
+sword SDO_OCIDateLastDay(OCIError *err, CONST OCIDate *date, 
+
+                         OCIDate *last_day)
+
+{
+
+	return OCIDateLastDay(err, date, last_day);
+
+}
+
+
+
+sword SDO_OCIDateDaysBetween(OCIError *err, CONST OCIDate *date1, 
+
+                             CONST OCIDate *date2, sb4 *num_days)
+
+{
+
+	return OCIDateDaysBetween(err, date1, date2, num_days);
+
+}
+
+
+
+sword SDO_OCIDateZoneToZone(OCIError *err, CONST OCIDate *date1,
+
+                            CONST text *zon1, ub4 zon1_length, 
+
+							CONST text *zon2, ub4 zon2_length, OCIDate *date2)
+
+{
+
+	return OCIDateZoneToZone(err, date1, zon1, zon1_length, zon2, 
+
+							 zon2_length, date2);
+
+}
+
+
+
+sword SDO_OCIDateNextDay(OCIError *err, CONST OCIDate *date, CONST text *day_p, 
+
+                         ub4 day_length, OCIDate *next_day)
+
+{
+
+	return OCIDateNextDay(err, date, day_p, day_length, next_day);
+
+}
+
+
+
+
+
+sword SDO_OCIDateCheck(OCIError *err, CONST OCIDate *date, uword *valid)
+
+{
+
+	return OCIDateCheck(err, date, valid);
+
+}
+
+
+
+sword SDO_OCIDateSysDate(OCIError *err, OCIDate *sys_date)
+
+{
+
+	return OCIDateSysDate(err, sys_date);
+
+}
+
+
+
+sword SDO_OCIStringAssign(OCIEnv *env, OCIError *err, CONST OCIString *rhs, 
+
+                          OCIString **lhs)
+
+{
+
+	return OCIStringAssign(env, err, rhs, lhs);
+
+}
+
+
+
+sword SDO_OCIStringAssignText(OCIEnv *env, OCIError *err, CONST text *rhs, 
+
+                              ub4 rhs_len, OCIString **lhs)
+
+{
+
+	return OCIStringAssignText(env, err, rhs, rhs_len, lhs);
+
+}
+
+
+
+sword SDO_OCIStringResize(OCIEnv *env, OCIError *err, ub4 new_size, 
+
+                          OCIString **str)
+
+{
+
+	return OCIStringResize(env, err, new_size, str);
+
+}
+
+
+
+ub4 SDO_OCIStringSize(OCIEnv *env, CONST OCIString *vs)
+
+{
+
+	return OCIStringSize(env, vs);
+
+}
+
+
+
+text *SDO_OCIStringPtr(OCIEnv *env, CONST OCIString *vs)
+
+{
+
+	return OCIStringPtr(env, vs);
+
+}
+
+
+
+sword SDO_OCIStringAllocSize(OCIEnv *env, OCIError *err, CONST OCIString *vs, 
+
+                             ub4 *allocsize)
+
+{
+
+	return OCIStringAllocSize(env, err, vs, allocsize);
+
+}
+
+
+
+sword SDO_OCIRawAssignRaw(OCIEnv *env, OCIError *err, CONST OCIRaw *rhs, 
+
+                          OCIRaw **lhs)
+
+{
+
+	return OCIRawAssignRaw(env, err, rhs, lhs);
+
+}
+
+
+
+sword SDO_OCIRawAssignBytes(OCIEnv *env, OCIError *err, CONST ub1 *rhs, 
+
+                            ub4 rhs_len, OCIRaw **lhs)
+
+{
+
+	return OCIRawAssignBytes(env, err, rhs, rhs_len, lhs);
+
+}
+
+
+
+sword SDO_OCIRawResize(OCIEnv *env, OCIError *err, ub4 new_size, OCIRaw **raw)
+
+{
+
+	return OCIRawResize(env, err, new_size, raw);
+
+}
+
+
+
+ub4 SDO_OCIRawSize(OCIEnv *env, CONST OCIRaw *raw)
+
+{
+
+	return OCIRawSize(env, raw);
+
+}
+
+
+
+ub1 *SDO_OCIRawPtr(OCIEnv *env, CONST OCIRaw *raw)
+
+{
+
+	return OCIRawPtr(env, raw);
+
+}
+
+
+
+sword SDO_OCIRawAllocSize(OCIEnv *env, OCIError *err, CONST OCIRaw *raw,
+
+						  ub4 *allocsize)
+
+{
+
+	return OCIRawAllocSize(env, err, raw, allocsize);
+
+}
+
+
+
+void SDO_OCIRefClear(OCIEnv *env, OCIRef *ref)
+
+{
+
+	OCIRefClear(env, ref);
+
+}
+
+
+
+sword SDO_OCIRefAssign(OCIEnv *env, OCIError *err, CONST OCIRef *source, 
+
+                       OCIRef **target)
+
+{
+
+	return OCIRefAssign(env, err, source, target);
+
+}
+
+
+
+boolean SDO_OCIRefIsEqual(OCIEnv *env, CONST OCIRef *x, CONST OCIRef *y)
+
+{
+
+	return OCIRefIsEqual(env, x, y);
+
+}
+
+
+
+boolean SDO_OCIRefIsNull(OCIEnv *env, CONST OCIRef *ref)
+
+{
+
+	return OCIRefIsNull(env, ref);
+
+}
+
+
+
+ub4 SDO_OCIRefHexSize(OCIEnv *env, CONST OCIRef *ref)
+
+{
+
+	return OCIRefHexSize(env, ref);
+
+}
+
+
+
+sword SDO_OCIRefFromHex(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                        CONST text *hex, ub4 length, OCIRef **ref)
+
+{
+
+	return OCIRefFromHex(env, err, svc, hex, length, ref);
+
+}
+
+
+
+sword SDO_OCIRefToHex(OCIEnv *env, OCIError *err, CONST OCIRef *ref, 
+
+                      text *hex, ub4 *hex_length)
+
+{
+
+	return OCIRefToHex(env, err, ref, hex, hex_length);
+
+}
+
+
+
+sword SDO_OCICollSize(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+					  sb4 *size)
+
+{
+
+	return OCICollSize(env, err, coll, size);
+
+}
+
+
+
+sb4 SDO_OCICollMax(OCIEnv *env, CONST OCIColl *coll)
+
+{
+
+	return OCICollMax(env, coll);
+
+}
+
+
+
+sword SDO_OCICollGetElem(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+                         sb4 index, boolean *exists, dvoid **elem, 
+
+                         dvoid **elemind)
+
+{
+
+	return OCICollGetElem(env, err, coll, index, exists, elem, elemind);
+
+}
+
+
+
+sword SDO_OCICollAssignElem(OCIEnv *env, OCIError *err, sb4 index, 
+
+                            CONST dvoid *elem, 
+
+                            CONST dvoid *elemind, OCIColl *coll)
+
+{
+
+	return OCICollAssignElem(env, err, index, elem, elemind, coll);
+
+}
+
+
+
+sword SDO_OCICollAssign(OCIEnv *env, OCIError *err, CONST OCIColl *rhs, 
+
+                        OCIColl *lhs)
+
+{
+
+	return OCICollAssign(env, err, rhs, lhs);
+
+}
+
+
+
+sword SDO_OCICollAppend(OCIEnv *env, OCIError *err, CONST dvoid *elem, 
+
+                        CONST dvoid *elemind, OCIColl *coll)
+
+{
+
+	return OCICollAppend(env, err, elem, elemind, coll);
+
+}
+
+
+
+sword SDO_OCICollTrim(OCIEnv *env, OCIError *err, sb4 trim_num, 
+
+                      OCIColl *coll)
+
+{
+
+	return OCICollTrim(env, err, trim_num, coll);
+
+}
+
+
+
+sword SDO_OCIIterCreate(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+                        OCIIter **itr)
+
+{
+
+	return OCIIterCreate(env, err, coll, itr);
+
+}
+
+
+
+sword SDO_OCIIterDelete(OCIEnv *env, OCIError *err, OCIIter **itr)
+
+{
+
+	return OCIIterDelete(env, err, itr);
+
+}
+
+
+
+sword SDO_OCIIterInit(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+                      OCIIter *itr)
+
+{
+
+	return OCIIterInit(env, err, coll, itr);
+
+}
+
+
+
+sword SDO_OCIIterGetCurrent(OCIEnv *env, OCIError *err, CONST OCIIter *itr, 
+
+                            dvoid **elem, dvoid **elemind)
+
+{
+
+	return OCIIterGetCurrent(env, err, itr, elem, elemind);
+
+}
+
+
+
+sword SDO_OCIIterNext(OCIEnv *env, OCIError *err, OCIIter *itr, 
+
+                      dvoid **elem, dvoid **elemind, boolean *eoc)
+
+{
+
+	return OCIIterNext(env, err, itr, elem, elemind, eoc);
+
+}
+
+
+
+sword SDO_OCIIterPrev(OCIEnv *env, OCIError *err, OCIIter *itr, 
+
+                      dvoid **elem, dvoid **elemind, boolean *boc)
+
+{
+
+	return OCIIterPrev(env, err, itr, elem, elemind, boc);
+
+}
+
+
+
+sword SDO_OCITableSize(OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+
+					   sb4 *size)
+
+{
+
+	return OCITableSize(env, err, tbl, size);
+
+}
+
+
+
+sword SDO_OCITableExists(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+						 sb4 index, boolean *exists)
+
+{
+
+	return OCITableExists(env, err, tbl, index, exists);
+
+}
+
+
+
+sword SDO_OCITableDelete(OCIEnv *env, OCIError *err, sb4 index, OCITable *tbl)
+
+{
+
+	return OCITableDelete(env, err, index, tbl);
+
+}
+
+
+
+sword SDO_OCITableFirst(OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+
+                        sb4 *index)
+
+{
+
+	return OCITableFirst(env, err, tbl, index);
+
+}
+
+
+
+sword SDO_OCITableLast(OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+
+                       sb4 *index)
+
+{
+
+	return OCITableLast(env, err, tbl, index);
+
+}
+
+
+
+sword SDO_OCITableNext(OCIEnv *env, OCIError *err, sb4 index, 
+
+					   CONST OCITable *tbl, sb4 *next_index, boolean *exists)
+
+{
+
+	return OCITableNext(env, err, index, tbl, next_index, exists);
+
+}
+
+
+
+sword SDO_OCITablePrev(OCIEnv *env, OCIError *err, sb4 index, 
+
+                       CONST OCITable *tbl, sb4 *prev_index, boolean *exists)
+
+{
+
+	return OCITablePrev(env, err, index, tbl, prev_index, exists);
+
+}
+
+
+
+
+
+/********************************************************************************/
+
+/* Part IV -- OCI open type manager interfaces                                  */
+
+/********************************************************************************/
+
+sword SDO_OCITypeIterNew(OCIEnv *env, OCIError *err, OCIType *tdo, 
+
+                         OCITypeIter **iteratorOCI)
+
+{
+
+	return OCITypeIterNew(env, err, tdo, iteratorOCI);
+
+}
+
+
+
+sword SDO_OCITypeIterSet(OCIEnv *env, OCIError *err, OCIType *tdo, 
+
+						 OCITypeIter *iteratorOCI)
+
+{
+
+	return OCITypeIterSet(env, err, tdo, iteratorOCI);
+
+}
+
+
+
+sword SDO_OCITypeIterFree(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI)
+
+{
+
+	return OCITypeIterFree(env, err, iteratorOCI);
+
+}
+
+
+
+sword SDO_OCITypeByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                        CONST text *schema_name, ub4 s_length,
+
+                        CONST text *type_name, ub4 t_length,
+
+                        CONST text *version_name, ub4 v_length,
+
+                        OCIDuration pin_duration, OCITypeGetOpt get_option,
+
+                        OCIType **tdo)
+
+{
+
+	return OCITypeByName(env, err, svc, schema_name, s_length, type_name, 
+
+						 t_length, version_name, v_length, pin_duration, 
+
+						 get_option, tdo);
+
+}
+
+
+
+sword SDO_OCITypeArrayByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+                             ub4 array_len, CONST text *schema_name[], 
+
+							 ub4 s_length[], CONST text *type_name[], 
+
+							 ub4 t_length[], CONST text *version_name[], 
+
+							 ub4 v_length[], OCIDuration pin_duration,
+
+                             OCITypeGetOpt get_option, OCIType *tdo[])
+
+{
+
+	return OCITypeArrayByName(env, err, svc, array_len, schema_name, s_length, 
+
+							  type_name, t_length, version_name, v_length, 
+
+							  pin_duration, get_option, tdo);
+
+}
+
+
+
+sword SDO_OCITypeByRef(OCIEnv *env, OCIError *err, CONST OCIRef *type_ref, 
+
+					   OCIDuration pin_duration,OCITypeGetOpt get_option, 
+
+					   OCIType **tdo)
+
+{
+
+	return OCITypeByRef(env, err, type_ref, pin_duration, get_option, tdo);
+
+}
+
+
+
+sword SDO_OCITypeArrayByRef(OCIEnv *env, OCIError *err, ub4 array_len, 
+
+							CONST OCIRef *type_ref[], OCIDuration pin_duration,
+
+							OCITypeGetOpt get_option, OCIType *tdo[])
+
+{
+
+	return OCITypeArrayByRef(env, err, array_len, type_ref, pin_duration,
+
+							 get_option, tdo);
+
+}
+
+
+
+text* SDO_OCITypeName(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                      ub4 *n_length)
+
+{
+
+	return OCITypeName(env, err, tdo, n_length);
+
+}
+
+
+
+text* SDO_OCITypeSchema(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+						ub4 *n_length)
+
+{
+
+	return OCITypeSchema(env, err, tdo, n_length);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeTypeCode(OCIEnv *env, OCIError *err, CONST OCIType *tdo)
+
+{
+
+	return OCITypeTypeCode(env, err, tdo);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeCollTypeCode(OCIEnv *env, OCIError *err, 
+
+									CONST OCIType *tdo)
+
+{
+
+	return OCITypeCollTypeCode(env, err, tdo);
+
+}
+
+
+
+text* SDO_OCITypeVersion(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                         ub4 *v_length)
+
+{
+
+	return OCITypeVersion(env, err, tdo, v_length);
+
+}
+
+
+
+ub4 SDO_OCITypeAttrs(OCIEnv *env, OCIError *err, CONST OCIType *tdo)
+
+{
+
+	return OCITypeAttrs(env, err, tdo);
+
+}
+
+
+
+ub4 SDO_OCITypeMethods(OCIEnv *env, OCIError *err, CONST OCIType *tdo)
+
+{
+
+	return OCITypeMethods(env, err, tdo);
+
+}
+
+
+
+text* SDO_OCITypeElemName(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem, 
+
+                          ub4 *n_length)
+
+{
+
+	return OCITypeElemName(env, err, elem, n_length);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeElemTypeCode(OCIEnv *env, OCIError *err,
+
+                                    CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemTypeCode(env, err, elem);
+
+}
+
+
+
+sword SDO_OCITypeElemType(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem, 
+
+                          OCIType **elem_tdo)
+
+{
+
+	return OCITypeElemType(env, err, elem, elem_tdo);
+
+}
+
+
+
+ub4 SDO_OCITypeElemFlags(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemFlags(env, err, elem);
+
+}
+
+
+
+ub1 SDO_OCITypeElemNumPrec(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemNumPrec(env, err, elem);
+
+}
+
+
+
+sb1 SDO_OCITypeElemNumScale(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemNumScale(env, err, elem);
+
+}
+
+
+
+ub4 SDO_OCITypeElemLength(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemLength(env, err, elem);
+
+}
+
+
+
+ub2 SDO_OCITypeElemCharSetID(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemCharSetID(env, err, elem);
+
+}
+
+
+
+ub2 SDO_OCITypeElemCharSetForm(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemCharSetForm(env, err, elem);
+
+}
+
+
+
+sword SDO_OCITypeElemParameterizedType(OCIEnv *env, OCIError *err,
+
+                                       CONST OCITypeElem *elem, 
+
+									   OCIType **type_stored)
+
+{
+
+	return OCITypeElemParameterizedType(env, err, elem, type_stored);
+
+}
+
+
+
+OCITypeCode SDO_OCITypeElemExtTypeCode(OCIEnv *env, OCIError *err,
+
+                                       CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemExtTypeCode(env, err, elem);
+
+}
+
+
+
+sword SDO_OCITypeAttrByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                            CONST text *name, ub4 n_length, OCITypeElem **elem)
+
+{
+
+	return OCITypeAttrByName(env, err, tdo, name, n_length, elem);
+
+}
+
+
+
+sword SDO_OCITypeAttrNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+                          OCITypeElem **elem)
+
+{
+
+	return OCITypeAttrNext(env, err, iteratorOCI, elem);
+
+}
+
+
+
+sword SDO_OCITypeCollElem(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+                          OCITypeElem **element)
+
+{
+
+	return OCITypeCollElem(env, err, tdo, element);
+
+}
+
+
+
+sword SDO_OCITypeCollSize(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                          ub4 *num_elems)
+
+{
+
+	return OCITypeCollSize(env, err, tdo, num_elems);
+
+}
+
+
+
+sword SDO_OCITypeCollExtTypeCode(OCIEnv *env, OCIError *err,
+
+                                 CONST OCIType *tdo, OCITypeCode *sqt_code)
+
+{
+
+	return OCITypeCollExtTypeCode(env, err, tdo, sqt_code);
+
+}
+
+
+
+ub4 SDO_OCITypeMethodOverload(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                              CONST text *method_name, ub4 m_length)
+
+{
+
+	return OCITypeMethodOverload(env, err, tdo, method_name, m_length);
+
+}
+
+
+
+sword SDO_OCITypeMethodByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                              CONST text *method_name, ub4 m_length,
+
+                              OCITypeMethod **mdos)
+
+{
+
+	return OCITypeMethodByName(env, err, tdo, method_name, m_length, mdos);
+
+}
+
+
+
+sword SDO_OCITypeMethodNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+                            OCITypeMethod **mdo)
+
+{
+
+	return OCITypeMethodNext(env, err, iteratorOCI, mdo);
+
+}
+
+
+
+text *SDO_OCITypeMethodName(OCIEnv *env, OCIError *err,
+
+                            CONST OCITypeMethod *mdo, ub4 *n_length)
+
+{
+
+	return OCITypeMethodName(env, err, mdo, n_length);
+
+}
+
+
+
+OCITypeEncap SDO_OCITypeMethodEncap(OCIEnv *env, OCIError *err,
+
+                                    CONST OCITypeMethod *mdo)
+
+{
+
+	return OCITypeMethodEncap(env, err, mdo);
+
+}
+
+
+
+OCITypeMethodFlag SDO_OCITypeMethodFlags(OCIEnv *env, OCIError *err,
+
+                                         CONST OCITypeMethod *mdo)
+
+{
+
+	return OCITypeMethodFlags(env, err, mdo);
+
+}
+
+
+
+sword SDO_OCITypeMethodMap(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                           OCITypeMethod **mdo)
+
+{
+
+	return OCITypeMethodMap(env, err, tdo, mdo);
+
+}
+
+
+
+sword SDO_OCITypeMethodOrder(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                             OCITypeMethod **mdo)
+
+{
+
+	return OCITypeMethodOrder(env, err, tdo, mdo);
+
+}
+
+
+
+ub4 SDO_OCITypeMethodParams(OCIEnv *env, OCIError *err,
+
+                            CONST OCITypeMethod *mdo)
+
+{
+
+	return OCITypeMethodParams(env, err, mdo);
+
+}
+
+
+
+sword SDO_OCITypeResult(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+                        OCITypeElem **elem)
+
+{
+
+	return OCITypeResult(env, err, mdo, elem);
+
+}
+
+
+
+sword SDO_OCITypeParamByPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo, 
+
+							ub4 position, OCITypeElem **elem)
+
+{
+
+	return OCITypeParamByPos(env, err, mdo, position, elem);
+
+}
+
+
+
+sword SDO_OCITypeParamByName(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo, 
+
+                             CONST text *name, ub4 n_length, OCITypeElem **elem)
+
+{
+
+	return OCITypeParamByName(env, err, mdo, name, n_length, elem);
+
+}
+
+
+
+sword SDO_OCITypeParamPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo, 
+
+                          CONST text *name, ub4 n_length, ub4 *position, 
+
+                          OCITypeElem **elem)
+
+{
+
+	return OCITypeParamPos(env, err, mdo, name, n_length, position, elem);
+
+}
+
+
+
+OCITypeParamMode SDO_OCITypeElemParamMode(OCIEnv *env, OCIError *err,
+
+                                          CONST OCITypeElem *elem)
+
+{
+
+	return OCITypeElemParamMode(env, err, elem);
+
+}
+
+
+
+text* SDO_OCITypeElemDefaultValue(OCIEnv *env, OCIError *err,
+
+                                  CONST OCITypeElem *elem, ub4 *d_v_length)
+
+{
+
+	return OCITypeElemDefaultValue(env, err, elem, d_v_length);
+
+}
+
+
+
+sword SDO_OCITypeVTInit(OCIEnv *env, OCIError *err)
+
+{
+
+	return OCITypeVTInit(env, err);
+
+}
+
+ 
+
+sword SDO_OCITypeVTInsert(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+						  ub4 s_n_length, CONST text *type_name, ub4 t_n_length, 
+
+						  CONST text *user_version, ub4 u_v_length)
+
+{
+
+	return OCITypeVTInsert(env, err, schema_name, s_n_length, type_name, 
+
+						   t_n_length, user_version, u_v_length);
+
+}
+
+
+
+sword SDO_OCITypeVTSelect(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+						  ub4 s_n_length, CONST text *type_name, ub4 t_n_length, 
+
+						  text **user_version, ub4 *u_v_length, ub2 *version)
+
+{
+
+	return OCITypeVTSelect(env, err, schema_name, s_n_length, type_name, 
+
+						   t_n_length, user_version, u_v_length, version);
+
+}
+
+
+
+
+
diff --git a/src/terralib/drivers/OracleSpatial/sdo_oci.h b/src/terralib/drivers/OracleSpatial/sdo_oci.h
new file mode 100644
index 0000000..b030637
--- /dev/null
+++ b/src/terralib/drivers/OracleSpatial/sdo_oci.h
@@ -0,0 +1,1541 @@
+/* sdo_oci.c -- delegate OCI calls    ranwei  9/10/1998   */
+
+/* Copyright 1998, Oracle SDO                             */
+
+
+
+#ifndef SDO_OCI_H
+
+#define SDO_OCI_H
+
+
+
+/********************************************************************************/
+
+/* Part I -- OCI fundamental interfaces                                         */
+
+/********************************************************************************/
+
+//Creates and initializes an environment for OCI functions to work under.
+sword SDO_OCIEnvCreate(OCIEnv **envhpp, ub4 mode, dvoid *ctxp, 
+
+						dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+						dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+						void (*mfreefp)(dvoid *ctxp, dvoid *memptr),
+						
+						size_t xtramensz, dvoid **usrmempp); 
+
+
+
+sword SDO_OCIInitialize(ub4 mode, dvoid *ctxp, 
+
+						dvoid *(*malocfp)(dvoid *ctxp, size_t size),
+
+						dvoid *(*ralocfp)(dvoid *ctxp, dvoid *memptr, size_t newsize),
+
+						void (*mfreefp)(dvoid *ctxp, dvoid *memptr));
+
+
+
+sword SDO_OCIHandleAlloc(CONST dvoid *parenth, dvoid **hndlpp, ub4 type, 
+
+						 size_t xtramem_sz, dvoid **usrmempp);
+
+
+
+sword SDO_OCIHandleFree(dvoid *hndlp, ub4 type);
+
+
+
+sword SDO_OCIDescriptorAlloc(CONST dvoid *parenth, dvoid **descpp, ub4 type,
+
+							 size_t xtramem_sz, dvoid **usrmempp);
+
+
+
+sword SDO_OCIDescriptorFree(dvoid *descp, ub4 type);
+
+
+
+sword SDO_OCIEnvInit(OCIEnv **envp, ub4 mode, size_t xtramem_sz, 
+
+					 dvoid **usrmempp);
+
+
+
+sword SDO_OCIServerAttach(OCIServer *srvhp, OCIError *errhp,
+
+						  CONST text *dblink, sb4 dblink_len, ub4 mode);
+
+
+
+sword SDO_OCIServerDetach(OCIServer *srvhp, OCIError *errhp, ub4 mode);
+
+
+
+sword SDO_OCISessionBegin(OCISvcCtx *svchp, OCIError *errhp, 
+
+						  OCISession *usrhp, ub4 credt, ub4 mode);
+
+
+
+sword SDO_OCISessionEnd(OCISvcCtx *svchp, OCIError *errhp, 
+
+						OCISession *usrhp, ub4 mode);
+
+
+
+sword SDO_OCILogon(OCIEnv *envhp, OCIError *errhp, OCISvcCtx **svchp, 
+
+				   CONST text *username, ub4 uname_len, CONST text *password, 
+
+				   ub4 passwd_len, CONST text *dbname, ub4 dbname_len);
+
+
+
+sword SDO_OCILogoff(OCISvcCtx *svchp, OCIError *errhp);
+
+
+
+sword SDO_OCIPasswordChange(OCISvcCtx *svchp, OCIError *errhp, 
+
+							CONST text *user_name, ub4 usernm_len, 
+
+							CONST text *opasswd, ub4 opasswd_len, 
+
+							CONST text *npasswd, ub4 npasswd_len, ub4 mode);
+
+
+
+sword SDO_OCIStmtPrepare(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, CONST OraText *stmt,
+
+						 ub4 stmt_len, CONST OraText *key, ub4 keylen, ub4 language, ub4 mode);
+
+
+
+sword SDO_OCIBindByPos(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+					   ub4 position, dvoid *valuep, sb4 value_sz,
+
+					   ub2 dty, dvoid *indp, ub2 *alenp, ub2 *rcodep,
+
+					   ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+
+sword SDO_OCIBindByName(OCIStmt *stmtp, OCIBind **bindp, OCIError *errhp,
+
+						CONST text *placeholder, sb4 placeh_len, 
+
+						dvoid *valuep, sb4 value_sz, ub2 dty, 
+
+						dvoid *indp, ub2 *alenp, ub2 *rcodep, 
+
+						ub4 maxarr_len, ub4 *curelep, ub4 mode);
+
+
+
+sword SDO_OCIBindObject(OCIBind *bindp, OCIError *errhp, CONST OCIType *type, 
+
+						dvoid **pgvpp, ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+
+
+sword SDO_OCIBindDynamic(OCIBind *bindp, OCIError *errhp, dvoid *ictxp,
+
+						 OCICallbackInBind icbfp, dvoid *octxp,
+
+						 OCICallbackOutBind ocbfp);
+
+
+
+sword SDO_OCIBindArrayOfStruct(OCIBind *bindp, OCIError *errhp, 
+
+                               ub4 pvskip, ub4 indskip, ub4 alskip, ub4 rcskip);
+
+
+
+sword SDO_OCIStmtGetPieceInfo(OCIStmt *stmtp, OCIError *errhp, 
+
+                              dvoid **hndlpp, ub4 *typep, ub1 *in_outp, 
+
+							  ub4 *iterp, ub4 *idxp, ub1 *piecep);
+
+
+
+sword SDO_OCIStmtSetPieceInfo(dvoid *hndlp, ub4 type, OCIError *errhp, 
+
+                              CONST dvoid *bufp, ub4 *alenp, ub1 piece, 
+
+                              CONST dvoid *indp, ub2 *rcodep);
+
+
+
+sword SDO_OCIStmtExecute(OCISvcCtx *svchp, OCIStmt *stmtp, OCIError *errhp, 
+
+						 ub4 iters, ub4 rowoff, CONST OCISnapshot *snap_in, 
+
+						 OCISnapshot *snap_out, ub4 mode);
+
+
+
+sword SDO_OCIDefineByPos(OCIStmt *stmtp, OCIDefine **defnp, OCIError *errhp,
+
+						 ub4 position, dvoid *valuep, sb4 value_sz, ub2 dty,
+
+						 dvoid *indp, ub2 *rlenp, ub2 *rcodep, ub4 mode);
+
+
+
+sword SDO_OCIDefineObject(OCIDefine *defnp, OCIError *errhp, 
+
+                          CONST OCIType *type, dvoid **pgvpp, 
+
+                          ub4 *pvszsp, dvoid **indpp, ub4 *indszp);
+
+
+
+sword SDO_OCIDefineDynamic(OCIDefine *defnp, OCIError *errhp, dvoid *octxp,
+
+                           OCICallbackDefine ocbfp);
+
+
+
+sword SDO_OCIDefineArrayOfStruct(OCIDefine *defnp, OCIError *errhp, ub4 pvskip,
+
+                                 ub4 indskip, ub4 rlskip, ub4 rcskip);
+
+
+
+sword SDO_OCIStmtFetch(OCIStmt *stmtp, OCIError *errhp, ub4 nrows, 
+
+                       ub2 orientation, ub4 mode);
+
+
+
+sword SDO_OCIStmtGetBindInfo(OCIStmt *stmtp, OCIError *errhp, ub4 size, 
+
+                             ub4 startloc, sb4 *found, text *bvnp[], ub1 bvnl[],
+
+                             text *invp[], ub1 inpl[], ub1 dupl[], OCIBind *hndl[]);
+
+
+
+sword SDO_OCIDescribeAny(OCISvcCtx *svchp, OCIError *errhp, dvoid *objptr, 
+
+                         ub4 objnm_len, ub1 objptr_typ, ub1 info_level,
+
+						 ub1 objtyp, OCIDescribe *dschp);
+
+
+
+sword SDO_OCIParamGet(CONST dvoid *hndlp, ub4 htype, OCIError *errhp, 
+
+                      dvoid **parmdpp, ub4 pos);
+
+
+
+sword SDO_OCIParamSet(dvoid *hdlp, ub4 htyp, OCIError *errhp, CONST dvoid *dscp,
+
+                      ub4 dtyp, ub4 pos);
+
+
+
+sword SDO_OCITransStart(OCISvcCtx *svchp, OCIError *errhp, uword timeout, ub4 flags);
+
+
+
+sword SDO_OCITransDetach(OCISvcCtx *svchp, OCIError *errhp, ub4 flags );
+
+
+
+sword SDO_OCITransCommit(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCITransRollback(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCITransPrepare(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCITransForget(OCISvcCtx *svchp, OCIError *errhp, ub4 flags);
+
+
+
+sword SDO_OCIErrorGet(dvoid *hndlp, ub4 recordno, text *sqlstate,
+
+                      sb4 *errcodep, text *bufp, ub4 bufsiz, ub4 type);
+
+
+
+sword SDO_OCILobAppend(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+                       OCILobLocator *src_locp);
+
+
+
+sword SDO_OCILobAssign(OCIEnv *envhp, OCIError *errhp, CONST OCILobLocator *src_locp, 
+
+                       OCILobLocator **dst_locpp);
+
+
+
+sword SDO_OCILobCharSetForm(OCIEnv *envhp, OCIError *errhp, 
+
+							CONST OCILobLocator *locp, ub1 *csfrm);
+
+
+
+sword SDO_OCILobCharSetId(OCIEnv *envhp, OCIError *errhp, 
+
+						  CONST OCILobLocator *locp, ub2 *csid);
+
+
+
+sword SDO_OCILobCopy(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *dst_locp,
+
+                     OCILobLocator *src_locp, ub4 amount, ub4 dst_offset, 
+
+                     ub4 src_offset);
+
+
+
+sword SDO_OCILobDisableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+								 OCILobLocator *locp);
+
+
+
+sword SDO_OCILobEnableBuffering(OCISvcCtx *svchp, OCIError *errhp,
+
+								OCILobLocator *locp);
+
+
+
+sword SDO_OCILobErase(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                      ub4 *amount, ub4 offset);
+
+
+
+sword SDO_OCILobFileClose(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep);
+
+
+
+sword SDO_OCILobFileCloseAll(OCISvcCtx *svchp, OCIError *errhp);
+
+
+
+sword SDO_OCILobFileExists(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+						   boolean *flag);
+
+
+
+sword SDO_OCILobFileGetName(OCIEnv *envhp, OCIError *errhp, 
+
+							CONST OCILobLocator *filep, text *dir_alias, 
+
+							ub2 *d_length, text *filename, ub2 *f_length);
+
+
+
+sword SDO_OCILobFileIsOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+                           boolean *flag);
+
+
+
+sword SDO_OCILobFileOpen(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *filep,
+
+                         ub1 mode);
+
+
+
+sword SDO_OCILobFileSetName(OCIEnv *envhp, OCIError *errhp, OCILobLocator **filepp, 
+
+                            CONST text *dir_alias, ub2 d_length, 
+
+                            CONST text *filename, ub2 f_length);
+
+
+
+sword SDO_OCILobFlushBuffer(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                            ub4 flag);
+
+
+
+sword SDO_OCILobGetLength(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                          ub4 *lenp);
+
+
+
+sword SDO_OCILobIsEqual(OCIEnv *envhp, CONST OCILobLocator *x, 
+
+						CONST OCILobLocator *y, boolean *is_equal);
+
+
+
+sword SDO_OCILobLoadFromFile(OCISvcCtx *svchp, OCIError *errhp, 
+
+							 OCILobLocator *dst_locp, OCILobLocator *src_filep, 
+
+                             ub4 amount, ub4 dst_offset, ub4 src_offset);
+
+
+
+sword SDO_OCILobLocatorIsInit(OCIEnv *envhp, OCIError *errhp, 
+
+							  CONST OCILobLocator *locp, boolean *is_initialized);
+
+
+
+sword SDO_OCILobRead(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                     ub4 *amtp, ub4 offset, dvoid *bufp, ub4 bufl, 
+
+                     dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, CONST dvoid *bufp, 
+
+					 ub4 len, ub1 piece), ub2 csid, ub1 csfrm);
+
+
+
+sword SDO_OCILobTrim(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                     ub4 newlen);
+
+
+
+sword SDO_OCILobWrite(OCISvcCtx *svchp, OCIError *errhp, OCILobLocator *locp,
+
+                      ub4 *amtp, ub4 offset, dvoid *bufp, ub4 buflen, ub1 piece, 
+
+					  dvoid *ctxp, sb4 (*cbfp)(dvoid *ctxp, dvoid *bufp, ub4 *len, 
+
+					  ub1 *piece), ub2 csid, ub1 csfrm);
+
+
+
+sword SDO_OCIBreak(dvoid *hndlp, OCIError *errhp);
+
+
+
+sword SDO_OCIServerVersion(dvoid *hndlp, OCIError *errhp, text *bufp, ub4 bufsz,
+
+                           ub1 hndltype);
+
+
+
+sword SDO_OCIAttrGet(CONST dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep, 
+
+					 ub4 *sizep, ub4 attrtype, OCIError *errhp);
+
+
+
+sword SDO_OCIAttrSet(dvoid *trgthndlp, ub4 trghndltyp, dvoid *attributep,
+
+					 ub4 size, ub4 attrtype, OCIError *errhp);
+
+
+
+sword SDO_OCISvcCtxToLda(OCISvcCtx *svchp, OCIError *errhp, Lda_Def *ldap);
+
+
+
+sword SDO_OCILdaToSvcCtx(OCISvcCtx **svchpp, OCIError *errhp, Lda_Def *ldap);
+
+
+
+sword SDO_OCIResultSetToStmt(OCIResult *rsetdp, OCIError *errhp);
+
+
+
+
+
+/********************************************************************************/
+
+/* Part II -- OCI navigational interfaces                                       */
+
+/********************************************************************************/
+
+sword SDO_OCIObjectNew(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+					   OCITypeCode typecode, OCIType *tdo, dvoid *table, 
+
+					   OCIDuration duration, boolean value, dvoid **instance);
+
+
+
+sword SDO_OCIObjectPin(OCIEnv *env, OCIError *err, OCIRef *object_ref, 
+
+					   OCIComplexObject *corhdl, OCIPinOpt pin_option, 
+
+					   OCIDuration pin_duration, OCILockOpt lock_option, 
+
+					   dvoid **object);
+
+
+
+sword SDO_OCIObjectUnpin(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectPinCountReset(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectLock(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectMarkUpdate(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectUnmark(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectUnmarkByRef(OCIEnv *env, OCIError *err, OCIRef *ref);
+
+
+
+sword SDO_OCIObjectFree(OCIEnv *env, OCIError *err, dvoid *instance, 
+
+                        ub2 flags);
+
+
+
+sword SDO_OCIObjectMarkDeleteByRef(OCIEnv *env, OCIError *err, OCIRef *object_ref);
+
+
+
+sword SDO_OCIObjectMarkDelete(OCIEnv *env, OCIError *err, dvoid *instance);
+
+
+
+sword SDO_OCIObjectFlush(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectRefresh(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectCopy(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                        dvoid *source, dvoid *null_source, dvoid *target, 
+
+						dvoid *null_target, OCIType *tdo, OCIDuration duration, 
+
+						ub1 option);
+
+
+
+sword SDO_OCIObjectGetTypeRef(OCIEnv *env, OCIError *err, dvoid *instance, 
+
+                              OCIRef *type_ref);
+
+
+
+sword SDO_OCIObjectGetObjectRef(OCIEnv *env, OCIError *err, dvoid *object, 
+
+                                OCIRef *object_ref);
+
+
+
+sword SDO_OCIObjectGetInd(OCIEnv *env, OCIError *err, dvoid *instance, 
+
+                          dvoid **null_struct);
+
+
+
+sword SDO_OCIObjectExists(OCIEnv *env, OCIError *err, dvoid *ins, boolean *exist);
+
+
+
+sword SDO_OCIObjectGetProperty(OCIEnv *envh, OCIError *errh, CONST dvoid *obj, 
+
+							   OCIObjectPropId propertyId, dvoid *property, 
+
+							   ub4 *size);
+
+
+
+sword SDO_OCIObjectIsLocked(OCIEnv *env, OCIError *err, dvoid *ins, boolean *lock);
+
+
+
+sword SDO_OCIObjectIsDirty(OCIEnv *env, OCIError *err, dvoid *ins, boolean *dirty);
+
+
+
+sword SDO_OCIObjectPinTable(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+							CONST text *schema_name, ub4 s_n_length, 
+
+							CONST text *object_name, ub4 o_n_length, 
+
+							CONST OCIRef *scope_obj_ref, OCIDuration pin_duration, 
+
+							dvoid** object);
+
+
+
+sword SDO_OCIObjectArrayPin(OCIEnv *env, OCIError *err, OCIRef **ref_array, 
+
+							ub4 array_size, OCIComplexObject **cor_array,
+
+							ub4 cor_array_size, OCIPinOpt pin_option, 
+
+							OCIDuration pin_duration, OCILockOpt lock, 
+
+							dvoid **obj_array, ub4 *pos);
+
+
+
+sword SDO_OCICacheFlush(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+						dvoid *context, OCIRef *(*get)(dvoid *context, ub1 *last),
+
+						OCIRef **ref);
+
+
+
+sword SDO_OCICacheRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+						  OCIRefreshOpt option, dvoid *context,
+
+						  OCIRef *(*get)(dvoid *context), OCIRef **ref);
+
+
+
+sword SDO_OCICacheUnpin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc);
+
+
+
+sword SDO_OCICacheFree(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc); 
+
+
+
+sword SDO_OCICacheUnmark(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc);
+
+
+
+sword SDO_OCIDurationBegin(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                           OCIDuration parent, OCIDuration *dur);
+
+
+
+sword SDO_OCIDurationEnd(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                         OCIDuration duration);
+
+
+
+sword SDO_OCIDurationGetParent(OCIEnv *env, OCIError *err, 
+
+                               OCIDuration duration, OCIDuration *parent);
+
+
+
+sword SDO_OCIObjectAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectNotAlwaysLatest(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectFlushRefresh(OCIEnv *env, OCIError *err, dvoid *object);
+
+
+
+sword SDO_OCIObjectIsLoaded(OCIEnv *env, OCIError *err, dvoid *ins, 
+
+							boolean *load);
+
+
+
+sword SDO_OCIObjectIsDirtied(OCIEnv *env, OCIError *err, dvoid *ins,
+
+							 boolean *dirty);
+
+
+
+sword SDO_OCICacheGetObjects(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+							 OCIObjectProperty property, dvoid *client_context,
+
+							 void (*client_callback)(dvoid *client_context,
+
+							 dvoid *object));
+
+
+
+sword SDO_OCICacheRegister(OCIEnv *env, OCIError *err, OCIObjectEvent event,
+
+						   dvoid *client_context, void (*client_callback)(
+
+						   dvoid *client_context, OCIObjectEvent event,
+
+						   dvoid *object));
+
+
+
+sword SDO_OCICacheFlushRefresh(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+							   dvoid *context, OCIRef *(*get)(dvoid *context, 
+
+							   ub1 *last), OCIRef **ref);
+
+
+
+
+
+/********************************************************************************/
+
+/* Part III -- OCI primitive OTS interfaces                                     */
+
+/********************************************************************************/
+
+void SDO_OCINumberSetZero(OCIError *err, OCINumber *num);
+
+
+
+sword SDO_OCINumberAdd(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberSub(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberMul(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberDiv(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberMod(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberIntPower(OCIError *err, CONST OCINumber *base,
+
+                            CONST sword exp, OCINumber *result);
+
+
+
+sword SDO_OCINumberNeg(OCIError *err, CONST OCINumber *number,
+
+                       OCINumber *result);
+
+
+
+sword SDO_OCINumberToText(OCIError *err, CONST OCINumber *number, 
+
+                          CONST text *fmt, ub4 fmt_length,
+
+                          CONST text *nls_params, ub4 nls_p_length,
+
+                          ub4 *buf_size, text *buf);
+
+
+
+sword SDO_OCINumberFromText(OCIError *err, CONST text *str, ub4 str_length, 
+
+							CONST text *fmt, ub4 fmt_length, 
+
+							CONST text *nls_params, ub4 nls_p_length, 
+
+							OCINumber *number);
+
+
+
+sword SDO_OCINumberToInt(OCIError *err, CONST OCINumber *number,
+
+                         uword rsl_length, uword rsl_flag, dvoid *rsl);
+
+
+
+sword SDO_OCINumberFromInt(OCIError *err, CONST dvoid *inum, uword inum_length,
+
+						   uword inum_s_flag, OCINumber *number);
+
+
+
+sword SDO_OCINumberToReal(OCIError *err, CONST OCINumber *number,
+
+                          uword rsl_length, dvoid *rsl);
+
+
+
+sword SDO_OCINumberFromReal(OCIError *err, CONST dvoid *rnum,
+
+                            uword rnum_length, OCINumber *number);
+
+
+
+sword SDO_OCINumberCmp(OCIError *err, CONST OCINumber *number1, 
+
+                       CONST OCINumber *number2, sword *result);
+
+
+
+sword SDO_OCINumberSign(OCIError *err, CONST OCINumber *number,
+
+                        sword *result);
+
+
+
+sword SDO_OCINumberIsZero(OCIError *err, CONST OCINumber *number,
+
+                          boolean *result);
+
+
+
+sword SDO_OCINumberAssign(OCIError *err, CONST OCINumber *from,
+
+                          OCINumber *to);
+
+
+
+sword SDO_OCINumberAbs(OCIError *err, CONST OCINumber *number,
+
+                       OCINumber *result);
+
+
+
+sword SDO_OCINumberCeil(OCIError *err, CONST OCINumber *number,
+
+                        OCINumber *result);
+
+
+
+sword SDO_OCINumberFloor(OCIError *err, CONST OCINumber *number, 
+
+                         OCINumber *result);
+
+
+
+sword SDO_OCINumberSqrt(OCIError *err, CONST OCINumber *number, 
+
+                        OCINumber *result);
+
+
+
+sword SDO_OCINumberTrunc(OCIError *err, CONST OCINumber *number, 
+
+                         sword decplace, OCINumber *result);
+
+
+
+sword SDO_OCINumberPower(OCIError *err, CONST OCINumber *base, 
+
+                         CONST OCINumber *number, OCINumber *result);
+
+
+
+sword SDO_OCINumberRound(OCIError *err, CONST OCINumber *number,
+
+                         sword decplace, OCINumber *result);
+
+
+
+sword SDO_OCINumberSin(OCIError *err, CONST OCINumber *number,
+
+                       OCINumber *result);
+
+
+
+sword SDO_OCINumberArcSin(OCIError *err, CONST OCINumber *number,
+
+                          OCINumber *result);
+
+
+
+sword SDO_OCINumberHypSin(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result);
+
+
+
+sword SDO_OCINumberCos(OCIError *err, CONST OCINumber *number, 
+
+                       OCINumber *result);
+
+
+
+sword SDO_OCINumberArcCos(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result);
+
+
+
+sword SDO_OCINumberHypCos(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result);
+
+
+
+sword SDO_OCINumberTan(OCIError *err, CONST OCINumber *number, 
+
+                       OCINumber *result);
+
+
+
+sword SDO_OCINumberArcTan(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result);
+
+
+
+sword SDO_OCINumberArcTan2(OCIError *err, CONST OCINumber *number1, 
+
+                           CONST OCINumber *number2, OCINumber *result);
+
+
+
+sword SDO_OCINumberHypTan(OCIError *err, CONST OCINumber *number, 
+
+                          OCINumber *result);
+
+
+
+sword SDO_OCINumberExp(OCIError *err, CONST OCINumber *number, 
+
+                       OCINumber *result);
+
+
+
+sword SDO_OCINumberLn(OCIError *err, CONST OCINumber *number, 
+
+                      OCINumber *result);
+
+
+
+sword SDO_OCINumberLog(OCIError *err, CONST OCINumber *base, 
+
+                       CONST OCINumber *number, OCINumber *result);
+
+
+
+sword SDO_OCIDateAssign(OCIError *err, CONST OCIDate *from, OCIDate *to);
+
+
+
+sword SDO_OCIDateToText(OCIError *err, CONST OCIDate *date, 
+
+                        CONST text *fmt, ub1 fmt_length, 
+
+                        CONST text *lang_name, ub4 lang_length, 
+
+                        ub4 *buf_size, text *buf);
+
+
+
+sword SDO_OCIDateFromText(OCIError *err, CONST text *date_str, 
+
+						  ub4 d_str_length, CONST text *fmt, ub1 fmt_length, 
+
+						  CONST text *lang_name, ub4 lang_length, 
+
+						  OCIDate *date);
+
+
+
+sword SDO_OCIDateCompare(OCIError *err, CONST OCIDate *date1, 
+
+						 CONST OCIDate *date2, sword *result);
+
+
+
+sword SDO_OCIDateAddMonths(OCIError *err, CONST OCIDate *date, sb4 num_months,
+
+                           OCIDate *result);
+
+
+
+sword SDO_OCIDateAddDays(OCIError *err, CONST OCIDate *date, sb4 num_days,
+
+                         OCIDate *result);
+
+
+
+sword SDO_OCIDateLastDay(OCIError *err, CONST OCIDate *date, 
+
+                         OCIDate *last_day);
+
+
+
+sword SDO_OCIDateDaysBetween(OCIError *err, CONST OCIDate *date1, 
+
+                             CONST OCIDate *date2, sb4 *num_days);
+
+
+
+sword SDO_OCIDateZoneToZone(OCIError *err, CONST OCIDate *date1,
+
+                            CONST text *zon1, ub4 zon1_length, 
+
+							CONST text *zon2, ub4 zon2_length, OCIDate *date2);
+
+
+
+sword SDO_OCIDateNextDay(OCIError *err, CONST OCIDate *date, CONST text *day_p, 
+
+                         ub4 day_length, OCIDate *next_day);
+
+
+
+
+
+sword SDO_OCIDateCheck(OCIError *err, CONST OCIDate *date, uword *valid);
+
+
+
+sword SDO_OCIDateSysDate(OCIError *err, OCIDate *sys_date);
+
+
+
+sword SDO_OCIStringAssign(OCIEnv *env, OCIError *err, CONST OCIString *rhs, 
+
+                          OCIString **lhs);
+
+
+
+sword SDO_OCIStringAssignText(OCIEnv *env, OCIError *err, CONST text *rhs, 
+
+                              ub4 rhs_len, OCIString **lhs);
+
+
+
+sword SDO_OCIStringResize(OCIEnv *env, OCIError *err, ub4 new_size, 
+
+                          OCIString **str);
+
+
+
+ub4 SDO_OCIStringSize(OCIEnv *env, CONST OCIString *vs);
+
+
+
+text *SDO_OCIStringPtr(OCIEnv *env, CONST OCIString *vs);
+
+
+
+sword SDO_OCIStringAllocSize(OCIEnv *env, OCIError *err, CONST OCIString *vs, 
+
+                             ub4 *allocsize);
+
+
+
+sword SDO_OCIRawAssignRaw(OCIEnv *env, OCIError *err, CONST OCIRaw *rhs, 
+
+                          OCIRaw **lhs);
+
+
+
+sword SDO_OCIRawAssignBytes(OCIEnv *env, OCIError *err, CONST ub1 *rhs, 
+
+                            ub4 rhs_len, OCIRaw **lhs);
+
+
+
+sword SDO_OCIRawResize(OCIEnv *env, OCIError *err, ub4 new_size, OCIRaw **raw);
+
+
+
+ub4 SDO_OCIRawSize(OCIEnv *env, CONST OCIRaw *raw);
+
+
+
+ub1 *SDO_OCIRawPtr(OCIEnv *env, CONST OCIRaw *raw);
+
+
+
+sword SDO_OCIRawAllocSize(OCIEnv *env, OCIError *err, CONST OCIRaw *raw,
+
+						  ub4 *allocsize);
+
+
+
+void SDO_OCIRefClear(OCIEnv *env, OCIRef *ref);
+
+
+
+sword SDO_OCIRefAssign(OCIEnv *env, OCIError *err, CONST OCIRef *source, 
+
+                       OCIRef **target);
+
+
+
+boolean SDO_OCIRefIsEqual(OCIEnv *env, CONST OCIRef *x, CONST OCIRef *y);
+
+
+
+boolean SDO_OCIRefIsNull(OCIEnv *env, CONST OCIRef *ref);
+
+
+
+ub4 SDO_OCIRefHexSize(OCIEnv *env, CONST OCIRef *ref);
+
+
+
+sword SDO_OCIRefFromHex(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                        CONST text *hex, ub4 length, OCIRef **ref);
+
+
+
+sword SDO_OCIRefToHex(OCIEnv *env, OCIError *err, CONST OCIRef *ref, 
+
+                      text *hex, ub4 *hex_length);
+
+
+
+sword SDO_OCICollSize(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+					  sb4 *size);
+
+
+
+sb4 SDO_OCICollMax(OCIEnv *env, CONST OCIColl *coll);
+
+
+
+sword SDO_OCICollGetElem(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+                         sb4 index, boolean *exists, dvoid **elem, 
+
+                         dvoid **elemind);
+
+
+
+sword SDO_OCICollAssignElem(OCIEnv *env, OCIError *err, sb4 index, 
+
+                            CONST dvoid *elem, 
+
+                            CONST dvoid *elemind, OCIColl *coll);
+
+
+
+sword SDO_OCICollAssign(OCIEnv *env, OCIError *err, CONST OCIColl *rhs, 
+
+                        OCIColl *lhs);
+
+
+
+sword SDO_OCICollAppend(OCIEnv *env, OCIError *err, CONST dvoid *elem, 
+
+                        CONST dvoid *elemind, OCIColl *coll);
+
+
+
+sword SDO_OCICollTrim(OCIEnv *env, OCIError *err, sb4 trim_num, 
+
+                      OCIColl *coll);
+
+
+
+sword SDO_OCIIterCreate(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+                        OCIIter **itr);
+
+
+
+sword SDO_OCIIterDelete(OCIEnv *env, OCIError *err, OCIIter **itr);
+
+
+
+sword SDO_OCIIterInit(OCIEnv *env, OCIError *err, CONST OCIColl *coll, 
+
+                      OCIIter *itr);
+
+
+
+sword SDO_OCIIterGetCurrent(OCIEnv *env, OCIError *err, CONST OCIIter *itr, 
+
+                            dvoid **elem, dvoid **elemind);
+
+
+
+sword SDO_OCIIterNext(OCIEnv *env, OCIError *err, OCIIter *itr, 
+
+                      dvoid **elem, dvoid **elemind, boolean *eoc);
+
+
+
+sword SDO_OCIIterPrev(OCIEnv *env, OCIError *err, OCIIter *itr, 
+
+                      dvoid **elem, dvoid **elemind, boolean *boc);
+
+
+
+sword SDO_OCITableSize(OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+
+					   sb4 *size);
+
+
+
+sword SDO_OCITableExists(OCIEnv *env, OCIError *err, CONST OCITable *tbl,
+
+						 sb4 index, boolean *exists);
+
+
+
+sword SDO_OCITableDelete(OCIEnv *env, OCIError *err, sb4 index, OCITable *tbl);
+
+
+
+sword SDO_OCITableFirst(OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+
+                        sb4 *index);
+
+
+
+sword SDO_OCITableLast(OCIEnv *env, OCIError *err, CONST OCITable *tbl, 
+
+                       sb4 *index);
+
+
+
+sword SDO_OCITableNext(OCIEnv *env, OCIError *err, sb4 index, 
+
+					   CONST OCITable *tbl, sb4 *next_index, boolean *exists);
+
+
+
+sword SDO_OCITablePrev(OCIEnv *env, OCIError *err, sb4 index, 
+
+                       CONST OCITable *tbl, sb4 *prev_index, boolean *exists);
+
+
+
+
+
+/********************************************************************************/
+
+/* Part IV -- OCI open type manager interfaces                                  */
+
+/********************************************************************************/
+
+sword SDO_OCITypeIterNew(OCIEnv *env, OCIError *err, OCIType *tdo, 
+
+                         OCITypeIter **iteratorOCI);
+
+
+
+sword SDO_OCITypeIterSet(OCIEnv *env, OCIError *err, OCIType *tdo, 
+
+						 OCITypeIter *iteratorOCI);
+
+
+
+sword SDO_OCITypeIterFree(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI);
+
+
+
+sword SDO_OCITypeByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc, 
+
+                        CONST text *schema_name, ub4 s_length,
+
+                        CONST text *type_name, ub4 t_length,
+
+                        CONST text *version_name, ub4 v_length,
+
+                        OCIDuration pin_duration, OCITypeGetOpt get_option,
+
+                        OCIType **tdo);
+
+
+
+sword SDO_OCITypeArrayByName(OCIEnv *env, OCIError *err, CONST OCISvcCtx *svc,
+
+                             ub4 array_len, CONST text *schema_name[], 
+
+							 ub4 s_length[], CONST text *type_name[], 
+
+							 ub4 t_length[], CONST text *version_name[], 
+
+							 ub4 v_length[], OCIDuration pin_duration,
+
+                             OCITypeGetOpt get_option, OCIType *tdo[]);
+
+
+
+sword SDO_OCITypeByRef(OCIEnv *env, OCIError *err, CONST OCIRef *type_ref, 
+
+					   OCIDuration pin_duration,OCITypeGetOpt get_option, 
+
+					   OCIType **tdo);
+
+
+
+sword SDO_OCITypeArrayByRef(OCIEnv *env, OCIError *err, ub4 array_len, 
+
+							CONST OCIRef *type_ref[], OCIDuration pin_duration,
+
+							OCITypeGetOpt get_option, OCIType *tdo[]);
+
+
+
+text* SDO_OCITypeName(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                      ub4 *n_length);
+
+
+
+text* SDO_OCITypeSchema(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+						ub4 *n_length);
+
+
+
+OCITypeCode SDO_OCITypeTypeCode(OCIEnv *env, OCIError *err, CONST OCIType *tdo);
+
+
+
+OCITypeCode SDO_OCITypeCollTypeCode(OCIEnv *env, OCIError *err, 
+
+									CONST OCIType *tdo);
+
+
+
+text* SDO_OCITypeVersion(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                         ub4 *v_length);
+
+
+
+ub4 SDO_OCITypeAttrs(OCIEnv *env, OCIError *err, CONST OCIType *tdo);
+
+
+
+ub4 SDO_OCITypeMethods(OCIEnv *env, OCIError *err, CONST OCIType *tdo);
+
+
+
+text* SDO_OCITypeElemName(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem, 
+
+                          ub4 *n_length);
+
+
+
+OCITypeCode SDO_OCITypeElemTypeCode(OCIEnv *env, OCIError *err,
+
+                                    CONST OCITypeElem *elem);
+
+
+
+sword SDO_OCITypeElemType(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem, 
+
+                          OCIType **elem_tdo);
+
+
+
+ub4 SDO_OCITypeElemFlags(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub1 SDO_OCITypeElemNumPrec(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+sb1 SDO_OCITypeElemNumScale(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub4 SDO_OCITypeElemLength(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub2 SDO_OCITypeElemCharSetID(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+ub2 SDO_OCITypeElemCharSetForm(OCIEnv *env, OCIError *err, CONST OCITypeElem *elem);
+
+
+
+sword SDO_OCITypeElemParameterizedType(OCIEnv *env, OCIError *err,
+
+                                       CONST OCITypeElem *elem, 
+
+									   OCIType **type_stored);
+
+
+
+OCITypeCode SDO_OCITypeElemExtTypeCode(OCIEnv *env, OCIError *err,
+
+                                       CONST OCITypeElem *elem);
+
+
+
+sword SDO_OCITypeAttrByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                            CONST text *name, ub4 n_length, OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeAttrNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+                          OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeCollElem(OCIEnv *env, OCIError *err, CONST OCIType *tdo,
+
+                          OCITypeElem **element);
+
+
+
+sword SDO_OCITypeCollSize(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                          ub4 *num_elems);
+
+
+
+sword SDO_OCITypeCollExtTypeCode(OCIEnv *env, OCIError *err,
+
+                                 CONST OCIType *tdo, OCITypeCode *sqt_code);
+
+
+
+ub4 SDO_OCITypeMethodOverload(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                              CONST text *method_name, ub4 m_length);
+
+
+
+sword SDO_OCITypeMethodByName(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                              CONST text *method_name, ub4 m_length,
+
+                              OCITypeMethod **mdos);
+
+
+
+sword SDO_OCITypeMethodNext(OCIEnv *env, OCIError *err, OCITypeIter *iteratorOCI,
+
+                            OCITypeMethod **mdo);
+
+
+
+text *SDO_OCITypeMethodName(OCIEnv *env, OCIError *err,
+
+                            CONST OCITypeMethod *mdo, ub4 *n_length);
+
+
+
+OCITypeEncap SDO_OCITypeMethodEncap(OCIEnv *env, OCIError *err,
+
+                                    CONST OCITypeMethod *mdo);
+
+
+
+OCITypeMethodFlag SDO_OCITypeMethodFlags(OCIEnv *env, OCIError *err,
+
+                                         CONST OCITypeMethod *mdo);
+
+
+
+sword SDO_OCITypeMethodMap(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                           OCITypeMethod **mdo);
+
+
+
+sword SDO_OCITypeMethodOrder(OCIEnv *env, OCIError *err, CONST OCIType *tdo, 
+
+                             OCITypeMethod **mdo);
+
+
+
+ub4 SDO_OCITypeMethodParams(OCIEnv *env, OCIError *err,
+
+                            CONST OCITypeMethod *mdo);
+
+
+
+sword SDO_OCITypeResult(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo,
+
+                        OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeParamByPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo, 
+
+							ub4 position, OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeParamByName(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo, 
+
+                             CONST text *name, ub4 n_length, OCITypeElem **elem);
+
+
+
+sword SDO_OCITypeParamPos(OCIEnv *env, OCIError *err, CONST OCITypeMethod *mdo, 
+
+                          CONST text *name, ub4 n_length, ub4 *position, 
+
+                          OCITypeElem **elem);
+
+
+
+OCITypeParamMode SDO_OCITypeElemParamMode(OCIEnv *env, OCIError *err,
+
+                                          CONST OCITypeElem *elem);
+
+
+
+text* SDO_OCITypeElemDefaultValue(OCIEnv *env, OCIError *err,
+
+                                  CONST OCITypeElem *elem, ub4 *d_v_length);
+
+
+
+sword SDO_OCITypeVTInit(OCIEnv *env, OCIError *err);
+
+ 
+
+sword SDO_OCITypeVTInsert(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+						  ub4 s_n_length, CONST text *type_name, ub4 t_n_length, 
+
+						  CONST text *user_version, ub4 u_v_length);
+
+
+
+sword SDO_OCITypeVTSelect(OCIEnv *env, OCIError *err, CONST text *schema_name,
+
+						  ub4 s_n_length, CONST text *type_name, ub4 t_n_length, 
+
+						  text **user_version, ub4 *u_v_length, ub2 *version);
+
+
+#endif /* SDO_OCI_H */
+
+
diff --git a/src/terralib/drivers/PostgreSQL/TePGInterface.cpp b/src/terralib/drivers/PostgreSQL/TePGInterface.cpp
new file mode 100644
index 0000000..78ae72d
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGInterface.cpp
@@ -0,0 +1,1581 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ * TODO: 1. N�O PEGAR O DOBRO DE REGISTROS NA VOLTA (MOVE PREVIOUS) NO FUTURO!!!!
+ *
+ */
+
+#include "TePGInterface.h"
+#include "TePGUtils.h"
+#include <stdexcept>
+#include <string>
+
+
+
+#include "TeUtils.h"
+
+/*
+ *	Read/write mode flags for inversion (large object) calls
+ */
+
+#define INV_WRITE		0x00020000
+#define INV_READ		0x00040000
+
+/*
+ * Read buffer size
+ */
+#define BUFFSIZE        1024
+
+/*
+ * PostgreSQL Geometric Types
+ */
+typedef struct
+{
+	double		x, y;
+} BIN_PG_POINT;
+
+using namespace std;
+
+/*******************************
+ * FUN��ES AUXILIARES          *
+ *******************************/
+// This function is the same parse_hex function in PostGIS rc3 source code.
+inline unsigned char parse_hex(char *str)
+{
+	//do this a little brute force to make it faster
+
+	unsigned char		result_high = 0;
+	unsigned char		result_low = 0;
+
+	switch (str[0])
+	{
+		case '0' :
+			result_high = 0;
+			break;
+		case '1' :
+			result_high = 1;
+			break;
+		case '2' :
+			result_high = 2;
+			break;
+		case '3' :
+			result_high = 3;
+			break;
+		case '4' :
+			result_high = 4;
+			break;
+		case '5' :
+			result_high = 5;
+			break;
+		case '6' :
+			result_high = 6;
+			break;
+		case '7' :
+			result_high = 7;
+			break;
+		case '8' :
+			result_high = 8;
+			break;
+		case '9' :
+			result_high = 9;
+			break;
+		case 'A' :
+			result_high = 10;
+			break;
+		case 'B' :
+			result_high = 11;
+			break;
+		case 'C' :
+			result_high = 12;
+			break;
+		case 'D' :
+			result_high = 13;
+			break;
+		case 'E' :
+			result_high = 14;
+			break;
+		case 'F' :
+			result_high = 15;
+			break;
+	}
+	switch (str[1])
+	{
+		case '0' :
+			result_low = 0;
+			break;
+		case '1' :
+			result_low = 1;
+			break;
+		case '2' :
+			result_low = 2;
+			break;
+		case '3' :
+			result_low = 3;
+			break;
+		case '4' :
+			result_low = 4;
+			break;
+		case '5' :
+			result_low = 5;
+			break;
+		case '6' :
+			result_low = 6;
+			break;
+		case '7' :
+			result_low = 7;
+			break;
+		case '8' :
+			result_low = 8;
+			break;
+		case '9' :
+			result_low = 9;
+			break;
+		case 'A' :
+			result_low = 10;
+			break;
+		case 'B' :
+			result_low = 11;
+			break;
+		case 'C' :
+			result_low = 12;
+			break;
+		case 'D' :
+			result_low = 13;
+			break;
+		case 'E' :
+			result_low = 14;
+			break;
+		case 'F' :
+			result_low = 15;
+			break;
+	}
+	return (unsigned char) ((result_high<<4) + result_low);
+}
+
+
+/*******************************
+ * Definicao de TePGConnection *
+ *******************************/
+bool TePGConnection::open(const string& str_connection)
+{
+	close();
+
+	pg_connection_ = PQconnectdb(str_connection.c_str());
+
+	if(this->state())
+	{
+		int_connection_ = 1;
+		return true;
+	}
+	else
+		return false;
+}
+
+void TePGConnection::close(void)
+{
+ if(int_connection_)
+   {
+    if(pg_connection_)
+      {
+       PQfinish(pg_connection_);
+      }
+    pg_connection_ = 0;
+    int_connection_ = 0;
+   }
+ return;
+}
+
+
+int TePGConnection::exec_cmd(const string& str_qry)
+{
+ PGresult *result_temp;
+ int resp = -1;
+ result_temp = PQexec(pg_connection_, str_qry.c_str());
+
+    switch (PQresultStatus(result_temp))
+	{
+		case PGRES_EMPTY_QUERY: // The string sent to the backend was empty.
+				break;
+		case PGRES_COMMAND_OK: // Successful completion of a command returning no data
+			    resp = atoi(PQcmdTuples(result_temp));
+				last_oid_ = PQoidValue(result_temp);
+				break;
+		case PGRES_TUPLES_OK: // The query successfully executed
+				break;
+
+		case PGRES_COPY_OUT: // Copy Out (from server) data transfer started
+		case PGRES_COPY_IN: // Copy In (to server) data transfer started
+				break;
+
+		case PGRES_BAD_RESPONSE: // The server's response was not understood
+		case PGRES_NONFATAL_ERROR: // TODO: Is this one really an error?
+		case PGRES_FATAL_ERROR:
+			throw runtime_error("The server's response was not understood");
+
+		default:
+			throw logic_error("Internal lib TePGInterface error: ");
+	}
+
+ PQclear(result_temp);
+ result_temp = 0;
+ return resp;
+}
+
+Oid TePGConnection::insertBlob(char* buff, const int& blobSize)
+{
+	if(!buff)
+		return 0;
+
+	Oid obj_oid = lo_creat(pg_connection_, INV_READ | INV_WRITE);
+
+	int fd  = lo_open(pg_connection_, obj_oid, INV_READ);
+
+	if(fd < 0)
+		return 0;
+
+	int nbwrite = 0;
+
+	int size_tmp = blobSize;
+
+	while(size_tmp > 0)
+	{
+		if((size_tmp - BUFFSIZE) >= 0)
+			nbwrite = lo_write(pg_connection_, fd, buff, BUFFSIZE);				
+		else
+			nbwrite = lo_write(pg_connection_, fd, buff, size_tmp);
+
+		if(nbwrite <= 0)
+			return 0;
+
+		buff += nbwrite;
+		size_tmp -= nbwrite;
+	}
+
+	if(lo_close(pg_connection_, fd) == 0)
+		return obj_oid;
+
+	return 0;
+}
+
+int TePGConnection::getBlob(const Oid& blobId, char *&buff)
+{
+	int fd = lo_open(pg_connection_, blobId, INV_READ);
+
+	if(fd < 0)
+		return -1;
+
+	int len = lo_lseek(pg_connection_, fd, 0, SEEK_END);
+
+	lo_lseek(pg_connection_, fd, 0, SEEK_SET);
+
+	if(len <= 0)
+		return len;
+
+	if(!buff)
+		buff = new char[len];
+
+	char* buffAux = buff;
+
+	int nbread = 0;
+
+	while((nbread = lo_read(pg_connection_, fd, buffAux, BUFFSIZE)) > 0)
+		buffAux += nbread;
+
+	return len;
+}
+
+bool TePGConnection::beginTransaction(void)
+{
+	if(inTransaction_)
+		return true;
+
+	if(exec_cmd("BEGIN TRANSACTION") == 0)
+	{
+		inTransaction_ = true;
+
+		return true;
+	}
+
+	return false;
+}
+
+
+bool TePGConnection::commitTransaction(void)
+{
+	if(exec_cmd("COMMIT TRANSACTION") == 0)
+	{
+		inTransaction_ = false;
+
+		return true;
+	}
+
+	return false;
+}
+
+bool TePGConnection::rollBackTransaction(void)
+{
+	if(exec_cmd("ROLLBACK TRANSACTION") == 0)
+	{
+		inTransaction_ = false;
+
+		return true;
+	}
+
+	return false;
+}
+
+
+/******************************
+ * Definicao de TePGRecordset *
+ ******************************/
+const int TePGRecordset::int_bof_ = -1;
+int TePGRecordset::openRecordSets_ = 0;
+set<int> TePGRecordset::freeCursorNumbers_;
+//const int TePGRecordset::numRowsToRetrieve_ = 2000;
+
+TePGRecordset::TePGRecordset(const string& str_qry, TePGConnection* con_x,
+			                 const TeCursorType& cursorType,
+				             const TeCursorLocation& cursorLocation,
+				             const TeCursorDataType& cursorDataType,
+					         const int& numRowsToRetrieve)
+ : pg_recordset_(0), conn_(con_x), cursorDeclared_(false), int_index_current_(-1),
+   int_eof_(-1), cursorType_(cursorType), cursorLocation_(cursorLocation), 
+   cursorDataType_(cursorDataType), numRowsToRetrieve_(numRowsToRetrieve)
+{
+	// endianness test
+	if(((unsigned int) 1) == htonl((unsigned int) 1))
+		isLittleEndian_ = false;	
+	else
+		isLittleEndian_ = true;
+
+	if(freeCursorNumbers_.empty())
+	{	// Se n�o houver cursores livres aberto => criar novo id
+		++openRecordSets_;
+		recordSetId_ = openRecordSets_;
+	}
+	else
+	{
+		set<int>::iterator it = freeCursorNumbers_.begin();
+		recordSetId_ = *it;
+		freeCursorNumbers_.erase(it);
+	}
+
+	if(!str_qry.empty() && conn_)
+		open(str_qry, conn_, cursorType_, cursorLocation_, cursorDataType_);
+}
+
+TePGRecordset::~TePGRecordset()
+{	
+	// Deixa o id livre
+	freeCursorNumbers_.insert(recordSetId_);
+
+	close();
+}
+
+void TePGRecordset::close(void)
+{
+	if(cursorDeclared_ && conn_)
+	{
+		string sqlCloseCursor  = "CLOSE CURSOR_";
+	           sqlCloseCursor += Te2String(recordSetId_);
+
+		conn_->exec_cmd(sqlCloseCursor.c_str());
+	}	
+
+	freeRecordSet();
+
+	cursorDeclared_ = false;
+
+	conn_ = 0;
+
+	return;
+}
+
+bool TePGRecordset::moveFirst(void)
+{
+	if(!cursorDeclared_)
+		return false;
+
+	if(cursorLocation_ == TeCLIENTESIDE)
+	{
+		if(recordCount() > 0)
+		{
+			int_index_current_ = 0;
+			return true;
+		}
+		else
+			return false;
+	}
+
+	firstFetch = false;
+	lastFetch = false;
+
+	string moveFirstSQL  = "MOVE ABSOLUTE 0 IN CURSOR_";
+		   moveFirstSQL += Te2String(recordSetId_);
+
+	int res = conn_->exec_cmd(moveFirstSQL.c_str());
+
+	if(res == 0)
+	{
+		freeRecordSet();
+
+		string fetchSQL  = "FETCH FORWARD " + Te2String(numRowsToRetrieve_);
+	           fetchSQL += " FROM CURSOR_";
+		       fetchSQL += Te2String(recordSetId_);
+
+		pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+		if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+		{
+			if(recordCount() > 0)
+			{
+				int_eof_ = recordCount();
+				int_index_current_ = 0;
+				return true;
+			}
+		}
+		
+		freeRecordSet();
+		return false;
+	}
+ 
+	return false;
+}
+
+bool TePGRecordset::movePrevious(void)
+{	
+	//if(!cursorDeclared_ || (cursorType_ == TeUNIDIRECTIONAL))
+	if(!cursorDeclared_)
+		return false;
+
+	if(cursorLocation_ == TeCLIENTESIDE)
+	{
+		if(bof())
+			return false;
+		else
+		{
+			--int_index_current_;
+			return true;
+		}
+	}
+
+	if(recordCount() > 0)
+	{
+		string move = "";
+		string fetchSQL = "";
+
+		if(!movingBackward_)
+		{
+			 if(bof())
+				 return false;
+		
+			--int_index_current_;
+
+			if(bof())
+			{
+				movingBackward_ = true;
+
+				int val = recordCount() - 1;
+
+				if(lastFetch)
+				{
+					++val;
+				}
+
+				move = " MOVE BACKWARD "+Te2String(val)+" FROM CURSOR_"+Te2String(recordSetId_)+";";
+
+				fetchSQL = move;
+				fetchSQL += " FETCH BACKWARD ";
+				fetchSQL += Te2String(numRowsToRetrieve_);
+				fetchSQL += " FROM CURSOR_";
+				fetchSQL += Te2String(recordSetId_);
+			}
+			else
+			{
+				return true;
+			}
+		}
+		else
+		{
+			if(eof())
+				 return false;
+		
+			++int_index_current_;
+
+			if(eof())
+			{	
+				fetchSQL  = "FETCH BACKWARD ";
+				fetchSQL += Te2String(numRowsToRetrieve_);
+				fetchSQL += " FROM CURSOR_";
+				fetchSQL += Te2String(recordSetId_);
+			}
+			else
+			{
+				return true;
+			}
+		}
+		pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+		if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+		{			
+			firstFetch = false;
+			lastFetch = false;
+			
+			if(this->recordCount() > 0)
+			{
+				int_eof_ = recordCount();
+				int_index_current_ = 0;
+
+				if(this->recordCount() > 0 != numRowsToRetrieve_)
+				{
+					firstFetch = true;
+				}
+
+
+				return true;
+			}
+			
+		}
+
+		freeRecordSet();
+ 	}
+
+	return false;
+}
+
+bool TePGRecordset::moveNext(void)
+{
+	if(!cursorDeclared_)
+		return false;
+
+	if(cursorLocation_ == TeCLIENTESIDE)
+	{
+		if(eof())
+			return false;
+
+		++int_index_current_;
+
+		return true;
+	}
+
+	if((recordCount() > 0))
+	{
+		string move = "";
+		string fetchSQL = "";
+
+		if(!movingBackward_)
+		{	
+			if(!eof())
+			{
+				++int_index_current_;
+
+				if(eof())
+				{
+					fetchSQL  = "FETCH FORWARD ";
+					fetchSQL += Te2String(numRowsToRetrieve_);
+					fetchSQL += " FROM CURSOR_";
+					fetchSQL += Te2String(recordSetId_);
+				}
+				else
+				{
+					return true;
+				}
+			}
+		}
+		else
+		{
+			if(!bof())
+			{
+				--int_index_current_;
+
+				if(bof())
+				{
+					movingBackward_ = false;	
+					int val = recordCount() -1;
+					if(firstFetch)
+					{
+						++val;
+					}
+					move = " MOVE FORWARD "+Te2String(val)+" FROM CURSOR_"+Te2String(recordSetId_)+";";
+
+					fetchSQL = move;
+
+					fetchSQL += "FETCH FORWARD ";
+					fetchSQL += Te2String(numRowsToRetrieve_);
+					fetchSQL += " FROM CURSOR_";
+					fetchSQL += Te2String(recordSetId_);
+				}
+				else
+				{
+					return true;
+				}
+			}
+		}
+		freeRecordSet();
+
+		pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+		if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+		{
+			firstFetch = false;
+			lastFetch = false;
+
+			if(recordCount() > 0)
+			{
+				int_eof_ = recordCount();
+				int_index_current_ = 0;
+
+				if(this->recordCount() > 0 != numRowsToRetrieve_)
+				{
+					lastFetch = true;
+				}
+				
+				return true;
+			}
+		}
+		
+		freeRecordSet();
+	}
+
+	return false;
+}
+
+bool TePGRecordset::moveLast(void)
+{
+	//if(!cursorDeclared_ || (cursorType_ == TeUNIDIRECTIONAL))
+	if(!cursorDeclared_)
+		return false;
+
+	if(cursorLocation_ == TeCLIENTESIDE)
+	{
+		if(recordCount() > 0)
+		{
+			int_index_current_ = recordCount() - 1;
+			return true;
+		}
+		
+		return false;
+	}
+
+	firstFetch = false;
+	lastFetch = false;
+
+	freeRecordSet();
+
+	string fetchSQL  = "FETCH LAST FROM CURSOR_";
+		   fetchSQL += Te2String(recordSetId_);
+
+	pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+	if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+	{
+		if(this->recordCount() > 0)
+		{
+			int_eof_ = recordCount();
+			int_index_current_ = 0;
+			return true;
+		}		
+	}
+	
+	freeRecordSet();
+ 
+	return false;
+	
+}
+
+bool TePGRecordset::moveTo(const int& lin_number)
+{
+	//if(!cursorDeclared_ || (cursorType_ == TeUNIDIRECTIONAL))
+	if(!cursorDeclared_)
+		return false;
+
+	if(cursorLocation_ == TeCLIENTESIDE)
+	{
+		if((lin_number > int_bof_) && (lin_number < int_eof_))
+		{
+			int_index_current_ = lin_number;
+			return true;
+		}
+		
+		return false;		
+	}
+
+	firstFetch = false;
+	lastFetch = false;
+
+	freeRecordSet();
+
+	string fetchSQL  = "FETCH ABSOLUTE ";
+		   fetchSQL += Te2String(lin_number);
+	       fetchSQL += " FROM CURSOR_";
+		   fetchSQL += Te2String(recordSetId_);
+
+	pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+	if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+	{
+		if(this->recordCount() > 0)
+		{
+			int_eof_ = recordCount();
+			int_index_current_ = 0;
+			return true;
+		}
+	}
+
+	freeRecordSet();
+ 
+	return false;	
+}
+
+bool TePGRecordset::open(const string& str_qry, TePGConnection* con_x,
+			      const TeCursorType& cursorType,
+				  const TeCursorLocation& cursorLocation,
+				  const TeCursorDataType& cursorDataType,
+				  const int& numRowsToRetrieve)
+{
+	close();
+
+	if(str_qry.empty() || !con_x)
+		return false;
+
+	cursorType_ = cursorType;
+	cursorLocation_ = cursorLocation;
+	cursorDataType_ = cursorDataType;
+	numRowsToRetrieve_ = numRowsToRetrieve;
+	cursorDeclared_ = false;
+	conn_ = con_x;
+	movingBackward_ = false;
+	lastFetch = false;
+	firstFetch = false;
+
+	string sqlCursor  = "DECLARE CURSOR_";
+		   sqlCursor += Te2String(recordSetId_);
+		   sqlCursor += (cursorDataType_  == TeBINARYCURSOR) ? " BINARY " : " ";
+		   //sqlCursor += (cursorType_ == TeUNIDIRECTIONAL) ? " NO " : " ";
+		   sqlCursor += "SCROLL CURSOR WITH HOLD FOR ";
+		   sqlCursor += str_qry;	
+
+	pg_recordset_ = conn_->exec(sqlCursor.c_str());
+
+	if(PQresultStatus(pg_recordset_) == PGRES_COMMAND_OK)
+	{
+		cursorDeclared_ = true;
+
+		string numRows = (cursorLocation_ == TeSERVERSIDE) ? Te2String(numRowsToRetrieve_) : string("ALL");
+		
+		string fetchSQL  = "FETCH FORWARD " + numRows;
+	           fetchSQL += " FROM CURSOR_";
+		       fetchSQL += Te2String(recordSetId_);
+
+		pg_recordset_ = conn_->exec(fetchSQL.c_str());
+
+		if(PQresultStatus(pg_recordset_) == PGRES_TUPLES_OK)
+		{
+			if(recordCount() > 0)
+			{
+				int_eof_ = recordCount();
+				int_index_current_ = 0;				
+			}
+
+			return true;
+		}
+	}
+	
+	freeRecordSet();
+
+	return false;
+}
+
+int TePGRecordset::getBytea(const int& field_num, char*& buff) const
+{
+	if(cursorDataType_ == TeTEXTCURSOR)
+	{
+		size_t newLen;
+
+		unsigned char* ptData = PQunescapeBytea((unsigned char*)(value(field_num)), &newLen);
+
+		if(newLen <= 0)
+			return newLen;
+		
+		if(!buff)
+			buff = new char[newLen];
+
+		memcpy(buff, ptData, newLen);
+
+		TePGConnection::freeMem(ptData);
+
+		return newLen;
+	}
+	else	// TeBINARYCURSOR
+	{
+		char* ptData = value(field_num);
+
+		unsigned int numBytes;
+		memcpy(&numBytes, ptData, sizeof(int));
+		numBytes = ntohl(numBytes);
+
+		if(!buff)
+			buff = new char[numBytes];
+
+		memcpy(buff, ptData + sizeof(int), numBytes);
+
+		return numBytes;
+	}
+}
+
+void TePGRecordset::getPGLine2D(const int& field_num, TeLine2D& l) const
+{
+	char* polygon = value(field_num);
+
+	if(cursorDataType_ == TeBINARYCURSOR)
+	{
+		unsigned int numPts;
+		memcpy(&numPts, polygon, sizeof(int));
+		numPts = ntohl(numPts);
+
+		l.reserve(numPts);
+
+		// POINT ARRAY IS SUPPOSED ALWAYS IN BIG ENDIAN
+		BIN_PG_POINT* pts = (BIN_PG_POINT*)(polygon + sizeof(int));		
+
+		// endianness test
+		if(isLittleEndian_)
+		{
+			union
+			{
+				double dWord_;
+				unsigned int aux_[2];
+			} swapx1, swapy1, swapx2, swapy2;
+
+			// little-endian
+			for(unsigned int i = 0; i < numPts ; ++i)
+			{
+				swapx1.dWord_ = pts[i].x;
+				swapy1.dWord_ = pts[i].y;
+
+				swapx2.aux_[1] = ntohl(swapx1.aux_[0]);
+				swapx2.aux_[0] = ntohl(swapx1.aux_[1]);
+
+				swapy2.aux_[1] = ntohl(swapy1.aux_[0]);
+				swapy2.aux_[0] = ntohl(swapy1.aux_[1]);
+
+				l.add(TeCoord2D(swapx2.dWord_, swapy2.dWord_));
+			}
+			
+		}
+		else
+		{
+			// big-endian!
+			for(unsigned int i = 0; i < numPts ; ++i)
+				l.add(TeCoord2D(pts[i].x, pts[i].y));
+			
+		}
+	}
+	else	//TeTEXTCURSOR
+		l = PgGeomPolygon2Te(polygon);
+}
+
+char* TePGRecordset::getWKBHeader(char* v, unsigned char &byteOrder, unsigned int &wkbType, unsigned int &numGeometries) const
+{
+	const int byteOrderPlusGeomType = sizeof(unsigned char) + sizeof(unsigned int);	
+
+	if(cursorDataType_ == TeTEXTCURSOR)
+	{
+		unsigned char header [byteOrderPlusGeomType];
+
+		for (int t = 0; t < byteOrderPlusGeomType; ++t)
+		{
+			header[t] =(unsigned char) parse_hex(v) ;
+			v += 2;
+		}
+
+		memcpy(&byteOrder, header, sizeof(unsigned char));		
+		memcpy(&wkbType, header + sizeof(unsigned char), sizeof(unsigned int));
+	}
+	else
+	{
+		memcpy(&byteOrder, v, sizeof(unsigned char));		
+		memcpy(&wkbType, v + sizeof(unsigned char), sizeof(unsigned int));
+
+		v += byteOrderPlusGeomType;
+	}	
+	
+
+	// 0 = Big Endian (wkbXDR) e 1 = Little Endian (wkbNDR)
+	if((byteOrder == 0) && isLittleEndian_)
+	{
+		wkbType = ntohl(wkbType);
+	}
+	else if((byteOrder == 1) && !isLittleEndian_)
+	{
+			wkbType = htonl(wkbType);
+	}	
+
+	numGeometries = 0;
+
+	if(wkbType > 1 && wkbType <= 7)
+	{
+		if(cursorDataType_ == TeTEXTCURSOR)
+		{
+			unsigned char qtd[sizeof(unsigned int)];
+
+			for(unsigned int t = 0; t < sizeof(unsigned int); ++t)
+			{
+				qtd[t] = (unsigned char)parse_hex(v);
+				v += 2;
+			}
+
+			memcpy(&numGeometries, qtd, sizeof(unsigned int));
+		}
+		else
+		{
+			memcpy(&numGeometries, v, sizeof(unsigned int));
+			v += sizeof(unsigned int);
+		}
+
+		// 0 = Big Endian (wkbXDR) e 1 = Little Endian (wkbNDR)
+		if((byteOrder == 0) && isLittleEndian_)
+		{
+			numGeometries = ntohl(numGeometries);	
+		}
+		else if((byteOrder == 1) && !isLittleEndian_)
+		{
+			numGeometries = htonl(numGeometries);
+		}
+	}
+
+	return v;	
+}
+
+char* TePGRecordset::getWKBPoint(char* v, TeCoord2D& c) const
+{
+	unsigned char byteOrder;
+	unsigned int wkbType;
+	unsigned int numGeometries;
+
+	v = getWKBHeader(v, byteOrder, wkbType, numGeometries);
+	
+	if(wkbType != 1)
+		throw logic_error("Binary data doesn't supported!");
+		
+
+	union
+	{
+		double dWord_;
+		unsigned int aux_[2];
+	} swapx1, swapy1;
+
+	if(cursorDataType_ == TeTEXTCURSOR)
+	{
+
+		const int double2Size = 2 * sizeof(double);
+		unsigned char data[double2Size];
+		
+		for(int t = 0; t < double2Size; ++t) // len/2
+		{
+			data[t] = (unsigned char)parse_hex(v);
+			v += 2;
+		}
+		
+
+		memcpy(&swapx1.dWord_, data , sizeof(double));
+		memcpy(&swapy1.dWord_, data + sizeof(double), sizeof(double));
+	}
+	else
+	{
+		memcpy(&swapx1.dWord_, v , sizeof(double));
+		memcpy(&swapy1.dWord_, v + sizeof(double), sizeof(double));
+
+		v += (sizeof(double) + sizeof(double)); // x + y
+	}
+
+	// 0 = Big Endian (wkbXDR)
+	if((byteOrder == 0) && isLittleEndian_)
+	{
+		union
+		{
+			double dWord_;
+			unsigned int aux_[2];
+		} swapx2, swapy2;
+
+		swapx2.aux_[1] = ntohl(swapx1.aux_[0]);
+		swapx2.aux_[0] = ntohl(swapx1.aux_[1]);
+
+		swapy2.aux_[1] = ntohl(swapy1.aux_[0]);
+		swapy2.aux_[0] = ntohl(swapy1.aux_[1]);	
+		
+		c.x(swapx2.dWord_);
+		c.y(swapy2.dWord_);
+
+		return v;
+	}
+	else if((byteOrder == 1) && !isLittleEndian_)
+	{
+		union
+		{
+			double dWord_;
+			unsigned int aux_[2];
+		} swapx2, swapy2;
+
+		swapx2.aux_[1] = htonl(swapx1.aux_[0]);
+		swapx2.aux_[0] = htonl(swapx1.aux_[1]);
+
+		swapy2.aux_[1] = htonl(swapy1.aux_[0]);
+		swapy2.aux_[0] = htonl(swapy1.aux_[1]);
+		
+		c.x(swapx2.dWord_);
+		c.y(swapy2.dWord_);
+
+		return v;
+
+	}
+
+	c.x(swapx1.dWord_);
+	c.y(swapy1.dWord_);
+
+	return v;
+}
+
+char* TePGRecordset::getWKBLinearRing(char* v, int byteOrder, TeLine2D &line) const
+{
+	unsigned int numPoints;
+	
+	const int size2Double = sizeof(double) + sizeof(double); // x + y
+
+	if(cursorDataType_ == TeTEXTCURSOR)
+	{
+		unsigned char data[size2Double];
+
+		for(unsigned int n = 0; n < sizeof(unsigned int); ++n)
+		{
+			data[n] = (unsigned char)parse_hex(v);
+			v += 2;
+		}
+
+		memcpy(&numPoints, data , sizeof(unsigned int));
+	}
+	else
+	{
+		memcpy(&numPoints, v , sizeof(unsigned int));
+		v += sizeof(unsigned int);
+	}
+
+	// 0 = Big Endian (wkbXDR) e 1 = Little Endian (wkbNDR)
+	if((byteOrder == 0) && isLittleEndian_)
+	{
+		numPoints = ntohl(numPoints);	
+	}
+	else if((byteOrder == 1) && !isLittleEndian_)
+	{
+		numPoints = htonl(numPoints);
+	}
+
+	for(unsigned int i = 0; i < numPoints; ++i)
+	{
+		union
+		{
+			double dWord_;
+			unsigned int aux_[2];
+		} swapx1, swapy1;
+
+		if(cursorDataType_ == TeTEXTCURSOR)
+		{
+			unsigned char data[size2Double];
+
+			for(int t = 0; t < size2Double; ++t) // len/2
+			{
+				data[t] = (unsigned char)parse_hex(v);
+				v += 2;
+			}	
+
+			memcpy(&swapx1.dWord_, data , sizeof(double));
+			memcpy(&swapy1.dWord_, data + sizeof(double), sizeof(double));
+		}
+		else
+		{
+			memcpy(&swapx1.dWord_, v , sizeof(double));
+			memcpy(&swapy1.dWord_, v + sizeof(double), sizeof(double));
+			v += size2Double;
+		}
+
+		// 0 = Big Endian (wkbXDR)
+		if((byteOrder == 0) && isLittleEndian_)
+		{
+			union
+			{
+				double dWord_;
+				unsigned int aux_[2];
+			} swapx2, swapy2;
+
+			swapx2.aux_[1] = ntohl(swapx1.aux_[0]);
+			swapx2.aux_[0] = ntohl(swapx1.aux_[1]);
+
+			swapy2.aux_[1] = ntohl(swapy1.aux_[0]);
+			swapy2.aux_[0] = ntohl(swapy1.aux_[1]);	
+			
+			line.add(TeCoord2D(swapx2.dWord_, swapy2.dWord_));			
+		}
+		else if((byteOrder == 1) && !isLittleEndian_)	//1 = Little Endian (wkbNDR)
+		{
+			union
+			{
+				double dWord_;
+				unsigned int aux_[2];
+			} swapx2, swapy2;
+
+			swapx2.aux_[1] = htonl(swapx1.aux_[0]);
+			swapx2.aux_[0] = htonl(swapx1.aux_[1]);
+
+			swapy2.aux_[1] = htonl(swapy1.aux_[0]);
+			swapy2.aux_[0] = htonl(swapy1.aux_[1]);
+			
+			line.add(TeCoord2D(swapx2.dWord_, swapy2.dWord_));
+		}
+		else
+		{
+			line.add(TeCoord2D(swapx1.dWord_, swapy1.dWord_));
+		}
+	}
+
+	return v;
+
+}
+
+char* TePGRecordset::getWKBLine(char* v, TeLine2D& l) const
+{
+	unsigned char byteOrder;
+	unsigned int wkbType;
+	unsigned int numPoints;
+
+	v = getWKBHeader(v, byteOrder, wkbType, numPoints);
+	
+	if(wkbType != 2)
+		throw logic_error("Binary data doesn't supported!");
+
+	if(cursorDataType_ == TeTEXTCURSOR)
+	{
+		// Volta duas vezes o n�mero de bytes do n�mero de geometrias lidos ao chamar getWKBHeader
+		v = getWKBLinearRing(v - (sizeof(unsigned int) + sizeof(unsigned int)), byteOrder, l);
+	}
+	else
+	{
+		// Volta o n�mero de bytes do n�mero de geometrias lidos ao chamar getWKBHeader
+		v = getWKBLinearRing(v - sizeof(unsigned int), byteOrder, l);
+	}
+
+	return v;
+
+}
+
+char* TePGRecordset::getWKBPolygon(char* v, TePolygon& p) const
+{
+	unsigned char byteOrder;
+	unsigned int wkbType;
+	unsigned int numRings;
+
+	v = getWKBHeader(v, byteOrder, wkbType, numRings);
+	
+	if(wkbType != 3)
+		throw logic_error("Binary data doesn't supported!");
+
+	for(unsigned int i = 0; i < numRings; ++i)
+	{
+		TeLine2D line;
+		v = getWKBLinearRing(v, byteOrder, line);
+		p.add(line);
+	}
+
+	return v;
+
+}
+
+char* TePGRecordset::getWKBMultiPoint(char* v, TePointSet &ps) const
+{
+	unsigned char byteOrder; 
+	unsigned int wkbType; 
+	unsigned int num_wkbPoints; 
+
+	v = getWKBHeader(v, byteOrder, wkbType, num_wkbPoints);
+
+	if(wkbType != 4)
+		throw logic_error("Binary data doesn't supported!");
+
+	for(unsigned int i = 0; i < num_wkbPoints; ++i)
+	{
+		TeCoord2D coord;
+		v = getWKBPoint(v, coord);
+		ps.add(coord);
+	}
+
+	return v;
+}
+
+char* TePGRecordset::getWKBMultiLine(char* v, TeLineSet &ls) const
+{
+	unsigned char byteOrder; 
+	unsigned int wkbType; 
+	unsigned int num_wkbLineStrings; 
+
+	v = getWKBHeader(v, byteOrder, wkbType, num_wkbLineStrings);
+
+	if(wkbType != 5)
+		throw logic_error("Binary data doesn't supported!");
+
+	for(unsigned int i = 0; i < num_wkbLineStrings; ++i)
+	{
+		TeLine2D line;
+		v = getWKBLine(v, line);
+		ls.add(line);
+	}
+
+	return v;
+}
+
+char* TePGRecordset::getWKBMultiPolygon(char* v, TePolygonSet &ps) const
+{
+	unsigned char byteOrder;
+	unsigned int wkbType;
+	unsigned int num_wkbPolygons;
+
+	v = getWKBHeader(v, byteOrder, wkbType, num_wkbPolygons);
+
+	if(wkbType != 6)
+		throw logic_error("Binary data doesn't supported!");
+
+	for(unsigned int i = 0; i < num_wkbPolygons; ++i)
+	{
+		TePolygon poly;
+		v = getWKBPolygon(v, poly);
+		ps.add(poly);
+	}
+
+	return v;
+}
+
+void TePGRecordset::getWKBGeomColl(char* v, TeMultiGeometry &mg) const
+{
+	unsigned char byteOrder; 
+	unsigned int wkbType; 
+	unsigned int num_wkbGeometries;
+
+	v = getWKBHeader(v, byteOrder, wkbType, num_wkbGeometries);
+
+	if(wkbType != 7)
+		throw logic_error("Binary data doesn't supported!");
+
+	for(unsigned int i = 0; i < num_wkbGeometries; ++i)
+	{
+		unsigned int geomType;
+		unsigned char geomByteOrder;
+		unsigned int num_geometries;
+
+		getWKBHeader(v, geomByteOrder, geomType, num_geometries);
+
+		if(geomType == 1)
+		{
+			TeCoord2D coord;
+
+			v = getWKBPoint(v, coord);
+
+			mg.addGeometry(coord);
+		}
+		else if(geomType == 2)
+		{
+			TeLine2D line;
+
+			v = getWKBLine(v, line);
+
+			mg.addGeometry(line);
+		}
+		else if(geomType == 3)
+		{
+			TePolygon poly;
+
+			v = getWKBPolygon(v, poly);
+
+			mg.addGeometry(poly);
+		}
+		else if(geomType == 4)
+		{
+			TePointSet pointSet;
+
+			v = getWKBMultiPoint(v, pointSet);
+
+			for(unsigned int a = 0; a < pointSet.size(); ++a)
+			{
+				TePoint point = pointSet[a];
+				mg.addGeometry(point);
+			}
+		}
+		else if(geomType == 5)
+		{
+			TeLineSet lineSet;
+
+			v = getWKBMultiLine(v, lineSet);
+
+			for(unsigned int a = 0; a < lineSet.size(); ++a)
+			{
+				TeLine2D coord = lineSet[a];
+
+				mg.addGeometry(coord);
+			}
+		}
+		else if(geomType == 6)
+		{
+			TePolygonSet polygonSet;
+			
+			v = getWKBMultiPolygon(v, polygonSet);
+			
+			for(unsigned int a = 0; a < polygonSet.size(); ++a)
+			{
+				TePolygon poly = polygonSet[a];
+
+				mg.addGeometry(poly);
+			}
+		}
+		else
+		{
+			throw logic_error("The data couldn't be decoded as a valid WKB geometry!");
+		}
+	}
+
+}
+
+
+void TePGRecordset::getPGISPoint(const int& field_num, TePoint& p) const
+{
+	TeCoord2D c;
+	getWKBPoint(value(field_num), c);
+	p.add(c);
+}
+
+
+void TePGRecordset::getPGISLine(const int& field_num, TeLine2D& l) const
+{
+	getWKBLine(value(field_num), l);		
+}
+
+
+void TePGRecordset::getPGISPolygon(const int& field_num, TePolygon& p) const
+{
+	getWKBPolygon(value(field_num), p);		
+}
+
+
+void TePGRecordset::getPGISMultiPoint(const int& field_num, TePointSet& ps) const
+{
+	getWKBMultiPoint(value(field_num), ps);		
+}
+
+
+void TePGRecordset::getPGISMultiLine(const int& field_num, TeLineSet& ls) const
+{
+	getWKBMultiLine(value(field_num), ls);		
+}
+
+
+void TePGRecordset::getPGISMultiPolygon(const int& field_num, TePolygonSet& ps) const
+{
+	getWKBMultiPolygon(value(field_num), ps);	
+}
+
+
+void TePGRecordset::getPGISGeomColl(const int& field_num, TeMultiGeometry& m) const
+{
+	getWKBGeomColl(value(field_num), m);
+}
+
+
+
+char* TePGRecordset::getData(const int& field_num)
+{
+	data_ = "";
+
+	if(cursorDataType_ == TeTEXTCURSOR)
+		return value(field_num);
+	else
+	{
+		// chamar o conversor de tipo de dado de bin�rio p/ string p/ cada tipo!
+		switch(fieldType(field_num))
+		{
+			case PG_BOOL_TYPE			:
+			case PG_BYTEA_TYPE			:
+			case PG_CHAR_TYPE			:
+			case PG_INT8_TYPE			:
+			case PG_INT2_TYPE			: break;
+
+			case PG_INT4_TYPE			: data_ = Te2String(getInt(field_num));
+										  break;
+
+			case PG_TEXT_TYPE			:
+			case PG_OID_TYPE			:
+			case PG_POINT_TYPE			:
+			case PG_LSEG_TYPE			:
+			case PG_PATH_TYPE			:
+			case PG_BOX_TYPE			:
+			case PG_POLYGON_TYPE		:
+			case PG_LINE_TYPE			:
+			case PG_PG_FLOAT4_TYPE		: break;
+
+			case PG_FLOAT8_TYPE			: data_ = Te2String(getDouble(field_num));
+										  break;
+
+			case PG_CIRCLE_TYPE			:
+			case PG_MONEY_TYPE			:
+			case PG_BPCHAR_TYPE			:
+			case PG_VARCHAR_TYPE		:
+			case PG_DATE_TYPE			:
+			case PG_TIME_TYPE			:
+			case PG_TIMESTAMP_TYPE		:
+			case PG_TIMESTAMPTZ_TYPE	:
+			case PG_INTERVAL_TYPE		:
+			case PG_TIMETZ_TYPE			:
+			case PG_BIT_TYPE			:
+			case PG_VARBIT_TYPE			:
+			case PG_NUMERIC_TYPE		:
+			default						: break;
+		}
+		
+		return (char*)data_.c_str();
+	}
+}
+
+int TePGRecordset::fieldSize(const int& field_num)
+{
+ Oid field_t = this->fieldType(field_num);
+ Oid field_m = PQfmod(pg_recordset_, field_num);
+ PGresult *result_temp;
+ char str_int[5];   //integer part if DECIMAL(p,s) or NUMERIC(p,s)
+ //int size = -1;
+ int size = 0;
+ char str_field_t[50];
+ char str_field_m[50];
+ sprintf(str_field_t,"%d", field_t);
+ sprintf(str_field_m,"%d", field_m);
+ string str_qry = "SELECT format_type(";
+        str_qry += str_field_t;
+        str_qry += ",";
+        str_qry += str_field_m;
+        str_qry += ")";
+ switch(field_t)
+       {
+        case 1043:   //VARCHAR(s) or CHARACTER VARYING(s)
+        case 1700:   //NUMERIC(p,s) or DECIMAL(p,s)
+                     result_temp = PQexec(conn_->c_ptr(), str_qry.c_str());
+                     if(PQresultStatus(result_temp) == PGRES_TUPLES_OK)
+                       {
+                        char *lin = PQgetvalue(result_temp, 0, 0);  //Don't free lin because the return of PQgetvalue is in the struct PGResult
+                        int i = 0;
+                        while(*lin != '\0' && *lin != ',')
+                             {
+                              if(*lin >= '0' && *lin <= '9' && i < 4)
+                                {
+                                 str_int[i] = *lin;
+                                 i++;
+                                }
+                              lin++;
+                             }
+                        str_int[i]='\0';
+                        size = atoi(str_int);
+                       }
+                     PQclear(result_temp);
+                     break;
+        default:     //The size of fixed size or for other variable size -1
+                     return PQfsize(pg_recordset_, field_num);
+       }
+ result_temp = 0;
+ return size;
+}
+
+int TePGRecordset::fieldSizeFractionaryPart(const int& field_num)
+{
+ Oid field_t = this->fieldType(field_num);
+ Oid field_m = PQfmod(pg_recordset_, field_num);
+ PGresult *result_temp;
+ char str_frac[5];   //fractionary part if DECIMAL(p,s) or NUMERIC(p,s)
+ //int size = -1;
+ int size = 0;
+ char str_field_t[50];
+ char str_field_m[50];
+ sprintf(str_field_t,"%d", field_t);
+ sprintf(str_field_m,"%d", field_m);
+ string str_qry = "SELECT format_type(";
+        str_qry += str_field_t;
+        str_qry += ",";
+        str_qry += str_field_m;
+        str_qry += ")";
+ switch(field_t)
+       {
+        case 1700:   //NUMERIC(p,s) or DECIMAL(p,s)
+                     result_temp = PQexec(conn_->c_ptr(), str_qry.c_str());
+                     if(PQresultStatus(result_temp) == PGRES_TUPLES_OK)
+                       {
+                        char *lin = PQgetvalue(result_temp, 0, 0);  //Don't free lin because the return of PQgetvalue is in the struct PGResult
+                        int i = 0;
+                        while(*lin != '\0' && *lin != ',')
+                             {
+                              lin++;
+                             }
+                        if(*lin == ',')
+                          {
+                           lin++;
+                          }
+                        while(*lin != '\0')
+                             {
+                              if(*lin >= '0' && *lin <= '9' && i < 4)
+                                {
+                                 str_frac[i] = *lin;
+                                 i++;
+                                }
+                              lin++;
+                             }
+                        str_frac[i]='\0';
+                        size = atoi(str_frac);
+                       }
+                     PQclear(result_temp);
+                     break;
+        default:     //Others doesn't have a fractionary part
+                     break;
+
+       }
+ result_temp = 0;
+ return size;
+}
+
+void TePGRecordset::freeRecordSet()
+{
+	if(pg_recordset_)
+		PQclear(pg_recordset_);
+
+
+	pg_recordset_ = 0;
+	int_index_current_ = -1;
+	int_eof_ = -1;
+	return;
+}
+
+
+
+
+
diff --git a/src/terralib/drivers/PostgreSQL/TePGInterface.h b/src/terralib/drivers/PostgreSQL/TePGInterface.h
new file mode 100644
index 0000000..48e2a10
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGInterface.h
@@ -0,0 +1,429 @@
+//**************************************************************************
+//      Copyright � 2002 Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+//		Image Processing Division (DPI)
+//		National Institute of Spatial Research (INPE) - S�o Jos� dos Campos - Brazil
+//
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TePGInterface.h
+    This file contains a database recordset and connection class to PostgreSQL.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+  */
+
+/**
+  *@description Este arquivo cont�m classes para navegar em resultados de consultas
+  *             e para estabelecimento de conex�o com o banco de dados.
+  */
+#ifndef  __TERRALIB_INTERNAL_PGINTERFACE_H
+#define  __TERRALIB_INTERNAL_PGINTERFACE_H
+ 
+/**
+  * TODO: 1. O caminhamento para tr�s est� na ordem errada.
+  *       2. Terminar a fun��o getData
+  *
+  */
+//extern "C"
+//{
+#include "libpq-fe.h"
+//}
+
+#ifdef WIN32
+#include <winsock.h>
+#else
+#include <netinet/in.h>
+#endif
+
+
+#include <stdlib.h>
+#include <string>
+
+#include "TeDatabase.h"
+#include "TeMultiGeometry.h"
+
+using namespace std;
+
+/***************************************************************************
+ * Constantes num�ricas dos tipos de dados do PostgreSQL                   * 
+ ***************************************************************************/
+const Oid PG_BOOL_TYPE = 16;
+const Oid PG_BYTEA_TYPE = 17;
+const Oid PG_CHAR_TYPE = 18;
+const Oid PG_INT8_TYPE = 20;
+const Oid PG_INT2_TYPE = 21;
+const Oid PG_INT4_TYPE = 23;
+const Oid PG_TEXT_TYPE = 25;
+const Oid PG_OID_TYPE = 26;
+const Oid PG_POINT_TYPE = 600;
+const Oid PG_LSEG_TYPE = 601;
+const Oid PG_PATH_TYPE = 602;
+const Oid PG_BOX_TYPE = 603;
+const Oid PG_POLYGON_TYPE = 604;
+const Oid PG_LINE_TYPE = 628;
+const Oid PG_PG_FLOAT4_TYPE = 700;
+const Oid PG_FLOAT8_TYPE = 701;
+const Oid PG_CIRCLE_TYPE = 718;
+const Oid PG_MONEY_TYPE = 790;
+const Oid PG_BPCHAR_TYPE = 1042;
+const Oid PG_VARCHAR_TYPE = 1043;
+const Oid PG_DATE_TYPE = 1082;
+const Oid PG_TIME_TYPE = 1083;
+const Oid PG_TIMESTAMP_TYPE = 1114;
+const Oid PG_TIMESTAMPTZ_TYPE = 1184;
+const Oid PG_INTERVAL_TYPE = 1186;
+const Oid PG_TIMETZ_TYPE = 1266;
+const Oid PG_BIT_TYPE = 1560;
+const Oid PG_VARBIT_TYPE = 1562;
+const Oid PG_NUMERIC_TYPE = 1700;			
+
+
+
+/***************************************************************************
+ * Classe respons�vel pela abertura e fechamento de uma conex�o com o      *
+ * banco de dados. Al�m de abrir e fechar uma conex�o, permite que uma     *
+ * consulta seja executada, retornando um conjunto de registros, ou que um *
+ * comando - insert, update, delete - seja executado diretamente,          *
+ * retornando o n�mero de registros afetados pelo comando.                 *
+ ***************************************************************************/
+class TePGConnection
+{
+    protected:
+
+        PGconn *pg_connection_;	// A pointer to a connection
+        int int_connection_;	// A flag that indicates the state of a connection
+        Oid last_oid_;			// Always stores the last OID resulted of a command
+		bool inTransaction_;
+
+    public:
+
+        // Constructor / Destructor
+        TePGConnection(const string& str_connection = "")
+			: pg_connection_(0), int_connection_(0), last_oid_(0), inTransaction_(false)
+		{
+			if(!str_connection.empty())
+				open(str_connection);
+		}
+
+        virtual ~TePGConnection() { close(); }
+
+		// Basic database methods
+        bool open(const string& str_connection);
+
+        bool state(void) const { return (PQstatus(pg_connection_) == CONNECTION_OK); }
+        void close(void);
+        const char* dbname(void) const { return PQdb(pg_connection_); }
+        const char* err_msg(void) const { return PQerrorMessage(pg_connection_); }
+        PGresult* exec(const string& str_qry) { return PQexec(pg_connection_, str_qry.c_str()); }
+        int exec_cmd(const string& str_qry);
+        Oid getOID(void) const { return last_oid_; }
+		PGconn* c_ptr(void) { return pg_connection_; }
+
+		// Utilities functions - You must destroy the return string
+		static char* escapeString(const char* from, const size_t& fromLen, size_t& newLen)
+		{
+			char *sql = new char[2 * fromLen + 1];	
+
+			newLen = PQescapeString(sql, from, fromLen);
+
+			return sql;
+		}
+
+		static void freeMem(void* ptr) 	{ PQfreemem(ptr); }
+
+		static unsigned char* escapeBytea(const unsigned char *from, size_t from_length, size_t* to_length) { return PQescapeBytea(from, from_length, to_length); }
+		
+		Oid insertBlob(char* buff, const int& blobSize);	// Returns 0 on error
+		int getBlob(const Oid& blobId, char *&buff);		// return -1 on error otherwise returns bytes read
+		bool removeBlob(const Oid& blobId) { return lo_unlink(pg_connection_, blobId) == 1; }
+
+		bool beginTransaction(void);
+		bool commitTransaction(void);
+		bool rollBackTransaction(void);
+
+	protected:
+
+        // don't support copying of TePGConnection objects,
+        // so make copy constructor and assignment op private.
+        TePGConnection(const TePGConnection& c);
+        TePGConnection& operator=(const TePGConnection& c);
+};
+
+/***************************************************************************
+ * Classe resposns�vel pela manipula��o de dados resultantes de uma        *
+ * consulta.                                                               *
+ ***************************************************************************/
+class TePGRecordset
+{
+	protected:
+
+		static const int int_bof_;
+		static int openRecordSets_;
+		static set<int> freeCursorNumbers_;
+		
+        PGresult *pg_recordset_;
+		TePGConnection* conn_;
+		bool cursorDeclared_;
+        int int_index_current_;
+        int int_eof_;
+		TeCursorType cursorType_;
+		TeCursorLocation cursorLocation_;
+		TeCursorDataType cursorDataType_;
+		int numRowsToRetrieve_;
+
+		int recordSetId_;
+		bool isLittleEndian_;
+
+		string data_;
+
+		bool movingBackward_;	// M�rio
+		bool lastFetch;			// M�rio
+		bool firstFetch;		// M�rio
+		
+
+    public:
+
+        // Constructor / Destructor
+        TePGRecordset(const string& str_qry = string(""), TePGConnection* con_x = 0,
+			          const TeCursorType& cursorType = TeUNIDIRECTIONAL,
+				      const TeCursorLocation& cursorLocation = TeSERVERSIDE,
+				      const TeCursorDataType& cursorDataType = TeTEXTCURSOR,
+					  const int& numRowsToRetrieve = 2000);
+        virtual ~TePGRecordset();
+
+        // Basic database methods
+		void close(void);
+
+        int recordCount(void) const
+		{
+			if(pg_recordset_)
+				return PQntuples(pg_recordset_);
+			
+			return 0;
+		}
+
+		int getFieldCount(void) const	{ return PQnfields(pg_recordset_); }
+
+		bool state(void) const
+		{
+			if(pg_recordset_) 
+				return true;
+			else
+				return false;
+		}
+
+		bool eof(void) const { return int_index_current_ == int_eof_; }
+        bool bof(void) const { return int_index_current_ == int_bof_; }
+
+		bool moveFirst(void);
+        bool movePrevious(void);	
+        bool moveNext(void);		
+        bool moveLast(void);		
+        bool moveTo(const int& lin_number);	// first index == 0
+		
+		int index(void) const
+		{
+			if(!(this->bof() || this->eof()))
+				return int_index_current_;
+			
+			return -1;
+		}
+
+	    bool open(const string& str_qry, TePGConnection* con_x,
+			      const TeCursorType& cursorType = TeUNIDIRECTIONAL,
+				  const TeCursorLocation& cursorLocation = TeSERVERSIDE,
+				  const TeCursorDataType& cursorDataType = TeTEXTCURSOR,
+				  const int& numRowsToRetrieve = 2000);      
+
+		
+
+		// Functions tha apllies to columns
+		char *fieldName(const int& field_num) const { return PQfname(pg_recordset_, field_num); }
+
+        int fieldNum(const string& field_name) const
+		{
+			string fieldName(field_name);
+
+			size_t pos = field_name.find(".", string::npos, 1);
+
+			if(pos != string::npos)
+				fieldName = field_name.substr(pos + 1);
+
+			return PQfnumber(pg_recordset_, fieldName.c_str());
+		}
+
+		Oid fieldType(const int& field_num) const { return PQftype(pg_recordset_, field_num); }
+        Oid fieldType(const string& field_name) const { return fieldType(fieldNum(field_name)); }
+
+		bool isNull(const int& field_num) const { return PQgetisnull(pg_recordset_, index(), field_num) == 1; }
+		bool isNull(const string& field_name) const { return isNull(fieldNum(field_name)); }
+
+		int fieldSize(const int& field_num);
+        int fieldSize(const string& field_name) { return fieldSize(fieldNum(field_name)); }
+
+        int fieldSizeFractionaryPart(const int& field_num);
+        int fieldSizeFractionaryPart(const string& field_name) {  return fieldSizeFractionaryPart(fieldNum(field_name)); }
+
+
+		// Datatype functions
+		char* value(const int& field_num) const { return PQgetvalue(pg_recordset_, int_index_current_, field_num); }
+		char* value(const string& field_name) const { return value(fieldNum(field_name)); }
+
+		int getBytea(const int& field_num, char*& buff) const;	
+		int getBytea(const string& field_name, char*& buff) const { return getBytea(fieldNum(field_name), buff); }
+		
+		int getInt(const int& field_num) const
+		{
+			if(cursorDataType_ == TeTEXTCURSOR) 
+				return atol(value(field_num));
+			else
+			{
+				unsigned int number;
+				memcpy(&number, value(field_num), sizeof(int));
+
+				if(isLittleEndian_)
+					number = ntohl(number);
+
+				return number;
+			}
+		}
+
+		int getInt(const string& field_name) const { return getInt(fieldNum(field_name)); }
+
+		bool getBool(const int& field_num) const
+		{
+			if(cursorDataType_ == TeTEXTCURSOR) 
+			{
+				string t = "t";
+
+				return (t == value(field_num));
+			}
+			else
+			{
+				unsigned char v = value(field_num)[0];
+				int v1 = v;
+				return v1 != 0;		
+			}
+		}
+
+		bool getBool(const string& field_name) const { return getBool(fieldNum(field_name)); }
+
+		double getDouble(const int& field_num) const
+		{
+			if(cursorDataType_ == TeTEXTCURSOR) 
+				return atof(value(field_num));
+			else
+			{
+				union
+				{
+					double dWord_;
+					unsigned int aux_[2];
+				} swapDouble1, swapDouble2;
+
+
+				// endianness test
+				if(isLittleEndian_)
+				{
+					// little-endian!
+					memcpy(&swapDouble1.dWord_, value(field_num), sizeof(double));
+
+					swapDouble2.aux_[1] = ntohl(swapDouble1.aux_[0]);
+					swapDouble2.aux_[0] = ntohl(swapDouble1.aux_[1]);
+
+					return swapDouble2.dWord_;
+				}
+				else
+				{
+					// big-endian!
+					memcpy(&swapDouble1.dWord_, value(field_num), sizeof(double));
+
+					swapDouble2.aux_[0] = ntohl(swapDouble1.aux_[0]);
+					swapDouble2.aux_[1] = ntohl(swapDouble1.aux_[1]);
+
+					return swapDouble2.dWord_;
+				}
+					
+			}
+		}
+
+		double getDouble(const string& field_name) const { return getDouble(fieldNum(field_name)); }	
+
+		char* getData(const int& field_num);
+		char* getData(const string& field_name) { return getData(fieldNum(field_name)); }
+
+		// PostgreSQL Geometric types
+		void getPGLine2D(const int& field_num, TeLine2D& l) const;
+		void getPGLine2D(const string& field_name, TeLine2D& l) const { getPGLine2D(fieldNum(field_name), l); }
+
+		// PostGIS Methods
+		void getPGISPoint(const int& field_num, TePoint& p) const;
+		void getPGISPoint(const string& field_name, TePoint& p) const { getPGISPoint(fieldNum(field_name), p); }
+
+		void getPGISLine(const int& field_num, TeLine2D& l) const;
+		void getPGISLine(const string& field_name, TeLine2D& l) const { getPGISLine(fieldNum(field_name), l); }
+
+		void getPGISPolygon(const int& field_num, TePolygon& p) const;
+		void getPGISPolygon(const string& field_name, TePolygon& p) const { getPGISPolygon(fieldNum(field_name), p); }
+
+		void getPGISMultiPoint(const int& field_num, TePointSet& ps) const;
+		void getPGISMultiPoint(const string& field_name, TePointSet& ps) const { getPGISMultiPoint(fieldNum(field_name), ps); }
+
+		void getPGISMultiLine(const int& field_num, TeLineSet& ls) const;
+		void getPGISMultiLine(const string& field_name, TeLineSet& ls) const { getPGISMultiLine(fieldNum(field_name), ls); }
+
+		void getPGISMultiPolygon(const int& field_num, TePolygonSet& ps) const;
+		void getPGISMultiPolygon(const string& field_name, TePolygonSet& ps) const { getPGISMultiPolygon(fieldNum(field_name), ps); }
+
+		void getPGISGeomColl(const int& field_num, TeMultiGeometry& m) const;
+		void getPGISGeomColl(const string& field_name, TeMultiGeometry& m) const { getPGISGeomColl(fieldNum(field_name), m); }
+
+	protected:
+
+        // don't support copying of TePGRecordset objects,
+        // so make copy constructor and assignment op private.
+        TePGRecordset(const TePGRecordset& c);
+        TePGRecordset& operator=(const TePGRecordset& c);
+
+
+		void freeRecordSet();
+
+		char* getWKBHeader(char* v, unsigned char &byteOrder, unsigned int& wkbType, unsigned int &numGeometries) const;
+
+		char* getWKBPoint(char* v, TeCoord2D& c) const;
+		char* getWKBLine(char* v, TeLine2D& l) const;
+		char* getWKBPolygon(char* v, TePolygon& p) const;
+
+		char* getWKBMultiPoint(char* v, TePointSet &ps) const;
+		char* getWKBMultiLine(char* v, TeLineSet &ls) const;
+		char* getWKBMultiPolygon(char* v, TePolygonSet &ps) const;
+
+		void getWKBGeomColl(char* v, TeMultiGeometry &mg) const;
+
+		
+
+		char* getWKBLinearRing(char* v, int byteOrder, TeLine2D &line) const;
+};
+
+#endif	//  __TERRALIB_INTERNAL_PGINTERFACE_H
diff --git a/src/terralib/drivers/PostgreSQL/TePGUtils.cpp b/src/terralib/drivers/PostgreSQL/TePGUtils.cpp
new file mode 100644
index 0000000..162f4cd
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGUtils.cpp
@@ -0,0 +1,470 @@
+#include "TePGUtils.h"
+#include <stdexcept>
+
+using namespace std;
+
+TeCoord2D PgGeomPolygonCoordDecode(char *str, char* *s)
+{
+
+	char *cp;	// I use this pointer to get the pointer address
+                // that strtod store in the second parameter.
+                // It is used to know if the conversion of a string
+                // to double ocurried normally
+
+	if(!str)
+		throw runtime_error("Invalid Coordinate!");
+
+	// SKIP WHITE SPACES
+	while(isspace((unsigned char)*str))
+		++str;
+
+	// SKIP THE FIRST '(' an go to number begin
+	if(*str != '(')
+			throw runtime_error("Invalid Coordinate!");
+
+	++str;
+
+	while(isspace((unsigned char)*str))
+		++str;
+
+	double x = strtod(str, &cp);
+
+	if(cp <= str)								// If no conversion or there aren't more characters
+		throw runtime_error("Invalid format!");	// Error, because the coord y will not be extracted
+												// Otherwise, cp will point to the next caracter, that begin the list conversion of coord y
+
+	// SKIP WHITE SPACES AFTER X COORDINATE AND JUMP ',' AND WHITE SPACES
+	while(isspace((unsigned char) *cp))
+		++cp;
+
+	if(*cp != ',')
+			throw runtime_error("Invalid Coordinate!");
+
+	++cp;
+
+	while(isspace((unsigned char) *cp))
+		++cp;
+
+	double y = strtod(cp, &str);
+	
+	if(str <= cp)
+		throw runtime_error("Invalid format!");
+
+	while(isspace((unsigned char) *str))
+		++str;
+
+	if(*str != ')')
+			throw runtime_error("Invalid Coordinate!");
+
+	++str;
+
+	while(isspace((unsigned char) *str))
+		++str;
+
+	if(s != 0)
+		*s = str;
+
+	return TeCoord2D(x, y);
+}
+
+void Te2PgGeomPolygon(const TeLine2D& l, string& strPolygon)
+{
+	strPolygon = "(";
+
+	unsigned int nVertex = l.size();
+	for(unsigned int i = 0u; i < nVertex; ++i)
+	{
+		if(i != 0u)
+			strPolygon += ",";
+
+		 strPolygon += Te2String(l[i].x_);
+		 strPolygon += ",";
+		 strPolygon += Te2String(l[i].y_);
+	}
+
+	strPolygon += ")";
+
+	return;
+}
+
+TeLine2D PgGeomPolygon2Te(char* strPolygon)
+{
+	char *s = strPolygon;
+
+	while(isspace((unsigned char) *s))
+		++s;
+
+	if(*s != LDELIM_PGGEOMPOLYGON)
+		throw runtime_error("Invalid line format!");
+
+	++s;
+
+	TeLine2D l;
+
+	while(true)
+	{
+		TeCoord2D coord = PgGeomPolygonCoordDecode(s, &s);
+		l.add(coord);	
+
+		if(*s == PGGEOMPOLYGON_COORDS_DELIM)
+			++s;
+		else
+			if(*s == RDELIM_PGGEOMPOLYGON)
+			{
+				++s;
+				break;
+			}
+	}
+
+    while(isspace((unsigned char) *s))
+		++s;
+
+	if((*s != '\0'))
+		throw runtime_error("Invalid line format!");
+
+	return l;
+}
+
+
+
+
+
+/*
+ * Codificadores e decodificadores PostGIS
+ *
+ */
+
+TeCoord2D PGCoord_decode(char *str, char* *s)
+{
+	char *cp;	// I use this pointer to get the pointer address
+                // that strtod store in the second parameter.
+                // It is used to know if the conversion of a string
+                // to double ocurried normally
+
+	if(!str)
+		throw runtime_error("Invalid Coordinate!");
+
+	while(isspace((unsigned char)*str))
+		++str;	
+
+	double x = strtod(str, &cp);
+
+	if(cp <= str)								// If no conversion or there aren't more characters
+		throw runtime_error("Invalid format!");	// Error, because the coord y will not be extracted
+												// Otherwise, cp will point to the next caracter, that begin the list conversion of coord y
+
+	while(isspace((unsigned char) *cp))
+		++cp;	
+
+	double y = strtod(cp, &str);
+	
+	if(str <= cp)
+		throw runtime_error("Invalid format!");
+
+	while(isspace((unsigned char) *str))
+		++str;	
+
+	if(s != 0)
+		*s = str;
+
+	return TeCoord2D(x, y);
+}
+
+string PGCoord_encode(const TeCoord2D& c)
+{
+	string str_p  = Te2String(c.x());
+		   str_p += " ";
+		   str_p += Te2String(c.y());
+
+	return str_p;
+}
+
+TePoint PGPoint_decode(char *str)
+{
+	if(!str)
+		throw runtime_error("Invalid point format!");
+		
+	char *s;
+
+	while(*str != ';')
+		 ++str;
+
+	if(*str == ';')
+		++str;
+
+	while(isspace((unsigned char) *str))
+		 ++str;
+
+	str+=6;	// Jump text "POINT(" and go to number.
+
+	TeCoord2D c = PGCoord_decode(str, &s);
+
+	if(*s != ')')
+		throw logic_error("Invalid point format!");
+
+	TePoint p;
+	
+	p.add(c);
+
+	return p;
+}
+
+string PGPoint_encode(const TePoint& p)
+{
+	string result  = "POINT(";
+		   result += PGCoord_encode(p.location());
+		   result += ")";
+
+	return result;
+}
+
+string PGNode_encode(const TeNode& p)
+{
+	string result  = "POINT(";
+		   result += PGCoord_encode(p.location());
+		   result += ")";
+
+	return result;
+}
+
+TeLine2D PGLine_decode(char *str, char* *sd)
+{
+	char *s;
+
+	s = str;
+
+	while(isspace((unsigned char) *s))
+		++s;
+
+	if(*s != LDELIM_LINESTRING)
+		throw runtime_error("Invalid line format!");
+
+	++s;
+
+	TeLine2D l;
+
+	double	xmin, ymin, xmax, ymax;
+
+	xmin = ymin = +TeMAXFLOAT;
+	xmax = ymax = -TeMAXFLOAT;
+
+	while(true)
+	{
+		TeCoord2D coord = PGCoord_decode(s, &s);
+		l.add(coord);
+
+		if(xmin > coord.x())
+			xmin = coord.x();
+
+		if(xmax < coord.x())
+			xmax = coord.x();
+		
+		if(ymin > coord.y())
+			ymin = coord.y();
+		
+		if(ymax < coord.y())
+			ymax = coord.y();
+
+		if(*s == COORDS_DELIM)
+			++s;
+		else
+			if(*s == RDELIM_LINESTRING)
+			{
+				++s;
+				break;
+			}
+	}
+
+    while(isspace((unsigned char) *s))
+		++s;
+
+	if((*s != '\0') && (*s != RDELIM_LINESTRING) && (*s != LINES_DELIM))
+		throw runtime_error("Invalid line format!");
+
+	l.setBox(TeBox(xmin, ymin, xmax, ymax));
+
+	*sd = s;
+
+	return l;
+}
+
+TeLine2D PGLinestring_decode(char *str)
+{
+	if(!str)
+		throw runtime_error("Invalid point format!");
+		
+	char *s;
+
+	s = str;
+
+	while(*s != ';')
+		 ++s;
+
+	if(*s == ';')
+		++s;
+
+	while(isspace((unsigned char) *s))
+		 ++s;
+
+	s += 10;	// Jump text "LINESTRING(" and go to number.
+
+	return PGLine_decode(s, &s);
+}
+
+TePolygon PGPolygon_decode(char *str)
+{
+	if(!str)
+		throw runtime_error("Invalid polygon format!");
+		
+	char *s;
+
+	while(*str != ';')
+		++str;
+
+	if(*str == ';')
+		++str;
+
+	while(isspace((unsigned char) *str))
+		 ++str;
+
+	str += 8;	// Jump text "POLYGON(" and go to first line.
+
+
+	s = str;
+
+	TePolygon pol;
+	while(true)
+	{
+		TeLine2D l = PGLine_decode(s, &s);
+		TeLinearRing r(l);
+		pol.add(r);
+
+		if(*s == COORDS_DELIM)
+			++s;
+		else
+			if(*s == RDELIM_LINESTRING)
+			{
+				++s;
+				break;
+			}
+	}
+
+	while(isspace((unsigned char) *s))
+		++s;
+
+	if(*s != '\0')
+		throw runtime_error("Invalid polygon format!");
+
+	pol.setBox(pol[0].box());
+
+	return pol;
+}
+
+TeBox PGBox_decode(char *str)
+{
+	 char *s;
+
+	 s = str;
+
+	 while(isspace((unsigned char) *s))
+		 ++s;
+
+	 s+=6;
+	 
+	 TeCoord2D coord1 = PGCoord_decode(s, &s);
+
+	 while(*s != ',')
+		 ++s;
+
+	 ++s;
+	 
+	 //if(*s != COORDS_DELIM)
+	 //	throw runtime_error("Invalid box format!");
+
+	 //++s;
+
+	 TeCoord2D coord2 = PGCoord_decode(s, &s);
+
+     //if(*s != RDELIM_BOX)
+	 //	throw runtime_error("Invalid box format!");
+	
+	 //++s;
+
+	 //while(isspace((unsigned char) *s))
+	 //	 ++s;
+
+	 //if(*s != '\0')
+	 //	 throw runtime_error("Invalid box format!");
+
+	 return TeBox(coord1, coord2);
+}
+
+string PGBox_encode(TeBox& b)
+{
+	string str_b = "BOX3D(";
+	       str_b += PGCoord_encode(b.upperRight());
+           str_b += ",";
+		   str_b += PGCoord_encode(b.lowerLeft());
+           str_b += ")";
+
+	return str_b;
+}
+
+
+
+void PGConcatLineString(const TeLine2D& l, string& concatString)
+{
+	register unsigned int i = 0;
+	register unsigned int nStep = l.size();
+
+	concatString += "(";
+	for(; i < nStep; ++i)
+	{
+		if(i != 0)
+		{
+			concatString += ", ";
+		}		 
+
+		concatString += PGCoord_encode(l[i]);
+	}
+	
+	concatString += ")";
+
+	return;
+}
+
+TeBox PGBoxFromPolygon(char *str)
+{
+	TePolygon pol = PGPolygon_decode(str);
+
+	return pol.box();
+}
+
+string PGMakePolygon(const TeBox& box)
+{
+	string result  = "POLYGON((";
+		   result += Te2String(box.x1());
+	       result += " ";
+	       result += Te2String(box.y1());
+		   result += ", ";
+		   result += Te2String(box.x1());
+	       result += " ";
+	       result += Te2String(box.y2());
+		   result += ", ";
+		   result += Te2String(box.x2());
+	       result += " ";
+	       result += Te2String(box.y2());
+		   result += ", ";
+		   result += Te2String(box.x2());
+	       result += " ";
+	       result += Te2String(box.y1());
+		   result += ", ";
+		   result += Te2String(box.x1());
+	       result += " ";
+	       result += Te2String(box.y1());
+		   result += "))";
+
+	return result;
+}
+
+
diff --git a/src/terralib/drivers/PostgreSQL/TePGUtils.h b/src/terralib/drivers/PostgreSQL/TePGUtils.h
new file mode 100644
index 0000000..9d42a16
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePGUtils.h
@@ -0,0 +1,114 @@
+//**************************************************************************
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TePGUtils.h
+    This file contains a database driver to access PostGIS extension.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+  */
+
+/**
+  *@description Este arquivo cont�m rotinas �teis que desenvolvi para convers�o 
+  *             entre os tipos de dados do PostGIS e da TerraLib. Estas fun��es
+  *             s�o parsers simples.
+  */
+
+#ifndef  __TERRALIB_INTERNAL_TePOSTGRESQLUTILS_H
+#define  __TERRALIB_INTERNAL_TePOSTGRESQLUTILS_H
+
+#include "TeGeometry.h"
+
+#define COORDS_DELIM		','
+
+#define COORD_DELIM			' '
+
+#define LINES_DELIM		','
+
+#define LDELIM_POINT		'('
+#define RDELIM_POINT		')'
+
+#define LDELIM_LINESTRING	'('
+#define RDELIM_LINESTRING	')'
+
+#define LDELIM_POLYGON		'('
+#define RDELIM_POLYGON		')'
+
+#define LDELIM_BOX			'('
+#define RDELIM_BOX			')'
+
+// DELIMITADORES PARA TIPOS GEOM�TRICOS DO POSTGRESQL
+#define LDELIM_PGGEOMPOLYGON       '('
+#define RDELIM_PGGEOMPOLYGON       ')'
+
+#define PGGEOMPOLYGON_COORDS_DELIM ','
+
+/*
+ * Codificadores e decodificadores de tipos geom�tricos do PostgreSQL.
+ * Essas fun��es s�o para o driver sem extens�o espacial.
+ *
+ */
+
+//! Decodifica uma coordenada no formato pol�gono dos tipos geom�tricos do PostgreSQL: (x1, y1)
+TeCoord2D PgGeomPolygonCoordDecode(char *str, char* *s);
+
+//! Transaforma a linha l em um pol�gono texto strPolygon
+void Te2PgGeomPolygon(const TeLine2D& l, string& strPolygon);
+
+//! Transaforma um pol�gono texto strPolygon em uma linha
+TeLine2D PgGeomPolygon2Te(char* strPolygon);
+
+/*
+ * Codificadores e decodificadores PostGIS - Texto
+ * 
+ */
+TeCoord2D PGCoord_decode(char *str, char* *s);
+
+string PGCoord_encode(const TeCoord2D& c);
+
+TePoint PGPoint_decode(char *str);
+
+string PGPoint_encode(const TePoint& p);
+
+string PGNode_encode(const TeNode& p);
+
+TeLine2D PGLine_decode(char *str, char* *sd);
+
+TeLine2D PGLinestring_decode(char *str);
+
+TePolygon PGPolygon_decode(char *str);
+
+TeBox PGBox_decode(char *str);
+
+string PGBox_encode(TeBox& b);
+
+void PGConcatLineString(const TeLine2D& l, string& concatString);
+
+TeBox PGBoxFromPolygon(char *str);
+
+string PGMakePolygon(const TeBox& box);
+
+
+#endif	// __TERRALIB_INTERNAL_TePOSTGRESQLUTILS_H
+
diff --git a/src/terralib/drivers/PostgreSQL/TePostGIS.cpp b/src/terralib/drivers/PostgreSQL/TePostGIS.cpp
new file mode 100644
index 0000000..5579907
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostGIS.cpp
@@ -0,0 +1,1233 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TePostGIS.h"
+#include "TePGUtils.h"
+
+#define BUFFSIZE                1024
+
+TePostGIS::TePostGIS()
+{
+	dbmsName_ = "PostGIS";
+}
+
+bool TePostGIS::connect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+	if(!realConnect(host, user, password, database, port))
+		return false;
+
+	// See if PostGIS is present
+	TePGRecordset rec;
+
+	string sql = "SELECT postgis_version()";
+
+	if(!rec.open(sql.c_str(), &tepg_connection_) || rec.recordCount() <= 0)
+	{
+		rec.close();
+
+		this->close();
+
+		errorMessage_ = "Couldn't find PostGIS extension! You may use the PostgreSQL driver!";
+
+		return false;	
+	}
+
+	return true;
+}
+
+bool TePostGIS::showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port)
+{
+	errorMessage_ = "";
+
+	if(TePostgreSQL::realConnect(host, user, password, "template1", port))
+	{
+		string sql = "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1') ORDER BY datname";
+
+		TePostGISPortal p(this);
+
+		if(p.query(sql) && p.fetchRow())
+		{
+			do
+			{
+				dbNames.push_back(p.getData("datname"));
+			}while(p.fetchRow());
+
+			return true;
+		}
+		else
+			errorMessage_ = "Didn't find any database!";
+	}
+	
+	return false;
+}
+
+TeDatabasePortal* TePostGIS::getPortal()
+{
+	errorMessage_ = "";
+
+	TeDatabasePortal *portal = new TePostGISPortal(this);
+
+	return portal;
+}
+
+bool TePostGIS::createPolygonGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id    VARCHAR(255) NULL,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	create  = "SELECT AddGeometryColumn('";
+	create += database_;
+	create += "', '";
+	create += TeConvertToLowerCase(tableName);
+	create += "', 'spatial_data',";
+	create += " -1, 'POLYGON', 2)";
+
+	
+	if(!execute(create))
+		return false;
+
+	//creates indexes
+	return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::createLineGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id    VARCHAR(255) NULL,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	create  = "SELECT AddGeometryColumn('";
+	create += database_;
+	create += "', '";
+	create += TeConvertToLowerCase(tableName);
+	create += "', 'spatial_data',";
+	create += " -1, 'LINESTRING', 2)";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::createPointGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id	VARCHAR(255) NULL,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	create  = "SELECT AddGeometryColumn('";
+	create += database_;
+	create += "', '";
+	create += TeConvertToLowerCase(tableName);
+	create += "', 'spatial_data', ";
+	create += " -1, 'POINT', 2)";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::createCellGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id    VARCHAR(255) NULL,";
+	       create += " col_number   INT          NOT NULL,";
+	       create += " row_number	INT          NOT NULL,";
+	       create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	create  = "SELECT AddGeometryColumn('";
+	create += database_;
+	create += "', '";
+	create += TeConvertToLowerCase(tableName);
+	create += "', 'spatial_data',";
+	create += " -1, 'POLYGON', 2)";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	if(!createIndex(tableName, tableName + "obj_idx", "object_id"))
+		return false;
+
+	return createIndex(tableName, tableName + "rc_idx", "row_number, col_number");
+}
+
+
+bool TePostGIS::createNodeGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id    SERIAL,";
+		   create += " object_id  VARCHAR(255) NULL,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	create  = "SELECT AddGeometryColumn('";
+	create += database_;
+	create += "', '";
+	create += TeConvertToLowerCase(tableName);
+	create += "', 'spatial_data',";
+	create += " -1, 'POINT', 2)";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	return createIndex(tableName, tableName + "obj_idx", "object_id");
+}
+
+bool TePostGIS::generateLabelPositions(TeTheme *theme)
+{
+	string	geomTable, upd;
+	string	collTable = theme->collectionTable();
+	
+	if((collTable.empty()) || (!tableExist(collTable)))
+		return false;
+
+	if(theme->layer()->hasGeometry(TeCELLS)    || 
+	   theme->layer()->hasGeometry(TePOLYGONS) ||
+	   theme->layer()->hasGeometry(TeLINES)    ||
+	   theme->layer()->hasGeometry(TePOINTS))
+	{
+		geomTable = theme->layer()->tableName(TeCELLS);
+		
+		if(geomTable.empty())
+		{
+			geomTable = theme->layer()->tableName(TePOLYGONS);
+			if(geomTable.empty())
+			{
+				geomTable = theme->layer()->tableName(TeLINES);
+
+				if(geomTable.empty())
+					geomTable = theme->layer()->tableName(TePOINTS);
+			}
+		}
+		
+		upd= " UPDATE " + collTable + " SET ";
+		upd += " label_x = (SELECT MAX(xmin(spatial_data::box3d) + (xmax(spatial_data::box3d)";
+		upd += " -  xmin(spatial_data::box3d)) / 2.0) ";
+		upd += "FROM " + geomTable + " WHERE object_id = c_object_id), ";
+		
+		upd += " label_y = (SELECT MAX(ymin(spatial_data::box3d) + (ymax(spatial_data::box3d)";
+		upd += " - ymin(spatial_data::box3d)) / 2.0) ";
+		upd += "FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+		upd += " WHERE (label_x IS NULL) OR (label_y IS NULL)";
+	}	
+
+	return execute(upd);
+}
+
+
+bool TePostGIS::selectPolygonSet(const string& table, const string& criteria, TePolygonSet& ps)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	
+	string sql ="SELECT * FROM " + table;
+	
+	if(!criteria.empty())
+		sql += " WHERE " + criteria;
+	
+	sql += " ORDER BY object_id ASC";
+	 
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while(flag);
+
+	delete portal;
+
+	return true;
+}
+
+bool TePostGIS::loadPolygonSet(TeTheme* theme, TePolygonSet& ps)
+{
+	string collTable = theme->collectionTable();
+	
+	if(collTable.empty())
+		return false;
+
+	TeLayer* themeLayer = theme->layer();
+
+	if(!themeLayer->hasGeometry(TePOLYGONS))
+		return false;
+	
+	string polygonTable = themeLayer->tableName(TePOLYGONS);
+
+	if(polygonTable.empty())
+		return false;
+
+	string sql  = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
+	       sql += " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
+	
+	TeDatabasePortal *portal = this->getPortal();
+	
+	if(!portal)
+		return false;
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add ( poly );
+	}
+	while(flag);		
+	
+	delete portal;
+	
+	return true;
+}
+
+bool TePostGIS::loadPolygonSet(const string& table, const string& geoid, TePolygonSet& ps)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	
+	string q ="SELECT * FROM " + table;
+
+	if (!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+	
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+
+	delete portal;
+
+	return true;
+}
+
+bool TePostGIS::loadPolygonSet(const string& table, TeBox& box, TePolygonSet& ps)
+{
+	TeDatabasePortal *portal = this->getPortal();
+
+	if(!portal)
+		return false;
+
+	string q = "SELECT * FROM " + table + " WHERE ";
+	       q += this->getSQLBoxWhere (box, TePOLYGONS);
+	       q += " ORDER BY object_id ASC";
+
+	if(!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+
+	delete portal;
+
+	return true;
+}
+
+TeDatabasePortal* TePostGIS::loadPolygonSet(const string& table, TeBox& box)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	
+	if(!portal)
+		return 0;
+
+	string q = "SELECT * FROM " + table + " WHERE ";
+	       q += this->getSQLBoxWhere(box, TePOLYGONS);
+	       q += " ORDER BY object_id ASC";
+
+	if(!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return 0;
+	}
+	else 
+		return portal;
+}
+
+bool TePostGIS::locatePolygon(const string& table, TeCoord2D& pt, TePolygon& polygon, const double& tol)
+{
+	TeDatabasePortal *portal = this->getPortal();
+
+	if (!portal)
+		return false;
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+
+	string sql  = "SELECT * FROM ";
+	       sql += table;
+		   sql += " WHERE ";
+		   sql += getSQLBoxWhere(box, TePOLYGONS);
+		   //sql += " WHERE GeometryFromText('";
+		   //sql += PGPoint_encode(TePoint(pt));
+		   //sql += "', -1) && spatial_data) ";
+		   //AND intersects(GeometryFromText('";
+		   //sql += PGPoint_encode(TePoint(pt));
+		   //sql += "', -1), spatial_data)";
+
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+
+	do
+	{
+		TePolygon poly;
+
+		flag = portal->fetchGeometry(poly);
+
+		if(TeWithin(TePoint(pt), poly))
+		{
+			polygon = poly;
+			delete portal;
+			return true;
+		}
+	}
+	while(flag);
+	
+	delete portal;
+	
+	return false;
+}
+
+bool TePostGIS::locatePolygonSet(const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	
+	if (!portal)
+		return false;
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+
+	string sql  = "SELECT * FROM ";
+	       sql += table;
+		   sql += " WHERE ";
+		   sql += getSQLBoxWhere(box, TePOLYGONS);
+
+			   //GeometryFromText('";
+		   //sql += PGPoint_encode(TePoint(pt));
+		   //sql += "', -1') && spatial_data) ";
+		   //AND intersects(GeometryFromText('";
+		   //sql += PGPoint_encode(TePoint(pt));
+		   //sql += "', -1), spatial_data)";
+
+	if (!portal->query(sql) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	
+	polygons.clear();
+	
+	do
+	{
+		TePolygon poly;
+
+		flag = portal->fetchGeometry(poly);
+
+		if(TeWithin(TePoint(pt), poly))
+			polygons.add(poly);
+	}
+	while (flag);
+
+	delete portal;
+
+	if(polygons.size())
+		return (true);
+
+	return false;
+}
+
+bool TePostGIS::insertPolygon(const string& table, TePolygon &p)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(p);
+
+	string sql  = "INSERT INTO " + table + " (object_id, spatial_data) VALUES('";
+	       sql += p.objectId();
+		   sql += "', ";
+
+	sql += "GeometryFromText('POLYGON(";
+
+
+	for(register unsigned int i = 0; i < p.size(); ++i)
+	{
+		if(i != 0)
+		{
+			sql += ", ";
+		}
+			
+		PGConcatLineString(p[i], sql);
+	}
+	
+	sql += ")', -1)";	// end POLYGON
+	sql += ")";			// end SQL
+			
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+		
+		TePGRecordset rec;
+		rec.open(sql.c_str(), &tepg_connection_);
+		if(rec.recordCount() > 0)
+		{
+			for(register unsigned int i = 0; i < p.size(); ++i)
+			{
+				p[i].geomId(atoi(rec.value(0)));
+			}
+		}
+
+		rec.close();
+	}
+	else
+		return false;
+
+	return true;
+}
+
+bool TePostGIS::updatePolygon(const string& table, TePolygon &p)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(p);
+
+	TePolygon::iterator it = p.begin();
+	TePolygon::iterator it_end = p.end();
+
+	string sql = "UPDATE " + table + " SET object_id = '";
+			   sql += p.objectId();
+			   sql += "', spatial_data = ";
+
+
+	sql += "GeometryFromText('POLYGON(";
+			   
+	for(; it != it_end; ++it)
+	{
+		PGConcatLineString(*it, sql);				
+	}
+
+	sql += ")', -1)";	// end POLYGON
+    sql += " WHERE geom_id = ";
+    sql += Te2String(it->geomId());
+
+	return this->execute(sql);
+}
+
+bool TePostGIS::loadLineSet(const string& table, const string& geoid, TeLineSet& ls)
+{
+	TeDatabasePortal *portal = this->getPortal();
+
+	string q ="SELECT * FROM " + table;
+
+	if(!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+
+	if(!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+
+	do 
+	{
+		TeLine2D line;
+		flag = portal->fetchGeometry(line);
+		ls.add (line);
+	}while(flag);
+
+	delete portal;
+
+	return true;
+}
+
+bool TePostGIS::loadLineSet(const string& table, TeBox& box, TeLineSet& linSet)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	
+	if(!portal)
+		return false;
+
+	string q  = "SELECT * FROM " + table + " WHERE ";
+	       q += this->getSQLBoxWhere (box, TeLINES);
+	       q += " ORDER BY object_id DESC";
+
+	if(!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+
+	do
+	{
+		TeLine2D lin;
+		flag = portal->fetchGeometry(lin);
+		linSet.add(lin);
+	}
+	while (flag);
+
+	delete portal;
+
+	return true;
+}
+
+TeDatabasePortal* TePostGIS::loadLineSet(const string& table, TeBox& box)
+{
+	TeDatabasePortal *portal = this->getPortal();
+
+	if(!portal)
+		return 0;
+
+	string q  = "SELECT * FROM " + table + " WHERE ";
+	       q += this->getSQLBoxWhere (box, TeLINES);
+	       q += " ORDER BY object_id DESC";
+
+	if(!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+
+		return 0;
+	}
+
+	return portal;
+}
+
+bool TePostGIS::insertLine(const string& table, TeLine2D& l)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(l);
+
+	string sql  = "INSERT INTO " + table + " (object_id, spatial_data) ";
+		   sql += "VALUES('";
+		   sql += l.objectId();
+		   sql += "', GeometryFromText('LINESTRING";
+
+	PGConcatLineString(l, sql);
+	
+	sql += "', -1))";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+		TePGRecordset rec;
+		rec.open(sql.c_str(), &tepg_connection_);
+
+		if(rec.recordCount() > 0)
+			l.geomId(atoi(rec.value(0)));
+
+		rec.close();
+	}
+	else
+		return false;
+
+	return true;
+}
+
+bool TePostGIS::updateLine(const string& table, TeLine2D& l)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(l);
+
+	string sql  = "UPDATE " + table + " SET object_id = '";
+		   sql += l.objectId();
+		   sql += "', spatial_data = GeometryFromText('LINESTRING";
+
+	PGConcatLineString(l, sql);
+
+	sql += "', -1) WHERE geom_id = ";
+	sql += Te2String(l.geomId());			
+
+	return this->execute(sql);
+}
+
+bool TePostGIS::locateLine(const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+	//string geom  = "GeometryFromText('POLYGON((";
+	//     geom += Te2String(box.x1()) + " " + Te2String(box.y1()) + ", ";
+	//	   geom += Te2String(box.x2()) + " " + Te2String(box.y1()) + ", ";
+	//	   geom += Te2String(box.x2()) + " " + Te2String(box.y2()) + ", ";
+	//	   geom += Te2String(box.x1()) + " " + Te2String(box.y2()) + ", ";
+	//	   geom += Te2String(box.x1()) + " " + Te2String(box.y1());
+	  //     geom += "))', -1)";
+
+	string sql  = "SELECT * FROM ";
+	       sql += table;
+		   sql += " WHERE ";
+		   sql += this->getSQLBoxWhere(box, TeLINES);
+		  // sql += 
+		   //(" + geom + " && spatial_data) ";
+		   //AND intersects(";
+		   //sql += geom;
+		   //sql += ", spatial_data)";
+
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	// Get all lines
+	TeLineSet ls;
+	int k;
+	bool flag = true;
+	do 
+	{
+		TeLine2D l;
+		flag = portal->fetchGeometry( l );
+		ls.add ( l );
+	} while(flag);
+
+	delete portal;
+
+	TeCoord2D paux;
+
+	if(TeNearest(pt, ls, k, paux, tol))
+	{
+		line = ls[k];
+		return true;
+	}
+
+	return false;
+}
+
+bool TePostGIS::insertPoint(const string& table, TePoint &p)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO " + table + " (object_id, spatial_data) VALUES('";
+ 		   sql +=  p.objectId();
+		   sql += "', GeometryFromText('";
+		   sql += PGPoint_encode(p);
+		   sql += "', -1))";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql.c_str(), &tepg_connection_);
+		if(rec.recordCount() > 0)
+			p.geomId(atoi(rec.value(0)));
+
+		rec.close();
+	}
+	else
+		return false;
+	
+	return true;
+}
+
+bool TePostGIS::updatePoint(const string& table, TePoint &p)
+{
+	errorMessage_ = "";
+
+	string sql  = "UPDATE " + table + " SET object_id = '";
+		   sql +=  p.objectId();
+		   sql += "', spatial_data = GeometryFromText('";
+		   sql += PGPoint_encode(p);
+		   sql += "', -1) WHERE geom_id = ";
+		   sql += Te2String(p.geomId());
+
+	return this->execute(sql);
+}
+
+bool TePostGIS::locatePoint(const string& table, TeCoord2D& pt, TePoint& point, const double& tol)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox bbox(pt.x() - tol, pt.y() - tol, pt.x() + tol, pt.y() + tol);
+
+	string sql  = "SELECT * FROM ";
+	       sql += table;
+		   sql += " WHERE ";
+		   sql += this->getSQLBoxWhere(bbox, TePOINTS);
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	TePointSet ps;
+	
+	bool flag = true;
+
+	do 
+	{
+		TePoint point;
+		flag = portal->fetchGeometry(point);
+		ps.add(point);
+	}while(flag);
+
+	delete portal;
+	int k;
+	if(TeNearest(pt, ps, k, tol))
+	{
+		point = ps[k];
+		return true;
+	}
+	return false;
+}
+
+bool TePostGIS::insertNode(const string& table, TeNode& node)
+{
+	errorMessage_ = "";
+
+	string  sql = "INSERT INTO " + table + " (object_id, spatial_data) VALUES('";
+			sql += node.objectId();
+			sql += "', GeometryFromText('";
+			sql += PGNode_encode(node);
+			sql += "', -1))";
+
+	if(!this->execute(sql))
+		return false;
+
+	sql = "SELECT currval('" + table + "_geom_id_seq')";
+	TePGRecordset rec;
+	rec.open(sql.c_str(), &tepg_connection_);
+	if(rec.recordCount() > 0)
+		node.geomId(atoi(rec.value(0)));
+
+	rec.close();
+
+	return true;
+}
+
+bool TePostGIS::updateNode(const string& table, TeNode& node)
+{
+	errorMessage_ = "";
+
+	string  sql  = "UPDATE " + table + " SET object_id = '";
+		    sql += node.objectId();
+			sql += "', spatial_data = GeometryFromText('";
+			sql += PGNode_encode(node);
+			sql += "', -1) WHERE geom_id = ";
+			sql += Te2String(node.geomId());
+
+	return this->execute(sql);
+}
+
+bool TePostGIS::insertCell(const string& table, TeCell &c)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO " + table + " (object_id, spatial_data, col_number, row_number) VALUES('";
+		   sql += c.objectId();
+		   sql += "', GeometryFromText('";
+		   sql += PGMakePolygon(c.box());
+		   sql += "', -1), ";
+		   sql += Te2String(c.column());
+		   sql += ", ";
+		   sql += Te2String(c.line());
+		   sql += ")";
+
+	if(!this->execute(sql))
+		return false;
+
+	sql = "SELECT currval('" + table + "_geom_id_seq')";
+	TePGRecordset rec;
+	rec.open(sql.c_str(), &tepg_connection_);
+	if(rec.recordCount() > 0)
+		c.geomId(atoi(rec.value(0)));
+	
+	rec.close();	
+
+	return true;
+}
+
+bool TePostGIS::updateCell(const string& table, TeCell &c)
+{
+	errorMessage_ = "";
+
+	string sql  = "UPDATE " + table + " SET object_id = '";
+		   sql += c.objectId();
+		   sql += "', spatial_data = GeometryFromText('";
+		   sql += PGMakePolygon(c.box());
+		   sql += "', -1), col_number = ";
+		   sql += Te2String(c.column());
+		   sql += ", row_number = ";
+           sql += Te2String(c.line());
+		   sql += " WHERE geom_id = ";
+		   sql += Te2String(c.geomId());			
+
+	return this->execute(sql);
+}
+
+bool TePostGIS::locateCell(const string& table, TeCoord2D& pt, TeCell& c, const double& tol)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+
+	string sql  ="SELECT * FROM ";
+	       sql += table;
+		   sql += "WHERE ";
+		   sql += this->getSQLBoxWhere(box, TeCELLS);
+
+		   //sql += " WHERE (GeometryFromText('";
+		   //sql += PGPoint_encode(TePoint(pt));
+		   //sql += "', -1) && spatial_data) AND intersects(GeometryFromText('";
+		   //sql += PGPoint_encode(TePoint(pt));
+		   //sql += ", spatial_data)";
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	portal->fetchGeometry(c);
+
+	delete portal;
+
+	return true;
+}
+
+bool TePostGIS::createSpatialIndex(const string& table, const string& column, TeSpatialIndexType /*type*/, short /*level*/, short /*tile*/)
+{
+	string create = "CREATE INDEX sp_idx_" + table + " ON " + table + " USING GIST (" + column + " GIST_GEOMETRY_OPS)";
+
+	return this->execute(create);
+}
+
+string TePostGIS::getSQLBoxWhere(TeBox& box, TeGeomRep rep)
+{
+	if(rep == TeTEXT || rep == TeRASTER)
+	{
+		string wherebox = TeDatabase::getSQLBoxWhere (box, rep);
+		return wherebox;
+	}
+
+	string colname = "spatial_data";
+
+	string wherebox  = "('" + PGBox_encode(box) + "'::box3d";
+		   wherebox += " && " + colname + ")";	
+
+	return wherebox;
+}
+
+string TePostGIS::getSQLBoxWhere(const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1)
+{
+	if(rep1 == TeRASTER || rep2 == TeRASTER || rep1 == TeTEXT || rep2 == TeTEXT)
+	{
+		string wherebox = TeDatabase::getSQLBoxWhere(table1, table2, rep2, rep1);
+
+		return wherebox;
+	}
+
+	string colname1 = "spatial_data";
+	string colname2 = "spatial_data";
+
+	if(rep1 == TeRASTER)
+		colname1 = "block_box";
+
+	if(rep2 == TeRASTER)
+		colname2 = "block_box";
+
+	string wherebox  = table1;
+	       wherebox += "." + colname1 + " && ";
+		   wherebox += table2;
+		   wherebox += "." + colname2 + "";  
+
+	return wherebox;
+}
+
+string TePostGIS::getSQLBoxSelect (const string& tableName, TeGeomRep rep)
+{
+	string colname = "spatial_data";
+
+	if(rep != TeRASTER)
+	{
+
+		string select  = tableName +".* , ";
+			   select += "xmin(" + colname + ") as lower_x, ";
+			   select += "ymin(" + colname + ") as lower_y, ";
+			   select += "xmax(" + colname + ") as upper_x, ";
+			   select += "ymax(" + colname + ") as upper_y ";
+
+		return select;
+	}
+	else	// RASTER
+	{
+		string select  = tableName +".* , ";
+			   select += "xmin(lower_x) as lower_x, ";
+			   select += "ymin(lower_y) as lower_y, ";
+			   select += "xmax(upper_x) as upper_x, ";
+			   select += "ymax(upper_y) as upper_y ";
+
+		return select;
+	}
+}
+
+bool TePostGIS::getMBRGeom(string tableGeom, string object_id, TeBox& box, string /*colGeom*/)
+{
+	TeDatabasePortal* portal = getPortal();
+	if(!portal)
+		return false;
+
+	string sel = "SELECT extent(spatial_data) FROM " + tableGeom;
+	sel += " WHERE object_id = '" + object_id + "'";
+
+	if(!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+		
+	bool b = portal->fetchRow();
+	if(!b)
+	{
+		delete portal;
+		return false;
+	}
+	
+	box = PGBox_decode(portal->getData(0));
+
+	delete portal;
+	return true;
+}
+
+bool TePostGIS::getMBRSelectedObjects(string /*geomTable*/, string /*colGeom*/, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType, TeBox& bout, const double& /*tol*/)
+{
+	string colname = "spatial_data";
+
+	if(repType != TeRASTER)
+	{
+		string	fields = "extent(" + colname + ")";
+		string	query  = " SELECT " + fields;
+			    query += " FROM " + fromClause; 
+				query += " WHERE " + whereClause;
+		        query += afterWhereClause;
+
+		TeDatabasePortal* portal = this->getPortal();
+
+		if(portal->query(query) && portal->fetchRow())
+		{
+			TeBox aux(PGBox_decode(portal->getData(0)));
+			bout = aux;
+
+			delete portal;
+			return true;
+		}	
+
+		delete portal;		
+	}
+	else
+	{
+		string	fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
+		string	query  = " SELECT " + fields;
+			    query += " FROM " + fromClause; 
+				query += " WHERE " + whereClause;
+		        query += afterWhereClause;
+
+		TeDatabasePortal* portal = this->getPortal();
+
+		if(portal->query(query) && portal->fetchRow())
+		{
+			double x1 = portal->getDouble(0);
+			double y1 = portal->getDouble(1);
+			double x2 = portal->getDouble(2);
+			double y2 = portal->getDouble(3);
+
+			TeBox aux(x1, y1, x2, y2);
+			bout = aux;
+
+			delete portal;
+			return true;
+		}	
+
+		delete portal;
+	}
+
+	return false;
+}
+
+
+
+TePostGISPortal::TePostGISPortal(TeDatabase *pDatabase)
+{
+	db_ = pDatabase;
+	con_ = &((static_cast<TePostGIS*>(pDatabase))->tepg_connection_);
+}
+
+bool TePostGISPortal::fetchGeometry(TePolygon& pol)
+{
+	errorMessage_ = "";
+	
+	tepg_recordset_.getPGISPolygon("spatial_data", pol);
+	pol.geomId(tepg_recordset_.getInt("geom_id"));
+	pol.objectId(tepg_recordset_.value("object_id"));	
+
+	return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TeLine2D& line)
+{
+	errorMessage_ = "";
+
+	tepg_recordset_.getPGISLine("spatial_data", line);
+	line.geomId(tepg_recordset_.getInt("geom_id"));
+	line.objectId(tepg_recordset_.value("object_id"));
+
+	return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TeNode& n)
+{
+	errorMessage_ = "";
+
+	TePoint p;
+	tepg_recordset_.getPGISPoint("spatial_data", p);
+	n.add(p.location());
+	n.geomId(tepg_recordset_.getInt("geom_id"));
+	n.objectId(tepg_recordset_.value("object_id"));
+
+	//n.add(PGPoint_decode(getData("spatial_data")).location());
+	//n.geomId(atoi(getData("geom_id")));
+	//n.objectId(string(getData("object_id")));
+
+	return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TePoint& p)
+{
+	errorMessage_ = "";
+	
+	tepg_recordset_.getPGISPoint("spatial_data", p);
+	p.geomId(tepg_recordset_.getInt("geom_id"));
+	p.objectId(tepg_recordset_.value("object_id"));
+		
+	return fetchRow();
+}
+
+bool TePostGISPortal::fetchGeometry(TeCell& cell)
+{
+	errorMessage_ = "";
+
+	TePolygon pol;
+	tepg_recordset_.getPGISPolygon("spatial_data", pol);
+
+	cell.geomId(tepg_recordset_.getInt("geom_id"));
+	cell.objectId(tepg_recordset_.value("object_id"));
+	cell.setBox (pol.box());
+	cell.column(tepg_recordset_.getInt("col_number"));
+	cell.line(tepg_recordset_.getInt("row_number"));
+
+
+	return fetchRow();
+}
diff --git a/src/terralib/drivers/PostgreSQL/TePostGIS.h b/src/terralib/drivers/PostgreSQL/TePostGIS.h
new file mode 100644
index 0000000..ad23b3f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostGIS.h
@@ -0,0 +1,213 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TePostGIS.h
+    This file contains a database driver to access PostgreSQL server using PostGIS extension.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+  */
+
+/**
+  *@description This file contains the especifics routines of PostgreSQL.
+  */
+
+/*
+ * TODO: 
+ *       
+ *       
+ *
+ */
+
+#ifndef  __TERRALIB_INTERNAL_POSTGIS_H
+#define  __TERRALIB_INTERNAL_POSTGIS_H
+
+#include "TePostgreSQL.h"
+
+
+class TePostGISPortal;
+
+//! PostgreSQL with PostGIS extension database access class.
+/*!
+	This class contains the implementation of common methods for TerraLib access PostgreSQL using a PostGIS extension.    
+ */	
+class TePostGIS : public TePostgreSQL
+{
+	friend class TePostGISPortal;
+
+	public:
+		
+		//! Constructor
+		TePostGIS();
+
+		//! Destructor
+		virtual ~TePostGIS()
+		{
+		}
+
+		//! Opens a conection to a database server
+		bool connect(const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+		bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = 0);
+
+		//! Returns a portal associated to this database
+		TeDatabasePortal* getPortal();
+
+		//! Show the server databases (only for MySQL, Oracle and PostgreSQL)
+		//bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = 0);
+
+		//! Creates a table for a polygon geometries
+		bool createPolygonGeometry(const string& tableName);
+
+		//! Creates a table for line geometries
+		bool createLineGeometry(const string& tableName);
+
+		//! Creates a table for point geometries
+		bool createPointGeometry(const string& tableName);
+
+		//! Creates a table for cell geometries
+		bool createCellGeometry(const string& tableName);
+
+		//! Creates a table for a node geometries
+		bool createNodeGeometry(const string& tableName);
+
+		//! Generate the label position (x,y) to each object of a theme
+		bool generateLabelPositions(TeTheme *theme);
+
+		//! Returns all polygons in a table given a criteria expressed as an SQL where statement
+		bool selectPolygonSet(const string& table, const string& criteria, TePolygonSet& ps);
+
+		//! Returns all polygons that represents objects of a particular theme
+		bool loadPolygonSet(TeTheme* theme, TePolygonSet& ps);
+
+		//! Returns all polygons  that represents objects of a particular geoid
+		bool loadPolygonSet(const string& table, const string& geoid, TePolygonSet& ps);
+
+		//! Returns all polygons inside a given box
+		bool loadPolygonSet(const string& table, TeBox& box, TePolygonSet& ps);
+
+		//! Returns a database portal to iterate over the polygons that are inside a given box
+		TeDatabasePortal* loadPolygonSet(const string& table, TeBox& box);
+
+		//! Returns the first polygon that contais a given coordinate
+	    bool locatePolygon(const string& table, TeCoord2D& pt, TePolygon& polygon, const double& tol = 0.0);		
+
+		//! Returns the polygons that contains a give coordinate
+		bool locatePolygonSet  (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons);
+
+		//! Inserts a polygon
+		bool insertPolygon(const string& table, TePolygon& p);
+
+		//! Updates a polygon
+		bool updatePolygon(const string& table, TePolygon& p);
+
+		bool loadLineSet(const string& table, const string& geoid, TeLineSet& ls);
+
+		bool loadLineSet(const string& table, TeBox& box, TeLineSet& linSet);
+
+		TeDatabasePortal* loadLineSet(const string& table, TeBox& box);
+
+		//! Inserts a line
+		bool insertLine(const string& table, TeLine2D& l);
+
+		//! Updates a line
+		bool updateLine(const string& table, TeLine2D& l);
+
+		//! Locates a line
+		bool locateLine(const string& table, TeCoord2D& pt, TeLine2D& line, const double& tol = 0.0);
+
+		//! Inserts a point
+		bool insertPoint(const string& table, TePoint& p);
+
+		//! Updates a point
+		bool updatePoint(const string& table, TePoint& p);
+
+		//! Locates a point
+		bool locatePoint(const string& table, TeCoord2D& pt, TePoint& point, const double& tol = 0.0);
+
+		//! Inserts a node
+		bool insertNode(const string& table, TeNode& node);
+
+		//! Updates a node
+		bool updateNode(const string& table, TeNode& node);
+
+		//! Inserts a cell
+		bool insertCell(const string& table, TeCell& c);
+
+		//! Updates a cell
+		bool updateCell(const string& table, TeCell& c);
+
+		// Locates a cell
+		bool locateCell(const string& table, TeCoord2D& pt, TeCell& c, const double& tol = 0.0);
+
+		//! Creates a spatial index on column table
+		bool createSpatialIndex(const string& table, const string& column, TeSpatialIndexType type = TeRTREE, short level = 0, short tile = 0);
+
+		//! Return a string that describes a where clause to return the geometries inside the box
+		string getSQLBoxWhere(TeBox &box, TeGeomRep rep);
+
+		//! Returns a string that describes a where clause to return the geometries of the table2 that are inside the geometries box of the table1
+		string getSQLBoxWhere(const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1 = TePOLYGONS);
+
+		//! Return a string SQL to be used in the clause SELECT to select the box (lower_x, lower_y, upper_x, upper_y)
+		string getSQLBoxSelect(const string& tableName, TeGeomRep rep);
+
+		//! Returns the box of a specific geometry (object_id)  
+		bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom);
+
+		//! Return the box of a select objects set 
+		bool getMBRSelectedObjects(string geomTable, string colGeom, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType, TeBox& bout, const double& tol = 0.0);
+};
+
+
+//! PostgreSQL with PostGIS extension data navigation functionalities.
+/*!
+	This class contains the implementation of common methods for TerraLib navigate throw data.    
+ */	
+class TePostGISPortal : public TePostgreSQLPortal
+{
+	public:
+
+		//! Constructor
+		TePostGISPortal()
+		{
+		}
+
+		//! Constructor
+		TePostGISPortal(TeDatabase *pDatabase);
+		
+		//! Virtual Destructor
+		virtual ~TePostGISPortal()
+		{
+		};	
+
+		bool fetchGeometry(TePolygon& pol);
+		bool fetchGeometry(TeLine2D& line);
+		bool fetchGeometry(TeNode& n);
+		bool fetchGeometry(TePoint& p);
+		bool fetchGeometry(TeCell& cell);
+};
+
+#endif	// __TERRALIB_INTERNAL_POSTGIS_H
+
diff --git a/src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp b/src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp
new file mode 100644
index 0000000..67bbb10
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostgreSQL.cpp
@@ -0,0 +1,3304 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TePostgreSQL.h"
+#include "TePGUtils.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+
+
+
+
+
+
+
+#include "TeSpatialOperations.h"
+#include "TeGeometryAlgorithms.h"
+#include <string>
+using namespace std;
+
+
+//----- TePostgreSQL methods ---
+TePostgreSQL::TePostgreSQL()
+{
+	errorMessage_ = "";
+	dbmsName_ = "PostgreSQL";
+}
+
+TePostgreSQL::~TePostgreSQL()
+{
+	if(isConnected_)
+		close();
+}
+
+string TePostgreSQL::errorMessage()
+{
+	if(errorMessage_.empty())
+		return tepg_connection_.err_msg();
+	else
+		return errorMessage_;
+	
+}
+
+bool TePostgreSQL::newDatabase(const string& database, const string& user, const string& password, const string& host, const int& port, bool terralibModel)
+{
+	errorMessage_ = "";
+
+	string createDB  = "CREATE DATABASE ";
+	       createDB += database;
+
+	//if(!realConnect(host, user, password, "template1", port))
+	//	return false;	
+
+	if(!connect(host, user, password, "template1", port))
+		return false;
+
+	
+	bool connected = false;
+	
+	if(execute(createDB))
+		connected = connect(host, user, password, database, port);
+	else
+		return false;
+
+	if(terralibModel)
+	{
+		//create conceptual model
+		if(connected)
+		{
+			if(!createConceptualModel())
+				return false;
+		}
+		else
+			return false;
+	}
+
+	return true;
+}
+
+
+bool TePostgreSQL::connect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+	if(TePostgreSQL::realConnect(host, user, password, database, port))
+	{
+		// See if PostGIS is present
+		TePGRecordset rec;
+
+		string sql = "SELECT postgis_version()";
+
+		if(rec.open(sql.c_str(), &tepg_connection_) && rec.recordCount() > 0)
+		{
+			rec.close();
+
+			this->close();
+
+			errorMessage_ = "PostGIS extension found! Please use a PostGIS driver!";
+
+			return false;	
+		}
+
+		return true;
+	}
+	
+	return false;
+}
+
+bool TePostgreSQL::realConnect(const string& host, const string& user, const string& password, const string& database, int port)
+{
+	errorMessage_ = "";
+
+	host_             = (host == "")     ? (string("")) : (" host = " + host + " ");
+	user_             = (user == "")     ? (string("")) : (" user = " + user + " ");
+	password_         = (password == "") ? (string("")) : (" password = " + password + " ");
+	database_         = (database == "") ? (string("")) : (" dbname = " + database + " ");
+	string portNumber = (port == 0)      ? (string("")) : (" port = " + Te2String(port)  + " ");
+
+	portNumber_ = port;
+
+	string connInfo = host_ + user_ + password_ + database_ + portNumber;
+
+	this->close();
+
+	if(!tepg_connection_.open(connInfo))
+	{
+		errorMessage_ = "Could not connect to the database server!";
+		return false;
+	}
+
+	isConnected_ = true;
+	
+	host_     = host;
+	user_     = user;
+	password_ = password;
+	database_ = database;	
+
+	return true;
+}
+
+bool TePostgreSQL::showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port)
+{
+	errorMessage_ = "";
+
+	if(realConnect(host, user, password, "template1", port))
+	{
+		string sql = "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1') ORDER BY datname";
+
+		TePostgreSQLPortal p(this);
+
+		if(p.query(sql) && p.fetchRow())
+		{
+			do
+			{
+				dbNames.push_back(p.getData("datname"));
+			}while(p.fetchRow());
+
+			return true;
+		}
+		else
+			errorMessage_ = "Didn't find any database!";
+	}
+	
+	return false;
+}
+
+void TePostgreSQL::close(void)
+{
+	clear();
+
+	errorMessage_ = "";
+
+	tepg_connection_.close();
+	isConnected_ = false;	
+
+	return;
+}
+
+bool TePostgreSQL::listTables(vector<string>& tableList)
+{
+	errorMessage_ = "";
+
+	TePGRecordset rec;
+
+	string sql = "SELECT tablename FROM pg_table WHERE schemaname = 'public' ORDER BY tablename";
+
+	if(!rec.open(sql, &tepg_connection_) || rec.recordCount() <= 0)
+		return false;
+
+	while(!rec.eof())
+	{
+		tableList.push_back(rec.getData(0));
+		rec.moveNext();
+	}
+	
+	return true;
+
+}
+
+bool TePostgreSQL::tableExist(const string& table)
+{
+	errorMessage_ = "";
+
+	TePGRecordset rec;
+
+	string sql = "SELECT relname FROM pg_class WHERE lower(relname) = lower('" + table + "')";
+
+	if(!rec.open(sql, &tepg_connection_))
+		return false;
+
+	return (rec.recordCount() > 0);
+}
+
+bool TePostgreSQL::columnExist(const string& table, const string& column, TeAttribute& attr)
+{
+	errorMessage_ = "";
+
+	TePGRecordset rec;
+
+	string sql  = "SELECT atttypid, attname, atttypmod, attlen  FROM pg_class, pg_attribute ";
+	       sql += "WHERE lower(pg_class.relname) = lower('" + table + "') AND ";
+		   sql += "      pg_class.oid = pg_attribute.attrelid AND ";
+		   sql += "      pg_attribute.attname = lower('" + column + "')";
+
+	if(!rec.open(sql, &tepg_connection_))
+		return false;
+
+	if(rec.recordCount() > 0)
+	{
+		attr.rep_.name_ = rec.getData("attname");
+
+		Oid nType = static_cast<Oid>(rec.getInt("atttypid"));
+		switch(nType)
+		{
+			case 16:    //BOOL
+			case 20:    //INT8
+			case 21:    //INT2
+			case 23:    //INT4
+			case 26:    //OID			
+						attr.rep_.type_ = TeINT;
+						attr.rep_.numChar_ = 15;
+						break;
+
+			case 700 :  //float4  -> float(p)
+			case 701 :  //float8  -> float(p)
+			case 790 :  //money   -> decimal(9, 2)  
+			case 1700:  //numeric -> numeric(p, s)  
+						attr.rep_.type_ = TeREAL;
+						attr.rep_.numChar_ = 15;
+						break;
+
+			case 1082:	//date -> date
+			case 1083:  //time -> time
+			case 1114:  //timestamp
+			case 1186:  //interval
+			case 1266:	//
+						attr.rep_.type_ = TeDATETIME;
+						attr.rep_.numChar_ = rec.getInt("attlen");
+						break;
+
+			//case 26:    //OID
+			case 17:	//bytea
+						attr.rep_.type_ = TeBLOB;
+						attr.rep_.numChar_ = 0;
+						break;
+			case 1042:
+						attr.rep_.type_ = TeCHARACTER;
+						attr.rep_.numChar_ = rec.getInt("atttypmod") - 4;
+
+			case 1043:  //varchar(n)
+			case 25:    //text
+						attr.rep_.type_ = TeSTRING;
+						attr.rep_.numChar_ = rec.getInt("atttypmod") - 4;
+						break;
+
+			default:
+						attr.rep_.type_ = TeUNKNOWN;
+						attr.rep_.numChar_ = 0;
+						break;
+		}
+
+		return true;
+	}
+
+	return false;
+}
+
+bool TePostgreSQL::createTable(const string& table, TeAttributeList &attr)
+{
+	errorMessage_ = "";
+
+	bool first = true;
+
+	TeAttributeList::iterator it = attr.begin();
+	
+	string createTable ="CREATE TABLE " + table +" (";
+	
+	string type;
+	char	size[8];
+
+	string pkeys;
+
+	while(it != attr.end())
+	{
+		switch ((*it).rep_.type_)
+		{
+			case TeSTRING:		type = "VARCHAR ";
+								sprintf (size, "(%d)", (*it).rep_.numChar_);
+								type += string(size);
+								break;
+
+			case TeREAL:		type = "FLOAT8";
+								break;
+
+			case TeINT:			type = ((*it).rep_.isAutoNumber_) ? "SERIAL" : "INT";
+								break;
+
+			case TeBLOB:		//type = "OID";
+				                type = "BYTEA";
+								break;
+
+			case TeDATETIME:	type = "TIMESTAMP(0)";
+								break;
+
+			case TeCHARACTER:	type = "CHAR ";
+								sprintf (size, "(%d)", (*it).rep_.numChar_);
+								type += string (size);
+								break;
+
+			default:			type = "VARCHAR ";
+								sprintf (size, "(%d)", (*it).rep_.numChar_);
+								type += string (size);
+								break;
+		}
+		
+		if(!first)
+			createTable += ",  ";
+		else
+			first = false;
+
+		createTable += (*it).rep_.name_ + " ";
+		createTable += type;
+
+		// check if column is part of primary key
+		if((*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
+		{
+			if(!pkeys.empty())
+				pkeys += ", ";
+			
+			pkeys += (*it).rep_.name_;
+		}
+		else
+			createTable += " NULL ";
+
+		++it;
+	}
+
+	if(!pkeys.empty())
+	{	string pk = ", PRIMARY KEY(";
+	           pk += pkeys;
+			   pk += ")";
+
+		createTable += pk;
+	}
+
+
+	createTable += ");";
+
+	return execute(createTable);
+}
+
+bool TePostgreSQL::addColumn(const string& table, TeAttributeRep &rep)
+{
+	errorMessage_ = "";
+	
+	string field = TeGetExtension(rep.name_.c_str());
+	if(field.empty())
+		field = rep.name_;
+
+	string new_column  = "ALTER TABLE " + table + " ADD COLUMN " + field + " ";
+
+	switch(rep.type_)
+	{
+		case TeSTRING:	new_column += "VARCHAR(" + Te2String(rep.numChar_) + ")";
+						break;
+		case TeREAL:	new_column += "FLOAT8";
+						break;
+		case TeINT:		new_column += "INTEGER";
+						break;
+		case TeBLOB:	//new_column += "OID";
+						new_column += "BYTEA";
+						break;
+		default:		new_column += "VARCHAR";
+						break;
+	}
+
+	return this->execute(new_column);
+}
+
+bool TePostgreSQL::createRelation(const string& relName, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion)
+{
+	errorMessage_ = "";
+
+	string alter  = "ALTER TABLE " +  table + " ADD CONSTRAINT " + relName + " ";
+	       alter += "FOREIGN KEY (" + fieldName + ") "; 
+	       alter += "REFERENCES " + relatedTable + "(" + relatedField + ") ";
+
+	if(cascadeDeletion)
+		alter += " ON DELETE CASCADE";
+
+	return execute(alter);
+}
+
+TeDBRelationType TePostgreSQL::existRelation(const string& /*tableName*/, const string& relName)
+{
+	errorMessage_ = "";
+
+	string sql  = "SELECT proname FROM pg_trigger, pg_proc WHERE tgconstrname = '" + relName + "' AND pg_trigger.tgfoid = pg_proc.oid AND pg_proc.proname LIKE 'RI_FKey_cascade_del%'";
+	TeDBRelationType resp = TeNoRelation;
+
+	TePGRecordset r(sql, &tepg_connection_);
+	if(r.recordCount() > 0)
+		resp = TeRICascadeDeletion; 
+	else
+	{
+		sql  = "SELECT proname FROM pg_trigger, pg_proc WHERE tgconstrname = '" + relName + "' AND pg_trigger.tgfoid = pg_proc.oid AND pg_proc.proname LIKE 'RI_FKey_check_ins%'";
+		r.open(sql, &tepg_connection_);
+		if(r.recordCount() > 0)
+			resp = TeRINoCascadeDeletion; 
+	}
+
+	r.close();
+	
+	return resp;
+}
+
+bool TePostgreSQL::execute(const string &sql)
+{
+	try
+	{
+		//TeWriteToFile("EXECS.SQL", sql + "\n", "aw");
+
+		this->tepg_connection_.exec_cmd(sql);
+		
+		
+	}
+
+	catch(...)
+	{
+		return false;
+	}
+
+	return true;
+}
+
+TeDatabasePortal* TePostgreSQL::getPortal()
+{
+	errorMessage_ = "";
+
+	TeDatabasePortal *portal = new TePostgreSQLPortal(this);
+
+	return portal;
+}
+
+bool TePostgreSQL::createDatabaseTable()
+{
+	string create  = "CREATE TABLE te_database ";
+           create += "(";
+           create += "  db_version		VARCHAR(50) NOT NULL,";
+           create += "  db_creation		TIMESTAMP   NULL,";
+           create += "  PRIMARY KEY (db_version)";
+           create += ")";
+
+	if(!this->execute(create))
+	{
+		errorMessage_ = "Erro na cria��o da tabela database! Message: " + string(this->tepg_connection_.err_msg());
+		return false;
+	}
+
+	return true;
+}
+
+bool TePostgreSQL::createProjectionTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_projection ";
+	       create += "(";
+		   create += " projection_id    SERIAL,";
+		   create += " name				VARCHAR(255) NOT NULL,";
+		   create += " long0			FLOAT8       NOT NULL,";
+		   create += " lat0				FLOAT8       NOT NULL,";
+		   create += " offx				FLOAT8       NOT NULL,";
+		   create += " offy				FLOAT8       NOT NULL,";
+		   create += " stlat1			FLOAT8       NOT NULL,";
+		   create += " stlat2			FLOAT8       NOT NULL,";
+		   create += " unit				VARCHAR(50)  NOT NULL,";
+		   create += " scale			FLOAT8       NOT NULL,";
+		   create += " hemis			INTEGER      NOT NULL,";
+		   create += " datum			VARCHAR(255) NOT NULL,";
+		   create += " radius			FLOAT8       NOT NULL,";
+		   create += " flattening		FLOAT8       NOT NULL,";
+		   create += " dx				FLOAT8       NOT NULL,";
+		   create += " dy				FLOAT8       NOT NULL,";
+		   create += " dz				FLOAT8       NOT NULL,";
+		   create += " PRIMARY KEY (projection_id)";
+		   create += ")";
+
+	return this->execute(create);
+}
+
+bool TePostgreSQL::createLayerTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_layer ";
+	       create += "(";
+		   create += " layer_id       SERIAL,";
+		   create += " projection_id  INTEGER       NOT NULL,";
+		   create += " name           VARCHAR(255)  NOT NULL,";
+		   create += " lower_x        FLOAT8        NULL,";
+		   create += " lower_y        FLOAT8        NULL,";
+		   create += " upper_x        FLOAT8		NULL,";
+		   create += " upper_y        FLOAT8		NULL,";
+		   create += " initial_time   TIMESTAMP(0)  NULL,";
+		   create += " final_time     TIMESTAMP(0)  NULL,";
+		   create += " PRIMARY KEY (layer_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	return createIndex("te_layer", "layer_projection_idx", "projection_id");
+}
+
+bool TePostgreSQL::createRepresentationTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_representation ";
+		   create += "(";
+		   create += " repres_id         SERIAL,";
+	       create += " layer_id          INTEGER      NOT NULL,";
+		   create += " geom_type         INTEGER      NOT NULL,";
+		   create += " geom_table        VARCHAR(255) NOT NULL,";
+		   create += " description       VARCHAR(255) NULL,";
+		   create += " lower_x           FLOAT8       NOT NULL,";
+		   create += " lower_y           FLOAT8       NOT NULL,";
+		   create += " upper_x           FLOAT8       NOT NULL,";
+   		   create += " upper_y           FLOAT8       NOT NULL,";
+		   create += " res_x             FLOAT8       NULL,";
+		   create += " res_y             FLOAT8       NULL,";
+		   create += " num_cols          INTEGER      NULL ,";
+		   create += " num_rows          INTEGER      NULL,";
+		   create += " initial_time      TIMESTAMP(0) NULL,";
+		   create += " final_time        TIMESTAMP(0) NULL,";		   
+		   create += " PRIMARY KEY (repres_id)";
+		   create += ")";
+
+	if(!execute(create))
+		return false;
+
+	return createIndex("te_representation", "repres_layer_geom_type_idx", "layer_id, geom_type");
+}
+
+bool TePostgreSQL::createViewTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_view ";
+	       create += "(";
+	       create += " view_id			SERIAL,";
+	       create += " projection_id    INTEGER      NULL,";
+		   create += " name				VARCHAR(255) NOT NULL,";
+		   create += " user_name        VARCHAR(255) NULL,"; 
+		   create += " visibility       INTEGER      NULL,";
+		   create += " PRIMARY KEY (view_id)";
+		   create += ")";
+
+    if(!this->execute(create))
+		return false;
+
+	return createIndex("te_view", "view_index", "name, user_name");
+}
+
+bool TePostgreSQL::createThemeTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_theme ";
+	       create += "(";
+		   create += " theme_id                 SERIAL,";
+		   create += " layer_id                 INTEGER       NULL,";         
+		   create += " view_id                  INTEGER       NOT NULL,";
+		   create += " name                     VARCHAR(255)  NOT NULL,";
+		   create += " parent_id                INTEGER       NULL,";
+		   create += " priority                 INTEGER       NULL,";
+		   create += " node_type                INTEGER       NULL,";
+		   create += " min_scale                FLOAT8        NULL,";
+		   create += " max_scale                FLOAT8        NULL,";
+		   create += " generate_attribute_where VARCHAR(500)  NULL,";
+		   create += " generate_spatial_where   VARCHAR(500)  NULL,";
+		   create += " generate_temporal_where  VARCHAR(255)  NULL,";
+           create += " collection_table         VARCHAR(255)  NULL,";
+		   create += " visible_rep				INTEGER       NULL,";
+		   create += " enable_visibility		INTEGER       NULL,";
+		   create += " PRIMARY KEY (theme_id)";
+		   create += ")";
+
+	if(!execute(create))
+		return false;
+
+	if(!createIndex("te_theme", "theme_layer_idx", "layer_id"))
+		return false;
+
+	return createIndex("te_theme", "theme_view_idx", "view_id");
+}
+
+bool TePostgreSQL::createGroupingTable()
+{
+    errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_grouping ";
+	       create += "(";
+		   create += " theme_id                 INTEGER       NOT NULL,";
+		   create += " grouping_number          INTEGER       NULL,";         
+		   create += " grouping_attr            VARCHAR(255)  NULL,";
+		   create += " grouping_attr_type       INTEGER       NULL,";
+		   create += " grouping_mode            INTEGER       NULL,";
+		   create += " grouping_norm_attr       VARCHAR(255)  NULL,";
+		   create += " grouping_std_dev         FLOAT8        DEFAULT 0.0,";
+		   create += " grouping_precision       INTEGER       NULL,";
+		   create += " grouping_function		VARCHAR(50)   NULL,";
+		   create += " PRIMARY KEY (theme_id)";
+		   create += ")";
+
+	return execute(create);
+}
+
+bool TePostgreSQL::createThemeTablesTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_theme_table ";
+	       create += "(";
+	       create += " theme_table_id	SERIAL,";
+	       create += " theme_id			INTEGER	 NOT NULL,";
+		   create += " table_id			INTEGER	 NOT NULL,";
+		   create += " relation_id      INTEGER  NULL,"; 
+		   create += " table_order      INTEGER  NOT NULL,";
+		   create += " PRIMARY KEY (theme_table_id)";
+		   create += ")";
+
+    if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	if(!createIndex("te_theme_table", "te_theme_table_theme_idx", "theme_id"))
+		return false;
+
+	if(!createIndex("te_theme_table", "te_theme_table_table_idx", "table_id"))
+		return false;
+
+	return createIndex("te_theme_table", "te_theme_table_relation_idx", "relation_id");
+}
+
+bool TePostgreSQL::createLegendTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_legend ";
+	       create += "(";
+		   create += " legend_id		SERIAL,";
+		   create += " theme_id         INT          NOT NULL,";
+		   create += " group_id         INT          NULL,";
+		   create += " num_objs         INT          NULL,";
+		   create += " lower_value      VARCHAR(255) NULL,";
+		   create += " upper_value      VARCHAR(255) NULL,";
+		   create += " label			VARCHAR(255) NULL,";
+		   create += " PRIMARY KEY (legend_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	return createIndex("te_legend", "te_legend_theme_idx", "theme_id");
+}
+
+bool TePostgreSQL::createVisualTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_visual";
+	       create += "(";
+		   create += " legend_id		INT          NOT NULL,";
+		   create += " geom_type		INT          NOT NULL,";
+		   create += " lib_name         VARCHAR(255) NULL,";
+		   create += " symb_id          INTEGER      NULL,";
+		   create += " red              INT          NULL,";
+		   create += " green            INT          NULL,";
+		   create += " blue             INT          NULL,";
+		   create += " transparency     INT          NULL,";
+		   create += " width            INT          NULL,";
+		   create += " contour_lib_name VARCHAR(255) NULL,";
+		   create += " contour_symb_id  INTEGER      NULL,";
+		   create += " contour_red      INT          NULL,";
+		   create += " contour_green    INT          NULL,";
+		   create += " contour_blue     INT          NULL,";
+		   create += " contour_transp   INT          NULL,";
+		   create += " contour_width    INT          NULL,";
+		   create += " size_value       INT          NULL,";
+		   create += " pt_angle         INT          NULL,";
+		   create += " family           VARCHAR(255) NULL,";
+		   create += " bold             INT          NULL,";
+		   create += " italic           INT          NULL,";
+		   create += " alignment_vert   FLOAT8       NULL,";
+		   create += " alignment_horiz  FLOAT8       NULL,";
+		   create += " tab_size         INT          NULL,";
+		   create += " line_space       INT          NULL,";
+		   create += " fixed_size       INT          NULL,";		   
+		   create += " PRIMARY KEY (legend_id, geom_type)";
+		   create += ")";
+
+	return this->execute(create);
+}
+
+bool TePostgreSQL::createVisualRasterTable()
+{
+	string create  = "CREATE TABLE te_visual_raster (";
+	       create += " theme_id		INT NOT NULL,";
+	       create += " band_in		INT NOT NULL,";
+	       create += " band_out		INT,";
+	       create += " transf_type	INT,";
+	       create += " param1		FLOAT8,";
+	       create += " param2		FLOAT8,";
+	       create += " lut_table	VARCHAR(255),";
+	       create += " PRIMARY KEY (theme_id, band_in))";
+
+	return execute(create);
+}
+
+bool TePostgreSQL::createLayerTableTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_layer_table ";
+	       create += "(";
+		   create += " table_id          SERIAL,";
+		   create += " layer_id			 INT		   NULL,";
+		   create += " attr_table		 VARCHAR(255)  NOT NULL,";
+		   create += " unique_id         VARCHAR(255)  NULL,";
+		   create += " attr_link		 VARCHAR(255)  NULL,";
+		   create += " attr_initial_time VARCHAR(255)  NULL,";
+		   create += " attr_final_time   VARCHAR(255)  NULL,";
+		   create += " attr_time_unit    INT           NULL,";
+		   create += " attr_table_type   INT		   NULL,";
+		   create += " user_name         VARCHAR(255)  NULL,";
+		   create += " initial_time      TIMESTAMP(0)  NULL,";
+		   create += " final_time        TIMESTAMP(0)  NULL,";
+		   create += " PRIMARY KEY (table_id)";
+		   create += ")";
+
+	if(!execute(create))
+		return false;
+
+	return createIndex("te_layer_table", "te_layer_table_layer_idx", "layer_id");
+}
+
+bool TePostgreSQL::createTablesRelationTable()
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE te_tables_relation ";
+	       create += "(";
+		   create += " relation_id		    SERIAL,";
+		   create += " related_table_id     INTEGER       NOT NULL,";
+		   create += " related_attr		    VARCHAR(255)  NOT NULL,";
+		   create += " external_table_name  VARCHAR(255)  NOT NULL,";
+		   create += " external_attr        VARCHAR(255)  NOT NULL,";
+		   create += " PRIMARY KEY (relation_id)";
+		   create += ")";
+
+	return this->execute(create);
+}
+
+bool TePostgreSQL::createPolygonGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id    VARCHAR(255) NULL,";
+		   create += " num_coords   INTEGER      NOT NULL,";
+		   create += " num_holes    INTEGER      NOT NULL,";
+		   create += " parent_id    INTEGER      NOT NULL,";
+		   create += " lower_x      FLOAT8       NOT NULL,";
+		   create += " lower_y      FLOAT8       NOT NULL,";
+		   create += " upper_x      FLOAT8       NOT NULL,";
+		   create += " upper_y      FLOAT8       NOT NULL,";
+		   create += " ext_max      FLOAT8       NOT NULL,";
+		   create += " spatial_data POLYGON,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_ext_max", "ext_max"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::createLineGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id    VARCHAR(255) NULL,";
+		   create += " num_coords   INTEGER      NOT NULL,";
+		   create += " lower_x      FLOAT8       NOT NULL,";
+		   create += " lower_y      FLOAT8       NOT NULL,";
+		   create += " upper_x      FLOAT8       NOT NULL,";
+		   create += " upper_y      FLOAT8       NOT NULL,";
+		   create += " ext_max      FLOAT8       NOT NULL,";
+		   create += " spatial_data POLYGON,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_ext_max", "ext_max"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::createPointGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id	VARCHAR(255)  NULL,";
+		   create += " x		    FLOAT8         DEFAULT 0.0,";
+		   create += " y            FLOAT8        DEFAULT 0.0,";		   
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+
+	if(!this->execute(create))
+		return false;
+	
+	if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_xy", "x, y"))
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::createCellGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		SERIAL,";
+		   create += " object_id    VARCHAR(255) NULL,";
+		   create += " lower_x      FLOAT8       NOT NULL,";
+		   create += " lower_y      FLOAT8       NOT NULL,";
+		   create += " upper_x      FLOAT8       NOT NULL,";
+		   create += " upper_y      FLOAT8       NOT NULL,";
+	       create += " col_number   INTEGER      NOT NULL,";
+	       create += " row_number	INTEGER      NOT NULL,";
+	       create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_rc", "row_number, col_number"))
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::createTextGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id		   SERIAL,";
+		   create += " object_id       VARCHAR(255)  NULL,";
+		   create += " x			   FLOAT8        DEFAULT 0.0,";
+		   create += " y			   FLOAT8        DEFAULT 0.0,";
+		   create += " text_value      VARCHAR(255)  NULL,";
+		   create += " height		   FLOAT8        DEFAULT 0.0,";
+		   create += " angle		   FLOAT8        DEFAULT 0.0,";
+		   create += " alignment_vert  FLOAT8		 NULL,";
+		   create += " alignment_horiz FLOAT8		 NULL,";		   
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	if(!createIndex(tableName, tableName + "_idx_obj", "object_id"))
+		return false;
+
+	return createIndex(tableName, tableName + "_idx_xy", "x, y");
+}
+
+bool TePostgreSQL::createArcGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id    SERIAL,";
+		   create += " object_id  VARCHAR(255) NULL,";
+		   create += " from_node  INT          NOT NULL,";
+		   create += " to_node    INT          NOT NULL,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	if(!createIndex(tableName, tableName + "obj_idx", "object_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "fn_idx", "from_node"))
+		return false;
+
+	return createIndex(tableName, tableName + "tn_idx", "to_node");
+}
+
+bool TePostgreSQL::createNodeGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id    SERIAL,";
+		   create += " object_id  VARCHAR(255) NULL,";
+		   create += " x		  FLOAT8       DEFAULT 0.0,";
+		   create += " y		  FLOAT8       DEFAULT 0.0,";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_obj_id", "object_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_xy", "x, y"))
+		return false;
+
+	return true;	
+}
+
+bool TePostgreSQL::createRasterGeometry(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " geom_id           SERIAL,";
+		   create += " object_id         VARCHAR(255) NULL,";
+		   create += " raster_table      VARCHAR(255) NULL,";
+		   create += " lut_table		 VARCHAR(255) NULL,";		   
+		   create += " res_x             FLOAT8       DEFAULT 0.0,";
+		   create += " res_y		     FLOAT8       DEFAULT 0.0,";		   
+		   create += " num_bands         INTEGER      NULL,";
+		   create += " num_cols          INTEGER      NULL,";
+		   create += " num_rows          INTEGER      NULL,";
+		   create += " block_height      INTEGER      NULL,";
+		   create += " block_width       INTEGER      NULL,";
+		   create += " lower_x           FLOAT8       NOT NULL,";
+		   create += " lower_y           FLOAT8       NOT NULL,";
+		   create += " upper_x           FLOAT8       NOT NULL,";
+		   create += " upper_y           FLOAT8       NOT NULL,";
+		   create += " tiling_type       INTEGER, ";
+		   create += " PRIMARY KEY (geom_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+	return createIndex(tableName, tableName + "_idx_obj", "object_id");
+}
+
+bool TePostgreSQL::createRasterMetadataTable(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName;
+	       create += "(";
+		   create += " geom_id          INTEGER       NOT NULL,";
+		   create += " band_id          INTEGER       NOT NULL,";
+		   create += " min_value        FLOAT8        DEFAULT 0.0,";
+		   create += " max_value        FLOAT8        DEFAULT 0.0,";
+		   create += " num_bits         INTEGER       NULL,";
+		   create += " data_type        INTEGER       NULL,";
+		   create += " photometric_type INTEGER       NULL,";
+		   create += " compression_type INTEGER       NULL,";
+		   create += " dummy            FLOAT8        DEFAULT 0.0,";
+		   create += " PRIMARY KEY (geom_id, band_id)";
+		   create += ")";
+
+	return this->execute(create);
+}
+
+bool TePostgreSQL::createRasterTable(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " block_id          VARCHAR(50) NOT NULL,";
+		   create += " lower_x           FLOAT8      NOT NULL,";
+	       create += " lower_y           FLOAT8      NOT NULL,";
+	       create += " upper_x           FLOAT8      NOT NULL,";
+	       create += " upper_y           FLOAT8      NOT NULL,";
+		   create += " band_id		     INTEGER     NOT NULL,";		   
+		   create += " resolution_factor INTEGER     NOT NULL,";
+		   create += " subband		     INTEGER     NOT NULL,";		   
+		   //create += " spatial_data      OID,";
+		   create += " spatial_data      BYTEA,";
+		   create += " block_size        INTEGER  NOT NULL,";
+		   create += " PRIMARY KEY (block_id)";
+		   create += ")";
+
+
+	if(!execute(create))
+		return false;
+
+	//creates indexes
+	if(!createIndex(tableName, tableName + "_idx_band", "band_id"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_subband", "subband"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_resfactor", "resolution_factor"))
+		return false;
+
+	if(!createIndex(tableName, tableName + "_idx_box", "lower_x, lower_y, upper_x, upper_y"))
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::createCollectionTable(const string& tableName)
+{
+	errorMessage_ = "";
+
+	string create  = "CREATE TABLE " + tableName + " ";
+	       create += "(";
+		   create += " c_object_id		VARCHAR(255) NOT NULL,";
+		   create += " c_legend_id		INT          NULL,";
+		   create += " label_x			FLOAT8       NULL,";
+		   create += " label_y			FLOAT8       NULL,";
+           create += " c_legend_own     INT          NULL,";
+		   create += " c_object_status  INT          NULL,";
+		   create += " PRIMARY KEY (c_object_id)";
+		   create += ")";
+
+	if(!this->execute(create))
+		return false;
+
+	//creates indexes
+
+	return createIndex(tableName, tableName + "_idx_legend", "c_legend_id");
+}
+
+bool TePostgreSQL::insertRelationInfo(const int tableId, const string& tField, const string& rTable, const string& rField, int& relId)
+{
+	// check if relation already exists
+	TePostgreSQLPortal* portal = (TePostgreSQLPortal*)this->getPortal();
+
+	if(!portal)
+		return false;
+
+	relId = -1;
+	
+	string sel = "SELECT relation_id FROM te_tables_relation WHERE";
+	sel += " related_table_id = " + Te2String(tableId);
+	sel += " AND related_attr = '" + tField + "'";
+	sel += " AND external_table_name = '" + rTable + "'";
+	sel += " AND external_attr = '" + rField + "'";
+
+	if(!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+
+	if(portal->fetchRow())
+	{
+		relId = atoi(portal->getData("relation_id"));
+		delete portal;
+		return true;
+	}
+
+	delete portal;
+
+	string sql =  "INSERT INTO te_tables_relation (related_table_id, related_attr, external_table_name, external_attr) VALUES(";
+	       sql += Te2String(tableId);
+		   sql += ", '";
+		   sql += tField;
+		   sql += "', '";
+		   sql += rTable;
+		   sql += "', '";
+		   sql += rField;
+		   sql += "')";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_tables_relation_relation_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+
+		if(rec.recordCount() > 0)
+			relId = rec.getInt(0);
+
+		rec.close();
+	}
+	else
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::insertTableInfo(int layerId, TeTable& table, const string& user)
+{
+	errorMessage_ = "";
+
+	if(table.name().empty())
+		return false;
+
+	if(table.id() <= 0)
+	{
+		string sql  = "INSERT INTO te_layer_table (";
+		
+		if(layerId > 0)
+		{
+			sql += "layer_id, ";
+		}
+
+		sql += "attr_table, unique_id, attr_link, attr_initial_time, attr_final_time, ";
+		sql += "attr_time_unit, attr_table_type, user_name) VALUES(";
+		
+		if(layerId > 0)
+		{
+			sql += Te2String(layerId) + ", ";
+		}	
+		
+		sql += "'" + table.name();
+		sql += "', '" + table.uniqueName();		
+		sql += "', '";
+		sql += table.linkName();
+		sql += "', '";
+		sql += table.attInitialTime();
+		sql += "', '";
+		sql += table.attFinalTime();
+		sql += "', ";
+		sql += Te2String(table.attTimeUnit());
+		sql += ", ";
+		sql += Te2String(table.tableType());
+		sql += ", '";
+		sql += user;
+		sql += "')";
+
+		if(this->execute(sql))
+		{
+			sql = "SELECT currval('te_layer_table_table_id_seq')";
+			TePGRecordset rec;
+			rec.open(sql, &tepg_connection_);
+
+			if(rec.recordCount() > 0)
+				table.setId(rec.getInt(0));
+
+			rec.close();
+		}
+		else
+			return false;
+	}
+	
+	return true;	
+}
+
+bool TePostgreSQL::insertTable(TeTable &table)
+{
+	string tableName = table.name();
+	TeAttributeList att = table.attributeList();
+	TeAttributeList::iterator it = att.begin();
+
+	TeTableRow row;
+	unsigned int i;
+	unsigned int j;
+	for ( i = 0; i < table.size(); i++  )
+	{
+		row = table[i];
+		it = att.begin();
+		string q = 	"INSERT INTO "+tableName+" values(";
+		j = 1;
+		int jj = 0;
+		string dt = "";
+		while ( it != att.end() )
+		{
+			if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
+			{
+				const string temp_dt = string(row[jj].c_str());
+				TeTime t(temp_dt, (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_, (*it).timeSeparator_, (*it).indicatorPM_);
+				dt=t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-");
+			}
+
+  			switch ((*it).rep_.type_)
+  			{
+  				case TeSTRING:
+					q += "'"+this->escapeSequence(row[jj])+"'";
+  				break;
+  				case TeREAL:
+					q += "'"+row[jj]+"'";
+  				break;
+  				case TeINT:
+					q += "'"+row[jj]+"'";
+  				break;
+				case TeDATETIME:
+					q += "'"+dt+"'";   
+  				break;
+				default:
+					q += "'"+this->escapeSequence(row[jj])+"'";
+  				break;
+  			}
+			if (j<att.size())
+				q+= ",";
+			++it;
+			j++;
+			jj++;
+		}
+		q += ")";
+		if (!this->execute(q))
+//			return false;
+			continue;
+	}
+	return true;
+}
+
+bool TePostgreSQL::alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName)
+{
+	if(!tableExist(tableName))
+		return false;
+
+	string tab;
+
+	if(!oldColName.empty())
+	{
+		tab  = " ALTER TABLE " + tableName + " RENAME COLUMN ";
+		tab += oldColName +  " TO " + rep.name_;
+	}
+	else
+	{
+		tab  = " ALTER TABLE " + tableName + " ALTER COLUMN ";
+		tab += rep.name_ + " TYPE ";
+
+		switch (rep.type_)
+		{
+			case TeSTRING:
+				tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+				break;
+				
+			case TeREAL:
+				tab += "FLOAT8";	
+				break;
+				
+			case TeINT:
+				tab += "INTEGER";
+				break;
+
+			case TeDATETIME:
+				tab += "TIMESTAMP(0)";
+				break;
+
+			case TeCHARACTER:
+				tab += "CHAR";
+				break;
+
+			case TeBLOB:
+				tab += "BYTEA";
+				break; 
+			
+			default:
+				tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+				break;
+		}	
+	}
+
+	
+
+	if(!execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error alter table " + tableName + " !";
+
+		return false;
+	}
+
+	string tableId;
+	TeDatabasePortal* portal = getPortal();
+	string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + tableName + "'";
+	if(portal->query(sql) && portal->fetchRow())
+		tableId = portal->getData(0);
+
+	delete portal;
+
+	if(tableId.empty() == false)
+	{
+		if(oldColName.empty() == false) // column name changed
+		{
+			 // update relation
+			sql = "UPDATE te_tables_relation SET related_attr = '" + rep.name_ + "'";
+			sql += " WHERE related_table_id = " + tableId;
+			sql += " AND related_attr = '" + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+
+			sql = "UPDATE te_tables_relation SET external_attr = '" + rep.name_ + "'";
+			sql += " WHERE external_table_name = '" + tableName + "'";
+			sql += " AND external_attr = '" + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+
+			 // update grouping
+			sql = "UPDATE te_grouping SET grouping_attr = '" + tableName + "." + rep.name_ + "'";
+			sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+		}
+		else // column type changed
+		{
+			// delete relation
+			sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
+			sql += " AND related_attr = '" + rep.name_ + "')";
+			sql += " OR (external_table_name = '" + tableName + "'";
+			sql += " AND external_attr = '" + rep.name_ + "')";
+			if(execute(sql) == false)
+				return false;
+
+			// delete grouping
+			TeDatabasePortal* portal = getPortal();
+			sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+			if(portal->query(sql) && portal->fetchRow())
+			{
+				string themeId = portal->getData(0);
+
+				sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
+				if(execute(sql) == false)
+				{
+					delete portal;
+					return false;
+				}
+			}
+			delete portal;
+
+			sql = "DELETE FROM te_grouping";
+			sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+		}
+	}
+	return true;
+}
+
+
+
+bool TePostgreSQL::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size)
+{
+	errorMessage_ = "";
+
+	TePostgreSQLPortal* portal = static_cast<TePostgreSQLPortal*>(this->getPortal());
+	
+	if(!portal)
+		return false;
+
+	string q = "SELECT * FROM "+ tableName +" WHERE "+ columnId.name_ +" = ";
+	
+	switch(columnId.type_ )
+	{
+		case TeSTRING:
+			q += "'"+ valueId + "'";
+			break;
+		default:
+			q += valueId;
+			break;
+	}
+
+	if((!portal->query(q)) || (!portal->fetchRow()))
+	{
+		delete portal;
+		return false;
+	}
+
+//	int exist = portal->getInt(columnBlob);
+
+	delete portal;
+
+	size_t newLen = 0;
+
+	unsigned char* newbuf = TePGConnection::escapeBytea(data, size, &newLen);
+
+	string sql  = "UPDATE ";
+	       sql += tableName;
+	       sql += " SET ";
+	       sql += columnBlob;
+	       sql += " = '";
+	       sql += (char*)newbuf;
+		   sql += "' WHERE ";
+		   sql += columnId.name_;
+		   sql += " = ";
+
+	switch (columnId.type_ )
+	{	
+		case TeSTRING:  sql += "'"+ valueId + "'";
+						break;
+
+		default:		sql += valueId;
+	}
+
+	if(!execute(sql))
+	{
+		TePGConnection::freeMem(newbuf);
+
+		errorMessage_ = "Couldn't update blob!";
+
+		return false;
+	}
+
+	TePGConnection::freeMem(newbuf);
+
+	return true;
+}
+
+bool TePostgreSQL::insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName)
+{
+	unsigned char	*cdata = 0;
+	int		size;
+	FILE	*fp = 0;
+	
+	struct	stat buf;
+	int		result;
+	
+	result = stat(fileName.c_str(), &buf);
+	
+	if(result != 0)
+		return false;
+	
+	size = buf.st_size;
+
+	cdata = new unsigned char[size];
+	fp = fopen(fileName.c_str(), "rb");
+	fread(cdata, sizeof(unsigned char), size, fp); 
+
+	bool status = insertBlob(tableName, columnBlob, columnId,  valueId, cdata, size);
+
+	if(fp)
+		fclose(fp);
+
+	if(cdata)
+		delete [] cdata;
+
+	return status;
+}
+
+bool TePostgreSQL::insertProjection(TeProjection *proj)
+{
+	errorMessage_ = "";
+
+	TeProjectionParams par = proj->params();
+
+	string sql  = "INSERT INTO te_projection (name, long0, lat0, offx, ";
+		   sql += "offy, stlat1, stlat2, unit, scale, ";
+		   sql += "hemis, datum, radius, flattening, ";
+		   sql += "dx, dy, dz) VALUES('";
+		   sql += proj->name();
+		   sql += "', ";
+		   sql += Te2String(par.lon0*TeCRD);
+		   sql += ", ";
+		   sql += Te2String(par.lat0*TeCRD);
+		   sql += ", ";
+		   sql += Te2String(par.offx);
+		   sql += ", ";
+		   sql += Te2String(par.offy);
+		   sql += ", ";
+		   sql += Te2String(par.stlat1*TeCRD);
+		   sql += ", ";
+		   sql += Te2String(par.stlat2*TeCRD);
+		   sql += ", '";
+		   sql += par.units;
+		   sql += "', ";
+		   sql += Te2String(par.scale);
+		   sql += ", ";
+		   sql += Te2String(par.hemisphere);
+		   sql += ", '";
+		   sql += proj->datum().name();
+		   sql += "', ";
+		   sql += Te2String(proj->datum().radius());
+		   sql += ", ";
+		   sql += Te2String(proj->datum().flattening());
+		   sql += ", ";
+		   sql += Te2String(proj->datum().xShift());
+		   sql += ", ";
+		   sql += Te2String(proj->datum().yShift());
+		   sql += ", ";
+		   sql += Te2String(proj->datum().zShift());
+		   sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_projection_projection_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			proj->id(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+		
+	return true;	
+}
+
+bool TePostgreSQL::insertLayer(TeLayer *layer)
+{
+	errorMessage_ = "";
+
+	TeProjection* proj = layer->projection();
+	if (!proj || !insertProjection(proj))
+	{
+		errorMessage_ = "N�o � poss�vel inserir layer sem proje��o";
+		return false;
+	}
+
+	string sql  = "INSERT INTO te_layer (projection_id, name, lower_x, lower_y, upper_x, ";
+		   sql += "upper_y) VALUES(";
+		   sql += Te2String(proj->id());
+		   sql += ", '";
+		   sql += layer->name();
+	       sql += "', ";
+	       sql += Te2String(layer->box().x1());
+	       sql += ", ";
+	       sql += Te2String(layer->box().y1());
+	       sql += ", ";
+	       sql += Te2String(layer->box().x2());
+	       sql += ", ";
+	       sql += Te2String(layer->box().y2());
+	       sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_layer_layer_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+		{
+			layer->id(rec.getInt(0));
+		}
+		rec.close();
+	}
+	else
+		return false;
+
+	layerMap_[layer->id()] = layer;
+
+	return true;	
+}
+
+bool TePostgreSQL::insertRepresentation(int layerId, TeRepresentation& rep)
+{	
+	errorMessage_ = "";
+
+	if(layerId <= 0)
+		return false;
+	
+
+	string sql  = "INSERT INTO te_representation (layer_id, geom_type, geom_table, description, lower_x, ";
+		   sql += "lower_y, upper_x, upper_y, res_x, res_y, num_cols, num_rows) VALUES(";
+		   sql += Te2String(layerId);
+		   sql += ", ";
+		   sql += Te2String(static_cast<long>(rep.geomRep_));
+		   sql += ", '";
+		   sql += rep.tableName_;
+		   sql += "', '";
+		   sql += rep.description_;		   
+		   sql += "', ";
+           sql += Te2String(rep.box_.x1());
+		   sql += ", ";
+		   sql += Te2String(rep.box_.y1());
+		   sql += ", ";
+		   sql += Te2String(rep.box_.x2());
+		   sql += ", ";
+		   sql += Te2String(rep.box_.y2());
+		   sql += ", ";
+		   sql += Te2String(rep.resX_);
+		   sql += ", ";
+		   sql += Te2String(rep.resY_);
+		   sql += ", ";
+		   sql += Te2String(static_cast<long>(rep.nCols_));
+		   sql += ", ";
+		   sql += Te2String(static_cast<long>(rep.nLins_));
+		   sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_representation_repres_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			rep.id_ = rec.getInt(0);
+
+		rec.close();
+	}
+	else
+		return false;
+
+	return true;		
+}
+
+bool TePostgreSQL::insertView(TeView *view)
+{
+	errorMessage_ = "";
+
+	// save it�s projection
+	TeProjection* proj = view->projection();
+	if ( !proj || !insertProjection(proj))
+	{
+		errorMessage_ = "N�o � poss�vel inserir vista sem proje��o";
+		return false;
+	}
+
+	string sql  = "INSERT INTO te_view (projection_id, name, user_name, visibility) VALUES(";
+	       sql += Te2String(proj->id());
+		   sql += ", '";
+		   sql += view->name();
+		   sql += "', '";
+		   sql += view->user();
+		   sql += "', ";
+		   sql += Te2String(view->isVisible());
+		   sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_view_view_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+		{
+			view->id(rec.getInt(0));
+		}
+		rec.close();
+	}
+	else
+		return false;
+
+	for(unsigned int th = 0; th < view->size(); ++th)
+	{
+		TeViewNode* node = view->get (th);
+		if (node->type() == TeTHEME)
+		{
+			TeTheme *theme = (TeTheme*) node;
+			insertTheme (theme);
+		}
+		else
+		{
+			TeViewTree* tree = (TeViewTree*)node;
+			insertViewTree (tree);
+		}
+	}
+
+	viewMap_[view->id()] = view;
+
+	return true;
+}
+
+bool TePostgreSQL::insertViewTree(TeViewTree *tree)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO te_theme (view_id, name, parent_id, priority, node_type) VALUES(";
+
+		   sql += Te2String(tree->view());
+		   sql += ", '";
+	       sql += tree->name();
+	       sql += "', ";
+	       sql += Te2String(tree->parentId());
+	       sql += ", ";
+		   sql += Te2String(tree->priority());
+	       sql += ", ";
+	       sql += Te2String(tree->type());
+	       sql += ", ";
+	       
+	       sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_theme_theme_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			tree->id(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+		
+	return true;	
+}
+
+bool TePostgreSQL::insertThemeGroup(TeViewTree* tree)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO te_theme (layer_id, view_id, name, parent_id, priority, node_type) VALUES(";
+	       sql += "1";
+		   sql += ", ";
+		   sql += Te2String(tree->view());
+		   sql += ", '";
+	       sql += tree->name();
+	       sql += "', ";
+	       sql += Te2String(tree->parentId());
+	       sql += ", ";
+		   sql += Te2String(tree->priority());
+	       sql += ", ";
+	       sql += "1";
+	       sql += ", ";
+	       
+	       sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_theme_theme_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			tree->id(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+		
+	return true;	
+
+}
+
+bool TePostgreSQL::insertTheme(TeTheme *theme)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO te_theme (layer_id, view_id, name, parent_id, priority, node_type, ";
+	       sql += "min_scale, max_scale, generate_attribute_where, generate_spatial_where, ";
+		   sql += "generate_temporal_where, collection_table, visible_rep, enable_visibility) VALUES(";
+		   sql += Te2String(theme->layerId());
+		   sql += ", ";
+		   sql += Te2String(theme->view());
+		   sql += ", '";
+		   sql += theme->name();
+		   sql += "', ";
+		   sql += Te2String(theme->parentId());
+		   sql += ", ";
+		   sql += Te2String(theme->priority());
+		   sql += ", ";
+		   sql += Te2String(theme->type());
+		   sql += ", ";
+		   sql += Te2String(theme->minScale());
+		   sql += ", ";
+		   sql += Te2String(theme->maxScale());
+		   sql += ", '";
+		   sql += escapeSequence(theme->attributeRest());
+		   sql += "', '";
+		   sql += escapeSequence(theme->spatialRest());
+		   sql += "', '";
+		   sql += escapeSequence(theme->temporalRest());
+		   sql += "', '";
+		   sql += theme->collectionTable();
+		   sql += "', ";
+		   sql += Te2String(theme->visibleRep());
+		   sql += ", ";
+		   sql += Te2String(theme->visibility());
+		   sql += " )";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_theme_theme_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+		{
+			theme->id(rec.getInt(0));
+		}
+		rec.close();
+	}
+	else
+		return false;
+
+
+	if(theme->collectionTable().empty())
+	{
+		sql  = "UPDATE te_theme SET collection_table = '";
+		sql += "te_collection_";
+		sql += Te2String(theme->id());
+		sql += "' WHERE theme_id = ";
+		sql += Te2String(theme->id());
+
+		theme->collectionTable(string("te_collection_") + Te2String(theme->id()));
+
+		if(!this->execute(sql))
+			return false;
+	}
+
+
+	bool status;
+
+	// insert grouping
+	int numSlices = 0;
+	if(theme->grouping())
+	{
+		if(!insertGrouping (theme->id(), theme->grouping()))
+			return false;
+		numSlices = theme->grouping()->groupNumSlices_;
+	}
+		
+	// insert legend
+	theme->outOfCollectionLegend().group(-1); 
+	theme->outOfCollectionLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->outOfCollectionLegend())); 
+	if (!status)
+		return status;
+
+	theme->withoutDataConnectionLegend().group(-2); 
+	theme->withoutDataConnectionLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->withoutDataConnectionLegend())); 
+	if (!status)
+		return status;
+
+	theme->defaultLegend().group(-3); 
+	theme->defaultLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->defaultLegend())); 
+	if (!status)
+		return status;
+
+	theme->pointingLegend().group(-4); 
+	theme->pointingLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->pointingLegend())); 
+	if (!status)
+		return status;
+
+	theme->queryLegend().group(-5); 
+	theme->queryLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->queryLegend())); 
+	if (!status)
+		return status;
+
+	theme->queryAndPointingLegend().group(-6); 
+	theme->queryAndPointingLegend().theme(theme->id()); 
+	status = insertLegend (&(theme->queryAndPointingLegend())); 
+	if (!status)
+		return status;
+
+	for (int i = 0; i < numSlices; i++)
+	{
+		theme->legend()[i].group(i);
+		theme->legend()[i].theme(theme->id());
+		status = insertLegend (&(theme->legend()[i]));
+		if (!status)
+			return status;
+	}
+	if (!status)
+		return status;
+
+	themeMap_[theme->id()] = theme;
+	return updateThemeTable(theme);
+}
+
+bool TePostgreSQL::insertThemeTable(int themeId, int tableId, int relationId, int tableOrder)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO te_theme_table (theme_id, table_id, ";
+
+	if(relationId > 0)
+		sql += "relation_id, ";
+
+	sql += "table_order) VALUES(";
+	sql += Te2String(themeId);
+	sql += ", ";
+	sql += Te2String(tableId);
+	sql += ", ";
+
+	if(relationId > 0)
+	{
+		sql += Te2String(relationId);
+		sql += ", ";
+	}
+
+	sql += Te2String(tableOrder);
+	sql += ")";
+
+	if(this->execute(sql))
+	{
+		//sql = "SELECT currval('te_theme_table_theme_table_id_seq')";
+		//TePGRecordset rec;
+		//rec.open(sql, &tepg_connection_);
+		//if(rec.recordCount() > 0)
+		//{
+		//	tree->id(atoi(rec.value(0)));
+		//}
+		//rec.close();
+	}
+	else
+		return false;
+		
+	return true;	
+}
+
+bool TePostgreSQL::generateLabelPositions(TeTheme *theme)
+{
+	string	geomTable, upd;
+	string	collTable = theme->collectionTable();
+	
+	if((collTable.empty()) || (!tableExist(collTable)))
+		return false;
+
+	if(theme->layer()->hasGeometry(TeCELLS)    || 
+	   theme->layer()->hasGeometry(TePOLYGONS) ||
+	   theme->layer()->hasGeometry(TeLINES))
+	{
+		geomTable = theme->layer()->tableName(TeCELLS);
+		
+		if(geomTable.empty())
+		{
+			geomTable = theme->layer()->tableName(TePOLYGONS);
+			if(geomTable.empty())
+			{
+				geomTable = theme->layer()->tableName(TeLINES);
+
+				if(geomTable.empty())
+					geomTable = theme->layer()->tableName(TePOINTS);
+			}
+		}
+		
+		upd  = " UPDATE " + collTable + " SET ";
+		upd += " label_x = (SELECT MAX(lower_x + (upper_x";
+		upd += " -  lower_x) / 2.0) ";
+		upd += "FROM " + geomTable + " WHERE object_id = c_object_id), ";
+		
+		upd += " label_y = (SELECT MAX(lower_y + (upper_y";
+		upd += " - lower_y) / 2.0) ";
+		upd += "FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+		upd += " WHERE (label_x IS NULL) OR (label_y IS NULL)";
+	}	
+	else
+		if(theme->layer()->hasGeometry(TePOINTS))
+		{
+			geomTable = theme->layer()->tableName(TePOINTS);
+		
+			upd  = " UPDATE " + collTable + " SET ";
+			upd += " label_x = (SELECT MAX(x)";
+			upd += " FROM " + geomTable + " WHERE object_id = c_object_id), ";
+
+			upd += " label_y = (SELECT MAX(y)";
+			upd += " FROM " + geomTable + " WHERE object_id = c_object_id) ";
+
+			upd += " WHERE (label_x IS NULL) OR (label_y IS NULL)";
+		}
+
+	return execute(upd);
+}
+
+bool TePostgreSQL::insertLegend(TeLegendEntry *legend)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO te_legend (theme_id, group_id, num_objs, lower_value, upper_value, ";
+		   sql += "label) VALUES(";
+		   sql += Te2String(legend->theme());
+		   sql += ", ";
+		   sql += Te2String(legend->group());
+		   sql += ", ";
+	   	   sql += Te2String(legend->count());
+		   sql += ", '";
+		   sql += legend->from();
+		   sql += "', '";
+		   sql += legend->to();
+		   sql += "', '";
+		   sql += legend->label();
+		   sql += "')";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('te_legend_legend_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+		{
+			legend->id(rec.getInt(0));
+		}
+		rec.close();
+	}
+	else
+		return false;	
+
+	legendMap_[legend->id()] = legend;
+
+	return insertVisual(legend);
+}
+
+bool TePostgreSQL::insertPolygon(const string& table, TePolygon &p)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(p);
+
+	int parentId = 0;
+
+	for(unsigned int k = 0u; k < p.size(); ++k)
+	{
+		TeLinearRing ring = p[k];
+
+		TeBox b = ring.box();
+
+		unsigned int ringSize = ring.size();
+
+		double extMax = MAX(b.width(), b.height());
+
+		unsigned int numberOfHoles = 0u;
+		
+		if(k == 0u)
+			numberOfHoles = p.size() - 1u;
+
+		string strPol = "";
+
+		Te2PgGeomPolygon(ring, strPol);
+
+		string sql  = "INSERT INTO ";
+		       sql += table;
+			   sql += " (object_id, num_coords, num_holes, parent_id, lower_x, lower_y, upper_x, upper_y, ext_max, spatial_data) VALUES ('";
+			   sql += p.objectId();
+			   sql += "', ";
+			   sql += Te2String(ringSize);
+			   sql += ", ";
+			   sql += Te2String(numberOfHoles);
+			   sql += ", ";
+			   sql += Te2String(parentId);
+			   sql += ", ";
+			   sql += Te2String(b.lowerLeft().x());
+			   sql += ", ";
+			   sql += Te2String(b.lowerLeft().y());
+			   sql += ", ";
+			   sql += Te2String(b.upperRight().x());
+			   sql += ", ";
+			   sql += Te2String(b.upperRight().y());
+			   sql += ", ";
+			   sql += Te2String(extMax);
+			   sql += ", '";
+			   sql += strPol;
+			   sql += "')";
+
+		if(this->execute(sql))
+		{
+			sql = "SELECT currval('" + table + "_geom_id_seq')";
+		
+			TePGRecordset rec;
+			rec.open(sql, &tepg_connection_);
+
+			if(rec.recordCount() > 0)
+				ring.geomId(rec.getInt(0));
+
+			if(k == 0u)
+			{
+				parentId = ring.geomId();
+
+				string newSQL  = "UPDATE " + table + " SET parent_id = ";
+				       newSQL += Te2String(parentId);
+					   newSQL += " WHERE geom_id = ";
+					   newSQL += Te2String(parentId);
+
+				if(!this->execute(newSQL))
+					return false;
+			}
+
+			rec.close();
+		}
+		else
+			return false;
+	}
+
+	return true;
+}
+
+bool TePostgreSQL::updatePolygon(const string& table, TePolygon &p)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(p);
+
+	int parentId = 0;
+
+	for(unsigned int k = 0u; k < p.size(); ++k)
+	{
+		TeLinearRing ring = p[k];
+
+		TeBox b = ring.box();
+
+		unsigned int ringSize = ring.size();
+
+		double extMax = MAX(b.width(), b.height());
+
+		unsigned int numberOfHoles = 0u;
+		
+		if(k == 0u)
+			numberOfHoles = p.size() - 1u;
+
+		string strPol = "";
+
+		Te2PgGeomPolygon(ring, strPol);
+
+		string sql  = "UPDATE " + table + " SET object_id = '";
+		       sql += p.objectId();
+			   sql += "', num_coords = ";
+			   sql += Te2String(ringSize);
+			   sql += ", num_holes = ";
+			   sql += Te2String(numberOfHoles);
+			   sql += ", parent_id = ";
+			   sql += Te2String(parentId);
+			   sql += ", lower_x = ";
+			   sql += Te2String(b.x1_);
+			   sql += ", lower_y = ";
+			   sql += Te2String(b.y1_);
+			   sql += ", upper_x = ";
+			   sql += Te2String(b.x2_);
+			   sql += ", upper_y = ";
+			   sql += Te2String(b.y2_);
+			   sql += ", ext_max = ";
+			   sql += Te2String(extMax);
+			   sql += ", spatial_data = '";
+			   sql += strPol;
+			   sql += "' WHERE geom_id = ";
+			   sql += Te2String(ring.geomId());
+
+		if(!this->execute(sql))
+			return false;
+	}
+
+	return true;
+}
+
+bool TePostgreSQL::insertLine(const string& table, TeLine2D& l)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(l);
+
+	string strLine = "";
+		
+	Te2PgGeomPolygon(l, strLine);
+
+	double extMax = MAX(l.box().width(), l.box().height());
+
+	string sql  = "INSERT INTO " + table + " (object_id, num_coords, lower_x, lower_y, upper_x, upper_y, ext_max, spatial_data) ";
+		   sql += "VALUES('";
+		   sql += l.objectId();
+		   sql += "', ";
+		   sql += Te2String(l.size());
+		   sql += ", ";
+		   sql += Te2String(l.box().x1_);
+		   sql += ", ";
+		   sql += Te2String(l.box().y1_);
+		   sql += ", ";
+		   sql += Te2String(l.box().x2_);
+		   sql += ", ";
+		   sql += Te2String(l.box().y2_);
+		   sql += ", ";
+		   sql += Te2String(extMax);
+		   sql += ", '";
+		   sql += strLine;
+		   sql += "')";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+
+		if(rec.recordCount() > 0)
+			l.geomId(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::updateLine(const string& table, TeLine2D& l)
+{
+	errorMessage_ = "";
+
+	//TeRemoveDuplicatedCoordinates(l);
+
+	string strLine = "";
+	
+	Te2PgGeomPolygon(l, strLine);
+
+	double extMax = MAX(l.box().width(), l.box().height());
+
+	string sql  = "UPDATE " + table + " SET  object_id = '";
+		   sql += l.objectId();
+		   sql += "', num_coords = ";
+		   sql += Te2String(l.size());
+		   sql += ", lower_x = ";
+		   sql += Te2String(l.box().x1_);
+		   sql += ", lower_y = ";
+		   sql += Te2String(l.box().y1_);
+		   sql += ", upper_x = ";
+		   sql += Te2String(l.box().x2_);
+		   sql += ", upper_y = ";
+		   sql += Te2String(l.box().y2_);
+		   sql += ", ext_max = ";
+		   sql += Te2String(extMax);
+		   sql += ", '";
+		   sql += strLine;
+		   sql += "' WHERE geom_id = ";
+		   sql += Te2String(l.geomId());			
+
+	return this->execute(sql);
+}
+
+bool TePostgreSQL::insertPoint(const string& table, TePoint &p)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO " + table + " (object_id, x, y) VALUES('";
+ 		   sql +=  p.objectId();
+		   sql += "', ";
+		   sql += Te2String(p.location().x_);
+		   sql += ", ";
+		   sql += Te2String(p.location().y_);
+		   sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			p.geomId(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+	
+	return true;
+}
+
+bool TePostgreSQL::insertText(const string& table, TeText& t)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO " + table + " (object_id, x, y, text_value, angle, height, alignment_vert, alignment_horiz) VALUES('";
+		   sql += t.objectId();
+		   sql += "', ";
+		   sql += Te2String(t.location().x());
+		   sql += ", ";
+		   sql += Te2String(t.location().y());
+		   sql += ", '";
+		   sql += escapeSequence(t.textValue());
+		   sql += "', ";
+		   sql += Te2String(t.angle());
+		   sql += ", ";
+		   sql += Te2String(t.height());
+		   sql += ", ";
+		   sql += Te2String(t.alignmentVert());
+		   sql += ", ";
+		   sql += Te2String(t.alignmentHoriz());
+		   sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			t.geomId(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+
+	return true;
+}
+
+bool TePostgreSQL::insertArc(const string& table, TeArc& arc)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO " + table + " (object_id, from_node, to_node) VALUES('";
+		   sql += arc.objectId();
+		   sql += "', ";
+		   sql += Te2String(arc.fromNode().geomId());
+	       sql += ", ";
+		   sql += Te2String(arc.toNode().geomId());
+		   sql += ")";
+
+	if(this->execute(sql))
+	{
+		sql = "SELECT currval('" + table + "_geom_id_seq')";
+		TePGRecordset rec;
+		rec.open(sql, &tepg_connection_);
+		if(rec.recordCount() > 0)
+			arc.geomId(rec.getInt(0));
+
+		rec.close();
+	}
+	else
+		return false;
+	
+
+	return true;
+}
+
+bool TePostgreSQL::insertNode(const string& table, TeNode& node)
+{
+	errorMessage_ = "";
+
+	string  sql = "INSERT INTO " + table + " (object_id, x, y) VALUES('";
+			sql += node.objectId();
+			sql += "', ";
+			sql += Te2String(node.location().x_);
+			sql += ", ";
+			sql += Te2String(node.location().y_);
+			sql += ")";
+
+	if(!this->execute(sql))
+		return false;
+
+	sql = "SELECT currval('" + table + "_geom_id_seq')";
+	TePGRecordset rec;
+	rec.open(sql, &tepg_connection_);
+	if(rec.recordCount() > 0)
+		node.geomId(rec.getInt(0));
+
+	rec.close();
+
+	return true;
+}
+
+bool TePostgreSQL::insertCell(const string& table, TeCell &c)
+{
+	errorMessage_ = "";
+
+	string sql  = "INSERT INTO " + table + " (object_id, lower_x, lower_y, upper_x, upper_y, col_number, row_number) VALUES('";
+		   sql += c.objectId();
+		   sql += "', ";
+		   sql += Te2String(c.box().x1_);
+		   sql += ", ";
+		   sql += Te2String(c.box().y1_);
+		   sql += ", ";
+		   sql += Te2String(c.box().x2_);
+		   sql += ", ";
+		   sql += Te2String(c.box().y2_);
+		   sql += ", ";
+		   sql += Te2String(c.column());
+		   sql += ", ";
+		   sql += Te2String(c.line());
+		   sql += ")";
+
+	if(!this->execute(sql))
+		return false;
+
+	sql = "SELECT currval('" + table + "_geom_id_seq')";
+	TePGRecordset rec;
+	rec.open(sql, &tepg_connection_);
+	if(rec.recordCount() > 0)
+		c.geomId(rec.getInt(0));
+	
+	rec.close();	
+
+	return true;
+}
+
+bool TePostgreSQL::insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char* buf, unsigned long size, int band, unsigned int res, unsigned int subband)
+{
+	errorMessage_ = "";
+
+	if (blockId.empty()) 
+	{
+		errorMessage_ = "No block identifier provided!";
+		return false;
+	}
+
+	TePostgreSQLPortal* portal = static_cast<TePostgreSQLPortal*>(this->getPortal());
+	if(!portal)
+		return false;
+
+	bool update = false;
+	string q ="SELECT * FROM " + table; 
+	q += " WHERE block_id='" + blockId + "'";
+
+	if (!portal->query(q))
+	{
+		delete portal;
+		return false;
+	}
+
+	// check if this block is alread in the database
+	if(portal->fetchRow())
+		update = true;
+
+	delete portal;
+
+
+	string sql = "";
+		
+	size_t newLen = 0;
+
+	unsigned char* newbuf = TePGConnection::escapeBytea(buf, size, &newLen);
+
+	if(!update)
+		getInsertRasterBlock(table, blockId, ll, ur, band, res, subband, (char*)newbuf, size, sql);
+	else
+		getUpdateRasterBlock(table, blockId, ll, ur, band, res, subband, (char*)newbuf, size, sql);
+
+
+	if(!execute(sql))
+	{
+		TePGConnection::freeMem(newbuf);
+		errorMessage_ = "Couldn't insert/update a rasterblock!";
+		return false;
+	}
+
+	TePGConnection::freeMem(newbuf);
+
+	return true;
+}
+
+bool TePostgreSQL::createLUTTable(const string& name)
+{
+	errorMessage_ = "";
+
+	string create = "CREATE TABLE " + name + "(";
+	create += "index_id		SERIAL,";
+	create += "r_val		INTEGER NOT NULL,";
+	create += "g_val		INTEGER NOT NULL,";
+	create += "b_val		INTEGER NOT NULL,";
+	create += "PRIMARY KEY (index_id))";
+	
+	return execute(create);
+}
+
+string TePostgreSQL::getSQLStatistics(TeGroupingAttr& attrs)
+{
+	string sql = "";
+	string virg = "";
+
+	TeGroupingAttr::iterator it = attrs.begin();
+	int count = 0;
+	while(it != attrs.end())
+	{
+		if(count > 0)
+			virg = ",";
+
+		string strAux = (*it).first.name_;
+		size_t pos = strAux.find(".");
+		if(pos != string::npos)
+			strAux[pos] = '_';
+
+		switch((*it).second)
+		{
+			case TeSUM:
+				sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMAXVALUE:
+				sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMINVALUE:
+				sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeCOUNT:
+				sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMEAN:
+				sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeSTANDARDDEVIATION:
+				sql += virg +" STDDEV( "+ (*it).first.name_ +") AS STDDEV_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeVARIANCE:
+				sql += virg +" VARIANCE( "+ (*it).first.name_ +") AS VAR_"+ strAux;
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			default:
+				break;
+		}
+		++it;
+
+	}
+
+	return sql;
+}
+
+string TePostgreSQL::getSQLTemporalWhere(TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime)
+{
+	string sql;
+	
+	string t1 = timeInterval.getInitialDateTime("YYYYsMMsDDsHHsmmsSS");
+	string t2 = timeInterval.getFinalDateTime ("YYYYsMMsDDsHHsmmsSS");
+	
+	switch(timeOperator)
+	{
+		case TeTIMEBEFORE:		sql = finalTime +" < '"+ t1 +"'";
+								break;
+
+		case TeTIMEAFTER:		sql = initialTime +" > '"+ t2 +"'";
+								break;
+
+		case TeTIMEEQUAL:       sql = "("+ initialTime +" >= '"+ t1 +"'";
+								sql += " AND "+ initialTime +" <= '"+ t2 +"')";
+								sql += " AND ";
+								sql += "("+ finalTime +" >= '"+ t1 +"'";
+								sql += " AND "+ finalTime +" <= '"+ t2 +"')";
+								break;
+
+		case TeTIMEMEETS:       sql = finalTime +" = '"+ t1 +"'";
+								sql += " OR "+ initialTime +" = '"+ t2 +"'";
+								break;
+
+		case TeTIMEDURING:		sql = initialTime +" > '"+ t1 +"'";
+								sql += " AND "+ initialTime +" < '"+ t2 +"'";
+								sql += " AND "+ finalTime +" > '"+ t1 +"'";
+								sql += " AND "+ finalTime +" < '"+ t2 +"'";
+								break;
+
+		case TeTIMEOVERLAPS:    sql = "("+ initialTime +" < '"+ t1 +"'";
+								sql += " AND "+ finalTime +" > '"+ t1 +"'";
+								sql += " AND "+ finalTime +" < '"+ t2 +"')";
+								sql += " OR ";
+								sql += "("+ initialTime + " > '"+ t1 +"'";
+								sql += " AND "+ initialTime +" < '"+ t2 +"'";
+								sql += " AND "+ finalTime +" > '"+ t2 +"')";
+								break;
+
+		case TeTIMEENDS:		sql = finalTime +" = '"+ t2 +"'";
+								break;
+
+		case TeTIMESTARTS:		sql = initialTime +" = '"+ t1 +"'";
+								break;
+		case TeTIMEUNDEFINED:	
+				return sql;				
+	}
+
+	return sql; 
+}
+
+string TePostgreSQL::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, const string& initialTime, const string& finalTime)
+{
+	string func = " EXTRACT(";
+	string sql;
+
+	switch(chr)
+	{
+		case TeSECOND:		func = "second FROM "; 
+							break;
+		
+		case TeMINUTE:		func = "minute FROM ";
+							break;
+		
+		case TeHOUR:        func = "hour FROM ";
+							break;
+		
+		case TeDAY:         func = "day FROM ";
+							break;
+
+		case TeMONTH:		func = "month FROM ";
+							break;
+
+		case TeYEAR:        func = "year FROM ";	
+							break;
+		default:			return "";
+	}
+
+	switch(rel)
+	{
+		case TeTIMEBEFORE:		sql = func + finalTime + ") < " + Te2String(time1);
+								break;
+		
+		case TeTIMEAFTER:		sql = func + initialTime + ") > " + Te2String(time2);
+								break;
+		
+		case TeTIMEEQUAL:		sql  = func + initialTime + ") = " + Te2String(time1);
+								sql += " AND "+ func + finalTime +") = " + Te2String(time2);
+								break;
+
+		case TeTIMEMEETS:		sql  = func + finalTime + ") = " + Te2String(time1);
+								sql += " OR "+ func + initialTime +") = " + Te2String(time2);
+								break;
+
+		case TeTIMEDURING:		sql  = func + initialTime + ") >= " + Te2String(time1);
+								sql += " AND " + func + initialTime + ") <= " + Te2String(time2);
+								sql += " AND " + func + finalTime + ") >= " + Te2String(time1);
+								sql += " AND " + func + finalTime + ") <= " + Te2String(time2);
+								break;
+
+		case TeTIMEOVERLAPS:    sql  =  "("+ func + initialTime + ") <= " + Te2String(time1);
+								sql += " AND " + func + finalTime + ") >= " + Te2String(time1);
+								sql += " AND " + func + finalTime + ") <= " + Te2String(time2) + ")";
+								sql += " OR ";
+								sql += "(" + func + initialTime + ") >= " + Te2String(time1);
+								sql += " AND " + func + initialTime + ") <= " + Te2String(time2);
+								sql += " AND " + func + finalTime + ") >= " + Te2String(time2) +")";
+								break;
+
+		case TeTIMEENDS:		sql = func + finalTime + ") = " + Te2String(time2);
+								break;
+
+		case TeTIMESTARTS:		sql = func + initialTime + ") = " + Te2String(time1);
+								break;
+		case TeTIMEUNDEFINED:	
+				return sql;				
+	}
+	
+	return sql;
+}
+
+string TePostgreSQL::getAutoNumberSQL(const string& table)
+{
+	errorMessage_ = "";
+
+	TePGRecordset rec;
+
+	string sql = "SELECT adsrc FROM pg_class, pg_attrdef  WHERE lower(pg_class.relname) = lower('" + table + "') AND pg_attrdef.adnum = 1 AND pg_class.oid = pg_attrdef.adrelid";
+
+	if(!rec.open(sql, &tepg_connection_))
+		return false;
+
+	if(rec.recordCount() > 0)
+	{
+		return rec.getData(0);
+	}
+	else
+		return "";
+}
+
+string TePostgreSQL::concatValues(vector<string>& values, const string& unionString)
+{
+	string concat = "";
+	
+	for(unsigned int i = 0; i < values.size(); ++i)
+	{
+		if(i != 0)
+		{
+			concat += " || ";
+
+			if(!unionString.empty())
+			{
+				concat += "'";
+				concat += unionString;
+				concat += "'";
+				concat += " || ";
+			}
+		}
+
+		concat += values[i];
+	}
+
+	return concat;
+}
+
+string TePostgreSQL::toUpper(const string& value)
+{
+	string result  = "upper(";
+	       result += value;
+		   result += ")";
+
+	return result;
+}
+
+void TePostgreSQL::getInsertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql)
+{
+	sql += "INSERT INTO " + table + " (block_id, lower_x, lower_y, upper_x, upper_y, band_id, resolution_factor, subband, spatial_data, block_size) VALUES('";
+	sql += blockId;
+	sql += "', ";
+	sql += Te2String(ll.x_);
+	sql += ", ";
+	sql += Te2String(ll.y_);
+	sql += ", ";
+	sql += Te2String(ur.x_);
+	sql += ", ";
+	sql += Te2String(ur.y_);
+	sql += ", ";
+	sql += Te2String(band);
+	sql += ", ";
+	sql += Te2String(res);
+	sql += ", ";
+	sql += Te2String(subband);
+	sql += ", '";
+	//sql += Te2String(obj_oid);
+	sql += buf;
+	sql += "', ";
+	sql += Te2String(size);
+	sql += ")";
+
+	return;
+}
+
+void TePostgreSQL::getUpdateRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql)
+{
+	sql += "UPDATE ";
+	sql += table;
+	sql += " SET lower_x = ";
+	sql += Te2String(ll.x_);
+	sql += ", lower_y = ";
+	sql += Te2String(ll.y_);
+	sql += ", upper_x = ";
+	sql += Te2String(ur.x_);
+	sql += ", upper_y = ";
+	sql += Te2String(ur.y_);
+	sql += ", band_id = ";
+	sql += Te2String(band);
+	sql += ", resolution_factor = ";
+	sql += Te2String(res);
+	sql += ", subband = ";
+	sql += Te2String(subband);
+	sql += ", spatial_data = '";
+	//sql += Te2String(static_cast<long>(obj_oid));;
+	sql += buf;
+	sql += "', block_size = ";
+	sql += Te2String(size);
+	sql += " WHERE block_id = '";
+	sql += blockId;
+	sql += "'";
+
+	return;
+}
+
+
+string TePostgreSQL::escapeSequence(const string& from)
+{
+	size_t newLen = 0;
+
+
+	char* aux = TePGConnection::escapeString(from.c_str(), from.length(), newLen);
+
+	string str = aux;
+
+	delete [] aux;
+
+	return str;
+}
+
+
+//----- TePostgreSQLPortal methods ---
+TePostgreSQLPortal::TePostgreSQLPortal() : con_(0), curRow_(-1)
+{
+}
+
+TePostgreSQLPortal::TePostgreSQLPortal(TeDatabase *pDatabase) : curRow_(-1)
+{
+	db_ = pDatabase;
+	con_ = &((static_cast<TePostgreSQL*>(pDatabase))->tepg_connection_);
+}
+
+TePostgreSQLPortal::~TePostgreSQLPortal()
+{
+	this->freeResult();
+	con_ = 0;
+}
+
+bool TePostgreSQLPortal::query(const string &qry, TeCursorLocation l, TeCursorType t, TeCursorEditType /*e*/, TeCursorDataType dt)
+{
+	errorMessage_ = "";
+
+	freeResult();	
+		
+	
+	if(!tepg_recordset_.open(qry, con_, t, l, dt))
+	//{
+	//	TeWriteToFile("QUERYS.SQL", qry + "\n", "a");
+
+		return false;
+	//}
+
+
+	numRows_ = tepg_recordset_.recordCount();
+
+	numFields_ = tepg_recordset_.getFieldCount(); 
+
+	attList_.clear ();
+
+	for(int i = 0; i < numFields_; ++i)
+	{
+		TeAttribute attribute;
+
+		Oid nType = tepg_recordset_.fieldType(i);
+
+		switch(nType)
+		{
+			case 16:    //BOOL			
+			case 20:    //INT8
+			case 21:    //INT2
+			case 23:    //INT4
+			case 26:    //OID			
+						attribute.rep_.type_ = TeINT;
+						break;
+			case 700 :  //float4  -> float(p)
+			case 701 :  //float8  -> float(p)
+			case 790 :  //money   -> decimal(9, 2)
+			case 1700:  //numeric -> numeric(p, s)
+						attribute.rep_.type_ = TeREAL;
+						break;
+
+			case 1082:	//date -> date
+			case 1083:  //time -> time
+			case 1114:  //timestamp
+			case 1186:  //interval
+			case 1266:	//
+						attribute.rep_.type_ = TeDATETIME;
+						break;
+
+			//case 26:    //OID
+			case 17:	//bytea
+						attribute.rep_.type_ = TeBLOB;
+						break;
+			case 1042:
+						attribute.rep_.type_ = TeCHARACTER;
+
+			case 1043:  //varchar(n)
+			case 25:    //text
+						attribute.rep_.type_ = TeSTRING;
+						break;
+
+			default:
+						attribute.rep_.type_ = TeUNKNOWN;
+						break;
+		}
+
+		attribute.rep_.name_ = tepg_recordset_.fieldName(i);
+		pair<int, int> len(tepg_recordset_.fieldSize(i), tepg_recordset_.fieldSizeFractionaryPart(i));
+		attribute.rep_.numChar_ = len.first + len.second;
+		attList_.push_back(attribute);
+	}
+
+	curRow_ = 0;	
+
+	return true;
+}
+
+bool TePostgreSQLPortal::fetchRow()
+{
+	errorMessage_ = "";
+
+	if(numFields_ <= 0)
+	{
+		errorMessage_ = "The PostgreSQL portal is empty!";
+		return false;
+	}
+
+	if(curRow_ > 0)
+		tepg_recordset_.moveNext();
+
+	if(tepg_recordset_.eof())
+		return false;
+
+	++curRow_;	
+
+	return true;
+}
+
+bool TePostgreSQLPortal::fetchRow(int i)
+{
+	errorMessage_ = "";
+
+	//if(tepg_recordset_.recordCount() == 0)
+	//{
+	//	errorMessage_ = "The PostgreSQL portal is empty!";
+	//	return false;
+	//}
+
+	curRow_ = i;
+	return tepg_recordset_.moveTo(i + 1);
+	//return true;
+}
+
+void TePostgreSQLPortal::freeResult()
+{
+	tepg_recordset_.close();
+
+	return;
+}
+
+string TePostgreSQLPortal::errorMessage()
+{
+	if(errorMessage_.empty())
+		return con_->err_msg();	
+	else
+		return errorMessage_;
+}
+
+char* TePostgreSQLPortal::getData(int i)
+{
+	errorMessage_ = "";
+	
+	try
+	{
+		return tepg_recordset_.getData(i);
+	}
+
+	catch(...)
+	{
+		return "";
+	}
+
+	return "";
+
+}
+
+char* TePostgreSQLPortal::getData(const string& s)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		return tepg_recordset_.getData(s);
+	}
+
+	catch(...)
+	{
+		return "";
+	}
+
+	return "";
+}
+
+double TePostgreSQLPortal::getDouble(int i)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		return tepg_recordset_.getDouble(i);
+	}
+
+	catch(...)
+	{
+		return 0.0;
+	}
+
+	return 0.0;
+}
+
+double TePostgreSQLPortal::getDouble(const string& s)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		return tepg_recordset_.getDouble(s);
+	}
+
+	catch(...)
+	{
+		return 0.0;
+	}
+
+	return 0.0;
+}
+
+int TePostgreSQLPortal::getInt(int i)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		return tepg_recordset_.getInt(i);
+	}
+
+	catch(...)
+	{
+		return 0;
+	}
+
+	return 0;
+}
+
+int TePostgreSQLPortal::getInt(const string& s)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		return tepg_recordset_.getInt(s);
+	}
+
+	catch(...)
+	{
+		return 0;
+	}
+
+	return 0;
+}
+
+bool TePostgreSQLPortal::getBool(const string& s)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		if(tepg_recordset_.getInt(s))
+			return true;
+		else
+			return false;
+	}
+
+	catch(...)
+	{
+		return false;
+	}
+	
+	return false;
+}
+
+bool TePostgreSQLPortal::getBool(int i)
+{
+	errorMessage_ = "";
+
+	try
+	{
+		if(tepg_recordset_.getInt(i))
+			return true;
+		else
+			return false;
+	}
+
+	catch(...)
+	{
+		return false;
+	}
+
+	return false;
+}
+
+TeTime TePostgreSQLPortal::getDate(int i)
+{
+	string s = getData(i);
+
+	TeTime t(s, TeSECOND, "YYYYsMMsDDsHHsmmsSS"); 
+
+	return t;
+}
+
+TeTime TePostgreSQLPortal::getDate(const string& s)
+{
+	string ss = getData(s);
+
+	TeTime t(ss, TeSECOND, "YYYYsMMsDDsHHsmmsSS"); 
+
+	return t;
+}
+
+string TePostgreSQLPortal::getDateAsString(int i)
+{
+	return getData(i);
+}
+
+string TePostgreSQLPortal::getDateAsString(const string& s)
+{
+	return getData(s);
+}
+
+bool TePostgreSQLPortal::getBlob(const string& s, unsigned char*& data, long& size)
+{
+	errorMessage_ = "";
+
+	data = 0;
+
+	char* ptDataAux = (char*)data;
+
+	unsigned long newLen = tepg_recordset_.getBytea(s, ptDataAux);
+
+	if(newLen > 0)
+	{
+		size = newLen;
+		data = (unsigned char*)ptDataAux;
+		return true;
+	}
+
+	errorMessage_ = "Couldn't read blob! Blob size error!";
+
+	if(data)
+	{
+		delete [] data;
+		data = 0;
+	}
+
+	return false;
+}
+
+bool TePostgreSQLPortal::getRasterBlock(unsigned long& size, unsigned char* ptData)
+{
+	errorMessage_ = "";
+
+	// get the actual length of the compressed data
+	size = tepg_recordset_.getInt("block_size");
+	
+	
+	if(size > 0)
+	{
+		char* ptDataAux = (char*)ptData;
+
+		unsigned long newLen = tepg_recordset_.getBytea("spatial_data", ptDataAux);
+
+		if(newLen == size)
+		{
+			ptData = (unsigned char*)ptDataAux;
+			return true;
+		}
+	}
+
+	return false;
+}
+
+
+bool TePostgreSQLPortal::fetchGeometry(TePolygon& pol)
+{
+	errorMessage_ = "";
+
+	int numberOfHoles;
+
+	TeLinearRing ring = this->getLinearRing(numberOfHoles);
+
+	pol.objectId(ring.objectId());
+	pol.geomId(ring.geomId());
+	pol.add(ring);
+	int parentId = pol.geomId();
+
+	while(fetchRow())
+	{
+		if(atoi(this->getData("parent_id")) == parentId)
+		{
+			int dummy;
+
+			TeLinearRing ring = getLinearRing(dummy);
+			pol.add(ring);
+		}
+		else
+			return true;
+	}
+
+	return false;
+}
+
+bool TePostgreSQLPortal::fetchGeometry(TeLine2D& line)
+{
+	errorMessage_ = "";
+
+	tepg_recordset_.getPGLine2D("spatial_data", line);
+
+	int geomId = tepg_recordset_.getInt("geom_id");
+
+	string objectId = tepg_recordset_.value("object_id");
+
+	line.objectId(objectId);
+	
+	line.geomId(geomId);
+
+	return fetchRow();
+}
+
+bool TePostgreSQLPortal::fetchGeometry(TeNode& n)
+{
+	errorMessage_ = "";
+	
+	TeCoord2D pt(getDouble("x"), getDouble("y"));
+
+	n.add(pt);
+	n.geomId(atoi(getData("geom_id")));
+	n.objectId(string(getData("object_id")));
+
+	return fetchRow();
+}
+
+bool TePostgreSQLPortal::fetchGeometry(TePoint& p)
+{
+	errorMessage_ = "";
+
+	p.location().setXY(getDouble("x"), getDouble("y"));
+	p.geomId(atoi(getData("geom_id")));
+	p.objectId(string(getData("object_id")));
+	
+	return fetchRow();
+}
+
+TeLinearRing TePostgreSQLPortal::getLinearRing(int& numberOfHoles)
+{
+	int geomId = tepg_recordset_.getInt("geom_id");
+	string objectId = tepg_recordset_.value("object_id");
+
+	numberOfHoles = tepg_recordset_.getInt("num_holes");	
+
+	TeLine2D line;
+
+	tepg_recordset_.getPGLine2D("spatial_data", line);
+
+	TeLinearRing ring = line;
+
+	ring.objectId(objectId);
+	
+	ring.geomId(geomId);
+
+	return ring;
+}
+
+string TePostgreSQLPortal::escapeSequence(const string& from)
+{
+	size_t newLen = 0;
+
+	char* aux = TePGConnection::escapeString(from.c_str(), from.length(), newLen);
+
+	string str = aux;
+
+	delete [] aux;
+
+	return str;
+}
diff --git a/src/terralib/drivers/PostgreSQL/TePostgreSQL.h b/src/terralib/drivers/PostgreSQL/TePostgreSQL.h
new file mode 100644
index 0000000..30f108f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/TePostgreSQL.h
@@ -0,0 +1,396 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TePostgreSQL.h
+    This file contains a database driver to access PostgreSQL server.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz - gribeiro at dpi.inpe.br
+  */
+
+/**
+  *@description This file contains the especifics routines of PostgreSQL.
+  */
+
+/*
+ * TODO: 01. Implementar o alterTable que n�o pode simplesmente alterar o tipo da coluna
+ *		 02. No m�todo query do portal, determinar os campos que fazem parte da chave prim�ria
+ *       03. Insert Blob
+ *
+ */
+
+#ifndef  __TERRALIB_INTERNAL_POSTGRESQL_H
+#define  __TERRALIB_INTERNAL_POSTGRESQL_H
+
+#include "TeDatabase.h"
+#include "TePGInterface.h"
+
+
+class TePostgreSQLPortal;
+
+//! PostgreSQL database access class.
+/*!
+	This class contains the implementation of common methods for TerraLib access PostgreSQL.    
+ */	
+class TePostgreSQL : public TeDatabase
+{
+	friend class TePostgreSQLPortal;
+
+	public:
+		
+		//! Constructor
+		TePostgreSQL();
+
+		//! Destructor
+		virtual ~TePostgreSQL();
+
+		//! Returns the error message from the server
+		string errorMessage();
+
+		//! Creates a new database based on "template1" and open a connection to the new one
+		virtual bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int& port = 0, bool terralibModel=true);
+
+		//! Opens a conection to a database server
+		virtual bool connect(const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+		//! Show the server databases (only for MySQL, Oracle and PostgreSQL)
+		virtual bool showDatabases(const string& host, const string& user, const string& password, vector<string>& dbNames, int port = 0);
+
+		//! Closes the conection
+		void close(void);
+
+		bool listTables(vector<string>& tableList);
+
+		//! Verifies if a table exist
+		bool tableExist(const string& table);
+
+		//! Verifies if a table has a column
+	    bool columnExist(const string& table, const string& column, TeAttribute& attr);
+
+		//! Creates a generic table
+		bool createTable(const string& table, TeAttributeList &attr);
+
+		//! Adds an attribute field
+		bool addColumn(const string& table, TeAttributeRep &rep);
+
+		//! Creates a reationship between two tables
+		bool createRelation(const string& relName, const string& table, const string& fieldName, const string& relatedTable, const string& relatedField, bool cascadeDeletion);
+
+		//! Checks if a relation exist
+		TeDBRelationType existRelation(const string& tableName, const string& relName);
+
+		//! Executes a SQL command that doesn�t return a record set tipically a data definition comand
+		bool execute(const string &sql);
+
+		//! Returns a portal associated to this database
+		virtual TeDatabasePortal* getPortal();
+
+		//! Creates a table to store version database information 
+		virtual bool createDatabaseTable();
+
+		//! Creates a table to stores projections
+		bool createProjectionTable();
+
+		//! Creates a table to store Layers information
+		bool createLayerTable();
+
+		//! Creates a table to store Representations information
+		bool createRepresentationTable();
+
+		//! Creates a table to store Views information
+		bool createViewTable();
+
+		//! Creates a table to store Themes information
+		bool createThemeTable();
+
+		//! Creates a table to store the groupings associated with a theme
+	    bool createGroupingTable();
+
+		//! Creates a table to store information about the attribute tables used by a theme
+		bool createThemeTablesTable();
+
+		//! Creates a table to store legends
+		bool createLegendTable();
+
+		//! Creates a table to store visual definitions
+		bool createVisualTable();
+
+		//! Creates a table to store raster visual definitions
+		bool createVisualRasterTable();
+
+		//! Creates a table to store information about the non-spatial tables associated to this layer
+		bool createLayerTableTable();
+
+		//! Creates a table to store information about the external tables related to non-spatial tables of layers
+		bool createTablesRelationTable();
+
+		//! Creates a table for a polygon geometries
+		virtual bool createPolygonGeometry(const string& tableName);
+
+		//! Creates a table for line geometries
+		virtual bool createLineGeometry(const string& tableName);
+
+		//! Creates a table for point geometries
+		virtual bool createPointGeometry(const string& tableName);
+
+		//! Creates a table for cell geometries
+		virtual bool createCellGeometry(const string& tableName);
+
+		//! Creates a table for a text geometries
+		bool createTextGeometry(const string& tableName);
+
+		//! Creates a table for a arc geometries
+		bool createArcGeometry(const string& tableName);
+
+		//! Creates a table for a node geometries
+		virtual bool createNodeGeometry(const string& tableName);
+
+		//! Creates a table for raster geometries
+		virtual bool createRasterGeometry(const string& tableName);	
+
+		//! Creates a table to store information about raster representation
+		bool createRasterMetadataTable(const string& tableName);
+
+		//! Creates a table for raster geometries
+	    virtual bool createRasterTable(const string& tableName);
+
+		//! Creates a table to store information about objects in a theme
+		bool createCollectionTable(const string& tableName);
+
+		//! Inserts information about a link to an external table
+		bool insertRelationInfo(const int tableId, const string& tField, const string& rTable, const string& rField, int& relId);
+
+		//! Insert information about a table related to a layer
+	    bool insertTableInfo(int layerId, TeTable& table, const string& user = "");
+
+		//! Saves a table and its contents in the database
+		bool insertTable(TeTable &table);
+
+		//! Alter a property of a table 
+		bool alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName="");
+
+		//! Saves a large binary objects (BLOB) in a row table 
+	    bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size);
+
+	    //! Saves a large binary objects (BLOB) in a row table 
+	    bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName);
+
+		//! Insert information about a geographical projection
+		bool insertProjection(TeProjection *proj);
+
+		//! Insert information about a layer
+		bool insertLayer(TeLayer *layer);
+
+		//! Insert information about a geometrical representation
+		bool insertRepresentation(int layerId, TeRepresentation& rep);
+
+		//! Inserts information about a view
+		bool insertView(TeView *view);
+
+		//! Inserts view tree information
+		bool insertViewTree(TeViewTree *tree);
+
+		//! Inserts a theme group
+		bool insertThemeGroup(TeViewTree* tree);
+
+		//! Inserts theme information
+		bool insertTheme(TeTheme *theme);
+
+		//! Inserts information about a table used by a theme 
+		bool insertThemeTable(int themeId, int tableId, int relationId, int tableOrder);
+
+		//! Generate the label position (x,y) to each object of a theme
+		virtual bool generateLabelPositions(TeTheme *theme);
+
+		//! Inserts legend information
+		bool insertLegend(TeLegendEntry *legend);		
+
+		//! Inserts a polygon
+		virtual bool insertPolygon(const string& table, TePolygon& p);
+
+		//! Updates a polygon
+		virtual bool updatePolygon(const string& table, TePolygon& p);
+
+		//! Inserts a line
+		virtual bool insertLine(const string& table, TeLine2D& l);
+
+		//! Updates a line
+		virtual bool updateLine(const string& table, TeLine2D& l);
+
+		//! Inserts a point
+		virtual bool insertPoint(const string& table, TePoint& p);
+
+		//! Inserts text
+		bool insertText(const string& table, TeText& t);
+
+		//! Inserts an arc
+		bool insertArc(const string& table,TeArc& arc);
+
+		//! Inserts a node
+		virtual bool insertNode(const string& table, TeNode& node);
+
+		//! Inserts a cell
+		virtual bool insertCell(const string& table, TeCell& c);		
+
+		//! Insert a raster block into the database
+		virtual bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char* buf,unsigned long size, int band = 0, unsigned int res = 1, unsigned int subband = 0);
+
+		//! Creates a lookup table (used for pallete raster representations)
+		bool createLUTTable(const string& name);
+
+		//! Return a string SQL to calculate the statistics to each cell through database functions 
+		string getSQLStatistics(TeGroupingAttr& attrs);
+
+		//! Return a string SQL to temporal where 
+		string getSQLTemporalWhere(TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime);
+
+		//! Return a string SQL to temporal where
+		string getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, const string& initialTime, const string& finalTime);
+
+		//! Return the database function to generate autonumber values
+		string getAutoNumberSQL(const string& table);
+
+		//! Concat values in a vector using unionString as the join between each value
+	    string concatValues(vector<string>& values, const string& unionString);
+
+	    //! Returns the SQL function for upper case
+	    string toUpper(const string& value);
+
+	protected:
+
+		//! Returns a string with insert of a raster block
+		virtual void getInsertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql);
+
+		//! Returns a string with update of a raster block
+		virtual void getUpdateRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, const int& band, const unsigned int& res, const unsigned int& subband, char* buf, const unsigned long& size, string& sql);
+		
+		//! Escape special characters in a string to be used in a SQL statement
+		string escapeSequence(const string& from);
+
+		//! Opens a conection to a database server
+		bool realConnect(const string& host, const string& user, const string& password, const string& database, int port = 0);
+
+		//! Connection to a PostgreSQL server
+		TePGConnection tepg_connection_;
+
+};
+
+
+//! PostgreSQL data navigation functionalities.
+/*!
+	This class contains the implementation of common methods for TerraLib navigate throw data.    
+ */	
+class TePostgreSQLPortal : public TeDatabasePortal
+{
+	public:
+
+		//! Constructor
+		TePostgreSQLPortal();
+
+		//! Constructor
+		TePostgreSQLPortal(TeDatabase *pDatabase);
+		
+		//! Virtual Destructor
+		virtual ~TePostgreSQLPortal();
+
+		//! Executes a SQL query that opens a record set
+		virtual bool query(const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR);
+
+		//! Fetchs the next row in a record set that should�ve been previously opened
+		bool fetchRow();
+
+		//! Fetchs a particular row
+		bool fetchRow(int i);
+
+		//! Frees the current record set
+		void freeResult();
+
+		//! Gets the last error message
+		string errorMessage();
+
+		//! Gets the value of the i-th attribute as a literal
+		char* getData(int i);
+
+		//! Gets the value of a named attribute as a literal
+		char* getData(const string& s);
+
+		//! Gets the value of the i-th attribute a double
+		double getDouble(int i);
+
+		//! Gets the value of a named attribute as a double
+		double getDouble(const string& s);
+
+		//! Gets the value of the i-th attribute as an integer
+		int	getInt(int i);
+
+		//! Gets the value of a named attribute as an integer
+		int	getInt(const string& s);
+
+		//! Gets the value of a named attribute as a boolean
+		bool getBool(const string& s);
+
+		//! Gets the value of the i-th attribute as a boolean
+		bool getBool(int i);
+
+		//! Gets the value of the i-th attribute as a date 
+	    TeTime getDate(int i);
+
+	    //! Gets the value of a named attribute as a date 
+	    TeTime getDate(const string& s);
+
+		//! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+		string getDateAsString(int i);
+
+		//! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+		string getDateAsString(const string& s);
+
+		//! Gets the value of a named BLOB attribute 
+		bool getBlob(const string& s, unsigned char*& data, long& size);
+
+		virtual bool getRasterBlock(unsigned long& size, unsigned char* ptData);
+
+		virtual bool fetchGeometry(TePolygon& pol);
+		virtual bool fetchGeometry(TeLine2D& line);
+		virtual bool fetchGeometry(TeNode& n);
+		virtual bool fetchGeometry(TePoint& p);
+
+
+	protected:
+
+		//! Return a linear ring and the number of holes in case of external ring
+		TeLinearRing getLinearRing(int& numberOfHoles);
+
+		//! Escape special characters in a string to be used in a SQL statement
+		string escapeSequence(const string& from);
+
+		// Protected data members
+		TePGConnection *con_;
+		TePGRecordset tepg_recordset_;
+
+		long curRow_;		
+
+};
+
+#endif	// __TERRALIB_INTERNAL_TePOSTGRESQL_H
+
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpg_informix.h b/src/terralib/drivers/PostgreSQL/includepg/ecpg_informix.h
new file mode 100644
index 0000000..3e3fcfc
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpg_informix.h
@@ -0,0 +1,90 @@
+/*
+ * This file contains stuff needed to be as compatible to Informix as possible.
+ *
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/include/ecpg_informix.h,v 1.16 2004/08/29 05:06:59 momjian Exp $
+ */
+#ifndef _ECPG_INFORMIX_H
+#define _ECPG_INFORMIX_H
+
+#include <ecpglib.h>
+#include <pgtypes_date.h>
+#include <pgtypes_interval.h>
+#include <pgtypes_numeric.h>
+#include <pgtypes_timestamp.h>
+
+#define SQLNOTFOUND 100
+
+#define ECPG_INFORMIX_NUM_OVERFLOW	-1200
+#define ECPG_INFORMIX_NUM_UNDERFLOW -1201
+#define ECPG_INFORMIX_DIVIDE_ZERO	-1202
+#define ECPG_INFORMIX_BAD_YEAR		-1204
+#define ECPG_INFORMIX_BAD_MONTH		-1205
+#define ECPG_INFORMIX_BAD_DAY		-1206
+#define ECPG_INFORMIX_ENOSHORTDATE	-1209
+#define ECPG_INFORMIX_DATE_CONVERT	-1210
+#define ECPG_INFORMIX_OUT_OF_MEMORY -1211
+#define ECPG_INFORMIX_ENOTDMY		-1212
+#define ECPG_INFORMIX_BAD_NUMERIC	-1213
+#define ECPG_INFORMIX_BAD_EXPONENT	-1216
+#define ECPG_INFORMIX_BAD_DATE		-1218
+#define ECPG_INFORMIX_EXTRA_CHARS	-1264
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+extern int	rdatestr(date, char *);
+extern void rtoday(date *);
+extern int	rjulmdy(date, short *);
+extern int	rdefmtdate(date *, char *, char *);
+extern int	rfmtdate(date, char *, char *);
+extern int	rmdyjul(short *, date *);
+extern int	rstrdate(char *, date *);
+extern int	rdayofweek(date);
+
+extern int	rfmtlong(long, char *, char *);
+extern int	rgetmsg(int, char *, int);
+extern int	risnull(int, char *);
+extern int	rsetnull(int, char *);
+extern int	rtypalign(int, int);
+extern int	rtypmsize(int, int);
+extern int	rtypwidth(int, int);
+extern void rupshift(char *);
+
+extern int	byleng(char *, int);
+extern void ldchar(char *, int, char *);
+
+extern void ECPG_informix_set_var(int, void *, int);
+extern void *ECPG_informix_get_var(int);
+
+/* Informix defines these in decimal.h */
+int			decadd(decimal *, decimal *, decimal *);
+int			deccmp(decimal *, decimal *);
+void		deccopy(decimal *, decimal *);
+int			deccvasc(char *, int, decimal *);
+int			deccvdbl(double, decimal *);
+int			deccvint(int, decimal *);
+int			deccvlong(long, decimal *);
+int			decdiv(decimal *, decimal *, decimal *);
+int			decmul(decimal *, decimal *, decimal *);
+int			decsub(decimal *, decimal *, decimal *);
+int			dectoasc(decimal *, char *, int, int);
+int			dectodbl(decimal *, double *);
+int			dectoint(decimal *, int *);
+int			dectolong(decimal *, long *);
+
+/* Informix defines these in datetime.h */
+extern void dtcurrent(timestamp *);
+extern int	dtcvasc(char *, timestamp *);
+extern int	dtsub(timestamp *, timestamp *, interval *);
+extern int	dttoasc(timestamp *, char *);
+extern int	dttofmtasc(timestamp *, char *, int, char *);
+extern int	intoasc(interval *, char *);
+extern int	dtcvfmtasc(char *, char *, timestamp *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* ndef _ECPG_INFORMIX_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpgerrno.h b/src/terralib/drivers/PostgreSQL/includepg/ecpgerrno.h
new file mode 100644
index 0000000..87a30ef
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpgerrno.h
@@ -0,0 +1,77 @@
+#ifndef _ECPG_ERRNO_H
+#define _ECPG_ERRNO_H
+
+#include <errno.h>
+
+/* This is a list of all error codes the embedded SQL program can return */
+#define ECPG_NO_ERROR		0
+#define ECPG_NOT_FOUND		100
+
+/* system error codes returned by ecpglib get the correct number,
+ * but are made negative
+ */
+#define ECPG_OUT_OF_MEMORY	-ENOMEM
+
+/* first we have a set of ecpg messages, they start at 200 */
+#define ECPG_UNSUPPORTED		-200
+#define ECPG_TOO_MANY_ARGUMENTS		-201
+#define ECPG_TOO_FEW_ARGUMENTS		-202
+#define ECPG_TOO_MANY_MATCHES		-203
+#define ECPG_INT_FORMAT			-204
+#define ECPG_UINT_FORMAT		-205
+#define ECPG_FLOAT_FORMAT		-206
+#define ECPG_NUMERIC_FORMAT		-207
+#define ECPG_INTERVAL_FORMAT		-208
+#define ECPG_DATE_FORMAT		-209
+#define ECPG_TIMESTAMP_FORMAT		-210
+#define ECPG_CONVERT_BOOL		-211
+#define ECPG_EMPTY			-212
+#define ECPG_MISSING_INDICATOR		-213
+#define ECPG_NO_ARRAY			-214
+#define ECPG_DATA_NOT_ARRAY		-215
+#define ECPG_ARRAY_INSERT		-216
+
+#define ECPG_NO_CONN			-220
+#define ECPG_NOT_CONN			-221
+
+#define ECPG_INVALID_STMT		-230
+
+/* dynamic SQL related */
+#define ECPG_UNKNOWN_DESCRIPTOR		-240
+#define ECPG_INVALID_DESCRIPTOR_INDEX	-241
+#define ECPG_UNKNOWN_DESCRIPTOR_ITEM	-242
+#define ECPG_VAR_NOT_NUMERIC		-243
+#define ECPG_VAR_NOT_CHAR		-244
+
+/* finally the backend error messages, they start at 400 */
+#define ECPG_PGSQL			-400
+#define ECPG_TRANS			-401
+#define ECPG_CONNECT			-402
+#define ECPG_DUPLICATE_KEY		-403
+#define ECPG_SUBSELECT_NOT_ONE		-404
+
+/* for compatibility we define some different error codes for the same error
+ * if adding a new one make sure to not double define it */
+#define ECPG_INFORMIX_DUPLICATE_KEY -239
+#define ECPG_INFORMIX_SUBSELECT_NOT_ONE -284
+
+/* backend WARNINGs, starting at 600 */
+#define ECPG_WARNING_UNRECOGNIZED	   -600
+ /* WARNING:  (transaction aborted): queries ignored until END */
+
+ /*
+  * WARNING:  current transaction is aborted, queries ignored until end of
+  * transaction block
+  */
+#define ECPG_WARNING_QUERY_IGNORED	   -601
+ /* WARNING:  PerformPortalClose: portal "*" not found */
+#define ECPG_WARNING_UNKNOWN_PORTAL    -602
+ /* WARNING:  BEGIN: already a transaction in progress */
+#define ECPG_WARNING_IN_TRANSACTION    -603
+ /* WARNING:  AbortTransaction and not in in-progress state */
+ /* WARNING:  COMMIT: no transaction in progress */
+#define ECPG_WARNING_NO_TRANSACTION    -604
+ /* WARNING:  BlankPortalAssignName: portal * already exists */
+#define ECPG_WARNING_PORTAL_EXISTS	   -605
+
+#endif   /* !_ECPG_ERRNO_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpglib.h b/src/terralib/drivers/PostgreSQL/includepg/ecpglib.h
new file mode 100644
index 0000000..6145e79
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpglib.h
@@ -0,0 +1,94 @@
+/*
+ * this is a small part of c.h since we don't want to leak all postgres
+ * definitions into ecpg programs
+ */
+
+#ifndef _ECPGLIB_H
+#define _ECPGLIB_H
+
+#include "libpq-fe.h"
+#include "ecpgtype.h"
+#include <string.h>
+
+#ifndef __BEOS__
+#ifndef __cplusplus
+#ifndef bool
+#define bool char
+#endif   /* ndef bool */
+
+#ifndef true
+#define true	((bool) 1)
+#endif   /* ndef true */
+#ifndef false
+#define false	((bool) 0)
+#endif   /* ndef false */
+#endif   /* not C++ */
+#else							/* __BEOS__ */
+#include <SupportDefs.h>
+#endif   /* __BEOS__ */
+
+#ifndef TRUE
+#define TRUE	1
+#endif   /* TRUE */
+
+#ifndef FALSE
+#define FALSE	0
+#endif   /* FALSE */
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+struct sqlca_t;
+
+void		ECPGinit_sqlca(struct sqlca_t * sqlca);
+void		ECPGdebug(int, FILE *);
+bool		ECPGstatus(int, const char *);
+bool		ECPGsetcommit(int, const char *, const char *);
+bool		ECPGsetconn(int, const char *);
+bool		ECPGconnect(int, int, const char *, const char *, const char *, const char *, int);
+bool		ECPGdo(int, int, int, const char *, char *,...);
+bool		ECPGtrans(int, const char *, const char *);
+bool		ECPGdisconnect(int, const char *);
+bool		ECPGprepare(int, char *, char *);
+bool		ECPGdeallocate(int, int, char *);
+bool		ECPGdeallocate_one(int, char *);
+bool		ECPGdeallocate_all(int);
+char	   *ECPGprepared_statement(const char *);
+
+void		ECPGlog(const char *format,...);
+char	   *ECPGerrmsg(void);
+
+ /* print an error message */
+void		sqlprint(void);
+
+/* define this for simplicity as well as compatibility */
+
+#define		  SQLCODE	 sqlca.sqlcode
+
+/* dynamic SQL */
+
+bool ECPGdo_descriptor(int line, const char *connection,
+				  const char *descriptor, const char *query);
+bool		ECPGdeallocate_desc(int line, const char *name);
+bool		ECPGallocate_desc(int line, const char *name);
+void		ECPGraise(int line, int code, const char *sqlstate, const char *str);
+void		ECPGraise_backend(int line, PGresult *result, PGconn *conn, int compat);
+bool		ECPGget_desc_header(int, char *, int *);
+bool		ECPGget_desc(int, char *, int,...);
+bool		ECPGset_desc_header(int, char *, int);
+bool		ECPGset_desc(int, char *, int,...);
+
+void		ECPGset_noind_null(enum ECPGttype, void *);
+bool		ECPGis_noind_null(enum ECPGttype, void *);
+bool		ECPGdescribe(int, bool, const char *,...);
+
+/* dynamic result allocation */
+void		ECPGfree_auto_mem(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* _ECPGLIB_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/ecpgtype.h b/src/terralib/drivers/PostgreSQL/includepg/ecpgtype.h
new file mode 100644
index 0000000..3d54402
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/ecpgtype.h
@@ -0,0 +1,93 @@
+/*
+ * This file implements a data structure that is built and maintained by the
+ * preprocessor.
+ *
+ * All types that can be handled for host variable declarations has to
+ * be handled eventually.
+ */
+
+/*
+ * Here are all the types that we are to handle. Note that it is the type
+ * that is registered and that has nothing whatsoever to do with the storage
+ * class.
+ *
+ * Simple types
+ * integers: char, short, int, long (signed and unsigned)
+ * floats: float, double
+ *
+ * Complex types:
+ * VARCHAR, VARCHAR2 - Strings with length (maxlen is given in the declaration)
+ * Arrays of simple types and of VARCHAR, VARCHAR2 (size given in declaration)
+ * Records build of simple types, arrays and other structs.
+ *
+ * Complicating things:
+ * typedefs and struct names!
+ *
+ * Conclusion:
+ * This is a typically recursive definition. A structure of typed list elements
+ * would probably work fine:
+ */
+
+#ifndef _ECPGTYPE_H
+#define _ECPGTYPE_H
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+enum ECPGttype
+{
+	ECPGt_char = 1, ECPGt_unsigned_char, ECPGt_short, ECPGt_unsigned_short,
+	ECPGt_int, ECPGt_unsigned_int, ECPGt_long, ECPGt_unsigned_long,
+	ECPGt_long_long, ECPGt_unsigned_long_long,
+	ECPGt_bool,
+	ECPGt_float, ECPGt_double,
+	ECPGt_varchar, ECPGt_varchar2,
+	ECPGt_numeric,				/* this is a decimal that stores its
+								 * digits in a malloced array */
+	ECPGt_decimal,				/* this is a decimal that stores its
+								 * digits in a fixed array */
+	ECPGt_date,
+	ECPGt_timestamp,
+	ECPGt_interval,
+	ECPGt_array,
+	ECPGt_struct,
+	ECPGt_union,
+	ECPGt_descriptor,			/* sql descriptor, no C variable */
+	ECPGt_char_variable,
+	ECPGt_const,				/* a constant is needed sometimes */
+	ECPGt_EOIT,					/* End of insert types. */
+	ECPGt_EORT,					/* End of result types. */
+	ECPGt_NO_INDICATOR			/* no indicator */
+};
+
+ /* descriptor items */
+enum ECPGdtype
+{
+	ECPGd_count = 1,
+	ECPGd_data,
+	ECPGd_di_code,
+	ECPGd_di_precision,
+	ECPGd_indicator,
+	ECPGd_key_member,
+	ECPGd_length,
+	ECPGd_name,
+	ECPGd_nullable,
+	ECPGd_octet,
+	ECPGd_precision,
+	ECPGd_ret_length,
+	ECPGd_ret_octet,
+	ECPGd_scale,
+	ECPGd_type,
+	ECPGd_EODT,					/* End of descriptor types. */
+	ECPGd_cardinality
+};
+
+#define IS_SIMPLE_TYPE(type) ((type) >= ECPGt_char && (type) <= ECPGt_interval)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* _ECPGTYPE_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/libpq-fe.h b/src/terralib/drivers/PostgreSQL/includepg/libpq-fe.h
new file mode 100644
index 0000000..f7f3797
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/libpq-fe.h
@@ -0,0 +1,503 @@
+/*-------------------------------------------------------------------------
+ *
+ * libpq-fe.h
+ *	  This file contains definitions for structures and
+ *	  externs for functions used by frontend postgres applications.
+ *
+ * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
+ * Portions Copyright (c) 1994, Regents of the University of California
+ *
+ * $PostgreSQL: pgsql/src/interfaces/libpq/libpq-fe.h,v 1.116 2004/12/31 22:03:50 pgsql Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef LIBPQ_FE_H
+#define LIBPQ_FE_H
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+#include <stdio.h>
+
+/*
+ * postgres_ext.h defines the backend's externally visible types,
+ * such as Oid.
+ */
+#include "postgres_ext.h"
+
+/* SSL type is needed here only to declare PQgetssl() */
+#ifdef USE_SSL
+#include <openssl/ssl.h>
+#endif
+
+/* Application-visible enum types */
+
+typedef enum
+{
+	/*
+	 * Although it is okay to add to this list, values which become unused
+	 * should never be removed, nor should constants be redefined - that
+	 * would break compatibility with existing code.
+	 */
+	CONNECTION_OK,
+	CONNECTION_BAD,
+	/* Non-blocking mode only below here */
+
+	/*
+	 * The existence of these should never be relied upon - they should
+	 * only be used for user feedback or similar purposes.
+	 */
+	CONNECTION_STARTED,			/* Waiting for connection to be made.  */
+	CONNECTION_MADE,			/* Connection OK; waiting to send.	   */
+	CONNECTION_AWAITING_RESPONSE,		/* Waiting for a response from the
+										 * postmaster.		  */
+	CONNECTION_AUTH_OK,			/* Received authentication; waiting for
+								 * backend startup. */
+	CONNECTION_SETENV,			/* Negotiating environment. */
+	CONNECTION_SSL_STARTUP,		/* Negotiating SSL. */
+	CONNECTION_NEEDED			/* Internal state: connect() needed */
+} ConnStatusType;
+
+typedef enum
+{
+	PGRES_POLLING_FAILED = 0,
+	PGRES_POLLING_READING,		/* These two indicate that one may	  */
+	PGRES_POLLING_WRITING,		/* use select before polling again.   */
+	PGRES_POLLING_OK,
+	PGRES_POLLING_ACTIVE		/* unused; keep for awhile for backwards
+								 * compatibility */
+} PostgresPollingStatusType;
+
+typedef enum
+{
+	PGRES_EMPTY_QUERY = 0,		/* empty query string was executed */
+	PGRES_COMMAND_OK,			/* a query command that doesn't return
+								 * anything was executed properly by the
+								 * backend */
+	PGRES_TUPLES_OK,			/* a query command that returns tuples was
+								 * executed properly by the backend,
+								 * PGresult contains the result tuples */
+	PGRES_COPY_OUT,				/* Copy Out data transfer in progress */
+	PGRES_COPY_IN,				/* Copy In data transfer in progress */
+	PGRES_BAD_RESPONSE,			/* an unexpected response was recv'd from
+								 * the backend */
+	PGRES_NONFATAL_ERROR,		/* notice or warning message */
+	PGRES_FATAL_ERROR			/* query failed */
+} ExecStatusType;
+
+typedef enum
+{
+	PQTRANS_IDLE,				/* connection idle */
+	PQTRANS_ACTIVE,				/* command in progress */
+	PQTRANS_INTRANS,			/* idle, within transaction block */
+	PQTRANS_INERROR,			/* idle, within failed transaction */
+	PQTRANS_UNKNOWN				/* cannot determine status */
+} PGTransactionStatusType;
+
+typedef enum
+{
+	PQERRORS_TERSE,				/* single-line error messages */
+	PQERRORS_DEFAULT,			/* recommended style */
+	PQERRORS_VERBOSE			/* all the facts, ma'am */
+} PGVerbosity;
+
+/* PGconn encapsulates a connection to the backend.
+ * The contents of this struct are not supposed to be known to applications.
+ */
+typedef struct pg_conn PGconn;
+
+/* PGresult encapsulates the result of a query (or more precisely, of a single
+ * SQL command --- a query string given to PQsendQuery can contain multiple
+ * commands and thus return multiple PGresult objects).
+ * The contents of this struct are not supposed to be known to applications.
+ */
+typedef struct pg_result PGresult;
+
+/* PGcancel encapsulates the information needed to cancel a running
+ * query on an existing connection.
+ * The contents of this struct are not supposed to be known to applications.
+ */
+typedef struct pg_cancel PGcancel;
+
+/* PGnotify represents the occurrence of a NOTIFY message.
+ * Ideally this would be an opaque typedef, but it's so simple that it's
+ * unlikely to change.
+ * NOTE: in Postgres 6.4 and later, the be_pid is the notifying backend's,
+ * whereas in earlier versions it was always your own backend's PID.
+ */
+typedef struct pgNotify
+{
+	char	   *relname;		/* notification condition name */
+	int			be_pid;			/* process ID of server process */
+	char	   *extra;			/* notification parameter */
+	/* Fields below here are private to libpq; apps should not use 'em */
+	struct pgNotify *next;		/* list link */
+} PGnotify;
+
+/* Function types for notice-handling callbacks */
+typedef void (*PQnoticeReceiver) (void *arg, const PGresult *res);
+typedef void (*PQnoticeProcessor) (void *arg, const char *message);
+
+/* Print options for PQprint() */
+typedef char pqbool;
+
+typedef struct _PQprintOpt
+{
+	pqbool		header;			/* print output field headings and row
+								 * count */
+	pqbool		align;			/* fill align the fields */
+	pqbool		standard;		/* old brain dead format */
+	pqbool		html3;			/* output html tables */
+	pqbool		expanded;		/* expand tables */
+	pqbool		pager;			/* use pager for output if needed */
+	char	   *fieldSep;		/* field separator */
+	char	   *tableOpt;		/* insert to HTML <table ...> */
+	char	   *caption;		/* HTML <caption> */
+	char	  **fieldName;		/* null terminated array of repalcement
+								 * field names */
+} PQprintOpt;
+
+/* ----------------
+ * Structure for the conninfo parameter definitions returned by PQconndefaults
+ *
+ * All fields except "val" point at static strings which must not be altered.
+ * "val" is either NULL or a malloc'd current-value string.  PQconninfoFree()
+ * will release both the val strings and the PQconninfoOption array itself.
+ * ----------------
+ */
+typedef struct _PQconninfoOption
+{
+	char	   *keyword;		/* The keyword of the option			*/
+	char	   *envvar;			/* Fallback environment variable name	*/
+	char	   *compiled;		/* Fallback compiled in default value	*/
+	char	   *val;			/* Option's current value, or NULL		 */
+	char	   *label;			/* Label for field in connect dialog	*/
+	char	   *dispchar;		/* Character to display for this field in
+								 * a connect dialog. Values are: ""
+								 * Display entered value as is "*"
+								 * Password field - hide value "D"	Debug
+								 * option - don't show by default */
+	int			dispsize;		/* Field size in characters for dialog	*/
+} PQconninfoOption;
+
+/* ----------------
+ * PQArgBlock -- structure for PQfn() arguments
+ * ----------------
+ */
+typedef struct
+{
+	int			len;
+	int			isint;
+	union
+	{
+		int		   *ptr;		/* can't use void (dec compiler barfs)	 */
+		int			integer;
+	}			u;
+} PQArgBlock;
+
+/* ----------------
+ * Exported functions of libpq
+ * ----------------
+ */
+
+/* ===	in fe-connect.c === */
+
+/* make a new client connection to the backend */
+/* Asynchronous (non-blocking) */
+extern PGconn *PQconnectStart(const char *conninfo);
+extern PostgresPollingStatusType PQconnectPoll(PGconn *conn);
+
+/* Synchronous (blocking) */
+extern PGconn *PQconnectdb(const char *conninfo);
+extern PGconn *PQsetdbLogin(const char *pghost, const char *pgport,
+			 const char *pgoptions, const char *pgtty,
+			 const char *dbName,
+			 const char *login, const char *pwd);
+
+#define PQsetdb(M_PGHOST,M_PGPORT,M_PGOPT,M_PGTTY,M_DBNAME)  \
+	PQsetdbLogin(M_PGHOST, M_PGPORT, M_PGOPT, M_PGTTY, M_DBNAME, NULL, NULL)
+
+/* close the current connection and free the PGconn data structure */
+extern void PQfinish(PGconn *conn);
+
+/* get info about connection options known to PQconnectdb */
+extern PQconninfoOption *PQconndefaults(void);
+
+/* free the data structure returned by PQconndefaults() */
+extern void PQconninfoFree(PQconninfoOption *connOptions);
+
+/*
+ * close the current connection and restablish a new one with the same
+ * parameters
+ */
+/* Asynchronous (non-blocking) */
+extern int	PQresetStart(PGconn *conn);
+extern PostgresPollingStatusType PQresetPoll(PGconn *conn);
+
+/* Synchronous (blocking) */
+extern void PQreset(PGconn *conn);
+
+/* request a cancel structure */
+extern PGcancel *PQgetCancel(PGconn *conn);
+
+/* free a cancel structure */
+extern void PQfreeCancel(PGcancel *cancel);
+
+/* issue a cancel request */
+extern int	PQcancel(PGcancel *cancel, char *errbuf, int errbufsize);
+
+/* backwards compatible version of PQcancel; not thread-safe */
+extern int	PQrequestCancel(PGconn *conn);
+
+/* Accessor functions for PGconn objects */
+extern char *PQdb(const PGconn *conn);
+extern char *PQuser(const PGconn *conn);
+extern char *PQpass(const PGconn *conn);
+extern char *PQhost(const PGconn *conn);
+extern char *PQport(const PGconn *conn);
+extern char *PQtty(const PGconn *conn);
+extern char *PQoptions(const PGconn *conn);
+extern ConnStatusType PQstatus(const PGconn *conn);
+extern PGTransactionStatusType PQtransactionStatus(const PGconn *conn);
+extern const char *PQparameterStatus(const PGconn *conn,
+				  const char *paramName);
+extern int	PQprotocolVersion(const PGconn *conn);
+extern int	PQserverVersion(const PGconn *conn);
+extern char *PQerrorMessage(const PGconn *conn);
+extern int	PQsocket(const PGconn *conn);
+extern int	PQbackendPID(const PGconn *conn);
+extern int	PQclientEncoding(const PGconn *conn);
+extern int	PQsetClientEncoding(PGconn *conn, const char *encoding);
+
+#ifdef USE_SSL
+/* Get the SSL structure associated with a connection */
+extern SSL *PQgetssl(PGconn *conn);
+#else
+extern void *PQgetssl(PGconn *conn);
+#endif
+
+/* Tell libpq whether it needs to initialize OpenSSL */
+extern void PQinitSSL(int do_init);
+
+/* Set verbosity for PQerrorMessage and PQresultErrorMessage */
+extern PGVerbosity PQsetErrorVerbosity(PGconn *conn, PGVerbosity verbosity);
+
+/* Enable/disable tracing */
+extern void PQtrace(PGconn *conn, FILE *debug_port);
+extern void PQuntrace(PGconn *conn);
+
+/* Override default notice handling routines */
+extern PQnoticeReceiver PQsetNoticeReceiver(PGconn *conn,
+					PQnoticeReceiver proc,
+					void *arg);
+extern PQnoticeProcessor PQsetNoticeProcessor(PGconn *conn,
+					 PQnoticeProcessor proc,
+					 void *arg);
+
+/*
+ *	   Used to set callback that prevents concurrent access to
+ *	   non-thread safe functions that libpq needs.
+ *	   The default implementation uses a libpq internal mutex.
+ *	   Only required for multithreaded apps that use kerberos
+ *	   both within their app and for postgresql connections.
+ */
+typedef void (*pgthreadlock_t) (int acquire);
+
+extern pgthreadlock_t PQregisterThreadLock(pgthreadlock_t newhandler);
+
+/* === in fe-exec.c === */
+
+/* Simple synchronous query */
+extern PGresult *PQexec(PGconn *conn, const char *query);
+extern PGresult *PQexecParams(PGconn *conn,
+			 const char *command,
+			 int nParams,
+			 const Oid *paramTypes,
+			 const char *const * paramValues,
+			 const int *paramLengths,
+			 const int *paramFormats,
+			 int resultFormat);
+extern PGresult *PQprepare(PGconn *conn, const char *stmtName,
+						   const char *query, int nParams,
+						   const Oid *paramTypes);
+extern PGresult *PQexecPrepared(PGconn *conn,
+			   const char *stmtName,
+			   int nParams,
+			   const char *const * paramValues,
+			   const int *paramLengths,
+			   const int *paramFormats,
+			   int resultFormat);
+
+/* Interface for multiple-result or asynchronous queries */
+extern int	PQsendQuery(PGconn *conn, const char *query);
+extern int PQsendQueryParams(PGconn *conn,
+				  const char *command,
+				  int nParams,
+				  const Oid *paramTypes,
+				  const char *const * paramValues,
+				  const int *paramLengths,
+				  const int *paramFormats,
+				  int resultFormat);
+extern int PQsendPrepare(PGconn *conn, const char *stmtName,
+						 const char *query, int nParams,
+						 const Oid *paramTypes);
+extern int PQsendQueryPrepared(PGconn *conn,
+					const char *stmtName,
+					int nParams,
+					const char *const * paramValues,
+					const int *paramLengths,
+					const int *paramFormats,
+					int resultFormat);
+extern PGresult *PQgetResult(PGconn *conn);
+
+/* Routines for managing an asynchronous query */
+extern int	PQisBusy(PGconn *conn);
+extern int	PQconsumeInput(PGconn *conn);
+
+/* LISTEN/NOTIFY support */
+extern PGnotify *PQnotifies(PGconn *conn);
+
+/* Routines for copy in/out */
+extern int	PQputCopyData(PGconn *conn, const char *buffer, int nbytes);
+extern int	PQputCopyEnd(PGconn *conn, const char *errormsg);
+extern int	PQgetCopyData(PGconn *conn, char **buffer, int async);
+
+/* Deprecated routines for copy in/out */
+extern int	PQgetline(PGconn *conn, char *string, int length);
+extern int	PQputline(PGconn *conn, const char *string);
+extern int	PQgetlineAsync(PGconn *conn, char *buffer, int bufsize);
+extern int	PQputnbytes(PGconn *conn, const char *buffer, int nbytes);
+extern int	PQendcopy(PGconn *conn);
+
+/* Set blocking/nonblocking connection to the backend */
+extern int	PQsetnonblocking(PGconn *conn, int arg);
+extern int	PQisnonblocking(const PGconn *conn);
+
+/* Force the write buffer to be written (or at least try) */
+extern int	PQflush(PGconn *conn);
+
+/*
+ * "Fast path" interface --- not really recommended for application
+ * use
+ */
+extern PGresult *PQfn(PGconn *conn,
+	 int fnid,
+	 int *result_buf,
+	 int *result_len,
+	 int result_is_int,
+	 const PQArgBlock *args,
+	 int nargs);
+
+/* Accessor functions for PGresult objects */
+extern ExecStatusType PQresultStatus(const PGresult *res);
+extern char *PQresStatus(ExecStatusType status);
+extern char *PQresultErrorMessage(const PGresult *res);
+extern char *PQresultErrorField(const PGresult *res, int fieldcode);
+extern int	PQntuples(const PGresult *res);
+extern int	PQnfields(const PGresult *res);
+extern int	PQbinaryTuples(const PGresult *res);
+extern char *PQfname(const PGresult *res, int field_num);
+extern int	PQfnumber(const PGresult *res, const char *field_name);
+extern Oid	PQftable(const PGresult *res, int field_num);
+extern int	PQftablecol(const PGresult *res, int field_num);
+extern int	PQfformat(const PGresult *res, int field_num);
+extern Oid	PQftype(const PGresult *res, int field_num);
+extern int	PQfsize(const PGresult *res, int field_num);
+extern int	PQfmod(const PGresult *res, int field_num);
+extern char *PQcmdStatus(PGresult *res);
+extern char *PQoidStatus(const PGresult *res);	/* old and ugly */
+extern Oid	PQoidValue(const PGresult *res);	/* new and improved */
+extern char *PQcmdTuples(PGresult *res);
+extern char *PQgetvalue(const PGresult *res, int tup_num, int field_num);
+extern int	PQgetlength(const PGresult *res, int tup_num, int field_num);
+extern int	PQgetisnull(const PGresult *res, int tup_num, int field_num);
+
+/* Delete a PGresult */
+extern void PQclear(PGresult *res);
+
+/* For freeing other alloc'd results, such as PGnotify structs */
+extern void PQfreemem(void *ptr);
+
+/* Exists for backward compatibility.  bjm 2003-03-24 */
+#define PQfreeNotify(ptr) PQfreemem(ptr)
+
+/* Define the string so all uses are consistent. */
+#define PQnoPasswordSupplied	"fe_sendauth: no password supplied\n"
+
+/*
+ * Make an empty PGresult with given status (some apps find this
+ * useful). If conn is not NULL and status indicates an error, the
+ * conn's errorMessage is copied.
+ */
+extern PGresult *PQmakeEmptyPGresult(PGconn *conn, ExecStatusType status);
+
+
+/* Quoting strings before inclusion in queries. */
+extern size_t PQescapeString(char *to, const char *from, size_t length);
+extern unsigned char *PQescapeBytea(const unsigned char *bintext, size_t binlen,
+			  size_t *bytealen);
+extern unsigned char *PQunescapeBytea(const unsigned char *strtext,
+				size_t *retbuflen);
+
+
+
+/* === in fe-print.c === */
+
+extern void
+PQprint(FILE *fout,				/* output stream */
+		const PGresult *res,
+		const PQprintOpt *ps);	/* option structure */
+
+/*
+ * really old printing routines
+ */
+extern void
+PQdisplayTuples(const PGresult *res,
+				FILE *fp,		/* where to send the output */
+				int fillAlign,	/* pad the fields with spaces */
+				const char *fieldSep,	/* field separator */
+				int printHeader,	/* display headers? */
+				int quiet);
+
+extern void
+PQprintTuples(const PGresult *res,
+			  FILE *fout,		/* output stream */
+			  int printAttName, /* print attribute names */
+			  int terseOutput,	/* delimiter bars */
+			  int width);		/* width of column, if 0, use variable
+								 * width */
+
+
+/* === in fe-lobj.c === */
+
+/* Large-object access routines */
+extern int	lo_open(PGconn *conn, Oid lobjId, int mode);
+extern int	lo_close(PGconn *conn, int fd);
+extern int	lo_read(PGconn *conn, int fd, char *buf, size_t len);
+extern int	lo_write(PGconn *conn, int fd, char *buf, size_t len);
+extern int	lo_lseek(PGconn *conn, int fd, int offset, int whence);
+extern Oid	lo_creat(PGconn *conn, int mode);
+extern int	lo_tell(PGconn *conn, int fd);
+extern int	lo_unlink(PGconn *conn, Oid lobjId);
+extern Oid	lo_import(PGconn *conn, const char *filename);
+extern int	lo_export(PGconn *conn, Oid lobjId, const char *filename);
+
+/* === in fe-misc.c === */
+
+/* Determine length of multibyte encoded char at *s */
+extern int	PQmblen(const unsigned char *s, int encoding);
+
+/* Determine display length of multibyte encoded char at *s */
+extern int	PQdsplen(const unsigned char *s, int encoding);
+
+/* Get encoding id from environment variable PGCLIENTENCODING */
+extern int	PQenv2encoding(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* LIBPQ_FE_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pg_config.h b/src/terralib/drivers/PostgreSQL/includepg/pg_config.h
new file mode 100644
index 0000000..4e87245
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pg_config.h
@@ -0,0 +1,685 @@
+/* src/include/pg_config.h.  Generated by configure.  */
+/* src/include/pg_config.h.in.  Generated from configure.in by autoheader.  */
+
+/* Define to the type of arg 1 of 'accept' */
+#define ACCEPT_TYPE_ARG1 unsigned int
+
+/* Define to the type of arg 2 of 'accept' */
+#define ACCEPT_TYPE_ARG2 struct sockaddr *
+
+/* Define to the type of arg 3 of 'accept' */
+#define ACCEPT_TYPE_ARG3 int
+
+/* Define to the return type of 'accept' */
+#define ACCEPT_TYPE_RETURN unsigned int PASCAL
+
+/* The alignment requirement of a `double'. */
+#define ALIGNOF_DOUBLE 8
+
+/* The alignment requirement of a `int'. */
+#define ALIGNOF_INT 4
+
+/* The alignment requirement of a `long'. */
+#define ALIGNOF_LONG 4
+
+/* The alignment requirement of a `long long int'. */
+#define ALIGNOF_LONG_LONG_INT 8
+
+/* The alignment requirement of a `short'. */
+#define ALIGNOF_SHORT 2
+
+/* Define to the default TCP port number on which the server listens and to
+   which clients will try to connect. This can be overridden at run-time, but
+   it's convenient if your clients have the right default compiled in.
+   (--with-pgport=PORTNUM) */
+#define DEF_PGPORT 5432
+
+/* Define to the default TCP port number as a string constant. */
+#define DEF_PGPORT_STR "5432"
+
+/* Define to 1 if you want National Language Support. (--enable-nls) */
+#define ENABLE_NLS 1
+
+/* Define to 1 to build client libraries as thread-safe code.
+   (--enable-thread-safety) */
+/* #undef ENABLE_THREAD_SAFETY */
+
+/* Define to 1 if getpwuid_r() takes a 5th argument. */
+/* #undef GETPWUID_R_5ARG */
+
+/* Define to 1 if gettimeofday() takes only 1 argument. */
+/* #undef GETTIMEOFDAY_1ARG */
+
+#ifdef GETTIMEOFDAY_1ARG
+# define gettimeofday(a,b) gettimeofday(a)
+#endif
+
+/* Define to 1 if you have the `atexit' function. */
+#define HAVE_ATEXIT 1
+
+/* Define to 1 if you have the `cbrt' function. */
+#define HAVE_CBRT 1
+
+/* Define to 1 if you have the `class' function. */
+/* #undef HAVE_CLASS */
+
+/* Define to 1 if you have the `crypt' function. */
+/* #undef HAVE_CRYPT */
+
+/* Define to 1 if you have the <crypt.h> header file. */
+/* #undef HAVE_CRYPT_H */
+
+/* Define to 1 if you have the declaration of `fdatasync', and to 0 if you
+   don't. */
+#define HAVE_DECL_FDATASYNC 0
+
+/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
+   don't. */
+#define HAVE_DECL_SNPRINTF 1
+
+/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
+   don't. */
+#define HAVE_DECL_VSNPRINTF 1
+
+/* Define to 1 if you have the <dld.h> header file. */
+/* #undef HAVE_DLD_H */
+
+/* Define to 1 if you have the `dlopen' function. */
+/* #undef HAVE_DLOPEN */
+
+/* Define to 1 if you have the <editline/history.h> header file. */
+/* #undef HAVE_EDITLINE_HISTORY_H */
+
+/* Define to 1 if you have the <editline/readline.h> header file. */
+/* #undef HAVE_EDITLINE_READLINE_H */
+
+/* Define to 1 if you have the <endian.h> header file. */
+/* #undef HAVE_ENDIAN_H */
+
+/* Define to 1 if you have the `fcvt' function. */
+#define HAVE_FCVT 1
+
+/* Define to 1 if you have the `fdatasync' function. */
+/* #undef HAVE_FDATASYNC */
+
+/* Define to 1 if you have finite(). */
+#define HAVE_FINITE 1
+
+/* Define to 1 if you have the `fpclass' function. */
+/* #undef HAVE_FPCLASS */
+
+/* Define to 1 if you have the `fp_class' function. */
+/* #undef HAVE_FP_CLASS */
+
+/* Define to 1 if you have the `fp_class_d' function. */
+/* #undef HAVE_FP_CLASS_D */
+
+/* Define to 1 if you have the <fp_class.h> header file. */
+/* #undef HAVE_FP_CLASS_H */
+
+/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
+/* #undef HAVE_FSEEKO */
+
+/* Define to 1 if your compiler understands __func__. */
+#define HAVE_FUNCNAME__FUNC 1
+
+/* Define to 1 if your compiler understands __FUNCTION__. */
+/* #undef HAVE_FUNCNAME__FUNCTION */
+
+/* Define to 1 if you have the `getaddrinfo' function. */
+/* #undef HAVE_GETADDRINFO */
+
+/* Define to 1 if you have the `gethostbyname_r' function. */
+/* #undef HAVE_GETHOSTBYNAME_R */
+
+/* Define to 1 if you have the `gethostname' function. */
+/* #undef HAVE_GETHOSTNAME */
+
+/* Define to 1 if you have the `getopt' function. */
+#define HAVE_GETOPT 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#define HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the `getopt_long' function. */
+#define HAVE_GETOPT_LONG 1
+
+/* Define to 1 if you have the `getpeereid' function. */
+/* #undef HAVE_GETPEEREID */
+
+/* Define to 1 if you have the `getpwuid_r' function. */
+/* #undef HAVE_GETPWUID_R */
+
+/* Define to 1 if you have the `getrusage' function. */
+/* #undef HAVE_GETRUSAGE */
+
+/* Define to 1 if you have the <history.h> header file. */
+/* #undef HAVE_HISTORY_H */
+
+/* Define to 1 if you have the <ieeefp.h> header file. */
+/* #undef HAVE_IEEEFP_H */
+
+/* Define to 1 if you have the `inet_aton' function. */
+/* #undef HAVE_INET_ATON */
+
+/* Define to 1 if the system has the type `int64'. */
+/* #undef HAVE_INT64 */
+
+/* Define to 1 if the system has the type `int8'. */
+/* #undef HAVE_INT8 */
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#define HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the global variable 'int optreset'. */
+#define HAVE_INT_OPTRESET 1
+
+/* Define to 1 if you have the global variable 'int timezone'. */
+#define HAVE_INT_TIMEZONE 
+
+/* Define to 1 if you have support for IPv6. */
+/* #undef HAVE_IPV6 */
+
+/* Define to 1 if you have isinf(). */
+#define HAVE_ISINF 1
+
+/* Define to 1 if you have the <kernel/image.h> header file. */
+/* #undef HAVE_KERNEL_IMAGE_H */
+
+/* Define to 1 if you have the <kernel/OS.h> header file. */
+/* #undef HAVE_KERNEL_OS_H */
+
+/* Define to 1 if `e_data' is member of `krb5_error'. */
+/* #undef HAVE_KRB5_ERROR_E_DATA */
+
+/* Define to 1 if `text.data' is member of `krb5_error'. */
+/* #undef HAVE_KRB5_ERROR_TEXT_DATA */
+
+/* Define to 1 if `client' is member of `krb5_ticket'. */
+/* #undef HAVE_KRB5_TICKET_CLIENT */
+
+/* Define to 1 if `enc_part2' is member of `krb5_ticket'. */
+/* #undef HAVE_KRB5_TICKET_ENC_PART2 */
+
+/* Define to 1 if you have the <langinfo.h> header file. */
+/* #undef HAVE_LANGINFO_H */
+
+/* Define to 1 if you have the `bind' library (-lbind). */
+/* #undef HAVE_LIBBIND */
+
+/* Define to 1 if you have the `BSD' library (-lBSD). */
+/* #undef HAVE_LIBBSD */
+
+/* Define to 1 if you have the `compat' library (-lcompat). */
+/* #undef HAVE_LIBCOMPAT */
+
+/* Define to 1 if you have the `crypto' library (-lcrypto). */
+/* #undef HAVE_LIBCRYPTO */
+
+/* Define to 1 if you have the `cygipc' library (-lcygipc). */
+/* #undef HAVE_LIBCYGIPC */
+
+/* Define to 1 if you have the `des' library (-ldes). */
+/* #undef HAVE_LIBDES */
+
+/* Define to 1 if you have the `dl' library (-ldl). */
+/* #undef HAVE_LIBDL */
+
+/* Define to 1 if you have the `dld' library (-ldld). */
+/* #undef HAVE_LIBDLD */
+
+/* Define to 1 if you have the `eay32' library (-leay32). */
+#define HAVE_LIBEAY32 1
+
+/* Define to 1 if you have the `gen' library (-lgen). */
+/* #undef HAVE_LIBGEN */
+
+/* Define to 1 if you have the `IPC' library (-lIPC). */
+/* #undef HAVE_LIBIPC */
+
+/* Define to 1 if you have the `krb' library (-lkrb). */
+/* #undef HAVE_LIBKRB */
+
+/* Define to 1 if you have the `lc' library (-llc). */
+/* #undef HAVE_LIBLC */
+
+/* Define to 1 if you have the `ld' library (-lld). */
+/* #undef HAVE_LIBLD */
+
+/* Define to 1 if you have the `m' library (-lm). */
+#define HAVE_LIBM 1
+
+/* Define to 1 if you have the `nsl' library (-lnsl). */
+/* #undef HAVE_LIBNSL */
+
+/* Define to 1 if you have the `pam' library (-lpam). */
+/* #undef HAVE_LIBPAM */
+
+/* Define to 1 if you have the `PW' library (-lPW). */
+/* #undef HAVE_LIBPW */
+
+/* Define if you have a function readline library */
+/* #undef HAVE_LIBREADLINE */
+
+/* Define to 1 if you have the `resolv' library (-lresolv). */
+/* #undef HAVE_LIBRESOLV */
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+/* #undef HAVE_LIBSOCKET */
+
+/* Define to 1 if you have the `ssl' library (-lssl). */
+/* #undef HAVE_LIBSSL */
+
+/* Define to 1 if you have the `ssleay32' library (-lssleay32). */
+#define HAVE_LIBSSLEAY32 1
+
+/* Define to 1 if you have the `unix' library (-lunix). */
+/* #undef HAVE_LIBUNIX */
+
+/* Define to 1 if you have the `util' library (-lutil). */
+/* #undef HAVE_LIBUTIL */
+
+/* Define to 1 if you have the `wsock32' library (-lwsock32). */
+#define HAVE_LIBWSOCK32 1
+
+/* Define to 1 if you have the `z' library (-lz). */
+#define HAVE_LIBZ 1
+
+/* Define to 1 if constants of type 'long long int' should have the suffix LL.
+   */
+#define HAVE_LL_CONSTANTS 1
+
+/* Define to 1 if `long int' works and is 64 bits. */
+/* #undef HAVE_LONG_INT_64 */
+
+/* Define to 1 if `long long int' works and is 64 bits. */
+#define HAVE_LONG_LONG_INT_64 
+
+/* Define to 1 if you have the `memmove' function. */
+#define HAVE_MEMMOVE 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the <netinet/in.h> header file. */
+#define HAVE_NETINET_IN_H 1
+
+/* Define to 1 if you have the <netinet/tcp.h> header file. */
+/* #undef HAVE_NETINET_TCP_H */
+
+/* Define to 1 if you have the `on_exit' function. */
+/* #undef HAVE_ON_EXIT */
+
+/* Define to 1 if you have the <pam/pam_appl.h> header file. */
+/* #undef HAVE_PAM_PAM_APPL_H */
+
+/* Define to 1 if you have the `poll' function. */
+/* #undef HAVE_POLL */
+
+/* Define to 1 if you have the <poll.h> header file. */
+/* #undef HAVE_POLL_H */
+
+/* Define to 1 if you have the POSIX signal interface. */
+/* #undef HAVE_POSIX_SIGNALS */
+
+/* Define to 1 if you have the `pstat' function. */
+/* #undef HAVE_PSTAT */
+
+/* Define to 1 if the PS_STRINGS thing exists. */
+/* #undef HAVE_PS_STRINGS */
+
+/* Define if you have POSIX threads libraries and header files. */
+/* #undef HAVE_PTHREAD */
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H 1
+
+/* Define to 1 if you have the `random' function. */
+/* #undef HAVE_RANDOM */
+
+/* Define to 1 if you have the <readline.h> header file. */
+/* #undef HAVE_READLINE_H */
+
+/* Define to 1 if you have the <readline/history.h> header file. */
+/* #undef HAVE_READLINE_HISTORY_H */
+
+/* Define to 1 if you have the <readline/readline.h> header file. */
+/* #undef HAVE_READLINE_READLINE_H */
+
+/* Define to 1 if you have the `readlink' function. */
+/* #undef HAVE_READLINK */
+
+/* Define to 1 if you have the `replace_history_entry' function. */
+/* #undef HAVE_REPLACE_HISTORY_ENTRY */
+
+/* Define to 1 if you have the `rint' function. */
+#define HAVE_RINT 1
+
+/* Define to 1 if you have the global variable
+   'rl_completion_append_character'. */
+/* #undef HAVE_RL_COMPLETION_APPEND_CHARACTER */
+
+/* Define to 1 if you have the `rl_completion_matches' function. */
+/* #undef HAVE_RL_COMPLETION_MATCHES */
+
+/* Define to 1 if you have the `rl_filename_completion_function' function. */
+/* #undef HAVE_RL_FILENAME_COMPLETION_FUNCTION */
+
+/* Define to 1 if you have the <security/pam_appl.h> header file. */
+/* #undef HAVE_SECURITY_PAM_APPL_H */
+
+/* Define to 1 if you have the `setproctitle' function. */
+/* #undef HAVE_SETPROCTITLE */
+
+/* Define to 1 if you have the `setsid' function. */
+/* #undef HAVE_SETSID */
+
+/* Define to 1 if you have the `sigprocmask' function. */
+/* #undef HAVE_SIGPROCMASK */
+
+/* Define to 1 if you have sigsetjmp(). */
+/* #undef HAVE_SIGSETJMP */
+
+/* Define to 1 if the system has the type `sig_atomic_t'. */
+#define HAVE_SIG_ATOMIC_T 1
+
+/* Define to 1 if you have the `snprintf' function. */
+#define HAVE_SNPRINTF 1
+
+/* Define to 1 if you have spinlocks. */
+#define HAVE_SPINLOCKS 1
+
+/* Define to 1 if you have the `srandom' function. */
+/* #undef HAVE_SRANDOM */
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#define HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#define HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `strdup' function. */
+#define HAVE_STRDUP 1
+
+/* Define to 1 if you have the `strerror' function. */
+#define HAVE_STRERROR 1
+
+/* Define to 1 if you have the `strerror_r' function. */
+/* #undef HAVE_STRERROR_R */
+
+/* Define to 1 if cpp supports the ANSI # stringizing operator. */
+#define HAVE_STRINGIZE 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#define HAVE_STRING_H 1
+
+/* Define to 1 if you have the `strtol' function. */
+#define HAVE_STRTOL 1
+
+/* Define to 1 if you have the `strtoll' function. */
+#define HAVE_STRTOLL 1
+
+/* Define to 1 if you have the `strtoq' function. */
+/* #undef HAVE_STRTOQ */
+
+/* Define to 1 if you have the `strtoul' function. */
+#define HAVE_STRTOUL 1
+
+/* Define to 1 if you have the `strtoull' function. */
+#define HAVE_STRTOULL 1
+
+/* Define to 1 if you have the `strtouq' function. */
+/* #undef HAVE_STRTOUQ */
+
+/* Define to 1 if the system has the type `struct addrinfo'. */
+/* #undef HAVE_STRUCT_ADDRINFO */
+
+/* Define to 1 if the system has the type `struct cmsgcred'. */
+/* #undef HAVE_STRUCT_CMSGCRED */
+
+/* Define to 1 if the system has the type `struct fcred'. */
+/* #undef HAVE_STRUCT_FCRED */
+
+/* Define to 1 if the system has the type `struct option'. */
+#define HAVE_STRUCT_OPTION 1
+
+/* Define to 1 if `sa_len' is member of `struct sockaddr'. */
+/* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */
+
+/* Define to 1 if the system has the type `struct sockaddr_storage'. */
+#define HAVE_STRUCT_SOCKADDR_STORAGE 1
+
+/* Define to 1 if `ss_family' is member of `struct sockaddr_storage'. */
+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1
+
+/* Define to 1 if `ss_len' is member of `struct sockaddr_storage'. */
+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN */
+
+/* Define to 1 if `__ss_family' is member of `struct sockaddr_storage'. */
+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */
+
+/* Define to 1 if `__ss_len' is member of `struct sockaddr_storage'. */
+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN */
+
+/* Define to 1 if the system has the type `struct sockaddr_un'. */
+/* #undef HAVE_STRUCT_SOCKADDR_UN */
+
+/* Define to 1 if the system has the type `struct sockcred'. */
+/* #undef HAVE_STRUCT_SOCKCRED */
+
+/* Define to 1 if `tm_zone' is member of `struct tm'. */
+/* #undef HAVE_STRUCT_TM_TM_ZONE */
+
+/* Define to 1 if you have the <SupportDefs.h> header file. */
+/* #undef HAVE_SUPPORTDEFS_H */
+
+/* Define to 1 if you have the `symlink' function. */
+#define HAVE_SYMLINK 1
+
+/* Define to 1 if you have the `sysconf' function. */
+/* #undef HAVE_SYSCONF */
+
+/* Define to 1 if you have the syslog interface. */
+/* #undef HAVE_SYSLOG */
+
+/* Define to 1 if you have the <sys/ipc.h> header file. */
+/* #undef HAVE_SYS_IPC_H */
+
+/* Define to 1 if you have the <sys/poll.h> header file. */
+/* #undef HAVE_SYS_POLL_H */
+
+/* Define to 1 if you have the <sys/pstat.h> header file. */
+/* #undef HAVE_SYS_PSTAT_H */
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+/* #undef HAVE_SYS_SELECT_H */
+
+/* Define to 1 if you have the <sys/sem.h> header file. */
+/* #undef HAVE_SYS_SEM_H */
+
+/* Define to 1 if you have the <sys/shm.h> header file. */
+/* #undef HAVE_SYS_SHM_H */
+
+/* Define to 1 if you have the <sys/socket.h> header file. */
+#define HAVE_SYS_SOCKET_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/un.h> header file. */
+/* #undef HAVE_SYS_UN_H */
+
+/* Define to 1 if you have the <termios.h> header file. */
+/* #undef HAVE_TERMIOS_H */
+
+/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
+   `HAVE_STRUCT_TM_TM_ZONE' instead. */
+/* #undef HAVE_TM_ZONE */
+
+/* Define to 1 if you have the `towlower' function. */
+#define HAVE_TOWLOWER 1
+
+/* Define to 1 if you have the external array `tzname'. */
+/* #undef HAVE_TZNAME */
+
+/* Define to 1 if the system has the type `uint64'. */
+/* #undef HAVE_UINT64 */
+
+/* Define to 1 if the system has the type `uint8'. */
+/* #undef HAVE_UINT8 */
+
+/* Define to 1 if the system has the type `union semun'. */
+/* #undef HAVE_UNION_SEMUN */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define to 1 if you have unix sockets. */
+/* #undef HAVE_UNIX_SOCKETS */
+
+/* Define to 1 if you have the `unsetenv' function. */
+/* #undef HAVE_UNSETENV */
+
+/* Define to 1 if you have the `utime' function. */
+#define HAVE_UTIME 1
+
+/* Define to 1 if you have the `utimes' function. */
+/* #undef HAVE_UTIMES */
+
+/* Define to 1 if you have the <utime.h> header file. */
+#define HAVE_UTIME_H 1
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#define HAVE_VSNPRINTF 1
+
+/* Define to 1 if you have the `waitpid' function. */
+/* #undef HAVE_WAITPID */
+
+/* Define to 1 if you have the <wchar.h> header file. */
+#define HAVE_WCHAR_H 1
+
+/* Define to 1 if you have the `wcstombs' function. */
+#define HAVE_WCSTOMBS 1
+
+/* Define to 1 if you have the <wctype.h> header file. */
+#define HAVE_WCTYPE_H 1
+
+/* Define to the appropriate snprintf format for 64-bit ints, if any. */
+#define INT64_FORMAT "%I64d"
+
+/* Define to build with Kerberos 4 support. (--with-krb4) */
+/* #undef KRB4 */
+
+/* Define to build with Kerberos 5 support. (--with-krb5) */
+/* #undef KRB5 */
+
+/* Define to the location of locale files. */
+#define LOCALEDIR "/usr/local/pgsql/share/locale"
+
+/* Define as the maximum alignment requirement of any C data type. */
+#define MAXIMUM_ALIGNOF 8
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "pgsql-bugs at postgresql.org"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "PostgreSQL"
+
+/* Define to the full name and version of this package. */
+#define PACKAGE_STRING "PostgreSQL 8.0.1"
+
+/* Define to the one symbol short name of this package. */
+#define PACKAGE_TARNAME "postgresql"
+
+/* Define to the version of this package. */
+#define PACKAGE_VERSION "8.0.1"
+
+/* Define to the name of the PostgreSQL service principal in Kerberos.
+   (--with-krb-srvnam=NAME) */
+#define PG_KRB_SRVNAM "postgres"
+
+/* PostgreSQL version */
+#define PG_VERSION "8.0.1"
+
+/* A string containing the version number, platform, and C compiler */
+#define PG_VERSION_STR "PostgreSQL 8.0.1 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"
+
+/* Define to the necessary symbol if this constant uses a non-standard name on
+   your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* The size of a `unsigned long', as computed by sizeof. */
+#define SIZEOF_UNSIGNED_LONG 4
+
+/* Define to 1 if you have the ANSI C header files. */
+#define STDC_HEADERS 1
+
+/* Define to 1 if strerror_r() returns a int. */
+/* #undef STRERROR_R_INT */
+
+/* Define to 1 if your <sys/time.h> declares `struct tm'. */
+/* #undef TM_IN_SYS_TIME */
+
+/* Define to the appropriate snprintf format for unsigned 64-bit ints, if any.
+   */
+#define UINT64_FORMAT "%I64u"
+
+/* Define to 1 to build with assertion checks. (--enable-cassert) */
+/* #undef USE_ASSERT_CHECKING */
+
+/* Define to 1 if you want 64-bit integer timestamp and interval support.
+   (--enable-integer-datetimes) */
+/* #undef USE_INTEGER_DATETIMES */
+
+/* Define to select named POSIX semaphores. */
+/* #undef USE_NAMED_POSIX_SEMAPHORES */
+
+/* Define to 1 to build with PAM support. (--with-pam) */
+/* #undef USE_PAM */
+
+/* Define to 1 to build with Rendezvous support. (--with-rendezvous) */
+/* #undef USE_RENDEZVOUS */
+
+/* Define to build with (Open)SSL support. (--with-openssl) */
+#define USE_SSL 1
+
+/* Define to select SysV-style semaphores. */
+#define USE_SYSV_SEMAPHORES 1
+
+/* Define to select SysV-style shared memory. */
+#define USE_SYSV_SHARED_MEMORY 1
+
+/* Define to select unnamed POSIX semaphores. */
+/* #undef USE_UNNAMED_POSIX_SEMAPHORES */
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+/* #undef _FILE_OFFSET_BITS */
+
+/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
+/* #undef _LARGEFILE_SOURCE */
+
+/* Define for large files, on AIX-style hosts. */
+/* #undef _LARGE_FILES */
+
+/* Define to empty if `const' does not conform to ANSI C. */
+/* #undef const */
+
+/* Define as `__inline' if that's what the C compiler calls it, or to nothing
+   if it is not supported. */
+/* #undef inline */
+
+/* Define to empty if the C compiler does not understand signed types. */
+/* #undef signed */
+
+/* Define to empty if the keyword `volatile' does not work. Warning: valid
+   code using `volatile' can become incorrect without. Disable with care. */
+/* #undef volatile */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pg_config_manual.h b/src/terralib/drivers/PostgreSQL/includepg/pg_config_manual.h
new file mode 100644
index 0000000..040651f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pg_config_manual.h
@@ -0,0 +1,229 @@
+/*------------------------------------------------------------------------
+ * PostgreSQL manual configuration settings
+ *
+ * This file contains various configuration symbols and limits.  In
+ * all cases, changing them is only useful in very rare situations or
+ * for developers.	If you edit any of these, be sure to do a *full*
+ * rebuild (and an initdb if noted).
+ *
+ * $PostgreSQL: pgsql/src/include/pg_config_manual.h,v 1.15 2004/09/10 14:27:37 momjian Exp $
+ *------------------------------------------------------------------------
+ */
+
+/*
+ * Size of a disk block --- this also limits the size of a tuple.  You
+ * can set it bigger if you need bigger tuples (although TOAST should
+ * reduce the need to have large tuples, since fields can be spread
+ * across multiple tuples).
+ *
+ * BLCKSZ must be a power of 2.  The maximum possible value of BLCKSZ
+ * is currently 2^15 (32768).  This is determined by the 15-bit widths
+ * of the lp_off and lp_len fields in ItemIdData (see
+ * include/storage/itemid.h).
+ *
+ * Changing BLCKSZ requires an initdb.
+ */
+#define BLCKSZ	8192
+
+/*
+ * RELSEG_SIZE is the maximum number of blocks allowed in one disk
+ * file.  Thus, the maximum size of a single file is RELSEG_SIZE *
+ * BLCKSZ; relations bigger than that are divided into multiple files.
+ *
+ * RELSEG_SIZE * BLCKSZ must be less than your OS' limit on file size.
+ * This is often 2 GB or 4GB in a 32-bit operating system, unless you
+ * have large file support enabled.  By default, we make the limit 1
+ * GB to avoid any possible integer-overflow problems within the OS.
+ * A limit smaller than necessary only means we divide a large
+ * relation into more chunks than necessary, so it seems best to err
+ * in the direction of a small limit.  (Besides, a power-of-2 value
+ * saves a few cycles in md.c.)
+ *
+ * Changing RELSEG_SIZE requires an initdb.
+ */
+#define RELSEG_SIZE (0x40000000 / BLCKSZ)
+
+/*
+ * XLOG_SEG_SIZE is the size of a single WAL file.	This must be a power of 2
+ * and larger than BLCKSZ (preferably, a great deal larger than BLCKSZ).
+ *
+ * Changing XLOG_SEG_SIZE requires an initdb.
+ */
+#define XLOG_SEG_SIZE	(16*1024*1024)
+
+/*
+ * Maximum number of columns in an index and maximum number of
+ * arguments to a function. They must be the same value.
+ *
+ * The minimum value is 8 (index creation uses 8-argument functions).
+ * There is no specific upper limit, although large values will waste
+ * system-table space and processing time.
+ *
+ * Changing these requires an initdb.
+ */
+#define INDEX_MAX_KEYS		32
+#define FUNC_MAX_ARGS		INDEX_MAX_KEYS
+
+/*
+ * Define this to make libpgtcl's "pg_result -assign" command process
+ * C-style backslash sequences in returned tuple data and convert
+ * PostgreSQL array values into Tcl lists.	CAUTION: This conversion
+ * is *wrong* unless you install the routines in
+ * contrib/string/string_io to make the server produce C-style
+ * backslash sequences in the first place.
+ */
+/* #define TCL_ARRAYS */
+
+/*
+ * User locks are handled totally on the application side as long term
+ * cooperative locks which extend beyond the normal transaction
+ * boundaries.	Their purpose is to indicate to an application that
+ * someone is `working' on an item.  Define this flag to enable user
+ * locks.  You will need the loadable module user-locks.c to use this
+ * feature.
+ */
+#define USER_LOCKS
+
+/*
+ * Define this if you want psql to _always_ ask for a username and a
+ * password for password authentication.
+ */
+/* #define PSQL_ALWAYS_GET_PASSWORDS */
+
+/*
+ * Define this if you want to allow the lo_import and lo_export SQL
+ * functions to be executed by ordinary users.	By default these
+ * functions are only available to the Postgres superuser.	CAUTION:
+ * These functions are SECURITY HOLES since they can read and write
+ * any file that the PostgreSQL server has permission to access.  If
+ * you turn this on, don't say we didn't warn you.
+ */
+/* #define ALLOW_DANGEROUS_LO_FUNCTIONS */
+
+/*
+ * MAXPGPATH: standard size of a pathname buffer in PostgreSQL (hence,
+ * maximum usable pathname length is one less).
+ *
+ * We'd use a standard system header symbol for this, if there weren't
+ * so many to choose from: MAXPATHLEN, MAX_PATH, PATH_MAX are all
+ * defined by different "standards", and often have different values
+ * on the same platform!  So we just punt and use a reasonably
+ * generous setting here.
+ */
+#define MAXPGPATH		1024
+
+/*
+ * PG_SOMAXCONN: maximum accept-queue length limit passed to
+ * listen(2).  You'd think we should use SOMAXCONN from
+ * <sys/socket.h>, but on many systems that symbol is much smaller
+ * than the kernel's actual limit.  In any case, this symbol need be
+ * twiddled only if you have a kernel that refuses large limit values,
+ * rather than silently reducing the value to what it can handle
+ * (which is what most if not all Unixen do).
+ */
+#define PG_SOMAXCONN	10000
+
+/*
+ * You can try changing this if you have a machine with bytes of
+ * another size, but no guarantee...
+ */
+#define BITS_PER_BYTE		8
+
+/*
+ * Preferred alignment for disk I/O buffers.  On some CPUs, copies between
+ * user space and kernel space are significantly faster if the user buffer
+ * is aligned on a larger-than-MAXALIGN boundary.  Ideally this should be
+ * a platform-dependent value, but for now we just hard-wire it.
+ */
+#define ALIGNOF_BUFFER	32
+
+/*
+ * Disable UNIX sockets for those operating system.
+ */
+#if defined(__QNX__) || defined(__BEOS__) || defined(WIN32)
+#undef HAVE_UNIX_SOCKETS
+#endif
+
+/*
+ * Define this if your operating system supports link()
+ */
+#if !defined(__QNX__) && !defined(__BEOS__) && \
+	!defined(WIN32) && !defined(__CYGWIN__)
+#define HAVE_WORKING_LINK 1
+#endif
+
+/*
+ * This is the default directory in which AF_UNIX socket files are
+ * placed.	Caution: changing this risks breaking your existing client
+ * applications, which are likely to continue to look in the old
+ * directory.  But if you just hate the idea of sockets in /tmp,
+ * here's where to twiddle it.  You can also override this at runtime
+ * with the postmaster's -k switch.
+ */
+#define DEFAULT_PGSOCKET_DIR  "/tmp"
+
+/*
+ * The random() function is expected to yield values between 0 and
+ * MAX_RANDOM_VALUE.  Currently, all known implementations yield
+ * 0..2^31-1, so we just hardwire this constant.  We could do a
+ * configure test if it proves to be necessary.  CAUTION: Think not to
+ * replace this with RAND_MAX.	RAND_MAX defines the maximum value of
+ * the older rand() function, which is often different from --- and
+ * considerably inferior to --- random().
+ */
+#define MAX_RANDOM_VALUE  (0x7FFFFFFF)
+
+
+/*
+ *------------------------------------------------------------------------
+ * The following symbols are for enabling debugging code, not for
+ * controlling user-visible features or resource limits.
+ *------------------------------------------------------------------------
+ */
+
+/*
+ * Define this to cause pfree()'d memory to be cleared immediately, to
+ * facilitate catching bugs that refer to already-freed values.  XXX
+ * Right now, this gets defined automatically if --enable-cassert.	In
+ * the long term it probably doesn't need to be on by default.
+ */
+#ifdef USE_ASSERT_CHECKING
+#define CLOBBER_FREED_MEMORY
+#endif
+
+/*
+ * Define this to check memory allocation errors (scribbling on more
+ * bytes than were allocated).	Right now, this gets defined
+ * automatically if --enable-cassert.  In the long term it probably
+ * doesn't need to be on by default.
+ */
+#ifdef USE_ASSERT_CHECKING
+#define MEMORY_CONTEXT_CHECKING
+#endif
+
+/*
+ * Define this to force all parse and plan trees to be passed through
+ * copyObject(), to facilitate catching errors and omissions in
+ * copyObject().
+ */
+/* #define COPY_PARSE_PLAN_TREES */
+
+/*
+ * Enable debugging print statements for lock-related operations.
+ */
+/* #define LOCK_DEBUG */
+
+/*
+ * Enable debugging print statements for WAL-related operations; see
+ * also the wal_debug GUC var.
+ */
+/* #define WAL_DEBUG */
+
+/*
+ * Other debug #defines (documentation, anyone?)
+ */
+/* #define IPORTAL_DEBUG  */
+/* #define HEAPDEBUGALL  */
+/* #define ACLDEBUG */
+/* #define RTDEBUG */
+/* #define GISTDEBUG */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pg_config_os.h b/src/terralib/drivers/PostgreSQL/includepg/pg_config_os.h
new file mode 100644
index 0000000..9049fb4
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pg_config_os.h
@@ -0,0 +1,244 @@
+/* $PostgreSQL: pgsql/src/include/port/win32.h,v 1.42 2004/12/26 19:20:33 tgl Exp $ */
+
+/* undefine and redefine after #include */
+#undef mkdir
+
+#undef ERROR
+#include <windows.h>
+#include <winsock.h>
+#include <process.h>
+#include <signal.h>
+#include <errno.h>
+
+#undef near
+
+/* Must be here to avoid conflicting with prototype in windows.h */
+#define mkdir(a,b)	mkdir(a)
+
+
+#define fsync(a)	_commit(a)
+#define ftruncate(a,b)	chsize(a,b)
+
+#define USES_WINSOCK
+
+/* defines for dynamic linking on Win32 platform */
+#if defined(__MINGW32__) || defined(__CYGWIN__)
+
+#if __GNUC__ && ! defined (__declspec)
+#error You need egcs 1.1 or newer for compiling!
+#endif
+
+#ifdef BUILDING_DLL
+#define DLLIMPORT __declspec (dllexport)
+#else							/* not BUILDING_DLL */
+#define DLLIMPORT __declspec (dllimport)
+#endif
+
+#elif defined(WIN32_CLIENT_ONLY)
+
+#if defined(_DLL)
+#define DLLIMPORT __declspec (dllexport)
+#else							/* not _DLL */
+#define DLLIMPORT __declspec (dllimport)
+#endif
+
+#else							/* not CYGWIN, not MSVC, not MingW */
+
+#define DLLIMPORT
+#endif
+
+/*
+ *	IPC defines
+ */
+#undef HAVE_UNION_SEMUN
+#define HAVE_UNION_SEMUN 1
+
+#define IPC_RMID 256
+#define IPC_CREAT 512
+#define IPC_EXCL 1024
+#define IPC_PRIVATE 234564
+#define IPC_NOWAIT	2048
+#define IPC_STAT 4096
+
+#define EACCESS 2048
+#define EIDRM 4096
+
+#define SETALL 8192
+#define GETNCNT 16384
+#define GETVAL 65536
+#define SETVAL 131072
+#define GETPID 262144
+
+/*
+ *	Shared memory
+ */
+struct shmid_ds
+{
+	int			dummy;
+	int			shm_nattch;
+};
+
+int			shmdt(const void *shmaddr);
+void	   *shmat(int memId, void *shmaddr, int flag);
+int			shmctl(int shmid, int flag, struct shmid_ds * dummy);
+int			shmget(int memKey, int size, int flag);
+
+
+/*
+ *	Semaphores
+ */
+union semun
+{
+	int			val;
+	struct semid_ds *buf;
+	unsigned short *array;
+};
+
+struct sembuf
+{
+	int			sem_flg;
+	int			sem_op;
+	int			sem_num;
+};
+
+int			semctl(int semId, int semNum, int flag, union semun);
+int			semget(int semKey, int semNum, int flags);
+int			semop(int semId, struct sembuf * sops, int flag);
+
+
+/*
+ * Signal stuff
+ */
+#define WEXITSTATUS(w)	(((w) >> 8) & 0xff)
+#define WIFEXITED(w)	(((w) & 0xff) == 0)
+#define WIFSIGNALED(w)	(((w) & 0x7f) > 0 && (((w) & 0x7f) < 0x7f))
+#define WTERMSIG(w)		((w) & 0x7f)
+
+#define sigmask(sig) ( 1 << ((sig)-1) )
+
+/* Signal function return values */
+#undef SIG_DFL
+#undef SIG_ERR
+#undef SIG_IGN
+#define SIG_DFL ((pqsigfunc)0)
+#define SIG_ERR ((pqsigfunc)-1)
+#define SIG_IGN ((pqsigfunc)1)
+
+/* Some extra signals */
+#define SIGHUP				1
+#define SIGQUIT				3
+#define SIGTRAP				5
+#define SIGABRT				22	/* Set to match W32 value -- not UNIX
+								 * value */
+#define SIGKILL				9
+#define SIGPIPE				13
+#define SIGALRM				14
+#define SIGSTOP				17
+#define SIGTSTP				18
+#define SIGCONT				19
+#define SIGCHLD				20
+#define SIGTTIN				21
+#define SIGTTOU				22	/* Same as SIGABRT -- no problem, I hope */
+#define SIGWINCH			28
+#define SIGUSR1				30
+#define SIGUSR2				31
+
+struct timezone
+{
+	int			tz_minuteswest; /* Minutes west of GMT.  */
+	int			tz_dsttime;		/* Nonzero if DST is ever in effect.  */
+};
+
+/* for setitimer in backend/port/win32/timer.c */
+#define ITIMER_REAL 0
+struct itimerval
+{
+	struct timeval it_interval;
+	struct timeval it_value;
+};
+int			setitimer(int which, const struct itimerval * value, struct itimerval * ovalue);
+
+
+/*
+ * Supplement to <sys/types.h>.
+ *
+ * Perl already has conflicting defines for uid_t and gid_t.
+ */
+#ifndef PLPERL_HAVE_UID_GID
+typedef int uid_t;
+typedef int gid_t;
+#else
+/* These are redefined by perl. */
+#define uid_t int
+#define gid_t int
+#endif
+typedef long key_t;
+
+#ifdef WIN32_CLIENT_ONLY
+typedef int pid_t;
+#endif
+
+/*
+ * Supplement to <sys/stat.h>.
+ */
+#define lstat(path, sb)	stat((path), (sb))
+
+/*
+ * Supplement to <errno.h>.
+ */
+#undef EAGAIN
+#undef EINTR
+#define EINTR WSAEINTR
+#define EAGAIN WSAEWOULDBLOCK
+#define EMSGSIZE WSAEMSGSIZE
+#define EAFNOSUPPORT WSAEAFNOSUPPORT
+#define EWOULDBLOCK WSAEWOULDBLOCK
+#define ECONNRESET WSAECONNRESET
+#define EINPROGRESS WSAEINPROGRESS
+#define ENOBUFS WSAENOBUFS
+#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
+#define ECONNREFUSED WSAECONNREFUSED
+#define EBADFD WSAENOTSOCK
+#define EOPNOTSUPP WSAEOPNOTSUPP
+
+
+/* In backend/port/win32/signal.c */
+extern DLLIMPORT HANDLE pgwin32_signal_event;
+extern HANDLE pgwin32_initial_signal_pipe;
+
+void		pgwin32_signal_initialize(void);
+HANDLE		pgwin32_create_signal_listener(pid_t pid);
+void		pgwin32_dispatch_queued_signals(void);
+void		pg_queue_signal(int signum);
+
+#ifndef FRONTEND
+#define pg_usleep(t) pgwin32_backend_usleep(t)
+void		pgwin32_backend_usleep(long microsec);
+#endif
+
+/* In backend/port/win32/socket.c */
+#ifndef FRONTEND
+#define socket(af, type, protocol) pgwin32_socket(af, type, protocol)
+#define accept(s, addr, addrlen) pgwin32_accept(s, addr, addrlen)
+#define connect(s, name, namelen) pgwin32_connect(s, name, namelen)
+#define select(n, r, w, e, timeout) pgwin32_select(n, r, w, e, timeout)
+#define recv(s, buf, len, flags) pgwin32_recv(s, buf, len, flags)
+#define send(s, buf, len, flags) pgwin32_send(s, buf, len, flags)
+
+SOCKET		pgwin32_socket(int af, int type, int protocol);
+SOCKET		pgwin32_accept(SOCKET s, struct sockaddr * addr, int *addrlen);
+int			pgwin32_connect(SOCKET s, const struct sockaddr * name, int namelen);
+int			pgwin32_select(int nfds, fd_set *readfs, fd_set *writefds, fd_set *exceptfds, const struct timeval * timeout);
+int			pgwin32_recv(SOCKET s, char *buf, int len, int flags);
+int			pgwin32_send(SOCKET s, char *buf, int len, int flags);
+
+const char *pgwin32_socket_strerror(int err);
+int pgwin32_waitforsinglesocket(SOCKET s, int what);
+
+/* in backend/port/win32/security.c */
+extern int	pgwin32_is_admin(void);
+extern int	pgwin32_is_service(void);
+#endif
+
+/* in backend/port/win32/error.c */
+extern void _dosmaperr(unsigned long);
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_date.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_date.h
new file mode 100644
index 0000000..8a98c71
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_date.h
@@ -0,0 +1,27 @@
+#ifndef PGTYPES_DATETIME
+#define PGTYPES_DATETIME
+
+#include <pgtypes_timestamp.h>
+
+typedef long date;
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+extern date PGTYPESdate_from_asc(char *, char **);
+extern char *PGTYPESdate_to_asc(date);
+extern date PGTYPESdate_from_timestamp(timestamp);
+extern void PGTYPESdate_julmdy(date, int *);
+extern void PGTYPESdate_mdyjul(int *, date *);
+extern int	PGTYPESdate_dayofweek(date);
+extern void PGTYPESdate_today(date *);
+extern int	PGTYPESdate_defmt_asc(date *, char *, char *);
+extern int	PGTYPESdate_fmt_asc(date, char *, char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* PGTYPES_DATETIME */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_error.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_error.h
new file mode 100644
index 0000000..4a1008a
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_error.h
@@ -0,0 +1,15 @@
+#define PGTYPES_NUM_OVERFLOW		301
+#define PGTYPES_NUM_BAD_NUMERIC		302
+#define PGTYPES_NUM_DIVIDE_ZERO		303
+
+#define PGTYPES_DATE_BAD_DATE		310
+#define PGTYPES_DATE_ERR_EARGS		311
+#define PGTYPES_DATE_ERR_ENOSHORTDATE	312
+#define PGTYPES_DATE_ERR_ENOTDMY	313
+#define PGTYPES_DATE_BAD_DAY		314
+#define PGTYPES_DATE_BAD_MONTH		315
+
+#define PGTYPES_TS_BAD_TIMESTAMP	320
+#define PGTYPES_TS_ERR_EINFTIME		321
+
+#define PGTYPES_INTVL_BAD_INTERVAL	330
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_interval.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_interval.h
new file mode 100644
index 0000000..fba723f
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_interval.h
@@ -0,0 +1,30 @@
+#ifndef PGTYPES_INTERVAL
+#define PGTYPES_INTERVAL
+
+typedef struct
+{
+#ifdef HAVE_INT64_TIMESTAMP
+	int64		time;			/* all time units other than months and
+								 * years */
+#else
+	double		time;			/* all time units other than months and
+								 * years */
+#endif
+	long		month;			/* months and years, after time for
+								 * alignment */
+} interval;
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+extern interval *PGTYPESinterval_from_asc(char *, char **);
+extern char *PGTYPESinterval_to_asc(interval *);
+extern int	PGTYPESinterval_copy(interval *, interval *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* PGTYPES_INTERVAL */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_numeric.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_numeric.h
new file mode 100644
index 0000000..7085672
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_numeric.h
@@ -0,0 +1,68 @@
+#ifndef PGTYPES_NUMERIC
+#define PGTYPES_NUMERIC
+
+#define NUMERIC_POS						0x0000
+#define NUMERIC_NEG						0x4000
+#define NUMERIC_NAN						0xC000
+#define NUMERIC_MAX_PRECISION			1000
+#define NUMERIC_MAX_DISPLAY_SCALE		NUMERIC_MAX_PRECISION
+#define NUMERIC_MIN_DISPLAY_SCALE		0
+#define NUMERIC_MIN_SIG_DIGITS			16
+
+#define DECSIZE 30
+
+typedef unsigned char NumericDigit;
+typedef struct
+{
+	int			ndigits;		/* number of digits in digits[] - can be
+								 * 0! */
+	int			weight;			/* weight of first digit */
+	int			rscale;			/* result scale */
+	int			dscale;			/* display scale */
+	int			sign;			/* NUMERIC_POS, NUMERIC_NEG, or
+								 * NUMERIC_NAN */
+	NumericDigit *buf;			/* start of alloc'd space for digits[] */
+	NumericDigit *digits;		/* decimal digits */
+} numeric;
+
+typedef struct
+{
+	int			ndigits;		/* number of digits in digits[] - can be
+								 * 0! */
+	int			weight;			/* weight of first digit */
+	int			rscale;			/* result scale */
+	int			dscale;			/* display scale */
+	int			sign;			/* NUMERIC_POS, NUMERIC_NEG, or
+								 * NUMERIC_NAN */
+	NumericDigit digits[DECSIZE];		/* decimal digits */
+} decimal;
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+numeric    *PGTYPESnumeric_new(void);
+void		PGTYPESnumeric_free(numeric *);
+numeric    *PGTYPESnumeric_from_asc(char *, char **);
+char	   *PGTYPESnumeric_to_asc(numeric *, int);
+int			PGTYPESnumeric_add(numeric *, numeric *, numeric *);
+int			PGTYPESnumeric_sub(numeric *, numeric *, numeric *);
+int			PGTYPESnumeric_mul(numeric *, numeric *, numeric *);
+int			PGTYPESnumeric_div(numeric *, numeric *, numeric *);
+int			PGTYPESnumeric_cmp(numeric *, numeric *);
+int			PGTYPESnumeric_from_int(signed int, numeric *);
+int			PGTYPESnumeric_from_long(signed long int, numeric *);
+int			PGTYPESnumeric_copy(numeric *, numeric *);
+int			PGTYPESnumeric_from_double(double, numeric *);
+int			PGTYPESnumeric_to_double(numeric *, double *);
+int			PGTYPESnumeric_to_int(numeric *, int *);
+int			PGTYPESnumeric_to_long(numeric *, long *);
+int			PGTYPESnumeric_to_decimal(numeric *, decimal *);
+int			PGTYPESnumeric_from_decimal(decimal *, numeric *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* PGTYPES_NUMERIC */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/pgtypes_timestamp.h b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_timestamp.h
new file mode 100644
index 0000000..8b3bf94
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/pgtypes_timestamp.h
@@ -0,0 +1,33 @@
+#ifndef PGTYPES_TIMESTAMP
+#define PGTYPES_TIMESTAMP
+
+#include <pgtypes_interval.h>
+
+#ifdef HAVE_INT64_TIMESTAMP
+typedef int64 timestamp;
+typedef int64 TimestampTz;
+
+#else
+typedef double timestamp;
+typedef double TimestampTz;
+#endif
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+extern timestamp PGTYPEStimestamp_from_asc(char *, char **);
+extern char *PGTYPEStimestamp_to_asc(timestamp);
+extern int	PGTYPEStimestamp_sub(timestamp *, timestamp *, interval *);
+extern int	PGTYPEStimestamp_fmt_asc(timestamp *, char *, int, char *);
+extern void PGTYPEStimestamp_current(timestamp *);
+extern int	PGTYPEStimestamp_defmt_asc(char *, char *, timestamp *);
+extern int  PGTYPEStimestamp_add_interval(timestamp *tin, interval *span, timestamp *tout);
+extern int  PGTYPEStimestamp_sub_interval(timestamp *tin, interval *span, timestamp *tout);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif   /* PGTYPES_TIMESTAMP */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/postgres_ext.h b/src/terralib/drivers/PostgreSQL/includepg/postgres_ext.h
new file mode 100644
index 0000000..efffad2
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/postgres_ext.h
@@ -0,0 +1,69 @@
+/*-------------------------------------------------------------------------
+ *
+ * postgres_ext.h
+ *
+ *	   This file contains declarations of things that are visible everywhere
+ *	in PostgreSQL *and* are visible to clients of frontend interface libraries.
+ *	For example, the Oid type is part of the API of libpq and other libraries.
+ *
+ *	   Declarations which are specific to a particular interface should
+ *	go in the header file for that interface (such as libpq-fe.h).	This
+ *	file is only for fundamental Postgres declarations.
+ *
+ *	   User-written C functions don't count as "external to Postgres."
+ *	Those function much as local modifications to the backend itself, and
+ *	use header files that are otherwise internal to Postgres to interface
+ *	with the backend.
+ *
+ * $PostgreSQL: pgsql/src/include/postgres_ext.h,v 1.16 2004/08/29 05:06:55 momjian Exp $
+ *
+ *-------------------------------------------------------------------------
+ */
+
+#ifndef POSTGRES_EXT_H
+#define POSTGRES_EXT_H
+
+/*
+ * Object ID is a fundamental type in Postgres.
+ */
+typedef unsigned int Oid;
+
+#ifdef __cplusplus
+#define InvalidOid		(Oid(0))
+#else
+#define InvalidOid		((Oid) 0)
+#endif
+
+#define OID_MAX  UINT_MAX
+/* you will need to include <limits.h> to use the above #define */
+
+
+/*
+ * NAMEDATALEN is the max length for system identifiers (e.g. table names,
+ * attribute names, function names, etc).  It must be a multiple of
+ * sizeof(int) (typically 4).
+ *
+ * NOTE that databases with different NAMEDATALEN's cannot interoperate!
+ */
+#define NAMEDATALEN 64
+
+
+/*
+ * Identifiers of error message fields.  Kept here to keep common
+ * between frontend and backend, and also to export them to libpq
+ * applications.
+ */
+#define PG_DIAG_SEVERITY		'S'
+#define PG_DIAG_SQLSTATE		'C'
+#define PG_DIAG_MESSAGE_PRIMARY 'M'
+#define PG_DIAG_MESSAGE_DETAIL	'D'
+#define PG_DIAG_MESSAGE_HINT	'H'
+#define PG_DIAG_STATEMENT_POSITION 'P'
+#define PG_DIAG_INTERNAL_POSITION 'p'
+#define PG_DIAG_INTERNAL_QUERY	'q'
+#define PG_DIAG_CONTEXT			'W'
+#define PG_DIAG_SOURCE_FILE		'F'
+#define PG_DIAG_SOURCE_LINE		'L'
+#define PG_DIAG_SOURCE_FUNCTION 'R'
+
+#endif
diff --git a/src/terralib/drivers/PostgreSQL/includepg/sql3types.h b/src/terralib/drivers/PostgreSQL/includepg/sql3types.h
new file mode 100644
index 0000000..6909f2c
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/sql3types.h
@@ -0,0 +1,48 @@
+#ifndef _ECPG_SQL3TYPES_H
+#define _ECPG_SQL3TYPES_H
+
+/* SQL3 dynamic type codes
+ *
+ * Copyright (c) 2000, Christof Petig <christof.petig at wtal.de>
+ *
+ * $PostgreSQL: pgsql/src/interfaces/ecpg/include/sql3types.h,v 1.10 2004/08/29 05:06:59 momjian Exp $
+ */
+
+/* chapter 13.1 table 2: Codes used for SQL data types in Dynamic SQL */
+
+enum
+{
+	SQL3_CHARACTER = 1,
+	SQL3_NUMERIC,
+	SQL3_DECIMAL,
+	SQL3_INTEGER,
+	SQL3_SMALLINT,
+	SQL3_FLOAT,
+	SQL3_REAL,
+	SQL3_DOUBLE_PRECISION,
+	SQL3_DATE_TIME_TIMESTAMP,
+	SQL3_INTERVAL,				/* 10 */
+	SQL3_CHARACTER_VARYING = 12,
+	SQL3_ENUMERATED,
+	SQL3_BIT,
+	SQL3_BIT_VARYING,
+	SQL3_BOOLEAN,
+	SQL3_abstract
+	/* the rest is xLOB stuff */
+};
+
+/* chapter 13.1 table 3: Codes associated with datetime data types in Dynamic SQL */
+
+enum
+{
+	SQL3_DDT_DATE = 1,
+	SQL3_DDT_TIME,
+	SQL3_DDT_TIMESTAMP,
+	SQL3_DDT_TIME_WITH_TIME_ZONE,
+	SQL3_DDT_TIMESTAMP_WITH_TIME_ZONE,
+
+	SQL3_DDT_ILLEGAL			/* not a datetime data type (not part of
+								 * standard) */
+};
+
+#endif   /* !_ECPG_SQL3TYPES_H */
diff --git a/src/terralib/drivers/PostgreSQL/includepg/sqlca.h b/src/terralib/drivers/PostgreSQL/includepg/sqlca.h
new file mode 100644
index 0000000..aaf97d0
--- /dev/null
+++ b/src/terralib/drivers/PostgreSQL/includepg/sqlca.h
@@ -0,0 +1,66 @@
+#ifndef POSTGRES_SQLCA_H
+#define POSTGRES_SQLCA_H
+
+#ifndef DLLIMPORT
+#if  defined(WIN32) || defined(__CYGWIN__)
+#define DLLIMPORT __declspec (dllimport)
+#else
+#define DLLIMPORT
+#endif   /* __CYGWIN__ */
+#endif   /* DLLIMPORT */
+
+#define SQLERRMC_LEN	70
+
+#ifdef __cplusplus
+extern		"C"
+{
+#endif
+
+struct sqlca_t
+{
+	char		sqlcaid[8];
+	long		sqlabc;
+	long		sqlcode;
+	struct
+	{
+		int			sqlerrml;
+		char		sqlerrmc[SQLERRMC_LEN];
+	}			sqlerrm;
+	char		sqlerrp[8];
+	long		sqlerrd[6];
+	/* Element 0: empty						*/
+	/* 1: OID of processed tuple if applicable			*/
+	/* 2: number of rows processed				*/
+	/* after an INSERT, UPDATE or				*/
+	/* DELETE statement					*/
+	/* 3: empty						*/
+	/* 4: empty						*/
+	/* 5: empty						*/
+	char		sqlwarn[8];
+	/* Element 0: set to 'W' if at least one other is 'W'	*/
+	/* 1: if 'W' at least one character string		*/
+	/* value was truncated when it was			*/
+	/* stored into a host variable.				*/
+
+	/*
+	 * 2: if 'W' a (hopefully) non-fatal notice occurred
+	 */	/* 3: empty */
+	/* 4: empty						*/
+	/* 5: empty						*/
+	/* 6: empty						*/
+	/* 7: empty						*/
+
+	char		sqlstate[5];
+};
+
+struct sqlca_t *ECPGget_sqlca(void);
+
+#ifndef POSTGRES_ECPG_INTERNAL
+#define sqlca (*ECPGget_sqlca())
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/terralib/functions/TeAddressLocator.cpp b/src/terralib/functions/TeAddressLocator.cpp
new file mode 100644
index 0000000..5d32a15
--- /dev/null
+++ b/src/terralib/functions/TeAddressLocator.cpp
@@ -0,0 +1,3357 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ * TODO: 1. Usar os 5 primeiros d�gitos do CEP para desempatar, pois eles levam 
+ *          ao bairro.
+ */
+
+#include "TeAddressLocator.h"
+#include "TeUtils.h"
+
+#include "TeProgress.h"
+#include "TeAsciiFile.h"
+#include "TeVectorRemap.h"
+
+#include <string>
+
+using namespace std;
+
+double TeSimilarity(const char* streetname, const char* rotuloname);
+
+void validColumnName(TeAttributeRep& rep, TeAttributeList& attrList)
+{
+	unsigned int nStep = attrList.size();
+
+	string repName = TeConvertToUpperCase(rep.name_);
+
+	bool alter = true;
+
+	while(alter)
+	{
+		alter = false;
+
+		for(unsigned int i = 0; i < nStep; ++i)
+		{
+			if(TeConvertToUpperCase(attrList[i].rep_.name_) == repName)
+			{
+				rep.name_ += "_";
+				alter = true;
+				repName = TeConvertToUpperCase(rep.name_);
+			}
+		}
+	}
+}
+
+void tokenize(const string& name, vector<string>& tokens)
+{
+	unsigned int nStep = name.size();
+
+	string token = "";
+
+	unsigned int i = 0;
+
+	for(i = 0; i < nStep; ++i)
+	{
+		if(name[i] != ' ')
+			token += name[i];
+		else
+		{
+			if(!token.empty())
+			{
+				tokens.push_back(token);
+				token = "";
+			}
+		}		
+	}
+
+	if(!token.empty())
+		tokens.push_back(token);
+}
+
+//---- TeAddressLocator methods
+
+bool TeAddressLocator::createAddressMetadataTable(void)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	if(db_->tableExist("te_address_locator"))
+	{
+		// Verificar se a coluna com o nome completo existe.
+		// Nas vers�es anteriores essa coluna n�o era usada.
+
+		TeAttribute attr;
+
+		if(!db_->columnExist("te_address_locator", "location_full_name", attr))
+		{
+			// Se a coluna n�o existe, tenta adicionar a coluna � tabela de metadado
+			TeAttribute at10;
+			at10.rep_.type_ = TeSTRING;
+			at10.rep_.name_ = "location_full_name";
+			at10.rep_.numChar_ = 255;
+
+			if(!db_->addColumn("te_address_locator", at10.rep_))
+			{
+				errMsg_ = "Couldn't add location_full_name column to te_address_locator table!";
+
+				return false;
+			}			
+		}
+
+
+		errMsg_ = "The te_address_locator table already exist!";
+
+		return false;
+	}
+	
+	TeAttributeList attList;
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeINT;
+	at1.rep_.name_ = "table_id";
+	at1.rep_.isPrimaryKey_ = true;
+	at1.rep_.isAutoNumber_ = false;
+	attList.push_back(at1);	
+
+	TeAttribute at2;
+	at2.rep_.type_ = TeSTRING;
+	at2.rep_.name_ = "initial_left_number";
+	at2.rep_.numChar_ = 255;
+	attList.push_back(at2);	
+
+	TeAttribute at3;
+	at3.rep_.type_ = TeSTRING;
+	at3.rep_.name_ = "final_left_number";
+	at3.rep_.numChar_ = 255;
+	attList.push_back(at3);	
+
+	TeAttribute at4;
+	at4.rep_.type_ = TeSTRING;
+	at4.rep_.name_ = "initial_right_number";
+	at4.rep_.numChar_ = 255;
+	attList.push_back(at4);	
+
+	TeAttribute at5;
+	at5.rep_.type_ = TeSTRING;
+	at5.rep_.name_ = "final_right_number";
+	at5.rep_.numChar_ = 255;
+	attList.push_back(at5);
+
+	TeAttribute at6;
+	at6.rep_.type_ = TeSTRING;
+	at6.rep_.name_ = "location_type";
+	at6.rep_.numChar_ = 255;
+	attList.push_back(at6);
+
+	TeAttribute at7;
+	at7.rep_.type_ = TeSTRING;
+	at7.rep_.name_ = "location_title";
+	at7.rep_.numChar_ = 255;
+	attList.push_back(at7);
+
+	TeAttribute at8;
+	at8.rep_.type_ = TeSTRING;
+	at8.rep_.name_ = "location_preposition";
+	at8.rep_.numChar_ = 255;
+	attList.push_back(at8);
+
+	TeAttribute at9;
+	at9.rep_.type_ = TeSTRING;
+	at9.rep_.name_ = "location_name";
+	at9.rep_.numChar_ = 255;
+	attList.push_back(at9);
+
+	TeAttribute at10;
+	at10.rep_.type_ = TeSTRING;
+	at10.rep_.name_ = "location_full_name";
+	at10.rep_.numChar_ = 255;
+	attList.push_back(at10);
+
+
+	TeAttribute at11;
+	at11.rep_.type_ = TeSTRING;
+	at11.rep_.name_ = "left_neighborhood";
+	at11.rep_.numChar_ = 255;
+	attList.push_back(at11);
+
+	TeAttribute at12;
+	at12.rep_.type_ = TeSTRING;
+	at12.rep_.name_ = "right_neighborhood";
+	at12.rep_.numChar_ = 255;
+	attList.push_back(at12);
+
+	TeAttribute at13;
+	at13.rep_.type_ = TeSTRING;
+	at13.rep_.name_ = "left_zip_code";
+	at13.rep_.numChar_ = 255;
+	attList.push_back(at13);
+
+	TeAttribute at14;
+	at14.rep_.type_ = TeSTRING;
+	at14.rep_.name_ = "right_zip_code";
+	at14.rep_.numChar_ = 255;
+	attList.push_back(at14);
+
+	if(!db_->createTable("te_address_locator", attList))
+	{
+		errMsg_ = "Could not create te_address_locator table!";
+
+		return false;
+	}
+
+	if(!db_->createRelation("address_locator_relation", "te_address_locator", "table_id", "te_layer_table", "table_id", true))
+	{
+		errMsg_ = "Referential integrity could not be stabilished beteween te_address_locator and te_layer_table tables!";
+	
+		return false;
+	}
+
+	return true;
+}
+
+bool TeAddressLocator::insertAddressMetadata(const TeAddressMetadata& metadata)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	string sql  = "INSERT INTO te_address_locator (table_id, initial_left_number, ";
+	       sql += "final_left_number, initial_right_number, final_right_number, ";
+		   sql += "location_type, location_title, location_preposition, location_name, location_full_name, left_neighborhood, right_neighborhood, ";
+		   sql += "left_zip_code, right_zip_code) VALUES(";
+		   sql += Te2String(metadata.tableId_);
+		   sql += ", '";
+		   sql += metadata.initialLeftNumber_;
+		   sql += "', '";
+		   sql += metadata.finalLeftNumber_;
+		   sql += "', '";
+		   sql += metadata.initialRightNumber_;
+		   sql += "', '";
+		   sql += metadata.finalRightNumber_;
+		   sql += "', '";
+		   sql += metadata.locationType_;
+		   sql += "', '";
+		   sql += metadata.locationTitle_;
+		   sql += "', '";
+		   sql += metadata.locationPreposition_;
+		   sql += "', '";
+		   sql += metadata.locationName_;
+		   sql += "', '";
+		   sql += metadata.locationCompleteName_;
+		   sql += "', '";
+		   sql += metadata.leftNeighborhood_;
+		   sql += "', '";
+		   sql += metadata.rightNeighborhood_;
+		   sql += "', '";
+		   sql += metadata.leftZipCode_;
+		   sql += "', '";
+		   sql += metadata.rightZipCode_;
+		   sql += "')";
+
+	if(!db_->execute(sql))
+	{
+		errMsg_ = "Could not insert metadata information about geocoding base table!";
+
+		return false;
+	}	
+
+	return loadAddressMetadata(metadata.tableId_);
+	
+	//if(!metadata.leftZipCode_.empty())
+	//	removeHifen_ = verifyHifen(metadata_.tableName_, metadata.leftZipCode_);
+
+	//return true;
+}
+
+bool TeAddressLocator::updateAddressMetadata(const TeAddressMetadata& metadata)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	//if(metadata_.tableId_ != metadata.tableId_)
+	//	return false;	// Doesn't update a diferent attribute table....
+
+	string sql  = "UPDATE te_address_locator SET initial_left_number = '";
+	       sql += metadata.initialLeftNumber_;
+		   sql += "', final_left_number = '";
+		   sql += metadata.finalLeftNumber_;
+		   sql += "', initial_right_number = '";
+		   sql += metadata.initialRightNumber_;
+		   sql += "', final_right_number = '";
+		   sql += metadata.finalRightNumber_;
+		   sql += "', location_type = '";
+		   sql += metadata.locationType_;
+		   sql += "', location_title = '";
+		   sql += metadata.locationTitle_;
+		   sql += "', location_preposition = '";
+		   sql += metadata.locationPreposition_;
+		   sql += "', location_name = '";
+		   sql += metadata.locationName_;
+		   sql += "', location_full_name = '";
+		   sql += metadata.locationCompleteName_;
+		   sql += "', left_neighborhood = '";
+		   sql += metadata.leftNeighborhood_;
+		   sql += "', right_neighborhood = '";
+		   sql += metadata.rightNeighborhood_;
+		   sql += "', left_zip_code = '";
+		   sql += metadata.leftZipCode_;
+		   sql += "', right_zip_code = '";
+		   sql += metadata.rightZipCode_;
+		   sql += "' WHERE table_id = ";
+		   sql += Te2String(metadata.tableId_);	
+
+	if(!db_->execute(sql))
+	{
+		errMsg_ = "Could not update metadata information about geocoding base table!";
+
+		return false;
+	}
+
+	return loadAddressMetadata(metadata.tableId_);
+
+	//if(!metadata.leftZipCode_.empty())
+	//	removeHifen_ = verifyHifen(metadata_.tableName_, metadata.leftZipCode_);	
+
+	//return true;
+}
+
+bool TeAddressLocator::deleteAddressMetadata(const int& tableId)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	string sql  = "DELETE FROM te_address_locator WHERE table_id = ";
+	       sql += Te2String(tableId);
+
+	if(db_->execute(sql))
+		return true;
+	else
+	{
+		errMsg_ = "Could not remove metadata information about geocoding base table!";
+
+		return false;
+	}
+}
+
+bool TeAddressLocator::loadAddressMetadata(const int& tableId)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	isMetadataLoaded_ = false;
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string sql  = "SELECT te_address_locator.*, te_layer_table.attr_table, te_layer_table.attr_link, te_layer.layer_id";
+		   sql += "  FROM te_address_locator, te_layer_table, te_layer ";
+		   sql += " WHERE  te_layer_table.layer_id = te_layer.layer_id ";
+		   sql += "        AND ";
+		   sql += "        te_address_locator.table_id = te_layer_table.table_id ";
+		   sql += "        AND ";
+		   sql += "        te_address_locator.table_id = ";
+	       sql += Te2String(tableId);
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+
+		errMsg_ = "Could not find metadata for geocoding base table!";
+
+		return false;
+	}
+
+	fillAddressMetadata(metadata_, portal);
+
+	int layerId = portal->getInt("layer_id");
+
+	referenceLayer_ = db_->layerMap()[layerId];
+
+	delete portal;
+
+	if(referenceLayer_ == 0)
+	{
+		errMsg_ = "Could not find infolayer to be used as base for geocoding!";
+				
+		return false;
+	}
+
+	isMetadataLoaded_ = true;
+
+
+	if(!metadata_.leftZipCode_.empty())
+		removeHifen_ = !verifyHifen(metadata_.tableName_, metadata_.leftZipCode_);
+
+	return true;
+}
+
+bool TeAddressLocator::setAddressLocatorMetadata(const TeAddressMetadata& m)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string sql  = "SELECT te_layer.layer_id";
+		   sql += "  FROM te_layer_table, te_layer ";
+		   sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+		   sql += "       AND ";
+		   sql += "       te_layer_table.table_id = ";
+	       sql += Te2String(m.tableId_);
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+
+		errMsg_ = "Could not find layer for geocoding base table!";
+
+		return false;
+	}
+
+	int layerId = portal->getInt("layer_id");
+
+	referenceLayer_ = db_->layerMap()[layerId];
+
+	if(referenceLayer_ == 0)
+	{
+		errMsg_ = "Could not find infolayer to be used as base for geocoding!";
+				
+		return false;
+	}
+
+	metadata_ = m;
+
+	isMetadataLoaded_ = true;
+
+	if(!metadata_.leftZipCode_.empty())
+		removeHifen_ = !verifyHifen(metadata_.tableName_, metadata_.leftZipCode_);
+
+	return true;
+}
+
+bool TeAddressLocator::getAllAddressMetadataLayer(const int& layerId, vector<TeAddressMetadata>& addVec)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string sql  = "SELECT te_address_locator.*, te_layer_table.attr_table, te_layer_table.attr_link, te_layer.layer_id ";
+		   sql += "  FROM te_address_locator, te_layer_table, te_layer ";
+		   sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+		   sql += "       AND ";
+		   sql += "       te_address_locator.table_id = te_layer_table.table_id ";
+		   sql += "       AND ";
+		   sql += "       te_layer_table.layer_id = "; 
+	       sql += Te2String(layerId);
+		   sql += " ORDER BY te_layer_table.table_id";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		TeAddressMetadata m;
+
+		this->fillAddressMetadata(m, portal);		
+
+		addVec.push_back(m);
+	}
+
+	delete portal;
+
+	return true;
+}
+
+bool TeAddressLocator::getAllAddressMetadataTheme(const int& themeId, vector<TeAddressMetadata>& addVec)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string sql  = "SELECT te_address_locator.*, te_layer_table.attr_table, te_layer_table.attr_link, te_layer.layer_id";
+	       sql += "  FROM te_theme_table, te_layer_table, te_address_locator, te_layer ";
+		   sql += " WHERE te_layer_table.layer_id = te_layer.layer_id ";
+		   sql += "       AND ";
+		   sql += "       te_layer_table.table_id = te_address_locator.table_id ";
+		   sql += "       AND ";
+		   sql += "       te_theme_table.table_id = te_layer_table.table_id "; 
+		   sql += "       AND ";
+		   sql += "       te_theme_table.theme_id = ";
+	       sql += Te2String(themeId);
+		   sql += " ORDER BY te_theme_table.table_id";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		TeAddressMetadata m;
+
+		this->fillAddressMetadata(m, portal);		
+
+		addVec.push_back(m);
+	}
+
+	delete portal;
+
+	return true;
+}
+
+bool TeAddressLocator::getAddressLocatorLayers(vector<pair<int, string> >& layerNameVec)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string sql  = "SELECT DISTINCT te_layer.layer_id, te_layer.name ";
+	       sql += "  FROM te_address_locator, te_layer_table, te_layer ";
+		   sql += " WHERE te_layer.layer_id = te_layer_table.layer_id ";
+		   sql += "       AND ";
+		   sql += "       te_address_locator.table_id = te_layer_table.table_id "; 
+		   sql += " ORDER BY te_layer.name ASC";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		pair<int, string> d(atoi(portal->getData(0)), portal->getData(1));
+		layerNameVec.push_back(d);
+	}
+
+	delete portal;
+
+	return true;
+}
+
+bool TeAddressLocator::getAddressLocatorLayerTables(vector<pair<int, string> >& tableNameVec, const int& layerId)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string sql  = "SELECT te_layer_table.table_id, te_layer_table.attr_table ";
+	       sql += "  FROM te_address_locator, te_layer_table ";
+		   sql += " WHERE te_layer_table.table_id = te_address_locator.table_id";
+		   sql += "       AND ";
+		   sql += "       te_layer_table.layer_id = ";
+		   sql += Te2String(layerId);
+		   sql += " ORDER BY te_layer_table.attr_table ASC";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		pair<int, string> d(atoi(portal->getData(0)), portal->getData(1));
+		tableNameVec.push_back(d);
+	}
+
+	delete portal;
+
+	return true;
+}
+
+bool TeAddressLocator::findGeocodingTables(vector<pair<int, string> >& tableNames)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	string sql  = "SELECT * FROM te_layer_table WHERE attr_table_type = ";
+	       sql += Te2String(TeGeocodingData);
+		   sql += " ORDER BY attr_table";
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;	
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		pair<int, string> d(atoi(portal->getData("table_id")), portal->getData("attr_table"));
+		tableNames.push_back(d);
+	}
+
+	delete portal;
+
+	return true;
+}
+
+
+// 8    -> Found by similar search
+// 9    -> Found by neighborhood or zip code
+
+// 10	 -> Found by name location and number without type
+// 11	 -> Found multiples by name location and number  without type
+// 12	 -> Found by name location without number and type
+// 13	 -> Found multiples by name location without number and type
+
+// 14	 -> Found by name location and number without type and title
+// 15	 -> Found multiples by name location and number  without type and title
+// 16	 -> Found by name location without number and type and title
+// 17	 -> Found multiples by name location without number and type and title
+
+// 18	 -> Found by name location and number without type, title and preposition
+// 19	 -> Found multiples by name location and number  without type, title and preposition
+// 20	 -> Found by name location without number and type, title and preposition
+// 21	 -> Found multiples by name location without number and type, title and preposition
+
+
+
+int TeAddressLocator::findAddress(const TeAddress& address, vector<TeAddressDescription>& addressesFound, const bool& doExaustiveSearch)
+{
+	TeAddress addAux = address;
+
+	string fullName = "";
+
+	normalizeAddress(addAux, fullName);
+
+	if(fullName.empty())
+		return 2;
+
+	// Encontra exato com n�mero
+	int result = findExact(addAux, fullName, true, addressesFound);
+
+	if(result > 3)
+		return result;
+
+	// Encontra exato sem n�mero
+	result = findExact(addAux, fullName, false, addressesFound);
+
+	if(result > 3)
+		return result;
+
+	// Encontrar com a ajuda do dicion�rio sem n�mero
+	if(!dictionary_.empty())
+	{
+		// Dicion�rio com n�mero
+		result = findWithDictionary(addAux, fullName, true, addressesFound);
+
+		if(result > 3)
+			return result;
+
+
+		// Dicion�rio sem n�mero
+		result = findWithDictionary(addAux, fullName, false, addressesFound);
+
+		if(result > 3)
+			return result;
+	}
+
+	// ***********************************
+	// * Try to search by a similar name *
+	// ***********************************
+	TeAddressDescription descript;
+
+	if((addAux.locationNumber_ != 0) && findSimilarAddress(addAux, fullName, descript))
+	{
+		addressesFound.clear();
+		addressesFound.push_back(descript);
+
+		return 8;
+	}
+
+	if(doExaustiveSearch)
+	{
+		// Tenta remover o tipo
+		if(!typesVector_.empty())
+		{
+			result = findWithoutAllName(addAux, fullName, addressesFound, true);
+
+			switch(result)
+			{
+				case 4 :	return 10;
+				case 5 :	return 11;
+				case 6 :    return 12;
+				case 7 :    return 13;
+			}
+		}
+
+
+		// Tenta remover titulo
+		if(!titlesVector_.empty())
+		{
+			result = findWithoutAllName(addAux, fullName, addressesFound, true, true);
+
+			switch(result)
+			{
+				case 4 :	return 14;
+				case 5 :	return 15;
+				case 6 :    return 16;
+				case 7 :    return 17;
+			}
+		}
+
+
+		// Tenta remover preposicao
+		if(!prepositionsVector_.empty())
+		{
+			result = findWithoutAllName(addAux, fullName, addressesFound, true, true, true);
+
+			switch(result)
+			{
+				case 4 :	return 18;
+				case 5 :	return 19;
+				case 6 :    return 20;
+				case 7 :    return 21;
+			}
+		}
+	}
+
+	
+	// *****************************************
+	// * Try to match zip code or neighborhood *
+	// *****************************************
+	if(cmetadata_.centroidLayer_)
+	{
+		if(findByCentroid(addAux, addressesFound))
+		{
+			if(addressesFound.size() > 1)
+				return 1;
+			else
+				return 9;
+		}
+	}
+
+	return result;
+}
+
+
+int TeAddressLocator::findWithDictionary(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound)
+{
+	// Quebrar o nome em tokens
+	vector<string> tokens;
+	tokenize(fullName, tokens);
+
+
+	// Para cada token, procurar um sin�nimo
+	for(unsigned int i = 0; i < tokens.size(); ++i)
+	{
+		pair<TeGeocoderDictionary::iterator, TeGeocoderDictionary::iterator> itRange = dictionary_.equal_range(tokens[i]);
+
+		while(itRange.first != itRange.second)
+		{
+			// Monta o nome para pesquisa
+			string str = "";
+
+			for(unsigned int j = 0; j < tokens.size(); ++j)
+			{
+				if(j != 0)
+					str += " ";
+
+				if(j == i)
+					str += (itRange.first)->second;
+				else
+					str += tokens[j];
+			}
+
+			// Fazer a pesquisa exata
+			int res = findExact(address, str, withNumber, addressesFound);
+
+			if(res > 3)
+				return res;
+
+			++(itRange.first);
+		}
+	}
+
+	return 1;
+}
+
+int TeAddressLocator::findWithoutAllName(const TeAddress& address, const string& fullName, vector<TeAddressDescription>& addressesFound, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+	// Quebrar o nome em tokens
+	vector<string> tokens;
+	tokenize(fullName, tokens);
+
+	string str = "";
+
+	bool typeYetDisabled = false;
+	bool titleYetDisabled = false;
+	bool prepositionYetDisabled = false;
+
+	unsigned int i = 0;
+
+	// Ve se precisa eliminar algum token e j� tenta sem usar dicion�rio
+	for(i = 0; i < tokens.size(); ++i)
+	{
+		string aux = tokens[i];
+
+		// verifica se o string ser� eliminado caso o tipo esteja desabilitado
+		if(disabletype)
+		{
+			if(binary_search(typesVector_.begin(), typesVector_.end(), aux))
+			{
+				aux = "";
+				typeYetDisabled = true;
+				continue;
+			}
+		}
+
+		if(disabletitle)
+		{
+			if(binary_search(titlesVector_.begin(), titlesVector_.end(), aux))
+			{
+				aux = "";
+				titleYetDisabled = true;
+				continue;
+			}
+
+		}
+
+		if(disablepreposition && !prepositionYetDisabled)
+		{
+			if(binary_search(prepositionsVector_.begin(), prepositionsVector_.end(), aux))
+			{
+				aux = "";
+				prepositionYetDisabled = true;
+				continue;
+			}
+		}
+
+		if(!str.empty())
+			str += " ";
+
+		str += aux;
+	}
+
+	int res = 1;
+
+	if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+	{
+		res = findPattern(address, str, true, addressesFound, disabletype, disabletitle, disablepreposition);
+
+		if(res > 3)
+			return res;
+	}
+
+	if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+	{
+		res = findPattern(address, str, false, addressesFound, disabletype, disabletitle, disablepreposition);
+
+		if(res > 3)
+			return res;
+	}
+
+	if(dictionary_.empty())
+		return 1;
+
+	// Para cada token, procurar um sin�nimo
+	for(i = 0; i < tokens.size(); ++i)
+	{
+		pair<TeGeocoderDictionary::iterator, TeGeocoderDictionary::iterator> itRange = dictionary_.equal_range(tokens[i]);
+
+
+		while(itRange.first != itRange.second)
+		{
+			// Monta o nome para pesquisa
+			str = "";
+			typeYetDisabled = false;
+			titleYetDisabled = false;
+			prepositionYetDisabled = false;
+
+
+			for(unsigned int j = 0; j < tokens.size(); ++j)
+			{
+				string aux = "";
+
+				if(j == i)
+				{
+					aux = (itRange.first)->second;
+				}
+				else
+				{
+					aux = tokens[j];
+				}
+
+				// verifica se o string ser� eliminado caso o tipo esteja desabilitado
+				if(disabletype)
+				{
+					if(binary_search(typesVector_.begin(), typesVector_.end(), aux))
+					{
+						aux = "";
+						typeYetDisabled = true;
+						continue;
+					}
+				}
+
+				if(disabletitle)
+				{
+					if(binary_search(titlesVector_.begin(), titlesVector_.end(), aux))
+					{
+						aux = "";
+						titleYetDisabled = true;
+						continue;
+					}
+
+				}
+
+				if(disablepreposition && !prepositionYetDisabled)
+				{
+					if(binary_search(prepositionsVector_.begin(), prepositionsVector_.end(), aux))
+					{
+						aux = "";
+						prepositionYetDisabled = true;
+						continue;
+					}
+				}
+
+				if(!str.empty())
+					str += " ";
+
+				str += aux;
+			}
+
+			if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+			{
+				res = findPattern(address, str, true, addressesFound, disabletype, disabletitle, disablepreposition);
+
+				if(res > 3)
+					return res;
+			}
+
+			if(typeYetDisabled || titleYetDisabled || prepositionYetDisabled)
+			{
+				res = findPattern(address, str, false, addressesFound, disabletype, disabletitle, disablepreposition);
+
+				if(res > 3)
+					return res;
+			}
+
+			++(itRange.first);
+		}
+	}
+
+	return 1;
+}
+
+// 0	 -> Database connection problem
+// 1     -> Address not found
+// 3     -> Error on query the database
+// 4	 -> Found by name location and number
+// 5	 -> Found multiples by name location and number
+// 6	 -> Found by name location without number 
+// 7	 -> Found multiples by name location without number
+int TeAddressLocator::findExact(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound)
+{
+	TeAddress addressToFind = address;
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return 0;
+	}
+
+	// The status of a query
+	bool executeQuery = false;
+
+	// String with the result query expression
+	string strSQL = "";
+
+	// String with the select...from clause
+	string strSelect  = "SELECT * FROM ";
+	       strSelect += metadata_.tableName_;
+		   
+	// String with the where clause;
+	string strWhere = " WHERE ";
+
+	// **************************************************
+	// * Try to match name an number                    *
+	// **************************************************		
+	{
+		int auxNumber = addressToFind.locationNumber_ ;
+
+		if(!withNumber)
+			addressToFind.locationNumber_ = 0;
+
+		strWhere += mountExactWhereSQL(addressToFind, fullName);
+
+		strSQL = strSelect + strWhere;
+
+		queryAddresses(strSQL, executeQuery, addressesFound);
+
+		if(addressesFound.size() > 0)
+		{
+			if((addressesFound.size() > 1) && (!addressToFind.zipCode_.empty()))
+				this->refineFoundedLocationsByZipCode(addressToFind, addressesFound);
+
+			if((addressesFound.size() > 1) && (!addressToFind.neighborhood_.empty()))
+				this->refineFoundedLocationsByNeighBorhood(addressToFind, addressesFound);
+
+			if((addressesFound.size() > 1) && (!metadata_.leftZipCode_.empty() || !metadata_.rightZipCode_.empty()) && (addressToFind.locationNumber_ == 0))
+			{
+				addressToFind.locationNumber_ = auxNumber;
+
+				refineFoundedLocationsByNumberZipCode(addressToFind, addressesFound);
+
+				addressToFind.locationNumber_ = 0;
+			}
+			else if((addressesFound.size() > 1) && (addressToFind.locationNumber_ == 0))
+			{
+				addressToFind.locationNumber_ = auxNumber;
+
+				refineFoundedLocationsByNumberNeighboor(addressToFind, addressesFound);
+
+				addressToFind.locationNumber_ = 0;
+			}
+
+	
+			if(addressesFound.size() > 1)
+			{
+				if(addressToFind.locationNumber_ == 0)
+					return 7;
+				else
+					return 5;							
+			}
+			else
+			{
+				if(addressToFind.locationNumber_ == 0)
+					return 6;
+				else
+					return 4;
+			}
+		}
+	}
+
+	// ***************************************************************************
+	// * If we are here so we did not find any address or the queries were wrong *
+	// ***************************************************************************
+	if(executeQuery)
+		return 1;	// If at leat one query was executed, return not found any address
+	else
+		return 3;	// Otherwise return an error on all queries
+}
+
+int TeAddressLocator::findPattern(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+	TeAddress addressToFind = address;
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return 0;
+	}
+
+	// The status of a query
+	bool executeQuery = false;
+
+	// String with the result query expression
+	string strSQL = "";
+
+	// String with the select...from clause
+	string strSelect  = "SELECT * FROM ";
+	       strSelect += metadata_.tableName_;
+		   
+	// String with the where clause;
+	string strWhere = " WHERE ";
+
+	// **************************************************
+	// * Try to match name an number                    *
+	// **************************************************		
+	{
+		int auxNumber = addressToFind.locationNumber_ ;
+
+		if(!withNumber)
+			addressToFind.locationNumber_ = 0;
+
+		if(!metadata_.locationType_.empty() || !metadata_.locationTitle_.empty() || !metadata_.locationPreposition_.empty())
+			strWhere += mountPatternWhereSQL(addressToFind, fullName, disabletype, disabletitle, disablepreposition);
+		else
+			strWhere += mountLikeWhereSQL(addressToFind, fullName);
+
+		strSQL = strSelect + strWhere;
+
+		queryAddresses(strSQL, executeQuery, addressesFound);
+
+		if(addressesFound.size() > 0)
+		{
+			if(!metadata_.locationType_.empty() || !metadata_.locationTitle_.empty() || !metadata_.locationPreposition_.empty())
+				cleanAddressesFound(fullName, addressesFound, disabletype, disabletitle, disablepreposition);
+
+			if(addressesFound.size() > 0)
+			{
+				if((addressesFound.size() > 1) && (!addressToFind.zipCode_.empty()))
+					this->refineFoundedLocationsByZipCode(addressToFind, addressesFound);
+
+				if((addressesFound.size() > 1) && (!addressToFind.neighborhood_.empty()))
+					this->refineFoundedLocationsByNeighBorhood(addressToFind, addressesFound);
+
+				if((addressesFound.size() > 1) && (!metadata_.leftZipCode_.empty() || !metadata_.rightZipCode_.empty()) && (addressToFind.locationNumber_ == 0))
+				{
+					addressToFind.locationNumber_ = auxNumber;
+
+					refineFoundedLocationsByNumberZipCode(addressToFind, addressesFound);
+
+					addressToFind.locationNumber_ = 0;
+				}
+				else if((addressesFound.size() > 1) && (addressToFind.locationNumber_ == 0))
+				{
+					addressToFind.locationNumber_ = auxNumber;
+
+					refineFoundedLocationsByNumberNeighboor(addressToFind, addressesFound);
+
+					addressToFind.locationNumber_ = 0;
+				}
+
+		
+				if(addressesFound.size() > 1)
+				{
+					if(addressToFind.locationNumber_ == 0)
+						return 7;
+					else
+						return 5;							
+				}
+				else
+				{
+					if(addressToFind.locationNumber_ == 0)
+						return 6;
+					else
+						return 4;
+				}
+			}
+		}
+	}
+
+	// ***************************************************************************
+	// * If we are here so we did not find any address or the queries were wrong *
+	// ***************************************************************************
+	if(executeQuery)
+		return 1;	// If at leat one query was executed, return not found any address
+	else
+		return 3;	// Otherwise return an error on all queries
+}
+
+
+bool TeAddressLocator::addressGeocode(TeGeocodeTableMetadata& tableMetadata, 
+									  const string& newLayerName, 
+									  const string& reportName, 
+									  const string& reportDir, 
+									  const bool& doExaustive, 
+									  TeAbstractAddressNotifyFunctor* /* notifyFunction */)
+{
+	errMsg_ = "";
+
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return 0;
+	}
+
+	if(tableMetadata.locationNameColumnName_.empty())
+	{
+		errMsg_ = "The name field must be filled!";
+		
+		return false;
+	}
+
+	// Verifica se o metadado para o processo de espacializa��o foi previamente carregado
+	if(!isMetadataLoaded())
+	{
+		errMsg_ = "Load metadata for geocoding layer before!";
+		
+		return false;
+	}
+
+	// Verifica se o metadado para o processo de espacializa��o foi previamente carregado
+	if(metadata_.locationCompleteName_.empty())
+	{
+		errMsg_ = "Please, check the configuration for geocoding layer before! The complete name is empty!";
+		
+		return false;
+	}
+
+
+
+	// Carrega os tipos, preposi��es e t�tulos existentes na base para poder 
+	// realizar substitui��es nos nomes de endere�os no caso da pesquisa alternativa
+	if(!loadAddressCompoundNames())
+	{	
+		return false;
+	}	
+
+	// Verifica se os metadados dos layers foram carregados
+	if(db_->layerMap().empty())
+	{
+		if(!db_->loadLayerSet())
+		{
+			errMsg_ = "Could not load infolayers metadata!";
+		
+			return false;
+		}
+	}
+
+	// Verifica se j� existe um layer com o nome escolhido
+	if(db_->layerExist(newLayerName))
+	{
+		errMsg_ = "There is another infolayer with the same name!";
+		
+		return false;
+	}
+
+	// Tenta acrescentar as duas colunas de relat�rio
+	pair<string, string> newCols;
+	if(!addReportColumn(tableMetadata, newCols))
+		return false;	
+
+	// Recupera as informa��es da tabela a ser geocodificada
+	if(!findTableMetadata(tableMetadata))
+		return false;
+	
+	// Tenta pegar o portal para a tabela a ser geocodificada
+	int nlo = 0;
+	TeDatabasePortal* portal = getAddressTablePortal(tableMetadata, nlo);
+
+	if(!portal)
+		return false;
+
+	// Cria um novo layer baseado no layer selecionado
+	TeLayer* newLayer = new TeLayer(newLayerName, db_, referenceLayer_->box(), referenceLayer_->projection());
+
+	// Se n�o conseguir criar a representa��o de pontos, aborta a opera��o.
+	if(!newLayer->addGeometry(TePOINTS))
+	{
+		errMsg_ = "Could not add point representation for new layer!";
+
+		db_->deleteLayer(newLayer->id());
+
+		//delete newLayer;
+
+		delete portal;
+		
+		return false;
+	}
+
+	// Navega pelos registros da tabela a ser espacializada determinando os endere�os
+	TePointSet pSet;
+
+	int lo = 0;
+
+	if(TeProgress::instance())
+	{
+		TeProgress::instance()->setTotalSteps(nlo);
+		TeProgress::instance()->setCaption("Address Geocoding");
+		TeProgress::instance()->setMessage("Geocoding addresses...      ");
+	}
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	t2 = clock();
+	t0 = t1 = t2;
+
+	string reportText  = "===> FINAL REPORT OF ADDRESS GEOCODING PROCESS <===\n";
+	       reportText += "     =========================================     \n";
+		   reportText += "\n\n\n";		   
+
+		   reportText += "     ---------------------------------\n\n";
+		   reportText += "SEARCHED ADDRESS|FOUND ADDRESS\n";
+		   reportText += "--------------------------------------------------------------------------------\n";
+		   reportText += "GEOCODING RESULT|UNIQUE ID|TYPE|TITLE|PREPOSITION|LOCATION NAME|NUMBER|NEIGHBOR|ZIPCODE|FOUND ADDRESS====>|UNIQUE ID|TYPE|TITLE|PREPOSITION|LOCATION NAME|INITIAL LEFT|FINAL LEFT|INITIAL RIGHT|FINAL RIGHT|FOUND LEFT NEIGHBOOR|FOUND RIGHT NEIGHBOR|FOUND LEFT ZIPCODE|FOUND RIGHT ZIPCODE\n";
+
+	string reportSummary  = "===> FINAL REPORT OF ADDRESS GEOCODING PROCESS <===\n";
+	       reportSummary += "     =========================================     \n";
+		   reportSummary += "\n\n\n";		   
+
+
+	string reportFileSummary = reportDir + "/" + reportName + "_summary.txt";
+	string reportFile        = reportDir + "/" + reportName + ".txt";	
+
+	TeWriteToFile(reportFile, reportText, "w");
+	TeWriteToFile(reportFileSummary, reportSummary, "w");
+
+	vector<int> summarySum;
+	unsigned int summaryLen = 22;
+	for(unsigned int i = 0; i < summaryLen; ++i)
+		summarySum.push_back(0);
+
+
+	do
+	{
+		if(TeProgress::instance()->wasCancelled())
+		{
+			TeProgress::instance()->reset();
+			errMsg_ = "The process was canceled by user!";
+
+			db_->deleteLayer(newLayer->id());
+
+			delete portal;
+
+			return false;
+		}
+
+		TeAddress add;
+
+		fillAddress(add, tableMetadata, portal);
+
+		++lo;
+
+		vector<TeAddressDescription> addressesFound;
+
+		int status = findAddress(add, addressesFound, doExaustive);
+
+		summarySum[status] = summarySum[status] + 1;
+
+		string reportLine  = Te2String(status);
+		       reportLine += "|";
+
+		// SEARCHED LOCATION
+		reportLine += add.locationLink_;
+		reportLine += "|";
+		reportLine += add.locationType_;
+		reportLine += "|";
+		reportLine += add.locationTitle_;
+		reportLine += "|";
+		reportLine += add.locationPreposition_;
+		reportLine += "|";
+		reportLine += add.locationName_;
+		reportLine += "|";
+		reportLine += Te2String(add.locationNumber_);			
+		reportLine += "|";			
+		reportLine += add.neighborhood_;
+		reportLine += "|";
+		reportLine += add.zipCode_;
+		reportLine += "|***********|";
+
+			
+		if(status >= 4)	// Encontrou algum endere�o?
+		{
+			TeAddressDescription addDescSimilar = addressesFound[0];
+			
+			if(status != 9)
+				findCoordinate(add, addDescSimilar);
+
+			// REPORT LINE
+
+
+			// FOUNDED LOCATION
+			reportLine += addDescSimilar.locationLink_;
+		    reportLine += "|";
+		    reportLine += addDescSimilar.locationType_;
+			reportLine += "|";
+			reportLine += addDescSimilar.locationTitle_;
+			reportLine += "|";
+			reportLine += addDescSimilar.locationPreposition_;
+			reportLine += "|";
+			reportLine += (addDescSimilar.locationName_.empty()) ? addDescSimilar.locationCompleteName_ : addDescSimilar.locationName_ ;
+			reportLine += "|";
+			reportLine += Te2String(addDescSimilar.initialLeftNumber_);
+			reportLine += "|";
+			reportLine += Te2String(addDescSimilar.finalLeftNumber_);
+			reportLine += "|";
+			reportLine += Te2String(addDescSimilar.initialRightNumber_);
+			reportLine += "|";
+			reportLine += Te2String(addDescSimilar.finalRightNumber_);
+			reportLine += "|";
+			reportLine += addDescSimilar.leftNeighborhood_;
+			reportLine += "|";
+			reportLine += addDescSimilar.rightNeighborhood_;
+			reportLine += "|";
+			reportLine += addDescSimilar.leftZipCode_;
+			reportLine += "|";
+			reportLine += addDescSimilar.rightZipCode_;
+			reportLine += "\n";						
+
+			if(addDescSimilar.isValid_)
+			{
+				// Cria um ponto e o adiciona no pointset
+				TePoint	pt;
+				pt.add(addDescSimilar.pt_);
+				pt.objectId(add.locationLink_);
+				pSet.add(pt);
+			}
+			else
+				status = -1;
+		}
+		else
+		{
+			reportLine += " | | | | | | | | | | | | \n";
+		}
+		
+		TeWriteToFile(reportFile, reportLine, "a");
+
+		this->updateAddressTable(newCols.first, status, tableMetadata, add.locationLink_);
+
+		if(pSet.size() > 100)
+		{
+			if(!newLayer->addPoints(pSet))
+			{
+				errMsg_ = "Could not insert generated points!";
+
+				db_->deleteLayer(newLayer->id());
+
+				delete portal;
+
+				return false;
+			}
+
+			pSet.clear();
+		}
+
+		if(TeProgress::instance())
+		{
+			t2 = clock();
+			if(int(t2-t1) > dt)
+			{
+				t1 = t2;
+				
+				if((int)(t2-t0) > dt2)
+					TeProgress::instance()->setProgress(lo);
+			}
+		}
+	}while(portal->fetchRow());	// Vai para o pr�ximo registro
+
+	if((pSet.size() > 0) && !newLayer->addPoints(pSet))
+	{
+		errMsg_ = "Could not insert generated points!";
+
+		db_->deleteLayer(newLayer->id());
+
+		delete portal;
+
+		return false;
+	}
+
+
+	delete portal;
+
+	string summary  = "\n=================";
+		   summary += "\n===> SUMMARY <===";
+		   summary += "\n=================\n";
+		   summary += "\nNumber of ocurrences of each code:\n";
+
+	int sum = 0;
+	for(unsigned int j = 0; j < summarySum.size(); ++j)
+	{
+		summary += "CODE " + Te2String(j);
+		summary += " => ";
+		summary += Te2String(summarySum[j]);
+		summary += " - ";
+		summary += Te2String((double(summarySum[j]) / double(lo)) * 100.0);
+		summary += "\n";
+
+		if(j > 3)
+			sum = sum + summarySum[j];
+	}
+
+	summary += "=================\n";
+	summary += "TOTAL DE ENDERECOS: " + Te2String(lo) + "\n";
+	summary += "TOTAL DE ENCONTRADOS: " + Te2String(sum) + "\n";
+	summary += "Resultado = " + Te2String((double(sum) / double(lo)) * 100.0) + "\n\n";
+	summary += "LEGEND:\n";
+	summary += "0  -> Database connection problem\n";
+	summary += "1  -> Address not found\n";
+	summary += "2  -> full name empty\n";
+	summary += "3  -> Error on query the database\n";
+	summary += "4  -> Found by name location and number\n";
+	summary += "5  -> Found multiples by name location and number\n";
+	summary += "6  -> Found by name location without number\n";
+	summary += "7  -> Found multiples by name location without number\n";
+	summary += "8  -> Found by similar search\n";
+	summary += "9  -> Found by neighborhood or zip code\n";
+	summary += "10 -> Found by name location and number without type\n";
+	summary += "11 -> Found multiples by name location and number  without type\n";
+	summary += "12 -> Found by name location without number and type\n";
+	summary += "13 -> Found multiples by name location without number and type\n";
+	summary += "14 -> Found by name location and number without type and title\n";
+	summary += "15 -> Found multiples by name location and number  without type and title\n";
+	summary += "16 -> Found by name location without number and type and title\n";
+	summary += "17 -> Found multiples by name location without number and type and title\n";
+	summary += "18 -> Found by name location and number without type, title and preposition\n";
+	summary += "19 -> Found multiples by name location and number  without type, title and preposition\n";
+	summary += "20 -> Found by name location without number and type, title and preposition\n";
+	summary += "21 -> Found multiples by name location without number and type, title and preposition\n";
+
+
+	TeWriteToFile(reportFileSummary, summary, "a");
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	// If the table is registered as an geocoding table, so we remove its information from te_layer_table
+	string deleteGeocodingTable  = "DELETE FROM te_layer_table WHERE (layer_id IS NULL) AND table_id = ";
+	       deleteGeocodingTable += Te2String(tableMetadata.tableId_);
+
+	db_->execute(deleteGeocodingTable);
+
+	// Tenta registrar a tabela selecionada no metadado do novo layer
+	TeTable attTable(tableMetadata.tableName_);
+	
+	attTable.setTableType(TeAttrStatic);
+	attTable.setLinkName(tableMetadata.linkColumnName_);
+	attTable.setUniqueName(tableMetadata.keyColumnName_);
+
+	if(!newLayer->createAttributeTable(attTable))
+	{
+		errMsg_ = "N�o foi poss�vel atualizar as informa��es da tabela de atributos para o novo layer";
+
+		db_->deleteLayer(newLayer->id());
+
+		return false;
+	}
+
+	delete newLayer;
+
+	return true;
+}
+
+bool TeAddressLocator::loadDictionary(const string& dictionaryFileName)
+{	
+	errMsg_ = "";
+
+	dictionary_.clear();
+
+	if(dictionaryFileName.empty())
+	{
+		errMsg_ = "Enter with a valid dictionary file name and location!";
+
+		return false;	
+	}
+
+	try
+	{
+		TeAsciiFile dicFile(dictionaryFileName);
+
+		while(dicFile.isNotAtEOF())
+		{
+			vector<string> strList;
+
+			dicFile.readStringListCSV(strList, ',');
+
+			dicFile.findNewLine();
+
+			if(strList.size() <= 1)
+				continue;
+			
+			string str1 = TeConvertToUpperCase(strList[0]);
+
+			str1.erase(0, 1);
+			str1.erase(str1.size() - 1, 1);
+
+			for(unsigned int i = 1; i < strList.size(); ++i)
+			{
+				string str2 = TeConvertToUpperCase(strList[i]);
+				str2.erase(0, 1);
+				str2.erase(str2.size() - 1, 1);
+
+				dictionary_.insert(TeGeocoderDictionary::value_type(str2, str1));
+			}
+		}
+
+	}
+	catch(...)
+	{
+		errMsg_ = "Could open file: " + dictionaryFileName;
+
+		return false;
+	}
+	
+	return true;
+}
+
+
+
+//PROTECTED MEMBERS
+bool TeAddressLocator::findSimilarAddress(const TeAddress& address, const string& fullName, TeAddressDescription& descript)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return 0;
+	}
+
+	// String with the result query expression
+	string strSQL = "";
+
+	// String with the select...from clause
+	string strSelect  = "SELECT * FROM ";
+	       strSelect += metadata_.tableName_;
+		   
+	// Order by of the result query
+	string strOrderBy  = " ORDER BY ";
+		   strOrderBy += metadata_.linkColumnName_;
+
+	// String with the where clause;
+	string strWhere = " WHERE ";
+
+	strWhere += mountSimilarWhereSQL(address);
+
+	strSQL = strSelect + strWhere + strOrderBy;
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	bool found = false;
+
+	// Check if there is a segment that satisfies the clause
+	if(portal->query(strSQL))
+	{
+		double simil, similmax = 75.0;		
+
+		while(portal->fetchRow() && similmax < 100.0)
+		{
+
+			string label = portal->getData(metadata_.locationCompleteName_);
+
+			simil = TeSimilarity(fullName.c_str(), label.c_str());
+		
+			if(simil > similmax)
+			{
+				found = true;
+
+				fillAddressDescription(descript, portal);
+
+				similmax = simil;
+			}
+		}
+	}
+
+	delete portal;
+
+	portal = 0;
+
+	return found;
+}
+
+
+
+bool TeAddressLocator::findByCentroid(const TeAddress& addressToFind, vector<TeAddressDescription>& addressesFound)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	if(!cmetadata_.centroidLayer_ || cmetadata_.centroidName_.empty() || cmetadata_.attributeTableName_.empty())
+		return false;	
+
+	string strValue = (cmetadata_.fieldType_ == TeNEIGHBORHOOD) ? (addressToFind.neighborhood_)  : (addressToFind.zipCode_);
+
+	if(strValue.empty())
+		return false;
+
+	strValue = TeConvertToUpperCase(strValue);
+	
+	if(removeHifenFromCentroid_ && cmetadata_.fieldType_ == TeZIPCODE)
+		removeHifen(strValue);
+	else if(!removeHifenFromCentroid_ && cmetadata_.fieldType_ == TeZIPCODE)
+		insertHifen(strValue);
+
+
+	string likeSQL = " = '";
+	       likeSQL += strValue;
+		   likeSQL += "'";
+
+	TeTable table;
+	
+	if(!cmetadata_.centroidLayer_->getAttrTablesByName(cmetadata_.attributeTableName_, table))
+		return false;
+	       
+	// String with the result query expression
+	string strSQL  = "SELECT ";
+		   strSQL += table.linkName();
+		   strSQL += ", ";
+	       strSQL += cmetadata_.centroidName_;
+		   strSQL += " FROM ";
+		   strSQL += cmetadata_.attributeTableName_;
+		   strSQL += " WHERE ";
+		   strSQL += db_->toUpper(cmetadata_.centroidName_);
+		   strSQL += likeSQL;
+
+	TeDatabasePortal* p = db_->getPortal();
+
+	if(!p)
+		return false;
+
+	if(!p->query(strSQL))
+	{
+		delete p;
+
+		return false;
+	}
+
+	while(p->fetchRow())
+	{
+		TeAddressDescription add;
+
+		if(cmetadata_.centroidLayer_->hasGeometry(TePOINTS))
+		{
+			TePointSet pset;
+
+			if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), pset))
+			{
+				add.pt_ = TeFindCentroid(pset);
+				add.isValid_ = true;
+			}
+			else
+				continue;
+		}
+		else if(cmetadata_.centroidLayer_->hasGeometry(TeLINES))
+		{
+			TeLineSet lset;
+
+			if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), lset))
+			{
+				add.pt_ = TeFindCentroid(lset);
+				add.isValid_ = true;
+			}
+			else
+				continue;
+		}
+		else if(cmetadata_.centroidLayer_->hasGeometry(TePOLYGONS))
+		{
+			TePolygonSet pset;
+
+			if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), pset))
+			{
+				add.pt_ = TeFindCentroid(pset);
+				add.isValid_ = true;
+			}
+			else
+				continue;
+
+		}
+		else if(cmetadata_.centroidLayer_->hasGeometry(TeCELLS))
+		{
+			TeCellSet cset;
+
+			if(cmetadata_.centroidLayer_->loadGeometrySet(p->getData(0), cset))
+			{
+				add.pt_ = TeFindCentroid(cset);
+				add.isValid_ = true;
+			}
+			else
+				continue;
+		}
+		else
+			continue;
+
+		TeVectorRemap(add.pt_, cmetadata_.centroidLayer_->projection(), add.pt_, referenceLayer_->projection());
+
+		if(cmetadata_.fieldType_ == TeZIPCODE)
+		{
+			add.leftZipCode_ = p->getData(1);
+			add.rightZipCode_ = p->getData(1);
+		}
+		else
+		{
+			add.leftNeighborhood_ = p->getData(1);
+			add.rightNeighborhood_ = p->getData(1);
+		}
+
+		addressesFound.push_back(add);
+	}
+
+	return addressesFound.size() > 0;
+}
+
+
+void TeAddressLocator::fillAddressMetadata(TeAddressMetadata& metadata, TeDatabasePortal* p)
+{
+	metadata.tableId_ = atoi(p->getData("table_id"));
+	metadata.initialLeftNumber_ = p->getData("initial_left_number");
+	metadata.finalLeftNumber_ = p->getData("final_left_number");
+	metadata.initialRightNumber_ = p->getData("initial_right_number");
+	metadata.finalRightNumber_ = p->getData("final_right_number");
+	metadata.locationType_ = p->getData("location_type");
+	metadata.locationTitle_ = p->getData("location_title");
+	metadata.locationPreposition_ = p->getData("location_preposition");
+	metadata.locationName_ = p->getData("location_name");
+	metadata.locationCompleteName_ = p->getData("location_full_name");
+	metadata.leftNeighborhood_ = p->getData("left_neighborhood");
+	metadata.rightNeighborhood_ = p->getData("right_neighborhood");
+	metadata.leftZipCode_ = p->getData("left_zip_code");
+	metadata.rightZipCode_ = p->getData("right_zip_code");
+	metadata.tableName_ = p->getData("attr_table");
+	metadata.linkColumnName_ = p->getData("attr_link");
+	return;
+}
+
+void TeAddressLocator::fillAddress(TeAddress& add, const TeGeocodeTableMetadata& tableMetadata, TeDatabasePortal* p)
+{
+	add.locationLink_ = p->getData(tableMetadata.linkColumnName_);
+
+	add.locationType_ = (tableMetadata.locationTypeColumnName_.empty()) ? "" : p->getData(tableMetadata.locationTypeColumnName_);
+	TeTrim(add.locationType_);
+
+	add.locationTitle_ = (tableMetadata.locationTitleColumnName_.empty()) ? "" : p->getData(tableMetadata.locationTitleColumnName_);
+	TeTrim(add.locationTitle_);
+	
+	add.locationPreposition_ = (tableMetadata.locationPrepositionColumnName_.empty()) ? "" : p->getData(tableMetadata.locationPrepositionColumnName_);
+	TeTrim(add.locationPreposition_);
+
+	add.locationName_ = p->getData(tableMetadata.locationNameColumnName_);		
+	TeTrim(add.locationName_);
+
+	add.neighborhood_ = (tableMetadata.neighborhoodColumnName_.empty()) ? "" : p->getData(tableMetadata.neighborhoodColumnName_);
+	TeTrim(add.neighborhood_);
+
+	add.zipCode_ = (tableMetadata.zipCodeColumnName_.empty()) ? "" : p->getData(tableMetadata.zipCodeColumnName_);
+	TeTrim(add.zipCode_);
+
+	if(!tableMetadata.locationNumberColumnName_.empty())
+		add.locationNumber_ = atoi(p->getData(tableMetadata.locationNumberColumnName_));	
+	else
+		splitAddress(add);
+
+	return;
+}
+
+string TeAddressLocator::mountSimilarWhereSQL(const TeAddress& address)
+{	
+	string sql = metadata_.locationName_ + " <> '' ";
+	
+	if(address.locationNumber_ != 0)
+	{
+		string snumber = Te2String(address.locationNumber_);
+
+		if(!sql.empty())
+			sql += " AND ";
+
+		if((address.locationNumber_ % 2) == 0)
+			sql += metadata_.initialRightNumber_ + " <= " + snumber + " AND " + metadata_.finalRightNumber_ + " >= " + snumber;
+		else
+			sql += metadata_.initialLeftNumber_ + " <= " + snumber +" AND " + metadata_.finalLeftNumber_ + " >= " + snumber;
+	}
+
+	return sql;
+}
+
+string TeAddressLocator::mountExactWhereSQL(const TeAddress& address, const string& fullName)
+{
+	vector<string> fields;
+	string values = "";
+	string sql = "";
+
+	if(address.locationNumber_ != 0)
+	{
+		string snumber = Te2String(address.locationNumber_);
+
+		// Se for endere�os pares
+		if((address.locationNumber_ % 2) == 0)
+			sql += " ( " + metadata_.initialRightNumber_ +" <= " + snumber + " AND " + metadata_.finalRightNumber_ +" >= " + snumber + ") ";
+		else	// Sen�o, se for �mpares
+			sql += " ( " + metadata_.initialLeftNumber_ + " <= " + snumber + " AND " + metadata_.finalLeftNumber_ + " >= " + snumber + ") ";
+	}
+
+	if(sql.empty())
+		sql += " ( " + metadata_.locationCompleteName_ + " = '";
+	else
+		sql += " AND (" + metadata_.locationCompleteName_ + " = '";
+
+	sql += db_->escapeSequence(fullName);
+
+	sql += "') ";
+
+	return sql;
+}
+
+string TeAddressLocator::mountLikeWhereSQL(const TeAddress& address, const string& fullName)
+{
+	vector<string> fields;
+	string values = db_->escapeSequence(fullName);
+	string sql  = " ( " + metadata_.locationCompleteName_ + " LIKE '%";
+           sql += values;
+		   sql += "') ";
+
+	if(address.locationNumber_ != 0)
+	{
+		string snumber = Te2String(address.locationNumber_);
+
+		// Se for endere�os pares
+		if((address.locationNumber_ % 2) == 0)
+			sql += " AND ( " + metadata_.initialRightNumber_ +" <= " + snumber + " AND " + metadata_.finalRightNumber_ +" >= " + snumber + ") ";
+		else	// Sen�o, se for �mpares
+			sql += " AND ( " + metadata_.initialLeftNumber_ + " <= " + snumber + " AND " + metadata_.finalLeftNumber_ + " >= " + snumber + ") ";
+	}
+	
+	return sql;
+
+}
+
+string TeAddressLocator::mountPatternWhereSQL(const TeAddress& address, const string& fullName, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+	vector<string> fields;
+	string values = "";
+	string sql = "(";
+
+	if(!metadata_.locationType_.empty() && !disabletype)
+		fields.push_back(db_->toUpper(metadata_.locationType_));
+
+	if(!metadata_.locationTitle_.empty() && !disabletitle)
+		fields.push_back(db_->toUpper(metadata_.locationTitle_));
+
+	if(!metadata_.locationPreposition_.empty() && !disablepreposition)
+		fields.push_back(db_->toUpper(metadata_.locationPreposition_));
+
+	if(!metadata_.locationName_.empty())
+		fields.push_back(db_->toUpper(metadata_.locationName_));
+
+	sql += db_->concatValues(fields, "");
+	sql += ") LIKE '";
+
+	values += db_->escapeSequence(fullName);
+	
+	sql += makeLikeExpression(values);
+	sql += "' ";
+
+	if(address.locationNumber_ != 0)
+	{
+		string snumber = Te2String(address.locationNumber_);
+
+		// Se for endere�os pares
+		if((address.locationNumber_ % 2) == 0)
+			sql += " AND ( " + metadata_.initialRightNumber_ +" <= " + snumber + " AND " + metadata_.finalRightNumber_ +" >= " + snumber + ") ";
+		else	// Sen�o, se for �mpares
+			sql += " AND ( " + metadata_.initialLeftNumber_ + " <= " + snumber + " AND " + metadata_.finalLeftNumber_ + " >= " + snumber + ") ";
+	}
+	
+	return sql;
+}
+
+void TeAddressLocator::findCoordinates(const TeAddress& add, vector<TeAddressDescription>& addresses)
+{
+	for(unsigned int i = 0; i < addresses.size(); ++i)
+		findCoordinate(add, addresses[i]);
+}
+
+void TeAddressLocator::findCoordinate(const TeAddress& add, TeAddressDescription& desc)
+{
+	// Evaluate the relative position of "number" (relativePosition) between initial and final numbers
+	// If number is zero, point to begin of line
+
+	int initialLeft, initialRight, finalLeft, finalRight;
+
+	double relativePosition = 0.0;
+
+	if(add.locationNumber_ != 0)
+	{
+		if((add.locationNumber_ % 2) == 0)
+		{
+			initialRight = desc.initialRightNumber_;
+			finalRight = desc.finalRightNumber_;
+				
+			if(initialRight != finalRight)
+				relativePosition = double(add.locationNumber_ - initialRight) / double(finalRight - initialRight);
+		}
+		else
+		{
+			initialLeft = desc.initialLeftNumber_;
+			finalLeft = desc.finalLeftNumber_;
+				
+			if(initialLeft != finalLeft)
+				relativePosition = double(add.locationNumber_ - initialLeft) / double(finalLeft - initialLeft);
+		}
+
+		if(relativePosition > 1.0)
+			relativePosition = 1.0;
+		else if(relativePosition < 0.0)
+			relativePosition = 0.0;
+	}
+
+	// Retrieve street segment geometry
+	TeLineSet ls;
+
+	if(!referenceLayer_->loadGeometrySet(desc.locationLink_, ls))	// Recupero a linha geom�trica do trecho que cont�m o endere�o em quest�o
+		return;
+
+	// Find the actual position of number on the street
+	if(ls.size() >= 1)
+	{
+		TeLine2D line = ls[0];
+
+		TeCoord2D pt1, pt2;
+
+		pt1 = line[0];
+		pt2 = line[1];
+
+		double x, y;
+
+		if(relativePosition <= 0.0)
+		{
+			x = pt1.x();
+			y = pt1.y();
+		}
+		else if(relativePosition >= 1.0)
+		{
+			pt1 = line[line.size() - 1];
+
+			x = pt1.x();
+			y = pt1.y();
+		}		
+		else
+		{
+			if(line.size () > 2)
+			{
+
+				// Find the distance from number to the begin of street based on the relative position
+				double targetLen = TeLength(line) * relativePosition;
+				double acumLen = 0.0;
+				double segLen;
+
+				// Find in which segment number is comprised
+				for(unsigned int i = 1 ; i < line.size(); ++i)
+				{
+					pt2 = line[i];
+
+					segLen = TeDistance(pt2, pt1);	//sqrt((pt2.x() - pt1.x()) * (pt2.x() - pt1.x()) + (pt2.y() - pt1.y()) * (pt2.y() - pt1.y()));
+					
+					acumLen += segLen;
+
+					if(acumLen >= targetLen)
+					{
+						double targetLenInSeg = targetLen - (acumLen - segLen);
+
+						relativePosition = targetLenInSeg / segLen;
+
+						break;
+					}
+
+					pt1 = pt2;
+				}
+			}
+
+			x = pt1.x() + (pt2.x() - pt1.x()) * relativePosition;
+			y = pt1.y() + (pt2.y() - pt1.y()) * relativePosition;
+		}
+		
+
+		desc.pt_ = TeCoord2D (x,y);
+
+		desc.isValid_ = true;
+	}
+	else
+		desc.isValid_ = false;	// A linha pertencente ao trecho n�o foi encontrada... problemas s�rios na base de dados!
+}
+
+
+void TeAddressLocator::fillAddressesDescription(vector<TeAddressDescription>& addresses, TeDatabasePortal* p)
+{
+	addresses.clear();
+
+	if(p == 0)
+		return;
+
+	while(p->fetchRow())
+	{
+		TeAddressDescription descript;
+
+		fillAddressDescription(descript, p);
+
+		addresses.push_back(descript);
+	}
+
+	return;
+}
+
+void TeAddressLocator::fillAddressDescription(TeAddressDescription& descript, TeDatabasePortal* p)
+{
+	descript.locationLink_ = p->getData(metadata_.linkColumnName_);
+	descript.locationType_ = (metadata_.locationType_.empty()) ? "" : p->getData(metadata_.locationType_);
+	descript.locationTitle_ = (metadata_.locationTitle_.empty()) ? "" : p->getData(metadata_.locationTitle_);
+	descript.locationPreposition_ = (metadata_.locationPreposition_.empty()) ? "" : p->getData(metadata_.locationPreposition_);
+	descript.locationName_ = (metadata_.locationName_.empty()) ? "" : p->getData(metadata_.locationName_);		
+	descript.locationCompleteName_ = p->getData(metadata_.locationCompleteName_);
+	descript.initialLeftNumber_ = (metadata_.initialLeftNumber_.empty()) ? 0 : atoi(p->getData(metadata_.initialLeftNumber_));
+	descript.finalLeftNumber_ = (metadata_.finalLeftNumber_.empty()) ? 0 : atoi(p->getData(metadata_.finalLeftNumber_));
+	descript.initialRightNumber_ = (metadata_.initialRightNumber_.empty()) ? 0 : atoi(p->getData(metadata_.initialRightNumber_));
+	descript.finalRightNumber_ = (metadata_.finalRightNumber_.empty()) ? 0 : atoi(p->getData(metadata_.finalRightNumber_));
+	descript.leftNeighborhood_ = (metadata_.leftNeighborhood_.empty()) ? "" : p->getData(metadata_.leftNeighborhood_);
+	descript.rightNeighborhood_ = (metadata_.rightNeighborhood_.empty()) ? "" : p->getData(metadata_.rightNeighborhood_);
+	descript.leftZipCode_ = (metadata_.leftZipCode_.empty()) ? "" : p->getData(metadata_.leftZipCode_);
+	descript.rightZipCode_ = (metadata_.rightZipCode_.empty()) ? "" : p->getData(metadata_.rightZipCode_);
+
+	return;
+}
+
+void TeAddressLocator::normalizeAddress(TeAddress& address, string& completeName)
+{
+	completeName = "";
+
+	if(!address.locationType_.empty())
+	{
+		TeTrim(address.locationType_);
+
+		if(changeSpecialChars_)
+			removeSpecialCharacters(address.locationType_);
+
+		address.locationType_ = TeConvertToUpperCase(address.locationType_);
+
+		completeName = address.locationType_;
+	}
+
+	if(!address.locationTitle_.empty())
+	{
+		TeTrim(address.locationTitle_);
+
+		if(changeSpecialChars_)
+			removeSpecialCharacters(address.locationTitle_);
+
+		address.locationTitle_ = TeConvertToUpperCase(address.locationTitle_);
+
+		if(!completeName.empty())
+			completeName += " ";
+
+		completeName += address.locationTitle_;
+	}
+
+	if(!address.locationPreposition_.empty())
+	{
+		TeTrim(address.locationPreposition_);
+
+		if(changeSpecialChars_)
+			removeSpecialCharacters(address.locationPreposition_);
+
+		address.locationPreposition_ = TeConvertToUpperCase(address.locationPreposition_);
+
+		if(!completeName.empty())
+			completeName += " ";
+
+		completeName += address.locationPreposition_;
+	}
+	
+	if(!address.locationName_.empty())
+	{
+		TeTrim(address.locationName_);
+		
+		if(changeSpecialChars_)
+			removeSpecialCharacters(address.locationName_);
+
+		address.locationName_ = TeConvertToUpperCase(address.locationName_);
+
+		if(!completeName.empty())
+			completeName += " ";
+
+		completeName += address.locationName_;
+	}
+
+	if(!address.neighborhood_.empty())
+	{
+		TeTrim(address.neighborhood_);
+
+		if(changeSpecialChars_)
+			removeSpecialCharacters(address.neighborhood_);
+
+		address.neighborhood_ = TeConvertToUpperCase(address.neighborhood_);		
+	}
+
+	if(!address.zipCode_.empty())
+	{
+		TeTrim(address.zipCode_);
+
+		if(removeHifen_)
+			removeHifen(address.zipCode_);
+		else
+			insertHifen(address.zipCode_);
+	}
+
+	return;
+}
+
+void TeAddressLocator::removeHifen(string& zipCode) const
+{
+	if(zipCode.size() == 9)
+	{
+		unsigned int i = 0;
+
+		string newZipCode = "";
+
+		for(i = 0; i < 5; ++i)
+			newZipCode += zipCode[i];
+
+		for(i = 6; i < 9; ++i)
+			newZipCode += zipCode[i];
+
+		zipCode = newZipCode;
+	}	
+	
+	return;
+}
+
+void TeAddressLocator::insertHifen(string& zipCode) const
+{
+	if(zipCode.size() == 8)
+	{
+		unsigned int i = 0;
+
+		string newZipCode = "";
+
+		for(i = 0; i < 5; ++i)
+			newZipCode += zipCode[i];
+
+		newZipCode += hifen_;
+
+		for(i = 5; i < 8; ++i)
+			newZipCode += zipCode[i];
+
+		zipCode = newZipCode;
+	}	
+	
+	return;
+}
+
+string TeAddressLocator::makeLikeExpression(const string& str) const
+{
+	string aux = "";
+
+	for(unsigned int i = 0; i < str.size(); ++i)
+		aux += (str[i] == ' ') ? ('%') : str[i];
+
+	return aux;
+}
+
+void TeAddressLocator::removeSpecialCharacters(string& str) const
+{
+	string newStr = "";
+
+	unsigned int nStep = str.size();
+
+	for(unsigned int i = 0; i < nStep; ++i)
+	{
+		switch(str[i])
+		{
+			case '�' :  newStr += "A"; break;
+			case '�' :  newStr += "a"; break;
+			case '�' :  newStr += "A"; break;
+			case '�' :  newStr += "a"; break;
+			case '�' :  newStr += "A"; break;
+			case '�' :  newStr += "a"; break;
+			case '�' :  newStr += "A"; break;
+			case '�' :	newStr += "a"; break;
+
+			case '�' :  newStr += "E"; break;
+			case '�' :  newStr += "e"; break;
+			case '�' :  newStr += "E"; break;
+			case '�' :  newStr += "e"; break;
+
+			case '�' :  newStr += "I"; break;
+			case '�' :  newStr += "i"; break;
+
+			case '�' :  newStr += "O"; break;
+			case '�' :  newStr += "o"; break;
+			case '�' :  newStr += "O"; break;
+			case '�' :  newStr += "o"; break;
+
+			case '�' :  newStr += "U"; break;
+			case '�' :  newStr += "u"; break;
+			case '�' :  newStr += "U"; break;
+			case '�' :  newStr += "u"; break;
+
+			case '�' :  newStr += "c"; break;
+			case '�' :  newStr += "C"; break;
+
+			//case '.' :	break;
+
+			default  :  newStr += str[i];
+		}
+	}
+
+	str = newStr;
+}
+
+bool TeAddressLocator::verifyHifen(const string& tableName, const string& columnName)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return 0;
+	}
+
+	TeDatabasePortal* p = db_->getPortal();
+
+	if(!p || columnName.empty() || tableName.empty())
+		return false;
+
+	string q  = "SELECT MAX(";
+	       q += columnName;
+		   q += ") FROM ";
+		   q += tableName;
+
+	if(!p->query(q) && !p->fetchRow())
+	{
+		delete p;
+
+		return false;
+	}
+
+	string zipCode = p->getData(0);
+
+	delete p;
+
+	if(zipCode.size() == 9)
+	{
+		hifen_ = zipCode[5];
+
+		return true;
+	}
+
+	return false;
+}
+
+bool TeAddressLocator::addReportColumn(TeGeocodeTableMetadata& tableMetadata, pair<string, string>& newColumns)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+	
+	// Adiciona as colunas para relat�rio de acerto dos pontos
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	string allFieldQuery  = "SELECT * FROM ";
+	       allFieldQuery += tableMetadata.tableName_;
+		   allFieldQuery += " WHERE 1 = 2";
+
+	if(!portal->query(allFieldQuery))
+	{
+		errMsg_ = "Could not find column names for the table to be geocoding!";
+
+		delete portal;
+
+		return false;
+	}
+
+	TeAttributeRep rep1;
+	rep1.name_ = "geocoding_result_id";
+	rep1.type_ = TeINT;
+	rep1.isPrimaryKey_ = false;
+	rep1.isAutoNumber_ = false;
+
+	TeAttributeList attrList = portal->AttributeList();
+	validColumnName(rep1, attrList);
+
+	TeAttributeRep rep2;
+	rep2.name_ = "geocoding_result_description";
+	rep2.type_ = TeSTRING;
+	rep2.numChar_ = 255;
+	rep2.isPrimaryKey_ = false;
+	rep2.isAutoNumber_ = false;
+
+	validColumnName(rep2, attrList);
+
+	delete portal;
+
+	portal = 0;
+
+	if(!db_->addColumn(tableMetadata.tableName_, rep1))
+	{
+		errMsg_ = "Could not add a column to do the report!";
+
+		delete portal;
+
+		return false;
+	}	
+
+	//if(!db_->addColumn(tableMetadata.tableName_, rep2))
+	//{
+	//	errMsg_ = "Could not add a column to do the report!";
+
+	//	delete portal;
+
+	//	return false;
+	//}
+
+	newColumns.first = rep1.name_;
+	newColumns.second = rep2.name_;
+
+	return true;
+}
+
+bool TeAddressLocator::findTableMetadata(TeGeocodeTableMetadata& tableMetadata)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+	
+	// Adiciona as colunas para relat�rio de acerto dos pontos
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+
+	// Procura o nome do campo chave da tabela a ser geocodificada
+	string sql  = "SELECT * FROM te_layer_table WHERE table_id = ";
+	       sql += Te2String(tableMetadata.tableId_);	
+
+	portal = db_->getPortal();
+
+	if(!portal)
+		return false;
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		errMsg_ = "Could not read te_layer_table table for geocoding base table!";
+
+		delete portal;
+
+		return false;
+	}
+
+	tableMetadata.keyColumnName_ = portal->getData("unique_id");
+	tableMetadata.linkColumnName_ = portal->getData("attr_link");
+	tableMetadata.tableName_ = portal->getData("attr_table");
+
+	delete portal;
+
+	portal = 0;
+
+	return true;
+}
+
+bool TeAddressLocator::updateAddressTable(const string& c1, const int& v1, TeGeocodeTableMetadata& tableMetadata, const string& objectId)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return false;
+	}
+
+	string sql  = "UPDATE ";
+	       sql += tableMetadata.tableName_;
+		   sql += " SET ";
+		   sql += c1;
+		   sql += " = ";
+		   sql += Te2String(v1);
+		   sql += " WHERE ";
+		   sql += tableMetadata.linkColumnName_;
+		   sql += " = '";
+		   sql += objectId;
+		   sql += "'";
+
+	return db_->execute(sql);
+}
+
+TeDatabasePortal* TeAddressLocator::getAddressTablePortal(TeGeocodeTableMetadata& tableMetadata, int& numRows)
+{
+	if(!db_)
+	{
+		errMsg_ = "You should connect to a database first!";
+
+		return 0;
+	}
+
+	string sql = "SELECT count(*) FROM " + tableMetadata.tableName_;
+
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+	{
+		errMsg_ = "Could not get a portal to query database!";
+
+		return 0;
+	}
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		errMsg_ = "Could not count the number of records in the geocoding base table!";
+
+		return 0;
+	}
+
+	numRows = portal->getInt(0);
+
+	portal->freeResult();
+
+	// Recupera um portal para a tabela a ser espacializada e verifica se a tabela tem conte�do
+	sql  = "SELECT ";
+	sql += tableMetadata.linkColumnName_;
+	sql += ", ";
+	sql += tableMetadata.locationNameColumnName_;
+
+	if(!tableMetadata.locationNumberColumnName_.empty())
+	{
+	       sql += ", ";
+	       sql += tableMetadata.locationNumberColumnName_;
+	}
+
+	if(!tableMetadata.neighborhoodColumnName_.empty())
+	{
+		sql += ", ";
+		sql += tableMetadata.neighborhoodColumnName_;
+	}
+
+	if(!tableMetadata.zipCodeColumnName_.empty())
+	{
+		sql += ", ";
+		sql += tableMetadata.zipCodeColumnName_;
+	}
+
+	if(!tableMetadata.locationTypeColumnName_.empty())
+	{
+		sql += ", ";
+		sql += tableMetadata.locationTypeColumnName_;
+	}
+
+	if(!tableMetadata.locationTitleColumnName_.empty())
+	{
+		sql += ", ";
+		sql += tableMetadata.locationTitleColumnName_;
+	}
+
+	if(!tableMetadata.locationPrepositionColumnName_.empty())
+	{
+		sql += ", ";
+		sql += tableMetadata.locationPrepositionColumnName_;
+	}
+
+	sql += " FROM ";
+	sql += tableMetadata.tableName_;
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		errMsg_ = "Could not read the geocoding base table!";
+
+		delete portal;
+
+		return 0;
+	}
+
+	return portal;
+}
+
+
+
+void TeAddressLocator::refineFoundedLocationsByNeighBorhood(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+	unsigned int nStep = addressesFound.size();
+
+	vector<TeAddressDescription> newAdds;
+
+	for(unsigned int i = 0; i < nStep; ++i)
+	{
+		TeAddressDescription& addFound = addressesFound[i];
+
+		if(address.neighborhood_ == TeConvertToUpperCase(addFound.leftNeighborhood_) || address.neighborhood_ == TeConvertToUpperCase(addFound.rightNeighborhood_))
+			newAdds.push_back(addFound);
+	}
+
+	if(newAdds.size() > 0)
+	{
+		addressesFound.clear();
+
+		addressesFound = newAdds;
+	}
+
+	return;
+}
+
+void TeAddressLocator::refineFoundedLocationsByZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+	unsigned int nStep = addressesFound.size();
+
+	vector<TeAddressDescription> newAdds;
+
+	for(unsigned int i = 0; i < nStep; ++i)
+	{
+		TeAddressDescription& addFound = addressesFound[i];
+
+		if(address.zipCode_ == addFound.leftZipCode_ || address.zipCode_ == addFound.rightZipCode_)
+			newAdds.push_back(addFound);
+	}
+
+	if(newAdds.size() > 0)
+	{
+		addressesFound.clear();
+
+		addressesFound = newAdds;
+	}
+
+	return;
+}
+
+void TeAddressLocator::refineFoundedLocationsByNumberNeighboor(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+	unsigned int nStep = addressesFound.size();
+
+	// id/dist
+	typedef pair<unsigned int, int> nearestItem; 
+
+	map<string, nearestItem> nearestMap;
+
+	bool par = ((address.locationNumber_ % 2) == 0);
+
+	for(unsigned int i = 0; i < nStep; ++i)
+	{
+		TeAddressDescription& addFound = addressesFound[i];
+		
+		int distBegin = 0;
+		int distEnd = 0;
+
+		int dist = 0;
+
+		if(par)
+		{	
+
+			distBegin = abs(address.locationNumber_ - addFound.initialRightNumber_);
+			distEnd = abs(address.locationNumber_ - addFound.finalRightNumber_);
+
+			dist = MIN(distBegin, distEnd);
+		}
+		else
+		{
+			distBegin = abs(address.locationNumber_ - addFound.initialLeftNumber_);
+			distEnd = abs(address.locationNumber_ - addFound.finalLeftNumber_);
+
+			dist = MIN(distBegin, distEnd);
+		}
+
+
+		map<string, nearestItem>::iterator itLeft = nearestMap.find(addFound.leftNeighborhood_);
+
+		if(itLeft != nearestMap.end())
+		{
+			if(dist < itLeft->second.second)
+				nearestMap[addFound.leftNeighborhood_] = nearestItem(i, dist);
+		}
+		else
+		{
+			nearestMap[addFound.leftNeighborhood_] = nearestItem(i, dist);
+		}
+
+		if(addFound.leftNeighborhood_ != addFound.rightNeighborhood_)
+		{
+			map<string, nearestItem>::iterator itRight = nearestMap.find(addFound.rightNeighborhood_);
+
+			if(itRight != nearestMap.end())
+			{
+				if(dist < itRight->second.second)
+					nearestMap[addFound.rightNeighborhood_] = nearestItem(i, dist);					
+			}
+			else
+			{
+				nearestMap[addFound.rightNeighborhood_] = nearestItem(i, dist);
+			}
+		}		
+	}
+
+	if(!nearestMap.empty())
+	{
+		map<string, nearestItem>::iterator it = nearestMap.begin();
+		vector<TeAddressDescription> newAdds;
+		set<unsigned int> alreadyPushed;
+
+		while(it != nearestMap.end())
+		{
+			set<unsigned int>::iterator itaux = alreadyPushed.find(it->second.first);
+
+			// Se o endere�o j� n�o tiver sido colocado na lista, inclui, caso contr�rio n�o faz nada
+			if(itaux == alreadyPushed.end())
+				newAdds.push_back(addressesFound[it->second.first]);			
+
+			alreadyPushed.insert(it->second.first);
+
+			++it;
+		}
+
+		addressesFound.clear();
+		addressesFound = newAdds;
+	
+	}
+
+	return;
+}
+
+void TeAddressLocator::refineFoundedLocationsByNumberZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound)
+{
+	unsigned int nStep = addressesFound.size();
+
+	// id/dist
+	typedef pair<unsigned int, int> nearestItem; 
+
+	map<string, nearestItem> nearestMap;
+
+	bool par = ((address.locationNumber_ % 2) == 0);
+
+	for(unsigned int i = 0; i < nStep; ++i)
+	{
+		TeAddressDescription& addFound = addressesFound[i];
+		
+		int distBegin = 0;
+		int distEnd = 0;
+
+		int dist = 0;
+
+		if(par)
+		{	
+
+			distBegin = abs(address.locationNumber_ - addFound.initialRightNumber_);
+			distEnd = abs(address.locationNumber_ - addFound.finalRightNumber_);
+
+			dist = MIN(distBegin, distEnd);
+		}
+		else
+		{
+			distBegin = abs(address.locationNumber_ - addFound.initialLeftNumber_);
+			distEnd = abs(address.locationNumber_ - addFound.finalLeftNumber_);
+
+			dist = MIN(distBegin, distEnd);
+		}
+
+
+		map<string, nearestItem>::iterator itLeft = nearestMap.find(addFound.leftZipCode_);
+
+		if(itLeft != nearestMap.end())
+		{
+			if(dist < itLeft->second.second)
+				nearestMap[addFound.leftZipCode_] = nearestItem(i, dist);
+		}
+		else
+		{
+			nearestMap[addFound.leftZipCode_] = nearestItem(i, dist);
+		}
+
+		if(addFound.leftZipCode_ != addFound.rightZipCode_)
+		{
+			map<string, nearestItem>::iterator itRight = nearestMap.find(addFound.rightZipCode_);
+
+			if(itRight != nearestMap.end())
+			{
+				if(dist < itRight->second.second)
+					nearestMap[addFound.rightZipCode_] = nearestItem(i, dist);
+			}
+			else
+			{
+				nearestMap[addFound.rightZipCode_] = nearestItem(i, dist);
+			}
+		}		
+	}
+
+	if(!nearestMap.empty())
+	{
+		map<string, nearestItem>::iterator it = nearestMap.begin();
+		vector<TeAddressDescription> newAdds;
+		set<unsigned int> alreadyPushed;
+
+		while(it != nearestMap.end())
+		{
+			set<unsigned int>::iterator itaux = alreadyPushed.find(it->second.first);
+
+			// Se o endere�o j� n�o tiver sido colocado na lista, inclui, caso contr�rio n�o faz nada
+			if(itaux == alreadyPushed.end())
+				newAdds.push_back(addressesFound[it->second.first]);			
+
+			alreadyPushed.insert(it->second.first);
+
+			++it;
+		}
+
+		addressesFound.clear();
+		addressesFound = newAdds;
+	
+	}
+
+	return;
+}
+
+void TeAddressLocator::splitAddress(TeAddress& add)
+{
+	unsigned int i;
+	string aux = add.locationName_;
+
+	add.locationName_ = "";
+	add.locationNumber_ = 0;
+
+	string number = "";
+
+	if(!splitChar_.empty())
+	{
+		unsigned int nChars = aux.size();
+
+		for(i = 0; i < nChars; ++i)
+		{
+			if(splitChar_[0] == aux[i])
+			{
+				++i;
+				break;
+			}
+
+			add.locationName_ += aux[i];
+		}
+
+		number = "";
+
+		for(; i < nChars; ++i)
+		{
+			if((aux[i] >= '0') && (aux[i] <= '9'))
+				number += aux[i];
+		}
+		
+	}
+	else
+	{
+		unsigned int nChars = aux.size();
+
+		for(i = 0; i < nChars; ++i)
+		{
+			if(aux[i] >= '0' && aux[i] <= '9')
+				break;
+
+			add.locationName_ += aux[i];
+		}		
+
+		for(; i < nChars; ++i)
+		{
+			if(aux[i] < '0' || aux[i] > '9')
+				break;
+
+			number += aux[i];
+		}
+	}
+
+	TeTrim(add.locationName_);
+	TeTrim(number);
+	add.locationNumber_ = atoi(number.c_str());
+}
+
+
+void TeAddressLocator::queryAddresses(const string& strSQL, bool& queryExecuted, vector<TeAddressDescription>& addressesFound)
+{
+	TeDatabasePortal* portal = db_->getPortal();
+
+	if(!portal)
+		return;
+
+	// Check if there is a segment that satisfies the clause
+	if(portal->query(strSQL))
+	{
+		queryExecuted = true;
+
+		fillAddressesDescription(addressesFound, portal);
+	}
+
+	delete portal;
+}
+
+
+bool TeAddressLocator::loadAddressCompoundNames()
+{
+	typesVector_.clear();
+	titlesVector_.clear();
+	prepositionsVector_.clear();
+
+	if(!metadata_.locationType_.empty())
+	{
+		TeDatabasePortal *p = db_->getPortal();
+
+		if(!p)
+		{
+			errMsg_ = "Could not get portal to find types in base table!";
+
+			return false;
+		}
+
+
+		string sql  = "SELECT DISTINCT ";
+		       sql += metadata_.locationType_;
+			   sql += " FROM ";
+			   sql += metadata_.tableName_;
+			   sql += " ORDER BY ";
+			   sql += metadata_.locationType_;
+
+		if(p->query(sql))
+		{
+			while(p->fetchRow())
+			{
+				string aux = p->getData(metadata_.locationType_);
+
+				TeTrim(aux);
+
+				if(aux.empty())
+					continue;
+
+				typesVector_.push_back(aux);
+			}
+		}
+
+		delete p;
+	}
+
+	// T�tulo
+	if(!metadata_.locationTitle_.empty())
+	{
+		TeDatabasePortal *p = db_->getPortal();
+
+		if(!p)
+		{
+			errMsg_ = "Could not get portal to find titles in base table!";
+
+			return false;
+		}
+
+
+		string sql  = "SELECT DISTINCT ";
+		       sql += metadata_.locationTitle_;
+			   sql += " FROM ";
+			   sql += metadata_.tableName_;
+			   sql += " ORDER BY ";
+			   sql += metadata_.locationTitle_;
+
+		if(p->query(sql))
+		{
+			while(p->fetchRow())
+			{
+				string aux = p->getData(metadata_.locationTitle_);
+
+				TeTrim(aux);
+
+				if(aux.empty())
+					continue;
+
+				titlesVector_.push_back(aux);
+			}
+		}
+
+		delete p;
+	}
+
+	// Preposi��o
+	if(!metadata_.locationPreposition_.empty())
+	{
+		TeDatabasePortal *p = db_->getPortal();
+
+		if(!p)
+		{
+			errMsg_ = "Could not get portal to find prepositions in base table!";
+
+			return false;
+		}
+
+
+		string sql  = "SELECT DISTINCT ";
+		       sql += metadata_.locationPreposition_;
+			   sql += " FROM ";
+			   sql += metadata_.tableName_;
+			   sql += " ORDER BY ";
+			   sql += metadata_.locationPreposition_;
+
+		if(p->query(sql))
+		{
+			while(p->fetchRow())
+			{
+				string aux = p->getData(metadata_.locationPreposition_);
+
+				TeTrim(aux);
+
+				if(aux.empty())
+					continue;
+
+				prepositionsVector_.push_back(aux);
+			}
+		}
+
+		delete p;
+	}
+
+	return true;
+}
+
+
+bool TeAddressLocator::convertColumnNameToUpper()
+{
+	errMsg_ = "";
+	
+	if(!db_)
+	{
+		errMsg_ = "Connect to a database first!";
+
+		return false;
+	}
+
+	string sql  = "UPDATE ";
+		   sql += metadata_.tableName_;
+		   sql += " SET ";
+		   sql += metadata_.locationCompleteName_;
+		   sql += " = ";
+		   sql += db_->toUpper(metadata_.locationCompleteName_);
+
+	if(!db_->execute(sql))
+	{
+		errMsg_ = "Couldn't convert to uppercase name column!";
+
+		return false;
+	}
+
+	return true;
+}
+
+bool TeAddressLocator::addCompleteNameColumn()
+{
+	errMsg_ = "";
+	
+	if(!db_)
+	{
+		errMsg_ = "Connect to a database first!";
+
+		return false;
+	}
+
+	TeAttribute attr;
+
+	if(db_->columnExist(metadata_.tableName_, metadata_.locationCompleteName_, attr))
+	{
+		errMsg_ = "The specified column name already exist!";
+
+		return false;
+	}
+
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = metadata_.locationCompleteName_;
+	at.rep_.numChar_ = 255;
+
+	if(!db_->addColumn(metadata_.tableName_, at.rep_))
+	{
+		errMsg_ = "Couldn't add specified column!";
+
+		return false;
+	}
+
+	TeDatabasePortal* p = db_->getPortal();
+
+	if(!p)
+	{
+		errMsg_ = "Couldn't get portal!";
+		
+		return false;
+	}
+
+	string sql = "SELECT count(*) FROM " + metadata_.tableName_;
+
+	if(!p->query(sql) && !p->fetchRow())
+	{
+		errMsg_ = "Couldn't get number of lines to update!";
+
+		delete p;
+		
+		return false;
+	}
+
+	int lo = 0;
+	int nlo = p->getInt(0);
+
+	p->freeResult();
+
+	if(TeProgress::instance())
+	{
+		TeProgress::instance()->setTotalSteps(nlo);
+		TeProgress::instance()->setCaption("Address Geocoding Config");
+		TeProgress::instance()->setMessage("Creating new column...");
+	}
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	t2 = clock();
+	t0 = t1 = t2;
+
+
+	sql = "SELECT * FROM " + metadata_.tableName_;
+
+	if(!p->query(sql))
+	{
+		errMsg_ = "Couldn't query address reference table!";
+
+		delete p;
+		
+		return false;
+	}
+
+	while(p->fetchRow())
+	{
+		if(TeProgress::instance()->wasCancelled())
+		{
+			TeProgress::instance()->reset();
+			
+			errMsg_ = "The process was canceled by user!";
+
+			delete p;
+
+			return false;
+		}
+
+
+		++lo;
+
+		string completeName = "";
+
+		if(!metadata_.locationType_.empty())
+			completeName = TeConvertToUpperCase(p->getData(metadata_.locationType_));
+
+		if(!metadata_.locationTitle_.empty())
+		{
+			string aux = TeConvertToUpperCase(p->getData(metadata_.locationTitle_));
+
+			if(!completeName.empty() && !aux.empty())
+				completeName += " ";
+
+			completeName += aux;			
+		}
+
+		if(!metadata_.locationPreposition_.empty())
+		{
+			string aux = TeConvertToUpperCase(p->getData(metadata_.locationPreposition_));
+
+			if(!completeName.empty() && !aux.empty())
+				completeName += " ";
+
+			completeName += aux;			
+		}
+
+		if(!metadata_.locationName_.empty())
+		{
+			string aux = TeConvertToUpperCase(p->getData(metadata_.locationName_));
+
+			if(!completeName.empty() && !aux.empty())
+				completeName += " ";
+
+			completeName += aux;			
+		}
+
+		string value = p->getData(metadata_.linkColumnName_);
+
+		sql  = "UPDATE " + metadata_.tableName_ + " SET ";
+		sql += metadata_.locationCompleteName_ + " = '" + db_->escapeSequence(completeName) + "' WHERE ";
+		sql += metadata_.linkColumnName_ + " = '" + value + "'";
+		
+		if(!db_->execute(sql))
+		{
+			delete p;
+
+			errMsg_ = "Couldn't update complete name column!";
+		
+			return false;
+		}
+
+		if(TeProgress::instance())
+		{
+			t2 = clock();
+			if(int(t2-t1) > dt)
+			{
+				t1 = t2;
+				
+				if((int)(t2-t0) > dt2)
+					TeProgress::instance()->setProgress(lo);
+			}
+		}
+	}
+
+	delete p;
+
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+
+
+	return true;
+}
+
+
+void TeAddressLocator::cleanAddressesFound(const string& locName, vector<TeAddressDescription>& addressesFound, const bool& disabletype, const bool& disabletitle, const bool& disablepreposition)
+{
+	vector<TeAddressDescription> newAddresses;
+
+	for(unsigned int i = 0; i < addressesFound.size(); ++i)
+	{
+		TeAddressDescription add = addressesFound[i];
+		
+		string name = "";
+
+		if(!add.locationType_.empty() && !disabletype)
+		{
+			TeTrim(add.locationType_);
+
+			add.locationType_ = TeConvertToUpperCase(add.locationType_);
+
+			name = add.locationType_;
+		}
+
+		if(!add.locationTitle_.empty() && !disabletitle)
+		{
+			TeTrim(add.locationTitle_);
+
+			add.locationTitle_ = TeConvertToUpperCase(add.locationTitle_);
+
+			if(!name.empty() && !add.locationTitle_.empty())
+				name += " ";
+
+			name += add.locationTitle_;
+		}
+
+		if(!add.locationPreposition_.empty() && !disablepreposition)
+		{
+			TeTrim(add.locationPreposition_);
+
+
+			add.locationPreposition_ = TeConvertToUpperCase(add.locationPreposition_);
+
+			if(!name.empty() && !add.locationPreposition_.empty())
+				name += " ";
+
+			name += add.locationPreposition_;
+		}
+		
+		if(!add.locationName_.empty())
+		{
+			TeTrim(add.locationName_);
+			
+			add.locationName_ = TeConvertToUpperCase(add.locationName_);
+
+			if(!name.empty() && !add.locationName_.empty())
+				name += " ";
+
+			name += add.locationName_;
+		}
+
+		if(name == locName)
+			newAddresses.push_back(addressesFound[i]);
+	}
+
+	addressesFound = newAddresses;
+}
diff --git a/src/terralib/functions/TeAddressLocator.h b/src/terralib/functions/TeAddressLocator.h
new file mode 100644
index 0000000..7009516
--- /dev/null
+++ b/src/terralib/functions/TeAddressLocator.h
@@ -0,0 +1,420 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeAddressLocator.h
+    This file contains algorithms for address location generation.
+*/
+
+/**
+  *@author Gilberto Ribeiro de Queiroz and Ricardo Cartaxo
+  */
+
+#ifndef  __TERRALIB_INTERNAL_ADDRESSLOCATOR_H
+#define  __TERRALIB_INTERNAL_ADDRESSLOCATOR_H
+
+#include <TeDatabase.h>
+#include <TeLayer.h>
+
+#include <string>
+#include <map>
+
+using namespace std;
+
+
+typedef multimap<string, string> TeGeocoderDictionary;
+
+
+/*! \struct TeAddressMetadata
+	Metadata for a table used as a base for geocoding
+*/
+struct TeAddressMetadata
+{
+	int tableId_;					//!< This value is a foreign key from te_layer_table indicates the table wich will be used for the address locator
+	string tableName_;				//!< The table to use for geocoding process
+	string linkColumnName_;			//!< The column used as link to line geometry
+	string initialLeftNumber_;		//!< The field name with the initial location left number
+	string finalLeftNumber_;		//!< The field name with the final location left number
+	string initialRightNumber_;		//!< The field name with the initial location right number
+	string finalRightNumber_;		//!< The field name with the final location right number
+	string locationType_;			//!< The field name with location type (Av., Rua, R., Pr., Jz., Pres. ...)
+	string locationTitle_;			//!< The field name with location title (Dr., Dra., PRF ...)
+	string locationPreposition_;	//!< The field name with the preposition used to form the location name (Dos, Das, De, 
+	string locationName_;			//!< The field name with the location name
+	string locationCompleteName_;	//!< The field name with composed location name
+	string leftNeighborhood_;		//!< The field name for the left location neighborhood 
+	string rightNeighborhood_;		//!< The field name for the right location neighborhood
+	string leftZipCode_;			//!< The field name for the left location zip code
+	string rightZipCode_;			//!< The field name for the right location zip code
+};
+
+//!  Types for centroid field name finding
+enum TeCentroidFieldType { TeNEIGHBORHOOD, TeZIPCODE };
+
+/*! \struct TeCentroidAddressMetadata
+	Metadata for a table used as a base for geocoding when an address is not found and a centroid for the zip code or neighborhood exists
+*/
+struct TeCentroidAddressMetadata
+{
+	string centroidName_;			//!< This field may be the neighborhood name or zip code name
+
+	TeCentroidFieldType fieldType_;	//!< Field type
+
+	string attributeTableName_;		//!< Attribute table name
+
+	TeLayer* centroidLayer_;		//!< Polygon or point layer to extract centroid from
+
+	TeCentroidAddressMetadata()
+		: centroidLayer_(0)
+	{
+	}
+};
+
+/*! \struct TeGeocodeTableMetadata
+	Metadata for the table that contains address to be geocode
+*/
+struct TeGeocodeTableMetadata
+{
+	string tableName_;						//!< The table to be geocoding
+	string linkColumnName_;					//!< The column used as link column in geocoding
+	string keyColumnName_;					//!< The column with index
+	int tableId_;							//!< The id of the table for geocoding
+	string locationTypeColumnName_;			//!< The field name with location type (Av., Rua, R., Pr., Jz., Pres. ...)
+	string locationTitleColumnName_;		//!< The field name with location title (Dr., Dra., PRF ...)
+	string locationPrepositionColumnName_;	//!< The field name with the preposition used to form the location name (Dos, Das, De, 
+	string locationNameColumnName_;			//!< The field name with the location name
+	string locationNumberColumnName_;		//!< The field name with the ocation number
+	string neighborhoodColumnName_;			//!< The field name for the location neighborhood
+	string zipCodeColumnName_;				//!< The field name for the location zip code	
+};
+
+
+/*! \struct TeAddress
+	Information of an address that will be geocoded
+*/
+struct TeAddress
+{
+	string locationLink_;			//!< The value that unique identifies the location	
+	string locationType_;			//!< Location type
+	string locationTitle_;			//!< Location title
+	string locationPreposition_;	//!< Location preposition
+	string locationName_;			//!< Location name
+	int locationNumber_;			//!< Location number
+	string neighborhood_;			//!< Location neighborhood
+	string zipCode_;				//!< Location zip code
+};
+
+
+/* \struct TeAddressDescription
+	Information about a found address
+ */
+struct TeAddressDescription
+{
+	string locationLink_;			//!< The value that unique identifies the location
+	int initialLeftNumber_;			//!< The initial location left number
+	int finalLeftNumber_;			//!< The final location left number
+	int initialRightNumber_;		//!< The initial location right number
+	int finalRightNumber_;			//!< The final location right number
+	string locationType_;			//!< The location type (Av., Rua, R., Pr., Jz., Pres. ...)
+	string locationTitle_;			//!< The location title (Dr., Dra., PRF ...)
+	string locationPreposition_;	//!< The preposition used to form the location name (Dos, Das, De, 
+	string locationName_;			//!< The location name
+	string locationCompleteName_;		//!< The complete location name
+	string leftNeighborhood_;		//!< The left location neighborhood 
+	string rightNeighborhood_;		//!< The right location neighborhood
+	string leftZipCode_;			//!< The eft location zip code
+	string rightZipCode_;			//!< The right location zip code
+	TeCoord2D pt_;					//!< point location of the address
+	bool isValid_;					//!< Tells if pt_ is a valid coordinate or the segment range was not found
+
+	TeAddressDescription()
+		: locationLink_(""), initialLeftNumber_(0), finalLeftNumber_(0),
+		  initialRightNumber_(0), finalRightNumber_(0), locationType_(""),
+		  locationTitle_(""), locationPreposition_(""), locationName_(""), locationCompleteName_(""), 
+		  leftNeighborhood_(""), rightNeighborhood_(""), leftZipCode_(""),
+		  rightZipCode_(""), isValid_(false)
+	{
+	}
+};
+
+
+//! An abstract class to support interactivity in geocoding
+/*!
+	Subclasses of this class must implement the "operator()" method
+*/
+class TeAbstractAddressNotifyFunctor
+{
+	public:
+
+		virtual int operator()(const TeAddress& searchedAddress, vector<TeAddressDescription>& foundAddresses) = 0;
+
+		virtual ~TeAbstractAddressNotifyFunctor()
+		{
+		}
+};
+
+//! A class to handle the geocoder support
+/*!
+	Instances of this class contains information about
+	a table that can be used for geocoding and methods
+	to geocode a given address.
+*/
+class TeAddressLocator
+{
+	protected:
+
+		TeDatabase* db_;							//!< Database connection
+		TeAddressMetadata metadata_;				//!< Metadata information for a geocoding base table
+		TeLayer* referenceLayer_;					//!< Ther layer used as reference for geocoding 
+		TeCentroidAddressMetadata cmetadata_;		//!< Centroid metadata
+		bool isMetadataLoaded_;						//!< Flag to indicate if the metadata is loaded
+		string errMsg_;								//!< Error message description
+		TeGeocoderDictionary dictionary_;			//!< Use a geocoder dictionary
+		bool changeSpecialChars_;					//!< If true should replace special characters
+		bool removeHifen_;							//!< If true the hifen is removed in zip code
+		bool removeHifenFromCentroid_;				//!< If true the hifen is removed in zip code from the centroid table
+		char hifen_;
+		string splitChar_;							//!< Used to split address name and number
+		
+		vector<string> typesVector_;				//!< Vector with default types for street names
+		vector<string> titlesVector_;				//!< Vector with default titles for street names
+		vector<string> prepositionsVector_;			//!< Vector with default prepositions for street names
+
+	public:
+
+		//! Constructor
+		TeAddressLocator(TeDatabase* db)
+			: db_(db), referenceLayer_(0), isMetadataLoaded_(false), errMsg_(""), changeSpecialChars_(false), removeHifen_(false), removeHifenFromCentroid_(false)
+		{
+		}
+
+		//! Virtual destructor
+		virtual ~TeAddressLocator()
+		{
+		}
+		
+		//! Creates the table to store metadata for geocoding tables
+		bool createAddressMetadataTable(void);
+
+		//! Inserts a new metadata for an attribute table layer and saves in the database
+		bool insertAddressMetadata(const TeAddressMetadata& metadata);
+
+		//! Updates the metadata of an attribute table layer and saves in the database
+		bool updateAddressMetadata(const TeAddressMetadata& metadata);
+
+		//! Removes the metadata for the attribute table layer on the database an clear memory
+		bool deleteAddressMetadata(const int& tableId);
+		
+		//! Loads a metadata for an attribute table layer
+		bool loadAddressMetadata(const int& tableId);
+
+		//! Returns true if metadata was loaded
+		bool isMetadataLoaded() const
+		{
+			return isMetadataLoaded_;
+		}
+
+		//! Returns the metadata of the geocode base table
+		TeAddressMetadata getAddressLocatorMetadata() const
+		{
+			return metadata_;
+		}
+
+		//! Set the metadata
+		bool setAddressLocatorMetadata(const TeAddressMetadata& m);
+
+		//! Returns the error message
+		string errorMessage() const
+		{
+			return errMsg_;
+		}
+
+		//! Information about a layer to be used as an alternative for geocoding
+		void setCentroidAddressMetadata(const TeCentroidAddressMetadata& cMetadata)
+		{
+			removeHifenFromCentroid_ = false;
+
+			cmetadata_ = cMetadata;
+
+			if(cmetadata_.fieldType_ == TeZIPCODE && !cmetadata_.centroidName_.empty() && !cmetadata_.attributeTableName_.empty())
+				removeHifenFromCentroid_ = !verifyHifen(cmetadata_.attributeTableName_, cmetadata_.centroidName_);
+		}
+
+		void setReplaceSpecialChars(const bool& r)
+		{
+			changeSpecialChars_ = r;
+		}
+
+		bool getReplaceSpecialChars(void) const
+		{
+			return changeSpecialChars_;
+		}
+
+		void setSplitChar(const string& splitChar)
+		{
+			splitChar_ = splitChar;
+		}
+		
+		//! Retrieves all metadata for a layer
+		bool getAllAddressMetadataLayer(const int& layerId, vector<TeAddressMetadata>& addVec);
+
+		//! Retrieves all metadata for a theme
+		bool getAllAddressMetadataTheme(const int& themeId, vector<TeAddressMetadata>& addVec);
+
+		//! Retrieves all layer name that has an address location table
+		bool getAddressLocatorLayers(vector<pair<int, string> >& layerNameVec);
+
+		//! Retrieves all layer table names that is register as an address find table for a given layerId
+		bool getAddressLocatorLayerTables(vector<pair<int, string> >& tableNameVec, const int& layerId);
+
+		//! Finds all geocoding table in a TerraLib database
+		bool findGeocodingTables(vector<pair<int, string> >& tableNames);
+		
+		//! Looks the attribute description to transform a name location on an address
+		int findAddress(const TeAddress& address, vector<TeAddressDescription>& addressesFound, const bool& doExaustiveSearch = false);
+
+		//! Finds segment and does an interpolation
+		void findCoordinates(const TeAddress& add, vector<TeAddressDescription>& addresses);
+
+		//! Finds segment and does an interpolation
+		void findCoordinate(const TeAddress& add, TeAddressDescription& address);
+
+		//! Spatialize a table based on the indicated fields
+		bool addressGeocode(TeGeocodeTableMetadata& tableMetadata,
+							const string& newLayerName,
+							const string& reportName,
+							const string& reportDir,
+							const bool& doExaustive = false,
+							TeAbstractAddressNotifyFunctor* notifyFunction = 0);
+
+		//! Load a dictionary to change words in the searched addresses 
+		bool loadDictionary(const string& dictionaryFileName);
+
+		//! 
+		bool loadAddressCompoundNames();
+
+		//! Used to make columns in upper case
+		bool convertColumnNameToUpper();
+
+		//! Used to join columns in one field
+		bool addCompleteNameColumn();
+
+	protected:
+
+		//! Looks the attribute description to transform a name location on an address
+		int findExact(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound);
+
+		//! Looks the attribute description to transform a name location on an address
+		int findPattern(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+
+		//! Looks the attribute description to transform a name location on an address
+		int findWithDictionary(const TeAddress& address, const string& fullName, const bool& withNumber, vector<TeAddressDescription>& addressesFound);
+
+		//! Looks the attribute description to transform a name location on an address
+		int findWithoutAllName(const TeAddress& address, const string& fullName, vector<TeAddressDescription>& addressesFound, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+		//! Looks the attribute description to transform a name location on an address
+		bool findSimilarAddress(const TeAddress& address, const string& fullName, TeAddressDescription& descript);
+
+		//! Try to find a centroid for zip code or neighborhood
+		bool findByCentroid(const TeAddress& addressToFind, vector<TeAddressDescription>& addressesFound);
+
+		//! Fill the metadata parameter
+		void fillAddressMetadata(TeAddressMetadata& metadata, TeDatabasePortal* p);
+
+		//! Fill address descriptions
+		void fillAddressesDescription(vector<TeAddressDescription>& addresses, TeDatabasePortal* p);
+
+		//!
+		void fillAddressDescription(TeAddressDescription& descript, TeDatabasePortal* p);
+
+		//! Fill address information
+		void fillAddress(TeAddress& add, const TeGeocodeTableMetadata& tableMetadata, TeDatabasePortal* p);
+
+		//! Mount a SQL to look for an address
+		string mountExactWhereSQL(const TeAddress& address, const string& fullName);
+
+		string mountLikeWhereSQL(const TeAddress& address, const string& fullName);
+
+		string mountPatternWhereSQL(const TeAddress& address, const string& fullName, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+		//!
+		string mountSimilarWhereSQL(const TeAddress& address);
+
+		//! Do some conversions in address fields
+		void normalizeAddress(TeAddress& address, string& completeName);
+
+		//! Removes hifen if remove flag is true
+		void removeHifen(string& zipCode) const;
+
+		//! Removes hifen if remove flag is true
+		void insertHifen(string& zipCode) const;
+
+		//! Inserts a special character in string for Like comparasion
+		string makeLikeExpression(const string& str) const;
+
+		//! Remove caracteres como ponto e troca acentuados por n�o acentuados
+		void removeSpecialCharacters(string& str) const;
+
+		//!
+		bool verifyHifen(const string& tableName, const string& columnName);
+
+		//!
+		bool addReportColumn(TeGeocodeTableMetadata& tableMetadata, pair<string, string>& newColumns);
+
+		//!
+		bool findTableMetadata(TeGeocodeTableMetadata& tableMetadata);
+
+		//! Update the table that contains address to be geocoded with the code returned by the geocoding process and a description of the process match
+		bool updateAddressTable(const string& c1, const int& v1, TeGeocodeTableMetadata& tableMetadata, const string& objectId);
+
+		//! Returns a portal to the address table
+		TeDatabasePortal* getAddressTablePortal(TeGeocodeTableMetadata& tableMetadata, int& numRows);
+
+		//! 
+		void refineFoundedLocationsByNeighBorhood(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+		//! 
+		void refineFoundedLocationsByZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound);		
+
+		//! 
+		void refineFoundedLocationsByNumberNeighboor(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+		//! 
+		void refineFoundedLocationsByNumberZipCode(const TeAddress& address, vector<TeAddressDescription>& addressesFound);
+
+		void cleanAddressesFound(const string& locName, vector<TeAddressDescription>& addressesFound, const bool& disabletype = false, const bool& disabletitle = false, const bool& disablepreposition = false);
+
+		//! Split address name and number
+		void splitAddress(TeAddress& add);
+
+		//! Only to query addresses and fill result
+		void queryAddresses(const string& strSQL, bool& queryExecuted, vector<TeAddressDescription>& addressesFound);
+
+		//! No copy allowed
+		TeAddressLocator(const TeAddressLocator& other);
+		TeAddressLocator& operator=(const TeAddressLocator& other);
+};
+
+#endif	// __TERRALIB_INTERNAL_ADDRESSLOCATOR_H
+
diff --git a/src/terralib/functions/TeCellAlgorithms.cpp b/src/terralib/functions/TeCellAlgorithms.cpp
new file mode 100644
index 0000000..042b8ae
--- /dev/null
+++ b/src/terralib/functions/TeCellAlgorithms.cpp
@@ -0,0 +1,1066 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeCellAlgorithms.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+#include "TeRepresentation.h"
+#include "TeGeneralizedProxMatrix.h"
+
+TeLayer* 
+TeCreateCells( const string& layerName, TeLayer* layerBase, 
+			   double resX, double resY, TeBox& box, bool mask)
+{
+	if (!layerBase || layerName.empty())
+		return 0;
+
+	TeDatabase* db = layerBase->database();
+	if (!db)
+		return 0;
+
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+		return 0;
+
+	TeProjection* proj = layerBase->projection();
+
+	string newLayerName = layerName;
+	TeLayerMap& layerMap = db->layerMap();
+	TeLayerMap::iterator it;
+	bool flag = true;
+	int n = 1;
+	while (flag)
+	{
+		for (it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if (TeStringCompare(it->second->name(),newLayerName))
+				break;
+		}
+		if (it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = layerName + "_" +Te2String(n);
+		n++;	
+	}
+
+	string polTableName;
+	if (mask)
+	{
+		TeRepresentation* repp = layerBase->getRepresentation(TePOLYGONS);
+		if (repp)
+		{
+			if (!box.isValid())
+				box = adjustToCut(repp->box_,resX,resY);
+			polTableName = repp->tableName_;
+		}
+		else
+			mask = false;
+	}
+	else 
+	{
+		if (!box.isValid())
+			box = adjustToCut(layerBase->box(),resX,resY);
+	}
+
+	TeBox newBox = adjustToCut(box,resX,resY);
+	double x,y,x1,x2,y1,y2;
+	x1 = newBox.x1_;
+	y1 = newBox.y1_;
+	x2 = newBox.x2_;
+	y2 = newBox.y2_;
+
+	int maxcols, maxlines;
+	maxlines = TeRound((y2-y1)/resY);
+	maxcols = TeRound((x2-x1)/resX);
+
+	TeAttribute attribute;
+	TeAttributeList attList;
+	attribute.rep_.name_ = "object_id_";
+	attribute.rep_.type_ = TeSTRING;
+	attribute.rep_.numChar_ = 48;
+	attribute.rep_.isPrimaryKey_ = true;
+	attList.push_back ( attribute );
+	attribute.rep_.name_ = "Col";
+	attribute.rep_.type_ = TeINT;
+	attList.push_back ( attribute );
+	attribute.rep_.name_ = "Lin";
+	attribute.rep_.type_ = TeINT;
+	attribute.rep_.isPrimaryKey_ = false;
+	attList.push_back ( attribute );	
+
+	TeLayer* newLayer = new TeLayer(layerName,db,newBox,proj);
+	if (!newLayer || newLayer->id() <= 0)
+	{
+		delete portal;
+		return 0;
+	}
+	newLayer->addGeometry(TeCELLS);
+	TeRepresentation* repp = newLayer->getRepresentation(TeCELLS);
+	if (!repp)
+	{
+		db->deleteLayer(newLayer->id());
+		delete portal;
+		return 0;
+	}
+	repp->box_ = newBox;
+	repp->resX_ = resX;
+	repp->resY_ = resY;
+	repp->nCols_ = maxcols;
+	repp->nLins_ = maxlines;
+	db->updateRepresentation(newLayer->id(),*repp);
+	
+	TeTable attTable (layerName,attList,"object_id_","object_id_",TeAttrStatic);
+	newLayer->createAttributeTable(attTable);
+
+	TeCellSet cells;
+	cells.resX(resX);
+	cells.resY(resY);
+
+	int col,lin,ncels=0;
+	bool status;
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(maxlines);
+
+	TePolygon curPol;
+	bool found = false;
+
+	TePrecision::instance().setPrecision(TeGetPrecision(proj));
+	
+	y=y2;
+	for (lin=0; lin<maxlines; ++lin) 
+	{	
+		double yu = y;
+		y=y-resY;
+		x=x1;
+
+		for (col=0; col<maxcols; ++col)
+		{
+			TeBox box(x,y,x+resX,yu);
+			found = false;
+			// check if there should be used the polygon representation as a mask
+			if (mask) 
+			{
+				TePolygon polBox = polygonFromBox(box);
+				// check if the cell intersects the current polygon
+				if (TeIntersects(polBox,curPol))
+					found = true;
+				else
+				{
+					if (db->spatialRelation(polTableName, TePOLYGONS, 
+						(TePolygon*)&polBox, portal, TeINTERSECTS))
+					{
+						portal->fetchGeometry(curPol);
+						found = true;
+					}
+					portal->freeResult();
+				}
+			}
+
+			if (!mask || found)
+			{
+				// build geometry
+				TeCell cell(box,col,lin);
+				char celId[32];
+				sprintf(celId,"C%02dL%02d",col,lin);
+				cell.objectId(string(celId));
+				cells.add(cell);
+				
+				// build default attributes
+				TeTableRow row;
+				row.push_back(cell.objectId()); 
+				row.push_back(Te2String(col)); 
+				row.push_back(Te2String(lin)); 
+				attTable.add(row);
+				ncels++;
+			}
+			x=x+resX;
+		}
+		if (attTable.size() > 0)	// if there is some attributes in this line
+		{
+			status = newLayer->saveAttributeTable(attTable);
+			attTable.clear();
+			status = newLayer->addCells(cells);
+			cells.clear();
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				else
+					TeProgress::instance()->setProgress(lin);
+			}			
+		}
+	}
+	delete portal;
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	if (ncels > 0)
+		return newLayer;
+	else
+	{
+		db->deleteLayer(newLayer->id());
+		return 0;
+	}
+}
+
+	
+TeLayer*
+TeCreateCells(const string& layerName,TeTheme* theme, double resX, double resY, TeBox& box)
+{
+	TeLayer* inputLayer = theme->layer();
+	TeRepresentation* pp = inputLayer->getRepresentation(TePOLYGONS);
+	if (!pp)
+		return 0;
+
+	TeDatabase* db = inputLayer->database();
+	TeDatabasePortal* portal = db->getPortal();
+	if (!portal)
+		return 0;
+
+	string newLayerName = layerName;
+	TeLayerMap& layerMap = db->layerMap();
+	TeLayerMap::iterator it;
+	bool flag = true;
+	int n = 1;
+	while (flag)
+	{
+		for (it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if (TeStringCompare(it->second->name(),newLayerName))
+				break;
+		}
+		if (it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = layerName + "_" +Te2String(n);
+		n++;	
+	}
+
+	if (!box.isValid())
+		box = pp->box_;
+
+	TeBox newBox = adjustToCut(box,resX,resY);
+	double x,y,x1,x2,y1,y2;
+	x1 = newBox.x1_;
+	y1 = newBox.y1_;
+	x2 = newBox.x2_;
+	y2 = newBox.y2_;
+
+	int maxcols, maxlines;
+	maxlines = TeRound((y2-y1)/resY);
+	maxcols = TeRound((x2-x1)/resX);
+
+	TeAttribute attribute;
+	TeAttributeList attList;
+	attribute.rep_.name_ = "object_id_";
+	attribute.rep_.type_ = TeSTRING;
+	attribute.rep_.isPrimaryKey_ = true;
+	attribute.rep_.numChar_ = 48;
+	attList.push_back ( attribute );
+
+	attribute.rep_.name_ = "Col";
+	attribute.rep_.type_ = TeINT;
+	attribute.rep_.isPrimaryKey_ = false;
+	attList.push_back ( attribute );
+
+	attribute.rep_.name_ = "Lin";
+	attribute.rep_.type_ = TeINT;
+	attribute.rep_.isPrimaryKey_ = false;
+	attList.push_back ( attribute );	
+
+	TeLayer* newLayer = new TeLayer(layerName,db,newBox,inputLayer->projection());
+	if (!newLayer || newLayer->id() <= 0)
+	{
+		return 0;
+		delete portal;
+	}
+	newLayer->addGeometry(TeCELLS);
+	TeRepresentation* repp = newLayer->getRepresentation(TeCELLS);
+	if (!repp)
+	{
+		db->deleteLayer(newLayer->id());
+		delete portal;
+		return 0;
+	}
+	repp->box_ = newBox;
+	repp->resX_ = resX;
+	repp->resY_ = resY;
+	repp->nCols_ = maxcols;
+	repp->nLins_ = maxlines;
+	db->updateRepresentation(newLayer->id(),*repp);
+
+	TeTable attTable (layerName,attList,"object_id_","object_id_",TeAttrStatic);
+	newLayer->createAttributeTable(attTable);
+
+	string polTableName = inputLayer->tableName(TePOLYGONS);
+
+	TeCellSet cells;
+	cells.resX(resX);
+	cells.resY(resY);
+
+	TePolygon curPol;
+	int col,lin;
+	bool status;
+	int ncels = 0;
+
+	TePrecision::instance().setPrecision(TeGetPrecision(newLayer->projection()));
+
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(maxlines);
+
+	bool found;
+	y=y2;
+	for (lin=0; lin<maxlines; ++lin) 
+	{	
+		double yu = y;
+		y=y-resY;
+		x=x1;
+		for (col=0; col<maxcols; ++col)
+		{
+			found = false;
+			TeBox box(x,y,x+resX,yu);
+
+			TePolygon polBox = polygonFromBox(box);
+			// check if the cell intersects the current polygon
+			if (TeIntersects(polBox,curPol))
+				found = true;
+			else
+			{
+				if (db->spatialRelation(polTableName, TePOLYGONS, 
+					(TePolygon*)&polBox, portal, TeINTERSECTS, theme->collectionTable()))
+				{
+					portal->fetchGeometry(curPol);
+					found = true;
+				}
+				portal->freeResult();
+			}
+			if (found)
+			{
+				TeCell cell(box,col,lin);
+				char celId[32];
+				sprintf(celId,"C%02dL%02d",col,lin);
+				cell.objectId(string(celId));
+				cells.add(cell);
+
+				TeTableRow row;
+				row.push_back(cell.objectId()); 
+				row.push_back(Te2String(col)); 
+				row.push_back(Te2String(lin)); 
+				attTable.add(row);
+				++ncels;		
+			}
+			x=x+resX;
+		}
+		if (attTable.size() > 0)	// if there is some attributes in this line
+		{
+			status = newLayer->saveAttributeTable(attTable);
+			attTable.clear();
+			status = newLayer->addCells(cells);
+			cells.clear();
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				else
+					TeProgress::instance()->setProgress(lin);
+			}	
+		}
+	}
+	delete portal;
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	if (ncels > 0)
+		return newLayer;
+	else
+	{
+		db->deleteLayer(newLayer->id());
+		return 0;
+	}
+}
+
+
+bool 
+TeCellStatistics(TeTheme* themeOut, TeTable& newAttrTable, TeGroupingAttr& stat, 
+				 TeTheme* themeIn, TeDatabase* db)
+{
+
+	TeGroupingAttr tempStat = stat;
+	string sqlResut = db->getSQLStatistics (tempStat);
+
+	bool dbStat = true;
+	TeGroupingAttr::iterator it = tempStat.begin();
+	while(it!= tempStat.end())
+	{
+		if(it->second != TeNOSTATISTIC)
+		{
+			dbStat = false;
+			break;
+		}
+		++it;
+	}
+		
+	if((!dbStat) || (sqlResut.empty()))
+		return false; 
+
+	TeDatabasePortal* portal = db->getPortal();
+
+	// mount sql 
+	//geom and collection tables from cell layer (cell)
+	string tableGeomOut = themeOut->layer()->tableName (TeCELLS);
+	string tableCollOut; 
+	if(themeOut->hasRestriction())
+		tableCollOut = themeOut->collectionTable();
+
+	//geom and collection tables from in layer (point or cell)
+	string tableGeomIn = themeIn->layer()->tableName (TePOINTS);
+	TeGeomRep geomRepIn = TePOINTS;
+	if(tableGeomIn.empty())
+	{
+		geomRepIn = TeCELLS;
+		tableGeomIn = themeIn->layer()->tableName (TeCELLS);
+	}
+
+	string tableCollIn; 
+	if(themeIn->hasRestriction())
+		tableCollIn = themeIn->collectionTable();
+
+	//sql from database
+	string sql = " SELECT " + tableGeomOut + ".object_id,  ";
+	sql += 	sqlResut;
+	sql += " FROM " + tableGeomOut +","+ tableGeomIn;
+
+	//for each point attr table 
+	string sqlWhere ="";
+	TeAttrTableVector vec = themeIn->attrTables();
+	for(unsigned int index=0; index<vec.size(); ++index)
+	{
+		if( (vec[index].tableType() != TeAttrStatic) && 
+			(vec[index].tableType() != TeAttrEvent)  &&
+			(vec[index].tableType() != TeFixedGeomDynAttr)) //only to static attribute table
+			continue;
+
+		//from clause
+		sql += ","+ vec[index].name();
+
+		//where clause
+		if(!sqlWhere.empty())
+			sqlWhere += " AND ";
+		sqlWhere += vec[index].name() +"."+ vec[index].linkName() +" = "+ tableGeomIn +".object_id ";
+	}
+
+	if(!tableCollIn.empty())
+	{
+		sql += ", "+ tableCollIn;
+		if(!sqlWhere.empty())
+			sqlWhere += " AND ";
+	
+		sqlWhere = tableGeomIn +".object_id = "+ tableCollIn +".c_object_id ";
+	}
+	if(!tableCollOut.empty())
+	{
+		sql += ", "+ tableCollOut;
+		if(!sqlWhere.empty())
+			sqlWhere += " AND ";
+	
+		sqlWhere += tableGeomOut +".object_id = "+ tableCollOut +".c_object_id ";
+	}
+
+	//box where
+	if(!sqlWhere.empty())
+		sqlWhere += " AND ";
+	
+	sqlWhere += db->getSQLBoxWhere (tableGeomOut, tableGeomIn, geomRepIn);
+
+	sql += " WHERE "+ sqlWhere; 
+	sql += " GROUP BY "+ tableGeomOut +".object_id";
+
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	//Keep statistics in the tableAttrCell table   
+	if(!TeKeepStatistics(newAttrTable, portal))
+	{
+		delete portal;
+		return false;
+	}
+	
+	delete portal;
+	return true;
+}
+
+
+bool	
+TeKeepStatistics(TeTable& tableAttrCell, TeDatabasePortal* portal)
+{
+	
+	TeAttributeList attr = portal->AttributeList();
+
+	//Mount the update sql from portal
+	string insert = "INSERT INTO "+ tableAttrCell.name() +" VALUES ( ";
+	while(portal->fetchRow())
+	{
+		string insert2 = "";
+		for(unsigned int i=0; i<attr.size(); ++i)
+		{
+			if(i>0)
+				insert2 += ",";
+			
+			string val = portal->getData(i);
+			if (attr[i].rep_.type_ == TeSTRING) 
+				insert2 += "'"+ val +"'";
+			else
+				insert2 += val;
+		}
+
+		string result = insert + insert2 +" )";
+		
+		if(!portal->getDatabase()->execute(result))
+			return false;
+	}
+		
+	return true;
+}	
+
+
+
+
+
+//////////////////////////////////////////////////////////////////////
+//
+//				Fill Cell Auxiliary Funcions
+//
+/////////////////////////////////////////////////////////////////////
+
+
+bool TeFillCellInitLoad (TeLayer* cell_layer, const string& cell_tablename, TeCellSet& cells)
+{
+	if (!cell_layer) return false;
+
+	// get cells
+	if (!cell_layer->getCells (cells)) return false;
+
+	// if dynamic table was not created, create it
+	TeTable table;
+	if (!cell_layer->getAttrTablesByName(cell_tablename, table, TeFixedGeomDynAttr))
+		if (!TeCreateBasicDymanicCellTable (cell_layer, cell_tablename))
+			return false;
+
+	return true;
+}
+
+
+
+void TeFillCellInitSTO (const TeCell& cell, TeTimeInterval& t, TePropertyVector& result, TeSTElementSet& cellObjSet)
+{
+
+		TeSTInstance cellObj;
+		cellObj.objectId (cell.objectId());
+		string uniqueId = cell.objectId();
+		cellObj.addUniqueId (uniqueId); // ANAP
+		uniqueId += t.getInitialDate() + t.getInitialTime();
+		uniqueId += t.getFinalDate() + t.getFinalTime() ;
+		cellObj.addUniqueId (uniqueId);
+		cellObj.timeInterval (t);
+		TePropertyVector::iterator itProp = result.begin();
+		while (itProp != result.end())
+		{
+			cellObj.addProperty (*itProp);
+			itProp++;
+		}
+		cellObjSet.insertSTInstance (cellObj);
+		return;
+}
+
+
+
+bool
+TeCreateBasicDymanicCellTable (TeLayer* cell_layer, const string cell_tablename)
+{
+	if (!cell_layer) return false;
+
+		TeAttribute		attribute;
+		TeAttributeList attList;
+		TeAttributeList keyList;
+
+		// attr_id
+		attribute.rep_.name_ = "attr_id";
+		attribute.rep_.type_ = TeSTRING;
+		attribute.rep_.numChar_ = 48;
+		attribute.rep_.isPrimaryKey_ = true;
+		attList.push_back (attribute);
+		keyList.push_back(attribute);
+
+		// object_id
+		attribute.rep_.name_ = "object_id";
+		attribute.rep_.type_ = TeSTRING;
+		attribute.rep_.numChar_ = 48;
+		attList.push_back ( attribute );
+	
+
+		//  initial_time
+		attribute.rep_.name_ = "initial_time";
+	 	attribute.rep_.type_ = TeDATETIME;   
+		attribute.dateTimeFormat_ = "YYYYsMMsDDsHHsMMsSS";
+		attribute.dateChronon_ = TeSECOND;
+		attribute.rep_.numChar_ = 48;
+		attList.push_back ( attribute );
+
+
+		//  final_time
+		attribute.rep_.name_ = "final_time";
+	 	attribute.rep_.type_ = TeDATETIME;  
+		attribute.dateTimeFormat_ = "YYYYsMMsDDsHHsMMsSS";
+		attribute.dateChronon_ = TeSECOND;
+		attribute.rep_.numChar_ = 48;
+		attList.push_back ( attribute );
+		
+	// Create table and initialize attributes
+
+		TeTable cells_attTable (cell_tablename);       
+		cells_attTable.setAttributeList(attList);
+		cells_attTable.setTableType(TeFixedGeomDynAttr);
+		cells_attTable.setLinkName("object_id");
+		cells_attTable.setUniqueName("attr_id");
+		cells_attTable.attInitialTime ("initial_time"); 
+		cells_attTable.attFinalTime ("final_time"); 
+		cells_attTable.attTimeUnit (TeSECOND); 
+			
+		if (!cell_layer->createAttributeTable(cells_attTable))
+			return false;
+
+		TeAttributeList attr; 
+		cell_layer->database ()->getAttributeList (cell_tablename, attr);
+
+		return true;
+}
+
+
+
+//////////////////////////////////////////////////////////////////////
+//
+//					Fill Cell Operations
+//
+/////////////////////////////////////////////////////////////////////
+
+bool TeFillCellSpatialOperation (TeDatabase* db,
+										const string& input_layername, 
+										TeGeomRep rep,
+										const string& input_tablename, 
+										const string& input_attrname,
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										TeComputeAttrSpatialStrategy* operation)
+
+{
+	if (!operation) return false;
+	if (!db) return false;
+
+// Load input layers
+	TeLayer* input_layer = new TeLayer (input_layername);
+	if (!db->loadLayer (input_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << input_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+// Load output cells layer with geometry previously created
+	TeLayer* cell_layer = new TeLayer (cell_layername);
+	if (!db->loadLayer (cell_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << cell_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+// Initialize cell set
+	TeCellSet cells;
+	if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+	TeSTElementSet cellObjSet (cell_layer);
+
+// Initialize theme
+
+	TeTheme* theme = new TeTheme ("", input_layer);
+	vector<string> attrTableNames;
+	attrTableNames.push_back (input_tablename);
+	TeAttrTableVector atts;
+	if (!input_layer->getAttrTablesByName(attrTableNames, atts)) return false;
+	theme->setAttTables (atts);
+
+// Process
+	TePropertyVector result;
+	TeCellSet::iterator cell_it = cells.begin();
+	while (cell_it != cells.end())
+	{
+		// Set restrictions on a theme and create stoset
+		theme->setSpatialRest((*cell_it).box(), rep);	
+		result = operation->compute (theme, input_attrname, (*cell_it).box(), output_columnName);
+		TeFillCellInitSTO ((*cell_it), t, result, cellObjSet);
+		cell_it++;
+
+	} 
+
+// Update DB
+	if (!TeUpdateDBFromSet(&cellObjSet, cell_tablename))
+			return  false;
+	return true;
+}
+
+
+
+bool TeFillCellNonSpatialOperation (TeDatabase* db,
+										const string& input_layername, 
+										TeGeomRep rep,
+										const string& input_tablename, 
+										const string& input_attrname,
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation)
+{
+	if (!db) return false;
+
+// Load input layers
+	TeLayer* input_layer = new TeLayer (input_layername);
+	if (!db->loadLayer (input_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << input_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+// Load output cells layer with geometry previously created
+	TeLayer* cell_layer = new TeLayer (cell_layername);
+	if (!db->loadLayer (cell_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << cell_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+// Initialize cell set
+	TeCellSet cells;
+	if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+// Initialize object set to store cell properties
+	TeSTElementSet cellObjSet (cell_layer);
+
+// Initialize theme
+	TeTheme* theme = new TeTheme ("", input_layer);
+	vector<string> attrTableNames;
+	attrTableNames.push_back (input_tablename);
+	TeAttrTableVector atts;
+	if (!input_layer->getAttrTablesByName(attrTableNames, atts)) return false;
+	theme->setAttTables (atts);
+
+// Process
+	TePropertyVector result;
+	TeCellSet::iterator cell_it = cells.begin();
+	while (cell_it != cells.end())
+	{
+		// Set restrictions on a theme and create stoset
+		theme->setSpatialRest((*cell_it).box(), rep);	
+		TeSTElementSet stos (theme);
+		vector<string> attrNames;
+		attrNames.push_back (input_attrname);	
+		if (TeSTOSetBuildDB (&stos, false, false, attrNames))
+				result = operation->compute (stos.begin(input_attrname), stos.end(input_attrname), output_columnName); 	// if property not found, stos iterator will return zero to operation. To check this, have to be less general and use getProperty inside the compute method.		
+
+		TeFillCellInitSTO ((*cell_it), t, result, cellObjSet);	
+		cell_it++;
+
+	} 
+
+// Update DB
+	if (!TeUpdateDBFromSet (&cellObjSet, cell_tablename))
+			return  false;
+	return  true;
+}
+
+
+
+
+
+bool TeFillCellNonSpatialRasterOperation (TeDatabase* db,
+										const string& input_raster_layername, 
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										TeComputeAttrStrategy<TeRaster::iteratorPoly>* operation)
+{
+	if (!db) return false;
+
+// Load input layers
+	TeLayer* input_layer = new TeLayer (input_raster_layername);
+	if (!db->loadLayer (input_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << input_raster_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+	TeRaster* raster = input_layer->raster();
+	if (!raster) return false;
+
+
+// Load output cells layer with geometry previously created
+	TeLayer* cell_layer = new TeLayer (cell_layername);
+	if (!db->loadLayer (cell_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << cell_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+
+// Initialize cell set
+	TeCellSet cells;
+	if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+	TeSTElementSet cellObjSet (cell_layer);
+
+
+// Process
+	TePropertyVector result;
+	TeCellSet::iterator cell_it = cells.begin();
+	while (cell_it != cells.end())
+	{
+		TePolygon p = TeBox2Polygon((*cell_it).box());
+		TeRaster::iteratorPoly rasterItBegin(raster);
+		rasterItBegin = raster->begin(p, TeBBoxPixelInters, 0);
+		TeRaster::iteratorPoly rasterItEnd(raster);
+		rasterItEnd = raster->end(p, TeBBoxPixelInters, 0);
+
+		result = operation->compute (rasterItBegin, rasterItEnd, output_columnName);										
+		TeFillCellInitSTO ((*cell_it), t, result, cellObjSet);	
+		cell_it++;
+	} 
+
+// Update DB
+	if (!TeUpdateDBFromSet (&cellObjSet, cell_tablename))
+			return  false;
+	return  true;
+}
+
+
+
+bool TeFillCellAggregateOperation (  TeDatabase* db,
+										const string& input_layername, 
+										const string& input_tablename, 
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										vector<string>& attrNames,
+										TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation)
+{
+	if (!db) return false;
+
+
+// Load input layers
+	TeLayer* input_layer = new TeLayer (input_layername);
+	if (!db->loadLayer (input_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << input_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+
+// Load output cells layer with geometry previously created
+	TeLayer* cell_layer = new TeLayer (cell_layername);
+
+	if (!db->loadLayer (cell_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << cell_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+// Initialize cell set
+	TeCellSet cells;
+	if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+	TeSTElementSet cellObjSet (cell_layer);
+
+// Initialize theme
+
+	TeTheme* theme = new TeTheme ("", input_layer);
+	vector<string> attrTableNames;
+	attrTableNames.push_back (input_tablename);
+	TeAttrTableVector atts;
+	if (!input_layer->getAttrTablesByName(attrTableNames, atts)) return false;
+	theme->setAttTables (atts);
+
+
+// Process
+	TeCellSet::iterator cell_it = cells.begin();
+	while (cell_it != cells.end())
+	{
+		TeSTInstance cellObj;
+		cellObj.objectId ((*cell_it).objectId());
+		string uniqueId = (*cell_it).objectId();
+		cellObj.addUniqueId (uniqueId); 
+		uniqueId += t.getInitialDate() + t.getInitialTime();
+		uniqueId += t.getFinalDate() + t.getFinalTime() ;
+		cellObj.addUniqueId (uniqueId);
+		cellObj.timeInterval (t);
+		
+		// Set restrictions on a theme and create stoset
+		theme->setSpatialRest((*cell_it).box(), TeCELLS); //????? TeWITHIN ok? ANAP	
+		TeSTElementSet stos (theme);
+		TeSTOSetBuildDB (&stos, true, false, attrNames);
+			
+		// Create stoset based on input layer
+		TePropertyVector result;
+		vector<string>::iterator attIt = attrNames.begin();
+		while (attIt != attrNames.end())
+		{
+			result = operation->compute (stos.begin(*attIt), stos.end(*attIt), (*attIt)); 	// if property not found, stos iterator will return zero to operation. To check this, have to be less general and use getProperty inside the compute method.		
+			TePropertyVector::iterator itProp = result.begin();
+			while (itProp != result.end())
+			{
+				cellObj.addProperty (*itProp);
+				itProp++;
+			}
+			attIt++;
+		}
+		cellObjSet.insertSTInstance (cellObj);
+
+		cell_it++;
+	}
+
+// Update DB
+	if (!TeUpdateDBFromSet (&cellObjSet, cell_tablename))
+			return  false;
+
+	return  true;
+}
+
+
+
+
+
+
+bool TeFillCellConnectionOperation (	TeDatabase* db,
+										TeSTElementSet objects,
+										TeGeomRep rep,
+										TeGraphNetwork* net,
+										const string& input_attrName,
+
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										
+								
+										TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation,
+										double local_distance_factor,
+										double net_distance_factor,
+										double net_conn_factor,
+										double mult_factor)
+{
+
+	if (!operation) return false;
+	if (!net) return false;
+	if (!db) return false;
+
+	// Load output cells layer with geometry previously created
+
+	TeLayer* cell_layer = new TeLayer (cell_layername);
+
+	if (!db->loadLayer (cell_layer))
+	{
+		 cout << "\tLayer de entrada inexistente: " << cell_layername << endl; 
+		 db->close();
+		 return false;
+	}
+
+// Initialize cell set
+	TeCellSet cells;
+	if (!TeFillCellInitLoad (cell_layer, cell_tablename, cells)) return false;
+
+
+// Initialize object set to store cell properties
+	TeSTElementSet cellObjSet (cell_layer);
+
+
+// Process
+	TePropertyVector result;
+	TeCellSet::iterator cell_it = cells.begin();
+	while (cell_it != cells.end())
+	{
+		TeSTInstance cellObj;
+		cellObj.objectId ((*cell_it).objectId());
+		string uniqueId = (*cell_it).objectId();
+		cellObj.addUniqueId (uniqueId);
+		uniqueId += t.getInitialDate() + t.getInitialTime();
+		uniqueId += t.getFinalDate() + t.getFinalTime() ;
+		cellObj.addUniqueId (uniqueId);
+		cellObj.timeInterval (t);	
+		cellObjSet.insertSTInstance (cellObj);
+		cell_it++;
+	} 
+
+	TeProxMatrixOpenNetworkStrategy2    sc_net (&cellObjSet, TeCELLS, &objects, rep, 0, TeMAXFLOAT, TeMAXFLOAT, net);
+ //	TeProxMatrixConnectionStrenghtStrategy sw(4, 0.0, false);
+	TeProxMatrixInverseDistanceStrategy sw (local_distance_factor, net_distance_factor, net_conn_factor, mult_factor, false);
+	TeProxMatrixNoSlicingStrategy ss_no;
+	TeGeneralizedProxMatrix mat  (&sc_net, &sw, &ss_no);
+
+	// initialize object set to store cell properties
+	TeSTElementSet cellObjSet2 (cell_layer);
+	TeCellSet::iterator cell_it2 = cells.begin();
+	while (cell_it2 != cells.end())
+	{
+		TeSTElementSet neigh = mat.getSTENeighbours((*cell_it2).objectId());	
+
+		result = operation->compute (neigh.begin(input_attrName), neigh.end(input_attrName), output_columnName); 	// if property not found, stos iterator will return zero to operation. To check this, have to be less general and use getProperty inside the compute method.		
+		TeFillCellInitSTO ((*cell_it2), t, result, cellObjSet2);	
+		cell_it2++;
+	} 
+
+
+// Update DB
+	if (!TeUpdateDBFromSet (&cellObjSet2, cell_tablename))
+			return  false;
+
+	return  true;
+}
+
+
diff --git a/src/terralib/functions/TeCellAlgorithms.h b/src/terralib/functions/TeCellAlgorithms.h
new file mode 100644
index 0000000..055c792
--- /dev/null
+++ b/src/terralib/functions/TeCellAlgorithms.h
@@ -0,0 +1,268 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeCellAlgorithms.h
+    This file contains algorithms and operations to deal with on cell geometry
+*/
+
+#ifndef  __TERRALIB_INTERNAL_CELLALGORITHMS_H
+#define  __TERRALIB_INTERNAL_CELLALGORITHMS_H
+
+#include "TeSTElementSet.h"
+#include "TeComputeAttributeStrategies.h"
+
+class TeDatabase; 
+class TeLayer;
+class TeGraphNetwork;
+
+
+using namespace std;
+
+
+/** @defgroup CellAlg Functions to generate and operate on cell geometry 
+ *  @{
+ */
+
+/*!
+	\brief Creates a new layer with the cells that covers the polygons of a theme  
+	\param layerName name of the new layer with cell representations
+	\param theme pointer to the theme that has the polygons
+	\param resX X resolution of each cell
+	\param resY Y resolution of each cell
+	\param box bounding box of interest
+	\return a pointer to the new layer created if success or null if fail
+*/
+TeLayer* TeCreateCells(const string& layerName,TeTheme* theme, double resX, double resY, TeBox& box);
+
+/*!
+	\brief Creates a new layer with the cells that covers the entire bounding box, or the polygons  of a layer 
+	\param layerName name of the new layer with cell representations
+	\param layerBase pointer to the base layer
+	\param resX X resolution of each cell
+	\param resY Y resolution of each cell
+	\param mask flag that indicates if the cells should be created only over the polygons of the layer
+	\param box bounding box of interest
+	\return a pointer to the new layer created if success or null if fail
+*/
+TeLayer* TeCreateCells( const string& layerName, TeLayer* layerBase, 
+			   double resX, double resY, TeBox& box, bool mask = true);
+
+
+/*!
+	\brief Calculates a set of statistics of cells of a theme 
+	\param themeOut			cell theme 
+	\param newAttrTable		new attribute table where the generated statistics will be kept 
+	\param stat				the structure that contains the statistics which will be generated 
+	\param themeIn			point or cell theme
+	\param db				a pointer to the database 
+*/
+bool 
+TeCellStatistics(TeTheme* themeOut, TeTable& newAttrTable, TeGroupingAttr& stat, 
+				 TeTheme* themeIn, TeDatabase* db);
+
+
+/*!
+	\brief Saves the statistics accessible through a TeDatabasePortal in a database table 
+	\param tableAttrCell	attribute table name where the generated statistics will be kept 
+	\param portal			a pointer to the database portal that contains the generated statistics  
+*/
+bool TeKeepStatistics(TeTable& tableAttrCell, TeDatabasePortal* portal);
+
+
+/** @} */ // End of group CellAlg format
+
+
+//////////////////////////////////////////////////////////////////////
+//
+//					Fill Cell Function (headers)
+//
+/////////////////////////////////////////////////////////////////////
+/** @defgroup FillCellAlg Functions to fill one attribute (or group of related attributes) for all cells in the output layer based on a single input layer attribute for a given time interval. Specific operation to be applied is a parameter (Strategy pattern).
+ *  @{
+ */
+
+/*!
+	\brief Computes the cell attribute based on a spatial operation (TeComputeAttrSpatialStrategy) over a vector input layer.
+	\param db						a pointer to the database in which input and output layers are stored
+	\param input_layername			name of input layer 
+	\param rep						input layer representation to be used
+	\param input_tablename			input layer attribute table to be used  
+	\param input_attrname			input layer attribute to be used to compute output attribute
+	\param t						time interval of output cells attributes
+	\param cell_layername			output cell layer  
+	\param cell_tablename			output cell attribute dynamic table; if does not exist, the table will be created by the function  
+	\param output_columnName		output attribute name   
+	\param operation				operation to be applied (see TeComputeAttrSpatialStrategy hierarchy)  
+*/
+bool TeFillCellSpatialOperation (	TeDatabase* db,
+											const string& input_layername, 
+											TeGeomRep rep,
+											const string& input_tablename, 
+											const string& input_attrname,
+											TeTimeInterval t,
+											const string& cell_layername, 
+											const string& cell_tablename, 
+											const string& output_columnName,
+											TeComputeAttrSpatialStrategy* operation);
+
+
+											
+/*!
+	\brief Computes the cell attribute based on a non-spatial operation (TeComputeAttrStrategy) over a vector or cell input layer.
+	\param db						a pointer to the database in which input and output layers are stored
+	\param input_layername			name of input layer 
+	\param rep						input layer representation to be used
+	\param input_tablename			input layer attribute table to be used  
+	\param input_attrname			input layer attribute to be used to compute output attribute
+	\param t						time interval of output cells attributes
+	\param cell_layername			output cell layer  
+	\param cell_tablename			output cell attribute dynamic table; if does not exist, the table will be created by the function  
+	\param output_columnName		output attribute name   
+	\param operation				operation to be applied (see TeComputeAttrStrategy hierarchy)  
+*/
+bool TeFillCellNonSpatialOperation (TeDatabase* db,
+										const string& input_layername, 
+										TeGeomRep rep,
+										const string& input_tablename, 
+										const string& input_attrname,
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation);
+
+/*!
+	\brief Computes the cell attribute based on a non-spatial operation (TeComputeSpatialStrategy) over a raster input layer.
+	\param db						a pointer to the database in which input and output layers are stored
+	\param input_raster_layername	name of input layer that contains a raster representation 
+	\param t						time interval of output cells attributes
+	\param cell_layername			output cell layer  
+	\param cell_tablename			output cell attribute dynamic table; if does not exist, the table will be created by the function  
+	\param output_columnName		output attribute name   
+	\param operation				operation to be applied (see TeComputeAttrStrategy hierarchy)  
+*/
+
+bool TeFillCellNonSpatialRasterOperation (TeDatabase* db,
+										const string& input_raster_layername, 
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										TeComputeAttrStrategy<TeRaster::iteratorPoly>* operation);
+
+
+
+
+
+/*!
+	\brief Computes the cell attribute based on a non-spatial operation (TeComputeSpatialStrategy) over a certain attribute of a set of objects connected to each cell by a network.
+	\param db						a pointer to the database in which input and output layers are stored
+	\param objects					set of objects (e.g., ports) 
+	\param rep						objects representation type
+	\param net						netork to be used to verify and quantify cell connectivity to each cell
+	\param input_attrname			connected objects attribute to be used to compute output attribute
+	\param t						time interval of output cells attributes
+	\param cell_layername			output cell layer  
+	\param cell_tablename			output cell attribute dynamic table; if does not exist, the table will be created by the function  
+	\param output_columnName		output attribute name   
+	\param operation				operation to be applied (see TeComputeAttrStrategy hierarchy)  
+	\param local_distance_factor	multiplier used to compute connection strenght weights: local distance factor (see GPM documentation) 
+	\param net_distance_factor		multiplier used to compute connection strenght weights: distance to network factor (see GPM documentation) 
+	\param net_conn_factor			multiplier used to compute connection strenght weights: connection through network factor (see GPM documentation) 
+	\param mult_factor				multiplier used to compute connection strenght weights: weight multiplier factor (see GPM documentation) 
+*/
+
+
+bool TeFillCellConnectionOperation (	TeDatabase* db,
+										TeSTElementSet objects,
+										TeGeomRep rep,
+										TeGraphNetwork* net,
+										const string& input_attrName,
+
+										TeTimeInterval t,
+
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										const string& output_columnName,
+										
+							
+										TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation,
+										double local_distance_factor = 0.0,
+										double net_distance_factor = 0.25,
+										double net_conn_factor = 1.0,
+										double mult_factor = 1000000.0);
+
+/** @} */ // End of group FillCellAlg 
+
+		  
+/** @defgroup AgregateCellAlg Functions aggregate a set of attributes to coarse resolution cells for a given time interval. Specific (non-spatial) operation to be applied is a parameter (Strategy pattern).
+*  @{
+*/
+
+
+/*!
+	\brief Computes a set of attributes for the output cell layer based on a non-spatial operation (TeComputeAttrSpatialStrategy) over a input cell layer.
+	\param db						a pointer to the database in which input and output layers are stored
+	\param input_layername			name of input cell layer 
+	\param input_tablename			input layer attribute table to be used  
+	\param t						time interval of output cells attributes
+	\param cell_layername			output cell layer  
+	\param cell_tablename			output cell attribute dynamic table; if does not exist, the table will be created by the function  
+	\param attrNames				names of input/output attribute names to be aggregated   
+	\param operation				operation to be applied (see TeComputeAttrStrategy hierarchy)  
+*/
+
+
+bool TeFillCellAggregateOperation (  TeDatabase* db,
+										const string& input_layername, 
+										const string& input_tablename, 
+										TeTimeInterval t,
+										const string& cell_layername, 
+										const string& cell_tablename, 
+										vector<string>& attrNames,
+										TeComputeAttrStrategy<TeSTElementSet::propertyIterator>* operation);
+
+/** @} */ // End of group AgregateCellAlg 
+
+
+//////////////////////////////////////////////////////////////////////
+//
+//					Fill Cell Auxiliary Functions (headers)
+//
+/////////////////////////////////////////////////////////////////////
+
+
+// Load cells geometries and verify/create dynamic attribute table if does not exists
+bool TeFillCellInitLoad (TeLayer* cell_layer, const string& cell_tablename, TeCellSet& cells);
+
+
+
+// Init output cell sto
+void TeFillCellInitSTO (const TeCell& cell, TeTimeInterval& t, TePropertyVector& result, TeSTElementSet& cellObjSet);
+
+// Creates dymanic table
+bool TeCreateBasicDymanicCellTable (TeLayer* cell_layer, const string cell_tablename);
+
+
+
+#endif
+
diff --git a/src/terralib/functions/TeCoordAlgorithms.cpp b/src/terralib/functions/TeCoordAlgorithms.cpp
new file mode 100644
index 0000000..bcc867d
--- /dev/null
+++ b/src/terralib/functions/TeCoordAlgorithms.cpp
@@ -0,0 +1,99 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeCoordAlgorithms.h"
+#include <math.h>
+
+bool TeLongDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec)
+{
+	short  	posat,lim = 180;
+
+	double	dd,pi;			
+	posat = 0;
+	pi = 4.*atan((double)1.);
+
+	// Longitude 
+	if(dg < 0 || dg > lim)	
+		return false;
+
+	if(mn < 0 || mn > 60)
+		return false;
+
+	if(sc < 0. || sc > 60.)
+		return false;
+
+	if(hem == 'W' || hem == 'w'|| hem == 'O'|| hem == 'o')
+	{
+		if(dg > 0)
+			dg = dg * -1;
+		else if(mn > 0)
+			mn = mn * -1;
+		else
+			sc = (float)(sc * -1.);
+	}
+
+	dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+	if (dg < 0 || mn < 0 || (int)sc < 0)
+		dd = -dd;
+	grauDec = dd;
+	return true;
+}
+
+
+bool
+TeLatDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec)
+{
+	short  	posat,lim = 90;
+
+	double	dd,pi;			
+	posat = 0;
+	pi = 4.*atan((double)1.);
+
+	// Longitude 
+	if(dg < 0 || dg > lim)	
+		return false;
+
+	if(mn < 0 || mn > 60)
+		return false;
+
+	if(sc < 0. || sc > 60.)
+		return false;
+
+	if(hem == 's' || hem == 'S')
+	{
+		if(dg > 0)
+			dg = dg * -1;
+		else if(mn > 0)
+			mn = mn * -1;
+		else
+			sc = (float)(sc * -1.);
+	}
+
+	dd = (double)(abs(dg)) + ((double)abs(mn)/60.) + fabs(sc)/3600.;
+	if (dg < 0 || mn < 0 || (int)sc < 0)
+		dd = -dd;
+
+//	dd = dd*pi/180.;
+	grauDec = dd;
+	return true;
+}
diff --git a/src/terralib/functions/TeCoordAlgorithms.h b/src/terralib/functions/TeCoordAlgorithms.h
new file mode 100644
index 0000000..0084ee6
--- /dev/null
+++ b/src/terralib/functions/TeCoordAlgorithms.h
@@ -0,0 +1,56 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeCoordAlgorithms.h
+    This file contains some algorithms to deal with geographical coordinates
+*/
+#ifndef  __TERRALIB_INTERNAL_COORDALGORITHMS_H
+#define  __TERRALIB_INTERNAL_COORDALGORITHMS_H
+
+#include <string>
+using namespace std;
+/*! 
+   \fn bool TeLongDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec) 
+   \brief Transform a Longitude Coordinate in degrees, minutes and seconds to decimal degrees
+   \param hem a character that indicates North or South hemisphere
+   \param dg dregrees value
+   \param mn minutes value
+   \param sc seconds value
+   \param grauDec returns the decimal degree value
+   \return TRUE if input is a valid longitude coordinate
+*/
+bool TeLongDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec);
+
+/*! 
+   \fn bool TeLatDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec) 
+   \brief Transform a Latitude Coordinate in degrees, minutes and seconds to decimal degrees
+   \param hem a character that indicates West or East
+   \param dg dregrees value
+   \param mn minutes value
+   \param sc seconds value
+   \param grauDec returns the decimal degree value
+   \return TRUE if input is a valid latitude coordinate
+*/
+bool TeLatDMS2DD(char hem, short& dg, short& mn, float& sc, double& grauDec);
+
+#endif
diff --git a/src/terralib/functions/TeExportDBF.cpp b/src/terralib/functions/TeExportDBF.cpp
new file mode 100644
index 0000000..b3f5027
--- /dev/null
+++ b/src/terralib/functions/TeExportDBF.cpp
@@ -0,0 +1,286 @@
+#include "shapefil.h"
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeDatabase.h"
+
+bool
+TeExportShapefile(TeLayer& layer)
+{
+    DBFHandle	hDBF;
+    SHPHandle	hSHP;
+
+	string filename = layer.name();
+	string indexName = layer.indexName();
+	int nrepres = 0;
+	int rep = 0;
+    int	nShapeType;
+	if (layer.hasGeometry(TePOINTS))
+	{
+		nShapeType = SHPT_POINT;
+		rep = TePOINTS;
+		nrepres++;
+	}
+	if (layer.hasGeometry(TePOLYGONS))
+	{
+		nShapeType = SHPT_POLYGON;
+		rep = TePOLYGONS;
+		nrepres++;
+	}
+	if (layer.hasGeometry(TeLINES))
+	{
+		nShapeType = SHPT_ARC;
+		rep = TeLINES;
+		nrepres++;
+	}
+	if (nrepres == 0 || nrepres>1)
+	{
+		return false;
+	}
+
+	string dbfFilename = filename + ".dbf";
+    hDBF = DBFCreate( dbfFilename.c_str() );
+    if( hDBF == 0 )
+		return false;
+
+	string shpFilename = filename + ".shp";
+    hSHP = SHPCreate( shpFilename.c_str(), nShapeType );
+    if( hSHP == 0 )
+		return false;
+
+	TeDatabasePortal* portalObjs = layer.database()->getPortal();
+	TeDatabasePortal* portalGeoms = layer.database()->getPortal();
+
+	string sql1 = "SELECT * FROM " + layer.attributeTable();
+	if (!portalObjs->query(sql1))
+	{
+		delete portalObjs;
+		delete portalGeoms;
+		return false;
+	}
+
+	int i = portalObjs->numFields();
+	vector<int> fieldsTypes;
+	fieldsTypes.resize(i);
+	i=0;
+	TeAttributeList attList=portalObjs->AttributeList();
+	TeAttributeList::iterator it=attList.begin();
+
+	while ( it != attList.end() )
+    {
+		TeAttribute at = (*it);
+		fieldsTypes[i] = at.rep_.type_;
+
+		if (at.rep_.type_ == TeSTRING )
+		{
+			if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTString, at.rep_.numChar_, 0 ) == -1 )
+			{
+				delete portalObjs;
+				delete portalGeoms;
+				return false;
+			}
+		}
+		else if (at.rep_.type_ == TeDATETIME)
+		{
+			if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTDate, 8, 0 ) == -1 )
+			{
+				delete portalObjs;
+				delete portalGeoms;
+				return false;
+			}
+		}
+		else if (at.rep_.type_ == TeINT)
+		{
+			if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTInteger, 10, 0 ) == -1 )
+			{
+				delete portalObjs;
+				delete portalGeoms;
+				return false;
+			}
+		}
+		else if (at.rep_.type_ == TeREAL)
+			if (DBFAddField( hDBF, at.rep_.name_.c_str(), FTDouble, 10, 5 ) == -1 )
+			{
+				delete portalObjs;
+				delete portalGeoms;
+				return false;
+			}
+		i++;
+		it++;
+	}
+    int iRecord = DBFGetRecordCount( hDBF );
+	string geoid, sql2;
+	bool ok;
+
+    int	 nVertices, nParts, *panParts;
+    double	*padfX, *padfY;
+    SHPObject	*psObject;
+
+	TePointSet pos;
+	TeLineSet lis;
+	TePolygonSet pols;
+	while (portalObjs->fetchRow())
+	{
+		geoid = portalObjs->getData(indexName);
+		nVertices = 0;
+		switch (rep)
+		{
+		case TePOINTS:
+			sql2 = "SELECT * FROM " + layer.tableName(TePOINTS) + " WHERE id='" + geoid + "'";
+			ok = false;
+			if (portalGeoms->query(sql2))
+			{
+				while (portalGeoms->fetchRow())
+				{
+					TePoint point = portalGeoms->getPoint();
+					pos.add(point);
+					ok = true;
+				}
+				portalGeoms->freeResult();
+				nVertices = nParts = pos.size();
+				panParts = (int *) malloc(sizeof(int) * nParts);
+				padfX = (double *) malloc(sizeof(double) * nParts);
+				padfY = (double *) malloc(sizeof(double) * nParts);
+				for (int k=0;k<nParts;k++)
+				{
+					panParts[k] = k;
+					padfX[k] = pos[k].location().x();
+					padfY[k] = pos[k].location().y();
+				}
+				psObject = SHPCreateObject( nShapeType, -1, nParts, panParts, NULL,
+											nVertices, padfX, padfY, NULL, NULL );
+				SHPWriteObject( hSHP, -1, psObject );
+
+				SHPDestroyObject( psObject );
+				free( panParts );
+				free( padfX );
+				free( padfY );
+				pos.clear();
+			}
+			break;
+		case TeLINES:
+			sql2 = "SELECT * FROM " + layer.tableName(TeLINES) + " WHERE id='" + geoid + "'";
+			ok = false;
+			int npoints;
+			if (portalGeoms->query(sql2))
+			{
+				npoints = 0;
+				while (portalGeoms->fetchRow())
+				{
+					TeLine2D line = portalGeoms->getLine();
+					lis.add(line);
+					ok = true;
+					npoints += line.size();
+				}
+				portalGeoms->freeResult();
+				nVertices = lis.size();
+				panParts = (int *) malloc(sizeof(int) * nVertices);
+				padfX = (double *) malloc(sizeof(double) * npoints);
+				padfY = (double *) malloc(sizeof(double) * npoints);
+				
+				int posXY = 0;
+				for (int k=0; k<nVertices; k++)
+				{
+					int lineSize = lis[k].size();
+					panParts[k]=posXY;
+					for (int l=0; l<lineSize; l++ )
+					{
+						padfX[posXY] = lis[k][l].x();
+						padfY[posXY] = lis[k][l].y();
+						posXY++;
+					}
+				}
+				lis.clear();
+				psObject = SHPCreateObject( nShapeType, -1, nVertices, panParts, NULL,
+											posXY, padfX, padfY, NULL, NULL );
+				SHPWriteObject( hSHP, -1, psObject );
+
+				SHPDestroyObject( psObject );
+				free( panParts );
+				free( padfX );
+				free( padfY );
+			}
+			break;
+		case TePOLYGONS:
+			sql2 = "SELECT * FROM " + layer.tableName(TePOLYGONS) + " WHERE id='" + geoid + "'";
+			ok = false;
+			int totpoints;
+			nVertices = 0;
+			if (portalGeoms->query(sql2))
+			{
+				totpoints = 0;
+				while (portalGeoms->fetchRow())
+				{
+					TePolygon poly = portalGeoms->getPolygon();
+					pols.add(poly);
+					ok = true;
+					nVertices += poly.size();
+					for (int n=0; n<poly.size();n++)
+						totpoints += poly[n].size();
+				}
+				portalGeoms->freeResult();
+				panParts = (int *) malloc(sizeof(int) * nVertices);
+				padfX = (double *) malloc(sizeof(double) * totpoints);
+				padfY = (double *) malloc(sizeof(double) * totpoints);
+				
+				int posXY = 0;
+				int npolygons, nrings, npoints, nelem = 0;
+				npolygons = pols.size();
+				for (int k=0; k<npolygons; k++)
+				{
+					nrings = pols[k].size();
+					for (int l=0; l<nrings; l++)
+					{
+						npoints = pols[k][l].size();
+						panParts[nelem]=posXY;
+						for (int m=0; m<npoints; m++ )
+						{
+							padfX[posXY] = pols[k][l][m].x();
+							padfY[posXY] = pols[k][l][m].y();
+							posXY++;
+						}
+						nelem++;
+					}
+				}
+				pols.clear();
+				psObject = SHPCreateObject( nShapeType, -1, nelem, panParts, NULL,
+											posXY, padfX, padfY, NULL, NULL );
+				SHPWriteObject( hSHP, -1, psObject );
+
+				SHPDestroyObject( psObject );
+				free( panParts );
+				free( padfX );
+				free( padfY );
+			}
+			break;
+		}
+		
+		if (!ok)
+			continue;
+
+		for (int j = 0; j < portalObjs->numFields(); j++)
+		{
+			int c = fieldsTypes[j];
+			if ( c == TeSTRING )
+			{
+				DBFWriteStringAttribute(hDBF, iRecord, j, portalObjs->getData(j) );
+			}
+			else if (c == TeINT)
+			{
+				DBFWriteIntegerAttribute(hDBF, iRecord, j, atoi(portalObjs->getData(j)) );
+			}
+			else if (c == TeREAL)
+			{
+				DBFWriteDoubleAttribute(hDBF, iRecord, j, atof(portalObjs->getData(j)) );
+			}
+		}
+		iRecord++;
+	}
+	DBFClose( hDBF );
+    SHPClose( hSHP );
+	delete portalObjs;
+	delete portalGeoms;
+    return true ;
+}
\ No newline at end of file
diff --git a/src/terralib/functions/TeExportMIF.cpp b/src/terralib/functions/TeExportMIF.cpp
new file mode 100644
index 0000000..3b9b238
--- /dev/null
+++ b/src/terralib/functions/TeExportMIF.cpp
@@ -0,0 +1,534 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeImportExport.h"
+#include "TeAsciiFile.h"
+
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeDatabase.h"
+#include "TeGeometryAlgorithms.h"
+
+int TeExportMIFLineSet ( TeAsciiFile& mifFile, TeLineSet& ls);
+int TeExportMIFPointSet ( TeAsciiFile& mifFile, TePointSet& ps, bool isMulti=false);
+int TeExportMIFPolygonSet ( TeAsciiFile& mifFile, TePolygonSet& ps);
+int TeExportMIFCellSet (TeAsciiFile& mifFile, TeCellSet& cells, bool isMulti=false);
+void TeExportMIFProjection ( TeProjection* proj, TeAsciiFile& mifFile);
+void TeExportMIFAttributeList (TeAttributeList& attList, TeAsciiFile& mifFile);
+void TeExportMIFRow(TeTableRow& row, TeAsciiFile& midFile);
+TeProjInfo TeMIFProjectionInfo (const string& projName );
+
+bool
+TeExportMIF( TeLayer* layer, const string& mifFileName, const string& tableName)
+{
+	if (!layer || mifFileName.empty() || tableName.empty())
+		return false;
+
+	// check if layer has the attribute table
+	TeTable tableE;
+	if (!layer->getAttrTablesByName(tableName,tableE))
+		return false;
+
+	// try to get some portals
+	TeDatabasePortal* portalObjs = layer->database()->getPortal();
+	TeDatabasePortal* portalGeoms = layer->database()->getPortal();
+
+	if (!portalObjs || !portalGeoms)
+		return false;
+
+	// check if there is any object
+	string sql1 = "SELECT * FROM " + tableName;
+	if (!portalObjs->query(sql1) || !portalObjs->fetchRow())
+	{
+		delete portalObjs;
+		delete portalGeoms;
+		return false;
+	}
+	clock_t	ti, tf;
+	int count = 0;
+
+	try 
+	{
+		string link = tableE.linkName();
+		TeAsciiFile mifFile ( mifFileName+".MIF", "w+" );
+		TeAsciiFile midFile ( mifFileName+".MID", "w+" );
+		string sql2;
+
+		// write header;
+		mifFile.writeString("Version 300\n");
+		mifFile.writeString("Charset \"WindowsLatin1\" \n");
+		mifFile.writeString("Delimiter \";\"\n");
+		TeProjection* proj = layer->projection();
+		if (proj)
+		{
+			TeBox box = layer->box();
+			char txt[300];
+			sprintf(txt,"Bounds (%.5f, %5f) (%.5f, %5f)\n",box.x1_,box.y1_,box.x2_,box.y2_);
+			if (proj->name() == "NoProjection")
+			{
+				mifFile.writeString("CoordSys Nonearth\n");
+				mifFile.writeString("Units ");
+				mifFile.writeString(proj->units());
+				mifFile.writeNewLine();
+				mifFile.writeString(string(txt));
+			}
+			else if (proj->name() == "LatLong")
+			{
+				mifFile.writeString("CoordSys Earth Projection 1, 0 ");
+				mifFile.writeString(string(txt));
+
+			}
+			else
+			{
+				TeExportMIFProjection(layer->projection(), mifFile);
+				mifFile.writeString(" ");
+				mifFile.writeString(string(txt));
+			}
+		}
+		TeAttributeList attrList = tableE.attributeList();
+		TeExportMIFAttributeList(attrList,mifFile);
+
+		string geoid;
+		TeTableRow row;
+		mifFile.writeString("Data\n");
+
+		if(TeProgress::instance())
+			TeProgress::instance()->setTotalSteps(portalObjs->numRows());
+		ti = clock();
+		// Loop through all objects of the layer
+		do 
+		{
+			geoid = portalObjs->getData(link);
+
+			TePolygonSet	objectPols;		// polygons of the region
+			TeLineSet		objectLines;		// lines of the region
+			TePointSet		objectPoints;	// points of the region
+			TeCellSet		objectCells;	// points of the region
+
+			// check if there is a polygon set geometry
+			bool flag = true;
+			if (layer->hasGeometry(TePOLYGONS))
+			{
+				sql2 = "SELECT * FROM " + layer->tableName(TePOLYGONS) + " WHERE object_id='" + geoid + "'";
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					do
+					{
+						TePolygon poly;
+						flag = portalGeoms->fetchGeometry(poly);
+						objectPols.add(poly);
+					} while (flag);
+				}
+				portalGeoms->freeResult();
+			}
+
+			// check if there is a line set geometry
+			if (layer->hasGeometry(TeLINES))
+			{
+				sql2 = "SELECT * FROM " + layer->tableName(TeLINES) + " WHERE object_id='" + geoid + "'";
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					do
+					{
+						TeLine2D line;
+						flag = portalGeoms->fetchGeometry(line);
+						objectLines.add(line);
+					} while (flag);
+				}
+				portalGeoms->freeResult();
+			}
+
+			// check if there is a point set geometry
+			if (layer->hasGeometry(TePOINTS))
+			{
+				sql2 = "SELECT * FROM " + layer->tableName(TePOINTS) + " WHERE object_id='" + geoid + "'";
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					do
+					{
+						TePoint point;
+						flag = portalGeoms->fetchGeometry(point);
+						objectPoints.add(point);
+					} while (flag);
+				}
+				portalGeoms->freeResult();
+			}
+			// check if there is a point set geometry
+			if (layer->hasGeometry(TeCELLS))
+			{
+				sql2 = "SELECT * FROM " + layer->tableName(TeCELLS) + " WHERE object_id='" + geoid + "'";
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					do
+					{
+						TeCell cell;
+						flag = portalGeoms->fetchGeometry(cell);
+						objectCells.add(cell);
+					} while (flag);
+				}
+				portalGeoms->freeResult();
+			}
+			int col = 0;
+			if (objectPoints.size() > 0)
+				col++;
+			if (objectLines.size() > 0)
+				col++;
+			if (objectPols.size() > 0)
+				col++;
+			if (objectCells.size() > 0)
+				col++;
+
+
+
+			row.clear();	// export attributes
+			for (int j = 0; j < portalObjs->numFields(); j++)
+				row.push_back ( portalObjs->getData (j) );
+			TeExportMIFRow(row,midFile);
+
+			if (col == 0)
+			{
+				mifFile.writeString("NONE\n");
+			}
+			else
+			{
+				if (col > 1)	// it is a collection
+					mifFile.writeString("Collection " + Te2String(col) + "\n");
+
+				if (objectPols.size() > 0)
+					TeExportMIFPolygonSet(mifFile,objectPols);
+
+				if (objectLines.size() > 0)
+					TeExportMIFLineSet(mifFile,objectLines);
+
+				if (objectPoints.size() > 0)
+					TeExportMIFPointSet(mifFile,objectPoints,(col>1));
+
+				if (objectCells.size() > 0)
+					TeExportMIFCellSet(mifFile,objectCells,(col>1));
+				
+				objectCells.clear();
+				objectPols.clear();
+				objectPoints.clear();
+				objectLines.clear();
+			}
+			if (TeProgress::instance())
+			{
+				tf = clock();
+				if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+					TeProgress::instance()->setProgress(count);
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				ti = tf;
+			}
+			count++;
+		} while (portalObjs->fetchRow());
+		delete portalObjs;
+		delete portalGeoms;
+		return true;
+	}
+	catch(...)
+	{
+		if (portalObjs)
+			delete portalObjs;
+		if (portalGeoms)
+			delete portalGeoms;
+		return false;
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+}
+
+void
+TeExportMIFRow(TeTableRow& row, TeAsciiFile& midFile)
+{
+	TeTableRow::iterator it = row.begin();
+	if (it != row.end())
+	{
+		midFile.writeString((*it));
+		++it;
+	}
+
+	while ( it!= row.end())
+	{
+		midFile.writeString(";"+(*it));
+		++it;
+	}
+	midFile.writeNewLine();
+}
+
+void
+TeExportMIFProjection ( TeProjection* proj, TeAsciiFile& mifFile)
+{
+	if (!proj)
+		return ;
+
+	map<string,string> mifProjCode;
+	mifProjCode["LambertConformal"] = "3";
+	mifProjCode["UTM"] = "8";
+	mifProjCode["Albers"] = "9";
+	mifProjCode["Mercator"] = "10";
+	mifProjCode["Miller"] = "11";
+	mifProjCode["Polyconic"] = "27";
+	
+	map<string,string> mifDatumCode;
+	mifDatumCode["Spherical"]="0";
+	mifDatumCode["Astro-Chua"]="23";
+	mifDatumCode["CorregoAlegre"]="24";
+	mifDatumCode["Indian"]="40";
+	mifDatumCode["NAD27"]="62";
+	mifDatumCode["SAD69"]="92";
+	mifDatumCode["WGS84"]="104";
+
+	TeProjInfo pjInfo;
+	try
+	{
+		pjInfo = TeMIFProjectionInfo (proj->name());
+	}
+	catch(...)
+	{
+		return;
+	}
+
+	mifFile.writeString("CoordSys Earth Projection ");
+	mifFile.writeString(mifProjCode[proj->name()]);
+	mifFile.writeString(", " + mifDatumCode[proj->datum().name()]);
+	
+	string mess;
+
+	if (pjInfo.hasUnits)
+		mess = ", " + proj->units();
+		
+	if ( pjInfo.hasLon0 )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess +=  Te2String(proj->lon0()*TeCRD);
+	}
+
+	if ( pjInfo.hasLat0 )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess += Te2String(proj->lat0()*TeCRD);
+	}
+
+	if ( pjInfo.hasStlat1 )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess += Te2String(proj->stLat1()*TeCRD);
+	}
+
+	if ( pjInfo.hasStlat2 )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess += Te2String(proj->stLat2()*TeCRD);
+	}
+
+	if ( pjInfo.hasScale )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess += Te2String(proj->scale());
+	}
+
+	if ( pjInfo.hasOffx )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess += Te2String(proj->offX());
+	}
+
+	if ( pjInfo.hasOffy )
+	{
+		if (!mess.empty())
+			mess += ", ";
+		mess += Te2String(proj->offY());
+	}
+	if (!mess.empty())
+		mifFile.writeString(mess);
+}
+
+void
+TeExportMIFAttributeList (TeAttributeList& attList, TeAsciiFile& mifFile)
+{
+	int n = attList.size();
+	mifFile.writeString("Columns " + Te2String(n));
+	mifFile.writeNewLine();
+
+	TeAttributeList::iterator it = attList.begin();
+	while ( it != attList.end())
+	{
+		TeAttribute att = *it;
+		mifFile.writeString("  "+att.rep_.name_ + " ");
+		if ( att.rep_.type_ == TeINT )
+			mifFile.writeString("Integer");
+		else if ( att.rep_.type_ == TeREAL )
+			mifFile.writeString("Float");
+		else if ( att.rep_.type_ == TeDATETIME )
+			mifFile.writeString("Char(25)"); 
+		else if ( att.rep_.type_ == TeSTRING )
+			mifFile.writeString("Char(" + Te2String(att.rep_.numChar_) + ")"); 
+		mifFile.writeNewLine();
+		++it;
+	}
+}
+
+
+int
+TeExportMIFLineSet (TeAsciiFile& mifFile, TeLineSet& lines)
+{
+	if (lines.size() == 0)
+		return 0;
+	
+	mifFile.writeString("Pline ");
+	char aux[100];
+	int n = lines.size();
+	if (n > 1)
+	{
+		sprintf(aux,"Multiple %d\n",n);
+		mifFile.writeString(string(aux));
+	}
+	for ( int i = 0; i < n; i++ )
+	{
+		TeLine2D line = lines[i];
+		sprintf(aux,"%d\n",line.size());
+		mifFile.writeString(string(aux));
+		for (unsigned int k = 0; k < line.size(); k++ )
+		{
+			sprintf(aux,"%.6f  %.6f \n", line[k].x(),line[k].y());
+			mifFile.writeString(string(aux));
+		}
+	}
+	return lines.size();
+}
+
+int 
+TeExportMIFPointSet (TeAsciiFile& mifFile, TePointSet& points, bool isMulti)
+{
+	if ( points.size() == 0 ) // layer has points
+		return 0;
+
+	int n = points.size();
+	char aux[50];
+	if (n == 1)
+	{
+		if (isMulti)
+			mifFile.writeString("Multipoint 1\n");
+		else
+			mifFile.writeString("Point ");
+		TePoint pt = points [0];
+		TeCoord2D xy = pt.location();
+		sprintf(aux,"%.6f  %.6f \n", xy.x(), xy.y());
+		mifFile.writeString(string(aux));
+	}
+	else
+	{
+		mifFile.writeString("Multipoint ");
+		sprintf(aux,"%d\n",n);
+		mifFile.writeString(string(aux));
+		unsigned int i;
+		for ( i = 0; i < points.size(); i++ )
+		{
+			TePoint pt = points [i];
+			TeCoord2D xy = pt.location();
+			sprintf(aux,"%.6f  %.6f \n", xy.x(), xy.y());
+			mifFile.writeString(string(aux));
+		}
+	}
+	return points.size();
+}
+ 
+int
+TeExportMIFPolygonSet (TeAsciiFile& mifFile, TePolygonSet& polygons)
+{
+	if (polygons.size() == 0)
+		return 0;
+	char aux[50];
+	sprintf(aux,"Region %d\n",polygons.size());
+	mifFile.writeString(string(aux));
+	unsigned int i;
+	for (i = 0; i < polygons.size(); i++ )
+	{
+		TePolygon poly = polygons[i];
+		unsigned int k;
+		for (k = 0; k < poly.size(); k++ )
+		{
+			TeLinearRing ring = poly[k]; 
+			sprintf(aux,"%d\n",ring.size());
+			mifFile.writeString(string(aux));
+			unsigned int l;
+			for (l = 0 ; l < ring.size(); l++)
+			{
+				sprintf(aux,"%.6f  %.6f \n", ring[l].x(), ring[l].y());
+				mifFile.writeString(string(aux));
+			}
+		}
+	}
+	return polygons.size();
+}
+
+int
+TeExportMIFCellSet (TeAsciiFile& mifFile, TeCellSet& cells, bool isColl)
+{
+	if (cells.size() == 0)
+		return 0;
+	char aux[250];
+
+	if (cells.size() > 1 || isColl)
+	{
+		sprintf(aux,"Region %d\n",cells.size());
+		mifFile.writeString(string(aux));
+		unsigned int i;
+		for (i = 0; i < cells.size(); i++ )
+		{
+			TeCell cell = cells[i];
+			TeCoord2D ll = cell.box().lowerLeft();
+			TeCoord2D ur = cell.box().upperRight();
+			mifFile.writeString("5");
+			sprintf(aux,"%.6f  %.6f \n", ll.x(), ll.y());
+			mifFile.writeString(string(aux));
+			sprintf(aux,"%.6f  %.6f \n", ur.x(), ll.y());
+			mifFile.writeString(string(aux));
+			sprintf(aux,"%.6f  %.6f \n", ur.x(), ur.y());
+			mifFile.writeString(string(aux));
+			sprintf(aux,"%.6f  %.6f \n", ll.x(), ur.y());
+			mifFile.writeString(string(aux));
+			sprintf(aux,"%.6f  %.6f \n", ll.x(), ll.y());
+			mifFile.writeString(string(aux));
+		}
+		return cells.size();
+	}
+	else
+	{
+		sprintf(aux,"Rect %.6f  %.6f %.6f  %.6f\n",
+				cells[0].box().lowerLeft().x(), cells[0].box().lowerLeft().y(),
+				cells[0].box().upperRight().x(), cells[0].box().upperRight().y());
+		mifFile.writeString(string(aux));
+		return 1;
+	}
+}
diff --git a/src/terralib/functions/TeExportSHP.cpp b/src/terralib/functions/TeExportSHP.cpp
new file mode 100644
index 0000000..e10373a
--- /dev/null
+++ b/src/terralib/functions/TeExportSHP.cpp
@@ -0,0 +1,443 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "shapefil.h"
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeDatabase.h"
+#include <vector>
+
+
+DBFHandle TeCreateDBFFile (const string& dbfFilename, TeAttributeList& attList)
+{
+	DBFHandle hDBF = DBFCreate( dbfFilename.c_str() );
+	if( hDBF == 0 )
+		return 0;
+	
+	int i =0;
+	TeAttributeList::iterator it=attList.begin();
+
+	while ( it != attList.end() )
+	{
+		TeAttribute at = (*it);
+		string atName = at.rep_.name_;
+
+		if (atName.size() > 10)
+		{
+			int extra = (int)(atName.size() - 10)/2;
+			int middle = (int)(atName.size()/2);
+			string str = atName.substr(0,middle-extra-1);
+			str += atName.substr(middle+extra);
+			atName = str;
+		}
+
+		if (at.rep_.type_ == TeSTRING )
+		{
+			if (DBFAddField( hDBF, atName.c_str(), FTString, at.rep_.numChar_, 0 ) == -1 )
+				return 0;
+		}
+		else if (at.rep_.type_ == TeINT)
+		{
+			if (DBFAddField( hDBF, atName.c_str(), FTInteger, 10, 0 ) == -1 )
+				return 0;
+		}
+		else if (at.rep_.type_ == TeREAL)
+		{
+			if (DBFAddField( hDBF, atName.c_str(), FTDouble, 10, 5 ) == -1 )
+				return 0;
+		}
+		// OBS: shapelib doesn�t deal with xBase field type for Date 
+		// we are transforming it to string
+		else if (at.rep_.type_ == TeDATETIME)
+		{
+			if (DBFAddField( hDBF, atName.c_str(), FTDate, 8, 0 ) == -1 )
+				return 0;
+		}
+		++i;
+		++it;
+	}
+	return hDBF;
+}
+
+bool
+TeExportShapefile(TeLayer* layer, const string& shpFileName, const string& tableName)
+{
+  	if (!layer || shpFileName.empty() || tableName.empty())
+		return false;
+
+	// check if layer has the attribute table
+	TeTable tableE;
+	if (!layer->getAttrTablesByName(tableName,tableE))
+		return false;
+	string linkName = tableE.linkName();
+
+	TeDatabasePortal* portalObjs = layer->database()->getPortal();
+	if (!portalObjs)
+		return false;
+
+	vector<int> reps;
+	if (layer->hasGeometry(TePOINTS))
+		reps.push_back(SHPT_POINT);
+
+	if (layer->hasGeometry(TePOLYGONS) || layer->hasGeometry(TeCELLS) )
+		reps.push_back(SHPT_POLYGON);
+
+	if (layer->hasGeometry(TeLINES))
+		reps.push_back(SHPT_ARC);
+
+	if (reps.empty())
+	{
+		delete portalObjs;
+		return false;	// there are no geometrical representations
+	}
+
+	DBFHandle	hDBF;
+    SHPHandle	hSHP;
+
+	for (unsigned int i=0; i<reps.size(); i++)
+	{
+		string sql1 = "SELECT * FROM " + tableName;
+		if (!portalObjs->query(sql1) || !portalObjs->fetchRow())
+		{
+			delete portalObjs;
+			return false;
+		}
+		
+		string dbfFilename;
+		string shpFilename;
+		int nShapeType = reps[i];
+		switch (nShapeType)
+		{
+		case SHPT_POINT:
+			dbfFilename = shpFileName + "_point.dbf";
+			shpFilename = shpFileName + "_point.shp";
+			break;
+		case SHPT_POLYGON:
+			dbfFilename = shpFileName + "_pol.dbf";
+			shpFilename = shpFileName + "_pol.shp";
+			break;
+		case SHPT_ARC:
+			dbfFilename = shpFileName + "_lin.dbf";
+			shpFilename = shpFileName + "_lin.shp";
+		}
+
+		// create files
+		hSHP = SHPCreate( shpFilename.c_str(), nShapeType );
+		if( hSHP == 0 )
+		{
+			delete portalObjs;
+			return false;
+		}
+
+		TeAttributeList attList = portalObjs->AttributeList();
+		hDBF = TeCreateDBFFile(dbfFilename, attList);
+		if( hDBF == 0 )
+		{
+			delete portalObjs; 
+			return false;
+		}
+
+		TeDatabasePortal* portalGeoms = layer->database()->getPortal();
+		if (!portalGeoms)
+		{
+			delete portalObjs;
+			return false;
+		}
+
+		int count = 0;
+		if(TeProgress::instance())
+			TeProgress::instance()->setTotalSteps(portalObjs->numRows());
+		clock_t	ti, tf;
+
+		int iRecord = 0;
+		string geoid, sql2;
+		bool ok;
+		int	 nVertices, nParts, *panParts;
+		double	*padfX, *padfY;
+		SHPObject	*psObject;
+		int shpRes = 0;
+		ti = clock();
+		do 
+		{
+			geoid = portalObjs->getData(linkName);
+			nVertices = 0;
+			bool flag = true;
+			TePointSet pos;
+			TeLineSet lis;
+			TePolygonSet pols;
+			TeCellSet cells;
+			switch (nShapeType)
+			{
+			case SHPT_POINT:		// create a shapefile of points
+				sql2 = "SELECT * FROM " + layer->tableName(TePOINTS) + " WHERE object_id='" + geoid + "'";
+				ok = false;			
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					do 
+					{
+						TePoint point;
+						flag  = portalGeoms->fetchGeometry(point);
+						pos.add(point);
+						ok = true;
+					} while (flag);
+					nVertices = nParts = pos.size();
+					panParts = (int *) malloc(sizeof(int) * nParts);
+					padfX = (double *) malloc(sizeof(double) * nParts);
+					padfY = (double *) malloc(sizeof(double) * nParts);
+					for (int k=0;k<nParts;k++)
+					{
+						panParts[k] = k;
+						padfX[k] = pos[k].location().x();
+						padfY[k] = pos[k].location().y();
+					}
+					psObject = SHPCreateObject( nShapeType, -1, nParts, panParts, NULL,
+												nVertices, padfX, padfY, NULL, NULL );
+					shpRes = SHPWriteObject( hSHP, -1, psObject );
+					SHPDestroyObject( psObject );
+					free( panParts );
+					free( padfX );
+					free( padfY );
+					pos.clear();
+				}
+				portalGeoms->freeResult();
+				break;  
+			case SHPT_ARC:	// create a shapefile of lines
+				sql2 = "SELECT * FROM " + layer->tableName(TeLINES) + " WHERE object_id='" + geoid + "'";
+				ok = false;
+				int npoints;
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					npoints = 0;
+					do
+					{
+						TeLine2D line;
+						flag = portalGeoms->fetchGeometry(line);
+						lis.add(line);
+						ok = true;
+						npoints += line.size();
+					} while (flag);
+					nVertices = lis.size();
+					panParts = (int *) malloc(sizeof(int) * nVertices);
+					padfX = (double *) malloc(sizeof(double) * npoints);
+					padfY = (double *) malloc(sizeof(double) * npoints);
+					int posXY = 0;
+					for (int k=0; k<nVertices; k++)
+					{
+						int lineSize = lis[k].size();
+						panParts[k]=posXY;
+						for (int l=0; l<lineSize; l++ )
+						{
+							padfX[posXY] = lis[k][l].x();
+							padfY[posXY] = lis[k][l].y();
+							posXY++;
+						}
+					}
+					lis.clear();
+					psObject = SHPCreateObject( nShapeType, -1, nVertices, panParts, NULL,
+												posXY, padfX, padfY, NULL, NULL );
+					SHPWriteObject( hSHP, -1, psObject );
+					SHPDestroyObject( psObject );
+					free( panParts );
+					free( padfX );
+					free( padfY );
+				}
+				portalGeoms->freeResult();
+				break;
+			case SHPT_POLYGON: // create a shapefile of polygons
+				sql2 = "SELECT * FROM " + layer->tableName(TePOLYGONS) + " WHERE object_id='" + geoid + "'";
+				ok = false;
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					int totpoints;
+					nVertices = 0;
+					totpoints = 0;
+					do
+					{
+						TePolygon poly;
+						flag = portalGeoms->fetchGeometry(poly);
+						pols.add(poly);
+						ok = true;
+						nVertices += poly.size();
+						unsigned int n;
+						for (n=0; n<poly.size();n++)
+							totpoints += poly[n].size();
+					} while (flag);
+					panParts = (int *) malloc(sizeof(int) * nVertices);
+					padfX = (double *) malloc(sizeof(double) * totpoints);
+					padfY = (double *) malloc(sizeof(double) * totpoints);
+					
+					int posXY = 0;
+					int npolygons, nrings, npoints, nelem = 0;
+					npolygons = pols.size();
+					for (int k=0; k<npolygons; k++)
+					{
+						nrings = pols[k].size();
+
+						for (int l=0; l<nrings; ++l)
+						{
+							if (l==0)
+							{
+								if (TeOrientation(pols[k][l]) == TeCOUNTERCLOCKWISE)
+									TeReverseLine(pols[k][l]);
+							}
+							else
+							{
+								if (TeOrientation(pols[k][l]) == TeCLOCKWISE)
+									TeReverseLine(pols[k][l]);
+
+							}
+							
+							npoints = pols[k][l].size();
+							panParts[nelem]=posXY;
+							for (int m=0; m<npoints; m++ )
+							{
+								padfX[posXY] = pols[k][l][m].x();
+								padfY[posXY] = pols[k][l][m].y();
+								posXY++;
+							}
+							nelem++;
+						}
+					}
+					pols.clear();
+					psObject = SHPCreateObject( nShapeType, -1, nelem, panParts, NULL,
+												posXY, padfX, padfY, NULL, NULL );
+					shpRes = SHPWriteObject( hSHP, -1, psObject );
+					SHPDestroyObject( psObject );
+					free( panParts );
+					free( padfX );
+					free( padfY );
+				}
+				portalGeoms->freeResult();
+
+				// --- Cells are exported as polygons
+
+				sql2 = "SELECT * FROM " + layer->tableName(TeCELLS) + " WHERE object_id='" + geoid + "'";
+				if (portalGeoms->query(sql2) && portalGeoms->fetchRow())
+				{
+					int totpoints;
+					nVertices = 0;
+					totpoints = 0;
+					do
+					{
+						TeCell cell;
+						flag = portalGeoms->fetchGeometry(cell);
+						cells.add(cell);
+						ok = true;
+						nVertices += 1;
+						totpoints += 5;
+					} while (flag);
+					panParts = (int *) malloc(sizeof(int) * nVertices);
+					padfX = (double *) malloc(sizeof(double) * totpoints);
+					padfY = (double *) malloc(sizeof(double) * totpoints);
+					
+					int posXY = 0;
+					int ncells, nelem = 0;
+					ncells = cells.size();
+					for (int k=0; k<ncells; k++)
+					{
+						panParts[nelem]=posXY;
+						TeCell cell = cells[k];
+						TeCoord2D ll = cell.box().lowerLeft();
+						TeCoord2D ur = cell.box().upperRight();
+						padfX[posXY] = ll.x();
+						padfY[posXY] = ll.y();
+						posXY++;		
+						padfX[posXY] = ur.x();
+						padfY[posXY] = ll.y();
+						posXY++;		
+						padfX[posXY] = ur.x();
+						padfY[posXY] = ur.y();
+						posXY++;		
+						padfX[posXY] = ll.x();
+						padfY[posXY] = ur.y();
+						posXY++;		
+						padfX[posXY] = ll.x();
+						padfY[posXY] = ll.y();
+						posXY++;	
+						nelem++;
+					}
+					cells.clear();
+					psObject = SHPCreateObject( nShapeType, -1, nelem, panParts, NULL,
+												posXY, padfX, padfY, NULL, NULL );
+					SHPWriteObject( hSHP, -1, psObject );
+					SHPDestroyObject( psObject );
+					free( panParts );
+					free( padfX );
+					free( padfY );
+				}
+				portalGeoms->freeResult();
+			} // end - case geometry representation
+		
+			if (!ok)	// no geometry associated to this object
+				continue;
+
+			// write attributes
+			for (int j = 0; j < portalObjs->numFields(); j++)
+			{
+				int c = attList[j].rep_.type_;
+				if (c == TeSTRING)
+				{
+					DBFWriteStringAttribute(hDBF, iRecord, j, portalObjs->getData(j) );
+				}
+				else if (c == TeDATETIME)
+				{
+					TeTime time = portalObjs->getDate(j);
+					char dd[8];
+					sprintf(dd,"%04d%02d%02d",time.year(),time.month(),time.day());
+					DBFWriteDateAttribute(hDBF, iRecord, j, dd );
+				}
+				else if (c == TeINT)
+				{
+					DBFWriteIntegerAttribute(hDBF, iRecord, j, portalObjs->getInt(j) );
+				}
+				else if (c == TeREAL)
+				{
+					DBFWriteDoubleAttribute(hDBF, iRecord, j, portalObjs->getDouble(j));
+				}
+			}
+			iRecord++;
+			count++;
+			if (TeProgress::instance())
+			{
+				tf = clock();
+				if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+					TeProgress::instance()->setProgress(count);
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				ti = tf;
+			}
+		} while (portalObjs->fetchRow()); // end - for every object
+		DBFClose( hDBF );
+		SHPClose( hSHP );
+		portalObjs->freeResult();
+		delete portalGeoms;
+	} // end - for each representation
+	delete portalObjs;
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+    return true ;
+}
+
diff --git a/src/terralib/functions/TeExportSPR.cpp b/src/terralib/functions/TeExportSPR.cpp
new file mode 100644
index 0000000..5b6293c
--- /dev/null
+++ b/src/terralib/functions/TeExportSPR.cpp
@@ -0,0 +1,807 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeImportExport.h"
+#include "TeSPRFile.h"
+
+#include "TeDataTypes.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+#include <time.h>
+
+// --- Spring
+
+bool TeExportSPRMNTData			( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attrQuoteName );
+bool TeExportSPRThematicData	( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attThemeName );
+bool TeExportSPRNetworkData		( TeLayer* layer, const string& sprFileName, const string& objName);
+bool TeExportSPRCadastralData	( TeLayer* layer, const string& sprFileName, const string& objName);
+bool TeExportSPRTable			(TeLayer* layer, const string& sprFileName, const string& tabName, const string& objName,TeSpringModels cat);
+
+bool
+TeExportSPR (TeLayer* layer, const string& sprFileName, const string& tableName, TeSpringModels cat, const string& name)
+{
+	if (tableName.empty() || sprFileName.empty())
+		return false;
+	switch (cat) 
+	{
+	case TeSPRMNT:
+		return TeExportSPRMNTData(layer,sprFileName,tableName, name);
+	case TeSPRThematic:
+		return TeExportSPRThematicData(layer,sprFileName,tableName,name);
+	case TeSPRNetwork:
+		if (TeExportSPRNetworkData(layer,sprFileName,name))
+			return TeExportSPRTable (layer,sprFileName,tableName,name,TeSPRNetwork);
+	default:
+		if (TeExportSPRCadastralData(layer,sprFileName,name))
+			return TeExportSPRTable (layer,sprFileName,tableName,name,TeSPRCadastral);
+	}
+	return false;
+}
+
+bool TeExportSPRMNTData( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attrQuoteName )
+{
+	clock_t	ti, tf;
+	int count;
+	TeDatabasePortal* portal = 0;
+	try{
+		
+		TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+
+		if (attrQuoteName.empty() || tabName.empty())
+			return false;
+
+		if (!(layer->hasGeometry(TePOINTS) || 
+			layer->hasGeometry(TeLINES)))
+			return false;
+
+		// check if layer has the attribute table
+		TeTable tableE;
+		if (!layer->getAttrTablesByName(tabName,tableE))
+			return false;
+		string linkName = tableE.linkName();
+		if (linkName.empty())
+			return false;
+
+		TeDatabasePortal* portal = layer->database()->getPortal();
+		if (!portal)
+			return false;
+
+		// DTM/Network data can have POINTS 3D or contour line 3D, so the
+		// header SAMPLE should be written only once 
+		sprFile.writeSampleHeader();
+		if ( layer->projection() )
+			sprFile.writeProjection ( layer->projection() );
+		sprFile.writeBox ( layer->box() );
+		sprFile.writeInfoEnd();
+
+		string sql = "SELECT attT." + attrQuoteName + ", geoT.* FROM " + tabName + " attT, ";
+		bool flag = true;
+		if (layer->hasGeometry(TeLINES))
+		{
+			sql += layer->tableName(TeLINES) + " geoT ";
+			sql += " WHERE attT." + linkName + "= geoT.object_id";
+			if (portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				count = 0;
+				do 
+				{
+					TeLine2D line;
+					double quote = portal->getDouble(0);
+					flag = portal->fetchGeometry(line);
+					if (!line.empty())
+					{	
+						sprFile.writeLine3DHeader();
+						sprFile.writeSampleQuote( quote );
+						for (unsigned int k=0; k<line.size(); k++ )
+							sprFile.writePoint ( line[k] );
+						sprFile.writeEnd();
+					}
+					count++;
+					if (TeProgress::instance())
+					{
+						tf = clock();
+						if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+							TeProgress::instance()->setProgress(count);
+						if (TeProgress::instance()->wasCancelled())
+							break;
+						ti = tf;
+					}
+				} while(flag);
+				if (count)
+					sprFile.writeEnd();
+			}
+			portal->freeResult();
+		}
+		if (layer->hasGeometry(TePOINTS))
+		{
+			sql += layer->tableName(TePOINTS) + " geoT ";
+			sql += " WHERE attT." + linkName + "= geoT.object_id";
+			if (portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				count = 0;
+				do 
+				{
+					TePoint xy;
+					if (count == 0)
+						sprFile.writePoint3DHeader();
+
+					double quote = portal->getDouble(0);
+					flag = portal->fetchGeometry(xy);
+
+					sprFile.writePoint3D( xy.location().x(), xy.location().y(), quote );
+					count++;
+					if (TeProgress::instance())
+					{
+						tf = clock();
+						if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+							TeProgress::instance()->setProgress(count);
+						if (TeProgress::instance()->wasCancelled())
+							break;
+						ti = tf;
+					}
+				} while (flag);
+				if (count)
+					sprFile.writeEnd();
+			}
+		}
+		delete portal;
+		return true;
+	}
+	catch(...)
+	{
+		if (portal)
+			delete portal;
+		return false;
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+}
+
+bool TeExportSPRThematicData( TeLayer* layer, const string& sprFileName, const string& tabName, const string& attThemeName )
+{
+	if (attThemeName.empty() || tabName.empty())
+		return false;
+
+	if (!layer || !(layer->hasGeometry(TePOINTS) || layer->hasGeometry(TeLINES) || 
+		            layer->hasGeometry(TePOLYGONS) || layer->hasGeometry(TeCELLS)))
+		return false;
+
+	// check if layer has the attribute table
+	TeTable tableE;
+	if (!layer->getAttrTablesByName(tabName,tableE))
+		return false;
+	string linkName = tableE.linkName();
+	if (linkName.empty())
+		return false;
+
+	TeDatabasePortal* portal=0;
+	clock_t	ti, tf;
+	int count;
+
+	try{
+		portal = layer->database()->getPortal();
+		if (!portal)
+			return false;
+		TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+		
+		unsigned int k;
+		bool flag = true;
+		
+		string sql = "SELECT attT." + attThemeName + ", geoT.* FROM " + tabName + " attT, ";
+		if (layer->hasGeometry(TePOINTS))
+		{
+			sql += layer->tableName(TePOINTS) + " geoT ";
+			sql += " WHERE attT." + linkName + "= geoT.object_id";
+			if(portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				count = 0;
+				do 
+				{
+					if (count==0)
+					{
+						sprFile.writePointsHeader ( );
+						sprFile.writeProjection ( layer->projection() );
+						sprFile.writeBox ( layer->box() );
+						sprFile.writeInfoEnd();
+					}
+					string theme = portal->getData(attThemeName);
+					TePoint xy;
+					flag = portal->fetchGeometry(xy);
+					sprFile.writeThematicPoint(xy.location().x(), xy.location().y(), theme );
+					count++;
+					if (TeProgress::instance())
+					{
+						tf = clock();
+						if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+							TeProgress::instance()->setProgress(count);
+						if (TeProgress::instance()->wasCancelled())
+							break;
+						ti = tf;
+					}
+				} while (flag);
+			}
+			portal->freeResult();
+			if (count)
+				sprFile.writeEnd();
+		}
+		if (!layer->hasGeometry(TeLINES) && !layer->hasGeometry(TePOLYGONS) && !layer->hasGeometry(TeCELLS))
+		{
+			delete portal;
+			sprFile.writeEnd();
+			return true;
+		}
+		count = 0;
+		TeSPRFile labelFile(sprFileName+"_LAB.spr", "w+");
+		if (layer->hasGeometry(TeLINES))
+		{
+			sql += layer->tableName(TeLINES) + " geoT ";
+			sql += " WHERE attT." + linkName + "= geoT.object_id";
+			if (portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				count = 0;
+				do{
+					string theme = portal->getData(0);
+					TeLine2D line;
+					flag = portal->fetchGeometry(line);
+					if (!line.empty())
+					{
+						if (count == 0)
+						{
+							sprFile.writeLinesHeader ( );
+							if ( layer->projection() )
+								sprFile.writeProjection ( layer->projection() );
+							sprFile.writeBox ( layer->box() );
+							sprFile.writeInfoEnd();
+							labelFile.writeLabelHeader(TeSPRThematic);
+						}
+
+						for (k=0; k<line.size(); k++ )
+							sprFile.writePoint ( line[k] );
+						sprFile.writeEnd();
+						TeCoord2D pt = TeFindCentroid( line );
+						labelFile.writeThematicLabel(pt.x(), pt.y(),theme);
+						count++;
+						if (TeProgress::instance())
+						{
+							tf = clock();
+							if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+								TeProgress::instance()->setProgress(count);
+							if (TeProgress::instance()->wasCancelled())
+								break;
+							ti = tf;
+						}
+					}
+				} while (flag);
+			}
+			portal->freeResult();
+		}
+
+		if (layer->hasGeometry(TePOLYGONS))
+		{
+			sql += layer->tableName(TePOLYGONS) + " geoT ";
+			sql += " WHERE attT." + linkName + "= geoT.object_id";
+			if (portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				count = 0;
+				do 
+				{
+					string theme = portal->getData(0);
+					TePolygon poly;
+					flag = portal->fetchGeometry(poly);
+					if (!poly.empty())
+					{
+						if (count == 0)
+						{
+							sprFile.writeLinesHeader ( );
+							if ( layer->projection() )
+								sprFile.writeProjection ( layer->projection() );
+							sprFile.writeBox ( layer->box() );
+							sprFile.writeInfoEnd();
+							labelFile.writeLabelHeader(TeSPRThematic);
+						}
+						for (k = 0; k < poly.size(); k++ )
+						{
+							TeLinearRing ring = poly[k]; 
+							
+							for (unsigned int l = 0 ; l < ring.size(); l++)
+								sprFile.writePoint ( ring[l] );
+							sprFile.writeEnd();
+						}
+
+						TeCoord2D pt = TeFindCentroid( poly );
+						labelFile.writeThematicLabel(pt.x(), pt.y(),theme);
+						count++;
+						if (TeProgress::instance())
+						{
+							tf = clock();
+							if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+								TeProgress::instance()->setProgress(count);
+							if (TeProgress::instance()->wasCancelled())
+								break;
+							ti = tf;
+						}
+					}
+				} while (flag);
+			}
+			portal->freeResult();
+		}
+
+		if (layer->hasGeometry(TeCELLS))
+		{
+			sql += layer->tableName(TeCELLS) + " geoT ";
+			sql += " WHERE attT." + linkName + "= geoT.object_id";
+			if (portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				count = 0;
+				do 
+				{
+					string theme = portal->getData(0);
+					TeCell cell;
+					flag = portal->fetchGeometry(cell);
+					if (count == 0)
+					{
+						sprFile.writeLinesHeader ( );
+						if ( layer->projection() )
+							sprFile.writeProjection ( layer->projection() );
+						sprFile.writeBox ( layer->box() );
+						sprFile.writeInfoEnd();
+						labelFile.writeLabelHeader(TeSPRThematic);
+					}
+					TeCoord2D ll = cell.box().lowerLeft();
+					TeCoord2D ur = cell.box().upperRight();
+					sprFile.writePoint (ll);
+                    TeCoord2D p1(ur.x(), ll.y());
+					sprFile.writePoint (p1);
+					sprFile.writePoint (ur);
+                    TeCoord2D p2(ll.x(),ur.y());                   
+					sprFile.writePoint (p2);
+					sprFile.writePoint (ll);
+					sprFile.writeEnd();
+					TeCoord2D pt = TeFindCentroid(cell);
+					labelFile.writeThematicLabel(pt.x(), pt.y(),theme);
+					count++;
+					if (TeProgress::instance())
+					{
+						tf = clock();
+						if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+							TeProgress::instance()->setProgress(count);
+						if (TeProgress::instance()->wasCancelled())
+							break;
+						ti = tf;
+					}
+				} while (flag);
+			}
+			portal->freeResult();
+		}
+		sprFile.writeEnd();
+		labelFile.writeEnd();
+		delete portal;
+		return true;
+	}
+	catch(...)
+	{
+		if (portal)
+			delete portal;
+		return false;
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+}
+
+
+bool TeExportSPRNetworkData(TeLayer* layer, const string& sprFileName, const string& objName)
+{
+	if (!layer || !(layer->hasGeometry(TePOINTS) || layer->hasGeometry(TeLINES)) )
+		return false;
+
+	TeDatabasePortal* portal = layer->database()->getPortal();
+	if (!portal)
+		return false;
+	clock_t	ti,tf;
+	int count;
+
+	try{
+		TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+		sprFile.writeNetworkHeader();
+		if ( layer->projection() )
+			sprFile.writeProjection ( layer->projection() );
+		sprFile.writeBox ( layer->box() );
+		sprFile.writeInfoEnd();
+		bool flag;	;
+		if (layer->hasGeometry(TeLINES))
+		{
+			string sql = "SELECT * FROM " + layer->tableName(TeLINES);
+			if (portal->query(sql) && portal->fetchRow())
+			{		
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				TeSPRFile labelFile(sprFileName+"_LAB.spr", "w+");
+				do 
+				{
+					TeLine2D line;
+					string objid = portal->getData("object_id");
+					flag = portal->fetchGeometry(line);
+					if (!line.empty())
+					{
+						sprFile.writeNetworkLineHeader(count++);
+						unsigned int k;
+						for (k=0; k<line.size(); k++ )
+							sprFile.writePoint ( line[k] );
+						sprFile.writeEnd();
+						if (count==0)
+							labelFile.writeLabelHeader(TeSPRNetwork);
+						TeCoord2D pt = TeFindCentroid( line );
+						labelFile.writeNetworkLabel(objid,pt.x(), pt.y(),objName);
+						count++;
+					}
+					count++;
+					if (TeProgress::instance())
+					{
+						tf = clock();
+						if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+							TeProgress::instance()->setProgress(count);
+						if (TeProgress::instance()->wasCancelled())
+							break;
+						ti = tf;
+					}
+				}while (flag);
+				if (count>0)
+				{
+					sprFile.writeEnd();	 
+					labelFile.writeEnd();
+				}			
+			}
+			portal->freeResult();
+		}
+	}
+	catch (...)
+	{
+		delete portal;
+		return false;
+	}
+	delete portal;
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+bool TeExportSPRCadastralData( TeLayer* layer, const string& sprFileName, const string& objName)
+{
+	if (!layer || !(layer->hasGeometry(TePOINTS) || layer->hasGeometry(TeLINES) || 
+					layer->hasGeometry(TePOLYGONS) || layer->hasGeometry(TeCELLS)))
+		return false;
+
+	TeDatabasePortal* portal= layer->database()->getPortal();
+	if (!portal)
+		return false;
+	bool flag;
+	clock_t	ti, tf;
+	int count = 0;
+	unsigned int k;
+	try {
+		
+		TeSPRFile sprFile ( sprFileName+".spr", "w+" );
+		if (layer->hasGeometry(TePOINTS))
+		{
+			string sql = "SELECT * FROM " + layer->tableName(TePOINTS);
+			if (portal->query(sql) && portal->fetchRow())
+			{
+				if(TeProgress::instance())
+					TeProgress::instance()->setTotalSteps(portal->numRows());
+				ti = clock();
+				do
+				{
+					if (count==0)
+					{
+						sprFile.writePointsHeader ( );
+						sprFile.writeProjection ( layer->projection() );
+						sprFile.writeBox ( layer->box() );
+						sprFile.writeInfoEnd();
+					}
+					string objid = portal->getData("object_id");
+					TePoint xy;
+					flag = portal->fetchGeometry(xy);
+					sprFile.writeCadastralLabel(objid,xy.location().x(), xy.location().y(),objName);
+					count++;
+					if (TeProgress::instance())
+					{
+						tf = clock();
+						if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+							TeProgress::instance()->setProgress(count);
+						if (TeProgress::instance()->wasCancelled())
+							break;
+						ti = tf;
+					}
+				} while (flag);
+				if (count)
+					sprFile.writeEnd();
+			}
+			portal->freeResult();
+		}
+
+		count = 0;
+		// if layer has lines, polygons or cells there should be one more file with labels
+		if (layer->hasGeometry(TeLINES) || layer->hasGeometry(TePOLYGONS)|| layer->hasGeometry(TeCELLS))
+		{
+			TeSPRFile labelFile(sprFileName+"_LAB.spr", "w+");
+			if (layer->hasGeometry(TeLINES))
+			{
+				string sql = "SELECT * FROM " + layer->tableName(TeLINES);
+				if (portal->query(sql) && portal->fetchRow())
+				{
+					if(TeProgress::instance())
+						TeProgress::instance()->setTotalSteps(portal->numRows());
+					ti = clock();
+					do 
+					{
+						string objid = portal->getData("object_id");
+						TeLine2D line;
+						flag = portal->fetchGeometry(line);
+						if (!line.empty())
+						{
+							if (count == 0)
+							{
+								sprFile.writeLinesHeader ( );
+								if ( layer->projection() )
+									sprFile.writeProjection ( layer->projection() );
+								sprFile.writeBox ( layer->box() );
+								sprFile.writeInfoEnd();
+								labelFile.writeLabelHeader(TeSPRCadastral);
+							}
+							for (k=0; k<line.size(); k++ )
+								sprFile.writePoint ( line[k] );
+							sprFile.writeEnd();
+							TeCoord2D xy = TeFindCentroid( line );
+							labelFile.writeCadastralLabel(objid,xy.x(), xy.y(),objName);
+						} // end - polygon is not empty
+						count++;
+						if (TeProgress::instance())
+						{
+							tf = clock();
+							if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+								TeProgress::instance()->setProgress(count);
+							if (TeProgress::instance()->wasCancelled())
+								break;
+							ti = tf;
+						}
+					} while (flag); // end - for every record
+				} // end - if there is any record
+			} // end - if has lines
+			portal->freeResult();
+			if (layer->hasGeometry(TePOLYGONS))
+			{
+				string sql = "SELECT * FROM " + layer->tableName(TePOLYGONS);
+				if (portal->query(sql) && portal->fetchRow())
+				{
+					if(TeProgress::instance())
+						TeProgress::instance()->setTotalSteps(portal->numRows());
+					ti = clock();
+					do 
+					{
+						string objid = portal->getData("object_id");
+						TePolygon poly;
+						flag = portal->fetchGeometry(poly);
+						if (!poly.empty())
+						{
+							if (count == 0)
+							{
+								sprFile.writeLinesHeader ( );
+								if ( layer->projection() )
+									sprFile.writeProjection ( layer->projection() );
+								sprFile.writeBox ( layer->box() );
+								sprFile.writeInfoEnd();
+								labelFile.writeLabelHeader(TeSPRCadastral);
+							}
+							for (k = 0; k < poly.size(); k++ )
+							{
+								TeLinearRing ring = poly[k]; 			
+								for (unsigned int l = 0 ; l < ring.size(); l++)
+									sprFile.writePoint ( ring[l] );
+								sprFile.writeEnd();
+							}
+							TeCoord2D xy = TeFindCentroid( poly );
+							labelFile.writeCadastralLabel(objid,xy.x(), xy.y(),objName);
+						} // end - poly not empty
+						count++;
+						if (TeProgress::instance())
+						{
+							tf = clock();
+							if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+								TeProgress::instance()->setProgress(count);
+							if (TeProgress::instance()->wasCancelled())
+								break;
+							ti = tf;
+						}
+					} while (flag); // end - for every record
+				} // end - has any record
+			} // end - if has polygons
+			portal->freeResult();
+			if (layer->hasGeometry(TeCELLS))
+			{
+				string sql = "SELECT * FROM " + layer->tableName(TeCELLS);
+				if (portal->query(sql) && portal->fetchRow())
+				{
+					if(TeProgress::instance())
+						TeProgress::instance()->setTotalSteps(portal->numRows());
+					ti = clock();
+					do 
+					{
+						string objid = portal->getData("object_id");
+						TeCell cell;
+						flag = portal->fetchGeometry(cell);
+						if (count == 0)
+						{
+							sprFile.writeLinesHeader ( );
+							if ( layer->projection() )
+								sprFile.writeProjection ( layer->projection() );
+							sprFile.writeBox ( layer->box() );
+							sprFile.writeInfoEnd();
+							labelFile.writeLabelHeader(TeSPRCadastral);
+						}
+						TeCoord2D ll = cell.box().lowerLeft();
+						TeCoord2D ur = cell.box().upperRight();
+						sprFile.writePoint (ll);
+                        TeCoord2D p1(ur.x(),ll.y());
+						sprFile.writePoint (p1);
+						sprFile.writePoint (ur);
+                        TeCoord2D p2(ll.x(),ur.y());
+						sprFile.writePoint (p2);
+						sprFile.writePoint (ll);
+						sprFile.writeEnd();
+						TeCoord2D xy = TeFindCentroid(cell);
+						labelFile.writeCadastralLabel(objid,xy.x(), xy.y(),objName);
+						count++;
+						if (TeProgress::instance())
+						{
+							tf = clock();
+							if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+								TeProgress::instance()->setProgress(count);
+							if (TeProgress::instance()->wasCancelled())
+								break;
+							ti = tf;
+						}
+					} while (flag);
+				}
+			}
+			portal->freeResult();
+			if (count>0)
+			{
+				sprFile.writeEnd();
+				labelFile.writeEnd();
+			}
+		} // end - if has lines or polygons
+		delete portal;
+		return true;
+	}
+	catch (...)
+	{
+		delete portal;
+		return true;
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+}
+
+bool TeExportSPRTable(TeLayer* layer, const string& sprFileName, const string& tabName, const string& objName, TeSpringModels cat)
+{
+	if (!layer || tabName.empty() || sprFileName.empty())
+		return false;
+
+	string obj;
+	if (objName.empty())
+		obj = "Objeto";
+	else
+		obj = objName;
+
+	// check if layer has the attribute table
+	TeTable tableE;
+	if (!layer->getAttrTablesByName(tabName,tableE))
+		return false;
+	int index = tableE.attrLinkPosition();
+	if (index < 0)
+		return false;
+
+	// Try to get the table
+	TeDatabasePortal* portal = layer->database()->getPortal();
+	if (!portal)
+		return false;
+
+	string sql = "SELECT * FROM " + tabName;
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	// retrieve the attribute information 
+	TeAttributeList attInfo = portal->AttributeList();
+
+	TeSPRFile tabFile(sprFileName+"_TAB.spr", "w+");
+
+	// write the attribute information ( skip the index if exists)
+	tabFile.writeTableHeader( cat );
+	tabFile.writeAttributeInfo (attInfo, obj, tableE.linkName());
+	tabFile.writeInfoEnd();
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(portal->numRows());
+	int count = 0;
+	clock_t	ti, tf;
+	ti = clock();
+	while (portal->fetchRow())
+	{	
+		TeTableRow row;
+		for (int j = 0; j < portal->numFields(); j++)
+			row.push_back ( portal->getData (j) ); 
+
+		string label = row[index];
+		tabFile.writeGeoId (label);
+		for (unsigned int col = 0; col < row.size(); col++)
+		{
+			if ( col == (unsigned int) index )						// skip the index - already written
+				continue;		
+			tabFile.writeValue(row[col], attInfo[col].rep_.type_); // write the value
+		}
+		tabFile.writeNewLine();
+		count++;
+		if (TeProgress::instance())
+		{
+			tf = clock();
+			if (((tf-ti)/CLOCKS_PER_SEC) > 3)
+				TeProgress::instance()->setProgress(count);
+			if (TeProgress::instance()->wasCancelled())
+				break;
+			ti = tf;
+		}
+	}
+	tabFile.writeEnd();
+	delete portal;
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
diff --git a/src/terralib/functions/TeGeoProcessingFunctions.cpp b/src/terralib/functions/TeGeoProcessingFunctions.cpp
new file mode 100644
index 0000000..6da13db
--- /dev/null
+++ b/src/terralib/functions/TeGeoProcessingFunctions.cpp
@@ -0,0 +1,2097 @@
+/************************************************************************************
+TerraView - visualization and exploration of geographical databases
+using TerraLib.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+This file is part of TerraView. TerraView is free software; you can redistribute it 
+and/or modify it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+You should have received a copy of the GNU General Public License
+along with TerraView.
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The software provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use of
+this program and its documentation.
+*************************************************************************************/
+
+#include "TeGeoProcessingFunctions.h"
+#include "TeQuerier.h"
+#include "TeQuerierParams.h"
+#include "TeOverlay.h"
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+#include "TeApplicationUtils.h"
+#include "TeCellAlgorithms.h"
+#include "TeAsciiFile.h"
+
+
+bool changeAttrList(TeAttributeList& attrList)
+{
+	bool change = false;
+	
+	for(int i=0; i<(int)attrList.size(); ++i) 
+	{
+		string& nameOr = attrList[i].rep_.name_;
+	
+		attrList[i].rep_.isAutoNumber_ = false;
+		attrList[i].rep_.isPrimaryKey_ = false;
+		
+		//replace "." for "_"
+		string::size_type f = nameOr.find(".");
+		if(f != string::npos)
+		{
+			nameOr.replace(f, 1, "_");
+			change = true;
+		}
+
+		string nameTemp = TeConvertToUpperCase(nameOr);
+
+		int count = 1;
+		int j = i+1;
+		while(j<(int)attrList.size())
+		{
+			if((nameTemp == TeConvertToUpperCase(attrList[j].rep_.name_)) && (i!=j))
+			{
+				nameTemp = nameTemp +"_"+ Te2String(count);
+				nameOr = nameOr +"_"+ Te2String(count);
+
+				j = 0;
+				change = true;
+				++count;
+			}
+			++j;
+		}
+	}
+
+	return change;
+}
+
+
+bool multiGeometryToLayer(TeMultiGeometry& mGeom, const string& newId, TeLayer* newLayer, TeProjection* proj=0)
+{
+	bool flag = false;
+	TeProjection* projLayer = newLayer->projection();
+	
+	if(mGeom.hasPolygons())  
+	{
+		TePolygonSet polSet, polSetTemp;
+		mGeom.getGeometry (polSetTemp);
+
+		if((proj) && (!((*proj) == (*projLayer))))
+		{
+			for(int i=0; i<(int)polSetTemp.size(); ++i)
+			{
+				TePolygon poly = polSetTemp[i];
+				TePolygon pout;
+				TeVectorRemap (poly, proj, pout, projLayer);
+				pout.objectId(poly.objectId());
+				polSet.add (pout);
+			}
+		}
+		else
+			polSet = polSetTemp;
+
+
+		polSet.objectId(newId);
+		flag = newLayer->addPolygons(polSet);
+	} 
+	else if (mGeom.hasLines())
+	{
+		TeLineSet lineSet, lineSetTemp;
+		mGeom.getGeometry (lineSetTemp);
+
+		if((proj) && (!((*proj) == (*projLayer))))
+		{
+			for(int i=0; i<(int)lineSetTemp.size(); ++i)
+			{
+				TeLine2D line = lineSetTemp[i];
+				TeLine2D lout;
+				TeVectorRemap (line, proj, lout, projLayer);
+				lout.objectId(line.objectId());
+				lineSet.add (lout);
+			}
+		}
+		else
+			lineSet = lineSetTemp;
+
+		lineSet.objectId (newId);
+		flag = newLayer->addLines(lineSet);
+	}
+	else if (mGeom.hasPoints())
+	{
+		TePointSet pointSet, pointSetTemp;
+		mGeom.getGeometry (pointSetTemp);
+
+		if((proj) && (!((*proj) == (*projLayer))))
+		{
+			for(int i=0; i<(int)pointSetTemp.size(); ++i)
+			{
+				TePoint point = pointSetTemp[i];
+				TePoint pout;
+				TeVectorRemap (point, proj, pout, projLayer);
+				pout.objectId(point.objectId());
+				pointSet.add (pout);
+			}
+		}
+		else
+			pointSet = pointSetTemp;
+
+		pointSet.objectId (newId);
+		flag = newLayer->addPoints(pointSet);
+	}
+	else if (mGeom.hasCells())
+	{
+		TeCellSet cellSet, cellSetTemp;
+		mGeom.getGeometry (cellSetTemp);
+	
+		if((proj) && (!((*proj) == (*projLayer))))
+		{
+			for(int i=0; i<(int)cellSetTemp.size(); ++i)
+			{
+				TeCell cell = cellSetTemp[i];
+				TeCell cellout;
+				TeVectorRemap (cell, proj, cellout, projLayer);
+				cellout.objectId(cell.objectId());
+				cellSet.add (cellout);
+			}
+		}
+		else
+			cellSet = cellSetTemp;
+
+		cellSet.objectId (newId);
+		flag = newLayer->addCells(cellSet);
+	}
+	else 
+		return false;
+
+	return flag;
+}
+
+
+
+bool TeGeoOpAggregation(TeLayer* newLayer, TeTheme* theme, vector<string> agregAttrVec, 
+						TeGroupingAttr& attrMM, TeSelectedObjects selOb, TeAsciiFile* logFile)		
+{
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	int	i, j, offset, steps = 0;
+	TeStatisticValMap stat;
+	TeStatisticStringValMap sstat;
+	vector<string> valVec;
+	map<int, vector<string> > stringMap;
+	map<int, vector<double> > doubleMap;
+	string geoName, query;
+	string layerName = newLayer->name();
+	TeLayer* layer = theme->layer();
+	TeDatabase* db = layer->database();
+	string CT = theme->collectionTable();
+	string OID = CT + ".c_object_id";
+
+	TeAttributeList aList = theme->sqlAttList();
+	TeAttribute agregTeAttribute;
+	agregTeAttribute.rep_.type_ = TeSTRING;
+	agregTeAttribute.rep_.numChar_ = 200;
+	agregTeAttribute.rep_.isPrimaryKey_ = false;
+	agregTeAttribute.rep_.isAutoNumber_ = false;
+
+	map<int, string> legendLabelMap;
+	int legIndex = -1;
+
+	for(j=0; j<(int)agregAttrVec.size(); ++j)
+	{
+		string name;
+		if(agregAttrVec[j] == "CURRENT LEGEND")
+		{
+			agregAttrVec[j] = CT + ".c_legend_id";
+			name = "agreg_leg_";
+			legIndex = j;
+		}
+		else
+		{	
+			for(i=0; i<(int)aList.size(); ++i)
+			{
+				name = aList[i].rep_.name_;
+				if(name == agregAttrVec[j])
+				{
+					int f = name.find(".");
+					if(f >= 0)
+						name.replace(f, 1, "_");
+					break;
+				}
+			}
+		}
+		if(j==0)
+			agregTeAttribute.rep_.name_ += name;
+		else
+			agregTeAttribute.rep_.name_ += "_" + name;
+	}
+	if(agregTeAttribute.rep_.name_.size() > 30)
+		agregTeAttribute.rep_.name_.erase(30, agregTeAttribute.rep_.name_.size()-30);
+
+	if(legIndex > -1)
+	{
+		TeLegendEntryVector& legVec = theme->legend();
+		for(i=0; i<(int)legVec.size(); ++i)
+			legendLabelMap[legVec[i].id()] = legVec[i].label();
+	}
+
+	TeAttributeList attList;
+
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "object_id_";
+	at.rep_.numChar_ = 255;
+	at.rep_.isPrimaryKey_ = true;
+	at.rep_.isAutoNumber_ = false;
+	attList.push_back(at);
+
+	attList.push_back(agregTeAttribute);
+	
+	at.rep_.type_ = TeINT;
+	at.rep_.name_ = "agreg_count_";
+	at.rep_.numChar_ = 0;
+	at.rep_.isPrimaryKey_ = false;
+	attList.push_back(at);	
+
+	TeGroupingAttr::iterator it;
+	string ss;
+	for(it=attrMM.begin(); it!=attrMM.end(); ++it)
+	{
+		string s = it->first.name_;
+		TeStatisticType sType = it->second;
+
+		ss = getStringFromStatistic(sType);
+		string sss = s + "_" + ss;
+
+		if(((db->dbmsName()=="OracleAdo") || 
+			(db->dbmsName()=="OracleSpatial") ) &&
+			(sss.size() > 30))
+		{
+			int s = sss.size(); 
+			at.rep_.name_ = sss.substr(s-30, s-1);
+		}
+		else
+			at.rep_.name_ = sss;
+
+		at.rep_ = it->first;
+		at.rep_.isPrimaryKey_ = false;
+		if(at.rep_.type_ == TeINT)
+			at.rep_.type_ = TeREAL;
+		attList.push_back(at);	
+	}
+
+	changeAttrList(attList);
+	TeTable attTable(newLayer->name(), attList, "object_id_", "object_id_");
+
+	if(!newLayer->createAttributeTable(attTable))
+        return false;
+
+	string queryAtr  = "SELECT " + OID;
+
+	for(i=0; i<(int)agregAttrVec.size(); ++i)
+		queryAtr += ", " + agregAttrVec[i];
+
+	for(it=attrMM.begin(); it!=attrMM.end(); ++it)
+	{
+		string s = it->first.name_;
+		bool existedName = false;
+		vector<string>::iterator it2 = agregAttrVec.begin();
+		while(it2!=agregAttrVec.end())
+		{
+			if((*it2)==s)
+			{
+				existedName=true;
+				break;
+			}
+			++it2;
+		}
+
+		if((s != ss) && (!existedName))
+			queryAtr += ", " + s;
+		ss = s;
+	}
+	queryAtr += theme->sqlFrom();
+	if(selOb == TeSelectedByPointing)
+		queryAtr += " WHERE " + CT + ".c_object_status = 1 OR " + CT + ".c_object_status = 3";
+	else if(selOb == TeSelectedByQuery)
+		queryAtr += " WHERE " + CT + ".c_object_status = 2 OR " + CT + ".c_object_status = 3";
+	queryAtr += " ORDER BY ";
+	for(i=0; i<(int)agregAttrVec.size(); ++i)
+	{
+		queryAtr += agregAttrVec[i];
+		if(i<(int)agregAttrVec.size()-1)
+			queryAtr += ", ";
+	}
+
+	if(layer->hasGeometry(TePOLYGONS))
+		geoName = layer->tableName(TePOLYGONS);
+	else if(layer->hasGeometry(TeLINES))
+		geoName = layer->tableName(TeLINES);
+	else if(layer->hasGeometry(TePOINTS))
+		geoName = layer->tableName(TePOINTS);
+	else
+		geoName = layer->tableName(TeCELLS);
+
+	TeAttributeList geoAtList;
+	db->getAttributeList(geoName, geoAtList);
+	offset = geoAtList.size();
+
+	if((db->dbmsName()=="OracleAdo") || (db->dbmsName()=="OracleSpatial"))
+		query = "SELECT " + geoName + ".*, ATR.* FROM " + geoName + ", (" + queryAtr + ") ATR ";
+	else
+		query = "SELECT " + geoName + ".*, ATR.* FROM " + geoName + ", (" + queryAtr + ") AS ATR ";
+
+	string newOID = TeGetExtension(OID.c_str());
+
+	if(newOID.empty())
+		newOID = OID;
+
+	query += "WHERE ATR." + newOID + " = " + geoName + ".object_id";
+	query += " ORDER BY ";
+	for(i=0; i<(int)agregAttrVec.size(); ++i)
+	{
+		string newagre = TeGetExtension(agregAttrVec[i].c_str());
+
+		if(newagre.empty())
+			newagre = agregAttrVec[i];
+
+		query += "ATR." + newagre;
+		if(i<(int)agregAttrVec.size()-1)
+			query += ", ";
+	}
+	query += ", " + geoName + ".object_id";
+
+
+	if(layer->hasGeometry(TePOLYGONS))
+	{
+		if(db->dbmsName() != "OracleSpatial" && db->dbmsName() != "PostGIS")
+			query += ", " + geoName + ".parent_id, " + geoName + ".num_holes DESC";
+	}
+
+	TeDatabasePortal* portal = db->getPortal();
+
+	int total;
+	string qc = "SELECT COUNT(*) FROM " + CT;
+	if(selOb == TeSelectedByPointing)
+		qc += " WHERE " + CT + ".c_object_status = 1 OR " + CT + ".c_object_status = 3";
+	else if(selOb == TeSelectedByQuery)
+		qc += " WHERE " + CT + ".c_object_status = 2 OR " + CT + ".c_object_status = 3";
+	if(portal->query(qc) && portal->fetchRow())
+		total = atoi(portal->getData(0));
+
+	portal->freeResult();
+	if(portal->query(query) && portal->fetchRow())
+	{
+		TeAttributeList portalAttList = portal->AttributeList();
+
+		if(layer->hasGeometry(TePOLYGONS))
+			newLayer->addGeometry(TePOLYGONS);
+		else if(layer->hasGeometry(TeLINES))
+			newLayer->addGeometry(TeLINES);
+		else if(layer->hasGeometry(TePOINTS))
+			newLayer->addGeometry(TePOINTS);
+		else
+			newLayer->addGeometry(TeCELLS);
+
+		bool flag = false;
+		int count = 0;			
+		int objectId = 1;
+		string lastOid = portal->getData(offset);
+		lastOid += "aaa";
+		string lastVal;
+
+		for(i=0; i<(int)agregAttrVec.size(); ++i)
+		{
+			string s = portal->getData(agregAttrVec[i]);
+			if(legIndex == i)
+				s = legendLabelMap[atoi(s.c_str())];
+			lastVal += s;
+			if(i<(int)agregAttrVec.size() - 1)
+				lastVal += "_";
+		}
+		
+		TePolygonSet ps;
+		TeMultiGeometry multGeom; 
+
+		if(TeProgress::instance())
+		{
+			string caption = "Aggregation";
+			TeProgress::instance()->setCaption(caption.c_str());
+			string msg = "Executing aggregation. Please, wait!";
+			TeProgress::instance()->setMessage(msg);
+			TeProgress::instance()->setTotalSteps(total);
+			t2 = clock();
+			t0 = t1 = t2;
+		}
+
+
+		TePrecision::instance().setPrecision(TeGetPrecision(layer->projection()));
+
+		do
+		{	
+			string oid = portal->getData(offset);
+			string currVal;
+			for(i=0; i<(int)agregAttrVec.size(); ++i)
+			{
+				string s = portal->getData(agregAttrVec[i]);
+				if(legIndex == i)
+					s = legendLabelMap[atoi(s.c_str())];
+				currVal += s;
+				if(i<(int)agregAttrVec.size() - 1)
+					currVal += "_";
+			}
+
+			TePolygon p;
+			TeLine2D  l;
+			TePoint	  pt;
+			TeCell    c;
+			double	  dval;
+
+			if(lastVal == currVal)
+			{				
+				if(oid != lastOid)
+				{
+					count++;
+					for(j=3, i=offset+(int)agregAttrVec.size()+1; i<(int)portalAttList.size(); ++i, ++j)
+					{
+						string s = portal->getData(i);
+						TeAttrDataType aType = portalAttList[i].rep_.type_;
+						if(aType != TeREAL && aType != TeINT)
+							stringMap[j].push_back(s);
+						else
+						{
+							if(s.empty())
+								dval = TeMAXFLOAT;
+							else
+								dval = atof(s.c_str());
+							doubleMap[j].push_back(dval);
+						}
+					}
+				}
+
+				if(layer->hasGeometry(TePOLYGONS))
+				{
+					flag = portal->fetchGeometry(p);
+					TePolygonSet psaux;
+					psaux.add(p);
+
+					TePolygonSet psauxOut;
+					if(!TeOVERLAY::TeUnion(ps, psaux, psauxOut))
+					{
+						// when the operation returns false, write in the log a possible
+						// inconsistency in the data
+						if (logFile)
+						{
+							string mess = "Possivel inconsistencia na uniao do objeto ";
+							mess += ps.objectId();
+							mess += " e ";
+							mess += p.objectId();
+							logFile->writeString(mess);
+							logFile->writeNewLine();
+						}
+					}
+					ps = psauxOut;
+					multGeom.setGeometry(ps);
+				}
+				else if(layer->hasGeometry(TeLINES))
+				{
+					flag = portal->fetchGeometry(l);
+					multGeom.addGeometry(l);
+				}
+				else if(layer->hasGeometry(TePOINTS))
+				{
+					flag = portal->fetchGeometry(pt);
+					multGeom.addGeometry(pt);
+				}
+				else
+				{
+					flag = portal->fetchGeometry(c);
+					multGeom.addGeometry(c);
+				}
+			}
+			else  
+			{
+				if(!multiGeometryToLayer(multGeom, Te2String(objectId), newLayer))
+				{
+					delete portal;
+					return false; 
+				}
+				
+				valVec.push_back(Te2String(objectId));
+				valVec.push_back(lastVal);
+				valVec.push_back(Te2String(count));
+
+				i = 3;
+				it=attrMM.begin();
+				while(it != attrMM.end())
+				{
+					TeAttributeRep atRep = it->first;
+					TeAttrDataType aType = atRep.type_;
+
+					stat.clear();
+					sstat.clear();
+					if(aType == TeREAL || aType == TeINT)
+						TeCalculateStatistics(doubleMap[i].begin(), doubleMap[i].end(), stat);
+					else
+						TeCalculateStatistics(stringMap[i].begin(), stringMap[i].end(), sstat);
+
+					int ssize = attrMM.count(atRep);
+					for(j=0; j<ssize; ++j)
+					{
+						TeStatisticType sType = it->second;
+
+						if(aType == TeREAL || aType == TeINT)
+						{
+							double d = stat[sType];
+							valVec.push_back(Te2String(d));
+						}
+						else
+						{
+							string s = sstat[sType];
+							valVec.push_back(s);
+						}
+						it++;
+					}
+					i++;
+				}
+
+				TeTableRow row;
+				for(i=0; i<(int)valVec.size(); ++i)
+					row.push_back(valVec[i]);
+				attTable.add(row);
+
+				valVec.clear();
+				stringMap.clear();
+				doubleMap.clear();
+				count = 0;
+				ps.clear();
+				multGeom.clear();
+				
+				if(oid != lastOid)
+				{
+					count++;
+					for(j=3, i=offset+(int)agregAttrVec.size()+1; i<(int)portalAttList.size(); ++i, ++j)
+					{
+						string s = portal->getData(i);
+						TeAttrDataType aType = portalAttList[i].rep_.type_;
+						if(aType != TeREAL && aType != TeINT)
+							stringMap[j].push_back(s);
+						else
+						{
+							if(s.empty())
+								dval = TeMAXFLOAT;
+							else
+								dval = atof(s.c_str());
+							doubleMap[j].push_back(dval);
+						}
+					}
+				}
+
+				if(layer->hasGeometry(TePOLYGONS))
+				{
+					flag = portal->fetchGeometry(p);
+					TePolygonSet psaux;
+					psaux.add(p);
+
+					TePolygonSet psauxOut;
+
+					if(!TeOVERLAY::TeUnion(ps, psaux, psauxOut))
+					{
+						// when the operation returns false, write in the log a possible
+						// inconsistency in the data
+						if (logFile)
+						{
+							string mess = "Possivel inconsistencia na uniao do objeto ";
+							mess += ps.objectId();
+							mess += " e ";
+							mess += p.objectId();
+							logFile->writeString(mess);
+							logFile->writeNewLine();
+						}
+					}
+					ps = psauxOut;
+
+					multGeom.setGeometry(ps);
+				}
+				else if(layer->hasGeometry(TeLINES))
+				{
+					flag = portal->fetchGeometry(l);
+					multGeom.addGeometry(l);
+				}
+				else if(layer->hasGeometry(TePOINTS))
+				{
+					flag = portal->fetchGeometry(pt);
+					multGeom.addGeometry(pt);
+				}
+				else
+				{
+					flag = portal->fetchGeometry(c);
+					multGeom.addGeometry(c);
+				}
+
+				++objectId;
+			}
+
+			if((oid != lastOid) && TeProgress::instance())
+			{
+				steps++;
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					if(TeProgress::instance()->wasCancelled())
+					{
+						TeProgress::instance()->reset();
+						delete portal;
+						return false;
+					}
+					
+					if((int)(t2-t0) > dt2)
+						TeProgress::instance()->setProgress(steps);
+				}
+			}
+			lastOid = oid;
+			lastVal = currVal;
+
+		}while(flag);
+		if(TeProgress::instance())
+			TeProgress::instance()->reset();
+
+		if(!multGeom.empty())  
+		{
+			if(!multiGeometryToLayer(multGeom, Te2String(objectId), newLayer))
+			{
+				delete portal;
+				return false; 
+			}
+
+			valVec.push_back(Te2String(objectId));
+			valVec.push_back(lastVal);
+			valVec.push_back(Te2String(count));
+
+			i = 3;
+			it=attrMM.begin();
+			while(it != attrMM.end())
+			{
+				TeAttributeRep atRep = it->first;
+				TeAttrDataType aType = atRep.type_;
+
+				stat.clear();
+				sstat.clear();
+				if(aType == TeREAL || aType == TeINT)
+					TeCalculateStatistics(doubleMap[i].begin(), doubleMap[i].end(), stat);
+				else
+					TeCalculateStatistics(stringMap[i].begin(), stringMap[i].end(), sstat);
+
+				int ssize = attrMM.count(atRep);
+				for(j=0; j<ssize; ++j)
+				{
+					TeStatisticType sType = it->second;
+
+					if(aType == TeREAL || aType == TeINT)
+					{
+						double d = stat[sType];
+						valVec.push_back(Te2String(d));
+					}
+					else
+					{
+						string s = sstat[sType];
+						valVec.push_back(s);
+					}
+					it++;
+				}
+				i++;
+			}
+
+			TeTableRow row;
+			for(i=0; i<(int)valVec.size(); ++i)
+				row.push_back(valVec[i]);
+			attTable.add(row);
+
+			valVec.clear();
+			stringMap.clear();
+			doubleMap.clear();
+			count = 0;
+			ps.clear();
+			multGeom.clear();
+		}			
+
+		newLayer->saveAttributeTable(attTable);
+	}
+	else
+	{
+		delete portal;
+		return false;
+	}
+
+	delete portal;
+	return true;
+}
+
+
+bool TeGeoOpAdd(TeLayer* newLayer, TeTheme* theme, TeThemeVector themeVec, 
+				TeSelectedObjects selOb,TeAsciiFile* logFile)
+{
+	
+	bool insertAttr = false;
+	
+	// create attribute table from main theme
+	TeAttributeList attrList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "object_id_"+ Te2String(newLayer->id());
+	at.rep_.numChar_ = 255;
+	at.rep_.isPrimaryKey_ = true;
+	at.rep_.isAutoNumber_ = false;
+	attrList.push_back(at);
+
+	//main theme
+	TeQuerierParams mainParams(true, true);
+	mainParams.setParams(theme);
+	mainParams.setSelecetObjs(selOb);
+	TeQuerier* mainQuerier = new TeQuerier(mainParams);
+
+	if(!mainQuerier->loadInstances())
+		return false;
+
+	//get attribute list from querier
+	TeAttributeList attribs = mainQuerier->getAttrList();
+	TeAttributeList::iterator it = attribs.begin();
+	while(it != attribs.end())
+	{
+		attrList.push_back (*it);
+		++it;
+	}
+
+	//verify if there are duplicate names
+	changeAttrList(attrList);
+	attrList[0].rep_.isPrimaryKey_ = true;  //link attribute is primary key
+		
+	// --------- create table 
+	TeTable attrTable (newLayer->name(), attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+	if(!newLayer->createAttributeTable(attrTable))
+        return false;
+
+	int newId = 0;
+
+	// ---------------------------------- Begin main theme
+	TeSTInstance st;
+	while(mainQuerier->fetchInstance(st))
+	{
+		TeTableRow row;
+		TePropertyVector vect = st.getPropertyVector();
+		row.push_back(Te2String(++newId));
+
+		//insert os valores do tema principal
+		for(int p=0; p<(int)vect.size();++p)
+			row.push_back(vect[p].value_);
+
+		attrTable.add(row);
+				
+		if(!multiGeometryToLayer(st.geometries(), Te2String(newId), newLayer))
+			return false; 
+		
+		if((newId%100)==0)
+		{
+			//insert attributes
+			newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+			if(attrTable.size()>0)
+				insertAttr = true;
+			attrTable.clear();
+		}
+	} 	//while fetchInstance no querier
+
+	
+	// save the last records 
+	newLayer->saveAttributeTable(attrTable); 
+	if(attrTable.size()>0)
+		insertAttr = true;
+	attrTable.clear();
+	st.clear();
+	delete mainQuerier;
+
+	// ---------------------------------- End main theme
+
+	for(int i=0; i<(int)themeVec.size(); ++i)
+	{
+
+		TeTheme* temp = themeVec[i];
+		TeProjection* projTemp = temp->layer()->projection();
+		
+		TeQuerierParams params(true, true);
+
+		params.setParams(temp);
+		params.setSelecetObjs (selOb);
+		TeQuerier* querier = new TeQuerier(params);
+
+		if(!querier->loadInstances())
+			return false;
+
+		attribs.clear();
+		attribs = querier->getAttrList();
+		vector<int> indexVec;
+
+		for(int k=0; k<(int)attrList.size(); ++k)
+		{
+			string name = attrList[k].rep_.name_;
+			int ind = -1;
+			
+			for(int p=0; p<(int)attribs.size();++p)
+			{
+				if(TeConvertToUpperCase(name) == TeConvertToUpperCase(attribs[p].rep_.name_))
+				{
+					ind = p;
+					break;
+				}
+			}
+
+			indexVec.push_back(ind);
+		}
+					
+		while(querier->fetchInstance(st))
+		{
+			TeTableRow row;
+			TePropertyVector vect = st.getPropertyVector();
+			row.push_back(Te2String(++newId));
+
+			//insert the values when the names are equals
+			for(int p=1; p<(int)attrList.size();++p)
+			{
+				int s = indexVec[p];
+				if(s<0)
+					row.push_back("");
+				else
+					row.push_back(vect[s].value_);
+			}
+
+			attrTable.add(row);
+					
+			if(!multiGeometryToLayer(st.geometries(), Te2String(newId), newLayer, projTemp))
+				return false; 
+										
+			if((newId%100)==0)
+			{
+				//insert attributes
+				newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+				if(attrTable.size()>0)
+					insertAttr = true;
+				attrTable.clear();
+			}
+		}  //while fetchInstance no querier
+	
+		newLayer->saveAttributeTable(attrTable); //save the last records!!!
+		if(attrTable.size()>0)
+			insertAttr = true;
+		attrTable.clear();
+		st.clear();
+	}
+
+	if(!newLayer->box().isValid())
+		return false;
+
+	if(!insertAttr)
+		return false; 
+
+	return true;
+}
+
+bool TeGeoOpOverlayIntersection(TeLayer* newLayer, TeTheme* theme, TeTheme* themeTrim, 
+								TeSelectedObjects selOb, TeSelectedObjects selObTrim, 
+								bool attrTrim, TeAsciiFile* logFile)
+{
+	if((!newLayer) || (!theme) || (!themeTrim))
+		return false;
+
+	bool insertAttr = false;
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+		
+	TeLayer* layer = theme->layer();
+	TeLayer* layerTrim = themeTrim->layer();
+
+	TeProjection* proj = layer->projection();
+	TeProjection* projTrim = layerTrim->projection();
+
+	//Querier Trim
+	TeQuerierParams paramsTrim(true, true);
+	paramsTrim.setParams(themeTrim);
+	paramsTrim.setSelecetObjs(selObTrim);
+	TeQuerier  querierTrim(paramsTrim); 
+
+	if(!querierTrim.loadInstances())
+		return  false;
+
+	// ----------------- begin create attribute table
+
+	TeAttributeList attrList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "object_id_"+ Te2String(newLayer->id());
+	at.rep_.numChar_ = 255;
+	at.rep_.isPrimaryKey_ = true;
+	at.rep_.isAutoNumber_ = false;
+	attrList.push_back(at);
+
+	//theme
+	TeQuerierParams paramsTemp(false, true);
+	paramsTemp.setParams(theme);
+	TeQuerier* querierTemp = new TeQuerier(paramsTemp);
+
+	if(!querierTemp->loadInstances())
+		return false;
+
+	//get attribute list from querier
+	TeAttributeList attribs = querierTemp->getAttrList();
+	TeAttributeList::iterator it = attribs.begin();
+	while(it != attribs.end())
+	{
+		attrList.push_back (*it);
+		++it;
+	}
+						
+	delete querierTemp;
+
+	//trim
+	attribs.clear();
+	attribs = querierTrim.getAttrList(); 
+
+	//fill attributes from Trim theme 
+	if(attrTrim)
+	{
+		it = attribs.begin();
+		while(it != attribs.end())
+		{
+			attrList.push_back (*it);
+			++it;
+		}
+	}
+
+	changeAttrList(attrList);
+	attrList[0].rep_.isPrimaryKey_ = true;  //link attribute is primary key
+	
+	TeTable attrTable (newLayer->name(), attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+	if(!newLayer->createAttributeTable(attrTable))
+        return false;
+	
+	// ----------------- End create attribute table
+	int numPolygonsTrim = querierTrim.numElemInstances();
+	// set progress bar
+	if(TeProgress::instance())
+	{
+		string caption = "Overlay Intersection";
+		string msg = "Executing Overlay Intersection. Please, wait!";
+		TeProgress::instance()->setCaption(caption.c_str());
+		TeProgress::instance()->setMessage(msg);
+		TeProgress::instance()->setTotalSteps(numPolygonsTrim);
+		t2 = clock();
+		t0 = t1 = t2;
+	}
+
+	double tol = TeGetPrecision(proj);
+	TePrecision::instance().setPrecision(tol);
+
+	int steps = 0;
+	TeSTInstance trim;
+	int newId = 0;
+
+	while(querierTrim.fetchInstance(trim))
+	{
+		TePolygonSet polSet;
+		if(!trim.getGeometry(polSet))
+			continue;
+
+		TeTableRow rowTrim;
+		if(attrTrim)
+		{
+			//fill attribute values from trim
+			TePropertyVector vecTrim = trim.getPropertyVector();
+
+			for(int p=0; p<(int)vecTrim.size();++p)
+				rowTrim.push_back(vecTrim[p].value_);
+		}
+
+		TePolygonSet ps;
+		TeLineSet	ls;
+		TePointSet pts;
+		TeCellSet cs;
+
+		for(int i=0; i<(int)polSet.size(); ++i)
+		{
+			TePolygon polyTrim = polSet[i];
+						
+			if(!((*proj) == (*projTrim)))
+			{
+				TePolygon pout;
+				TeVectorRemap (polyTrim, projTrim, pout, proj);
+				polyTrim = pout;
+			}
+
+			TePolygonSet polyTrimSet;
+			polyTrimSet.add(polyTrim);
+
+			TeBox boxTrim = polyTrim.box();
+
+			//Querier - theme that will be clip
+			TeQuerierParams params(true, true);
+			params.setParams(theme);
+			params.setSelecetObjs(selOb);
+			params.setSpatialRest(boxTrim, TeINTERSECTS, TeGEOMETRYNONE);
+
+			TeQuerier querier(params);
+
+			if(!querier.loadInstances())
+				continue;
+			
+			TeSTInstance sti;
+			while(querier.fetchInstance(sti))
+			{
+				TeTableRow row;
+				TePropertyVector vect = sti.getPropertyVector();
+				row.push_back("");
+
+				//insert values of the theme that is been clip 
+				for(int p=0; p<(int)vect.size();++p)
+					row.push_back(vect[p].value_);
+
+				if(attrTrim)  
+				{
+					for(int i=0; i<(int)rowTrim.size(); ++i)
+						row.push_back(rowTrim[i]);
+				}
+				
+				if(sti.hasPolygons())
+				{
+					TePolygonSet polSet;
+					sti.getGeometry (polSet);
+
+					for(int j=0; j<(int)polSet.size(); ++j)
+					{
+						TePolygonSet psAux, resultPS;
+						psAux.add(polSet[j]);
+						if(!TeOVERLAY::TeIntersection(polyTrimSet, psAux, resultPS))
+						{
+							// when the operation returns false, write in the log a possible
+							// inconsistency in the data
+							if (logFile)
+							{
+								string mess = "Possivel inconsistencia na interseccao do objeto ";
+								mess += polyTrim.objectId();
+								mess += " do tema " + themeTrim->name() + " e ";
+								mess += polSet[j].objectId();
+								mess += theme->name();
+								logFile->writeString(mess);
+								logFile->writeNewLine();
+							}
+						}
+						
+						for(int c=0; c<(int)resultPS.size(); ++c)
+						{
+							newId++;
+							TePolygon paux = resultPS[c];
+							paux.objectId(Te2String(newId));
+							ps.add(paux);
+							row[0] = Te2String(newId);
+							attrTable.add(row);
+						}
+					}
+				}
+				else if (sti.hasLines())
+				{
+					TeLineSet lineSet;
+					sti.getGeometry (lineSet);
+
+					for(int j=0; j<(int)lineSet.size(); ++j)
+					{
+						TeLineSet lsAux, resultLS;
+						TeMultiGeometry resultMGEOM;
+						lsAux.add(lineSet[j]);
+						resultMGEOM = TeOVERLAY::TeIntersection(lsAux, polyTrimSet);
+
+						resultMGEOM.getGeometry(resultLS);
+						
+						for(int c=0; c<(int)resultLS.size(); ++c)
+						{
+							newId++;
+							TeLine2D laux = resultLS[c];
+							laux.objectId(Te2String(newId));
+
+							ls.add(laux);
+							row[0] = Te2String(newId);
+							attrTable.add(row);
+						}
+					}
+				}
+				else if (sti.hasPoints())
+				{
+					TePointSet pointSet;
+					sti.getGeometry (pointSet);
+
+					for(int j=0; j<(int)pointSet.size(); ++j)
+					{
+						if(TeWithin(pointSet[j], polyTrim))
+						{
+							newId++;
+							pointSet[j].objectId(Te2String(newId));
+							pts.add(pointSet[j]);
+							row[0] = Te2String(newId);
+							attrTable.add(row);
+						}
+					}
+				}
+				else if (sti.hasCells())
+				{
+					TeCellSet cellSet;
+					sti.getGeometry (cellSet);
+
+					for(int j=0; j<(int)cellSet.size(); ++j)
+					{
+						if(TeIntersects(cellSet[j], polyTrim))
+						{
+							newId++;
+							cellSet[j].objectId(Te2String(newId));
+							cs.add(cellSet[j]);
+							row[0] = Te2String(newId);
+							attrTable.add(row);
+						}
+					}
+
+				}
+			} //while fetchInstance 
+		}//for each polygon of the Trim theme
+
+		//inserir a geometria no banco
+		if(layer->hasGeometry(TePOLYGONS) && ps.size())
+			newLayer->addPolygons(ps);
+		else if(layer->hasGeometry(TeLINES) && ls.size())
+			newLayer->addLines(ls);
+		else if(layer->hasGeometry(TePOINTS) && pts.size())
+			newLayer->addPoints(pts);
+		else if(cs.size())
+			newLayer->addCells(cs);
+
+		trim.clear();
+
+		steps++;
+		t2 = clock();
+		if ((TeProgress::instance()) && (int(t2-t1) > dt))
+		{
+			t1 = t2;
+			if(TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			if((int)(t2-t0) > dt2)
+				TeProgress::instance()->setProgress(steps);
+		}
+
+		if((steps%100)==0)
+		{
+			newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+			if(attrTable.size()>0)
+				insertAttr = true;
+			attrTable.clear();
+		}
+	} //while fetch instance querier Trim
+
+	if(TeProgress::instance())
+			TeProgress::instance()->reset();
+
+	newLayer->saveAttributeTable(attrTable); //save the last records!!!
+	if(attrTable.size()>0)
+		insertAttr = true;
+
+	if(!newLayer->box().isValid())
+		return false;
+
+	if(!insertAttr)
+		return false; 
+
+	return true;
+}
+
+bool TeGeoOpAssignDataLocationDistribute(TeTheme* themeMod, TeTheme* theme, const string& tableName, 
+										 const int& spatialRelation)
+{
+	if((!themeMod) || (!themeMod->layer()) ||  (!theme))
+		return false;
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+
+	TeLayer* layerMod = themeMod->layer();	
+	TeProjection* projMod = layerMod->projection();
+	TeProjection* proj = theme->layer()->projection();
+	
+	//Querier from theme 
+	TeQuerierParams params(true, true);
+	params.setParams(theme);
+	TeQuerier  querier(params); 
+
+	if(!querier.loadInstances())
+		return  false;
+
+	// ----------------- begin create attribute table
+
+	TeAttributeList attrList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "object_id_";
+	at.rep_.numChar_ = 255;
+	at.rep_.isPrimaryKey_ = true;
+	at.rep_.isAutoNumber_ = false;
+	attrList.push_back(at);
+
+	//get attribute list from querier
+	TeAttributeList attribs = querier.getAttrList();
+	TeAttributeList::iterator it = attribs.begin();
+	while(it != attribs.end())
+	{
+		attrList.push_back (*it);
+		++it;
+	}
+						
+	changeAttrList(attrList);
+	attrList[0].rep_.isPrimaryKey_ = true;  //link attribute is primary key
+	
+	TeTable attrTable (tableName, attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+	if(!layerMod->createAttributeTable(attrTable))
+        return false;
+
+	//empty rows
+	TeTable updateAttrTable (tableName, attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+	
+	// ----------------- End create attribute table
+	vector<string> objIds;
+	if( (theme->layer()->hasGeometry(TePOLYGONS)) || 
+		(theme->layer()->hasGeometry(TeCELLS))    ||
+		((themeMod->layer()->hasGeometry(TeLINES)) && (theme->layer()->hasGeometry(TeLINES)))) 
+	{
+		int numElem = querier.numElemInstances();
+		
+		// set progress bar
+		if(TeProgress::instance())
+		{
+			string caption = "Spatial Join";
+			string msg = "Executing Spatial Join. Please, wait!";
+			TeProgress::instance()->setCaption(caption.c_str());
+			TeProgress::instance()->setMessage(msg);
+			TeProgress::instance()->setTotalSteps(numElem);
+			t2 = clock();
+			t0 = t1 = t2;
+		}
+	
+		int steps = 0;
+		TeSTInstance sti;
+
+		double tol = TeGetPrecision(projMod);
+		TePrecision::instance().setPrecision(tol);	
+
+		while(querier.fetchInstance(sti))
+		{
+			// Get attributes
+			TeTableRow row;
+			TeTableRow emptyRow;
+
+			row.push_back("");
+			emptyRow.push_back("");
+
+			TePropertyVector vec = sti.getPropertyVector();
+			for(int p=0; p<(int)vec.size();++p)
+			{
+				row.push_back(vec[p].value_);
+				emptyRow.push_back ("");
+			}
+			
+			//Get geometry
+			TeMultiGeometry mGeom;
+			sti.getGeometry(mGeom);
+
+			vector<TeGeometry*> geoms;
+			mGeom.getGeometry(geoms);
+
+			for(int i=0; i<(int)geoms.size(); ++i)
+			{
+				if(!((*proj) == (*projMod)))
+				{
+					TeGeometry* gout; 
+					if(geoms[i]->elemType() == TePOLYGONS)
+					{
+						gout = new TePolygon;
+						TeVectorRemap (*((TePolygon*)geoms[i]), proj, *((TePolygon*)gout), projMod);
+					}
+					else if (geoms[i]->elemType() == TeCELLS)
+					{
+						gout = new TeCell;
+						TeVectorRemap (*((TeCell*)geoms[i]), proj, *((TeCell*)gout), projMod);
+					}
+					else
+					{
+						gout = new TeLine2D;
+						TeVectorRemap (*((TeLine2D*)geoms[i]), proj, *((TeLine2D*)gout), projMod);
+					}
+					gout->objectId(geoms[i]->objectId());
+					delete geoms[i];
+					geoms[i] = gout;
+				}
+				
+				//querier that will be modified
+				TeQuerierParams paramsMod(false, false);
+				paramsMod.setParams(themeMod);
+				paramsMod.setSpatialRest(geoms[i], spatialRelation, TeGEOMETRYNONE);
+				TeQuerier querierMod(paramsMod);
+
+				if(!querierMod.loadInstances())
+					continue;
+				
+				TeSTInstance stMod;
+				while(querierMod.fetchInstance(stMod))
+				{
+					string obj = stMod.objectId();
+					if( find(objIds.begin(), objIds.end(), obj) == objIds.end())
+					{
+						objIds.push_back (obj);
+						row[0] = obj;
+						attrTable.add(row);
+					}
+					else 
+					{
+						emptyRow[0] = obj;
+						updateAttrTable.add(emptyRow);
+					}
+				}
+				
+				if(attrTable.size()>100)
+				{
+					layerMod->saveAttributeTable(attrTable); //save 100 records!!!
+					layerMod->database()->updateTable(updateAttrTable);
+					attrTable.clear();
+					updateAttrTable.clear();
+				}
+			} // for
+			
+			for(int j=0; j<(int)geoms.size(); ++j)
+				delete (geoms[j]);  //delete allocated geometries 
+
+			steps++;
+			t2 = clock();
+			if ((TeProgress::instance()) && (int(t2-t1) > dt))
+			{
+				t1 = t2;
+				if(TeProgress::instance()->wasCancelled())
+				{
+					TeProgress::instance()->reset();
+					return false;
+				}
+				if((int)(t2-t0) > dt2)
+					TeProgress::instance()->setProgress(steps);
+			}
+
+		} //while 
+	} //if geometry type
+	else 
+	{
+		return false;  //use nearest neighbor
+	}
+				
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	layerMod->saveAttributeTable(attrTable); //save the last records!!!
+	layerMod->database()->updateTable(updateAttrTable);
+	
+	return true;
+}
+
+
+bool TeGeoOpOverlayUnion(TeLayer* newLayer, TeTheme* theme, TeTheme* themeOverlay, 
+						 TeSelectedObjects selOb, TeSelectedObjects selObOverlay, TeAsciiFile* logFile)
+{
+///////////////////////////////////////////////////////////////////
+return false;
+// verifivar se vai trabalhar com celulas
+// se vai, modificar a interface.....
+///////////////////////////////////////////////////////////////////
+	if((!newLayer) || (!theme) || (!themeOverlay))
+		return false;
+
+	bool insertAttr = false;
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+		
+	TeLayer* layer = theme->layer();
+	TeLayer* layerOverlay = themeOverlay->layer();
+
+	TeProjection* proj = layer->projection();
+	TeProjection* projOverlay = layerOverlay->projection();
+
+	//Querier Overlay
+	TeQuerierParams paramsOverlay(true, true);
+	paramsOverlay.setParams(themeOverlay);
+	paramsOverlay.setSelecetObjs(selObOverlay);
+	TeQuerier  querierOverlay(paramsOverlay); 
+
+	if(!querierOverlay.loadInstances())
+		return  false;
+
+	// ----------------- begin create attribute table
+
+	TeAttributeList attrList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "object_id_"+ Te2String(newLayer->id());
+	at.rep_.numChar_ = 255;
+	at.rep_.isPrimaryKey_ = true;
+	at.rep_.isAutoNumber_ = false;
+	attrList.push_back(at);
+
+	//theme
+	TeQuerierParams paramsTemp(false, true);
+	paramsTemp.setParams(theme);
+	TeQuerier* querierTemp = new TeQuerier(paramsTemp);
+
+	if(!querierTemp->loadInstances())
+		return false;
+
+	//get attribute list from querier
+	TeAttributeList attribs = querierTemp->getAttrList();
+	TeAttributeList::iterator it = attribs.begin();
+	while(it != attribs.end())
+	{
+		attrList.push_back (*it);
+		++it;
+	}
+						
+	delete querierTemp;
+
+	//overlay
+	attribs.clear();
+	attribs = querierOverlay.getAttrList(); 
+
+	//fill attributes from Overlay theme 
+	it = attribs.begin();
+	while(it != attribs.end())
+	{
+		attrList.push_back (*it);
+		++it;
+	}
+
+	changeAttrList(attrList);
+	attrList[0].rep_.isPrimaryKey_ = true;  //link attribute is primary key
+	
+	TeTable attrTable (newLayer->name(), attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+
+	if(!newLayer->createAttributeTable(attrTable))
+        return false;
+	
+	// ----------------- End create attribute table
+	int numPolygonsOverlay = querierOverlay.numElemInstances();
+	// set progress bar
+	if(TeProgress::instance())
+	{
+		string caption = "Overlay Union";
+		string msg = "Executing Overlay Union. Please, wait!";
+		TeProgress::instance()->setCaption(caption.c_str());
+		TeProgress::instance()->setMessage(msg);
+		TeProgress::instance()->setTotalSteps(numPolygonsOverlay);
+		t2 = clock();
+		t0 = t1 = t2;
+	}
+
+	double tol = TeGetPrecision(layer->projection());
+	TePrecision::instance().setPrecision(tol);	
+
+	int steps = 0;
+	TeSTInstance Overlay;
+	int newId = 0;
+
+	while(querierOverlay.fetchInstance(Overlay))
+	{
+		TePolygonSet polSet;
+		if(!Overlay.getGeometry(polSet))
+			continue;
+
+		TeTableRow rowOverlay;
+		//fill attribute values from Overlay
+		TePropertyVector vecOverlay = Overlay.getPropertyVector();
+
+		for(int p=0; p<(int)vecOverlay.size();++p)
+			rowOverlay.push_back(vecOverlay[p].value_);
+
+		TePolygonSet ps;
+//		TeCellSet cs;
+
+		for(int i=0; i<(int)polSet.size(); ++i)
+		{
+			TePolygon polyOverlay = polSet[i];
+						
+			if(!((*proj) == (*projOverlay)))
+			{
+				TePolygon pout;
+				TeVectorRemap (polyOverlay, projOverlay, pout, proj);
+				pout.objectId(polyOverlay.objectId());
+				polyOverlay = pout;
+			}
+
+			TePolygonSet polyOverlaySet;
+			polyOverlaySet.add(polyOverlay);
+
+			TeBox boxOverlay = polyOverlay.box();
+
+			//Querier - theme that will be clip
+			TeQuerierParams params(true, true);
+			params.setParams(theme);
+			params.setSelecetObjs(selOb);
+			params.setSpatialRest(boxOverlay, TeINTERSECTS, TeGEOMETRYNONE);
+
+			TeQuerier querier(params);
+
+			if(!querier.loadInstances())
+				continue;
+			
+			TeSTInstance sti;
+			while(querier.fetchInstance(sti))
+			{
+				TeTableRow row;
+				TePropertyVector vect = sti.getPropertyVector();
+				row.push_back("");
+
+				//insert values of the theme that is been clip 
+				for(int p=0; p<(int)vect.size();++p)
+					row.push_back(vect[p].value_);
+
+				for(int i=0; i<(int)rowOverlay.size(); ++i)
+					row.push_back(rowOverlay[i]);
+				
+				if(sti.hasPolygons())
+				{
+					TePolygonSet polSet;
+					sti.getGeometry (polSet);
+
+					for(int j=0; j<(int)polSet.size(); ++j)
+					{
+						TePolygonSet psAux, resultPS;
+						psAux.add(polSet[j]);
+						if(!TeOVERLAY::TeIntersection(polyOverlaySet, psAux, resultPS))
+						{
+							// when the operation returns false, write in the log a possible
+							// inconsistency in the data
+							if (logFile)
+							{
+								string mess = "Possivel inconsistencia na interseccao do objeto ";
+								mess += polyOverlay.objectId();
+								mess += " e ";
+								mess += polSet[j].objectId();
+								logFile->writeString(mess);
+								logFile->writeNewLine();
+							}
+						}
+						
+						for(int c=0; c<(int)resultPS.size(); ++c)
+						{
+							newId++;
+							TePolygon paux = resultPS[c];
+							paux.objectId(Te2String(newId));
+							ps.add(paux);
+							row[0] = Te2String(newId);
+							attrTable.add(row);
+						}
+					}
+				}
+//				else if (sti.hasCells())
+//				{
+//					TeCellSet cellSet;
+//					sti.getGeometry (cellSet);
+//
+//					for(int j=0; j<(int)cellSet.size(); ++j)
+//					{
+//						if(TeIntersects(cellSet[j], polyOverlay))
+//						{
+//							newId++;
+//							cellSet[j].objectId(Te2String(newId));
+//							cs.add(cellSet[j]);
+//							row[0] = Te2String(newId);
+//							attrTable.add(row);
+//						}
+//					}
+//				}
+			} //while fetchInstance 
+		}//for each polygon of the Overlay theme
+
+		//inserir a geometria no banco
+		if(layer->hasGeometry(TePOLYGONS) && ps.size())
+			newLayer->addPolygons(ps);
+//		else if(cs.size())
+//			newLayer->addCells(cs);
+
+		Overlay.clear();
+
+		steps++;
+		t2 = clock();
+		if ((TeProgress::instance()) && (int(t2-t1) > dt))
+		{
+			t1 = t2;
+			if(TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			if((int)(t2-t0) > dt2)
+				TeProgress::instance()->setProgress(steps);
+		}
+
+		if((steps%100)==0)
+		{
+			newLayer->saveAttributeTable(attrTable); //save 100 records!!!
+			if(attrTable.size()>0)
+				insertAttr = true;
+			attrTable.clear();
+		}
+	} //while fetch instance querier Overlay
+
+	if(TeProgress::instance())
+			TeProgress::instance()->reset();
+
+	newLayer->saveAttributeTable(attrTable); //save the last records!!!
+	if(attrTable.size()>0)
+		insertAttr = true;
+
+	if(!newLayer->box().isValid())
+		return false;
+
+	if(!insertAttr)
+		return false; 
+
+	return true;
+}
+
+
+bool TeGeoOpAssignByLocationCollect(TeTheme* restrTheme, TeTheme* srcTheme, 
+									const string& newTableName, TeGroupingAttr& measuresColl, 
+									const int& spatialRelation)
+{
+	if(!restrTheme || !restrTheme->layer() ||		// no spatial restriction theme
+	   !srcTheme ||									// no source theme
+	   newTableName.empty() ||						// no output table name 
+	   measuresColl.empty())							// no set of measures to collect
+		return false;
+
+	// verifies that spatial restriction is given by polygons or cells
+	TeGeomRep restrRep = (TeGeomRep)(restrTheme->layer()->geomRep() & ~TeTEXT);
+	if (restrRep != TePOLYGONS && restrRep != TeCELLS)
+		return false;
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+
+	TeProjection* restrProj = restrTheme->layer()->projection();
+	TeProjection* srcProj	= srcTheme->layer()->projection();
+
+	bool doRemap = !(*restrProj == *srcProj);
+
+	// try to retrieve the geometries of the spatial restriction theme
+	TeQuerierParams params(true, false);
+	params.setParams(restrTheme);
+	TeQuerier spatialRestrictions(params); 
+
+	if(!spatialRestrictions.loadInstances())
+		return false;
+
+	// there is at least one restriction geometry, so create the output table
+	// defines its attribute list
+	TeAttributeList attrList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.name_ = "object_id_";
+	at.rep_.numChar_ = 255;
+	attrList.push_back(at);
+	vector<int>  countAttr;
+
+	int attrNum = 1;
+	TeGroupingAttr::iterator it = measuresColl.begin();		// for each different measure
+	while (it != measuresColl.end())								// create a new attribute
+	{
+		at.rep_ = it->first;
+		at.rep_.isPrimaryKey_ = false;
+		string nameTemp = it->first.name_ + "_" + getStringFromStatistic(it->second);
+		if(((restrTheme->layer()->database()->dbmsName()=="OracleAdo") || 
+			(restrTheme->layer()->database()->dbmsName()=="OracleSpatial") ) &&
+			(nameTemp.size() > 30))
+		{
+			int s = nameTemp.size(); 
+			at.rep_.name_ = nameTemp.substr(s-30, s-1);
+		}
+		else
+			at.rep_.name_ = nameTemp;
+				
+		if (it->second == TeCOUNT || it->second == TeVALIDCOUNT)
+		{
+			at.rep_.type_ = TeINT;
+			countAttr.push_back (attrNum);
+		}
+		else if (at.rep_.type_ == TeINT)
+			at.rep_.type_ = TeREAL;
+		attrList.push_back(at);
+		++it;
+		++attrNum;
+	}	
+	changeAttrList(attrList);	// validates attribute list						
+	attrList[0].rep_.isPrimaryKey_ = true;
+	attrList[0].rep_.isAutoNumber_ = false;
+
+	TeTable measuresTable (newTableName, attrList, attrList[0].rep_.name_, attrList[0].rep_.name_);
+	if(!restrTheme->layer()->createAttributeTable(measuresTable)) // creates the new attribute table
+        return false;
+
+	//use function to point and cell
+	TeGeomRep srcRep = (TeGeomRep)(srcTheme->layer()->geomRep() & ~TeTEXT);
+	TeDatabase* db = restrTheme->layer()->database();
+	int spatialRes = TeOVERLAPS | TeWITHIN | TeCOVEREDBY | TeCROSSES;
+	bool sqlGroup = false;
+	
+	if( (*restrProj==*srcProj) && 
+		(((restrRep==TeCELLS) && (srcRep==TePOINTS)) ||
+		((restrRep==TeCELLS) && (srcRep==TeCELLS) && ((spatialRelation==TeINTERSECTS) || (spatialRelation==spatialRes)))))
+	{
+		if(TeCellStatistics(restrTheme, measuresTable, measuresColl, srcTheme, restrTheme->layer()->database()))
+			sqlGroup = db->insertTableInfo(restrTheme->layer()->id(),measuresTable);
+	}
+
+	if(sqlGroup)
+		return true;
+	
+	if(TeProgress::instance())								// sets the progress bar
+	{
+		string caption = "Assign Data By Location";
+		string msg = "Executing collecting. Please, wait!";
+		TeProgress::instance()->setCaption(caption.c_str());
+		TeProgress::instance()->setMessage(msg);
+		TeProgress::instance()->setTotalSteps(spatialRestrictions.numElemInstances());
+		t2 = clock();
+		t0 = t1 = t2;
+	}
+
+	double tol = TeGetPrecision(srcProj);
+	TePrecision::instance().setPrecision(tol);	
+
+	unsigned int nregions = 0;
+	TePolygonSet restrPols;
+	TeCellSet restrCells;
+	TeSTInstance restrInstance;
+
+	while(spatialRestrictions.fetchInstance(restrInstance)) // collect data for each geometry
+	{														// of the spatial restriction set
+		// defines a querier to select measures from objects that
+		// are delimited by the a geometry and a spatial restriction
+		TeQuerierParams par2(false,measuresColl);
+		par2.setParams(srcTheme);
+		restrCells.clear();
+		restrPols.clear();
+		TeMultiGeometry mGeom;
+		restrInstance.getGeometry(mGeom);
+		// get the geometry of the instance
+		if (restrRep == TeCELLS)						// restriction is given by a cell set geometry
+		{
+			mGeom.getGeometry(restrCells);
+			if (doRemap)						// bring it to the source projection
+			{									// if necessary
+				TeCellSet restrCellsAux;
+				TeVectorRemap(restrCells,restrProj,restrCellsAux,srcProj);
+				restrCells.clear();
+				restrCells = restrCellsAux;
+			}
+			par2.setSpatialRest(&restrCells,spatialRelation,TeGEOMETRYNONE);
+		}
+		else									// restriction is given by a cell set geometry
+		{
+			mGeom.getGeometry(restrPols);
+			if (doRemap)						// bring it to the source projection
+			{									// if necessary
+				TePolygonSet restrPolsAux;
+				TeVectorRemap(restrPols,restrProj,restrPolsAux,srcProj);
+				restrPols.clear();
+				restrPols = restrPolsAux;
+			}
+			par2.setSpatialRest(&restrPols,spatialRelation,TeGEOMETRYNONE);
+		}
+		// creates a querier to retrieve the desired measures of the objects inside the 
+		// spatial restriction
+		TeQuerier sourceMeasures(par2);
+
+		// process each source within the spatial restriction geometry
+		TeTableRow row;
+		int nrows = 0;
+		row.push_back(restrInstance.objectId());	// identify the instance
+		
+		if (sourceMeasures.loadInstances())
+		{
+			TeSTInstance sourceInstance;
+			unsigned int p;								// get the calculated attributes
+			sourceMeasures.fetchInstance(sourceInstance);
+			TePropertyVector vec = sourceInstance.getPropertyVector();
+			for(p=0; p<vec.size();++p)
+				row.push_back(vec[p].value_);
+		}
+		else 
+		{
+			//insert null or zero attribute value
+			for(int p=1; p<(int)attrList.size();++p)
+			{
+				if(find(countAttr.begin(), countAttr.end(), p) != countAttr.end())
+					row.push_back(Te2String(0));
+				else
+					row.push_back("");
+			}
+		}
+	
+		measuresTable.add(row);
+		row.clear();
+		nrows++;
+			
+		if(measuresTable.size()>100)	// saves chunks of 100 records
+		{
+			restrTheme->layer()->saveAttributeTable(measuresTable); 
+			measuresTable.clear();
+		}
+
+		++nregions;
+		t2 = clock();
+		if ( int(t2-t1) > dt && TeProgress::instance())
+		{
+			t1 = t2;
+			if(TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			if((int)(t2-t0) > dt2)
+				TeProgress::instance()->setProgress(nregions);
+		}
+	}
+	if (measuresTable.size() > 0)	// saves remaining records
+	{
+		restrTheme->layer()->saveAttributeTable(measuresTable); 
+		measuresTable.clear();
+	}
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+
+bool TeGeoOpOverlayDifference(TeLayer* newLayer, TeTheme* theme1, 
+							  TeTheme* theme2, TeSelectedObjects selOb1, 
+							  TeSelectedObjects selOb2, TeAsciiFile* logFile)
+{
+	if((!newLayer) || (!theme1) || (!theme2))
+		return false;
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+		
+	TeLayer* layer1 = theme1->layer();
+	TeLayer* layer2 = theme2->layer();
+
+	unsigned int t;
+	vector<string> linkNames;
+	TeAttrTableVector vetTables;
+	if (layer1->getAttrTables(vetTables,TeAttrStatic))
+	{
+		for (t=0; t<vetTables.size(); ++t)
+			linkNames.push_back(vetTables[t].linkName());
+	}
+	vetTables.clear();
+	if (layer1->getAttrTables(vetTables,TeAttrEvent))
+	{
+		for (t=0; t<vetTables.size(); ++t)
+			linkNames.push_back(vetTables[t].linkName());
+	}
+
+	TeProjection* proj1 = layer1->projection();
+	TeProjection* proj2 = layer2->projection();
+
+	// querier to get the objects from theme 1
+	TeQuerierParams params1(true, true);
+	params1.setParams(theme1);
+	params1.setSelecetObjs(selOb1);
+	TeQuerier  querier1(params1); 
+
+	if(!querier1.loadInstances())
+		return false;				// there aren't objects on theme 1
+
+	// create the new attribute table with the attributes from theme 1 
+	// preserving the same link attribute
+	TeAttributeList attrList;
+	int npk=-1, aux1=0;
+	TeAttributeList theme1AttrList = querier1.getAttrList();
+	TeAttributeList::iterator it = theme1AttrList.begin();
+	while (it != theme1AttrList.end())
+	{
+		attrList.push_back(*it);
+		vector<string>::iterator it2 = find(linkNames.begin(), linkNames.end(), (*it).rep_.name_);
+		if (it2 != linkNames.end())
+			npk = aux1;
+		++it;
+		++aux1;
+	}
+
+	// change attribute names if necessary and create a new attribute table
+	changeAttrList(attrList);
+	attrList[0].rep_.isPrimaryKey_ = true;  
+	TeTable attrTable (newLayer->name(), attrList, attrList[npk].rep_.name_, attrList[npk].rep_.name_);
+	if(!newLayer->createAttributeTable(attrTable))
+       return false;
+
+	// ----- 
+
+	int numPolygons1 = querier1.numElemInstances();
+	if(TeProgress::instance())
+	{
+		string caption = "Overlay Difference";
+		string msg = "Executing Overlay Difference. Please, wait!";
+		TeProgress::instance()->setCaption(caption.c_str());
+		TeProgress::instance()->setMessage(msg);
+		TeProgress::instance()->setTotalSteps(numPolygons1);
+		t2 = clock();
+		t0 = t1 = t2;
+	}
+
+	double tol = TeGetPrecision(proj1);
+	TePrecision::instance().setPrecision(tol);
+
+	int steps = 0;
+	TeSTInstance elem1;
+	while(querier1.fetchInstance(elem1))	// for each object of theme 1
+	{
+		TePolygonSet polSet1;
+		if(!elem1.getGeometry(polSet1))
+			continue;
+
+		TePolygonSet resultAux;
+
+		// querier to the theme 2
+		TeQuerierParams params2(true,false);
+		params2.setParams(theme2);
+		params2.setSelecetObjs(selOb2);
+		params2.setSpatialRest(polSet1.box(), TeINTERSECTS, TeGEOMETRYNONE);
+
+		TeQuerier querier2(params2);
+		if(!querier2.loadInstances())
+		{
+			// there is no intersection between this object and the objects from theme 2
+			// so include the entire geometry of the object in the result
+			for (unsigned int i=0; i<polSet1.size(); ++i)
+				resultAux.add(polSet1[i]);
+		}
+		else
+		{
+			unsigned int m;
+			TePolygonSet polSet2;
+			TeSTInstance sti2;
+			vector<string> oids;
+			// build a polygon set with the representation of all objetcs from theme 2
+			// that intercepts current object of theme 1
+			while(querier2.fetchInstance(sti2))  
+			{
+				if(sti2.hasPolygons())
+				{
+					TePolygonSet polSetAux2;
+					sti2.getGeometry (polSetAux2);
+					if (!((*proj1) == (*proj2)))
+					{
+						TePolygonSet polySet2Out;
+						TeVectorRemap (polSetAux2, proj2, polySet2Out, proj1);
+						for (m=0; m<polySet2Out.size(); m++)
+							polSet2.add(polySet2Out[m]);
+					}
+					else
+					{
+						for (m=0; m<polSetAux2.size(); m++)
+							polSet2.add(polSetAux2[m]);
+					}
+					// keep track of the object ids for logging
+					oids.push_back(sti2.objectId());
+				}
+			}// for each intersection object of theme 2 
+
+			// try to recover the difference between the geometry of the current object
+			// from theme 1 and the geometries of the objects from theme 2 that intercept
+			// current object from theme 1
+			if(!TeOVERLAY::TeDifference(polSet1, polSet2, resultAux))
+			{
+				// when the operation returns false, writes in the error log file a possible
+				// inconsistency in the data
+				if (logFile)
+				{
+					string mess = "Possivel inconsistencia na diferenca do objeto ";
+					mess += polSet1.objectId();
+					mess += " do tema " + theme1->name() + " e ";
+					if (!oids.empty())
+						mess += oids[0];
+					for (m=1;m<oids.size();++m)
+						mess += ", " + oids[m];
+					mess += " do tema " + theme2->name();
+					logFile->writeString(mess);
+					logFile->writeNewLine();
+				}
+			} 
+		}
+		// save partial results
+		if (!resultAux.empty())
+		{
+			TeTableRow row;
+			TePropertyVector vecOverlay = elem1.getPropertyVector();
+
+			for (unsigned int p=0; p<vecOverlay.size();++p)
+				row.push_back(vecOverlay[p].value_);
+			attrTable.add(row);
+			row.clear();
+			for (unsigned int l=0; l <resultAux.size(); l++)
+				resultAux[l].objectId(vecOverlay[npk].value_);
+			newLayer->addPolygons(resultAux);
+		}
+		steps++;
+		t2 = clock();
+		if ((TeProgress::instance()) && (int(t2-t1) > dt))
+		{
+			t1 = t2;
+			if(TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			if((int)(t2-t0) > dt2)
+				TeProgress::instance()->setProgress(steps);
+		}
+		if((steps%100)==0)
+		{
+			newLayer->saveAttributeTable(attrTable); 
+			attrTable.clear();
+		}
+	} // for each object of theme 1
+
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	if(attrTable.size()>0)
+		newLayer->saveAttributeTable(attrTable); 
+
+	if(!newLayer->box().isValid())
+		return false;
+	return true;
+}
diff --git a/src/terralib/functions/TeGeoProcessingFunctions.h b/src/terralib/functions/TeGeoProcessingFunctions.h
new file mode 100644
index 0000000..748e896
--- /dev/null
+++ b/src/terralib/functions/TeGeoProcessingFunctions.h
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeGeoProcessingFunctions.h
+    This file contains functions to generate new layers from 
+	spatial operations among themes 
+*/
+
+#ifndef __TERRALIB_INTERNAL_GEOPROCESSING_H
+#define __TERRALIB_INTERNAL_GEOPROCESSING_H
+
+#include "TeDatabase.h" 
+
+class TeAsciiFile;
+
+bool TeGeoOpAggregation(TeLayer* newLayer, TeTheme* theme, vector<string> agregAttrVec, TeGroupingAttr& attrMM, TeSelectedObjects selOb, TeAsciiFile* logFile=0);		
+
+bool TeGeoOpAdd(TeLayer* newLayer, TeTheme* theme, TeThemeVector themeVec, TeSelectedObjects selObj = TeAll, TeAsciiFile* logFile=0);
+
+bool TeGeoOpOverlayIntersection(TeLayer* newLayer, TeTheme* theme, TeTheme* themeTrim, TeSelectedObjects selOb, TeSelectedObjects selObTrim, bool attrTrim, TeAsciiFile* logFile=0);
+
+bool TeGeoOpOverlayUnion(TeLayer* newLayer, TeTheme* theme, TeTheme* themeOverlay, TeSelectedObjects selOb, TeSelectedObjects selObOverlay, TeAsciiFile* logFile=0);
+
+bool TeGeoOpAssignDataLocationDistribute(TeTheme* themeMod, TeTheme* theme, const string& tableName, const int& spatialRelation);
+
+bool TeGeoOpAssignByLocationCollect(TeTheme* restrTheme, TeTheme* srcTheme, const string& newTableName, TeGroupingAttr& measuresColl, const int& spatialRelation);
+
+bool TeGeoOpOverlayDifference(TeLayer* newLayer, TeTheme* theme1, TeTheme* theme2, TeSelectedObjects selOb1, TeSelectedObjects selOb2, TeAsciiFile* logFile=0);
+
+#endif
+
diff --git a/src/terralib/functions/TeImportBNA.cpp b/src/terralib/functions/TeImportBNA.cpp
new file mode 100644
index 0000000..af5656c
--- /dev/null
+++ b/src/terralib/functions/TeImportBNA.cpp
@@ -0,0 +1,496 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <string>
+#include <iostream>
+#include <list>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+using namespace std;
+
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeAsciiFile.h"
+#include "TeException.h"
+#include "TeProjection.h"
+#include "TeAttribute.h"
+#include "TeTable.h"
+#include "TeAssertions.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+
+bool TeReadBNAObjects(TeAsciiFile& bnaFile, TeTable& attTable, TePointSet& ptSet,
+					  TeLineSet& lnSet, TePolygonSet& pSet, 
+					  int ncolumns, int nrecords, int delta, int attLinkColumnIndex);
+
+bool TeBNARegionDecode(TeAsciiFile& bnaFile, TePolygonSet& temp, string& index, const int& npoints);
+
+bool TeBNALineDecode(TeAsciiFile& bnaFile, TeLineSet& temp, string& index, const int& npoints);
+
+bool TeBNAPointDecode(TeAsciiFile& bnaFile, TePointSet& temp, string& index);
+
+
+
+TeLayer* TeImportBNA(const string& bnaFileName, TeDatabase* db, const string& layerName)
+{
+	if(!db || bnaFileName.empty()) 
+		return 0;
+
+	// check if format is complete (BNA file exist)
+	string filePrefix = TeGetName(bnaFileName.c_str());
+	string ftest = filePrefix + ".bna";
+	if(access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".BNA";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+
+	// found a valid layer name
+	string lName = layerName;
+
+	if(layerName.empty())
+		lName = TeGetBaseName(bnaFileName.c_str());	
+
+	string newLayerName = lName;
+
+	TeLayerMap& layerMap = db->layerMap();
+	TeLayerMap::iterator it;
+
+	bool flag = true;
+
+	int n = 1;
+
+	while(flag)
+	{
+		for(it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if(TeStringCompare(it->second->name(), newLayerName))
+				break;
+		}
+
+		if(it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = lName + "_" + Te2String(n);
+
+		n++;	
+	}
+
+	// Use no projection
+	TeLayer* newLayer = new TeLayer(newLayerName, db);
+
+	if(newLayer->id() <= 0)
+		return 0;				// couldn�t create new layer
+
+	TeAttributeList attList;
+
+	bool res = TeImportBNA(newLayer, bnaFileName, "", attList, 60);
+
+	if (res)
+		return newLayer;
+	else
+	{
+		db->deleteLayer(newLayer->id());
+
+		delete newLayer;
+
+		return 0;
+	}
+}
+
+bool TeImportBNA(TeLayer* layer, const string& bnaFileName, string attrTableName,
+				 TeAttributeList& attList, int unsigned chunkSize, const string& linkCol)
+{
+	if(chunkSize <= 0)
+		chunkSize = 1;
+
+	//-- Step 1: Read any adicional information (ex. projection) 
+	char separator = ',';
+
+
+	if(!TeReadBNAAttributeList(bnaFileName, attList))
+		return false;	// Attributelist read error
+
+
+	string linkColName = linkCol;
+
+	if(linkColName.empty())
+		linkColName = attList[0].rep_.name_;
+
+	int attLinkColumnIndex = 0;
+
+	for(unsigned int i = 0; i < attList.size(); ++i)
+	{
+		if(attList[i].rep_.name_ == linkColName)
+		{
+			attLinkColumnIndex = (int)i;
+			break;
+		}
+	}
+		
+
+	// define a TeAttributeTable
+	if (attrTableName.empty())
+	{
+		if (layer->name().empty())
+			return false;
+		else
+			attrTableName = layer->name();
+	}
+	
+	TeTable attTable(attrTableName, attList, linkColName, linkColName, TeAttrStatic);
+
+	attTable.setSeparator(separator);
+
+	// insert the table into the database
+	if(!layer->createAttributeTable(attTable))
+		return false;
+
+	int ncol = attList.size();
+
+	TeAsciiFile bnaFile(bnaFileName);
+
+	int delta = 0;
+
+	TePointSet ptSet;
+	TeLineSet lnSet;
+	TePolygonSet pSet;
+
+	while(TeReadBNAObjects(bnaFile, attTable, ptSet, lnSet, pSet, ncol, chunkSize, delta, attLinkColumnIndex))
+	{
+		// save table
+		if (!layer->saveAttributeTable( attTable ))
+		{
+			attTable.clear();
+			break;
+		}
+
+		// save the remaining geometries
+		if(ptSet.size() > 0)
+		{
+			layer->addPoints(ptSet); 
+			ptSet.clear();
+		}
+
+		if(lnSet.size() > 0)
+		{
+			layer->addLines(lnSet);
+			lnSet.clear();
+		}
+
+		if(pSet.size() > 0)
+		{
+			layer->addPolygons(pSet); 
+			pSet.clear();
+		}
+
+		delta += attTable.size();
+		
+		attTable.clear();
+	}	
+	return true;
+}
+
+
+bool TeReadBNAAttributeList(const string& bnaFileName, TeAttributeList& attList)
+{
+	TeAsciiFile bnaFile(bnaFileName);
+
+	if(!bnaFile.isNotAtEOF())
+		 return false;
+
+	vector<string> strList;
+
+	bnaFile.readStringListCSV(strList, ',');
+
+	unsigned int nFields = (strList.size() - 1u);
+
+	if(nFields <= 0)
+		return false;
+
+	if(attList.size() > 0u)	// Has already defined attributes, only check the number
+	{
+		if(attList.size() != nFields)
+			return false;
+		else
+			return true;
+	}
+
+	// In future, look for a better way to find the field name
+	// see in the specification of file format there is something about the field names!
+
+	TeAttribute at1;
+	at1.rep_.type_ = TeSTRING;
+	at1.rep_.numChar_ = 255;		
+	at1.rep_.name_ = "IBGE_CODE";
+	at1.rep_.isPrimaryKey_ = false;
+	attList.push_back(at1);
+
+	if(nFields > 1)
+	{
+		TeAttribute at2;
+		at2.rep_.type_ = TeSTRING;
+		at2.rep_.numChar_ = 255;		
+		at2.rep_.name_ = "IBGE_NAME";
+		at2.rep_.isPrimaryKey_ = false;
+		attList.push_back(at2);
+	}
+
+	for(unsigned int i = 2; i < nFields; ++i)
+	{
+		TeAttribute at;
+		at.rep_.type_ = TeSTRING;
+		at.rep_.numChar_ = 255;		
+		at.rep_.name_ = string("FIELD_") + Te2String(i);
+		at.rep_.isPrimaryKey_ = false;
+		attList.push_back(at);
+	}
+
+	return true;
+}
+
+
+bool TeReadBNAObjects(TeAsciiFile& bnaFile, TeTable& attTable, TePointSet& ptSet,
+					  TeLineSet& lnSet, TePolygonSet& pSet, 
+					  int ncolumns, int nrecords, int /* delta */, int attLinkColumnIndex)
+{
+	if (!bnaFile.isNotAtEOF() || nrecords <=0 || ncolumns <= 0)
+		return false;
+
+	char separator = attTable.separator();
+
+	int count;
+
+	for(count=0; count < nrecords; ++count)
+	{
+		if(!bnaFile.isNotAtEOF())
+			 break;
+
+		// Ler os atributos do objeto e o tipo/tamanho da geometria
+
+		TeTableRow row;
+
+
+		for(int n = 0; n < ncolumns; ++n)
+		{
+			string value;
+
+			try 
+			{
+				value = bnaFile.readStringCSVNoQuote(separator);
+			}
+			catch(...)
+			{
+				if(count > 0)
+					return true;
+				else
+					return false;
+			}
+
+			row.push_back (value);
+		}
+
+		attTable.add(row);
+
+		string bnaGeometryTypeLen = bnaFile.readStringCSVNoQuote(separator);
+
+		int bnaGTypeLen = atoi(bnaGeometryTypeLen.c_str());
+
+		string index = row[attLinkColumnIndex];
+
+		// Go to the geometry line begin
+		bnaFile.findNewLine();
+
+		if(bnaGTypeLen > 2)
+		{
+			if(!TeBNARegionDecode(bnaFile, pSet, index, bnaGTypeLen))
+				return false;
+		}
+		else if(bnaGTypeLen < -1)
+		{
+			if(!TeBNALineDecode(bnaFile, lnSet, index, -bnaGTypeLen))
+				return false;
+		}
+		else if(bnaGTypeLen == 1)
+		{
+			if(!TeBNAPointDecode(bnaFile, ptSet, index))
+				return false;
+		}
+		else
+			return false;
+
+		bnaFile.findNewLine();
+	}
+
+	return true;
+}
+
+bool TeBNARegionDecode(TeAsciiFile& bnaFile, TePolygonSet& temp, string& index, const int& npoints)
+{
+	int i;
+	unsigned int j;
+
+	vector<TePolygon> pVec;
+	TeLine2D l;
+
+	TeCoord2D coordMainArea;
+	TeCoord2D firstCoord;
+	bool first = false;
+
+	for(i = 0; i < npoints; ++i)
+	{
+		if(!bnaFile.isNotAtEOF())
+			return false;
+
+		double x = bnaFile.readFloat();
+		bnaFile.readChar();
+		double y = bnaFile.readFloat();
+
+		//bnaFile.findNewLine();
+
+		TeCoord2D c(x, y);
+
+		if(i == 0)
+		{
+			coordMainArea.setXY(x, y);
+			firstCoord = coordMainArea;
+			first = false;
+			l.add(c);
+		}
+		else
+		{
+			if(c == firstCoord)
+			{
+				l.add(c);
+				l.objectId(index);
+				TeLinearRing r(l);
+				r.objectId(index);
+				TePolygon p;
+				p.add(r);
+				p.objectId(index);
+
+				if(pVec.size() == 0)
+					pVec.push_back(p);
+				else
+				{
+					for(j = 0; j < pVec.size(); ++j)
+					{						
+						if(TeWithin(p, pVec[j]))
+						{
+							pVec[j].add(p[0]);
+							break;
+						}		
+						
+					}
+
+					if(j == pVec.size())
+						pVec.push_back(p);
+				}
+
+				// Make new line - Don't clear!
+				l = TeLine2D();
+
+				first = true;
+
+			}
+			else if(c == coordMainArea)
+			{
+				continue;
+			}
+			else
+			{
+				if(first)
+				{
+					firstCoord = c;
+					first = false;
+				}
+
+				l.add(c);
+			}
+		}
+	}
+
+	for(unsigned int k = 0; k < pVec.size(); ++k)
+		temp.add(pVec[k]);
+
+
+	return true;
+}
+
+bool TeBNALineDecode(TeAsciiFile& bnaFile, TeLineSet& temp, string& index, const int& npoints)
+{
+	TeLine2D l;
+
+	l.objectId(index);
+
+	for(int i = 0; i < npoints; ++i)
+	{
+		if(!bnaFile.isNotAtEOF())
+			return false;
+
+		double x = bnaFile.readFloat();
+		bnaFile.readChar();
+		double y = bnaFile.readFloat();
+
+		//bnaFile.findNewLine();
+
+		TeCoord2D c(x, y);
+
+		l.add(c);
+	}
+
+	temp.add(l);
+
+	return true;
+}
+
+bool TeBNAPointDecode(TeAsciiFile& bnaFile, TePointSet& temp, string& index)
+{
+	if(!bnaFile.isNotAtEOF())
+		return false;
+
+	double x = bnaFile.readFloat();
+	bnaFile.readChar();
+	double y = bnaFile.readFloat();
+
+	//bnaFile.findNewLine();
+
+	TeCoord2D c(x, y);
+
+	TePoint pt(c);
+
+	pt.objectId(index);
+
+	temp.add(pt);
+
+	return true;
+}
diff --git a/src/terralib/functions/TeImportDBF.cpp b/src/terralib/functions/TeImportDBF.cpp
new file mode 100644
index 0000000..6183545
--- /dev/null
+++ b/src/terralib/functions/TeImportDBF.cpp
@@ -0,0 +1,442 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <string>
+#include <iostream>
+
+#include "shapefil.h"
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeProgress.h"
+#include "TeDatabase.h"
+
+//! Fills a vector with the values of choosen column named , to be used as object identifications
+/*!
+	\param dbfFileName DBF file name
+	\param indexes a vector that has the identification of the objects
+	\param objectIdAttr name of the attribute that has the identification of objects
+	\note if no objectIdAttr is provided or there is no column with this name return
+	an incremental sequence of numbers.
+*/
+void TeReadDBFIndexes(const string& dbfFileName, vector<string>& indexes, const string objectIdAttr="");
+
+
+bool TeReadDBFAttributeList ( const string& dbfFileName, TeAttributeList& attList )
+{
+	string filePrefix = TeGetName (dbfFileName.c_str()) ;
+	string fileName = filePrefix + ".dbf";
+
+/* -------------------------------------------------------------------- */
+/*      Open the file.                                                  */
+/* -------------------------------------------------------------------- */
+    DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+    if( hDBF == NULL )
+    {
+			throw TeException ( UNABLE_TO_OPEN_DBF_FILE );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*	If there is no data in this file let the user know.		*/
+/* -------------------------------------------------------------------- */
+    if( DBFGetFieldCount(hDBF) == 0 )
+    {
+			throw TeException ( NO_DATA_IN_DBF_FILE );
+    }
+
+/* -------------------------------------------------------------------- */
+/*	Get Attributes header definitions.									*/
+/* -------------------------------------------------------------------- */
+	TeAttribute attribute;
+    
+	char	szTitle[12];
+	int		nWidth, nDecimals;
+	int 	i;
+
+	vector<string> names;
+
+	for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+    {
+		DBFFieldType	eType = DBFGetFieldInfo( hDBF, i, szTitle, &nWidth, &nDecimals );
+
+		string atname = TeConvertToUpperCase(szTitle);
+	
+		vector<string>::iterator it = find(names.begin(),names.end(),atname);
+		if (it != names.end())
+		{
+			string newname = atname + "_" + Te2String(i);
+			int c = i+1;
+			while (true)
+			{
+				it = find(names.begin(),names.end(),newname);
+				if (it == names.end())
+					break;
+				newname = atname + "_" + Te2String(c);
+				++c;
+			}
+			atname = newname;
+		}
+		names.push_back(atname);
+		attribute.rep_.name_ = atname;
+
+        if( eType == FTDate )
+		{
+			attribute.rep_.type_     = TeDATETIME;
+			attribute.dateChronon_   = TeDAY;
+			attribute.dateTimeFormat_ = "YYYYMMDD";
+			attribute.dateSeparator_ = 'c';
+		}
+        else if( eType == FTString )
+		{
+			attribute.rep_.type_     = TeSTRING;
+			attribute.rep_.numChar_  = nWidth;
+		}
+		else if( eType == FTInteger )
+		{
+			if (nWidth > 9)
+			{
+				attribute.rep_.type_ = TeREAL;
+				attribute.rep_.numChar_ = nWidth;
+				attribute.rep_.decimals_ = 0;
+			}
+			else
+			{
+				attribute.rep_.type_ = TeINT;
+				attribute.rep_.numChar_ = nWidth;
+			}
+		}
+        else if( eType == FTDouble )
+		{
+            attribute.rep_.type_ = TeREAL;
+			attribute.rep_.numChar_ = nWidth;
+			attribute.rep_.decimals_ = nDecimals;
+		}
+
+		// keep track of the index name
+
+		attList.push_back ( attribute );
+    }
+	names.clear();
+    DBFClose( hDBF );
+	return true;
+}
+
+
+bool TeImportDBFTable(const string& dbFileName,TeDatabase* db, TeLayer* layer,TeAttrTableType tableType, string objectIdAtt)
+{
+	if (!db || dbFileName.empty())
+		return false;
+
+    DBFHandle hDBF = DBFOpen(dbFileName.c_str(), "rb" );
+    if( hDBF == NULL )
+		return false;
+
+	string tabName = TeGetBaseName(dbFileName.c_str());
+	int n=0;
+	while (db->tableExist(tabName))
+	{
+		tabName = TeGetBaseName(dbFileName.c_str()) + "_" + Te2String(n);
+		n++;
+	}
+	TeAttributeList attList;
+	TeReadDBFAttributeList (dbFileName, attList);
+
+	if (objectIdAtt.empty())
+		objectIdAtt = "object_id_";
+
+	// check if object id column is already in the list
+	unsigned int j;
+	for (j=0; j<attList.size(); j++)
+	{
+		if ( TeConvertToUpperCase(objectIdAtt) ==  TeConvertToUpperCase(attList[j].rep_.name_))
+		{
+			objectIdAtt = TeConvertToUpperCase(attList[j].rep_.name_);
+			attList[j].rep_.name_ =  objectIdAtt;
+			if (attList[j].rep_.type_ != TeSTRING)
+			{
+				attList[j].rep_.type_ = TeSTRING;
+				attList[j].rep_.numChar_ = 255;
+			}
+			attList[j].rep_.isPrimaryKey_ = true;
+			break;
+		}
+	}
+
+	// if not found create one automatically
+	bool createObjId = false;
+	if (j==attList.size())
+	{
+		TeAttribute at;
+		at.rep_.type_ = TeSTRING;
+		at.rep_.numChar_ = 16;
+		at.rep_.name_ = objectIdAtt;
+		at.rep_.isPrimaryKey_ = true;
+		attList.push_back(at);
+		createObjId = true;
+	}
+
+	if (!db->createTable(tabName,attList))
+	{
+	    DBFClose(hDBF);
+		return false;
+	}
+
+	TeTable table(tabName);
+	table.setAttributeList(attList);
+	table.setUniqueName(objectIdAtt);
+	if (layer)
+		table.setTableType(tableType);
+	else
+		table.setTableType(TeAttrExternal);
+
+	int nrec = DBFGetRecordCount(hDBF);
+	if (TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(nrec);
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	t2 = clock();
+	t0 = t1 = t2;
+	int iRecord;
+	for (iRecord = 0; iRecord < nrec; iRecord++)
+    {
+		TeTableRow row;
+		int i;
+		for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+		{
+			string value =  DBFReadStringAttribute(hDBF, iRecord, i);
+			row.push_back ( value ); // inserts a value into the row
+		}
+		if (createObjId)
+			row.push_back(Te2String(iRecord));
+		table.add(row); 
+		if ((iRecord+1 % 100) == 0)
+		{
+			if (!db->insertTable(table))
+			{
+				DBFClose( hDBF );
+				table.clear();
+				if (TeProgress::instance())
+					TeProgress::instance()->reset();		
+				return false;
+			}
+			table.clear();
+			if (TeProgress::instance())
+			{
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					if (TeProgress::instance()->wasCancelled())
+						break;
+					if ((int)(t2-t0) > dt2)
+						TeProgress::instance()->setProgress(iRecord);
+				}
+			}
+		}
+    }
+	if (table.size() > 0)
+	{
+		db->insertTable(table);
+		table.clear();
+	}
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();		
+    DBFClose( hDBF );
+	if (iRecord == 0)
+		return false;
+	if (layer)
+		db->insertTableInfo(layer->id(),table);
+	else
+		db->insertTableInfo(0,table);
+
+	return true;
+}
+
+void TeReadSHPAttributes (const string& dbfFileName, TeTable& table)
+{
+	string filePrefix = TeGetName (dbfFileName.c_str()) ;
+	string fileName = filePrefix + ".dbf";
+
+/* -------------------------------------------------------------------- */
+/*	Get Attributes definitions.											*/
+/* -------------------------------------------------------------------- */
+	TeAttributeList attList;
+	TeReadDBFAttributeList ( fileName, attList );
+	table.setAttributeList( attList );
+
+/* -------------------------------------------------------------------- */
+/*      Open the file.                                                  */
+/* -------------------------------------------------------------------- */
+    DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+    if( hDBF == NULL )
+    {
+			throw TeException ( UNABLE_TO_OPEN_DBF_FILE, fileName, true );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*	If there is no data in this file let the user know.		*/
+/* -------------------------------------------------------------------- */
+    if( DBFGetFieldCount(hDBF) == 0 )
+    {
+			throw TeException ( NO_DATA_IN_DBF_FILE, fileName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*	Read all the records 						                        */
+/* -------------------------------------------------------------------- */
+	for( int iRecord = 0; iRecord < DBFGetRecordCount(hDBF); iRecord++ )
+    {
+		TeTableRow row;
+		int 	i;
+
+		for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+		{
+			string value =  DBFReadStringAttribute( hDBF, iRecord, i ) ;
+			row.push_back ( value ); // inserts a value into the row
+		}
+		table.add ( row ); // adds a row to a table
+    }
+    DBFClose( hDBF );
+}
+
+
+bool TeReadDBFAttributes (const string& dbfFileName, TeTable& table, 
+						  int nrecords, int rinitial, bool createAuto)
+{
+	string filePrefix = TeGetName (dbfFileName.c_str()) ;
+	string fileName = filePrefix + ".dbf";
+
+// -------------------------------------------------------------------- 
+//      Open the file.                                                  
+// -------------------------------------------------------------------- 
+    DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+    if( hDBF == NULL )
+    {
+			throw TeException ( UNABLE_TO_OPEN_DBF_FILE, fileName, true );
+    }
+    
+// -------------------------------------------------------------------- 
+//	If there is no data in this file let the user know.		
+// -------------------------------------------------------------------- 
+    if( DBFGetFieldCount(hDBF) == 0 )
+    {
+			throw TeException ( NO_DATA_IN_DBF_FILE, fileName );
+    }
+
+	if (rinitial >= DBFGetRecordCount(hDBF))
+		return false;
+
+	if (nrecords < 1 || nrecords > DBFGetRecordCount(hDBF))
+		nrecords = DBFGetRecordCount(hDBF);
+
+// -------------------------------------------------------------------- 
+//	Read all the records 						                        
+// -------------------------------------------------------------------- 
+	int count = 0;
+	for( int iRecord = rinitial; (iRecord < DBFGetRecordCount(hDBF) && count < nrecords); iRecord++ )
+    {
+		TeTableRow row;
+		int 	i;
+		for( i = 0; i < DBFGetFieldCount(hDBF); i++ )
+		{
+			string value =  DBFReadStringAttribute( hDBF, iRecord, i ) ;
+			row.push_back ( value ); // inserts a value into the row
+		}
+		
+		// if asked create a auto number extra column at the end
+		if (createAuto)
+			row.push_back(Te2String(iRecord));
+
+		table.add ( row ); // adds a row to a table
+		count++;
+    }
+    DBFClose( hDBF );
+	if (count > 0)
+		return true;
+	return false;
+}
+
+void
+TeImportDBFIndexes(const string& shpFileName, vector<string>& indexVect, const string objectIdAttr )
+{
+	string filePrefix = TeGetName(shpFileName.c_str());
+	string fileName = filePrefix + ".dbf";
+
+/* -------------------------------------------------------------------- */
+/*	Get index position.													*/
+/* -------------------------------------------------------------------- */
+	int i=0, indexPos=-1;
+
+	if (!objectIdAttr.empty())
+	{
+		TeAttributeList attList;
+		TeReadDBFAttributeList ( fileName, attList );
+		TeAttributeList::iterator it = attList.begin();
+		while ( it != attList.end() )
+		{
+			TeAttribute att = *it;
+			if (TeConvertToUpperCase(att.rep_.name_) == TeConvertToUpperCase(objectIdAttr))
+			{
+				indexPos = i;
+				break;
+			}
+			it++;
+			i++;
+		}
+	}
+
+/* -------------------------------------------------------------------- */
+/*      Open the file.                                                  */
+/* -------------------------------------------------------------------- */
+    DBFHandle hDBF = DBFOpen( fileName.c_str(), "rb" );
+    if( hDBF == NULL )
+    {
+			throw TeException ( UNABLE_TO_OPEN_DBF_FILE, fileName, true );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*	If there is no data in this file let the user know.		*/
+/* -------------------------------------------------------------------- */
+	int nRecords = DBFGetFieldCount(hDBF);
+    if( nRecords  == 0 )
+    {
+			throw TeException ( NO_DATA_IN_DBF_FILE, fileName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*	Read all the records 						                        */
+/* -------------------------------------------------------------------- */
+    
+	for( int iRecord = 0; iRecord < nRecords; iRecord++ )
+	{
+		if (indexPos == -1)
+			indexVect.push_back (Te2String(iRecord+1)); 
+		else
+			indexVect.push_back ( DBFReadStringAttribute( hDBF, iRecord, indexPos ) );
+	}
+
+    DBFClose( hDBF );
+}
diff --git a/src/terralib/functions/TeImportExport.h b/src/terralib/functions/TeImportExport.h
new file mode 100644
index 0000000..1a6cadf
--- /dev/null
+++ b/src/terralib/functions/TeImportExport.h
@@ -0,0 +1,274 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeImportExport.h
+    This file contains functions to deal with the importing/exporting
+	of geographical data to and from  a TerraLib database in usual
+	formats
+*/
+#ifndef __TERRALIB_INTERNAL_IMPORTEXPORT_H
+#define __TERRALIB_INTERNAL_IMPORTEXPORT_H
+
+#include "TeTable.h"
+#include "TeBox.h"
+#include "TeDataTypes.h"
+
+#include <string>
+using namespace std;
+
+class TeLayer;
+class TeSPRFile;
+class TeAsciiFile;
+class TeProjection;
+class TeDatabase;
+
+/** @defgroup ImpExp Importing and Exporting Functions
+ *  TerraLib importing and exporting functions
+ *  @{
+ */
+
+/** @defgroup MIDMIF Functions to deal with MID/MIF format
+ *  @ingroup ImpExp
+ *  Functions related to MID MIF format
+ *  @{
+ */
+ 
+/*!	\fn TeLayer* TeImportMIF(const string& mifFileName, TeDatabase* db, const string& layerName="")
+	\brief Imports a geo data in MID/MIF format to a TerraLib database
+	\param mifFileName MIF file name
+	\param db pointer to a TerraLib database
+	\param layerName name of the layer that will contain the data (optional)
+	\return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportMIF(const string& mifFileName, TeDatabase* db, const string& layerName="");
+
+/*!	\fn bool TeImportMIF(TeLayer* layer, const string& mifFileName, string attrTableName="", string objectIdAttr="", int unsigned chunkSize = 60)
+	\brief Imports a MID/MIF file to a specific layer TerraLib
+	\param layer pointer to a layer
+	\param mifFileName MIF file name
+	\param objectIdAttr name of the attribute that has the identification of objects
+	\param attrTableName the name that the attribute table will be saved
+	\param chunkSize the number of objects in memory before save them in the layer
+	\return TRUE if the data was imported successfully and FALSE otherwise
+*/
+bool TeImportMIF(TeLayer* layer, const string& mifFileName, string attrTableName="",  
+				 string objectIdAttr="", int unsigned chunkSize = 60);
+
+/*!	\fn void TeReadMIFAttributeList(const string& mifFileName, TeAttributeList& attList)
+	\brief Reads the attributes definition of a data in MID/MIF format
+*/
+void TeReadMIFAttributeList(const string& mifFileName, TeAttributeList& attList);
+
+/*!	\fn TeProjection* TeReadMIFProjection(const string& mifFileName)
+	\brief Reads the geographical projection of a data in MID/MIF format
+*/
+TeProjection* TeReadMIFProjection(const string& mifFileName);
+
+/*!\fn bool TeExportMIF (TeLayer* layer, const string& mifFileName, const string& tableName)
+   \brief Exports a layer in a TerraLib database to a file in MID/MIF format
+   \param layer pointer to the layer
+   \param mifFileName name of the output MID/MIF file
+   \param tableName name of the attribute table to be exported
+   \return TRUE if the data was successfully exported and FALSE otherwise
+*/
+bool TeExportMIF (TeLayer* layer, const string& mifFileName, const string& tableName);
+
+/** @} */ // End of subgroup MID/MIF format
+
+/** @defgroup SPR Functions to deal with SPRING GEO/TAB format
+ *  @ingroup ImpExp
+ *  Functions related to SPRING format
+ *  @{
+ */ 
+/*!	\fn TeLayer* TeImportGEO(const string& geoFileName, TeDatabase* db, const string& layerName="")
+	\brief Imports a geo data in SPRING geo/tab format to a TerraLib database
+	\param geoFileName GEO/TAB file name
+	\param db pointer to a TerraLib database
+	\param layerName name of the layer that will contain the data (optional)
+	\return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportGEO(const string& geoFileName, TeDatabase* db, const string& layerName="");
+
+/*! \fn bool TeImportGEO(TeLayer* layer, const string& geoFileName, string attrTableName="", unsigned int chunkSize=60)
+	\brief Import a GEO/TAB data to a layer TerraLib
+    \param layer pointer to a layer
+	\param geoFileName GEO/TAB file name
+	\param attrTableName the name that the attribute table will be saved
+	\param chunkSize the number of objects in memory before save them in the layer
+*/
+bool TeImportGEO(TeLayer* layer, const string& geoFileName, string attrTableName="", unsigned int chunkSize=60);
+
+/*! \fn TeReadGeoAttributeList(const string& geoFileName,TeAttributeList& attList, string& labelName )
+    \brief Reads the list of attributes  of GEO/TAB file
+	\param geoFileName  DBF input file name
+	\param attList returns the DBF list of attributes
+	\param labelName returns the name of the column that is the link with geometries
+	\return TRUE if the list of attributes were was successfully read and FALSE otherwise
+*/
+void TeReadGeoAttributeList(const string& geoFileName,TeAttributeList& attList, string& labelName );
+
+/*! \fn TeExportSPR(TeLayer* layer, const string& sprFileName, const string& tableName, TeSpringModels cat, const string& name);
+	\brief Exports a layer in a TerraLib database to a file in ASCII SPRING format
+    \param layer pointer to the layer
+    \param sprFileName name of the output SPRING file
+    \param tableName name of the attribute table to be exported
+    \param cat Spring category
+	\param name name of the column that has label or class identifier
+    \return TRUE if the data was successfully exported and FALSE otherwise
+    \note Parameter 'name' is the Object name if exporting to categories Cadastral or Network .
+   Is the name of the column that has the quote value if Numeric category or the name
+   of the column that has the class information if category Thematic.
+*/
+bool TeExportSPR(TeLayer* layer, const string& sprFileName, const string& tableName, 
+			 TeSpringModels cat, const string& name);
+/** @} */ // End of subgroup SPRING format
+
+/** @defgroup DBF Functions to deal with DBF tables
+ *  @ingroup ImpExp
+ *  Functions related to DBF table format
+ *  @{
+ */
+
+/*! \fn bool TeReadDBFAttributeList(const string& dbfFileName, TeAttributeList& attList)
+   \brief Reads the list of attributes specified in DBF file 
+   \param dbfFileName  DBF input file name
+   \param attList returns the DBF list of attributes
+   \return TRUE if the list of attributes were was successfully read and FALSE otherwise
+*/
+bool TeReadDBFAttributeList(const string& dbfFileName, TeAttributeList& attList);
+
+/*! \fn bool TeReadDBFAttributes (const string& dbfFileName, TeTable& table, int nrecords=-1, int rinitial=0, bool createAuto=false)
+	\brief Reads a set of records from a shapelib to a structure in memory
+	\param dbfFileName DBF file name
+	\param table returns the set of records in memory
+	\param nrecords number of records to be read
+	\param rinitial number of the initial record
+	\param createAuto  flag used to indicate if an auto number columns should be added to each record
+*/
+bool TeReadDBFAttributes (const string& dbfFileName, TeTable& table, 
+						  int nrecords=-1, int rinitial=0, bool createAuto=false);
+
+/*! \fn bool TeImportDBFTable(const string& dbfFileName, TeDatabase* db, TeLayer* layer=0,TeAttrTableType tableType=TeAttrExternal)
+	\brief Imports a DBF table to a TerraLib database
+	This function imports a DBF to a TerraLib database. An attribute table can be associated to a
+	particular layer, or as an external table that will be linked to any layer when genereated a 
+	theme. A column called object_id_ will be added with unique values automatically generated.
+	\param dbfFileName DBF file name
+	\param db pointer to a TerraLib database
+	\param layer pointer to a layer to which the table will associated
+	\param tableType type of the attribute table
+*/
+bool TeImportDBFTable(const string& dbfFileName, TeDatabase* db, TeLayer* layer=0,TeAttrTableType tableType=TeAttrExternal, string objectIdAtt = "object_id_");
+
+/** @} */ // End of subgroup DBF format
+
+/** @defgroup SHP Functions to deal with Shapefile format
+ *  @ingroup ImpExp
+ *  Functions related to Shapefile format. Uses some functions related to DBF attribute table format.
+ *  @{
+ */ 
+/*!	\fn TeLayer* TeImportShape(const string& shpFileName, TeDatabase* db, const string& layerName="")
+	\brief Imports a geo data in a shapefile format to a TerraLib database
+	\param shpFileName Shapefile name
+	\param db pointer to a TerraLib database
+	\param layerName name of the layer that will contain the data (optional)
+	\return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportShape(const string& shpFileName, TeDatabase* db, const string& layerName="");
+
+/*! \fn bool TeImportShape (TeLayer* layer, const string& shpFileName, string attrTableName="",string objectIdAttr="", unsigned int  chunkSize = 60)
+	\brief Import a shapefile to a layer TerraLib
+	\param layer pointer to a layer
+	\param shpFileName shapefile file name
+	\param attrTableName the name that the attribute table will be saved
+	\param objectIdAttr name of the attribute that has the identification of objects
+	\param chunkSize the number of objects in memory before save them in the layer
+*/
+bool TeImportShape (TeLayer* layer, const string& shpFileName, string attrTableName="",  
+					string objectIdAttr="", unsigned int  chunkSize = 60);
+
+/*! \fn bool TeExportShapefile(TeLayer* layer, const string& shpFileName, const string& tableName)
+   \brief Exports a layer in a TerraLib database to a file in MID/MIF format
+   \param layer pointer to the layer
+   \param shpFileName name of the output shapefile
+   \param tableName name of the attribute table to be exported
+   \return TRUE if the data was successfully exported and FALSE otherwise
+*/
+bool TeExportShapefile(TeLayer* layer, const string& shpFileName, const string& tableName);
+/** @} */ // End of subgroup SHAPEFILE format
+
+/** @defgroup BNA Functions to deal with BNA format
+ *  @ingroup ImpExp
+ *  Functions related to BNA format (Atlas GIS BNA)
+ *  @{
+ */
+ 
+/*!	\fn TeLayer* TeImportBNA(const string& bnaFileName, TeDatabase* db, const string& layerName="")
+	\brief Imports a geo data in BNA format to a TerraLib database
+	\param bnaFileName BNA file name
+	\param db pointer to a TerraLib database
+	\param layerName name of the layer that will contain the data (optional)
+	\return a pointer to created layer if the data was imported successfully and 0 otherwise
+*/
+TeLayer* TeImportBNA(const string& bnaFileName, TeDatabase* db, const string& layerName="");
+
+/*!	\fn bool TeImportBNA(TeLayer* layer, const string& bnaFileName, string attrTableName="", string objectIdAttr="", int unsigned chunkSize = 60)
+	\brief Imports a BNA file to a specific layer TerraLib
+	\param layer pointer to a layer
+	\param bnaFileName BNA file name
+	\param attrTableName the name that the attribute table will be saved
+	\param attList List of attribute of the bna file, used only to name the fields
+	\param chunkSize the number of objects in memory before save them in the layer
+	\return TRUE if the data was imported successfully and FALSE otherwise
+*/
+bool TeImportBNA(TeLayer* layer, const string& bnaFileName, string attrTableName,  
+				 TeAttributeList& attList, int unsigned chunkSize, const string& linkCol = "");
+
+/*!	\fn bool TeReadBNAAttributeList(const string& bnaFileName, TeAttributeList& attList)
+	\brief Reads the attributes definition of a data in BNA format if attList is empty or says if attList size is coorect
+*/
+bool TeReadBNAAttributeList(const string& bnaFileName, TeAttributeList& attList);
+
+/** @} */ // End of subgroup BNA format
+
+/** \example ImportExample1.cpp
+ * This is an example of how to import geographical data in MID/MIF format
+ */
+
+/** \example ImportExample2.cpp
+ * This is an example of how to import geographical data in shapefile format
+ */
+
+/** \example ImportExample3.cpp
+ * This is an example of how to import a DBF table
+ */
+
+/** \example ImportExample4.cpp
+ * This is an example of how to import geographical data in SPRING GEO/TAB format
+ */
+
+
+/** @} */ // End of group ImpExp format
+
+#endif
+
diff --git a/src/terralib/functions/TeImportGeo.cpp b/src/terralib/functions/TeImportGeo.cpp
new file mode 100644
index 0000000..a1ec105
--- /dev/null
+++ b/src/terralib/functions/TeImportGeo.cpp
@@ -0,0 +1,455 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// STL 
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <map>
+
+using namespace std;
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+// TerraLib
+
+#include "TeImportExport.h"
+
+#include "TeAsciiFile.h"
+#include "TeBox.h"
+#include "TeLayer.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeDatabase.h"
+
+//! Import only the attributes of a GEO/TAB data to a layer TerraLib
+/*!
+	\param layer pointer to a layer
+	\param geoFileName GEO/TAB file name
+	\param attrTableName the name that the attribute table will be saved
+	\param objectIdAttr name of the attribute that has the identification of objects
+	\param chunckSize the number of objects in memory before save them in the layer
+*/
+bool TeImportGeoAttributes(TeLayer* layer, const string& geoFileName, string attrTableName="", unsigned int chunckSize=60);
+
+//! Import only the geometries of a GEO/TAB data to a layer TerraLib
+/*!
+	\param layer pointer to a layer
+	\param geoFileName GEO/TAB file name
+	\param chunckSize the number of objects in memory before save them in the layer
+*/
+bool TeImportGeoGeometries(TeLayer* layer, const string& geoFileName, unsigned int chunckSize=60);
+
+TeLayer* 
+TeImportGEO(const string& geoFileName, TeDatabase* db, const string& layerName)
+{
+	if (!db || geoFileName.empty()) 
+		return 0;
+
+	// check if format is complete (GEO e TAB files exist)
+	string filePrefix = TeGetName(geoFileName.c_str());
+	string ftest = filePrefix + ".geo";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".GEO";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+	ftest = filePrefix + ".tab";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".TAB";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+
+	// found a valid layer name
+	string lName;
+	string baseName = TeGetBaseName(geoFileName.c_str());
+	if (layerName.empty())
+		lName = baseName;
+	else
+		lName = layerName;
+
+	string newLayerName = lName;
+	TeLayerMap& layerMap = db->layerMap();
+	TeLayerMap::iterator it;
+	bool flag = true;
+	int n = 1;
+	while (flag)
+	{
+		for (it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if (TeStringCompare(it->second->name(),newLayerName))
+				break;
+		}
+		if (it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = lName + "_" +Te2String(n);
+		n++;	
+	}
+
+	// find projection
+	TeLayer* newLayer = new TeLayer(newLayerName,db);
+	if (newLayer->id() <= 0 )
+		return 0;				// couldn�t create new layer
+
+	bool res = TeImportGEO(newLayer,geoFileName);
+	if (res)
+		return newLayer;
+	else
+	{
+		db->deleteLayer(newLayer->id());
+		delete newLayer;
+		return 0;
+	}
+}
+
+bool 
+TeImportGEO(TeLayer* layer, const string& geoFileName, string attrTableName, unsigned int chunckSize)
+{
+	// Import the attribute table in chuncks
+	if (!TeImportGeoAttributes (layer,geoFileName,attrTableName,chunckSize))
+		return false;
+
+	//Import the geometries
+	return TeImportGeoGeometries (layer,geoFileName,chunckSize);
+}
+
+void
+TeReadGeoAttributeList(const string& geoFileName,TeAttributeList& attList, string& labelName )
+{
+	string filePrefix = TeGetName (geoFileName.c_str()) ;
+	string fileName = filePrefix + ".tab";
+	try
+	{
+		TeAsciiFile	pFile (fileName);
+		string name ;
+
+		name = pFile.readString();	// "LABEL"
+		pFile.findNewLine();
+		name = pFile.readString();	// Spring category
+		labelName = pFile.readString();	// label name
+
+		while ( pFile.isNotAtEOF() && name != "SEPARATOR" )
+			name = pFile.readString ();
+
+		char separator = ',';
+		if ( name == "SEPARATOR" )
+		{
+			separator = pFile.readString ().c_str()[0];
+		}
+		pFile.findNewLine();
+
+		TeAttribute attribute;
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readStringCSVNoSpace (separator);
+			if ( name == "INFO_END" )
+				break;
+
+			attribute.rep_.name_ = name;
+
+			name = pFile.readStringCSVNoSpace (separator);
+			if (name == "TEXT")
+				attribute.rep_.type_ = TeSTRING;
+			else if (name == "INTEGER")
+				attribute.rep_.type_ = TeINT;
+			else if (name == "TeDATETIME")
+					attribute.rep_.type_  = TeDATETIME;
+			else if (name == "REAL")
+				attribute.rep_.type_  = TeREAL;
+			else
+				attribute.rep_.type_  = TeUNKNOWN;
+
+			int size = pFile.readIntCSV (separator);
+			attribute.rep_.numChar_ = size;
+
+			attList.push_back ( attribute );
+			pFile.findNewLine();
+		}
+	}
+	catch(...)
+	{
+		return;
+	}
+}
+
+bool 
+TeImportGeoAttributes(TeLayer* layer,const string& geoFileName, string attrTableName, unsigned  int chunckSize)
+{
+	string filePrefix = TeGetName (geoFileName.c_str()) ;
+	string fileName = filePrefix + ".tab";
+
+	// Read attribute list information and key field name
+	TeAttributeList attList;
+	string linkName;
+	TeReadGeoAttributeList(geoFileName,attList,linkName);
+
+	if (attrTableName.empty())
+	{
+		if (layer->name().empty())
+			return false;
+		else
+			attrTableName = layer->name();
+	}
+
+	// check if given index is valid
+	TeAttributeList::iterator it = attList.begin();
+	int i = -1, j=0;
+	while (it != attList.end())
+	{
+		if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(linkName))		// index found
+		{
+			if ((*it).rep_.type_ != TeSTRING)	// make sure it is a String type
+			{
+				(*it).rep_.type_ = TeSTRING;
+				(*it).rep_.numChar_ = 16;
+			}
+			(*it).rep_.isPrimaryKey_ = true;
+			i=j;
+			break;
+		}
+		++it;
+		j++;
+	}
+	if (it == attList.end())
+		return false;
+
+	TeAsciiFile	pFile (fileName);
+	string name = pFile.readString ();
+	pFile.findNewLine();
+
+	if (name != "TABLE")
+		return false;
+
+	TeTable attTable (attrTableName,attList,linkName,linkName,TeAttrStatic);
+	if (!layer->createAttributeTable(attTable))
+		return false;
+
+
+	int nAtt = attList.size();
+
+	// Identify the separator again
+	while ( pFile.isNotAtEOF() && name != "SEPARATOR" )
+		name = pFile.readString ();
+
+	char separator = ',';
+	if ( name == "SEPARATOR" )
+	{
+		separator = pFile.readString ().c_str()[0];
+	}
+	pFile.findNewLine();
+
+	// Skip the information lines
+	while ( pFile.isNotAtEOF() && name != "INFO_END" )
+		name = pFile.readString ();
+
+	if (name != "INFO_END")
+		return false;
+
+	pFile.findNewLine();
+	string value = pFile.readStringCSVNoQuote(separator);
+	try {
+		// Read the attribute lines
+		while (pFile.isNotAtEOF())
+		{
+			TeTableRow row;
+			for (int n=0; n<nAtt; n++)
+			{
+				row.push_back ( value ); 
+				if(pFile.isNotAtEOF())
+					value = pFile.readStringCSVNoQuote(separator);
+			}
+			attTable.add( row );
+
+			if ( attTable.size() == chunckSize )
+			{
+				layer->saveAttributeTable( attTable );
+				attTable.clear();
+			}
+			pFile.findNewLine();
+			value = pFile.readStringCSVNoQuote(separator);
+		}
+	}
+	catch (...)
+	{
+//		int a = 0;  end of file reached
+	}
+	// save the remaining rows
+	if (attTable.size() > 0 )
+		layer->saveAttributeTable( attTable );
+	attTable.clear();
+	return true;
+}
+
+bool 
+TeImportGeoGeometries ( TeLayer* layer, const string& geoFileName, unsigned int chunckSize)
+{
+	string filePrefix = TeGetName (geoFileName.c_str()) ;
+	string fileName = filePrefix + ".geo";
+
+	TePointSet pointSet;
+	TeLineSet lineSet;
+	TePolygonSet polySet;
+	TeTextSet textSet;
+
+
+/* -------------------------------------------------------------------- */
+/*      Open the  file.                                                 */
+/* -------------------------------------------------------------------- */
+
+	TeAsciiFile	pFile (fileName);
+
+	int size,nrings;
+	string geoId;
+
+/* -------------------------------------------------------------------- */
+/*      Get information about the file                                  */
+/* -------------------------------------------------------------------- */
+  try
+  {
+	while (pFile.isNotAtEOF())
+	{
+		string repType = pFile.readString ();
+		pFile.findNewLine();
+		if (repType == "POLIGONOS")
+		{
+			while ( 1 )
+			{
+				TePolygon poly;
+				string rings = pFile.readString ();
+				if (rings == "END" )
+					break;
+				nrings = atoi(rings.c_str());
+				if (!pFile.isNotAtEOF())
+					break;
+				geoId = pFile.readString ();
+				pFile.findNewLine();
+				poly.objectId ( geoId );
+				int i,j;
+				for (j=0;j<nrings;j++)
+				{
+					TeLine2D line;
+					size = pFile.readInt ();
+					pFile.findNewLine();
+					for (i=0;i<size;i++)
+					{
+	// Build the polygon
+						TeCoord2D xy = pFile.readCoord2D ();
+						line.add ( xy );
+					}
+					TeLinearRing ring (line);
+					poly.add ( ring );
+				}
+				polySet.add ( poly );
+				if ( polySet.size() == chunckSize )
+				{
+					layer->addPolygons( polySet ); 
+					polySet.clear();
+				}
+			}
+		}
+		if (repType == "LINHAS")
+		{
+			while ( 1 )
+			{
+				geoId = pFile.readStringCSVNoQuote (',');
+				pFile.findNewLine();
+				if (!pFile.isNotAtEOF() || geoId == "END")
+					break;
+				int i;
+				TeLine2D line;
+				size = pFile.readInt ();
+				pFile.findNewLine();
+				for (i=0;i<size;i++)
+				{
+	// Build the line
+					TeCoord2D xy = pFile.readCoord2D ();
+					line.add ( xy );
+				}
+				line.objectId ( geoId );
+				lineSet.add ( line );
+				if ( lineSet.size() == chunckSize )
+				{
+					layer->addLines( lineSet ); 
+					lineSet.clear();
+				}
+				pFile.findNewLine();
+			}
+		}
+		if (repType == "PONTOS")
+		{
+			while ( 1 )
+			{
+				geoId = pFile.readString ();
+				if (!pFile.isNotAtEOF() || geoId == "END" )
+					break;
+				TePoint point;
+	// Build the point
+				TeCoord2D xy = pFile.readCoord2D ();
+				point.add ( xy );
+				point.objectId ( geoId );
+				pointSet.add ( point );
+				if ( pointSet.size() == chunckSize )
+				{
+					layer->addPoints( pointSet ); 
+					pointSet.clear();
+				}
+				pFile.findNewLine();
+			}
+			if (repType.empty())
+				break;
+		}
+	}
+  }
+  catch(...)
+  {
+//	  int a = 0;
+  }
+	// save the remaining geometries
+	if (pointSet.size() > 0)
+	{
+		layer->addPoints( pointSet ); 
+		pointSet.clear();
+	}
+
+	if (lineSet.size() > 0 )
+	{
+		layer->addLines( lineSet ); 
+		lineSet.clear();
+	}
+
+	if (polySet.size() > 0)
+	{
+		layer->addPolygons( polySet ); 
+		polySet.clear();
+	}
+	return true;
+}
diff --git a/src/terralib/functions/TeImportMIF.cpp b/src/terralib/functions/TeImportMIF.cpp
new file mode 100644
index 0000000..752cff3
--- /dev/null
+++ b/src/terralib/functions/TeImportMIF.cpp
@@ -0,0 +1,894 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <string>
+#include <iostream>
+#include <list>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+using namespace std;
+
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeAsciiFile.h"
+#include "TeMIFProjection.h"
+#include "TeException.h"
+#include "TeProjection.h"
+#include "TeAttribute.h"
+#include "TeTable.h"
+#include "TeAssertions.h"
+#include "TeUtils.h"
+#include "TeLayer.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDatabase.h"
+
+void TeMIFRegionDecode ( TeAsciiFile& mifFile, TePolygonSet& temp, string& index);
+
+void TeMIFLineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index);
+
+void TeMIFPlineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index);
+
+void TeMIFPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index);
+
+void TeMIFMultiPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index);
+
+void TeMIFTextDecode (TeAsciiFile& mifFile, TeTextSet& temp, string& index);
+
+void TeMIFCollectionDecode(TeAsciiFile& mifFile, TePointSet& ps, TeLineSet& ls, TePolygonSet& pols, string& index);
+
+void TeMIFRectDecode (TeAsciiFile& mifFile, TePolygonSet& temp, string& index);
+
+void TeMIFOthersDecode    ( TeAsciiFile& );
+
+void TeMIFTransformDecode ( TeAsciiFile& );
+
+bool TeReadMIFAttributes(TeAsciiFile& midFile, TeTable& attTable, 
+						 int ncolumns, int nrecords=-1, int delta = 0, bool createAuto=false);
+
+bool TeImportMIFGeometries(TeLayer* layer,const string& mifFileName, 
+						   vector<string> &indexes, unsigned int chunckSize);
+
+char TeReadMIFSeparator(const string& mifFileName);
+
+double glXmulti = 1., glYmulti = 1;
+
+TeCoord2D glAdd (0., 0. );
+
+
+TeLayer* TeImportMIF(const string& mifFileName, TeDatabase* db, const string& layerName)
+{
+	if (!db || mifFileName.empty()) 
+		return 0;
+
+	// check if format is complete (MID and MIF files exist)
+	string filePrefix = TeGetName(mifFileName.c_str());
+	string ftest = filePrefix + ".mid";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".MID";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+
+	ftest = filePrefix + ".mif";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".MIF";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+
+	// found a valid layer name
+	string lName;
+	string baseName = TeGetBaseName(mifFileName.c_str());
+	if (layerName.empty())
+		lName = baseName;
+	else
+		lName = layerName;
+
+	string newLayerName = lName;
+	TeLayerMap& layerMap = db->layerMap();
+	TeLayerMap::iterator it;
+	bool flag = true;
+	int n = 1;
+	while (flag)
+	{
+		for (it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if (TeStringCompare(it->second->name(),newLayerName))
+				break;
+		}
+		if (it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = lName + "_" +Te2String(n);
+		n++;	
+	}
+
+	// find projection
+	TeProjection* mifProj = TeReadMIFProjection(mifFileName);
+	TeLayer* newLayer = new TeLayer(newLayerName,db,mifProj);
+	if (newLayer->id() <= 0 )
+		return 0;				// couldn�t create new layer
+
+	bool res = TeImportMIF(newLayer,mifFileName);
+	delete mifProj;
+	if (res)
+		return newLayer;
+	else
+	{
+		db->deleteLayer(newLayer->id());
+		delete newLayer;
+		return 0;
+	}
+}
+
+bool 
+TeImportMIF(TeLayer* layer, const string& mifFileName, string attrTableName, 
+			string objectIdAttr, unsigned int chunkSize)
+{
+	// check if format is complete (MID and MIF files exist)
+	string filePrefix = TeGetName(mifFileName.c_str());
+	string ftest = filePrefix + ".mid";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".MID";
+		if (access(ftest.c_str(),04) == -1)
+			return false;
+	}
+
+	ftest = filePrefix + ".mif";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".MIF";
+		if (access(ftest.c_str(),04) == -1)
+			return false;
+	}
+	
+
+	//-- Step 1: Read any adicional information (ex. projection) 
+	if (!layer->projection())
+	{
+		TeProjection* mifProj = TeReadMIFProjection(mifFileName);
+		if (mifProj)
+			layer->setProjection(mifProj);
+	}
+
+	char separator = TeReadMIFSeparator(mifFileName);
+
+	//read the attribute list information 
+	TeAttributeList attList;
+	TeReadMIFAttributeList(mifFileName, attList);
+
+	// define a TeAttributeTable
+	if (attrTableName.empty())
+	{
+		if (layer->name().empty())
+			return false;
+		else
+			attrTableName = layer->name();
+	}
+	string aux = attrTableName;
+	int c = 1;
+	while (layer->database()->tableExist(aux))
+	{
+		aux = attrTableName + "_" + Te2String(c);
+		++c;
+	}
+	attrTableName = aux;
+	
+	int linkCol=-1, j=0;
+	bool autoIndex = false;
+
+	// if no geometry link name is given, creates one called 'object_id'
+	if (objectIdAttr.empty())
+	{
+		objectIdAttr = "object_id_"+Te2String(layer->id());
+		TeAttribute at;
+		at.rep_.type_ = TeSTRING;
+		at.rep_.numChar_ = 16;
+		at.rep_.name_ = objectIdAttr;
+		at.rep_.isPrimaryKey_ = true;
+		attList.push_back(at);
+		autoIndex = true;
+	}
+	else
+	{
+		// check if given index is valid
+		TeAttributeList::iterator it = attList.begin();
+		while (it != attList.end())
+		{
+			if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(objectIdAttr))		// index found
+			{
+				if ((*it).rep_.type_ != TeSTRING)	// make sure it is a String type
+				{
+					(*it).rep_.type_ = TeSTRING;
+					(*it).rep_.numChar_ = 16;
+				}
+				linkCol=j;
+				(*it).rep_.isPrimaryKey_ = true;
+				break;
+			}
+			it++;
+			j++;
+		}
+		if (it == attList.end())			// index not found
+		{
+			TeAttribute at;
+			at.rep_.type_ = TeSTRING;
+			at.rep_.numChar_ = 16;
+			at.rep_.name_ = objectIdAttr;
+			at.rep_.isPrimaryKey_ = true;
+			attList.push_back(at);
+			autoIndex = true;
+		}
+	}
+
+	if (autoIndex)
+		linkCol = attList.size()-1;
+
+	TeTable attTable (attrTableName,attList,objectIdAttr,objectIdAttr,TeAttrStatic);
+	attTable.setSeparator(separator);
+
+	// insert the table into the database
+	if (!layer->createAttributeTable(attTable))
+		return false;
+
+	vector<string> objectIds;
+
+	string midFileName = filePrefix + ".mid";
+
+	int ncol = attList.size();
+	if (autoIndex)
+		ncol--;
+
+	TeAsciiFile midFile(midFileName);
+	int delta = 0;
+	while (TeReadMIFAttributes(midFile,attTable,ncol,chunkSize,delta, autoIndex))
+	{
+		for (unsigned int n=0; n<attTable.size();++n)
+			objectIds.push_back(attTable.operator ()(n,linkCol));
+
+		// save table
+		if (!layer->saveAttributeTable( attTable ))
+		{
+			attTable.clear();
+			break;
+		}
+		delta += attTable.size();
+		attTable.clear();
+	}
+
+	// Import the geometries
+	bool res = TeImportMIFGeometries(layer,mifFileName,objectIds,chunkSize);
+	return res;
+}
+
+bool TeReadMIFAttributes(TeAsciiFile& midFile, TeTable& attTable, 
+						 int ncolumns, int nrecords, int delta, bool createAuto )
+{
+	if (!midFile.isNotAtEOF() || nrecords <=0 || ncolumns <= 0)
+		return false;
+	char separator = attTable.separator();
+
+	int count;
+	for (count=0; count<nrecords; count++)
+	{
+		if (!midFile.isNotAtEOF())
+			 break;
+
+		TeTableRow row;
+		for (int n=0; n<ncolumns; n++)
+		{
+			string value;
+			try 
+			{
+				value = midFile.readStringCSVNoQuote(separator);
+			}
+			catch(...)
+			{
+				if (count > 0)
+					return true;
+				else
+					return false;
+			}
+			row.push_back ( value ); 
+		}
+
+		if (createAuto)
+			row.push_back(Te2String(count+delta));
+
+		attTable.add(row);
+		midFile.findNewLine();
+	}
+	return true;
+}
+
+char 
+TeReadMIFSeparator(const string& mifFileName)
+{
+	string filePrefix = TeGetName (mifFileName.c_str()) ;
+	string fileName = filePrefix + ".mif";
+
+	TeAsciiFile mifFile(fileName);
+	string name = mifFile.readString ();
+
+	while ( mifFile.isNotAtEOF() && !TeStringCompare(name,"Delimiter"))
+		name = mifFile.readString ();
+
+	if (mifFile.isNotAtEOF())
+		return mifFile.readQuotedChar();
+	else 
+		return '\t';
+}
+
+
+TeProjection* 
+TeReadMIFProjection(const string& mifFileName)
+{
+	TeProjection* proj = 0;
+
+	string filePrefix = TeGetName (mifFileName.c_str()) ;
+	string fileName = filePrefix + ".mif";
+
+	TeAsciiFile mifFile(fileName);
+	string name = mifFile.readString ();
+
+	while ( mifFile.isNotAtEOF() && !TeStringCompare(name,"CoordSys")
+		                         && !TeStringCompare(name,"Columns"))
+		name = mifFile.readString ();
+	
+	if (mifFile.isNotAtEOF() && TeStringCompare(name,"CoordSys"))  
+	{
+		string option = mifFile.readString();
+
+		vector<string> argList;
+
+		if (TeStringCompare(option,"Earth"))	// expect Projection clause
+		{
+			string projRef =  mifFile.readString ();
+			if (!TeStringCompare(projRef,"Projection"))
+			{
+				proj = new TeNoProjection();
+				return proj;
+			}
+			mifFile.readStringListCSV(argList,',');
+			proj = TeMIFProjectionFactory::make ( argList );	// create projection from parameters
+		}
+		else if (TeStringCompare(option,"Nonearth"))	// non earth
+		{
+			// look for units specification
+			while (mifFile.isNotAtEOF() && !TeStringCompare(name,"Units")
+		                                && !TeStringCompare(name,"Columns"))
+				name = mifFile.readString ();
+			if (TeStringCompare(name,"Units"))
+			{
+				name = mifFile.readString();
+				proj = new TeNoProjection(name);
+			}
+			else
+				proj = new TeNoProjection(name);
+		}
+	}
+	else	// no CoordSys clause specified 
+	{		// it should be assumed that the data is stored in Lat Long
+		TeDatum  datum = TeDatumFactory::make("Spherical");
+		proj = new TeLatLong(datum);
+	}
+	return proj;
+}
+
+void
+TeReadMIFAttributeList ( const string& mifFileName, TeAttributeList& attList )
+{
+	string filePrefix = TeGetName (mifFileName.c_str()) ;
+	string fileName = filePrefix + ".mif";
+
+	TeAsciiFile mifFile(fileName);
+	string name = mifFile.readString ();
+	
+	while ( mifFile.isNotAtEOF() && !TeStringCompare(name,"Columns"))
+		name = mifFile.readString ();
+
+	if (mifFile.isNotAtEOF()) 
+	{
+		int ncol = mifFile.readInt();
+		mifFile.findNewLine();
+		TeAttribute attribute;
+
+		for ( int i = 0; i< ncol; i++ )
+		{
+			attribute.rep_.name_  = mifFile.readString();
+			string attType = mifFile.readStringCSVNoSpace ('(');
+			if ( TeStringCompare(attType,"Integer") || TeStringCompare(attType,"Smallint") 
+				 || TeStringCompare(attType,"Logical") )
+			{
+				attribute.rep_.type_ = TeINT;
+			}
+			else if (TeStringCompare(attType,"Float"))
+			{
+				attribute.rep_.type_ = TeREAL;
+				attribute.rep_.numChar_ = 20;
+				attribute.rep_.decimals_ = 1;
+			}
+			else if (TeStringCompare(attType,"Date"))
+			{
+				attribute.rep_.type_ = TeDATETIME;
+				attribute.dateTimeFormat_="YYYYMMDD";
+			}
+			else if (TeStringCompare(attType,"Decimal"))
+			{
+				attribute.rep_.type_  = TeREAL;
+				attribute.rep_.numChar_ = mifFile.readIntCSV();
+				attribute.rep_.decimals_ = mifFile.readIntCSV(')');
+			}
+			else
+			{
+				attribute.rep_.type_  = TeSTRING;
+				attribute.rep_.numChar_  = mifFile.readIntCSV(')');
+			}
+			attList.push_back ( attribute );
+			mifFile.findNewLine();
+		}
+	}
+}
+
+bool
+TeImportMIFGeometries(TeLayer* layer,const string& mifFileName, 
+					  vector<string> &indexes, unsigned int chunckSize)
+{
+
+	string filePrefix = TeGetName (mifFileName.c_str()) ;
+	string fileName = filePrefix + ".mif";
+
+	TePointSet pointSet;
+	TeLineSet lineSet;
+	TePolygonSet polySet;
+	TeTextSet textSet;
+	string textTableName = layer->name() + "Texto";
+
+	try
+	{
+		TeAsciiFile mifFile(fileName);
+		int n = 0;
+		while ( mifFile.isNotAtEOF()  )
+		{
+			string name = mifFile.readString ();
+			if (TeStringCompare(name,"Region"))
+			{
+				TeMIFRegionDecode ( mifFile, polySet, indexes[n]);
+				n++;
+				if ( polySet.size() == chunckSize )
+				{
+					layer->addPolygons( polySet ); 
+					polySet.clear();
+				}
+			} 
+			else if (TeStringCompare(name,"Pline"))
+			{
+				TeMIFPlineDecode ( mifFile, lineSet, indexes[n] );
+				n++;
+				if ( lineSet.size() == chunckSize )
+				{
+					layer->addLines( lineSet ); 
+					lineSet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Line"))
+			{
+				TeMIFLineDecode ( mifFile, lineSet, indexes[n] );
+				n++;
+				if ( lineSet.size() == chunckSize )
+				{
+					layer->addLines( lineSet ); 
+					lineSet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Point"))
+			{
+				TeMIFPointDecode ( mifFile, pointSet, indexes[n] );
+				n++;
+				if ( pointSet.size() == chunckSize )
+				{
+					layer->addPoints( pointSet ); 
+					pointSet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Multipoint"))
+			{
+				TeMIFMultiPointDecode ( mifFile, pointSet, indexes[n] );
+				n++;
+				if ( pointSet.size() == chunckSize )
+				{
+					layer->addPoints( pointSet ); 
+					pointSet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Text"))
+			{
+				TeMIFTextDecode ( mifFile, textSet,indexes[n]);
+				n++;
+				if ( textSet.size() == chunckSize )
+				{
+					layer->addText( textSet,textTableName ); 
+					textSet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Rect"))
+			{
+				TeMIFRectDecode(mifFile,polySet,indexes[n]);
+				n++;
+				if (polySet.size() == chunckSize )
+				{
+					layer->addPolygons(polySet); 
+					polySet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Collection"))
+			{
+				TeMIFCollectionDecode(mifFile,pointSet,lineSet, polySet,indexes[n]);
+				n++;
+				if (lineSet.size() == chunckSize )
+				{
+					layer->addLines(lineSet); 
+					lineSet.clear();
+				}
+				if (polySet.size() == chunckSize )
+				{
+					layer->addPolygons(polySet); 
+					polySet.clear();
+				}
+				if (pointSet.size() == chunckSize )
+				{
+					layer->addPoints(pointSet); 
+					pointSet.clear();
+				}
+			}
+			else if (TeStringCompare(name,"Transform"))
+				TeMIFTransformDecode ( mifFile );			
+			else if (TeStringCompare(name,"NONE"))
+				n++;
+			else
+				TeMIFOthersDecode ( mifFile );
+		}
+		
+		// save the remaining geometries
+		if (pointSet.size() > 0 )
+		{
+			layer->addPoints( pointSet ); 
+			pointSet.clear();
+		}
+
+		if (lineSet.size() > 0 )
+		{
+			layer->addLines( lineSet ); 
+			lineSet.clear();
+		}
+
+		if (polySet.size() > 0 )
+		{
+			layer->addPolygons( polySet ); 
+			polySet.clear();
+		}
+		
+		if (textSet.size() > 0)
+		{
+			layer->addText( textSet,textTableName ); 
+			textSet.clear();
+		}
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+void 
+TeMIFRectDecode (TeAsciiFile& mifFile, TePolygonSet& temp, string& index)
+{
+	if (index.empty())
+		index = "te_nulo";
+	TeCoord2D ll = mifFile.readCoord2D();
+	TeCoord2D ur = mifFile.readCoord2D();
+
+	TeBox rec(ll.x_,ll.y_,ur.x_,ur.y_);
+	TePolygon pol = polygonFromBox(rec);
+	pol.objectId(index);
+	temp.add(pol);
+}
+
+void
+TeMIFRegionDecode ( TeAsciiFile& mifFile, TePolygonSet& temp, string& index)
+{
+	if (index.empty())
+		index = "te_nulo";
+
+	int npolyg = mifFile.readInt();
+	mifFile.findNewLine();
+
+	TeCoord2D pt;
+	TePolygon pol; 
+	typedef list<TePolygon> PolyList;
+	PolyList pList;
+	for ( int i = 0; i < npolyg; i++ )
+	{
+		TeLine2D line;
+
+		int ncoord = mifFile.readInt();
+		mifFile.findNewLine();
+
+		for ( int j = 0; j < ncoord; j++ )
+		{
+			pt = mifFile.readCoord2D();
+			pt.scale( glXmulti, glYmulti);
+			pt += glAdd;
+			mifFile.findNewLine();
+			line.add ( pt );
+
+		}
+		if ( line.size() <= 3 ) continue; // to avoid dangling rings
+		if ( !line.isRing() )		//close the ring
+		{
+			line.add(line[0]);
+//			throw TeException ( MIF_REGION_CLOSE );
+		}
+
+		TeLinearRing ring (line);
+		
+		bool inside = false;
+
+		PolyList::iterator it = pList.begin();
+
+		while ( it != pList.end() )
+		{
+			TePolygon p1;
+			p1.add(ring);
+			TePolygon p2 = (*it);
+			if (TeWithin(p1,p2))
+			{
+				inside = true;
+				ring.objectId(p2[0].objectId());
+				p2.add ( ring );// add a closed region
+			}
+			++it;
+		}
+		if ( !inside )
+		{
+			TePolygon poly;
+			ring.objectId(index);
+			poly.add ( ring ); // add an outer region
+			poly.objectId(index);
+			pList.push_back ( poly );
+		}
+	}
+
+	PolyList::iterator it = pList.begin();
+	while ( it != pList.end() )
+	{
+		temp.add ( *it ); // add a polygon to a layer
+		++it;
+	}
+}	
+
+void
+TeMIFLineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index)
+{
+	if (index.empty())
+		index = "te_nulo";
+
+	TeLine2D line;
+	TeCoord2D pt;
+
+	for ( int i= 0; i < 2; i++ )
+	{
+		pt = mifFile.readCoord2D();
+		pt.scale( glXmulti, glYmulti);
+		pt += glAdd;
+		line.add ( pt );
+	}
+
+	line.objectId( index );
+	temp.add ( line );
+	mifFile.findNewLine();
+}
+
+void
+TeMIFPlineDecode (TeAsciiFile& mifFile, TeLineSet& temp, string& index)
+{
+	if (index.empty())
+		index = "te_nulo";
+
+	int numSections = 1; 
+	int ncoord = 0;
+
+	// Read the Pline parameters
+	vector<string>  strList;
+	mifFile.readStringList ( strList );
+	
+	// Are we dealing with MULTIPLE sections ??
+	// If there are two parameters for the pline,
+	// the first MUST be a "Multiple" keyword
+	
+	bool hasMultiple = false;
+
+	if ( strList.size() == 2 )
+	{
+		hasMultiple = true;
+		ensure (TeStringCompare(strList[0],"Multiple"));
+		numSections = atoi ( strList[1].c_str() );
+	}
+	else
+		ncoord = atoi ( strList[0].c_str());
+
+	mifFile.findNewLine(); // go to the next line
+	// If there is a single PLine, there is a single
+	// section ( numSections = 1 ) and will read
+	// the number of points within the loop
+
+
+	for ( int i= 0;  i < numSections; i++ )
+	{
+		TeLine2D line;	
+		TeCoord2D pt;
+		if ( hasMultiple == true )
+		{
+			ncoord = mifFile.readInt();
+			mifFile.findNewLine(); // go to the next line
+		}
+
+		for ( int j = 0; j < ncoord; j++ )
+		{
+			pt = mifFile.readCoord2D();
+			pt.scale( glXmulti, glYmulti);
+			pt += glAdd;
+			mifFile.findNewLine();
+			line.add ( pt );
+		}
+		line.objectId( index );
+		temp.add ( line );
+	}
+}
+
+void
+TeMIFPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index)
+{
+	if (index.empty())
+		index = "te_nulo";
+
+	TePoint point;
+	
+	// Read the coordinates
+
+	TeCoord2D pt = mifFile.readCoord2D();
+	pt.scale( glXmulti, glYmulti);
+	pt += glAdd;
+	point.add ( pt );
+	point.objectId( index );
+
+	// Add a point to the Point Set
+			
+	temp.add ( point );
+
+	mifFile.findNewLine();
+}
+
+void
+TeMIFMultiPointDecode (TeAsciiFile& mifFile, TePointSet& temp, string& index)
+{
+	if (index.empty())
+		index = "te_nulo";
+
+	int	npts = mifFile.readInt();
+	mifFile.findNewLine();
+	for (int i=0; i<npts;i++)
+	{
+		// Read points
+		TePoint point;
+		TeCoord2D pt = mifFile.readCoord2D();
+		pt.scale( glXmulti, glYmulti);
+		pt += glAdd;
+		point.add ( pt );
+		point.objectId( index );
+
+		// Add a point to the Point Set		
+		temp.add ( point );
+	}
+	mifFile.findNewLine();
+}
+
+void
+TeMIFTransformDecode ( TeAsciiFile& mifFile )
+{
+	// read the tansformation params
+
+	double param = mifFile.readFloatCSV();
+
+	if ( param != 0. )
+		glXmulti = param;
+
+	param = mifFile.readFloatCSV();
+
+	if ( param != 0. )
+		glYmulti = param;
+
+	double x = mifFile.readFloatCSV();
+
+	double y  = mifFile.readFloatCSV();
+
+	TeCoord2D pt ( x, y );
+
+	glAdd =  pt;
+	
+	// Go to the next line
+	mifFile.findNewLine ();
+	
+}
+
+void
+TeMIFTextDecode (TeAsciiFile& mifFile, TeTextSet& temp, string& index)
+{
+	string txt = mifFile.readQuotedString(); // read the text string
+	mifFile.findNewLine ();
+	TeBox box = mifFile.readBox();			// read the text box 
+
+	TeCoord2D lowerLeft = box.lowerLeft();
+	TeText text(lowerLeft,txt);
+	text.setBox(box);
+	text.objectId(index);
+	text.setHeight(box.height());
+	temp.add(text);
+	mifFile.findNewLine ();					// go to the next line
+}
+
+void
+TeMIFOthersDecode ( TeAsciiFile& mifFile )
+{
+	// Simply go to the next line
+	mifFile.findNewLine ();
+}
+
+void 
+TeMIFCollectionDecode(TeAsciiFile& mifFile, TePointSet& ps, TeLineSet& ls, TePolygonSet& pols, string& index)
+{
+	int	nparts = mifFile.readInt();
+	if (nparts == 0)
+		nparts = 3;
+	mifFile.findNewLine();
+	for (int i=0; i<nparts; i++)
+	{
+		string part = mifFile.readString ();
+		if (TeStringCompare(part,"Region"))
+			TeMIFRegionDecode (mifFile, pols, index);
+		else if(TeStringCompare(part,"Pline"))
+			TeMIFPlineDecode (mifFile, ls, index);
+		else if (TeStringCompare(part,"Multipoint"))
+			TeMIFMultiPointDecode (mifFile,ps, index);
+	}
+}
diff --git a/src/terralib/functions/TeImportSHP.cpp b/src/terralib/functions/TeImportSHP.cpp
new file mode 100644
index 0000000..cc83e65
--- /dev/null
+++ b/src/terralib/functions/TeImportSHP.cpp
@@ -0,0 +1,882 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// STL 
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <map>
+
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+using namespace std;
+
+// TerraLib
+
+#include "TeImportExport.h"
+#include "TeTable.h"
+#include "TeStdFile.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeLayer.h"
+#include "TeProgress.h"
+#include "TeDatabase.h"
+
+
+// from SHAPELIB
+
+#include "shapefil.h" 
+ 
+
+// Internal functions
+bool TeImportSHPGeometries (TeLayer* layer,const string& shpFileName, vector<string> &indexes, unsigned int chunckSize);
+void TeSHPPointDecode    (TeLayer*, SHPHandle, vector<string>&, unsigned int);
+void TeSHPPolyLineDecode (TeLayer*, SHPHandle, vector<string>&, unsigned int);
+void TeSHPPolygonDecode  (TeLayer*, SHPHandle, vector<string>&, unsigned int);
+
+// Functions to decode one shape
+void TeSHPPointDecode	(SHPObject*, TePointSet&,	string&);
+void TeSHPPolyLineDecode(SHPObject*, TeLineSet&,	string&);
+void TeSHPPolygonDecode	(SHPObject*, TePolygonSet&, string&);
+void TeDBFRowDecode		(DBFHandle&, int, TeTableRow&);
+
+TeLayer* TeImportShape(const string& shpFileName, TeDatabase* db, const string& layerName)
+{
+	if (!db || shpFileName.empty()) 
+		return 0;
+
+	// check if format is complete (SHP, SHX e DBF files exist)
+	string filePrefix = TeGetName(shpFileName.c_str());
+	string ftest = filePrefix + ".dbf";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".DBF";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+	ftest = filePrefix + ".shx";
+	if (access(ftest.c_str(),04) == -1)
+	{
+		ftest = filePrefix + ".SHX";
+		if (access(ftest.c_str(),04) == -1)
+			return 0;
+	}
+
+	// found a valid layer name
+	string lName;
+	string baseName = TeGetBaseName(shpFileName.c_str());
+	if (layerName.empty())
+		lName = baseName;
+	else
+		lName = layerName;
+
+	string newLayerName = lName;
+	TeLayerMap& layerMap = db->layerMap();
+	TeLayerMap::iterator it;
+	bool flag = true;
+	int n = 1;
+	while (flag)
+	{
+		for (it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if (TeStringCompare(it->second->name(),newLayerName))
+				break;
+		}
+		if (it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = lName + "_" +Te2String(n);
+		n++;	
+	}
+
+	// find projection
+	TeLayer* newLayer = new TeLayer(newLayerName,db);
+	if (newLayer->id() <= 0 )
+		return 0;				// couldn�t create new layer
+
+	bool res = TeImportShape(newLayer,shpFileName);
+	if (res)
+		return newLayer;
+	else
+	{
+		db->deleteLayer(newLayer->id());
+		delete newLayer;
+		return 0;
+	}
+}
+
+bool TeImportShape (TeLayer* layer, const string& shpFileName, string attrTableName,  
+					string objectIdAtt, int unsigned chunkSize )
+{
+	string filePrefix = TeGetName(shpFileName.c_str());
+	string shpFileN = filePrefix + ".shp";
+	string dbfFileN = filePrefix + ".dbf";
+
+	SHPHandle	hSHP = SHPOpen(shpFileN.c_str(),"rb");
+	if (hSHP == 0)
+		return false;
+
+    DBFHandle hDBF = DBFOpen(dbfFileN.c_str(), "rb");
+    if (hDBF == 0)
+    {
+		SHPClose(hSHP);
+		return false;
+    }
+
+	// Read some information about the shapefile
+	int nShapeType, nEntities;
+	// --- get the shape and decode it
+	double 	adfMinBound[4], adfMaxBound[4];
+	SHPGetInfo( hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound );
+	string shpName = SHPTypeName( nShapeType );
+	if (shpName == "UnknownShapeType")
+	{
+		SHPClose(hSHP);
+		DBFClose(hDBF);
+		return false;
+	}
+
+	if (attrTableName.empty())
+	{
+		if (layer->name().empty())
+			return false;
+		else
+			attrTableName = layer->name();
+	}
+	
+	int linkCol=-1;
+    unsigned int j=0;
+	bool autoIndex = false;
+
+	//read the attribute list information 
+	TeAttributeList attList;
+	TeReadDBFAttributeList(shpFileName, attList);
+
+	// if no geometry link name is given, creates one called 'object_id_'
+	string ext = "";
+	int count = 0;
+	if (objectIdAtt.empty())
+	{
+		objectIdAtt = "object_id_" + Te2String(layer->id());
+		string s2 = TeConvertToUpperCase(objectIdAtt);
+		while (true)
+		{
+			for (j=0; j<attList.size(); j++)
+			{
+				string s0 = attList[j].rep_.name_;
+				string s1 = TeConvertToUpperCase(s0);
+				if ( s1 == s2)
+					break;
+			}
+			if (j < attList.size())
+			{
+				++count;
+				objectIdAtt = "object_id_" + Te2String(count);
+			}
+			else
+				break;
+		}
+		TeAttribute at;
+		at.rep_.type_ = TeSTRING;
+		at.rep_.numChar_ = 16;
+		at.rep_.name_ = objectIdAtt;
+		at.rep_.isPrimaryKey_ = true;
+		attList.push_back(at);
+		linkCol = attList.size()-1;
+		autoIndex = true;
+	}
+	else
+	{
+		// check if given index is valid
+		TeAttributeList::iterator it = attList.begin();
+		while (it != attList.end())
+		{
+			if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(objectIdAtt))		// index found
+			{
+				if ((*it).rep_.type_ != TeSTRING)	// make sure it is a String type
+				{
+					(*it).rep_.type_ = TeSTRING;
+					(*it).rep_.numChar_ = 16;
+				}
+				(*it).rep_.isPrimaryKey_ = true;
+				linkCol=j;
+				break;
+			}
+			++it;
+			++j;
+		}
+		if (it == attList.end())			// index not found
+		{
+			objectIdAtt = "object_id_" + Te2String(layer->id());;
+			while (true)
+			{
+				for (j=0; j<attList.size(); j++)
+				{
+					if (TeConvertToUpperCase(attList[j].rep_.name_) == TeConvertToUpperCase(objectIdAtt))
+						break;
+				}
+				if (j < attList.size())
+				{
+					++count;
+					objectIdAtt = "object_id_" + Te2String(count);
+				}
+				else
+					break;
+			}
+			TeAttribute at;
+			at.rep_.type_ = TeSTRING;
+			at.rep_.numChar_ = 16;
+			at.rep_.name_ = objectIdAtt;
+			at.rep_.isPrimaryKey_ = true;
+			attList.push_back(at);
+			autoIndex = true;
+		}
+	}
+	if (autoIndex)
+		linkCol = attList.size()-1;
+
+	TeTable attTable (attrTableName,attList,objectIdAtt,objectIdAtt,TeAttrStatic);
+	if (!layer->createAttributeTable(attTable))			// create the table in the database
+		return false;
+	
+	string objid, value;
+	TePointSet points;
+	TeLineSet lines;
+	TePolygonSet polygons;
+	TeTableRow row;
+	SHPObject* psShape;
+
+	if(TeProgress::instance())
+	{
+		TeProgress::instance()->setTotalSteps(nEntities);
+		TeProgress::instance()->setProgress(j+1);
+	}
+
+	// OBS1: we discard Z and M values when available, because TerraLib
+	// doesn�t have the concept of 3D or measured geometries
+	// OBS2: non identified geometries are mapped to a object_id_
+	// "te_nulo"
+	switch (nShapeType) 
+	{
+		// --- null geometries ---
+	  case SHPT_NULL:							// read only the attributes
+		for (j=0; j<(unsigned int)nEntities; j++)
+		{
+		  row.clear();
+		  TeDBFRowDecode(hDBF,j,row);
+		  if (autoIndex)	// --- create automatic index if needed
+			  row.push_back(Te2String(j));
+		  if (row[linkCol].empty())
+			 row[linkCol] = "te_nulo";
+		  objid = row[linkCol];
+		  attTable.add(row);
+		  if ((j%chunkSize) == 0)
+		  {
+			  layer->saveAttributeTable(attTable);
+			  attTable.clear();
+			  if(TeProgress::instance())
+			  {
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				else
+					TeProgress::instance()->setProgress(j+1);
+			  }	
+		  }
+		}
+		break;
+		// --- point geometries ---
+	  case SHPT_POINTZ:	
+	  case SHPT_MULTIPOINTZ:
+	  case SHPT_POINTM:
+	  case SHPT_MULTIPOINTM:
+	  case SHPT_POINT:
+	  case SHPT_MULTIPOINT:
+		  for (j=0; j<(unsigned int)nEntities; j++)
+		  {
+			  row.clear();
+			  TeDBFRowDecode(hDBF,j,row);
+			  if (autoIndex)	// --- create automatic index if needed
+				  row.push_back(Te2String(j));
+			  if (row[linkCol].empty())
+				 row[linkCol] = "te_nulo";
+			  objid = row[linkCol];
+			  attTable.add(row);
+			  psShape = SHPReadObject(hSHP,j);
+              TeSHPPointDecode(psShape,points,objid);
+     		  SHPDestroyObject(psShape);
+			  if ((j%chunkSize) == 0)
+			  {
+				  layer->addPoints(points);
+				  points.clear();
+				  layer->saveAttributeTable(attTable);
+				  attTable.clear();
+				  if(TeProgress::instance())
+				  {
+					if (TeProgress::instance()->wasCancelled())
+						break;
+					else
+						TeProgress::instance()->setProgress(j+1);
+				  }	
+			  }
+		  }
+		  break;
+		// --- line geometries ---
+	  case SHPT_ARCZ:
+	  case SHPT_ARCM:
+	  case SHPT_ARC:
+		  for (j=0; j<(unsigned int)nEntities; j++)
+		  {
+			  row.clear();
+			  TeDBFRowDecode(hDBF,j,row);
+			  if (autoIndex)	// --- create automatic index if needed
+				  row.push_back(Te2String(j));
+			  if (row[linkCol].empty())
+				 row[linkCol] = "te_nulo";
+			  objid = row[linkCol];
+			  attTable.add(row);
+			  psShape = SHPReadObject(hSHP,j);
+			  TeSHPPolyLineDecode(psShape,lines,objid);
+     		  SHPDestroyObject(psShape);
+			  if ((j%chunkSize) == 0)
+			  {
+			 	  layer->addLines(lines);
+				  lines.clear();
+				  layer->saveAttributeTable(attTable);
+				  attTable.clear();
+				  if(TeProgress::instance())
+				  {
+					if (TeProgress::instance()->wasCancelled())
+						break;
+					else
+						TeProgress::instance()->setProgress(j+1);
+				  }	
+			  }
+		  }
+		  break;
+	// --- polygon geometries ---
+	  case SHPT_POLYGON:
+	  case SHPT_POLYGONM:
+	  case SHPT_POLYGONZ:
+		  for (j=0; j<(unsigned int)nEntities; j++)
+		  {
+			  row.clear();
+			  TeDBFRowDecode(hDBF,j,row);
+			  if (autoIndex)	// --- create automatic index if needed
+				  row.push_back(Te2String(j));
+			  if (row[linkCol].empty())
+				 row[linkCol] = "te_nulo";
+			  objid = row[linkCol];
+			  attTable.add(row);
+			  psShape = SHPReadObject(hSHP,j);
+			  TeSHPPolygonDecode(psShape,polygons,objid);
+			  SHPDestroyObject(psShape);
+			  if ((j%chunkSize) == 0)
+			  {
+				  layer->addPolygons(polygons);
+				  polygons.clear();
+				  layer->saveAttributeTable(attTable);
+				  attTable.clear();
+				  if(TeProgress::instance())
+				  {
+					if (TeProgress::instance()->wasCancelled())
+						break;
+					else
+						TeProgress::instance()->setProgress(j+1);
+				  }
+			  }
+
+		  }
+		  break;
+	  default:
+		  /* todo: handle multipatch geometries */
+		  throw TeException ( UNHANDLED_SHP_TYPE );
+	}
+	if (points.size() > 0)
+	{
+		layer->addPoints(points);
+		points.clear();
+	}
+	if (lines.size() > 0)
+	{
+		layer->addLines(lines);
+		lines.clear();
+	}
+	if (polygons.size() > 0)
+	{
+		layer->addPolygons(polygons);
+		polygons.clear();
+	}
+	if (attTable.size() > 0)
+	{
+		layer->saveAttributeTable(attTable);
+		attTable.clear();
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->cancel();
+
+	SHPClose(hSHP);
+	DBFClose(hDBF);
+	return true;
+}
+
+void TeDBFRowDecode(DBFHandle& hDBF, int nr, TeTableRow& row)
+{
+	string value;
+	int i;
+	for (i = 0; i < DBFGetFieldCount(hDBF); i++)
+	{
+		value =  DBFReadStringAttribute(hDBF,nr,i);
+		row.push_back(value); 
+	}
+}
+
+void TeSHPPointDecode(SHPObject* psShape, TePointSet& points, string& objid)
+{
+	int nv = psShape->nVertices;
+	for (int i = 0; i<nv; i++)
+	{
+		TePoint point(psShape->padfX[i], psShape->padfY[i]);
+		point.objectId(objid);
+		points.add(point);
+	}
+}
+
+
+void TeSHPPolyLineDecode(SHPObject* psShape, TeLineSet& lines, string& objid)
+{
+	int iPart,j=0,nextStart=0; 
+	for (iPart = 0; iPart < psShape->nParts; iPart++)
+	{
+		if (iPart == psShape->nParts-1)
+			nextStart = psShape->nVertices;
+		else 
+			nextStart = psShape->panPartStart[iPart+1];
+
+		TeLine2D line;
+		while (j<nextStart)
+		{
+			TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+			line.add ( pt );
+			j++;
+		}
+		line.objectId (objid);	
+		lines.add ( line );
+	}
+}
+
+void
+TeSHPPolygonDecode(SHPObject* psShape, TePolygonSet& polys, string& objid)
+{
+	int iPart;
+	vector<int> partStart;
+
+	vector<TePolygon> pList;
+	vector<TePolygon>::iterator it;
+	vector<TeLinearRing> holes;
+
+	// Build an array whose components point to the starting point
+	// of the rings that compose the shapepoly
+	for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+		partStart.push_back ( psShape->panPartStart[iPart] );
+	partStart.push_back ( psShape->nVertices ); // point to the end
+
+	iPart = 0;
+	int j = 0;
+	while ( j < psShape->nVertices )
+	{
+		TeLine2D line;
+		iPart++;						// while it doesn�t reach the start of next part
+		while ( j < partStart[iPart] )	// Read each ring
+		{
+			TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+			line.add ( pt );
+			j++;
+		}								// end of a ring
+		if (!line.isRing())				// arbitrarily close opened rings
+			line.add(line[0]);
+
+		TeLinearRing ring(line);
+
+		it = pList.begin();
+
+		short orient = TeOrientation(ring);
+
+		if(orient == TeCLOCKWISE)	// outer ring?
+		{
+			TePolygon p;
+			p.add(ring);
+			p.objectId(objid);
+			pList.push_back(p);
+		}
+		else	// COUNTERCLOCKWISE => inner ring!
+		{
+			holes.push_back(ring);
+		}
+	} // read all vertices
+
+	if(pList.size() == 1)
+	{
+		for(unsigned int i = 0; i < holes.size(); ++i)
+		{
+			pList[0].add(holes[i]);
+		}
+	}
+	else
+	{
+		for(unsigned int i = 0; i < holes.size(); ++i)
+		{
+			TeLinearRing ring = holes[i];
+
+			vector<TePolygon> candidates;
+
+			unsigned int j = 0;
+
+			for(j = 0; j < pList.size(); ++j)
+			{
+				if(TeWithinOrCoveredByOrEquals(ring.box(), pList[j].box()))
+					candidates.push_back(pList[j]);
+			}
+
+			if(candidates.size() == 1)
+			{
+				candidates[0].add(ring);
+				continue;
+			}
+
+			vector<TePolygon> newCandidates;
+
+			for(j = 0; j < candidates.size(); ++j)
+			{
+				short rel = TeBOUNDARY;
+				bool inside = false;
+
+				unsigned int nthVert = ring.size();
+				unsigned int iVert = 0u;
+
+				while(iVert < nthVert)
+				{
+					rel = TeRelation(ring[iVert], candidates[j][0]);
+
+					if(rel & TeINSIDE)
+					{
+					
+						inside = true;
+						newCandidates.push_back(candidates[j]);
+						break;
+					}
+					else if(rel & TeOUTSIDE)
+					{
+						break;
+					}
+				
+					++iVert;
+				}
+
+				if(iVert == nthVert)	
+				{				
+					break;
+				}				
+			}
+
+			int idxMinArea = 0;
+			double minArea = TeMAXFLOAT;
+			for(j = 0; j < newCandidates.size(); ++j)
+			{
+				if(TeGeometryArea(newCandidates[j].box()) < minArea)
+				{
+					idxMinArea = j;
+					minArea = TeGeometryArea(newCandidates[j].box());
+				}
+			}
+
+			if(newCandidates.size())
+				newCandidates[idxMinArea].add(ring);
+		}
+	}
+
+	it = pList.begin();
+	while (it != pList.end())
+	{
+		polys.add(*it);
+		++it;
+	}
+}
+
+void
+TeSHPPointDecode( TeLayer* layer, SHPHandle hSHP, vector<string>& indexVect, unsigned int chunckSize  )
+{
+	int nEntities = hSHP->nRecords; // indicates how many point sets are there
+	TePointSet points;
+
+/* -------------------------------------------------------------------- */
+/*	Skim over the list of shapes, reading all the vertices.	            */
+/* -------------------------------------------------------------------- */
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(nEntities);
+
+    int j;
+	for(j= 0; j < nEntities; j++ )
+    {
+        SHPObject* psShape = SHPReadObject( hSHP, j );
+		
+		int i;
+		for (i = 0; i < ( psShape->nVertices ); i++ )
+		{
+			TePoint point;
+			TeCoord2D xy ( psShape->padfX[i], psShape->padfY[i] );
+			point.add ( xy );
+			point.objectId ( indexVect[j] );
+			points.add ( point );
+		}
+		// check if there is a chunk of points to be inserted into the database
+		if ( points.size() >= chunckSize )
+		{
+			layer->addPoints( points ); 
+			points.clear();
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+						break;
+				else
+					TeProgress::instance()->setProgress(j+1);
+			}
+		}	
+		SHPDestroyObject( psShape );
+	}
+	layer->addPoints( points ); 
+	points.clear();
+	if(TeProgress::instance())
+		TeProgress::instance()->setProgress(j+1);
+}
+
+void
+TeSHPPolyLineDecode ( TeLayer*layer, SHPHandle hSHP, vector<string>& indexVect, unsigned int chunckSize )
+{
+	int nEntities = hSHP->nRecords; // indicates how many regions are there
+	TeLineSet lines;
+
+/* -------------------------------------------------------------------- */
+/*	Skim over the list of shapes, reading all the vertices.	            */
+/* -------------------------------------------------------------------- */
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(nEntities);
+
+	int i;
+    for(i = 0; i < nEntities; i++ )
+    {
+        SHPObject* psShape = SHPReadObject( hSHP, i );
+
+		// Build an array whose components point to the starting point
+		// of the rings that compose the shapepoly
+		int iPart;
+		vector<int> partStart;
+
+		// Build an array whose components point to the starting point
+		// of the segments that compose the shapeline
+		//
+		for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+		{
+			partStart.push_back ( psShape->panPartStart[iPart] );
+		}
+		partStart.push_back ( psShape->nVertices ); // point to the end
+
+		iPart = 0;
+
+		int j = 0; 
+
+		while ( j < psShape->nVertices )
+		{
+			TeLine2D line;
+
+			iPart++;  // indicates the different segments of the line
+			// Read each segment
+			while ( j < partStart[iPart] )
+			{
+				TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+				line.add ( pt );
+				j++;
+			}
+			// set the geometry Id for the line 
+			line.objectId ( indexVect[i] ); // set the object index
+			
+			lines.add ( line );
+		}
+		
+		// check if there is a chunk of lines to be inserted into the database
+		if ( lines.size() >= chunckSize )
+		{
+			layer->addLines( lines ); 
+			lines.clear();
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				else
+					TeProgress::instance()->setProgress(i+1);
+			}
+		}		
+		SHPDestroyObject( psShape );
+	}
+	
+	// saves the remaining lines into the database
+	layer->addLines( lines ); 
+	lines.clear();
+	if(TeProgress::instance())
+		TeProgress::instance()->setProgress(i+1);
+}
+
+void
+TeSHPPolygonDecode ( TeLayer* layer, SHPHandle hSHP, vector<string>& indexVect, unsigned int chunckSize )
+{
+
+	int nEntities = hSHP->nRecords; // indicates how many regions are there
+	TePolygonSet polys;
+
+/* -------------------------------------------------------------------- */
+/*	Skim over the list of shapes, reading all the vertices.	            */
+/* -------------------------------------------------------------------- */
+	if(TeProgress::instance())
+		TeProgress::instance()->setMessage("Importando poligonos, aguarde...      ");
+
+	int i;
+    for(i = 0; i < nEntities; i++ )
+    {
+		SHPObject* psShape = SHPReadObject( hSHP, i );
+
+		int iPart;
+		vector<int> partStart;
+
+		// Auxiliary variables
+
+		list<TePolygon> pList;
+
+		// Build an array whose components point to the starting point
+		// of the rings that compose the shapepoly
+		//
+		for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+		{
+			partStart.push_back ( psShape->panPartStart[iPart] );
+		}
+		partStart.push_back ( psShape->nVertices ); // point to the end
+
+		iPart = 0;
+
+		int j = 0;
+
+		while ( j < psShape->nVertices )
+		{
+			iPart++;  // indicates the different rings of the shapepoly
+			TeLine2D line;
+
+			// Read each ring
+			while ( j < partStart[iPart] )
+			{
+				TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+				line.add ( pt );
+				j++;
+			}
+			// end of a ring
+
+			if (!line.isRing())
+			{
+				line.add(line[0]);
+//				throw TeException ( POLYSHAPE_IS_NOT_RING );
+			}
+
+			TeLinearRing ring ( line );
+
+			// Is it an OUTER or an INNER RING ?
+
+			bool inside = false;
+
+			list<TePolygon>::iterator it = pList.begin();
+
+
+			// Each ring is assigned to a polygon
+			// Each ring and polygon have a unique "geometrical index"
+			//
+			// All rings and polygons that are part of a same object
+			// have the same "object index"
+
+			while ( it != pList.end() )
+			{
+				TePolygon aux;
+				aux.add(ring);
+				if ( TeWithin ( aux, (*it)))
+				{
+					inside = true;
+					ring.objectId ( (*it)[0].objectId() ); // sets the object index
+					(*it).add ( ring );// add a closed region
+					break;
+				}
+				++it;
+			}
+			if ( ! inside )
+			{
+				TePolygon poly;
+				ring.objectId (indexVect[i]);
+				
+				// add a pair (objectId, geometryId) to the layer
+				poly.add ( ring ); // add an outer region
+				poly.objectId ( indexVect[i] ); // set the object index
+
+				pList.push_back ( poly );
+			}
+		} // read all vertices
+
+		list<TePolygon>::iterator it = pList.begin();
+
+		while ( it != pList.end() )
+		{
+			polys.add(*it);
+			++it;
+		}
+		if ( polys.size() >= chunckSize )
+		{
+			layer->addPolygons( polys ); 
+			polys.clear();
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+						break;
+				else
+					TeProgress::instance()->setProgress(i+1);
+			}
+		}
+		SHPDestroyObject( psShape );
+	} // read all entities
+
+	// save the remaining polygons
+	layer->addPolygons( polys ); 
+	polys.clear();
+	if(TeProgress::instance())
+		TeProgress::instance()->setProgress(i+1);
+}
+
diff --git a/src/terralib/functions/TeImportSPR.cpp b/src/terralib/functions/TeImportSPR.cpp
new file mode 100644
index 0000000..7a0fdd5
--- /dev/null
+++ b/src/terralib/functions/TeImportSPR.cpp
@@ -0,0 +1,224 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// STL 
+#include <string>
+#include <iostream>
+#include <vector>
+#include <list>
+#include <map>
+
+using namespace std;
+
+// TerraLib
+
+#include "TeImportSPR.h"
+
+#include "TeAsciiFile.h"
+#include "TeBox.h"
+#include "TeLayer.h"
+#include "TeException.h"
+#include "TeUtils.h"
+
+
+void 
+TeImportSPR ( TeLayer& layer, const string& fileName )
+{
+
+	TePolygonSet& regions	= layer.polygonSet();
+	TeLineSet& lines		= layer.lineSet();
+	TePointSet& points		= layer.pointSet();
+	TeTextSet& textos		= layer.textSet();
+
+/* -------------------------------------------------------------------- */
+/*      Open the  file.                                                 */
+/* -------------------------------------------------------------------- */
+
+	TeAsciiFile	pFile (fileName);
+
+	int geomId = 1;
+	int size,nrings;
+
+	string geoId;
+
+/* -------------------------------------------------------------------- */
+/*      Get information about the file                                  */
+/* -------------------------------------------------------------------- */
+	string repType = pFile.readString ();
+	pFile.findNewLine();
+
+	if (repType == "POLIGONOS")
+	{
+		layer.addGeometry ( TePOLYGONS );
+		while ( 1 )
+		{
+			TePolygon poly;
+			nrings = pFile.readInt ();
+			if (!pFile.isNotAtEOF())
+				break;
+			geoId = pFile.readString ();
+			poly.objectId ( geoId );
+			int i,j;
+			for (j=0;j<nrings;j++)
+			{
+				TeLine2D line;
+				size = pFile.readInt ();
+				pFile.findNewLine();
+				for (i=0;i<size;i++)
+				{
+// Build the polygon
+					TeCoord2D xy = pFile.readCoord2D ();
+					line.add ( xy );
+				}
+				TeLinearRing ring (line);
+				ring.geomId ( geomId );
+				poly.add ( ring );
+				geomId++;
+			}
+			regions.add ( poly );
+		}
+		layer.setBox ( regions.box() );
+	}
+	if (repType == "LINHAS" || repType == "LINES")
+	{
+		TeDatum sad69 = TeDatumFactory::make("SAD69");
+		TeProjection* proj = new TeUtm ( sad69 , -39.*TeCDR);
+		layer.setProjection(proj);
+		string infoend;
+		char separator = ';';
+		while (infoend != "INFO_END" && pFile.isNotAtEOF())
+			infoend = pFile.readString ();
+		layer.addGeometry ( TeLINES );
+		while ( 1 )
+		{
+			geoId = pFile.readString ();
+			if (!pFile.isNotAtEOF())
+				break;
+			int i;
+			TeLine2D line;
+			size = pFile.readInt ();
+			pFile.findNewLine();
+			for (i=0;i<size;i++)
+			{
+// Build the line
+				TeCoord2D xy = pFile.readCoord2D ();
+				line.add ( xy );
+			}
+			line.objectId ( geoId );
+			line.geomId ( geomId );
+			geomId++;
+			lines.add ( line );
+		}
+		layer.setBox ( lines.box() );
+	}
+	if (repType == "POINT2D")
+	{
+		TeDatum sad69 = TeDatumFactory::make("SAD69");
+		TeProjection* proj = new TeUtm ( sad69 , -39.*TeCDR);
+		layer.addGeometry ( TePOINTS );
+		string infoend;
+		char separator = ';';
+		while (infoend != "INFO_END" && pFile.isNotAtEOF())
+			infoend = pFile.readString ();
+		pFile.findNewLine();
+		try
+		{
+			while ( pFile.isNotAtEOF() )
+			{
+				double x,y;
+				char rotulo [128], lixo[4];
+				string input = pFile.readLine();
+				if (!pFile.isNotAtEOF() || input == "END")
+					break;
+				sscanf (input.c_str (), "%lf %s %lf %s %s",&x, lixo, &y, lixo, rotulo);
+				geoId = rotulo;
+
+// Build the point
+				TePoint point;
+				TeCoord2D xy (x,y);
+//				xy = proj->PC2LL (xy);
+//				TeCoord2D xyd (xy.x()*TeCRD,xy.y()*TeCRD);
+				point.add ( xy );
+				point.objectId ( geoId );
+//				point.geomId ( geomId );	
+				points.add ( point );
+				geomId++;
+			}
+		}
+		catch (...)
+		{
+		}
+		layer.setBox ( points.box() );
+	}
+	if (repType == "TEXT")
+	{
+		TeDatum sad69 = TeDatumFactory::make("SAD69");
+		TeProjection* proj = new TeUtm ( sad69 , -39.*TeCDR);
+		layer.setProjection(proj);
+		layer.addGeometry ( TeTEXT );
+		string infoend;
+		char separator = ';';
+		while (infoend != "INFO_END" && pFile.isNotAtEOF())
+			infoend = pFile.readString ();
+		pFile.findNewLine();
+		try
+		{
+			while ( pFile.isNotAtEOF() )
+			{
+				double x,y,ang,exp,hgt;
+//				char rotulo [128], lixo[4];
+//				string input = pFile.readLine();
+//				if (!pFile.isNotAtEOF() || input == "END")
+//					break;
+//				sscanf (input.c_str (), "%lf %s %lf %1s %s %s %lf %s %lf %s %lf %s",
+//					&x, lixo, &y, lixo, rotulo, lixo, &ang, lixo, &exp, lixo, &hgt);
+				x = pFile.readFloatCSV(separator);
+				if (!pFile.isNotAtEOF() || x == 0.0)
+					break;
+				y = pFile.readFloatCSV(separator);
+				string rotulo = pFile.readStringCSV(separator);
+				ang = pFile.readFloatCSV(separator);
+				exp = pFile.readFloatCSV(separator);
+				hgt = pFile.readFloatCSV(separator);
+
+// Build the point
+				TeText texto;
+				TeCoord2D xy (x,y);
+//				xy = proj->PC2LL (xy);
+//				TeCoord2D xyd (xy.x()*TeCRD,xy.y()*TeCRD);
+				TeCoord2D xyd (x,y);
+				texto.add ( xyd );
+				texto.objectId ( geoId );
+				texto.setText ( rotulo );	
+				texto.setAngle ( ang );	
+				texto.setHeight ( hgt );	
+				textos.add ( texto );
+				pFile.findNewLine();
+			}
+		}
+		catch (...)
+		{
+		}
+		layer.setBox ( textos.box() );
+	}
+}
diff --git a/src/terralib/functions/TeImportSPR.h b/src/terralib/functions/TeImportSPR.h
new file mode 100644
index 0000000..64e3608
--- /dev/null
+++ b/src/terralib/functions/TeImportSPR.h
@@ -0,0 +1,18 @@
+/***************************************************************************
+*                                                                         *
+*   This program is free software; you can redistribute it and/or modify  *
+*   it under the terms of the GNU General Public License as published by  *
+*   the Free Software Foundation; either version 2 of the License, or     *
+*   (at your option) any later version.                                   *
+*                                                                         *
+***************************************************************************/
+#ifndef Te_SPR_H
+#define Te_SPR_H
+#include <string>
+using namespace std;
+
+class TeLayer;
+
+void TeImportSPR ( TeLayer& layer, const string& fileName );
+
+#endif
\ No newline at end of file
diff --git a/src/terralib/functions/TeLayerFunctions.cpp b/src/terralib/functions/TeLayerFunctions.cpp
new file mode 100644
index 0000000..f71ecba
--- /dev/null
+++ b/src/terralib/functions/TeLayerFunctions.cpp
@@ -0,0 +1,660 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeLayerFunctions.h"
+#include "TeImportRaster.h"
+#include "TeProgress.h"
+#include "TeRaster.h"
+
+
+bool TeCopyThemeToLayer(TeTheme* inTheme, TeLayer* outLayer, 
+							int selObj, map<string,string> *txtTable)
+{
+	if (!inTheme || !outLayer)
+		return false;
+
+	TeLayer* inLayer = inTheme->layer();
+
+	// both projection should be valid
+	// do not allow only one NoProjection 
+	TeProjection* pfrom = TeProjectionFactory::make(inTheme->layer()->projection()->params());
+	TeProjection* pto = TeProjectionFactory::make(outLayer->projection()->params());
+	TeDatabasePortal* portal = inLayer->database()->getPortal();
+	if (!portal)
+	{
+		delete pfrom;
+		delete pto;
+		return false;
+	}
+
+	string sql;
+	bool res = false;
+	if (inLayer->hasGeometry(TeRASTER))
+	{
+		TeRepresentation* rep = inLayer->getRepresentation(TeRASTER);
+		sql = "SELECT object_id FROM " + rep->tableName_;
+		if (portal->query(sql))
+		{
+			string objid;
+			TeRasterParams par;
+			TeRaster* rst;
+			while (portal->fetchRow())
+			{
+				objid = portal->getData(0);
+				rst = inLayer->raster(objid);
+				par = rst->params();
+				res = TeImportRaster(outLayer,rst,par.blockWidth_,par.blockHeight_,par.compression_[0],
+									 objid,par.dummy_[0],par.useDummy_,par.tiling_type_);
+			}
+		}
+
+		outLayer->database()->insertMetadata(outLayer->tableName(TeRASTER),"BLOCK_BOX", 0.0005,0.0005,outLayer->box());
+		outLayer->database()->createSpatialIndex(outLayer->tableName(TeRASTER),"BLOCK_BOX", (TeSpatialIndexType)TeRTREE);
+		portal->freeResult();
+	}
+
+
+	// this SQL selects instances of objects according to input, so it uses te_collection_aux
+	string inputInst;
+
+	// this SQL selects objects according to input, so it uses te_collection
+	string inputObj; 
+	if(selObj == 1) // queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+	else if(selObj == 2) // pointed
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 1";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 1";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+	else if(selObj == 3) // not queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 2";
+		inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 2";
+		inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+	}
+	else if(selObj == 4) // not pointed
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 1";
+		inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 1";
+		inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+	}
+	else if(selObj == 5) // pointed and queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+	else if(selObj == 6) // pointed or queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 1";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 1";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+
+	if (!res)
+	{
+		// Initally test if there is any object selected
+		sql = "SELECT c_object_id FROM " + inTheme->collectionTable();
+		if (!inputObj.empty())
+			sql += " WHERE " + inputObj;
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (!portal->fetchRow())
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return true;
+		}
+		portal->freeResult();
+	}
+
+	unsigned int	n = 1;
+	if (inLayer->hasGeometry(TePOINTS))
+	{
+		sql = "SELECT " + inLayer->tableName(TePOINTS) + ".* FROM ";
+		sql += inLayer->tableName(TePOINTS) + ", " + inTheme->collectionTable();
+		sql += " WHERE object_id = c_object_id";
+		if (!inputObj.empty())
+			sql += " AND " + inputObj;
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TePointSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+
+		outLayer->database()->insertMetadata(outLayer->tableName(TePOINTS),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+		outLayer->database()->createSpatialIndex(outLayer->tableName(TePOINTS),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+	}
+	
+	if (inLayer->hasGeometry(TeLINES))
+	{
+		sql = "SELECT " + inLayer->tableName(TeLINES) + ".* FROM ";
+		sql += inLayer->tableName(TeLINES) + ", " + inTheme->collectionTable();
+		sql += " WHERE object_id = c_object_id";
+		if (!inputObj.empty())
+			sql += " AND " + inputObj;
+		sql += " ORDER BY ext_max DESC";
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TeLineSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+
+		outLayer->database()->insertMetadata(outLayer->tableName(TeLINES),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+		outLayer->database()->createSpatialIndex(outLayer->tableName(TeLINES),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+	}
+	if (inLayer->hasGeometry(TePOLYGONS))
+	{
+		sql = "SELECT " + inLayer->tableName(TePOLYGONS) + ".* FROM ";
+		sql += inLayer->tableName(TePOLYGONS) + ", " + inTheme->collectionTable();
+		sql += " WHERE object_id = c_object_id";
+		if (!inputObj.empty())
+			sql += " AND " + inputObj;
+
+		if (inLayer->database()->dbmsName() != "OracleSpatial")
+			sql += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+		else
+			sql += " ORDER BY object_id ASC"; 
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TePolygonSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+
+		outLayer->database()->insertMetadata(outLayer->tableName(TePOLYGONS),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+		outLayer->database()->createSpatialIndex(outLayer->tableName(TePOLYGONS),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+	}
+
+	if (inLayer->hasGeometry(TeCELLS))
+	{
+		sql = "SELECT " + inLayer->tableName(TeCELLS) + ".* FROM ";
+		sql += inLayer->tableName(TeCELLS) + ", " + inTheme->collectionTable();
+		sql += " WHERE object_id = c_object_id";
+		if (!inputObj.empty())
+			sql += " AND " + inputObj;
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TeCellSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+
+		outLayer->database()->insertMetadata(outLayer->tableName(TeCELLS),"SPATIAL_DATA", 0.0005,0.0005,outLayer->box());
+		outLayer->database()->createSpatialIndex(outLayer->tableName(TeCELLS),"SPATIAL_DATA", (TeSpatialIndexType)TeRTREE);
+	}
+
+	if (inLayer->hasGeometry(TeTEXT))
+	{
+		unsigned int j;
+		vector<string> textTables;
+		vector<string> textDescr;
+		string selrep = "SELECT geom_table, description FROM te_representation WHERE layer_id = " + Te2String(inLayer->id());
+		selrep += " AND geom_type = " + Te2String(TeTEXT);
+		if (portal->query(selrep))
+		{
+			while(portal->fetchRow())
+			{
+				textTables.push_back(portal->getData(0));
+				textDescr.push_back(portal->getData(1));
+			}
+		}
+		portal->freeResult();
+
+		int k=1;
+		for (j=0; j<textTables.size(); j++)
+		{
+			string newTextTable = textTables[j] + "_1";
+			while (inLayer->database()->tableExist(newTextTable))
+			{
+				k++;
+				newTextTable = textTables[j] + "_" + Te2String(k);
+			}
+			sql = "SELECT " + textTables[j] + ".* FROM ";
+			sql += textTables[j] + ", " + inTheme->collectionTable();
+			sql += " WHERE object_id = c_object_id";
+			if(inputObj.empty() == false)
+				sql += " AND " + inputObj;
+			if (!portal->query(sql))
+			{
+				delete portal;
+				delete pfrom;
+				delete pto;
+				return false;
+			}
+			if (portal->fetchRow())
+			{
+				if (!outLayer->addGeometry(TeTEXT,newTextTable,textDescr[j]))
+				{
+					delete portal;
+					delete pfrom;
+					delete pto;
+					return false;
+				}
+				TeCopyPortalGeometriesToLayer<TeTextSet>(portal,pfrom,outLayer,newTextTable);
+				if (txtTable)
+				{
+					(*txtTable)[textTables[j]] = newTextTable;
+				}
+			}
+			portal->freeResult();
+		}
+	}
+
+	delete pfrom;
+	delete pto;
+	portal->freeResult();
+
+	TeAttrTableVector attributeTables;
+	inTheme->getAttTables(attributeTables);
+	sql = "SELECT table_id FROM te_theme_table WHERE theme_id = ";
+	bool hasExternal = false;
+	sql += Te2String(inTheme->id()) + " AND relation_id > 0";
+	if (portal->query(sql) && portal->fetchRow())
+		hasExternal = true;
+	portal->freeResult();
+	
+	for (unsigned int i=0; i<attributeTables.size(); i++)
+	{
+		TeTable table = attributeTables[i];
+		if ((table.tableType() == TeAttrExternal) || table.attributeList().size() <= 0)
+			continue;
+
+		TeAttributeList attListIn = table.attributeList();
+		table.setId(-1);
+		n = 1;
+		string tname = table.name();
+		string tlinkqueattr = table.linkName();
+		while (true)
+		{
+			if (!outLayer->database()->tableExist(tname))
+				break;
+			n++;
+			tname = table.name() + "_" + Te2String(n);
+		}
+		string tfrom = table.name();
+		table.name(tname);
+		if (outLayer->createAttributeTable(table))
+		{
+			string fieldsIn;
+			string fieldsOut;
+			vector<string> attNamesIn;
+			vector<string> attNamesOut;
+			table.attributeNames(attNamesOut);
+			for (n=0;n<attNamesOut.size()-1; n++)
+			{
+				fieldsOut += attNamesOut[n] + ",";
+				fieldsIn += tfrom + "." + attListIn[n].rep_.name_ + ",";
+			}
+			fieldsOut += attNamesOut[n];
+			fieldsIn += tfrom + "." + attListIn[n].rep_.name_;
+
+			if (!hasExternal)	// table might have temporal instances 
+			{
+				sql = "SELECT " + fieldsIn + " ";
+				sql += inTheme->sqlGridFrom();
+				if (!inputInst.empty())
+					sql += " WHERE " + inputInst;
+			}
+			else				// table doesn�t have temporal instances 
+			{
+				sql = "SELECT " + fieldsIn + " FROM " +  tfrom;
+				sql += ", " + inTheme->collectionTable() + " WHERE ";
+				sql += tfrom + "." + tlinkqueattr + "=" + inTheme->collectionTable() + ".c_object_id";
+				if (!inputObj.empty())
+					sql += " AND " + inputObj;
+			}
+
+			if (inLayer->database() == outLayer->database())
+			{
+				string popule = "INSERT INTO " + table.name() + " ( " + fieldsOut + ") " + sql;
+				inLayer->database()->execute(popule);
+			}
+			else
+			{
+				if (portal->query(sql))
+				{
+					int nr = 0;
+					while (portal->fetchRow())
+					{
+						TeTableRow row;
+						for(int i = 0; i < portal->numFields(); i++)
+							row.push_back(portal->getData(i));
+						table.add(row);
+						nr++;
+						if (nr % 100)
+						{
+							outLayer->saveAttributeTable(table);
+							table.clear();
+							nr = 0;
+						}
+					}
+					if (table.size() >0)
+						outLayer->saveAttributeTable(table);
+					table.clear();
+				}
+			}
+		}
+	}	
+	delete portal;
+	return true;
+}
+
+
+bool TeCopyLayerToLayer(TeLayer* inLayer, TeLayer* outLayer, map<string,string> *txtTable)
+{
+	if (!inLayer || !outLayer)
+		return false;
+
+	// both projection should be valid
+	// do not allow only one NoProjection 
+	TeProjection* pfrom = TeProjectionFactory::make(inLayer->projection()->params());
+	TeProjection* pto   = TeProjectionFactory::make(outLayer->projection()->params());
+	if (!pfrom || !pto || (pfrom->name() == "NoProjection" ||  pto->name() == "NoProjection") && 
+		!(pfrom->name() == pto->name()))
+	{
+		delete pfrom;
+		delete pto;
+		return false;
+	}
+	TeDatabasePortal* portal = inLayer->database()->getPortal();
+	if (!portal)
+	{
+		delete pfrom;
+		delete pto;
+		return false;
+	}
+
+	string sql;
+	bool res;
+	if (inLayer->hasGeometry(TeRASTER))
+	{
+		TeRepresentation* rep = inLayer->getRepresentation(TeRASTER);
+		sql = "SELECT object_id FROM " + rep->tableName_;
+		if (portal->query(sql))
+		{
+			string objid;
+			TeRasterParams par;
+			TeRaster* rst;
+			while (portal->fetchRow())
+			{
+				objid = portal->getData(0);
+				rst = inLayer->raster(objid);
+				par = rst->params();
+				res = TeImportRaster(outLayer,rst,par.blockWidth_,par.blockHeight_,par.compression_[0],
+									 objid,par.dummy_[0],par.useDummy_,par.tiling_type_);
+			}
+		}
+		portal->freeResult();
+	}
+
+	unsigned int	n = 1;
+	if (inLayer->hasGeometry(TePOINTS))
+	{
+		sql = "SELECT " + inLayer->tableName(TePOINTS) + ".* FROM ";
+		sql += inLayer->tableName(TePOINTS);
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+				TeCopyPortalGeometriesToLayer<TePointSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+	}
+	
+	if (inLayer->hasGeometry(TeLINES))
+	{
+		sql = "SELECT " + inLayer->tableName(TeLINES) + ".* FROM ";
+		sql += inLayer->tableName(TeLINES);
+		sql += " ORDER BY ext_max DESC";
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TeLineSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+	}
+	if (inLayer->hasGeometry(TePOLYGONS))
+	{
+		sql = "SELECT " + inLayer->tableName(TePOLYGONS) + ".* FROM ";
+		sql += inLayer->tableName(TePOLYGONS);
+		if (inLayer->database()->dbmsName() != "OracleSpatial")
+			sql += " ORDER BY object_id ASC, parent_id ASC, num_holes DESC";
+		else
+			sql += " ORDER BY object_id ASC"; 
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TePolygonSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+	}
+
+	if (inLayer->hasGeometry(TeCELLS))
+	{
+		sql = "SELECT " + inLayer->tableName(TeCELLS) + ".* FROM ";
+		sql += inLayer->tableName(TeCELLS) ;
+
+		if (!portal->query(sql))
+		{
+			delete portal;
+			delete pfrom;
+			delete pto;
+			return false;
+		}
+		if (portal->fetchRow())
+			TeCopyPortalGeometriesToLayer<TeCellSet>(portal,pfrom,outLayer);
+		portal->freeResult(); 
+	}
+	if (inLayer->hasGeometry(TeTEXT))
+	{
+		unsigned int j;
+		vector<string> textTables;
+		vector<string> textDescr;
+		string selrep = "SELECT geom_table, description FROM te_representation WHERE layer_id = " + Te2String(inLayer->id());
+		selrep += " AND geom_type = " + Te2String(TeTEXT);
+		if (portal->query(selrep))
+		{
+			while(portal->fetchRow())
+			{
+				textTables.push_back(portal->getData(0));
+				textDescr.push_back(portal->getData(1));
+			}
+		}
+		portal->freeResult();
+
+		int k=1;
+		for (j=0; j<textTables.size(); j++)
+		{
+			string newTextTable = textTables[j] + "_1";
+			while (inLayer->database()->tableExist(newTextTable))
+			{
+				k++;
+				newTextTable = textTables[j] + "_" + Te2String(k);
+			}
+			sql = "SELECT " + textTables[j] + ".* FROM ";
+			sql += textTables[j] ;
+			if (!portal->query(sql))
+			{
+				delete portal;
+				delete pfrom;
+				delete pto;
+				return false;
+			}
+			
+			if (portal->fetchRow())
+			{
+				if (!outLayer->addGeometry(TeTEXT,newTextTable,textDescr[j]))
+				{
+					delete portal;
+					delete pfrom;
+					delete pto;
+					return false;
+				}
+				TeCopyPortalGeometriesToLayer<TeTextSet>(portal,pfrom,outLayer,newTextTable);
+				if (txtTable)
+				{
+					(*txtTable)[textTables[j]] = newTextTable;
+				}
+			}
+			portal->freeResult();
+		}
+	}
+	delete pfrom;
+	delete pto;
+	portal->freeResult();
+
+	vector<TeTable> attributeTables;
+	inLayer->getAttrTables(attributeTables);
+	for (unsigned int i=0; i<attributeTables.size(); i++)
+	{
+		TeTable table = attributeTables[i];
+		if (table.attributeList().size() <= 0)
+			continue;
+
+		TeAttributeList attListIn = table.attributeList();
+		table.setId(-1);
+		n = 1;
+		string tname = table.name();
+		while (true)
+		{
+			if (!outLayer->database()->tableExist(tname))
+				break;
+			n++;
+			tname = table.name() + "_" + Te2String(n);
+		}
+		string tfrom = table.name();
+		table.name(tname);
+		if (outLayer->createAttributeTable(table))
+		{
+			if (inLayer->database() == outLayer->database())
+			{
+				string fieldsIn;
+				string fieldsOut;
+				vector<string> attNamesIn;
+				vector<string> attNamesOut;
+				table.attributeNames(attNamesOut);
+				for (n=0;n<attNamesOut.size()-1; n++)
+				{
+					fieldsOut += "`" + attNamesOut[n] + "`,";
+					fieldsIn += attListIn[n].rep_.name_ + ",";
+				}
+				fieldsOut += "`" + attNamesOut[n]+ "`";
+				fieldsIn += attListIn[n].rep_.name_;
+
+				sql = "SELECT " + fieldsIn + " FROM " + tfrom;
+				string popule = "INSERT INTO " + table.name() + " ( " + fieldsOut + ") " + sql;
+				inLayer->database()->execute(popule);
+			}
+			else
+			{
+				portal->freeResult();
+				sql = "SELECT * FROM " + tfrom;
+				if (portal->query(sql))
+				{
+					int nr = 0;
+					while (portal->fetchRow())
+					{
+						TeTableRow row;
+						for(int i = 0; i < portal->numFields(); i++)
+						{
+							if (table.attributeList()[i].rep_.type_== TeDATETIME)
+							{
+								TeTime t = portal->getDate(i);
+								string temp = t.getDateTime(table.attributeList()[i].dateTimeFormat_,table.attributeList()[i].dateSeparator_, table.attributeList()[i].timeSeparator_);
+								row.push_back(temp);
+							}
+							else
+								row.push_back(portal->getData(i));
+						}
+						table.add(row);
+						nr++;
+						if (nr % 100)
+						{
+							outLayer->saveAttributeTable(table);
+							table.clear();
+							nr = 0;
+						}
+					}
+					if (table.size() >0)
+						outLayer->saveAttributeTable(table);
+					table.clear();
+				}
+			}
+		}
+	}	
+	delete portal;
+	return true;
+}
diff --git a/src/terralib/functions/TeLayerFunctions.h b/src/terralib/functions/TeLayerFunctions.h
new file mode 100644
index 0000000..5db328c
--- /dev/null
+++ b/src/terralib/functions/TeLayerFunctions.h
@@ -0,0 +1,197 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeLayerFunctions.h
+    This file contains functions to deal with layers 
+*/
+#ifndef  __TERRALIB_INTERNAL_LAYERFUNCTIONS_H
+#define  __TERRALIB_INTERNAL_LAYERFUNCTIONS_H
+
+#include "TeLayer.h"
+#include "TeVectorRemap.h"
+#include "TeTheme.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+
+
+//! Imports a geometry set to a layer, creating an empty attribute table
+/*!
+	This function imports a geometry set to a layer.
+	An attribute table is automatically created with only the object_id field.
+	If geometries don�t have object ids a unique identification will be automatically generated
+	\param layer pointer to a layer previously created 
+    \param geomSet the geometry set
+    \return TRUE or FALSE whether the geometry set was imported successfully
+*/
+template <class G>
+bool TeImportGeometriesToLayer(TeLayer* layer, G& geomSet)
+{
+	if (!layer)
+
+		return false;
+
+	TeDatabase* db = layer->database();
+	int nTab = 0;
+	TeAttrTableVector attTables;
+	if (layer->getAttrTables(attTables))
+		nTab = attTables.size();
+	
+	string tabName = "AttributeTable_" + Te2String(layer->id()) + "_" + Te2String(nTab); 
+	TeAttributeList attList;
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.numChar_ = 16;
+	at.rep_.name_ = "object_id";
+	at.rep_.isPrimaryKey_ = true;
+	attList.push_back(at);
+
+	TeTable attTable(tabName,attList,"object_id", "object_id",TeAttrStatic);
+
+	TeTableRow row;
+	for (int i=0; i<geomSet.size(); i++)
+	{
+		row.clear();
+		string id = geomSet[i].objectId();
+		if (id.empty())
+		{
+			id = Te2String(i);
+			geomSet[i].objectId(id);
+		}
+		row.push_back(id);
+		attTable.add(row);
+	}
+	
+	if (!layer->addGeometrySet(geomSet))
+	{
+		attTable.clear();
+		db->deleteLayer(layer->id());
+		return false;
+	}
+	
+	if (!layer->createAttributeTable(attTable))
+	{
+		attTable.clear();
+		db->deleteLayer(layer->id());
+		return false;
+	}
+
+	if (!layer->saveAttributeTable(attTable))
+	{
+		attTable.clear();
+		db->deleteLayer(layer->id());
+		return false;
+	}
+	
+	attTable.clear();
+	return true;
+}
+
+//! Copy the geometries retrieved in a portal to layer
+/*
+	\param portal pointer to a portal that has executed a query for geometries
+	\param proj pointer to the projection associated to the geometries
+	\param layer pointer to the destination layer 
+	\param tname optional parameter indicating the name of a table to store the geometries
+*/
+template<typename GS>
+GS* 
+TeCopyPortalGeometriesToLayer(TeDatabasePortal* portal, TeProjection* proj, TeLayer* layer, const string& tName="")
+{
+	if (!portal ||!layer)
+		return 0;
+
+	TeProjection* pfrom = TeProjectionFactory::make(proj->params());
+	TeProjection* pto = TeProjectionFactory::make(layer->projection()->params());
+	bool doRemap;
+	if (!pfrom || !pto || (pfrom->name() == "NoProjection" ||  pto->name() == "NoProjection") && 
+		!(pfrom->name() == pto->name()))
+		doRemap = false;
+	else
+		doRemap= !(*pfrom == *pto);
+
+	if (doRemap)
+		pfrom->setDestinationProjection(pto);
+	
+	if (TeProgress::instance())
+			TeProgress::instance()->setTotalSteps(portal->numRows());
+
+	GS set1;
+	int n = 1; 
+	bool flag=false;
+	do
+	{
+		typename GS::value_type elemI;
+		flag = portal->fetchGeometry(elemI);
+		if (doRemap)
+		{
+			typename GS::value_type elemO;
+			TeVectorRemap(elemI,pfrom,elemO,pto);
+			elemO.objectId(elemI.objectId());
+			set1.add(elemO);
+		}
+		else
+			set1.add(elemI);
+
+		if (((n%100) == 0) || !flag)
+		{	
+			layer->addGeometrySet(set1,tName);
+			set1.clear();
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				else
+					TeProgress::instance()->setProgress(n);
+			}	
+		}
+		n++;
+	} while (flag);
+	delete pfrom;
+	delete pto;
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	return 0;
+}
+
+//! This function fills a layer with the objects selected in a theme
+/*
+	\param inTheme pointer to the source theme
+	\param outLayer pointer to the destination layer (already created)
+	\param selObj flag to indicate with objects of the theme should be copied.
+	\param txtTable pointer to a map<string,string> to return the old and
+	new names of the text tables
+*/
+bool TeCopyThemeToLayer(TeTheme* inTheme, TeLayer* outLayer, 
+							int selObj, map<string,string> *txtTable=0);
+
+//! This function copies a layer to another
+/*
+	\param inLayer pointer to the source theme
+	\param outLayer pointer to the destination layer (already created)
+	\param txtTable pointer to a map<string,string> to return the old and
+	new names of the text tables
+*/
+bool TeCopyLayerToLayer(TeLayer* inLayer, TeLayer* outLayer, map<string,string> *txtTable=0);
+
+#endif
diff --git a/src/terralib/functions/TeMIFProjection.cpp b/src/terralib/functions/TeMIFProjection.cpp
new file mode 100644
index 0000000..0175a7c
--- /dev/null
+++ b/src/terralib/functions/TeMIFProjection.cpp
@@ -0,0 +1,340 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif 
+
+#include <map>
+#include <string>
+#include "TeMIFProjection.h"
+#include "TeDatum.h"
+#include "TeProjection.h"
+#include "TeException.h"
+#include "TeUtils.h"
+
+using namespace std;
+/*--- 
+Projection Information
+
+contains information about the parameters
+needed by each projection
+
+parameters are:
+
+- Name
+- Datum 
+- Units 
+- Origin Longitude,
+- Origin Latitude,
+- Standard Paralel 1
+- Standard Paralel 2
+- Scale Factor
+- False Easting
+- False Northing 
+- Range
+
+---*/
+
+const int NUM_MIF_PROJ = 7;
+const int NUM_MIF_DATUM = 19;
+const int NUM_MIF_UNITS = 13;
+
+
+// Name            Units  Long  Lat  Par1  Par2	Sca  Eas  Nor 
+char* mifProjInfo[]= {
+"LatLong",          "0",  "0",  "0", "0",  "0",	"0", "0", "0", 
+"Albers",           "1",  "1",  "1", "1",  "1",	"0", "1", "1", 
+"LambertConformal", "1",  "1",  "1", "1",  "1",	"0", "1", "1", 
+"Mercator",         "1",  "1",  "0", "0",  "0",	"0", "0", "0", 
+"Miller",           "1",  "1",  "0", "0",  "0",	"0", "0", "0", 
+"UTM",              "1",  "1",  "1", "0",  "0",	"1", "1", "1", 
+"Polyconic",        "1",  "1",  "1", "1",  "0",	"0", "1", "1"
+};
+
+char* mifProjCode[]= {
+"1", "LatLong",
+"3",  "LambertConformal",
+"8",  "UTM",
+"9",  "Albers",
+"10", "Mercator", 
+"11", "Miller",
+"27", "Polyconic"
+};
+
+char* mifDatumCode[] = {
+"0",   "Spherical",
+"23",  "Astro-Chua",	
+"24",  "CorregoAlegre",
+"40",  "Indian",
+"41",  "Indian",
+"62",  "NAD27",
+"63",  "NAD27",
+"64",  "NAD27",
+"65",  "NAD27",
+"66",  "NAD27",
+"67",  "NAD27",
+"68",  "NAD27",
+"69",  "NAD27",
+"70",  "NAD27",
+"71",  "NAD27",
+"72",  "NAD27",
+"74",  "NAD83",
+"92",  "SAD69",
+"104", "WGS84"
+};
+
+char* mifUnitsCode[] = {
+"6",  "Centimeters",
+"31", "Chains",
+"3",  "Feet",
+"2",  "Inches",
+"1",  "Kilometers",
+"30", "Links",
+"7",  "Meters",
+"0",  "Miles",
+"5",  "Millimeters",
+"9",  "Nautical Miles",
+"32", "Rods",
+"8",  "US Survey Feet",
+"4",  "Yards"
+};
+
+
+
+// Definitions for types used
+typedef map<int,string> NameMap;
+typedef map<int, string> MIFCodeMap;
+
+// Prototypes for aux functions
+
+TeProjInfo TeMIFProjectionInfo  ( const string& projName  );
+TeDatum TeMIFProjectionDatum    ( const int&  datCode );
+string TeMIFProjectionName      ( const int&  prjCode );
+string TeMIFProjectionUnits	( const int& unitsCode );
+
+
+TeProjection*
+TeMIFProjectionFactory::make ( vector<string>& argList )
+{
+	// Create a TerraLib projection from MIF information]
+	// INPUT - a list of parameters
+
+	int argInd = 0;
+
+	TeProjectionParams params;
+	params.hemisphere = TeSOUTH_HEM;
+
+	// Step 1 - read the projection name
+	
+	int projCode = atoi( argList[argInd++].c_str() );
+
+	params.name = TeMIFProjectionName ( projCode );
+
+	// Step 2 - read the datum
+
+	int datumCode = atoi( argList[argInd++].c_str() );
+	TeProjInfo pjInfo;
+	try 
+	{    
+		params.datum = TeMIFProjectionDatum ( datumCode );
+		// Step 3 - Build a map of Projection info
+		pjInfo = TeMIFProjectionInfo ( params.name );
+	}
+	catch (...)
+	{
+		TeProjection* nproj = new TeNoProjection();
+		return nproj;
+	}
+
+	// Step 4 - Read the appropriate parameters
+
+	if ( pjInfo.hasUnits ) 
+	{
+		string unitsName = argList[argInd++];
+		string unitsName2 = TeRemoveSpecialChars(unitsName);
+		if (unitsName2 == "m" || unitsName2 == "M")
+			unitsName2 = "Meters";
+		params.units = unitsName2;
+	}
+	else
+		params.units = "DecimalDegrees"; 
+
+	string val; 
+	if ( pjInfo.hasLon0 )
+	{
+		val = argList[argInd++].c_str();
+		params.lon0 = atof(val.c_str())*TeCDR;
+	}
+
+	if ( pjInfo.hasLat0 )
+	{
+		val = argList[argInd++].c_str();
+		params.lat0 = atof(val.c_str())*TeCDR;
+	}
+
+	if ( pjInfo.hasStlat1 )
+	{
+		val = argList[argInd++].c_str();
+		params.stlat1 = atof(val.c_str())*TeCDR;
+	}
+
+	if ( pjInfo.hasStlat2 )
+	{
+		val = argList[argInd++].c_str();
+		params.stlat2 = atof(val.c_str())*TeCDR;
+	}
+
+	if ( pjInfo.hasScale )
+	{
+		val = argList[argInd++].c_str();
+		params.scale = atof(val.c_str());
+	}
+
+	if ( pjInfo.hasOffx )
+	{
+		val = argList[argInd++].c_str();
+		params.offx = atof(val.c_str());
+	}
+
+	if ( pjInfo.hasOffy )
+	{
+		val = argList[argInd++].c_str();
+		params.offy = atof(val.c_str());
+	}
+
+	// Step 4 - create the projection
+
+	return TeProjectionFactory::make ( params );
+}
+
+
+TeProjInfo
+TeMIFProjectionInfo ( const string& projName  )
+{
+
+	TeProjInfoMap pjMap;
+	TeProjInfo pjInfo;
+
+	int k = 0;
+
+	for ( int i = 0; i < NUM_MIF_PROJ; i++ )
+	{
+		string name = mifProjInfo [k++];
+			
+	    pjInfo.hasUnits  = atoi ( mifProjInfo [k++] );
+	    pjInfo.hasLon0   = atoi ( mifProjInfo [k++] );
+	    pjInfo.hasLat0   = atoi ( mifProjInfo [k++] );
+	    pjInfo.hasStlat1 = atoi ( mifProjInfo [k++] );
+		pjInfo.hasStlat2 = atoi ( mifProjInfo [k++] );
+		pjInfo.hasScale  = atoi ( mifProjInfo [k++] );
+		pjInfo.hasOffx   = atoi ( mifProjInfo [k++] );
+	    pjInfo.hasOffy   = atoi ( mifProjInfo [k++] );
+
+		pjMap [ name ] = pjInfo;
+	}
+
+
+	TeProjInfoMap::iterator it = pjMap.find ( projName );
+
+	if ( it == pjMap.end() )
+		throw TeException ( PROJECTION_NOT_AVAILABLE );
+
+return (*it).second;
+}
+
+TeDatum
+TeMIFProjectionDatum ( const int& datCode )
+{
+
+	MIFCodeMap datumCode;
+
+	int k= 0;
+
+	for ( int i = 0; i < NUM_MIF_DATUM; i++ )
+	{
+		int code    = atoi ( mifDatumCode [k++] );
+		string name = mifDatumCode [k++];
+
+		datumCode [ code ] = name;
+	}
+
+	MIFCodeMap::iterator it = datumCode.find ( datCode );
+
+	if ( it == datumCode.end() )
+		throw TeException ( DATUM_ERROR );			
+		
+    string datName = (*it).second;
+
+	return TeDatumFactory::make ( datName );
+
+}
+
+string
+TeMIFProjectionName ( const int& prjCode )
+{
+
+	MIFCodeMap projCode;
+	
+	int k= 0;
+
+	for ( int i = 0; i < NUM_MIF_PROJ; i++ )
+	{
+		int code    = atoi ( mifProjCode [k++] );
+		string name = mifProjCode [k++];
+
+		projCode [ code ] = name;
+	}
+
+	MIFCodeMap::iterator it = projCode.find ( prjCode );
+
+	if ( it == projCode.end() )
+		throw TeException ( PROJECTION_NOT_AVAILABLE );
+
+return (*it).second;
+
+}
+
+string 
+TeMIFProjectionUnits ( const int& code )
+{
+	MIFCodeMap unitsCode;
+	
+	int k= 0;
+
+	for ( int i = 0; i < NUM_MIF_UNITS; i++ )
+	{
+		int code    = atoi ( mifUnitsCode [k++] );
+		string name = mifUnitsCode [k++];
+
+		unitsCode [ code ] = name;
+	}
+
+	MIFCodeMap::iterator it = unitsCode.find ( code );
+
+	if ( it == unitsCode.end() )
+		return "Meters";
+
+return (*it).second;
+
+}
diff --git a/src/terralib/functions/TeMIFProjection.h b/src/terralib/functions/TeMIFProjection.h
new file mode 100644
index 0000000..d05764c
--- /dev/null
+++ b/src/terralib/functions/TeMIFProjection.h
@@ -0,0 +1,39 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_MIFPROJECTION_H
+#define  __TERRALIB_INTERNAL_MIFPROJECTION_H
+
+#include <vector>
+#include <string>
+using namespace std;
+
+class TeProjection;
+//! A factory to build projection from some MIF parameters stored in a vector of strings
+class TeMIFProjectionFactory
+{
+public:
+	static TeProjection* make ( vector<string>& );
+};
+#endif
+
diff --git a/src/terralib/functions/TeSPRFile.cpp b/src/terralib/functions/TeSPRFile.cpp
new file mode 100644
index 0000000..266ad67
--- /dev/null
+++ b/src/terralib/functions/TeSPRFile.cpp
@@ -0,0 +1,310 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+ 
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include "TeSPRFile.h" 
+#include "TeAssertions.h" 
+#include "TeDefines.h"
+#include "TeProjection.h"
+#include "TeDatum.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+  
+TeSPRFile::TeSPRFile ( const string& name, const char* mode, char separator): 	
+	TeAsciiFile ( name, mode  ) 
+{
+	separator_ = separator;
+}  
+
+void
+TeSPRFile::writeLabelHeader ( const int& option )	 
+{
+	if (option == TeSPRNetwork) 
+		fprintf(file_,"%s\n", "NETWORK_OBJECTS" );
+	else 
+		fprintf(file_,"%s\n", "POINTS" ); 	
+	fprintf(file_,"%s\n", "INFO");
+	fprintf(file_,"%s %c \n", "SEPARATOR ",  separator_  );
+	fprintf(file_,"%s\n", "// SPRING Interchange File" );
+	
+	if (option == TeSPRThematic)
+		fprintf(file_,"%s \n", "// Format coordx ; coordy ; classe");	
+	else 
+		fprintf(file_,"%s \n", "// Format coordx ; coordy  ; label ; name ; category_obj");	
+	fprintf(file_,"%s\n", "INFO_END"); 
+}
+
+ 
+void  
+TeSPRFile::writeCadastralLabel ( const string& geoid, const double& x, const double& y,
+					   const string& objectCategory) 
+{
+	if (geoid != "")
+	{
+		fprintf ( file_, "%.10E %c %.10E %c %s %c %s %c %s \n", 
+		(float)x, separator_, (float)y, separator_, geoid.c_str(), separator_, geoid.c_str(), separator_, objectCategory.c_str() );  
+	}
+}
+
+void 
+TeSPRFile::writeThematicLabel( const double& x, const double& y, const string& theme )
+{
+	if ( theme != "")
+		fprintf ( file_, "%.10E %c %.10E %c %s \n", 
+		(float)x, separator_, (float)y, separator_, theme.c_str() );  
+}
+
+void  
+TeSPRFile::writeNetworkLabel ( const string& geoid, const double& x, const double& y,
+					   const string& objectCategory) 
+{
+	if (geoid != "")
+	{
+		fprintf ( file_, "%.10E %c %.10E %c %s %c %s %c %s %c LINES\n", 
+		(float)x, separator_, (float)y, separator_, geoid.c_str(), separator_, geoid.c_str(), separator_, objectCategory.c_str(), separator_ );  
+	}
+
+}
+
+
+void 
+TeSPRFile::writeThematicPoint( const double& x, const double& y, const string& theme )
+{
+	if ( theme != "")
+		fprintf ( file_, "%.10E %c %.10E %c %s \n", 
+		(float)x, separator_, (float)y, separator_, theme.c_str() );  
+	else
+		fprintf ( file_, "%.10E %c %.10E %c Nenhuma \n", 
+		(float)x, separator_, (float)y, separator_ );  
+
+}
+
+
+void 
+TeSPRFile::writeProjection( TeProjection* proj ) 
+{
+	if (proj)
+	{
+		fprintf ( file_, "PROJECTION %s/%s\n", proj->name().c_str(),proj->datum().name().c_str());
+	}
+}
+
+void 
+TeSPRFile::writeBox( TeBox& box ) 
+{
+	TeCoord2D pt1 = box.lowerLeft();
+	TeCoord2D pt2 = box.upperRight();
+
+	fprintf ( file_, "%s %.10E %.10E %.10E %.10E \n", "BOX", pt1.x(), pt1.y(), pt2.x(),  pt2.y());
+	fprintf ( file_, "%s\n", "// " );
+}
+  
+//===================================================
+//
+//  Write lines header information
+//
+//===================================================
+
+void
+TeSPRFile::writeLinesHeader ()  
+{
+	fprintf(file_,"%s\n", "LINES" );
+	fprintf(file_,"%s\n", "INFO");
+	fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+
+
+//===================================================
+//
+//  TeSPRPoints- Write points header information
+//
+//===================================================
+
+void
+TeSPRFile::writePointsHeader ()  
+{
+	fprintf(file_,"%s\n", "POINT2D" );
+	fprintf(file_,"%s\n", "INFO");
+	fprintf(file_,"%s %c \n", "SEPARATOR ",  separator_  );
+	fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+//===================================================
+//
+//  TeSPRTable - Write TABLE information
+//
+//===================================================
+
+void
+TeSPRFile::writeTableHeader (const int& /* dType */)  
+{
+	fprintf(file_,"%s\n", "TABLE" );
+	fprintf(file_,"%s\n", "INFO");
+	fprintf(file_,"%s\n", "// SPRING Interchange File" );
+	fprintf(file_,"%s %c\n", "SEPARATOR ", separator_ );
+	fprintf(file_,"%s\n", "UNFORMATED ");
+	
+ } 
+ 
+void 
+TeSPRFile::writeAttributeInfo( TeAttributeList& attList, const string& objCategory,
+							   const string& indexName ) 
+{
+ 	fprintf(file_,"%s\n", "// Attribute Information" );  	// Write basic attribute info  	
+	fprintf (file_, "%s %s \n", "CATEGORY_OBJ", objCategory.c_str() ); 	
+	fprintf (file_, "%s%c%s%c%s%c%s \n", "T_KEY", separator_, "TEXT", separator_, "32", separator_, "0"); 	
+	fprintf (file_, "%s%c%s%c%s%c%s \n", "T_NAME", separator_, "TEXT", separator_, "32", separator_, "0");
+
+	TeAttributeList::iterator it = attList.begin();
+
+	for ( ;it != attList.end();++it )
+	{
+		string name = (*it).rep_.name_;
+		if ( TeConvertToUpperCase(name) == TeConvertToUpperCase(indexName) ) continue; // skip the index name
+		switch ((*it).rep_.type_)
+		{
+			case TeSTRING:
+				this->writeTextParameterInfo(name, (*it).rep_.numChar_);
+				break;
+			case TeREAL:
+				this->writeRealParameterInfo(name);
+				break;
+			case TeINT:
+				this->writeIntParameterInfo(name);
+				break;
+			case TeCHARACTER:
+				this->writeTextParameterInfo(name,1);
+				break;
+			case TeDATETIME:
+				this->writeTextParameterInfo(name,25);
+            default:
+                break;
+		}
+	}  
+} 
+void
+TeSPRFile::writeTextParameterInfo ( const string& name, int w )
+{
+
+	char sprName [TeNAME_LENGTH];
+
+	int width = w;
+	if ( w == 0 )
+		width = name.size();
+
+	TeConvertToUpperCase ( name, sprName );
+
+	fprintf ( file_, "%s%c%s%c%d%c%d \n", sprName, separator_, "TEXT", separator_, width, separator_, 0 );
+}
+
+void
+TeSPRFile::writeRealParameterInfo ( const string& name )
+{
+	char sprName [TeNAME_LENGTH];
+
+	TeConvertToUpperCase ( name, sprName );
+
+	fprintf ( file_, "%s%c%s%c%d%c%d \n", sprName, separator_, "REAL", separator_, 17, separator_,8 );
+}
+
+void
+TeSPRFile::writeIntParameterInfo ( const string& name )
+{
+	char sprName [TeNAME_LENGTH];
+
+	TeConvertToUpperCase ( name, sprName );
+
+	fprintf ( file_, "%s%c%s%c%d%c%d \n", sprName, separator_, "INTEGER", separator_, 10, separator_, 0 );
+}
+
+void
+TeSPRFile::writeValue ( const string& value, TeAttrDataType type )
+{
+	switch ( type )
+	{
+		case TeINT :
+			writeValue ( atoi ( value.c_str())  ); 
+			break;
+		case TeREAL :
+			writeValue ( atof ( value.c_str())  ); 
+			break;
+		default :
+			writeValue ( value );
+	}
+
+}
+
+
+//===================================================
+//
+//  Write SAMPLE information
+//
+//===================================================
+
+void
+TeSPRFile::writeSampleHeader ()
+{
+	fprintf(file_,"%s\n", "SAMPLE" );
+	fprintf(file_,"%s\n", "INFO");
+	fprintf(file_,"%s %c \n", "SEPARATOR ",  separator_  );
+	fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+
+void
+TeSPRFile::writeSample( const string& /* geoid */, const double& x, 
+ 						  const double& y, const string& value) 
+{
+	fprintf ( file_, "%s \n", "POINT3D" );
+	fprintf ( file_, "%.10E %c %.10E %c %s \n", x, separator_, y, separator_, value.c_str() ); 
+	fprintf ( file_, "%s \n", "END" );
+}
+
+//===================================================
+//
+//  Write NETWORK information
+//
+//===================================================
+
+
+void 
+TeSPRFile::writeNetworkHeader()
+{
+	fprintf(file_,"%s\n", "NETWORK" );
+	fprintf(file_,"%s\n", "INFO");
+	fprintf(file_,"%s\n", "// SPRING Interchange File" );
+}
+
+
+void
+TeSPRFile::writeArcHeader ( const string& geoid, const double& posImp, 
+		const double& negImp, const double& demand)
+{
+	fprintf ( file_, "%s %.10E %.10E %.10E \n", geoid.c_str(), posImp, negImp, demand ); 
+}
+
+
diff --git a/src/terralib/functions/TeSPRFile.h b/src/terralib/functions/TeSPRFile.h
new file mode 100644
index 0000000..67dadc6
--- /dev/null
+++ b/src/terralib/functions/TeSPRFile.h
@@ -0,0 +1,185 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_SPRFILE_H
+#define  __TERRALIB_INTERNAL_SPRFILE_H
+
+#include "TeAsciiFile.h"
+#include "TeDataTypes.h"
+#include "TeCoord2D.h"
+#include "TeAttribute.h"
+#include "TeProjection.h"
+
+#include <string>
+#include <stdio.h>
+using namespace std;
+
+//! Provides support for writing SPRING/ASCII files
+class TeSPRFile : public TeAsciiFile
+{
+public:
+
+	//! Contructors
+
+	TeSPRFile(const string& fileName, const char* mode, char separator = ';');
+
+	//! Destructor
+
+	virtual ~TeSPRFile() {} //! base class
+
+	//! LINES - write header
+	void writeLinesHeader ();
+
+	//! LINES 3D - write header
+	void writeLine3DHeader()
+	{ fprintf ( file_,"LINE3D\n"); }
+
+	//! LINES - write Coord
+	void writeCoord ( const double& x, const double& y )
+	{ fprintf ( file_," %.10E %.10E\n", x, y ); }
+
+	//! LABELS - write Header
+	void writeLabelHeader ( const int& option );
+
+	//! LABELS - write Value
+	void  writeCadastralLabel ( const string& geoid, const double& x, const double& y,
+			const string& objectCategory = ""); 
+
+	//! NETWORK - write labels
+	void writeNetworkLabel ( const string& geoid, const double& x, const double& y,
+					   const string& objectCategory); 
+
+	//! LABELS - write Theme
+	void writeThematicLabel( const double& x, const double& y, const string& theme );
+
+	//! POINTS - write a classified point
+	void writeThematicPoint( const double& x, const double& y, const string& theme );
+
+	//! POINTS - write Header
+	void writePointsHeader();
+
+	//! POINTS 3D - write Header
+	void writePoint3DHeader()
+	{ fprintf ( file_,"POINT3D\n"); }
+
+	//! POINTS 3D - write Value
+	void writePoint3D( const double& x, const double& y, const double& quote )
+	{ fprintf ( file_," %.10E %.10E %.10E\n", x, y, quote ); }
+
+	//! POINTS - write Value
+	void writePoint ( TeCoord2D& p )
+	{ this->writeCoord ( p.x(), p.y() ); }
+
+	//! NETWORK - write Header
+	void writeNetworkHeader();
+
+	//! NETWORK - write arc header
+	void writeArcHeader ( const string& geoid, const double& posImp = 0., 
+		const double& negImp= 0., const double& demand = 0. ); 
+				   
+ 	//! NETWORK - write Lines Header
+	void writeNetworkLineHeader(int id )
+	{ fprintf ( file_,"%d 1 1 0.0\n", id ); }
+
+ 	//! NETWORK - write Label Header
+	void writeNetworkLabelHeader();
+	
+	//! TABLE - write Header
+	void writeTableHeader( const int& dType );
+
+	//! TABLE - write attribute information
+	void writeAttributeInfo ( TeAttributeList&, const string&, const string& indexName = "" );
+
+	//! TABLE - write text parameter
+	void writeTextParameterInfo ( const string& name, int w = 0);
+	
+	//! TABLE - write real parameter
+	void writeRealParameterInfo ( const string& );
+	
+	//! TABLE - write int parameter
+	void writeIntParameterInfo  ( const string& );
+
+	//! TABLE - write geoId
+	void writeGeoId ( const string& geoid )
+	{ fprintf ( file_, "%s%c%s", geoid.c_str(), separator_, geoid.c_str() ); }
+
+	//! TABLE - write attribute name
+	void writeValue ( const string& attrName, TeAttrDataType type );
+
+	//! TABLE - write int value
+	void writeValue ( const int& value )
+	{ fprintf ( file_, "%c%d", separator_, value ); } 
+
+	//! TABLE - write double value
+	void writeValue ( const double& value )
+	{ fprintf ( file_, "%c%.10E", separator_, (float)value ); }
+
+	//! TABLE - write string 
+	void writeValue ( const string& value )
+	{ fprintf ( file_, "%c%s", separator_,value.c_str() ); }
+
+	//! SAMPLE - write Header
+	void writeSampleHeader();
+	
+	//! SAMPLE - write value
+	void writeSample ( const string& index, const double& x, const double& y,
+		const string& value);
+	
+	//! SAMPLE - write quote
+	void writeSampleQuote( double quote )
+	{ fprintf ( file_,"HEIGHT %.10E\n", quote ); }
+
+	//! INFO - write projection
+	void writeProjection ( TeProjection* );
+
+	//! INFO - write Box
+	void writeBox ( TeBox& );
+
+	//! INFO - write InfoEND
+	void writeInfoEnd ()
+	{ fprintf ( file_, "%s\n", "INFO_END"); }
+
+	//! GENERAL - write END
+	void writeEnd ()
+	{ fprintf ( file_, "%s \n", "END" ); }
+
+	//! Sets the separator
+	void setSeparator ( const char& c )
+	{ separator_ = c ; }
+
+	//! Returns the separator
+	char separator ()
+	{ return separator_; } 
+
+//! No copy allowed
+
+private:
+
+	TeSPRFile(const TeSPRFile&);
+	TeSPRFile& operator=(const TeSPRFile&){return *this;}
+	char	separator_;
+
+};
+
+#endif
+
diff --git a/src/terralib/functions/TeSTEFunctionsSHP.cpp b/src/terralib/functions/TeSTEFunctionsSHP.cpp
new file mode 100644
index 0000000..eb0a880
--- /dev/null
+++ b/src/terralib/functions/TeSTEFunctionsSHP.cpp
@@ -0,0 +1,214 @@
+#include "TeSTEFunctionsSHP.h"
+#include "TeSTElementSet.h"
+#include <vector>
+
+#include "shapefil.h"
+
+bool TeDecodeShape(SHPObject* psShape, TePointSet& ps,const string& objectId);
+bool TeDecodeShape(SHPObject* psShape, TeLineSet& ps,const string& objectId);
+bool TeDecodeShape(SHPObject* psShape, TePolygonSet& ps,const string& objectId);
+
+bool TeDecodeShape(SHPObject* psShape, TeMultiGeometry& geomestries, const string& objectId)
+{
+	int shpType = psShape->nSHPType;
+	switch (shpType)
+	{
+		case SHPT_POLYGON:
+		case SHPT_POLYGONZ:
+			return TeDecodeShape(psShape,geomestries.polygons_,objectId);
+		case SHPT_ARC:
+		case SHPT_ARCZ:
+			return TeDecodeShape(psShape,geomestries.lines_,objectId);
+		case SHPT_POINT:
+		case SHPT_POINTZ:
+		case SHPT_MULTIPOINT:
+		case SHPT_MULTIPOINTZ:
+			return TeDecodeShape(psShape,geomestries.points_,objectId);
+	}
+	return false;
+}
+
+bool TeReadDBFAttributeList(const string& dbfFileName, TeAttributeList& attList);
+
+bool
+TeSTOSetBuildSHP(TeSTElementSet& stoset, const string& fileName)
+{
+	// Read some information about the shapefile
+	string filePrefix = TeGetName(fileName.c_str());
+	string shpfileName = filePrefix + ".shp";
+
+	SHPHandle	hSHP;
+	hSHP = SHPOpen( shpfileName.c_str(), "rb" );
+
+	if( hSHP == 0 )
+		return false;
+
+	int		nShapeType, nEntities;
+	double 	adfMinBound[4], adfMaxBound[4];
+
+	SHPGetInfo(hSHP, &nEntities, &nShapeType, adfMinBound, adfMaxBound);
+
+	string dbffileName = filePrefix + ".dbf";
+    DBFHandle hDBF = DBFOpen( dbffileName.c_str(), "rb" );
+    if( hDBF == 0  || DBFGetFieldCount(hDBF) == 0)
+		return false;
+    
+	int natt = DBFGetFieldCount(hDBF);
+	TeAttributeList attList;
+	TeReadDBFAttributeList(shpfileName, attList);
+
+	TeAttributeRep repobjid;
+	repobjid.name_ = "object_id";
+	repobjid.numChar_ = 16;
+
+	TeAttribute attobjid;
+	attobjid.rep_ = repobjid;
+
+	TeProperty propobjid;
+	propobjid.attr_ = attobjid;
+	
+	int i,n;
+	SHPObject* psShape;
+	for (i=0; i<nEntities; i++)
+	{
+		string objectid = Te2String(i);
+		TeSTInstance curObj;
+		curObj.objectId(objectid);
+		TeSTElement objInstances;
+		objInstances.objectId(objectid);
+
+		TePropertyVector prop;
+		psShape = SHPReadObject(hSHP,i);
+		if (TeDecodeShape(psShape,curObj.geometries(),objectid))
+		{
+			propobjid.value_ = objectid;
+			prop.push_back(propobjid);
+			for(n=0;n<natt;n++)
+			{
+				string value = DBFReadStringAttribute(hDBF,i,n);
+				TeProperty p;
+				p.attr_ = attList[n];
+				p.value_ = value;
+				prop.push_back(p);
+			}
+			curObj.properties(prop);
+			objInstances.insertSTInstance(curObj);
+			stoset.insertSTElement(objInstances);
+			curObj.theme(0);
+		}
+		SHPDestroyObject(psShape);
+	}
+	return true;
+} 
+
+bool TeDecodeShape(SHPObject* psShape, TePointSet& points,const string& objectId)
+{
+	int i;
+	for (i = 0; i < ( psShape->nVertices ); i++ )
+	{
+		TePoint point;
+		TeCoord2D xy ( psShape->padfX[i], psShape->padfY[i] );
+		point.add ( xy );
+		point.objectId(objectId);
+		points.add ( point );
+	}
+	return (i > 0);
+}
+
+bool TeDecodeShape(SHPObject* psShape, TeLineSet& lines, const string& objectId)
+{
+	vector<int> partStart;
+	int iPart;
+	for (iPart = 0; iPart < psShape->nParts; iPart++ )
+		partStart.push_back ( psShape->panPartStart[iPart] );
+	partStart.push_back ( psShape->nVertices ); // point to the end
+
+	iPart = 0;
+	int j = 0; 
+	while ( j < psShape->nVertices )
+	{
+		TeLine2D line;
+
+		iPart++;  // indicates the different segments of the line
+		while ( j < partStart[iPart] )	// Read each segment
+		{
+			TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+			line.add ( pt );
+			j++;
+		}
+		line.objectId(objectId);
+		lines.add(line);
+	}
+	return (iPart > 0);
+
+}
+
+bool TeDecodeShape(SHPObject* psShape, TePolygonSet& polys, const string& objectId)
+{
+	int iPart, j;
+	vector<int> partStart;
+	list<TePolygon> pList;
+
+	// Build an array whose components point to the starting point
+	// of the rings that compose the shapepoly
+	for ( iPart = 0; iPart < psShape->nParts; iPart++ )
+		partStart.push_back ( psShape->panPartStart[iPart] );
+	partStart.push_back ( psShape->nVertices ); // point to the end
+
+	iPart = 0;
+	j = 0;
+	while ( j < psShape->nVertices )
+	{
+		iPart++;						// indicates the different rings of the shapepoly
+		TeLine2D line;
+		while ( j < partStart[iPart] )	// Read each ring
+		{
+			TeCoord2D pt ( psShape->padfX[j], psShape->padfY[j] );
+			line.add ( pt );
+			j++;
+		}	// end of a ring
+		if (!line.isRing())
+			line.add(line[0]);
+
+		TeLinearRing ring(line);
+		bool inside = false;		// Is it an OUTER or an INNER RING ?
+
+		list<TePolygon>::iterator it = pList.begin();
+		// Each ring is assigned to a polygon
+		// Each ring and polygon have a unique "geometrical index"
+		//
+		// All rings and polygons that are part of a same object
+		// have the same "object index"
+
+		while ( it != pList.end() )
+		{
+			TePolygon aux;
+			aux.add(ring);
+			if (TeWithin(aux,(*it)))
+			{
+				inside = true;
+				ring.objectId ( (*it)[0].objectId() );	// sets the object index
+				(*it).add ( ring );						// add a closed region
+				break;
+			}
+			++it;
+		}
+		if (!inside)
+		{
+			TePolygon poly;
+			ring.objectId (objectId);
+			poly.add(ring);						// add an outer region
+			poly.objectId(objectId);			// set the object index
+
+			pList.push_back ( poly );
+		}
+	}
+	list<TePolygon>::iterator it = pList.begin();
+	while ( it != pList.end() )
+	{
+		polys.add(*it);
+		++it;
+	}
+	return (iPart > 0);
+}
+
diff --git a/src/terralib/functions/TeSTEFunctionsSHP.h b/src/terralib/functions/TeSTEFunctionsSHP.h
new file mode 100644
index 0000000..4f20954
--- /dev/null
+++ b/src/terralib/functions/TeSTEFunctionsSHP.h
@@ -0,0 +1,41 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef TeSpaceTimeObjectBuilderSHP_H
+#define TeSpaceTimeObjectBuilderSHP_H
+
+#include <string>
+
+class TeSTElementSet; 
+
+using namespace std;
+
+//! Builds the spatial object set from database according to the restrictions previously defined
+/*! 
+	\param stoset the STOSet that will be filled 
+	\param fileName shape file name
+*/
+bool TeSTOSetBuildSHP(TeSTElementSet& stoset, const string& fileName);
+
+#endif
+
diff --git a/src/terralib/functions/TeSimilarity.cpp b/src/terralib/functions/TeSimilarity.cpp
new file mode 100644
index 0000000..f26354a
--- /dev/null
+++ b/src/terralib/functions/TeSimilarity.cpp
@@ -0,0 +1,73 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeMatrix.h"
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+double
+SmallestOf (double a, double b, double c)
+{
+	double	smallest = a;
+	
+	if (b < smallest) smallest = b;
+	if (c < smallest) smallest = c;
+	return smallest;
+}
+
+double
+TeSimilarity (const char *streetname, const char *rotuloname)
+{
+	short	Del = 1, Ins = 1, Sub = 1;
+	double		a, b, c;
+	short	i, j;
+	int	m = strlen(streetname) + 1;
+	int n = strlen(rotuloname) + 1;
+	TeMatrix	T;
+	if( T.Init(m,n) == false)
+		return -1.;
+
+	T(0,0) = 0;
+
+	for (j = 1; j<n; j++)
+		T(0,j) = T(0, j-1) + Ins;
+
+	for (i = 1; i<m; i++)
+		T(i,0) = T(i-1,0) + Del;
+
+	for (i = 1; i<m; i++)
+		for (j = 1; j<n; j++)
+		{
+			if (toupper(streetname[i-1]) == toupper(rotuloname[j-1]))
+				a = T(i-1,j-1);
+			else
+				a = T(i-1,j-1) + Sub;
+			b = T(i,j-1) + Ins;
+			c = T(i-1,j) + Del;
+			T(i,j) = SmallestOf(a, b, c);
+		}
+		
+	double perc = (1.0 - (T(m-1,n-1) / (double)(n-1))) * 100.0;
+	return	perc;
+}
diff --git a/src/terralib/functions/TeThemeFunctions.cpp b/src/terralib/functions/TeThemeFunctions.cpp
new file mode 100644
index 0000000..a35775d
--- /dev/null
+++ b/src/terralib/functions/TeThemeFunctions.cpp
@@ -0,0 +1,170 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include "TeTheme.h"
+#include "TeDatabase.h"
+
+
+bool TeCreateThemeFromTheme(TeTheme* inTheme, const string& newThemeName, int selObj, TeTheme* newTheme)
+{
+	// if no source theme or not a name for the new theme
+	if (!inTheme || newThemeName.empty())
+		return false;
+
+	// if there no pointer theme was passed create a new instance
+	if (!newTheme)
+		newTheme = new TeTheme();
+
+	// builds a valid theme name
+	TeDatabase* curDb = inTheme->layer()->database();
+	string validThemeName = newThemeName;
+	int i=1;
+	while (curDb->themeExist(validThemeName))
+	{
+		validThemeName = newThemeName + "_" + Te2String(i);
+		i++;
+	}
+
+	// create new theme with the same definitions of the input theme
+	newTheme->id(0);
+	newTheme->name(validThemeName);
+	newTheme->layer(inTheme->layer());
+	newTheme->setAttTables(inTheme->attrTables());
+	curDb->viewMap()[inTheme->view()]->add(newTheme);
+	newTheme->visibleRep(inTheme->visibleRep());
+
+	// save its definition in the database
+	if (!newTheme->save())
+	{
+		delete newTheme;
+		newTheme = 0;
+	}
+
+	// this is a patch around TeTheme::save(). Auxiliary collection table is created
+	// with field "unique_id" of type auto-number. It has to be string.
+	TeAttribute at;
+	at.rep_.name_ = "unique_id";
+	at.rep_.type_ = TeSTRING;
+	at.rep_.numChar_ = 100;
+	at.rep_.isAutoNumber_ = false;
+	at.rep_.isPrimaryKey_ = true;
+	if (!curDb->alterTable(newTheme->collectionAuxTable(), at.rep_))
+	{
+		curDb->deleteTheme(newTheme->id());
+		delete newTheme;
+		return 0;
+	}
+
+	// if its a theme of raster data there's nothing else to be done
+	if (inTheme->layer()->hasGeometry(TeRASTER))
+		return false;
+
+	// this SQL selects instances of objects according to input, so it uses te_collection_aux
+	string inputInst;
+
+	// this SQL selects objects according to input, so it uses te_collection
+	string inputObj; 
+	if(selObj == TeSelectedByPointing) // queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+	else if(selObj == 2) // pointed
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 1";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 1";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+	else if(selObj == 3) // not queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 2";
+		inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 2";
+		inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+	}
+	else if(selObj == 4) // not pointed
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status <> 1";
+		inputObj += " AND " + inTheme->collectionTable() + ".c_object_status <> 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status <> 1";
+		inputInst += " AND " + inTheme->collectionAuxTable() + ".grid_status <> 3)";
+	}
+	else if(selObj == 5) // pointed and queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+	else if(selObj == 6) // pointed or queried
+	{
+		inputObj = "(" + inTheme->collectionTable() + ".c_object_status = 2";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 1";
+		inputObj += " OR " + inTheme->collectionTable() + ".c_object_status = 3)";
+		inputInst = "(" + inTheme->collectionAuxTable() + ".grid_status = 2";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 1";
+		inputInst += " OR " + inTheme->collectionAuxTable() + ".grid_status = 3)";
+	}
+
+	// fills collection table from the selection requested
+	string sql = "INSERT INTO " + newTheme->collectionTable() + " ( ";
+	sql += " c_object_id, c_legend_id, label_x, label_y, c_legend_own, c_object_status ) ";
+	sql += " SELECT * FROM " + inTheme->collectionTable() + " WHERE " + inputObj;
+	if (!curDb->execute(sql))
+	{
+		curDb->deleteTheme(newTheme->id());
+		return false;
+	}
+	// sets theme objects settings to default
+	sql = "UPDATE " + newTheme->collectionTable() + " SET c_legend_id = 0";
+	if (!curDb->execute(sql))
+	{
+		curDb->deleteTheme(newTheme->id());
+		return false;
+	}
+	sql = "UPDATE " + newTheme->collectionTable() + " SET c_object_status = 0";
+	if (!curDb->execute(sql))
+	{
+		curDb->deleteTheme(newTheme->id());
+		return false;
+	}
+
+	// fills auxiliary collection table from the selection requested
+	sql = "INSERT INTO " + newTheme->collectionAuxTable() + " ( ";
+	sql += " object_id, unique_id, grid_status ) ";
+	sql += " SELECT * FROM " + inTheme->collectionAuxTable() + " WHERE " + inputInst;
+	if (!curDb->execute(sql))
+	{
+		curDb->deleteTheme(newTheme->id());
+		return false;
+	}
+	sql = "UPDATE " + newTheme->collectionAuxTable() + " SET grid_status = 0";
+	if (!curDb->execute(sql))
+	{
+		curDb->deleteTheme(newTheme->id());
+		return false;
+	}
+	return true;
+}
+
+
diff --git a/src/terralib/functions/TeThemeFunctions.h b/src/terralib/functions/TeThemeFunctions.h
new file mode 100644
index 0000000..cec422f
--- /dev/null
+++ b/src/terralib/functions/TeThemeFunctions.h
@@ -0,0 +1,43 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeThemeFunctions.h
+    This file contains functions to deal with themes 
+*/
+#ifndef  __TERRALIB_INTERNAL_THEMEFUNCTIONS_H
+#define  __TERRALIB_INTERNAL_THEMEFUNCTIONS_H
+
+class TeTheme;
+
+#include <string>
+
+//! Creates a new theme from the objects of an existing theme
+/*!
+	\param inTheme input theme 
+    \param newThemeName the name of the new theme
+	\param selObj the criteria to include objects of the existing theme in the new one
+    \param newTheme pointer to the new theme created if it succeed and null otherwise
+*/
+bool TeCreateThemeFromTheme(TeTheme* inTheme, const string& newThemeName, int selObj=0, TeTheme* newTheme=0);
+
+#endif
diff --git a/src/terralib/kernel/Gra_algo.h b/src/terralib/kernel/Gra_algo.h
new file mode 100644
index 0000000..3ee948a
--- /dev/null
+++ b/src/terralib/kernel/Gra_algo.h
@@ -0,0 +1,195 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+//  include/gra_algo.h
+#ifndef GRAPH_ALGORITHMS_H
+#define GRAPH_ALGORITHMS_H 
+#include <dynpq.h>
+#include <graph.h>
+#include <limits>
+#include <iostream>
+
+namespace br_stl {
+
+template<class GraphType, class EdgeType>
+void Dijkstra(
+       GraphType& Gr,
+       std::vector<EdgeType>& Dist,
+       std::vector<int>& Pred,
+       int Start) {
+    /* The algorithm proceeds in such a way that the distances are
+       estimated and the estimates gradually improved. The distance to
+       the starting point is known (0). For all other vertices, the
+       worst possible estimate is entered.*/
+
+    Dist = std::vector<EdgeType>(Gr.size(),
+           std::numeric_limits<EdgeType>::max()); // as good as infinity
+    Dist[Start] = (EdgeType)0;
+
+    /* The predecessor vector too is initialized with `impossible'
+       values. Subsequently, a dynamic priority queue is defined and
+       initialized with the distance vector: */
+
+	Pred = std::vector<int>(Gr.size(), -1);
+    dynamic_priority_queue<EdgeType> Q(Dist);
+
+    // In the next step, all vertices are extracted  one by one from
+    //  the priority queue, and precisely in the order of the estimated
+    // distance towards the starting vertex. Obviously, the starting
+    //vertex is dealt with first. No vertex is looked at twice. 
+
+    int u;
+    while(!Q.empty()) {
+       u = Q.topIndex();   // extract vertex with minimum
+       Q.pop();
+
+       // Now, the distance estimates for all neighboring vertices of
+       //  u are updated. If the previous estimate of the distance
+        //  between the current neighbor of u and the starting vertex
+       //   (Dist[Neighbor]) is worse than the distance between vertex u
+        //  and the starting vertex (Dist[u]) plus the distance between
+       //   u and the neighboring vertex (dist), the estimate is
+        //  improved: this process is called relaxation. In this case,
+        //  the path from the starting vertex to the neighbor cannot be
+        //  longer than (Dist[u] + dist). In this case, u would have to
+        //  be regarded as predecessor of the neighbor. 
+          
+        // improve estimates for all neighbors of u
+        typename GraphType::Successor::const_iterator
+                   I = Gr[u].second.begin();
+
+        while(I != Gr[u].second.end()) {
+            int Neighbor = (*I).first;
+            EdgeType dist = (*I).second;
+
+            // relaxation
+            if(Dist[Neighbor] > Dist[u] + dist) {
+               // improve estimate
+               Q.changeKeyAt(Neighbor, Dist[u] + dist);
+               // u is predecessor of the neighbor
+               Pred[Neighbor] = u;
+            }
+            ++I;
+        }
+    }
+	return;
+}
+
+template<class GraphType>
+bool topoSort(
+       GraphType& G,
+       std::vector<int>& Result) {
+    assert(G.isDirected());           // let's play this safe!
+    int ResCounter = 0;
+    Result = std::vector<int>(G.size(), -1);
+
+    /* The vector Result takes the indices of the correspondingly
+       distributed vertices. The counter ResCounter is the position in
+       Result where the next entry belongs. */
+
+    vector<int> PredecessorCount(G.size(), 0);
+    int VerticesWithoutSuccessor = 0;
+
+    /* For each vertex, the vector PredecessorCount counts how many
+       predecessors it has. There are vertices without successors,
+       whose number is kept in VerticesWithoutSuccessor. Furthermore,
+       the algorithm remains stable if the precondition that a graph
+       must not have cycles is violated. The variable
+       VerticesWithoutSuccessor is used to recognize this situation
+       (see below). */
+
+    /* 
+	for(size_t iv = 0; iv < G.size(); ++iv) {
+        if(G[iv].second.size() > 0) {    // is predecessor
+           typename GraphType::Successor::const_iterator I =
+                G[iv].second.begin();
+           while(I != G[iv].second.end())
+               // update number of predecessors
+               ++PredecessorCount[(*I++).first];
+        }
+        else  { // Vertex is no predecessor, that is, without successor
+             // an excessively high number of predecessors is used 
+             // for later recognition
+             PredecessorCount[iv] =   G.size(); // too many!
+             ++VerticesWithoutSuccessor;
+        }
+    }
+	*/
+
+    /* The dynamic priority queue is initialized with the vector of
+       numbers of predecessors. At the beginning of the queue we find
+       those vertices that have no predecessors and therefore are to
+       be processed next. Only the vertices which are predecessors
+       themselves, that is that have successors are processed. The
+       subsequent loop is terminated when the queue only contains
+       successor vertices which themselves are not predecessors. Their
+       number of predecessors can never be 0 because further above
+       they were initialized with too high a value.*/
+       
+    /* 
+	dynamic_priority_queue<int> Q(PredecessorCount);
+
+    // process all predecessors
+    while(Q.topKey() == 0) {
+        // determine vertex with predecessor number 0
+       int oV = Q.topIndex();
+       Q.pop();
+
+       Result[ResCounter++] = oV;
+
+       // In order to ensure that this vertex without predecessors oV
+        //  is no longer considered in the next cycle, the number of
+       //   predecessors of all its successors is decreased by 1. 
+          
+       typename GraphType::Successor::const_iterator
+             I = G[oV].second.begin();
+       while(I != G[oV].second.end()) {
+          // decrease number of predecessors with 
+          // changeKeyAt()}. Do not change directly!
+          int V = (*I).first;
+          Q.changeKeyAt(V, PredecessorCount[V] -1);
+          ++I;
+       }
+    }
+
+    // Now, all vertices without successors are entered. As a
+    //   countercheck, the variable VerticesWithoutSuccessor is
+    //   decreased. If the queue contains too many vertices, an error
+    //   message is displayed.  
+       
+    while(!Q.empty()) {
+         Result[ResCounter++] = Q.topIndex();
+         Q.pop();
+         --VerticesWithoutSuccessor;
+    }
+
+    if(VerticesWithoutSuccessor < 0)
+       std::cerr << "Error: graph contains a cycle!\n";
+    return VerticesWithoutSuccessor == 0;
+	*/
+	return;
+}
+
+} // namespace br_stl
+#endif
+
diff --git a/src/terralib/kernel/TeAsciiFile.cpp b/src/terralib/kernel/TeAsciiFile.cpp
new file mode 100644
index 0000000..3e80448
--- /dev/null
+++ b/src/terralib/kernel/TeAsciiFile.cpp
@@ -0,0 +1,342 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeAsciiFile.h"
+#include "TeErrorLog.h"
+#include "TeException.h"
+#include "TeAssertions.h"
+#include "TeDefines.h"
+
+TeAsciiFile::TeAsciiFile ( const string& name, const char* mode ): 	
+	TeStdFile ( name, mode  ) 
+{
+}  
+
+TeAsciiFile::~TeAsciiFile() 
+{ 	
+}  
+
+void
+TeAsciiFile::findNewLine ()
+{
+	if ( feof ( file_ ) != 0 )
+		return;
+	char ch = '0';
+
+	while ( ch != '\n' )
+	{
+		fscanf ( file_, "%c", &ch );
+		if ( feof ( file_ ) != 0 )
+			return;
+	}
+}
+
+char 
+TeAsciiFile::readQuotedChar()
+{
+	require ( feof ( file_ ) == 0 );
+
+	char ch = ',', ch2;
+
+	while ( ch != '"' )
+	{
+		fscanf ( file_, "%c", &ch );
+	}
+	fscanf ( file_, "%c", &ch );
+	fscanf ( file_, "%c", &ch2 );
+
+	ensure ( ch2 == '"' ); // just to make sure
+return ch;
+}
+
+char 
+TeAsciiFile::readChar()
+{
+	char ch=' ';
+	require ( feof ( file_ ) == 0 );
+	while ( ch == ' ' )
+	{
+		fscanf ( file_, "%c", &ch );
+	}
+	return ch;
+}
+
+
+string
+TeAsciiFile::readString ()
+{
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+	char input [TeNAME_LENGTH];
+	fscanf ( file_, "%s", input );
+
+return input;
+}
+
+void
+TeAsciiFile::writeString (const string& s)
+{
+	fprintf ( file_, "%s", s.c_str() );
+}
+
+string
+TeAsciiFile::readLine ()
+{
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+	char input [TeNAME_LENGTH];
+	fgets ( input, TeNAME_LENGTH, file_ );
+
+return input;
+}
+
+string 
+TeAsciiFile::readQuotedString()
+{
+	require ( feof ( file_ ) == 0 );
+
+	char ch = ' ';
+
+	string quote;
+
+	while ( ch != '"' )
+	{
+		fscanf ( file_, "%c", &ch );
+	}
+
+	while ( true )
+	{
+		fscanf ( file_, "%c", &ch );
+		if ( ch == '\n' || ch == '\r') 
+		{
+			ungetc ( ch, file_ );
+			break;
+		}
+		if ( ch == '"'  ) break;
+
+		quote = quote + ch;
+	}
+return quote;
+}
+
+void
+TeAsciiFile::readStringList ( vector<string>& strlist )
+{
+	require ( file_ != 0 );
+
+	this->readStringListCSV ( strlist, ' ');
+}
+
+void
+TeAsciiFile::readStringListCSV ( vector<string>& strlist, const char sep)
+{
+
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+	char ch, lastChr = 0;
+	while (fscanf ( file_, "%c", &ch ) !=  EOF )
+	{
+		if ( ch == '\n' || ch == '\r') 
+		{ 
+			if(lastChr==sep)
+				strlist.push_back ( "" );
+
+			ungetc ( ch, file_ );
+			return;
+		}
+		ungetc ( ch, file_ );
+		// there are still more values to be read
+		string name = readStringCSV (sep);
+		if ( name.size() !=  0 || sep != ' ')
+			strlist.push_back ( name );
+		
+		lastChr = ch;
+	}
+}
+
+void
+TeAsciiFile::readNStringCSV ( vector<string>& strlist, unsigned int n, const char sep)
+{
+
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+	strlist.clear();
+	char ch, lastChr = 0;
+	while (fscanf ( file_, "%c", &ch ) !=  EOF )
+	{
+		if ( ch == '\n' || ch == '\r') 
+		{ 
+			if(lastChr==sep)
+				strlist.push_back ( "" );
+
+			ungetc ( ch, file_ );
+			return;
+		}
+		ungetc ( ch, file_ );
+		// there are still more values to be read
+		string name = readStringCSV (sep);
+		if ( name.size() !=  0 || sep != ' ')
+			strlist.push_back ( name );
+		if (strlist.size() == n)
+			break;
+		
+		lastChr = ch;
+	}
+}
+
+string
+TeAsciiFile::readStringCSV( const char del, bool skip, const char skip_char )
+{
+	require ( file_ != 0 );
+
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+	char ch = '0';
+	string line;
+	bool inQuotes = false;
+
+	int ret;
+	while ( (ret=fscanf ( file_, "%c", &ch )) != EOF)
+	{
+		if ( ch == '\n' || ch == '\r') 
+		{
+			ungetc ( ch, file_ );
+			break;
+		}
+		if ( ch == del  && !inQuotes ) break;
+		if (skip)
+			if (ch == skip_char) 
+			{
+				if (skip_char == '"')
+					inQuotes = !inQuotes;
+				continue;
+			}
+		line = line + ch;
+	}
+	return line;
+}
+
+string
+TeAsciiFile::readStringCSVNoSpace( const char del )
+{
+	char blank = ' ';
+	string line = readStringCSV ( del, true, blank );
+return line;
+}
+
+string
+TeAsciiFile::readStringCSVNoQuote( const char del )
+{
+	char quote = '"';
+	string line = readStringCSV ( del, true, quote );
+return line;
+}
+
+int
+TeAsciiFile::readInt ()
+{
+	require ( file_ != 0 );
+
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+	
+	int value;
+	fscanf ( file_, "%d", &value );
+
+return value;
+}
+
+int
+TeAsciiFile::readIntCSV ( const char del )
+{
+	char blank  = ' ';
+	string line = readStringCSV ( del, true, blank );
+
+return atoi(line.c_str());
+}
+
+double
+TeAsciiFile::readFloatCSV ( const char del )
+{
+	char blank = ' ';
+	string line = readStringCSV ( del, true, blank );
+
+return atof(line.c_str());
+}
+
+
+double
+TeAsciiFile::readFloat ()
+{
+	require ( file_ != 0 );
+
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+	
+	double value;
+	fscanf ( file_, "%lf", &value );
+
+return value;
+}
+
+TeCoord2D
+TeAsciiFile::readCoord2D ()
+{
+	require ( file_ != 0 );
+
+	if ( feof ( file_ ) != 0 )
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+
+	double x, y;
+	fscanf ( file_, "%lf %lf", &x, &y);
+
+return TeCoord2D( x,  y );
+}
+
+TeBox
+TeAsciiFile::readBox() 
+{
+	require ( file_ != 0 );
+
+	if ( feof ( file_ ) != 0 )
+	{
+		throw TeException ( END_OF_FILE_REACHED, name(), true );
+	}
+	double x1, y1, x2, y2;
+
+
+	fscanf ( file_, "%lf %lf %lf %lf", &x1, &y1, &x2, &y2 );
+
+return TeBox ( x1, y1, x2, y2 );
+
+}
+
diff --git a/src/terralib/kernel/TeAsciiFile.h b/src/terralib/kernel/TeAsciiFile.h
new file mode 100644
index 0000000..cce443a
--- /dev/null
+++ b/src/terralib/kernel/TeAsciiFile.h
@@ -0,0 +1,129 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeAsciiFile.h
+    This file contains structures and definitions to deal ASCII files
+*/
+#ifndef  __TERRALIB_INTERNAL_ASCIIFILE_H
+#define  __TERRALIB_INTERNAL_ASCIIFILE_H
+
+#include "TeStdFile.h"
+#include "TeCoord2D.h"
+#include "TeBox.h"
+
+#include <stdio.h>
+
+#include <vector> 
+#include <string>
+using namespace std;
+
+//!  A class for handling reading/writing for ASCII files
+/*!  Simple wrapper around a stdio file. Clientes are all the 
+	 functions that imports from ASCII files. 
+
+ \sa
+  TeStdFile, TeSPRFile
+*/
+class TeAsciiFile: public TeStdFile {
+
+public:
+
+	//! Contructors
+	TeAsciiFile(const string& name, const char* mode = "r");
+	
+	//! Destructor
+	virtual ~TeAsciiFile();
+
+	//! Writes a carriage return character
+	void writeNewLine ()
+	{ fprintf ( file_, "\n" ); } 
+	
+	//! Goes to a new line 
+	void findNewLine () ; 
+
+	//! Reads a string
+	string readString(); 
+
+	//! Reads a full line up to carriage return
+	string readLine(); 
+
+	//! Writes a generic string to the file
+	void writeString (const string& s);
+
+	//! Reads a string whithin quotes
+	string readQuotedString(); 
+
+	//! Reads a comma-separated string ( with a skip character )
+	string readStringCSV( const char sep = ',', bool skip = false, 
+						  const char skip_char = ' ');
+
+	//! Reads a character whithin quotes
+	char readQuotedChar();
+
+	//! Reads a character
+	char readChar();
+
+	//! Reads a comma-separated string(ignore spaces)
+	string readStringCSVNoSpace( const char del = ',');
+
+	//! Reads a comma-separated string (ignore quote )
+	string readStringCSVNoQuote ( const char del = ',' );
+
+	//! Reads an integer
+	int readInt();
+
+	//! Reads a comma-separated int
+	int readIntCSV( const char del = ',');
+
+	//! Reads a float
+	double readFloat();
+
+	//! Reads a comma-separated float
+	double readFloatCSV( const char del = ',');
+
+	//! Reads a 2D coordinate ( x, y )
+	TeCoord2D readCoord2D();
+
+	//! Reads a line and put in a stringlist
+	void readStringList ( vector<string>& );
+
+	//! Reads a comma-separated line string and put in a string list
+	void readStringListCSV ( vector<string>&, const char sep = ',');
+
+	//! Reads the first n strings from a comma separated line string and put in a string list
+	void readNStringCSV ( vector<string>&, unsigned int n, const char sep = ',');
+
+
+	//! Reads a bounding box
+	TeBox readBox();
+
+private:
+	
+// No copy allowed
+
+	TeAsciiFile(const TeAsciiFile&);
+	TeAsciiFile& operator=(const TeAsciiFile&);
+
+};
+#endif
+
+
diff --git a/src/terralib/kernel/TeAssertions.h b/src/terralib/kernel/TeAssertions.h
new file mode 100644
index 0000000..05e5d9e
--- /dev/null
+++ b/src/terralib/kernel/TeAssertions.h
@@ -0,0 +1,36 @@
+//***********************************************************************
+//      TerraLib is a GIS Classes and Functions Library that 
+//      strongly explores Spatial Database Technologies 
+//
+//      Copyright � 2002 INPE and Tecgraf/PUC-Rio. 
+//
+//      This library is free software; you can redistribute it 
+//      and/or modify it under the terms of the GNU Lesser General 
+//      Public License as published by the Free Software Foundation
+//      version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//      
+//
+//      Send questions or suggestions about the TerraLib Project 
+//      to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TeAssertions.h
+    This file contains definitions for require and ensure macros.
+
+	 The require and ensure macros implement
+	 the pre-conditions and post-conditions
+	 for each module.
+
+	 The "invariant" macro verifies is an
+	 invariant condition is true.
+
+*/
+#ifndef TeAssertions_H
+#define TeAssertions_H
+#include <assert.h>
+
+#define require(statement)    assert(statement)
+#define ensure(statement)     assert(statement)
+
+#endif
+
diff --git a/src/terralib/kernel/TeAttribute.h b/src/terralib/kernel/TeAttribute.h
new file mode 100644
index 0000000..eabe1bb
--- /dev/null
+++ b/src/terralib/kernel/TeAttribute.h
@@ -0,0 +1,155 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeAttribute.h
+    This file contains structures and definitions about attributes of geographical objects
+*/
+#ifndef  __TERRALIB_INTERNAL_ATTRIBUTE_H
+#define  __TERRALIB_INTERNAL_ATTRIBUTE_H
+
+#include "TeDataTypes.h"
+#include "TeTime.h"
+
+/*! \enum TeMeasurementScale 
+	Sscale of measurement according to Stevens (1949) 
+    modified by Chrisman (1998) to include CYCLIC and PROBABILITY
+    we also include FUZZY (possibility scale) 
+*/
+enum TeMeasurementScale 
+{ ORDINAL, NOMINAL, RATIO, INTERVAL, CYCLIC, PROBABILITY, FUZZY };
+
+/*! \struct TeAttributeRep
+	Attribute physical representation
+*/
+struct TeAttributeRep
+{
+	string			name_;		//!< attribute name	
+	TeAttrDataType  type_;		//!< attribute type
+	int				numChar_;   //!< width of an attribute
+	int				decimals_;	//!< number of decimal digits
+	bool			isPrimaryKey_;	//!< flag to indicate that the attribute is part of primary key
+	bool			isAutoNumber_; 	//!< flag to indicate that the attribute is auto number
+
+	//! Empty constructor
+	TeAttributeRep():
+		name_(""),
+		type_(TeSTRING),
+		numChar_(0),
+		decimals_(0),
+		isPrimaryKey_(false),
+		isAutoNumber_(false)
+		{}
+
+	//! Empty constructor
+	TeAttributeRep(const string& name):
+		name_(name),
+		type_(TeSTRING),
+		numChar_(0),
+		decimals_(0),
+		isPrimaryKey_(false),
+		isAutoNumber_(false)
+		{}
+
+	//! Operator =
+	TeAttributeRep& operator= ( const TeAttributeRep& at )
+	{
+		if ( this != &at )
+		{	
+			name_ = at.name_;
+			type_ = at.type_;
+			numChar_ = at.numChar_;
+			decimals_ = at.decimals_;
+			isPrimaryKey_ = at.isPrimaryKey_;
+			isAutoNumber_ = at.isAutoNumber_;
+		}
+		return *this;
+	}
+
+	//! Operator <
+	bool	operator< (const TeAttributeRep& at) const 
+	{return (name_ < at.name_);}	
+};
+
+/*! \struct TeAttribute
+	Attribute description
+*/
+struct TeAttribute
+{
+	TeAttributeRep	rep_;		//!< representation of attribute	
+	string	semantic_;			//!< reference in a Ontology database (e.g., entry in WordNet )	
+	string	unit_;				//!< measurement unit ( e.g., m ) if applicable
+	TeMeasurementScale  scale_;	//!< scale of measurement
+
+	// for RATIO data sets
+	string				minValue_;	//!< minimum value of the attribute
+	string				maxValue_;	//!< maximum value of the attrbute	
+
+	// for NOMINAL or ORDINAL data sets
+	vector<string>		validValueList_; //!< list of valid values
+
+	// for INTERVAL data sets (??)
+	string				origin_;	//!< origin of the intervals	
+	string				interval_;	//!< mesurement interval
+
+	string				dateTimeFormat_;	//!< format for date and time values
+	string				indicatorAM_;		//!< AM indicator for a 12 hour clock
+	string				indicatorPM_;		//!< PM indicator for a 12 hour clock
+	string				dateSeparator_;		//!< date separator
+	string				timeSeparator_;		//!< time separator
+	TeChronon			dateChronon_;		//!< date chronon
+
+	//! Empty constructor
+	TeAttribute():
+		rep_			(TeAttributeRep()),
+		dateTimeFormat_	("DsMsYYYYsHHsmmsSS"), 
+		indicatorAM_	("AM"),
+		indicatorPM_	("PM"),
+		dateSeparator_	("/"),
+		timeSeparator_	(":"), 
+		dateChronon_    (TeSECOND)
+		{}
+};
+
+/*! \struct TeProperty
+ A property of an object
+ */
+struct TeProperty
+{
+	TeAttribute		attr_;		//!< attribute description
+    string			value_;		//!< its value stored as an string
+};
+
+//! A vector of TeProperties
+typedef vector<TeProperty> TePropertyVector;
+
+//! A vector of attributes representation
+typedef vector<TeAttributeRep>  TeAttributeRepList;
+
+//! A vector of attributes 
+typedef vector<TeAttribute>		TeAttributeList;
+
+//! A Map of the attribute names to the statistical types 
+typedef multimap<TeAttributeRep, TeStatisticType> TeGroupingAttr;
+
+#endif
+
diff --git a/src/terralib/kernel/TeBox.cpp b/src/terralib/kernel/TeBox.cpp
new file mode 100644
index 0000000..cb62897
--- /dev/null
+++ b/src/terralib/kernel/TeBox.cpp
@@ -0,0 +1,187 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeBox.h"
+#include "TeGeometry.h"
+
+void zoomIn ( TeBox& box, double t )
+{
+		TeCoord2D c = box.center ();
+		double w    = box.width ()*t/2.;
+		double h    = box.height ()*t/2.;
+		box.x1_ = c.x() - w;
+		box.x2_ = c.x() + w;
+		box.y1_ = c.y() - h;
+		box.y2_ = c.y() + h;
+}
+
+
+void zoomOut ( TeBox& box, double t )
+{
+		TeCoord2D c = box.center ();
+		double w = box.width ()/t/2.;
+		double h = box.height ()/t/2.;
+		box.x1_ = c.x() - w;
+		box.x2_ = c.x() + w;
+		box.y1_ = c.y() - h;
+		box.y2_ = c.y() + h;
+}
+
+// --- UPDATE BOX
+
+void
+updateBox ( TeBox& box, const TeCoord2D& pt )
+{
+	if ( pt.x() <= box.x1_ )
+		box.x1_  = pt.x();
+	
+	if ( pt.x() >= box.x2_ )
+		 box.x2_ =  pt.x();
+
+	if ( pt.y() <= box.y1_ )
+		box.y1_ =  pt.y();
+
+	if ( pt.y() >= box.y2_ )
+		box.y2_ =  pt.y();
+}
+
+void
+updateBox ( TeBox& box, const TeBox& other )
+{
+		if ( other.x1_ <= box.x1_ ) 
+			box.x1_ = other.x1_;
+		if ( other.x2_ >= box.x2_ )
+			box.x2_ = other.x2_;
+		if ( other.y1_ <= box.y1_ )
+			box.y1_ = other.y1_;
+		if ( other.y2_ >= box.y2_ )
+			box.y2_ = other.y2_;
+}
+
+void
+updateBox ( TeBox& box, const TeGeometry& geo )
+{
+		updateBox ( box, geo.box() );
+}
+
+TeBox 
+makeBox(double x1, double y1, double x2, double y2, const double& tol)
+{
+	double xlo, xhi;
+
+	if(x1 > x2)
+	{
+		xhi = x1;
+		xlo = x2;
+	}
+	else
+	{
+		xhi = x2;
+		xlo = x1;
+	}
+
+	double ylo, yhi;	
+	if(y1 > y2)
+	{
+		yhi = y1;
+		ylo = y2;
+	}
+	else
+	{
+		yhi = y2;
+		ylo = y1;
+	}
+
+	return TeBox(xlo - tol, ylo - tol, xhi + tol, yhi + tol);
+}
+
+
+TeBox 
+adjustToCut(TeBox& box, double bWidth, double bHeight)
+{
+	double auxD;
+	int auxI;
+
+	int magicX; 
+	auxD = box.x1()/bWidth;
+	auxI = (int)(box.x1()/bWidth);
+	if (box.x1() < 0 && (auxD - auxI) != 0)
+		magicX = (int) (box.x1()/bWidth - 1);
+	else
+		magicX = auxI;
+
+	int magicY;
+	auxD = box.y1()/bHeight;
+	auxI = (int)(box.y1()/bHeight);
+	if (box.y1() < 0 && (auxD - auxI) != 0)
+		magicY  = (int)(box.y1()/bHeight - 1);
+	else
+		magicY  = auxI;
+		
+	double xi = magicX*bWidth;
+	double yi = magicY*bHeight;
+
+	int magicX2;
+	auxD = box.x2()/bWidth;
+	auxI = (int)(box.x2()/bWidth);
+	if ((box.x2() < 0) || (auxD - auxI) == 0)
+		magicX2 = (int) (box.x2()/bWidth);
+	else
+		magicX2 = (int) (box.x2()/bWidth + 1);
+
+
+	int magicY2;
+	auxD = box.y2()/bHeight;
+	auxI = (int)(box.y2()/bHeight);
+	if ((box.y2() < 0) || (auxD - auxI) == 0)
+		magicY2 = (int) (box.y2()/bHeight);
+	else
+		magicY2 = (int) (box.y2()/bHeight + 1);
+
+
+	double xf = (magicX2)*bWidth;
+	double yf = (magicY2)*bHeight;
+
+	return TeBox(xi,yi,xf,yf);
+}
+
+TePolygon polygonFromBox( TeBox& bb )
+{
+	TePolygon poly;
+	TeLine2D line;
+	
+	TeCoord2D ll (bb.x1_, bb.y1_);
+	TeCoord2D ul (bb.x1_, bb.y2_);
+	TeCoord2D ur (bb.x2_, bb.y2_);
+	TeCoord2D lr (bb.x2_, bb.y1_);
+
+	line.add(ll);
+	line.add(ul);
+	line.add(ur);
+	line.add(lr);
+	line.add(ll);
+
+	TeLinearRing ring(line);
+	poly.add(ring);
+	return poly;
+}
diff --git a/src/terralib/kernel/TeBox.h b/src/terralib/kernel/TeBox.h
new file mode 100644
index 0000000..5b21bd0
--- /dev/null
+++ b/src/terralib/kernel/TeBox.h
@@ -0,0 +1,204 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeBox.h
+    This file contains structures and definitions to deal with a box
+*/
+#ifndef  __TERRALIB_INTERNAL_BOX_H
+#define  __TERRALIB_INTERNAL_BOX_H
+
+#include "TeCoord2D.h"
+#include "TeDefines.h"
+
+class TeGeometry;
+class TePolygon;
+
+//! Provides support for dealing with a rectangular a box. Used by all geometrical representations
+/*!
+ \sa
+	TeCoord2D
+ */
+struct TeBox {
+
+	enum TeBoxCorner { TeLOWERLEFT=0, TeUPPERLEFT=1, TeLOWERRIGHT=2, TeUPPERRIGHT=3 };
+
+//! Default constructor 
+/*!
+	\param x1 X value of the lower left box coordinate 
+	\param y1 Y value of the lower left box coordinate 
+	\param x2 X value of the upper right box coordinate 
+	\param y2 Y value of the upper right box coordinate 
+*/
+	TeBox ( const double& x1 = TeMAXFLOAT, const double y1 = TeMAXFLOAT,
+		  const double& x2 = -TeMAXFLOAT, const double y2 = -TeMAXFLOAT ):
+		  x1_ ( x1 ), y1_ ( y1 ), x2_ ( x2 ), y2_ ( y2 ) {}
+
+//! Constructor from corners as TeCoord2D objects
+/*!
+	\param p1 lower left box coordinate
+	\param p2 upper right box coordinate
+*/
+	TeBox( const TeCoord2D& p1, const TeCoord2D& p2 ):
+		x1_ ( p1.x() ), y1_ ( p1.y() ),
+		x2_ ( p2.x() ), y2_ ( p2.y() )
+		{}
+
+//! Copy constructor
+	TeBox ( const TeBox& rhs )
+	{
+		x1_ = rhs.x1_;
+		x2_ = rhs.x2_;
+		y1_ = rhs.y1_;
+		y2_ = rhs.y2_;
+	}
+
+//! Operator =
+	TeBox& operator=(const TeBox& rhs)
+	{
+		if ( this == &rhs )
+			return *this;
+		else
+		{
+		x1_ = rhs.x1_;
+		x2_ = rhs.x2_;
+		y1_ = rhs.y1_;
+		y2_ = rhs.y2_;
+		}
+		return *this;
+	}
+
+//!	Returns TRUE if current TeBox is equal to box; otherwise returns FALSE 
+	bool operator== (const TeBox& box) const 
+	{return (  ( fabs (y1_ - box.y1_) < TePrecision::instance().precision() ) 
+			&& ( fabs (x1_ - box.x1_) < TePrecision::instance().precision() ) 
+			&& ( fabs (y2_ - box.y2_) < TePrecision::instance().precision() ) 
+			&& ( fabs (x2_ - box.x2_) < TePrecision::instance().precision() ) 
+			); }
+
+//! Returns the coordinate corresponding to the geometric center of the  box
+	TeCoord2D center() const
+	{	
+		TeCoord2D p ( (  ( x1_ + x2_ ) / 2.), ( ( y1_ + y2_ ) / 2.) );
+		return p;
+	}	
+
+//!	Returns TRUE if current box is valid; otherwise returns FALSE 
+	bool isValid() const
+	{
+		if (x1_ == TeMAXFLOAT || y1_ == TeMAXFLOAT || 
+		    x2_ == -TeMAXFLOAT || y2_ == -TeMAXFLOAT  ||
+			x1_ > x2_ || y1_ > y2_)
+			return false;
+		return true;
+	}
+
+//! Returns the x component of the lower left corner
+	double x1 () const 
+	{ return x1_;}
+
+//! Returns the y component of the lower left corner
+	double y1 () const 
+	{ return y1_;}
+
+//! Returns the x component of the upper right corner
+	double x2 () const 
+	{ return x2_;}
+
+//! Returns the y component of the upper right corner
+	double y2 () const 
+	{ return y2_;}
+
+//! Returns the box width 
+	double width () const 
+	{ return x2_ - x1_; }
+	
+//! Returns the box height 
+	double height () const 
+	{ return y2_ - y1_; }
+	
+//! Returns the lower left coordinate of the box 
+	TeCoord2D lowerLeft() const 
+	{ return TeCoord2D ( x1_, y1_ );}
+
+//! Returns the upper right coordinate of the box 
+	TeCoord2D upperRight() const
+	{ return TeCoord2D (x2_,y2_);}
+
+//! Destructor
+	~TeBox() {}  
+	
+	double x1_, //!< x coordinate of the lower left corner
+		   y1_,	//!< y coordinate of the lower left corner
+		   x2_,	//!< x coordinate of the upper right corner
+		   y2_;	//!< y coordinate of the upper right corner	
+
+};
+
+// ALGORITHMS THAT USE A BOX
+
+/*! \fn void updateBox void updateBox ( TeBox& box, const TeCoord2D& pt ) 
+   \brief update a box to include a coordinate
+ */
+void updateBox ( TeBox& box, const TeCoord2D& pt );  
+
+/*! \fn void updateBox void updateBox ( TeBox& box, const TeBox& other ) 
+   \brief update a box to include another box
+ */
+void updateBox ( TeBox& box, const TeBox& other );
+
+/*! \fn void updateBox ( TeBox& box, const TeGeometry& geo ) 
+   \brief update a box to include a geometry
+ */
+void updateBox ( TeBox& box, const TeGeometry& geo );
+
+
+// ZOOMING FUNCTIONS 
+
+/*! \fn void zoomIn void zoomIn ( TeBox& box, double t = .8) 
+   \brief increases the box by a factor t
+ */
+void zoomIn ( TeBox& box, double t = .8); 
+
+/*! \fn  void zoomOut void zoomOut ( TeBox& box, double t = .8) 
+   \brief decreases box by a factor of t
+ */
+void zoomOut ( TeBox& box, double t = .8);
+ 
+/*! \fn  TeBox makeBox(double x1, double y1, double x2, double y2, const double& tol = 0.0) 
+   \brief builds a box 
+ */
+TeBox makeBox(double x1, double y1, double x2, double y2, const double& tol = 0.0);
+
+/*! \fn  TeBox adjustToCut(TeBox& box, double bWidth, double bHeight) 
+   \brief finds the correspondent smallest box that allows a box to be cut in blocks of a given size 
+ */
+TeBox adjustToCut(TeBox& box, double bWidth, double bHeight);
+
+/*! \fn TePolygon polygonFromBox(TeBox& bb) 
+   \brief builds a TePolygon geometry from a box
+ */
+TePolygon polygonFromBox( TeBox& bb );
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeBufferRegion.cpp b/src/terralib/kernel/TeBufferRegion.cpp
new file mode 100644
index 0000000..4d14452
--- /dev/null
+++ b/src/terralib/kernel/TeBufferRegion.cpp
@@ -0,0 +1,206 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeBufferRegion.h"
+#include "TeOverlay.h"
+#include "TeGeometry.h" 
+#include "TeGeometryAlgorithms.h"
+
+#include <map>
+#include <algorithm>
+#include <cmath>
+
+using namespace std;
+
+namespace TeBUFFERREGION
+{
+
+//---------------- Auxiliary Constants ----------------//
+const double pi      = 3.14159265358979323846;
+
+//---------------- Auxiliary Functions ----------------//
+// A partir de dois pontos, gera um pol�gono no sentido anti-hor�rio
+void TeGenerateBufferPolygon(TeCoord2D first, TeCoord2D last, const double& bufferDistance, const short& numPoints, TePolygon& pol)
+{
+	double xLength  = 0.0;
+	double yLength  = 0.0;
+	double x        = 0.0;
+	double y        = 0.0;
+	double val_ang  = 0.0;
+	double ang		= 0.0;
+
+	TeLine2D contourLine;
+
+	if(TeGeometryAlgorithmsPrecision::IsGreater(first.x(), last.x()))
+	    swap(first, last);
+	else
+		if(TeGeometryAlgorithmsPrecision::IsEqual(first.x(), last.x()))
+		{
+			if(TeGeometryAlgorithmsPrecision::IsSmaller(first.y(), last.y()))
+				swap(first, last);
+		}
+
+
+	xLength = last.x() - first.x();
+
+	if(first.y() < last.y())
+		yLength = last.y() - first.y();
+	else
+		yLength = first.y() - last.y();
+
+	double segmentLength = TeDistance(first, last);
+
+	val_ang = xLength / segmentLength;
+
+	if(val_ang > 1.0)
+		val_ang = 1.0;
+	else
+		if(val_ang < -1.0)
+			val_ang = -1.0;
+
+	if(TeGeometryAlgorithmsPrecision::IsEqual(val_ang, 0.0))
+		ang = 0.0;
+	else
+	{
+		if(TeGeometryAlgorithmsPrecision::IsEqual(first.y(), last.y()))
+			ang = (pi/2.0);
+		else
+			if(TeGeometryAlgorithmsPrecision::IsGreater(first.y(), last.y()))
+				ang = asin(val_ang);
+			else
+				ang = acos(val_ang) + (pi/2.0);
+	}
+
+	// Para cada extremo, calcula uma semi-circunfer�ncia
+	for(int i = 1; i < numPoints; ++i)
+	{
+		double s = sin(ang);
+		double c = cos(ang);
+		
+		x = first.x() + bufferDistance * c ; 
+		y = first.y() + bufferDistance * s ;
+
+		contourLine.add(TeCoord2D(x, y));
+
+		ang += (pi / (numPoints - 1));
+	}
+
+	x = first.x() + bufferDistance * cos(ang) ; 
+	y = first.y() + bufferDistance * sin(ang) ;
+
+	contourLine.add(TeCoord2D(x, y));
+
+	for(int j = 0; j < numPoints; ++j)
+	{		
+		double s = sin(ang);
+		double c = cos(ang);
+		
+		x = last.x() + bufferDistance * c ; 
+		y = last.y() + bufferDistance * s ;
+
+		contourLine.add(TeCoord2D(x, y));
+
+		ang += (pi / (numPoints - 1));
+	}
+
+	contourLine.add(contourLine[0]);
+
+	pol.add(TeLinearRing(contourLine));
+
+	return;
+}
+
+}	// end namespace TeBUFFERREGION
+
+//---------------- Buffer Algorithm ----------------//
+bool TeBUFFERREGION::TeBufferRegion(const TeCoord2D& coord, const double& bufferDistance, const short& numPoints, TePolygon& pol)
+{
+	TeLine2D contourLine;
+
+	contourLine.add(TeCoord2D((coord.x() + bufferDistance), (coord.y())));
+
+	double initialAng = 0.0;
+
+	const double two_pi = 2 * pi;
+
+	double x = 0.0;
+	double y = 0.0;
+
+	for(int i = 1; i < numPoints; ++i)
+	{
+		initialAng += (two_pi / numPoints);
+		
+		double s = sin(initialAng);
+		double c = cos(initialAng);
+		
+		x = coord.x() + bufferDistance * c ; 
+		y = coord.y() + bufferDistance * s ;
+
+		contourLine.add(TeCoord2D(x, y));
+	}
+
+	contourLine.add(TeCoord2D((coord.x() + bufferDistance), (coord.y())));
+
+	pol.add(TeLinearRing(contourLine));
+
+	return true;
+}
+
+
+bool TeBUFFERREGION::TeBufferRegion(const TeLine2D& line, const double& bufferDistance, const short& numPoints, TePolygonSet& ps)
+{
+	ps.clear();
+
+	// Generate first polygon
+	TePolygon pAux;
+	TeGenerateBufferPolygon(line[0], line[1], bufferDistance, numPoints, pAux);
+	ps.add(pAux);
+
+	unsigned int nStep = line.size() - 1;
+	for(unsigned int i = 1; i < nStep; ++i)
+	{
+		// Generate polygon from segment
+		TePolygon p;
+		TeGenerateBufferPolygon(line[i], line[i+1], bufferDistance, numPoints, p);
+
+		//ps.add(p);
+		// Gets union
+		TePolygonSet psAux;
+		psAux.add(p);
+
+		TePolygonSet psAux2;
+
+		if(TeOVERLAY::TeUnion(psAux, ps, psAux2) == false)
+			return false;
+
+		ps = psAux2;		
+	}
+
+	return true;
+}
+
+bool TeBUFFERREGION::TeBufferRegion(const TePolygon& pol, const double& bufferDistance, const short& numPoints, TePolygonSet& ps)
+{
+	return TeBufferRegion(pol[0], bufferDistance, numPoints, ps);
+}
+
diff --git a/src/terralib/kernel/TeBufferRegion.h b/src/terralib/kernel/TeBufferRegion.h
new file mode 100644
index 0000000..dd89313
--- /dev/null
+++ b/src/terralib/kernel/TeBufferRegion.h
@@ -0,0 +1,52 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeBufferRegion.h
+    This file contains structures and definitions for buffer region operation on objects.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz
+  */
+
+#ifndef  __TERRALIB_INTERNAL_BUFFER_H
+#define  __TERRALIB_INTERNAL_BUFFER_H
+
+#include "TeCoord2D.h"
+
+class TeLine2D;
+class TePolygon;
+class TePolygonSet;
+
+namespace TeBUFFERREGION
+{	
+	bool TeBufferRegion(const TeCoord2D& coord, const double& bufferDistance, const short& numPoints, TePolygon& pol);
+
+	bool TeBufferRegion(const TeLine2D& line, const double& bufferDistance, const short& numPoints, TePolygonSet& ps);
+
+	bool TeBufferRegion(const TePolygon& pol, const double& bufferDistance, const short& numPoints, TePolygonSet& ps);
+
+}	// end namespace TeBUFFER
+
+#endif //__TERRALIB_INTERNAL_BUFFER_H
+
diff --git a/src/terralib/kernel/TeCentroid.cpp b/src/terralib/kernel/TeCentroid.cpp
new file mode 100644
index 0000000..39bd7a2
--- /dev/null
+++ b/src/terralib/kernel/TeCentroid.cpp
@@ -0,0 +1,411 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <vector>
+#include <functional>
+#include <algorithm>
+
+#include "TeAssertions.h"
+#include "TeException.h"
+#include "TeGeometryAlgorithms.h"
+
+using namespace std;
+
+
+// Prototypes for internal routines - NOT seen from the outside
+
+TeCoord2D TeFindBaricenter (const TeLinearRing& ring ); // general method ( solves most cases)
+TeCoord2D TeFindCentroidConcavePolygon (const TePolygon& poly ); // brute-force approach (use if above fails)
+
+
+TeCoord2D
+TeFindCentroid(const TePolygon& poly )
+{
+	// This is a two-step algorithm
+
+	// First, try a simple geometric solution
+	// that works for convex polygons and some concave ones
+
+	TeCoord2D pt = TeFindBaricenter( poly[0] );
+
+	if ( TeWithin ( TePoint(pt), poly) )
+		return pt;
+	
+	// No, try a more general approach
+
+	pt = TeFindCentroidConcavePolygon( poly );
+
+return pt;
+}
+
+TeCoord2D
+TeFindCentroid (const TeLine2D& line )
+{
+	int midpoint = (line.size()/2) - 1 ;
+	TeCoord2D middle;
+	
+	TeGetMiddlePoint(line[midpoint], line[midpoint+1], middle);
+	return middle;
+}
+
+TeCoord2D 
+TeFindCentroid(const TeCell& c) 
+{
+	return c.box().center();
+}
+
+TeCoord2D 
+TeFindCentroid(const TePoint& p) 
+{
+	return p.location();
+}
+
+
+TeCoord2D 
+TeFindCentroid(const TePolygonSet& s)
+{
+	TePointSet pset;
+	TePolygonSet::iterator it1 = s.begin(); 
+	while (it1 != s.end())
+	{
+		TeCoord2D p1 = TeFindCentroid (*it1);
+		TePoint po;
+		po.add (p1);
+		pset.add (po);
+		it1++;
+	}
+
+	double x, y;
+	int n = 0;
+	TePointSet::iterator it2 = pset.begin(); 
+	while (it2 != pset.end())
+	{
+		x =+ (*it2).location().x();
+		y =+ (*it2).location().y();
+		n++;
+		it2++;
+	}
+	
+	TeCoord2D p;
+	if (n != 0)
+	{
+		x = x/n;
+		y = y/n;
+		p.setXY (x, y);
+	}
+	return p;
+}
+
+
+TeCoord2D 
+TeFindCentroid(const TeLineSet& s)
+{
+	TePointSet pset;
+	TeLineSet::iterator it1 = s.begin(); 
+	while (it1 != s.end())
+	{
+		TeCoord2D p1 = TeFindCentroid (*it1);
+		TePoint po;
+		po.add (p1);
+		pset.add (po);
+		it1++;
+	}
+
+	double x, y;
+	int n = 0;
+	TePointSet::iterator it2 = pset.begin(); 
+	while (it2 != pset.end())
+	{
+		x =+ (*it2).location().x();
+		y =+ (*it2).location().y();
+		n++;
+		it2++;
+	}
+	
+	TeCoord2D p;
+	if (n != 0)
+	{
+		x = x/n;
+		y = y/n;
+		p.setXY (x, y);
+	}
+	return p;
+}
+
+
+TeCoord2D 
+TeFindCentroid(const TeCellSet& s)
+{
+	TePointSet pset;
+	TeCellSet::iterator it1 = s.begin(); 
+	while (it1 != s.end())
+	{
+		TeCoord2D p1 = TeFindCentroid (*it1);
+		TePoint po;
+		po.add (p1);
+		pset.add (po);
+		it1++;
+	}
+
+	double x, y;
+	int n = 0;
+	TePointSet::iterator it2 = pset.begin(); 
+	while (it2 != pset.end())
+	{
+		x =+ (*it2).location().x();
+		y =+ (*it2).location().y();
+		n++;
+		it2++;
+	}
+	
+	TeCoord2D p;
+	if (n != 0)
+	{
+		x = x/n;
+		y = y/n;
+		p.setXY (x, y);
+	}
+	return p;
+}
+
+TeCoord2D 
+TeFindCentroid(TePointSet& points)
+{
+	TeCoord2D result;
+	if (points.size() == 1)
+		result = (points[0]).location();
+	else
+	{
+		TeBox bpt = points.box();
+		result = bpt.center();
+	}
+	return result;
+}
+
+/*
+ * ANSI C++ code from the article
+ * "Centroid of a Polygon"
+ * by Gerard Bashein and Paul R. Detmer,
+ * in "Graphics Gems IV", Academic Press, 1994
+ */
+
+/*********************************************************************
+Centroid: Calculates the centroid (xCentroid, yCentroid) 
+of a polygon, given its vertices (x[0], y[0]) ... (x[n-1], y[n-1]). It
+is assumed that the contour is closed, i.e., that the vertex following
+(x[n-1], y[n-1]) is (x[0], y[0]).  
+
+**********************************************************************/
+
+TeCoord2D
+TeFindBaricenter ( const TeLinearRing& ring )
+{
+
+    double ai, atmp = 0, xtmp = 0, ytmp = 0;
+         
+    int n = ring.size() - 1; // our polygons wrap around
+	int i, j;
+
+    if (n < 3) return TeCoord2D (0., 0.);
+
+	for ( i = n-1, j = 0; j < n; i = j, j++)
+ 	{
+ 	  	ai = ring[i].x() * ring[j].y() - ring[j].x() * ring[i].y();
+	  	atmp += ai;
+	  	xtmp += (ring[j].x() + ring[i].x()) * ai;
+	  	ytmp += (ring[j].y() + ring[i].y()) * ai;
+	}
+
+    if (atmp != 0)
+	{
+		return TeCoord2D ( (xtmp / (3. * atmp)), ( ytmp / (3. * atmp)));
+	}
+	return TeCoord2D ( 0., 0. );
+}
+
+
+
+//
+//	TeFindCentroidConcavePolygon 
+//
+//  This algorithm is based on the idea of a plane-sweep
+//
+//  1. Divide the box into horizontal slices
+//
+//  2. Sweep the plane, starting from the bottom
+//
+//  3. For each y-slice, find the horizontal intersections in the 
+//     forward direction (if it exists)
+//
+//  4. Sort these intersections
+//
+//  5. Order the intersections 
+//
+//  6. For all possible "intersections", select a mid-point and
+//     test if this point is inside the polygon
+//
+//  7. If a centroid has not been found, cut the box into
+//     "smaller" slices and repeat steps 2-6
+
+
+
+// Defines a function object for sorting coordinates in ascending x-order
+ 
+struct x_order : public binary_function<TeCoord2D, TeCoord2D, bool>
+{
+        bool operator()(TeCoord2D& pt1, TeCoord2D& pt2) { return pt1.x() < pt2.x(); }
+};
+
+// Defines a distance measure between two Coordinate pairs (used for sorting)
+
+struct x_dist : public binary_function<TeCoordPair, TeCoordPair, bool>
+{
+		bool operator()(TeCoordPair c1, TeCoordPair c2)
+		{
+			return ( ( c1.pt2.x() - c1.pt1.x() ) > ( c2.pt2.x() - c2.pt1.x() ) ); 
+		}
+};
+
+
+typedef vector<double> doubleVect;
+
+TeCoord2D
+TeFindCentroidConcavePolygon ( const TePolygon& poly )
+{
+
+	TeLinearRing coords = poly[0];
+
+	TeBox box = coords.box();
+
+	int NSLICES = 10;
+
+	int NMAXSLICES = 400;
+
+	double yinit = box.lowerLeft().y();
+		
+	while ( true )
+	{
+		int nparts = NSLICES + 2; // divide the box into slices
+
+		double increm = ( box.upperRight().y() - box.lowerLeft().y() ) / nparts; // y-increment
+
+		double yslice = yinit; // start at the bottom
+
+		TeCoordPairVect intersecList;  //vector of horizontal intersections
+
+		doubleVect crossList; //vector of x-crossings
+
+		for ( int i = 0; i < NSLICES; i++ )
+		{
+			yslice += increm; //next slice
+
+			for (unsigned int x = 0; x < ( coords.size() - 1 ); x++ )
+				TeCoord2D cd= coords[x];
+
+			for  (unsigned int j = 0;  j < ( coords.size() - 1 ); j++ ) 		
+			{
+
+				TeCoord2D vtx0 = coords[j];
+				TeCoord2D vtx1 = coords[j+1];
+
+				bool yflag0 = ( vtx0.y() >= yslice );
+				bool yflag1 = ( vtx1.y() >= yslice ) ;
+				/* check if endpoints straddle (are on opposite sides) of X axis
+				* (i.e. the Y's differ); if so, +X ray could intersect this edge.
+				*/
+
+				if ( yflag0 != yflag1 )
+				{
+					// line crosses ring horizontally 
+
+					double slope =  ( vtx1.x() - vtx0.x() ) / ( vtx1.y() - vtx0.y());
+					double xcross = ( yslice -   vtx0.y() )* slope + vtx0.x();
+			
+					crossList.push_back ( xcross );	
+				}
+
+			}
+
+			// Sort the x-intersections
+
+			sort ( crossList.begin(), crossList.end() );
+
+			doubleVect::iterator it = crossList.begin();
+			
+			// Create a list of intersection points
+
+			while ( it != crossList.end() )
+			{
+				TeCoordPair cp;
+
+				cp.pt1 = TeCoord2D ( (*it), yslice );
+				++it;
+				if ( it == crossList.end() ) break;
+
+				cp.pt2 = TeCoord2D ( (*it), yslice );
+				++it;
+
+				intersecList.push_back ( cp );
+			}
+					
+		} // for all slices
+
+		// Now sort all the intersections
+
+		sort ( intersecList.begin(), intersecList.end(), x_dist() );
+
+		// Go through the intersection list
+		// Find the mid-point
+
+		TeCoordPairVect::iterator it = intersecList.begin();
+		
+		while ( it != intersecList.end() )
+		{
+			double xmid = (*it).pt1.x() + ( (*it).pt2.x() - (*it).pt1.x() ) / 2;
+
+			TeCoord2D pt ( xmid, (*it).pt2.y() );
+
+
+			if ( TeWithin (TePoint(pt), poly) ) // have we found it ???
+				return pt;
+
+			++it;  // try the next largest x-intersection
+		}
+
+		NSLICES *= 2;  // double the number of slices
+
+		// iterate until a maximum number of slices
+		// if not able to find a centroid, log an error, but don't stop
+		if ( NSLICES > NMAXSLICES ) 
+		{
+			string userText = "Polygon number " + poly.geomId ();
+
+			TeErrorLog::instance().insert ( CENTROID_NOT_FOUND, userText );
+
+			return TeCoord2D ( TeMAXFLOAT, TeMAXFLOAT );
+		}
+	}
+
+}
+
+
diff --git a/src/terralib/kernel/TeComposite.h b/src/terralib/kernel/TeComposite.h
new file mode 100644
index 0000000..bddb193
--- /dev/null
+++ b/src/terralib/kernel/TeComposite.h
@@ -0,0 +1,195 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeComposite.h
+    This file contains definition of composite structures in TerraLib
+*/
+
+#ifndef  __TERRALIB_INTERNAL_COMPOSITE_H
+#define  __TERRALIB_INTERNAL_COMPOSITE_H
+
+#include "TeCounted.h"
+
+#include <vector>
+using namespace std;
+
+//!  Defines a templated class for handling an object built of one single atomic element
+template <class T>
+class TeSingle
+{
+public:
+	//! Constructor
+	TeSingle<T>() {}
+
+	//! Destructor
+	virtual ~TeSingle<T>() {}
+
+	//! Copy constructor
+	TeSingle<T> ( T& elem ): elem_ ( elem  ) {}
+
+	//! Adds the single element
+	void add ( T& elem )
+	{	elem_ = elem; }
+
+	//! Returns a referency to the single element
+	T&	location ()
+	{	return elem_; }
+
+	//! Returns a constant reference to the single element
+	const T& location() const
+	{
+		return elem_;
+	}
+
+	//! Returns a referency to the single element
+	T&	elem ()
+	{	return elem_; }
+
+protected:
+	T	elem_;	//!< the single element
+
+};
+
+//! Defines a template for handling a composite object
+/*! 
+	Provides a vector for storing components and ensures 
+	proper destruction of them, by means of a handle/body idiom. 
+	Provide a handle to an implementation and thus allow efficient 
+	copying of derived objects
+
+	\note This is a specialised example of the "Composite"
+	design pattern, with support for the "Bridge" pattern
+	(also known as the handle/body idiom).
+*/
+template <class T>
+class TeComposite: public TeCounted
+{
+public:
+	
+	using TeCounted::attach;
+	using TeCounted::detach;
+
+	//! An iterator to the composite elements 
+	typedef typename vector<T>::iterator iterator;
+
+	//! Adds a new component
+	void add ( const T& elem )
+	{ components_.push_back ( elem ); }
+
+	//! Removes the i-th component
+	bool erase ( unsigned int i )
+	{ 	
+		if ( components_.size() < i )
+			return false;
+		return ! ( components_.erase ( components_.begin() + i ) == components_.end() );
+	}
+
+	//! Removes a specific element 
+	/*!
+		\param elem the element to be removed
+	*/
+	bool erase ( T& elem )
+	{ 
+		typename vector<T>::iterator location = find(components_.begin(),components_.end(), elem);
+		if ( location != components_.end())
+		{
+			components_.erase(elem);
+			return true;
+		}
+		else
+			return false; 
+	}
+
+	//! Removes an element pointed by an iterator
+	iterator erase(iterator it)
+	{
+		return components_.erase(it);
+	}
+
+	//! Removes all elements
+	void clear ()
+	{	components_.clear (); }
+
+	//! Returns the size of the composite
+	unsigned int size() const
+	{ return components_.size(); }
+
+	//! Returns the i-th element
+	T& operator [] ( int i )
+	{ return components_[ i ]; }
+
+	//! Returns TRUE if the composite is empty
+	bool empty() const
+	{ return components_.empty(); }
+
+	//! Reserves space for n elements (reserve is available for vectors)  
+	void reserve(int nelem)
+	{ components_.reserve(nelem); }
+
+	//! Returns an iterator to the composite first element
+	iterator begin(void)
+	{
+		return components_.begin();
+	}
+
+	//! Returns an iterator to the composite first element
+	const iterator begin(void) const
+	{
+		return components_.begin();
+	}
+
+	//! Returns a iterator to the composite last plus one element
+    iterator end(void)
+	{
+		return components_.end();
+	}
+
+	//! Returns an iterator to the composite last plus one element
+    const iterator end(void) const
+	{
+		return components_.end();
+	}
+
+	//! A reverse iterator to the composite elements 
+	typedef typename vector<T>::reverse_iterator reverse_iterator;
+
+	//! The iterator to the first position in the TeComposite in reverse order
+	reverse_iterator rbegin(void) 
+	{
+		return components_.rbegin();
+	}
+
+	//! The iterator to the last plus one position in the TeComposite in reverse order
+    reverse_iterator rend(void) 
+	{
+		return components_.rend();
+	}
+
+
+protected:
+	vector<T>	components_; //!< a vector of components
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeComputeAttributeStrategies.cpp b/src/terralib/kernel/TeComputeAttributeStrategies.cpp
new file mode 100644
index 0000000..ef711cc
--- /dev/null
+++ b/src/terralib/kernel/TeComputeAttributeStrategies.cpp
@@ -0,0 +1,969 @@
+// TeSpatialOperators.cpp: implementation of the TeSpatialOperators class.
+//
+//////////////////////////////////////////////////////////////////////
+
+#include "TeComputeAttributeStrategies.h"
+#include "TeSTElementSet.h"
+#include "TeOverlay.h"
+
+using namespace TeOVERLAY;
+
+bool TeNearest (TeCoord2D& pt,TePointSet& ps, TeCoord2D& pout, double& dmin, const double& tol = 0.0);
+
+TePropertyVector 
+TeCategoryAreaPercentageStrategy::compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)  
+{
+
+	// convert input box to a polygonset
+	TePolygonSet box_ps = TeBox2PolygonSet (box);
+	map<string, double>  areaMap;
+	double partial_area = 0.0;
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+		{	
+		
+			// initialize areMap
+			map<string, string>::iterator itMap = classesMap_.begin();
+			while (itMap != classesMap_.end())
+			{
+				areaMap[(*itMap).second] = 0;
+				++itMap;
+			}
+			partial_area = 0.0;
+			// iterate over all objects that intercept the box
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string category;
+				if ((*it).getPropertyValue (attrName, category))
+				{	
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+						TePolygonSet intersect;
+						TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+						double intersectArea = TeGeometryArea (intersect);
+						partial_area += intersectArea;
+						areaMap[classesMap_[category]] +=  intersectArea; // suppose objects are disjoint
+					
+					}
+			
+				}
+				++it;
+			}
+		}
+
+	double areaTot = TeGeometryArea (box_ps);
+	double perc_total = 0.0;
+	double corrected_perc_total = 0.0;
+	vector<double> vec_percent;
+
+
+	map <string, double>:: iterator areaIt = areaMap.begin();
+	while(areaIt != areaMap.end())  
+	{
+		double percent = 0.0;
+		if (areaTot != 0) percent = (*areaIt).second/areaTot;
+		perc_total += percent;
+		vec_percent.push_back (percent);
+		++areaIt;
+	}
+
+
+	int i = 0;
+	if (perc_total > 1.5) 
+	{
+		areaIt = areaMap.begin();
+		while(areaIt != areaMap.end())  
+		{
+			if ((*areaIt).first == "")
+			{
+				perc_total = perc_total - vec_percent[i];
+				vec_percent[i] = 0.0;
+			}
+			++areaIt;
+			i++;
+		}
+	}
+
+	i = 0;
+	if (perc_total > 1.02) 
+	{
+		areaIt = areaMap.begin();
+		while(areaIt != areaMap.end())  
+		{
+			vec_percent[i] = vec_percent[i]/perc_total;
+			++areaIt;
+			i++;
+		}
+	}	
+	
+	TePropertyVector  result;
+	i= 0;
+	areaIt = areaMap.begin();
+	while(areaIt != areaMap.end())  
+	{
+	
+		TeProperty prop;
+		double percent = vec_percent[i];
+		corrected_perc_total += percent;
+		prop.value_    = Te2String (percent); // count
+		prop.attr_.rep_.name_ = columnName + (*areaIt).first; // category
+		prop.attr_.rep_.type_ = TeREAL;
+		result.push_back (prop);
+		++areaIt;
+		i++;
+
+	}
+	return result;
+
+}
+
+
+
+
+// For relative values to be weighted in space (e.g., population densitity, malaria per number of inhabitants, etc.)	
+
+TePropertyVector  TeAverageWeighbyAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)  
+{
+
+	double weigh_val = 0.0;
+
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{	
+
+		// convert input box to a polygonset
+		TePolygonSet box_ps = TeBox2PolygonSet (box);
+		double areaBox = TeGeometryArea(box);
+		if (areaBox > 0.0)
+		{
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string val;
+				if ((*it).getPropertyValue (attrName, val))
+				{
+					double num_val = atof (val.c_str());
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+					
+						// for (unsigned int i = 0 ; i < objGeom.size(); i++)
+						//	TeRemoveDuplicatedCoordinates (objGeom[i]);
+						TePolygonSet intersect;
+						TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+						double intersectArea = TeGeometryArea (intersect);
+						weigh_val += num_val*(intersectArea/areaBox); // suppose objects are disjoint
+		
+					
+					}
+				}
+				++it;
+			}
+		}
+	}
+
+ 	TeProperty  prop;
+	prop.value_ = Te2String (weigh_val);
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+
+
+
+TePropertyVector 
+TeCategorySoilsAreaPercentageStrategy::compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)  
+{
+
+	map<string, double>  areaMap;
+	double partial_area = 0.0;
+
+	// convert input box to a polygonset
+	TePolygonSet box_ps = TeBox2PolygonSet (box);
+	map<string, double> categoryMap;
+
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{	
+	
+			// initialize areMap
+			map<string, string>::iterator itMap = classesMap_.begin();
+			while (itMap != classesMap_.end())
+			{
+				areaMap[(*itMap).second] = 0;
+				++itMap;
+			}
+			partial_area = 0.0;
+			// iterate over all objects that intercept the box
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string category;
+				if ((*it).getPropertyValue (attrName, category))
+				{	
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+						TePolygonSet intersect;
+						TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+						double intersectArea = TeGeometryArea (intersect);
+						partial_area += intersectArea;
+						areaMap[classesMap_[category]] +=  intersectArea; // suppose objects are disjoint
+						categoryMap[category] +=  intersectArea; 
+					}
+			
+				}
+				++it;
+			}
+		}
+
+	double areaTot = TeGeometryArea (box_ps);
+
+	map <string, double>:: iterator categoryIt = categoryMap.begin();
+	if (partial_area > (1.5*areaTot)) 
+	{
+		while(categoryIt != categoryMap.end())  
+		{
+			if ((*categoryIt).first == "")
+			{
+				partial_area -= (*categoryIt).second;
+				areaMap[classesMap_[(*categoryIt).first]] -= (*categoryIt).second;
+				(*categoryIt).second = 0.0;
+			}
+			++categoryIt;
+		}
+	}
+
+	int i = 0;
+	double perc_total = 0.0;
+	vector<double> vec_percent;		
+	map <string, double>:: iterator areaIt = areaMap.begin();
+	while(areaIt != areaMap.end())  
+	{
+		double percent = 0.0;
+		if (areaTot != 0) percent = (*areaIt).second/areaTot;
+		perc_total += percent;
+		vec_percent.push_back (percent);
+		++areaIt;
+	}
+
+	double corrected_perc_total = 0.0;
+	i = 0;
+	if (perc_total > 1.02) 
+	{
+		areaIt = areaMap.begin();
+		while(areaIt != areaMap.end())  
+		{
+			vec_percent[i] = vec_percent[i]/perc_total;
+			++areaIt;
+			i++;
+		}
+	}	
+	
+	TePropertyVector  result;
+	i= 0;
+	areaIt = areaMap.begin();
+	while(areaIt != areaMap.end())  
+	{
+	
+		TeProperty prop;
+		double percent = vec_percent[i];
+		corrected_perc_total += percent;
+		prop.value_    = Te2String (percent); // count
+		prop.attr_.rep_.name_ = columnName + (*areaIt).first; // category
+		prop.attr_.rep_.type_ = TeREAL;
+		result.push_back (prop);
+		++areaIt;
+		i++;
+
+	}
+	return result;
+
+}
+
+TePropertyVector 
+TeCategoryMajorityStrategy::compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)  
+{
+	map<string, double>  areaMap;
+	// convert input box to a polygonset
+	TePolygonSet box_ps = TeBox2PolygonSet (box);
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{	
+			// initialize areMap
+			map<string, string>::iterator itMap = classesMap_.begin();
+			while (itMap != classesMap_.end())
+			{
+				areaMap[(*itMap).second] = 0;
+				++itMap;
+			}
+
+			// iterate over all objects that intercept the box
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string category;
+				if ((*it).getPropertyValue (attrName, category))
+				{	
+
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+						TePolygonSet intersect;
+						TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+						double intersectArea = TeGeometryArea (intersect);
+						areaMap[classesMap_[category]] +=  intersectArea; // suppose objects are disjoint
+					}
+			
+				}
+				++it;
+			}
+		}
+
+	double max = 0.0;
+	TePropertyVector  result;
+	TeProperty prop;
+	prop.attr_.rep_.type_ = TeSTRING;
+//	prop.value_ = defaultValue_.value_;
+	prop.attr_.rep_.name_ = columnName; 
+	prop.attr_.rep_.numChar_ = 48;
+	map <string, double>:: iterator it = areaMap.begin();
+	while(it != areaMap.end())  
+		{
+			if ((*it).second > max)
+			{
+				prop.value_ = (*it).first;
+				max = (*it).second;
+			}
+			++it;		
+		}
+
+
+	result.push_back (prop);
+	return result;
+
+}
+
+TePropertyVector TeTotalAreaPercentageStrategy:: 
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{  
+	double area = TeGeometryArea(box);
+	double totArea = 0.0;
+
+	if (area > 0.0)
+	{
+		// convert input box to a polygonset
+		TePolygonSet box_ps = TeBox2PolygonSet (box);
+
+		// Build stoset
+		TeSTElementSet stos (theme);
+		vector<string> attrNames;
+		attrNames.push_back (attrName);	
+		if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+		{
+			// iterate over all objects that intercept the box
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				TePolygonSet objGeom;  
+				if ((*it).getGeometry(objGeom))
+				{
+						TePolygonSet intersect;
+						//TeGeometryAlgorithmsPrecision temp(0.0);
+						TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+						double intersectArea = TeGeometryArea (intersect);
+						totArea +=  intersectArea; // suppose objects are disjoint
+		
+				}
+				++it;
+			}
+		}
+	}
+
+	double percentage = 0.0;
+	if (area > 0.0) percentage = totArea/area;
+
+	if (percentage > 0.999) percentage = 1;
+	TeProperty  prop;
+	prop.value_ = Te2String (percentage);
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+
+TePropertyVector  TeCountPolygonalObjectsStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox /* box */, const string& columnName)
+{
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+	TeProperty  prop;
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+	prop.value_ = Te2String (stos.numElements());
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+TePropertyVector  TeCountLineObjectsStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox /* box */, const string& columnName)
+{
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+	TeProperty  prop;
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+	prop.value_ = Te2String (stos.numElements());
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+
+TePropertyVector  TeCountPointObjectsStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox /* box */, const string& columnName)
+{  
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	TeSTOSetBuildDB (&stos, true, false, attrNames);
+
+	TeProperty  prop;
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+	prop.value_ = Te2String (stos.numElements());
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+TePropertyVector  TeLineLengthStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+	double length = 0;
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{
+
+		// convert input box to a polygonset
+		TePolygonSet box_ps = TeBox2PolygonSet (box);
+
+		double length = 0.0;
+		TeSTElementSet::iterator it = stos.begin();
+		while (it != stos.end())
+		{
+				TeLineSet objGeom;  
+				if ((*it).getGeometry(objGeom))
+				{
+					TeLineSet intersect;
+	//				if ((TeIntersection (area, (*it).geometry , intersect))
+					TeLineSet::iterator lineIt = intersect.begin();
+					while (lineIt != intersect.end())
+					{
+						length += TeLength (*lineIt); // suppose objects are disjoin
+						lineIt++;
+					}
+				}
+				++it;
+		}
+	}
+
+
+	TeProperty  prop;
+	prop.value_ = Te2String (length);
+	TePropertyVector  result;
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	result.push_back (prop);
+	return result;
+}
+
+
+
+// For absolute values to be partinioned in space (e.g., population, number of malaria cases, etc.)	
+TePropertyVector  TeSumWeighByAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+	double weigh_val = 0.0;
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{	
+
+		// convert input box to a polygonset
+		TePolygonSet box_ps = TeBox2PolygonSet (box);
+		double areaBox = TeGeometryArea(box);
+		if (areaBox > 0.0)
+		{
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string val;
+				if ((*it).getPropertyValue (attrName, val))
+				{
+					double num_val = atof (val.c_str());
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+						//for (unsigned int i = 0 ; i < objGeom.size(); i++)
+						//		TeRemoveDuplicatedCoordinates (objGeom[i]);
+						double geomArea = TeGeometryArea (objGeom);
+						if (geomArea > 0.0)
+						{
+							TePolygonSet intersect;
+							//TeGeometryAlgorithmsPrecision temp(0.0);
+							TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+							double intersectArea = TeGeometryArea (intersect);
+							weigh_val += num_val*(intersectArea/geomArea); 
+						
+						}
+					
+					}
+				}
+				++it;
+			}
+		}
+	}
+
+
+	TeProperty  prop;
+	prop.value_ = Te2String (weigh_val);
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+
+
+TePropertyVector  TeSumWeighByRestrictedAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+	double weigh_val = 0.0;
+
+	if (!raster_)
+	{
+		TeProperty  prop;
+		prop.value_ = Te2String (weigh_val);
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+
+	double raster_elem_area = raster_->params().resx_*raster_->params().resy_;
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{	
+				// convert input box to a polygonset
+		TePolygonSet box_ps = TeBox2PolygonSet (box);
+		double areaBox = TeGeometryArea(box);
+		if (areaBox > 0.0)
+		{
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string val;
+				if ((*it).getPropertyValue (attrName, val))
+				{
+					double num_val = atof (val.c_str());
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+						double geomArea = TeGeometryArea (objGeom);
+						if (geomArea > 0.0)
+						{
+							TePolygonSet intersect;
+							TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+							double raster_intersect_area = 0.0;
+//							double intersec_area = TeGeometryArea (intersect);
+							TePolygonSet::iterator psIt = intersect.begin();
+							while (psIt != intersect.end())
+							{
+							
+								TeRaster::iteratorPoly raster_it;
+								TeRaster::iteratorPoly raster_it_end;
+								raster_it = raster_->begin (box_ps.first(), TeBoxPixelIn);
+								raster_it_end = raster_->end (box_ps.first(), TeBoxPixelIn);
+
+								while 	(raster_it != raster_it_end)
+								{
+									int val = (int)(raster_it.operator*(band_));  // OPERADOR * POR BANDA
+									if (val != 0) val = 5;
+									if (classesSelection_[val] == 1)
+											raster_intersect_area +=  raster_elem_area;
+									++raster_it;
+								}
+								++psIt;
+							}
+							weigh_val += num_val*(raster_intersect_area/geomArea); // avarege considering cell area
+						}
+					}
+				}
+				++it;
+			}
+		
+		}
+	}
+
+
+	TeProperty  prop;
+	prop.value_ = Te2String (weigh_val);
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+// For relative values to be weighted in space (e.g., percentage of a given land cover in the municipality, etc.)	
+TePropertyVector  TeAverageWeighByRestrictedAreaStrategy::
+compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName)
+{
+	double weigh_val = 0.0;
+
+	if (!raster_)
+	{
+		TeProperty  prop;
+		prop.value_ = Te2String (weigh_val);
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+
+	double raster_elem_area = raster_->params().resx_*raster_->params().resy_;
+
+	// Build stoset
+	TeSTElementSet stos (theme);
+	vector<string> attrNames;
+	attrNames.push_back (attrName);	
+	if (TeSTOSetBuildDB (&stos, true, false, attrNames))
+	{	
+		// convert input box to a polygonset
+		TePolygonSet box_ps = TeBox2PolygonSet (box);
+		double areaBox = TeGeometryArea(box);
+		if (areaBox > 0.0)
+		{
+			TeSTElementSet::iterator it = stos.begin();
+			while (it != stos.end())
+			{
+				string val;
+				if ((*it).getPropertyValue (attrName, val))
+				{
+					double num_val = atof (val.c_str());
+					TePolygonSet objGeom;  
+					if ((*it).getGeometry(objGeom))
+					{
+						double geomArea = TeGeometryArea (objGeom);
+						if (geomArea > 0.0)
+						{
+							TePolygonSet intersect;
+							TeOverlay(box_ps, objGeom, intersect, TeINTERSECTION);
+
+							double raster_intersect_area = 0.0;
+//							double intersec_area = TeGeometryArea (intersect);
+
+							TePolygonSet::iterator psIt = intersect.begin();
+							while (psIt != intersect.end())
+							{
+								TeRaster::iteratorPoly raster_it(raster_);
+								TeRaster::iteratorPoly raster_it_end (raster_);
+								raster_it = raster_->begin ((*psIt), TeBoxPixelIn);
+								raster_it_end = raster_->end ((*psIt), TeBoxPixelIn);
+								while 	(raster_it != raster_it_end)
+								{
+									int val = (int)(raster_it.operator*(band_));  // OPERADOR * POR BANDA
+									if (classesSelection_[val] == 1)
+										raster_intersect_area +=  raster_elem_area;
+									++raster_it;
+								}
+								++psIt;
+							}
+							weigh_val += num_val*(raster_intersect_area/areaBox); // avarege considering cell area
+						}
+					}
+				
+				}
+				++it;
+			}
+		
+		}
+	}
+
+
+	TeProperty  prop;
+	prop.value_ = Te2String (weigh_val);
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+}
+
+
+TePropertyVector  TeMinimumDistancePolygonsStrategy::
+compute (TeTheme* theme, const string& /* attrName */, TeBox box, const string& columnName)
+{
+	TePolygonSet ps;
+	if (theme->layer()->getPolygons(ps) == false) 
+	{
+		TeProperty  prop;
+		prop.value_ = Te2String (TeMAXFLOAT);
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+	TeCoord2D p1 = box.center();
+
+	TeCoord2D pinter;
+	double dmin = TeMAXFLOAT;
+
+	for (unsigned int i = 0; i < ps.size(); i++)
+	{
+		TePolygon p = ps[i];
+		if ((p.objectId() == "913") || (p.objectId() == "898"))
+		for (unsigned int j = 0; j < p.size(); j++)
+		{
+			TeLinearRing l = p[j];
+			//if (TeOrientation (l) == TeCOUNTERCLOCKWISE) // outside polygon
+				for (unsigned int k = 0; k < l.size(); k++)
+				{
+					double d = 	TeDistance (p1, l[k]);
+					if (d < dmin) dmin = d;
+				}
+		}
+	}
+	
+	TeProperty  prop;
+	prop.value_ = Te2String (dmin);
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+
+}
+
+TePropertyVector  TeMinimumDistanceLinesStrategy::
+compute (TeTheme* theme, const string& /* attrName */, TeBox box, const string& columnName)
+{
+	TeLineSet ls;
+	if (theme->layer()->getLines(ls) == false) 
+	{
+		TeProperty  prop;
+		prop.value_ = Te2String (TeMAXFLOAT);
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+	TeCoord2D p1 = box.center();
+
+	int line_index;
+	TeCoord2D pinter;
+	double distance;
+
+	TeProperty  prop;
+	prop.value_ = Te2String (TeMAXFLOAT);
+	if (TeNearest (p1, ls, line_index, pinter, distance))
+		prop.value_ = Te2String (distance);
+
+
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+
+}
+
+
+TePropertyVector  TeMinimumDistancePointsStrategy::
+compute (TeTheme* theme, const string& /* attrName */, TeBox box, const string& columnName)
+{
+
+	TePointSet ps;
+	if (theme->layer()->getPoints (ps) == false) 
+	{
+		TeProperty  prop;
+		prop.value_ = Te2String (TeMAXFLOAT);
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+
+
+	// if (TeGetRepresentation (layer, ls, t) == false) return false;
+	TeCoord2D p1 = box.center();
+
+	TeCoord2D pinter;
+
+	TeProperty  prop;
+	prop.value_ = Te2String (TeMAXFLOAT);
+//	int i;
+	double distance;
+	if (TeNearest (p1, ps, pinter, distance))
+//	if (TeNearest (p1, ps, i))
+	{
+		//double distance = TeDistance (p1, ps[i].location()); 
+		prop.value_ = Te2String (distance);
+	}
+
+
+	prop.attr_.rep_.name_ = columnName;
+	prop.attr_.rep_.type_ = TeREAL;
+
+	TePropertyVector  result;
+	result.push_back (prop);
+	return result;
+
+}
+
+
+
+TePolygonSet
+TeBox2PolygonSet (const TeBox& box)
+{
+	// create polygon representing each cell box
+	// simplification: assume same projection
+
+	TePolygon poly;
+              
+	TeCoord2D coord1 (box.x1(), box.y1());
+	TeCoord2D coord2 (box.x1(), box.y2());
+	TeCoord2D coord3 (box.x2(), box.y2());
+	TeCoord2D coord4 (box.x2(), box.y1());
+	TeCoord2D coord5 (box.x1(), box.y1());
+
+	TeLine2D line;
+	line.add(coord1);
+	line.add(coord2);
+	line.add(coord3);
+	line.add(coord4);
+	line.add(coord5);
+
+	TeLinearRing ring(line);
+	poly.add(ring);
+	TePolygonSet ps;  
+	ps.add (poly);
+	return ps;
+}
+
+
+TePolygon
+TeBox2Polygon (const TeBox& box)
+{
+	// create polygon representing each cell box
+	// simplification: assume same projection
+
+	TePolygon poly;
+              
+	TeCoord2D coord1 (box.x1(), box.y1());
+	TeCoord2D coord2 (box.x1(), box.y2());
+	TeCoord2D coord3 (box.x2(), box.y2());
+	TeCoord2D coord4 (box.x2(), box.y1());
+	TeCoord2D coord5 (box.x1(), box.y1());
+
+	TeLine2D line;
+	line.add(coord1);
+	line.add(coord2);
+	line.add(coord3);
+	line.add(coord4);
+	line.add(coord5);
+
+	TeLinearRing ring(line);
+	poly.add(ring);
+
+	return poly;
+}
+
+
+
+bool TeNearest (TeCoord2D& pt,TePointSet& ps,  TeCoord2D& pout, double& dmin, const double& /* tol */)
+{
+	bool flag = false;
+
+	dmin = TeMAXFLOAT;
+
+	for (unsigned int i = 0 ; i < ps.size(); i++)
+	{
+		double d = 	TeDistance (pt, ps[i].location());
+		if (d < dmin)
+		{
+
+			pout = ps[i].location();
+			dmin = d;
+			flag = true;
+		}
+	
+	}
+	return flag;
+}
diff --git a/src/terralib/kernel/TeComputeAttributeStrategies.h b/src/terralib/kernel/TeComputeAttributeStrategies.h
new file mode 100644
index 0000000..5fc06a8
--- /dev/null
+++ b/src/terralib/kernel/TeComputeAttributeStrategies.h
@@ -0,0 +1,610 @@
+// TeOperationStrategy.h: interface for the TeOperationStrategy class.
+//
+//////////////////////////////////////////////////////////////////////
+
+
+/*! \file TeOperationStrategy.h
+    This file contains functions to compute attributes based on 
+	alternative strategies. These strategies (Strategy Design Pattern)
+	correspond to operations to derive information based on other  layers attributes and/or
+	spatial components (polygonal, raster, point, raster or other cells). 
+*/
+
+
+
+#ifndef TeComputeAttrStrategies_H
+#define TeComputeAttrStrategies_H
+
+
+
+#include <TeAttribute.h>
+#include <TeLayer.h>
+#include <TeTimeInterval.h>
+#include <TeGeometryAlgorithms.h>
+#include <TeSTEFunctionsDB.h>
+
+
+TePolygonSet  TeBox2PolygonSet (const TeBox& box);		
+TePolygon	  TeBox2Polygon (const TeBox& box);		
+
+
+///////////////////////////////////////////// Non-spatial Strategy Hierarchy
+//!  Abstract class in the strategies hierarchy for computing attribute values based on other layers (Strategy Design Pattern). 
+
+
+//!  Abstract class in the strategies hierarchy for computing attribute values based on other layers (Strategy Design Pattern). 
+template<class Iterator>
+class TeComputeAttrStrategy  
+{
+protected:
+	TeComputeAttrStrategy () {};
+	TeProperty	defaultValue_;
+public:
+	TeProperty  defaultValue () {return defaultValue_;}
+	virtual  vector<TeProperty> compute (Iterator /*first*/, Iterator /*last*/, const string& /*columnName*/)
+		{
+			vector<TeProperty> result;
+			result.push_back (defaultValue_);
+			return result;
+		}
+	virtual ~TeComputeAttrStrategy(){}
+
+};
+
+
+
+template<class Iterator>
+class TeAverageStrategy: public TeComputeAttrStrategy<Iterator>  
+{
+public:
+
+	TeAverageStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+	virtual ~TeAverageStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+
+		double	tot_val = 0.0;
+		int		num = 0;
+
+		Iterator it = first;
+		while (it != last)
+		{
+			tot_val += (*it);
+			num++;
+			++it;
+		}
+
+		TeProperty  prop;
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		prop.attr_.rep_.numChar_ = 48;
+		if (num > 0)
+		{
+			double val = tot_val/num;
+			prop.value_ = Te2String (val);
+		}
+		else prop.value_ = this->defaultValue_.value_;
+
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+
+};
+
+
+template<class Iterator>
+class TeSumStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+public:
+
+	TeSumStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+	virtual ~TeSumStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{  
+		double	sum = 0.0;
+		Iterator it = first;
+		while (it != last)
+		{
+			sum += (*it);
+			++it;
+		}
+
+		TeProperty  prop;
+	
+
+		if (first == last) prop = this->defaultValue_;
+		else  prop.value_ = Te2String (sum);
+
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		prop.attr_.rep_.numChar_ = 48;
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+};
+
+
+template< class Iterator>
+class TeMinimumStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+public:
+
+	TeMinimumStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+	virtual ~TeMinimumStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+		double	min =  TeMAXFLOAT;
+		Iterator it = first;
+		while (it != last)
+		{
+			double val = (*it);
+			if (val < min) min = val;
+			++it;
+		}
+
+
+		TeProperty  prop;
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		prop.attr_.rep_.numChar_ = 48;
+
+		if (first == last)
+			prop.value_ = this->defaultValue_.value_; 
+		else  
+			prop.value_ = Te2String (min);
+
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+};
+
+
+
+template< class Iterator>
+class TeMaximumStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+public:
+
+	TeMaximumStrategy (double defaultValue = 0.0) {this->defaultValue_.value_ = Te2String (defaultValue);}
+	virtual ~TeMaximumStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+		double	max =  TeMINFLOAT;
+		Iterator it = first;
+		while (it != last)
+		{
+			double val = (*it);
+			if (val > max) max = val;
+			++it;
+		}
+
+
+		TeProperty  prop;
+		prop.attr_.rep_.name_ = columnName;
+		prop.attr_.rep_.type_ = TeREAL;
+		prop.attr_.rep_.numChar_ = 48;
+
+		if (first == last)
+			prop.value_ = this->defaultValue_.value_; 
+		else  
+			prop.value_ = Te2String (max);
+
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+};
+
+
+template<class Iterator>
+class TeCategoryPercentageStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+private:
+	map<string, string> classesMap_;
+
+
+public:
+	TeCategoryPercentageStrategy (map<string, string>& classes, double defaultValue = 0.0) 
+	{
+		this->defaultValue_.value_ = Te2String (defaultValue); 
+		classesMap_ = classes;
+	}
+	virtual ~TeCategoryPercentageStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+		TeProperty category;
+		int num = 0;
+
+		// initialize count
+		map<string, int>  count;
+		map<string, string>::iterator itMap = classesMap_.begin();
+		while (itMap != classesMap_.end())
+		{
+			count[(*itMap).second] = 0;
+			++itMap;
+		}
+
+		Iterator it = first;
+		while (it != last)
+		{
+			if (it.getProperty (category))
+			{
+				count[classesMap_[category.value_]]++;
+				num++;
+			}
+			++it;
+		}
+
+		TePropertyVector  result;
+		map <string, int>:: iterator count_it = count.begin();
+		while(count_it != count.end())  
+		{
+			TeProperty prop;
+			prop.attr_.rep_.name_ = columnName + (*count_it).first; // category
+			prop.attr_.rep_.type_ = TeREAL;
+			prop.attr_.rep_.numChar_ = 48;
+
+			double percent = 0.0;
+			string cat = (*count_it).first;
+			double value = (double)(*count_it).second;
+			if (num != 0) percent = value/num;
+			prop.value_    = Te2String (percent); // count
+			result.push_back (prop);
+			++count_it;
+		}
+		return result;
+	}
+
+};
+
+
+template<class Iterator>
+class TePresenceStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+public:
+	TePresenceStrategy (bool defaultValue = 0) 
+	{
+		this->defaultValue_.attr_.rep_.type_ = TeINT;
+		this->defaultValue_.value_ = Te2String (defaultValue); 
+		this->defaultValue_.attr_.rep_.numChar_ = 48;
+
+	}
+	virtual ~TePresenceStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+		TeProperty prop;
+		if (first != last) 
+			prop.value_ = "1";
+		else
+			prop = this->defaultValue_;
+
+		TePropertyVector  result;
+		prop.attr_.rep_.name_ = columnName; 
+		prop.attr_.rep_.type_ = TeINT;
+		prop.attr_.rep_.numChar_ = 48;
+		result.push_back (prop);
+		return result;
+	}
+
+};
+	
+template<class Iterator>
+class TeMajorityStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+public:
+	TeMajorityStrategy (TeAttrDataType defaultType = TeINT) 
+	{
+		this->defaultValue_.attr_.rep_.type_ = defaultType;
+		this->defaultValue_.value_ = "0"; 
+	}
+	virtual ~TeMajorityStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+		TeProperty category;
+		category.attr_.rep_.type_ = this->defaultValue_.attr_.rep_.type_;
+
+		map<string, int>  count;
+		Iterator it = first;
+		while (it != last)
+		{
+			if (it.getProperty (category))
+				count[category.value_]++;
+			++it;
+		}
+
+		TeProperty prop;
+		prop.attr_.rep_.type_ = category.attr_.rep_.type_;
+		prop.value_ = this->defaultValue_.value_;
+		prop.attr_.rep_.name_ = columnName; 
+		prop.attr_.rep_.numChar_ = 48;
+
+
+		int max = 0;
+		map <string, int>:: iterator count_it = count.begin();
+		while(count_it != count.end())  
+		{
+			if ((*count_it).second > max)
+			{
+				prop.value_ = (*count_it).first;
+				max = (*count_it).second;
+			}
+			++count_it;		
+		}
+		TePropertyVector  result;
+		result.push_back (prop);
+		return result;
+	}
+
+};
+	
+template<class Iterator>
+class TeMajorityCategoryStrategy: public TeComputeAttrStrategy<Iterator>   
+{
+	protected:
+			map<string, string> classesMap_;
+
+public:
+	TeMajorityCategoryStrategy (const map<string, string>& classesMap, TeAttrDataType defaultType = TeINT) 
+	{
+		this->defaultValue_.attr_.rep_.type_ = defaultType;
+		this->defaultValue_.value_ = "0"; 
+		classesMap_ = classesMap;
+	}
+	virtual ~TeMajorityCategoryStrategy() {}
+	virtual  vector<TeProperty> compute (Iterator first, Iterator last, const string& columnName)
+	{
+		TeProperty category;
+		category.attr_.rep_.type_ = this->defaultValue_.attr_.rep_.type_;
+
+
+			// initialize count
+		map<string, int>  count;
+		map<string, string>::iterator itMap = classesMap_.begin();
+		while (itMap != classesMap_.end())
+		{
+			count[(*itMap).second] = 0;
+			++itMap;
+		}
+
+		Iterator it = first;
+		while (it != last)
+		{
+			if (it.getProperty (category))
+			{
+				count[classesMap_[category.value_]]++;
+	
+			}
+			++it;
+		}
+
+
+
+	TePropertyVector  result;
+	TeProperty prop;
+	prop.attr_.rep_.type_ = TeSTRING;
+//	prop.value_ = defaultValue_.value_;
+	prop.attr_.rep_.name_ = columnName; 
+	prop.attr_.rep_.numChar_ = 48;
+
+	int max = 0;
+	map <string, int>:: iterator count_it = count.begin();
+	while(count_it != count.end())  
+	{
+		if ((*count_it).second > max)
+		{
+			prop.value_ = (*count_it).first;
+			max = (*count_it).second;
+		}
+		++count_it;		
+	}
+
+
+	result.push_back (prop);
+	return result;
+
+}
+};
+	
+///////////////////////////////////////////////////// Spatial Strategy Hierarchy
+
+		
+
+//!  Abstract class in the strategies hierarchy for computing attribute values based on other layers (Strategy Design Pattern). 
+
+class TeComputeAttrSpatialStrategy  
+{
+	protected:
+		TeComputeAttrSpatialStrategy () {}
+	public:
+		virtual ~TeComputeAttrSpatialStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* /* theme */, const string& /* attrName */, TeBox /* box */, const string& /* columnName */)
+		{
+			TePropertyVector result;
+			return result;
+		}
+
+};
+
+
+class TeCategoryAreaPercentageStrategy: public TeComputeAttrSpatialStrategy  
+{
+protected:
+			map<string, string> classesMap_;
+public:
+		TeCategoryAreaPercentageStrategy (const map<string, string>& classesMap) {classesMap_ = classesMap;};
+		virtual ~TeCategoryAreaPercentageStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+		
+};
+
+
+
+class TeAverageWeighbyAreaStrategy: public TeComputeAttrSpatialStrategy  
+{
+public:
+	TeAverageWeighbyAreaStrategy () {}
+	virtual ~TeAverageWeighbyAreaStrategy() {}
+	virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+class TeCategorySoilsAreaPercentageStrategy: public TeComputeAttrSpatialStrategy  
+{
+protected:
+			map<string, string> classesMap_;
+public:
+		TeCategorySoilsAreaPercentageStrategy (const map<string, string>& classesMap) {classesMap_ = classesMap;};
+		virtual ~TeCategorySoilsAreaPercentageStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);	
+		
+};
+
+
+class TeCategoryMajorityStrategy: public TeComputeAttrSpatialStrategy  
+{
+protected:
+			map<string, string> classesMap_;
+public:
+		TeCategoryMajorityStrategy (const map<string, string>& classesMap) {classesMap_ = classesMap;};
+		virtual ~TeCategoryMajorityStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);	
+		
+};
+
+
+
+
+
+
+class TeTotalAreaPercentageStrategy: public TeComputeAttrSpatialStrategy  
+{
+
+public:
+		TeTotalAreaPercentageStrategy () {}
+		virtual ~TeTotalAreaPercentageStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+
+class TeCountPolygonalObjectsStrategy: public TeComputeAttrSpatialStrategy  
+{
+
+public:
+		TeCountPolygonalObjectsStrategy () {}
+		virtual ~TeCountPolygonalObjectsStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+
+class TeCountLineObjectsStrategy: public TeComputeAttrSpatialStrategy  
+{
+
+public:
+		TeCountLineObjectsStrategy () {}
+		virtual ~TeCountLineObjectsStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+class TeCountPointObjectsStrategy: public TeComputeAttrSpatialStrategy  
+{
+
+public:
+		TeCountPointObjectsStrategy () {}
+		virtual ~TeCountPointObjectsStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+
+class TeLineLengthStrategy: public TeComputeAttrSpatialStrategy  
+{
+public:
+	TeLineLengthStrategy () {}
+		virtual ~TeLineLengthStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+class TeMinimumDistancePolygonsStrategy: public TeComputeAttrSpatialStrategy  
+{
+public:
+	TeMinimumDistancePolygonsStrategy () {}
+		virtual ~TeMinimumDistancePolygonsStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+class TeMinimumDistanceLinesStrategy: public TeComputeAttrSpatialStrategy  
+{
+public:
+	TeMinimumDistanceLinesStrategy () {}
+		virtual ~TeMinimumDistanceLinesStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+class TeMinimumDistancePointsStrategy: public TeComputeAttrSpatialStrategy  
+{
+public:
+	TeMinimumDistancePointsStrategy () {}
+		virtual ~TeMinimumDistancePointsStrategy() {}
+		virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+class TeSumWeighByAreaStrategy: public TeComputeAttrSpatialStrategy  
+{
+public:
+	TeSumWeighByAreaStrategy () {}
+	virtual ~TeSumWeighByAreaStrategy() {}
+	virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+
+
+class TeSumWeighByRestrictedAreaStrategy: public TeComputeAttrSpatialStrategy  
+{
+private:
+		TeRaster* raster_;
+		map<int, int> classesSelection_;
+		int		band_;
+public:
+	TeSumWeighByRestrictedAreaStrategy (TeRaster* raster, map<int, int> classesSelection, int band = 0){
+		raster_ = raster; 
+		classesSelection_ = classesSelection;
+		band_ = band;}
+	virtual ~TeSumWeighByRestrictedAreaStrategy() {}
+	virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+
+class TeAverageWeighByRestrictedAreaStrategy: public TeComputeAttrSpatialStrategy  
+{
+private:
+		TeRaster* raster_;
+		map<int, int> classesSelection_;
+		int		band_;
+public:
+	TeAverageWeighByRestrictedAreaStrategy (TeRaster* raster, map<int, int> classesSelection, int band = 0){
+		raster_ = raster; 
+		classesSelection_ = classesSelection;
+		band_ = band;}
+	virtual ~TeAverageWeighByRestrictedAreaStrategy() {}
+	virtual  TePropertyVector compute (TeTheme* theme, const string& attrName, TeBox box, const string& columnName);
+};
+
+#endif
diff --git a/src/terralib/kernel/TeConsoleErrorMessage.cpp b/src/terralib/kernel/TeConsoleErrorMessage.cpp
new file mode 100644
index 0000000..451cc51
--- /dev/null
+++ b/src/terralib/kernel/TeConsoleErrorMessage.cpp
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include <iostream>
+#include "TeErrorMessage.h"
+
+using namespace std;
+
+class TeConsoleErrorMessage: public TeErrorMessage
+{
+public:
+   
+	TeConsoleErrorMessage(){}
+	~TeConsoleErrorMessage(){}
+	virtual TeMessageReturn apply ( 
+				  const string& appName, 
+				  const string & msgText, 
+				  TeMessageType	/* msgType */,
+				  TeMessageIcon /* iconType */ )
+	{ cout << appName << msgText; return Te_IDOK; }
+
+
+
+};
+
+
+class TeConsoleErrorMessagePrototype: public TeErrorMessagePrototype
+{
+	virtual TeErrorMessage* build()
+	{ return new TeConsoleErrorMessage(); }
+
+}consoleInstance;
diff --git a/src/terralib/kernel/TeConsoleErrorMessage.h b/src/terralib/kernel/TeConsoleErrorMessage.h
new file mode 100644
index 0000000..ab4ed38
--- /dev/null
+++ b/src/terralib/kernel/TeConsoleErrorMessage.h
@@ -0,0 +1,69 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeConsoleErrorMessage.h
+    This file deals with the display of error messages in a console
+*/
+#ifndef TeConsoleErrorMessage_H
+#define TeConsoleErrorMessage_H
+
+#include <iostream>
+#include "TeErrorMessage.h"
+
+using namespace std;
+
+//! A class to handle the display of error messages in a console
+class TeConsoleErrorMessage: public TeErrorMessage
+{
+public:
+   
+	//! Constructor
+	TeConsoleErrorMessage()
+	{}
+
+	//! Destructor
+	~TeConsoleErrorMessage()
+	{}
+
+	//! Display the message
+	virtual TeMessageReturn apply ( 
+				  const string& appName, 
+				  const string & msgText, 
+				  TeMessageType	msgType,
+				  TeMessageIcon iconType )
+	{ cout << appName << msgText; return Te_IDOK; }
+
+};
+
+//! A prototype of a Console Error Message handler
+class TeConsoleErrorMessagePrototype: public TeErrorMessagePrototype
+{
+	virtual TeErrorMessage* build()
+	{ return new TeConsoleErrorMessage(); }
+
+};
+
+//! A single instance of the console error message handler
+static TeConsoleErrorMessagePrototype consoleInstance;
+#endif
+
diff --git a/src/terralib/kernel/TeCoord2D.h b/src/terralib/kernel/TeCoord2D.h
new file mode 100644
index 0000000..763784d
--- /dev/null
+++ b/src/terralib/kernel/TeCoord2D.h
@@ -0,0 +1,148 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeCoord2D.h
+    This file contains the definition of a classes to handle 2D coordinates
+*/
+#ifndef  __TERRALIB_INTERNAL_COORD2D_H
+#define  __TERRALIB_INTERNAL_COORD2D_H
+
+#include <math.h>
+#include "TeDefines.h"
+#include "TePrecision.h"
+
+#include <vector>
+
+using namespace std;
+
+//! A class for handling 2D coordinates
+class TeCoord2D
+{
+public:
+
+	double	x_;		//!< x coordinate
+	double	y_;		//!< y coordinate
+
+//! Default contructor
+	TeCoord2D ( const double& x = 0., const double& y = 0. ):
+		x_ ( x ), y_ ( y ) {}
+
+//! Copy constructor
+	TeCoord2D (const TeCoord2D& cd) 			
+		{x_ = cd.x_; y_ = cd.y_;}
+
+//! Operator =
+	TeCoord2D& operator= ( const TeCoord2D& cd )
+	{
+		if ( this != &cd )
+		{	
+			x_ = cd.x_; y_ = cd.y_;
+		}
+		return *this;
+	}
+		
+//!	Empty destructor.
+	~TeCoord2D () { }
+
+//!	Returns the X componente of the coordinate
+	double	x () const 				
+	{	return x_;	}
+
+//!	Sets the X componente of the coordinate
+	void x ( const double& valX )
+	{	x_ = valX; }
+
+//!	Returns the Y componente of the coordinate
+	double 	y () const 				
+	{	return y_;	}
+
+//!	Sets the Y componente of the coordinate
+	void y(const double& valY)
+	{	y_ = valY; }
+
+//!	Sets the X and Y componentes of the coordinate
+	void setXY(const double& xVal, const double& yVal )
+	{	x_= xVal; y_= yVal; }
+
+//!	Adds two coordinates
+	void 	operator+=(const TeCoord2D& cd)	{x_ += cd.x_; y_ += cd.y_;}
+
+//!	Returns TRUE if current coordinate is smaller than or equal	to TeCoord2D cd; returns FALSE otherwise 
+	bool  operator<= (const TeCoord2D& cd) const 
+		{return (( y_ - cd.y_ <= TePrecision::instance().precision() ) && 
+		         ( x_ - cd.x_ <= TePrecision::instance().precision() ) );}	
+
+//!	Returns TRUE if current coordinate is equal	to TeCoord2D cd; returns FALSE otherwise 
+	bool operator== (const TeCoord2D& cd) const 
+	{return (  ( fabs (y_ - cd.y_) < TePrecision::instance().precision() ) 
+			&& ( fabs (x_ - cd.x_) < TePrecision::instance().precision() ) ); }
+
+//!	Returns TRUE if current coordinate is not equal to TeCoord2D cd; returns FALSE otherwise 
+	bool	operator!= (const TeCoord2D& cd) const 
+		{return ( ( fabs (y_ - cd.y_) >= TePrecision::instance().precision() ) 
+		       || ( fabs (x_ - cd.x_) >= TePrecision::instance().precision() ) );}	
+
+//!	Returns TRUE if current coordinate is smaller than TeCoord2D cd; returns FALSE otherwise 
+	bool	operator< (const TeCoord2D& cd) const 
+		{return ( y_ - cd.y_ < TePrecision::instance().precision() 
+		       && x_ - cd.x_ < TePrecision::instance().precision() );}	
+
+//!	Returns TRUE if current coordinate greater than maximum allowed; returns FALSE otherwise 
+	bool	tooBig ()
+		{return ( y_ > TeMAXFLOAT/10.|| x_ > TeMAXFLOAT/10.);}	
+
+//!	Rescales the coordinate by a value in X (xscale) and in Y (yscale)
+	void	scale ( const double xscale, const double yscale )
+	{ x_ = x_* xscale; y_ = y_ * yscale; }
+
+
+//!	Returns the middle coordinate in horizontal direction between current coordinate and rhs
+	TeCoord2D halfWayHoriz ( TeCoord2D& rhs )
+	{
+		TeCoord2D mid (( rhs.x() + x() ) / 2., y() );
+		return mid;
+	}
+
+//!	Returns the middle coordinate in vertical direction between current coordinate and rhs
+	TeCoord2D halfWayVert  ( TeCoord2D& rhs )
+	{
+		TeCoord2D mid ( x(), ( y() + rhs.y() ) / 2. );
+		return mid;
+	}
+
+	void objectId(const string& /* id */ ) 
+	{	return;  }
+};
+
+//! An structure that contains a pair of coordinates
+struct TeCoordPair
+{
+	TeCoord2D pt1;
+	TeCoord2D pt2;
+};
+
+//! A vector of pairs of coordinates
+typedef vector<TeCoordPair> TeCoordPairVect;
+
+#endif
+
diff --git a/src/terralib/kernel/TeCounted.h b/src/terralib/kernel/TeCounted.h
new file mode 100644
index 0000000..af9cf18
--- /dev/null
+++ b/src/terralib/kernel/TeCounted.h
@@ -0,0 +1,74 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeCounted.h
+    This file contains classes to support the counted object idiom
+*/
+#ifndef  __TERRALIB_INTERNAL_COUNTED_H
+#define  __TERRALIB_INTERNAL_COUNTED_H
+
+//! Supports the counted object idiom
+/*! 
+	A counted class keeps track of how many abstract instances are pointing
+	to the same implementation.
+*/
+class TeCounted {
+public:
+
+// -- Contructors
+
+	//! Constructor: sets zero references when the object is  built
+	TeCounted(): refCount_ ( 0 ){}
+	
+// -- Methods
+
+	//! Increases the number of references to this object
+	void attach ()
+		{ refCount_++; }
+
+	//! Decreases the number of references to this object. Destroy it if there are no more references to it
+	void detach ()
+		{ if ( --refCount_ == 0 )
+			delete this; }
+
+	//! Returns the number of references to this object
+	int refCount()
+	{ return refCount_; }
+
+	//! Destructor
+	virtual ~TeCounted(){}
+
+private:
+
+	//! No copy allowed
+	TeCounted(const TeCounted&);
+
+	//! No copy allowed
+	TeCounted& operator=(const TeCounted&){return *this;}
+
+// -- Members
+	int refCount_; 	//!< the number of references to this class
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeDataTypes.h b/src/terralib/kernel/TeDataTypes.h
new file mode 100644
index 0000000..7927cc5
--- /dev/null
+++ b/src/terralib/kernel/TeDataTypes.h
@@ -0,0 +1,172 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeDataTypes.h
+    This file contains enumerators and data types used by TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_DATATYPE_H
+#define  __TERRALIB_INTERNAL_DATATYPE_H
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include <vector>
+#include <string>
+#include <map> 
+
+using namespace std;
+
+//! SPRING�s data model entities
+enum TeSpringModels
+{   TeSPRCadastral=0, TeSPRNetwork=1, TeSPRThematic=2, TeSPRMNT=3 };
+
+
+//!  Types for Attributes (stored in object-relational databases)
+enum TeAttrDataType 
+{TeSTRING, TeREAL, TeINT, TeDATETIME, TeBLOB, TeOBJECT, TeCHARACTER, TeUNKNOWN};
+
+
+//! Geometrical representations 
+/*! Uses a binary ennumeration since the same layer 
+    may contain more than one geometrical representation
+*/
+enum TeGeomRep 
+{	TePOLYGONS = 1, TeLINES = 2, TePOINTS = 4, TeSAMPLES = 8, TeCONTOURS = 16,
+	TeARCS = 32, TeNODES = 64  , TeTEXT = 128, TeCELLS = 256 , TeRASTER = 512,
+	TeRASTERFILE = 1024, TeGEOMETRYNONE = 2048 };
+
+//! Chart types
+enum TeChartType
+{   TeBarChart, TePieChart };
+
+//! Objects that will be grouped or used in a chart
+enum TeSelectedObjects
+{   TeAll, TeSelectedByPointing, TeNotSelectedByPointing, TeSelectedByQuery, TeNotSelectedByQuery, TeGrouped, TeNotGrouped };
+
+//! Modes of object selection
+enum TeObjectSelectionMode
+{   TeDefaultSelection, TePointingSelection, TeQuerySelection, TePointingAndQuerySelection };
+
+//! Modes of grouping objects
+enum TeGroupingMode
+{   TeEqualSteps, TeQuantil, TeStdDeviation, TeUniqueValue, TeRasterSlicing };
+
+//! Direction of use in a ramp color
+enum TeColorDirection
+{	TeColorAscSatEnd, TeColorDescSatEnd, TeColorAscSatBegin, TeColorDescSatBegin };
+
+//! Types of attribute tables in a layer
+enum TeAttrTableType
+{	TeAllAttrTypes, TeAttrStatic, TeAttrMedia, TeAttrExternal, TeAttrEvent, TeFixedGeomDynAttr, 
+	TeDynGeomDynAttr, TeGeomAttrLinkTime, TeGeocodingData };
+
+//! Types of integrity relations among tables in a database
+enum TeDBRelationType
+{	TeNoRelation, TeRINoCascadeDeletion, TeRICascadeDeletion };
+
+//! Data types
+enum TeDataType 
+{	TeBIT, TeUNSIGNEDCHAR, TeCHAR, TeUNSIGNEDSHORT, TeSHORT, TeINTEGER, TeUNSIGNEDLONG, TeLONG, TeFLOAT, TeDOUBLE };
+
+//! Compression modes to store raster data in a TerraLib database 
+enum TeCompressionMode
+{	TeNoCompression, TeZLib, TeJPEG, TeTIFFCOMPRESSION };
+
+//! Tiling type modes to store raster data in a TerraLib database 
+enum TeRasterTilingType
+{	 TeExpansible=1, TeNoExpansible=2 };
+
+
+//!	Statistics
+/*!
+	 - TeSUM				sum of the values
+	 - TeMAXVALUE			maximum value
+	 - TeMINVALUE			minimal value
+	 - TeCOUNT				total number of the values
+	 - TeVALIDCOUNT			valid number of the values
+	 - TeSTANDARDDEVIATION	standard deviation 
+	 - TeKERNEL				kernel
+	 - TeMEAN				mean
+	 - TeVARIANCE			variance
+	 - TeSKEWNESS			third moment about the Mean 			
+	 - TeKURTOSIS			forth moment about the Mean
+	 - TeAMPLITUDE			maximum value minus minimal value
+	 - TeMEDIAN				median value
+	 - TeVARCOEFF			coefficient of variation 
+	 - TeMODE				value more frequent 
+*/ 
+enum TeStatisticType
+{	TeNOSTATISTIC, TeSUM, TeMAXVALUE, TeMINVALUE, TeCOUNT, TeVALIDCOUNT, TeSTANDARDDEVIATION, TeKERNEL,  
+	TeMEAN, TeVARIANCE, TeSKEWNESS, TeKURTOSIS, TeAMPLITUDE, TeMEDIAN, TeVARCOEFF, TeMODE};
+
+//! A map of an statistic to its value
+typedef map<TeStatisticType, double> TeStatisticValMap;
+
+//! A map of an statistic to its string value
+typedef map<TeStatisticType, string> TeStatisticStringValMap;
+
+//! A map of an object id to its statistics
+typedef map<string, TeStatisticValMap> TeObjStatisticsMap;
+
+//! A map of an statistic to the column name where its value is stored
+typedef map<TeStatisticType, string> TeStatisticsMap;
+
+//! Intersection Algorithms.
+enum TeIntersectorAlgorithm { TeBentleyOttman, TeRedBlue, TeTrivial };
+
+//! Topological relations
+enum TeSpatialRelation	
+{	TeDISJOINT = 1, TeTOUCHES = 2, TeCROSSES = 4, TeWITHIN = 8, 
+	TeOVERLAPS = 16, TeCONTAINS = 32, TeINTERSECTS = 64, TeEQUALS = 128, TeCOVERS = 256,
+	TeCOVEREDBY = 512, TeUNDEFINEDREL = 1024};
+
+//! Temporal predicates
+enum TeTemporalRelation { TeTIMEUNDEFINED, TeTIMEEQUAL, TeTIMEBEFORE, TeTIMEAFTER, TeTIMEMEETS, TeTIMEDURING, TeTIMEOVERLAPS, TeTIMEENDS, TeTIMESTARTS };
+
+//! Logical predicates
+enum TeLogicalOperator { TeAND = 1, TeOR = 2 };
+
+//! Time chronons
+enum TeChronon {	TeNOCHRONON, TeSECOND, TeMINUTE, TeHOUR, TeDAY, TeMONTH, TeYEAR,
+					TeDAYOFWEEK, TeDAYOFMONTH, TeDAYOFYEAR, TeMONTHOFYEAR, TeSEASON, TeWEEKOFYEAR, 
+					TeHOUROFDAY, TeMINUTEOFHOUR, TeSECONDOFMINUTE };
+
+//! Polygon style types
+enum TePolyBasicType { TePolyTypeTransparent=0, TePolyTypeFill=1, TePolyTypeHorizontal=2,
+					 TePolyTypeVertical=3, TePolyTypeFDiagonal=4, TePolyTypeBDiagonal=5,
+					 TePolyTypeCross=6, TePolyTypeDiagonalCross=7 };
+//! Line style types
+enum TeLnBasicType { TeLnTypeContinuous=0, TeLnTypeDashed=1, TeLnTypeDotted=2,  
+					 TeLnTypeDashDot=3, TeLnTypeDashDotDot=4, TeLnTypeNone=5 };
+//! Point style types
+enum TePtBasicType { TePtTypePlus=0, TePtTypeStar=1, TePtTypeCircle=2, TePtTypeX=3,  
+					 TePtTypeBox=4, TePtTypeDiamond=5, TePtTypeHollowCircle=6, 
+					 TePtTypeHollowBox=7, TePtTypeHollowDiamond=8 };
+
+//! Type of segment intersection
+enum TeSegmentIntersectionType { TeProperIntersection, TeImproperIntersection };
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeDatabase.cpp b/src/terralib/kernel/TeDatabase.cpp
new file mode 100644
index 0000000..7721c39
--- /dev/null
+++ b/src/terralib/kernel/TeDatabase.cpp
@@ -0,0 +1,6504 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderDatabase.h"
+#include "TeRasterRemap.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeSpatialOperations.h"
+#include "TeImportRaster.h"
+#include "TeDatabase.h"
+
+#include <stdio.h>
+
+typedef map<int,TeNode> TeNodeMap;
+
+static const int scales [] =
+{	150000,
+	80000,
+	40000,
+	20000,
+	10000,
+	3000,
+	1500,
+	800,
+	400,
+	200,
+	100,
+	30,
+	15,
+	8,
+	4,
+	2,
+	1
+};
+
+//-*********************
+
+TeDatabase::TeDatabase() :
+	isConnected_ (false),
+	host_(""),
+	user_(""),
+	password_(""),
+	database_(""),
+	portNumber_(0),
+	errorNumber_(0),
+	errorMessage_("")
+{
+}
+
+
+TeDatabase::~TeDatabase()
+{
+}
+
+bool TeDatabase::validTable (TeTable& table)
+{
+	int cont=0;
+	bool change = false;
+	bool changeTable = false;
+	bool uniqueName, linkName; 
+	
+	TeAttributeList::iterator it = table.attributeList().begin();
+	TeAttributeList::iterator it2;  
+	while(it != table.attributeList().end())
+	{
+		uniqueName = false;
+		linkName = false;
+
+		if((*it).rep_.name_==table.uniqueName())
+			uniqueName=true;
+		
+		if((*it).rep_.name_==table.linkName())
+			linkName=true;
+
+		string errorMess;
+		string temp = TeCheckName((*it).rep_.name_, change, errorMess);
+		
+		if(change)
+		{
+			it2 = table.attributeList().begin();
+			while(it2!=table.attributeList().end())
+			{
+				if(temp==(*it2).rep_.name_)
+				{
+					temp += Te2String(cont);
+					it2 = table.attributeList().begin();
+					++cont;
+				}
+				else
+					++it2;
+			}
+
+			changeTable = true;
+		}
+
+		if(change && uniqueName)
+			table.setUniqueName(temp);
+		if(change && linkName)
+			table.setLinkName (temp);
+
+		(*it).rep_.name_ = temp;
+		++it;
+		++cont;
+	}
+	
+	return changeTable;
+}
+
+string TeDatabase::getTableName(int tableId)
+{
+	string tableName;
+
+	TeDatabasePortal* pt = getPortal();
+	string q = "SELECT attr_table FROM te_layer_table";
+	q += " WHERE table_id = " + Te2String(tableId);
+	if (pt->query(q) == true && pt->fetchRow())
+		tableName = pt->getData("attr_table");
+	delete pt;
+	return tableName;
+}
+
+bool TeDatabase::createTable(const string& table, TeAttributeList &attr)
+{
+	string	q ="CREATE TABLE " + table +" (";
+	string	type;
+	char	size[8];
+	bool	first=true;
+
+	string pkeys;
+
+	TeAttributeList::iterator it;
+	it = attr.begin();
+	while ( it != attr.end() )
+	{
+		string name = (*it).rep_.name_;
+		
+		switch ((*it).rep_.type_)
+		{
+			case TeSTRING:
+				type = "VARCHAR ";
+				sprintf (size,"(%d)",(*it).rep_.numChar_);
+				type += string (size);
+				break;
+			case TeREAL:
+				type = "DOUBLE";
+				sprintf (size,"(%d,%d)",(*it).rep_.numChar_, (*it).rep_.decimals_);
+				type += string (size);
+				break;
+			case TeINT:
+				type = "INT ";
+				break;
+			case TeCHARACTER:
+				type = "CHAR ";
+				break;
+			case TeDATETIME:
+				type = "DATETIME ";  //time
+				break;
+			case TeBLOB:
+				type = "BLOB ";
+				break;
+			default:
+				type = "VARCHAR ";
+				sprintf (size,"(%d)",(*it).rep_.numChar_);
+				type += string (size);
+				break;
+		}
+
+		if((*it).rep_.isAutoNumber_ && (*it).rep_.isPrimaryKey_)
+			type += " AUTO_INCREMENT ";
+				
+		if (!first)
+			q += ",";
+		else
+			first = false;
+		
+		q += name + " " + type;
+
+		// check if column is part of primary key
+		if ( (*it).rep_.isPrimaryKey_ && (*it).rep_.type_ != TeBLOB )
+		{
+			if (!pkeys.empty())
+				pkeys += ", ";
+			pkeys += (*it).rep_.name_;
+			q += " NOT NULL ";
+		}
+		
+		++it;
+	}
+
+	if (!pkeys.empty())
+		q += ", PRIMARY KEY (" + pkeys + ") ";
+	q += ")";
+
+	return execute(q);
+}
+
+bool
+TeDatabase::deleteTable (const string& table)
+{
+	int f =	table.find ("te_collection", std::string::npos);
+
+	if( table=="te_theme" ||
+		table=="te_layer" ||
+		table=="te_representation" ||
+		table=="te_tables_relation" ||
+		table=="te_layer_table" ||
+		table=="te_raster_metadata" ||
+		table=="te_projection" ||
+		table=="te_view" ||
+		table=="te_legend" ||
+		table=="te_visual" ||
+		table=="te_database" ||
+		f == 0)
+	{
+		errorMessage_ = "N�o � poss�vel deletar tabelas do modelo!";
+		return false;
+	}
+
+	string del = "DROP TABLE " + table;
+	if(!execute(del))
+		return false;
+
+	return true;
+}
+
+
+bool 
+TeDatabase::deleteColumn (const string& table, const string& colName)
+{
+	if (!tableExist(table))
+		return false;
+	TeAttribute attr;
+	if (!columnExist(table,colName,attr))
+		return true;
+	string drop = "ALTER  TABLE " + table + " DROP COLUMN " + colName;
+	if(execute(drop) == false)
+		return false;
+
+	string tableId;
+	TeDatabasePortal* portal = getPortal();
+	string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + table + "'";
+	if(portal->query(sql) && portal->fetchRow())
+		tableId = portal->getData(0);
+
+	delete portal;
+	if(tableId.empty() == false)
+	{
+		// delete relation
+		sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
+		sql += " AND related_attr = '" + colName + "')";
+		sql += " OR (external_table_name = '" + table + "'";
+		sql += " AND external_attr = '" + colName + "')";
+		if(execute(sql) == false)
+			return false;
+
+		// delete grouping
+		TeDatabasePortal* portal = getPortal();
+		sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + table + "." + colName + "'";
+		if(portal->query(sql) && portal->fetchRow())
+		{
+			string themeId = portal->getData(0);
+
+			sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
+			if(execute(sql) == false)
+			{
+				delete portal;
+				return false;
+			}
+		}
+		delete portal;
+
+		sql = "DELETE FROM te_grouping";
+		sql += " WHERE grouping_attr = '" + table + "." + colName + "'";
+		if(execute(sql) == false)
+			return false;
+	}
+	return true;
+}
+
+
+bool 
+TeDatabase::defineIntegrity(void)
+{
+	if (existRelation("te_layer","fk_layer_proj_id") == TeNoRelation )
+		if (!createRelation("fk_layer_proj_id", "te_layer", "projection_id", "te_projection", "projection_id", false))
+			return false;
+        
+	if (existRelation("te_representation","fk_rep_layer_id") == TeNoRelation )
+		if (!createRelation("fk_rep_layer_id", "te_representation", "layer_id", "te_layer", "layer_id", true))
+			return false;
+
+	if (existRelation("te_view","fk_view_proj_id") == TeNoRelation )
+		if (!createRelation("fk_view_proj_id", "te_view", "projection_id", "te_projection", "projection_id", false))
+			return false;
+
+	if (existRelation("te_theme","fk_theme_layer_id") == TeNoRelation )
+		if (!createRelation("fk_theme_layer_id", "te_theme", "layer_id", "te_layer", "layer_id", true))
+			return false;
+
+	if (existRelation("te_theme","fk_theme_view_id") == TeNoRelation )
+		if (!createRelation("fk_theme_view_id", "te_theme", "view_id", "te_view", "view_id", true))
+			return false;
+
+	if (existRelation("te_theme_table","fk_thmtable_theme_id") == TeNoRelation )
+		if (!createRelation("fk_thmtable_theme_id", "te_theme_table", "theme_id", "te_theme", "theme_id", true))
+			return false;
+
+	if (existRelation("te_theme_table","fk_thmtable_lytable_id") == TeNoRelation )
+		if (!createRelation("fk_thmtable_lytable_id", "te_theme_table", "table_id", "te_layer_table", "table_id", true))
+			return false;
+
+	if (existRelation("te_theme_table","fk_thmtable_relation_id") == TeNoRelation )
+		if (!createRelation("fk_thmtable_relation_id", "te_theme_table", "relation_id", "te_tables_relation", "relation_id", true))
+			return false;
+
+	if (existRelation("te_grouping","fk_group_theme_id") == TeNoRelation )
+		if (!createRelation("fk_group_theme_id", "te_grouping", "theme_id", "te_theme", "theme_id", true))
+			return false;
+
+	if (existRelation("te_legend","fk_legend_theme_id") == TeNoRelation )
+		if (!createRelation("fk_legend_theme_id", "te_legend", "theme_id", "te_theme", "theme_id", true))
+			return false;
+
+	if (existRelation("te_visual","fk_visual_legend_id") == TeNoRelation )
+		if (!createRelation("fk_visual_legend_id", "te_visual", "legend_id", "te_legend", "legend_id", true))
+			return false;
+        
+	if (existRelation("te_layer_table","fk_laytable_layer_id") == TeNoRelation )
+		if (!createRelation ("fk_laytable_layer_id", "te_layer_table", "layer_id", "te_layer", "layer_id", true))
+			return false;
+        
+	if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") == TeNoRelation )
+		if (!createRelation("fk_tabrelation_laytable_id", "te_tables_relation", "related_table_id", "te_layer_table", "table_id", true))
+			return false;
+
+	if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
+		if (!createRelation("fk_visrast_theme_id", "te_visual_raster", "theme_id", "te_theme", "theme_id", true))
+			return false;
+
+	return true;
+}
+
+bool 
+TeDatabase::createConceptualModel(bool withIntegrity, bool newDatabase, bool /* createIndex */)
+{
+	bool status = true;
+	bool createMainTables = false;
+	
+	if (!this->tableExist("te_projection"))
+	{
+		status = this->createProjectionTable();
+		if (!status)
+			return false;	
+		createMainTables = true;
+	}
+
+	if (!this->tableExist("te_layer"))
+	{
+		status = this->createLayerTable();
+		if (!status)
+			return false;
+		createMainTables = true;
+	}
+
+	if (!this->tableExist("te_layer_table"))
+	{
+		status = this->createLayerTableTable();
+		if (!status)
+			return false;
+		createMainTables = true;
+	}
+
+	if (!this->tableExist("te_tables_relation"))
+	{
+		status = this->createTablesRelationTable();
+		if (!status)
+			return false;
+	}
+	
+	if (!this->tableExist("te_representation"))
+	{
+		status = this->createRepresentationTable();
+		if (!status)
+			return false;
+		createMainTables = true;
+	}
+
+	if (!this->tableExist("te_view"))
+	{
+		status = this->createViewTable();
+		if (!status)
+			return false;
+		createMainTables = true;
+	}
+
+	if (!this->tableExist("te_theme"))
+	{
+		status = this->createThemeTable();
+		if (!status)
+			return false;
+	}
+
+	if (!this->tableExist("te_grouping"))
+	{
+		status = this->createGroupingTable();
+		if (!status)
+			return false;
+	}
+
+	if (!this->tableExist("te_theme_table"))
+	{
+		status = this->createThemeTablesTable();
+		if (!status)
+			return false;
+	}
+
+	if (!this->tableExist("te_legend"))
+	{
+		status = this->createLegendTable();
+		if (!status)
+			return false;	
+	}
+
+	if (!this->tableExist("te_visual"))
+	{
+		status = this->createVisualTable();
+		if (!status)
+			return false;	
+	}
+
+	if (!this->tableExist("te_visual_raster"))
+	{
+		status = this->createVisualRasterTable();
+		if (!status)
+			return false;	
+	}
+
+	if (!this->tableExist("te_database"))
+	{
+		status = this->createDatabaseTable();
+		if (!status)
+			return false;
+	}
+
+	if(newDatabase || createMainTables)
+	{
+		string ins = "INSERT INTO te_database (db_version) VALUES ('3.0.2')";
+		if (!execute(ins))
+			return false;
+	}
+
+	if (withIntegrity)
+		status = defineIntegrity();
+
+	return status;
+}
+
+bool
+TeDatabase::createIndex(const string& tableName, const string& indexName, const string& columnsName)
+{
+	string sql = "CREATE INDEX " + indexName + " ON " + tableName + "(" + columnsName + ")";	
+	return execute (sql);
+}
+
+bool 
+TeDatabase::createDatabaseTable()
+{
+	string create = "CREATE TABLE te_database (";
+	create += "db_version		VARCHAR(50) NOT NULL,";
+	create += "db_creation		DATETIME,";
+	create += "PRIMARY KEY (db_version))";
+	return execute (create);
+}
+
+
+bool 
+TeDatabase::createProjectionTable ()
+{
+	string create = "CREATE TABLE te_projection (";
+	create += "projection_id	INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += "name				VARCHAR(50) NOT NULL,";
+	create += "long0			DOUBLE(24,15) DEFAULT '0.0',";
+	create += "lat0				DOUBLE(24,15) DEFAULT '0.0',";
+	create += "offx				DOUBLE(24,15) DEFAULT '0.0',";
+	create += "offy				DOUBLE(24,15) DEFAULT '0.0',";
+	create += "stlat1			DOUBLE(24,15) DEFAULT '0.0',";
+	create += "stlat2			DOUBLE(24,15) DEFAULT '0.0',";
+	create += "unit				VARCHAR(50) NOT NULL,";
+	create += "scale			DOUBLE(24,15) DEFAULT '0.0',";
+	create += "hemis			INT(4) NOT NULL,";
+	create += "datum			VARCHAR(50) NOT NULL,";
+	create += "radius			DOUBLE(24,15) DEFAULT '0.0',";
+	create += "flattening		DOUBLE(24,15) DEFAULT '0.0',";
+	create += "dx				DOUBLE(24,15) DEFAULT '0.0',";
+	create += "dy				DOUBLE(24,15) DEFAULT '0.0',";
+	create += "dz				DOUBLE(24,15) DEFAULT '0.0',";
+	create += "PRIMARY KEY (projection_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createLayerTable ()
+{
+	string create = "CREATE TABLE te_layer (";
+	create += "layer_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += "projection_id	INT(10) UNSIGNED NOT NULL,";
+	create += "name				VARCHAR(255) NOT NULL,";
+	create += "lower_x			DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+	create += "lower_y			DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+	create += "upper_x			DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+	create += "upper_y			DOUBLE(24,15) DEFAULT '0.0' NOT NULL,";
+	create += "initial_time		DATETIME,";
+	create += "final_time		DATETIME, ";
+	create += "PRIMARY KEY (layer_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createLayerTableTable()
+{
+	string create = "CREATE TABLE te_layer_table (";
+	create += "table_id				INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += "layer_id				INT(10) UNSIGNED,";
+	create += "attr_table			VARCHAR(255) NOT NULL,";
+	create += "unique_id			VARCHAR(255), ";
+	create += "attr_link			VARCHAR(255), ";
+	create += "attr_initial_time	VARCHAR(255), ";
+	create += "attr_final_time		VARCHAR(255), ";
+	create += "attr_time_unit		INT(4) UNSIGNED, ";
+	create += "attr_table_type		INT(4) UNSIGNED, ";
+	create += "user_name			VARCHAR(255),";
+	create += "initial_time			DATETIME,";
+	create += "final_time			DATETIME, ";
+	create += "PRIMARY KEY (table_id))";
+	return execute (create);
+}
+
+bool 
+TeDatabase::updateTableInfo(int layerId, TeTable &table, const string user)
+{
+	if (table.id() <= 0 )  // table information doesn�t exist in database yet
+		return this->insertTableInfo(layerId,table,user);
+	string sql;
+	sql = "UPDATE te_layer_table SET ";
+	sql += "unique_id='" + table.uniqueName() + "', ";
+	sql += "attr_link='" + table.linkName() + "', ";
+	sql += "attr_initial_time='" + table.attInitialTime() + "', ";
+	sql += "attr_final_time='" + table.attFinalTime() + "', ";
+	sql += "attr_time_unit=" + Te2String(table.attTimeUnit()) + ", ";
+	sql += "attr_table_type="+ Te2String(table.tableType()) + ", ";
+	sql += "user_name='" + user + "' WHERE ";
+	sql += "layer_id=" + Te2String(layerId) + " AND ";
+	sql += "attr_table_name='" + table.name() + "'";
+	return execute (sql);
+}
+
+bool 
+TeDatabase::loadTableInfo(TeTable& table)
+{
+	if (table.name().empty())
+		return false;
+
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+	{
+		this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+		return false;
+	}
+	
+	string get =  "SELECT * FROM te_layer_table WHERE attr_table = '" + table.name() + "'";
+	if (!portal->query(get) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	table.setId(portal->getInt("table_id"));
+	table.setLinkName(portal->getData("attr_link"));
+	table.setUniqueName(portal->getData("unique_id"));
+	table.setTableType(TeAttrTableType(portal->getInt("attr_table_type")));
+	TeAttributeList attrList;
+	getAttributeList(table.name(), attrList);
+	table.setAttributeList(attrList);
+	table.attInitialTime(portal->getData("attr_initial_time"));
+	table.attFinalTime(portal->getData("attr_final_time"));
+	table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+	delete portal;
+	return true;
+}
+
+
+bool TeDatabase::createLUTTable(const string& name)
+{
+	string create = "CREATE TABLE " + name + "(";
+	create += "index_id		INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += "r_val		INT(10) UNSIGNED NOT NULL,";
+	create += "g_val		INT(10) NOT NULL,";
+	create += "b_val		INT(10) NOT NULL,";
+	create += "PRIMARY KEY (index_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createTablesRelationTable()
+{
+	string create = "CREATE TABLE te_tables_relation (";
+	create += "relation_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += "related_table_id		INT(10) NOT NULL,";
+	create += "related_attr			VARCHAR(255) NOT NULL,";
+	create += "external_table_name	VARCHAR(255) NOT NULL,";
+	create += "external_attr		VARCHAR(255) NOT NULL,";
+	create += "PRIMARY KEY (relation_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createRepresentationTable ()
+{
+	string create = "CREATE TABLE te_representation (";
+	create += "repres_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
+	create += "layer_id				INT(10) UNSIGNED NOT NULL, ";
+	create += "geom_type			INT(10) NOT NULL, ";
+	create += "geom_table			VARCHAR(255) NOT NULL, ";
+	create += "description			VARCHAR(255), ";
+	create += "lower_x				DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "lower_y				DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "upper_x				DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "upper_y				DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "res_x				DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "res_y				DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "num_cols				INT(10), ";
+	create += "num_rows				INT(10), ";
+	create += "initial_time			DATETIME, ";
+	create += "final_time			DATETIME, ";
+	create += "PRIMARY KEY (repres_id), ";
+	create += "INDEX representation_index (layer_id,geom_type))";
+	return execute (create);
+}
+
+bool TeDatabase::createRasterMetadataTable(const string& tableName)
+{
+	if (tableName.empty())
+		return false;
+
+	string create = "CREATE TABLE " + tableName + " (";
+	create += " geom_id				INT(10) UNSIGNED NOT NULL, ";
+	create += " band_id				INT(10) UNSIGNED NOT NULL, ";
+	create += " min_value			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += " max_value			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += " num_bits			INT(10), ";
+	create += " data_type			INT(4), ";
+	create += " photometric_type	INT(4), ";
+	create += " compression_type	INT(4), ";
+	create += " dummy				DOUBLE(24,15), ";
+	create += " PRIMARY KEY (geom_id, band_id))";
+	return execute (create);
+}
+
+
+bool TeDatabase::createRasterGeometry(const string& tableName)
+{
+	if (tableName.empty())
+		return false;
+
+	string create = "CREATE TABLE " + tableName + " (";
+	create += "geom_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, ";
+	create += "object_id		VARCHAR(255) NOT NULL, ";
+	create += "raster_table		VARCHAR(255) NOT NULL, ";
+	create += "lut_table		VARCHAR(255), ";
+	create += "res_x			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "res_y			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "num_bands		INT(10), ";
+	create += "num_cols			INT(10), ";
+	create += "num_rows			INT(10), ";
+	create += "block_height		INT(10), ";
+	create += "block_width		INT(10), ";
+	create += "lower_x			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "lower_y			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "upper_x			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "upper_y			DOUBLE(24,15) DEFAULT '0.0', ";
+	create += "tiling_type      INT(4), ";
+	create += "PRIMARY KEY (geom_id), ";
+	create += "INDEX " + tableName + "_index(object_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createViewTable ()
+{
+	string create = "CREATE TABLE te_view (";
+	create += "view_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += "projection_id	INT(10) UNSIGNED NOT NULL,";
+	create += "name				VARCHAR(255) NOT NULL,";
+	create += "user_name		VARCHAR(255),";
+	create += "visibility		INT(4),";
+	create += "PRIMARY KEY (view_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createThemeTable ()
+{
+	string create = "CREATE TABLE te_theme (";
+	create += " theme_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += " layer_id			INT(10) UNSIGNED,";
+	create += " view_id				INT(10) UNSIGNED NOT NULL,";
+	create += " name				VARCHAR(255) NOT NULL,";
+	create += " parent_id			INT(10) UNSIGNED NOT NULL,";
+	create += " priority			INT(10) UNSIGNED NOT NULL,";
+	create += " node_type			INT(4) UNSIGNED NOT NULL,";
+	create += " min_scale			DOUBLE(24,15),";
+	create += " max_scale			DOUBLE(24,15),";
+	create += " generate_attribute_where	VARCHAR(255),";
+	create += " generate_spatial_where		VARCHAR(255),";
+	create += " generate_temporal_where		VARCHAR(255),";
+	create += " collection_table			VARCHAR(255),";
+	create += " visible_rep					INT(10) UNSIGNED,";
+	create += " enable_visibility			INT(10) UNSIGNED,";
+	create += " PRIMARY KEY (theme_id),";
+	create += " INDEX view_id_idx(view_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createGroupingTable()
+{
+	string create = "CREATE TABLE te_grouping (";
+	create += " theme_id			INT(10) UNSIGNED NOT NULL,";
+	create += " grouping_number		INT(10) UNSIGNED,";
+	create += " grouping_attr		VARCHAR(255),";
+	create += " grouping_attr_type	INT(4) UNSIGNED,";
+	create += " grouping_mode		INT(4) UNSIGNED,";
+	create += " grouping_norm_attr	VARCHAR(255),";
+	create += " grouping_std_dev	DOUBLE(24,15) DEFAULT '0.0',";
+	create += " grouping_precision	INT(10) UNSIGNED,";
+	create += " grouping_function	VARCHAR(20),";
+	create += " PRIMARY KEY (theme_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createThemeTablesTable()
+{
+	string create = "CREATE TABLE te_theme_table  (";
+	create += " theme_table_id		INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += " theme_id			INT(10) UNSIGNED NOT NULL,";
+	create += " table_id			INT(10) UNSIGNED NOT NULL,";
+	create += " relation_id			INT(10) UNSIGNED,";
+	create += " table_order			INT(10) UNSIGNED,";
+	create += " PRIMARY KEY (theme_table_id), ";
+	create += " INDEX theme_table_index(theme_id))";
+
+	return execute (create);
+}
+
+bool TeDatabase::createLegendTable ()
+{
+	string create = "CREATE TABLE te_legend (";
+	create += " legend_id		INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	create += " theme_id		INT(10) UNSIGNED NOT NULL,";
+	create += " group_id		INT(10) ,";
+	create += " num_objs		INT(10) UNSIGNED,";
+	create += " lower_value		VARCHAR(255),";
+	create += " upper_value		VARCHAR(255),";
+	create += " label			VARCHAR(255), ";
+	create += " PRIMARY KEY (legend_id),";
+	create += " INDEX legend_index (theme_id))";
+	return execute (create);
+}
+
+
+bool TeDatabase::createVisualTable()
+{
+	string create = "CREATE TABLE te_visual (";
+	create += " legend_id		INT(10) UNSIGNED NOT NULL,";
+	create += " geom_type		INT(4) UNSIGNED NOT NULL,";
+	create += " lib_name		VARCHAR(255), ";
+	create += " symb_id			INT(10), ";
+	create += " red				INT(4) UNSIGNED,";
+	create += " green			INT(4) UNSIGNED,";
+	create += " blue			INT(4) UNSIGNED,";
+	create += " transparency	INT(4) UNSIGNED,";
+	create += " width			INT(4) UNSIGNED,";
+	create += " contour_lib_name	VARCHAR(255), ";
+	create += " contour_symb_id		INT(10), ";
+	create += " contour_red			INT(4) UNSIGNED,";
+	create += " contour_green		INT(4) UNSIGNED,";
+	create += " contour_blue		INT(4) UNSIGNED,";
+	create += " contour_transp		INT(4) UNSIGNED,";
+	create += " contour_width		INT(10) UNSIGNED,";
+	create += " size_value			INT(10) UNSIGNED,";
+	create += " pt_angle			INT(4) UNSIGNED,";
+	create += " family				VARCHAR(255),";
+	create += " bold				INT(4) UNSIGNED,";
+	create += " italic				INT(4) UNSIGNED,";
+	create += " alignment_vert		DOUBLE(24,15),";
+	create += " alignment_horiz		DOUBLE(24,15),";
+	create += " tab_size			INT(4) UNSIGNED,";
+	create += " line_space			INT(4) UNSIGNED,";
+	create += " fixed_size			INT(4) UNSIGNED,";
+	create += " PRIMARY KEY (legend_id, geom_type))";
+	return execute (create);
+}
+
+bool TeDatabase::createVisualRasterTable()
+{
+	string create = "CREATE TABLE te_visual_raster (";
+	create += " theme_id		INT(10) UNSIGNED NOT NULL,";
+	create += " band_in			INT(4) UNSIGNED NOT NULL,";
+	create += " band_out		INT(4) UNSIGNED, ";
+	create += " transf_type		INT(4), ";
+	create += " param1			DOUBLE(24,15),";
+	create += " param2			DOUBLE(24,15),";
+	create += " lut_table		VARCHAR(255), ";
+	create += " PRIMARY KEY (theme_id, band_in))";
+	return execute (create);
+}
+
+bool TeDatabase::insertVisual (TeLegendEntry *legend)
+{
+	TeGeomRepVisualMap mapVis = legend->getVisualMap();
+	TeGeomRepVisualMap::iterator it =  mapVis.begin();
+	while ( it != mapVis.end())
+	{ 
+		TeGeomRep rep = it->first;
+		TeVisual vis = it->second;
+		
+		string style, contourStyle, sizeValue, width;
+
+		if(rep == TePOLYGONS || rep == TeCELLS)
+		{
+			sizeValue = Te2String(0);
+			contourStyle = Te2String(vis.contourStyle());
+			width =  Te2String(0);
+			style = Te2String(vis.style());
+		}
+		else if(rep == TeLINES)
+		{
+			sizeValue = Te2String(0);
+			contourStyle = Te2String(0);
+			width = Te2String(vis.width());
+			style = Te2String(vis.style());
+		}
+		else if(rep == TePOINTS)
+		{
+			sizeValue = Te2String(vis.size());
+			contourStyle = Te2String(0);
+			width = Te2String(0);
+			style = Te2String(vis.style());
+		}
+		else if(rep == TeTEXT)
+		{
+			sizeValue = Te2String(vis.size());
+			contourStyle = Te2String(0);
+			width = Te2String(0);
+			style = Te2String(0);
+		}
+		
+		string insert = "INSERT INTO te_visual(legend_id, geom_type, ";
+		insert += "lib_name, symb_id, "; 
+		insert += "red, green, blue, transparency, width, ";
+		insert += "contour_lib_name, contour_symb_id, "; 
+		insert += "contour_red, contour_green,";
+		insert += "contour_blue, contour_transp, contour_width, size_value,";
+		insert += "pt_angle, family, bold, italic, ";
+		insert += "alignment_vert, alignment_horiz, tab_size, line_space, fixed_size) ";
+		insert += " VALUES (";	
+		insert += Te2String(legend->id()) + ", ";
+		insert += Te2String(rep)+ ", ";
+
+		TeColor cor = vis.color();				// filling color
+		TeColor contourCor = vis.contourColor();// contour color
+		
+		insert += "'"+ vis.libName() + "', ";
+		insert += style + ", ";
+		insert += Te2String(cor.red_) + ", ";
+		insert += Te2String(cor.green_) + ", ";
+		insert += Te2String(cor.blue_) + ", ";
+		insert += Te2String(vis.transparency()) + ", ";
+		insert += width +",";
+
+		insert += "'"+ vis.contourLibName() + "', ";
+		insert += contourStyle + ", ";
+		insert += Te2String(contourCor.red_) + ", ";
+		insert += Te2String(contourCor.green_) + ", ";
+		insert += Te2String(contourCor.blue_) + ", ";
+		insert += Te2String(vis.contourTransparency()) + ", ";	
+		insert += Te2String(vis.contourWidth()) + ", ";
+
+		insert += sizeValue +",";
+		insert += Te2String(vis.ptAngle()) +", ";
+
+		insert += "'" + vis.family() + "', ";
+		if (vis.bold())
+			insert += "1, ";
+		else
+			insert += "0, ";
+		if (vis.italic())
+			insert += "1, ";
+		else
+			insert += "0, ";
+		insert += Te2String(vis.alignmentVert()) + ",";
+		insert += Te2String(vis.alignmentHoriz()) + ",";
+		insert += Te2String(vis.tabSize()) + ",";
+		insert += Te2String(vis.lineSpace()) +",";
+		if (vis.fixedSize())
+			insert += "1 ";
+		else
+			insert += "0";			
+		insert += ")";
+
+		if (!execute(insert))
+			return false;
+		++it;
+	}
+	return true;
+}
+
+bool TeDatabase::createCollectionTable(const string& tableName)
+{
+	string create = "CREATE TABLE " + tableName + " (";
+	create += " c_object_id			VARCHAR(255) NOT NULL, ";
+	create += " c_legend_id			INT(10), ";
+	create += " label_x				DOUBLE(24,9), ";
+	create += " label_y				DOUBLE(24,9), ";
+	create += " c_legend_own		INT(10), ";
+	create += " c_object_status		INT(10), ";
+	create += " PRIMARY KEY (c_object_id))";
+	return execute (create);
+}
+
+bool TeDatabase::createCellGeometry (const string& table)
+{
+	string q ="CREATE TABLE " + table +"(";
+	q += "geom_id				INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	q += "object_id				VARCHAR(255) NOT NULL ,";
+	q += "lower_x				double(24,15) NOT NULL ,";
+	q += "lower_y				double(24,15) NOT NULL ,";
+	q += "upper_x				double(24,15) NOT NULL ,";
+	q += "upper_y				double(24,15) NOT NULL ,";
+	q += "col_number			INT(10) NOT NULL ,";
+	q += "row_number			INT(10) NOT NULL ,";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX box_idx (lower_x, lower_y,upper_x, upper_y),";
+	q += "INDEX lc (row_number, col_number))";
+	return execute(q);
+}
+
+bool TeDatabase::createTextGeometry(const string& table)
+{
+	string q ="CREATE TABLE " + table +"(";
+	q += " geom_id			INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	q += " object_id		VARCHAR(255) NOT NULL ,";
+	q += " x				DOUBLE(24,9) DEFAULT '0.0',";
+	q += " y				DOUBLE(24,9) DEFAULT '0.0',";
+	q += " text_value		VARCHAR(255),";
+	q += " angle			DOUBLE(24,9) DEFAULT '0.0',";
+	q += " height			DOUBLE(24,9) DEFAULT '0.0',";
+	q += " alignment_vert	DOUBLE(24,9),";
+	q += " alignment_horiz	DOUBLE(24,9),";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX pos_idx(x,y))";
+	return execute(q);
+}
+
+bool TeDatabase::createNodeGeometry(const string& table)
+{
+	string q ="CREATE TABLE " + table +"(";
+	q += "geom_id		INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	q += "object_id		VARCHAR(255) NOT NULL ,";
+	q += "x				DOUBLE(24,15) DEFAULT '0.0',";
+	q += "y				DOUBLE(24,15) DEFAULT '0.0',";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX pos_idx(x,y))";
+	return execute(q);
+}
+
+bool TeDatabase::createPointGeometry(const string& table)
+{
+	string q ="CREATE TABLE " + table +"(";
+	q += "geom_id		INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	q += "object_id		VARCHAR(255) NOT NULL ,";
+	q += "x				DOUBLE(24,15) DEFAULT '0.0',";
+	q += "y				DOUBLE(24,15) DEFAULT '0.0',";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX pos_idx(x,y))";
+	return execute(q);
+}
+
+bool TeDatabase::createArcGeometry(const string& table)
+{
+	string q ="CREATE TABLE " + table +"(";
+	q += "geom_id		INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,";
+	q += "object_id		VARCHAR(255) NOT NULL ,";
+	q += "from_node		INT(10),";
+	q += "to_node		INT(10),";
+	q += "PRIMARY KEY (geom_id),";
+	q += "INDEX (object_id),";
+	q += "INDEX (from_node),";
+	q += "INDEX (to_node))";
+	return execute(q);
+}
+
+
+bool
+TeDatabase::insertTable	(TeTable &table)
+{
+	string tableName = table.name();
+	TeAttributeList att = table.attributeList();
+	TeAttributeList::iterator it = att.begin();
+
+	TeTableRow row;
+	unsigned int i;
+	unsigned int j;
+	for ( i = 0; i < table.size(); i++  )
+	{
+		row = table[i];
+		it = att.begin();
+		string q = 	"INSERT INTO "+tableName+" values(";
+		j = 1;
+		int jj = 0;
+		string dt = "";
+		while ( it != att.end() )
+		{
+			if(((*it).rep_.type_==TeDATETIME) && (!row[jj].empty()))
+			{
+				const string temp_dt = string(row[jj].c_str());
+				TeTime t(temp_dt, (*it).dateChronon_, (*it).dateTimeFormat_, (*it).dateSeparator_, (*it).timeSeparator_, (*it).indicatorPM_);
+				dt=t.getDateTime("YYYYsMMsDDsHHsmmsSS", "-");
+			}
+
+  			switch ((*it).rep_.type_)
+  			{
+  				case TeSTRING:
+					q += "'"+this->escapeSequence(row[jj])+"'";
+  				break;
+  				case TeREAL:
+					q += "'"+row[jj]+"'";
+  				break;
+  				case TeINT:
+					q += "'"+row[jj]+"'";
+  				break;
+				case TeDATETIME:
+					q += "'"+dt+"'";   
+  				break;
+				default:
+					q += "'"+this->escapeSequence(row[jj])+"'";
+  				break;
+  			}
+			if (j<att.size())
+				q+= ",";
+			++it;
+			j++;
+			jj++;
+		}
+		q += ")";
+		if (!this->execute(q))
+//			return false;
+			continue;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName)
+{
+	if(!tableExist(tableName))
+		return false;
+
+	string tab;
+
+	if(oldColName.empty())
+	{
+		tab = " ALTER TABLE " + tableName + " MODIFY ";
+		tab += rep.name_ +"  ";
+	}
+	else
+	{
+		tab = " ALTER TABLE " + tableName + " CHANGE ";
+		tab += oldColName +" "+ rep.name_ +"  ";
+	}
+
+	switch (rep.type_)
+	{
+		case TeSTRING:
+			tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+			break;
+			
+		case TeREAL:
+			tab += "DOUBLE";	
+			break;
+			
+		case TeINT:
+			tab += "INT";
+			break;
+
+		case TeDATETIME:
+			tab += "DATETIME";
+			break;
+
+		case TeCHARACTER:
+			tab += "CHAR";
+			break;
+
+		case TeBLOB:
+			tab += "LONGBLOB";
+			break; 
+		
+		default:
+			tab += "VARCHAR(" + Te2String(rep.numChar_) + ") ";
+			break;
+	}
+
+	tab += " NULL ";
+
+	if(!execute(tab))
+	{
+		if(errorMessage_.empty())
+			errorMessage_ = "Error alter table " + tableName + " !";
+		return false;
+	}
+
+	string tableId;
+	TeDatabasePortal* portal = getPortal();
+	string sql = "SELECT table_id FROM te_layer_table WHERE attr_table = '" + tableName + "'";
+	if(portal->query(sql) && portal->fetchRow())
+		tableId = portal->getData(0);
+
+	delete portal;
+
+	if(tableId.empty() == false)
+	{
+		if(oldColName.empty() == false) // column name changed
+		{
+			 // update relation
+			sql = "UPDATE te_tables_relation SET related_attr = '" + rep.name_ + "'";
+			sql += " WHERE related_table_id = " + tableId;
+			sql += " AND related_attr = '" + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+
+			sql = "UPDATE te_tables_relation SET external_attr = '" + rep.name_ + "'";
+			sql += " WHERE external_table_name = '" + tableName + "'";
+			sql += " AND external_attr = '" + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+
+			 // update grouping
+			sql = "UPDATE te_grouping SET grouping_attr = '" + tableName + "." + rep.name_ + "'";
+			sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+		}
+		else // column type changed
+		{
+			// delete relation
+			sql = "DELETE FROM te_tables_relation WHERE (related_table_id = " + tableId;
+			sql += " AND related_attr = '" + rep.name_ + "')";
+			sql += " OR (external_table_name = '" + tableName + "'";
+			sql += " AND external_attr = '" + rep.name_ + "')";
+			if(execute(sql) == false)
+				return false;
+
+			// delete grouping
+			TeDatabasePortal* portal = getPortal();
+			sql = "SELECT theme_id FROM te_grouping WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+			if(portal->query(sql) && portal->fetchRow())
+			{
+				string themeId = portal->getData(0);
+
+				sql = "DELETE FROM te_legend WHERE theme_id = " + themeId + " AND group_id >= 0";
+				if(execute(sql) == false)
+				{
+					delete portal;
+					return false;
+				}
+			}
+			delete portal;
+
+			sql = "DELETE FROM te_grouping";
+			sql += " WHERE grouping_attr = '" + tableName + "." + oldColName + "'";
+			if(execute(sql) == false)
+				return false;
+		}
+	}
+	return true;
+}
+
+bool 
+TeDatabase::getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+	{
+		this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+		return false;
+	}
+	
+	// Get layer tables	
+	string get =  " SELECT * FROM te_layer_table"; 
+	if (attType != TeAllAttrTypes)
+		get += " WHERE attr_table_type = " + Te2String(attType);
+	if (!portal->query(get))
+	{	
+		delete portal;
+		return false;
+	}
+
+	while (portal->fetchRow())
+	{
+		string tableName = portal->getData("attr_table");
+		int    tableId = portal->getInt("table_id");
+		string indexName = portal->getData("attr_link");
+
+		TeAttributeList attrList;
+		getAttributeList(tableName, attrList);
+
+		TeTable attTable(tableName,attrList,
+				         portal->getData("unique_id"), indexName,
+						 TeAttrTableType(portal->getInt("attr_table_type")));
+
+		attTable.setId(tableId);
+		attTable.attInitialTime(portal->getData("attr_initial_time"));
+		attTable.attFinalTime(portal->getData("attr_final_time"));
+		attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+		atts.push_back(attTable);
+	}
+	delete portal;
+	return (atts.size() > 0);
+}
+
+bool
+TeDatabase::updateTable	(TeTable &table)
+{
+	string tableName = table.name();
+	TeAttributeList att = table.attributeList();
+	TeAttributeList::iterator it = att.begin();
+
+	TeTableRow row;
+	unsigned int i;
+	string uniqueName = table.uniqueName();
+	string uniqueVal;
+	bool isUniqueValString = false;
+
+	for ( i = 0; i < table.size(); i++  )
+	{
+		row = table[i];
+		it = att.begin();
+		string q = 	"UPDATE "+tableName+" SET ";
+		unsigned int jj = 0;
+		while ( it != att.end() )
+		{
+			string val = row[jj];
+			if(row[jj].empty())
+				val = " NULL ";
+			
+			if ((*it).rep_.name_ != uniqueName)
+			{
+				q += (*it).rep_.name_ + "=";
+  				switch ((*it).rep_.type_)
+  				{
+  					case TeSTRING:
+						q += "'"+escapeSequence(row[jj])+"'";
+  					break;
+  					case TeREAL:
+						q += val;
+  					break;
+  					case TeINT:
+						q += val;
+  					break;
+  					default:
+						q += "'"+escapeSequence(row[jj])+"'";
+  					break;
+  				}
+				if (jj < att.size()-1)
+					q+= ",";
+			}
+			else
+			{
+				if((*it).rep_.type_ == TeSTRING)
+					isUniqueValString = true;
+				uniqueVal = row[jj];
+			}
+
+			++it;
+			jj++;
+		}
+		
+		if(isUniqueValString)
+			q += " WHERE " + uniqueName + " = '" + uniqueVal +"'";
+		else
+			q += " WHERE " + uniqueName + " = " + uniqueVal;
+		
+		if (!this->execute(q))
+			continue;
+	}
+	return true;
+}
+
+
+bool 
+TeDatabase::loadTable(const string& tableName, TeTable &table)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string q ="SELECT * FROM " + tableName;
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+	table.name(tableName);
+	table.setAttributeList(portal->AttributeList());
+
+	while (portal->fetchRow())
+	{
+		TeTableRow row;
+		for (int j = 0; j < portal->numFields(); j++)
+			row.push_back (portal->getData (j)); 
+		table.add(row);
+	}
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::selectTable (const string& tableName, const string& criteria, TeTable &table)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string q ="SELECT * FROM " + tableName;
+	if (!criteria.empty())
+		q += " WHERE " + criteria;
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+	table.name(tableName);
+	table.setAttributeList(portal->AttributeList());
+
+	while (portal->fetchRow())
+	{
+		TeTableRow row;
+		for(int i = 0; i < portal->numFields(); i++)
+			row.push_back(portal->getData(i));
+		table.add(row);
+	}
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::updateView (TeView *view)
+{
+	TeProjection* proj = view->projection();
+	if (proj)
+	{
+		if (proj->id() <= 0)
+			this->insertProjection(view->projection());
+		else
+			this->updateProjection(view->projection());
+	}
+	else
+	{
+		errorMessage_ = "N�o � poss�vel atualizar vista sem proje��o!";
+		return false;
+	}
+
+	string sql = "UPDATE te_view SET projection_id=" + Te2String(proj->id());
+	sql+= ", name='" + view->name() + "'";
+	sql+= ", user_name='" + view->user() + "'";
+	sql+= ", visibility= " + Te2String((int)view->isVisible());
+	sql +=" WHERE view_id = " + Te2String(view->id());
+
+	if (!this->execute (sql))
+		return false;
+
+	TeViewTree* tree = view->root();
+	if (tree) 
+		return	updateViewTree(tree);
+	return true;
+}
+
+
+bool 
+TeDatabase::loadViewSet (const string& user)
+{
+	TeViewMap::iterator it = viewMap_.begin();
+	while (it != viewMap_.end())
+	{
+		delete it->second;
+		++it;
+	}
+	viewMap_.clear();
+	
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string sql;
+	if (!user.empty())
+		sql = "SELECT * FROM te_view WHERE user_name = '" + user + "'";
+	else
+		sql = "SELECT * FROM te_view WHERE user_name = '" + this->user() + "'";
+
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	while (portal->fetchRow())
+	{
+		TeView *view = new TeView();
+		view->id (portal->getInt("view_id"));
+		loadView (view);
+	}
+	delete portal;
+	return true;
+}
+
+TeViewTree* 
+TeDatabase::loadViewTree(TeView* view, int id)
+{
+	if( view == 0) 
+		return 0;
+	
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return 0;
+
+	string q;
+	TeViewTree *node = 0;
+
+	if (id != 0)
+	{
+		q = "SELECT * FROM te_theme";
+		q += " WHERE view_id = " + Te2String (view->id());
+		q += " AND theme_id = " + Te2String(id);
+
+		if (!portal->query(q) || !portal->fetchRow())
+		{
+			delete portal;
+			return 0;
+		}
+
+		TeViewNodeType type = (TeViewNodeType)portal->getInt("node_type");
+		if(type != TeTREE)
+		{
+			portal->freeResult();
+			delete portal;
+			return NULL;
+		}
+
+		node = portal->getViewTree();
+		portal->freeResult();
+	}
+
+	q ="SELECT * FROM te_theme";
+	q += " WHERE view_id = " + Te2String (view->id());
+	q += " AND parent_id = " + Te2String(id);
+	q += " ORDER BY priority ASC";
+
+	if (!portal->query(q))
+	{
+		delete portal;
+		return node;
+	}
+
+	while (portal->fetchRow())
+	{
+		TeViewNodeType childType = (TeViewNodeType)portal->getInt("node_type");
+		TeViewNode *childNode;
+		if (childType == TeTHEME)
+		{
+			childNode = new TeTheme();
+			childNode->id(portal->getInt(0));
+			this->loadTheme((TeTheme*)childNode);
+		} 
+		else
+		{
+			childNode = loadViewTree(view, portal->getInt("theme_id"));
+		}
+
+		if(id == 0)
+		{
+			view->add(childNode);
+		} 
+		else
+		{
+//			view->addTheme(childNode);
+			node->add(childNode);
+		}
+	}
+	delete portal;
+	return node;
+}
+
+bool 
+TeDatabase::loadView (TeView* view)
+{
+	string q;
+	if (view->id() > 0)
+		q = "SELECT * FROM te_view WHERE view_id=" + Te2String(view->id());
+	else if (!view->name().empty())
+	{
+		q = "SELECT * FROM te_view WHERE name='" + view->name() + "'";
+		
+		if(!view->user().empty())
+			q += " AND user_name='" + view->user() + "'"; 
+	}
+	else
+		return false;
+		
+	TeDatabasePortal* portal = getPortal();
+	if (!portal)
+	{
+		this->errorMessage_ = "Erro ao tentar abrir um portal";
+		return false;
+	}
+
+	if (!portal->query(q))
+	{
+		delete portal;
+		this->errorMessage_ = "Erro ao submeter query: \"" + q + "\"";
+		return false;
+	}
+
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	int projId = portal->getInt("projection_id");
+	TeProjection* proj = loadProjection(projId);
+	if (proj != 0)
+		view->projection(proj);
+	view->name(portal->getData("name"));
+	view->user(portal->getData("user_name"));
+	view->isVisible (portal->getBool("visibility"));
+	view->id(portal->getInt("view_id"));
+	portal->freeResult();
+
+	loadViewTree(view, 0);
+
+	delete portal;
+
+	vector<TeViewNode*> &themes = view->themes();
+	for (unsigned int i = 0; i < themes.size() ; i++)
+	{
+		TeTheme *theme = (TeTheme*)themes[i];
+		int id = theme->layerId();
+		TeLayerMap::iterator it = layerMap_.find(id);
+		if (it == layerMap_.end())
+		{
+			layerMap_.clear();
+			loadLayerSet();
+		}
+		theme->layer(layerMap_[id]);
+		if (!loadLegend (theme))	// retrieve associated legend
+			return false;
+	}
+	viewMap_[view->id()] = view;
+	return true;
+}
+
+
+void
+TeDatabase::clear()
+{
+	TeViewMap::iterator viewIt;
+	for (viewIt = viewMap_.begin(); viewIt != viewMap_.end(); ++viewIt)
+		delete viewIt->second;
+
+	TeLayerMap::iterator layerIt;
+	for (layerIt = layerMap_.begin(); layerIt != layerMap_.end(); ++layerIt)
+		delete layerIt->second;
+
+	legendMap_.clear();
+	themeMap_.clear();
+	viewMap_.clear();
+	layerMap_.clear();
+}
+
+bool 
+TeDatabase::deleteView (int viewId)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	// view projection should be deleted manually
+	string sql =  "SELECT projection_id FROM te_view WHERE view_id=" + Te2String(viewId);
+	portal->freeResult();
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	string projId = portal->getData("projection_id");
+	portal->freeResult();
+	
+	// delete themes belonging to this view 
+	sql = "SELECT theme_id FROM te_theme WHERE view_id=" + Te2String(viewId);
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	while (portal->fetchRow())
+	{
+		int id = atoi(portal->getData(0));
+		if(deleteTheme(id) == false)
+		{	
+			delete portal;
+			return false;
+		}
+	}
+	// delete view
+	sql = "DELETE FROM te_view WHERE view_id = " + Te2String(viewId);
+	if (!this->execute (sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	sql = "DELETE FROM te_projection WHERE  projection_id = " + projId;
+	if (!this->execute (sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	// Delete the view and its themes
+	TeView* view = viewMap_[viewId];
+	viewMap_.erase(viewId);
+	delete view;
+	delete portal;
+	return true;
+}
+
+bool
+TeDatabase::updateViewTree (TeViewTree *tree)
+{
+	if(tree->id() > 0)
+	{
+		string sql;
+		sql = "UPDATE te_theme SET ";
+		sql += "name='" + tree->name()+"'";
+		sql += ", parent_id=" + Te2String (tree->parentId());
+		sql += ", node_type=" + Te2String (tree->type());
+		sql += " ,priority=" + Te2String (tree->priority());
+		sql += " WHERE theme_id = " + Te2String(tree->id());
+
+		if(!this->execute (sql)) return false;
+	}
+
+	for (unsigned int th=0; th<tree->size(); th++)
+	{
+		TeViewNode* node = tree->retrieve(th);
+		if (node->type() == TeTHEME)
+		{
+			TeTheme *theme = (TeTheme*)node;
+			if(!updateTheme(theme)) return false;
+		}
+		else
+		{
+			TeViewTree* tree = (TeViewTree*)node;
+			if(!updateViewTree(tree)) return false;
+		}
+	}
+	return true;
+}
+
+bool 
+TeDatabase::viewExist(string viewName)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	viewName = TeConvertToUpperCase(viewName);
+
+	string sql = "SELECT name FROM te_view";
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	while (portal->fetchRow())
+	{
+		string name = portal->getData(0);
+		name = TeConvertToUpperCase(name);
+		if (viewName == name)
+		{
+			delete portal;
+			return true;
+		}
+	}
+	delete portal;
+	return false;
+}
+
+
+bool
+TeDatabase::updateTheme (TeTheme *theme)
+{
+	string sql;
+
+	if (theme->id() <= 0 )  // theme doesn�t exist in the database yet
+	{
+		return this->insertTheme(theme);
+	}
+	
+	// update theme metadata
+	sql = "UPDATE te_theme SET ";
+	sql += " layer_id=" + Te2String (theme->layerId());
+	sql += ", view_id=" + Te2String (theme->view());
+	sql += ", name='" + escapeSequence(theme->name())+"'";
+	sql += ", parent_id=" + Te2String (theme->parentId());
+	sql += ", priority=" + Te2String (theme->priority());
+	sql += ", node_type=" + Te2String (theme->type());
+	sql += ", min_scale=" + Te2String (theme->minScale(),5);
+	sql += ", max_scale=" + Te2String (theme->maxScale(),5);
+	sql += ", generate_attribute_where='" + escapeSequence(theme->attributeRest())+"'";
+	sql += ", generate_spatial_where='" + escapeSequence(theme->spatialRest())+"'";
+	sql += ", generate_temporal_where='" + escapeSequence(theme->temporalRest())+"'";
+	sql += ", collection_table='" + theme->collectionTable() + "'";
+	sql += ", visible_rep= " + Te2String(theme->visibleRep ());
+	sql += ", enable_visibility= " + Te2String(theme->visibility()); 
+	sql += " WHERE theme_id=" + Te2String (theme->id());
+
+	if (!this->execute (sql))
+		return false;
+         
+	//delete grouping 
+	sql = "DELETE FROM te_grouping WHERE theme_id= "+ Te2String(theme->id());
+	this->execute (sql);
+		
+	if(theme->grouping())
+	{
+		if(!insertGrouping(theme->id(), theme->grouping()))
+			return false;
+	}
+	
+	// update each of its legends
+	bool status = true;
+	
+	if(theme->legend().size() == 0)
+	{
+		if(!deleteLegend(theme->id()))
+			return false;
+	}
+	else
+	{
+		for (unsigned int i = 0; i < theme->legend().size() ; i++)
+		{
+			status = updateLegend(&(theme->legend()[i]));
+			if (!status)
+				return status;
+		}
+	}
+
+	status = updateLegend(&(theme->withoutDataConnectionLegend()));
+	if (!status)
+		return status;
+
+	status = updateLegend(&(theme->outOfCollectionLegend()));
+	if (!status)
+		return status;
+
+	status = updateLegend(&(theme->defaultLegend()));
+	if (!status)
+		return status;
+
+	status = updateLegend(&(theme->pointingLegend()));
+	if (!status)
+		return status;
+
+	status = updateLegend(&(theme->queryLegend()));
+	if (!status)
+		return status;
+
+	status = updateLegend(&(theme->queryAndPointingLegend()));
+	if (!status)
+		return status;
+
+	// theme tables
+	return updateThemeTable (theme);
+}
+
+bool
+TeDatabase::loadTheme (TeTheme* theme)
+{
+	if (theme == 0)
+		return false;
+
+	string get = "SELECT te_theme.* FROM te_view INNER JOIN te_theme ON te_view.view_id = te_theme.view_id WHERE ";
+	if (theme->id() > 0)
+		get += " te_theme.theme_id = "+  Te2String(theme->id());
+	else if (!theme->name().empty())
+		get += " te_theme.name = '"+  theme->name() + "'";
+	else
+	{
+		this->errorMessage_ = "Theme procurado n�o possui nem id nem nome";
+		return false;
+	}
+	get += " AND te_view.user_name = \'" + this->user() +"\'";
+
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+	{
+		this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+		return false;
+	}
+
+	if (!portal->query (get))
+	{	
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	//theme information
+	theme->id(atoi (portal->getData(0)));
+	theme->layerId (atoi(portal->getData(1)));
+	theme->view (atoi(portal->getData (2)));
+	theme->name(string (portal->getData("name")));
+	theme->parentId( atoi(portal->getData ("parent_id")));
+	theme->type (TeViewNodeType(atoi(portal->getData ("node_type"))));
+	theme->priority(portal->getInt("priority"));
+	theme->minScale (portal->getDouble ("min_scale"));
+	theme->maxScale (portal->getDouble ("max_scale"));
+	theme->attributeRest(string(portal->getData ("generate_attribute_where")));
+	theme->spatialRest(string(portal->getData ("generate_spatial_where")));
+	theme->temporalRest(string(portal->getData ("generate_temporal_where")));
+	theme->collectionTable(string(portal->getData ("collection_table")));
+	theme->collectionAuxTable(theme->collectionTable() + "_aux");
+	theme->visibleRep(atoi(portal->getData ("visible_rep")));
+	theme->visibility(atoi(portal->getData ("enable_visibility")));
+	
+	//load layer
+	int id = theme->layerId();
+	TeLayerMap::iterator it = layerMap_.find(id);
+	if (it == layerMap_.end())
+	{
+		layerMap_.clear();
+		loadLayerSet();
+	}
+	theme->layer(layerMap_[id]);
+	portal->freeResult();
+
+	// load them grouping
+	get = "SELECT * FROM te_grouping  WHERE theme_id = " + Te2String(theme->id());
+	if (portal->query (get) && portal->fetchRow())
+	{	
+		TeAttributeRep atRep;
+		string attname = portal->getData ("grouping_attr");
+		string norname = portal->getData ("grouping_norm_attr");
+		int f = attname.find("(");
+		if(f >= 0)
+		{
+			string alias = attname;
+			attname.erase(f, attname.size()-f);
+			alias.erase(0, f+1);
+			alias.erase(alias.size()-1, 1);
+			map<string, string>& m = mapThemeAlias_[theme->id()];
+			m[attname] = alias;
+		}
+		f = norname.find("(");
+		if(f >= 0)
+		{
+			string alias = norname;
+			norname.erase(f, norname.size()-f);
+			alias.erase(0, f+1);
+			alias.erase(alias.size()-1, 1);
+			map<string, string>& m = mapThemeAlias_[theme->id()];
+			m[norname] = alias;
+		}
+
+		if(attname=="NONE")
+			attname = "";
+		
+		if(norname=="NONE")
+			norname = "";
+		
+		atRep.name_ = attname;
+		atRep.type_ = TeAttrDataType(atoi(portal->getData ("grouping_attr_type")));
+		
+		TeGrouping* g = new TeGrouping ( atRep, norname, 
+						TeGroupingMode(atoi(portal->getData ("grouping_mode"))),
+						atoi(portal->getData ("grouping_number")),
+						atoi(portal->getData ("grouping_precision")),
+						portal->getDouble("grouping_std_dev"), 
+						portal->getData("grouping_function") );
+
+		theme->grouping(g);
+	}
+	portal->freeResult();
+
+	// load theme tables
+	if(!loadThemeTable(theme))
+	{
+		delete portal;
+		return false;
+	}
+
+	get = "SELECT * FROM te_visual_raster  WHERE theme_id = " + Te2String(theme->id());
+	if (portal->query (get) && portal->fetchRow())
+	{
+		TeRasterTransform* vis = new TeRasterTransform();
+		vis->setSrcBand(portal->getInt(1));
+		vis->setDestBand(portal->getInt(2));
+		vis->setTransfFunction(static_cast<TeRasterTransform::TeRasterTransfFunctions>(portal->getInt(3)));
+		if (vis->getTransfFunction() == TeRasterTransform::TeExtractRGB || 
+			vis->getTransfFunction() == TeRasterTransform::TeExtractBands)
+		{
+			do
+			{
+				vis->setBChannelMapping(portal->getInt(1),static_cast<TeRasterTransform::TeRGBChannels>(portal->getInt(2)));
+			}while (portal->fetchRow());
+		}
+		theme->rasterVisual(vis);
+	}
+
+	// load theme legends  
+	loadLegend(theme);
+
+	themeMap_[theme->id()] = theme;
+
+	delete portal;
+	return true;
+}
+
+
+bool
+TeDatabase::loadThemeTable (TeTheme* theme)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+	{
+		this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+		return false;
+	}
+	
+	//theme tables
+	string sel = "SELECT te_theme_table.*, te_tables_relation.*, te_layer_table.*";
+	sel += " FROM (te_theme_table LEFT JOIN te_tables_relation";
+	sel += " ON te_theme_table.relation_id = te_tables_relation.relation_id)";
+	sel += " LEFT JOIN te_layer_table ON te_theme_table.table_id = te_layer_table.table_id";
+	sel += " WHERE  te_theme_table.theme_id = " + Te2String(theme->id());
+	sel += " ORDER BY table_order";
+	
+	if (!portal->query (sel))
+	{	
+		delete portal;
+		return false;
+	}
+
+	while(portal->fetchRow ())
+	{
+		string tableName = portal->getData("attr_table");
+		TeAttributeList attrList;
+		getAttributeList(tableName, attrList);
+		string uniqueId = portal->getData("unique_id");
+		string linkName = portal->getData("attr_link");
+
+		TeTable table(tableName, attrList, uniqueId, linkName);
+		table.setId(portal->getInt("te_theme_table.table_id"));
+		table.setOrder(portal->getInt("table_order"));
+		table.attInitialTime(portal->getData("attr_initial_time"));
+		table.attFinalTime(portal->getData("attr_final_time"));
+		table.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+
+		int tableType = portal->getInt("attr_table_type");
+		if (tableType == TeAttrExternal)
+		{
+			int relatedTableId = portal->getInt("related_table_id");
+			table.relatedTableName(getTableName(relatedTableId));
+			int relationId = portal->getInt("te_theme_table.relation_id");
+			relationMSet_.insert(relationId);
+
+			string relatedAttr = portal->getData("related_attr");
+			table.setTableType(TeAttrExternal, relatedTableId, relatedAttr);
+
+			table.setLinkName(portal->getData("external_attr"));
+		}
+		else
+			table.setTableType((TeAttrTableType)tableType);
+
+		theme->addThemeTable(table);
+	}
+
+	delete portal;
+	return true;
+}
+
+
+bool
+TeDatabase::insertThemeTable(TeTheme *theme, TeTable& inputTable)
+{
+	int themeId = theme->id();
+	int	tableOrder = 0;
+	int	relationId;
+	bool status;
+	string qString;
+
+	// Get the order of the last theme table
+	qString = "SELECT MAX(table_order) FROM te_theme_table";
+	qString += " WHERE theme_id = " + Te2String(themeId);
+
+	TeDatabasePortal* portal = getPortal();
+	if (portal->query(qString) == false || portal->fetchRow() == false)
+		return false;
+
+	string data = portal->getData(0);
+	if (data.empty())
+		tableOrder = 0;
+	else
+	{
+		tableOrder = atoi(portal->getData(0));
+		++tableOrder;
+	}
+	inputTable.setOrder(tableOrder);
+	delete portal;
+
+	if (inputTable.tableType() == TeAttrExternal)
+	{
+		status = insertRelationInfo(inputTable.relatedTableId(),inputTable.relatedAttribute(),
+									inputTable.name(),inputTable.linkName(),relationId);
+		if (status == false)
+			return false;
+		relationMSet_.insert(relationId);
+
+		status = insertThemeTable(themeId, inputTable.id(), relationId, tableOrder);
+	}
+	else
+	{
+		// Insert the table in the te_theme_table
+		status = insertThemeTable(themeId, inputTable.id(), 0, tableOrder);
+	}
+	return status;
+}
+
+bool
+TeDatabase::removeThemeTable(TeTheme *theme, int tableOrder)
+{
+	if (tableOrder < 0)
+		return false;
+
+	int relationId = -1;
+	string qString;
+
+	TeAttrTableVector attrTableVector; 
+	theme->getAttTables(attrTableVector);
+
+	// If the table is external, find the relation id
+	qString = "SELECT relation_id FROM te_theme_table";
+	qString += " WHERE theme_id = " + Te2String(theme->id());
+	qString += " AND relation_id IS NOT NULL";
+	qString += " AND table_order = " + Te2String(tableOrder);
+
+	TeDatabasePortal* portal = getPortal();
+	if (portal->query(qString) && portal->fetchRow())
+		relationId = portal->getInt("relation_id");
+	else
+	{
+		delete portal;
+		return false;
+	}
+	delete portal;
+
+	// Remove the relation from the te_tables_relation
+	// table if only this theme is using it
+	if (relationId > 0)
+	{
+		if (relationMSet_.count(relationId) == 1)
+		{
+			qString = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
+			if (execute(qString) == false)
+				return false;
+			relationMSet_.erase(relationId);
+		}
+		else
+			relationMSet_.erase(relationMSet_.find(relationId));
+	}
+
+	// Remove the table from the te_theme_table
+	qString = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
+	qString += " AND table_order = " + Te2String(tableOrder);
+
+	if (execute(qString) == false)
+		return false;
+
+	return true;
+}
+
+
+bool 
+TeDatabase::updateThemeTable(TeTheme *theme)
+{
+	//Initially remove from te_theme_table all the records of this theme
+	string q = "SELECT * FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
+	TeDatabasePortal *portal = getPortal();
+
+	if (portal->query(q) == false)
+	{
+		delete portal;
+		return false;
+	}
+
+	while (portal->fetchRow())
+	{
+		int relationId;
+		int themeTableId = portal->getInt("theme_table_id");
+
+		string data = portal->getData("relation_id");
+		if (data.empty())
+			relationId = -1;
+		else
+			relationId = atoi(data.c_str());
+
+		// Remove the relation from the te_tables_relation
+		// table if only this theme is using it
+		if (relationId > 0)
+		{
+			if (relationMSet_.count(relationId) == 1)
+			{
+				q = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(relationId);
+				if (execute(q) == false)
+				{
+					delete portal;
+					return false;
+				}
+				relationMSet_.erase(relationId);
+			}
+			else
+				relationMSet_.erase(relationMSet_.find(relationId));
+		}
+
+		// Remove the table from the te_theme_table
+		q = "DELETE FROM te_theme_table WHERE theme_id = " + Te2String(theme->id());
+		q += " AND theme_table_id = " + Te2String(themeTableId);
+		if (execute(q) == false)
+		{
+			delete portal;
+			return false;
+		}
+	}
+	delete portal;
+
+	// Update te_theme_table and te_tables_relation(if there are any external tables)
+	// with the information provided from the new vector of theme tables
+	TeAttrTableVector tablesVector; 
+	theme->getAttTables(tablesVector);
+	for (unsigned i = 0; i < tablesVector.size(); ++i)
+		insertThemeTable(theme, tablesVector[i]);
+
+	return true;
+}
+
+
+bool 
+TeDatabase::insertGrouping (int themeId, TeGrouping* grouping)
+{
+	if((themeId < 1) || (!grouping) )
+		return false;
+
+	string ins = " INSERT INTO te_grouping (theme_id, grouping_number, ";
+	ins += " grouping_attr, grouping_attr_type, grouping_mode, "; 
+	ins += " grouping_norm_attr, grouping_std_dev, grouping_precision, grouping_function )"; 
+	ins += " VALUES ( ";
+	ins += Te2String(themeId);
+	ins += ", "+ Te2String(grouping->groupNumSlices_);
+
+	string attname = grouping->groupAttribute_.name_;
+	if(attname.empty() || (attname=="NONE") )
+		attname = "";
+	
+	string norname = grouping->groupNormAttribute_;
+	if(norname.empty() || (norname=="NONE"))
+		norname = "";
+
+	map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
+	if(it != mapThemeAlias_.end())
+	{
+		map<string, string>::iterator tit = it->second.find(attname);
+		if(tit != it->second.end())
+		{
+			string alias = tit->second;
+			attname += "(" + alias + ")";
+		}
+		if(norname.empty() == false)
+		{
+			map<string, string>::iterator tit = it->second.find(norname);
+			if(tit != it->second.end())
+			{
+				string nalias = tit->second;
+				norname += "(" + nalias + ")";
+			}
+		}
+	}
+
+	ins += ", '"+ attname +"'";
+	ins += ", "+ Te2String(grouping->groupAttribute_.type_);
+	ins += ", "+ Te2String(grouping->groupMode_);
+	ins += ", '"+ norname +"'";
+	ins += ", "+ Te2String(grouping->groupStdDev_); 
+	ins += ", "+ Te2String(grouping->groupPrecision_);
+	ins += ", '"+ grouping->groupFunction_ +"'";
+	ins += ")";
+
+	return (execute(ins));
+}
+
+bool 
+TeDatabase::updateGrouping (int themeId, TeGrouping* grouping)
+{
+	if((themeId < 1) || (!grouping))
+		return false;
+
+	string up = " UPDATE te_grouping SET ";
+	up += "  grouping_number = "+ Te2String(grouping->groupNumSlices_);
+
+	string attname = grouping->groupAttribute_.name_;
+	if(attname.empty() || (attname=="NONE"))
+		attname = "";
+
+	string norname = grouping->groupNormAttribute_;
+	if(norname.empty()|| (norname=="NONE"))
+		norname = "";
+
+	map<int, map<string, string> >::iterator it = mapThemeAlias_.find(themeId);
+	if(it != mapThemeAlias_.end())
+	{
+		map<string, string>::iterator tit = it->second.find(attname);
+		if(tit != it->second.end())
+		{
+			string alias = tit->second;
+			attname += "(" + alias + ")";
+		}
+		if(norname.empty() == false)
+		{
+			map<string, string>::iterator tit = it->second.find(norname);
+			if(tit != it->second.end())
+			{
+				string nalias = tit->second;
+				norname += "(" + nalias + ")";
+			}
+		}
+	}
+
+	up += ", grouping_attr = '"+ attname +"'";
+	up += ", grouping_attr_type = "+ Te2String(grouping->groupAttribute_.type_);
+	up += ", grouping_mode = "+ Te2String(grouping->groupMode_);
+	up += ", grouping_norm_attr = '"+ norname +"'";
+	up += ", grouping_std_dev = "+ Te2String(grouping->groupStdDev_); 
+	up += ", grouping_precision = "+ Te2String(grouping->groupPrecision_);
+	up += ", grouping_function = '"+ grouping->groupFunction_ +"'";
+	up += " WHERE theme_id = "+ Te2String(themeId);
+
+	return (execute(up));
+}
+
+bool 
+TeDatabase::generateLabelPositions(TeTheme *theme)
+{
+	string	piebar, geomTable, upd;
+	string	collTable = theme->collectionTable();
+	
+	if((collTable.empty()) || (!tableExist(collTable)))
+		return false;
+
+	if (theme->layer()->hasGeometry(TeCELLS) )
+	{
+		geomTable = theme->layer()->tableName(TeCELLS);
+
+		piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
+		piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+		piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+
+		upd = " UPDATE (" + piebar + ") SET";
+		upd += " label_x = lower_x + (upper_x-lower_x)/2,";
+		upd += " label_y = lower_y + (upper_y-lower_y)/2";
+
+		if(!execute(upd))
+			return false;
+	}
+
+	if( theme->layer()->hasGeometry(TePOLYGONS))
+	{
+		geomTable = theme->layer()->tableName(TePOLYGONS);
+
+		piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
+		piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+		piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+		piebar += " WHERE label_x is null OR label_y is null";
+		piebar += " ORDER BY c_object_id ASC, ext_max ASC";
+		
+		upd = " UPDATE (" + piebar + ") SET";
+		upd += " label_x = lower_x + (upper_x-lower_x)/2,";
+		upd += " label_y = lower_y + (upper_y-lower_y)/2";
+
+		if(!execute(upd))
+			return false;
+	}
+	
+	if (theme->layer()->hasGeometry(TePOINTS))
+	{
+		geomTable = theme->layer()->tableName(TePOINTS);
+
+		piebar = "SELECT label_x, label_y, x, y";
+		piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+		piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+		piebar += " WHERE label_x is null OR label_y is null";
+		upd = " UPDATE (" + piebar + ") SET";
+		upd += " label_x = x,";
+		upd += " label_y = y";
+
+		if(!execute(upd))
+			return false;
+	}
+	
+	if(theme->layer()->hasGeometry(TeLINES))
+	{
+		geomTable = theme->layer()->tableName(TeLINES);
+
+		piebar = "SELECT label_x, label_y, lower_x, lower_y, upper_x, upper_y";
+		piebar += " FROM " + collTable + " LEFT JOIN " + geomTable;
+		piebar += " ON " + collTable + ".c_object_id = " + geomTable + ".object_id";
+		piebar += " WHERE label_x is null OR label_y is null";
+		piebar += " ORDER BY c_object_id ASC, ext_max ASC";
+		
+		upd = " UPDATE (" + piebar + ") SET";
+		upd += " label_x = lower_x + (upper_x-lower_x)/2,";
+		upd += " label_y = lower_y + (upper_y-lower_y)/2";
+
+		if(!execute(upd))
+			return false;
+	}
+
+	return true;
+}
+
+bool 
+TeDatabase::themeExist(string themeName)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	themeName = TeConvertToUpperCase(themeName);
+
+	string sql = "SELECT name FROM te_theme";
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	while (portal->fetchRow())
+	{
+		string name = portal->getData(0);
+		name = TeConvertToUpperCase(name);
+		if (themeName == name)
+		{
+			delete portal;
+			return true;
+		}
+	}
+	delete portal;
+	return false;
+}
+
+bool
+TeDatabase::deleteTheme(int themeId)
+{
+	string sql;
+
+	// delete the collection table associated to this theme
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return false;
+
+	sql = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
+	if(!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	string colTab = portal->getData("collection_table");
+	//delete collection table
+	if (this->tableExist(colTab))	
+	{
+		sql = "DROP TABLE " + colTab;
+		if (!this->execute(sql) )
+		{	
+			delete portal;
+			return false;
+		}
+	}
+	//delete auxiliar collection table
+	if (this->tableExist(colTab +"_aux"))	
+	{
+		sql = "DROP TABLE " +colTab +"_aux";
+		if (!this->execute(sql) )
+		{	
+			delete portal;
+			return false;
+		}
+	}
+
+	portal->freeResult();
+
+	//delete the visual associated to this theme
+	if (existRelation("te_visual","fk_visual_legend_id") != TeRICascadeDeletion)
+	{
+		sql = "SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
+		if(!portal->query(sql))
+		{	
+			delete portal;
+			return false;
+		}
+		string wherec;
+		int c = 0;
+		while (portal->fetchRow())
+		{
+			if (c)
+				wherec += ",";
+			c++;
+			wherec += portal->getData(0);
+		}
+		portal->freeResult();
+		sql = "DELETE FROM te_visual WHERE legend_id IN (" + wherec + ")";
+		if (!this->execute(sql))
+		{	
+			delete portal;
+			return false;
+		}
+	}
+
+	//delete all visuals of raster associated to this theme
+	if (existRelation("te_visual_raster","fk_visrast_theme_id") != TeRICascadeDeletion)
+	{
+		sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
+		if (!this->execute (sql))
+		{	
+			delete portal;
+			return false;
+		}
+	}
+	
+	//delete all legends associated to this theme
+	if (existRelation("te_legend","fk_legend_theme_id") != TeRICascadeDeletion)
+	{
+		sql = "DELETE FROM te_legend WHERE theme_id =" + Te2String(themeId);
+		if (!this->execute (sql))
+		{	
+			delete portal;
+			return false;
+		}
+	}
+	
+	//select the view of this theme
+	sql = "SELECT view_id FROM te_theme WHERE theme_id = " + Te2String(themeId);
+	portal->freeResult();
+	if(!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	int viewId = portal->getInt("view_id");
+	TeView* view = viewMap_[viewId];
+	TeTheme* tema = (TeTheme*)view->remove(themeId); 
+	if(!tema)
+	{
+		delete portal;
+		return false;
+	}
+
+	unsigned int i;
+	TeLegendEntryVector& legendVector = tema->legend();
+	for (i = 0; i < legendVector.size(); ++i)
+		legendMap_.erase(legendVector[i].id());
+	themeMap_.erase(themeId);
+
+	delete tema;
+	delete portal;
+
+	//delete the tables associated to this theme
+	if (existRelation("te_theme_table","fk_thmtable_theme_id") != TeRICascadeDeletion)
+	{
+		sql = "DELETE FROM te_theme_table WHERE theme_id =" + Te2String(themeId);
+		if (!this->execute (sql))
+			return false;
+	}
+		
+	//delete the grouping
+	if (existRelation("te_grouping","fk_group_theme_id")  != TeRICascadeDeletion)
+	{
+		sql = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
+		if (!this->execute (sql))
+			return false;
+	}
+
+	// delete raster visual
+	if (existRelation("te_visual_raster","fk_visrast_theme_id") == TeNoRelation )
+	{
+		sql = "DELETE FROM te_visual_raster WHERE theme_id =" + Te2String(themeId);
+		if (!this->execute (sql))
+			return false;
+	}
+
+	// delete the theme
+	sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
+	if (!this->execute (sql))
+		return false;
+
+	return true;
+}
+
+bool
+TeDatabase::deleteThemeGroup(int themeId)
+{
+	string sql;
+	// delete the theme
+	sql = "DELETE FROM te_theme WHERE theme_id = " + Te2String(themeId);
+	if (!this->execute (sql))
+		return false;
+	return true;
+}
+
+bool
+TeDatabase::deleteLegend(int themeId)
+{
+	// If there is a collection table update legend of the objects in it
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return false;
+	string sel = "SELECT collection_table FROM te_theme WHERE theme_id = " + Te2String(themeId);
+	string TC;
+	if (portal->query(sel) && portal->fetchRow())
+		TC = portal->getData(0);
+	delete portal;
+
+	if (!TC.empty() && this->tableExist(TC))
+	{
+		string up = "UPDATE " + TC + " SET c_legend_id = 0";
+		if (!execute(up))
+			return false;
+	}
+
+	// Delete visual of the legends
+	string del = "DELETE FROM te_visual WHERE legend_id IN ";
+	del += "(SELECT legend_id FROM te_legend WHERE theme_id = " + Te2String(themeId);
+	del += " AND group_id > -1)";
+	if (!execute(del))
+		return false;
+
+	del = "DELETE FROM te_legend WHERE theme_id = " + Te2String(themeId);
+	del += " AND group_id > -1";
+	if (!execute(del))
+		return false;
+
+	// Delete from memory the legends of the theme
+	unsigned int i;
+	TeTheme *theme = themeMap_[themeId];
+	TeLegendEntryVector& legendVector = theme->legend();
+	for (i = 0; i < legendVector.size(); ++i)
+		legendMap_.erase(legendVector[i].id());
+	legendVector.clear();
+
+	//delete grouping
+	del = "DELETE FROM te_grouping WHERE theme_id =" + Te2String(themeId);
+	if (!execute (del))
+		return false;
+		
+	return true;
+}
+
+bool
+TeDatabase::updateLayer(TeLayer *layer)
+{
+	if (!layer)
+		return false;
+
+	string sql;
+	sql = "UPDATE te_layer SET ";
+	sql += "name = '" + layer->name() + "' ";
+	sql += ", lower_x = " + Te2String(layer->box().x1(),15) + " ";
+	sql += ", lower_y = " + Te2String(layer->box().y1(),15) + " ";
+	sql += ", upper_x = " + Te2String(layer->box().x2(),15) + " ";
+	sql += ", upper_y = " + Te2String(layer->box().y2(),15) + " ";
+	sql += " WHERE layer_id = " + Te2String(layer->id());
+
+	if (layer->projection())
+		updateProjection(layer->projection());
+	return (this->execute (sql));
+}
+
+bool
+TeDatabase::loadLayerSet()
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return false;
+
+	string get = "SELECT * FROM te_layer";
+	if (!portal->query(get))
+	{	
+		layerMap_.clear();
+		delete portal;
+		return false;
+	}
+
+	int lid;
+	while (portal->fetchRow())
+	{
+		TeLayer* layer = 0;
+		lid = portal->getInt("layer_id");
+		
+		TeLayerMap::iterator it = layerMap_.find(lid);
+		// if layer is not in the cache yet load it in a new pointer
+		if (it == layerMap_.end())
+		{
+			layer = new TeLayer();
+			layer->id(lid);
+ 			loadLayer(layer);
+		}
+		// else just refresh the pointer
+		else
+		{
+			it->second->id(lid);
+			loadLayer(it->second);
+		}
+	}
+	delete portal;
+	return true;
+}
+
+string
+TeDatabase::getRasterTable(int layerId, const string& objectId)
+{
+	if (layerId <=0 )
+		return "";
+
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return "";
+
+	string get;
+	// get the raster representation
+	get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
+	get += " AND geom_type= " + Te2String((int)TeRASTER);
+	
+	// error executing query or no there is no raster representation 
+	if (!portal->query(get) || !portal->fetchRow())
+	{
+		delete portal;
+		return "";
+	}
+
+	string tableName = portal->getData(0);
+	portal->freeResult();
+	if (tableName.empty())
+	{
+		delete portal;
+		return "";
+	}
+
+	// check if a specific object is being looked for
+	get = "SELECT raster_table FROM " + tableName + " WHERE object_id='" + objectId + "'";
+	if (!portal->query(get) || !portal->fetchRow())
+	{
+		delete portal;
+		return "";
+	}
+	tableName = portal->getData(0);
+	delete portal;
+	return tableName;
+}
+
+
+TeRaster*
+TeDatabase::loadLayerRaster(int layerId, const string& objectId, const char& mode)
+{
+	if (layerId <=0 )
+		return 0;
+
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return 0;
+
+	TeRaster* raster = 0;
+	string get;
+	// get the raster representation
+	get = "SELECT geom_table FROM te_representation WHERE layer_id = "+Te2String(layerId);
+	get += " AND geom_type= " + Te2String((int)TeRASTER);
+	
+	// error executing query or no there is no raster representation 
+	if (!portal->query(get) || !portal->fetchRow())
+	{
+		delete portal;
+		return 0;
+	}
+
+	string tableName = portal->getData(0);
+	portal->freeResult();
+	if (tableName.empty())
+	{
+		delete portal;
+		return 0;
+	}
+
+	//--- this check is made for compatibility reasons with older terralib databases
+	TeAttributeRep	attrRep;
+	attrRep.name_ = "tiling_type";
+	attrRep.type_ = TeINT;
+		
+	TeAttribute att;
+	if(!columnExist(tableName, attrRep.name_,att))
+	{
+		addColumn (tableName, attrRep);
+		string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
+		this->execute(sql);
+	}
+
+	// ---
+
+	// check if a specific object is being looked for
+	get = "SELECT * FROM " + tableName;
+	if (!objectId.empty())
+		get += " WHERE object_id='" + objectId + "'"; 
+	if (!portal->query(get) || !portal->fetchRow())
+	{
+		delete portal;
+		return 0;
+	}
+		
+	string oid = portal->getData("object_id");
+	int geomId = portal->getInt("geom_id"); // get raster representation id
+
+	// get raster parameters from te_raster_table table
+	TeRasterParams params;
+	params.fileName_ = portal->getData("raster_table");
+	params.lutName_ = portal->getData("lut_table");
+	params.nBands(portal->getInt("num_bands"));
+	params.boundingBoxResolution(portal->getDouble("lower_x"),portal->getDouble("lower_y"),
+								 portal->getDouble("upper_x"),portal->getDouble("upper_y"),
+							     portal->getDouble("res_x"),portal->getDouble("res_y"));
+	params.blockHeight_ = portal->getInt("block_height");
+	params.blockWidth_ = portal->getInt("block_width");
+	params.tiling_type_ = static_cast<TeRasterTilingType>(portal->getInt("tiling_type"));
+
+	portal->freeResult();
+
+	// get extra information from te_raster_metadata table
+	string metadatatable = tableName + "_metadata"; 
+	unsigned int nb = params.nBands();
+	unsigned int i;
+	for (i=0; i<nb; i++)
+	{
+		get = "SELECT * FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
+		get += " AND band_id=" + Te2String(i);
+		if (portal->query(get) && portal->fetchRow()) 
+		{
+			params.vmax_[i] = portal->getDouble("max_value");
+			params.vmin_[i] = portal->getDouble("min_value");
+			params.nbitsperPixel_[i] = portal->getInt("num_bits");
+			params.dataType_[i] = TeDataType(portal->getInt("data_type"));
+			params.compression_[i] = TeCompressionMode(portal->getInt("compression_type"));
+			params.photometric_[i] = portal->getInt("photometric_type");
+		}
+		portal->freeResult();
+	}
+
+	// if raster is pallete get the associated LUT
+	if ((params.photometric_[0] == TeRASTERPALETTE) ||  
+    (params.photometric_[0] == TeRASTERKERNEL))
+		this->loadRasterLUT(&params);
+
+	// raster has the same projection as its layer
+	get = "SELECT projection_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
+	int projId; 
+	TeProjection* proj=0;
+	if (portal->query(get) && portal->fetchRow())
+	{
+		projId = portal->getInt("projection_id");
+		proj = this->loadProjection(projId);
+	}
+	portal->freeResult();
+
+	params.projection(proj);
+	if (proj)
+		delete proj;
+	params.nTilesInMemory_ = 0;
+	params.database_ = this;
+
+	bool hasDummy = false;
+
+	get = "SELECT band_id, dummy FROM " + metadatatable + " WHERE geom_id=" + Te2String(geomId);
+	get += " AND NOT (dummy IS NULL)";
+	if (portal->query(get))
+	{
+		while (portal->fetchRow())
+		{
+			int b = portal->getInt(0);
+			double d = portal->getDouble("dummy");
+			params.setDummy(d,b);
+			hasDummy = true;
+		}
+	}
+	params.useDummy_ = hasDummy;
+	params.mode_ = mode;
+	delete portal;
+
+	// builds a raster from the parameters
+	TeDecoderDatabase* dec = new TeDecoderDatabase(params);
+	dec->init();
+	raster = new TeRaster();
+	raster->setDecoder(dec);
+	raster->objectId(oid);
+	return raster;
+}
+
+bool 
+TeDatabase::loadRasterLUT(TeRasterParams* par)
+{
+	if (par->lutName_.empty())		
+		return false;
+	
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string get = "SELECT COUNT(index_id) FROM " + par->lutName_;
+	if (!portal->query(get) || !portal->fetchRow())	 // if there is no table, or table is empty
+	{
+		delete portal;
+		return false;
+	}
+	int nentries = atoi(portal->getData(0));
+	if (nentries <= 0)
+	{
+		delete portal;
+		return false;
+	}
+
+	par->setNumberPalleteEntries(nentries);
+	portal->freeResult();
+
+	get = "SELECT * FROM " + par->lutName_ + " ORDER BY index_id ASC ";
+
+	if (!portal->query(get) || !portal->fetchRow())	 // if there is no table, or table is empty
+	{
+		delete portal;
+		return false;
+	}
+	do
+	{
+		int index = atoi(portal->getData(0));
+		par->lutr_[index] = atoi(portal->getData(1));
+		par->lutg_[index] = atoi(portal->getData(2));
+		par->lutb_[index] = atoi(portal->getData(3));
+	}while (portal->fetchRow());
+
+	delete portal;
+	return true;
+}
+
+
+bool
+TeDatabase::loadLayer(TeLayer* layer)
+{
+	if (layer == 0)
+		return false;
+
+	string get;
+	if (layer->id() > 0)
+		get = "SELECT * FROM te_layer WHERE layer_id = "+  Te2String(layer->id());
+	else if (!layer->name().empty())
+		get = "SELECT * FROM te_layer WHERE name = '"+  layer->name() + "'";
+	else
+	{
+		this->errorMessage_ = "Layer procurado n�o possui nem id nem nome";
+		return false;
+	}
+
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+	{
+		this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+		return false;
+	}
+
+	if (!portal->query (get))
+	{	
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	
+	layer->id(atoi (portal->getData("layer_id")));
+	layer->name(string (portal->getData("name")));
+	layer->setLayerBox(TeBox(portal->getDouble("lower_x"),
+						portal->getDouble("lower_y"),
+						portal->getDouble("upper_x"),
+						portal->getDouble("upper_y")));
+	
+	int projId = portal->getInt("projection_id");
+	portal->freeResult();
+
+    layer->setDatabase(this);
+
+	// Load layer projection
+	TeProjection* proj = loadProjection (projId);
+	if (proj)
+		layer->setProjection (proj);
+
+	// Load layer representations
+	get = "SELECT * FROM te_representation WHERE layer_id = "+Te2String(layer->id());
+	if (portal->query (get))
+	{
+		while (portal->fetchRow())
+		{
+			TeRepresentation* repp = new TeRepresentation();
+			repp->id_ = atoi(portal->getData(0));
+			TeGeomRep g = (TeGeomRep)atoi (portal->getData(2));
+			repp->geomRep_ = g;
+			repp->tableName_ = portal->getData(3);
+			repp->description_ = portal->getData(4);
+			repp->box_ = TeBox(portal->getDouble(5),
+						portal->getDouble(6),
+						portal->getDouble(7),
+						portal->getDouble(8));
+			repp->resX_ = portal->getDouble(9);
+			repp->resY_ = portal->getDouble(10);
+			repp->nCols_ = portal->getInt(11);
+			repp->nLins_ = portal->getInt(12);
+			layer->addVectRepres(repp);
+		}
+	}
+	
+	delete portal;
+	if(!loadLayerTable(layer))
+		return false;
+
+	layerMap_[layer->id()] = layer;
+	return true; 
+}
+
+bool
+TeDatabase::loadLayerTable(TeLayer* layer)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+	{
+		this->errorMessage_ = "N�o foi poss�vel abrir portal para o banco";
+		return false;
+	}
+	
+	// Get layer tables	
+	string get =  " SELECT * FROM te_layer_table"; 
+	get += " WHERE layer_id = " + Te2String(layer->id());
+	get += " ORDER BY attr_table_type, table_id";
+
+	if (!portal->query (get))
+	{	
+		delete portal;
+		return false;
+	}
+
+	while (portal->fetchRow())
+	{
+		string tableName = portal->getData("attr_table");
+		int    tableId = portal->getInt("table_id");
+		string indexName = portal->getData("attr_link");
+
+		TeAttributeList attrList;
+		getAttributeList(tableName, attrList);
+
+		TeTable attTable(tableName,attrList,
+				         portal->getData("unique_id"), indexName,
+						 TeAttrTableType(portal->getInt("attr_table_type")));
+
+		attTable.setId(tableId);
+		attTable.attInitialTime(portal->getData("attr_initial_time"));
+		attTable.attFinalTime(portal->getData("attr_final_time"));
+		attTable.attTimeUnit(TeChronon(portal->getInt("attr_time_unit")));
+
+		layer->addAttributeTable(attTable);
+	}
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::layerExist(int layerId)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string sql = "SELECT layer_id FROM te_layer WHERE layer_id = " + Te2String(layerId);
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::layerExist(string layerName)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	layerName = TeConvertToUpperCase(layerName);
+
+	string sql = "SELECT name FROM te_layer";
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+	while (portal->fetchRow())
+	{
+		string name = portal->getData(0);
+		name = TeConvertToUpperCase(name);
+		if (layerName == name)
+		{
+			delete portal;
+			return true;
+		}
+	}
+	delete portal;
+	return false;
+}
+
+
+bool
+TeDatabase::deleteLayer(int layerId)
+{
+	//Delete attributes tables
+	if(!deleteLayerTable(layerId))
+		return false;
+
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	
+	string sql = "SELECT projection_id FROM te_layer WHERE layer_id = ";
+	sql += Te2String(layerId);
+
+	if (!portal->query(sql))
+	{	
+		delete portal;
+		return false;
+	}
+
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	string projId = portal->getData("projection_id");
+	portal->freeResult();
+
+	// Get all representations that are associated to this layer
+	sql = "SELECT * FROM te_representation WHERE layer_id = "+ Te2String(layerId);
+	if (!portal->query (sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	while (portal->fetchRow())
+	{	
+		// Save the name of the geometry table
+		string geomTable = portal->getData("geom_table");
+
+		// Delete lut table
+		TeGeomRep rep = TeGeomRep(portal->getInt("geom_type"));
+		if (rep == TeRASTER)
+		{
+			TeDatabasePortal* portal2 = this->getPortal();
+			sql = "SELECT lut_table, raster_table FROM " + geomTable;
+			string tabName;
+			if (!portal2->query (sql))
+			{
+				delete portal2;
+				continue;
+			}
+
+			while (portal2->fetchRow())
+			{
+				// remove lut table
+				tabName = portal2->getData(0);
+				if (!tabName.empty() && this->tableExist(tabName))
+				{
+					sql = "DROP TABLE " + tabName;
+					this->execute(sql);
+				}
+				// remove raster table
+				tabName = portal2->getData(1);
+				if (!tabName.empty() && this->tableExist(tabName))
+				{
+					sql = "DROP TABLE " + tabName;
+					this->execute(sql);
+				}
+			}
+			delete portal2;
+			// remove raster metadata table
+			tabName = geomTable + "_metadata";
+			if (!tabName.empty() && this->tableExist(tabName))
+			{
+				sql = "DROP TABLE " + tabName;
+				this->execute(sql);
+			}
+		}
+		if (this->tableExist(geomTable))
+		{
+			sql = "DROP TABLE " + geomTable;
+			if (!this->execute(sql) )
+			{
+				delete portal;
+				return false;
+			}
+		}
+	}
+	portal->freeResult();
+
+	if (existRelation("te_representation","fk_rep_layer_id") != TeRICascadeDeletion)
+	{
+		// Delete entries into representations table
+		sql = "DELETE FROM te_representation WHERE layer_id = " +Te2String(layerId);
+		if (!this->execute(sql) )
+		{
+			delete portal;
+			return false;
+		}
+	}
+
+	// delete layer themes
+	sql = "SELECT theme_id FROM te_theme WHERE layer_id=" + Te2String(layerId);
+	if (!portal->query (sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	int themeId;
+	while (portal->fetchRow())
+	{	
+		themeId = portal->getInt("theme_id");
+		this->deleteTheme(themeId);
+	}
+	
+	sql = "DELETE FROM te_layer WHERE layer_id=" + Te2String(layerId);
+	if (!this->execute(sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	// delete layer projection
+	sql = "DELETE FROM te_projection WHERE projection_id = "+ projId;
+	if (!this->execute(sql))
+	{	
+		delete portal;
+		return false;
+	}
+
+	// remove all the items� themes associated to the layer to be removed
+	TeThemeMap::iterator it;
+	for (it = themeMap_.begin(); it != themeMap_.end(); ++it)
+	{
+		TeTheme *theme = it->second;
+		if (theme && theme->layer() && (theme->layer()->id() == layerId))
+		{
+			themeMap_.erase(theme->id());
+			delete theme;
+		}
+	}
+
+	// delete layer and its entry in the layer map
+	TeLayer* layer = layerMap_[layerId];
+	layerMap_.erase(layerId);
+	delete layer;
+
+	delete portal;
+	return true;
+}
+
+
+bool
+TeDatabase::deleteLayerTable (int layerId, TeAttrTableType ttype)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return false;
+
+	//tables of the type 1 can be relationed with other layer ??? Conferir
+	string query = "SELECT attr_table, table_id FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
+	query += " AND attr_table_type = " + Te2String(static_cast<int>(ttype));
+	if(!portal->query(query))
+	{
+		delete portal;
+		return false;
+	}
+		
+	vector<int> tableIds;
+	string attrTable;
+	string tableId;
+	string drop;
+	while (portal->fetchRow())
+	{
+		attrTable = portal->getData(0);
+		tableId = portal->getData(1);
+		drop = "DROP TABLE " + attrTable;
+		if(!execute(drop))
+		{
+			delete portal;
+			return false;
+		}
+		tableIds.push_back(atoi(tableId.c_str()));
+
+		string del  = "DELETE FROM te_address_locator WHERE table_id = "+ tableId;
+		execute(del);
+	}
+
+	delete portal;
+	string del;
+	if (existRelation("te_tables_relation","fk_tabrelation_laytable_id") != TeRICascadeDeletion)
+	{
+		for (unsigned int i=0; i<tableIds.size();i++)
+		{
+			del = "DELETE FROM te_tables_relation WHERE relation_id = " + Te2String(tableIds[i]);
+			if (!execute (del))
+				return false;
+		}
+	}
+	del = "DELETE FROM te_layer_table WHERE layer_id = " + Te2String(layerId);
+	if (!execute (del))
+		return false;
+	return true;
+}
+
+bool 
+TeDatabase::updateRepresentation (int layerId, TeRepresentation& rep)
+{
+	if (layerId <= 0)
+		return false;
+
+	string sql;
+	sql  = "UPDATE te_representation SET ";
+	sql += " lower_x= " + Te2String(rep.box_.x1(),15);
+	sql += ", lower_y= " + Te2String(rep.box_.y1(),15);
+	sql += ", upper_x= " + Te2String(rep.box_.x2(),15);
+	sql += ", upper_y= " + Te2String(rep.box_.y2(),15);
+	sql += ", description= '" + rep.description_ + "'";
+	sql += ", res_x= " + Te2String(rep.resX_);
+	sql += ", res_y= " + Te2String(rep.resY_);
+	sql += ", num_cols=" + Te2String(rep.nCols_);
+	sql += ", num_rows=" + Te2String(rep.nLins_);
+
+	if (rep.geomRep_ != TeTEXT)
+		sql += ", geom_table='" + rep.tableName_ + "'";
+
+	sql += " WHERE layer_id=" + Te2String(layerId);
+	sql += " AND geom_type= " + Te2String(rep.geomRep_);
+
+	if (rep.geomRep_ == TeTEXT)
+		sql += " AND geom_table='" + rep.tableName_ + "'";
+
+	return this->execute(sql);
+}
+
+bool 
+TeDatabase::insertRasterGeometry(const string& tableName, TeRasterParams& par, const string& objectId)
+{
+	if (tableName.empty())
+		return false;
+	
+	string objId; 
+	if (objectId.empty())
+		objId = "O1";
+	else
+		objId = objectId;
+
+	//------ this check is made for compatibility reasons with old versions of TerraLib databases
+	TeAttributeRep	attrRep;
+	attrRep.name_ = "tiling_type";
+	attrRep.type_ = TeINT;
+		
+	TeAttribute att;
+	if(!columnExist(tableName, attrRep.name_,att))
+	{
+		addColumn (tableName, attrRep);
+		string sql = "UPDATE " + tableName + " SET tiling_type = " + Te2String(static_cast<int>(TeExpansible));
+		this->execute(sql);
+	}
+	//------
+
+	// finds the name of the raster geometry table
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return false;
+
+	TeBox box = par.boundingBox();
+
+	string ins = "INSERT INTO " + tableName + " (object_id, raster_table, lut_table, ";
+	ins += "res_x, res_y, num_bands, num_cols, num_rows, block_height, block_width, ";
+	ins += "lower_x, lower_y, upper_x, upper_y, tiling_type) ";
+	ins += " VALUES ('" + objId + "', '" + par.fileName_+ "', '" +  par.lutName_ + "', ";
+	ins += Te2String(par.resx_) + ", " + Te2String(par.resy_) + ", ";
+	ins += Te2String(par.nBands()) + ", " + Te2String(par.ncols_) + ", " + Te2String(par.nlines_) + ", ";
+	ins += Te2String(par.blockHeight_) + ", " + Te2String(par.blockWidth_) + ", ";
+	ins += Te2String(box.x1_,15) +", " + Te2String(box.y1_,15) + ", ";
+	ins += Te2String(box.x2_,15) +", " + Te2String(box.y2_,15) + ", ";
+	ins	+= Te2String(par.tiling_type_) + ")";
+	if (!this->execute(ins))
+	{
+		delete portal;
+		return false;
+	}
+
+	// save the pallete associated to the raster
+	// if it doesn�t exist yet
+	if ((par.photometric_[0] == TeRASTERPALETTE ||
+         par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty()) 
+	{
+
+		 if (!this->tableExist(par.lutName_))
+		 {
+			 if (this->createLUTTable(par.lutName_))
+			{
+				for (unsigned int i=0; i<par.lutb_.size(); i++)
+				{
+					string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
+					sql += Te2String(i) + ", ";
+					sql += Te2String(par.lutr_[i]) + ", ";
+					sql += Te2String(par.lutg_[i]) + ", ";
+					sql += Te2String(par.lutb_[i]) + ")";
+					this->execute(sql);
+				}
+			 }
+		 }
+	}
+	
+	ins = "SELECT geom_id FROM " + tableName + " WHERE object_id='" + objId + "'";
+	ins += " AND raster_table='" + par.fileName_+ "'";
+	if(!portal->query(ins) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	int geomId = atoi(portal->getData(0));
+	delete portal;
+	string 	metadataTableName = tableName+"_metadata";
+	insertRasterMetadata(metadataTableName, geomId,par);
+	 return true;
+}
+
+bool 
+TeDatabase::updateRasterRepresentation(int layerId, TeRasterParams& par, const string& objectId)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if(!portal)
+		return false;
+
+	string sql = "SELECT repres_id, lower_x, lower_y, upper_x, upper_y, geom_table ";
+	sql += " FROM te_representation WHERE layer_id= " + Te2String(layerId);
+	sql += " AND geom_type= " + Te2String(TeRASTER);
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	TeBox box (portal->getDouble(1),portal->getDouble(2),
+		       portal->getDouble(3),portal->getDouble(4));
+	int represId = atoi(portal->getData(0));
+	string rasterrep = portal->getData(5);
+	portal->freeResult();
+
+	updateBox(box,par.boundingBox());
+	sql = "UPDATE te_representation SET lower_x = " + Te2String(box.x1_,15);
+	sql += ", lower_y = " + Te2String(box.y1_,15) + ", upper_x = " + Te2String(box.x2_,15);
+	sql += ", upper_y = " + Te2String(box.y2_,15) + "  WHERE repres_id=" + Te2String(represId);
+
+	if(!execute(sql))
+	{
+		delete portal;
+		return false;
+	}	 
+
+	string objId; 
+	if (objectId.empty())
+		objId = "O1";
+	else
+		objId = objectId;
+
+	box = par.boundingBox();
+
+	sql = "UPDATE " + rasterrep + " SET lut_table ='" + par.lutName_ + "'";
+	sql += ", res_x= " + Te2String(par.resx_) + ", res_y=" + Te2String(par.resy_);
+	sql += ", num_bands=" + Te2String(par.nBands()) + ", num_cols=" + Te2String(par.ncols_);
+	sql += ", num_rows=" + Te2String(par.nlines_) + ", block_height=" +  Te2String(par.blockHeight_);
+	sql += ", block_width= " + Te2String(par.blockWidth_) + ", lower_x = " + Te2String(box.x1_,15);
+	sql += ", lower_y = " + Te2String(box.y1_,15) +  ", upper_x = " + Te2String(box.x2_,15);
+	sql += ", upper_y = " + Te2String(box.y2_,15);
+	sql += "  WHERE object_id='" + objId + "' AND raster_table='" + par.fileName_ + "'";
+	if (!this->execute(sql))
+	{
+		delete portal;
+		return false;
+	}
+	
+	sql = "SELECT geom_id FROM " + rasterrep + " WHERE object_id='" + objId + "'";
+	sql+= " AND raster_table='" + par.fileName_+ "'";
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	// save the pallete associated to the raster
+	// if it doesn�t exist yet
+	if ((par.photometric_[0] == TeRASTERPALETTE ||
+         par.photometric_[0] == TeRASTERKERNEL) && !par.lutName_.empty()) 
+	{
+
+		 if (!this->tableExist(par.lutName_))
+		 {
+			 if (this->createLUTTable(par.lutName_))
+			{
+				for (unsigned int i=0; i<par.lutb_.size(); i++)
+				{
+					string sql = "INSERT INTO " + par.lutName_ + " VALUES(";
+					sql += Te2String(i) + ", ";
+					sql += Te2String(par.lutr_[i]) + ", ";
+					sql += Te2String(par.lutg_[i]) + ", ";
+					sql += Te2String(par.lutb_[i]) + ")";
+					this->execute(sql);
+				}
+			 }
+		 }
+	}
+
+	int geomId = atoi(portal->getData(0));
+	delete portal;
+	string metadatatabel = rasterrep + "_metadata";
+	return updateRasterMetadata(metadatatabel,geomId,par);
+}
+
+bool 
+TeDatabase::insertRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
+{
+	if (geomId <= 0)
+		return false;
+	
+	string ins;
+	unsigned int i;
+
+	unsigned int nb = par.nBands();
+	ins = "INSERT INTO " + tableName + " (geom_id, band_id, min_value, max_value, ";
+	ins += " num_bits, data_type, photometric_type, compression_type ) VALUES (";
+	string vals;
+	for (i=0; i<nb; i++)
+	{
+		vals = Te2String(geomId) + ", " + Te2String(i) + ", ";
+		vals += Te2String(par.vmin_[i],15) + ", " +  Te2String(par.vmax_[i],15) + ", ";
+		vals += Te2String(par.nbitsperPixel_[i]) + ", " +  Te2String(par.dataType_[i]) + ", " ;
+		vals += Te2String(par.photometric_[i]) + ", " +  Te2String(par.compression_[i]) + " )" ;
+		string sql = ins + vals;
+		if (!this->execute(sql))
+			return false;
+	}
+
+	// update dummy value
+	if (par.useDummy_)
+	{
+		ins = "UPDATE " + tableName + " SET dummy = ";
+		for (i=0; i<nb; i++)
+		{
+			vals = Te2String(par.dummy_[i]) + " WHERE geom_id = " +  Te2String(geomId);
+			vals += " AND band_id=" + Te2String(i);
+			string sql = ins + vals;
+			if (!this->execute(sql))
+				return false;
+		}
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updateRasterMetadata (const string& tableName, int geomId, TeRasterParams& par)
+{
+	if (geomId <= 0)
+		return false;
+
+	string sql = "DELETE FROM " + tableName + " WHERE geom_id = " + Te2String(geomId);
+	if (!this->execute (sql))
+		return false;
+	return insertRasterMetadata(tableName,geomId,par);
+}
+
+bool 
+TeDatabase::updateLegend (TeLegendEntry *legend)
+{
+	if (!legend)
+		return false;
+
+	string sql;
+	if (legend->id() > 0 )
+	{
+		sql = "UPDATE te_legend SET ";
+		sql += " theme_id=" + Te2String (legend->theme());
+		sql += ",group_id=" + Te2String (legend->group());
+		sql += ",num_objs=" + Te2String (legend->count());
+		sql += ",lower_value='" + escapeSequence(legend->from())+"'";
+		sql += ",upper_value='" + escapeSequence(legend->to())+"'";
+		sql += ",label='" + escapeSequence(legend->label())+"'";
+		sql += " WHERE legend_id=" + Te2String (legend->id());
+
+		if (execute(sql) == false)
+			return false;
+	}
+	else
+	{
+		if (!insertLegend(legend))
+			return false;
+	}
+	legendMap_[legend->id()] = legend;
+
+	return updateVisual(legend);
+}
+
+bool
+TeDatabase::updateVisual(TeLegendEntry *legend)
+{
+	if (!legend)
+		return false;
+
+	TeGeomRepVisualMap mapVis = legend->getVisualMap();
+	TeGeomRepVisualMap::iterator it =  mapVis.begin();
+	while ( it != mapVis.end())
+	{ 
+			
+		TeGeomRep rep = it->first;
+		TeVisual vis = it->second;
+
+		TeColor cor = vis.color();				// filling color
+		TeColor contourCor = vis.contourColor();// contour color
+
+		string update = "UPDATE te_visual SET ";
+		update += " lib_name = '"+ vis.libName() +"', ";
+		update += "red = "+ Te2String(cor.red_) + ", ";
+		update += "green =" + Te2String(cor.green_) + ", ";
+		update += "blue =" + Te2String(cor.blue_) + ", ";
+		update += "transparency =" + Te2String(vis.transparency()) + ", ";
+
+		update += "contour_lib_name='"+ vis.contourLibName() +"', ";
+		update += "contour_red=" + Te2String(contourCor.red_) + ", ";
+		update += "contour_green=" + Te2String(contourCor.green_) + ", ";
+		update += "contour_blue=" + Te2String(contourCor.blue_) + ", "; 
+		update += "contour_transp=" + Te2String(vis.contourTransparency()) + ", ";
+		update += "contour_width=" + Te2String(vis.contourWidth()) + ", ";
+
+		if(rep == TePOLYGONS)
+		{
+			update += "width=" + Te2String(vis.contourWidth()) + ", ";
+			update += "contour_symb_id=" + Te2String(vis.contourStyle()) + ", ";
+			update += "symb_id=" + Te2String(vis.style()) + ", ";
+		}
+		else if(rep == TeLINES)
+		{
+			update += "width=" + Te2String(vis.width()) + ", ";
+			update += "symb_id=" + Te2String(vis.style()) + ", ";
+		}
+		else if(rep == TePOINTS)
+		{
+			update += "size_value=" + Te2String(vis.size()) + ", ";
+			update += "symb_id=" + Te2String(vis.style ()) + ", ";
+		}
+		else if(rep == TeTEXT)
+		{
+			update += "size_value=" + Te2String(vis.size()) + ", ";
+			update += "pt_angle=" + Te2String(vis.ptAngle()) + ", ";
+		}
+
+		update += "family='" + vis.family() + "', ";
+		if (vis.bold())
+			update += "bold=1, ";
+		else
+			update += "bold=0, ";
+
+		if (vis.italic())
+			update += "italic=1, ";
+		else
+			update += "italic=0, ";
+
+		update += "fixed_size=" + Te2String(vis.fixedSize())+ ", ";
+		update += "alignment_vert=" + Te2String(vis.alignmentVert())+ ", ";
+		update += "alignment_horiz=" + Te2String(vis.alignmentHoriz())+ ", ";
+		update += "tab_size=" + Te2String(vis.tabSize())+ ", ";
+		update += "line_space=" + Te2String(vis.lineSpace());
+
+		update += " WHERE legend_id= " + Te2String(legend->id()) ;
+		update += " AND geom_type= " + Te2String(rep);
+
+		if (!execute(update))
+			return false;
+		++it;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadLegend (TeTheme *theme)
+{
+	if (!theme)
+		return false;
+
+	unsigned int i;
+	int legId, gId, lastLegId;
+	TeGeomRep rep;
+	TeVisual visual;
+	vector<string> legIdVec;
+	map<int, TeLegendEntry> legMap;
+	map<int, TeLegendEntry>::iterator it;
+	map<int, TeLegendEntry*> ownLegMap;
+
+	theme->cleanLegend();
+
+	TeDatabasePortal* portal = getPortal();
+
+	string q = "SELECT * FROM te_legend WHERE theme_id = " + Te2String(theme->id());
+	q += " ORDER BY legend_id";
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		legId = portal->getInt("legend_id");
+		legIdVec.push_back(Te2String(legId));
+
+		TeLegendEntry& legEntry = legMap[legId];
+		legEntry.id(legId);
+		legEntry.theme(theme->id());
+		TeSlice& slice = legEntry.slice();
+		
+		gId = portal->getInt("group_id");
+		legEntry.group(gId);
+		if (gId == -10)
+		{
+			TeLegendEntry* ownLeg = new TeLegendEntry;
+			ownLegMap[legId] = ownLeg;
+		}
+
+		string lb = portal->getData("label");
+		legEntry.label(lb);
+		slice.count_ = portal->getInt("num_objs");
+		slice.from_ = portal->getData("lower_value");
+		slice.to_ = portal->getData("upper_value");
+	}
+
+	string inClause;
+	for(i = 0; i < legIdVec.size(); ++i)
+	{
+		inClause += legIdVec[i];
+		if (i != legIdVec.size() - 1)
+			inClause += ",";
+	}
+
+	portal->freeResult();
+	q = "SELECT * FROM te_visual WHERE legend_id IN (";
+	q += inClause + ") ORDER BY legend_id";
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+
+	while(portal->fetchRow())
+	{
+		legId = portal->getInt("legend_id");
+		rep = TeGeomRep(portal->getInt("geom_type"));
+		visual = portal->getVisual();
+
+		TeLegendEntry& legEntry = legMap[legId];
+		gId = legEntry.group();
+		legEntry.setVisual(visual, rep);
+
+		if (gId == -10)		// own visual
+		{
+			TeLegendEntry* ownLegend = ownLegMap[legId];
+			*ownLegend = legEntry;
+
+			if (rep == TePOLYGONS)
+				ownLegend->setVisual(visual, TePOLYGONS);
+			else if (rep == TeLINES)
+				ownLegend->setVisual(visual, TeLINES);
+			else if (rep == TePOINTS)
+				ownLegend->setVisual(visual, TePOINTS);
+			else if (rep == TeTEXT)
+				ownLegend->setVisual(visual, TeTEXT);
+
+			legendMap_[legId] = ownLegend;
+		}
+		else if(gId == -6)
+		{
+			TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
+			pointingQueryLegend = legEntry;
+
+			pointingQueryLegend.setVisual(visual, TeLINES); 
+			pointingQueryLegend.setVisual(visual, TePOINTS);
+			pointingQueryLegend.setVisual(visual, TeCELLS);
+			pointingQueryLegend.setVisual(visual, TeTEXT);  
+
+			legendMap_[legId] = &pointingQueryLegend;
+		}
+		else if(gId == -5)
+		{
+			TeLegendEntry& queryLegend = theme->queryLegend();
+			queryLegend = legEntry;
+
+			queryLegend.setVisual(visual, TeLINES); 
+			queryLegend.setVisual(visual, TePOINTS);
+			queryLegend.setVisual(visual, TeCELLS);
+			queryLegend.setVisual(visual, TeTEXT); 
+
+			legendMap_[legId] = &queryLegend;
+		}
+		else if(gId == -4)
+		{
+			TeLegendEntry& pointingLegend = theme->pointingLegend();
+			pointingLegend = legEntry;
+
+			pointingLegend.setVisual(visual, TeLINES); 
+			pointingLegend.setVisual(visual, TePOINTS);
+			pointingLegend.setVisual(visual, TeCELLS);
+			pointingLegend.setVisual(visual, TeTEXT);  
+
+			legendMap_[legId] = &pointingLegend;
+		}
+		else if(gId == -3)
+		{
+			TeLegendEntry& defaultLegend = theme->defaultLegend();
+			defaultLegend = legEntry;
+			legendMap_[legId] = &defaultLegend;
+
+			// Make the pointing visual equal to the default visual, excluding
+			// the pointing color 
+			TeColor color;
+			TeLegendEntry& pointingLegend = theme->pointingLegend();
+			TeVisual& pointingVisual = pointingLegend.visual(rep);
+			color = pointingVisual.color();
+			pointingLegend.setVisual(visual, rep);
+			pointingVisual.color(color);
+
+			// Make the query visual equal to the default visual, excluding
+			// the query color 
+			TeLegendEntry& queryLegend = theme->queryLegend();
+			TeVisual& queryVisual = queryLegend.visual(rep);
+			color = queryVisual.color();
+			queryLegend.setVisual(visual, rep);
+			queryVisual.color(color);
+
+			// Make the pointingQuery visual equal to the default visual, excluding
+			// the pointingQuery color 
+			TeLegendEntry& pointingQueryLegend = theme->queryAndPointingLegend();
+			TeVisual& pointingQueryVisual = pointingQueryLegend.visual(rep);
+			color = pointingQueryVisual.color();
+			pointingQueryLegend.setVisual(visual, rep);
+			pointingQueryVisual.color(color);
+		}
+		else if(gId == -2)
+		{
+			TeLegendEntry& withoutDataConnectionLegend = theme->withoutDataConnectionLegend();
+			withoutDataConnectionLegend = legEntry;
+			legendMap_[legId] = &withoutDataConnectionLegend;
+		}
+		else if(gId == -1)
+		{
+			TeLegendEntry& outOfCollectionLegend = theme->outOfCollectionLegend();
+			outOfCollectionLegend = legEntry;
+			legendMap_[legId] = &outOfCollectionLegend;
+		}
+		else if (gId > -1)
+		{
+			TeLegendEntryVector& legendEntryVector = theme->legend();
+			if (legendEntryVector.empty() == true)
+				legendEntryVector.push_back(legMap[legId]);
+			else
+			{
+				if (legId != lastLegId)
+					legendEntryVector.push_back(legMap[legId]);
+				else
+				{
+					legendEntryVector.pop_back();
+					legendEntryVector.push_back(legMap[legId]);				
+				}
+			}
+			lastLegId = legId;
+		}
+	}
+
+	TeLegendEntryVector& legVector = theme->legend();
+	for (i = 0; i < legVector.size(); ++i)
+		legendMap_[legVector[i].id()] = &legVector[i];
+
+	delete portal;
+	return true;
+}
+
+
+bool 
+TeDatabase::updateProjection (TeProjection *proj)
+{
+	if (proj->id() <= 0)
+		return false;
+	string sql;
+	sql = "UPDATE te_projection SET ";
+	sql += "name='" + proj->name() + "',";
+	sql += " long0=" + Te2String(proj->params().lon0*TeCRD,15)+ ",";
+	sql += " lat0=" + Te2String(proj->params().lat0*TeCRD,15) + ",";
+	sql += " offx=" +Te2String(proj->params().offx,15) + ",";
+	sql += " offy=" +Te2String(proj->params().offy,15) + ",";
+	sql += " stlat1="+ Te2String(proj->params().stlat1*TeCRD,15) + ",";
+	sql += " stlat2=" +Te2String(proj->params().stlat2*TeCRD,15) + ",";
+	sql += " unit='" + proj->params().units + "',";
+	sql += " scale=" + Te2String(proj->params().scale) + ",";
+	sql += " hemis=" + Te2String(proj->params().hemisphere) + ",";
+	sql += " datum='" + proj->datum().name() + "',";
+	sql += " radius=" + Te2String(proj->datum().radius(),15) + ",";
+	sql += " flattening=" + Te2String(proj->datum().flattening(),15) + ",";
+	sql += " dx=" + Te2String(proj->datum().xShift(),15) + ",";
+	sql += " dy=" + Te2String(proj->datum().yShift(),15) + ",";
+	sql += " dz=" + Te2String(proj->datum().zShift(),15) ;
+	sql += " WHERE projection_id = " + Te2String(proj->id());
+	return this->execute(sql);
+}
+
+TeProjection* 
+TeDatabase::loadProjection (int projId)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	string sql ="SELECT * FROM te_projection WHERE projection_id = " + Te2String (projId);
+
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return 0;
+	}
+
+	// Look for the projection
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return 0;
+	}
+
+	TeDatum datum (	portal->getData("datum"),
+					portal->getDouble("radius"),
+					portal->getDouble("flattening"),
+					portal->getDouble("dx"),
+					portal->getDouble("dy"),
+					portal->getDouble("dz"));
+
+	TeProjectionParams mProjPars;
+	mProjPars.datum = datum;
+	mProjPars.name = portal->getData("name");
+	mProjPars.lat0 = portal->getDouble("lat0")*TeCDR;
+	mProjPars.lon0 = portal->getDouble("long0")*TeCDR;
+	mProjPars.offx = portal->getDouble("offx");
+	mProjPars.offy = portal->getDouble("offy");
+	mProjPars.stlat1 = portal->getDouble("stlat1")*TeCDR;
+	mProjPars.stlat2 = portal->getDouble("stlat2")*TeCDR;
+	mProjPars.units = portal->getData("unit");
+	mProjPars.scale = portal->getDouble("scale");
+	mProjPars.hemisphere = (TeHemisphere)portal->getInt("hemis");
+
+	TeProjection* proj = TeProjectionFactory::make(mProjPars);
+	delete portal;
+	proj->id(projId);
+	return proj;
+}
+
+bool
+TeDatabase::insertPolygonSet(const string& table, TePolygonSet &ps)
+{
+	for (unsigned int i = 0; i < ps.size(); i++ )
+	{
+		TePolygon poly = ps [i];
+		if (!insertPolygon (table,poly))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updatePolygonSet (const string& table, TePolygonSet &ps)
+{
+ 	for (unsigned int i = 0; i < ps.size(); i++ )
+	{
+		TePolygon poly = ps [i];
+		if (!updatePolygon (table,poly))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	string sql ="SELECT * FROM " + table;
+	if (!criteria.empty())
+		sql += " WHERE " + criteria;
+	sql += " ORDER BY object_id ASC, parent_id, num_holes DESC, ext_max ASC";
+	 
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::loadPointSet(TeTheme* theme, TePointSet &ps)
+{
+	string collTable = theme->collectionTable();
+	if (collTable.empty())
+		return false;
+
+	TeLayer* themeLayer = theme->layer();
+	if (!themeLayer->hasGeometry(TePOINTS))
+		return false;
+	
+	string pointTable = themeLayer->tableName(TePOINTS);
+	if (pointTable.empty())
+		return false;
+
+	string sql = "SELECT * FROM (" + pointTable + " RIGHT JOIN " + collTable;
+	sql = sql + " ON " + pointTable + ".object_id = " + collTable + ".object_id)";
+
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	if (!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do {
+		TePoint pt;
+		flag =  portal->fetchGeometry(pt);
+		ps.add(pt);
+	}
+	while (flag);
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::loadLineSet(TeTheme* theme, TeLineSet &ls)
+{
+	string collTable = theme->collectionTable();
+	if (collTable.empty())
+		return false;
+
+	TeLayer* themeLayer = theme->layer();
+	if (!themeLayer->hasGeometry(TeLINES))
+		return false;
+	
+	string lineTable = themeLayer->tableName(TeLINES);
+	if (lineTable.empty())
+		return false;
+
+	string sql = "SELECT * FROM (" + lineTable + " RIGHT JOIN " + collTable;
+	sql = sql + " ON " + lineTable + ".object_id = " + collTable + ".object_id)";
+
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	if (!portal->query(sql)  || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag;
+	do 
+	{
+		TeLine2D lin;
+		flag = portal->fetchGeometry(lin);
+		ls.add(lin);
+	}while(flag);
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::loadPolygonSet (const string& table, const string& geoid, TePolygonSet &ps)
+{
+	
+	TeDatabasePortal *portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+
+	if (!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+	q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+	if (!portal->query(q))
+	{	
+		delete portal;
+		return false;
+	}
+
+	if (!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add(poly);
+	}
+	while (flag);
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::loadPolygonSet (const string& table, TeBox &bb, TePolygonSet &polSet)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (bb, TePOLYGONS);
+	q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		polSet.add(poly);
+	}
+	while (flag);
+	delete portal;
+	return true;
+}
+
+TeDatabasePortal* 
+TeDatabase::loadPolygonSet(const string& table, TeBox &box)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return 0;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (box, TePOLYGONS);
+	q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return 0;
+	}
+	else 
+		return portal;
+}
+
+
+bool 
+TeDatabase::locatePolygon (const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),15);
+	q += " AND upper_x > " + Te2String(box.x1(),15);
+	q += " AND lower_y < " + Te2String(box.y2(),15);
+	q += " AND upper_y > " + Te2String(box.y1(),15);
+	q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		if (TeWithin (TePoint(pt), poly))
+		{
+			polygon = poly;
+			delete portal;
+			return true;
+		}
+	}
+	while (flag);
+	delete portal;
+	return false;
+}
+
+
+bool 
+TeDatabase::locatePolygonSet (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE lower_x < " + Te2String(box.x2(),6);
+	q += " AND upper_x > " + Te2String(box.x1(),6);
+	q += " AND lower_y < " + Te2String(box.y2(),6);
+	q += " AND upper_y > " + Te2String(box.y1(),6);
+	q += " ORDER BY parent_id, num_holes DESC, ext_max ASC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	polygons.clear();
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		if (TeWithin (TePoint(pt), poly))
+			polygons.add(poly);
+	}
+	while (flag);
+	delete portal;
+
+	if(polygons.size())
+		return (true);
+	return false;
+}
+
+
+bool 
+TeDatabase::loadPolygonSet(TeTheme* theme, TePolygonSet &ps)
+{
+	string collTable = theme->collectionTable();
+	if (collTable.empty())
+		return false;
+
+	TeLayer* themeLayer = theme->layer();
+	if (!themeLayer->hasGeometry(TePOLYGONS))
+		return false;
+	
+	string polygonTable = themeLayer->tableName(TePOLYGONS);
+	if (polygonTable.empty())
+		return false;
+
+	string sql = "SELECT * FROM (" + polygonTable + " RIGHT JOIN " + collTable;
+	sql = sql + " ON " + polygonTable + ".object_id = " + collTable + ".object_id)";
+	sql += " ORDER BY " + polygonTable + ".parent_id, ";
+	sql += polygonTable + ".num_holes DESC, " + polygonTable + ".ext_max ASC";
+
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	if (!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+		ps.add ( poly );
+	}
+	while (flag);		
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::insertLineSet	(const string& table, TeLineSet &ls)
+{
+	for (unsigned int i = 0; i < ls.size(); i++ )
+	{
+		TeLine2D line = ls [i];
+		if (!insertLine (table,line))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updateLineSet	(const string& table, TeLineSet &ls)
+{
+	for (unsigned int i = 0; i < ls.size(); i++ )
+	{
+		TeLine2D line = ls [i];
+		if (!updateLine (table,line))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadLineSet (const string& table, const string& geoid, TeLineSet &ls)
+{
+	TeDatabasePortal *portal = this->getPortal();
+
+	string q ="SELECT * FROM " + table;
+
+	if (!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+
+	q += " ORDER BY ext_max DESC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do 
+	{
+		TeLine2D line;
+		flag = portal->fetchGeometry(line);
+		ls.add ( line );
+	}while(flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::loadLineSet (const string& table, TeBox &bb, TeLineSet &linSet)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (bb, TeLINES);
+	q += " ORDER BY ext_max DESC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TeLine2D lin;
+		flag = portal->fetchGeometry(lin);
+		linSet.add(lin);
+	}
+	while (flag);
+	delete portal;
+	return true;
+}
+
+TeDatabasePortal* 
+TeDatabase::loadLineSet (const string& table, TeBox &box)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return 0;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (box, TeLINES);
+	q += " ORDER BY ext_max DESC";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return 0;
+	}
+	return portal;
+}
+
+bool 
+TeDatabase::selectLineSet (const string& table, const string& criteria, TeLineSet &ls)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+	if (!criteria.empty())
+		q += " WHERE " + criteria;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do 
+	{
+		TeLine2D line;
+		flag = portal->fetchGeometry(line);
+		ls.add ( line );
+	}while(flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::locateLine (const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	// Get all lines
+	TeLineSet ls;
+	int k;
+	bool flag = true;
+	do 
+	{
+		TeLine2D l;
+		flag = portal->fetchGeometry( l );
+		ls.add ( l );
+	} while (flag);
+
+	delete portal;
+
+	TeCoord2D paux;
+
+	if (TeNearest (pt, ls, k, paux, tol))
+	{
+		line = ls[k];
+		return true;
+	}
+	return false;
+}
+
+bool 
+TeDatabase::insertPointSet	(const string& table, TePointSet &ps)
+{
+	for (unsigned int i = 0; i < ps.size(); i++ )
+	{
+		TePoint point = ps [i];
+		if (!insertPoint (table,point))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updatePointSet (const string& table, TePointSet &ps)
+{
+	for (unsigned int i = 0; i < ps.size(); i++ )
+	{
+		TePoint point = ps [i];
+		if (!updatePoint (table,point))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadPointSet (const string& table, const string& geoid, TePointSet &ps)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+
+	if (!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	do 
+	{
+		TePoint point;
+		flag = portal->fetchGeometry (point);
+		ps.add ( point );
+	}while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::loadPointSet (const string& table, TeBox &bb, TePointSet &ps)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (bb, TePOINTS);
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return false;
+	}
+	bool flag = true;
+	do
+	{
+		TePoint pt;
+		flag = portal->fetchGeometry(pt);
+		ps.add(pt);
+	}
+	while (flag);
+	delete portal;
+	return true;
+}
+
+TeDatabasePortal* 
+TeDatabase::loadPointSet(const string& table, TeBox &box)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	if (!portal)
+		return 0;
+
+	string q;
+	q = "SELECT * FROM " + table + " WHERE ";
+	q += this->getSQLBoxWhere (box, TePOINTS);
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{	
+		delete portal;
+		return 0;
+	}
+	return portal;
+}
+
+bool 
+TeDatabase::selectPointSet (const string& table, const string& criteria, TePointSet &ps)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+	if (!criteria.empty())
+		q += " WHERE " + criteria;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	do 
+	{
+		TePoint point;
+		flag = portal->fetchGeometry (point);
+		ps.add ( point );
+	}while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::locatePoint (const string& table, TeCoord2D &pt, TePoint &point, const double& tol)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	TePointSet ps;
+	bool flag = true;
+	do 
+	{
+		TePoint point;
+		flag = portal->fetchGeometry (point);
+		ps.add ( point );
+	}while (flag);
+
+	delete portal;
+	int k;
+	if (TeNearest (pt, ps, k, tol))
+	{
+		point = ps[k];
+		return true;
+	}
+	return false;
+}
+
+bool 
+TeDatabase::insertTextSet	(const string& table, TeTextSet &ts)
+{
+	for (unsigned int i = 0; i < ts.size(); i++ )
+	{
+		TeText text = ts [i];
+		if (!insertText (table,text))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updateTextSet	(const string& table, TeTextSet &ts)
+{
+	for ( unsigned int i = 0; i < ts.size(); i++ )
+	{
+		TeText text = ts [i];
+		if (!updateText (table,text))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadTextSet (const string& table, const string& geoid, TeTextSet &ts)
+{
+	TeDatabasePortal *portal = this->getPortal();
+	
+	string q ="SELECT * FROM " + table;
+	if (!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	// Look for all texts
+	bool flag  = true;
+	do
+	{
+		TeText p;
+		flag = portal->fetchGeometry(p);
+		ts.add ( p );
+	} while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::selectTextSet (const string& table, const string& criteria, TeTextSet &ts)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+	if (!criteria.empty())
+		q += " WHERE " + criteria;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	// Look for all texts
+	bool flag = true;
+	do
+	{
+		TeText p;
+		flag = portal->fetchGeometry(p);
+		ts.add ( p );
+	} while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::updateText(const string& table, TeText &t)
+{
+	string sql;
+	sql = "UPDATE " + table + " SET ";
+    sql += "x=" + Te2String(t.location().x(),10) + ", ";
+	sql += "y=" + Te2String(t.location().y(),10) + ", ";
+	sql += "text_value='" + t.textValue() + "', ";
+	sql += "angle=" + Te2String(t.angle(),5) + ", ";
+	sql += "height=" + Te2String(t.height(),5) + ",";
+	sql += "alignment_vert=" + Te2String(t.alignmentVert(),5) + ",";
+	sql += "alignment_horiz=" + Te2String(t.alignmentHoriz(),5);
+    sql += " WHERE geom_id=" + Te2String(t.geomId());
+	return (this->execute(sql));
+}
+
+bool 
+TeDatabase::updateNode(const string& table, TeNode &node)
+{
+	string sql;
+	sql = "UPDATE " + table + " SET ";
+    sql += "x=" + Te2String(node.location().x(),10) + ", ";
+	sql += "y=" + Te2String(node.location().y(),10) + ", ";
+    sql += " WHERE geom_id = " + Te2String(node.geomId());
+	return (this->execute(sql));
+}
+
+bool 
+TeDatabase::updatePoint(const string& table, TePoint &p)
+{
+	string sql;
+	sql = "UPDATE " + table + " SET ";
+    sql += "x=" + Te2String(p.location().x(),10) + ", ";
+	sql += "y=" + Te2String(p.location().y(),10) + ", ";
+    sql += " WHERE geom_id = " + Te2String(p.geomId());
+	return (this->execute(sql));
+}
+
+bool TeDatabase::locateText (const string& table, TeCoord2D &pt, TeText &text, const double& tol)
+{
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	// Look for all texts
+	bool flag = true;
+	TeTextSet ts;
+	do
+	{
+		TeText p;
+		flag = portal->fetchGeometry(p);
+		ts.add ( p );
+	} while (flag);
+
+	delete portal;
+
+	int k;
+	if (TeNearest (pt, ts, k, tol))
+	{
+		text = ts[k];
+		return true;
+	}
+	return false;
+}
+
+bool 
+TeDatabase::insertArcSet	(const string& table, TeArcSet &as)
+{
+	for (unsigned int i = 0; i < as.size(); i++ )
+	{
+		TeArc arc = as [i];
+		if (!insertArc (table,arc))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updateArcSet	(const string& table, TeArcSet &as)
+{
+	for ( unsigned int i = 0; i < as.size(); i++ )
+	{
+		TeArc arc = as [i];
+		if (!updateArc (table,arc))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadArcSet (const string& table, const string& geoid, TeArcSet &as)
+{
+
+	TeDatabasePortal* portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+	if (!geoid.empty())
+		q += " WHERE object_id = " + geoid;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	// Look for all nodes
+	bool flag;
+	do 
+	{
+		TeArc arc;
+		flag = portal->fetchGeometry(arc);
+		as.add (arc);
+	} while (flag);
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::updateArc	(const string& /*table */, TeArc &arc)
+{
+	string sql;
+	sql = "UPDATE table  SET ";
+    sql += "from_node=" + Te2String(arc.fromNode().geomId()) + ", ";
+	sql += "to_node=" + Te2String(arc.toNode().geomId()) + ", ";
+    sql += " WHERE object_id = " + arc.geomId();
+	return (this->execute(sql));
+}
+
+bool 
+TeDatabase::insertNodeSet	(const string& table, TeNodeSet &ns)
+{
+	for (unsigned int i = 0; i < ns.size(); i++ )
+	{
+	     TeNode no = ns [i];
+	     if (!insertNode (table,no))
+		return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::updateNodeSet	(const string& table, TeNodeSet &ns)
+{
+	for (unsigned int i = 0; i < ns.size(); i++ )
+	{
+		TeNode no = ns [i];
+		if (!updateNode (table,no))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadNodeSet (const string& table, const string& geoid, TeNodeSet &ns)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+	if (!geoid.empty())
+		q += " WHERE object_id = " + geoid;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag = true;
+	do 
+	{
+		TeNode n;
+		flag = portal->fetchGeometry(n);
+		ns.add ( n );
+	}while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::insertCellSet	(const string& table, TeCellSet &cs)
+{
+	for (unsigned int i = 0; i < cs.size(); i++ )
+	{
+		TeCell cell = cs [i];
+		if (!insertCell (table,cell))
+			return false;
+	}
+	return true;
+}
+
+bool
+TeDatabase::updateCellSet	(const string& table, TeCellSet &cs)
+{
+	for (unsigned int i = 0; i < cs.size(); i++ )
+	{
+		TeCell cell = cs [i];
+		if (!updateCell (table,cell))
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeDatabase::loadCellSet (const int& layerId, const string& table, const string& geoid, TeCellSet &cs)
+{
+
+	TeDatabasePortal *portal = this->getPortal();
+
+	// Get the cell set resolution
+	string q  = "SELECT * FROM te_representation WHERE layer_id = " + Te2String(layerId);
+	q += " AND geom_type = " + Te2String(TeCELLS);
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	cs.resX(portal->getDouble("res_x"));
+	cs.resY(portal->getDouble("res_y"));
+	
+	portal->freeResult();
+		
+	q = "SELECT * FROM " + table;
+	if (!geoid.empty())
+		q += " WHERE object_id = '" + geoid +"'";
+	q += " ";
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag;
+	do 
+	{
+		TeCell cell;
+		flag = portal->fetchGeometry(cell);
+		cs.add ( cell );
+	} while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::selectCellSet (const int& layerId, const string& table, const string& criteria, TeCellSet &cs)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	string q = "SELECT * FROM te_representation WHERE layer_id = " ;
+	q += Te2String(layerId) + " AND geom_type = " + Te2String(TeCELLS);
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	cs.resX(portal->getDouble("res_x"));
+	cs.resY(portal->getDouble("res_y"));
+	portal->freeResult();
+	
+	q ="SELECT * FROM " + table;
+	if (!criteria.empty())
+		q += " WHERE " + criteria;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	bool flag;
+	do 
+	{
+		TeCell cell;
+		flag = portal->fetchGeometry(cell);
+		cs.add ( cell );
+	} while (flag);
+
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::updateCell(const string& /* table */, TeCell &c)
+{
+	TeBox b = c.box();
+
+	string sql;
+	sql = "UPDATE table  SET ";
+	sql += "lower_x=" + Te2String(b.lowerLeft().x(),15) + ", ";
+	sql += "lower_y=" + Te2String(b.lowerLeft().y(),15) + ", ";
+	sql += "upper_x=" + Te2String(b.upperRight().x(),15) + ", ";
+	sql += "upper_y=" + Te2String(b.upperRight().y(),15) + ", ";
+	sql += "col_number=" + Te2String(c.column()) + ", ";
+	sql += "row_number=" + Te2String(c.line());
+	sql += " WHERE geom_id = " + c.geomId();
+	return (this->execute(sql));
+}
+
+bool 
+TeDatabase::locateCell (const string& table, TeCoord2D &pt, TeCell &cell, const double& /* tol */)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
+		pt.x(),pt.x(),pt.y(),pt.y());
+	q += buf;
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	portal->fetchGeometry(cell);
+	delete portal;
+	return true;
+}
+
+bool
+TeDatabase::inClauseValues(const string& query, const string& /* attribute */, vector<string>& inClauseVector)
+{
+	inClauseVector.push_back( "(" + query + ")" );
+	return true;
+}
+
+//Spatial query
+//retornam um portal
+
+bool 
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+	return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, portal, relate, actCollTable));
+}
+
+bool 
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, int relate, const string& visCollTable)
+{
+	return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, portal, relate, visCollTable));
+}
+
+bool 
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, TeDatabasePortal *portal, int relate, const string& actCollTable)
+{
+	return (TeTopologicalRelation(actGeomTable, actRep, geom, portal, relate, actCollTable));
+}
+
+//retornam um vetor de object_ids resultantes da consulta
+bool 
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+	return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, actIdsOut, this, relate, actCollTable));
+}
+
+bool 
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, const string& visCollTable)
+{
+	return (TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, visIdsOut, this, relate, visCollTable));
+}
+
+bool 
+TeDatabase::spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, Keys& actIdsOut, int relate, const string& actCollTable)
+{
+	return (TeTopologicalRelation(actGeomTable, actRep, geom, actIdsOut, this, relate, actCollTable));
+}
+
+//metric functions
+bool
+TeDatabase::calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &area)
+{
+	return (TeGetArea(actGeomTable, actRep, actIdsIn, this, area));
+}
+
+bool 
+TeDatabase::calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn , double& length )
+{
+	return (TeGetLength(actGeomTable, actRep, actIdsIn, this, length));
+}
+
+bool 
+TeDatabase::calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance)
+{
+	return (TeGetDistance(actGeomTable, actRep, Ids, this, distance));
+}
+
+bool 
+TeDatabase::calculateDistance(const string& /* actGeomTable */, TeGeomRep /*actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, double& /* distance */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& coord, KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable)
+{
+	return (TeGetWithinDistance(actGeomTable, actRep, coord, IdsDistOut, this, max_distance, actCollTable));
+}
+
+// functions that generate new geometry
+bool 
+TeDatabase::Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist)
+{
+	return (TeGetBuffer(actGeomTable, actRep, actIds, this, bufferSet, dist));
+}
+
+bool 
+TeDatabase::Centroid(const string&  actGeomTable , TeGeomRep actRep, TePointSet& centroidSet, Keys actIds, const string& actCollTable)
+{
+	return (TeGetCentroid(actGeomTable, actRep, this, centroidSet, actIds, actCollTable));
+}
+
+bool 
+TeDatabase::ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet)
+{
+	return (TeGetConvexHull(actGeomTable, actRep, actIds, this, convexHullSet));
+}
+
+bool 
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, Keys& /* actIdsOut */, int /* numRes */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, Keys& /* visIdsOut */, int /* numRes */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, const string& /* actCollTable */, TeGeomRep /* actRep */, const string& /* objId1 */, TeDatabasePortal* /* portal */, int /* numRes */)
+{
+	return false;
+}
+	
+bool 
+TeDatabase::nearestNeighbors(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, const string& /* visCollTable */, TeGeomRep /* visRep */, TeDatabasePortal* /* portal */, int /* numRes */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
+{
+	return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeINTERSECTION));
+}
+	
+bool 
+TeDatabase::geomIntersection(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, const string& objId2, TeGeometryVect& geomVect)
+{
+	Keys actIds;
+	actIds.push_back(objId1);
+	actIds.push_back(objId2);
+
+	return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeDIFFERENCE));
+
+}
+
+bool 
+TeDatabase::geomDifference(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::geomUnion(const string&  actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect)
+{
+    return (TeGetOverlay(actGeomTable, actRep, actIds, this, geomVect, TeUNION));
+}
+
+bool 
+TeDatabase::geomUnion(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+	return false;
+}
+
+bool 
+TeDatabase::geomXOr(const string& /* actGeomTable */, TeGeomRep /* actRep */, const string& /* objId1 */, const string& /* visGeomTable */, TeGeomRep /* visRep */, const string& /* objId2 */, TeGeometryVect& /* geomVect */)
+{
+	return false;
+}
+
+// Operation with Image
+
+bool 
+TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, Keys& Ids, TeObjectStatistics& result)
+{
+	TeDatabasePortal* portal=getPortal();
+	if (!portal)
+		return false;
+	
+	//recuperar o raster!!!
+	string sql = "SELECT layer_id FROM te_representation";
+	sql += " WHERE geom_table = '" + rasterTable +"'";
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	int layerId = atoi(portal->getData(0));
+	TeRaster* raster = loadLayerRaster(layerId);
+
+	//recuperar as geometrias
+	portal->freeResult();
+	
+	string objIds = getStringIds(Ids);
+	sql = "SELECT * FROM "+ actGeomTable;
+	sql+= " WHERE object_id IN ("+ objIds +")";
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+
+		TeStatisticsDimensionVect st;
+
+		TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
+		TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
+	
+		if(!TeCalculateStatistics (itBegin, itEnd, st))
+		{
+			delete portal;
+			return false;
+		}
+	
+		result[poly.objectId()] = st;
+
+	}while (flag);
+
+	
+	delete raster;
+	delete portal;
+	return true;
+}
+	
+bool 
+TeDatabase::Zonal(const string& rasterTable, const string& actGeomTable, const string& actCollTable, TeObjectStatistics& result)
+{
+	TeDatabasePortal* portal=getPortal();
+	if (!portal)
+		return false;
+	
+	//recuperar o raster
+	string sql = "SELECT layer_id FROM te_representation";
+	sql += " WHERE geom_table = '" + rasterTable +"'";
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	int layerId = atoi(portal->getData(0));
+	TeRaster* raster = loadLayerRaster(layerId);
+
+	//recuperar as geometrias
+	portal->freeResult();
+	
+	sql = "SELECT * FROM "+ actGeomTable;
+
+	if(!actCollTable.empty())
+	{
+		sql += " ,"+ actCollTable;
+		sql += " WHERE object_id = c_object_id ";
+	}
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	do
+	{
+		TePolygon poly;
+		flag = portal->fetchGeometry(poly);
+
+		TeStatisticsDimensionVect st;
+		
+		TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
+		TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
+	
+		if(!TeCalculateStatistics (itBegin, itEnd, st))
+		{
+			delete portal;
+			return false;
+		}
+		result[poly.objectId()] = st;
+
+	}while (flag);
+
+	
+	delete raster;
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::Zonal(const string& rasterTable, TePolygon& poly, TeStatisticsDimensionVect& result)
+{
+	TeDatabasePortal* portal=getPortal();
+	if (!portal)
+		return false;
+	
+	//recuperar o raster!!!
+	string sql = "SELECT layer_id FROM te_representation";
+	sql += " WHERE geom_table = '" + rasterTable +"'";
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	int layerId = atoi(portal->getData(0));
+	TeRaster* raster = loadLayerRaster(layerId);
+
+	delete portal;
+
+	TeRaster::iteratorPoly itBegin = raster->begin(poly, TeBoxPixelIn);
+	TeRaster::iteratorPoly itEnd = raster->end(poly, TeBoxPixelIn);
+	
+	if(!TeCalculateStatistics (itBegin, itEnd, result))
+		return false;
+
+	delete raster;
+	return true;
+}
+
+
+bool 
+TeDatabase::Mask(const string& rasterTable, const string& actGeomTable, const string& objId, const string& nameLayerOut, TeStrategicIterator st)
+{
+	TeDatabasePortal* portal=getPortal();
+	if (!portal)
+		return false;
+	
+	//recuperar o raster!!!
+	string sql = "SELECT layer_id FROM te_representation";
+	sql += " WHERE geom_table = '" + rasterTable +"'";
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	int layerId = atoi(portal->getData(0));
+	TeRaster* raster = loadLayerRaster(layerId);
+
+	//recuperar a geometria
+	portal->freeResult();
+	
+	sql = "SELECT * FROM "+ actGeomTable;
+	sql+= " WHERE object_id = '" + objId + "'"; 
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	TePolygon poly;
+	portal->fetchGeometry(poly);
+
+	TeRaster* rasterOut = TeMask (raster, poly, st);
+	TeRasterParams param = rasterOut->params();	
+
+	TeBox b = param.boundingBox();
+	TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
+	bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
+
+	delete raster;
+	delete rasterOut;
+	delete portal;
+	return status;
+}
+
+
+
+bool
+TeDatabase::Mask(const string& rasterTable, TePolygon& poly, const string& nameLayerOut, TeStrategicIterator st)
+{
+	TeDatabasePortal* portal=getPortal();
+	if (!portal)
+		return false;
+	
+	//recuperar o raster!!!
+	string sql = "SELECT layer_id FROM te_representation";
+	sql += " WHERE geom_table = '" + rasterTable +"'";
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	int layerId = atoi(portal->getData(0));
+	TeRaster* raster = loadLayerRaster(layerId);
+
+	delete portal;
+
+	TeRaster* rasterOut = TeMask (raster, poly, st);
+	TeRasterParams param = rasterOut->params();	
+
+	TeBox b = param.boundingBox();
+	TeLayer* layer = new TeLayer(nameLayerOut,this, b , rasterOut->projection());
+	bool status = TeImportRaster(layer,rasterOut, param.blockWidth_, param.blockHeight_, param.compression_[0]);
+	
+	delete raster;
+	delete rasterOut;
+	return status;
+}
+
+
+string
+TeDatabase::getSQLBoxWhere (TeBox &box, TeGeomRep rep)
+{
+	string wherebox;
+	string lowerX, lowerY, upperX, upperY;
+	if(rep == TePOLYGONS || rep == TeLINES || rep == TeCELLS || rep == TeRASTER)
+	{
+		lowerX = "lower_x";
+		lowerY = "lower_y";
+		upperX = "upper_x";
+		upperY = "upper_y";
+	}
+	else if(rep == TePOINTS || rep == TeTEXT)
+	{
+		lowerX = "x";
+		lowerY = "y";
+		upperX = "x";
+		upperY = "y";
+	}
+
+	wherebox = "NOT("+ lowerX +" >= " + Te2String(box.x2_, 12) + " OR ";
+	wherebox += upperX +" <= " + Te2String(box.x1_, 12) + " OR ";
+	wherebox += lowerY +" >= " + Te2String(box.y2_, 12) + " OR ";
+	wherebox += upperY +" <= " + Te2String(box.y1_, 12) + ")";
+		
+	return wherebox;
+}
+
+
+string 
+TeDatabase::getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep /* rep1 */)
+{
+	string wherebox;
+
+	if(rep2 == TePOLYGONS || rep2 == TeLINES || rep2 == TeCELLS || rep2 == TeRASTER)
+	{
+		wherebox = " NOT( ";
+		wherebox += table2 +".lower_x > "+ table1 +".upper_x  OR ";
+		wherebox += table2 +".upper_x < "+ table1 +".lower_x  OR ";
+		wherebox += table2 +".lower_y > "+ table1 +".upper_y  OR ";
+		wherebox += table2 +".upper_y < "+ table1 +".lower_y )";
+	}
+	else if(rep2 == TePOINTS || rep2 == TeTEXT)
+	{
+		wherebox = " NOT( ";
+		wherebox += table2 +".x > "+ table1 +".upper_x  OR ";
+		wherebox += table2 +".x < "+ table1 +".lower_x  OR ";
+		wherebox += table2 +".y > "+ table1 +".upper_y  OR ";
+		wherebox += table2 +".y < "+ table1 +".lower_y )";
+	}
+	
+	return wherebox;
+}
+
+
+string 
+TeDatabase::getSQLBoxSelect (const string& tableName, TeGeomRep /* rep */)
+{
+	string sql = tableName +".* ";
+	return sql;
+}
+
+
+string
+TeDatabase::getSQLStatistics (TeGroupingAttr& attrs)
+{
+	string sql = "";
+	string virg = "";
+
+	TeGroupingAttr::iterator it = attrs.begin();
+	int count = 0;
+	while(it != attrs.end())
+	{
+		if(count>0)
+			virg = ",";
+
+		switch ((*it).second)
+		{
+			case TeSUM:
+				sql += virg +" SUM( "+ (*it).first.name_ +") AS SUM_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMAXVALUE:
+				sql += virg +" MAX( "+ (*it).first.name_ +") AS MAX_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC; 
+				++count;
+				break;
+			case TeMINVALUE:
+				sql += virg +" MIN( "+ (*it).first.name_ +") AS MIN_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeCOUNT:
+				sql += virg +" COUNT( "+ (*it).first.name_ +") AS COUNT_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			case TeMEAN:
+				sql += virg +" AVG( "+ (*it).first.name_ +") AS AVG_"+ Te2String(count);
+				(*it).second = TeNOSTATISTIC;
+				++count;
+				break;
+			default:
+				break;
+		}
+		++it;
+	}
+	return sql;
+}
+
+string 
+TeDatabase::getSQLAutoNumber(const string& /* table */)
+{
+	return "";
+}
+
+string 
+TeDatabase::getSQLTemporalWhere (TeTimeInterval& timeInterval, TeTemporalRelation timeOperator, const string& initialTime, const string& finalTime)
+{
+	string sql;
+	string t1 = getSQLTime(timeInterval.getT1()); 
+	string t2 = getSQLTime(timeInterval.getT2());
+	
+	switch(timeOperator)
+	{
+		case TeTIMEBEFORE:  
+			sql = finalTime +" < "+ t1;
+			break;
+		case TeTIMEAFTER:  
+			sql = initialTime +" > "+ t2;
+			break;
+		case TeTIMEEQUAL:             
+			sql = "( "+ initialTime +" >= "+ t1;
+			sql += " AND "+ initialTime +" <= "+ t2 +" )";
+			if (initialTime != finalTime)
+			{
+				sql += " AND ";
+				sql += "( "+ finalTime +" >= "+ t1;
+				sql += " AND "+ finalTime +" <= "+ t2 +" )";
+			}
+			break;
+
+		case TeTIMEMEETS:             
+			sql = finalTime +" = "+ t1;
+			sql += " OR "+ initialTime +" = "+ t2;
+			break;
+
+		case TeTIMEDURING: 
+			sql = initialTime +" >= "+ t1;
+			sql += " AND "+ initialTime +" <= "+ t2;
+			if (initialTime != finalTime)
+			{
+				sql += " AND "+ finalTime +" >= "+ t1;
+				sql += " AND "+ finalTime +" <= "+ t2;
+			}
+			break;
+
+		case TeTIMEOVERLAPS:             
+			sql = "( "+ initialTime +" < "+ t1;
+			sql += " AND "+ finalTime +" > "+ t1;
+			sql += " AND "+ finalTime +" < "+ t2 +" )";
+			sql += " OR ";
+			sql += "( "+ initialTime +" > "+ t1;
+			sql += " AND "+ initialTime +" < "+ t2;
+			sql += " AND "+ finalTime +" > "+ t2 +" )";
+			break;
+
+		case TeTIMEENDS:
+			sql = finalTime +" = "+ t2;
+			break;
+
+		case TeTIMESTARTS:
+			sql = initialTime +" = "+ t1;
+			break;
+
+        default:
+            break;
+	}
+
+	return sql; 
+}
+
+string
+TeDatabase::getSQLTemporalWhere(int time1, int time2, TeChronon chr, TeTemporalRelation rel, 
+						   const string& initialTime, const string& finalTime)
+{
+	//rever os chronons definidos - alterar o parser para restri��o temporal
+	string func, sql;
+	switch(chr)
+	{
+		case TeSECONDOFMINUTE:  
+		   func = " second"; 
+		break;
+		
+		case TeMINUTEOFHOUR:  
+		   func = " minute";
+		break;
+		
+		case TeHOUROFDAY:             
+			func = " hour";
+		break;
+		
+		case TeDAYOFMONTH:             
+			func = " day";
+		break;
+
+		case TeDAYOFWEEK:
+			func = " weekday";
+		break;
+		
+		case TeMONTHOFYEAR:
+		   func = " month";
+		break;
+
+		case TeYEAR:             
+		   func = " year";
+		break;
+
+		default:
+			return "";
+	}
+
+	switch(rel)
+	{
+		case TeTIMEBEFORE:  
+			sql = func +"("+ finalTime +") < "+ Te2String(time1);
+		break;
+		
+		case TeTIMEAFTER:  
+			sql = func +"("+ initialTime +") > "+ Te2String(time2);
+		break;
+		
+		case TeTIMEEQUAL:  
+			sql = func +"("+ initialTime +") = "+ Te2String(time1);
+			sql += " AND "+ func +"(" + finalTime +") = "+ Te2String(time2);
+		break;
+
+		case TeTIMEMEETS:     
+			sql = func +"("+ finalTime +") = "+ Te2String(time1);
+			sql += " OR "+ func +"(" + initialTime +") = "+ Te2String(time2);
+		break;
+
+		case TeTIMEDURING: 
+			sql = func +"("+ initialTime +") >= "+ Te2String(time1);
+			sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
+			sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
+			sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2);
+		break;
+
+		case TeTIMEOVERLAPS:         
+			sql =  "("+ func +"("+ initialTime +") <= "+ Te2String(time1);
+			sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time1);
+			sql += " AND "+ func +"("+ finalTime +") <= "+ Te2String(time2) +")";
+			sql += " OR ";
+			sql += "("+ func +"("+ initialTime +") >= "+ Te2String(time1);
+			sql += " AND "+ func +"("+ initialTime +") <= "+ Te2String(time2);
+			sql += " AND "+ func +"("+ finalTime +") >= "+ Te2String(time2) +")";
+		break;
+
+		case TeTIMEENDS:
+			sql = func +"("+ finalTime +") = "+ Te2String(time2);
+		break;
+
+		case TeTIMESTARTS:
+			sql = func +"("+ initialTime +") = "+ Te2String(time1);
+
+		default:
+			break;
+	}
+	
+	return sql;
+}
+
+string 
+TeDatabase::getSQLTemporalWhere (const string& temporalRest)
+{
+	string result, tableName, initialCol, finalCol, time1, time2, mask; 
+	TeTemporalRelation rel;
+	TeChronon chronon; 
+	
+	string temp = temporalRest;
+	bool flag = true;
+	int cont = 0;
+		
+	while(flag)
+	{
+		string element;
+		int pos = temp.find (";");
+		if(pos<0)
+		{
+			flag = false;
+			element = temp;
+		}
+		else
+		{
+			element = temp.substr(0, pos);
+			temp = temp.substr (pos+1);
+		}
+
+		if(cont==0) //table name
+			tableName = element;
+		else if(cont==1) //column name (initial time) 
+			initialCol = element; 
+		else if(cont==2) //column name (final time)
+			finalCol = element;
+		else if(cont==3) //TeTemporalRelation 
+		{
+			if(element=="TeTIMEEQUAL")
+				rel = TeTIMEEQUAL;
+			else if (element=="TeTIMEBEFORE")
+				rel = TeTIMEBEFORE;
+			else if (element=="TeTIMEAFTER")
+				rel = TeTIMEAFTER;
+			else if (element=="TeTIMEMEETS")
+				rel = TeTIMEMEETS;
+			else if (element=="TeTIMEDURING")
+				rel = TeTIMEDURING;
+			else if (element=="TeTIMEOVERLAPS")
+				rel = TeTIMEOVERLAPS;
+			else if (element=="TeTIMEENDS")
+				rel = TeTIMEENDS;
+			else if (element=="TeTIMESTARTS")
+				rel = TeTIMESTARTS;
+		}
+		else if(cont==4) //time 1
+			time1 = element;
+		else if(cont==5) //time 2
+		{
+			if(element.empty())
+				time1 = time2;
+			else
+				time2 = element;
+		}
+		else if(cont==6)
+			mask = element;
+		else if(cont==7) //TeChronon  
+		{
+			if (element=="TeSECOND")
+				chronon = TeSECOND;
+			else if (element=="TeMINUTE")
+				chronon = TeMINUTE;
+			else if (element=="TeHOUR")
+				chronon = TeHOUR;
+			else if (element=="TeDAY")
+				chronon = TeDAY;
+			else if (element=="TeMONTH")
+				chronon = TeMONTH;
+			else if (element=="TeYEAR")
+				chronon = TeYEAR;
+			else if (element=="TeDAYOFWEEK")
+				chronon = TeDAYOFWEEK;
+			else if (element=="TeMONTHOFYEAR")
+				chronon = TeMONTHOFYEAR;
+			else if (element=="TeSEASON")
+				chronon = TeSEASON;
+			else if (element=="TeWEEKOFYEAR")
+				chronon = TeWEEKOFYEAR;
+		}
+
+		++cont;
+	}
+
+	int posMask = mask.find ("s");
+	if(posMask<0) 
+	{
+		result = " "+ getSQLTemporalWhere(atoi(time1.c_str()), atoi(time2.c_str()), chronon, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) +" ";
+	}
+	else
+	{
+		TeTimeInterval interval(time1, time2, chronon, mask);
+		result = " "+ getSQLTemporalWhere(interval, rel, (tableName+"."+initialCol), (tableName+"."+finalCol)) + " "; 
+	}
+
+	return result;
+}
+
+
+string 
+TeDatabase::getSQLTemporalFunction (TeChronon chr, const string& colName)
+{
+	string func;
+	switch(chr)
+	{
+		case TeYEAR:             
+			func = " year ("+ colName +")";
+		break;
+
+		case TeMONTH:			// Fev/2003 != Fev/2004
+			func = " year ("+ colName +"), month ("+ colName +") ";
+		break;
+
+		case TeMONTHOFYEAR:		// Fev/2003 == Fev/2004
+			func = " month ("+ colName +")";
+		break;
+
+		case TeDAY:				// 01/01/2003 != 01/01/2004 != 01/02/2004             
+			func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +") ";
+		break;
+
+		case TeDAYOFMONTH:		// 01/01/2003 == 01/01/2004 == 01/02/2004             
+			func = " day("+ colName +") ";
+		break;
+
+		case TeDAYOFYEAR:		// 01/01/2003 == 01/01/2004 != 01/02/2004             
+			func = " month ("+ colName +"), day("+ colName +") ";
+		break;
+
+		case TeDAYOFWEEK:		// 01/01/2003 != 01/01/2004 != 01/02/2004             
+			func = " weekday ("+ colName +") ";
+		break;
+
+		case TeHOUR:			// 01/01/2003 10:00 != 01/01/2004 10:00 != 01/02/2004 10:00             
+			func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +") ";
+		break;
+
+		case TeHOUROFDAY:       // 01/01/2003 10:00 == 01/01/2004 10:00 == 01/02/2004 10:00    
+			func = " hour ("+ colName +")";
+		break;
+
+		case TeMINUTE:			// 01/01/2003 10:30 != 01/01/2004 10:30 != 01/02/2004 10:30 
+		   func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +") ";
+		break;
+
+		case TeMINUTEOFHOUR:   // 01/01/2003 10:30 == 01/01/2004 10:30 == 01/02/2004 10:30 != 01/02/2004 10:31
+			func = " minute("+ colName +") ";
+		break;
+
+		case TeSECOND:  // 01/01/2003 10:30:04 != 01/01/2004 10:30:04 != 01/02/2004 10:30:04 
+		   func = " year ("+ colName +"), month ("+ colName +"), day("+ colName +"), hour("+ colName +"), minute("+ colName +"), second("+ colName +") ";
+		break;
+
+		case TeSECONDOFMINUTE:  // 01/01/2003 10:30:04 == 01/01/2004 10:30:04 == 01/02/2004 10:30:04 != 01/02/2004 10:30:07
+		   func = " second("+ colName +") "; 
+		break;
+		
+		default:
+			return "";
+	}
+	
+	return func;
+}
+ 
+
+bool
+TeDatabase::getMBRGeom(string tableGeom, string object_id, TeBox& box, string /* colGeom */)
+{
+	double xmin = TeMAXFLOAT;
+	double xmax = -TeMAXFLOAT;
+	double ymin = TeMAXFLOAT;
+	double ymax = -TeMAXFLOAT;
+			
+	TeDatabasePortal* portal = getPortal();
+	if(!portal)
+		return false;
+
+	string sel = "SELECT lower_x, upper_x, lower_y, upper_y FROM " + tableGeom;
+	sel += " WHERE object_id = '" + object_id + "'";
+
+	if(!portal->query(sel))
+	{
+		delete portal;
+		return false;
+	}
+		
+	bool b = portal->fetchRow();
+	if(!b)
+	{
+		delete portal;
+		return false;
+	}
+	
+	while(b)
+	{
+		xmin = MIN(xmin, portal->getDouble(0));
+		xmax = MAX(xmax, portal->getDouble(1));
+		ymin = MIN(ymin, portal->getDouble(2));
+		ymax = MAX(ymax, portal->getDouble(3));
+		b = portal->fetchRow();	
+	}
+			
+	TeBox bb(xmin, ymin, xmax, ymax);
+	box = bb;
+	delete portal;
+	return true;
+}
+
+bool 
+TeDatabase::getMBRSelectedObjects(string /* geomTable */,string /* colGeom */, string fromClause, string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol)
+{
+	string	fields;
+	string	query;
+	bool	status = false;
+
+	TeBox	box;
+	bout = box;
+
+	TeDatabasePortal* portal = this->getPortal();
+
+	switch(repType)
+	{
+		case TePOLYGONS:
+		case TeLINES:
+
+			fields = "MIN(lower_x), MIN(lower_y), MAX(upper_x), MAX(upper_y)";
+			query =  " SELECT " + fields;
+			query += " FROM " + fromClause; 
+			if (!whereClause.empty())
+				query += " WHERE " + whereClause;
+			if (!afterWhereClause.empty())
+				query += afterWhereClause;
+
+			if (portal->query (query))
+			{
+				bool b = portal->fetchRow();
+				while(b)
+				{
+					string vxmin = portal->getData(0);
+					string vymin = portal->getData(1);
+					string vxmax = portal->getData(2);
+					string vymax = portal->getData(3);
+					if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
+					{
+						b = portal->fetchRow();
+						continue;
+					}
+					double xmin = atof(vxmin.c_str());
+					double ymin = atof(vymin.c_str());
+					double xmax = atof(vxmax.c_str());
+					double ymax = atof(vymax.c_str());
+					TeBox	ibox(xmin, ymin, xmax, ymax);
+					updateBox (bout, ibox);
+					b = portal->fetchRow();
+					status = true;
+				}
+			}
+			break;
+
+		case TePOINTS:
+
+			fields = "MIN(x), MIN(y), MAX(x), MAX(y)";
+			query =  " SELECT " + fields;
+			query += " FROM " + fromClause; 
+			if (!whereClause.empty())
+				query += " WHERE " + whereClause;
+			if (!afterWhereClause.empty())
+				query += afterWhereClause;
+			
+			if (portal->query (query))
+			{
+				bool b = portal->fetchRow();
+				while(b)
+				{
+          string vxmin = portal->getData(0);
+          string vymin = portal->getData(1);
+          string vxmax = portal->getData(2);
+          string vymax = portal->getData(3);
+          if(vxmin.empty() || vymin.empty() || vxmax.empty() || vymax.empty())
+          {
+            b = portal->fetchRow();
+            continue;
+          }
+          double xmin = atof(vxmin.c_str());
+          double ymin = atof(vymin.c_str());
+          double xmax = atof(vxmax.c_str());
+          double ymax = atof(vymax.c_str());
+          
+          TeBox ibox;
+          if (xmin == xmax) {
+            ibox.x1_ = xmin - tol;
+            ibox.x2_ = xmax + tol;
+          }
+          else{
+            ibox.x1_ = xmin;
+            ibox.x2_ = xmax;
+          }
+          if (ymin == ymax) {
+            ibox.y1_ = ymin - tol;
+            ibox.y2_ = ymax + tol;
+          }
+          else {
+            ibox.y1_ = ymin;
+            ibox.y2_ = ymax;
+          }
+					updateBox (bout, ibox);
+					b = portal->fetchRow();
+					status = true;
+				}
+			}
+			break;
+
+
+		default:
+			status = false;
+			break;
+	}
+
+	delete portal;
+
+	return status;
+
+}
+
+bool 
+TeDatabase::getAttributeList(const string& tableName,TeAttributeList& attList)
+{
+	TeDatabasePortal* portal = this->getPortal();
+	if (!portal)
+		return false;
+
+	string sql = "SELECT * FROM " + tableName + " WHERE 1=2";
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+	else
+		attList = portal->AttributeList();
+	delete portal;
+	return true;
+}
+
+TeBox 
+TeDatabase::getThemeBox(TeTheme* theme)
+{
+	TeBox bb;
+	if (!theme)
+		return bb;
+
+	string colTabName = theme->collectionTable();
+	if (colTabName.empty())
+		return bb;
+
+	string sqlfrom;
+	TeLayer* layer = theme->layer();
+	string geomTable;
+	if (layer->hasGeometry(TePOINTS))
+	{
+		geomTable = layer->tableName(TePOINTS);
+		sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+		sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+		TeBox bpt;
+		if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOINTS,bpt))
+			updateBox(bb,bpt);
+	}
+	if (layer->hasGeometry(TeLINES))
+	{
+		geomTable = layer->tableName(TeLINES);
+		sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+		sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+		TeBox bln;
+		if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeLINES,bln))
+			updateBox(bb,bln);
+	}
+	if (layer->hasGeometry(TePOLYGONS))
+	{
+		geomTable = layer->tableName(TePOLYGONS);
+		sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+		sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+		TeBox bpol;
+		if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TePOLYGONS,bpol))
+			updateBox(bb,bpol);
+	}
+
+	if (layer->hasGeometry(TeCELLS))
+	{
+		geomTable = layer->tableName(TeCELLS);
+		sqlfrom = colTabName + " LEFT JOIN " + geomTable;
+		sqlfrom += " ON " + colTabName + ".c_object_id = " + geomTable + ".object_id";
+		TeBox bpol;
+		if (getMBRSelectedObjects(geomTable,"spatial_data", sqlfrom, "","",TeCELLS,bpol))
+			updateBox(bb,bpol);
+	}
+	return bb;
+}
+
+bool TeDatabase::insertRasterVisual (int themeId , TeRasterVisual* vis)
+{
+	TeRasterTransform::TeRasterTransfFunctions tf = vis->getTransfFunction();
+		
+	if (tf == TeRasterTransform::TeNoTransf)
+		return true;
+
+	string sql = "DELETE FROM te_visual_raster WHERE theme_id = " + Te2String(themeId);
+	if (!this->execute(sql))
+		return false;
+
+	if (tf == TeRasterTransform::TeMono2Three ||
+		tf == TeRasterTransform::TePall2Three || 
+		tf == TeRasterTransform::TeLUT2Three)
+	{
+		sql = "INSERT INTO te_visual_raster (theme_id, band_in, transf_type) VALUES (";
+		sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
+		sql += Te2String(static_cast<short>(tf)) + ")";
+		if (!this->execute(sql))
+			return false;
+		return true;
+	}
+
+	if (tf == TeRasterTransform::TeExtractBand)
+	{
+		sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
+		sql += Te2String(themeId) + "," + Te2String(vis->getSrcBand()) + ",";
+		sql += Te2String(vis->getDestBand()) + "," + Te2String(static_cast<short>(tf))+ ")";
+		if (!this->execute(sql))
+			return false;
+		return true;
+	}
+
+	if (tf == TeRasterTransform::TeExtractBands || tf == TeRasterTransform::TeExtractRGB)
+	{
+		map<TeRasterTransform::TeRGBChannels,short>& RGBmap = vis->getRGBMap();
+		map<TeRasterTransform::TeRGBChannels,short>::iterator it = RGBmap.begin();
+		while (it != RGBmap.end())
+		{
+			sql = "INSERT INTO te_visual_raster (theme_id, band_in, band_out, transf_type) VALUES (";
+			sql += Te2String(themeId) + "," + Te2String(static_cast<short>(it->second)) + ",";
+			sql += Te2String(static_cast<short>(it->first)) + "," + Te2String(static_cast<short>(tf))+ ")";
+			if (!this->execute(sql))
+				return false;
+			++it;
+		}
+		return true;
+	}
+	return false;
+}
+
+
+bool 
+TeDatabase::locateLineSet (const string& table, TeCoord2D &pt, TeLineSet &ls, const double& tol)
+{
+	bool located=false;
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE lower_x < %f AND upper_x > %f AND lower_y < %f AND upper_y > %f",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	// Get all lines
+	bool flag = true;
+	do 
+	{
+		TeLine2D l;
+		TeLineSet tmp;
+		int index;
+		double dist;
+		TeCoord2D pout;
+
+		flag = portal->fetchGeometry( l );
+		tmp.add(l);
+		if(TeNearest(pt,tmp,index,pout,dist,tol))
+			{
+				ls.add ( l );
+				located=true;
+			}
+	} while (flag);
+
+	delete portal;
+	return located;
+}
+
+
+bool 
+TeDatabase::locatePointSet (const string& table, TeCoord2D &pt, TePointSet &pointSet, const double& tol)
+{
+	bool located=false;
+
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	do 
+	{
+		TePoint point;
+		flag = portal->fetchGeometry (point);
+		pointSet.add ( point );
+		located=true;
+	}while (flag);
+
+	delete portal;
+	return located;
+}
+
+
+bool 
+TeDatabase::locateTextSet (const string& table, TeCoord2D &pt, TeTextSet& textSet, const double& tol)
+{
+	bool located=false;
+
+	TeDatabasePortal* portal = this->getPortal();
+
+	TeBox box (pt.x()-tol,pt.y()-tol,pt.x()+tol,pt.y()+tol);
+	string q ="SELECT * FROM " + table;
+	char buf [1024];
+	sprintf (buf," WHERE x < %f AND x > %f AND y < %f AND y > %f",
+		box.x2(),box.x1(),box.y2(),box.y1());
+	q += buf;
+	if (!portal->query(q) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	// Look for all texts
+	bool flag = true;
+	
+	do
+	{
+		TeText p;
+		flag = portal->fetchGeometry(p);
+		textSet.add ( p );
+		located=true;
+	} while (flag);
+
+	delete portal;
+	return located;
+}
+
+
+// End TeDatabase Methods
+
+// Begin TeDatabasePortal Methods
+
+TeDatabasePortal::TeDatabasePortal():
+	db_(0),			
+	numRows_(0),
+	numFields_ (0),	
+	errorMessage_(""),
+	errorNumber_(0)
+	{}
+
+TeDatabasePortal::~TeDatabasePortal ()
+{
+}
+
+double 
+TeDatabasePortal::getDouble (int i)
+{  
+	char* val = getData(i); 
+	return atof(val); 
+}
+
+double 
+TeDatabasePortal::getDouble (const string& s)
+{  
+	char* val = getData(s); 
+	return atof(val); 
+}
+
+int 
+TeDatabasePortal::getInt (int i)
+{  
+	char* val = getData(i); 
+	return atoi(val); 
+}
+
+int 
+TeDatabasePortal::getInt (const string& s)
+{  
+	char* val = getData(s); 
+	return atoi(val); 
+}
+
+bool
+TeDatabasePortal::fetchGeometry (TeCell& cell)
+{
+	int index = atoi(getData("geom_id"));
+	string object_id = getData("object_id");
+	TeBox b (atof(getData("lower_x")),atof(getData("lower_y")),atof(getData("upper_x")),atof(getData("upper_y")));
+	cell.geomId(index);
+	cell.objectId(object_id);
+	cell.setBox (b);
+	cell.column(atoi(getData("col_number")));
+	cell.line(atoi(getData("row_number")));
+	return (fetchRow());
+}
+
+TeAttribute TeDatabasePortal::getAttribute (int i)
+{
+	TeAttributeList::iterator it = attList_.begin();
+	int j = 0;
+	while ( it != attList_.end() )
+	{
+		if (i == j)
+			return (*it);
+		++it;
+		j++;
+	}
+	return TeAttribute();
+}
+
+TeAttribute TeDatabasePortal::getAttribute (const string& s)
+{
+	TeAttributeList::iterator it = attList_.begin();
+	while ( it != attList_.end() )
+	{
+		if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
+			return (*it);
+		++it;
+	}
+	return TeAttribute();
+}
+
+int 
+TeDatabasePortal::getColumnIndex (const string& s)
+{
+	TeAttributeList::iterator it = attList_.begin();
+	int j = 0;
+	while ( it != attList_.end() )
+	{
+		if (TeConvertToUpperCase(s) == TeConvertToUpperCase((*it).rep_.name_))
+			return j;
+		++it;
+		j++;
+	}
+	return -1;
+}
+
+string 
+TeDatabasePortal::getColumnName (int i)
+{
+	TeAttributeList::iterator it = attList_.begin();
+	int j=0;
+	while ( it != attList_.end() )
+	{
+		if (j==i)
+			return (*it).rep_.name_;
+		++it;
+		j++;
+	}
+	return "";
+}
+
+
+TeViewTree*
+TeDatabasePortal::getViewTree ()
+{
+	TeViewTree *tree = new TeViewTree();
+	tree->id (atoi(getData("theme_id")));
+	tree->name (getData("name"));
+	tree->priority(atoi(getData("priority")));
+	return tree;
+}
+
+TeLegendEntry 
+TeDatabasePortal::getLegend ()
+{
+	TeLegendEntry leg;
+	leg.id (atoi(getData("legend_id")));
+	leg.theme (atoi(getData("theme_id")));
+	leg.group (atoi(getData("group_id")));
+
+	string data;
+	data = getData("num_objs");
+	leg.count(atoi(data.c_str()));
+	data = getData("lower_value");
+	leg.from(data);
+	data = getData("upper_value");
+	leg.to(data);
+	data = getData("label");
+	leg.label(data);
+	return leg;
+}
+
+TeVisual
+TeDatabasePortal::getVisual()
+{
+	TeVisual vis;
+	TeGeomRep rep = (TeGeomRep)atoi (getData("geom_type"));
+
+	TeColor cor(atoi(getData("red")),atoi(getData("green")),atoi(getData("blue")));
+	vis.color(cor);
+	vis.libName (string(getData("lib_name")));
+	vis.transparency(atoi(getData("transparency")));
+
+	TeColor ccor(atoi(getData("contour_red")),atoi(getData("contour_green")),atoi(getData("contour_blue")));
+	vis.contourColor(ccor);
+	vis.contourLibName(string(getData("contour_lib_name")));
+	vis.contourWidth(atoi(getData("contour_width")));
+	vis.contourTransparency(atoi(getData("contour_transp")));
+
+	if(rep == TePOLYGONS || rep == TeCELLS)
+	{
+		vis.contourWidth(atoi(getData("width")));
+		vis.contourStyle(atoi(getData("contour_symb_id")));
+		vis.style(atoi(getData("symb_id")));
+	}
+	else if(rep == TeLINES)
+	{
+		vis.width(atoi(getData("width")));
+		vis.style(atoi(getData("symb_id")));
+	}
+	else if(rep == TePOINTS)
+	{
+		vis.size(atoi(getData("size_value")));
+		vis.style(atoi(getData("symb_id")));
+	}
+	else if(rep == TeTEXT)
+		vis.size(atoi(getData("size_value")));
+
+	vis.family(getData("family"));
+	vis.bold (getBool("bold"));
+	vis.italic (getBool("italic"));
+	vis.fixedSize (getBool("fixed_size"));
+
+	vis.alignmentVert(getDouble("alignment_vert"));
+	vis.alignmentHoriz(getDouble("alignment_horiz"));
+
+	vis.tabSize(atoi(getData("tab_size")));
+	vis.lineSpace(atoi(getData("line_space")));
+	return vis;
+}
+
+bool 
+TeDatabasePortal::fetchGeometry (TeText& t)
+{
+	TeCoord2D c(getDouble("x"), getDouble("y"));
+	string txt = getData ("text_value");
+	TeText t2(c,txt);
+	t2.geomId(atoi(getData("geom_id")));
+	t2.objectId(string(getData("object_id")));
+	t2.setAngle (getDouble("angle"));
+	t2.setHeight (getDouble("height"));
+	t2.setAlignmentVert(getDouble("alignment_vert"));
+	t2.setAlignmentHoriz(getDouble("alignment_horiz"));
+	t = t2;
+	return (fetchRow());
+}
+
+TeColor 
+TeDatabasePortal::getColor ()
+{
+	TeColor c(atoi(getData("red")), atoi(getData("green")), atoi(getData("blue")));
+	return c;
+}
+
+bool 
+TeDatabasePortal::fetchGeometry (TeArc& arc)
+{
+	arc.fromId(atoi(getData(2)));
+	arc.toId(atoi(getData(3)));
+	arc.geomId(atol(getData(0)));
+	arc.objectId(string(getData(1)));
+	return fetchRow();
+}
+
+
+
+// End TeDatabasePortal Methods
+
diff --git a/src/terralib/kernel/TeDatabase.h b/src/terralib/kernel/TeDatabase.h
new file mode 100644
index 0000000..bfdddfe
--- /dev/null
+++ b/src/terralib/kernel/TeDatabase.h
@@ -0,0 +1,1438 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeDatabase.h
+    This file contains structures and definitions about database support in TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_DATABASE_H
+#define  __TERRALIB_INTERNAL_DATABASE_H
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include "TeDefines.h"
+#include "TeDataTypes.h"
+#include "TeTable.h"
+#include "TeGeometry.h"
+#include "TeLayer.h"
+#include "TeView.h"
+#include "TeTheme.h" 
+#include "TeRasterParams.h"
+#include "TeTimeInterval.h"
+#include "TeStatistics.h"
+
+#include <set>
+using namespace std;
+
+          
+/*! \enum TeCursorLocation
+	Location of a cursor on record set
+ */
+enum TeCursorLocation { TeCLIENTESIDE, TeSERVERSIDE };
+
+/*! \enum TeCursorType
+	Type of cursor on record set
+ */
+enum TeCursorType { TeUNIDIRECTIONAL, TeBIDIRECTIONAL, TeRANDOMACCESS };
+
+/*! \enum TeCursorEditType
+	Type of edition on record set cursor
+ */
+enum TeCursorEditType { TeREADONLY, TeREADWRITE };
+
+/*! \enum TeCursorDataType
+	Type of edition on record set cursor
+ */
+enum TeCursorDataType { TeBINARYCURSOR, TeTEXTCURSOR };
+
+
+/*! \enum TeSpatialIndexType
+	Type of spatial index
+ */
+enum TeSpatialIndexType {TeRTREE, TeQUADTREE};
+
+//! A vector of objects identifications (object_id)
+typedef vector<string>				Keys;
+
+//! A Map of objects identifications (object_id) to a distance value
+typedef map<string, double>			KeysToDist;
+
+//! A Vector of pointers to TeGeometry 
+typedef vector<TeGeometry*> TeGeometryVect;
+
+//! A Map of the objects identifications to a set of statistical values
+typedef map<string, TeStatisticsDimensionVect>  TeObjectStatistics;
+
+
+class TeDatabasePortal;
+
+
+//! An abstract database class
+/*!
+	Instances of this classes represent connections
+	to a database server. It includes the host name, 
+	user name and password parameters of the connection.
+	It should be implemented by the drivers to specific
+	database servers as: MySQL, Ado, PostgreSQL or any
+	other server to be used in TerraLib applications.
+	When possible, default implementations using ANSI SQL
+	are provided. 
+	Methods that rely on special features of the derived
+	driver are left as purely virtual.
+
+  \sa
+  TeTheme, TeView, TeLayer, TeAttribute
+*/
+class TeDatabase 
+{
+public: 
+	//! Empty constructor
+	TeDatabase();
+
+	//! Destructor
+	virtual ~TeDatabase();
+
+	//! Operator ==
+	bool operator== (const TeDatabase& other) const
+	{	
+		if (dbmsName_ != other.dbmsName_ ||
+			database_ != other.database_ ||
+			host_  != other.host_ ||
+			user_ != other.user_ )
+			return false;
+		return true;
+	}
+	/** @name Members
+	*  Methods to access class private members
+	*/
+	//@{		
+	//! Returns the error message from the server
+	virtual string errorMessage ()
+	{ return errorMessage_; }
+
+	//! Returns the error number from the server
+	virtual int	errorNum ()
+	{	return errorNumber_; }
+
+	//! Return the user name of the connection opened
+	string	user () 
+	{ return user_; }
+
+	//! Set the current user name to view
+	void user(string value) { user_=value;}
+
+	//! Returns the host name of the connection opened
+	string	host () 
+	{ return host_; }
+
+	//! Returns the user's password of the connection opened
+	string	password () 
+	{ return password_; }
+
+	//! Returns the database name of the connection opened
+	string	databaseName () 
+	{ return database_; }
+	
+	//! Returns the Database Management System name
+	string	dbmsName () 
+	{ return dbmsName_; }
+
+	//! Returns the port number of the connection opened
+	int	portNumber () 
+	{ return portNumber_; }
+
+	//! Returns the  map of layers in the database
+	TeLayerMap&	layerMap () 
+	{ return layerMap_; }
+
+	//! Returns the  map of views in the database
+	TeViewMap&	viewMap () 
+	{ return viewMap_; }
+
+	//! Returns the  map of themes in the database
+	TeThemeMap&	themeMap () 
+	{ return themeMap_; }
+
+	//! Returns the  map of legends in the database
+	TeLegendEntryMap& legendMap () 
+	{ return legendMap_; }
+
+	//! Returns the set of relations between tables
+	multiset<int>& relationMSet () 
+	{ return relationMSet_; }
+
+	//! Clears structures in memory (legendMap, layerMap, viewMap...) used to optimize database access
+	virtual void clear();
+
+	//@}
+
+	/** @name Database
+	*  Methods related to database and connection creation. 
+	*  These methods return TRUE when the operation was successfull.
+	*  Otherwise return FALSE and when possible an error message is captured.
+	*/
+	//@{	
+	//! Creates a new database and open a connection to it
+	virtual bool newDatabase(const string& database, const string& user, const string& password, const string& host, const int &port=0, bool terralibModel=true) = 0;
+	
+	//! Opens a connection to a database server passing all parameters needed
+	virtual bool connect (const string& host, const string& user, const string& password, const string& database, int port = 0) = 0;
+
+	//! Show the server databases (only for MySQL, Oracle and PostgreSQL)
+	virtual bool showDatabases (const string& /* host */, const string& /* user */, const string& /* password */, vector<string>& /* dbNames */ , int /* port */ = 0)
+	{ return true; }
+
+	//! Opens a connection without parameters. When possible, should be implemented by the derived classes 
+	virtual bool connect (const string&  = "") { return false; };
+
+	//! Check if there is an opened connection
+	bool isConnected () 
+	{ return isConnected_; }
+
+	//! Closes the connection
+	virtual void close() = 0;
+	//@}
+
+	/** @name Tables
+	  Methods related to table manipulation.
+		\note refer to data model documentation in order to understand the meanning of 
+		each tables and its fields
+	*/
+	//@{	
+
+	//! Returns a list of tables in a database
+	virtual bool listTables(vector<string>& /* tableList */) { return false; }
+
+	//! Verifies if a table exist in the database
+	virtual bool tableExist(const string& table) = 0;
+	
+	//! Verifies if a table has a column
+	virtual bool columnExist(const string& table, const string& column, TeAttribute& attr) = 0;
+
+	//! Update a column
+	virtual bool allowEmptyString(const string& /* tableName */, const string& /* column */) { return false; }
+
+	//! Verifies and modifies the column names of the table. It returns if the table was modified  
+	virtual bool validTable (TeTable& table);
+
+	//! Return the name of an attribute table given its identifier
+	string getTableName(int tableId);
+
+	//! Creates a table
+	/*!
+      \param table table name
+      \param attr table list of attributes
+	 */
+	virtual bool createTable(const string& table, TeAttributeList &attr);
+
+	//! Deletes a table. Do not allow the deletion of model tables
+	 virtual bool deleteTable (const string& table);
+
+	//! Adds a column to a table
+	/*!
+      \param table table name
+      \param rep representation of the column being created
+	*/
+	virtual bool addColumn (const string& table, TeAttributeRep &rep) = 0;
+
+	//! Deletes a column to a table
+	/*!
+      \param table table name
+      \param colName name of the column being deleted
+	*/
+	virtual bool deleteColumn (const string& table, const string& colName);
+	
+	//! Creates a reationship between two tables
+	/*!
+      \param relName relationship name
+      \param table table that will receive the foreign key
+	  \param fieldName column that will be foreign key
+	  \param relatedTable table that exports the foreign key
+	  \param relatedField field that will the exported foreign key
+	  \param cascadeDeletion flag that indicates if the deletion should be propagated
+	*/
+	virtual bool createRelation (const string& relName, const string& table, const string& fieldName, 
+						const string& relatedTable, const string& relatedField, bool cascadeDeletion) = 0;
+
+	//! Checks if a relation exist
+	/*!
+      \param tableName table where the relashionship exists
+	  \param relName relationship name
+	*/
+	virtual TeDBRelationType existRelation(const string& tableName, const string& relName) = 0;
+	//@}
+	
+	/** @name Query
+	*  Methods related to query the database
+	*/
+	//@{	
+	//! Executes a SQL command that doesn�t return a record set. Tipically a data definition comand
+	virtual bool execute ( const string &sql) = 0;
+
+	//! Returns a database portal.
+	/*!
+		A database portal is used to submit queries to the database and to navigate over the
+		resulting record set
+	*/
+	virtual TeDatabasePortal* getPortal () = 0;
+
+	//! Get the values that satisfy the query 
+	virtual bool inClauseValues(const string& query , const string& attribute, vector<string>& inClauseVector);
+
+	//@}
+
+	/** @name  Data Model
+		 Methods that create the database model suggested in TerraLib. 
+		 Classes in TerraLib materialize the DataModel suggested.
+	*/
+	//@{
+	//! Creates the entire TerraLib conceptual model.
+	/*
+      \param withIntegrity flag that indicates that the referencial integrity should be implemented.
+	  \param createIndex flag that indicate that the indexes should be created
+	*/
+	virtual bool createConceptualModel(bool withIntegrity = true, bool newDatabase = true, bool createIndex = true);
+
+	//! Creates the referencial integrity of the conceptual model
+	virtual bool defineIntegrity(void);
+
+	//! Create the indexes for the tables in the conceptual model
+	virtual bool createIndex(const string& tableName, const string& indexName, const string& columnsName);
+
+	//! Creates a table to store version database information 
+	virtual bool createDatabaseTable(); 
+	
+	//! Creates a table to store Projection information
+	virtual bool createProjectionTable ();
+
+	//! Creates a table to store Layers information
+	virtual bool createLayerTable ();
+
+	//! Creates a table to store Representations information
+	virtual bool createRepresentationTable ();
+
+	//! Creates a table to store Views information
+	virtual bool createViewTable ();
+
+	//! Creates a table to store Themes information
+	virtual bool createThemeTable ();
+
+	//! Creates a table to store the groupings associated with a theme
+	virtual bool createGroupingTable();
+
+	//! Creates a table to store information about the attribute tables used by a theme
+	virtual bool createThemeTablesTable();
+
+	//! Creates a table to store legends
+	virtual bool createLegendTable ();
+
+	//! Creates a table to store visual definitions
+	virtual bool createVisualTable();
+
+	//! Creates a table to store raster visual definitions
+	virtual bool createVisualRasterTable();
+
+	//! Creates a table to store information about the non-spatial tables associated to this layer
+	virtual bool createLayerTableTable();
+
+	//! Creates a table to store information about the external tables related to non-spatial tables of layers
+	virtual bool createTablesRelationTable();
+
+	//@}
+	
+	/** @name  Geometries
+		 Methods that create tables that store the spatial data
+	*/
+	//@{
+
+	//! Creates a table for a polygon geometries
+	virtual bool createPolygonGeometry (const string& tableName) = 0;
+
+	//! Creates a table for line geometries
+	virtual bool createLineGeometry (const string& tableName) = 0;
+
+	//! Creates a table for point geometries
+	virtual bool createPointGeometry (const string& tableName);
+
+	//! Creates a table for cell geometries
+	virtual bool createCellGeometry (const string& tableName);
+ 
+	//! Creates a table for a text geometries
+	virtual bool createTextGeometry (const string& tableName);
+
+	//! Creates a table for a arc geometries
+	virtual bool createArcGeometry (const string& tableName);
+
+	//! Creates a table for a node geometries
+	virtual bool createNodeGeometry (const string& tableName);
+
+	//! Creates a table to store raster representations of objects
+	virtual bool createRasterGeometry(const string& tableName);
+
+	//! Creates a table to store information about raster representation
+	virtual bool createRasterMetadataTable(const string& tableName);
+	
+    //! Creates a table for raster geometries
+	virtual bool createRasterTable (const string& tableName) = 0;
+
+	//! Creates a table to store information about objects in a theme
+	virtual bool createCollectionTable(const string& tableName);
+	//@}
+
+	/** @name Non-spatial tables
+	*  Retrieving/Inserting/Modifying generic tables in the database. 
+	*/
+	//@{
+	//! Retrieves information about some tables
+	/*
+		\param atts returning vector of tables information 
+		\param attType type of the tables that are being looked for (optional)
+		\return TRUE if any table was found and FALSE otherwise
+	*/
+	virtual bool getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType = TeAllAttrTypes);
+
+	//! Inserts information about a link to an external table
+	/*
+		\param tableId table identification (from te_layer_table)
+		\param tField link column name of the static table
+		\param eTable name of the external table
+		\param eField name of the link column of the related table
+		\param relId returns the identification of the relation
+	*/
+	virtual bool insertRelationInfo(const int tableId, const string& tField,
+									const string& rTable, const string& rField, int& relId) = 0;
+
+	//! Inserts information about an attribute table
+	virtual bool insertTableInfo (int layerId, TeTable &table, const string& user="") = 0;
+
+	//! Updates information about an attribute table
+	virtual bool updateTableInfo (int layerId, TeTable &table, const string user="");
+
+	//! Retrieves the metainformation about an attribute table
+	virtual bool loadTableInfo(TeTable& table);
+
+	//! Saves a table and its contents in the database
+	virtual bool insertTable(TeTable &table);
+
+	//! Alter a property of a table 
+	virtual bool alterTable(const string& tableName, TeAttributeRep& rep, const string& oldColName="");
+
+	//! Saves a large binary objects (BLOB) in a row table 
+	virtual bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, unsigned char* data, int size) = 0;
+
+	//! Saves a large binary objects (BLOB) in a row table 
+	virtual bool insertBlob (const string& tableName, const string& columnBlob, TeAttributeRep& columnId, const string& valueId, const string& fileName) = 0;
+
+	//! Updates a table and its contents in the database
+	virtual bool updateTable	(TeTable &table);
+
+	//! Retrieves a table and its contents from the database
+	virtual bool loadTable		(const string& tableName, TeTable &table);
+
+	//! Retrieves a table (or part of it) accordingly to a criteria written in SQL
+	virtual bool selectTable	(const string& tableName, const string& criteria, TeTable &table);
+
+	//!	Deletes all tables, of a particular type, associated to a layer
+	virtual bool deleteLayerTable	(int layerId, TeAttrTableType ttype = TeAttrStatic);
+	//@}
+
+	/** @name Projection
+	*  Accessing/Inserting/Modifying projection information into the database. 
+	*/
+	//@{ 	
+
+	//! Insert information about a geographical projection
+	virtual bool insertProjection (TeProjection *proj) = 0;	
+
+	//! Updates information about a geographical projection
+	virtual bool updateProjection (TeProjection *proj);	
+
+	//! Retrieves information about a geographical projection identified by its database id
+	virtual TeProjection* loadProjection (int id);
+	//@}
+
+	/** @name Layers
+	*  Retrieving/Inserting/Modifying/Deleting layers in the database. 
+	*/
+	//@{ 
+	//! Insert information about a layer
+	virtual bool insertLayer	(TeLayer *layer) = 0;
+	
+	//! Update information about a layer
+	virtual bool updateLayer	(TeLayer *layer);	
+
+	//! Load information about all layers stored in the database
+	virtual bool loadLayerSet	();
+
+	//! Load information about a particular layer 
+	virtual bool loadLayer		(TeLayer* layer);
+
+	//! Load layer tables 
+	virtual bool loadLayerTable (TeLayer* layer);
+
+	//! Delete a particular layer passing its id
+	virtual bool deleteLayer	(int layerId);
+
+	//! Check if a particular layer exists (passing its id)
+	virtual bool layerExist		(int id);
+
+	//! Check if a particular layer exists (passing its name)
+	virtual bool layerExist		(string layerName);
+	//@}
+
+	/** @name Representation
+	*  Retrieving/Inserting/Modifying/Deleting representations in the database. 
+	*/
+	//@{ 
+	//! Inserts information about a geometrical representation
+	virtual bool insertRepresentation (int layerId, TeRepresentation& rep) = 0;	
+
+	//! Updates information about a geometrical representation
+	virtual bool updateRepresentation (int layerId, TeRepresentation& rep);	
+	//@}
+
+	/** @name Raster Tables
+	*  Retrieving/Inserting/Modifying/Deleting raster representations in the database. 
+	*/
+	//@{ 
+	//! Inserts information about a raster geometry associated to an object
+	/*!
+		\param tableName name of the table that stores the raster representation
+		\param par raster parameters 
+		\param objectId identification of the object associated to the raster geometry
+	*/
+	virtual bool insertRasterGeometry(const string& tableName, TeRasterParams& par, const string& objectId = "");
+
+	//! Updates the information about the raster geometry associated to an object of a layer
+	/*!
+		\param layerId layer unique database identification
+		\param par raster parameters 
+		\param objectId identification of the object associated to the raster geometry
+	*/
+	virtual bool updateRasterRepresentation(int layerId, TeRasterParams& par, const string& objectId="");
+
+	//! Returns the name of the table where the raster geometry associated to an object of a leyr
+	/*!
+		\param layerId layer unique database identification
+		\param objectId identification of the object associated to the raster geometry
+	*/
+	virtual string getRasterTable(int layerId, const string& objectId);
+	
+	//! Inserts metadata information about a particular raster geometry
+	/*!
+		\param tableName name of the table that stores the metadata
+		\param geomId  geometry unique database identification
+		\param par raster parameters 
+	*/
+	virtual bool insertRasterMetadata (const string& tableName, int geomId, TeRasterParams& par);
+	//! Updates metadata information about a particular raster geometry
+	/*!
+		\param tableName name of the table that stores the metadata
+		\param geomId  geometry unique database identification
+		\param par raster parameters 
+
+	*/	
+	virtual bool updateRasterMetadata (const string& tableName, int geomId, TeRasterParams& par);
+	//@}
+	/** @name Views
+	*  Retrieving/Inserting/Modifying/Deleting views in the database. 
+	*/
+	//@{ 
+	//! Inserts a view
+	virtual bool insertView (TeView *view) = 0;	
+
+	//! Updates a view
+	virtual bool updateView (TeView *view);	
+
+	//! Loads a set of views belonging to a user
+	virtual bool loadViewSet (const string& user);
+
+	//! Load a view
+	virtual bool loadView (TeView* view);
+
+	//! Delete a view
+	virtual bool deleteView (int viewId);
+
+	//! Recursive inserting of a view tree.
+	virtual bool insertViewTree (TeViewTree *tree) = 0;	
+
+	//! Recursive load view tree.
+	virtual TeViewTree* loadViewTree(TeView* view, int id);
+
+	//! Recusive updating of a view tree.
+	virtual bool updateViewTree (TeViewTree *tree);
+	
+	//! Check whether a given view already exists in the database
+	virtual bool viewExist(string viewName);
+
+	//@}
+
+	/** @name Themes
+	*  Retrieving/Inserting/Modifying/Deleting themes and group of themes in the database. 
+	*/
+	//@{ 
+	virtual bool insertThemeGroup	(TeViewTree* tree) = 0;
+	virtual bool insertTheme		(TeTheme *theme) = 0; 	
+	virtual bool updateTheme		(TeTheme *theme);	
+	virtual bool loadTheme			(TeTheme *theme);
+	virtual bool loadThemeTable		(TeTheme* theme);
+	virtual bool deleteThemeGroup	(int themeId);
+	virtual bool deleteTheme		(int themeId);
+	virtual bool deleteLegend		(int themeId);
+	
+	//! Inserts information about a table used by a theme 
+	bool insertThemeTable(TeTheme *theme, TeTable& inputTable);
+
+	//! Inserts information about a table used by a theme 
+	virtual bool insertThemeTable	(int themeId, int tableId, int relationId, int tableOrder) = 0; 
+
+	//! Updates  information about the tables used by a theme 
+	virtual bool updateThemeTable	(TeTheme *theme);
+	
+	//! Removes a table from the theme
+	bool removeThemeTable(TeTheme *theme, int tableOrder);
+
+	//! Inserts information about a grouping used in a theme
+	virtual bool insertGrouping (int themeId, TeGrouping* grouping);
+
+	//! Updates information about a grouping used in a theme
+	virtual bool updateGrouping (int themeId, TeGrouping* grouping);
+
+	//! Generates the label position (x,y) to each object of a theme
+	virtual bool generateLabelPositions(TeTheme *theme);
+
+	//! Check whether a given theme already exists in the database
+	virtual bool themeExist(string themeName);
+
+	//@}
+
+	/** @name Legend
+	*  Retrieving/Inserting/Modifying/Deleting legends in the database. 
+	*/
+	//@{ 
+	virtual bool insertLegend	(TeLegendEntry *legend) = 0;	
+	virtual bool updateLegend	(TeLegendEntry *legend);	
+	virtual bool loadLegend		(TeTheme *theme);
+	virtual bool updateVisual	(TeLegendEntry *legend);
+	//@}
+
+	/** @name Polygon
+	// Accessing/Inserting/Modifying polygon geometries into the database
+	*/
+	//@{ 
+	//! Inserts a polygon set in a geometry table
+	virtual bool insertPolygonSet (const string& table, TePolygonSet &ps);	
+
+	//! Updates a polygon set in a geometry table
+	virtual bool updatePolygonSet (const string& table, TePolygonSet &ps);	
+
+	//! Returns all polygons in a table given a criteria expressed as an SQL where statement
+	virtual bool selectPolygonSet (const string& table, const string& criteria, TePolygonSet &ps);
+
+	//! Returns all polygons that represents objects of a particular theme
+	virtual bool loadPolygonSet	(TeTheme* theme, TePolygonSet &ps);
+
+	//! Returns all polygons  that represents objects of a particular geoid
+	virtual bool loadPolygonSet	(const string& table, const string& geoid, TePolygonSet &ps);
+
+	//! Returns all polygons inside a given box
+	virtual bool loadPolygonSet	(const string& table, TeBox &box, TePolygonSet &ps);
+
+	//! Returns a database portal to iterate over the polygons that are inside a given box
+	/*
+		\return A database portal pointer if there is any polygons inside the box
+		\return A null pointer if there isn't polygons to iterate
+		\note The database portal pointer should be deleted by the application
+	*/
+	virtual TeDatabasePortal* loadPolygonSet(const string& table, TeBox &box);
+
+	//! Returns the first polygon that contais a given coordinate
+	virtual bool locatePolygon		(const string& table, TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+
+	//! Returns the polygons that contains a give coordinate
+	virtual bool locatePolygonSet   (const string& table, TeCoord2D &pt, double tol, TePolygonSet &polygons);
+
+	//! Inserts a polygon in a geometry table
+	virtual bool insertPolygon		(const string& table, TePolygon &p) = 0;	
+
+	//! Updates a polygon in a geometry table
+	virtual bool updatePolygon		(const string& table, TePolygon &p) = 0;
+	//@}
+
+	/** @name Line
+	*  Accessing/Inserting/Modifying Line geometries into the database. 
+	*/
+	//@{ 	
+	// Accessing/Inserting line geometries into the database
+	virtual bool insertLineSet	(const string& table, TeLineSet &ls);	
+	virtual bool updateLineSet	(const string& table,TeLineSet &ls);
+	virtual bool loadLineSet	(const string& table, const string& geoid, TeLineSet &ls);
+    virtual bool loadLineSet	(TeTheme* theme, TeLineSet &ls);
+	virtual bool loadLineSet	(const string& table, TeBox &box, TeLineSet &linSet);
+	virtual TeDatabasePortal*    loadLineSet (const string& table, TeBox &box);
+	virtual bool selectLineSet	(const string& table, const string& criteria, TeLineSet &ls);
+
+    virtual bool insertLine		(const string& table, TeLine2D &l) = 0;		
+	virtual bool updateLine		(const string& table, TeLine2D &l) = 0;
+	virtual bool locateLine		(const string& table, TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+	virtual bool locateLineSet	(const string& table, TeCoord2D &pt, TeLineSet & ls, const double& tol = 0.0);
+
+	//@}
+
+	/** @name Point
+	*  Accessing/Inserting/Modifying Point geometries into the database. 
+	*/
+	//@{ 	
+	// Accessing/Inserting point geometries into the database
+	virtual bool insertPointSet	(const string& table, TePointSet &ps);	
+    virtual bool updatePointSet (const string& table, TePointSet &ps);
+	virtual bool loadPointSet	(const string& table, TeBox &box, TePointSet &ps);
+	virtual TeDatabasePortal* loadPointSet	(const string& table, TeBox &box);
+	virtual bool loadPointSet	(const string& table, const string& geoid, TePointSet &ps);
+	virtual bool loadPointSet	(TeTheme* theme, TePointSet &ps);
+	virtual bool selectPointSet (const string& table, const string& criteria, TePointSet &ps);
+
+    virtual bool insertPoint	(const string& table, TePoint &p) = 0;	
+	virtual bool updatePoint	(const string& table, TePoint &p);
+	virtual bool locatePoint	(const string& table, TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+	virtual bool locatePointSet (const string& table, TeCoord2D &pt, TePointSet &pointSet, const double& tol=0.0);
+	//@}
+
+	/** @name Text
+	*  Accessing/Inserting/Modifying Text geometries into the database. 
+	*/
+	//@{ 	
+	// Accessing/Inserting text geometries into the database
+	virtual bool insertTextSet	(const string& table, TeTextSet &ts);	
+	virtual bool updateTextSet	(const string& table, TeTextSet &ts);	
+	virtual bool loadTextSet	(const string& table, const string& geoid, TeTextSet &ts);
+	virtual bool selectTextSet	(const string& table, const string& criteria, TeTextSet &ts);
+
+	virtual bool insertText		(const string& table, TeText &t) = 0;	
+	virtual bool updateText		(const string& table, TeText &t);
+	virtual bool locateText		(const string& table, TeCoord2D &pt, TeText &text, const double& tol = 0.0);
+	virtual bool locateTextSet	(const string& table, TeCoord2D &pt, TeTextSet &textSet, const double& tol = 0.0);
+	//@}
+
+	/** @name Arc
+	*  Accessing/Inserting/Modifying Arc geometries  into the database. 
+	*/
+	//@{ 	
+	// Accessing/Inserting arc geometries into the database
+	virtual bool insertArcSet	(const string& table, TeArcSet &as);	
+	virtual bool updateArcSet	(const string& table, TeArcSet &as);	
+	virtual bool loadArcSet		(const string& table, const string& geoid, TeArcSet &as);
+
+	virtual bool insertArc		(const string& table,TeArc &arc) = 0;
+	virtual bool updateArc		(const string& table,TeArc &arc);
+	//@}
+
+	/** @name Node
+	*  Accessing/Inserting/Modifying Node geometries into the database. 
+	*/
+	//@{ 	
+	// Accessing/Inserting node geometries into the database
+	virtual bool insertNodeSet	(const string& table, TeNodeSet &ns);	
+	virtual bool updateNodeSet	(const string& table, TeNodeSet &ns);	
+	virtual bool loadNodeSet	(const string& table, const string& geoid, TeNodeSet &ps);
+
+	virtual bool insertNode		(const string& table, TeNode &node) = 0;	
+	virtual bool updateNode		(const string& table, TeNode &node);	
+	//@}
+
+	/** @name Cell
+	*  Accessing/Inserting/Modifying Cell geometries  into the database. 
+	*/
+	//@{ 	
+	// Accessing/Inserting cell geometries into the database
+	virtual bool insertCellSet	(const string& table, TeCellSet &cs);	
+	virtual bool updateCellSet	(const string& table, TeCellSet &cs);	
+	virtual bool loadCellSet	(const int& layerId, const string& table, const string& geoid, TeCellSet &cs);
+	virtual bool selectCellSet	(const int& layerId, const string& table, const string& criteria, TeCellSet &cs);
+
+	virtual bool insertCell		(const string& table, TeCell &c) = 0;
+	virtual bool updateCell		(const string& table, TeCell &c);
+	virtual bool locateCell		(const string& table, TeCoord2D &pt, TeCell &c, const double& tol = 0.0);
+	//@}
+	
+	//! Insert a raster block into the database
+	/*!
+      \param table table name
+	  \param blockId block unique identifier
+	  \param ll  block lower left coordinate
+	  \param ur  block upper right coordinate
+	  \param buf block binary data
+	  \param size block size
+	  \param band block band
+	  \param res block resolution factor
+	  \param subband sub band definitiion
+	*/
+	virtual	bool insertRasterBlock(const string& table, const string& blockId, const TeCoord2D& ll, const TeCoord2D& ur, unsigned char *buf,unsigned long size, int band=0, unsigned int res=1, unsigned int subband=0) = 0;
+
+	//! Inserts all visual   
+	virtual	bool insertVisual (TeLegendEntry *legend);
+
+	//! Insert raster visual
+	virtual bool insertRasterVisual (int themeId , TeRasterVisual* rasterVisual);
+
+	//! Returns the raster associated to a layer
+	virtual TeRaster* loadLayerRaster(int layerId, const string& objectId="", const char& mode = 'r');
+
+	//! Creates a lookup table (used for pallete raster representations)
+	virtual bool createLUTTable(const string& name);
+
+	//! Loads a look up table associated to a raster and fills its parameters
+	virtual bool loadRasterLUT(TeRasterParams* par);
+
+	//! Creates a spatial index for a spatial table. It is implemented only in spatial databases.
+	virtual bool createSpatialIndex(const string& /* table */, const string& /* column */, TeSpatialIndexType = TeRTREE,short /* level */ =0,short /* tile */ =0) { return true; };
+
+	//! Creates a spatial metadata for a spatial table. It is implemented only in spatial databases.
+	virtual bool insertMetadata(const string& /* table */, const string& /* column */, double /* tolx */, double /* toly */,TeBox &/* box */,short /* srid */ =0) { return true; };
+
+	/** @name Spatial Operations with vector data
+	*  spatial operations over geometries into the database. 
+	*/
+	//@{ 	
+
+	/** @name topologic relation query
+	*  topologic relation query over geometries into the database. 
+	*/
+	//@{
+	/*!
+	  \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a subset of geometries of this table (actGeomTable)   
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the geometric table
+	  \param actIdsIn		identifiers of a geometry subset of the actGeomTable table 
+	  \param portal			a pointer to a database portal that will contain the resulted geometries
+	  \param relate			spatial relation
+	  \param actCollTable	collection table name
+	 */
+	virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+		TeDatabasePortal *portal, int relate, const string& actCollTable="");
+	
+	/*!
+	  \brief Returns the geometries of a geometric table (visGeomTable) that have a specific spatial relation (relate) with a subset of geometries of other geometric table (actGeomTable)   
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the actGeomTable table
+	  \param actIdsIn		identifiers of a geometry subset of the actGeomTable table 
+	  \param visGeomTable	geometric table name
+	  \param visRep			geometric representation of the visGeomTable table
+	  \param portal			a pointer to a database portal that will contain the resulted geometries
+	  \param relate		 	spatial relation
+	  \param visCollTable	collection table name associated with the visGeomTable table
+	 */
+	virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+		const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, 
+		int relate, const string& visCollTable=""); 
+
+	/*!
+	  \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a geometry in memory (geom)
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the actGeomTable table
+	  \param geom			a pointer to a geometry in memory
+	  \param portal			a pointer to a database portal that will contain the resulted geometries
+	  \param relate			spatial relation
+	  \param actCollTable	collection table name associated with the actGeomTable table
+	 */
+	virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, 
+		TeDatabasePortal *portal, int relate, const string& actCollTable=""); 
+		
+	/*!
+	  \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a subset of geometries of this table (actGeomTable)   
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the geometric table
+	  \param actIdsIn		identifiers of a geometry subset of the actGeomTable table 
+	  \param actIdsOut		structure that will contain the identifiers of the resulted geometries
+	  \param relate			spatial relation
+	  \param actCollTable	collection table name
+	 */
+	virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+		Keys& actIdsOut, int relate, const string& actCollTable="");
+
+	/*!
+	  \brief Returns the geometries of a geometric table (visGeomTable) that have a specific spatial relation (relate) with a subset of geometries of other geometric table (actGeomTable)   
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the actGeomTable table
+	  \param actIdsIn		identifiers of a geometry subset of the actGeomTable table 
+	  \param visGeomTable	geometric table name
+	  \param visRep			geometric representation of the visGeomTable table
+	  \param visIdsOut		structure that will contain the identifiers of the resulted geometries
+	  \param relate			spatial relation
+	  \param visCollTable	collection table name associated with the visGeomTable table
+	 */
+	virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+		const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, int relate, 
+		const string& visCollTable=""); 
+
+	/*!
+	  \brief Returns the geometries of a geometric table (actGeomTable) that have a specific spatial relation (relate) with a geometry in memory (geom)
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the actGeomTable table
+	  \param geom			a pointer to a geometry in memory
+	  \param actIdsOut		structure that will contain the identifiers of the resulted geometries
+	  \param relate			spatial relation
+	  \param actCollTable	collection table name associated with the actGeomTable table
+	*/
+	virtual bool spatialRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, 
+		Keys& actIdsOut, int relate, const string& actCollTable=""); 
+	//@}
+	
+	/** @name metric functions
+	*  metric functions over geometries into the database. 
+	*/
+	//@{
+	/*!
+		\brief Calculates the area of a geometry set of the geometric table (actGeomTable) 
+		\param actGeomTable	geometric table name
+		\param actRep		geometric representation of the geometric table
+		\param actIdsIn		identifiers of the geometry set of the actGeomTable table 
+		\param area			the returned area value 
+	 */
+	virtual bool calculateArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &area);
+
+	/*!
+		\brief Calculates the length of a geometry set of the actGeomTable table 
+		\param actGeomTable	geometric table name
+		\param actRep		geometric representation of the geometric table
+		\param actIdsIn		identifiers of the geometry set of the actGeomTable table 
+		\param length		the returned length value 
+	 */
+	virtual bool calculateLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, double &length);
+	
+	/*!
+		\brief Calculates the distance between two geometries of the actGeomTable table 
+		\param actGeomTable	geometric table name
+		\param actRep		geometric representation of the geometric table
+		\param Ids			identifiers of the two geometries of the actGeomTable table 
+		\param distance		the returned distance value 
+	 */
+	virtual bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, Keys& Ids, double& distance);
+
+	/*!
+		\brief Calculates the distance between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of the geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visRep			geometric representation of the visGeomTable table
+		\param objId2			identifier of the geometry of the visGeomTable table
+		\param distance			the returned distance value 
+	 */
+	virtual bool calculateDistance(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& visGeomTable, TeGeomRep visRep, const string& objId2, double& distance);
+
+	/*!
+	  \brief Returns the geometries of a geometric table (actGeomTable) that are within a specific distance from a point in memory 
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the actGeomTable table
+	  \param point			a point in memory
+	  \param IdsDistOut		structure that will contain the identifiers of the resulted geometries and their distances
+	  \param max_distance	maximum distance 
+	  \param actCollTable	collection table name associated with the actGeomTable table
+	*/
+	virtual bool withinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, 
+		KeysToDist& IdsDistOut, const double& max_distance, const string& actCollTable="");
+	//@}
+
+
+	/** @name metric functions
+	*  functions that generate new geometries over geometries into the database. 
+	*/
+	//@{
+	/*!
+		\brief Returns the buffers with a specific distance of a geometry set of a geometric table (actGeomTable)
+		\param actGeomTable	geometric table name
+		\param actRep		geometric representation of the geometric table
+		\param actIds		identifiers of the geometry set of the actGeomTable table 
+		\param bufferSet	the returned buffers 
+		\param dist			the distance of the buffers
+	 */
+	virtual bool Buffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& bufferSet, double dist);
+
+	/*!
+		\brief Returns the centroids of a geometry set of a geometric table (actGeomTable)
+		\param actGeomTable	geometric table name
+		\param actRep		geometric representation of the geometric table
+		\param centroidSet	the returned centroids 
+		\param actIds		identifiers of the geometry set of the actGeomTable table 
+		\param actCollTable collection table name associated with the actGeomTable table 
+	*/
+	virtual bool Centroid(const string& actGeomTable, TeGeomRep actRep, TePointSet& centroidSet, Keys actIds = vector<string>(), const string& actCollTable = "");
+
+	/*!
+		\brief Returns the convex geometries of a geometries set of a geometric table (actGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the geometric table
+		\param actIds			identifiers of the geometry set of the actGeomTable table 
+		\param convexHullSet	the returned convex geometries 
+	*/
+	virtual bool ConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TePolygonSet& convexHullSet);
+	//@}
+
+	/*!
+		\brief Returns the nearest neighbors of a specific geometry of a geometric table (actGeomTable)
+		\param actGeomTable		geometric table name
+		\param actCollTable		collection table name associated with the actGeomTable table
+		\param actRep			geometric representation of the geometric table
+		\param objId1			identifier of the geometry of the actGeomTable table
+	    \param actIdsOut		structure that will contain the identifiers of the nearest neighbors 
+		\param numRes			the number of nearest neighbors that will be returned
+	*/
+	virtual bool nearestNeighbors(const string& actGeomTable, const string& actCollTable,
+		TeGeomRep actRep, const string& objId1, Keys& actIdsOut, int numRes=1);
+	
+	/*!
+		\brief Returns the nearest neighbors of a geometric table (visGeomTable) of a specific geometry of other geometric table (actGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of the geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visCollTable		collection table name associated with the visGeomTable table
+		\param visRep			geometric representation of the visGeomTable table
+	    \param visIdsOut		structure that will contain the identifiers of the nearest neighbors 
+		\param numRes			the number of nearest neighbors that will be returned
+	*/
+	virtual bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& visGeomTable, const string& visCollTable, 
+		TeGeomRep visRep, Keys& visIdsOut, int numRes=1); 
+
+	/*!
+		\brief Returns the nearest neighbors of a specific geometry of a geometric table (actGeomTable)
+		\param actGeomTable		geometric table name
+		\param actCollTable		collection table name associated with the actGeomTable table
+		\param actRep			geometric representation of the geometric table
+		\param objId1			identifier of the geometry of the actGeomTable table
+	    \param portal			a pointer to a database portal that will contain the identifiers of the nearest neighbors 
+		\param numRes			the number of nearest neighbors that will be returned
+	*/
+	virtual bool nearestNeighbors(const string& actGeomTable, const string& actCollTable, 
+		TeGeomRep actRep, const string& objId1, TeDatabasePortal* portal, int numRes=1);
+
+	/*!
+		\brief Returns the nearest neighbors of a geometric table (visGeomTable) of a specific geometry of other geometric table (actGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of the geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visCollTable		collection table name associated with the visGeomTable table
+		\param visRep			geometric representation of the visGeomTable table
+	    \param portal			a pointer to a database portal that will contain the identifiers of the nearest neighbors 
+		\param numRes			the number of nearest neighbors that will be returned
+	*/
+	virtual bool nearestNeighbors(const string& actGeomTable, TeGeomRep actRep, 
+		const string& objId1, const string& visGeomTable, const string& visCollTable, 
+		TeGeomRep visRep, TeDatabasePortal* portal, int numRes=1); 
+
+	/** @name metric functions
+	*  functions of set: union, intersection, difference and symmetrical difference. 
+	*/
+	//@{
+
+	/*!
+		\brief Returns the intersection between two geometries of a geometric table (actGeomTable) 
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param actIds		identifiers of the geometry set of the actGeomTable table 
+		\param geomVect			the returned intersection 
+	 */
+	virtual bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the intersection between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of a geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visRep			geometric representation of the visGeomTable table
+		\param objId2			identifier of other geometry of the visGeomTable table
+		\param geomVect			the returned intersection 
+	 */
+	virtual bool geomIntersection(const string& actGeomTable, TeGeomRep actRep, const string& objId1,
+		const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the difference between two geometries of a geometric table (actGeomTable) 
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of a geometry of the actGeomTable table
+		\param objId2			identifier of other geometry of the actGeomTable table
+		\param geomVect			the returned difference 
+	 */
+	virtual bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& objId2, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the difference between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of a geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visRep			geometric representation of the visGeomTable table
+		\param objId2			identifier of other geometry of the visGeomTable table
+		\param geomVect			the returned difference 
+	 */
+	virtual bool geomDifference(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the union between geometries of a geometric table (actGeomTable) 
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param actIds			identifiers of the geometry set of the actGeomTable table 
+		\param geomVect			the returned union 
+	 */
+	virtual bool geomUnion(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the union between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of a geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visRep			geometric representation of the visGeomTable table
+		\param objId2			identifier of other geometry of the visGeomTable table
+		\param geomVect			the returned union 
+	 */
+	virtual bool geomUnion(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the symmetrical difference between two geometries of a geometric table (actGeomTable) 
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of a geometry of the actGeomTable table
+		\param objId2			identifier of other geometry of the actGeomTable table
+		\param geomVect			the returned symmetrical difference 
+	 */
+	virtual bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& objId2, TeGeometryVect& geomVect);
+
+	/*!
+		\brief Returns the symmetrical difference between a geometry of a geometric table (actGeomTable) and a geometry of other geometric table (visGeomTable)
+		\param actGeomTable		geometric table name
+		\param actRep			geometric representation of the actGeomTable table
+		\param objId1			identifier of a geometry of the actGeomTable table
+		\param visGeomTable		geometric table name
+		\param visRep			geometric representation of the visGeomTable table
+		\param objId2			identifier of other geometry of the visGeomTable table
+		\param geomVect			the returned symmetrical difference 
+	 */
+	virtual bool geomXOr(const string& actGeomTable, TeGeomRep actRep, const string& objId1, 
+		const string& visGeomTable, TeGeomRep visRep, const string& objId2, TeGeometryVect& geomVect);	
+	//@}
+
+	/** @name Spatial Operations with raster data
+	*  spatial operations over raster data into the database. 
+	*/
+	//@{ 	
+	/*!
+		\brief Returns the statistics of raster data regions inside a geometry set of a geometric table (actGeomTable)
+		\param rasterTable		raster table name
+		\param actGeomTable		geometric table name that contains polygons
+		\param Ids				identifiers of the geometries of the actGeomTable table that define the regions in the raster data  
+		\param result			structure that will contain the resulted statistics 
+	*/
+	virtual bool Zonal(const string& rasterTable, const string& actGeomTable, Keys& Ids, TeObjectStatistics& result);
+	
+	/*!
+		\brief Returns the statistics of raster data regions inside a geometry set of a geometric table (actGeomTable)
+		\param rasterTable		raster table name
+		\param actGeomTable		geometric table name that contains polygons
+		\param actCollTable		collection table that contains the identifiers of the geometries of the actGeomTable table that define the regions in the raster data  
+		\param result			structure that will contain the resulted statistics 
+	*/
+	virtual bool Zonal(const string& rasterTable, const string& actGeomTable, const string& actCollTable, TeObjectStatistics& result);
+	
+	/*!
+		\brief Returns the statistics of a raster data region inside a geometry in memory 
+		\param rasterTable		raster table name
+		\param poly				the geometry in memory that define a region in the raster data 
+		\param result			structure that will contain the resulted statistics 
+	*/
+	virtual bool Zonal(const string& rasterTable, TePolygon& poly, TeStatisticsDimensionVect& result);
+
+	/*!
+		\brief Clips a raster data from a geometry of a geometric table (actGeomTable)
+		\param rasterTable		raster table name
+		\param actGeomTable		geometric table name that contains polygons
+		\param objId			identifier of the geometry of the actGeomTable table 
+		\param nameLayerOut		the layer name that will contain the result 
+		\param st				the strategy used in the clipping of the raster data
+	*/
+	virtual bool Mask(const string& rasterTable, const string& actGeomTable, const string& objId, const string& nameLayerOut, TeStrategicIterator st);
+	
+	/*!
+		\brief Clips a raster data from a geometry in memory (poly)
+		\param rasterTable		raster table name
+		\param poly				a geometry in memory 
+		\param nameLayerOut		the layer name that will contain the result 
+		\param st				the strategy used in the clipping of the raster data
+	*/
+	virtual bool Mask(const string& rasterTable, TePolygon& poly, const string& nameLayerOut, TeStrategicIterator st);
+	//@}
+	
+	/** @name specifics SQLs
+	*  return SQL strings 
+	*/
+	//@{ 	
+	//! Return a string that describes a where clause in SQL to return the geometries inside the box
+	virtual string getSQLBoxWhere (TeBox &box, TeGeomRep rep);
+
+	//! Return a string that describes a where clause in SQL to return the geometries of the table2 that are 
+	//! inside the geometries box of the table1 (table1 must have lower_x, lower_y...) 
+	virtual string getSQLBoxWhere (const string& table1, const string& table2, TeGeomRep rep2, TeGeomRep rep1 = TePOLYGONS);
+
+	//! Return a string SQL to be used in the clause SELECT to select the box (lower_x, lower_y, upper_x, upper_y)
+	virtual string getSQLBoxSelect (const string& tableName, TeGeomRep rep);
+
+	//! Return a string SQL to calculate the statistics of some attributes
+	virtual string getSQLStatistics (TeGroupingAttr& attrs);
+	
+	//! Return the database function in SQL to generate autonumber values
+	virtual string getSQLAutoNumber(const string& table);
+
+	//! Return a string SQL to temporal where
+	virtual string getSQLTemporalWhere (TeTimeInterval& /* timeInterval */, TeTemporalRelation /* timeOperator */, const string& /* initialTime */, const string& /* finalTime */ );
+
+	//! Return a string SQL to temporal where 
+	virtual string getSQLTemporalWhere (const string& temporalRest);
+		
+	//! Return a string SQL to temporal where
+	virtual string getSQLTemporalWhere(int /* time1 */, int /* time2 */, TeChronon /* chr */, TeTemporalRelation /* rel */, const string& /* initialTime */, const string& /* finalTime */);
+
+	virtual string getSQLTime(TeTime& /* time */) { return ""; };
+
+	virtual string getSQLTemporalFunction (TeChronon chr, const string& colName);
+	//@}
+
+	//! Return the box of a specific geometry (object_id)  
+	virtual bool getMBRGeom(string tableGeom, string object_id, TeBox& box, string colGeom);
+
+	//! Return the box of a select objects set 
+	virtual bool getMBRSelectedObjects(string geomTable,string colGeom, string fromClause, 
+		string whereClause, string afterWhereClause, TeGeomRep repType,TeBox &bout, const double& tol = 0.0);
+
+	//! Gets the list of attributes of a table
+	virtual bool getAttributeList(const string& tableName,TeAttributeList& attList);
+
+	//! Escape special characters in a string to be used in a SQL statement
+	virtual string  escapeSequence(const string& from) = 0;
+
+	virtual TeBox getThemeBox(TeTheme* theme);
+
+	map<int, map<string, string> >& mapThemeAlias() {return mapThemeAlias_;}
+
+	//! Concat values in a vector using unionString as the join between each value
+	virtual string concatValues(vector<string>& values, const string& unionString) = 0;
+
+	//! Returns the SQL function for upper case
+	virtual string toUpper(const string& value) = 0;
+
+
+protected :
+
+	bool				isConnected_;		//!< indicates if the connection is open
+	string				host_;				//!< host name of the database server
+	string				user_;				//!< user name 
+	string				password_;			//!< user password
+	string				database_;			//!< database name
+	int					portNumber_;		//!< port number
+	int					errorNumber_;		//!< error number
+	string				errorMessage_;		//!< error message
+	TeLayerMap			layerMap_;			//!< layer map	  
+	TeViewMap			viewMap_;			//!< view map	  
+	TeThemeMap			themeMap_;			//!< theme map	  
+	TeLegendEntryMap	legendMap_;			//!< view map
+	multiset<int>		relationMSet_;		//!< multiset of relations between tables
+	string				dbmsName_;			//!< DBMS name (Ado, MySQL, Postgres, OracleSpatial)
+	map<int, map<string, string> > mapThemeAlias_;
+};
+/*! \example DatabaseExample1.cpp
+	This is an example of how to use the TeDatabase to create a TerraLib Database
+ */
+
+/*! \example DatabaseExample2.cpp
+	This is an example of how to use the TeDatabase class to open a connection
+	to a database and and retrieve some geometries
+ */
+
+/*! \example SpatialOperation1.cpp
+	This is an example of how to use the TeDatabasePortal class to manipulate geometries
+	returned from queries on geometry tables
+ */
+
+
+//! An abstract access portal to a database
+/*! A portal has a concept of a record set, that is generated by a selection (query) on
+	the data accessible through a connection to a database server.
+  \sa 
+  TeDatabase, TeGeometry, TeTable, TeTheme, TeView, TeLayer
+
+  */
+class TeDatabasePortal {
+protected:
+	
+
+	TeDatabase*		db_;			//!< the database associated to this portal
+	TeAttributeList	attList_;		//!< the list of attributes associated to this portal
+	int				numRows_;		//!< the number of rows in this portal
+	int				numFields_;		//!< the number of fields in this portal
+	string          errorMessage_;	//!< error message
+	int				errorNumber_;	//!< error number
+
+public :
+
+	//!Constructor 
+	TeDatabasePortal ();
+
+	//! Destructor
+	virtual ~TeDatabasePortal ();
+	
+	//! Returns the database associated to this portal 
+	TeDatabase* getDatabase()
+	{ return db_; }
+
+	//! Executes a SQL query that opens a record set
+	virtual bool query ( const string &qry, TeCursorLocation l = TeSERVERSIDE, TeCursorType t = TeUNIDIRECTIONAL, TeCursorEditType e = TeREADONLY, TeCursorDataType dt = TeTEXTCURSOR ) = 0;
+
+	//! Fetchs the next row in a record set that should�ve been previously opened
+	virtual bool fetchRow () = 0;
+
+	//! Fetchs a particular row
+	virtual bool fetchRow (int i) = 0;
+
+	//! Frees the current record set
+	virtual void freeResult () = 0;
+
+	//! Gets the last error message
+	virtual string	errorMessage ()
+	{ return errorMessage_; }
+
+	//! Gets the number of the last error message
+	virtual int errorNum ()
+	{ return errorNumber_; }
+	
+//	virtual bool loadNetwork (TeLayer *layer) = 0;
+
+// specific SQL SELECT command methods
+
+	//! Retrieves the number of rows in this portal
+	int numRows () 
+	{ return numRows_;}
+
+	//! Retrieves the number of fields in this portal
+	int numFields () 
+	{ return numFields_; }
+
+	//! Retrieves attribute list in this portal
+	TeAttributeList AttributeList()	
+	{ return attList_; }
+
+	//! Retrieves the i-th attribute in this portal
+	TeAttribute getAttribute (int i);
+
+	//! Retrieves an attribute by name
+	TeAttribute getAttribute (const string& s);
+
+	//! Gets the value of the i-th attribute as a literal
+	virtual char* getData (int i) = 0;
+
+	//! Gets the value of a named attribute as a literal
+	virtual char* getData (const string& s) = 0;
+
+	//! Gets the value of the i-th attribute as a double
+	virtual double getDouble (int i);
+
+	//! Gets the value of a named attribute as a double
+	virtual double getDouble (const string& s);
+
+	//! Gets the value of the i-th attribute as an integer
+	virtual int getInt (int i);
+
+	//! Gets the value of a named attribute as an integer
+	virtual int getInt (const string& s);
+
+	//! Gets the value of a named attribute as a boolean
+	virtual bool getBool (const string& s) = 0;
+
+	//! Gets the value of the i-th attribute as a boolean
+	virtual bool getBool (int i) = 0;
+
+	//! Gets the value of the i-th attribute as a date 
+	virtual TeTime getDate (int i) = 0;
+
+	//! Gets the value of a named attribute as a date 
+	virtual TeTime getDate (const string& s) = 0;
+
+	//! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+	virtual string getDateAsString(int i) = 0;
+
+	//! Gets the of a date/time attribute as a string formatted as accepted in further SQL statements
+	virtual string getDateAsString(const string& s) = 0;
+
+	//! Gets the value of a named BLOB attribute 
+	virtual bool getBlob(const string& s, unsigned char* &data, long& size) = 0;
+
+	//! Gets the index of a named attribute
+	int getColumnIndex (const string& s);
+
+	//! Gets the name of the i-th attribute
+	string getColumnName (int i);
+
+	/** @name Data Model
+	  The following methods decodify structures as stored 
+	  in the database according to the data model proposed in TerraLib. 
+	*/
+	//@{ 	
+	virtual TeViewTree*		getViewTree ();
+	virtual TeLegendEntry	getLegend();
+	virtual TeVisual		getVisual();
+	virtual TeColor			getColor(); 
+	virtual bool getRasterBlock(unsigned long& size, unsigned char* ptData)=0;
+	//@}
+
+	/** @name Fetch Geometry
+	  The following methods decodify geometries as stored 
+	  in the database according to the data model proposed in TerraLib .
+	  \par The fetchGeometry methods advance the portal to the next record
+	  and they return TRUE if there are more records to be read and FALSE otherwise
+	*/
+	//@{ 	
+	virtual	bool fetchGeometry (TePolygon& pol) = 0;
+	virtual	bool fetchGeometry (TeLine2D& line) = 0;
+	virtual	bool fetchGeometry (TeNode& n) = 0;
+	virtual	bool fetchGeometry (TePoint& p) = 0;
+	virtual	bool fetchGeometry (TeCell& cell);
+	virtual	bool fetchGeometry (TeArc& arc);
+	virtual	bool fetchGeometry (TeText& text);
+	//@}
+};
+
+
+/*! \example DatabaseExample3.cpp
+	This is an example n example of how to use the databse interface to do some spatial queries
+ */
+#endif
+
diff --git a/src/terralib/kernel/TeDatum.cpp b/src/terralib/kernel/TeDatum.cpp
new file mode 100644
index 0000000..10f5b9f
--- /dev/null
+++ b/src/terralib/kernel/TeDatum.cpp
@@ -0,0 +1,222 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <map>
+
+using namespace std;
+
+#include "TeDatum.h"
+#include "TeException.h"
+#include "TeUtils.h"
+
+const int NUMDATUM = 8; // number of datum
+const int NUMSPH   = 8; // number of ellipsoids
+
+struct SphParam 
+{
+	double rd;
+	double flt;
+};
+
+typedef map<string, SphParam> SphMap;
+
+// Spheroid       Radius(Semi Major Axis)        Flattening
+char* ellipsoidList [] = 
+{ 
+"Airy",	       "6.3775634e+06", "3.340906e-03",	  
+"Clarke-1866", "6.378206e+06",	"3.390060e-03",	 
+"EarthRadius", "6.371000e+06",	"0.000000e+00",
+"Everest",     "6.3772763e+06", "3.324468e-03",
+"GRS80",       "6.378137e+06",  "3.352811e-03",
+"Hayford", 	   "6.378388e+06",  "3.367003e-03", 	 
+"UGGI67", 	   "6.378160e+06",	"3.352892e-03",	 
+"WGS84",	   "6.378137e+06",	"3.352811e-03"
+};
+
+
+
+// DatumName    Spheroid        Shift_X           Shift_Y           Shift_Z
+
+char* datumList [] = 
+{ 
+"Astro-Chua",   "Hayford",      "-7.700000e+01",  "2.390000e+02",  "5.000000e+00",
+"CorregoAlegre","Hayford",	    "-1.387000e+02",  "1.644000e+02",  "3.440000e+01",
+"Indian",	    "Everest",	    "0.000000e+00",   "0.000000e+00",  "0.000000e+00",
+"NAD27",	    "Clarke-1866",	"0.000000e+00",   "0.000000e+00",  "0.000000e+00",
+"NAD83",	    "GRS80",	    "0.000000e+00",   "0.000000e+00",  "0.000000e+00",
+"SAD69", 	    "UGGI67",       "0.000000e+00",   "0.000000e+00",  "0.000000e+00",
+"Spherical",	"EarthRadius",  "0.000000e+00",   "0.000000e+00",  "0.000000e+00",
+"WGS84",	    "WGS84",	    "6.687000e+01",   "-4.370000e+00", "3.852000e+01"
+};
+
+typedef map<string, TeDatum> DatumMap;
+
+
+TeDatum::TeDatum(const TeDatum& other)
+{
+	name_ = other.name_;
+	rd_ = other.rd_ ;
+	flt_= other.flt_;
+	dx_ = other.dx_;
+	dy_= other.dy_;
+	dz_ = other.dz_;
+}
+
+TeDatum&
+TeDatum::operator=(const TeDatum& rhs)
+{
+	if ( this != &rhs )
+	{
+		name_ = rhs.name_;
+		rd_ = rhs.rd_;
+		flt_= rhs.flt_;
+		dx_ = rhs.dx_;
+		dy_= rhs.dy_;
+		dz_ = rhs.dz_;
+	}
+	return *this;
+}
+
+
+TeDatum
+TeDatumFactory::make( const string& name )
+{
+
+	DatumMap datumMap_;
+	// Step 1 - Read the Spheroids - Put in a Map
+
+	SphMap sphMap;
+
+	SphParam sphPar;
+
+	int i, k = 0;
+
+	for ( i = 0; i < NUMSPH; i++ )
+	{
+		string name = ellipsoidList [k++];
+		sphPar.rd  = atof ( ellipsoidList [k++] );
+		sphPar.flt = atof ( ellipsoidList [k++] );
+
+		sphMap [ name ] = sphPar;
+	}
+	
+	// Step 2 - Read the Datum List, create a Map
+
+
+	k = 0;
+
+	for ( i = 0; i < NUMDATUM; i++ )
+	{
+			string name = datumList [k++];
+			
+			string sphname = datumList [ k++];
+
+			double 	dx  = atof ( datumList [k++] );
+			double  dy  = atof ( datumList [k++] );
+			double  dz  = atof ( datumList [k++] );
+
+			SphMap::iterator it = sphMap.find ( sphname );
+			
+			if ( it == sphMap.end() )
+			{
+				throw TeException ( DATUM_ERROR );
+			}
+			else 
+				sphPar = (*it).second;
+
+			TeDatum dat ( name, sphPar.rd, sphPar.flt, dx, dy, dz );
+
+			datumMap_ [ name ] = dat; // create a datum map
+	}
+
+	DatumMap::iterator it = datumMap_.find ( name );
+
+	if ( it != datumMap_.end() ) // found it
+		return (*it).second;
+
+	return TeDatum ("Spherical");
+}
+
+
+bool findDatum(double semiMajor, double flatenning, TeDatum& datum)
+{
+	DatumMap datumMap_;
+
+	// Step 1 - Read the Spheroids - Put in a Map
+
+	SphMap sphMap;
+	SphParam sphPar;
+
+	int i, k = 0;
+
+	for ( i = 0; i < NUMSPH; i++ )
+	{
+		string name = ellipsoidList [k++];
+		sphPar.rd  = atof ( ellipsoidList [k++] );
+		sphPar.flt = atof ( ellipsoidList [k++] );
+
+		sphMap [ name ] = sphPar;
+	}
+	
+	// Step 2 - Read the Datum List, create a Map
+	k = 0;
+
+	for ( i = 0; i < NUMDATUM; i++ )
+	{
+		string name = datumList [k++];
+		string sphname = datumList [ k++];
+		double 	dx  = atof ( datumList [k++] );
+		double  dy  = atof ( datumList [k++] );
+		double  dz  = atof ( datumList [k++] );
+
+		SphMap::iterator it = sphMap.find ( sphname );
+			
+		if ( it == sphMap.end() )
+		{
+			throw TeException ( DATUM_ERROR );
+		}
+		else 
+			sphPar = (*it).second;
+		TeDatum dat ( name, sphPar.rd, sphPar.flt, dx, dy, dz );
+		datumMap_ [ name ] = dat; // create a datum map
+	}
+
+	DatumMap::iterator it = datumMap_.begin();
+	while (it != datumMap_.end())
+	{
+		TeDatum dt = (*it).second;
+		if ( TeCompareDouble(dt.radius(),semiMajor,6) &&
+			 TeCompareDouble(dt.flattening(),flatenning,6))
+		{
+
+			datum = dt;
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
diff --git a/src/terralib/kernel/TeDatum.h b/src/terralib/kernel/TeDatum.h
new file mode 100644
index 0000000..933ab3e
--- /dev/null
+++ b/src/terralib/kernel/TeDatum.h
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_DATUM_H
+#define  __TERRALIB_INTERNAL_DATUM_H
+
+#include <string>
+#include <cmath>
+using namespace std;
+
+//! Implements valid Datum options and related parameters which account for different earth spheroids.
+/*! Specifies planimetric TeDatum parameters to be used for defining geodetic
+	coordinates, which are necessary to establish a map projection system.
+	It encapsulates the following important information regarding 
+	a planimetric Datum such as:
+	\li	Datum name;
+	\li	Earth equatorial radius;
+	\li	Earth flatenning;
+	\li	Datum shifts. 
+
+	\author
+	 Ubirajara Freitas, Julio d'Alge.
+
+	\sa TeDatumFactory
+*/
+class TeDatum
+{
+private:
+	string	name_;		//!< Planimetric TeDatum name
+	double	rd_,		//!< Earth equatorial radius (m) 
+			flt_;		//!< Earth flattening 
+	double	dx_,		//!< TeDatum shift along x axis (m)
+			dy_,		//!< TeDatum shift along y axis (m)
+			dz_;		//!< TeDatum shift along z axis (m) 
+public:
+
+	//!	Constructor.
+	TeDatum ( string name = "Spherical", double rd = 6.371000e+06 , double flt = 0., 
+			  double dx = 0., double dy= 0., double dz = 0.):
+	name_ ( name ),
+	rd_   (  rd  ),
+	flt_  ( flt  ),
+	dx_   (  dx  ),
+	dy_   (  dy  ),
+	dz_   (  dz  )
+	{ }
+
+	//! Copy constructor
+	TeDatum(const TeDatum& other);
+
+	//! Operator =
+	TeDatum& operator=(const TeDatum& rhs);
+
+	//!	Destructor.
+	~TeDatum () {}
+
+	//! Returns the datum name
+	string 	name()	 const			
+	{ return name_;} 
+
+	//! Sets the datum name
+	void name(const string& name)	 			
+	{	name_ = name;	} 
+
+	//! Returns Earth equatorial radius (m)
+	double radius() const
+	{ return rd_; }
+
+	//! Sets Earth equatorial radius (m)
+	void radius(const double rd) 
+	{ rd_ = rd; }
+
+	//! Returns the Earth equatorial radius (m) (m)
+	double flattening() const
+	{ return flt_; }
+
+	//! Sets the Earth equatorial radius (m) (m)
+	void flattening(const double flt) 
+	{ flt_ = flt; }
+
+	//! Returns the shift along x axis (m)
+	double	xShift() const
+	{ return dx_; }
+ 
+	//! Returns the shift along y axis (m)
+	double  yShift() const 
+	{ return dy_; }
+
+	//! Returns the shift along z axis (m)
+	double zShift()  const
+	{ return dz_; }
+
+
+//!		Verifies if current TeDatum is equal to TeDatum& dat. 
+	bool operator== (const TeDatum& dat) const 
+	{
+		return (  (fabs(rd_-dat.rd_)     <= 1.0e-6f) 
+			   && (fabs(flt_-dat.flt_)   <= 1.0e-6f)
+			   && (fabs(dx_ - dat.dx_)   <= 1.0e-6f) 
+			   && (fabs(dy_ - dat.dy_)   <= 1.0e-6f) 
+			   && (fabs(dz_ - dat.dz_)   <= 1.0e-6f) 
+			   ); 
+	}
+};
+
+//! Produces a Datum accordingly to an specified name
+class TeDatumFactory
+{
+public:
+	//! factory method - clones a datum given a name
+	static	TeDatum make ( const string& name );
+};
+
+/*! 
+   \fn   findDatum(double semiMajor, double flatenning, TeDatum& datum)
+   \brief Tries to find the a TeDatum according to givem semi major axis and earth flattening
+ */
+bool findDatum(double semiMajor, double flatenning, TeDatum& datum);
+
+#endif
+
diff --git a/src/terralib/kernel/TeDecoder.h b/src/terralib/kernel/TeDecoder.h
new file mode 100644
index 0000000..9e85e6a
--- /dev/null
+++ b/src/terralib/kernel/TeDecoder.h
@@ -0,0 +1,181 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoder.h
+    This file deals with decoding of raster structures 
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODER_H
+#define  __TERRALIB_INTERNAL_DECODER_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeProjection.h"
+#include "TeBox.h"
+#include "TeRasterParams.h"
+#include "TeFactory.h"
+
+using namespace std;
+#include <string>
+#include <list>
+#include <map>
+
+class TeRaster;
+class TeDecoderMemory;
+
+//! An abstract class to decode raster data 
+/* 
+	A decoder keeps its own copy of the  parameters associated
+	to the raster being decoded.
+	
+	\sa TeRaster, TeRasterParams
+*/
+class TeDecoder {
+
+public:
+	//! Empty constructor
+	TeDecoder() {}
+
+	//! Constructor from  raster parameters
+	/*!
+		\param par raster parameters
+	*/
+	TeDecoder(TeRasterParams& par) : params_(par) {}
+
+	//! Virtual destructor (derived classe might have their own)
+	virtual ~TeDecoder() {}	
+
+	//! Returns the raster parameters
+	TeRasterParams& params()
+		{ return params_; }
+
+	//! Updates the raster parameters
+	void updateParams(TeRasterParams& par)
+	{	params_ = par; }
+
+	//! Sets the value of a specific raster pixel 
+	/*!
+		\param col pixel column identifier
+		\param lin pixel line identifier
+		\param val pixel value being inserted
+		\param band pixel band identifier
+	*/
+	virtual bool setElement(int col, int lin, double val, int band=0 ) = 0;
+
+	//! Gets an specific element (col, lin, band) of a raster data
+	/*!
+		\param col pixel column identifier
+		\param lin pixel line identifier
+		\param val pixel value being retrieved
+		\param band pixel band identifier
+	*/
+	virtual bool getElement(int col, int lin, double& val, int band=0 ) = 0;
+
+	//! Transform a geographical coordinate to an index (lin, col) coordinate
+	virtual TeCoord2D coord2Index (TeCoord2D &pt)
+	{	return params_.coord2Index(pt);	}
+
+	//! Transform an index (lin, col) coordinate to geographical coordinate
+	virtual TeCoord2D index2Coord (TeCoord2D &pt)
+	{	return params_.index2Coord(pt);	}
+
+	//! Initializes the internal structures of the decoder from an external raster parameters structure
+	/*  
+	    Copy the raster parameters to the internal parameters of the raster
+		calls the init() method
+	*/
+	virtual void init( TeRasterParams& par ) 
+	{ clear(); params_= par; init();}
+
+	//! Initializes the internal structures of the decoder, from its raster parameters structure.
+	virtual void init() = 0;
+
+	//! Clears its internal structures
+	virtual bool clear() = 0;
+
+	//! Returns a default object - for compatibility reasons with TeDecoderFactory
+	static TeDecoder* DefaultObject( const TeRasterParams& /* par */) 
+	{ return 0; }
+
+/** @name Selection
+  These routines are used to implement a selection of blocks or tiles 
+  that intercept a given bounding box, and provide them sequentially.
+  Decoders that decodify rasters in formats that support tiling should
+  reimplement theses functions in an optimized way.
+*/
+//@{ 
+	
+	//! Returns TRUE if it there are raster blocks that intersect a given box
+	virtual bool selectBlocks(TeBox& /* bb */, int /* resFac */, TeRasterParams& /*parBlock*/)  
+	{ return false; }
+
+	//! Gets the the current raster block selected as a raster in memory
+	virtual bool getSelectedRasterBlock(TeDecoderMemory* /* memDec */) 
+	{ return false; }
+
+	//! Clear a block selection previously done
+	virtual void clearBlockSelection() {}
+
+	//! Returns the raster best resolution level available to fill a given bounding box with a given number of lines and columns in a given projection
+	virtual int bestResolution(TeBox& /*bb*/, int /*ncols*/, int /*nlines*/, TeProjection* /*proj*/)
+	{	return 1; }
+
+	//! Returns the number of blocks selected in the last query
+	virtual int numberOfSelectedBlocks()
+	{	return 0; }
+
+//@}
+
+protected:
+
+//! The parameters that describes a raster data
+	TeRasterParams  params_;	
+};
+
+//! A decoder abstract factory
+/*! 
+	Implements an abstract factory that builds appropriate decoders
+	according to a string identifier.
+*/
+class TeDecoderFactory: public TeFactory<TeDecoder,TeRasterParams> 
+{
+public:
+
+	//! Maps synonyms to decoders identifiers (example "TIFF" or "tif" to  decoderTIFF
+	typedef map<string,string> TeNames2Decoders;
+
+	//! Unique instance instance of map from synonyms to decoder identifiers
+	static TeNames2Decoders& instanceName2Dec ()
+	{ 
+		static TeNames2Decoders names2dec_;
+		return names2dec_;
+	}
+
+	//! Builds an appropriate decoder from a identifier
+	TeDecoderFactory(const string& name) : TeFactory<TeDecoder,TeRasterParams>(name) { }
+
+	//! Destructor
+	virtual ~TeDecoderFactory() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderASCIIGrid.cpp b/src/terralib/kernel/TeDecoderASCIIGrid.cpp
new file mode 100644
index 0000000..e4aad2d
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderASCIIGrid.cpp
@@ -0,0 +1,335 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeDecoderASCIIGrid.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+/*
+Expected format for ESRI ASCII GRID Files (Copied from the ArcWorkstation 8.3 Help File):
+
+<NCOLS xxx>
+<NROWS xxx>
+<XLLCENTER xxx | XLLCORNER xxx>
+<YLLCENTER xxx | YLLCORNER xxx>
+<CELLSIZE xxx>
+{NODATA_VALUE xxx}
+row 1
+row 2
+.
+.
+.
+row n
+*/
+
+TeDecoderASCIIGrid::TeDecoderASCIIGrid (const TeRasterParams& par) : 
+	TeDecoderMemory()
+{	
+	if (par.fileName_.empty())
+		return;
+	params_ = par;
+	params_.decoderIdentifier_ = "ASCIIGRID";
+	if (params_.mode_ == 'w' || params_.mode_ == 'r')
+		readParameters();
+}
+
+TeDecoderASCIIGrid::~TeDecoderASCIIGrid ()
+{
+	if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+	{			// save contents to disk
+		try
+		{
+			TeAsciiFile sFile(params_.fileName_,"w+");
+			if (writeParameters(sFile))
+				saveData(sFile);
+		}
+		catch (...)
+		{
+		}
+	}
+	TeDecoderMemory::clear();
+}
+
+bool
+TeDecoderASCIIGrid::clear()
+{
+	if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+	{			// save contents to disk
+		try
+		{
+			TeAsciiFile sFile(params_.fileName_,"w+");
+			if (writeParameters(sFile))
+				saveData(sFile);
+		}
+		catch (...)
+		{
+		}
+		isModified_ = false;
+	}
+	TeDecoderMemory::clear();
+	return true;
+}
+
+bool 
+TeDecoderASCIIGrid::readParameters()
+{
+	try
+	{
+		TeAsciiFile	pFile (params_.fileName_);
+		string name;
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (TeStringCompare(name,"NCOLS"))
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		params_.ncols_ = pFile.readInt();
+		pFile.findNewLine();
+
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (TeStringCompare(name,"NROWS"))
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		params_.nlines_ = pFile.readInt();
+		pFile.findNewLine();
+
+		bool isCenter = false;
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (TeStringCompare(name,"XLLCENTER"))
+			{
+				isCenter = true; 
+				break;
+			}
+			else if (TeStringCompare(name,"XLLCORNER"))
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		double llx = pFile.readFloat();
+		pFile.findNewLine();
+
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (TeStringCompare(name,"YLLCENTER"))
+			{
+				isCenter = true; 
+				break;
+			}
+			else if (TeStringCompare(name,"YLLCORNER"))
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		double lly = pFile.readFloat();	
+		pFile.findNewLine();
+
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (TeStringCompare(name,"CELLSIZE"))
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		params_.resx_ = params_.resy_ = pFile.readFloat();		
+		pFile.findNewLine();
+
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (TeStringCompare(name,"NODATA_VALUE"))
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		double dummy = pFile.readFloat();		
+		params_.useDummy_ = true;
+		params_.nBands(1);
+		params_.setDummy(dummy);
+		params_.nBands(1);
+		params_.useDummy_ = true;
+		params_.setDummy(dummy);
+		params_.setDataType(TeDOUBLE);
+		params_.setPhotometric(TeRASTERMULTIBAND);
+		params_.lowerLeftResolutionSize(llx,lly,params_.resx_,params_.resy_,
+				                      params_.ncols_,params_.nlines_,isCenter);
+		TeProjection* pp = new TeNoProjection();
+		params_.projection(pp);
+		delete pp;
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+bool
+TeDecoderASCIIGrid::readFile(const string& filename)
+{
+	string valstring;
+	try 
+	{
+		TeAsciiFile	pFile (filename);
+		string name;
+		while (pFile.isNotAtEOF() && !TeStringCompare(name,"NODATA_VALUE"))
+			name = pFile.readString();
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		pFile.findNewLine();
+		for (int lin = 0; lin < params_.nlines_; ++lin)
+		{
+			for (int col = 0; col < params_.ncols_; ++col)
+			{
+				setElement(col,lin,pFile.readFloat());
+			}
+		}
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+void
+TeDecoderASCIIGrid::init()
+{
+	params_.status_= TeNOTREADY;
+	int nb = params_.nBands();
+	if (nb != 1 )
+		return;
+
+	TeDecoderMemory::init();			// try to allocate enough memory
+	if (params_.status_ == TeNOTREADY)
+		return;
+
+	params_.status_= TeNOTREADY;
+	if (params_.mode_ == 'c')	// creating a new file
+	{
+		if (access(params_.fileName_.c_str(),00) != -1) // remove existing file
+		{
+			if (unlink(params_.fileName_.c_str()) == -1)
+				return;
+		}
+		try
+		{
+			TeAsciiFile sFile(params_.fileName_,"w+");
+			if (!writeParameters(sFile) || !saveData(sFile))
+				return;
+			else
+			{
+				params_.status_ = TeREADYTOWRITE;
+			}
+		}
+		catch (...)
+		{
+			return;
+		}
+	}
+	else if (params_.mode_ == 'w')
+	{
+		if ((access(params_.fileName_.c_str(),06) == -1) || !readFile(params_.fileName_))
+			return;
+		params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'r')
+	{
+		if ((access(params_.fileName_.c_str(),04) == -1)|| !readFile(params_.fileName_))
+			return;
+		params_.status_ = TeREADYTOREAD;	
+	}
+}
+
+bool 
+TeDecoderASCIIGrid::writeParameters(TeAsciiFile& pFile)
+{
+	string name;
+	try
+	{
+		TeBox box = params_.box();
+		name = "NCOLS " + Te2String(params_.ncols_) + "\n";
+		pFile.writeString(name);
+		name = "NROWS " + Te2String(params_.nlines_) + "\n";
+		pFile.writeString(name);
+		name = "XLLCENTER " + Te2String(box.x1_,6) + "\n";
+		pFile.writeString(name);
+		name = "YLLCENTER " + Te2String(box.y2_,6) + "\n";
+		pFile.writeString(name);
+		name = "CELLSIZE " + Te2String(params_.resx_,6) + "\n";
+		pFile.writeString(name);
+		name = "NODATA_VALUE " + Te2String(params_.dummy_[0],6) + "\n";
+		pFile.writeString(name);
+	}
+	catch (...)
+	{
+		return false;
+	}
+	return true;
+}
+
+bool 
+TeDecoderASCIIGrid::saveData(TeAsciiFile& pFile)
+{
+	bool isi = (params_.dataType_[0] != TeDOUBLE) && (params_.dataType_[0] != TeFLOAT);
+
+	FILE* fp = pFile.FilePtr();
+	char fmt[100];
+	if (isi)
+		strcpy(fmt,"%.0f ");
+	else
+		strcpy(fmt,"%f ");
+	try
+	{
+		double d;
+		for (int l=0; l<params_.nlines_; ++l)
+		{
+			for (int c=0; c<params_.ncols_; ++c)
+			{
+				TeDecoderMemory::getElement(c,l,d);
+				fprintf(fp,fmt,d);
+			}
+			pFile.writeNewLine();
+		}
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
diff --git a/src/terralib/kernel/TeDecoderASCIIGrid.h b/src/terralib/kernel/TeDecoderASCIIGrid.h
new file mode 100644
index 0000000..a615f46
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderASCIIGrid.h
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderASCIIGrid.h
+    This file deals with decoding of raster data in a ASCII SPRING format
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERASCIIGrid_H
+#define  __TERRALIB_INTERNAL_DECODERASCIIGrid_H
+
+#include "TeDecoderMemory.h"
+
+class TeAsciiFile;
+
+//! Implements a decoder for rasters in ESRI, Inc.'s ASCII Grid format
+class TeDecoderASCIIGrid : public TeDecoderMemory
+{
+public:
+	//! Empty constructor
+	TeDecoderASCIIGrid () : TeDecoderMemory() 
+	{	params_.decoderIdentifier_ = "ASCIIGRID";	}
+
+	//! Constructor from some parameters
+	TeDecoderASCIIGrid (const TeRasterParams& par);
+
+	//! Destructor
+	~TeDecoderASCIIGrid ();
+
+	void	init();
+	bool	clear();
+private:
+    bool    readFile(const string& filename);
+	bool	readParameters();
+	bool	writeParameters(TeAsciiFile& pFile);
+	bool	saveData(TeAsciiFile& pFile);
+};
+
+//! Implements a factory to build decoders to JPEG raster
+class TeDecoderASCIIGridFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderASCIIGridFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderASCIIGrid(arg); }
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderDatabase.cpp b/src/terralib/kernel/TeDecoderDatabase.cpp
new file mode 100644
index 0000000..e5481a4
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderDatabase.cpp
@@ -0,0 +1,452 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderDatabase.h>
+#include <TeDecoderMemory.h>
+#include <TeRasterRemap.h>
+#include <zlib.h>
+#ifdef WIN32
+#include <jpeg.h>
+#endif
+#include <TeDataTypes.h>
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+
+TeDecoderDatabase::TeDecoderDatabase(const TeRasterParams& par ):
+	TeDecoderVirtualMemory(par),
+	db_(par.database_),
+	blockPortal_(0),
+	memAux_(0),
+	nSelectedBlocks_(0)
+{
+	params_ = par;
+	params_.decoderIdentifier_ = "DB";
+}
+
+TeDecoderDatabase::~TeDecoderDatabase()
+{
+	clearBlockSelection();
+	clear();
+}
+
+bool
+TeDecoderDatabase::create()
+{
+	if (db_ == 0)
+		return false;
+
+	// Create raster table in database
+  	if (!db_->createRasterGeometry (params_.fileName_))
+		return false;
+	return true;
+}
+
+void
+TeDecoderDatabase::init()
+{
+	clearBlockSelection();
+	clear();
+	params_.status_= TeNOTREADY;
+	if (db_ == 0)			// there is not valid database connection
+		return;
+
+	if (params_.mode_ == 'c')
+	{
+		if (db_->tableExist(params_.fileName_))
+		{
+			string sql = "DROP TABLE " + params_.fileName_;
+			db_->execute(sql);
+		}
+  		if (!db_->createRasterGeometry (params_.fileName_))
+			return;
+		else params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'w')
+	{
+		if (db_->tableExist(params_.fileName_))
+			params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'r')
+	{
+		if (db_->tableExist(params_.fileName_))
+			params_.status_ = TeREADYTOREAD;		
+	}
+	TeDecoderVirtualMemory::init();
+	return;
+}
+
+bool
+TeDecoderDatabase::clear()
+{
+	if (db_ == 0)
+		return false;
+	TeDecoderVirtualMemory::clear();
+	if (blockPortal_)
+		delete blockPortal_;
+	blockPortal_ = 0;
+	if (memAux_)
+		delete []memAux_;
+	memAux_ = 0;
+	params_.status_ = TeNOTREADY;
+	return true;
+}
+
+string 
+TeDecoderDatabase::codifyId(int col, int lin, int band, int /*res*/, int /*subb*/)
+{
+	char id[32];
+	if (params_.tiling_type_ == TeExpansible)
+	{
+		TeCoord2D tmpCoord = TeCoord2D(col,lin);
+		TeCoord2D xy = params_.index2Coord(tmpCoord);
+
+		double bXSize = params_.blockWidth_*params_.resx_;
+		double bYSize = params_.blockHeight_*params_.resy_;
+
+		int magicX, magicY;
+		if ( xy.x() < 0)
+			magicX = (int)(xy.x()/bXSize - 1);
+		else
+			magicX = (int)(xy.x()/bXSize);
+
+		if (xy.y() < 0)
+			magicY = (int) (xy.y()/bYSize-1);
+		else
+			magicY = (int) (xy.y()/bYSize);
+
+		sprintf(id,"X%dY%dB%dR%dS0",magicX,magicY,band,params_.resolution_);
+	}
+	else
+		sprintf(id,"X%dY%dB%dR%dS0",
+	    (int)(col/params_.blockWidth_),(int)(lin/params_.blockHeight_),band,params_.resolution_);
+
+	return string(id);
+}
+
+void 
+TeDecoderDatabase::decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb)
+{
+	char lixo;
+	int magicX, magicY;
+	if (params_.tiling_type_ == TeExpansible)
+	{
+		sscanf(id.c_str(),"%1c%d%1c%d%1c%d%1c%d%1c%d",&lixo,&magicX,&lixo,&magicY,&lixo,&band,&lixo,&res,&lixo,&subb);
+
+		double bXSize = params_.blockWidth_*params_.resx_;
+		double bYSize = params_.blockHeight_*params_.resy_;
+		
+		TeCoord2D xy(magicX*bXSize+params_.resx_/2,magicY*bYSize+params_.resy_/2);
+
+		xy = params_.coord2Index(xy);
+		lin = TeRound(xy.y())-params_.blockHeight_+1;
+		col = TeRound(xy.x());
+	}
+	else 
+	{
+		sscanf(id.c_str(),"%1c%d%1c%d%1c%d%1c%d%1c%d",&lixo,&magicX,&lixo,&magicY,&lixo,&band,&lixo,&res,&lixo,&subb);
+		col = magicX*params_.blockWidth_;
+		lin = magicY*params_.blockHeight_;
+	}
+}
+
+bool 
+TeDecoderDatabase::getRasterBlock(const string& index, void *block, int& ulCol, int& ulLin)
+{
+
+	TeDatabasePortal* portal = db_->getPortal();
+	if (!portal) 
+		return false;
+	
+	string q;					// try to get the tile from databatase
+	q ="SELECT * FROM " + params_.fileName_ + " WHERE block_id='" + index + "'";
+
+	if (!portal->query(q))		// error submting query 
+	{
+		delete portal;
+		return 0;
+	}
+
+	int res, subb, band=0;
+	if (!portal->fetchRow())	// tile is not in the database
+	{
+		decodifyId(index,ulCol,ulLin,band,res, subb);
+		delete portal;
+		return 0;
+	}
+
+	if (!memAux_)
+	{
+		long size = params_.blockHeight_ * params_.blockWidth_ * params_.nbitsperPixel_[0]/8;
+		memAux_ = new unsigned char[size];
+	}
+
+	// tile is already in the database
+	unsigned long blobLen;
+	if (!portal->getRasterBlock(blobLen,memAux_))
+	{
+		delete portal;
+		return false;
+	}
+
+	// decompress blob into a tile (previously allocated) 
+	if (params_.compression_[band] == TeZLib)		// zlib compression
+	{
+		unsigned long blockLen;	// size after decompression
+		uncompress (reinterpret_cast<unsigned char*>(block),&blockLen,memAux_,blobLen);
+	}
+#ifdef WIN32
+	else if (params_.compression_[band] == TeJPEG) //jpeg compression
+	{
+		int nb;
+		bool status = Jpeg::ReadImage(params_.blockWidth_,params_.blockHeight_,nb,memAux_,blobLen,reinterpret_cast<unsigned char*>(block));
+	}
+#endif
+	else											// no compression
+	{
+		memcpy(block,memAux_,blobLen);
+	}
+	TeCoord2D xy(portal->getDouble("lower_x"),portal->getDouble("upper_y"));
+	TeCoord2D ij = params_.coord2Index(xy);
+
+	// This is the rounding algorithm for col/lin value:
+	// Pixel 0 covers column and line indexes from [-0.5,0.5)
+	ulCol = TeRoundRasterIndex(ij.x_);
+	ulLin = TeRoundRasterIndex(ij.y_);
+	delete portal;
+	return true;
+}
+
+bool 
+TeDecoderDatabase::putRasterBlock(const string& index, void *block, long bsize)
+{
+
+	if (db_ == 0 || index.empty())
+		return false;
+
+	// decodify tile parameters from index
+	int res, subb, band, blin, bcol;
+	decodifyId(index,bcol,blin,band,res, subb);
+
+	// calculates the box coordinates of the tile
+	TeCoord2D llt(bcol, blin+params_.blockHeight_-1);
+	TeCoord2D urt(bcol+params_.blockWidth_-1, blin);
+	TeCoord2D ll = params_.index2Coord(llt);
+	TeCoord2D ur = params_.index2Coord(urt);
+
+	TeBox blockbb(ll.x()-params_.resx_/2.,ll.y()-params_.resy_/2.,ur.x()+params_.resx_/2.,ur.y()+params_.resy_/2.);
+	bool status;
+
+	// verify compression option
+	if (params_.compression_[band] == TeNoCompression)
+	{
+		status = db_->insertRasterBlock(params_.fileName_,index,blockbb.lowerLeft(),blockbb.upperRight(),reinterpret_cast<unsigned char*>(block),bsize,band,res,subb);
+		return status;
+	}
+
+	unsigned long finalsize = bsize;  // final size after compression
+	if (!memAux_)
+	{
+		long size = params_.blockHeight_ * params_.blockWidth_ * params_.elementSize();
+		memAux_ = new unsigned char[int(size*1.1 + 12.)];
+	}
+
+	if (params_.compression_[band] == TeZLib)		// ZLib compression
+	{
+		// zlib needs some more space)
+		finalsize = (unsigned long)(bsize*1.1 + 12.);
+		compress (memAux_, &finalsize,reinterpret_cast<unsigned char*>(block),bsize);
+	}
+#ifdef WIN32
+	else if (params_.compression_[band] == TeJPEG)	// JPEG compression
+	{
+		status = Jpeg::Compress(reinterpret_cast<unsigned char*>(block),memAux_,params_.blockWidth_,params_.blockHeight_,1,finalsize);
+	}
+#endif
+
+	status = db_->insertRasterBlock(params_.fileName_,index,blockbb.lowerLeft(),blockbb.upperRight(),memAux_,finalsize,band,res,subb);
+	return status;
+}
+
+bool
+TeDecoderDatabase::saveLUTTable()
+{
+	if (params_.lutName_.empty())
+		return false;
+	if (!db_ || !db_->createLUTTable(params_.lutName_))
+		return false;
+	for (unsigned int i=0; i<params_.lutb_.size(); i++)
+	{
+		string sql = "INSERT INTO " + params_.lutName_ + " VALUES(";
+		sql += Te2String(i) + ", ";
+		sql += Te2String(params_.lutr_[i]) + ", ";
+		sql += Te2String(params_.lutg_[i]) + ", ";
+		sql += Te2String(params_.lutb_[i]) + ")";
+		if (!db_->execute(sql))
+			return false;
+	}
+	return true;
+}
+
+bool
+TeDecoderDatabase::selectBlocks(TeBox& bb, int resFac, TeRasterParams& parBlock)  
+{ 
+	if (!db_)
+		return false;
+
+	if (blockPortal_)
+		delete blockPortal_;
+
+	blockPortal_ = db_->getPortal();
+	if (!blockPortal_)
+		return false;
+
+	string sql;
+	string sel = db_->getSQLBoxSelect(params_.fileName_, TeRASTER);
+	string where = db_->getSQLBoxWhere (bb, TeRASTER);
+
+	sql = "SELECT "+ sel;
+	sql += " FROM " + params_.fileName_;
+	sql += " WHERE " + where + " AND resolution_factor= " + Te2String(resFac);
+	sql += " ORDER BY lower_x, lower_y, upper_x, upper_y, block_id";
+	
+	if (!blockPortal_->query(sql))
+	{
+		delete blockPortal_;
+		blockPortal_ = 0;
+		return false;
+	}
+	nSelectedBlocks_ = blockPortal_->numRows();
+	parBlock.projection(params_.projection());
+	parBlock.resx_ = params_.resx_*resFac;
+	parBlock.resy_ = params_.resy_*resFac;
+	parBlock.nlines_ = params_.blockHeight_;
+	parBlock.ncols_= params_.blockWidth_;
+	parBlock.nBands(params_.nBands());
+	parBlock.dataType_ = params_.dataType_;
+	parBlock.dummy_ = params_.dummy_;
+	parBlock.useDummy_ = params_.useDummy_;
+	parBlock.photometric_ = params_.photometric_;
+	parBlock.vmax_ = params_.vmax_;
+	parBlock.vmin_ = params_.vmin_;
+	parBlock.lutr_ = params_.lutr_;
+	parBlock.lutg_ = params_.lutg_;
+	parBlock.lutb_ = params_.lutb_;
+	parBlock.interleaving_ = TePerBand;
+	return blockPortal_->fetchRow();
+}
+
+bool
+TeDecoderDatabase::getSelectedRasterBlock(TeDecoderMemory* memDec) 
+{ 
+	if (!blockPortal_)
+		return 0;
+	unsigned long srcLen;
+	int i = 0;
+	if (!memAux_ )
+	{
+		long size = params_.blockHeight_ * params_.blockWidth_ * params_.elementSize();
+		memAux_ = new unsigned char[size];
+	}
+	int res;
+	TeBox bbBlock;
+	string blockId;
+	do
+	{
+		bbBlock = TeBox (blockPortal_->getDouble("lower_x"),blockPortal_->getDouble("lower_y"),
+					   blockPortal_->getDouble("upper_x"),blockPortal_->getDouble("upper_y"));
+		blockId = blockPortal_->getData("block_id");
+		res = blockPortal_->getInt("resolution_factor");
+
+		int banda;
+		int l;
+		this->decodifyId(blockId,l,l,banda,l,l);
+		blockPortal_->getRasterBlock(srcLen,memAux_);
+
+		if (params_.compression_[banda] == TeZLib)
+		{
+			unsigned long destLen;
+			int status;
+			status = uncompress (reinterpret_cast<unsigned char*>(memDec->data(banda)),&destLen,memAux_,srcLen);
+		}
+#ifdef WIN32
+		else if (params_.compression_[banda] == TeJPEG)
+		{
+			int nbytes = params_.nbitsperPixel_[banda]/8;
+			int nb = 1;
+			bool status = Jpeg::ReadImage(params_.blockWidth_,params_.blockHeight_,nb,memAux_,srcLen,reinterpret_cast<unsigned char*>(memDec->data(banda)));
+		}
+#endif
+		else
+			memcpy(reinterpret_cast<unsigned char*>(memDec->data(banda)),reinterpret_cast<unsigned char*>(memAux_),srcLen);
+		i++;
+	}while (i<params_.nBands() && blockPortal_->fetchRow());
+	
+	memDec->params().boundingBoxResolution(bbBlock.x1_,bbBlock.y1_,bbBlock.x2_,bbBlock.y2_,
+		                                   params_.resx_*res,params_.resy_*res);
+	memDec->params().blockId_ = blockId;
+	return blockPortal_->fetchRow();
+}
+
+void
+TeDecoderDatabase::clearBlockSelection() 
+{
+	if (blockPortal_)
+		delete blockPortal_;
+	blockPortal_ = 0;
+	nSelectedBlocks_ = 0;
+}
+
+int 
+TeDecoderDatabase::bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj)
+{
+	TeBox box = bb;
+	if (proj)
+		box = TeRemapBox(bb, proj, params_.projection());
+	
+	double resx = box.width()/ncols;
+	double resy = box.height()/nlines;
+	
+	double auxx = resx/params_.resx_;
+	double auxy = resy/params_.resy_;
+
+	int aux = (int) (min(auxx,auxy));
+
+	string sql = "SELECT resolution_factor FROM " + params_.fileName_;
+	sql += " WHERE resolution_factor <= " + Te2String(aux) + " ORDER BY resolution_factor DESC";
+
+	TeDatabasePortal* portal = params_.database_->getPortal();
+	if (!portal)
+		return 1;
+
+	if (!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return 1;
+	}
+
+	int res = atoi(portal->getData(0));
+	delete portal;
+	return res;
+}
+
+
diff --git a/src/terralib/kernel/TeDecoderDatabase.h b/src/terralib/kernel/TeDecoderDatabase.h
new file mode 100644
index 0000000..fb0c3a5
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderDatabase.h
@@ -0,0 +1,141 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderDatabase.h
+    This file deals with decoding of raster structures stored in a TerraLib database
+*/
+
+#ifndef  __TERRALIB_INTERNAL_DECODERDATADASE_H
+#define  __TERRALIB_INTERNAL_DECODERDATABASE_H
+
+#include "TeDecoderVirtualMemory.h"
+#include "TeDatabase.h"
+
+//! A concrete class to manipulate raster data stored in a TerraLib database
+/*
+	TeDecoderDatabase uses a virtual memory, to handle the raster blocks 
+	(as proposed by the TerraLib data model to store raster data) traffic from
+	memory to database and vice versa.
+
+	\sa TeDatabase TeDecoderVirtualMemory
+*/
+class TeDecoderDatabase: public TeDecoderVirtualMemory
+{
+public:
+	//! Empty constructor
+	TeDecoderDatabase() :
+		db_(0),	
+		blockPortal_(0),
+		memAux_(0),
+		nSelectedBlocks_(0)
+	{	params_.decoderIdentifier_ = "DB"; }
+
+	//! Constructor from parameters
+	TeDecoderDatabase( const TeRasterParams& par );
+
+	//! Destructor
+	~TeDecoderDatabase();
+
+	//! Sets the database pointer associated to this decoder
+	void setDB (TeDatabase* db) 
+	{ db_ = db; }
+
+	//! Initializes the decoder
+	virtual void init();
+
+	//! Creates the decoder
+	virtual bool create();
+
+	//! Clears the decoder
+	virtual bool clear();
+
+	//! Gets the raster block with index identifier
+	/*!
+		\param index tile unique identifier
+		\param buf pointer to a raster tile in memory
+		\param ulCol returns the column index of the upper-left corner of the block
+		\param ulLin returns the column index of the upper-left corner of the block
+	*/
+	bool getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin);
+
+	//! Saves a raster tile from a virtual memory to permanent storage
+	/*! 
+	    \param index tile unique identifier 
+		\param buf pointer to a raster tile in memory
+		\param bsize size of the block in bytes
+	*/	
+	bool putRasterBlock(const string& index, void *buf, long bsize);
+
+	string codifyId(int col, int lin, int band, int res, int subb);
+	void decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb);
+
+	//! Saves the lut table of the raster associated to this decoder
+	bool saveLUTTable();
+
+	//! Search for tiles of image that intersects a certain bounding box in a given resolution
+	/* 
+		\param bb bounding box that should be filled
+		\param resFac resolution factor that identify a level of resolution
+		\param parBlock returns the basic parameters  of the selected tiles
+		\note Resolution factor in decoder database is a multiplier of the original resolution
+		and assume integer multiples of two. Smaller resolution has resolution factor
+		of 1 and the higher resolution have multiple of two values (2,4,8, 16...)
+	*/
+	int bestResolution(TeBox& bb, int ncols, int nlines, TeProjection* proj);
+
+	//! Select the stored raster blocks with a certain resolution to fill a given bounding box
+	/*
+		\param bb bounding box that should be filled 
+		\param the resolution factor desired
+		\param parBlock common parameters of the blocks selected
+		\returns TRUE if could select at least one block and FALSE otherwise
+	*/
+	bool selectBlocks(TeBox& bb, int resFac, TeRasterParams& parBlock);
+
+	bool getSelectedRasterBlock(TeDecoderMemory* memDec);
+
+	void clearBlockSelection();
+
+	int numberOfSelectedBlocks()
+	{	return nSelectedBlocks_; }
+
+private:
+	TeDatabase			*db_;
+	TeDatabasePortal	*blockPortal_;
+	unsigned char		*memAux_;
+	int					nSelectedBlocks_;
+};
+
+//! Implements a factory to build database decoders
+class TeDecoderDatabaseFactory : public TeDecoderFactory
+{
+public:
+
+	//! Constructor
+	TeDecoderDatabaseFactory(const string& name) : TeDecoderFactory(name) {}
+
+	//! Builds a database decoder
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderDatabase(arg); }
+};
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderFile.cpp b/src/terralib/kernel/TeDecoderFile.cpp
new file mode 100644
index 0000000..b451408
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderFile.cpp
@@ -0,0 +1,363 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderFile.h>
+
+#ifdef WIN32
+static inline short swaps(short value)
+{
+    short svalue = ((value & 0x00ff) << 8) | ((value >> 8) & 0x00ff);
+	return svalue;
+}
+
+TeDecoderFile::TeDecoderFile ( const TeRasterParams& par )
+{
+	params_ = par;
+	dataInitPos_ = 0;
+	dataInitPos_ = par.offset_;
+	m_dwPosition = 0;
+	m_dwWordSize = params_.elementSize();
+	params_.blockHeight_ = 1;
+	params_.blockWidth_ = params_.ncols_;
+	params_.decoderIdentifier_ = "RAW";
+}
+
+TeDecoderFile::~TeDecoderFile ()
+{
+	if (m_hFile != NULL)
+		clear();
+}
+
+void
+TeDecoderFile::init()
+{
+	clear();
+
+	// First open the file
+	m_hFile = CreateFile(
+		params_.fileName_.c_str(),	// File name
+		GENERIC_READ | GENERIC_WRITE,	// Read-write
+		FILE_SHARE_READ
+		| FILE_SHARE_WRITE,		// Allow sharing-- we're only doing a quick scan
+		NULL,					// No security attributes
+		OPEN_EXISTING,			// Only open an existing file
+		0,						// Ignore file attributes
+		NULL);					// Ignore hTemplateFile
+
+	if (m_hFile == INVALID_HANDLE_VALUE) 
+			return ;		// could not open file
+
+// Get the file's size
+	m_dwSize = GetFileSize(m_hFile, NULL);
+	if (m_dwSize == 0xffffffff)
+	{
+		m_hFile = NULL;
+		return ;
+	}
+
+// Allocate buffer to get raster line from file
+
+	long mBufferSize = params_.ncols_;
+	if (params_.interleaving_ == TePerPixel)
+		mBufferSize *= params_.nBands();
+
+	switch (params_.dataType_[0]) {
+	case (TeUNSIGNEDCHAR):
+		m_buffer = new unsigned char[mBufferSize];
+		break;
+	case (TeCHAR) :
+		m_buffer = new char[mBufferSize];
+		break;
+	case (TeUNSIGNEDSHORT):
+		m_buffer = new unsigned short[mBufferSize];
+		break;
+	case (TeSHORT):
+		m_buffer = new short[mBufferSize];
+		break;
+	case (TeUNSIGNEDLONG):
+		m_buffer = new unsigned long[mBufferSize];
+		break;
+	case (TeLONG):
+		m_buffer = new long[mBufferSize];
+		break;
+	case (TeFLOAT):
+		m_buffer = new float[mBufferSize];
+		break;
+	case (TeDOUBLE):
+		m_buffer = new double[mBufferSize];
+		break;
+	}
+	if ( m_buffer == NULL )
+		return ;
+	else
+		return ;
+		
+}
+
+bool
+TeDecoderFile::create()
+{
+	m_hFile = CreateFile(
+		params_.fileName_.c_str(),	// File name
+		GENERIC_READ | GENERIC_WRITE,	// Read-write
+		FILE_SHARE_READ
+		| FILE_SHARE_WRITE,		// Allow sharing-- we're only doing a quick scan
+		NULL,					// No security attributes
+		CREATE_NEW,			    // Open a new file
+		0,						// Ignore file attributes
+		NULL);					// Ignore hTemplateFile
+  
+	if ( m_hFile == INVALID_HANDLE_VALUE) 
+		return false;		// could not open file
+
+	char			lpBuffer[1024];
+	unsigned long	nNumberOfBytesToWrite=(long)params_.nBands() * (long)params_.ncols_ * (long)params_.nlines_;    // number of bytes to write
+	nNumberOfBytesToWrite *= (long)params_.nbitsperPixel_[0]/8;    // number of bytes to write
+	unsigned long	nNumberOfBytesWritten;  // pointer to number of bytes written
+
+	for (;nNumberOfBytesToWrite > 1024; nNumberOfBytesToWrite-=1024)
+	{
+		if ( !WriteFile(
+			m_hFile,                // handle to file to write to
+			lpBuffer,               // pointer to data to write to file
+			1024,					// number of bytes to write
+			&nNumberOfBytesWritten,  // pointer to number of bytes written
+			NULL					// pointer to structure for overlapped I/O
+			))
+ 			return false;			// could not write to file
+	}
+
+	if ( !WriteFile(
+		m_hFile,                // handle to file to write to
+		lpBuffer,               // pointer to data to write to file
+		nNumberOfBytesToWrite,	// number of bytes to write
+		&nNumberOfBytesWritten,  // pointer to number of bytes written
+		NULL					// pointer to structure for overlapped I/O
+		))
+ 		return false;			// could not write to file
+	
+	SetFilePointer (m_hFile, NULL, NULL, FILE_BEGIN);
+
+// Allocate buffer to get raster line from file
+
+	switch (params_.dataType_[0]) {
+	case (TeUNSIGNEDCHAR):
+		m_buffer = new unsigned char[params_.ncols_];
+		break;
+	case (TeCHAR) :
+		m_buffer = new char[params_.ncols_];
+		break;
+	case (TeUNSIGNEDSHORT):
+		m_buffer = new unsigned short[params_.ncols_];
+		break;
+	case (TeSHORT):
+		m_buffer = new short[params_.ncols_];
+		break;
+	case (TeUNSIGNEDLONG):
+		m_buffer = new unsigned long[params_.ncols_];
+		break;
+	case (TeLONG):
+		m_buffer = new long[params_.ncols_];
+		break;
+	case (TeFLOAT):
+		m_buffer = new float[params_.ncols_];
+		break;
+	case (TeDOUBLE):
+		m_buffer = new double[params_.ncols_];
+		break;
+	}
+
+	if ( m_buffer == NULL )
+		return false;
+
+	if (params_.dummy_[0])
+	{
+		for (int b=0; b<params_.nBands();b++)
+			for (int l=0; l<params_.nlines_;l++)
+				for (int c=0; c<params_.ncols_;c++)
+					setElement ( c, l, params_.dummy_[0], b);
+	}
+	return true;
+}
+
+bool
+TeDecoderFile::clear()
+{
+	if (!m_hFile)
+		return true;
+
+	CloseHandle(m_hFile);
+	m_hFile = NULL;
+	delete m_buffer;
+	m_buffer = 0;
+	params_.status_ = TeNOTREADY;
+	return true;
+}
+
+bool
+TeDecoderFile::getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin)
+{
+	int res, subb, band;
+	decodifyId(index,ulCol,ulLin,band,res,subb);
+
+	int nb = params_.nBands();
+	DWORD position;
+	DWORD nBytesToRead;
+	int inc, inic;
+	if (params_.interleaving_ == TePerPixel)
+	{
+		inc = nb;
+		inic = band;
+		position = dataInitPos_ + params_.ncols_*(nb*ulLin);
+		nBytesToRead = m_dwWordSize*params_.ncols_*nb;
+	}
+	else
+	{
+		inc = 1;
+		inic = 0;
+		position = dataInitPos_ + params_.ncols_*(nb*ulLin + band);
+		nBytesToRead = m_dwWordSize*params_.ncols_;
+	}
+	DWORD diff = position - m_dwPosition;
+	if (diff != 0)
+		m_dwPosition = SetFilePointer (m_hFile, diff, NULL, FILE_CURRENT);
+	unsigned long nBytesRead;
+	if (!ReadFile(m_hFile, m_buffer, nBytesToRead, &nBytesRead, NULL))
+		return false;
+	m_dwPosition += nBytesRead;
+
+	int i,n;
+	switch (params_.dataType_[0]) 
+	{
+	case (TeUNSIGNEDCHAR):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((unsigned char*)buf)[n] = ((unsigned char*)m_buffer)[i];
+		break;
+	case (TeCHAR) :
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((char*)buf)[n] = ((char*)m_buffer)[i];
+		break;
+	case (TeUNSIGNEDSHORT):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((unsigned short*)buf)[n] = ((unsigned short*)m_buffer)[i];
+		break;
+	case (TeSHORT):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((short*)buf)[n] = ((short*)m_buffer)[i];
+		break;
+	case (TeUNSIGNEDLONG):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((unsigned long*)buf)[n] = ((unsigned long*)m_buffer)[i];
+		break;
+	case (TeLONG):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((long*)buf)[n] = ((long*)m_buffer)[i];
+		break;
+	case (TeFLOAT):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((float*)buf)[n] = ((float*)m_buffer)[i];
+		break;
+	case (TeDOUBLE):
+		for (i=inic,n=0;i<params_.ncols_*nb;i+=inc, n++)
+			((double*)buf)[n] = ((double*)m_buffer)[i];
+		break;
+	}
+
+	return true;
+}
+
+bool 
+TeDecoderFile::putRasterBlock(const string& index, void *buf, long bsize)
+{
+	int res, subb, band,ulCol,ulLin;
+	decodifyId(index,ulCol,ulLin,band,res,subb);
+
+	DWORD position = dataInitPos_ + params_.ncols_*(params_.nBands()*ulLin + band);
+	DWORD diff = position - m_dwPosition;
+	if (diff != 0)
+		SetFilePointer (m_hFile, diff, NULL, FILE_CURRENT);
+	DWORD nBytesToWrite = m_dwWordSize*params_.ncols_,
+		nBytesWritten;
+	int i;
+	switch (params_.dataType_[0]) 
+	{
+	case (TeUNSIGNEDCHAR):
+		for (i=0;i<params_.ncols_;i++)
+			((unsigned char*)m_buffer)[i] = ((unsigned char*)buf)[i];
+		break;
+	case (TeCHAR) :
+		for (i=0;i<params_.ncols_;i++)
+			((char*)m_buffer)[i] = ((char*)buf)[i];
+		break;
+	case (TeUNSIGNEDSHORT):
+		for (i=0;i<params_.ncols_;i++)
+			((unsigned short*)m_buffer)[i] = ((unsigned short*)buf)[i];
+		break;
+	case (TeSHORT):
+		for (i=0;i<params_.ncols_;i++)
+			((short*)m_buffer)[i] = ((short*)buf)[i];
+		break;
+	case (TeUNSIGNEDLONG):
+		for (i=0;i<params_.ncols_;i++)
+			((unsigned long*)m_buffer)[i] = ((unsigned long*)buf)[i];
+		break;
+	case (TeLONG):
+		for (i=0;i<params_.ncols_;i++)
+			((long*)m_buffer)[i] = ((long*)buf)[i];
+		break;
+	case (TeFLOAT):
+		for (i=0;i<params_.ncols_;i++)
+			((float*)m_buffer)[i] = ((float*)buf)[i];
+		break;
+	case (TeDOUBLE):
+		memcpy (m_buffer,buf,params_.ncols_);
+		break;
+	}
+
+	if (!WriteFile(m_hFile, m_buffer, nBytesToWrite, &nBytesWritten, NULL))
+		return false;
+
+	m_dwPosition += nBytesWritten;
+
+	return true;
+}
+
+string 
+TeDecoderFile::codifyId(int col, int lin, int band, int res, int subb)
+{
+	char id[32];
+	sprintf(id,"Y%dB%d",lin,band);
+	return string(id);
+
+}
+
+void 
+TeDecoderFile::decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb)
+{
+	char lixo;
+	sscanf(id.c_str(),"%1c%d%1c%d",&lixo,&lin,&lixo,&band);
+	col = 0;
+	res = 1;
+	subb = 0;
+}
+#endif
diff --git a/src/terralib/kernel/TeDecoderFile.h b/src/terralib/kernel/TeDecoderFile.h
new file mode 100644
index 0000000..ef18088
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderFile.h
@@ -0,0 +1,73 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderFile.h
+    This file deals with decoding of raster structures in a binary file
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERFILE_H
+#define  __TERRALIB_INTERNAL_DECODERFILE_H
+
+#ifdef WIN32
+#include "TeDecoderVirtualMemory.h"
+#include <windows.h>
+#include <winbase.h>
+
+//! Implements decoder to raster data stored in a file in a binary raw format
+class TeDecoderFile : public TeDecoderVirtualMemory
+{
+public:
+	TeDecoderFile ( const TeRasterParams& );
+	~TeDecoderFile ();
+
+	void init	();
+	bool create	();
+	bool clear	();
+
+	bool	getRasterBlock(const string& index, void *buf, int& ulCol, int& ulLin);
+	bool	putRasterBlock(const string& index, void *buf, long bsize);
+	string	codifyId(int col, int lin, int band, int res, int subb);
+	void	decodifyId(const string& id, int& col,int& lin, int& band, int& res, int& subb);
+	
+private:
+
+	unsigned long	dataInitPos_;
+	HANDLE  m_hFile;			// Handle to file we're currently zapping
+	LPVOID  m_buffer;			// Pointer to view of file mapped to memory
+	DWORD	m_dwSize;			// File size in bytes
+	DWORD	m_dwPosition;		// Current file pointer position
+	DWORD	m_dwWordSize;		// word size in bytes
+};
+
+//! Implements a factory to build file decoders
+class TeDecoderFileFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderFileFactory(const string& name) : TeDecoderFactory(name) {}
+
+	//! Builds a database decoder
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderFile(arg); }
+};
+
+#endif
+#endif
diff --git a/src/terralib/kernel/TeDecoderJPEG.cpp b/src/terralib/kernel/TeDecoderJPEG.cpp
new file mode 100644
index 0000000..bc2ff95
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderJPEG.cpp
@@ -0,0 +1,184 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeDecoderJPEG.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+#include <jpeg.h>
+#include <io.h>
+
+TeDecoderJPEG::TeDecoderJPEG (const TeRasterParams& par) : 
+	TeDecoderMemory()
+{	
+	params_ = par; 
+	// if openning an existent file, read its informations
+	if (params_.mode_ == 'w' || params_.mode_ == 'r')
+	{
+		int nb;
+		if (!Jpeg::ReadFileParams(params_.ncols_ , params_.nlines_ , nb , (char*)params_.fileName_.c_str()))
+			return;
+
+		params_.nBands(nb);
+		params_.setDataType(TeUNSIGNEDCHAR);
+		params_.setPhotometric(TeRASTERMULTIBAND);
+		params_.decoderIdentifier_ = "JPEG";
+		params_.blockWidth_ = params_.ncols_;
+		params_.blockHeight_ = params_.nlines_;
+		TeProjection* proj = new TeNoProjection();
+		params_.projection(proj);
+		delete proj;
+
+		// Try reading box from auxiliary file
+		string filePrefix = TeGetName(params_.fileName_.c_str());
+		string jgw = filePrefix+".jgw";
+		try
+		{
+			TeAsciiFile	pFile (jgw);
+			double dyj, dxi, x0, y0;
+
+			params_.resx_ = pFile.readFloat();
+			dyj = pFile.readFloat();		// ignored
+			dxi = pFile.readFloat();		// ignored
+			params_.resy_  = -1 * pFile.readFloat();
+			x0 = pFile.readFloat();
+			y0 = pFile.readFloat();
+
+			// IMPORTANT: we discard any rotation or translation defined in the
+			// .jgw file! It should be treated properly later
+			params_.topLeftResolutionSize(x0,y0,params_.resx_,params_.resy_,
+				                          params_.ncols_,params_.nlines_,true);
+		}
+		catch (...)
+		{
+			// no .jgw inexistent or inconsistent, uses resolution of 1 unit 
+			// and box lower left coordinate of (0.5,0.5)
+			params_.lowerLeftResolutionSize(0.5,0.5,1.0,1.0,params_.ncols_,params_.nlines_,true);
+		}
+	}
+}
+
+TeDecoderJPEG::~TeDecoderJPEG ()
+{
+	if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c') )	// save contents to disk
+	{
+		int nb = params_.nBands();
+		int nc = params_.fileName_.size();
+		char*  name = new char[nc+1];
+		strcpy(name,params_.fileName_.c_str());
+		int i = _access(params_.fileName_.c_str(),06);
+		i = _unlink(params_.fileName_.c_str());
+		Jpeg::WriteFile((unsigned char*)data_,params_.ncols_,params_.nlines_,nb,name);
+	}
+	TeDecoderMemory::clear();
+}
+
+
+bool
+TeDecoderJPEG::clear()
+{
+	if (data_ == 0)
+	    return true;
+
+	if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c') )	// save contents to disk
+	{
+		int nb = params_.nBands();
+		int nc = params_.fileName_.size();
+		char*  name = new char[nc+1];
+		strcpy(name,params_.fileName_.c_str());
+		Jpeg::WriteFile((unsigned char*)data_,params_.ncols_,params_.nlines_,nb,name);
+		isModified_ = 0;
+	}
+	TeDecoderMemory::clear();
+	return true;
+}
+
+
+void
+TeDecoderJPEG::init()
+{
+	params_.status_= TeNOTREADY;
+	int nb = params_.nBands();
+	if (nb != 1 && nb != 3)
+		return;
+
+	// try to allocate enough memory to hold the data
+	TeDecoderMemory::init();
+	if (params_.status_== TeNOTREADY)
+		return;
+
+	params_.status_= TeNOTREADY;
+	if (params_.mode_ == 'c')	// creating a new file
+	{
+		if (_access(params_.fileName_.c_str(),00) != -1) // remove existing file
+		{
+			if (_unlink(params_.fileName_.c_str()) == -1)
+				return;
+		}		
+		// write georeference file
+		string filePrefix = TeGetName (params_.fileName_.c_str());
+		string jgw = filePrefix+".jgw";
+
+		try {
+			TeAsciiFile jgwFile(jgw,"w+");
+			string line;
+			line = Te2String(params_.resx_) + "\n";
+			jgwFile.writeString(line);
+			line = "0.0\n";
+			jgwFile.writeString(line);
+			jgwFile.writeString(line);
+			line = Te2String(params_.resy_ * -1.) + "\n";
+			jgwFile.writeString(line);
+			line = Te2String(params_.box().x1_) + "\n";
+			jgwFile.writeString(line);
+			line = Te2String(params_.box().y2_) + "\n";
+			jgwFile.writeString(line);
+		}
+		catch(...)
+		{}
+		// write data
+		int nc = params_.fileName_.size();
+		char*  name = new char[nc+1];
+		strcpy(name,params_.fileName_.c_str());
+
+		if (!Jpeg::WriteFile((unsigned char*)data_,params_.ncols_,params_.nlines_,nb,name))
+			return;
+		params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'w')
+	{
+		int i = _access(params_.fileName_.c_str(),06);
+		if (i == -1)
+			return;
+//		if (!Jpeg::ReadFile(params_.ncols_, params_.nlines_, params_.nBands(), (char*)params_.fileName_.c_str(), (unsigned char*) data_))
+//			return;
+		params_.status_ = TeREADYTOWRITE;
+		i = _access(params_.fileName_.c_str(),06);
+	}
+	else if (params_.mode_ == 'r')
+	{
+		if ((_access(params_.fileName_.c_str(),04) == -1) || !Jpeg::ReadFile(params_.ncols_, params_.nlines_, params_.nBands(), (char*)params_.fileName_.c_str(), (unsigned char*) data_))
+			return;
+		params_.status_ = TeREADYTOREAD;	
+	}
+}
diff --git a/src/terralib/kernel/TeDecoderJPEG.h b/src/terralib/kernel/TeDecoderJPEG.h
new file mode 100644
index 0000000..c3d1e26
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderJPEG.h
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderJPEG.h
+    This file deals with decoding of raster structures in JPEG format
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERJPEG_H
+#define  __TERRALIB_INTERNAL_DECODERJPEG_H
+
+#include "TeDecoderMemory.h"
+
+//! Implements a decoder for rasters in JPEG format
+/*
+	In order to be accessed a raster in JPEG format is decompressed
+	in memory and its pixels acessed directly.
+*/
+class TeDecoderJPEG : public TeDecoderMemory
+{
+public:
+	//! Empty constructor
+	TeDecoderJPEG () : TeDecoderMemory() 
+	{	params_.decoderIdentifier_ = "JPEG";	}
+
+	//! Constructor from some parameters
+	TeDecoderJPEG (const TeRasterParams& par);
+
+	//! Destructor
+	~TeDecoderJPEG ();
+
+	void init();
+
+	bool clear();
+
+};
+
+//! Implements a factory to build decoders to JPEG raster
+class TeDecoderJPEGFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderJPEGFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderJPEG(arg); }
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderMemory.cpp b/src/terralib/kernel/TeDecoderMemory.cpp
new file mode 100644
index 0000000..931eeac
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemory.cpp
@@ -0,0 +1,339 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderMemory.h"
+
+TeDecoderMemory::~TeDecoderMemory ()
+{
+	if (data_ != 0)
+		clear();
+}
+
+void*	
+TeDecoderMemory::data (int band)
+{
+	if (band==0)
+		return data_;
+	if (params_.interleaving_ != TePerBand)
+		return 0;
+
+	void* pt = 0;
+	switch (params_.dataType_[band]) {
+	case TeUNSIGNEDCHAR:
+		pt =  reinterpret_cast<unsigned char*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case TeCHAR :
+		pt =  reinterpret_cast<char*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case TeUNSIGNEDSHORT:
+		pt = reinterpret_cast<unsigned short*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case (TeSHORT):
+		pt = reinterpret_cast<short*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case (TeUNSIGNEDLONG):
+		pt = reinterpret_cast<unsigned long*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case (TeLONG):
+		pt = reinterpret_cast<long*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case (TeFLOAT):
+		pt = reinterpret_cast<float*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	case (TeDOUBLE):
+		pt = reinterpret_cast<double*>(data_) + (params_.ncols_ * params_.nlines_*band);
+		break;
+	default:
+		break;
+	}
+	return (void*) pt;
+}
+
+void 
+TeDecoderMemory::init()
+{
+	params_.status_= TeNOTREADY;
+	if ( !data_ ||	nelems_ != (params_.ncols_ * params_.nlines_ * params_.nBands()))
+	{
+		clear();
+		nelems_ = params_.ncols_ * params_.nlines_ * params_.nBands();
+		if (!allocateMemory() || !resetMemory())
+			return;
+	}
+
+	if (params_.mode_ == 'c' || params_.mode_ == 'w')	// creating a new file
+	{
+		if (resetMemory())
+			params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'r')
+		params_.status_ = TeREADYTOREAD;		
+}
+
+
+bool 
+TeDecoderMemory::allocateMemory()
+{
+	// Allocate necessary memory
+	switch (params_.dataType_[0]) {
+	case (TeUNSIGNEDCHAR):
+		data_ = new unsigned char [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeCHAR) :
+		data_ = new char [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeUNSIGNEDSHORT):
+		data_ = new unsigned short [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeSHORT):
+		data_ = new short [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeUNSIGNEDLONG):
+		data_ = new unsigned long [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeLONG):
+		data_ = new long [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeFLOAT):
+		data_ = new float [nelems_];
+		if (!data_)
+			return false;
+		break;
+	case (TeDOUBLE):
+		data_ = new double [nelems_];
+		if (!data_)
+			return false;
+		break;
+	default:
+		break;
+	}
+	if (data_)
+		return true;
+	else 
+		return false;
+}
+
+
+bool 
+TeDecoderMemory::resetMemory()
+{
+	if (!data_)
+		return false;
+
+	int i;
+	switch (params_.dataType_[0]) {
+	case (TeUNSIGNEDCHAR):
+		for(i=0; i<nelems_; reinterpret_cast<unsigned char*>(data_)[i]=static_cast<unsigned char>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(unsigned char);
+		break;
+	case (TeCHAR) :
+		for(i=0; i<nelems_; reinterpret_cast<char*>(data_)[i]=static_cast<char>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(char);
+		break;
+	case (TeUNSIGNEDSHORT):
+		for(i=0; i<nelems_; reinterpret_cast<unsigned short*>(data_)[i]=static_cast<unsigned short>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(unsigned short);
+		break;
+	case (TeSHORT):
+		for(i=0; i<nelems_; reinterpret_cast<short*>(data_)[i]=static_cast<short>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(short);
+		break;
+	case (TeUNSIGNEDLONG):
+		for(i=0; i<nelems_; reinterpret_cast<unsigned long*>(data_)[i]=static_cast<unsigned long>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(unsigned long);
+		break;
+	case (TeLONG):
+		for(i=0; i<nelems_; reinterpret_cast<long*>(data_)[i]=static_cast<long>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(long);
+		break;
+	case (TeFLOAT):
+		for(i=0; i<nelems_; reinterpret_cast<float*>(data_)[i]=static_cast<float>(params_.dummy_[0]),++i);
+		size_ = nelems_ * sizeof(float);
+		break;
+	case (TeDOUBLE):
+		for(i=0; i<nelems_; reinterpret_cast<double*>(data_)[i]=params_.dummy_[0],++i);
+		size_ = nelems_ * sizeof(double);
+		break;
+	default:
+		break;
+	}
+	return true;
+}
+
+bool
+TeDecoderMemory::clear()
+{
+	if (data_ == 0)
+	    return true;
+	switch (params_.dataType_[0])
+	{
+	case (TeUNSIGNEDCHAR):
+		delete [](unsigned char*)data_;
+		break;
+	case (TeCHAR) :
+		delete (char*)data_;
+		break;
+	case (TeUNSIGNEDSHORT):
+		delete [](unsigned short*)data_;
+		break;
+	case (TeSHORT):
+		delete (short*) data_;
+		break;
+	case (TeUNSIGNEDLONG):
+		delete [](unsigned long*)data_;
+		break;
+	case (TeLONG):
+		delete [](long*) data_;
+		break;
+	case (TeFLOAT):
+		delete [](float*)data_;
+		break;
+	case (TeDOUBLE):
+		delete [](double*) data_;
+		break;
+	default:
+		break;
+	}
+	data_ = 0;
+	params_.status_ = TeNOTREADY;
+	return true;
+}
+
+bool 
+TeDecoderMemory::getElement (int col,int lin, double& val,int band)
+{
+	unsigned int position = 0;
+
+	switch (params_.interleaving_)
+	{
+	case TePerPixel:
+		position = params_.nBands()*(params_.ncols_*lin+col)+band;
+		break;
+	case TePerLine:
+		position = (params_.nBands()*params_.ncols_*lin)+band*params_.ncols_+col;
+		break;
+	case TePerBand:
+		position = band*(params_.ncols_*params_.nlines_)+(params_.ncols_*lin+col);
+		break;
+	}
+	switch (params_.dataType_[0]) 
+	{
+	case (TeUNSIGNEDCHAR):
+		val = reinterpret_cast<unsigned char*>(data_)[position];
+		break;
+	case (TeCHAR) :
+		val = reinterpret_cast<char*>(data_)[position];
+		break;
+	case (TeUNSIGNEDSHORT):
+		val = reinterpret_cast<unsigned short*>(data_)[position];
+		break;
+	case (TeSHORT):
+		val = reinterpret_cast<short*>(data_)[position];
+		break;
+	case (TeUNSIGNEDLONG):
+		val = reinterpret_cast<unsigned long*>(data_)[position];
+		break;
+	case (TeLONG):
+		val = reinterpret_cast<long*>(data_)[position];
+		break;
+	case (TeFLOAT):
+		val = reinterpret_cast<float*>(data_)[position];
+		break;
+	case (TeDOUBLE):
+		val = reinterpret_cast<double*>(data_)[position];
+		break;
+	default:
+		break;
+	}
+	return true;
+}
+
+bool 
+TeDecoderMemory::setElement (int col, int lin, double val,int band)
+{
+	unsigned int position = 0;
+	switch (params_.interleaving_)
+	{
+	case TePerPixel:
+		position = params_.nBands()*(params_.ncols_*lin+col)+band;
+		break;
+	case TePerLine:
+		position = (params_.nBands()*params_.ncols_*lin)+band*params_.ncols_+col;
+		break;
+	case TePerBand:
+		position = band*(params_.ncols_*params_.nlines_)+(params_.ncols_*lin+col);
+		break;
+	}
+
+	switch (params_.dataType_[0]) 
+	{
+	case (TeUNSIGNEDCHAR):
+		reinterpret_cast<unsigned char*>(data_)[position] = static_cast<unsigned char>(val);
+		break;
+	
+	case (TeCHAR) :
+		reinterpret_cast<char*>(data_)[position] = static_cast<char>(val);
+		break;
+	
+	case (TeUNSIGNEDSHORT):
+		reinterpret_cast<unsigned short*>(data_)[position] = static_cast<unsigned short>(val);
+		break;
+	
+	case (TeSHORT):
+		reinterpret_cast<short*>(data_)[position] = static_cast<short>(val);
+		break;
+	
+	case (TeUNSIGNEDLONG):
+		reinterpret_cast<unsigned long*>(data_)[position] = static_cast<unsigned long>(val);
+		break;
+	
+	case (TeLONG):
+		reinterpret_cast<long*>(data_)[position] = static_cast<long>(val);
+		break;
+	
+	case (TeFLOAT):
+		reinterpret_cast<float*>(data_)[position] = static_cast<float>(val);
+		break;
+	
+	case (TeDOUBLE):
+		reinterpret_cast<double*>(data_)[position] = val;
+
+	default:
+		break;
+	}
+	isModified_ = true;
+	return true;
+}
+
diff --git a/src/terralib/kernel/TeDecoderMemory.h b/src/terralib/kernel/TeDecoderMemory.h
new file mode 100644
index 0000000..cb981fc
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemory.h
@@ -0,0 +1,90 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderMemory.h
+    This file deals with decoding of raster structures as a mulitdimensional matrix in memory
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERMEMORY_H
+#define  __TERRALIB_INTERNAL_DECODERMEMORY_H
+
+#include <TeDecoder.h>
+
+//! Implements a decoder to a raster stored as a as a mulitdimensional matrix in memory
+class TeDecoderMemory : public TeDecoder
+{
+	bool allocateMemory();
+	bool resetMemory();
+
+public:
+
+	//! Empty constructor
+	TeDecoderMemory ( ) : 
+		data_(0), 
+		isModified_(false) 
+		{ params_.decoderIdentifier_ = "MEM";};
+
+	//! Constructor from parameters
+	TeDecoderMemory ( const TeRasterParams& par ) : 
+		data_(0),
+		isModified_(false)
+	{	
+		params_ = par; 
+		params_.decoderIdentifier_ = "MEM"; 
+	};
+
+	//! Destructor
+	virtual ~TeDecoderMemory ();
+
+	bool setElement (int col,int lin, double val, int band=0);
+	bool getElement (int col,int lin, double &val,int band=0);
+
+	//! Returns  the pointer to the matrix structure in memory
+	void* data () { return data_; }
+
+	//! Retuns a ponter to a given band
+	void* data (int band=0);
+
+	virtual void	init	();
+	virtual bool	clear	();
+
+	void setModified(bool val)
+	{	isModified_ = val; }
+
+protected:
+	int	nelems_;
+	int	size_;
+	void*	data_;			//!< Pointer to view of file mapped to memory
+	bool isModified_;
+};
+
+//! Implements a factory to build decoder to MEMORY raster
+class TeDecoderMemoryFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderMemoryFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderMemory(arg); }
+};
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderMemoryMap.cpp b/src/terralib/kernel/TeDecoderMemoryMap.cpp
new file mode 100644
index 0000000..4468533
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemoryMap.cpp
@@ -0,0 +1,664 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderMemoryMap.h"
+#include "TeUtils.h"
+#include "TeAsciiFile.h"
+#include <map>
+#include <string>
+
+static inline short swaps(short value)
+{
+    short svalue = ((value & 0x00ff) << 8) | ((value >> 8) & 0x00ff);
+	return svalue;
+}
+
+TeDecoderMemoryMap::TeDecoderMemoryMap ( const TeRasterParams& par )
+{
+	params_ = par;
+	dataInitPos_ = 0;
+	dataInitPos_ = par.offset_;
+	m_lpszFile = 0;
+	m_hFile = 0;
+	params_.decoderIdentifier_ = "MEMMAP";
+}
+
+TeDecoderMemoryMap::~TeDecoderMemoryMap ()
+{
+	if (m_hFile != 0)
+		clear();
+}
+bool
+TeDecoderMemoryMap::getElement (int col,int lin, double& val,int band)
+{
+	unsigned long position = dataInitPos_+(unsigned long)params_.nBands()*(unsigned long)(params_.ncols_*lin+col)+band;
+	switch (params_.dataType_[0])
+	{
+	case (TeUNSIGNEDCHAR):
+		val = ((unsigned char*)m_lpszFile)[position];
+		break;
+	case (TeCHAR) :
+		val = ((char*) m_lpszFile)[position];
+		break;
+	case (TeUNSIGNEDSHORT):
+		unsigned short uval;
+		if (params_.swap_)
+			uval = swaps(((unsigned short*)m_lpszFile)[position]);
+		else
+			uval = ((unsigned short*)m_lpszFile)[position];
+		val = uval;
+		break;
+	case (TeSHORT):
+		if (params_.swap_)
+			val = swaps(((short*)m_lpszFile)[position]);
+		else
+			val = ((short*)m_lpszFile)[position];
+		break;
+	case (TeINTEGER):
+		val = ((int*)m_lpszFile)[position];
+	case (TeUNSIGNEDLONG):
+		val = ((unsigned long*)m_lpszFile)[position];
+		break;
+	case (TeLONG):
+		val = ((long*)m_lpszFile)[position];
+		break;
+	case (TeFLOAT):
+		val = ((float*)m_lpszFile)[position];
+		break;
+	case (TeDOUBLE):
+		val = ((double*)m_lpszFile)[position];
+		break;
+	default:
+		return false;
+	}
+	return true;
+}
+
+bool
+TeDecoderMemoryMap::setElement (int col,int lin, double val, int band)
+{
+	unsigned int position = dataInitPos_+params_.nBands()*(params_.ncols_*lin+col)+band;
+	switch (params_.dataType_[0])
+	{
+	case (TeUNSIGNEDCHAR):
+		((unsigned char*)m_lpszFile)[position] = (unsigned char) val;
+		break;
+	
+	case (TeCHAR) :
+		((char*) m_lpszFile)[position] = (char) val;
+		break;
+
+	case (TeUNSIGNEDSHORT):
+		((unsigned short*)m_lpszFile)[position] = (unsigned short) val;
+		break;
+
+	case (TeSHORT):
+		if (params_.swap_)
+			((short*)m_lpszFile)[position] = swaps((short) val);
+		else
+			((short*)m_lpszFile)[position] = (short) val;
+		break;
+
+	case (TeINTEGER):
+		((int*)m_lpszFile)[position] = (int) val;
+		break;
+
+	case (TeUNSIGNEDLONG):
+		((unsigned long*)m_lpszFile)[position] = (unsigned long) val;
+		break;
+	
+	case (TeLONG):
+		((long*)m_lpszFile)[position] = (long) val;
+		break;
+
+	case (TeFLOAT):
+		((float*)m_lpszFile)[position] = (float) val;
+		break;
+	
+	case (TeDOUBLE):
+		((double*)m_lpszFile)[position] = val;
+	default:
+		return false;
+	}
+	return true;
+}
+
+void
+TeDecoderMemoryMap::writeMetadataFile()
+{
+	string metFileName = TeGetName (params_.fileName_.c_str())+".met";
+	try {
+		TeAsciiFile metFile(metFileName,"w");
+		string line = "%Raw raster file metadata\n";
+		metFile.writeString(line);
+		line = "NROWS " + Te2String(params_.nlines_);
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "NCOLS " + Te2String(params_.ncols_);
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "NBANDS " + Te2String(params_.nBands());
+		metFile.writeString(line);
+		metFile.writeNewLine();
+
+		if (params_.nBands() > 1)
+		{
+			line = "INTERLEAVING ";
+			if (params_.interleaving_ == TePerPixel)
+				line += "perpixel";
+			else if (params_.interleaving_ == TePerLine)
+				line += "perline";
+			else
+				line += "perband";
+			metFile.writeString(line);
+			metFile.writeNewLine();
+		}
+
+		line = "DATATYPE ";
+		if (params_.dataType_[0] == TeBIT)
+			line += "bit";
+		else if (params_.dataType_[0] == TeUNSIGNEDCHAR)
+			line += "unsignedchar";
+		else if (params_.dataType_[0] == TeCHAR)
+			line += "char";
+		else if (params_.dataType_[0] == TeUNSIGNEDSHORT)
+			line += "unsignedshort";
+		else if (params_.dataType_[0] == TeSHORT)
+			line += "short";
+		else if (params_.dataType_[0] == TeINTEGER)
+			line += "integer";
+		else if (params_.dataType_[0] == TeUNSIGNEDLONG)
+			line += "unsignedlong";
+		else if (params_.dataType_[0] == TeLONG)
+			line += "long";
+		else if (params_.dataType_[0] == TeFLOAT)
+			line += "float";
+		else if (params_.dataType_[0] == TeDOUBLE)
+			line += "double";		
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		
+		if (params_.swap_)
+		{
+			line = "SWAPPED yes";
+			metFile.writeString(line);
+			metFile.writeNewLine();
+		}
+
+		if (params_.useDummy_)
+		{
+			line += "NO_DATA " + Te2String(params_.dummy_[0]);
+			metFile.writeString(line);
+			metFile.writeNewLine();
+		}
+		
+		line = "RESOLUTION_X " + Te2String(params_.resx_);
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "RESOLUTION_Y " + Te2String(params_.resy_);
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "LOWERLEFT_X " + Te2String(params_.box().x1_);
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "LOWERLEFT_Y " + Te2String(params_.box().y1_);
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "PROJECTION " + params_.projection()->name() + " ";
+		line += params_.projection()->describe();
+		metFile.writeString(line);
+		metFile.writeNewLine();
+		line = "DATUM " +  params_.projection()->datum().name();
+		metFile.writeString(line);
+		metFile.writeNewLine();
+	}
+	catch(...)
+	{
+	}
+}
+
+void 
+TeDecoderMemoryMap::readMetadataFile()
+{
+	// read all keys in the metadata file (there is no order expected) 
+	string metFileName = TeGetName (params_.fileName_.c_str())+".met";
+	map<string,string> metadata;
+	try {
+		TeAsciiFile metFile(metFileName,"r");
+		string key, value;
+		while (metFile.isNotAtEOF())
+		{
+			key = metFile.readString();
+			if (key[0] == '%')
+			{
+				metFile.findNewLine();
+				continue;
+			}
+			value = metFile.readString();
+			metadata.insert(make_pair(key,value));
+			metFile.findNewLine();
+		}
+	}
+	catch(...)
+	{
+	}
+	if (!metadata.empty())
+	{
+		double xll=0, yll=0;
+		map<string,string>::iterator it;
+		it = metadata.find("NROWS");
+		if (it != metadata.end())
+			params_.nlines_ = atoi(it->second.c_str());
+		it = metadata.find("NCOLS");
+		if (it != metadata.end())
+			params_.ncols_ = atoi(it->second.c_str());
+		it = metadata.find("NBANDS");
+		if (it != metadata.end())
+			params_.nBands(atoi(it->second.c_str()));
+		else
+			params_.nBands(1);
+		it = metadata.find("RESOLUTION_X");
+		if (it != metadata.end())
+			params_.resx_ = atof(it->second.c_str());
+		it = metadata.find("RESOLUTION_Y");
+		if (it != metadata.end())
+			params_.resy_ = atof(it->second.c_str());
+		it = metadata.find("LOWERLEFT_X");
+		if (it != metadata.end())
+		{
+			xll = atof(it->second.c_str());
+			it = metadata.find("LOWERLEFT_Y");
+			if (it != metadata.end())
+			{
+				yll = atof(it->second.c_str());
+				params_.lowerLeftResolutionSize(xll,yll, params_.resx_, params_.resy_,
+										params_.ncols_, params_.nlines_);
+			}
+		}
+
+		it = metadata.find("INTERLEAVING");
+		if (it != metadata.end())
+		{
+			if (it->second == "perline")
+				params_.interleaving_ = TePerLine;
+			else if (it->second == "perband")
+				params_.interleaving_ = TePerBand;
+			else params_.interleaving_ = TePerPixel;
+		}
+
+		it = metadata.find("DATATYPE");
+		if (it != metadata.end())
+		{
+			if (it->second == "bit")
+				params_.setDataType(TeBIT);
+			else if (it->second == "unsignedchar")
+				params_.setDataType(TeBIT);
+			else if (it->second == "char")
+				params_.setDataType(TeCHAR);
+			else if (it->second == "unsignedshort")
+				params_.setDataType(TeUNSIGNEDSHORT);
+			else if (it->second == "short")
+				params_.setDataType(TeSHORT);
+			else if (it->second == "integer")
+				params_.setDataType(TeINTEGER);
+			else if (it->second == "unsignedlong")
+				params_.setDataType(TeUNSIGNEDLONG);
+			else if (it->second == "long")
+				params_.setDataType(TeLONG);
+			else if (it->second == "float")
+				params_.setDataType(TeFLOAT);
+			else if (it->second == "double")
+				params_.setDataType(TeDOUBLE);
+		}
+		it = metadata.find("SWAPPED");
+		if (it != metadata.end() && it->second == "yes")
+			params_.swap_ = true;
+
+		it = metadata.find("NO_DATA");
+		if (it != metadata.end())
+		{
+			params_.useDummy_ = true;
+			params_.setDummy(atof(it->second.c_str()));
+		}
+			
+		it = metadata.find("PROJECTION");
+		if (it != metadata.end())
+		{
+			string projdesc = it->second;
+			TeProjectionParams pars;
+			it = metadata.find("DATUM");
+			if (it != metadata.end())
+			{
+				TeDatum dat = TeDatumFactory::make(it->second);
+				pars.datum = dat;
+			}
+			if (decodifyDescription(projdesc,pars))
+			{
+				TeProjection* proj = TeProjectionFactory::make(pars);
+				params_.projection(proj);
+			}
+		}
+	}
+}
+
+#ifdef WIN32
+void
+TeDecoderMemoryMap::init()
+{
+	clear();
+	params_.status_= TeNOTREADY;
+
+	DWORD dwDesiredAccess, dwCreationDisposition, flProtect,dwDesiredAccessV ;
+	
+	if (params_.mode_ == 'c')
+	{
+		dwCreationDisposition = CREATE_ALWAYS;
+		dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
+		flProtect = PAGE_READWRITE;
+		dwDesiredAccessV = FILE_MAP_WRITE;
+	}
+	else if (params_.mode_ == 'w')
+	{
+		dwCreationDisposition = OPEN_ALWAYS;
+		dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;		
+		flProtect = PAGE_READWRITE;
+		dwDesiredAccessV = FILE_MAP_WRITE;
+	}
+	else
+	{
+		dwCreationDisposition = OPEN_EXISTING;
+		dwDesiredAccess = GENERIC_READ;		
+		flProtect = PAGE_READONLY;
+		dwDesiredAccessV = FILE_MAP_READ;
+	}
+
+	// First open the file
+	m_hFile = CreateFile(
+		params_.fileName_.c_str(),	// File name
+		dwDesiredAccess,			// Desired access
+		FILE_SHARE_READ
+		| FILE_SHARE_WRITE,		// Allow sharing-- we're only doing a quick scan
+		NULL,					// No security attributes
+		dwCreationDisposition,	// Creation disposition
+		0,						// Ignore file attributes
+		NULL);					// Ignore hTemplateFile
+
+	if (m_hFile == INVALID_HANDLE_VALUE)
+			return;		// could not open file
+	
+	// Get the file's size
+	m_dwSize = GetFileSize(m_hFile, NULL);
+	if (m_dwSize == 0xffffffff)
+	{
+		m_hFile = NULL;
+		return;
+	}
+	
+	bool fillDummy = false;
+	if (params_.mode_ == 'c' ||  m_dwSize == 0)	
+	{
+		if (!create())
+			return;
+		fillDummy = true;
+		// if creating a raw file write the metata file
+		writeMetadataFile();
+	}
+	else
+	{
+		// if reading an existing raw file try to read the metadata file
+		readMetadataFile();
+	}
+
+	// Create a mapping object from the file
+	m_hMapping = CreateFileMapping(
+		m_hFile,				// Handle we got from CreateFile
+		NULL,					// No security attributes
+		flProtect,			// read-write
+		0, 0,					// Max size = current size of file
+		NULL);					// Don't name the mapping object
+	if ( m_hMapping == NULL )
+	{
+		m_hFile = NULL;
+		return;
+	}
+
+// Map the file to memory
+	switch (params_.dataType_[0]) {
+	case (TeUNSIGNEDCHAR):
+		m_lpszFile = (unsigned char*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeCHAR) :
+		m_lpszFile = (char*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeUNSIGNEDSHORT):
+		m_lpszFile = (unsigned short*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeSHORT):
+		m_lpszFile = (short*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeUNSIGNEDLONG):
+		m_lpszFile = (unsigned long*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeLONG):
+		m_lpszFile = (long*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeFLOAT):
+		m_lpszFile = (float*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	case (TeDOUBLE):
+		m_lpszFile = (double*) MapViewOfFile(
+		m_hMapping,					// Handle we got from CreateFileMapping
+		dwDesiredAccessV,				// full access
+		0, 0,						// Offset into file = beginning of file
+		0);
+		break;
+	}
+	if ( m_lpszFile == NULL )
+		return ;
+
+	if (fillDummy)
+	{
+		for (int b=0; b<params_.nBands();b++)
+			for (int l=0; l<params_.nlines_;l++)
+				for (int c=0; c<params_.ncols_;c++)
+					setElement ( c, l, params_.dummy_[b], b);
+	}
+	if (params_.mode_ =='c' || params_.mode_ == 'w')
+		params_.status_ = TeREADYTOWRITE;
+	else 
+		params_.status_ = TeREADYTOREAD;	
+	return;
+}
+
+
+bool
+TeDecoderMemoryMap::create()
+{
+	char			lpBuffer[1024];
+	unsigned long	nNumberOfBytesToWrite=(long)params_.nBands() * (long)params_.ncols_ * (long)params_.nlines_;    // number of bytes to write
+	nNumberOfBytesToWrite *= (long)params_.nbitsperPixel_[0]/8;    // number of bytes to write
+	unsigned long	nNumberOfBytesWritten;  // pointer to number of bytes written
+
+	for (;nNumberOfBytesToWrite > 1024; nNumberOfBytesToWrite-=1024)
+	{
+		if ( !WriteFile(
+			m_hFile,                // handle to file to write to
+			lpBuffer,               // pointer to data to write to file
+			1024,					// number of bytes to write
+			&nNumberOfBytesWritten,  // pointer to number of bytes written
+			NULL					// pointer to structure for overlapped I/O
+			))
+ 			return false;			// could not write to file
+	}
+
+	if ( !WriteFile(
+		m_hFile,                // handle to file to write to
+		lpBuffer,               // pointer to data to write to file
+		nNumberOfBytesToWrite,	// number of bytes to write
+		&nNumberOfBytesWritten,  // pointer to number of bytes written
+		NULL					// pointer to structure for overlapped I/O
+		))
+ 		return false;			// could not write to file
+	return true;
+}
+
+bool
+TeDecoderMemoryMap::clear()
+{
+	if (m_hFile == NULL)
+		return true;
+
+	if ( !UnmapViewOfFile(m_lpszFile) )
+		return false;
+
+	CloseHandle(m_hMapping);
+	CloseHandle(m_hFile);
+	m_hFile = NULL;
+	params_.status_ = TeNOTREADY;
+	return true;
+}
+#else
+// Linux version: uses mmap
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+void
+TeDecoderMemoryMap::init()
+{
+	clear();
+
+	// First open the file
+	m_hFile = open(params_.fileName_.c_str(),	// File name
+		              O_RDWR,				// Flags
+			      S_IRWXU);				// Mode
+
+	if (m_hFile == -1)
+		return;				// could not open file
+
+	// Get the file's size
+	struct stat aux;
+	if (stat(params_.fileName_.c_str(), &aux) == -1)
+		return;
+	m_dwSize = aux.st_size;
+
+	m_lpszFile  =  mmap(0, m_dwSize, PROT_READ|PROT_WRITE , MAP_PRIVATE, m_hFile, 0);
+	if ( ((int) m_lpszFile)  == -1 )
+		return;
+}
+
+bool
+TeDecoderMemoryMap::create()
+{
+	clear();
+	// First open the file
+	m_hFile = open(params_.fileName_.c_str(),	// File name
+		              O_RDWR,				// Flags
+			      S_IRWXU);				// Mode
+
+	if (m_hFile == -1)
+		return false;				// could not open file
+
+	char			lpBuffer[1024];
+	long	nNumberOfBytesToWrite=(long)params_.nBands() * (long)params_.ncols_ * (long)params_.nlines_;    // number of bytes to write
+	nNumberOfBytesToWrite *= (long)params_.nbitsperPixel_[0]/8;    // number of bytes to write
+	long	nNumberOfBytesWritten;  // pointer to number of bytes written
+
+	for (;nNumberOfBytesToWrite > 1024; nNumberOfBytesToWrite-=1024)
+	{
+		nNumberOfBytesWritten = write(m_hFile, lpBuffer,1024);
+		if (nNumberOfBytesWritten == -1)
+ 		   return false;			// could not write to file
+	}
+
+	nNumberOfBytesWritten = write(m_hFile, lpBuffer,nNumberOfBytesToWrite);
+	if (nNumberOfBytesWritten == -1)
+ 	    return false;
+
+	// Create a mapping object from the file
+
+	struct stat aux;
+	if (stat(params_.fileName_.c_str(), &aux) == -1) 	// Get the file's size
+		return false;
+	m_dwSize = aux.st_size;
+
+	m_lpszFile =  mmap(0, m_dwSize, PROT_READ|PROT_WRITE , MAP_PRIVATE, m_hFile, 0);
+	if ( ((int) m_lpszFile)  == -1 )
+		return false;
+
+	// Writes the default values
+	if (params_.dummy_[0])
+	{
+		for (int b=0; b<params_.nBands();b++)
+			for (int l=0; l<params_.nlines_;l++)
+				for (int c=0; c<params_.ncols_;c++)
+					setElement ( c, l, params_.dummy_[b], b);
+	}
+	return true;
+}
+
+
+bool
+TeDecoderMemoryMap::clear()
+{
+	if (m_lpszFile == 0)
+		return true;
+
+	if ( munmap(m_lpszFile, m_dwSize) == -1)
+		return false;
+	m_lpszFile = 0;
+	close(m_hFile);
+	m_hFile = 0;
+	return true;
+}
+#endif
+
+
diff --git a/src/terralib/kernel/TeDecoderMemoryMap.h b/src/terralib/kernel/TeDecoderMemoryMap.h
new file mode 100644
index 0000000..f71c538
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderMemoryMap.h
@@ -0,0 +1,85 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderMemoryMap.h
+    This file deals with decoding of raster data in a bynary file, using the memory map operation system functionality
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERMEMORYMAP_H
+#define  __TERRALIB_INTERNAL_DECODERMEMORYMAP_H
+
+#include "TeDecoder.h"
+
+#ifdef WIN32
+#include <windows.h>
+#include <winbase.h>
+#else
+#include <sys/mman.h>
+#endif
+
+ 
+//! Implements a decoder to raster data in a bynary file, using the memory map operation system functionality
+class TeDecoderMemoryMap : public TeDecoder
+{
+public:
+	TeDecoderMemoryMap ( const TeRasterParams& );
+	~TeDecoderMemoryMap ();
+
+	bool setElement (int col, int lin, double val, int band = 0);
+	bool getElement (int col, int lin, double &val,int band = 0);
+
+	void init	();
+	bool clear	();
+
+	void writeMetadataFile();
+	void readMetadataFile();
+
+private:
+	bool create	();
+
+#ifdef WIN32
+// Windows support to file memory mapping
+	long	dataInitPos_;
+	HANDLE  m_hFile;			// Handle to file we're currently zapping
+	HANDLE	m_hMapping;			// Handle to memory-mapping of that file
+	LPVOID  m_lpszFile;			// Pointer to view of file mapped to memory
+	DWORD	m_dwSize;
+#else
+// Linux support to file memory mapping
+	long	dataInitPos_;
+	int  m_hFile;			//(fd) Handle to file we're currently zapping
+	void*  m_lpszFile;			// Pointer to view of file mapped to memory
+	long	m_dwSize;
+#endif
+};
+
+//! Implements a factory to build memory map decoder
+class TeDecoderMemoryMapFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderMemoryMapFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderMemoryMap(arg); }
+};
+#endif
+
diff --git a/src/terralib/kernel/TeDecoderSPR.cpp b/src/terralib/kernel/TeDecoderSPR.cpp
new file mode 100644
index 0000000..0316660
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderSPR.cpp
@@ -0,0 +1,341 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeException.h"
+#include "TeDecoderSPR.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+#ifdef WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+
+TeDecoderSPR::TeDecoderSPR (const TeRasterParams& par) : 
+	TeDecoderMemory()
+{	
+	if (par.fileName_.empty())
+		return;
+	params_ = par;
+	params_.decoderIdentifier_ = "SPR";
+	if (params_.mode_ == 'w' || params_.mode_ == 'r')
+		readParameters();
+}
+
+TeDecoderSPR::~TeDecoderSPR ()
+{
+	if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+	{			// save contents to disk
+		try
+		{
+			TeAsciiFile sFile(params_.fileName_,"w+");
+			if (writeParameters(sFile))
+				saveData(sFile);
+		}
+		catch (...)
+		{
+		}
+	}
+	TeDecoderMemory::clear();
+}
+
+bool
+TeDecoderSPR::clear()
+{
+	if ( isModified_ && (params_.mode_ == 'w' || params_.mode_ == 'c'))
+	{			// save contents to disk
+		try
+		{
+			TeAsciiFile sFile(params_.fileName_,"w+");
+			if (writeParameters(sFile))
+				saveData(sFile);
+		}
+		catch (...)
+		{
+		}
+		isModified_ = false;
+	}
+	TeDecoderMemory::clear();
+	return true;
+}
+
+bool 
+TeDecoderSPR::readParameters()
+{
+	try
+	{
+		TeAsciiFile	pFile (params_.fileName_);
+		string name;
+
+		// check if there is the GRIDDEF section
+		while (pFile.isNotAtEOF())
+		{
+			name = pFile.readString();
+			if (name[0] =='/' && name[1] == '/')	// skip comments
+				pFile.findNewLine();
+			else if (name == "GRIDDEF")
+				break;
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+		
+		// read INFO section
+		double x1, y2;
+		int ncols;
+		double dummy;
+
+		// Expected format to grid definition:
+		// GRIDDEF  <ncols>  <nlins>  <X1>  <Y2>  <resX>  <resY>  <nodatavalue>
+		params_.ncols_ = ncols = pFile.readInt();
+		params_.nlines_ = pFile.readInt();
+		x1 = pFile.readFloat();
+		y2 = pFile.readFloat();
+		params_.resx_ = pFile.readFloat();
+		params_.resy_ = pFile.readFloat();
+		params_.nBands(1);
+		dummy = pFile.readFloat();
+		params_.useDummy_ = true;
+		params_.setDummy(dummy);
+
+		do
+		{
+			name = pFile.readString();
+			if (name[0] =='/' && name[1] == '/')	// skip comments
+				pFile.findNewLine();
+		} while (pFile.isNotAtEOF() && name != "GRIDCLASS" && name != "INFO_END");
+		
+		if (name == "GRIDCLASS" )
+		{
+			// Expected format GRIDCLASS  <nclass>  <ncolorR>  <ncolorG>  <ncolorB>  <nameclass>
+			vector<short> lutr;
+			vector<short> lutg;
+			vector<short> lutb;
+			
+			name = pFile.readString();
+			while (pFile.isNotAtEOF() && name != "INFO_END") // loop through all class definitions
+			{
+				name = pFile.readString();
+				lutr.push_back(atoi(name.c_str())); 
+
+				name = pFile.readString();
+				lutg.push_back(atoi(name.c_str())); 
+
+				name = pFile.readString();
+				lutb.push_back(atoi(name.c_str())); 
+
+				name = pFile.readString();			
+				name = pFile.readString();			
+			} 
+
+			if (!pFile.isNotAtEOF())	// unexpected end of file
+				return false;
+
+			params_.setPhotometric(TeRASTERPALETTE);
+			params_.setNumberPalleteEntries(lutr.size()+1);
+			for (unsigned int i=0; i<lutr.size(); i++)
+			{
+				params_.lutr_[i+1] = lutr[i];
+				params_.lutg_[i+1] = lutg[i];
+				params_.lutb_[i+1] = lutb[i];
+			}
+			lutr.clear();
+			lutg.clear();
+			lutb.clear();
+			params_.setDataType(TeUNSIGNEDCHAR);
+		}
+		else if (name == "INFO_END")
+		{
+			params_.setDataType(TeDOUBLE);
+			params_.setPhotometric(TeRASTERMULTIBAND);
+		}
+		params_.topLeftResolutionSize(x1,y2,params_.resx_,params_.resy_,
+				                      params_.ncols_,params_.nlines_,false);
+		TeProjection* pp = new TeNoProjection();
+		params_.projection(pp);
+		delete pp;
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+bool
+TeDecoderSPR::readFile(const string& filename)
+{
+	string valstring;
+	try 
+	{
+		TeAsciiFile	pFile (filename);
+		string name;
+		while (pFile.isNotAtEOF() && name != "INFO_END")
+		{
+			name = pFile.readString();
+			if (name[0] =='/' && name[1] == '/')	// skip comments
+				pFile.findNewLine();
+		}
+		if (!pFile.isNotAtEOF())					// unexpected end of file
+			return false;
+
+		for (int lin = 0; lin < params_.nlines_; lin++)
+		{
+			for (int col = 0; col < params_.ncols_; col++)
+			{
+				valstring = pFile.readString();
+				setElement(col,lin,atof(valstring.c_str()));
+			}
+		}
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+void
+TeDecoderSPR::init()
+{
+	params_.status_= TeNOTREADY;
+	int nb = params_.nBands();
+	if (nb != 1 )
+		return;
+
+	TeDecoderMemory::init();			// try to allocate enough memory
+	if (params_.status_ == TeNOTREADY)
+		return;
+
+	params_.status_= TeNOTREADY;
+	if (params_.mode_ == 'c')	// creating a new file
+	{
+		if (access(params_.fileName_.c_str(),00) != -1) // remove existing file
+		{
+			if (unlink(params_.fileName_.c_str()) == -1)
+				return;
+		}
+		try
+		{
+			TeAsciiFile sFile(params_.fileName_,"w+");
+			if (!writeParameters(sFile) || !saveData(sFile))
+				return;
+			else
+			{
+				params_.status_ = TeREADYTOWRITE;
+			}
+		}
+		catch (...)
+		{
+			return;
+		}
+	}
+	else if (params_.mode_ == 'w')
+	{
+		if ((access(params_.fileName_.c_str(),06) == -1) || !readFile(params_.fileName_))
+			return;
+		params_.status_ = TeREADYTOWRITE;
+	}
+	else if (params_.mode_ == 'r')
+	{
+		if ((access(params_.fileName_.c_str(),04) == -1)|| !readFile(params_.fileName_))
+			return;
+		params_.status_ = TeREADYTOREAD;	
+	}
+}
+
+bool 
+TeDecoderSPR::writeParameters(TeAsciiFile& pFile)
+{
+	string name;
+	try
+	{
+		TeBox box = params_.boundingBox();
+		name = "GRIDREG\nINFO\n";
+		pFile.writeString(name);
+		name = "//Formato GRIDDEF  <ncols>  <nlins>  <X1>  <Y2>  <resX>  <resY>  <nodatavalue>\n";
+		pFile.writeString(name);
+		name = "GRIDDEF ";
+		pFile.writeString(name);
+		name = Te2String(params_.ncols_) + " " + Te2String(params_.nlines_) + " ";
+		pFile.writeString(name);
+		name = Te2String(box.x1_,6) + " " + Te2String(box.y2_,6) + " ";
+		pFile.writeString(name);
+		name = Te2String(params_.resx_,6) + " " + Te2String(params_.resy_,6) + " ";
+		pFile.writeString(name);
+		name = Te2String(params_.dummy_[0],6) + "\n";
+		pFile.writeString(name);
+
+		if (params_.photometric_[0] == TeRASTERPALETTE)
+		{
+			name = "GRIDCLASS\n";
+			for (unsigned int nc=0; nc<params_.lutr_.size(); ++nc)
+			{
+				name = Te2String(nc) + " " + Te2String(params_.lutr_[nc]);
+				name += " " + Te2String(params_.lutg_[nc]) + " " + Te2String(params_.lutb_[nc]);
+				name += " c" + Te2String(nc) + "\n";
+				pFile.writeString(name);
+			}
+		}
+		name = "INFO_END\n";
+		pFile.writeString(name);
+	}
+	catch (...)
+	{
+		return false;
+	}
+	return true;
+}
+
+bool 
+TeDecoderSPR::saveData(TeAsciiFile& pFile)
+{
+	bool isi = (params_.dataType_[0] != TeDOUBLE) && (params_.dataType_[0] != TeFLOAT);
+
+	FILE* fp = pFile.FilePtr();
+	char fmt[100];
+	if (isi)
+		strcpy(fmt,"%.0f ");
+	else
+		strcpy(fmt,"%f ");
+	try
+	{
+		double d;
+		for (int l=0; l<params_.nlines_; ++l)
+		{
+			for (int c=0; c<params_.ncols_; ++c)
+			{
+				TeDecoderMemory::getElement(c,l,d);
+				fprintf(fp,fmt,d);
+			}
+			pFile.writeNewLine();
+		}
+		string spc = "END\n";
+		pFile.writeString(spc);
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
diff --git a/src/terralib/kernel/TeDecoderSPR.h b/src/terralib/kernel/TeDecoderSPR.h
new file mode 100644
index 0000000..7292ff8
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderSPR.h
@@ -0,0 +1,68 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderSPR.h
+    This file deals with decoding of raster data in a ASCII SPRING format
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERSPR_H
+#define  __TERRALIB_INTERNAL_DECODERSPR_H
+
+#include "TeDecoderMemory.h"
+
+class TeAsciiFile;
+
+//! Implements a decoder for rasters in ASCII Spring format
+class TeDecoderSPR : public TeDecoderMemory
+{
+public:
+	//! Empty constructor
+	TeDecoderSPR () : TeDecoderMemory() 
+	{	params_.decoderIdentifier_ = "SPR";	}
+
+	//! Constructor from some parameters
+	TeDecoderSPR (const TeRasterParams& par);
+
+	//! Destructor
+	~TeDecoderSPR ();
+
+	void	init();
+	bool	clear();
+private:
+    bool    readFile(const string& filename);
+	bool	readParameters();
+	bool	writeParameters(TeAsciiFile& pFile);
+	bool	saveData(TeAsciiFile& pFile);
+};
+
+//! Implements a factory to build decoders to JPEG raster
+class TeDecoderSPRFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderSPRFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderSPR(arg); }
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderTIFF.cpp b/src/terralib/kernel/TeDecoderTIFF.cpp
new file mode 100644
index 0000000..831551f
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderTIFF.cpp
@@ -0,0 +1,1372 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDecoderTIFF.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeRaster.h"
+#include "TeDecoderMemory.h"
+#ifdef WIN32
+#include <io.h>
+#endif
+
+#if !defined(WIN32)
+#include <sys/param.h>
+#endif 
+
+// ---- Public Methods ----- 
+
+TeDecoderTIFF::TeDecoderTIFF(const TeRasterParams& par)
+{
+	params_ = par;
+	TImage = -1;
+	TCurLine_ = -1;
+	first = 1;
+	TBuffer_ = 0;
+	TBufferTile_ = 0;
+	nBands_ = par.nBands();
+	params_.status_= TeNOTREADY;
+
+	bytesperline_ = 0;
+	rowtilesize_  = 0;
+	tilew_ = 0;
+	tileh_ = 0;
+	bytespertile_ = 0;
+
+	tif = 0;
+	gtif = 0;
+	
+	char tifmode = 'r';
+	if (params_.mode_=='c')
+	{
+		tifmode = 'a';
+	}
+	else if (params_.mode_ == 'r')
+	{// if file should exist already read tiff/geotiff parameters
+		tif=XTIFFOpen(params_.fileName_.c_str(),&tifmode);
+		if (!tif)
+			return;
+		gtif = (GTIF*)GTIFNew(tif);
+		ReadTiffDirectory();
+		if (gtif)
+		{
+			GTIFFree(gtif);
+			gtif = 0;
+		}
+		if (tif)
+		{
+			XTIFFClose(tif); 
+			tif = 0;
+		}
+		params_.decoderIdentifier_ = "TIF";
+	}
+}
+
+void
+TeDecoderTIFF::init()
+{
+	clear();		// reset existent internal structures
+
+	params_.status_= TeNOTREADY;
+	char tifmode;	// libtiff mode
+
+	// check the initial permissions on the file
+	if (params_.mode_ == 'c')		// creating a new raster file
+	{
+		if (access(params_.fileName_.c_str(),00) != -1)  // try to remove existing file
+			if (unlink(params_.fileName_.c_str()) == -1)
+				return;
+		tifmode = 'a';
+		params_.status_ = TeREADYTOWRITE;
+	}
+	else if ( params_.mode_ == 'r' )
+	{
+		if (access(params_.fileName_.c_str(),04) == -1)
+			return;							// there is no permission to read
+		tifmode = 'r';
+		params_.status_ = TeREADYTOREAD;
+	}
+	// TIFF image files may not be opened for both reading and writing; 
+	// there is no support for altering the contents of a TIFF file. So
+	// mode == 'w' never initializes this decoder.
+	else if (params_.mode_ == 'w')
+	{
+		params_.status_= TeNOTREADY;
+		return;
+	}
+	else	// unknown mode
+		return;
+
+	// try to open the tiff file with the desired mode
+	tif=XTIFFOpen(params_.fileName_.c_str(),&tifmode);
+	if (!tif)
+	{
+		params_.status_= TeNOTREADY;
+		return;
+	}
+
+	// try to create a geotiff instance on the tiff file 
+	gtif = (GTIF*)GTIFNew(tif);
+	if (!tif)
+	{
+		params_.status_= TeNOTREADY;
+		return;
+	}
+
+	if (params_.mode_ == 'c')	// if geotiff is being created we should set the geo flags
+		SetGeoKeys();
+	
+	ReadTiffDirectory();		// read the tiff geokeys
+	AllocateBuffer();				// allocate the internal buffers
+	if (params_.mode_ == 'c' && 	// if a new image writes creates a dummy image
+		!WriteDummyImage())			// if couldn�t write dummy image there is an error
+	{
+		params_.status_= TeNOTREADY;		 
+		return;
+	}
+}
+
+
+bool 
+TeDecoderTIFF::clear()
+{
+	if (tif && params_.mode_=='c' && TCurLine_ >= 0)	//  if we have been 
+	{													//	writting save the last 
+		tif->tif_curoff = 0;
+		int cc = TIFFStripSize(tif);
+		TIFFWriteStrip(tif,TCurLine_,TBuffer_,cc);
+	}
+	if (gtif)
+		GTIFFree(gtif);
+	if (tif)
+		XTIFFClose(tif); 
+
+	tif = 0;
+	gtif = 0;
+	first = 0;
+	TImage = -1;
+	TCurLine_ = -1;
+	bytesperline_ = 0;
+	rowtilesize_  = 0;
+	tilew_ = 0;
+	tileh_ = 0;
+	bytespertile_ = 0;
+
+	DeallocateBuffer();
+	params_.status_ = TeNOTREADY;
+	return true;
+}
+
+TeDecoderTIFF::~TeDecoderTIFF()
+{
+	clear();
+}
+
+bool
+TeDecoderTIFF::getElement(int col,int lin, double &val,int band)
+{
+	if (TCurLine_ != (int)lin)		// if line is not the current
+	{
+		if (TImage == MONOIMAGE || TImage == PALLETEIMAGE)
+		{
+			if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+				return false;
+		}
+		else // RGB image
+		{
+			if (planar_ == PLANARCONFIG_CONTIG)
+			{
+				if (isTiled_)
+				{
+					if(!ReadTileImageContig(lin,TBuffer_))
+						return false;
+				}
+				else
+				{
+					if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+						return false;
+				}
+			}
+			else	// RGB Separate
+			{
+				if (isTiled_)  return false; // SEPARATE and tiled => Error!
+				for (int s=0; s < nBands_; s++)
+					if (TIFFReadScanline(tif,&TBuffer_[s*params_.ncols_*params_.elementSize(s)],lin,s) < 0)
+						return false;
+			}
+		}
+		TCurLine_ = lin;
+	}
+	int pos;
+	if (planar_ == PLANARCONFIG_CONTIG)
+		pos = col*nBands_+band;
+	else
+		pos = band*params_.ncols_+col;
+
+	if (params_.dataType_[band] == TeFLOAT)			// 32 bits
+		val = ((float*)TBuffer_)[pos];
+	else if (params_.dataType_[band] == TeSHORT)	// 16 bits
+		val = ((short*)TBuffer_)[pos];
+	else											// 8 bits
+		val = TBuffer_[pos];
+	return true;
+}
+
+
+// We allow writting only to a strip based, non compressed tiff file
+bool
+TeDecoderTIFF::setElement(int col, int lin, double val, int band)
+{
+	int strip = lin/rowsperstrip_;
+	if (strip != TCurLine_)
+	{
+		if (TCurLine_ >= 0)
+		{
+			tif->tif_curoff = 0;
+			int cc = TIFFStripSize(tif);
+			TIFFWriteStrip(tif,TCurLine_,TBuffer_,cc);
+		}
+		TCurLine_ = strip;
+
+		int l = strip * rowsperstrip_;
+		bool res = false;
+		if (TImage == MONOIMAGE || TImage == PALLETEIMAGE)
+		{
+			tif->tif_curstrip = 0;
+			res = ReadMonoImage(l);
+		}
+		else if(TImage == RGBIMAGE)
+		{
+			tif->tif_curstrip = 0;
+			res = ReadRGBImage (l);
+		}
+		if (!res)
+		{
+			TCurLine_ = -1;
+			return false;
+		}
+	}
+	int offset = lin % rowsperstrip_ * bytesperline_;
+	unsigned char* cp = TBuffer_ + offset;
+	int pos = col*nBands_+band;
+	if (params_.dataType_[band] == TeFLOAT)			// 32 bits
+		((float*)cp)[pos] = (float)val;
+	else if (params_.dataType_[band] == TeSHORT)	// 16 bits
+		((short*)cp)[pos] = (short)val;
+	else											// 8 bits
+		cp[pos] = (unsigned char)val;
+	return true;
+}
+
+
+// --- Internal Methods ---
+
+// --- Methods that deal with Tiff/GeoTiff Flags
+
+void TeDecoderTIFF :: SetGeoKeys()
+{
+
+// Image Size
+	TIFFSetField(gtif->gt_tif, TIFFTAG_IMAGEWIDTH, params_.ncols_);
+	TIFFSetField(gtif->gt_tif, TIFFTAG_IMAGELENGTH, params_.nlines_);
+
+// Orientation
+	TIFFSetField(gtif->gt_tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+
+// Number of bits
+	int nb = params_.nbitsperPixel_[0];
+	TIFFSetField(gtif->gt_tif, TIFFTAG_BITSPERSAMPLE, nb);
+
+// Number of bands
+	TIFFSetField(gtif->gt_tif, TIFFTAG_SAMPLESPERPIXEL, nBands_);
+
+// Compression
+	TIFFSetField(gtif->gt_tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+
+// Planar configuration
+	TIFFSetField(tif,TIFFTAG_PLANARCONFIG,  PLANARCONFIG_CONTIG);
+
+// Photometric type
+	if (nBands_ == 1) // monobands
+	{
+		if (params_.photometric_[0] == TeRASTERPALETTE)
+		{
+			TIFFSetField(gtif->gt_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_PALETTE);
+			SaveLut();
+			TImage = PALLETEIMAGE;
+		}
+		else
+		{
+			TIFFSetField(gtif->gt_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
+			TImage = MONOIMAGE;
+		}
+	}
+	else
+	{
+		TIFFSetField(gtif->gt_tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+		TImage = RGBIMAGE;
+	}
+
+	// Rows per Strip
+	int rowsperstrip = 3;
+//	rowsperstrip = TIFFDefaultStripSize(gtif->gt_tif, rowsperstrip);
+	TIFFSetField(gtif->gt_tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
+
+	TeProjectionParams paramas = params_.projection()->params();
+
+	// Projection parameters
+	GTIFKeySet(gtif, GTRasterTypeGeoKey, TYPE_SHORT, 1, RasterPixelIsArea);
+	double tiepoint[6];
+	TeBox infobox = params_.box();
+	tiepoint[0] =0;
+	tiepoint[1] =0;
+	tiepoint[2] =0;
+	tiepoint[3] = infobox.x1();
+	tiepoint[4] = infobox.y2();
+	tiepoint[5] = 0;
+	double resolution[3];
+	resolution[0] = params_.resx_;
+	resolution[1] = params_.resy_;
+	resolution[2] = 0;
+	TIFFSetField(gtif->gt_tif, GTIFF_TIEPOINTS, 6,&tiepoint); 
+	TIFFSetField(gtif->gt_tif, GTIFF_PIXELSCALE, 3,&resolution);
+
+	string projname = params_.projection()->name();
+	if (projname == "NoProjection")
+	{
+		GTIFWriteKeys(gtif);				// write so far defined geo keys 
+		return;
+	}
+
+	if (projname == "LatLong")
+	{
+		GTIFKeySet(gtif, GTModelTypeGeoKey, TYPE_SHORT, 1, ModelTypeGeographic);
+		GTIFKeySet(gtif, GeogAngularUnitsGeoKey, TYPE_SHORT, 1, Angular_Degree);
+	}
+	else
+	{
+		GTIFKeySet(gtif, GTModelTypeGeoKey, TYPE_SHORT, 1, ModelTypeProjected);
+		GTIFKeySet(gtif, ProjLinearUnitsGeoKey, TYPE_SHORT, 1,Linear_Meter);
+		if (projname == "UTM")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_TransverseMercator);
+			GTIFKeySet(gtif, ProjNatOriginLatGeoKey, TYPE_DOUBLE,1,paramas.lat0*TeCRD);
+			GTIFKeySet(gtif, ProjNatOriginLongGeoKey, TYPE_DOUBLE,1,paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE,1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey, TYPE_DOUBLE,1,paramas.offy);
+		}
+		else if (projname == "Mercator")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_Mercator);
+			GTIFKeySet(gtif, ProjNatOriginLongGeoKey, TYPE_DOUBLE,1,paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjNatOriginLatGeoKey, TYPE_DOUBLE,1,paramas.stlat1*TeCRD);
+			GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE,1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey, TYPE_DOUBLE,1,paramas.offy);
+		}
+		else if (projname == "LambertConformal")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_LambertConfConic_2SP);
+			GTIFKeySet(gtif, ProjFalseOriginLatGeoKey,TYPE_DOUBLE, 1, paramas.lat0*TeCRD);
+			GTIFKeySet(gtif, ProjFalseOriginLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjStdParallel1GeoKey, TYPE_DOUBLE, 1, paramas.stlat1*TeCRD);
+			GTIFKeySet(gtif, ProjStdParallel2GeoKey, TYPE_DOUBLE, 1, paramas.stlat2*TeCRD);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+		}
+		else if (projname == "Polyconic")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_Polyconic);
+			GTIFKeySet(gtif, ProjFalseOriginLatGeoKey,TYPE_DOUBLE, 1, paramas.lat0*TeCRD);
+			GTIFKeySet(gtif, ProjFalseOriginLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+			GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+		}
+		else if (projname == "CylindricalEquidistant")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_Equirectangular);
+			GTIFKeySet(gtif, ProjCenterLatGeoKey,TYPE_DOUBLE, 1, paramas.stlat1*TeCRD);
+			GTIFKeySet(gtif, ProjCenterLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+		}
+		else if (projname == "PolarStereographic")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_PolarStereographic);
+			GTIFKeySet(gtif, ProjNatOriginLatGeoKey, TYPE_DOUBLE,1,paramas.lat0*TeCRD);
+			GTIFKeySet(gtif, ProjNatOriginLongGeoKey, TYPE_DOUBLE,1,paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjScaleAtNatOriginGeoKey, TYPE_DOUBLE,1,paramas.scale);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE,1,paramas.offx);
+
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey, TYPE_DOUBLE,1,paramas.offy);
+		}
+		else if (projname == "Albers")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_AlbersEqualArea);
+			GTIFKeySet(gtif, ProjFalseOriginLatGeoKey,TYPE_DOUBLE, 1, paramas.lat0*TeCRD);
+			GTIFKeySet(gtif, ProjFalseOriginLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjStdParallel1GeoKey, TYPE_DOUBLE, 1, paramas.stlat1*TeCRD);
+			GTIFKeySet(gtif, ProjStdParallel2GeoKey, TYPE_DOUBLE, 1, paramas.stlat2*TeCRD);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+		}
+		else if (projname == "Miller")
+		{
+			GTIFKeySet(gtif, ProjCoordTransGeoKey, TYPE_SHORT, 1, CT_MillerCylindrical);
+			GTIFKeySet(gtif, ProjCenterLongGeoKey, TYPE_DOUBLE, 1, paramas.lon0*TeCRD);
+			GTIFKeySet(gtif, ProjFalseEastingGeoKey, TYPE_DOUBLE, 1,paramas.offx);
+			GTIFKeySet(gtif, ProjFalseNorthingGeoKey,TYPE_DOUBLE, 1,paramas.offy);
+		}
+	}
+
+	// datum parameters
+	if (paramas.datum.name() == "CorregoAlegre")
+		GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,6225);
+	else if (paramas.datum.name() == "WGS84")
+		GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,6326);
+	else if (paramas.datum.name() == "SAD69")
+		GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,6291);
+	else
+		GTIFKeySet(gtif, GeogGeodeticDatumGeoKey, TYPE_SHORT, 1,32767);
+
+	GTIFKeySet(gtif, GeogCitationGeoKey, TYPE_ASCII,1,paramas.datum.name().c_str());
+	double sMajorAxis = paramas.datum.radius();
+	double sMinorAxis = sMajorAxis*(1-paramas.datum.flattening());
+	GTIFKeySet(gtif, GeogSemiMajorAxisGeoKey,TYPE_DOUBLE, 1, sMajorAxis);
+	GTIFKeySet(gtif, GeogSemiMinorAxisGeoKey,TYPE_DOUBLE, 1, sMinorAxis);
+	GTIFWriteKeys(gtif);
+}
+
+void
+TeDecoderTIFF::ReadTiffDirectory()
+{
+	int ncols=0, nlins = 0;
+	TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&ncols);
+	TIFFGetField(tif,TIFFTAG_IMAGELENGTH,&nlins);
+	params_.ncols_ = ncols;
+	params_.nlines_ = nlins;
+		
+	short samplesperPixel;
+	if (!TIFFGetField(tif,TIFFTAG_SAMPLESPERPIXEL,&samplesperPixel) )
+		params_.nBands(1);
+	else
+		params_.nBands(samplesperPixel);
+	nBands_ = params_.nBands();
+
+	nbitsperpixel_ = 0;
+	if( !TIFFGetField(tif,TIFFTAG_BITSPERSAMPLE,&nbitsperpixel_) )
+	{
+		nbitsperpixel_ = 1;
+		params_.setDataType(TeBIT);
+	}
+	else
+	{
+		int nbytes = nbitsperpixel_/8;
+		if (nbytes == 1)
+			params_.setDataType(TeUNSIGNEDCHAR);
+		else if (nbytes == 2)
+		    params_.setDataType(TeSHORT);
+		else if (nbytes == 4)
+			params_.setDataType(TeFLOAT);
+		else
+			params_.setDataType(TeDOUBLE);
+	}
+	
+	isTiled_ = (TIFFIsTiled(tif) != 0);			// return non-zero if is organized in tiles 
+	if (isTiled_)
+	{
+		rowtilesize_= TIFFTileRowSize(tif);
+		TIFFGetField(tif,TIFFTAG_TILEWIDTH,&tilew_);
+		TIFFGetField(tif,TIFFTAG_TILELENGTH,&tileh_);
+		bytespertile_ = TIFFTileSize(tif);
+	}
+	else
+		TIFFGetField(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip_);
+
+
+	bytesperline_ = TIFFScanlineSize(tif);
+
+	TIFFGetField(tif,TIFFTAG_PLANARCONFIG,&planar_);	// storage organization
+	TIFFGetField(tif,TIFFTAG_PHOTOMETRIC,&photom_);     // photometric interpretation
+
+	if (samplesperPixel == 3 && 
+	   (photom_ == PHOTOMETRIC_MINISWHITE || 
+	    photom_ == PHOTOMETRIC_MINISBLACK))
+		photom_ = PHOTOMETRIC_RGB;
+	
+	switch (photom_)
+	{
+	case PHOTOMETRIC_PALETTE:
+		params_.setPhotometric(TeRASTERPALETTE);
+		TImage = PALLETEIMAGE;
+		ReadLut();
+		break;
+	case PHOTOMETRIC_MINISWHITE:
+	case PHOTOMETRIC_MINISBLACK:
+		params_.setPhotometric(TeRASTERMULTIBAND);
+		TImage = MONOIMAGE;
+		break;
+	case PHOTOMETRIC_RGB:
+		params_.setPhotometric(TeRASTERRGB);
+		TImage = RGBIMAGE;
+		break;
+	default:
+		break;
+	}
+
+	TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress_);
+	if (compress_ != COMPRESSION_NONE)
+		params_.setCompressionMode(TeTIFFCOMPRESSION);
+
+	// Read georeference parameters
+	if (GetGeoTIFF ()) //GeoTiff Images
+	{
+		TeCoord2D lleft(0.,params_.nlines_-1);
+		TeCoord2D uleft(0.,0.);
+		TeCoord2D uright(params_.ncols_-1,0.);
+		TeCoord2D lright(params_.ncols_-1,params_.nlines_-1);
+
+		lleft = index2Coord (lleft);
+		uleft = index2Coord (uleft);
+		uright = index2Coord (uright);
+		lright = index2Coord(lright);
+		
+		double x1 = min(lleft.x(), uleft.x());
+		double x2 = max(lright.x(), uright.x());
+		double y1 = min(lleft.y(), lright.y());
+        // double y2 = max(uleft.y(), uright.y());   variable not used
+
+		params_.lowerLeftResolutionSize(x1,y1,params_.resx_,params_.resy_,params_.ncols_,params_.nlines_);
+
+        TeCoord2D coord(0,0);
+		TeCoord2D pt1 = index2Coord(coord);
+		x2 = pt1.x()+params_.boundingBox().width();
+        TeCoord2D tmpCoord =  TeCoord2D(x2,pt1.y());
+		TeCoord2D pt2 = params_.coord2Index(tmpCoord);
+		params_.nTilesInMemory_ = (abs((int)pt2.y())+1)*nBands_;
+	}
+	else if (!params_.box().isValid())
+	{
+		params_.lowerLeftResolutionSize(0.5,0.5,1,1,params_.ncols_,params_.nlines_);
+	}
+}
+	
+
+bool
+TeDecoderTIFF::GetGeoTIFF()
+{
+	if (!gtif) 
+		return false;
+
+	int count;
+	transMatrix_ = 0;
+	pixelScale_ = 0;
+	tiePoints_ = 0;
+
+	double TIangle = 0.;
+	params_.resx_ = params_.resy_ = 1;
+	double TIx0=0, TIy0=0, TIi0=0, TIj0 = 0.;
+//	double TIzone = 0;
+
+	if(gtif->gt_num_keys > 0)
+	{
+		if ((gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX, &count, &transMatrix_ ))
+		{
+			if (transMatrix_[0] > 0.) 
+			{
+				TIangle = atan (transMatrix_[4]/transMatrix_[0]);
+				params_.resx_ = TeRoundD(fabs(transMatrix_[0]/cos(TIangle)));
+				params_.resy_ = TeRoundD(fabs(transMatrix_[1]/sin(TIangle)));
+				TIangle = -1. * TIangle * 180. / 3.14159264359;
+
+			}
+		}
+		else
+		{
+			if ((gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixelScale_ ))
+			{
+				params_.resx_ = TeRoundD(fabs (pixelScale_[0]));
+				params_.resy_ = TeRoundD(fabs (pixelScale_[1]));
+			}
+		}
+	}
+
+	if ((gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS, &count, &tiePoints_ ))
+	{
+		if (count > 0)
+		{
+			TIi0 = tiePoints_[0];
+			TIj0 = tiePoints_[1];
+			int di = (int)(TIi0 - 0);
+			int dj = (int)(TIj0 - 0); 
+			
+			TIx0 = tiePoints_[3];
+			TIy0 = tiePoints_[4];
+
+			double x0 = TIx0 - di*params_.resx_;
+			double y0 = TIy0 - dj*params_.resy_;
+			
+			params_.topLeftResolutionSize(x0,y0,params_.resx_,params_.resy_,params_.ncols_,params_.nlines_);
+		}
+	}
+
+	GTIFDefn	defn;        
+    if (GTIFGetDefn( gtif, &defn ) )
+	{
+		isGeoTiff_ = false;
+
+		// default parameters of a spherical ellipsoid
+		double TISemiMajor = 6.371000e+06, TISemiMinor = 0;
+		if (defn.SemiMajor == 0. && defn.SemiMinor == 0.)
+		{
+			GTIFKeyGet(gtif, GeogSemiMajorAxisGeoKey,&TISemiMajor, 0, 1 );
+			GTIFKeyGet(gtif, GeogSemiMinorAxisGeoKey,&TISemiMinor, 0, 1 );
+		}
+		else
+		{
+			TISemiMajor = defn.SemiMajor;
+			TISemiMinor = defn.SemiMinor; 
+		}
+
+		TeDatum mDatum;
+		if (defn.Datum == 6291)
+			mDatum = TeDatumFactory::make("SAD69");
+		else if (defn.Datum == 6326)
+			mDatum = TeDatumFactory::make("WGS84");
+		else
+		{
+			double f = (TISemiMajor - TISemiMinor)/TISemiMajor;
+			if (!findDatum(TISemiMajor,f,mDatum))
+				mDatum = TeDatum("UserDefined",TISemiMajor,f,0.,0.,0.);
+		}
+
+		double TIlat1 = 0., TIlat2 = 0., TIlat0 = 0., TIlon0 = 0.;
+		double TIdeltax = 0., TIdeltay = 0., TIScale = 0.;
+
+		// Try to get projection parameters
+		TeProjectionParams mProjPars;	
+		mProjPars.units = "Meters";		
+
+		TeProjection* proj = 0;
+
+		short mtype = ModelTypeProjected;
+		GTIFKeyGet(gtif, GTModelTypeGeoKey,&mtype, 0, 1 );
+		if (mtype == ModelTypeGeographic)
+		{
+			proj = new TeLatLong(mDatum);
+		}
+		else
+		{
+			switch (defn.CTProjection)
+			{
+				case CT_TransverseMercator : 
+					TIlat0 = defn.ProjParm[0];
+					TIlon0 = defn.ProjParm[1];
+					TIScale = defn.ProjParm[4];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+
+					TIy0 = TIy0 + 10000000. - TIdeltay;
+					TIx0 = TIx0 + 500000. - TIdeltax;
+
+					mProjPars.name = "UTM";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lat0 = TIlat0*TeCDR;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.scale = TIScale;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+
+					break;
+				case CT_Mercator :
+					TIlat1 = defn.ProjParm[0];
+					TIlon0 = defn.ProjParm[1];
+					TIScale = defn.ProjParm[4];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+				
+					mProjPars.name = "Mercator";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.stlat1 = TIlat1*TeCDR;
+					mProjPars.scale = TIScale;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+				case CT_LambertConfConic_2SP :
+					TIlat0 = defn.ProjParm[0]*defn.UOMAngleInDegrees;
+					TIlat1 = defn.ProjParm[2]*defn.UOMAngleInDegrees;
+					TIlat2 = defn.ProjParm[3]*defn.UOMAngleInDegrees;
+					TIlon0 = defn.ProjParm[1]*defn.UOMAngleInDegrees;
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+					TIy0 = TIy0 - 10000000.;
+					TIx0 = TIx0 - 3000000.;
+
+					mProjPars.name = "LambertConformal";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lat0 = TIlat0*TeCDR;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.stlat1 = TIlat1*TeCDR;
+					mProjPars.stlat2 = TIlat2*TeCDR;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+				case CT_Polyconic : 
+					TIlat0 = defn.ProjParm[0];
+					TIlon0 = defn.ProjParm[1];
+					TIScale = defn.ProjParm[4];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+
+					mProjPars.name = "Polyconic";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lat0 = TIlat0*TeCDR;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.scale = TIScale;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+
+				case CT_Equirectangular :
+					TIlat1 = defn.ProjParm[0];
+					TIlon0 = defn.ProjParm[1];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+
+					mProjPars.name = "CylindricalEquidistant";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.stlat1 = TIlat1*TeCDR;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+
+				case CT_PolarStereographic :
+					TIlat0 = defn.ProjParm[0];
+					TIlon0 = defn.ProjParm[1];
+					TIScale = defn.ProjParm[4];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+					
+					mProjPars.name = "PolarStereographic";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lat0 = TIlat0*TeCDR;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.scale = TIScale;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+				case CT_AlbersEqualArea :
+					TIlat1 = defn.ProjParm[0];
+					TIlat2 = defn.ProjParm[1];
+					TIlat0 = defn.ProjParm[2];
+					TIlon0 = defn.ProjParm[3];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+
+					mProjPars.name = "Albers";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lat0 = TIlat0*TeCDR;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					mProjPars.stlat1 = TIlat1*TeCDR;
+					mProjPars.stlat2 = TIlat2*TeCDR;
+
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+				case CT_MillerCylindrical:
+					TIlon0 = defn.ProjParm[1];
+					TIdeltax = defn.ProjParm[5];
+					TIdeltay = defn.ProjParm[6];
+
+					mProjPars.name = "Miller";
+					mProjPars.offx = TIdeltax;
+					mProjPars.offy = TIdeltay;
+					mProjPars.lon0 = TIlon0*TeCDR;
+					if (TIdeltay > 0.1)
+						mProjPars.hemisphere = TeSOUTH_HEM;
+					else
+						mProjPars.hemisphere = TeNORTH_HEM;
+					break;
+				default :
+					mProjPars.name = "NoProjection";
+					break;
+			}
+			mProjPars.datum = mDatum;
+			proj = TeProjectionFactory::make(mProjPars);
+		}
+		if (proj && proj->name() != "NoProjection")
+			isGeoTiff_ = true;
+		params_.projection(proj);
+		delete proj;
+	}
+
+	// try find .tfw file
+	string filename=params_.fileName_;
+	long pos = filename.size() - 3;
+	filename.replace(pos,3,"tfw");
+	DecodeTFW(filename);
+	return isGeoTiff_;
+}
+
+
+bool
+TeDecoderTIFF::DecodeTFW(const string& filename)
+{
+	FILE *fp = fopen(filename.data(),"r");
+	if( fp )
+	{
+		isGeoTiff_ = true;
+		double dxj=0.,dyj=0.,dxi=0.,dyi=0.,x0=0.,y0=0.;
+		char val[40];
+		if( fscanf(fp,"%s",val) )
+			dxj = TeRoundD(atof(val)); // dxJ=resx
+		else
+			isGeoTiff_ = false;
+		if( fscanf(fp,"%s",val) )
+			dyj = TeRoundD(atof(val)); // dyJ
+		else
+			isGeoTiff_ = false;
+		if( fscanf(fp,"%s",val) )
+			dxi = TeRoundD(atof(val)); // dxI 
+		else
+			isGeoTiff_ = false;
+		if( fscanf(fp,"%s",val) )
+			dyi = TeRoundD(atof(val)); // dyI = resy
+		else
+			isGeoTiff_ = false;
+		if( fscanf(fp,"%s",val) )
+			x0 = TeRoundD(atof(val)); // x0
+		else
+			isGeoTiff_ = false;
+		if( fscanf(fp,"%s",val) )
+			y0 = TeRoundD(atof(val)); // y0
+		else
+			isGeoTiff_ = false;
+		fclose(fp);
+
+		if (isGeoTiff_)
+		{
+			params_.resx_ = dxj;
+			params_.resy_ = ABS(dyi);
+
+			if (dxi != 0 || dyj != 0)	
+			{
+				params_.dyJ_ = dyj;
+				params_.dyI_ = dyi;
+				params_.dxI_ = dxi;
+				params_.dxJ_ = dxj;
+				params_.x0_ = x0;
+				params_.y0_ = y0;
+			}
+			else					// there is no rotation or scaling defined
+			{						// uses only box and resolution
+				// double llx = x0; variable not used
+				// double ury = y0; variable not used
+				params_.topLeftResolutionSize(x0,y0,params_.resx_,params_.resy_,params_.ncols_,params_.nlines_,true);
+			}
+		}
+		return true;
+	}
+	return false;
+}
+
+// --- Methods that deal with the internal buffer to store the image in memory
+
+bool 
+TeDecoderTIFF::AllocateBuffer()
+{
+	unsigned long bufsize;
+	int n;
+
+	if (TBufferTile_)
+	{
+		delete []TBufferTile_;
+		TBufferTile_ = 0;
+	}
+	if (TBuffer_)
+	{
+		delete []TBuffer_;
+		TBuffer_ = 0;
+	}
+
+	if (isTiled_)		// we don�t write tiled TIFF
+	{					// let libtigg manage its raw data buffer
+		// allocate a buffer to encode/decode a tile
+		bufsize = bytespertile_;
+		TBufferTile_ = new unsigned char[bytespertile_];
+		if (!TBufferTile_)
+			return false;
+/*		n = TIFFReadBufferSetup(tif,TBufferTile_,bufsize);
+		n = TIFFWriteBufferSetup(tif,TBufferTile_,bufsize);
+*/
+		// allocate a buffer to hold a line of image
+		// a line may be formed by more than one tile
+		TBuffer_ = new unsigned char[bytesperline_];
+		if (!TBuffer_)
+		{
+			delete []TBufferTile_;
+			TBufferTile_ = 0;
+			return false;
+		}
+	}
+	else
+	{
+		if (params_.mode_ == 'r')		// if we are reading let libtiff handle
+		{								// the raw buffer and keeps a copy of each line
+			bufsize = TIFFScanlineSize(tif) * params_.nBands();
+			TBuffer_ = new unsigned char[bufsize];
+			if (!TBuffer_)
+				return false;
+		}
+		else							// if we are writting
+		{								// we control the raw buffer 
+			bufsize = TIFFStripSize(tif);
+			TBuffer_ = new unsigned char[bufsize];
+			if (!TBuffer_)
+				return false;
+			n = TIFFReadBufferSetup(tif,TBuffer_,bufsize);
+			n = TIFFWriteBufferSetup(tif,TBuffer_,bufsize);
+		}
+	}
+	return true;
+}
+
+void 
+TeDecoderTIFF::DeallocateBuffer()
+{
+	if (TBuffer_)
+		delete [] TBuffer_;
+	TBuffer_ = 0;
+
+	if (TBufferTile_)
+		delete [] TBufferTile_;
+	TBufferTile_ = 0;
+}
+
+
+// ---- Internal routines
+bool 
+TeDecoderTIFF::WriteDummyImage()
+{
+	long ssize = TIFFScanlineSize(gtif->gt_tif);
+	unsigned char* obuf = (unsigned char*)_TIFFmalloc(ssize);
+	unsigned char* pp;
+	pp = obuf;
+	if (TImage == RGBIMAGE)	// RGB image
+	{
+		for (int x = 0; x < params_.ncols_; x++) 
+		{
+			if (params_.dataType_[0] == TeFLOAT)			// 32 bits
+			{
+				((float*)obuf)[x] = (float)params_.dummy_[0];
+				((float*)obuf)[x+1] = (float)params_.dummy_[1];
+				((float*)obuf)[x+2] = (float)params_.dummy_[2];
+			}
+			else if (params_.dataType_[0] == TeSHORT)	// 16 bits
+			{
+				((short*)obuf)[x] = (short)params_.dummy_[0];
+				((short*)obuf)[x+1] = (short)params_.dummy_[1];
+				((short*)obuf)[x+2] = (short)params_.dummy_[2];
+			}
+			else											// 8 bits
+			{
+				obuf[x] = (unsigned char)params_.dummy_[0];
+				obuf[x+1] = (unsigned char)params_.dummy_[1];
+				obuf[x+2] = (unsigned char)params_.dummy_[2];
+			}
+		}
+	}
+	else		// Mono or pallete image
+	{
+		for (int x = 0; x < params_.ncols_; x++) 
+		{
+			if (params_.dataType_[0] == TeFLOAT)			// 32 bits
+				((float*)obuf)[x] = (float)params_.dummy_[0];
+			else if (params_.dataType_[0] == TeSHORT)	// 16 bits
+				((short*)obuf)[x] = (short)params_.dummy_[0];
+			else											// 8 bits
+				obuf[x] = (unsigned char)params_.dummy_[0];
+		}
+	}
+
+ 	for (int row=0; row<params_.nlines_; row++)
+	{
+		if (!TIFFWriteScanline(gtif->gt_tif, obuf, row, 0))
+			return false;
+	}
+	TIFFFlushData(gtif->gt_tif);
+	_TIFFfree(obuf);
+	return true;
+}
+
+bool 
+TeDecoderTIFF::ReadMonoImage(unsigned long lin)
+{	
+	if (isTiled_)
+	{
+		if (!ReadTileImageContig(lin,TBuffer_))
+			return false;
+	}
+	else
+	{
+		//int offset = (lin % rowsperstrip_)* bytesperline_;
+		if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+			return false;
+	}
+	return true;
+}
+
+bool
+TeDecoderTIFF::ReadRGBImage (unsigned long lin)
+{
+	if (planar_ == PLANARCONFIG_CONTIG)
+	{
+		if (isTiled_)
+		{
+			if(!ReadTileImageContig(lin,TBuffer_))
+				return false;
+		}
+		else
+		{
+			if (TIFFReadScanline(tif,TBuffer_,lin,0) < 0)
+				return false;
+		}
+	}
+	else	// RGB Separate
+	{
+		if (isTiled_)
+			return false;
+		int s;
+		for (s=0; s < nBands_; s++)
+			if (TIFFReadScanline(tif,&TBuffer_[s*params_.ncols_],lin,s) < 0)
+				return false;
+	}
+	return true;
+}
+
+//		|-   -|     |-                 -|  |-   -|
+//		|  X  |     |   a   b   0   d   |  |  I  |
+//		|     |     |                   |  |     |
+//		|  Y  |     |   e   f   0   h   |  |  J  |
+//		|     |  =  |                   |  |     |
+//		|  Z  |     |   0   0   0   0   |  |  K  |
+//		|     |     |                   |  |     |
+//		|  1  |     |   0   0   0   1   |  |  1  |
+//		|-   -|     |-                 -|  |-   -|
+
+//	Direct transformation
+//		X = a*I + b*j + d
+//		Y = e*I + f*j + h
+
+//	Inverse Transformation
+//		I = [f(X-d) - b(Y-h)) / (af-eb)
+//		J = [e(X-d) - a(Y-h)) / (eb-af)
+//	where
+//	a = transMatrix_[0]
+//	b = transMatrix_[1]
+//	d = transMatrix_[3]
+//	e = transMatrix_[4]
+//	f = transMatrix_[5]
+//	h = transMatrix_[7]
+
+TeCoord2D
+TeDecoderTIFF::index2Coord (TeCoord2D& pt)
+{
+	if (transMatrix_)
+	{
+		double x,y;
+		x = transMatrix_[3] + pt.x()*transMatrix_[0] + pt.y()*transMatrix_[1];
+		y = transMatrix_[7] + pt.x()*transMatrix_[4] - pt.y()*transMatrix_[5];
+		return TeCoord2D(x,y);
+	}
+	else if (tiePoints_)
+	{
+		double x,y;
+		x = tiePoints_[3] + (pt.x() - tiePoints_[0]) * params_.resx_;
+		y = tiePoints_[4] - (pt.y() - tiePoints_[1]) * params_.resy_;
+		return TeCoord2D(x,y);
+	}
+	else
+		return params_.index2Coord (pt);
+}
+
+TeCoord2D
+TeDecoderTIFF::coord2Index (TeCoord2D& pt)
+{
+	if (transMatrix_)
+	{
+		double i,j;
+		double f  = -transMatrix_[5];
+		double af = transMatrix_[0]*f;
+		double eb = transMatrix_[4]*transMatrix_[1];
+		double xd = pt.x() - transMatrix_[3];
+		double yh = pt.y() - transMatrix_[7];
+
+		i = (f*xd - transMatrix_[1]*(yh)) / (af-eb);
+		j = (transMatrix_[4]*xd - transMatrix_[0]*(yh)) / (eb-af);
+
+		return TeCoord2D(i,j);
+	}
+	else if (tiePoints_)
+	{
+		double i,j;
+		i = (pt.x() - tiePoints_[3]) / params_.resx_ + tiePoints_[0];
+		j = (tiePoints_[4] - pt.y()) / params_.resy_ + tiePoints_[1];
+		return TeCoord2D(i,j);
+	}
+	else
+		return params_.coord2Index(pt);
+}
+
+void TeDecoderTIFF::Print()
+{
+	long t = 0L;
+	if(tif)
+		TIFFPrintDirectory(tif,stdout,t);
+}
+
+static long Tiffpow2(short bits)
+{
+	unsigned long ret = 1;
+	unsigned short x;
+	
+	for(x=0; x < bits ; x++)
+		ret *= 2;
+		
+	return ret;
+}
+
+static unsigned short CalculateMask(unsigned short bits)
+{
+	unsigned long ret;
+	ret = Tiffpow2(bits) -1L;
+	return (unsigned short)ret;
+}
+
+static void ShiftAndLoadTo8Bits(unsigned char *ret, unsigned char *buf, short bits, unsigned long col, unsigned short mask)
+{
+	long shift1 = (long) (8 - bits);
+	long shift = shift1;
+	unsigned long y = 0;
+	unsigned long x;
+
+	for(x=0; x < col; x++)
+	{
+		ret[x] = (buf[y] >> shift)&mask;
+		shift -= bits;
+		if( shift < 0 )
+		{
+			shift = shift1;
+			y++;
+		}
+	}	
+}
+
+static void CreateLut(short bits,u_char lut[])
+{
+	u_long 	itens = Tiffpow2(bits);
+	u_long 	x;
+
+	for (x=0; x < itens; x++)
+		lut[x] = (u_char) ( (255L*x)/(itens-1));
+}
+
+void TeDecoderTIFF:: To8Bits(unsigned char* buf,unsigned char *ret,short vmax,short vmin,short nx)
+{
+	if (params_.nbitsperPixel_[0] == 32)
+	{
+		unsigned long aux;
+
+		long j=0;
+		long ls = (long)params_.ncols_*4;
+
+		for (long i=0; i< ls; i+=4)
+		{
+			memcpy(&aux,&buf[i],4);
+	
+			ret[j] = (unsigned char)aux;
+ 			j++;
+		}
+		return;
+	}
+
+	if (params_.nbitsperPixel_[0] == 16)
+	{
+		short aux,aux2,i,j;
+		float div = (float)((vmax-vmin)/255.);
+
+		j=0;
+
+		for (i=0; i<nx*2; i+=2)
+		{
+			memcpy(&aux,&buf[i],2);
+	
+			aux2 = (short) ((float)(aux-vmin) /div);
+			ret[j] = (unsigned char)aux2;
+ 			j++;
+		}
+		return;
+	}
+
+	if ( params_.nbitsperPixel_[0] == 8 )
+	{
+		memcpy(ret,buf,params_.ncols_);
+		return;
+	}
+
+	if( first )
+	{
+		mask = CalculateMask(params_.nbitsperPixel_[0]);
+		CreateLut(params_.nbitsperPixel_[0],Lut);
+		first = 0;
+	}
+	
+	ShiftAndLoadTo8Bits(ret,buf,params_.nbitsperPixel_[0],params_.ncols_,mask);
+	unsigned long x;
+	for(x=0; x < (unsigned long)params_.ncols_; x++)
+	{
+		ret[x] = Lut[ret[x]];
+	}
+}
+
+// --- Tile Functions ---/
+bool 
+TeDecoderTIFF::ReadTileImageContig(unsigned long lin, unsigned char *line)
+{
+	unsigned long offset = lin%tileh_;
+	unsigned long col, i, nbytes;	
+	for (col=0; col < (unsigned long)params_.ncols_; col += tilew_)
+	{
+		if (TIFFReadTile(tif, TBufferTile_, col, lin, 0, 0) < 0 )
+			return false;
+		nbytes = params_.nbitsperPixel_[0]/8;
+		if (col + tilew_ > (unsigned long)params_.ncols_ )
+		{
+			unsigned long diff = params_.ncols_-col;
+			for (i=0; i < diff*nbytes; i++)
+				line[i+col] = TBufferTile_[i+offset*rowtilesize_];
+		}
+		else
+		{
+			for (i=0; i < tilew_*nbytes; i++)
+				line[col+i] = TBufferTile_[i+offset*rowtilesize_];
+		}
+	}
+	return true;
+}
+
+// --- To read and set a LUT table ---
+
+static int checkmap(int n, unsigned short *r, unsigned short *g, unsigned short *b,long val)
+{
+    while (n-- >= 0)
+		if (*r++ > val || *g++ > val || *b++ > val)
+			return (16);
+    return (8);
+}
+
+static unsigned short CVT1 (unsigned long x,long value)	//CVT is used in DEC station
+{
+	unsigned long den = (1L << 16) -1L;
+	unsigned short num = (unsigned short)((x*value)/den); // normalize lut value
+	return num;
+}
+
+bool
+TeDecoderTIFF::ReadLut()
+{
+	unsigned short *rmap,*gmap,*bmap;
+	if (!TIFFGetField(tif, TIFFTAG_COLORMAP, &rmap, &gmap, &bmap))
+		return false;
+	
+	int range = (1 << params_.nbitsperPixel_[0])-1;
+	int x;
+	long val = (long)pow(2.,params_.nbitsperPixel_[0]) - 1;
+	params_.setNumberPalleteEntries(range);
+	if (checkmap (range,rmap,gmap,bmap,val) == 16)
+	{
+		for(x = range; x >= 0; x--)
+		{
+			params_.lutr_[x] = CVT1(rmap[x],val); 
+			params_.lutg_[x] = CVT1(gmap[x],val);
+			params_.lutb_[x] = CVT1(bmap[x],val);
+		}
+	}
+	else
+	{
+		for(x = range; x >= 0; x--)
+		{
+			params_.lutr_[x] = rmap[x];
+			params_.lutg_[x] = gmap[x];
+			params_.lutb_[x] = bmap[x];
+		}
+	}
+	return true;
+}
+
+void
+TeDecoderTIFF::SaveLut()
+{
+	if (!tif)
+		return;
+
+	int nentries = params_.lutr_.size();
+	if (nentries <= 0) 
+		return;
+
+	unsigned short* lutr = new unsigned short[nentries];
+	unsigned short* lutg = new unsigned short[nentries];
+	unsigned short* lutb = new unsigned short[nentries];
+
+	for (int i=0; i<nentries; i++)
+	{
+		lutr[i] = params_.lutr_[i]*255;
+		lutg[i] = params_.lutg_[i]*255;
+		lutb[i] = params_.lutb_[i]*255;
+	}
+	TIFFSetField(tif, TIFFTAG_COLORMAP,lutr,lutg,lutb);
+}
diff --git a/src/terralib/kernel/TeDecoderTIFF.h b/src/terralib/kernel/TeDecoderTIFF.h
new file mode 100644
index 0000000..b8e3e85
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderTIFF.h
@@ -0,0 +1,205 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderTIFF.h
+    This file contais functions to deal with raster images in Tiff/GeoTIFF format.
+*/
+
+#ifndef  __TERRALIB_INTERNAL_DECODERTIFF_H
+#define  __TERRALIB_INTERNAL_DECODERTIFF_H
+
+// LibTIFF includes
+#include "geotiff.h"
+#include "xtiffio.h"
+#include "geo_normalize.h"
+#include "geovalues.h"
+#include "tiffiop.h"
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+
+#include <iostream>
+#include <stdio.h>
+#include <sys/types.h>
+
+#include "TeDecoderVirtualMemory.h"
+
+#include <map>
+using namespace std;
+
+#define MONOIMAGE	0	/* Image type monochrome */
+#define RGBIMAGE	1	/* Image type color image */
+#define PALLETEIMAGE 2  /* Image type pallete image */
+
+
+//! Implements a decoder to a raster in TIFF (Tagged Image File Format) format
+/*!
+	Decoder TIFF is based on geotiff libray (http://remotesensing.org/geotiff/geotiff.html).
+	This imposes some restrictions to this decoder. Using libtiff TIFF image files may not 
+	be opened for both reading and writing; there is no support for altering the contents of 
+	a TIFF file. So this decoder is limited to create new tiff files or to read existing ones.
+*/
+class TeDecoderTIFF : public TeDecoder
+{
+	TIFF 	*tif;       // TIFF directory structure
+	GTIF	*gtif;		// GEOTIFF directory structure
+
+	unsigned char  *TBuffer_;
+	unsigned char  *TBufferTile_;
+
+	bool			isGeoTiff_;	// flag that indicates georeference
+	bool			isTiled_;	// flag indicating if image is tiled
+	unsigned short	photom_;    // photometric interpretation
+	unsigned short	planar_;	// storage organization : PLANARCONFIG_CONTIG or PLANARCONFIG_SEPARATE
+	unsigned short	compress_;	// compression flag: COMPRESSION_NONE, COMPRESSION_CCITTRLE, COMPRESSION_CCITTFAX3 and others
+	short 			TImage;	    // MONOIMAGE, RGBIMAGE, PALLETE 
+	int				nBands_;	// number of bands
+	int				nbitsperpixel_;
+	unsigned long	bytesperline_;
+	unsigned long	tilew_,tileh_;
+	unsigned long	rowtilesize_;
+	unsigned long	bytespertile_;
+	unsigned long	rowsperstrip_;
+	int				TCurLine_;		// current line in memory
+	int				TCurTile_;		// current tile in memory
+
+
+	bool first;				// Flag to test the first access to To8Bits() function
+    unsigned char Lut[256];	// Lut to convert nbits/pixel to 8bits/pixel
+	unsigned short mask;	// mask bits 0000...1 for 1 bit
+							// 000.1111 for 2 bits and on
+
+	double *transMatrix_;
+	double *pixelScale_;
+	double *tiePoints_;
+
+ 
+	// if PHOTOMETRIC_YCBCR:	
+	float 	*YCbCrCoeffs,	*refBlackWhite;	// Chrominance coefficients
+	unsigned short YCbCrHorizSampling,		// Horizontal Smapling
+		           YCbCrVertSampling;		// Vertical and
+													
+													
+
+
+	//!	Reads TIFF Directory and fills tif structure
+	void ReadTiffDirectory();
+
+	//! Reads the georeferencing keys of a geotiff data
+	bool GetGeoTIFF ();
+
+	//! Reads and inteprets a .tfw file associated to a tiff
+	bool DecodeTFW(const string& filename);
+
+	//! Sets the georeferencing keys of a geotiff data
+	void SetGeoKeys();
+
+	//! Write a dummy image (when creating a tiff file)
+	bool WriteDummyImage();
+
+	//!	Reads a line of monochrome image
+	/*!		\param buf image
+			\param lin line number to read
+			\return true if line is secessfully read and false otherwise
+	*/
+	bool ReadMonoImage(unsigned long lin);
+
+	//!	Reads a line of color image
+	/*!		\param lin line number to read
+			\return true if line is secessfully read and false otherwise
+	*/
+	bool ReadRGBImage(unsigned long lin);
+
+	//!	Reads color image if planar = PLANARCONFIG_CONTIG
+	/*!		\param lin line number to read
+			\return non 0 if line is secessfully written and 0 otherwise
+	*/
+	bool ReadRGBContig(unsigned long lin);
+
+	//!	Reads color image if planar = PHOTOMETRIC_PALETTE
+	/*!		\param lin line number to read
+			\return non 0 if line is secessfully written and 0 otherwise
+	*/
+	bool ReadPaletteContig(unsigned long lin);
+
+	bool ReadTileImageContig(unsigned long lin, unsigned char *line);
+
+	//!	Allocates the internal buffers
+	bool AllocateBuffer();
+
+	//!	Allocates the internal buffers
+	void DeallocateBuffer();
+
+	//!	Reads Lut associated to a raster pallete
+	bool ReadLut();
+
+	//!	Saves the associated LUT for pallete raster 
+	void SaveLut();
+
+	//! Converts buf to 8 bits per pixel into ret buffer
+	//		Input:
+	//			buf - a line of image stored in TIFF
+	//		Output:
+	//			ret - image line converted to 8 bits per pixel
+	//		Preconditions:
+	//			image line buffer (ret) must be allocated
+	//			previously before call this function
+	void To8Bits(u_char *buf,u_char *ret,short vmax=0, short vmin = 0,short nx=0);
+
+	//!	Prints to standard output contents of TIFF directory
+	void Print();
+	
+	//	Returns true if tiff data is compressed
+	bool IsCompressed() { return compress_ != COMPRESSION_NONE; }
+
+public:
+
+	//! Construtor from parameters 
+	TeDecoderTIFF( const TeRasterParams& );
+
+	//!	Normal destructor
+	~TeDecoderTIFF();
+
+	//! Initializes raster structure
+	void init();
+
+	//! Clear internal parameters
+	bool clear();
+
+	TeCoord2D index2Coord (TeCoord2D& pt);
+	TeCoord2D coord2Index (TeCoord2D& pt);
+
+	bool setElement (int col,int lin, double val, int band=0);
+	bool getElement (int col,int lin, double &val,int band=0);
+};
+
+//! Implements a tiff decoder factory
+class TeDecoderTIFFFactory : public TeDecoderFactory
+{
+public:
+
+	TeDecoderTIFFFactory(const string& name) : TeDecoderFactory(name) {}
+
+	virtual TeDecoder* build (const TeRasterParams& arg)
+	{  return new TeDecoderTIFF(arg); }
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDecoderVirtualMemory.cpp b/src/terralib/kernel/TeDecoderVirtualMemory.cpp
new file mode 100644
index 0000000..fa52431
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderVirtualMemory.cpp
@@ -0,0 +1,442 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeDecoderVirtualMemory.h>
+
+//! Destructor
+TeMemoryPage::~TeMemoryPage()
+{
+	if (this->data_ != 0)
+	{
+		switch (dataType_)
+		{
+		case (TeUNSIGNEDCHAR):
+			delete [](unsigned char*)data_;
+			break;
+		case (TeCHAR) :
+			delete (char*)data_;
+			break;
+		case (TeUNSIGNEDSHORT):
+			delete [](unsigned short*)data_;
+			break;
+		case (TeSHORT):
+			delete (short*) data_;
+			break;
+		case (TeUNSIGNEDLONG):
+			delete [](unsigned long*)data_;
+			break;
+		case (TeLONG):
+			delete [](long*) data_;
+			break;
+		case (TeFLOAT):
+			delete [](float*)data_;
+			break;
+		case (TeDOUBLE):
+			delete [](double*) data_;
+			break;
+		default:
+			break;
+		}
+		data_ = 0;
+	}
+}
+
+TeMemoryPage::TeMemoryPage(unsigned long size, double defValue, TeDataType dataType):
+		used_(false),
+		size_(size),
+		defValue_(defValue),
+		dataType_(dataType)
+{
+	data_ = 0;
+	try 
+	{
+		unsigned int i;
+		// Try to allocate the necessary memory
+		switch (dataType_) {
+		case (TeUNSIGNEDCHAR):
+			data_ = new unsigned char [size_];
+			for (i=0;i<size;((unsigned char*)data_)[i]=(unsigned char) defValue_,i++);
+			break;
+		case (TeCHAR) :
+			data_ = new char [size_];
+			for (i=0;i<size;((char*)data_)[i]=(char) defValue_,i++);
+			break;
+		case (TeUNSIGNEDSHORT):
+			data_ = new unsigned short [size_];
+			for (i=0;i<size;((unsigned short*)data_)[i]= (unsigned short) defValue_,i++);
+			break;
+		case (TeSHORT):
+			data_ = new short [size_];
+			for (i=0;i<size;((short*)data_)[i]=(short)defValue_,i++);
+			break;
+		case (TeUNSIGNEDLONG):
+			data_ = new unsigned long [size_];
+			for (i=0;i<size;((unsigned long*)data_)[i]=(unsigned long)defValue_,i++);
+			break;
+		case (TeLONG):
+			data_ = new long [size_];
+			for (i=0;i<size;((long*)data_)[i]=(long)defValue_,i++);
+			break;
+		case (TeFLOAT):
+			data_ = new float [size_];
+			for (i=0;i<size;((float*)data_)[i]=(float)defValue_,i++);
+			break;
+		case (TeDOUBLE):
+			data_ = new double [size_];
+			for (i=0;i<size;((double*)data_)[i]=(double)defValue_,i++);
+			break;
+		default:
+			break;
+		}
+	}
+	catch (...)
+	{
+	}
+}
+
+void
+TeMemoryPage::clear()
+{	
+	unsigned int i;
+	switch (dataType_) 
+	{
+	case (TeUNSIGNEDCHAR):
+		for (i=0;i<size_;((unsigned char*)data_)[i]=(unsigned char) defValue_,i++);
+		break;
+	case (TeCHAR) :
+		for (i=0;i<size_;((char*)data_)[i]=(char) defValue_,i++);
+		break;
+	case (TeUNSIGNEDSHORT):
+		for (i=0;i<size_;((unsigned short*)data_)[i]= (unsigned short) defValue_,i++);
+		break;
+	case (TeSHORT):
+		for (i=0;i<size_;((short*)data_)[i]=(short)defValue_,i++);
+		break;
+	case (TeUNSIGNEDLONG):
+		for (i=0;i<size_;((unsigned long*)data_)[i]=(unsigned long)defValue_,i++);
+		break;
+	case (TeLONG):
+		for (i=0;i<size_;((long*)data_)[i]=(long)defValue_,i++);
+		break;
+	case (TeFLOAT):
+		for (i=0;i<size_;((float*)data_)[i]=(float)defValue_,i++);
+		break;
+	case (TeDOUBLE):
+		for (i=0;i<size_;((double*)data_)[i]=(double)defValue_,i++);
+		break;
+	default:
+		break;
+	}
+}
+
+long
+TeMemoryPage::pageSize()
+{
+	long s;
+	switch (dataType_) 
+	{
+	case (TeCHAR) :
+		s = size_*sizeof(char);
+		break;
+	case (TeUNSIGNEDSHORT):
+		s = size_*sizeof(unsigned short);
+		break;
+	case (TeSHORT):
+		s = size_*sizeof(short);
+		break;
+	case (TeUNSIGNEDLONG):
+		s = size_*sizeof(unsigned long);
+		break;
+	case (TeLONG):
+		s = size_*sizeof(long);
+		break;
+	case (TeFLOAT):
+		s = size_*sizeof(float);
+		break;
+	case (TeDOUBLE):
+		s = size_*sizeof(double);
+		break;
+	default:
+		s = size_*sizeof(unsigned char);
+	}
+	return s;
+}
+
+double 
+TeMemoryPage::getVal(int col,int lin, int nCols)
+{
+	unsigned long offset = (lin-ulLin_)*nCols+(col-ulCol_);
+	double val = defValue_;
+	if (offset < size_) // solucao temporaria, rever
+	{
+		switch (dataType_) 
+		{
+		case (TeUNSIGNEDCHAR):
+			val = ((unsigned char*)data_)[offset];
+			break;
+		case (TeCHAR) :
+			val = ((char*) data_)[offset];
+			break;
+		case (TeUNSIGNEDSHORT):
+			val = ((unsigned short*)data_)[offset];
+			break;
+		case (TeSHORT):
+			val = ((short*)data_)[offset];
+			break;
+		case (TeUNSIGNEDLONG):
+			val = ((unsigned long*)data_)[offset];
+			break;
+		case (TeLONG):
+			val = ((long*)data_)[offset];
+			break;
+		case (TeFLOAT):
+			val = ((float*)data_)[offset];
+			break;
+		case (TeDOUBLE):
+			val = ((double*)data_)[offset];
+			break;
+		default:
+			break;
+		}
+	}
+	return val;
+}
+
+void 
+TeMemoryPage::setVal(int col,int lin,int nCols, double val)
+{
+	unsigned long offset = (lin-ulLin_)*nCols+(col-ulCol_);
+	if (offset < size_) 
+	{
+		switch (dataType_) 
+		{
+		case (TeUNSIGNEDCHAR):
+			((unsigned char*)data_)[offset] = (unsigned char) val;
+			break;
+		
+		case (TeCHAR) :
+			((char*) data_)[offset] = (char) val;
+			break;
+		
+		case (TeUNSIGNEDSHORT):
+			((unsigned short*)data_)[offset] = (unsigned short) val;
+			break;
+		
+		case (TeSHORT):
+			((short*)data_)[offset] = (short) val;
+			break;
+		
+		case (TeUNSIGNEDLONG):
+			((unsigned long*)data_)[offset] = (unsigned long) val;
+			break;
+		
+		case (TeLONG):
+			((long*)data_)[offset] = (long) val;
+			break;
+		
+		case (TeFLOAT):
+			((float*)data_)[offset] = (float) val;
+			break;
+		
+		case (TeDOUBLE):
+			((double*)data_)[offset] = val;
+
+		default:
+			break;
+		}
+	}
+	return;
+}
+
+TeDecoderVirtualMemory::TeDecoderVirtualMemory( const TeRasterParams& par)
+{
+	params_ = par;
+}
+
+TeDecoderVirtualMemory::~TeDecoderVirtualMemory()
+{
+	if (!pagesQueue_.empty())
+		TeDecoderVirtualMemory::clear();
+}
+
+bool
+TeDecoderVirtualMemory::getElement(int col,int lin, double &val,int band)
+{
+	// identify the page has the pixel (col,lin,band)
+	string index = codifyId(col,lin,band,1,0);
+	TeMemoryPage* block = 0;
+
+//	int nt = params_.nTilesInMemory_;
+
+	// check band cache first
+	if (indexCache_[band] == index)
+		block = pageCache_[band];
+	else
+	{
+		// check if page is already in memory
+		MapMemoryPageIterator p = virtualMemory_.find(index);
+		if (p != virtualMemory_.end())
+		{
+			// use it
+			 block = p->second;
+		}
+		else
+		{
+			// page is not in memory
+			// check whether there is space in memory to bring another page
+			if (virtualMemory_.size() >= (unsigned int)params_.nTilesInMemory_)
+			{
+				// FIFO strategy: replace the oldest page in memory
+				string first = pagesQueue_.front();
+				pagesQueue_.pop();
+				p = virtualMemory_.find(first); 
+				if (p != virtualMemory_.end())
+				{
+					block = p->second;
+					if (block->used_)
+						putRasterBlock(first,block->data_,block->pageSize());
+					block->clear();				// reuse the allocated memory
+					virtualMemory_.erase(first);
+				}
+			}
+			else
+				// bring the page to memory
+				block = new TeMemoryPage(params_.blockHeight_*params_.blockWidth_, params_.dummy_[band],params_.dataType_[band]);
+
+			virtualMemory_.insert(MapMemoryPage::value_type(index,block));
+			pagesQueue_.push(index);
+			int ulLin=0, ulCol=0;
+			getRasterBlock(index,block->data_,ulCol,ulLin);
+			block->ulLin_ = ulLin;
+			block->ulCol_ = ulCol;
+		}
+		indexCache_[band] = index;
+		pageCache_[band] = block;
+	}
+	val = block->getVal(col,lin,params_.blockWidth_);
+	return true;
+}
+
+bool
+TeDecoderVirtualMemory::setElement(int col, int lin, double val,int band)
+{
+	string index = codifyId(col,lin,band,1,0);
+
+	TeMemoryPage* block = 0;
+
+	// check band cache first
+	if (indexCache_[band] == index)
+		block = pageCache_[band];
+	else
+	{
+		MapMemoryPageIterator p = virtualMemory_.find(index);
+		if (p != virtualMemory_.end())
+		{
+			 block = p->second;
+		}
+		else
+		{
+			if (virtualMemory_.size() >= (unsigned int)params_.nTilesInMemory_)
+			{
+				string first = pagesQueue_.front();
+				pagesQueue_.pop();
+				p = virtualMemory_.find(first);
+				if (p != virtualMemory_.end())
+				{
+					block = p->second;
+					if (block->used_ == true)
+					{
+						putRasterBlock(first,block->data_,block->pageSize());
+					}
+					block->clear();
+					virtualMemory_.erase(first);
+				}
+			}
+			else
+				block = new TeMemoryPage(params_.blockHeight_*params_.blockWidth_, params_.dummy_[band],params_.dataType_[band]);
+			virtualMemory_.insert(MapMemoryPage::value_type(index,block));
+			pagesQueue_.push(index);
+			int ulLin=0, ulCol=0;
+			getRasterBlock(index,block->data_,ulCol,ulLin);
+			block->ulLin_ = ulLin;
+			block->ulCol_ = ulCol;
+		}
+		indexCache_[band] = index;
+		pageCache_[band] = block;
+	}
+	block->setVal(col,lin,params_.blockWidth_,val);
+	block->used_ = true;
+	return true;
+}
+
+
+/*bool
+TeDecoderVirtualMemory::create()
+{
+	clear();
+	if ( params_.nTilesInMemory_ == 0 )
+		params_.nTilesInMemory_ = params_.nBands() * (params_.ncols_ / params_.blockWidth_+1) ;
+	pageCache_.resize(params_.nBands(),0);
+	indexCache_.resize(params_.nBands(),"");
+	return true;
+}
+*/
+void
+TeDecoderVirtualMemory::init()
+{
+	TeDecoderVirtualMemory::clear();
+	if ( params_.nTilesInMemory_ == 0 )
+		params_.nTilesInMemory_ = params_.nBands() * (params_.ncols_ / params_.blockWidth_+1) ;
+	pageCache_.resize(params_.nBands(),0);
+	indexCache_.resize(params_.nBands(),"");
+}
+
+bool
+TeDecoderVirtualMemory::clear()
+{
+	TeMemoryPage* block;
+	string index;
+
+	MapMemoryPageIterator p;
+
+	while (!pagesQueue_.empty() )
+	{
+		index = pagesQueue_.front();
+		pagesQueue_.pop();
+		p = virtualMemory_.find(index);
+		if (p != virtualMemory_.end())
+		{
+			block = p->second;
+			if (block->used_)
+			{
+				putRasterBlock(index,block->data_,block->pageSize());
+			}
+			delete block;
+			virtualMemory_.erase(index);
+		}
+	}
+	indexCache_.clear();
+	pageCache_.clear();
+	return true;
+}
+
diff --git a/src/terralib/kernel/TeDecoderVirtualMemory.h b/src/terralib/kernel/TeDecoderVirtualMemory.h
new file mode 100644
index 0000000..5e7ad69
--- /dev/null
+++ b/src/terralib/kernel/TeDecoderVirtualMemory.h
@@ -0,0 +1,196 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDecoderVirtualMemory.h
+    This file supports a virtual memory strategy to deal whith raster structures
+*/
+#ifndef  __TERRALIB_INTERNAL_DECODERVIRTUALMEMORY_H
+#define  __TERRALIB_INTERNAL_DECODERVIRTUALMEMORY_H
+
+#include "TeDecoder.h"
+
+#include <queue>
+#include <vector>
+using namespace std;
+
+//! A page of memory
+class TeMemoryPage
+{
+public:
+	void*   data_;			//<! Pointer to the data in memory
+	bool	used_;			//<! Flag that indicate if the page was modified in memory
+	unsigned long size_;	//<! Page number of elements
+
+	int ulLin_;				//<! Line index of the upper-left corner
+	int ulCol_;				//<! Column index of the upper-left corner
+	double   defValue_;		//<! Default value (fo initially fill the page)
+	TeDataType dataType_;	//<! Pixel data type
+
+	//! Constructor
+	TeMemoryPage(unsigned long size, double defValue, TeDataType dataType = TeDOUBLE);
+	
+	//! Destructor
+	~TeMemoryPage();
+
+	//! Copy constructor
+	TeMemoryPage(const TeMemoryPage& rhs)
+	{
+		if (this != &rhs)
+		{
+			data_ = rhs.data_;
+			used_ = rhs.used_;
+			defValue_ = rhs.defValue_;
+			dataType_ = rhs.dataType_;
+		}
+	}
+	
+	//! Operator =
+	TeMemoryPage& operator=(const TeMemoryPage& rhs)
+	{
+		data_ = rhs.data_;
+		used_ = rhs.used_;
+		size_ = rhs.size_;
+		defValue_ = rhs.defValue_;
+		dataType_ = rhs.dataType_;
+		return *this;
+	}
+
+	//! Returns the value of on position within the block
+	/*
+		\par col column identifier of the position
+		\par lin line identifier of the position
+		\par nCols number of columns per line of the block
+		\returns the value of the position indicated by (col x lin)
+	*/
+	double getVal(int col,int lin, int nCols);
+
+	//! Sets the value of a position within the block
+	/*
+		\par col column identifier of the position
+		\par lin line identifier of the position
+		\par nCols number of columns per line of the block
+		\par val the value to be put in the position
+	*/
+	void setVal(int col,int lin,int nCols, double val);
+
+	//! Set all positions of the page to the default value;
+	void clear();
+
+	//! Returns the physical size of a memory page
+	long pageSize();
+};
+
+//! A map of string identifiers to pointer to memory pages 
+typedef map<string,TeMemoryPage*> MapMemoryPage;
+
+//! A const iterator to a map of pages
+typedef map<string,TeMemoryPage*>::const_iterator MapMemoryPageIterator;
+
+//! Implements a virtual memory strategy to decode raster in blocks
+/*
+	It should be used as a parent class of decoder that access raster
+	blocks from a physical storage
+*/
+class TeDecoderVirtualMemory: public TeDecoder
+{
+public:
+
+	//! Empty constructor
+	TeDecoderVirtualMemory() {};
+	
+	//! Constructor from paramenters
+	TeDecoderVirtualMemory( const TeRasterParams& par);
+
+	//! Destructor
+	~TeDecoderVirtualMemory();
+
+	//! Saves a raster tile from a virtual memory to permanent storage
+	/*! 
+	    \param index tile unique identifier 
+		\param buf pointer to a raster tile in memory
+		\param bsize block size
+	*/	
+	virtual bool putRasterBlock(const string& index, void *buf, long bsize) = 0;
+
+	//! Gets the raster block with index identifier
+	/*!
+		\param index tile unique identifier
+		\param buf pointer to a raster tile in memory
+		\param ulCol returns the column index of the upper-left corner of the block
+		\param ulLin returns the column index of the upper-left corner of the block
+	*/
+	virtual bool getRasterBlock(const string& index, void *buf, int&  ulCol, int&  ulLin) = 0;
+
+	//! Codifies the unique identifier of the raster block that contains a certain pixel
+	/*!
+		\param col column number
+		\param lin  pixel line number
+		\param band pixel band 
+		\param res pixel resolution factor
+		\param subb pixel sub band information
+		\return block unique identifier
+	*/
+	virtual string	codifyId(int col, int lin, int band, int res, int subb) = 0;
+
+	//! Decodifies a block unique identifier to get some block information
+	/*!
+		\param index block unique identifier
+		\param col returns the column number of the upper-left corner of the block
+		\param lin returns the line number of the upper-left corner of the block
+		\param band returns the band id block
+		\param res returns the resolution factor of the block
+		\param subb returns the sub band information of the block
+	*/	
+	virtual void decodifyId(const string& index, int& col, int& lin, int& band, int& res, int& subb) = 0;
+
+	//! Sets the value of a specific raster pixel 
+	/*!
+		\param col pixel column identifier
+		\param lin pixel line identifier
+		\param val pixel value being inserted
+		\param band pixel band identifier
+	*/
+	bool getElement(int col,int lin, double &val,int band);
+
+	//! Gets an specific element (col, lin, band) of a raster data
+	/*!
+		\param col pixel column identifier
+		\param lin pixel line identifier
+		\param val pixel value being retrieved
+		\param band pixel band identifier
+	*/
+	bool setElement(int col, int lin, double val,int band);
+
+	//! Initializes the internal structures of the decoder, from its raster parameters structure.
+	void init();
+
+	//! Clears  the decoder internal structures
+	bool clear();
+
+private:
+	MapMemoryPage virtualMemory_;
+	queue<string> pagesQueue_;
+	vector<string> indexCache_;
+	vector<TeMemoryPage*> pageCache_;
+};
+
+#endif
diff --git a/src/terralib/kernel/TeDefines.h b/src/terralib/kernel/TeDefines.h
new file mode 100644
index 0000000..11f5044
--- /dev/null
+++ b/src/terralib/kernel/TeDefines.h
@@ -0,0 +1,85 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeDefines.h
+    Provides a set of general definitions used by Terralib
+*/
+#ifndef  __TERRALIB_INTERNAL_DEFINES_H
+#define  __TERRALIB_INTERNAL_DEFINES_H
+
+const int		TeNAME_LENGTH = 400;				//<! A default name lenght
+const double	TeMAXFLOAT =	3.4E37;				//<! Maximum float value
+const double	TeMINFLOAT =	3.4E-37;			//<! Minimum float value
+const double	TePI  =	3.14159265358979323846;		//<! The ratio of the circumference to the diameter of a circle
+const double	TeCDR =	0.01745329251994329576;		//<! Conversion factor: degrees to radians
+const double	TeCRD = 57.29577951308232087679;	//<!Conversion factor: radians to degrees
+
+
+// General position definitions
+#define	TeUNKNOWNPOSITION  0
+#define	TeINSIDE		   1
+#define	TeOUTSIDE		   2
+#define	TeBOUNDARY		   4
+
+
+// Intersection type
+#define TeINTERIORINTERIOR 8
+#define TeINTERIORBOUNDARY 16
+#define TeINTERIOREXTERIOR 32
+#define TeBOUNDARYINTERIOR 64
+#define TeBOUNDARYBOUNDARY 128
+#define TeBOUNDARYEXTERIOR 256
+#define TeEXTERIORINTERIOR 512
+#define TeEXTERIORBOUNDARY 1024
+#define TeEXTERIOREXTERIOR 2048
+
+// Segment intersection
+#define TeDONT_INTERSECT 0
+#define TeDO_INTERSECT   1
+//#define TeCOLLINEAR      2
+#define TeAT_ENDPOINT    4
+
+#ifndef MAX
+#define MAX(a,b) a>b?a:b
+#endif
+
+#ifndef MIN
+#define MIN(a,b) a<b?a:b
+#endif
+
+#ifndef ABS
+#define ABS(x) 	( ((x) >= 0) ? (x) : -(x) )
+#endif
+
+// Orientation
+#define TeNOTURN			 0
+#define TeCOLLINEAR			 0
+#define TeCLOCKWISE   		-1
+#define TeCOUNTERCLOCKWISE	 1
+
+// Operation
+#define TeDIFFERENCE   1
+#define TeUNION        2
+#define TeINTERSECTION 4
+
+#endif
+
diff --git a/src/terralib/kernel/TeErrorLog.cpp b/src/terralib/kernel/TeErrorLog.cpp
new file mode 100644
index 0000000..fae26f2
--- /dev/null
+++ b/src/terralib/kernel/TeErrorLog.cpp
@@ -0,0 +1,171 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeErrorLog.h"
+#include "TeAsciiFile.h"
+#include "TeUtils.h"
+
+TeErrorLog::TeErrorLog():logFile_ ( 0 )
+{
+	errorMessage_ [ LOG_MESSAGE             ] = "Message ";
+
+	errorMessage_ [ EMPTY_FILE_NAME         ] = "Empty File Name";
+	errorMessage_ [ CANNOT_OPEN_FILE        ] = "Could Not Open File";
+    errorMessage_ [ CANNOT_READ_FILE		] = "Could Not Read File";
+    errorMessage_ [ CANNOT_WRITE_FILE   	] = "Could Not Write File";
+    errorMessage_ [ CANNOT_CLOSE_FILE		] = "Could Not Close File";
+    errorMessage_ [ END_OF_FILE_REACHED 	] = "End of File Reached";
+
+
+// Errors associated with projection
+
+    errorMessage_ [  DATUM_ERROR              ] = "Error when creating Datum";
+    errorMessage_ [  PROJECTION_NOT_AVAILABLE ] = "Projection not available in TerraLib";
+
+// Error codes for MIF files
+    errorMessage_ [   NOT_MIF_FILE			] = "Not a MIF File";
+    errorMessage_ [   MIF_REGION_CLOSE		] = "Error - MIF Region is not Closed";
+    errorMessage_ [   MIF_CONVERSION_ERROR	] = "Error during conversion of MIF data";
+    errorMessage_ [   NOT_CSV               ] = "Data not separated by commas";
+    errorMessage_ [   NOT_ENOUGH_ROWS       ] = "Less rows in MID file than regions in MIF file";
+    errorMessage_ [   NOT_POLYGON_FILE		] = "Not a polygon (planar areas) file";
+    errorMessage_ [   PLINE_ERROR			] = "Wrongly defined PLINE attribute"; 
+    errorMessage_ [   NO_DTM_QUOTE_VALUE    ] = "Unable to define an attribute as a DTM quote file";
+
+// Error Codes for shapefiles
+    errorMessage_ [  POLYSHAPE_IS_NOT_RING  ] = "Shape PolyShape is not a ring";
+    errorMessage_ [  UNHANDLED_SHP_TYPE     ] = "Shape type unhandled currently";
+
+// Error Codes for DBF files
+
+    errorMessage_ [  UNABLE_TO_OPEN_DBF_FILE  ] = "Unable to Open DBF file";
+    errorMessage_ [  NO_DATA_IN_DBF_FILE      ] = "No Data in DBF File";
+    errorMessage_ [  ATTRIBUTE_INDEX_MISMATCH ] = "Mismatch between attribute index and number of geometries";
+
+// Error codes for E00 Files
+    errorMessage_ [  NOT_E00_FILE            ] = "Not an E00 File";
+
+// Error codes for algorithms
+    errorMessage_ [  CENTROID_NOT_FOUND   ] = "Could not find centroid of a polygon";
+    errorMessage_ [  REGIONS_WITH_HOLES   ] = "Problems in regions with holes";
+    errorMessage_ [  LINE_IS_NOT_RING	  ] = "Tried to a create a ring from a non-closed line";
+
+// Error codes for tables
+
+    errorMessage_ [  ROW_MISMATCH		  ] = "Unable to insert a row into a table (attribute mismatch)";
+    errorMessage_ [  NO_SUCH_ATTRIBUTE    ] = "Attribute does not exist in the table";
+
+	// Error codes for Raster stuff
+    errorMessage_ [  UNKNOWN_DECODER_TECHNOLOGY_TYPE ] = "Decoder technology not specified";
+    errorMessage_ [  UNKNOWN_RASTER_FORMAT	         ] = "Raster format not supported";
+
+	// Error codes for layer stuff
+	errorMessage_ [  GEOMETRY_REPRESENTATION_MISMATCH ] = "Geometry representation has not been created";
+
+	errorMessage_ [  UNKNOWN_ERROR_TYPE ] = "";
+}
+
+TeErrorLog::~TeErrorLog()
+{
+	if ( logFile_ != 0 )
+		delete logFile_;
+}
+string
+TeErrorLog::message( const TeErrorType msgCode )
+{
+	// find the message associated to the errorcode
+	map <TeErrorType, string>::iterator it = errorMessage_.find ( msgCode );
+	if ( it != errorMessage_.end()  )
+		return (*it).second;
+	else
+		return errorMessage_ [ UNKNOWN_ERROR_TYPE ];
+}
+
+void
+TeErrorLog::insert ( TeErrorType code, const string& msg )
+{
+	// create a new logfile, if needed
+	if ( logFile_  == 0 )
+		//logFile_ = new TeAsciiFile ( "terralib.err", "rw" );
+		return;
+
+	string log = errorMessage_ [ code ] + " " + msg;
+	logFile_->writeString ( log );
+
+	// increment the count associated to this error type
+	map<TeErrorType, int>::iterator it = errorLog_.find( code );
+	if ( it == errorLog_.end() )
+		errorLog_[ code ] = 1;
+	else
+	{ 
+		int count = (*it).second;
+		errorLog_[ code ] = ++count;
+	}
+}
+
+
+void 
+TeErrorLog::startSession ( const string& errLogFileName)
+{
+	// clean the logfile
+	if ( logFile_  != 0 )
+		delete logFile_;
+
+	// create a new logfile
+	logFile_ = new TeAsciiFile ( errLogFileName, "rw" );
+
+	// clear the stack
+	errorLog_.clear();
+}
+
+int
+TeErrorLog::endSession ()
+{
+	int numerr =  errorLog_.size();
+
+	// increment the count associated to this error type
+	map<TeErrorType, int>::iterator it = errorLog_.begin();
+
+	while ( it != errorLog_.end() )
+	{
+		int count = (*it).second;
+		string log = "Number of Error of Type " + errorMessage_ [ (*it).first ] 
+			+ " = " + Te2String ( count );
+		logFile_->writeString ( log );
+	}
+
+	// close the log file
+	if ( logFile_  != 0 )
+		delete logFile_;
+
+	// clear the stack
+	errorLog_.clear ();
+
+return numerr;
+}
+ 
+ 
diff --git a/src/terralib/kernel/TeErrorLog.h b/src/terralib/kernel/TeErrorLog.h
new file mode 100644
index 0000000..05153db
--- /dev/null
+++ b/src/terralib/kernel/TeErrorLog.h
@@ -0,0 +1,139 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeErrorLog.h
+    This file deals log of errors in TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_ERRORLOG_H
+#define  __TERRALIB_INTERNAL_ERRORLOG_H
+
+#include "TeSingleton.h"
+
+#include <string>
+#include <stack>
+#include <map>
+using namespace std;
+
+class TeAsciiFile;
+
+enum TeErrorType
+{
+
+	// Generic message inserted to log file
+	LOG_MESSAGE,
+
+	// Errors associated to files
+	EMPTY_FILE_NAME,
+	CANNOT_OPEN_FILE,
+    CANNOT_READ_FILE,
+    CANNOT_WRITE_FILE,
+    CANNOT_CLOSE_FILE,
+    END_OF_FILE_REACHED,
+
+	// Errors associated with projection
+    DATUM_ERROR,
+    PROJECTION_NOT_AVAILABLE,
+
+// Error codes for MIF files
+    NOT_MIF_FILE,
+    MIF_REGION_CLOSE,
+    MIF_CONVERSION_ERROR,
+    NOT_CSV,
+    NOT_ENOUGH_ROWS,
+    NOT_POLYGON_FILE,
+    PLINE_ERROR,
+    NO_DTM_QUOTE_VALUE,
+
+// Error Codes for shapefiles
+    POLYSHAPE_IS_NOT_RING,
+    UNHANDLED_SHP_TYPE,
+
+// Error Codes for DBF files
+
+    UNABLE_TO_OPEN_DBF_FILE,
+    NO_DATA_IN_DBF_FILE,
+    ATTRIBUTE_INDEX_MISMATCH,
+
+	// Error codes for E00 Files
+    NOT_E00_FILE,
+
+	// Error codes for algorithms
+    CENTROID_NOT_FOUND,
+    REGIONS_WITH_HOLES,
+    LINE_IS_NOT_RING,
+
+	// Error codes for tables
+
+    ROW_MISMATCH,
+    NO_SUCH_ATTRIBUTE,
+
+	// Error codes for Raster stuff
+    UNKNOWN_DECODER_TECHNOLOGY_TYPE,
+    UNKNOWN_RASTER_FORMAT,
+
+	// Layer stuff
+	GEOMETRY_REPRESENTATION_MISMATCH,
+
+	// Other
+	UNKNOWN_ERROR_TYPE
+};
+
+typedef map<TeErrorType, string> TeErrorTypeMap;
+
+typedef map<TeErrorType, int> TeErrorLogMap;
+
+//! Describes a class for describing error logging in TerraLib
+/*!
+	All errors in TerraLib may be  logged into an error file. 
+	The error logging facilities include the notion of a 
+	session, using the "start" and "end" methods, of a 
+	dump method for acessing the contenst
+
+\sa TeException, TeSingleton
+*/
+class TeErrorLog: public TeSingleton<TeErrorLog>
+{
+public:
+	TeErrorLog();
+
+	~TeErrorLog();
+	
+	string message(const TeErrorType code);
+	
+	virtual void insert ( TeErrorType code, const string& msg = "" );
+
+	virtual void startSession ( const string& errLogFileName = "terralib.err");
+
+	virtual int endSession ();
+
+private:
+		
+    TeAsciiFile* logFile_;
+
+	TeErrorLogMap errorLog_;
+
+	TeErrorTypeMap  errorMessage_;
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeErrorMessage.cpp b/src/terralib/kernel/TeErrorMessage.cpp
new file mode 100644
index 0000000..23eb6d6
--- /dev/null
+++ b/src/terralib/kernel/TeErrorMessage.cpp
@@ -0,0 +1,33 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeErrorMessage.h"
+#include <map>
+using namespace std;
+static map<string, string> errorMessage_;
+
+
diff --git a/src/terralib/kernel/TeErrorMessage.h b/src/terralib/kernel/TeErrorMessage.h
new file mode 100644
index 0000000..3e38e9d
--- /dev/null
+++ b/src/terralib/kernel/TeErrorMessage.h
@@ -0,0 +1,111 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeErrorMessage.h
+    This file contains some definitions issuing error messages to the user
+*/
+#ifndef TeErrorMessage_H
+#define TeErrorMessage_H
+
+#include <string>
+using namespace std;
+
+#include "TePrototype.h"
+#include "TeSingleton.h"
+
+/*!
+\enum TeMessageType 
+
+Te_ABORTRETRYIGNORE   
+	The message box contains three pushbuttons: Abort, Retry, and Ignore.
+Te_OK   The message box contains one pushbutton: OK.
+Te_OKCANCEL   The message box contains two pushbuttons: OK and Cancel.
+Te_RETRYCANCEL   The message box contains two pushbuttons: Retry and Cancel.
+Te_YESNO   The message box contains two pushbuttons: Yes and No.
+Te_YESNOCANCEL   The message box contains three pushbuttons: Yes, No, and Cancel. 
+
+---*/
+enum TeMessageType
+{ Te_ABORTRETRYIGNORE, Te_OK, Te_OKCANCEL, Te_RETRYCANCEL, Te_YESNO, Te_YESNOCANCEL };
+
+  
+/*!
+\enum TeMessageIcon
+
+Te_ICONEXCLAMATION   An exclamation-point icon appears in the message box.
+Te_ICONINFORMATION   An icon consisting of an �i� in a circle appears in the message box.
+Te_ICONQUESTION   A question-mark icon appears in the message box.
+Te_ICONSTOP   A stop-sign icon appears in the message box. 
+-----*/
+  
+enum TeMessageIcon
+{	Te_ICONEXCLAMATION, Te_ICONINFORMATION, Te_ICONQUESTION, Te_ICONSTOP };
+
+/*---------
+Return Value
+
+Zero if there is not enough memory to display the message box; 
+otherwise one of the following values is returned: 
+
+Te_IDABORT   The Abort button was selected.
+Te_IDCANCEL   The Cancel button was selected.
+Te_IDIGNORE   The Ignore button was selected.
+Te_IDNO   The No button was selected.
+Te_IDOK   The OK button was selected.
+Te_IDRETRY   The Retry button was selected.
+Te_IDYES   The Yes button was selected. 
+
+----*/
+
+enum TeMessageReturn
+{ Te_IDABORT, Te_IDCANCEL, Te_IDIGNORE, Te_IDNO, Te_IDOK, Te_IDRETRY, Te_IDYES };
+
+//!  Provides a convenience class for issuing error messages to the user
+/*
+	  Based on a configuration parameter, provide implementations
+	  for console (stdio), MFC and QT
+  
+	  \sa TeException 
+*/
+class TeErrorMessage
+{
+public:
+	//! Constructor
+	TeErrorMessage(){}
+
+	virtual ~TeErrorMessage(){}
+
+	virtual TeMessageReturn apply ( 
+				  const string& appName, 
+				  const string & msgText, 
+				  TeMessageType	msgType,
+				  TeMessageIcon iconType ) = 0; 
+};
+
+class TeErrorMessagePrototype: public TePrototype<TeErrorMessage>
+{
+	virtual TeErrorMessage* build() = 0;
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeException.cpp b/src/terralib/kernel/TeException.cpp
new file mode 100644
index 0000000..4f5cc81
--- /dev/null
+++ b/src/terralib/kernel/TeException.cpp
@@ -0,0 +1,51 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeException.h"
+#include "TeErrorLog.h"
+#include <errno.h>
+
+TeException::TeException ( TeErrorType msgCode, const string& userText, bool haserrno ):
+		userText_ ( userText )
+{			
+		if ( haserrno )
+			userText_ = userText + " " + strerror ( errno );
+		
+		TeErrorLog::instance().insert( msgCode, userText_ );
+}
+
+string 
+TeException::message()
+{
+	return TeErrorLog::instance().message ( msgCode_ ) + " " + userText_;
+}
+
+TeErrorType
+TeException::code ()
+{
+	return msgCode_;
+}
diff --git a/src/terralib/kernel/TeException.h b/src/terralib/kernel/TeException.h
new file mode 100644
index 0000000..4a7599f
--- /dev/null
+++ b/src/terralib/kernel/TeException.h
@@ -0,0 +1,72 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeException.h
+    This file deals Eexception throwing in TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_EXCEPTION_H
+#define  __TERRALIB_INTERNAL_EXCEPTION_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4355 )
+#endif
+
+#include "TeSingleton.h"
+#include "TeErrorLog.h"
+
+#include <string>
+#include <map>
+using namespace std;
+
+
+//!  Provides a class for handling exceptions on Terralib
+class TeException {
+public:
+
+// -- Contructors
+	
+	TeException ( TeErrorType msgCode, const string& userText = "", bool hasErrno = false );
+
+// -- Destructor
+
+	virtual ~TeException() {}  // base class
+
+// --  Members
+
+	string			message ();
+	TeErrorType	    code();
+	
+protected:
+	
+// -- Members
+
+//! code associated with TeException
+	TeErrorType 	msgCode_;   
+
+//! message associated with TeException
+	string			userText_;
+
+private:
+
+};
+#endif
+
diff --git a/src/terralib/kernel/TeFactory.h b/src/terralib/kernel/TeFactory.h
new file mode 100644
index 0000000..8e19b93
--- /dev/null
+++ b/src/terralib/kernel/TeFactory.h
@@ -0,0 +1,145 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeFactory.h
+    This file deals with the Factory Pattern 
+*/
+#ifndef  __TERRALIB_INTERNAL_FACTORY_H
+#define  __TERRALIB_INTERNAL_FACTORY_H
+
+#include <map>
+#include <string>
+
+using namespace std;
+
+//!  Implements a template for the "TeFactory" pattern.
+/*
+  The "factory" pattern is a technique for creating new
+  instances of objects which defines an abstract interface,
+  (represented by the "Make" module). The subclasses of
+  factory decide which class to instantiate.
+  
+
+  Each subclass of factory "registers" itself at compile time;
+  therefore, the addition of a new factory requires no change
+  the parent class. 
+
+  \author Gilberto Camara
+*/
+template <class T, class Arg>
+class TeFactory
+{
+public:
+
+//! Dictionary of factories (indexed by name)
+	typedef map<string, TeFactory<T,Arg>* > TeFactoryMap; 
+
+//! Returns the single instance of the factory dictionay
+	static TeFactoryMap& instance ()
+	{ 
+		static TeFactoryMap Fmap_;
+		return Fmap_;
+		
+	}
+	
+	//! Normal Constructor
+	TeFactory (const string& factoryName);
+
+	virtual ~TeFactory() {}
+
+	//! Virtual constructor using name
+	static T* make  ( string name, const Arg& arg );
+
+	//! Virtual constructor using arguments
+	static T* make  ( Arg arg );
+
+
+protected:
+
+	//!  Builds a new type (should be implemented by descendants)
+    virtual T* build ( const Arg& arg ) = 0;
+
+private:
+	string  Fname_;
+};
+
+// Initialisation of static variable
+//template <class T, class Arg>
+//TeFactory<T,Arg>::TeFactoryMap TeFactory<T,Arg>::Fmap_;
+
+
+// Constructor
+template <class T, class Arg>
+TeFactory<T,Arg>::TeFactory(const string& name):
+	Fname_(name)
+{
+	TeFactory<T,Arg>::instance()[name] = this;
+
+}
+
+// Destructor
+//template <class T, class Arg>
+//TeFactory<T,Arg>::~TeFactory<T,Arg> ()
+//{
+	// Remove the object from the factory dictionary
+	// Fmap_.erase ( Fname_ );
+//}
+
+//! Builds an object, based on the input parameters
+template <class T, class Arg> 
+T*
+TeFactory<T,Arg>::make ( string name, const Arg& arg )
+{
+	// try to find the name on the factory dictionary
+	typename TeFactoryMap::iterator i = TeFactory<T,Arg>::instance().find ( name );
+
+	// Not found ?  return the Default Object   
+	if ( i == TeFactory<T,Arg>::instance().end() )
+		return T::DefaultObject( arg );
+
+	// Create an object, based on the input parameters
+	return (*i).second->build ( arg );
+	return 0;
+
+}
+
+//! Builds an object, based on the input parameters
+template <class T, class Arg> 
+T*
+TeFactory<T,Arg>::make ( Arg arg )
+{
+	string name = arg.decName();
+
+	// try to find the name on the factory dictionary
+	typename TeFactoryMap::iterator i = TeFactory<T,Arg>::instance().find ( name );
+
+	// Not found ?  return the Default Object   
+	if ( i == TeFactory<T,Arg>::instance().end() )
+		return T::DefaultObject( arg );
+
+	// Create an object, based on the input parameters
+	return (*i).second->build ( arg );
+	return 0;
+
+}
+#endif
+
diff --git a/src/terralib/kernel/TeFragmentation.cpp b/src/terralib/kernel/TeFragmentation.cpp
new file mode 100644
index 0000000..e232c7f
--- /dev/null
+++ b/src/terralib/kernel/TeFragmentation.cpp
@@ -0,0 +1,424 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeFragmentation.h"
+#include "TeGeometryAlgorithms.h"
+
+
+// Is Crescent?
+struct xyOrder
+{
+	bool operator()(const TeCoord2D& c1, const TeCoord2D& c2) const
+	{
+		if(c1.x_ < c2.x_)
+			return true;
+
+		if(c1.x_ > c2.x_)
+			return false;
+
+		if(c1.y_ < c2.y_)
+			return true;		
+
+		return false;
+	}
+};
+
+
+struct ipRedOrder	// XY order
+{
+	/*
+	 * TODO: Talvez desempatar pela segunda coordenada no caso de overlap
+	 *
+	 */
+	bool operator()(const TeINTERSECTOR2::TeBoundaryIP& ip1, const TeINTERSECTOR2::TeBoundaryIP& ip2) const
+	{
+		if(ip1.redPartNum_ < ip2.redPartNum_)
+			return true;
+
+		if(ip1.redPartNum_ > ip2.redPartNum_)
+			return false;
+
+		if(ip1.redSegNum_ < ip2.redSegNum_)
+			return true;
+
+		if(ip1.redSegNum_ > ip2.redSegNum_)
+			return false;
+
+		if(ip1.coords_[0].x_ < ip2.coords_[0].x_)
+			return true;
+
+		if(ip1.coords_[0].x_ > ip2.coords_[0].x_)
+			return false;
+
+		if(ip1.coords_[0].y_ < ip2.coords_[0].y_)
+			return true;
+		
+		if(ip1.coords_.size() < ip2.coords_.size())
+			return true;
+
+		return false;
+	}
+};
+
+struct yxIPOrder	// YX order
+{
+	/*
+	 * TODO: Talvez desempatar pela segunda coordenada no caso de overlap
+	 *
+	 */
+	bool operator()(const TeINTERSECTOR2::TeBoundaryIP& ip1, const TeINTERSECTOR2::TeBoundaryIP& ip2) const
+	{
+		if(ip1.coords_[0].x_ > ip2.coords_[0].x_)
+			return true;
+
+		if(ip1.coords_[0].x_ < ip2.coords_[0].x_)
+			return false;
+
+		if(ip1.coords_[0].y_ > ip2.coords_[0].y_)
+			return true;		
+		
+		return false;
+	}
+};
+
+inline void cleanIntersections(TeINTERSECTOR2::TeVectorBoundaryIP& ips)
+{
+	// Eliminar os pontos de interse��o 1p que estiverem em cima ou no meio de outros
+	// pontos de intersec��o 2p
+	// +
+	// Eliminar os segmentos de overlap que estiverem entre algum outro de overlap
+	for(unsigned int i = 1; i < ips.size(); ++i)
+	{	
+		unsigned int currentSize = ips[i].coords_.size();
+
+		for(unsigned int j = 0; j < i; ++j)
+		{
+			if(currentSize == 1)	// Verificar se ele n�o se encontra entre algum de overlap
+			{
+				// Se o ponto j-th � �nico, ir p/ o pr�ximo
+				// pois ele n�o tem problemas
+				if(ips[j].coords_.size() == 1)
+					continue;
+
+				// Se o ponto estiver fora do intervalo x, ir p/ o pr�ximo
+				if(ips[i].coords_[0].x_ < ips[j].coords_[0].x_ ||
+				   ips[i].coords_[0].x_ > ips[j].coords_[1].x_)
+				   continue;
+
+				// Caso contr�rio, verificar se ele se encontra no intervalo y tamb�m
+				if(ips[i].coords_[0].y_ < ips[j].coords_[0].y_ &&
+				   ips[i].coords_[0].y_ < ips[j].coords_[1].x_)
+				   continue;
+
+				if(ips[i].coords_[0].y_ > ips[j].coords_[0].y_ &&
+				   ips[i].coords_[0].y_ > ips[j].coords_[1].x_)
+				   continue;
+
+				// Remove o ponto e j� move o cursor p/ um ponto anterior
+				// pois ele ser� incremementado
+				ips.erase(ips.begin() + i);
+				--i;
+				break;
+			}
+			else	// Verificar se ele n�o � um de overlap entre algum outro de overlap
+			{
+				// Se o ponto j-th � �nico, ir p/ o pr�ximo
+				// pois ele n�o te problemas
+				if(ips[j].coords_.size() == 1)
+					continue;
+		
+				// Remover os segmentos iguais
+				if(TeEquals(ips[i].coords_[0], ips[j].coords_[0]) &&
+				   TeEquals(ips[i].coords_[1], ips[j].coords_[1]))
+				{
+					ips.erase(ips.begin() + i);
+					--i;
+					break;
+				}
+
+			}
+		}
+	}
+}
+
+inline void TeFragmentSegmentByNonOverlapping(const TeCoord2D& s1, const TeCoord2D& s2,
+									   TeINTERSECTOR2::TeVectorBoundaryIP& ips, 
+									   TeLine2D& currentFragment,
+									   TeLineSet& fragments)
+{
+	// Se a orienta��o do segmento n�o for esquerda/direita
+	// � preciso reverter os pontos de intersec��o
+	if(s1.x_ > s2.x_)
+	{
+		reverse(ips.begin(), ips.end());
+	}
+	else if(s1.x_ < s2.x_)
+	{
+	}
+	else if(s1.y_ > s2.y_)
+	{
+		reverse(ips.begin(), ips.end());
+	}
+
+
+	// � s� fragmentar o segmento at� o �ltimo ponto de intersec��o dele
+	for(unsigned int k = 0; k < ips.size(); ++k)
+	{
+		if(TeEquals(ips[k].coords_[0], currentFragment[currentFragment.size() - 1]))	// Se o ponto de intersec��o est� sobre o v�rtice do segmento
+		{
+			// fragmenta a linha caso haja mais de um ponto nela
+			if(currentFragment.size() > 1)								
+			{
+				fragments.add(currentFragment);
+
+				currentFragment = TeLine2D();
+				currentFragment.add(ips[k].coords_[0]);
+			}
+			else
+			{
+				continue;
+			}
+		}
+		else
+		{
+			currentFragment.add(ips[k].coords_[0]);
+
+			fragments.add(currentFragment);
+
+			currentFragment = TeLine2D();
+			currentFragment.add(ips[k].coords_[0]);
+		}
+	}
+}
+
+inline void TeFragmentSegmentByOverlapping(const TeCoord2D& s1, const TeCoord2D& s2,
+									   TeINTERSECTOR2::TeVectorBoundaryIP& ips,
+									   TeLine2D& currentFragment,
+									   TeLineSet& fragments, TeLineSet& boundaryFragments)
+{
+	cleanIntersections(ips);
+
+	unsigned int i = 0;
+
+
+	// Se a orienta��o do segmento n�o for esquerda/direita
+	// � preciso reverter os pontos de intersec��o
+	if(s1.x_ > s2.x_)
+	{
+		for(i = 0; i < ips.size(); ++i)
+		{
+			if(ips[i].coords_.size() == 2)
+			{
+				swap(ips[i].coords_[0], ips[i].coords_[1]);
+			}
+		}
+
+		reverse(ips.begin(), ips.end());
+	}
+	else if(s1.x_ < s2.x_)
+	{
+	}
+	else if(s1.y_ > s2.y_)
+	{
+		for(i = 0; i < ips.size(); ++i)
+		{
+			if(ips[i].coords_.size() == 2)
+			{
+				swap(ips[i].coords_[0], ips[i].coords_[1]);
+			}
+		}
+
+		reverse(ips.begin(), ips.end());
+	}
+
+	
+	// � s� fragmentar o segmento at� o �ltimo ponto de intersec��o dele
+	for(i = 0; i < ips.size(); ++i)
+	{
+		if(TeEquals(ips[i].coords_[0], currentFragment[currentFragment.size() - 1]))	// Se o ponto de intersec��o est� sobre o v�rtice do segmento
+		{
+			// fragmenta a linha caso haja mais de um ponto nela
+			if(currentFragment.size() > 1)
+			{
+				fragments.add(currentFragment);
+
+				currentFragment = TeLine2D();
+
+				if(ips[i].coords_.size() == 2)
+				{
+					TeLine2D l;
+					l.add(ips[i].coords_[0]);
+					l.add(ips[i].coords_[1]);
+					
+					boundaryFragments.add(l);
+
+					currentFragment.add(ips[i].coords_[1]);
+				}
+				else
+				{
+					currentFragment.add(ips[i].coords_[0]);
+				}
+			}
+			else
+			{
+				if(ips[i].coords_.size() == 2)
+				{
+					TeLine2D l;
+					l.add(ips[i].coords_[0]);
+					l.add(ips[i].coords_[1]);
+					
+					boundaryFragments.add(l);
+
+					currentFragment.clear();
+					currentFragment.add(ips[i].coords_[1]);
+				}
+			}
+		}
+		else
+		{
+
+			currentFragment.add(ips[i].coords_[0]);
+
+			if(ips[i].coords_.size() == 2)
+			{
+				fragments.add(currentFragment);
+
+				currentFragment = TeLine2D();
+				
+				currentFragment.add(ips[i].coords_[1]);
+
+				TeLine2D l;
+				l.add(ips[i].coords_[0]);
+				l.add(ips[i].coords_[1]);
+				
+				boundaryFragments.add(l);
+			}
+			else
+			{
+				fragments.add(currentFragment);
+
+				currentFragment = TeLine2D();
+				
+				currentFragment.add(ips[i].coords_[0]);
+			}			
+		}
+	}
+}
+
+void TeFragmentBoundary(const TeLineSet& lines, TeINTERSECTOR2::TeVectorBoundaryIP& ips, TeLineSet& boundaryFragments, TeLineSet& fragments)
+{
+	// Informa��es sobre os pontos de interse��o
+	unsigned int currentIP = 0;
+	unsigned int nthIP = ips.size();
+
+	// Informa��es sobre n�mero de linhas
+	unsigned int nthLine = lines.size();
+
+	// Ordena os pontos de interse��o
+	sort(ips.begin(), ips.end(), ipRedOrder());
+
+	for(unsigned int i = 0; i < nthLine; ++i)
+	{
+		if((currentIP < nthIP) && (ips[currentIP].redPartNum_ == i))	
+		{
+			// Se a linha corrente possui um ponto de interse��o ent�o ela dever� ser fragmentada
+			TeLine2D& currentLine = lines[i];
+			
+			TeLine2D lFrag;
+
+			//unsigned int currentSegment = 0;
+			unsigned int nthSegment = currentLine.size() - 1;
+
+			for(unsigned int j = 0; j < nthSegment; ++j)
+			{
+				if((currentIP < nthIP) && (j == ips[currentIP].redSegNum_) && (ips[currentIP].redPartNum_ == i))	// Se ainda tenho pontos de intersec��o e 
+				{															// o corrente pertence ao segmento atual
+					// Adiciona o primeiro ponto da linha na lista do fragmento atual
+					if((lFrag.size() == 0) || TeDisjoint(currentLine[j], lFrag[lFrag.size() - 1]))
+						lFrag.add(currentLine[j]);
+
+					// Copias todos os pontos de intersec��o do segmento para
+					// um vetor auxiliar e j� avan�a o currentIP
+					TeINTERSECTOR2::TeVectorBoundaryIP ipsAux;
+
+					bool hasOverlap = false;
+
+					while((currentIP < nthIP) && (ips[currentIP].redSegNum_ == j) && (ips[currentIP].redPartNum_ == i))
+					{
+						if(ips[currentIP].coords_.size() == 2)
+							hasOverlap = true;
+
+						ipsAux.push_back(ips[currentIP]);
+
+						++currentIP;
+					}
+
+					if(hasOverlap)	// Se houverem pontos de intersec��o que fazem overlap
+					{						
+						TeFragmentSegmentByOverlapping(currentLine[j], currentLine[j + 1], ipsAux, lFrag, fragments, boundaryFragments);
+					}
+					else	// Se n�o houver pontos de intersec��o que fazem overlap
+					{
+						TeFragmentSegmentByNonOverlapping(currentLine[j], currentLine[j + 1], ipsAux, lFrag, fragments);
+					}
+				}
+				else
+				{
+					// Caso n�o haja ponto de intersec��o sobre o segmento,
+					// apenas insere o ponto no fragmento de linha
+					lFrag.add(currentLine[j]);
+				}
+			}
+			
+			//if((lFrag.size() > 0u) && TeDisjoint(currentLine[nthSegment], lFrag[lFrag.size() - 1u]))
+			if(lFrag.size() > 0)
+			{
+				//unsigned int st = lFrag.size();
+
+				if(TeDisjoint(currentLine[nthSegment], lFrag[lFrag.size() - 1]))
+				{
+					lFrag.add(currentLine[nthSegment]);
+
+					fragments.add(lFrag);
+				}
+				else if(lFrag.size() > 1)
+				{
+					fragments.add(lFrag);
+				}
+			}
+		}
+		else
+		{
+			// Caso contr�rio, se a linha n�o possui ponto de interse��o
+			// � s� colocar ela na lista de linhas fragmentadas
+			fragments.add(lines[i]);
+		}
+	}
+	
+	return;
+}
+
diff --git a/src/terralib/kernel/TeFragmentation.h b/src/terralib/kernel/TeFragmentation.h
new file mode 100644
index 0000000..f9964b6
--- /dev/null
+++ b/src/terralib/kernel/TeFragmentation.h
@@ -0,0 +1,52 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeFragmentation.h
+    This file contains Algorithms for Topological Operations.
+*/
+
+/**
+  *@author Gilberto Ribeiro de Queiroz
+  */
+
+#ifndef  __TERRALIB_INTERNAL_FRAGMENTATION_H
+#define  __TERRALIB_INTERNAL_FRAGMENTATION_H
+
+#include "TeGeometry.h"
+#include "TeIntersector.h"
+
+/** @defgroup FragmentAlgorithms Algorithms that performs fragmentation of lines
+ *  TerraLib fragmentation algorithms.
+ *  @{
+ */
+/*! \fn TeLineSet TeFragmentLine(const TeLineSet& redLineSet, const TeLineSet& blueLineSet, TeINTERSECTOR2::TeReportVector& report)
+    \brief Fragments the red lines according to blues and report, this rotine tries to join fragments.
+	\param redLineSet  The lines to fragment.
+	\param blueLineSet The blues one used as reference
+	\param report      The intersection points.
+*/
+void TeFragmentBoundary(const TeLineSet& lines, TeINTERSECTOR2::TeVectorBoundaryIP& ips, TeLineSet& boundaryFragments, TeLineSet& fragments);
+
+/** @} */ // end of group  FragmentAlgorithms
+
+#endif	// __TERRALIB_INTERNAL_FRAGMENTATION_H
diff --git a/src/terralib/kernel/TeGeneralizedProxMatrix.cpp b/src/terralib/kernel/TeGeneralizedProxMatrix.cpp
new file mode 100644
index 0000000..33f8a3c
--- /dev/null
+++ b/src/terralib/kernel/TeGeneralizedProxMatrix.cpp
@@ -0,0 +1,433 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeSTElementSet.h"
+#include "TeGeneralizedProxMatrix.h"
+
+
+bool
+TeGeneralizedProxMatrix::IsValid () const
+{
+	if ((imp_) && (sc_) && (ss_) && (sw_))
+		return true;
+
+	return false;
+}
+
+
+TeProxMatrixImplementation*
+TeGeneralizedProxMatrix::getImplementation (const string type)
+{
+	 if (imp_ == 0) 
+		imp_ = TeProxMatrixAbstractFactory::MakeConcreteImplementation (type); 
+    return imp_;
+}
+
+
+
+TeGeneralizedProxMatrix::TeGeneralizedProxMatrix(TeSTElementSet* objects, TeGeomRep geom_type, const string imp_type)
+{
+	imp_ = 0;
+	imp_ = getImplementation(imp_type);
+	total_slices_ = 1;
+
+	if ((geom_type==TePOLYGONS) || (geom_type==TeCELLS))
+		sc_ = new TeProxMatrixLocalAdjacencyStrategy (objects, geom_type);
+	else {
+			imp_ = 0;
+			sc_ = 0;
+			ss_ = 0;
+			sw_ = 0;
+		}
+	ss_ = new TeProxMatrixNoSlicingStrategy;
+	sw_ = new TeProxMatrixNoWeightsStrategy;
+
+	if (IsValid()) {
+		if (sc_->Construct (imp_)) {
+			ss_->Slice (imp_);
+			sw_->ComputeWeigths (imp_);
+		} 
+		else {
+
+			imp_ = 0;
+			sc_ = 0;
+			ss_ = 0;
+			sw_ = 0;
+		}
+	}
+}
+
+
+TeGeneralizedProxMatrix::TeGeneralizedProxMatrix (TeProxMatrixConstructionStrategy* sc, TeProxMatrixWeightsStrategy* sw, TeProxMatrixSlicingStrategy* ss, const string imp_type)
+{
+	imp_ = 0;
+	imp_ = getImplementation(imp_type);
+	total_slices_ = 1;
+	sc_ = sc;
+
+
+  if(ss)
+		ss_ = ss;
+	else
+		ss_ = new TeProxMatrixNoSlicingStrategy();
+
+	if(sw)
+		sw_ = sw;
+	else
+		sw_ = new TeProxMatrixNoWeightsStrategy();
+
+
+	if (IsValid()) {
+		if (sc_->Construct (imp_)) {
+			ss_->Slice (imp_);
+			sw_->ComputeWeigths (imp_);
+		} 
+		else {
+			imp_ = 0;
+			sc_ = 0;
+			ss_ = 0;
+			sw_ = 0;
+		}
+	}
+}
+
+
+TeGeneralizedProxMatrix::TeGeneralizedProxMatrix(const TeGeneralizedProxMatrix& pm)
+{
+	if (pm.imp_ == 0)
+		imp_ = 0;
+	else 
+		imp_ = pm.imp_->CreateCopy ();
+
+	total_slices_ = pm.total_slices_;
+	sc_ = pm.sc_;
+	ss_ = pm.ss_;
+	sw_ = pm.sw_;
+
+	if (IsValid() == false)
+	{
+		imp_ = 0;
+		sc_ = 0;
+		ss_ = 0;
+		sw_ = 0;
+	}
+}
+
+
+TeGeneralizedProxMatrix& 
+TeGeneralizedProxMatrix::operator=(const TeGeneralizedProxMatrix& pm) 
+{
+	if (*this == pm) return *this;
+
+	if (imp_) delete imp_;
+	imp_ = 0;
+	if (pm.imp_)	imp_ = pm.imp_->CreateCopy ();
+
+	total_slices_ = pm.total_slices_;
+	sc_ = pm.sc_;
+	ss_ = pm.ss_;
+	sw_ = pm.sw_;
+
+	if (IsValid() == false)
+	{
+		imp_ = 0;
+		sc_ = 0;
+		ss_ = 0;
+		sw_ = 0;
+	}
+
+	return *this;
+
+}
+
+bool 
+TeGeneralizedProxMatrix::operator==(const TeGeneralizedProxMatrix& pm) const
+{
+	if (IsValid() && pm.IsValid()) 
+	{	
+		if ((sc_->IsEqual (*(pm.sc_))) &&
+			(ss_->IsEqual (*(pm.ss_))) &&
+			(sw_->IsEqual (*(pm.sw_))) &&
+			(total_slices_ == pm.total_slices_) &&
+
+			(imp_->IsEqual(*(pm.imp_)))) return true;
+	} else 	
+		if ((IsValid() == false) && (pm.IsValid() == false)) 
+			return true;
+	
+	return false;
+
+}
+
+TeNeighbours
+TeGeneralizedProxMatrix:: getNeighbours (const string& object_id, int slice) 
+{
+	TeNeighbours neigh2;
+	if (slice > total_slices_) return neigh2;
+
+	if (IsValid()) 
+	{
+		TeNeighbours neigh1;
+		imp_->getNeighbours (object_id, neigh1);
+		for (int i=0; i < neigh1.size(); i++) 
+			if (neigh1.Attributes(i).Slice() == slice) 
+				neigh2.Insert (neigh1.ObjectId(i), neigh1.Attributes(i));
+	}
+
+	return neigh2;
+}
+
+
+TeNeighbours 
+TeGeneralizedProxMatrix::operator[](const string& object_id) 
+{
+	return getNeighbours(object_id);
+}
+
+
+TeNeighboursMap
+TeGeneralizedProxMatrix::getMapNeighbours (const string& object_id, int slice) 
+{
+	TeNeighboursMap map;
+	if (slice > total_slices_) return map;
+
+	if (IsValid()) 
+	{
+		TeNeighbours neigh;
+		imp_->getNeighbours (object_id, neigh);
+
+		for (int i=0; i < neigh.size(); i++) 
+			if (neigh.Attributes(i).Slice() == slice) 
+				map[neigh.ObjectId(i)] = neigh.Attributes(i);
+	}
+
+	return map;
+}
+
+
+TeSTElementSet 
+TeGeneralizedProxMatrix::getSTENeighbours(const string& object_id)
+{
+	TeSTElementSet selected_objects;
+	if (imp_) 
+	{
+		TeNeighbours neigh;
+		imp_->getNeighbours (object_id, neigh);
+		
+		for (int i = 0; i < neigh.size(); i++) 
+		{
+			// Construct a sto instance with its attributes
+			TeSTInstance obj;
+			obj.objectId(neigh.ObjectId(i));  
+			
+			//load the attributes
+			TePropertyVector propVector;
+			sc_->objects()->getPropertyVector(object_id, propVector);
+			obj.properties(propVector);
+				
+			// insert object in the return vector
+			selected_objects.insertSTInstance(obj);
+		}
+	}
+	return selected_objects;
+}
+
+
+bool 
+TeGeneralizedProxMatrix::setCurrentConstructionStrategy (TeProxMatrixConstructionStrategy* sc)  
+{	
+	if (sc == 0) 
+		return false; 
+	sc_ = sc; 
+	return true;
+}
+
+
+bool 
+TeGeneralizedProxMatrix::setCurrentWeightsStrategy (TeProxMatrixWeightsStrategy* sw) 
+{	
+	if (sw == 0) 
+		return false; 
+	sw_ = sw; 
+	return true;
+}
+
+bool 
+TeGeneralizedProxMatrix::setCurrentSlicingStrategy (TeProxMatrixSlicingStrategy* ss) 
+{
+	if (ss == 0) 
+		return false; 
+	ss_ = ss; 
+	return true;
+}
+
+bool
+TeGeneralizedProxMatrix:: ConstructMatrix ()
+{
+
+	//	ClearImplementation();
+	imp_ = 0;
+	imp_ = getImplementation();
+
+	if (sc_) 
+	{
+		if (sc_->Construct (imp_)) 
+		{
+			if (ss_) ss_->Slice (imp_);
+			if (sw_) sw_->ComputeWeigths (imp_); 
+			return true;
+		} 
+	}
+	return false;
+}
+
+
+bool
+TeGeneralizedProxMatrix:: ClearImplementation ()
+{
+	TeProxMatrixImplementation* aux;
+	if (imp_ == 0)  aux = getImplementation ();
+	else	aux = getImplementation (imp_->Type().c_str());
+
+	if (aux == 0) return false;
+	delete imp_;
+	imp_ = aux;
+
+	return true;
+}
+
+bool
+TeGeneralizedProxMatrix:: RecomputeWeights ()
+{
+	if (IsValid()){
+		sw_->ComputeWeigths (imp_); return true;
+	} 
+	return false;
+}
+
+
+bool
+TeGeneralizedProxMatrix:: RecomputeSlicing ()
+{
+	if (IsValid()){
+		ss_->Slice (imp_); return true;
+	} 
+	return false;
+}
+
+
+bool 
+TeGeneralizedProxMatrix::IsConnected (const string& object_id1, const string& object_id2) 
+{
+	if (imp_ == 0) 
+		return false;  
+	return imp_->isConnected (object_id1, object_id2);
+}
+
+bool 
+TeGeneralizedProxMatrix::ConnectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr)
+{
+	if (!imp_) 
+		getImplementation();  
+	imp_->connectObjects (object_id1, object_id2, attr);
+	return true;
+}
+
+bool 
+TeGeneralizedProxMatrix::ConnectObjects (const string& object_id1, const string& object_id2)
+{
+	if (!imp_) 
+		getImplementation();  
+	TeProxMatrixAttributes attr;
+	imp_->connectObjects (object_id1, object_id2, attr);
+	return true;
+}
+
+bool 
+TeGeneralizedProxMatrix::DisconnectObjects (const string& object_id1, const string& object_id2)
+{
+	if (imp_ == 0) 
+		return false;  
+	return imp_->disconnectObjects (object_id1, object_id2);
+}
+
+bool 
+TeGeneralizedProxMatrix::RemoveObject (const string& object_id)
+{
+	if (imp_ == 0) 
+		return false;  
+	return imp_->removeObject (object_id);
+}
+
+bool 
+TeGeneralizedProxMatrix::GetConnectionAttributes (const string& object_id1, string& object_id2, TeProxMatrixAttributes& attr)
+{
+	if (imp_ == 0) 
+		return false;
+	return imp_->getConnectionAttributes (object_id1, object_id2, attr); 
+}
+
+int  
+TeGeneralizedProxMatrix::NumberOfObjects () 
+{
+	if (imp_ == 0) 
+		return 0;  
+	return imp_->NumberOfObjects ();
+}
+
+bool 
+TeGeneralizedProxMatrix::SaveTextFile (string name) 
+{	
+	if (imp_ == 0) 
+		return false;
+	return imp_->SaveTextFile (name); 
+}
+
+
+bool 
+TeGeneralizedProxMatrix::SaveGALFile (string name) 
+{	
+	if (imp_ == 0) 
+		return false;
+	return imp_->SaveGALFile (name); 
+}
+
+bool 
+TeGeneralizedProxMatrix::SaveGWTFile (string name) 
+{	
+	if (imp_ == 0) 
+		return false;
+	return imp_->SaveGWTFile (name); 
+}
+
+TeGeneralizedProxMatrix::~TeGeneralizedProxMatrix()
+{
+    if (imp_ !=  0) 
+		delete imp_; //It is not counted.
+}
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeGeneralizedProxMatrix.h b/src/terralib/kernel/TeGeneralizedProxMatrix.h
new file mode 100644
index 0000000..e573103
--- /dev/null
+++ b/src/terralib/kernel/TeGeneralizedProxMatrix.h
@@ -0,0 +1,169 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeGeneralizedProxMatrix.h
+    This file contains structures and definitions about 
+	generalized proximity matrices support in TerraLib
+*/
+
+
+#ifndef TeProxMatrix_H
+#define TeProxMatrix_H
+
+#include "TeNeighbours.h"
+#include "TeProxMatrixImplementation.h"
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeProxMatrixSlicingStrategy.h"
+#include "TeProxMatrixWeightsStrategy.h"
+
+
+//! A class to represent a generalized proximity matrix 
+class TeGeneralizedProxMatrix  
+{
+private:
+
+	TeProxMatrixImplementation*				imp_;  
+	TeProxMatrixConstructionStrategy*		sc_;   
+	TeProxMatrixSlicingStrategy*			ss_;   
+	TeProxMatrixWeightsStrategy*			sw_;   
+
+	int										total_slices_;
+
+protected:
+
+	//! Get the implementation from a concrete factory defined by impl_type
+	TeProxMatrixImplementation*				getImplementation(const string implementation_type = "Breymann");
+
+	//! Verify if a matrix was created correctly by the constructors.	
+	bool IsValid() const;
+	
+public:
+
+	//! Empty constructor
+	TeGeneralizedProxMatrix ()
+	{imp_ = 0; sc_ = 0; sw_ = 0; ss_ = 0; total_slices_=1;}
+
+	//! Constructor parametrized with specific strategies. Each stragegy must be previously created and correctly parametrized.
+	TeGeneralizedProxMatrix (TeProxMatrixConstructionStrategy* sc,  TeProxMatrixWeightsStrategy* sw = 0, TeProxMatrixSlicingStrategy* ss = 0, const string type = "Breymann");
+
+	//! Constructor based on default strategies: (a) Local adjacency of first order; (b) No siling;  and (c)  No weighs (all equal to 1).
+	TeGeneralizedProxMatrix(TeSTElementSet* objects, TeGeomRep geom_type, const string type = "Breymann");
+
+	//! Copy constructor
+	TeGeneralizedProxMatrix(const TeGeneralizedProxMatrix& p);
+
+	//! Attribution Operator 
+	TeGeneralizedProxMatrix& operator=(const TeGeneralizedProxMatrix& p);
+
+	bool ClearImplementation ();
+
+	//! Comparison Operator
+	bool operator==(const TeGeneralizedProxMatrix& p) const;
+	
+	
+	/** @name Methods for return the neighbours
+	*  All methods return the  neighbours of a given object in a given slice. The default is the first slice.
+	*  Slices are defined according to the Slicing Strategy in use (e.g., according to distance zones, corresponding to neighbourhood orders, weights intervals, etc.). 
+	*  If the parameter slice is not provided, the first slice is returned.
+	*  The operator[] method should preferably be used 
+	*  For each object, all the connection attributes are stored as properties (weight is the first).
+	*/
+	//@{ 
+	//! Return the neighbours of an object in a slice, packed in a TeNeighbours 
+	TeNeighbours getNeighbours (const string& object_id, int slice = 1);
+
+	//! Return the neighbours of an object in a slice, packed in a TeNeighboursMap
+	TeNeighboursMap	getMapNeighbours (const string& object_id, int slice = 1);
+	
+	//! Operator [], return the neighbours packed in a TeNeighbours
+	TeNeighbours operator[] (const string& object_id); 
+
+	//! Return the neighbours of an object and their attributes in a spatial temporal element set (TeSTElementSet)
+	TeSTElementSet getSTENeighbours(const string& object_id); 
+
+	//@}
+
+	
+	/** @name Methods for changing current strategies 
+	*  change current strategies 
+	*/
+	//@{ 
+	//! Set current construction strategy 
+	bool setCurrentConstructionStrategy (TeProxMatrixConstructionStrategy* sc);  
+	
+	//! Set current weights strategy 
+	bool setCurrentWeightsStrategy (TeProxMatrixWeightsStrategy* sw); 
+	
+	//! Set current slicing strategy 
+	bool setCurrentSlicingStrategy (TeProxMatrixSlicingStrategy* ss); 
+	//@}
+	
+
+	//! Reconstruct matrix and recompute weights and slicing, accornding to current strategies.
+	bool ConstructMatrix ();
+
+	//! Recomputes the weigths, given a new strategy. The matrix is not reconstructed.
+	bool RecomputeWeights ();
+
+	//! Sets the slicing strategy for neighbours selection.
+	bool RecomputeSlicing ();
+
+	//! Verify if two objects are connected
+	bool IsConnected (const string& object_id1, const string& object_id2); 
+
+	//! Connect two objects
+	bool ConnectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr); 
+	
+	//! Connect two objects
+	bool ConnectObjects (const string& object_id1, const string& object_id2);
+
+	//! Disconnect two objects
+	bool DisconnectObjects (const string& object_id1, const string& object_id2); 
+
+	//! Remove object
+	bool RemoveObject (const string& object_id);  
+
+	//! Get connection attributes
+	bool GetConnectionAttributes (const string& object_id1, string& object_id2, TeProxMatrixAttributes& attr); 
+
+	//! Return the number of objects
+	int NumberOfObjects (); 
+
+	//! Return the number of slices
+	int NumerOfSlices () {return total_slices_;}
+
+	//! Save the matrix in a text file
+	bool SaveTextFile (string name); 
+
+		//! Save the matrix in a text file
+	bool SaveGALFile (string name); 	
+	
+	//! Save the matrix in a text file
+	bool SaveGWTFile (string name); 
+
+	//! Destructor
+	virtual ~TeGeneralizedProxMatrix();
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeGeometry.cpp b/src/terralib/kernel/TeGeometry.cpp
new file mode 100644
index 0000000..67310e2
--- /dev/null
+++ b/src/terralib/kernel/TeGeometry.cpp
@@ -0,0 +1,113 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeGeometry.h"
+#include "TeException.h"
+
+// TeLine2D
+
+bool
+TeLine2D::isRing() const
+{
+	if ( size() <= 3 )
+			return false;
+		return ( pImpl_->operator[] (0) == pImpl_->operator[] ( pImpl_->size() - 1 ) );
+
+}
+
+
+// TeLinearRing
+
+TeLinearRing::TeLinearRing ( TeLine2D& line ): TeLine2D ( line ) 
+{
+	if ( ! line.isRing() )
+	{
+		line.add (line[0]);
+//		throw TeException ( LINE_IS_NOT_RING );
+	}
+}
+
+
+ostream& operator<<(ostream& os, TeNode& N)
+{
+	os << Te2String(N.geomId());
+    return os;
+}
+
+ostream& operator<<(ostream& os, const TeArc& N)
+{
+	TeArc a = N;
+	os << a.objectId();
+    return os;
+}
+
+void 
+TeLineSet::copyElements ( const TeLineSet& other )
+{
+	box_    = other.box();
+	geomId_ = other.geomId();
+	objectId_ = other.objectId();
+
+	for (unsigned int i=0; i<other.size(); i++) // for each line
+	{
+		TeLine2D line; 
+		line.copyElements(other[i]);
+		this->add (line);
+	}
+}
+
+void 
+TePolygon::copyElements ( const TePolygon& other )
+{
+	box_    = other.box();
+	geomId_ = other.geomId();
+	objectId_ = other.objectId();
+
+	for (unsigned int i = 0; i < other.size(); i++) // for each linear ring
+	{
+		TeLine2D line; 
+		line.copyElements(other[i]);
+		this->add (line);
+	}
+}
+
+
+void 
+TePolygonSet::copyElements ( const TePolygonSet& other )
+{
+	box_    = other.box();
+	geomId_ = other.geomId();
+	objectId_ = other.objectId();
+
+	for (unsigned int i = 0; i < other.size(); i++) // for each polygon
+	{
+		TePolygon poly;
+		poly.copyElements (other[i]);
+		this->add (poly);
+	}
+}
+
+
+
+
+
diff --git a/src/terralib/kernel/TeGeometry.h b/src/terralib/kernel/TeGeometry.h
new file mode 100644
index 0000000..ac2015a
--- /dev/null
+++ b/src/terralib/kernel/TeGeometry.h
@@ -0,0 +1,926 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeGeometry.h
+    This file contains structures and definitions about 
+	geometries support in TerraLib
+*/
+
+#ifndef __TERRALIB_INTERNAL_GEOMETRY_H
+#define __TERRALIB_INTERNAL_GEOMETRY_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeBox.h"
+#include "TeCoord2D.h"
+#include "TeComposite.h"
+#include "TeMeasure.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+
+#include <string>
+#include <iostream>
+
+using namespace std;
+
+//!  A basic class for handling geometries in TerraLib
+/*! 
+	 All geometric classes of TerraLib are derived from
+	 TeGeometry. This class keep track of a geometryId and of a bounding box for the geometry
+	
+	 \note The Geometry classes in TerraLib use the Composite and the Visitor patterns
+	 \sa TeBox TeGeomComposite, TeGeomSingle 
+*/
+class TeGeometry
+{
+public:
+
+	//! Empty constructor
+	TeGeometry(): box_ ( TeMAXFLOAT, TeMAXFLOAT, -TeMAXFLOAT, -TeMAXFLOAT ),
+		geomId_  ( 0 ), objectId_ ("") {}
+
+	//! Copy Constructor
+	TeGeometry ( const TeGeometry& other ) 
+	{
+		box_    = other.box_;
+		geomId_ = other.geomId_;
+		objectId_ = other.objectId_;
+	}
+	
+	//! Destructor
+	virtual ~TeGeometry() {}
+
+	//! Sets the bounding box for the object
+	void setBox ( const TeBox & box )
+	{ box_  = box; }
+	
+	//! Returns the constant bounding box
+	const TeBox& box () const 
+	{ return box_; }
+
+	//! Returns the bounding box
+	TeBox& box ()
+	{ return box_; }
+
+	//! Returns the geometry Id
+	int geomId() const
+	{ return geomId_; }
+
+	//! Sets the geometryId.
+	void geomId( int id )
+	{ geomId_ = id; }
+
+	//! Returns the object unique identification
+	virtual string objectId() const
+	{ return objectId_; }
+
+	//! Sets the objectId 
+	virtual void objectId ( const string& id )
+	{ objectId_ = id; }
+
+	//! Return the geometry size 
+	virtual unsigned int size() const
+	{ return 0; }
+
+	//! Outputs the geometical identification to an output stream
+	ostream& operator<<(ostream& os)
+	{
+		os << Te2String(geomId_);
+		return os;
+	}
+
+	//! Returns TRUE if a geometry is a closed ring  
+	virtual bool isRing() const
+	{ return false; }
+
+	//! Returns the type of the geometry
+	virtual TeGeomRep elemType() 
+	{ return TeGEOMETRYNONE; }
+	
+protected:
+
+	TeBox	box_;		//!<  The bounding box of the geometry
+	int	geomId_;		//!<  The unique geometry identification
+	string	objectId_;	//!<  The unique object identification associated to a geometry
+};
+
+
+//! A class that represents a non existent geometry
+/*!
+	This class is used to deal in a similar way with objects with or without geometry 
+*/
+class TeGeometryNone:  public TeGeometry
+{
+public: 
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TeGEOMETRYNONE; }
+
+	void clear () { return; }
+};
+
+//! A class to handle vector geometries
+class TeVector : public TeGeometry
+{
+};
+
+//!   TeGeomSingle: A class for handling geometries in TerraLib which consist of one location
+/*!  
+  \sa TePoint, TeSample 
+*/
+template <class T>
+class TeGeomSingle : public TeVector
+{
+public:
+
+//	typedef typename T value_type;
+	typedef  T value_type;
+
+	//! Empty constructor
+	TeGeomSingle<T>() {}
+
+	//! Constructor
+	/*!
+		\param elem the unique element of the single
+	*/
+	TeGeomSingle<T> (const T& elem ): elem_ ( elem  ) 
+	{	updateBox ( box_, elem ); }
+
+	//! Copy Constructor
+	TeGeomSingle ( const TeGeomSingle& other ) : TeVector()
+	{
+		box_    = other.box_;
+		geomId_ = other.geomId_;
+		objectId_ = other.objectId_;
+		elem_ = other.elem_;
+	}
+
+	//! Equal Operator
+	TeGeomSingle& operator = ( const TeGeomSingle& other )
+	{
+		box_    = other.box_;
+		geomId_ = other.geomId_;
+		objectId_ = other.objectId_;
+		elem_ = other.elem_;
+		return *this;
+	}
+
+	//! Destructor
+	virtual ~TeGeomSingle<T>() {}
+
+	//! Changes the unique element
+	void add ( T& elem )
+	{
+		elem_ = elem;
+		box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT); // invalidates its box
+		updateBox ( box_, elem );
+	}
+
+	//! Returns the unique element
+	T&	location ()
+	{	return elem_; }
+
+	//! Returns the unique element
+	const T& location () const
+	{	return elem_; }
+
+	//! Returns the unique element
+	T& elem ()
+	{	return elem_; }
+
+	//! Returns the unique element
+	T& operator [] ( int /* i */) 
+	{	return elem_; }
+
+	//! Returns TRUE if a TeGeomSingle is equal to other
+	bool operator== (const T& other) const
+	{	return elem_ == other.elem(); }
+
+	//! Returns the size of a TeGeomSingle: always 1
+	int size() { return 1; }
+
+protected:
+	T	elem_;
+
+};
+
+//!  TeGeomComposite: A template class for handling a hierarchy of geometries in TerraLib
+/*!
+
+	  Used for instantiating the different geometries. Provide a vector to store the 2D 
+	  coordinates of a ring. Multiple copies of a geometry are allowed to share the same 
+	  coordinates by means of a "handle/body"  idiom.
+
+	\sa  TeLine2D TePolygon TeLineSet TePolygonSet
+*/
+
+template <class T>  
+class TeGeomComposite: public TeVector
+{
+public:
+
+	//! Constructor
+	TeGeomComposite()
+	{
+		pImpl_ = new TeComposite<T>;
+		pImpl_->attach();
+	}
+
+	//! Destructor
+	virtual ~TeGeomComposite()
+	{	pImpl_->detach();	}
+
+
+	//! Copy Constructor
+	TeGeomComposite ( const TeGeomComposite& other ) : TeVector()
+	{
+		pImpl_ = other.pImpl_;
+		pImpl_->attach();
+		box_    = other.box_;
+		geomId_ = other.geomId_;
+		objectId_ = other.objectId_;
+	}
+
+	//! Operator =
+	TeGeomComposite& operator= ( const TeGeomComposite& other )
+	{
+		if ( this != &other )
+		{	
+			other.pImpl_->attach();
+			pImpl_->detach();
+			pImpl_  = other.pImpl_;
+			box_    = other.box_;
+			geomId_ = other.geomId_;
+			objectId_ = other.objectId_;
+		}
+		return *this;
+	}
+
+	virtual string objectId() const
+	{ return objectId_; }
+
+	virtual void objectId (const string& id )
+	{ 
+		objectId_ = id; 
+		typename TeComposite<T>::iterator it = pImpl_->begin();
+		while (it != pImpl_->end())
+		{
+			it->objectId(id);
+			++it;
+		}
+	}
+
+	//! Copy two composites, duplicating elements (breaking handle/body idiom)
+	void copyElements ( const TeGeomComposite& other )
+	{
+		box_    = other.box_;
+		geomId_ = other.geomId_;
+		objectId_ = other.objectId_;
+
+		for (unsigned int i = 0; i < other.pImpl_->size(); i++)
+			pImpl_->add (other.pImpl_->operator[](i));
+	}
+
+	//! Returns TRUE if two composites have exactly the same elements
+	bool operator== (const T& other) const
+	{	
+		if ( this->size() != other.size() )
+			return false;
+
+		for (unsigned int i = 0; i < other.pImpl_->size(); i++)
+			if ( (pImpl_->operator[](i))==(other.pImpl_->operator[]( i )) )
+				return false;
+		return true; 
+	}
+
+	//! Adds a new component
+	void add ( const T& elem )
+	{	
+		pImpl_->add ( elem );
+		updateBox ( box_, elem );
+	}
+
+	//! Removes the i-th component
+	bool erase ( int i )
+	{ 	
+		bool status = pImpl_->erase (i);
+
+		if (status)	// recalculates the box
+		{
+			box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT);
+			for (unsigned int j = 0; j < pImpl_->size(); j++)
+				updateBox(box_,pImpl_->operator[](j));
+		}
+		return status;
+	}
+
+	//! Removes an element
+	bool erase ( T& object )
+	{	
+		bool status = pImpl_->erase ( object ); 
+		if (status)	// recalculates the box
+		{
+			box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT);
+			for (unsigned int j = 0; j < pImpl_->size(); j++)
+				updateBox(box_,pImpl_->operator[](j));
+		}
+		return status;
+	}
+
+	//! Removes the element pointed by an interator
+	typename TeComposite<T>::iterator erase(typename TeComposite<T>::iterator it)
+	{	
+		typename TeComposite<T>::iterator res = pImpl_->erase(it); 
+		box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT);
+		for (unsigned int j = 0; j < pImpl_->size(); j++)
+			updateBox(box_,pImpl_->operator[](j));
+		return res;
+	}
+
+	//! Removes all elements
+	void clear ()
+	{	
+		pImpl_->clear ();		// remove all elements
+		box_ = TeBox(TeMAXFLOAT, TeMAXFLOAT,-TeMAXFLOAT,-TeMAXFLOAT); // invalidates its box
+	}
+	
+	//! Returns the size of the composite
+	unsigned int size() const
+	{	return pImpl_->size(); }
+
+	//! Reserves space for a given number of elements (reserve is available for vectors)  
+	void reserve(int nelem)
+	{ pImpl_->reserve(nelem); }
+
+	//! Returns the i-th element
+	T& operator [] ( int i ) const
+	{	return pImpl_->operator[] ( i ); }
+
+	//! Returns the first element
+	T& first() const
+	{	return pImpl_->operator[] ( 0 ); }
+	
+	//! Returns the i-th element
+	T& last() const
+	{	return pImpl_->operator[] ( pImpl_->size()-1 ); }
+	
+	//! Returns TRUE if composite is empty
+	bool empty () const
+	{	return pImpl_->empty (); }
+
+	//! An Iterator that enables forward traversal of a TeGeomComposite
+	typedef typename TeComposite<T>::iterator iterator;
+
+	//! The type of the value obtained by dereferencing a TeGeomComposite iterator
+//	typedef typename T value_type;
+	typedef  T value_type;
+
+	//! The iterator to the first position in the TeGeomComposite
+	typename TeComposite<T>::iterator begin()
+	{ return pImpl_->begin(); }
+
+	//! The iterator to the first position in the TeGeomComposite
+	typename TeComposite<T>::iterator const begin() const
+	{ return pImpl_->begin(); }
+
+	//! The iterator to the last plus one position in the TeGeomComposite
+	typename TeComposite<T>::iterator end()
+	{ return pImpl_->end(); }
+
+	//! The iterator to the last plus one position in the TeGeomComposite
+	typename TeComposite<T>::iterator const end() const
+	{ return pImpl_->end(); }
+
+	//! An Iterator that enables backward traversal of a TeGeomComposite
+	typedef typename TeComposite<T>::reverse_iterator reverse_iterator;
+
+	//! The iterator to the first position in the TeGeomComposite in reverse order
+	typename TeComposite<T>::reverse_iterator rbegin()
+	{ return pImpl_->rbegin(); }
+
+	//! The iterator to the last plus one position in the TeGeomComposite in reverse order
+	typename TeComposite<T>::reverse_iterator rend()
+	{ return pImpl_->rend(); }
+
+protected:
+
+	//! Pointer to the implementation of a composite<T>
+	TeComposite<T> * pImpl_; 
+};
+
+//!  TeLine2D: Supports a simple 2D line,  composed of 2D xy points
+/*!
+	\sa TeGeometry TeLinearRing
+*/
+class TeLine2D : public TeGeomComposite<TeCoord2D> {
+public:
+
+// -- Methods
+
+	//! Check if a line2D is a closed ring
+	bool isRing() const;	
+
+	string objectId() const
+	{ return objectId_; }
+	
+	void objectId (const string& id )
+	{  objectId_ = id; }
+
+	TeGeomRep elemType() { return TeLINES; }
+
+};
+
+//!  TeLineSet: Supports a composite of lines
+/*!
+  \sa TeGeomComposite
+*/
+class TeLineSet: public TeGeomComposite<TeLine2D>
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TeLINES; }
+
+	void copyElements (const TeLineSet& other ); 
+}; 
+
+//!  TeLinearRing: Provides support for a 2D linear ring
+/*!
+	 A linear ring is a 2D line (without self-intersections) whose 
+	 first point is the same as the last point.  A linear ring cannot be created 
+	 directly, but is instantiated from a 2D line.
+
+   \sa TePolygon 
+*/
+class TeLinearRing : public TeLine2D  {
+public:
+
+	//! Empty constructor
+	TeLinearRing() : TeLine2D() {}
+
+	//! Contructor from a line
+	TeLinearRing ( TeLine2D& line );
+
+};
+
+
+//!  TePolygon: A class for handling 2D polygons. 
+/*!
+	In TerraLib, a 2D polygon consists of an outer ring and a list
+	of inner rings 
+*/
+class  TePolygon: public TeGeomComposite<TeLinearRing>  
+{
+public:
+	
+	TeGeomRep elemType() { return TePOLYGONS; }
+
+	void copyElements ( const TePolygon& other );
+};
+
+//!  TePolygonSet: A class for handling sets of 2D polygons. 
+class TePolygonSet: public TeGeomComposite<TePolygon> 
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TePOLYGONS; }
+
+	void copyElements ( const TePolygonSet& other );
+};
+
+	
+//!  TePoint: A class for handling 2D Points. 
+class  TePoint : public TeGeomSingle<TeCoord2D>
+{
+public:
+	//! Default constructor
+	TePoint(const double& x = 0., const double& y = 0. ):
+		TeGeomSingle<TeCoord2D> ( )
+	{
+			elem_ = TeCoord2D(x,y);
+			setBox(TeBox(x,y,x,y)); // the box of a point is the point itself
+	}
+
+	TePoint(TeCoord2D& c):
+		TeGeomSingle<TeCoord2D> ( )
+	{
+			elem_ = c;
+			setBox(TeBox(c.x(),c.y(),c.x(),c.y())); // the box of a point is the point itself
+	}
+
+	TeGeomRep elemType() { return TePOINTS; }
+
+	string objectId() const
+	{ return objectId_; }
+	
+	void objectId (const string& id )
+	{  objectId_ = id; }
+};
+
+//!  TePointSet:  A class for handling sets of 2D polygons. 
+class TePointSet: public  TeGeomComposite<TePoint> 
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TePOINTS; }
+};
+
+//!  TeText : A class for handling text.
+class  TeText: public TeGeomSingle<TeCoord2D>
+{
+public:
+	//! Default contructor
+	/*!
+      \param txt the string of character that form the text (default is an empty string)
+	*/
+	TeText(const string& txt="" ):
+		TeGeomSingle<TeCoord2D> ( ),
+		angle_(0),
+		height_(0),
+		textValue_(txt),
+		alignmentVert_(0),
+		alignmentHoriz_(0)
+	{
+		elem_ = TeCoord2D(0,0);
+		setBox(TeBox(0.0,0.0,0.0,0.0));
+	}
+
+	//! Constructor
+	/*!
+		\param location basic position of the text
+		\param txt the string of character that form the text (default is an empty string)
+	*/
+
+	TeText( TeCoord2D& location, const string& txt="" ):
+		TeGeomSingle<TeCoord2D> ( location ),
+		angle_(0),
+		height_(0),
+		textValue_(txt),
+		alignmentVert_(0),
+		alignmentHoriz_(0)
+	{
+		setBox(TeBox(location,location));
+	}
+
+	//! Copy constructor
+	TeText(const TeText& other ) : TeGeomSingle<TeCoord2D>()
+	{
+		angle_ = other.angle_;
+		height_ = other.height_;
+		textValue_ = other.textValue_;
+		alignmentVert_ = other.alignmentVert_;
+		alignmentHoriz_ = other. alignmentHoriz_;
+		setBox(other.box());
+		elem_ = other.elem_;
+		geomId_ = other.geomId_;
+		objectId_ = other.objectId_;
+	}
+
+	//! Operator =
+	TeText& operator= ( const TeText& other )
+	{
+		if ( this != &other )
+		{	
+			angle_ = other.angle_;
+			height_ = other.height_;
+			textValue_ = other.textValue_;
+			alignmentVert_ = other.alignmentVert_;
+			alignmentHoriz_ = other. alignmentHoriz_;
+			setBox(other.box());
+			elem_ = other.elem_;
+			geomId_ = other.geomId_;
+			objectId_ = other.objectId_;
+		}
+		return *this;
+	}
+
+	//! Returns TRUE if a text is equal to other
+	bool operator== (const TeText& tx) const 
+	{
+		return (angle_ == tx.angle_ &&
+			height_ == tx.height_ &&
+			textValue_ == tx.textValue_ &&
+			alignmentVert_ == tx.alignmentVert_ &&
+			alignmentHoriz_ == tx.alignmentHoriz_ &&
+			elem_ == tx.elem_ &&
+			geomId_ == tx.geomId_ &&
+			objectId_ == tx.objectId_);
+	}
+
+	//! Sets anew value for the location of the text
+	void setLocation(TeCoord2D& l)
+	{	elem_ = l; setBox(TeBox(l,l));	}
+
+	//! Returns the string value of a text
+	string textValue () const
+	{ return textValue_; }
+	
+	//! Sets the string value of a text
+	void setTextValue (const string &text) 
+	{ textValue_ = text; }
+
+	//! Returns the text inclination
+	double angle () const
+	{ return angle_; }
+
+	//! Sets the text inclination
+	void setAngle (double angle) 
+	{ angle_ = angle; }
+
+	//! Returns the text height
+	double height () const
+	{ return height_ ; }
+
+	//! Sets the text height
+	void setHeight (double height) 
+	{ height_ = height; }
+
+	//! Returns the text vertical alignment
+	double alignmentVert () const
+	{ return alignmentVert_ ; }
+
+	//! Sets the text vertical alignment
+	void setAlignmentVert (double alig) 
+	{ alignmentVert_ = alig; }
+
+	//! Returns the text horizontal alignment
+	double alignmentHoriz () const
+	{ return alignmentHoriz_ ; }
+
+	//! Sets the text horizontal alignment
+	void setAlignmentHoriz (double alig) 
+	{ alignmentHoriz_ = alig; }
+
+	TeGeomRep elemType() { return TeTEXT; }
+
+private:
+	double angle_;	
+	double height_;
+	string textValue_;
+	double alignmentVert_;
+	double alignmentHoriz_;
+};
+
+
+//!  TeTextSet : A class for handling sets of TeText.
+class  TeTextSet : public TeGeomComposite<TeText> 
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure
+	TeGeomRep elemType() { return TeTEXT; }
+
+};
+
+
+//! TeNode:  A class for handling 2D Nodes.
+class  TeNode: public TeGeomSingle<TeCoord2D>
+{
+public:
+	//! Returns TRUE if nodes are equal
+	bool operator== (const TeNode& node) const
+	{
+		TeCoord2D p1 = elem_;
+		TeCoord2D p2 = node.elem_;
+		return p1==p2;
+	}
+
+	//! Outputs the geometrical identification of a node
+	ostream& operator<<(ostream& os)
+	{
+		os << Te2String(geomId_);
+		return os;
+	}
+
+	TeGeomRep elemType() { return TeNODES; }
+
+};
+
+//! Outputs the geometrical identification of a node
+ostream& operator<<(ostream& os, TeNode& N);
+
+//!  TeNodeSet :  A class for handling sets of 2D Nodes. 
+class  TeNodeSet : public TeGeomComposite<TeNode> 
+
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure
+	TeGeomRep elemType() { return TeNODES; }
+
+};
+
+//!  TeArc : Provides support for a 2D arc.
+class TeArc : public TeVector 
+{
+public:
+
+	//! Empty contructors
+	TeArc(): ifrom_ (-1), ito_ (-1){}
+
+	//! Construtor
+	/*!
+		\param from the starting node of an arc
+		\param to the ending node of an arc
+	*/
+	TeArc(TeNode& from, TeNode& to)
+	{
+		from_ = from;
+		to_ = to;
+		updateBox ( box_, from );
+		updateBox ( box_, to );
+	}
+
+	//! Construtor
+	/*!
+		\param from the geometrical identification of the  starting node of an arc
+		\param to the geometrical identification of the ending node of an arc
+	*/
+	TeArc(int from, int to): ifrom_ (from), ito_ (to) {}
+
+// -- Methods
+
+	//! Returns the starting node 
+	TeNode& fromNode () 
+	{ return from_; }
+
+	//! Returns the ending node 
+	TeNode& toNode () 
+	{ return to_; }
+
+	//! Returns the geometrical identification of the starting node 
+	int fromId () const
+	{ return ifrom_; }
+
+	//! Sets the geometrical identification of the starting node 
+	void fromId (int i) 
+	{ ifrom_ = i; }
+
+	//! Returns the geometrical identification of the ending node 
+	int toId () const
+	{ return ito_; }
+
+	//! Sets the geometrical identification of the ending node 
+	void toId (int i)
+	{ ito_ = i; }
+	
+	//! Sets the starting and ending node 
+	void setNodes (TeNode& from, TeNode& to)
+	{ 
+		from_ = from;
+		to_ = to;
+		updateBox ( box_, from );
+		updateBox ( box_, to );
+	}
+
+	TeGeomRep elemType() { return TeARCS; }
+
+private:
+
+	TeNode	from_, to_;
+	int		ifrom_, ito_;
+};
+//! Outputs the description of an arc
+ostream& operator<<(ostream& os, const TeArc& N);
+
+
+//!  TeArcSet: Provides support for a set of 2D arc.
+class TeArcSet: public TeGeomComposite <TeArc> 
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TeARCS; }
+};
+
+//!  TeSample: A class for handling 2D Points with an associated measure.
+class TeSample: public TeGeomSingle<TeCoord2D>, public TeMeasure
+{
+public:
+	//! Constructor
+	/*!
+		\param location the position of the sample
+		\param measure the value associated to the sample
+	*/
+	TeSample ( TeCoord2D& location, double measure = 0.  ):
+		TeGeomSingle<TeCoord2D> ( location ), TeMeasure ( measure ) {}
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//!  TeSampleSet: A class for handling sets of 2D samples
+class TeSampleSet: public TeGeomComposite<TeSample>
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//!  TeContourLine: A class for handling 2D countour lines
+class TeContourLine: public TeLine2D, public TeMeasure
+{
+public:
+	//! Constructor
+	/*!
+		\param line the contour line
+		\param measure the value associated to the contour line
+	*/
+	TeContourLine ( TeLine2D& line, double measure = 0. )
+		: TeLine2D ( line ), TeMeasure ( measure )
+	{}
+};
+
+
+//!  TeContourLineSet: A class for handling sets of 2D countour lines
+class TeContourLineSet: public  TeGeomComposite <TeContourLine> 
+{
+public:
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+
+//!    A class for handling cells. 
+class  TeCell : public TeVector 
+{
+	int column_;	//!< the column number of this cell	
+	int line_;		//!< the line number of this cell
+
+public:
+	//! Empty constructor
+	TeCell():
+	  column_(-1),
+	  line_(-1) {}
+
+	TeCell(TeBox& box, int col, int lin):
+	  column_(col),
+	  line_(lin) { setBox(box); }
+
+	//! Returns the column identification of the cell
+	int	column () const
+	{ return column_; }
+
+	//! Sets the column identification of the cell
+	void column (int column) 
+	{ column_ =  column; }
+
+	//! Returns the line identification of the cell
+	int	line () const
+	{ return line_; }
+
+	//! Sets the line identification of the cell
+	void line (int line) 
+	{ line_ =  line; }
+
+	TeGeomRep elemType() { return TeCELLS; }
+};
+
+//!  A class for handling sets of cells.
+class TeCellSet: public  TeGeomComposite<TeCell> 
+{
+	double	resX_;	//!< the X resolution of a set of cells
+	double	resY_;	//!< the Y resolution of a set of cells
+
+public:
+
+	//! Returns the X resolution of a cell set
+	double resX () const
+	{ return resX_; }
+
+	//! Returns the Y resolution of a cell set
+	double resY () const
+	{ return resY_; }
+
+	//! Sets the X resolution of a cell set
+	void resX (double reX) 
+	{ resX_ = reX; }
+
+	//! Sets the Y resolution of a cell set
+
+	void resY (double reY) 
+	{ resY_ = reY; }
+
+	//! Returns the basic geometry in a set of geometries structure 
+	TeGeomRep elemType() { return TeCELLS; }
+
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeGeometryAlgorithms.cpp b/src/terralib/kernel/TeGeometryAlgorithms.cpp
new file mode 100644
index 0000000..ec374d8
--- /dev/null
+++ b/src/terralib/kernel/TeGeometryAlgorithms.cpp
@@ -0,0 +1,2695 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*
+ * Verficar os lugares em que usa safeintersections pois talvez ter� que fazer o sort
+ */
+
+#include "TeAssertions.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeDefines.h"
+
+#include "TeIntersector.h"
+#include "TeFragmentation.h"
+
+#include <algorithm>
+#include <set>
+
+
+using namespace std;
+
+//---------- Local Functions ans Structures ----------//
+
+//! Instead of using arctan, use this to compare angles, so given two points return a number to be used in place of the angle formed by the segment.
+double Theta(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	register double dx = c2.x() - c1.x();
+	register double ax = fabs(dx);
+	register double dy = c2.y() - c1.y();
+	register double ay = fabs(dy);
+	register double t = 0.0;
+
+	if((dx == 0.0) && (dy == 0.0))
+		t = 0.0;
+	else
+		t = dy / (ax + ay);
+
+	if(dx < 0.0)
+		t = 2 - t;
+	else
+		if(dy < 0.0)
+			t = 4.0 + t;
+
+	return t * 90.0;
+}
+
+//! This struct is used for compare angles between two points and an anchor.
+struct ThetaOrder
+{
+	//! A fixed coordinate to be used to compare.
+	TeCoord2D anchor;
+
+	ThetaOrder(const TeCoord2D& c)
+		: anchor(c)
+	{
+	}
+
+	// Return true if c1 and anchor has a smaller angle than c2 and anchor.
+	bool operator()(const TeCoord2D& c1, const TeCoord2D& c2) const
+	{
+		register double t1 = Theta(anchor, c1);
+		register double t2 = Theta(anchor, c2);
+
+		if(t1 < t2)
+			return true;
+		
+		if(t1 > t2)
+			return false;
+
+		if(c1.x() < c2.x())
+			return true;
+
+		if(c1.x() > c2.x())
+			return false;
+
+		return false;		
+	}
+};
+
+/*! \struct xOrder
+    \brief  Returns true if c1 < c2 otherwise, returns false.
+ */
+template<class T> struct xOrder
+{
+	bool operator()(T c1, T c2)
+	{
+		if(c1.x() < c2.x())
+			return true;
+
+		if(c1.x() > c2.x())
+			return false;
+
+		if(c1.y() < c2.y())
+			return true;		
+
+		return false;
+	}
+};
+
+/*! \fn double TeArea(TeLinearRing& r);
+    \brief This function returns twice the area of a ring treated as a simple polygon (no holes).
+	\param r  The ring.
+
+	This function returns twice the area of a ring treated as a simple polygon (no holes).
+	May return a negative number => it will be used in Orientation tests.
+*/
+double Te2Area(const TeLinearRing& r)
+{
+	double S2 = 0.0;
+
+	TeLinearRing::iterator it = r.begin();
+	TeLinearRing::iterator end = r.end() - 1;
+	while(it != end)
+	{
+		S2 += (it->x() + (it + 1)->x()) * ((it + 1)->y() - it->y());
+		++it;
+	}
+
+	return S2;
+}
+
+/*! \fn short TeConverseRelation(const short& rel)
+    \brief This function returns the complements relation of one given relation.
+	\param rel  The relation.
+*/
+inline short ConverseRelation(const short& rel)
+{
+	switch(rel)
+	{
+		case TeCOVEREDBY  :  return TeCOVERS;
+		case TeWITHIN     :  return TeCONTAINS;
+		case TeCOVERS     :  return TeCOVEREDBY;
+		case TeCONTAINS   :  return TeWITHIN;
+		default			  :  return rel;
+	}	
+}
+
+/*! \fn bool MayTouches(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeReportTree& report)
+    \brief This function verifies if the two lines may touches.
+	\param lRed   The first line.
+	\param lBlue  The second line.
+	\param report The intersection point list.
+*/
+bool MayTouches(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeVectorBoundaryIP& report)
+{
+	if(lRed.isRing() && lBlue.isRing())
+		return false;
+
+	TeINTERSECTOR2::TeVectorBoundaryIP::iterator it = report.begin();
+	TeINTERSECTOR2::TeVectorBoundaryIP::iterator it_end = report.end();
+
+
+	// Get the boundaries' coordinate.
+	TeCoord2D line1_boundary1 = lRed[0];
+	TeCoord2D line1_boundary2 = lRed[lRed.size() - 1u];
+
+	TeCoord2D line2_boundary1 = lBlue[0];
+	TeCoord2D line2_boundary2 = lBlue[lBlue.size() - 1u];
+
+	// Verifies if intersection points are on boundary of one of the blue line
+	while(it != it_end)
+	{	// Get intersection point coordinate.
+
+		for(unsigned int i = 0; i < it->coords_.size(); ++i)
+		{
+			TeCoord2D ip_coord = it->coords_[i];
+
+			if(lRed.isRing())
+			{
+				if(!(TeEquals(ip_coord, line2_boundary1) || TeEquals(ip_coord, line2_boundary2)))
+					return false;
+			}
+			else if(lBlue.isRing())
+			{
+				if(!(TeEquals(ip_coord, line1_boundary1) || TeEquals(ip_coord, line1_boundary2)))
+					return false;
+			}
+			else
+			{
+				if(!(TeEquals(ip_coord, line1_boundary1) || TeEquals(ip_coord, line1_boundary2) || TeEquals(ip_coord, line2_boundary1) || TeEquals(ip_coord, line2_boundary2)))
+					return false;
+			}
+		}
+
+		++it;
+	}
+
+	return true;		// The lines touches.
+}
+
+/*! \fn short Relation(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeReportTree& report, const short& relation)
+    \brief This function returns the relation between two lines.
+	\param lRed     The first line.
+	\param lBlue    The second line.
+	\param report   The intersection point list.
+	\param relation The relation that stop the search.
+
+	This function returns the relation between lines. May be: TeDISJOINT, TeTOUCHES, TeWITHIN, TeCROSSES, TeCOVEREDBY, TeEQUALS.
+	Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short Relation(const TeLine2D& lRed, const TeLine2D& lBlue, TeINTERSECTOR2::TeVectorBoundaryIP& report, const short& relation)
+{
+	if(report.size() == 0u)
+		return TeDISJOINT;
+
+	// Do fragmentation
+	//bool hasContour = false;	// This will decide between CROSSES and OVERLAPS.
+
+	bool mayTouches = MayTouches(lRed, lBlue, report);
+
+	// Stop to check, because touches can't occur anymore
+	if(relation == TeTOUCHES && !mayTouches)
+		return TeUNDEFINEDREL;
+
+
+	TeLineSet redFragments;
+	TeLineSet redBoundaryFragments;
+	TeLine2D lRedAux;
+	lRedAux.copyElements(lRed);
+	TeLineSet lSet; lSet.add(lRedAux);
+
+	TeFragmentBoundary(lSet, report, redBoundaryFragments, redFragments);
+
+	unsigned int redFragmentsSize = redFragments.size();
+
+	short mask = TeUNKNOWNPOSITION;
+
+	if(redBoundaryFragments.size() > 0u)
+		mask |= TeINSIDE;
+
+	// Do a position test for each fragment and stop if all relations have been found.
+	for(unsigned int j = 0u; j < redFragmentsSize; ++j)
+	{	
+		TeCoord2D middle;			
+
+		if(redFragments[j].size() ==  2u)	// If the fragment has two points I need to check the middle point of this fragment.
+			TeGetMiddlePoint(redFragments[j][0u], redFragments[j][1u], middle);
+		else	// If the fragment has more than two points so I check one point between the end points.
+			middle = redFragments[j][(unsigned int)((double(redFragments[j].size()) / 2.0 + 0.5)) - 1];
+
+		if(TeIsOnLine(middle, lBlue))
+			mask |= TeINSIDE;
+		else
+			mask |= TeOUTSIDE;		
+
+		if((mask & TeOUTSIDE) && (mask & TeINSIDE))
+			break;		
+	}
+
+	// If the intersection is only at end points and there is no part of red line inside blue line so they touches
+	if(mayTouches && mask == TeOUTSIDE)
+	{
+		return TeTOUCHES;
+	}
+	
+	// Stop to check, because touches can't occur anymore
+	if(relation == TeTOUCHES)
+		return TeUNDEFINEDREL;
+
+
+	// if there is no fragments in line blue interiors, so line red cross line blue
+	if(mask == TeOUTSIDE)
+		return TeCROSSES;
+
+	// Stop to check, because crosses can't occur anymore
+	if(relation == TeCROSSES)
+		return TeUNDEFINEDREL;
+
+	TeCoord2D firstRedCoord = lRed[0];
+	TeCoord2D lastRedCoord  = lRed[lRed.size() - 1];
+
+	TeCoord2D firstBlueCoord = lBlue[0];
+	TeCoord2D lastBlueCoord  = lBlue[lBlue.size() - 1];		
+
+
+	// If there is no part of red line outside blue line => must decide within, covered by and equals
+	if(!(mask & TeOUTSIDE))
+	{
+		// So, if we arrived here, blue line contains red line, but needs to decide between equal, coveredby and within.
+
+		if(TeEquals(firstRedCoord, firstBlueCoord) || TeEquals(firstRedCoord, lastBlueCoord))
+		{
+			if(TeEquals(lastRedCoord, firstBlueCoord) || TeEquals(lastRedCoord, lastBlueCoord))
+			{
+				return TeEQUALS;
+			}
+			else
+			{
+				if(lBlue.isRing())
+					return TeWITHIN;
+				else
+					return TeCOVEREDBY;
+			}
+		}
+
+		if(TeEquals(lastRedCoord, firstBlueCoord) || TeEquals(lastRedCoord, lastBlueCoord))
+		{
+			if(lBlue.isRing())
+				return TeWITHIN;
+			else
+				return TeCOVEREDBY;
+		}
+
+		return TeWITHIN;
+	}
+
+	return TeUNDEFINEDREL;
+}
+
+/*! \fn short Relation(const TeLine2D& line, const TeLinearRing& ring, const short& relation)
+    \brief This function returns the relation between a line and a linear ring (treated as a simple polygon with no holes).
+	\param line     The line.
+	\param ring     The simple polygon ring.
+	
+	This function returns how the points of input line are related with interior, boundary, and
+	exterior of polygon. The mask may be a combination of the following values: TeOUTSIDE, TeINSIDE and TeBOUNDARY.
+	Obs: Do box elimination.
+*/
+short Relation(const TeLine2D& line, const TeLinearRing& ring)
+{
+	if(TeDisjoint(line.box(), ring.box()))
+		return TeOUTSIDE;
+
+	TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+	if(TeINTERSECTOR2::TeSafeIntersections(line, ring, report))
+	{
+		short mask = TeBOUNDARY;	// It will be at least intersections between boundaries.
+
+		// Fragments line.
+		TeLineSet lSet;
+		TeLineSet boundaryFragments;
+		TeLine2D lineAux;
+		lineAux.copyElements(line);
+		TeLineSet auxLineSet; auxLineSet.add(lineAux);
+		
+		TeFragmentBoundary(auxLineSet, report, boundaryFragments, lSet);
+
+
+		unsigned int lSetSize = lSet.size();
+
+		// Do a position test for each fragment and stop if al relations has been found.
+		for(unsigned int j = 0; j < lSetSize; ++j)
+		{	
+			TeCoord2D middle;
+			
+			if(lSet[j].size() ==  2)	// If the fragment has two points I need to check the middle point of this fragment.
+				TeGetMiddlePoint(lSet[j][0], lSet[j][1], middle);
+			else	// If the fragment has more than two points so I check one point between the end points.
+				middle = lSet[j][(unsigned int)((double(lSet[j].size()) / 2.0 + 0.5)) - 1];
+
+			
+			mask |= TeRelation(middle, ring);
+
+			if((mask & TeOUTSIDE) && (mask & TeINSIDE))
+				break;			
+		}
+
+		return mask;
+	}
+	else
+		return TeRelation(line[0], ring);	// Needs to test only one point of the line, and its location defines the line location.
+}
+
+/*! \fn short TopologicRelation(const TeLine2D& line, const TeLinearRing& r)
+    \brief This function returns the relation between a line and a linear ring (treated as a simple polygon with no holes).
+	\param line     The line.
+	\param r        The simple polygon ring.
+
+	This function returns the topologic relation between the line and
+	the ring. The result may be: DISJOINT, WITHIN, TOUCHES, CROSSES or COVERED BY.
+	Obs: Doesn't do box elimination. Just uses from TeRelation.
+*/
+short TopologicRelation(const TeLine2D& line, const TeLinearRing& r)
+{
+	short mask = Relation(line, r);
+
+	if(mask & TeBOUNDARY)	// TOUCHES or CROSSES or COVERED BY
+	{
+		if(mask & TeOUTSIDE)	// TOUCHES or CROSSES
+		{
+			if(mask & TeINSIDE)
+				return TeCROSSES;
+			else
+				return TeTOUCHES;
+		}
+		else	// COVERED BY
+			return TeCOVEREDBY;
+
+	}
+	else	// DISJOINT or WITHIN
+	{
+		if(mask & TeINSIDE)	
+			return TeWITHIN;
+		else				
+			return TeDISJOINT;
+	}
+}
+
+/*! \fn short TopologicRelation(const TeLinearRing& rRed, const TeLinearRing& rBlue)
+    \brief This function returns the relationship between two rings (treated as simple polygons with no holes).
+	\param rRed  The ring to test relationship.
+	\param rBlue The ring to test relationship.
+
+	This function returns the relationship between two rings.
+*/
+short TopologicRelation(const TeLinearRing& rRed, const TeLinearRing& rBlue)
+{
+	// See the intersection between the points of rRed and the three components of rBlue (Boundary, Exterior, Interior)
+	short rel = Relation(rRed, rBlue);
+
+	if((rel & TeOUTSIDE) && (rel & TeINSIDE) && (rel & TeBOUNDARY))
+		return TeOVERLAPS;
+
+	if((rel & TeOUTSIDE) && !(rel & TeINSIDE) && (rel & TeBOUNDARY))
+	{
+		if(TeWithinOrCoveredByOrEquals(rBlue.box(), rRed.box()))
+		{
+			short rel_aux = Relation(rBlue, rRed);
+
+			if((rel_aux & TeINSIDE) && !(rel_aux & TeOUTSIDE) && (rel_aux & TeBOUNDARY))
+				return TeCOVERS;
+		}
+		
+		return TeTOUCHES;
+	}
+
+	if((rel & TeOUTSIDE) && !(rel & TeINSIDE) && !(rel & TeBOUNDARY))
+	{
+		if(TeWithinOrCoveredByOrEquals(rBlue.box(), rRed.box()))
+		{
+			if(TeRelation(rBlue[0], rRed) == TeINSIDE)
+				return TeCONTAINS;
+		}
+		
+		return TeDISJOINT;
+	}
+
+	if(!(rel & TeOUTSIDE) && (rel & TeINSIDE) && !(rel & TeBOUNDARY))
+		return TeWITHIN;
+
+	if(!(rel & TeOUTSIDE) && (rel & TeINSIDE) && (rel & TeBOUNDARY))
+		return TeCOVEREDBY;
+
+	if(rel == TeBOUNDARY)
+		return TeEQUALS;
+
+	return TeINTERSECTS;
+}
+
+/*! \fn short TeTopologicRelation(const TeLinearRing& rRed, const TeLinearRing& rBlue, vector<TeLinearRing>& rings, short& rel)
+    \brief This function returns the relationship between the ring and the polygon inner rings.
+	\param rRed  The ring to test relationship.
+	\param pBlue The polygon to test relationship.
+	\param rings Inner rings from blue polygon that is inside or is covered by red external polygon.
+	\param rel   The relation between external red ring and external blue ring.
+
+	This function returns the relationship between the ring and the polygon inner rings.
+*/
+short LookAtInnerRings(const TeLinearRing& rRed, const TePolygon& pBlue, vector<TeLinearRing>& rings, short& rel)
+{
+	register unsigned int i = 1;
+	register unsigned int nRings = pBlue.size();
+
+	for(; i < nRings; ++i)
+	{
+		switch(TopologicRelation(rRed, pBlue[i]))
+		{
+			case TeCOVEREDBY : return TeTOUCHES;
+
+			case TeWITHIN	 : return TeDISJOINT;
+
+			case TeOVERLAPS  : return TeOVERLAPS;
+
+			case TeEQUALS    : return TeTOUCHES;
+
+			case TeDISJOINT  : continue;	// this ring is outside the external ring, so it doesn't contribute to the relationship.
+
+			case TeTOUCHES    : rel = TeCOVEREDBY;	// change rel if rel is within.
+				                continue;
+
+			case TeCOVERS    : rings.push_back(pBlue[i]);
+							   rel = TeCOVEREDBY;
+							   break;
+
+			case TeCONTAINS  : rings.push_back(pBlue[i]);
+							   break;
+		}
+	}
+
+	return TeUNDEFINEDREL;
+}
+
+/*! \fn short TestInnerRings(const TePolygon& pRed, vector<TeLinearRing>& rings)
+    \brief This function returns the relationship between the ring and the polygon inner rings.
+	\param pRed  The inner rings from pRed to test relationship.
+	\param rings Inner rings from blue polygon that is inside or is covered by red external polygon.
+
+	This function returns the relationship between the inner ring of pRed and the inner rings in rings.
+*/
+short TestInnerRings(const TePolygon& pRed, vector<TeLinearRing>& rings)
+{
+	unsigned int nRedRings = pRed.size();
+	unsigned int nBlueRings = rings.size();
+
+	if((nRedRings - 1) != nBlueRings)
+		return TeOVERLAPS;
+
+	unsigned int i = 1;
+	unsigned int j = 0;
+
+	bool find = false;
+
+	set<unsigned int> blueRingsProcessed;
+
+	set<unsigned int> redRingsContainsCovers;
+
+	short rel = TeUNDEFINEDREL;
+
+	for(; i < nRedRings; ++i)
+	{
+		find = false;
+
+		for(j = 0; j < nBlueRings; ++j)
+		{
+			if(blueRingsProcessed.find(j) != blueRingsProcessed.end())
+				continue;
+
+			switch(TopologicRelation(pRed[i], rings[j]))
+			{
+				case TeDISJOINT  : continue;	// so it doesn't contribute to the relationship yet.
+
+				case TeEQUALS    :
+									rel |= TeEQUALS;
+					                blueRingsProcessed.insert(j);
+									find = true;
+									break;
+
+				case TeCONTAINS  :
+									if(redRingsContainsCovers.find(i) != redRingsContainsCovers.end())
+										return TeOVERLAPS;
+									
+									rel |= TeCONTAINS;
+
+									redRingsContainsCovers.insert(i);
+									blueRingsProcessed.insert(j);
+									find = true;
+									break;
+
+				case TeCOVERS	:
+									if(redRingsContainsCovers.find(i) != redRingsContainsCovers.end())
+										return TeOVERLAPS;
+									
+									rel |= TeCOVERS;
+
+									redRingsContainsCovers.insert(i);
+									blueRingsProcessed.insert(j);
+									find = true;
+									break;
+									
+
+				default          :  return TeOVERLAPS;
+			}
+
+			if(find)
+				break;
+		}
+
+		if(!find)
+			return TeOVERLAPS;
+	}
+
+	return rel;
+}
+
+//---------- Topological Function ----------//
+
+// EQUALS
+template<> bool TeEquals(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.x(), c2.x()))
+		return false;
+
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.y(), c2.y()))
+		return false;
+
+	return true;
+}
+
+template<> bool TeEquals(const TePoint& p1, const TePoint& p2)
+{
+	return TeEquals(p1.location(), p2.location());
+}
+
+template<> bool TeEquals(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeEquals(redLine.box(), blueLine.box()))
+		return TeRelation(redLine, blueLine, TeEQUALS) == TeEQUALS;
+	else
+		return false;
+}
+
+template<> bool TeEquals(const TePolygon& redPol, const TePolygon& bluePol)
+{
+	if(TeEquals(redPol.box(), bluePol.box()))
+	{
+		if(redPol.size() != bluePol.size())
+			return false;
+
+		return TeRelation(redPol, bluePol) == TeEQUALS;
+	}
+	else
+		return false;
+}
+
+template<> bool TeEquals(const TeBox& bx1, const TeBox& bx2)
+{
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.x1(), bx2.x1()))
+		return false;
+
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.y1(), bx2.y1()))
+		return false;
+
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.x2(), bx2.x2()))
+		return false;
+	
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(bx1.y2(), bx2.y2()))
+		return false;
+
+	return true;
+}
+
+template<> bool TeEquals(const TeCell& cell1, const TeCell& cell2)
+{
+	return TeEquals(cell1.box(), cell2.box());
+}
+
+
+// DISJOINT
+bool TeDisjoint(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.x(), c2.x()))
+		return true;
+
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.y(), c2.y()))
+		return true;
+
+	return false;
+}
+
+bool TeDisjoint(const TeCoord2D& c, const TeBox& b)
+{
+	// c to the right of b
+	if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x2())) 
+		return true;
+
+	// c to the left of b
+	if(TeGeometryAlgorithmsPrecision::IsGreater(b.x1(), c.x())) 
+		return true;
+
+	// c is above b
+	if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y2())) 
+		return true;
+
+	// c is below b 
+	if(TeGeometryAlgorithmsPrecision::IsGreater(b.y1(), c.y())) 
+		return true;
+
+	return false;
+}
+
+bool TeDisjoint(const TeBox& bx1, const TeBox& bx2)
+{
+	// B1 to the right of B2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x1(), bx2.x2())) 
+		return true;
+
+	// B1 to the left of B2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x2())) 
+		return true;
+
+	// B2 is above B1
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y2())) 
+		return true;
+
+	// B2 is below B1 
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y1(), bx2.y2())) 
+		return true;
+
+	return false;
+}
+
+bool TeDisjoint(const TeCoord2D& c, const TeLine2D& l)
+{
+	return TeRelation(c, l) == TeOUTSIDE;
+}
+
+bool TeDisjoint(const TeCoord2D& c, const TePolygon& pol)
+{
+	return TeRelation(c, pol) == TeOUTSIDE;
+}
+
+bool TeDisjoint(const TePoint& p1, const TePoint& p2)
+{
+	return TeDisjoint(p1.location(), p2.location());
+}
+
+bool TeDisjoint(const TePoint& p, const TeLine2D& l)
+{
+	return TeDisjoint(p.location(), l);
+}
+
+bool TeDisjoint(const TePoint& p, const TePolygon& pol)
+{
+	return TeDisjoint(p.location(), pol);
+}
+
+bool TeDisjoint(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeDisjoint(redLine.box(), blueLine.box()))
+		return true;
+
+	return !TeINTERSECTOR2::TeIntersects(redLine, blueLine);
+}
+
+bool TeDisjoint(const TeLine2D& l, const TePolygon& pol)
+{
+	if(TeDisjoint(l.box(), pol.box()))
+		return true;
+
+	return TeRelation(l, pol) == TeDISJOINT;
+}
+
+bool TeDisjoint(const TePolygon& redPol, const TePolygon& bluePol)
+{
+	if(TeDisjoint(redPol.box(), bluePol.box()))
+		return true;
+	else
+		return TeRelation(redPol, bluePol) == TeDISJOINT;
+}
+
+bool TeDisjoint(const TeCell& cell1, const TeCell& cell2)
+{
+	return TeDisjoint(cell1.box(), cell2.box());
+}
+
+bool TeDisjoint(const TeCell& cell, const TeLine2D& line)
+{
+	return TeDisjoint(line, TeMakePolygon(cell.box()));
+}
+
+bool TeDisjoint(const TeCell& cell, const TePolygon& pol)
+{
+	return TeDisjoint(pol, TeMakePolygon(cell.box()));
+}
+
+bool TeDisjoint(const TeCell& cell, const TePoint& point)
+{
+	return TeDisjoint(point.location(), cell.box());
+}
+
+
+// INTERSECTS
+template<> bool TeIntersects(const TeCoord2D& c, const TeBox& b)
+{
+	// c to the right of b
+	if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x2())) 
+		return false;
+
+	// c to the left of b
+	if(TeGeometryAlgorithmsPrecision::IsGreater(b.x1(), c.x())) 
+		return false;
+
+	// c is above b
+	if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y2())) 
+		return false;
+
+	// c is below b 
+	if(TeGeometryAlgorithmsPrecision::IsGreater(b.y1(), c.y())) 
+		return false;
+
+	return true;
+}
+
+template<> bool TeIntersects(const TePoint& p, const TeBox& b)
+{
+	return TeIntersects(p.location(), b);
+}
+
+template<> bool TeIntersects(const TeBox& bx1, const TeBox& bx2)
+{
+	// B1 to the right of B2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x1(), bx2.x2())) 
+		return false;
+
+	// B1 to the left of B2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x2())) 
+		return false;
+
+	// B2 is above B1
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y2())) 
+		return false;
+
+	// B2 is below B1 
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y1(), bx2.y2())) 
+		return false;
+
+	return true;
+}
+
+
+// TOUCHES
+bool TeTouches(const TeCoord2D& c, const TeLine2D& l)
+{
+	return TeRelation(c, l) == TeBOUNDARY;
+}
+
+bool TeTouches(const TeCoord2D& c, const TePolygon& pol)
+{
+	return TeRelation(c, pol) == TeBOUNDARY;
+}
+
+bool TeTouches(const TePoint& p, const TeLine2D& l)
+{
+	return TeTouches(p.location(), l);
+}
+
+bool TeTouches(const TePoint& p, const TePolygon& pol)
+{
+	return TeTouches(p.location(), pol);
+}
+
+bool TeTouches(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeDisjoint(redLine.box(), blueLine.box()))
+		return false;
+
+	return TeRelation(redLine, blueLine, TeTOUCHES) == TeTOUCHES;	
+}
+
+bool TeTouches(const TeLine2D& l, const TePolygon& pol)
+{
+	if(TeDisjoint(l.box(), pol.box()))
+		return false;
+
+	return TeRelation(l, pol) == TeTOUCHES;
+}
+
+bool TeTouches(const TePolygon& redPol, const TePolygon& bluePol)
+{
+	if(TeDisjoint(redPol.box(), bluePol.box()))
+		return false;
+
+	return TeRelation(redPol, bluePol) == TeTOUCHES;
+}
+
+bool TeTouches(const TeBox& bx1, const TeBox& bx2)
+{	
+	// bx1 may touches its right wall in bx2 left wall
+	// or bx1 may touches its left wall in bx2 right wall
+	if(TeGeometryAlgorithmsPrecision::IsEqual(bx1.x2(), bx2.x1()) || TeGeometryAlgorithmsPrecision::IsEqual(bx1.x1(), bx2.x2()))
+	{
+		// bx1 is below bx2
+		if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y2()))
+			return false;
+
+		// bx1 is above bx2
+		if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y1(), bx2.y2()))
+			return false;
+
+		// touches
+		return true;	
+	}
+
+	// bx1 may touches its bottom wall in bx2 top wall
+	// or bx1 may touches its top wall in bx2 bottom wall
+	if(TeGeometryAlgorithmsPrecision::IsEqual(bx1.y1(), bx2.y2()) || TeGeometryAlgorithmsPrecision::IsEqual(bx1.y2(), bx2.y1()))
+	{
+		// bx1 is left of bx2
+		if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x2()))
+			return false;
+
+		// bx1 is right of bx2
+		if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x1(), bx2.x2()))
+			return false;
+
+		// touches
+		return true;
+	}
+
+	// doesn't touches
+	return false;
+}
+
+bool TeTouches(const TeCell& c1, const TeCell& c2)
+{
+	return TeTouches(c1.box(), c2.box());
+}
+
+bool TeTouches(const TeLine2D& line, const TeCell& cell)
+{
+	return TeTouches(line, TeMakePolygon(cell.box()));
+}
+
+bool TeTouches(const TeCell& c1, const TePolygon& poly)
+{
+	return  TeTouches (poly, TeMakePolygon(c1.box()));
+}
+
+bool TeTouches(const TePoint& point,const TeCell& c1)
+{
+	return TeTouches(point.location(), TeMakePolygon(c1.box()));
+}
+
+
+// CROSSES
+bool TeCrosses(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeDisjoint(redLine.box(), blueLine.box()))
+		return false;
+	else
+		return TeRelation(redLine, blueLine, TeCROSSES) == TeCROSSES;
+}
+
+bool TeCrosses(const TeLine2D& l, const TePolygon& pol)
+{
+	if(TeDisjointOrTouches(l.box(), pol.box()))
+		return false;
+	else
+		return TeRelation(l, pol) == TeCROSSES;
+}
+
+bool TeCrosses(const TeLine2D& l, const TeCell& cell)
+{
+	return TeCrosses(l, TeMakePolygon(cell.box()));
+}
+
+
+// WITHIN
+bool TeWithin(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	return TeEquals(c1, c2);
+}
+
+bool TeWithin(const TeCoord2D& c, const TeBox& b)
+{
+	// c to the right of b left wall AND c to the left of b right wall
+	// AND c below b top wall AND c above b bottom wall => then c is on b interior.
+	return (TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x1()) && TeGeometryAlgorithmsPrecision::IsGreater(b.x2(), c.x()) && TeGeometryAlgorithmsPrecision::IsGreater(b.y2(), c.y()) && TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y1()));
+}
+
+bool TeWithin(const TeCoord2D& c, const TeLine2D& l)
+{
+	return TeRelation(c, l) == TeINSIDE;
+}
+
+bool TeWithin(const TeCoord2D& c, const TePolygon& pol)
+{
+	return TeRelation(c, pol) == TeINSIDE;
+}
+
+bool TeWithin(const TePoint& p1, const TePoint& p2)
+{
+	return TeWithin(p1.location(), p2.location());
+}
+
+bool TeWithin(const TePoint& p, const TeLine2D& l)
+{
+	return TeWithin(p.location(), l);
+}
+
+bool TeWithin(const TePoint& p, const TePolygon& pol)
+{
+	return TeWithin(p.location(), pol);
+}
+
+bool TeWithin(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeWithinOrCoveredByOrEquals(redLine.box(), blueLine.box()))
+		return TeRelation(redLine, blueLine, TeWITHIN) == TeWITHIN;	
+	else
+		return false;
+}
+
+bool TeWithin(const TeLine2D& l, const TePolygon& pol)
+{
+	if(TeWithinOrCoveredByOrEquals(l.box(), pol.box()))	
+		return TeRelation(l, pol) == TeWITHIN;
+
+
+	return false;
+}
+
+bool TeWithin(const TePolygon& redPol, const TePolygon& bluePol)
+{
+	if(TeWithinOrCoveredByOrEquals(redPol.box(), bluePol.box()))	
+		return TeRelation(redPol, bluePol) == TeWITHIN;
+	else
+		return false;
+}
+
+bool TeWithin(const TeBox& bx1, const TeBox& bx2)
+{
+	// bx1 left wall is left of or on bx2 left wall
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.x1(), bx1.x1()))
+		return false;
+
+	// bx1 right wall is right of or on bx2 right wall
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.x2(), bx2.x2()))
+		return false;
+
+	// bx1 is below bx2 or on.
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.y1(), bx1.y1()))
+		return false;
+
+	// bx1 is above bx2 or on
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.y2(), bx2.y2()))
+		return false;
+
+	return true;	
+}
+
+bool TeWithin(const TeCell& cell1, const TeCell& cell2)
+{
+	return TeWithin(cell1.box(), cell2.box());
+}
+
+bool TeWithin(const TeLine2D& line, const TeCell& cell)
+{
+	return TeWithin(line, TeMakePolygon(cell.box()));
+}
+
+
+bool TeWithin(const TeCell& cell, const TePolygon& poly)
+{
+	return TeWithin(TeMakePolygon(cell.box()), poly);
+}
+
+bool TeWithin(const TePoint& point, const TeCell& cell)
+{
+	return TeWithin(point.location(), cell.box());
+}
+
+
+// OVERLAPS
+bool TeOverlaps(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeDisjoint(redLine.box(), blueLine.box()))
+		return false;
+	else
+		return TeRelation(redLine, blueLine, TeOVERLAPS) == TeOVERLAPS;
+}
+
+bool TeOverlaps(const TePolygon& redPol, const TePolygon& bluePol)
+{
+	//if(TeDisjoint(redPol.box(), bluePol.box()))
+	if(TeDisjointOrTouches(redPol.box(), bluePol.box()))
+		return false;
+	else
+		return TeRelation(redPol, bluePol) == TeOVERLAPS;
+}
+
+bool TeOverlaps(const TeCell& cell1, const TeCell& cell2)
+{
+	return TeOverlaps(TeMakePolygon(cell1.box()), TeMakePolygon(cell2.box()));
+}
+
+bool TeOverlaps(const TeCell& cell, const TePolygon& poly)
+{
+	return TeOverlaps(TeMakePolygon(cell.box()), poly);
+}
+
+
+// COVERED BY
+bool TeCoveredBy(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(TeWithinOrCoveredByOrEquals(redLine.box(), blueLine.box()))
+		return TeRelation(redLine, blueLine, TeCOVEREDBY) == TeCOVEREDBY;
+	else
+		return false;
+}
+
+bool TeCoveredBy(const TeLine2D& l, const TePolygon& pol)
+{
+	if(TeWithinOrCoveredByOrEquals(l.box(), pol.box()))
+		return TeRelation(l, pol) == TeCOVEREDBY;
+	else
+		return false;
+}
+
+bool TeCoveredBy(const TePolygon& redPol, const TePolygon& bluePol)
+{
+	if(TeWithinOrCoveredByOrEquals(redPol.box(), bluePol.box()))
+		return TeRelation(redPol, bluePol) == TeCOVEREDBY;
+	else
+		return false;
+}
+
+bool TeCoveredBy(const TeCell& cell1, const TeCell& cell2)
+{
+	return TeCoveredBy(TeMakePolygon(cell1.box()), TeMakePolygon(cell2.box()));
+}
+
+bool TeCoveredBy(const TePolygon& poly, const TeCell& cell)
+{
+	return TeCoveredBy(poly, TeMakePolygon(cell.box()));
+}
+
+bool TeCoveredBy(const TeLine2D& line, const TeCell& cell)
+{
+	return TeCoveredBy(line, TeMakePolygon(cell.box()));
+}
+
+//---------- Box Tests ----------//
+
+bool TeDisjointOrTouches(const TeBox& bx1, const TeBox& bx2)
+{
+	// B1 to the right of or on B2
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.x1(), bx2.x2())) 
+		return true;
+
+	// B1 to the left of or on B2
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.x1(), bx1.x2())) 
+		return true;
+
+	// B2 is above or on B1
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx2.y1(), bx1.y2())) 
+		return true;
+
+	// B2 is below or on B1 
+	if(TeGeometryAlgorithmsPrecision::IsGreaterEqual(bx1.y1(), bx2.y2())) 
+		return true;
+
+	return false;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeBox& bx1, const TeBox& bx2)
+{
+	// bx1 left wall is left of bx2 left wall
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.x1(), bx1.x1()))
+		return false;
+
+	// bx1 right wall is right of bx2 right wall
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.x2(), bx2.x2()))
+		return false;
+
+	// bx1 is below bx2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx2.y1(), bx1.y1()))
+		return false;
+
+	// bx1 is above bx2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(bx1.y2(), bx2.y2()))
+		return false;
+
+	return true;	
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TeLine2D& line2)
+{
+	if(TeWithinOrCoveredByOrEquals(line1.box(), line2.box()))
+	{
+		short r;
+		short rel = TeRelation(line1, line1, r);
+
+		if((rel&TeWITHIN) || (rel&TeCOVEREDBY) || (rel&TeEQUALS))
+		   return true;
+
+		return false;
+	}
+	return false;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TePolygon& pol)
+{
+	if(TeWithinOrCoveredByOrEquals(line1.box(), pol.box()))
+	{
+		short rel = TeRelation(line1, pol);
+
+		if((rel&TeWITHIN) || (rel&TeCOVEREDBY))
+		   return true;
+
+		return false;
+	}
+	return false;
+}
+
+template<>
+bool TeWithinOrCoveredByOrEquals(const TePolygon& pol1, const TePolygon& pol2)
+{
+	if(TeWithinOrCoveredByOrEquals(pol1.box(), pol2.box()))
+	{
+		short rel = TeRelation(pol1, pol2);
+
+		if((rel&TeWITHIN) || (rel&TeCOVEREDBY) || (rel&TeEQUALS))
+		   return true;
+
+		return false;
+	}
+	return false;
+}
+
+
+bool TeWithinOrTouches(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	// c is to the right of c1 and c2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), c1.x()) && TeGeometryAlgorithmsPrecision::IsGreater(c.x(), c2.x()))
+		return false;
+
+	// c is above c1 and c2
+	if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), c1.y()) && TeGeometryAlgorithmsPrecision::IsGreater(c.y(), c2.y()))
+		return false;
+
+	// c is to the left of c1 and c2
+	if(TeGeometryAlgorithmsPrecision::IsSmaller(c.x(), c1.x()) && TeGeometryAlgorithmsPrecision::IsSmaller(c.x(), c2.x()))
+		return false;
+
+	// c is below c1 and c2
+	if(TeGeometryAlgorithmsPrecision::IsSmaller(c.y(), c1.y()) && TeGeometryAlgorithmsPrecision::IsSmaller(c.y(), c2.y()))
+		return false;
+
+	return true;	
+}
+
+
+//---------- Intersection Functions ----------//
+
+bool TeIntersection(const TeBox& bx1, const TeBox& bx2, TeBox& bout)
+{
+	if(TeDisjoint(bx1, bx2))
+		return false;
+
+	double x1 = MAX(bx1.x1(),bx2.x1());
+	double x2 = MIN(bx1.x2(),bx2.x2());
+	double y1 = MAX(bx1.y1(),bx2.y1());
+	double y2 = MIN(bx1.y2(),bx2.y2());
+
+	bout = TeBox(x1, y1, x2, y2);
+
+	return true;
+}
+
+TeCoordPairVect	TeGetIntersections(const TePolygon &poly, const double& y)
+{
+	TeCoordPairVect		Segments;
+	vector<double>		crossList;
+	unsigned int		nholes = poly.size();
+		
+	//for each ring of the polygon
+	for (unsigned int count=0; count<nholes; count++ ) 		
+	{
+		TeLinearRing coords = poly[count];
+		for  (unsigned int j=0;  j < (coords.size() - 1); j++ ) 		
+		{
+			TeCoord2D coord0 = coords[j];
+			TeCoord2D coord1 = coords[j+1];
+
+			bool yflag0 = ( coord0.y() > y );  
+			bool yflag1 = ( coord1.y() > y ); 
+		
+			if ( yflag0 != yflag1 )
+			{ 
+				// line crosses ring horizontally 
+				double slope =  ( coord1.x() - coord0.x() ) / ( coord1.y() - coord0.y());
+				double xcross = ( y -   coord0.y() )* slope + coord0.x();
+				crossList.push_back (xcross);	
+			}
+			else if((coord0.y()==y) && (coord1.y()!=y)) 
+			{
+				crossList.push_back(coord0.x());
+			}
+			else if((coord0.y()!=y) && (coord1.y()==y))
+			{
+				crossList.push_back(coord1.x());
+			}
+		}
+	}
+
+	// Sort the x-intersections
+	sort (crossList.begin(), crossList.end());
+
+	vector<double>::iterator it = crossList.begin();
+
+	while ( it != crossList.end() )
+	{
+		TeCoordPair cp;
+
+		cp.pt1 = TeCoord2D ( (*it), y);
+		++it;
+		if ( it == crossList.end() ) break;
+
+		cp.pt2 = TeCoord2D ( (*it), y);
+		++it;
+
+		Segments.push_back ( cp );
+	}
+
+	return Segments;
+}
+
+
+//---------- Union Operators ----------//
+
+TeBox TeUnion(const TeBox& bx1, const TeBox& bx2)
+{
+	double x1 = MIN(bx1.x1(), bx2.x1());
+	double y1 = MIN(bx1.y1(), bx2.y1());
+		
+	double x2 = MAX(bx1.x2(), bx2.x2());
+	double y2 = MAX(bx1.y2(), bx2.y2());		
+
+	return TeBox(x1, y1, x2, y2);
+}
+
+
+//---------- Localization Functions ----------//
+
+bool TePointInPoly(const TeCoord2D& c, const TeLinearRing& r)
+{
+	if(r.size() < 4)
+		return false;
+
+	register double	ty, tx;
+
+	register const unsigned int nVertices = r.size();
+
+	register bool inside_flag = false;
+
+	register int j, yflag0, yflag1;
+
+	TeLinearRing::iterator vtx0, vtx1;
+
+	tx = c.x();
+    ty = c.y();
+    
+	vtx0 = r.end() - 2;
+
+    yflag0 = (vtx0->y() >= ty);
+
+    vtx1 = r.begin();
+
+    for(j = nVertices; --j; )
+	{
+		yflag1 = (vtx1->y() >= ty);
+		
+		if(yflag0 != yflag1)
+		{
+			if(((vtx1->y() - ty) * (vtx0->x() - vtx1->x()) >=
+		        (vtx1->x() - tx) * (vtx0->y() - vtx1->y())) == yflag1)
+			{
+				inside_flag = !inside_flag ;
+			}
+		}
+
+		yflag0 = yflag1 ;
+		vtx0 = vtx1 ;
+		vtx1++;
+    }
+
+	return inside_flag;
+}
+
+bool TeIsOnSegment(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	if(TeWithinOrTouches(c, c1, c2))
+	{
+		bool aux = false;
+
+		return TeINTERSECTOR2::TeCCW(c1, c2, c, aux) == TeNOTURN;
+	}
+
+	return false;	
+}
+
+bool TeIsOnLine(const TeCoord2D& c, const TeLine2D& l)
+{
+	if(l.size() < 2)
+		return false;
+
+	if(TeDisjoint(c, l.box()))
+		return false;
+
+	TeLine2D::iterator it = l.begin();
+
+	unsigned int nstep = l.size() - 1;
+
+	for(unsigned int i = 0; i < nstep; ++i)
+	{
+		if(TeIsOnSegment(c, *(it), *(it + 1)))
+			return true;
+		
+		++it;
+	}
+	
+	return false;
+}
+
+bool TeLocateLineSegment (TeCoord2D& pin, TeLine2D& line, int& segment, double /*tol*/)
+{
+	if (line.size() < 2) 
+		return false;
+
+	TeCoord2D pout;
+		
+	segment = 0;
+	double min_dist = TeMinimumDistance(line[0], line[1], pin, pout);
+	
+	for (unsigned int i = 2; i < line.size(); i++)
+	{
+		double dist;
+		if ((dist = TeMinimumDistance (line[i-1],line[i], pin, pout)) < min_dist)
+		{		
+				min_dist = dist;
+				segment = i - 1;
+		}
+	}
+
+	return true;
+}
+
+
+//---------- �rea Functions ----------//
+
+template<> double TeGeometryArea(const TePolygon& p)
+{
+	if(p.size() > 0)
+	{
+		TePolygon::iterator it = p.begin();
+	
+		double area = fabs(Te2Area(*it));
+
+		++it;
+		
+		// subtract inner rings area.
+		while(it != p.end())
+		{
+			area -= fabs(Te2Area(*it));
+			++it;
+		}
+
+		return (area / 2.0);
+	}
+	
+	return 0.0;
+}
+
+template<> double TeGeometryArea(const TePolygonSet& ps)
+{
+	TePolygonSet::iterator it = ps.begin();
+	
+	double area = 0.0;
+	
+	while(it != ps.end())
+	{
+		area += TeGeometryArea(*it);
+		++it;
+	}
+
+	return (area);
+}
+
+template<> double TeGeometryArea(const TeBox& b)
+{
+	return ((b.x2() - b.x1()) * (b.y2() - b.y1()));
+}
+
+//---------- ConvexHull ----------//
+
+//! If we have the  two end point equals, so we remove it.
+void removeDuplicatedCoords(vector<TeCoord2D>& coordSet)
+{
+	if(coordSet[0] == coordSet[coordSet.size() - 1])
+		coordSet.erase(coordSet.end() - 1);
+
+	return;
+}
+
+// Return a linear ring that is the convex hull of a given list of coords
+TePolygon ConvexHull(vector<TeCoord2D>& coordSet)
+{
+	// sorting the coords
+	sort(coordSet.begin(), coordSet.end(), xOrder<TeCoord2D>());
+
+	register unsigned int i = 0;
+	register unsigned int n = coordSet.size();
+
+	TeLine2D upperHull;
+	TeLine2D lowerHull;
+
+	lowerHull.add(coordSet[0]);
+	lowerHull.add(coordSet[1]);
+
+	unsigned int count = 2;
+
+	bool aux = false;
+	
+	for(i = 2; i < n; ++i)
+	{
+		lowerHull.add(coordSet[i]);
+
+		++count;
+
+		while(count > 2 && TeINTERSECTOR2::TeCCW(lowerHull[count - 3], lowerHull[count - 2], lowerHull[count - 1], aux) <= TeNOTURN)
+		{
+			lowerHull.erase(count - 2);
+			--count;
+		}
+	}
+
+	upperHull.add(coordSet[n - 1]);
+	upperHull.add(coordSet[n - 2]);
+
+	count = 2;
+
+	for(i = n - 2;  i > 0;  --i)
+	{
+		upperHull.add(coordSet[i - 1]);
+		++count;
+
+		while(count > 2 && TeINTERSECTOR2::TeCCW(upperHull[count - 3], upperHull[count - 2], upperHull[count - 1], aux) <= TeNOTURN)
+		{
+			upperHull.erase(count - 2);
+			--count;
+		}
+	}
+
+	
+	upperHull.erase(0);
+	upperHull.erase(count - 1);
+	
+	lowerHull.copyElements(upperHull);
+	lowerHull.add(lowerHull[0]);
+
+	TeLinearRing aux_ring(lowerHull);
+	TePolygon p;
+	p.add(aux_ring);
+	return p;
+}
+
+template<class T> TePolygon TeConvexHull(const T& coordSet)
+{
+	// creates an auxiliary line with the points of the ring
+	vector<TeCoord2D> aux;
+
+	typename T::iterator it = coordSet.begin();
+	
+	while(it != coordSet.end())
+	{
+		aux.push_back(*it);
+		++it;
+	}
+
+	// removes duplicated coords from structs like ring
+	removeDuplicatedCoords(aux);
+
+	return ConvexHull(aux);
+}
+
+template<> TePolygon TeConvexHull(const TePolygon& p)
+{
+	vector<TeCoord2D> coords;
+	back_insert_iterator<vector<TeCoord2D> > it(coords);
+	// Copy the first ring of each polygon without the last point (that is equals to the first).
+	
+	copy(p[0].begin(), p[0].end() - 1, it);
+
+	return ConvexHull(coords);
+}
+
+template<> TePolygon TeConvexHull(const TePolygonSet& ps)
+{
+	vector<TeCoord2D> coords;
+	back_insert_iterator<vector<TeCoord2D> > it(coords);
+	// Copy the first ring of each polygon without the last point (that is equals to the first).
+	
+	TePolygonSet::iterator it_ps = ps.begin();
+	while(it_ps != ps.end())
+	{
+		TeLinearRing r = (*it_ps)[0];
+		copy(r.begin(), r.end() - 1, it);
+		++it_ps;
+	}
+
+	return ConvexHull(coords);
+}
+
+template<> TePolygon TeConvexHull(const TePointSet& ps)
+{
+	vector<TeCoord2D> coords;
+	// Copy the first ring of each polygon without the last point (that is equals to the first).
+	
+	TePointSet::iterator itr = ps.begin();
+	
+	while(itr != ps.end())
+	{
+		coords.push_back(itr->location());
+
+		++itr;
+	}
+
+	return ConvexHull(coords);
+}
+
+//---------- Utilities Functions ----------//
+
+
+
+//---------- Validation Functions ----------//
+
+bool TeIsConvex(const TeLinearRing& ring)
+{
+	bool aux = false;
+
+	short orientation = TeINTERSECTOR2::TeCCW(*(ring.end() - 2), ring[0], ring[1], aux);
+
+	const unsigned int nStep = ring.size() - 1;
+	
+	for(unsigned int i = 1; i <  nStep; ++i)
+	{
+		short this_orientation = TeINTERSECTOR2::TeCCW(ring[i-1], ring[i], ring[i+1], aux);
+		
+		if(this_orientation == TeNOTURN)
+			continue;
+
+		if((orientation != TeNOTURN) && (orientation != this_orientation))
+			return false;
+
+		orientation = this_orientation;		
+	}
+
+	return true;
+}
+
+short TeOrientation(const TeLinearRing& r)
+{
+	double area = Te2Area(r);
+
+	if(area >  0.0)
+		return TeCOUNTERCLOCKWISE; 
+
+	if(area < 0.0)
+		return TeCLOCKWISE;  
+
+	return TeNOTURN;
+}
+
+void TeGetMiddlePoint(const TeCoord2D &first, const TeCoord2D &last, TeCoord2D &middle)
+{
+	double	lenght,parts,curlenght,incx,incy,
+			deltax,deltay,dx,dy;
+	short	i,nparts;
+	
+	lenght = TeDistance(first,last);
+	if(lenght == 0.)
+	{
+		middle = first;
+		return;
+	}
+
+	nparts = 2;	
+	parts = lenght/2.;
+// verify segment orientation
+	if(first.x() < last.x())
+		incx = 1.;
+	else
+		incx = -1.;
+
+	if(first.y() < last.y())
+		incy = 1.;
+	else
+		incy = -1.;
+
+	curlenght = 0.;
+	deltax = fabs(first.x()-last.x());
+	deltay = fabs(first.y()-last.y());
+	for(i=0;i<(nparts-1);i++)
+	{
+		curlenght = curlenght + parts;
+		// vertical segment
+		if(first.x() == last.x())
+		{
+			middle = TeCoord2D(first.x(),first.y()+(curlenght*incy));
+			continue;
+		}
+				
+		// horizontal segment
+		if(first.y() == last.y())
+		{
+			middle = TeCoord2D(first.x()+(curlenght*incx),first.y());
+			continue;
+		}
+		
+		// inclined segment
+		
+		// calculating X coordinate
+		dx = curlenght*deltax/lenght;
+		
+		// calculating Y coordinate
+		dy = curlenght*deltay/lenght;
+		middle = TeCoord2D(first.x()+(dx*incx),first.y()+(dy*incy));
+	}
+}
+
+//---------- Metric Functions ----------//
+
+double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2)
+{
+	return sqrt(((c2.x() - c1.x()) * (c2.x() - c1.x())) + ((c2.y()-c1.y()) * (c2.y() - c1.y())));
+}
+
+double TeLength(const TeLine2D& l)
+{
+	double len = 0.0;
+
+	unsigned int nStep = l.size() - 1;
+
+	for(unsigned int i = 0 ; i < nStep; ++i)
+		len += TeDistance(l[i], l[i+1]);
+	
+	return len;
+}
+
+double TePerpendicularDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D &pinter)
+{
+	double	d12,xmin,ymin;
+
+	double xi = first.x();
+	double xf = last.x();
+	double yi = first.y();
+	double yf = last.y();
+	double x = pin.x();
+	double y = pin.y();
+		
+	double dx = xf - xi;
+	double dy = yf - yi;
+	double a2 = (y - yi) * dx - (x - xi)*dy;
+	
+    if(dx==0. && dy==0.)
+	{
+		d12= sqrt(((x - xi) * (x - xi)) + ((y - yi) * (y - yi)));
+		d12 *= d12;
+	}
+	else
+		d12= a2 * a2 / (dx * dx + dy * dy);
+
+	if (dx == 0.)
+	{
+		xmin = xi;
+		ymin = y;
+	}
+	else if (dy == 0.)
+	{
+		xmin = x;
+		ymin = yi;
+	}
+	else
+	{
+		double alfa = dy / dx;
+		xmin = (x + alfa * (y - yi) + alfa * alfa * xi) / (1. + alfa * alfa);
+		ymin = (x - xmin) / alfa + y;	
+	}
+	
+	pinter = TeCoord2D(xmin, ymin);		
+	return (sqrt(d12));
+}
+
+double TeMinimumDistance (const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D& pout, double /*tol*/)
+{
+	TeCoord2D	pinter;
+	TeBox 		sbox(MIN(first.x(),last.x()),
+					 MIN(first.y(),last.y()),
+					 MAX(first.x(),last.x()),
+					 MAX(first.y(),last.y()));
+
+	double d = TePerpendicularDistance (first, last, pin, pinter);
+	double dmin = TeMAXFLOAT;
+
+	// Perpendicular minimum distance point was found.
+	if (TeWithin (pinter, sbox))
+	{
+		dmin = d;
+		pout = pinter;
+	}
+	else  
+	{
+		// Perpendicular minimum distance point could not be found. 
+		// The segment vertices distances will analyzed
+		double d1 = TeDistance (first, pin);
+		double d2 = TeDistance (last, pin);
+		if (d1 <= d2) 
+		{
+			dmin = d1;
+			pout = first;
+		}
+		else if (d2 < dmin) 
+		{
+			dmin = d2;
+			pout = last;
+		}
+	}
+
+	return dmin;
+}
+
+
+//---------- Relation Functions ----------//
+
+short TeRelation(const TeCoord2D& c, const TeLine2D& l)
+{
+	if(TeEquals(c, l[0]) || TeEquals(c, l[l.size() - 1]))
+	{
+		// Ring doesn't have bundaries, only interiors.
+		if(l.isRing())
+			return TeINSIDE;
+
+		return TeBOUNDARY;
+	}
+
+	if(TeIsOnLine(c, l))
+		return TeINSIDE;
+
+	return TeOUTSIDE;
+}
+
+short TeRelation(const TeCoord2D& c, const TeLinearRing& r)
+{
+	if(TeDisjoint(c, r.box()))
+		return TeOUTSIDE;
+
+	if(TeIsOnLine(c, r))
+		return TeBOUNDARY;
+
+	if(TePointInPoly(c, r))
+		return TeINSIDE;
+	else
+		return TeOUTSIDE;
+}
+
+short TeRelation(const TeCoord2D& c, const TePolygon& pol)
+{
+	short rel = TeRelation(c, pol[0]);
+	
+	if(rel != TeINSIDE)
+		return rel;
+	else	// If point is inside exterior ring
+	{
+		unsigned int size = pol.size();
+
+		for(unsigned int i = 1; i < size; ++i)
+		{
+			rel = TeRelation(c, pol[i]);
+		
+			switch(rel)
+			{
+				// If point is inside a hole so it is on polygon's outside.
+				case TeINSIDE    :	return TeOUTSIDE;
+
+				// If point is on boundary so it is on polygon's boundary.
+				case TeBOUNDARY  :  return TeBOUNDARY;
+			}
+		}
+	}
+
+	// If the point is inside exterior ring and is not on one of the holes so it is in polygon's interior.
+	return TeINSIDE;
+}
+
+short TeRelation(const TePoint& p, const TePolygon& pol)
+{ 
+	return (TeRelation(p.location(), pol)); 
+}
+
+short TeRelation(const TeCoord2D& c, const TePolygonSet& pSet)
+{
+	if(TeDisjoint(c, pSet.box()))
+		return TeOUTSIDE;
+
+	unsigned int size = pSet.size();
+
+	for(unsigned int i = 0; i < size; ++i)
+	{
+		short rel = TeRelation(c, pSet[i]);
+		
+		if(rel & TeINSIDE)
+			return TeINSIDE;
+		
+		if(rel & TeBOUNDARY)
+			return TeBOUNDARY;
+	}
+
+	return TeOUTSIDE;
+}
+
+short TeRelation(const TeLine2D& lRed, const TeLine2D& lBlue, const short& relation)
+{
+	TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+	if(TeINTERSECTOR2::TeSafeIntersections(lRed, lBlue, report))
+	{
+		short rel = Relation(lRed, lBlue, report, relation);		
+
+		// Stop to check, because touches can't occur anymore
+		if((relation == TeTOUCHES || relation == TeCROSSES) && rel != relation)
+			return TeUNDEFINEDREL;
+
+		if(rel != TeUNDEFINEDREL)
+			return rel;
+
+		TeINTERSECTOR2::TeVectorBoundaryIP::iterator it = report.begin();
+		TeINTERSECTOR2::TeVectorBoundaryIP::iterator it_end = report.end();
+		
+		for(unsigned int i = 0; i < report.size(); ++i)
+		{
+			swap(report[i].redPartNum_, report[i].bluePartNum_);
+			swap(report[i].redSegNum_, report[i].blueSegNum_);
+		}
+
+		rel = Relation(lBlue, lRed, report, relation);
+
+		if(rel != TeUNDEFINEDREL)
+			return ConverseRelation(rel);
+		else
+			return TeOVERLAPS;
+	}
+	else
+		return TeDISJOINT;
+}
+
+short TeRelation(const TeLine2D& line, const TePolygon& pol)
+{
+	short rel = TopologicRelation(line, pol[0]);
+
+	if(rel & TeTOUCHES || rel & TeCROSSES || rel & TeDISJOINT)
+		return rel;
+
+	// If relation is WITHIN or COVERED BY we need to test inner rings.
+	register unsigned int i = 1;
+	register unsigned int nRings = pol.size();
+
+	for(; i < nRings; ++i)
+	{
+		short rel_aux = TopologicRelation(line, pol[i]);
+
+		switch(rel_aux)
+		{
+			case TeCROSSES   : return TeCROSSES;
+
+			case TeCOVEREDBY : return TeTOUCHES;
+
+			case TeTOUCHES   : rel = TeCOVEREDBY;
+				               break;	// Needs to check other holes.
+
+			case TeWITHIN    : return TeDISJOINT;
+
+			case TeDISJOINT  : break;	// Keeps rel and check other inner rings
+		}
+	}
+
+	return rel;
+}
+
+short TeRelation(const TePolygon& pRed, const TePolygon& pBlue)
+{
+
+	short rel = TopologicRelation(pRed[0], pBlue[0]);
+
+	if(rel & TeTOUCHES || rel & TeOVERLAPS || rel & TeDISJOINT)
+		return rel;
+
+	
+	short rel_external_ring = TeUNDEFINEDREL;
+
+	bool converse = false;
+
+	vector<TeLinearRing> innerRingsToTest;
+
+	switch(rel)
+	{
+		case TeWITHIN		: 
+		case TeCOVEREDBY	:
+	                          // if pBlue has inner rings.
+			                  if(pBlue.size() > 1)
+							  {
+								  rel_external_ring = LookAtInnerRings(pRed[0], pBlue, innerRingsToTest, rel);	
+							  }
+							  else	// else if it hasn't
+							  {
+								  if(pRed.size() > 1)	// but pRed has
+									  return TeOVERLAPS;	// they overlaps
+								  else
+									  return rel;
+							  }
+							  break;
+
+		case TeCONTAINS		:
+		case TeCOVERS		: 
+							  // if pRed has inner rings.
+			                  if(pRed.size() > 1)
+							  {
+								  rel_external_ring = LookAtInnerRings(pBlue[0], pRed, innerRingsToTest, rel);							      
+							  }
+							  else	// else if it hasn't
+							  {
+								  if(pBlue.size() > 1)	// but pBlue has
+									  return TeOVERLAPS;	// they overlaps
+								  else
+									  return rel;
+							  }
+
+							  converse = true;
+							  break;
+
+		case TeEQUALS		:
+			                  if(pRed.size() != pBlue.size())
+								  return TeOVERLAPS;
+
+							  if(pRed.size() == 1 && pBlue.size() == 1)
+								  return rel;
+
+							  for(unsigned int k = 1; k < pBlue.size(); k++)
+								  innerRingsToTest.push_back(pBlue[k]);
+
+							  rel_external_ring = TeUNDEFINEDREL;
+	}
+	
+	if(rel_external_ring != TeUNDEFINEDREL)	
+		return rel_external_ring;	
+
+	// If we are here, so we need to test 
+	if(converse)	// COVERS or CONTAINS
+	{
+		if(pBlue.size() == 1 && innerRingsToTest.size() == 0)
+			return rel;
+
+		// The result may be: overlap or equals.
+		short rel_aux = TestInnerRings(pBlue, innerRingsToTest);
+
+		if(rel_aux & TeOVERLAPS)
+			return TeOVERLAPS;
+
+		if(rel_aux & TeCOVERS)
+			return TeCOVERS;
+
+		if(rel_aux & TeCONTAINS)
+			return TeCONTAINS;
+	}
+	else	// EQUALS, COVERED BY or WITHIN
+	{
+		if(pRed.size()  == 1 && innerRingsToTest.size() == 0)
+			return rel;
+
+		short rel_aux = TestInnerRings(pRed, innerRingsToTest);
+
+		if(rel_aux & TeOVERLAPS)
+			return TeOVERLAPS;
+
+		if((rel_aux == TeEQUALS) && (rel == TeEQUALS))
+			return TeEQUALS;
+
+		if((rel_aux & TeCOVERS) || (rel_aux & TeEQUALS))
+			return TeCOVEREDBY;	
+
+		if(rel_aux & TeCONTAINS)
+		{
+			if((rel == TeEQUALS) || (rel == TeCOVEREDBY))
+				return TeCOVEREDBY;
+
+			return TeWITHIN;
+		}
+	}
+
+	return TeUNDEFINEDREL;
+}
+
+
+//---------- Generate Geometry Functions ----------//
+
+TePolygon TeMakePolygon(const TeBox& b)
+{
+	TeLine2D l;
+	
+	l.add(b.lowerLeft());
+	l.add(TeCoord2D(b.x2(), b.y1()));
+	l.add(b.upperRight());
+	l.add(TeCoord2D(b.x1(), b.y2()));
+	l.add(b.lowerLeft());
+	l.setBox(b);
+
+	TePolygon p;
+	p.add(TeLinearRing(l));
+	p.setBox(b);
+
+	return p;
+}
+
+TeLinearRing TeSimpleClosedPath(const TePointSet& pSet)
+{
+	TeLine2D l;
+
+	for(register unsigned int i = 0; i < pSet.size(); ++i)
+		l.add(pSet[i].location());
+
+	ThetaOrder tr(pSet[0].location());
+
+	sort(l.begin(), l.end(), tr);
+
+	l.add(l[0]);
+
+	return TeLinearRing(l);
+}
+
+
+//---------- Nearest ----------//
+
+bool TeNearest ( TeCoord2D& pt, TeNodeSet& ns , int& k, const double& tol)
+{
+	double d,dmin = TeMAXFLOAT;
+	bool flag = false;
+
+	k = -1;
+	for (unsigned int i=0; i < ns.size() ; i++)
+	{
+		d = TeDistance (pt, ns[i].location());
+		if ( d <= tol && d < dmin)
+		{
+			dmin = d;
+			k = i;
+			flag = true;
+		}
+	}
+	return flag;
+}
+
+bool TeNearest ( TeCoord2D& pt, TePointSet& ps , int& k, const double& tol)
+{
+	double d,dmin = TeMAXFLOAT;
+	bool flag = false;
+
+	k = -1;
+	for (unsigned int i=0; i < ps.size() ; i++)
+	{
+		d = TeDistance (pt, ps[i].location());
+		if ( d <= tol && d < dmin)
+		{
+			dmin = d;
+			k = i;
+			flag = true;
+		}
+	}
+	return flag;
+}
+
+bool TeNearest ( TeCoord2D& pt, TeTextSet& ts , int& k, const double& tol)
+{
+	double d,dmin = TeMAXFLOAT;
+	bool flag = false;
+
+	k = -1;
+	for (unsigned int i=0; i < ts.size() ; i++)
+	{
+		d = TeDistance (pt, ts[i].location());
+		if ( d <= tol && d < dmin)
+		{
+			dmin = d;
+			k = i;
+			flag = true;
+		}
+	}
+	return flag;
+}
+
+bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& k, TeCoord2D& pi, const double& tol)
+{
+	double d,dmin = TeMAXFLOAT;
+	bool flag = false;
+
+	k = -1;
+	for (unsigned int i=0 ; i<ls.size() ; i++)
+	{
+		TeLine2D line = ls[i];
+		TeBox lb = line.box();
+		TeBox box(lb.x1()-tol,lb.y1()-tol,lb.x2()+tol,lb.y2()+tol);
+		if (TeIntersects(pt, box))
+		{
+			for (unsigned int j=0 ; j<line.size()-1 ; j++)
+			{
+				TeCoord2D	pinter;
+				TeBox		sbox(MIN(line[j].x(),line[j+1].x()),
+								MIN(line[j].y(),line[j+1].y()),
+								MAX(line[j].x(),line[j+1].x()),
+								MAX(line[j].y(),line[j+1].y()));
+				d = TePerpendicularDistance (line[j],line[j+1],pt, pinter);
+				if((d <= tol) && (d < dmin) && TeIntersects(pinter, sbox))
+				{
+					dmin = d;
+					k = i;
+					pi = pinter;
+					flag = true;
+				}
+			}
+		}
+	}
+	return flag;
+}
+
+
+bool TeNearest (TeCoord2D& pt,TeLineSet& ls, int& lindex, TeCoord2D& pout, double& dmin, const double& tol)
+{
+	bool flag = false;
+	TeCoord2D	pinter;
+
+	dmin = TeMAXFLOAT;
+	lindex = -1;
+
+	for (unsigned int i = 0 ; i < ls.size(); i++)
+	{
+		TeLine2D line = ls[i];
+
+		for (unsigned int j = 0 ; j < line.size() - 1 ; j++)
+		{
+			double d = TeMinimumDistance (line[j], line[j + 1], pt, pinter, tol);
+			if (d < dmin)
+			{
+				lindex = i;
+				pout = pinter;
+				dmin = d;
+				flag = true;
+			}
+		}
+	}
+	return flag;
+}
+
+bool TeNearest(TeCoord2D& pt, TePolygonSet& ps , int& k, const double& /*tol*/)
+{
+	bool flag = false;
+
+	k = -1;
+	
+	TePoint ptaux(pt);
+
+	for (unsigned int i=0; i < ps.size() ; i++)
+	{
+		if (TeIntersects(ptaux,ps[i]))
+		{
+			k = i;
+			flag = true;
+		}
+	}
+	return flag;
+}
+
+bool TeNearestByPoints ( TeCoord2D& pt, TeLineSet& ls , int& k, double& dist, const double& tol)
+{
+	double d,dmin = TeMAXFLOAT;
+	bool flag = false;
+
+	k = -1;
+	for (unsigned int i=0 ; i<ls.size() ; i++)
+	{
+		TeLine2D line = ls[i];
+		TeBox lb = line.box();
+		TeBox box(lb.x1()-tol,lb.y1()-tol,lb.x2()+tol,lb.y2()+tol);
+		if (TeIntersects (pt,box))
+		{
+			for (unsigned int j=0 ; j<line.size()-1 ; j++)
+			{
+				d = TeDistance (line[j],pt);
+				if ( d <= tol && d < dmin )
+				{
+					dmin = d;
+					dist = dmin;
+					k = i;
+					flag = true;
+				}
+			}
+		}
+	}
+	return flag;
+}
+
+
+//---------- TIN ----------//
+
+bool TeFindTriangleCenter(const TeCoord2D& vert0, const TeCoord2D& vert1, const TeCoord2D& vert2, TeCoord2D& pc )
+{
+	if ( vert0 == vert1 || vert0 == vert2 )
+		return false; // pontos sao iguais-> retorna
+
+	//	calcula o coeficiente angular perpendicular a reta 1
+ 	bool perpvert1 = false,	// perpendicular vertical ao segmento 1 
+		 perpvert2 = false;	// perpendicular vertical ao segmento 2 
+	double	m1 = 10., m2 =10.;	// normais aos segmentos 1 e 2
+	double prcsion = 1.0e-10;	// Precision to be used for equal comparison
+	double oldPrcsion = TePrecision::instance().precision();
+	TePrecision::instance().setPrecision(prcsion);
+
+	if ( TeCoord2D( 0., vert0.y() ) == TeCoord2D( 0., vert1.y() ) )
+		perpvert1 = true;
+	else 
+		m1 = -(vert1.x() - vert0.x()) / (vert1.y() - vert0.y());
+
+//	calcula o coeficiente angular da perpendicular a reta 2
+	if ( TeCoord2D( 0., vert1.y() ) == TeCoord2D( 0., vert2.y() ) )
+		perpvert2 = true;
+	else
+		m2 = -(vert2.x() - vert1.x()) / (vert2.y() - vert1.y());
+
+	TePrecision::instance().setPrecision(oldPrcsion);
+//	Caso as retas sejam coincidentes, uma circunferencia 
+//	 nao eh definida
+	if (fabs( m1 - m2 ) > prcsion)
+	{
+
+//	passou pelos testes: os pontos definem uma circunferencia
+//	calculo do ponto medio do segmento ponto0-ponto1 (segmento 1)
+		TeCoord2D ptm1 = vert0;
+		ptm1 += vert1;
+		ptm1.scale ( 0.5, 0.5);
+
+//	calculo do ponto medio do segmento ponto1-ponto2 (segmento 2)
+		TeCoord2D ptm2 = vert1;
+		ptm2 += vert2;
+		ptm2.scale ( 0.5, 0.5);
+
+//	calculo das coordenadas do centro: ponto de interseccao das mediatrizes
+//	 dos segmentos ponto0-ponto1 e ponto1-ponto2
+  		if (perpvert1 == true)
+		{
+   			pc.x( ptm1.x() );
+  			pc.y( ptm2.y() + m2 * ( pc.x() - ptm2.x() ) );
+ 		}
+		else if (perpvert2 == true)
+		{
+   			pc.x( ptm2.x() );
+			pc.y( ptm1.y() + m1 * ( pc.x() - ptm1.x() ) );
+		}
+		else
+		{
+			pc.x( (m1*ptm1.x() - m2*ptm2.x() - ptm1.y() + ptm2.y())/(m1-m2) );
+			pc.y( ptm1.y() + m1 * ( pc.x() - ptm1.x() ) );
+		}
+		return true;
+	}
+	return false;
+}
+
+bool TeLineSimplify(TeLine2D& ptlist, double snap, double maxdist)
+{
+//	If snap is zero, don't worry
+	if (snap == 0.0)
+		return true;
+//	If line is too short do nothing
+	int npts = ptlist.size();
+	if ( npts <= 3 )
+		return true;
+	int npte = npts;
+
+	double snap2 = maxdist*maxdist;
+	TeLine2D vxy (ptlist);
+
+//	Check for islands before defining number of points to be used
+	int npt;
+	if ( ptlist.last() == vxy.first() )
+		npt = npte - 1;
+	else
+		npt = npte;
+	ptlist.clear();
+
+//	initialize variables
+	int i     = 0;
+	int numa  = 0;
+	int numpf = npt - 1;
+
+//	define anchor
+	TeCoord2D axy = vxy[numa];
+
+//	define floating point
+	TeCoord2D pfxy = vxy[numpf];
+
+	while (numa < (npt-1))
+	{
+		bool retv (false);
+		double aa1 = 0.;
+		double a = 0.;
+		double b = 0.;
+//		Compute coeficients of straight line y=ax+b
+		if (pfxy.x() == axy.x())
+			retv = true;
+		else
+		{
+			a = (pfxy.y() - axy.y())/(pfxy.x() - axy.x());
+			b = pfxy.y() - a * pfxy.x();
+			aa1	= sqrt(a * a + 1.);
+		}
+
+		double d    = 0;
+		double dmax = 0;
+		int numdmax = numpf;
+
+		int k;
+		for (k = numa + 1; k <= numpf; k++)
+		{
+//			Distance between point and line
+			if (retv)
+				d = fabs(axy.x() - vxy[k].x());
+			else
+				d = fabs(vxy[k].y() - a*vxy[k].x() - b)/aa1;
+
+			if (d > dmax)
+			{
+				dmax	= d;
+				numdmax	= k;
+			}
+		}
+
+		if (dmax <= snap)
+		{
+//			Store selected point
+			if (i > (npt-1))
+				return false;
+			vxy[i++] = axy;
+			
+			double axbx = pfxy.x()-axy.x();
+			double ayby = pfxy.y()-axy.y();
+			double dist2 = axbx*axbx + ayby*ayby;
+			if (dist2 > snap2)
+			{
+				for (k = numpf; k > numa+1; k--)
+				{
+					axbx = vxy[k].x()-axy.x();
+					ayby = vxy[k].y()-axy.y();
+					dist2 = axbx*axbx + ayby*ayby;
+					if (dist2 < snap2)
+						break;
+				}
+//				Shift anchor
+				numa = k;
+				axy = vxy[k];
+			}
+			else
+			{
+//				Shift anchor
+				numa = numpf;
+				axy = vxy[numpf];
+			}
+			numpf = npt - 1;
+		}
+		else
+		{
+//			Shift floating point
+			numpf = numdmax;
+		}
+
+		pfxy = vxy[numpf];
+	}
+
+//	Store results
+	vxy[i] = vxy[numa];
+	npts = i+1;
+
+	if ( vxy[i] == vxy[i-1] )
+		npts = i;
+
+	for (i = 0; i < npts; i++)
+		ptlist.add( vxy[i] );
+
+//	Case islands
+	if (vxy[0] == vxy[npte-1])
+		ptlist.add( vxy[0] );
+
+	return true;
+}
+
+
+//---------- Curve ----------//
+
+/*! \fn void TeSwap(TePoint &p1, TePoint &p2)
+    \brief Swaps to points.
+	\param p1 The first point.
+	\param p2 The second point.
+*/
+void TeSwap(TePoint& p1, TePoint& p2)
+{
+	TePoint temp;
+
+	temp = p1;
+	p1 = p2;
+	p2 = temp;
+
+	return;
+}
+
+bool TeGetCenter(TePoint p1, TePoint p2, TePoint p3, TePoint& center)
+{
+	double x, y;
+	double ma=0., mb= 0.;
+	bool result = true;
+
+	//we don't want infinite slopes, or 0 slope for line 1, since we'll divide by "ma" below
+	if ((p1.location().x()==p2.location().x()) || (p1.location().y()==p2.location().y())) 
+		TeSwap(p2,p3);
+	  
+	if (p2.location().x()==p3.location().x()) 
+		TeSwap(p1,p2);
+
+	if (p1.location().x()!=p2.location().x())
+		ma=(p2.location().y()-p1.location().y())/(p2.location().x()-p1.location().x());
+	else 
+		result=false;
+	  
+	if (p2.location().x()!=p3.location().x()) 
+		mb=(p3.location().y()-p2.location().y())/(p3.location().x()-p2.location().x());
+	else 
+	  result=false;
+	  
+	if ((ma==0) && (mb==0)) 
+		result=false;
+	  
+	if (result) 
+	{
+		x=(ma*mb*(p1.location().y()-p3.location().y())+mb*(p1.location().x()+p2.location().x())-ma*(p2.location().x()+p3.location().x()))/(2*(mb-ma));
+		y=-(x-(p1.location().x()+p2.location().x())/2)/ma + (p1.location().y()+p2.location().y())/2;
+		
+		double w= x;  //TeRound(x);
+		double z= y;  //TeRound(y);	
+		TeCoord2D coord(w,z);
+		center.add(coord);
+	}
+  return result;
+}
+
+double TeGetRadius(TePoint& p1, TePoint& p2, TePoint& p3)
+{
+	double s,a,b,c, result;
+	a=sqrt(pow(p1.location().x()-p2.location().x(),2)+pow(p1.location().y()-p2.location().y(),2));  //sqr: square of the param
+	b=sqrt(pow(p2.location().x()-p3.location().x(),2)+pow(p2.location().y()-p3.location().y(),2));
+	c=sqrt(pow(p3.location().x()-p1.location().x(),2)+pow(p3.location().y()-p1.location().y(),2));
+	s=(a+b+c)/2;
+	result=(a*b*c)/(4*sqrt(s*(s-a)*(s-b)*(s-c)));
+	return result;
+}
+
+bool TeGenerateArc(TePoint& p1, TePoint& p2, TePoint& p3, TeLine2D& arcOut, const short& NPoints)
+{	
+	TePoint center;
+	double radius;
+
+	if(!TeGetCenter(p1, p2, p3, center))
+		return false;
+
+	radius = TeGetRadius(p1, p2, p3);
+
+	//calculate the distance between the points p1 and p3
+	double length = TeDistance(p1.location(),p3.location());
+
+	double val = length/(2*radius);
+	if(val>1)
+		return false;
+
+	//calculate the angle (in radians) between the segments (p1 - p3) in the circle center 
+	//asin : arco seno
+	//http://mathforum.org/dr.math/faq/faq.circle.segment.html#7
+	double thetaR = 2 * asin(val);	
+	
+	//calculate the variation of the angle in radians for each point
+	double deltaR = thetaR/(NPoints+1); 
+
+	//verify if is counterclockwise or clockwise
+	TeLine2D line;
+	line.add(p1.location());
+	line.add(p2.location());
+	line.add(p3.location());
+	line.add(p1.location());
+	TeLinearRing ring(line);
+	
+	short orient = TeOrientation(ring);
+
+	//calculate the coseno e seno of the angle (beta) between the circle center (horizontal segment) and the first point  
+	//http://mathforum.org/library/drmath/view/55327.html
+	double cosBeta = (p1.location().x()-center.location().x())/radius; 
+	double sinBeta = (p1.location().y()-center.location().y())/radius;
+
+	//rela��es trigonom�tricas
+	//sin(x+y) = sin(x)cos(y) + cos(x)sin(y),
+    //cos(x+y) = cos(x)cos(y) - sin(x)sin(y),
+	//sin(x-y) = sin(x)cos(y) - cos(x)sin(y),
+	//cos(x-y) = cos(x)cos(y) + sin(x)sin(y),
+
+	arcOut.add(p1.location());
+	double angle = deltaR;
+	for (int i=0; i<(NPoints+1); i++)
+	{
+		double x,y;
+		if(orient==TeCOUNTERCLOCKWISE)
+		{
+			//c = h + r*cos(B+A),
+			//d = k + r*sin(B+A),
+			x = center.location().x() + radius * ((cosBeta*cos(angle))-(sinBeta*sin(angle))); //cos(beta+angle) 
+			y = center.location().y() + radius * ((sinBeta*cos(angle))+(cosBeta*sin(angle))); //sin(beta+angle)
+		}
+		else if (orient==TeCLOCKWISE)
+		{
+			//c = h + r*cos(B-A),
+			//d = k + r*sin(B-A),
+			x = center.location().x() + radius * ((cosBeta*cos(angle))+(sinBeta*sin(angle))); //cos(beta-angle)
+			y = center.location().y() + radius * ((sinBeta*cos(angle))-(cosBeta*sin(angle))); //sin(beta-angle)
+		}
+
+		TeCoord2D coord(x,y);
+		arcOut.add(coord);
+		angle += deltaR;
+	}
+	arcOut.add(p3.location());
+	return true;
+}
+
+bool TeGenerateCircle(TePoint& center, const double& radius, TeLine2D& circle, const short& NPoints)
+{
+	//angle (in radians) of the circumference (2*Pi)
+	double thetaR = 2 * 3.14159; 	
+	
+	//calculate the variation of the angle in radians for each point
+	double deltaR = thetaR/(NPoints+1); 
+
+	//calculate a point P1 of the  circumference
+	TePoint p1(center.location().x()+radius, center.location().y());
+	
+	//calculate the coseno e seno of the angle (beta) between the center and the point P1  
+	//http://mathforum.org/library/drmath/view/55327.html
+	double cosBeta = 1;
+	double sinBeta = 0;
+
+	//rela��es trigonom�tricas
+	//sin(x+y) = sin(x)cos(y) + cos(x)sin(y),
+    //cos(x+y) = cos(x)cos(y) - sin(x)sin(y),
+	//sin(x-y) = sin(x)cos(y) - cos(x)sin(y),
+	//cos(x-y) = cos(x)cos(y) + sin(x)sin(y),
+
+	circle.add(p1.location());
+	double angle = deltaR;
+	for (int i=0; i<(NPoints+1); i++)
+	{
+		double x,y;
+		
+		//TeCOUNTERCLOCKWISE
+		//c = h + r*cos(B+A),
+		//d = k + r*sin(B+A),
+		
+		x = center.location().x() + radius * ((cosBeta*cos(angle))-(sinBeta*sin(angle))); //cos(beta+angle) 
+		y = center.location().y() + radius * ((sinBeta*cos(angle))+(cosBeta*sin(angle))); //sin(beta+angle)
+		
+		TeCoord2D coord(x,y);
+		circle.add(coord);
+		angle += deltaR;
+	}
+	circle.add(p1.location());
+	return true;
+}
+
+double TeGetPrecision(TeProjection* proj)
+{
+	if(!proj)
+		return 0.000000001;
+
+	if(proj->units() == "Meters")
+	{
+		return 0.001;
+	}
+	
+	return 0.000000001;	// Lat/Long e NoProjection
+}
+
+
diff --git a/src/terralib/kernel/TeGeometryAlgorithms.h b/src/terralib/kernel/TeGeometryAlgorithms.h
new file mode 100644
index 0000000..92c06f0
--- /dev/null
+++ b/src/terralib/kernel/TeGeometryAlgorithms.h
@@ -0,0 +1,1024 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeGeometryAlgorithms.h
+    This file contains Algorithms for Topological Operations.
+*/
+
+/**
+  *@author Gilberto Ribeiro de Queiroz
+  */
+
+#ifndef  __TERRALIB_INTERNAL_GEOMETRYALGORITHMS_H
+#define  __TERRALIB_INTERNAL_GEOMETRYALGORITHMS_H
+
+#include "TeGeometry.h"
+
+#include "TePrecision.h"
+#include "TeProjection.h"
+
+//! Intersection coordinates of two segments.
+typedef vector<TeCoord2D> TeIntersCoordsVec;
+
+/** @defgroup GeometryAlgorithms Geometry Algorithms
+ *  TerraLib geometry algorithms.
+ *  @{
+ */
+/** @defgroup TopologicalOperators Topological Operators
+ *  @ingroup  GeometryAlgorithms
+   Functions that test topologival relation between two objects.
+   The topological operators are based on the intersection of interior, exterior and boundary of geometries:
+ \par  ------------------------------------------------------------------------------------------------------------------
+ \par  | TeGeometry   |  INTERIOR                        | BOUNDARY           | EXTERIOR                                |
+ \par  ------------------------------------------------------------------------------------------------------------------
+ \par  | TePoint      | The point itself                 | Empty              | Everything except interior              |
+ \par  | TeLine2D     | All points except the end points | The two end points | Everything except interior and boundary |
+ \par  | TeLinearRing | All points                       | Empty              | Everything except interior and boundary |
+ \par  | TePolygon    | Everything between the external  | All rings          | Everything except interior and boundary |
+ \par  |              | ring and the inner rings         |                    |                                         |
+ \par  ------------------------------------------------------------------------------------------------------------------
+ 
+ \par  We use:
+		- I: for Interior
+		- E: for Exterior
+		- B: for Boundary
+		- inter: Intersects
+		- ^: AND
+		- v: OR
+		- A = refer to two-dimensional geometries (TePolygon and TePolygonSet)
+		- L = refer to one-dimensional geometries (TeLine2D and TeLineSet)
+		- P = refer to 0-dimensional geometries   (TePoint and TePointSet)
+ *  @{
+ */
+
+/** @defgroup TeEquals Equals test
+ *  @ingroup TopologicalOperators
+ *  Check if one object is equal another object.
+ *  Applies to: P/P, L/L and A/A.
+ *  TeEquals(x, y) => (x inter y = x) ^ (y inter x = y)
+ *					  (B(x) inter I(y) = false) ^ (B(x) inter E(y) = false) 
+ *  @{
+*/
+
+//! If a specialized function is not used, returns false.
+template<class T1, class T2> inline bool TeEquals(const T1& /*o1*/, const T2& /*o2*/)
+{
+	return false;
+}
+
+//! Check if coordinate 1 and coordinate 2 are equal
+template<> bool TeEquals(const TeCoord2D& c1, const TeCoord2D& c2);
+
+//!  Check if point 1 and point 2 are equal
+template<> bool TeEquals(const TePoint& p1, const TePoint& p2);
+
+//! Check if lineRed and lineBlue are equal
+template<> bool TeEquals(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if polygon red and polygon blue are equal
+template<> bool TeEquals(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if box 1 and box 2 are equal 
+template<> bool TeEquals(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if cell 1 and cell 2 are equal
+template<> bool TeEquals(const TeCell& cell1, const TeCell& cell2);
+/** @} */ 
+
+
+/** @defgroup TeDisjoint Disjoint test
+ *  @ingroup TopologicalOperators
+ *  Check if two objects are disjoint.
+ *  Applies to all geometries.
+ *  TeDisjoint(x, y) => (x inter y = false)
+ *                      (I(x) inter I(y) = false) ^ (I(x) inter B(y) = false) ^ (B(x) inter I(y) = false) ^ (B(x) inter B(y) = false)
+ *  @{
+*/
+
+//! Check if coordinate cl and coordinate c2 are disjoint
+bool TeDisjoint(const TeCoord2D& c1, const TeCoord2D& c2);
+
+//! Check if coordinate and box are disjoint
+bool TeDisjoint(const TeCoord2D& c, const TeBox& b);
+
+//! Check if box 1 and box 2 are disjoint
+bool TeDisjoint(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if coordinate and line are disjoint
+bool TeDisjoint(const TeCoord2D& c, const TeLine2D& l);
+
+//! Check if coordinate and polygon are disjoint
+bool TeDisjoint(const TeCoord2D& c, const TePolygon& pol);
+
+//! Check if point l and point 2 are disjoint
+bool TeDisjoint(const TePoint& p1, const TePoint& p2);
+
+//! Check if point and object are disjoint
+bool TeDisjoint(const TePoint& p, const TeLine2D& l);
+
+//! Check if point and object are disjoint
+bool TeDisjoint(const TePoint& p, const TePolygon& pol);
+
+//! Check if lines are disjoint
+bool TeDisjoint(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line and polygon are disjoint
+bool TeDisjoint(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if polygons are disjoint
+bool TeDisjoint(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if cell 1 and cell 2 are disjoint
+bool TeDisjoint(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if cell and line are disjoint
+bool TeDisjoint(const TeCell& cell, const TeLine2D& line);
+
+//! Check if cell and polygon are disjoint
+bool TeDisjoint(const TeCell& cell, const TePolygon& pol);
+
+//! Check if cell and point are disjoint
+bool TeDisjoint(const TeCell& cell, const TePoint& point);
+/** @} */
+
+
+/** @defgroup TeIntersects Intersects test
+ *  @ingroup TopologicalOperators
+ *  Check if one object intersects another object.
+ *  Applies to all geometries.
+ *  TeIntersects(x, y) => !TeDisjoint(x, y)
+ *                     => (I(x) inter I(y) = true) v (I(x) inter B(y) = true) v (B(x) inter I(y) = true) v (B(x) inter B(y) = true)
+ *  @{
+ */
+
+//! If a specialized function is not used, returns the disjoint negation
+template<class T1, class T2> inline bool TeIntersects(const T1& o1, const T2& o2)
+{
+	return !TeDisjoint(o1, o2);
+}
+
+//! Check if coordinate and box intersects
+template<> bool TeIntersects(const TeCoord2D& c, const TeBox& b);
+
+//! Check if point and box intersects
+template<> bool TeIntersects(const TePoint& p, const TeBox& b);
+
+//! Check if boxes intersects
+template<> bool TeIntersects(const TeBox& bx1, const TeBox& bx2);
+
+/** @} */
+
+
+/** @defgroup TeTouches Touch test
+ *  @ingroup TopologicalOperators
+ *  Check if two objects touche.
+ *  Applies to A/A, L/L, L/A, P/A, P/L.
+ *  TeTouches(x, y) => (I(x) inter I(y) = false) ^ (x inter y = true)
+ *				    => (I(x) inter I(y) = false) ^ ((B(x) inter I(y) = true) v (I(x) inter B(y) = true) v (B(x) inter B(y) = true))
+ *  @{
+ */
+
+//! Check if coordinate and line touches
+bool TeTouches(const TeCoord2D& c, const TeLine2D& l);
+
+//! Check if coordinate and polygon touches
+bool TeTouches(const TeCoord2D& c, const TePolygon& pol);
+
+//! Check if point and object touches
+bool TeTouches(const TePoint& p, const TeLine2D& l);
+
+//! Check if point and object touches
+bool TeTouches(const TePoint& p, const TePolygon& pol);
+
+//! Check if line and line touches
+bool TeTouches(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line and polygon
+bool TeTouches(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if polygons touches
+bool TeTouches(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if boxes touches
+bool TeTouches(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if cells touches
+bool TeTouches(const TeCell& c1, const TeCell& c2);
+
+//! Check if cell and line touches
+bool TeTouches(const TeLine2D& line, const TeCell& cell);
+
+//! Check if cell and polygon touches
+bool TeTouches(const TeCell& c1, const TePolygon& poly);
+
+//! Check if cell and point touches
+bool TeTouches( const TePoint& point, const TeCell& c1);
+/** @} */
+
+
+/** @defgroup TeCrosses Crosses test
+ *  @ingroup TopologicalOperators
+ *  Check if one object crosses another object.
+ *  TeCrosses(x, y) => dim(I(x) inter I(y)) = (max(dim(I(x)), dim(I(y))) - 1) ^ (x inter y != x) ^ (x inter y != y) 
+ *  Case 1: x = TeLine2D and y = TePolygon
+ *          => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = true)
+ *  Case 2: x = TeLine2D and y = TeLine2D
+ *          => dim(I(x) inter I(y)) = 0
+ *  @{
+ */
+
+//! Check if red line crosses blue line
+bool TeCrosses(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line crosses polygon
+bool TeCrosses(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if line and cell crosses
+bool TeCrosses(const TeLine2D& l, const TeCell& cell);
+/** @} */
+
+
+/** @defgroup TeWithin Within test
+ *  @ingroup TopologicalOperators
+ *  Check if one object is within another object.
+ *  TeWithin(x, y) => (x inter y = x) ^ (I(x) inter I(y) = true)
+ *  Case 1: P/P, P/L and P/A
+ *          => (I(x) inter I(y) = true)
+ *  Case 2: L/L and A/A
+ *          => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ (B(x) inter B(y) = false)
+ *  Case 3: L/A
+ *          => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ (B(x) inter B(y) = false) ^ (I(x) inter B(y) = false)
+ *  @{
+*/
+
+//! Check if coordinate 1 is within coordinate 2
+bool TeWithin(const TeCoord2D& c1, const TeCoord2D& c2);
+
+//! Check if coordinate is within a box
+bool TeWithin(const TeCoord2D& c, const TeBox& b);
+
+//! Check if a cordinate is within a line
+bool TeWithin(const TeCoord2D& c, const TeLine2D& l);
+
+//! Check if a cordinate is within a polygon
+bool TeWithin(const TeCoord2D& c, const TePolygon& pol);
+
+//! Check if point 1 is within point 2
+bool TeWithin(const TePoint& p1, const TePoint& p2);
+
+//! Check if point is within object
+bool TeWithin(const TePoint& p, const TeLine2D& l);
+
+//! Check if point is within object
+bool TeWithin(const TePoint& p, const TePolygon& pol);
+
+//! Check if red line is within blue line
+bool TeWithin(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line is within polygon
+bool TeWithin(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if red polygon is within blue polygon
+bool TeWithin(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if box1 is within box2
+bool TeWithin(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if cell1 is within cell2
+bool TeWithin(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if line is within cell
+bool TeWithin(const TeLine2D& line, const TeCell& cell);
+
+//! Check if cell is within polygon
+bool TeWithin(const TeCell& cell, const TePolygon& poly);
+
+//! Check if point is within cell
+bool TeWithin(const TePoint& point, const TeCell& cell);
+/** @} */
+
+/** @defgroup TeContains Contains test
+ *  @ingroup TopologicalOperators
+ *  Check if one object contains another object.
+ *  TeContains(x, y) = TeWithin(y, x)
+ *  @{
+ */
+
+//! If a specialized function is not used, returns false
+template<class T1, class T2> inline bool TeContains(const T1& o1, const T2& o2)
+{
+	return TeWithin(o2, o1);
+}
+/** @} */
+
+/** @defgroup TeOverlaps Overlaps test
+ *  @ingroup TopologicalOperators
+ *  Check if one object overlaps another object.
+ *  TeOverlaps(x, y) => (dim(I(x)) = dim(I(y)) = dim(I(x) inter I(y))) ^ (x inter y != x) ^ (x inter y != y)
+ *  Case 1: (x = TePolygon  and y = TePolygon)
+ *          => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = true) ^ (E(x) inter I(y) = true)
+ *  Case 2: x = TeLine2D and y = TeLine2D
+ *          => (dim(I(x) inter I(y)) = 1) ^ (I(x) inter E(y) = true) ^ (E(x) inter I(y) = true)
+ *  @{
+ */
+
+//! Check if red red overlaps blue line
+bool TeOverlaps(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if red polygon overlaps blue polygon
+bool TeOverlaps(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if cell1 overlaps cell2
+bool TeOverlaps(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if cell overlaps polygon
+bool TeOverlaps(const TeCell& cell, const TePolygon& poly);
+/** @} */
+
+
+/** @defgroup TeCoveredBy Covered by test
+ *  @ingroup TopologicalOperators
+ *  Check if one object is covered by another object.
+ *  TeCoveredBy(x, y) => (x inter y = x) ^ (I(x) inter I(y) = true)
+ *  - Case 1: (x = TePolygon and y = TePolygon) or (x = TeLine2D and y = TeLine2D)
+ *            => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ (B(x) inter B(y) = true)
+ *  - Case 2: x = TeLine2D and y = TePolygon
+ *            => (I(x) inter I(y) = true) ^ (I(x) inter E(y) = false) ^ (B(x) inter E(y) = false) ^ ((B(x) inter B(y) = true) v (I(x) inter B(y) = true))
+ *  @{
+ */
+
+//! Check if red line is covered by blue line
+bool TeCoveredBy(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+//! Check if line is covered by polygon
+bool TeCoveredBy(const TeLine2D& l, const TePolygon& pol);
+
+//! Check if red polygon is covered by blue polygon
+bool TeCoveredBy(const TePolygon& redPol, const TePolygon& bluePol);
+
+//! Check if cell1 is covered by cell2
+bool TeCoveredBy(const TeCell& cell1, const TeCell& cell2);
+
+//! Check if polygon is covered by cell
+bool TeCoveredBy(const TePolygon& poly, const TeCell& cell);
+
+//! Check if line is covered by cell
+bool TeCoveredBy(const TeLine2D& line, const TeCell& cell);
+
+/** @} */
+
+/** @defgroup TeCovers Covers test
+ *  @ingroup TopologicalOperators
+ *  Check if one object covers another object.
+ *  TeCovers(x, y) => TeCoveredBy(y, x)
+ *  @{
+ */
+template<typename T1, typename T2> inline bool TeCovers(T1& o1, T2& o2)
+{
+	return TeCoveredBy(o2, o1);
+}
+/** @} */
+
+/** @defgroup TeRelation Relation test
+ *  @ingroup TopologicalOperators
+ *  Return the relation between two objects.
+ *  @{
+ */
+
+/*! \fn short TeRelation(const TeCoord2D& c, const TeLine2D& l)
+    \brief Returns the relation between coordinate c and line l.
+	\param c  The coordinate.
+	\param l  The line.
+
+	This function may returns: INSIDE, OUTSIDE or BOUNDARY.
+	Obs: Doesn't do box elimination, just uses from TeIsOnLine(coordinate, line) elimination
+ */
+short TeRelation(const TeCoord2D& c, const TeLine2D& l);
+
+ 
+ /*! \fn short TeRelation(const TeCoord2D& c, const TeLinearRing& ring)
+    \brief Point in polygon inside/outside/boundary code.
+	\param c    The coordinate to test.
+	\param ring The simple polygon to test.
+
+	Check if point is INSIDE/OUTSIDE/BOUNDARY of a given ring.
+	The ring is treated as a simple polygon (no holes).
+	Obs: Do box elimination.
+*/
+short TeRelation(const TeCoord2D& c, const TeLinearRing& r);
+
+/*! \fn short TeRelation(const TeCoord2D& c, const TePolygon& pol);
+    \brief Point in polygon inside/outside/boundary code.
+	\param c    The coordinate to test.
+	\param pol  The polygon to test.
+
+	Check if point is INSIDE/OUTSIDE/BOUNDARY.
+	Obs: Doesn't do box elimination, just uses from TeRelation(coordinate, ring) elimination.
+*/
+short TeRelation(const TeCoord2D& c, const TePolygon& pol);
+
+short TeRelation(const TePoint& p, const TePolygon& pol); 
+
+/*! \fn short TeRelation(const TeCoord2D& c, const TePolygonSet& pSet)
+    \brief Point in polygon set inside/outside/boundary code.
+	\param c     The coordinate to test.
+	\param pSet  The polygon set to test.
+
+	Check if point is INSIDE/OUTSIDE/BOUNDARY.
+	Obs: Do box elimination.
+*/
+short TeRelation(const TeCoord2D& c, const TePolygonSet& pSet);
+
+/*! \fn short TeRelation(const TeLine2D& lRed, const TeLine2D& lBlue, const short& relation)
+    \brief This function returns the relation between two lines.
+	\param lRed     The first line.
+	\param lBlue    The second line.
+	\param relation The relation that stop the search.
+
+	This function returns the relation between lines. May be: TeDISJOINT, TeTOUCHES, TeWITHIN, TeCONTAINS, TeCROSSES, TeOVERLAPS, TeCOVEREDBY, TeCOVERS, TeEQUALS.
+	Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short TeRelation(const TeLine2D& lRed, const TeLine2D& lBlue, const short& relation);
+
+/*! \fn short TeRelation(const TeLine2D& line, const TePolygon& pol)
+    \brief This function returns the relation between a line and a polygon.
+	\param line   The line.
+	\param pol    The polygon.
+
+	This function returns the relation between a line and a polygon. May be: TeDISJOINT, TeTOUCHES, TeWITHIN (THE LINE IS WITHIN), TeCROSSES, TeCOVEREDBY (THE LINE IS COVERED BY).
+	Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short TeRelation(const TeLine2D& line, const TePolygon& pol);
+
+/*! \fn short TeRelation(const TePolygon& pRed, const TePolygon& pBlue)
+    \brief This function returns the relation between two polygons.
+	\param pRed   The first polygon.
+	\param pBlue  The second polygon.
+
+	This function returns the relation between a line and a polygon. May be: TeEQUALS, TeDISJOINT, TeTOUCHES, TeWITHIN (pRed IS WITHIN pBlue), TeCONTANS (pBlue CONTAINS pRed), TeOVERLAPS, TeCOVEREDBY (pRed IS COVERED BY pBlue) or TeCOVERS (pRed COVERS pBlue).
+	Obs: Doesn't do box elimination. You must implement the test in your own functions.
+*/
+short TeRelation(const TePolygon& pRed, const TePolygon& pBlue);
+/** @}	*/
+/** @}	*/
+
+/** @defgroup BoxTests Special box tests
+ *  @ingroup GeometryAlgorithms
+ *  Box tests.
+ *  @{
+*/
+
+//! Check if box1 is disjoint or touches box2
+bool TeDisjointOrTouches(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if coordinate c is within or touches segments c1 and c2 box
+bool TeWithinOrTouches(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2);
+/** @} */
+
+
+/** @defgroup GeometryTests Special Geometry tests
+ *  @ingroup GeometryAlgorithms
+ *  Geometry tests.
+ *  @{
+*/
+
+//! Check if geom1 is within or is covered by or is equal to geom2
+template<class T1, class T2> 
+bool TeWithinOrCoveredByOrEquals(const T1& geom1, const T2& geom2)
+{
+	short rel = TeRelation(geom1, geom2);
+
+	if((rel&TeINSIDE) || (rel&TeBOUNDARY))
+	   return true;
+
+	return false;
+}
+
+//! Check if box1 is within or is covered by or is equal to box2
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeBox& bx1, const TeBox& bx2);
+
+//! Check if line1 is within or is covered by or is equal to line2
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TeLine2D& line2);
+
+//! Check if line1 is within or is covered by to pol
+template<>
+bool TeWithinOrCoveredByOrEquals(const TeLine2D& line1, const TePolygon& pol);
+
+//! Check if pol1 is within or is covered by or is equal to pol2
+template<>
+bool TeWithinOrCoveredByOrEquals(const TePolygon& pol1, const TePolygon& pol2);
+
+/** @} */
+
+
+/** @defgroup IntersectionOperators Intersection Operators
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that calculate the intersection among objects or do intersection test.
+ *  @{
+ */
+
+/*! \fn bool TeIntersection(const TeBox& bx1, const TeBox& bx2, TeBox& bout)
+    \brief Performs the intersection between  box b1 and b2, returning the resulting box bout.
+	\param bx1  The first box to do the intersection.
+	\param bx2  The second box to do the intersection.
+	\param bout The box formed by the intersection of bx1 and bx2.
+*/
+bool TeIntersection(const TeBox& bx1, const TeBox& bx2, TeBox& bout);
+
+/*! \fn TeCoordPairVect	TeGetIntersections(const TePolygon &poly, const double& y);
+    \brief Return the segments that intersept the poly polygon in the line y.
+	\param poly    A polygon.
+	\param y    The ordinate that cuts the polygons edges.
+*/
+TeCoordPairVect	TeGetIntersections(const TePolygon &poly, const double& y);
+/** @} */
+
+
+/** @defgroup UnionOperators Union Operators
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that compute the union of objects.
+ *  @{
+ */
+
+/*! \fn TeBox TeUnion(const TeBox& bx1, const TeBox& bx2)
+    \brief Combine two box, make one that includes both.
+	\param bx1  The first box to do the union.
+	\param bx2  The second box to do the union.
+*/
+TeBox TeUnion(const TeBox& bx1, const TeBox& bx2);
+
+/** @} */
+
+/** @defgroup TeLocationFunctions Functions that finds the localization of objects.
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that finds the localization of objects.
+ *  @{
+ */
+
+/*! \fn bool TePointInPoly(const TeCoord2D& c, const TeLinearRing& r)
+    \brief Point in polygon inside/outside/boundary code.
+	\param c    The coordinate to test.
+	\param r The simple polygon to test.
+
+	Check if point is INSIDE of a given ring.
+	The ring is treated as a simple polygon (no holes).
+	Adapted from:
+	Samosky, Joseph, "SectionView: A system for interactively specifying and
+    visualizing sections through three-dimensional medical image data,
+    M.S. Thesis, Department of Electrical Engineering and Computer Science,
+    Massachusetts Institute of Technology, 1993.
+	Obs: Doesn't do box elimination.
+*/
+bool TePointInPoly(const TeCoord2D& c, const TeLinearRing& r);
+
+/*! \fn bool TeIsOnSegment(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2)
+    \brief Check if coordinate c is on segment (segment is closed).
+	\param c   The coordinate to be tested.
+	\param c1  The first segment's coordinate.
+	\param c2  The second segment's coordinate.
+*/
+bool TeIsOnSegment(const TeCoord2D& c, const TeCoord2D& c1, const TeCoord2D& c2);
+
+/*! \fn bool TeIsOnLine(const TeCoord2D& c, const TeLine2D& l)
+    \brief Check if coordinate c is on line boundary or on line interior (see explanation above for definition of boundary and interior of a line).
+	\param c   The coordinate to be tested.
+	\param l   The line used in the test.
+
+	Obs: Do box elimination.
+*/
+bool TeIsOnLine(const TeCoord2D& c, const TeLine2D& l);
+
+/*! \fn bool TeLocateLineSegment(TeCoord2D& pin, TeLine2D& line, int& segment, double tol = 0.0)
+    \brief Locate the nearest line segment of a coordinate.
+	\param pin		The coordinate.
+	\param line		The line.
+	\param segment  The position of the segment in the line  
+	\param tol		Tolerance.
+*/
+bool TeLocateLineSegment(TeCoord2D& pin, TeLine2D& line, int& segment, double tol = 0.0);
+/** @} */
+
+/** @defgroup TeConvexHull Functions to compute the Convex Hull
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that returns the convex hull of a point list.
+ *  @{
+ */
+
+ /*! \fn template<class T> TePolygon TeConvexHull(const T& coordSet)
+    \brief Returns the convexhull of a given list of coords in counterclockwise.
+	\param coordSet A list with coordinates without duplicated coordinates.
+	
+	This algorithm is based on the book Computational Geometry
+	by M. de Berg, M. van Kreveld, M. Overmars and O. Schwarzkopf - Springer Verlag - pp. 6.
+	It is O(N log N).
+
+*/
+template<class T> TePolygon TeConvexHull(const T& coordSet);
+
+//! This is a explicit specialization that returns the convex hull of a TePolygon
+template<> TePolygon TeConvexHull(const TePolygon& p);
+
+//! This is a explicit specialization that returns the convex hull of a TePolygonSet
+template<> TePolygon TeConvexHull(const TePolygonSet& ps);
+
+//! This is a explicit specialization that returns the convex hull of a TePointSet. Must be defined!
+template<> TePolygon TeConvexHull(const TePointSet& ps);
+
+/** @} */
+
+/** @defgroup TeUtils Utilities functions.
+ *  @ingroup  GeometryAlgorithms
+ *  @{
+ */
+
+//! Given a projection "proj" returns a tolerance value in the same unit of projection to be used in geometric operations
+double TeGetPrecision(TeProjection* proj);
+
+
+//! This class implements the Epsilon-tweaking used in calculus.
+class TeGeometryAlgorithmsPrecision
+{
+	protected:
+
+		//! Constructor
+		TeGeometryAlgorithmsPrecision();
+
+	public:		
+
+		//! Tells if d1 is greater than d2 according to tolerance factor.
+		static bool IsGreater(const double& d1, const double& d2)
+		{
+			return ((d1 - d2) > TePrecision::instance().precision());
+		}
+
+		//! Tells if d1 is greater than or equal to d2 according to tolerance factor.
+		static bool IsGreaterEqual(const double& d1, const double& d2)
+		{
+			return ((d1 - d2) >= (-TePrecision::instance().precision()));
+		}
+
+		//! Tells if d1 is smaller than d2 according to a tolerance factor.
+		static bool IsSmaller(const double& d1, const double& d2)
+		{
+			return ((d1 - d2) < -(TePrecision::instance().precision()));
+		}
+
+		//! Tells if d1 is smaller than or equals to d2 according to a tolerance factor.
+		static bool IsSmallerEqual(const double& d1, const double& d2)
+		{
+			return ((d1 - d2) <= TePrecision::instance().precision());
+		}
+
+		//! Tells if d1 is equals to d2 according to a tolerance factor.
+		static bool IsEqual(const double& d1, const double& d2)
+		{
+			return (fabs(d1 - d2) <= TePrecision::instance().precision());
+		}
+
+		//! Tells if d1 is different from d2 according to a tolerance factor.
+		static bool IsDifferent(const double& d1, const double& d2)
+		{
+			return (fabs(d1 - d2) > TePrecision::instance().precision());
+		}
+};
+
+inline void TeRemoveDuplicatedCoordinates(TeLine2D& l)
+{
+	for(unsigned int i = 0; i < l.size() - 1; ++i)
+		if(TeEquals(l[i], l[i + 1]))
+		{
+			l.erase(i);
+			--i;
+		}
+
+	return;
+}
+
+inline void TeRemoveDuplicatedCoordinates(TePolygon& p)
+{
+	for(unsigned int i = 0; i < p.size(); ++i)
+		TeRemoveDuplicatedCoordinates(p[i]);		
+
+	return;
+}
+
+/*! \fn void TeReverseLine (TeLine2D& lin);
+	\brief Reverses the line.
+	\param lin  The line to be reversed.
+*/
+inline void TeReverseLine(TeLine2D& lin)
+{
+	for(unsigned int i=0,j=lin.size()-1 ; i<lin.size()/2 ; ++i,--j)
+	{
+		TeCoord2D p = lin[i];
+		lin[i] = lin[j];
+		lin[j] = p;
+	}
+
+	return;
+}
+
+/** @} */
+
+/** @defgroup ValidationOperators Validation Operators
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that do some validation tests.
+ *  @{
+ */
+
+/*! \fn bool TeIsConvex(const TeLinearRing& ring);
+    \brief Tells if a simple polygon defined as a linear ring is convex or not.
+	\param ring  The polygon to test convexity.
+*/
+bool TeIsConvex(const TeLinearRing& ring);
+
+/*! \fn short TeOrientation(const TeLinearRing& r);
+	\brief Returns the orientation of the ring (CLOCKWISE or COUNTERCLOCKWISE);
+	\param r The ring to be checked.
+*/
+short TeOrientation(const TeLinearRing& r);
+
+/** @} */
+
+/** @defgroup MetricOperators Metric Operators
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that do some usefull metric operations.
+ *  @{
+ */
+
+/*! \fn void TeGetMiddlePoint(const TeCoord2D& first, const TeCoord2D& last, TeCoord2D& middle)
+    \brief Returns the middle point of a segment.
+	\param first   The first segment's coordinate.
+	\param last    The second segment's coordinate.
+	\param middle  The middle point.
+*/
+void TeGetMiddlePoint(const TeCoord2D& first, const TeCoord2D& last, TeCoord2D& middle);
+
+
+/*! \fn double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2)
+    \brief Euclidian distance between two points.
+	\param c1 First coordinate;
+	\param c2 Second coordinate;
+*/
+double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2);
+
+/*! \fn double TeLength(const TeLine2D& l)
+    \brief Returns the length of a Line 2D.
+	\param l  The line to calculate the length.	
+*/
+double TeLength(const TeLine2D& l);
+
+/*! \fn double TePerpendicularDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D &pinter)
+    \brief Perpendicular distance from point to segment.
+	\param first  The first segment's coordinate.
+	\param last   The second segment's coordinate.
+	\param pin    The point to get the distance from the segment.
+	\param pinter The point of intersection on the segment.
+*/
+double TePerpendicularDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D &pinter);
+
+/*! \fn double TeMinimumDistance(const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D& pout, double tol = 0.0);
+    \brief Minimal distance from point to segment.
+	\param first	The first segment's coordinate.
+	\param last		The second segment's coordinate.
+	\param pin		The point to get the minimal distance from the segment. This point is inside the segment  
+	\param pout		The nearest segment point of the pin point.
+	\param tol		Numerical tolerance
+*/
+double TeMinimumDistance (const TeCoord2D& first, const TeCoord2D& last, const TeCoord2D& pin, TeCoord2D& pout, double tol = 0.0);
+
+/** @defgroup TeGeometryArea Functions to compute the area of a geometry
+ *  @ingroup  MetricOperators
+ *  Functions that returns the area of a geometry.
+ *  @{
+ */
+
+/*! \fn template<class T> double TeGeometryArea(const T& geom)
+    \brief Returns the area of a TePolygon or TePolygonSet, otherwise return zero.
+	\param geom The geometry whose area we want to known.
+
+	This algorithm is based on the book Spatial Databases with Application to GIS
+	by Philippe Rigaux, Michel O. Scholl and Agnes Voisard.
+
+*/
+
+template<class T> double TeGeometryArea(const T& /* geom */)
+{
+	return 0.0;
+}
+
+//! This is a explicit specialization that returns the area of a TePolygon
+template<>  double TeGeometryArea(const TePolygon& p);
+
+//! This is a explicit specialization that returns the area of a TePolygonSet
+template<>  double TeGeometryArea(const TePolygonSet& ps);
+
+//! This is a explicit specialization that returns the area of a Box
+template<>  double TeGeometryArea(const TeBox& b);
+/** @} */
+
+/** @} */
+
+
+
+/** @defgroup GeometryFunction Functions that return geometries.
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that return geometries.
+ *  @{
+ */
+
+ /*! \fn TePolygon TeMakePolygon(const TeBox& b)
+    \brief Given a box return its polygon representation.
+	\param b  The box to create a polygon.
+*/
+TePolygon TeMakePolygon(const TeBox& b);
+
+/*! \fn TeLinearRing TeSimpleClosedPath(const TePointSet& pSet)
+    \brief Given N points, finds a path that doesn't self-intersects, visiting all points and returning to the begginning one.
+	\param pSet The point set to form a path.
+
+	It is based on the book Algorithms by Robert Sedgewick, Addisson-Wesley, 1988.
+*/
+TeLinearRing TeSimpleClosedPath(const TePointSet& pSet);
+/** @} */
+
+
+/** @defgroup TeFindCentroid Functions to compute the centroid
+ *  @ingroup  GeometryAlgorithms
+ *  Functions that return the centroid.
+ *  @{
+ */
+/*! \fn TeCoord2D TeFindCentroid(const TePolygon& p);
+    \brief Calculates the centroid of a polygon.
+	\param p A TePolygon whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TePolygon& p);
+
+/*! \fn TeCoord2D TeFindCentroid(const TeLine2D& l);
+    \brief Calculates a reference point.
+	\param l A TeLine whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeLine2D& l);  
+
+/*! \fn TeCoord2D TeFindCentroid(const TeCell& c );
+    \brief Calculates the centroid of a cell.
+	\param c A TeCell whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeCell& c);
+
+/*! \fn TeCoord2D TeFindCentroid(const TePoint& p );
+    \brief Calculates the centroid of a point.
+	\param p A TePoint whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TePoint& p);
+
+/*! \fn TeCoord2D TeFindCentroid(const TePolygonSet& s );
+    \brief Calculates the centroid of a polygon set.
+	\param s A TePolygon set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TePolygonSet& s); 
+
+/*! \fn TeCoord2D TeFindCentroid(const TeLineSet& s );
+    \brief Calculates the centroid of a line set.
+	\param s A TeLine set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeLineSet& s); 
+
+/*! \fn TeCoord2D TeFindCentroid(const TeCellSet& s );
+    \brief Calculates the centroid of a cell set.
+	\param s A TeCell set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(const TeCellSet& s);
+
+/*! \fn TeCoord2D TeFindCentroid(TePointSet& ps );
+    \brief Calculates the centroid of a point set.
+	\param ps A TePointSet set whose centroid we want to known.
+*/
+TeCoord2D TeFindCentroid(TePointSet& ps);
+/** @} */
+
+
+/** @defgroup TeNearest Functions to compute the nearest part of an object to a point.
+  *  @ingroup  GeometryAlgorithms
+  *  Auxiliary functions.
+  *  @{
+  */
+//! Nearest node in set from location pt (i = the node index in the nodeset)
+bool TeNearest(TeCoord2D& pt, TeNodeSet& ns , int& i, const double& tol = 0.0);
+
+//! Nearest point in set from location pt (i = the point index in the pointset)
+bool TeNearest(TeCoord2D& pt, TePointSet& ps , int& i, const double& tol = 0.0);
+
+//! Nearest text in set from location pt (i = the text index in the textset)
+bool TeNearest(TeCoord2D& pt, TeTextSet& ts , int& i, const double& tol = 0.0);
+
+//! Nearest line in set from location pt (i = the line index in the lineset and pi = the closest point)
+//! The pi point can be outside a line of the line set
+bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& i, TeCoord2D& pi, const double& tol = 0.0);
+
+//! Nearest line in set from location pt (i = the line index in the lineset and pout = the closest point)
+//! The pout point must be inside a line of the line set
+bool TeNearest (TeCoord2D& pt,TeLineSet& ls, int& lindex, TeCoord2D& pout, double& dmin, const double& tol = 0.0); 
+
+//! Nearest polygon in set from location pt (i = the polygon index in the polygonset).
+bool TeNearest(TeCoord2D& pt, TePolygonSet& ps , int& i, const double& tol = 0.0);
+
+//! Nearest line in set from location pt (i = the line index in lineset) calculated by the vertex of the lines
+bool TeNearestByPoints(TeCoord2D& pt, TeLineSet& ls , int& i, double& dist, const double& tol = 0.0);
+/** @} */
+
+
+/** @defgroup TINfunction Functions used by TIN.
+ *  @ingroup  GeometryAlgorithms
+ *  TIN functions.
+ *  @{
+ */
+/*! \fn bool TeFindTriangleCenter(const TeCoord2D& vert0, const TeCoord2D& vert1, const TeCoord2D& vert2, TeCoord2D& pc); 
+    \brief Calculates the center of a triangle.
+	\param vert0 First triagle's vertex.
+	\param vert1 Second triagle's vertex.
+	\param vert2 Third triagle's vertex.
+	\param pc    The triangle center.
+*/
+bool TeFindTriangleCenter(const TeCoord2D& vert0, const TeCoord2D& vert1, const TeCoord2D& vert2, TeCoord2D& pc); 
+
+//! Line simplification.
+bool TeLineSimplify(TeLine2D& line, double snap, double maxdist);
+
+/** @} */
+
+/** @defgroup Curvefunction Functions used to make curve.
+  *  @ingroup  GeometryAlgorithms
+  *  Curve functions.
+  *  @{
+  */
+
+/*! \fn bool TeGetCenter(TePoint p1, TePoint p2, TePoint p3, TePoint &center);
+    \brief Given three points of a circumference, returns the center point.
+	\param p1      First point.
+	\param p2      Second point.
+	\param p3      Third point.
+	\param center  Circunference center.
+	This algorithm is adapted from http://www.delphiforfun.org/Programs/Math_Topics/circle_from_3_points.htmbook.
+*/
+bool TeGetCenter(TePoint p1, TePoint p2, TePoint p3, TePoint &center);
+
+/*! \fn double TeGetRadius(TePoint& p1, TePoint& p2, TePoint& p3);
+    \brief Given three points of a circumference, returns the radius.
+	\param p1      First point.
+	\param p2      Second point.
+	\param p3      Third point.
+	This algorithm is adapted from http://www.delphiforfun.org/Programs/Math_Topics/circle_from_3_points.htmbook.
+*/
+double TeGetRadius(TePoint &p1, TePoint &p2, TePoint &p3);
+
+/*! \fn bool TeGenerateArc(TePoint& p1, TePoint& p2, TePoint& p3, TeLine2D& arcOut, const short& NPoints);
+    \brief Given three points of a circle, returns the an arc passing for this points that is formed by a given number of points.
+	\param p1      First point.
+	\param p2      Second point.
+	\param p3      Third point.
+	\param arcOut  The return arc.
+	\param NPoints Number of arc points.	
+	
+	This algorithm is adapted from http://mathforum.org/dr.math/
+  
+*/
+bool TeGenerateArc(TePoint& p1, TePoint& p2, TePoint& p3, TeLine2D& arcOut, const short& NPoints);
+
+/*! \fn bool TeGenerateCircle(TePoint& center, const double& radius, TeLine2D& circle, const short& NPoints);
+    \brief Given the center and the radius, returns the circle formed by a given number of points.
+	\param center  Center point of the circle.
+	\param radius  radius of the circle.
+	\param circle  The return circle
+	\param NPoints Number of circle points.	
+*/
+bool TeGenerateCircle(TePoint& center, const double& radius, TeLine2D& circle, const short& NPoints);
+
+/** @} */
+
+/** @} */ // end of group  GeometryAlgorithms
+
+
+#endif	// __TERRALIB_INTERNAL_GEOMETRYALGORITHMS_H
diff --git a/src/terralib/kernel/TeGraph.cpp b/src/terralib/kernel/TeGraph.cpp
new file mode 100644
index 0000000..9d63d60
--- /dev/null
+++ b/src/terralib/kernel/TeGraph.cpp
@@ -0,0 +1,1557 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <TeGraph.h>
+#include <TeDefines.h>
+#include <math.h>
+#include <float.h>
+#include <malloc.h>
+#include <stdio.h>
+#include <errno.h>
+
+int set_font(int font_number);
+
+#define PEN_UP       0     /* pen status up */
+#define PEN_DOWN     1     /* pen status down */
+
+#define ERR        -1     /* return value when error occurs */
+
+#define HORIZ_FONT 0
+#define VERT_FONT  1
+#define FONT_MAX   2
+
+/*** symbol shapes ***/
+
+#define RECTANGLE    0     /* tells PlotSymbol to draw a rectangle */
+#define TRIANGLE     1     /* tells PlotSymbol to draw a triangle */
+#define DIAMOND      2     /* tells PlotSymbol to draw a diamond */
+#define SCROSS       3     /* tells PlotSymbol to draw an upright cross */
+#define XCROSS       4     /* tells PlotSymbol to draw an angled cross */
+
+/*** constants ***/
+
+#define CURVES_LIMIT   10     /* maximum number of curves */
+#define MAIN_ROW       3     /* row number for main menu */
+#define MAIN_COL       2     /* column number for main menu */
+#define MAX_ITEMS     13     /* maximum number of items in a menu window */
+#define MASK_SIZE     50     /* length of file mask string */
+#define ASCII          0     /* Ascii output format */
+#define BINARY         1     /* Binary output format */
+#define LOAD           0     /* load options */
+#define SAVE           1     /* save options */
+#define SET            2     /* set options */
+#define DIGITS         6     /* number of digits to display for regression
+                               coefficients and mean square error */
+int  Font_width[FONT_MAX]  = {9,9};
+int  Font_height[FONT_MAX] = {15,15};
+int  Font_direct[FONT_MAX] = {HORIZ_FONT,VERT_FONT};
+
+
+char Symbol[CURVES_MAX] = {        /* symbols identifying each curve */
+		RECTANGLE,  /* symbol for curve 1 is a rectangle */
+		SCROSS,     /* symbol for curve 4 is an upright cross */
+		TRIANGLE,   /* symbol for curve 2 is a triangle */
+		DIAMOND,    /* symbol for curve 3 is a diamond */
+		XCROSS,      /* symbol for curve 5 is an angled cross */
+		RECTANGLE,  /* symbol for curve 6 is a rectangle */
+		SCROSS,     /* symbol for curve 9 is an upright cross */
+		TRIANGLE,   /* symbol for curve 7 is a triangle */
+		DIAMOND,    /* symbol for curve 8 is a diamond */
+		XCROSS      /* symbol for curve 10 is an angled cross */
+};
+
+unsigned Terms[] =
+{                                  /* terms in each regression function */
+        0,                         /* terms for polynomial set by regres_func */
+        2,                         /* number of exponential terms */
+        2,                         /* number of logarithmic terms */
+        3                          /* number of sinusoidal terms */
+};
+
+
+struct {                        /* Options default settings */
+	char symbols[5];
+	char x_major[3];
+	char x_minor[3];
+	char y_major[3];
+	char y_minor[3];
+	char y_scale[2];
+	char filemask[MASK_SIZE];
+	char format[7];
+	char digits[3];
+	char linesize[4];
+	char adapter[5];
+	char printer[9];
+	char printer_port[5];
+	char print_file[13];
+	char color[4];
+	char snow[4];
+	char sound[4];
+	char grid[4];
+	char legend[4];
+} Options ;       /* curve legend turned on                        */
+
+struct {
+	unsigned char background;   /* color of outermost window */
+ 	unsigned char pattern;      /* color of pattern in outermost window */
+	unsigned char input;        /* color of input window */
+	unsigned char input_prompt; /* color of input window prompt */
+	unsigned char input_answer; /* color of input window answer */	
+	unsigned char edit;         /* color of edit window */
+	unsigned char edit_bar;     /* color of selection bar in edit window */
+	unsigned char edit_answer;  /* color of answer bar in edit window */
+	unsigned char edit_index;   /* color of index values in edit window */
+	unsigned char edit_heading; /* color of X/Y values heading in edit window */
+	unsigned char error;        /* color of error window */
+	unsigned char help;         /* color of help message text */
+} Text_color;
+
+struct Grc{
+    TeColor grid;                /* color of plot grid         */
+    TeColor text;                /* color of plot text         */
+    TeColor lines;               /* color of plot all lines    */
+	TeColor symbol[CURVES_LIMIT];/* color of plot all lines    */
+    TeColor curve[CURVES_LIMIT]; /* color of plot curves       */
+} Graph_color;
+
+int f_spoly(Real x, Real_Vector terms, unsigned n);
+int f_sexp(Real x, Real_Vector terms, unsigned n);
+int f_slog(Real x, Real_Vector terms, unsigned n);
+int f_ssin(Real x, Real_Vector terms, unsigned n);
+
+int (*Function[])(Real, Real_Vector, unsigned) =
+{                                  /* array of functions used for regression  */
+        f_spoly,                     /* calculate terms of polynomial equation  */
+        f_sexp,                      /* calculate terms of exponential equation */
+        f_slog,                      /* calculate terms of logarithmic equation */
+        f_ssin                       /* calculate terms of sinusoidal equation  */
+};
+
+Real vmaxval(Real_Vector v, unsigned int n, int *imx)
+{
+ 	// subroutine determines the maximum  value (maxx) of the
+  	// vector v[] of length n and returns the index (imx) where
+  	// the maximum occurs; i.e. imx, where maxx = v[imx].
+ 	// On exit, the maximum is returned as the value of vmaxval().
+
+	unsigned int i;
+	Real maxx;
+ 
+	if (v == NULL)
+		return (Real) 0.0;
+
+ 	//find max value
+
+	*imx=0;
+	maxx=v[0];
+	for(i=1; i<n ; i++)
+	{
+		if(v[i] > maxx)
+		{
+			maxx=v[i];
+			*imx=i;
+		}
+	}
+	return maxx;
+}
+
+//---------------------------------------------------------------------------------
+Real
+vminval(Real_Vector v, unsigned int n, int *imn)
+{
+// subroutine determines the minimum  value (minx) of the
+// vector v[] of length n and returns the index (imn) where
+// the minimum occurs; i.e. imn, where minx = v[imn].
+// On exit, the minimum is returned as the value of vminval().
+
+	unsigned int i;
+	Real minx;
+ 
+	if (v == NULL)
+		return (Real) 0.0;
+
+	//find min value
+	*imn=0;
+	minx=v[0];
+	for(i=1; i<n ; i++)
+	{
+		if(v[i] < minx)
+		{
+			minx=v[i];
+			*imn=i;
+		}
+	}
+	return minx;
+}
+
+//---------------------------------------------------------------------------------
+
+TeGraphPlot :: TeGraphPlot ()
+{
+	GPpointwidth = 7;
+	GPpointheight = 7;
+
+	label_field = 11;
+	major_tick = 5;
+	minor_tick = 2;
+	x_major = 8;
+	y_major = 10;
+	x_minor = 8;
+	y_minor = 5;
+	Scale_curve = -1;
+	Plot_curves = 0;
+	Plot_symbols = 0;
+	Curve_choice = 0;
+	Plot_choice = 0;
+	int i;
+	for( i = 0; i < CURVES_MAX; i++ )
+	{
+		Plot_points[i] = 0;
+		Plot_x[i] = 0;
+		Plot_y[i] = 0;
+	}
+
+	Graph_color.grid.init(0,100,100);
+	Graph_color.text.init(0,0,0);
+	Graph_color.lines.init(30,30,30);// preto
+
+	for( i = 0; i < CURVES_LIMIT; i++ )
+	{
+		Graph_color.symbol[i].init(0,255,0);
+		Graph_color.curve[i].init(0,0,0);
+	}
+
+	sliceVector = 0;
+}
+
+//---------------------------------------------------------------------------------
+
+TeGraphPlot :: ~TeGraphPlot ()
+{
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setColorGrid(int r, int g, int b)
+{
+	Graph_color.grid.init(r,g,b);
+}
+
+//---------------------------------------------------------------------------------
+void	
+TeGraphPlot :: setColorText(int r, int g, int b)
+{
+	Graph_color.text.init(r,g,b);
+}
+
+//---------------------------------------------------------------------------------
+void	
+TeGraphPlot :: setColorSymbol(int r, int g, int b, int curve, int w, int h)
+{
+	if (curve==-1)
+		for (int i=0; i<CURVES_LIMIT; i++)
+			Graph_color.symbol[i].init(r,g,b);
+	else
+		Graph_color.symbol[curve].init(r,g,b);
+
+	GPpointwidth = w;
+	GPpointheight = h;
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setColorLine(int r, int g, int b)
+{
+	Graph_color.lines.init(r,g,b);
+}
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: setColorCurve(int c,int r, int g, int b)
+{
+	if( c < 0 || c > CURVES_LIMIT-1 )
+	{
+		return false;
+	}
+
+ 	Graph_color.curve[c].init(r,g,b);
+
+	return true;
+}
+
+void
+TeGraphPlot :: pieLegends ()
+{
+	if (sliceVector == 0)
+		return;
+	int	w;
+	int	xt, yt, pw, ph;
+	
+	TeColor	cor;
+
+	cor.init (0, 0, 0);
+    setTextColor(cor);
+
+	w = min(width,height);
+	pw = 2*label_height;
+	ph = label_height;
+
+	xt = xupleft + w + pw;
+	yt = yupleft;
+	int textext = 0;
+	for (unsigned int i = 0; i < sliceVector->size (); i++)
+	{
+		TeLegendEntry slice = (*sliceVector)[i];
+		TeVisual  vis;
+		//vis = slice.visual (TePOLYGONS);
+		TeColor cor = vis.color();
+		
+		setFillAreaColor (cor);
+		string leg = slice.label ();
+		int xw,xh;
+		textExtent (leg, xw, xh);
+		textext = max (textext, xw);
+		fillRectangle (xt, yt-ph, pw, ph);
+		drawText ((int)(xt+1.2*pw), yt-2, (char*)leg.c_str ());
+		yt += (int)1.5*ph;
+		if (yt > (yupleft + height))
+		{
+			xt += (int)(textext+2.2*pw);
+			textext = 0;
+			yt = yupleft;
+		}
+	}
+}
+
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: setGridSize(int s)
+{
+	if( s <= 0 )
+	{
+		return false;
+	}
+	x_major = s;
+	y_major = s;
+	x_minor = s;
+	y_minor = s;
+
+	return true;
+}
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: setGridSize(int xma, int yma, int xmi, int ymi )
+{
+	if( xma <= 0 || yma <= 0 || xmi <= 0 || ymi <= 0 )
+	{
+		return false;
+	}
+
+	x_major = xma;
+	y_major = yma;
+	x_minor = xmi;
+	y_minor = ymi;
+
+	return true;
+}
+
+//---------------------------------------------------------------------------------
+int
+TeGraphPlot :: loadDirect (int format, int curv, int points, Labels& labels, Real_Vector x, Real_Vector y)
+{
+	if( curv < 0 || curv > CURVES_LIMIT-1 )
+	{
+		return false;
+	}
+
+	strcpy(Plot_label.title, labels.title);
+	strcpy(Plot_label.xaxis, labels.xaxis);
+	strcpy(Plot_label.yaxis, labels.yaxis);
+	Input_format[curv] = format;
+
+        strcpy(Plot_label.curve[curv], labels.curve[curv]);
+
+	Plot_x[curv] = x;
+	Plot_y[curv] = y;
+	Plot_points[curv] = points;
+
+	if (Plot_curves < (curv+1) )
+	{
+		Plot_curves= curv+1;
+	}
+
+	return true;
+}
+
+void TeGraphPlot::loadHistogram (TeLegendEntryVector& sv, const string& label)
+{
+// Manage number of curves, only one histogram is allowed per plotting
+	Plot_curves = 1;
+	int order = 0;
+	Input_format[order] = BAR_BINARY;
+	sliceVector = &sv;
+// Allocate space for data arrays
+	unsigned int size = sv.size ();
+	if (Plot_x[order])
+		delete [] Plot_x[order];
+	if (Plot_y[order])
+		delete [] Plot_y[order];
+	Plot_x[order] = new double [size];
+	Plot_y[order] = new double [size];
+	Plot_points[order] = size;
+
+// Transfer data from TeLegendEntrys to double array
+	int vmax = 0;
+	for (unsigned int i=0;i<size;i++)
+	{
+		TeLegendEntry sl = sv[i];
+		Plot_y[order][i] = sl.count();
+		Plot_x[order][i] = (double)i+1;
+		vmax = max (vmax,sl.count() );
+	}
+
+// Fill in labels
+	strcpy(Plot_label.title, label.c_str ());
+	strcpy(Plot_label.xaxis, "Fatia");
+	strcpy(Plot_label.yaxis, "Objetos");
+	strcpy(Plot_label.curve[order],"");
+	setScale(1., Real(size+1) , 0., Real (vmax));
+	setGridSize(size, 8, 1, 1); 
+}
+
+void TeGraphPlot::loadPie (TeLegendEntryVector& sv, const string& label)
+{
+// Manage number of curves, only one pie is allowed per plotting
+	Plot_curves = 1;
+	int order = 0;
+	Input_format[order] = PIE_BINARY;
+	height = Y_pixels - yupleft;
+	sliceVector = &sv;
+// Allocate space for data arrays
+	unsigned int size = sv.size ();
+	if (Plot_x[order])
+		delete [] Plot_x[order];
+	if (Plot_y[order])
+		delete [] Plot_y[order];
+	Plot_x[order] = new double [size];
+	Plot_y[order] = new double [size];
+	Plot_points[order] = size;
+
+// Transfer data from TeLegendEntrys to double array
+	int vmax = 0;
+	for (unsigned int i=0;i<size;i++)
+	{
+		TeLegendEntry sl = sv[i];
+		Plot_y[order][i] = sl.count();
+		Plot_x[order][i] = (double)i+1;
+		vmax = max (vmax,sl.count() );
+	}
+
+// Fill in labels
+	strcpy(Plot_label.title, label.c_str ());
+//	strcpy(Label.curve[order],label.c_str ());
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: autoScale(void)
+{
+// scale axes for Scale_curve (for all curves if Scale_curve == -1) 
+
+	int i, index;
+	Real value;
+
+	if (Scale_curve == -1)
+		index = 0;
+	else
+		index = Scale_curve;
+
+	xminval = vminval(Plot_x[index], Plot_points[index], &i);
+	xmaxval = vmaxval(Plot_x[index], Plot_points[index], &i);
+	yminval = vminval(Plot_y[index], Plot_points[index], &i);
+	ymaxval = vmaxval(Plot_y[index], Plot_points[index], &i);
+
+	if (Scale_curve == -1)
+	{
+		for (i = 1; i < Plot_curves; i++)
+		{
+			value = vminval(Plot_x[i], Plot_points[i], &index);
+			if (value < xminval) xminval = value;
+			value = vmaxval(Plot_x[i], Plot_points[i], &index);
+			if (value > xmaxval) xmaxval = value;
+			value = vminval(Plot_y[i], Plot_points[i], &index);
+			if (value < yminval) yminval = value;
+			value = vmaxval(Plot_y[i], Plot_points[i], &index);
+			if (value > ymaxval) ymaxval = value;
+		}
+	}
+
+	for (int curva=0; curva < Plot_curves; curva++)
+	{
+		if (Input_format[curva] == ROSE_BINARY)
+		{
+			yminval = - ymaxval;
+			xmaxval = ymaxval;
+			xminval = yminval;
+		}
+	}
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setScale(Real x1, Real x2 , Real y1, Real y2)
+{
+   	xminval = x1;
+    	xmaxval = x2;
+    	yminval = y1;
+    	ymaxval = y2;
+
+	for (int curva=0; curva < Plot_curves; curva++)
+	{
+		if (Input_format[curva] == ROSE_BINARY)
+		{
+			yminval = - ymaxval;
+			xmaxval = ymaxval;
+			xminval = yminval;
+		}
+	}
+}
+
+int f_spoly(Real x, Real_Vector terms, unsigned n)
+{
+    	unsigned i;
+    	terms[0] = 1.0;
+    	for (i = 1; i < n; i++) terms[i] = x * terms[i-1];
+   	return 0;
+}
+
+int f_sexp(Real x, Real_Vector terms, unsigned n)
+{
+    double value;
+   	value = exp(x);
+    if (value != HUGE_VAL)
+	{
+        terms[0] = 1.0;
+        terms[n-1] = (Real) value;
+        return 0;
+    }
+	else
+	{
+       show_err("Value of exp(x) is too large");
+       return -1;
+    }
+}
+
+int f_slog(Real x, Real_Vector terms, unsigned n)
+{
+    	if (x > 0.0) {
+        	terms[0] = 1.0;
+        	terms[n-1] = (Real) log(x);
+        	return 0;
+    	}
+    	else {
+        	show_err("Value of x is less than or equal to 0");
+        	return -1;
+    	}
+}
+
+int f_ssin(Real x, Real_Vector terms, unsigned n)
+{
+   	errno = 0;
+	terms[0] = 1.0;
+    terms[1] = (Real) sin(x);
+    terms[n-1] = (Real) cos(x);
+    if (errno == 0)
+		return 0;
+    else
+	{
+        show_err("Loss of significance for cos(x) or sin(x)");
+       	return -1;
+    }
+}
+
+void show_err (char* /* mess */)
+{
+//	printf("%s\n",mess);
+}
+
+//---------------------------------------------------------------------------------
+
+int
+TeGraphPlot :: kill(int order)
+{
+	int i, count = 0;
+	if (Plot_curves == 0)
+		return 0;
+	for (i = 0; i < Plot_curves; i++)
+	{
+		if (Plot_x[i] == Plot_x[order]) count++;
+	}
+
+	if (count == 1)
+	{
+		delete [] Plot_x[order];
+		Plot_x[order] = 0;
+		delete [] Plot_y[order];
+		Plot_y[order] = 0;
+	}
+
+	for (i = order; i < Plot_curves-1; i++)
+	{
+		Plot_x[i] = Plot_x[i+1];
+		Plot_y[i] = Plot_y[i+1];
+		Plot_points[i] = Plot_points[i+1];
+		strcpy(Plot_label.curve[i], Plot_label.curve[i+1]);
+	}
+   	Plot_curves--;
+	return 1;
+}
+
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: plotCurves ( int with_simbols)
+{
+	short	drawplot = true;
+	Plot_symbols = with_simbols; // numero de pontos
+				     // que devem ser plotados
+				     // sobre a curva
+	for (int curva=0; curva < Plot_curves; curva++)
+	{
+		if (Plot_y[curva] == NULL)
+			continue;
+
+		if (Input_format[curva] == PIE_BINARY && sliceVector)
+		{
+			plot_title(Plot_label.title);
+
+			int		i, w, h, xc, yc, points;
+			
+			w = min(width,height);
+			h = min(width,height);
+			xc = xupleft ;
+			yc = yupleft ;
+			points =  Plot_points[0];
+
+			Real_Vector y = Plot_y[0];
+
+			Real	count = 0., value;
+
+			for (i = 0; i < points; i++) count += y[i];
+			if (count == 0.) break;
+
+			double	a1 = 0.,
+					a2 = 0.;
+
+			for (i = 0; i < points; i++)
+			{
+				TeLegendEntry slice = (*sliceVector)[i];
+				TeColor cor = slice.visual(TePOLYGONS).color ();
+				value = y[i]/count;
+				a2 += value*360.;
+				setFillAreaColor(cor);
+				fillArc (xc, yc, w, h, a1, a2, cor);
+				if (value > .08)
+				{
+					char percent[16];
+					sprintf (percent,"     %.1f",value*100);
+					drawText (xc+w/2, yc+h/2, percent, (a1+a2)/2);
+				}
+				a1 = a2;
+			}
+			pieLegends ();
+		}
+		else if (Input_format[curva] == BAR_BINARY)
+		{
+		//-------------------------------------
+		//           ^
+		//	     |	    .....
+		//	     |	    :   :....
+		//	     |	    :   :   :
+		//	     |	....:   :   :    
+		//	     |  :   :   :   :
+		//           |__:_|_:_|_:_|_:____
+		//                1   2   3 
+		//------------------------------------- 
+			int		x1, y1, x2, y2;
+			int i;
+
+//			Real_Vector	x = Plot_x[0],
+//					y = Plot_y[0];
+			Real_Vector	x = Plot_x[curva],
+					y = Plot_y[curva];
+ 
+//   			setLineAttributes(Graph_color.curve[0],0,0);
+//			setFillAreaColor(Graph_color.curve[0]);
+   			setLineAttributes(Graph_color.curve[curva],TeLnTypeContinuous,0);
+			setFillAreaColor(Graph_color.curve[curva]);
+
+			for (i = 0; i < Plot_points[curva]; i++)
+			{
+				// Juan begin
+				if(sliceVector)
+				{
+					TeLegendEntry slice = (*sliceVector)[i];
+					TeColor cor = slice.visual(TePOLYGONS).color ();
+					setFillAreaColor (cor);
+				}
+				// Juan end
+//				if (i < Plot_points[0]-1)
+				if (i < Plot_points[curva]-1)
+				{
+	        			value_to_pixel(x[i], y[i], &x1, &y1);
+	        			value_to_pixel(x[i+1], y[i+1], &x2, &y2);
+					if ((height + yupleft - y1 - 1) > 0)
+	        				fillRectangle(x1-(x2-x1)/2, y1, (x2-x1-2), height + yupleft - y1);
+				}
+				else
+				{
+	        			value_to_pixel(x[i-1], y[i-1], &x1, &y1);
+	        			value_to_pixel(x[i], y[i], &x2, &y2);
+					if ((height + yupleft - y2 - 1) > 0)
+	        				fillRectangle(x2-(x2-x1)/2, y2, (x2-x1-2), height + yupleft - y2);
+				}
+			}
+			draw_plot();
+		}
+		else if (Input_format[curva] == ROSE_BINARY)
+		{
+			int i;
+  			int x1, y1, x2, y2;
+			int	a1 = 0,
+				a2 = 0;
+			Real_Vector	x = Plot_x[0],
+					y = Plot_y[0];
+
+			plot_title(Plot_label.title);
+
+			for (i = 0; i < Plot_points[0]-1; i++)
+			{
+				if (y[i]==0.)continue;
+				a1 = (int)(x[i] * 64.);
+				a2 = (int)(x[i+1] * 64.) - a1;
+        		value_to_pixel(-y[i], y[i], &x1, &y1);
+        		value_to_pixel(y[i], -y[i], &x2, &y2);
+				fillArc (x1, y1, x2-x1, y2-y1, a1, a2, Graph_color.curve[0]);
+			}
+
+			Real step = ymaxval / (Real)major_tick;
+
+			for(Real j = step ; j <= ymaxval; j += step )
+			{ 
+        			value_to_pixel(-j, j, &x1, &y1);
+        			value_to_pixel(j, -j, &x2, &y2);
+
+   				setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+				drawArc(x1, y1, x2-x1, y2-y1,0,360*64,Graph_color.lines);
+			}
+		}
+		else if (Input_format[curva] == POINT_BINARY)
+		{
+			draw_plot();
+		
+        		for (int j = 0; j < Plot_points[curva]; j ++)
+				plotSymbol(Plot_x[curva][j], Plot_y[curva][j], Symbol[curva], GPpointwidth, GPpointheight, curva);
+
+		}
+		else
+		{
+			if (drawplot)
+			{
+				draw_plot();
+				drawplot = false;
+			}
+
+			plot_curve(Plot_x[curva], Plot_y[curva], Plot_points[curva],Graph_color.curve[curva]);
+		
+			if (Plot_symbols)
+				draw_symbols(curva);
+		}
+	}
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: draw_plot(void)
+{
+
+	plot_axes();
+	plot_ticks();
+//	if (Options.grid[1] == 'n')
+	plot_grid();
+	plot_labels();
+	plot_title(Plot_label.title);
+	plot_xaxis(Plot_label.xaxis);
+	plot_yaxis(Plot_label.yaxis);
+//	if (Options.legend[1] == 'n') 
+	drawLegend();
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: setSymbolType(int type, int curve)
+{
+	if(curve>=0 && curve<=9)
+		Symbol[curve] = type;
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: draw_symbols(int curve)
+{
+	int i, step;
+
+	if (Plot_symbols > 0)
+	{
+		step = Plot_points[curve]/Plot_symbols;
+		if (Plot_points[curve] % Plot_symbols != 0) step++;
+		for (i = 0; i < Plot_points[curve]; i += step)
+			plotSymbol(Plot_x[curve][i], Plot_y[curve][i], Symbol[curve], GPpointwidth, GPpointheight, curve);
+	}
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: plot_axes(void)
+{
+    setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+    drawRectangle(xupleft, yupleft, width, height);
+}
+
+//---------------------------------------------------------------------------------
+void
+TeGraphPlot :: plot_ticks(void)
+{
+    int i, x, y, maximum, delta, length;
+    int x_ticks = x_major * x_minor;
+    int y_ticks = y_major * y_minor;
+
+    setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+	delta = (width-1)/x_ticks;
+	x = xupleft + delta;
+	y = yupleft + 1;
+	maximum = yupleft + height ;
+	for (i = 1; i < x_ticks; i++)
+	{
+		if (i % x_minor == 0)
+			length = major_tick;
+		else
+			length = minor_tick;
+		drawLine(x, y, x, y + length );
+		drawLine(x, maximum, x, maximum - length );
+		x += delta;
+	}
+	delta = (height-1)/y_ticks;
+	x = xupleft + 1;
+	y = yupleft + delta;
+	maximum = xupleft + width -1;
+	for (i = 1; i < y_ticks; i++)
+	{
+		if (i % y_minor == 0)
+			length = major_tick;
+		else
+			length = minor_tick;
+		drawLine(x, y, x + length , y);
+		drawLine(maximum, y, maximum - length , y);
+		y += delta;
+	}
+}
+
+void TeGraphPlot :: plot_grid(void)
+{
+    	int i, x, y, maximum, delta;
+    	setLineAttributes(Graph_color.grid,TeLnTypeDotted,0);
+    	delta = (width-1)/x_major;
+    	x = xupleft + delta;
+    	maximum = yupleft + height - major_tick - 1;
+    	for (i = 1; i < x_major; i++)
+		{
+        	y = yupleft + 1 + major_tick;
+ //       	while (y < maximum) {
+ //           		drawPoint (x,y);
+ //           		y += 3;
+ //       	}
+			drawLine(x,y,x,maximum);
+        	x += delta;
+    	}
+    	delta = (height-1)/y_major;
+    	y = yupleft + delta;
+    	maximum = xupleft + width - major_tick - 1;
+    	for (i = 1; i < y_major; i++)
+		{
+        	x = xupleft + 1 + major_tick;
+ //       	while (x < maximum) {
+ //           		drawPoint (x,y);
+ //           		x += 4;
+ //         }
+			drawLine(x,y,maximum,y);
+        	y += delta;
+    	}
+}
+
+int TeGraphPlot :: plot_labels(void)
+{
+    char text[80];
+    int i, x, y, delta, font;
+    int digits_left, digits_right, exp_flag;
+    Real value, values[3];
+	setTextColor(Graph_color.text);
+
+	if ((font = set_font(label_font)) == ERR) return ERR;
+	values[0] = yminval;
+	values[1] = ymaxval;
+	values[2] = (values[1] - values[0]) / y_major;
+	label_format(values, 3, label_field, &digits_left, &digits_right, &exp_flag);
+	delta = (height-1) / y_major;
+	y = yupleft - label_height/2;
+	value = ymaxval;
+	Yaxis_x = xupleft;
+	for (i = 0; i <= y_major; i++)
+	{
+		ftos(value, digits_left, digits_right, exp_flag, text);
+		x = xupleft - strlen(text) * label_width - label_width/2;
+		if (x < Yaxis_x)
+			Yaxis_x = x;
+		drawText (x, y+8, text);
+		y += delta;
+		value -= values[2];
+	}
+	if (yaxis_direct == HORIZ_FONT)
+	{
+		Yaxis_x -= (yaxis_width + label_width/2);
+		if (Yaxis_x < 0)
+			Yaxis_x = 0;
+	}
+	else
+	{
+		Yaxis_x -= label_width/2;
+		if (Yaxis_x < yaxis_height)
+			Yaxis_x = yaxis_height;
+	}
+	values[0] = xminval;
+	values[1] = xmaxval;
+	values[2] = (values[1] - values[0]) / x_major;
+	label_format(values, 3, label_field, &digits_left, &digits_right, &exp_flag);
+	delta = (width-1) / x_major;
+	y = yupleft + height + label_height/2;
+	value = xminval;
+	for (i = 0; i <= x_major; i++)
+	{
+		ftos(value, digits_left, digits_right, exp_flag, text);
+		x = xupleft + i*delta - strlen(text) * label_width / 2;
+		drawText (x, y+8, text);
+		value += values[2];
+		if (x_major > 5)
+		{
+			i++;
+			value += values[2];
+          	// if (x_major > 9) {
+           	//     	i++;
+            	//    	value += values[2];
+           	//}
+		}
+	}
+//    	set_font(font);
+	return 0;
+}
+
+int TeGraphPlot :: plot_title(char *text)
+{
+    	int font;
+    	if ((font = set_font(title_font)) == ERR) return ERR;
+    	plot_horiz(text, Title_y, title_width);
+    	set_font(font);
+    	return 0;
+}
+
+int TeGraphPlot :: plot_xaxis(char *text)
+{
+    	int font;
+    	if ((font = set_font(xaxis_font)) == ERR) return ERR;
+    	plot_horiz(text, Xaxis_y, xaxis_width);
+    	set_font(font);
+	return 0;
+}
+
+void
+TeGraphPlot :: plot_horiz(char *text, int y, int w)
+{
+    	int x, l, count;
+    	char *ptr = NULL,buffer[80];
+    	setTextColor(Graph_color.text);
+    	l = strlen(text);
+    	x = xupleft + (width-1)/2 - (l * w)/2;
+    	ptr = text;
+    	if (x < xupleft) {
+        	count = (xupleft - x)/w;
+        	buffer[79] = '\0';
+        	strncpy(buffer, text, sizeof(buffer)-1);
+        	buffer[l-count-1] = '\0';
+        	x = xupleft;
+        	ptr = buffer;
+    	}
+    	drawText (x, y, ptr);
+    	ptr = NULL;
+}
+
+int
+TeGraphPlot :: plot_yaxis(char *text)
+{
+    int y, length, count, font, delta;
+	char *ptr= NULL, buffer[80], c[2];
+    setTextColor(Graph_color.text);
+	c[0] = '*'; c[1] = '\0';
+	if ((font = set_font(yaxis_font)) == ERR) return ERR;
+	length = strlen(text);
+	ptr = text;
+	delta = yaxis_direct == HORIZ_FONT ?
+            yaxis_height : yaxis_width;
+	y = (Title_y + Xaxis_y + delta * length) / 2;
+	buffer[79] = '\0';
+	strncpy(buffer, text, sizeof(buffer)-1);
+	if (y < Title_y)
+	{
+		count = 2 * (Title_y - y)/delta;
+		buffer[length-count-1] = '\0';
+		y = Title_y;
+		ptr = buffer;
+	}
+	if (yaxis_direct == HORIZ_FONT)
+	{
+		while (*ptr != '\0')
+		{
+			c[0] = *ptr++;
+			drawText (Yaxis_x, y, c);
+			y += yaxis_height;
+		}
+	}
+	else
+		drawText (Yaxis_x, y, ptr, 90.);
+	ptr = NULL;
+
+	set_font(font);
+	return 0;
+}
+
+int
+TeGraphPlot :: plot_curve(Real_Vector x, Real_Vector y,int points,TeColor c)
+{
+    	int i, count;
+
+	setLineAttributes(c,TeLnTypeContinuous,0);
+
+    	count = plot_point(x[0], y[0], PEN_UP);
+    	for (i = 1; i < points; i++)
+        	count += plot_point(x[i], y[i], PEN_DOWN);
+    	return count;
+}
+
+int
+TeGraphPlot :: plot_point(Real x_value, Real y_value, int pen_status)
+{
+    static Real last_x_value, last_y_value;
+    static int last_x, last_y;
+    Real temp_x, temp_y;
+    int x, y, status=0;
+
+    if (point_visible(x_value, y_value))
+	{
+        value_to_pixel(x_value, y_value, &x, &y);
+        if (pen_status == PEN_UP)
+		{
+//				SET_PIXEL(x, y, color);
+		}
+        else
+		{
+            if (!point_visible(last_x_value, last_y_value))
+			{
+				temp_x = last_x_value;
+				temp_y = last_y_value;
+                find_intersect(x_value, y_value, &temp_x, &temp_y);
+                value_to_pixel(temp_x, temp_y, &last_x,	&last_y);
+            }
+			if (last_y_value < TeMAXFLOAT)
+            	drawLine(last_x, last_y, x, y);
+        }
+        last_x = x;
+        last_y = y;
+        status = 1;
+    }
+    else if (pen_status == PEN_DOWN && point_visible(last_x_value, last_y_value))
+	{
+		if (y_value < TeMAXFLOAT)
+		{
+			temp_x = x_value;
+			temp_y = y_value;
+			find_intersect(last_x_value, last_y_value, &temp_x, &temp_y);
+			value_to_pixel(temp_x, temp_y, &x, &y);
+			drawLine(last_x, last_y, x, y);
+		}
+        status = 0;
+    }
+    last_x_value = x_value;
+   	last_y_value = y_value;
+    return status;
+}
+
+int
+TeGraphPlot :: plotSymbol(Real x_value, Real y_value, int symbol, int w, int h, int curve)
+{
+    int x, y;
+
+	setLineAttributes(Graph_color.symbol[curve],TeLnTypeContinuous,1);
+
+	if (point_visible(x_value, y_value))
+	{
+        	value_to_pixel(x_value, y_value, &x, &y);
+        	draw_symbol(x, y, symbol, w, h);
+        	return true;
+    }
+    return false;
+}
+
+void
+TeGraphPlot :: draw_symbol(int x, int y,int symbol, int w, int h)
+{
+	if( symbol < 0 )		//V2.0-01 GAIA
+	{
+		symbol = 0;
+	}
+	symbol = symbol % 5;		//V2.0-01 GAIA
+
+    	switch (symbol)
+	{
+        case RECTANGLE:
+            	drawLine(x - w/2, y - h/2, x + w/2, y - h/2);
+		drawLine(x + w/2, y - h/2, x + w/2, y + h/2);
+		drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+            	drawLine(x - w/2, y + h/2, x - w/2, y - h/2);
+		break;
+
+        case TRIANGLE:
+		drawLine(x - w/2, y + h/2, x, y - h/2);
+		drawLine(x, y - h/2, x + w/2, y + h/2);
+            	drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+            	break;
+
+        case DIAMOND:
+            	drawLine(x - w/2, y, x, y - h/2);
+            	drawLine(x, y - h/2, x + w/2, y);
+            	drawLine(x + w/2, y, x, y + h/2);
+            	drawLine(x, y + h/2, x - w/2, y);
+            	break;
+
+        case SCROSS:
+            	drawLine(x - w/2, y, x + w/2, y);
+		drawLine(x, y - h/2, x, y + h/2);
+		break;
+
+        case XCROSS:
+		drawLine(x - w/2, y + h/2, x + w/2, y - h/2);
+		drawLine(x - w/2, y - h/2, x + w/2, y + h/2);
+		break;
+    	}
+}
+
+
+void TeGraphPlot :: draw_symbol_legend(int x, int y, int symbol, int w, int h)
+{
+	if( symbol < 0 )		//V2.0-01 GAIA
+	{
+		symbol = 0;
+	}
+	symbol = symbol % 5;		//V2.0-01 GAIA
+
+    	switch (symbol)
+	{
+        case RECTANGLE:
+		drawLine(x - w/2, y - h/2, x + w/2, y - h/2);
+		drawLine(x + w/2, y - h/2, x + w/2, y + h/2);
+		drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+		drawLine(x - w/2, y + h/2, x - w/2, y - h/2);
+		break;
+
+        case TRIANGLE:
+		drawLine(x - w/2, y + h/2, x, y - h/2);
+		drawLine(x, y - h/2, x + w/2, y + h/2);
+		drawLine(x + w/2, y + h/2, x - w/2, y + h/2);
+		break;
+
+        case DIAMOND:
+		drawLine(x - w/2, y, x, y - h/2);
+		drawLine(x, y - h/2, x + w/2, y);
+		drawLine(x + w/2, y, x, y + h/2);
+		drawLine(x, y + h/2, x - w/2, y);
+		break;
+
+        case SCROSS:
+		drawLine(x - w/2, y, x + w/2, y);
+		drawLine(x, y - h/2, x, y + h/2);
+		break;
+
+        case XCROSS:
+		drawLine(x - w/2, y + h/2, x + w/2, y - h/2);
+		drawLine(x - w/2, y - h/2, x + w/2, y + h/2);
+		break;
+    }
+}
+
+
+void
+TeGraphPlot :: label_format(Real values[], int nvalues, int field_width,
+                   int *digits_left, int *digits_right, int *exp_flag)
+{
+	char *str = NULL;
+	int i, j, digits, decimal, sign, trail0;
+
+	digits = sizeof(Real) == sizeof(float) ? FLT_DIG : DBL_DIG;
+	*digits_left = *digits_right = *exp_flag = 0;
+    	for (i = 0; i < nvalues && *exp_flag == 0; i++) {
+		str = ecvt(values[i], digits, &decimal, &sign);
+        	if (decimal > *digits_left) *digits_left = decimal;
+        	for (j = digits-1, trail0 = 0; j >= 0 && str[j] == '0'; j--) trail0++;
+        	j = digits - trail0 - decimal;
+        	if (j > *digits_right) *digits_right = j;
+        	if (*digits_right + *digits_left > field_width-2) {
+            		*exp_flag = 1;
+            		*digits_left = 1;
+            		*digits_right = field_width - 8;
+            		if (*digits_right < 0) *digits_right = 0;
+        	}
+    	}
+   	 str = NULL;
+}
+
+void TeGraphPlot :: find_intersect(Real x_in, Real y_in,
+                    Real *x_out, Real *y_out)
+{
+    	// find values for x_out and y_out that intersect the
+       	// plot boundary on a line between the points (x_in, y_in) inside
+       	// the plot region and (x_out, y_out) outside the plot region
+
+    	Real m, b, temp_x, temp_y;
+    	m = (y_in - *y_out) / (x_in - *x_out);
+    	b = y_in - m * x_in;
+    	if (*x_out >= xminval && *x_out <= xmaxval) {
+        	// only y_out is outside plot region
+        	if (*y_out < yminval) *y_out = yminval;
+        	else if (*y_out > ymaxval) *y_out = ymaxval;
+        	*x_out = (*y_out - b) / m;
+    	}
+    	else
+	{ 
+		if (*y_out >= yminval && *y_out <= ymaxval) {
+        		// only x_out is outside plot region
+        		if (*x_out < xminval) *x_out = xminval;
+        		else if (*x_out > xmaxval) *x_out = xmaxval;
+        		*y_out = *x_out * m + b;
+    		}
+		else
+		{
+        		// both x_out and y_out are outside plot region
+        		if (*y_out < yminval) temp_y = yminval;
+        		else temp_y = ymaxval;
+        		temp_x = (temp_y - b) / m;
+        		if (temp_x >= xminval && temp_x <= xmaxval) {
+            			*y_out = temp_y;
+            			*x_out = temp_x;
+        		}
+        		else {
+            			if (*x_out < xminval) *x_out = xminval;
+            			else *x_out = xmaxval;
+            			*y_out = *x_out * m + b;
+			}
+		}
+	}
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: drawLegend(void)
+{
+    int x, y, h, delta;
+    int i, count = 0;
+
+	for (i = 0; i < Plot_curves; i++)
+	{
+        if (Plot_label.curve[i][0] != '\0') count++;
+	}
+
+    if (count != 0)
+	{
+       	h = Font_height[0] + 4;
+		if (count > 3) h += Font_height[0] + 3;
+        y = getHeight() - h;
+
+		setLineAttributes(Graph_color.lines,TeLnTypeContinuous,0);
+		drawRectangle(0, y, width - 1, h);
+
+        x = Font_width[0] + 1;
+		delta = Font_height[0] + 3;
+        for (count = 0, i = 0; i < Plot_curves; i++)
+	{
+            if (Plot_label.curve[i][0] != '\0' && count < 7)
+			{
+                if (count++ == 3) {
+                    x = Font_width[0] + 1;
+                    y += Font_height[0] + 6;
+                }
+
+				setLineAttributes(Graph_color.curve[i],TeLnTypeContinuous,0);
+				draw_symbol_legend(x, y + delta - Font_height[0]/2, Symbol[i], 7, 7);
+                x += Font_width[0];
+
+				setTextColor(Graph_color.text);
+                drawText (x, y + delta - Font_height[0], Plot_label.curve[i]);
+				x += 10 * Font_width[0];
+            }
+        }
+	}
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: value_to_pixel(Real x_value, Real y_value, int *x_pixel, int *y_pixel)
+{
+	*x_pixel = (int) ((x_value - xminval) /
+               (xmaxval - xminval) * (width - 1) + xupleft);
+	*y_pixel = (int) ((ymaxval - y_value) /
+               (ymaxval - yminval) * (height - 1) + yupleft);
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: pixelToValue(int x_pixel, int y_pixel, Real& x_value, Real& y_value)
+{
+	x_value = (Real) (x_pixel - xupleft) / (width-1) *
+               (xmaxval - xminval) + xminval;
+	y_value = (Real) (yupleft - y_pixel) / (height-1) *
+               (ymaxval - yminval) + ymaxval;
+}
+
+//----------------------------------------------------------------------------------------
+int
+TeGraphPlot :: point_visible(Real x, Real y)
+{
+    	if (x >= xminval && x <= xmaxval &&
+        y >= yminval && y <= ymaxval) return 1;
+    	else return 0;
+}
+
+//FAMI0395 int set_font(int font_number)
+int set_font(int)
+{
+/*
+    	static int font;
+    	int previous_font;
+	// set font to specified font number
+	if (_set_font(font_number) == 0) {
+        	previous_font = font;
+        	font = font_number;
+        	return previous_font;
+    	}
+    	else {
+        	video_err = FONT_ERR;
+        	return ERR;
+    	} */
+
+	return (int)true;	//FAMI0394
+}
+
+void ftos(Real f, int digits_left, int digits_right, int exp_flag, char *s)
+{
+	int i = 0, decimal, sign;
+	char *str = NULL;
+	str = ecvt(f, digits_left+digits_right, &decimal, &sign);
+	if (sign) *s++ = '-';
+	if (exp_flag)
+	{ 	/* exponential format */
+		for (i=0; i < digits_left; i++) *s++ = *str++;
+		*s++ = '.';
+		for (i=0; i < digits_right; i++) *s++ = *str++;
+		*s++ = 'e';
+		decimal -= digits_left;
+		if (decimal < 0)
+		{
+			*s++ = '-';
+			decimal = -decimal;
+		}
+		else *s++ = '+';
+		s += 3;
+		*s-- = '\0';
+		for (i = 0; i < 3; i++)
+		{
+			*s-- = (char) (decimal % 10 + (int) '0');
+			decimal /= 10;
+		}
+	}
+	else
+	{          /* fixed point format */
+		if (decimal <= 0)
+		{
+			if (digits_left > 0) *s++ = '0';
+			if (digits_right > 0) *s++ = '.';
+			for (i = decimal; i != 0 && digits_right > 0 ; i++)
+			{
+				*s++ = '0';
+				digits_right--;
+			}
+			for (i = 0; i < digits_right; i++) *s++ = *str++;
+		}
+		else
+		{
+			for (i = 0; i < decimal; i++) *s++ = *str++;
+			if (digits_right > 0)
+			{
+				*s++ = '.';
+				for (i = 0; i < digits_right; i++) *s++ = *str++;
+			}
+		}
+		*s = '\0';
+	}
+	str = NULL;
+}
+
+//----------------------------------------------------------------------------------------
+
+void
+TeGraphPlot :: plotInit(int pixels_above, int pixels_below, int pixels_left, int pixels_right)
+{
+// initialize Plot variables, reserving the number of pixels specified by
+// pixels_above, pixels_below, pixels_left, and pixels_right for use by
+// the program
+
+	int delta, x_ticks, y_ticks;
+
+// initialize variables appropriately for current plotting device
+	X_pixels = getWidth ();
+	Y_pixels = getHeight ();
+
+    get_plot_fonts();
+    get_font_size(title_font, &title_width, &title_height);
+    get_font_size(label_font, &label_width, &label_height);
+    get_font_size(xaxis_font, &xaxis_width, &xaxis_height);
+    yaxis_direct = get_font_size(yaxis_font, &yaxis_width, &yaxis_height);
+    delta = yaxis_direct == HORIZ_FONT ? yaxis_width : yaxis_height;
+	xupleft = pixels_left + delta + (label_field + 1) * label_width;
+    delta = title_height + label_height/2;
+    yupleft = pixels_above + delta + title_height;
+    Title_y = yupleft - delta;
+
+// make width of Plot region a multiple of x_ticks
+	x_ticks = x_major * x_minor;
+	width = (X_pixels - pixels_right - xupleft -
+		label_field * label_width / 2 + 1)
+		/x_ticks*x_ticks + 1;
+
+// make height of Plot region a multiple of y_ticks
+	y_ticks = y_major * y_minor;
+	delta = 2 * label_height + 1;
+	height = (Y_pixels - pixels_below - yupleft - delta -
+		xaxis_height)/y_ticks*y_ticks + 1;
+
+// define y coordinate for x axis title
+	Xaxis_y = yupleft + height - 1 + delta;
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: get_plot_fonts()
+{
+    	title_font = 0;
+    	label_font = 0;
+    	xaxis_font = 0;
+    	yaxis_font = 1;
+}
+
+//----------------------------------------------------------------------------------------
+int
+TeGraphPlot :: get_font_size(int font_number, int *w, int *h)
+{
+// return width, height, and direction of specified font number
+	if (font_number < FONT_MAX)
+	{
+		*w = Font_width[font_number];
+		*h = Font_height[font_number];
+		return Font_direct[font_number];
+	}
+	else
+	{
+		return ERR;
+	}
+}
+
+//----------------------------------------------------------------------------------------
+void
+TeGraphPlot :: reset()
+{
+	for (int i=0; i<Plot_curves; i++)
+	{
+		Plot_x[i] = NULL;
+		Plot_y[i] = NULL;
+	}
+
+	Plot_curves = 0;  
+	Plot_symbols = 0;  
+	Curve_choice = 0;         
+	Plot_choice = 0;
+}
+
+void TeGraphPlot::drawMoranText (double dx1, double dy1, double dx2, double dy2)
+{
+	int	w, h, x, y;
+	int x1, y1, x2, y2, mx, my;
+
+	setTextColor(Graph_color.text);
+
+	value_to_pixel(dx1, dy1, &x1, &y1);
+	value_to_pixel(dx2, dy2, &x2, &y2);
+	value_to_pixel(0., 0., &mx, &my);
+
+	string tx = "AA";
+	textExtent(tx, w, h);
+	x = (int)(mx + (double)(x2-mx)/2. - (double)w/2.);
+	y = (int)(my - (double)(my-y2)/2. + (double)h/2.);
+	drawText(x, y, (char*)tx.c_str());
+
+	tx = "AB"; 
+	textExtent(tx, w, h);
+	x = (int)(mx - (double)(mx-x1)/2. - (double)w/2.);
+	drawText(x, y, (char*)tx.c_str());
+
+	tx = "BB"; 
+	textExtent(tx, w, h);
+	y = (int)(my + (double)(y1-my)/2. + (double)h/2.);
+	drawText(x, y, (char*)tx.c_str());
+
+	tx = "BA"; 
+	textExtent(tx, w, h);
+	x = (int)(mx + (double)(x2-mx)/2. - (double)w/2.);
+	drawText(x, y, (char*)tx.c_str());
+}
diff --git a/src/terralib/kernel/TeGraph.h b/src/terralib/kernel/TeGraph.h
new file mode 100644
index 0000000..c1813f6
--- /dev/null
+++ b/src/terralib/kernel/TeGraph.h
@@ -0,0 +1,182 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeGraph.h
+    This file deals with graphs in TerraLib
+*/
+
+#ifndef __TERRALIB_INTERNAL_GRAPH_H
+#define __TERRALIB_INTERNAL_GRAPH_H
+
+#include "TeLegendEntry.h"
+#define CURVES_MAX   10
+#define AXIS_MAX     64
+#define TITLE_MAX    64
+#define LABEL_MAX    64
+
+#define XY_ASCII   0
+#define XY_BINARY  1
+#define XYY_ASCII  2
+#define XYY_BINARY 3
+#define PIE_BINARY 4
+#define BAR_BINARY 5
+#define ROSE_BINARY 6
+#define POINT_BINARY 7
+
+#define Real double
+typedef Real* Real_Vector;
+typedef struct {
+	char title[TITLE_MAX+1];
+	char xaxis[AXIS_MAX+1];
+	char yaxis[AXIS_MAX+1];
+	char curve[CURVES_MAX][LABEL_MAX+1];
+} Labels;
+
+class TeGraphPlot
+{
+protected:
+	int label_field;       /* maximum no. of characters in a label field */
+	int major_tick;        /* length of major tick mark (in pixels) */
+	int minor_tick;        /* length of minor tick mark (in pixels) */
+	int x_major;           /* number of x axis divisions */
+	int y_major;           /* number of y axis divisions */
+	int x_minor;           /* number of x axis subdivisions */
+	int y_minor;           /* number of y axis subdivisions */
+	Real xminval;          /* minimum value on x axis */
+	Real xmaxval;          /* maximum value on x axis */
+	Real yminval;          /* minimum value on y axis */
+	Real ymaxval;          /* maximum value on y axis */
+	int xupleft;           /* x pixel coordinate (upper left) */
+	int yupleft;           /* y pixel coordinate (upper left) */
+	int width;             /* width of axes (in pixels) */
+	int height;            /* height of axes (in pixels) */
+	int label_width;       /* width of label character */
+	int label_height;      /* height of label character */
+	int label_font;        /* font number to use for labels */
+	int title_width;       /* width of title characters */
+	int title_height;      /* height of title characters */
+	int title_font;        /* font number to use for title */
+	int xaxis_width;       /* width of x axis characters */
+	int xaxis_height;      /* height of x axis characters */
+	int xaxis_font;        /* font number to use for x axis */
+	int yaxis_width;       /* width of y axis characters */
+	int yaxis_height;      /* height of y axis characters */
+	int yaxis_font;        /* font number to use for y axis */
+	int yaxis_direct;      /* direction of y axis characters */
+	int X_pixels;          /* number of pixels in horizontal direction */
+	int Y_pixels;          /* number of pixels in vertical direction */
+	int Xaxis_y;           /* y pixel coordinate of X axis title */
+	int Yaxis_x;           /* x pixel coordinate of Y axis title */
+	int Title_y;           /* y pixel coordinate of main title */
+
+
+	int Plot_curves;       /* number of curves */
+	int Plot_symbols;      /* maximum number of symbols on curve */
+	int Curve_choice;      /* number of selected curve */
+	int Plot_choice;       /* graphics menu item choice */
+	int Plot_points[CURVES_MAX];    /* number of points in each curve */
+	Real_Vector Plot_x[CURVES_MAX]; /* X data points for each curve */
+	Real_Vector Plot_y[CURVES_MAX]; /* Y data points for each curve */
+	Labels Plot_label;              /* labels for title, axes, and curves */
+
+	int Scale_curve;           /* number of curve to scale (-1 for all) */
+	int Scale_factor;          /* used to scale Y axis for printing */
+	int Output_format;         /* output format for xywrite */
+	int Input_format[CURVES_MAX];          /* format of file loaded */
+	char Data_filename[13];    /* name of last file loaded */
+	TeLegendEntryVector* sliceVector;/* vector of TeLegendEntry */
+	TeColor GPpcor;			   /*piechart color */
+	char *GPpieleg;
+	int GPpointwidth, GPpointheight;
+
+// Private members
+
+	void	draw_plot(void);
+	void	draw_symbols(int curve);
+	void	plot_axes(void);
+	void	plot_ticks(void);
+	void	plot_grid(void);
+	int		plot_labels(void);
+	int		plot_title(char *text);
+	int		plot_xaxis(char *text);
+	int		plot_yaxis(char *text);
+	int     point_visible(Real x, Real y);
+	void    value_to_pixel(Real x_value, Real y_value, int *x_pixel, int *y_pixel);
+	int     plot_curve(Real_Vector x, Real_Vector y, int points, TeColor c);
+	void    label_format(Real values[], int nvalues, int field_width, int *digits_left, int *digits_right, int *exp_flag);
+	void	plot_horiz(char *text, int y, int width);
+	int     plot_point(Real x_value, Real y_value, int pen_status);
+	void    find_intersect(Real x_in, Real y_in, Real *x_out, Real *y_out);
+	void    draw_symbol(int x, int y, int symbol, int width, int height);
+	void    draw_symbol_legend(int x, int y, int symbol, int width, int height);
+	void    get_plot_fonts();
+	int		get_font_size(int font_number, int *width, int *height);
+
+	virtual int	getWidth () = 0;
+	virtual int	getHeight () = 0;
+   	virtual void	setLineAttributes(TeColor c, int , int ) = 0;
+	virtual void	setFillAreaColor (TeColor c) = 0;
+	virtual void	setTextColor (TeColor c) = 0;
+	virtual void	fillRectangle (int x, int y, int dx, int dy) = 0;
+	virtual void	drawRectangle (int x, int y, int dx, int dy) = 0;
+	virtual void	drawLine (int sx, int sy, int dx, int dy) = 0;
+	virtual void	drawText (int x, int y, char* str, double angle = 0.) = 0;
+	virtual void	fillArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c) = 0;
+	virtual void	drawArc (int xc, int yc, int w, int h, double a1, double a2, TeColor c) = 0;
+	virtual void	textExtent ( string &str, int &w, int &h, double angle = 0.) = 0;
+
+// Public members
+
+public :
+	TeGraphPlot ();
+	virtual ~TeGraphPlot ();
+	int		loadDirect ( int format, int curv, int points, Labels& labels, Real_Vector x, Real_Vector y);
+	void	loadHistogram (TeLegendEntryVector& sv, const string& label);
+	void	loadPie (TeLegendEntryVector& sv, const string& label);
+	void	plotInit( int , int , int , int );
+	void	autoScale( void);
+	void	setScale( Real x1, Real x2 , Real y1, Real y2);
+	int		kill( int order);
+	int		plotSymbol( Real x_value, Real y_value,int symbol, int width, int height, int curve=0);
+	void	plotCurves (int with_simbols = 0);
+	void	pixelToValue( int x_p, int y_p, Real& x_v, Real& y_v);
+	void	reset();
+	void    setColorGrid( int , int , int );
+	void    setColorText( int , int , int );
+	void    setColorLine( int , int , int );
+	int		setColorCurve( int ,int , int , int );
+	void    setColorSymbol( int , int, int, int=-1, int=7, int=7); // r, g, b, curve, width, height
+	void    setSymbolType( int, int=0); // type , curve
+	void	drawLegend( void);
+	int		setGridSize( int );
+	int		setGridSize( int, int, int, int );
+	void 	drawMoranText (double x1, double y1, double x2, double y2);
+
+	void	pieLegends ();
+};
+
+// Utility functions
+
+void show_err(char *s);
+void ftos(Real f, int digits_left, int digits_right, int exp_flag, char *s);
+
+#endif
diff --git a/src/terralib/kernel/TeGroupingAlgorithms.cpp b/src/terralib/kernel/TeGroupingAlgorithms.cpp
new file mode 100644
index 0000000..15646a2
--- /dev/null
+++ b/src/terralib/kernel/TeGroupingAlgorithms.cpp
@@ -0,0 +1,112 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeGroupingAlgorithms.h"
+
+void
+TeGroupByUniqueValue(vector<string>& vec, TeAttrDataType tipo, vector<TeSlice>& result, int precision)
+{
+	unsigned int i, j;
+		
+	if (tipo == TeINT)
+	{
+		vector<int> v;
+		for (i = 0; i < vec.size(); ++i)
+			v.push_back(atoi(vec[i].c_str()));
+		sort(v.begin(), v.end());
+
+		for (i = 0; i < v.size(); ++i)
+			vec[i] = Te2String(v[i]);
+	}
+	else if (tipo == TeREAL)
+	{
+		vector<double> v;
+		for (i = 0; i < vec.size(); ++i)
+		{
+			double a = atof(vec[i].c_str());
+			v.push_back(a);
+		}
+		stable_sort(v.begin(), v.end());
+
+		for (i = 0; i < v.size(); ++i)
+			vec[i] = Te2String(v[i], precision);
+	}
+	else
+	{
+		sort(vec.begin(), vec.end());
+	}
+
+	// Check the elements that are equal, incrementing
+	// the variable count associated to each one
+	int count = 1;
+	TeSlice slice;
+	unsigned int sz = vec.size();
+	for (i = 0, j = 1; i < sz - 1 && j < sz; ++i, ++j)
+	{
+		if (vec[i] == vec[j])
+			++count;
+		else
+		{
+			slice.from_ = vec[i];
+			slice.count_ = count;
+			result.push_back(slice);
+			count = 1;
+		}
+	}
+
+	if (vec[i] == vec[i - 1])
+	{
+		slice.from_ = vec[i];
+		slice.count_ = count;
+		result.push_back(slice);
+	}
+	else
+	{
+		slice.from_ = vec[i];
+		slice.count_ = 1;
+		result.push_back(slice);
+	}
+}
+
+void
+TeGroupByEqualStep(double min, double max, int nstep, vector<TeSlice>& result, int precision)
+{
+	double slice = (max - min)/double(nstep);
+	int ns;
+	for (ns=0;ns<nstep;ns++)
+	{
+		TeSlice ps;
+		ps.count_ = 0;
+		ps.from_ = Te2String(min+double(ns)*slice, precision);
+		ps.to_ = Te2String(min+double(ns+1)*slice, precision);
+		result.push_back(ps);
+	}
+	min = TeAdjustToPrecision(min, precision, true);
+	result[0].from_ = Te2String(min, precision);
+	max = TeAdjustToPrecision(max, precision);
+	result[result.size()-1].to_ = Te2String(max, precision);
+}
diff --git a/src/terralib/kernel/TeGroupingAlgorithms.h b/src/terralib/kernel/TeGroupingAlgorithms.h
new file mode 100644
index 0000000..964789c
--- /dev/null
+++ b/src/terralib/kernel/TeGroupingAlgorithms.h
@@ -0,0 +1,280 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeGroupingAlgorithms.h
+    This file contains some generic grouping algorithms (based on iterators)
+*/
+
+#ifndef  __TERRALIB_INTERNAL_GROUPINGALGORITHMS_H
+#define  __TERRALIB_INTERNAL_GROUPINGALGORITHMS_H
+
+#include "TeDefines.h"
+#include "TeSlice.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+
+#include <math.h>
+#include <time.h>
+#include <algorithm>
+
+
+//! Finds the element with minimum value among the elements contained in a range of iterators
+template<typename It> void
+TeMinimumValue(It begin, It end, vector<double>& minValue, double dummy=-9999.99, bool usesDummy=false)
+{
+	for (int i=0; i<minValue.size(); i++)
+		minValue[i] = TeMAXFLOAT;
+
+	It it = begin;
+	double val;
+	while ( it != end) 
+	{
+		if (!(usesDummy && dummy == val))
+			for (int i=0; i<minValue.size(); i++)
+			{
+				val= (*it)[i];
+				if (val < minValue[i])
+					minValue[i] = val;
+			}
+		it++;
+	}
+}
+
+//! Finds the element with maximum value among the elements contained in a range of iterators
+template<typename It> void
+TeMaximumValue(It begin, It end, vector<double>& maxValue, double dummy=-9999.99, bool usesDummy=false)
+{
+	for (int i=0; i<maxValue.size(); i++)
+		maxValue[i] = -TeMAXFLOAT;
+
+	It it = begin;
+	double val;
+	while ( it != end) 
+	{
+		if (!(usesDummy && dummy == val))
+			for (int i=0; i<maxValue.size(); i++)
+			{
+				val= (*it)[i];
+				if (val > maxValue[i])
+					maxValue[i] = val;
+			}
+		it++;
+	}
+}
+
+void
+TeGroupByEqualStep(double min, double max, int nstep, vector<TeSlice>& result, int precision=0);
+
+/** @defgroup GenGroupAlg Generic Algorithms to do grouping
+ *  A set of of generic functions to do grouping
+ *  @{
+ */
+
+//! Groups a set of elements defined by a range of iterators in nstep groups, using Equal Step algorithm
+template<class iterator> void
+TeGroupByEqualStep(iterator begin, iterator end, int nstep, vector<TeSlice>& result,
+				   int precision=0, bool countElements = true)
+{
+	double	min = TeMAXFLOAT;
+	double	max = -TeMAXFLOAT;
+
+	iterator it=begin;
+	while(it < end)
+	{
+		min = MIN(min, *it);
+		max = MAX(max, *it);
+		it++;
+	}
+	double slice = (max - min)/double(nstep);
+	int ns;
+	for (ns=0;ns<nstep;ns++)
+	{
+		TeSlice ps;
+		ps.count_ = 0;
+		ps.from_ = Te2String(min+double(ns)*slice, precision);
+		ps.to_ = Te2String(min+double(ns+1)*slice, precision);
+		result.push_back(ps);
+	}
+	min = TeAdjustToPrecision(min, precision, true);
+	result[0].from_ = Te2String(min, precision);
+	max = TeAdjustToPrecision(max, precision);
+	result[result.size()-1].to_ = Te2String(max, precision);
+
+	// Set the number of elements for each slice
+	if (countElements == true)
+		TeElemCountingBySlice(begin, end, result);
+}
+
+//! Groups a set of elements defined by a range of iterators in nstep groups, using Quantil algorithm
+template<class iterator> void
+TeGroupByQuantil(iterator begin, iterator end, int nstep, vector<TeSlice>& result,
+				 int precision = 0, bool countElements = true)
+{
+	sort(begin, end);
+
+	int size = end - begin;
+	double	step = (double)size / (double)nstep;
+
+	int	n = 0;
+	iterator it = begin;
+	while(it < end)
+	{
+		TeSlice	ps;
+		ps.from_ = Te2String((*it), precision);
+		int p = (int)(step * (double)++n + .5);
+		it = begin + p;
+		if(it < end)
+			ps.to_ = Te2String((*it), precision);
+		else
+			ps.to_ = Te2String(*(it-1), precision);
+		result.push_back(ps);
+	}
+	if(end-begin > 1)
+	{
+		double min = (*begin);
+		double max = (*(end-1));
+		min = TeAdjustToPrecision(min, precision, true);
+		result[0].from_ = Te2String(min, precision);
+		max = TeAdjustToPrecision(max, precision);
+		result[result.size()-1].to_ = Te2String(max, precision);
+	}
+
+	// Set the number of elements for each slice
+	if (countElements == true)
+		TeElemCountingBySlice(begin, end, result);
+}
+
+//! Groups a set of elements defined by a range of iterators in ndev groups, using Standanrd deviation algorithm
+template<class iterator> void
+TeGroupByStdDev(iterator begin, iterator end, double ndev, vector<TeSlice>& result, string& rmean,
+				int precision = 0, bool countElements = true)
+{
+	// Compute mim, max and mean
+	double	min = TeMAXFLOAT;
+	double	max = -TeMAXFLOAT;
+	long double	sum=0.;
+	long double	sm2=0.;
+	iterator it=begin;
+	while(it < end)
+	{
+		min = MIN(min, *it);
+		max = MAX(max, *it);
+		sum += (*it);
+		sm2 += ((*it) * (*it));
+		it++;
+	}
+	double cont = (double)(end - begin);
+	double	mean = (double)(sum/cont);
+	long double var = (sm2 / cont) - (mean * mean);
+	double	sdev = sqrt(var);
+
+	double	slice = sdev * ndev;
+
+	vector<TeSlice>	aux;
+	rmean = Te2String(mean, precision);
+	double	val = mean;
+	while(val-slice > min-slice)
+	{
+		TeSlice ps;
+		double v = val - slice;
+		ps.from_ = Te2String(v, precision);
+		ps.to_ = Te2String(val, precision);
+		aux.push_back(ps);
+		val = v;
+	}
+
+	if(aux.size())
+	{
+		typename vector<TeSlice>::iterator sit = aux.end() - 1;
+		while(sit >= aux.begin())
+			result.push_back(*sit--);
+	}
+
+	string media = "mean = " + rmean;
+	TeSlice ps;
+	ps.from_ = media;
+	ps.to_.clear();
+	result.push_back(ps);
+	val = mean;
+	while(val+slice < max+slice)
+	{
+		TeSlice ps;
+		double	v = val + slice;
+		ps.from_ = Te2String(val, precision);
+		ps.to_ = Te2String(v, precision);
+		result.push_back(ps);
+		val = v;
+	}
+	if(result.size() > 2)
+	{
+		if (result[0].from_.find("mean")  == string::npos)
+		{
+			min = TeAdjustToPrecision(min, precision, true);
+			result[0].from_ = Te2String(min, precision);
+		}
+		if (result[result.size()-1].from_.find("mean")  == string::npos)
+		{
+			max = TeAdjustToPrecision(max, precision);
+			result[result.size()-1].to_ = Te2String(max, precision);
+		}
+	}
+
+	// Set the number of elements for each slice
+	if (countElements == true)
+		TeElemCountingBySlice(begin, end, result);
+}
+
+
+template<class iterator> void
+TeElemCountingBySlice(iterator begin, iterator end, vector<TeSlice>& result)
+{
+	iterator it;
+	double from, to;
+
+	for (unsigned int i = 0; i < result.size(); ++i)
+	{
+		TeSlice& sl = result[i];
+		sl.count_ = 0;
+		from = atof(sl.from_.c_str());
+		to = atof(sl.to_.c_str());
+		for (it = begin; it != end; ++it)
+		{
+			if (*it >= from && *it < to)
+				++sl.count_;
+		}
+	}
+}
+
+
+//! Groups a set of elements in a vector of string  using Unique Value algorithm
+void TeGroupByUniqueValue(vector<string>& vec, TeAttrDataType tipo, vector<TeSlice>& result, int precision);
+
+/** @} */ 
+#endif
+
+
+
+
+
+ 
+
+
diff --git a/src/terralib/kernel/TeImportRaster.cpp b/src/terralib/kernel/TeImportRaster.cpp
new file mode 100644
index 0000000..ef9daa8
--- /dev/null
+++ b/src/terralib/kernel/TeImportRaster.cpp
@@ -0,0 +1,309 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeRasterRemap.h"
+#include "TeDecoderDatabase.h"
+#include "TeRaster.h"
+#include "TeDecoderMemory.h" 
+#include "TeRasterParams.h"
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+#include "TeImportRaster.h"
+
+
+TeLayer* 
+TeImportRaster (const string& layerName, TeRaster* rasterIn, TeDatabase* database)
+{
+	if (!database || layerName.empty() || !rasterIn || 
+		(rasterIn->status() != TeREADYTOREAD && rasterIn->status() != TeREADYTOWRITE))
+		return 0;
+
+	// find a valid layer name
+	string newLayerName = layerName;
+	TeLayerMap& layerMap = database->layerMap();
+	TeLayerMap::iterator it;
+	bool flag = true;
+	int n = 1;
+	while (flag)
+	{
+		for (it = layerMap.begin(); it != layerMap.end(); ++it)
+		{
+			if (TeStringCompare(it->second->name(),newLayerName))
+				break;
+		}
+		if (it == layerMap.end())
+			flag = 0;
+		else
+			newLayerName = layerName + "_" +Te2String(n);
+		n++;	
+	}
+
+	TeLayer* newLayer = new TeLayer(newLayerName,database,rasterIn->projection());
+	if (newLayer->id() <= 0 )
+		return 0;				// couldn�t create new layer
+
+	unsigned int bw = rasterIn->params().ncols_;
+	unsigned int bh = 1;
+	if (rasterIn->params().nlines_ > 128 || rasterIn->params().ncols_ > 128)
+	{
+		bw = 128;
+		bh = 128;
+	}
+
+	bool res = TeImportRaster(newLayer, rasterIn, bw, bh, TeNoCompression, 
+		       "", rasterIn->params().dummy_[0], false, TeNoExpansible);
+	if (res)
+		return newLayer;
+
+	database->deleteLayer(newLayer->id());
+	delete newLayer;
+	return 0;
+}
+
+
+// This function mosaics an input raster to one previsously existing in a TerraLib layer
+bool TeMosaicRaster(TeRaster* rasterIn, TeLayer* layer,  const string& objectId)
+{
+	// layer must exist and input raster should be read to be read
+	if (!layer || !rasterIn  || rasterIn->status() != TeREADYTOREAD)
+		return false;
+	
+	TeRaster* rasterOut;
+	if (!objectId.empty())	// if object id informed try to get raster associated to it
+		rasterOut = layer->raster(objectId,'w');
+	else					// else try to get first one found
+		rasterOut = layer->raster();
+
+	if (!rasterOut)			// no raster asked or no raster at all
+		return false;				// can not do mosaic
+
+	// allows mosaic of same photometric types only
+	if (rasterOut->params().photometric_[0] != rasterIn->params().photometric_[0])
+		return false;
+
+	// increases output box to: input raster box + output raster box 
+	TeBox boxIn = rasterIn->params().box();
+
+	// if necessary remap input box to output projection 
+	if (!(*(rasterIn->projection()) == *(rasterOut->projection())))
+		boxIn = TeRemapBox(boxIn,rasterIn->projection(),rasterOut->projection());
+
+	// adjust it to expansible values
+	boxIn = adjustToCut(boxIn, rasterOut->params().blockWidth_*rasterOut->params().resx_, 
+							   rasterOut->params().blockHeight_*rasterOut->params().resy_);
+
+	// sum stored and input boxes
+	TeBox newBox = rasterOut->params().boundingBox();
+	updateBox(newBox,boxIn);
+
+	// update box in parameters of the raster and it's decoder
+	rasterOut->params().boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,
+											  rasterOut->params().resx_, rasterOut->params().resy_);
+
+	rasterOut->decoder()->params().boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,
+											  rasterOut->params().resx_, rasterOut->params().resy_);
+	rasterOut->params().nTilesInMemory_ = 0;
+	
+	// creates a remapping from input raster to output raster
+	TeRasterRemap remap(rasterIn, rasterOut);
+	if (remap.apply(true))			// o.k.
+	{
+		TeRasterParams rp = rasterOut->params();
+
+		// atualizes the representation box in memory
+		TeRepresentation* repp = layer->getRepresentation(TeRASTER);
+		TeBox boxNew = rp.box();
+		updateBox(repp->box_,rp.box());
+		repp->nCols_ = rp.ncols_;
+		repp->nLins_ = rp.nlines_;
+		repp->resX_ = rp.resx_;
+		repp->resY_ = rp.resy_;
+
+		// atualizes representation in the database
+		layer->database()->updateRasterRepresentation(layer->id(),rp,objectId);
+		layer->updateLayerBox(rp.boundingBox());
+		rasterOut->clear();
+		return true;
+	}
+	return false;
+}
+
+
+bool TeImportRaster (TeLayer* layer, TeRaster* rasterIn, 
+					 unsigned int bWidth, unsigned int bHeight,TeCompressionMode compress,
+					 const string& objectId, double dummy, bool useDummy,
+					 TeRasterTilingType indext)
+{	
+	if (!layer || !rasterIn)
+		return false;
+
+	string objId;
+	if (objectId.empty())
+		objId = "O1";
+	else
+		objId = objectId;
+
+	// check if there  is a raster geometry to be modified
+	string tableGeo;
+	TeRepresentation* repp = 0;
+	repp = layer->getRepresentation(TeRASTER);
+	if (!repp || !layer->raster(objectId))	// layer doesn�t have any 
+	{										// or the desired raster geometry
+											// a new one should be created
+
+		TeRasterParams parOut = rasterIn->params();		// parameters of the raster being created	
+														// start with the same parameters as input raster
+		
+		parOut.setCompressionMode(compress);		// overwrites some parameters 
+		parOut.nTilesInMemory_ = 0;					// according to the specified in the interface
+		parOut.blockHeight_ = bHeight;
+		parOut.blockWidth_ = bWidth;
+		parOut.setDummy(dummy);
+		parOut.useDummy_ = useDummy;
+		parOut.tiling_type_ = indext;
+		
+		parOut.dxI_= 0.0;							// raster stored is corrected  
+		parOut.dyJ_= 0.0;							// to translation/rotation 
+		parOut.dxJ_ = 0.0;
+		parOut.dyI_ = 0.0;		
+		
+		TeBox newBox = rasterIn->params().boundingBox();
+		TeProjection *projIn = rasterIn->projection();	
+		TeProjection *projOut = layer->projection();
+		parOut.projection(projOut);
+		if (projIn && projOut && !(*projIn == *projOut))
+		{
+			TeBox boxIn = rasterIn->params().boundingBox();
+			newBox = TeRemapBox (boxIn,projIn,projOut);
+			parOut.resx_ = newBox.width()/parOut.ncols_;	// recalculates resolutions 
+			parOut.resy_ = newBox.height()/parOut.nlines_;  // for the new projection
+			parOut.boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,parOut.resx_,parOut.resy_);
+			newBox = parOut.box();
+		}
+	
+		if (indext == TeExpansible)							// if mosaicable adjust box 
+			parOut.resizeToTiling(newBox,bWidth,bHeight);	// to be cut in blocks of bWidth X bHeight (in projection units)
+
+		parOut.decoderIdentifier_ = "DB";					// parameters of the decoder
+		parOut.fileName_ = "RasterLayer" + Te2String(layer->id()) + "_R_" + objId;
+
+		if ((parOut.photometric_[0] == TeRASTERPALETTE 
+           || parOut.photometric_[0] == TeRASTERKERNEL))
+			parOut.lutName_ = parOut.fileName_ + "_LUT";
+
+		if (!layer->addRasterGeometry(parOut,objId))		// creates the empty raster geometry
+			return false;
+		
+		TeRaster* rasterOut = layer->raster(objId,'w');
+		TeRasterRemap remap(rasterIn, rasterOut);
+		if (remap.apply(true))			// o.k.
+		{
+			TeRasterParams rp = rasterOut->params();
+
+			// atualizes the representation box in memory
+			TeRepresentation* repp = layer->getRepresentation(TeRASTER);
+			TeBox boxNew = rp.box();
+			updateBox(repp->box_,rp.box());
+			repp->nCols_ = rp.ncols_;
+			repp->nLins_ = rp.nlines_;
+			repp->resX_ = rp.resx_;
+			repp->resY_ = rp.resy_;
+
+			// atualizes representation in the database
+			layer->database()->updateRasterRepresentation(layer->id(),rp,objectId);
+			layer->updateLayerBox(rp.boundingBox());
+			rasterOut->clear();
+			return true;
+		}
+		return false;
+	}
+	else
+	{
+		// layer contains already a raster representation associated to the
+		// object id: calls mosaic operation
+		return TeMosaicRaster(rasterIn,layer,objId);
+	}
+}
+
+
+bool 
+TeBuildLowerResolution(TeLayer* layer, TeRaster* rasterIn, int resFac, const string& objectId)
+{
+	if (!layer || !rasterIn)	// layer and input raster pointers shouldn't be null
+		return false;
+
+	string objId;				// if empty try to get the default object identification
+	if (objectId.empty())
+		objId = "O1";
+	else
+		objId = objectId;	
+	
+	string tableName;
+	TeRepresentation* repp = layer->getRepresentation(TeRASTER);
+	if (repp)
+	{
+		tableName = layer->database()->getRasterTable(layer->id(), objId);
+		if (tableName.empty())	
+			return false;		// layer doesn�t have a raster geometry to this object id
+	}
+	else					
+		return false;			// layer doesn�t have any raster geometry
+
+	// retrieves the original raster
+	TeRaster* originalRaster = layer->raster(objId);
+	TeBox bbOriginalRes = originalRaster->params().boundingBox();
+
+	// builds some parameters relative to the new resolution
+	TeRasterParams parNewRes = originalRaster->params();
+	parNewRes.resolution_ = resFac;
+	parNewRes.mode_ = 'w';
+	parNewRes.boundingBoxResolution(bbOriginalRes.x1_, bbOriginalRes.y1_,bbOriginalRes.x2_, bbOriginalRes.y2_,
+									parNewRes.resx_*resFac, parNewRes.resy_*resFac);
+
+	// adjust box to tiling in geographical coordinates
+	if (originalRaster->params().tiling_type_ == TeExpansible)
+	{
+		TeBox b = parNewRes.boundingBox();
+		int w = parNewRes.blockWidth_;
+		int h = parNewRes.blockHeight_;
+		parNewRes.resizeToTiling(b, w, h);
+	} 
+
+
+	// create a decoder to raster in a TerraLib database 
+	TeDecoderDatabase *dbDecoder = new TeDecoderDatabase(parNewRes);
+	dbDecoder->setDB (layer->database());
+
+	TeRaster* rasterOut = new TeRaster();
+	rasterOut->setDecoder(dbDecoder);
+	rasterOut->init();
+
+	// remap;
+	TeRasterRemap remap;
+	remap.setInput(rasterIn);
+	remap.setOutput(rasterOut);
+	bool status = remap.apply(true);
+	rasterOut->clear();
+	delete dbDecoder;
+	return status;
+}
diff --git a/src/terralib/kernel/TeImportRaster.h b/src/terralib/kernel/TeImportRaster.h
new file mode 100644
index 0000000..200908f
--- /dev/null
+++ b/src/terralib/kernel/TeImportRaster.h
@@ -0,0 +1,104 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeImportRaster.h
+    This file contains functions to support importing of
+	raster data into a TerraLib database
+*/
+#ifndef __TERRALIB_INTERNAL_IMPORTRASTER_H
+#define __TERRALIB_INTERNAL_IMPORTRASTER_H
+
+#include "TeDataTypes.h"
+#include "TeRasterParams.h"
+
+#include <string>
+using namespace std;
+
+class TeLayer;
+class TeRaster;
+/** @defgroup RasterFunctions Functions to deal with raster data
+ *  @{
+*/
+//! Imports a TeRaster object to a database creationg a new TeLayer
+/*!
+	This function imports a raster to the database, generating a new layer.
+      \param layerName name of the layer to be created
+      \param rasterIn a pointer to the raster representation to be imported
+      \param database a pointer to the database where the raster will be imported
+	  \returns a pointer to the generated layer
+*/
+TeLayer* 
+TeImportRaster (const string& layerName, TeRaster* rasterIn, TeDatabase* database);
+
+
+//! Imports a TeRaster object to a TeLayer
+/*!
+	This function imports a raster as a geometry of an object of a layer.
+      \param layer pointer to a layer already created
+      \param rasterIn a raster representation
+	  \param bWidth width of the blocks used to store the raster
+	  \param bHeight height of the blocks used to store the raster
+	  \param compress compression type
+	  \param objectId object identification associated to this raster
+	  \param dummy value to be used as a no data value when importing
+	  \param useDummy flag used to indicate that imported raster will have a dummy value
+	  \param indext type of tiling used to import raster
+	  \returns true or false whether the raster was imported successfully
+*/
+bool 
+TeImportRaster (TeLayer* layer, TeRaster* rasterIn, unsigned int bWidth=512, unsigned int bHeight=512, 
+				TeCompressionMode compress = TeNoCompression, const string& objectId="", double dummy=255,bool useDummy = false, TeRasterTilingType indext=TeNoExpansible);
+
+//! This function mosaics an input raster to one previsously existing in a TerraLib layer
+/*!
+     \param rasterIn a raster representation
+     \param layer pointer to an existing layer 
+	 \param objectId object identification associated to this raster
+	 \returns true or false whether the mosaic operation was successfull
+*/
+bool 
+TeMosaicRaster(TeRaster* rasterIn, TeLayer* layer,  const string& objectId="");
+
+
+//! Builds a degraded resolution of a raster data
+/*!
+      \param layer pointer to a layer already created 
+      \param rasterIn a raster representation
+	  \param resFac  value to multiply the original resolution
+	  \param objectId object identification associated to this raster
+	  \returns true or false whether the raster was imported successfully
+*/
+bool 
+TeBuildLowerResolution(TeLayer* layer, TeRaster* rasterIn, int resFac, const string& objectId="");
+/** @} */ 
+
+/** \example ImportRaster1.cpp
+ * This is an example of how to import a raster data to a TerraLib database
+ */
+
+/** \example ImportRaster2.cpp
+ * This is an example of how to build a mosaic of images as a layer in a TerraLib database
+ */
+
+#endif
+
diff --git a/src/terralib/kernel/TeInitQuerierStrategy.cpp b/src/terralib/kernel/TeInitQuerierStrategy.cpp
new file mode 100644
index 0000000..b3b0b38
--- /dev/null
+++ b/src/terralib/kernel/TeInitQuerierStrategy.cpp
@@ -0,0 +1,41 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeInitQuerierStrategy.h"
+#include "TeQuerierDBStr1.h"
+#include "TeQuerierDBStr2.h"
+#include "TeQuerierDBStr3.h"
+#include "TeQuerierSHP.h"
+
+
+void TeInitQuerierStrategies()
+{	
+	static TeQuerierDBStr1Factory querierDBStr1("querierDBStr1");
+
+	static TeQuerierDBStr2Factory querierDBStr2("querierDBStr2");
+
+	static TeQuerierDBStr3Factory querierDBStr3("querierDBStr3");
+	
+	static TeQuerierSHPFactory querierSHP("querierSHP");
+}
diff --git a/src/terralib/kernel/TeInitQuerierStrategy.h b/src/terralib/kernel/TeInitQuerierStrategy.h
new file mode 100644
index 0000000..6654c0c
--- /dev/null
+++ b/src/terralib/kernel/TeInitQuerierStrategy.h
@@ -0,0 +1,32 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIERINIT_H
+#define  __TERRALIB_INTERNAL_QUERIERINIT_H
+
+//! function to init the querier strategies
+void TeInitQuerierStrategies();
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeInitRasterDecoders.cpp b/src/terralib/kernel/TeInitRasterDecoders.cpp
new file mode 100644
index 0000000..9ffaa3a
--- /dev/null
+++ b/src/terralib/kernel/TeInitRasterDecoders.cpp
@@ -0,0 +1,86 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeInitRasterDecoders.h"
+#include "TeDecoderMemoryMap.h"
+#include "TeDecoderMemory.h"
+#include "TeDecoderTIFF.h"
+#ifdef WIN32
+#ifdef _MRSIDSUPPORT
+#include "TeDecoderMrSID.h"
+#endif
+#include "TeDecoderJPEG.h"
+#endif
+#include "TeDecoderDatabase.h"
+#include "TeDecoderFile.h"
+#include "TeDecoderSPR.h"
+#include "TeDecoderASCIIGrid.h"
+
+#include <map>
+
+void 
+TeInitRasterDecoders()
+{
+	static TeDecoderDatabaseFactory theDecoderDatabaseFactory("DB");
+
+	static TeDecoderMemoryFactory theDecoderMemoryFactory("MEM");
+
+	static TeDecoderMemoryMapFactory theDecoderMemoryMapFactory("MEMMAP");
+	TeDecoderFactory::instanceName2Dec()["raw"]  = "MEMMAP";	
+	TeDecoderFactory::instanceName2Dec()["RAW"]  = "MEMMAP";	
+
+
+	static TeDecoderTIFFFactory theDecoderTIFFFactory("TIF");
+	TeDecoderFactory::instanceName2Dec()["tif"]  = "TIF";	
+	TeDecoderFactory::instanceName2Dec()["tiff"] = "TIF";	
+	TeDecoderFactory::instanceName2Dec()["TIF"] = "TIF";	
+	TeDecoderFactory::instanceName2Dec()["TIFF"] = "TIF";
+
+	static TeDecoderSPRFactory theDecoderSPRFactory("SPR");
+	TeDecoderFactory::instanceName2Dec()["spr"]  = "SPR";	
+	TeDecoderFactory::instanceName2Dec()["SPR"] = "SPR";
+	
+	static TeDecoderASCIIGridFactory theDecoderASCIIGridFactory("ASCIIGRID");
+	TeDecoderFactory::instanceName2Dec()["ascii"]  = "ASCIIGRID";	
+	TeDecoderFactory::instanceName2Dec()["asc"]  = "ASCIIGRID";	
+	TeDecoderFactory::instanceName2Dec()["ASCII"]  = "ASCIIGRID";	
+	TeDecoderFactory::instanceName2Dec()["txt"]  = "ASCIIGRID";	
+	TeDecoderFactory::instanceName2Dec()["TXT"]  = "ASCIIGRID";	
+
+
+#ifdef WIN32
+	static TeDecoderJPEGFactory theDecoderJPEGFactory("JPEG");
+	TeDecoderFactory::instanceName2Dec()["jpg"]  = "JPEG";	
+	TeDecoderFactory::instanceName2Dec()["jpeg"] = "JPEG";
+
+	static TeDecoderFileFactory theDecoderFileFactory("RAW");
+
+#ifdef _MRSIDSUPPORT
+	static TeDecoderMrSIDFactory theDecoderMrSIDFactory("MrSID");
+	TeDecoderFactory::instanceName2Dec()["sid"] = "MrSID";
+	TeDecoderFactory::instanceName2Dec()["SID"] = "MrSID";
+	TeDecoderFactory::instanceName2Dec()["Sid"] = "MrSID";
+#endif
+#endif	
+
+}
diff --git a/src/terralib/kernel/TeInitRasterDecoders.h b/src/terralib/kernel/TeInitRasterDecoders.h
new file mode 100644
index 0000000..0261eb7
--- /dev/null
+++ b/src/terralib/kernel/TeInitRasterDecoders.h
@@ -0,0 +1,33 @@
+//***********************************************************************
+//      TerraLib is a GIS Classes and Functions Library that 
+//      strongly explores Spatial Database Technologies 
+//
+//      Copyright � 2002 INPE and Tecgraf/PUC-Rio. 
+//
+//      This library is free software; you can redistribute it 
+//      and/or modify it under the terms of the GNU Lesser General 
+//      Public License as published by the Free Software Foundation
+//      version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//      
+//
+//      Send questions or suggestions about the TerraLib Project 
+//      to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TeInitRasterDecoders.h
+    This file contains functions to deal with the initialization of raster decoding tool
+*/
+#ifndef TeInitRasterDecoders_H
+#define TeInitRasterDecoders_H
+
+//! Initializes the system of decoding raster data in different formats
+/*! 
+	Source file should be customized to reflect the formats and identifiers
+	associate to each raster format.
+	This function should be called by all applications that instantiate a 
+	TeRaster.
+	\sa TeRaster TeDecoder
+*/
+void TeInitRasterDecoders();
+#endif
+
diff --git a/src/terralib/kernel/TeIntersector.cpp b/src/terralib/kernel/TeIntersector.cpp
new file mode 100644
index 0000000..c215d77
--- /dev/null
+++ b/src/terralib/kernel/TeIntersector.cpp
@@ -0,0 +1,202 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeIntersector.h"
+#include <map>
+
+using namespace std;
+
+//---------------- TeIntersectionsBO ----------------//
+bool TeINTERSECTOR2::TeIntersects(const TeLine2D& redLine, const TeLine2D& blueLine)
+{
+	if(redLine.size() < 2 || blueLine.size() < 2) 
+		return false; 
+
+	if(TeDisjoint(redLine.box(), blueLine.box()))
+		return false;
+
+	unsigned int i = 0;
+	unsigned int j = 0;
+
+	TeBox interBox;
+	
+	// Creates a intersection box from lines boxes.
+	::TeIntersection(redLine.box(), blueLine.box(), interBox);
+
+	unsigned int nstep_redLine  = redLine.size() - 1;
+	unsigned int nstep_blueLine = blueLine.size() - 1;
+
+	TeSegmentIntersectionType t = TeImproperIntersection;
+
+	for(i = 0; i < nstep_redLine; ++i)
+	{
+		// Creates the segment box.
+		TeBox red_box = makeBox(redLine[i].x(), redLine[i].y(), redLine[i+1].x(), redLine[i+1].y());
+
+		// See if red segment box intersects with the intersection box.
+		if(TeDisjoint(interBox, red_box))
+			continue;	// If it doesn't intersect, go to another segment => skip comparasion beteween other "m" segments.
+
+		for(j = 0; j < nstep_blueLine; ++j)
+		{
+			// Check intersection.
+			if(TeIntersects(redLine[i], redLine[i+1], blueLine[j], blueLine[j+1], t))
+				return true;
+		}
+	}	
+
+	return false;
+}
+
+
+
+bool TeINTERSECTOR2::TeSafeIntersections(const TeLine2D& redLine, const TeLine2D& blueLine, TeVectorBoundaryIP& report, const unsigned int& redObjId, const unsigned int& blueObjId)
+{
+	if(redLine.size() < 2 || blueLine.size() < 2) 
+		return false; 
+
+	if(TeDisjoint(redLine.box(), blueLine.box()))
+		return false;
+
+	unsigned int i = 0;
+	unsigned int j = 0;
+
+	TeBox interBox;
+	
+	bool hasIntersections = false;
+
+	// Creates a intersection box from lines boxes.
+	::TeIntersection(redLine.box(), blueLine.box(), interBox);
+
+	unsigned int nstep_redLine  = redLine.size() - 1;
+	unsigned int nstep_blueLine = blueLine.size() - 1;
+
+	TeSegmentIntersectionType t = TeImproperIntersection;
+
+	for(i = 0; i < nstep_redLine; ++i)
+	{
+		// Creates the segment box.
+		TeBox red_box = makeBox(redLine[i].x_, redLine[i].y_, redLine[i+1].x_, redLine[i+1].y_);
+
+		// See if red segment box intersects with the intersection box.
+		if(TeDisjoint(interBox, red_box))
+			continue;	// If it doesn't intersect, go to another segment => skip comparasion beteween other "m" segments.
+
+		for(j = 0; j < nstep_blueLine; ++j)
+		{
+			// Check intersection.
+			TeBoundaryIP ip;
+
+			if(TeIntersection(redLine[i], redLine[i+1], blueLine[j], blueLine[j+1], ip, t))
+			{
+				hasIntersections = true;
+
+				ip.redPartNum_ = redObjId;
+				ip.redSegNum_ = i;
+				ip.bluePartNum_ = blueObjId;
+				ip.blueSegNum_ = j;
+
+				if(ip.coords_.size() == 2)	//overlap
+				{
+					// Verificar se os pontos est�o em ordem crescente
+					if(ip.coords_[0].x_ < ip.coords_[1].x_)
+					{
+						report.push_back(ip);
+					}
+					else if(ip.coords_[0].x_ > ip.coords_[1].x_)
+					{
+						swap(ip.coords_[0], ip.coords_[1]);
+						report.push_back(ip);
+					}
+					else if(ip.coords_[0].y_ < ip.coords_[1].y_)
+					{
+						report.push_back(ip);						
+					}
+					else
+					{
+						swap(ip.coords_[0], ip.coords_[1]);
+						
+						report.push_back(ip);						
+					}
+
+				}
+				else
+				{
+					report.push_back(ip);
+				}
+			}
+		}
+	}	
+
+	return hasIntersections;
+}
+
+
+bool TeINTERSECTOR2::TeSafeIntersections(const TePolygonSet& redPols, const TePolygonSet& bluePols, TeVectorBoundaryIP& report)
+{
+	unsigned int redPart = 0;
+	unsigned int redPolsSize = redPols.size();
+
+	// Loops through red polygons
+	for(unsigned int i = 0; i < redPolsSize; ++i)
+	{
+		TePolygon redPol = redPols[i];
+		unsigned int redPolSize = redPol.size();
+
+		// Loops through red polygons rings
+		for(register unsigned int j = 0; j < redPolSize; ++j)
+		{
+			TeLinearRing redRing = redPol[j];			
+
+			// Loops through blue polygons
+			unsigned int bluePart = 0;
+			unsigned int bluePolsSize =  bluePols.size();
+
+			for(unsigned int k = 0; k < bluePolsSize; ++k)
+			{
+				// Loops through blue polygons rings
+				TePolygon bluePol = bluePols[k];
+
+				unsigned int bluePolSize = bluePol.size();
+
+				for(register unsigned int l = 0; l < bluePolSize; ++l)
+				{
+					TeLinearRing blueRing = bluePol[l];
+
+					TeSafeIntersections(redRing, blueRing, report, redPart, bluePart);
+
+					++bluePart;
+				}
+			}
+
+			++redPart;
+		}
+	}
+
+	return !report.empty();
+}
+
diff --git a/src/terralib/kernel/TeIntersector.h b/src/terralib/kernel/TeIntersector.h
new file mode 100644
index 0000000..ffea4ac
--- /dev/null
+++ b/src/terralib/kernel/TeIntersector.h
@@ -0,0 +1,442 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeIntersector.h
+    This file contains structures and definitions for line intersection algorithms.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz
+  */
+
+#ifndef  __TERRALIB_INTERNAL_INTERSECTOR2_H
+#define  __TERRALIB_INTERNAL_INTERSECTOR2_H
+
+//TerraLib's include
+#include "TeCounted.h"
+#include "TeCoord2D.h"
+#include "TeGeometryAlgorithms.h"
+
+//STL's include
+#include <list>
+#include <vector>
+#include <map>
+#include <algorithm>
+#include <string>
+
+using namespace std;
+
+
+#define PRINT
+
+namespace TeINTERSECTOR2
+{
+
+#define EPSILON_COMPARE 0.00000000005
+
+/*! \fn inline short TeCCW(const TeCoord2D& c1, const TeCoord2D& c2, const TeCoord2D& c3, bool& between)
+    \brief Tells if three points makes a right turn, a left turn or are collinear.
+    \param c1      The first coordinate.
+	\param c2      The second coordinate.
+	\param c3      The coordinate to test the relative position.
+	\param between Tells if c3 is between c1 and c2.
+*/
+inline short TeCCW(const TeCoord2D& c1, const TeCoord2D& c2, const TeCoord2D& c3, bool& between)
+{
+	double tol = TePrecision::instance().precision();
+	TePrecision::instance().setPrecision(EPSILON_COMPARE);
+
+
+	double dx1 = c2.x() - c1.x();
+	double dx2 = c3.x() - c1.x();
+	double dy1 = c2.y() - c1.y();
+	double dy2 = c3.y() - c1.y();
+
+	double dx1y2 = dx1 * dy2;
+	double dy1x2 = dy1 * dx2;
+
+	// slope of the second line is greater than the first, so counterclockwise.
+	if(TeGeometryAlgorithmsPrecision::IsGreater(dx1y2, dy1x2))
+	{
+		TePrecision::instance().setPrecision(tol);
+
+		return TeCOUNTERCLOCKWISE;
+	}
+
+	// slope of the first line is greater than the second, so clockwise.
+	if(TeGeometryAlgorithmsPrecision::IsSmaller(dx1y2, dy1x2))
+	{
+		TePrecision::instance().setPrecision(tol);
+
+		return TeCLOCKWISE;
+	}
+	
+
+	TePrecision::instance().setPrecision(tol);
+	// if we are here, so the three points are collinear.
+
+	// check if c3 is between c1 and c2
+	if(TeGeometryAlgorithmsPrecision::IsDifferent(c1.x(), c2.x()))	// c1c2 is not vertical
+		between = (TeGeometryAlgorithmsPrecision::IsSmallerEqual(c1.x(), c3.x()) && TeGeometryAlgorithmsPrecision::IsSmallerEqual(c3.x(), c2.x())) ||
+				  (TeGeometryAlgorithmsPrecision::IsGreaterEqual(c1.x(), c3.x()) && TeGeometryAlgorithmsPrecision::IsGreaterEqual(c3.x(), c2.x()));
+	else	// c1c2 is vertical
+		between = (TeGeometryAlgorithmsPrecision::IsSmallerEqual(c1.y(), c3.y()) && TeGeometryAlgorithmsPrecision::IsSmallerEqual(c3.y(), c2.y())) ||
+		          (TeGeometryAlgorithmsPrecision::IsGreaterEqual(c1.y(), c3.y()) && TeGeometryAlgorithmsPrecision::IsGreaterEqual(c3.y(), c2.y()));
+
+
+
+	//string linha = "";
+	//linha  = Te2String(c1.x(), 15);
+	//linha += " | ";
+	//linha += Te2String(c1.y(), 15);
+	//linha += " | ";
+	//linha += Te2String(c2.x(), 15);
+	//linha += " | ";
+	//linha += Te2String(c2.y(), 15);
+	//linha += " | ";
+	//linha += Te2String(c3.x(), 15);
+	//linha += " | ";
+	//linha += Te2String(c3.y(), 15);
+	//linha += " | ";
+	//linha += Te2String(dx1y2 - dy1x2, 15);
+	//linha += "\n";
+
+	//TeWriteToFile("c:\\log_ccw.txt", linha, "aw");
+
+
+	return TeNOTURN;
+}
+
+/*! \fn inline bool TeBoxIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d)
+    \brief Tells if the box of segments intersects.
+    \param a  The first coordinate of the first segment.
+	\param b  The second coordinate of the first segment.
+	\param c  The first coordinate of the second segment.
+	\param d  The second coordinate of the second segment.
+*/
+inline bool TeBoxIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d)
+{	
+	/* X bound box test */
+	if(d.x() > c.x()) 
+	{
+		if(b.x() < a.x())
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), a.x()))
+				return false;	// don't intersect => S2 is to the right of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(b.x(), d.x())) 
+				return false;	// don't intersect => S2 is to the left of S1
+		}
+		else
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(c.x(), b.x()))
+				return false;	// don't intersect => S2 is to the right of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(a.x(), d.x())) 
+				return false;	// don't intersect => S2 is to the left of S1
+		}			
+	} 
+	else 
+	{
+		if(b.x() < a.x())
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(d.x(), a.x()))
+				return false;	// don't intersect => S2 is to the right of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(b.x(), c.x()))
+				return false;	// don't intersect => S2 is to the left of S1
+		}
+		else
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(d.x(), b.x()))
+				return false;	// don't intersect => S2 is to the right of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(a.x(), c.x()))
+				return false;	// don't intersect => S2 is to the left of S1
+		}
+	}
+	
+	/* Y bound box test */
+	if(d.y() > c.y()) 
+	{
+		if(b.y() < a.y())
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), a.y()))
+				return false; // don't intersect => S2 is above of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(b.y(), d.y())) 
+				return false; // don't intersect => S1 is above of S2
+		}
+		else
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(c.y(), b.y()))
+				return false; // don't intersect => S2 is above of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(a.y(), d.y())) 
+				return false; // don't intersect => S1 is above of S2
+		}
+	} 
+	else 
+	{
+		if(b.y() < a.y())
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(d.y(), a.y()))
+				return false; // don't intersect => S2 is above of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(b.y(), c.y())) 
+				return false; // don't intersect => S1 is above of S2
+		}
+		else
+		{
+			if(TeGeometryAlgorithmsPrecision::IsGreater(d.y(), b.y()))
+				return false; // don't intersect => S2 is above of S1
+
+			if(TeGeometryAlgorithmsPrecision::IsGreater(a.y(), c.y())) 
+				return false; // don't intersect => S1 is above of S2
+		}
+	}
+
+	return true;
+}
+
+struct TeBoundaryIP
+{
+
+	vector<TeCoord2D> coords_;
+
+	unsigned int redSegNum_;
+	unsigned int redPartNum_;
+
+	unsigned int blueSegNum_;
+	unsigned int bluePartNum_;	
+};
+
+typedef vector<TeBoundaryIP> TeVectorBoundaryIP;
+
+/*! \fn inline bool TeIntersection(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeIntersCoordsVec& coords, TeSegmentIntersectionType& intersectionType)
+    \brief Returns the intersection point of the segments.
+    \param a                 The first coordinate of the first segment.
+	\param b                 The second coordinate of the first segment.
+	\param c                 The first coordinate of the second segment.
+	\param d                 The second coordinate of the second segment.
+	\param coords            The intersection coordinates (0, 1 or 2).
+	\param intersectionType  An intersection may be proper or improper.
+*/
+inline bool TeIntersection(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeBoundaryIP& ips, TeSegmentIntersectionType& intersectionType)
+{
+	if(TeEquals(a, b))
+		return false;
+
+	if(TeEquals(c, d))
+		return false;
+
+	if(TeBoxIntersects(a, b, c, d))
+	{
+		if((TeEquals(a, c) || TeEquals(a, d)) && (TeEquals(b, c) || TeEquals(b, d)))
+		{
+			intersectionType = TeImproperIntersection;
+
+			ips.coords_.push_back(a);
+			ips.coords_.push_back(b);
+
+			return true;
+		}
+
+		bool between1 = false;
+		short sign1 = TeCCW(a, b, c, between1);
+
+		bool between2 = false;
+		short sign2 = TeCCW(a, b, d, between2);
+
+		bool between3 = false;
+		short sign3 = TeCCW(c, d, a, between3);
+
+		bool between4 = false;
+		short sign4 = TeCCW(c, d, b, between4);
+
+		if((sign1 * sign2) <= 0 && (sign3 * sign4 <= 0))	// if there is an intersection
+		{
+			intersectionType = TeProperIntersection;
+
+			if(between1)
+			{			
+				intersectionType = TeImproperIntersection;
+				ips.coords_.push_back(c);
+			}
+			
+			if(between2)
+			{
+				intersectionType = TeImproperIntersection;
+				ips.coords_.push_back(d);
+			}
+
+			if(between3 && !TeEquals(a, c) && !TeEquals(a, d))
+			{
+				intersectionType = TeImproperIntersection;
+				ips.coords_.push_back(a);
+
+				return true;
+			}
+			
+			if(between4 && !TeEquals(b, c) && !TeEquals(b, d))
+			{
+				intersectionType = TeImproperIntersection;
+				ips.coords_.push_back(b);
+
+				return true;
+			}
+
+			if(intersectionType == TeImproperIntersection)
+				return true;
+
+			double denominator = (d.y() - c.y()) * (b.x() - a.x()) - (d.x() - c.x()) * (b.y() - a.y());
+			
+			if(denominator == 0.0)	// parallel can not occur here any more! I expect this is true!
+				return false;		// ERRO!!!!!!! Lan�ar Exce��o: Montar um esquema de exce��es
+
+			// parameters
+			double Ua = ((d.x() - c.x()) * (a.y() - c.y()) - (d.y() - c.y()) * (a.x() - c.x())) / denominator; 
+			double Ub = ((b.x() - a.x()) * (a.y() - c.y()) - (b.y() - a.y()) * (a.x() - c.x())) / denominator; 
+
+			if(Ua > 0.0 && Ua < 1.0  && Ub > 0.0 && Ub < 1.0)
+			{
+				ips.coords_.push_back(TeCoord2D(a.x() + Ua * (b.x() - a.x()), a.y() + Ua * (b.y() - a.y())));
+				return true;
+			}
+		}
+	}
+
+	intersectionType = TeImproperIntersection;
+
+	return false;
+}
+
+/*! \fn inline bool TeIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeSegmentIntersectionType& intersectionType)
+    \brief Tells if two segments intersects.
+    \param a                 The first coordinate of the first segment.
+	\param b                 The second coordinate of the first segment.
+	\param c                 The first coordinate of the second segment.
+	\param d                 The second coordinate of the second segment.
+	\param intersectionType  An intersection may be proper or improper.
+*/
+inline bool TeIntersects(const TeCoord2D& a, const TeCoord2D& b, const TeCoord2D& c, const TeCoord2D& d, TeSegmentIntersectionType& intersectionType)
+{	
+	if(TeBoxIntersects(a, b, c, d))
+	{
+		if((TeEquals(a, c) || TeEquals(a, d)) && (TeEquals(b, c) || TeEquals(b, d)))
+		{
+			intersectionType = TeImproperIntersection;
+
+			return true;
+		}
+
+		bool between1 = false;
+		short sign1 = TeCCW(a, b, c, between1);
+
+		bool between2 = false;
+		short sign2 = TeCCW(a, b, d, between2);
+
+		bool between3 = false;
+		short sign3 = TeCCW(c, d, a, between3);
+
+		bool between4 = false;
+		short sign4 = TeCCW(c, d, b, between4);
+
+		if((sign1 * sign2) <= 0 && (sign3 * sign4 <= 0))	// if there is an intersection
+		{
+			intersectionType = TeProperIntersection;
+
+			if(between1)
+			{			
+				intersectionType = TeImproperIntersection;
+
+				return true;
+			}
+			
+			if(between2)
+			{
+				intersectionType = TeImproperIntersection;
+
+				return true;
+			}
+
+			if(between3 && !TeEquals(a, c) && !TeEquals(a, d))
+			{
+				intersectionType = TeImproperIntersection;
+
+				return true;
+			}
+			
+			if(between4 && !TeEquals(b, c) && !TeEquals(b, d))
+			{
+				intersectionType = TeImproperIntersection;
+
+				return true;
+			}
+
+			return true;
+		}
+	}
+		
+	return false;
+}
+
+/*! \fn bool TeSafeIntersections(const TePolygonSet& redPols, const TePolygonSet& bluePols, TeReportVector& report)
+    \brief Verifies if there is an intersection between two given polygonsets.
+    \param redPols  The first polygonset to test.
+	\param bluePols The second polygonset to test.
+	\param report   A list with the intersection points sorted according to redPols segments.
+	
+    This is a lazy algorithm. It can be used, for example, in intersections between a box and a line.
+	It is O(n*m) - where n and m are the numbers of segments in the first and second polygonsets.
+ */
+bool TeSafeIntersections(const TePolygonSet& redPols, const TePolygonSet& bluePols, TeVectorBoundaryIP& report);
+
+/*! \fn bool TeSafeIntersections(const TeLine2D& redLine, const TeLine2D& blueLine, TeReportVector& report, const unsigned int& redObjId = 0, const unsigned int& blueObjId = 0, const bool& sortReport = true)
+    \brief Verifies if there is an intersection between two given lines.
+    \param redLine  The first line to test.
+	\param blueLine The second line to test.
+	\param report   A list with the intersection points sorted according to lred segments.
+	\param redObjId Red line object id
+	\param blueObjId Blue line object id
+	\param sortReport Flag to indicate that report should be sorted
+	
+    This is a lazy algorithm. It can be used, for example, in intersections between a box and a line.
+	It is O(n*m) - where n and m are the numbers of segments in the first and second lines.
+ */
+bool TeSafeIntersections(const TeLine2D& redLine, const TeLine2D& blueLine, TeVectorBoundaryIP& report, const unsigned int& redObjId = 0, const unsigned int& blueObjId = 0);
+
+/*! \fn bool TeIntersects(const TeLine2D& redLine, const TeLine2D& blueLine)
+    \brief Returns true if the lines intersects.
+	\param redLine			The line to test.
+	\param blueLine			The line to test.
+
+ */
+bool TeIntersects(const TeLine2D& redLine, const TeLine2D& blueLine);
+
+
+
+}	// end namespace TeINTERSECTOR2
+
+#endif //__TERRALIB_INTERNAL_INTERSECTOR2_H
+
diff --git a/src/terralib/kernel/TeLayer.cpp b/src/terralib/kernel/TeLayer.cpp
new file mode 100644
index 0000000..2ddca43
--- /dev/null
+++ b/src/terralib/kernel/TeLayer.cpp
@@ -0,0 +1,1038 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeLayer.h"
+#include "TeUtils.h"
+#include "TeException.h"
+#include "TeDatabase.h"
+
+// -- Layer novo ---
+
+TeLayer::TeLayer(const string& name, TeDatabase* db, TeProjection* proj): 
+	name_(name),
+	id_(-1),
+	db_(db),
+	projection_ ( proj ),
+	raster_(0)
+{
+	if (!db_ || name.empty())
+		return;
+
+	// verifies if layer already exists in the database
+	string sql = "SELECT * FROM te_layer WHERE name = '" + name + "'";
+	TeDatabasePortal* portal = db_->getPortal();
+	if (!portal)
+		return;
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return;
+	}
+	if (!portal->fetchRow()) 
+	{
+		if (!proj)	// provides a default projection No Projection
+			projection_ = new TeNoProjection();
+		else
+			projection_ = TeProjectionFactory::make (proj->params());
+		db_->insertLayer(this);
+	}
+	else
+		db_->loadLayer(this);
+	int pid = projection_->id();
+	delete projection_;
+	projection_ = db_->loadProjection(pid);
+	delete portal;
+}
+
+
+TeLayer::TeLayer(const string& name, TeDatabase* db, TeBox& box, TeProjection* proj):
+	name_(name),
+	id_(-1),
+	db_(db),
+	projection_(proj),
+	box_(box),
+	raster_(0)
+{
+	if (!db_ || name.empty())
+		return;
+
+	// verifies if layer already exists in the database
+	string sql = "SELECT * FROM te_layer WHERE name = '" + name + "'";
+	TeDatabasePortal* portal = db_->getPortal();
+	if (!portal)
+		return;
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return;
+	}
+	if (!portal->fetchRow()) 
+	{
+		if (!proj)	// provides a default projection No Projection
+			projection_ = new TeNoProjection();
+		else
+			projection_ = TeProjectionFactory::make (proj->params());
+		db_->insertLayer(this);
+	}
+	else
+		db_->loadLayer(this);
+	delete portal;
+}
+
+TeLayer::~TeLayer()
+{
+	if ( projection_ != 0 )
+	{
+		delete projection_; 
+		projection_ = 0;
+	}
+	for (TeRepresPointerVectorIterator it = repVector_.begin(); it != repVector_.end(); it++)
+	{
+		if (*it)
+			delete (*it);
+	}
+	repVector_.clear();
+}
+
+void 
+TeLayer::setLayerBox(const TeBox& box)
+{   
+	box_ = box;
+	if ((id_ > -1) && db_)
+	{
+		string sql = "UPDATE te_layer SET lower_x = " + Te2String(box_.x1(),12);
+			  sql += ", lower_y = " + Te2String(box_.y1(),12);
+			  sql += ", upper_x = " + Te2String(box_.x2(),12);
+			  sql += ", upper_y = " + Te2String(box_.y2(),12);
+			  sql += " WHERE layer_id=" + Te2String(id_);
+		db_->execute(sql);
+	}
+}
+
+void
+TeLayer::updateLayerBox(const TeBox& box)
+{
+	updateBox(box_,box);
+	if ((id_ > -1) && db_)
+	{
+		string sql = "UPDATE te_layer SET lower_x = " + Te2String(box_.x1(),12);
+			  sql += ", lower_y = " + Te2String(box_.y1(),12);
+			  sql += ", upper_x = " + Te2String(box_.x2(),12);
+			  sql += ", upper_y = " + Te2String(box_.y2(),12);
+			  sql += " WHERE layer_id=" + Te2String(id_);
+		db_->execute(sql);
+	}
+}
+
+void
+TeLayer::updateLayerBox()
+{
+	if (id_ < 0 || !db_)
+		return;
+
+	string sql = "SELECT lower_x, lower_y, upper_x, upper_y FROM te_representation WHERE layer_id = " + Te2String(id_);
+	TeDatabasePortal* portal = db_->getPortal();
+	if (!portal)
+		return;
+	if (!portal->query(sql))
+	{
+		delete portal;
+		return;
+	}
+
+	TeBox box;
+	while (portal->fetchRow())
+	{
+		TeBox brep(portal->getDouble(0),portal->getDouble(1),portal->getDouble(2),portal->getDouble(3));
+		updateBox(box,brep);
+	}
+	delete portal;
+	sql = "UPDATE te_layer SET lower_x = " + Te2String(box.x1(),12);
+		  sql += ", lower_y = " + Te2String(box.y1(),12);
+		  sql += ", upper_x = " + Te2String(box.x2(),12);
+		  sql += ", upper_y = " + Te2String(box.y2(),12);
+		  sql += " WHERE layer_id=" + Te2String(id_);
+	db_->execute(sql);
+	box_ = box;
+	return;
+}
+
+void  
+TeLayer::setProjection ( TeProjection* proj )
+{	
+	if (!proj)
+		return;
+
+	// if no database set just update pointer
+	if (!db_)
+	{
+		if ( projection_)
+			delete projection_;
+		projection_ = proj;
+		return;
+	}
+
+	// delete old projection
+	if (projection_ && projection_->id() > 0 )
+	{
+		string sql = "DELETE FROM te_projection WHERE projection_id = " + Te2String(projection_->id());
+		if (db_->execute(sql))
+			delete projection_;
+	}
+	projection_ = proj; 
+	bool status = true;
+	
+	if ( proj->id() <= 0  )	// new projection not in the database
+		status = db_->insertProjection(projection_);
+
+	// update layer information
+	if (status && id_ > 0)
+	{
+		string sql = "UPDATE te_layer SET projection_id = " + Te2String(projection_->id());
+			   sql += " WHERE layer_id=" + Te2String(id_);
+		db_->execute(sql);
+	}
+	if (raster_)
+	{
+		delete raster_;
+		raster_ = 0;
+	}
+}
+
+void 
+TeLayer::raster( TeRaster* raster)
+{	
+	if (raster_ )
+		delete raster_;
+	raster_ = raster; 
+}
+
+bool
+TeLayer::hasGeometry (TeGeomRep rep)
+{ 
+	if (repVector_.empty())
+		return false;
+	TeRepresPointerVectorIterator it;
+	it = TeFindRepresentation(repVector_.begin(), repVector_.end(),rep);
+	return (it != repVector_.end());
+} 
+
+int
+TeLayer::geomRep()
+{
+	int r = 0;
+	if (repVector_.empty())
+		return r;
+	TeRepresPointerVectorIterator it;
+	for (it=repVector_.begin(); it != repVector_.end(); it++)
+		r= (int)(*it)->geomRep_ | r;
+	return r;
+}
+
+string
+TeLayer::tableName(TeGeomRep rep) 
+{
+	TeRepresPointerVectorIterator it;
+	it = TeFindRepresentation(repVector_.begin(), repVector_.end(),rep);
+	if (it != repVector_.end())
+		return (*it)->tableName_;
+	else
+		return string("");
+}
+
+int 
+TeLayer::nGeometries(TeGeomRep rep)
+{
+	TeRepresPointerVectorIterator it;
+	it = TeFindRepresentation(repVector_.begin(), repVector_.end(),rep);
+	int ngeo = 0;
+	if (it != repVector_.end())
+	{
+		string sql = "SELECT COUNT(geom_id) FROM " + (*it)->tableName_;
+		TeDatabasePortal* portal = db_->getPortal();
+		if (portal && portal->query(sql) && portal->fetchRow())
+			ngeo = portal->getInt(0);
+		delete portal;
+	}
+	return ngeo;
+}
+
+
+bool
+TeLayer::getRepresentation(TeGeomRep repType, TeRepresPointerVector& result)
+{
+	TeRepresPointerVectorIterator it;
+	it = repVector_.begin();
+	while (it != repVector_.end())
+	{
+		if ((*it)->geomRep_ == repType)
+			result.push_back((*it));
+		++it;
+	}
+	if (result.empty())
+		return false;
+	return true;
+}
+
+TeRepresentation*
+TeLayer::getRepresentation(TeGeomRep repType, const string& tName)
+{
+
+	TeRepresPointerVectorIterator it;
+	it = repVector_.begin();
+	while (it != repVector_.end())
+	{
+		if ((*it)->geomRep_ == repType)
+		{
+			if (tName.empty() || (*it)->tableName_== tName)
+				return (*it);
+		}
+		it++;
+	}
+	return 0;
+}
+
+bool 
+TeLayer::removeGeometry (TeGeomRep repType, const string& tName)
+{
+	if (!db_)
+		return false;
+
+	if (repType == TeTEXT && tName.empty())	// layer can have more than one TEXT table
+		return false;
+
+	TeRepresPointerVectorIterator it;
+	it = TeFindRepresentation(repVector_.begin(), repVector_.end(),repType);
+	while (it != repVector_.end())
+	{
+		if (tName.empty() || (*it)->tableName_== tName)
+		{
+			string del;
+			TeRepresentation* rep = (*it);
+			if (rep->id_ > 0)
+			{
+				del = "DELETE FROM te_representation WHERE repres_id=" + Te2String(rep->id_);
+				if (!db_->execute(del))
+					return false;
+			}
+
+			if (!rep->tableName_.empty())
+			{
+				if(rep->geomRep_ == TeRASTER)
+				{
+					TeDatabasePortal* portal = db_->getPortal();
+					string sql, tname;
+
+					sql = "SELECT lut_table, raster_table FROM " + rep->tableName_;
+					portal->query(sql);
+
+					while(portal->fetchRow())
+					{
+						// delete lut table
+						tname = portal->getData(0);
+						if(!tname.empty())
+							db_->deleteTable(tname);
+						// delete raster table
+						tname = portal->getData(1);
+						if(!tname.empty())
+							db_->deleteTable(tname);
+					}
+					portal->freeResult();
+					delete portal;
+
+					// delete metadata table
+					sql = "DROP TABLE " + rep->tableName_ + "_metadata";
+					db_->execute(sql);
+					if (raster_)
+					{
+						delete raster_;
+						raster_ = 0;
+					}
+				}
+				if (!db_->deleteTable(rep->tableName_))					
+					return false;
+			}
+			repVector_.erase(it);
+			delete rep;
+			break;
+		}
+		it++;
+		it = TeFindRepresentation(it,repVector_.end(),repType);
+	}
+	updateLayerBox();
+	return true;
+}
+
+bool TeLayer::addGeometry(TeGeomRep repType, const string& tName, const string& desc)
+{  
+	// check if representation is already in layer
+	if (repType == TeTEXT)
+	{
+		string tt;
+		if (!tName.empty())
+			tt = tName;
+		else
+			tt =  name_ + "Texts";
+		
+		if (getRepresentation(repType,tt))
+			return true;
+	}
+	else if (getRepresentation(repType))
+		return true;
+
+	if (!db_)			// layer has no database associated
+		return false;
+
+	if (id_ < 0)		// layer has not saved in the database
+	{
+		if (!db_->insertLayer (this))
+			return false;
+	}
+
+	TeRepresentation* represe = new TeRepresentation();
+	represe->geomRep_ = repType;
+	if (!tName.empty())
+		represe->tableName_ = tName;
+	if (!desc.empty())
+		represe->description_ = desc;
+
+	if (repType == TePOLYGONS)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Polygons" + Te2String(id_);
+		if (!db_->createPolygonGeometry (represe->tableName_))
+			return false;
+	}
+	else if (repType == TeLINES)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Lines" + Te2String(id_);
+		if (!db_->createLineGeometry (represe->tableName_))
+			return false;
+	}
+	else if (repType == TePOINTS)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Points" + Te2String(id_);
+		if (!db_->createPointGeometry (represe->tableName_))
+			return false;
+	}
+	else if (repType == TeTEXT)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Texts" + Te2String(id_);
+		if (!db_->createTextGeometry (represe->tableName_))
+			return false;
+	}
+	else if (repType == TeARCS)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Arcs"+ Te2String(id_);
+ 		if (!db_->createArcGeometry (represe->tableName_))
+			return false;
+	}
+	else if (repType == TeNODES)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Nodes"+ Te2String(id_);
+ 		if (!db_->createNodeGeometry (represe->tableName_))
+			return false;
+	}
+	else if (repType == TeCELLS)
+	{
+		if (tName.empty())
+			represe->tableName_ = "Cells"+ Te2String(id_);
+ 		if (!db_->createCellGeometry (represe->tableName_))
+			return false;
+	}
+	else
+	{
+		return false;
+	}
+
+	bool res =  db_->insertRepresentation(id_,*represe);
+
+	if (res) 
+		repVector_.push_back(represe);
+	else
+		return false;
+	return true;
+}
+
+bool 
+TeLayer::addRasterGeometry(TeRasterParams& par, const string& objectId, 
+						   const string& tName, const string& desc)
+{
+	string tableName = tName;
+	TeRepresentation* rep = getRepresentation(TeRASTER,tableName);
+	if (!rep)
+	{
+		rep = new TeRepresentation();
+		updateBox(rep->box_,par.boundingBox());
+
+		if (!tableName.empty())
+			rep->tableName_ = tableName;
+		else
+			rep->tableName_ = "RasterLayer" + Te2String(id_);
+
+		if (!desc.empty())
+			rep->description_ = desc;
+
+		rep->geomRep_ = TeRASTER;
+		if (!db_->insertRepresentation(id_,*rep))
+			return false;
+
+		tableName = rep->tableName_;
+		if (!db_->createRasterGeometry(tableName))
+			return false;
+
+		string metadataTableName = tableName+"_metadata";
+		if (!db_->createRasterMetadataTable(metadataTableName))
+			return false;
+
+		repVector_.push_back(rep);
+	}
+	else
+		tableName = rep->tableName_;
+
+	string oid = objectId;
+	if (oid.empty())
+		oid = "O1";
+
+	if (par.fileName_.empty())
+	{
+		string aux = "RasterLayer" + Te2String(id_) + "_R_" + objectId;
+		bool flag = db_->tableExist(aux);
+		short i=1;
+		while (flag)
+		{
+			aux = "RasterLayer" + Te2String(id_) + "_R_" + objectId + "_" + Te2String(i);
+			++i;
+		}
+		par.fileName_ = aux;
+	}
+
+	if (!db_->createRasterTable(par.fileName_))
+		return false;
+
+	if (!db_->insertRasterGeometry(tableName,par,objectId))
+		return false;
+
+	updateLayerBox(par.boundingBox());
+	return true;
+}
+
+TeRaster*
+TeLayer::raster(const string& objectId, const char& mode)
+{	
+	if (!hasGeometry(TeRASTER) || id_ <= 0 )
+		return 0;
+
+	if (raster_  && !objectId.empty() && 
+	   (objectId != raster_->objectId() || 
+		mode != raster_->params().mode_ ))
+	{
+		delete raster_;
+		raster_ = 0; 
+	}
+	if (!raster_)
+		raster_ = db_->loadLayerRaster(id_,objectId, mode);
+	return raster_;
+}
+
+int 
+TeLayer::nObjects(const string& tName)
+{
+	if (attTables_.empty())
+		return 0;
+	string linkName;
+	vector<TeTable>::iterator it = attTables_.begin();
+	while (it != attTables_.end())
+	{
+		if ((*it).name() == tName)
+		{
+			linkName = (*it).linkName();
+			break;
+		}
+		it++;
+	}
+	if (linkName.empty())
+		return 0;
+	int no;
+	string sql;
+	TeDatabasePortal* portal = db_->getPortal();
+	if (!portal)
+		return 0;
+	sql = "SELECT COUNT(" + linkName + ") FROM " + (*it).name();
+	if (portal->query(sql) && portal->fetchRow())
+		no = portal->getInt(0);
+	delete portal;
+	return no;
+}
+
+
+bool 
+TeLayer::createAttributeTable(TeTable& table)
+{
+	if (!db_->tableExist(table.name()))
+	{
+		db_->validTable(table);
+  		if (!db_->createTable(table.name(),table.attributeList())) 
+			return false;
+	}
+	
+	if(!db_->insertTableInfo(id_,table))
+		return false;
+	
+	vector<TeTable>::iterator it = attTables_.begin();
+	while (it != attTables_.end())
+	{
+		if ((*it).name() == table.name())
+			return true;
+		it++;
+	}
+	attTables_.push_back(table);
+	return true;
+}
+
+bool 
+TeLayer::addAttributeTable(TeTable& table)
+{
+	vector<TeTable>::iterator it = attTables_.begin();
+	while (it != attTables_.end())
+	{
+		if ((*it).name() == table.name())
+			return false;
+		it++;
+	}
+	attTables_.push_back(table);
+	return true;
+}
+
+bool 
+TeLayer::removeAttributeTable(string tableName)
+{
+	vector<TeTable>::iterator it = attTables_.begin();
+	while (it != attTables_.end())
+	{
+		if ((*it).name() == tableName)
+		{
+			attTables_.erase(it);
+			return true;
+		}
+		it++;
+	}
+	return false;
+}
+
+void 
+TeLayer::updateAttributeTable(TeTable& table)
+{
+	vector<TeTable>::iterator it = attTables_.begin();
+	while (it != attTables_.end())
+	{
+		if ((*it).name() == table.name())
+		{
+			attTables_.erase(it);
+			break;
+		}
+		it++;
+	}
+	attTables_.push_back(table);
+}
+
+bool
+TeLayer::loadLayerTables() 
+{
+	TeDatabase *db = database();
+	if(!db)
+		return false;
+
+	attTables_.clear();
+	return(db->loadLayerTable(this));
+}
+
+bool 
+TeLayer::getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType)
+{
+	TeAttrTableVector::iterator it = attTables_.begin();
+	while (it != attTables_.end())
+	{
+		if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+			atts.push_back((*it));
+		it++;
+	}
+	return (!atts.empty());
+}
+
+bool 
+TeLayer::getAttrTablesByName(vector<string> &tableNames, TeAttrTableVector& atts, TeAttrTableType attType)
+{
+	TeAttrTableVector::iterator it;
+	vector<string>::iterator it2;
+
+	for(it2 = tableNames.begin(); it2 != tableNames.end(); ++it2)
+	{
+		for(it = attTables_.begin(); it != attTables_.end(); ++it)
+		{
+			if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+			{
+				string name = (*it).name();
+				string name2 = (*it2);
+				if(name == name2)
+				{
+					atts.push_back((*it));
+					break;
+				}
+			}
+		}
+	}
+	return (!atts.empty());
+}
+
+
+bool 
+TeLayer::getAttrTablesByName(const string& attrTableName, TeTable& table, TeAttrTableType attType)
+{
+	TeAttrTableVector::iterator it;
+
+	for(it = attTables_.begin(); it != attTables_.end(); ++it)
+	{
+		if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+		{
+			string name = (*it).name();
+			if(name == attrTableName)
+			{
+				table = (*it);
+				return true;
+			}
+		}
+	}
+	
+	return false;
+}
+
+bool 
+TeLayer::addPolygons (TePolygonSet& polySet)
+{
+	if (!db_)
+		return false;
+
+	if (polySet.size() > 0 )
+	{
+		if (!this->hasGeometry(TePOLYGONS))
+			this->addGeometry(TePOLYGONS);
+
+		TeRepresentation* rep = getRepresentation(TePOLYGONS);
+		if (rep)
+		{
+			if (!db_->insertPolygonSet (rep->tableName_, polySet))
+				return false;
+			updateLayerBox(polySet.box());
+			updateBox(rep->box_,polySet.box());
+			if (!db_->updateRepresentation(id_,*rep))
+				return false;
+		}
+		else
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeLayer::addLines (TeLineSet& lineSet)
+{
+	if (!db_)
+		return false;
+
+	if (lineSet.size() > 0)
+	{
+		if (!this->hasGeometry(TeLINES))
+			this->addGeometry(TeLINES);
+		TeRepresentation* rep = getRepresentation(TeLINES);
+		if (rep)
+		{
+			if (!db_->insertLineSet (rep->tableName_, lineSet))
+				return false;
+			updateLayerBox(lineSet.box());
+			updateBox(rep->box_,lineSet.box());
+			if (!db_->updateRepresentation(id_,*rep))
+				return false;
+		}
+		else
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeLayer::addPoints (TePointSet& pointSet)
+{
+	if (!db_)
+		return false;
+
+	if (pointSet.size() > 0)
+	{
+		if (!this->hasGeometry(TePOINTS))
+			this->addGeometry(TePOINTS);
+		string tblName = tableName(TePOINTS);
+
+		TeRepresentation* rep = getRepresentation(TePOINTS);
+		if (rep)
+		{	
+			if (!db_->insertPointSet (rep->tableName_, pointSet))
+				return false;
+			updateLayerBox(pointSet.box());
+			updateBox(rep->box_,pointSet.box());
+			if (!db_->updateRepresentation(id_,*rep))
+				return false;
+		}
+		else
+			return false;
+	}
+	return true;
+}
+
+bool 
+TeLayer::addText (TeTextSet& textSet, const string& tName)
+{
+	if (!db_)
+		return false;
+
+	TeRepresentation* rep =0;
+	string tabName;
+	if (tName.empty())
+	{
+		int i=0;
+		string name = "Text_" + Te2String(id_) + "_" + Te2String(0);
+		do
+		{
+			rep = getRepresentation(TeTEXT,tName);
+			++i;
+		}
+		while (rep);
+		tabName = name;
+	}
+	else
+		tabName = tName;
+
+	if (textSet.size() > 0 )
+	{
+		rep = getRepresentation(TeTEXT,tabName);
+		if (!rep)
+		{
+			this->addGeometry(TeTEXT,tabName);
+			rep = getRepresentation(TeTEXT,tabName);
+		}
+		if (rep)
+		{	
+			if (!db_->insertTextSet (tabName, textSet))
+				return false;
+			updateLayerBox(textSet.box());
+			updateBox(rep->box_,textSet.box());
+			if (!db_->updateRepresentation(id_,*rep))
+				return false;
+		}
+		else
+			return false;
+	}
+	return true;
+}
+
+bool
+TeLayer::addCells(TeCellSet& cellSet)
+{
+	if (!db_)
+		return false;
+
+	if (cellSet.size() > 0)
+	{
+		string tblName = tableName(TeCELLS);
+		if (!this->hasGeometry(TeCELLS))
+			this->addGeometry(TeCELLS);
+
+		TeRepresentation* rep = getRepresentation(TeCELLS);
+		if (rep)
+		{
+			rep->resX_ = cellSet.resX();
+			rep->resY_ = cellSet.resY();
+			if (!db_->insertCellSet(tableName(TeCELLS), cellSet))
+				return false;
+			updateLayerBox(cellSet.box());
+			updateBox(rep->box_,cellSet.box());
+			if (!db_->updateRepresentation(id_,*rep))
+				return false;
+		}		
+		else
+			return false;
+	}
+	return true;
+}
+
+
+bool 
+TeLayer::saveAttributeTable(TeTable& table)
+{
+	if (!db_ || id_ <= 0)
+		return false;
+	if (db_->insertTable (table))
+	{
+		if (table.id() <= 0)
+			return db_->insertTableInfo(id_,table);
+		else
+			return true;
+	}
+	return false;
+}
+
+bool
+TeLayer::getPolygons(TePolygonSet &ps, const string& whereClause)
+{
+	if (!hasGeometry(TePOLYGONS))
+		return false;
+	return db_->selectPolygonSet(tableName(TePOLYGONS), whereClause, ps);
+}
+
+bool
+TeLayer::getLines(TeLineSet &ls, const string& whereClause)
+{
+	if (!hasGeometry(TeLINES))
+		return false;
+	return db_->selectLineSet(tableName(TeLINES), whereClause, ls);
+}
+
+bool
+TeLayer::getPoints(TePointSet &ps, const string& whereClause)
+{
+	if (!hasGeometry(TePOINTS))
+		return false;
+	return db_->selectPointSet(tableName(TePOINTS), whereClause, ps);
+}
+
+bool
+TeLayer::getText(TeTextSet &ts, const string& whereClause)
+{
+	if (!hasGeometry(TeTEXT))
+		return false;
+	return db_->selectTextSet(tableName(TeTEXT), whereClause, ts);
+}
+
+bool
+TeLayer::getCells(TeCellSet &cs, const string& whereClause)
+{
+	if (!hasGeometry(TeCELLS))
+		return false;
+	return db_->selectCellSet(id_, tableName(TeCELLS), whereClause, cs);
+}
+
+bool 
+TeLayer::locatePolygon (TeCoord2D &pt, TePolygon &polygon, const double& tol)
+{
+	if (!hasGeometry(TePOLYGONS))
+		return false;
+	return db_->locatePolygon(tableName(TePOLYGONS),pt, polygon, tol);
+}
+
+bool 
+TeLayer::locateLine (TeCoord2D &pt, TeLine2D &line, const double& tol)
+{
+	if (!hasGeometry(TeLINES))
+		return false;
+	return db_->locateLine(tableName(TeLINES),pt, line, tol);
+}
+
+bool 
+TeLayer::locatePoint (TeCoord2D &pt, TePoint &point, const double& tol)
+{
+	if (!hasGeometry(TePOINTS))
+		return false;
+	return db_->locatePoint(tableName(TePOINTS), pt, point, tol);
+}
+
+bool 
+TeLayer::locateText(TeCoord2D &pt, TeText &text, const double& tol)
+{
+	if (!hasGeometry(TeTEXT))
+		return false;
+	return db_->locateText(tableName(TeTEXT), pt, text, tol);
+}
+
+bool 
+TeLayer::locateCell (TeCoord2D &pt, TeCell &cell, const double& tol)
+{
+	if (!hasGeometry(TeCELLS))
+		return false;
+	return db_->locateCell(tableName(TeCELLS), pt, cell, tol);
+}
+
+bool
+TeLayer::loadGeometrySet	(const string& geoid, TePolygonSet &ps)
+{
+	if (!hasGeometry(TePOLYGONS))
+		return false;
+	return db_->loadPolygonSet(tableName(TePOLYGONS), geoid, ps);
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TeLineSet &ls)
+{
+	if (!hasGeometry(TeLINES))
+		return false;
+	return db_->loadLineSet(tableName(TeLINES), geoid, ls);;
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TePointSet &ps)
+{
+	if (!hasGeometry(TePOINTS))
+		return false;
+	return db_->loadPointSet(tableName(TePOINTS), geoid, ps);
+}
+
+bool
+TeLayer::loadGeometrySet (const string& geoid, TeCellSet &cs)
+{
+	if (!hasGeometry(TeCELLS))
+		return false;
+	return db_->loadCellSet(id_, tableName(TeCELLS), geoid, cs);;
+}
+
+string
+TeLayer::mediaTable()
+{
+	TeAttrTableVector attrs;
+	getAttrTables(attrs, TeAttrMedia);
+
+	if(attrs.size()<1)
+		return "";
+
+	return (attrs[0].name());
+}
+
+void 
+TeLayer::mediaTable(const string& name)
+{
+	TeAttributeList attList;
+	TeTable table(name, attList,"object_id", "object_id", TeAttrMedia);
+	attTables_.push_back (table);
+}
diff --git a/src/terralib/kernel/TeLayer.h b/src/terralib/kernel/TeLayer.h
new file mode 100644
index 0000000..e948993
--- /dev/null
+++ b/src/terralib/kernel/TeLayer.h
@@ -0,0 +1,416 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeLayer.h
+    This file contains structures and definitions to deal with a layer
+*/
+#ifndef __TERRALIB_INTERNAL_LAYER_H
+#define __TERRALIB_INTERNAL_LAYER_H
+
+#include "TeGeometry.h"
+#include "TeRaster.h"
+#include "TeProjection.h"
+#include "TeDataTypes.h"
+#include "TeTable.h"
+#include "TeRepresentation.h"
+
+#include <string>
+#include <list>
+#include <map>
+
+//!  A class for supporting a layer. 
+/*!  
+	 In TerraLib, a layer is a collection of geometries that share the same 
+     geographical projection, and are related in some way (e.g. a shapefile).
+	 A layer has a pointer to a database that effectively stores its atributes
+	 and geometries.
+	 
+	\sa
+     TeGeometry, TeProjection, TeBox, TeDatabase, TeTheme, TeTable
+*/
+class TeLayer {
+
+public:
+
+	//! Empty constructor
+	TeLayer():
+		id_(-1),
+		db_(0),
+		projection_ ( 0 ),
+		raster_(0)
+		{ }
+
+		
+	//! Constructor with parameters
+	/* 
+		\param name layer name (should be unique)
+		\param db a TerraLib database connection w
+		\param proj layer projection
+		\note 
+			\par If no database is informed, layer will exist only in memory.
+			\par If a layer with this name doesn�t exist a layer will be 
+			 created and stored. If no projection is informed a default TeNoProjection
+			 will be used as layer projection.
+            \par If a layer with this name already exists it will be retrieved
+	*/	 
+	TeLayer(const string& name, TeDatabase* db=0, TeProjection* proj=0);
+
+	//! Constructor with parameters
+	/* 
+		\param name layer name (should be unique)
+		\param db TerraLib database connection where layer will be stored
+		\param box layer bounding box
+		\param proj layer projection
+		\note 
+			\par If no database is informed, layer will exist only in memory.
+			\par If a layer with this name doesn�t exist a layer will be 
+			 created and stored. If no projection is informed a default TeNoProjection
+			 will be used as layer projection.
+            \par If a layer with this name already exists it will be retrieved
+	*/
+	TeLayer(const string& name, TeDatabase* db, TeBox& box, TeProjection* proj = 0);
+
+	//! Destructor
+	virtual ~TeLayer();
+
+	//! Copy Constructor
+	TeLayer ( const TeLayer& other )
+	{
+		if (projection_)
+			delete projection_;
+		projection_ = 0;
+		if (other.projection_)
+			projection_ = TeProjectionFactory::make ( other.projection_->params());
+		name_		= other.name_;
+		id_			= other.id_;
+		db_			= other.db_;
+	}
+
+	//! Operator =
+	TeLayer& operator= ( const TeLayer& other )
+	{
+		if ( this != &other )
+		{	
+			if (projection_)
+				delete projection_;
+			projection_ = 0;
+			if (other.projection_)
+				projection_ = TeProjectionFactory::make ( other.projection_->params());
+			name_		= other.name_;
+			id_			= other.id_;
+			box_		= other.box_;
+			db_ = other.db_; 
+		}
+		return *this;
+	}
+	
+	//! Retrieves the database associated to this layer
+	TeDatabase* const database() 
+	{ return db_; }
+
+	//! Sets the layer database
+	void setDatabase(TeDatabase* db)
+	{ db_ = db; }
+
+	//! Returns the layer id
+	int id()
+	{ return id_; } 
+
+	//! Sets the layer id
+	void id(int id)
+	{ id_ = id; } 
+
+	//! Returns the layer name
+	string name()
+	{ return name_; }
+
+	//! Sets the layer name
+	void name(const string &name)
+	{  name_ = name; }
+
+	//! Sets the  layer projection
+	void  setProjection ( TeProjection* proj );
+
+	//! Retrieves the layer projection
+	TeProjection* projection()
+	{	return projection_; }
+
+	//! Returns the layer bounding box
+	TeBox&	box()
+	{	return box_; }
+
+	//! Sets the  bounding box of a layer
+	void setLayerBox ( const TeBox& box );
+
+	//! Updates the bounding box of a layer
+	void updateLayerBox(const TeBox& box);
+
+	//! Refreshes the bounding box of a layer according to its representation
+	void updateLayerBox();
+
+	/** @name Attribute Tables
+	*  Methods to deal with the attribute tables of the layer
+	*/
+	//@{
+
+	//! Returns the number of distinct objects in the layer
+	int nObjects(const string& tName);
+
+	//! Returns a vector with the definition of all attribute tables associated to layer
+	TeAttrTableVector& attrTables () 
+	{ return attTables_; }
+
+	//! Creates a new attribute table for the layer
+	bool createAttributeTable(TeTable& table);
+
+    //! Adds an attribute table definition to layer vector of attribute tables (in memory)
+	bool addAttributeTable(TeTable& table);
+
+    //! Remove an attribute table definition to layer vector of attribute tables (in memory)
+	bool removeAttributeTable(string tableName);
+
+     //! Update an attribute table definition to layer vector of attribute tables (in memory)
+	void updateAttributeTable(TeTable& table);
+
+	//! Reload the tables definition from database to memory
+	bool loadLayerTables();
+
+	//! Saves an attribute table into the database where layer is stored 
+	bool saveAttributeTable(TeTable& table);
+
+	//! Gets all attribute tables associated to this layer that are of a certain type
+	bool getAttrTables(TeAttrTableVector& atts, TeAttrTableType attType = TeAllAttrTypes);
+
+	//! Gets a set of attribute table specifications associated to this layer that are of a certain type
+	/*
+		\param tableNames a vector that contains the name of the tables that are being searched
+		\param attType type of table that is being searched
+		\param atts returns a vector of tables found
+		\return true if at least one table was found and false otherwise
+	*/
+	bool getAttrTablesByName(vector<string> &tableNames, TeAttrTableVector& atts, TeAttrTableType attType = TeAllAttrTypes);
+
+	//! Gets an attribute table associated to a layer
+	/*
+		\param tableName name of the table being searched
+		\param attType type of table being searched
+		\param table returns the table found
+		\return true if table was found and false otherwise
+	*/
+	bool getAttrTablesByName(const string& tableName, TeTable& table, TeAttrTableType attType = TeAllAttrTypes);
+
+	//! Gets the name of the media table associated to layer
+	string mediaTable();
+
+	//! Sets the name of the media table associated to layer
+	void mediaTable(const string& name);
+	//@}
+
+	/** @name Geometries
+	*  Methods to deal with the geometries of the objects of a layer
+	*/
+	//! Returns a pointer to the raster geometry associated to an object of this layer
+	/*!
+		\param objectId unique identification of the object (if empty it will look
+		for the first raster geometry found)
+		\param mode permission access ('r', 'w')
+	*/
+	TeRaster* raster(const string& objectId="",const char& mode = 'r');
+
+	//! Sets the pointer to the raster representation
+	void raster( TeRaster* raster);
+
+	//! Retrieves a polygon set given a selection criteria, expressed as a where clause 
+	bool getPolygons(TePolygonSet &ps, const string& whereClause = "");
+
+	//! Retrieves a line set given a selection criteria, expressed as a where clause 
+	bool getLines(TeLineSet &ls, const string& whereClause = "");
+
+	//! Retrieves a point set given a selection criteria, expressed as a where clause 
+	bool getPoints(TePointSet &ps, const string& whereClause = "");
+
+	//! Retrieve a point set given a selection criteria, expressed as a where clause
+	bool getText(TeTextSet &ts, const string& whereClause = "");
+
+	//! Retrieve a cell set given a selection criteria, expressed as a where clause
+	bool getCells(TeCellSet &cs, const string& whereClause = "");
+
+	//! Locates a polygon that cointains a certain coordinate
+	bool locatePolygon(TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+	
+	//! Locates a line that cointains a certain coordinate
+	bool locateLine(TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+
+	//! Retrieves a point that cointains a certain coordinate
+	bool locatePoint(TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+
+	//! Retrieves a TeText that cointains a certain coordinate
+	bool locateText(TeCoord2D &pt, TeText &text, const double& tol = 0.0);
+
+	//! Retrieves a point that cointains a certain coordinate
+	bool locateCell(TeCoord2D &pt, TeCell &cell, const double& tol = 0.0);
+
+	//! Retrieves the set of polygons with a certain geoid
+	bool loadGeometrySet	(const string& geoid, TePolygonSet &ps);
+
+	//! Retrieves the set of lines with a certain geoid
+	bool loadGeometrySet (const string& geoid, TeLineSet &ls);
+
+	//! Retrieves the set of points with a certain geoid
+	bool loadGeometrySet (const string& geoid, TePointSet &ps);
+
+	//! Retrieves the set of points with a certain geoid
+	bool loadGeometrySet (const string& geoid, TeCellSet &cs);
+
+	//! Adds a set of polygons to a layer
+	bool addGeometrySet(TePolygonSet& polySet, const string& /* tName */ = "")
+	{ return addPolygons(polySet); }
+
+	//! Adds a set of lines to a layer
+	bool addGeometrySet(TeLineSet& lineSet, const string& /* tName */ = "")
+	{ return addLines(lineSet); }
+
+	//! Adds a set of points to a layer
+	bool addGeometrySet(TePointSet& pointSet, const string& /* tName */ = "")
+	{ return addPoints(pointSet); }
+
+	//! Adds a set of text to a layer
+	bool addGeometrySet(TeTextSet& textSet, const string& tName = "")
+	{ return addText(textSet,tName); }
+	
+	//! Adds a set of cells to a layer
+	bool addGeometrySet(TeCellSet& cellSet, const string& /* tName */ = "")
+	{ return addCells(cellSet); }
+
+	//! Adds a set of polygons to a layer
+	bool addPolygons(TePolygonSet& polySet);
+
+	//! Adds a set of lines to a layer
+	bool addLines (TeLineSet& lineSet);
+
+	//! Adds a set of points to a layer
+	bool addPoints (TePointSet& pointSet);
+
+	//! Adds a set of text to a layer
+	bool addText (TeTextSet& textSet,const string& tName);
+	
+	//! Adds a set of cells to a layer
+	bool addCells(TeCellSet& cellSet);
+
+	//@}
+
+	/** @name Geometries
+	*  Methods to deal with geometrical representations of a layer
+	*/
+	//! Removes a geometry from layer
+	bool removeGeometry (TeGeomRep repType, const string& tName="");
+
+	//! Indicates if layer has a geometry representation
+	bool hasGeometry (TeGeomRep rep);
+
+    //! Retrieves the table name associated to a geometry representation
+	/*! \param rep geometrical representation
+		\note When there is more than one representation of a given type
+		 returns the table name associated to the first one encountered
+	*/
+	string tableName(TeGeomRep rep); 
+
+	//! Retrieves the number of geometries of a type
+	/*! 
+		\param rep geometrical representation
+	*/	
+	int nGeometries(TeGeomRep rep);
+
+	//! Gets all information about a representation
+	bool getRepresentation(TeGeomRep repType, TeRepresPointerVector& result);
+
+	//! Gets an specific representation
+	/*! 
+		\param repType the geometrical representation being searched
+		\param tableName the table associated to this representation
+		\return the representation associated to a geometry with the given table name
+		\note if no table name is specified the first found is returned
+	*/
+	TeRepresentation* getRepresentation(TeGeomRep repType, const string& tableName="");
+    
+	//! Creates a new geometry representation to a layer
+	/*
+		\param repType the geometrical representation being searched
+		\param tableName name of the table that will stored the geometries
+		\param desc description of the representation
+		\return true if success and false otherwise
+	*/
+	bool addGeometry ( TeGeomRep repType, const string& tableName="", const string& desc = "");
+
+	//! Creates a new raster geometry to a layer
+	/*
+		\param par raster parameters
+		\param objectId identifier of the object that has the raster geometry
+		\param tableName name of the table that will stored the geometries
+		\param desc description of the representation
+		\return true if success and false otherwise
+	*/
+	bool addRasterGeometry(TeRasterParams& par, const string& objectId, 
+						   const string& tableName="", const string& desc="");
+
+	//! Returns a combination of all representations in the layer
+	int geomRep();
+
+	//! Adds a representation to vector of representation of the layer
+	void addVectRepres(TeRepresentation* rep)
+	{
+		repVector_.push_back(rep);
+	}
+
+	//! Returns a vector with all representations in the layer
+	TeRepresPointerVector& vectRepres()
+	{
+		return repVector_;
+	}
+
+	//@}
+
+private:
+
+// -- Members
+
+// -- General Description of a layer
+
+	string		name_;					//!< layer name
+	int			id_;					//!< layer unique identification
+	TeDatabase*	db_;					//!< database connection to this layer
+	TeProjection*	projection_;		//!< layer projection
+	TeBox		box_;					//!< layer bounding box
+	TeRaster*	raster_;				//!< layer raster representation
+
+	TeAttrTableVector	attTables_; 	//!< Attributes associated to a layer
+	TeRepresPointerVector repVector_;	//!< vector of representations associated to this layer
+};
+
+//! A map from a integer unique identifier to a pointer to layer
+typedef map<int,TeLayer*> TeLayerMap;
+
+/** \example LayerExample1.cpp
+ * This is an example of how to create a layer with objects, atributes and geometries
+ */
+#endif
+
diff --git a/src/terralib/kernel/TeLegendEntry.h b/src/terralib/kernel/TeLegendEntry.h
new file mode 100644
index 0000000..a7ff5bf
--- /dev/null
+++ b/src/terralib/kernel/TeLegendEntry.h
@@ -0,0 +1,202 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeLegendEntry.h
+    This file deals with legends in TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_LEGENDENTRY_H
+#define  __TERRALIB_INTERNAL_LEGENDENTRY_H
+
+#include "TeVisual.h"
+#include "TeUtils.h"
+#include "TeDataTypes.h"
+#include "TeSlice.h"
+
+#include <string>
+#include <vector>
+#include <map>
+
+using namespace std;
+
+class TeTheme;
+
+//! A map from representation types to a presentation visual characteristics
+typedef map<TeGeomRep,TeVisual> TeGeomRepVisualMap;
+
+
+//! A legend entry defines a group of objects and its visual presentation characteristics in a theme
+/*!
+	The group of objects is defined by a TeSlice, and has a unique identifier
+	The visual presentation characteristics id defined by a TeGeomRepVisualMap
+	Each legend entry has a unique identification
+*/
+class TeLegendEntry
+{
+public:
+
+	//! Constructor
+	TeLegendEntry::TeLegendEntry () : 
+		label_(""),
+		id_(-1),
+		theme_(0),
+		group_(0)
+		{}
+
+	//! Constructor
+	TeLegendEntry::TeLegendEntry (const TeSlice& slice) :
+		slice_(slice),
+		id_(-1),
+		theme_(0),
+		group_(0)
+	{
+			if (slice_.from_ == "Missing Data")
+				label_ = "Missing Data";
+			else 
+			{
+				int i = slice_.from_.find("mean = ");
+				if (i >= 0 || slice_.to_.empty())
+					label_ = slice_.from_;
+				else
+					label_ = slice_.from_ + " ~ " + slice_.to_;
+			}
+	}
+
+	
+	//! Copy constructor
+	TeLegendEntry (const TeLegendEntry& leg)
+	{
+		if (&leg == this)
+			return;
+		visualMap_ = leg.visualMap_;
+		slice_ = leg.slice_;
+		label_ = leg.label_;
+		id_ = leg.id_;
+		theme_ = leg.theme_;
+		group_ = leg.group_;
+	}
+
+	//! Operator =
+	TeLegendEntry& operator = (const TeLegendEntry& leg)
+	{
+		visualMap_ = leg.visualMap_;
+		slice_ = leg.slice_;
+		label_ = leg.label_;
+		id_ = leg.id_;
+		theme_ = leg.theme_;
+		group_ = leg.group_;
+		return *this;
+	}
+
+	//! Returns the legend id
+	int	id () { return id_; }
+	//! Sets the legend id
+	void id (int i) { id_ = i; }
+
+	//! Returns the theme identifier to which the legend belongs
+	int	theme () { return theme_; }
+	//! Sets the theme id to which this legend belongs to
+	void theme (int i) { theme_ = i; }
+
+	//! Returns the group identifier associated to the legend
+	int	group () { return group_; }
+	//! Sets the group identification to which this legend refers to
+	void group (int i) { group_ = i; }
+
+	//! Returns the visual presentation characteristics associated to a given representation
+	TeVisual& visual (TeGeomRep rep)
+	{ 
+		static TeVisual visual;
+		if(visualMap_.find(rep) == visualMap_.end())
+			return visual;
+		return visualMap_[rep];
+	}
+	//! Sets the visual presentation characteristics associated to a given representation
+	void setVisual (TeVisual &vis, TeGeomRep rep) 
+	{ visualMap_[rep] = vis; }
+	//! Return the visual presentation characteristics map
+	TeGeomRepVisualMap& getVisualMap()
+	{	return visualMap_; }
+
+	//! Returns the slice associated to this legend
+	TeSlice& slice()
+	{  return slice_; }
+	// Sets the slice associated to this legend
+	void setSlice(const TeSlice& sl)
+	{	slice_ = sl; }
+	//! Returns the number of objects of the legend
+	int count() 
+	{ return slice_.count_; }
+	//! Sets the number of objects with the legend
+	void count(int n) 
+	{ slice_.count_ = n; }
+	//! Increase the number of objects with the legend
+	void incCount(int n=1)
+	{	slice_.count_ += n; }
+	
+	//! Returns the lower value associated to the legend
+	string from()
+	{	return slice_.from_; }
+	//! Sets the lower value associated to the legend
+	void from(string& s)
+	{ slice_.from_ = s; }
+
+	//! Returns the upper value associated to the legend
+	string to()
+	{	return slice_.to_; }
+	//! Sets the upper value associated to the legend
+	void to(string& s)
+	{	slice_.to_ = s; }
+
+	//! Returns the label associated to the legend 
+	string label()
+	{
+		if (label_.empty())
+		{
+			int npos = slice_.from_.find("mean = ");
+			if (npos >= 0 || slice_.to_.empty())
+				label_ = slice_.from_;
+			label_ = slice_.from_ + " ~ " + slice_.to_;
+		}
+		return label_;
+	}
+	//! Sets the label associated to the legend
+	void label(string& s)
+	{	label_ = s; }
+
+private:
+
+	TeGeomRepVisualMap	visualMap_;
+	TeSlice				slice_;
+	string				label_;
+	int					id_;
+	int					theme_;
+	int					group_;
+};
+
+//! A vector of legendy entries
+typedef vector<TeLegendEntry> TeLegendEntryVector;
+
+//! A map of legend identifiers to legend entrie pointers
+typedef map<int, TeLegendEntry*> TeLegendEntryMap;
+
+#endif
+
diff --git a/src/terralib/kernel/TeMatrix.cpp b/src/terralib/kernel/TeMatrix.cpp
new file mode 100644
index 0000000..7df0b10
--- /dev/null
+++ b/src/terralib/kernel/TeMatrix.cpp
@@ -0,0 +1,1516 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+ // TeMatrix.c -- matrix of type double
+
+#include <TeMatrix.h>
+#include <math.h>
+#include <stdio.h>
+
+
+TeMatrix::TeMatrix(){
+	nrow = 0;
+	ncol = 0;
+	mat  = NULL;
+	lixo = 0.;
+}
+
+void
+TeMatrix::Clear()
+{
+	if( mat != NULL ){
+		int i;
+		for( i = 0; i < nrow; i++ )
+			if( mat[i] != NULL )
+			{
+				delete []mat[i];
+				mat[i]=NULL;
+			}
+		delete []mat;
+		mat = NULL;
+	}
+	nrow = ncol = 0;
+	lixo = (double)0;
+}
+
+TeMatrix::~TeMatrix()
+{
+	Clear();
+}
+
+short
+TeMatrix::Alloc(int nl, int nc)
+{
+	Clear();
+	if( nl <= 0 || nc <= 0 ){
+		return false;
+	}
+	nrow = nl;
+	ncol = nc;
+	if (  (mat = new double*[nrow]) == NULL ){
+		Clear();
+		return false;
+	}
+	int i,j;
+	for( i = 0; i < nrow; i++ ) mat[i] = NULL;
+	for( i = 0; i < nrow; i++ ){
+		if( (mat[i] = new double[ncol]) == NULL ){
+			Clear();
+	       		return false;
+		}
+		for( j = 0; j < ncol; j++ ) mat[i][j] = (double)0.;
+	}
+	return true;
+}
+
+TeMatrix::TeMatrix(const TeMatrix& m)
+{
+     nrow = ncol = 0;
+     mat = NULL;
+     lixo = 0.;
+    *this = m;
+}
+
+int
+TeMatrix::Init( int nl, int nc , double* f )
+{
+ 	if( f == NULL )
+		return Init( nl, nc,  (double) 0 );
+	if( Alloc( nl, nc ) ){
+		int c=0;
+		int i,j;
+		for ( i = 0; i < nrow; i++)
+			for (j = 0; j < ncol; j++)
+				mat[i][j] = f[c++];
+		return true;
+	}
+	return false;
+}
+
+int
+TeMatrix::Init(int nl, int nc, double f )
+{
+ 	// initialize matrix
+	if( Alloc( nl, nc ) ){
+ 		int i,j;
+     		for (i = 0; i < nrow; i++)
+       			 for (j = 0; j < ncol; j++)
+        		 	mat[i][j] = f;
+		return true;
+	}
+	return false;
+}
+
+int
+TeMatrix::Init(int k, double* f)
+{
+ 	if( f == NULL )
+		return Init( k, k,  (double) 0 );
+	if( Alloc(k,k) == false ) 
+		return false;
+	int i,j;
+	for ( i = 0; i < nrow; i++  )
+    		for (j = 0; j < ncol; j++)
+        		mat[i][j] = (i==j)? f[i]: (double)0.;
+   	return true;
+}
+
+int
+TeMatrix::Init(int k, double f)
+{
+	if( Alloc(k,k) == false )
+		return false;
+	int i,j;
+	for (i=0; i<nrow; i++)
+		for (j=0; j<ncol; j++)
+			mat[i][j] = (i==j)? (double)f:0;
+	return true;
+}
+
+TeMatrix& 
+TeMatrix::operator=(const TeMatrix& m)
+{
+
+	if( Alloc(m.nrow,m.ncol) == false ){
+		printf("\nMatrix::operator=:no memory available \n");
+		return *this;
+    	}
+	int	i,j;
+    	for( i = 0; i < nrow; i++)
+     		for( j = 0; j < ncol; j++)
+       			mat[i][j] = m.mat[i][j];
+    	return *this;
+}
+
+int
+TeMatrix::operator==(const TeMatrix& m) const
+{
+	if( nrow != m.nrow || ncol != m.ncol )
+		return false;
+	int	i,j;
+	for ( i = 0; i < nrow; i++)
+		for ( j = 0; j < ncol; j++)
+			if ( mat[i][j]!= m.mat[i][j] )
+				return false;
+	return true;
+}
+
+void
+TeMatrix::operator*=(double f)
+{
+	int	i,j;
+	for( i = 0; i < nrow; i++)
+		for( j = 0; j < ncol; j++)
+			mat[i][j] *= f;
+	return;
+}
+
+
+//-------------------------------------------------------------friend methods
+
+TeMatrix
+operator+(const TeMatrix& m,const TeMatrix& n)
+{
+	if( m.nrow != n.nrow || m.ncol != n.ncol ){
+		printf("\nMatrix::operator+ >>> Operandos com tamanhos diferentes\n");
+	        return  m;
+	} 
+	TeMatrix rm;
+	if( rm.Init(m.Nrow(),m.Ncol()) == false ){
+		printf("\nMatrix::operator+ >>> Memoria nao disponivel\n");
+		return	m;
+	}
+	int	i,j;
+	for ( i = 0; i < m.Nrow(); i++)
+		for ( j = 0; j < m.Ncol(); j++)
+			rm.mat[i][j] = m.mat[i][j] + n.mat[i][j];
+	return rm;
+}
+
+TeMatrix
+operator-(const TeMatrix& m,const TeMatrix& n)
+{
+	if( m.nrow != n.nrow || m.ncol != n.ncol ){
+		printf("\nMatrix::operator+ >>> Operandos com tamanhos diferentes\n");
+	        return  m;
+	} 
+	TeMatrix rm;
+	if( rm.Init(m.Nrow(),m.Ncol()) == false ){
+		printf("\nMatrix::operator- >>> Memoria nao disponivel\n");
+		return	m;
+	}
+
+	int	i,j;
+	for ( i = 0; i <  m.Nrow(); i++)
+		for ( j = 0; j < m.Ncol(); j++)
+			rm.mat[i][j] = m.mat[i][j] - n.mat[i][j];
+	return rm;
+}
+
+TeMatrix
+TeMatrix::operator-()
+{
+	TeMatrix rm;  
+	if( rm.Init(Nrow(),Ncol()) == false ){
+		printf("\n operator-:no memory \n");
+		return	*this;
+	}
+	int i,j;
+	for (i=0; i<Nrow(); i++)
+		for (j=0; j<Ncol(); j++)
+			rm.mat[i][j] = -mat[i][j];
+	return rm;
+}
+
+TeMatrix 
+operator*(const TeMatrix& m,const TeMatrix& n)
+{
+	if ( m.Ncol() != n.Nrow() ) {
+		printf( "\nMatrix::operator* >>> Operandos com tamanhos diferentes\n");
+		return m;
+	}
+	int nr = m.Nrow(), nc =n.Ncol();
+	TeMatrix result;
+	if( result.Init(nr,nc) == false){
+		printf("\nMatrix::operator* >>> Memoria nao disponivel\n");
+		return	m;
+	}
+
+	double	sum = (double)0.;
+	int	l,c,i;
+
+	for ( l = 0; l < m.Nrow(); l++){
+		for ( c = 0; c < n.Ncol(); c++){
+        		sum = (double)0.;
+			for ( i = 0; i < m.Ncol(); i++)
+				sum += m.mat[l][i] * n.mat[i][c];
+    			result.mat[l][c] = sum;
+
+		}
+	}
+	return result; 
+}
+
+TeMatrix
+operator*(double f,const TeMatrix& m)
+{
+	int nr = m.Nrow(), nc =m.Ncol();
+	TeMatrix rm;
+	if( rm.Init(nr,nc) == false){
+		printf("\noperator*:no memory");
+		return m;
+	}
+	int i,j;
+	for (i = 0; i < rm.Nrow(); i++)
+		for (j = 0; j < rm.Ncol(); j++)
+			rm.mat[i][j] = f * m.mat[i][j];
+	return rm;
+}
+
+//VRMC 12/98
+int
+TeMatrix::isUpperTriangle() const
+{
+	// elements above diagonal != 0
+	int i,j;
+	for(j = 0; j < ncol; j++)
+		for(i = j+1; i < nrow; i++)
+			if ( mat[i][j]  != (double)0 )
+				return false;
+	return true;
+}
+
+//VRMC 12/98
+int
+TeMatrix::isLowerTriangle() const	
+{
+	// elements under diagonal different 0
+	int i,j;
+/*	for(j=0; j<ncol; j++)
+		for(i=j+1; i<nrow; i++)
+			if ( mat[i][j]!=0 )*/
+	// VRMC 11/98
+	for (i=0; i< nrow; i++)
+		for (j= i+1; j <ncol; j++)
+			if ( mat[i][j] != (double)0)
+				return false;
+	return true;
+}
+
+double
+TeMatrix:: Determinant()
+{
+	if (Nrow() != Ncol()) {
+		printf("\nMatrix::Determinant >>> not a square matrix\n");
+		return lixo;
+	}
+	if (Nrow()==1) return mat[0][0];
+	if (Nrow()==2)
+		return mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0];
+	if (Nrow()==3) 
+		return (  mat[0][0] * mat[1][1] * mat[2][2]
+			 +mat[0][1] * mat[1][2] * mat[2][0]
+			 +mat[0][2] * mat[1][0] * mat[2][1]
+			 -mat[0][1] * mat[1][0] * mat[2][2]
+			 -mat[0][0] * mat[1][2] * mat[2][1]
+ 			 -mat[0][2] * mat[1][1] * mat[2][0] );
+	if ( isUpperTriangle() ) {
+		double val = 1;
+		int i;
+		for (i = 0; i < Nrow(); i++) val *= mat[i][i];
+		return val;
+    	}
+	TeMatrix mt;
+	double val = 0;
+	double det;
+	int sign = 1;
+	int j;
+	for(j = 0; j < Ncol(); j++) {
+		if( CoFactor(0,j, mt) == false )
+			return (double)0;
+		det = mt.Determinant();		
+		val += sign * mat[0][j] * det;
+		sign *= -1;
+     	}
+	return val;
+}
+
+int
+TeMatrix::CoFactor(int irow, int jcol, TeMatrix& mt ) const
+{
+ 	if ( nrow == 1||ncol == 1 ) {
+		printf("\nMatrix::CoFactor >>>  can't CoFactor row or column matrix\n");
+		return false;
+   	}
+	if( mt.Init(nrow-1,ncol-1) == false){
+		printf("\nMatrix::CoFactor: Memoria nao disponivel\n");
+		return false;
+	}
+	int getcol, getrow =0;
+	int i,j;
+	for(i=0; i < mt.Nrow(); i++) {
+		if ( getrow == irow ) ++getrow;
+		if ( getrow == nrow ) break;
+		getcol = 0;
+		for(j=0; j < mt.Ncol(); j++) {
+			if ( getcol==jcol ) ++getcol;
+			if ( getcol==ncol ) continue;
+			mt.mat[i][j] = mat[getrow][getcol];
+			++getcol;
+		}
+		++getrow;
+	}
+	return true;
+}
+
+int 
+TeMatrix::Transpose( TeMatrix &rm ) const
+{
+	if( &rm == this ){
+		printf("\nMatrix::Transpose >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+
+	if( rm.Init( ncol, nrow ) == false){
+		printf("\nMatrix::Transpose >>> Memoria nao disponivel\n");
+		return false;
+	}
+	int i,j;
+	for(i = 0; i < ncol; i++)
+		for( j = 0; j < nrow; j++)
+			rm.mat[i][j] = mat[j][i];
+	return true;
+}
+
+// VRMC 12/98
+int
+TeMatrix::isSimetric()	const
+{
+	int i,j;
+
+	if (nrow != ncol){
+		printf("\nMatrix::isSimetric >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	for (i = 0; i < nrow; i++)
+		for (j = 0; j < ncol; j++)
+			if ( mat[i][j] != mat[j][i]) return false;
+
+	return	true;
+}
+
+// VRMC 12/98
+int		
+TeMatrix::isPositiveDefinide() const
+{
+	int i, j, dim, subdim;
+	TeMatrix	Submat;
+
+	if (nrow != ncol){
+		printf("\nMatrix::isPositiveDefinide >>> Matriz tem que ser quadrada\n");
+		return false;
+	}
+	dim = nrow;
+
+	for (subdim=1 ; subdim <= dim; subdim++)
+	{
+		if( Submat.Init( subdim,subdim ) == false ){
+			printf("\nMatrix::isPositiveDefinide>>>Memoria nao disponivel!\n");
+			return false;
+		}
+
+		for ( i=0; i < subdim; i++)
+			for (j = 0; j < subdim; j++)
+				Submat(i,j) = mat[i][j];
+		
+		if (Submat.Determinant() <= 0.) {
+			printf("\nMatrix::isPositiveDefinide>>>Matriz nao e positiva definida!\n");
+			return false;
+		}
+
+		Submat.Clear();
+	}
+	return true;
+}
+
+// VRMC 12/98
+int
+TeMatrix :: MatTransf( TeMatrix& mt )
+{
+	TeMatrix	TI;	// inverse of a inferior triangular matrix
+	int	dim;
+
+	if( &mt == this ){
+		printf("\nMatrix::MatTransf >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+
+	if( nrow <= 0 || ncol <= 0 ){
+		printf("\nMatrix::MatTransf >>> Dimensoes da matriz invalidas!\n");
+		return false;
+	}
+
+	if( nrow != ncol ){
+		printf("\nMatrix::MatTransf >>> Dimensoes da matriz invalidas!\n");
+		return false;
+	}
+
+	dim = nrow;
+	if( mat[0][0] <= 0. ){
+		printf("\nMatrix::MatTranf >>> ERROR\n");
+		return false;
+	}
+
+	if( TI.Init( dim, (double)0. ) == false ){
+		printf("\nMatrix::MatTransf >>> Memoria nao disponivel!\n");
+		return false;
+	}
+
+
+	//--	Calculate inferior triangular matrix by Cholesky decomposition method
+	if ((*this).CholeskyDecomp(TI) == false) {
+		printf("\nMatrix::MatTransf>>> Nao foi possivel decompor a matriz!\n");
+		return false;
+	}
+
+	//--	Calculate the inverse of Cholesky matrix
+//	if (TI.CholeskyInv(mt) != true)
+	if (!(TI.CholeskyInv(mt)))
+	{
+		printf("\nMatrix::MatTransf>>> Matriz nao inversivel!\n");
+		return false;
+	}
+
+	return true;
+}
+
+// VRMC 12/98			
+int
+TeMatrix::CholeskyInv (TeMatrix&	mt) const
+{
+	if( mt.Init(nrow,(double)0.) == false ){
+		printf("\nMatrix::CholeskyInv >>> Memoria nao disponivel!\n");
+		return false;
+	}
+
+	if( &mt == this ){
+		printf("\nMatrix::CholeskyInv >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+	if ( nrow != ncol ){
+       		printf("\nMatrix::CholeskyInv>>> Can't invert a non-square matrix");
+       		return false;
+   	}
+//	if (this->isLowerTriangle() != true) {
+	if (!(this->isLowerTriangle())) {
+		printf("\nMatrix::CholeskyInv >>> Matriz nao e triangular inferior\n");
+		return false;
+	}
+
+	int i; double rf;
+	for( i = 0; i < nrow; i++ ){
+		if( this->mat[i][i] == (double)0. ){
+			printf("\nMatrix::CholeskyInv >>> ERROR IV\n");
+			return false;
+		}
+		mt.mat[i][i] = (double)1. / this->mat[i][i];
+		int j,k;
+		for( j = i-1; j >= 0; j-- ){
+			rf = (double)0.;
+			for( k = j; k <= i-1; k++ ){
+				rf += ( this->mat[i][k] * mt.mat[k][j] );
+			}
+			mt.mat[i][j] = -rf * mt.mat[i][i];
+		}
+	}
+	return true;
+}
+	
+
+int
+TeMatrix::EigenValues( TeMatrix& mt )
+{
+	//---	calcula os eigenvalues  de uma
+	//	matriz representada na forma vetorial 
+	//	Os auto valores sao devolvidos em ordem decrescente    
+	//	e ocupam as posicoes:  0, 2, 5, 9, ... .       
+
+	if( &mt == this ){
+		printf("\nMatrix::EigenValues >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+
+double	*cov	= NULL,		/* matriz de covariancia	*/
+	*e_val	= NULL;		/*   "    de auto_valores	*/
+
+int 	dim = (*this).Nrow();		/* ordem da matriz*/
+
+int	i,j,k,		/*   cov[], e_val[]    */
+	ia,             /*                     */
+	ind,            /*     |0      |       */
+	l,m,            /*     |1 2    |       */
+	mq,lm,          /*     |3 4 5  |       */
+	ll,mm,          /*     |6 7 8 9|       */
+	ilq,imq,        /*                     */
+	im,iq,il,lq,    /*    (para DIM=4)     */
+	jq;
+
+double	range,          /*       e_vec[]       */
+	dim1,fdim,      /*                     */  
+	anorm,          /*    |0  4  8 12|     */
+	anrmx,          /*    |1  5  9 13|     */
+	thr,            /*    |2  6 10 14|     */
+	x,y,z,          /*    |3  7 11 15|     */
+	sinx,cosx,      /*                     */
+	sinx2,cosx2,
+	sincs;
+
+int 	fat = (dim*dim+dim)/2;
+
+	if( dim <= 0 ){
+		printf("\nMatrix::EigenValues >>> dimensao da matriz nula!\n");
+		return false;
+	}
+	if( mt.Init( dim, (double)1 ) == false ){
+		printf("\nMatrix::EigenValues >>> Memoria nao disponivel\n");
+		return false;
+	}
+	range = 1.0e-6 ;
+	dim1 = dim - 1 ;
+	fdim = dim;
+
+	cov = new double[fat];
+
+	if( cov == NULL ){
+		printf("\nMatrix::EigenValues >>> Memoria nao disponivel (COV)\n");
+		return false;
+	}
+
+	e_val = new double[fat];
+	if( e_val == NULL ){
+		delete []cov; //SSL0296
+		cov = NULL;
+		printf("\nMatrix::EigenValues >>> Memoria nao disponivel (EVAL)\n");
+		return false;
+	}
+	k = 0;
+	for ( i = 0; i< dim; i++)
+		for ( j = 0; j <= i; j++)
+			cov[k++] = mat[i][j];
+
+	for (i=0; i < ((dim*dim+dim)/2); i++) e_val[i] = cov[i];
+
+	anorm = 0.0;
+
+	for ( j = 0; j < dim; j++){
+		for (i = 0; i <= j; i++){
+			if (i != j){
+				ia = i + (j*j+j)/2;
+				anorm = anorm + e_val[ia] * e_val[ia];
+			}
+		}
+	}
+
+	if (anorm <= 0) goto l5;
+
+	anorm = 1.414 * sqrt((double)anorm);
+	anrmx = anorm * range/fdim;
+	ind   = 0;
+	thr   = anorm;
+
+l1:
+	thr = thr/fdim;
+l2:
+	l = 0;
+l3:
+	m = l+1;
+l4:
+	mq = (m*m + m)/2;
+	lq = (l*l + l)/2;
+	lm = l + mq;
+
+	if ( fabs((double)(e_val[lm])) >= thr )    
+	{
+		ind = 1;
+		ll = l + lq;
+		mm = m + mq;
+
+		x = 0.5 * (e_val[ll] - e_val[mm]);
+		z = e_val[lm] * e_val[lm] + x*x;
+		y = - e_val[lm] / sqrt((double)(z));
+
+		if (x < 0)  
+		{
+			y = -y;
+		}
+
+		z = sqrt( (double)(1.0-y*y) );
+		sinx = y / sqrt( (double)( 2.0*(1.0 + z) ) );
+		sinx2 = sinx * sinx;
+		
+		cosx = sqrt( (double)(1.0 - sinx2) );
+		cosx2 = cosx * cosx;
+
+		sincs = sinx * cosx;
+	
+		ilq = dim * l;
+		imq = dim * m;
+
+		for (i = 0; i < dim; i++)
+		{
+			iq = (i*i + i)/2;
+			if ( i != l )
+			{
+				if (i != m)
+				{
+					if (i > m) 
+						im = m + iq;
+					else
+						im = i + mq;
+					if (i < l)
+						il = i + lq;
+					else
+						il = l + iq;
+
+					x = e_val[il] * cosx - e_val[im] * sinx;
+					e_val[im] = e_val[il] * sinx + e_val[im] * cosx;
+					e_val[il] = x;
+				}
+			}
+		}
+		x = 2.0 * e_val[lm] * sincs;
+		y = e_val[ll] * cosx2 + e_val[mm] * sinx2 - x;
+		x = e_val[ll] * sinx2 + e_val[mm] * cosx2 + x;
+
+		e_val[lm] = (e_val[ll]-e_val[mm])*sincs+e_val[lm]*(cosx2-sinx2);
+		e_val[ll] = y;
+		e_val[mm] = x;
+	}
+
+	if (m != (dim-1))
+	{
+		m = m + 1;	goto l4;
+	}
+	if (l != (dim-2))
+	{
+		l = l + 1;	goto l3;
+	}
+	if (ind == 1)
+	{
+		ind = 0;	goto l2;
+	}
+	if (thr > anrmx) goto l1;
+
+l5:
+	iq = -dim;
+
+	for (i = 0; i < dim; i++)
+	{
+		iq = iq + dim;
+		ll = i + (i*i + i)/2;
+		jq = dim * (i-1);
+
+		for (j = i; j < dim; j++)
+		{
+			jq = jq + dim;
+			mm = j + (j*j + j)/2;
+
+			if (e_val[ll] < e_val[mm])
+			{
+				x = e_val[ll];
+				e_val[ll] = e_val[mm];
+				e_val[mm] = x;
+			}
+		}
+	}
+
+	for ( i = 0; i< dim; i++){
+		mt(i,0) = e_val[(i*(i+1))/2+i];
+	}
+
+	delete []cov;	//SSL0296
+	delete []e_val; //SSL0296
+
+	return true;
+}
+
+//--------------------------------------------------EigenVectors
+//
+//	Metodo adaptado a partir de uma implementacao em C
+//	utilizada no software SITIM.
+
+int
+TeMatrix::EigenVectors( TeMatrix& mt )
+{
+	if( &mt == this ){
+		printf("\nMatrix::EigenVectors >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+
+double	*cov	= NULL,		/* matriz de covariancia	*/
+	*e_val	= NULL,		/*   "    de auto_valores	*/
+	*e_vec	= NULL; 	/*   "    de auto_vetores	*/
+
+int 	dim = (*this).Nrow();		/* ordem da matriz*/
+
+int	i,j,ij,k,       /*   cov[], e_val[]    */
+	ia,             /*                     */
+	ind,            /*     |0      |       */
+	l,m,            /*     |1 2    |       */
+	mq,lm,          /*     |3 4 5  |       */
+	ll,mm,          /*     |6 7 8 9|       */
+	ilq,imq,        /*                     */
+	im,iq,il,lq,    /*    (para DIM=4)     */
+	ilr,imr,
+	jq;
+
+double	range,          /*       e_vec[]       */
+	dim1,fdim,      /*                     */  
+	anorm,          /*    |0  4  8 12|     */
+	anrmx,          /*    |1  5  9 13|     */
+	thr,            /*    |2  6 10 14|     */
+	x,y,z,          /*    |3  7 11 15|     */
+	sinx,cosx,      /*                     */
+	sinx2,cosx2,
+	sincs;
+
+	if( dim <= 0 ){
+		printf("\nMatrix::EigenValues >>> dimensao da matriz nula!\n");
+		return false;
+	}
+	if( mt.Init( dim, (double)1 ) == false ){
+		printf("\nMatriz::EigenVectors >>> Memoria nao disponivel!\n");
+		return false;
+	}
+
+	int fat =(dim*dim+dim)/2;
+	range = 1.0e-6 ;
+	dim1 = dim - 1 ;
+	fdim = dim;
+
+	cov   = new double[fat];
+	e_vec = new double[dim*dim];
+	e_val = new double[fat];
+
+	if( cov == NULL || e_vec == NULL || e_val == NULL ){
+		printf("\nMatrix::EigenVectors >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	k = 0;
+	for ( i = 0; i< dim; i++)
+		for ( j = 0; j <= i; j++)
+			cov[k++] = (*this)(i,j);
+
+	for (i=0; i < ((dim*dim+dim)/2); i++) e_val[i] = cov[i];
+
+	iq = -dim;
+	for (i = 0; i < dim; i++)
+	{
+		iq = iq + dim;
+		for ( j = 0; j < dim; j++)
+		{
+			ij = iq + j;
+			if (i == j)
+				e_vec[ij] = 1.0;
+			else
+				e_vec[ij] = 0.0;
+		}
+	}
+ 
+	anorm = 0.0;
+
+	for ( j = 0; j < dim; j++)
+	{	
+		for (i = 0; i <= j; i++)
+		{
+			if (i != j)
+			{
+				ia = i + (j*j+j)/2;
+				anorm = anorm + e_val[ia] * e_val[ia];
+			}
+		}
+	}
+
+	if (anorm <= 0) goto l5;
+
+	anorm = 1.414 * sqrt((double)anorm);
+	anrmx = anorm * range/fdim;
+	ind   = 0;
+	thr   = anorm;
+
+l1:
+	thr = thr/fdim;
+l2:
+	l = 0;
+l3:
+	m = l+1;
+l4:
+	mq = (m*m + m)/2;
+	lq = (l*l + l)/2;
+	lm = l + mq;
+
+	if ( fabs((double)(e_val[lm])) >= thr )    
+	{
+		ind = 1;
+		ll = l + lq;
+		mm = m + mq;
+
+		x = 0.5 * (e_val[ll] - e_val[mm]);
+		z = e_val[lm] * e_val[lm] + x*x;
+		y = - e_val[lm] / sqrt((double)(z));
+
+		if (x < 0)  
+		{
+			y = -y;
+		}
+
+		z = sqrt( (double)(1.0-y*y) );
+		sinx = y / sqrt( (double)( 2.0*(1.0 + z) ) );
+		sinx2 = sinx * sinx;
+		
+		cosx = sqrt( (double)(1.0 - sinx2) );
+		cosx2 = cosx * cosx;
+
+		sincs = sinx * cosx;
+	
+		ilq = dim * l;
+		imq = dim * m;
+
+		for (i = 0; i < dim; i++)
+		{
+			iq = (i*i + i)/2;
+			if ( i != l )
+			{
+				if (i != m)
+				{
+					if (i > m) 
+						im = m + iq;
+					else
+						im = i + mq;
+					if (i < l)
+						il = i + lq;
+					else
+						il = l + iq;
+
+					x = e_val[il] * cosx - e_val[im] * sinx;
+					e_val[im] = e_val[il] * sinx + e_val[im] * cosx;
+					e_val[il] = x;
+				}
+			}
+
+			//---	calculate eigenvectors
+
+			ilr = ilq + i;
+			imr = imq + i;
+			x   = e_vec[ilr] * cosx - e_vec[imr] * sinx;
+			e_vec[imr] = e_vec[ilr] * sinx + e_vec[imr] * cosx;
+			e_vec[ilr] = x;
+		}
+
+		x = 2.0 * e_val[lm] * sincs;
+		y = e_val[ll] * cosx2 + e_val[mm] * sinx2 - x;
+		x = e_val[ll] * sinx2 + e_val[mm] * cosx2 + x;
+
+		e_val[lm] = (e_val[ll]-e_val[mm])*sincs+e_val[lm]*(cosx2-sinx2);
+		e_val[ll] = y;
+		e_val[mm] = x;
+	}
+
+	if (m != (dim-1))
+	{
+		m = m + 1;	goto l4;
+	}
+	if (l != (dim-2))
+	{
+		l = l + 1;	goto l3;
+	}
+	if (ind == 1)
+	{
+		ind = 0;	goto l2;
+	}
+	if (thr > anrmx) goto l1;
+
+l5:
+	iq = -dim;
+
+	for (i = 0; i < dim; i++)
+	{
+		iq = iq + dim;
+		ll = i + (i*i + i)/2;
+		jq = dim * (i-1);
+
+		for (j = i; j < dim; j++)
+		{
+			jq = jq + dim;
+			mm = j + (j*j + j)/2;
+
+			if (e_val[ll] < e_val[mm])
+			{
+				x = e_val[ll];
+				e_val[ll] = e_val[mm];
+				e_val[mm] = x;
+
+				for (k = 0; k < dim; k++)
+				{
+					ilr = iq + k;
+					imr = jq + k;
+					x   = e_vec[ilr];
+					e_vec[ilr] = e_vec[imr];
+					e_vec[imr] = x;
+				}
+			}
+		}
+	}
+	
+	k=0;
+	for ( i = 0; i< dim; i++){
+		for ( j = 0; j< dim; j++)
+			mt(j,i) = e_vec[k++];
+	}
+
+	delete []cov;	//SSL0296
+	delete []e_vec;	//SSL0296
+	delete []e_val; //SSL0296
+
+	return true;
+}
+
+//--------------------------------------------------EigenVec
+//
+//	Metodo desenvolvido para suporte de decisao (suporte_stubs.cpp)
+//	Missae Yamamoto  (junho/1999)
+
+int
+TeMatrix::EigenVec( double e_vec[] )
+{
+
+double	*e_vec_aux	= NULL, soma = 0.0; 
+	
+int 	dim = (*this).Nrow();		/* ordem da matriz*/
+
+TeMatrix  aux1, aux2, mt;
+
+int	i,j,k;       
+	
+	if( dim <= 0 )
+	{
+		printf("\nMatrix::EigenVecVal >>> dimensao da matriz nula!\n");
+		return false;
+	}
+
+	if( aux1.Init( dim, (double)1 ) == false )
+	{
+		printf("\nMatrix::EigenVecVal >>> Memoria nao disponivel!\n");
+		return false;
+	}
+
+	if( aux2.Init( dim, (double)1 ) == false )
+	{
+		printf("\nMatrix::EigenVecVal >>> Memoria nao disponivel!\n");
+		return false;
+	}
+
+	e_vec_aux = new double[dim];
+
+	if( e_vec_aux == NULL )
+	{
+		printf("\nMatrix::EigenVecVal >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	for ( k = 0; k< dim; k++)
+	{
+		e_vec_aux[k] = 0.0;
+		e_vec[k] = 0.0;
+	}
+
+	aux1 = *this;
+	aux2 = *this;
+	
+	for (;;)
+	{
+		mt = aux1 * aux2;
+
+		for (i=0; i<dim; i++)
+		{
+			for (j=0; j<dim; j++)
+				 e_vec[i] = e_vec[i] + mt(i,j);
+			soma = soma + e_vec[i];
+		}
+
+		for (j=0; j<dim; j++)
+			e_vec[j] = e_vec[j] / soma;
+
+		for (j=0; j<dim; j++)
+		{
+			if ( fabs(e_vec_aux[j] - e_vec[j]) < 0.001 ) 
+			{
+				delete []e_vec_aux;	
+				return true;
+			}
+			e_vec_aux[j] = e_vec[j];
+		}
+
+		aux1 = mt;
+		aux2 = mt;
+	}
+
+}
+
+//------------------------------------------ Print
+void
+TeMatrix::Print()
+{
+	//printf("\nMATRIZ ( %d, %d ) LIXO %f **mat %p\n", nrow,ncol, lixo, mat);
+	printf("\nMATRIZ ( %d, %d )\n\n", nrow,ncol);
+	if( mat == NULL ){
+		printf("\n>>> mat e NULL \n");
+		return;
+	}
+	int i,j;	
+	for(i = 0; i < nrow; i++){
+		for( j = 0; j < ncol;j++){
+			printf("%10.4f ",(float)mat[i][j]);
+		}
+		printf("\n\n");
+	}
+}
+
+// VRMC 12/98
+int
+TeMatrix::CholeskyDecomp( TeMatrix& mt )
+{
+
+	//--	Verify if the matrix is simetric
+	if ((*this).isSimetric() == false){
+		printf("\nMatrix::CholeskyDecomp >>> Matriz nao e simetrica!\n");
+		return false;
+	}
+	//--	Verify if the matrix is positive definide
+	if ((*this).isPositiveDefinide() == false){
+		printf("\nMatrix::CholeskyDecomp >>> Matriz nao e positiva definida!\n");
+		return false;
+	}
+	if( &mt == this ){
+		printf("\nMatrix::CholeskyDecomp >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+	if( mat[0][0] <= 0. ){
+		printf("\nMatrix::CholeskyDecomp >>> Posicao [0,0] e' nula\n");
+		return false;
+	}
+    if( mt.Init(nrow,ncol) == false ){
+		printf("\nMatrix::CholeskyDecomp>>>no memory \n");
+		return false;
+   	}
+	mt(0,0) = (double)sqrt((double)(*this)(0,0));
+
+	//---	Calculate the first column of the TeMatrix mt
+
+	int i,j,k;
+	for( i= 0; i < nrow; i++){
+		mt(i,0) = (*this)(i,0)/mt(0,0);
+	}
+	 
+	for( i= 1; i < nrow; i++){
+		for( j= 1; j <= i; j++){
+			//int m = (j*j - j)/2 + 1;
+			double rf = 0.;
+			//int k2 = j - 1;
+			//for( k = 0;k<=k2;k++)
+			for( k = 0;k < j;k++)
+				rf += mt(i,k) * mt(j,k);
+			if( i == j ){
+				rf = (*this)(i,j) - rf;
+				if( rf < 0. ){
+					printf("\nMatrix::CholeskyDecomp:ERRO \n");
+					return false;
+				}
+				mt(i,j) = (double)sqrt((double)rf);
+			}
+			else{
+				if( mt(j,j) == 0. ){
+					printf("\nMatrix::CholeskyDecomp:ERRO \n");
+					return false;
+				}
+				mt(i,j) = ((*this)(i,j)-rf)/mt (j,j );
+			}
+		}
+	}
+	return true;
+}
+
+
+//-------------------------------------------------Inverse(SITIM)
+//
+//---	Calcula a matriz inversa pelo metodo de Gauss-Jordan.
+//
+
+int
+TeMatrix::Inverse( TeMatrix& matinv ) const
+{
+
+	if( &matinv == this ){
+		printf("\nMatrix::Inverse >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+	if ( nrow != ncol ){
+       		printf("\nMatrix::Inverse: can't invert a non-square matrix");
+       		return false;
+   	 }
+
+	if( matinv.Init( this->nrow, (double)1 ) == false ){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+//---	Calculo da inversa se a matriz tem dimensao unitaria
+
+	if(nrow == 1){
+		if(mat[0][0] == 0.0) {
+		        printf("\noperator~: can't invert singular matrix");
+			return false;
+		}
+    		matinv(0,0) = 1. / mat[0][0];
+    		return true;
+	}
+  
+//---	Formacao da matriz aumentada mataum
+
+	int	m2   = 2 * nrow ;
+	TeMatrix	mataum;
+
+	if( mataum.Init( nrow , m2 ) == false ){
+	   printf("\nInverse:no memory");
+	   return false;
+       	}
+	
+	int i1,i2,i3;
+	for(i1 = 0 ; i1 < nrow ; i1++){
+		for( i2 = 0 ; i2 < ncol ; i2++)
+        		mataum(i1,i2) = mat[i1][i2];
+
+		for( i3 = nrow ; i3 < m2 ; i3++)
+        		mataum(i1,i3) = 0.0;
+
+		mataum( i1, i1 + nrow) = 1.0;
+	}
+
+//--	Inicializa ponteiro de linhas
+
+	double	*maxlinha = NULL;
+
+	if( ( maxlinha = new double[nrow] ) == NULL ){
+		printf("\nMatrix::Inverse>>no memory");
+		return false;
+	}
+
+	double	sup,lcon1,amul,pivo;
+	int	* lp = NULL;
+
+	if( (lp = new int[nrow]) == NULL ){
+		printf("\nMatrix::Inverse>>no memory");
+		if( maxlinha != NULL){delete []maxlinha; maxlinha = NULL;} //SSL0296
+		return false;
+	}
+
+	for(i1 = 0 ; i1 < nrow ; i1++)
+		lp[i1] = i1;
+
+	int	lcon = 0;
+	int	m1 = nrow - 1;
+
+	while(lcon < nrow){
+//---		Selecao do maior valor em cada linha . seu inverso e armazenado em maxlinha.
+		for(i1 = 0 ; i1 < nrow ; i1++){
+			sup = 0.0;
+			for(i2 = 0 ; i2 < nrow ; i2++){
+				lcon1 = (double)fabs(mataum(lp[i1],i2));
+				if((lcon1 - sup ) > 0.000001 )
+				sup = lcon1;
+			}
+			if(sup == 0.0){
+				printf("\nMatrix::Inverse>>Determinant = 0.");
+				if( maxlinha != NULL){ delete []maxlinha; maxlinha = NULL; } //SSL0296
+				if( lp != NULL){ delete []lp; lp = NULL; } //SSL0296
+				return false;
+			}
+			maxlinha[lp[i1]] = 1.0 / sup;
+		 }
+
+//---		Selecao do pivo em cada linha
+
+		int lpi;
+		double	supc = fabs((double)( mataum(lp[lcon],lcon) * maxlinha[lp[lcon]] ));
+		pivo = mataum(lp[lcon],lcon);
+		lpi  = lcon;
+		for(i1 = lcon ; i1 < nrow ; i1++){
+        		amul = mataum(lp[i1],lcon) * maxlinha[lp[i1]];
+			if (fabs(amul) > supc ){
+			supc = (fabs((double)amul));
+			pivo = mataum(lp[i1],lcon);
+			lpi  = i1;
+			}
+		}
+
+		if(pivo == 0.0){
+			printf("\nMatrix::Inverse>>Determinant = 0.");
+			if( maxlinha != NULL){ delete []maxlinha; maxlinha = NULL; } //SSL0296
+			if( lp != NULL){ delete []lp; lp = NULL; } //SSL0296
+			return false;
+		}
+     
+		/* troca de linhas */
+		i1 	 = lp[lcon];
+		lp[lcon] = lp[lpi];
+		lp[lpi]  = i1;
+	
+//---		Divide a linha pelo pivo
+		for(i2 = 0 ; i2 < m2 ; i2++){
+			mataum(lp[lcon],i2) = mataum(lp[lcon],i2) / pivo ;
+		}
+
+//---		Realiza subtracoes nas linhas de forma a zerar os elementos da coluna
+//---		dada pelo indice lcon
+
+		int	il = lcon;
+
+		for(i2 = 0; i2 < m1 ; i2++){
+	        	il = il + 1;
+			if(il >= nrow ) il = 0;
+			double	aux = - mataum(lp[il],lcon);
+			for(i3 = lcon; i3 < m2 ; i3++)
+				mataum(lp[il],i3) = mataum(lp[il],i3) + aux * mataum(lp[lcon],i3);
+
+			mataum(lp[il],lcon) = 0.0;
+		}
+
+		lcon = lcon + 1;
+	}
+
+//---	Copia a parte extendida de mataum em matinv que passa a ser a matriz inversa
+	for(i1 = 0 ; i1 < nrow ; i1++){
+		for(i2 = nrow ; i2 < m2 ; i2++){
+        		i3 = i2 - nrow ;
+			matinv(i1,i3) = mataum(lp[i1],i2);
+		}
+	}
+
+	if( maxlinha != NULL){
+		delete []maxlinha; //SSL0296
+		maxlinha = NULL;
+	}
+	if( lp != NULL){
+		delete []lp; //SSL0296
+		lp = NULL;
+	}
+
+	return true;
+}
+
+//	Esse m�todo, n�o esta correto 
+//------------------------------------------Inverse
+//	NIH library
+// 1. triangulate: *this = ~P*T
+// 2. when T isUpperTriangle ~T isUpperTriangle
+// 3. split: T = T.row(0) + subT
+// 4. I = ~T*T
+// 5. ~T.at(0,0) = 1/T.at(0,0)
+// 6. sub~T = ~(subT)
+// 7. ~T.row(0) = [1/T.at(0,0)]&B
+//    where T.at(0,0)*B = [t21 ... t2n]*~subT
+// 8. ~*this = ~T*P
+
+/*int 
+TeMatrix::InverseNIH( TeMatrix& mt ) const
+{
+	TeMatrix  r;
+	TeMatrix	_subT;
+	TeMatrix	B;
+	TeMatrix	val;
+
+	if ( nrow!=ncol || nrow <= 0 || ncol <= 0 ){
+		printf("\nMatrix::Inverse >>> Matriz nao inversivel!\n");
+		return false;
+	}
+
+	if( mt.Init( this->nrow, (double)1 ) == false ){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	if ( nrow==1 ){
+		if( mat[0][0] == (double)0 ){
+			printf("\nMatrix::Inverse >>> Matriz nao inversivel!\n");
+			return false;
+		}
+		mt.mat[0][0] = 1/mat[0][0];
+		return true;
+   	}
+	TeMatrix T(*this);
+	if( T.Initialized() == false ){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+		
+	// 1. triangulate: *this = ~P*T
+	TeMatrix P;
+	if( P.Init(nrow,ncol) == false){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+	if( T.UpperTriangle( P ) == false ){
+		printf("\nMatriz::Inverse >>> ERRO!\n");
+		return false;
+	}
+	if ( T.Determinant()==0 ) {
+		printf("\nMatrix::Inverse >>> can't invert singular matrix\n");
+		return false;
+	}      
+
+	// 2. when T isUpperTriangle ~T isUpperTriangle
+	// 3. split: T = T.row(0) + subT
+
+	if( r.Init(1,ncol-1,&(T.mat[0][1])) == false){
+		printf("\nMatrix::Inverse* >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	T.CoFactor(0,0,mt);
+	mt.Inverse(_subT);
+	if( _subT.Initialized()  == false){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+
+	B = (-(1/T.mat[0][0])*r*_subT);
+	if( B.Initialized() == false ){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	if( val.Init(nrow,ncol) == false){
+		printf("\nMatrix::Inverse >>> Memoria nao disponivel\n");
+		return false;
+	}
+
+	val.mat[0][0] = 1/T.mat[0][0];
+	int i;
+	for(i=1; i<ncol; i++) val.mat[0][i]=B.mat[0][i-1];
+	val.CoFactor(0,0,_subT);
+
+ 	mt = val*P; // P is now the row-reduction transformation
+
+	return true; 
+}
+*/
+
+// os m�todos switchRows e combineRows ficarao comentados 
+// pois s� sao utilizados no calculo da matriz inversa NIH,
+// inversaNIH, que tambem foi comentado 
+/*void 
+TeMatrix::switchRows(int i,int j)
+{
+	double *tmp;
+
+	if( i < 0 || j < 0 || i >= nrow || j >= ncol ){
+		printf("\nMatrix::switchRows >>> Switching linhas invalidas\n");
+		return;
+	}
+	tmp    = mat[i];
+	mat[i] = mat[j];
+	mat[j] = tmp; 
+}
+
+void
+TeMatrix::combineRows(int i, double a, int j)
+{
+	if( i < 0 || j < 0 || i >= nrow || j >= ncol ){
+		printf("\nMatrix::combineRows >>> Combining linhas invalidas\n");
+		return;
+	}
+	int h;
+	for(h = 0; h < ncol; h++)
+	mat[i][h] += a * mat[j][h];
+}
+*/
+
+//--------Esse metodo nao esta correto e por isso ficar� comentado VRMC
+//----------------------------------------------------
+/*int 
+TeMatrix::UpperTriangle( TeMatrix& mt )
+{
+	if( &mt == this ){
+		printf("\nMatrix::UpperTriangle >>> Operacao usa duas matrizes\n");
+		return false;
+	}
+	if( mt.Init(nrow,(double)1) == false){
+		printf("\nMatrix::UpperTriangle >>> Memoria nao disponivel\n");
+		return	false;
+	}	
+
+	if ( this->isUpperTriangle() )
+		return true;
+	
+	int j;
+	for(j = 0; j < ncol; j++) {
+		int b_row = nrow-1;  // 1st non-zero entry from bottom
+		int t_row = j;       // 1st zero entry from the top
+
+		//--- switch rows until all zeros are at
+		//--- the bottom of jTH column 
+
+		while ( b_row>=t_row ) { 
+			while ( b_row > j && mat[b_row][j] == 0. )
+				--b_row;
+			if ( b_row == j )
+				break; // bottom at diagonal
+			while ( b_row >= t_row && mat[t_row][j] != 0. )
+				++t_row;
+			if ( t_row == Nrow() )
+				break; // top at last row
+			if ( t_row > b_row )
+				break;
+			switchRows(b_row,t_row); 
+			mt.switchRows(b_row,t_row);
+		}
+
+		//--- now b_row is last non-zero entry from the top
+		//--- now t_row is first zero entry from the bottom
+		//--- combine until all entries below diagonal in jTH column = 0
+
+		if ( b_row <= j )
+			continue;
+			int i;
+		for( i = j+1; i<= b_row; i++) {
+			double f = -mat[i][j] / mat[j][j];
+			combineRows(i,f,j);
+			mt.combineRows(i,f,j);
+		}
+	}
+	return true;
+}
+*/
diff --git a/src/terralib/kernel/TeMatrix.h b/src/terralib/kernel/TeMatrix.h
new file mode 100644
index 0000000..d960bd6
--- /dev/null
+++ b/src/terralib/kernel/TeMatrix.h
@@ -0,0 +1,161 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeMatrix.h
+    This file models the object matrix of type double - class TeMatrix.
+*/
+#ifndef  __TERRALIB_INTERNAL_MATRIX_H
+#define  __TERRALIB_INTERNAL_MATRIX_H
+
+//! This class represents a matrix of elements of type double
+class TeMatrix
+{
+private:
+	int nrow;	// Number of rows
+	int ncol;	// Number of columns
+	double **mat;	// TeMatrix of double elements 
+	double lixo;	// Ancillary variable
+
+	//! Allocates memory to holds a matrix of l lines by c columns
+	short Alloc( int l, int c);
+
+public:
+	//! Normal constructor
+	TeMatrix();
+
+	//! Copy constructor
+	TeMatrix(const TeMatrix& );
+
+	//! Destructor
+	~TeMatrix();
+
+	//! Clear memory for matrix.
+	void Clear();
+
+	//! Checks if the matrix is initialized.
+	int Initialized(){ return ( nrow > 0 && ncol > 0 ) ? (true) : (false); }
+
+	//!	Initializes the matrix with a vector of values
+	int Init( int nrow = 1, int ncol = 1 , double* f=0);
+
+	//!	Initializes the matrix with the same value.
+	int Init( int nrow , int ncol , double f  );
+	
+	//! Diagonal matrix with different values.
+	int Init(int k, double* f);
+
+
+	//! Diagonal matrix with the same value
+	int Init(int k, double f); 
+
+	//! Acess element in position (lin,col)
+	double& operator()( int lin, int col ){ 
+		return (lin >= 0 && lin < nrow && col >= 0 && col < ncol ) ?
+			( mat[lin][col] ) : ( lixo );
+	}
+
+	//! Assign matrix values to another one using operator =
+	TeMatrix& operator=( const TeMatrix& m ); 
+
+	//! Compares two matrix using the operator ==
+	int 	operator==(const TeMatrix& m) const;
+
+	//! Operator *=
+	void 	operator*=(double);
+
+	//! Operator unary minus 
+	TeMatrix 	operator-();
+
+	//!	Returns the number of rows.
+	int	Nrow() const { return nrow; }
+ 	
+	//!	Returns the number of columns.
+	int	Ncol()	const { return ncol; } 
+	
+	//!	Print the matrix elements .
+	void Print();
+
+	//!	Switches two rows "a" and "b".
+    void switchRows(int a ,int b);
+		
+	//! Combines two rows in according to row(i) += b*row(j)
+   void combineRows(int i,double b,int j);
+
+	//! 		Finds the transpose of a matrix.
+	int	Transpose( TeMatrix& mt ) const;
+	
+	//! 		Finds the inverse of a matrix, if any.
+	int	Inverse ( TeMatrix& mt ) const;
+
+	//!		Finds the inverse of a triangle matrix	acquired from Cholesky decomposition
+	int	CholeskyInv (TeMatrix&	mt) const;	
+
+		
+//!	Calculates the inverse of a lowertriangle matrix aquired from the Cholesky decomposition of a simetric positive definide matrix.
+	int MatTransf( TeMatrix& mt );	
+
+//!	Checks if the matrix is an uppertriangle matrix.
+   	int isUpperTriangle() const;
+	
+//!	Checks if the matrix is an lowertriangle matrix.
+    int isLowerTriangle() const;	
+
+//!	Checks if the matrix is a simetric matrix
+	int	isSimetric()	const;		
+
+//!	Checks if the matrix is positive definide
+	int	isPositiveDefinide() const;
+
+//!	Calculates the cofactor value of a matrix.
+	int	CoFactor(int irow, int jcol, TeMatrix& m) const;
+
+//!	Calculates the determinant value.
+	double	Determinant();
+
+//	Extracts a triangle matrix from a simetric positive	definide one
+	int	CholeskyDecomp( TeMatrix& mt );	
+
+//!	Calculates the EigenVectors.
+	int	EigenVectors( TeMatrix& mt );
+
+//!	Calculates the EigenValues.
+	int	EigenValues( TeMatrix& mt );
+
+//!	Calculates the EigenVectors.
+	int EigenVec( double e_vec[] );
+
+//!	Sums two matrices.
+	friend TeMatrix operator+(const TeMatrix& m1,const TeMatrix& m2);
+
+//!	Subtracts two matrices.
+	friend TeMatrix operator-(const TeMatrix&,const TeMatrix&);
+
+//!	Calculates the product of two matrices.
+	friend TeMatrix operator*(const TeMatrix&,const TeMatrix&);
+
+//!	Product of the matrix by a constant.
+	friend TeMatrix operator*(double c,const TeMatrix&);
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeMeasure.h b/src/terralib/kernel/TeMeasure.h
new file mode 100644
index 0000000..2722fd5
--- /dev/null
+++ b/src/terralib/kernel/TeMeasure.h
@@ -0,0 +1,57 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+/*! \file TeMeasure.h
+    This file Defines a class for handling a measure
+*/
+
+#ifndef  __TERRALIB_INTERNAL_MEASURE_H
+#define  __TERRALIB_INTERNAL_MEASURE_H
+
+//! A class for handling a measure
+/*!
+	Provide support and definition for a measured value for All application that 
+	require a field measure.
+	\sa TeSample, TeCountourLine
+*/
+class TeMeasure 
+{
+public:
+
+	//! Constructor
+	TeMeasure( double value ) : value_( value ) {}
+
+	//! Destructor
+	~TeMeasure() {}
+
+	//! Return the value associated to the measure
+	double value()
+	{ return value_; }
+
+protected:
+	double value_;
+};
+
+
+//typedef TeComposite <TeMeasure> TeMeasureComposite;
+
+#endif
diff --git a/src/terralib/kernel/TeMultiGeometry.cpp b/src/terralib/kernel/TeMultiGeometry.cpp
new file mode 100644
index 0000000..fcd319a
--- /dev/null
+++ b/src/terralib/kernel/TeMultiGeometry.cpp
@@ -0,0 +1,171 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeMultiGeometry.h"
+
+
+TeMultiGeometry::TeMultiGeometry(const TeMultiGeometry& other)
+{
+	polygons_.copyElements(other.polygons_);
+	lines_.copyElements(other.lines_);
+	points_.copyElements(other.points_);
+	cells_.copyElements(other.cells_);
+}
+
+TeMultiGeometry& 	
+TeMultiGeometry::operator= (const TeMultiGeometry& other)
+{
+	if ( this != &other )
+	{
+		polygons_.copyElements(other.polygons_);
+		lines_.copyElements(other.lines_);
+		points_.copyElements(other.points_);
+		cells_.copyElements(other.cells_);
+	}
+	return *this;
+}
+	
+	
+bool 
+TeMultiGeometry::getGeometry(TePolygonSet& result)
+{
+	if(!hasPolygons())
+		return false;
+	result.copyElements(polygons_);
+	return true;
+}
+
+
+bool 
+TeMultiGeometry::getGeometry(TeLineSet& result)
+{
+	if(!hasLines())
+		return false;
+	result.copyElements(lines_);
+	return true;
+}
+	
+bool 
+TeMultiGeometry::getGeometry(TePointSet& result)
+{
+	if(!hasPoints())
+		return false;
+	result.copyElements(points_);
+	return true;
+}
+	
+bool 
+TeMultiGeometry::getGeometry(TeCellSet& result)
+{
+	if(!hasCells())
+		return false;
+	result.copyElements(cells_);
+	return true;
+}
+	
+bool 
+TeMultiGeometry::getGeometry(vector<TeGeometry*>& result) 
+{
+	bool status = false;
+	if(hasPolygons())
+	{
+		for(int i=0; i< (int)polygons_.size(); ++i)
+		{
+			TePolygon* pol = new TePolygon();
+			(*pol) = polygons_[i];
+			result.push_back (pol);
+			status = true;
+		}
+	}
+	if(hasLines())
+	{
+		for(int i=0; i< (int)lines_.size(); ++i)
+		{
+			TeLine2D* lin = new TeLine2D();
+			(*lin) = lines_[i];
+			result.push_back (lin);
+			status = true;
+		}
+	}
+	if(hasPoints())
+	{
+		for(int i=0; i< (int)points_.size(); ++i)
+		{
+			TePoint* pon = new TePoint();
+			(*pon) = points_[i];
+			result.push_back (pon);
+			status = true;
+		}
+	}
+	if(hasCells())
+	{
+		for(int i=0; i< (int)cells_.size(); ++i)
+		{
+			TeCell* cell = new TeCell();
+			(*cell) = cells_[i];
+			result.push_back (cell);
+			status = true;
+		}
+	}
+	return status;
+}
+
+void 
+TeMultiGeometry::setGeometry(vector<TeGeometry*>& result)
+{
+	this->clear();
+	vector<TeGeometry*>::iterator it = result.begin();
+	
+	while(it!=result.end())
+	{
+		TeGeometry* geom = (*it);
+		
+		if(dynamic_cast<TePolygon*> (geom))
+			polygons_.add (*((TePolygon*)geom));
+		else if (dynamic_cast<TePolygonSet*> (geom))
+			polygons_ = *((TePolygonSet*) geom);
+		else if(dynamic_cast<TeLine2D*> (geom))
+			lines_.add (*((TeLine2D*)geom));
+		else if(dynamic_cast<TeLineSet*> (geom))
+			lines_ = *((TeLineSet*)geom);
+		else if(dynamic_cast<TePoint*> (geom))
+			points_.add (*((TePoint*)geom));
+		else if(dynamic_cast<TePointSet*> (geom))
+			points_ = *((TePointSet*)geom);
+		else if(dynamic_cast<TeCell*> (geom))
+			cells_.add (*((TeCell*)geom));
+		else if(dynamic_cast<TeCellSet*> (geom))
+			cells_ = *((TeCellSet*)geom);
+
+		++it;
+	}
+}
+
+void 
+TeMultiGeometry::clear()
+{
+	polygons_.clear ();
+	lines_.clear ();
+	points_.clear ();
+	cells_.clear ();
+}
diff --git a/src/terralib/kernel/TeMultiGeometry.h b/src/terralib/kernel/TeMultiGeometry.h
new file mode 100644
index 0000000..98ef0de
--- /dev/null
+++ b/src/terralib/kernel/TeMultiGeometry.h
@@ -0,0 +1,146 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeMultiGeometry.h
+    This file contains structures and definitions to deal with a multigeometry. 
+	A multigeometry can have polygons, lines, points or cells. 
+*/
+
+#ifndef  __TERRALIB_MULTIGEOMETRY_H
+#define  __TERRALIB_MULTIGEOMETRY_H
+
+#include "TeGeometry.h"
+
+
+class TeMultiGeometry
+{
+
+public:
+	TePolygonSet		polygons_;
+	TeLineSet			lines_;
+	TePointSet			points_;
+	TeCellSet			cells_;
+	
+	//! Constructor
+	TeMultiGeometry() {};
+
+	//! Copy constructor
+	TeMultiGeometry(const TeMultiGeometry& other);
+	
+	//! Assignment operator
+	TeMultiGeometry& operator= (const TeMultiGeometry& other);
+	
+	//! Get polygon geometries. Return true if the geometries exit.  
+	bool getGeometry(TePolygonSet& result); 
+	
+	//! Get line geometries. Return true if the geometries exit.  
+	bool getGeometry(TeLineSet& result);
+	
+	//! Get point geometries. Return true if the geometries exit.  
+	bool getGeometry(TePointSet& result);
+	
+	//! Get cell geometries. Return true if the geometries exit.  
+	bool getGeometry(TeCellSet& result);
+	
+	//! Get a reference to the polygon geometry container  
+	TePolygonSet&  getPolygons()
+	{	return polygons_; }
+	
+	//! Get a reference to the line geometry container  
+	TeLineSet&  getLines()
+	{	return lines_; }
+
+	//! Get a reference to the point geometry container  
+	TePointSet&  getPoints()
+	{	return points_; }
+
+	//! Get a reference to the cell geometry container  
+	TeCellSet&  getCells()
+	{	return cells_; }
+
+	//! Get all geometries. Return true if the geometries exit.  
+	bool getGeometry(vector<TeGeometry*>& result);
+
+	//! Set polygon geometries
+	void setGeometry(const TePolygonSet& result)  
+	{ polygons_ = result; }
+	
+	//! Set line geometries
+	void setGeometry(const TeLineSet& result)     
+	{ lines_ = result; }
+	
+	//! Set point geometries
+	void setGeometry(const TePointSet& result)	
+	{ points_ = result; } 
+	
+	//! Set cell geometries
+	void setGeometry(const TeCellSet& result)		
+	{ cells_ = result; }
+	
+	//! Set all geometries
+	void setGeometry(vector<TeGeometry*>& result); 
+
+	//! Add polygon geometry 
+	void addGeometry(const TePolygon& poly)  
+	{ polygons_.add(poly); polygons_.objectId(poly.objectId()); }
+	
+	//! Add line geometry
+	void addGeometry(const TeLine2D& line)     
+	{ lines_.add(line); lines_.objectId(line.objectId()); }
+	
+	//! Add point geometry
+	void addGeometry(const TePoint& point)	
+	{ points_.add(point); points_.objectId(point.objectId()); } 
+	
+	//! Add cell geometry
+	void addGeometry(const TeCell& cell)		
+	{ cells_.add(cell); cells_.objectId(cell.objectId()); }
+
+	//! Return true if this has polygons 
+	bool hasPolygons()	
+	{ return (!polygons_.empty()); } 
+	
+	//! Return true if this has lines 
+	bool hasLines()		
+	{ return (!lines_.empty()); } 
+	
+	//! Return true if this has points 
+	bool hasPoints()		
+	{ return (!points_.empty()); } 
+	
+	//! Return true if this has cells 
+	bool hasCells()		
+	{ return (!cells_.empty()); } 
+	
+	//! Return true if there are not any geometry  
+	bool empty()  
+	{ 
+		return ( polygons_.empty() &&  lines_.empty() &&
+				 points_.empty()   &&  cells_.empty() );
+	}
+
+	//! Clear geometries
+	void clear();
+};
+
+#endif 
diff --git a/src/terralib/kernel/TeNeighbours.cpp b/src/terralib/kernel/TeNeighbours.cpp
new file mode 100644
index 0000000..8ac1b49
--- /dev/null
+++ b/src/terralib/kernel/TeNeighbours.cpp
@@ -0,0 +1,221 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeNeighbours.h"
+
+TeProxMatrixAttributes::TeProxMatrixAttributes() 
+{
+	_weight = 1;					//default
+	_slice	= 1;					//default
+	_order  = 1;					//defaul
+	_centroid_distance	= -1.0;		//not computed
+	_borders_length		= -1.0;		//not computed
+	_net_objects_distance		= -1.0;   //not computed
+	_net_minimum_path= -1.0;		//not computed
+}  
+
+
+TeProxMatrixAttributes::TeProxMatrixAttributes (const TeProxMatrixAttributes& att) 
+{		
+	_weight = att._weight;
+	_slice = att._slice; 
+	_order = att._order; 
+	_centroid_distance = att._centroid_distance;
+	_borders_length = att._borders_length; 
+	_net_objects_distance = att._net_objects_distance;
+	_net_minimum_path = att._net_minimum_path;
+}
+
+
+TePropertyVector 
+TeProxMatrixAttributes::getProperties ()
+{
+	TePropertyVector vec;
+	TeProperty prop1; prop1.value_ = Te2String (_weight); vec.push_back ( prop1 );
+	TeProperty prop2; prop2.value_ = Te2String (_slice); vec.push_back ( prop2 );
+	TeProperty prop3; prop3.value_ = Te2String (_order); vec.push_back ( prop3 );
+	TeProperty prop4; prop4.value_ = Te2String (_borders_length); vec.push_back ( prop4 );
+	TeProperty prop5; prop5.value_ = Te2String (_centroid_distance); vec.push_back ( prop5 );	
+	TeProperty prop6; prop6.value_ = Te2String (_net_objects_distance); vec.push_back ( prop6 );	
+	TeProperty prop7; prop7.value_ = Te2String (_net_minimum_path); vec.push_back ( prop7 );
+	return vec; 
+}
+
+
+TeProxMatrixAttributes& 
+TeProxMatrixAttributes::operator= (const TeProxMatrixAttributes& att)
+{		
+	_weight = att._weight;
+	_slice = att._slice; 
+	_order = att._order; 
+	_centroid_distance = att._centroid_distance;
+	_borders_length = att._borders_length; 
+	_net_objects_distance = att._net_objects_distance;
+	_net_minimum_path = att._net_minimum_path;
+	return *this;
+}
+
+
+
+bool 
+TeProxMatrixAttributes::operator==(const TeProxMatrixAttributes& att) const
+{
+	return ((_weight == att._weight) && 
+		(_slice == att._slice) && 
+		(_order == att._order) && 
+		(_centroid_distance == att._centroid_distance) && 
+		(_borders_length == att._borders_length) &&  
+		(_net_objects_distance == att._net_objects_distance) && 
+		(_net_minimum_path == att._net_minimum_path));
+}
+
+
+TeNeighbours::TeNeighbours(const TeNeighboursMap& neigh)  
+{
+
+	TeNeighboursMap::const_iterator pos = neigh.begin(); 
+
+	for (pos = neigh.begin(); pos != neigh.end(); ++pos)
+		_neigh.push_back(make_pair (pos->first, pos->second));
+}
+
+
+
+TeNeighbours::TeNeighbours (const TeNeighbours& neigh)
+{
+	const_iterator it;
+	for (it = neigh._neigh.begin(); it != neigh._neigh.end(); ++it) 
+		_neigh.push_back(*it);
+}
+
+		
+string
+TeNeighbours::ObjectId (int n) 
+{
+	if (n < (int)_neigh.size()) 
+		return _neigh[n].first;
+
+	else {
+		string empty;
+		return empty;
+	}
+}
+
+
+string 
+TeNeighbours:: operator[](int n)
+{
+	if (n < (int)_neigh.size()) 
+		return _neigh[n].first;
+
+	else {
+		string empty;
+		return empty;
+	}
+}
+
+double 
+TeNeighbours:: Weight (int n)
+{
+	if (n < (int)_neigh.size()) 
+		return _neigh[n].second.Weight();
+
+	else
+		return 0.0;
+}		
+
+	
+double 
+TeNeighbours:: Weight (const string& object_id)
+{
+	for (unsigned int i = 0; i< _neigh.size(); ++i) {
+		if (object_id == _neigh[i].first) 
+			return _neigh[i].second.Weight();
+	}
+	return 0.0;
+}		
+
+	
+TeProxMatrixAttributes 
+TeNeighbours:: Attributes (int n)
+{
+	TeProxMatrixAttributes attr;
+
+	if (n < (int)_neigh.size()) 
+		return _neigh[n].second;
+	else
+		return attr;
+}
+	
+bool
+TeNeighbours:: operator== (const TeNeighbours& neigh)
+{
+	if (_neigh == neigh._neigh) return true;
+	else return false;
+}
+
+
+TeNeighbours& 
+TeNeighbours::operator= (const TeNeighbours& neigh)
+{
+	if (*this == neigh)
+	    return *this;
+
+	_neigh.clear();
+
+	const_iterator it;
+	for (it = neigh._neigh.begin(); it != neigh._neigh.end(); ++it) 
+		_neigh.push_back(*it);
+ 
+    return *this; 
+}
+
+
+bool
+TeNeighbours:: Insert (const string& object_id, const TeProxMatrixAttributes& attr)
+{
+	for (unsigned int i = 0; i< _neigh.size(); i++) {
+		if (object_id == _neigh[i].first) 
+			return false;
+	}
+	_neigh.push_back (make_pair (object_id, attr));
+	return true;
+}
+
+
+bool 
+TeNeighbours:: Remove (const string& object_id)
+{
+	iterator it = _neigh.begin();
+	while (it!= _neigh.end()) 
+		if (object_id == (*it).first)
+		{
+			_neigh.erase (it);
+			return true;
+		}
+	return false;
+}
diff --git a/src/terralib/kernel/TeNeighbours.h b/src/terralib/kernel/TeNeighbours.h
new file mode 100644
index 0000000..47f2f9c
--- /dev/null
+++ b/src/terralib/kernel/TeNeighbours.h
@@ -0,0 +1,200 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeNeighbours.h
+    This file contains structures and definitions about neighborhood 
+*/
+
+#ifndef  __TERRALIB_INTERNAL_NEGHBOURS_H
+#define  __TERRALIB_INTERNAL_NEGHBOURS_H
+
+#include "TeUtils.h"
+#include "TeAttribute.h"
+
+#include <vector> 
+#include <string>
+#include <map> 
+using namespace std;
+
+
+//! Attributes associated with each neighborhood of a proximity matrix  
+class TeProxMatrixAttributes  
+{
+	private:
+		double	_weight;
+		int		_slice;
+		int		_order;
+		double	_centroid_distance;
+		double	_borders_length;
+		double	_net_objects_distance;
+		double	_net_minimum_path;
+
+
+	public:
+		
+		//! Empty constructor 
+		TeProxMatrixAttributes(); 
+		
+		//! Copy constuctor 
+		TeProxMatrixAttributes (const TeProxMatrixAttributes& att); 
+		
+		//! Return weight
+		double	Weight() {return _weight;}
+
+		//! Return slice
+		int		Slice () {return _slice;}
+
+		//! Return order
+		int		Order() {return _order;}
+
+		//! Return border length
+		double	BorderLength() {return _borders_length;}
+
+		//! Return centroid distance
+		double	CentroidDistance() {return _centroid_distance;}
+
+		//! Return network objects distance
+		double	NetworkObjectsDistance() {return _net_objects_distance;}
+
+		//! Return network minimum path
+		double	NetworkMinimumPath () {return _net_minimum_path;}
+
+		//! Set weight
+		void Weight(double w) {_weight = w;}
+
+		//! Set slice
+		void Slice (int s) {_slice = s;}
+		
+		//! Set order
+		void Order(int o) {_order = o;}
+
+		//! Set border length
+		void BorderLength(double l) {_borders_length = l;}
+
+		//! Set centroid distance
+		void CentroidDistance(double d) {_centroid_distance = d;}
+
+		//! Set network objects distance
+		void NetworkObjectsDistance(double d) {_net_objects_distance = d;}
+
+		//! Set network minimum path
+		void NetworkMinimumPath (double d) {_net_minimum_path = d;}
+
+		//! Return the attributes as a TePropertyVector
+		TePropertyVector getProperties ();
+
+		//! Return if the border length was computed 
+		bool WasBordersLengthComputed () {if (_borders_length == -1.0) return false; else return true;}
+		
+		//! Return if the centroid distance was computed
+		bool WasCentroidDistanceComputed () {if (_centroid_distance == -1.0) return false; else return true;}
+		
+		//! Return if the network objects distance was computed
+		bool WasNetworkObjectsDistanceComputed () {if (_net_objects_distance == -1.0) return false; else return true;}
+		
+		//! Return if the network minimal path was computed
+		bool WasNetworkMinimumPathComputed () {if (_net_minimum_path == -1.0) return false; else return true;}
+
+		//! Copy operator
+		TeProxMatrixAttributes& operator= (const TeProxMatrixAttributes& att); 
+		
+		//! Comparison Operator
+		bool operator==(const TeProxMatrixAttributes& att) const;
+			
+		//! Destructor
+		virtual ~TeProxMatrixAttributes() {}
+};
+
+//! A map from a object to its attributes
+typedef map<string, TeProxMatrixAttributes> TeNeighboursMap;
+
+
+//! A class to representate the neighbours of a object 
+class TeNeighbours  
+{
+private:
+	typedef pair<string, TeProxMatrixAttributes>	neigh_values;
+	typedef vector<neigh_values>					neigh_vector;
+
+	neigh_vector _neigh; 
+	
+
+public:
+
+	typedef neigh_vector::iterator iterator;
+	typedef neigh_vector::const_iterator const_iterator;
+
+	//! Empty constructor
+	TeNeighbours () {};
+
+	//! Copy constructor
+	TeNeighbours(const TeNeighboursMap& neigh);
+
+	//! Copy constructor
+	TeNeighbours(const TeNeighbours& neigh);
+	
+	//! Return the number of the neighbours
+	int size() const  { return _neigh.size();}
+
+	//! Return a iterator to the begin of the neighbours
+    iterator begin()     { return _neigh.begin();}
+
+	//! Return a iterator to the one past end of the neighbours
+    iterator end()       { return _neigh.end();}
+
+	//! Return the n-th neighbour object_id, if n < map size.
+	string ObjectId (int n);  
+
+	//! Return the n-th neighbour object_id, if n < map size.
+	string operator[](int n);  
+
+	//! Return the n-th connection weight (corresponding to the n-th neighbour), if n < map size.
+	double Weight (int n);		
+
+	//! Return the connection weight, given the neighbour object_id 
+	double Weight (const string& object_id);	
+	
+	//! Return the complete set of connection attributes (corresponding to the ith neighbour), packed in a TeProxMatrixAttributes object.
+	TeProxMatrixAttributes Attributes (int n);
+	
+	//! Return the complete set of connection attributes, given the neighbour object_id, packed in a TeProxMatrixAttributes object.
+	TeProxMatrixAttributes Attributes (const string& object_id);
+
+	//! Insert a new neighbour
+	bool Insert (const string& object_id, const TeProxMatrixAttributes& attr);
+
+	//! Remove a neighbour
+	bool Remove (const string& object_id);
+
+	//! Copy operator
+	TeNeighbours& operator= (const TeNeighbours& neigh);
+
+	//! Comparison Operator
+	bool operator==(const TeNeighbours& p);
+
+	//! Destructor
+	virtual ~TeNeighbours() {}
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeNetwork.cpp b/src/terralib/kernel/TeNetwork.cpp
new file mode 100644
index 0000000..c03435a
--- /dev/null
+++ b/src/terralib/kernel/TeNetwork.cpp
@@ -0,0 +1,578 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeNetwork.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeSTElementSet.h"
+#include "Gra_algo.h"
+
+
+
+TeGraphNetwork:: TeGraphNetwork (TeLineSet& ls)  : graph_ (false)
+{
+	TeLineSet ls2;
+  	ls2.copyElements(ls);
+
+// The initial and final points of each line will be the nodes
+	TeLineSet::iterator it = ls2.begin();
+	while (it != ls2.end())
+	{
+			insertLine  ((*it), TeLength(*it));
+			it++;
+	}
+}
+
+
+TeGraphNetwork:: TeGraphNetwork (TeLineSet& ls, map<string, double>& line_costs)  : graph_ (false)
+{
+	if (ls.size() == line_costs.size())
+	{
+		TeLineSet::iterator it_line = ls.begin();
+		
+		while (it_line != ls.end())
+		{
+			string id = (*it_line).objectId ();
+			map<string, double>:: iterator it_val = line_costs.find(id);
+			if (it_val != line_costs.end())
+				insertLine  ((*it_line), (*it_val).second); 
+			it_line++;
+		}
+	}
+
+}
+
+
+bool
+TeGraphNetwork:: Add (TeLineSet& ls, map<string, double>& line_costs) 
+{
+	if (ls.size() == line_costs.size())
+	{
+		TeLineSet::iterator it_line = ls.begin();
+		
+		while (it_line != ls.end())
+		{
+			string id = (*it_line).objectId ();
+			map<string, double>:: iterator it_val = line_costs.find(id);
+			if (it_val != line_costs.end())
+				insertLine  ((*it_line), (*it_val).second); 
+			it_line++;
+		}
+		return true;
+	}
+	else
+		return false;
+
+}
+
+
+TeGraphNetwork:: TeGraphNetwork (TeSTElementSet& stos, string& attrName)  : graph_ (false)
+{
+	TeSTElementSet::iterator it = stos.begin();
+	while (it != stos.end())
+	{
+		string value;
+		if ((*it).getPropertyValue (attrName, value))
+		{
+			double val = atof(value.c_str());	
+			TeLineSet objGeom;  
+			if ((*it).getGeometry(objGeom))
+			{
+				double total_length = 0.0;
+				TeLineSet::iterator it_geom = objGeom.begin();
+				while (it_geom != objGeom.end())
+				{
+					total_length += TeLength (*it_geom);
+					it_geom++;
+				}
+
+				it_geom = objGeom.begin();
+				while (it_geom != objGeom.end())
+				{
+					double w = TeLength(*it_geom)/total_length;
+					insertLine  (*it_geom, val*w);
+					it_geom++;
+				}	
+			}
+		}
+		++it;
+	}
+}	
+
+
+void
+TeGraphNetwork:: insertLine (TeLine2D& line, const double& attr) 
+{
+
+	// Change line identifiers, to allow lines from different layers
+	int j = line_set_.size(); 
+	string line_objId = "l" + Te2String (j);
+	line.objectId (line_objId); 
+
+
+	// The initial and final nodes will be the first and last points of the line
+	TeNode n1; 
+	n1.add(line.first());
+	string id1 = line.objectId() + "_p1"; 
+	n1.objectId (id1);
+	n1.geomId (0);
+
+	TeNode n2; 
+	n2.add(line.last());	
+	string id2 = line.objectId() + "_p2";
+
+	n2.objectId (id2);
+	n2.geomId (0);
+
+	for (unsigned int i = 0; i < graph_.size(); i++)
+	{
+		if (TeDistance (line.first(), graph_[i].first.location()) < 0.001)
+			n1 = graph_[i].first;
+			
+		if (TeDistance (line.last(), graph_[i].first.location()) < 0.001)
+			n2 = graph_[i].first;
+	}
+
+	if (n1 == n2)
+	{
+		cout << "linha circular" << endl;
+	}
+	else
+	{
+		graph_.insert (n1, n2, attr); // if graph is non-directed, edge from n2 to n1 will also be added
+		line_cost_ [line.objectId()] = attr;
+		line_set_.add (line);
+	}
+
+}
+
+
+
+bool 
+TeGraphNetwork:: minimumPath (TeNode& n1, TeNodeSet& nodeSet,vector<double>& result)
+{
+	vector<double> dist;
+	vector<int> pred;
+
+	// Compute minimum path to all vertex
+	unsigned int j = 0;
+	br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+	while (it != graph_.end())
+	{
+	   if ((*it).first == n1)  
+		    it = graph_.end();
+	   else
+	   {
+		   it++;
+		   j++;
+	   }
+	}
+	if (j == graph_.size()) return false;
+
+	br_stl::Dijkstra<br_stl::Graph<TeNode, double>, double> (graph_, dist, pred, j);
+
+	for (unsigned int i = 0; i< nodeSet.size(); i++)
+	{
+		br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+		unsigned int vertex = 0;
+		while (it != graph_.end())
+		{
+			if ((*it).first == nodeSet[i])  
+				it = graph_.end();
+			else
+			{  
+				it++;
+				vertex++;
+			}
+		}
+
+		if (vertex == graph_.size()) return false;
+		result.push_back (dist[vertex]);
+	}
+
+
+	return true;
+
+}
+
+bool 
+TeGraphNetwork::getNode (int i, TeNode& node)
+{ 
+	if ((i >0) && (i < (int) graph_.size())) 
+	{
+		node = graph_[i].first;
+		return true;
+	}
+	else 
+		return false;
+}
+
+bool
+TeGraphNetwork:: nearestNodePoint (TeCoord2D& p1, int& index, TeCoord2D& p2, double& distance, double tol)
+{
+		TeNodeSet node_set;
+		for (unsigned int i = 0; i < graph_.size(); i++) 
+			node_set.add (graph_[i].first);
+
+		if (node_set.size() == 0) return false;
+
+		TeNearest (p1, node_set, index, tol);
+		p2 = node_set[index].elem();
+		distance = TeDistance (p1, p2);
+		return true;
+}
+
+
+
+
+
+bool
+TeGraphNetwork:: breakLineSet (TeNode& node, int line)
+{
+
+	if ((line >= 0) && (line < (int) line_set_.size()))
+	{
+		// Break line
+		int segment;
+		if (TeLocateLineSegment (node.location(), line_set_[line], segment, 0.001))
+		{
+			if (segment <= (int) (line_set_[line].size()) - 2)
+			{
+				TeLine2D l1, l2;
+				int j = 0;
+				TeLine2D::iterator it = line_set_[line].begin();
+
+				while (j <= segment)
+				{
+					l1.add (*it);
+					it++;
+					j++;
+				}
+
+				l1.add (node.location());
+				l2.add (node.location ());
+
+				while (it != line_set_[line].end())
+				{
+					l2.add (*it);
+					it++;
+				}
+		
+				string old_line_id = line_set_[line].objectId();
+				string line1_id = old_line_id + "l1";
+				string line2_id = old_line_id + "l2";
+
+				l1.objectId(line1_id);
+				l2.objectId(line2_id);
+		
+			    // Compute proportional costs for broken lines
+
+				double d1   = TeLength (l1);
+				double d2   = TeLength (l2);
+				double d_tot = TeLength (line_set_[line]);
+
+				double w1 = d1/d_tot;
+				double w2 = d2/d_tot;
+
+				double val1 = w1*line_cost_[old_line_id];
+				double val2 = w2*line_cost_[old_line_id];
+
+				// update line cost
+
+				line_cost_[line1_id] = val1;
+				line_cost_[line2_id] = val2;
+				line_cost_.erase (old_line_id);
+
+     			// update line set
+
+				line_set_.add (l1);
+				line_set_.add (l2);
+				line_set_.erase (line);
+			
+				return true;
+				}
+			else return false;
+			}
+		else return false;
+		}
+	else return false;
+}
+
+
+
+
+bool
+TeGraphNetwork:: nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol)
+{
+		if (line_set_.size() == 0) return false;
+		return TeNearest (p1, line_set_, lindex, pinter, distance, tol);
+
+		bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& i, TeCoord2D& pi, const double& tol = 0.0);
+
+}
+
+
+///////////////////////////////////// Old version - not modified
+
+TeNetwork:: TeNetwork (TeLineSet& ls)  : graph_ (false)
+{
+	line_set_ = ls;
+
+
+	// The initial and final points of each line will be the nodes
+	TeLineSet::iterator it = ls.begin();
+	int j = 0;
+	while (it != line_set_.end())
+	{
+		string line_objId = "l" + Te2String (j);
+		(*it).objectId (line_objId); //ANAP: modified to be able to use more than on layer.
+		TeLine2D line = (*it);
+
+		TeNode n1; 
+		n1.add(line.first());
+		string id1 = line.objectId() + "_p1"; 
+		n1.objectId (id1);
+		n1.geomId (0);
+
+		TeNode n2; 
+		n2.add(line.last());	
+		string id2 = line.objectId() + "_p2";
+		n2.objectId (id2);
+		n2.geomId (0);
+
+		for (unsigned int i = 0; i < graph_.size(); i++)
+		{
+			if (TeDistance (line.first(), graph_[i].first.location()) < 0.01)
+				n1 = graph_[i].first;
+			
+			if (TeDistance (line.last(), graph_[i].first.location()) < 0.01)
+				n2 = graph_[i].first;
+		}
+
+		graph_.insert (n1, n2, TeLength(line));
+
+		TeArc arc (n1, n2);
+		// This is kept for updating purposes
+		arcs_map_[line.objectId()] = arc;
+		it++;
+		j++;
+	}
+}
+
+void
+TeNetwork:: insertLine (TeLine2D& line, const double& attr) 
+{
+
+	int j = line_set_.size();
+
+	// The initial and final points of each line will be the nodes
+	string line_objId = "l" + Te2String (j);
+	line.objectId (line_objId); //ANAP: modified to be able to use more than one layer.
+
+	TeNode n1; 
+	n1.add(line.first());
+	string id1 = line.objectId() + "_p1"; 
+	n1.objectId (id1);
+	n1.geomId (0);
+
+	TeNode n2; 
+	n2.add(line.last());	
+	string id2 = line.objectId() + "_p2";
+
+	n2.objectId (id2);
+	n2.geomId (0);
+
+	for (unsigned int i = 0; i < graph_.size(); i++)
+	{
+		if (TeDistance (line.first(), graph_[i].first.location()) < 0.01)
+			n1 = graph_[i].first;
+			
+		if (TeDistance (line.last(), graph_[i].first.location()) < 0.01)
+			n2 = graph_[i].first;
+	}
+
+	graph_.insert (n1, n2, attr);
+
+	TeArc arc (n1, n2);
+	// This is kept for updating purposes
+	arcs_map_[line.objectId()] = arc;
+	line_set_.add (line);
+
+}
+
+
+bool 
+TeNetwork:: insertNode (TeNode& node, int line)
+{
+	if ((line >= 0) && (line < (int) line_set_.size()))
+	{
+		// Break line
+		int segment;
+		if (TeLocateLineSegment (node.location(), line_set_[line], segment, 0.001))
+		{
+			if (segment <= (int) (line_set_[line].size()) - 2)
+			{
+				TeLine2D l1, l2;
+				int j = 0;
+				TeLine2D::iterator it = line_set_[line].begin();
+
+				while (j <= segment)
+				{
+					l1.add (*it);
+					it++;
+					j++;
+				}
+
+				l1.add (node.location());
+				l2.add (node.location ());
+
+				while (it != line_set_[line].end())
+				{
+					l2.add (*it);
+					it++;
+				}
+
+				// get new and old lines ids
+
+				string old_line_id = line_set_[line].objectId();
+				string line1_id = old_line_id + "l1";
+				string line2_id = old_line_id + "l2";
+
+				l1.objectId(line1_id);
+				l2.objectId(line2_id);
+		
+     			// update line set
+				line_set_.add (l1);
+				line_set_.add (l2);
+				line_set_.erase (line);
+	
+				// update map_nodes 
+				TeArc arc1 (arcs_map_[old_line_id].toNode(),  node);
+				arcs_map_[line1_id] = arc1;
+
+				TeArc arc2 (arcs_map_[old_line_id].fromNode(),node);
+				arcs_map_[line2_id] = arc2;
+				arcs_map_.erase(old_line_id);
+
+
+/*			// insert new arc connection in the network
+			graph_.insert (arcs_map_ [old_line_id].fromNode(),node, l1.length()); 
+			graph_.insert (arcs_map_ [old_line_id].toNode(),  node, l2.length()); 
+		//	graph_.remove (arcs_map_[old_line_id].fromNode(), _map_nodes[old_line_id].toNode()); 
+
+			
+*/
+				return true;
+				}
+			else return false;
+			}
+		else return false;
+		}
+	else return false;
+}
+
+
+bool 
+TeNetwork::getNode (int i, TeNode& node)
+{ 
+	if ((i >0) && (i < (int) graph_.size())) 
+	{
+		node = graph_[i].first;
+		return true;
+	}
+	else 
+		return false;
+}
+
+
+bool 
+TeNetwork:: minimumPath (TeNode& n1, TeNodeSet& nodeSet,vector<double>& result)
+{
+	vector<double> dist;
+	vector<int> pred;
+
+	// Compute minimum path to all vertex
+	unsigned int j = 0;
+	br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+	while (it != graph_.end())
+	{
+	   if ((*it).first == n1)  
+		    it = graph_.end();
+	   else
+	   {
+		   it++;
+		   j++;
+	   }
+	}
+	if (j == graph_.size()) return false;
+
+	br_stl::Dijkstra<br_stl::Graph<TeNode, double>, double> (graph_, dist, pred, j);
+
+	for (unsigned int i = 0; i< nodeSet.size(); i++)
+	{
+		br_stl::Graph<TeNode, double>::iterator it = graph_.begin();
+		unsigned int vertex = 0;
+		while (it != graph_.end())
+		{
+			if ((*it).first == nodeSet[i])  
+				it = graph_.end();
+			else
+			{  
+				it++;
+				vertex++;
+			}
+		}
+
+		if (vertex == graph_.size()) return false;
+		result.push_back (dist[vertex]);
+	}
+
+
+	return true;
+
+}
+
+
+bool
+TeNetwork:: nearestNodePoint (TeCoord2D& p1, int& index, TeCoord2D& p2, double& distance, double tol)
+{
+		TeNodeSet node_set;
+		for (unsigned int i = 0; i < graph_.size(); i++) 
+			node_set.add (graph_[i].first);
+
+		if (node_set.size() == 0) return false;
+
+		TeNearest (p1, node_set, index, tol);
+		p2 = node_set[index].elem();
+		distance = TeDistance (p1, p2);
+		return true;
+}
+
+bool
+TeNetwork:: nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol)
+{
+		if (line_set_.size() == 0) return false;
+		return TeNearest (p1, line_set_, lindex, pinter, distance, tol);
+
+		bool TeNearest(TeCoord2D& pt, TeLineSet& ls , int& i, TeCoord2D& pi, const double& tol = 0.0);
+
+}
diff --git a/src/terralib/kernel/TeNetwork.h b/src/terralib/kernel/TeNetwork.h
new file mode 100644
index 0000000..df05347
--- /dev/null
+++ b/src/terralib/kernel/TeNetwork.h
@@ -0,0 +1,164 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeNetwork2.h
+    This file defines class for handling networks in Terralib
+*/
+#ifndef TeNetwork_H
+#define TeNetwork_H
+
+#include "TeGeometry.h"
+#include "graph.h"
+
+class TeSTElementSet;
+
+
+//! class for handling networks
+class TeGraphNetwork
+{
+protected:
+	//! Set of nodes and the cost of each edge
+	br_stl::Graph<TeNode, double>	graph_;
+
+	//! Set of geometric representation of edges
+	TeLineSet						line_set_;	
+	
+	//! A map to associate each edge (line object_id) to its cost 
+	map<string, double>				line_cost_;	
+
+	
+public:
+
+	//! Empty constructor
+	TeGraphNetwork() : graph_ (true) {}; // directed graph
+	
+		
+	//! Create a graph from TeLineSet; the line size is considered the cost. In this case, graph non-directed.  
+	TeGraphNetwork (TeLineSet& ls);
+	
+
+	//! Create a graph from TeLineSet; the cost is given by the map.    
+	TeGraphNetwork (TeLineSet& ls, map<string, double>& line_costs);
+	
+
+	//! Create a network from a set of line objects; the cost is given by the attrName sto property. The graph is non-directed.    
+	TeGraphNetwork (TeSTElementSet& stos, string& attrName);
+
+	
+	//! Assignment operator
+	TeGraphNetwork& operator=(TeGraphNetwork& other)
+	{
+		if(this != &other)
+		{
+			graph_ = other.graph_;
+			line_set_ = other.getLineSet();
+			line_cost_ = other.getLineCosts();
+		}
+		return (*this);
+	}
+
+	//! Add lineset to graph. Useful specially for directed graphs (lines must be entered in both directions. It has to be tested for existing graphs.
+	bool Add (TeLineSet& ls, map<string, double>& line_costs); 
+
+	//! Calculate the minimun path
+	bool minimumPath (TeNode& n1, TeNodeSet& set, vector<double>& dist);
+
+	//! Get the i-th node 
+	bool getNode (int i, TeNode& node); 
+	
+	//! Get the nearest network node of a specific point (p1)  
+	bool nearestNodePoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+	//! Get the nearest network lines point from a specific point (p1) 
+	bool nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+	//! Get line Set
+	TeLineSet getLineSet () { return line_set_;}
+
+	//! Get line costs
+	map<string, double>	getLineCosts () {return line_cost_;}
+
+	//! Insert a new line
+	void insertLine (TeLine2D& line, const double& attr);	
+
+	//! Insert a new node
+	bool breakLineSet (TeNode& node, int i); //maybe should be done externally.
+
+	//! Destructor
+	virtual ~TeGraphNetwork () {}
+
+};
+
+
+//! class for handling networks
+class TeNetwork
+{
+private:
+	//! Set of nodes and the cost of each edge
+	br_stl::Graph<TeNode, double>	graph_;
+	
+	//! Set of edges
+	TeLineSet						line_set_;	
+	
+	//! A map to associate each edge (line object_id) to its arc 
+	map<string, TeArc>				arcs_map_;	
+
+public:
+	//! Empty constructor
+	TeNetwork() : graph_ (false) { };
+
+	//! Create a graph from TeLineSet, the line size is considered the cost    
+	TeNetwork (TeLineSet& ls);  
+
+	//! Calculate the minimun path
+	bool minimumPath (TeNode& n1, TeNodeSet& set, vector<double>& dist);
+
+
+	//! Insert a new line
+	void insertLine (TeLine2D& line, const double& attr);
+
+
+	//! Insert a new node
+	bool insertNode (TeNode& node, int i);
+
+	//! Get the i-th node 
+	bool getNode (int i, TeNode& node); 
+
+	//! Get the nearest network point of a specific point (p1) 
+	bool nearestNetworkPoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+	
+	//! Get the nearest network node of a specific point (p1)  
+	bool nearestNodePoint (TeCoord2D& p1, int& lindex, TeCoord2D& pinter, double& distance, double tol = 0.0);
+
+	//! Destructor
+	virtual ~TeNetwork () {}
+
+	//! Get line Set
+	TeLineSet getLineSet () { return line_set_;}
+
+};
+
+
+
+
+#endif 
diff --git a/src/terralib/kernel/TeOverlay.cpp b/src/terralib/kernel/TeOverlay.cpp
new file mode 100644
index 0000000..3d449af
--- /dev/null
+++ b/src/terralib/kernel/TeOverlay.cpp
@@ -0,0 +1,895 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeOverlay.h"
+#include "TeIntersector.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeFragmentation.h"
+
+#include <map>
+#include <vector>
+#include <algorithm>
+
+using namespace std;
+
+
+//---------------- Auxiliary structure ----------------//
+struct xyOrder
+{
+	bool operator()(const TeCoord2D& c1, const TeCoord2D& c2) const
+	{
+		if(TeGeometryAlgorithmsPrecision::IsGreater(c2.x_, c1.x_))
+			return true;
+
+		if(TeGeometryAlgorithmsPrecision::IsGreater(c1.x_, c2.x_))
+			return false;
+
+		if(TeGeometryAlgorithmsPrecision::IsGreater(c2.y_, c1.y_))
+			return true;		
+
+		return false;
+	}
+};
+
+typedef multimap<TeCoord2D, pair<unsigned int, TeLine2D>, xyOrder> TeLineIndex;
+
+
+
+inline void TeRemoveDuplicatedSegments(TeLine2D& l)
+{
+	bool hasDuplicated = false;
+
+	for(unsigned int i = 1; i < l.size() - 1; ++i)
+		if(TeEquals(l[i - 1], l[i + 1]))
+		{
+			l.erase(i + 1);
+			hasDuplicated = true;
+		}
+
+	if(hasDuplicated)
+		TeRemoveDuplicatedCoordinates(l);
+
+	return;
+}
+
+void TeClonePolygonSet(const TePolygonSet& pSetIn, TePolygonSet& pSetOut)
+{
+	for(unsigned int i = 0; i < pSetIn.size(); ++i)
+	{
+		TePolygon p;
+		for(unsigned int j = 0; j < pSetIn[i].size(); ++j)
+		{
+			TeLine2D l;
+
+			for(unsigned int k = 0; k < pSetIn[i][j].size(); ++k)
+				l.add(pSetIn[i][j][k]);
+
+			TeRemoveDuplicatedCoordinates(l);
+
+			TeRemoveDuplicatedSegments(l);
+
+			TeLinearRing r(l);
+
+			p.add(r);		
+		}
+
+		pSetOut.add(p);
+	}
+}
+
+void TeCloneLineSet(const TeLineSet& lSetIn, TeLineSet& lSetOut)
+{
+	for(unsigned int i = 0; i < lSetIn.size(); ++i)
+	{
+		TeLine2D l;
+
+		for(unsigned int j = 0; j < lSetIn[i].size(); ++j)
+			l.add(lSetIn[i][j]);
+
+		TeRemoveDuplicatedCoordinates(l);
+
+		lSetOut.add(l);
+	}
+}
+
+
+// Verifica qual opera��o a realizar e j� coloca as fronteiras dos pol�gonos na ordem correta e caso n�o seja necess�rio opera��o, ele j� retorna o resultado
+TePolygonSet TeChooseOperation(const short& operation, TePolygonSet& redPols, TePolygonSet& bluePols, short& locationRedFragments, short& locationBlueFragments)
+{
+	TePolygonSet result;
+
+	unsigned int i = 0;
+
+	switch(operation)
+	{							
+		// Intersection gets all fragments from red polygon wich are
+		// inside the blue polygon and the blue fragments that are inside
+		// the red polygon.
+		case TeINTERSECTION:  if(TeDisjoint(redPols.box(), bluePols.box()))
+								  return result;
+
+							  // Need to reverse orientation
+							  for(i = 0; i < bluePols.size(); ++i)
+							  {
+								  if(TeOrientation(bluePols[i][0]) == TeCOUNTERCLOCKWISE)
+									  reverse(bluePols[i][0].begin(), bluePols[i][0].end());
+
+								  for(unsigned int j = 1; j < bluePols[i].size(); ++j)
+								  {
+									  if(TeOrientation(bluePols[i][j]) == TeCLOCKWISE)
+										  reverse(bluePols[i][j].begin(), bluePols[i][j].end());
+								  }
+							  }
+
+							  // Need to reverse orientation
+							  for(i = 0; i < redPols.size(); ++i)
+							  {
+								  if(TeOrientation(redPols[i][0]) == TeCOUNTERCLOCKWISE)
+									  reverse(redPols[i][0].begin(), redPols[i][0].end());
+
+								  for(unsigned int j = 1; j < redPols[i].size(); ++j)
+								  {
+									  if(TeOrientation(redPols[i][j]) == TeCLOCKWISE)
+										  reverse(redPols[i][j].begin(), redPols[i][j].end());
+								  }
+							  }
+			
+			                  locationRedFragments  = TeINSIDE;
+			                  locationBlueFragments = TeINSIDE;
+
+							  break;
+
+		// Union gets all fragments from red polygon wich are
+		// outside the blue polygon and the blue fragments that are outside
+		// the red polygon.
+		case TeUNION:         if(TeDisjoint(redPols.box(), bluePols.box()))
+							  {
+								  result = redPols;
+
+								  for(i = 0; i < bluePols.size(); ++i)
+									  result.add(bluePols[i]);
+
+								  return result;
+							  }
+
+							  // Need to reverse orientation
+							  for(i = 0; i < bluePols.size(); ++i)
+							  {
+								  if(TeOrientation(bluePols[i][0]) == TeCOUNTERCLOCKWISE)
+									  reverse(bluePols[i][0].begin(), bluePols[i][0].end());
+
+								  for(unsigned int j = 1; j < bluePols[i].size(); ++j)
+								  {
+									  if(TeOrientation(bluePols[i][j]) == TeCLOCKWISE)
+										  reverse(bluePols[i][j].begin(), bluePols[i][j].end());
+								  }
+							  }
+
+							  // Need to reverse orientation
+							  for(i = 0; i < redPols.size(); ++i)
+							  {
+								  if(TeOrientation(redPols[i][0]) == TeCOUNTERCLOCKWISE)
+									  reverse(redPols[i][0].begin(), redPols[i][0].end());
+
+								  for(unsigned int j = 1; j < redPols[i].size(); ++j)
+								  {
+									  if(TeOrientation(redPols[i][j]) == TeCLOCKWISE)
+										  reverse(redPols[i][j].begin(), redPols[i][j].end());
+								  }
+							  }
+
+							  locationRedFragments  = TeOUTSIDE;
+			                  locationBlueFragments = TeOUTSIDE;
+
+							  break;
+
+		// Difference gets all fragments from red polygon wich are
+		// outside the blue polygon and the blue fragments that are inside
+		// the red polygon.
+		case TeDIFFERENCE:	  if(TeDisjoint(redPols.box(), bluePols.box()))
+								return redPols;
+			
+						      locationRedFragments  = TeOUTSIDE;
+			                  locationBlueFragments = TeINSIDE;
+
+							  // Need to reverse orientation
+							  for(i = 0; i < bluePols.size(); ++i)
+							  {
+								  if(TeOrientation(bluePols[i][0]) == TeCLOCKWISE)
+									  reverse(bluePols[i][0].begin(), bluePols[i][0].end());
+
+								  for(unsigned int j = 1; j < bluePols[i].size(); ++j)
+								  {
+									  if(TeOrientation(bluePols[i][j]) == TeCOUNTERCLOCKWISE)
+										  reverse(bluePols[i][j].begin(), bluePols[i][j].end());
+								  }
+							  }
+
+							  // Need to reverse orientation
+							  for(i = 0; i < redPols.size(); ++i)
+							  {
+								  if(TeOrientation(redPols[i][0]) == TeCOUNTERCLOCKWISE)
+									  reverse(redPols[i][0].begin(), redPols[i][0].end());
+
+								  for(unsigned int j = 1; j < redPols[i].size(); ++j)
+								  {
+									  if(TeOrientation(redPols[i][j]) == TeCLOCKWISE)
+										  reverse(redPols[i][j].begin(), redPols[i][j].end());
+								  }
+							  }							  
+
+		                      break;
+	}
+
+	return result;
+}
+
+TeMultiGeometry TeChooseOperation(const short& operation, TeLineSet& redLines, TePolygonSet& bluePols, short& locationRedFragments)
+{
+	TeMultiGeometry result;
+
+	switch(operation)
+	{							
+		// Intersection gets all fragments from red polygon wich are
+		// inside the blue polygon and the blue fragments that are inside
+		// the red polygon.
+		case TeINTERSECTION:  if(TeDisjoint(redLines.box(), bluePols.box()))
+								  return result;
+			
+			                  locationRedFragments  = TeINSIDE;
+							  break;
+
+		// Union gets all fragments from red polygon wich are
+		// outside the blue polygon and the blue fragments that are outside
+		// the red polygon.
+		case TeUNION:         if(TeDisjoint(redLines.box(), bluePols.box()))
+							  {
+								  result.setGeometry(redLines);
+								  result.setGeometry(bluePols);
+
+								  return result;
+							  }
+
+							  locationRedFragments  = TeOUTSIDE;
+
+							  break;
+
+		// Difference gets all fragments from red polygon wich are
+		// outside the blue polygon and the blue fragments that are inside
+		// the red polygon.
+		case TeDIFFERENCE:	  if(TeDisjoint(redLines.box(), bluePols.box()))
+							  {
+								  result.setGeometry(redLines);
+								  return result;
+							  }
+			
+						      locationRedFragments  = TeOUTSIDE;
+
+		                      break;
+	}
+
+	return result;
+} 
+
+void TeRemoveOpositeBoundaryFragments(TeLineIndex& redFragmentsIndex, TeLineIndex& blueFragmentsIndex)
+{
+	TeLineIndex::iterator indexIterator = blueFragmentsIndex.begin();
+	
+	while(indexIterator != blueFragmentsIndex.end())
+	{
+		TeLineIndex::iterator idx = redFragmentsIndex.find(indexIterator->second.second[(indexIterator->second.second.size() - 1u)]);
+
+		if(idx != redFragmentsIndex.end())
+		{
+			if(TeEquals(idx->second.second[idx->second.second.size() - 1u], indexIterator->second.second[0u]))
+			{
+				redFragmentsIndex.erase(idx);
+
+				TeLineIndex::iterator idxAux;
+				idxAux = indexIterator;
+				++indexIterator;
+				blueFragmentsIndex.erase(idxAux);
+
+				continue;
+			}
+
+		}
+					
+
+		++indexIterator;
+	}
+}
+
+void TeRemoveSameBoundaryFragments(TeLineIndex& redFragmentsIndex, TeLineIndex& blueFragmentsIndex)
+{
+	TeLineIndex::iterator indexIterator = blueFragmentsIndex.begin();
+	
+	while(indexIterator != blueFragmentsIndex.end())
+	{
+		TeLineIndex::iterator idx = redFragmentsIndex.find(indexIterator->second.second[0u]);
+
+		if(idx != redFragmentsIndex.end())
+		{
+			if(TeEquals(idx->second.second[idx->second.second.size() - 1u], indexIterator->second.second[(indexIterator->second.second.size() - 1u)]))
+			{
+				redFragmentsIndex.erase(idx);
+				continue;
+			}
+
+		}					
+
+		++indexIterator;
+	}
+}
+
+void TeMergeFragments(TeLineIndex& fragmentsIndex, TeLineIndex& boundaryFragmentsIndex)
+{
+	TeLineIndex::iterator indexIterator = boundaryFragmentsIndex.begin();
+
+	while(indexIterator != boundaryFragmentsIndex.end())
+	{
+		fragmentsIndex.insert(*indexIterator);
+		++indexIterator;
+	}
+
+	boundaryFragmentsIndex.clear();	
+}
+
+void TeFindAndMoveClosedRings(TeLineIndex& fragmentsIndex, vector<TeLinearRing>& rings)
+{
+	TeLineIndex::iterator indexIterator = fragmentsIndex.begin();
+
+	while(indexIterator != fragmentsIndex.end())
+	{
+		if(indexIterator->second.second.isRing())
+		{
+			rings.push_back(indexIterator->second.second);
+
+			TeLineIndex::iterator idxAux;
+			idxAux = indexIterator;
+			++indexIterator;
+			fragmentsIndex.erase(idxAux);
+		}
+		else
+			++indexIterator;
+	}
+}
+
+// Recebe um polygonset com an�is externos e um vetor de pol�gonos que seriam buracos e
+// define em qual pol�gono colocar os buracos
+bool TeMountTopology(TePolygonSet& polysOut, vector<TeLinearRing>& holes)
+{
+	bool returnValue = true;
+
+	if((polysOut.size() == 0) && (holes.size() > 0))
+	{
+		return false;	// Formou buracos e n�o formou os an�is externos
+	}
+
+	if(polysOut.size() == 1)
+	{
+		for(unsigned int i = 0; i < holes.size(); ++i)
+			polysOut[0].add(holes[i]);		
+	}
+	else
+	{
+		for(unsigned int i = 0; i < holes.size(); ++i)
+		{
+			TeLinearRing ring = holes[i];
+
+			vector<TePolygon> candidates;
+			vector<unsigned int> candidatesPos;
+
+			unsigned int j = 0;
+
+			for(j = 0; j < polysOut.size(); ++j)
+			{
+				if(TeWithinOrCoveredByOrEquals(ring.box(), polysOut[j].box()))
+				{
+					candidates.push_back(polysOut[j]);
+					candidatesPos.push_back(j);
+				}
+			}
+
+			if(candidates.size() == 1)
+			{
+				candidates[0].add(ring);
+				continue;
+			}
+
+			vector<TePolygon> newCandidates;
+
+			for(j = 0; j < candidates.size(); ++j)
+			{
+				short rel = TeBOUNDARY;
+
+				unsigned int nthVert = ring.size();
+				unsigned int iVert = 0u;
+
+				while(iVert < nthVert)
+				{
+					rel = TeRelation(ring[iVert], candidates[j][0]);
+
+					if(rel & TeINSIDE)
+					{				
+						newCandidates.push_back(candidates[j]);
+						break;
+					}
+					else if(rel & TeOUTSIDE)
+					{
+						break;
+					}
+				
+					++iVert;
+				}
+
+				if(iVert == nthVert)	
+				{
+					// Erro topol�gico, todos os pontos est�o na fronteira do anel externo...
+					returnValue = false;
+
+					TePolygon topTest;
+					topTest.add(ring);
+
+					short whatRel = TeRelation(topTest, candidates[j]);
+
+					// Se um buraco for igual ao exterior, existe um erro topol�gico
+					// No momento, eliminamos o anel externo
+					// e o interno... 
+					// Se o buraco for coberto pelo pol�gono externo, ent�o ele ir� ficar dentro deste
+					// Caso contr�rio � erro sem possibilidades...
+					if(whatRel & TeEQUALS)
+					{						
+						polysOut.erase(candidatesPos[j]);
+						continue;
+					}
+				}				
+			}
+
+			if(newCandidates.size() <= 0)
+			{
+				// N�o encontrou o anel externo ao qual o buraco pertence
+				returnValue = false;
+				continue;
+			}
+
+			int idxMinArea = 0;
+			
+			double minArea = TeMAXFLOAT;
+
+			for(j = 0; j < newCandidates.size(); ++j)
+			{
+				if(TeGeometryArea(newCandidates[j].box()) < minArea)
+				{
+					idxMinArea = j;
+					minArea = TeGeometryArea(newCandidates[j].box());
+				}
+			}
+
+			newCandidates[idxMinArea].add(ring);
+		}
+	}
+
+	return returnValue;
+}
+
+// Set operation for rings
+bool TeOVERLAY::TeOverlay(const TePolygonSet& redPolsIn, const TePolygonSet& bluePolsIn, TePolygonSet& polsOut, const short& operation)
+{
+	polsOut.clear();
+
+	short locationRedFragments = 0;		// Wich red fragments to consider.	
+	short locationBlueFragments = 0;	// Wich blue fragments to consider.
+
+	short redMask  = TeUNKNOWNPOSITION;	
+	short blueMask = TeUNKNOWNPOSITION;	
+	short location = TeUNKNOWNPOSITION;
+
+	TePolygonSet redPols;
+	TePolygonSet bluePols;
+
+	// Copia o conte�do dos pol�gonos de entrada
+	TeClonePolygonSet(redPolsIn, redPols);
+	TeClonePolygonSet(bluePolsIn, bluePols);
+
+	// Ajeita a orienta��o das fronteiras dos pol�gonos e determina a localiza��o dos fragmentos que ser�o utilizados
+	polsOut = TeChooseOperation(operation, redPols, bluePols, locationRedFragments, locationBlueFragments);
+
+	if(polsOut.size() > 0)
+		return true;
+
+
+	// If we are here so the rings are not disjoint by box
+
+	// Gets intersection list
+	TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+	TeINTERSECTOR2::TeSafeIntersections(redPols, bluePols, report);
+
+	// So we need to create the fragments
+	TeLineIndex redFragmentsIndex;
+	TeLineIndex blueFragmentsIndex;	
+
+	TeLineIndex redBoundaryFragmentsIndex;
+	TeLineIndex blueBoundaryFragmentsIndex;	
+
+
+	TeLineSet redRings;
+	for(unsigned int i = 0; i < redPols.size(); ++i)
+		for(unsigned int j = 0; j < redPols[i].size(); ++j)
+			redRings.add(redPols[i][j]);
+
+	TeLineSet blueRings;
+	for(unsigned int k = 0; k < bluePols.size(); ++k)
+		for(unsigned int j = 0; j < bluePols[k].size(); ++j)
+			blueRings.add(bluePols[k][j]);
+
+	// Choose red fragments
+	TeLineSet redFragments;
+	TeLineSet redFragmentsBoundary;
+	TeFragmentBoundary(redRings, report, redFragmentsBoundary, redFragments);
+
+	unsigned int setSize = redFragments.size();
+
+	TeCoord2D middle;
+
+	if(redFragmentsBoundary.size())
+		redMask = TeBOUNDARY;
+
+	unsigned int w = 0;
+
+	for(w = 0; w < redFragmentsBoundary.size(); ++w)
+		redBoundaryFragmentsIndex.insert(TeLineIndex::value_type(redFragmentsBoundary[w][0], pair<short, TeLine2D>(TeBOUNDARY, redFragmentsBoundary[w])));
+
+	vector<TeLinearRing> rings;
+
+	// Do a position test for each fragment and stop if all relations have been found.
+	for(w = 0; w < setSize; ++w)
+	{	
+		if(redFragments[w].size() ==  2)	// If the fragment has two points I need to check the middle point of this fragment.
+			TeGetMiddlePoint(redFragments[w][0], redFragments[w][1], middle);
+		else	// If the fragment has more than two points so I check one point between the end points.
+			middle = redFragments[w][(unsigned int)((double(redFragments[w].size()) / 2.0 + 0.6)) - 1];
+			
+		location = TeRelation(middle, bluePols);
+
+		// If fragment is on location type or is boundary, get it.
+		if((location & locationRedFragments))
+		{
+			if(redFragments[w].isRing())
+				rings.push_back(redFragments[w]);
+			else
+				redFragmentsIndex.insert(TeLineIndex::value_type(redFragments[w][0], pair<short, TeLine2D>(w, redFragments[w])));
+		}
+
+		redMask |= location;
+	}
+
+	// Choose blue fragments
+
+	TeINTERSECTOR2::TeVectorBoundaryIP::iterator it     = report.begin();
+	TeINTERSECTOR2::TeVectorBoundaryIP::iterator it_end = report.end();
+	
+	while(it != it_end)
+	{
+		swap(it->bluePartNum_, it->redPartNum_);
+		swap(it->blueSegNum_, it->redSegNum_);
+		++it;
+	}
+
+	// Choose blue fragments
+	TeLineSet blueFragments;
+	TeLineSet blueFragmentsBoundary;
+	
+	TeFragmentBoundary(blueRings, report, blueFragmentsBoundary, blueFragments);
+
+		
+	setSize = blueFragments.size();
+
+	for(w = 0; w < blueFragmentsBoundary.size(); ++w)
+		blueBoundaryFragmentsIndex.insert(TeLineIndex::value_type(blueFragmentsBoundary[w][0], pair<short, TeLine2D>(TeBOUNDARY, blueFragmentsBoundary[w])));
+
+	if(blueFragmentsBoundary.size())
+		blueMask = TeBOUNDARY;
+
+	// Do a position test for each fragment and stop if all relations have been found.
+	for(unsigned int j = 0; j < setSize; ++j)
+	{	
+		if(blueFragments[j].size() ==  2)	// If the fragment has two points I need to check the middle point of this fragment.
+			TeGetMiddlePoint(blueFragments[j][0], blueFragments[j][1], middle);
+		else	// If the fragment has more than two points so I check one point between the end points.
+			middle = blueFragments[j][(unsigned int)((double(blueFragments[j].size()) / 2.0 + 0.6)) - 1];
+			
+		location = TeRelation(middle, redPols);
+
+		// If fragment is on location type or is boundary, get it.
+		if((location & locationBlueFragments))
+		{
+			if(blueFragments[j].isRing())
+				rings.push_back(blueFragments[j]);
+			else
+				blueFragmentsIndex.insert(TeLineIndex::value_type(blueFragments[j][0], pair<short, TeLine2D>(w, blueFragments[j])));
+		}
+		
+		blueMask |= location;		
+	}
+
+	// Remove closed rings => Only needs to test open segments
+	TeFindAndMoveClosedRings(redBoundaryFragmentsIndex, rings);
+	TeFindAndMoveClosedRings(blueBoundaryFragmentsIndex, rings);
+
+
+	// Try to eliminate oposite boundaries
+	TeRemoveOpositeBoundaryFragments(redBoundaryFragmentsIndex, blueBoundaryFragmentsIndex);
+
+	// Try to eliminate same boundary fragments
+	TeRemoveSameBoundaryFragments(redBoundaryFragmentsIndex, blueBoundaryFragmentsIndex);
+
+	// Merge all red fragments in the first fragment index
+	TeMergeFragments(redFragmentsIndex, redBoundaryFragmentsIndex);
+
+	// Merge all blue fragments in the first fragment index
+	TeMergeFragments(blueFragmentsIndex, blueBoundaryFragmentsIndex);
+
+
+	// Make polygons from fragments.
+	bool returnValue = true;
+
+	TeLine2D  lAux;	
+	TeCoord2D endLineCoordinate;
+
+	while(!(redFragmentsIndex.empty() && blueFragmentsIndex.empty()))
+	{
+		if(lAux.size() == 0)
+		{
+			TeLineIndex::iterator indexIterator  = redFragmentsIndex.begin();
+			if(indexIterator != redFragmentsIndex.end())
+			{
+				if(indexIterator->second.second.isRing())
+				{
+					rings.push_back(indexIterator->second.second);
+					redFragmentsIndex.erase(indexIterator);
+					continue;
+				}
+				
+				for(unsigned int i = 0; i < indexIterator->second.second.size(); ++i)
+					lAux.add(indexIterator->second.second[i]);
+
+				lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+
+				redFragmentsIndex.erase(indexIterator);
+			}
+			else
+			{
+				TeLineIndex::iterator indexIterator  = blueFragmentsIndex.begin();
+				if(indexIterator != blueFragmentsIndex.end())
+				{
+					if(indexIterator->second.second.isRing())
+					{
+						rings.push_back(indexIterator->second.second);
+						blueFragmentsIndex.erase(indexIterator);
+						continue;
+					}
+
+					for(unsigned int i = 0; i < indexIterator->second.second.size(); ++i)
+						lAux.add(indexIterator->second.second[i]);
+
+					//lAux.copyElements(indexIterator->second);
+					lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+					blueFragmentsIndex.erase(indexIterator);
+				}
+				else
+				{
+					returnValue = false;	//N�o poderia vir aqui, deveria ter sa�do no teste do la�o!!
+				}
+			}
+		}	
+		else
+		{
+			endLineCoordinate = lAux[lAux.size() - 1];
+
+			// Try to find the beginning of the next fragment that is part of the polygon in the same list
+			TeLineIndex::iterator indexIterator = redFragmentsIndex.find(endLineCoordinate);
+
+			if(indexIterator != redFragmentsIndex.end())
+			{
+				for(unsigned int i = 1; i < indexIterator->second.second.size(); ++i)
+					lAux.add(indexIterator->second.second[i]);
+
+				lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+				redFragmentsIndex.erase(indexIterator);
+			}			
+			else
+			{
+				indexIterator = blueFragmentsIndex.find(endLineCoordinate);
+
+				if(indexIterator != blueFragmentsIndex.end())
+				{
+					for(unsigned int i = 1; i < indexIterator->second.second.size(); ++i)
+						lAux.add(indexIterator->second.second[i]);
+
+					lAux.setBox(::TeUnion(lAux.box(), indexIterator->second.second.box()));
+					blueFragmentsIndex.erase(indexIterator);
+				}
+				else
+				{
+					if(lAux.isRing())
+					{
+						// Add ring
+						rings.push_back(TeLinearRing(lAux));						
+					}
+
+					returnValue = false;	// Erro na topologia dos pol�gonos
+
+					// Clear auxiliary.
+					TeLine2D emptyLine;
+					lAux = emptyLine;
+				}
+			}
+		}
+
+		if(lAux.isRing())
+		{  
+			// Add polygon
+			rings.push_back(TeLinearRing(lAux));
+			
+			// Clear auxiliary.
+			TeLine2D emptyLine;					
+			lAux = emptyLine;
+		}
+	}
+
+	if(lAux.size() > 0)
+		returnValue = false;	// Erro, alguma linha n�o fechou!!!
+
+	// Separate holes from islands
+	vector<TeLinearRing> holes;
+
+	//string aux = "";
+	for(unsigned int z = 0; z < rings.size(); ++z)
+	{
+		short ori = TeOrientation(rings[z]);
+
+		if(ori == TeCOUNTERCLOCKWISE)	// It is a hole
+		{
+			holes.push_back(rings[z]);			// add to holes list
+		}
+		else if(ori == TeCLOCKWISE)		// else if island
+		{										// create a polygon
+			TePolygon p;
+			p.add(rings[z]);
+			polsOut.add(p);
+		}
+		else	
+		{
+			returnValue = false;	// Objeto sem �rea? Isso � um erro!
+		}
+	}
+	
+	if((polsOut.size() == 0) && (holes.size() == 0))
+	{
+		if(operation & TeUNION)
+			return false;	// Na uni�o deve haver a forma��o de pol�gonos
+		else
+			return returnValue;	// Diferen�a e interse��o podem retornar vazio
+	}
+
+	bool mountResult = TeMountTopology(polsOut, holes);
+
+	return (returnValue && mountResult);	
+}
+
+TeMultiGeometry TeOVERLAY::TeOverlay(const TeLineSet& redLinesIn, const TePolygonSet& bluePolsIn, const short& operation)
+{
+	short location = TeUNKNOWNPOSITION;
+	short locationRedFragments = TeUNKNOWNPOSITION;
+
+	TeMultiGeometry mGeom;
+
+	TeLineSet redLines;
+	TePolygonSet bluePols;
+	TeLineSet blueLines;
+
+	// Copia o conte�do das linhas de entrada
+	TeCloneLineSet(redLinesIn, redLines);
+
+	// Copia o conte�do dos pol�gonos de entrada
+	TeClonePolygonSet(bluePolsIn, bluePols);
+
+
+	// Ajeita a orienta��o das fronteiras dos pol�gonos e determina a localiza��o dos fragmentos que ser�o utilizados
+	mGeom = TeChooseOperation(operation, redLines, bluePols, locationRedFragments);
+
+	if(!mGeom.empty())
+		return mGeom;
+
+	unsigned int i = 0u;
+
+	// Gets intersection list
+	TeINTERSECTOR2::TeVectorBoundaryIP report;
+
+	unsigned int redLinesSize = redLines.size();
+
+	// Loops through red lines
+	for(i = 0u; i < redLinesSize; ++i)
+	{
+		unsigned int bluePart = 0u;
+
+		// Loops through blue polygonset
+		unsigned int bluePolsSize = bluePols.size();
+
+		for(unsigned int j = 0u; j < bluePolsSize; ++j)
+		{
+			//Loops trough blue polygon rings
+			unsigned int bluePolNumRings = bluePols[j].size();
+
+			for(unsigned k = 0u; k < bluePolNumRings; ++k)
+			{
+				TeINTERSECTOR2::TeSafeIntersections(redLines[i], bluePols[j][k], report, i, bluePart);
+
+				++bluePart;
+			}
+		}
+
+		//++redPart;
+	}
+
+	// Fragment red Lines
+	TeLineSet redFragments;
+	TeLineSet redFragmentsBoundary;
+	TeFragmentBoundary(redLines, report, redFragmentsBoundary, redFragments);
+
+	// Choose red fragments
+	unsigned int setSize = redFragments.size();
+
+	TeCoord2D middle;
+
+	for(i = 0u; i < setSize; ++i)
+	{	
+		if(redFragments[i].size() ==  2)	// If the fragment has two points I need to check the middle point of this fragment.
+			TeGetMiddlePoint(redFragments[i][0u], redFragments[i][1u], middle);
+		else	// If the fragment has more than two points so I check one point between the end points.
+			middle = redFragments[i][(unsigned int)((double(redFragments[i].size()) / 2.0 + 0.6)) - 1];
+			
+		location = TeRelation(middle, bluePols);
+
+		// If fragment is on location type, get it.
+		if((location & locationRedFragments))
+			mGeom.addGeometry(redFragments[i]);
+	}
+
+	switch(operation)
+	{							
+		case TeINTERSECTION:  break;
+
+		case TeUNION:         mGeom.setGeometry(bluePols);
+							  break;
+
+		case TeDIFFERENCE:	  break;
+	}
+
+	return mGeom;
+
+}
+
+
diff --git a/src/terralib/kernel/TeOverlay.h b/src/terralib/kernel/TeOverlay.h
new file mode 100644
index 0000000..64cf71b
--- /dev/null
+++ b/src/terralib/kernel/TeOverlay.h
@@ -0,0 +1,78 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeOverlay.h
+    This file contains structures and definitions for set operation on objects.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz
+  */
+
+#ifndef  __TERRALIB_INTERNAL_OVERLAY_H
+#define  __TERRALIB_INTERNAL_OVERLAY_H
+
+#include "TeMultiGeometry.h"
+
+
+namespace TeOVERLAY
+{	
+
+bool TeOverlay(const TePolygonSet& redPols, const TePolygonSet& bluePols, TePolygonSet& polsOut, const short& operation);
+
+inline bool TeUnion(TePolygonSet& redPols, TePolygonSet& bluePols, TePolygonSet& polsOut)
+{
+	return TeOverlay(redPols, bluePols, polsOut, TeUNION);
+}
+
+inline bool TeIntersection(TePolygonSet& redPols, TePolygonSet& bluePols, TePolygonSet& polsOut)
+{
+	return TeOverlay(redPols, bluePols, polsOut, TeINTERSECTION);
+}
+
+inline bool TeDifference(TePolygonSet& redPols, TePolygonSet& bluePols, TePolygonSet& polsOut)
+{
+	return TeOverlay(redPols, bluePols, polsOut, TeDIFFERENCE);
+}
+
+TeMultiGeometry TeOverlay(const TeLineSet& redLines, const TePolygonSet& bluePols, const short& operation);
+
+inline TeMultiGeometry TeUnion(TeLineSet& redLines, TePolygonSet& bluePols)
+{
+	return TeOverlay(redLines, bluePols, TeUNION);
+}
+
+inline TeMultiGeometry TeIntersection(TeLineSet& redLines, TePolygonSet& bluePols)
+{
+	return TeOverlay(redLines, bluePols, TeINTERSECTION);
+}
+
+inline TeMultiGeometry TeDifference(TeLineSet& redLines, TePolygonSet& bluePols)
+{
+	return TeOverlay(redLines, bluePols, TeDIFFERENCE);
+}
+
+}	// end namespace TeOVERLAY
+
+#endif //__TERRALIB_INTERNAL_OVERLAY_H
+
diff --git a/src/terralib/kernel/TePieBar.h b/src/terralib/kernel/TePieBar.h
new file mode 100644
index 0000000..015b339
--- /dev/null
+++ b/src/terralib/kernel/TePieBar.h
@@ -0,0 +1,289 @@
+#ifndef TEPIEBAR_H
+#define TEPIEBAR_H
+
+class TePieBar
+{
+public:
+	enum			TePieBarInput {ALL, TABSEL, QUERYSEL, LEGEND, NOTTABSEL, NOTQUERYSEL, NOTLEGEND};
+	string			type_; // PIECHART or BARCHART
+	int				themeId_;
+	double			maxDiameter_;	
+	double			minDiameter_;	
+	double			diameter_;
+	string			dimensionAttr_;
+	vector<string>	attrVector_;
+	vector<TeColor> colorVector_;
+	double			maxHeight_;
+	double			minHeight_;
+	double			width_;
+	double			maxValue_;
+	double			minValue_;
+	bool			keepDimension_;
+	int				inputType_;
+	TeDatabase		*db_;
+	string			keyMove_;
+
+	TePieBar() {}
+
+	TePieBar(int themeId, TeDatabase* db)
+	{
+		themeId_ = themeId;
+		db_ = db;
+	}
+
+	TePieBar (const TePieBar& pb )
+	{
+		type_ = pb.type_;
+		themeId_ = pb.themeId_;
+		maxDiameter_ = pb.maxDiameter_;	
+		minDiameter_ = pb.minDiameter_;	
+		diameter_ = pb.diameter_;
+		dimensionAttr_ = pb.dimensionAttr_;
+		maxHeight_ = pb.maxHeight_;
+		minHeight_ = pb.minHeight_;
+		width_ = pb.width_;
+		maxValue_ = pb.maxValue_;
+		minValue_ = pb.minValue_;
+		keepDimension_ = pb.keepDimension_;
+		inputType_ = pb.inputType_;
+		db_ = pb.db_;
+		keyMove_ = pb.keyMove_;
+
+		attrVector_.clear();
+		colorVector_.clear();
+		int size = pb.attrVector_.size();
+		int i = 0;
+		while(i < size)
+		{	attrVector_.push_back(pb.attrVector_[i]);
+			colorVector_.push_back(pb.colorVector_[i]);
+			i++;
+		}
+	}
+
+	TePieBar& operator=(const TePieBar& pb)
+	{
+		type_ = pb.type_;
+		themeId_ = pb.themeId_;
+		maxDiameter_ = pb.maxDiameter_;	
+		minDiameter_ = pb.minDiameter_;	
+		diameter_ = pb.diameter_;
+		dimensionAttr_ = pb.dimensionAttr_;
+		maxHeight_ = pb.maxHeight_;
+		minHeight_ = pb.minHeight_;
+		width_ = pb.width_;
+		maxValue_ = pb.maxValue_;
+		minValue_ = pb.minValue_;
+		keepDimension_ = pb.keepDimension_;
+		inputType_ = pb.inputType_;
+		db_ = pb.db_;
+		keyMove_ = pb.keyMove_;
+
+		attrVector_.clear();
+		colorVector_.clear();
+		int size = pb.attrVector_.size();
+		int i = 0;
+		while(i < size)
+		{	attrVector_.push_back(pb.attrVector_[i]);
+			colorVector_.push_back(pb.colorVector_[i]);
+			i++;
+		}
+		return *this;
+	}
+
+	~TePieBar() {}
+
+	void init(int themeId, TeDatabase* db)
+	{
+		themeId_ = themeId;
+		db_ = db;
+	}
+
+	bool locate(TeCoord2D pt, double delta)
+	{
+		keyMove_.clear();
+		string	TS = "AuxTheme" + Te2String(themeId_);
+		string xmin = Te2String(pt.x()-delta);
+		string xmax = Te2String(pt.x()+delta);
+		string ymin = Te2String(pt.y()-delta);
+		string ymax = Te2String(pt.y()+delta);
+
+		TeDatabasePortal* portal = db_->getPortal();
+		string sel = "SELECT SELKEY FROM " + TS + " WHERE ";
+		sel += "PIEBARX > " + xmin + " AND ";
+		sel += "PIEBARX < " + xmax + " AND ";
+		sel += "PIEBARY > " + ymin + " AND ";
+		sel += "PIEBARY < " + ymax;
+		if(portal->query(sel) == false)
+		{
+			delete portal;
+			return false;
+		}
+
+		bool b = portal->fetchRow(0);
+		if(b == true)
+			keyMove_ = portal->getData(0);
+		delete portal;
+
+		if(keyMove_.empty() == false)
+			return true;
+		return false;
+	}
+
+	void move(TeCoord2D pt)
+	{
+		if(keyMove_.empty() == true)
+			return;
+
+		string	x = Te2String(pt.x());
+		string	y = Te2String(pt.y());
+		string	TS = "AuxTheme" + Te2String(themeId_);
+		string mover = "UPDATE " + TS + " SET PIEBARX = " + x + ", PIEBARY = " + y;
+		mover += " WHERE SELKEY = '" + keyMove_ + "'";
+		db_->execute(mover);
+	}
+
+	bool load()
+	{
+		TeDatabasePortal* portal = db_->getPortal();
+		string sel = "SELECT * FROM piebars WHERE themeId = " + Te2String(themeId_);
+		if(portal->query(sel))
+		{
+			bool b = portal->fetchRow(0);
+			if(b == false)
+			{
+				delete portal;
+				return false;
+			}
+			type_ = portal->getData("type");
+			maxDiameter_ = portal->getDouble("maxDiameter");
+			minDiameter_ = portal->getDouble("minDiameter");
+			diameter_ = portal->getDouble("diameter"));
+			string	attr = portal->getData("dimensionAttr");
+			dimensionAttr_ = attr;
+			maxHeight_ = portal->getDouble("maxHeight");
+			minHeight_ = portal->getDouble("minHeight");
+			width_ = portal->getDouble("width"));
+			maxValue_ = portal->getDouble("maxValue");
+			minValue_ = atof(portal->getData("minValue");
+			keepDimension_ = portal->getDouble("keepDimension");
+			inputType_ = portal->getDouble("inputType");
+			int i;
+			for(i=0; i<10; i++)
+			{
+				string attr = "attr" + Te2String(i+1);
+				string vattr = portal->getData(attr);
+				if(vattr.empty() == true)
+					break;
+				attrVector_.push_back(vattr);
+
+				string red = "red" + Te2String(i+1);
+				string green = "green" + Te2String(i+1);
+				string blue = "blue" + Te2String(i+1);
+				TeColor cor;
+				cor.red_ = atoi(portal->getData(red));
+				cor.green_ = atoi(portal->getData(green));
+				cor.blue_ = atoi(portal->getData(blue));
+				colorVector_.push_back(cor);
+			}
+			delete portal;
+			return true;
+		}
+		delete portal;
+		return false;
+	}
+	
+	void save()
+	{
+		int	i;
+		TeDatabasePortal* portal = db_->getPortal();
+		bool b = portal->query("SELECT * FROM piebars");
+		delete portal;
+		if(b == false)
+		{
+			string criar = "CREATE TABLE piebars (themeId INTEGER,";
+			criar += "type VARCHAR(16) DEFAULT NULL,";
+			criar += "maxDiameter DOUBLE DEFAULT NULL,";
+			criar += "minDiameter DOUBLE DEFAULT NULL,";
+			criar += "diameter DOUBLE DEFAULT NULL,";
+			criar += "dimensionAttr  VARCHAR(64) DEFAULT NULL,";
+			criar += "maxHeight DOUBLE DEFAULT NULL,";
+			criar += "minHeight DOUBLE DEFAULT NULL,";
+			criar += "width DOUBLE DEFAULT NULL,";
+			criar += "maxValue DOUBLE DEFAULT NULL,";
+			criar += "minValue DOUBLE DEFAULT NULL,";
+			criar += "keepDimension INTEGER DEFAULT 0,";
+			criar += "inputType INTEGER DEFAULT 0,";
+			for (i=0; i<10; i++)
+			{
+				criar += "attr" + Te2String(i+1) + " VARCHAR(64) DEFAULT NULL,";
+				criar += "red" + Te2String(i+1) + " INTEGER DEFAULT NULL,";
+				criar += "green" + Te2String(i+1) + " INTEGER DEFAULT NULL,";
+				criar += "blue" + Te2String(i+1) + " INTEGER DEFAULT NULL,";
+			}
+			criar.erase(criar.size()-1, 1);
+			criar += ")";
+			db_->execute(criar);
+		}
+
+		string del = "DELETE FROM piebars WHERE themeId = " + Te2String(themeId_);
+		db_->execute(del);
+
+		if(attrVector_.size() == 0)
+			return;
+		string up = "INSERT INTO piebars (themeId, type, maxDiameter, ";
+		up += "minDiameter, diameter, dimensionAttr, maxHeight, minHeight, ";
+		up += "width, maxValue, minValue, keepDimension, inputType, ";
+		for (i=0; i<attrVector_.size() && i<10; i++)
+		{
+			up += "attr" + Te2String(i+1) + ", ";
+			up += "red" + Te2String(i+1) + ", ";
+			up += "green" + Te2String(i+1) + ", ";
+			up += "blue" + Te2String(i+1) + ", ";
+		}
+		up.erase(up.size()-2, 2);
+		up += ")";
+
+		up += " VALUES (" + Te2String(themeId_) + ", ";
+		up += "'" + type_ + "', ";
+		up += Te2String(maxDiameter_) + ", ";
+		up += Te2String(minDiameter_) + ", ";
+		up += Te2String(diameter_) + ", ";
+		up += "'" + dimensionAttr_ + "', ";
+		up += Te2String(maxHeight_) + ", ";
+		up += Te2String(minHeight_) + ", ";
+		up += Te2String(width_) + ", ";
+		up += Te2String(maxValue_) + ", ";
+		up += Te2String(minValue_) + ", ";
+		up += Te2String(keepDimension_) + ", ";
+		up += Te2String(inputType_) + ", ";
+		for (i=0; i<attrVector_.size() && i<10; i++)
+		{
+			up += "'" + attrVector_[i] + "', ";
+			up += Te2String(colorVector_[i].red_) + ", ";
+			up += Te2String(colorVector_[i].green_) + ", ";
+			up += Te2String(colorVector_[i].blue_) + ", ";
+		}
+		up.erase(up.size()-2, 2);
+		up += ")";
+		db_->execute(up);
+	}
+	
+	void remove()
+	{
+		TeDatabasePortal* portal = db_->getPortal();
+		bool b = portal->query("SELECT * FROM piebars");
+		delete portal;
+		if(b == false)
+			return;
+
+		string del = "DELETE FROM piebars WHERE themeId = " + Te2String(themeId_);
+		db_->execute(del);
+	}
+};
+
+#endif
+
+
+
+
+
diff --git a/src/terralib/kernel/TePrecision.h b/src/terralib/kernel/TePrecision.h
new file mode 100644
index 0000000..ec4ae4d
--- /dev/null
+++ b/src/terralib/kernel/TePrecision.h
@@ -0,0 +1,57 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_PRECISION_H
+#define  __TERRALIB_INTERNAL_PRECISION_H
+
+#include "TeSingleton.h"
+#include "TeDefines.h"
+
+//! Describes a class for supporting, scale and represetation dependet, approximation calculations
+//! \sa TeSingleton
+class TePrecision: public TeSingleton<TePrecision>
+{
+public:
+
+		~TePrecision() {}
+
+		friend class TeSingleton<TePrecision>;
+
+//! Sets the precision value to be considered
+		void setPrecision ( double precision )
+		{ precision_ = precision; }
+
+//! Returns the precision value in use
+		double	precision ()
+		{ return precision_; }
+
+protected:
+		
+	TePrecision(): precision_ ( TeMINFLOAT )
+	{}
+
+	double precision_;
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeProgress.cpp b/src/terralib/kernel/TeProgress.cpp
new file mode 100644
index 0000000..f14dbc6
--- /dev/null
+++ b/src/terralib/kernel/TeProgress.cpp
@@ -0,0 +1,31 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeProgress.h"
+
+TeProgressBase* TeProgress::instance_ = 0;
+
+void TeProgress::setProgressInterf( TeProgressBase* interf )
+{
+	instance_ = interf;
+}
diff --git a/src/terralib/kernel/TeProgress.h b/src/terralib/kernel/TeProgress.h
new file mode 100644
index 0000000..9e15aae
--- /dev/null
+++ b/src/terralib/kernel/TeProgress.h
@@ -0,0 +1,66 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_PROGRESS_H
+#define  __TERRALIB_INTERNAL_PROGRESS_H
+
+#include "TeProgressBase.h"
+
+//! Provides the suport to implement an instance of a progress bar interface
+/*
+	This class is based on a Singleton Design Pattern (See "Design Patterns" book, page 127).
+	Applications should set the Progress Interface that will be used by the TerraLib routines
+	able to indicate progress in executing a task.
+
+*/
+class TeProgress {
+
+public:
+
+	//! Returns the unique instance of a progress interface
+	static TeProgressBase* instance()
+	{ 
+		return	instance_;
+	}
+	
+	//! Sets the unique instance of a progress interface
+	static void setProgressInterf( TeProgressBase* interf );
+
+	virtual ~TeProgress() {}  
+
+protected:
+
+//! Empty
+	TeProgress() {}
+
+private:
+	//! The unique instance of a progress interface
+	static TeProgressBase* instance_;
+
+// No copy allowed
+	TeProgress(const TeProgress&);
+	TeProgress& operator=(const TeProgress&){return *this;}
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeProgressBase.h b/src/terralib/kernel/TeProgressBase.h
new file mode 100644
index 0000000..2240328
--- /dev/null
+++ b/src/terralib/kernel/TeProgressBase.h
@@ -0,0 +1,73 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_PROGRESSBASE_H
+#define  __TERRALIB_INTERNAL_PROGRESSBASE_H
+
+#include <string>
+using std::string;
+
+//! A generic Progress Interface.
+/*
+	It defines the methods that should be implemented by concrete classes.
+	Assumes that a progress interface has a Caption to indicate the task
+	being monitored and a Message to be displayed along with the progress 
+	indication. A progress interface also know the total number of steps 
+	required to finish the task being monitored.
+*/
+class TeProgressBase
+{
+public:
+
+	//! Constructor
+	TeProgressBase(){}
+
+	//! Destructor
+	virtual ~TeProgressBase() {}
+
+	//! Sets the total number of steps to n 
+	virtual void setTotalSteps(int n) =0;
+
+	//! Sets the current amount of progress made to n
+	virtual void setProgress(int n) = 0;
+
+	//! Resets the progress interface
+	virtual void reset() = 0;
+
+	//! Resets the progress dialog
+	virtual void cancel() = 0;
+
+	//! Sets the label's text
+	virtual void setMessage(const string& text) = 0;
+
+	//!Returns the label's text
+	virtual string getMessage() { return ""; }
+
+	//! Returns true whether the process was cancelled
+	virtual bool wasCancelled() = 0;
+	
+	//! Sets the caption associated to the progress interface
+	virtual void setCaption(const string& cap) = 0;
+
+};
+#endif
diff --git a/src/terralib/kernel/TeProjection.cpp b/src/terralib/kernel/TeProjection.cpp
new file mode 100644
index 0000000..6e54792
--- /dev/null
+++ b/src/terralib/kernel/TeProjection.cpp
@@ -0,0 +1,1708 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeProjection.h"
+#include "TeException.h"
+#include "TeUtils.h"
+#include <stdio.h>
+
+//=========================================================
+//
+//  PROJECTION INFORMATION 
+//
+//  Auxiliary functions which indicate the information
+//  associated to a projection
+//
+//  Used for reading and writing information
+//
+//==========================================================
+
+
+// Name						Units  Long  Lat  Par1  Par2  Sca  Eas  Nor 
+char* teProjInfo[]= {
+"Albers",					"1",  "1",  "1", "1",  "1",  "0", "1", "1", 
+"LatLong",					"1",  "0",  "0", "0",  "0",  "0", "0", "0",   
+"LambertConformal",			"1",  "1",  "1", "1",  "1",  "0", "1", "1", 
+"Mercator",					"1",  "1",  "1", "1",  "0",  "0", "1", "1", 
+"Miller",					"1",  "1",  "0", "0",  "0",  "0", "1", "1", 
+"UTM",						"1",  "1",  "0", "0",  "0",  "1", "1", "1", 
+"Polyconic",				"1",  "1",  "1", "0",  "0",  "0", "1", "1",
+"Sinusoidal",				"1",  "1",  "0", "0",  "0",  "0", "1", "1",
+"CylindricalEquidistant",	"1",  "1",  "0", "1",  "0",  "0", "1", "1",
+"PolarStereographic",		"1",  "1",  "0", "0",  "0",  "0", "1", "1",
+"NoProjection",				"1",  "0",  "0", "0",  "0",  "0", "0", "0"		
+};
+
+TeProjInfo
+TeProjectionInfo ( const string& projName  )
+{
+
+	TeProjInfoMap pjMap;
+	TeProjInfo pjInfo;
+
+	int k = 0;
+
+	for ( int i = 0; i < NUM_PROJ; i++ )
+	{
+		string name = teProjInfo [k++];
+			
+	    pjInfo.hasUnits  = atoi ( teProjInfo [k++] );
+	    pjInfo.hasLon0   = atoi ( teProjInfo [k++] );
+	    pjInfo.hasLat0   = atoi ( teProjInfo [k++] );
+	    pjInfo.hasStlat1 = atoi ( teProjInfo [k++] );
+		pjInfo.hasStlat2 = atoi ( teProjInfo [k++] );
+		pjInfo.hasScale  = atoi ( teProjInfo [k++] );
+		pjInfo.hasOffx   = atoi ( teProjInfo [k++] );
+	    pjInfo.hasOffy   = atoi ( teProjInfo [k++] );
+
+		pjMap [ name ] = pjInfo;
+	}
+
+
+	TeProjInfoMap::iterator it = pjMap.find ( projName );
+
+	if ( it == pjMap.end() )
+		throw TeException ( PROJECTION_NOT_AVAILABLE );
+
+return (*it).second;
+}
+
+//========================================================
+//
+// PROJECTION FACTORY
+//
+// =======================================================
+
+TeProjection*
+TeProjectionFactory::make ( const TeProjectionParams& par )
+{
+	string punits;
+	if (par.units.empty())
+		punits = "Meters";
+	else
+		punits = par.units;
+
+	if ( par.name == "UTM" )
+		return new TeUtm ( par.datum, par.lon0, par.lat0,
+		par.offx, par.offy, punits, par.scale, par.hemisphere );
+
+	if ( par.name == "LambertConformal")
+		return new TeLambertConformal ( par.datum, par.lon0, par.lat0,
+		par.offx, par.offy, par.stlat1, par.stlat2, punits );
+	
+	if ( par.name == "Albers" )
+		return new TeAlbers ( par.datum, par.lon0, par.lat0,
+		par.offx, par.offy, par.stlat1, par.stlat2, punits );
+
+	if ( par.name == "Miller")
+		return new TeMiller ( par.datum, par.lon0, par.offx, par.offy, punits );
+
+	if ( par.name == "LatLong" )
+	{
+		if (par.units.empty())
+			punits = "DecimalDegrees";
+		else
+			punits = par.units;
+		return new TeLatLong ( par.datum, par.units );
+	}
+
+	if ( par.name == "Polyconic" )
+		return new TePolyconic ( par.datum, par.lon0, par.lat0, par.offx, par.offy, punits); 
+
+	if ( par.name == "Mercator" )
+		return new TeMercator ( par.datum, par.lon0, par.lat0, 
+		par.offx, par.offy, par.stlat1, punits );
+
+	if ( par.name == "Sinusoidal")
+		return new TeSinusoidal ( par.datum, par.lon0, par.offx, par.offy, punits );
+
+	if ( par.name == "CylindricalEquidistant")
+		return new TeCylindricalEquidistant ( par.datum, par.lon0, par.offx, par.offy, par.stlat1, punits);
+
+	if ( par.name == "PolarStereographic")
+		return new TePolarStereographic ( par.datum, par.lon0, par.offx, par.offy,punits, par.hemisphere );
+
+	if ( par.name == "NoProjection")
+		return new TeNoProjection (punits);
+
+return 0;
+}
+
+TeProjectionParams 
+TeProjection::params ()
+{
+	TeProjectionParams par;
+	
+	par.name  = GPname;
+	par.datum = GPdatum;
+	par.lon0  = GPlon0;
+	par.lat0  = GPlat0;
+	par.offx  = GPoffx;
+	par.offy  = GPoffy;
+	par.stlat1 = GPstlat1;
+	par.stlat2 = GPstlat2;
+	par.units  = GPunits;
+	par.scale  = GPscale;
+	par.hemisphere =  GPhemisphere;
+
+return par;
+}
+
+
+TeProjection::TeProjection(const TeProjection& rhs)
+{
+	GPname  = rhs.GPname;
+	GPdatum = rhs.GPdatum;
+	GPlon0  = rhs.GPlon0;
+	GPlat0  = rhs.GPlat0;
+	GPoffx  = rhs.GPoffx;
+	GPoffy  = rhs.GPoffy;
+	GPstlat1 = rhs.GPstlat1;
+	GPstlat2 = rhs.GPstlat2;
+	GPunits  = rhs.GPunits;
+	GPscale  = rhs.GPscale;
+	GPhemisphere = rhs.GPhemisphere;
+}
+
+TeProjection& 
+TeProjection::operator=(const TeProjection& rhs)
+{
+	if ( this != &rhs )
+	{
+		GPname  = rhs.GPname;
+		GPdatum = rhs.GPdatum;
+		GPlon0  = rhs.GPlon0;
+		GPlat0  = rhs.GPlat0;
+		GPoffx  = rhs.GPoffx;
+		GPoffy  = rhs.GPoffy;
+		GPstlat1 = rhs.GPstlat1;
+		GPstlat2 = rhs.GPstlat2;
+		GPunits  = rhs.GPunits;
+		GPscale  = rhs.GPscale;
+		GPhemisphere = rhs.GPhemisphere;
+	}
+	return *this;
+}
+
+
+
+/*******************************************************************
+	CHECKS IF A PROJECTION INSTANCE IS EQUAL TO ANOTHER
+********************************************************************/
+
+bool
+TeProjection::operator== (const TeProjection& proj)
+{
+	if (!(GPdatum==proj.GPdatum))
+		return false;
+	if (GPlon0!=proj.GPlon0)
+		return false;
+	if (GPlat0!=proj.GPlat0)
+		return false;
+	if (GPoffx!=proj.GPoffx)
+		return false;
+	if (GPoffy!=proj.GPoffy)
+		return false;
+	if (GPstlat1!=proj.GPstlat1)
+		return false;
+	if (GPstlat2!=proj.GPstlat2)
+		return false;
+	if (GPhemisphere!=proj.GPhemisphere)
+		return false;
+
+	return true;
+}
+
+/*******************************************************************
+	PRINTS INFORMATION ABOUT A PROJECTION
+********************************************************************/
+
+
+void
+TeProjection::print ( FILE* file_ )
+{
+	TeProjInfo pjInfo = TeProjectionInfo ( GPname );
+
+	fprintf(file_,"%s\n", "// Projection Information" );
+	fprintf ( file_, "%s %s \n", "PROJECTION", GPname.c_str() );
+	fprintf ( file_, "%s %s \n", "DATUM", GPdatum.name().c_str() );
+	fprintf ( file_, "%s %s \n", "UNITS", GPunits.c_str() );
+	
+	if ( pjInfo.hasLon0 )
+		fprintf ( file_, "%s %17.6f \n", "ORIGIN LONG", GPlon0 );
+
+	if ( pjInfo.hasLat0 )
+		fprintf ( file_, "%s %17.6f \n", "ORIGIN LAT", GPlat0 );
+
+	if ( pjInfo.hasOffx )
+		fprintf ( file_, "%s %17.6f \n", "FALSE EASTING", GPoffx );
+
+	if ( pjInfo.hasOffy )
+		fprintf ( file_, "%s %17.6f \n", "FALSE NORTHING", GPoffy );
+	
+	if ( pjInfo.hasStlat1 )
+		fprintf ( file_, "%s %17.6f \n", "FIRST STANDARD PARALEL", GPstlat1 );
+	
+	if ( pjInfo.hasStlat2 )
+		fprintf ( file_, "%s %17.6f \n", "SECOND STANDARD PARALEL", GPstlat2 );
+
+	if ( pjInfo.hasScale )
+		fprintf ( file_, "%s %17.6f \n", "SCALE", GPscale );
+
+	fprintf(file_,"%s\n", "// End of Projection Information" );
+}
+
+
+string
+TeProjection::describe ()
+{
+	string desc;
+	if (GPname == "NoProjection")
+	{
+		desc = "NoProjection";
+		return desc;
+	}
+
+	TeProjInfo pjInfo = TeProjectionInfo ( GPname );
+
+	desc =  GPunits;
+	if ( pjInfo.hasLon0 )
+		desc += "," + Te2String(GPlon0*TeCRD,6);
+
+	if ( pjInfo.hasLat0 )
+		desc += "," + Te2String(GPlat0*TeCRD,6);
+
+	if ( pjInfo.hasStlat1 )
+		desc += ", " + Te2String(GPstlat1*TeCRD,6);
+	
+	if ( pjInfo.hasStlat2 )
+		desc += "," + Te2String(GPstlat2*TeCRD,6);
+
+	if ( pjInfo.hasOffx )
+		desc += "," + Te2String(GPoffx,6);
+
+	if ( pjInfo.hasOffy )
+		desc += "," + Te2String(GPoffy,6);
+	
+	if ( pjInfo.hasScale )
+		desc += "," + Te2String(GPscale,6);
+
+	return desc;
+}
+
+
+bool decodifyDescription(const string& projDescription, TeProjectionParams& pars)
+{
+	vector<string> projDesc;
+	if (TeSplitString(projDescription, ",", projDesc) <= 0)
+		return false;
+	unsigned int npar = projDesc.size();
+	TeProjInfo pjInfo = TeProjectionInfo (projDesc[0]);
+	pars.name = projDesc[0];
+	if (npar > 1)
+		pars.units = projDesc[1];
+	else 
+		return true;
+
+	unsigned int nextp = 2;
+	if (pjInfo.hasLon0)
+	{
+		 if (nextp < npar)
+		 {
+			pars.lon0 = atof(projDesc[nextp].c_str()) * TeCDR;
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+
+	if (pjInfo.hasLat0)
+	{
+		 if (nextp < npar)
+		 {
+			pars.lat0 = atof(projDesc[nextp].c_str()) * TeCDR;
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+
+	if (pjInfo.hasStlat1)
+	{
+		 if (nextp < npar)
+		 {
+			pars.stlat1 = atof(projDesc[nextp].c_str()) * TeCDR;
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+
+	if (pjInfo.hasStlat2)
+	{
+		 if (nextp < npar)
+		 {
+			pars.stlat2 = atof(projDesc[nextp].c_str()) * TeCDR;
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+
+	if (pjInfo.hasOffx)
+	{
+		 if (nextp < npar)
+		 {
+			pars.offx = atof(projDesc[nextp].c_str());
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+
+	if (pjInfo.hasOffy)
+	{
+		 if (nextp < npar)
+		 {
+			pars.offy = atof(projDesc[nextp].c_str());
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+	
+	if (pjInfo.hasScale)
+	{
+		 if (nextp < npar)
+		 {
+			pars.scale = atof(projDesc[nextp].c_str());
+			nextp++;
+		 }
+		 else
+			 return false;
+	}
+	return true;
+}
+
+/********************************************************************
+		Planimetric datum transformation 
+********************************************************************/
+void
+TeProjection :: ChangeLL (double &lon1, double &lat1)		
+{
+	double 	equad1,	// Squared eccentricity - datum 1
+			equad2,	// Squared eccentricity - datum 2
+			n1,		// Great normal of ellipsoid - datum 1
+			n2,		// Great normal od ellipsoid - datum 2
+			x1,		// Geocentric cartesian coordinates - datum 1 
+			y1,
+			z1,
+			x2,		// Geocentric cartesian coordinates - datum 2
+			y2,
+			z2,
+			d,lat2,		// Ancillary variable
+			lon2;
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+ 	if( GPdestination->GPdatum.radius() == 0.) return;
+
+	int	flt1 = (int)(Pflt*1000000000.);
+	int	flt2 = (int)(GPdestination->GPdatum.flattening()*1000000000.);
+	if (Prd == GPdestination->GPdatum.radius() && flt1==flt2)
+		return;
+
+// Geocentric cartesian coordinates calculation - datum 1
+	equad1 = 2.*Pflt;
+	equad1 -= Pflt*Pflt;
+	double a1,a2,a3;
+	a1 = sin(lat1);
+	a1 *= a1;
+	a1 *= equad1;
+	a2 = 1-a1;
+	n1 = Prd/sqrt(a2);
+	x1 = n1*cos(lat1)*cos(lon1);
+	y1 = n1*cos(lat1)*sin(lon1);
+	z1 = (n1*(1-equad1))*sin(lat1);
+
+// Geocentric cartesian coordinates calculation - datum 2
+	if (GPdatum.xShift() == TeMAXFLOAT || GPdestination->GPdatum.xShift() == TeMAXFLOAT)
+	{
+		x2 = x1; 
+		y2 = y1;
+		z2 = z1;
+	}
+	else
+	{	
+		x2 = x1 + (GPdatum.xShift() - GPdestination->GPdatum.xShift());
+		y2 = y1 + (GPdatum.yShift() - GPdestination->GPdatum.yShift());
+		z2 = z1 + (GPdatum.zShift() - GPdestination->GPdatum.zShift());
+	}
+
+// Geodetic coordinates calculation - datum 2
+	equad2 = 2.*GPdestination->GPdatum.flattening();
+	equad2 -= (GPdestination->GPdatum.flattening())*(GPdestination->GPdatum.flattening());
+	lat2 = lat1;
+	do
+	{
+		a1 = sin(lat2);
+		a1 *= a1;
+		a1 *= equad2;
+		a2 = 1-a1;
+		n2 = GPdestination->GPdatum.radius()/sqrt(a2);
+		a1 = equad2*sin(lat2);
+		a1 *= n2;
+		a1 += z2;
+		a2 = x2*x2;
+		a2 += (y2*y2);
+		a3 = sqrt(a2);
+		lat2 = atan2(a1,a3);
+		a1 = sin(lat2);
+		a1 *= a1;
+		a1 *= equad2;
+		a2 = 1-a1;
+		a3 = sqrt(a2);
+		d = (GPdestination->GPdatum.radius()/a3)-n2;
+	}
+	while (fabs(d) > 0.0000001);
+	lon2 = atan2(y2,x2);
+	lat1 = lat2;
+	lon1 = lon2;
+}
+
+/********************************************************************
+		GEODETIC TO UTM COORDINATES
+********************************************************************/
+
+
+TeCoord2D
+TeUtm :: LL2PC (TeCoord2D& ptll)
+{
+
+	double	k0,		// Scale factor
+		equad,		// Squared eccentricity
+		n,		// Great normal of ellipsoid
+		elinquad,	// ancillary variables 
+		aux1,aux2,aux3,aux4,aux5,aux6,aux7,aux8,aux9,
+		aux10,aux11,aux12,aux13,t,c,ag,m,ptllx,ptlly;
+
+	double Pflt = GPdatum.flattening();
+	ptllx = ptll.x();
+	ptlly = ptll.y();
+	k0 = 1. - (1./2500.);
+	equad = 2.*Pflt;	
+	equad -= Pflt*Pflt;
+	elinquad = equad/(1. - equad);
+	aux1 = equad*equad;
+	aux2 = aux1*equad;
+	aux3 = sin((double)2*ptlly);
+	aux4 = sin((double)4*ptlly);
+	aux5 = sin((double)6*ptlly);
+
+	double a1, a2, a3;
+	a1 = equad/4.;
+	a2 = 3.*aux1/64.;
+	a3 = 5.*aux2/256.;
+	aux6 = (1-a1-a2-a3)*ptlly;
+
+	a1 = 3.*equad/8.;
+	a2 = 3.*aux1/32.;
+	a3 = 45.*aux2/1024.;
+	aux7 = (a1+a2+a3)*aux3;
+
+	a1 = 15.*aux1/256.;
+	a2 = 45.*aux2/1024.;
+	aux8 = (a1+a2)*aux4;
+
+	aux9 = 35.*aux2;
+	aux9 /= 3072.;
+	aux9 *= aux5;
+
+	a1 = sin(ptlly);	
+	a1 *= a1;		
+	a1 *= equad;		
+	n = GPdatum.radius()/sqrt((double)1-a1);
+
+
+	t = tan(ptlly);		
+	t *= t;			
+
+	c = cos(ptlly);		
+	c *= c;			
+	c *= elinquad;		
+	ag = (ptllx-GPlon0)*cos(ptlly);
+	m = GPdatum.radius()*(aux6 - aux7 + aux8 - aux9);
+
+
+	a1 = ag*ag*ag;
+	aux10 = (1.-t+c)*a1/6.;
+
+	a1 = 5.-(18.*t);
+	a2 = a1+t*t;
+	a1 = a2+72.*c;
+	a2 = a1-(58.*elinquad);
+	a1 = ag*ag*ag;		
+	a1 *= ag;		
+	a1 *= ag;		
+	aux11 = a2*a1/120.;	
+
+	a1 = 5.-t+9.*c;
+	a2 = 4.*c*c;
+	a3 = ag*ag;
+	a3 *= ag;
+	a3 *= ag;
+	aux12 = (a1+a2)*a3/24.;
+
+	a1 = 61.-(58.*t) ;
+	a2 = a1+(t*t);
+	a1 = a2+(600.*c);
+	a2 = a1-(330.*elinquad);
+	a1 = ag*ag*ag;		
+	a1 *= ag;		
+	a1 *= ag;		
+	a1 *= ag;		
+	aux13 = a2*a1/720.;	
+
+	ptllx = k0*n*(ag + aux10 + aux11);
+
+	a1 = ag*ag/2;
+	a2 = a1+aux12+aux13;
+	a3 = n*tan(ptlly);
+	a1 = a2*a3;
+	ptlly = k0*(m+a1);
+
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/********************************************************************
+		UTM TO GEODETIC COORDINATES
+********************************************************************/
+
+TeCoord2D
+TeUtm :: PC2LL (TeCoord2D& ptpc)
+{
+	double  k0,             	// Scale factor
+		equad,			// Squared eccentricity
+		n1,			// Great normal of ellipsoid
+		elinquad,		// Ancillary variables
+		e1,aux1,aux2,aux3,aux4,aux5,m,mi,aux6,aux7,aux8,lat1,
+		c1,t1, quoc,r1,d,aux9,aux10,aux11,aux12,ptpcx,ptpcy;
+
+	double Prd  = GPdatum.radius();
+	double Pflt = GPdatum.flattening();
+	
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;		
+
+	k0 = 1. - (1./2500.);
+	equad = 2.*Pflt;		
+	equad -= Pflt*Pflt;		
+	elinquad = equad/(1. - equad);
+
+	double a1,a2,a3;
+	a1 = sqrt((double)1-equad);
+	e1 = (1.-a1)/(1.+a1);
+
+	aux1 = equad*equad;
+	aux2 = aux1*equad;
+	aux3 = e1*e1;
+	aux4 = e1*aux3;
+	aux5 = aux4*e1;
+
+	m = ptpcy/k0;
+
+
+	a1 = 1.-(equad/4.);
+	a2 = 3.*(aux1/64.);
+	a3 = 5.*(aux2/256.);
+	mi = m/(Prd*(a1-a2-a3));
+
+
+	a1 = 3.*(e1/2.);
+	a2 = 27.*(aux4/32.);
+	a3 = sin((double)2*mi);
+	aux6 = (a1-a2)*a3;
+
+	a1 = 21.*(aux3/16.);
+	a2 = 55.*(aux5/32.);
+	a3 = sin((double)4*mi);
+	aux7 = (a1-a2)*a3;
+
+	a1 = 151.*(aux4/96.);
+	a2 = sin((double)6*mi);
+	aux8 = a1*a2;
+
+	lat1 = mi + aux6 + aux7 + aux8;
+
+	c1 = cos(lat1);			
+	c1 *= c1;			
+	c1 *= elinquad;			
+
+	t1 = tan(lat1);			
+	t1 *= t1;			
+
+	a1 = sin(lat1);			
+	a1 *= a1;			
+	a1 *= equad;			
+	a2 = 1.-a1;
+	n1 = Prd/sqrt(a2);
+
+	a1 = sin(lat1);
+	a1 *= a1;
+	a1 *= equad;
+	a2 = 1.-a1;
+	quoc = a2*a2*a2;
+
+	r1 = Prd*(1.-equad);
+	r1 /= sqrt(quoc);
+
+	d = ptpcx;
+	d /= (n1*k0);
+
+
+	a1 = 5.+(3.*t1);
+	a1 += (10.*c1);
+	a1 += (-4.*(c1*c1));
+	a1 += (-9.*elinquad);
+	a1 *= d;
+	a1 *= d;
+	a1 *= d;
+	a1 *= d;
+	aux9 = a1/24.;
+
+	a1 = 61.+(90.*t1);
+	a1 += (298.*c1);
+	a1 += (45.*(t1*t1));
+	a1 += (-252.*elinquad);
+	a1 += (-3.*c1*c1);
+	aux10 = d*d*d;			
+	aux10 *= d;			
+	aux10 *= d;			
+	aux10 *= d;			
+	aux10 *= a1;
+	aux10 /= 720.;
+
+	a1 = d*d*d;
+	a1 /= 6.;
+	a2 = 2.*t1;
+	a2 += (1.+c1);
+	aux11 = d-a2*a1;
+
+	a1 = 5.-(2.*c1);
+	a1 += (28.*t1);
+	a1 += (-3.*c1*c1);
+	a1 += (8.*elinquad);
+	a1 += (24.*t1*t1);
+	aux12 = d*d*d;			
+	aux12 *= d;			
+	aux12 *= d;			
+	aux12 *= a1;			
+	aux12 /= 120.;			
+
+	a1 = d*d/2.;
+	a1 += (- aux9 + aux10);
+	a2 = tan(lat1)/r1;
+	a2 *= n1;
+	ptpcy = lat1-a2*a1;
+
+	ptpcx= GPlon0 + (aux11 + aux12)/cos(lat1);
+
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return(TeCoord2D(ptpcx,ptpcy));
+}
+
+/********************************************************************
+		GEODETIC TO MERCATOR COORDINATES
+********************************************************************/
+TeCoord2D
+TeMercator :: LL2PC (TeCoord2D& ptll)
+{
+	double	equad,			//Squared eccentricity
+		aux1,			// Ancillary variables
+		aux2,aux3,aux4,aux5,aux6,ptllx,ptlly;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptllx = ptll.x();		
+	ptlly = ptll.y();		
+
+	equad = 2.*Pflt;		
+	equad -= Pflt*Pflt;		
+	double	a1,a2,a3;		
+ 
+	a1 = tan(ptlly/(double)2);	
+	a2 = 1.+a1;			
+	a3 = 1.-a1;			
+	aux1 = a2/a3;			
+ 
+	a1 = equad*equad/4.;		
+	a1 += equad;			
+	a2 = equad*equad*equad/8.;	
+	a3 = sin(ptlly);		
+	aux2 = (a1+a2)*a3;		
+ 
+	a1 = equad*equad/12.;		
+	a2 = equad*equad*equad/16.;	
+	a3 = sin((double)3*ptlly);	
+	aux3 = (a1+a2)*a3;		
+ 
+	a1 = equad*equad*equad/80.;	
+	a2 = sin((double)5*ptlly);	
+	aux4 = a1*a2;			
+	aux5 = cos(GPstlat1);
+ 
+	a1 = sin(GPstlat1);		
+	a1 *= a1;			
+	a1 *= equad;			
+	a2 = sqrt((double)1-a1);	
+	aux6 = 1./a2;			
+
+	ptllx = Prd*(ptllx - GPlon0)*aux5*aux6;
+	ptlly = Prd*(log(aux1) - aux2 + aux3 - aux4)*aux5*aux6;
+
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));	
+}
+
+/********************************************************************
+		MERCATOR TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeMercator :: PC2LL (TeCoord2D& ptpc)
+{
+	double	equad,			//Squared eccentricity 
+	        pi,			// PII value
+		t,			// Ancillary variables
+		xx,aux1,aux2,aux3,aux4,aux5,ptpcx,ptpcy;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	equad = 2.*Pflt;		
+	equad -= Pflt*Pflt;		
+	pi = 4.*atan((double)1);
+	double	a1,a2;		
+	aux1 = cos(GPstlat1);
+
+	a1 = sin(GPstlat1);		
+	a1 *= a1;			
+	a1 *= equad;			
+	a2 = sqrt((double)1-a1);	
+	aux2 = 1./a2;			
+	ptpcx = ptpcx/(aux1*aux2);
+	ptpcy = ptpcy/(aux1*aux2);
+	t = exp(-ptpcy/Prd);
+	xx = pi/2. - 2.*atan(t);
+ 
+	a1 = equad/2.;			
+	a1 += 5.*equad*equad/24.;	
+	a1 += equad*equad*equad/12.;	
+	a2 = sin((double)4*atan(t));	
+	aux3 = a1*a2;			
+ 
+	a1 = 7.*equad*equad/48.;	
+	a1 += 29.*equad*equad*equad/240.;	
+	a2 = sin((double)8*atan(t));	
+	aux4 = -a1*a2;			
+ 
+	a1 = 7.*equad*equad*equad/120.;	
+	a2 = sin((double)12*atan(t));	
+	aux5 = a1*a2;		 
+
+	ptpcy = xx + aux3 + aux4 + aux5;
+	ptpcx = ptpcx/Prd + GPlon0;
+	
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return(TeCoord2D(ptpcx,ptpcy));
+}
+
+
+
+
+/********************************************************************
+		GEODETIC TO LAMBERT CONIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeLambertConformal :: LL2PC (TeCoord2D& ptll)
+{
+
+	double	equad,			// Squared eccentricity
+		e,			// Ancillary variables
+		m1,m2,aux1,aux2,aux0,t1,t2,t0,n,efe,ro0,aux,
+		t,ro,teta,ptllx,ptlly;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptllx = (double)ptll.x();
+	ptlly = (double)ptll.y();
+
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+	e = sqrt(equad);
+
+	m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+	m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+	aux1 = sqrt(((double)1-e*sin(GPstlat1))/((double)1+e*sin(GPstlat1)));
+	aux2 = sqrt(((double)1-e*sin(GPstlat2))/((double)1+e*sin(GPstlat2)));
+	aux0 = sqrt(((double)1-e*sin(GPlat0))/((double)1+e*sin(GPlat0)));
+	t1 = ((1.-tan(GPstlat1/(double)2))/(1.+tan(GPstlat1/(double)2)))/pow(aux1,e);
+	t2 = ((1.-tan(GPstlat2/(double)2))/(1.+tan(GPstlat2/(double)2)))/pow(aux2,e);
+	t0 = ((1.-tan(GPlat0/(double)2))/(1.+tan(GPlat0/(double)2)))/pow(aux0,e);
+
+	if (GPstlat1 == GPstlat2)
+		n = sin(GPstlat1);
+	else
+		n = (log(m1)-log(m2))/(log(t1)-log(t2));
+
+	efe = m1/(n*pow(t1,n));
+	ro0 = Prd*efe*pow(t0,n);
+
+	aux = sqrt(((double)1-e*sin(ptlly))/((double)1+e*sin(ptlly)));
+	t = ((1.-tan(ptlly/(double)2))/(1.+tan(ptlly/(double)2)))/pow(aux,e);
+	ro = Prd*efe*pow(t,n);
+	teta = n*(ptllx - GPlon0);
+	ptllx = ro*sin(teta);
+	ptlly = ro0 - ro*cos(teta);
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));	
+}
+
+
+
+/********************************************************************
+		LAMBERT CONIC TO GEODETIC COORDINATES
+ ********************************************************************/
+TeCoord2D
+TeLambertConformal :: PC2LL (TeCoord2D& ptpc)
+{
+	double	equad,			// Squared eccentricity 
+		pi,			// PI value
+		e,m1,m2,aux1,aux2,aux0,t1,t2,t0,n,efe,ro0,ro,teta,
+		t,xx,aux3,aux4,aux5,ptpcx,ptpcy;
+
+	int	sinal;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+	
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+	e = sqrt(equad);
+	pi = 4.*atan((double)1);
+
+	m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+	m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+	aux1 = sqrt(((double)1-e*sin(GPstlat1))/((double)1+e*sin(GPstlat1)));
+	aux2 = sqrt(((double)1-e*sin(GPstlat2))/((double)1+e*sin(GPstlat2)));
+	aux0 = sqrt(((double)1-e*sin(GPlat0))/((double)1+e*sin(GPlat0)));
+	t1 = ((1.-tan(GPstlat1/(double)2))/(1.+tan(GPstlat1/(double)2)))/pow(aux1,e);
+	t2 = ((1.-tan(GPstlat2/(double)2))/(1.+tan(GPstlat2/(double)2)))/pow(aux2,e);
+	t0 = ((1.-tan(GPlat0/(double)2))/(1.+tan(GPlat0/(double)2)))/pow(aux0,e);
+
+	if (GPstlat1 == GPstlat2)
+		n = sin(GPstlat1);
+	else
+		n = (log(m1)-log(m2))/(log(t1)-log(t2));
+
+	efe = m1/(n*pow(t1,n));
+	ro0 = Prd*efe*pow(t0,n);
+
+	sinal = (int)(n/fabs(n));
+	ro = sqrt(ptpcx*ptpcx + (ro0-ptpcy)*(ro0-ptpcy));
+	ro *= sinal;
+	teta = atan(ptpcx/(ro0-ptpcy));
+	t = pow((ro/(Prd*efe)),(double)1/n);
+	xx = pi/2. - 2.*atan(t);
+	aux3 = equad/2. + 5.*equad*equad/24. + equad*equad*equad/12.;
+	aux4 = 7.*equad*equad/48. + 29.*equad*equad*equad/240.;
+	aux5 = (7.*equad*equad*equad/120.)*sin(12.*atan(t));
+
+	ptpcy = xx + aux3*sin(4.*atan(t)) - aux4*sin(8.*atan(t)) + aux5;
+	ptpcx = teta/n + GPlon0;
+	
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return (TeCoord2D(ptpcx,ptpcy));
+}
+
+/********************************************************************
+		GEODETIC TO POLYCONIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolyconic :: LL2PC (TeCoord2D& ptll)
+{
+	double	equad,			// Squared eccentricity 
+		n,			// Great normal of ellipsoid
+		aux01,			// Ancillary variables
+		aux02,aux03,aux04,m0,aux1,aux2,aux3,
+		aux4,m,e,ptllx,ptlly;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptllx = (double)ptll.x();
+	ptlly = (double)ptll.y();
+
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+
+	aux01 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*GPlat0;
+	aux02 = (3.*equad/8+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*GPlat0);
+	aux03 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*GPlat0);
+	aux04 = (35.*equad*equad*equad/3072.)*sin((double)6*GPlat0);
+	m0 = Prd*(aux01 - aux02 + aux03 - aux04);
+
+	if (ptlly == 0.)
+	{
+		ptllx = Prd*(ptllx - GPlon0);
+		ptlly = -m0;
+	}
+	else
+	{
+		aux1 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*ptlly;
+		aux2 = (3.*equad/8+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*ptlly);
+		aux3 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*ptlly);
+		aux4 = (35.*equad*equad*equad/3072.)*sin((double)6*ptlly);
+		m = Prd*(aux1 - aux2 + aux3 - aux4);
+		n = Prd/sqrt((double)1-equad*pow(sin(ptlly),(double)2));
+		e = (ptllx - GPlon0)*sin(ptlly);
+		ptllx = n*sin(e)/tan(ptlly);
+		ptlly = m - m0 + (n*(1. - cos(e))/tan(ptlly));
+	}
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));	
+}
+
+/*******************************************************************
+		POLYCONIC TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolyconic :: PC2LL (TeCoord2D& ptpc)
+{	
+	double	A,	
+		B,
+		C,
+		equad,			// Squared eccentricity
+		aux01,			// Ancillary variables
+		aux02,aux03,aux04,m0,mn,mnl,ma,cp,lat1,lat2,aux05,
+		aux06,aux07,aux08,aux09,aux10,aux11,aux12,aux21,
+		aux22,aux23,aux24,ptpcx,ptpcy;
+
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+
+	// Initialize latitude with latitude of origin
+	aux01 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*GPlat0;
+	aux02 = (3.*equad/8+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*GPlat0);
+	aux03 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*GPlat0);
+	aux04 = (35.*equad*equad*equad/3072.)*sin((double)6*GPlat0);
+	m0 = Prd*(aux01 - aux02 + aux03 - aux04);
+
+	if (ptpcy == (-m0))
+	{
+		ptpcy= 0.;
+		ptpcx = ptpcx/Prd + GPlon0;
+	}
+	else
+	{
+		A = (m0 + ptpcy)/Prd;
+		B = ((ptpcx*ptpcx)/(Prd*Prd)) +(A*A);
+
+		lat2 = A;
+
+		do
+		{
+			C = (sqrt(1.- equad*sin(lat2)*sin(lat2)))*tan(lat2);
+
+			// mn calculation	
+			aux21 = (1.-equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.)*lat2;
+			aux22 = (3.*equad/8.+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*sin((double)2*lat2);
+			aux23 = (15.*equad*equad/256.+45.*equad*equad*equad/1024.)*sin((double)4*lat2);
+			aux24 = (35.*equad*equad*equad/3072.)*sin((double)6*lat2);
+			mn = Prd*(aux21 - aux22 + aux23 - aux24);
+		
+			// mnl calculation
+			aux05 = 1.- equad/4.-3.*equad*equad/64.-5.*equad*equad*equad/256.;
+			aux06 = 2.*(3.*equad/8.+3.*equad*equad/32.+45.*equad*equad*equad/1024.)*cos((double)2*lat2);
+			aux07 = 4.*(15.*equad*equad/256.+45.*equad*equad*equad/1024.)*cos((double)4*lat2);
+			aux08 = 6.*(35.*equad*equad*equad/3072.)*cos((double)6*lat2);
+			mnl = aux05 - aux06 + aux07- aux08;
+
+			// ma calculation
+			ma = mn/Prd;
+
+			aux09 = (A*(C*ma+1)-ma)-(0.5*(ma*ma+B)*C);
+			aux10 = equad*sin((double)2*lat2)*(ma*ma+B-2.*A*ma);
+			aux11 = 4.*C+(A-ma);
+			aux12 = C*mnl-(2./sin((double)2*lat2));
+
+			// New latitude calculation 
+			lat1 = lat2 - (aux09/((aux10/(aux11*aux12)) - mnl));
+			cp = fabs(lat1-lat2) ;
+			lat2 = lat1;
+
+
+		}while(cp > 0.0000000001);
+
+		ptpcy = lat1;
+		ptpcx = ((asin((ptpcx*C)/Prd))/(sin(lat1))) + GPlon0;
+	}
+
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return (TeCoord2D(ptpcx,ptpcy));	
+
+}
+
+/********************************************************************
+	GEODETIC TO LAT LONG
+********************************************************************/
+TeCoord2D
+TeLatLong :: LL2PC (TeCoord2D& ptll)
+{
+	return TeCoord2D( ptll.x()*TeCRD, ptll.y()*TeCRD ); 
+}
+
+
+/********************************************************************
+	LAT LONG TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeLatLong :: PC2LL (TeCoord2D& ptpc)
+{
+	double ptpcx, ptpcy;
+
+	ptpcx = ptpc.x()*TeCDR;
+	ptpcy = ptpc.y()*TeCDR;
+	
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return TeCoord2D(ptpcx,ptpcy); 
+}
+
+
+
+/********************************************************************
+	GEODETIC TO ALBERS EQUAL-AREA COORDINATES
+********************************************************************/
+TeCoord2D
+TeAlbers :: LL2PC (TeCoord2D& ptll)
+{
+
+	double	equad,			// Squared eccentricity
+		e,			// Ancillary variables
+		m1,m2,aux1,aux10,aux11,aux12,aux2,aux20,aux21,
+		aux22,q0,q1,q2,q,n,c,ro0,teta,ro,ptllx,ptlly;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptllx = (double)ptll.x();
+	ptlly = (double)ptll.y();
+
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+	e = sqrt(equad);
+
+	m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+	m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+	aux1 = sin(ptlly)/((double)1-equad*pow(sin(ptlly),(double)2));
+	aux10 = sin(GPlat0)/((double)1-equad*pow(sin(GPlat0),(double)2));
+	aux11 = sin(GPstlat1)/((double)1-equad*pow(sin(GPstlat1),(double)2));
+	aux12 = sin(GPstlat2)/((double)1-equad*pow(sin(GPstlat2),(double)2));
+	aux2 = log((1. - e*sin(ptlly))/(1. + e*sin(ptlly)));
+	aux20 = log((1. - e*sin(GPlat0))/(1. + e*sin(GPlat0)));
+	aux21 = log((1. - e*sin(GPstlat1))/(1. + e*sin(GPstlat1)));
+	aux22 = log((1. - e*sin(GPstlat2))/(1. + e*sin(GPstlat2)));
+	q0 = (1. - equad)*(aux10 - (1./(2.*e))*aux20);
+	q1 = (1. - equad)*(aux11 - (1./(2.*e))*aux21);
+	q2 = (1. - equad)*(aux12 - (1./(2.*e))*aux22);
+	q = (1. - equad)*(aux1 - (1./(2.*e))*aux2);
+	n = (m1*m1 - m2*m2)/(q2 - q1);
+	c = m1*m1 + n*q1;
+	ro0 = Prd*sqrt(c - n*q0)/n;
+	teta = n*(ptllx - GPlon0);
+	ro = Prd*sqrt(c - n*q)/n;
+
+	ptllx = ro*sin(teta);
+	ptlly = ro0 - ro*cos(teta);
+
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));	
+}
+
+
+/********************************************************************
+		ALBERS EQUAL-AREA TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeAlbers :: PC2LL(TeCoord2D& ptpc)
+{
+
+	double	equad,			// Squared eccentricity
+		e,			// Eccentricity
+		m1,			// Ancillary variable
+		m2,aux10,aux11,aux12,aux20,aux21,aux22,q0,q1,q2,
+		n,c,ro0,ro,q,aux,beta,aux1,aux2,aux3,teta,ptpcx,ptpcy;
+
+	int	sinal;			// Ancillary variable	
+
+	
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	sinal = (int)(GPstlat2/fabs(GPstlat2));
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+	e = sqrt(equad);
+
+	m1 = cos(GPstlat1)/sqrt((double)1-equad*pow(sin(GPstlat1),(double)2));
+	m2 = cos(GPstlat2)/sqrt((double)1-equad*pow(sin(GPstlat2),(double)2));
+	aux10 = sin(GPlat0)/((double)1-equad*pow(sin(GPlat0),(double)2));
+	aux11 = sin(GPstlat1)/((double)1-equad*pow(sin(GPstlat1),(double)2));
+	aux12 = sin(GPstlat2)/((double)1-equad*pow(sin(GPstlat2),(double)2));
+	aux20 = log((1. - e*sin(GPlat0))/(1. + e*sin(GPlat0)));
+	aux21 = log((1. - e*sin(GPstlat1))/(1. + e*sin(GPstlat1)));
+	aux22 = log((1. - e*sin(GPstlat2))/(1. + e*sin(GPstlat2)));
+	q0 = (1. - equad)*(aux10 - (1./(2.*e))*aux20);
+	q1 = (1. - equad)*(aux11 - (1./(2.*e))*aux21);
+	q2 = (1. - equad)*(aux12 - (1./(2.*e))*aux22);
+	n = (m1*m1 - m2*m2)/(q2 - q1);
+	c = m1*m1 + n*q1;
+	ro0 = Prd*sqrt(c - n*q0)/n;
+	ro = sqrt(ptpcx*ptpcx + (ro0 - ptpcy)*(ro0 - ptpcy));
+	q = (c - (ro*ro*n*n/(Prd*Prd)))/n;
+	aux = ((1. - equad)/(2.*e))*log((1. - e)/(1. + e));
+	beta = asin(q/(1. - aux));
+	aux1 = (equad/3. + 31.*equad*equad/180.+517.*equad*equad*equad/5040.)*sin(2.*beta);
+	aux2 = (23.*equad*equad/360.+251.*equad*equad*equad/3780.)*sin(4.*beta);
+	aux3 = (761.*equad*equad*equad/45360.)*sin(6.*beta);
+	teta = fabs(atan(ptpcx/(ro0 - ptpcy)));
+
+	if (sinal == 1)
+	{
+		if (ptpcx < 0.)
+			teta = -teta;
+	}
+
+	if (sinal == -1)
+	{
+		if (ptpcx > 0.)
+			teta *= sinal;
+	}
+
+	ptpcy = beta + aux1 + aux2 + aux3;
+	ptpcx = GPlon0 + (teta/n);
+
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return (TeCoord2D(ptpcx,ptpcy));
+}
+
+/*******************************************************************
+		GEODETIC TO MILLER COORDINATES
+********************************************************************/
+TeCoord2D
+TeMiller :: LL2PC (TeCoord2D& ptll)
+{
+
+	double	pi,		// PI value
+		ptllx,ptlly;	// Ancillary variables 
+
+	int	sinal;		// Ancillary variables
+
+	double Prd  = GPdatum.radius();
+	
+	ptllx = (double)ptll.x();
+	ptlly = (double)ptll.y();
+
+	pi = 4.*atan((double)1);
+	sinal = (int)(fabs(ptlly)/ptlly);
+	
+	ptllx = Prd*(ptllx - GPlon0);
+
+	if (sinal == 1)
+		ptlly = (Prd/0.8)*(log(tan(pi/4. + 0.4*ptlly)));
+	else
+	{
+		ptlly *= sinal;
+		ptlly = (Prd/0.8)*(log(tan(pi/4. + 0.4*ptlly)));
+		ptlly *= sinal;
+	}
+
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));	
+}
+
+
+/********************************************************************
+		MILLER TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeMiller :: PC2LL (TeCoord2D& ptpc)
+{
+
+	double	e,		// Neperian logarithm base 
+		pi,		// PI value
+		ptpcx,ptpcy;	// Ancillary variables
+
+	int	sinal;		// Ancillary variable
+
+	double Prd  = GPdatum.radius();
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	e = 2.718281828;
+	pi = 4.*atan((double)1);
+	sinal = (int)(fabs(ptpcy)/ptpcy);
+
+	ptpcx = GPlon0 + (ptpcx/Prd);
+
+	if (sinal == 1)
+		ptpcy = 2.5*atan(pow(e,(0.8*ptpcy/Prd)))-5.*pi/8.;
+	else
+	{
+		ptpcy *= sinal;
+		ptpcy = 2.5*atan(pow(e,(0.8*ptpcy/Prd))) - 5.*pi/8.;
+		ptpcy *= sinal;
+	}
+
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return(TeCoord2D(ptpcx,ptpcy));
+}
+
+
+/*******************************************************************
+		GEODETIC TO SINUSOIDAL COORDINATES
+********************************************************************/
+TeCoord2D
+TeSinusoidal :: LL2PC (TeCoord2D& ptll)
+{
+
+	double	ptllx,ptlly;	// Ancillary variables 
+
+	double Prd  = GPdatum.radius();
+	
+	ptllx = (double)ptll.x();
+	ptlly = (double)ptll.y();
+	
+	ptllx = Prd*(ptllx - GPlon0);
+	ptllx *= cos(ptlly);
+
+	ptlly = Prd*ptlly;
+	
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));	
+}
+
+
+/********************************************************************
+		SINUSOIDAL TO GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeSinusoidal :: PC2LL (TeCoord2D& ptpc)
+{
+
+	double	ptpcx,ptpcy;	// Ancillary variables
+
+	double Prd  = GPdatum.radius();
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	ptpcy = ptpcy/Prd;
+
+	ptpcx = GPlon0 + (ptpcx/(Prd*cos(ptpcy)));
+	
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return(TeCoord2D(ptpcx,ptpcy));
+}
+
+/*******************************************************************
+		GEODETIC TO CYLINDRICAL EQUIDISTANT COORDINATES
+********************************************************************/
+TeCoord2D
+TeCylindricalEquidistant :: LL2PC (TeCoord2D& ptll)
+{
+	double	ptllx,ptlly;
+
+	double Prd  = GPdatum.radius();
+
+	ptllx = ptll.x();
+	ptlly = ptll.y();
+
+	ptllx = Prd*(ptllx - GPlon0)*cos(GPstlat1);
+	ptlly = Prd*ptlly;
+
+	return(TeCoord2D(ptllx+GPoffx,ptlly+GPoffy));
+}
+
+
+/*******************************************************************
+	CYLINDRICAL EQUIDISTANT TO	GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TeCylindricalEquidistant :: PC2LL (TeCoord2D& ptpc)
+{
+	double	ptpcx,ptpcy;
+
+	double Prd  = GPdatum.radius();
+
+	ptpcx = ptpc.x()-GPoffx;
+	ptpcy = ptpc.y()-GPoffy;
+
+	ptpcy = ptpcy/Prd;
+	ptpcx = GPlon0 + ptpcx/(Prd*cos(GPstlat1));
+
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return (TeCoord2D(ptpcx,ptpcy));
+}
+
+/*******************************************************************
+		GEODETIC TO POLAR STEREOGRAPHIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolarStereographic :: LL2PC (TeCoord2D& ptll)
+{
+	double	k0,				// Scale factor
+		e,					// Eccentricity
+		pi,					// Auxillary variables
+		lon0,				// auxilliary origin longitude
+		t,ro,aux1,aux2,aux3,ptllx,ptlly;
+	
+	int GPhemis;
+	if (GPhemisphere == TeNORTH_HEM)
+		GPhemis = 1;
+	else
+		GPhemis = -1;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+	
+	ptllx = ptll.x();
+	ptlly = ptll.y();
+
+	k0 = 0.933;	// Standard parallel 60 degrees 
+	e = sqrt((double)2*Pflt - pow(Pflt,(double)2));
+	pi = 4.*atan((double)1);
+
+	ptlly *= GPhemis;
+	ptllx *= GPhemis;
+	lon0 = (GPhemis == 1) ? GPlon0 : -GPlon0;
+
+	aux1 = (1. - e*sin(ptlly))/(1. + e*sin(ptlly));
+	t = tan((pi/4.) - (ptlly/2.))/pow(aux1,(e/(double)2));
+	aux2 = pow(((double)1 + e),((double)1 + e));
+	aux3 = pow(((double)1 - e),((double)1 - e));
+	ro = 2.*Prd*k0*t/sqrt(aux2*aux3);
+
+	aux1   = ro*sin(ptllx - lon0);
+	ptlly = -ro*cos(ptllx - lon0);
+	aux1 *= GPhemis;
+	ptlly *= GPhemis;
+	
+	if (GPhemis == -1)
+	{
+		aux1 *= GPhemis;
+		ptlly *= GPhemis;
+	}
+//	return(Point((float)aux1,(float)ptlly));
+	return (TeCoord2D(aux1+GPoffx,ptlly+GPoffy));
+
+}
+
+
+/*******************************************************************
+	POLAR STEREOGRAPHIC TO	GEODETIC COORDINATES
+********************************************************************/
+TeCoord2D
+TePolarStereographic :: PC2LL (TeCoord2D& ptpc)
+{
+	double	k0,			// Scale factor
+
+		equad,			// Squared eccentricity
+		e,		        // Eccentricity
+		pi,			// Ancillary variables
+		lon0,			// auxilliary origin longitude
+		ro,t,xx,aux1,aux2,aux3,aux4,aux5,ptpcx,ptpcy,px,py;
+
+	px = (double)ptpc.x()-GPoffx;
+	py = (double)ptpc.y()-GPoffy;
+
+	int GPhemis;
+	if (GPhemisphere == TeNORTH_HEM)
+		GPhemis = 1;
+	else
+		GPhemis = -1;
+
+	double Pflt = GPdatum.flattening();
+	double Prd  = GPdatum.radius();
+
+//	k0 = 0.994;	// Standard parallel 80.1 degrees 
+	k0 = 0.933;	// Standard parallel 60 degrees
+	pi = 4.*atan((double)1);
+	equad = 2.*Pflt - pow(Pflt,(double)2);
+	e = sqrt(equad);
+
+	if (GPhemis == -1)
+	{
+		px *= GPhemis;
+		py *= GPhemis;
+	}
+
+	lon0 = (GPhemis == 1) ? GPlon0 : -GPlon0;
+
+	ro = sqrt(px*px + py*py);
+	aux1 = pow(((double)1 + e),((double)1 + e));
+	aux2 = pow(((double)1 - e),((double)1 - e));
+	t = (ro*sqrt(aux1*aux2))/(2.*Prd*k0);
+	xx = pi/2. - 2.*atan(t);
+	aux3 = equad/2. + 5.*equad*equad/24. + equad*equad*equad/12.;
+	aux4 = 7.*equad*equad/48. + 29.*equad*equad*equad/240.;
+	aux5 = 7.*equad*equad*equad/120.;
+
+	ptpcy = xx + aux3*sin((double)2*xx) + aux4*sin((double)4*xx) + aux5*sin((double)6*xx);
+
+	if (py != 0.)
+		ptpcx = lon0 + atan(px/(-py));
+
+
+	if (GPhemis == 1)
+	{
+		if (px > 0. && py > 0.)
+			ptpcx = ptpcx + pi;
+		else if (px < 0. && py > 0.)
+			ptpcx = ptpcx - pi;
+		else if (px > 0. && py == 0.)
+			ptpcx = lon0 + pi / 2.;
+		else if (px < 0. && py == 0.)
+			ptpcx = lon0 - pi / 2.;
+		else if (px == 0. && py == 0.)
+			ptpcx = lon0;
+	}
+	else
+	{
+		ptpcy *= GPhemis;
+		ptpcx *= GPhemis;
+
+		if (px > 0. && py < 0.)
+			ptpcx = ptpcx + pi;
+		else if (px < 0. && py < 0.)
+			ptpcx = ptpcx - pi;
+		else if (px > 0. && py == 0.)
+			ptpcx = lon0 + pi / 2.;
+		else if (px < 0. && py == 0.)
+			ptpcx = lon0 - pi / 2.;
+		else if (px == 0. && py == 0.)
+			ptpcx = lon0;
+	}
+
+	if (ptpcx < (-pi)) ptpcx += 2.*pi;
+	else if (ptpcx > pi)    ptpcx -= 2.*pi;
+
+	if( GPdestination && !(datum() == GPdestination->datum()))
+		ChangeLL(ptpcx,ptpcy);
+
+	return (TeCoord2D(ptpcx,ptpcy));
+}
+
+TeProjection* TeGetTeProjectionFromSProj(const string& proj4)
+{
+
+	// a map from sproj4 projections to TerraLib projections
+	map<string,string> sprojToTeProj;
+	sprojToTeProj["aea"] = "Albers";
+	sprojToTeProj["latlong"] = "LatLong";
+	sprojToTeProj["lcc"] = "LambertConformal";
+	sprojToTeProj["merc"] = "Mercator";
+	sprojToTeProj["mill"] = "Miller";
+	sprojToTeProj["utm"] = "UTM";
+	sprojToTeProj["sinu"] = "Sinusoidal";
+	sprojToTeProj["poly"] = "Polyconic";
+	sprojToTeProj["eqc"] = "CylindricalEquidistant";
+	sprojToTeProj["ups"] = "PolarStereographic";
+
+    unsigned int pos;
+    string attribute;
+    string value;
+
+  	TeProjectionParams par;
+	par.hemisphere = TeNORTH_HEM;
+	par.offx = 500000;
+	par.offy = 0;
+	par.units = "";
+	TeDatum dat("UserDefined");
+
+    for(unsigned int i = 0; i < proj4.size(); i++)
+    {
+        for( pos = i; i != proj4.size() && proj4[i] != '=';i++);
+
+        attribute = proj4.substr(pos+1, i-pos-1);
+
+        for(pos = i; i != proj4.size() && proj4[i] != ' ';i++);
+
+        if(proj4[i] == ' ') value = proj4.substr(pos+1, i-pos-1);
+        else                value = proj4.substr(pos+1, i-pos);
+
+        if(attribute == "proj")
+		{
+			map<string,string>::iterator it = sprojToTeProj.find(value);
+			if (it != sprojToTeProj.end())
+				par.name = sprojToTeProj[value];
+			else
+				par.name = "NoProjection"; 
+		}
+	// Currently this routine understands the following parameters from
+	// a sproj description: lon_0, lat_0, lat_1, lat_2, k, zone, x_0, y_0
+
+        else if(attribute == "lon_0") 
+			par.lon0 = atof(value.c_str())*TeCDR;
+        else if(attribute == "lat_0") 
+			par.lat0 = atof(value.c_str())*TeCDR;
+        else if(attribute == "lat_1") 
+			par.stlat1 = atof(value.c_str())*TeCDR;
+        else if(attribute == "lat_2") 
+			par.stlat2 = atof(value.c_str())*TeCDR;
+        else if(attribute == "k") 
+			par.scale = atof(value.c_str());
+        else if(attribute == "zone") 
+			par.lon0 = (-183 + 6*(atoi(value.c_str()))*TeCDR);
+		else if (attribute == "south") 
+		{
+			par.hemisphere = TeSOUTH_HEM;
+			par.offy = 10000000;
+		}
+		else if(attribute == "x_0") 
+			par.offx = atof(value.c_str());
+ 		else if(attribute == "y_0") 
+			par.offy = atof(value.c_str());
+		else if (attribute == "units")
+			par.units = value;
+		// Datum parameters
+        else if(attribute == "R")	// radius for a spherical ellipsoid
+			dat = TeDatum("Spherical",atof(value.c_str()));
+	    else if(attribute == "a")   // Earth equatorial radius
+			dat.radius(atof(value.c_str()));
+	    else if(attribute == "f")	// Earth flattening
+			dat.flattening(atof(value.c_str()));
+	    else if(attribute == "rf")	// Earth  reverse flattening (f = 1/rf)
+			dat.flattening(1/atof(value.c_str()));
+		else if (attribute == "es") // eccentricity squared (f=1-(1-es)^0.5) 
+			dat.flattening(1-sqrt(1-atof(value.c_str())));
+		else if (attribute == "e")	// eccentricity (f=1-(1-es^2)^0.5)
+			dat.flattening(1-sqrt(1-pow(atof(value.c_str()),2)));
+
+// TODO: sproj4 also allowd the selection of standard, predefined
+// ellipsoid figures using the option +ellps=acronym. But we are not decoding 
+// them yet...
+    }
+	par.datum = dat;
+	return TeProjectionFactory::make(par);
+}
+
+string TeGetSProjFromTeProjection(TeProjection* teproj)
+{
+	map<string,string> teProjToSProj;
+	teProjToSProj["Albers"] = "aea";
+	teProjToSProj["LatLong"] = "latlong";
+	teProjToSProj["LambertConformal"] = "lcc";
+	teProjToSProj["Mercator"] = "merc";
+	teProjToSProj["Miller"] = "mill";
+	teProjToSProj["UTM"] = "utm";
+	teProjToSProj["Sinusoidal"] = "sinu";
+	teProjToSProj["Polyconic"] = "poly";
+	teProjToSProj["CylindricalEquidistant"] = "eqc";
+	teProjToSProj["PolarStereographic"] = "ups";
+
+    string sresp = "+proj=";
+	map<string,string>::iterator it = teProjToSProj.find(teproj->name());
+	if (it == teProjToSProj.end())
+	{
+		sresp += "noprojection";
+		return sresp;
+	}
+	else
+		sresp += it->second;
+
+	TeProjInfo pjInfo = TeProjectionInfo(teproj->name());
+	if ( pjInfo.hasLon0 )
+		sresp += " +lon_0=" + Te2String(teproj->lon0()*TeCRD,6);
+
+	if ( pjInfo.hasLat0 )
+		sresp += " +lat_0=" + Te2String(teproj->lat0()*TeCRD,6);
+
+	if ( pjInfo.hasStlat1 )
+		sresp += " +lat_1=" + Te2String(teproj->stLat1()*TeCRD,6);
+	
+	if ( pjInfo.hasStlat2 )
+		sresp += " +lat_2=" +Te2String(teproj->stLat2()*TeCRD,6);
+
+	if (teproj->name() == "UTM" && teproj->hemisphere() == TeSOUTH_HEM)
+		sresp += " +south";
+	else
+	{
+		if ( pjInfo.hasOffx )
+			sresp += " +x_0=" + Te2String(teproj->offX(),6);
+		if ( pjInfo.hasOffy )
+			sresp += " +y_0=" + Te2String(teproj->offY(),6);
+	}
+	
+	if ( pjInfo.hasScale )
+		sresp += " +k="  + Te2String(teproj->scale(),6);
+
+    if (teproj->datum().name() == "Spherical")
+		sresp += " +R="  + Te2String(teproj->datum().radius(),6);
+	else
+	{
+		sresp += " +a="  + Te2String(teproj->datum().radius(),6);
+		sresp += " +f="  + Te2String(teproj->datum().flattening(),6);
+	}
+	return sresp;
+}
diff --git a/src/terralib/kernel/TeProjection.h b/src/terralib/kernel/TeProjection.h
new file mode 100644
index 0000000..4f35673
--- /dev/null
+++ b/src/terralib/kernel/TeProjection.h
@@ -0,0 +1,700 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProjection.h
+    This file contains support do deal with geographical projections
+*/
+
+#ifndef  __TERRALIB_INTERNAL_PROJECTION_H
+#define  __TERRALIB_INTERNAL_PROJECTION_H
+
+#include "TeCoord2D.h"
+#include "TeDefines.h"
+#include "TeDatum.h"
+#include <stdio.h>
+#include <map>
+#include <string>
+
+using namespace std;
+
+//! Earth hemispheres 
+enum TeHemisphere
+{ TeNORTH_HEM, TeSOUTH_HEM };
+
+//! Number of supported projections in TerraLib
+const int NUM_PROJ = 11; 
+
+//! Set of informations required by projections
+struct TeProjInfo 
+{
+	int hasUnits;
+	int hasLon0;
+	int hasLat0;
+	int hasStlat1;
+	int hasStlat2;
+	int hasScale;
+	int hasOffx;
+	int hasOffy;
+};
+
+//! A map from name of projections to a set of informations that it requires
+typedef map<string,TeProjInfo> TeProjInfoMap;
+
+//! Returns the set of informations required by a given projection
+TeProjInfo TeProjectionInfo ( const string& projName  );
+
+// ============ PROJECTION PARAMETERS ===============
+
+class TeProjection;
+
+//! Set of parameters that define a geographical projection
+struct TeProjectionParams
+{
+	string	name;	     //!< projection name
+	TeDatum datum;       //!< spheroid
+    double	lon0;		 //!< Longitude of origin (rad)
+	double  lat0;		 //!< Latitude of origin (rad)  
+	double	offx;	     //!< X (projection coordinate) offset (m)
+	double	offy;	     //!< Y (projection coordinate) offset (m)
+	double	stlat1;	     //!< First standard parallel (rad)
+	double  stlat2;      //!< Second standard paralel ( rad)
+	string  units;       //!< units
+	double  scale;       //!< projection scale (used in UTM)
+	TeHemisphere	hemisphere; //!< Hemisphere
+};
+
+//========== PROJECTION FACTORY
+//! A factory of projections
+class TeProjectionFactory 
+{
+public:
+	static TeProjection* make( const TeProjectionParams& );
+};
+
+//!  Provides methods that are required to handle all map projection definitions and georeferencing of satellite images.
+/*!
+  Specifies earth and projection parameters that represent a common
+  ground in terms of defining conventional map projections, navigating
+  on low-resolution images of geostationary satellites.
+*/
+class TeProjection 
+{
+protected:
+	string	GPname;	     // projection name
+	TeDatum GPdatum;     // spheroid
+	double	GPlon0;		 // Longitude of origin (rad)
+	double  GPlat0;		 // Latitude of origin (rad)  
+	double	GPoffx;	     // X (projection coordinate) offset (m)
+	double	GPoffy;	     // Y (projection coordinate) offset (m)
+	double	GPstlat1;	 // First standard parallel (rad)
+	double  GPstlat2;    // Second standard parallel (rad)
+	string  GPunits;     // units
+	double  GPscale;     // scale (used for UTM)
+	TeHemisphere	GPhemisphere; // Hemisphere
+	TeProjection*	GPdestination; // destination projection
+	int		GPid;		 // id
+
+	//! Changes planimetic datum
+	/*!	Computes changes in geodetic coordinates due to
+		planimetric datum changes. First, the method finds
+		geocentric cartesian coordinates on the initial datum,
+		then applies datum shifts, and finally computes the
+		new geodetic coordinates on the final datum. The new
+		geodetic latitude is computed iteractively, the old
+		geodetic latitude being used as initial guess.
+		
+		\param	x	Initial longitude (rad);
+		\param	y	Initial latitude (rad).
+		\return x	Final longitude (rad);
+		\return y	Final latitude (rad).
+		
+		\note
+			x must be a valid longitude ([0,pi] or [0,-pi]) and
+			y must be a valid latitude ([0,pi/2] or [0,-pi/2]).
+	*/
+	void 	ChangeLL (double &x, double &y); 
+
+public:
+
+	//! Normal constructor
+	/*!	
+		Initializes projection parameters 
+		\param name			projection name
+		\param datum		spheroid
+		\param lon0			longitude of origin (in radians)
+		\param lat0			latitude of origin (in radians)  
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param stlat1		first standard parallel (in radians)
+		\param stlat2		second standard parallel (in radians)
+		\param units		projection unit
+		\param scale		scale (used for UTM)
+		\param hem			hemisphere
+	*/
+	TeProjection ( const string& name, const TeDatum& datum,
+		double lon0 = 0., double lat0=0., double offx = 0., double offy = 0.,
+		double stlat1 = 0., double stlat2 = 0., 
+		const string units = "Meters",
+		double scale = 1., TeHemisphere hem = TeSOUTH_HEM):
+		GPname   ( name ),
+		GPdatum  ( datum ),
+	    GPlon0   ( lon0 ),
+	    GPlat0   ( lat0  ),
+	    GPoffx   ( offx  ),
+	    GPoffy   ( offy ),
+	    GPstlat1 ( stlat1 ),
+	    GPstlat2 ( stlat2 ),
+	    GPunits  ( units ),
+	    GPscale  ( scale ),
+	    GPhemisphere ( hem ),
+		GPdestination (0),
+		GPid(0)
+		{}
+
+		TeProjection ():
+		GPname   ( "NoProjection" ),
+	    GPlon0   ( 0. ),
+	    GPlat0   ( 0. ),
+	    GPoffx   ( 0. ),
+	    GPoffy   ( 0. ),
+	    GPstlat1 ( 0. ),
+	    GPstlat2 ( 0. ),
+	    GPunits  ( "Units" ),
+	    GPscale  ( 1 ),
+	    GPhemisphere ( TeSOUTH_HEM ),
+		GPdestination (0),
+		GPid(0)
+	{}
+
+	//! Copy Constructor
+	TeProjection(const TeProjection&);
+
+	//! Operator =
+	TeProjection& operator=(const TeProjection&);
+
+	//!	Destructor.
+	virtual ~TeProjection (){}
+
+	//! Returns the projection name;
+	string name()
+	{ return GPname; }
+
+	//! Returns the projection datum
+	TeDatum datum()
+	{ return GPdatum; }
+
+	//! Return the projection units 
+	string units()
+	{ return GPunits; }
+
+	//! Return the longitude of origin ( in rad)
+	double	lon0() { return GPlon0;	}
+	
+	//! Return the Latitude of origin (rad)
+	double  lat0() { return GPlat0;	}	  
+
+	//! Return  X (projection coordinate) offset (m)
+	double	offX() { return GPoffx; }	 
+    
+	//! Return  Y (projection coordinate) offset (m)
+	double	offY() { return GPoffy;	 }
+    
+	//!  Return First standard parallel (rad)
+	double	stLat1() { return GPstlat1; }
+	
+	//! Return the second standard parallel (rad)
+	double  stLat2() { return GPstlat2; }
+	
+	//! Return the scale (used for UTM)
+	double  scale()  { return GPscale;   }
+
+	//! Return the  Hemisphere
+	TeHemisphere hemisphere() {	return GPhemisphere; }
+		
+	// Returns a the parameters of this projection
+	TeProjectionParams params ();
+
+	bool operator== (const TeProjection& proj);
+
+	//!	Pure virtual method that transforms geodetic into projection coordinates
+	/*!		
+		This method is implemented for each available
+		projection class and represents the so-called
+		direct formulas, which compute projection 
+		coordinates from geodetic coordinates.
+		 
+		\param	p 	Geodetic coordinates (radian).
+		\return p  	Projection coordinates (m).
+		\note
+			Geodetic coordinates must be a valid latitude
+			([0,pi/2] or [0,-pi/2]) and a valid longitude
+			([0,pi] or [0,-pi]).
+	*/
+	virtual	TeCoord2D	LL2PC (TeCoord2D& p) = 0;
+
+	//! Pure virtual method that transforms projection into geodetic coordinates.
+	/*!
+		This method is implemented for each available
+		projection class and represents the so-called
+		inverse formulas, which compute geodetic
+		coordinates from projection coordinates.
+		\param p 	Projection coordinates (m).
+		\return p	Geodetic coordinates (rad).
+		\note X and Y projection coordinates must be both valid,
+		 within the typical range of each projection class.
+	*/
+	virtual	TeCoord2D	PC2LL (TeCoord2D& p) = 0;
+
+	//!	Sets the projection to which a Latitude/Longitude value will be generated by the current projection by calling changeLL in PC2LL method
+	void setDestinationProjection (TeProjection* proj)
+	{ GPdestination = proj; }
+	
+	//! Concrete method that prints information about a projection
+	void print ( FILE* file_ );
+
+	//! Concrete method that prints information about a projection in a string
+	string describe ();
+
+	//! Get projection unique id in the database
+	int	id() { return GPid;}
+
+	//! Set projection unique id in the database
+	void id(int i) { GPid = i;}
+};
+
+
+//!  Provides methods that are required to handle the UTM map projection.
+/*!
+	  Specifies methods that are necessary to establish the relation between
+	  geodetic and UTM coordinates. UTM is a conformal projection system that
+	  uses the planimetric datum Sad69 or Corrego Alegre  (Hayford ellipsoid).
+
+	 \sa TeCoord2D TeDatum TeProjection.
+*/
+class TeUtm : public TeProjection
+{
+public:
+
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param long0		longitude of origin (in radians)
+		\param lat0			latitude of origin (in radians)  
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param units		projection unit
+		\param scale		scale (used for UTM)
+		\param hemisphere	hemisphere
+	*/
+	TeUtm ( const TeDatum& datum, double long0, double lat0 = 0., 
+		     double offx = 500000., double offy = 10000000., 
+			 const string& units = "Meters",
+			 double scale = 0.9996, TeHemisphere hemisphere = TeSOUTH_HEM ):
+	TeProjection ( "UTM", datum, long0, lat0, offx, offy, 0., 0., units, scale,
+		hemisphere)
+
+	{
+		if ( hemisphere == TeNORTH_HEM )
+			GPoffy = 0.;
+	}
+
+	//! Destructor
+	~TeUtm () {}
+
+	//! This implementation of a pure virtual method defined in Projection transforms geodetic into UTM coordinates.
+	/*!		 
+		\param	p	Geodetic coordinates (rad).
+		\return	p:	UTM coordinates (m).
+		\note
+			Geodetic coordinates must be a valid latitude
+			([0,pi/2] or [0,-pi/2]) and a valid longitude
+			([0,pi] or [0,-pi]). Conventional UTM offsets
+			(500,000 m and 10,000,000 m) are always added
+			to the resulting projection coordinates.
+	*/
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	//!	This implementation of a pure virtual method defined in
+	/*	Projection transforms UTM into geodetic coordinates.
+		\param p:	UTM coordinates (m).
+		\return p:	Geodetic coordinates (rad).
+		\note
+		X and Y UTM coordinates must be both valid, within
+		their typical range. Conventional UTM offsets are
+		handled in this method, and therefore must not be 
+		previously subtracted.
+	*/
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//!  Provides methods that are required to handle Lambert conformal conic map projection..
+/*!
+  Specifies methods that are necessary to establish the relation between
+  geodetic and Lambert conformal conic coordinates. 
+  \sa TeCoord2D TeDatum TeProjection.
+*/
+class TeLambertConformal : public TeProjection
+{
+public :
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param long0			longitude of origin (in radians)
+		\param lat0			latitude of origin (in radians)  
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param stlat1		first standard parallel (in radians)
+		\param stlat2		second standard parallel (in radians)
+		\param units		projection unit
+	*/
+	TeLambertConformal ( const TeDatum& datum, 
+		                 double long0,
+			             double lat0, 
+						 double offx, 
+						 double offy,
+						 double stlat1, 
+						 double stlat2, 
+						 const string& units = "Meters" ):
+	TeProjection ( "LambertConformal", datum, long0, lat0, offx, offy, stlat1, stlat2, units)
+	{}
+
+	//! Destructor
+	~TeLambertConformal () {}
+
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual	TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//!  Provides methods that are required to handle the Mercator map projection.
+/*! 
+  Specifies methods that are necessary to establish the relation between
+  geodetic and Mercator coordinates.  
+*/
+class TeMercator : public TeProjection
+{
+
+public:
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param long0			longitude of origin (in radians)
+		\param lat0			latitude of origin (in radians)  
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param stlat1		first standard parallel (in radians)
+		\param units		projection unit
+	*/
+	TeMercator ( const TeDatum& datum,  
+		         double long0, 
+				 double lat0 = 0.,
+				 double offx = 0., 
+				 double offy = 0.,
+				 double stlat1 = 0.,
+				 const string& units = "Meters"): 
+	TeProjection ( "Mercator", datum, long0, lat0, offx, offy, stlat1, 0., units )
+	{}
+
+	//! Destructor
+	~TeMercator () {}
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+
+};
+
+
+
+//! Provides methods that are required to handle the Polyconic map projection.
+/*!  
+	Specifies methods that are necessary to establish the relation between
+    geodetic and Polyconic coordinates. Polyconic is a projection system that
+    is neither conformal nor equal-area. 
+*/  
+class TePolyconic : public TeProjection
+{
+
+public:
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param long0			longitude of origin (in radians)
+		\param lat0			latitude of origin (in radians)  
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param units		projection unit
+	*/
+	TePolyconic (const TeDatum& datum,  
+		         double long0, 
+				 double lat0 = 0.,
+				 double offx = 0., 
+				 double offy = 0.,
+				 const string& units = "Meters"): 
+	TeProjection ( "Polyconic", datum, long0, lat0, offx, offy, 0., 0., units )
+	{}  
+
+	//! Destructor
+	~TePolyconic () {}
+
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//!  Provides methods that are required to handle the Equidistant Cylindrical  map projection.
+class TeLatLong : public TeProjection
+{
+
+public :
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param units		projection unit
+	*/
+	TeLatLong( const TeDatum& datum, const string& units = "DecimalDegrees" ):
+	   TeProjection ( "LatLong", datum, 0., 0., 0., 0., 0., 0., units )
+	{}
+
+	//! Destructor
+	~TeLatLong () {}
+
+	//! Returns the same coordinate
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	//! Returns the same coordinate
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+
+};
+
+//!  Provides methods that are required to handle the Albers Conic map  projection.
+/*
+  Specifies methods that are necessary to establish the relation between
+  geodetic and Albers Conic coordinates. Albers Conic is an equal-area
+  projection system. 
+*/
+class TeAlbers : public TeProjection
+{
+
+public:
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param lon0			longitude of origin (in radians)
+		\param lat0			latitude of origin (in radians)  
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param stlat1		first standard parallel (in radians)
+		\param stlat2		second standard parallel (in radians)
+		\param units		projection unit
+	*/
+	TeAlbers( const TeDatum& datum, 
+		      double lon0,
+			  double lat0, 
+			  double offx, 
+			  double offy,
+			  double stlat1, 
+			  double stlat2, 
+			  const string& units = "Meters" ):
+		TeProjection ( "Albers", datum, lon0, lat0, offx, offy, stlat1, stlat2, units )
+	{} 
+
+	//! Destructor
+	~TeAlbers () { }
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//!  Provides methods that are required to handle the Miller map projection.
+/*!
+  Specifies methods that are necessary to establish the relation between
+  geodetic and Miller coordinates. Miller is a projection system that
+  is neither conformal nor equal-area."
+*/
+class TeMiller : public TeProjection	
+{
+
+public:
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param long0		longitude of origin (in radians)
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param units		projection unit
+	*/
+	TeMiller ( const TeDatum& datum,  
+		         double long0, 
+				 double offx = 0., 
+				 double offy = 0.,
+				 const string& units = "Meters"): 
+	TeProjection ( "Miller", datum, long0, 0., offx, offy, 0., 0., units )
+	{}
+
+	//! Destructor
+	~TeMiller () {}
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+
+};
+
+//! Provides methods that are required to handle the Sinusoidal map projection.
+/*!
+  Specifies methods that are necessary to establish the relation between
+  geodetic and Sinusoidal coordinates. Sinusoidal is a projection system that
+  is equal-area. Being not an interrupted form, 
+  this implementation assumes a single central meridian. Spheroid options 
+  can be redefined by editing the file "TeDatum.cpp"
+*/
+class TeSinusoidal : public TeProjection	
+{
+
+public:
+
+//!	Constructor.
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param long0		longitude of origin (in radians)
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param units		projection unit
+	*/
+	TeSinusoidal (const TeDatum& datum,  
+		         double long0, 
+				 double offx = 0., 
+				 double offy = 0.,
+				 const string& units = "Meters"): 
+	TeProjection ( "Sinusoidal", datum, long0, 0., offx, offy, 0., 0., units )
+	{}
+
+//! Empty destructor.
+	~TeSinusoidal () {}
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Cylindrical Equidistant map projection
+class TeCylindricalEquidistant : public TeProjection
+{
+public:
+
+//!	Constructor.
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param lon0			longitude of origin (in radians)
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param stlat1		first standard parallel (in radians)
+		\param units		projection unit
+	*/
+	TeCylindricalEquidistant (const TeDatum& datum,  
+		         double lon0, 
+				 double offx = 0., 
+				 double offy = 0.,
+				 double stlat1 = 0.,
+				 const string& units = "Meters"):
+			TeProjection ( "CylindricalEquidistant", datum, lon0, 0., offx, offy, stlat1, 0,units)
+		{}
+//! Empty destructor.
+	~TeCylindricalEquidistant () {}
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+//! Provides methods that are required to handle the Polar Stereographic map projection
+class TePolarStereographic : public TeProjection
+{
+public:
+	//! Constructor
+	/*!	
+		Initializes projection parameters 
+		\param datum		spheroid
+		\param lon0			longitude of origin (in radians)
+		\param offx			X (projection coordinate) offset (m)
+		\param offy 		Y (projection coordinate) offset (m)
+		\param units		projection unit
+		\param hem	hemisphere
+	*/
+	TePolarStereographic ( const TeDatum& datum,  
+		         double lon0,  
+				 double offx = 0., 
+				 double offy = 0.,
+				 const string& units = "Meters",
+				 const TeHemisphere hem = TeSOUTH_HEM ):
+	TeProjection ( "PolarStereographic", datum, lon0, 0., offx, offy, 0, 0, units, 1, hem )
+	{}
+
+	//! Destructor
+	~TePolarStereographic () {}
+
+	virtual TeCoord2D LL2PC(TeCoord2D& p);
+
+	virtual TeCoord2D PC2LL(TeCoord2D& p);
+};
+
+class TeNoProjection : public TeProjection
+{
+public:
+	TeNoProjection(const string& units = "Units")
+	{	GPname = "NoProjection", GPunits = units; }
+
+		~TeNoProjection () {}
+
+		virtual TeCoord2D LL2PC(TeCoord2D& p) { return p; }
+
+		virtual TeCoord2D PC2LL(TeCoord2D& p) {return p;};
+};
+
+bool decodifyDescription(const string& projDescription, TeProjectionParams& pars);
+
+TeProjection* TeGetTeProjectionFromSProj(const string& sproj4desc);
+
+string TeGetSProjFromTeProjection(TeProjection* teproj);
+
+/** \example ProjectionExample1.cpp
+ * This is an example of how to convert a coordinate from a projection to another
+ */
+
+
+#endif
+
+
diff --git a/src/terralib/kernel/TePrototype.h b/src/terralib/kernel/TePrototype.h
new file mode 100644
index 0000000..96de337
--- /dev/null
+++ b/src/terralib/kernel/TePrototype.h
@@ -0,0 +1,79 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef TePrototype_H
+#define TePrototype_H
+//!  Implements a template for the "TePrototype" pattern.
+/*
+//  The "factory" pattern is a technique for creating new
+//  instances of objects which defines an abstract interface,
+//  (represented by the "Make" module). The subclasses of
+//  factory decide which class to instantiate.
+//
+//  Each subclass of factory "registers" itself at compile time;
+//  therefore, the addition of a new factory requires no change
+//  the parent class. */
+template <class T>
+class TePrototype
+{
+public:
+
+	typedef  TePrototype<T>* TePrototypePtr;
+
+// -- Normal Constructor
+
+	TePrototype ();
+	virtual ~TePrototype() {}
+
+// -- Virtual Constructor 
+	static T* clone ();
+
+//! Builds a new type (should be implemented by descendants)
+    virtual T* build () = 0;
+
+private:
+	static TePrototypePtr instance_;
+};
+
+// Initialisation of static variable
+template <class T>
+typename TePrototype<T>::TePrototypePtr TePrototype<T>::instance_;
+
+// Constructor
+template <class T>
+TePrototype<T>::TePrototype()
+{
+	// Put the object in the factory dictionary
+	instance_ = this;
+}
+
+// Virtual Constructor
+template <class T> 
+T*
+TePrototype<T>::clone ()
+{
+	return instance_->build();
+}
+
+#endif
+
diff --git a/src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp b/src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp
new file mode 100644
index 0000000..c79c901
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp
@@ -0,0 +1,1009 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeDatabase.h"
+#include "TeProgress.h"
+#include "TeSTElementSet.h"
+
+//////////////////////////////////////////////////////////////////////
+// Auxiliary Functions for construction strategies
+//////////////////////////////////////////////////////////////////////
+
+bool
+TeFindObjectCentroid (TeSTInstance& obj, TeGeomRep rep, TeCoord2D& p)
+{		
+		if(rep == TePOLYGONS)
+		{
+			TePolygonSet pols;
+			if(obj.getGeometry (pols))
+				p = TeFindCentroid (pols);
+			else
+				return false;
+		}
+		else if (rep == TeLINES)
+		{
+			TeLineSet lines;
+			if(obj.getGeometry (lines))
+				p = TeFindCentroid (lines);
+			else
+				return false;
+		}
+		else if (rep == TePOINTS)
+		{
+			TePointSet points;
+			if(obj.getGeometry (points))
+				p = TeFindCentroid (points);
+			else
+				return false;
+		}
+		else if (rep == TeCELLS)
+		{
+			TeCellSet cells;
+			if(obj.getGeometry (cells))
+				p = TeFindCentroid (cells);
+			else
+				return false;
+		}
+		return true;
+}
+
+bool
+TeFindObjectsCentroid (TeSTElementSet* objects, const string& object_id, TeGeomRep rep, TeCoord2D& p)
+{
+	if(rep==TePOLYGONS)
+	{
+		TePolygonSet polygons;
+		if(objects->getGeometry (object_id, polygons))
+				p = TeFindCentroid (polygons);
+
+	}
+	else if (rep==TeLINES)
+	{
+		TeLineSet lines;
+		if(objects->getGeometry (object_id, lines))
+			p = TeFindCentroid (lines);		
+	}
+	else if (rep==TePOINTS)
+	{
+		TePointSet points;
+		if(objects->getGeometry (object_id, points))
+			p = TeFindCentroid (points);					
+
+	}
+	else if (rep==TeCELLS)
+	{
+		TeCellSet cells;
+		if(objects->getGeometry (object_id, cells))
+			p = TeFindCentroid (cells);
+	}
+	return true;
+}
+
+
+bool  TeSelectEntryPoints (TeNodeSet  entry_set, map<string, string> entry_geom_map, TeGraphNetwork* net,
+						double max_dist, TeSTElementSet* objects, TeGeomRep rep, TeProxMatrixImplementation* imp)
+{
+
+	// Compute minimum path for all the new nodes/geometries near the network
+	// and connect the ones close enough
+	TeNodeSet::iterator it_node1 = entry_set.begin();
+	while ( it_node1 != entry_set.end())
+	{
+		vector<double> minimum_path;
+		if (net->minimumPath ((*it_node1), entry_set, minimum_path))
+		{
+		int j  = 0;
+		// Check maximum connection distance and connect selected objects
+		TeNodeSet::iterator it_node2 = entry_set.begin();
+		while ( it_node2 != entry_set.end())
+		{
+			// Get ids to simplify the code
+			string node1_id   = (*it_node1).objectId(); // Created Node id, nearest point to Geom1
+			string node2_id   = (*it_node2).objectId();	// Created Node id, nearest point to Geom1		
+			string object1_id = entry_geom_map[node1_id]; // Input Geom1 id
+			string object2_id = entry_geom_map[node2_id]; // Input Geom2 id
+
+			// Check identity and maximum allowed distance through the network
+	  		if ((object1_id != object2_id) && (minimum_path[j] <= max_dist))
+				{	
+					// Compute attributes and connect objects
+					TeProxMatrixAttributes attr;
+					
+					TeCoord2D p1, p2;
+					if (!TeFindObjectsCentroid (objects, object1_id, rep, p1))
+						return false;
+
+					if (!TeFindObjectsCentroid (objects, object2_id, rep, p2))
+						return false;
+				
+					// Local istance between input geometries
+					attr.CentroidDistance (TeDistance (p1, p2));
+
+					// Total distance from input geometries centroids to network
+					attr.NetworkObjectsDistance (TeDistance (p1, (*it_node1).location()) + 
+												 TeDistance (p2, (*it_node2).location()));	
+				
+					// Minimum path from the nodes relatives to the two geometries
+					attr.NetworkMinimumPath (minimum_path[j]);  
+			
+					imp->connectObjects (object1_id, object2_id, attr); // for networks, only one direction is connected
+				}
+			it_node2++;
+			j++;
+		}
+		}
+		it_node1++;
+	}
+	return true;
+}
+
+
+bool  TeSelectEntryPoints2 (TeNodeSet    entry_set1,
+						  TeNodeSet    entry_set2,
+						map<string, string> entry_geom_map,
+						TeGraphNetwork* net,
+						double max_dist, 
+						TeSTElementSet* objects1,
+						TeGeomRep rep1,
+						TeSTElementSet* objects2,
+						TeGeomRep rep2,
+						TeProxMatrixImplementation* imp)
+{
+
+	// Compute minimum path for all the new nodes/geometries near the network
+	// and connect the ones close enough
+	TeNodeSet::iterator it_node1 = entry_set1.begin();
+	while ( it_node1 != entry_set1.end())
+	{
+		vector<double> minimum_path;
+		net->minimumPath ((*it_node1), entry_set2, minimum_path); 
+		if (minimum_path.size() > 0)
+		{
+			int j  = 0;
+		// Check maximum connection distance and connect selected objects
+			TeNodeSet::iterator it_node2 = entry_set2.begin();
+			while ( it_node2 != entry_set2.end())
+			{
+			    // Get ids to simplify the code
+				string node1_id   = (*it_node1).objectId(); // Created Node id, nearest point to Geom1
+				string node2_id   = (*it_node2).objectId();	// Created Node id, nearest point to Geom1		
+				string object1_id = entry_geom_map[node1_id]; // Input Geom1 id
+				string object2_id = entry_geom_map[node2_id]; // Input Geom2 id
+	
+		
+				// Check identity and maximum allowed distance through the network
+	  			if ((object1_id != object2_id) && (minimum_path[j] <= max_dist))
+				{
+					
+					// Compute attributes and connect objects
+					TeProxMatrixAttributes attr;
+
+					TeCoord2D p1, p2;
+					if (!TeFindObjectsCentroid (objects1, object1_id, rep1, p1))
+						return false;
+
+					if (!TeFindObjectsCentroid (objects2, object2_id, rep2,  p2))
+						return false;
+		
+					// Local distance
+					attr.CentroidDistance (TeDistance (p1, p2));
+
+					// Total distance from input geometries centroids to network
+					attr.NetworkObjectsDistance (TeDistance (p1, (*it_node1).location()) + 
+												 TeDistance (p2, (*it_node2).location()));	
+				
+					// Minimum path from the nodes relatives to the two geometries
+					attr.NetworkMinimumPath (minimum_path[j]);  
+			
+					imp->connectObjects (object1_id, object2_id, attr); // for networks, only one direction is connected
+				}
+				it_node2++;
+				j++;
+			}
+		}
+		it_node1++;
+	}
+	return true;
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixConstructionStrategy 
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixConstructionStrategy::TeProxMatrixConstructionStrategy() : 
+	objects_(0), 
+	geomRep_(TeGEOMETRYNONE),
+	type_("")
+	{ } 
+
+TeProxMatrixConstructionStrategy::TeProxMatrixConstructionStrategy(TeSTElementSet*  objects, TeGeomRep geomRep, const string& type): 
+	objects_(objects), 
+	geomRep_(geomRep),
+	type_(type)
+	{ } 
+
+TeProxMatrixConstructionStrategy::TeProxMatrixConstructionStrategy (const TeProxMatrixConstructionStrategy& st)
+{
+	objects_ = st.objects_; 
+	geomRep_ = st.geomRep_;
+	type_ = st.type_;
+}
+
+void 
+TeProxMatrixConstructionStrategy::setSTObjects (TeSTElementSet*  objects, TeGeomRep  geomRep)
+{	
+	objects_ = objects; 
+	geomRep_ = geomRep; 
+}
+
+TeSTElementSet* 
+TeProxMatrixConstructionStrategy::objects() 
+{ 
+	return objects_; 
+}
+
+bool 
+TeProxMatrixConstructionStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+	return ((type_==other.type_) && 
+		((&objects_)==(&other.objects_)) && 
+		(geomRep_ == other.geomRep_)); 
+}
+
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixLocalAdjacencyStrategy 
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixLocalAdjacencyStrategy::TeProxMatrixLocalAdjacencyStrategy (bool calcDistance) : 
+		TeProxMatrixConstructionStrategy (0, TeGEOMETRYNONE, "LocalAdjacency"),
+		calcDistance_(calcDistance)	
+		{ }
+
+
+TeProxMatrixLocalAdjacencyStrategy::TeProxMatrixLocalAdjacencyStrategy (TeSTElementSet*  objects, TeGeomRep	geomRep, bool calcDistance):
+		TeProxMatrixConstructionStrategy (objects, geomRep, "LocalAdjacency"),
+		calcDistance_(calcDistance)	
+		{ }
+
+
+TeProxMatrixLocalAdjacencyStrategy::TeProxMatrixLocalAdjacencyStrategy (TeProxMatrixLocalAdjacencyStrategy& st):
+		TeProxMatrixConstructionStrategy (st)
+		{
+			calcDistance_ = st.calculateDistance();
+		}
+
+bool 
+TeProxMatrixLocalAdjacencyStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) 
+		return false;
+	int n = 0;
+
+	// Iterate over all selected objects, selecting their neighbours
+	TeSTElementSet::iterator itobj1 = objects_->begin();
+	
+	TeDatabase* db = objects_->theme()->layer()->database();
+	if(!db)
+		return false;
+
+	string		geomTable = objects_->theme()->layer()->tableName(geomRep_);
+	if(geomTable.empty())
+		return false;
+
+	//verify if the theme has collection
+	string collTable = ""; 
+	if(db->tableExist(objects_->theme()->collectionTable()))
+		collTable = objects_->theme()->collectionTable();
+
+	// ----- progress bar
+	int step = 0;
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(objects_->numElements());
+	// -----
+
+	TePrecision::instance().setPrecision(TeGetPrecision(objects_->theme()->layer()->projection()));
+		
+	while ( itobj1 != objects_->end())
+	{
+		// Get object1 id and representation
+		string object_id1 = (*itobj1).objectId();
+		n++;
+			
+		Keys IdsIn, IdsOut;
+		IdsIn.push_back(object_id1);
+
+		//spatial relation Touch
+		if(!db->spatialRelation(geomTable, geomRep_, IdsIn, IdsOut, TeINTERSECTS, collTable))
+		{
+			++itobj1;
+			continue;
+		}
+
+		for(unsigned int i=0; i<IdsOut.size(); i++)
+		{
+			string object_id2 = IdsOut[i];
+		
+			if ((object_id1 != object_id2) && (!imp->isConnected (object_id1,object_id2)) && 
+				(objects_->hasElement(object_id2)))
+			{
+				TeProxMatrixAttributes attr;
+
+				if(calcDistance_)
+				{
+
+					TeCoord2D p1, p2;
+					if (!TeFindObjectsCentroid (objects_, object_id1, geomRep_, p1))
+						return false;
+
+					if (!TeFindObjectsCentroid (objects_, object_id2, geomRep_,  p2))
+						return false;
+
+					attr.CentroidDistance (TeDistance (p1, p2)); 
+				}
+
+				imp->connectObjects (object_id2, object_id1, attr);
+				imp->connectObjects (object_id1, object_id2, attr);
+			}
+
+		}
+		++itobj1;
+
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+	}
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true; 
+}
+
+
+TeProxMatrixLocalAdjacencyStrategy& 
+TeProxMatrixLocalAdjacencyStrategy::operator= (const TeProxMatrixLocalAdjacencyStrategy& rhs)
+{
+	if ( this != &rhs )
+	{
+		type_ = rhs.type_;
+		objects_ = rhs.objects_;
+		geomRep_ = rhs.geomRep_;
+	}
+	return *this;
+}
+
+bool 
+TeProxMatrixLocalAdjacencyStrategy::operator== (const TeProxMatrixLocalAdjacencyStrategy& rhs) const   
+{ 
+	return (TeProxMatrixConstructionStrategy::IsEqual(rhs)); 
+}
+	
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixLocalDistanceStrategy 
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixLocalDistanceStrategy::TeProxMatrixLocalDistanceStrategy (double max_distance):
+		TeProxMatrixConstructionStrategy (0, TeGEOMETRYNONE, "LocalDistance"), 
+		max_distance_ (max_distance)
+		{ }
+
+
+TeProxMatrixLocalDistanceStrategy::TeProxMatrixLocalDistanceStrategy (TeSTElementSet*  objects, TeGeomRep geomRep, double max_distance): 
+		TeProxMatrixConstructionStrategy(objects, geomRep, "LocalDistance"),
+		max_distance_ (max_distance) 
+		{ }
+
+	
+TeProxMatrixLocalDistanceStrategy::TeProxMatrixLocalDistanceStrategy (const TeProxMatrixLocalDistanceStrategy& st): 
+		TeProxMatrixConstructionStrategy(st)
+{
+	max_distance_ = st.max_distance_;
+} 
+
+bool 
+TeProxMatrixLocalDistanceStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) 
+		return false;
+
+	TeDatabase* db = objects_->theme()->layer()->database();
+	if(!db)
+		return false;
+
+	string geomTable =  objects_->theme()->layer()->tableName(geomRep_);
+	if(geomTable.empty())
+		return true;
+	
+	//verify if the theme has restriction
+	string collTable = "";
+	if(objects_->theme()->hasRestriction())
+		collTable = objects_->theme()->collectionTable();
+	
+	// ----- progress bar
+	int step = 0;
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(objects_->numElements());
+	// -----
+	
+	TeSTElementSet::iterator itobj1 = objects_->begin();
+	while ( itobj1 != objects_->end())
+	{
+		// Get object1 id and representation
+		string object_id1 = (*itobj1).objectId();
+		
+		TeCoord2D p1; 
+		if (!TeFindObjectCentroid ((*itobj1), geomRep_, p1))
+			return false;
+	
+		KeysToDist result;
+		
+		//within distance
+		if(!db->withinDistance(geomTable, geomRep_, p1, result, max_distance_, collTable))
+		{
+			++itobj1;
+			continue;
+		}
+
+		KeysToDist::iterator it = result.begin();
+		while(it != result.end())
+		{
+			string object_id2 = it->first;
+
+			if ((object_id1 != object_id2) && (!imp->isConnected (object_id1,object_id2)) && 
+				(objects_->hasElement(object_id2)))
+			{
+				TeProxMatrixAttributes attr;
+				attr.CentroidDistance (it->second);
+				imp->connectObjects (object_id1, object_id2, attr);
+				imp->connectObjects (object_id2, object_id1, attr);
+			}
+
+			++it;
+		}
+
+		if(TeProgress::instance())
+		{
+
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+		++itobj1;
+	}
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+	
+bool 
+TeProxMatrixLocalDistanceStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+	return ((*this) == (TeProxMatrixLocalDistanceStrategy&) other); 
+}
+
+bool 
+TeProxMatrixLocalDistanceStrategy::operator== (const TeProxMatrixLocalDistanceStrategy& s) const 
+{
+	return ( TeProxMatrixConstructionStrategy::IsEqual(s) && 
+			(max_distance_ == s.max_distance_)); 
+}
+	
+TeProxMatrixLocalDistanceStrategy& 
+TeProxMatrixLocalDistanceStrategy::operator= (const TeProxMatrixLocalDistanceStrategy& rhs)
+{
+	if ( this != &rhs )
+	{
+		type_ = rhs.type_;
+		objects_ = rhs.objects_;
+		geomRep_ = rhs.geomRep_;
+		max_distance_ = rhs.max_distance_;
+	}
+	return *this;
+}
+
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixClosedNetworkStrategy 
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixClosedNetworkStrategy::TeProxMatrixClosedNetworkStrategy (TeSTElementSet*  objects,
+										TeGeomRep rep, double max_local_distance,
+										double max_net_distance, double  max_connection_distance, 
+										TeGraphNetwork* input_net) : 	
+	TeProxMatrixConstructionStrategy(objects, rep, "ClosedNetwork"),
+	max_local_distance_ (max_local_distance), 
+	max_net_distance_ (max_net_distance), 
+	max_connection_distance_ (max_connection_distance), 
+	net_ (input_net) 
+	{ }
+
+
+
+TeProxMatrixClosedNetworkStrategy::TeProxMatrixClosedNetworkStrategy (const TeProxMatrixClosedNetworkStrategy& rhs) :
+	TeProxMatrixConstructionStrategy(rhs)
+{
+		max_local_distance_ = rhs.max_local_distance_;
+		max_net_distance_ = rhs.max_net_distance_;
+		max_connection_distance_ = rhs.max_connection_distance_;
+		
+		TeGraphNetwork* n = new TeGraphNetwork();
+		*n = *rhs.net_; 
+		net_ = n;
+}
+
+	  
+bool 
+TeProxMatrixClosedNetworkStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) return false;
+
+	// Connect local neighbours, based on the Local Distance Strategy
+
+	TeProxMatrixLocalDistanceStrategy local(objects_, geomRep_, max_local_distance_);
+	local.Construct (imp);
+
+	// Connect neighbours through the network. The process is the following:
+	// 1. The nearest node (entry points) in the network for all the input geometries
+	//    are computed;
+	// 2. If the distance from the geometry centroid to the entry point is smaller than the maximum allowed, 
+	//    create a new node in the network corresponding to this entry point.
+	// 3. Compute the minimum path among all these new nodes (entry points).
+	// 4. For each pair of entry points, if the minimum path distance is smaller than the
+	//    maximum allowed, the corresponding geometries will be connected.
+
+	if (net_ == 0) return false;
+
+	map<string, string> entry_geom_map; // maps input geometries to network entry points
+	TeNodeSet entry_set; // entry points
+
+	// ----- progress bar
+	int step = 0;
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(objects_->numElements());
+	// -----
+
+	// Iterate over all objects and select the ones that are close enough to the network
+	TeSTElementSet::iterator itobj1 = objects_->begin();
+	while ( itobj1 != objects_->end())
+	{
+		// Get object1 id and representation
+		string object_id1 = (*itobj1).objectId();
+		TeCoord2D p1, p2; 
+			
+
+		int i = 0;
+		double min_distance = 0.;
+	
+		net_->nearestNodePoint (p1, i, p2, min_distance);
+				
+		TeNode node;
+		if ((min_distance <= max_net_distance_) && net_->getNode(i, node))
+		{
+			entry_geom_map[node.objectId()] = object_id1; // Associates geometry with closest net nodes
+			entry_set.add (node);  // This set will be used as initial points in the shortest path algorithm
+		}
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}
+		++step;
+		++itobj1;
+	}
+
+	TeSelectEntryPoints (entry_set, entry_geom_map, net_, max_connection_distance_, objects_, geomRep_, imp);
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+		
+	return true;
+}
+
+
+bool 
+TeProxMatrixClosedNetworkStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+	return (*this == (TeProxMatrixClosedNetworkStrategy&) other); 
+}
+	
+TeProxMatrixClosedNetworkStrategy& 
+TeProxMatrixClosedNetworkStrategy::operator= (const TeProxMatrixClosedNetworkStrategy& rhs)
+{
+	if (!(this==&rhs))
+	{
+		type_ = rhs.type_;
+		objects_ = rhs.objects_;
+		geomRep_ = rhs.geomRep_;
+		max_local_distance_ = rhs.max_local_distance_;
+		max_net_distance_ = rhs.max_net_distance_;
+		max_connection_distance_ = rhs.max_connection_distance_;
+	
+		TeGraphNetwork* n = new TeGraphNetwork(); 
+		*n = *rhs.net_; 
+		net_ = n;       
+	}
+	return (*this);
+}
+
+	
+bool 
+TeProxMatrixClosedNetworkStrategy::operator== (const TeProxMatrixClosedNetworkStrategy& other) const 
+{
+	return ( TeProxMatrixConstructionStrategy::IsEqual(other) &&
+			(max_local_distance_ == other.max_local_distance_) &&
+			(max_net_distance_ == other.max_net_distance_) &&
+			(max_connection_distance_ == other.max_connection_distance_));
+}
+	   
+//////////////////////////////////////////////////////////////////////
+// TeProxMatrixOpenNetworkStrategy 
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixOpenNetworkStrategy::TeProxMatrixOpenNetworkStrategy (TeSTElementSet*  objects, TeGeomRep rep, 
+										double max_local_distance, 
+										double	max_net_distance, double  max_connetion_distance, 
+										TeGraphNetwork* input_net) : 	
+	TeProxMatrixConstructionStrategy(objects, rep, "OpenNetwork"),
+	max_local_distance_ (max_local_distance), 
+	max_net_distance_ (max_net_distance), 
+	max_connection_distance_ (max_connetion_distance), 
+	net_ (input_net)
+	{ }
+
+
+TeProxMatrixOpenNetworkStrategy::TeProxMatrixOpenNetworkStrategy (const TeProxMatrixOpenNetworkStrategy& rhs): 
+	TeProxMatrixConstructionStrategy(rhs)
+{
+	max_local_distance_ = rhs.max_local_distance_;
+	max_net_distance_ = rhs.max_net_distance_;
+	max_connection_distance_ = rhs.max_connection_distance_;
+	
+	TeGraphNetwork* n = new TeGraphNetwork();
+	*n = *rhs.net_; 
+	net_ = n;
+}
+
+bool 
+TeProxMatrixOpenNetworkStrategy::Construct (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) 
+		return false;
+
+	// Connect local neighbours, based on the Local Distance Strategy
+	if (max_local_distance_ > 0)
+	{
+		TeProxMatrixLocalDistanceStrategy local(objects_, geomRep_, max_local_distance_);
+		local.Construct (imp);
+	}
+
+	// Connect neighbours through the network. The process is the following:
+	// 1. The nearest point (entry points) in the network for all the input geometries
+	//    are computed;
+	// 2. If the distance from the geometry centroid to the entry point is smaller than the maximum allowed, 
+	//    create a new node in the network corresponding to this entry point.
+	// 3. Compute the minimum path among all these new nodes (entry points).
+	// 4. For each pair of entry points, if the minimum path distance is smaller than the
+	//    maximum allowed, the corresponding geometries will be connected.
+	if (net_ == 0) 
+		return false;
+
+	map<string, string> entry_geom_map; // maps input geometries to network entry points
+	TeNodeSet entry_set; // entry points
+
+//	// ----- progress bar
+//	int step = 0;
+//	if(TeProgress::instance())
+
+//		TeProgress::instance()->setTotalSteps(objects_->numObjects());
+	// -----
+
+	// Iterate over all objects and select the ones that are close enough to the network
+	TeSTElementSet::iterator itobj1 = objects_->begin();
+	int id = 0;  // Nodes to be created will have sequential object_ids. 
+				 // The existing network nodes have object_id equal to their position
+	while ( itobj1 != objects_->end())
+
+	{
+		// Get object1 id and representation
+		string object_id1 = (*itobj1).objectId();
+		cout << object_id1 << "id " << id << endl;
+
+		TeCoord2D p1; 
+		if (!TeFindObjectCentroid ((*itobj1), geomRep_, p1))
+			return false;
+
+
+		int line_index;
+		TeCoord2D pinter;
+		double min_dist;
+
+		if (net_->nearestNetworkPoint (p1, line_index, pinter, min_dist))
+		{
+			if (min_dist < max_net_distance_)
+			{
+				TeNode new_node;
+				new_node.add (pinter);
+				new_node.objectId (Te2String (id));
+				id++;
+
+				net_->breakLineSet (new_node, line_index);
+				entry_geom_map[new_node.objectId()] = object_id1; // Associates geometry with closest net nodes
+				entry_set.add (new_node);  // This set will be used as initial points in the shortest path algorithm
+			}
+		}
+		++itobj1;
+/*		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+		*/
+	
+	}
+
+    TeLineSet lineSet = net_->getLineSet();
+    map<string, double> lineCosts =  net_->getLineCosts();
+	TeGraphNetwork net(lineSet, lineCosts);
+	TeSelectEntryPoints (entry_set, entry_geom_map, &net, max_connection_distance_, objects_, geomRep_, imp);
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+
+bool 
+TeProxMatrixOpenNetworkStrategy::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+	return ((*this)==(TeProxMatrixOpenNetworkStrategy&)other); 
+}
+
+bool 
+TeProxMatrixOpenNetworkStrategy::operator== (const TeProxMatrixOpenNetworkStrategy& other) const 
+{
+	return (TeProxMatrixConstructionStrategy::IsEqual(other) &&
+		(max_local_distance_ == other.max_local_distance_) &&
+		(max_net_distance_ == other.max_net_distance_) &&
+		(max_connection_distance_ == other.max_connection_distance_));
+}
+
+
+TeProxMatrixOpenNetworkStrategy& 
+TeProxMatrixOpenNetworkStrategy::operator= (const TeProxMatrixOpenNetworkStrategy& rhs)
+{
+	if (!(this==&rhs))
+	{
+		type_ = rhs.type_;
+		objects_ = rhs.objects_;
+		geomRep_ = rhs.geomRep_;
+		max_local_distance_ = rhs.max_local_distance_;
+		max_net_distance_ = rhs.max_net_distance_;
+		max_connection_distance_ = rhs.max_connection_distance_;
+	
+		TeGraphNetwork* n = new TeGraphNetwork(); 
+		*n = *rhs.net_;                           
+		net_ = n;								
+	}
+	return (*this);
+}
+
+
+/////////////////////////////////////////////////////////////////////
+// TeProxMatrixOpenNetworkStrategy2 
+//////////////////////////////////////////////////////////////////////
+
+TeProxMatrixOpenNetworkStrategy2::TeProxMatrixOpenNetworkStrategy2 (TeSTElementSet*  objects1, 
+										TeGeomRep rep1,
+										TeSTElementSet*  objects2, TeGeomRep rep2,
+										double max_local_distance, 
+										double	max_net_distance, double  max_connetion_distance, 
+										TeGraphNetwork* input_net) : 	
+	TeProxMatrixConstructionStrategy(objects1, rep1, "OpenNetwork2"),
+	objects2_ (objects2), 
+	geomRep2_(rep2),
+	max_local_distance_ (max_local_distance), 
+	max_net_distance_ (max_net_distance), 
+	max_connection_distance_ (max_connetion_distance), 
+	net_ (input_net)
+	{ }  
+
+TeProxMatrixOpenNetworkStrategy2::TeProxMatrixOpenNetworkStrategy2 (const TeProxMatrixOpenNetworkStrategy2& rhs)
+                    : TeProxMatrixConstructionStrategy(rhs)
+{
+	objects2_ = rhs.objects2_;
+	geomRep2_ = rhs.geomRep2_;
+	max_local_distance_ = rhs.max_local_distance_;
+	max_net_distance_ = rhs.max_net_distance_;
+	max_connection_distance_ = rhs.max_connection_distance_;
+	
+	TeGraphNetwork* n = new TeGraphNetwork();
+	*n = *rhs.net_; 
+	net_ = n;
+}
+
+
+bool 
+TeProxMatrixOpenNetworkStrategy2:: Construct (TeProxMatrixImplementation* imp)
+	{
+		if (imp == 0) 
+			return false;
+
+
+		// Connect neighbours through the network. The process is the following:
+		// 1. The nearest point (entry points) in the network for all the input geometries
+		//    are computed;
+		// 2. If the distance from the geometry centroid to the entry point is smaller than the maximum allowed, 
+		//    create a new node in the network corresponding to this entry point.
+		// 3. Compute the minimum path among all these new nodes (entry points).
+		// 4. For each pair of entry points, if the minimum path distance is smaller than the
+		//    maximum allowed, the corresponding geometries will be connected.
+		if (net_ == 0) 
+			return false;
+
+		map<string, string> entry_geom_map; // maps input geometries to network entry points
+
+	
+		int id = 0;  // Nodes to be created will have sequential object_ids. 
+					 // The existing network nodes have object_id equal to their position
+		// Iterate over all objects and select the ones that are close enough to the network
+
+		TeNodeSet entry_set1; // entry points
+		TeSTElementSet::iterator itobj1 = objects_->begin();	
+		while ( itobj1 != objects_->end())
+		{
+			// Get object1 id and representation
+			string object_id1 = (*itobj1).objectId();
+					cout << "object1 " << object_id1 << "id" << id << endl;
+
+			TeCoord2D p1; 
+			if (!TeFindObjectCentroid ((*itobj1), geomRep_, p1))
+				return false;
+		
+
+			int line_index;
+			TeCoord2D pinter;
+			double min_dist;
+
+			if (net_->nearestNetworkPoint (p1, line_index, pinter, min_dist))
+			{
+				if (min_dist < max_net_distance_)
+				{
+					TeNode new_node;
+					new_node.add (pinter);
+					new_node.objectId (Te2String (id));
+					id++;
+
+					net_->breakLineSet (new_node, line_index);
+					entry_geom_map[new_node.objectId()] = object_id1; // Associates geometry with closest net nodes
+					entry_set1.add (new_node);  // This set will be used as initial points in the shortest path algorithm
+				}
+			}
+			++itobj1;
+		}
+
+
+	// Iterate over all objects of interst (objects2) 
+		TeNodeSet entry_set2; // entry points
+		TeSTElementSet::iterator itobj2 = objects2_->begin();		
+		while ( itobj2 != objects2_->end())
+		{
+			// Get object1 id and representation
+			string object_id2 = (*itobj2).objectId();
+					cout << "object2 " << object_id2 << "id" << id << endl;
+
+			TeCoord2D p2; 
+			if (!TeFindObjectCentroid ((*itobj2), geomRep2_, p2))
+				return false;
+		
+			int line_index;
+			TeCoord2D pinter;
+			double min_dist;
+
+			if (net_->nearestNetworkPoint (p2, line_index, pinter, min_dist))
+			{ 
+				TeNode new_node;
+				new_node.add (pinter);
+				new_node.objectId (Te2String (id));
+				id++;
+
+				net_->breakLineSet (new_node, line_index);
+				entry_geom_map[new_node.objectId()] = object_id2; // Associates geometry with closest net nodes
+				entry_set2.add (new_node);  // This set will be used as initial points in the shortest path algorithm
+			}
+			++itobj2;
+		}
+
+        TeLineSet lineSet = net_->getLineSet();
+        map<string, double> lineCosts = net_->getLineCosts();
+		TeGraphNetwork net(lineSet, lineCosts);
+		TeSelectEntryPoints2 (entry_set1, entry_set2, entry_geom_map, &net, max_connection_distance_, 
+			objects_, geomRep_, objects2_, geomRep2_, imp);
+			return true;
+	}
+
+bool 
+TeProxMatrixOpenNetworkStrategy2::IsEqual (const TeProxMatrixConstructionStrategy& other) const
+{
+	return ((*this)==(TeProxMatrixOpenNetworkStrategy2&)other); 
+}
+
+bool 
+TeProxMatrixOpenNetworkStrategy2:: operator== (const TeProxMatrixOpenNetworkStrategy2& other) const 
+{
+
+	return ((type_==other.type_) &&
+		(max_local_distance_ == other.max_local_distance_) &&
+		(max_net_distance_ == other.max_net_distance_) &&
+		(max_connection_distance_ == other.max_connection_distance_));
+}
+
+TeProxMatrixOpenNetworkStrategy2& 
+TeProxMatrixOpenNetworkStrategy2:: operator= (const TeProxMatrixOpenNetworkStrategy2& rhs)
+{
+		if (!(this==&rhs))
+		{
+			type_ = rhs.type_;
+			objects_ = rhs.objects_;
+			objects2_ = rhs.objects2_;
+	
+			max_local_distance_ = rhs.max_local_distance_;
+			max_net_distance_ = rhs.max_net_distance_;
+			max_connection_distance_ = rhs.max_connection_distance_;
+		
+			TeGraphNetwork* n = new TeGraphNetwork(); 
+			*n = *rhs.net_;  
+			net_ = n;       
+		}
+		return (*this);
+}
+
+
diff --git a/src/terralib/kernel/TeProxMatrixConstructionStrategy.h b/src/terralib/kernel/TeProxMatrixConstructionStrategy.h
new file mode 100644
index 0000000..5cd98f9
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixConstructionStrategy.h
@@ -0,0 +1,284 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixConstructionStrategy.h
+    This file contains structures and definitions about construction strategies of proximity matrix 
+*/
+
+#ifndef TeProxMatrixConstructionStrategy_H
+#define TeProxMatrixConstructionStrategy_H
+
+#include "TeProxMatrixImplementation.h"
+#include "TeNetwork.h"
+
+class TeSTElementSet;
+
+
+//! An abstract class to representate construction strategies of proximity matrix   
+class TeProxMatrixConstructionStrategy  
+{
+
+protected:
+
+	//! Set of objetcs used to construct the matrix
+	TeSTElementSet*   objects_;
+
+	//! Geometry representation of the objects used to construct the matrix
+	TeGeomRep	geomRep_;
+
+	//! Type of the construction strategy
+	string		type_;
+
+	//! Construct
+	TeProxMatrixConstructionStrategy(); 
+
+	//! Construct
+	TeProxMatrixConstructionStrategy(TeSTElementSet*  objects, TeGeomRep geomRep, const string& type);
+
+	//! Copy construct
+	TeProxMatrixConstructionStrategy(const TeProxMatrixConstructionStrategy& st);
+
+public:
+
+	//! Construct the proximity matrix 
+	virtual bool Construct(TeProxMatrixImplementation*){return false;}
+
+	//! Destructor
+	virtual ~TeProxMatrixConstructionStrategy() {}
+
+	//! Return the type of the strategy
+	string Type() {return type_;}
+
+	//! Set the set of objects and its geometry representation
+	void setSTObjects (TeSTElementSet*  objects, TeGeomRep  geomRep); 
+	
+	//! Get the objects used to construct the matrix
+	TeSTElementSet* objects(); 
+
+	//! Get the geometry representation
+	TeGeomRep geomRep() { return geomRep_; }
+	
+	//! Verify if the type of the strategy, the object set and its geometry representation are equal
+	virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;  
+};
+
+
+//! A class to implement the local adjacency strategy of proximity matrix
+class TeProxMatrixLocalAdjacencyStrategy : public  TeProxMatrixConstructionStrategy
+{
+
+private:
+
+	//! If it must calculate or not the distance between neighbors
+	bool  calcDistance_;
+	
+public:
+
+	//! Constructor
+	TeProxMatrixLocalAdjacencyStrategy (bool calcDistance=false); 
+
+	//! Constructor
+	TeProxMatrixLocalAdjacencyStrategy (TeSTElementSet*  objects, TeGeomRep	geomRep, bool calcDistance=false);
+	
+	//! Copy constructor
+	TeProxMatrixLocalAdjacencyStrategy (TeProxMatrixLocalAdjacencyStrategy& st);  
+	 
+	 //! Destructor
+	virtual ~TeProxMatrixLocalAdjacencyStrategy() {}
+	
+	//! Construct the proximity matrix through local adjacency strategy 
+	virtual bool Construct (TeProxMatrixImplementation* imp);
+		
+	//! Equal operator 
+	bool operator== (const TeProxMatrixLocalAdjacencyStrategy& rhs) const;  
+	
+	//! Assignment operator 
+	TeProxMatrixLocalAdjacencyStrategy& operator= (const TeProxMatrixLocalAdjacencyStrategy& rhs); 
+
+	bool calculateDistance()
+	{ return calcDistance_; }
+};
+
+
+//! A class to implement the local distance strategy of proximity matrix
+class TeProxMatrixLocalDistanceStrategy : public  TeProxMatrixConstructionStrategy
+{
+private:
+	double			max_distance_;
+
+public:
+
+	//! Constructor
+	TeProxMatrixLocalDistanceStrategy (double max_distance = 0);
+	
+	//! Constructor
+	TeProxMatrixLocalDistanceStrategy (TeSTElementSet*  objects, TeGeomRep geomRep, double max_distance); 
+	
+	//! Copy constructor
+	TeProxMatrixLocalDistanceStrategy (const TeProxMatrixLocalDistanceStrategy& st); 
+	
+	//! Destructor
+	virtual ~TeProxMatrixLocalDistanceStrategy(){}
+	
+	//! Construct the proximity matrix through local distance strategy 
+	virtual bool Construct (TeProxMatrixImplementation* imp); 
+
+	//! Verify if is equal 
+	virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const;
+		
+	//! Equal operator 
+	bool operator== (const TeProxMatrixLocalDistanceStrategy& s) const; 
+		
+	//! Assignment operator
+	TeProxMatrixLocalDistanceStrategy& operator= (const TeProxMatrixLocalDistanceStrategy& rhs);
+
+};
+
+
+//! A class to implement the closed network strategy of proximity matrix
+class TeProxMatrixClosedNetworkStrategy : public  TeProxMatrixConstructionStrategy
+{
+private:
+	double	max_local_distance_;
+	double	max_net_distance_;
+	double  max_connection_distance_;
+
+
+	TeGraphNetwork*		net_;
+ 
+public:
+
+	//! Constructor
+	TeProxMatrixClosedNetworkStrategy (	TeSTElementSet*  objects, TeGeomRep rep, double max_local_distance,
+										double max_net_distance, double  max_connection_distance, 
+										TeGraphNetwork* input_net); 
+
+	//! Copy constructor
+	TeProxMatrixClosedNetworkStrategy (const TeProxMatrixClosedNetworkStrategy& rhs);
+		  
+	//! Destructor
+	virtual ~TeProxMatrixClosedNetworkStrategy()
+	{	
+		if(net_)
+			delete (net_); 
+	}
+
+	//! Construct the proximity matrix through closed network strategy 
+	virtual bool Construct (TeProxMatrixImplementation* imp); 
+	
+	//! Verify if is equal
+	virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const; 
+	
+	//! Assignment operator
+	TeProxMatrixClosedNetworkStrategy& operator= (const TeProxMatrixClosedNetworkStrategy& rhs);
+
+	//! Equal operator
+	bool operator== (const TeProxMatrixClosedNetworkStrategy& other) const;  
+
+	//! Get the objects used to construct the matrix
+	TeSTElementSet* objects() { return objects_; }
+};
+
+//! A class to implement the open network strategy of proximity matrix (among a set of objetcs)
+class TeProxMatrixOpenNetworkStrategy : public  TeProxMatrixConstructionStrategy
+{
+private:
+	double			max_local_distance_;
+	double			max_net_distance_;
+	double			max_connection_distance_;
+
+	TeGraphNetwork*		net_;
+public:
+
+	//! Constructor
+	TeProxMatrixOpenNetworkStrategy (	TeSTElementSet*  objects, TeGeomRep rep, double max_local_distance, 
+										double	max_net_distance, double  max_connetion_distance, 
+										TeGraphNetwork* input_net); 
+	//! Copy constructor
+	TeProxMatrixOpenNetworkStrategy (const TeProxMatrixOpenNetworkStrategy& rhs); 
+	
+	//! Destructor
+	virtual ~TeProxMatrixOpenNetworkStrategy()
+	{
+		if(net_)
+			delete (net_); 
+	}
+
+	//! Construct the proximity matrix through open network strategy
+	virtual bool Construct (TeProxMatrixImplementation* imp); 
+
+	//! Verify if is equal
+	virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const; 
+
+	//! Equal operator
+	bool operator== (const TeProxMatrixOpenNetworkStrategy& other) const; 
+	
+	//! Assignment operator
+	TeProxMatrixOpenNetworkStrategy& operator= (const TeProxMatrixOpenNetworkStrategy& rhs);
+};
+
+
+//! A class to implement the open network strategy of proximity matrix (relationships among objetc of two differnt sets)
+class TeProxMatrixOpenNetworkStrategy2 : public  TeProxMatrixConstructionStrategy
+{
+private:
+	TeSTElementSet*		objects2_;
+	TeGeomRep			geomRep2_;
+	double			max_local_distance_;
+	double			max_net_distance_;
+	double			max_connection_distance_;
+
+	TeGraphNetwork*		net_;
+public:
+
+	//! Constructor
+	TeProxMatrixOpenNetworkStrategy2 (	TeSTElementSet*  objects1, TeGeomRep rep1,
+										TeSTElementSet*  objects2, TeGeomRep rep2,
+										double max_local_distance, 
+										double	max_net_distance, double  max_connetion_distance, 
+										TeGraphNetwork* input_net); 
+	//! Copy constructor
+	TeProxMatrixOpenNetworkStrategy2 (const TeProxMatrixOpenNetworkStrategy2& rhs); 
+	
+	//! Destructor
+	virtual ~TeProxMatrixOpenNetworkStrategy2 ()
+	{
+		if(net_)
+			delete (net_); 
+	}
+
+	//! Construct the proximity matrix through open network strategy
+	virtual bool Construct (TeProxMatrixImplementation* imp); 
+
+	//! Verify if is equal
+	virtual bool IsEqual (const TeProxMatrixConstructionStrategy& other) const; 
+
+	//! Equal operator
+	bool operator== (const TeProxMatrixOpenNetworkStrategy2& other) const; 
+	
+	//! Assignment operator
+	TeProxMatrixOpenNetworkStrategy2& operator= (const TeProxMatrixOpenNetworkStrategy2& rhs);
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeProxMatrixImplementation.cpp b/src/terralib/kernel/TeProxMatrixImplementation.cpp
new file mode 100644
index 0000000..9a4f4ca
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixImplementation.cpp
@@ -0,0 +1,365 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeProxMatrixImplementation.h"
+
+#include <stdio.h>
+
+TeProxMatrixGraphBreymann:: TeProxMatrixGraphBreymann (TeProxMatrixGraphBreymann&  other) : TeProxMatrixImplementation(), graph_(false)
+{
+	type_ = other.type_;
+//	graph_ = other.graph_;
+	map_ = other.map_;
+}
+
+	
+
+TeProxMatrixGraphBreymann&
+TeProxMatrixGraphBreymann:: operator= (TeProxMatrixGraphBreymann& other)
+{
+	type_ = other.type_;
+//	graph_ = other.graph_;  
+	map_ = other.map_;
+	return (*this);
+}
+ 
+
+void 
+TeProxMatrixGraphBreymann::connectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr)
+{
+	int pos1 = graph_.insert (object_id1);
+	int pos2 = graph_.insert (object_id2);
+
+	graph_.connectVertices (pos1, pos2, attr);
+
+	map_[object_id1] = pos1;
+	map_[object_id2] = pos2;
+}
+
+
+bool 
+TeProxMatrixGraphBreymann::setConnectionAttributes (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr)
+{
+	return(graph_.setEdgeValue (object_id1, object_id2, attr));
+}
+
+bool 
+TeProxMatrixGraphBreymann::getConnectionAttributes (const string& object_id1, const string&object_id2, TeProxMatrixAttributes& attr)
+{
+	map_iterator pos1, pos2;
+
+	if ((pos1 = map_.find(object_id1)) == map_.end()) 
+		return false; // object_id1 not in the graph
+
+	if ((pos2 = map_.find(object_id2)) == map_.end()) 
+		return false; // object_id2 not in the graph
+
+	// Object_id1 neighbours iterator
+	br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+			start	= graph_[(*pos1).second].second.begin(),
+			end		= graph_[(*pos1).second].second.end();
+
+	while (start != end) 
+	{	
+		if ((*start).first == (*pos2).second) {
+				attr = (*start).second;
+				return true;
+		}
+		++start;
+	}
+	return false;		
+}
+
+bool 
+TeProxMatrixGraphBreymann::getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order )
+{
+	bool ret_value = getNeighboursNeighbours (object_id, neigh, max_order, 1);
+	neigh.Remove (object_id);
+	return ret_value;
+}
+
+bool 
+TeProxMatrixGraphBreymann::getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order, int current_order)
+{
+
+	map_iterator pos;
+
+	if ((pos = map_.find(object_id)) == map_.end()) 
+		return false; // object_id not in the graph
+
+	// Object_id1 neighbours iterator
+	br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+			start	= graph_[(*pos).second].second.begin(),
+			end		= graph_[(*pos).second].second.end();
+
+	// Insert all neighbours
+	while (start != end) 
+	{	
+		TeProxMatrixAttributes attr = (*start).second;
+		attr.Order (current_order); //Update attr attribute for that specific object
+		if (neigh.Insert (graph_[(*start).first].first, attr)) 
+		{
+				// Get neighbours of neighbours that were not inserted before
+			for (int recursive_loop = max_order - 1; recursive_loop > 0; --recursive_loop)
+				getNeighboursNeighbours (graph_[(*start).first].first, neigh, recursive_loop, ++current_order);
+	
+		}
+		++start;
+	}
+	return true;
+
+}
+
+
+bool
+TeProxMatrixGraphBreymann::getNeighbours (const string& object_id, TeNeighbours& neigh)
+{
+	map_iterator pos;
+
+	if ((pos = map_.find(object_id)) == map_.end()) 
+		return false; // object_id not in the graph
+
+	br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+			start	= graph_[(*pos).second].second.begin(),
+			end		= graph_[(*pos).second].second.end();
+
+	while (start != end) 
+	{
+		neigh.Insert (graph_[(*start).first].first, (*start).second);
+		++start;
+	}
+
+	return true;
+	
+}
+
+bool
+TeProxMatrixGraphBreymann::getNeighbours (int i, string& object_id, TeNeighbours& neigh)
+{
+
+	if (i > (int) graph_.size())
+		return false;
+
+	// find object_id
+	map_iterator pos = map_.begin();
+	while (pos != map_.end())
+	{
+		if ((*pos).second == i)
+		{
+			object_id = (*pos).first;
+			pos = map_.end();
+		}
+		else pos++;
+	}
+
+	br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+			start	= graph_[i].second.begin(),
+			end		= graph_[i].second.end();
+
+
+	while (start != end) 
+	{
+		neigh.Insert (graph_[(*start).first].first, (*start).second);
+		start++;
+	}
+
+	return true;
+	
+}
+
+
+
+TeProxMatrixImplementation* 
+TeProxMatrixGraphBreymann:: CreateCopy ()
+{
+	TeProxMatrixGraphBreymann* imp = new TeProxMatrixGraphBreymann (*this);
+	return imp;
+
+}
+
+void
+TeProxMatrixGraphBreymann:: List ()
+{
+
+	cout << "objetos proximos " << endl;
+	for (unsigned int j = 0; j < graph_.size(); j++)
+		cout << "objeto " << j << " id " << graph_[j].first << endl;
+
+
+	for (unsigned int i = 0; i < graph_.size(); i++)
+	{
+		if ((graph_[i].first == "13") || (graph_[i].first == "20") || 
+			(graph_[i].first == "36") ) /*|| (graph_[i].first == "C09L12") || 
+				(graph_[i].first == "C10L15") || (graph_[i].first == "C27L14") || 
+					(graph_[i].first == "C15L05"))*/
+
+		{
+			cout << "object: " << i << " id: " << graph_[i].first << endl;
+			cout << "vizinhos: " << endl;
+
+			br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+				start	= graph_[i].second.begin(),
+				end		= graph_[i].second.end();
+
+			while (start != end) 
+			{
+//				cout << "    " << graph_[(*start).first].first  << endl;
+				cout << "    " << graph_[(*start).first].first << " w " << (*start).second.Weight() << " d1 " << (*start).second.CentroidDistance()  << " d2 " << (*start).second.NetworkObjectsDistance()  << " d3 " << (*start).second.NetworkMinimumPath() << endl;
+				start++;
+			}
+			cout << endl;
+		}
+	}
+
+}
+
+
+bool
+TeProxMatrixGraphBreymann:: SaveTextFile (string& name)
+{
+	string complete_name = name + ".txt";
+
+	FILE*	fp = fopen(complete_name.c_str(),"w");
+	if (fp)
+	{
+		fprintf (fp, "Objetos conectados: %d\n", graph_.size() );
+	//	for (int j = 0; j < graph_.size(); j++)
+	//		fprintf (fp, "  %s%\n", graph_[j].first.c_str());
+		
+
+		for (unsigned int i = 0; i < graph_.size(); i++)
+		{
+
+			fprintf (fp, "%d --------------- object_id:  %s\n", i, graph_[i].first.c_str());
+			fprintf (fp,"  vizinhos:\n");
+
+			br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+				start	= graph_[i].second.begin(),
+				end		= graph_[i].second.end();
+			double sum = 0.0;
+			while (start != end) 
+			{
+				fprintf (fp, "%s S %d  W: %3.7f  D1:  %3.7f   D2: %3.7f   D3: %3.7f \n", graph_[(*start).first].first.c_str(), (*start).second.Slice(), (*start).second.Weight(),(*start).second.CentroidDistance() , (*start).second.NetworkObjectsDistance(),(*start).second.NetworkMinimumPath() );
+				sum += (*start).second.Weight();
+				start++;
+			}
+
+			fprintf (fp, "Weights sum: %3.7f\n", sum);
+			fprintf (fp, "end --------------- object_id:  %s\n\n", graph_[i].first.c_str());
+
+	
+		}
+		fclose (fp);
+		return true;
+	}
+	else return false;
+	
+	/*
+	FILE*	fp = fopen(name.c_str(),"w");
+	if (fp)
+	{
+		for (int i = 0; i < graph_.size(); i++)
+		{
+
+
+    		cout << "***********************" << graph_[i].first << endl;
+			br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+				start	= graph_[i].second.begin(),
+				end		= graph_[i].second.end();
+			double sum = 0.0;
+			while (start != end) 
+			{
+				cout << graph_[(*start).first].first << endl;
+				fprintf (fp, "%3.7f ",  (*start).second.CentroidDistance());
+				sum += (*start).second.Weight();
+				start++;
+			}
+
+			fprintf (fp, "\n");
+	
+		}
+		fclose (fp);
+		return true;
+	}
+	else return false;
+	*/
+}
+
+
+bool
+TeProxMatrixGraphBreymann:: SaveGALFile (string& name)
+{
+
+	string complete_name = name + ".gal";
+	FILE*	fp = fopen(complete_name.c_str(),"w");
+	if (fp)
+	{
+		fprintf (fp, "%d\n", graph_.size() ); // first line: number of elements in matrix
+		for (unsigned int i = 0; i < graph_.size(); i++)
+		{
+
+			fprintf (fp, "%s %d\n", graph_[i].first.c_str(), graph_[i].second.size());
+			br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+				start	= graph_[i].second.begin(),
+				end		= graph_[i].second.end();
+			while (start != end) 
+			{
+				fprintf (fp, "%s   %3.7f\n", graph_[(*start).first].first.c_str(), (*start).second.Weight() );
+				start++;
+			}
+			fprintf (fp, "\n");
+		}
+		fclose (fp);
+		return true;
+	}
+	else return false;
+	
+}
+
+
+bool
+TeProxMatrixGraphBreymann:: SaveGWTFile (string& name)
+{
+
+	string complete_name = name + ".gwt";
+	FILE*	fp = fopen(complete_name.c_str(),"w");
+	if (fp)
+	{
+		fprintf (fp, "%d\n", graph_.size() ); // first line: number of elements in matrix
+		for (unsigned int i = 0; i < graph_.size(); i++)
+		{
+			br_stl::Graph<string, TeProxMatrixAttributes>::Successor::iterator 
+				start	= graph_[i].second.begin(),
+				end		= graph_[i].second.end();
+			while (start != end) 
+			{
+				fprintf (fp, "%s %s\n", graph_[i].first.c_str(), graph_[(*start).first].first.c_str());
+				start++;
+			}
+		}
+		fclose (fp);
+		return true;
+	}
+	else return false;
+	
+}
diff --git a/src/terralib/kernel/TeProxMatrixImplementation.h b/src/terralib/kernel/TeProxMatrixImplementation.h
new file mode 100644
index 0000000..83350f8
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixImplementation.h
@@ -0,0 +1,210 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixImplementation.h
+    This file contains structures and definitions about different representations of proximity matrix 
+*/
+
+#ifndef TeProxMatrixImplementation_H
+#define TeProxMatrixImplementation_H
+
+#include "TeNeighbours.h"
+#include <graph.h>
+
+//! An abstract class to represent proximity matrix   
+class TeProxMatrixImplementation  
+{
+
+protected:
+	
+	//! Type of the representation
+	string type_;
+	
+	//! Empty constructor 
+	TeProxMatrixImplementation(){}
+
+public:
+
+	//! Verify if two objects are neighbour or connected
+	bool isConnected (const string& object_id1, const string& object_id2) 
+	{
+		TeProxMatrixAttributes attr; 
+		return getConnectionAttributes (object_id1, object_id2, attr);
+	}
+
+	//! Connect two objects
+	virtual void connectObjects (const string& /* object_id1 */, const string& /* object_id2 */, const TeProxMatrixAttributes& /* attr */){}
+
+	//! Disconnect two objects
+	virtual bool disconnectObjects (const string& /* object_id1 */, const string& /* object_id2 */) {return false;}
+
+	//! Remove an object
+	virtual bool removeObject (const string& /* object_id */)	{return false;}
+
+	//! Get connection attributes
+	virtual bool getConnectionAttributes (const string& /* object_id1 */, const string& /* object_id2 */, TeProxMatrixAttributes& /* attr */)	{return false;}
+
+	//! Set connection attributes
+	virtual bool setConnectionAttributes (const string& /* object_id1 */, const string& /* object_id2 */, const TeProxMatrixAttributes& /*attr*/) {return false;}
+
+	//! Get the neighbours of an object
+	virtual bool getNeighbours (const string& /* object_id */, TeNeighbours& /* neigh */)	{return false;}
+
+	//! Get the obj-th neighbour of an object 
+	virtual bool getNeighbours (int /* obj */, string& /* object_id */, TeNeighbours& /* neigh */) {return false;}  	
+
+	//! Get the neighbours of an object
+	virtual bool getNeighboursNeighbours (const string& /* object_id */, TeNeighbours& /* neigh */, int /* max_order */ = 2)	{return false;}
+
+	//! Return the number of objects
+	virtual int  NumberOfObjects () {return 0;}
+
+	//! Return the type of the representation 
+	string Type() {return type_;}
+
+	//! Create a copy
+	virtual TeProxMatrixImplementation* CreateCopy (){return 0;}
+	
+	//! Verify if is equal
+	virtual bool IsEqual (TeProxMatrixImplementation& other)
+	{
+		if (type_ == other.type_) 
+			return true; 
+		return false;
+	}
+
+	//! Equal operator
+	virtual bool operator== (const TeProxMatrixImplementation& /* other */) const { return true;}
+		
+	
+	//! Save the proximity matrix in a text file
+	virtual bool SaveTextFile (string& /* name */) {return false;}
+
+	//! Save the proximity matrix in a GAL format text file 
+	virtual bool SaveGALFile (string& /* name */){return false;}
+
+	//! Save the proximity matrix in a GWT format text file 
+	virtual bool SaveGWTFile (string& /* name */){return false;}
+
+	//! List the proximity matrix on command prompt
+	virtual void List (){}
+
+	//! Destructor
+	virtual ~TeProxMatrixImplementation(){}
+};
+
+
+//! A class to represent proximity matrix utilising the Breymann graph
+class TeProxMatrixGraphBreymann : public  TeProxMatrixImplementation
+{
+private:
+	string type_;
+	br_stl::Graph<string, TeProxMatrixAttributes> graph_;
+
+	typedef map<string, int> Object_id_map_type;
+	Object_id_map_type  map_;
+
+	typedef Object_id_map_type::iterator map_iterator;
+	typedef Object_id_map_type::const_iterator map_const_iterator;
+
+	bool getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order = 2, int current_order = 1);
+
+public:
+
+	//! Empty constructor
+	TeProxMatrixGraphBreymann () : graph_(true) //false means undirected graph, has to be true to allow normalization
+	{
+		type_ = "Breymann";
+	} 
+																	 
+	//! Copy constructor
+	TeProxMatrixGraphBreymann(TeProxMatrixGraphBreymann& imp);
+
+	//! Connect two objects
+	virtual void connectObjects (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr);
+	
+	//! Get connection attributes 
+	virtual bool getConnectionAttributes (const string& object_id1, const string& object_id2, TeProxMatrixAttributes& attr);
+	
+	//! Set connection attributes 
+	virtual bool setConnectionAttributes (const string& object_id1, const string& object_id2, const TeProxMatrixAttributes& attr);
+
+	//! Get the neighbours of an object
+	virtual bool getNeighbours (const string& object_id, TeNeighbours& neigh);
+
+	//! Get the obj-th neighbour of an object 
+	virtual bool getNeighbours (int obj, string& object_id, TeNeighbours& neigh); 
+	
+	//! Get the neighbours of an object
+	virtual bool getNeighboursNeighbours (const string& object_id, TeNeighbours& neigh, int max_order = 2);
+
+	//! Return the number of the objects
+	virtual int  NumberOfObjects () {return graph_.size();}
+
+	//! Create a copy
+	virtual TeProxMatrixImplementation* CreateCopy ();
+
+	//! Verify if is equal
+	virtual bool IsEqual (TeProxMatrixImplementation& other) 
+	{
+		if (type_ == other.Type()) 
+			return (*this == (TeProxMatrixGraphBreymann&)other); 
+		return false;
+	}
+
+	//! Assignment operator 
+	TeProxMatrixGraphBreymann& operator= (TeProxMatrixGraphBreymann& imp); 
+	
+	//! Destructor
+	virtual ~TeProxMatrixGraphBreymann() {}
+
+	//! Save the proximity matrix in a text file 
+	virtual bool SaveTextFile (string& name);
+
+	//! Save the proximity matrix in a GAL text file 
+	virtual bool SaveGALFile (string& name);
+
+	//! Save the proximity matrix in a GWT text file 
+	virtual bool SaveGWTFile (string& name);
+
+	//! List proximity matrix on command prompt
+	virtual void List ();
+};
+
+
+//! An abstract factory of proximity matrix representations  
+class TeProxMatrixAbstractFactory  
+{
+public:
+
+	static TeProxMatrixImplementation* MakeConcreteImplementation (const string impl_type = "BREYMANN")
+	{
+		if (impl_type ==  "Breymann") 
+				return new TeProxMatrixGraphBreymann;
+
+		return new TeProxMatrixGraphBreymann;
+	}
+	
+};
+
+#endif
diff --git a/src/terralib/kernel/TeProxMatrixSlicingStrategy.h b/src/terralib/kernel/TeProxMatrixSlicingStrategy.h
new file mode 100644
index 0000000..05b12f0
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixSlicingStrategy.h
@@ -0,0 +1,89 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixSlicingStrategy.h
+    This file contains structures and definitions about slicing strategies of proximity matrix 
+*/
+
+
+#ifndef TeProxMatrixSlicingStrategy_H
+#define TeProxMatrixSlicingStrategy_H
+
+#include "TeProxMatrixImplementation.h"
+
+
+//! An abstract class to representate slicing strategies of proximity matrix    
+class TeProxMatrixSlicingStrategy  
+{
+
+protected:
+	//! Empty constructor
+	TeProxMatrixSlicingStrategy() {}
+
+public:
+	//! Destructor
+	virtual ~TeProxMatrixSlicingStrategy() {}
+
+	//! Slice the proximity matrix 
+	virtual bool Slice(TeProxMatrixImplementation* /* imp */) {return true;}
+
+	//! Verify if is equal
+	virtual bool IsEqual (const TeProxMatrixSlicingStrategy& /* rhs */) const {return true;}
+
+};
+
+
+//! A class to implement the no slicing strategy of proximity matrix (i.e., all neighbour are considered to be in the first slice).
+class TeProxMatrixNoSlicingStrategy : public TeProxMatrixSlicingStrategy
+{
+public:
+
+	//! Empty constructor
+	TeProxMatrixNoSlicingStrategy () {}
+
+	//! No slice the proximity matrix 
+	virtual bool Slice(TeProxMatrixImplementation* /* imp */) {return true;}
+
+	//! Destructor
+	~TeProxMatrixNoSlicingStrategy() {}
+};
+
+
+//! A class to implement the zone slicing strategy of proximity matrix (by local or newtork connection distance);
+class TeProxMatrixZonesSlicingStrategy : public TeProxMatrixSlicingStrategy
+{
+	double dist_;
+	bool local_;
+public:
+
+	//! Constructor
+	TeProxMatrixZonesSlicingStrategy (double dist, bool local = true) {dist_ = dist; local_ = local;}
+
+	//! Slice the proximity matrix through zone strategy 
+	virtual bool Slice(TeProxMatrixImplementation* imp);
+
+	//! Destructor
+	~TeProxMatrixZonesSlicingStrategy() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeProxMatrixStrategies.cpp b/src/terralib/kernel/TeProxMatrixStrategies.cpp
new file mode 100644
index 0000000..65ff5a1
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixStrategies.cpp
@@ -0,0 +1,296 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeProxMatrixSlicingStrategy.h"
+#include "TeProxMatrixWeightsStrategy.h"
+
+
+// zone slicing strategy
+bool TeProxMatrixZonesSlicingStrategy::Slice (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) return false;
+
+	for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+	{
+		TeNeighbours neigh;
+		string object_id;
+		TeProxMatrixAttributes attr;
+		if (imp->getNeighbours (obj, object_id, neigh))
+		{
+			for (int i = 0; i < neigh.size(); i++)
+			{
+				attr = neigh.Attributes(i);
+		
+				double distance, d_centr, d_net, d_conn;
+
+				if (attr.WasCentroidDistanceComputed())
+					d_centr = attr.CentroidDistance();
+				else
+					d_centr = 0;
+				
+
+				if (attr.WasNetworkObjectsDistanceComputed())
+					d_net = attr.NetworkObjectsDistance();
+				else
+					d_net = 0;
+				
+
+				if (attr.WasNetworkMinimumPathComputed())
+					d_conn = attr.NetworkMinimumPath();
+				else
+					d_conn = 0;
+				
+			
+			   if (local_) 
+				   distance = d_centr;
+			   else
+				   distance = d_net + d_conn;
+
+			   int zone = (int) (distance/dist_);
+			   attr.Slice (zone);
+			   imp->setConnectionAttributes (object_id, neigh[i], attr);
+
+			}
+
+		}
+	}
+	return true;
+}
+
+
+// inverse distance weight strategy
+bool TeProxMatrixInverseDistanceStrategy:: 
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) return false;
+
+	for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+	{
+		TeNeighbours neigh;
+		string object_id;
+		TeProxMatrixAttributes attr;
+		if (imp->getNeighbours (obj, object_id, neigh))
+		{
+			double tot = 0.0;
+			vector<double> w_vec;
+	
+			for (int i = 0; i < neigh.size(); i++)
+			{
+				TeProxMatrixAttributes attr = neigh.Attributes(i);
+				double w = 1;
+				double d_centr, d_net, d_conn;
+				if (attr.WasCentroidDistanceComputed())
+					if ((d_centr = attr.CentroidDistance()) != 0.0) 
+							w += (a_)*1/d_centr;
+
+				if (attr.WasNetworkObjectsDistanceComputed())
+					if ((d_net = attr.NetworkObjectsDistance()) != 0.0) 
+							w += (b_)*1/d_net;
+
+				if (attr.WasNetworkMinimumPathComputed())
+					if ((d_conn = attr.NetworkMinimumPath()) != 0.0) 
+							w += (c_)*1/d_conn;
+
+				if (w != 1) w -= 1;
+
+				w_vec.push_back (w*factor_);
+				tot += w;
+			}
+	
+		
+			for (int j = 0; j < neigh.size(); j++)
+			{
+					TeProxMatrixAttributes attr = neigh.Attributes(j);
+					double w = w_vec[j];
+					if (norm_)
+						if (tot != 0) w = w/tot;
+					attr.Weight (w);
+					imp->setConnectionAttributes (object_id, neigh[j], attr);
+			}
+		}
+	}
+	return true;
+}
+
+
+
+// inverse distance weight strategy
+bool TeProxMatrixSquaredInverseDistanceStrategy:: 
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) return false;
+
+	for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+	{
+		TeNeighbours neigh;
+		string object_id;
+		TeProxMatrixAttributes attr;
+		if (imp->getNeighbours (obj, object_id, neigh))
+		{
+			double tot = 0.0;
+			vector<double> w_vec;
+	
+			for (int i = 0; i < neigh.size(); i++)
+			{
+				TeProxMatrixAttributes attr = neigh.Attributes(i);
+				double w = 1;
+				double d_centr, d_net, d_conn;
+				if (attr.WasCentroidDistanceComputed())
+					if ((d_centr = attr.CentroidDistance()) != 0.0) 
+							w += (a_)*1/(d_centr*d_centr);
+
+				if (attr.WasNetworkObjectsDistanceComputed())
+					if ((d_net = attr.NetworkObjectsDistance()) != 0.0) 
+							w += (b_)*1/(d_net*d_net);
+
+				if (attr.WasNetworkMinimumPathComputed())
+					if ((d_conn = attr.NetworkMinimumPath()) != 0.0) 
+							w += (c_)*1/(d_conn*d_conn);
+
+				if (w != 1) w -= 1;
+
+				w_vec.push_back (w*factor_);
+				tot += w;
+			}
+	
+		
+			for (int j = 0; j < neigh.size(); j++)
+			{
+					TeProxMatrixAttributes attr = neigh.Attributes(j);
+					double w = w_vec[j];
+					if (norm_)
+						if (tot != 0) w = w/tot;
+					attr.Weight (w);
+					imp->setConnectionAttributes (object_id, neigh[j], attr);
+			}
+		}
+	}
+	return true;
+}
+
+// inverse distance weight strategy
+bool TeProxMatrixConnectionStrenghtStrategy:: 
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) return false;
+
+	for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+	{
+		TeNeighbours neigh;
+		string object_id;
+		TeProxMatrixAttributes attr;
+		if (imp->getNeighbours (obj, object_id, neigh))
+		{
+			double tot = 0.0;
+			vector<double> w_vec;
+			
+			for (int i = 0; i < neigh.size(); i++)
+			{
+				TeProxMatrixAttributes attr = neigh.Attributes(i);
+				double w = 1;
+				double d_centr = TeMAXFLOAT;
+				double d_net =   TeMAXFLOAT;
+				double d_conn =  TeMAXFLOAT;
+
+				if (attr.WasCentroidDistanceComputed())
+					d_centr = attr.CentroidDistance();
+
+				
+				if (d_centr == 0.0)
+				{
+					w = 1;
+				}
+				else
+				{
+					if (d_centr <= max_local_distance_)
+					{
+						w = 1/d_centr;
+					}
+					else
+					{
+					
+						if (attr.WasNetworkObjectsDistanceComputed())
+							d_net = attr.NetworkObjectsDistance();
+
+						if (attr.WasNetworkMinimumPathComputed())
+							d_conn = attr.NetworkMinimumPath();
+
+						//double distance = (dist_ratio_*d_net + d_conn)/1000; Anap - Jul04
+						double distance = (dist_ratio_*d_net + d_conn);
+						if (distance != 0.0)
+							w = 1/distance;
+					}
+				}
+				//if (w > 1.0) w = 1.0; ANAP- Acho que n�o precisa: o objeto pode ser mais pr�ximo que 1 metro? jul04
+				w_vec.push_back (w*factor_);
+				tot += w;
+			}
+		
+			for (int j = 0; j < neigh.size(); j++)
+			{
+					
+				TeProxMatrixAttributes attr = neigh.Attributes(j);
+				double w = w_vec[j];
+				if (norm_)
+					if (tot != 0) w = w/tot;
+				attr.Weight (w);
+				imp->setConnectionAttributes (object_id, neigh[j], attr);
+				
+			}
+		}
+	}
+	return true;
+}
+
+
+
+bool TeProxMatrixNoWeightsStrategy:: 
+ComputeWeigths (TeProxMatrixImplementation* imp)
+{
+	if (imp == 0) return false;
+	// Normalize
+	if (norm_)
+	{
+		for (int obj = 0; obj < imp->NumberOfObjects(); obj++)
+		{
+			TeNeighbours neigh;
+			string object_id;
+			TeProxMatrixAttributes attr;
+			if (imp->getNeighbours (obj, object_id, neigh))
+			{
+	
+				for (int j = 0; j < neigh.size(); j++)
+				{
+					double size = (double) neigh.size();
+					double w = 1.0/size;
+					TeProxMatrixAttributes attr = neigh.Attributes(j);
+				
+					attr.Weight (w);
+					imp->setConnectionAttributes(object_id, neigh[j], attr);
+				}
+			}
+		}
+	}
+	return true;
+}
+
diff --git a/src/terralib/kernel/TeProxMatrixWeightsStrategy.h b/src/terralib/kernel/TeProxMatrixWeightsStrategy.h
new file mode 100644
index 0000000..d6dc65d
--- /dev/null
+++ b/src/terralib/kernel/TeProxMatrixWeightsStrategy.h
@@ -0,0 +1,154 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeProxMatrixWeightsStrategy.h
+    This file contains structures and definitions about weight strategies of proximity matrix 
+*/
+
+
+#ifndef TeProxMatrixWeightsStrategy_H
+#define TeProxMatrixWeightsStrategy_H
+
+#include "TeProxMatrixImplementation.h"
+#include <vector>
+
+
+//! An abstract class to representate weight strategies of proximity matrix    
+class TeProxMatrixWeightsStrategy  
+{
+protected:
+	bool norm_;
+
+	//! Constructor
+	TeProxMatrixWeightsStrategy(bool norm = false) { norm_ = norm; }
+
+public:
+	//! Compute weigths
+	virtual bool ComputeWeigths (TeProxMatrixImplementation* /* imp */) {return true;}
+
+	//! Destructor
+	virtual ~TeProxMatrixWeightsStrategy() {}
+
+	//! Verify if is equal
+	virtual bool IsEqual (const TeProxMatrixWeightsStrategy& /* rhs */) const {return true;}
+
+	//! Equal operator
+	virtual bool operator== (const TeProxMatrixWeightsStrategy& /* rhs */) const {return true;}
+
+};
+
+//! A class to implement the no weight strategy of proximity matrix (i.e., all weights are 1, only indicating that a connection exists).
+class TeProxMatrixNoWeightsStrategy : public TeProxMatrixWeightsStrategy
+{
+
+public:
+
+	//! Constructor
+	TeProxMatrixNoWeightsStrategy (bool norm = true) {norm_ = norm;}
+
+	//! Compute weigths
+	virtual bool ComputeWeigths (TeProxMatrixImplementation* imp);
+
+	//! Destructor
+	~TeProxMatrixNoWeightsStrategy() {}
+};
+
+
+//! A class to implement the inverse distance weight strategy of proximity matrix; if network distances were computed, they can be also considered.
+//! Formula: w = (a*1/dist_centroids + b*1/dist_to_net + c*1/dist_net_connection)*factor
+//! These values can be normalized or not.
+class TeProxMatrixInverseDistanceStrategy : public TeProxMatrixWeightsStrategy
+{
+private:
+	double a_;
+	double b_;
+	double c_;
+	double factor_;
+
+public:
+
+	//! Constructor
+	TeProxMatrixInverseDistanceStrategy  (double a = 1.0, double b = 1.0, double c = 1.0, double factor = 1.0, bool norm = true) : TeProxMatrixWeightsStrategy (norm)
+	{ a_ = a; b_ = b; c_ = c; factor_ = factor;}
+
+	//! Compute weights
+	virtual bool ComputeWeigths (TeProxMatrixImplementation* imp); 
+
+	//! Destructor	
+	~TeProxMatrixInverseDistanceStrategy() {}
+};
+
+
+//! A class to implement the inverse distance weight strategy of proximity matrix; if network distances were computed, they can be also considered.
+//! Formula: w = (a*1/(dist_centroids)2 + b*1/(dist_to_net)2 + c*1/(dist_net_connection)2)*factor
+//! These values can be normalized or not.
+class TeProxMatrixSquaredInverseDistanceStrategy : public TeProxMatrixWeightsStrategy
+{
+private:
+	double a_;
+	double b_;
+	double c_;
+	double factor_;
+
+public:
+
+	//! Constructor
+	TeProxMatrixSquaredInverseDistanceStrategy  (double a = 1.0, double b = 1.0, double c = 1.0, double factor = 1.0, bool norm = true) : TeProxMatrixWeightsStrategy (norm)
+	{ a_ = a; b_ = b; c_ = c; factor_ = factor;}
+
+	//! Compute weights
+	virtual bool ComputeWeigths (TeProxMatrixImplementation* imp); 
+
+	//! Destructor	
+	~TeProxMatrixSquaredInverseDistanceStrategy() {}
+};
+
+
+//! A class to implement the connection strenght weight strategy of proximity matrix
+//! If centroids distance is smaller them max_local_distance, w will be only the local distance inverse (multiplied by factor).
+//! otherwise, it will be w = 1/(dist_ratio*dist_to_net + dist_net_connection)*factor.
+class TeProxMatrixConnectionStrenghtStrategy : public TeProxMatrixWeightsStrategy
+{
+private:
+	double dist_ratio_;
+	double max_local_distance_;
+	double factor_;
+public:
+
+	//! Constructor
+	TeProxMatrixConnectionStrenghtStrategy  (double dist_ratio = 1.0, double max_local_distance = 0.0, double factor = 1.0, bool norm = true) 
+		: TeProxMatrixWeightsStrategy (norm)
+	{ 
+		dist_ratio_ = dist_ratio;
+		max_local_distance_ = max_local_distance;
+		factor_ = factor;
+	}
+
+	//! Compute weights
+	virtual bool ComputeWeigths (TeProxMatrixImplementation* imp); 
+
+	//! Destructor	
+	~TeProxMatrixConnectionStrenghtStrategy() {}
+};
+
+#endif 
diff --git a/src/terralib/kernel/TeQuerier.cpp b/src/terralib/kernel/TeQuerier.cpp
new file mode 100644
index 0000000..296de88
--- /dev/null
+++ b/src/terralib/kernel/TeQuerier.cpp
@@ -0,0 +1,146 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerier.h"
+#include "TeQuerierImpl.h"
+
+
+TeQuerier::TeQuerier(TeQuerierParams& params)
+{
+	Impl_ = TeQuerierImplFactory::make(params);
+}
+
+TeQuerier::~TeQuerier()
+{
+	if(Impl_)
+		delete (Impl_);
+}
+
+bool 
+TeQuerier::loadInstances(int frame)
+{
+	if(!Impl_)
+		return false;
+
+	return(Impl_->loadTimeFrameInstances(frame));
+}
+
+
+bool 
+TeQuerier::fetchInstance(TeSTInstance&  sto)
+{
+	if(!Impl_)
+		return false;
+
+	return(Impl_->fetchInstance(sto));
+}
+
+
+int 
+TeQuerier::getNumTimeFrames()
+{
+	if(!Impl_) 
+		return false;
+
+	return (Impl_->getNumTimeFrames());
+}
+
+bool 
+TeQuerier::getTSEntry(TeTSEntry& tsEntry, int frame)
+{
+	if(!Impl_) 
+		return false;
+
+	return(Impl_->getTSEntry(tsEntry, frame)); 
+}
+
+
+bool 
+TeQuerier::getTS(TeTemporalSeries& ts)
+{
+	if(!Impl_) 
+		return false;
+
+	return (Impl_->getTS(ts));
+}
+
+TeTheme* 
+TeQuerier::theme()
+{
+	if(!Impl_)
+		return 0;
+
+	return(Impl_->theme());
+}
+
+
+int 
+TeQuerier::numElemInstances()
+{
+	if(!Impl_)
+		return 0;
+
+	return (Impl_->numElemInstances());
+}
+
+TeQuerierParams& 
+TeQuerier::params() 
+{ 
+	return (Impl_->params()); 
+}
+
+TeTSParams& 
+TeQuerier::getTSParams() 
+{ 
+	return (Impl_->getTSParams()); 
+}
+
+void 
+TeQuerier::clear()
+{
+	if(!Impl_)
+		return;
+
+	Impl_->clear();
+}
+
+TeAttributeList
+TeQuerier::getAttrList()
+{
+	TeAttributeList temp;
+	if(!Impl_)
+		return temp;
+
+	return (Impl_->getAttrList());
+}
+
+void 
+TeQuerier::refresh(TeQuerierParams& params)
+{
+	if(Impl_)
+		delete (Impl_);
+	
+	Impl_ = TeQuerierImplFactory::make(params);
+}
+
+
diff --git a/src/terralib/kernel/TeQuerier.h b/src/terralib/kernel/TeQuerier.h
new file mode 100644
index 0000000..a328a4a
--- /dev/null
+++ b/src/terralib/kernel/TeQuerier.h
@@ -0,0 +1,94 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_H
+#define  __TERRALIB_INTERNAL_QUERIER_H
+
+#include "TeSTInstance.h"
+#include "TeTemporalSeries.h"
+
+class TeQuerierParams;
+class TeQuerierImpl; 
+
+//! A class to build spatial temporal instances (STInstance) from different sources 
+class TeQuerier
+{
+	
+	protected:
+		TeQuerierImpl*		Impl_;  //! handle/bory pattern
+		
+	public:
+		
+		//! Empty constructor
+		TeQuerier():
+			Impl_(0)
+			{} 
+			
+		//! Constructor
+		TeQuerier(TeQuerierParams& params);
+				
+		//! Destructor
+		~TeQuerier(); 
+		
+		//! Returns the theme
+		TeTheme* theme();
+		
+	 	//! Loads the STInstances. If frame>-1, loads only the instances of the frame-�simo frame 
+		bool loadInstances(int frame=-1);  
+		
+		//! Returns each spatial temporal instance 
+		bool fetchInstance(TeSTInstance&  sto);
+
+		//! Return the number of time frames generated by the chronon	
+		int getNumTimeFrames(); 
+
+		//! Gets each temporal serie entry, for each time frame
+		bool getTSEntry(TeTSEntry& tsEntry, int frame);
+		
+		//! Gets the full temporal serie
+		bool getTS(TeTemporalSeries& ts); 
+		
+		//! Returns the temporal serie params
+		TeTSParams& getTSParams();
+		
+		//! Gets the attribute list from querier
+		TeAttributeList getAttrList();
+
+		//! Returns the number of instances to each time frame
+		int numElemInstances(); 
+
+		//! Returns the querier parameters
+		TeQuerierParams& params(); 
+
+		//! Empties querier instances
+		void clear(); 
+
+		//! Refresh the querier based in new querier params
+		void refresh(TeQuerierParams& params); 
+};
+
+
+#endif 
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDB.cpp b/src/terralib/kernel/TeQuerierDB.cpp
new file mode 100644
index 0000000..808faed
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDB.cpp
@@ -0,0 +1,362 @@
+
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDB.h"
+#include "TeDatabase.h"
+#include "TeSTInstance.h"
+#include "TeTemporalSeries.h"
+
+
+// Add geometries from portal to STO 
+bool 
+addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable) 
+{
+	bool flag=false;
+	vector<int> geomIds;
+	
+	string ObjId;
+	if(geomTable.empty())
+		ObjId = "object_id";
+	else
+		ObjId = geomTable +".object_id";
+
+	do
+	{
+		int gId = portal->getInt("geom_id");
+		if(find(geomIds.begin(), geomIds.end(), gId) == geomIds.end())
+		{
+			geomIds.push_back(gId);
+			if(geomRep == TePOLYGONS)
+			{
+				TePolygon pol;
+				flag = portal->fetchGeometry(pol);
+				sto.addGeometry(pol);
+			}
+			else if (geomRep==TeLINES)
+			{
+				TeLine2D lin;
+				flag = portal->fetchGeometry(lin);
+				sto.addGeometry(lin);
+			}
+			else if (geomRep == TePOINTS)
+			{
+				TePoint point;
+				flag = portal->fetchGeometry(point);
+				sto.addGeometry(point);
+			}
+			else if (geomRep == TeCELLS)
+			{
+				TeCell cell;
+				flag = portal->fetchGeometry(cell);
+				sto.addGeometry(cell);
+			}
+		}
+		else
+			flag = portal->fetchRow();
+		
+	}while(flag && (string(portal->getData(ObjId)) == sto.objectId()));
+
+	return flag;
+}
+
+// Add geometries from portal to STO considering the time value
+bool
+addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable, 
+			TeTimeInterval time, const string& initalTimeName, const string& finalTimeName) 
+{
+	bool flag=false;
+	vector<int> geomIds;
+	TeTime t1 = time.getT1();
+	TeTime t2 = time.getT2();
+	string ObjId;
+	if(geomTable.empty())
+		ObjId = "object_id";
+	else
+		ObjId = geomTable +".object_id";
+		
+	do
+	{
+		int gId = portal->getInt("geom_id");
+		if(find(geomIds.begin(), geomIds.end(), gId) == geomIds.end())
+		{
+			geomIds.push_back(gId);
+			if(geomRep == TePOLYGONS)
+			{
+				TePolygon pol;
+				flag = portal->fetchGeometry(pol);
+				sto.addGeometry(pol);
+			}
+			else if (geomRep==TeLINES)
+			{
+				TeLine2D lin;
+				flag = portal->fetchGeometry(lin);
+				sto.addGeometry(lin);
+			}
+			else if (geomRep == TePOINTS)
+			{
+				TePoint point;
+				flag = portal->fetchGeometry(point);
+				sto.addGeometry(point);
+			}
+			else if (geomRep == TeCELLS)
+			{
+				TeCell cell;
+				flag = portal->fetchGeometry(cell);
+				sto.addGeometry(cell);
+			}
+		}
+		else
+			flag = portal->fetchRow();
+		
+	}while ( flag && 
+			 (string(portal->getData(ObjId)) == sto.objectId()) &&
+			 portal->getDate(initalTimeName) == t1 && 
+			 portal->getDate(finalTimeName) == t2 );
+
+	return flag;
+}
+
+
+TeQuerierDB::~TeQuerierDB() 
+{
+	for(unsigned int i=0; i<portals_.size(); ++i)
+		delete (portals_[i]);
+
+	portals_.clear();
+	geomRepr_.clear();
+}
+
+
+void
+TeQuerierDB::clearVectors()
+{
+	vector<TeDatabasePortal*>::iterator itPortal = portals_.begin();
+	while(itPortal!=portals_.end())
+	{		
+		delete (*itPortal);
+		++itPortal;
+	}
+	
+	portals_.clear();
+	geomRepr_.clear();
+	flagPortal_ = false;
+}
+
+void 
+TeQuerierDB::clear()
+{
+	clearVectors();
+}
+
+
+string 
+TeQuerierDB::sqlWhereRestrictions(TeRepresentation* rep)
+{
+	Keys objs;
+	string whereClause= " 1 = 1 ";
+	TeDatabase* db = params_.theme()->layer()->database();
+	if(!db)
+		return "";
+	
+	// load the first representation 
+	if(!rep)
+		rep = (params_.theme()->layer()->vectRepres())[0];
+
+	// spatial restriction with other geometry representation
+	if (params_.hasSpatialRes() && rep)
+	{
+		if(params_.boxRest().isValid())
+		{
+            TeBox b =  params_.boxRest();
+            TeGeomRep gRep = rep->geomRep_;
+			whereClause += " AND "+ db->getSQLBoxWhere(b, gRep);
+		}
+		else if(params_.geomRest())
+		{
+			string geomTableRest = params_.theme()->layer()->tableName(params_.geomRepRest());
+			TePrecision::instance().setPrecision(TeGetPrecision(params_.theme()->layer()->projection()));
+
+			if((db->spatialRelation(geomTableRest, params_.geomRepRest(), params_.geomRest(),  
+							   objs, params_.spatialRelation())) && (!objs.empty()))
+			{
+				string obs;
+				for(unsigned int i=0; i<objs.size(); i++)
+				{
+					if(i!=0)
+						obs += ",";
+					obs += "'"+ objs[i] +"'";
+				}
+				
+				whereClause += " AND "+ rep->tableName_ +".object_id IN ("+ obs +")";
+			}
+			else
+				whereClause += " AND 1 <> 1 "; // no geometry was found 
+
+		}
+	}
+
+	//selected objects
+	switch (params_.selectedObjs())
+	{
+		case TeAll:
+			break;
+		
+		case TeSelectedByPointing:
+			whereClause += " AND (grid_status = 1 OR grid_status = 3";
+			whereClause += " OR (grid_status IS NULL AND (c_object_status = 1 OR c_object_status = 3)))";
+			break;
+		
+		case TeNotSelectedByPointing:
+			whereClause += " AND (grid_status = 0 OR grid_status = 2";
+			whereClause += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+			break;
+		
+		case TeSelectedByQuery:
+			whereClause += " AND (grid_status = 2 OR grid_status = 3";
+			whereClause += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+			break;
+		
+		case TeNotSelectedByQuery:
+			whereClause += " AND (grid_status = 0 OR grid_status = 1";
+			whereClause += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+			break;
+	
+		case TeGrouped:
+			whereClause += " AND c_legend_id <> 0";
+			break;
+
+		case TeNotGrouped:
+			whereClause += " AND c_legend_id = 0";
+			break;
+	}
+
+	return whereClause;
+}
+
+
+string 
+TeQuerierDB::sqlFrom(string geomTable)
+{
+	string fromPar = "";
+	string fromClause = "";
+	
+	//get collection tables 
+	string collAuxTable = params_.theme()->collectionAuxTable();
+	string collTable = params_.theme()->collectionTable();
+
+	if(attrTable_.name().empty() || collAuxTable.empty() || collTable.empty())
+		return "";
+	
+	string uniqueIdName = attrTable_.name() +"."+ attrTable_.uniqueName(); 
+	string linkName; 
+	if(attrTable_.tableType() != TeAttrExternal)
+		linkName = attrTable_.name() +"."+ attrTable_.linkName(); 
+	else
+		linkName = collTable +".c_object_id "; 
+
+	//load geometry table if there is spatial restriction
+	if(geomTable.empty() && params_.hasSpatialRes())
+	{
+		TeRepresentation* rep = (theme()->layer()->vectRepres())[0];
+		geomTable = theme()->layer()->tableName(rep->geomRep_);
+	}
+
+	//get the extern table position 
+	int posExtern = -1;
+	TeAttrTableVector attr = params_.theme()->attrTables();
+	for(unsigned int i=0; i<attr.size(); ++i)
+	{
+		if(attr[i].tableType() == TeAttrExternal)
+			++posExtern;
+	}
+	
+	//if the table is temporal   
+	if((attrTable_.tableType()==TeAttrEvent) || (attrTable_.tableType()==TeFixedGeomDynAttr))
+	{
+		fromPar += "(";
+		fromClause = attrTable_.name()+" RIGHT JOIN "+ collAuxTable; 
+		fromClause += " ON "+ uniqueIdName +" = "; 
+		
+		if(attrTable_.tableType()==TeFixedGeomDynAttr)
+			fromClause += collAuxTable +".aux0 )";
+		else
+			fromClause += collAuxTable +".unique_id )";
+		
+		if(!geomTable.empty())
+		{
+			fromPar += "(";
+			fromClause += " LEFT JOIN "+ geomTable +" ON ";
+			fromClause += collAuxTable +".object_id = "+ geomTable +".object_id )";
+		}
+
+		if(params_.selectedObjs() != TeAll) //! join with collection table
+		{
+			fromPar += "(";
+			fromClause += " LEFT JOIN "+ collTable +" ON ";
+			fromClause += collAuxTable +".object_id = "+ collTable +".c_object_id )";
+		}
+	} 
+
+	else if (attrTable_.tableType()==TeAttrStatic)
+	{
+		fromPar += "(";
+		fromClause =  attrTable_.name()+" RIGHT JOIN "+ collTable; 
+		fromClause += " ON "+ linkName +" = "+ collTable +".c_object_id)";
+
+		if(!geomTable.empty()) //! join with geometry table
+		{
+			fromPar += "(";
+			fromClause += " LEFT JOIN "+ geomTable +" ON ";
+			fromClause += collTable +".c_object_id = "+ geomTable +".object_id )";
+		}
+
+		if(params_.selectedObjs() != TeAll) //! join with collection table
+		{
+			fromPar += "(";
+			fromClause += " LEFT JOIN "+ collAuxTable +" ON ";
+			fromClause += collTable +".c_object_id = "+ collAuxTable +".object_id )";
+		}
+	}
+	else if (attrTable_.tableType()==TeAttrExternal)
+	{
+		fromPar += "((";
+		fromClause = collAuxTable +" RIGHT JOIN "+ collTable; 
+		fromClause += " ON "+ collAuxTable +".object_id = "+ collTable +".c_object_id )";
+		fromClause += " LEFT JOIN "+ attrTable_.name() +" ON ";
+		fromClause +=  collAuxTable +".aux"+ Te2String(posExtern) +" = ";
+		fromClause +=  uniqueIdName +" )";
+
+		if(!geomTable.empty()) //! join with geometry table
+		{
+			fromPar += "(";
+			fromClause += " LEFT JOIN "+ geomTable +" ON ";
+			fromClause += collTable +".c_object_id = "+ geomTable +".object_id )";
+		} 
+	}
+		
+	return (fromPar+fromClause);
+}
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDB.h b/src/terralib/kernel/TeQuerierDB.h
new file mode 100644
index 0000000..4ae63e9
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDB.h
@@ -0,0 +1,91 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_DB_H
+#define  __TERRALIB_INTERNAL_QUERIER_DB_H
+
+#include "TeQuerierImpl.h"
+
+class TeDatabasePortal;
+class TeTimeInterval;
+class TeTSEntry;
+
+
+//! auxiliary functions to add geometries in the sto 
+bool addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable = ""); 
+bool addGeometry(TeDatabasePortal* portal, TeGeomRep geomRep, TeSTInstance& sto, const string& geomTable, 
+					TeTimeInterval time, const string& initalTimeName, const string& finalTimeName);  
+
+
+//! An abstract class to build STOs (Spatial Temporal Objects) from a TerraLib database 
+class TeQuerierDB : public TeQuerierImpl
+{
+	protected:
+
+		vector<TeDatabasePortal*>	portals_;		//! a portal to each geometry representation
+		vector<TeRepresentation>	geomRepr_;		//! keep the geometry representation of each portal 
+		TeTable						attrTable_;		//! internal information used to fill the stos
+		bool						flagPortal_;	//! flag to control the portal 
+				
+		//! clear internal vectors
+		void clearVectors(); 
+
+		//! Return a where clause in SQL that represent the querier restrictions
+		string sqlWhereRestrictions(TeRepresentation* rep=0);
+
+		//! Build the sql from clause
+		string sqlFrom(string geomTable="");
+		
+	public:
+		
+		//! Constructor
+		TeQuerierDB(TeQuerierParams& params): TeQuerierImpl(params), flagPortal_(false) 
+		{}
+		
+		//! Destructor 
+		virtual ~TeQuerierDB();  
+		
+		//! Returns the pointer to the theme 
+		TeTheme* theme() {	return params_.theme();	}
+
+		//! Returns the pointer to the layer 
+		TeLayer* layer() {	return  params_.theme()->layer(); }
+
+		//! Returns the geometry representation of the theme
+		TeGeomRep geometryRep() 
+		{  return TeGeomRep(params_.theme()->layer()->geomRep()); }
+
+		//! Loads the STOs
+		virtual bool loadInstances(TeTSEntry* ent=0) = 0;  
+		
+		//! Returns each loaded STO
+		virtual bool fetchInstance(TeSTInstance& stoi)= 0; 
+
+		//! Empties querier instances
+		void clear(); 
+
+		
+};
+
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierDBStr1.cpp b/src/terralib/kernel/TeQuerierDBStr1.cpp
new file mode 100644
index 0000000..3109c59
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr1.cpp
@@ -0,0 +1,1018 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDBStr1.h"
+#include "TeDatabase.h"
+#include "TeTemporalSeries.h"
+#include "TeSTInstance.h"
+
+bool 
+TeQuerierDBStr1::initPortal(TeRepresentation& rep, TeTSEntry* ent)
+{
+	string selectClause, fromClause, whereClause, orderByClause, groupByClause, parClause;
+	TeDatabase* db = params_.theme()->layer()->database();
+	isGroup_ = false;
+
+	//verify if the theme has collection table
+	bool hasCollTable = false;
+	if(db->tableExist(params_.theme()->collectionAuxTable()))
+		hasCollTable = true;
+	
+	clearVectors();
+	params_.setLoadAttrs(params_.loadSetedAttrs()); //the original data
+	
+	//get the link name 
+	string sqlGroup =""; 
+	if(hasCollTable && (!params_.hasSpatialRes()) && (!params_.loadGeom()))
+	{
+		linkName_ = params_.theme()->collectionTable() +".c_object_id";
+		sqlGroup = linkName_;
+	}
+	else  //has spatial restriction  
+	{
+		linkName_ = rep.tableName_ +".object_id"; 
+		sqlGroup = linkName_ +","+ rep.tableName_ +".geom_id";
+		geomRepr_.push_back(rep);
+	}
+
+	// order by clause
+	orderByClause = " ORDER BY "+ sqlGroup;
+
+	//verify if will be group the objects	
+	TeGroupingAttr groups = params_.groupAttr();  
+	bool groupAttr = !(groups.empty());
+	
+	// ---------------------------------------------  Mount SQL
+	
+	// --------- begin attributes
+
+	// load only the attribute that will be grouped
+	if(groupAttr)
+	{
+		if(!params_.loadGeom())
+		{
+			string sGroup = db->getSQLStatistics(groups);
+			isGroup_ = true;
+			TeGroupingAttr::iterator it = groups.begin();
+			while(it!= groups.end())
+			{
+				if(it->second != TeNOSTATISTIC)
+					isGroup_ = false;
+				++it;
+			}
+
+			if(isGroup_)
+			{
+				selectClause  = sGroup;
+				orderByClause = "";
+			}
+			
+			//if there is a spatial restriction, group every objects
+			if(!params_.hasSpatialRes())
+				groupByClause = " GROUP BY "+ linkName_;
+		}
+
+		if(!isGroup_)  
+		{
+			//group attributes in memory
+			groupInMemory_ = true;
+			//fill select clause from set of attributes
+			string lastAttr = "";
+			TeGroupingAttr::iterator it = groups.begin(); 
+			while(it!= groups.end())
+			{
+				if(lastAttr != it->first.name_)
+				{
+					if(it != groups.begin())
+						selectClause += ",";
+
+					selectClause += it->first.name_;
+				}
+				
+				lastAttr = it->first.name_;
+				++it;
+			}
+		}
+	}
+	// load all attributes or the attributes that are in the vector
+	else
+	{
+			//get attribute tables
+		TeAttrTableVector atts; 
+		params_.theme()->getAttTables(atts); 
+		if(atts.empty() && (params_.loadAllAttr() || (!params_.loadAttrs().empty())))
+			return false;
+			
+		// get some information about the attribute tables required
+		for(unsigned int i=0; i<atts.size(); i++)
+		{
+			string initialTime, finalTime;
+
+			if((atts[i].tableType()==TeAttrEvent) || (atts[i].tableType()==TeFixedGeomDynAttr))
+			{
+				attrTable_ = atts[i]; 
+				initialTime = attrTable_.attInitialTime();
+				finalTime = attrTable_.attFinalTime();
+			}
+		
+			// fill vector of unique name 
+			string unName = TeConvertToUpperCase(atts[i].uniqueName());
+			string unNameT = TeConvertToUpperCase(atts[i].name()+"."+atts[i].uniqueName());
+			uniqueNames_.push_back(unName);
+			uniqueNames_.push_back(unNameT);
+
+			//fill vector of attributes and sql string with all attributes
+			if(params_.loadAllAttr())
+			{
+				TeAttributeList::iterator itAttr = atts[i].attributeList().begin();
+				while(itAttr!= atts[i].attributeList().end())
+				{
+					string attribute = atts[i].name() +"."+ (*itAttr).rep_.name_;
+					params_.loadAttrs().push_back(attribute);
+					params_.loadAttrs().push_back((*itAttr).rep_.name_);
+				
+					//select clause
+					if(!selectClause.empty())
+						selectClause += ", ";
+					selectClause += attribute; 
+
+					++itAttr;
+				}
+			}
+			//only fill the sql string with the attributes of the TeSTInstance
+			else // make sure the unique and temporal columns are retrieved
+			{
+				string un = atts[i].name()+"."+ atts[i].uniqueName();
+				if (find(params_.loadAttrs().begin(), params_.loadAttrs().end(), un) == params_.loadAttrs().end())
+				{
+					if(!selectClause.empty())
+						selectClause += ", ";
+					selectClause += un;
+				}
+
+				string ini = atts[i].name()+"."+initialTime;
+				if (!initialTime.empty() && (find(params_.loadAttrs().begin(), params_.loadAttrs().end(), ini) == params_.loadAttrs().end()))
+				{
+					if(!selectClause.empty())
+						selectClause += ", ";
+					selectClause += ini;
+				}
+
+				string fin = atts[i].name()+"."+finalTime;
+				if	(!finalTime.empty() &&  initialTime != finalTime && 
+					(find(params_.loadAttrs().begin(), params_.loadAttrs().end(), fin) == params_.loadAttrs().end()))
+				{
+					if(!selectClause.empty())
+						selectClause += ", ";
+					selectClause += fin;
+				}
+			}
+		}
+
+		if(!params_.loadAllAttr())
+		{
+			vector<string>  newNames;
+			vector<string>::iterator itVec = params_.loadAttrs().begin();
+			while(itVec!=params_.loadAttrs().end())
+			{
+				//insert in select clause
+				if(!selectClause.empty())
+						selectClause += ", ";
+				selectClause += (*itVec);
+			
+				//insert in the attribute name vector without table name
+				size_t pos = (*itVec).find(".", string::npos,1);
+				if (pos != string::npos)
+				{
+					string newNam = (*itVec).substr(pos+1);
+					newNames.push_back(newNam);
+				}
+				++itVec;
+			}
+
+			itVec = newNames.begin();
+			while(itVec!=newNames.end())
+			{
+				params_.loadAttrs().push_back(*itVec);
+				++itVec;
+			}
+		}
+	}
+	
+	// selecionar o campo de data tamb�m
+	if(groupInMemory_ && params_.loadGeom() && (!attrTable_.name().empty()))
+	{
+		selectClause += ", "+ attrTable_.name()+"."+attrTable_.attInitialTime();
+		if(attrTable_.attInitialTime()!=attrTable_.attFinalTime())
+			selectClause += ", "+ attrTable_.name()+"."+attrTable_.attFinalTime();
+	}
+
+	// --------- end attributes
+
+
+	// --------- begin geometry
+
+	if(!selectClause.empty())
+		selectClause += ", ";
+
+	// select com todos os campos da tabela de geometria
+	if(params_.loadGeom())
+	{
+		TeTable table;
+		if(!db->loadTable(rep.tableName_, table))
+			return false; 
+
+		vector<string> attrs; 
+		table.attributeNames(attrs); 
+		for(unsigned int i=0; i<attrs.size(); ++i)
+		{
+			if(i>0)
+				selectClause += ",";
+			selectClause += rep.tableName_+"."+ attrs[i];
+		}
+
+		// order by clause
+		if((rep.geomRep_ == TePOLYGONS) && (db->dbmsName() != "OracleSpatial") && (db->dbmsName() != "PostGIS") )
+			orderByClause += ", parent_id ASC, num_holes DESC";
+
+	}
+	// select apenas com object_id e geom_id
+	else if(isGroup_)
+	{
+		if(params_.hasSpatialRes())
+			selectClause += " MIN("+ linkName_ +") AS terraObjId, MIN("+ rep.tableName_ +".geom_id) AS geom_id ";
+		else
+			selectClause += " MIN("+ linkName_ +") AS terraObjId "; 
+
+		linkName_ = "terraObjId";
+	}
+	else
+		selectClause += sqlGroup;
+		
+	// --------- end geometry
+		
+	// --------- begin restrictions
+	if(!hasCollTable)
+	{
+		TeAttrTableVector atts; 
+		params_.theme()->getAttTables(atts); 
+
+		if(atts.empty())
+			return false;
+
+		fromClause = " FROM " + tableJoin(atts, rep.tableName_, "object_id");
+		whereClause = params_.theme()->sqlWhereRestrictions(&rep);
+	}
+	else
+	{
+		if(params_.loadGeom() || params_.hasSpatialRes()) 
+			fromClause = params_.theme()->sqlGridFrom(rep.tableName_);
+		else
+			fromClause = params_.theme()->sqlGridFrom();
+	}
+				
+
+	if(ent)
+	{
+		if(attrTable_.name().empty())
+			params_.theme()->getTemporalTable(attrTable_);
+
+		string iniTime = attrTable_.name()+"."+attrTable_.attInitialTime(); 
+		string finTime = attrTable_.name()+"."+attrTable_.attFinalTime(); 
+		if(!whereClause.empty())
+			whereClause += " AND ";
+
+		if ((params_.chronon()==TeMONTHOFYEAR) || (params_.chronon()==TeDAYOFWEEK))
+			whereClause += db->getSQLTemporalWhere(ent->timeInt_, ent->timeInt_, params_.chronon(), TeTIMEDURING, iniTime, finTime);    
+		else
+		{
+			TeTimeInterval interval = ent->time_;
+			interval.intervalChronon(params_.chronon());
+
+			whereClause += db->getSQLTemporalWhere(interval, TeTIMEDURING, iniTime, finTime);
+		}
+	}
+
+	// --------- end restrictions
+
+	//where clause
+	if(!objectId().empty())
+	{
+		if(!whereClause.empty())
+			whereClause += " AND ";
+		
+		whereClause += linkName_ +" = '"+ objectId() +"'";  
+	}
+
+
+	//---------- querier restriction
+	string sqlQuerierRest = sqlWhereRestrictions(&rep);
+	if(!whereClause.empty())
+		whereClause += " AND ";
+
+	whereClause += sqlQuerierRest;
+
+	//----------
+
+	string sql = "SELECT "+ selectClause + fromClause;
+	if(!whereClause.empty())
+		sql += " WHERE "+ whereClause;
+	
+	if(!groupByClause.empty())
+		sql += " "+ groupByClause;
+	else
+		sql += orderByClause;
+	
+	// --------- Submit the query
+	portals_.clear();
+	TeDatabasePortal* portal = db->getPortal();
+	
+	if(!portal)
+		return false;
+	
+	if(!portal->query(sql))
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	string id = portal->getData(linkName_);
+	if(id.empty())
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	portals_.push_back (portal);
+	flagPortal_ = true;
+	lastObjId_ ="";
+	return true;
+}
+
+
+bool 
+TeQuerierDBStr1::initGeomPortal(TeRepresentation& rep, TeTSEntry* ent)
+{
+	string selectClause, fromClause, whereClause, orderByClause, parClause;
+	string initialTime, finalTime;
+	string uniqueName;
+	
+	TeDatabase* db = params_.theme()->layer()->database();
+
+	//------- Get geometry table
+	geomRepr_.push_back(rep);
+	if(rep.tableName_.empty())
+		return false;
+	
+	selectClause = rep.tableName_ +".* ";
+	orderByClause = " ORDER BY "+ rep.tableName_ +".object_id ";
+
+	if((rep.geomRep_ == TePOLYGONS) && (db->dbmsName() != "OracleSpatial") && (db->dbmsName() != "PostGIS") )
+		orderByClause += " , parent_id ASC, num_holes DESC";
+	
+	//------- Get temporal attribute 
+	if(!attrTable_.name().empty())
+	{
+		initialTime = attrTable_.name() +"."+ attrTable_.attInitialTime ();
+		finalTime = attrTable_.name() +"."+ attrTable_.attFinalTime ();
+			
+		// fill vector of unique name 
+		uniqueName = TeConvertToUpperCase(attrTable_.name()+"."+attrTable_.uniqueName());
+						
+		selectClause += ", "+ attrTable_.name()+"."+ attrTable_.uniqueName();
+		selectClause += ", "+ attrTable_.name()+"."+initialTime;
+
+		if (initialTime != finalTime)
+			selectClause += ", "+ attrTable_.name()+"."+finalTime;
+	}
+	
+	if(!db->tableExist(params_.theme()->collectionAuxTable()))
+	{
+		TeAttrTableVector atts; 
+		params_.theme()->getAttTables(atts); 
+
+		if(atts.empty())
+			return false;
+
+		fromClause = " FROM " + tableJoin(atts, rep.tableName_, "object_id");
+		whereClause = params_.theme()->sqlWhereRestrictions(&rep);
+	}
+	else
+		fromClause = params_.theme()->sqlGridFrom(rep.tableName_);
+	
+	if(ent)
+	{
+		string iniTime = attrTable_.name()+"."+initialTime;
+		string finTime = attrTable_.name()+"."+finalTime;
+		if(!whereClause.empty())
+			whereClause += " AND ";
+
+		if ((params_.chronon()==TeMONTHOFYEAR) || (params_.chronon()==TeDAYOFWEEK))
+			whereClause += db->getSQLTemporalWhere(ent->timeInt_, ent->timeInt_, params_.chronon(), TeTIMEDURING, iniTime, finTime);    
+		else
+		{
+			TeTimeInterval interval = ent->time_;
+			interval.intervalChronon(params_.chronon());
+
+			whereClause += db->getSQLTemporalWhere(interval, TeTIMEDURING, iniTime, finTime);
+		}
+	}
+
+	//where clause
+	if(!objectId().empty())
+	{
+		if(!whereClause.empty())
+			whereClause += " AND ";
+		
+		whereClause += rep.tableName_+".object_id = '"+ objectId() +"'";  
+	}
+
+	//---------- querier restriction
+	string sqlQuerierRest = sqlWhereRestrictions(&rep);
+	if(!whereClause.empty())
+		whereClause += " AND ";
+
+	whereClause += sqlQuerierRest;
+
+	//----------
+
+	string sql = "SELECT "+ selectClause + fromClause;
+	if(!whereClause.empty())
+		sql += " WHERE "+ whereClause;
+	sql += orderByClause;
+
+	//------ Submit the query
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+	
+	if(!portal->query(sql))
+	{
+		delete portal;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+
+	portals_.push_back (portal);
+	return true;
+}
+
+
+// ---------- final - initPortal
+
+// It is used in two cases:
+// 1) when it must return all instances of an object 
+// 2) when the attributes was grouped by sql functions - without geometry 
+
+bool
+TeQuerierDBStr1::fillSTOGrouped(TeSTInstance& sto, bool fetchInstance)
+{
+	if(portals_.empty()) 
+		return false;
+
+	TeDatabasePortal* portal = portals_[0]; 
+	if(!portal) 
+		return false; 
+
+	TeRepresentation* rep = 0;
+	if(!geomRepr_.empty())
+		rep = &(geomRepr_[0]);
+
+	if(!flagPortal_)
+	{
+		clearVectors();
+		return false;
+	}
+
+	TeTime  minT1, maxT2;
+	
+	// builds an ST object instance
+	TeTime t1, t2;
+	TePropertyVector prop;
+
+	// verify if exist several geometries for an object
+	bool flagGeom = true;
+	while(flagGeom && fetchInstance)
+	{
+		sto.objectId (portal->getData(linkName_));
+						
+		if(rep && (!params_.loadGeom()))
+		{
+			int geomId = portal->getInt(rep->tableName_ +".geom_id");
+			
+			if(sto.objectId()==lastObjId_) 
+			{
+				if (geomId_!=geomId)
+				{
+					flagGeom = portal->fetchRow();
+					continue;
+				}
+			}
+			else
+				geomId_ = geomId;
+		}
+		flagGeom = false;
+	}
+	
+	
+	// ------------- begin fill attribute
+	// process the records filling the parameters of each instance
+	TeAttributeList attrsPortal = portal->AttributeList();
+	TeAttributeList::iterator it= attrsPortal.begin();
+
+	if(isGroup_)  // it was grouped by sql functions and without geometry 
+	{
+		sto.addUniqueId(string(portal->getData(linkName_)));
+
+		unsigned int size = params_.groupAttr().size();
+		for(unsigned int s=0; s<size; ++s)
+		{
+			TeProperty p;
+			p.attr_ = attrsPortal[s];   
+			p.value_ = portal->getData (s);
+			prop.push_back(p);
+		}
+	}
+	else
+	{
+		while(it!=attrsPortal.end())
+		{
+			TeProperty p;
+			string name = (*it).rep_.name_;
+			p.attr_ = (*it);
+
+			if(name==attrTable_.attInitialTime())
+			{
+				t1 = portal->getDate(attrTable_.attInitialTime());
+				if(attrTable_.attInitialTime()==attrTable_.attFinalTime())
+				{
+					t2 = t1;
+					sto.timeInterval(TeTimeInterval(t1,t2));
+				}
+			}
+			else if(name==attrTable_.attFinalTime())
+			{
+				t2 = portal->getDate(attrTable_.attFinalTime());
+				sto.timeInterval(TeTimeInterval(t1,t2));
+			}
+			else if(find(uniqueNames_.begin(), uniqueNames_.end(), TeConvertToUpperCase(name)) != uniqueNames_.end())
+			{
+				string uniqueValue = portal->getData(name);
+				sto.addUniqueId(uniqueValue);
+			}
+			
+			if(find(params_.loadAttrs().begin(), params_.loadAttrs().end(), name) != params_.loadAttrs().end())
+			{
+				p.value_ = portal->getData(name);
+				prop.push_back(p);
+			}
+			++it;
+		}
+	}
+
+	//! Set the property in the stoInstance
+	sto.properties(prop);	
+	sto.theme(params_.theme());
+
+	if(!fetchInstance) //only to get the attributes
+		return true;
+
+	// ------------- end fill attribute
+
+	//total time
+	if(t1.isValid() && t1<minT1)
+		minT1 = t1;
+	if(t2.isValid() && maxT2<t2)
+		maxT2 = t2;
+		
+	// ------------- begin fill geometries
+
+	if(params_.loadGeom())
+	{
+		if(t1.isValid() && t2.isValid())
+			flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_, TeTimeInterval(t1,t2), attrTable_.attInitialTime(), attrTable_.attFinalTime());
+		else
+			flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_);
+	}
+	else
+		flagPortal_ = portal->fetchRow ();
+
+	// ------------- end fill geometries
+	
+	lastObjId_ = sto.objectId(); 
+	return true;
+}
+
+bool 
+TeQuerierDBStr1::fillGeomSTO(TeSTInstance& sto, unsigned int index)
+{
+	if((portals_.size()<(index+1)) || (geomRepr_.size()<(index+1)))
+		return false;
+
+	TeDatabasePortal* portal = portals_[index]; 
+	TeRepresentation rep = geomRepr_[index];
+	if(!portal)
+		return false; 
+
+	TeTimeInterval time = sto.timeInterval();
+	bool flag = false;
+	if(time.isValid())
+		flag = addGeometry(portal, rep.geomRep_, sto, rep.tableName_, time, attrTable_.attInitialTime(), attrTable_.attFinalTime());
+	else
+		flag = addGeometry(portal, rep.geomRep_, sto, rep.tableName_);
+
+	return flag;
+}
+
+
+// It is used in a case:
+// 1) when the attributes of the object instances must be grouping in memory - with or without geometry 
+bool
+TeQuerierDBStr1::fillSTONoGrouped(TeSTInstance& sto)
+{
+	unsigned int s;
+	if(portals_.empty())
+		return false;
+
+	TeDatabasePortal* portal = portals_[0]; 
+	if(!portal) 
+		return false; 
+
+	TeRepresentation* rep = 0; 
+	if(!geomRepr_.empty())
+		rep = &(geomRepr_[0]);
+	
+	//verify if the portal points to any STO
+	if(!flagPortal_)
+	{
+		clearVectors();
+		return false;
+	}
+
+	TePropertyVector prop;
+	map<int, vector<double> >	values;
+	string lastObj = "";
+
+	TeAttributeList attrsPortal = portal->AttributeList();
+	
+	if(!params_.loadGeom())
+	{
+		do
+		{
+			string objId = portal->getData(linkName_);
+			if(!rep)
+			{
+				lastObj = objId;
+				flagPortal_ = portal->fetchRow();
+				break;
+			}
+
+			int geomId = portal->getInt(rep->tableName_ +".geom_id");
+
+			if(lastObj.empty())
+				geomId_ = geomId;  //first read geomId
+			
+			if((!lastObj.empty()) && (objId != lastObj))
+				break;  
+					
+			//verify this is the geomId  
+			if(geomId!=geomId_)
+			{
+				flagPortal_ = portal->fetchRow();
+				lastObj = objId;
+				continue;
+			}
+				
+			string val = ""; 
+			unsigned int size = attrsPortal.size();
+			//portal has the attributes that will be grouped and geometric columns (object_id and geom_id)
+			for(unsigned int s=0; s<(size-2); ++s)  
+			{
+				val = portal->getData(s);
+				if(val.empty())
+					values[s].push_back (TeMAXFLOAT);  //invalid value
+				else
+					values[s].push_back (atof(val.c_str()));
+			}
+
+			flagPortal_ = portal->fetchRow();
+			lastObj = objId;
+
+		} while(flagPortal_);
+	}
+	else // -- when fill the geometry
+	{
+		
+		//------- first: load the geometry, attributes and time of the first object 
+		//object id
+		lastObj = portal->getData(rep->tableName_ +".object_id");
+		
+		//attribute val
+		string val = ""; 
+		unsigned int size = attrsPortal.size();
+		for(s=0; s<(size-1); ++s)
+		{
+			val = portal->getData(s);
+			if(val.empty())
+				values[s].push_back (TeMAXFLOAT);  //invalid value
+			else
+				values[s].push_back (atof(val.c_str()));
+		}
+
+		//time
+		TeTime t1, t2;
+		if(!attrTable_.name().empty())
+		{
+			t1 = portal->getDate(attrTable_.attInitialTime());
+			t2 = portal->getDate(attrTable_.attFinalTime());
+		}
+		
+		if(t1.isValid() && t2.isValid())
+			flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_, TeTimeInterval(t1,t2), attrTable_.attInitialTime(), attrTable_.attFinalTime());
+		else
+			flagPortal_ = addGeometry(portal, rep->geomRep_, sto, rep->tableName_);
+		
+		//------- second: load the attributes of the other objects
+		int cont = 0;
+		while (flagPortal_)
+		{
+			string objId = portal->getData(rep->tableName_ +".object_id");
+			int geomId = portal->getInt(rep->tableName_ +".geom_id");
+
+			if(objId != lastObj)
+				break;  
+			
+			if(!cont)
+				geomId_ = geomId;  //first geom_id 
+			
+			//verify the geomId
+			if(geomId!=geomId_)
+			{
+				flagPortal_ = portal->fetchRow();
+				lastObj = objId;
+				continue;
+			}
+				
+			val = ""; 
+			for(s=0; s<(size-1); ++s)
+			{
+				val = portal->getData(s);
+				if(val.empty())
+					values[s].push_back (TeMAXFLOAT);  //invalid value
+				else
+					values[s].push_back (atof(val.c_str()));
+			}
+
+			flagPortal_ = portal->fetchRow();
+			lastObj = objId; 
+			++cont;
+		}
+	}
+
+	//fill the property from portal 
+	//calculate the statistics
+	string lastAttr = "";
+	unsigned int j=0;
+	string colName = "";
+	TeGroupingAttr::iterator it = params().groupAttr().begin(); 
+
+	TeStatisticValMap stat;
+	while(it!=params().groupAttr().end())
+	{
+		if(lastAttr != it->first.name_)
+		{
+			if(j>=(values.size()))
+				return false;
+			
+			stat.clear();
+			TeCalculateStatistics(values[j].begin(), values[j].end(), stat);
+			colName = attrsPortal[j].rep_.name_;
+			++j;
+		}
+
+		double result;
+		string prefix;
+		switch(it->second)
+		{
+			case TeCOUNT:
+				result = stat[TeCOUNT]; 
+				prefix = "count";
+				break;
+			case TeVALIDCOUNT:
+				result = stat[TeVALIDCOUNT]; 
+				prefix = "valCount";
+				break;
+			case TeMINVALUE:
+				result = stat[TeMINVALUE];
+				prefix = "min";
+				break;
+			case TeMAXVALUE:
+				result = stat[TeMAXVALUE];
+				prefix = "max";
+				break;
+			case TeSUM:
+				result = stat[TeSUM]; 
+				prefix = "sum";
+				break;
+			case TeMEAN:
+				result = stat[TeMEAN]; 
+				prefix = "mean";
+				break;
+			case TeSTANDARDDEVIATION:
+				result = stat[TeSTANDARDDEVIATION];
+				prefix = "stDeviation";
+				break;
+			case TeVARIANCE:
+				result = stat[TeVARIANCE];
+				prefix = "variance";
+				break;
+			case TeSKEWNESS:
+				result = stat[TeSKEWNESS];
+				prefix = "skwness";
+				break;
+			case TeKURTOSIS:
+				result = stat[TeKURTOSIS]; 
+				prefix = "kurtosis";
+				break;
+			case TeAMPLITUDE:
+				result = stat[TeAMPLITUDE]; 
+				prefix = "amplitude";
+				break;
+			case TeMEDIAN:
+				result = stat[TeMEDIAN]; 
+				prefix = "median";
+				break;
+			case TeVARCOEFF:
+				result = stat[TeVARCOEFF]; 
+				prefix = "varcoeff";
+				break;
+			case TeMODE: 
+				result = stat[TeMODE]; 
+				prefix = "mode";
+				break;
+			default:
+				break;
+		}
+		
+		lastAttr = it->first.name_; 
+		++it;
+
+		//fill the property 
+		TeProperty p;
+		p.attr_.rep_.name_ = prefix +"_"+ colName;
+		p.attr_.rep_.type_ = TeREAL;
+		p.value_ = Te2String(result);
+
+		prop.push_back(p);
+	}
+	
+	//adds the property in the stoInstance
+	sto.properties(prop);	
+	sto.theme(params_.theme());
+	sto.objectId(lastObj);
+	sto.addUniqueId(lastObj);
+
+	lastObjId_ = sto.objectId(); 
+	return true;
+}
+
+
+bool
+TeQuerierDBStr1::loadInstances(TeTSEntry* ent)
+{
+	if(!params_.theme())
+		return false;
+
+	TeRepresPointerVector repres = params_.theme()->layer()->vectRepres();
+	TeRepresentation rep;
+	
+	//fill instances - first fill the geometry representation of the spatial restriction 
+	if(params_.theme()->hasSpatialRest())
+		rep = **(TeFindRepresentation(repres.begin(), repres.end(), params_.theme()->geomRepRestriction()));
+	else
+	{
+		for(int i=0; i<(int)repres.size(); ++i)
+		{
+			if(repres[i]->geomRep_==TeTEXT)
+				continue; 
+			
+			rep = *repres[i];
+			break;
+		}
+	}
+	
+	if(!initPortal(rep, ent))
+		return false;
+
+	//get the attribute list
+	attrList_.clear();
+	if(!groupInMemory_)
+	{
+		TeSTInstance i;
+		fillSTOGrouped(i, false);
+		TePropertyVector props = i.getPropertyVector();
+		for(int c=0; c<(int)props.size(); ++c)
+			attrList_.push_back (props[c].attr_);
+	}
+	else
+	{
+		TeGroupingAttr::iterator it = params().groupAttr().begin();
+		while(it!=params().groupAttr().end())
+		{
+			TeAttribute at;
+			at.rep_ = it->first;
+			attrList_.push_back (at);
+			++it;
+		}
+	}
+			
+	if(!params_.loadGeom())
+		return true;
+	
+	for(unsigned int i=0; i<repres.size(); ++i)
+	{
+		if( (repres[i]->geomRep_ == rep.geomRep_) || 
+			(repres[i]->geomRep_ == TeTEXT) )
+			continue;
+
+		if(!initGeomPortal(*(repres[i]), ent))
+		{
+			clearVectors();
+			return false;
+		}
+	}
+
+	return true;
+}
+
+bool 
+TeQuerierDBStr1::fetchInstance(TeSTInstance&  sto)  
+{
+	sto.clear();
+	bool flag = false;
+	
+	if(groupInMemory_)
+		flag = fillSTONoGrouped(sto); 
+	else
+		flag = fillSTOGrouped(sto); 
+	
+	if((flag==false) || (!params_.loadGeom()))
+		return flag;
+	
+	for(unsigned int i=1; i<portals_.size(); ++i)
+		flag = fillGeomSTO(sto, i);
+	
+	return flag;
+}
+
+
+int 
+TeQuerierDBStr1::numElemInstances()
+{
+	if((portals_.empty()))
+		return 0;
+
+	TeDatabasePortal* portal = portals_[0];
+	if(!portal)
+		return 0;
+
+	return (portal->numRows());
+}
+
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDBStr1.h b/src/terralib/kernel/TeQuerierDBStr1.h
new file mode 100644
index 0000000..89cf967
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr1.h
@@ -0,0 +1,94 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_DBSTR1_H
+#define  __TERRALIB_INTERNAL_QUERIER_DBSTR1_H
+
+#include "TeQuerierDB.h"
+
+//! A class that implement a strategy to build STOs (Spatial Temporal Objects) from a TerraLib database (Strategy 1)
+class TeQuerierDBStr1 : public TeQuerierDB
+{
+
+private:
+		
+		vector<string>				uniqueNames_;
+		string						lastObjId_;
+		int							geomId_;
+		bool						isGroup_;			//! if the portal was built with statistics sql funcionts
+		bool						groupInMemory_;		//! if it must group the object instances in the memory 
+		string						linkName_;
+		
+		/* @name Internal functions to initialize portals */
+		//@{
+		bool initPortal(TeRepresentation& rep, TeTSEntry* ent=0);     
+		bool initGeomPortal(TeRepresentation& rep, TeTSEntry* ent=0); 
+		//@}
+
+		/* @name Internal functions to fill the STOs from portals */
+		//@{
+		bool fillSTOGrouped(TeSTInstance& sto, bool fetchInstance = true);
+		bool fillSTONoGrouped(TeSTInstance& sto);
+		bool fillGeomSTO(TeSTInstance& sto, unsigned int index);
+		//@}
+
+public:
+
+		//! Constructor
+		TeQuerierDBStr1(TeQuerierParams& params) : 
+			TeQuerierDB(params), 
+			lastObjId_(""),
+			isGroup_(false),
+			groupInMemory_(false),
+			linkName_("")
+		{}
+		
+		//! Loads instances
+		bool loadInstances(TeTSEntry* ent=0); 
+		
+		//! Returns each loaded instance
+		bool fetchInstance(TeSTInstance&  sto); 
+
+		//! Returns the number of instances to each time frame
+		int numElemInstances(); 
+};
+
+//! A class that define a factory to build a querier strategy from database(strategy 1)
+class TeQuerierDBStr1Factory : public TeQuerierImplFactory
+{
+public:
+
+	//! Constructor
+	TeQuerierDBStr1Factory(const string& name) : TeQuerierImplFactory(name) {}
+
+	//! Builds a database querier
+	virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+	{  
+		TeQuerierParams tempArg = arg;
+		return new TeQuerierDBStr1(tempArg); 
+	}
+};
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeQuerierDBStr2.cpp b/src/terralib/kernel/TeQuerierDBStr2.cpp
new file mode 100644
index 0000000..137c98f
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr2.cpp
@@ -0,0 +1,299 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDBStr2.h"
+#include "TeDatabase.h"
+#include "TeSTInstance.h"
+
+bool
+TeQuerierDBStr2::initPortal(TeTSEntry* ent)  
+{
+	string selectClause, fromClause, whereClause, groupByClause;
+	string initialTime, finalTime;
+	TeDatabase* db = params_.theme()->layer()->database();
+
+	if(params_.groupAttr().empty())
+		return false;
+
+	//get the table name
+	string tableName;
+	TeGroupingAttr groupAttr = params_.groupAttr();
+	TeGroupingAttr::iterator it = groupAttr.begin();
+	size_t pos = (it->first.name_).find(".", string::npos,1);
+	if (pos != string::npos)
+		tableName = (it->first.name_).substr(0,pos);
+		
+	
+	clearVectors();
+
+	// ---------------------------------------------  Mount SQL
+	//------- Select and Group By clause
+
+	//load the attribute table 
+	int index = -1;
+	TeAttrTableVector attr = params_.theme()->attrTables();
+	for(unsigned int i=0; i<attr.size(); ++i)
+	{
+		if(TeConvertToUpperCase(attr[i].name()) == TeConvertToUpperCase(tableName))
+		{
+			index = i;
+			attrTable_ = attr[i];
+			break;
+		}
+	}
+	
+	//not find the table
+	if(index<0)
+		return false;
+
+	//verify the attribute table
+	if((ent) && (attrTable_.tableType()!=TeAttrEvent) && (attrTable_.tableType()!=TeFixedGeomDynAttr))
+		return false;
+ 	
+	//object_id
+	string linkName; 
+	if(attrTable_.tableType() != TeAttrExternal)
+		linkName = attrTable_.name() +"."+ attrTable_.linkName(); 
+	else
+		linkName = params_.theme()->collectionTable() +".c_object_id "; 
+
+	if(params_.hasSpatialRes())
+		selectClause = " MIN("+ linkName +")";		
+	else
+		selectClause = linkName;		
+
+	if(ent)
+	{
+		//date
+		initialTime = attrTable_.name() +"."+ attrTable_.attInitialTime();
+		
+		groupByClause = db->getSQLTemporalFunction(params_.chronon(), initialTime);
+		
+		if(!params_.hasSpatialRes())
+			groupByClause += ","+ linkName;
+				
+		selectClause += ", MAX("+ initialTime +")";
+	}
+	else 
+		groupByClause = linkName;
+
+	//statistic
+	selectClause += ","+ db->getSQLStatistics(groupAttr);   
+
+	//---- from clause 
+	if(params_.hasSpatialRes())
+	{
+		groupByClause = ""; //It groups all attributes from all objects 
+		string gTable = params_.theme()->layer()->tableName(params_.geomRepRest());
+		fromClause = this->sqlFrom(gTable);
+	}
+	else
+		fromClause = this->sqlFrom();
+	
+	if(fromClause.empty())
+		return false;
+	
+	//where clause
+	if(!params_.objId().empty())
+		whereClause = linkName +" = '"+ params_.objId() +"'";  
+
+	//---------- querier restriction
+	string sqlQuerierRest = sqlWhereRestrictions();
+	if(!whereClause.empty())
+		whereClause += " AND ";
+
+	whereClause += sqlQuerierRest;
+
+	//----------
+	
+	string sql = " SELECT "+ selectClause; 
+	sql += " FROM "+ fromClause;
+	if(!whereClause.empty())
+		sql += " WHERE "+ whereClause; 
+	if(!groupByClause.empty())
+		sql += " GROUP BY "+ groupByClause;
+	
+	// ---------------------------------------------  Submit the query
+	
+	portals_.clear();
+	TeDatabasePortal* portal = db->getPortal();
+	
+	if(!portal)
+		return false;
+	
+	if(!portal->query(sql))
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	string id = portal->getData(0); //object_Id
+	if(id.empty())
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	portals_.push_back (portal);
+	flagPortal_ = true;
+	return true;
+}
+
+
+bool
+TeQuerierDBStr2::fillSTO(TeSTInstance& sto)  
+{
+	if(portals_.empty())
+		return false;
+
+	TeDatabasePortal* portal = portals_[0]; 
+	if(!portal) 
+		return false; 
+
+	if(!flagPortal_) // end of portal
+	{
+		clearVectors();
+		return false; 
+	}
+
+	int posInit = 1;
+
+	if(TSEntry_.timeFrame_ > -1)
+	{
+		// first : verify the time
+		TeTime t1 = portal->getDate(1);		// 1: date
+		t1.chronon ((TSEntry_.time_).intervalChronon());
+		posInit = 2;
+	
+		//if the time is before the requested interval 
+		while ( (TSEntry_.time_).before(t1) && flagPortal_)
+		{
+			flagPortal_ = portal->fetchRow();
+			t1 = portal->getDate(1);
+			t1.chronon ((TSEntry_.time_).intervalChronon());
+		}
+	
+		if(!(TSEntry_.time_).during(t1))
+			return false;
+		
+		TeTimeInterval interval(t1, t1);
+		sto.timeInterval(interval);
+
+		timeFramePortal_ = (TSEntry_.timeFrame_)+1; //next time frame 
+	}
+
+	// get object_id
+	string objId = string(portal->getData(0));  // 0: object_id
+	sto.objectId (objId);
+	sto.addUniqueId (objId);
+
+	//get property
+	TeAttributeList attrsPortal = portal->AttributeList();
+	TePropertyVector prop;
+
+	unsigned int size = params_.groupAttr().size();
+	for(unsigned int s=0; s<size; ++s)  // 1 or 2 until size...
+	{
+		TeProperty p;
+		p.attr_ = attrsPortal[posInit];   
+		p.value_ = string(portal->getData(posInit));
+		prop.push_back(p);
+		++posInit;
+	}
+	
+	// set the property in the stoInstance
+	sto.properties(prop);	
+	sto.theme(params_.theme());
+
+	flagPortal_ = portal->fetchRow();
+	return true;
+}
+
+
+bool
+TeQuerierDBStr2::loadInstances(TeTSEntry* ent) 
+{
+	if(!params_.theme())
+		return false;
+
+	if(ent)
+	{
+		//if the portal was not initialised (timeFramePortal_==-1) or
+		//if the time frame requested is lesser than the time frame appointed by the portal
+		if((timeFramePortal_<0) || (ent->timeFrame_<timeFramePortal_))
+		{
+			if(!initPortal(ent))
+				return false;
+
+			timeFramePortal_ = 0;
+		}
+		TSEntry_ = (*ent);
+	}
+	else // no chronon
+	{
+		if(!initPortal())
+			return false;
+ 
+		timeFramePortal_ = -1;
+	}
+
+	attrList_.clear();
+	TeAttribute at;
+	TeGroupingAttr::iterator it = params().groupAttr().begin();
+	while(it!=params().groupAttr().end())
+	{
+		TeAttribute at;
+		at.rep_ = it->first;
+		attrList_.push_back (at);
+		++it;
+	}
+
+	return true;
+}
+
+
+bool
+TeQuerierDBStr2::fetchInstance(TeSTInstance&  sto) 
+{
+	sto.clear();
+
+	if(!fillSTO(sto))
+		return false; 
+	
+	//build a temporal serie to one object
+	if((ts_) && (ts_->setTSEntryValue(TSEntry_.timeFrame_, sto[0], TeDATA)))
+		filledSerie_ = true;
+	
+	return true;
+}
+
+
diff --git a/src/terralib/kernel/TeQuerierDBStr2.h b/src/terralib/kernel/TeQuerierDBStr2.h
new file mode 100644
index 0000000..581a35d
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr2.h
@@ -0,0 +1,78 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_DBSTR2_H
+#define  __TERRALIB_INTERNAL_QUERIER_DBSTR2_H
+
+#include "TeQuerierDB.h"
+#include "TeTemporalSeries.h"
+
+//! A class that implement a strategy to build STOs (Spatial Temporal Objects) from a TerraLib database (Strategy 2)
+//! Strategy 2: simple chronon, without geometry, theme with collection table, operator exist in the database  
+class TeQuerierDBStr2: public TeQuerierDB
+{
+	
+private:
+	int				timeFramePortal_;  // the time frame appointed by the portal 
+	TeTSEntry		TSEntry_;
+	
+	/* @name Internal functions to initialize portals */
+	//@{
+	bool initPortal(TeTSEntry* ent=0); 
+	//@}
+
+	//! Internal function to fill STO
+	bool fillSTO(TeSTInstance& sto); 
+	
+public:
+	
+	//! Constructor
+	TeQuerierDBStr2(TeQuerierParams& params): 
+		TeQuerierDB(params), 
+		timeFramePortal_(-1)
+	{} 
+
+	//! Loads the instances
+	bool loadInstances(TeTSEntry* ent=0); 
+
+	//! Returns each loaded STO
+	bool fetchInstance(TeSTInstance&  sto); 
+};
+
+//! A class that define a factory to build a querier strategy from database(strategy 2)
+class TeQuerierDBStr2Factory : public TeQuerierImplFactory
+{
+public:
+
+	//! Constructor
+	TeQuerierDBStr2Factory(const string& name) : TeQuerierImplFactory(name) {}
+
+	//! Builds a database querier
+	virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+	{  
+		TeQuerierParams tempArg = arg;
+		return new TeQuerierDBStr2(tempArg); 
+	}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierDBStr3.cpp b/src/terralib/kernel/TeQuerierDBStr3.cpp
new file mode 100644
index 0000000..60032a3
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr3.cpp
@@ -0,0 +1,336 @@
+ /************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierDBStr3.h"
+#include "TeDatabase.h"
+#include "TeSTInstance.h"
+
+bool
+TeQuerierDBStr3::initPortal(TeTSEntry* ent)  
+{
+	string selectClause, fromClause, whereClause, groupByClause;
+	string initialTime, finalTime;
+	TeDatabase* db = params_.theme()->layer()->database();
+
+	if(params_.groupAttr().empty())
+		return false;
+
+	//get the table name
+	string tableName;
+	TeGroupingAttr groupAttr = params_.groupAttr();
+	TeGroupingAttr::iterator it = groupAttr.begin();
+	size_t pos = (it->first.name_).find(".", string::npos,1);
+	if (pos != string::npos)
+		tableName = (it->first.name_).substr(0,pos);
+	
+	clearVectors();
+
+	// ---------------------------------------------  Monut SQL
+	
+	//------- Select and Group By clause
+
+	//load the attribute table 
+	int index = -1;
+	unsigned int i=0;
+	TeAttrTableVector attr = params_.theme()->attrTables();
+	for(i=0; i<attr.size(); ++i)
+	{
+		if(TeConvertToUpperCase(attr[i].name()) == TeConvertToUpperCase(tableName))
+		{
+			index = i;
+			attrTable_ = attr[i];
+			break;
+		}
+	}
+ 
+	//not find the table
+	if(index<0)
+		return false;
+
+	//verify the attribute table
+	if((ent) && (attrTable_.tableType()!=TeAttrEvent) && (attrTable_.tableType()!=TeFixedGeomDynAttr))
+		return false;
+
+	//geometric Table
+	TeTable geomTable;
+	if(params_.theme()->layer()->hasGeometry(TePOINTS))
+	{
+		if(!db->loadTable(params_.theme()->layer()->tableName(TePOINTS), geomTable))
+			return false; 
+		rep_ = TePOINTS;
+	} 
+	else if (params_.theme()->layer()->hasGeometry(TeCELLS))
+	{
+		if(!db->loadTable(params_.theme()->layer()->tableName(TeCELLS), geomTable))
+			return false;
+		rep_ = TeCELLS;
+	}
+	else
+		return false; //this strategy is valid only for cells and point geometry
+
+	//object_id
+	string linkName = geomTable.name()+ ".object_id ";
+	string uniqueIdName = attrTable_.name() +"."+ attrTable_.uniqueName(); 
+	
+	if(params_.hasSpatialRes())
+		selectClause = " MIN("+ linkName +")";		
+	else
+		selectClause = linkName;		
+
+	if(ent)
+	{
+		//date
+		initialTime = attrTable_.name() +"."+ attrTable_.attInitialTime();
+
+		groupByClause = db->getSQLTemporalFunction(params_.chronon(), initialTime);
+		
+		if(!params_.hasSpatialRes())
+			groupByClause += ","+ linkName;
+		
+		selectClause += ", MAX("+ initialTime +")";
+	}
+	else if(!params_.hasSpatialRes())
+		groupByClause = linkName;
+
+	//statistic
+	selectClause += ","+ db->getSQLStatistics(groupAttr);   
+	
+	//----- insert geometrical information in the select clause
+	vector<string> attrs; 
+	geomTable.attributeNames(attrs); 
+	for(i=0; i<attrs.size(); ++i)
+	{	
+		if(attrs[i]!="object_id")
+			selectClause += ", MIN( "+ geomTable.name()+"."+ attrs[i] +" ) AS "+ attrs[i];
+	}
+	//-----	
+
+	//------- From clause 
+	fromClause = this->sqlFrom(geomTable.name());
+	if(fromClause.empty())
+		return false;
+
+	//where clause
+	if(!params_.objId().empty())
+		whereClause = linkName +" = '"+ params_.objId() +"'";  
+
+	//---------- querier restriction
+	TeRepresentation rep;
+	rep.tableName_ = geomTable.name();
+	rep.geomRep_ = rep_;
+
+	string sqlQuerierRest = sqlWhereRestrictions(&rep);
+	if(!whereClause.empty())
+		whereClause += " AND ";
+
+	whereClause += sqlQuerierRest;
+
+	//----------
+	
+	string sql = " SELECT "+ selectClause; 
+	sql += " FROM "+ fromClause; 
+	if(!whereClause.empty())
+		sql += " WHERE "+ whereClause; 
+	if(!groupByClause.empty())
+		sql += " GROUP BY "+ groupByClause;
+	
+	// ---------------------------------------------  Submit the query
+	
+	portals_.clear();
+	TeDatabasePortal* portal = db->getPortal();
+	
+	if(!portal)
+		return false;
+	
+	if(!portal->query(sql))
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	string id = portal->getData(0); //object_Id
+	if(id.empty())
+	{
+		delete (portal);
+		flagPortal_ = false;
+		return false;
+	}
+
+	portals_.push_back (portal);
+	flagPortal_ = true;
+	return true;
+}
+
+
+bool
+TeQuerierDBStr3::fillSTO(TeSTInstance& sto)  
+{
+	if(portals_.empty())
+		return false;
+
+	TeDatabasePortal* portal = portals_[0]; 
+	if(!portal) 
+		return false; 
+
+	if(!flagPortal_)  //end of portal
+	{
+		clearVectors();
+		return false; 
+	}
+
+	int posInit = 1;
+
+	// first : verify the time
+	if(TSEntry_.timeFrame_ > -1)
+	{
+		TeTime t1 = portal->getDate(1);		// 1: date
+		t1.chronon ((TSEntry_.time_).intervalChronon());
+//		int posInit = 2;
+		
+		//if the time is before the requested interval 
+		while ( (TSEntry_.time_).before(t1) && flagPortal_)
+		{
+			flagPortal_ = portal->fetchRow();
+			t1 = portal->getDate(1);
+			t1.chronon ((TSEntry_.time_).intervalChronon());
+		}
+		
+		if(!(TSEntry_.time_).during(t1))
+			return false;
+		
+		TeTimeInterval interval(t1, t1);
+		sto.timeInterval(interval);
+
+		timeFramePortal_ = (TSEntry_.timeFrame_)+1; //next time frame 
+	}
+	
+	// get object_id
+	string objId = string(portal->getData(0));  // 0: object_id
+	sto.objectId (objId);
+	sto.addUniqueId (objId);
+
+	//get property
+	TeAttributeList attrsPortal = portal->AttributeList();
+	TePropertyVector prop;
+	
+	unsigned int size = params_.groupAttr().size();
+	for(unsigned int s=0; s<size; ++s)  // 1 or 2 until size...
+	{
+		TeProperty p;
+		p.attr_ = attrsPortal[posInit];   
+		p.value_ = portal->getData (posInit);
+		prop.push_back(p);
+		++posInit;
+	}
+	
+	// set the property in the stoInstance
+	sto.properties(prop);	
+	sto.theme(params_.theme());
+
+	// get geometry 
+	if(rep_ == TePOINTS)
+	{
+		TePoint point;
+		flagPortal_ = portal->fetchGeometry(point);
+		sto.addGeometry (point);
+	}
+	else
+	{
+		TeCell cell;
+		flagPortal_ = portal->fetchGeometry(cell);
+		sto.addGeometry (cell);
+	}
+
+	return true;
+}
+
+
+bool
+TeQuerierDBStr3::loadInstances(TeTSEntry* ent) 
+{
+	if(!params_.theme())
+		return false;
+
+	if(ent)
+	{
+		//if the portal was not initialised (timeFramePortal_==-1) or
+		//if the time frame requested is lesser than the time frame appointed by the portal
+		if((timeFramePortal_<0) || (ent->timeFrame_<timeFramePortal_))
+		{
+			if(!initPortal(ent))
+				return false;
+
+			timeFramePortal_ = 0;
+		}
+		TSEntry_ = (*ent);
+	}
+	else // no chronon
+	{
+		if(!initPortal())
+			return false;
+ 
+		timeFramePortal_ = -1;
+	}
+
+	attrList_.clear();
+	TeAttribute at;
+	TeGroupingAttr::iterator it = params().groupAttr().begin();
+	while(it!=params().groupAttr().end())
+	{
+		TeAttribute at;
+		at.rep_ = it->first;
+		attrList_.push_back (at);
+		++it;
+	}
+
+	return true;
+}
+
+
+bool
+TeQuerierDBStr3::fetchInstance(TeSTInstance&  sto)
+{
+	sto.clear();
+
+	if(!fillSTO(sto))
+		return false; 
+	
+	//build a temporal serie to one object
+	if((ts_) && (ts_->setTSEntryValue(TSEntry_.timeFrame_, sto[0], TeDATA)))
+		filledSerie_ = true;
+	
+	return true;
+}
+
+
+
+
+
diff --git a/src/terralib/kernel/TeQuerierDBStr3.h b/src/terralib/kernel/TeQuerierDBStr3.h
new file mode 100644
index 0000000..bd9bb4b
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierDBStr3.h
@@ -0,0 +1,79 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_DBSTR3_H
+#define  __TERRALIB_INTERNAL_QUERIER_DBSTR3_H
+
+#include "TeQuerierDB.h"
+#include "TeTemporalSeries.h"
+
+//! A class that implement a strategy to build STOs (Spatial Temporal Objects) from a TerraLib database (Strategy 3)
+//! Strategy 3: simple chronon, with geometry (points or cells), theme with collection table, operator exist in the database  
+class TeQuerierDBStr3: public TeQuerierDB
+{
+	
+private:
+	int				timeFramePortal_;	// the time frame appointed by the portal 
+	TeTSEntry		TSEntry_;
+	TeGeomRep		rep_;
+		
+	/* @name Internal functions to initialize portals */
+	//@{
+	bool initPortal(TeTSEntry* ent=0); 
+	//@}
+
+	//! Internal function to fill STO
+	bool fillSTO(TeSTInstance& sto); 
+	
+public:
+	
+	//! Constructor
+	TeQuerierDBStr3(TeQuerierParams& params): 
+		TeQuerierDB(params), 
+		timeFramePortal_(-1)
+	{} 
+
+	//! Loads the instances
+	bool loadInstances(TeTSEntry* ent=0); 
+
+	//! Returns each loaded STO
+	bool fetchInstance(TeSTInstance&  sto); 
+};
+
+//! A class that define a factory to build a querier strategy from database(strategy 3)
+class TeQuerierDBStr3Factory : public TeQuerierImplFactory
+{
+public:
+
+	//! Constructor
+	TeQuerierDBStr3Factory(const string& name) : TeQuerierImplFactory(name) {}
+
+	//! Builds a database querier
+	virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+	{  
+		TeQuerierParams tempArg = arg;
+		return new TeQuerierDBStr3(tempArg); 
+	}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierImpl.cpp b/src/terralib/kernel/TeQuerierImpl.cpp
new file mode 100644
index 0000000..7641500
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierImpl.cpp
@@ -0,0 +1,95 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeQuerierImpl.h"
+#include "TeTemporalSeries.h"
+
+	
+TeQuerierImpl::TeQuerierImpl(TeQuerierParams& par): params_(par), filledSerie_(false)
+{
+	ts_ = 0;
+	if(par.chronon()!=TeNOCHRONON) //if there is a chronon, build ts
+	{
+		TeGroupingAttr::iterator it = par.groupAttr().begin();
+		if(it!=par.groupAttr().end())
+			ts_ = new TeTemporalSeries(par.theme(), par.objId(), par.chronon(), it->first.name_, it->first.name_, it->second, it->second);
+		else
+			ts_ = new TeTemporalSeries(par.chronon(), par.theme());
+		ts_->buildFrameIntervals();
+	}
+}
+
+TeQuerierImpl::~TeQuerierImpl() 
+{	
+	if(ts_)
+		delete (ts_);
+}
+
+bool 
+TeQuerierImpl::loadTimeFrameInstances(int frame)
+{
+	if(frame>-1) 
+	{
+		TeTSEntry ent;
+		if(!getTSEntry(ent, frame))
+			return false;
+		
+		return(loadInstances(&ent));
+	}
+	else
+		return(loadInstances());
+}
+
+bool 
+TeQuerierImpl::getTSEntry(TeTSEntry& tsEntry, int frame)
+{
+	if(!ts_)
+		return false;
+
+	return(ts_->getTSEntry(tsEntry, frame)); 
+}
+
+int 
+TeQuerierImpl::getNumTimeFrames()
+{
+	if(!ts_)
+		return 0;
+
+	return (ts_->numTimeFrames());
+}
+
+bool 
+TeQuerierImpl::getTS(TeTemporalSeries& ts)
+{
+	if(!ts_)
+		return false;
+	
+	ts = (*ts_);
+	return true;
+}
+
+TeTSParams& 
+TeQuerierImpl::getTSParams() 
+{ 
+	return (ts_->TSparams_); 
+}
diff --git a/src/terralib/kernel/TeQuerierImpl.h b/src/terralib/kernel/TeQuerierImpl.h
new file mode 100644
index 0000000..0a6f11d
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierImpl.h
@@ -0,0 +1,109 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_IMPL_H
+#define  __TERRALIB_INTERNAL_QUERIER_IMPL_H
+
+#include "TeQuerierParams.h"
+#include "TeFactory.h" 
+
+class TeTSEntry;
+class TeTSParams;
+class TeSTInstance;
+class TeTemporalSeries;
+
+//! An abstract querier class to build STOs (Spatial Temporal Objects)
+class TeQuerierImpl
+{
+	protected:
+		//! querier parameters that define the used querier strategy  
+		TeQuerierParams				params_;
+		TeTemporalSeries*			ts_;			//! temporal series
+		bool						filledSerie_;	//! this flag indicates if the temporal serie was filled 
+		TeAttributeList				attrList_;		//! list of the attributes of the querier 
+		
+	public:
+
+		//! Constructor
+		TeQuerierImpl(TeQuerierParams& par); 
+
+		//! Destructor
+		virtual ~TeQuerierImpl(); 
+
+		//! Returns the object identifier
+		string objectId() { return params_.objId();}
+
+		//! Returns the theme pointer
+		TeTheme* theme() { return params_.theme();} 
+
+		//! Loads the STOs
+		bool loadTimeFrameInstances(int frame=-1); 
+
+		//! Gets each temporal serie entry, for each time frame
+		bool getTSEntry(TeTSEntry& tsEntry, int frame);
+		
+		//! Gets the number of generated time frames 
+		int getNumTimeFrames(); 
+
+		//! Gets the full temporal serie
+		bool getTS(TeTemporalSeries& ts);
+
+		//! Returns the temporal serie params
+		TeTSParams& getTSParams();
+
+		//! Gets the attribute list from querier
+		TeAttributeList getAttrList() { return attrList_; }
+
+		//! Returns a default object
+		static TeQuerierImpl* DefaultObject(const TeQuerierParams& /*params*/)  { return 0; }
+
+		//! Returns the querier parameters
+		TeQuerierParams& params() { return params_; }
+		
+		//! Loads the STOs
+		virtual bool loadInstances(TeTSEntry* ent=0) = 0; 
+		
+		//! Returns each loaded STO
+		virtual bool fetchInstance(TeSTInstance& stoi)= 0;  
+
+		//! Returns the number of instances to each time frame
+		virtual int numElemInstances() { return 0;}
+
+		//! Empties querier instances
+		virtual void clear() { return; }
+};
+
+//! A class that define a factory to build querier strategies 
+class TeQuerierImplFactory : public TeFactory<TeQuerierImpl, TeQuerierParams>
+{
+
+public:
+
+	//! Builds an appropriate decoder from a identifier
+	TeQuerierImplFactory(const string& name) : TeFactory<TeQuerierImpl, TeQuerierParams>(name) { }
+
+	//! Destructor
+	virtual ~TeQuerierImplFactory() {}
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierParams.cpp b/src/terralib/kernel/TeQuerierParams.cpp
new file mode 100644
index 0000000..e4c039f
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierParams.cpp
@@ -0,0 +1,252 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation. 
+*************************************************************************************/
+
+#include "TeQuerierParams.h" 
+#include "TeDatabase.h"
+
+TeQuerierParams::~TeQuerierParams()
+{
+	if(themeFlag_)
+		delete theme_;
+}
+
+TeQuerierParams::TeQuerierParams(const TeQuerierParams& rhs)
+{
+	loadGeometries_ = rhs.loadGeometries_;  
+	loadAllAttributes_ = rhs.loadAllAttributes_;
+	loadAttrNames_ = rhs.loadAttrNames_;
+	loadAttrNamesSeted_ = rhs.loadAttrNamesSeted_;
+	themeFlag_ = false;
+	layer_ = rhs.layer_;
+
+	if ((rhs.themeFlag_) && layer_)
+	{
+		theme_ = new TeTheme("theme_", layer_); 
+		TeAttrTableVector attrTables;
+		layer_->getAttrTables(attrTables);
+		theme_->setAttTables(attrTables);
+		themeFlag_ = true;
+	}
+	else
+		theme_ = rhs.theme_;
+
+	fileName_ = rhs.fileName_;
+	chr_ = rhs.chr_;
+	objId_ = rhs.objId_;
+	groupingAttr_ = rhs.groupingAttr_;
+	strategy_ = rhs.strategy_;
+
+	//restrictions
+	selectedObjs_ = rhs.selectedObjs_;  
+	spatialRelation_ = rhs.spatialRelation_; 
+	hasSpatialRes_ = rhs.hasSpatialRes_; 
+	boxRest_ = rhs.boxRest_;	
+	geomRest_ = rhs.geomRest_;
+	geomRepRest_ = rhs.geomRepRest_;	
+}
+
+
+TeQuerierParams&
+TeQuerierParams::operator=(const TeQuerierParams& rhs)
+{
+	if (&rhs != this)
+	{
+		loadGeometries_ = rhs.loadGeometries_;  
+		loadAllAttributes_ = rhs.loadAllAttributes_;
+		loadAttrNames_ = rhs.loadAttrNames_;
+		loadAttrNamesSeted_ = rhs.loadAttrNamesSeted_;
+		themeFlag_ = false;
+		layer_ = rhs.layer_;
+
+		if ((rhs.themeFlag_) && layer_)
+		{
+			theme_ = new TeTheme("theme_", layer_); 
+			TeAttrTableVector attrTables;
+			layer_->getAttrTables(attrTables);
+			theme_->setAttTables(attrTables);
+			themeFlag_ = true;
+		}
+		else
+			theme_ = rhs.theme_;
+
+		fileName_ = rhs.fileName_;
+		chr_ = rhs.chr_;
+		objId_ = rhs.objId_;
+		groupingAttr_ = rhs.groupingAttr_;
+		strategy_ = rhs.strategy_;
+
+		//restrictions
+		selectedObjs_ = rhs.selectedObjs_;  
+		spatialRelation_ = rhs.spatialRelation_; 
+		hasSpatialRes_ = rhs.hasSpatialRes_; 
+		boxRest_ = rhs.boxRest_;	
+		geomRest_ = rhs.geomRest_;
+		geomRepRest_ = rhs.geomRepRest_;
+	}
+	return *this;
+}
+
+void 
+TeQuerierParams::setParams(TeLayer* layer)
+{
+	layer_ = layer;
+	if(theme_ == 0)
+	{
+		theme_ = new TeTheme("theme_", layer_); 
+		TeAttrTableVector attrTables;
+		theme_->layer(layer_);
+		layer_->getAttrTables(attrTables);
+		theme_->setAttTables(attrTables);
+		themeFlag_ = true;
+	}
+	strategy_ = "querierDBStr1";
+}	
+
+void 
+TeQuerierParams::setParams(TeTheme* theme, TeChronon chr)
+{
+	theme_ = theme;
+	chr_ = chr;
+	strategy_ = "querierDBStr1"; 
+
+	bool geomRep = (theme_->layer()->hasGeometry (TeCELLS) || theme_->layer()->hasGeometry (TePOINTS));
+	bool groupAttr = !(groupingAttr_.empty());
+	bool hasOneTable = true;
+
+	if(groupAttr)
+	{
+		string lastTable = "";
+		TeGroupingAttr::iterator it = groupingAttr_.begin();
+		while(it!=groupingAttr_.end())
+		{
+			string tableName;
+			size_t pos = (it->first.name_).find(".", string::npos,1);
+			if (pos != string::npos)
+				tableName = (it->first.name_).substr(0,pos);
+
+			if((!lastTable.empty()) && (lastTable!=tableName))
+			{
+				hasOneTable = false;
+				break;
+			}
+			lastTable = tableName;
+			++it;
+		}
+		
+		//verify if the statistis can be calculated by SGBD
+		TeGroupingAttr groups = groupingAttr_; 
+		string sGroup = theme->layer()->database()->getSQLStatistics(groups);
+		TeGroupingAttr::iterator itgroup = groups.begin();
+		while(itgroup!= groups.end())
+		{
+			if(itgroup->second != TeNOSTATISTIC)
+			{
+				strategy_ = "querierDBStr1";
+				return;
+			}
+			++itgroup;
+		}
+	}
+
+	if( groupAttr && hasOneTable && (!loadGeom()))
+		strategy_ = "querierDBStr2";
+	else if( groupAttr && hasOneTable && loadGeom() && geomRep)
+		strategy_ = "querierDBStr3";
+
+	return;
+}
+
+void 
+TeQuerierParams::setParams(TeTheme* theme, const string& objId, TeChronon chr)
+{
+	objId_ = objId;
+	setParams(theme, chr);
+}
+
+void 
+TeQuerierParams::setParams(const string& fileName, TeChronon chr)
+{
+	fileName_ = fileName;
+	chr_ = chr;
+	strategy_ = "querierSHP";
+}
+
+
+void 
+TeQuerierParams::setFillParams(bool loadGeom, bool loadAllAttr, vector<string> loadAttr)
+{
+	loadGeometries_ = loadGeom;
+	loadAllAttributes_ = loadAllAttr;
+	
+	if(!loadAttr.empty()) 
+		loadAllAttributes_ = false;
+	
+	loadAttrNames_ = loadAttr;
+	loadAttrNamesSeted_ = loadAttr;
+	groupingAttr_.clear(); 
+
+	if(theme_)
+		setParams(theme_, objId_, chr_);
+}
+
+void 
+TeQuerierParams::setFillParams(bool loadGeom, TeGroupingAttr attrG)
+{
+	loadGeometries_ = loadGeom;
+	loadAttrNames_.clear(); 
+	loadAttrNamesSeted_.clear(); 
+	groupingAttr_ = attrG;
+
+	if(theme_)
+		setParams(theme_, objId_, chr_);
+}
+
+void 
+TeQuerierParams::setSpatialRest(TeBox& box, int relation, TeGeomRep rep)
+{
+	hasSpatialRes_ = true;
+	boxRest_ = box;
+	spatialRelation_ = relation;
+	
+	if(rep==TeGEOMETRYNONE)
+		geomRepRest_ = theme_->layer()->vectRepres()[0]->geomRep_;
+	else
+		geomRepRest_ = rep;
+	
+	geomRest_ = 0;
+}
+
+void 
+TeQuerierParams::setSpatialRest(TeGeometry* geom, int relation, TeGeomRep rep)
+{
+	hasSpatialRes_ = true;
+	geomRest_ = geom;
+	spatialRelation_ = relation;
+	
+	if(rep==TeGEOMETRYNONE)
+		geomRepRest_ = theme_->layer()->vectRepres()[0]->geomRep_;
+	else
+		geomRepRest_ = rep;
+	
+	boxRest_ = TeBox();
+}
diff --git a/src/terralib/kernel/TeQuerierParams.h b/src/terralib/kernel/TeQuerierParams.h
new file mode 100644
index 0000000..323d0b7
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierParams.h
@@ -0,0 +1,208 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_PARAMS_H
+#define  __TERRALIB_INTERNAL_QUERIER_PARAMS_H
+
+#include "TeTheme.h"
+
+
+//! class to handle the parameters that define a querier 
+class TeQuerierParams
+{
+
+private:
+	
+	/* @name Params used to fill STOs */
+	//@{
+	bool					loadGeometries_;  
+	bool					loadAllAttributes_;
+	vector<string>			loadAttrNames_;
+	vector<string>			loadAttrNamesSeted_;
+	TeGroupingAttr			groupingAttr_;
+	//@}
+
+	bool					themeFlag_;	//! if the theme is a temporary theme
+	TeTheme*				theme_;		//! pointer to a theme
+	TeLayer*				layer_;		//! pointer to a layer
+	string					fileName_;	//! file name (.shp, etc)
+	
+	TeChronon				chr_;		//! chronon used to generate the slides 
+	string					objId_;		//! object identifier
+	
+	//TeStatisticType		tsOper_;		//operator used in the construction of temporal series
+	
+	string					strategy_;		//! strategy name
+
+	/* @name Restrictions */
+	//@{
+	TeSelectedObjects		selectedObjs_;  
+	
+	int						spatialRelation_; 
+	bool					hasSpatialRes_;
+	TeBox					boxRest_;		//box which defines the spatial restriction 
+	TeGeometry*				geomRest_;		//geometry which defines the spatial restriction 
+	TeGeomRep				geomRepRest_;	//geometry representation of the theme which will be 
+											//considered in the spatial restriction  
+	//@}
+
+public:
+
+	//! Constructor
+	TeQuerierParams(bool loadGeom = false, bool loadAllAttr = true): 
+			loadGeometries_(loadGeom),
+			loadAllAttributes_(loadAllAttr),
+			themeFlag_(false),
+			theme_ (0),
+			layer_ (0),
+			fileName_(""),
+			chr_ (TeNOCHRONON),
+			objId_(""),
+			selectedObjs_(TeAll),
+			spatialRelation_(0),
+			hasSpatialRes_(false),
+			geomRest_(0)
+			{ }
+
+	//! Constructor
+	TeQuerierParams(bool loadGeom, const vector<string>& loadAttr): 
+			loadGeometries_(loadGeom),
+			loadAllAttributes_(false),
+			themeFlag_(false),
+			theme_ (0),
+			layer_ (0),
+			fileName_(""),
+			chr_ (TeNOCHRONON),
+			objId_(""),
+			selectedObjs_(TeAll),
+			spatialRelation_(0),
+			hasSpatialRes_(false),
+			geomRest_(0)
+			{
+				loadAttrNamesSeted_.clear();
+				loadAttrNamesSeted_ = loadAttr;
+			}
+
+
+	//! Constructor
+	TeQuerierParams(bool loadGeom, TeGroupingAttr& groupAttr): 
+			loadGeometries_(loadGeom),
+			loadAllAttributes_(false),
+			themeFlag_(false),
+			theme_ (0),
+			layer_ (0),
+			fileName_(""),
+			chr_ (TeNOCHRONON),
+			objId_(""),
+			selectedObjs_(TeAll),
+			spatialRelation_(0),
+			hasSpatialRes_(false),
+			geomRest_(0)
+			{
+				groupingAttr_.clear();
+				groupingAttr_ = groupAttr;
+			}
+	
+	//! Destructor
+	~TeQuerierParams();
+
+	//! Copy Constructor
+	TeQuerierParams(const TeQuerierParams& qp);
+
+	TeQuerierParams& operator=(const TeQuerierParams& rhs);
+
+	/* @name Sets params */
+	// @{
+	void setParams(TeLayer* layer);
+
+	void setParams(TeTheme* theme, TeChronon chr=TeNOCHRONON); 
+
+	void setParams(TeTheme* theme, const string& objId, TeChronon chr=TeNOCHRONON);
+
+	void setParams(const string& fileName, TeChronon chr=TeNOCHRONON);
+	// @}
+
+	//! Sets the params to fill the STO
+	void setFillParams(bool loadGeom, bool loadAllAttr, vector<string> loadAttr = vector<string>());
+
+	//! Sets the params to fill the STO
+	void setFillParams(bool loadGeom, TeGroupingAttr attrG);
+	
+	//! Set the spatial restriction to be a spatial relation with a box
+	void setSpatialRest(TeBox& box, int relation = TeWITHIN, TeGeomRep rep = TeGEOMETRYNONE); 
+	//! Set the spatial restriction to be a spatial relation with a geometry
+	void setSpatialRest(TeGeometry* geom, int relation = TeWITHIN, TeGeomRep rep = TeGEOMETRYNONE); 
+
+	//! Set selected objects
+	void setSelecetObjs(TeSelectedObjects so) { selectedObjs_ = so; }
+
+	//! Sets the attributes that will be loaded
+	void setLoadAttrs(const vector<string>& vec) { loadAttrNames_ = vec; }
+
+	//! Returns the identifier of the strategy associated to the querier
+	string decName() { return strategy_; }
+
+	//! Returns the theme
+	TeTheme* theme() { return theme_; }
+
+	//! Returns the layer
+	TeLayer* layer() { return layer_; }
+
+	//! Returns the file name
+	string fileName() { return fileName_; }
+	
+	//! Returns the chronon
+	TeChronon chronon()	{ return chr_; }
+	
+	//! Returns the object identifier
+	string objId() { return objId_; }
+	
+	//! Returns the attributes that will be grouped
+	TeGroupingAttr& groupAttr() { return groupingAttr_;}
+
+	//! Returns if it loads geometries
+	bool loadGeom ()  { return	loadGeometries_; }
+	
+	//! Returns if it loads all attributes 
+	bool loadAllAttr() { return loadAllAttributes_;}
+
+	//! Returns the attributes that will be loaded
+	vector<string>& loadAttrs() { return loadAttrNames_;}
+
+	//! Returns the original attributes that will be loaded
+	vector<string>& loadSetedAttrs() { return loadAttrNamesSeted_;}
+
+	TeSelectedObjects selectedObjs() { return selectedObjs_; }
+	
+	int spatialRelation() { return spatialRelation_; }
+
+	bool hasSpatialRes() { return hasSpatialRes_;}
+	
+	TeBox boxRest() { return boxRest_; } 
+
+	TeGeometry* geomRest() { return geomRest_; }
+
+	TeGeomRep  geomRepRest() { return geomRepRest_; }
+};
+
+#endif
diff --git a/src/terralib/kernel/TeQuerierSHP.h b/src/terralib/kernel/TeQuerierSHP.h
new file mode 100644
index 0000000..c5d7eba
--- /dev/null
+++ b/src/terralib/kernel/TeQuerierSHP.h
@@ -0,0 +1,70 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_QUERIER_SHP_H
+#define  __TERRALIB_INTERNAL_QUERIER_SHP_H
+
+#include "TeQuerierImpl.h"
+
+
+//! A class to build STOs (Spatial Temporal Objects) from a shape file 
+class TeQuerierSHP : public TeQuerierImpl
+{
+	public:
+
+		//! Constructor
+		TeQuerierSHP(TeQuerierParams& params): TeQuerierImpl(params)
+		{ }
+
+		
+		//! Returns the file name 
+		string fileName () { return params_.fileName(); }
+
+		bool loadInstances(TeTSEntry* /* ent */ = 0) { return false; }
+		
+		bool loadStatistics(TeTSEntry* /* ent */ = 0) { return false; } 
+
+		bool fetchInstance(TeSTInstance& /* stoi */) { return false; } 
+
+		bool getBasicStatistics(TeStatisticValMap& /* stats */, TeTSEntry* /* ent */ = 0) { return false; }
+};
+
+//! A class that define a factory to build a querier strategy from shape file
+class TeQuerierSHPFactory : public TeQuerierImplFactory
+{
+public:
+
+	//! Constructor
+	TeQuerierSHPFactory(const string& name) : TeQuerierImplFactory(name) {}
+
+	//! Builds a shapefile querier
+	virtual TeQuerierImpl* build (const TeQuerierParams& arg)
+	{  
+		TeQuerierParams tempArg = arg;
+		return new TeQuerierSHP(tempArg); 
+	}
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeRaster.cpp b/src/terralib/kernel/TeRaster.cpp
new file mode 100644
index 0000000..ea98cf9
--- /dev/null
+++ b/src/terralib/kernel/TeRaster.cpp
@@ -0,0 +1,632 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeRaster.h>
+#include <TeDecoder.h>
+#include <TeUtils.h>
+#include <TeStdFile.h>
+#include <TeException.h>
+#include "TeRasterRemap.h"
+#include "TeDecoderMemory.h"
+
+#include <algorithm>
+
+
+//!	virtual class that define the strategics of the iteratorPoly, each strategic is a functor
+class TeStrategic
+{
+protected:
+	TeRaster*		raster_;
+	double			y_;
+	TeCoordPairVect	SegOut_;   //line and column index 
+
+public:
+	TeStrategic(TeRaster* r=0, double y=0): raster_(r), y_(y) {}
+
+    virtual ~TeStrategic() {}
+
+	void Init(TeRaster* r, double y)
+	{
+		raster_ = r;
+		y_ = y;
+	}
+	
+	virtual void strateg(double xMin, double xMax, double y) = 0;  
+
+	void operator() (TeCoordPair& pair)
+	{
+		//xmin and xmax of the segment (line and column index)
+		double xMinSegCM = pair.pt1.x();  
+		double xMaxSegCM = pair.pt2.x();
+
+		//line and column index of the segment
+		TeCoord2D minSegCM(xMinSegCM, y_);
+		TeCoord2D maxSegCM(xMaxSegCM, y_);
+
+		TeCoord2D minSegLC = raster_->coord2Index (minSegCM);
+		TeCoord2D maxSegLC = raster_->coord2Index (maxSegCM);
+
+		double xMinLCd = minSegLC.x();
+		double xMaxLCd = maxSegLC.x();
+		double yLC = maxSegLC.y();
+		
+		//verify if is outside raster area 
+		if(xMinLCd<-0.5)
+		{
+			if(xMaxLCd<-0.5)
+				return;
+			else
+				xMinLCd=-0.5;
+		}
+		
+		strateg(xMinLCd, xMaxLCd, yLC);
+	}
+
+	TeCoordPairVect result() const {return SegOut_;}
+};
+
+
+//!	functor TePixelBoxInPoly
+/*
+	return the elements of the raster which box is 
+	contained in the polygon
+*/
+class TePixelBoxInPoly: public TeStrategic
+{
+
+public:
+	TePixelBoxInPoly(TeRaster* r=0, double y=0): TeStrategic(r,y) {}
+
+    virtual ~TePixelBoxInPoly() {}
+
+    void strateg(double xMin, double xMax, double y)
+	{
+		//verify if contain the element center 
+		int xMinLCi = TeRoundRasterIndex(xMin);
+		int xMaxLCi = TeRoundRasterIndex(xMax);
+		
+		if (xMinLCi < xMin)
+			xMinLCi++;
+
+		if (xMaxLCi > xMax)
+			xMaxLCi--;
+
+		if (xMinLCi <= xMaxLCi)
+		{
+			//new segment 
+			TeCoord2D minLC (xMinLCi, y);
+			TeCoord2D maxLC (xMaxLCi, y);
+
+			TeCoordPair res;
+			res.pt1 = minLC; 
+			res.pt2 = maxLC; 
+
+			SegOut_.push_back (res);
+		}
+	}
+	
+};
+
+
+//!	functor TePixelBBInterPoly
+/*
+	return the elements of the raster "cujo" boundingbox 
+	intersects the polygon
+*/
+class TePixelBBInterPoly: public TeStrategic
+{
+	
+public:
+	TePixelBBInterPoly(TeRaster* r=0, double y=0): TeStrategic(r,y) {}
+
+    virtual ~TePixelBBInterPoly() {}
+
+	void strateg(double xMin, double xMax, double y)
+	{		
+		//element center 
+		int xMinLCi = TeRoundRasterIndex(xMin);
+		int xMaxLCi = TeRoundRasterIndex(xMax);
+
+		if (SegOut_.size()>0)
+		{
+			TeCoordPair prev = SegOut_[SegOut_.size()-1];
+			if (xMinLCi == prev.pt2.x())
+				xMinLCi++;
+			if (xMinLCi > xMaxLCi)
+				return;
+		}
+		
+		TeCoord2D minLC (xMinLCi, y);
+		TeCoord2D maxLC (xMaxLCi, y);
+			
+		TeCoordPair res;
+		res.pt1 = minLC; 
+		res.pt2 = maxLC; 
+
+		SegOut_.push_back (res);
+	}
+};
+
+
+TeCoordPairVect 
+applyStrategic(double& y, double ymin, double xmin, TeStrategicIterator st, TeRaster* raster, TePolygon& poly)
+{
+	TeCoordPairVect Segments = TeGetIntersections(poly, y);
+	double resy = raster->params().resy_;
+
+	//In polygon
+	if((st==TeBoxPixelIn) || (st==TeBBoxPixelInters))
+	{
+		bool empty=false;
+		if(Segments.empty())
+
+		{
+			empty = true;
+			y -= resy; 
+			while((y>=ymin) && (empty)) 
+			{
+				Segments = TeGetIntersections(poly, y);
+				if(!Segments.empty())
+					empty = false;
+				else
+					y -=resy;
+			}
+		}
+		if(!empty)
+		{
+			if (st==TeBoxPixelIn)
+			{
+				TePixelBoxInPoly strat(raster,y);
+				strat = for_each(Segments.begin (), Segments.end(), strat);
+				return strat.result();
+			}
+			else
+			{
+				TePixelBBInterPoly strat(raster,y);
+				strat = for_each(Segments.begin (), Segments.end(), strat);
+				return strat.result();
+			}
+		}
+	}
+	//Out polygon
+	else if((st==TeBoxPixelOut) || (st==TeBBoxPixelNotInters))
+	{
+		int nCols = raster->params().ncols_;
+	
+		//se o segmento for vazio, n�o h� interse��o entre essa linha e o pol�gono
+		//fazer um segmento de todas as colunas
+		if(Segments.empty())
+		{
+			//passar para indice: linha e coluna
+			TeCoord2D coordCM (xmin, y);
+			double linLC = (raster->coord2Index(coordCM)).y();
+			
+			int lin = TeRoundRasterIndex(linLC);
+			
+			TeCoord2D index1(0, lin);
+			TeCoord2D index2(nCols-1,lin);
+			
+			TeCoordPair pair;
+			pair.pt1=index1;
+			pair.pt2=index2;
+
+			Segments.push_back(pair);
+			return Segments;
+		}
+		else
+		{
+			TeCoordPairVect segsIn, segResult;
+			
+			if(st==TeBoxPixelOut)
+			{
+				TePixelBoxInPoly strat(raster,y);
+				//return the segments in the polygon
+				strat = for_each(Segments.begin (), Segments.end(), strat);
+				segsIn = strat.result();
+			}
+			else
+			{
+				TePixelBBInterPoly strat(raster,y);
+				//return the segments in the polygon
+				strat = for_each(Segments.begin (), Segments.end(), strat);
+				segsIn = strat.result();
+			}
+			
+			TeCoordPairVect::iterator it = segsIn.begin();
+
+			double colMin = 0;
+			double colMax;
+			double lin;
+
+			while(it!=segsIn.end())
+			{
+				TeCoord2D coord1 = (*it).pt1;
+				TeCoord2D coord2 = (*it).pt2;
+				lin = coord1.y();
+				
+				colMax = coord1.x()-1;
+
+				if (colMax >= colMin)
+				{
+					TeCoord2D index1(colMin, lin);
+					TeCoord2D index2(colMax, lin);
+				
+					TeCoordPair pair;
+					pair.pt1=index1;
+					pair.pt2=index2;
+
+					segResult.push_back(pair);
+				}
+				colMin = coord2.x()+1;
+				++it;
+			}
+
+			//Montar o �ltimo segmento
+			TeCoord2D index1(colMin, lin);
+			TeCoord2D index2(nCols-1,lin);
+			
+			TeCoordPair pair;
+			pair.pt1=index1;
+			pair.pt2=index2;
+
+			segResult.push_back(pair);
+			return segResult;
+		}
+	}
+	
+	return Segments;
+}
+
+
+TeRaster::TeRaster( TeRasterParams& pars ) 
+{
+	decoder_ = 0;
+	string decName;
+	params_.status_ = TeNOTREADY;
+	if (pars.decoderIdentifier_.empty())   // the decoder is not especified in raster parameters
+	{	
+		if (!pars.fileName_.empty())     // try to guess from the file name
+		{	
+			string ext = TeGetExtension(pars.fileName_.c_str());
+			decName = TeDecoderFactory::instanceName2Dec()[ext];
+			if ( decName.empty())
+				return;
+			pars.decoderIdentifier_ = decName;
+		}
+		else // no decoder type, and no filename
+			return;
+	}
+	decoder_ = TeDecoderFactory::make(pars);
+	if (decoder_)
+	{
+		params_ = decoder_->params();
+		box_ = decoder_->params().box();
+	}
+}
+
+TeRaster::TeRaster( const string& filename, const char& mode ) 
+{
+	params_.fileName_ = filename;
+	params_.mode_ = mode;
+	decoder_ = 0;
+	params_.status_ = TeNOTREADY;
+	string decName;
+	if (!filename.empty())
+	{
+		string ext = TeGetExtension(filename.c_str());
+		decName = TeDecoderFactory::instanceName2Dec()[ext];
+		if (decName.empty())
+			return;
+	}
+	else
+		return;
+
+	params_.decoderIdentifier_= decName;
+	decoder_ = TeDecoderFactory::make (params_);
+	if (decoder_)
+	{
+		params_ = decoder_->params();
+		box_ = decoder_->params().box();
+	}
+}
+
+
+TeRaster::TeRaster(int ncols, int nlines, int nbands, TeDataType elemType)
+{
+	params_.decoderIdentifier_= "MEM";
+	params_.ncols_ = ncols;
+	params_.nlines_ = nlines;
+	params_.nBands(nbands);
+	params_.setDataType(elemType);
+	params_.mode_ = 'c';
+	params_.lowerLeftResolutionSize(0.5,0.5,1.0,1.0,params_.ncols_,params_.nlines_,true);
+	TeProjection* proj = new TeNoProjection();
+	params_.projection(proj);
+	decoder_ = new TeDecoderMemory(params_);
+	delete proj;
+	if (decoder_)
+	{
+		params_ = decoder_->params();
+		box_ = decoder_->params().box();
+	}
+}
+
+
+TeRaster::~TeRaster( ) 
+{
+	if (decoder_)
+		delete decoder_;
+}
+
+bool TeRaster::init( TeRasterParams& pars )
+{ 
+	if (!decoder_ )	
+	{
+		params_.status_ = TeNOTREADY;
+		string decName;
+		if (params_.decoderIdentifier_.empty())   // the decoder is not especified in raster parameters
+		{	
+			if (!params_.fileName_.empty())     // try to guess from the file name
+			{	
+				string ext = TeGetExtension(params_.fileName_.c_str());
+				decName = TeDecoderFactory::instanceName2Dec()[ext];
+				if ( decName.empty())
+					return false;
+				params_.decoderIdentifier_ = decName;
+			}
+			else // no decoder type, and no filename
+				return false;
+		}
+		decoder_ = TeDecoderFactory::make(params_);
+		if (!decoder_)
+			return false;
+	}
+	decoder_->init(pars);
+	params_ = decoder_->params();
+	box_ = decoder_->params().box();
+	return (params_.status_ != TeNOTREADY);
+}
+
+bool TeRaster::init()
+{ 
+	if (decoder_)
+	{
+		decoder_->init(params_);
+		params_ = decoder_->params();	
+		return (params_.status_ != TeNOTREADY);
+	}
+	return false;
+}
+
+bool TeRaster::setElement (int col, int lin, double val,int band)
+{
+	if (params_.status_!=TeREADYTOWRITE)
+		return false;
+	if ( col < 0 || col >= params_.ncols_ ||
+		 lin < 0 || lin >= params_.nlines_ ||
+		 band < 0 || band >= params_.nBands())
+		return false;
+
+	bool res = decoder_->setElement(col,lin,val,band);
+	if ( res && (!params_.useDummy_ || val != params_.dummy_[band]))
+	{
+		// check if should update min and max values
+		if (val < params_.vmin_[band])
+		{
+			params_.vmin_[band] = val;
+			decoder_->params().vmin_[band] = val;
+		}
+
+		if (val > params_.vmax_[band])
+		{
+			params_.vmax_[band] = val;
+			decoder_->params().vmax_[band] = val;
+		}
+	}
+	return res;
+}
+
+bool TeRaster::getElement (int col, int lin, double& val,int band) 
+{
+	if (!params_.status_ || col < 0 || col >= params_.ncols_  || 
+		 lin < 0 || lin >= params_.nlines_  ||
+		 band < 0 || band >= params_.nBands())
+		return false;
+
+	if (decoder_->getElement (col,lin,val,band) && 
+	   (!params_.useDummy_ || val != params_.dummy_[band]))	
+		return true;
+	else
+		return false;
+}
+
+TeRaster::iteratorPoly 
+TeRaster::begin(TePolygon& poly, TeStrategicIterator st, int band)
+{
+	double	minLinLC, maxLinLC, minColLC, maxColLC; //index
+	double	minLinCM, maxLinCM, minColCM, maxColCM; //world coordinates 
+	int		nlines = 0; 
+	int		ncols = 0;
+	double	resy = params_.resy_;
+	bool	end = false;
+
+	if((st==TeBoxPixelOut) || (st==TeBBoxPixelNotInters))  //out polygon
+	{
+		minLinLC = (params_.nlines_-1);
+		maxLinLC = 0.0;
+		minColLC = 0.0;
+		maxColLC = (params_.ncols_-1);
+	}
+	else  //in polygon
+	{
+		//box (world coordinates) of the polygon
+		TeBox boxPol = poly.box();
+		
+		//change to line and column index
+		TeCoord2D minColLinLC = coord2Index(boxPol.lowerLeft());
+		TeCoord2D maxColLinLC = coord2Index(boxPol.upperRight());
+
+		//segment that pass by center of the element  
+		minLinLC = TeRound(minColLinLC.y());
+		maxLinLC = TeRound(maxColLinLC.y());
+		minColLC = TeRound(minColLinLC.x());
+		maxColLC = TeRound(maxColLinLC.x());
+		
+		//number of lines and columns of the polygon box 
+		nlines = (int)((minLinLC - maxLinLC)+1);
+		ncols = (int)((maxColLC - minColLC)+1);
+
+
+		//if is negative 
+		if(minLinLC<-0.5)
+		{
+			if(maxLinLC<-0.5)
+				end=true;
+			else
+				minLinLC = -0.5;
+		}
+
+		if(minColLC<-0.5)
+		{
+			if(maxColLC<-0.5)
+				end=true;
+			else
+				minColLC = -0.5;
+		}
+	}
+	
+	TeCoord2D MinColLinLC(minColLC, minLinLC); 
+	TeCoord2D MaxColLinLC(maxColLC, maxLinLC);
+
+	//calculate the minimal and maximal line and minimal column (in world coordinates) 
+	TeCoord2D MinColLinCM = index2Coord(MinColLinLC);
+	minLinCM = MinColLinCM.y();
+	minColCM = MinColLinCM.x();
+	maxLinCM = index2Coord(MaxColLinLC).y();
+	maxColCM = index2Coord(MaxColLinLC).x();
+	
+	TeCoordPairVect segRes;
+	bool empty = true;
+	bool first = true;
+	
+	while(empty && (maxLinCM >= minLinCM))  
+	{
+		if(!first)
+		{
+			maxLinCM -= resy;
+			TeCoord2D maxColLinLC = coord2Index(TeCoord2D(maxColCM,maxLinCM));
+			maxLinLC = TeRound(maxColLinLC.y());
+		}
+			
+		segRes = applyStrategic(maxLinCM, minLinCM, minColCM, st, this, poly);
+		empty = segRes.empty();
+		first = false;
+	}
+
+	if(!segRes.empty())
+	{
+		minColLC = segRes[0].pt1.x();
+		double lMin = segRes[0].pt1.y();
+		maxColLC = segRes[0].pt2.x();
+	
+		int cCurr = TeRound(minColLC);  //column current
+		int lCurr = TeRound(lMin);		//line current
+
+		iteratorPoly itPoly(cCurr, lCurr, params_.ncols_, params_.nlines_, params_.nBands(), this, poly, 
+						st, maxLinLC, minLinLC, minColLC, maxColLC, segRes, 
+						0, nlines, ncols, end, minLinCM);
+		return itPoly;
+	
+	}
+	else
+	{
+		iteratorPoly itPoly = this->end(poly, st, band);
+		return itPoly;
+	}
+}
+
+
+bool
+TeRaster::fillRaster(TeRaster* dstRaster, TeRasterTransform* transf, bool bestRes)
+{	
+	if (!dstRaster->status() || !decoder_)
+		return false;
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+
+	TeRasterRemap fillRemap;
+	fillRemap.setOutput(dstRaster);
+	fillRemap.setInput(this);
+	fillRemap.setTransformer(transf);
+	int res = 1;
+	TeBox b = dstRaster->params().boundingBox();
+	if (bestRes)
+	   res = decoder_->bestResolution(b, dstRaster->params().nlines_, dstRaster->params().ncols_,
+									  dstRaster->params().projection());
+	this->clearBlockSelection();
+	bool result = true;
+	TeRasterParams parBlock;
+	if (selectBlocks(b, res, parBlock))
+	{
+		if (TeProgress::instance())
+			TeProgress::instance()->setTotalSteps(this->numberOfSelectedBlocks());
+		TeRaster* block = new TeRaster;
+		TeDecoderMemory* decMem = new TeDecoderMemory(parBlock);
+		decMem->init();
+		int n = 0;
+		t2 = clock();
+		t0 = t1 = t2;
+		bool flag = true;
+		do
+		{
+			flag = fetchRasterBlock(decMem);
+			block->setDecoder(decMem);
+			fillRemap.setInput(block);
+			if (!fillRemap.apply())
+				break;
+			n++;
+			if (TeProgress::instance())
+			{
+				t2 = clock();
+				if (int(t2-t1) > dt)
+				{
+					t1 = t2;
+					if (TeProgress::instance()->wasCancelled())
+						break;
+					if((int)(t2-t0) > dt2)	// show progress 
+						TeProgress::instance()->setProgress(n);
+				}
+			}
+		}while (flag);
+		decMem->clear();
+		delete block;
+	}
+	else
+		result =  fillRemap.apply();
+	this->clearBlockSelection();
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return result;
+}
diff --git a/src/terralib/kernel/TeRaster.h b/src/terralib/kernel/TeRaster.h
new file mode 100644
index 0000000..0b597d6
--- /dev/null
+++ b/src/terralib/kernel/TeRaster.h
@@ -0,0 +1,627 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRaster.h
+    This file contains structures and definitions to deal with raster structures
+*/
+#ifndef  __TERRALIB_INTERNAL_RASTER_H
+#define  __TERRALIB_INTERNAL_RASTER_H
+
+#include "TeDecoder.h"
+#include "TeDataTypes.h"
+#include "TeCoord2D.h"
+#include "TeAttribute.h"
+#include "TeGeometry.h"
+#include "TeGeometryAlgorithms.h"
+
+class TeRasterTransform;
+
+#include <map>
+
+//! Strategy used to decide if a pixel is inside/outside a polygon
+enum TeStrategicIterator
+{	TeBoxPixelIn,			//!< center of pixel is inside the geometry
+	TeBBoxPixelInters,		//!< bounding box of pixel intercepts the geometry
+	TeBoxPixelOut,			//!< center of pixel is outside the geometry
+	TeBBoxPixelNotInters	//!< bounding box of pixel do not intercept the geometry
+};
+
+/*! \fn bool TeCoordPairVect applyStrategic(double& y, double ymin, double xmin, TeStrategicIterator st, TeRaster* raster, TePolygon& poly);
+    \brief Returns  
+	\param y         
+	\param ymin         
+	\param xmin         
+	\param st pixel in polygon strategy       
+    \param raster pointer to raster
+	\param poly polygon        
+	*/
+TeCoordPairVect 
+applyStrategic(double& y, double ymin, double xmin, 
+			   TeStrategicIterator st, TeRaster* raster, TePolygon& poly);
+
+//! Support for a raster geometry 
+/*
+	\par A Raster Geometry is made of a matrix of ncolumns x nlines elements
+	with nBands dimension. Each element, or pixel, of the raster its is
+	indexed by a column, line and band and has a double value associated.
+	\par Each Raster geometry has a decoder associated to it. Its decoder 
+	knows how to get return the value (as a double) of each pixel.
+	\par All information about the data is stored in a TeRasterParams structure
+	that is duplicated in its decoder.
+	\sa TeDecoder TeRasterParams
+*/
+class TeRaster : public TeGeometry
+{
+	TeRasterParams  params_;	//!< structure that describes all information about a raster 
+	TeDecoder		*decoder_;	//!< pointer to a decoder of values
+public:
+
+	//! Constructor from file
+	/*!
+	  This method tries to instatiate a decoder for this data from the 
+	  file extension of the filename. 
+      \param filename the name of a file that contains the raster data
+      \param mode file opening mode ('r', 'w' or 'c')
+	  \par Obs: the method init should be called before any attempt to read or write this raster data 
+	*/
+	TeRaster(const string& filename, const char& mode = 'r');
+
+	//! Constructor from parameters
+	/*!
+	  This method tries to instatiate a decoder for this data. It uses the identification
+	  explicitly described or the extension of a file name specified in the parameters.
+      \param pars a raster parameters structure that contains information about the raster
+	  \par Obs: the method init should be called before any attempt to read or write data 
+	  to the raster.
+	*/
+	TeRaster(TeRasterParams& pars);
+
+	//! Contructor from commom parameters
+	/*
+		This method creates a raste data in memory, using only the most basic
+		parameters:
+		\par ncols number of columns
+		\par nlines number of lines
+		\par nbands number of bands
+		\par elemType size of each element
+	*/
+	TeRaster(int ncols, int nlines, int nbands, TeDataType elemType);
+
+	//! Empty constructor
+	TeRaster() : decoder_(0) {}
+
+	//! Destructor
+	~TeRaster ();
+
+	//! Returns the parameters of the raster
+	TeRasterParams& params()
+	{ return params_; }
+	
+	//! Returns the number of lines of the raster
+	int nBands()
+	{ return params_.nBands(); }
+
+	//! Update the parametes of a raster file
+	/*!
+      \param par a new raster parameters structure
+	*/
+	void updateParams( TeRasterParams& par)
+	{
+		params_ = par;	// update raster parameters
+		if (decoder_)
+			decoder_->updateParams(par);		// update its decoder parameters
+		box_ = params_.box();
+	}
+
+	//! Returns the type of the geometry
+	TeGeomRep elemType() { return TeRASTER; }
+
+	//! Associate a decoder to a raster
+	/*!
+      \param dec pointer to a raster decoder
+	*/
+	void setDecoder( TeDecoder* dec )
+	{ 
+		if (dec)
+		{
+			decoder_ = dec;					// set the decoder
+			params_ = decoder_->params();	// copy decoder parameters to raster
+			box_ = params_.box();
+		}
+	}
+
+	//! Returns status of the raster
+	int status() 
+	{ return params_.status_; }
+
+	//! Returns a pointer to the decoder associated to this raster
+	TeDecoder* decoder( )
+	{ return decoder_; }
+
+	//! Returns a pointer to the raster projection
+	TeProjection* projection () 
+	{ return params_.projection(); }
+
+	//! Sets the value of a element of the raster 
+	/*!
+      \param col column number
+	  \param lin line number
+	  \param val element value
+	  \param band band number
+	*/
+	bool setElement (int col, int lin, double val, int band=0);
+
+	//! Gets the value of a element of the raster 
+	/*!
+      \param col column number
+	  \param lin line number
+	  \param val element value
+	  \param band band number
+	*/
+	bool getElement (int col, int lin, double& val, int band=0);
+
+	//! Fills a destination raster with the raster elements
+	/*
+		\param dstRaster destination raster
+		\param transf pixel evaluator to be used
+		\param bestRes flag to indicate that it should use the best resolution available
+	*/
+	bool fillRaster (TeRaster* dstRaster, TeRasterTransform* transf=0, bool bestRes = true);
+
+	//! Initalize the raster decoding tool from its parameters
+	/*! The result of this method depends on the mode_ specified in the parameters. 
+		\par 'r' : initializes a raster with reading only permission. If the source
+		of the data doesn�t exist it will fail.
+		\par 'w' : initializes a raster with reading and writting permission. If the source
+		of the data doesn�t exist will fail.
+		\par 'c' : creates a new raster data with default values. Initializes it with 
+		reading and writting permision. Fails if creation fail.
+	*/
+	bool init();
+
+	//! Initalize the raster decoding tool from a raster parameters structure
+	/*!
+		\return true if raster is read to be read/written and false otherwise.
+	*/
+	bool init(TeRasterParams& pars);
+  
+	//! Clear internal structures and disable the raster decoding tool
+	void clear()
+	{
+		if (decoder_)
+			decoder_->clear();
+	}
+
+	//! Transform a coordinate from line/column domain to projection domain
+	TeCoord2D index2Coord(TeCoord2D pt)
+	{ return decoder_->index2Coord(pt); }
+
+	//! Transform a coordinate from projection domain domain to line/column
+	TeCoord2D coord2Index(TeCoord2D pt)
+	{ return decoder_->coord2Index(pt); }
+
+	//----------------
+	//! A raster iterator
+	/*! 
+		An strucuture that allows the traversal over the raster elements 
+		(pixels) in a similar way as the STL iterators. 
+	*/
+	class iterator
+	{
+	public:
+
+		//! Constructor
+		/*!
+		  \param c0 initial column
+		  \param l0 initial line
+		  \param nc number of columns
+		  \param nl number of lines
+		  \param nb number of bands
+		  \param pt pointer to the raster to iterate
+		*/
+		 iterator(int c0=0, int l0=0, int nc=0, int nl=0, int nb=0, TeRaster* pt=0) : 
+		  linCurrent_(l0),
+		  colCurrent_(c0),
+		  nLines_(nl),
+		  nCols_(nc),
+		  nBands_(nb),
+		  raster_(pt)
+		  {}  
+
+		//! Move iterator forward
+		virtual void moveForward()
+		{
+			this->operator++();
+		}
+
+		//! Prefix move forward operator
+		iterator& operator++()
+		{
+			if (++colCurrent_ == nCols_)
+			{
+				if (linCurrent_ < nLines_-1)
+				{
+					linCurrent_++;
+					colCurrent_ = 0;
+				}
+			}
+			return *this;
+		}
+
+		//! Posfix move forward operator
+		iterator operator++(int)	
+		{
+			iterator temp = *this;
+			++(*this);
+			return temp;
+		}
+
+		//! Returns iterator current line 
+		int currentLine()
+		{ return linCurrent_;}
+
+		//! Returns iterator current column
+		int currentColumn()
+		{return colCurrent_; }
+
+		//! Returns the number of bands
+		int nBands(void)
+		{	return nBands_; }
+
+		//! Iterator de-referencing operator
+		/*!
+			\return a vector (with nbands_ size) with the values in
+			each band, of the element pointed by the iterator
+		*/
+		vector<double> operator*()
+		{
+			vector<double> vt(nBands_);
+			if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+			{
+				for (int n=0; n<nBands_; n++)
+					raster_->getElement(colCurrent_,linCurrent_,vt[n],n);
+			}
+			return vt;
+		}
+		
+		//! Returns the value in a given band of a element pointed by the iterator 
+		double operator*(int band)
+		{
+			double val = 0.0;
+			if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+			{
+				if (raster_->getElement(colCurrent_,linCurrent_,val,band))
+					return val;
+			}
+			return 0.0;
+		}
+
+		//! Returns whether two iterators point to the same element
+		bool operator==(const iterator& rhs) const
+		{
+			return (this->colCurrent_ == rhs.colCurrent_ && this->linCurrent_== rhs.linCurrent_);
+		}
+
+		//! Returns whether two iterators point to the different elements
+		bool operator!=(const iterator& rhs) const
+		{
+			return (this->colCurrent_ != rhs.colCurrent_ || this->linCurrent_!= rhs.linCurrent_);
+		}
+
+	protected:
+		int linCurrent_, colCurrent_;
+		int nLines_, nCols_;
+		int nBands_;
+		TeRaster* raster_;
+	};   
+
+	// ---------------------  End of class raster Iterator
+
+	//----------------
+	//! A raster iterator with a restriction of area 
+	/*! 
+		A strucuture that allows to cover the raster elements 
+		(pixels) that are IN or OUT a specific region (polygon)  
+	*/
+	class iteratorPoly : public iterator
+	{
+		public:
+			//! Constructor
+			/*!
+			\param colCurr	initial column
+			\param linCurr	initial line
+			\param nc		number of columns
+			\param nl		number of lines
+			\param nb		number of bands
+			\param pt		pointer to the raster that will be covered
+			\param poly		polygon that defines a specific region 
+			\param str		strategic of the iterator, IN or OUT the polygon 
+			\param linMin	minimal line of the raster that will be covered
+			\param linMax	maximal line of the raster that will be covered
+			\param colMin	minimal column of the raster that will be covered
+			\param colMax	maximal column of the raster that will be covered
+			\param seg		the segments of intersection of the current line 
+			\param posSeg	the current segment 
+			\param nlInPoly		number of lines IN the polygon
+			\param nColsInPoly	number of columns IN the polygon 
+			\param e			iterator end
+			\param minLinCM		minimal line (in world coordinates)
+			\param band			band to iterate
+			*/
+			iteratorPoly(int colCurr, int linCurr, int nc, int nl, int nb, TeRaster* pt, TePolygon& poly,
+						 TeStrategicIterator str, double linMin=0.0, double linMax=0.0, double colMin=0.0, 
+						 double colMax=0.0, TeCoordPairVect seg=TeCoordPairVect(),  
+						 int posSeg=0, int nlInPoly=0, int nColsInPoly=0, bool e=true, double minLinCM=0.0, int band = 0):
+				iterator(colCurr,linCurr,nc,nl,nb,pt),
+				linMin_(linMin),
+				linMax_(linMax),
+				colMin_(colMin),
+				colMax_(colMax),
+				segments_(seg),
+				posSegments_(posSeg),
+				poly_(poly),
+				end_(e),
+				strategy_(str),
+				nLinesInPoly_(nlInPoly),
+				nColsInPoly_(nColsInPoly),
+				linMinCM_(minLinCM),
+				band_(band)
+				{}
+			
+			//! empty contructor
+			iteratorPoly(TeRaster* raster = 0): 
+				iterator(0,0,0,0,0,raster),
+				linMin_(0.0),
+				linMax_(0.0),
+				colMin_(0.0), 
+				colMax_(0.0),
+				posSegments_(0),
+				end_(true),
+				nLinesInPoly_(0),
+				nColsInPoly_(0),
+				band_(0)
+				{}
+
+			//! destructor
+			virtual ~iteratorPoly() {}
+
+			//! calculate the segment of the current line that intersect the polygon  					
+			void getNewSegment(int linCurr)
+			{
+				//change to world coordinates
+				TeCoord2D coord(colMin_,linCurr);
+				TeCoord2D colLinCM = raster_->index2Coord(coord);
+				
+				double linCM = colLinCM.y();
+				double colMinCM = colLinCM.x();
+				
+				//applyStrategic: return the segments 
+				segments_ = applyStrategic(linCM, linMinCM_, colMinCM, strategy_, raster_, poly_);
+				
+				colMin_ = segments_[0].pt1.x();
+				colMax_ = segments_[0].pt2.x();
+				
+				colCurrent_=(int)colMin_;
+				posSegments_ = 0;
+				end_ = false;
+			}
+
+			void moveForward()
+			{
+				this->operator++();
+			}
+			
+			//! Prefix move forward operator
+			iteratorPoly& operator++() //prefix
+			{
+				if (++colCurrent_>colMax_)
+				{
+					if((++posSegments_ > (int)(segments_.size()-1)) || (segments_.size()<1))
+					{
+						if(++linCurrent_>linMax_)
+						{
+							end_ = true;
+							*this = raster_->end(poly_,strategy_);
+						}
+						else
+						{	
+							segments_.clear();
+							do
+							{
+								getNewSegment(linCurrent_);
+								if (segments_.empty())
+									linCurrent_++;
+								else
+									break;
+							} while (linCurrent_<=linMax_);
+							if (linCurrent_ > linMax_)
+							{
+								end_ = true;
+								*this = raster_->end(poly_,strategy_);
+							}
+						}
+					}
+					else
+					{
+						colMin_ = segments_[posSegments_].pt1.x();
+						colMax_ = segments_[posSegments_].pt2.x();
+						colCurrent_=(int)colMin_;
+					}
+				}
+				
+				return *this;
+			}
+
+			//! Prefix move orward operator
+				iteratorPoly operator++(int)
+				{
+					iteratorPoly temp = *this;
+					++(*this);
+					return temp;
+				}
+
+			//! Dereferencing operator
+			/*!
+				This operator was designed for compatibility reasons with standard
+				containers of STL. 
+				If there is a band restriction defined it will return the value associated to that band.
+				Otherwise will return the value associated to band 0.
+			*/
+			double operator*() 
+			{
+				double val = 0.0;
+				if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+				{
+					if (raster_->getElement(colCurrent_,linCurrent_,val,band_))
+						return val;
+				}
+				return 0.0;
+			}
+
+			//! Returns the value of a given band of the element pointed by the iterator 
+			double operator*(int band)
+			{
+				double val = 0.0;
+				if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+				{
+					if (raster_->getElement(colCurrent_,linCurrent_,val,band))
+						return val;
+				}
+				return 0.0;
+			}
+		
+		    //! Returns the value of of the element pointed by the iterator as TeProperty structure
+			/*!
+				If there is a band restriction defined it will return the value associated to that band.
+				Otherwise will return the value associated to band 0.
+			*/
+			bool getProperty(TeProperty& prop) 
+			{
+				double val = 0.0;
+				prop.attr_.rep_.type_ = TeREAL;
+				if (!raster_) prop.attr_.rep_.name_ = raster_->params().fileName_ + Te2String(band_);
+				prop.value_ = Te2String (val);
+				
+				if ((linCurrent_ < nLines_) && (colCurrent_ < nCols_))
+				{
+					if (raster_->getElement(colCurrent_,linCurrent_,val,band_))
+					{
+						prop.value_ = Te2String (val);
+						return true;
+					}
+				}
+				return false;
+			}
+
+			//! Returns the last past one element in the polygon
+			bool end()
+			{	return end_; }
+
+			//! Returns the number of lines covered by the iterator
+			int nLinesInPoly()
+			{ return nLinesInPoly_;}
+
+			//! Returns the number of columns covered by the iterator
+			int nColsInPoly()
+			{ return nColsInPoly_;}
+
+		private:
+			double				linMin_, linMax_;  
+			double				colMin_, colMax_;
+			TeCoordPairVect		segments_;
+			int					posSegments_;
+			TePolygon			poly_;
+			bool				end_;
+			TeStrategicIterator strategy_;
+			int					nLinesInPoly_, nColsInPoly_;
+			double				linMinCM_;	//minimal line in world coordinates 
+			int					band_;		// band restriction
+	};
+
+	//! Returns  an iterator to the first element of the raster
+	iterator begin() 
+	{
+		return iterator(0,0, params_.ncols_,params_.nlines_, params_.nBands(), this);
+	}
+
+	//! Returns an iterator to the first element of the raster IN or OUT the polygon 
+	/*!
+		\param poly polygon that delimitates the iterator traversal
+		\param st stragetegy used to decide if a pixel is in or out a polygon
+		\param band optional band restriction
+	*/
+	iteratorPoly begin(TePolygon& poly, TeStrategicIterator st, int band=0);
+
+	
+	//! Returns the end past one position of the elements of the raster
+    iterator end() 
+	{
+		return iterator(params_.ncols_,params_.nlines_-1,params_.ncols_,params_.nlines_, params_.nBands(), this);
+	}
+
+	//! Returns an iterator to the end element of the raster 
+	/*!
+		\param poly polygon that delimitates the iterator traversal
+		\param st stragetegy used to decide if a pixel is in or out a polygon
+		\param band optional band restriction
+	*/
+	iteratorPoly end(TePolygon& poly, TeStrategicIterator st, int band=0) 
+	{
+		return iteratorPoly(params_.ncols_,params_.nlines_-1,params_.ncols_,params_.nlines_, params_.nBands(), this, poly, st, band);
+	}
+
+	//! Select all blocks of raster, in a certain resolution factor that intercepts a given bounding box
+	bool selectBlocks(TeBox& bb, int resFac, TeRasterParams& parBlock) 
+	{
+		if (!decoder_)
+			return false;
+		return decoder_->selectBlocks(bb,resFac,parBlock);
+	}
+	//! Returns the number of blocks selected by the last block selection
+	int numberOfSelectedBlocks()
+	{
+		if (!decoder_)
+			return 0;
+		return decoder_->numberOfSelectedBlocks();
+	}
+
+	//! Returns the current block of a set selected by the last block selection
+	bool fetchRasterBlock(TeDecoderMemory* memDec)
+	{
+		if (!decoder_)
+			return false;
+		return decoder_->getSelectedRasterBlock(memDec);
+	}
+
+	//! Clears the current selection of a set selected by the last block selection
+	void clearBlockSelection()
+	{
+		if (!decoder_)
+			return ;
+		decoder_->clearBlockSelection();
+	}
+};
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeRasterParams.cpp b/src/terralib/kernel/TeRasterParams.cpp
new file mode 100644
index 0000000..4770127
--- /dev/null
+++ b/src/terralib/kernel/TeRasterParams.cpp
@@ -0,0 +1,509 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include "TeRasterParams.h"
+#include "TeUtils.h"
+
+// copy constructor
+TeRasterParams::TeRasterParams(const TeRasterParams& other)
+{
+	resolution_ = other.resolution_;
+	subBand_  = other.subBand_;
+	nlines_		= other.nlines_;
+	ncols_		= other.ncols_;
+	nbands_		= other.nbands_;
+	lutName_	= other.lutName_;
+	swap_		= other.swap_;
+	useDummy_	= other.useDummy_;
+
+	nbitsperPixel_.resize(nbands_);
+	vmin_.resize(nbands_);
+	vmax_.resize(nbands_);
+	bands_.resize(nbands_);
+	photometric_.resize(nbands_);
+	dataType_.resize(nbands_);
+	dummy_.resize(nbands_);
+	compression_.resize(nbands_);
+
+	int i;
+	for (i=0; i<nbands_; i++)
+	{
+		nbitsperPixel_[i] = other.nbitsperPixel_[i];
+		vmin_[i] = other.vmin_[i];
+		vmax_[i] = other.vmax_[i];
+		bands_[i] = other.bands_[i];
+		photometric_[i] = other.photometric_[i];
+		dataType_[i] = other.dataType_[i];
+		dummy_[i] = other.dummy_[i];
+		compression_[i] = other.compression_[i];
+	}
+
+	resx_ = other.resx_;
+	resy_ = other.resy_;
+	fileName_ = other.fileName_;
+	mode_ = other.mode_;
+	status_ = other.status_;
+	offset_ = other.offset_;
+	tiling_type_ = other.tiling_type_;
+	blockHeight_ = other.blockHeight_;
+	blockWidth_ = other.blockWidth_;
+	decoderIdentifier_ = other.decoderIdentifier_;
+	nTilesInMemory_ = other.nTilesInMemory_;
+	if (other.projection_)
+		projection_ = TeProjectionFactory::make(other.projection_->params());
+	else
+		projection_=0;
+	box_ = other.box_;
+	database_ = other.database_;
+	interleaving_ = other.interleaving_;
+
+	lutr_ = other.lutr_;
+	lutg_ = other.lutg_;
+	lutb_ = other.lutb_;
+	dyJ_ = other.dyJ_;
+	dxI_ = other.dxI_;
+	dyI_ = other.dyI_;
+	dxJ_ = other.dxJ_;
+	x0_ = other.x0_;
+	y0_ = other.y0_;
+}
+
+// pperator =
+TeRasterParams& 
+TeRasterParams::operator=(const TeRasterParams& rhs)
+{
+	if ( this != &rhs )
+	{
+		resolution_ = rhs.resolution_;
+		subBand_  = rhs.subBand_;
+		nlines_		= rhs.nlines_;
+		ncols_		= rhs.ncols_;
+		nbands_		= rhs.nbands_;
+		swap_		= rhs.swap_;
+		useDummy_	= rhs.useDummy_;
+		lutName_	= rhs.lutName_;
+
+		nbitsperPixel_.resize(nbands_);
+		vmin_.resize(nbands_);
+		vmax_.resize(nbands_);
+		bands_.resize(nbands_);
+		photometric_.resize(nbands_);
+		dataType_.resize(nbands_);
+		dummy_.resize(nbands_);
+		compression_.resize(nbands_);
+
+		for (int i=0; i<nbands_; i++)
+		{
+			nbitsperPixel_[i] = rhs.nbitsperPixel_[i];
+			vmin_[i] = rhs.vmin_[i];
+			vmax_[i] = rhs.vmax_[i];
+			bands_[i] = rhs.bands_[i];
+			photometric_[i] = rhs.photometric_[i];
+			dataType_[i] = rhs.dataType_[i];
+			dummy_[i] = rhs.dummy_[i];
+			compression_[i] = rhs.compression_[i];
+		}
+
+		resx_ = rhs.resx_;
+		resy_ = rhs.resy_;
+		fileName_ = rhs.fileName_;
+		mode_ = rhs.mode_;
+		status_ = rhs.status_;
+		offset_ = rhs.offset_;
+		tiling_type_ = rhs.tiling_type_;
+		blockHeight_ = rhs.blockHeight_;
+		blockWidth_ = rhs.blockWidth_;
+		decoderIdentifier_ = rhs.decoderIdentifier_;
+		nTilesInMemory_ = rhs.nTilesInMemory_;
+		if (projection_)
+		{
+			delete projection_;
+			projection_ = 0;
+		}
+		if (rhs.projection_)
+			projection_ = TeProjectionFactory::make(rhs.projection_->params());
+		box_ = rhs.box_;
+		database_ = rhs.database_;			
+		interleaving_ = rhs.interleaving_;
+
+		lutr_ = rhs.lutr_;
+		lutg_ = rhs.lutg_;
+		lutb_ = rhs.lutb_;
+		dyJ_ = rhs.dyJ_;
+		dxI_ = rhs.dxI_;
+		x0_ = rhs.x0_;
+		y0_ = rhs.y0_;
+		dyI_ =  rhs.dyI_;
+		dxJ_ =  rhs.dxJ_;
+	}
+	return *this;
+}
+
+void
+TeRasterParams::resizeToTiling(TeBox& bb, int bWidth, int bHeight)
+{
+	blockHeight_ = bHeight;
+	blockWidth_ = bWidth;
+
+	double bXSize = bWidth*resx_;
+	double bYSize = bHeight*resy_;
+	
+	TeBox baux = adjustToCut(bb, bXSize, bYSize);
+	this->boundingBoxResolution(baux.x1_,baux.y1_,baux.x2_,baux.y2_,resx_,resy_);
+}
+
+//! Calculates the *bounding box* when box coordinates are relative to the center of the pixel
+TeBox	
+TeRasterParams::boundingBox ()
+{ return TeBox (box_.x1()-resx_/2.,
+				box_.y1()-resy_/2.,
+				box_.x2()+resx_/2.,
+				box_.y2()+resy_/2.);
+}
+
+void	
+TeRasterParams::boundingBoxResolution (double x1, double y1, double x2, double y2, 
+									   double resx, double resy, TeBox::TeBoxCorner lock)
+{
+	resx_ = resx;
+	resy_ = resy;
+	ncols_  = (int)((x2-x1)/resx_+0.5);
+	nlines_ = (int)((y2-y1)/resy_+0.5);
+	
+	if (lock == TeBox::TeUPPERLEFT)
+		box_ = TeBox(x1+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+		             x1+ncols_*resx_-0.5*resx_, y2-0.5*resy_);
+
+	else if (lock == TeBox::TeLOWERLEFT)
+		box_ = TeBox(x1+0.5*resx_, y1+0.5*resy_,
+		             x1+ncols_*resx_-0.5*resx_, y1+nlines_*resy_-0.5*resy_);
+
+	else if (lock == TeBox::TeUPPERRIGHT)
+		box_ = TeBox(x2-ncols_*resx_+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+			         x2-0.5*resx_,y2-0.5*resy_);
+
+	else		// TeLOWERRIGHT
+		box_ = TeBox(x2-ncols_*resx_+0.5*resx_,y1+0.5*resy_,
+		             x2-0.5*resx_,y1+nlines_*resy_-0.5*resy_);
+}
+
+void	
+TeRasterParams::boundingBoxLinesColumns (double x1, double y1, double x2, double y2, 
+										 int nlines, int ncols, TeBox::TeBoxCorner lock)
+{
+	nlines_ = nlines;
+	ncols_ = ncols;
+	
+	resx_ = (x2-x1)/ncols_;
+	resy_ = (y2-y1)/nlines_;
+
+	if (lock == TeBox::TeUPPERLEFT)
+		box_ = TeBox(x1+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+		             x1+ncols_*resx_-0.5*resx_, y2-0.5*resy_);
+
+	else if (lock == TeBox::TeLOWERLEFT)
+		box_ = TeBox(x1+0.5*resx_, y1+0.5*resy_,
+		             x1+ncols_*resx_-0.5*resx_, y1+nlines_*resy_-0.5*resy_);
+
+	else if (lock == TeBox::TeUPPERRIGHT)
+		box_ = TeBox(x2-ncols_*resx_+0.5*resx_, y2-nlines_*resy_+0.5*resy_,
+			         x2-0.5*resx_,y2-0.5*resy_);
+
+	else		// TeLOWERRIGHT
+		box_ = TeBox(x2-ncols_*resx_+0.5*resx_,y1+0.5*resy_,
+		             x2-0.5*resx_,y1+nlines_*resy_-0.5*resy_);
+}
+
+void	
+TeRasterParams::boxResolution (double x1, double y1, double x2, double y2, 
+							   double resx, double resy, TeBox::TeBoxCorner lock)
+{
+	resx_ = resx;
+	resy_ = resy;
+
+	ncols_  = (int)((x2-x1)/resx_+0.45)+1;
+	nlines_ = (int)((y2-y1)/resy_+0.45)+1;
+
+	if (lock == TeBox::TeUPPERLEFT)
+		box_ = TeBox(x1, y2-(nlines_-1)*resy_,x1+(ncols_-1)*resx_,y2);
+
+	else if (lock == TeBox::TeLOWERLEFT)
+		box_ = TeBox(x1, y1,x1+(ncols_-1)*resx_,y1+(nlines_-1)*resy_);
+
+	else if (lock == TeBox::TeUPPERRIGHT)
+		box_ = TeBox(x2-(ncols_-1)*resx_, y2-(nlines_-1)*resy_,x2,y2);
+
+	else		// TeLOWERRIGHT
+		box_ = TeBox(x2-(ncols_-1)*resx_,y1,x2,y1+(nlines_-1)*resy_);
+}
+
+void	
+TeRasterParams::boxLinesColumns (double x1, double y1, double x2, double y2, 
+								 int nlines, int ncols, TeBox::TeBoxCorner lock)
+{
+	nlines_ = nlines;
+	ncols_ = ncols;
+
+	resx_ = (x2-x1)/(ncols_-1);
+	resy_ = (y2-y1)/(nlines_-1);
+
+	if (lock == TeBox::TeUPPERLEFT)
+		box_ = TeBox(x1, y2-(nlines_-1)*resy_,x1+(ncols_-1)*resx_,y2);
+
+	else if (lock == TeBox::TeLOWERLEFT)
+		box_ = TeBox(x1, y1,x1+(ncols_-1)*resx_,y1+(nlines_-1)*resy_);
+
+	else if (lock == TeBox::TeUPPERRIGHT)
+		box_ = TeBox(x2-(ncols_-1)*resx_, y2-(nlines_-1)*resy_,x2,y2);
+
+	else		// TeLOWERRIGHT
+		box_ = TeBox(x2-(ncols_-1)*resx_,y1,x2,y1+(nlines_-1)*resy_);
+}
+
+void	
+TeRasterParams::topLeftResolutionSize (double left, double top, 
+									   double resx, double resy, 
+									   int ncol, int nlin, 
+									   bool coordIsCentrePixel)
+{
+	resx_ = resx;
+	resy_ = resy;
+	ncols_  = ncol;
+	nlines_ = nlin;
+	
+	if (coordIsCentrePixel)
+		box_ = TeBox(left,top-(nlin-1)*resy_,left+(ncol-1)*resx_,top);
+	else
+	{
+		TeBox bb(left,top-nlines_*resy_,left+ncols_*resx_,top);
+		box_ = TeBox(bb.x1()+resx_/2.,
+					 bb.y1()+resy_/2.,
+					 bb.x2()-resx_/2.,
+					 bb.y2()-resy_/2.);
+	}
+}
+
+void	
+TeRasterParams::lowerLeftResolutionSize (double left, double lower, 
+										 double resx, double resy, 
+										 int ncol, int nlin, 
+										 bool coordIsCentrePixel)
+{
+	resx_ = resx;
+	resy_ = resy;
+	ncols_  = ncol;
+	nlines_ = nlin;
+	
+	if (coordIsCentrePixel)
+		box_ = TeBox(left,lower,left+(ncol-1)*resx_,lower+(nlin-1)*resy_);
+	else
+	{
+		TeBox bb(left,lower,left+ncols_*resx_,lower+nlines_*resy_);
+		box_ = TeBox(bb.x1()+resx_/2.,
+					 bb.y1()+resy_/2.,
+					 bb.x2()-resx_/2.,
+					 bb.y2()-resy_/2.);
+	}
+}
+
+void 
+TeRasterParams::nBands(int n)
+{
+	if (nbands_ != n)
+	{
+		if (n < 1)
+			n = 1;
+		nbands_ = n;
+		nbitsperPixel_.resize(nbands_);
+		vmin_.resize(nbands_);
+		vmax_.resize(nbands_);
+		bands_.resize(nbands_);
+		photometric_.resize(nbands_);
+		dataType_.resize(nbands_);
+		dummy_.resize(nbands_);
+		compression_.resize(nbands_);
+		double d = dummy_[0];
+		for (int i = 0; i<n; i++)
+		{
+			bands_[i] = i;
+			vmin_[i] = TeMAXFLOAT;
+			vmax_[i] = -TeMAXFLOAT;
+			dataType_[i] = TeUNSIGNEDCHAR;
+			photometric_[i] = TeRASTERUNKNOWN;
+			dummy_[i] = d;
+		}
+	}
+}
+
+void 
+TeRasterParams::projection(TeProjection* proj)
+{
+	if (projection_)
+	{
+		delete projection_;
+		projection_ = 0;
+	}
+	if (proj)
+		projection_ = TeProjectionFactory::make(proj->params());
+}
+
+void 
+TeRasterParams::setDataType(TeDataType type, int band)
+{
+	int nb = 8;
+	switch (type) {
+	case TeUNSIGNEDCHAR:
+		nb = sizeof(unsigned char)*8;
+		break;
+	case TeCHAR :
+		nb = sizeof(char)*8;
+		break;
+	case TeUNSIGNEDSHORT:
+		nb = sizeof(unsigned short)*8;
+		break;
+	case (TeSHORT):
+		nb = sizeof(short)*8;
+		break;
+	case (TeUNSIGNEDLONG):
+		nb = sizeof(unsigned long)*8;
+		break;
+	case (TeLONG):
+		nb = sizeof(long)*8;
+		break;
+	case (TeFLOAT):
+		nb = sizeof(float)*8;
+		break;
+	case (TeDOUBLE):
+		nb = sizeof(double)*8;
+        break;
+    default:
+        break;
+	}
+	if (band<0 || band>= (int)dataType_.size())
+		for (unsigned int i=0; i<dataType_.size(); dataType_[i]=type,nbitsperPixel_[i]=nb,i++);
+	else
+	{
+		dataType_[band]=type;
+		nbitsperPixel_[band]=nb;
+	}
+}
+
+int TeRasterParams::elementSize(int band)
+{
+	switch (dataType_[band]) {
+	case TeUNSIGNEDCHAR:
+		return (sizeof(unsigned char));
+	case TeCHAR :
+		return (sizeof(char));
+	case TeUNSIGNEDSHORT:
+		return (sizeof(unsigned short));
+	case (TeSHORT):
+		return (sizeof(short));
+	case (TeUNSIGNEDLONG):
+		return (sizeof(unsigned long));
+	case (TeLONG):
+		return (sizeof(long));
+	case (TeFLOAT):
+		return (sizeof(float));
+	default:
+		return (sizeof(double));
+	}
+}
+
+
+void 
+TeRasterParams::setPhotometric(short photom, int band)
+{
+	if (band<0 || band>= (int)photometric_.size())
+		for (unsigned int i=0; i<photometric_.size(); photometric_[i]=photom,i++);
+	else
+		photometric_[band]=photom;
+}
+
+void 
+TeRasterParams::setCompressionMode(TeCompressionMode cmode, int band)
+{
+	if (band<0 || band>= (int)compression_.size())
+		for (unsigned int i=0; i<compression_.size(); compression_[i]=cmode,i++);
+	else
+		compression_[band] = cmode;
+}
+
+void 
+TeRasterParams::setDummy(double dummy, int band)
+{
+	if (band<0 || band>= (int)dummy_.size())
+		for (unsigned int i=0; i<dummy_.size(); dummy_[i]=dummy,i++);
+	else
+		dummy_[band] = dummy;
+	this->useDummy_ = true;
+}
+
+TeCoord2D 
+TeRasterParams::coord2Index (TeCoord2D& pt)
+{
+	double i, j;
+	if (dxI_ != 0 || dyJ_ != 0 || dxJ_ != 0 || dyI_ != 0)
+	{
+		double x = pt.x();
+		double y = pt.y();
+		
+		i = (dyJ_*(x-x0_)-dxJ_*(y-y0_))/(dxI_*dyJ_-dxJ_*dyI_);
+		j = (x-x0_-i*dxI_)/dxJ_;
+		return TeCoord2D (j,i);
+	}
+	else
+	{
+		i = (pt.x() - box_.x1()) / resx_;
+		j = (box_.y2() - pt.y()) / resy_;
+		return TeCoord2D (i,j);
+	}
+}
+
+TeCoord2D 
+TeRasterParams::index2Coord (TeCoord2D& pt)
+{
+	double x,y;
+	double i = pt.y();
+	double j = pt.x();
+		
+	if (dxI_ != 0 || dyJ_ != 0 || dxJ_ != 0 || dyI_ != 0)
+	{
+		// X= x0 + J*Dx_j + I*Dx_i
+		// Y= Y0 + J*Dy_j + I*Dy_i 
+
+		x = x0_ + i*dxI_ + j*dxJ_;
+		y = y0_ + i*dyI_ + j*dyJ_;
+	}
+	else
+	{
+		x = box_.x1() + pt.x() * resx_;
+		y = box_.y2() - pt.y() * resy_;
+	}
+	return TeCoord2D (x,y);
+}
+
diff --git a/src/terralib/kernel/TeRasterParams.h b/src/terralib/kernel/TeRasterParams.h
new file mode 100644
index 0000000..50d6548
--- /dev/null
+++ b/src/terralib/kernel/TeRasterParams.h
@@ -0,0 +1,366 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRasterParams.h
+    This file contains definitions about parameters of a raster structure
+*/
+#ifndef  __TERRALIB_INTERNAL_RASTERPARAMS_H
+#define  __TERRALIB_INTERNAL_RASTERPARAMS_H
+
+#include "TeProjection.h"
+#include "TeBox.h"
+#include "TeDataTypes.h"
+
+#include <string>
+#include <list>
+#include <vector>
+
+//! Pixels interleaving mode
+enum TeInterLeaving
+{ TePerPixel, TePerLine, TePerBand };
+
+using namespace std;
+
+#define TeRASTERUNKNOWN		0	//!< unknown type of raster (an intermediate state)		
+#define TeRASTERPALETTE		1	//!< a sintetic image that has an associated LUT (pixel val -> RGB triple)	
+#define TeRASTERMULTIBAND	2	//!< an image which 1 to n bands
+#define TeRASTERRGB			3	//!< a particular case of multiband, with exactly 3 bands
+#define TeRASTERTHEMATIC	4	//!< a temathic image
+#define TeRASTEROBJECTID	5	//!< each pixel has an ID of the corresponding object
+#define TeRASTERLDD			6	//!< each pixel is a local drain direction 
+#define TeRASTERKERNEL		7	
+
+#define	TeNOTREADY				0x0000		// Decoder is not read to read or read
+#define	TeREADYTOREAD			0x0001		// Decoder is read to read
+#define	TeREADYTOWRITE			0x0002		// Decoder is read to write
+
+
+class TeDatabase;
+
+//!  A class to handle the parameters set associated with a raster
+/*! 
+ \sa
+  TeRaster
+*/
+class TeRasterParams
+{
+public:
+
+	//! Default contructor
+	TeRasterParams () :
+		nlines_(0),
+		ncols_(0),
+		resx_(1),
+		resy_(1),
+		resolution_(1),
+		subBand_(0),
+		swap_(false),
+		useDummy_(false),
+		mode_('r'),
+		status_(TeNOTREADY),
+		offset_(0),
+		tiling_type_(TeExpansible),
+		blockHeight_(0),
+		blockWidth_(0),
+		nTilesInMemory_(0),
+		database_ (0),
+		interleaving_(TePerPixel),
+		dxJ_(0.0),
+		dyJ_(0.0),
+		dxI_(0.0),
+		dyI_(0.0),
+		x0_(0.0),
+		y0_(0.0),
+		nbands_(1),
+		box_(TeBox()),
+		projection_(0)
+	{
+		nbitsperPixel_.resize(nbands_);
+		vmin_.resize(nbands_);
+		vmax_.resize(nbands_);
+		bands_.resize(nbands_);
+		photometric_.resize(nbands_);
+		dataType_.resize(nbands_);
+		dummy_.resize(nbands_);
+		compression_.resize(nbands_);
+		for (int i=0; i<nbands_; i++)
+		{
+			bands_[i] = i;
+			vmin_[i] = TeMAXFLOAT;
+			vmax_[i] = -TeMAXFLOAT;
+			dataType_[i] = TeUNSIGNEDCHAR;
+			photometric_[i] = TeRASTERUNKNOWN;
+			dummy_[i] = 0.0;
+		}
+	}
+
+	//! Copy constructor
+	TeRasterParams(const TeRasterParams& other);
+
+	//! Operator =
+	TeRasterParams& operator=(const TeRasterParams& rhs);
+
+	//! Destructor
+	virtual ~TeRasterParams()
+	{
+		bands_.clear();
+		vmin_.clear();
+		vmax_.clear();
+		lutr_.clear();
+		lutg_.clear();
+		lutb_.clear();
+		photometric_.clear();
+		dataType_.clear();
+		dummy_.clear();
+		compression_.clear();
+		if (projection_)
+			delete projection_;
+	}
+
+	//! Return the box based on the coordinates of  center of pixel
+	TeBox box()
+	{ return box_; }
+
+	//! Returns the outline box 
+	TeBox boundingBox ();
+
+	//! Sets box parameters
+	/*
+		This methods recalculates the number of lines and columns and box accordingly to 
+		a desired bounding box and resolution
+		\param x1 bounding box lower left point X coordinate 
+		\param y1 bounding box lower left point Y coordinate 
+		\param x2 bounding box upper right point X coordinate
+		\param y2 bounding box upper right point Y coordinate
+		\param resx X resolution
+		\param resy Y resolution
+		\param lock corner of the bounding box that should be preserved
+	*/
+	void boundingBoxResolution (double x1, double y1, double x2, double y2, 
+								double resx, double resy, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+	//! Sets box parameters
+	/*
+		This methods recalculates the resolutions and box accordingly to 
+		a desired bounding box and number of lines and columns
+		\param x1 bounding box lower left point X coordinate 
+		\param y1 bounding box lower left point Y coordinate 
+		\param x2 bounding box upper right point X coordinate
+		\param y2 bounding box upper right point Y coordinate
+		\param nlines  number of lines
+		\param ncols number of columns
+		\param lock corner of the bounding box that should be preserved
+	*/
+	void boundingBoxLinesColumns (double x1, double y1, double x2, double y2, 
+		                          int nlines, int ncols, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+	//! Sets box parameters
+	/*
+		This methods recalculates the number of lines and columns and box accordingly to 
+		a desired box and resolution
+		\param x1 box lower left point X coordinate 
+		\param y1 box lower left point Y coordinate 
+		\param x2 box upper right point X coordinate
+		\param y2 box upper right point Y coordinate
+		\param resx X resolution
+		\param resy Y resolution
+		\param lock corner of the bounding box that should be preserved
+	*/
+	void boxResolution (double x1, double y1, double x2, double y2, 
+		                double resx, double resy, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+	//! Sets box parameters
+	/*
+		This methods recalculates the resolutions and box accordingly to 
+		a desired box and number of lines and columns
+		\param x1 box lower left point X coordinate 
+		\param y1 box lower left point Y coordinate 
+		\param x2 box upper right point X coordinate
+		\param y2 box upper right point Y coordinate
+		\param nlines  number of lines
+		\param ncols number of columns
+		\par Calculates X resolution and Y resolution 
+		\param lock corner of the bounding box that should be preserved
+	*/
+	void boxLinesColumns (double x1, double y1, double x2, double y2, 
+		                  int nlines, int ncols, TeBox::TeBoxCorner lock = TeBox::TeUPPERLEFT);
+
+	//! Sets box parameters
+	/*
+		\param left lower left point X coordinate 
+		\param top  upper right point Y coordinate
+		\param resx X resolution
+		\param resy Y resolution
+		\param nlines  number of lines
+		\param ncols number of columns
+		\param coordIsCentrePixel flag to indicate that top left coordinate is centre of pixel
+	*/
+	void topLeftResolutionSize (double left, double top, double resx, double resy, int ncol, int nlin, bool coordIsCentrePixel=true);
+		
+	//! Sets box parameters
+	/*
+		\param left lower left point X coordinate 
+		\param lower lower left point Y coordinate
+		\param resx X resolution
+		\param resy Y resolution
+		\param nlines  number of lines
+		\param ncols number of columns
+		\param coordIsCentrePixel flag to indicate that top left coordinate is centre of pixel
+	*/
+	void lowerLeftResolutionSize (double left, double lower, double resx, double resy, int ncol, int nlin, bool coordIsCentrePixel=true);
+
+	//! Resizes the raster bounding box to allow tiling operation
+	/*! 
+		\param bb an initial bounding box
+		\param bWidth block width (in number of elements/pixels)
+		\param bHeight block height (in number of elements/pixels)
+		\note uses X an Y resolutions already defined
+	*/ 
+	void resizeToTiling(TeBox& bb, int bWidth, int bHeight);
+
+	//! Sets the number of bands
+	void nBands(int n);
+
+	//! Sets the projection
+	/*
+		A new instance of projection is created according to the parameters described
+		by proj.
+	*/
+	void projection(TeProjection* proj);
+
+	//! Returns the projection
+	TeProjection* projection()
+	{	return projection_; }
+
+	//! Transform a point from projection domain to line/column domain
+	TeCoord2D coord2Index (TeCoord2D& pt);
+
+	//! Transform a point from line/column domain to projection domain
+	TeCoord2D index2Coord (TeCoord2D& pt);
+
+	//----------------- MEMBERS ---------------------
+
+	int nlines_;			//!< number of lines
+	int ncols_;				//!< number of columns
+
+	double	resx_,			//!< pixel horizontal resolution
+			resy_;			//!< pixel vertical resolution	
+
+
+	int resolution_;		//! resolution level (used in storing raster as wavelets)
+	int subBand_;			//! sub band identification (used in storing rasters as wavelets)
+
+	string	lutName_;		//!< name of a lut table associated to this raster
+	bool swap_;				//!< a flag to indicate that raster has swapped values
+	bool useDummy_;			//!< a flag to indicate that raster has dummy values
+
+	vector<int>		nbitsperPixel_;		//!< number of bits per pixel in each band
+	vector<double>	vmin_;				//!< minimum value per band
+	vector<double>	vmax_;				//!< maximum value per band
+	vector<int>		bands_;				//!< bands information 
+	vector<double>	dummy_;				//!< no data value
+	vector<short>   photometric_;		//!< raster type (palette, multiband, rgb, ...)
+	vector<TeCompressionMode>	compression_;	//!< compression type of tiles as this raster is stored
+	vector<TeDataType> dataType_;				//!< size of each pixel (char,int,unsigned char...), as it will be saved
+
+	string	fileName_;		//!< source of the raster data (table or disk file)
+	char	mode_;			//! Instantiating mode for the raster data 'r', 'w' or 'c'
+	int status_;			//! Status for reading and writing to raster
+	int offset_;			//!< offset 
+	
+	TeRasterTilingType	tiling_type_; //!< raster tiling scheme 
+	int blockHeight_;		//!< block height of tiles as this raster is stored
+	int blockWidth_;		//!< block width of tiles as this raster is stored
+
+	string	decoderIdentifier_;	//!< decoder associated to his raster
+	int nTilesInMemory_;		//!< number of tiles to be kept in virtual memory decoders
+
+	TeDatabase		*database_;		//!< database associated to this driver
+
+	string blockId_;				//!< block identification
+
+	TeInterLeaving interleaving_;	//!< interleaving mode
+
+	/** @name Raster pallete
+	*  Look up table associated to a raster 
+	*/
+	//@{ 
+	vector<unsigned short> lutr_;  //!<  Red pallete
+	vector<unsigned short> lutg_;  //!<  Green pallete
+	vector<unsigned short> lutb_;  //!<  Blue pallete
+	//@}
+
+	/** @name TFW parameters
+	*  Parameters associated to TFW codification of georeferencing 
+	*/
+	//@{ 
+	double dxJ_;	//!< X offset due to increase of one column position		       
+	double dyJ_;	//!< Y offset due to increase of one column position		       
+	double dxI_;	//!< X offset due to increase of one line position		       
+	double dyI_;	//!< X offset due to increase of one line position		       
+	double x0_;		//!< X coordinate of the upper left raster pixel
+	double y0_;		//!< Y coordinate of the upper left raster pixel
+	//@}
+
+	//! Sets the size of raster element per in each band
+	void setDataType(TeDataType type, int band=-1);
+
+	//! Returns the size in bytes of each raster element
+	int elementSize(int band=0);
+
+	//! Sets the photometric type of each band
+	void setPhotometric(short photom, int band=-1);
+
+	//! Sets the compression mode of each band
+	void setCompressionMode(TeCompressionMode cmode, int band=-1);
+
+	//! Sets the dummy value in each band
+	void setDummy(double dummy, int band=-1);
+
+	//! Returns the number of bands of the raster
+	int nBands() const
+	{	return nbands_; }
+
+	//! Sets the number of entries in the pallete table
+	void setNumberPalleteEntries(int n)
+	{
+		lutr_.resize(n+1);
+		lutg_.resize(n+1);
+		lutb_.resize(n+1);
+	}
+
+	//! Returns the identifier of the decoder associated to the raster
+	string decName()
+	{ return decoderIdentifier_; }
+
+	string lutName()
+	{ return lutName_; }
+
+private:
+	int		nbands_;		//!< number of bands
+	TeBox	box_;			//!< raster box in center of pixel coordinates
+	TeProjection* projection_;	//!< raster projection
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeRasterRemap.cpp b/src/terralib/kernel/TeRasterRemap.cpp
new file mode 100644
index 0000000..186d967
--- /dev/null
+++ b/src/terralib/kernel/TeRasterRemap.cpp
@@ -0,0 +1,503 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeDefines.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeRasterRemap.h"
+#include "TeVectorRemap.h"
+#include "TeProgress.h"
+#include <time.h>
+
+
+#include <algorithm>	// for max and min
+#include <cstdlib>		// for abs
+
+
+bool TePointOnLine (TeCoord2D& p, TeCoord2D& q, TeCoord2D& t, double tol)
+{
+	int	tx, ty, px, py, qx, qy, dx, dy;
+
+	px = (int)(p.x () / tol);
+	py = (int)(p.y () / tol);
+
+	qx = (int)(q.x () / tol);
+	qy = (int)(q.y () / tol);
+
+	tx = (int)(t.x () / tol);
+	ty = (int)(t.y () / tol);
+
+	dx = abs(px-qx);
+	dy = abs(py-qy);
+
+	if (dx <=2 && dy <= 2)
+		return true;
+
+	int q1 = (qy-py)*(tx-px);
+	int q2 = (ty-py)*(qx-px);
+	int q3 = qx-px;
+	int q4 = qy-py;
+
+	if (q1 == 0 && q2 == 0 && q3 == 0 && q4 == 0)
+		return true;
+	if (abs(q1 - q2) > (std::max(abs(q3), abs(q4))))
+		return false;
+	return true;
+}
+
+
+void TeRasterRemap::TeInterpolateIn ( TeBox &box )
+{
+	TeRasterParams paramIn = rasterIn_->params();
+	TeRasterParams paramOut = rasterOut_->params();
+
+	TeProjection *projIn = paramIn.projection();
+	TeProjection *projOut = paramOut.projection();
+
+	if (!projIn || !projOut)
+		return;
+
+// Take coordinates of box corners in output raster projection
+
+	TeCoord2D poll = box.lowerLeft ();
+	TeCoord2D pour = box.upperRight ();
+
+// Bring output coordinates to output line/column domain
+
+	TeCoord2D pxoll = rasterOut_->coord2Index (poll);
+	TeCoord2D pxour = rasterOut_->coord2Index (pour);
+
+// Round output coordinates to nearest exact pixel
+
+	int x1,y1;
+	x1 = (int) (pxoll.x() - 0.5);
+	y1 = (int) (pxoll.y() + 0.5);
+	pxoll = TeCoord2D (x1,y1);
+
+	int x2,y2;
+	x2 = (int)(pxour.x() + 0.5);
+	y2 = (int)(pxour.y() - 0.5);
+	pxour = TeCoord2D (x2,y2);
+//	fprintf (loga,"Coordenadas de saida - x1=%d  x2=%d y1=%d y2=%d\n",x1,x2,y1,y2);
+
+	poll = rasterOut_->index2Coord (pxoll);
+	pour = rasterOut_->index2Coord (pxour);
+//	fprintf (loga,"Box de saida        - x1=%f  x2=%f y1=%f y2=%f\n\n",poll.x(),pour.x(),poll.y(),pour.y());
+
+	TeCoord2D poul = TeCoord2D(poll.x(),pour.y());
+	TeCoord2D polr = TeCoord2D(pour.x(),poll.y());
+
+// Bring coordinates of box four corners to input raster projection
+
+	TeCoord2D pill = projOut->PC2LL (poll);
+	TeCoord2D piur = projOut->PC2LL (pour);
+	TeCoord2D piul = projOut->PC2LL (poul);
+	TeCoord2D pilr = projOut->PC2LL (polr);
+
+	pill = projIn->LL2PC (pill);
+	piur = projIn->LL2PC (piur);
+	piul = projIn->LL2PC (piul);
+	pilr = projIn->LL2PC (pilr);
+
+// Check if linear interpolation may be performed on input raster
+// Evaluate point at middle of the edges in output domain and check if their 
+// corresponding points belong to the edges in input domain. If they belong, 
+// a linear interpolation may be performed, else divide output image 
+// in four quadrants and try interpolating again
+
+
+	TeCoord2D	pou((pour.x()-poul.x())/2.+poul.x(), poul.y()), // upper edge
+				pob((polr.x()-poll.x())/2.+poll.x(), poll.y()), // bottom edge
+				pol(poll.x(), (poul.y()-poll.y())/2.+poll.y()), // left edge
+				por(polr.x(), (pour.y()-polr.y())/2.+polr.y()); // right edge
+
+// Evaluate corresponding points in input raster domain
+	TeCoord2D	piu, pib, pil, pir;
+
+	piu = projOut->PC2LL (pou);
+	pib = projOut->PC2LL (pob);
+	pil = projOut->PC2LL (pol);
+	pir = projOut->PC2LL (por);
+
+	piu = projIn->LL2PC (piu);
+	pib = projIn->LL2PC (pib);
+	pil = projIn->LL2PC (pil);
+	pir = projIn->LL2PC (pir);
+
+// Check if middle points belong to the edges
+
+	double tol = MAX(paramIn.resx_ ,paramIn.resy_ );
+
+//	if (!TeIsOnSegment (piu,piul,piur/*,tol*/) ||
+//		!TeIsOnSegment (pir,pilr,piur/*,tol*/) ||
+//		!TeIsOnSegment (pib,pill,pilr/*,tol*/) ||
+//		!TeIsOnSegment (pil,pill,piul/*,tol*/))
+
+	if (!TePointOnLine (piul,piur,piu,tol) ||
+		!TePointOnLine (pilr,piur,pir,tol) ||
+		!TePointOnLine (pill,pilr,pib,tol) ||
+		!TePointOnLine (pill,piul,pil,tol))
+	{
+// If one of them does not belong to correspondig edge, divide output in four quadrants
+		TeCoord2D	pom ((por.x()-pol.x())/2.+pol.x(), (pou.y()-pob.y())/2.+pob.y()); // center point
+		TeBox quadrantul (pol, pou);
+		TeInterpolateIn ( quadrantul );
+		TeBox quadrantur (pom, pour);
+		TeInterpolateIn ( quadrantur );
+		TeBox quadrantll (poll, pom);
+		TeInterpolateIn ( quadrantll );
+		TeBox quadrantlr (pob, por);
+		TeInterpolateIn ( quadrantlr );
+		return;
+	}
+
+// Start linear interpolation on input image.
+
+	double	xl,	// x at the beginning of the line
+		yl,	// y at the beginning of the line
+		xr,	// x at the end of the line
+		yr,	// y at the end of the line
+		dx,	// inner loop x increment
+		dy,	// inner loop y increment
+		dxl,	// x increment at the beginning of line
+		dyl,	// y increment at the beginning of line
+		dxr,	// x increment at the end of line
+		dyr;	// y increment at the end of line
+
+	TeCoord2D pxill = rasterIn_->coord2Index (pill);
+	TeCoord2D pxiul = rasterIn_->coord2Index (piul);
+	TeCoord2D pxilr = rasterIn_->coord2Index (pilr);
+	TeCoord2D pxiur = rasterIn_->coord2Index (piur);
+
+// Evaluate the increments in x and y on both sides of input image
+
+	int	i, j;
+	double	x,y;
+
+	x1 = (int)pxoll.x()-1;
+	y1 = (int)pxour.y()-1;
+
+	x2 = (int)pxour.x()+1;
+	y2 = (int)pxoll.y()+1;
+
+	dxl = ( (pxill.x()-pxiul.x())/(y2-y1) );
+	dyl = ( (pxill.y()-pxiul.y())/(y2-y1) );
+
+	dxr = ( (pxilr.x()-pxiur.x())/(y2-y1) );
+	dyr = ( (pxilr.y()-pxiur.y())/(y2-y1) );
+
+// Set initial values for x and y at beginning point on input image
+
+	xl = pxiul.x() - 1;
+	yl = pxiul.y() - 1;
+
+// Set initial values for x and y at end point on input image
+
+	xr = pxiur.x() + 1;
+	yr = pxiur.y() + 1;
+
+// Evaluate increments for the first line
+
+	dx = (xr-xl)/(x2-x1);
+	dy = (yr-yl)/(x2-x1);
+
+	x = xl;		// round to left pixel
+	y = yl;		// round to left pixel
+
+	for (j=y1;j<=y2;j++)
+	{
+		for (i=x1;i<=x2;i++)
+		{
+			if (interpolation_ == 0)
+				transformer_->apply((int)(x+0.5),(int)(y+0.5),i,j);
+ 			x += dx;
+			y += dy;
+		}
+
+		xl += dxl;
+		x = xl;
+		xr += dxr;
+		yl += dyl;
+		y = yl;
+		yr += dyr;
+		dx = (xr-xl)/(x2-x1);
+		dy = (yr-yl)/(x2-x1);
+	}
+}
+
+bool TeRasterRemap::apply( bool showProgress )
+{
+	// check if input and output raster are set
+	if (!rasterIn_ || !rasterOut_)
+		return false;
+
+	TeRasterParams paramIn = rasterIn_->params();
+	TeRasterParams paramOut = rasterOut_->params();
+
+	TeProjection* projIn = paramIn.projection();
+	TeProjection* projOut = paramOut.projection();
+
+	// if only one of the rasters don�t have projection can�t do remapping
+	if ((projIn && !projOut) || (projOut && !projIn))
+		return false;
+
+	showProgress_ = showProgress;
+
+	// if no transformer defined create a new on based on typical cases of 
+	// visualization and import operations
+	bool delTransf = false;
+	if (!transformer_)
+	{
+		delTransf = true;		// remember to delete it 
+		transformer_ = new TeRasterTransform();
+		transformer_->setRasterIn(rasterIn_);
+		transformer_->setRasterOut(rasterOut_);
+
+		// pallete raster to a RGB device -> apply input raster pallete
+		if ((paramIn.photometric_[0] == TeRASTERPALETTE || 
+			 paramIn.photometric_[0] == TeRASTERTHEMATIC) &&
+			 paramOut.nBands() == 3)
+			transformer_->setTransfFunction(&TeRasterTransform::Pallete2ThreeBand);
+		// mono band raster to a RGB device -> repeat band to 3 channels
+		else if (paramIn.nBands() == 1 && paramOut.nBands() == 3)
+			transformer_->setTransfFunction(&TeRasterTransform::Mono2ThreeBand);
+		// copy first n input bands to first n output bands
+		else		
+			transformer_->setTransfFunction(&TeRasterTransform::Band2Band);
+	}
+
+	bool result;
+	// check if datum's are different
+	if (projIn->datum().name() != projOut->datum().name())
+	{
+		projIn->setDestinationProjection(projOut);
+		projOut->setDestinationProjection(projIn);
+	}
+
+	if (projIn && projOut && (*projIn == *projOut))	// same projection
+	{
+		TeBox	boxIn = paramIn.box();
+		TeBox	boxOut = paramOut.box();
+
+		
+		if (!(boxIn == boxOut) ||					// different resolutions or boxes
+			paramIn.resx_   != paramOut.resx_ || 
+			paramIn.resy_   != paramOut.resy_ ||
+			paramIn.ncols_  != paramOut.ncols_ ||
+			paramIn.nlines_ != paramOut.nlines_ )
+			result = resample();
+		else										// same dimensions
+			result = copy();
+	}
+	else											// different projection
+		result = remap();
+
+	if (delTransf)
+	{
+		delete transformer_;
+		transformer_ = 0;
+	}
+	return result;
+}
+
+bool TeRasterRemap::copy ()
+{
+	TeRasterParams paramOut = rasterOut_->params();
+	if(showProgress_ && TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(paramOut.nlines_);
+	int c, l;
+	clock_t	ti, tf;
+	ti = clock();
+	for (l=0; l<paramOut.nlines_; l++)
+	{
+		for (c=0; c<paramOut.ncols_; c++)
+			transformer_->apply(c,l,c,l);
+
+		if (showProgress_ && TeProgress::instance())
+		{
+			tf = clock();
+			if (int((tf-ti)/CLOCKS_PER_SEC) > 3)
+			{
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				TeProgress::instance()->setProgress(l);
+				ti = tf;
+			}
+		}
+	}
+	if(showProgress_ && TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+bool TeRasterRemap::resample ()
+{
+	TeRasterParams paramIn = rasterIn_->params();
+	TeRasterParams paramOut = rasterOut_->params();
+
+	TeBox	boxIn = paramIn.boundingBox();  
+	TeBox	boxOut = paramOut.boundingBox(); 
+
+// Evaluate intersection of input and output rasters in output raster projection domain
+
+	TeBox boxInter;
+
+	if (!TeIntersection (boxIn,boxOut,boxInter))
+		return false;
+
+// Take coordinates of intersection box
+
+	TeCoord2D poll = boxInter.lowerLeft ();
+	TeCoord2D pour = boxInter.upperRight ();
+
+// Bring it to output line/column domain
+
+	TeCoord2D pxoll = rasterOut_->coord2Index (poll);
+	TeCoord2D pxour = rasterOut_->coord2Index (pour);
+
+// Round it to nearest pixel
+	int x1,y1,x2,y2;
+	x1 = TeRoundRasterIndex(pxoll.x_) - 1;
+	y2 = TeRoundRasterIndex(pxoll.y_) + 1;
+	pxoll = TeCoord2D (x1,y2);
+
+	x2 = TeRoundRasterIndex(pxour.x_) + 1;
+	y1 = TeRoundRasterIndex(pxour.y_) - 1;
+	pxour = TeCoord2D (x2,y1);
+		
+// Bring it to output projection domain
+	poll = rasterOut_->index2Coord (pxoll);
+	pour = rasterOut_->index2Coord (pxour);
+
+// Bring upper left point to input line/column domain
+	TeCoord2D ulPoint = rasterIn_->coord2Index(TeCoord2D(poll.x(),pour.y()));
+
+//  - -
+// |A|B|
+//  - - 
+// |C| |
+//  - -
+// Get output projection domain of corner ABC
+	TeCoord2D A = rasterOut_->index2Coord(TeCoord2D(0,0));
+	TeCoord2D B = rasterOut_->index2Coord(TeCoord2D(1,0));
+	TeCoord2D C = rasterOut_->index2Coord(TeCoord2D(0,1));
+
+// Calculate equivalent input line/column coordinates 
+	TeCoord2D Ae = rasterIn_->coord2Index(A);
+	TeCoord2D Be = rasterIn_->coord2Index(B);
+	TeCoord2D Ce = rasterIn_->coord2Index(C);
+
+// Calculate input increments in both directions, in number of pixels
+// for each output 1 pixel increment in 
+	double eDxJ = Be.x()-Ae.x();		// increment in X direction when moving from A->B	
+	double eDyJ = Be.y()-Ae.y();		// increment in Y direction when moving from A->B
+	double eDyI = Ce.y()-Ae.y();		// increment in Y direction when moving from C->A
+	double eDxI = Ce.x()-Ae.x();		// increment in X direction when moving from C->A
+
+	int lin_sai,col_sai;
+	double lin_entra,col_entra; 
+
+	double lin_entra_i = ulPoint.y();	// starting at the upper-left corner	
+	double col_entra_i = ulPoint.x();
+
+	// redefine processing area, so there is no unecessary processing
+	while (TeRoundRasterIndex(lin_entra_i)<0)
+	{
+		lin_entra_i += eDyI;
+		col_entra_i += eDxI;
+		y1 += 1;
+	}
+	while (TeRoundRasterIndex(lin_entra_i+(y2-y1)*eDyI) >= paramIn.nlines_)
+		y2 -= 1;
+
+	while (TeRoundRasterIndex(col_entra_i)<0)
+	{
+		lin_entra_i += eDyJ;
+		col_entra_i += eDxJ;
+		x1 += 1;
+	}
+	while (TeRoundRasterIndex(col_entra_i+(x2-x1)*eDxJ) >= paramIn.ncols_)
+		x2 -= 1;
+
+	if( showProgress_ && TeProgress::instance())
+	{
+		TeProgress::instance()->setTotalSteps((int)(y2-y1));
+	}
+	int count = 1;
+	clock_t	ti, tf;
+	ti = clock();
+	for (lin_sai=y1;lin_sai<=y2;lin_sai++)
+	{
+		lin_entra = lin_entra_i;
+		col_entra = col_entra_i;
+		for (col_sai=x1;col_sai<=x2;col_sai++)
+		{
+			transformer_->apply(TeRoundRasterIndex(col_entra),TeRoundRasterIndex(lin_entra),col_sai,lin_sai);
+  			col_entra += eDxJ;
+			lin_entra += eDyJ;
+		}
+		count++;
+		lin_entra_i += eDyI;
+		col_entra_i += eDxI;
+		if(showProgress_ && TeProgress::instance())
+		{
+			tf = clock();
+			if (int((tf-ti)/CLOCKS_PER_SEC) > 3)
+			{
+				if (TeProgress::instance()->wasCancelled())
+					break;
+				TeProgress::instance()->setProgress(count);
+				ti = tf;
+			}
+		}
+	}
+	if (showProgress_ && TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+bool TeRasterRemap::remap()
+{
+
+	TeRasterParams paramIn = rasterIn_->params();
+	TeRasterParams paramOut = rasterOut_->params();
+
+	TeProjection *projIn = paramIn.projection();
+	TeProjection *projOut = paramOut.projection();
+
+
+	if ( projIn == 0 || projOut == 0)
+		return false;
+
+	TeBox	boxIn =  paramIn.box();
+	TeBox	boxOut = paramOut.box();
+
+// Evaluate intersection of input and output rasters in output raster projection domain
+	TeBox boxInter;
+	boxIn = TeRemapBox (boxIn, projIn, projOut);
+	if (!TeIntersection (boxIn,boxOut,boxInter))
+		return false;
+
+// Start trying to remap the input quadrilateral
+	TeInterpolateIn ( boxInter );
+	return true;
+}
diff --git a/src/terralib/kernel/TeRasterRemap.h b/src/terralib/kernel/TeRasterRemap.h
new file mode 100644
index 0000000..2de8d88
--- /dev/null
+++ b/src/terralib/kernel/TeRasterRemap.h
@@ -0,0 +1,116 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRasterRemap.h
+    This file contains definitions the class and functions need to transform a raster geometry into another geometry
+*/
+#ifndef  __TERRALIB_INTERNAL_RASTERREMAP_H
+#define  __TERRALIB_INTERNAL_RASTERREMAP_H
+
+#include "TeRaster.h"
+#include "TeGeometry.h"
+#include "TeRasterTransform.h"
+
+//!  A functional class to transform a raster geometry into another geometry 
+/*!  
+	RasterRemap class provides functions to remap a raster strtucture into another.
+	The two raster can have a different projections, different bounding boxes and/or 
+	different resolutions. 
+ 
+	\sa
+     TeRaster, TeRasterParams, TeRasterTransform, TeProjection, TeBox
+
+	\note Raster representation in TerraLib is under development, all files that deal
+	with raster representation should be considered as a beta version.
+*/
+class TeRasterRemap
+{
+protected:
+	TeRaster*	rasterIn_;		//!< input raster
+	TeRaster*	rasterOut_;		//!< output raster
+
+	TeRasterTransform* transformer_;	
+
+	int	 interpolation_;
+	bool showProgress_;
+
+	void TeInterpolateIn (TeBox &box);
+
+	bool remap ();
+	bool copy ();
+	bool resample ();
+
+public:
+
+	//! Constructor
+	/*
+		\param rasterIn pointer to the input raster
+		\param rasterOut pointer to the output raster
+		\para showProgress flag to indicate that a progress status hould be reported
+	*/
+	TeRasterRemap (TeRaster* rasterIn=0, TeRaster* rasterOut=0, bool showProgress = false):
+		rasterIn_(rasterIn),
+		rasterOut_(rasterOut),
+		transformer_(0),
+		interpolation_(0),
+		showProgress_(showProgress)
+		{}
+
+	//! Sets the input raster
+	void setInput( TeRaster* rasterIn)
+	{	
+		rasterIn_ = rasterIn; 
+		if (transformer_)
+			transformer_->setRasterIn(rasterIn_);
+	}
+	
+	//! Sets the output raster
+	void setOutput( TeRaster* rasterOut)
+	{	
+		rasterOut_ = rasterOut; 
+		if (transformer_)
+			transformer_->setRasterOut(rasterOut_);
+	}
+	
+	//! Sets the interpolation flag
+	void setInterpolation( int interpolation )
+	{	interpolation_ = interpolation; }
+
+	//! Sets the transformation to be used when doing remap
+	void setTransformer(TeRasterTransform* transf)
+	{	
+		transformer_ = transf; 
+		transformer_->setRasterOut(rasterOut_);
+		transformer_->setRasterIn(rasterIn_);
+	}
+	
+	//! Returns the transformation to be used when doing remap
+	TeRasterTransform* transformer()
+	{	return transformer_;	}
+
+	//! Applies the remaping
+	bool apply(bool showProgress = false );
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeRasterTransform.cpp b/src/terralib/kernel/TeRasterTransform.cpp
new file mode 100644
index 0000000..d16b4d4
--- /dev/null
+++ b/src/terralib/kernel/TeRasterTransform.cpp
@@ -0,0 +1,128 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeRasterTransform.h"
+
+void 
+TeRasterTransform::generateLUT(TeLegendEntryVector& legs, unsigned int nentries, TeColor& backColor)
+{
+	// find the range covered by the legends
+	unsigned int n;
+	double vmin = TeMAXFLOAT;
+	double vmax = TeMINFLOAT;
+	for (n=0; n <legs.size(); n++)
+	{
+		if (atof(legs[n].slice().from_.c_str()) < vmin)
+			vmin = atof(legs[n].slice().from_.c_str());
+		if (atof(legs[n].slice().to_.c_str()) > vmax)
+			vmax = atof(legs[n].slice().to_.c_str());
+	}
+	// do a linear transformation from the range defined by the legend to the number of entries
+	this->setLinearTransfParameters(vmin,vmax, 0, nentries-1);
+
+	// initialize lut with the background color
+	lutr_.clear();
+	lutg_.clear();
+	lutb_.clear();
+
+	lutr_.insert(lutr_.begin(),nentries,backColor.red_);
+	lutg_.insert(lutg_.begin(),nentries,backColor.green_);
+	lutb_.insert(lutb_.begin(),nentries,backColor.blue_);
+
+	// to each entry define its equivalent range of indexes on the LUT
+	int nunIndx = 0;
+	int indexFrom, indexTo;
+	for (n=0; n <legs.size(); n++)
+	{
+		// find the range of entries that
+		indexFrom = (int)(atof(legs[n].slice().from_.c_str()) * gain_ + offset_);
+		if (indexFrom < 0)
+			indexFrom = 0;
+		indexTo = (int)(atof(legs[n].slice().to_.c_str()) * gain_ + offset_);
+		if (indexTo > (int)nentries)
+			indexTo = nentries;
+		nunIndx = indexTo - indexFrom + 1;
+		if (nunIndx >= 1)
+		{
+			fill_n(&lutr_[indexFrom],nunIndx,legs[n].getVisualMap()[TePOLYGONS].color().red_);
+			fill_n(&lutg_[indexFrom],nunIndx,legs[n].getVisualMap()[TePOLYGONS].color().green_);
+			fill_n(&lutb_[indexFrom],nunIndx,legs[n].getVisualMap()[TePOLYGONS].color().blue_);
+		}
+	}
+	lutSize_ = lutr_.size();
+}
+
+TeRasterTransform::TeRasterTransfFunctions TeRasterTransform::getTransfFunction()
+{
+	if (transfFuncPtr_ == 0)
+		return TeNoTransf;
+
+	if (transfFuncPtr_ == &TeRasterTransform::Mono2ThreeBand)
+		return TeMono2Three;
+
+	if (transfFuncPtr_ == &TeRasterTransform::Band2Band)
+		return TeBand2Band;
+
+	if (transfFuncPtr_ == &TeRasterTransform::Pallete2ThreeBand)
+		return TePall2Three;
+
+	if (transfFuncPtr_ == &TeRasterTransform::LUT2ThreeBand)
+		return TeLUT2Three;
+
+	if (transfFuncPtr_ == &TeRasterTransform::ExtractRGB)
+		return TeExtractRGB;
+
+	if (transfFuncPtr_ == &TeRasterTransform::ExtractBand)
+		return TeExtractBand;
+
+	if (transfFuncPtr_ == &TeRasterTransform::ExtractBands)
+		return TeExtractBands;
+	else
+		return TeNoTransf;
+}
+
+void TeRasterTransform::setTransfFunction(TeRasterTransfFunctions func)
+{
+	if (func == TeMono2Three)
+		transfFuncPtr_ = &TeRasterTransform::Mono2ThreeBand;
+
+	else if (func == TeBand2Band)
+		transfFuncPtr_ = &TeRasterTransform::Band2Band;
+
+	else if (func == TePall2Three)
+		transfFuncPtr_ = &TeRasterTransform::Pallete2ThreeBand; 
+
+	else if (func == TeLUT2Three)
+		transfFuncPtr_ = &TeRasterTransform::LUT2ThreeBand;
+		
+	else if (func == TeExtractRGB)
+		transfFuncPtr_ = &TeRasterTransform::ExtractRGB;
+
+	else if (func == TeExtractBand)
+		transfFuncPtr_ = &TeRasterTransform::ExtractBand;
+
+	else if (func == TeExtractBands)
+		transfFuncPtr_ = &TeRasterTransform::ExtractBands;
+	else
+		transfFuncPtr_ = 0;
+}
diff --git a/src/terralib/kernel/TeRasterTransform.h b/src/terralib/kernel/TeRasterTransform.h
new file mode 100644
index 0000000..08f89d6
--- /dev/null
+++ b/src/terralib/kernel/TeRasterTransform.h
@@ -0,0 +1,307 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRasterTransform.h
+    This file deals with the transformation functions over raster pixels
+*/
+#ifndef  __TERRALIB_INTERNAL_RASTERTRANSFORM_H
+#define  __TERRALIB_INTERNAL_RASTERTRANSFORM_H
+
+#include "TeRaster.h"
+#include "TeLegendEntry.h"
+
+#include <map>
+#include <vector>
+using namespace std;
+
+//! This class defines a way of evaluating the final value of a raster element
+class TeRasterTransform
+{
+public:
+
+	//! The three channels of a display
+	enum TeRGBChannels { TeREDCHANNEL=0, TeGREENCHANNEL=1, TeBLUECHANNEL=2 };
+
+	enum TeRasterTransfFunctions
+	{	TeNoTransf=0, TeMono2Three=1, TeBand2Band=2, TePall2Three=3, TeLUT2Three=4, 
+		TeExtractRGB=5, TeExtractBand=6, TeExtractBands=7	};
+
+	//! One of the available transformation methods 
+	typedef void (TeRasterTransform::*TransformFunction)(double, double, double, double);
+
+private:
+
+	TeRaster* rasterIn_;			
+	TeRaster* rasterOut_;
+
+	double gain_, offset_;
+
+	map<TeRGBChannels,short> rgbmap_;
+
+	short mband_, mbout_;
+
+	TransformFunction transfFuncPtr_;
+
+	double rmin_, rmax_;
+
+	int lutSize_;
+
+public:
+
+	vector<unsigned char> lutr_;
+	vector<unsigned char> lutg_;
+	vector<unsigned char> lutb_;
+
+	//! Constructor 
+	TeRasterTransform(TeRaster* rIn=0, TeRaster* rOut=0):  
+	  rasterIn_(rIn),
+	  rasterOut_(rOut),
+	  gain_(1),
+	  offset_(0),
+	  mband_(0), 
+	  mbout_(0),
+	  transfFuncPtr_(&TeRasterTransform::Band2Band),
+	  rmin_(TeMINFLOAT),
+	  rmax_(TeMAXFLOAT),
+	  lutSize_(0)
+	 {}
+
+	//! Destructor
+	~TeRasterTransform()
+	{
+		lutr_.clear();
+		lutb_.clear();
+		lutg_.clear();
+		rgbmap_.clear();
+		transfFuncPtr_ = 0;
+	}
+
+	//! Sets the size of the LUT being used
+	void setLutSize(int n)
+	{	lutSize_ = n; }
+
+	//! Gets the size of the LUT being used
+	int getLutSize()
+	{	return lutSize_; }
+
+	//! Sets the input raster
+	void setRasterIn(TeRaster* rIn)
+	{	rasterIn_ = rIn; }
+
+	//! Sets the input raster
+	void setRasterOut(TeRaster* rOut)
+	{	rasterOut_ = rOut; }
+	
+	//! Sets the gain
+	void setGain(double g) 
+	{	gain_= g;	}
+
+	//! Sets the offset
+	void setOffset(double o) 
+	{	offset_= o;	}
+
+	//! Sets the transformation method to be used 
+	void setTransfFunction(TeRasterTransform::TransformFunction transfFuncPtr)
+	{	transfFuncPtr_ = transfFuncPtr; }
+
+	//! Sets the mapping from bands to R,G and B channels 
+	void setRGBmap (map<TeRGBChannels,short>& rgbmap)
+	{
+		if (rgbmap.size() < 3)
+			return;
+		rgbmap_.clear();
+		rgbmap_ = rgbmap;
+	}
+
+	//! Sets the mapping from a particular input band to a particular output channel
+	void setBChannelMapping(short bIn, TeRGBChannels bOut)
+	{
+		rgbmap_[bOut] = bIn;
+	}
+
+	//! Clears current mapping from bands to channel
+	void clearRGBMap()
+	{
+		rgbmap_.clear();
+	}
+
+	//! Returns the mapping from a particular input band to a particular output channel
+	map<TeRGBChannels,short>& getRGBMap()
+	{
+		return rgbmap_;
+	}
+
+	//! Sets the mono band to be transformed
+	void setSrcBand(short n)
+	{ mband_ = n; }
+
+	//! Gets the mono band to be transformed
+	short getSrcBand()
+	{	return mband_; }
+
+	//! Sets the destination of the mono band
+	void setDestBand(short n)
+	{ mbout_ = n; }
+
+	//! Gets the destination of the mono band
+	short getDestBand()
+	{	return mbout_;	}
+	
+	//! Generates a LUT with nentries to display the vector of legends
+	void generateLUT(TeLegendEntryVector& legs, unsigned int nentries, TeColor& backColor);
+
+	//! Set parameters of linear transformation
+	/*!
+		\param vmin smallest input value
+		\param vmax largest input value
+		\param rmin smallest value of the output range
+		\param rmax largest value of the output range
+	*/
+	void setLinearTransfParameters(double vmin, double vmax, double rmin, double rmax)
+	{
+		rmin_ = rmin;
+		rmax_ = rmax;
+		gain_ = (double)(rmax-rmin)/(vmax-vmin);
+		offset_ = -1*gain_*vmin+rmin;
+	}
+
+	//! Applies the selected transformation method
+	void apply(double icol, double ilin, double ocol, double olin)
+	{	(this->*transfFuncPtr_)(icol,ilin,ocol,olin); }
+
+
+	//! Returns the identifier of the transformation function currently set
+	TeRasterTransfFunctions getTransfFunction();
+
+	//! Sets the associated transformation function from an identifier
+	void setTransfFunction(TeRasterTransfFunctions func);
+
+// --- The transformation functions  available ----
+	//! This transformation repeats the value of the first band in input three bands of the output
+	void Mono2ThreeBand(double icol, double ilin, double ocol, double olin)
+	{
+		double val;
+		if (rasterIn_->getElement((int)icol,(int)ilin,val,mband_))
+		{
+			val = val*gain_ + offset_;
+			if (val < rmin_)
+				val = rmin_;
+			else if (val > rmax_)
+				val = rmax_;
+			rasterOut_->setElement((int)ocol,(int)olin,val,0);
+			rasterOut_->setElement((int)ocol,(int)olin,val,1);
+			rasterOut_->setElement((int)ocol,(int)olin,val,2);
+		}
+	}
+
+	//! This transformation repeats the value of each band in input to the same band in output
+	void Band2Band(double icol, double ilin, double ocol, double olin)
+	{
+		double val;
+		int n = rasterOut_->params().nBands();
+		for (int i=0; i<n; i++)
+			if (rasterIn_->getElement((int)icol,(int)ilin,val,i))
+			{
+				val = val*gain_ + offset_;
+				if (val < rmin_)
+					val = rmin_;
+				else if (val > rmax_)
+					val = rmax_;
+				rasterOut_->setElement((int)ocol,(int)olin,val,i);
+			}
+	}
+
+	//! This transformation repeats the value of the raster LUT in input to the first 3 bands of output
+	void Pallete2ThreeBand(double icol, double ilin, double ocol, double olin)
+	{
+		double val;
+		if (rasterIn_->getElement((int)icol,(int)ilin,val))
+		{
+			if (val> 0 && (int)val < lutSize_)
+			{
+				rasterOut_->setElement((int)ocol,(int)olin,rasterIn_->params().lutr_[(int)val],0);
+				rasterOut_->setElement((int)ocol,(int)olin,rasterIn_->params().lutg_[(int)val],1);
+				rasterOut_->setElement((int)ocol,(int)olin,rasterIn_->params().lutb_[(int)val],2);
+			}
+		}
+	}
+
+	//! This transformation repeats the value of an external LUT to the first 3 bands of output
+	void LUT2ThreeBand(double icol, double ilin, double ocol, double olin)
+	{
+		double idx, val; 
+		if (rasterIn_->getElement((int)icol,(int)ilin,val,mband_))
+		{
+			idx = (val*gain_) + offset_;
+			if (idx >= 0 && idx < lutSize_)
+			{
+				rasterOut_->setElement((int)ocol,(int)olin,lutr_[(int)idx],0);
+				rasterOut_->setElement((int)ocol,(int)olin,lutg_[(int)idx],1);
+				rasterOut_->setElement((int)ocol,(int)olin,lutb_[(int)idx],2);
+			}
+		}
+	}
+
+	// This transformation is used to define a particular mapping from input bands to RGB channels
+	void ExtractRGB(double icol, double ilin, double ocol, double olin)
+	{
+		double val;
+		if (rasterIn_->getElement((int)icol,(int)ilin,val,rgbmap_[TeREDCHANNEL]))
+			rasterOut_->setElement((int)ocol,(int)olin,val,0);
+		if (rasterIn_->getElement((int)icol,(int)ilin,val,rgbmap_[TeGREENCHANNEL]))
+			rasterOut_->setElement((int)ocol,(int)olin,val,1);
+		if (rasterIn_->getElement((int)icol,(int)ilin,val,rgbmap_[TeBLUECHANNEL]))
+			rasterOut_->setElement((int)ocol,(int)olin,val,2);
+	}
+
+	//! This transformation repeats the value of a particular band in input to a particular band of the output
+	void ExtractBand(double icol, double ilin, double ocol, double olin)
+	{
+		double val;
+		if (rasterIn_->getElement((int)icol,(int)ilin,val,mband_))
+		{
+			val = val*gain_ + offset_;
+			if (val < rmin_)
+				val = rmin_;
+			else if (val > rmax_)
+				val = rmax_;
+			rasterOut_->setElement((int)ocol,(int)olin,val,mbout_);
+		}
+	}
+
+	// This transformation extracts selected bands of the input raster and writes each to a particular band of the output
+	void ExtractBands(double icol, double ilin, double ocol, double olin)
+	{
+		double val;
+		map<TeRGBChannels,short>::iterator it = rgbmap_.begin();
+		while (it != rgbmap_.end())
+		{
+			if (rasterIn_->getElement((int)icol,(int)ilin,val,it->second))
+				rasterOut_->setElement((int)ocol,(int)olin,val,it->first);
+		}
+	}
+
+};
+#endif
+
+
diff --git a/src/terralib/kernel/TeRedBlackTree.h b/src/terralib/kernel/TeRedBlackTree.h
new file mode 100644
index 0000000..3b6ddb4
--- /dev/null
+++ b/src/terralib/kernel/TeRedBlackTree.h
@@ -0,0 +1,765 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRedBlackTree.h
+    This file contains structures and definitions for a balanced binary search tree.
+ */
+
+/**
+  *@author Gilberto Ribeiro de Queiroz
+  */
+
+#ifndef  __TERRALIB_INTERNAL_RED_BLACK_TREE_H
+#define  __TERRALIB_INTERNAL_RED_BLACK_TREE_H
+
+//STL's include
+#include <string>
+
+//TerraLib's include
+#include "TeUtils.h"
+
+using namespace std;
+
+#define PRINT
+
+namespace TeREDBLACK
+{
+
+	/*! \enum TeRBNodeColor
+			  Possible values for a node color in a red-black tree.
+	 */
+	enum TeRBNodeColor { TeREDNODE, TeBLACKNODE };
+
+	//! Template class for nodes in a Red-Black tree.
+	/*!
+		This class contains the common attributes to a node
+		used by a binary tree. Only used for commom binary trees,
+		if you want a more sophisticated tree, you can continue
+		using the Red-Black Tree framework defined below, it is possible
+		taking care of some default attributes that a node must
+		have to implement (left_, right_, parent_, data_).
+	*/
+	template<class T> class TeRedBlackNode
+	{
+		public:
+
+			//! Export node's data type.
+			typedef T TeRedBlackNodeData;
+
+			//! Node's data.
+			T data_;
+
+			//! Pointer to the left sub-tree.
+			TeRedBlackNode* left_;
+
+			//! Pointer to the right sub-tree.
+			TeRedBlackNode* right_;
+
+			//! Pointeir to the father's node.
+			TeRedBlackNode* parent_;
+
+			//! Node's color (RED or BLACK).
+			TeRBNodeColor color_;
+
+			//! Constructor.
+			TeRedBlackNode(const TeRBNodeColor& color = TeREDNODE)
+				: left_(0), right_(0), parent_(0), color_(color)
+			{
+			}
+
+			//! Constructor.
+			TeRedBlackNode(T& d, const TeRBNodeColor& color = TeREDNODE)
+				: data_(d), left_(0), right_(0), parent_(0), color_(color)
+			{
+			}
+
+
+		private:
+
+			//! No copy allowed
+			TeRedBlackNode(const TeRedBlackNode& other);
+
+			// No copy allowed
+			TeRedBlackNode& operator=(const TeRedBlackNode& other);
+	};
+
+	//! Template class for Red-Black trees.
+	/*!
+		This class contains the common operations in a Red-Black Tree.
+		It can be used like a framework. Extend the methods like
+		"Insert" and "Search" to walk and to do some usefull things.
+		You will use the methods for Rotation, Insert Propagation,
+		Delete Propagation, Sucessor, Predecessor, IsEmpty, Clear.
+		This tree is based on the algorithm of Cormen's book. The only difference is
+		when a node being deleted has two children its successor node is relinked into its place,
+		rather than copied, so that the only iterators invalidated are those referring to the deleted node.
+		Every data used in nodes must implements a ToString() method.
+	*/
+	template<class NODE> class TeRBTree
+	{
+		private:
+
+			//! No copy allowed.
+			TeRBTree(const TeRBTree& other);
+
+			//! No copy allowed.
+			TeRBTree& operator=(const TeRBTree& other);
+
+		protected:
+
+			//! Reference node.
+			NODE* nil_;
+
+			//! Tree's root.
+			NODE* root_;
+
+			//! Count the number of nodes in the tree (excluding nil_ node).
+			unsigned int nodeCount_;
+
+		public:
+
+			typedef NODE* REDBLACKNODEPOINTER;
+			typedef typename NODE::TeRedBlackNodeData TeRedBlackNodeData;
+
+			//! Constructor.
+			TeRBTree()
+				: nodeCount_(0)
+			{
+				nil_ = new NODE();
+				nil_->color_ = TeBLACKNODE;
+
+				root_ = nil_;
+
+			}
+
+			//! Destructor.
+			virtual ~TeRBTree()
+			{
+				Clear();
+
+				if(nil_)
+					delete nil_;
+			}
+
+			//! Returns true if the tree is empty otherwise returns false.
+			bool IsEmpty(void) const
+			{
+				return root_ == nil_;
+			}
+
+			//! Returns the number of nodes in the tree, excluding the nil_ one.
+			unsigned int Size(void) const
+			{
+				return nodeCount_;
+			}
+
+			//! Removes the node from the tree and do rebalancing.
+			virtual void Delete(NODE* z)
+			{
+				if(z)
+				{
+					// z has at most one non-null child. y == z.
+					// x might be null.
+					// z has exactly one non-null child.  y == z.
+					// x is not null.
+					// z has two non-null children.  Set y to
+					//   z's successor.  x might be null.
+					NODE* y = ((z->left_ == nil_) || (z->right_ == nil_)) ? z : Successor(z);
+					NODE* x = (y->left_  != nil_) ?  y->left_ : y->right_;
+					NODE* x_parent = 0;
+
+					if(y != z)	// relink y in place of z.  y is z's successor
+					{
+						z->left_->parent_ = y;
+						y->left_ = z->left_;
+						if(y != z->right_)
+						{
+							x_parent = y->parent_;
+
+							if(x != nil_)
+								x->parent_ = y->parent_;
+
+							y->parent_->left_ = x;      // y must be a left child
+							y->right_ = z->right_;
+							z->right_->parent_ = y;
+						}
+						else
+							x_parent = y;
+
+						if(root_ == z)
+							root_ = y;
+						else
+							if(z->parent_->left_ == z)
+								z->parent_->left_ = y;
+							else
+								z->parent_->right_ = y;
+
+						y->parent_ = z->parent_;
+
+						TeRBNodeColor aux_color = y->color_;
+						y->color_ = z->color_;
+						z->color_ = aux_color;
+
+						y = z;
+
+						// y now points to node to be actually deleted
+					}
+					else
+					{                        // y == z
+						x_parent = y->parent_;
+						if(x != nil_)
+							x->parent_ = y->parent_;
+
+						if(root_ == z)
+							root_ = x;
+						else
+							if(z->parent_->left_ == z)
+								z->parent_->left_ = x;
+							else
+								z->parent_->right_ = x;
+					}
+
+					if(y->color_ == TeBLACKNODE)
+						DeleteFixUp(x, x_parent, root_);
+
+					delete y;
+
+					nodeCount_--;
+				}
+
+				return;
+			}
+
+			//! Returns the sucessor of a given node or zero if not.
+			virtual NODE* Successor(NODE* x) const
+			{
+				if(x)
+				{
+					if(x->right_ != nil_)
+					{
+						x = x->right_;
+
+						while(x->left_ != nil_)
+							x = x->left_;
+
+						return x;
+					}
+
+					NODE* y = x->parent_;
+
+					while((y != nil_) && (x == y->right_))
+					{
+						x = y;
+						y = y->parent_;
+					}
+
+					if(y == nil_)
+						return 0;
+
+					return y;
+				}
+
+				return 0;
+			}
+
+			//! Returns the predecessor of a given node or zero if not.
+			virtual NODE* Predecessor(NODE* x) const
+			{
+				if(x)
+				{
+					if(x->left_ != nil_)
+					{
+						x = x->left_;
+
+						while(x->right_ != nil_)
+							x = x->right_;
+
+						return x;
+					}
+
+					NODE* y = x->parent_;
+
+					while((y != nil_) && (x == y->left_))
+					{
+						x = y;
+						y = y->parent_;
+					}
+
+					if(y == nil_)
+						return 0;
+
+					return y;
+				}
+
+				return 0;
+			}
+
+			//! Returns the leftmost node in the tree, or zero if not.
+			NODE* First(void) const
+			{
+				if(IsEmpty())
+					return 0;
+
+				NODE *x = root_;
+
+				while(x->left_ != nil_)
+					x = x->left_;
+
+				return x;
+			}
+
+			//! Returns the rightmost node in the tree, or zero if not.
+			NODE* Last(void) const
+			{
+				if(IsEmpty())
+					return 0;
+
+				NODE *x = root_;
+
+				while(x->right_ != nil_)
+					x = x->right_;
+
+				return x;
+			}
+
+			//! Return the first element in the tree and removes it.
+			virtual bool GetFirst(TeRedBlackNodeData& d)
+			{
+				NODE *x = First();
+
+				if(x)
+				{
+						d = x->data_;
+
+						Delete(x);
+
+						return true;
+				}
+
+				return false;
+			}
+
+			//! Removes all nodes from the tree (excepty the nil node). Clear memory.
+			void Clear(void)
+			{
+				if(!IsEmpty())
+				{
+					Erase(root_);
+
+					root_ = nil_;
+				}
+
+				return;
+			}
+
+			//! Write the node's data to a file. The data must implement a methos called: void ToString(void).
+			virtual void WriteToFile(const string& fileName) const
+			{
+				string strRepres = "";
+		
+				WriteToFile(root_, strRepres);
+
+				TeWriteToFile(fileName, strRepres, "w");
+				
+				return;
+			}
+
+		protected:
+
+			//! Left rotation.
+			virtual void LeftRotate(NODE* x, NODE*& root)
+			{
+				NODE* y = x->right_;
+
+				x->right_ = y->left_;
+	
+				if(y->left_ != nil_)
+					y->left_->parent_ = x;
+
+				y->parent_ = x->parent_;
+
+
+				if(x == root)
+					root = y;
+				else
+				{
+					if(x == x->parent_->left_)
+						x->parent_->left_ = y;
+					else
+						x->parent_->right_ = y;
+				}
+
+				y->left_ = x;
+				x->parent_ = y;
+
+				return;
+			}
+
+			//! Right rotation.
+			virtual void RightRotate(NODE* y, NODE*& root)
+			{
+				NODE* x = y->left_;
+
+				y->left_ = x->right_;
+
+				if(x->right_ != nil_)
+					x->right_->parent_ = y;
+
+				x->parent_ = y->parent_;
+
+				if(y == root)
+					root = x;
+				else
+				{
+					if(y == y->parent_->right_)
+						y->parent_->right_ = x;
+					else
+						y->parent_->left_ = x;
+				}
+
+				x->right_ = y;
+				y->parent_ = x;
+			
+				return;
+			}
+
+			//! Must be called after an insert, to fix-up the tree.
+			void InsertFixUp(NODE*& n, NODE*& root)
+			{
+				n->color_ = TeREDNODE;
+
+				NODE* y;
+       
+				while ((n != root) && (n->parent_->color_ == TeREDNODE))
+				{
+					if(n->parent_ == n->parent_->parent_->left_)	
+					{											
+						y = n->parent_->parent_->right_;			
+						if(y->color_ == TeREDNODE)			
+						{							
+							n->parent_->color_ = TeBLACKNODE;
+							y->color_ = TeBLACKNODE;
+							n = n->parent_->parent_;
+							n->color_ = TeREDNODE;
+						}
+						else
+						{
+							if(n == n->parent_->right_)
+							{						
+								n = n->parent_;		
+								LeftRotate(n, root);
+							}
+
+							n->parent_->color_ = TeBLACKNODE;
+							n->parent_->parent_->color_ = TeREDNODE;
+							RightRotate(n->parent_->parent_, root);
+						}
+					}
+					else
+					{
+						y = n->parent_->parent_->left_;
+						if(y->color_ == TeREDNODE)
+						{
+							n->parent_->color_ = TeBLACKNODE;
+							y->color_ = TeBLACKNODE;
+							n = n->parent_->parent_;
+							n->color_ = TeREDNODE;
+						}
+						else
+						{
+							if(n == n->parent_->left_)
+							{
+								n = n->parent_;
+								RightRotate(n, root);
+			                }
+
+							n->parent_->color_ = TeBLACKNODE;
+							n->parent_->parent_->color_ = TeREDNODE;
+							LeftRotate(n->parent_->parent_, root);
+						}
+					}
+				}
+
+				root->color_ = TeBLACKNODE;
+
+				return;
+			}
+
+			//! Must be called after a deletion, to fix-up the tree.
+			void DeleteFixUp(NODE* x, NODE* x_parent, NODE*& root)
+			{
+				while((x != root) && (x == nil_ || x->color_ == TeBLACKNODE))
+				{
+					if(x == x_parent->left_)
+					{
+						NODE *w = x_parent->right_;
+
+						if(w->color_ == TeREDNODE)
+				        {
+							w->color_ = TeBLACKNODE;
+							x_parent->color_ = TeREDNODE;
+							LeftRotate(x_parent, root);
+							w = x_parent->right_;
+				        }
+		            
+						if((w->left_ == nil_ || w->left_->color_ == TeBLACKNODE) && (w->right_ == nil_ || w->right_->color_ == TeBLACKNODE))
+						{
+							w->color_ = TeREDNODE;
+							x = x_parent;
+							x_parent = x_parent->parent_;
+						}
+						else
+				        {
+							if(w->right_ == nil_ || w->right_->color_ == TeBLACKNODE)
+					        {
+								if(w->left_ != nil_)
+									w->left_->color_ = TeBLACKNODE;
+
+								w->color_ = TeREDNODE;
+								RightRotate(w, root);
+								w = x_parent->right_;
+						    }
+						   
+							w->color_ = x_parent->color_;
+							x_parent->color_ = TeBLACKNODE;
+							
+							if(w->right_ != nil_)
+								w->right_->color_ = TeBLACKNODE;
+
+							LeftRotate(x_parent, root);
+
+							break;
+						}
+					}
+					else
+				    {
+						NODE* w = x_parent->left_;
+
+						if(w->color_ == TeREDNODE)
+				        {
+							w->color_ = TeBLACKNODE;
+							x_parent->color_ = TeREDNODE;
+							RightRotate(x_parent, root);
+							w = x_parent->left_;
+						}
+                
+						if((w->left_ == nil_ || w->left_->color_ == TeBLACKNODE) && (w->right_ == nil_ || w->right_->color_ == TeBLACKNODE))
+						{
+							w->color_ = TeREDNODE;
+							x = x_parent;
+							x_parent = x_parent->parent_;
+						}
+						else
+						{
+							if(w->left_ == nil_ || w->left_->color_ == TeBLACKNODE)
+				            {
+								if(w->right_ != nil_)
+									w->right_->color_ = TeBLACKNODE;
+
+								w->color_ = TeREDNODE;
+								LeftRotate(w, root);
+								w = x_parent->left_;
+							}
+						
+							w->color_ = x_parent->color_;
+							x_parent->color_ = TeBLACKNODE;
+							
+							if(w->left_ != nil_)
+								w->left_->color_ = TeBLACKNODE;
+
+							RightRotate(x_parent, root);
+							
+							break;
+						}
+					}
+				}
+
+				if(x != nil_)
+					x->color_ = TeBLACKNODE;
+			}
+
+			//! Only to be used by the public method, walking on the tree.
+			virtual void WriteToFile(NODE* n, string& strRepres) const
+			{
+				if(n != nil_)
+				{
+					WriteToFile(n->left_, strRepres);
+
+					strRepres += n->data_.ToString();
+					strRepres += '\n';
+
+					WriteToFile(n->right_, strRepres);
+				}
+
+				return;
+			}	
+
+			//! Removes the node and all node below it and doesn't do rebalancing. Used to free the memory.
+			void Erase(NODE* n)
+			{
+				if(n != nil_)
+				{
+					Erase(n->left_);
+					Erase(n->right_);
+
+					delete n;
+
+					nodeCount_--;
+				}
+
+				return;
+			}
+
+		public:
+
+			//! Iterators class for the tree. It is used to abstract walking on the tree.
+			template<class Node_i> class internal_iterator
+			{
+				protected:
+
+					//! Pointer to the tree.
+					TeRBTree<Node_i>* tree_;
+
+					//! Pointer to the node.
+					Node_i* node_;
+
+				public:
+
+					void invalid(void)
+					{
+						node_ = 0;
+						return;
+					}
+
+					Node_i* getNode(void) const
+					{
+						return node_;
+					}
+
+				public:
+
+					//! Constructor.
+					internal_iterator()
+						: node_(0), tree_(0)
+					{						
+					}
+					
+					//! Constructor
+					internal_iterator(TeRBTree<Node_i>* tree, Node_i* n)
+						: tree_(tree), node_(n)
+					{
+					}
+
+					//! Destructor.
+					virtual ~internal_iterator()
+					{
+					}
+
+					//! Dereference operator.
+					typename Node_i::TeRedBlackNodeData* operator->() const
+					{
+						return &node_->data_;
+					}
+
+					//! Dereference operator.
+					typename Node_i::TeRedBlackNodeData& operator*() const
+					{
+						return node_->data_;
+					}
+
+					//! Operator ++ pre-fixed.
+					internal_iterator& operator++()
+					{
+						node_ = tree_->Successor(node_);
+
+
+						return *this;
+					}
+
+					//! Operator ++ pos-fixed
+					internal_iterator operator++(int)	
+					{
+						internal_iterator temp = *this;
+						++(*this);
+						
+						return temp;
+					}
+
+					//! Operator -- pre-fixed.
+					internal_iterator& operator--()
+					{
+						node_ = tree_->Predecessor(node_);
+
+
+						return *this;
+					}
+
+					//! Operator -- pos-fixed
+					internal_iterator operator--(int)	
+					{
+						internal_iterator temp = *this;
+						--(*this);
+						return temp;
+					}
+
+					//! Operator ==.
+					bool operator==(const internal_iterator& other) const
+					{
+						return (this->node_ == other.node_);
+					}
+
+					//! Operator !=.
+					bool operator!=(const internal_iterator& other) const
+					{
+						return(this->node_ != other.node_);
+					}
+			};
+
+			//! Exports iterator type.
+			typedef internal_iterator<NODE> iterator;
+
+			//! Returns an iterator to the leftmost node of the tree.
+			iterator begin(void)
+			{
+				return iterator(this, First());
+			}			
+
+			//! Returns a reference iterator indicating the end of a tree.
+			iterator end(void)
+			{
+				return iterator(this, 0);
+			}
+
+			//! Erases a node pointed by an interator.
+			void erase(iterator& it)
+			{
+				Delete(it.getNode());
+
+				it.invalid();
+
+				return;
+			}
+	};
+
+}		// end namespace TeREDBLACK
+#endif	// __TERRALIB_INTERNAL_RED_BLACK_TREE_H
diff --git a/src/terralib/kernel/TeRepresentation.cpp b/src/terralib/kernel/TeRepresentation.cpp
new file mode 100644
index 0000000..e2ce078
--- /dev/null
+++ b/src/terralib/kernel/TeRepresentation.cpp
@@ -0,0 +1,34 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include "TeRepresentation.h"
+
+TeRepresPointerVectorIterator 
+TeFindRepresentation(TeRepresPointerVectorIterator begin, TeRepresPointerVectorIterator end, TeGeomRep rep)
+{
+	return find_if(begin,end,TeRepres_eq(rep));
+}
diff --git a/src/terralib/kernel/TeRepresentation.h b/src/terralib/kernel/TeRepresentation.h
new file mode 100644
index 0000000..31a2916
--- /dev/null
+++ b/src/terralib/kernel/TeRepresentation.h
@@ -0,0 +1,79 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeRepresentation.h
+    This file contains structures and definitions to deal with a geometrical representation
+*/
+#ifndef  __TERRALIB_INTERNAL_REPRESENTATION_H
+#define  __TERRALIB_INTERNAL_REPRESENTATION_H
+
+#include "TeDataTypes.h"
+#include "TeBox.h"
+
+#include <algorithm>
+#include <string>
+
+//!  A class to supporting a geometrical representation 
+struct TeRepresentation
+{
+	int id_;				//!< representation unique dabatase identifier
+	TeGeomRep geomRep_;		//!< representation type (
+	string	tableName_;		//!< name of the table that stores the geometries associated to this representation
+	TeBox	box_;			//!< representation bounding box
+	string	description_;	//!< representation description
+	double	resX_;			//!< the x resolution of the layer cell set geometry
+	double	resY_;			//!< the y resolution of the layer cell set geometry
+	int		nCols_;			//!< number of columns in raster geometry
+	int		nLins_;			//!< number of columns in raster geometry
+
+	//! Constructor
+	TeRepresentation() :
+		resX_(0.0),
+		resY_(0.0),
+		nCols_(0),
+		nLins_(0)
+		{}
+};
+
+//! A functor class to compare representations by its type
+class TeRepres_eq : public unary_function<TeRepresentation*,bool>
+{
+	TeGeomRep r;
+public:
+	explicit TeRepres_eq(TeGeomRep rr): r(rr) {}
+	bool operator()(const TeRepresentation* rep) const { return rep->geomRep_ == r; }
+};
+
+//! An iterator to a vector of TeRepresentation 
+typedef vector<TeRepresentation* >::iterator TeRepresPointerVectorIterator;
+
+//! A vector of pointers to TeRepresentation
+typedef vector<TeRepresentation* > TeRepresPointerVector;
+
+//! Finds the first representation of a given type in a vector of representations
+TeRepresPointerVectorIterator 
+TeFindRepresentation(TeRepresPointerVectorIterator begin, TeRepresPointerVectorIterator end, TeGeomRep rep);
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeSTEFunctionsDB.cpp b/src/terralib/kernel/TeSTEFunctionsDB.cpp
new file mode 100644
index 0000000..c18085d
--- /dev/null
+++ b/src/terralib/kernel/TeSTEFunctionsDB.cpp
@@ -0,0 +1,623 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeSTElementSet.h"
+#include "TeSTInstance.h"
+#include "TeSTEvent.h"
+#include "TeProgress.h"
+#include "TeQuerier.h"
+#include "TeQuerierDB.h"
+#include "TeSTEFunctionsDB.h"
+
+//------------------------------- auxiliary functions
+
+bool insertRow (TeSTInstance* elem, TeTable& table, const string& uniqueValue, vector<int>* indexes=0)
+{
+	vector<string> attrs;
+	table.attributeNames(attrs);
+	
+	string ins = " INSERT INTO "+ table.name() +" (";
+	string values = " VALUES ( ";
+	
+	TePropertyVector prop = elem->getPropertyVector();
+	int count=0;
+
+	for(unsigned int i=0; i<prop.size(); ++i)
+	{
+		if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+			continue;
+		
+		string attrName = prop[i].attr_.rep_.name_;
+				
+		if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+			(attrName != table.uniqueName())      && 
+			(attrName != table.linkName())		  &&
+			(attrName != table.attInitialTime())  &&
+			(attrName != table.attFinalTime())     )
+			
+		{
+			if(count>0)
+			{
+				ins += ",";
+				values += ",";
+			}
+			++count;
+			ins += attrName;
+			if(prop[i].attr_.rep_.type_==TeSTRING)
+				values += "'"+ prop[i].value_ +"'";
+			else if(prop[i].attr_.rep_.type_==TeDATETIME)
+			{
+				TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);  
+				values += elem->theme()->layer()->database()->getSQLTime(time);
+			}
+			else
+				values += prop[i].value_;
+		}
+	}
+
+	// -------- object_id, unique_id and timeInterval
+		
+	if(count>0)
+	{
+		ins +=		" ,";
+		values +=	" ,";
+	}
+
+	ins +=		table.linkName();
+	values +=	"'"+ elem->objectId() +"'";
+
+	if(table.linkName() != table.uniqueName())
+	{
+		ins +=		", "+ table.uniqueName();
+		values +=	", '"+ uniqueValue +"'";
+	}
+
+	if(!table.attInitialTime().empty())
+	{
+		TeTime time (elem->timeInterval().getT1());
+		ins +=		", "+ table.attInitialTime();
+		values +=	", "+ elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+
+	if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+	{
+		TeTime time (elem->timeInterval().getT2());
+		ins +=		", "+ table.attFinalTime();
+		values +=	", "+ elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+	// ----------
+
+	ins += ") "+ values +" )";
+	
+	if(!elem->theme()->layer()->database ()->execute (ins))
+		return false;
+
+	return true;
+}
+
+
+bool insertRow (TeSTEvent* elem, TeTable& table, const string& uniqueValue, vector<int>* indexes=0)
+{
+	vector<string> attrs;
+	table.attributeNames(attrs);
+	
+	string ins = " INSERT INTO "+ table.name() +" (";
+	string values = " VALUES ( ";
+	
+	TePropertyVector prop = elem->getPropertyVector();
+	int count=0;
+
+	for(unsigned int i=0; i<prop.size(); ++i)
+	{
+		if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+			continue;
+		
+		string attrName = prop[i].attr_.rep_.name_;
+				
+		if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+			(attrName != table.uniqueName())      && 
+			(attrName != table.linkName())		  &&
+			(attrName != table.attInitialTime())  &&
+			(attrName != table.attFinalTime())     )
+			
+		{
+			if(count>0)
+			{
+				ins += ",";
+				values += ",";
+			}
+			++count;
+			ins += attrName;
+			if(prop[i].attr_.rep_.type_==TeSTRING)
+				values += "'"+ prop[i].value_ +"'";
+			else if(prop[i].attr_.rep_.type_==TeDATETIME)
+			{
+				TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);  
+				values += elem->theme()->layer()->database()->getSQLTime(time);
+			}
+			else
+				values += prop[i].value_;
+		}
+	}
+
+	// -------- object_id, unique_id and timeInterval
+		
+	if(count>0)
+	{
+		ins +=		" ,";
+		values +=	" ,";
+	}
+
+	ins +=		table.linkName();
+	values +=	"'"+ elem->objectId() +"'";
+
+	if(table.linkName() != table.uniqueName())
+	{
+		ins +=		", "+ table.uniqueName();
+		values +=	", '"+ uniqueValue +"'";
+	}
+
+	if(!table.attInitialTime().empty())
+	{
+		TeTime time (elem->timeInterval().getT1());
+		ins +=		", "+ table.attInitialTime();
+		values +=	", "+ elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+
+	if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+	{
+		TeTime time (elem->timeInterval().getT2());
+		ins +=		", "+ table.attFinalTime();
+		values +=	", "+ elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+	// ----------
+
+	ins += ") "+ values +" )";
+	
+	if(!elem->theme()->layer()->database ()->execute (ins))
+		return false;
+
+	return true;
+}
+
+bool updateRow (TeSTInstance* elem, TeTable table, const string& uniqueId, vector<int>* indexes=0)
+{
+	
+	vector<string> attrs;
+	table.attributeNames(attrs);
+
+	string ins = " UPDATE "+ table.name() +" SET ";
+	
+	TePropertyVector prop = elem->getPropertyVector();
+	int count = 0;
+	for(unsigned int i=0; i<prop.size(); ++i)
+	{
+		if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+			continue;
+
+		string attrName = prop[i].attr_.rep_.name_;
+
+		if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+			(attrName != table.uniqueName())      && 
+			(attrName != table.linkName())		  &&
+			(attrName != table.attInitialTime())  &&
+			(attrName != table.attFinalTime())     )
+		{
+		
+			if(count>0)
+				ins += ",";
+			
+			++count;
+			ins += attrName +" = ";
+		
+			if(prop[i].attr_.rep_.type_==TeSTRING)
+				ins += "'"+ prop[i].value_ +"'";
+			else if(prop[i].attr_.rep_.type_==TeDATETIME)
+			{
+				TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);  
+				ins += elem->theme()->layer()->database()->getSQLTime(time);
+			}
+			else
+				ins += prop[i].value_;
+		}
+	}
+
+	// -------- timeInterval
+	if(!table.attInitialTime().empty())
+	{
+		TeTime time (elem->timeInterval().getT1());
+		ins +=	", "+ table.attInitialTime() +" = ";
+		ins +=	elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+
+	if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+	{
+		TeTime time (elem->timeInterval().getT2());
+		ins +=	", "+ table.attFinalTime() +" = ";
+		ins +=	elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+	// ----------
+
+	ins += " WHERE "+ table.uniqueName() +" = '"+ uniqueId +"'";
+	
+	if(!elem->theme()->layer()->database()->execute (ins))
+		return false;
+
+	return true;
+}
+
+bool updateRow (TeSTEvent* elem, TeTable table, const string& uniqueId, vector<int>* indexes=0)
+{
+	
+	vector<string> attrs;
+	table.attributeNames(attrs);
+
+	string ins = " UPDATE "+ table.name() +" SET ";
+	
+	TePropertyVector prop = elem->getPropertyVector();
+	int count = 0;
+	for(unsigned int i=0; i<prop.size(); ++i)
+	{
+		if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+			continue;
+
+		string attrName = prop[i].attr_.rep_.name_;
+
+		if( (find(attrs.begin(), attrs.end(), attrName)!=attrs.end()) &&
+			(attrName != table.uniqueName())      && 
+			(attrName != table.linkName())		  &&
+			(attrName != table.attInitialTime())  &&
+			(attrName != table.attFinalTime())     )
+		{
+		
+			if(count>0)
+				ins += ",";
+			
+			++count;
+			ins += attrName +" = ";
+		
+			if(prop[i].attr_.rep_.type_==TeSTRING)
+				ins += "'"+ prop[i].value_ +"'";
+			else if(prop[i].attr_.rep_.type_==TeDATETIME)
+			{
+				TeTime time(prop[i].value_, prop[i].attr_.dateChronon_, prop[i].attr_.dateTimeFormat_, prop[i].attr_.dateSeparator_, prop[i].attr_.timeSeparator_);  
+				ins += elem->theme()->layer()->database()->getSQLTime(time);
+			}
+			else
+				ins += prop[i].value_;
+		}
+	}
+
+	// -------- timeInterval
+	if(!table.attInitialTime().empty())
+	{
+		TeTime time (elem->timeInterval().getT1());
+		ins +=	", "+ table.attInitialTime() +" = ";
+		ins +=	elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+
+	if((!table.attFinalTime().empty()) && (table.attInitialTime()!=table.attFinalTime()))
+	{
+		TeTime time (elem->timeInterval().getT2());
+		ins +=	", "+ table.attFinalTime() +" = ";
+		ins +=	elem->theme()->layer()->database()->getSQLTime(time); 
+	}
+	// ----------
+
+	ins += " WHERE "+ table.uniqueName() +" = '"+ uniqueId +"'";
+	
+	if(!elem->theme()->layer()->database()->execute (ins))
+		return false;
+
+	return true;
+}
+
+//------------------------------- 
+
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, bool loadGeometries, bool loadAllAttributes, vector<string> attrNames)
+{
+	if(!stoset->querier())
+		return false;
+
+	if(!stoset->build(loadGeometries, loadAllAttributes, attrNames))
+		return false;
+	return true;
+}  
+
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, TeGroupingAttr& groupAttr, bool loadGeometries)
+{
+	if(!stoset->querier())
+		return false;
+
+	if(!stoset->build(groupAttr, loadGeometries))
+		return false;
+	return true;
+}
+
+bool  
+TeUpdateDBFromSet (TeSTElementSet* elemSet, const string& tableName, vector<int>* indexes)
+{
+	if(!elemSet->theme()->layer())
+		return false;
+
+	TeDatabase* db = elemSet->theme()->layer()->database();
+
+	//progress bar
+	int step = 0;
+	int numSteps = elemSet->numSTInstance();
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(numSteps);
+	
+	try
+	{
+		TeAttrTableVector attrTables;
+		elemSet->theme()->getAttTables(attrTables); 
+		if(attrTables.empty())
+			return false;	
+
+		TeTable table;
+		int	uniqueIndex = -1;
+	
+		//! verify if the table is in the stoset
+		for(unsigned int i=0; i<attrTables.size(); i++)
+		{
+			if(attrTables[i].name()==tableName)
+			{
+				uniqueIndex = i;
+				table = attrTables[i];
+				break;
+			}
+		}
+		
+		if((uniqueIndex==-1) || ((table.tableType()!=TeAttrEvent) && 
+								 (table.tableType()!=TeAttrStatic) && 
+								 (table.tableType()!=TeFixedGeomDynAttr) &&
+								 (table.tableType()!=TeAttrExternal)))
+			return false;
+
+		// get some information about the attribute table required
+		string uniqueIdName = table.uniqueName();
+	
+		TeDatabasePortal* portal = db->getPortal();
+		if(!portal)
+			return false;
+
+		vector<string> uniqueIds;
+		string sql = "SELECT "+ uniqueIdName +" FROM "+ table.name();
+		
+		if(!portal->query (sql))
+		{
+			delete portal;
+			return false;
+		}
+
+		while(portal->fetchRow())
+			uniqueIds.push_back(portal->getData(0));
+		
+		delete portal;
+
+		// Update all the objects 
+		TeSTElementSet::iterator itObj = elemSet->begin();
+		while (itObj != elemSet->end())
+		{
+			//verify if all columns exist in the table 
+			if(itObj == elemSet->begin())
+			{
+				TePropertyVector vec = (*itObj).getPropertyVector();
+				for(unsigned int i=0; i<vec.size(); ++i)
+				{
+					if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+						continue;
+
+					//verify if the table has this column 
+					if (!elemSet->theme()->layer()->database()->columnExist(tableName, vec[i].attr_.rep_.name_ , vec[i].attr_))
+					{
+						if(!elemSet->theme()->layer()->database()->addColumn (tableName, vec[i].attr_.rep_))
+							return false; 
+
+						TeAttributeList attrList = table.attributeList();
+						attrList.push_back (vec[i].attr_);
+						table.setAttributeList (attrList);
+					}
+				}
+			}
+			
+			string uniqueId =  (*itObj).uniqueId(uniqueIndex); 
+			
+			if(find(uniqueIds.begin(), uniqueIds.end(), uniqueId) ==  uniqueIds.end())
+			{	
+				if (!insertRow (&(*itObj), table, uniqueId, indexes))
+					return false;
+
+				uniqueIds.push_back(uniqueId);
+			}
+			else
+			{	
+				if (!updateRow (&(*itObj), table, uniqueId, indexes))
+					return false;
+			}
+					
+			++itObj;
+
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+				{
+					TeProgress::instance()->reset();
+					return false;
+				}
+				else
+					TeProgress::instance()->setProgress(step);
+			}	
+			++step;
+		}
+	}
+	catch(...)
+	{
+		if (TeProgress::instance())
+			TeProgress::instance()->reset();
+		return false;
+	}
+	
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	
+	return true;
+}
+
+
+bool  
+TeUpdateDBFromSet (TeSTEventSet* elemSet, const string& tableName, vector<int>* indexes)
+{
+	if(!elemSet->theme()->layer())
+		return false;
+
+	TeDatabase* db = elemSet->theme()->layer()->database();
+
+	//progress bar
+	int step = 0;
+	int numSteps = elemSet->numSTInstance();
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(numSteps);
+	
+	try
+	{
+		TeAttrTableVector attrTables;
+		elemSet->theme()->getAttTables(attrTables); 
+		if(attrTables.empty())
+			return false;	
+
+		TeTable table;
+		int	uniqueIndex = -1;
+	
+		//! verify if the table is in the stoset
+		for(unsigned int i=0; i<attrTables.size(); i++)
+		{
+			if(attrTables[i].name()==tableName)
+			{
+				uniqueIndex = i;
+				table = attrTables[i];
+				break;
+			}
+		}
+		
+		if((uniqueIndex==-1) || ((table.tableType()!=TeAttrEvent) && 
+								 (table.tableType()!=TeAttrStatic) && 
+								 (table.tableType()!=TeFixedGeomDynAttr) &&
+								 (table.tableType()!=TeAttrExternal)))
+			return false;
+
+		// get some information about the attribute table required
+		string uniqueIdName = table.uniqueName();
+	
+		TeDatabasePortal* portal = db->getPortal();
+		if(!portal)
+			return false;
+
+		vector<string> uniqueIds;
+		string sql = "SELECT "+ uniqueIdName +" FROM "+ table.name();
+		
+		if(!portal->query (sql))
+		{
+			delete portal;
+			return false;
+		}
+
+		while(portal->fetchRow())
+			uniqueIds.push_back(portal->getData(0));
+		
+		delete portal;
+
+		// Update all the objects 
+		TeSTEventSet::iterator itObj = elemSet->begin();
+		while (itObj != elemSet->end())
+		{
+			//verify if all columns exist in the table 
+			if(itObj == elemSet->begin())
+			{
+				TePropertyVector vec = (*itObj).getPropertyVector();
+				for(unsigned int i=0; i<vec.size(); ++i)
+				{
+					if(indexes && (find(indexes->begin(), indexes->end(),(int)i) == indexes->end()))
+						continue;
+
+					//verify if the table has this column 
+					if (!elemSet->theme()->layer()->database()->columnExist(tableName, vec[i].attr_.rep_.name_ , vec[i].attr_))
+					{
+						if(!elemSet->theme()->layer()->database()->addColumn (tableName, vec[i].attr_.rep_))
+							return false;
+
+						TeAttributeList attrList = table.attributeList();
+						attrList.push_back (vec[i].attr_);
+						table.setAttributeList (attrList);
+					}
+				}
+			}
+			
+			string uniqueId =  (*itObj).uniqueId(uniqueIndex); 
+			
+			if(find(uniqueIds.begin(), uniqueIds.end(), uniqueId) ==  uniqueIds.end())
+			{	
+				if (!insertRow (&(*itObj), table, uniqueId, indexes))
+					return false;
+
+				uniqueIds.push_back(uniqueId);
+			}
+			else
+			{	
+				if (!updateRow (&(*itObj), table, uniqueId, indexes))
+					return false;
+			}
+					
+			++itObj;
+
+			if(TeProgress::instance())
+			{
+				if (TeProgress::instance()->wasCancelled())
+				{
+					TeProgress::instance()->reset();
+					return false;
+				}
+				else
+					TeProgress::instance()->setProgress(step);
+			}	
+			++step;
+		}
+	}
+	catch(...)
+	{
+		if (TeProgress::instance())
+			TeProgress::instance()->reset();
+		return false;
+	}
+	
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	
+	return true;
+
+}
+
+
diff --git a/src/terralib/kernel/TeSTEFunctionsDB.h b/src/terralib/kernel/TeSTEFunctionsDB.h
new file mode 100644
index 0000000..2eb3d94
--- /dev/null
+++ b/src/terralib/kernel/TeSTEFunctionsDB.h
@@ -0,0 +1,81 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library p rovided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_STOFUNCTIONS_H
+#define  __TERRALIB_INTERNAL_STOFUNCTIONS_H
+
+#include "TeDatabase.h"
+#include <vector>
+#include <string>
+
+class TeSTElementSet;
+class TeSTEventSet;
+
+//! Builds the spatial object set from database according to the restrictions previously defined
+/*! 
+	\param stoset				the STOSet that will be filled 
+	\param loadGeometries		if the STOSet will be filled with the geometries 
+	\param loadAllAttributes	if the STOSet will be filled with all attributes of the tables of the STOSet 
+	\param attrNames			a subset of the attribute names that will be loaded, if the param loadAllAttributes is false 
+*/
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, bool loadGeometries = false, bool loadAllAttributes = false, vector<string> attrNames = vector<string>());
+
+
+//! Builds the spatial object set from database according to the restrictions previously defined
+/*! 
+	\param stoset				the STOSet that will be filled 
+	\param groupAttr			a map from attribute name to statistic type  
+	\param loadGeometries		if the STOSet will be filled with the geometries 
+*/
+bool
+TeSTOSetBuildDB(TeSTElementSet* stoset, TeGroupingAttr& groupAttr, bool loadGeometries = false);
+
+
+//! Updates the database table from a element set
+bool  
+TeUpdateDBFromSet (TeSTElementSet* elemSet, const string& tableName, vector<int>* indexes = 0);
+
+
+//! Updates the database table from a element set
+bool  
+TeUpdateDBFromSet (TeSTEventSet* elemSet, const string& tableName, vector<int>* indexes = 0);
+
+
+/** \example STObjectSetExample1.cpp
+ *	This is an example of how to create a new Spatial Temporal Object 
+	Set (STObjectSet) filled whit attributes from a layer .
+ */
+
+ /** \example STObjectSetExample2.cpp
+ *	This is an example of how to create a new Spatial Temporal Object 
+	Set (STObjectSet) filled whit geometries and attributes from a theme.
+ */
+
+ /** \example STObjectSetExample3.cpp
+ *	This is an example of how to create a new Spatial Temporal Object 
+	Set (STObjectSet) and to use it in spatial algorithms.
+ */
+
+#endif
+
diff --git a/src/terralib/kernel/TeSTElement.cpp b/src/terralib/kernel/TeSTElement.cpp
new file mode 100644
index 0000000..fed1069
--- /dev/null
+++ b/src/terralib/kernel/TeSTElement.cpp
@@ -0,0 +1,196 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTElement.h"
+#include "TeQuerier.h"
+#include "TeQuerierParams.h"
+
+
+TeSTElement::TeSTElement (const string& objId) 
+{
+	object_id_ = objId;
+	time_ = TeTimeInterval();
+	querier_ = 0;
+}
+
+TeSTElement::TeSTElement(TeTheme* theme, const string& objId)
+{
+	TeQuerierParams params; 
+	params.setParams(theme, objId);
+	
+	object_id_ = objId;
+	time_ = TeTimeInterval();
+	querier_ = new TeQuerier(params);
+}
+		
+TeSTElement::TeSTElement(const TeSTElement& other) 
+{	
+	object_id_		= other.object_id_;
+	time_			= other.time_;
+	instances_		= other.instances_;
+	if(other.querier_)
+		querier_ = new TeQuerier(other.querier_->params());
+	else
+		querier_ = 0;
+}
+
+TeSTElement::~TeSTElement()
+{	
+	if(querier_)
+		delete (querier_);
+}
+			
+TeSTElement&					
+TeSTElement::operator= (const TeSTElement& other)
+{	
+	if ( this != &other )
+	{
+		object_id_		= other.object_id_;
+		time_			= other.time_;
+		instances_		= other.instances_;
+		
+		if(other.querier_)
+			querier_ = new TeQuerier(other.querier_->params());
+		else
+			querier_ = 0;
+	}
+	return *this;
+}
+
+void 
+TeSTElement::querier(TeQuerier* qu) 
+{ 
+	if(querier_)
+		delete (querier_);
+
+	querier_ = qu; 
+}
+
+bool 
+TeSTElement::insertSTInstance (TeSTInstance& object)
+{
+	if(object.objectId() != this->objectId())
+		return false;
+
+	instances_.push_back (object);
+	return true;
+}
+	
+bool	
+TeSTElement::build(bool loadGeometries, bool loadAllAttributes, vector<string> attrNames, int slide)
+{
+	if(!querier_)
+		return false;
+
+	TeQuerierParams* param;
+	if(loadAllAttributes)
+		param = new TeQuerierParams(loadGeometries, loadAllAttributes);
+	else
+		param = new TeQuerierParams(loadGeometries, attrNames);
+
+	param->setParams(querier_->params().theme(), objectId());
+
+	querier_->refresh(*param);
+	delete param;
+
+	return(buildImpl(slide));
+}
+
+bool 
+TeSTElement::build(TeGroupingAttr& groupAttr, bool loadGeometries, int slide)
+{
+	if(!querier_)
+		return false;
+
+	TeQuerierParams param(loadGeometries, groupAttr); 
+	param.setParams(querier_->params().theme(), objectId());
+
+	querier_->refresh(param);
+
+	return(buildImpl(slide));
+}
+
+bool 
+TeSTElement::buildImpl(int slide)
+{
+	int dt = CLOCKS_PER_SEC/4, steps = 0;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+
+	if(!querier_->loadInstances(slide))
+		return false;
+
+	int tot = querier_->numElemInstances();
+	if(TeProgress::instance())
+	{
+		string caption = "Building data";
+		TeProgress::instance()->setCaption(caption.c_str());
+		string msg = "Building in progress. Please, wait!";
+		TeProgress::instance()->setMessage(msg);
+		TeProgress::instance()->setTotalSteps(tot);
+		t2 = clock();
+		t0 = t1 = t2;
+	}
+	
+	TeSTInstance obj;
+	while(querier_->fetchInstance(obj)) 
+	{
+		this->insertSTInstance(obj);
+		obj.clear();
+		if(TeProgress::instance())
+		{
+			steps++;
+			t2 = clock();
+			if (int(t2-t1) > dt)
+			{
+				t1 = t2;
+				if(TeProgress::instance()->wasCancelled())
+					return false;
+				
+				if((int)(t2-t0) > dt2)
+					TeProgress::instance()->setProgress(steps);
+			}
+		}
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	querier_->clear(); //clear instances 
+	return true;
+}
+
+TeSTElement::iterator 
+TeSTElement::begin()     
+{ 
+	return iterator(instances_.begin());
+}
+
+TeSTElement::iterator 
+TeSTElement::end()       
+{
+	return iterator(instances_.end());
+}
+
+
+
diff --git a/src/terralib/kernel/TeSTElement.h b/src/terralib/kernel/TeSTElement.h
new file mode 100644
index 0000000..9ab2ec8
--- /dev/null
+++ b/src/terralib/kernel/TeSTElement.h
@@ -0,0 +1,148 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSTElement.h
+    This file contains structures and definitions to deal with instances
+	in time of a spatial element  
+*/
+
+#ifndef  __TERRALIB_INTERNAL_STELEMENT_H
+#define  __TERRALIB_INTERNAL_STELEMENT_H
+
+#include "TeSTInstance.h"
+#include "TeTimeInterval.h"
+
+class TeQuerier;
+
+#include <string>
+#include <map> 
+#include <vector>
+using namespace std;
+
+//! A spatial element and its instances in the time 
+class TeSTElement
+{
+	protected:
+		string					object_id_;		// object identification
+		TeTimeInterval			time_;			// validity time
+		TeQuerier*				querier_;		// to fill the instance
+
+		vector<TeSTInstance>	instances_;     // instances ordered by time
+
+		typedef vector<TeSTInstance>::iterator  STElementIterator;
+
+		//! internal function to fill this STElement
+		bool buildImpl(int slide=-1);
+
+	public:
+		//! Constructor that does not create a internal querier
+		TeSTElement(const string& objId= ""); 
+
+		//! Constructor that creates a internal querier
+		TeSTElement(TeTheme* theme, const string& objId);
+
+		//! Copy constructor
+		TeSTElement(const TeSTElement& other);  
+
+		//! Destructor
+		~TeSTElement(); 
+		
+		//! Copy operator
+		TeSTElement&	operator= (const TeSTElement& other);
+
+		//! Returns the object identification
+		string objectId () 
+		{	return object_id_;	}
+	
+		//! Sets the object identification
+		void objectId (const string& id) 
+		{	object_id_ = id;	}
+
+		//! Returns the validity interval
+		TeTimeInterval timeInterval () 
+		{	return time_;	}
+	
+		//! Sets the validity interval
+		void timeInterval (const TeTimeInterval& t) 
+		{	time_ = t;	}
+
+		//! Returns the querier
+		TeQuerier* querier() 
+		{ return querier_; }
+
+		//! Inserts a new instance
+		bool insertSTInstance (TeSTInstance& object); 
+
+		//! Sets the Querier
+		void querier(TeQuerier* qu);  
+				
+		//! Loads the instances of this spatial element 
+		bool build(bool loadGeometries=false, bool loadAllAttributes=true, vector<string> attrNames=vector<string>(), int slide=-1);
+
+		//! Loads the instances of this spatial element
+		bool build(TeGroupingAttr& groupAttr, bool loadGeometries=false, int slide=-1);
+
+		//! Returns the number of instances
+		int numSTInstance() { return instances_.size(); }
+
+		//---------------------
+		//! An iterator to a set of instances 
+		/*! 
+			An strucuture that allows the traversal STElement 
+			in a similar way as the STL iterators. 
+		*/
+		class iterator 
+		{
+			public:
+
+				iterator(STElementIterator it) : elemIt_(it) 
+				{}
+
+				//! Prefix move forward operator
+				iterator& operator++()
+				{	++elemIt_; 	return (*this); }
+			
+				TeSTInstance& operator*()
+				{	return (*elemIt_); 	}
+
+				bool operator==(const iterator& rhs) const
+				{ return (this->elemIt_ == rhs.elemIt_ && this->elemIt_== rhs.elemIt_); }
+
+				bool operator!=(const iterator& rhs) const
+				{ return (this->elemIt_ != rhs.elemIt_ && this->elemIt_!= rhs.elemIt_);	}
+
+			protected:
+				STElementIterator		elemIt_;
+		};
+		//---------------
+
+		//! Returns an iterator to the first instance of the element
+		iterator begin();     
+		
+		//! Returns an iterator to the last instance of the element
+		iterator end();       
+};
+
+ 
+#endif 
+
diff --git a/src/terralib/kernel/TeSTElementSet.cpp b/src/terralib/kernel/TeSTElementSet.cpp
new file mode 100644
index 0000000..66b95c5
--- /dev/null
+++ b/src/terralib/kernel/TeSTElementSet.cpp
@@ -0,0 +1,606 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeSTElementSet.h"
+#include "TeQuerier.h" 
+#include "TeQuerierParams.h"
+
+
+TeSTElementSet::TeSTElementSet (const TeSTElementSet& other)
+{
+	totalTime_ = other.totalTime_;
+	elements_ = other.elements_;
+	if(other.querier_)
+		querier_ = new TeQuerier(other.querier_->params());
+	else
+		querier_ = 0;
+}
+
+TeSTElementSet::TeSTElementSet(TeTheme* theme)
+{	
+	TeQuerierParams par; 
+	par.setParams(theme); 
+	querier_ = new TeQuerier(par); 
+}
+
+TeSTElementSet::TeSTElementSet(TeLayer* layer)
+{	
+	TeQuerierParams par; 
+	par.setParams (layer);
+	querier_ = new TeQuerier(par);
+}
+
+TeSTElementSet::TeSTElementSet(TeQuerier* querier)
+{
+	querier_ = querier;
+}
+
+
+TeSTElementSet&
+TeSTElementSet::operator= (const TeSTElementSet& other)
+{
+	if ( this != &other )
+	{
+		totalTime_ = other.totalTime_;
+		elements_ = other.elements_;
+		if(other.querier_)
+			querier_ = new TeQuerier(other.querier_->params());
+		else
+			querier_ = 0;
+	}
+	return *this;
+}
+
+TeSTElementSet::~TeSTElementSet()
+{
+	if(querier_)
+		delete (querier_);
+}
+	
+TeTheme* 
+TeSTElementSet::theme()
+{ 
+	if(querier_)
+		return (querier_->theme());
+	
+	return 0;
+}
+
+bool 
+TeSTElementSet::insertSTInstance (TeSTInstance& object) 
+{
+	if (elements_.find (object.objectId()) == elements_.end())  
+	{
+		//ainda n�o existe
+		TeSTElement stElem(object.objectId());
+		stElem.insertSTInstance (object);
+		elements_[object.objectId()] = stElem;
+	}
+	else
+		elements_[object.objectId()].insertSTInstance(object);
+		
+	return true;
+}
+
+
+bool 
+TeSTElementSet::setGeometry(const string& object_id, const TePolygonSet& geomSet, TeTimeInterval time)
+{
+	STElementSetIterator itSet = elements_.find (object_id);
+	if (itSet == elements_.end()) 
+		return false;
+
+	STElemIterator itGeom = (*itSet).second.begin();
+	while (itGeom != (*itSet).second.end())
+	{
+		if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+			(*itGeom).setGeometry (geomSet);
+		++itGeom;
+	}
+	return true;
+}
+
+bool 
+TeSTElementSet::setGeometry(const string& object_id, const TeLineSet& geomSet, TeTimeInterval time)
+{
+	STElementSetIterator itSet = elements_.find (object_id);
+	if (itSet == elements_.end()) 
+		return false;
+
+	STElemIterator itGeom = (*itSet).second.begin();
+	while (itGeom != (*itSet).second.end())
+	{
+		if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+			(*itGeom).setGeometry (geomSet);
+		++itGeom;
+	}
+	return true;
+}
+
+bool 
+TeSTElementSet::setGeometry(const string& object_id, const TePointSet& geomSet, TeTimeInterval time)
+{
+	STElementSetIterator itSet = elements_.find (object_id);
+	if (itSet == elements_.end()) 
+		return false;
+
+	STElemIterator itGeom = (*itSet).second.begin();
+	while (itGeom != (*itSet).second.end())
+	{
+		if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+			(*itGeom).setGeometry (geomSet);
+		++itGeom;
+	}
+	return true;
+}
+
+bool 
+TeSTElementSet::setGeometry(const string& object_id, const TeCellSet& geomSet, TeTimeInterval time)
+{
+	STElementSetIterator itSet = elements_.find (object_id);
+	if (itSet == elements_.end()) 
+		return false;
+
+	STElemIterator itGeom = (*itSet).second.begin();
+	while (itGeom != (*itSet).second.end())
+	{
+		if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+			(*itGeom).setGeometry (geomSet);
+		++itGeom;
+	}
+	return true;
+}
+
+bool 
+TeSTElementSet::setGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time)
+{
+	STElementSetIterator itSet = elements_.find (object_id);
+	if (itSet == elements_.end()) 
+		return false;
+
+	STElemIterator itGeom = (*itSet).second.begin();
+	while (itGeom != (*itSet).second.end())
+	{
+		if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+			(*itGeom).setGeometry (geomSet);
+		++itGeom;
+	}
+	return true;
+}
+
+bool 
+TeSTElementSet::setGeometry(const string& object_id, const TeMultiGeometry& geomSet, TeTimeInterval time)
+{
+	STElementSetIterator itSet = elements_.find (object_id);
+	if (itSet == elements_.end()) 
+		return false;
+
+	STElemIterator itGeom = (*itSet).second.begin();
+	while (itGeom != (*itSet).second.end())
+	{
+		if ((!time.isValid()) || ((*itGeom).timeInterval() == time))
+			(*itGeom).setGeometry (geomSet);
+		++itGeom;
+	}
+	return true;
+}
+
+bool 
+TeSTElementSet::getGeometry(const string& object_id, TePolygonSet& geomSet, TeTimeInterval time)
+{
+	// Verify if object is in the map
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+	
+	STElemIterator geomIt = (*geomSetIt).second.begin();
+	while (geomIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+			return ((*geomIt).getGeometry (geomSet));
+
+		++geomIt;
+	}
+	return false;  
+}
+
+
+bool 
+TeSTElementSet::getGeometry(const string& object_id, TeLineSet& geomSet, TeTimeInterval time)
+{
+	// Verify if object is in the map
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+	
+	STElemIterator geomIt = (*geomSetIt).second.begin();
+	while (geomIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+			return ((*geomIt).getGeometry (geomSet));
+
+		++geomIt;
+	}
+	return false;  
+}
+
+	
+bool 
+TeSTElementSet::getGeometry(const string& object_id, TePointSet& geomSet, TeTimeInterval time)
+{
+	// Verify if object is in the map
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+	
+	STElemIterator geomIt = (*geomSetIt).second.begin();
+	while (geomIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+			return ((*geomIt).getGeometry (geomSet));
+
+		++geomIt;
+	}
+	return false;  
+}
+
+	
+bool 
+TeSTElementSet::getGeometry(const string& object_id, TeCellSet& geomSet, TeTimeInterval time)
+{
+	// Verify if object is in the map
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+	
+	STElemIterator geomIt = (*geomSetIt).second.begin();
+	while (geomIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+			return ((*geomIt).getGeometry (geomSet));
+
+		++geomIt;
+	}
+	return false;  
+}
+
+
+bool 
+TeSTElementSet::getGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time)
+{
+	// Verify if object is in the map
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+	
+	STElemIterator geomIt = (*geomSetIt).second.begin();
+	while (geomIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+			return ((*geomIt).getGeometry (geomSet));
+
+		++geomIt;
+	}
+	return false;  
+}
+	
+
+bool 
+TeSTElementSet::getGeometry(const string& object_id, TeMultiGeometry& geomSet, TeTimeInterval time)
+{
+	// Verify if object is in the map
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+	
+	STElemIterator geomIt = (*geomSetIt).second.begin();
+	while (geomIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*geomIt).timeInterval() == time))
+			return ((*geomIt).getGeometry (geomSet));
+
+		++geomIt;
+	}
+	return false;  
+}
+
+bool 
+TeSTElementSet::getAttributeValue (const string&  object_id, const string& attr_name, string& val, TeTimeInterval time)
+{
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+
+	STElemIterator stoIt = (*geomSetIt).second.begin();
+	while (stoIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*stoIt).timeInterval() == time))
+			return ((*stoIt).getPropertyValue (attr_name, val));
+		++stoIt;
+	}
+	return false;
+}
+
+bool 
+TeSTElementSet::getAttributeValue (const string& object_id, int attr_index, string& val, TeTimeInterval time)
+{
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+
+	STElemIterator stoIt = (*geomSetIt).second.begin();
+	while (stoIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*stoIt).timeInterval() == time))
+			return ((*stoIt).getPropertyValue (val, attr_index));
+		++stoIt;
+	}
+	return false;
+}
+
+bool 
+TeSTElementSet::getAttributeValue (const string& object_id, int attr_index, double& val, TeTimeInterval time)
+{
+	string vals;
+	if(!getAttributeValue (object_id, attr_index, vals, time))
+		return false;
+
+	val = atof(vals.c_str());
+	return true;
+}
+
+int 
+TeSTElementSet::getAttributeIndex (const string& attrName)
+{
+	STElementSetIterator geomSetIt = elements_.begin();
+	if (geomSetIt == elements_.end()) 
+		return -1;
+
+	STElemIterator stoIt = (*geomSetIt).second.begin();
+	if (stoIt == (*geomSetIt).second.end()) 
+		return -1;
+
+	TePropertyVector vec = (*stoIt).getPropertyVector();
+	for (unsigned int i=0; i<vec.size(); ++i)
+	{
+		if(TeConvertToUpperCase(attrName)==TeConvertToUpperCase(vec[i].attr_.rep_.name_))
+			return i;
+	}
+	return -1;
+}
+
+bool 
+TeSTElementSet::getPropertyVector (const string& object_id, TePropertyVector& propVec, TeTimeInterval time)
+{
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+
+	STElemIterator stoIt = (*geomSetIt).second.begin();
+	while (stoIt != (*geomSetIt).second.end())
+	{
+		if ((!time.isValid()) || ((*stoIt).timeInterval() == time))
+		{
+			propVec = (*stoIt).getPropertyVector();
+			return true;
+		}
+		++stoIt;
+	}
+	return false;
+
+}
+
+bool 
+TeSTElementSet::addProperty (const string& object_id, TeProperty& prop)
+{
+	STElementSetIterator geomSetIt = elements_.find (object_id);
+	if (geomSetIt == elements_.end()) 
+		return false;
+
+	STElemIterator stoIt = (*geomSetIt).second.begin();
+	if (!(*stoIt).setPropertyValue(prop.attr_.rep_.name_, prop.value_))
+		(*stoIt).addProperty(prop);
+
+	return true;
+}
+
+
+bool 
+TeSTElementSet::existMultiTemporalElem(const string& objId)
+{
+	STElementSetIterator geomSetIt = elements_.find (objId);
+	if (geomSetIt != elements_.end()) 
+		return ((elements_[objId].numSTInstance())>1);
+	
+	return false;
+}
+
+
+int 
+TeSTElementSet::numSTInstance(const string& objectId)
+{
+	if (!objectId.empty())
+	{
+		STElementSetIterator geomSetIt = elements_.find (objectId);
+		if (geomSetIt != elements_.end()) 
+			return (elements_[objectId].numSTInstance());
+		return 0;
+	}
+	else
+	{
+		int ntot = 0;
+		STElementSetIterator geomSetIt = elements_.begin();
+		while (geomSetIt != elements_.end())
+		{
+			ntot += geomSetIt->second.numSTInstance();
+			++geomSetIt;
+		}
+		return ntot;
+	}
+}
+
+
+bool 
+TeSTElementSet::build(bool loadGeometries, bool loadAllAttributes, vector<string> attrNames, int slide)
+{
+	if(!querier_)
+		return false;
+
+	TeQuerierParams param = querier_->params();
+	param.setFillParams(loadGeometries, loadAllAttributes, attrNames);
+
+	querier_->refresh(param);
+
+	return(buildImpl(slide));
+}
+
+bool 
+TeSTElementSet::build(TeGroupingAttr& groupAttr, bool loadGeometries, int slide)
+{
+	if(!querier_)
+		return false;
+
+	TeQuerierParams param = querier_->params();
+	param.setFillParams(loadGeometries, groupAttr);
+
+	querier_->refresh(param);
+
+	return(buildImpl(slide));
+}
+
+bool 
+TeSTElementSet::buildImpl(int slide)
+{
+	int dt = CLOCKS_PER_SEC/4, steps = 0;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+
+	if(!querier_)
+		return false;
+
+	if(!querier_->loadInstances(slide))
+		return false;
+
+	int tot = querier_->numElemInstances();
+	if(TeProgress::instance())
+	{
+		string caption = "Building data";
+		TeProgress::instance()->setCaption(caption.c_str());
+		string msg = "Building in progress. Please, wait!";
+		TeProgress::instance()->setMessage(msg);
+		TeProgress::instance()->setTotalSteps(tot);
+		t2 = clock();
+		t0 = t1 = t2;
+	}
+	
+	TeSTInstance obj;
+	while(querier_->fetchInstance(obj)) 
+	{
+		this->insertSTInstance(obj);
+		obj.clear();
+		if(TeProgress::instance())
+		{
+			steps++;
+			t2 = clock();
+			if (int(t2-t1) > dt)
+			{
+				t1 = t2;
+				if(TeProgress::instance()->wasCancelled())
+					return false;
+				
+				if((int)(t2-t0) > dt2)
+					TeProgress::instance()->setProgress(steps);
+			}
+		}
+	}
+	if(TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	querier_->clear(); //clear instances 
+	return true;
+}
+
+
+TeSTElementSet::iterator& 
+TeSTElementSet::iterator::operator++()
+{
+	if (++curSTO_ == (*curObj_).second.end())
+	{
+		if (++curObj_ !=  stoSet_->elements().end())
+		{
+			curSTO_ = (*curObj_).second.begin();
+		}
+	}
+	return *this;
+}
+
+double 
+TeSTElementSet::propertyIterator::operator*() 
+{
+	string val;
+	STElemIterator itCur = getCurSTO();
+	if ((*itCur).getPropertyValue (attrName_, val))
+		return (atof(val.c_str()));
+	else
+		return 0.0;
+}
+
+bool 
+TeSTElementSet::propertyIterator::getProperty(TeProperty& prop) 
+{
+	STElemIterator itCur = getCurSTO();
+	if ((*itCur).getProperty (prop, attrName_))
+		return true;
+	else
+		return false;
+}
+
+TeSTElementSet::iterator 
+TeSTElementSet::begin()     
+{ 
+	return iterator(this, elements_.begin(), (*(elements_.begin())).second.begin());
+}
+
+TeSTElementSet::propertyIterator 
+TeSTElementSet::begin(const string& attrName)     
+{ 
+	return propertyIterator(this, elements_.begin(), (*(elements_.begin())).second.begin(),attrName);
+}
+
+TeSTElementSet::iterator 
+TeSTElementSet::end()       
+{
+	if(elements_.size()<1)
+		return iterator(this, elements_.end(), (*(elements_.end())).second.end());
+	
+	return iterator(this, elements_.end(), (*(--elements_.end())).second.end());
+}
+
+TeSTElementSet::propertyIterator 
+TeSTElementSet::end(const string& attrName)       
+{
+	if(elements_.size()<1)
+		return propertyIterator(this, elements_.end(), (*(elements_.end())).second.end(), attrName);
+	
+	return propertyIterator(this, elements_.end(), (*(--elements_.end())).second.end(), attrName);
+}
diff --git a/src/terralib/kernel/TeSTElementSet.h b/src/terralib/kernel/TeSTElementSet.h
new file mode 100644
index 0000000..795377d
--- /dev/null
+++ b/src/terralib/kernel/TeSTElementSet.h
@@ -0,0 +1,254 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_STOBJECTSET_H
+#define  __TERRALIB_INTERNAL_STOBJECTSET_H
+
+#include "TeSTElement.h"
+
+class TeQuerier; 
+
+//! A TeSTElementSet is a set of spatial temporal elements
+/*
+	A spatial temporal set of elements or objects is obtained from a theme. 
+*/
+class TeSTElementSet  
+{
+
+protected:
+
+	//! valid time interval of all ST elements in the set
+	TeTimeInterval			totalTime_;		
+	
+	//! querier used to fill this structure
+	TeQuerier*				querier_;       
+	
+	//! map of object identification to its instances in time
+	map<string, TeSTElement >	elements_;	
+	
+	typedef map<string, TeSTElement >::iterator  STElementSetIterator;
+	typedef TeSTElement::iterator				 STElemIterator;	
+
+	//! Internal function to build the STElement set
+	bool buildImpl(int slide=-1);
+
+public:
+
+	
+	//! Default constructor
+	TeSTElementSet()
+	{	querier_ = 0; }
+
+	//! Constructor
+	TeSTElementSet(TeTheme* theme); 
+	
+	//! Constructor
+	TeSTElementSet(TeLayer* layer); 
+
+	//! Constructor
+	TeSTElementSet(TeQuerier* querier); 
+	
+	//! Copy constructor
+	TeSTElementSet (const TeSTElementSet& other); 
+
+	//! Destructor 
+	~TeSTElementSet();  
+	
+	//! Assignment operator 
+	TeSTElementSet& operator= (const TeSTElementSet& other);
+
+	//! Operator ==
+	bool operator== (const TeSTElementSet& other) const
+	{ return ((totalTime_==other.totalTime_)); } 
+		
+	//! Returns the time inteval associated with the STOSet
+	TeTimeInterval totalTime() { return totalTime_;} 
+
+	//! Sets the time inteval associated with the STOSet
+	void totalTime(TeTimeInterval t) { totalTime_ = t;}
+
+	//! Returns the querier
+	TeQuerier* querier() { return querier_; }
+
+	// Returns the theme
+	TeTheme* theme();  
+
+	//! Returns a reference to the map of elements
+	map<string, TeSTElement >& elements() { return elements_; }
+
+	//! Return if the element (objId) exists in the STElemSet 
+	bool hasElement(const string& objId) { return (elements_.find (objId) != elements_.end()); }
+	
+	//! Insert an ST element instance 
+	bool insertSTInstance (TeSTInstance& object);  
+
+	//! Sets the geometries of a STObjetct
+	bool setGeometry(const string& object_id, const TePolygonSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool setGeometry(const string& object_id, const TeLineSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool setGeometry(const string& object_id, const TePointSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool setGeometry(const string& object_id, const TeCellSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool setGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool setGeometry(const string& object_id, const TeMultiGeometry& geomSet, TeTimeInterval time = TeTimeInterval());
+
+	//! Gets the geometries of an object with a time stamp
+	bool getGeometry(const string& object_id, TePolygonSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool getGeometry(const string& object_id, TeLineSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool getGeometry(const string& object_id, TePointSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool getGeometry(const string& object_id, TeCellSet& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool getGeometry(const string& object_id, vector<TeGeometry*>& geomSet, TeTimeInterval time = TeTimeInterval());
+	bool getGeometry(const string& object_id, TeMultiGeometry& geomSet, TeTimeInterval time = TeTimeInterval());
+
+ 
+	//! Gets the value of an attribute (as string) of a object with a time stamp
+	bool getAttributeValue (const string&  object_id, const string& attr_name, 
+		                    string& val, TeTimeInterval time = TeTimeInterval()); 
+	
+
+	//! Gets the value of the i-th attribute (as string) of a object with a time stamp
+	bool getAttributeValue (const string& object_id, int attr_index, string& val,
+							TeTimeInterval time = TeTimeInterval()); 
+
+	//! Gets the value of the i-th attribute (as double) of a object with a time stamp
+	bool getAttributeValue (const string& object_id, int attr_index, double& val,
+							TeTimeInterval time = TeTimeInterval()); 
+
+	//! Returns the index of an attribute
+	int getAttributeIndex(const string& attrName);
+
+	//! Gets a vector of attributes or properties of a object with a time stamp
+	bool getPropertyVector (const string& object_id, TePropertyVector& propVec,
+							TeTimeInterval time = TeTimeInterval()); 
+
+	//! Sets the value of the property or adds if there is no such property in the object
+	bool addProperty(const string& object_id, TeProperty& prop);
+
+	//! Returns true if exists in the set, an object with more than one instance
+	bool existMultiTemporalElem(const string& objId);
+
+	//! Adds the instances of a element
+	void insertSTElement(TeSTElement& stElem)
+	{ elements_[stElem.objectId()] = stElem;	}
+	
+	//! Retuns the number of elements in the set
+	int numElements() const  { return elements_.size();}
+
+	//! Returns the number of instances of an object
+	int numSTInstance(const string& objectId = ""); 
+
+	//! Fills the STElement set
+	bool build(bool loadGeometries=false, bool loadAllAttributes=true, vector<string> attrNames=vector<string>(), int slide=-1); 
+
+	//! Fills the STElement set
+	bool build(TeGroupingAttr& groupAttr, bool loadGeometries=false, int slide=-1); 
+
+	//! Clears the set 
+	void clear() { elements_.clear(); }
+		
+	//---------------------
+	//! An iterator to a set of spatial temportal elements
+	/*! 
+		An strucuture that allows the traversal STElement set 
+		(ST elements) in a similar way as the STL iterators. 
+	*/
+	class iterator 
+	{
+		public:
+
+			iterator(TeSTElementSet* stoSet, STElementSetIterator stoSetP, STElemIterator stoVecP) : 
+				curObj_(stoSetP),
+				curSTO_(stoVecP),
+				stoSet_(stoSet) 
+		{}
+
+		//! Prefix move forward operator
+		iterator& operator++(); 
+		
+		TeSTInstance& operator*()
+		{	return (*curSTO_); 	}
+
+		STElemIterator getCurSTO()
+		{	return curSTO_; 	}
+
+		TeSTElementSet* elemSet()
+		{	return stoSet_; 	}
+
+		bool operator==(const iterator& rhs) const
+		{ return (this->curSTO_ == rhs.curSTO_ && this->curObj_== rhs.curObj_); }
+
+		bool operator!=(const iterator& rhs) const
+		{ return (this->curSTO_ != rhs.curSTO_ && this->curObj_!= rhs.curObj_);	}
+
+		protected:
+			STElementSetIterator	curObj_;
+			STElemIterator			curSTO_;
+			TeSTElementSet*			stoSet_;
+	};
+	//---------------
+	
+	//---------------------
+	//! An iterator to a given numeric property in a set of spatial temportal obejcts 
+	/*! 
+		An strucuture that allows the traversal STO set 
+		(ST objects) in a similar way as the STL iterators. 
+	*/
+	class propertyIterator : public iterator
+	{
+		public:
+
+			propertyIterator (TeSTElementSet* stoSet, 
+				STElementSetIterator stoSetP, 
+				STElemIterator stoVecP, 
+				string attrName):
+				iterator(stoSet, stoSetP, stoVecP),
+				attrName_ (attrName)
+				{}
+		
+
+			double operator*();  //if too slow, get property index. The problem is 
+				// that nothing garantees it is going to be the same for all objects.
+		
+			bool getProperty(TeProperty& prop); 
+				// same implemented for raster: to be used when attribute is categorical
+		protected:
+			string	attrName_;
+
+	};
+	//---------------
+
+	//! Returns an iterator to the first element of the set
+	iterator begin();     
+	
+	//! Returns an iterator to the first element of the set
+	propertyIterator begin(const string& attrName);     
+	
+	//! Returns an iterator to the one past last element of the set
+	iterator end();       
+	
+	//! Returns an iterator to the one past last element of the set
+	propertyIterator end(const string& attrName);       
+	
+	//---------------
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeSTEvent.cpp b/src/terralib/kernel/TeSTEvent.cpp
new file mode 100644
index 0000000..6cfddee
--- /dev/null
+++ b/src/terralib/kernel/TeSTEvent.cpp
@@ -0,0 +1,270 @@
+
+#include "TeSTEvent.h"
+#include "TeTheme.h"
+#include "TeTimeInterval.h"
+	
+
+TeSTEvent::TeSTEvent(const string& objId, const TePoint& point, const long& time):
+		object_id_(objId),
+		point_(point),
+		time_(time)
+{
+	unique_id_.push_back (objId);
+}
+
+TeSTEvent::TeSTEvent(const string& objId, const TePoint& point, const vector<double>& attrValue, 
+					 const vector<TeAttributeRep>& attrRep, const long& time):
+		object_id_(objId),
+		point_(point),
+		time_(time),
+		attrValue_(attrValue),
+		attrRep_(attrRep)
+{
+	unique_id_.push_back (objId);
+}
+
+TeSTEvent::TeSTEvent(const TeSTEvent& other) 
+{	
+	unique_id_		= other.unique_id_;
+	object_id_		= other.object_id_;
+	time_			= other.time_;
+	point_			= other.point_;  
+	attrValue_		= other.attrValue_;
+	attrRep_		= other.attrRep_;
+	theme_			= other.theme_;
+	attrOut_		= other.attrOut_;
+}
+			
+TeSTEvent&					
+TeSTEvent::operator= (const TeSTEvent& other)
+{	
+	if ( this != &other )
+	{
+		unique_id_		= other.unique_id_;
+		object_id_		= other.object_id_;
+		time_			= other.time_;
+		point_			= other.point_;  
+		attrValue_		= other.attrValue_;
+		attrRep_		= other.attrRep_;
+		theme_			= other.theme_;
+		attrOut_		= other.attrOut_;
+	}
+	return *this;
+}
+	
+	
+bool 
+TeSTEvent::operator== (const TeSTEvent& other) const
+{	
+	if (this->object_id_ != other.object_id_ || 
+		!(this->time_ == other.time_) ||
+		(this->point_.location().x() != other.point_.location().x()) ||
+		(this->point_.location().y() != other.point_.location().y()))
+		return false;
+
+	return true; 
+}
+
+
+TeTheme* 
+TeSTEvent::theme()
+{	
+	return theme_; 
+}
+
+void 
+TeSTEvent::theme(TeTheme* t)
+{
+	theme_ = t;
+}
+
+TeTimeInterval 
+TeSTEvent::timeInterval() 
+{
+	TeTimeInterval t;
+	return t;
+}
+
+int 
+TeSTEvent::getPropertyIndex(const string& name)
+{
+	vector<TeAttributeRep>::iterator itRep = attrRep_.begin();
+	int index=-1;
+	while (itRep!=attrRep_.end())
+	{
+		++index;
+		if(itRep->name_==name)
+			return index;
+	}
+	return index;
+}
+
+
+void 
+TeSTEvent::setPropertyValue(const int& indexAttr, const double& value)
+{
+	if(attrValue_.empty())
+		return; 
+
+	if(indexAttr >(int)(attrValue_.size()-1))
+		return;
+
+	attrValue_[indexAttr] = value;
+}
+
+void 
+TeSTEvent::addProperty(const TeProperty& prop, bool attrIn) 
+{
+	attrValue_.push_back(atof(prop.value_.c_str()));
+	attrRep_.push_back(prop.attr_.rep_);
+	if(!attrIn)
+		attrOut_.push_back((attrValue_.size()-1));
+}
+
+void 
+TeSTEvent::addProperty(const double& val, TeAttributeRep rep, bool attrIn)
+{
+	attrValue_.push_back(val);
+	attrRep_.push_back(rep);
+	if(!attrIn)
+		attrOut_.push_back((attrValue_.size()-1));
+}
+
+TePropertyVector 
+TeSTEvent::getOutPropertyVector()
+{
+	TePropertyVector vec;
+	for(unsigned int i=0; i<attrOut_.size(); ++i)
+	{
+		TeProperty prop;
+		prop.attr_.rep_ = attrRep_[attrOut_[i]];
+		prop.value_ = Te2String(attrValue_[attrOut_[i]]);
+		vec.push_back (prop);
+	}
+	return vec;
+}
+
+TePropertyVector 
+TeSTEvent::getPropertyVector()
+{
+	TePropertyVector vec;
+	for(unsigned int i=0; i<attrValue_.size(); ++i)
+	{
+		TeProperty prop;
+		prop.attr_.rep_ = attrRep_[i];
+		prop.value_ = Te2String(attrValue_[i]);
+		vec.push_back (prop);
+	}
+	return vec;
+}
+
+bool 
+TeSTEvent::getPropertyValue (string& val, int i)
+{
+	if ((i>=0) && (i<(int)attrValue_.size()))
+	{
+		val = Te2String(attrValue_[i]);
+		return true;
+	}
+	else
+		return false;
+}
+
+//------------------------------------------ TeSTEventSet
+
+TeTheme* 
+TeSTEventSet::theme()
+{	
+	return theme_; 
+}
+
+void 
+TeSTEventSet::theme(TeTheme* t)
+{
+	theme_ = t;
+}
+
+unsigned int 
+TeSTEventSet::size()
+{ 
+	return eventSet_.size(); 
+}
+
+bool
+TeSTEventSet::getAttributeValue (const string& object_id, const string& attr_name, string& val, TeTimeInterval /* time */)
+{
+	int index = getAttributeIndex(attr_name);
+	if(index<0)
+		return false;
+	
+	double vald = 0.;
+	bool status =  getAttributeValue (object_id,  index, vald);
+	val = Te2String(vald);
+	return status;
+}
+	
+bool 
+TeSTEventSet::getAttributeValue (const string& object_id, int attr_index, string& val, TeTimeInterval /* time */)
+{
+	double vald = 0.;
+	bool status =  getAttributeValue (object_id,  attr_index, vald);
+	val = Te2String(vald);
+	return status;
+}
+
+
+bool 
+TeSTEventSet::getAttributeValue (const string& object_id, int attr_index, double& val,	long /* time */)
+{
+	
+	STElemIterator it = eventSet_.find(object_id);
+	if(it==eventSet_.end())
+		return false;
+
+	val = (it->second).getPropertyValue(attr_index);
+	return true;
+}
+
+int 
+TeSTEventSet::getAttributeIndex(const string& attrName)
+{
+	STElemIterator it = eventSet_.begin();
+	return(it->second.getPropertyIndex(attrName));
+}
+		
+TeSTEventSet::iterator& 
+TeSTEventSet::iterator::operator++()
+{
+	if(curElem_!=elemSet_->eventSet_.end())
+		++curElem_;
+	return (*this);
+}
+
+
+TeSTEventSet::iterator 
+TeSTEventSet::begin()     
+{ 
+	return iterator(this, eventSet_.begin());
+}
+
+
+TeSTEventSet::iterator 
+TeSTEventSet::end()       
+{
+	return iterator(this, eventSet_.end());
+}
+
+
+void 
+TeSTEventSet::insertSTInstance(TeSTEvent& ev)
+{ 
+	string obj = ev.objectId();
+	eventSet_[obj] = ev; 
+}
+
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeSTEvent.h b/src/terralib/kernel/TeSTEvent.h
new file mode 100644
index 0000000..e3a93d2
--- /dev/null
+++ b/src/terralib/kernel/TeSTEvent.h
@@ -0,0 +1,298 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSTEvent.h
+	This file contains structures and definitions to deal with spatial temporal events. 
+	An spatial temporal event is represented by a point, a time and a set of attributes. 
+*/
+
+#ifndef  __TERRALIB_INTERNAL_STEVENT_H
+#define  __TERRALIB_INTERNAL_STEVENT_H
+
+#include "TeGeometry.h"
+#include "TeAttribute.h" 
+#include "TeTimeInterval.h"
+
+class TeTheme;
+
+//! A class to represent spatial temporal events
+class TeSTEvent
+{
+protected:
+	vector<string>	unique_id_;		// instance identification for each attribute table
+	string			object_id_;		// event identification
+	TePoint			point_;			// point where the event happened  
+	long			time_;			// time when the event happened   
+
+	vector<double>			attrValue_;		// attribute values 
+	vector<TeAttributeRep>	attrRep_;		// attribute representations (name, type, size) 
+	vector<int>				attrOut_;		// indexes of the attributes that were generated
+
+	TeTheme*		theme_;			// theme associated to this event
+		
+public:
+	
+	//! Empty constructor
+	TeSTEvent()
+	{ }
+
+	//! Constructor
+	TeSTEvent(const string& objId, const TePoint& point, const long& time);  
+
+	//! Constructor
+	TeSTEvent(const string& objId, const TePoint& point, const vector<double>& attrValue, 
+		const vector<TeAttributeRep>& attrRep, const long& time);
+	
+	//! Copy constructor
+	TeSTEvent(const TeSTEvent& other); 
+						
+	//! Assignment operator
+	TeSTEvent& operator= (const TeSTEvent& other);
+		
+	//! Operator ==
+	bool operator== (const TeSTEvent& other) const;
+	
+	//! Destructor
+	~TeSTEvent() {} 
+
+	//! Returns the event identification
+	string objectId (void)
+	{ return object_id_; }
+
+	//! Sets the event identification
+	void objectId (const string& objId)
+	{ object_id_ = objId; }
+
+	//! Returns the instance identification
+	vector<string>& uniqueId () 
+	{	return unique_id_;	}
+
+	//! Returns the instance identification
+	string uniqueId (int index_) 
+	{	return unique_id_[index_];	}
+	
+	//! Sets the instance identifications
+	void uniqueId (const vector<string>& ids) 
+	{	unique_id_ = ids;	}
+	
+	//! Get point geometry
+	void getGeometry(TePoint& result)
+	{	result = point_; }
+
+	//! Set point geometry 
+	void setGeometry(const TePoint& result)
+	{	point_ = result; }
+
+	//! Get time
+	long eventTime()
+	{	return time_; }
+
+	//! Set time
+	void eventTime(const long& t)
+	{ time_ = t; }
+
+	//! Get the time as a structure TeTimeInterval
+	TeTimeInterval timeInterval(); 
+	
+	//! Get theme pointer
+	TeTheme* theme();
+
+	//! Set theme pointer
+	void theme(TeTheme* t);
+
+	//! Get attribute values
+	vector<double>& attrValues()
+	{ return attrValue_; }
+
+	//! Set attribute values
+	void attrValues (const vector<double>& attrVal)
+	{ attrValue_ = attrVal; }
+
+	//! Get attribute representations (name, type, size)
+	vector<TeAttributeRep>& getAttributeRep()
+	{ return attrRep_; }
+
+	//! Get the attribute representation of the index-th attribute
+	TeAttributeRep getAttributeRep(const int& index)
+	{ return  attrRep_[index]; }
+
+	//! Set attribute representations (name, type, size)
+	void setAttributeRep (const vector<TeAttributeRep>& attrRep)
+	{ attrRep_ = attrRep; }
+
+	//! Get attribute indexes that were generated
+	vector<int>& attrOutIndexes()
+	{ return attrOut_; }
+
+	//! Set attribute indexes that were generated
+	void attrOutIndexes (const vector<int>& indexes)
+	{ attrOut_ = indexes; }
+
+	//! Get the attribute or property value of the index-th attribute
+	double getPropertyValue(const int& index)
+	{ return  attrValue_[index]; }
+
+	//! Gets the attribute value (as a string) of the i-th property
+	bool getPropertyValue (string& val, int i= 0);	
+
+	//! Set the attribute value of the indexAttr-th attribute
+	void setPropertyValue(const int& indexAttr, const double& value);
+	
+	//! Get the attribute name of the index-th attribute
+	string getPropertyName(const int& index)
+	{ return  attrRep_[index].name_; }
+
+	//! Get the property index of attribute called "name"
+	int getPropertyIndex(const string& name); 
+	
+	//! Operator [], get attribute value 
+	double operator[] (const int& index)
+	{ return  attrValue_[index]; 	}
+
+	//! Add a property that contain the attribute representation and the attribute value
+	void addProperty(const TeProperty& prop, bool attrIn = true); 
+
+	//! Add a property from a attribute representation and a attribute value
+	void addProperty(const double& val, TeAttributeRep rep = TeAttributeRep(), bool attrIn = true);
+
+	//! Return the attributes (representation and value) that were generated as a vector of properties
+	TePropertyVector getOutPropertyVector(); 
+
+	//! Return all attributes (representation and value) as a vector of properties
+	TePropertyVector getPropertyVector(); 
+};
+
+//! A class that represents a set of spatial temporal events
+class TeSTEventSet
+{
+protected:
+	map<string, TeSTEvent>		eventSet_;  // a map from event identification to event
+	TeChronon					chronon_;	// chronon 
+	TeTheme*					theme_;		// theme associated to this event set
+	TeBox						box_;		
+	
+	typedef map<string, TeSTEvent>::iterator	STElemIterator;
+	
+public:
+
+	//! Constructor	
+	TeSTEventSet(TeTheme* theme=0): 
+	  theme_(theme)
+	{ }
+
+	//! Get theme pointer
+	TeTheme* theme(); 
+
+	//! Set theme pointer
+	void theme(TeTheme* t);
+
+	//! Return the number of events
+	unsigned int size();
+
+	//! Set the chronon
+	void chronon(const TeChronon& chr) { chronon_ = chr; } 
+
+	//! Set the box
+	void box(const TeBox& b) { box_ = b; } 
+	
+	//! Gets the value of an attribute (as string) called "attr_name"
+	bool getAttributeValue (const string&  object_id, const string& attr_name, 
+		                    string& val, TeTimeInterval time = TeTimeInterval()); 
+		
+	//! Gets the value of the attr_index-th attribute (as string) 
+	bool getAttributeValue (const string& object_id, int attr_index, string& val,
+							TeTimeInterval time = TeTimeInterval());
+	
+	//! Gets the value of the attr_index-th attribute (as double) 
+	bool getAttributeValue (const string& object_id, int attr_index, double& val, long time = -1);
+
+	//! Get the attribute index of attribute called "attrName"
+	int getAttributeIndex(const string& attrName);
+
+	//! Retuns the number of spatial temporal instances in the set
+	int numSTInstance()
+	{ return eventSet_.size(); }
+
+	//! Retuns the number of elements in the set
+	int numElements() 
+	{ return eventSet_.size(); }
+	
+	//! An iterator to a set of spatial temportal events
+	/*! 
+		An strucuture that allows the traversal STEvent set 
+		(ST elements) in a similar way as the STL iterators. 
+	*/
+	class iterator 
+	{
+		public:
+
+		//! Constructor
+		iterator(TeSTEventSet* elemSet, STElemIterator curElem) :
+			curElem_(curElem),
+			elemSet_(elemSet)			
+			{ }
+
+		//! Prefix move forward operator
+		iterator& operator++();
+				
+		//! Operator that return the pointed event
+		TeSTEvent& operator*()
+		{	return (curElem_->second); 	}
+
+		//! Return a pointer to the event set
+		TeSTEventSet* elemSet()
+		{	return elemSet_; 	}
+
+		//! Equal operator
+		bool operator==(const iterator& rhs) const
+		{ return (this->curElem_== rhs.curElem_); }
+
+		//! Unequal operator
+		bool operator!=(const iterator& rhs) const
+		{ return (this->curElem_!= rhs.curElem_);	}
+
+		protected:
+			STElemIterator			curElem_;
+			TeSTEventSet*			elemSet_;
+	};
+	
+	friend class TeSTEventSet::iterator;
+
+	//! Returns an iterator to the first element of the set
+	iterator begin();     
+	
+	//! Returns an iterator to the one past last element of the set
+	iterator end();       
+
+	//! Insert a new event in the set
+	void insertSTInstance(TeSTEvent& ev); 
+};
+
+#endif
+
+
+
+
+
+
+
diff --git a/src/terralib/kernel/TeSTInstance.cpp b/src/terralib/kernel/TeSTInstance.cpp
new file mode 100644
index 0000000..ec7eb9b
--- /dev/null
+++ b/src/terralib/kernel/TeSTInstance.cpp
@@ -0,0 +1,490 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeSTInstance.h"
+
+TeSTInstance::TeSTInstance (const string& object_id, TeProperty& prop ) 
+{
+	object_id_ = object_id;
+	time_ = TeTimeInterval();
+	properties_.push_back(prop);
+	slice_ = 0;
+	theme_= 0;
+}
+		
+
+TeSTInstance::TeSTInstance(const TeSTInstance& other) 
+{	
+	object_id_		= other.object_id_;
+	time_			= other.time_;
+	properties_     = other.properties_;
+	slice_			= other.slice_;
+	theme_			= other.theme_;
+	unique_id_		= other.unique_id_;
+	geometries_		= other.geometries_;  
+}
+			
+TeSTInstance&					
+TeSTInstance::operator= (const TeSTInstance& other)
+{	
+	if ( this != &other )
+	{
+		object_id_		= other.object_id_;
+		time_			= other.time_;
+		properties_     = other.properties_;
+		slice_			= other.slice_;
+		theme_			= other.theme_;
+		unique_id_		= other.unique_id_;
+		geometries_		= other.geometries_; 
+	}
+	return *this;
+}
+	
+	
+bool 
+TeSTInstance::operator== (const TeSTInstance& other) const
+{	
+	if (this->object_id_ != other.object_id_ || 
+		!(this->time_ == other.time_) )
+		return false;
+
+	return true; 
+}
+
+	
+bool 
+TeSTInstance::getProperty (TeProperty& prop, unsigned int i)	
+{ 
+	if (i < properties_.size())
+	{
+		prop = properties_[i];
+		return true;
+	}
+	else
+		return false;
+}
+
+bool 
+TeSTInstance::getProperty (TeProperty& prop, string name)	
+{ 
+	string newName; 
+	size_t pos = name.find(".", string::npos,1);
+	if (pos != string::npos)
+		newName = name.substr(pos+1);
+		
+	TePropertyVector::iterator it = properties_.begin();
+	while(it!=properties_.end())
+	{
+		if( ((*it).attr_.rep_.name_ == name) ||
+			((*it).attr_.rep_.name_ == newName))
+		{ 
+			prop = (*it);
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
+
+
+bool 
+TeSTInstance::getPropertyValue (string& val, int i)	
+{ 
+	if ((i >=0) && (i< (int)properties_.size()))
+	{
+		val = properties_[i].value_;
+		return true;
+	}
+	else
+		return false;
+}
+
+	
+bool 
+TeSTInstance::getPropertyValue (const string& name, string& val)	
+{ 
+	string newName; 
+	size_t pos = name.find(".", string::npos,1);
+	if (pos != string::npos)
+		newName = name.substr(pos+1);
+
+	TePropertyVector::iterator it = properties_.begin();
+	while(it!=properties_.end())
+	{
+		if(	((*it).attr_.rep_.name_ == name) ||
+			((*it).attr_.rep_.name_ == newName)) 
+		{
+			val = (*it).value_; 
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
+
+bool 
+TeSTInstance::getGeometry(TePolygonSet& result)
+{
+	if(geometries_.getGeometry(result))
+		return true;
+
+	if((theme_)  && (theme_->layer()->loadGeometrySet(object_id_, result)))
+		return true;
+			
+	return false;
+}
+	
+bool 
+TeSTInstance::getGeometry(TeLineSet& result)
+{
+	if(geometries_.getGeometry(result))
+		return true;
+
+	if((theme_)  && (theme_->layer()->loadGeometrySet(object_id_, result)))
+		return true;
+			
+	return false;
+}
+
+bool 
+TeSTInstance::getGeometry(TePointSet& result)
+{
+	if(geometries_.getGeometry(result))
+		return true;
+
+	if((theme_)  && (theme_->layer()->loadGeometrySet(object_id_, result)))
+		return true;
+			
+	return false;
+}
+
+bool 
+TeSTInstance::getGeometry(TeCellSet& result)
+{
+	if(geometries_.getGeometry(result))
+		return true;
+
+	if((theme_)  && (theme_->layer()->loadGeometrySet(object_id_, result)))
+		return true;
+			
+	return false;
+}
+
+bool 
+TeSTInstance::getGeometry(vector<TeGeometry*>& result)
+{
+	if(geometries_.getGeometry(result))
+		return true;
+
+	if(theme_)
+	{
+		if(theme_->layer()->hasGeometry (TePOLYGONS))
+		{
+			TePolygonSet pols; 
+			if(!theme_->layer()->loadGeometrySet(object_id_, pols))
+				return false;
+			
+			for(int i=0; i<(int)pols.size(); ++i)
+			{
+				TePolygon* pol = new TePolygon;
+				result.push_back (pol);
+			}
+		}
+		if(theme_->layer()->hasGeometry (TeLINES))
+		{
+			TeLineSet lins; 
+			if(!theme_->layer()->loadGeometrySet(object_id_, lins))
+				return false;
+			
+			for(int i=0; i<(int)lins.size(); ++i)
+			{
+				TeLine2D* line = new TeLine2D;
+				result.push_back (line);
+			}
+		}
+		if(theme_->layer()->hasGeometry (TePOINTS))
+		{
+			TePointSet	points; 
+			if(!theme_->layer()->loadGeometrySet(object_id_, points))
+				return false;
+
+			for(int i=0; i<(int)points.size(); ++i)
+			{
+				TePoint* point = new TePoint;
+				result.push_back (point);
+			}
+		}
+		if(theme_->layer()->hasGeometry (TeCELLS))
+		{
+			TeCellSet cells; 
+			if(!theme_->layer()->loadGeometrySet(object_id_, cells))
+				return false;
+
+			for(int i=0; i<(int)cells.size(); ++i)
+			{
+				TeCell* cell = new TeCell;
+				result.push_back (cell);
+			}
+		}
+	}
+	else
+		return false;
+			
+	return true;
+}
+
+bool 
+TeSTInstance::getGeometry(TeMultiGeometry& result)
+{
+	if(!geometries_.empty())
+	{
+		result = geometries_;
+		return true; 
+	}
+
+	geometries_.getGeometry (result.polygons_);
+	geometries_.getGeometry (result.lines_);
+	geometries_.getGeometry (result.points_);
+	geometries_.getGeometry (result.cells_);
+	
+	return (!result.empty());
+}
+
+void 
+TeSTInstance::addProperty(const double& val, TeAttributeRep rep, bool /* attrIn */)
+{
+	TeProperty prop;
+	prop.attr_.rep_ = rep; 
+	prop.value_ = Te2String(val); 
+	properties_.push_back(prop);	
+}
+
+
+bool 
+TeSTInstance::addGeometry(const TePolygon& poly)  
+{ 
+	if(poly.objectId() == objectId())
+	{
+		geometries_.addGeometry (poly);
+		return true;
+	}
+	return false;
+}
+	
+bool 
+TeSTInstance::addGeometry(const TeLine2D& line)     
+{ 
+	if(line.objectId() == objectId())
+	{
+		geometries_.addGeometry (line);
+		return true;
+	}
+	return false; 
+}
+	
+bool 
+TeSTInstance::addGeometry(const TePoint& point)	
+{ 
+	if(point.objectId() == objectId())
+	{
+		geometries_.addGeometry (point);
+		return true;
+	}
+	return false;  
+} 
+	
+bool
+TeSTInstance::addGeometry(const TeCell& cell)		
+{ 
+	if(cell.objectId() == objectId())
+	{
+		geometries_.addGeometry (cell);
+		return true;
+	}
+	return false;  
+}
+
+
+bool 
+TeSTInstance::setPropertyValue (const string& name, const string& val)	
+{ 
+	string newName; 
+	size_t pos = name.find(".", string::npos,1);
+	if (pos != string::npos)
+		newName = name.substr(pos+1);
+
+	TePropertyVector::iterator it = properties_.begin();
+	while(it!=properties_.end())
+	{
+		if( ((*it).attr_.rep_.name_ == name) ||
+			((*it).attr_.rep_.name_ == newName))
+		{
+			(*it).value_ = val; 
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
+
+
+double 
+TeSTInstance::operator[](int i)   
+{
+	TeAttrDataType	attrType = properties_[i].attr_.rep_.type_;
+
+	if ((i >= 0) && (i < (int)properties_.size()) && 
+		(attrType == TeREAL || attrType == TeINT))
+	{
+		if (properties_[i].value_.empty()) 
+			return TeMAXFLOAT;
+		return (atof(properties_[i].value_.c_str()));
+	}
+	else 
+		return 0.;
+}
+
+bool 
+TeSTInstance::centroid(TeCoord2D& centroid, TeGeomRep geomRep)
+{
+	bool status = false;
+	if(geomRep==TePOLYGONS)
+	{ 
+		TePolygonSet pols;
+		if(getGeometry(pols))
+		{
+			centroid = TeFindCentroid(pols);
+			status = true;
+		}
+	}
+	if(geomRep==TeLINES)
+	{
+		TeLineSet lins; 
+		if(getGeometry(lins))
+		{
+			centroid = TeFindCentroid(lins);
+			status = true;
+		}
+	}
+	if(geomRep==TePOINTS)
+	{
+		TePointSet points; 
+		if(getGeometry(points))
+		{
+			centroid = TeFindCentroid(points);
+			status = true;
+		}
+	}
+	if(geomRep==TeCELLS)
+	{
+		TeCellSet cells; 
+		if(getGeometry(cells))
+		{
+			centroid = TeFindCentroid(cells);
+			status = true;
+		}
+	}
+	if(geomRep==TeGEOMETRYNONE)
+	{
+		if(hasPolygons())
+			status = this->centroid(centroid, TePOLYGONS);
+		else if(hasLines())
+			status = this->centroid(centroid, TeLINES);
+		else if (hasPoints())
+			status = this->centroid(centroid, TePOINTS);
+		else if (hasCells())
+			status = this->centroid(centroid, TeCELLS);
+	}
+
+	return status;
+}
+
+bool 
+TeSTInstance::area(double& a, TeGeomRep geomRep)
+{
+	bool status = false;
+	if(geomRep==TePOLYGONS)
+	{ 
+		TePolygonSet pols;
+		if(getGeometry(pols))
+		{
+			a = TeGeometryArea(pols);
+			status = true;
+		}
+	}
+	if(geomRep==TeLINES)
+	{
+		TeLineSet lins; 
+		if(getGeometry(lins))
+		{
+			a = TeGeometryArea(lins);
+			status = true;
+		}
+	}
+	if(geomRep==TePOINTS)
+	{
+		TePointSet points; 
+		if(getGeometry(points))
+		{
+			a = TeGeometryArea(points);
+			status = true;
+		}
+	}
+	if(geomRep==TeCELLS)
+	{
+		TeCellSet cells; 
+		if(getGeometry(cells))
+		{
+			a = TeGeometryArea(cells);
+			status = true;
+		}
+	}
+	if(geomRep==TeGEOMETRYNONE)
+	{
+		if(hasPolygons())
+			status = this->area(a, TePOLYGONS);
+		else if(hasLines())
+			status = this->area(a, TeLINES);
+		else if (hasPoints())
+			status = this->area(a, TePOINTS);
+		else if (hasCells())
+			status = this->area(a, TeCELLS);
+	}
+
+	return status;
+}
+
+void 
+TeSTInstance::clear()
+{
+	slice_ = 0;
+	theme_ = 0;
+	object_id_.clear();
+	unique_id_.clear();
+	properties_.clear();
+	geometries_.clear();
+}
+
+
+
diff --git a/src/terralib/kernel/TeSTInstance.h b/src/terralib/kernel/TeSTInstance.h
new file mode 100644
index 0000000..9594e62
--- /dev/null
+++ b/src/terralib/kernel/TeSTInstance.h
@@ -0,0 +1,231 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSTInstance.h
+	This file contains structures and definitions to deal with an instance
+	in time of a spatial element, including their geometry and set of properties  
+*/
+
+#ifndef  __TERRALIB_INTERNAL_STINSTANCE_H
+#define  __TERRALIB_INTERNAL_STINSTANCE_H
+
+#include "TeAttribute.h"
+#include "TeTimeInterval.h"
+#include "TeTheme.h"
+#include "TeMultiGeometry.h"
+
+#include <string>
+#include <map> 
+#include <vector>
+using namespace std;
+
+//! An instance in a time of a spatial element
+class TeSTInstance
+{
+	
+protected:
+	string				object_id_;		// object identification
+	vector<string>		unique_id_;		// instance identification for each attribute table
+	int					slice_;			// grouping identification
+	
+	TeTimeInterval		time_;			// validity time
+	TePropertyVector	properties_;	// set of properties
+	TeMultiGeometry	    geometries_;	// set of geometries
+
+	TeTheme*			theme_;			// theme
+
+public:		
+
+	//! Default constructor
+	TeSTInstance() { }
+
+	//! Constructor to an ST object without geometries or time stamp 
+	TeSTInstance (const string& object_id, TeProperty& prop ); 
+			
+	//! Copy constructor
+	TeSTInstance(const TeSTInstance& other); 
+						
+	//! Assignment operator
+	TeSTInstance& operator= (const TeSTInstance& other);
+		
+	//! Operator ==
+	bool operator== (const TeSTInstance& other) const;
+	
+	//! Destructor
+	~TeSTInstance() {} 
+	
+	//! Sets the vector of properties of this ST object
+	void properties(TePropertyVector& p) 
+	{	properties_ = p;	}
+
+	//! Returns the property vector of this instance
+	TePropertyVector& getPropertyVector()
+	{	return properties_;	}
+
+	//! Returns the properties of this instance that was generated for a function
+	TePropertyVector& getOutPropertyVector()
+	{	return properties_;	}
+
+	//! Returns the geometries
+	TeMultiGeometry& geometries() { return geometries_;}
+
+	//! Gets the i-th property
+	bool getProperty (TeProperty& prop, unsigned int i = 0);	
+	
+	//! Gets the property named "name
+	bool getProperty (TeProperty& prop, string name);	
+	
+	//! Gets the value (as a string) of of the i-th property
+	bool getPropertyValue (string& val, int i = 0);	
+
+	//! Gets the value (as a string) of a property named 'name'
+	bool getPropertyValue (const string& name, string& val);	
+
+	//! Return true if this has polygons
+	bool hasPolygons()	
+	{ return (geometries_.hasPolygons()); } 
+	
+	//! Return true if this has lines
+	bool hasLines()		
+	{ return (geometries_.hasLines()); } 
+	
+	//! Return true if this has points
+	bool hasPoints()		
+	{ return (geometries_.hasPoints()); } 
+	
+	//! Return true if this has cells
+	bool hasCells()		
+	{ return (geometries_.hasCells()); } 
+	
+	//! Get geometries
+	bool getGeometry(TePolygonSet& result); 
+	bool getGeometry(TeLineSet& result);
+	bool getGeometry(TePointSet& result);
+	bool getGeometry(TeCellSet& result);
+	bool getGeometry(vector<TeGeometry*>& result);
+	bool getGeometry(TeMultiGeometry& result);
+
+	//! Adds a property to this ST object
+	void addProperty(TeProperty& prop) 
+	{	properties_.push_back ( prop );		}
+
+	//! Adds a property to this ST object
+	void addProperty(const double& val, TeAttributeRep rep = TeAttributeRep(), bool attrIn = true); 
+
+	//! Set geometries
+	void setGeometry(const TePolygonSet& result)
+	{ geometries_.setGeometry(result); }
+	
+	void setGeometry(const TeLineSet& result)
+	{ geometries_.setGeometry(result); }
+
+	void setGeometry(const TePointSet& result)
+	{ geometries_.setGeometry(result); }
+
+	void setGeometry(const TeCellSet& result)
+	{ geometries_.setGeometry(result); }
+
+	void setGeometry(vector<TeGeometry*>& result)
+	{ geometries_.setGeometry(result); }
+
+	void setGeometry(const TeMultiGeometry& geoms) 
+	{	geometries_ = geoms; }
+
+	//! Add geometries
+	bool addGeometry(const TePolygon& poly);  
+	bool addGeometry(const TeLine2D& line);
+	bool addGeometry(const TePoint& point);	
+	bool addGeometry(const TeCell& cell);		
+		
+	//! Sets the value (as a string) of a property named 'name' 
+	bool setPropertyValue (const string& name, const string& val);	
+	
+	//! Returns the value (as a double) of the i-th property
+	double operator[](int i);    
+	
+	//! Return the centroid of the geometry
+	bool centroid(TeCoord2D& centroid, TeGeomRep geomRep=TeGEOMETRYNONE); 
+	
+	//! Return the area of the geometry
+	bool area( double& a, TeGeomRep geomRep=TeGEOMETRYNONE);
+	
+	//! Returns the validity interval
+	TeTimeInterval timeInterval () 
+	{	return time_;	}
+	
+	//! Sets the validity interval
+	void timeInterval (const TeTimeInterval& t) 
+	{	time_ = t;	}
+
+	//! Returns the initial time of the validity interval
+	string getInitialDateTime(const string& mask="YYYYsMMsDDsHHsmmsSS") 
+	{	return time_.getInitialDateTime(mask);	}
+	
+	//! Returns the final time of the validity interval
+	string getFinalDateTime(const string& mask="YYYYsMMsDDsHHsmmsSS") 
+	{	return time_.getFinalDateTime(mask);	}
+
+	//! Returns the object identification
+	string objectId () 
+	{	return object_id_;	}
+	
+	//! Sets the object identification
+	void objectId (const string& id) 
+	{	object_id_ = id;	}
+
+	//! Returns the instance identification
+	vector<string>& uniqueId () 
+	{	return unique_id_;	}
+
+	//! Returns the instance identification
+	string uniqueId (int index_) 
+	{	return unique_id_[index_];	}
+	
+	//! Sets the instance identifications
+	void uniqueId (const vector<string>& ids) 
+	{	unique_id_ = ids;	}
+
+	//! Adds the instance identifications
+	void addUniqueId(const string& id)
+	{	unique_id_.push_back(id); }
+
+	//! Sets the grouping identification of this ST object
+	void slice (int s) 
+	{	slice_ = s; }
+
+	//! Returns the grouping identification of this ST object
+	int slice()
+	{	return slice_; }
+
+	//! Return the theme that the instance belongs 
+	TeTheme* theme() { return theme_; }
+
+	//! Set the theme that the instance belongs
+	void theme(TeTheme* theme)  { theme_ = theme; }
+
+	//! clear instance
+	void clear(); 
+};
+
+
+#endif 
diff --git a/src/terralib/kernel/TeSingleton.h b/src/terralib/kernel/TeSingleton.h
new file mode 100644
index 0000000..16be16b
--- /dev/null
+++ b/src/terralib/kernel/TeSingleton.h
@@ -0,0 +1,62 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_SINGLETON_H
+#define  __TERRALIB_INTERNAL_SINGLETON_H
+
+//!  Provides a template support for the "Singleton" pattern
+/*!
+	\note See "Design Patterns" book, page 127
+*/
+template <class T>
+class TeSingleton {
+public:
+
+	static T& instance ()
+	{ 
+		static 	T	instance_;
+		return		instance_;
+	}
+	
+// -- Destructor
+
+	virtual ~TeSingleton() {}  // base class
+
+protected:
+
+// -- Contructors
+
+	TeSingleton() {}
+
+
+private:
+
+// No copy allowed
+
+	TeSingleton(const TeSingleton&);
+	TeSingleton& operator=(const TeSingleton&){return *this;}
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeSlice.h b/src/terralib/kernel/TeSlice.h
new file mode 100644
index 0000000..2ebb39e
--- /dev/null
+++ b/src/terralib/kernel/TeSlice.h
@@ -0,0 +1,63 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSlice.h
+    This provides support for a slice structure
+*/
+#ifndef  __TERRALIB_INTERNAL_SLICE_H
+#define  __TERRALIB_INTERNAL_SLICE_H
+
+#include "TeUtils.h"
+
+#include <string>
+#include <vector>
+#include <map>
+#include <iostream>
+using namespace std;
+
+/*! 
+A Slice is a structure that defines an interval of values and associates a
+number of objects that have a certain property, or attribute, whithin this
+interval.
+*/ 
+class TeSlice
+{
+public:
+	int			count_;			//! number of objects container in the interval
+	string		from_;			//! interval lower value 
+	string		to_;			//! interval upper value
+	
+	//! Constructor
+	TeSlice::TeSlice () : count_(0),from_(""),to_("") {}
+
+	//! Constructor
+	TeSlice::TeSlice(const string& from, const string& to, int count=0) :
+     count_(count),
+		from_(from),
+		to_(to) {}
+};
+
+//! A vector of slices
+typedef vector<TeSlice> TeSliceVector;
+#endif
+
diff --git a/src/terralib/kernel/TeSparseMatrix.h b/src/terralib/kernel/TeSparseMatrix.h
new file mode 100644
index 0000000..e843cca
--- /dev/null
+++ b/src/terralib/kernel/TeSparseMatrix.h
@@ -0,0 +1,272 @@
+// k9/a4/sparmat.h, templates for sparse matrices
+#ifndef SPARSEMATRIX_H
+#define SPARSEMATRIX_H SPARSEMATRIX_H
+
+// selection of implementation
+#ifdef STL_map            // defined in main()
+#include<map>
+#include<cassert>
+#else
+#include<hmap.h>
+
+/* If at this point the HMap container is chosen, a function for
+   calculating the hash table addresses is needed. As opposed to the
+   hash functions described up to now, not only one value, but two are
+   used for the calculation. Therefore, the function operator of the
+   PairHashFun class takes a pair as argument. The address calculation
+   itself is simple, but sufficient for our purposes. */
+
+using namespace std;
+
+template<class IndexType>  // int, long or unsigned
+class PairHashFun
+{
+  public:
+    PairHashFun(long prime=65537) // another prime number is possible
+        // e.g. 2111 for smaller Matrizes
+    : tabSize(prime)
+    {}
+
+    // Address calculation with two values
+    long operator()(const pair<IndexType, IndexType>& p) const
+    {
+       return (p.first + p.second) % tabSize;
+    }
+
+    long tableSize() const
+    { 
+       return tabSize;
+    }
+
+  private:
+    long tabSize;
+};
+#endif          //  STL_map
+
+#ifdef _MSC_VER
+#include <utility>
+using namespace std;
+#endif
+
+template<class ValueType, class IndexType, class ContainerType>
+class MatrixElement
+{
+  private:
+    ContainerType& C;
+    typename ContainerType::iterator I;
+    IndexType row, column;
+
+  public:
+    typedef pair<IndexType, IndexType> IndexPair;
+    typedef MatrixElement<ValueType, IndexType,
+                          ContainerType>&  Reference;
+
+    MatrixElement(ContainerType& Cont, IndexType r, IndexType c)
+    : C(Cont), I(C.find(IndexPair(r,c))),
+      row(r), column(c)
+    {}
+
+    /* The constructor initializes the private variables with all
+       information that is needed. The container itself is located in
+       the sparseMatrix class; here, the reference to it is entered.
+       If the passed indices for row and column belong to an element
+       not yet stored in the container, the iterator has the value
+       C.end(). */
+
+    ValueType asValue() const
+    {
+       if(I == C.end())
+           return ValueType(0);
+       else
+           return (*I).second;
+    }
+
+    operator ValueType () const  // type conversion operator
+    {
+       return asValue();
+    }
+
+    /* According to the definition of the sparse matrix, 0 is returned
+       if the element is not present in the container. Otherwise, the
+       result is the second part of the object of type value_type
+       stored in the container. */
+
+    Reference operator=(const ValueType& x)
+    {
+       if(x != ValueType(0))        // not equal 0?
+       {
+         /* If the element does not yet exist, it is put, together
+            with the indices, into an object of type value_type and
+            inserted with insert(): */
+
+          if(I == C.end())
+          {
+             assert(C.size() < C.max_size());
+             I = (C.insert(
+#ifndef _MSC_VER
+			 typename
+#endif
+			 ContainerType::value_type(
+                        IndexPair(row,column), x))
+                 ).first;
+          }
+          else (*I).second = x;
+       }
+
+       /* insert() returns a pair whose first part is an iterator
+          pointing to the inserted object. The second part is of type
+          bool and indicates whether the insertion took place because
+          no element with this key existed. This is, however, not
+          evaluated here because, due to the precondition (I ==
+          C.end()), the second part must always have the value true.
+          If, instead, the element already exists, the value is
+          entered into the second part of the value_type object. If
+          the value is equal 0, in order to save space the element is
+          deleted if it existed. */
+
+       else                    // x = 0
+          if(I != C.end())
+          {
+              C.erase(I);
+              I = C.end();
+          }
+       return *this;
+    }
+
+    /* An assignment operator is required which in turn requires a
+       reference to an object of type MatrixElement. When both the
+       left- and right-hand side are identical, nothing has to happen.
+       Otherwise, as above, it has to be checked whether the value of
+       the right-hand element is 0 or not. The resulting behavior is
+       described together with the above assignment operator, so that
+       here it is simply called: */
+
+    Reference operator=(const Reference rhs)
+    {
+       if(this != &rhs)      // not identical?
+       {
+           return operator=(rhs.asValue());  // see above
+       }
+       return *this;
+    }
+
+};  // class MatrixElement
+
+template<class ValueType, class IndexType>
+class TeSparseMatrix
+{
+   public:
+     typedef pair<IndexType, IndexType> IndexPair;
+
+     // The switch STL_map controls the compilation:
+
+#ifdef STL_map
+     typedef map<IndexPair, ValueType,
+                  less<IndexPair> >       ContainerType;
+#else
+     typedef HMap<IndexPair, ValueType,
+                  PairHashFun<IndexType> > ContainerType;
+#endif
+
+     typedef MatrixElement<ValueType, IndexType,
+                           ContainerType> MatrixElement;
+
+  public:
+    typedef IndexType size_type;
+
+    /* The constructor only initializes the row and column
+       information. The container is created by its standard
+       constructor, where in the case of hash implementation, the size
+       of the container is given by the hash function object of type
+       PairHashFun (see typedef above). */
+
+  private:
+    size_type rows, columns;
+    ContainerType C;
+
+  public:
+    sparseMatrix(size_type r, size_type c)
+    : rows(r), columns(c)
+    {}
+
+   size_type Rows()  const { return rows;}
+   size_type Columns() const { return columns;}
+
+   // usual container type definitions
+   typedef typename ContainerType::iterator iterator;
+   typedef typename ContainerType::const_iterator const_iterator;
+
+   // usual container functions
+   size_type size()       const { return C.size();}
+   size_type max_size()   const { return C.max_size();}
+
+   iterator begin()             { return C.begin();}
+   iterator end()               { return C.end();}
+
+   const_iterator begin() const { return C.begin();}
+   const_iterator end()   const { return C.end();}
+
+   void clear()
+   {
+       C.clear();
+
+   }
+
+   class Aux  // for index operator below
+   {
+     public:
+       Aux(size_type r, size_type maxs, ContainerType& Cont)
+       : Row(r), maxColumns(maxs), C(Cont)
+       {}
+
+       /* After checking the number of columns, the index operator of
+          Aux returns a matrix element which is equipped with all
+          necessary information to carry out a successful assignment.
+        */
+
+       MatrixElement operator[](size_type c)
+       {
+           assert(c >= 0 && c < maxColumns);
+           return MatrixElement(C, Row, c);
+       }
+
+     private:
+       size_type Row, maxColumns;
+       ContainerType& C;
+   };
+
+   /* The index operator of the sparseMatrix class returns the
+       auxiliary object, whose class is defined as nested inside
+       sparseMatrix. */
+   Aux operator[](size_type r)
+   {
+      assert(r >= 0 && r < rows);
+      return Aux(r, columns, C);
+   }
+
+    /* Up to this point, from a functionality point of view, the
+       sparseMatrix class is sufficiently equipped. In order, however,
+       to avoid writing such horrible things as `(*I).first.first' for
+       accessing the elements, some auxiliary functions follow which
+       determine the indices and associated values of an iterator in a
+       more readable way. */
+
+   size_type Index1(iterator& I) const
+   {
+      return (*I).first.first;
+   }
+
+   size_type Index2(iterator& I) const
+   {
+      return (*I).first.second;
+   }
+
+   ValueType Value(iterator& I) const
+   {
+      return (*I).second;
+   }
+};       // class sparseMatrix
+
+#endif   // file sparmat.h
+
+
diff --git a/src/terralib/kernel/TeSpatialOperations.cpp b/src/terralib/kernel/TeSpatialOperations.cpp
new file mode 100644
index 0000000..d893848
--- /dev/null
+++ b/src/terralib/kernel/TeSpatialOperations.cpp
@@ -0,0 +1,1658 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeSpatialOperations.h"
+#include "TeGeometryAlgorithms.h"
+#include "TeRasterRemap.h"
+#include "TeStatistics.h"
+#include "TeOverlay.h"
+#include "TeBufferRegion.h"
+#include "TeProgress.h"
+#include "TeVectorRemap.h"
+
+#include <algorithm>
+
+
+TeProjection*
+getProjectionFromGeomTable(const string& geomTable, TeDatabase* db)
+{
+	TeLayerMap layerMap = db->layerMap();
+	TeLayerMap::iterator it = layerMap.begin();
+	while(it!=layerMap.end())
+	{
+		TeLayer* layer = it->second;
+		TeRepresPointerVector::iterator itRep = layer->vectRepres().begin();
+		while(itRep!=layer->vectRepres().end())
+		{
+			if(TeConvertToUpperCase((*itRep)->tableName_)==TeConvertToUpperCase(geomTable))
+				return layer->projection();
+			++itRep;
+		}
+		++it;
+	}
+	return 0; 
+}
+
+
+// Return if exist or not a totpological relation between two geometries
+// Use the TerraLib topological functions
+bool TopolRelation(TePolygon* geom1, TePolygon* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)  
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2);
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2);
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom1, *geom2);
+		break;
+
+		case TeOVERLAPS:
+			result = TeOverlaps(*geom1, *geom2);
+		break;
+
+		case TeCOVERS:
+			result = TeCovers(*geom1, *geom2);
+		break;
+
+		case TeCOVEREDBY:
+			result = TeCoveredBy(*geom1, *geom2);
+		break;
+		
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2);
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom1, *geom2);
+		break;
+		
+		case TeEQUALS:
+			result = TeEquals(*geom1, *geom2);
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY) :
+			result = TeWithinOrCoveredByOrEquals(*geom1, *geom2);
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = ( (TeOverlaps(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals(*geom1, *geom2)));
+		break;
+	}
+	return result;
+}
+
+
+bool TopolRelation(TePolygon* geom1, TeLine2D* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom2, *geom1); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom2, *geom1); 
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom2, *geom1);  
+		break;
+
+		case TeCOVERS:
+			result = TeCovers(*geom1, *geom2);  
+		break;
+
+		case TeCOVEREDBY:
+			result = TeCoveredBy(*geom2, *geom1);  
+		break;
+		
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom2, *geom1); 
+		break;
+		
+		case TeCROSSES:
+			result = TeCrosses(*geom2, *geom1); 
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY):
+			result = TeWithinOrCoveredByOrEquals(*geom2, *geom1);
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = ( (TeCrosses(*geom2, *geom1)) || (TeWithinOrCoveredByOrEquals(*geom2, *geom1)));
+		break;
+	}
+	return result;
+}
+
+
+bool TopolRelation(TePolygon* geom1, TePoint* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom2, *geom1); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom2, *geom1); 
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom2, *geom1);  
+		break;
+
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom2, *geom1); 
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY):
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = TeWithinOrCoveredByOrEquals((*geom2).location(), *geom1);
+		break;
+	}
+	return result;
+}
+
+bool TopolRelation(TeLine2D* geom1, TeLine2D* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)  
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2); 
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom1, *geom2); 
+		break;
+
+		case TeOVERLAPS:
+			result = TeOverlaps(*geom1, *geom2); 
+		break;
+
+		case TeCOVERS:
+			result = TeCovers(*geom1, *geom2); 
+		break;
+
+		case TeCOVEREDBY:
+			result = TeCoveredBy(*geom1, *geom2); 
+		break;
+		
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom1, *geom2); 
+		break;
+		
+		case TeEQUALS:
+			result = TeEquals(*geom1, *geom2); 
+		break;
+
+		case TeCROSSES:
+			result = TeCrosses(*geom1, *geom2); 
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = ( (TeCrosses(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals(*geom1, *geom2)));
+		break;
+	}
+	return result;
+}
+
+bool TopolRelation(TeLine2D* geom1, TePoint* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)  
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom2, *geom1); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom2, *geom1); 
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom2, *geom1); 
+		break;
+
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom2, *geom1); 
+		break;
+		
+		case (TeWITHIN | TeCOVEREDBY):
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = TeWithinOrCoveredByOrEquals((*geom2).location(), *geom1);
+		break;
+	}
+	return result;
+}
+
+bool TopolRelation(TePoint* geom1, TePoint* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)  
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2); 
+		break;
+		
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom1, *geom2); 
+		break;
+		
+		case TeEQUALS:
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = TeEquals(*geom1, *geom2); 
+		break;
+	}
+	return result;
+}
+
+bool TopolRelation(TeCell* geom1, TeCell* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)  
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2);
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2);
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom1, *geom2);
+		break;
+
+		case TeOVERLAPS:
+			result = TeOverlaps(*geom1, *geom2);
+		break;
+
+		case TeCOVERS:
+			result = TeCovers(*geom1, *geom2);
+		break;
+
+		case TeCOVEREDBY:
+			result = TeCoveredBy(*geom1, *geom2);
+		break;
+		
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2);
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom1, *geom2);
+		break;
+		
+		case TeEQUALS:
+			result = TeEquals(*geom1, *geom2);
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY):
+			result = TeWithinOrCoveredByOrEquals((*geom1).box(), (*geom2).box());
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = ( (TeOverlaps(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals((*geom1).box(), (*geom2).box())));
+		break;
+	}
+	return result;
+}
+
+bool TopolRelation(TeCell* geom1, TePolygon* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)  
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2);
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2);
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom1, *geom2);
+		break;
+
+		case TeOVERLAPS:
+			result = TeOverlaps(*geom1, *geom2);
+		break;
+
+		case TeCOVERS:
+			result = TeCovers(*geom1, *geom2);
+		break;
+
+		case TeCOVEREDBY:
+			result = TeCoveredBy(TeMakePolygon((*geom1).box()), *geom2);
+		break;
+		
+		case TeCONTAINS:
+			result = TeWithin(*geom2, TeMakePolygon((*geom1).box()));
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom1, *geom2);
+		break;
+		
+		case TeEQUALS:
+			result = TeEquals(*geom1, *geom2);
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY):
+			result = TeWithinOrCoveredByOrEquals(TeMakePolygon((*geom1).box()), *geom2);
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = ( (TeOverlaps(*geom1, *geom2)) || (TeWithinOrCoveredByOrEquals(TeMakePolygon((*geom1).box()) , *geom2)));
+		break;
+	}
+	return result;
+}
+
+bool TopolRelation(TeCell* geom1, TeLine2D* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2); 
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom2, *geom1);  
+		break;
+
+		case TeCOVERS:
+			result = TeCovers(*geom1, *geom2);  
+		break;
+
+		case TeCOVEREDBY:
+			result = TeCoveredBy(*geom2, *geom1);  
+		break;
+		
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom2, *geom1); 
+		break;
+		
+		case TeCROSSES:
+			result = TeCrosses(*geom2, *geom1); 
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY):
+			result = TeWithinOrCoveredByOrEquals(*geom2, TeMakePolygon((*geom1).box()));
+		break;
+
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = ( (TeCrosses(*geom2, *geom1)) || (TeWithinOrCoveredByOrEquals(*geom2, TeMakePolygon((*geom1).box()))));
+		break;
+	}
+	return result;
+
+}
+
+bool TopolRelation(TeCell* geom1, TePoint* geom2, int relation)
+{
+	bool result = false;
+	switch (relation)
+	{		
+		case TeDISJOINT:
+			result = TeDisjoint(*geom1, *geom2); 
+		break;
+
+		case TeINTERSECTS:
+			result = TeIntersects(*geom1, *geom2); 
+		break;
+		
+		case TeTOUCHES:
+			result = TeTouches(*geom2, *geom1);  
+		break;
+
+		case TeCONTAINS:
+			result = TeContains(*geom1, *geom2); 
+		break;
+		
+		case TeWITHIN:
+			result = TeWithin(*geom2, *geom1); 
+		break;
+
+		case (TeWITHIN & TeCOVEREDBY):
+		case (TeWITHIN | TeCOVEREDBY | TeOVERLAPS | TeCROSSES):
+			result = TeWithinOrCoveredByOrEquals((*geom2).location(), TeMakePolygon((*geom1).box()));
+		break;
+	}
+	return result;
+
+}
+
+
+// Return a string with the identifications of the selected geometries 
+string 
+getStringIds(Keys& IdsIn)
+{
+	string Ids = "";
+	int cont = 0;
+	
+	Keys::iterator itIdIn = IdsIn.begin();
+	while (itIdIn != IdsIn.end())
+	{
+		if(cont)
+			Ids += ","; 
+		Ids += "'" + (*itIdIn) + "'";
+		itIdIn++;
+		cont++;
+	}
+
+	return Ids;
+}
+
+// fill the geometries vector from a portal
+string
+mountSelect(string geomTable, string colTable, TeGeomRep rep, TeBox& box, int relate, TeDatabasePortal *portal)
+{
+	
+	string sql = "SELECT * FROM "+ geomTable;
+	
+	if(!colTable.empty())
+		sql +=", "+ colTable +" WHERE c_object_id = object_id ";
+		
+	//If not disjoint
+	if(box.isValid() && (relate!=TeDISJOINT))
+	{
+		if(!colTable.empty())
+			sql += " AND ";
+		else
+			sql += " WHERE ";
+
+		sql += portal->getDatabase()->getSQLBoxWhere (box, rep);
+	}
+	return sql;
+}
+
+//fill the result vector of the geometries identificators  
+bool
+fillSelectedGeomVector(TeGeomRep actRep, TeSelectedGeom& vetGeom, TeDatabasePortal *portal, TeProjection* projAct=0, TeProjection* projVis=0)
+{
+	bool flag = true;
+	bool remap = false;
+
+	if((projAct!=0) && (projVis!=0) && (projAct!=projVis))
+		remap = true;
+	
+	try
+	{
+		do
+		{
+			if(actRep == TePOLYGONS)
+			{
+				TePolygon   poly, *pol;
+				flag = portal->fetchGeometry(poly); 
+				pol = new TePolygon;
+				if(remap)
+				{
+					TePolygon pout;
+					TeVectorRemap (poly, projAct, pout, projVis);
+					*pol = pout;
+				}
+				else
+					*pol = poly;
+				vetGeom.push_back(pol);
+			}
+			else if(actRep == TeLINES)
+			{
+				TeLine2D	line, *lin;
+				flag = portal->fetchGeometry(line); 
+				lin = new TeLine2D();
+				if(remap)
+				{
+					TeLine2D gout;
+					TeVectorRemap (line, projAct, gout, projVis);
+					*lin = gout;
+				}
+				else
+					*lin = line;
+				vetGeom.push_back(lin);
+			}
+			else if(actRep == TePOINTS)
+			{
+				TePoint		point, *pnt;
+				flag = portal->fetchGeometry(point); 
+				pnt = new TePoint();
+				if(remap)
+				{
+					TePoint gout;
+					TeVectorRemap (point, projAct, gout, projVis);
+					*pnt = gout;
+				}
+				else
+					*pnt = point;
+				vetGeom.push_back(pnt);
+			}
+			else if(actRep == TeCELLS)
+			{
+				TeCell		cell, *cll;
+				flag = portal->fetchGeometry(cell); 
+				cll = new TeCell();
+				if(remap)
+				{
+					TeCell gout;
+					TeVectorRemap (cell, projAct, gout, projVis);
+					*cll = gout;
+				}
+				else
+					*cll = cell;
+				vetGeom.push_back(cll);
+			}
+		} while (flag);
+	}
+	catch(...)
+	{
+		TeSelectedGeom::iterator it;
+		for(it = vetGeom.begin(); it != vetGeom.end(); it++)
+			delete (*it);
+		return false;
+	}
+
+	return true;
+}
+
+//geom: selected geometries
+//obj: portal geometries
+//basic idea: obj "relate" geom
+bool
+fillResultIdsVector(TeGeometry *geom, TeDatabasePortal *portal, TeGeomRep portalRep, int relate, Keys& resultIds)
+{
+	bool flag = false;
+	bool result = false;
+	TeGeomRep geomRep = geom->elemType();
+	bool isSet = false;
+	int setSize = 1;
+
+	if ( (dynamic_cast<TePolygonSet*> (geom)) ||
+		 (dynamic_cast<TeLineSet*> (geom)) ||
+		 (dynamic_cast<TePointSet*> (geom)) ||
+		 (dynamic_cast<TeCellSet*> (geom)) )
+	{
+		isSet = true;
+		setSize = geom->size();
+	}
+	
+	try
+	{
+		do
+		{
+			TeGeometry* obj = 0;
+			if(portalRep == TePOLYGONS)
+			{
+				TePolygon   poly, *pol;
+				flag = portal->fetchGeometry (poly);
+				pol = new TePolygon();
+				*pol = poly;
+				obj = pol;
+			}
+			else if(portalRep == TeLINES)
+			{
+				TeLine2D	line, *lin;
+				flag = portal->fetchGeometry (line);
+				lin = new TeLine2D();
+				*lin = line;
+				obj = lin;
+			}
+			else if(portalRep == TePOINTS)
+			{
+				TePoint		point, *pnt;
+				flag = portal->fetchGeometry (point);
+				pnt = new TePoint();
+				*pnt = point;
+				obj = pnt;
+			}
+			else if(portalRep == TeCELLS)
+			{
+				TeCell		cell, *cll;
+				flag = portal->fetchGeometry (cell);
+				cll = new TeCell();
+				*cll = cell;
+				obj = cll;
+			}
+						
+			result = false;
+
+			//for each geometry 	
+			for(int i=0; i<setSize; ++i)
+			{
+				TeGeometry* geomTemp;
+				if(isSet)
+				{
+					if(geomRep==TePOLYGONS)
+						geomTemp = &(((TePolygonSet*)geom)->operator[](i));
+					else if (geomRep==TeLINES)
+						geomTemp = &(((TeLineSet*)geom)->operator[](i));
+					else if (geomRep==TePOINTS)
+						geomTemp = &(((TePointSet*)geom)->operator[](i));
+					else if (geomRep==TeCELLS)
+						geomTemp = &(((TeCellSet*)geom)->operator[](i));
+				}
+				else
+					geomTemp = geom;
+				
+				switch (geomRep | portalRep)   //geom: selected and obj: portal
+				{
+						
+					case 1: //polygon with polygon
+						result = TopolRelation((TePolygon*)obj, (TePolygon*)geomTemp, relate);
+					break;
+
+					case 2://line with line 
+						result = TopolRelation((TeLine2D*)obj, (TeLine2D*)geomTemp, relate);
+					break;
+			
+					case 3://polygon with line
+						if(geomRep == TePOLYGONS)
+							result = TopolRelation((TePolygon*)geomTemp, (TeLine2D*)obj, relate);
+						else
+							result = TopolRelation((TePolygon*)obj, (TeLine2D*)geomTemp, relate);
+					break;
+				
+					case 4://point with point
+						result = TopolRelation((TePoint*)obj, (TePoint*)geomTemp, relate);
+					break;
+				
+					case 5://polygon with point
+						if(geomRep == TePOLYGONS)
+							result = TopolRelation((TePolygon*)geomTemp, (TePoint*)obj, relate);
+						else
+							result = TopolRelation((TePolygon*)obj, (TePoint*)geomTemp, relate);
+					break;
+
+					case 6://line with point 
+						if(geomRep == TeLINES)
+							result = TopolRelation((TeLine2D*)geomTemp, (TePoint*)obj, relate);
+						else
+							result = TopolRelation((TeLine2D*)obj, (TePoint*)geomTemp, relate);
+					break;
+					
+					case 256://cell with cell 
+						result = TopolRelation((TeCell*)obj, (TeCell*)geomTemp, relate);
+					break;
+
+					case 257://cell with polygon 
+						if(geomRep == TePOLYGONS)
+							result = TopolRelation((TeCell*)obj, (TePolygon*)geomTemp, relate);
+						else
+							result = TopolRelation((TeCell*)geomTemp, (TePolygon*)obj, relate);
+					break;
+					
+					case 258://cell with line 
+						if(geomRep == TeLINES)
+							result = TopolRelation((TeCell*)obj,  (TeLine2D*)geomTemp, relate);
+						else
+							result = TopolRelation((TeCell*)geomTemp, (TeLine2D*)obj, relate);
+					break;
+
+					case 260://cell with point
+						if(geomRep == TeCELLS)
+							result = TopolRelation((TeCell*)geomTemp, (TePoint*)obj, relate);
+						else
+							result = TopolRelation((TeCell*)obj,  (TePoint*)geomTemp, relate);
+					break;
+				}
+						
+				if(result)
+				{
+					string objId = obj->objectId();
+					resultIds.push_back(objId);
+				}
+			}//for
+
+			delete obj;
+		} while (flag); //fetchrow
+	}
+	catch(...)
+	{
+		return false;
+	}
+	return true;
+}
+
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   TeDatabasePortal *portal, int relation, const string& actColTable)
+{
+	Keys  resultIds;
+
+	if(!TeTopologicalRelation(actGeomTable, actRep, actIdsIn, resultIds, portal->getDatabase(), relation, actColTable))
+		return false;
+
+	string Ids = getStringIds(resultIds);
+	
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	portal->freeResult();
+
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+	
+	return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   const string& visGeomTable,  TeGeomRep visRep, TeDatabasePortal *portal, 
+						   int relation, const string& visColTable)
+{
+	Keys  resultIds;
+
+	if(!TeTopologicalRelation(actGeomTable, actRep, actIdsIn, visGeomTable, visRep, resultIds, portal->getDatabase(), relation, visColTable))
+		return false;
+	
+	string Ids = getStringIds(resultIds);
+
+	portal->freeResult ();
+
+	string sql = "SELECT * FROM " + visGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+	if(visRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+		
+	return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, 
+						   TeDatabasePortal *portal, int relation, const string& actCollTable)
+{
+	
+	Keys	resultIds;
+	
+	if(!TeTopologicalRelation(actGeomTable, actRep, geom, resultIds, portal->getDatabase(), relation, actCollTable))
+		return false;
+	
+	string Ids = getStringIds(resultIds);
+
+	portal->freeResult();
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+
+	if(!portal->query(sql) || !portal->fetchRow())
+		return false;
+	
+	return true;
+}
+	
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable)
+{
+	TeSelectedGeom	vetGeom;
+			
+	string Ids = getStringIds(actIdsIn);
+
+	TeDatabasePortal* portal = db->getPortal();
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	
+	//order by clause
+	string sqlOrderBy = " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sqlOrderBy += ", parent_id ASC, num_holes DESC ";
+
+	sql += sqlOrderBy;
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	if(!fillSelectedGeomVector(actRep,vetGeom,portal))
+	{
+		delete portal;
+		return false; 
+	}
+
+	//iterators
+	TeSelectedGeom::iterator it;
+	actIdsOut.clear();
+	double prec = TePrecision::instance().precision();
+	
+	for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+	{
+		portal->freeResult();
+		TeBox box = (**it).box();
+
+		TeBox temp (box.x1()-prec, box.y1()-prec, box.x2()+prec, box.y2()+prec); 
+		
+		sql = mountSelect(actGeomTable, actCollTable, actRep, temp, relation, portal);
+		if(relation != TeEQUALS)
+			sql += " AND object_id NOT IN (" + Ids + ")";
+		sql += sqlOrderBy;
+
+		if(!portal->query(sql)) 
+		{
+			delete portal;
+			return false;
+		}
+
+		if(!portal->fetchRow())
+			continue;
+
+		fillResultIdsVector((*it), portal, actRep, relation, actIdsOut);
+	
+	} 
+		
+	sort(actIdsOut.begin(), actIdsOut.end());
+	unique(actIdsOut.begin(), actIdsOut.end());
+
+	delete portal;
+	
+	for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+		delete (*it);
+
+	return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, 
+						   TeDatabase* db, int relation, const string& visCollTable)
+{
+	TeSelectedGeom	vetGeom;
+			
+	string Ids = getStringIds(actIdsIn);
+
+	//verify projection
+	TeProjection* projAct = getProjectionFromGeomTable(actGeomTable, db);
+	TeProjection* projVis = getProjectionFromGeomTable(visGeomTable, db);
+	
+	TeDatabasePortal* portal = db->getPortal();
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	if(!portal->query(sql)|| !portal->fetchRow ())
+	{
+		delete portal;
+		return false;
+	}
+	
+	if(!fillSelectedGeomVector(actRep,vetGeom,portal,projAct, projVis))
+	{
+		delete portal;
+		return false; 
+	}
+
+	//iterators
+	TeSelectedGeom::iterator it;
+	visIdsOut.clear();
+	double prec = TePrecision::instance().precision();
+
+	for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+	{
+		portal->freeResult();
+		TeBox box = (**it).box();
+		
+		TeBox temp (box.x1()-prec, box.y1()-prec, box.x2()+prec, box.y2()+prec); 
+		
+		sql = mountSelect(visGeomTable, visCollTable, visRep, temp, relation, portal);
+		sql += " ORDER BY object_id ASC ";
+		if(visRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+			sql += ", parent_id ASC, num_holes DESC ";
+
+		if(!portal->query(sql)) 
+		{
+			delete portal;
+			return false;
+		}
+
+		if(!portal->fetchRow())
+			continue;
+	
+		fillResultIdsVector((*it), portal, visRep, relation, visIdsOut);
+
+	}
+						
+	delete portal;
+	
+	sort(visIdsOut.begin(), visIdsOut.end());
+	unique(visIdsOut.begin(), visIdsOut.end());
+
+	for (it = vetGeom.begin(); it != vetGeom.end(); it++)
+		delete (*it);
+
+	return true;
+}
+
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, 
+						   Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable)
+{
+	TeDatabasePortal* portal = db->getPortal();
+	TeBox box = geom->box();
+
+	double prec = TePrecision::instance().precision();
+	TeBox temp (box.x1()-prec, box.y1()-prec, box.x2()+prec, box.y2()+prec); 
+
+	string sql = mountSelect(actGeomTable, actCollTable, actRep, temp, relation, portal);
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	actIdsOut.clear();
+	
+	fillResultIdsVector(geom, portal, actRep, relation, actIdsOut);
+
+	delete portal;
+	
+	sort(actIdsOut.begin(), actIdsOut.end());
+	unique(actIdsOut.begin(), actIdsOut.end());
+
+	return true;
+}
+
+bool TeGetWithinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut,
+						 TeDatabase* db, const double& max_dist, const string& actCollTable)
+{
+	if(!db)
+		return false;
+	
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	TeBox box (point.x()-max_dist, point.y()-max_dist,point.x()+max_dist, point.y()+max_dist); 
+
+	string sql = mountSelect(actGeomTable, actCollTable, actRep, box, TeWITHIN, portal);
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+
+	if(!portal->query(sql)) 
+	{
+		delete portal;
+		return false;
+	}
+
+	if(!portal->fetchRow())
+	{
+		delete portal;
+		return true;
+	}
+
+	bool flag = true;
+	do
+	{
+		TeCoord2D centroid2;
+		string objId;
+		if(actRep == TePOLYGONS)
+		{
+			TePolygon   poly;
+			flag = portal->fetchGeometry (poly);
+			objId = poly.objectId ();
+			centroid2 = TeFindCentroid(poly);
+		}
+		else if(actRep == TeLINES)
+		{
+			TeLine2D	line;
+			flag = portal->fetchGeometry (line);
+			objId = line.objectId ();
+			centroid2 = TeFindCentroid(line);
+		}
+		else if(actRep == TePOINTS)
+		{
+			TePoint		point;
+			flag = portal->fetchGeometry (point);
+			objId = point.objectId ();
+			centroid2 = TeFindCentroid(point);
+		}
+		else if(actRep == TeCELLS)
+		{
+			TeCell		cell;
+			flag = portal->fetchGeometry (cell);
+			objId = cell.objectId ();
+			centroid2 = TeFindCentroid(cell);
+		}
+		
+		double dist = TeDistance(point, centroid2);
+		if(dist<=max_dist)
+			IdsDistOut[objId] = dist;
+
+	} while (flag); //fetchrow
+	
+	//sort(IdsDistOut.begin(), IdsDistOut.end());
+
+	delete portal;
+	return true;
+}
+
+bool TeGetArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& area)
+{
+	if(actRep != TePOLYGONS && actRep != TeCELLS )
+		return false;
+
+	string Ids = getStringIds(actIdsIn);
+	
+	TeDatabasePortal* portal = db->getPortal();
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+
+	if((actRep == TePOLYGONS) && (portal->getDatabase()->dbmsName() != "PostGIS"))
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = false;
+	double sumArea = 0.;
+	do
+	{
+		if(actRep == TePOLYGONS)
+		{
+			TePolygon poly;
+			flag = portal->fetchGeometry(poly);
+			sumArea+= TeGeometryArea(poly);
+		}
+		else if(actRep == TeCELLS)
+		{
+			TeCell cell;
+			flag = portal->fetchGeometry(cell);
+			sumArea+= TeGeometryArea(cell.box());
+		}
+	}while (flag);
+	
+	area = sumArea;
+	delete portal;
+	return true;
+}
+
+
+bool TeGetLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& length)
+{
+	if((actRep != TePOLYGONS) && (actRep != TeLINES) && (actRep != TeCELLS) )
+		return false;
+
+	string Ids = getStringIds(actIdsIn);
+	
+	TeDatabasePortal* portal = db->getPortal();
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+
+	if((actRep == TePOLYGONS) && (portal->getDatabase()->dbmsName() != "PostGIS"))
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = false;
+	double sumLen = 0.;
+	do
+	{
+		if(actRep == TePOLYGONS)
+		{
+			TePolygon p;
+			flag = portal->fetchGeometry(p);
+			
+			for(unsigned int i=0; i<p.size(); i++)
+				sumLen += TeLength(p[i]);
+		}
+		else if (actRep == TeLINES)
+		{
+			TeLine2D l;
+			flag = portal->fetchGeometry(l);
+			sumLen += TeLength(l);
+		}
+		else if (actRep == TeCELLS)
+		{
+			TeCell c;
+			flag = portal->fetchGeometry(c);
+
+			TePolygon p = TeMakePolygon(c.box());
+			sumLen += TeLength(p[0]);
+		}
+		
+	}while (flag);
+	
+	length = sumLen;
+	delete portal;
+	return true;
+}
+
+
+bool TeGetDistance(const string& actGeomTable, TeGeomRep actRep, Keys& IdsIn, TeDatabase* db, double& distance)
+{
+	string Ids = getStringIds(IdsIn);
+	
+	TeDatabasePortal* portal = db->getPortal();
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN (" + Ids + ")";
+	sql += " ORDER BY object_id ASC ";
+
+	if((actRep == TePOLYGONS) && (portal->getDatabase()->dbmsName() != "PostGIS"))
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;  
+	}
+	
+	bool flag = false;
+	string lastObjId ="";
+	TeCoord2D coord1, coord2; 
+	int step = 0;
+	do
+	{
+		TeCoord2D coord;
+		string objId;
+		
+		if(actRep == TePOLYGONS)
+		{
+			TePolygon p;
+			flag = portal->fetchGeometry(p);
+			objId = p.objectId();
+			if(lastObjId==objId)
+				continue;
+			coord = TeFindCentroid(p);
+		}
+		else if (actRep == TeLINES)
+		{
+			TeLine2D l;
+			flag = portal->fetchGeometry(l);
+			objId = l.objectId ();
+			if(lastObjId==objId)
+				continue;
+			coord = TeFindCentroid(l);
+		}
+		else if (actRep == TePOINTS)
+		{
+			TePoint p;
+			flag = portal->fetchGeometry(p);
+			coord = p.location();
+		}
+		else if (actRep == TeCELLS)
+		{
+			TeCell c;
+			flag = portal->fetchGeometry(c);
+			objId = c.objectId ();
+			if(lastObjId==objId)
+				continue;
+			coord = TeFindCentroid(c);
+		}
+		
+		if(step==0)
+			coord1 = coord;
+		else
+			coord2 = coord;
+
+		lastObjId = objId;
+		++step;
+
+	}while (flag);
+	
+	distance = TeDistance(coord1, coord2);
+	delete portal;
+	return true;
+}
+
+bool TeGetConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, TePolygonSet& convexHullSet)
+{
+	if(actRep != TePOLYGONS)
+		return false;
+
+	TeDatabasePortal* portal = db->getPortal();
+	string Ids = getStringIds(actIds);
+
+	string sql = "SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN ("+ Ids +")";
+	sql += " ORDER BY object_id ASC ";
+
+	if(portal->getDatabase()->dbmsName() != "PostGIS")
+		sql += ", parent_id ASC, num_holes DESC ";
+		
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	do
+	{
+		TePolygon   poly, result;
+		flag = portal->fetchGeometry(poly);
+		TePolygon pol = TeConvexHull(poly);
+		result.add(pol[0]);
+		convexHullSet.add(result);
+	} while (flag);
+	
+	delete portal;
+	return true;
+}
+
+bool TeGetCentroid(const string& actGeomTable, TeGeomRep actRep, TeDatabase* db, TePointSet& centroidSet, Keys& actIds, const string& actCollTable)
+{
+	TeDatabasePortal* portal = db->getPortal();
+	string Ids = getStringIds(actIds);
+
+	string select = " SELECT * "; 
+	string from  =  " FROM " + actGeomTable;
+	string where =  " WHERE 1=1 ";
+
+	if(!actCollTable.empty())
+	{
+		select += ", "+ actCollTable;
+		where += " AND object_id = c_object_id ";
+	}
+
+	//if empty it calculates the centroids to all geometries 
+	if(!Ids.empty())
+		where += " AND object_id IN ("+ Ids +")";
+			
+	string orderBy = " ORDER BY object_id ASC ";
+	
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")
+		orderBy += ", parent_id ASC, num_holes DESC ";
+	
+	// ---- progress bar 
+	int numSteps = 0;
+	string sqlProg = " SELECT COUNT(*) "+ from + where; 
+	if(portal->query(sqlProg) && portal->fetchRow())
+		numSteps = portal->getInt(0);
+	
+	portal->freeResult();
+
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(numSteps);
+	//------
+	
+	string sql = select + from + where + orderBy;
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	string lastObjId ="";
+	int step = 0;
+	do
+	{
+		TeCoord2D coord;
+		string objId;
+		
+		if(actRep == TePOLYGONS)
+		{
+			TePolygon p;
+			flag = portal->fetchGeometry(p);
+			objId = p.objectId();
+			if(lastObjId==objId)
+				continue;
+			coord = TeFindCentroid(p);
+		}
+		else if (actRep == TeLINES)
+		{
+			TeLine2D l;
+			flag = portal->fetchGeometry(l);
+			objId = l.objectId ();
+			if(lastObjId==objId)
+				continue;
+			coord = TeFindCentroid(l);
+		}
+		else if (actRep == TeCELLS)
+		{
+			TeCell c;
+			flag = portal->fetchGeometry(c);
+			objId = c.objectId ();
+			if(lastObjId==objId)
+				continue;
+			coord = TeFindCentroid(c);
+		}
+		
+		lastObjId = objId;
+		TePoint point(coord);
+		point.objectId (objId);
+		centroidSet.add(point);
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+
+	} while (flag);
+	
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	delete portal;
+	return true;
+}
+
+
+bool TeGetBuffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, TePolygonSet& bufferSet, double dist)
+{
+	
+	if(actIds.empty())
+		return false;
+	
+	string Ids = getStringIds(actIds);
+
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+	
+	string sql = " SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN ("+ Ids +")";
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+	
+	bool flag = true;
+	bool res = true;
+	do
+	{
+		TePolygonSet polSet;
+
+		if(actRep == TePOINTS)
+		{
+			TePoint p;
+			TePolygon pol;
+			flag = portal->fetchGeometry(p);
+			res = TeBUFFERREGION::TeBufferRegion(p.location(), dist, 16, pol);
+			polSet.add (pol);
+		}
+
+		else if(actRep == TeLINES)
+		{
+			TeLine2D l;
+			flag = portal->fetchGeometry(l);
+			res = TeBUFFERREGION::TeBufferRegion(l, dist, 8, polSet);
+		}
+
+		else if(actRep == TePOLYGONS)
+		{
+			TePolygon p;
+			flag = portal->fetchGeometry(p);
+			res = TeBUFFERREGION::TeBufferRegion(p, dist, 8, polSet);
+		}	
+
+		else if(actRep == TeCELLS)
+		{
+			TeCell c;
+			flag = portal->fetchGeometry(c);
+			res = TeBUFFERREGION::TeBufferRegion(TeMakePolygon(c.box()), dist, 8, polSet);
+		}	
+		
+		if(res)
+		{
+			for(unsigned int i=0; i<polSet.size(); i++)
+				bufferSet.add(polSet[i]);
+		}
+	
+	} while (flag && res);
+
+	delete portal;
+	return true;
+}
+
+
+bool TeGetOverlay(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, TeGeometryVect& geomVect, const short& operation)
+{
+	if((actIds.empty()) || (actRep!=TePOLYGONS && actRep!=TeCELLS))
+		return false;
+	
+	string Ids = getStringIds(actIds);
+
+	TeDatabasePortal* portal = db->getPortal();
+	if(!portal)
+		return false;
+
+	string sql = " SELECT * FROM " + actGeomTable;
+	sql += " WHERE object_id IN ("+ Ids +")";
+	sql += " ORDER BY object_id ASC ";
+	if(actRep == TePOLYGONS && portal->getDatabase()->dbmsName() != "PostGIS")	
+		sql += ", parent_id ASC, num_holes DESC ";
+	
+	if(!portal->query(sql) || !portal->fetchRow())
+	{
+		delete portal;
+		return false;
+	}
+		
+	bool flag = true;
+	TePolygonSet polSet1;
+	
+	if(actRep == TePOLYGONS)
+	{
+		TePolygon p;
+		flag = portal->fetchGeometry(p);
+		polSet1.add (p);
+	}
+	else if(actRep == TeCELLS)
+	{
+		TeCell c; 
+		flag = portal->fetchGeometry(c);
+		polSet1.add(TeMakePolygon(c.box()));
+	}
+
+	while (flag)
+	{
+		TePolygonSet polSet2, polInter;
+
+		if(actRep == TePOLYGONS)
+		{
+			TePolygon p;
+			flag = portal->fetchGeometry(p);
+			polSet2.add (p);
+		}	
+
+		else if(actRep == TeCELLS)
+		{
+			TeCell c;
+			flag = portal->fetchGeometry(c);
+			polSet2.add(TeMakePolygon(c.box()));
+		}
+		
+		if(operation==TeUNION)
+		{
+			if(!TeOVERLAY::TeUnion(polSet1, polSet2, polInter))
+				return false;
+		}
+		else if (operation==TeINTERSECTION)
+		{
+			if(!TeOVERLAY::TeIntersection(polSet1, polSet2, polInter))
+				return false;
+		}
+		else if (operation==TeDIFFERENCE)
+		{
+			if(!TeOVERLAY::TeDifference(polSet1, polSet2, polInter))
+				return false;
+		}
+
+		polSet1 = polInter;
+	}
+
+	TeGeometry* geom;
+	TePolygonSet* pol = new TePolygonSet();
+	*pol = polSet1;
+	geom = pol;
+	
+	geomVect.push_back (geom);
+	delete portal;
+	return true;
+}
+
+
+TeRaster*
+TeMask (TeRaster* rasterIn, TePolygon& poly, TeStrategicIterator st)
+{
+	TeRasterParams paramsInter(rasterIn->params());
+	
+	paramsInter.fileName_ = "";
+	paramsInter.decoderIdentifier_ = "MEM";
+	paramsInter.mode_ = 'c';
+	
+	TeRaster* rasterInter = new TeRaster(paramsInter);
+	if (!rasterInter->init())
+		return 0;
+
+	TeRaster::iteratorPoly it = rasterIn->begin(poly, st);
+	int nlines = it.nLinesInPoly();
+	int ncols = it.nColsInPoly();
+	while(!it.end())
+    {
+		int lin = it.currentLine();
+		int col = it.currentColumn();
+		int nbands = it.nBands();
+		vector<double> vals;
+		vals = (*(TeRaster::iterator)it);
+		for(int i=0; i<nbands; i++)
+			rasterInter->setElement (col, lin, vals[i], i);	
+		++it;
+	}
+	
+	TeRasterParams paramsOut(paramsInter);
+	paramsInter.mode_ = 'c';
+	
+	if((st==TeBoxPixelIn) || (st==TeBBoxPixelInters))
+	{
+		TeCoord2D pll = poly.box().lowerLeft();
+		TeCoord2D rll = rasterIn->index2Coord(pll);
+		pll = rasterIn->coord2Index(TeCoord2D(TeRound(rll.x()),TeRound(rll.y())));
+
+		paramsOut.ncols_ = ncols;
+		paramsOut.nlines_= nlines;
+		paramsOut.lowerLeftResolutionSize(pll.x(),pll.y(),paramsOut.resx_,paramsOut.resy_,ncols,nlines,true);  
+	}
+	else if((st==TeBoxPixelOut) || (st==TeBBoxPixelNotInters))
+	{
+		TeBox box = paramsInter.boundingBox();
+		double resx = paramsInter.resx_;
+		double resy = paramsInter.resy_;
+		paramsOut.boundingBoxResolution(box.x1()-resx, box.y1()-resy, box.x2()+resx, box.y2()+resy,resx,resy);  
+	}
+
+	TeRaster* rasterOut = new TeRaster(paramsOut);
+
+	TeRasterRemap remap(rasterInter, rasterOut);
+	if (!remap.apply())			
+		return rasterIn;
+
+	delete rasterInter;
+	return rasterOut;
+}
+
+
+
+
+
diff --git a/src/terralib/kernel/TeSpatialOperations.h b/src/terralib/kernel/TeSpatialOperations.h
new file mode 100644
index 0000000..802db63
--- /dev/null
+++ b/src/terralib/kernel/TeSpatialOperations.h
@@ -0,0 +1,206 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSpatialOperations.h
+    This file contains functions to spatial operations with  
+	geographical objects that are in a SGBD 
+*/
+
+#ifndef  __TERRALIB_INTERNAL_SPATIALOPERATIONS_H
+#define  __TERRALIB_INTERNAL_SPATIALOPERATIONS_H
+
+#include "TeDatabase.h"
+#include "TeRaster.h"
+
+//! Keep the selected geometries in the canvas
+typedef vector<TeGeometry*> TeSelectedGeom;
+
+//! Return a string with the identifications of the selected geometries 
+string  getStringIds(Keys& IdsIn);
+
+
+//! Return a portal with the geometries of a spatial table that have a topological relation with specifics geometries of this spatial table
+/*!
+	Calculate the topological relation between all geometries of a spatial table and
+	specifics geometries of this spatial table
+	\param actGeomTable	spatial table name that contains all the geometries
+	\param actRep		geometrical representation of the spatial table 
+	\param actIdsIn		identifications of the specifics geometries (object_id)
+	\param portal		returned with the resultants geometries 
+	\param relation		topological relation that will be computed
+	\param actColTable	collection table name that contains a set of geometries of the spatial table 
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   TeDatabasePortal *portal, int relation, const string& actColTable="");
+
+
+//! Return a portal with the geometries of a spatial table that have a topological relation with specifics geometries of other spatial table 
+/*!
+	Calculate the topological relation between all geometries of a spatial table and
+	specifics geometries of other spatial table
+	\param actGeomTable	first spatial table name that contains the specifics geometries
+	\param actRep		geometrical representation of the first spatial table 
+	\param actIdsIn		identifications of specifics geometries of the first spatial table (object_id)
+	\param visGeomTable	second spatial table name that contains the others geometries
+	\param visRep		geometrical representation of the second spatial table 
+	\param portal		returned with the resultants geometries 
+	\param relation		topological relation that will be computed 
+	\param visColTable	collection table name that contains a set of geometries of the second spatial table 
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   const string& visGeomTable, TeGeomRep visRep, TeDatabasePortal *portal, 
+						   int relation, const string& visColTable="");
+
+
+//! Return a portal with the geometries of a spatial table that have a topological relation with a specific geometry  
+/*!
+	Calculate the topological relation between all geometries of a spatial table and a specific geometry 
+	\param actGeomTable	spatial table name that contains the geometries
+	\param actRep		geometrical representation of the spatial table 
+	\param geom			a specific geometry 
+	\param portal		returned with the resultants geometries 
+	\param relation		topological relation that will be computed 
+	\param actCollTable	collection table name that contains a set of geometries of the spatial table 
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, 
+						   TeDatabasePortal *portal, int relation, const string& actCollTable="");
+
+
+//! Return the identications of the geometries of a spatial table that have a topological relation with specifics geometries of this spatial table
+/*!
+	Calculate the topological relation between all geometries of a spatial table and
+	specifics geometries of this spatial table
+	\param actGeomTable	spatial table name that contains all the geometries
+	\param actRep		geometrical representation of the spatial table 
+	\param actIdsIn		identifications of the specifics geometries (object_id)
+	\param actIdsOut	returned with the identications of the resultants geometries (object_id)
+	\param db			a TeDatabase pointer 
+	\param relation		topological relation that will be computed 
+	\param actCollTable	collection table name that contains a set of geometries of the spatial table 
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable="");
+
+
+//! Return the identications of the geometries of a spatial table that have a topological relation with specifics geometries of other spatial table 
+/*!
+	Calculate the topological relation between all geometries of a spatial table and
+	specifics geometries of other spatial table
+	\param actGeomTable	first spatial table name that contains the specifics geometries
+	\param actRep		geometrical representation of the first spatial table 
+	\param actIdsIn		identifications of specifics geometries of the first spatial table (object_id)
+	\param visGeomTable	second spatial table name that contains the others geometries
+	\param visRep		geometrical representation of the second spatial table 
+	\param visIdsOut	returned with the identications of the resultants geometries (object_id)
+	\param db			a TeDatabase pointer 
+	\param relation		topological relation that will be computed 
+	\param visCollTable	collection table name that contains a set of geometries of the second spatial table 
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, 
+						   const string& visGeomTable, TeGeomRep visRep, Keys& visIdsOut, 
+						   TeDatabase* db, int relation, const string& visCollTable="");
+
+//! Return the identications of the geometries of a spatial table that have a topological relation with a specific geometry  
+/*!
+	Calculate the topological relation between all geometries of a spatial table and a specific geometry 
+	\param actGeomTable	spatial table name that contains the geometries
+	\param actRep		geometrical representation of the spatial table 
+	\param geom			a specific geometry 
+	\param actIdsOut	returned with the identications of the resultants geometries (object_id)
+	\param db			a TeDatabase pointer 
+	\param relation		topological relation that will be computed 
+	\param actCollTable	collection table name that contains a set of geometries of the spatial table 
+*/
+bool TeTopologicalRelation(const string& actGeomTable, TeGeomRep actRep, TeGeometry* geom, 
+						   Keys& actIdsOut, TeDatabase* db, int relation, const string& actCollTable="");
+
+
+//! Returns the geometries of a geometric table (actGeomTable) that are within a specific distance from a point in memory 
+/*!
+	  \param actGeomTable	geometric table name
+	  \param actRep			geometric representation of the actGeomTable table
+	  \param point			a point in memory
+	  \param IdsDistOut		structure that will contain the identifiers of the resulted geometries and their distances
+	  \param db				a TeDatabase pointer 
+	  \param max_dist		maximum distance 
+	  \param actCollTable	collection table name associated with the actGeomTable table
+*/
+bool TeGetWithinDistance(const string& actGeomTable, TeGeomRep actRep, const TeCoord2D& point, KeysToDist& IdsDistOut,
+						 TeDatabase* db, const double& max_dist, const string& actCollTable="");
+
+
+//! Return the area of some specifics geometries of a spatial table 
+/*!
+	\param actGeomTable	spatial table name that contains the geometries
+	\param actRep		geometrical representation of the spatial table 
+	\param actIdsIn		identifications of the specifics geometries (object_id)
+	\param db			a TeDatabase pointer 
+	\param area			area returned
+*/
+bool TeGetArea(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& area);
+
+
+//! Return the length of some specifics geometries of a spatial table 
+bool TeGetLength(const string& actGeomTable, TeGeomRep actRep, Keys& actIdsIn, TeDatabase* db, double& length);
+
+
+//! Return the distance between two geometries
+bool TeGetDistance(const string& actGeomTable, TeGeomRep actRep, Keys& IdsIn, TeDatabase* db, double& distance);
+
+//! Return the convexhull geometries of specifics geometries of a spatial table 
+/*!
+	\param actGeomTable		spatial table name that contains the geometries
+	\param actRep			geometrical representation of the spatial table 
+	\param actIds			identifications of the specifics geometries (object_id)
+	\param db				a TeDatabase pointer 
+	\param convexHullSet	the convexhull geometries returned
+*/
+bool TeGetConvexHull(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, 
+					 TePolygonSet& convexHullSet);
+
+
+//! Return the centroids of specifics geometries of a spatial table 
+bool TeGetCentroid(const string& actGeomTable, TeGeomRep actRep, TeDatabase* db, TePointSet& centroidSet,
+				   Keys& actIds, const string& actCollTable="");
+
+
+//! Return the buffer 
+bool TeGetBuffer(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, 
+				 TePolygonSet& bufferSet, double dist);
+
+
+//! Return intersection
+bool TeGetOverlay(const string& actGeomTable, TeGeomRep actRep, Keys& actIds, TeDatabase* db, 
+				  TeGeometryVect& geomVect, const short& operation);
+
+/*!	
+	\brief Clip a raster from a polygon. Return the clipped raster 
+	\param rasterIn	TeRaster pointer that will be clipped
+	\param poly		polygon that defines the clipping
+	\param st		strategic to the iterator of the raster  
+*/
+TeRaster*
+TeMask (TeRaster* rasterIn, TePolygon& poly, TeStrategicIterator st);
+
+#endif
+
diff --git a/src/terralib/kernel/TeStatistics.h b/src/terralib/kernel/TeStatistics.h
new file mode 100644
index 0000000..e090a78
--- /dev/null
+++ b/src/terralib/kernel/TeStatistics.h
@@ -0,0 +1,664 @@
+//***********************************************************************
+//      TerraLib is a GIS Classes and Functions Library that 
+//      strongly explores Spatial Database Technologies 
+//
+//      Copyright � 2002 INPE and Tecgraf/PUC-Rio. 
+//
+//      This library is free software; you can redistribute it 
+//      and/or modify it under the terms of the GNU Lesser General 
+//      Public License as published by the Free Software Foundation
+//      version 2.1.(http://www.opensource.org/licenses/lgpl-license.php)
+//
+//      
+//
+//      Send questions or suggestions about the TerraLib Project 
+//      to terralib at dpi.inpe.br .
+//**************************************************************************//
+/*! \file TeStatistics.h
+    This file contains functions for calculate statistics  
+*/
+
+#ifndef TeStatistics_H
+#define TeStatistics_H
+
+#include "TeDataTypes.h"
+
+#include <string>
+#include <map>
+
+using namespace std;
+
+//! vector of statistics
+typedef vector<double>	stats;
+
+
+/*!	\struct TeStatisticsDimension
+	Associate a statistics set for each dimension 
+*/
+struct TeStatisticsDimension
+{
+	int					dimension_;
+	TeStatisticValMap	stat_;
+
+	TeStatisticsDimension(int d, TeStatisticValMap& st): 
+	dimension_(d), 
+	stat_(st)
+	{}
+};
+
+//! vector of the statistics associated with the dimensions 
+typedef vector<TeStatisticsDimension>	TeStatisticsDimensionVect;
+
+//! map each value to its count: histogram
+typedef map<double, int> TeHistogram;
+
+
+/*!	\function TeCalculateHistogram
+	\brief Calculate the histrogram of a set of values kept in a data structure 
+	\param itBegin	the iterator to the begin of the data structure 
+	\param itEnd	the iterator to the end of the data structure
+	\param stat		returned histogram  
+*/
+template<typename T>
+bool TeCalculateHistogram(const T& itBegin, const T& itEnd, TeHistogram& histOut)  
+{
+	T it = itBegin;
+
+	//initialization 
+	while(it!=itEnd)
+	{
+		double val = (*it); 
+		histOut[val] = 0;
+		it++;
+	}
+	
+	it= itBegin;
+	
+	//calcule histogram
+	while(it!=itEnd)
+	{
+		double val = (*it); 
+		histOut[val]++;
+		it++;
+	}
+	
+	return true;
+}
+
+/*!	\function TeCalculateStatistics
+	\brief Calculate the statistics of a specific dimension of a data structure 
+	\param itBegin	the iterator to the begin of the data structure
+	\param itEnd	the iterator to the end of the data structure
+	\param stat		returned statistics  
+	\param dim		the dimension of the data structure  
+*/
+template<typename It>  
+bool TeCalculateStatistics(const It& itBegin, const It& itEnd, TeStatisticValMap& stat, int dim)
+{
+	double	sum, mean, minValue, maxValue, variance, assim, 
+			curtose, stDev, coefVar, amplitude, moda, median;  
+	sum=mean=variance=assim=curtose=stDev=coefVar=amplitude=0.0;
+	
+	minValue = TeMAXFLOAT;
+	maxValue = TeMINFLOAT;
+
+	vector<double> values;
+	int count=0;
+	int countTotal = 0;
+	It itt = itBegin;	
+	while(itt != itEnd)
+    {
+		double val;
+		val = (*itt)[dim];
+		
+		if(val!=TeMAXFLOAT)  // MAXFLOAT is considered invalid value
+		{
+			values.push_back (val);
+			sum += val;
+		
+			if(minValue>val)
+				minValue = val;
+			if(maxValue<val)
+				maxValue = val;
+			
+			++count;
+			mean = sum/count;
+		}
+		
+		++itt;
+		++countTotal;
+	}
+
+	for(int i=0; i<count; i++)
+	{
+		double v= values[i];
+		variance += pow((v-mean),2); 
+		assim += pow((v-mean),3);   
+		curtose += pow((v-mean),4); 
+	}
+	
+	if(!count)
+		return false;
+
+	variance /= count; 
+	stDev = pow(variance,0.5); 
+	assim /= count;
+	assim /= pow(stDev,3); 
+	curtose /= count;
+	curtose /= pow(stDev,4); 
+
+	coefVar = (100*stDev)/mean;
+	amplitude = maxValue-minValue;  
+
+	sort(values.begin(), values.end());
+		
+	//calculate median 
+	if((count%2)==0)
+		median = (values[(count/2)]+values[(count/2-1)])/2;
+	else
+		median = values[(count-1)/2];
+
+	//calculate the mode
+	TeHistogram histog;
+	TeCalculateHistogram(values.begin(),values.end(), histog);
+		
+	TeHistogram::iterator itHist = histog.begin();
+	int nCount=0;
+	while(itHist!=histog.end())
+	{
+		int hCount = itHist->second; 
+		if (hCount > nCount)
+		{
+			nCount = hCount;
+			moda = itHist->first;
+		}
+		itHist++;	
+	}
+	
+	//fill results
+	stat[TeCOUNT] = countTotal; 
+	stat[TeVALIDCOUNT] = count;
+	stat[TeMINVALUE] = minValue;
+	stat[TeMAXVALUE] = maxValue;
+	stat[TeSUM] = sum;
+	stat[TeMEAN] = mean;
+	stat[TeSTANDARDDEVIATION] = stDev;
+	stat[TeVARIANCE] = variance;
+	stat[TeSKEWNESS] = assim;
+	stat[TeKURTOSIS] = curtose;
+	stat[TeAMPLITUDE] = amplitude;
+	stat[TeMEDIAN] = median;		
+	stat[TeVARCOEFF] = coefVar;		
+	stat[TeMODE] = moda;
+ 
+	return true;
+}
+
+
+/*!	\function TeCalculateStatistics
+	\brief Calculate the statistics of a string data structure 
+	\param itBegin	the iterator to the begin of the data structure
+	\param itEnd	the iterator to the end of the data structure
+	\param stat		returned string statistics  
+*/
+template<typename It>  
+bool TeCalculateStatistics(const It& itBegin, const It& itEnd, TeStatisticStringValMap& stat)
+{
+	string min, max, val;
+	int	count = 0;
+
+	It it = itBegin;
+	int totalCount = 0;
+
+	if(it != itEnd)
+		min = max = (*it);
+	while(it != itEnd)
+	{
+		val = (*it);
+		if(val.empty() == false)
+		{
+			count++;
+			min = MIN(min, val);
+			max = MAX(max, val);
+		}
+		++it;
+		++totalCount;
+	}
+
+	stat[TeMINVALUE] = min;
+	stat[TeMAXVALUE] = max;
+	stat[TeCOUNT] = Te2String(totalCount); 
+	stat[TeVALIDCOUNT] = Te2String(count); 
+	return true;
+}
+
+
+/*!	\function TeCalculateStatistics
+	\brief Calculate the statistics of a data structure 
+	\param itBegin	the iterator to the begin of the data structure
+	\param itEnd	the iterator to the end of the data structure
+	\param stat		returned statistics  
+*/
+template<typename It>  
+bool TeCalculateStatistics(const It& itBegin, const It& itEnd, TeStatisticValMap& stat)
+{
+	double	sum, mean, minValue, maxValue, variance, assim, 
+			curtose, stDev, coefVar, amplitude, moda, median;  
+	sum=mean=variance=assim=curtose=stDev=coefVar=amplitude=0.0;
+	
+	minValue = TeMAXFLOAT;
+	maxValue = TeMINFLOAT;
+
+	vector<double>	values;
+
+	int	totalCount = 0;
+	int count=0;
+	It itt = itBegin;	
+	while(itt != itEnd)
+    {
+		double val = (*itt);
+		if(val != TeMAXFLOAT) // MAXFLOAT is considered invalid value
+		{
+			values.push_back (val);
+			sum += val;
+			minValue = MIN(minValue, val);
+			maxValue = MAX(maxValue, val);
+		}
+		
+		++itt;
+		++totalCount;
+	}
+
+	count = values.size();
+	mean = sum/count;
+
+	for(int i=0; i<count; i++)
+	{
+		double v= values[i];
+		variance += pow((v-mean),2); 
+		assim += pow((v-mean),3);   
+		curtose += pow((v-mean),4); 
+	}
+	
+	if(!count)
+		return false;
+
+	variance /= count; 
+	stDev = pow(variance,0.5); 
+	assim /= count;
+	assim /= pow(stDev,3); 
+	curtose /= count;
+	curtose /= pow(stDev,4); 
+
+	coefVar = (100*stDev)/mean;
+	amplitude = maxValue-minValue;  
+
+	sort(values.begin(), values.end());
+		
+	//calculate median 
+	if((count%2)==0)
+		median = (values[(count/2)]+values[(count/2-1)])/2;
+	else
+		median = values[(count-1)/2];
+
+	//calculate the mode
+	TeHistogram histog;
+	TeCalculateHistogram(values.begin(),values.end(), histog);
+		
+	TeHistogram::iterator itHist = histog.begin();
+	int nCount=0;
+	while(itHist!=histog.end())
+	{
+		int hCount = itHist->second; 
+		if (hCount > nCount)
+		{
+			nCount = hCount;
+			moda = itHist->first;
+		}
+		itHist++;	
+	}
+	
+	//fill results
+	stat[TeVALIDCOUNT] = count; 
+	stat[TeCOUNT] = totalCount; 
+	stat[TeMINVALUE] = minValue;
+	stat[TeMAXVALUE] = maxValue;
+	stat[TeSUM] = sum;
+	stat[TeMEAN] = mean;
+	stat[TeSTANDARDDEVIATION] = stDev;
+	stat[TeVARIANCE] = variance;
+	stat[TeSKEWNESS] = assim;
+	stat[TeKURTOSIS] = curtose;
+	stat[TeAMPLITUDE] = amplitude;
+	stat[TeMEDIAN] = median;		
+	stat[TeVARCOEFF] = coefVar;		
+	stat[TeMODE] = moda;
+ 
+	return true;
+}
+
+
+/*!	\function TeCalculateStatistics
+	\brief Calculate the statistics of all dimensions of a data structure 
+	\param itBegin	the iterator to the begin of the data structure
+	\param itEnd	the iterator to the end of the data structure
+	\param stat		returned statistics  
+*/
+template<typename It>  
+bool TeCalculateStatistics(It& itBegin, It& itEnd, TeStatisticsDimensionVect& stat)
+{
+	
+	vector<double>	sum, mean, minValue, maxValue, variance, assim, curtose, 
+					stDev, coefVar, amplitude, moda, median;  
+	
+	int nb = itBegin.nBands();
+	
+	//initialization of the vetors
+	for (int i=0; i<nb; i++)
+	{
+		sum.push_back(0.0); 
+		mean.push_back(0.0); 
+		variance.push_back(0.0);
+		assim.push_back(0.0); 
+		curtose.push_back(0.0); 
+		stDev.push_back(0.0);
+		coefVar.push_back(0.0);	
+		amplitude.push_back(0.0);
+		median.push_back (0.0);
+		moda.push_back (0.0);
+		minValue.push_back(TeMAXFLOAT);
+		maxValue.push_back(TeMINFLOAT);
+	}
+			
+	map<int,stats> bandValues;
+	
+	int count=0;
+	It itt = itBegin;	
+	
+	while(itt != itEnd)
+    {
+		for (int j=0; j<nb; j++)
+		{
+			double val = itt.operator* (j);
+			bandValues[j].push_back(val);
+			sum[j] += val;
+			
+			if(minValue[j]>val)
+				minValue[j] = val;
+			if(maxValue[j]<val)
+				maxValue[j] = val;
+
+			int size = bandValues[j].size();
+			mean[j] = sum[j]/size;
+		}
+		
+		++itt;
+		++count;
+	}
+
+	if(!count)
+		return false;
+
+	for (int jj=0; jj<nb; jj++)
+	{
+		for(int i=0; i<count; i++)
+		{	
+			double v = bandValues[jj][i];
+			variance[jj] += pow((v-mean[jj]),2);
+			assim[jj] += pow((v-mean[jj]),3);
+			curtose[jj] += pow((v-mean[jj]),4);
+		}
+
+		variance[jj] /= count;
+		stDev[jj] = pow(variance[jj],0.5);
+		assim[jj] /= count;
+		assim[jj] /= pow(stDev[jj],3);
+		curtose[jj] /= count;
+		curtose[jj] /= pow(stDev[jj],4);
+
+		coefVar[jj] = (100*stDev[jj])/mean[jj];
+		amplitude[jj] = maxValue[jj]-minValue[jj];
+
+		sort(bandValues[jj].begin(), bandValues[jj].end());
+		
+		//calculate median
+		if((count%2)==0)
+			median[jj] = ((bandValues[jj][(count/2)])+(bandValues[jj][(count/2-1)]))/2;
+		else
+			median[jj] = bandValues[jj][(count-1)/2];
+
+		//calculate the mode
+		TeHistogram histog;
+		TeCalculateHistogram(bandValues[jj].begin(),bandValues[jj].end(), histog);
+			
+		TeHistogram::iterator itHist = histog.begin();
+		int nCount=0;
+		while(itHist!=histog.end())
+		{
+			int hCount = itHist->second; 
+			if (hCount > nCount)
+			{
+				nCount = hCount;
+				moda[jj] = itHist->first;
+			}
+			itHist++;	
+		}
+			
+		//fill results
+		TeStatisticValMap statVal;
+
+		statVal[TeCOUNT] = count; 
+		statVal[TeMINVALUE] = minValue[jj];
+		statVal[TeMAXVALUE] = maxValue[jj];
+		statVal[TeSUM] = sum[jj];
+		statVal[TeMEAN] = mean[jj];
+		statVal[TeSTANDARDDEVIATION] = stDev[jj];
+		statVal[TeVARIANCE] = variance[jj];
+		statVal[TeSKEWNESS] = assim[jj];
+		statVal[TeKURTOSIS] = curtose[jj];
+		statVal[TeAMPLITUDE] = amplitude[jj];
+		statVal[TeMEDIAN] = median[jj];
+		statVal[TeVARCOEFF] = coefVar[jj];
+		statVal[TeMODE] = moda[jj];
+
+		TeStatisticsDimension statBand(jj, statVal);
+		stat.push_back(statBand);
+	}
+	
+	return true;
+}
+
+
+//!	Returns the sum of the elements of a specific dimension 
+template <typename It> 
+double TeSum (It begin, It end, int dim)
+{
+	double sum = 0.;
+	while ( begin != end)
+	{
+		if(((*begin)[dim])!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+			sum += (*begin)[dim];
+		
+		++begin;
+	}
+	return sum;
+}
+
+
+//!	Return the sum of the elements
+template <typename It> 
+double TeSum (It begin, It end)
+{
+	double sum = 0.;
+	while ( begin != end)
+	{
+		if((*begin)!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+			sum += (*begin);
+		
+		++begin;
+	}
+	return sum;
+}
+
+
+//! calculates the mean (first moment) of the elements of a specific dimension
+template <typename It> 
+double TeFirstMoment (It begin, It end, int dim)
+{
+	int number = 0;
+	double mean = 0.;
+	while (begin != end)
+	{
+		if(((*begin)[dim])!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+		{
+			mean += (*begin)[dim];
+			number++; 
+		}
+		++begin;
+	}
+	return mean /= number;
+}
+
+
+//! calculates the mean (first moment) of the elements
+template <typename It> 
+double TeFirstMoment (It begin, It end)
+{
+	int number = 0;
+	double mean = 0.;
+	while (begin != end)
+	{
+		if((*begin)!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+		{
+			mean += (*begin);
+			number++; 
+		}
+		begin++;
+	}
+	return mean /= number;
+}
+
+
+//! calculates the second moment
+template <typename It> 
+double TeSecondMoment (It begin, It end, double mean)
+{
+	int number = 0;
+	double SSD = 0;  //sum of squares of desviation
+
+	while (begin != end)
+	{
+		if((*begin)!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+		{
+			SSD += pow(( (*begin) - mean), 2);
+			number++; 
+		}
+		begin++;
+	}
+	return SSD /= number;
+}
+
+
+//! calculates the second moment
+template <typename It> 
+double TeSecondMoment (It begin, It end, double mean, int dim)
+{
+	int number = 0;
+	double SSD = 0;  //sum of squares of desviation
+
+	while (begin != end)
+	{
+		if(((*begin)[dim])!= TeMAXFLOAT) // MAXFLOAT is considered invalid value
+		{
+			SSD += pow(((*begin)[dim] - mean), 2);
+			number++; 
+		}
+		++begin;
+	}
+	return SSD /= number;
+}
+
+
+
+//!	calculates the vector with the means of the attributs
+template <typename It, typename T> 
+bool TeMeanVector ( It begin, It end, T& result)
+{
+	int i = 0;
+	int dim = result.size();
+	T soma;
+
+	for (int m = 0; m < dim ; m++)
+		soma.push_back(0.);
+
+	while (begin != end)
+	{
+		for( int j = 0; j < dim; j++)
+		{
+			if(((*begin)[j]) != TeMAXFLOAT) // MAXFLOAT is considered invalid value 
+			{
+				soma[j]+= (*begin)[j];
+				i++;
+			}
+			else
+				soma[j]= TeMAXFLOAT;
+		}
+		begin++;
+	}
+	
+	for (int k = 0; k < dim; k++)
+	{
+		if(soma[k] != TeMAXFLOAT) 
+			result[k] = soma[k]/i;
+		else
+			result[k] = TeMAXFLOAT;
+	}
+
+	return true;
+}
+
+//! calculates the deviations in relation to mean
+template <typename It> 
+bool TeDeviation ( It begin, It end, It result, double mean)
+{
+	while (begin != end)
+	{
+		if((*begin) != TeMAXFLOAT) // MAXFLOAT is considered invalid value 
+			*result = double(*begin) - mean;
+		else
+			*result = TeMAXFLOAT;
+
+		begin++; result++;
+	}
+	return true;
+}
+
+
+//! calculates the deviations in relation to mean
+// Keep the result in the ObjsSet
+template <typename iteratorSet> 
+bool TeDeviation ( iteratorSet begin, iteratorSet end, double mean, int index=0)
+{
+	while (begin != end)
+	{
+		double result;
+		
+		if(((*begin)[index]) != TeMAXFLOAT) // MAXFLOAT is considered invalid value 
+			result = ((*begin)[index]) - mean;
+		else
+			result = TeMAXFLOAT;
+		
+		TeAttributeRep attrRep;
+		attrRep.name_ = "Z";
+		attrRep.type_ = TeREAL;
+
+		(*begin).addProperty(result, attrRep, false); 
+
+		++begin; 
+	}
+	return true;
+}
+
+
+#endif
+
diff --git a/src/terralib/kernel/TeStdFile.cpp b/src/terralib/kernel/TeStdFile.cpp
new file mode 100644
index 0000000..86d8f8b
--- /dev/null
+++ b/src/terralib/kernel/TeStdFile.cpp
@@ -0,0 +1,60 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include "TeStdFile.h"
+#include "TeException.h"
+
+
+
+// -- Constructor
+
+TeStdFile::TeStdFile ( const string& name, const char* mode ):
+	file_ ( 0 ), fileName_ ( name ), mode_ ( mode )
+{
+	const char* inputFile = fileName_.c_str();
+	if ( name.size() <= 1 )
+		throw TeException ( EMPTY_FILE_NAME, name, false );
+	
+	if ( ( file_ = fopen( inputFile, mode ) ) == 0 )
+	{
+		bool hasErrno = true;
+		throw TeException ( CANNOT_OPEN_FILE, name, hasErrno );
+	}
+}
+
+TeStdFile::~TeStdFile() 
+{ 
+	if(file_ ) 
+		fclose(file_);
+}
+
+void
+TeStdFile::rewind()
+{
+	if (file_)
+		fseek(file_,0,0);
+}
diff --git a/src/terralib/kernel/TeStdFile.h b/src/terralib/kernel/TeStdFile.h
new file mode 100644
index 0000000..74396fe
--- /dev/null
+++ b/src/terralib/kernel/TeStdFile.h
@@ -0,0 +1,81 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_STDFILE_H
+#define  __TERRALIB_INTERNAL_STSFILE_H
+
+#include <stdio.h>
+#include <string>
+using namespace std;
+
+//! A class for handling "stdio" files
+/*  Provide support for using a file as a class, and 
+    throws exceptions if things go wrong
+	\sa TeException TeAsciiFile
+*/
+class TeStdFile {
+public:
+
+//! Simple constructor taking the file name and the mode of oppening
+		TeStdFile(const string& name, const char* mode = "r");
+	
+	virtual ~TeStdFile(); 
+
+//! Return true if the file pointer is not at the end of file
+	bool isNotAtEOF()
+	{ 
+		if ( feof ( file_ ) != 0  )
+			return false;
+		return true;
+	}
+
+// name
+	string name ()
+	{ return fileName_; }
+
+// -- operator ()	
+	operator FILE*() { return file_; }
+
+// -- returns the file pointer
+	FILE* FilePtr() { return file_; }
+
+	void rewind();
+
+protected:
+	
+// -- File pointer
+
+	FILE *file_;
+	string fileName_;
+	string mode_;
+
+private:
+	
+// No copy allowed
+	TeStdFile(const TeStdFile&);
+	TeStdFile& operator=(const TeStdFile&);
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/TeStdIOProgress.h b/src/terralib/kernel/TeStdIOProgress.h
new file mode 100644
index 0000000..8401582
--- /dev/null
+++ b/src/terralib/kernel/TeStdIOProgress.h
@@ -0,0 +1,60 @@
+#ifndef TeSTDIOPROGRESS_H
+#define TeSTDIOPROGRESS_H
+
+#include "TeProgressBase.h"
+#include <iostream>
+
+class TeStdIOProgress : public TeProgressBase
+{
+public:
+
+	//! Constructor
+	TeStdIOProgress() :
+		totsteps(0),
+		nsteps(0),
+		curstep(-1)
+	{}
+
+	//! Destructor
+	~TeStdIOProgress() {}
+
+	//! Sets the total number of steps to n 
+	void setTotalSteps(int n) { totsteps = n; }
+
+	//! Sets the current amount of progress made to n
+	void setProgress(int n) 
+	{ 
+		if (totsteps > 0) 
+		{
+			int aux = (int)((n*100)/totsteps);
+			if (aux != curstep)
+			{
+				curstep = aux;
+				cout << curstep << "% ";
+				cout.flush();
+			}
+		}
+	}
+
+	//! Resets the progress interface
+	void reset() { totsteps = nsteps = 0; curstep = -1; }
+
+	//! Resets the progress dialog
+	void cancel() {};
+
+	//! Sets the label's text
+	void setMessage(const string& text) { cout << endl << text << endl;}
+
+	//! Returns true whether the process was cancelled
+	bool wasCancelled() { return false; }
+	
+	//! Sets the caption associated to the progress interface
+	void setCaption(const string& /*cap*/) {};
+
+private:
+	int totsteps;
+	int nsteps;
+	int curstep;
+
+};
+#endif
diff --git a/src/terralib/kernel/TeTable.cpp b/src/terralib/kernel/TeTable.cpp
new file mode 100644
index 0000000..24f868b
--- /dev/null
+++ b/src/terralib/kernel/TeTable.cpp
@@ -0,0 +1,348 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTable.h"
+#include "TeUtils.h"
+#include <iostream>
+
+using namespace std;
+
+
+string tableJoin(TeAttrTableVector& vecTable, string firstTable, string attrLink)
+{
+	string parClause = "";
+	string fromResult = "";
+	TeAttrTableVector::iterator it; 
+	
+	if(firstTable.empty())
+	{
+		//find the first static table
+		it = vecTable.begin();
+		while(it!=vecTable.end())
+		{
+			if((*it).tableType() != TeAttrExternal)
+			{
+				firstTable = (*it).name();
+				attrLink = (*it).linkName();
+				break;
+			}
+			++it;
+		}
+	}
+	
+	//if don�t exist a table static or temporal 
+	if(firstTable.empty() || attrLink.empty())	
+		return "";
+		
+	fromResult += firstTable;
+	it = vecTable.begin();
+
+	while(it!=vecTable.end())
+	{
+		if( ((*it).name()!=firstTable) && ((*it).tableType()!=TeAttrExternal))
+		{
+			fromResult += " LEFT JOIN "+ (*it).name() +" ON "+ firstTable;
+			fromResult += "."+ attrLink +" = "+ (*it).name() +"."+ (*it).linkName() +")";
+			parClause += "(";
+		}
+
+		else if ((*it).name()!=firstTable)
+		{
+			int idTableStatic = (*it).relatedTableId();
+			string colTableStatic = (*it).relatedAttribute();
+			string nameTableStatic;   
+
+			//verify if static table is in the vector of the attribute tables
+			for(unsigned int j=0; j<vecTable.size(); j++)
+			{
+				if(vecTable[j].id()==idTableStatic)
+				{
+					nameTableStatic = vecTable[j].name();
+					break;
+				}
+			}
+
+			if(nameTableStatic.empty())
+				return "";
+
+			fromResult += " LEFT JOIN "+ (*it).name() +" ON "+ nameTableStatic +"."+ colTableStatic;
+			fromResult += " = " + (*it).name() +"."+ (*it).linkName() +")";
+			parClause += "(";
+		}
+
+		++it;
+	}
+
+	return (parClause + fromResult);
+}
+
+
+// ---- Handle class - TeTable
+
+TeTable::TeTable():
+	id_(-1),
+	name_(""),
+	type_(TeAttrStatic),
+	order_(-1),
+	attLink_(""),
+	attUnique_(""),
+	separator_(','),
+	attInitialTime_(""),
+	attFinalTime_(""),
+	attTimeUnit_(TeSECOND),
+	relatedTableId_(-1),
+	relatedAttribute_("")
+{
+	pImpl_ = new TeTableImpl;
+	pImpl_->refCount_ = 1;	
+}
+
+TeTable::TeTable(const string& name):
+	id_(-1),
+	name_(name),
+	type_(TeAttrStatic),
+	order_(-1),
+	attLink_(""),
+	attUnique_(""),
+	separator_(','),
+	attInitialTime_(""),
+	attFinalTime_(""),
+	attTimeUnit_(TeSECOND),
+	relatedTableId_(-1),
+	relatedAttribute_("")
+{
+	pImpl_ = new TeTableImpl;
+	pImpl_->refCount_ = 1;	
+}
+
+TeTable::TeTable(const string& name, const TeAttributeList& attList, const string& uniqueName,
+				 const string& linkName, TeAttrTableType tableType):
+	id_(-1),
+	name_(name),
+	type_(tableType),
+	order_(-1),
+	attList_(attList),
+	attLink_(linkName),
+	attUnique_(uniqueName),
+	separator_(','),
+	attInitialTime_(""),
+	attFinalTime_(""),
+	attTimeUnit_(TeSECOND),
+	relatedTableId_(-1),
+	relatedAttribute_("")
+{
+	pImpl_ = new TeTableImpl;
+	pImpl_->refCount_ = 1;	
+}
+
+TeTable::~TeTable()
+{
+	if ( --(pImpl_->refCount_) <= 0 )
+		delete pImpl_;	
+	attList_.clear();
+}
+
+// Copy constructor
+// copies the representation pointer
+// increments the reference counter
+
+TeTable::TeTable(const TeTable& other)
+{
+	id_= other.id_;
+	name_ = other.name_;
+	type_ = other.type_;
+	attLink_ = other.attLink_;
+	attUnique_ = other.attUnique_;
+	separator_ = other.separator_;
+	order_ = other.order_;
+	attInitialTime_ = other.attInitialTime_;
+	attFinalTime_ = other.attFinalTime_;
+	attTimeUnit_ = other.attTimeUnit_;
+	attList_.clear();
+	attList_.resize(other.attList_.size());
+	attList_=other.attList_;
+	relatedTableId_ = other.relatedTableId_;
+	relatedTableName_ = other.relatedTableName_;
+	relatedAttribute_ = other.relatedAttribute_;
+	pImpl_ = other.pImpl_;
+	pImpl_->refCount_++;
+}
+
+// Operator =
+// Copies the representation pointer
+// Decrements the reference counter of the current object
+// Increments the reference counter for the new object
+TeTable& 
+TeTable::operator=(const TeTable& rhs)
+{
+	if ( this != &rhs )
+	{
+		rhs.pImpl_->refCount_++;
+	
+		if ( --(pImpl_->refCount_) <= 0 )
+			delete pImpl_;
+		pImpl_ = rhs.pImpl_;
+
+		separator_ = rhs.separator_;
+		attLink_ = rhs.attLink_;
+		attUnique_ = rhs.attUnique_;
+		order_ = rhs.order_;
+		attInitialTime_ = rhs.attInitialTime_;
+		attFinalTime_ = rhs.attFinalTime_;
+		attTimeUnit_ = rhs.attTimeUnit_;
+		type_ = rhs.type_;
+		name_ = rhs.name_;	
+		attList_.clear();
+		attList_ = rhs.attList_;
+		relatedTableId_ = rhs.relatedTableId_;
+		relatedTableName_ = rhs.relatedTableName_;
+		relatedAttribute_ = rhs.relatedAttribute_;
+		id_ = rhs.id_;
+	}
+	return *this;
+}
+
+bool 
+TeTable::setTableType( TeAttrTableType attType, int relatedTableId, const string& relatedAttribute)
+{ 
+	type_ = attType; 
+	if ( attType == TeAttrExternal && relatedTableId > 0 && !relatedAttribute.empty())
+	{
+		relatedTableId_ = relatedTableId;
+		relatedAttribute_ = relatedAttribute;
+
+		return true;
+	}
+	return false;
+}
+
+void
+TeTable::add ( const TeTableRow& row )
+{
+	pImpl_->add ( row );
+}
+
+void
+TeTable::setValue (int row, int col, string& val)
+{
+	pImpl_->setValue (row,col,val);
+}
+
+unsigned int
+TeTable::size ()
+{
+	return pImpl_->size();
+}
+
+void TeTable::clear ()
+{
+	pImpl_->clear();
+}
+
+TeTableRow
+TeTable::operator [] (int i) 
+{
+	return pImpl_->operator [] ( i );
+}
+
+string 
+TeTable::operator () ( int row, int col )
+{
+	return pImpl_->operator () (row, col );
+}
+
+
+bool
+TeTable::attrLink(TeAttribute& att)
+{	
+	TeAttributeList::iterator it = attList_.begin();
+	while (it != attList_.end())
+	{
+		if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(attLink_))
+		{
+			att = (*it);
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
+
+bool 
+TeTable::attrUnique(TeAttribute& attr)
+{
+	TeAttributeList::iterator it = attList_.begin();
+	while(it!=attList_.end())
+	{
+		if(TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(attUnique_))
+		{
+			attr = (*it);
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
+
+int
+TeTable::attrLinkPosition()
+{
+	int i = 0;
+	TeAttributeList::iterator it = attList_.begin();
+	while (it != attList_.end())
+	{
+		if (TeConvertToUpperCase((*it).rep_.name_) == TeConvertToUpperCase(attLink_))
+			return i;
+		++it;
+		++i;
+	}
+	return -1;
+}
+
+bool 
+TeTable::attributeNames(vector<string>& attrs)
+{
+	attrs.clear();
+	TeAttributeList::iterator it = attList_.begin();
+	while(it!=attList_.end())
+	{
+		attrs.push_back((*it).rep_.name_);
+		++it;
+	}
+	return true;
+}
+
+
+void 
+TeTable::primaryKeys(vector<string>& keys)
+{
+	keys.empty();
+	TeAttributeList::iterator it = attList_.begin();
+	while(it!=attList_.end())
+	{
+		if((*it).rep_.isPrimaryKey_)
+			keys.push_back((*it).rep_.name_);
+		++it;
+	}
+	return;
+}
diff --git a/src/terralib/kernel/TeTable.h b/src/terralib/kernel/TeTable.h
new file mode 100644
index 0000000..4c15202
--- /dev/null
+++ b/src/terralib/kernel/TeTable.h
@@ -0,0 +1,393 @@
+ /************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTable.h
+    \brief This file contains class TeTable definitions.
+*/
+
+#ifndef  __TERRALIB_INTERNAL_TABLE_H
+#define  __TERRALIB_INTERNAL_TABLE_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <string>
+#include <vector>
+#include "TeComposite.h"
+using namespace std;
+
+#include "TeAttribute.h"
+
+class TeTableImpl;
+
+//! A table row is a vector of strings
+typedef vector<string> TeTableRow;
+
+//! The table implementation, this is the body class, of the handle/body idiom
+/*!
+	All members are private. This class is used only through the TeTable class
+*/
+class TeTableImpl: public TeComposite<TeTableRow>
+{
+
+friend class TeTable;
+
+	int refCount_;
+
+	//! Empty constructor
+	TeTableImpl(): refCount_(0){}
+
+	//! Returns the value of a cell in table
+	string operator () ( int row, int col )
+	{
+		return components_[row].operator[] ( col );
+	}
+
+	void setValue (int row, int col, string& val)
+	{
+		TeTableRow tRow = components_[row];
+		if (col >= (int)(tRow.size()))
+			tRow.resize(col+1);
+		tRow[col] = val;
+		components_[row] = tRow;
+	}
+
+};
+
+//! An attribute table in memory
+/*!
+	Instances of this classes represent non-spatial tables, or tables
+	that don�t have a spatial data as one of its columns.
+	The class stores the table schema and it also can store rows of data.
+
+	Rows of data are stored according to handle/hody idiom, to make
+	copies optimized.
+
+  \sa
+  TeAttribute TeTableImpl
+*/
+class TeTable {
+
+public:
+	//! Empty constructor
+	/*!
+		\note
+		Instance of TeTable will be created with the following default values:
+		\arg name: "" (empty)
+		\arg id_:  -1 (no database identifier)
+        \arg type_: static attribute table
+		\arg attList: empty list of attributes
+        \arg attLink_:	"" (no index to geometries)
+        \arg attUnique_: "" (no unique values)
+		\arg separator_: ','  comma separator (used to read ASCII tables from files)
+		\arg attInitialTime_: ""  no initial time information
+		\arg attFinalTime_: ""  no final time information
+		\arg attTimeUnit_: TeYear 
+		\arg relatedTableId: -1 (no relation to other table)
+		\arg relatedTableName: "" (name of the related table)
+		\arg relatedAttribute: "" (attribute of the related table)
+	*/
+	TeTable();
+
+	//! Constructor by name
+	/*!
+		\param name table name
+		\note
+		Instance of TeTable will be created with the following default values:
+		\arg id_:  -1 (no database identifier)
+        \arg tableType_: static attribute table
+		\arg attList: empty list of attributes
+        \arg attLink_:	"" (no index to geometries)
+        \arg attUnique_: "" (no unique values)
+		\arg separator_: ','  comma separator (used to read ASCII tables from files)
+		\arg attInitialTime_: ""  no initial time information
+		\arg attFinalTime_: ""  no final time information
+		\arg attTimeUnit_: TeYear 
+		\arg relatedTableId: -1 (no relation to other table)
+		\arg relatedTableName: "" (name of the related table)
+		\arg relatedAttribute: "" (attribute of the related table)
+	*/
+	TeTable(const string& name);
+
+	//! Constructor by name and attribute list
+	/*!
+      \param name table name
+      \param attList list of attributes
+	  \param uniqueName column that unique attributes to be used as a primary key
+	  \param linkName column that links attributes to geometries
+	  \param tableType type of attribute table
+	  \note
+		Instance of TeTable will be created with the following default values:
+	   \arg id_:  -1 (no database identifier)
+	   \arg separator_: ','  comma separator (used to read ASCII tables from files)
+	   \arg attInitialTime_: ""  no initial time information
+	   \arg attFinalTime_: ""  no final time information
+	   \arg attTimeUnit_: TeYear 
+	   \arg relatedTableId: -1 (no relation to other table)
+	   \arg relatedTableName: "" (name of the related table)
+	   \arg relatedAttribute: "" (attribute of the related table)
+	*/
+	TeTable(const string& name, const TeAttributeList& attList, const string& uniqueName,
+			const string& linkName="", TeAttrTableType tableType=TeAttrStatic);
+
+	 //! Destructor
+	~TeTable();
+
+	//! Copy Constructor
+	/*! Copies the representation pointer increments the reference counter	*/
+	TeTable(const TeTable&);
+
+	//! Operator =
+	/*!
+		Copies the representation pointer
+		Decrements the reference counter of the current object
+		Increments the reference counter for the new object
+	*/
+	TeTable& operator=(const TeTable&);
+
+// -- Methods
+
+	//! Returns the table name
+	string name()
+	{ return name_; }
+
+	//! Sets the table name
+	void name(const string& n)
+	{ name_ = n; }
+
+	//! Returns the unique id of the table in a database
+	int id() { return id_; }
+
+	//! Sets the id of the table
+	void setId(int n) { id_ = n; }
+
+	//! Set the position of the table in a join
+	void setOrder(int n) { order_ = n; }
+
+	//! Get the position of the table in a join
+	int getOrder() { return order_;}
+	
+	//! Defines the list of attributes of this table
+	void setAttributeList ( const TeAttributeList& attList)
+	{ attList_ = attList; }
+
+	//! Retrieves the list of attributes of this table
+	TeAttributeList& attributeList()
+	{ return attList_; }
+
+	//! Retrieves the list of attribute names of this table
+	bool attributeNames(vector<string>& attrs);
+	
+	//! Returns the type of this attribute table
+	TeAttrTableType tableType()
+	{ return type_; }
+
+	//! Sets the table separator
+	void setSeparator ( const char& c )
+	{ separator_ = c ; }
+
+	//! Returns the table separator
+	char separator ()
+	{ return separator_; }
+
+	//! Sets the table type
+	/*!
+      \param attType table type
+	  \note In case of external tables
+      \param relatedTableId is the id of the related table 
+	  \param relatedAttribute is column name of the related table
+	*/
+	bool setTableType( TeAttrTableType attType, int relatedTableId=-1, const string& relatedAttribute="");
+
+	//! Sets an attribute as the table index.
+	/*!
+		Index in this context, means an attribute that is a link between
+		the attribute table and a spatial table (a table of geometrical
+		representation of objects).
+	*/
+	void setLinkName ( const string& linkName ) { attLink_ = linkName;}
+
+	//! Returns the name of the column used as link between the attribute table and a spatial table
+	string linkName()
+	{	return attLink_; }
+
+	//! Sets the name of the column that has unique values
+	void setUniqueName ( const string& uniqueName ) { attUnique_ = uniqueName; }	
+
+	//! Returns the name of the column used as primary key
+	string uniqueName()
+	{	return attUnique_;	}
+
+	//! If there is one, returns the attribute used as an index
+	/*!
+		\param att to return the attribute used as an index
+		\return TRUE if there is an index, FALSE otherwise
+	*/
+	bool attrLink(TeAttribute& att);
+
+	//! If there is one, returns the attribute used as primary key
+	/*!
+		\param attr to return the attribute used as primary key
+		\return TRUE if there is an index, FALSE otherwise
+	*/
+	bool attrUnique(TeAttribute& attr);
+	
+
+	//! Returns the position of the link attribute in the attribute list
+	int attrLinkPosition();
+
+
+	/** @name External tables
+	    The following members are used to manipulate information about tables that
+		are external: don�t have a direct link to geometries, but can be linked by
+		a column to another attribute table
+	*/
+	//@{
+	//! Sets the  id of a table to which this is related (only for TeAttrExternal tables)
+	void relatedTableId(int id)
+	{   relatedTableId_ = id; }
+
+	//! Returns the id of a related table (only for TeAttrExternal tables)
+	int relatedTableId()
+	{   return relatedTableId_; }
+
+	//! Sets the name of a table to which this is related (only for TeAttrExternal tables)
+	void relatedTableName(string tableName)
+	{   relatedTableName_ = tableName; }
+
+	//! Returns the name of a related table (only for TeAttrExternal tables)
+	string relatedTableName()
+	{   return relatedTableName_; }
+
+	//! Set the name of a column to link to a related table (only for TeAttrExternal tables)
+	void relatedAttribute(const string& columnName)
+	{	relatedAttribute_ = columnName; }
+
+	//! Return the column that links to a related table (only for TeAttrExternal tables)
+	string relatedAttribute()
+	{ return relatedAttribute_; }
+
+	//@}
+
+	/** @name Temporal Attributes
+	    The following members are used to manipulate the attribute tables with temporal
+		information.
+		\par Temporal tables contains columns to store a time interval in which the 
+		 attributes (or a row) of an object is valid.
+	*/
+	//@{		
+
+	//! Sets the name of the column that has the initial time of the validity interval
+	void attInitialTime(const string& t)
+	{	attInitialTime_ = t; }
+
+	//! Returns the name of the column that has the initial time of the validity interval
+	string attInitialTime()
+	{	return attInitialTime_; }
+
+	//! Sets the name of the column that has the final time of the validity interval
+	void attFinalTime(const string& t)
+	{	attFinalTime_ = t; }
+
+	//! Returns the name of the column that has the final time of the validity interval
+	string attFinalTime()
+	{	return attFinalTime_; }
+
+	//! Sets the time unit relative to the validity interval
+	void attTimeUnit(TeChronon t)
+	{	attTimeUnit_ = t; }
+
+	//! Returns the time unit relative to the validity interval
+	TeChronon attTimeUnit()
+	{	return attTimeUnit_; }
+	//@}
+
+	/** @name Data in Memory
+	    The following members are used to manipulate rows of the table in memory
+	*/
+	//@{
+	//! Add a row to a table
+	void add ( const TeTableRow& row );
+
+	//! Returns the i-th row
+	TeTableRow operator [] ( int row ) ;
+
+	//! Returns the element indexed by (row,col)
+	string operator () ( int row, int col );
+
+	//! Sets the value of a cell indexed by row x col to value val
+	void setValue (int row, int col, string& val);
+
+	//! Returns the number of rows in a table
+	unsigned int size ();
+
+	//! Clears the table storage in memory
+	void clear ();
+	//@}
+
+	//! Returns the primary key names of the table 
+	void primaryKeys(vector<string>& keys);
+
+private:
+	
+	int					id_;	// unique id from a database where this table may be stored
+	string				name_;	// name
+	TeAttrTableType		type_;	// type of table
+	int					order_; // the table position relative to others in a join 
+
+	TeAttributeList		attList_;		// list of attributes
+	string				attLink_;		// attribute that links objects to their spatial representation
+										// in case of external table it is used to link to the related table
+	string				attUnique_;		// primary key 
+	char                separator_;		// in case of CSV table 
+
+// --- The following attributes are relative to tables with temporal information
+ 
+	string		attInitialTime_;	// initial time attribute
+	string		attFinalTime_;		// final time attribute
+	TeChronon	attTimeUnit_;		// time granularity
+
+// --- The following attributes are relative to external tables
+ 	int		relatedTableId_;	// id of a table to which this is related	
+ 	string	relatedTableName_;	// name of a table to which this is related	
+	string  relatedAttribute_;	// column name of table which this is related
+
+// -- Table Implementation
+	TeTableImpl* pImpl_;		// the rows of a table
+
+};
+
+//! A vector of tables
+typedef vector<TeTable> TeAttrTableVector;
+
+//! Return the sql join related with the table vector  
+string tableJoin(TeAttrTableVector& vecTable, string firstTable="", string attrLink=""); 
+
+/*! \example TableExample1.cpp
+	This is an example of how to use TeDatabase and TeTable to create, populate
+	and retrieve data from an attribute table in a TerraLib database.
+ */
+#endif
+
+
diff --git a/src/terralib/kernel/TeTemporalSeries.cpp b/src/terralib/kernel/TeTemporalSeries.cpp
new file mode 100644
index 0000000..ba01eec
--- /dev/null
+++ b/src/terralib/kernel/TeTemporalSeries.cpp
@@ -0,0 +1,283 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTemporalSeries.h"
+#include "TeDatabase.h"
+
+
+TeTSEntry::TeTSEntry(const double& val, TeTimeInterval& time, int timeFrame, int nItens, TeTSDataType dType)
+{
+	timeFrame_= timeFrame;
+	value_ = val;
+	type_ = dType;
+	nItens_ = nItens;
+	time_ = time;
+	timeInt_ = -1;
+
+	if (time.intervalChronon()==TeMONTHOFYEAR) 
+		timeInt_ = time.getT1().month();
+	else if(time.intervalChronon()==TeDAYOFMONTH)
+		timeInt_ = time.getT1().day();
+	else if(time.intervalChronon()==TeDAYOFWEEK)
+		timeInt_ = time.getT1().weekDay();
+	else if(time.intervalChronon()==TeDAYOFYEAR)
+		timeInt_ = time.getT1().yearDay();
+	else if(time.intervalChronon()==TeHOUROFDAY)
+		timeInt_ = time.getT1().hour();
+	else if(time.intervalChronon()==TeMINUTEOFHOUR)
+		timeInt_ = time.getT1().minute();
+	else if(time.intervalChronon()==TeSECONDOFMINUTE)
+		timeInt_ = time.getT1().hour();
+}
+
+
+
+TeTSEntry& 
+TeTSEntry::operator=(const TeTSEntry& other)
+{
+	if ( this != &other )
+	{
+		timeFrame_ = other.timeFrame_;
+		value_ = other.value_;
+		time_ = other.time_;
+		nItens_ = other.nItens_;
+		type_ = other.type_;
+		timeInt_ = other.timeInt_;
+	}
+	return (*this);
+}
+
+TeTSParams& 
+TeTSParams::operator=(const TeTSParams& other)
+{
+	if ( this != &other )
+	{
+		type_ = other.type_;
+  		chronon_ = other.chronon_;
+  		time_ = other.time_; 
+  		timeOper_ = other.timeOper_;
+  		spatOper_ = other.spatOper_;
+  	  	orTheme_ = other.orTheme_;
+		objectId_ = other.objectId_;
+  		attrTable_ = other.attrTable_;	
+		attrColumn_ = other.attrColumn_;
+	}
+	return (*this);
+}
+
+
+TeTemporalSeries& 
+TeTemporalSeries::operator=(const TeTemporalSeries& other)
+{
+	if ( this != &other )
+	{
+		TSparams_ = other.TSparams_;
+		series_ = other.series_;
+	}
+	return (*this);
+}
+
+
+bool 
+TeTemporalSeries::getTSEntry(TeTSEntry& ts, unsigned int frame)
+{
+	if(frame >= (series_.size()))
+		return false;
+
+	ts = series_[frame];
+	return true;
+}
+
+bool 
+TeTemporalSeries::buildFrameIntervals()
+{
+	// ----- information about temporal table 
+	TeTable tempTable;
+	TeDatabase* db = TSparams_.orTheme_->layer()->database();
+
+	if(!TSparams_.orTheme_->getTemporalTable(tempTable))
+		return false;
+
+	TSparams_.attrTable_ = tempTable.name();
+	string initialtime = tempTable.name() +"."+ tempTable.attInitialTime(); 
+	string finaltime = tempTable.name() +"."+ tempTable.attFinalTime(); 
+
+	TeTime iTime, fTime;
+	
+	// ----- fill time interval
+	// ---------------------------- you don�t know how many time frames will be generated
+
+	if(	(TSparams_.chronon_==TeYEAR)   || (TSparams_.chronon_==TeMONTH) ||
+		(TSparams_.chronon_==TeDAY)    || (TSparams_.chronon_==TeHOUR)  ||
+		(TSparams_.chronon_==TeMINUTE) || (TSparams_.chronon_==TeSECOND) )
+	{
+		
+		string fromClause, whereClause;
+		if(!db->tableExist(TSparams_.orTheme_->collectionAuxTable()))
+		{
+			TeAttrTableVector atts; 
+			TSparams_.orTheme_->getAttTables(atts); 
+			if(atts.empty())
+				return false;
+
+			fromClause = " FROM " + tableJoin(atts);
+			whereClause = TSparams_.orTheme_->sqlWhereRestrictions();
+		}
+		else
+		{
+			//fromClause = TSparams_.orTheme_->sqlGridFrom();
+			string collAuxTable = TSparams_.orTheme_->collectionAuxTable();
+			string uniqueIdName = tempTable.name() +"."+ tempTable.uniqueName(); 
+			fromClause = " FROM "+ tempTable.name()+" RIGHT JOIN "+ collAuxTable; 
+			fromClause += " ON "+ uniqueIdName +" = ";;
+			
+			if(tempTable.tableType()==TeFixedGeomDynAttr)
+				fromClause += collAuxTable +".aux0";
+			else
+				fromClause += collAuxTable +".unique_id";
+		}
+
+		string sql = " SELECT min("+ initialtime +"), max("+ finaltime +") ";
+		sql += fromClause;	
+		
+		if(!whereClause.empty())
+			sql += " WHERE "+ whereClause;
+
+		TeDatabasePortal* portal = db->getPortal();
+		if(!portal)
+			return false;
+
+		if((!portal->query(sql)) || (!portal->fetchRow()))
+		{
+			delete portal;
+			return false;
+		}
+
+		//fill the temporal series
+        TeTime date1 =  portal->getDate(0);
+        TeTime date2 =  portal->getDate(1);
+		TeTimeInterval interval(date1, date2);
+		interval.intervalChronon(TSparams_.chronon_); //min/max
+
+		iTime = interval.getT1();
+ 		fTime = interval.getT2();
+
+		delete (portal);
+	}
+
+	// ---------------------------- you know how many time frames will be generated
+
+	else if (TSparams_.chronon_==TeMONTHOFYEAR) 
+	{
+		TeTime t1("01/01/2001", TeMONTHOFYEAR, "DDsMMsYYYY");
+		TeTime t2("01/12/2001", TeMONTHOFYEAR, "DDsMMsYYYY");
+		iTime = t1;
+		fTime = t2;
+	}
+	else if(TSparams_.chronon_==TeDAYOFMONTH)
+	{
+		TeTime t1("01/01/2001", TeDAYOFMONTH, "DDsMMsYYYY");
+		TeTime t2("31/01/2001", TeDAYOFMONTH, "DDsMMsYYYY");
+		iTime = t1;
+		fTime = t2;
+	}
+	else if(TSparams_.chronon_==TeDAYOFWEEK)
+	{
+		TeTime t1("07/01/2001", TeDAYOFWEEK, "DDsMMsYYYY");
+		TeTime t2("13/01/2001", TeDAYOFWEEK, "DDsMMsYYYY");
+		iTime = t1;
+		fTime = t2;
+	}
+	else if(TSparams_.chronon_==TeDAYOFYEAR)
+	{
+		TeTime t1("01/01/2001", TeDAYOFYEAR, "DDsMMsYYYY");
+		TeTime t2("31/12/2001", TeDAYOFYEAR, "DDsMMsYYYY");
+		iTime = t1;
+		fTime = t2;
+	}
+	else if(TSparams_.chronon_==TeHOUROFDAY)
+	{
+		TeTime t1("01/01/2001 00", TeHOUROFDAY, "DDsMMsYYYYsHH");
+		TeTime t2("01/01/2001 23", TeHOUROFDAY, "DDsMMsYYYYsHH");
+		iTime = t1;
+		fTime = t2;
+	}
+	else if(TSparams_.chronon_==TeMINUTEOFHOUR)
+	{
+		TeTime t1("01/01/2001 00:00", TeMINUTEOFHOUR, "DDsMMsYYYYsHHsmm");
+		TeTime t2("01/01/2001 00:59", TeMINUTEOFHOUR, "DDsMMsYYYYsHHsmm");
+		iTime = t1;
+		fTime = t2;
+	}
+	else if(TSparams_.chronon_==TeSECONDOFMINUTE)
+	{
+		TeTime t1("01/01/2001 00:00:00", TeSECONDOFMINUTE, "DDsMMsYYYYsHHsmmsSS");
+		TeTime t2("01/01/2001 00:00:59", TeSECONDOFMINUTE, "DDsMMsYYYYsHHsmmsSS");
+		iTime = t1;
+		fTime = t2;
+	}
+
+	int timeFrame = 0;
+	while (iTime <= fTime)
+	{
+		TeTimeInterval inter(iTime,iTime);
+		inter.intervalChronon(TSparams_.chronon_); //min/max
+		TeTSEntry tsEntry(0., inter, timeFrame);
+		this->series_.push_back(tsEntry);
+		++iTime;
+		++timeFrame;
+	}
+
+	return true;
+}
+
+bool 
+TeTemporalSeries::setTSEntryValue(unsigned int frame, double val, TeTSDataType type)
+{
+
+	TeTSEntry entry;
+	if(!getTSEntry(entry, frame))
+		return false;
+
+	double val1 = entry.value_;
+	double result = val1;
+
+	if(TSparams_.timeOper_==TeCOUNT)
+		result += 1;
+	else if (TSparams_.timeOper_==TeSUM)
+		result += val;
+	else if ((TSparams_.timeOper_==TeMAXVALUE) && (val>val1))
+		result = val;
+	else if((TSparams_.timeOper_==TeMINVALUE) && (val<val1))
+		result = val;
+	else if(TSparams_.timeOper_==TeMEAN)
+		result = (val1+val)/2;
+
+	series_[frame].value_ = result;
+	series_[frame].type_ = type;
+	return true;
+}
+
+
+
+
diff --git a/src/terralib/kernel/TeTemporalSeries.h b/src/terralib/kernel/TeTemporalSeries.h
new file mode 100644
index 0000000..a68f7ee
--- /dev/null
+++ b/src/terralib/kernel/TeTemporalSeries.h
@@ -0,0 +1,193 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef  __TERRALIB_INTERNAL_TS_H
+#define  __TERRALIB_INTERNAL_TS_H
+
+
+#include "TeTheme.h"
+#include "TeTimeInterval.h"
+
+
+/* 
+	ATTR_DYN: a spatial object with a dynamic attribute 
+	ATTR_DYN_GROUP: some spatial objects with a dynamic attribute table 
+	EVENT: count of events
+	ATTR_EVENT: grouping the attributes of the events
+*/
+//!	type of temporal series
+enum TeTSType  { TeATTRDYN, TeATTRDYNGROUP, TeEVENT, TeATTREVENT};
+
+ 
+//! type of the data collected in the serie temporal 
+enum TeTSDataType  { TeDATA, TeMISSING, TeDMISSING, TeOUTLIER, TeDOUTLIER, TePREDICTION };
+
+
+//! A class that represent each time frame of a temporal serie
+class TeTSEntry
+{
+
+public:
+	int					timeFrame_;  //the time frame of the temporal series 
+	double 				value_;
+	TeTSDataType 		type_; 
+	int 				nItens_; //number of instances
+	TeTimeInterval		time_;
+	int					timeInt_;
+
+	//! Constructor
+	TeTSEntry(): 
+		timeFrame_(-1),
+		value_(0), 
+		type_(TeMISSING), 
+		nItens_(0),
+		timeInt_(-1)
+		{}
+
+	//! Constructor
+	TeTSEntry(const double& val, TeTimeInterval& time, int timeFrame=-1, int nItens=0, TeTSDataType dType=TeMISSING); 
+		
+	
+	//! Copy constructor
+	TeTSEntry(const TeTSEntry& other)
+	{
+		timeFrame_ = other.timeFrame_;
+		value_ = other.value_;
+		time_ = other.time_;
+		nItens_ = other.nItens_;
+		type_ = other.type_;
+		timeInt_ = other.timeInt_;
+	}
+
+	//! Operator = 
+	TeTSEntry& operator=(const TeTSEntry& other); 
+
+};
+
+//! Parameters of a temporal serie
+class TeTSParams 
+{
+  	
+public:
+	TeTSType			type_;			//! type of the serie
+  	TeChronon			chronon_;		//! Chronon used to generated the serie
+  	TeTimeInterval		time_;			//! Date/Time validy 
+  	TeStatisticType		timeOper_; 		//! operator to temporal grouping - to group objects in each time frame
+  	TeStatisticType		spatOper_; 		//! operator to spatial grouping - to group instances to each object 
+  
+	// Measures
+  	TeTheme*		orTheme_;		//Pointer to the origin theme 
+	string			objectId_;
+  	string			attrTable_;	    //temporal table 
+	string			attrColumn_;	//date column 
+
+
+	//! Empty constructor
+	TeTSParams():
+		chronon_(TeNOCHRONON),
+		timeOper_(TeNOSTATISTIC),
+		spatOper_(TeNOSTATISTIC),
+		orTheme_(0),
+		objectId_(""),
+		attrTable_(""),
+		attrColumn_("")
+		{ }
+
+	//! Constructor - - serie type is ATTR_DYN_GROUP, EVENT, ATTR_EVENT
+	TeTSParams(TeTheme* theme, TeChronon chr, const string& table, const string& col, TeStatisticType tOper, TeStatisticType sOper):
+		chronon_(chr),
+		timeOper_(tOper), 
+		spatOper_(sOper),
+		orTheme_(theme),
+		objectId_(""),
+		attrTable_(table),
+		attrColumn_(col)
+		{}
+
+	//! Constructor - serie type is ATTR_DYN
+	TeTSParams(TeTheme* theme, const string& objId, TeChronon chr, const string& table, const string& col, TeStatisticType tOper, TeStatisticType sOper):
+		chronon_(chr),
+		timeOper_(tOper),
+		spatOper_(sOper),
+		orTheme_(theme),
+		objectId_(objId),
+		attrTable_(table),
+		attrColumn_(col)
+		{}
+
+	//! Operator = 
+	TeTSParams& operator=(const TeTSParams& other); 
+}; 
+
+//! A class to represent temporal serie
+class TeTemporalSeries
+{
+
+public:
+	TeTSParams			TSparams_; 
+	vector<TeTSEntry> 	series_; //! serie
+
+	//! Constructor
+	TeTemporalSeries(): 
+		TSparams_(TeTSParams())
+	{}
+
+	//! Constructor
+	TeTemporalSeries(TeChronon chr, TeTheme* theme=0, const string& table="", const string& col="", TeStatisticType tOper=TeNOSTATISTIC, TeStatisticType sOper=TeNOSTATISTIC): 
+		TSparams_(TeTSParams(theme, chr, table, col, tOper, sOper))
+	{}
+
+	//! Constructor
+	TeTemporalSeries(TeTheme* theme, const string& objId, TeChronon chr, const string& table, const string& col, TeStatisticType tOper, TeStatisticType sOper): 
+		TSparams_(TeTSParams(theme, objId, chr, table, col, tOper, sOper))
+	{}
+
+	//! Gets the time frame  (0 until n-1)
+	bool getTSEntry(TeTSEntry& ts, unsigned int frame); 
+
+	//! Operator = 
+	TeTemporalSeries& operator=(const TeTemporalSeries& other); 
+
+	//! Fills the time interval for each frame
+	bool buildFrameIntervals();
+
+	//! Returns the number of time frames
+	int numTimeFrames() { return series_.size(); }
+
+	//! Returns the time of each frame
+	int timeInt(int frame) { return ((series_[frame-1]).timeInt_); }
+
+	//! Sets the temporal serie entry value
+	bool setTSEntryValue(unsigned int frame, double val, TeTSDataType type); 
+
+	//! Returns the time of each frame
+	TeTimeInterval time(int frame) { return ((series_[frame-1]).time_); }
+
+};
+
+
+#endif
+
+
+
+
diff --git a/src/terralib/kernel/TeTheme.cpp b/src/terralib/kernel/TeTheme.cpp
new file mode 100644
index 0000000..4e5ac33
--- /dev/null
+++ b/src/terralib/kernel/TeTheme.cpp
@@ -0,0 +1,1703 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTheme.h"
+#include "TeUtils.h"
+#include "TeDatabase.h"
+#include "TeGroupingAlgorithms.h"
+
+extern int  yyparse(string& sqlOut);
+extern int  initParse(const string& strIn, TeDatabase* db);
+
+TeTheme& 
+TeTheme::operator= (TeTheme& other)
+{
+	if ( this != &other )
+	{
+		myParent_ = other.parent(); 
+		id_ = other.id(); 
+		name_= other.name(); 
+		view_ = other.view(); 
+		type_ = other.type();
+		priority_ = other.priority();
+		
+		layerId_ = other.layerId();
+		layer_ = other.layer();      //the same layer pointer
+		generateAttributeRest_ = other.attributeRest();
+		generateTemporalRest_ = other.temporalRest();
+		generateSpatialRest_ = other.spatialRest(); 
+		spatialRelation_ = other.spatialRelation();
+		hasSpatialRes_ =  other.hasSpatialRest();
+		boxRest_ = other.boxRestriction();
+		geomRest_ = other.geomRestriction(); 
+		geomRepRest_ = other.geomRepRestriction();	
+		minScale_ = other.minScale();
+		maxScale_ = other.maxScale();
+		collectionTable_ = other.collectionTable();
+		collectionAuxTable_ = other.collectionAuxTable();
+		visibleRep_ = other.visibleRep();
+		enableVisibility_ = other.visibility();
+
+		if(grouping_)
+			delete grouping_;
+		grouping_ = 0;
+		if(other.grouping())
+		{
+			grouping_ = new TeGrouping();
+			(*grouping_) = (*other.grouping());
+		}
+
+		legend_ = other.legend();
+		outOfCollectionLegend_ = other.outOfCollectionLegend();
+		withoutDataConnectionLegend_ = other.withoutDataConnectionLegend();	
+		defaultLegend_ = other.defaultLegend ();
+		pointingLegend_ = other.pointingLegend();
+		queryLegend_ = other.queryLegend();
+		queryAndPointingLegend_ = other.queryAndPointingLegend(); 
+		
+		attTableVector_ = other.attrTables();
+		sqlFrom_ =  other.sqlFrom();		
+		sqlJoin_ = other.sqlGridJoin();
+		sqlGridFrom_ = other.sqlGridFrom();
+		sqlGridJoin_ = other.sqlGridJoin();
+		aliasVector_ = other.aliasVector();
+		sqlAttList_ = other.sqlAttList();
+		sqlNumAttList_ = other.sqlNumAttList();		
+	
+		if(rasterVisual_)
+			delete rasterVisual_;
+		rasterVisual_ = 0;
+		if(other.rasterVisual())
+		{
+			rasterVisual_ = new TeRasterTransform();
+			(*rasterVisual_) = (*other.rasterVisual());
+		}
+	}
+	return *this;
+}
+
+void 
+TeTheme::setSpatialRest(TeBox& box, TeGeomRep rep, TeSpatialRelation relation)
+{
+	hasSpatialRes_ = true;
+	boxRest_ = box;
+	spatialRelation_ = relation;
+	
+	if(rep==TeGEOMETRYNONE)
+		geomRepRest_ = layer()->vectRepres()[0]->geomRep_;
+	else
+		geomRepRest_ = rep;
+	
+	geomRest_ = 0;
+}
+
+void 
+TeTheme::setSpatialRest(TeGeometry* geom, TeGeomRep rep, TeSpatialRelation relation)
+{
+	hasSpatialRes_ = true;
+	geomRest_ = geom;
+	spatialRelation_ = relation;
+	
+	if(rep==TeGEOMETRYNONE)
+		geomRepRest_ = layer()->vectRepres()[0]->geomRep_;
+	else
+		geomRepRest_ = rep;
+	
+	boxRest_ = TeBox();
+}
+
+void 
+TeTheme::grouping(TeGrouping* g) 
+{
+	if(grouping_==g)
+		return;
+
+	if(grouping_) 
+		delete (grouping_);
+	
+	grouping_ = g; 
+} 
+
+bool 
+TeTheme::save()  
+{
+	TeDatabase* db = layer()->database();
+	if(!db)
+		return false;
+
+	//insert theme in database 
+	if(id()==0)
+	{
+		if(!db->insertTheme(this))
+		{
+			db->deleteTheme(this->id());
+			return false;
+		}
+	}
+
+	//update te_theme_tables table
+	if(!db->updateThemeTable(this))
+	{
+		db->deleteTheme(this->id());
+		return false;
+	}
+	
+	//collection table 
+	if(collectionTable().empty())
+		collectionTable("te_collection_"+ Te2String(id())); 
+
+	if(!db->createCollectionTable(collectionTable_))
+	{
+		db->deleteTheme(this->id());
+		return false;
+	}
+
+	//collection aux table
+	collectionAuxTable(collectionTable() + "_aux");
+	addThemeTable(collectionAuxTable());
+
+	if(!createCollectionAuxTable())
+	{
+		db->deleteTheme(this->id());
+		return false;
+	}
+
+	return true;
+}
+
+bool
+TeTheme::buildCollection()
+{
+	if(id()==0)
+		return false;
+	
+	if(!populateCollection())
+		return false;
+
+	if(!populateCollectionAux())
+		return false;
+
+	return true;
+}
+
+bool 
+TeTheme::generateLabelPositions()
+{ 
+	TeDatabase* db = layer()->database();
+	if(!db)
+		return false;
+
+	return (db->generateLabelPositions(this)); 
+}
+
+void 
+TeTheme::resetGrouping ()
+{
+	if(grouping_)
+	{
+		if (grouping_->groupMode_ == TeRasterSlicing && rasterVisual_)
+			this->removeRasterVisual();
+		
+		delete(grouping_);
+		grouping_ = 0;
+	}
+
+	legend_.clear();
+	return;
+}
+
+bool 
+TeTheme::buildGrouping(TeGrouping* g, vector<TeSlice>& slices)
+{
+	if(slices.size() > 200)
+		return false;
+	grouping(g);
+	legend_.clear(); 
+	
+	for(unsigned int j=0; j<slices.size(); j++)
+	{
+		TeLegendEntry legend(slices[j]);
+		legend.group(j);
+		legend.theme(id());
+		legend_.push_back(legend);
+	}	
+	return true;
+}
+
+bool  
+TeTheme::buildGrouping(TeGrouping* g, TeSelectedObjects selectedObjects, vector<double>* dValuesVec)   
+{ 
+	TeDatabase* db = layer_->database();
+	if(!db || !g)
+		return false;
+
+	unsigned int i;
+	vector<TeSlice> slices;
+
+	if (g->groupMode_ == TeRasterSlicing)
+	{
+		int b = atoi(g->groupAttribute_.name_.c_str());
+		if (!layer_->raster() ||  
+			b < 0 ||
+			b > layer_->raster()->params().nBands() ||
+			g->groupNumSlices_ <= 0 ||
+			g->groupNumSlices_ > 200 )
+			return false;
+
+		if (g->groupMaxVal_ == TeMINFLOAT)
+			g->groupMaxVal_ = layer_->raster()->params().vmax_[b];
+
+		if (g->groupMinVal_ == TeMAXFLOAT)
+			g->groupMinVal_ = layer_->raster()->params().vmin_[b];
+
+		grouping(g);
+		TeGroupByEqualStep(g->groupMinVal_, g->groupMaxVal_,g->groupNumSlices_, slices, g->groupPrecision_);
+	}
+	else
+	{
+		if(g->groupAttribute_.name_.empty())
+			return false;
+		grouping(g);
+
+		//verify what the objects will be consired
+		string	input;
+		if(selectedObjects == TeSelectedByPointing)
+		{
+			input = " WHERE (grid_status = 1 OR grid_status = 3";
+			input += " OR (grid_status is null AND (c_object_status = 1 OR c_object_status = 3)))";
+		}
+		else if(selectedObjects == TeNotSelectedByPointing)
+		{
+			input = " WHERE (grid_status = 0 OR grid_status = 2";
+			input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+		}
+		else if(selectedObjects == TeSelectedByQuery)
+		{
+			input = " WHERE (grid_status = 2 OR grid_status = 3";
+			input += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+		}
+		else if(selectedObjects == TeNotSelectedByQuery)
+		{
+			input = " WHERE (grid_status = 0 OR grid_status = 1";
+			input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+		}
+		else if(selectedObjects == TeGrouped)
+		{
+			input = " WHERE c_legend_id <> 0";
+		}
+		else if(selectedObjects == TeNotGrouped)
+		{
+			input = " WHERE c_legend_id = 0";
+		}
+
+		TeDatabasePortal* portal = db->getPortal();
+		string query;
+		bool normal = false;
+		string aggrFunc = "";
+		if(grouping_->groupFunction_.empty())
+			aggrFunc = " MIN";
+		else
+			aggrFunc = grouping_->groupFunction_;
+
+		if(grouping_->groupNormAttribute_.empty())
+		{
+//			if(grouping_->groupAttribute_.type_== TeSTRING)
+//				query = " SELECT "+ grouping_->groupAttribute_.name_;  
+//			else
+				query = " SELECT "+ aggrFunc +"("+ grouping_->groupAttribute_.name_ +")";  
+		}
+		else
+		{
+			query = " SELECT "+ aggrFunc +"("+ grouping_->groupAttribute_.name_ +") / "+ aggrFunc +"("+ grouping_->groupNormAttribute_ + ")";
+			normal = true;
+		}
+		query += sqlGridFrom(); 
+		
+		if(selectedObjects != TeAll)
+			query += input;
+
+//		if(grouping_->groupAttribute_.type_!= TeSTRING)
+			query += " GROUP BY " + collectionTable() + ".c_object_id";
+		
+		if(!portal->query(query) || !portal->fetchRow())
+		{
+			delete portal;
+			return false;
+		}
+
+		//mount vector in memory
+		vector<double> dValues;  //inputvect
+		vector<string> sValues;	//svec
+
+		double mean, sum; 
+		mean = sum = 0.;
+		int	nullValues = 0;
+		do  
+		{
+			string val = portal->getData(0);
+			string valNorm = Te2String(atof(val.c_str()), grouping_->groupPrecision_);
+
+			if (!val.empty())
+			{
+				if(grouping_->groupMode_== TeUniqueValue)
+				{
+					if(normal)
+						sValues.push_back(valNorm);
+					else
+						sValues.push_back(val);
+				}
+				else
+				{
+					dValues.push_back(atof(valNorm.c_str()));
+					sum += atof(valNorm.c_str());
+				}
+
+			}
+			else
+				nullValues++;
+		}while(portal->fetchRow());
+		delete portal;
+		
+		if(dValues.empty() && sValues.empty())
+			return false;
+
+		if(grouping_->groupMode_== TeEqualSteps)
+			TeGroupByEqualStep(dValues.begin(), dValues.end(), grouping_->groupNumSlices_, slices, grouping_->groupPrecision_);
+		else if(grouping_->groupMode_== TeQuantil)
+			TeGroupByQuantil(dValues.begin(), dValues.end(), grouping_->groupNumSlices_, slices, grouping_->groupPrecision_);
+		else if(grouping_->groupMode_== TeStdDeviation)
+		{
+			string m = Te2String(mean);
+			TeGroupByStdDev(dValues.begin(), dValues.end(), grouping_->groupStdDev_, slices, m, grouping_->groupPrecision_);
+		}
+		else if(grouping_->groupMode_== TeUniqueValue)
+		{
+			if(grouping_->groupFunction_ == "COUNT")
+				TeGroupByUniqueValue(sValues, TeINT, slices, grouping_->groupPrecision_);
+			else
+				TeGroupByUniqueValue(sValues, grouping_->groupAttribute_.type_, slices, grouping_->groupPrecision_);
+		}
+
+		if(grouping_->groupNullAttr_ && nullValues > 0)
+		{
+			TeSlice ps;
+			ps.count_ = nullValues;
+			ps.from_ = "Missing Data";
+			slices.push_back(ps);
+			grouping_->groupNumSlices_ = slices.size() - 1;
+		}
+		else
+			grouping_->groupNumSlices_ = slices.size();
+
+		if (dValuesVec)
+		{
+			for (i = 0; i < dValues.size(); ++i)
+				dValuesVec->push_back(dValues[i]);
+		}
+	}
+
+	legend_.clear(); 
+	if(slices.size() > 200)
+		return false;
+	
+	for(i=0; i<slices.size(); ++i)
+	{
+		TeLegendEntry legend(slices[i]);
+		legend.group(i);
+		legend.theme(id());
+		legend_.push_back(legend);
+	}
+	
+	return true;
+}
+
+bool
+TeTheme::setGroupingVisual(int n, TeVisual& visual, TeGeomRep rep)
+{
+	if(	(n > grouping_->groupNumSlices_)	||
+		((int)legend_.size() < n)				|| 
+		(legend_.empty()) )
+		return false;
+
+	legend_[(n-1)].setVisual (visual, rep); 
+
+	return true;
+}
+
+bool
+TeTheme::setGroupingVisual(int n, TeGeomRepVisualMap& vismap)
+{
+	if(	(n > grouping_->groupNumSlices_)	||
+		((int)legend_.size() < n)		|| 
+		(legend_.empty()) )
+		return false;
+
+	TeGeomRepVisualMap::iterator it = vismap.begin();
+	while (it != vismap.end())
+	{
+		legend_[(n-1)].setVisual(it->second,it->first);
+		++it;
+	}
+	return true;
+}
+
+TeSliceVector 
+TeTheme::getSlices()
+{
+	TeSliceVector sliceVec;
+	for(unsigned int x=0; x<legend_.size(); ++x)
+	{
+		TeSlice slice = legend_[x].slice();
+		sliceVec.push_back (slice);
+	}
+	return sliceVec;
+}
+
+bool 
+TeTheme::getAttTables(TeAttrTableVector& attrs, TeAttrTableType attType)
+{
+	TeAttrTableVector::iterator it = attTableVector_.begin();
+	while (it != attTableVector_.end())
+	{
+		if ((attType == TeAllAttrTypes) || ((*it).tableType() == attType))
+			attrs.push_back((*it));
+		++it;
+	}
+	return (!attrs.empty());
+}
+
+bool 
+TeTheme::getTemporalTable(TeTable& table)
+{
+	TeAttrTableVector::iterator it = attTableVector_.begin();
+	while (it != attTableVector_.end())
+	{
+		if (((*it).tableType() == TeAttrEvent) || ((*it).tableType() == TeFixedGeomDynAttr))
+		{
+			table = (*it); 
+			return true;
+		}
+		++it;
+	}
+	return false;
+}
+
+bool
+TeTheme::saveGrouping(TeSelectedObjects selectedObjects)
+{ 
+	TeDatabase* db = layer_->database();
+	if(!db || !grouping_)
+		return false;
+
+	//verify if the collection table exists
+	//if there is a grouping definition
+	if (grouping_->groupMode_ != TeRasterSlicing)
+	{
+		if (!db->tableExist(collectionTable_) ||
+		   (grouping_->groupAttribute_.name_.empty()))	
+				return false;
+	}
+	if(legend_.empty())
+		buildGrouping(grouping());
+
+	//save grouping in te_gouping table, the legends in te_legend table and
+	//the visual of each legend in the te_visual table
+	if(!db->updateTheme(this))
+		return false;
+
+	if(grouping_->groupMode_ != TeRasterSlicing)
+	{	//save legend in collection table
+		if(!saveLegendInCollection(selectedObjects))
+			return false;
+	}
+	return true;
+}  
+
+bool 
+TeTheme::addThemeTable(TeTable& inputTable)  
+{
+	bool result = true;
+	TeAttrTableType type = inputTable.tableType();
+
+	if(inputTable.name() == collectionAuxTable_)
+	{
+		loadTablesJoin();
+		return false;
+	}
+	
+	if (type == TeAttrMedia)
+		return false; 
+
+	if(type != TeAttrStatic)
+	{
+		bool hasTemporal = false;
+		bool hasExtern = false; 
+
+		TeAttrTableVector::iterator it = attTableVector_.begin();
+		while(it!=attTableVector_.end())
+		{
+			//temporal
+			if( (it->tableType()==TeAttrEvent) || 
+				(it->tableType()==TeFixedGeomDynAttr) ||
+				(it->tableType()==TeDynGeomDynAttr))
+				hasTemporal = true;
+
+			//extern
+			if((it->tableType())==TeAttrExternal)
+				hasExtern = true;
+
+			++it;
+		}
+
+		if( ((type==TeAttrEvent) || 
+			(type==TeFixedGeomDynAttr) ||
+			(type==TeDynGeomDynAttr)) && (hasTemporal || hasExtern))
+			result = false;
+		else if ((type==TeAttrExternal) && hasTemporal)
+			result = false;
+	}
+
+	if(!result)
+		return false;
+
+	attTableVector_.push_back(inputTable);
+	loadAliasVector();
+	loadAttrLists();
+	loadTablesJoin(); 
+	return true;
+}
+
+void 
+TeTheme::addThemeTable(string tableName)
+{
+	TeTable table(tableName);
+	addThemeTable(table);
+}
+
+bool
+TeTheme::setAttTables(TeAttrTableVector& attrs)
+{	
+	attTableVector_.clear();	
+	int countTemporal = 0;
+	int countExtern = 0;
+	bool result = true;
+
+	TeAttrTableVector::iterator it = attrs.begin();
+	while(it!=attrs.end())
+	{
+		//temporal
+		if( (it->tableType()==TeAttrEvent) || 
+			(it->tableType()==TeFixedGeomDynAttr) ||
+			(it->tableType()==TeDynGeomDynAttr))
+			++countTemporal;
+
+		//extern
+		if(it->tableType()==TeAttrExternal)
+			++countExtern;
+
+		if( (it->tableType()==TeAttrMedia)     ||
+			(countTemporal>0 && countExtern>0) ||
+			(countTemporal>1) ||
+			(it->name() == collectionAuxTable_) )
+		{
+			result = false;
+		}
+		else
+		{
+			attTableVector_.push_back(*it);
+			loadAliasVector();
+			loadAttrLists();
+			loadTablesJoin(); 
+		}
+			
+		++it;
+	}
+
+	return result;
+}
+
+bool 
+TeTheme::removeThemeTable(unsigned int index)  
+{
+	if (index > (attTableVector_.size() - 1))
+		return false;
+
+	TeAttrTableVector::iterator it;
+	it = attTableVector_.begin() + index;
+
+	attTableVector_.erase(it);
+	loadAliasVector();
+	loadAttrLists();
+	loadTablesJoin();
+
+	return true; 
+}
+
+bool 
+TeTheme::isThemeTable(int tableId)  
+{
+	bool isThemeTable = false;
+	for (unsigned int i = 0; i < attTableVector_.size(); ++i)
+	{
+		if (attTableVector_[i].id() == tableId)
+		{
+			isThemeTable = true;
+			break;
+		}
+	}
+	return isThemeTable;
+}
+
+bool 
+TeTheme::isThemeTable(string tableName)  
+{
+	bool isThemeTable = false;
+	for (unsigned int i = 0; i < attTableVector_.size(); ++i)
+	{
+		if (attTableVector_[i].name() == tableName)
+		{
+			isThemeTable = true;
+			break;
+		}
+	}
+	return isThemeTable;
+}
+
+string
+TeTheme::getTableName(const string& attrName)
+{
+	string tableName;
+	size_t pos = attrName.find(".");
+
+	if (pos != string::npos)
+		return tableName = attrName.substr(0, pos-1);
+
+	for (unsigned int i = 0; i < attTableVector_.size(); ++i)
+	{
+		TeAttributeList& attrList = attTableVector_[i].attributeList();
+		for (unsigned j = 0; j < attrList.size(); ++j)
+		{
+			if (attrList[j].rep_.name_ == attrName)
+			{
+				tableName = attTableVector_[i].name();
+				return tableName;
+			}
+		}	
+	}
+
+	return tableName;
+}
+
+
+bool 
+TeTheme::loadThemeTables() 
+{
+	clearAttTableVector();
+	TeDatabase* db = this->layer()->database(); 
+	if(!db)
+		return false;
+	
+	return (db->loadThemeTable(this));
+}
+
+
+bool 
+TeTheme::deleteGrouping()  
+{
+	TeDatabase* db = layer_->database();
+	if(!db)
+		return false;
+
+	resetGrouping();
+	
+	//delete te_legend table
+	if(!db->deleteLegend (this->id()))
+		return false;
+	
+	//delete te_grouping table
+	string sql = "DELETE FROM te_grouping WHERE theme_id= "+ Te2String(this->id());
+	db->execute (sql);
+
+	return true;
+}
+
+bool 
+TeTheme::createCollectionAuxTable()   
+{
+	unsigned int i, j;
+	bool status;
+	
+	TeDatabase* db = layer_->database();
+
+	if(!db->tableExist(collectionTable_))
+		return false;
+
+	if(db->tableExist(collectionAuxTable_))
+	{
+		status = db->execute("DROP TABLE " + collectionAuxTable_);
+		if(!status)
+			return false; 
+	}
+
+	TeAttributeList attList;
+
+	TeAttribute at;
+	at.rep_.type_ = TeSTRING;
+	at.rep_.numChar_ = 50;
+	at.rep_.name_ = "object_id";
+	attList.push_back(at);
+
+	j = 0;
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		if (attTableVector_[i].tableType() == TeAttrExternal ||
+			attTableVector_[i].tableType() == TeFixedGeomDynAttr)
+		{
+			at.rep_.name_ = "aux" + Te2String(j++);
+			attList.push_back(at);
+		}
+	}
+
+	at.rep_.isPrimaryKey_ = true;
+//	at.rep_.numChar_ = 200;
+	at.rep_.numChar_ = 0;
+	at.rep_.name_ = "unique_id";
+	at.rep_.isAutoNumber_ = true;
+	at.rep_.type_ = TeINT;
+	attList.push_back(at);
+	
+//	at.rep_.type_ = TeINT;
+	at.rep_.name_ = "grid_status";
+	at.rep_.isPrimaryKey_ = false;
+	at.rep_.isAutoNumber_ = false;
+	at.rep_.numChar_ = 0;
+	attList.push_back(at);	
+	
+	status = db->createTable(collectionAuxTable_,attList);
+	if(!status)
+		return false;
+
+	//create index to object_id
+	db->createIndex(collectionAuxTable_, collectionAuxTable_+"_index1", "object_id"); 
+	return true;
+} 
+
+bool 
+TeTheme::populateCollectionAux()  
+{	
+	TeDatabase* db = layer_->database();
+	if((!db) || (collectionTable_.empty()) || (collectionAuxTable_.empty()))
+		return false;
+	
+	string whereClause; 
+
+	whereClause = " WHERE 1=1 ";
+	
+	// Populate the collection auxiliary table
+	string ins = "INSERT INTO " + collectionAuxTable_ + " (object_id";
+    unsigned int i, j;
+	j = 0;
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		if (attTableVector_[i].tableType() == TeAttrExternal ||
+			attTableVector_[i].tableType() == TeFixedGeomDynAttr)
+			ins += ", aux" + Te2String(j++);
+	}
+
+//	ins += ", unique_id, grid_status) SELECT c_object_id";
+	ins += ", grid_status) SELECT c_object_id";
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		if (attTableVector_[i].tableType() == TeAttrExternal ||
+			attTableVector_[i].tableType() == TeFixedGeomDynAttr)
+			ins += "," + aliasVector()[i] + "." + attTableVector_[i].uniqueName();
+	}
+
+	ins += ",c_object_status";
+
+	//attribute restriction
+	if(!generateAttributeRest_.empty())
+		whereClause += " AND "+ generateAttributeRest_; 
+
+	//temporal restriction
+	if(!generateTemporalRest_.empty())
+	{
+		string sqlTemp;
+		initParse(generateTemporalRest_, db); 
+				
+		if(!yyparse(sqlTemp))  //0: accept  1: reject
+			whereClause += " AND "+ sqlTemp;
+		else
+			return false;
+	}
+
+	Keys objs;
+
+	//spatial restriction
+	if(hasSpatialRes_)
+	{
+		//TeRepresentation* rep = layer_->vectRepres()[0];
+		string geomTable = layer_->tableName(geomRepRest_); 
+		
+		if(boxRest_.isValid())
+		{
+			TeBox box = boxRest_;
+			whereClause += " AND "+ db->getSQLBoxWhere(box, geomRepRest_);
+		}
+		else if (geomRest_)
+		{
+			
+			TePrecision::instance().setPrecision(TeGetPrecision(layer()->projection()));
+
+			if(db->spatialRelation(geomTable, geomRepRest_, geomRest_, objs, spatialRelation_))
+			{
+				string obs;
+				for(unsigned int i=0; i<objs.size(); i++)
+				{
+					if(i!=0)
+						obs += ",";
+					obs += "'"+ objs[i] +"'";
+				}
+					
+				whereClause += " AND "+ geomTable +".object_id IN ("+ obs +")";
+			}
+		}
+	}
+
+	bool usaTemporal = false;
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		if (attTableVector_[i].tableType() == TeAttrExternal ||
+			attTableVector_[i].tableType() == TeFixedGeomDynAttr ||
+			attTableVector_[i].tableType() == TeDynGeomDynAttr)
+		{
+			whereClause += " AND ";
+			whereClause += aliasVector()[i] + "." + attTableVector_[i].uniqueName();
+			whereClause += " IS NOT NULL ";
+		}
+		if (attTableVector_[i].tableType() == TeFixedGeomDynAttr ||
+			attTableVector_[i].tableType() == TeDynGeomDynAttr)
+			usaTemporal = true;
+	}
+	
+	string result = ins + sqlFrom() + whereClause + " ";
+	bool ret = db->execute(result);
+	if(ret == false)
+		return false;
+
+	TeAttribute at;
+	at.rep_.name_ = "unique_id";
+	at.rep_.type_ = TeSTRING;
+	at.rep_.numChar_ = 100;
+	at.rep_.isAutoNumber_ = false;
+	at.rep_.isPrimaryKey_ = true;
+	ret = db->alterTable(collectionAuxTable_, at.rep_);
+
+	if(usaTemporal) // filter collection table
+	{
+		string s = "DELETE FROM " + collectionTable_ + " WHERE c_object_id NOT IN";
+		s += " (SELECT DISTINCT object_id FROM " + collectionAuxTable_ + ")";
+		return(db->execute(s));
+	}
+	return true;
+}
+
+
+bool 
+TeTheme::locatePolygon (TeCoord2D &pt, TePolygon &polygon, const double& tol)  
+{
+	if (!layer()->database() || collectionTable().empty())
+		return false;
+
+	string geomTable = layer()->tableName(TePOLYGONS);
+	string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+	sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id "; 
+
+	if(!layer()->database()->locatePolygon(sqlFrom, pt, polygon, tol))
+		return false;
+
+	return true;
+}
+
+
+bool 
+TeTheme::locatePolygonSet (TeCoord2D &pt, double tol, TePolygonSet &polygons)  
+{
+	if (!layer()->database() || collectionTable().empty())
+		return false;
+
+	string geomTable = layer()->tableName(TePOLYGONS);
+	string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+	sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id "; 
+
+	if(!layer()->database()->locatePolygonSet(sqlFrom, pt, tol, polygons))
+		return false;
+
+	return true;
+}
+
+bool 
+TeTheme::locateLine (TeCoord2D &pt, TeLine2D &line, const double& tol)  
+{
+	if (!layer()->database() || collectionTable().empty())
+		return false;
+
+	string geomTable = layer()->tableName(TeLINES);
+	string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+	sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id "; 
+
+	if(!layer()->database()->locateLine(sqlFrom, pt, line, tol))
+		return false;
+
+	return true;
+}
+
+bool 
+TeTheme::locatePoint (TeCoord2D &pt, TePoint &point, const double& tol)  
+{
+	if (!layer()->database() || collectionTable().empty())
+		return false;
+
+	string geomTable = layer()->tableName(TePOINTS);
+	string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+	sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id "; 
+
+	if(!layer()->database()->locatePoint(sqlFrom, pt, point, tol))
+		return false;
+
+	return true;
+}
+
+bool 
+TeTheme::locateCell (TeCoord2D &pt, TeCell &cell, const double&  tol)  
+{
+	if (!layer()->database() || collectionTable().empty())
+		return false;
+
+	string geomTable = layer()->tableName(TeCELLS);
+	string sqlFrom = " "+ geomTable +" INNER JOIN " + collectionTable();
+	sqlFrom += " ON "+ collectionTable() +".c_object_id = "+ geomTable +".object_id "; 
+
+	if(!layer()->database()->locateCell(sqlFrom, pt, cell, tol))
+		return false;
+
+	return true;
+}
+
+//------------------------------ protected methods
+void 
+TeTheme::loadAliasVector()  
+{
+	unsigned int i, count;
+	TeTable table;
+	multimap<string, int> tableMMap;
+
+	aliasVector_.clear();
+
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		table = attTableVector_[i];
+
+		if (table.tableType() != TeAttrExternal)
+			aliasVector_.push_back(table.name());
+		else
+		{
+			count = tableMMap.count(table.name());
+			if (count == 0)
+				aliasVector_.push_back(table.name());
+			else
+				aliasVector_.push_back(table.name() + "_" + Te2String(count));
+
+			tableMMap.insert(multimap<string,int>::value_type(table.name(), ++count));
+		}
+	}
+}
+
+string 
+TeTheme::sqlGridFrom(const string& geomTable) 
+{ 
+	if(geomTable.empty())
+		return sqlGridFrom_; 
+	
+	string result;
+	loadTablesJoin(geomTable);
+	result = sqlGridFrom_;
+	loadTablesJoin();
+	return result;
+}
+
+string 
+TeTheme::sqlWhereRestrictions(TeRepresentation* rep)
+{
+	Keys objs;
+	string whereClause= " 1 = 1 ";
+	TeDatabase* db = layer()->database();
+	
+	// load the first representation 
+	if(!rep)
+		rep = (layer()->vectRepres())[0];
+
+	// temporal restrictions are applied only to temporal tables
+	if(hasTemporalRest())
+	{
+		string result = "";
+		
+		initParse(temporalRest(), db); 
+				
+		if(!yyparse(result))  //0: accept  1: reject
+			whereClause += " AND "+ result;
+		else 
+			return "";
+	}
+			
+	// we should test if the attribute restriction is valid
+	if (hasAttrRest())
+		whereClause += " AND "+ attributeRest();
+
+	// spatial restriction with other geometry representation
+	if (hasSpatialRest() && rep)
+	{
+		if(boxRestriction().isValid())
+		{
+            TeBox b =  boxRestriction();
+            TeGeomRep gRep = rep->geomRep_;
+//			whereClause += " AND "+ db->getSQLBoxWhere(boxRestriction(), rep->geomRep_);
+			whereClause += " AND "+ db->getSQLBoxWhere(b, gRep);
+		}
+		else if(geomRestriction())
+		{
+			string geomTableRest = layer()->tableName(geomRepRestriction());
+			TePrecision::instance().setPrecision(TeGetPrecision(layer()->projection()));
+
+			if(db->spatialRelation(geomTableRest, geomRepRestriction(), geomRestriction(),  
+							   objs, spatialRelation()))
+			{
+				string obs;
+				for(unsigned int i=0; i<objs.size(); i++)
+				{
+					if(i!=0)
+						obs += ",";
+					obs += "'"+ objs[i] +"'";
+				}
+				
+				whereClause += " AND "+ rep->tableName_ +".object_id IN ("+ obs +")";
+			}
+		}
+	}
+	return whereClause;
+}
+
+
+
+void 
+TeTheme::loadTablesJoin(const string& geomTable)  //sqlGridFrom and sqlGridJoin
+{
+	unsigned int i, count;
+	multimap<string, int> tableMMap;
+    TeTable table;
+    bool hasExternalTable = false;
+
+    // Set the new sqlGridFrom_ clause and the new sqlGridJoin_ string
+    sqlGridFrom_.clear();
+    sqlGridJoin_.clear();
+
+    TeAttrTableVector tableVec;
+    vector<string>    aliasVec;
+
+    if(!geomTable.empty())
+    {
+        TeTable table;
+        table.name(geomTable);
+        table.setLinkName("object_id");
+        table.setUniqueName("object_id");
+        table.setTableType(TeAttrStatic);
+        tableVec.push_back(table);
+
+        for(i=0; i<attTableVector_.size(); ++i)
+            tableVec.push_back(attTableVector_[i]);
+
+        aliasVec.push_back(geomTable);
+        for(i=0; i<aliasVector_.size(); ++i)
+            aliasVec.push_back(aliasVector_[i]);
+    }
+    else
+    {
+        tableVec = attTableVector_;
+        aliasVec = aliasVector_;
+    }
+
+    //verify if there is external table
+    for (i = 0; i < tableVec.size(); ++i)
+    {
+        if (tableVec[i].tableType() == TeAttrExternal)
+        {
+            hasExternalTable = true;
+            break;
+        }
+    }
+   
+    if(!collectionAuxTable_.empty())
+    {
+        sqlGridFrom_ = " FROM ";
+
+        for (i = 0; i <= tableVec.size(); ++i)
+            sqlGridFrom_ += "(";
+
+        sqlGridFrom_ += collectionAuxTable_;
+        sqlGridJoin_ = "SELECT ";
+
+        if(hasExternalTable)
+            sqlGridFrom_ += " RIGHT JOIN "+ collectionTable_;
+        else
+            sqlGridFrom_ += " LEFT JOIN "+ collectionTable_;
+
+        sqlGridFrom_ += " ON "+ collectionAuxTable_ +".object_id = "+ collectionTable_ +".c_object_id )";
+
+        int numAux = 0;
+        for (i = 0; i < tableVec.size(); ++i)
+        {
+            table = tableVec[i];
+            if ((table.tableType()==TeAttrStatic) || (table.tableType()==TeAttrMedia) || (table.tableType()==TeAttrEvent))
+            {
+                sqlGridFrom_ += " LEFT JOIN " + aliasVec[i];
+                sqlGridFrom_ += " ON " + collectionTable_ +".c_object_id = " + aliasVec[i] + "." + table.linkName() +")";
+            }
+            else if (table.tableType() == TeAttrExternal)
+            {
+				count = tableMMap.count(table.name());
+				if (count == 0)
+					sqlGridFrom_ += " LEFT JOIN " + aliasVec[i];		
+				else
+					sqlGridFrom_ += " LEFT JOIN " + table.name() + " AS " + aliasVec[i];
+
+				tableMMap.insert(multimap<string,int>::value_type(table.name(), ++count));
+                sqlGridFrom_ += " ON " + collectionAuxTable_ + ".aux" + Te2String(numAux++) +" = "+ aliasVec[i] +"."+ table.uniqueName() +")";
+            }
+            else
+            {
+                sqlGridFrom_ += " LEFT JOIN " + aliasVec[i];
+                sqlGridFrom_ += " ON " + collectionAuxTable_ + ".aux" + Te2String(numAux++) +" = "+ aliasVec[i] +"."+ table.uniqueName() +")";
+            }
+           
+            sqlGridJoin_ += aliasVec[i] + ".*,";
+        }
+
+        sqlGridJoin_ += collectionTable_ + ".*, " +  collectionAuxTable_ + ".* " + sqlGridFrom_;
+    }
+    loadThemeTablesJoin();
+}
+
+
+void TeTheme::loadThemeTablesJoin()  ////sqlJoin and sqlFrom
+{
+	unsigned int i, count;
+	multimap<string, int> tableMMap;
+	TeTable table;
+
+	// Set the new from clause and the new join string
+	sqlFrom_.clear();
+	sqlJoin_.clear();
+
+	sqlFrom_ = " FROM ";
+	sqlJoin_ = "SELECT ";
+
+	if (collectionTable_.empty() == false)
+	{
+		for (i = 0; i < attTableVector_.size(); ++i)
+			sqlFrom_ += "(";
+		sqlFrom_ += collectionTable_;
+
+		for (i = 0; i < attTableVector_.size(); ++i)
+		{
+			table = attTableVector_[i];
+			if (table.tableType() != TeAttrExternal)
+			{
+				sqlFrom_ += " LEFT JOIN " + aliasVector_[i];
+				sqlFrom_ += " ON " + collectionTable_ + ".c_object_id = " + aliasVector_[i] + "." + table.linkName() + ")";
+			}
+			else
+			{
+				count = tableMMap.count(table.name());
+				if (count == 0)
+					sqlFrom_ += " LEFT JOIN " + aliasVector_[i];		
+				else
+					sqlFrom_ += " LEFT JOIN " + table.name() + " AS " + aliasVector_[i];
+
+				tableMMap.insert(multimap<string,int>::value_type(table.name(), ++count));
+				
+				sqlFrom_ += " ON " + table.relatedTableName() + "." + table.relatedAttribute() + " = ";
+				sqlFrom_ +=  aliasVector_[i] + "." + table.linkName() + ")";
+			}
+
+			sqlJoin_ += aliasVector_[i] + ".*,";
+		}
+
+		sqlJoin_ += collectionTable_ + ".*" + sqlFrom_;
+	}
+	else
+	{
+		if (attTableVector_.size() == 1)
+		{
+			table = attTableVector_[0];
+			sqlFrom_ += table.name();
+			sqlJoin_ = "SELECT " + table.name() + ".*" + sqlFrom_;
+		}
+		else
+		{
+			for (i = 0; i < attTableVector_.size() - 1; ++i)
+				sqlFrom_ += "(";
+
+			TeTable firstTable = attTableVector_[0];
+			sqlFrom_ += firstTable.name();
+			sqlJoin_ += firstTable.name() + ".*,";
+			for (i = 1; i < attTableVector_.size(); ++i)
+			{
+				table = attTableVector_[i];
+				sqlFrom_ += " LEFT JOIN " + aliasVector_[i];
+				sqlFrom_ += " ON " + firstTable.name() + "." + firstTable.linkName() + " = " + aliasVector_[i] + "." + table.linkName() + ")";
+
+				if (i == attTableVector_.size() - 1)
+					sqlJoin_ += aliasVector_[i] + ".*";
+				else
+					sqlJoin_ += aliasVector_[i] + ".*,";
+			}
+
+			sqlJoin_ += sqlFrom_;
+		}
+	}
+}
+
+void 
+TeTheme::loadAttrLists()  
+{
+	// Set the new list of attributes of all the theme tables and its new numerical list,
+	unsigned int i, j, count;
+	TeTable table;
+	multimap<string, int> attrMMap;
+	string attrName;
+
+	sqlAttList_.clear();
+	sqlNumAttList_.clear();
+
+	if (layer() == 0)
+		return;
+	TeDatabase *db = layer()->database();
+
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		table = attTableVector_[i];
+
+		// Set the map of attribute names
+		TeAttributeList attrList;
+		db->getAttributeList(table.name(), attrList);
+		for (j = 0; j < attrList.size(); ++j)
+		{
+			attrName = attrList[j].rep_.name_; 
+			count = attrMMap.count(attrName);
+			attrMMap.insert(multimap<string,int>::value_type(attrName, ++count));
+		}
+	}
+
+	// Set the list of attribute names that contains all the attribute names
+	// of the theme tables
+	for (i = 0; i < attTableVector_.size(); ++i)
+	{
+		TeAttributeList attrList;
+		table = attTableVector_[i];
+		db->getAttributeList(table.name(), attrList);
+		for (j = 0; j < attrList.size(); ++j)
+		{
+			attrName = attrList[j].rep_.name_; 
+			count = attrMMap.count(attrName);
+			if (count == 1)
+				attrList[j].rep_.name_ = attrName;
+			else
+				attrList[j].rep_.name_ = aliasVector_[i] + "." + attrName;
+
+			sqlAttList_.push_back(attrList[j]);
+		}		
+	}
+
+	// Set the list of attribute names that contains all the numeric attribute names
+	// of the theme tables
+	for(i = 0; i < sqlAttList_.size(); ++i)
+	{
+		if(sqlAttList_[i].rep_.type_ == TeREAL || sqlAttList_[i].rep_.type_ == TeINT)
+			sqlNumAttList_.push_back(sqlAttList_[i]);
+	}
+}
+
+bool
+TeTheme::saveLegendInCollection(TeSelectedObjects selectedObjects)   //colocar o count por grupo
+{
+	unsigned int i;
+	if(!grouping_)
+		return false; 
+
+	TeAttrDataType		type = grouping_->groupAttribute_.type_;
+	TeLegendEntryVector legVec = legend_;
+	string			groupingAttr = grouping_->groupAttribute_.name_;
+	
+	string input;
+	if(selectedObjects == TeSelectedByPointing)
+	{
+		input = " WHERE (grid_status = 1 OR grid_status = 3";
+		input += " OR (grid_status IS NULL AND (c_object_status = 1 OR c_object_status = 3)))";
+	}
+	else if(selectedObjects == TeNotSelectedByPointing)
+	{
+		input = " WHERE (grid_status = 0 OR grid_status = 2";
+		input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 2)))";
+	}
+	else if(selectedObjects == TeSelectedByQuery)
+	{
+		input = " WHERE (grid_status = 2 OR grid_status = 3";
+		input += " OR (grid_status is null AND (c_object_status = 2 OR c_object_status = 3)))";
+	}
+	else if(selectedObjects == TeNotSelectedByQuery)
+	{
+		input = " WHERE (grid_status = 0 OR grid_status = 1";
+		input += " OR (grid_status is null AND (c_object_status = 0 OR c_object_status = 1)))";
+	}
+	else if(selectedObjects == TeGrouped)
+		input = " WHERE c_legend_id <> 0";
+	else if(selectedObjects == TeNotGrouped)
+		input = " WHERE c_legend_id = 0";
+	
+
+	string func;
+	if(grouping_->groupFunction_.empty())
+		func = " MIN";
+	else
+		func = grouping_->groupFunction_;
+
+	if(grouping_->groupFunction_ == "COUNT")
+		type = TeINT;
+
+	string query = "SELECT MIN(" + collectionTable_ + ".c_object_id)";
+	if(grouping_->groupNormAttribute_.empty())
+		query += ", "+ func +"(" + groupingAttr + ")" + sqlGridFrom();
+	else
+		query += ", "+ func +"(" + groupingAttr + ") / "+ func +"(" + grouping_->groupNormAttribute_ + ")" + sqlGridFrom();
+	
+	if(selectedObjects != TeAll)
+		query += input;
+
+	query += " GROUP BY " + collectionTable_ + ".c_object_id";
+
+	map<int, vector<string> > legMap;
+	TeDatabase *db = layer()->database();
+	TeDatabasePortal* portal = db->getPortal();
+	if(portal->query(query) == false)
+	{
+		delete portal;
+		return false;
+	}
+
+	vector<string> idVec;
+	vector<string> nullIdVec;
+	vector<string> valVec;
+	while(portal->fetchRow())
+	{
+		string val = portal->getData(1);
+		string oid = portal->getData(0);
+		if (val.empty() == false)
+		{
+			idVec.push_back(oid);
+			valVec.push_back(val);
+		}
+		else
+			nullIdVec.push_back(oid);
+	}
+	if (grouping_->groupMode_ == TeUniqueValue)
+	{
+		unsigned int j = 0;
+		while( j < idVec.size())
+		{
+			string val = valVec[j];
+			string oid = idVec[j];
+			if(type == TeREAL)
+			{
+				double a = atof(val.c_str());
+				val = Te2String(a, grouping_->groupPrecision_);
+			}
+			else if(type == TeINT)
+			{
+				int a = atoi(val.c_str());
+				val = Te2String(a);
+			}
+				
+			unsigned int siz = legend_.size();
+			if (nullIdVec.size())
+				--siz;
+			for(i=0; i < siz; i++)
+			{
+				TeLegendEntry& leg = legend_[i];
+				if(val == leg.from())
+				{
+					legMap[leg.id()].push_back(oid);
+					break;
+				}
+			}
+			j++;
+		}
+	}
+	else
+	{
+		unsigned int j = 0;
+		while(j < idVec.size())
+		{
+			string val = valVec[j];
+			string oid = idVec[j];
+			if(type == TeREAL)
+			{
+				double a = atof(val.c_str());
+				val = Te2String(a, grouping_->groupPrecision_);
+			}
+			
+			unsigned int siz = legend_.size();
+			if (nullIdVec.size())
+				--siz;
+			for(i=0; i < siz; i++)
+			{
+				TeLegendEntry& leg = legend_[i];
+				int f = leg.from().find("mean", string::npos);
+				if(f >= 0)
+					continue;
+				double dval = atof(val.c_str());
+				double dfrom = atof(leg.from().c_str());
+				double dto = atof(leg.to().c_str());
+				if(i < legend_.size()-1)
+				{
+					if(dval >= dfrom && dval < dto)
+					{
+						legMap[leg.id()].push_back(oid);
+						break;
+					}
+				}
+				else
+				{
+					if(dval >= dfrom && dval <= dto)
+					{
+						legMap[leg.id()].push_back(oid);
+						break;
+					}
+				}
+			}
+			j++;
+		}
+	}
+	delete portal;
+
+	int legId = legend_[legend_.size()-1].id();
+	for(i = 0; i < nullIdVec.size(); ++i)
+	{
+		string oid = nullIdVec[i];
+		legMap[legId].push_back(oid);
+	}
+
+	vector<string> svec;
+	map<int, vector<string> > :: iterator it = legMap.begin();
+	while(it != legMap.end())
+	{
+    	// --- Generate In Clauses ----
+		unsigned int i, j, k, size, chunkSize = 200, nChunks;
+		string inClause;
+		size = it->second.size();
+		if (size % chunkSize)
+			nChunks = size / chunkSize + 1;
+		else
+			nChunks = size / chunkSize;
+
+		j = 0;		
+		for (k = 0; k < nChunks; ++k)
+		{
+			i = 0;
+			inClause = "(";
+			while (j < size && i < chunkSize)
+			{
+				inClause += "'" + db->escapeSequence(it->second[j]) + "',";
+				i++;
+				j++;
+			}
+			inClause[inClause.size() - 1] = ')';
+			svec.push_back(inClause);
+		}
+
+		//--- generateInClause
+
+		for(i=0; i<svec.size(); i++)
+		{
+			string up = "UPDATE " + collectionTable_ + " SET c_legend_id = " + Te2String(it->first);
+			up += " WHERE c_object_id IN " + svec[i];
+
+			if(db->execute(up) == false)
+				continue;
+		}
+		it++;
+		svec.clear();
+	}
+	if(legend_.size())
+		visibleRep_ = visibleRep_ | 0x40000000;
+	else
+		visibleRep_ = visibleRep_ | 0xbfffffff;
+	string upVis = "UPDATE te_theme SET visible_rep=" + Te2String(visibleRep_) + " WHERE theme_id=" + Te2String(id_);
+	return (db->execute(upVis));
+}
+
+bool 
+TeTheme::populateCollection()  
+{
+	TeDatabase* db = layer_->database();
+	if(!db || collectionTable_.empty())
+		return false;
+
+	if(attTableVector_.empty())
+		attTableVector_ = layer_->attrTables();
+	
+//	TeRepresentation* rep = layer_->vectRepres()[0];
+	TeRepresPointerVector& represVec = layer_->vectRepres();
+	for (unsigned int i = 0; i < represVec.size(); ++i)
+	{
+		TeRepresentation* rep = represVec[i];
+		if (rep->geomRep_ == TeTEXT)
+			continue;
+
+		string geomTable = layer_->tableName(rep->geomRep_); 
+
+		string sqlSelect, sqlFrom, sqlWhere;
+		
+		sqlSelect = " SELECT DISTINCT "+ geomTable +".object_id ";  
+		sqlFrom = tableJoin(attTableVector_, geomTable, "object_id");
+		
+//		sqlWhere = " WHERE 1=1 ";
+		sqlWhere = " WHERE " + geomTable + ".object_id NOT IN (SELECT c_object_id FROM " + collectionTable_ + ")";
+		
+		//attribute restriction
+		if(!generateAttributeRest_.empty())
+			sqlWhere += " AND "+ generateAttributeRest_; 
+
+		//temporal restriction
+		if(!generateTemporalRest_.empty())
+		{
+			string sqlTemp;
+			initParse(generateTemporalRest_, db); 
+					
+			if(!yyparse(sqlTemp))  //0: accept  1: reject
+				sqlWhere += " AND "+ sqlTemp;
+			else
+				return false;
+		}
+
+		Keys objs;
+
+		//spatial restriction
+		if(hasSpatialRes_)
+		{
+			if(boxRest_.isValid())
+			{
+				TeBox box = boxRest_;
+				sqlWhere += " AND "+ db->getSQLBoxWhere(box, geomRepRest_);
+			}
+			else if (geomRest_)
+			{
+				TePrecision::instance().setPrecision(TeGetPrecision(layer()->projection()));
+
+				if(db->spatialRelation(geomTable, geomRepRest_, geomRest_, objs, spatialRelation_))
+				{
+					string obs;
+					for(unsigned int i=0; i<objs.size(); i++)
+					{
+						if(i!=0)
+							obs += ",";
+						obs += "'"+ objs[i] +"'";
+					}
+						
+					sqlWhere += " AND "+ geomTable +".object_id IN ("+ obs +")";
+				}
+			}
+		}
+
+		//populate the collection table
+		string popule;
+		popule = " INSERT INTO "+ collectionTable_ +" (c_object_id) ";
+		popule += sqlSelect +" FROM "+ sqlFrom + sqlWhere; 	
+		
+		if (!db->execute(popule))
+			return false;
+	}
+
+//	int defaultLegend = defaultLegend_.id();
+	string popule = "UPDATE " + collectionTable_;
+	popule += " SET c_legend_id=0, c_legend_own=0, c_object_status=0 ";
+	
+	if (!db->execute(popule))
+		return false;
+
+	return true;
+}
+
+
+void TeTheme::createRasterVisual(TeRaster* rst)
+{
+	if (rasterVisual_)
+		delete rasterVisual_;
+
+	if (!rst)
+		rst = layer_->raster();
+
+	if (!rst)
+		return;
+
+	rasterVisual_ = new TeRasterTransform();
+										
+	if (rst->params().photometric_[0] == TeRASTERPALETTE || // raster palette -> uses its palette
+	    rst->params().photometric_[0] == TeRASTERTHEMATIC) 
+	{
+		rasterVisual_->setTransfFunction(&TeRasterTransform::Pallete2ThreeBand);
+		rasterVisual_->setLutSize(rst->params().lutr_.size());
+		return;
+	}
+
+	if (visibleRep_ & 0x40000000 && grouping_ &&		// sliced raster -> generate the
+		grouping_->groupMode_ == TeRasterSlicing)	// appropriate palette
+	{
+		int band = atoi(grouping_->groupAttribute_.name_.c_str());
+		rasterVisual_->setSrcBand(band);
+		if (rst->params().dataType_[band] != TeUNSIGNEDCHAR)
+			rasterVisual_->generateLUT(legend_, 1024, defaultLegend_.visual(TePOLYGONS).color());
+		else
+			rasterVisual_->generateLUT(legend_, 256, defaultLegend_.visual(TePOLYGONS).color());
+		rasterVisual_->setTransfFunction(&TeRasterTransform::LUT2ThreeBand);
+		return;
+	}
+
+	if (rst->params().dataType_[0] != TeUNSIGNEDCHAR)	// non unsigned char -> generate linear transformation
+		rasterVisual_->setLinearTransfParameters(rst->params().vmin_[0],rst->params().vmax_[0], 0, 255);
+
+	if (rst->params().nBands() == 1)				
+		rasterVisual_->setTransfFunction(&TeRasterTransform::Mono2ThreeBand);
+	else
+		rasterVisual_->setTransfFunction(&TeRasterTransform::Band2Band);
+}
+
+
diff --git a/src/terralib/kernel/TeTheme.h b/src/terralib/kernel/TeTheme.h
new file mode 100644
index 0000000..d796320
--- /dev/null
+++ b/src/terralib/kernel/TeTheme.h
@@ -0,0 +1,765 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTheme.h
+	This file contains definitions about a theme in TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_THEME_H
+#define  __TERRALIB_INTERNAL_THEME_H
+
+#include "TeViewNode.h"
+#include "TeLayer.h"
+#include "TeLegendEntry.h"
+#include "TeDataTypes.h"
+#include "TeRasterTransform.h"
+
+
+//! This structure is used to store the grouping parameters used in a theme
+struct TeGrouping
+{
+
+	//! Returns the attribute used to group the objects of the theme
+	TeAttributeRep	groupAttribute_;
+	
+	//! Returns the attribute used to normalize a grouping 
+	string	groupNormAttribute_;
+	
+	//! Returns the grouping mode 
+	TeGroupingMode	groupMode_;			
+	
+	//! Returns the number of groups
+	int	groupNumSlices_;	
+	
+	//! Returns the numeric precision used to group objects
+	int	groupPrecision_;
+
+	//! Returns the deviation parameter used to group objects
+	double	groupStdDev_;
+
+	//! Aggregate function
+	string	groupFunction_; 
+
+	//! Show missing data
+	bool	groupNullAttr_; 
+
+	//! Minimum value used to calculate a equal step grouping
+	double groupMinVal_;
+
+	//! Maximum value used to calculate a equal step grouping 
+	double groupMaxVal_;
+
+	//! Constructor
+	TeGrouping(TeAttributeRep att=TeAttributeRep(), const string& normAttr="", 
+				TeGroupingMode gMode=TeEqualSteps, int numSlice=0, int gPrecision=6,  
+				double	gStDev=1.0, const string& func=""): 
+			groupAttribute_(att),
+			groupNormAttribute_(normAttr),
+			groupMode_(gMode),
+			groupNumSlices_(numSlice),
+			groupPrecision_(gPrecision),
+			groupStdDev_(gStDev),
+			groupFunction_(func),
+			groupNullAttr_(false),
+			groupMinVal_(TeMAXFLOAT),
+			groupMaxVal_(TeMINFLOAT)
+			{}
+
+	//! Copy constructor
+	TeGrouping(const TeGrouping& other)
+	{	
+		groupAttribute_		= other.groupAttribute_;
+		groupNormAttribute_	= other.groupNormAttribute_;
+		groupMode_			= other.groupMode_;
+		groupNumSlices_		= other.groupNumSlices_;
+		groupPrecision_		= other.groupPrecision_;
+		groupStdDev_		= other.groupStdDev_;
+		groupFunction_		= other.groupFunction_;
+		groupNullAttr_		= other.groupNullAttr_;
+		groupMinVal_		= other.groupMinVal_;
+		groupMaxVal_		= other.groupMaxVal_;
+	}
+			
+	//! Destructor
+	~TeGrouping() {}
+	
+	TeGrouping& operator= (const TeGrouping& other)
+	{	
+		if ( this != &other )
+		{		
+			groupAttribute_		= other.groupAttribute_;
+			groupNormAttribute_	= other.groupNormAttribute_;
+			groupMode_			= other.groupMode_;
+			groupNumSlices_		= other.groupNumSlices_;
+			groupPrecision_		= other.groupPrecision_;
+			groupStdDev_		= other.groupStdDev_;
+			groupFunction_		= other.groupFunction_;
+			groupNullAttr_		= other.groupNullAttr_;
+			groupNullAttr_		= other.groupNullAttr_;
+			groupMinVal_		= other.groupMinVal_;
+			groupMaxVal_		= other.groupMaxVal_;
+		}
+		return *this;
+	}
+};
+
+using namespace std;
+
+//! TerraLib definition of a Theme
+/*!
+\par A Theme is a collection of objects selected from a TeLayer spatial and non spatial 
+criteria. A theme points to the visual presentation parameters of its objects.
+
+\par A Theme store the parameters about how to group its objects according com its attributes. 
+
+\par A theme may have many associated graphics, which includes histogram, pie charts,
+scatterplots, etc. These graphics are visible only when the theme is visible.
+
+\par A theme has a threshold, that defines the minimum and maximum scales 
+at which the Theme is drawn.
+
+  \sa TeView TeTable
+*/
+class TeTheme: public TeViewNode
+{
+public:
+
+	//! Constructor
+    TeTheme( const string& name="", TeLayer* layer=0, TeViewNode* parent = 0, int view=0, int id=0)
+		: TeViewNode(name, parent, view, id, TeTHEME),
+		layer_(layer),
+		generateAttributeRest_(""),
+		generateTemporalRest_(""),
+		hasSpatialRes_(false),
+		geomRest_(0),
+		minScale_(0.0),
+		maxScale_(0.0),
+		visibleRep_(0),
+		enableVisibility_(1),
+		grouping_(0),
+		rasterVisual_(0)
+		{	
+			//default legends
+			TeVisual visp(TePOLYGONS);
+			TeVisual visl(TeLINES);
+			TeVisual vispt(TePOINTS);
+			TeVisual vist(TeTEXT);
+			TeColor	color;
+			color.init(100, 220, 220);
+			visp.color(color);
+			visl.color(color);
+			vispt.color(color);
+			color.init(100, 100, 100);
+			visp.contourColor(color);
+			visl.contourColor(color);
+			vispt.contourColor(color);
+			outOfCollectionLegend_.setVisual(visp, TePOLYGONS);		
+			outOfCollectionLegend_.setVisual(visl, TeLINES);		
+			outOfCollectionLegend_.setVisual(vispt, TePOINTS);		
+
+			color.init(220, 100, 220);
+			visp.color(color);
+			visl.color(color);
+			vispt.color(color);
+			color.init(100, 100, 100);
+			visp.contourColor(color);
+			visl.contourColor(color);
+			vispt.contourColor(color);
+			withoutDataConnectionLegend_.setVisual(visp, TePOLYGONS);		
+			withoutDataConnectionLegend_.setVisual(visl, TeLINES);		
+			withoutDataConnectionLegend_.setVisual(vispt, TePOINTS);		
+
+			color.init(220, 0, 0);
+			visp.color(color);
+			color.init(0, 220, 220);
+			visl.color(color);
+			color.init(220, 90, 180);
+			vispt.color(color);
+			color.init(100, 100, 100);
+			visp.contourColor(color);
+			visl.contourColor(color);
+			vispt.contourColor(color);
+			defaultLegend_.setVisual(visp, TePOLYGONS);		
+			defaultLegend_.setVisual(visl, TeLINES);		
+			defaultLegend_.setVisual(vispt, TePOINTS);		
+			color.init(0, 0, 0);
+			vist.color(color);
+			defaultLegend_.setVisual(vist, TeTEXT);		
+
+				
+			color.init(80, 240, 100);
+			visp.color(color);
+			color.init(100, 100, 100);
+			visp.contourColor(color);
+			pointingLegend_.setVisual(visp, TePOLYGONS);		
+			
+			color.init(210, 210, 0);
+			visp.color(color);
+			color.init(100, 100, 100);
+			visp.contourColor(color);		
+			queryLegend_.setVisual(visp, TePOLYGONS);		
+									
+			color.init(255, 255, 0);
+			visp.color(color);
+			color.init(100, 100, 100);
+			visp.contourColor(color);		
+			queryAndPointingLegend_.setVisual(visp, TePOLYGONS);	
+
+			//layer id
+			if(layer)
+			{
+				layerId_ = layer->id();
+			}
+			else
+				layerId_ = -1;
+		}
+
+	//! Copy constructor
+	TeTheme (TeTheme& other) : TeViewNode(other.name(), other.parent(), other.view(), other.id(), TeTHEME) 
+	{
+		layerId_ = other.layerId();
+		layer_ = other.layer();      //the same layer pointer
+		generateAttributeRest_ = other.attributeRest();
+		generateTemporalRest_ = other.temporalRest();
+		generateSpatialRest_ = other.spatialRest(); 
+		spatialRelation_ = other.spatialRelation();
+		hasSpatialRes_ =  other.hasSpatialRest();
+		boxRest_ = other.boxRestriction();
+		geomRest_ = other.geomRestriction(); 
+		geomRepRest_ = other.geomRepRestriction();	
+		minScale_ = other.minScale();
+		maxScale_ = other.maxScale();
+		collectionTable_ = other.collectionTable();
+		collectionAuxTable_ = other.collectionAuxTable();
+		visibleRep_ = other.visibleRep();
+		enableVisibility_ = other.visibility();
+
+		if(grouping_)
+			delete grouping_;
+		grouping_ = 0;
+		if(other.grouping())
+		{
+			grouping_ = new TeGrouping();
+			(*grouping_) = (*other.grouping());
+		}
+
+		legend_ = other.legend();
+		outOfCollectionLegend_ = other.outOfCollectionLegend();
+		withoutDataConnectionLegend_ = other.withoutDataConnectionLegend();	
+		defaultLegend_ = other.defaultLegend ();
+		pointingLegend_ = other.pointingLegend();
+		queryLegend_ = other.queryLegend();
+		queryAndPointingLegend_ = other.queryAndPointingLegend(); 
+		
+		attTableVector_ = other.attrTables();
+		sqlFrom_ =  other.sqlFrom();		
+		sqlJoin_ = other.sqlGridJoin();
+		sqlGridFrom_ = other.sqlGridFrom();
+		sqlGridJoin_ = other.sqlGridJoin();
+		aliasVector_ = other.aliasVector();
+		sqlAttList_ = other.sqlAttList();
+		sqlNumAttList_ = other.sqlNumAttList();		
+	
+		if(rasterVisual_)
+			delete rasterVisual_;
+		rasterVisual_ = 0;
+		if(other.rasterVisual())
+		{
+			rasterVisual_ = new TeRasterTransform();
+			(*rasterVisual_) = (*other.rasterVisual());
+		}
+	}
+
+	//! Destructor
+	~TeTheme () 
+	{ 
+		if (rasterVisual_)
+			delete rasterVisual_;
+		if (grouping_)
+			delete grouping_;
+	}
+
+	//! Assignment operator
+	TeTheme& operator= (TeTheme& other); 
+	
+	//! Returns the id of the source layer
+	int	 layerId () 
+	{	return layerId_; }
+
+	//! Sets the id of the source layer
+	void layerId(int i)
+	{	layerId_ = i; }
+
+	//! Set the source layer
+	/*! \param layer a pointer to a layer from which theme get its objects
+	*/
+	void layer (TeLayer* layer)
+	{
+		layer_ = layer;
+		if (layer)
+			layerId_ = layer->id();
+	}
+
+	//! Returns a pointer to the layer from which the theme get its objects
+	TeLayer* layer () { return layer_; }
+
+	//! Returns TRUE if a theme has lower priority than another
+	bool operator< (const TeTheme& r) const
+	{	return priority_ < r.priority_; }
+
+	//! Returns the minimum scale in which the theme is visible
+	double minScale () { return minScale_; }
+	//! Set the minimum scale in which the theme is visible
+	void minScale (double s) { minScale_ = s; }
+
+	//! Returns the maximum scale in which the theme is visible
+	double maxScale () { return maxScale_; }
+	//! Set the maximum scale in which the theme is visible
+	void maxScale (double s) { maxScale_ = s; }
+
+	//! Returns a vector of theme legends
+	TeLegendEntryVector& legend () { return legend_; }
+
+	//! Returns the attribute restriction (where clause) used to generate the theme  
+	string attributeRest() { return generateAttributeRest_; }
+	//! Set the attribute restriction (where clause) used to generate the theme
+	void attributeRest(const string& s) { generateAttributeRest_ = s; }
+	//! Returns if there is an attribute restriction  
+	bool hasAttrRest () { return (!generateAttributeRest_.empty());}
+
+	//! Returns the temporal restriction used to generate the theme
+	string temporalRest() { return generateTemporalRest_; }
+	//! Set the temporal restriction used to generate the theme
+	void temporalRest(const string& t) { generateTemporalRest_ = t; };
+	//! Returns if there is a temporal restriction 
+	bool hasTemporalRest () { return (!generateTemporalRest_.empty());}
+
+	//! Returns the spatial restriction used to generate the theme
+	string spatialRest() { return generateSpatialRest_; }
+	//! Set the spatial restriction used to generate the theme
+	void spatialRest(const string& s) { generateSpatialRest_ = s; };
+	
+	//! Returns the spatial relation 
+	TeSpatialRelation	spatialRelation() {return spatialRelation_;}
+	//! Sets the spatial relation
+	void spatialRelation(TeSpatialRelation s) {spatialRelation_=s;}
+	
+	//! Returns if there is a spatial restriction 
+	bool hasSpatialRest () { return hasSpatialRes_;}
+	//! Sets if there is a spatial restriction 
+	void hasSpatialRest (bool a) {hasSpatialRes_ = a;}
+	
+	//! Returns the box associated with the spatial restriction
+	TeBox boxRestriction() {return boxRest_;}
+	//! Sets the box associated with the spatial restriction
+	void boxRestriction (TeBox& b) {boxRest_ = b;}
+
+	//! Returns a pointer to the geometry associated with the spatial restriction
+	TeGeometry* geomRestriction() { return geomRest_;}
+	//! Sets a pointer to the geometry associated with the spatial restriction
+	void geomRestriction(TeGeometry* g) {geomRest_ = g;}
+
+	//! Returns the geometry representation of the theme which will be considered in the spatial restriction  
+	TeGeomRep geomRepRestriction() { return geomRepRest_; }
+	//! Sets the geometry representation of the theme which will be considered in the spatial restriction  
+	void geomRepRestriction (TeGeomRep& rep) { geomRepRest_ = rep; }
+
+	//! Set the spatial restriction to be a spatial relation with a box
+	void setSpatialRest(TeBox& box, TeGeomRep rep = TeGEOMETRYNONE, TeSpatialRelation relation = TeWITHIN); 
+	//! Set the spatial restriction to be a spatial relation with a geometry
+	void setSpatialRest(TeGeometry* geom, TeGeomRep rep = TeGEOMETRYNONE, TeSpatialRelation relation = TeWITHIN); 
+	
+	//! Returns the name of a table used to store the ids of the objects belonging to the theme
+	string	collectionTable() { return collectionTable_; }
+	//! Set the name of a table used to store the ids of the objects belonging to the theme
+	void collectionTable(const string& s) { collectionTable_ = s; }
+
+	//! Return the name of the collection auxiliary table
+	string collectionAuxTable() { return collectionAuxTable_; }
+	//! Set the name of the collection auxiliary table
+	void collectionAuxTable(string name) { collectionAuxTable_ = name; }
+
+	//! Set the visible representation 
+	void visibleRep (int rep) { visibleRep_ = rep; }
+	//! Return the visible representation 
+	int visibleRep () { return visibleRep_; }
+
+	//! Returns the status of a theme
+	/*! 
+		- Returns 0 if the theme is not visible and not active
+		- Returns 1 if the theme is visible and not active
+		- Returns 2 if theme is and active and not visible
+		- Returns 3 if theme is and visible and active
+	 */
+	int visibility()
+	{	return enableVisibility_; }
+	//! Set whether the theme should be visible and/or active
+	void visibility(int v)
+	{	enableVisibility_ = v; }
+
+
+	//! verify if the theme was generated with restrictions
+	bool hasRestriction() { return (!(generateAttributeRest_.empty() || 
+									  generateTemporalRest_.empty()) && hasSpatialRes_); }
+
+	//! Returns a grouping associated the theme 
+	TeGrouping* grouping() {return grouping_; }
+	
+	//! Sets a grouping associated the theme
+	void grouping(TeGrouping* g);
+	
+	//! Returns the legend (visual presentation) of the layer objects that aren�t selected in this layer
+	TeLegendEntry& outOfCollectionLegend () 
+	{ return outOfCollectionLegend_; } 
+	
+	//! Set the legend (visual presentation) of the layer objects that aren�t selected in this layer
+	void outOfCollectionLegend (TeLegendEntry &leg) 
+	{ outOfCollectionLegend_ = leg;}
+	
+	//! Set the visual of the layer objects that aren�t selected in this layer
+	void setVisualOutOfCollection (TeVisual& visual, TeGeomRep rep)
+	{ outOfCollectionLegend_.setVisual(visual, rep); }
+
+	//! Returns the legend (visual presentation) of the geometries without descriptive attributes
+	TeLegendEntry& withoutDataConnectionLegend () 
+	{ return withoutDataConnectionLegend_; }
+
+	//! Set the legend (visual presentation) of the geometries without descriptive attributes
+	void withoutDataConnectionLegend (TeLegendEntry &leg) 
+	{ withoutDataConnectionLegend_ = leg; }
+
+	//! Set the visualof the geometries without descriptive attributes
+	void setVisualWithoutDataConnection (TeVisual& visual, TeGeomRep rep)
+	{ withoutDataConnectionLegend_.setVisual(visual, rep); }
+
+	//! Returns the default legend (visual presentation) objects of the theme
+	TeLegendEntry& defaultLegend () 
+	{ return defaultLegend_; }
+	
+	//! Set the default legend (visual presentation) objects of the theme
+	void defaultLegend (TeLegendEntry& leg) 
+	{ defaultLegend_ = leg; }
+
+	//! Set the default visual of the objects of the theme
+	void setVisualDefault (TeVisual& visual, TeGeomRep rep)
+	{ defaultLegend_.setVisual(visual, rep); }
+	
+	//! Returns the legend (visual presentation) of the theme objects selected by pointing
+	TeLegendEntry& pointingLegend () 
+	{ return pointingLegend_; }
+	
+	//! Set the legend (visual presentation) of the theme objects selected by pointing
+	void pointingLegend (TeLegendEntry &leg) 
+	{ pointingLegend_ = leg; }
+
+	//! Set the visual of the theme objects selected by pointing
+	void setVisualPointing (TeVisual& visual, TeGeomRep rep)
+	{ pointingLegend_.setVisual(visual, rep); }
+
+	//! Returns the legend (visual presentation) of the theme objects selected by a query
+	TeLegendEntry& queryLegend () 
+	{ return queryLegend_; }
+	
+	//! Set the legend (visual presentation) of the theme objects selected by a query
+	void queryLegend (TeLegendEntry &leg) 
+	{ queryLegend_ = leg; }
+
+	//! Set the visual of the theme objects selected by a query
+	void setVisualQuery (TeVisual& visual, TeGeomRep rep)
+	{ queryLegend_.setVisual(visual, rep); }
+
+	//! Returns the legend (visual presentation) of the theme objects selected by query and pointing
+	TeLegendEntry& queryAndPointingLegend () 
+	{ return queryAndPointingLegend_; }
+	
+	//! Set the legend (visual presentation) of the theme objects selected by query and pointing
+	void queryAndPointingLegend (TeLegendEntry &leg) 
+	{ queryAndPointingLegend_ = leg; }
+
+	//! Set the visual of the theme objects selected by query and pointing
+	void setVisualQueryAndPointing (TeVisual& visual, TeGeomRep rep)
+	{ queryAndPointingLegend_.setVisual(visual, rep); }
+
+	//! Set the n-th grouping visual to a geometric representation
+	bool setGroupingVisual(int n, TeVisual& visual, TeGeomRep rep);
+
+	//! Set the n-th grouping visual of a particular group
+	bool setGroupingVisual(int n, TeGeomRepVisualMap& vismap);
+
+	//! get the grouping slices from the legends without visual
+	TeSliceVector getSlices();
+
+	//! Returns a vector of the attribute tables of the theme
+	bool getAttTables(TeAttrTableVector& attrs, TeAttrTableType attType = TeAllAttrTypes); 
+
+	//! Returns the temporal attribute table of the theme (TeEvent and TeFixedGeomDynAttr)
+	bool getTemporalTable(TeTable& table);
+	
+	//! Set the theme tables vector
+	bool setAttTables(TeAttrTableVector& attrs);  
+
+	//! Clear the list of theme tables
+	void clearAttTableVector() 
+	{	attTableVector_.clear();	}
+
+	//! Returns the vector of attribute tables 
+	TeAttrTableVector& attrTables()
+	{	return attTableVector_; }
+
+	//! Return a complete SQL statement to get all the attributes of the theme objects
+	string	sqlJoin() {return sqlJoin_;}
+
+	//! Return a FROM CLAUSE of a SQL statement to get attributes of theme objects
+	string	sqlFrom() {return sqlFrom_;}
+
+	//! Returns a SQL statement to get all the attributes of the theme objects, the attributes of the 
+	//! collection table, and the attributes of the extended collection table 
+	string sqlGridJoin() { return sqlGridJoin_; }
+
+	//! Returns a FROM clause of a SQL statement to get attributes of the theme objects, the attributes of the 
+	//! collection table, and the attributes of the extended collection table 
+	string sqlGridFrom(const string& geomTable=""); 
+
+	//! Return the clause WHERE from restrictions (spatial, attribute and temporal)
+	string sqlWhereRestrictions(TeRepresentation* rep=0);
+
+	//! Return the list of attributes of the theme tables 
+	TeAttributeList sqlAttList() {return sqlAttList_;}
+
+	//! Clear the list of attributes associated to the theme tables 
+	void clearAttList() {sqlAttList_.clear();}
+
+	//! Return the list of numerical attributes of the theme tables 
+	TeAttributeList sqlNumAttList() {return sqlNumAttList_;}
+
+	//! Clear the list of numerical attributes associated to the theme tables 
+	void clearNumAttList() {sqlNumAttList_.clear();}
+
+	//! Return the alias vector of the names of the theme tables
+	vector<string>&	aliasVector() { return aliasVector_; }
+
+	//! Save the theme informations in database
+	bool save();
+
+	//! Build the theme collection 
+	bool buildCollection();
+
+	//! Generate the label positions (x,y) to each object of the theme
+	bool generateLabelPositions();  
+
+	//! Clear the existing grouping of objects of this theme
+	void resetGrouping ();
+
+	//! Clean legend
+	void cleanLegend() { legend_.clear(); }
+
+	//! Save the grouping parameters in memory
+	bool buildGrouping(TeGrouping* g, TeSelectedObjects selectedObjects = TeAll,
+		               vector<double>* dValuesVec = 0);
+
+	//! Save grouping parameters in memory passing an arbitrary set of slices
+	bool buildGrouping(TeGrouping* g, vector<TeSlice>& slices);
+
+	//! Build the grouping and associate each object to its group in the collection table 
+	bool saveGrouping(TeSelectedObjects selectedObjects = TeAll);
+	
+	//! Add new theme table
+	virtual bool addThemeTable (TeTable& table);
+	virtual void addThemeTable (string tableName);
+
+	//! Verify if a table is a theme table, given its id
+	bool isThemeTable(int tableId);
+
+	//! Verify if a table is a theme table, given its name
+	bool isThemeTable(string tableName);
+
+	//! Return the table name of a given attribute
+	string getTableName(const string& attrName);
+
+	//! Removes an attribute table
+	bool removeThemeTable(unsigned int index);
+
+	//! Loads the theme tables in the database
+	bool loadThemeTables();
+
+	//! Delete grouping
+	bool deleteGrouping(); 
+
+	//! Create the auxiliar collection table based in the theme tables   
+	bool createCollectionAuxTable();
+
+	//! Populate the auxiliar collection table based in the theme tables
+	bool populateCollectionAux();
+
+	//! Load the new attribute list of all the theme tables.
+	//! All attributes are stored into sqlAttList_ and numeric attributes are stored into sqlNumAttList_.
+	void loadAttrLists();
+
+	/** @name Locate geometries
+	*  Returns the geometry(ies) of the theme that contains a given coordinate
+	*/
+	//@{ 	
+	bool locatePolygon		(TeCoord2D &pt, TePolygon &polygon, const double& tol = 0.0);
+	bool locatePolygonSet   (TeCoord2D &pt, double tol, TePolygonSet &polygons);
+	bool locateLine		(TeCoord2D &pt, TeLine2D &line, const double& tol = 0.0);
+	bool locatePoint	(TeCoord2D &pt, TePoint &point, const double& tol = 0.0);
+	bool locateCell		(TeCoord2D &pt, TeCell &c, const double& tol = 0.0);
+	//@}
+
+	/** @name Raster Visual
+	*  Methods to deal with the visual presentation of the raster
+	*/
+	//@{ 
+	//! Returns the visual presentation of raster geometry
+	TeRasterTransform* rasterVisual() 
+	{ return rasterVisual_; }
+
+	//! Sets the visual presentation of raster geometry
+	void rasterVisual(TeRasterTransform* r) 
+	{ rasterVisual_ = r; } 
+
+	//! Removes the visual presentation of the raster
+	void removeRasterVisual()
+	{ 
+		if (rasterVisual_)
+		{
+			delete rasterVisual_;
+			rasterVisual_ = 0;
+		}
+	}
+
+	//! Creates an appropriate visual presentation to the raster of the theme
+	void createRasterVisual(TeRaster* rst=0);
+	//@}
+
+protected:
+	// ----------------- theme information -----------------
+	
+	// General identification
+	int			layerId_;	// layer id
+		
+	// Associated layer and selected objects
+	TeLayer*	layer_;
+	
+	// Selection
+	//attribute restriction
+	string		generateAttributeRest_;
+	
+	// temporal restriction 
+	string		generateTemporalRest_;
+	
+	//spatial restriction
+	string				generateSpatialRest_; //future use
+
+	TeSpatialRelation	spatialRelation_;
+	bool				hasSpatialRes_;
+	TeBox				boxRest_;		//box which defines the spatial restriction 
+	TeGeometry*			geomRest_;		//geometry which defines the spatial restriction 
+	TeGeomRep			geomRepRest_;	//geometry representation of the theme which will be 
+										//considered in the spatial restriction  
+	// Display scale
+	double	minScale_;
+	double	maxScale_;
+
+	// collection table name
+	string	collectionTable_;
+	string	collectionAuxTable_;
+
+	//representation visible in the theme
+	int		visibleRep_;
+
+	//if theme is visible or not
+	int		enableVisibility_;
+
+	// ----------------- grouping information -----------------
+	TeGrouping*		grouping_;
+
+	// ----------------- legend information -----------------
+	TeLegendEntryVector	legend_;
+
+	// Background Legend
+	TeLegendEntry		outOfCollectionLegend_;			//group(-1) 
+	TeLegendEntry		withoutDataConnectionLegend_;	//group(-2) 
+	TeLegendEntry		defaultLegend_;					//group(-3) 
+	TeLegendEntry		pointingLegend_;				//group(-4) 
+	TeLegendEntry		queryLegend_;					//group(-5) 
+	TeLegendEntry		queryAndPointingLegend_;		//group(-6) 
+		
+	// ----------------- theme tables information -----------------
+	TeAttrTableVector	attTableVector_;
+	
+	//! clause FROM: join with the theme tables and collection table
+	string				sqlFrom_;		
+	
+	//! clause SELECT and FROM: join with the theme tables and collection table
+	string				sqlJoin_;
+	
+	//! clause FROM: join with the theme tables and auxiliar collection table
+	string				sqlGridFrom_;
+	
+	//! clause SELECT and FROM: join with the theme tables and auxiliar collection table
+	string				sqlGridJoin_;
+
+	//! vector of alias to the attribute tables that are used more than once  
+	vector<string>		aliasVector_;
+
+	//! list containing all the attributes of the theme tables
+	TeAttributeList	sqlAttList_;
+	
+	//! list containing only the numeric attributes of the the theme tables
+	TeAttributeList	sqlNumAttList_;		
+
+	//! visual of raster
+	TeRasterTransform*		rasterVisual_;
+
+	//! fill aliasVector_
+	void loadAliasVector();
+
+	//! Fill the sqlJoin_ and sqlFrom_ 
+	void loadThemeTablesJoin();
+
+	//! Fill the sqlGridJoin_ and sqlGridFrom_ 
+	void loadTablesJoin(const string& geomTable="");
+
+	//! Save the theme grouping legends in the collection table  
+	bool saveLegendInCollection(TeSelectedObjects selectedObjects = TeAll);
+	
+	//! Populate the collection table based in the theme restrictions
+	bool populateCollection(); 
+
+};
+
+//! A vector of pointers to Theme
+typedef vector<TeTheme*>	TeThemeVector;
+
+//! A map from theme identifier to pointer to theme
+typedef map<int, TeTheme*>	TeThemeMap;
+
+/*! \example ThemeExample1.cpp
+	This is an example of how to create themes in TerraLib.
+ */
+
+/*! \example ThemeExample2.cpp
+	This is an example of how to do a grouping on the objects of a TerraLib theme.
+ */
+#endif
+
diff --git a/src/terralib/kernel/TeTime.cpp b/src/terralib/kernel/TeTime.cpp
new file mode 100644
index 0000000..0f99dec
--- /dev/null
+++ b/src/terralib/kernel/TeTime.cpp
@@ -0,0 +1,612 @@
+ /************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library. 
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include <TeTime.h>
+#include <memory.h>
+#include <TeUtils.h>
+#include <iostream>
+
+//return the number of the month
+int getMonth(const string& month)
+{
+	string tempM = TeConvertToUpperCase(month);
+	if(tempM=="JAN")
+		return 0;
+	else if(tempM=="FEB")
+		return 1;
+	else if(tempM=="MAR")
+		return 2;
+	else if(tempM=="APR")
+		return 3;
+	else if(tempM=="MAY")
+		return 4; 
+	else if(tempM=="JUN")
+		return 5;
+	else if(tempM=="JUL")
+		return 6;
+	else if(tempM=="AUG")
+		return 7;
+	else if(tempM=="SEP")
+		return 8;
+	else if(tempM=="OCT")
+		return 9;
+	else if(tempM=="NOV")
+		return 10;
+	else if(tempM=="DEC")
+		return 11;
+
+	return -1;
+}
+
+//return the month 
+string getMonth(int i)
+{
+	if(i==0)
+		return "Jan";
+	else if(i==1)
+		return "Feb";
+	else if(i==2)
+		return "Mar";
+	else if(i==3)
+		return "Apr";
+	else if(i==4)
+		return "May";
+	else if(i==5)
+		return "Jun";
+	else if(i==6)
+		return "Jul";
+	else if(i==7)
+		return "Aug";
+	else if(i==8)
+		return "Sep";
+	else if(i==9)
+		return "Oct";
+	else if(i==10)
+		return "Nov";
+	else if(i==11)
+		return "Dec";
+
+	return "";
+}
+
+
+TeTime::TeTime()
+{
+    /*
+	set the tm_isdst field to 0 to indicate that standard time is in effect, 
+	or to a value greater than 0 to indicate that daylight savings time is in effect, 
+	or to a value less than zero to have the C run-time library code compute whether 
+	standard time or daylight savings time is in effect. 
+	(The C run-time library assumes the United States�s rules for implementing 
+	the calculation of Daylight Saving Time).
+	*/
+
+	chronon_ = TeSECOND;
+	ts_.tm_sec = 0;
+	ts_.tm_min = 0;
+	ts_.tm_hour = 0;
+	ts_.tm_isdst = -1;
+	ts_.tm_mday = 0;
+	ts_.tm_mon = 0;
+	ts_.tm_year = 0;
+}
+
+TeTime::TeTime(const TeTime& other)
+{
+	memcpy(&ts_, &other.ts_, sizeof(struct tm));
+	last_ = other.last_;
+	chronon_ = other.chronon_;
+}
+
+TeTime::TeTime(int h, int m, int s, TeChronon chronon)
+{
+	now();
+	ts_ = *localtime(&last_);
+	ts_.tm_sec = s;
+	ts_.tm_min = m;
+	ts_.tm_hour = h;
+	ts_.tm_isdst = -1;
+	ts_.tm_mday = 0;
+	ts_.tm_mon = 0;
+	ts_.tm_year = 0;
+	last_ = mktime(&ts_);
+	chronon_ = chronon;
+}
+
+TeTime::TeTime(const string& ds, TeChronon chronon, const string& mask, const string& dateS, const string& timeS, const string& indPM)
+{
+	chronon_ = chronon;
+	ts_.tm_sec = 0;
+	ts_.tm_min = 0;
+	ts_.tm_hour = 0;
+	ts_.tm_isdst = -1; 
+	ts_.tm_mday = 0;
+	ts_.tm_mon = 0;
+	ts_.tm_year = 0;
+	
+	bool flag = true;
+	string tempDT, tempM;
+	string maskTemp = mask;
+	
+	int posBeginMask = 0;
+	int posBeginDate = 0;
+	int posEndMask;
+	int posEndTotalMask = 0;
+	
+	if (mask == "YYYYMMDD" || mask == "yyyymmdd" || mask == "aaaammdd" || mask == "AAAAMMDD")
+	{
+		sscanf(ds.c_str(),"%4d%2d%2d",&ts_.tm_year,&ts_.tm_mon,&ts_.tm_mday);
+	}
+	else if (mask == "DDMMAAAA" || mask == "ddmmaaaa" || mask == "DDMMYYYY" || mask == "ddmmyyyy")
+	{
+		sscanf(ds.c_str(),"%2d%2d%4d",&ts_.tm_mday,&ts_.tm_mon,&ts_.tm_year);
+	}
+	else
+	{
+		while(flag)
+		{
+			posEndMask = maskTemp.find("s");
+			posEndTotalMask += posEndMask;
+			
+			if(posEndMask==-1)
+			{
+				flag = false;
+				posEndTotalMask = mask.size();
+			}
+			else
+			{
+				if(posBeginMask>0)
+					++posEndTotalMask;
+				
+				maskTemp = maskTemp.substr(posEndMask+1, (maskTemp.size()-(posEndMask+1)));
+			}
+
+			tempDT.clear();
+			tempM = mask.substr(posBeginMask,(posEndTotalMask-posBeginMask));
+
+			//fill the datetime
+			string dt = ds.substr(posBeginDate,1);
+			while((dt!=dateS) && (dt!=timeS) && (dt!=" ") && (posBeginDate < (int)ds.size()))
+			{
+				tempDT += dt;
+				++posBeginDate;
+				dt = ds.substr(posBeginDate,1);
+			}
+			++posBeginDate;
+			
+			//day
+			if(tempM.find(68)==0)
+				ts_.tm_mday = atoi(tempDT.c_str());
+			
+			//month
+			else if (tempM.find(77)==0)
+			{
+				if(tempDT.size()>2)
+					ts_.tm_mon = getMonth(tempDT)+1;
+				else
+					ts_.tm_mon = atoi(tempDT.c_str());
+			}
+
+			//year
+			else if (tempM.find(89)==0)
+			{
+				ts_.tm_year = atoi(tempDT.c_str());
+				if(ts_.tm_year < 100) 
+					ts_.tm_year += 1900; 
+			}
+
+			//hour
+			else if (tempM.find(72)==0)
+				ts_.tm_hour = atoi(tempDT.c_str());
+			
+			//minute
+			else if (tempM.find(109)==0)
+				ts_.tm_min = atoi(tempDT.c_str());
+			
+			//second
+			else if (tempM.find(83)==0)
+				ts_.tm_sec = atoi(tempDT.c_str());
+			
+			//PM or AM indicator
+			else if ((tempM.find(84)==0) && (tempDT==indPM))
+				ts_.tm_hour += 12;
+				
+			posBeginMask = posEndTotalMask+1;
+
+			if((posBeginDate)>(int)(ds.size()-1) || (posBeginMask)>(int)(mask.size()-1))
+				flag = false;
+		}
+	}
+			
+	switch (chronon_) 
+	{
+	case TeYEAR :
+		ts_.tm_mon = 1;
+        break;
+	case TeMONTH :
+		ts_.tm_mday = 0;
+        break;
+	case TeDAY :
+		ts_.tm_hour = 0;
+        break;
+	case TeHOUR :
+		ts_.tm_min = 0;
+        break;
+	case TeMINUTE :
+		ts_.tm_sec = 0;
+        break;
+	default:
+        break;
+	}
+    
+	ts_.tm_year -= 1900;
+    --ts_.tm_mon;
+
+	last_ = mktime(&ts_);
+	if (last_ != time_t(-1))
+		ts_ = *localtime(&last_);
+}
+
+time_t TeTime::now(void)
+{
+	time(&last_);
+	ts_ = *localtime(&last_);
+	return last_;
+}
+
+string
+TeTime::getTime() 
+{
+	char tbuf[9];
+    sprintf(tbuf, "%02d:%02d:%02d",
+                                ts_.tm_hour,ts_.tm_min,ts_.tm_sec);
+    return tbuf;
+}
+
+
+string
+TeTime::getDate()  
+{
+	char dbuf[12];
+	sprintf(dbuf,"%4d-%02d-%02d",ts_.tm_year+1900,ts_.tm_mon+1,ts_.tm_mday);
+	return dbuf;
+}
+
+string
+TeTime::getDateTime (const string& mask, const string& dateS, const string& timeS, const string& indPM, const string& indAM)
+{
+	string result = "";
+
+	if(!this->isValid())
+		return result;
+
+	bool flag = true;
+	string tempM;
+	string maskTemp = mask;
+	
+	int posBeginMask = 0;
+	int posEndMask;
+	int posEndTotalMask = 0;
+
+	bool firstTime = true;
+	bool pm = false;
+	bool am = false;
+ 
+	//verify if the mask is AM and PM
+	string tempAPM = mask.substr(mask.size()-1, 1);
+	if(tempAPM=="T")
+	{
+		if((ts_.tm_hour>12) || ((ts_.tm_hour==12) && (ts_.tm_min>0)) ||
+			((ts_.tm_hour==12) && (ts_.tm_min==0) && (ts_.tm_sec>0)))
+			pm=true;
+		else
+			am=true;
+	}
+
+	while(flag)
+	{
+		posEndMask = maskTemp.find("s");
+		posEndTotalMask += posEndMask;
+
+		if(posEndMask==-1)
+		{
+			flag = false;
+			posEndTotalMask = mask.size();
+		}
+		else
+		{
+			if(posBeginMask>0)
+				++posEndTotalMask;
+
+			maskTemp = maskTemp.substr(posEndMask+1, (maskTemp.size()-(posEndMask+1)));
+		}
+
+		tempM = mask.substr(posBeginMask,(posEndTotalMask-posBeginMask));
+
+		//day
+		if(tempM.find(68)==0)
+			result +=  Te2String(ts_.tm_mday) + dateS;
+		
+		//month
+		else if (tempM.find(77)==0)
+		{
+			if(tempM=="MMM")
+				result += getMonth(ts_.tm_mon) + dateS;
+			else
+				result += Te2String(ts_.tm_mon+1) + dateS;
+		}
+
+		//year
+		else if (tempM.find(89)==0)
+		{
+			if(tempM=="YYYY")
+				result +=  Te2String(ts_.tm_year+1900) + dateS;
+			else
+			{
+				string tempY = Te2String(ts_.tm_year);
+				tempY = tempY.substr(tempY.size()-2, 2);
+				result += tempY + dateS;
+			}
+		}
+
+		//hour
+		else if (tempM.find(72)==0)
+		{
+			if(firstTime)
+				result.replace(result.size()-1, 1, " ");
+
+			if(pm)
+				result += Te2String(ts_.tm_hour-12) + timeS;
+			else
+				result += Te2String(ts_.tm_hour) + timeS;
+			
+			firstTime = false;
+		}
+
+		//minute
+		else if (tempM.find(109)==0)
+		{
+			if(firstTime)
+				result.replace(result.size()-1, 1, " ");
+
+			result += Te2String(ts_.tm_min) + timeS;
+			firstTime = false;
+		}
+
+		//second
+		else if (tempM.find(83)==0)
+		{
+			if(firstTime)
+				result.replace(result.size()-1, 1, " ");
+
+			result += Te2String(ts_.tm_sec) + timeS;
+			firstTime = false;
+		}
+		
+		//PM or AM indicator
+		else if (tempM.find(84)==0)
+		{
+			result.replace(result.size()-1, 1, " ");
+
+			if(pm)
+				result += indPM;
+			else if(am)
+				result += indAM; 
+			
+		}
+		
+		posBeginMask = posEndTotalMask+1;
+	}
+
+	if((!am) && (!pm))
+		result.replace(result.size()-1, 1, " ");
+
+	return result;
+}
+
+time_t 
+TeTime::Set(int y, int m, int d, int h, int mt, int s)
+{
+    if (y > -1) ts_.tm_year = y-1900;
+    if (m > -1) ts_.tm_mon = m-1;
+
+
+    if (d > -1) ts_.tm_mday = d;
+    if (h > -1) ts_.tm_hour = h;
+    if (mt > -1) ts_.tm_min = mt;
+    if (s > -1) ts_.tm_sec = s;
+	ts_.tm_isdst =-1;
+    last_ = mktime(&ts_);
+    if (last_ == -1) last_ = 0;
+    return last_;
+}
+
+TeTime& 
+TeTime::operator=(const TeTime& other)
+{
+	memcpy(&ts_, &other.ts_, sizeof(struct tm));
+	last_ = other.last_;
+	chronon_ = other.chronon_;
+	return *this;			
+}
+
+
+TeTime&
+TeTime::operator+=(int delta) 
+{
+	if (delta == 0)
+		return *this;
+
+	int deltaux=delta;
+	switch (chronon_)
+	{
+	case TeYEAR :
+		ts_.tm_isdst = -1;
+		ts_.tm_year += delta;	
+		last_ = mktime(&ts_);
+		break;
+	case TeMONTH :
+	case TeMONTHOFYEAR:
+		ts_.tm_isdst = -1;
+		ts_.tm_year += (ts_.tm_mon+delta)/12;
+		ts_.tm_mon = (ts_.tm_mon+delta)%12;
+		last_ = mktime(&ts_);
+		break;
+	case TeDAY :
+	case TeDAYOFMONTH:
+	case TeDAYOFWEEK:
+	case TeDAYOFYEAR:
+		deltaux *= 3600*24;
+		last_ += deltaux;
+		ts_ = *localtime(&last_);
+		break;
+	case TeHOUR :
+	case TeHOUROFDAY :
+		deltaux *= 3600;
+		last_ += deltaux;
+		ts_ = *localtime(&last_);
+		break;
+	case TeMINUTE :
+	case TeMINUTEOFHOUR:
+		deltaux *= 60;;
+		last_ += deltaux;
+		ts_ = *localtime(&last_);
+		break;
+	case TeSECOND :
+	case TeSECONDOFMINUTE :
+		last_ += deltaux;
+		ts_ = *localtime(&last_);
+		break;
+	default :
+		break;
+	}
+
+    return *this;
+}
+
+TeTime&
+TeTime::operator++() 
+{
+	this->operator +=(1);
+	return *this;
+}
+
+TeTime
+TeTime::operator+(int delta)
+{
+	TeTime temp(*this);
+    temp += delta;
+    return temp;
+}
+
+TeTime&
+TeTime::operator-=(int delta) 
+{
+    last_ -= delta;
+    ts_ = *localtime(&last_);
+    return *this;
+}
+
+bool 
+TeTime::operator==(const TeTime& time) const
+{
+	return ((chronon_==time.chronon_) && (ts_.tm_sec==time.ts_.tm_sec) && (ts_.tm_min==time.ts_.tm_min) && 
+		(ts_.tm_hour==time.ts_.tm_hour) && (ts_.tm_isdst==time.ts_.tm_isdst) && (ts_.tm_mday==time.ts_.tm_mday) &&
+		(ts_.tm_mon==time.ts_.tm_mon) && (ts_.tm_year==time.ts_.tm_year));
+}
+
+bool 
+TeTime::operator<(const TeTime& time) const  
+{
+	if(chronon_!=time.chronon_)
+		return false;
+	
+	if(ts_.tm_year>time.ts_.tm_year)
+		return false; 
+	else if(ts_.tm_year<time.ts_.tm_year)
+		return true;
+
+	if(ts_.tm_mon>time.ts_.tm_mon)
+		return false;
+	else if (ts_.tm_mon<time.ts_.tm_mon)
+		return true;
+
+	if(ts_.tm_mday>time.ts_.tm_mday) 
+		return false;
+	else if (ts_.tm_mday<time.ts_.tm_mday) 
+		return true;
+
+	if(ts_.tm_hour>time.ts_.tm_hour) 
+		return false;
+	else if (ts_.tm_hour<time.ts_.tm_hour)
+		return true;
+
+	if(ts_.tm_min>time.ts_.tm_min) 
+		return false;
+	else if (ts_.tm_min<time.ts_.tm_min)
+		return true;
+
+	if(ts_.tm_sec>time.ts_.tm_sec) 
+		return false;
+	else if (ts_.tm_sec<time.ts_.tm_sec)
+		return true;
+
+	return false;
+}
+
+bool 
+TeTime::operator<=(const TeTime& time) const 
+{
+	return (this->operator<(time) || this->operator==(time));
+}
+
+bool 
+TeTime::isValid()  
+{
+	if(	(chronon_==TeSECOND) && (ts_.tm_sec==0) && (ts_.tm_min==0) && 
+		(ts_.tm_hour==0) && (ts_.tm_mday==0) &&
+		(ts_.tm_mon==0) && (ts_.tm_year==0))
+		return false;
+	else
+		return true;
+}
+
+void 
+TeTime::chronon (TeChronon c)
+{
+	if(chronon_==c)
+		return;
+
+	chronon_=c;
+}
+
+
+ostream& operator<<(ostream& os, TeTime& N)
+{
+	os << N.getDateTime();
+	return os;
+}
+
+
+
+
diff --git a/src/terralib/kernel/TeTime.h b/src/terralib/kernel/TeTime.h
new file mode 100644
index 0000000..ec245c4
--- /dev/null
+++ b/src/terralib/kernel/TeTime.h
@@ -0,0 +1,156 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTime.h
+    This file contains structures and definitions to deal with date and time
+*/
+
+#ifndef  __TERRALIB_INTERNAL_TIME_H
+#define  __TERRALIB_INTERNAL_TIME_H
+
+
+#include "TeDataTypes.h"
+
+#include <time.h> 
+#include <stdio.h>
+#include <string>
+#include <iostream>
+
+
+using namespace std;
+
+
+//!  A class for supporting date and time. 
+class TeTime
+{
+    struct tm ts_; 		// Unix time structure
+    time_t last_;		// time in seconds
+	TeChronon chronon_;
+
+public:
+	
+	//!	Set the date and time from the system clock.
+	time_t now(void);
+
+	//!	Set all time information with NULL value 
+	TeTime(void);
+	
+	//!	Copy constructor.
+	TeTime(const TeTime& t);
+
+	//!	Set the date from the system clock and the time from its parameter list. Chronon defaulted to second.
+	TeTime(int h, int m, int s, TeChronon chronon);
+
+	//!	Set date and time from arguments, though the time fields.  
+	TeTime(	const string& dt, TeChronon chronon, const string& mask, 
+			const string& dateS = "/", const string& timeS = ":", const string& indPM = "PM");
+
+	//!	Return a time of day string in format "hh:mm:ss"
+	string getTime();
+
+	//!	Return a string to the date in the form "yyyy-mm-dd"
+	string getDate(void);
+
+	//!	Return a pointer to the date and time in the form passed in mask.  
+	string getDateTime (const string& mask= "DDsMMsYYYYsHHsmmsSS", const string& dateS="/", const string& timeS=":", const string& indPM="PM", const string& indAM="AM");
+
+
+	//! Reset time to the specified arguments. Return time_t: number of seconds since 0:00:00 Jan 1 1987
+	/*!
+      \param y  year
+	  \param m  month
+	  \param d  day
+	  \param h  hour
+	  \param min  minutes
+      \param s  seconds
+	 */
+	time_t Set(int y, int m, int d, int h = 0, int min = 0, int s = 0);
+
+
+	//! Get year value as an four digit integer
+	int year()	{return ts_.tm_year+1900;}  
+	
+	//! Get month value
+	int month() {return ts_.tm_mon+1;}
+	
+	//! Get day of the month value
+	int day()	{return ts_.tm_mday;} 
+	
+	//! Get hour value as an integer
+	int hour()	{return ts_.tm_hour;}
+	
+	//! Get minute value as an integer
+	int minute() {return ts_.tm_min;}
+	
+	//! Get second value as an integer
+	int second() {return ts_.tm_sec;} 
+
+	//! Get week day as in integer
+	int weekDay() { return ts_.tm_wday;} //(0-6) 0=Sunday 
+
+	//! Get year day as in integer
+	int yearDay() { return ts_.tm_yday;} //(0-365) 01/01=0 
+	
+	//! Get chronon definition
+	TeChronon chronon () {return chronon_;}
+
+	//! Set chronon definition
+	void chronon (TeChronon c);  
+	
+	//!	Assignment operator for TeTime objects.
+	TeTime& operator=(const TeTime&);
+
+	//!	Add 'delta' chronon units to the current date. Return current date.
+	TeTime& operator+=(int delta);
+
+	//! Increase a chronon unit in the time (Prefix operator)
+	TeTime& operator++();
+
+	//!	Add 'delta' chronon units to the current date and return a new date. Return new date.
+	TeTime operator+(int delta);
+
+	//!	Subtract 'delta' chronon units from the current date. Return current date.
+	TeTime& operator-=(int delta);
+			
+	//! Operator ==
+	bool operator==(const TeTime& time) const;  
+
+	//! Operator <
+	bool operator<(const TeTime& time) const;
+
+	bool operator<=(const TeTime& time) const;
+	
+	//! verify if the time has null values  
+	bool isValid();  
+	
+	//!	Normal destructor.
+    ~TeTime(void) { }
+
+};
+
+ostream& operator<<(ostream& os, TeTime& N);
+
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeTimeInterval.cpp b/src/terralib/kernel/TeTimeInterval.cpp
new file mode 100644
index 0000000..4b39b92
--- /dev/null
+++ b/src/terralib/kernel/TeTimeInterval.cpp
@@ -0,0 +1,181 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTimeInterval.h"
+
+TeTimeInterval :: TeTimeInterval(const string& s1, const string& s2, TeChronon chronon, 
+								 const string& mask, const string& dateS, const string& timeS, 
+								 const string& indPM)
+{
+	intChronon_ = chronon;
+	//build t1 and t2 with the chronon parameter 
+	TeTime t1 (s1, chronon, mask, dateS, timeS, indPM);
+	TeTime t2 (s2, chronon, mask, dateS, timeS, indPM);
+	t1_ = t1;
+	t2_ = t2;
+	adjustIntervaltoChronon();
+
+}
+
+void 
+TeTimeInterval::intervalChronon(TeChronon c)
+{ 
+	intChronon_ = c; 
+	t1_.chronon(c); 
+	t2_.chronon(c); 
+	adjustIntervaltoChronon();
+}
+
+void  
+TeTimeInterval::adjustIntervaltoChronon ()
+{
+	int m2 = t2_.month();
+	int d2 = 31;
+	int d1 = 1;
+
+	if ((m2 == 4) || (m2 == 6) || (m2 == 9) || (m2 == 11))  //april, june, september, november
+		d2 = 30;
+	if (m2 == 2) //february
+		d2 = 28;
+
+	switch (intChronon_)
+	{
+	case TeYEAR :		
+	    t1_.Set(t1_.year(), 1 , 1, 0, 0, 0);
+		t2_.Set(t2_.year(), 12, 31, 23, 59, 59);
+	   break;
+	case TeMONTH :
+		t1_.Set(t1_.year(), t1_.month(), d1, 0, 0, 0);
+	    t2_.Set(t2_.year(), t2_.month(), d2, 23, 59, 59);
+	   break;
+	case TeDAY :
+		t1_.Set(t1_.year(), t1_.month(), t1_.day(), 0, 0, 0);
+	    t2_.Set(t2_.year(), t2_.month(), t2_.day(), 23, 59, 59);
+	   break;
+	case TeHOUR :
+		t1_.Set(t1_.year(), t1_.month(), t1_.day(), t1_.hour(), 0, 0);
+	    t2_.Set(t2_.year(), t2_.month(), t2_.day(), t2_.hour(), 59, 59);
+	   break;
+	case TeMINUTE :
+		t1_.Set(t1_.year(), t1_.month(), t1_.day(), t1_.hour(), t1_.minute(), 0);
+	    t2_.Set(t2_.year(), t2_.month(), t2_.day(), t2_.hour(), t2_.minute(), 59);
+        break;
+    default:
+        break;
+	}	
+}
+
+
+int 
+TeTimeInterval :: length ()
+{
+	return 1;
+}
+
+void  
+TeTimeInterval :: shift (const string& t)
+{
+	TeTime new_t1; 
+	if (t == "")  
+		TeTime new_t1 (t2_);  
+	else		  
+		TeTime new_t1 (t, t2_.chronon(), "YYYYsMMsDDsHHsmmsSS");
+
+	TeTime new_t2 = new_t1 + length();
+
+	t1_ = new_t1;
+	t2_ = new_t2;
+	adjustIntervaltoChronon();
+}
+
+
+void  
+TeTimeInterval :: shiftPlus (int delta)
+{
+	t1_ += delta;
+	t2_ = t1_ + (delta - 1);
+	adjustIntervaltoChronon();
+}
+
+
+void  
+TeTimeInterval :: shiftMinus (int delta)
+{
+	t1_ -= delta;  
+	t2_ = t1_ + (-delta); 
+	adjustIntervaltoChronon();
+}
+
+bool   
+TeTimeInterval :: during (TeTime& time)
+{
+	if(intChronon_==TeMONTHOFYEAR)
+		return ((this->getT1().month()<=time.month()) && (this->getT2().month()>=time.month()));
+	
+	if (intChronon_==TeDAYOFMONTH)
+		return ((this->getT1().day()<=time.day()) && (this->getT2().day()>=time.day()));
+
+	if (intChronon_== TeDAYOFWEEK)
+		return ((this->getT1().weekDay()<=time.weekDay()) && (this->getT2().weekDay()>=time.weekDay())); 
+
+	if (intChronon_== TeDAYOFYEAR)
+		return ((this->getT1().yearDay()<=time.yearDay()) && (this->getT2().yearDay()>=time.yearDay())); 
+		
+	if (intChronon_== TeHOUROFDAY)
+		return ((this->getT1().hour()<=time.hour()) && (this->getT2().hour()>=time.hour())); 
+		
+	if (intChronon_==TeMINUTEOFHOUR)
+		return ((this->getT1().minute()<=time.minute()) && (this->getT2().minute()>=time.minute())); 
+	
+	if (intChronon_==TeSECONDOFMINUTE)
+		return ((this->getT1().second()<=time.second()) && (this->getT2().second()>=time.second())); 
+
+	return ((this->getT1()<=time) && (time<=this->getT2())); 
+}
+
+bool   
+TeTimeInterval :: before (TeTime& time)
+{
+	if(intChronon_==TeMONTHOFYEAR)
+		return (time.month() < this->getT1().month());
+	
+	if (intChronon_==TeDAYOFMONTH)
+		return (time.day() < this->getT1().day());
+
+	if (intChronon_== TeDAYOFWEEK)
+		return (time.weekDay() < this->getT1().weekDay());
+
+	if (intChronon_== TeDAYOFYEAR)
+		return (time.yearDay() < this->getT1().yearDay());
+		
+	if (intChronon_== TeHOUROFDAY)
+		return (time.hour() < this->getT1().hour());
+		
+	if (intChronon_==TeMINUTEOFHOUR)
+		return (time.minute() < this->getT1().minute());
+	
+	if (intChronon_==TeSECONDOFMINUTE)
+		return (time.second() < this->getT1().second());
+
+	return (time < this->getT1());
+}
diff --git a/src/terralib/kernel/TeTimeInterval.h b/src/terralib/kernel/TeTimeInterval.h
new file mode 100644
index 0000000..878c95b
--- /dev/null
+++ b/src/terralib/kernel/TeTimeInterval.h
@@ -0,0 +1,166 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTimeInterval.h
+    This file contains structures and definitions to deal with date and time intervals
+*/
+
+#ifndef  __TERRALIB_INTERNAL_TIMEINTERVAL_H
+#define  __TERRALIB_INTERNAL_TIMEINTERVAL_H
+
+#include <TeTime.h> 
+
+//! This class provides a set of functions for manipulating date and time intervals
+class TeTimeInterval
+{
+private:
+
+	TeTime  t1_;
+	TeTime  t2_;
+	TeChronon  intChronon_;
+
+	void adjustIntervaltoChronon ();
+
+public:
+	
+	//!	Set the date and time from the system clock
+	void now(void) {t1_.now(); t2_.now();}
+
+	//! Empty constructor
+	TeTimeInterval (void): 	t1_(), t2_() {}
+
+	//!	Set all time information from the system clock
+	TeTimeInterval (TeTime& t1, TeTime& t2): 	t1_(t1), t2_(t2) {}
+
+	//!	Copy constructor.
+	TeTimeInterval(const TeTimeInterval& t): t1_(t.t1_), t2_(t.t2_) {}
+
+	//!	Set date and time from arguments, though the time fields defaults to zero.
+	TeTimeInterval(const string& t1, const string& t2, TeChronon chronon=TeSECOND, const string& mask="YYYYsMMsDDsHHsmmsSS", const string& dateS = "/", const string& timeS = ":", const string& indPM = "PM");
+
+	//!	Set date and time from arguments, though the time fields defaults to zero.
+	TeTimeInterval(const string& t1, TeChronon chronon=TeSECOND, const string& mask="YYYYsMMsDDsHHsmmsSS", int delta = 0, int numsteps = 1): 
+		t1_ (t1,  chronon, mask)
+	{
+		t2_ = t1_ + (delta-1)*numsteps; 
+		adjustIntervaltoChronon();
+	}
+ 
+	//! Returns the chronon of the interval
+	TeChronon intervalChronon() { return  intChronon_; }
+
+	//! Sets the chronon of the interval
+	void intervalChronon(TeChronon c);  
+
+	//!	Return a time of day string in format "hh:mm:ss"
+	string getInitialTime()			{return t1_.getTime();}
+
+	//!	Return a time of day string in format "hh:mm:ss"
+	string getFinalTime()			{return t2_.getTime();}
+
+	//!	Return a string to the date in the form "yyyy-mm-dd"
+	string getInitialDate(void)		{return t1_.getDate();}
+
+	//!	Return a string to the date in the form "yyyy-mm-dd"
+	string getFinalDate(void)		{return t2_.getDate();}
+
+	//! Return the time t1_
+	TeTime& getT1 (void) {return t1_;}
+
+	//! Return the time t2_
+	TeTime& getT2 (void) {return t2_;}
+
+	//!	Return a pointer to the date and time in the form passed in mask.  
+	string getInitialDateTime (const string& mask="YYYYsMMsDDsHHsmmsSS", const string& dateS="/", const string& timeS=":", const string& indPM="PM", const string& indAM="AM") {return t1_.getDateTime(mask, dateS, timeS, indPM, indAM);}
+
+	//!	Return a pointer to the date and time in the form passed in mask.  
+	string getFinalDateTime (const string& mask="YYYYsMMsDDsHHsmmsSS", const string& dateS="/", const string& timeS=":", const string& indPM="PM", const string& indAM="AM") {return t2_.getDateTime(mask, dateS, timeS, indPM, indAM);}
+
+	
+	//! Reset time to the specified arguments. Return time_t: number of seconds since 0:00:00 Jan 1 1987
+	/*!
+      \param y  year
+	  \param m  month
+	  \param d  day
+	  \param h  hour
+	  \param min  minutes
+      \param s  seconds
+	*/
+	time_t setInitialTime (int y, int m, int d, int h = 0, int min = 0, int s = 0)
+	{return t1_.Set(y, m, d, h, min, s);}
+
+
+	//! Reset time to the specified arguments. Return time_t: number of seconds since 0:00:00 Jan 1 1987
+	/*!
+      \param y  year
+	  \param m  month
+	  \param d  day
+	  \param h  hour
+	  \param min  minutes
+      \param s  seconds
+	*/
+	time_t setFinalTime (int y, int m, int d, int h = 0, int min = 0, int s = 0) 
+	{return t2_.Set(y, m, d, h, min, s);}
+
+	//!	Assignment operator for TeTime objects.
+	TeTimeInterval& operator=(const TeTimeInterval& t) {t1_ = t.t1_;  t2_ = t.t2_; intChronon_ = t.intChronon_; return (*this);}
+
+	//! Operator ==
+	bool operator==(const TeTimeInterval& other) const { return (this->t1_ == other.t1_ && this->t2_ == other.t2_); } 
+
+	//! Compute legnth of time interval in units of chonon
+	int length ();
+
+	//! Shift the interval, begining at time t (in the form "yyyy-mm-dd hh:mm:ss").
+	/*!
+		If t is not provided, the current final time becomes the initial time. 
+		The interval length is maintained.
+	*/
+	void shift (const string& t = "");
+
+	
+	//! Shift the interval, begining delta units after the initial time. The interval length is maintained.
+	void shiftPlus (int delta);
+
+	//! Shift the interval, begining delta units before the initial time. The interval length is maintained.
+	void shiftMinus (int delta);
+
+	//! verify if the times have null values
+	bool isValid() { return (t1_.isValid() || t2_.isValid()); } 
+	
+    //!	Normal destructor.
+	~TeTimeInterval(void) { }
+
+	//! verify if a specific time is during the interval time
+	bool  during (TeTime& time);
+
+	//! verify if a specific time is before the interval time
+	bool  before (TeTime& time);
+
+
+};
+ostream& operator<<(ostream& os, TeTime& N);
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeTin.cpp b/src/terralib/kernel/TeTin.cpp
new file mode 100644
index 0000000..8d4e055
--- /dev/null
+++ b/src/terralib/kernel/TeTin.cpp
@@ -0,0 +1,1762 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#include "TeTin.h"
+#include "TeStdFile.h"
+#include "TeException.h"
+#include "TeGeometryAlgorithms.h"
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+
+// TeTinTriangleSet
+
+bool
+TeTinTriangleSet::loadFromFile(string &fileName)
+{
+//	Open tin triangles file
+	string trianglesFile = fileName;
+	trianglesFile += ".tpl";
+
+	ifstream inStream;
+	inStream.open( trianglesFile.data(), ios::in | ios::binary );
+
+	if (! inStream.good() )
+		return false;
+
+	long laux;
+//#if defined(SPRWIN) || defined(LITTLEENDIAN) - File is saved in LITTLEENDIAN
+	inStream.read((char*)&laux, sizeof(long));
+	int numTriangles = laux;
+
+//	Create and set tin triangles vector
+	if ( this->size () )
+		this->clear ();
+	this->reserve (numTriangles);
+
+//	Read file for triangles data load
+	long lineid [3];
+	for (int i = 0; i < numTriangles; i++)
+	{
+		for (int j = 0; j < 3; j++)
+		{
+			if (! inStream.good() )
+				return false;
+			inStream.read((char*)&laux, sizeof(long));
+			lineid[j] = laux;
+		}
+		this->add ( TeTinTriangle (lineid[0],lineid[1],lineid[2]) );
+//		triangles_[i].setEdges(lineid[0],lineid[1],lineid[2]);
+	}
+	return true;
+}
+
+bool
+TeTinVertexSet::loadFromFile(string &fileName)
+{
+//	Open tin vertices file
+	string verticesFile = fileName;
+	verticesFile += ".tnd";
+
+	ifstream inStream;
+	inStream.open( verticesFile.data(), ios::in | ios::binary );
+
+	if (! inStream.good() )
+		return false;
+
+	long laux;
+//#if defined(SPRWIN) || defined(LITTLEENDIAN) - File is saved in LITTLEENDIAN
+	inStream.read((char*)&laux, sizeof(long));
+	int numVertices = laux;
+
+//	Create and set tin vertices vector
+	if ( this->size () )
+		this->clear ();
+	this->reserve (numVertices);
+
+//	Read file for vertices data load
+	double x, y;
+	float value;
+	short vertexType;
+	for (int i = 0; i < numVertices; i++)
+	{
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&x, sizeof(double));
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&y, sizeof(double));
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&value, sizeof(float));
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&vertexType, sizeof(short));
+		this->add( TeTinVertex (TeCoord2D (x,y), value,
+			(TeTinVertexType) vertexType, -1 ) );
+	}
+	return true;
+}
+
+bool
+TeTinEdgeSet::loadFromFile(string &fileName)
+{
+//	Open tin edges file
+	string edgesFile = fileName;
+	edgesFile += ".tln";
+
+	ifstream inStream;
+	inStream.open( edgesFile.data(), ios::in | ios::binary );
+
+	if (! inStream.good() )
+		return false;
+
+	long laux;
+//#if defined(SPRWIN) || defined(LITTLEENDIAN) - File is saved in LITTLEENDIAN
+	inStream.read((char*)&laux, sizeof(long));
+	long numEdges = laux;
+
+//	Create and set tin edges vector
+	if ( this->size () )
+		this->clear ();
+	this->reserve (numEdges);
+
+//	Read file for edges data load
+	long from, to, left, right;
+	for (int i = 0; i < numEdges; i++)
+	{
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&from, sizeof(long));
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&to, sizeof(long));
+
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&left, sizeof(long));
+		if (! inStream.good() )
+			return false;
+		inStream.read((char*)&right, sizeof(long));
+
+		this->add( TeTinEdge (from, to, left, right, NORMALEDGE) );
+	}
+	return true;
+}
+
+
+// TeTin
+
+bool
+TeTin::loadFromFile(string &fileName)
+{
+	if ( triangleSet_.loadFromFile ( fileName ) )
+	{
+		if ( vertexSet_.loadFromFile ( fileName ) )
+		{
+			if ( edgeSet_.loadFromFile ( fileName ) )
+				return true;
+		}
+	}
+	return false;
+}
+
+bool
+TeTin::getLines(TeLineSet &lineSet)
+{
+	vector<TeTinEdge>::iterator i = edgeSet_.begin();
+	while ( i != edgeSet_.end() )
+	{
+		int from = (*i).from();
+		int to = (*i).to();
+		TeCoord2D ptf = vertexSet_[from].location();
+		TeCoord2D ptt = vertexSet_[to].location();
+		i++;
+
+		TeLine2D line;
+		line.add (ptf);
+		line.add (ptt);
+		lineSet.add(line);
+	}
+	return true;
+}
+
+int
+TeTin::oneEdgeWithVertex(int v)
+{
+	int vsize = vertexSet_.size();
+	int edge;
+	if (v < vsize)
+	{
+		TeTinVertex vv = vertexSet_[v];
+		edge = vv.oneEdge();
+	}
+	else
+		return -1;
+
+	// Test to make sure there is no wrong index
+	if ( edge != -1 )
+		if ( ( edgeSet_[edge].to() == v ) ||
+			 ( edgeSet_[edge].from() == v ) )
+		return edge;
+
+	static int	oldedge = 0;	// Set one edge only once
+
+	int j = 0;
+	while (j < 2)
+	{
+		unsigned int i;
+		for (i = oldedge; i < edgeSet_.size(); i++)
+		{
+			int from = edgeSet_[i].from();
+			int to   = edgeSet_[i].to();
+			if ( from == -1 || to == -1 )
+				continue;
+			if (from == v || to == v)
+			{
+				oldedge = i;
+				return i;
+			}
+		}
+		oldedge = 0;
+		j++;
+	}
+	return -1;
+}
+
+int
+TeTin::edgeOppVertex(int t, int v)
+{
+	int edges[3];
+	triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+	for (int i = 0; i < 3; i++)
+	{
+		if ( edgeSet_[edges[i]].from() != v &&
+		     edgeSet_[edges[i]].to()   != v )
+			return edges[i];
+	}
+	return -1;
+}
+
+int
+TeTin::vertexOppEdge(int t, int e)
+{
+	int edges[3];
+	triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+	int vef(-1), vet(-1);
+	unsigned int i;
+	for (i = 0; i < 3; i++)
+	{
+		if ( edges[i] == e )
+		{
+			vef = edgeSet_[edges[i]].from();
+			vet = edgeSet_[edges[i]].to();
+			break;
+		}
+	}
+	if ( vef == -1 )
+		return -1;
+
+	for (i = 0; i < 3; i++)
+	{
+		if ( edges[i] != e )
+		{
+			if ( vef == edgeSet_[edges[i]].from() ||
+			     vet == edgeSet_[edges[i]].from() )
+				return edgeSet_[edges[i]].to();
+			if ( vef == edgeSet_[edges[i]].to() ||
+			     vet == edgeSet_[edges[i]].to() )
+				return edgeSet_[edges[i]].from();
+			return -1;
+		}
+	}
+	return -1;
+}
+
+int
+TeTin::edgeWithVertexDiffFromEdge(int t, int v, int e)
+{
+	int edges[3];
+	triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+	for (int i = 0; i < 3; i++)
+	{
+		if ( edges[i] == e )
+			continue;
+		if ( edgeSet_[edges[i]].from() == v ||
+		     edgeSet_[edges[i]].to()   == v )
+			return edges[i];
+	}
+	return -1;
+}
+
+bool
+TeTin::vertexOppEdges(int v, list<int> &edges)
+{
+//	Find one line that contains node
+	int a = oneEdgeWithVertex(v);
+	if (a == -1)
+		return false;
+
+//	1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+	int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+	int te = edgeSet_[a].left();  // � esquerda de a,
+
+	int ai = a; // 2. Defina ai como sendo aresta a 
+	int ti = td;//    e ti como sendo o tri�ngulo td,
+
+	int ao;
+ 
+	if ( ti != -1 ) // 3. Se o tri�ngulo ti n�o for nulo,
+	{				//    insira aresta ao de ti que n�o � diretamente
+		ao = edgeOppVertex ( ti, v );// conectado a v no conjunto A,
+		if (ao == -1)
+			return false;
+		edges.push_back (ao);
+	}
+
+	while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+	{
+		if (ti == -1)//	4.1. Se o tri�ngulo ti � nulo (esta' na
+		{			 //  borda da triangula��o) fa�a:
+			ti = te; //	 4.1.1. Defina ti como sendo o tri�ngulo te,
+			te = -1; //  4.1.2. Defina te como sendo nulo,
+			ai = a;  //  4.1.3. Defina ai como sendo aresta a,
+			if ( ti != -1 ) // 4.1.4. Se o tri�ngulo ti n�o for nulo,
+			{				// insira aresta ao de ti que n�o � diretamente
+				ao = edgeOppVertex ( ti, v );// conectado a v
+				if (ao == -1)
+					return false;
+				edges.push_back (ao); // a v no conjunto A,
+			}
+			continue;//	 4.1.5. Retorne a 4.
+		}
+
+		int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+		if (aaux == -1)	 // aresta aaux do tri�ngulo ti que conecta o
+			return false;// v�rtice v e � diferente de ai,
+
+		int taux;
+		if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo  
+			taux = edgeSet_[aaux].left();//  o tri�ngulo que compartilha
+		else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+			taux = edgeSet_[aaux].right();
+		else
+			return false;
+
+		ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai 
+		ai = aaux;//	  como sendo aresta aaux,
+
+		if ( ti != -1 )// 4.5. Se o tri�ngulo ti n�o for nulo, insira
+		{			   //      aresta ao de ti que n�o � diretamente
+			ao = edgeOppVertex ( ti, v ); // conectado a v
+			if (ao == -1)							// no conjunto A,
+				return false;
+			edges.push_back (ao);
+		}
+	} // 4.6. Retorne a 4.
+	return true;
+}
+
+bool
+TeTin::vertexEdges(int v, list<int> &edges)
+{
+//	Find one line that contains node
+	int a = oneEdgeWithVertex(v);
+	if (a == -1)
+		return false;
+
+//	1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+	int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+	int te = edgeSet_[a].left();  // � esquerda de a,
+
+	int ai = a; // 2. Defina ai como sendo aresta a 
+	int ti = td;//    e ti como sendo o tri�ngulo td,
+
+	edges.push_back (ai);//	3. Insira a aresta ai no conjunto A,
+
+	while (ti != te)//	4. Enquanto ti for diferente do tri�ngulo te,
+	{
+		if (ti == -1)
+		{// 4.1. Se o tri�ngulo ti � nulo (esta' na borda da triangula��o) fa�a:
+			ti = te;// 4.1.1. Defina ti como sendo o tri�ngulo te,
+			te = -1;// 4.1.2. Defina te como sendo nulo,
+			ai = a;// 4.1.3. Defina ai como sendo aresta a,
+			continue;// 4.1.4. Retorne a 4.
+		}
+
+		int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+		if (aaux == -1)	 // aresta aaux do tri�ngulo ti que conecta o
+			return false;// v�rtice v e � diferente de ai,
+
+		int taux;
+		if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo  
+			taux = edgeSet_[aaux].left();//  o tri�ngulo que compartilha
+		else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+			taux = edgeSet_[aaux].right();
+		else
+			return false;
+
+		ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai 
+		ai = aaux;//	  como sendo aresta aaux,
+
+		edges.push_back (ai);// 4.5. Se o tri�ngulo ti n�o for nulo, insira
+	} // 4.6. Retorne a 4.
+	return true;
+}
+
+bool
+TeTin::vertexOppVertices(int v, list<int> &vertices)
+{
+//	Find one line that contains node
+	int a = oneEdgeWithVertex(v);
+	if (a == -1)
+		return false;
+
+//	1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+	int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+	int te = edgeSet_[a].left();  // � esquerda de a,
+
+	int ai = a; // 2. Defina ai como sendo aresta a 
+	int ti = td;//    e ti como sendo o tri�ngulo td,
+
+	int vi = edgeSet_[a].from();// 3. Insira o v�rtice diferente de v
+	if (vi == v)				// conectado � aresta ai no conjunto V,
+		vi = edgeSet_[a].to();
+	vertices.push_back (vi);
+
+	while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+	{
+		if (ti == -1)// 4.1. Se o tri�ngulo ti � nulo (esta' na borda 
+		{			 // da triangula��o) fa�a:
+			ti = te; //	4.1.1. Defina ti como sendo o tri�ngulo te,
+			te = -1; //	4.1.2. Defina te como sendo nulo,
+			ai = a;  //	4.1.3. Defina ai como sendo aresta a,
+			continue;//	4.1.4. Retorne a 4.
+		}
+
+		int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+		if (aaux == -1)	 // aresta aaux do tri�ngulo ti que conecta o
+			return false;// v�rtice v e � diferente de ai,
+
+		int taux;
+		if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo  
+			taux = edgeSet_[aaux].left();//  o tri�ngulo que compartilha
+		else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+			taux = edgeSet_[aaux].right();
+		else
+			return false;
+
+		ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai 
+		ai = aaux;//	  como sendo aresta aaux,
+
+		vi = edgeSet_[ai].from();//	4.5. Insira o v�rtice diferente
+		if (vi == v)	// de v conectado � aresta ai no conjunto V,
+			vi = edgeSet_[ai].to();
+		vertices.push_back (vi);
+	}//	4.6. Retorne a 4.
+	return true;
+}
+
+bool
+TeTin::vertexTriangles(int v, list<int> &triangles)
+{
+//	Find one line that contains node
+	int a = oneEdgeWithVertex(v);
+	if (a == -1)
+		return false;
+
+//	1. Defina td como sendo o tri�ngulo que est� � direita da aresta a e
+	int td = edgeSet_[a].right(); // te como sendo o tri�ngulo que est�
+	int te = edgeSet_[a].left();  // � esquerda de a,
+
+	int ai = a; // 2. Defina ai como sendo aresta a 
+	int ti = td;//    e ti como sendo o tri�ngulo td,
+ 
+	if ( ti != -1 ) // 3. Se o tri�ngulo ti n�o for nulo,
+	{				//    insira ti no conjunto T,
+		triangles.push_back (ti);
+	}
+
+	while (ti != te)// 4. Enquanto ti for diferente do tri�ngulo te,
+	{
+		if (ti == -1)//	4.1. Se o tri�ngulo ti � nulo (esta' na
+		{			 //  borda da triangula��o) fa�a:
+			ti = te; //	 4.1.1. Defina ti como sendo o tri�ngulo te,
+			te = -1; //  4.1.2. Defina te como sendo nulo,
+			ai = a;  //  4.1.3. Defina ai como sendo aresta a,
+			if ( ti != -1 ) // 4.1.4. Se o tri�ngulo ti n�o for nulo,
+			{				// insira ti no conjunto T,
+				triangles.push_back (ti);
+			}
+			continue;//	 4.1.5. Retorne a 4.
+		}
+
+		int aaux = edgeWithVertexDiffFromEdge ( ti, v, ai );// 4.2. Defina a
+		if (aaux == -1)	 // aresta aaux do tri�ngulo ti que conecta o
+			return false;// v�rtice v e � diferente de ai,
+
+		int taux;
+		if (edgeSet_[aaux].right() == ti) // 4.3. Defina taux como sendo  
+			taux = edgeSet_[aaux].left();//  o tri�ngulo que compartilha
+		else if (edgeSet_[aaux].left() == ti)// a aresta aaux com ti,
+			taux = edgeSet_[aaux].right();
+		else
+			return false;
+
+		ti = taux;// 4.4. Defina ti como sendo o tri�ngulo taux e ai 
+		ai = aaux;//	  como sendo aresta aaux,
+
+		if ( ti != -1 )// 4.5. Se o tri�ngulo ti n�o for nulo, insira
+		{			   //      aresta ao de ti que n�o � diretamente
+			triangles.push_back (ti);
+		}
+	} // 4.6. Retorne a 4.
+	return true;
+}
+
+int
+TeTin::oneTriangleWithVertex(int v)
+{
+//	Find one line that contains node
+	int a = oneEdgeWithVertex(v);
+	if (a == -1)
+		return -1;
+
+	int td = edgeSet_[a].right();
+	if ( td == -1 )
+		return edgeSet_[a].left();
+	else
+		return td;
+}
+
+bool
+TeTin::triangleContainsPoint(int t, TeCoord2D& pt) 
+{
+	double	totalArea, triangleArea;
+	TeCoord2D	vert[3];
+
+	this->trianglePoints(t, vert[0], vert[1], vert[2]);
+
+//	Calculate the base triangle area
+	triangleArea = fabs(( (vert[1].x() - vert[0].x()) *
+		              (vert[2].y() - vert[0].y()) ) -
+	 	            ( (vert[2].x() - vert[0].x()) *
+	 	              (vert[1].y() - vert[0].y()) ));
+	triangleArea *= 1.00001;
+	totalArea = fabs(( (vert[0].x() - pt.x()) * (vert[1].y() - pt.y()) ) -
+		         ( (vert[1].x() - pt.x()) * (vert[0].y() - pt.y()) ));
+	if (totalArea > triangleArea)
+		return false;
+
+	totalArea += fabs(( (vert[1].x() - pt.x()) * (vert[2].y() - pt.y()) ) -
+		          ( (vert[2].x() - pt.x()) * (vert[1].y() - pt.y()) ));
+	if (totalArea > triangleArea) 
+		return false;
+
+	totalArea += fabs(( (vert[0].x() - pt.x()) * (vert[2].y() - pt.y()) ) -
+		          ( (vert[2].x() - pt.x()) * (vert[0].y() - pt.y()) ));
+	if (totalArea > triangleArea) 
+		return false;
+
+	return true;
+}
+
+int
+TeTin::triangleAt (TeCoord2D& pt)
+{
+	double tolvertex = 1; //To be set through interface
+	double tol;
+	tol = TePrecision::instance().precision();
+	TePrecision::instance().setPrecision(tolvertex);
+//Seja v um v�rtice qualquer da triangula��o T e p o ponto para o qual se deseja saber qual tri�ngulo t
+//	o cont�m.
+	int vi1;
+
+	TeTinEdgeSet::reverse_iterator i = edgeSet_.rbegin();
+	while ( i != edgeSet_.rend() )
+	{
+		vi1 = (*i++).from();
+		if (vi1 > 0 ) // -1L)
+			break;
+	}
+	if ( i == edgeSet_.rend() )
+		return -1;
+
+//1. Defina o conjunto T={t1,..., tm} com os m tri�ngulos que compartilham o v�rtice vi,
+	list<int> triset;
+	this->vertexTriangles(vi1, triset);
+
+	TeCoord2D pf = vertexSet_[vi1].location();
+	if ( pf == pt )
+//2. Se vi � igual a p, o tri�ngulo que cont�m p � um dos tri�ngulos que compartilham vi.
+// Escolha qualquer um dos tri�ngulos e termine o algoritmo.
+		return ( *(triset.begin()) );
+
+//3. Defina A={a1,...,an} com as n arestas opostas a vi,
+	list<int> aedges;
+	this->vertexOppEdges(vi1, aedges);
+
+//4. Defina V={v1,...,vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+	list <int> vvertex;
+	this->vertexOppVertices(vi1, vvertex);
+
+//5. Insira o v�rtice v no conjunto VI de v�rtices intersectados,
+	set <int> viset;
+	viset.insert(vi1);
+
+//6. Defina o v�rtice auxiliar vaux como sendo vi,
+	int vaux = vi1;
+//   e aresta aaux como sendo inv�lida
+	int aaux = -1;
+	vector<int> auxset(3);
+	for (;;)
+	{
+//7. Para cada tri�ngulo ti de T, fa�a:
+		list<int>::iterator tii;
+		for (tii = triset.begin(); tii != triset.end(); tii++)
+		{
+			int ti = *tii;
+//7.1. Se o tri�ngulo ti cont�m o ponto pn, termine o algoritmo.
+			if ( this->triangleContainsPoint( ti, pt ) )
+				return ti;
+		}
+//8.	Para cada v�rtice vi de V, fa�a:
+		list<int>::iterator vii;
+		for (vii = vvertex.begin(); vii != vvertex.end(); vii++)
+		{
+			int vi = *vii;
+			TeCoord2D ptvi = vertexSet_[vi].location();
+			if ( ptvi == pt )
+//8.1. Se vi � igual a p, o tri�ngulo que cont�m p � um dos tri�ngulos que compartilham vi.
+// Escolha qualquer um dos tri�ngulos e termine o algoritmo.
+				return ( *(triset.begin()) );
+		}
+//9. Para cada v�rtice vi de V, fa�a:
+		for ( vii = vvertex.begin(); vii != vvertex.end(); vii++)
+		{
+			int vi = *vii;
+//9.1.	Se vi est� sobre r, fa�a:
+			TeCoord2D ptvi = vertexSet_[vi].location();
+			TeCoord2D pinter;
+			if ( TePerpendicularDistance(pf, pt, ptvi, pinter) < TePrecision::instance().precision() )
+			{
+				TeBox box1;
+				updateBox (box1, pf);
+				updateBox (box1, pt);
+
+				if (TeWithin (pinter, box1) )
+				{
+//9.1.1.	Redefina o conjunto A={a1,..., an} com as n arestas opostas a vi, diferentes de aaux,
+					aedges.clear();
+					this->vertexOppEdges(vi, aedges);
+//9.1.2.	Defina o conjunto Aaux={a1,..., am} com as m arestas compartilhadas por vaux,
+					list <int> vauxedges;
+					this->vertexEdges(vaux, vauxedges);
+//9.1.3.	Exclua do conjunto A todas as arestas que pertencem ao conjunto Aaux,
+					for (list<int>::iterator vai = vauxedges.begin(); vai != vauxedges.end(); vai++)
+						aedges.remove ( *vai );
+//9.1.4.	Exclua do conjunto A a aresta aaux,
+					aedges.remove ( aaux ); // better perfomance than remove algorithm
+//9.1.5.	Redefina o conjunto V={v1,..., vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+//			diferentes de vaux,
+					vvertex.clear();
+					this->vertexOppVertices(vi, vvertex);
+//9.1.6.	Exclua do conjunto V todos os v�rtices que pertencem ao conjunto VI,
+					for (set<int>::iterator vvi = viset.begin(); vvi != viset.end(); vvi++)
+						vvertex.remove ( *vvi );
+//9.1.7.	Redefina o conjunto T={t1, ..., tk } com os k tri�ngulos que cont�m o v�rtice vi,
+					triset.clear();
+					this->vertexTriangles(vi, triset);
+//9.1.8.	Redefina o v�rtice auxiliar vaux como sendo vi,
+					vaux = vi;
+//9.1.8.	Insira o v�rtice vi no conjunto VI de v�rtices intersectados,
+					viset.insert(vi);
+//9.1.8.	Retorne a 7,
+					break;
+				}
+			}
+		}
+		if ( vii != vvertex.end() )
+			continue; // do for (;;)
+
+//10.	Para cada aresta ai de A, fa�a:
+		list<int>::iterator aii;
+		for (aii = aedges.begin(); aii != aedges.end(); aii++)
+		{
+			int ai = *aii;
+//10.1.	Se o ponto p est� sobre ai, fa�a:
+			TeCoord2D pfr = vertexSet_[edgeSet_[ai].from()].location();
+			TeCoord2D pto = vertexSet_[edgeSet_[ai].to()].location();
+			TeCoord2D pinter;
+			if ( TePerpendicularDistance(pfr, pto, pt, pinter) < TePrecision::instance().precision() )
+			{
+				TeBox box1;
+				updateBox (box1, pfr);
+				updateBox (box1, pto);
+				if (TeWithin(pinter, box1) )
+				{
+//10.1.1. Escolha qualquer um dos tri�ngulos que compartilham ai.
+					int ti = edgeSet_[ai].left();
+//10.1.2.	Termine o algoritmo.
+					if ( (ti != -1) && (this->triangleContainsPoint(ti, pt)) )
+						return ( ti );
+					else
+					{
+						ti = edgeSet_[ai].right();
+						if ( (ti != -1) && (this->triangleContainsPoint(ti, pt)) )
+							return ( ti );
+						return -1;
+					}
+				}
+			}
+		}
+
+//11.	Para cada aresta ai de A, fa�a:
+		for (aii = aedges.begin(); aii != aedges.end(); aii++)
+		{
+			int ai = *aii;
+			//int vt = edgeSet_[ai].to();
+			//int vf = edgeSet_[ai].from();
+//11.1.	Se ai intersecta r, fa�a:
+			TeIntersCoordsVec pinters;
+			//if(TeSegmentIntersection(vertexSet_[vt].location(), vertexSet_[vf].location(), pf, pt, pinters, tol) && pinters.size() < 2)
+			//{
+//11.1.2.	Defina os tri�ngulos t1 e t2 que compartilham a aresta ai.
+//11.1.3.	Se t2 est� contido no conjunto T , ent�o fa�a taux=t1,
+				int taux = edgeSet_[ai].left();
+				if (taux == -1)
+					return -1;
+				list<int>::iterator pos1 = find (triset.begin(), triset.end(), taux);
+				if ( pos1 != triset.end() )
+//11.1.4.	Sen�o, fa�a taux=t2,
+					taux = edgeSet_[ai].right();
+				if (taux == -1)
+					return -1;
+//11.1.5.	Se o tri�ngulo taux cont�m o ponto pn, termine o algoritmo.
+				if ( this->triangleContainsPoint( taux, pt ) )
+					return taux;
+//11.1.6.	Redefina o conjunto A={a1, a2} com as arestas do tri�ngulo taux diferentes de ai,
+				triangleSet_[taux].edges ( auxset[0], auxset[1], auxset[2] );
+				aedges.clear();
+				aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+				aedges.remove( ai );
+//11.1.7.	Redefina o conjunto V={v1}. O v�rtice v1 � o v�rtice do tri�ngulo taux que n�o est�
+//			em nenhuma extremidade da aresta ai,
+				int vaux1 = edgeSet_[ai].from();
+				int vaux2 = edgeSet_[ai].to();
+				this->triangleVertices ( taux, auxset[0], auxset[1], auxset[2]);
+				vvertex.clear();
+				vvertex.insert ( vvertex.begin(), auxset.begin(), auxset.end() );
+				vvertex.remove ( vaux1 );
+				vvertex.remove ( vaux2 );
+
+//11.1.8.	Redefina o conjunto T={taux},
+				triset.clear();
+				triset.push_back ( taux );
+//11.1.9.	Redefina aaux como sendo ai,
+				aaux = ai;
+//11.1.10.	Retorne a 8;
+				break;
+			//}
+		}
+//12.	Se n�o h� mais arestas em A, ent�o:
+		if ( aii == aedges.end() )
+		{
+//12.1.	Para cada tri�ngulo ti de T, fa�a:
+			list<int>::iterator tii;
+			for ( tii = triset.begin(); tii != triset.end(); tii++)
+
+			{
+				int ti = *tii;
+	//12.1.1.	Se o tri�ngulo ti cont�m o ponto pn, termine o algoritmo.
+				if ( this->triangleContainsPoint( ti, pt ) )
+					return ti;
+			}
+			if (tii == triset.end() )
+				return -1;
+		}
+	} // Do for (;;)
+	return -1;
+}
+
+bool
+TeTin::insertPoint(double x, double y, float value)
+{
+	double tolvertex = 1; //To be set through interface
+	
+	double tol = TePrecision::instance().precision();
+	TePrecision::instance().setPrecision(tolvertex);
+
+//	Get Point to be inserted from vector
+	TeCoord2D	pt(x,y);
+	if ( ! TeWithin (pt, vertexSet_.box()) )
+		return false;
+
+//	Find the triangle that owns the point pt	
+	int t = triangleAt ( pt );
+
+	if (t == -1)
+		return false;
+
+	TeCoord2D vert[3];
+	trianglePoints(t, vert[0], vert[1], vert[2]);
+
+	
+
+//	Verify if point is too close to one triangle vertex
+	int j;
+	for ( j = 0; j < 3; j++)
+	{
+		if (pt == vert[j]) // Using precision to compare
+		{
+			TePrecision::instance().setPrecision(tol);
+			return false;
+		}
+	}
+
+//	Test if the point is on an edge
+	int nedge = -1;
+	double dmin = TeMAXFLOAT;
+	TeCoord2D pmin;
+	for (j = 0; j < 3; j++)
+	{
+		if ( fabs (vert[j].x() - vert[(j+1)%3].x()) > TePrecision::instance().precision() )
+		{
+			if ((pt.x() > vert[j].x()) && (pt.x() > vert[(j+1)%3].x()))
+				continue;
+			if ((pt.x() < vert[j].x()) && (pt.x() < vert[(j+1)%3].x()))
+				continue;
+		}
+		if ( fabs (vert[j].y() - vert[(j+1)%3].y()) > TePrecision::instance().precision() )
+		{
+			if ((pt.y() > vert[j].y()) && (pt.y() > vert[(j+1)%3].y()))
+				continue;
+			if ((pt.y() < vert[j].y()) && (pt.y() < vert[(j+1)%3].y()))
+				continue;
+		}
+		TeCoord2D paux;
+		double daux = TePerpendicularDistance(vert[j], vert[(j+1)%3], pt, paux);
+		if ((daux < TePrecision::instance().precision()) && (daux < dmin))
+		{//			On edge j
+			nedge = j;
+			dmin = daux;
+			pmin = paux;
+		}
+	}
+
+	TePrecision::instance().setPrecision(tol);
+
+	vertexSet_.add( TeTinVertex (pt, value, NORMALVERTEX, -1 ) );
+	int v = vertexSet_.size()-1;
+
+	set<int> trianglesToTest;
+	if (nedge == -1)	// Not on an edge
+	{
+		this->twoNewTriangles(t, v, trianglesToTest);	//If not, split triang
+	}
+	else
+	{
+		int neighids[3];
+		this->triangle3Neighbors(t, neighids[0],neighids[1],neighids[2]);
+		int edges[3];
+		triangleSet_[t].edges( edges[0], edges[1], edges[2] );
+		for (j = 0; j < 3; j++)
+		{	// Check if neighbor triangle opposite vertex is too close
+			if ( neighids[j] == -1L )
+				continue;
+			int oppVertex = edgeOppVertex(neighids[j], edges[j]);
+			int vsize = vertexSet_.size();
+			if ( oppVertex < vsize )
+			{
+			TeCoord2D ptaux = vertexSet_[oppVertex].location();
+			if ( ptaux == pt )
+//			if ( vertexSet_[oppVertex].location() == pt )
+			{
+				// If necessary add code to change oppVertex type and value
+				return false;
+			}
+			}
+		}
+
+//		Duplicate triangle and its neighbor on the same edge
+		int an0 = this->duplicateTriangle( t, nedge, v, trianglesToTest);
+		if (neighids[nedge] != -1L)
+		{
+			int tv = neighids[nedge];
+			this->dupNeighTriangle( tv, an0, v, trianglesToTest);
+		}
+	}
+	this->testDelaunayForVertex(v, trianglesToTest);
+	return true;
+}
+
+bool
+TeTin::trianglePoints(int t, TeCoord2D& pt0, TeCoord2D& pt1, TeCoord2D& pt2)
+{
+	int vertex0, vertex1, vertex2;
+	this->triangleVertices(t, vertex0, vertex1, vertex2);
+
+	pt0 = vertexSet_[vertex0].location();
+	pt1 = vertexSet_[vertex1].location();
+	pt2 = vertexSet_[vertex2].location();
+
+	return true;
+}
+
+bool
+TeTin::triangleVertices(int t, int& vertex0, int& vertex1, int& vertex2)
+{
+	int edge0, edge1, edge2;
+	triangleSet_[t].edges(edge0,edge1,edge2);
+
+	if (edgeSet_[edge0].to() == edgeSet_[edge1].to())
+	{
+		vertex0 = edgeSet_[edge0].from();
+		vertex1 = edgeSet_[edge0].to();
+		vertex2 = edgeSet_[edge1].from();
+	}
+	else if (edgeSet_[edge0].to() == edgeSet_[edge1].from())
+	{
+		vertex0 = edgeSet_[edge0].from();
+		vertex1 = edgeSet_[edge0].to();
+		vertex2 = edgeSet_[edge1].to();
+	}
+	else if (edgeSet_[edge0].from() == edgeSet_[edge1].from())
+	{
+		vertex0 = edgeSet_[edge0].to();
+		vertex1 = edgeSet_[edge0].from();
+		vertex2 = edgeSet_[edge1].to();
+	}
+	else if (edgeSet_[edge0].from() == edgeSet_[edge1].to())
+	{
+		vertex0 = edgeSet_[edge0].to();
+		vertex1 = edgeSet_[edge0].from();
+		vertex2 = edgeSet_[edge1].from();
+	}
+	else
+		return false;
+
+	return true;
+}
+
+bool
+TeTin::triangle3Neighbors(int t, int& neighbor0, int& neighbor1, int& neighbor2)
+{
+	int edge0, edge1, edge2;
+	triangleSet_[t].edges(edge0,edge1,edge2);
+
+	if (edgeSet_[edge0].left() == t)
+		neighbor0 = edgeSet_[edge0].right();
+	else
+		neighbor0 = edgeSet_[edge0].left();
+
+	if (edgeSet_[edge1].left() == t)
+		neighbor1 = edgeSet_[edge1].right();
+	else
+		neighbor1 = edgeSet_[edge1].left();
+
+	if (edgeSet_[edge2].left() == t)
+		neighbor2 = edgeSet_[edge2].right();
+	else
+		neighbor2 = edgeSet_[edge2].left();
+
+	return true;
+}
+
+int
+TeTin::triangleVertexAt(int t, int vertex)
+{
+	int vertices[3];
+	this->triangleVertices ( t, vertices[0],vertices[1],vertices[2] );
+
+	return vertices[vertex];
+}
+
+bool
+TeTin::twoNewTriangles(int t, int v, set<int>& triangles)
+{
+//1. Crie o v�rtice vn com os dados da amostra s,
+//	Sint4 vn = nodeId;
+
+//2. Crie 2 novos tri�ngulos t1 e t2,
+	int t1 = triangleSet_.size();
+	int t2 = t1+1;
+
+//3. Crie a nova aresta an0 que conecta os v�rtices vn e v0 e
+//   tem t e t1 como os tri�ngulos que compartilham a aresta.
+	int v0 = this->triangleVertexAt(t,0); //v0 e' o vertice 0 de t
+	edgeSet_.add( TeTinEdge (v, v0, t, t1, NORMALEDGE) );
+	int an0 = edgeSet_.size()-1;
+	vertexSet_[v].setOneEdge (an0);
+
+//4. Crie a nova aresta an1 que conecta os v�rtices vn e v1 e
+// 	tem t1 e t2 como os tri�ngulos que compartilham a aresta.
+	int v1 = this->triangleVertexAt(t,1); //v1 e' o vertice 1 de t
+	edgeSet_.add( TeTinEdge (v, v1, t1, t2, NORMALEDGE) );
+	int an1 = edgeSet_.size()-1;
+
+//5. Crie a nova aresta an2 que conecta os v�rtices vn e v2 e
+//	tem t2 e t como os tri�ngulos que compartilham a aresta.
+	int v2 = this->triangleVertexAt(t,2); //v2 e' o vertice 2 de t
+	edgeSet_.add( TeTinEdge (v, v2, t2, t, NORMALEDGE) );
+	int an2 = edgeSet_.size()-1;
+
+//6. Troque o tri�ngulo t por t1 na aresta a0,
+	int a0 = triangleSet_[t].edgeAt(0); // retorna aresta 0 de t
+	edgeSet_[a0].exchangeTriangle(t,t1);
+
+//7. Defina as arestas de t1 como sendo an0, a0 e an1,
+	triangleSet_.add ( TeTinTriangle (an0, a0, an1) );
+
+//8. Troque o tri�ngulo t por t2 na aresta a1,
+	int a1 = triangleSet_[t].edgeAt(1); // retorna aresta 1 de t
+	edgeSet_[a1].exchangeTriangle(t, t2);
+
+//9. Defina as arestas de t2 como sendo an1, a1 e an2,
+	triangleSet_.add ( TeTinTriangle (an1, a1, an2) );
+
+//10. Defina as arestas de t como sendo an2, a2 e an0,
+	int a2 = triangleSet_[t].edgeAt(2); // retorna aresta 2 de t
+	triangleSet_[t].setEdges(an2, a2, an0);
+
+	triangles.insert(t);
+	triangles.insert(t1);
+	triangles.insert(t2);
+	return true;
+}
+
+int
+TeTin::duplicateTriangle(int t, int n, int v, set<int>& triangles)
+{
+// Seja t o tri�ngulo que cont�m cuja n-�sima aresta an � a aresta 
+// pr�xima a amostra s ( n E {0,1,2} ). A aresta an conecta os v�rtices 
+// vn e vj, a aresta aj conecta os v�rtices vj e vk e a aresta ak conecta
+// os v�rtices vk e vn, sendo j o resto da divis�o de n+1 por 3 e k o resto
+// da divis�o de n+2 por 3.
+	int edges[3];
+	triangleSet_[t].edges(edges[0],edges[1],edges[2]);
+
+	int an = edges [ n ];
+	int aj = edges [ (n+1)%3 ];
+	int ak = edges [ (n+2)%3 ];
+
+	int vn = this->triangleVertexAt( t, n );
+
+//	1. Crie o v�rtice v com os dados da amostra s,
+//	2. Defina o tri�ngulo tv que compartilha a aresta an com t,
+	int tv = 0;
+	if (edgeSet_[an].left() == t)
+		tv = edgeSet_[an].right();
+	else if (edgeSet_[an].right() == t)
+		tv = edgeSet_[an].left();
+
+//	3. Defina o v�rtice vop do tri�ngulo t que n�o � conectado a aresta an,
+	int vop = this->triangleVertexAt ( t, (n+2)%3 );
+
+//	4. Crie o novo tri�ngulos t1,
+	int t1 = triangleSet_.size();
+
+//	5. Crie a nova aresta an0 que conecta os v�rtices v e vn e
+//	   tem t1 e tv como os tri�ngulos que compartilham a aresta.
+	edgeSet_.add( TeTinEdge (v, vn, t1, tv, NORMALEDGE) );
+	int an0 = edgeSet_.size()-1;
+
+//	6. Crie a nova aresta an1 que conecta os v�rtices v e vop e
+//	   tem t e t1 como os tri�ngulos que compartilham a aresta.
+	edgeSet_.add( TeTinEdge (v, vop, t, t1, NORMALEDGE) );
+	int an1 = edgeSet_.size()-1;
+
+//	7. Modifique a aresta an para conectar o v�rtice v ao inv�s de vn,
+	edgeSet_[an].exchangeVertex( vn, v );
+	vertexSet_[vn].setOneEdge ( an0 );
+
+//	8. Defina as arestas de t como sendo an, aj e an1,
+	triangleSet_[t].setEdges( an, aj, an1 );
+
+//	9. Modifique a aresta ak para compartilhar o tri�ngulo t1 ao inv�s de t,
+	edgeSet_[ak].exchangeTriangle( t, t1 );
+
+//	10. Defina as arestas de t1 como sendo an0, an1 e ak,
+	triangleSet_.add ( TeTinTriangle (an0, an1, ak) );
+
+	triangles.insert(t);
+	triangles.insert(t1);
+
+	return an0;
+}
+
+bool
+TeTin::dupNeighTriangle(int tv, int an0, int v, set<int>& triangles)
+{
+//	11.1. Crie o novo tri�ngulo t2,
+	int t2 = triangleSet_.size();
+
+//	11.2. Defina a aresta av do tri�ngulo tv que cont�m o v�rtice vn
+//	      (obs: s� h� uma aresta porque a outra foi modificada),
+	int vn = edgeSet_[an0].to(); //Due to assembly, dangerous
+	if ( vn == v )
+		vn = edgeSet_[an0].from();
+
+	int edges[3];
+	triangleSet_[tv].edges(edges[0],edges[1],edges[2]);
+	int i;
+	for (i = 0; i < 3; i++)
+	{
+		if ( (edgeSet_[edges[i]].from() == vn) ||
+			 (edgeSet_[edges[i]].to() == vn) )
+			break;
+	}
+	if (i == 3)
+		return false;
+	int av = edges[i];
+
+//	11.3. Defina as outras arestas de tv como sendo av1 e av2.
+	int av1 = edges[ (i+1)%3];
+	int av2 = edges[ (i+2)%3];
+
+//	11.4. Defina o v�rtice vvo conectado a vn por meio da aresta av,
+	int vvo;
+	if (edgeSet_[av].from() == vn)
+		vvo = edgeSet_[av].to();
+	else
+		vvo = edgeSet_[av].from();
+
+//	11.5. Crie a nova aresta an2 que conecta os v�rtices v e vvo e
+//	      tem t e t2 como os tri�ngulos que compartilham a aresta.
+	edgeSet_.add( TeTinEdge (v, vvo, tv, t2, NORMALEDGE) );
+	int an2 = edgeSet_.size()-1;
+
+//	11.6. Troque o tri�ngulo tv por t2 na aresta av,
+	edgeSet_[av].exchangeTriangle( tv, t2 );
+
+//	11.7. Troque o tri�ngulo tv por t2 na aresta an0,
+	edgeSet_[an0].exchangeTriangle( tv, t2 );
+
+//	11.8. Defina as arestas de tv como sendo an2, av1 e av2.
+	triangleSet_[tv].setEdges( an2, av1, av2 );
+
+//	11.9. Defina as arestas de t2 como sendo an0, av e an2,
+	triangleSet_.add ( TeTinTriangle ( an0, av, an2 ) );
+
+	triangles.insert(tv);
+	triangles.insert(t2);
+
+	return true;
+}
+
+void
+TeTin::testDelaunayForVertex(int v, set<int>& triangles)
+{
+	while ( triangles.size() )
+	{
+		set<int>::iterator i = triangles.begin();
+		int t = *i;
+		triangles.erase(t);
+		this->testDelaunayAt(t, v, triangles);
+	}
+}
+
+bool
+TeTin::testDelaunayAt(int t, int v, set<int>& triangles)
+{
+	//	Retrieve line of triangle common to neighbor triangle
+	int e = this->edgeOppVertex (t, v);
+
+//	Retrieve neighbour triangle (tviz) pointer
+	int tviz = edgeSet_[e].left();
+	if ( edgeSet_[e].left() == t )
+		tviz = edgeSet_[e].right();
+	if ( tviz == -1 )
+		return false;
+
+//	Define base triangle (tri) center point
+	TeCoord2D vert[3];
+	this->trianglePoints(t, vert[0], vert[1], vert[2]);
+
+//	Find opposite point to base triangle (tri) inside neighbour (tviz)
+	int vo = this->vertexOppEdge ( tviz, e );
+	TeCoord2D pto = vertexSet_[vo].location();
+
+//	To avoid overflow
+	TeCoord2D ptmin( TeMAXFLOAT, TeMAXFLOAT );
+	int i;
+	for (i = 0; i < 3; i++)
+		if ( vert[i] < ptmin )
+			ptmin = vert[i];
+
+	if ( ! ptmin.tooBig() )
+	{
+		TeCoord2D mptmin ( -ptmin.x(), -ptmin.y() );
+		for (i = 0; i < 3; i++)
+			vert[i] += mptmin;
+		pto += mptmin;
+	}
+
+	TeCoord2D ptc;
+	if ( ! TeFindTriangleCenter( vert[0], vert[1], vert[2], ptc ) )
+		return false;
+
+//	Calculate base triangle (tri) radius
+	double xaux = ptc.x() - vert[0].x();
+	double yaux = ptc.y() - vert[0].y();
+	double raio2 = xaux * xaux + yaux * yaux;
+
+//	Calculate distance from opposite point (tviz) to center point (tri)
+	xaux = ptc.x() - pto.x();
+	yaux = ptc.y() - pto.y();
+	double dist2 = xaux * xaux + yaux * yaux; 
+
+/*	float fr = (float)sqrt(raio2);
+	float fd = (float)sqrt(dist2);
+	if (fr <= fd)
+		return false; */
+
+	if ( raio2 <= dist2 )
+		return false;
+
+	//	If not, change edge between tri and ntri
+	bool status;
+	if ( status = this->swapEdges(t, tviz, e) )
+	{
+		triangles.insert(t);
+		triangles.insert(tviz);
+	}
+	return status;
+}
+
+bool
+TeTin::swapEdges( int t, int tv, int ai )
+{
+	if ( tv == -1 )
+		return false;
+// Seja t o tri�ngulo que cont�m cuja i-�sima aresta ai � a aresta
+//	que se deseja alterar ( i E {0,1,2} ). A aresta ai conecta os
+//	v�rtices vi e vj, a aresta aj conecta os v�rtices vj e vk e a
+//	aresta ak conecta os v�rtices vk e vi, sendo j o resto da divis�o
+//	de i+1 por 3 e k o resto da divis�o de i+2 por 3.
+
+	int tedges[3];
+	triangleSet_[t].edges ( tedges[0], tedges[1], tedges[2] );
+
+	int vertex[3];
+	this->triangleVertices ( t, vertex[0], vertex[1], vertex[2]);
+	int i;
+	for ( i= 0; i < 3; i++ )
+		if ( tedges[i] == ai )
+			break;
+
+	int aj = tedges [ (i+1) % 3 ];
+	int ak = tedges [ (i+2) % 3 ];
+
+	int vi = vertex [ i ];
+	int vj = vertex [ (i+1) % 3 ];
+	int vk = vertex [ (i+2) % 3 ];
+
+// Seja tv o tri�ngulo que compartilha a aresta ai com t. O v�rtice de
+//	tv que n�o � conectado pela aresta ai � o v�rtice vn. As outras
+//	arestas do tri�ngulo tv s�o am que conecta os v�rtices vi e vn e a
+//	aresta an conecta os v�rtices vn e vj.
+	
+	int vn = this->vertexOppEdge ( tv, ai );
+
+	int tvedges [3];
+	triangleSet_[tv].edges ( tvedges[0], tvedges[1], tvedges[2] );
+
+	int am, an = 0;
+	for ( int j = 0; j < 3; j++ )
+	{
+		if ( tvedges [ j ] == ai )
+			continue;
+
+		if ( edgeSet_[tvedges[j]].from() == vn )
+		{
+			if ( edgeSet_[tvedges[j]].to() == vi )
+				am = tvedges [ j ];
+			else if ( edgeSet_[tvedges[j]].to() == vj )
+				an = tvedges [ j ];
+		}
+		else if ( edgeSet_[tvedges[j]].to() == vn )
+		{
+			if ( edgeSet_[tvedges[j]].from() == vi )
+				am = tvedges [ j ];
+			else if ( edgeSet_[tvedges[j]].from() == vj )
+				an = tvedges [ j ];
+		}
+	}
+
+	TeCoord2D ptaux;
+	double tol = TePrecision::instance().precision();
+	if ( TePerpendicularDistance(vertexSet_[vk].location(), vertexSet_[vn].location(),
+								 vertexSet_[vi].location(), ptaux) < tol )
+		return false;
+	if ( TePerpendicularDistance(vertexSet_[vk].location(), vertexSet_[vn].location(),
+								 vertexSet_[vj].location(), ptaux) < TePrecision::instance().precision() )
+		return false;
+
+//	1. Se o segmento de reta formado conectando o v�rtice vk do
+//	   tri�ngulo t ao v�rtice vn de tv intersecta a aresta ai, fa�a:
+	TeIntersCoordsVec pinters;
+	//if(!TeSegmentIntersection(vertexSet_[vi].location(), vertexSet_[vj].location(), vertexSet_[vk].location(), vertexSet_[vn].location(), pinters, tol)
+	//	|| pinters.size() == 2)
+	//	return false;
+
+//		1.1. Troque na aresta ai o v�rtice vi pelo vertice vk e o
+//			 v�rtice vj pelo v�rtice vn.
+	edgeSet_[ai].exchangeVertex ( vi, vk );
+	edgeSet_[ai].exchangeVertex ( vj, vn );
+
+	if ( vertexSet_[vi].oneEdge() == ai )
+		vertexSet_[vi].setOneEdge ( ak );
+	if ( vertexSet_[vj].oneEdge() == ai )
+		vertexSet_[vj].setOneEdge ( aj );
+
+//		1.2. Troque na aresta an o tri�ngulo tv pelo tri�ngulo t.
+	edgeSet_[an].exchangeTriangle( tv , t );
+
+//		1.3. Troque na aresta ak o tri�ngulo t pelo tri�ngulo tv.
+	edgeSet_[ak].exchangeTriangle( t, tv );
+
+//		1.4. Troque no tri�ngulo t a aresta ai pela aresta an e a
+//			 aresta ak pela aresta ai.
+	for ( i = 0; i < 3; i++ )
+		if ( tedges[i] == ai )
+			break;
+	tedges[i] = an;
+	tedges[(i+2)%3] = ai;
+	triangleSet_[t].setEdges ( tedges[0], tedges[1], tedges[2] );
+
+//		1.5. Troque no tri�ngulo tv a aresta ai pela aresta ak
+	for ( i = 0; i < 3; i++ )
+		if ( tvedges[i] == ai )
+			break;
+	tvedges [i] = ak;
+
+//		 e a aresta an pela aresta ai.
+	for ( i = 0; i < 3; i++ )
+		if (tvedges[i] == an )
+			break;
+	tvedges[i] = ai;
+
+	triangleSet_[tv].setEdges ( tvedges[0], tvedges[1], tvedges[2] );
+
+	return true;
+}
+
+bool
+TeTin::edgesInterBySegment( TeCoord2D& pf, TeCoord2D& pn, list<int> &aiset, list<int> &viset )
+{
+	double tolvertex = 1; //To be set through interface
+	TePrecision::instance().setPrecision(tolvertex);
+//		Seja o segmento de reta r que conecta os pontos pf  e pn,
+//1.	Defina o tri�ngulo tf que cont�m o ponto pf,
+	int tf = this->triangleAt (pf);
+	if (tf == -1)
+		return false;
+
+//2.	Defina o v�rtice vaux e aresta aaux, como sendo inv�lidos,
+	int vaux = -1;
+	int aaux = -1;
+
+//3.	Defina o conjunto A={a1, a2, a3} com as arestas de tf,
+	vector<int> auxset(3);
+	triangleSet_[tf].edges ( auxset[0], auxset[1], auxset[2] );
+	list<int> aedges ( auxset.begin(), auxset.end() );
+
+//4.	Defina o conjunto V={v1, v2, v3} com os v�rtices de tf,
+	this->triangleVertices ( tf, auxset[0], auxset[1], auxset[2]);
+	list <int> vvertex ( auxset.begin(), auxset.end() );
+
+//5.	Defina o conjunto T={tf},
+	list<int> triset( 1, tf );
+	set<int> visetaux;
+
+//6.	Para cada v�rtice vi de V, fa�a:
+	list<int>::iterator vii;
+	for (vii = vvertex.begin(); vii != vvertex.end(); vii++)
+	{
+		int vi = *vii;
+		TeCoord2D ptvi = vertexSet_[vi].location();
+		TeCoord2D pinter;
+
+//6.1.	Se o v�rtice vi coincide com pf, fa�a:
+		if ( ptvi == pf )
+		{
+//6.1.1.	Redefina A={a1,...,an} com as n arestas opostas a vi,
+			aedges.clear();
+			this->vertexOppEdges(vi, aedges);
+
+//6.1.2.	Redefina V={v1,...,vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+			vvertex.clear();
+			this->vertexOppVertices(vi, vvertex);
+
+//6.1.3.	Redefina o conjunto T={t1,..., tm} com os m tri�ngulos que compartilham o v�rtice vi,
+			triset.clear();
+			this->vertexTriangles(vi, triset);
+
+//6.1.4.	Redefina o v�rtice auxiliar vaux como sendo vi,
+			vaux = vi;
+			visetaux.insert(vi);
+//6.1.5.	V� para 8,
+			break;
+		}
+	}
+	if ( vii == vvertex.end() )
+	{
+//7.	Para cada aresta ai de A, fa�a:
+		for (list<int>::iterator aii = aedges.begin(); aii != aedges.end(); aii++)
+		{
+			int ai = *aii;
+//7.1.	Se o ponto pf est� sobre ai, fa�a:
+			TeCoord2D pfr = vertexSet_[edgeSet_[ai].from()].location();
+			TeCoord2D pto = vertexSet_[edgeSet_[ai].to()].location();
+			TeCoord2D pinter;
+			if ( TePerpendicularDistance(pfr, pto, pf, pinter) < TePrecision::instance().precision() )
+			{
+//7.1.1.	Defina o tri�ngulo tv que compartilha ai com tf,
+				int tv = edgeSet_[ai].right();
+				if (tv == tf)
+					tv = edgeSet_[ai].left();
+				if (tv == -1)
+					return false;
+//7.1.2.	Redefina V={v1, v2, v3, v4} com os v�rtices de tv e tf,
+				vvertex.clear();
+				this->triangleVertices ( tv, auxset[0], auxset[1], auxset[2]);
+				vvertex.insert( vvertex.begin(), auxset.begin(), auxset.end() );
+				this->triangleVertices ( tf, auxset[0], auxset[1], auxset[2]);
+				vvertex.insert( vvertex.begin(), auxset.begin(), auxset.end() );
+				vvertex.sort();
+				vvertex.unique();
+//7.1.3.	Redefina A={a1, a2, a3, a4} com as arestas de tv e tf diferentes de ai,
+				aedges.clear();
+				triangleSet_[tv].edges ( auxset[0], auxset[1], auxset[2] );
+				aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+				aedges.remove(ai);
+				triangleSet_[tf].edges ( auxset[0], auxset[1], auxset[2] );
+				aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+				aedges.remove(ai);
+
+//7.1.4.	Redefina o conjunto T={tv, tf},
+				triset.push_back ( tv );
+//7.1.5.	Redefina a aresta auxiliar aaux como sendo ai,
+				aiset.push_back ( ai );
+				aaux = ai;
+//7.1.6.	V� para 8,
+				break;
+			}
+		}
+	}
+
+	for (;;)
+	{
+//8.	Para cada tri�ngulo ti de T, fa�a:
+		list<int>::iterator tii;
+		for ( tii = triset.begin(); tii != triset.end(); tii++)
+		{
+			int ti = *tii;
+//8.1.1.	Se o tri�ngulo ti cont�m o ponto pn, termine o algoritmo.
+			if ( this->triangleContainsPoint( ti, pn ) )
+				return true;
+		}
+//9.	Para cada v�rtice vi de V, fa�a:
+		list<int>::iterator vii;
+		for (vii = vvertex.begin(); vii != vvertex.end(); vii++)
+		{
+			int vi = *vii;
+			TeCoord2D ptvi = vertexSet_[vi].location();
+//9.1.	Se vi coincide com pn, fa�a:
+			if ( ptvi == pn )
+			{
+//9.1.1.	Insira o v�rtice vi no conjunto VI de v�rtices intersectados,
+				viset.push_back ( vi );
+//9.1.2.	Termine o algoritmo.
+				break;
+			}
+		}
+		if ( vii != vvertex.end() )
+			break; // do for (;;)
+
+//10.	Para cada v�rtice vi de V, fa�a:
+		for ( vii = vvertex.begin(); vii != vvertex.end(); vii++)
+		{
+			int vi = *vii;
+//10.1.	Se vi � diferente de vaux e est� sobre r, fa�a:
+			if ( vi != vaux )
+			{
+				TeCoord2D ptvi = vertexSet_[vi].location();
+				TeCoord2D pinter;
+				if ( TePerpendicularDistance(pf, pn, ptvi, pinter) < TePrecision::instance().precision() )
+				{
+					TeBox box1;
+					updateBox (box1, pf);
+					updateBox (box1, pn);
+					if (TeWithin (pinter, box1) )
+					{
+//10.1.1.	Redefina o conjunto A={a1,..., an} com as n arestas opostas a vi, excluindo as arestas de AI,
+						aedges.clear();
+						this->vertexOppEdges(vi, aedges);
+						list<int>::iterator aisi;
+						for ( aisi = aiset.begin(); aisi != aiset.end(); aisi++)
+							aedges.remove ( *aisi );
+//10.1.2.	Redefina o conjunto V={v1,..., vm} com os m v�rtices dos tri�ngulos que cont�m o v�rtice vi,
+//			excluindo os vertices de Vi,
+						vvertex.clear();
+						this->vertexOppVertices(vi, vvertex);
+						list<int>::iterator visi;
+						for ( visi = viset.begin(); visi != viset.end(); aisi++)
+							viset.remove ( *visi );
+//101.3.	Redefina o conjunto T={t1, ..., tk } com os k tri�ngulos que cont�m o v�rtice vi,
+						triset.clear();
+						this->vertexTriangles(vi, triset);
+//101.4.	Insira o v�rtice vi no conjunto VI de v�rtices intersectados,
+						viset.push_back ( vi );
+//101.5.	Defina o conjunto Ac={a1,..., aj} com as j arestas que cont�m vi, diferentes de aaux,
+//101.6.	Insira as arestas de Ac no conjunto AI de arestas intersectadas,
+						this->vertexEdges(vi, aiset);
+						aiset.sort();
+						aiset.unique();
+//10.7.	Redefina o v�rtice auxiliar vaux como sendo vi,
+						vaux = vi;
+//10.8.	Retorne a 8,
+						break;
+					}
+				}
+			}
+		}
+		if ( vii != vvertex.end() )
+			continue; // do for (;;)
+
+//11.	Para cada aresta ai de A, fa�a:
+		list<int>::iterator aii;
+		for (aii = aedges.begin(); aii != aedges.end(); aii++)
+		{
+			int ai = *aii;
+//11.1.	Se o ponto pn est� sobre ai, fa�a:
+			TeCoord2D pfr = vertexSet_[edgeSet_[ai].from()].location();
+			TeCoord2D pto = vertexSet_[edgeSet_[ai].to()].location();
+			TeCoord2D pinter;
+			if ( TePerpendicularDistance(pfr, pto, pn, pinter) < TePrecision::instance().precision() )
+			{
+				TeBox box1;
+				updateBox (box1, pfr);
+				updateBox (box1, pto);
+				if (TeWithin (pinter, box1) )
+				{
+//11.1.1.	Insira a aresta ai no conjunto AI de arestas intersectadas,
+					aiset.push_back ( ai );
+//11.1.2.	Termine o algoritmo.
+					break;
+				}
+			}
+		}
+		if ( aii != aedges.end() )
+			break; // do for (;;)
+
+//12.	Para cada aresta ai de A, fa�a:
+		for (aii = aedges.begin(); aii != aedges.end(); aii++)
+		{
+			int ai = *aii;
+			TeCoord2D pinter;
+			//int vt = edgeSet_[ai].to();
+			//int vf = edgeSet_[ai].from();
+//12.1.	Se ai intersecta r, fa�a:
+			TeIntersCoordsVec pinters;
+			//if(TeSegmentIntersection(vertexSet_[vt].location(), vertexSet_[vf].location(), pf, pn, pinters) && pinters.size() < 2)			
+			//{
+//12.1.1.	Insira a aresta ai no conjunto AI de arestas intersectadas,
+				aiset.push_back ( ai );
+//12.1.2.	Defina os tri�ngulos t1 e t2 que compartilham a aresta ai.
+//12.1.3.	Se t2 est� contido no conjunto T , ent�o fa�a taux=t1,
+				int taux = edgeSet_[ai].left();
+				if (taux == -1)
+					return false;
+				list<int>::iterator pos1 = find (triset.begin(), triset.end(), taux);
+				if ( pos1 != triset.end() )
+//12.1.4.	Sen�o, fa�a taux=t2,
+					taux = edgeSet_[ai].right();
+				if (taux == -1)
+					return false;
+//12.1.5.	Se o tri�ngulo taux cont�m o ponto pn, termine o algoritmo.
+				if ( this->triangleContainsPoint( taux, pn ) )
+					return true;
+//12.1.6.	Redefina o conjunto A={a1, a2} com as arestas do tri�ngulo taux diferentes de ai,
+				triangleSet_[taux].edges ( auxset[0], auxset[1], auxset[2] );
+				aedges.clear();
+				aedges.insert( aedges.begin(), auxset.begin(), auxset.end() );
+				aedges.remove( ai );
+//12.1.7.	Redefina o conjunto V={v1}. O v�rtice v1 � o v�rtice do tri�ngulo taux que n�o est�
+//			em nenhuma extremidade da aresta ai,
+				int vaux1 = edgeSet_[ai].from();
+				int vaux2 = edgeSet_[ai].to();
+				this->triangleVertices ( taux, auxset[0], auxset[1], auxset[2]);
+				vvertex.clear();
+				vvertex.insert ( vvertex.begin(), auxset.begin(), auxset.end() );
+				vvertex.remove ( vaux1 );
+				vvertex.remove ( vaux2 );
+
+//12.1.8.	Redefina o conjunto T={taux},
+				triset.clear();
+				triset.push_back ( taux );
+//12.1.9.	Redefina aaux como sendo ai,
+				aaux = ai;
+//12.1.10.	Retorne a 8;
+				break;
+			//}
+		}
+	} // Do for (;;)
+	return true;
+}
+
+bool
+TeTin::insertSegment( TeCoord2D& pf, TeCoord2D& pn )
+{
+	if ( this->insertPoint( pf.x(), pf.y(), 100.) )
+	{
+		if ( this->insertPoint( pn.x(), pn.y(), 100.) )
+		{
+			list<int> aiset;
+			list<int> viset;
+			if ( this->edgesInterBySegment( pf, pn, aiset, viset ) )
+			{
+				if ( viset.size() == 0 )
+				{
+					while ( aiset.size() > 0 )
+					{
+//2.	Para cada aresta ai de A, fa�a:
+						list<int>::iterator aii;
+						for (aii = aiset.begin(); aii != aiset.end(); aii++)
+						{
+							int ai = *aii;
+//2.1.	Defina os tri�ngulos td e te compartilham ai,
+							int td = edgeSet_[ai].right();
+							int te = edgeSet_[ai].left();
+//2.2.	Defina os v�rtices vm e vn dos tri�ngulos td e te que n�o est�o sobre a aresta ai,
+							//int vn = this->vertexOppEdge(td, ai)
+							//int vm = this->vertexOppEdge(te, ai);
+//2.3.	Se r n�o intersecta o segmento que conecta os v�rtices vm e vn, fa�a:
+							TeIntersCoordsVec pinters;
+							//if(!TeSegmentIntersection(vertexSet_[vn].location(), vertexSet_[vm].location(), pf, pn, pinters) ||
+							//	pinters.size() == 2)
+							//{
+//2.3.1.	Se ai intersecta o segmento que conecta os v�rtices vm e vn, fa�a:
+								if ( this->swapEdges( td, te, ai ) )
+								{
+//2.3.1.1.	Redefina ai como sendo o segmento que conecta os v�rtices vm e vn,
+//2.3.1.2.	Redefina adequadamente os tri�ngulos tv e tf,
+//2.3.1.3.	Remova a aresta ai de A,
+									aiset.remove(ai);
+									break;
+								}
+							//}
+						}
+						if ( aii != aiset.end() )
+							continue;
+//3.	Se n�o h� mais arestas em A, ent�o:
+//3.1.	Termine o algoritmo.
+//4.	Para cada aresta ai de A, fa�a:
+						aii = aiset.begin();
+						while ( aii != aiset.end() )
+						{
+							int ai = *aii;
+//4.1.	Defina os tri�ngulos td e te compartilham ai,
+							int td = edgeSet_[ai].right();
+							int te = edgeSet_[ai].left();
+//4.2.	Defina os v�rtices vm e vn dos tri�ngulos td e te que n�o est�o sobre a aresta ai,
+//4.3.	Se ai intersecta o segmento que conecta os v�rtices vm e vn, fa�a:
+							if ( this->swapEdges( td, te, ai ) )
+							{
+//4.3.1.	Redefina ai como sendo o segmento que conecta os v�rtices vm e vn,
+//4.3.2.	Redefina adequadamente os tri�ngulos tv e tf,
+								TeCoord2D pinter;
+								//int vt = edgeSet_[ai].to();
+								//int vf = edgeSet_[ai].from();
+								TeIntersCoordsVec pinters;
+								//if ( ( vertexSet_[vt].location() == pf ) ||
+								//	 ( vertexSet_[vf].location() == pf ) ||
+								//	 ( vertexSet_[vt].location() == pn ) ||
+								//	 ( vertexSet_[vf].location() == pn ) ||
+								//	 ( (!TeSegmentIntersection(vertexSet_[vt].location(), vertexSet_[vf].location(), pf, pn, pinters) || pinters.size() == 2)))
+								//{
+//4.3.3.	Se ai n�o intersecta r, fa�a:
+//4.3.3.1.	Remova a aresta ai de A
+								//	aiset.remove(ai);
+								//	aii = aiset.begin();
+								//}
+								//else
+								//	aii++;
+							}
+							else
+								aii++;
+						}
+//4.3.3.	Retorne a 2.
+					}
+					return true;
+				}
+			}
+		}
+	}
+	return false;
+}
+
+bool
+TeTin::createInitialTriangles(TeBox &box)
+{
+	// Make box 1% bigger
+	zoomOut(box, 1./1.01);
+
+	//	Create and insert initial nodes of the Tin
+ 	vertexSet_.add( TeTinVertex (box.lowerLeft(), (float)TeMAXFLOAT, NORMALVERTEX, 0 ) ); //v0
+ 	vertexSet_.add( TeTinVertex (TeCoord2D(box.x1(),box.y2()), (float)TeMAXFLOAT, NORMALVERTEX, 1 ) ); //v1
+ 	vertexSet_.add( TeTinVertex (box.upperRight(), (float)TeMAXFLOAT, NORMALVERTEX, 2 ) ); //v2
+ 	vertexSet_.add( TeTinVertex (TeCoord2D(box.x2(),box.y1()), (float)TeMAXFLOAT, NORMALVERTEX, 3 ) ); //v3
+
+//	Create and insert initial lines of the Tin
+	edgeSet_.add( TeTinEdge (0, 1, -1, 0, NORMALEDGE) ); //a0
+	edgeSet_.add( TeTinEdge (1, 2, -1, 0, NORMALEDGE) ); //a1
+	edgeSet_.add( TeTinEdge (2, 3, -1, 1, NORMALEDGE) ); //a2
+	edgeSet_.add( TeTinEdge (3, 0, -1, 1, NORMALEDGE) ); //a3
+	edgeSet_.add( TeTinEdge (0, 2,  0, 1, NORMALEDGE) ); //a4
+
+//	Create the two initial triangles of the Tin
+//	Update triangles edges
+	triangleSet_.add ( TeTinTriangle (0, 1, 4) );
+	triangleSet_.add ( TeTinTriangle (2, 3, 4) );
+
+	return true;
+}
+
+bool
+TeTin::insertLineSamples ( TeContourLine& line )
+{
+	TeLineSimplify(line, 20., 200.);
+	unsigned int i;
+	for ( i = 0; i < line.size(); i++ )
+	{
+		TeCoord2D pt = line[i];
+		this->insertPoint(pt.x(), pt.y(), (float)line.value());
+	}
+	return true;
+}
+
diff --git a/src/terralib/kernel/TeTin.h b/src/terralib/kernel/TeTin.h
new file mode 100644
index 0000000..16ec703
--- /dev/null
+++ b/src/terralib/kernel/TeTin.h
@@ -0,0 +1,353 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTin.h
+    This provides support for a TIN structure
+*/
+#ifndef  __TERRALIB_INTERNAL_TIN_H
+#define  __TERRALIB_INTERNAL_TIN_H
+#include "TeGeometry.h"
+#include <list>
+#include <set>
+
+using namespace std;
+
+//!  Tin Vertex types 
+enum TeTinVertexType 
+{ NORMALVERTEX = 0, ONCONTOURVERTEX = 1, ONBREAKLINEVERTEX = 0x10 };
+
+//!  A basic class for handling vertex of TIN
+/*!
+	\sa TeGeometry TeMeasure
+*/
+class  TeTinVertex : public TeGeomSingle<TeCoord2D>, public TeMeasure
+{
+public:
+
+	//! Empty constructor
+	TeTinVertex() : TeMeasure ( TeMAXFLOAT ), oneEdge_ (-1) {}
+
+	//! Constructor with parameters
+	TeTinVertex( TeCoord2D xy, float value, TeTinVertexType type,
+		int edge ) :
+		TeGeomSingle<TeCoord2D> (xy), TeMeasure ( value ),
+		 type_ (type), oneEdge_ ( edge )
+		{ if ( ! xy.tooBig() ) TeGeometry::setBox(TeBox(xy,xy)); }
+
+// -- Methods
+//
+	int oneEdge () 
+	{ return oneEdge_; }
+
+	void setOneEdge (int oneEdge) 
+	{ oneEdge_ = oneEdge; }
+
+	TeTinVertexType type () 
+	{ return type_; }
+
+	void setType (TeTinVertexType type) 
+	{ type_ = type; }
+
+	void value (float value) 
+	{ value_ = value; }
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+
+private:
+
+	TeTinVertexType type_;
+	int oneEdge_;
+};
+
+//!  A basic class for handling a set of TeTinVertex
+class TeTinVertexSet : public TeGeomComposite <TeTinVertex>
+{
+public:
+
+// -- Constructors
+
+	TeTinVertexSet() {}
+
+// -- Methods
+
+	bool loadFromFile (string &fileName);
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! Tin Edges type 
+enum TeTinEdgeType 
+{ NORMALEDGE, ONCONTOUREDGE, ONBREAKLINEEDGE };
+
+//!  A basic class for handling edges of a  TIN
+/*!
+	\sa TeGeometry
+*/
+class TeTinEdge : public TeGeometry
+{
+public:
+
+// -- Constructors
+
+	TeTinEdge() {}
+	TeTinEdge(int from, int to, int left, int right,
+		TeTinEdgeType type) :
+	from_ (from), to_ (to), left_ (left), right_ (right), type_ (type)
+	{}
+
+// -- Methods
+
+	int from () 
+	{ return from_; }
+
+	int to () 
+	{ return to_; }
+
+	void setVertices (int from, int to)
+	{ 
+		from_ = from;
+		to_ = to;
+	}
+
+	void swapVertices ()
+	{ 
+		int aux = from_;
+		from_ = to_;
+		to_ = aux;
+	}
+
+	int left () 
+	{ return left_; }
+
+	int right ()
+	{ return right_; }
+
+	void setTriangles (int left, int right)
+	{ 
+		left_ = left;
+		right_ = right;
+	}
+
+	void swapTriangles ()
+	{ 
+		int aux = left_;
+		left_ = right_;
+		right_ = aux;
+	}
+	
+	void exchangeTriangle ( int t1, int t2 )
+	{
+		if (left_ == t1 )
+			left_ = t2;
+		else
+			right_ = t2;
+	}
+
+	void exchangeVertex ( int v1, int v2 )
+	{
+		if (from_ == v1 )
+			from_ = v2;
+		else
+			to_ = v2;
+	}
+
+	TeTinEdgeType type () 
+	{ return type_; }
+
+	void setType (TeTinEdgeType type) 
+	{ type_ = type; }
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+
+private:
+
+	int	from_, to_;
+	int	left_, right_;
+	TeTinEdgeType type_;
+};
+
+//!  A basic class for handling a set of TeTinEdge
+class TeTinEdgeSet : public TeGeomComposite<TeTinEdge>
+{
+public:
+
+// -- Constructors
+
+	TeTinEdgeSet()	{}
+
+// -- Methods
+
+	bool loadFromFile (string &fileName);
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! TeTinTriangle: A class for handling a TIN triangle
+class TeTinTriangle : public TeGeometry
+{
+public:
+
+// -- Constructors
+
+	TeTinTriangle()
+	{
+		triEdges_[0] = -1;
+		triEdges_[1] = -1;
+		triEdges_[2] = -1;
+	}
+
+	TeTinTriangle(int first, int second, int third) 
+	{
+		triEdges_[0] = first;
+		triEdges_[1] = second;
+		triEdges_[2] = third;
+	}
+
+// -- Methods
+
+	void setEdges (int first, int second, int third)
+	{
+		triEdges_[0] = first;
+		triEdges_[1] = second;
+		triEdges_[2] = third;
+	}
+
+	void edges (int& first, int& second, int& third)
+	{
+		first  = triEdges_[0];
+		second = triEdges_[1];
+		third  = triEdges_[2];
+	}
+
+	int edgeAt (short num)
+	{
+		if ((num > -1) && (num < 3))
+			return triEdges_[num];
+		else
+			return -1;
+	}
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+
+private:
+
+	int	triEdges_[3];
+};
+
+//! TeTinTriangle: A class for handling a set of TIN triangles
+class TeTinTriangleSet : public TeGeomComposite<TeTinTriangle>
+{
+public:
+
+// -- Constructors
+
+	TeTinTriangleSet()	{}
+
+// -- Methods
+
+	bool loadFromFile (string &fileName);
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+};
+
+//! A class to handle a TIN
+class TeTin
+{
+public:
+
+// -- Constructors
+
+	TeTin() {}
+	TeTin(TeBox & /* box */) {}
+
+// -- Methods
+	void clear()
+	{
+		vertexSet_.clear();
+		triangleSet_.clear();
+		edgeSet_.clear();
+	}
+
+	bool createInitialTriangles(TeBox &box);
+	bool insertLineSamples ( TeContourLine& line );
+	bool loadFromFile(string &fileName);
+	bool getLines(TeLineSet &lineSet);
+	bool isEmpty ()
+	{ return ( vertexSet_.empty() && triangleSet_.empty() &&
+	           edgeSet_.empty() ); } 
+
+	typedef  TeTinEdgeSet::iterator TeTinEdgeIterator;
+
+	TeTinEdgeIterator edgeBegin()
+	{ return edgeSet_.begin(); }
+
+	TeTinEdgeIterator edgeEnd()
+	{ return edgeSet_.end(); }
+
+	TeTinVertex& vertex (int i)
+	{ return vertexSet_[i];	}
+
+	TeTinEdge& edge (int i)
+	{ return edgeSet_[i]; }
+
+	bool triangleContainsPoint(int t, TeCoord2D& pt);
+	int edgeWithVertexDiffFromEdge(int t, int v, int e);
+	int oneTriangleWithVertex(int vertex);
+	int oneEdgeWithVertex(int vertex);
+	int edgeOppVertex(int triangle, int vertex);
+	int vertexOppEdge(int triangle, int edge);
+	bool vertexEdges(int vertex, list<int> &edges);
+	bool vertexOppEdges(int vertex, list<int> &edges);
+	bool vertexOppVertices(int vertex, list<int> &vertices);
+	bool vertexTriangles(int vertex, list<int> &triangles);
+	bool triangle3Neighbors(int t, int& neighbor0, int& neighbor1, int& neighbor2);
+	int triangleAt (TeCoord2D& pt);
+
+	bool triangleVertices(int t, int& vertex0, int& vertex1, int& vertex2);
+
+	int triangleVertexAt(int t, int vertex);
+	bool trianglePoints(int t, TeCoord2D& pt0, TeCoord2D& pt1, TeCoord2D& pt2);
+	
+	bool twoNewTriangles(int t, int v, set<int>& triangles);
+	int duplicateTriangle(int t, int n, int v, set<int>& triangles);
+	bool dupNeighTriangle (int t, int e, int v, set<int>& triangles);
+
+	void testDelaunayForVertex(int v, set<int>& triangles);
+	bool testDelaunayAt(int t, int v, set<int>& triangles);
+	bool swapEdges( int t, int tv, int ai );
+
+	bool insertPoint(double x, double y, float value);
+
+	bool edgesInterBySegment( TeCoord2D& pf, TeCoord2D& pn, list<int> &aiset, list<int> &viset );
+	bool insertSegment( TeCoord2D& pf, TeCoord2D& pn );
+
+	TeGeomRep elemType() { return TeSAMPLES; }
+private:
+
+	TeTinVertexSet		vertexSet_;
+	TeTinTriangleSet	triangleSet_;
+	TeTinEdgeSet		edgeSet_;
+
+};
+
+#endif
diff --git a/src/terralib/kernel/TeUtils.cpp b/src/terralib/kernel/TeUtils.cpp
new file mode 100644
index 0000000..b6a6dcd
--- /dev/null
+++ b/src/terralib/kernel/TeUtils.cpp
@@ -0,0 +1,465 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+
+#include "TeUtils.h"
+#include "TeDefines.h"
+#include <stdio.h>
+#include <ctype.h>
+
+string
+Te2String ( const int value )
+{
+	char name [ TeNAME_LENGTH ];
+	sprintf ( name, "%d", value );
+	return name;
+}
+
+string
+Te2String ( const unsigned int value )
+{
+	char name [ TeNAME_LENGTH ];
+	sprintf ( name, "%d", value );
+	return name;
+}
+
+string
+Te2String ( const long value )
+{
+	char name [ TeNAME_LENGTH ];
+	sprintf ( name, "%ld", value );
+	return name;
+}
+
+string
+Te2String ( const unsigned long value )
+{
+	char name [ TeNAME_LENGTH ];
+	sprintf ( name, "%ld", value );
+	return name;
+}
+
+void
+TeTrim(string &str)
+{
+//empty strings are bad
+    if(str.empty())
+		return;
+//remove left whitespace, \t and \n
+	string::iterator it;
+    for(it=str.begin();it!=str.end() &&
+		((*it) == ' ' ||  (*it) == '\t' || (*it) == '\n');it++);
+		str.erase(str.begin(),it);
+//empty strings are bad
+    if(str.empty())
+		return;
+//remove right whitespace, \t and \n
+	it=str.end();
+    for(--it;it!=str.begin() && 
+	   ((*it) == ' ' ||  (*it) == '\t' || (*it) == '\n');--it);
+		str.erase(++it,str.end());
+}
+
+string
+TeRemoveSpecialChars ( string& str)
+{
+	string aux; 
+	string::iterator it;
+    for(it=str.begin();it!=str.end();it++)
+	{
+		if (isalnum(*it))
+			aux+=(*it);
+	}
+	return aux;
+}
+
+string
+Te2String ( const double value, int precision )
+{
+	char name [ TeNAME_LENGTH ];
+	if (precision == 0)
+		sprintf ( name, "%f", value );
+	else
+		sprintf ( name, "%.*f", precision, value );
+
+return name;
+}
+
+
+string 
+TeGetExtension ( const char* value )
+{
+	if (!value)
+		return string("");
+	string name = string(value);
+	int len = strlen ( value );
+	unsigned int ip = name.rfind('.');
+	if (ip == std::string::npos)
+		return "";
+	else
+		return name.substr(ip+1,len-1);
+}
+
+string 
+TeGetName ( const char* value )
+{
+	if (!value)
+		return string("");
+	string name = string(value);
+	int len = strlen ( value );
+
+	int sp = name.rfind('\\')+1;
+	int ip = (name.substr(sp,len-1)).rfind('.');
+	if (ip>0)
+		return name.substr(0,sp+ip);
+	else 
+		return name;
+}
+
+string
+TeGetBaseName ( const char* value )
+{
+	if (!value)
+		return string("");
+	string name = string(value);
+	int ip = name.rfind('.');
+	unsigned int is = name.rfind('\\');
+	if (is == std::string::npos)
+		is = name.rfind('/');
+	return name.substr(is+1,ip-is-1);
+}
+
+string 
+TeGetPath(const char* value)
+{
+	if (!value)
+		return string(".");
+	string name = string (value);
+	unsigned int ip = name.rfind('/');
+	if (ip == std::string::npos)
+		return string(".");
+	else
+		return name.substr(0,ip);
+}
+
+void
+TeConvertToUpperCase ( const string& name, char upName[] )
+{
+	
+	const char* old = name.c_str();
+
+	const char* p;
+	int i = 0;
+
+	for( p = old; p < old + strlen ( old) ; p++ )
+	{
+		if ( islower ( *p  ) )
+			upName[i] = toupper( *p );
+		else
+			upName [i] = *p;
+		i++;
+	}
+	upName[i] = '\0';
+}
+
+string
+TeConvertToUpperCase (const string &name)
+{
+	string aux = "";
+	for(unsigned int i=0; i < strlen(name.c_str()); i++)
+	{
+		if((name[i] >= 97) && (name[i] <= 122))
+			aux += name[i] - 32;
+       else
+			aux += name[i];
+    }
+	return aux;
+}
+
+
+string
+TeConvertToLowerCase (const string &name)
+{
+	string aux = "";
+	for(unsigned int i=0; i < strlen(name.c_str()); i++)
+	{
+		if((name[i] >= 65) && (name[i] <= 90))
+			aux += name[i] + 32;
+		else
+			aux += name[i];
+    }
+	return aux;
+}
+
+
+//-----------------------------------------------------------------------
+//
+//      Purpose:        STL split string utility
+//      Author:         Paul J. Weiss
+//      Extracted from: The Code Project (http://www.codeproject.com/)
+//
+//------------------------------------------------------------------------
+
+int TeSplitString(const string& input, const string& delimiter, vector<string>& results)
+{
+   int iPos = 0;
+   int newPos = -1;
+   int sizeS2 = delimiter.size();
+   int isize = input.size();
+
+   if (input.empty())
+	   return 0;
+  
+   vector<int> positions;
+
+   newPos = input.find (delimiter, 0);
+
+   if( newPos < 0 ) 
+   { 
+       results.push_back(input);
+	   return 1;
+   }
+
+   int numFound = 0;
+   while( newPos > iPos )
+   {
+       numFound++;
+       positions.push_back(newPos);
+       iPos = newPos;
+       newPos = input.find (delimiter, iPos+sizeS2+1);
+   }
+
+   for( unsigned int i=0; i <= positions.size(); i++ )
+   {
+       string s;
+       if( i == 0 ) { s = input.substr( i, positions[i] ); }
+       int offset = positions[i-1] + sizeS2;
+       if( offset < isize )
+       {
+           if( i == positions.size() )
+           {
+		s = input.substr(offset);
+           }
+           else if( i > 0 )
+           {
+                s = input.substr( positions[i-1] + sizeS2, positions[i] - positions[i-1] - sizeS2 );
+           }
+       }
+       if( s.size() > 0 )
+       {
+               results.push_back(s);
+       }
+   }
+   return numFound;
+}
+
+bool TeNoCaseCmp(const char&  c1, const char& c2)
+{
+	return toupper(c1) == toupper(c2);
+}
+
+
+bool
+TeStringCompare(const string& str1, const string& str2, bool caseS)
+{
+	if (!caseS)
+	{
+		return ((str1.size() == str2.size()) &&
+			    equal(str1.begin(),str1.end(),str2.begin(),TeNoCaseCmp));
+	}
+	else
+		return (str1 == str2);
+}
+
+double 
+TeRoundD(double val, int precision)
+{
+	char name [ TeNAME_LENGTH ];
+	sprintf ( name, "%.*f", precision, val);
+	return atof(name);
+
+}
+
+bool
+TeCompareDouble(double a, double b, int precision)
+{
+	char bufa [ TeNAME_LENGTH ];
+	char bufb [ TeNAME_LENGTH ];
+	if (precision == 0)
+	{
+		sprintf ( bufa, "%f", a );
+		sprintf ( bufb, "%f", b );
+	}
+	else
+	{
+		sprintf ( bufa, "%.*f", precision, a );
+		sprintf ( bufb, "%.*f", precision, b );
+	}
+
+	string A = bufa;
+	string B = bufb;
+	return (A == B);
+}
+
+void TeWriteToFile(const string& fileName, const string& text, const string& mode)
+{
+	FILE *f;
+
+	f = fopen(fileName.c_str(), mode.c_str());
+
+	fprintf(f, "%s", text.c_str());
+
+	fclose(f);
+
+	return;
+}
+
+double TeAdjustToPrecision(double val, int precision, bool reduce)
+{
+	double p = pow(10.0, (double)-precision);
+	
+	if (reduce)
+		return (val - p);
+
+	return (val + p);
+}
+
+string TeCheckName(const string& name, bool& changed, string& invalidChar)
+{
+	string newName = name;
+
+	if(newName[0] >= 0x30 && newName[0] <= 0x39)
+	{
+		newName[0] = '_';
+		invalidChar = "begin with a numeric character";
+	}
+
+	int ff = newName.find(" ", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find(" ", string::npos);
+		invalidChar = "blank space";
+	}
+
+	ff = newName.find("*", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find("*", string::npos);
+		invalidChar = "mathematical symbol *";
+	}
+
+	ff = newName.find("/", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find("/", string::npos);
+		invalidChar = "mathematical symbol /";
+	}
+
+	ff = newName.find("-", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find("-", string::npos);
+		invalidChar = "mathematical symbol -";
+	}
+
+	ff = newName.find("+", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find("+", string::npos);
+		invalidChar = "mathematical symbol +";
+	}
+
+	ff = newName.find("%", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find("%", string::npos);
+		invalidChar = "mathematical symbol %";
+	}
+
+	ff = newName.find(">", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find(">", string::npos);
+		invalidChar = "mathematical symbol >";
+	}
+
+	ff = newName.find("<", string::npos);
+	while(ff >= 0)
+	{
+		newName.replace(ff, 1, "_");
+		ff = newName.find("<", string::npos);
+		invalidChar = "mathematical symbol <";
+	}
+
+	string u = TeConvertToUpperCase(newName);
+	if(u=="OR" || u=="AND" || u=="NOT" || u=="LIKE" ||
+	   u=="SELECT" || u=="FROM" || u=="UPDATE" || u=="DELETE" ||u=="BY" || u=="GROUP" || u=="ORDER" ||
+	   u=="DROP" || u=="INTO" || u=="VALUE" || u=="IN" || u=="ASC" || u=="DESC"|| u=="COUNT" || u=="JOIN" ||
+	   u=="LEFT" || u=="RIGHT" || u=="INNER" || u=="UNION" || u=="IS" || u=="NULL" || u=="WHERE" ||
+	   u=="BETWEEN" || u=="DISTINCT" || u=="TRY" || u=="IT" || u=="INSERT" || u=="ALIASES" || u=="CREATE" ||
+	   u=="ALTER" || u=="TABLE" || u=="INDEX" || u=="ALL" || u=="HAVING")
+	{
+		invalidChar = newName;	
+		newName += "_";
+	}
+
+	// check against geometry tables field names
+	string n = TeConvertToLowerCase(newName); 
+
+	if (n == "x" || n == "y" || n == "object_id" ||
+	   n == "geom_id" || n == "num_coords" || 
+	   n == "lower_x" || n == "lower_y" ||
+	   n == "upper_x" || n == "upper_y" ||
+	   n == "ext_max" || n == "spatial_data" ||
+	   n == "num_holes" || n == "parent_id" ||
+	   n == "col_number" || n == "row_number" || 
+	   n == "text_value" || n == "angle" ||
+	   n == "height" || n == "alignment_vert" ||
+	   n == "alignment_horiz" || n=="from_node" ||
+	   n == "to_node")
+	{
+			invalidChar = newName;
+			newName += "_";
+	}
+
+	// reserved words
+	if( (n=="zone") || (n=="comp") || (n=="no") || (n=="local") ||
+		(n=="level") || (n=="long"))
+	{
+		invalidChar = newName;
+		newName += "_";
+	}
+
+	changed = true;
+	if(name == newName)
+		changed = false;
+
+	return newName;
+}
diff --git a/src/terralib/kernel/TeUtils.h b/src/terralib/kernel/TeUtils.h
new file mode 100644
index 0000000..88fd44e
--- /dev/null
+++ b/src/terralib/kernel/TeUtils.h
@@ -0,0 +1,169 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeUtils.h
+     This file contains some utility functions
+*/
+#ifndef  __TERRALIB_INTERNAL_UTILS_H
+#define  __TERRALIB_INTERNAL_UTILS_H
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#include <string>
+#include <vector>
+#include <cstdio>
+#include <time.h>
+
+
+#include "TeCoord2D.h"
+#include "TeProgress.h"
+
+using namespace std;
+
+/** @defgroup FileFunctions Functions to manipulate file 
+ *  @{
+ */
+	//! Get the extension part (right to the dot) of a string
+	string TeGetExtension ( const char* value );
+
+	//! Get the name part (left to the dot) of a string, path included
+	string TeGetName ( const char* value );
+
+	//! Get the base name part of a string, strip path information
+	string TeGetBaseName ( const char* value );
+
+	//! Get the path part of a file name
+	string TeGetPath(const char* value);
+
+	//! This function writes a string to a file.
+	/*
+		\params fileName the file name to write to, including the directory.
+		\params text     the string with the text to write to.
+		\params mode     the mode used to write to the file (a | w | r).
+	*/
+	void TeWriteToFile(const string& fileName, const string& text, const string& mode);
+
+/** @} */ 
+
+/** @defgroup C2StringFunctions Functions convert numbers to strings
+ *  @{
+ */
+	//! Transforms an integer to string
+	string Te2String ( const int value );
+
+	//! Transforms an unsigned integer to string
+	string Te2String ( const unsigned int value );
+
+	//! Transforms a long to string
+	string Te2String ( const long value );
+
+	//! Transforms an unsigned long to string
+	string Te2String ( const unsigned long value );
+
+	//! Transforms a double to string
+	string Te2String ( const double value, int precision=0 );
+/** @} */ 
+
+/** @defgroup StringFunctions Functions to manipulate strings
+ *  @{
+ */
+	//! Converts a string to upper case
+	void TeConvertToUpperCase ( const string& , char* );
+
+	//! Converts a string to upper case
+	string TeConvertToUpperCase (const string &name);
+
+	//! Converts a string to lower case
+	string TeConvertToLowerCase (const string &name);
+
+	//! Removes special characteres from a string
+	string TeRemoveSpecialChars ( string& str);
+
+	//! Removes left and right blank, \t, \n  characters of a string
+	void  TeTrim(string &str);
+
+	//! Splits a string, given a separator, in a vector of parts
+	int TeSplitString(const string& input, const string& delimiter, vector<string>& results);
+
+	//! Compares two strings
+	/*
+		\params caseS flag indicating if it is a case sensitive comparation
+	*/
+	bool TeStringCompare(const string& str1, const string& str2, bool caseS=false);
+/** @} */ 
+
+/** @defgroup MathFunctions Mathematical functions
+ *  @{
+ */
+	//! Rounds a double to int
+	inline int TeRound(double val)
+	{	
+		if (val>=0)
+			return (int)(val+.5);
+		else
+			return (int)(val-.5);
+	}
+
+	//! Rounds a double value to a given number of decimal digits
+	double TeRoundD(double val, int precision=8);
+
+	//! Compares two doubles
+	bool TeCompareDouble(double a, double b, int precision);
+
+	//! Adjust a number to a given precision 
+	/*
+		\param val the number to be adjusted
+		\param precision the number of decimals places to be used
+		\param reduce flag to indicate that the number should be reduced instead to increased
+		\return the adjusted number
+	*/
+	double TeAdjustToPrecision(double val, int precision, bool reduce=false);
+
+	//! Rounds a double raster element index to an integer
+	/*
+		Raster elements have area, so raster element in upper-left position has
+		index from [-0.5,+0.5) in i and j dimension.
+	*/
+	inline int TeRoundRasterIndex(double val)
+	{	
+		int ind = (int) val;
+		if (val < (ind-0.5))
+			ind -= 1;
+		else if (val >= (ind+0.5))
+			ind += 1;
+		return ind;
+	}
+
+	//! Check column name and change if necessary
+	/*
+		Raster elements have area, so raster element in upper-left position has
+		index from [-0.5,+0.5) in i and j dimension.
+	*/
+	string TeCheckName(const string& name, bool& changed, string& invalidChar);
+/** @} */ 
+
+#endif
+
+
diff --git a/src/terralib/kernel/TeVectorRemap.cpp b/src/terralib/kernel/TeVectorRemap.cpp
new file mode 100644
index 0000000..d09e38c
--- /dev/null
+++ b/src/terralib/kernel/TeVectorRemap.cpp
@@ -0,0 +1,95 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32 
+#pragma warning ( disable: 4786 ) 
+#endif
+
+#include "TeVectorRemap.h"
+
+TeBox TeRemapBox ( TeBox& box, TeProjection* projFrom, TeProjection* projTo)
+{
+	if (projFrom == 0 || projTo == 0)
+		return box;
+
+	if (*projFrom == *projTo)
+		return box;
+
+	if (projFrom->datum().name() != projTo->datum().name())
+	{
+		projFrom->setDestinationProjection(projTo);
+		projTo->setDestinationProjection(projFrom);
+	}
+
+	TeCoord2D	pll = box.lowerLeft (),
+				pur = box.upperRight (),
+				pul (pll.x(),pur.y()),
+				plr (pur.x(),pll.y());
+
+// Evaluate coordinates of box corners in Lat/Long
+
+	pll = projFrom->PC2LL (pll);
+	pur = projFrom->PC2LL (pur);
+	pul = projFrom->PC2LL (pul);
+	plr = projFrom->PC2LL (plr);
+
+// Bring coordinates of box corners to target projection
+
+	pll = projTo->LL2PC (pll);
+	pur = projTo->LL2PC (pur);
+	pul = projTo->LL2PC (pul);
+	plr = projTo->LL2PC (plr);
+
+// Evaluate the minimum box that includes all four corners
+
+	return TeBox (	std::min(pll.x(),pul.x()),
+					std::min(pll.y(),plr.y()),
+					std::max(pur.x(),plr.x()),
+					std::max(pul.y(),pur.y()));
+}
+
+void
+TeVectorRemap(TeCoord2D& c1, TeProjection* p1, TeCoord2D& c2, TeProjection* p2)
+{
+	p1->setDestinationProjection(p2);
+	TeCoord2D ll = p1->PC2LL(c1);
+	c2 = p2->LL2PC(ll);
+}
+
+void 
+TeVectorRemap(TeText& t1, TeProjection* p1, TeText& t2, TeProjection* p2)
+{
+	p1->setDestinationProjection(p2);
+	t2 = t1;
+	TeCoord2D nl = p1->PC2LL(t1.location());
+	TeCoord2D p =  p2->LL2PC(nl);
+	t2.setLocation(p);
+}
+
+void TeVectorRemap(TeCell& c1, TeProjection* p1, TeCell& c2, TeProjection* p2)
+{	
+	c2 = c1;
+	TeBox nb = TeRemapBox(c1.box(),p1,p2);
+	c2.setBox(nb);
+}
+
diff --git a/src/terralib/kernel/TeVectorRemap.h b/src/terralib/kernel/TeVectorRemap.h
new file mode 100644
index 0000000..d4515ca
--- /dev/null
+++ b/src/terralib/kernel/TeVectorRemap.h
@@ -0,0 +1,52 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#ifndef  __TERRALIB_INTERNAL_VECTORREMAP_H
+#define  __TERRALIB_INTERNAL_VECTORREMAP_H
+
+#include "TeProjection.h"
+#include "TeGeometry.h"
+
+//! Remaps a geometry from projection p1 to projection p2
+template<typename G>
+void 
+TeVectorRemap (G& g1, TeProjection* p1, G& g2, TeProjection* p2)
+{
+	int nItens = g1.size();
+	for (int i=0; i<nItens; i++)
+	{
+		typename G::value_type e1 = g1[i];
+		typename G::value_type e2;
+		TeVectorRemap(e1,p1,e2,p2);
+		g2.add(e2);
+	}
+}
+
+void TeVectorRemap(TeCoord2D& pt1, TeProjection* p1, TeCoord2D& pt2, TeProjection* p2);
+
+void TeVectorRemap(TeCell& c1, TeProjection* p1, TeCell& c2, TeProjection* p2);
+
+void TeVectorRemap(TeText& t1, TeProjection* p1, TeText& t2, TeProjection* p2);
+
+TeBox TeRemapBox (TeBox& box, TeProjection* projFrom, TeProjection* projTo);
+
+#endif
diff --git a/src/terralib/kernel/TeView.h b/src/terralib/kernel/TeView.h
new file mode 100644
index 0000000..f623809
--- /dev/null
+++ b/src/terralib/kernel/TeView.h
@@ -0,0 +1,189 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeView.h
+    This file provides TerraLib's definition of a View
+*/
+#ifndef  __TERRALIB_INTERNAL_VIEW_H
+#define  __TERRALIB_INTERNAL_VIEW_H
+
+#include "TeLayer.h"
+#include "TeTheme.h"
+#include <algorithm>
+
+using namespace std;
+
+//! A class to deal with views in TerraLib
+/*!
+	A view in TerraLib has its own projections and may belong to a particular user
+	\sa TeTheme TeViewNode
+*/
+class TeView {
+
+public:
+
+	//! Constructor
+    TeView( const string& name="", const string& user="", int id=0)
+		: id_(id), name_(name), user_(user), proj_(0), is_visible_(true), connectedId_(0)
+	{}
+
+	//! Destructor
+	~TeView () {}
+
+	//! Returns view unique id
+	int	id () { return id_; }
+
+	//! Sets view unique id
+	void id (int id)
+	{
+		id_ = id;	// update view id
+		for (unsigned int th=0;th<viewTree_.size();th++)	//update its themes
+			viewTree_.retrieve(th)->view (id_);
+	}
+
+	//! Returns the view name
+	string	name () { return name_; }
+
+	//! Sets the view name
+	void name (const string& s) { name_ = s; }
+
+	//! Returns the view user name
+	string	user () { return user_; }
+
+	//! Sets the view user name
+	void user (const string& i) { user_ = i; }
+
+	//! Returns the view projection
+	TeProjection* projection () { return proj_; }
+
+	//! Sets the view projection
+	void projection (TeProjection* p) { proj_ = p; }
+
+	//! Returns TRUE if view is visible
+	bool isVisible () { return is_visible_; }
+
+	//! Sets whether view is visible
+	void isVisible (bool v) { is_visible_ = v; }
+	
+	//! Returns the view tree where view belongs
+	TeViewTree* root () { return &viewTree_; }
+
+	//! Adds a view node to the view tree
+	void add( TeViewNode* node )
+	{
+		node->view (id_);
+		viewTree_.add ( node );
+	}
+
+	//! Removes a view node through its name from the view tree
+	TeViewNode* remove(string name)
+	{
+		return viewTree_.remove(name);
+	}
+
+	//! Removes a view node through its identifier from the view tree
+	TeViewNode* remove (int id)
+	{
+		return viewTree_.removeID(id);
+	}
+
+	//! Moves a node up
+	void moveUp (TeViewNode* node)
+	{
+		viewTree_.moveUp(node);
+	}
+
+	//! Moves a node down
+	void moveDown(TeViewNode* node)
+	{
+		viewTree_.moveDown(node);
+	}
+
+	//! Returns a node identified by its position
+	TeViewNode* get(int i)
+	{
+		return viewTree_.retrieve(i);
+	}
+
+	//! Returns a node identified by its name and version
+	TeTheme* get(string themeName)
+	{
+		TeTheme *ret = 0;
+		for (unsigned int th = 0;th < viewTree_.size();th++)
+		{
+			TeViewNode *node = viewTree_.retrieve(th);
+			if (node->type() == TeTHEME)
+			{
+				TeTheme *tmp = (TeTheme*)node;
+				if (tmp->name() == themeName)
+				{
+					ret = tmp;
+					break;
+				}
+			}
+		}
+		return ret;
+	}
+	
+	//! Sort the themes in the view
+	void sort() 
+		{ viewTree_.sort(); }
+
+	//! Swap the order of two themes
+	void swap( unsigned int i, unsigned int j)
+	{
+		viewTree_.swap(i,j);
+	}
+
+	//! Returns the number of themes in the view
+	unsigned int size()
+		{ return viewTree_.size() ; }
+
+	//! Returns the vector of themes of the view sorted
+	//! according to their priorities
+	vector<TeViewNode*>& themes()
+		{ return viewTree_.nodes();}
+
+	void connectedId(int id) {connectedId_ = id;}
+
+	int connectedId() {return connectedId_;}
+
+
+private:
+	int				id_;	// view id
+	string			name_;	// view name
+	string			user_;	// user id
+	TeProjection*   proj_;
+	bool			is_visible_;
+
+	TeViewTree		viewTree_;
+	int				connectedId_; // connected view
+};
+
+//! A map from identifiers to pointers to views
+typedef map<int,TeView*> TeViewMap;
+
+#endif
+
+
+
diff --git a/src/terralib/kernel/TeViewNode.h b/src/terralib/kernel/TeViewNode.h
new file mode 100644
index 0000000..752f368
--- /dev/null
+++ b/src/terralib/kernel/TeViewNode.h
@@ -0,0 +1,337 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeViewNode.h
+    This file provides TerraLib's tree structure of views
+*/
+#ifndef  __TERRALIB_INTERNAL_VIEWNODE_H
+#define  __TERRALIB_INTERNAL_VIEWNODE_H
+
+#define THEME_GROUP
+
+#include <iostream>
+#include <string>
+#include <vector>
+using namespace std;
+
+//! Type of node
+enum TeViewNodeType
+{ TeTHEME, TeTREE }; 
+
+//! A class to deal with nodes of a view tree structure
+class TeViewNode
+{
+public:
+	//! Constructor
+    TeViewNode( const string& name, TeViewNode* parent = 0, int view=0, int id=0, TeViewNodeType type= TeTHEME)
+		: myParent_(parent), 
+		  id_(id), 
+		  name_(name), 
+		  view_(view), 
+		  type_(type),
+		  priority_(0)
+	{}
+
+	//! Destructor
+	virtual ~TeViewNode()
+	{}
+
+	//! Inserts a new child in the tree hierachy. Fails if the object is a leaf
+	virtual void add (TeViewNode*) {}
+
+
+    //!	Remove an existing child identified by its id from the tree hierarchy
+    /*!	
+		Fails if the object is a leaf
+	    Should be used in conjunction with a delete 
+	*/	
+	virtual TeViewNode* removeID (int /* id */) { return 0; }
+ 
+   //!	Remove an existing child identified by its name from the tree hierarchy
+    /*!	
+		Fails if the object is a leaf
+	    Should be used in conjunction with a delete 
+	*/	
+	virtual TeViewNode* remove (const string& /*name*/) { return 0; }
+
+	//! Retrieve a node identified by its identifier from the tree structure
+	virtual TeViewNode* retrieve (int)  { return 0; }
+
+	//! Returns a pointer to a parent node
+	TeViewNode* parent()
+	{ return myParent_; }
+
+	//! Returns the identifier of a node parent
+	int parentId()
+	{
+		if (myParent_)
+			return myParent_->id(); 
+		else
+			return 0;
+	}
+
+	//! Sets the identification of the parent node
+	void parentId(int i) 
+	{
+		if (myParent_)
+			myParent_->id(i);
+	}
+
+	//! Sets the parent of node
+	void setParent ( TeViewNode* node )
+	{ myParent_ = node; }
+
+	//! Returns the identification of a node
+	int		id () { return id_; }
+	//! Sets the identification of a node
+	void	id (int i){ id_ = i; }
+
+	//! Returns the name of a node
+	string	name () { return name_; }
+	//! Sets the name of a node
+	void	name (const string& s) { name_ = s; }
+
+	//! Returns the priority of a node
+	int		priority () { return priority_; }
+	//! Sets the priority of a node
+	void	priority (int i) { priority_ = i; }
+
+	//! Sets the view identification of a node
+	void	view (int view) { view_ = view; }
+	//! Returns the view identification of a node
+	int		view () { return view_ ; }
+
+	//! Returns the node type
+	TeViewNodeType type() { return type_; };
+	//! Sets the node type
+	void type(TeViewNodeType t) { type_ = t; }
+
+	//! Moves a node up in the tree structure
+	virtual void moveUp ()
+	{
+		if (myParent_)
+			myParent_->moveUp (this);
+	}
+	
+	//! Moves a node down in the tree structure
+	virtual void moveDown ()
+	{
+		if (myParent_)
+			myParent_->moveDown (this);
+	}
+
+	//! Swaps nodes 
+	virtual void swap ( unsigned int, unsigned int ) {}
+
+	//! Draws a node
+	virtual void draw() {}
+
+
+protected:
+
+	virtual void	moveUp (TeViewNode*) {}
+	virtual void	moveDown (TeViewNode*) {}
+
+	TeViewNode* 	myParent_;
+	int				id_;	// Node id
+	string			name_;	// Node name
+	int				view_;	// view id
+
+	TeViewNodeType type_;
+
+// Precedence when stored in a view
+	int			priority_;
+};
+
+
+//! A class to deal with branchs in a view tree structure  
+class TeViewTree: public TeViewNode
+{
+public:
+
+	//! Constructor
+	TeViewTree(const string& name=""): TeViewNode(name)
+	{
+		type_ = TeTREE;
+	}
+
+	//! Destructor
+	~TeViewTree ()
+	{
+	    // For all my children, delete them
+        vector<TeViewNode*>::iterator child = nodes_.begin();
+		unsigned int size = nodes_.size();
+	    for (unsigned int n=0; n<size; n++ )
+	    {
+			// Create a temporary pointer to store the child's
+			// address
+			TeViewNode* pt = (*child);
+            // Remove the child from the list
+
+			nodes_.erase(child);
+
+			// Ok, now the child's parent points to NULL and we can
+			// safely call the child's destructor
+			delete pt;
+	    }
+	}
+
+	//! Swap nodes
+	virtual void swap (unsigned int i, unsigned int j)
+	{
+		if (i==j || i>=nodes_.size() || j>=nodes_.size())
+			return;
+		TeViewNode* temp = nodes_[i];
+		nodes_[i] = nodes_[j];
+		nodes_[j] = temp;
+		nodes_[i]->priority (i);
+		nodes_[j]->priority (j);
+	}
+
+	//! Moves a node up in the tree structure
+	virtual void moveUp (TeViewNode* node)
+	{
+		for (unsigned int i=0 ; i<nodes_.size() ; i++)
+		{
+			if (node == nodes_[i])
+			{
+				swap (i, i-1);
+				return;
+			}
+		}
+	}
+
+	//! Moves a node down in the tree structure
+	virtual void moveDown (TeViewNode* node)
+	{
+		for (unsigned int i=0 ; i<nodes_.size() ; i++)
+		{
+			if (node == nodes_[i])
+			{
+				swap (i, i+1);
+				return;
+			}
+		}
+	}
+
+	//! Adds a node to the structure
+	virtual void add (TeViewNode* node)
+	{
+		node->setParent ( this ); // I am the father
+		node->priority(static_cast<int>(nodes_.size()));
+		nodes_.push_back (node);
+	}
+
+    //!	Removes a node identified by its name
+	virtual TeViewNode* remove (const string& name)
+	{
+		vector<TeViewNode*>::iterator child = nodes_.begin();
+		while ( child != nodes_.end() )
+		{
+			TeViewNode* pt = (*child);
+			if (pt->name() == name)
+			{
+				nodes_.erase(child);
+				return pt;
+			}
+			if(pt->type() == TeTREE)
+			{
+				TeViewNode* result = pt->remove(name);
+				if(result) return result;
+			}
+			++child;
+		}
+		return 0;
+	}
+
+    //!	Removes a node through its identifier
+	virtual TeViewNode* removeID (int id) 
+	{ 
+		for (vector<TeViewNode*>::iterator child = nodes_.begin();
+			 child != nodes_.end(); ++child)
+		{
+			TeViewNode* pt = (*child);
+			if(pt->id() == id)
+			{
+				nodes_.erase(child);
+				return pt;
+			}
+			if(pt->type() == TeTREE)
+			{
+				TeViewNode* result = pt->removeID(id);
+				if(result) return result;
+			}
+		}
+		return 0;
+	}
+
+    //!	Retrieves a node through its index
+	virtual TeViewNode* retrieve (unsigned int i) 
+	{ return nodes_[i]; }
+
+	//! Draw a node
+	virtual void draw ()
+	{				  
+		vector<TeViewNode*>::iterator child = nodes_.begin();
+	    while ( child != nodes_.end() )
+		{
+			TeViewNode* pt = (*child);
+			pt->draw();
+			child++;
+		}
+	}
+
+	//! Returns the size of the structure
+	unsigned int size()
+    { return nodes_.size(); }
+
+	//! Returns the vector of View nodes
+	vector<TeViewNode*>& nodes()
+	{ return nodes_; }
+
+	//! Sort the vector of nodes according to their priorities
+	void sort()
+	{
+		unsigned int i, j;
+		for (i = 0; i < size() - 1; ++i)
+		{
+			for (j = i+1; j < size(); ++j)
+			{
+				if (nodes_[i]->priority() > nodes_[j]->priority())
+				{
+					TeViewNode* temp = nodes_[i];
+					nodes_[i] = nodes_[j];
+					nodes_[j] = temp;
+				}
+			}
+		}
+	}
+
+private:
+	vector<TeViewNode*> nodes_;
+};
+
+#endif
+
+
+
diff --git a/src/terralib/kernel/TeViewTreeIterator.cpp b/src/terralib/kernel/TeViewTreeIterator.cpp
new file mode 100644
index 0000000..c2b30f5
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeIterator.cpp
@@ -0,0 +1,140 @@
+/*
+** ---------------------------------------------------------------
+** TeViewTreeIterator.cpp - 
+**
+*/
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+#include "TeViewTreeIterator.h"
+
+
+/*
+** ---------------------------------------------------------------
+** Methods implementations:
+*/
+
+void TeViewTreeIterator::next()
+{
+  do
+  {
+    StackElem& elem = TravStack.top();
+    elem.ind++;
+
+    if(elem.ind >= (int)(elem.tree->size()))
+    {
+      if(TravStack.size() <= 1) break; // reached the end of the list
+
+      TravStack.pop();
+      continue;
+    }
+
+    TeViewNode* node = elem.tree->retrieve(elem.ind);
+//    if(node->type() == TeTHEME) break;   // reached a leaf
+    if(node->type() != TeTREE) break;
+
+    TravStack.push(StackElem((TeViewTree*)node, -1));
+    break;
+  }while(1);
+}
+
+
+void TeViewTreeRevIterator::next()
+{
+  do
+  {
+    StackElem& elem = TravStack.top();
+    elem.ind--;
+
+    if(elem.ind < 0)
+    {
+      if(TravStack.size() <= 1) break; // reached the end of the list
+
+      TravStack.pop();
+      continue;
+    }
+
+    TeViewNode* node = elem.tree->retrieve(elem.ind);
+//    if(node->type() == TeTHEME) break;   // reached a leaf
+    if(node->type() != TeTREE) break;  // reached a leaf
+
+    TravStack.push(StackElem((TeViewTree*)node));
+    break;
+  }while(1);
+}
+
+/*!
+  Move to the next leaf on the tree.
+*/
+void TeViewTreeIterator::nextLeaf()
+{
+  do
+  {
+    StackElem& elem = TravStack.top();
+    elem.ind++;
+
+    if(elem.ind >= (int)(elem.tree->size()))
+    {
+      if(TravStack.size() <= 1) break; // reached the end of the list
+
+      TravStack.pop();
+      continue;
+    }
+
+    TeViewNode* node = elem.tree->retrieve(elem.ind);
+    //if(node->type() == TeTHEME) break;   // reached a leaf
+    if(node->type() != TeTREE) break;   // reached a leaf
+
+    TravStack.push(StackElem((TeViewTree*)node, -1));
+
+  }while(1);
+}
+
+/*!
+  Move to the next leaf on the tree.
+*/
+void TeViewTreeRevIterator::nextLeaf()
+{
+  do
+  {
+    StackElem& elem = TravStack.top();
+    elem.ind--;
+
+    if(elem.ind < 0)
+    {
+      if(TravStack.size() <= 1) break; // reached the end of the list
+
+      TravStack.pop();
+      continue;
+    }
+
+    TeViewNode* node = elem.tree->retrieve(elem.ind);
+//    if(node->type() == TeTHEME) break;   // reached a leaf
+    if(node->type() != TeTREE) break;   // reached a leaf
+
+    TravStack.push(StackElem((TeViewTree*)node));
+
+  }while(1);
+}
+
+
+/*!
+  Move to the next node in the tree skipping the current
+  node children.
+*/
+void TeViewTreeIterator::skipChildren()
+{
+  StackElem& elem = TravStack.top();
+  if(elem.ind == -1) elem.ind = elem.tree->size();
+  next();
+}
+
+void TeViewTreeRevIterator::skipChildren()
+{
+  StackElem& elem = TravStack.top();
+  if(elem.ind == (int)(elem.tree->size())) elem.ind = -1;
+  next();
+}
diff --git a/src/terralib/kernel/TeViewTreeIterator.h b/src/terralib/kernel/TeViewTreeIterator.h
new file mode 100644
index 0000000..7dedd3b
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeIterator.h
@@ -0,0 +1,193 @@
+/* $Id: TeViewTreeIterator.h,v 1.2 2005/04/11 20:04:57 juan Exp $
+** ---------------------------------------------------------------
+** TeViewTreeIterator - 
+**
+*/
+
+#ifndef TEVIEWTREEITERATOR_H
+#define TEVIEWTREEITERATOR_H
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+// TerraLib includes
+#include "TeException.h"
+#include "TeViewNode.h"
+
+// STL includes
+#include <vector>
+#include <stack>
+
+/*
+** ---------------------------------------------------------------
+** Defines:
+*/
+
+/* 
+  One stl module included by some TerraLib files define a macro named
+  next which conflicts whith the TeViewTreeInterator::next method. So
+  we choosed to undefine it.
+*/
+#undef next  
+
+
+/*
+** ---------------------------------------------------------------
+** Class definition:
+*/
+
+class TeViewTreeIterator
+{
+public:
+  TeViewTreeIterator(TeViewTree* root);
+
+  void first();
+  void firstLeaf();
+  void next();
+  void nextLeaf();
+  void skipChildren();  //!< move to the next node skipping the current node childs
+
+//  void Previous();
+
+  bool isDone();
+
+  TeViewNode* currentNode();
+  int currentDepth();  //!< Returns the depth of the current node. The root has depth is 0.
+
+protected:
+private:
+  struct StackElem{
+    StackElem(TeViewTree* tr, int i){ tree = tr; ind = i; }
+    TeViewTree* tree;
+    int ind;           //!< index of the current child in the tree
+  };
+
+  std::stack<StackElem> TravStack; //!< traversal stack
+};
+
+class TeViewTreeRevIterator
+{
+public:
+  TeViewTreeRevIterator(TeViewTree* root);
+
+  void first();
+  void firstLeaf();
+  void next();
+  void nextLeaf();
+  void skipChildren();  //!< move to the next node skipping the current node childs
+
+//  void Previous();
+
+  bool isDone();
+
+  TeViewNode* currentNode();
+  int currentDepth();  //!< Returns the depth of the current node. The root has depth is 0.
+
+protected:
+private:
+  struct StackElem{
+    StackElem(TeViewTree* tr, int i){ tree = tr; ind = i; }
+    StackElem(TeViewTree* tr){ tree = tr; ind = tr->size(); }
+    TeViewTree* tree;
+    int ind;           //!< index of the current child in the tree
+  };
+
+  std::stack<StackElem> TravStack; // traversal stack
+};
+
+
+/*
+** ---------------------------------------------------------------
+** Inline methods:
+*/
+
+inline TeViewTreeIterator::TeViewTreeIterator(TeViewTree* root)
+{
+  TravStack.push(StackElem(root, -1));
+}
+
+inline TeViewTreeRevIterator::TeViewTreeRevIterator(TeViewTree* root)
+{
+  TravStack.push(StackElem(root));
+}
+
+inline void TeViewTreeIterator::first()
+{
+  while(TravStack.size() > 1)
+    TravStack.pop();
+  TravStack.top().ind = -1;
+}
+
+inline void TeViewTreeRevIterator::first()
+{
+  while(TravStack.size() > 1)
+    TravStack.pop();
+  TravStack.top().ind = TravStack.top().tree->size();
+}
+
+inline void TeViewTreeIterator::firstLeaf()
+{
+  first();
+  nextLeaf();
+}
+
+inline void TeViewTreeRevIterator::firstLeaf()
+{
+  first();
+  nextLeaf();
+}
+
+inline bool TeViewTreeIterator::isDone()
+{
+  if(TravStack.size() > 1) return false;
+  
+  StackElem& elem = TravStack.top();
+  if(elem.ind < (int)(elem.tree->size())) return false;
+  
+  return true;
+}
+
+inline bool TeViewTreeRevIterator::isDone()
+{
+  if(TravStack.size() > 1) return false;
+  
+  StackElem& elem = TravStack.top();
+  if(elem.ind >= 0) return false;
+  
+  return true;
+}
+
+inline TeViewNode* TeViewTreeIterator::currentNode()
+{
+  StackElem& elem = TravStack.top();
+  if(elem.ind == -1) return elem.tree;
+
+  return elem.tree->retrieve(elem.ind);
+}
+
+inline TeViewNode* TeViewTreeRevIterator::currentNode()
+{
+  StackElem& elem = TravStack.top();
+  if(elem.ind == (int)(elem.tree->size())) return elem.tree;
+
+  return elem.tree->retrieve(elem.ind);  
+}
+
+inline int TeViewTreeIterator::currentDepth()
+{
+  return TravStack.size() - 1;
+}
+
+inline int TeViewTreeRevIterator::currentDepth()
+{
+  return TravStack.size() - 1;
+}
+
+
+#ifdef te__next_back__
+#define next te__next_back__
+#undef te__next_back__  // some stl module defines a macro named next that is generating conflics with 
+#endif
+#endif
diff --git a/src/terralib/kernel/TeViewTreeUtils.cpp b/src/terralib/kernel/TeViewTreeUtils.cpp
new file mode 100644
index 0000000..69889ec
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeUtils.cpp
@@ -0,0 +1,104 @@
+/*
+** ---------------------------------------------------------------
+** teviewtreeutils.cpp - This module contains some functions to be 
+** used with the TeViewTree class. These functions should probably be
+** methods of the own TeView class.
+**
+*/
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+
+#include "TeViewTreeUtils.h"
+#include "TeViewTreeIterator.h"
+
+/*
+** ----------------------------------------------------------------------------
+** Constants:
+*/
+
+
+/*
+** ---------------------------------------------------------------
+** Internal Functions:
+*/
+
+/*
+** ---------------------------------------------------------------
+** Public Functions:
+*/
+
+
+void TeClearViewTree(TeViewTree* vtree)
+{
+  if(vtree==NULL) return;
+
+  while(vtree->size() > 0)
+  {
+    TeViewNode* node = vtree->removeID(vtree->size() - 1);
+
+    if(node == NULL) continue;
+
+    if(node->type() == TeTREE)
+      TeClearViewTree((TeViewTree*)node);
+    delete node;
+  }
+}
+
+/*!
+   \brief Look at a View Tree for a theme with the given name.
+
+   This function creates a simple theme with the given parameters. 
+   A simple theme is a non thematic theme without any associated 
+   where clause and with only one attribute table associated to it. 
+   It is assumed that, given the feature (layer) name, 
+   its the attributes table is named name_attr while the geometries
+   tables are called namePontos, nameLinhas and namePoligonos for
+   respectively the Points geometry table, Lines geometry table and
+   Poligons geometry table.
+
+   \param vtree theme name and also name of the theme associated feature(layer)
+   \param name name of the theme to be found
+   \param case_sensitive(optional) name of the key field of the associated 
+                        attribute table. If no key is given it is
+                        assumed that the key name is object_id.
+*/
+TeTheme* TeFindTheme(TeViewTree& vtree, char* name, bool case_sensitive)
+{
+  TeTheme* theme = NULL;
+  TeViewTreeIterator it(&vtree);
+
+  for(it.firstLeaf();!(it.isDone());it.nextLeaf())
+  {
+    TeViewNode* node = it.currentNode();
+    int ret; // return value of the string comparation functions
+
+    if(node->type() != TeTHEME) 
+      continue;
+
+    if(case_sensitive)
+      ret = strcmp(name, node->name().c_str());
+    else
+    {
+//      ret = stricmp(name, node->name().c_str()); // do not work for Linux
+      string s1 = TeConvertToLowerCase(string(name));
+      string s2 = TeConvertToLowerCase(node->name());
+      if (s1 == s2)
+      	ret = 0;
+      else
+      	ret = -1;
+   }
+
+    if(ret == 0)
+    {
+      theme = (TeTheme*)node;
+      break;
+    }
+
+  }
+
+  return theme;
+}
diff --git a/src/terralib/kernel/TeViewTreeUtils.h b/src/terralib/kernel/TeViewTreeUtils.h
new file mode 100644
index 0000000..04ec379
--- /dev/null
+++ b/src/terralib/kernel/TeViewTreeUtils.h
@@ -0,0 +1,39 @@
+/*
+** ---------------------------------------------------------------
+** teviewtreeutils.h:
+**
+*/
+
+
+#ifndef TEVIEWTREEUTILS_H_
+#define TEVIEWTREEUTILS_H_
+
+/*
+** ---------------------------------------------------------------
+** Includes:
+*/
+
+#include "TeViewNode.h"
+#include "TeTheme.h"
+
+
+/*
+** ---------------------------------------------------------------
+** Functions Prototypes:
+*/
+
+void TeClearViewTree(TeViewTree* vtree);
+TeTheme* TeFindTheme(TeViewTree& vtree, char* name, bool case_sensitive = false);
+
+/*
+** ---------------------------------------------------------------
+** Inline Functions:
+*/
+
+
+/*
+** ---------------------------------------------------------------
+** End:
+*/
+
+#endif
diff --git a/src/terralib/kernel/TeVisual.h b/src/terralib/kernel/TeVisual.h
new file mode 100644
index 0000000..941c906
--- /dev/null
+++ b/src/terralib/kernel/TeVisual.h
@@ -0,0 +1,429 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeVisual.h
+    This file deals with the visual presentation characteristics of geometries in TerraLib
+*/
+#ifndef  __TERRALIB_INTERNAL_VISUAL_H
+#define  __TERRALIB_INTERNAL_VISUAL_H
+#include "TeDataTypes.h"
+
+class TeRasterTransform;
+
+#include <string>
+#include <map>
+
+using namespace std;
+
+//! Supports a color definition
+struct TeColor
+{
+	//! Red component
+	int red_;
+
+	//! Green component 
+	int green_; 	
+	
+	//! Blue component
+	int blue_;	
+	
+	//! Color name
+	string name_;
+	
+	//! Empty constructor
+	TeColor () : red_(0),green_(0),blue_(0), name_("") {}
+
+	//! Constructor with parameters
+	TeColor (int r, int g, int b, const string& name="") : red_(r),green_(g),blue_(b), name_(name) {}
+
+	//! Set parameters of colors
+	void init (int r, int g, int b, const string& name="") {red_=r,green_=g,blue_=b;name_=name; }
+
+
+	//! Returns TRUE if color1 is equal to color2 or FALSE if they are different.
+	bool operator== (const TeColor& color)
+	{
+		if(red_==color.red_ && green_==color.green_ && blue_==color.blue_)
+			return true;
+		return false;
+	}
+
+	//! Assignment operator
+	TeColor& operator= ( const TeColor& color )
+	{
+		if ( this != &color )
+		{	
+			red_ = color.red_;
+			green_ = color.green_;
+			blue_ = color.blue_;
+			name_ = color.name_;
+		}
+		return *this;
+	}
+};
+
+
+//! This class is used to store the presentation characteristics of vector geometries
+class TeVisual
+{
+private :
+
+	string		libName_;			//! Symbol library name used to geometry filling
+	int			symbId_;			//! Symbol id that define the style for the geometry filling
+	TeColor		color_;				//! Color used for geometry filling (line, point and text color)
+	int			transparency_;		//! Percentage of transparency for the geometry filling
+	int			width_;				//! Width for line geometry
+	
+	string		contourLibName_;		//! Symbol library name used to geometry outline
+	int			contourSymbId_;			//! Symbol id that define the style for the geometry outline
+	TeColor		contourColor_;			//! Contour color for the geometry outline
+	int			contourTransparency_;	//! Percentage of transparency for the geometry outline
+	int			contourWidth_;			//! Width for the geometry outline
+
+	int			sizeValue_;
+	int			ptAngle_;
+	
+	// Text attributes
+	string		family_;			//! Text family
+	bool		bold_;				//! Flag to indicate if text is bold
+	bool		italic_;			//! Flag to indicate if text is italic
+	double		alignmentVert_;		//! Position of vertical alignment
+	double		alignmentHoriz_;	//! Position of horizontal alignmentool		fixedSize_;				//! Flag to indicate that element has a fixed size, don�t follow zoom operations	
+	int			tabSize_;			//! Number of spaces defined in a tab character
+	int			lineSpace_;			//! Spacing between lines
+	bool		fixedSize_;
+	
+	char*	pixmap_;
+
+public :
+
+	//! Empty constructor
+	TeVisual(TeGeomRep rep = TePOLYGONS) : 
+		libName_ (""),
+		symbId_ (TePolyTypeFill),
+		color_ (255,0,0),
+	    transparency_ (0),
+		width_ (0),
+	   	contourLibName_ (""),
+		contourSymbId_ (TeLnTypeContinuous),
+		contourColor_(0,255,255),
+		contourTransparency_ (0),
+		contourWidth_ (1),
+		sizeValue_ (0),
+		ptAngle_ (0),
+		family_ ("Verdana"),
+		bold_ (false),
+		italic_(false),
+		alignmentVert_(0),
+		alignmentHoriz_(0),
+		tabSize_(6),
+		lineSpace_(1),
+		fixedSize_(false),
+		pixmap_(0)
+		{
+			switch (rep)
+			{
+				case TePOLYGONS:
+				case TeCELLS:
+					symbId_= TePolyTypeFill;
+					contourSymbId_= TeLnTypeContinuous;
+					break;
+				case TeLINES:
+					symbId_= TeLnTypeContinuous;
+					width_ = 1;
+					break;
+				case TePOINTS:
+				case TeNODES:
+					symbId_= TePtTypeBox;
+					sizeValue_ = 3;
+					break;
+				case TeTEXT:
+					sizeValue_= 12;
+					break;
+				default:
+					break;
+			}
+		}
+
+	//! Destructor
+	~TeVisual () 
+	{ if (pixmap_) delete pixmap_; }
+
+	//! Copy constructor
+	TeVisual& operator=(const TeVisual& vis)
+	{
+		if ( this == &vis )
+			return *this;
+		else
+		{
+			libName_ = vis.libName_;
+			symbId_ = vis.symbId_;
+			color_ = vis.color_;
+			transparency_ = vis.transparency_;
+			width_ = vis.width_;
+
+			contourLibName_ = vis.contourLibName_;
+			contourSymbId_ = vis.contourSymbId_;
+			contourColor_ = vis.contourColor_;
+			contourTransparency_ = vis.contourTransparency_;
+			contourWidth_ = vis.contourWidth_;
+			
+			sizeValue_ = vis.sizeValue_;
+			ptAngle_ = vis.ptAngle_;
+			
+			family_ = vis.family_;
+			bold_ = vis.bold_;
+			italic_ = vis.italic_;
+			fixedSize_ = vis.fixedSize_;
+		    alignmentVert_ = vis.alignmentVert_;
+		    alignmentHoriz_ = vis.alignmentHoriz_;
+		    tabSize_ = vis.tabSize_;
+		    lineSpace_ = vis.lineSpace_;
+			pixmap_ = vis.pixmap_;
+		}
+		return *this;
+	}
+
+	//! Returns TRUE if vis1 is equal to vis2 or FALSE if they are different.
+	bool operator== (const TeVisual& vis)
+	{
+		if( libName_ == vis.libName_ &&
+			symbId_ == vis.symbId_ &&
+			color_ == vis.color_ &&
+			transparency_ == vis.transparency_ &&
+			width_ == vis.width_ &&
+			contourLibName_ == vis.contourLibName_ &&
+			contourSymbId_ == vis.contourSymbId_ &&
+			contourColor_ == vis.contourColor_ &&
+			contourTransparency_ == vis.contourTransparency_ &&
+			contourWidth_ == vis.contourWidth_ &&
+			sizeValue_ == vis.sizeValue_ &&
+			ptAngle_ == vis.ptAngle_ &&
+			family_ == vis.family_ &&
+			bold_ == vis.bold_ &&
+			italic_ == vis.italic_ &&
+			fixedSize_ == vis.fixedSize_ &&
+			alignmentVert_ == vis.alignmentVert_ &&
+			alignmentHoriz_ == vis.alignmentHoriz_ &&
+			tabSize_ == vis.tabSize_ && 
+			lineSpace_ == vis.lineSpace_ &&
+			pixmap_ == vis.pixmap_)
+				return true;
+		return false;
+	}
+
+	//! Copies visual parameters from another visual
+	void setBasic (TeVisual &vis)
+	{
+		libName_ = vis.libName_;
+		symbId_ = vis.symbId_;
+		color_ = vis.color_;
+		transparency_ = vis.transparency_;
+		width_ = vis.width_;
+
+		contourLibName_ = vis.contourLibName_;
+		contourSymbId_ = vis.contourSymbId_;
+		contourColor_ = vis.contourColor_;
+		contourTransparency_ = vis.contourTransparency_;
+		contourWidth_ = vis.contourWidth_;
+		
+		sizeValue_ = vis.sizeValue_;
+		ptAngle_ = vis.ptAngle_;
+		
+		family_ = vis.family_;
+		bold_ = vis.bold_;
+		italic_ = vis.italic_;
+		fixedSize_ = vis.fixedSize_;
+		alignmentVert_ = vis.alignmentVert_;
+		alignmentHoriz_ = vis.alignmentHoriz_;
+		tabSize_ = vis.tabSize_;
+		lineSpace_ = vis.lineSpace_;
+		pixmap_ = vis.pixmap_;
+	}
+
+	//! Sets the color used for geometry filling and line, point and text color
+	void color(TeColor& color) 
+	{	color_ = color;}
+
+	//! Returns the color used for geometry filling and line, point and text color
+	TeColor& color() 
+	{ return color_; }
+
+	//! Sets symbol library name used for filling
+	void libName (const string& name) { libName_ = name; }
+
+	//! Returns symbol library name used for filling
+	string libName () { return libName_; }
+
+	//! Sets symbol library name used for contour
+	void contourLibName (const string& name) { contourLibName_ = name; }
+
+	//! Returns symbol library name used for contour
+	string contourLibName () { return contourLibName_; }
+
+	//! Sets the style for the filling of geometries
+	void style(int s) { symbId_ = s; }
+
+	//! Returns the style for the filling of geometries
+	int	style() { return symbId_; }
+
+	//! Sets the percentage of transparency for polygons and cells
+	void transparency(int t)
+	{ transparency_ = t; }
+
+	//! Returns the percentage of transparency used in polygons and cells
+	int transparency()
+	{ return transparency_; }
+
+	//! Sets the color for the polygons and cells outlines
+	void contourColor(TeColor& color) 
+	{ contourColor_ = color;}
+
+	//! Returns the color used in the polygons and cells outlines
+	TeColor& contourColor() 
+	{ return contourColor_; }
+
+	//! Sets the percentage of transparency for the polygon ans cells outlines
+	void contourTransparency(int t) 
+	{ contourTransparency_ = t;}
+
+	//! Returns the color used in the polygons and cells outlines
+	int	contourTransparency() 
+	{ return contourTransparency_; }
+
+	//! Sets the contour width for the polygons and cells outlines
+	void contourWidth(int w) { contourWidth_ = w; }
+
+	//! Returns the contour width used in the polygons and cells outlines
+	int	contourWidth()  { return contourWidth_; }
+
+	//! Sets the contour style for the polygons and cells outlines
+	void contourStyle(int s) { contourSymbId_ = s; }
+
+	//! Returns the contour style used in the polygons and cells outlines
+	int	contourStyle() { return contourSymbId_; }
+
+	//! Sets the width
+	void width(int w) { width_ = w; }
+
+	//! Returns the width
+	int	 width ()  { return width_; }
+
+	//! Sets the point size
+	void size (int s)  { sizeValue_ = s; }
+
+	//! Returns the point size
+	int	size ()  { return sizeValue_; }
+
+	//! Sets the text family for fonts
+	void family (string f) { family_ = f; }
+
+	//! Returns font�s family
+	string family () { return family_ ; }
+
+	//! Sets the bold style for texts
+	void bold (bool b) { bold_ = b; }
+
+	//! Returns the bold style used in the texts
+	bool bold () { return bold_; }
+
+	//! Sets the italic style for texts
+	void italic (bool i) { italic_ = i; }
+
+	//! Returns the italic style used in the texts
+	bool italic () { return italic_; }
+
+	//!  Sets a flag indicating if the text will have a fixed size
+	void fixedSize (bool i) { fixedSize_ = i; }
+
+	//!  Retuns a flag indicating if an text have a fixed size
+	bool fixedSize () { return fixedSize_; }
+
+	//!  Sets the vertical alignment of texts
+	void alignmentVert(double a) { alignmentVert_ = a; }
+
+	//!  Retuns the vertical alignment of texts
+	double alignmentVert() { return alignmentVert_; }
+
+	//!  Sets the horizontal alignment of texts
+	void alignmentHoriz(double a) { alignmentHoriz_ = a; }
+
+	//!  Retuns the horizontal alignment of texts
+	double alignmentHoriz() { return alignmentHoriz_; }
+
+	//! Sets the number of spaces defined in a tab character
+	void tabSize (int s) { tabSize_ = s; }
+
+	//! Returns the number of spaces defined in a tab character
+	int	tabSize () { return tabSize_; }
+
+	//! Sets the spacing between lines
+	void lineSpace (int s) { lineSpace_ = s; }
+
+	//! Returns the spacing between lines
+	int	lineSpace () { return lineSpace_; }
+
+	//! Returns the angle of points and symbols
+	int   ptAngle() {return ptAngle_; }
+
+	//! Sets the angle of points and symbols
+	void  ptAngle(int p) {ptAngle_ = p;}
+
+	//! Returns  pixmap used in the visual
+	char*	pixmap () { return pixmap_; }
+
+	//! Sets the pixmap used in the visual
+	void	setPixmap( char* pix ) { pixmap_ = pix; }
+
+};
+
+typedef TeRasterTransform TeRasterVisual;
+
+/*
+//! This class is used to store the presentation characteristics of raster geometries
+class TeRasterVisual
+{
+public:
+
+	//! Constructor
+	TeRasterVisual():
+		mBand_(0),
+		gain_(1.),
+		offset_(0)
+	{}
+
+	int mBand_; 
+
+	double gain_;
+	double offset_;
+
+	map<int,int> bandMap;
+
+	vector<unsigned char> lutr_;
+	vector<unsigned char> lutg_;
+	vector<unsigned char> lutb_;
+};
+*/
+
+#endif
+
diff --git a/src/terralib/kernel/checkvec.h b/src/terralib/kernel/checkvec.h
new file mode 100644
index 0000000..8e1d613
--- /dev/null
+++ b/src/terralib/kernel/checkvec.h
@@ -0,0 +1,70 @@
+/************************************************************************************
+ TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// include/checkvec : vector class with checked limits
+#ifndef CHECKVEC_H 
+#define CHECKVEC_H
+#include<cassert>
+#include<vector>
+
+namespace br_stl {
+
+template<class T>
+class checkedVector : public std::vector<T>    { // inherit
+   public:
+     // inherited types
+     typedef typename checkedVector::size_type size_type;
+     typedef typename checkedVector::iterator iterator;
+     typedef typename checkedVector::difference_type difference_type;
+     typedef typename checkedVector::reference reference;
+     typedef typename checkedVector::const_reference const_reference;
+
+      checkedVector() {
+      }
+
+      checkedVector(size_type n, const T& value = T())
+      : std::vector<T>(n, value) {
+      }
+
+//	  checkedVector(iterator i, iterator j)
+//      : std::vector<T>(i, j) {}
+
+      reference operator[](difference_type index) {
+         assert(index >=0 
+             && index < static_cast<difference_type>(this->size()));
+	      return std::vector<T>::operator[](index);
+      }
+
+
+        const_reference operator[](difference_type index) const {
+         assert(index >=0 
+             && index < static_cast<difference_type>(this->size()));
+         return std::vector<T>::operator[](index);
+      }
+
+};
+}
+
+
+#endif
+
diff --git a/src/terralib/kernel/dynpq.h b/src/terralib/kernel/dynpq.h
new file mode 100644
index 0000000..2a0177c
--- /dev/null
+++ b/src/terralib/kernel/dynpq.h
@@ -0,0 +1,175 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+// include/dynpq.h
+#ifndef DYNPQ_H
+#define DYNPQ_H
+#include<checkvec.h>
+#include<algorithm>
+#include<showseq.h>
+namespace br_stl {
+
+// compares the associated values of passed iterators
+template<class T>
+struct IterGreater {
+    bool operator()( T x,  T y) const { return *y < *x;}
+};
+
+template <class key_type>
+class  dynamic_priority_queue {
+  public:
+    // public type definitions
+    typedef typename std::vector<key_type>::size_type size_type;
+    typedef typename std::vector<key_type>::difference_type index_type;
+
+    // constructor
+    dynamic_priority_queue(std::vector<key_type>& v);
+
+    // change a value at position 'at'
+    void changeKeyAt(index_type at, key_type k);
+
+    // index of the smallest element (= highest priority)
+    index_type topIndex() const { return c.front() - first; }
+
+    // value of the smallest element (= highest priority)
+    const key_type& topKey() const { return *c.front(); }
+
+    void pop();       // remove smallest element from the heap
+
+    bool empty() const { return csize == 0;}
+    size_type size() const { return csize;}
+
+  private:
+//    checkedVector<index_type> Indices;      // auxiliary vector ANAP
+	 vector<index_type> Indices;      // auxiliary vector
+    typedef typename std::vector<key_type>::iterator randomAccessIterator;
+//    checkedVector<randomAccessIterator> c;  // heap of iterators  ANAP
+	vector<randomAccessIterator> c;  // heap of iterators 
+    randomAccessIterator first;             // beginning of the external vector
+    IterGreater<randomAccessIterator> comp; // comparison object
+    index_type csize;                       // current heap size
+
+    // heap update (see below)
+    void goUp(index_type);
+    void goDown(index_type);
+};
+
+template <class key_type>
+dynamic_priority_queue<key_type>::dynamic_priority_queue(
+     std::vector<key_type>& v)
+  : Indices(v.size()), c(v.size()), first(v.begin()),
+  csize(v.size()) {
+    // store iterators and generate heap
+    for(index_type i = 0; i< csize; ++i) 
+       c[i] = v.begin()+i;
+    make_heap(c.begin(), c.end(), comp);        // STL
+
+    // construct index array
+    for(index_type ii = 0; ii< csize; ++ii) // ANAP i-> ii
+       Indices[c[ii] - first] = ii;
+}
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::changeKeyAt(
+                                index_type at, key_type k) {
+   index_type idx = Indices[at];
+
+//  if (idx < csize) //ANAP
+ // {
+   assert(idx < csize);   // value still present in the queue?
+
+   if(*c[idx] != k)       // in case of equality, do nothing
+      if(k > *c[idx]) {
+           *c[idx] = k;   // enter heavier value
+           goDown(idx);   // reorganize heap
+      }
+      else {
+           *c[idx] = k;   // enter lighter value
+           goUp(idx);     // reorganize heap
+      }
+//	 }
+// else cout << "erro no dynamic_priority_queue<key_type>::changeKeyAt" << idx << csize << k << endl;
+}
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::goUp(index_type idx) {
+    index_type Predecessor = (idx-1)/2;
+    randomAccessIterator temp = c[idx];
+
+    while(Predecessor != idx && comp(c[Predecessor], temp)) {
+       c[idx] = c[Predecessor];
+       Indices[c[idx]-first] = idx;
+       idx = Predecessor;
+       Predecessor = (idx-1)/2;
+    }
+    
+    c[idx] = temp;
+    Indices[c[idx]-first] = idx;
+}
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::goDown(index_type idx) {
+     index_type Successor = (idx+1)*2-1;
+
+     if(Successor < csize-1
+        && comp(c[Successor], c[Successor+1]))
+           ++Successor;
+     randomAccessIterator temp = c[idx];
+
+     while(Successor < csize && comp(temp, c[Successor])) {
+        c[idx] = c[Successor];
+        Indices[c[idx]-first] = idx;
+        idx = Successor;
+        Successor = (idx+1)*2-1;
+
+        if(Successor < csize-1
+           && comp(c[Successor], c[Successor+1]))
+              ++Successor;
+     }
+     c[idx] = temp;
+     Indices[c[idx]-first] = idx;
+}
+
+/* The method pop() removes the topmost element from the heap. This is
+   done by moving the last element to the top and blocking the freed
+   position with --csize. Subsequently, the element sinks down to its
+   proper position. */
+
+template <class key_type>
+void dynamic_priority_queue<key_type>::pop() {
+   // overwrite iterator at the top with the 
+   // address of the last element
+   c[0] = c[--csize];
+
+   // enter the new address 0 at the position belonging 
+   // to this element in the auxiliary array
+   Indices[c[0]-first] = 0;
+
+   // let the element at the top sink to the correct
+   // position corresponding to its weight
+   goDown(0);
+}
+
+} // namespace br_stl
+#endif
+
diff --git a/src/terralib/kernel/gra_util.h b/src/terralib/kernel/gra_util.h
new file mode 100644
index 0000000..10f7213
--- /dev/null
+++ b/src/terralib/kernel/gra_util.h
@@ -0,0 +1,259 @@
+#ifndef GRAPH_UTILITIES_H
+#define GRAPH_UTILITIES_H
+
+#include<place.h>
+#include<graph.h>
+#include<fstream>
+#include<myrandom.h>
+#include<string>
+#include<iostream>
+
+namespace br_stl {
+
+/* During automatic creation of an undirected graph, a name must be
+   generated for each vertex. The following auxiliary function
+   converts the current number into a string object which is entered
+   as identifier. */
+
+// auxiliary function for generating strings out of numbers
+std::string i2string(unsigned int i) {
+    if(i==0) return std::string("0");
+    char buf[] = "0000000000000000";
+    char *pos = buf + sizeof(buf)-1;  // point to end
+   
+    do
+      *--pos = i % 10 + '0';
+    while(i /=10);
+    return std::string(pos);
+}
+
+/* The function create_vertex_set() creates a number of vertices with
+   random coordinates between 0 and maxX or maxY in a graph G
+   according to its size (G.size()). */
+   
+template<class EdgeType>
+void create_vertex_set(Graph<Place, EdgeType>& G,
+                  int count, int maxX, int maxY) {
+    Random xRandom(maxX),
+           yRandom(maxY);
+
+    // create vertices with random coordinates
+    int i = -1;
+    while(++i < count)
+      G.insert(Place(xRandom(), yRandom(),i2string(i)));
+}
+
+template<class EdgeType>
+void connectNeighbors(Graph<Place, EdgeType>& G) {
+    for(size_t i = 0; i < G.size(); ++i) {
+       Place iPlace = G[i].first;
+
+       for(size_t j = i+1; j < G.size(); ++j) {
+          Place jPlace = G[j].first;
+
+          Place MidPoint((iPlace.X()+jPlace.X())/2,
+                         (iPlace.Y()+jPlace.Y())/2);
+
+         /* The following loop is not run-time optimized. A possible
+            optimization could be to sort the places by their x
+            coordinates so that only a small relevant range must be
+            searched. The relevant range results from the fact that
+            the places to be compared must lie inside a circle around
+            the mid-point whose diameter is equal to the distance
+            between the places i and j. */
+
+          size_t k = 0;
+          unsigned long int e2 = DistSquare(iPlace, MidPoint);
+
+          while(k < G.size()) {      // not run-time optimized
+             if(k != j && k != i &&
+                DistSquare(G[k].first, MidPoint) < e2)
+                    break;
+             ++k;
+          }
+
+          if(k == G.size())  {// no nearer place found
+             EdgeType dist = Distance(iPlace, jPlace);
+             G.connectVertices(i, j, dist);
+          }
+       }
+    }
+}
+
+
+// Only for undirected graphs!
+template<class EdgeType>
+void createTeXfile(const char * Filename,
+                   Graph<Place, EdgeType>& G,
+                   double ScalingFactor,
+                   int xMax, int yMax) {
+    assert(!G.isDirected());
+    std::ofstream Output(Filename);
+
+    if(!Output) {
+        std::cerr << Filename
+             << " cannot be opened!\n";
+        exit(1);
+    }
+
+    Output  << "%% This is a generated file!\n"
+         << "\\unitlength 1.00mm\n"
+         << "\\begin{picture}("
+         << xMax << ','
+         << yMax << ")\n";
+
+    for(size_t iv = 0; iv < G.size(); ++iv) {
+       // Point
+       Output << "\\put("
+               << G[iv].first.X()*ScalingFactor
+               << ','
+               << G[iv].first.Y()*ScalingFactor
+               << "){\\circle*{1.0}}\n";
+
+       // node name
+       Output << "\\put("
+               << (1.0 + G[iv].first.X()*ScalingFactor)
+               << ','
+               << G[iv].first.Y()*ScalingFactor
+               << "){\\makebox(0,0)[lb]{{\\tiny "
+               << G[iv].first            // name
+               << "}}}\n";
+
+       /* All edges are drawn. In order to prevent them from appearing
+          twice in the undirected graph, they are only drawn in the
+          direction of the greater index. */
+
+       typename Graph<Place,EdgeType>::Successor::const_iterator I =
+         //       std::map< int, EdgeType >::const_iterator I =
+                           G[iv].second.begin();
+
+       while(I != G[iv].second.end()) {
+          size_t n = (*I).first;
+          if(n > iv) {             // otherwise, ignore
+             double x1,x2,y1,y2,dx,dy;
+             x1 =  G[iv].first.X()*ScalingFactor;
+             y1 =  G[iv].first.Y()*ScalingFactor;
+             x2 =  G[n].first.X()*ScalingFactor;
+             y2 =  G[n].first.Y()*ScalingFactor;
+             dx = x2-x1; dy = y2-y1;
+             double dist = std::sqrt(dx*dx+dy*dy);
+             int wdh = int(5*dist);
+             dx = dx/wdh; dy = dy/wdh;
+             Output << "\\multiput(" << x1 << "," << y1 << ")("
+              << dx << "," << dy << "){" << wdh
+                   << "}{\\circle*{0.1}}\n";
+          }
+          ++I;
+       }
+    }
+    Output << "\\end{picture}\n";
+}
+
+/* This is similar to createTeXfile, but creates
+   metapost-output which can with metapost directly
+   be converted to postscript. The adaption of this routine
+   was made by Andreas Scherer.
+   Only for undirected graphs! */
+
+template<class EdgeType>
+void createMPfile(char * Filename,
+                  Graph<Place, EdgeType>& G,
+                  double ScalingFactor) {
+    assert(!G.isDirected());
+    std::ofstream Output(Filename);
+
+    if(!Output) {
+        std::cerr << Filename
+             << " cannot be opened!\n";
+        exit(1);
+    }
+
+    Output  << "%%%% createMPfile(): This is a generated file!\n"
+         << "input boxes\n\n"
+         << "beginfig(1);\nu=1mm; % unitlength\n"
+         << "defaultscale := 0.8; % small numbers\n";
+
+    for(register size_t iv = 0; iv < G.size(); ++iv) {
+       // Point
+       Output << " drawdot( "
+               << G[iv].first.X()*ScalingFactor
+               << "u, "
+               << G[iv].first.Y()*ScalingFactor
+               << "u)  withpen pencircle scaled 1mm;\n";
+
+       // node name
+       Output << " label.urt( \""
+              << G[iv].first << "\", ( "
+               << G[iv].first.X()*ScalingFactor
+               << "u, "
+               << G[iv].first.Y()*ScalingFactor
+               << "u) ); " << std::endl;
+
+       /* All edges are drawn. In order to prevent them from appearing
+          twice in the undirected graph, they are only drawn in the
+          direction of the greater index. */
+
+
+       typename Graph<Place, EdgeType>::Successor::const_iterator I =
+         //        std:: map<int, EdgeType>::const_iterator I =
+                           G[iv].second.begin();
+
+       while(I != G[iv].second.end()) {
+          size_t n = (*I).first;
+          if(n > iv) {             // otherwise, ignore
+             Output << "  draw ( "
+                    << G[iv].first.X()*ScalingFactor << "u, "
+                    << G[iv].first.Y()*ScalingFactor 
+                    << "u ) -- ( "
+                    << G[n].first.X()*ScalingFactor << "u, "
+                    << G[n].first.Y()*ScalingFactor
+                    << "u );" << std::endl;
+          }
+          ++I;
+       }
+    }
+    Output << "endfig;" << std::endl << "end." << std::endl;
+}
+
+/* This function (written by A. Scherer) writes a path
+   within a graph as a separate metapost-file */
+
+template<class EdgeType>
+void writeMPpath(char * Filename,
+                 Graph<Place, EdgeType>& G,
+                 std::vector< int >& V,
+                 double ScalingFactor,
+                 int Start) {
+    std::ofstream Output(Filename);
+
+    if(!Output) {
+        std::cerr << Filename
+             << " cannot be opened!\n";
+        exit(1);
+    }
+
+    Output  << "%%%% writeMPpath(): This is a generated file!\n"
+            << "beginfig( 1 );\nu=1mm; % unitlength" << std::endl
+            << "pickup pencircle scaled 2pt;\n"  // line width
+            << "  draw ( "
+            << G[ Start ].first.X() * ScalingFactor
+         << "u, "
+         << G[ Start ].first.Y() * ScalingFactor
+         << "u)";
+
+     while ( V[ Start ] >= 0 ) {
+         int Successor = V[ Start ];
+         Output << std::endl << "    -- ( "
+             << G[ Successor ].first.X() * ScalingFactor
+             << "u, "
+             << G[ Successor ].first.Y() * ScalingFactor
+             << " u)";
+         Start = Successor;
+     }
+     Output << ";\n" << "endfig;\n" << "end." << std::endl;
+}
+
+} // namespace br_stl
+
+#endif  // graphUtilities
+
diff --git a/src/terralib/kernel/graph.h b/src/terralib/kernel/graph.h
new file mode 100644
index 0000000..ddf01d3
--- /dev/null
+++ b/src/terralib/kernel/graph.h
@@ -0,0 +1,365 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file graph.h
+    This file contains structures and definitions used to manipulate a 
+	graph strucutre
+	\note this code came from the book "Desining Components with C++ STL" -
+	Ulrich Breymann - Addison-Wesley - pag 243
+*/
+#ifndef GRAPH_H
+#define GRAPH_H
+#include<cassert>
+#include<vector>
+#include<map>
+#include<stack>
+#include<iostream>
+namespace br_stl {
+
+// empty parameter class with a minimal set of operations
+// if there are no weights for edges necessary
+struct Empty {
+  public:
+    Empty(int=0) {}
+    bool operator<(const Empty&) const { return true;}
+};
+inline std::ostream& operator<<(std::ostream& os, const Empty&) { return os;}
+inline std::istream& operator>>(std::istream& is, Empty& ) { return is;}
+
+template<class VertexType, class EdgeType>
+class Graph {
+  public:
+    // public type interface
+    typedef std::map<int, EdgeType > Successor;
+    typedef std::pair<VertexType, Successor> vertex;
+    typedef std::vector<vertex> GraphType;
+    typedef typename GraphType::iterator iterator;
+    typedef typename GraphType::const_iterator const_iterator;
+
+    /* The following constructor initializes the output channel with
+       cerr. A parameter must be specified as to whether the graph is
+       directed or undirected, because this is an essential property
+       of a graph. */
+
+    Graph(bool g, std::ostream& os = cerr)
+    : directed(g), pOut(&os) { }
+
+    bool isDirected() const { return directed;}
+
+    /* A graph is a special kind of container to which something can
+       be added and whose elements can be accessed. Therefore, typical
+       container methods follow, which in their extent are limited to
+       those needed in the book's examples. Thus, there is no method
+       for explicit removal of a vertex or an edge from the graph. */
+
+    size_t size() const  { return C.size();}
+
+    iterator begin()     { return C.begin();}
+    iterator end()       { return C.end();}
+
+    // access to vertex i}
+    vertex& operator[](int i) {
+       // the access is safe, because C is a checkedVector
+       return C[i];
+    }
+
+	// return the position of the vertex, if it does not exist return -1
+	int getPosition(const VertexType& e); 
+
+    // addition of a vertex
+    int  insert(const VertexType& e);
+
+    // addition of an edge between e1 and e2
+    void insert(const VertexType& e1, const VertexType& e2,
+                const EdgeType& Value);
+
+    // addition of an edge between vertices no. i and j
+    void connectVertices(int i, int j, const EdgeType& Value);
+
+	// set the edge value between vertices no. i and j
+	bool setEdgeValue(const VertexType& e1, const VertexType& e2, const EdgeType& Value);
+
+    /* The following methods are useful tools for displaying
+       information on a graph and check its structure.*/
+
+    // checking of a read data model
+    // output on the channel passed to check()
+    void check(std::ostream& = std::cout);
+
+    // determine the number of edges
+    size_t CountEdges();
+
+    /* determine whether the graph contains cycles and in which way it
+       is connected. The method combines two tasks, because they can
+       be carried out in a single run.*/
+    void CycleAndConnect(std::ostream& = cout);
+    int sucessors(int index);
+
+  private:
+    bool directed;
+    GraphType C;          // container
+    std::ostream* pOut;
+};      // class Graph
+
+
+template<class VertexType, class EdgeType>
+int Graph<VertexType,EdgeType>::getPosition(const VertexType& e) 
+{
+    for(size_t i = 0; i < size(); ++i)
+       if(e == C[i].first)
+          return i;
+
+    return -1;
+}
+		
+/* In order to avoid ambiguities, a vertex is only entered if it does
+not yet exist. The sequential search is not particularly fast; on the
+other hand, this process is only needed once during the construction
+of the graph. The position of the vertex is returned. */
+
+template<class VertexType, class EdgeType>
+int Graph<VertexType,EdgeType>::insert(const VertexType& e) 
+{
+    int pos = getPosition(e);
+	if(pos<0)
+	{
+		// if not found, insert:
+		C.push_back(vertex(e, Successor()));
+		return size()-1;
+	}
+
+	return pos;
+}
+
+/* An edge is inserted by first inserting the vertices, if needed, and
+by determining their positions. The edge construction itself is 
+carried out by the function connectVertices(). It is passed the
+vertex numbers and, because of the absence of a search procedure, 
+it is very fast. */
+
+template<class VertexType, class EdgeType>
+void Graph<VertexType,EdgeType>::insert(const VertexType& e1,
+                                      const VertexType& e2,
+                                      const EdgeType& Value) {
+    int pos1 = insert(e1);
+    int pos2 = insert(e2);
+    connectVertices(pos1, pos2, Value);
+}
+
+template<class VertexType, class EdgeType>
+void Graph<VertexType,EdgeType>::connectVertices(
+             int pos1, int pos2, const EdgeType& Value) 
+{
+    (C[pos1].second)[pos2] = Value;
+
+    if(!directed)  // automatically insert opposite direction too
+      (C[pos2].second)[pos1] = Value;
+}
+
+template<class VertexType, class EdgeType>
+bool Graph<VertexType,EdgeType>::setEdgeValue(const VertexType& e1,
+                                      const VertexType& e2,
+                                      const EdgeType& Value) 
+{
+    int pos1 = getPosition(e1);
+	int pos2 = getPosition(e2);
+
+	if((pos1<0) || (pos2<0))
+		return false;
+
+	(C[pos1].second)[pos2] = Value;
+
+	if(!directed)  // automatically insert opposite direction too
+      (C[pos1].second)[pos2] = Value;
+
+	return true;
+}
+
+
+template<class VertexType, class EdgeType>
+void Graph<VertexType,EdgeType>::check(std::ostream& os) {
+    os << "The graph is ";
+    if(!isDirected())
+        os << "un";
+
+    os << "directed and has "
+       << size() << " vertices and "
+       << CountEdges()
+       << " edges\n";
+    CycleAndConnect(os);
+}
+
+template<class VertexType, class EdgeType>
+size_t Graph<VertexType,EdgeType>::CountEdges() {
+    size_t edges = 0;
+    iterator temp = begin();
+
+    while(temp != end())
+         edges += (*temp++).second.size();
+
+    if(!directed)
+        edges /= 2;
+    return edges;
+}
+
+// Type for next function
+enum VertStatus {notVisited, visited, processed};
+
+template<class VertexType, class EdgeType>
+int Graph<VertexType, EdgeType>::sucessors(int index) {
+	typename Successor::const_iterator
+	start  = operator[](index).second.begin(),
+	end    = operator[](index).second.end();
+	int nSucc = 0;
+	while(start != end)
+	{
+		nSucc++;
+		++start;
+	}
+
+	return nSucc;
+}
+template<class VertexType, class EdgeType>
+void Graph<VertexType, EdgeType>::CycleAndConnect(std::ostream& os) {
+    int Cycles = 0;
+    int ComponentNumber = 0;
+    std::stack<int, std::vector<int> > verticesStack;  // vertices to be visited
+
+    /* In order to prevent multiple visits to vertices in possible
+       cycles, which entails the risk of infinite loops, the vertices
+       are marked for having been visited or finished being processed.
+       This purpose is served by the vector VertexState. */
+       
+    // assign all vertices the state `not visited'
+    std::vector<VertStatus> VertexState(size(), notVisited);
+
+    /* If, starting from one vertex, an attempt is made to reach all
+       other vertices, success is not guaranteed in weakly or
+       non-connected graphs. Therefore, each vertex is visited. If it
+       is found that a vertex has already been visited, it does not
+       need to be processed any further. */
+
+    // visit all vertices
+    for(size_t i = 0; i < size(); ++i) {
+      if(VertexState[i] == notVisited) {
+         ++ComponentNumber;
+         // store on stack for further processing
+         verticesStack.push(i);
+
+         // process stack
+         while(!verticesStack.empty()) {
+            int theVertex = verticesStack.top();
+            verticesStack.pop();
+            if(VertexState[theVertex] == visited)
+               VertexState[theVertex] = processed;
+            else
+               if(VertexState[theVertex] == notVisited) {
+                  VertexState[theVertex] = visited;
+                  // new vertex, earmark for processed mark
+                  verticesStack.push(theVertex);
+
+                  /* If one of the successors of a newly found vertex
+                     bears the visited mark, the algorithm has already
+                     passed this point once, and there is a cycle. */
+                     
+                  // earmark successor:
+                  typename Successor::const_iterator
+                    start  = operator[](theVertex).second.begin(),
+                    end    = operator[](theVertex).second.end();
+
+                  while(start != end) {
+                       int Succ = (*start).first;
+
+                       if(VertexState[Succ] == visited) {
+                           ++Cycles;   // someone's been here already!
+                           (*pOut) << "at least vertex "
+                           << operator[](Succ).first
+                           << " lies in a cycle\n";
+                       }
+
+                       /* Otherwise, the vertex has already been
+                          processed and therefore should not be
+                          considered again, or it has not yet been
+                          visited and is earmarked on the stack. */
+                          
+                       if(VertexState[Succ] == notVisited)
+                          verticesStack.push(Succ);
+                       ++start;
+                  }
+               }
+         }  // stack empty?
+      }     //  if(VertexState}...
+    }       // for()} ...
+
+    /* Now we only need the output. In case of directed, weakly
+       connected graphs, the algorithm counts several components. In
+       order to make the output conform to the above definitions,
+       although with less content of information, a distinction is
+       made as to whether the graph is directed or not. */
+
+    if(directed)
+    {  if(ComponentNumber == 1)
+          os << "The graph is strongly connected.\n";
+       else
+          os << "The graph is not or weakly "
+                "connected.\n";
+    }
+    else
+       os << "The graph has "
+          << ComponentNumber
+          << " component(s)." << std::endl;
+
+    os << "The graph has ";
+    if(Cycles == 0)
+      os << "no ";
+    os << "cycles." << std::endl;
+}
+
+template<class VertexType, class EdgeType>
+std::ostream& operator<<(std::ostream& os, Graph<VertexType,EdgeType>& G) {
+    // display of vertices with successors
+	for(size_t i = 0; i < G.size(); ++i)
+	{
+		os << G[i].first << " <";
+		typename Graph<VertexType,EdgeType>::Successor::const_iterator
+                              startN = G[i].second.begin(),
+                              endN   = G[i].second.end();
+
+        while(startN != endN)
+		{
+            os << G[(*startN).first].first << ' ' // vertex
+               << (*startN).second << ' ';        // edge value
+            ++startN;
+        }
+		os << ">" << std::endl;
+    }
+    return os;
+}
+
+
+} // namespace br_stl
+
+
+
+#endif
+
diff --git a/src/terralib/kernel/ijl.h b/src/terralib/kernel/ijl.h
new file mode 100644
index 0000000..ef706bd
--- /dev/null
+++ b/src/terralib/kernel/ijl.h
@@ -0,0 +1,1513 @@
+/*M*
+//
+//
+//               INTEL CORPORATION PROPRIETARY INFORMATION
+//  This software is supplied under the terms of a license agreement or
+//  nondisclosure agreement with Intel Corporation and may not be copied
+//  or disclosed except in accordance with the terms of that agreement.
+//        Copyright (c) 1998 Intel Corporation. All Rights Reserved.
+//
+//
+//  File:
+//    ijl.h
+//
+//  Purpose:
+//    IJL Common Header File
+//    This file contains:  definitions for data types, data
+//    structures, error codes, and function prototypes used
+//    in the Intel(R) JPEG Library (IJL).
+//
+//  Version:
+//    1.5
+//
+*M*/
+
+#ifndef __IJL_H__
+#define __IJL_H__
+
+
+#if defined( __cplusplus )
+extern "C" {
+#endif
+
+
+#ifndef IJL_ALL_WARNINGS
+
+#if _MSC_VER >= 1000
+
+/* nonstandard extension used : nameless struct/union          */
+#pragma warning(disable : 4201)
+/* nonstandard extension used : bit field types other than int */
+#pragma warning(disable : 4214)
+/* unreferenced inline function has been removed               */
+#pragma warning(disable : 4514)
+/* named type definition in parentheses                        */
+#pragma warning(disable : 4115)
+
+#endif /* _MSC_VER >= 1000 */
+
+#endif /* IJL_ALL_WARNINGS */
+
+
+#define IJL_STDCALL __stdcall
+
+
+/* align struct on 8 bytes boundary */
+#pragma pack (8)
+
+
+/* /////////////////////////////////////////////////////////////////////////
+// Macros/Constants */
+
+/* Size of file I/O buffer (4K). */
+#define JBUFSIZE    4096
+
+
+#define IJL_INT64  __int64
+#define IJL_UINT64 unsigned IJL_INT64
+
+
+#ifndef IJLAPI
+  #ifdef IJL_MSEXPORTS
+    #define IJLAPI(type,name,arg) \
+      extern __declspec(dllimport) type IJL_STDCALL name arg
+  #else
+    #define IJLAPI(type,name,arg) \
+      extern type IJL_STDCALL name arg
+  #endif
+#endif
+
+
+
+#define IJL_DIB_ALIGN (sizeof(int) - 1)
+
+#define IJL_DIB_UWIDTH(width,nchannels) \
+  ((width) * (nchannels))
+
+#define IJL_DIB_AWIDTH(width,nchannels) \
+  ( ((IJL_DIB_UWIDTH(width,nchannels) + IJL_DIB_ALIGN) & (~IJL_DIB_ALIGN)) )
+
+#define IJL_DIB_PAD_BYTES(width,nchannels) \
+  ( IJL_DIB_AWIDTH(width,nchannels) - IJL_DIB_UWIDTH(width,nchannels) )
+
+
+#define IJL_DIB_SCALE_SIZE(jpgsize,scale) \
+  ( ((jpgsize) + (scale) - 1) / (scale) )
+
+
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJLibVersion
+//
+// Purpose:     Stores library version info.
+//
+// Context:
+//
+// Example:
+//   major           - 1
+//   minor           - 0
+//   build           - 1
+//   Name            - "ijl10.dll"
+//   Version         - "1.0.1 Beta1"
+//   InternalVersion - "1.0.1.1"
+//   BuildDate       - "Sep 22 1998"
+//   CallConv        - "DLL"
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _IJLibVersion
+{
+  int         major;
+  int         minor;
+  int         build;
+  const char* Name;
+  const char* Version;
+  const char* InternalVersion;
+  const char* BuildDate;
+  const char* CallConv;
+
+} IJLibVersion;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJL_RECT
+//
+// Purpose:     Keep coordinates for rectangle region of image
+//
+// Context:     Used to specify roi
+//
+// Fields:
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _IJL_RECT
+{
+  long  left;
+  long  top;
+  long  right;
+  long  bottom;
+
+} IJL_RECT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJL_HANDLE
+//
+// Purpose:     file handle
+//
+// Context:     used internally
+//
+// Fields:
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef void* IJL_HANDLE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJLIOTYPE
+//
+// Purpose:     Possible types of data read/write/other operations to be
+//              performed by the functions IJL_Read and IJL_Write.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+// Fields:
+//
+//  IJL_JFILE_XXXXXXX   Indicates JPEG data in a stdio file.
+//
+//  IJL_JBUFF_XXXXXXX   Indicates JPEG data in an addressable buffer.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJLIOTYPE
+{
+  IJL_SETUP                   = -1,
+
+
+  /* Read JPEG parameters (i.e., height, width, channels, sampling, etc.) */
+  /* from a JPEG bit stream. */
+  IJL_JFILE_READPARAMS        =  0,
+  IJL_JBUFF_READPARAMS        =  1,
+
+  /* Read a JPEG Interchange Format image. */
+  IJL_JFILE_READWHOLEIMAGE    =  2,
+  IJL_JBUFF_READWHOLEIMAGE    =  3,
+
+  /* Read JPEG tables from a JPEG Abbreviated Format bit stream. */
+  IJL_JFILE_READHEADER        =  4,
+  IJL_JBUFF_READHEADER        =  5,
+
+  /* Read image info from a JPEG Abbreviated Format bit stream. */
+  IJL_JFILE_READENTROPY       =  6,
+  IJL_JBUFF_READENTROPY       =  7,
+
+  /* Write an entire JFIF bit stream. */
+  IJL_JFILE_WRITEWHOLEIMAGE   =  8,
+  IJL_JBUFF_WRITEWHOLEIMAGE   =  9,
+
+  /* Write a JPEG Abbreviated Format bit stream. */
+  IJL_JFILE_WRITEHEADER       = 10,
+  IJL_JBUFF_WRITEHEADER       = 11,
+
+  /* Write image info to a JPEG Abbreviated Format bit stream. */
+  IJL_JFILE_WRITEENTROPY      = 12,
+  IJL_JBUFF_WRITEENTROPY      = 13,
+
+
+  /* Scaled Decoding Options: */
+
+  /* Reads a JPEG image scaled to 1/2 size. */
+  IJL_JFILE_READONEHALF       = 14,
+  IJL_JBUFF_READONEHALF       = 15,
+
+  /* Reads a JPEG image scaled to 1/4 size. */
+  IJL_JFILE_READONEQUARTER    = 16,
+  IJL_JBUFF_READONEQUARTER    = 17,
+
+  /* Reads a JPEG image scaled to 1/8 size. */
+  IJL_JFILE_READONEEIGHTH     = 18,
+  IJL_JBUFF_READONEEIGHTH     = 19,
+
+  /* Reads an embedded thumbnail from a JFIF bit stream. */
+  IJL_JFILE_READTHUMBNAIL     = 20,
+  IJL_JBUFF_READTHUMBNAIL     = 21
+
+} IJLIOTYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJL_COLOR
+//
+// Purpose:     Possible color space formats.
+//
+//              Note these formats do *not* necessarily denote
+//              the number of channels in the color space.
+//              There exists separate "channel" fields in the
+//              JPEG_CORE_PROPERTIES data structure specifically
+//              for indicating the number of channels in the
+//              JPEG and/or DIB color spaces.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJL_COLOR
+{
+  IJL_RGB         = 1,    /* Red-Green-Blue color space. */
+  IJL_BGR         = 2,    /* Reversed channel ordering from IJL_RGB. */
+  IJL_YCBCR       = 3,    /* Luminance-Chrominance color space as defined */
+                          /* by CCIR Recommendation 601. */
+  IJL_G           = 4,    /* Grayscale color space. */
+  IJL_RGBA_FPX    = 5,    /* FlashPix RGB 4 channel color space that */
+                          /* has pre-multiplied opacity. */
+  IJL_YCBCRA_FPX  = 6,    /* FlashPix YCbCr 4 channel color space that */
+                          /* has pre-multiplied opacity. */
+
+  IJL_OTHER       = 255   /* Some other color space not defined by the IJL. */
+                          /* (This means no color space conversion will */
+                          /* be done by the IJL.) */
+
+} IJL_COLOR;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJL_JPGSUBSAMPLING
+//
+// Purpose:     Possible subsampling formats used in the JPEG.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJL_JPGSUBSAMPLING
+{
+  IJL_NONE    = 0,    /* Corresponds to "No Subsampling". */
+                      /* Valid on a JPEG w/ any number of channels. */
+  IJL_411     = 1,    /* Valid on a JPEG w/ 3 channels. */
+  IJL_422     = 2,    /* Valid on a JPEG w/ 3 channels. */
+
+  IJL_4114    = 3,    /* Valid on a JPEG w/ 4 channels. */
+  IJL_4224    = 4     /* Valid on a JPEG w/ 4 channels. */
+
+} IJL_JPGSUBSAMPLING;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJL_DIBSUBSAMPLING
+//
+// Purpose:     Possible subsampling formats used in the DIB.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef IJL_JPGSUBSAMPLING IJL_DIBSUBSAMPLING;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        HUFFMAN_TABLE
+//
+// Purpose:     Stores Huffman table information in a fast-to-use format.
+//
+// Context:     Used by Huffman encoder/decoder to access Huffman table
+//              data.  Raw Huffman tables are formatted to fit this
+//              structure prior to use.
+//
+// Fields:
+//  huff_class  0 == DC Huffman or lossless table, 1 == AC table.
+//  ident       Huffman table identifier, 0-3 valid (Extended Baseline).
+//  huffelem    Huffman elements for codes <= 8 bits long;
+//              contains both zero run-length and symbol length in bits.
+//  huffval     Huffman values for codes 9-16 bits in length.
+//  mincode     Smallest Huffman code of length n.
+//  maxcode     Largest Huffman code of length n.
+//  valptr      Starting index into huffval[] for symbols of length k.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _HUFFMAN_TABLE
+{
+  int             huff_class;
+  int             ident;
+  unsigned int    huffelem[256];
+  unsigned short  huffval[256];
+  unsigned short  mincode[17];
+  short           maxcode[18];
+  unsigned short  valptr[17];
+
+} HUFFMAN_TABLE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        JPEGHuffTable
+//
+// Purpose:     Stores pointers to JPEG-binary spec compliant
+//              Huffman table information.
+//
+// Context:     Used by interface and table methods to specify encoder
+//              tables to generate and store JPEG images.
+//
+// Fields:
+//  bits        Points to number of codes of length i (<=16 supported).
+//  vals        Value associated with each Huffman code.
+//  hclass      0 == DC table, 1 == AC table.
+//  ident       Specifies the identifier for this table.
+//              0-3 for extended JPEG compliance.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEGHuffTable
+{
+  unsigned char* bits;
+  unsigned char* vals;
+  unsigned char  hclass;
+  unsigned char  ident;
+
+} JPEGHuffTable;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        QUANT_TABLE
+//
+// Purpose:     Stores quantization table information in a
+//              fast-to-use format.
+//
+// Context:     Used by quantizer/dequantizer to store formatted
+//              quantization tables.
+//
+// Fields:
+//  precision   0 => elements contains 8-bit elements,
+//              1 => elements contains 16-bit elements.
+//  ident       Table identifier (0-3).
+//  elements    Pointer to 64 table elements + 16 extra elements to catch
+//              input data errors that may cause malfunction of the
+//              Huffman decoder.
+//  elarray     Space for elements (see above) plus 8 bytes to align
+//              to a quadword boundary.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _QUANT_TABLE
+{
+  int    precision;
+  int    ident;
+  short* elements;
+  short  elarray [84];
+
+} QUANT_TABLE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        JPEGQuantTable
+//
+// Purpose:     Stores pointers to JPEG binary spec compliant
+//              quantization table information.
+//
+// Context:     Used by interface and table methods to specify encoder
+//              tables to generate and store JPEG images.
+//
+// Fields:
+//  quantizer   Zig-zag order elements specifying quantization factors.
+//  ident       Specifies identifier for this table.
+//              0-3 valid for Extended Baseline JPEG compliance.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEGQuantTable
+{
+  unsigned char* quantizer;
+  unsigned char  ident;
+
+} JPEGQuantTable;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        FRAME_COMPONENT
+//
+// Purpose:     One frame-component structure is allocated per component
+//              in a frame.
+//
+// Context:     Used by Huffman decoder to manage components.
+//
+// Fields:
+//  ident       Component identifier.  The tables use this ident to
+//              determine the correct table for each component.
+//  hsampling   Horizontal subsampling factor for this component,
+//              1-4 are legal.
+//  vsampling   Vertical subsampling factor for this component,
+//              1-4 are legal.
+//  quant_sel   Quantization table selector.  The quantization table
+//              used by this component is determined via this selector.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _FRAME_COMPONENT
+{
+  int ident;
+  int hsampling;
+  int vsampling;
+  int quant_sel;
+
+} FRAME_COMPONENT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        FRAME
+//
+// Purpose:     Stores frame-specific data.
+//
+// Context:     One Frame structure per image.
+//
+// Fields:
+//  precision       Sample precision in bits.
+//  width           Width of the source image in pixels.
+//  height          Height of the source image in pixels.
+//  MCUheight       Height of a frame MCU.
+//  MCUwidth        Width of a frame MCU.
+//  max_hsampling   Max horiz sampling ratio of any component in the frame.
+//  max_vsampling   Max vert sampling ratio of any component in the frame.
+//  ncomps          Number of components/channels in the frame.
+//  horMCU          Number of horizontal MCUs in the frame.
+//  totalMCU        Total number of MCUs in the frame.
+//  comps           Array of 'ncomps' component descriptors.
+//  restart_interv  Indicates number of MCUs after which to restart the
+//                  entropy parameters.
+//  SeenAllDCScans  Used when decoding Multiscan images to determine if
+//                  all channels of an image have been decoded.
+//  SeenAllACScans  (See SeenAllDCScans)
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _FRAME
+{
+  int              precision;
+  int              width;
+  int              height;
+  int              MCUheight;
+  int              MCUwidth;
+  int              max_hsampling;
+  int              max_vsampling;
+  int              ncomps;
+  int              horMCU;
+  long             totalMCU;
+  FRAME_COMPONENT* comps;
+  int              restart_interv;
+  int              SeenAllDCScans;
+  int              SeenAllACScans;
+
+} FRAME;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        SCAN_COMPONENT
+//
+// Purpose:     One scan-component structure is allocated per component
+//              of each scan in a frame.
+//
+// Context:     Used by Huffman decoder to manage components within scans.
+//
+// Fields:
+//  comp        Component number, index to the comps member of FRAME.
+//  hsampling   Horizontal sampling factor.
+//  vsampling   Vertical sampling factor.
+//  dc_table    DC Huffman table pointer for this scan.
+//  ac_table    AC Huffman table pointer for this scan.
+//  quant_table Quantization table pointer for this scan.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _SCAN_COMPONENT
+{
+  int            comp;
+  int            hsampling;
+  int            vsampling;
+  HUFFMAN_TABLE* dc_table;
+  HUFFMAN_TABLE* ac_table;
+  QUANT_TABLE*   quant_table;
+
+} SCAN_COMPONENT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        SCAN
+//
+// Purpose:     One SCAN structure is allocated per scan in a frame.
+//
+// Context:     Used by Huffman decoder to manage scans.
+//
+// Fields:
+//  ncomps          Number of image components in a scan, 1-4 legal.
+//  gray_scale      If TRUE, decode only the Y channel.
+//  start_spec      Start coefficient of spectral or predictor selector.
+//  end_spec        End coefficient of spectral selector.
+//  approx_high     High bit position in successive approximation
+//                  Progressive coding.
+//  approx_low      Low bit position in successive approximation
+//                  Progressive coding.
+//  restart_interv  Restart interval, 0 if disabled.
+//  curxMCU         Next horizontal MCU index to be processed after
+//                  an interrupted SCAN.
+//  curyMCU         Next vertical MCU index to be processed after
+//                  an interrupted SCAN.
+//  dc_diff         Array of DC predictor values for DPCM modes.
+//  comps           Array of ncomps SCAN_COMPONENT component identifiers.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _SCAN
+{
+  int             ncomps;
+  int             gray_scale;
+  int             start_spec;
+  int             end_spec;
+  int             approx_high;
+  int             approx_low;
+  unsigned int    restart_interv;
+  int             curxMCU;
+  int             curyMCU;
+  int             dc_diff[4];
+  SCAN_COMPONENT* comps;
+
+} SCAN;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        DCTTYPE
+//
+// Purpose:     Possible algorithms to be used to perform the discrete
+//              cosine transform (DCT).
+//
+// Fields:
+//  IJL_AAN     The AAN (Arai, Agui, and Nakajima) algorithm from
+//              Trans. IEICE, vol. E 71(11), 1095-1097, Nov. 1988.
+//  IJL_IPP     The modified K. R. Rao and P. Yip algorithm from
+//              Intel Performance Primitives Library
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _DCTTYPE
+{
+  IJL_AAN = 0,
+  IJL_IPP = 1
+
+} DCTTYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        UPSAMPLING_TYPE
+//
+// Purpose:            -  Possible algorithms to be used to perform upsampling
+//
+// Fields:
+//  IJL_BOX_FILTER      - the algorithm is simple replication of the input pixel
+//                        onto the corresponding output pixels (box filter);
+//  IJL_TRIANGLE_FILTER - 3/4 * nearer pixel + 1/4 * further pixel in each
+//                        dimension
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _UPSAMPLING_TYPE
+{
+  IJL_BOX_FILTER      = 0,
+  IJL_TRIANGLE_FILTER = 1
+
+} UPSAMPLING_TYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        SAMPLING_STATE
+//
+// Purpose:     Stores current conditions of sampling. Only for upsampling 
+//              with triangle filter is used now.
+//
+// Fields:
+//  top_row        - pointer to buffer with MCUs, that are located above than
+//                   current row of MCUs;
+//  cur_row        - pointer to buffer with current row of MCUs;
+//  bottom_row     - pointer to buffer with MCUs, that are located below than
+//                   current row of MCUs;
+//  last_row       - pointer to bottom boundary of last row of MCUs
+//  cur_row_number - number of row of MCUs, that is decoding;
+//  user_interrupt - field to store jprops->interrupt, because of we prohibit 
+//                   interrupts while top row of MCUs is upsampling.
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _SAMPLING_STATE
+{
+  short* top_row;
+  short* cur_row;
+  short* bottom_row;
+  short* last_row;
+  int    cur_row_number;
+
+} SAMPLING_STATE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        PROCESSOR_TYPE
+//
+// Purpose:     Possible types of processors.
+//              Note that the enums are defined in ascending order
+//              depending upon their various IA32 instruction support.
+//
+// Fields:
+//
+// IJL_OTHER_PROC
+//      Does not support the CPUID instruction and
+//      assumes no Pentium(R) processor instructions.
+//
+// IJL_PENTIUM_PROC
+//      Corresponds to an Intel(R) Pentium(R) processor
+//      (or a 100% compatible) that supports the
+//      Pentium(R) processor instructions.
+//
+// IJL_PENTIUM_PRO_PROC
+//      Corresponds to an Intel(R) Pentium(R) Pro processor
+//      (or a 100% compatible) that supports the
+//      Pentium(R) Pro processor instructions.
+//
+// IJL_PENTIUM_PROC_MMX_TECH
+//      Corresponds to an Intel(R) Pentium(R) processor
+//      with MMX(TM) technology (or a 100% compatible)
+//      that supports the MMX(TM) instructions.
+//
+// IJL_PENTIUM_II_PROC
+//      Corresponds to an Intel(R) Pentium(R) II processor
+//      (or a 100% compatible) that supports both the
+//      Pentium(R) Pro processor instructions and the
+//      MMX(TM) instructions.
+//
+// IJL_PENTIUM_III_PROC
+//      Corresponds to an Intel(R) Pentium(R) III processor
+//
+// IJL_NEW_PROCESSOR
+//      Correponds to new processor
+//
+//  Any additional processor types that support a superset
+//  of both the Pentium(R) Pro processor instructions and the
+//  MMX(TM) instructions should be given an enum value greater
+//  than IJL_PENTIUM_III_PROC.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _PROCESSOR_TYPE
+{
+  IJL_OTHER_PROC            = 0,
+  IJL_PENTIUM_PROC          = 1,
+  IJL_PENTIUM_PRO_PROC      = 2,
+  IJL_PENTIUM_PROC_MMX_TECH = 3,
+  IJL_PENTIUM_II_PROC       = 4,
+  IJL_PENTIUM_III_PROC      = 5,
+  IJL_PENTIUM_4_PROC        = 6,
+  IJL_NEW_PROCESSOR         = 7
+
+} PROCESSOR_TYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        RAW_DATA_TYPES_STATE
+//
+// Purpose:     Stores data types: raw dct coefficients or raw sampled data.
+//              Pointer to structure in JPEG_PROPERTIES is NULL, if any raw
+//              data isn't request (DIBBytes!=NULL).
+//
+// Fields:
+//  short* raw_ptrs[4] - pointers to buffers with raw data; one pointer 
+//                       corresponds one JPG component;
+//  data_type          - 0 - raw dct coefficients, 1 - raw sampled data.
+////////////////////////////////////////////////////////////////////////////
+*D*/
+typedef struct _RAW_DATA_TYPES_STATE
+{
+  int data_type;
+  unsigned short* raw_ptrs[4];
+
+} RAW_DATA_TYPES_STATE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        ENTROPYSTRUCT
+//
+// Purpose:     Stores the decoder state information necessary to "jump"
+//              to a particular MCU row in a compressed entropy stream.
+//
+// Context:     Used to persist the decoder state within Decode_Scan when
+//              decoding using ROIs.
+//
+// Fields:
+//      offset              Offset (in bytes) into the entropy stream
+//                          from the beginning.
+//      dcval1              DC val at the beginning of the MCU row
+//                          for component 1.
+//      dcval2              DC val at the beginning of the MCU row
+//                          for component 2.
+//      dcval3              DC val at the beginning of the MCU row
+//                          for component 3.
+//      dcval4              DC val at the beginning of the MCU row
+//                          for component 4.
+//      bit_buffer_64       64-bit Huffman bit buffer.  Stores current
+//                          bit buffer at the start of a MCU row.
+//                          Also used as a 32-bit buffer on 32-bit
+//                          architectures.
+//      bitbuf_bits_valid   Number of valid bits in the above bit buffer.
+//      unread_marker       Have any markers been decoded but not
+//                          processed at the beginning of a MCU row?
+//                          This entry holds the unprocessed marker, or
+//                          0 if none.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _ENTROPYSTRUCT
+{
+  unsigned int   offset;
+  int            dcval1;
+  int            dcval2;
+  int            dcval3;
+  int            dcval4;
+  IJL_UINT64     bit_buffer_64;
+  int            bitbuf_bits_valid;
+  unsigned char  unread_marker;
+
+} ENTROPYSTRUCT;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        STATE
+//
+// Purpose:     Stores the active state of the IJL.
+//
+// Context:     Used by all low-level routines to store pseudo-global or
+//              state variables.
+//
+// Fields:
+//      bit_buffer_64           64-bit bitbuffer utilized by Huffman
+//                              encoder/decoder algorithms utilizing routines
+//                              designed for MMX(TM) technology.
+//      bit_buffer_32           32-bit bitbuffer for all other Huffman
+//                              encoder/decoder algorithms.
+//      bitbuf_bits_valid       Number of bits in the above two fields that
+//                              are valid.
+//
+//      cur_entropy_ptr         Current position (absolute address) in
+//                              the entropy buffer.
+//      start_entropy_ptr       Starting position (absolute address) of
+//                              the entropy buffer.
+//      end_entropy_ptr         Ending position (absolute address) of
+//                              the entropy buffer.
+//      entropy_bytes_processed Number of bytes actually processed
+//                              (passed over) in the entropy buffer.
+//      entropy_buf_maxsize     Max size of the entropy buffer.
+//      entropy_bytes_left      Number of bytes left in the entropy buffer.
+//      Prog_EndOfBlock_Run     Progressive block run counter.
+//
+//      DIB_ptr                 Temporary offset into the input/output DIB.
+//
+//      unread_marker           If a marker has been read but not processed,
+//                              stick it in this field.
+//      processor_type          (0, 1, or 2) == current processor does not
+//                              support MMX(TM) instructions.
+//                              (3 or 4) == current processor does
+//                              support MMX(TM) instructions.
+//      cur_scan_comp           On which component of the scan are we working?
+//      file                    Process file handle, or
+//                              0x00000000 if no file is defined.
+//      JPGBuffer               Entropy buffer (~4K).
+//
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _STATE
+{
+  /* Bit buffer. */
+  IJL_UINT64     bit_buffer_64;
+  unsigned int   bit_buffer_32;
+  int            bitbuf_bits_valid;
+
+  /* Entropy. */
+  unsigned char* cur_entropy_ptr;
+  unsigned char* start_entropy_ptr;
+  unsigned char* end_entropy_ptr;
+  int            entropy_bytes_processed;
+  int            entropy_buf_maxsize;
+  int            entropy_bytes_left;
+  int            Prog_EndOfBlock_Run;
+
+  /* Input or output DIB. */
+  unsigned char* DIB_ptr;
+
+  /* Control. */
+  unsigned char  unread_marker;
+  PROCESSOR_TYPE processor_type;
+  int            cur_scan_comp;
+  IJL_HANDLE     file;
+  unsigned char  JPGBuffer [JBUFSIZE];
+
+} STATE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        FAST_MCU_PROCESSING_TYPE
+//
+// Purpose:     Advanced Control Option.  Do NOT modify.
+//              WARNING:  Used for internal reference only.
+//
+// Fields:
+//
+//   IJL_(sampling)_(JPEG color space)_(sampling)_(DIB color space)
+//      Decode is read left to right w/ upsampling.
+//      Encode is read right to left w/ subsampling.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _FAST_MCU_PROCESSING_TYPE
+{
+  IJL_NO_CC_OR_US                   = 0,
+
+  IJL_111_YCBCR_111_RGB             = 1,
+  IJL_111_YCBCR_111_BGR             = 2,
+
+  IJL_411_YCBCR_111_RGB             = 3,
+  IJL_411_YCBCR_111_BGR             = 4,
+
+  IJL_422_YCBCR_111_RGB             = 5,
+  IJL_422_YCBCR_111_BGR             = 6,
+
+  IJL_111_YCBCR_1111_RGBA_FPX       = 7,
+  IJL_411_YCBCR_1111_RGBA_FPX       = 8,
+  IJL_422_YCBCR_1111_RGBA_FPX       = 9,
+
+  IJL_1111_YCBCRA_FPX_1111_RGBA_FPX = 10,
+  IJL_4114_YCBCRA_FPX_1111_RGBA_FPX = 11,
+  IJL_4224_YCBCRA_FPX_1111_RGBA_FPX = 12,
+
+  IJL_111_RGB_1111_RGBA_FPX         = 13,
+
+  IJL_1111_RGBA_FPX_1111_RGBA_FPX   = 14,
+
+  IJL_111_OTHER_111_OTHER           = 15,
+  IJL_411_OTHER_111_OTHER           = 16,
+  IJL_422_OTHER_111_OTHER           = 17,
+
+  IJL_YCBYCR_YCBCR                  = 18,
+
+  IJL_YCBCR_YCBYCR                  = 19   // decoding to YCbCr 422 format
+
+} FAST_MCU_PROCESSING_TYPE;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        JPEG_PROPERTIES
+//
+// Purpose:     Stores low-level and control information.  It is used by
+//              both the encoder and decoder.  An advanced external user
+//              may access this structure to expand the interface
+//              capability.
+//
+//              See the Developer's Guide for an expanded description
+//              of this structure and its use.
+//
+// Context:     Used by all interface methods and most IJL routines.
+//
+// Fields:
+//
+//  iotype              IN:     Specifies type of data operation
+//                              (read/write/other) to be
+//                              performed by IJL_Read or IJL_Write.
+//  roi                 IN:     Rectangle-Of-Interest to read from, or
+//                              write to, in pixels.
+//  dcttype             IN:     DCT alogrithm to be used.
+//  fast_processing     OUT:    Supported fast pre/post-processing path.
+//                              This is set by the IJL.
+//  interrupt           IN:     Signals an interrupt has been requested.
+//
+//  DIBBytes            IN:     Pointer to buffer of uncompressed data.
+//  DIBWidth            IN:     Width of uncompressed data.
+//  DIBHeight           IN:     Height of uncompressed data.
+//  DIBPadBytes         IN:     Padding (in bytes) at end of each
+//                              row in the uncompressed data.
+//  DIBChannels         IN:     Number of components in the
+//                              uncompressed data.
+//  DIBColor            IN:     Color space of uncompressed data.
+//  DIBSubsampling      IN:     Required to be IJL_NONE or IJL_422.
+//  DIBLineBytes        OUT:    Number of bytes in an output DIB line
+//                              including padding.
+//
+//  JPGFile             IN:     Pointer to file based JPEG.
+//  JPGBytes            IN:     Pointer to buffer based JPEG.
+//  JPGSizeBytes        IN:     Max buffer size. Used with JPGBytes.
+//                      OUT:    Number of compressed bytes written.
+//  JPGWidth            IN:     Width of JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGHeight           IN:     Height of JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGChannels         IN:     Number of components in JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGColor            IN:     Color space of JPEG image.
+//  JPGSubsampling      IN:     Subsampling of JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGThumbWidth       OUT:    JFIF embedded thumbnail width [0-255].
+//  JPGThumbHeight      OUT:    JFIF embedded thumbnail height [0-255].
+//
+//  cconversion_reqd    OUT:    If color conversion done on decode, TRUE.
+//  upsampling_reqd     OUT:    If upsampling done on decode, TRUE.
+//  jquality            IN:     [0-100] where highest quality is 100.
+//  jinterleaveType     IN/OUT: 0 => MCU interleaved file, and
+//                              1 => 1 scan per component.
+//  numxMCUs            OUT:    Number of MCUs in the x direction.
+//  numyMCUs            OUT:    Number of MCUs in the y direction.
+//
+//  nqtables            IN/OUT: Number of quantization tables.
+//  maxquantindex       IN/OUT: Maximum index of quantization tables.
+//  nhuffActables       IN/OUT: Number of AC Huffman tables.
+//  nhuffDctables       IN/OUT: Number of DC Huffman tables.
+//  maxhuffindex        IN/OUT: Maximum index of Huffman tables.
+//  jFmtQuant           IN/OUT: Formatted quantization table info.
+//  jFmtAcHuffman       IN/OUT: Formatted AC Huffman table info.
+//  jFmtDcHuffman       IN/OUT: Formatted DC Huffman table info.
+//
+//  jEncFmtQuant        IN/OUT: Pointer to one of the above, or
+//                              to externally persisted table.
+//  jEncFmtAcHuffman    IN/OUT: Pointer to one of the above, or
+//                              to externally persisted table.
+//  jEncFmtDcHuffman    IN/OUT: Pointer to one of the above, or
+//                              to externally persisted table.
+//
+//  use_default_qtables IN:     Set to default quantization tables.
+//                              Clear to supply your own.
+//  use_default_htables IN:     Set to default Huffman tables.
+//                              Clear to supply your own.
+//  rawquanttables      IN:     Up to 4 sets of quantization tables.
+//  rawhufftables       IN:     Alternating pairs (DC/AC) of up to 4
+//                              sets of raw Huffman tables.
+//  HuffIdentifierAC    IN:     Indicates what channel the user-
+//                              supplied Huffman AC tables apply to.
+//  HuffIdentifierDC    IN:     Indicates what channel the user-
+//                              supplied Huffman DC tables apply to.
+//
+//  jframe              OUT:    Structure with frame-specific info.
+//  needframe           OUT:    TRUE when a frame has been detected.
+//
+//  jscan               Persistence for current scan pointer when
+//                      interrupted.
+//
+//  state               OUT:    Contains info on the state of the IJL.
+//  SawAdobeMarker      OUT:    Decoder saw an APP14 marker somewhere.
+//  AdobeXform          OUT:    If SawAdobeMarker TRUE, this indicates
+//                              the JPEG color space given by that marker.
+//
+//  rowoffsets          Persistence for the decoder MCU row origins
+//                      when decoding by ROI.  Offsets (in bytes
+//                      from the beginning of the entropy data)
+//                      to the start of each of the decoded rows.
+//                      Fill the offsets with -1 if they have not
+//                      been initalized and NULL could be the
+//                      offset to the first row.
+//
+//  MCUBuf              OUT:    Quadword aligned internal buffer.
+//                              Big enough for the largest MCU
+//                              (10 blocks) with extra room for
+//                              additional operations.
+//  tMCUBuf             OUT:    Version of above, without alignment.
+//
+//  processor_type      OUT:    Determines type of processor found
+//                              during initialization.
+//
+//  raw_coefs           IN:     Place to hold pointers to raw data buffers or
+//                              raw DCT coefficients buffers
+//
+//  progressive_found   OUT:    1 when progressive image detected.
+//  coef_buffer         IN:     Pointer to a larger buffer containing
+//                              frequency coefficients when they
+//                              cannot be decoded dynamically
+//                              (i.e., as in progressive decoding).
+//
+//  upsampling_type     IN:     Type of sampling:
+//                              IJL_BOX_FILTER or IJL_TRIANGLE_FILTER.
+//  SAMPLING_STATE*    OUT:     pointer to structure, describing current
+//                              condition of upsampling
+//
+//  AdobeVersion       OUT      version field, if Adobe APP14 marker detected
+//  AdobeFlags0        OUT      flags0 field, if Adobe APP14 marker detected
+//  AdobeFlags1        OUT      flags1 field, if Adobe APP14 marker detected
+//
+//  jfif_app0_detected OUT:     1 - if JFIF APP0 marker detected,  
+//                              0 - if not
+//  jfif_app0_version  IN/OUT   The JFIF file version
+//  jfif_app0_units    IN/OUT   units for the X and Y densities
+//                              0 - no units, X and Y specify
+//                                  the pixel aspect ratio
+//                              1 - X and Y are dots per inch
+//                              2 - X and Y are dots per cm
+//  jfif_app0_Xdensity IN/OUT   horizontal pixel density
+//  jfif_app0_Ydensity IN/OUT   vertical pixel density
+//
+//  jpeg_comment       IN       pointer to JPEG comments
+//  jpeg_comment_size  IN/OUT   size of JPEG comments, in bytes
+//
+//  raw_coefs          IN/OUT   if !NULL, then pointer to vector of pointers
+//                              (size = JPGChannels) to buffers for raw (short)
+//                              dct coefficients. 1 pointer corresponds to one
+//                              component;
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEG_PROPERTIES
+{
+  /* Compression/Decompression control. */
+  IJLIOTYPE                iotype;               /* default = IJL_SETUP */
+  IJL_RECT                 roi;                  /* default = 0 */
+  DCTTYPE                  dcttype;              /* default = IJL_AAN */
+  FAST_MCU_PROCESSING_TYPE fast_processing;      /* default = IJL_NO_CC_OR_US */
+  int                      interrupt;            /* default = FALSE */
+
+  /* DIB specific I/O data specifiers. */
+  unsigned char*           DIBBytes;             /* default = NULL */
+  int                      DIBWidth;             /* default = 0 */
+  int                      DIBHeight;            /* default = 0 */
+  int                      DIBPadBytes;          /* default = 0 */
+  int                      DIBChannels;          /* default = 3 */
+  IJL_COLOR                DIBColor;             /* default = IJL_BGR */
+  IJL_DIBSUBSAMPLING       DIBSubsampling;       /* default = IJL_NONE */
+  int                      DIBLineBytes;         /* default = 0 */
+
+  /* JPEG specific I/O data specifiers. */
+  const char*              JPGFile;              /* default = NULL */
+  unsigned char*           JPGBytes;             /* default = NULL */
+  int                      JPGSizeBytes;         /* default = 0 */
+  int                      JPGWidth;             /* default = 0 */
+  int                      JPGHeight;            /* default = 0 */
+  int                      JPGChannels;          /* default = 3 */
+  IJL_COLOR                JPGColor;             /* default = IJL_YCBCR */
+  IJL_JPGSUBSAMPLING       JPGSubsampling;       /* default = IJL_411 */
+  int                      JPGThumbWidth;        /* default = 0 */
+  int                      JPGThumbHeight;       /* default = 0 */
+
+  /* JPEG conversion properties. */
+  int                      cconversion_reqd;     /* default = TRUE */
+  int                      upsampling_reqd;      /* default = TRUE */
+  int                      jquality;             /* default = 75 */
+  int                      jinterleaveType;      /* default = 0 */
+  int                      numxMCUs;             /* default = 0 */
+  int                      numyMCUs;             /* default = 0 */
+
+  /* Tables. */
+  int                      nqtables;
+  int                      maxquantindex;
+  int                      nhuffActables;
+  int                      nhuffDctables;
+  int                      maxhuffindex;
+
+  QUANT_TABLE              jFmtQuant[4];
+  HUFFMAN_TABLE            jFmtAcHuffman[4];
+  HUFFMAN_TABLE            jFmtDcHuffman[4];
+
+  short*                   jEncFmtQuant[4];
+  HUFFMAN_TABLE*           jEncFmtAcHuffman[4];
+  HUFFMAN_TABLE*           jEncFmtDcHuffman[4];
+
+  /* Allow user-defined tables. */
+  int                      use_external_qtables;
+  int                      use_external_htables;
+
+  JPEGQuantTable           rawquanttables[4];
+  JPEGHuffTable            rawhufftables[8];
+  char                     HuffIdentifierAC[4];
+  char                     HuffIdentifierDC[4];
+
+  /* Frame specific members. */
+  FRAME                    jframe;
+  int                      needframe;
+
+  /* SCAN persistent members. */
+  SCAN*                    jscan;
+
+  /* State members. */
+  STATE                    state;
+  int                      SawAdobeMarker;
+  int                      AdobeXform;
+
+  /* ROI decoder members. */
+  ENTROPYSTRUCT*           rowoffsets;
+
+  /* Intermediate buffers. */
+  unsigned char*           MCUBuf;
+  unsigned char            tMCUBuf[720*2];
+
+  /* Processor detected. */
+  PROCESSOR_TYPE           processor_type;
+
+  RAW_DATA_TYPES_STATE*    raw_coefs;
+
+  /* Progressive mode members. */
+  int                      progressive_found;
+  short*                   coef_buffer;
+
+  /* Upsampling mode members. */
+  UPSAMPLING_TYPE          upsampling_type;
+  SAMPLING_STATE*          sampling_state_ptr;
+
+  /* Adobe APP14 segment variables */
+  unsigned short           AdobeVersion;         /* default = 100 */
+  unsigned short           AdobeFlags0;          /* default = 0 */
+  unsigned short           AdobeFlags1;          /* default = 0 */
+
+  /* JFIF APP0 segment variables */
+  int                      jfif_app0_detected;
+  unsigned short           jfif_app0_version;    /* default = 0x0101 */
+  unsigned char            jfif_app0_units;      /* default = 0 - pixel */
+  unsigned short           jfif_app0_Xdensity;   /* default = 1 */
+  unsigned short           jfif_app0_Ydensity;   /* default = 1 */
+
+  /* comments related fields */
+  char*                    jpeg_comment;         /* default = NULL */
+  unsigned short           jpeg_comment_size;    /* default = 0 */
+
+} JPEG_PROPERTIES;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        JPEG_CORE_PROPERTIES
+//
+// Purpose:     This is the primary data structure between the IJL and
+//              the external user.  It stores JPEG state information
+//              and controls the IJL.  It is user-modifiable.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+// Context:     Used by all low-level IJL routines to store
+//              pseudo-global information.
+//
+// Fields:
+//
+//  UseJPEGPROPERTIES   Set this flag != 0 if you wish to override
+//                      the JPEG_CORE_PROPERTIES "IN" parameters with
+//                      the JPEG_PROPERTIES parameters.
+//
+//  DIBBytes            IN:     Pointer to buffer of uncompressed data.
+//  DIBWidth            IN:     Width of uncompressed data.
+//  DIBHeight           IN:     Height of uncompressed data.
+//  DIBPadBytes         IN:     Padding (in bytes) at end of each
+//                              row in the uncompressed data.
+//  DIBChannels         IN:     Number of components in the
+//                              uncompressed data.
+//  DIBColor            IN:     Color space of uncompressed data.
+//  DIBSubsampling      IN:     Required to be IJL_NONE or IJL_422.
+//
+//  JPGFile             IN:     Pointer to file based JPEG.
+//  JPGBytes            IN:     Pointer to buffer based JPEG.
+//  JPGSizeBytes        IN:     Max buffer size. Used with JPGBytes.
+//                      OUT:    Number of compressed bytes written.
+//  JPGWidth            IN:     Width of JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGHeight           IN:     Height of JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGChannels         IN:     Number of components in JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGColor            IN:     Color space of JPEG image.
+//  JPGSubsampling      IN:     Subsampling of JPEG image.
+//                      OUT:    After reading (except READHEADER).
+//  JPGThumbWidth       OUT:    JFIF embedded thumbnail width [0-255].
+//  JPGThumbHeight      OUT:    JFIF embedded thumbnail height [0-255].
+//
+//  cconversion_reqd    OUT:    If color conversion done on decode, TRUE.
+//  upsampling_reqd     OUT:    If upsampling done on decode, TRUE.
+//  jquality            IN:     [0-100] where highest quality is 100.
+//
+//  jprops              "Low-Level" IJL data structure.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef struct _JPEG_CORE_PROPERTIES
+{
+  int                UseJPEGPROPERTIES;         /* default = 0 */
+
+  /* DIB specific I/O data specifiers. */
+  unsigned char*     DIBBytes;                  /* default = NULL */
+  int                DIBWidth;                  /* default = 0 */
+  int                DIBHeight;                 /* default = 0 */
+  int                DIBPadBytes;               /* default = 0 */
+  int                DIBChannels;               /* default = 3 */
+  IJL_COLOR          DIBColor;                  /* default = IJL_BGR */
+  IJL_DIBSUBSAMPLING DIBSubsampling;            /* default = IJL_NONE */
+
+  /* JPEG specific I/O data specifiers. */
+  const char*        JPGFile;                   /* default = NULL */
+  unsigned char*     JPGBytes;                  /* default = NULL */
+  int                JPGSizeBytes;              /* default = 0 */
+  int                JPGWidth;                  /* default = 0 */
+  int                JPGHeight;                 /* default = 0 */
+  int                JPGChannels;               /* default = 3 */
+  IJL_COLOR          JPGColor;                  /* default = IJL_YCBCR */
+  IJL_JPGSUBSAMPLING JPGSubsampling;            /* default = IJL_411 */
+  int                JPGThumbWidth;             /* default = 0 */
+  int                JPGThumbHeight;            /* default = 0 */
+
+  /* JPEG conversion properties. */
+  int                cconversion_reqd;          /* default = TRUE */
+  int                upsampling_reqd;           /* default = TRUE */
+  int                jquality;                  /* default = 75 */
+
+  /* Low-level properties. */
+  JPEG_PROPERTIES    jprops;
+
+} JPEG_CORE_PROPERTIES;
+
+
+/*D*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJLERR
+//
+// Purpose:     Listing of possible "error" codes returned by the IJL.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+// Context:     Used for error checking.
+//
+////////////////////////////////////////////////////////////////////////////
+*D*/
+
+typedef enum _IJLERR
+{
+  /* The following "error" values indicate an "OK" condition. */
+  IJL_OK                          = 0,
+  IJL_INTERRUPT_OK                = 1,
+  IJL_ROI_OK                      = 2,
+
+  /* The following "error" values indicate an error has occurred. */
+  IJL_EXCEPTION_DETECTED          =  -1,
+  IJL_INVALID_ENCODER             =  -2,
+  IJL_UNSUPPORTED_SUBSAMPLING     =  -3,
+  IJL_UNSUPPORTED_BYTES_PER_PIXEL =  -4,
+  IJL_MEMORY_ERROR                =  -5,
+  IJL_BAD_HUFFMAN_TABLE           =  -6,
+  IJL_BAD_QUANT_TABLE             =  -7,
+  IJL_INVALID_JPEG_PROPERTIES     =  -8,
+  IJL_ERR_FILECLOSE               =  -9,
+  IJL_INVALID_FILENAME            = -10,
+  IJL_ERROR_EOF                   = -11,
+  IJL_PROG_NOT_SUPPORTED          = -12,
+  IJL_ERR_NOT_JPEG                = -13,
+  IJL_ERR_COMP                    = -14,
+  IJL_ERR_SOF                     = -15,
+  IJL_ERR_DNL                     = -16,
+  IJL_ERR_NO_HUF                  = -17,
+  IJL_ERR_NO_QUAN                 = -18,
+  IJL_ERR_NO_FRAME                = -19,
+  IJL_ERR_MULT_FRAME              = -20,
+  IJL_ERR_DATA                    = -21,
+  IJL_ERR_NO_IMAGE                = -22,
+  IJL_FILE_ERROR                  = -23,
+  IJL_INTERNAL_ERROR              = -24,
+  IJL_BAD_RST_MARKER              = -25,
+  IJL_THUMBNAIL_DIB_TOO_SMALL     = -26,
+  IJL_THUMBNAIL_DIB_WRONG_COLOR   = -27,
+  IJL_BUFFER_TOO_SMALL            = -28,
+  IJL_UNSUPPORTED_FRAME           = -29,
+  IJL_ERR_COM_BUFFER              = -30,
+  IJL_RESERVED                    = -99
+
+} IJLERR;
+
+
+
+
+/* /////////////////////////////////////////////////////////////////////////
+//                     Function Prototypes (API Calls)                    //
+///////////////////////////////////////////////////////////////////////// */
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name:        ijlInit
+//
+// Purpose:     Used to initalize the IJL.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+// Context:     Always call this before anything else.
+//              Also, only call this with a new jcprops structure, or
+//              after calling IJL_Free.  Otherwise, dynamically
+//              allocated memory may be leaked.
+//
+// Returns:     Any IJLERR value.  IJL_OK indicates success.
+//
+// Parameters:
+//  jcprops     Pointer to an externally allocated
+//              JPEG_CORE_PROPERTIES structure.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlInit, ( JPEG_CORE_PROPERTIES* jcprops ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name:        ijlFree
+//
+// Purpose:     Used to properly close down the IJL.
+//
+//              See the Developer's Guide for details on appropriate usage.
+//
+// Context:     Always call this when done using the IJL to perform
+//              clean-up of dynamically allocated memory.
+//              Note, IJL_Init will have to be called to use the
+//              IJL again.
+//
+// Returns:     Any IJLERR value.  IJL_OK indicates success.
+//
+// Parameters:
+//  jcprops     Pointer to an externally allocated
+//              JPEG_CORE_PROPERTIES structure.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlFree, ( JPEG_CORE_PROPERTIES* jcprops ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name:        IJL_Read
+//
+// Purpose:     Used to read JPEG data (entropy, or header, or both) into
+//              a user-supplied buffer (to hold the image data) and/or
+//              into the JPEG_CORE_PROPERTIES structure (to hold the
+//              header info).
+//
+// Context:     See the Developer's Guide for a detailed description
+//              on the use of this function.  The jcprops main data
+//              members are checked for consistency.
+//
+// Returns:     Any IJLERR value.  IJL_OK indicates success.
+//
+// Parameters:
+//  jcprops     Pointer to an externally allocated
+//              JPEG_CORE_PROPERTIES structure.
+//  iotype      Specifies what type of read operation to perform.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlRead, ( JPEG_CORE_PROPERTIES* jcprops, IJLIOTYPE iotype ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name:        ijlWrite
+//
+// Purpose:     Used to write JPEG data (entropy, or header, or both) into
+//              a user-supplied buffer (to hold the image data) and/or
+//              into the JPEG_CORE_PROPERTIES structure (to hold the
+//              header info).
+//
+// Context:     See the Developer's Guide for a detailed description
+//              on the use of this function.  The jcprops main data
+//              members are checked for consistency.
+//
+// Returns:     Any IJLERR value.  IJL_OK indicates success.
+//
+// Parameters:
+//  jcprops     Pointer to an externally allocated
+//              JPEG_CORE_PROPERTIES structure.
+//  iotype      Specifies what type of write operation to perform.
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(IJLERR, ijlWrite, ( JPEG_CORE_PROPERTIES* jcprops, IJLIOTYPE iotype ));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name:        ijlGetLibVersion
+//
+// Purpose:     To identify the version number of the IJL.
+//
+// Context:     Call to get the IJL version number.
+//
+// Returns:     pointer to IJLibVersion struct
+//
+// Parameters:  none
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(const IJLibVersion*, ijlGetLibVersion, (void));
+
+
+/*F*
+////////////////////////////////////////////////////////////////////////////
+// Name:        ijlErrorStr
+//
+// Purpose:     Gets the string to describe error code.
+//
+// Context:     Is called to get descriptive string on arbitrary IJLERR code.
+//
+// Returns:     pointer to string
+//
+// Parameters:  IJLERR - IJL error code
+//
+////////////////////////////////////////////////////////////////////////////
+*F*/
+
+IJLAPI(const char*, ijlErrorStr, (IJLERR code));
+
+
+
+
+#if defined( __cplusplus )
+}
+#endif
+
+#endif  /* __IJL_H__ */
diff --git a/src/terralib/kernel/jpeg.cpp b/src/terralib/kernel/jpeg.cpp
new file mode 100644
index 0000000..e183bfe
--- /dev/null
+++ b/src/terralib/kernel/jpeg.cpp
@@ -0,0 +1,452 @@
+//** JPEG.CPP, the code used to wrap IJL
+
+
+//############################################################################
+//##                                                                        ##
+//##  JPEG.CPP                                                                 ##
+//##                                                                        ##
+//##  Wrapper class to load a jpeg from a block of memory.                  ##
+//##                                                                        ##
+//##  OpenSourced 2/4/2000 by John W. Ratcliff                                ##
+//##                                                                        ##
+//##  No warranty expressed or implied.  Released as part of the triangle   ##
+//##  throughput testbed project.                                           ##
+//############################################################################
+//##                                                                        ##
+//##  Contact John W. Ratcliff at jratcliff at verant.com                      ##
+//############################################################################
+#include "jpeg.h"
+#include "ijl.h" // intel jpeg library header file.
+
+// read image parameters.
+bool  Jpeg::ReadFileParams(int &width,
+                       int &height,
+                       int &nchannels,
+                       char *name)
+{
+  JPEG_CORE_PROPERTIES jcprops;
+
+  if ( ijlInit(&jcprops) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+  jcprops.JPGFile = name;
+
+  if ( ijlRead(&jcprops,IJL_JFILE_READPARAMS) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+  width  = jcprops.JPGWidth;
+  height = jcprops.JPGHeight;
+  nchannels = jcprops.JPGChannels;
+  return true;
+}
+
+// read image file into this buffer.
+bool Jpeg::ReadFile(int width,
+                       int height,
+                       int nchannels,
+                       char *name,
+					   unsigned char *pixbuff)
+{
+  JPEG_CORE_PROPERTIES jcprops;
+
+  if ( ijlInit(&jcprops) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+  jcprops.JPGFile = name;
+
+  IJLIOTYPE mode;
+
+  mode = IJL_JFILE_READWHOLEIMAGE;
+
+  jcprops.DIBWidth  = width;
+  jcprops.DIBHeight = height;
+  jcprops.JPGWidth  = width;
+  jcprops.JPGHeight = height;
+  jcprops.DIBChannels = nchannels;
+  jcprops.JPGChannels = nchannels;
+
+  jcprops.DIBPadBytes = 0;
+  jcprops.DIBBytes = (unsigned char *)pixbuff;
+
+  if ( jcprops.JPGChannels == 3 )
+  {
+    jcprops.DIBColor = IJL_RGB;
+    jcprops.JPGColor = IJL_YCBCR;
+    jcprops.JPGSubsampling = IJL_411;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+  else
+  {
+    jcprops.DIBColor = IJL_G;
+    jcprops.JPGColor = IJL_G;
+    jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+
+  if ( ijlRead(&jcprops, mode) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+  if ( ijlFree(&jcprops) != IJL_OK ) return false;
+
+  return true;
+}
+
+// read image into this buffer.
+void * Jpeg::ReadImage(int &width,
+                       int &height,
+                       int &nchannels,
+                       const void *buffer,
+                       int sizebytes)
+{
+  JPEG_CORE_PROPERTIES jcprops;
+
+   _IJLERR res;
+
+  res = ijlInit(&jcprops);
+  if ( res != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  jcprops.JPGBytes = (unsigned char *) buffer;
+  jcprops.JPGSizeBytes = sizebytes;
+  jcprops.jquality = 100;
+
+  res = ijlRead(&jcprops,IJL_JBUFF_READPARAMS);
+  if ( res != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  width  = jcprops.JPGWidth;
+  height = jcprops.JPGHeight;
+  IJLIOTYPE mode;
+
+  mode = IJL_JBUFF_READWHOLEIMAGE;
+  nchannels = jcprops.JPGChannels;
+  unsigned char * pixbuff = new unsigned char[width*height*nchannels];
+  if ( !pixbuff )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  jcprops.DIBWidth  = width;
+  jcprops.DIBHeight = height;
+  jcprops.DIBChannels = nchannels;
+  jcprops.DIBPadBytes = 0;
+  jcprops.DIBBytes = (unsigned char *)pixbuff;
+
+  if ( jcprops.JPGChannels == 3 )
+  {
+    jcprops.DIBColor = IJL_RGB;
+    jcprops.JPGColor = IJL_YCBCR;
+    jcprops.JPGSubsampling = IJL_411;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+  else
+  {
+    jcprops.DIBColor = IJL_G;
+    jcprops.JPGColor = IJL_G;
+    jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+
+  
+  res = ijlRead(&jcprops, mode);
+  if (res != IJL_OK )
+  {
+	const char* desc = ijlErrorStr(res);
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  if ( ijlFree(&jcprops) != IJL_OK ) return 0;
+
+  return (void *)pixbuff;
+}
+
+
+void* Jpeg::Compress(const void *source,
+                      int width,
+                      int height,
+                      int bpp,
+                      int &len,
+                      int quality)
+{
+  JPEG_CORE_PROPERTIES jcprops;
+
+  if ( ijlInit(&jcprops) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  jcprops.DIBWidth    = width;
+  jcprops.DIBHeight   = height;
+  jcprops.JPGWidth    = width;
+  jcprops.JPGHeight   = height;
+  jcprops.DIBBytes    = (unsigned char *) source;
+  jcprops.DIBPadBytes = 0;
+  jcprops.DIBChannels = bpp;
+  jcprops.JPGChannels = bpp;
+
+  if ( bpp == 3 )
+  {
+    jcprops.DIBColor = IJL_RGB;
+    jcprops.JPGColor = IJL_YCBCR;
+    jcprops.JPGSubsampling = IJL_411;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+  else
+  {
+    jcprops.DIBColor = IJL_G;
+    jcprops.JPGColor = IJL_G;
+    jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+
+  int size = width*height*bpp;
+
+  unsigned char * buffer = new unsigned char[size];
+
+  jcprops.JPGSizeBytes = size;
+  jcprops.JPGBytes     = buffer;
+
+  jcprops.jquality = quality;
+
+
+  if ( ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    delete buffer;
+    return 0;
+  }
+
+
+  if ( ijlFree(&jcprops) != IJL_OK )
+  {
+    delete buffer;
+    return 0;
+  }
+
+  len = jcprops.JPGSizeBytes;
+  return buffer;
+}
+
+bool Jpeg::WriteFile(const void *source,
+                      int width,
+                      int height,
+                      int bpp,
+                       char *name,
+                      int quality)
+{
+  JPEG_CORE_PROPERTIES jcprops;
+
+  if ( ijlInit(&jcprops) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+  jcprops.JPGFile     = name;
+  jcprops.DIBWidth    = width;
+  jcprops.DIBHeight   = height;
+  jcprops.JPGWidth    = width;
+  jcprops.JPGHeight   = height;
+  jcprops.DIBBytes    = (unsigned char *) source;
+  jcprops.DIBPadBytes = 0;
+  jcprops.DIBChannels = bpp;
+  jcprops.JPGChannels = bpp;
+
+  if ( bpp == 3 )
+  {
+    jcprops.DIBColor = IJL_RGB;
+    jcprops.JPGColor = IJL_YCBCR;
+    jcprops.JPGSubsampling = IJL_411;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+  else
+  {
+    jcprops.DIBColor = IJL_G;
+    jcprops.JPGColor = IJL_G;
+    jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+
+  jcprops.jquality = quality;
+  
+  IJLERR error;
+  error = ijlWrite(&jcprops,IJL_JFILE_WRITEWHOLEIMAGE);
+  if ( error != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+
+  if ( ijlFree(&jcprops) != IJL_OK )
+    return false;
+
+  return true;
+}
+
+bool Jpeg::Compress(const void *source,
+					  unsigned char *dest,
+                      int width,
+                      int height,
+                      int bpp,
+                      unsigned long &len,
+                      int quality)
+{
+ 
+  if (!source || ! dest)
+	  return false;
+
+  JPEG_CORE_PROPERTIES jcprops;
+
+  if ( ijlInit(&jcprops) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+  jcprops.DIBWidth    = width;
+  jcprops.DIBHeight   = height;
+  jcprops.JPGWidth    = width;
+  jcprops.JPGHeight   = height;
+  jcprops.DIBBytes    = (unsigned char *) source;
+  jcprops.DIBPadBytes = 0;
+  jcprops.DIBChannels = bpp;
+  jcprops.JPGChannels = bpp;
+
+  if ( bpp == 3 )
+  {
+    jcprops.DIBColor = IJL_RGB;
+    jcprops.JPGColor = IJL_YCBCR;
+    jcprops.JPGSubsampling = IJL_411;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+  else
+  {
+    jcprops.DIBColor = IJL_G;
+    jcprops.JPGColor = IJL_G;
+    jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+
+  int size = width*height*bpp;
+
+  jcprops.JPGSizeBytes = size;
+  jcprops.JPGBytes     = dest;
+
+  jcprops.jquality = quality;
+
+
+  if ( ijlWrite(&jcprops,IJL_JBUFF_WRITEWHOLEIMAGE) != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return false;
+  }
+
+
+  if ( ijlFree(&jcprops) != IJL_OK )
+  {
+    return false;
+  }
+
+  len = jcprops.JPGSizeBytes;
+  return true;
+}
+
+
+
+// read image into this buffer.
+bool Jpeg::ReadImage(int &width,
+                       int &height,
+                       int &nchannels,
+                       const void *buffer,
+                       long sizebytes,
+					   unsigned char* dest)
+{
+  
+	if (!dest || !buffer)
+		return false;
+
+	JPEG_CORE_PROPERTIES jcprops;
+
+   _IJLERR res;
+
+  res = ijlInit(&jcprops);
+  if ( res != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  jcprops.JPGBytes = (unsigned char *) buffer;
+  jcprops.JPGSizeBytes = sizebytes;
+  jcprops.jquality = 100;
+
+  res = ijlRead(&jcprops,IJL_JBUFF_READPARAMS);
+  if ( res != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  width  = jcprops.JPGWidth;
+  height = jcprops.JPGHeight;
+  IJLIOTYPE mode;
+
+  mode = IJL_JBUFF_READWHOLEIMAGE;
+  nchannels = jcprops.JPGChannels;
+
+  jcprops.DIBWidth  = width;
+  jcprops.DIBHeight = height;
+  jcprops.DIBChannels = nchannels;
+  jcprops.DIBPadBytes = 0;
+  jcprops.DIBBytes = (unsigned char *)dest;
+
+  if ( jcprops.JPGChannels == 3 )
+  {
+    jcprops.DIBColor = IJL_RGB;
+    jcprops.JPGColor = IJL_YCBCR;
+    jcprops.JPGSubsampling = IJL_411;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+  else
+  {
+    jcprops.DIBColor = IJL_G;
+    jcprops.JPGColor = IJL_G;
+    jcprops.JPGSubsampling = (IJL_JPGSUBSAMPLING) 0;
+    jcprops.DIBSubsampling = (IJL_DIBSUBSAMPLING) 0;
+  }
+
+  
+  res = ijlRead(&jcprops, mode);
+  if (res != IJL_OK )
+  {
+    ijlFree(&jcprops);
+    return 0;
+  }
+
+  if ( ijlFree(&jcprops) != IJL_OK ) return 0;
+
+  return true;
+}
+
diff --git a/src/terralib/kernel/jpeg.h b/src/terralib/kernel/jpeg.h
new file mode 100644
index 0000000..e0ac8f7
--- /dev/null
+++ b/src/terralib/kernel/jpeg.h
@@ -0,0 +1,95 @@
+/*Intel Corporation has released a number of extremely useful libraries and tools as part
+of their performance suite.  These tools are designed to assist developers in taking
+advantage of their advanced processors.
+
+One excellent tool is the Intel Jpeg Library which provides a single small DLL which
+will rapidly compress and decompress Jpeg images, a common graphics file format.
+
+The following code snippet provides a static wrapper class for this library.  The 
+only thing you need besides this code snippet is IJL.H, IJL.LIB, IJL.DLL which can
+be found at the following URL.
+
+
+http://www-cs.intel.com/support/performancetools/libraries/ijl/index.htm
+
+When you see the quantity of code required just to compress or decompress a JPEG image
+using IJL I think you will see the value of the following simplified wrapper layer.
+
+John W. Ratcliff
+jratcliff at verant.com
+*/
+//*** The JPEG.H wrapper layer header file.
+
+#ifndef JPEG_H
+#define JPEG_H
+
+//############################################################################
+//##                                                                        ##
+//##  JPEG.H                                                                ##
+//##                                                                        ##
+//##  Wrapper class to compress or decompress a jpeg from a block of memory ##
+//##  using the Intel Jpeg Library.                                         ##
+//##  OpenSourced 2/4/2000 by John W. Ratcliff                              ##
+//##                                                                        ##
+//##  No warranty expressed or implied.  Released as part of the triangle   ##
+//##  throughput testbed project.                                           ##
+//############################################################################
+//##                                                                        ##
+//##  Contact John W. Ratcliff at jratcliff at verant.com                      ##
+//############################################################################
+
+class Jpeg
+{
+public:
+
+  static bool  ReadFileParams(int &width,
+						int &height,
+						int &nchannels,
+						char *name);
+
+  static bool  ReadFile(int width,
+						int height,
+						int nchannels,
+						char *name,
+						unsigned char *pixbuff);
+
+  static void *ReadImage(int &width,   // width of the image loaded.
+                         int &height,  // height of the image loaded.
+                         int &bpp,     // BYTES (not bits) PER PIXEL.
+                         const void *buffer, // memory address containing jpeg compressed data.
+                         int sizebytes); // size of jpeg compressed data.
+
+
+  static void * Compress(const void *buffer, // address of image in memory
+                         int width, // width of image in pixels
+                         int height, // height of image in pixels.
+                         int bpp, // *BYTES* per pixel of image 1 or 3
+                         int &len, // returns length of compressed data
+                         int quality=75); // image quality as a percentage
+
+  static bool  WriteFile(const void *buffer, // address of image in memory
+                         int width, // width of image in pixels
+                         int height, // height of image in pixels.
+                         int bpp, // *BYTES* per pixel of image 1 or 3
+						 char *name,
+                         int quality=75); // image quality as a percentage
+
+  static bool Compress(const void *source,  // address of image in memory
+					  unsigned char *dest,  // buffer to hold the compressed image
+                      int width, // width of image in pixels
+                      int height, // height of image in pixels
+                      int bpp, // *BYTES* per pixel of image 1 or 3
+                      unsigned long &len, // returns length of compressed data
+                      int quality=75); // image quality as a percentage
+
+  static bool ReadImage(int &width,   // width of the image loaded.
+                         int &height,  // height of the image loaded.
+                         int &bpp,     // BYTES (not bits) PER PIXEL.
+                         const void *buffer, // memory address containing jpeg compressed data.
+                         long sizebytes,   // size of jpeg compressed data.
+   					     unsigned char* dest); // buffer to hold the uncompressed image
+
+};
+
+#endif
+
diff --git a/src/terralib/kernel/lexTemporal.cpp b/src/terralib/kernel/lexTemporal.cpp
new file mode 100644
index 0000000..4791b83
--- /dev/null
+++ b/src/terralib/kernel/lexTemporal.cpp
@@ -0,0 +1,1922 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/* A lexical scanner generated by flex */
+
+/* Scanner skeleton version:
+ * $Header: /home/terralib/src/terralib/kernel/lexTemporal.cpp,v 1.5 2004/11/12 18:32:46 juan Exp $
+ */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 5
+
+#include <stdio.h>
+#include <errno.h>
+
+/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */
+#ifdef c_plusplus
+#ifndef __cplusplus
+#define __cplusplus
+#endif
+#endif
+
+
+#ifdef __cplusplus
+
+#include <stdlib.h>
+#ifndef _WIN32
+#include <unistd.h>
+#endif
+
+/* Use prototypes in function declarations. */
+#define YY_USE_PROTOS
+
+/* The "const" storage-class-modifier is valid. */
+#define YY_USE_CONST
+
+#else	/* ! __cplusplus */
+
+#if __STDC__
+
+#define YY_USE_PROTOS
+#define YY_USE_CONST
+
+#endif	/* __STDC__ */
+#endif	/* ! __cplusplus */
+
+#ifdef __TURBOC__
+ #pragma warn -rch
+ #pragma warn -use
+#include <io.h>
+#include <stdlib.h>
+#define YY_USE_CONST
+#define YY_USE_PROTOS
+#endif
+
+#ifdef YY_USE_CONST
+#define yyconst const
+#else
+#define yyconst
+#endif
+
+
+#ifdef YY_USE_PROTOS
+#define YY_PROTO(proto) proto
+#else
+#define YY_PROTO(proto) ()
+#endif
+
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an unsigned
+ * integer for use as an array index.  If the signed char is negative,
+ * we want to instead treat it as an 8-bit unsigned char, hence the
+ * double cast.
+ */
+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN yy_start = 1 + 2 *
+
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START ((yy_start - 1) / 2)
+#define YYSTATE YY_START
+
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin )
+
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#define YY_BUF_SIZE 16384
+
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+extern int yyleng;
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+
+/* The funky do-while in the following #define is used to turn the definition
+ * int a single C statement (which needs a semi-colon terminator).  This
+ * avoids problems with code like:
+ *
+ * 	if ( condition_holds )
+ *		yyless( 5 );
+ *	else
+ *		do_something_else();
+ *
+ * Prior to using the do-while the compiler would get upset at the
+ * "else" because it interpreted the "if" statement as being all
+ * done when it reached the ';' after the yyless() call.
+ */
+
+/* Return all but the first 'n' matched characters back to the input stream. */
+
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		*yy_cp = yy_hold_char; \
+		YY_RESTORE_YY_MORE_OFFSET \
+		yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \
+		YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+		} \
+	while ( 0 )
+
+#define unput(c) yyunput( c, yytext_ptr )
+
+/* The following is because we cannot portably get our hands on size_t
+ * (without autoconf's help, which isn't available because we want
+ * flex-generated scanners to compile on their own).
+ */
+typedef unsigned int yy_size_t;
+
+
+struct yy_buffer_state
+	{
+	FILE *yy_input_file;
+
+	char *yy_ch_buf;		/* input buffer */
+	char *yy_buf_pos;		/* current position in input buffer */
+
+	/* Size of input buffer in bytes, not including room for EOB
+	 * characters.
+	 */
+	yy_size_t yy_buf_size;
+
+	/* Number of characters read into yy_ch_buf, not including EOB
+	 * characters.
+	 */
+	int yy_n_chars;
+
+	/* Whether we "own" the buffer - i.e., we know we created it,
+	 * and can realloc() it to grow it, and should free() it to
+	 * delete it.
+	 */
+	int yy_is_our_buffer;
+
+	/* Whether this is an "interactive" input source; if so, and
+	 * if we're using stdio for input, then we want to use getc()
+	 * instead of fread(), to make sure we stop fetching input after
+	 * each newline.
+	 */
+	int yy_is_interactive;
+
+	/* Whether we're considered to be at the beginning of a line.
+	 * If so, '^' rules will be active on the next match, otherwise
+	 * not.
+	 */
+	int yy_at_bol;
+
+	/* Whether to try to fill the input buffer when we reach the
+	 * end of it.
+	 */
+	int yy_fill_buffer;
+
+	int yy_buffer_status;
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+	/* When an EOF's been seen but there's still some text to process
+	 * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+	 * shouldn't try reading from the input source any more.  We might
+	 * still have a bunch of tokens to match, though, because of
+	 * possible backing-up.
+	 *
+	 * When we actually see the EOF, we change the status to "new"
+	 * (via yyrestart()), so that the user can continue scanning by
+	 * just pointing yyin at a new input file.
+	 */
+#define YY_BUFFER_EOF_PENDING 2
+	};
+
+static YY_BUFFER_STATE yy_current_buffer = 0;
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ */
+#define YY_CURRENT_BUFFER yy_current_buffer
+
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+
+static int yy_n_chars;		/* number of characters read into yy_ch_buf */
+
+
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = (char *) 0;
+static int yy_init = 1;		/* whether we need to initialize */
+static int yy_start = 0;	/* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart YY_PROTO(( FILE *input_file ));
+
+void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer ));
+void yy_load_buffer_state YY_PROTO(( void ));
+YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size ));
+void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file ));
+void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b ));
+#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer )
+
+YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size ));
+YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str ));
+YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len ));
+
+static void *yy_flex_alloc YY_PROTO(( yy_size_t ));
+static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t ));
+static void yy_flex_free YY_PROTO(( void * ));
+
+#define yy_new_buffer yy_create_buffer
+
+#define yy_set_interactive(is_interactive) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_is_interactive = is_interactive; \
+	}
+
+#define yy_set_bol(at_bol) \
+	{ \
+	if ( ! yy_current_buffer ) \
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \
+	yy_current_buffer->yy_at_bol = at_bol; \
+	}
+
+#define YY_AT_BOL() (yy_current_buffer->yy_at_bol)
+
+
+#define YY_USES_REJECT
+
+#define yywrap() 1
+#define YY_SKIP_YYWRAP
+typedef unsigned char YY_CHAR;
+FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0;
+typedef int yy_state_type;
+extern int yylineno;
+int yylineno = 1;
+extern char *yytext;
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state YY_PROTO(( void ));
+static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state ));
+static int yy_get_next_buffer YY_PROTO(( void ));
+static void yy_fatal_error YY_PROTO(( yyconst char msg[] ));
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+	yytext_ptr = yy_bp; \
+	yyleng = (int) (yy_cp - yy_bp); \
+	yy_hold_char = *yy_cp; \
+	*yy_cp = '\0'; \
+	yy_c_buf_p = yy_cp;
+
+#define YY_NUM_RULES 35
+#define YY_END_OF_BUFFER 36
+static yyconst short int yy_acclist[257] =
+    {   0,
+       36,   34,   35,    1,    2,   34,   35,   33,   35,    2,
+       34,   35,    3,   34,   35,    4,   34,   35,   34,   35,
+       23,   34,   35,   34,   35,   34,   35,   26,   34,   35,
+       34,   35,   34,   35,   34,   35,    1,    3,    4,   31,
+       32,   23,   30,   30,   26,   30,   26,   30,   30,   27,
+       30,   30,   28,   30,   26,   30,   26,   30,   26,   30,
+       29,   30,   30,   30,   30,   30,   30,   30,   30,   26,
+       30,   26,   30,   26,   30,   26,   30,   30,   30,   30,
+       30,   30,   30,   30,   30,   24,   26,   30,   26,   30,
+       26,   30,   26,   30,   26,   30,   16,   30,   30,   30,
+
+       30,   30,   30,   30,   30,   30,   24,   26,   30,   26,
+       30,   26,   30,   26,   30,   26,   30,   26,   30,   30,
+       15,   30,   30,   30,   30,   30,   30,   30,   18,   30,
+       24,   26,   30,   26,   30,   26,   30,   26,   30,   26,
+       30,   26,   30,   30,   30,   17,   30,   30,   30,   30,
+       30,   30,   30,   30,   30,   30,   30,   26,   30,   26,
+       30,   26,   30,   26,   30,   26,   30,   30,   30,   14,
+       30,   21,   30,   13,   30,   30,   30,   30,   30,   30,
+       30,   30,   30,   30,   26,   30,   26,   30,   26,   30,
+       26,   30,   30,   30,   30,   30,   30,   30,   30,   30,
+
+       30,   30,   30,   26,   30,   26,   30,   26,   30,   30,
+       30,   30,   30,   30,   11,   30,   30,   30,   30,   30,
+       30,   25,   25,   26,   30,   26,   30,   19,   30,   20,
+       30,    7,   30,   30,   30,    5,   30,    8,   30,   30,
+       30,   30,   26,   30,    6,   30,    9,   30,   30,   12,
+       30,   22,   30,   30,   10,   30
+    } ;
+
+static yyconst short int yy_accept[189] =
+    {   0,
+        1,    1,    1,    2,    4,    8,   10,   13,   16,   19,
+       21,   24,   26,   28,   31,   33,   35,   37,   38,   39,
+       40,   41,   42,   42,   43,   44,   45,   47,   49,   50,
+       52,   53,   53,   55,   57,   59,   61,   63,   64,   65,
+       66,   67,   68,   69,   70,   70,   72,   74,   76,   78,
+       79,   80,   81,   82,   83,   84,   85,   86,   87,   89,
+       91,   93,   95,   97,   99,  100,  101,  102,  103,  104,
+      105,  106,  107,  107,  108,  110,  112,  114,  116,  118,
+      120,  121,  123,  124,  125,  126,  127,  128,  129,  131,
+      131,  132,  134,  136,  138,  140,  142,  144,  145,  146,
+
+      148,  149,  150,  151,  152,  153,  154,  155,  156,  157,
+      158,  158,  158,  160,  162,  164,  166,  168,  169,  170,
+      172,  174,  176,  177,  178,  179,  180,  181,  182,  183,
+      184,  185,  185,  185,  187,  189,  191,  193,  194,  195,
+      196,  197,  198,  199,  200,  201,  202,  203,  204,  204,
+      204,  206,  208,  210,  211,  212,  213,  214,  215,  217,
+      218,  219,  220,  221,  222,  223,  224,  226,  228,  230,
+      232,  234,  235,  236,  238,  240,  241,  242,  243,  245,
+      247,  249,  250,  252,  254,  255,  257,  257
+    } ;
+
+static yyconst int yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        1,    1,    4,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    1,    1,    1,    1,    1,    1,    5,
+        6,    7,    1,    1,    1,    1,    8,    9,    9,    9,
+        9,    9,    9,    9,    9,    9,    9,   10,    1,    1,
+        1,    1,    1,    1,   11,   12,   13,   14,   15,   16,
+       17,   18,   19,   20,   21,   22,   23,   24,   25,   26,
+       27,   28,   29,   30,   31,   32,   33,   20,   34,   20,
+        1,    1,    1,    1,   35,    1,   20,   20,   20,   20,
+
+       36,   20,   20,   20,   20,   20,   20,   20,   37,   20,
+       20,   20,   20,   20,   38,   20,   20,   20,   20,   20,
+       20,   20,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static yyconst int yy_meta[39] =
+    {   0,
+        1,    1,    2,    1,    1,    1,    1,    1,    3,    1,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
+        3,    3,    3,    3,    3,    3,    3,    3
+    } ;
+
+static yyconst short int yy_base[190] =
+    {   0,
+        0,    0,  242,  581,  239,  581,  581,  234,  232,   32,
+       33,  213,    0,   29,  209,  205,  195,  228,  224,  222,
+      581,  581,  217,   36,    0,  211,   54,   79,  194,    0,
+      103,   40,    0,  124,  149,  185,    0,  211,  195,   31,
+      204,  199,  202,  200,  205,  173,  198,  175,  222,  175,
+      177,  182,  181,   40,  181,  188,  190,  191,  247,  272,
+      161,  296,  160,  172,  167,  163,  163,  163,  165,  174,
+      167,  157,  175,  173,  143,  321,  142,  345,  141,  370,
+      161,    0,  146,  157,  149,  149,  398,  146,    0,   45,
+       50,  132,  131,  414,  130,  439,  128,   28,  150,    0,
+
+      140,  146,  143,  142,  125,   46,  140,  122,  122,  135,
+      141,  140,  110,  108,  464,  107,  489,  129,  128,    0,
+        0,    0,  111,  124,  111,  121,  103,  116,  115,  118,
+       94,   55,   65,   89,   87,  514,   86,  108,  111,  105,
+       94,   99,   86,  103,   82,   83,   82,   94,   98,   97,
+       67,   66,  539,   82,   73,   72,   71,   74,    0,   74,
+       66,   72,   60,   78,   78,   69,   48,   47,    0,    0,
+        0,   69,   65,    0,    0,   70,   51,   48,   33,    0,
+        0,   43,    0,    0,   28,    0,  581,   43,  577
+    } ;
+
+static yyconst short int yy_def[190] =
+    {   0,
+      187,    1,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  188,  188,  188,  188,  188,  188,  187,  187,  187,
+      187,  187,  187,  187,  188,  188,  188,   14,  188,  188,
+      188,  187,  188,  188,   27,   35,  188,  188,  188,  188,
+      188,  188,  188,  188,  187,  188,   34,   47,   47,  188,
+      188,  188,  188,  188,  188,  188,  188,  189,  188,   46,
+       60,   60,   62,  188,  188,  188,  188,  188,  188,  188,
+      188,  188,  187,  189,   59,   59,   76,   76,   78,   78,
+      188,  188,  188,  188,  188,  188,  188,  188,  188,  187,
+      189,   76,   76,   76,   94,   94,   96,  188,  188,  188,
+
+      188,  188,  188,  188,  188,  188,  188,  188,  188,  188,
+      187,  187,   94,   94,   94,  115,  115,  188,  188,  188,
+      188,  188,  188,  188,  188,  188,  188,  188,  188,  188,
+      188,  187,  187,  115,  115,  115,  136,  188,  188,  188,
+      188,  188,  188,  188,  188,  188,  188,  188,  187,  187,
+      136,  136,  136,  188,  188,  188,  188,  188,  188,  188,
+      188,  188,  188,  188,  187,  187,  153,  153,  188,  188,
+      188,  188,  188,  188,  188,  188,  188,  188,  188,  188,
+      188,  188,  188,  188,  188,  188,    0,  187,  187
+    } ;
+
+static yyconst short int yy_nxt[620] =
+    {   0,
+        4,    5,    6,    7,    8,    9,    4,   10,   11,    4,
+       12,   13,   13,   14,   13,   13,   13,   14,   13,   13,
+       13,   13,   14,   15,   16,   13,   13,   13,   14,   17,
+       13,   13,   13,   14,    4,   13,   14,   13,   21,   22,
+       23,   24,   27,   23,   24,   25,   27,   45,   32,   52,
+       68,   27,   69,   90,  111,   53,  186,   27,   91,  112,
+      118,  119,   27,  132,  149,   27,   28,   34,  185,  126,
+      179,   34,  127,  133,  150,  184,   34,  166,  149,  183,
+      182,  181,   34,  180,  179,  167,  165,   34,  178,  177,
+       34,   35,   36,  176,  175,  174,   36,  173,  172,  171,
+
+      170,   36,  169,  167,  151,  166,  165,   36,  164,  163,
+      162,  161,   36,  160,  159,   36,   38,  158,  157,  156,
+       39,  155,  154,  153,  151,   40,  134,  148,  147,  146,
+      145,   41,   42,  144,  143,   43,   44,   46,  142,  141,
+      140,   46,  139,  138,  136,  134,   46,  113,  133,  132,
+      131,  130,   46,  129,  128,  125,  124,   46,  123,  122,
+       46,   47,   48,  121,  120,  117,   48,  115,  113,   92,
+      110,   48,  102,  101,  100,   99,   98,   48,   96,   94,
+       92,   91,   48,   90,   89,   48,   59,   88,   87,   86,
+       59,   85,   84,   83,   82,   59,   81,   80,   78,   74,
+
+       72,   59,   71,   70,   67,   66,   59,   65,   64,   59,
+       60,   61,   62,   58,   57,   61,   56,   55,   54,   51,
+       61,   50,   49,   37,   33,   32,   61,   20,   19,   18,
+       31,   61,   30,   29,   61,   63,   26,   20,   19,   63,
+       18,  187,  187,  187,   63,  187,  187,  187,  187,  187,
+       63,  187,  187,  187,  187,   63,  187,  187,   63,   49,
+       75,  187,  187,  187,   75,  187,  187,  187,  187,   75,
+      187,  187,  187,  187,  187,   75,  187,  187,  187,  187,
+       75,  187,  187,   75,   76,   77,  187,  187,  187,   77,
+      187,  187,  187,  187,   77,  187,  187,  187,  187,  187,
+
+       77,  187,  187,  187,  187,   77,  187,  187,   77,   79,
+      187,  187,  187,   79,  187,  187,  187,  187,   79,  187,
+      187,  187,  187,  187,   79,  187,  187,  187,  187,   79,
+      187,  187,   79,   62,   93,  187,  187,  187,   93,  187,
+      187,  187,  187,   93,  187,  187,  187,  187,  187,   93,
+      187,  187,  187,  187,   93,  187,  187,   93,   95,  187,
+      187,  187,   95,  187,  187,  187,  187,   95,  187,  187,
+      187,  187,  187,   95,  187,  187,  187,  187,   95,  187,
+      187,   95,   78,   97,  187,  187,  187,   97,  187,  187,
+      187,  187,   97,  187,  187,  187,  187,  187,   97,  187,
+
+      187,  187,  187,   97,  187,  187,   97,   80,  103,  104,
+      187,  105,  106,  187,  187,  187,  187,  187,  187,  187,
+      107,  187,  108,  187,  187,  187,  109,  114,  187,  187,
+      187,  114,  187,  187,  187,  187,  114,  187,  187,  187,
+      187,  187,  114,  187,  187,  187,  187,  114,  187,  187,
+      114,   94,  116,  187,  187,  187,  116,  187,  187,  187,
+      187,  116,  187,  187,  187,  187,  187,  116,  187,  187,
+      187,  187,  116,  187,  187,  116,   96,  135,  187,  187,
+      187,  135,  187,  187,  187,  187,  135,  187,  187,  187,
+      187,  187,  135,  187,  187,  187,  187,  135,  187,  187,
+
+      135,  115,  137,  187,  187,  187,  137,  187,  187,  187,
+      187,  137,  187,  187,  187,  187,  187,  137,  187,  187,
+      187,  187,  137,  187,  187,  137,  117,  152,  187,  187,
+      187,  152,  187,  187,  187,  187,  152,  187,  187,  187,
+      187,  187,  152,  187,  187,  187,  187,  152,  187,  187,
+      152,  136,  168,  187,  187,  187,  168,  187,  187,  187,
+      187,  168,  187,  187,  187,  187,  187,  168,  187,  187,
+      187,  187,  168,  187,  187,  168,  153,   73,  187,   73,
+        3,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187
+    } ;
+
+static yyconst short int yy_chk[620] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,   10,   10,
+       11,   11,   14,   24,   24,  188,   14,   32,   32,   40,
+       54,   14,   54,   90,   90,   40,  185,   14,   91,   91,
+       98,   98,   14,  132,  132,   14,   14,   27,  182,  106,
+      179,   27,  106,  133,  133,  178,   27,  166,  166,  177,
+      176,  173,   27,  172,  168,  167,  165,   27,  164,  163,
+       27,   27,   28,  162,  161,  160,   28,  158,  157,  156,
+
+      155,   28,  154,  152,  151,  150,  149,   28,  148,  147,
+      146,  145,   28,  144,  143,   28,   31,  142,  141,  140,
+       31,  139,  138,  137,  135,   31,  134,  131,  130,  129,
+      128,   31,   31,  127,  126,   31,   31,   34,  125,  124,
+      123,   34,  119,  118,  116,  114,   34,  113,  112,  111,
+      110,  109,   34,  108,  107,  105,  104,   34,  103,  102,
+       34,   34,   35,  101,   99,   97,   35,   95,   93,   92,
+       88,   35,   86,   85,   84,   83,   81,   35,   79,   77,
+       75,   74,   35,   73,   72,   35,   46,   71,   70,   69,
+       46,   68,   67,   66,   65,   46,   64,   63,   61,   58,
+
+       57,   46,   56,   55,   53,   52,   46,   51,   50,   46,
+       46,   47,   48,   45,   44,   47,   43,   42,   41,   39,
+       47,   38,   36,   29,   26,   23,   47,   20,   19,   18,
+       17,   47,   16,   15,   47,   49,   12,    9,    8,   49,
+        5,    3,    0,    0,   49,    0,    0,    0,    0,    0,
+       49,    0,    0,    0,    0,   49,    0,    0,   49,   49,
+       59,    0,    0,    0,   59,    0,    0,    0,    0,   59,
+        0,    0,    0,    0,    0,   59,    0,    0,    0,    0,
+       59,    0,    0,   59,   59,   60,    0,    0,    0,   60,
+        0,    0,    0,    0,   60,    0,    0,    0,    0,    0,
+
+       60,    0,    0,    0,    0,   60,    0,    0,   60,   62,
+        0,    0,    0,   62,    0,    0,    0,    0,   62,    0,
+        0,    0,    0,    0,   62,    0,    0,    0,    0,   62,
+        0,    0,   62,   62,   76,    0,    0,    0,   76,    0,
+        0,    0,    0,   76,    0,    0,    0,    0,    0,   76,
+        0,    0,    0,    0,   76,    0,    0,   76,   78,    0,
+        0,    0,   78,    0,    0,    0,    0,   78,    0,    0,
+        0,    0,    0,   78,    0,    0,    0,    0,   78,    0,
+        0,   78,   78,   80,    0,    0,    0,   80,    0,    0,
+        0,    0,   80,    0,    0,    0,    0,    0,   80,    0,
+
+        0,    0,    0,   80,    0,    0,   80,   80,   87,   87,
+        0,   87,   87,    0,    0,    0,    0,    0,    0,    0,
+       87,    0,   87,    0,    0,    0,   87,   94,    0,    0,
+        0,   94,    0,    0,    0,    0,   94,    0,    0,    0,
+        0,    0,   94,    0,    0,    0,    0,   94,    0,    0,
+       94,   94,   96,    0,    0,    0,   96,    0,    0,    0,
+        0,   96,    0,    0,    0,    0,    0,   96,    0,    0,
+        0,    0,   96,    0,    0,   96,   96,  115,    0,    0,
+        0,  115,    0,    0,    0,    0,  115,    0,    0,    0,
+        0,    0,  115,    0,    0,    0,    0,  115,    0,    0,
+
+      115,  115,  117,    0,    0,    0,  117,    0,    0,    0,
+        0,  117,    0,    0,    0,    0,    0,  117,    0,    0,
+        0,    0,  117,    0,    0,  117,  117,  136,    0,    0,
+        0,  136,    0,    0,    0,    0,  136,    0,    0,    0,
+        0,    0,  136,    0,    0,    0,    0,  136,    0,    0,
+      136,  136,  153,    0,    0,    0,  153,    0,    0,    0,
+        0,  153,    0,    0,    0,    0,    0,  153,    0,    0,
+        0,    0,  153,    0,    0,  153,  153,  189,    0,  189,
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+
+      187,  187,  187,  187,  187,  187,  187,  187,  187,  187,
+      187,  187,  187,  187,  187,  187,  187,  187,  187
+    } ;
+
+static yy_state_type yy_state_buf[YY_BUF_SIZE + 2], *yy_state_ptr;
+static char *yy_full_match;
+static int yy_lp;
+#define REJECT \
+{ \
+*yy_cp = yy_hold_char; /* undo effects of setting up yytext */ \
+yy_cp = yy_full_match; /* restore poss. backed-over text */ \
+++yy_lp; \
+goto find_rule; \
+}
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#define INITIAL 0
+/*
+* Lex
+*/
+#include <string.h>
+#include <yyTemporal.h>
+
+extern const char *myinputptr;	/* current position in myinput */
+extern int myinputlim;		/* end of data */
+
+int   lineno;
+char lexOut[1000];
+char sqlOutLex[1000];
+
+#undef YY_INPUT
+extern int my_yyinput(char* buf, int max_size);
+#define YY_INPUT(buffer, result, size) (result=my_yyinput(buffer,size))
+
+void initLexOut()
+{
+	for(int i=0; i<1000; ++i)
+	{
+		lexOut[i] = '\0';
+		sqlOutLex[i] = '\0';
+	}
+	return;
+}
+
+int my_yyinput(char* buf, int max_size)
+{
+	int n = max_size;
+	int s = myinputlim - (int)myinputptr;
+	if(max_size>s)
+		n = s;
+		
+	//int n = min(max_size, myinputlim - (int)myinputptr);
+	if(n>0)
+	{
+		initLexOut(); 
+		memcpy(buf, myinputptr, n);		
+		myinputptr += n;
+	}	
+	return n;
+}
+
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap YY_PROTO(( void ));
+#else
+extern int yywrap YY_PROTO(( void ));
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+static void yyunput YY_PROTO(( int c, char *buf_ptr ));
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int ));
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen YY_PROTO(( yyconst char * ));
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput YY_PROTO(( void ));
+#else
+static int input YY_PROTO(( void ));
+#endif
+#endif
+
+#if YY_STACK_USED
+static int yy_start_stack_ptr = 0;
+static int yy_start_stack_depth = 0;
+static int *yy_start_stack = 0;
+#ifndef YY_NO_PUSH_STATE
+static void yy_push_state YY_PROTO(( int new_state ));
+#endif
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state YY_PROTO(( void ));
+#endif
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state YY_PROTO(( void ));
+#endif
+
+#else
+#define YY_NO_PUSH_STATE 1
+#define YY_NO_POP_STATE 1
+#define YY_NO_TOP_STATE 1
+#endif
+
+#ifdef YY_MALLOC_DECL
+YY_MALLOC_DECL
+#else
+#if __STDC__
+#ifndef __cplusplus
+#include <stdlib.h>
+#endif
+#else
+/* Just try to get by without declaring the routines.  This will fail
+ * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int)
+ * or sizeof(void*) != sizeof(int).
+ */
+#endif
+#endif
+
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#define YY_READ_BUF_SIZE 8192
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+	if ( yy_current_buffer->yy_is_interactive ) \
+		{ \
+		int c = '*', n; \
+		for ( n = 0; n < max_size && \
+			     (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+			buf[n] = (char) c; \
+		if ( c == '\n' ) \
+			buf[n++] = (char) c; \
+		if ( c == EOF && ferror( yyin ) ) \
+			YY_FATAL_ERROR( "input in flex scanner failed" ); \
+		result = n; \
+		} \
+	else \
+		{ \
+		errno=0; \
+		while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
+			{ \
+			if( errno != EINTR) \
+				{ \
+				YY_FATAL_ERROR( "input in flex scanner failed" ); \
+				break; \
+				} \
+			errno=0; \
+			clearerr(yyin); \
+			} \
+		}
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL int yylex YY_PROTO(( void ))
+#endif
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK break;
+#endif
+
+#define YY_RULE_SETUP \
+	YY_USER_ACTION
+
+YY_DECL
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp, *yy_bp;
+	register int yy_act;
+
+
+
+
+	if ( yy_init )
+		{
+		yy_init = 0;
+
+#ifdef YY_USER_INIT
+		YY_USER_INIT;
+#endif
+
+		if ( ! yy_start )
+			yy_start = 1;	/* first start state */
+
+		if ( ! yyin )
+			yyin = stdin;
+
+		if ( ! yyout )
+			yyout = stdout;
+
+		if ( ! yy_current_buffer )
+			yy_current_buffer =
+				yy_create_buffer( yyin, YY_BUF_SIZE );
+
+		yy_load_buffer_state();
+		}
+
+	while ( 1 )		/* loops until end-of-file is reached */
+		{
+		yy_cp = yy_c_buf_p;
+
+		/* Support of yytext. */
+		*yy_cp = yy_hold_char;
+
+		/* yy_bp points to the position in yy_ch_buf of the start of
+		 * the current run.
+		 */
+		yy_bp = yy_cp;
+
+		yy_current_state = yy_start;
+		yy_state_ptr = yy_state_buf;
+		*yy_state_ptr++ = yy_current_state;
+yy_match:
+		do
+			{
+			register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+			while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+				{
+				yy_current_state = (int) yy_def[yy_current_state];
+				if ( yy_current_state >= 188 )
+					yy_c = yy_meta[(unsigned int) yy_c];
+				}
+			yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+			*yy_state_ptr++ = yy_current_state;
+			++yy_cp;
+			}
+		while ( yy_base[yy_current_state] != 581 );
+
+yy_find_action:
+		yy_current_state = *--yy_state_ptr;
+		yy_lp = yy_accept[yy_current_state];
+/* find_rule:  we branch to this label when backing up */
+		for ( ; ; ) /* until we find what rule we matched */
+			{
+			if ( yy_lp && yy_lp < yy_accept[yy_current_state + 1] )
+				{
+				yy_act = yy_acclist[yy_lp];
+					{
+					yy_full_match = yy_cp;
+					break;
+					}
+				}
+			--yy_cp;
+			yy_current_state = *--yy_state_ptr;
+			yy_lp = yy_accept[yy_current_state];
+			}
+
+		YY_DO_BEFORE_ACTION;
+
+		if ( yy_act != YY_END_OF_BUFFER )
+			{
+			int yyl;
+			for ( yyl = 0; yyl < yyleng; ++yyl )
+				if ( yytext[yyl] == '\n' )
+					++yylineno;
+			}
+
+do_action:	/* This label is used only to access EOF actions. */
+
+
+		switch ( yy_act )
+	{ /* beginning of action switch */
+case 1:
+YY_RULE_SETUP
+{ ; } 
+	YY_BREAK
+case 2:
+YY_RULE_SETUP
+{ ; }
+	YY_BREAK
+case 3:
+YY_RULE_SETUP
+{	strncat(sqlOutLex, yytext, strlen(yytext)); };
+	YY_BREAK
+case 4:
+YY_RULE_SETUP
+{  strncat(sqlOutLex, yytext, strlen(yytext)); };
+	YY_BREAK
+case 5:
+case 6:
+case 7:
+case 8:
+case 9:
+case 10:
+case 11:
+case 12:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext));
+		strncat(lexOut, ";", 1); 
+		return TEMPORALRELATION; }
+	YY_BREAK
+case 13:
+case 14:
+case 15:
+case 16:
+case 17:
+case 18:
+case 19:
+case 20:
+case 21:
+case 22:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); 
+		  return CHRONON; }
+	YY_BREAK
+case 23:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NUMBER;}
+	YY_BREAK
+case 24:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NUMBER;  }
+	YY_BREAK
+case 25:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NUMBER; }
+	YY_BREAK
+case 26:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return MASK;}
+	YY_BREAK
+case 27:
+YY_RULE_SETUP
+{strncat(sqlOutLex, yytext, strlen(yytext)); return OR;} 
+	YY_BREAK
+case 28:
+YY_RULE_SETUP
+{strncat(sqlOutLex, yytext, strlen(yytext)); return AND;}
+	YY_BREAK
+case 29:
+YY_RULE_SETUP
+{strncat(sqlOutLex, yytext, strlen(yytext)); return NOT;}
+	YY_BREAK
+case 30:
+YY_RULE_SETUP
+{ strncat(lexOut, yytext, strlen(yytext)); strncat(lexOut, ";", 1); return NAME; }
+	YY_BREAK
+case 31:
+YY_RULE_SETUP
+{
+		int	yyinput();
+		unsigned char c1=0,c2=yyinput();
+		while (1)
+		{
+			if ((char)c2==EOF) break;
+			if ((c1=='*') && (c2=='/')) break;
+			if (c2=='\n') {lineno++;}
+			c1=c2;
+			c2=yyinput();
+		}
+	}
+	YY_BREAK
+case 32:
+YY_RULE_SETUP
+{
+		int	yyinput();
+		unsigned char c1=yyinput();
+		while (1)
+		{
+			if (c1=='\n') {lineno++;break;}
+			c1=yyinput();
+		}
+	}
+	YY_BREAK
+case 33:
+YY_RULE_SETUP
+{ lineno++; }
+	YY_BREAK
+case 34:
+YY_RULE_SETUP
+{ return yytext[0]; }
+	YY_BREAK
+case YY_STATE_EOF(INITIAL):
+{ return 0; }
+	YY_BREAK
+case 35:
+YY_RULE_SETUP
+ECHO;
+	YY_BREAK
+
+	case YY_END_OF_BUFFER:
+		{
+		/* Amount of text matched not including the EOB char. */
+		int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1;
+
+		/* Undo the effects of YY_DO_BEFORE_ACTION. */
+		*yy_cp = yy_hold_char;
+		YY_RESTORE_YY_MORE_OFFSET
+
+		if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW )
+			{
+			/* We're scanning a new file or input source.  It's
+			 * possible that this happened because the user
+			 * just pointed yyin at a new source and called
+			 * yylex().  If so, then we have to assure
+			 * consistency between yy_current_buffer and our
+			 * globals.  Here is the right place to do so, because
+			 * this is the first action (other than possibly a
+			 * back-up) that will match for the new input source.
+			 */
+			yy_n_chars = yy_current_buffer->yy_n_chars;
+			yy_current_buffer->yy_input_file = yyin;
+			yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL;
+			}
+
+		/* Note that here we test for yy_c_buf_p "<=" to the position
+		 * of the first EOB in the buffer, since yy_c_buf_p will
+		 * already have been incremented past the NUL character
+		 * (since all states make transitions on EOB to the
+		 * end-of-buffer state).  Contrast this with the test
+		 * in input().
+		 */
+		if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			{ /* This was really a NUL. */
+			yy_state_type yy_next_state;
+
+			yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text;
+
+			yy_current_state = yy_get_previous_state();
+
+			/* Okay, we're now positioned to make the NUL
+			 * transition.  We couldn't have
+			 * yy_get_previous_state() go ahead and do it
+			 * for us because it doesn't know how to deal
+			 * with the possibility of jamming (and we don't
+			 * want to build jamming into it because then it
+			 * will run more slowly).
+			 */
+
+			yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+			yy_bp = yytext_ptr + YY_MORE_ADJ;
+
+			if ( yy_next_state )
+				{
+				/* Consume the NUL. */
+				yy_cp = ++yy_c_buf_p;
+				yy_current_state = yy_next_state;
+				goto yy_match;
+				}
+
+			else
+				{
+				yy_cp = yy_c_buf_p;
+				goto yy_find_action;
+				}
+			}
+
+		else switch ( yy_get_next_buffer() )
+			{
+			case EOB_ACT_END_OF_FILE:
+				{
+				yy_did_buffer_switch_on_eof = 0;
+
+				if ( yywrap() )
+					{
+					/* Note: because we've taken care in
+					 * yy_get_next_buffer() to have set up
+					 * yytext, we can now set up
+					 * yy_c_buf_p so that if some total
+					 * hoser (like flex itself) wants to
+					 * call the scanner after we return the
+					 * YY_NULL, it'll still work - another
+					 * YY_NULL will get returned.
+					 */
+					yy_c_buf_p = yytext_ptr + YY_MORE_ADJ;
+
+					yy_act = YY_STATE_EOF(YY_START);
+					goto do_action;
+					}
+
+				else
+					{
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+					}
+				break;
+				}
+
+			case EOB_ACT_CONTINUE_SCAN:
+				yy_c_buf_p =
+					yytext_ptr + yy_amount_of_matched_text;
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_match;
+
+			case EOB_ACT_LAST_MATCH:
+				yy_c_buf_p =
+				&yy_current_buffer->yy_ch_buf[yy_n_chars];
+
+				yy_current_state = yy_get_previous_state();
+
+				yy_cp = yy_c_buf_p;
+				yy_bp = yytext_ptr + YY_MORE_ADJ;
+				goto yy_find_action;
+			}
+		break;
+		}
+
+	default:
+		YY_FATAL_ERROR(
+			"fatal flex scanner internal error--no action found" );
+	} /* end of action switch */
+		} /* end of scanning one token */
+	} /* end of yylex */
+
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *	EOB_ACT_LAST_MATCH -
+ *	EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *	EOB_ACT_END_OF_FILE - end of file
+ */
+
+static int yy_get_next_buffer()
+	{
+	register char *dest = yy_current_buffer->yy_ch_buf;
+	register char *source = yytext_ptr;
+	register int number_to_move, i;
+	int ret_val;
+
+	if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] )
+		YY_FATAL_ERROR(
+		"fatal flex scanner internal error--end of buffer missed" );
+
+	if ( yy_current_buffer->yy_fill_buffer == 0 )
+		{ /* Don't try to fill the buffer, so this is an EOF. */
+		if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 )
+			{
+			/* We matched a single character, the EOB, so
+			 * treat this as a final EOF.
+			 */
+			return EOB_ACT_END_OF_FILE;
+			}
+
+		else
+			{
+			/* We matched some text prior to the EOB, first
+			 * process it.
+			 */
+			return EOB_ACT_LAST_MATCH;
+			}
+		}
+
+	/* Try to read more data. */
+
+	/* First move last chars to start of buffer. */
+	number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1;
+
+	for ( i = 0; i < number_to_move; ++i )
+		*(dest++) = *(source++);
+
+	if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+		/* don't do the read, it's not guaranteed to return an EOF,
+		 * just force an EOF
+		 */
+		yy_current_buffer->yy_n_chars = yy_n_chars = 0;
+
+	else
+		{
+		int num_to_read =
+			yy_current_buffer->yy_buf_size - number_to_move - 1;
+
+		while ( num_to_read <= 0 )
+			{ /* Not enough room in the buffer - grow it. */
+#ifdef YY_USES_REJECT
+			YY_FATAL_ERROR(
+"input buffer overflow, can't enlarge buffer because scanner uses REJECT" );
+#else
+
+			/* just a shorter name for the current buffer */
+			YY_BUFFER_STATE b = yy_current_buffer;
+
+			int yy_c_buf_p_offset =
+				(int) (yy_c_buf_p - b->yy_ch_buf);
+
+			if ( b->yy_is_our_buffer )
+				{
+				int new_size = b->yy_buf_size * 2;
+
+				if ( new_size <= 0 )
+					b->yy_buf_size += b->yy_buf_size / 8;
+				else
+					b->yy_buf_size *= 2;
+
+				b->yy_ch_buf = (char *)
+					/* Include room in for 2 EOB chars. */
+					yy_flex_realloc( (void *) b->yy_ch_buf,
+							 b->yy_buf_size + 2 );
+				}
+			else
+				/* Can't grow it, we don't own it. */
+				b->yy_ch_buf = 0;
+
+			if ( ! b->yy_ch_buf )
+				YY_FATAL_ERROR(
+				"fatal error - scanner input buffer overflow" );
+
+			yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+			num_to_read = yy_current_buffer->yy_buf_size -
+						number_to_move - 1;
+#endif
+			}
+
+		if ( num_to_read > YY_READ_BUF_SIZE )
+			num_to_read = YY_READ_BUF_SIZE;
+
+		/* Read in more data. */
+		YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]),
+			yy_n_chars, num_to_read );
+
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	if ( yy_n_chars == 0 )
+		{
+		if ( number_to_move == YY_MORE_ADJ )
+			{
+			ret_val = EOB_ACT_END_OF_FILE;
+			yyrestart( yyin );
+			}
+
+		else
+			{
+			ret_val = EOB_ACT_LAST_MATCH;
+			yy_current_buffer->yy_buffer_status =
+				YY_BUFFER_EOF_PENDING;
+			}
+		}
+
+	else
+		ret_val = EOB_ACT_CONTINUE_SCAN;
+
+	yy_n_chars += number_to_move;
+	yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR;
+	yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;
+
+	yytext_ptr = &yy_current_buffer->yy_ch_buf[0];
+
+	return ret_val;
+	}
+
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+static yy_state_type yy_get_previous_state()
+	{
+	register yy_state_type yy_current_state;
+	register char *yy_cp;
+
+	yy_current_state = yy_start;
+	yy_state_ptr = yy_state_buf;
+	*yy_state_ptr++ = yy_current_state;
+
+	for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp )
+		{
+		register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+		while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+			{
+			yy_current_state = (int) yy_def[yy_current_state];
+			if ( yy_current_state >= 188 )
+				yy_c = yy_meta[(unsigned int) yy_c];
+			}
+		yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+		*yy_state_ptr++ = yy_current_state;
+		}
+
+	return yy_current_state;
+	}
+
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *	next_state = yy_try_NUL_trans( current_state );
+ */
+
+#ifdef YY_USE_PROTOS
+static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state )
+#else
+static yy_state_type yy_try_NUL_trans( yy_current_state )
+yy_state_type yy_current_state;
+#endif
+	{
+	register int yy_is_jam;
+
+	register YY_CHAR yy_c = 1;
+	while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+		{
+		yy_current_state = (int) yy_def[yy_current_state];
+		if ( yy_current_state >= 188 )
+			yy_c = yy_meta[(unsigned int) yy_c];
+		}
+	yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
+	yy_is_jam = (yy_current_state == 187);
+	if ( ! yy_is_jam )
+		*yy_state_ptr++ = yy_current_state;
+
+	return yy_is_jam ? 0 : yy_current_state;
+	}
+
+
+#ifndef YY_NO_UNPUT
+#ifdef YY_USE_PROTOS
+static void yyunput( int c, register char *yy_bp )
+#else
+static void yyunput( c, yy_bp )
+int c;
+register char *yy_bp;
+#endif
+	{
+	register char *yy_cp = yy_c_buf_p;
+
+	/* undo effects of setting up yytext */
+	*yy_cp = yy_hold_char;
+
+	if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+		{ /* need to shift things up to make room */
+		/* +2 for EOB chars. */
+		register int number_to_move = yy_n_chars + 2;
+		register char *dest = &yy_current_buffer->yy_ch_buf[
+					yy_current_buffer->yy_buf_size + 2];
+		register char *source =
+				&yy_current_buffer->yy_ch_buf[number_to_move];
+
+		while ( source > yy_current_buffer->yy_ch_buf )
+			*--dest = *--source;
+
+		yy_cp += (int) (dest - source);
+		yy_bp += (int) (dest - source);
+		yy_current_buffer->yy_n_chars =
+			yy_n_chars = yy_current_buffer->yy_buf_size;
+
+		if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 )
+			YY_FATAL_ERROR( "flex scanner push-back overflow" );
+		}
+
+	*--yy_cp = (char) c;
+
+	if ( c == '\n' )
+		--yylineno;
+
+	yytext_ptr = yy_bp;
+	yy_hold_char = *yy_cp;
+	yy_c_buf_p = yy_cp;
+	}
+#endif	/* ifndef YY_NO_UNPUT */
+
+
+#ifdef __cplusplus
+static int yyinput()
+#else
+static int input()
+#endif
+	{
+	int c;
+
+	*yy_c_buf_p = yy_hold_char;
+
+	if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
+		{
+		/* yy_c_buf_p now points to the character we want to return.
+		 * If this occurs *before* the EOB characters, then it's a
+		 * valid NUL; if not, then we've hit the end of the buffer.
+		 */
+		if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] )
+			/* This was really a NUL. */
+			*yy_c_buf_p = '\0';
+
+		else
+			{ /* need more input */
+			int offset = yy_c_buf_p - yytext_ptr;
+			++yy_c_buf_p;
+
+			switch ( yy_get_next_buffer() )
+				{
+				case EOB_ACT_LAST_MATCH:
+					/* This happens because yy_g_n_b()
+					 * sees that we've accumulated a
+					 * token and flags that we need to
+					 * try matching the token before
+					 * proceeding.  But for input(),
+					 * there's no matching to consider.
+					 * So convert the EOB_ACT_LAST_MATCH
+					 * to EOB_ACT_END_OF_FILE.
+					 */
+
+					/* Reset buffer status. */
+					yyrestart( yyin );
+
+					/* fall through */
+
+				case EOB_ACT_END_OF_FILE:
+					{
+					if ( yywrap() )
+						return EOF;
+
+					if ( ! yy_did_buffer_switch_on_eof )
+						YY_NEW_FILE;
+#ifdef __cplusplus
+					return yyinput();
+#else
+					return input();
+#endif
+					}
+
+				case EOB_ACT_CONTINUE_SCAN:
+					yy_c_buf_p = yytext_ptr + offset;
+					break;
+				}
+			}
+		}
+
+	c = *(unsigned char *) yy_c_buf_p;	/* cast for 8-bit char's */
+	*yy_c_buf_p = '\0';	/* preserve yytext */
+	yy_hold_char = *++yy_c_buf_p;
+
+	if ( c == '\n' )
+		++yylineno;
+
+	return c;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yyrestart( FILE *input_file )
+#else
+void yyrestart( input_file )
+FILE *input_file;
+#endif
+	{
+	if ( ! yy_current_buffer )
+		yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE );
+
+	yy_init_buffer( yy_current_buffer, input_file );
+	yy_load_buffer_state();
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer )
+#else
+void yy_switch_to_buffer( new_buffer )
+YY_BUFFER_STATE new_buffer;
+#endif
+	{
+	if ( yy_current_buffer == new_buffer )
+		return;
+
+	if ( yy_current_buffer )
+		{
+		/* Flush out information for old buffer. */
+		*yy_c_buf_p = yy_hold_char;
+		yy_current_buffer->yy_buf_pos = yy_c_buf_p;
+		yy_current_buffer->yy_n_chars = yy_n_chars;
+		}
+
+	yy_current_buffer = new_buffer;
+	yy_load_buffer_state();
+
+	/* We don't actually know whether we did this switch during
+	 * EOF (yywrap()) processing, but the only time this flag
+	 * is looked at is after yywrap() is called, so it's safe
+	 * to go ahead and always set it.
+	 */
+	yy_did_buffer_switch_on_eof = 1;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_load_buffer_state( void )
+#else
+void yy_load_buffer_state()
+#endif
+	{
+	yy_n_chars = yy_current_buffer->yy_n_chars;
+	yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos;
+	yyin = yy_current_buffer->yy_input_file;
+	yy_hold_char = *yy_c_buf_p;
+	}
+
+
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
+#else
+YY_BUFFER_STATE yy_create_buffer( file, size )
+FILE *file;
+int size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_buf_size = size;
+
+	/* yy_ch_buf has to be 2 characters longer than the size given because
+	 * we need to put in 2 end-of-buffer characters.
+	 */
+	b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 );
+	if ( ! b->yy_ch_buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+	b->yy_is_our_buffer = 1;
+
+	yy_init_buffer( b, file );
+
+	return b;
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_delete_buffer( YY_BUFFER_STATE b )
+#else
+void yy_delete_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+	{
+	if ( ! b )
+		return;
+
+	if ( b == yy_current_buffer )
+		yy_current_buffer = (YY_BUFFER_STATE) 0;
+
+	if ( b->yy_is_our_buffer )
+		yy_flex_free( (void *) b->yy_ch_buf );
+
+	yy_flex_free( (void *) b );
+	}
+
+
+#ifndef _WIN32
+#include <unistd.h>
+#else
+#ifndef YY_ALWAYS_INTERACTIVE
+#ifndef YY_NEVER_INTERACTIVE
+//extern int isatty YY_PROTO(( int ));
+#endif
+#endif
+#endif
+
+#ifdef YY_USE_PROTOS
+void yy_init_buffer( YY_BUFFER_STATE b, FILE *file )
+#else
+void yy_init_buffer( b, file )
+YY_BUFFER_STATE b;
+FILE *file;
+#endif
+
+
+	{
+	yy_flush_buffer( b );
+
+	b->yy_input_file = file;
+	b->yy_fill_buffer = 1;
+
+#if YY_ALWAYS_INTERACTIVE
+	b->yy_is_interactive = 1;
+#else
+#if YY_NEVER_INTERACTIVE
+	b->yy_is_interactive = 0;
+#else
+//	b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+#endif
+#endif
+	}
+
+
+#ifdef YY_USE_PROTOS
+void yy_flush_buffer( YY_BUFFER_STATE b )
+#else
+void yy_flush_buffer( b )
+YY_BUFFER_STATE b;
+#endif
+
+	{
+	if ( ! b )
+		return;
+
+	b->yy_n_chars = 0;
+
+	/* We always need two end-of-buffer characters.  The first causes
+	 * a transition to the end-of-buffer state.  The second causes
+	 * a jam in that state.
+	 */
+	b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+	b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+	b->yy_buf_pos = &b->yy_ch_buf[0];
+
+	b->yy_at_bol = 1;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	if ( b == yy_current_buffer )
+		yy_load_buffer_state();
+	}
+
+
+#ifndef YY_NO_SCAN_BUFFER
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size )
+#else
+YY_BUFFER_STATE yy_scan_buffer( base, size )
+char *base;
+yy_size_t size;
+#endif
+	{
+	YY_BUFFER_STATE b;
+
+	if ( size < 2 ||
+	     base[size-2] != YY_END_OF_BUFFER_CHAR ||
+	     base[size-1] != YY_END_OF_BUFFER_CHAR )
+		/* They forgot to leave room for the EOB's. */
+		return 0;
+
+	b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
+	if ( ! b )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+	b->yy_buf_size = size - 2;	/* "- 2" to take care of EOB's */
+	b->yy_buf_pos = b->yy_ch_buf = base;
+	b->yy_is_our_buffer = 0;
+	b->yy_input_file = 0;
+	b->yy_n_chars = b->yy_buf_size;
+	b->yy_is_interactive = 0;
+	b->yy_at_bol = 1;
+	b->yy_fill_buffer = 0;
+	b->yy_buffer_status = YY_BUFFER_NEW;
+
+	yy_switch_to_buffer( b );
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_STRING
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str )
+#else
+YY_BUFFER_STATE yy_scan_string( yy_str )
+yyconst char *yy_str;
+#endif
+	{
+	int len;
+	for ( len = 0; yy_str[len]; ++len )
+		;
+
+	return yy_scan_bytes( yy_str, len );
+	}
+#endif
+
+
+#ifndef YY_NO_SCAN_BYTES
+#ifdef YY_USE_PROTOS
+YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len )
+#else
+YY_BUFFER_STATE yy_scan_bytes( bytes, len )
+yyconst char *bytes;
+int len;
+#endif
+	{
+	YY_BUFFER_STATE b;
+	char *buf;
+	yy_size_t n;
+	int i;
+
+	/* Get memory for full buffer, including space for trailing EOB's. */
+	n = len + 2;
+	buf = (char *) yy_flex_alloc( n );
+	if ( ! buf )
+		YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+	for ( i = 0; i < len; ++i )
+		buf[i] = bytes[i];
+
+	buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;
+
+	b = yy_scan_buffer( buf, n );
+	if ( ! b )
+		YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+	/* It's okay to grow etc. this buffer, and we should throw it
+	 * away when we're done.
+	 */
+	b->yy_is_our_buffer = 1;
+
+	return b;
+	}
+#endif
+
+
+#ifndef YY_NO_PUSH_STATE
+#ifdef YY_USE_PROTOS
+static void yy_push_state( int new_state )
+#else
+static void yy_push_state( new_state )
+int new_state;
+#endif
+	{
+	if ( yy_start_stack_ptr >= yy_start_stack_depth )
+		{
+		yy_size_t new_size;
+
+		yy_start_stack_depth += YY_START_STACK_INCR;
+		new_size = yy_start_stack_depth * sizeof( int );
+
+		if ( ! yy_start_stack )
+			yy_start_stack = (int *) yy_flex_alloc( new_size );
+
+		else
+			yy_start_stack = (int *) yy_flex_realloc(
+					(void *) yy_start_stack, new_size );
+
+		if ( ! yy_start_stack )
+			YY_FATAL_ERROR(
+			"out of memory expanding start-condition stack" );
+		}
+
+	yy_start_stack[yy_start_stack_ptr++] = YY_START;
+
+	BEGIN(new_state);
+	}
+#endif
+
+
+#ifndef YY_NO_POP_STATE
+static void yy_pop_state()
+	{
+	if ( --yy_start_stack_ptr < 0 )
+		YY_FATAL_ERROR( "start-condition stack underflow" );
+
+	BEGIN(yy_start_stack[yy_start_stack_ptr]);
+	}
+#endif
+
+
+#ifndef YY_NO_TOP_STATE
+static int yy_top_state()
+	{
+	return yy_start_stack[yy_start_stack_ptr - 1];
+	}
+#endif
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+#ifdef YY_USE_PROTOS
+static void yy_fatal_error( yyconst char msg[] )
+#else
+static void yy_fatal_error( msg )
+char msg[];
+#endif
+	{
+	(void) fprintf( stderr, "%s\n", msg );
+	exit( YY_EXIT_FAILURE );
+	}
+
+
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+	do \
+		{ \
+		/* Undo effects of setting up yytext. */ \
+		yytext[yyleng] = yy_hold_char; \
+		yy_c_buf_p = yytext + n; \
+		yy_hold_char = *yy_c_buf_p; \
+		*yy_c_buf_p = '\0'; \
+		yyleng = n; \
+		} \
+	while ( 0 )
+
+
+/* Internal utility routines. */
+
+#ifndef yytext_ptr
+#ifdef YY_USE_PROTOS
+static void yy_flex_strncpy( char *s1, yyconst char *s2, int n )
+#else
+static void yy_flex_strncpy( s1, s2, n )
+char *s1;
+yyconst char *s2;
+int n;
+#endif
+	{
+	register int i;
+	for ( i = 0; i < n; ++i )
+		s1[i] = s2[i];
+	}
+#endif
+
+#ifdef YY_NEED_STRLEN
+#ifdef YY_USE_PROTOS
+static int yy_flex_strlen( yyconst char *s )
+#else
+static int yy_flex_strlen( s )
+yyconst char *s;
+#endif
+	{
+	register int n;
+	for ( n = 0; s[n]; ++n )
+		;
+
+	return n;
+	}
+#endif
+
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_alloc( yy_size_t size )
+#else
+static void *yy_flex_alloc( size )
+yy_size_t size;
+#endif
+	{
+	return (void *) malloc( size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void *yy_flex_realloc( void *ptr, yy_size_t size )
+#else
+static void *yy_flex_realloc( ptr, size )
+void *ptr;
+yy_size_t size;
+#endif
+	{
+	/* The cast to (char *) in the following accommodates both
+	 * implementations that use char* generic pointers, and those
+	 * that use void* generic pointers.  It works with the latter
+	 * because both ANSI C and C++ allow castless assignment from
+	 * any pointer type to void*, and deal with argument conversions
+	 * as though doing an assignment.
+	 */
+	return (void *) realloc( (char *) ptr, size );
+	}
+
+#ifdef YY_USE_PROTOS
+static void yy_flex_free( void *ptr )
+#else
+static void yy_flex_free( ptr )
+void *ptr;
+#endif
+	{
+	free( ptr );
+	}
+
+#if YY_MAIN
+int main()
+	{
+	yylex();
+	return 0;
+	}
+#endif
+
diff --git a/src/terralib/kernel/showseq.h b/src/terralib/kernel/showseq.h
new file mode 100644
index 0000000..4d9a1fc
--- /dev/null
+++ b/src/terralib/kernel/showseq.h
@@ -0,0 +1,23 @@
+// Template zur Anzeige von Sequenzen
+// Template for the display of sequences (file include/showseq)
+#ifndef SHOWSEQ_H
+#define SHOWSEQ_H
+
+#include<iostream>
+
+namespace br_stl {
+
+template<class Container>
+void showSequence(const Container& s, const char* sep = " ",
+                  std::ostream& where = std::cout) {
+   typename Container::const_iterator iter = s.begin();
+   while(iter != s.end())
+      where << *iter++ << sep;
+   where << std::endl;
+}
+
+
+} // namespace br_stl
+
+#endif
+
diff --git a/src/terralib/kernel/yyTemporal.cpp b/src/terralib/kernel/yyTemporal.cpp
new file mode 100644
index 0000000..83bb961
--- /dev/null
+++ b/src/terralib/kernel/yyTemporal.cpp
@@ -0,0 +1,495 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifdef WIN32
+#pragma warning ( disable: 4786 )
+#endif
+
+#ifndef lint
+static char const 
+yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $";
+#endif
+#include <stdlib.h>
+#define YYBYACC 1
+#define YYMAJOR 1
+#define YYMINOR 9
+#define YYLEX yylex()
+#define YYEMPTY -1
+#define yyclearin (yychar=(YYEMPTY))
+#define yyerrok (yyerrflag=0)
+#define YYRECOVERING() (yyerrflag!=0)
+static int yygrowstack();
+#define YYPREFIX "yy"
+#include <stdio.h>
+#include <iostream>
+#include <string.h>
+#include <TeDatabase.h>
+
+extern int yylex();
+extern void initLexOut();
+
+extern char lexOut[1000];
+extern char sqlOutLex[1000];
+
+char sqlOut[1000];
+char tempSql[1000];
+string aux;
+
+const char*	myinputptr;
+string  myinputptr_aux;
+int myinputlim;	
+
+TeDatabase* database_;
+
+int initParse(const string& strIn, TeDatabase* db)
+{	
+	for(int i=0; i<1000; ++i)
+	{
+		sqlOut[i] = '\0';
+		tempSql[i]= '\0';
+	}
+
+	//myinputptr = new char();
+	//memcpy(myinputptr, strIn.c_str(), strIn.size ());
+	myinputptr_aux = strIn;
+	myinputptr = myinputptr_aux.c_str();
+	
+	myinputlim = (int)myinputptr + strIn.size ();	
+	database_ = db;
+	return 1;
+}
+
+void yyerror(char* msg)
+{	
+	if(strcmp(msg,"syntax error"))
+		printf(" Syntax Error : %s\n", msg);
+}
+
+#define YYERRCODE 256
+#define TEMPORALRELATION 257
+#define CHRONON 258
+#define NAME 259
+#define NUMBER 260
+#define MASK 261
+#define OR 262
+#define AND 263
+#define NOT 264
+const short yylhs[] = {                                        -1,
+    0,    0,    0,    0,    0,
+};
+const short yylen[] = {                                         2,
+   15,    2,    3,    3,    3,
+};
+const short yydefred[] = {                                      0,
+    0,    0,    0,    0,    0,    2,    0,    0,    0,    0,
+    3,    0,    4,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    1,
+};
+const short yydgoto[] = {                                       4,
+};
+const short yysindex[] = {                                    -40,
+  -52,  -40,  -40, -260, -251,    0,  -37,  -40,  -40,  -50,
+    0, -253,    0, -246,  -45, -242,  -43, -243,  -41, -241,
+  -39, -240,  -36, -236,    0,
+};
+const short yyrindex[] = {                                      0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    1,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,
+};
+const short yygindex[] = {                                      3,
+};
+#define YYTABLESIZE 263
+const short yytable[] = {                                       3,
+    5,    8,    9,   11,    6,    7,    5,   10,   14,    9,
+   12,   13,   15,   16,   17,   18,   19,   20,   21,   22,
+   23,   25,   24,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    5,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    1,    0,
+    0,    0,    0,    2,    8,    9,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    5,
+};
+const short yycheck[] = {                                      40,
+    0,  262,  263,   41,    2,    3,   59,  259,   59,  263,
+    8,    9,  259,   59,  257,   59,  260,   59,  260,   59,
+  261,  258,   59,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   41,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  259,   -1,
+   -1,   -1,   -1,  264,  262,  263,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  262,
+};
+#define YYFINAL 4
+#ifndef YYDEBUG
+#define YYDEBUG 0
+#endif
+#define YYMAXTOKEN 264
+#if YYDEBUG
+const char * const yyname[] = {
+"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,"'('","')'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"';'",0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"TEMPORALRELATION",
+"CHRONON","NAME","NUMBER","MASK","OR","AND","NOT",
+};
+const char * const yyrule[] = {
+"$accept : exp",
+"exp : NAME ';' NAME ';' NAME ';' TEMPORALRELATION ';' NUMBER ';' NUMBER ';' MASK ';' CHRONON",
+"exp : NOT exp",
+"exp : '(' exp ')'",
+"exp : exp AND exp",
+"exp : exp OR exp",
+};
+#endif
+#ifndef YYSTYPE
+typedef int YYSTYPE;
+#endif
+#if YYDEBUG
+#include <stdio.h>
+#endif
+#ifdef YYSTACKSIZE
+#undef YYMAXDEPTH
+#define YYMAXDEPTH YYSTACKSIZE
+#else
+#ifdef YYMAXDEPTH
+#define YYSTACKSIZE YYMAXDEPTH
+#else
+#define YYSTACKSIZE 10000
+#define YYMAXDEPTH 10000
+#endif
+#endif
+#define YYINITSTACKSIZE 200
+int yydebug;
+int yynerrs;
+int yyerrflag;
+int yychar;
+short *yyssp;
+YYSTYPE *yyvsp;
+YYSTYPE yyval;
+YYSTYPE yylval;
+short *yyss;
+short *yysslim;
+YYSTYPE *yyvs;
+int yystacksize;
+
+
+/* allocate initial stack or double stack size, up to YYMAXDEPTH */
+static int yygrowstack()
+{
+    int newsize, i;
+    short *newss;
+    YYSTYPE *newvs;
+
+    if ((newsize = yystacksize) == 0)
+        newsize = YYINITSTACKSIZE;
+    else if (newsize >= YYMAXDEPTH)
+        return -1;
+    else if ((newsize *= 2) > YYMAXDEPTH)
+        newsize = YYMAXDEPTH;
+    i = yyssp - yyss;
+    newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) :
+      (short *)malloc(newsize * sizeof *newss);
+    if (newss == NULL)
+        return -1;
+    yyss = newss;
+    yyssp = newss + i;
+    newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) :
+      (YYSTYPE *)malloc(newsize * sizeof *newvs);
+    if (newvs == NULL)
+        return -1;
+    yyvs = newvs;
+    yyvsp = newvs + i;
+    yystacksize = newsize;
+    yysslim = yyss + newsize - 1;
+    return 0;
+}
+
+#define YYABORT goto yyabort
+#define YYREJECT goto yyabort
+#define YYACCEPT goto yyaccept
+#define YYERROR goto yyerrlab
+
+#ifndef YYPARSE_PARAM
+#if defined(__cplusplus) || __STDC__
+#define YYPARSE_PARAM_ARG void
+#define YYPARSE_PARAM_DECL
+#else	/* ! ANSI-C/C++ */
+#define YYPARSE_PARAM_ARG
+#define YYPARSE_PARAM_DECL
+#endif	/* ANSI-C/C++ */
+#else	/* YYPARSE_PARAM */
+#ifndef YYPARSE_PARAM_TYPE
+#define YYPARSE_PARAM_TYPE void *
+#endif
+#if defined(__cplusplus) || __STDC__
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL
+#else	/* ! ANSI-C/C++ */
+#define YYPARSE_PARAM_ARG YYPARSE_PARAM
+#define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM;
+#endif	/* ANSI-C/C++ */
+#endif	/* ! YYPARSE_PARAM */
+
+int
+yyparse (string& sql/*, YYPARSE_PARAM_ARG*/)
+    YYPARSE_PARAM_DECL
+{
+    register int yym, yyn, yystate;
+	string aux = "";
+#if YYDEBUG
+    register const char *yys;
+
+    if ((yys = getenv("YYDEBUG")))
+    {
+        yyn = *yys;
+        if (yyn >= '0' && yyn <= '9')
+            yydebug = yyn - '0';
+    }
+#endif
+
+    yynerrs = 0;
+    yyerrflag = 0;
+    yychar = (-1);
+
+    if (yyss == NULL && yygrowstack()) goto yyoverflow;
+    yyssp = yyss;
+    yyvsp = yyvs;
+    *yyssp = yystate = 0;
+
+yyloop:
+    if ((yyn = yydefred[yystate])) goto yyreduce;
+    if (yychar < 0)
+    {
+        if ((yychar = yylex()) < 0) yychar = 0;
+#if YYDEBUG
+        if (yydebug)
+        {
+            yys = 0;
+            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+            if (!yys) yys = "illegal-symbol";
+            printf("%sdebug: state %d, reading %d (%s)\n",
+                    YYPREFIX, yystate, yychar, yys);
+        }
+#endif
+    }
+    if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 &&
+            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+    {
+#if YYDEBUG
+        if (yydebug)
+            printf("%sdebug: state %d, shifting to state %d\n",
+                    YYPREFIX, yystate, yytable[yyn]);
+#endif
+        if (yyssp >= yysslim && yygrowstack())
+        {
+            goto yyoverflow;
+        }
+        *++yyssp = yystate = yytable[yyn];
+        *++yyvsp = yylval;
+        yychar = (-1);
+        if (yyerrflag > 0)  --yyerrflag;
+        goto yyloop;
+    }
+    if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 &&
+            yyn <= YYTABLESIZE && yycheck[yyn] == yychar)
+    {
+        yyn = yytable[yyn];
+        goto yyreduce;
+    }
+    if (yyerrflag) goto yyinrecovery;
+#if defined(lint) || defined(__GNUC__)
+	yyerror("syntax error");
+   ++yynerrs;
+#endif
+yyinrecovery:
+    if (yyerrflag < 3)
+    {
+        yyerrflag = 3;
+        for (;;)
+        {
+            if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 &&
+                    yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE)
+            {
+#if YYDEBUG
+                if (yydebug)
+                    printf("%sdebug: state %d, error recovery shifting\
+ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]);
+#endif
+                if (yyssp >= yysslim && yygrowstack())
+                {
+                    goto yyoverflow;
+                }
+                *++yyssp = yystate = yytable[yyn];
+                *++yyvsp = yylval;
+                goto yyloop;
+            }
+            else
+            {
+#if YYDEBUG
+                if (yydebug)
+                    printf("%sdebug: error recovery discarding state %d\n",
+                            YYPREFIX, *yyssp);
+#endif
+                if (yyssp <= yyss) goto yyabort;
+                --yyssp;
+                --yyvsp;
+            }
+        }
+    }
+    else
+    {
+        if (yychar == 0) goto yyabort;
+#if YYDEBUG
+        if (yydebug)
+        {
+            yys = 0;
+            if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+            if (!yys) yys = "illegal-symbol";
+            printf("%sdebug: state %d, error recovery discards token %d (%s)\n",
+                    YYPREFIX, yystate, yychar, yys);
+        }
+#endif
+        yychar = (-1);
+        goto yyloop;
+    }
+yyreduce:
+#if YYDEBUG
+    if (yydebug)
+        printf("%sdebug: state %d, reducing by rule %d (%s)\n",
+                YYPREFIX, yystate, yyn, yyrule[yyn]);
+#endif
+    yym = yylen[yyn];
+    yyval = yyvsp[1-yym];
+    switch (yyn)
+    {
+case 1:
+{	 
+				strncat(sqlOut, sqlOutLex, strlen(sqlOutLex));
+				aux = database_->getSQLTemporalWhere (string(lexOut)); 
+				memcpy(tempSql, aux.c_str(), aux.size());
+				strncat(sqlOut, tempSql, strlen(tempSql));
+				initLexOut(); 
+			}
+break;
+    }
+    yyssp -= yym;
+    yystate = *yyssp;
+    yyvsp -= yym;
+    yym = yylhs[yyn];
+    if (yystate == 0 && yym == 0)
+    {
+#if YYDEBUG
+        if (yydebug)
+            printf("%sdebug: after reduction, shifting from state 0 to\
+ state %d\n", YYPREFIX, YYFINAL);
+#endif
+        yystate = YYFINAL;
+        *++yyssp = YYFINAL;
+        *++yyvsp = yyval;
+        if (yychar < 0)
+        {
+            if ((yychar = yylex()) < 0) yychar = 0;
+#if YYDEBUG
+            if (yydebug)
+            {
+                yys = 0;
+                if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
+                if (!yys) yys = "illegal-symbol";
+                printf("%sdebug: state %d, reading %d (%s)\n",
+                        YYPREFIX, YYFINAL, yychar, yys);
+            }
+#endif
+        }
+        if (yychar == 0) goto yyaccept;
+        goto yyloop;
+    }
+    if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 &&
+            yyn <= YYTABLESIZE && yycheck[yyn] == yystate)
+        yystate = yytable[yyn];
+    else
+        yystate = yydgoto[yym];
+#if YYDEBUG
+    if (yydebug)
+        printf("%sdebug: after reduction, shifting from state %d \
+to state %d\n", YYPREFIX, *yyssp, yystate);
+#endif
+    if (yyssp >= yysslim && yygrowstack())
+    {
+        goto yyoverflow;
+    }
+    *++yyssp = yystate;
+    *++yyvsp = yyval;
+    goto yyloop;
+yyoverflow:
+    yyerror("yacc stack overflow");
+yyabort:
+    return (1);
+yyaccept:
+    {
+		sql = string(sqlOut);
+		//delete(myinputptr); cai!!!!
+		return (0);
+	}
+}
diff --git a/src/terralib/kernel/yyTemporal.h b/src/terralib/kernel/yyTemporal.h
new file mode 100644
index 0000000..0077010
--- /dev/null
+++ b/src/terralib/kernel/yyTemporal.h
@@ -0,0 +1,35 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+#ifndef YYERRCODE
+#define YYERRCODE 256
+#endif
+
+#define TEMPORALRELATION 257
+#define CHRONON 258
+#define NAME 259
+#define NUMBER 260
+#define MASK 261
+#define OR 262
+#define AND 263
+#define NOT 264
diff --git a/src/terralib/stat/TeBayesFunctions.cpp b/src/terralib/stat/TeBayesFunctions.cpp
new file mode 100644
index 0000000..ff10c67
--- /dev/null
+++ b/src/terralib/stat/TeBayesFunctions.cpp
@@ -0,0 +1,232 @@
+#include "TeBayesFunctions.h"
+#include "TeStatDataStructures.h"
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeGeneralizedProxMatrix.h"
+#include "TeSTElementSet.h"
+
+// TeGlobalEmpiricalBayes				// Function declaration
+bool TeGlobalEmpiricalBayes(TeSTStatInstanceSet *rs, double rate)
+{
+	TeSTStatInstanceSet::iterator it = rs->begin();
+	
+	long int Narea=0;	// number of areas
+	long int count;		// Counter
+	double m_hat;		// the global rate
+	double n_;			// the mean population in risk
+	double s2=0;		// s2 = sum(n(i)(r(i) - m_hat)^2)/n
+	double sum_n=0;		//
+	double sum_y=0;		//
+	vector<double> r;	// the rate for each area
+	vector<double> n;	// the population in each area
+	vector<double> y;	// the cases in each area
+	double aux;			// auxiliary variable
+
+	try{
+
+		while(it != rs->end())
+		{
+			(*it).getDoubleProperty(0,aux);
+			n.push_back(aux);
+			(*it).getDoubleProperty(1,aux);
+			y.push_back(aux);
+			++Narea;
+			r.push_back(y[Narea-1]/n[Narea-1]);
+			sum_n+=n[Narea-1];
+			sum_y+=y[Narea-1];
+			++it;
+		
+			// Check if the population is smaller than the 
+			// number of cases
+			//if(n[Narea-1]<=y[Narea-1])
+			//	throw TeGlobalBayesException(BAYES_GREATER_CASES);
+			if(n[Narea-1]<=0)
+				throw TeGlobalBayesException(BAYES_NULL_POPULATION);
+		}
+
+		m_hat = sum_y/sum_n;
+		n_	  = sum_n/Narea;
+
+		for(count=0;count<Narea;count++)
+		{
+			s2+= n[count]*(r[count]-m_hat)*(r[count]-m_hat);
+		}
+		s2=s2/sum_n;
+
+		it = rs->begin();
+		aux = s2 - (m_hat/n_);
+	
+		if(aux<0)
+		{
+			(*it).setDoubleProperty(2,m_hat);
+			++it;
+		}
+		else
+		{
+ 			double Theta_i, Ci, pop, cases;
+			while(it != rs->end())
+			{
+				(*it).getDoubleProperty(0,pop);
+				(*it).getDoubleProperty(1,cases);
+				Ci = (aux)/(aux + (m_hat/pop));
+				Theta_i = Ci*(cases/pop) + (1-Ci)*m_hat;
+				(*it).setDoubleProperty(2,Theta_i*rate);
+				++it;
+			}
+		}
+
+	}catch(TeGlobalBayesException e)
+		{
+/*			switch(e.getErrorCode()){
+			case BAYES_GREATER_CASES:
+			break;
+			case BAYES_NULL_POPULATION:
+			break;
+			}*/
+      e.getErrorCode();
+			return(false);
+		}
+
+	return(true);
+}
+
+
+
+/* Taxa Bayesiana Local -- recebe conjunto de areas, cria matriz de vizinhanca,
+   e estima taxa local baseado na vizinhanca.
+
+   As duas primeiras propriedades das areas sao populacao e casos.
+   Ha mais duas propriedades double onde serao armazenados total de casos e total
+   de populacao dos vizinhos.
+
+  teta[i]=w[i]*r[i]+(1-w[i])*c[i]
+  w[i]=V/(V+r[i]))
+  V=Sum(Area i,Pop[i]*(ri-m)^2)/Sum(Area i,Pop[i])-m/PopMedia
+*/
+// TeGlobalEmpiricalBayes				// Function declaration
+bool TeLocalEmpiricalBayes(TeSTElementSet *rs, string& colname, double /*rate*/)
+{
+
+
+  //Monta vizinhanca
+	TeProxMatrixLocalAdjacencyStrategy matrix(rs, TePOLYGONS);         
+	TeGeneralizedProxMatrix neighMatrix(&matrix);
+
+  //Percorre areas, calculando populacao e contagem total dos vizinhos
+
+  TeSTElementSet::iterator it = rs->begin(); 
+	double neiPop, neiCases;
+  double totPop, mPop;
+
+  totPop = 0;
+  std::string val;
+
+	while ( it != rs->end())
+	{
+		
+    //Inicializa total de casos e de populacao
+    neiPop = neiCases = 0;
+    (*it).getPropertyValue(val, 0);
+    mPop = atof(val.c_str());
+    if (mPop == 0)
+      return false;
+    totPop += mPop;
+
+
+		TeNeighboursMap  neighbors = neighMatrix.getMapNeighbours((*it).objectId());
+
+    if (neighbors.size() > 0) {
+
+      TeNeighboursMap::iterator itNeigs = neighbors.begin();
+      
+      //Total de casos e de populacao
+      while(itNeigs != neighbors.end()){
+        
+        //Pega numero de casos e de populacao
+        it.elemSet()->getAttributeValue((*itNeigs).first, 0, val);
+        neiPop += atof(val.c_str());
+        it.elemSet()->getAttributeValue((*itNeigs).first, 1, val);
+        neiCases += atof(val.c_str());
+        (++itNeigs);
+      }
+    }
+
+    //Insere propriedades na area
+    
+    TeProperty prop;
+    prop.attr_.rep_.type_ = TeREAL;
+
+    prop.attr_.rep_.name_ = "neiPop";
+    prop.value_ = Te2String(neiPop, 9);
+    (*it).addProperty(prop);
+
+    prop.attr_.rep_.name_ = "neiCases";
+    prop.value_ = Te2String(neiCases, 9);
+    (*it).addProperty(prop);
+
+    (++it);
+  }       
+
+
+  double m, variance, V, W, LocalBayesRate;
+  double myPop, myCases, neiJPop, neiJCases;
+
+  TeProperty rateProp;
+  rateProp.attr_.rep_.type_ = TeREAL;
+  rateProp.attr_.rep_.name_ = colname;
+
+  it = rs->begin(); 
+	while ( it != rs->end())
+	{
+
+    //Pega numero de casos e de populacao
+    (*it).getPropertyValue(val, 0);
+    myPop = atof(val.c_str());
+    (*it).getPropertyValue(val, 1);
+    myCases = atof(val.c_str());
+
+    (*it).getPropertyValue("neiPop", val);
+    neiPop = atof(val.c_str());
+    (*it).getPropertyValue("neiCases", val);
+    neiCases = atof(val.c_str());
+
+    m = (double)neiCases/(double)neiPop;
+    variance = 0;
+
+    TeNeighboursMap  neighbors = neighMatrix.getMapNeighbours((*it).objectId());
+      
+    if (neighbors.size() == 0) {
+       LocalBayesRate = (double)myCases/(double)myPop;
+    }
+    else {
+
+      TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+      //Total de casos e de populacao
+      while(itNeigs != neighbors.end()){
+        
+        //Pega numero de casos e de populacao
+        it.elemSet()->getAttributeValue((*itNeigs).first, 0, val);
+        neiJPop = atof(val.c_str());
+        it.elemSet()->getAttributeValue((*itNeigs).first, 1, val);
+        neiJCases = atof(val.c_str());
+
+        //Atualiza numS
+        variance += (double)neiJPop * pow((double)neiJCases/(double)neiJPop - m,2);
+        (++itNeigs);
+      }
+   
+
+      V = (variance/(double)myPop) - (m * (double)neighbors.size()/(double)neiPop);
+      if (V < 0)
+        V = 0;
+      W = V/(V + (m/(double)myPop));
+      LocalBayesRate = W * (double)myCases/(double)myPop + (1 - W) * m;
+
+    }
+    rateProp.value_ = Te2String(LocalBayesRate, 9);
+    (*it).addProperty(rateProp);
+    (++it);
+  }       
+
+  return (true);
+}
diff --git a/src/terralib/stat/TeBayesFunctions.h b/src/terralib/stat/TeBayesFunctions.h
new file mode 100644
index 0000000..bd127f8
--- /dev/null
+++ b/src/terralib/stat/TeBayesFunctions.h
@@ -0,0 +1,71 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001, 2002, 2003 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#ifndef __TEBAYESFUNCTIONSH__
+#define __TEBAYESFUNCTIONSH__
+
+#include "TeStatDataStructures.h"
+
+// Class for error treatment
+enum TeGlobalBayesError {
+   BAYES_GREATER_CASES,
+   BAYES_NULL_POPULATION
+};
+
+class TeGlobalBayesException  {
+
+
+   TeGlobalBayesError error_;
+
+public:
+
+  TeGlobalBayesException(TeGlobalBayesError e) {
+    error_ = e;
+  }
+
+  TeGlobalBayesError getErrorCode() {
+    return error_;
+  }
+};
+
+
+// TeGlobalEmpiricalBayes				// Function declaration
+bool TeGlobalEmpiricalBayes(TeSTStatInstanceSet *rs, double rate);
+
+
+
+/* Taxa Bayesiana Local -- recebe conjunto de areas, cria matriz de vizinhanca,
+   e estima taxa local baseado na vizinhanca.
+
+   As duas primeiras propriedades das areas sao populacao e casos.
+   Ha mais duas propriedades double onde serao armazenados total de casos e total
+   de populacao dos vizinhos.
+
+  teta[i]=w[i]*r[i]+(1-w[i])*c[i]
+  w[i]=V/(V+r[i]))
+  V=Sum(Area i,Pop[i]*(ri-m)^2)/Sum(Area i,Pop[i])-m/PopMedia
+*/
+// TeGlobalEmpiricalBayes				// Function declaration
+bool TeLocalEmpiricalBayes(TeSTElementSet *rs, string& colname, double rate);
+
+
+#endif
diff --git a/src/terralib/stat/TeKMeansGrouping.h b/src/terralib/stat/TeKMeansGrouping.h
new file mode 100644
index 0000000..7b04384
--- /dev/null
+++ b/src/terralib/stat/TeKMeansGrouping.h
@@ -0,0 +1,164 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeKMeansGrouping.h
+    This file contains functions related to the K Means clustering algorithm
+*/
+#ifndef  __TERRALIB_INTERNAL_KMEANSGROUPING_H
+#define  __TERRALIB_INTERNAL_KMEANSGROUPING_H
+
+#include "TeGroupingAlgorithms.h"
+
+template<typename I, typename T>  int
+TeMinimumDistance(I it, T& centroides )
+{
+	double distmin = TeMAXFLOAT, dist; 
+	int j = -1;
+	for (int i=0; i< centroides.size(); i++)
+	{
+	     dist = TeEuclidianDistance(it,centroides[i]);
+	     if ( dist < distmin )
+	     {  
+			 j = i; 
+			 distmin = dist; 
+		 }
+	}
+	return j;
+}
+
+template<typename I, typename T> 
+double
+TeEuclidianDistance(I it, T& centroide)
+{
+	double val = 0;
+	int n = centroide.size();
+	for (int i=0; i<n; i++)
+	{
+		double v1 = (*it)[i];
+		double v2 = centroide[i];
+		val += pow(v1-v2,2);
+	}
+	return sqrt(val);
+}
+
+
+template<typename T> 
+void
+Initialize(T& centroide, vector<double>& minValue, vector<double>& maxValue)
+{
+	int n = centroide.size();
+	for (int i=0; i<n; i++)
+	{
+		double val = (rand()* (maxValue[i]-minValue[i]))/RAND_MAX;
+		centroide[i] = val;
+	}
+	return;
+}
+
+template<typename T> 
+bool 
+CheckConvergence(T& toUpdate, T& newCentroides, double limiar )
+{
+
+	int k = newCentroides.size();
+	int n = newCentroides[0].size();
+	for (int i=0; i<k; i++)
+		for (int j = 0; j<n; j++)
+		{
+			double num = newCentroides[i][j];
+			double den = toUpdate[i][j];
+/*			if (num > den)
+			{
+				double aux = den;
+				den = num;
+				num = aux;
+			}
+			val = (1-num/den)*100.;
+			if (val > limiar)
+				return false;
+*/
+			if (num != den)
+				return false;
+		}
+	return true;
+}
+
+template<typename It, typename C> 
+void
+ReCalculate(It it, C& nearest)
+{
+	for (int i=0; i<nearest.size(); i++)
+		nearest[i] = (nearest[i] + (*it)[i])/2.0;
+	return;
+}
+
+
+template<typename It, typename C> void
+TeKMeans (It begin, It end, C& result, double conv) 
+{
+	srand( static_cast<unsigned>(time(NULL)));
+	C centroides(result), centr_aux(result);
+    
+	int n = result[0].size();
+	vector<double> minValue(n);
+	vector<double> maxValue(n);
+
+	TeMinimumValue(begin, end, minValue);
+	TeMaximumValue(begin, end, maxValue);
+
+	for (int i=0; i<result.size();  i++)
+	{
+		// Falta verificar se n�o gera centroides iniciais iguais
+		Initialize(centroides[i], minValue, maxValue);
+	}
+
+	centr_aux = centroides;
+	bool converge = false;
+	int  j, niter=0;
+
+	while (!converge)
+	{
+		for (It it=begin; it!= end; it++) 
+		{
+			j = TeMinimumDistance(it, centroides);
+			ReCalculate(it,centr_aux[j]);
+		}
+		converge = CheckConvergence(centroides, centr_aux,conv);
+		centroides = centr_aux;
+		niter++;
+   }
+   result = centroides;
+}
+
+template<typename ItIn, typename C, typename ItOut> void
+TeEuclidianClassify (ItIn begin, ItIn end, ItOut& result, C& kmeans) 
+{
+	int j;
+	for (ItIn it=begin; it!= end; it++) 
+	{
+		j = TeMinimumDistance(it, kmeans);
+		(*result) = j;
+		result++;
+	}
+}
+#endif
\ No newline at end of file
diff --git a/src/terralib/stat/TeKernelFunctions.cpp b/src/terralib/stat/TeKernelFunctions.cpp
new file mode 100644
index 0000000..467990f
--- /dev/null
+++ b/src/terralib/stat/TeKernelFunctions.cpp
@@ -0,0 +1,67 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY 
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+#include "TeKernelFunctions.h"
+#include "TeDefines.h"
+#include <math.h>
+
+
+double TeKernelQuartic(double tau, double distance, double intensity) 
+{
+    if (distance > tau)
+		return 0.0;
+
+	return intensity * (3.0 / (tau * tau * TePI)) *
+		pow(1 - ((distance * distance)/ (tau * tau)),2.0);
+}
+
+double TeKernelNormal(double tau, double distance, double intensity)
+{
+	return intensity * (1.0 / (tau * tau * 2 * TePI)) *
+		exp(-1.0 * (distance * distance)/ (2 * tau * tau));
+}
+
+double TeKernelUniform(double tau, double distance, double intensity)
+{
+    if (distance > tau)
+		return 0.0;
+
+	return intensity;
+}
+
+double TeKernelTriangular(double tau, double distance, double intensity)
+{
+    if (distance > tau)
+		return 0.0;
+
+	return intensity * (1.0 - 1.0/tau) * distance;
+}
+
+double TeKernelNegExponential(double tau, double distance, double intensity)
+{
+    if (distance > tau)
+		return 0.0;
+
+	return intensity * exp(-3.0 * distance);
+}
+
+
diff --git a/src/terralib/stat/TeKernelFunctions.h b/src/terralib/stat/TeKernelFunctions.h
new file mode 100644
index 0000000..442809b
--- /dev/null
+++ b/src/terralib/stat/TeKernelFunctions.h
@@ -0,0 +1,693 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY 
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+/*! \file TeKernelFunctions.h
+    This file contains functions to spatial kernel estimation: basic, adaptive and ratio 
+*/
+
+#ifndef __TERRALIB_INTERNAL_KERNELFUNCTIONS_H
+#define __TERRALIB_INTERNAL_KERNELFUNCTIONS_H
+
+#include "TeException.h"
+#include "TeKernelParams.h"
+#include "TeDefines.h"
+#include "TeProgress.h"
+
+
+#define   INVALID_KERNEL -TeMAXFLOAT
+
+#define IDX_ATTR            0
+#define IDX_KERNEL          0
+#define IDX_NUMERATOR       1
+#define IDX_KERNEL1         0
+#define IDX_KERNEL2         1
+
+double TeDistance(const TeCoord2D& c1, const TeCoord2D& c2);
+
+enum TeKernelError {
+ KERNEL_NO_CENTROID,
+   KERNEL_ALL_NULL,
+   KERNEL_INVALID_AREA,
+   KERNEL_INVALID_VALUE,
+   KERNEL_NO_VALUE
+};
+
+class TeKernelException  {
+
+
+  TeKernelError error_;
+
+public:
+
+  TeKernelException(TeKernelError e) {
+    error_ = e;
+  }
+
+  TeKernelError getErrorCode() {
+    return error_;
+  }
+};
+
+
+
+/*! Kernel functions 
+
+ * \param tau spatial threshold to define neighboorhood
+ * \param distance distance between event and region centroid
+ * \param intensity attribute value for event
+*/
+double TeKernelQuartic(double tau, double distance, double intensity);
+double TeKernelNormal(double tau, double distance, double intensity);
+double TeKernelUniform(double tau, double distance, double intensity);
+double TeKernelTriangular(double tau, double distance, double intensity);
+double TeKernelNegExponential(double tau, double distance, double intensity);
+
+
+/**
+ * Calcula a media geometrica de um conjunto de valores atraves da 
+ * utilizacao de logaritmos
+ * Implementado pelo Andre
+ **/
+template <typename ItReg>
+double TeKernelGeometricMean(ItReg& beginReg, ItReg& endReg, int idx)
+{
+   double mantissa, MediaE, MediaM;
+   int expoente, Cont;
+   int MediaETmp = 0;
+   double MediaMTmp = 0;
+
+   double log_two = log(2.0);
+   Cont = 0;
+   ItReg it = beginReg;
+   double val;
+   while (it != endReg) {  
+         if ((*it).getDoubleProperty(idx, val) && (val > 0))
+         {
+            mantissa = frexp(val,&expoente);
+            MediaMTmp = MediaMTmp+log(mantissa);
+            MediaETmp = MediaETmp+expoente;
+            Cont++;
+         }
+         ++it;
+   }
+
+   MediaE = MediaETmp;
+   MediaM = (MediaMTmp+(MediaE*log_two))/Cont;
+   MediaM = exp(MediaM);
+
+   return MediaM;
+}
+
+
+
+/*! \brief Evaluates normalization factor for kernel
+ * \param begin begin of event set iterator
+ * \param end   end of event set iterator
+ * \return sum of intensities
+ **/
+template <typename ItEvt>
+double KernelNormalizationFactor(ItEvt itBegin, ItEvt itEnd) {
+
+  double normFactor = 0;
+  double intensity;
+
+  ItEvt evtIter = itBegin;
+
+   while (evtIter != itEnd) {
+
+     (*evtIter).getDoubleProperty(IDX_ATTR, intensity);
+     normFactor += intensity;
+      ++evtIter;
+    }
+
+  return normFactor;
+
+}
+
+
+/*! \brief Evaluates kernel value of events with intensity (attribute)
+ * for one support region, for a kernel function
+ * \param center support region centroid
+ * \param begin  begin of event set iterator
+ * \param end    end of event set iterator
+ * \param radius spatial threshold
+ * \param kfunc  type of kernel function
+ * This function assumes that intensity value of event is available on its first
+ * property - if it does not exist, it is set to 1.0 (identity)
+ **/
+template <typename ItEvt>
+double TeKernelValue (TeCoord2D& center, ItEvt& begin, ItEvt& end, 
+					  double radius, TeKernelFunctionType kfunc)
+{
+
+  string    intstr;
+
+	TeCoord2D location;		//Event spatial location
+  double    intensity;	//Event intensity
+
+  //Final kernel value
+	double kernel = 0; 
+
+  //Iterates through events, getting their location and intensity values
+  //and updating kernel value
+	ItEvt it = begin;
+	while (it != end) 
+	{
+		if (!(*it).centroid(location)) {
+			throw TeKernelException(KERNEL_NO_CENTROID);
+		}
+
+		//If there is no properties, assume intensity of one
+	    if (!(*it).getDoubleProperty(IDX_ATTR, intensity)) {
+				intensity = 1.0;
+		}
+
+		//Evaluates kernel value for one event
+		double distance = TeDistance (location,center);
+		double localK;
+
+		switch(kfunc) {
+		case TeKQuartic:
+			localK = TeKernelQuartic(radius,distance,intensity);
+			break;
+		case TeKNormal:
+			localK = TeKernelNormal(radius,distance,intensity);
+			break;
+		case TeKTriangular:
+			localK = TeKernelTriangular(radius,distance,intensity);
+			break;
+		case TeKNegExponential:
+			localK = TeKernelNegExponential(radius,distance,intensity);
+			break;
+		case TeKUniform:
+			localK = TeKernelUniform(radius,distance,intensity);
+			break;
+		}
+		kernel += localK; 
+	    ++it;
+
+	}
+	return kernel;
+}
+
+/*! \brief Normalizes kernel values based on type of computation. 
+ *  \brief Gets value from IDX_KERNEL and stores it at the same place 
+ * \param events set of spatial events
+ * \param regionsBegin begin of regions iterator
+ * \param reginsEnd end of region iterator
+ * \param kfunc type of kernel function
+ * \param ktype type of computation (SMA, density or probability)
+ * \param radius spatial threshold
+ **/
+template<typename EventSet, typename ItRegionSet>
+bool TeKernelNormalize(EventSet& events, 
+                   ItRegionSet& regionsBegin,
+                   ItRegionSet& regionsEnd,
+                   TeKernelComputeType  kType,
+                   double totKernel,
+                   int idxProp)
+{
+
+  double normKernel, kernel, area;
+  try {
+
+  //Evaluates sum of attributes for normalization
+    double normFactor = 
+      KernelNormalizationFactor(events.begin(), events.end());
+
+    //Reiterates through regions defining normalized kernel value,
+    //given the computation type
+    ItRegionSet regIter = regionsBegin;
+    while (regIter != regionsEnd) 
+    {
+      
+      (*regIter).getDoubleProperty(idxProp, kernel);
+      if (kernel < 0) {
+         throw TeKernelException(KERNEL_INVALID_VALUE);
+      }
+
+      //Evaluates value based on computation type
+      switch(kType) {
+      case TeKMovingAverage:
+        normKernel = (kernel * normFactor)/totKernel;
+        break;
+      case TeKDensity:
+        //If region does not have an area, assumes one
+        if (!(*regIter).area(area))
+          area = 1;
+        if (area <= 0) {
+          throw TeKernelException(KERNEL_INVALID_AREA);
+        }
+        normKernel = ((kernel * normFactor)/totKernel)/area;
+        break;
+      case TeKProbability:
+        normKernel = kernel/totKernel;
+        break;
+      }
+
+      //Store final value
+      (*regIter).setDoubleProperty(idxProp, normKernel);
+      ++regIter;
+    }  
+  } catch (TeKernelException /* e */) {
+//    int a = e.getErrorCode();
+    return false;
+  }
+  return true;
+}
+
+
+/*! \brief Evaluates kernel value for all support regions, 
+ * storing values either on IDX_KERNEL or IDX_NUMERATOR.  
+ * \param events set of spatial events
+ * \param regionsBegin begin of regions iterator
+ * \param reginsEnd end of region iterator
+ * \param kfunc type of kernel function
+ * \param ktype type of computation (SMA, density or probability)
+ * \param radius spatial threshold
+ * \param idxProp index of double property
+ **/
+template<typename EventSet, typename ItRegionSet>
+bool TeStatIntKernel(EventSet& events, 
+                   ItRegionSet& regionsBegin,
+                   ItRegionSet& regionsEnd,
+                   TeKernelFunctionType kfunc, 
+                   TeKernelComputeType  kType,
+                   double radius,  
+                   int idxProp)
+{
+
+
+  //Support region attributes
+  TeCoord2D location;
+  double    kernel;
+  
+  //Regions iterator
+  ItRegionSet regIter = regionsBegin;
+  // Sum of kernels
+  double totKernel = 0;
+
+  //Treats unexpected expections returning false
+  try {
+
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	t2 = clock();
+	t0 = t1 = t2;
+	int nsteps = 0;
+    //Iterates through regions
+    while (regIter != regionsEnd) 
+    {
+      if (!(*regIter).centroid(location)) {
+        throw TeKernelException(KERNEL_NO_CENTROID);
+      }
+      
+      //Define iterators for event sets -- may optimize
+      typename EventSet::iterator subSetBegin = events.begin(location,radius);
+      typename EventSet::iterator subSetEnd = events.end(location,radius);
+      if (kfunc == TeKNormal) {
+        subSetBegin = events.begin();
+        subSetEnd = events.end();
+      }
+
+      //Evaluates kernel value for region
+      kernel = TeKernelValue(location, subSetBegin, subSetEnd, 
+        radius, kfunc);
+      
+      totKernel += kernel;
+
+      (*regIter).setDoubleProperty(idxProp, kernel);
+      ++regIter; 
+	  t2 = clock();
+	  ++nsteps;
+	  if (TeProgress::instance())
+	  {
+		 if (int(t2-t1) > dt)
+		 {
+			t1 = t2;
+			if (TeProgress::instance()->wasCancelled())
+				break;
+			if((int)(t2-t0) > dt2)
+				TeProgress::instance()->setProgress(nsteps);
+		 }
+	  }
+	}
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+    if (totKernel <= 0) {
+      throw TeKernelException(KERNEL_ALL_NULL);
+    }
+
+    return TeKernelNormalize(events, regionsBegin, regionsEnd, kType, totKernel,
+      idxProp);
+
+  } catch (TeKernelException /* e */) {
+//    int a = e.getErrorCode();
+    return false;
+  }
+  
+  return true;
+}
+
+
+/*! \brief Evaluates adaptive kernel value for all support regions, 
+ * storing values (intermediary and final) in double property idxProp  
+ * \param events set of spatial events
+ * \param regionsBegin begin of regions iterator
+ * \param reginsEnd end of region iterator
+ * \param kfunc type of kernel function
+ * \param ktype type of computation (SMA, density or probability)
+ * \param numReg number of support regions -- need to evaluate initial radius
+ * \param totalArea total area of support regions -- need to evaluate initial radius
+ * \param idxProp index of double property
+ **/
+template<typename EventSet, typename ItRegionSet>
+bool TeStatAdaptiveGeoMeanIntKernel(EventSet& events, 
+                                    ItRegionSet& regionsBegin,
+                                    ItRegionSet& regionsEnd,
+                                    TeKernelFunctionType kfunc,
+                                    TeKernelComputeType ktype,
+                                    int /* numReg */,
+                                    double totalArea,
+                                    int idxProp) 
+{
+
+  try {
+
+    //Evaluate kernel with a fixed radius, based on formula, storing in vecValues
+    double radius = 0.68*pow((double)events.numObjects(),-0.2)*sqrt(totalArea);
+    double sqArea = sqrt(totalArea);
+    if (!TeStatIntKernel(events, regionsBegin, regionsEnd,
+      kfunc, ktype, radius, idxProp))
+      return false;
+    
+    //Evaluate geometric mean of kernel values, to adjust radius
+    double meanKernel = TeKernelGeometricMean(regionsBegin, regionsEnd, idxProp);
+    
+    if (meanKernel <= 0) {
+      throw TeKernelException(TeKernelException(KERNEL_ALL_NULL));
+    }
+    
+    //Now, reassign radius, evaluating final value for kernel
+    
+    ItRegionSet regIter = regionsBegin;
+    double    prevKernel;
+    double    newKernel;
+    double    newRadius;
+    double    totKernel = 0;
+    TeCoord2D location;
+    
+	int dt = CLOCKS_PER_SEC/4;
+	int dt2 = CLOCKS_PER_SEC * 5;
+	clock_t	t0, t1, t2;
+	t2 = clock();
+	t0 = t1 = t2;
+	int nsteps = 0;
+
+    //Iterates through regions
+    while (regIter != regionsEnd) 
+    {
+      if (!(*regIter).centroid(location)) {
+        throw TeKernelException(KERNEL_NO_CENTROID);
+      }
+      
+      //Define iterators for event sets -- may optimize
+      typename EventSet::iterator subSetBegin = events.begin(location,radius);
+      typename EventSet::iterator subSetEnd = events.end(location,radius);
+      if (kfunc == TeKNormal) {
+        subSetBegin = events.begin();
+        subSetEnd = events.end();
+      }
+
+      if (!((*regIter).getDoubleProperty(idxProp, prevKernel)) || (prevKernel < 0)) {
+         throw TeKernelException(KERNEL_INVALID_VALUE);
+      }
+  
+      if (prevKernel > 0) {
+        newRadius = radius*pow((meanKernel/prevKernel),0.5);
+        if (newRadius > sqArea/4.0)
+          newRadius = sqArea/4.0; //Para funcionar quando o valor eh muito pequeno
+        newKernel = TeKernelValue(location, subSetBegin, subSetEnd,  newRadius, kfunc);
+      }
+      else {
+        newKernel = 0.0;
+      }
+      
+      totKernel += newKernel;
+      (*regIter).setDoubleProperty(idxProp, newKernel);
+      ++regIter; 
+	  t2 = clock();
+	  ++nsteps;
+	  if (TeProgress::instance())
+	  {
+		 if (int(t2-t1) > dt)
+		 {
+			t1 = t2;
+			if (TeProgress::instance()->wasCancelled())
+				break;
+			if((int)(t2-t0) > dt2)
+				TeProgress::instance()->setProgress(nsteps);
+		 }
+	  }
+    }
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+    if (totKernel <= 0) {
+      throw TeKernelException(KERNEL_ALL_NULL);
+    }
+
+    return TeKernelNormalize(events, regionsBegin, regionsEnd, ktype, totKernel,
+      idxProp);
+  } catch (TeKernelException /* e */) { 
+//      int a = e.getErrorCode();
+      return false;
+  }
+    
+  return true;
+}
+
+
+
+/*! Class to apply kernel method
+*
+*/
+class  TeStatKernel {
+
+public:
+
+  //! type of kernel function
+  TeKernelFunctionType kfunc_;
+  //! type of computation
+  TeKernelComputeType  ktype_;
+  //! spatial threshold
+  double               radius_;
+  //! sum of support region areas
+  double               totalArea_;
+  //! number of support regions
+  int                  numReg_;
+  
+  TeStatKernel() {
+    kfunc_ = TeKQuartic;
+    ktype_ = TeKDensity;
+    radius_ = 0;
+    totalArea_ = 0;
+    numReg_ = 0;
+  }
+
+  /*! \brief Apply kernel method to a specif set of support regions
+   * and events, storing results in resName_.
+   * \param events set of point events
+   * \param regionsBegin iterator for support regions
+   * \param regionsEnd   iterator for support regions
+   * If radius_ is 0, then applies adaptive kernel.
+   */
+  template<typename EventSet, typename ItRegionSet>
+  bool apply(EventSet& events, 
+    ItRegionSet regionsBegin,
+    ItRegionSet regionsEnd) {
+    if (totalArea_ <= 0) {
+      return false;
+    }
+
+    if (numReg_ <= 0) {
+      return false;
+    }
+
+    bool result;
+    //Radius defined, kernel with a fixed radius
+    if (radius_ > 0) {
+      result = TeStatIntKernel(events,regionsBegin, regionsEnd, 
+        kfunc_,ktype_, radius_, IDX_KERNEL);
+      
+    }
+    //Radius undefined, adaptive kernel
+    else {
+      result = TeStatAdaptiveGeoMeanIntKernel(events,  regionsBegin, regionsEnd, 
+        kfunc_, ktype_, numReg_, totalArea_, IDX_KERNEL); 
+
+    }
+    return result;
+  }
+
+};
+
+
+
+class TeStatKernelRatio
+{
+  public:
+  int						numReg_;
+  
+  public:
+
+  TeKernelCombinationType	kComb_;
+  TeKernelComputeType		  ktype_;
+  TeKernelFunctionType		kfunc1_;
+  double					        radius1_;
+  TeKernelFunctionType		kfunc2_;
+  double				        	radius2_;
+  double				        	totalArea_;
+
+  
+  TeStatKernelRatio() {
+    kComb_ = TeKRatio;
+    kfunc1_ =  kfunc2_ = TeKQuartic;
+    ktype_ = TeKDensity;
+    radius1_ = radius2_ = 0;
+    totalArea_ = 0;
+    numReg_ = 0;
+  }
+   
+  template <typename EventSet1, typename EventSet2, typename ItRegionSet>
+  bool apply (EventSet1& ev1, 
+    EventSet2& ev2, 
+    ItRegionSet regBegin, 
+    ItRegionSet regEnd) {
+   
+    
+    if (totalArea_ <= 0)
+      return false;
+    
+    if (numReg_ <= 0) 
+      return false;
+    
+    //Calcula kernel para primeiro conjunto
+
+    bool result;
+    //Radius defined, kernel with a fixed radius
+    if (radius1_ > 0) {
+      result = TeStatIntKernel(ev1,regBegin, regEnd, 
+        kfunc1_,ktype_, radius1_, IDX_KERNEL1);
+      
+    }
+    //Radius undefined, adaptive kernel
+    else {
+      result = TeStatAdaptiveGeoMeanIntKernel(ev1,  regBegin, regEnd, 
+        kfunc1_, ktype_, numReg_, totalArea_, IDX_KERNEL1); 
+
+    }
+    
+    if (!result)
+      return result;
+
+  
+    //Calcula kernel para segundo conjunto
+     //Radius defined, kernel with a fixed radius
+    if (radius2_ > 0) {
+      result = TeStatIntKernel(ev2,regBegin, regEnd, 
+        kfunc2_,ktype_, radius2_, IDX_KERNEL2);
+      
+    }
+    //Radius undefined, adaptive kernel
+    else {
+      result = TeStatAdaptiveGeoMeanIntKernel(ev2,  regBegin, regEnd, 
+        kfunc2_, ktype_, numReg_, totalArea_, IDX_KERNEL2); 
+
+    }
+
+    if (!result)
+      return result;
+    
+    //Itera calculando o tipo de combinacao e armazenando no valor da regiao
+    //Percorre todas as regioes
+//    int Cont = 0;
+    double kernel;
+    double k1;
+    double k2;
+    double area;
+    
+    ItRegionSet regIter = regBegin;
+ 
+    while (regIter != regEnd) 
+    {
+  
+      (*regIter).area(area);
+      
+      (*regIter).getDoubleProperty(IDX_KERNEL1, k1);
+      (*regIter).getDoubleProperty(IDX_KERNEL2, k2);
+      
+      switch(kComb_) 
+      {
+      case TeKRatio:
+        if (k2 == 0.0)
+          kernel = 0.0;//INVALID_KERNEL;
+        else
+          kernel = k1/k2;
+        break;
+      case TeKLogRatio:
+        if (k2 == 0.0)
+          kernel = INVALID_KERNEL;
+        else
+          kernel = log(k1/k2);
+        break;
+      case TeAbsDifference:
+        kernel = k1 - k2;
+        break;
+      case TeRelDifference:
+        kernel = (k1 - k2) * area;
+        break;
+      case TeAbsSum:
+        kernel = k1+k2;
+        break;
+      case TeRelSum:
+        kernel = (k1 + k2) * area;
+        break;
+      }
+      (*regIter).setDoubleProperty(IDX_KERNEL, kernel);
+      ++regIter; 
+    }
+    
+    return true;
+  }
+                       
+};
+
+
+#endif
+
+
+
+
+
diff --git a/src/terralib/stat/TeKernelParams.h b/src/terralib/stat/TeKernelParams.h
new file mode 100644
index 0000000..ce9902d
--- /dev/null
+++ b/src/terralib/stat/TeKernelParams.h
@@ -0,0 +1,112 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY 
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+/*! \file TeKernelParams.h
+    This file contains structures and definitions about Kernel parameters
+*/
+#ifndef __TERRALIB_INTERNAL_KERNELPARAMS_H
+#define __TERRALIB_INTERNAL_KERNELPARAMS_H
+#include "TeUtils.h"
+
+#include <string>
+#include <vector>
+using namespace std;
+
+//! Kernel Algorithm types
+enum TeKernelFunctionType 
+ {TeKQuartic, TeKNormal, TeKUniform, TeKTriangular, TeKNegExponential};
+
+
+//! Kernel Evaluation types
+enum TeKernelComputeType 
+{TeKDensity, TeKMovingAverage, TeKProbability};
+
+enum TeKernelCombinationType
+{TeKRatio, TeKLogRatio, TeAbsDifference, TeRelDifference, TeAbsSum, TeRelSum};
+
+
+/*! \struct TeKernelParams
+	Kernel parameters representation
+*/
+struct TeKernelParams
+{
+	//first event theme
+	int						eventThemeId1_;			// event theme id
+	string					eventThemeName1_;		// event theme name
+	string					intensityAttrName1_;	// intensity attribute name 		
+	string					intensityAttrTable1_;	// table name that keeps the intensity attribute
+	TeKernelFunctionType	kernelFunction1_;		// kernel function
+	TeKernelComputeType		computeType1_;
+	double					radiusValue1_;			// radius value if the kernel is not adaptative 
+
+	TeKernelCombinationType	combinationType_;
+	
+	//second event theme (if Kernel ratio)
+	int						eventThemeId2_;			// event theme id
+	string					eventThemeName2_;		// event theme name
+	string					intensityAttrName2_;	// intensity attribute name 		
+	string					intensityAttrTable2_;	// table name that keeps the intensity attribute
+	TeKernelFunctionType	kernelFunction2_;		// kernel function
+	TeKernelComputeType		computeType2_;
+	double					radiusValue2_;			// radius value if the kernel is not adaptative 
+	
+	//informations about the kernel result
+	int						supportThemeId_;		// support theme id
+	string					supportThemeName_;		// support theme name 
+	string					supportThemeTable_;		// support theme table that keeps the kernel results 
+	string					supportThemeAttr_;		// attribute name of the support theme table that keeps the kernel results   	
+	int						generatedLayerId_;		// id of the generated layer (when it�s raster) 
+	string					generatedLayerName_;	// name of the generated layer (when it�s raster)
+	
+	//! Empty constructor
+	TeKernelParams():
+		eventThemeId1_(0),
+		eventThemeName1_(""),
+		intensityAttrName1_(""),
+		intensityAttrTable1_(""),
+		kernelFunction1_(TeKQuartic),
+		computeType1_(TeKDensity),
+		radiusValue1_(0.0),
+		combinationType_(TeKRatio),
+		eventThemeId2_(0),
+		eventThemeName2_(""),
+		intensityAttrName2_(""),
+		intensityAttrTable2_(""),
+		kernelFunction2_(TeKQuartic),
+		computeType2_(TeKDensity),
+		radiusValue2_(0.0),
+		supportThemeId_(0),
+		supportThemeName_(""),
+		supportThemeTable_(""),
+		supportThemeAttr_(""),
+		generatedLayerId_(0),
+		generatedLayerName_("")
+		{}
+
+};
+
+//! A vector of TeKernelParams
+typedef vector<TeKernelParams> TeKernelParamsVector;
+
+
+#endif
+
diff --git a/src/terralib/stat/TeSkaterArvore.cpp b/src/terralib/stat/TeSkaterArvore.cpp
new file mode 100644
index 0000000..f8fcc7b
--- /dev/null
+++ b/src/terralib/stat/TeSkaterArvore.cpp
@@ -0,0 +1,62 @@
+//---------------------------------------------------------------------------
+#ifdef WIN32
+#pragma hdrstop
+#endif
+#include <stdlib.h>
+#include "TeSkaterArvore.h"
+#include "heap.h"
+void  TArvore::Monta_Arvore(TSkaterGrafo *Grafo){
+  Heap = new THeap(Grafo->MyGrafo->Size);
+  Prim(Grafo);
+};
+
+/**********************************/
+void  TArvore::Prim(TSkaterGrafo *Grafo) {
+  int Menor;
+  int Viz;
+  double Peso;
+  int* Pai;
+
+	Pai = (int*)malloc(sizeof(int)*(Grafo->MyGrafo->Size));
+	if (Pai == NULL)
+		FatalError("Falta memoria");
+	try
+	{
+		while (!(Heap->Empty()))
+		{
+			Menor = Heap->Extract_Min();
+			Grafo->MyGrafo->Nos[Menor].Mark=0; //Marca que o nodo esta fora da Fila
+			for(Grafo->Adjacente(&Viz,&Peso,Menor);Viz!=-1;Grafo->Adjacente(&Viz,&Peso,Menor))
+			{
+			  if (Grafo->MyGrafo->Nos[Viz].Mark && Peso<(Heap->Key(Viz)))
+			  {
+				 Pai[Viz]=Menor;
+				 Heap->SetKey(Viz,Peso);
+			  };
+			}
+			
+			if(Menor)
+			{ 
+				try
+				{
+					//Testa se nao e a raiz. Raiz nao tem pai nem e filho
+					Grafo->MyGrafo->Nos[Pai[Menor]].ArViz->Insere(Menor,0);
+				}
+				catch(...)
+				{
+					continue;
+				}
+			}
+		}
+	}
+	catch(...)
+	{
+		return;
+	}
+};
+//---------------------------------------------------------------------------
+TArvore::~TArvore(){
+ delete Heap;
+};
+
+
diff --git a/src/terralib/stat/TeSkaterArvore.h b/src/terralib/stat/TeSkaterArvore.h
new file mode 100644
index 0000000..760d9de
--- /dev/null
+++ b/src/terralib/stat/TeSkaterArvore.h
@@ -0,0 +1,18 @@
+//---------------------------------------------------------------------------
+#ifndef ArvoreH
+#define ArvoreH
+#include "TeSkaterGrafo.h"
+#include "heap.h"
+
+class TArvore{
+  private:
+      THeap *Heap;
+      void  Prim(TSkaterGrafo *);
+  public:
+      ~TArvore();
+      void  Monta_Arvore(TSkaterGrafo *);
+
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/TeSkaterFunctions.cpp b/src/terralib/stat/TeSkaterFunctions.cpp
new file mode 100644
index 0000000..5fc2b01
--- /dev/null
+++ b/src/terralib/stat/TeSkaterFunctions.cpp
@@ -0,0 +1,414 @@
+//---------------------------------------------------------------------------
+#include <stdio.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+#include "TeSkaterGrafo.h"
+#include "TeSkaterArvore.h"
+#include "filaR.h"
+#include "filaDouble.h"
+#include "filaInt.h"
+#include "TeSkaterFunctions.h"
+#include <TeDefines.h>
+#include "TeAttribute.h"
+#include "TeUtils.h"
+#include "TeSTElementSet.h"
+
+
+
+class TParticao{
+private:
+  double*  BFS_Media(int,int,long*);
+  double  BFS_Desvio(int,int,double*);
+  double  Dist(int,double*);
+  void  BFS_Main(TFilaR::Item_ptr);//Raiz,Populacao,Desvio
+  TSkaterGrafo *Grafo;
+  long PopMin;
+  int Num_Grupos;
+public:
+  TFilaR *Clusters;
+  TParticao(TSkaterGrafo*);
+  ~TParticao();
+  TFilaDouble *QuedaDesv; 
+  void  Particiona(int,long);
+  void  BFS_Salva(TeSTElementSet& regSet, string name);
+};
+
+
+//---------------------------------------------------------------------------
+TParticao::TParticao(TSkaterGrafo *G){
+  Grafo=G;
+  QuedaDesv = new TFilaDouble;
+  Clusters = new TFilaR;
+  Clusters->Insere(0,TeMAXFLOAT,(long)TeMAXFLOAT);
+  Num_Grupos = 1;
+};
+
+//---------------------------------------------------------------------------
+TParticao::~TParticao(){
+  delete Clusters;
+};
+
+//---------------------------------------------------------------------------
+double*  TParticao::BFS_Media(int Raiz,int Exceto,long *Populacao){
+ double *Acc;
+ double Peso;// Usado na busca dos filhos
+ int Indice; // Usado na busca dos filhos
+ int i;
+ int n=0;
+ int Atual; // No sendo visitado
+ TFilaInt *Fila;
+
+ Acc = new double[Grafo->MyGrafo->Num_Var];
+ for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+   Acc[i] =0;
+ *Populacao = 0;
+
+ Fila = new TFilaInt;
+ Fila->Insere(Raiz);
+
+ while (Fila->Size()){
+   Atual = Fila->Retira();
+
+   /** Calculo da Media **/
+   n++;
+   for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+    Acc[i] += Grafo->MyGrafo->Nos[Atual].Variaveis[i];
+   *Populacao = *Populacao + Grafo->MyGrafo->Nos[Atual].Populacao;
+
+   /** Insere Filhos na Lista **/
+   Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+   while(Indice!=-1){
+      if (Indice != Exceto)
+        Fila->Insere(Indice);
+      Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+   };
+ };
+ for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+   Acc[i] /=n;
+
+ delete Fila;
+ return Acc;
+};
+//---------------------------------------------------------------------------
+
+double  TParticao::BFS_Desvio(int Raiz,int Exceto,double *Media){
+ double Acc=0;
+ double Peso;// Usado na busca dos filhos
+ int Indice; // Usado na busca dos filhos
+ int Atual; // No sendo visitado
+ TFilaInt *Fila;
+
+ Fila = new TFilaInt;
+ Fila->Insere(Raiz);
+
+ while (Fila->Size()){
+   Atual = Fila->Retira();
+
+   /** Calculo do desvio **/
+   Acc += Dist(Atual,Media);
+
+   /** Insere Filhos na Lista **/
+   Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+   while(Indice != -1){
+      if (Indice != Exceto)
+        Fila->Insere(Indice);
+      Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+   };
+ };
+ return Acc;
+};
+
+//---------------------------------------------------------------------------
+double  TParticao::Dist(int Atual,double *Media){
+  int i;
+  double Acc=0;
+
+  for(i=0;i<Grafo->MyGrafo->Num_Var;i++)
+    Acc += (Grafo->MyGrafo->Nos[Atual].Variaveis[i] - Media[i]) *
+           (Grafo->MyGrafo->Nos[Atual].Variaveis[i] - Media[i]);
+  return Acc;
+};
+
+//---------------------------------------------------------------------------
+
+void  TParticao::BFS_Main(TFilaR::Item_ptr Item){//Raiz,Populacao,Desvio
+ //int i=0;
+ int Atual; // No sendo visitado
+ double Peso;// Usado na busca dos filhos
+ int Indice=0; // Usado na busca dos filhos
+ double *M1,*M2,D1,D2;
+ long Pop1,Pop2;
+ double D_Min = TeMAXFLOAT;
+ double DMin1;
+ double DMin2;
+ long Raiz1,PopMin1;
+ long Raiz2,PopMin2;
+ TFilaInt *Fila;
+
+ if (!Item->Desvio) return;
+
+ Fila = new TFilaInt;
+ Fila->Insere(Item->Raiz);
+
+ M1 = new double[Grafo->MyGrafo->Num_Var];
+ M2 = new double[Grafo->MyGrafo->Num_Var];
+
+ while (Fila->Size()){
+   Atual = Fila->Retira();
+    //i++;
+   /* Insere Filhos na fila */
+     Grafo->MyGrafo->Nos[Atual].ArViz->AdjacenteB(&Indice,&Peso);
+     while (Indice != -1){
+      Fila->Insere(Indice);
+      M1 = BFS_Media(Indice,0,&Pop1);
+      D1 = BFS_Desvio(Indice,0,M1);
+
+      M2 = BFS_Media(Item->Raiz,Indice,&Pop2);
+      D2 = BFS_Desvio(Item->Raiz,Indice,M2);
+      if (((D1+D2) < D_Min) && (Pop1 > PopMin) && (Pop2 > PopMin)) { //encontrou um minimo
+           D_Min = (D1+D2);
+           Raiz1 = Indice;
+           Raiz2 = Atual;
+           PopMin1 = Pop1;
+           PopMin2 = Pop2;
+           DMin1 = D1;
+           DMin2 = D2;
+      };
+      Grafo->MyGrafo->Nos[Atual].ArViz->AdjacenteB(&Indice,&Peso);
+     };
+   };
+   /*Atualizacao dos dados*/
+if (D_Min != TeMAXFLOAT){
+   Item->D1 = DMin1;
+   Item->D2 = DMin2;
+   Item->P1 = PopMin1;
+   Item->P2 = PopMin2;
+   Item->R1 = Raiz1;
+   Item->R2 = Raiz2;
+   Item->Queda = Item->Desvio - DMin1 - DMin2;
+ } else
+   Item->Desvio = 0;
+
+   delete Fila;
+   delete M1;
+   delete M2;
+};
+
+//---------------------------------------------------------------------------
+void  TParticao::Particiona(int N_Grp,long Pop){
+  int i;
+  int Raiz;
+  int Sai;
+  double QMax;
+  int R1,R2;
+  double D1,D2;
+  long P1,P2;
+  TFilaR::Item_ptr Item;
+  double Acc;
+
+  PopMin = Pop;
+
+  if (Pop == -1){ // Nao levar em conta populacao
+    while (N_Grp != Num_Grupos){
+      Item = Clusters->mFila->Head;
+      for(i=0;i<Clusters->mFila->Size;i++){
+        if (!Item->Queda) BFS_Main(Item);
+        Item = Item->Proximo;
+      };
+      Item = Clusters->mFila->Head;
+      QMax = 0;
+      for(i=0;i<Clusters->mFila->Size;i++){
+        if (Item->Queda > QMax){
+          QMax = Item->Queda;
+          Raiz = Item->Raiz;
+          R1 = Item->R1;
+          R2 = Item->R2;
+          D1 = Item->D1;
+          D2 = Item->D2;
+          P1 = Item->P1;
+          P2 = Item->P2;
+        };
+        Item = Item->Proximo;
+      };
+     Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1);
+     Num_Grupos++;
+     Clusters->Insere(R1,D1,P1);
+     Clusters->Retira(Raiz);
+     Clusters->Insere(Raiz,D2,P2);
+     Acc = 0;
+     while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio;
+     QuedaDesv->Insere(Acc);
+    };
+  } else
+    if (N_Grp == 0)
+  {
+    Sai=0;
+    while (!Sai){
+      Item = Clusters->mFila->Head;
+      for(i=0;i<Clusters->mFila->Size;i++){
+        if (!Item->Queda) BFS_Main(Item);
+        Item = Item->Proximo;
+      };
+
+      Item = Clusters->mFila->Head;
+      QMax = 0;
+      Sai = 1;
+      for(i=0;i<Clusters->mFila->Size;i++){
+        if (Item->Desvio) Sai = 0;
+        if (Item->Queda > QMax){
+          QMax = Item->Queda;
+          Raiz = Item->Raiz;
+          R1 = Item->R1;
+          R2 = Item->R2;
+          D1 = Item->D1;
+          D2 = Item->D2;
+          P1 = Item->P1;
+          P2 = Item->P2;
+        };
+        Item = Item->Proximo;
+      };
+     if (!Sai){
+       Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1);
+       Num_Grupos++;
+       Clusters->Insere(R1,D1,P1);
+       Clusters->Retira(Raiz);
+       Clusters->Insere(Raiz,D2,P2);
+       Acc = 0;
+       while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio;
+       QuedaDesv->Insere(Acc);
+      };
+    };//while
+  } else { // Grupos com populacao restringida
+    Sai=0;
+    while (!Sai){
+      Item = Clusters->mFila->Head;
+      for(i=0;i<Clusters->mFila->Size;i++){
+        if (!Item->Queda) BFS_Main(Item);
+        Item = Item->Proximo;
+      };
+
+      Item = Clusters->mFila->Head;
+      QMax = 0;
+      Sai = 1;
+      for(i=0;i<Clusters->mFila->Size;i++){
+        if (Item->Desvio) Sai = 0;
+        if (Item->Queda > QMax){
+          QMax = Item->Queda;
+          Raiz = Item->Raiz;
+          R1 = Item->R1;
+          R2 = Item->R2;
+          D1 = Item->D1;
+          D2 = Item->D2;
+          P1 = Item->P1;
+          P2 = Item->P2;
+        };
+        Item = Item->Proximo;
+      };
+     if (!Sai){
+       Grafo->MyGrafo->Nos[R2].ArViz->Retira(R1);
+       Num_Grupos++;
+       Clusters->Insere(R1,D1,P1);
+       Clusters->Retira(Raiz);
+       Clusters->Insere(Raiz,D2,P2);
+       Acc = 0;
+       while (Clusters->Proximo() != -1) Acc += Clusters->mFila->Atual->Desvio;
+       QuedaDesv->Insere(Acc);
+       if (Num_Grupos >= N_Grp) Sai = 1;
+      };
+    };//while
+ }//else
+};
+//---------------------------------------------------------------
+
+void  TParticao::BFS_Salva(TeSTElementSet& regSet, string name){
+ double Peso;// Usado na busca dos filhos
+ int Indice; // Usado na busca dos filhos
+ int Atual; // No sendo visitado
+ int i=1;
+ TFilaInt *Fila;
+ int Raiz;
+
+ TeProperty prop;
+ prop.attr_.rep_.name_ = name;
+ prop.attr_.rep_.type_ = TeREAL;
+
+ Raiz=Clusters->Proximo();
+ while (Raiz != -1){
+
+   prop.value_ = Te2String(i);
+
+   Fila = new TFilaInt;
+   Fila->Insere(Raiz);
+
+   while (Fila->Size()){
+     Atual = Fila->Retira();
+
+     /** Insere Filhos na Lista **/
+     Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+     while(Indice != -1){
+        Fila->Insere(Indice);
+        Grafo->MyGrafo->Nos[Atual].ArViz->Adjacente(&Indice,&Peso);
+     };
+     regSet.addProperty(Grafo->MyGrafo->Nos[Atual].Label, prop);
+   }
+   i++;
+   Raiz=Clusters->Proximo();
+  }
+}
+
+
+
+bool TeSkaterFunction(bool hasPop, int tipo, int nGrupos, int popMin,
+                      TeSTElementSet& regSet, string name,
+                      vector<double>& hetDrop) {
+  
+	TParticao *Particao = 0;
+	try
+	{
+		//Monta grafo a partir do conjunto 
+	  TSkaterGrafo g(hasPop);
+	  if (!g.MontaGrafo(regSet)) {
+		return false;
+	  }
+
+	  TArvore* a = new TArvore();
+	  a->Monta_Arvore(&g);
+	  delete a;
+
+  
+	  Particao = new TParticao(&g);
+	  switch (tipo) {
+	  case SKATER_POR_GRUPO:
+		 Particao->Particiona(nGrupos,-1);
+		 break;
+	  case SKATER_POR_POPULACAO:
+		 Particao->Particiona(0,popMin);
+		 break;
+	  case SKATER_POR_AMBOS:
+		 Particao->Particiona(nGrupos,popMin);
+		 break;
+	  }
+
+	  Particao->BFS_Salva(regSet, name);
+
+	  //Copia as quedas a partir do numero de grupos para hetDrop,
+	  //comecando do menor
+	  hetDrop.clear();
+	  int size = Particao->QuedaDesv->Size();
+	  for (int gr = 0; gr < size; gr++) {
+		double het = Particao->QuedaDesv->Retira();
+		hetDrop.push_back(het);
+	  }
+	  delete Particao;
+	}
+	catch(...)
+	{
+		if(Particao)
+			delete Particao;
+
+		return false;
+	}
+
+  return true;
+}
diff --git a/src/terralib/stat/TeSkaterFunctions.h b/src/terralib/stat/TeSkaterFunctions.h
new file mode 100644
index 0000000..1e47d90
--- /dev/null
+++ b/src/terralib/stat/TeSkaterFunctions.h
@@ -0,0 +1,32 @@
+//---------------------------------------------------------------------------
+#ifndef ParticaoH
+#define ParticaoH
+
+
+
+#define SKATER_SEM_POPULACAO 0
+#define SKATER_COM_POPULACAO 1
+
+
+#define SKATER_POR_GRUPO     0
+#define SKATER_POR_POPULACAO 1
+#define SKATER_POR_AMBOS     2
+
+#include <string>
+#include <vector>
+using namespace std;
+
+/** Funcao de regionalizacao de um conjunto de poligonos
+ *  hasPop: se ha atributo de populacao, que devera ser o ultimo
+ *  tipo:   tipo de quebra, por grupo, por populacao ou por ambos
+ *  nGrupos: numero de grupos de quebra
+ *  popMin:  tamanho minimo da populacao
+ *  regSet:  conjunto de areas a serem regionalizadas, com seus atributos
+ *  hetDrop: heterogeneidade dado cada uma das divisoes
+ **/
+bool TeSkaterFunction(bool hasPop, int tipo, int nGrupos, int popMin,
+                      TeSTElementSet& regSet, string resName,
+                      vector<double>& hetDrop); 
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/TeSkaterGrafo.cpp b/src/terralib/stat/TeSkaterGrafo.cpp
new file mode 100644
index 0000000..c6f9cb3
--- /dev/null
+++ b/src/terralib/stat/TeSkaterGrafo.cpp
@@ -0,0 +1,188 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#include <math.h>
+#include <string.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "TeSkaterGrafo.h"
+#include "lista.h"
+#include "TeProxMatrixConstructionStrategy.h"
+#include "TeGeneralizedProxMatrix.h"
+#include "TeSTElementSet.h"
+
+
+TSkaterGrafo::TSkaterGrafo(bool hasPop){
+
+   MyGrafo= new MyGrafo_t;
+   MyGrafo->Nos = (Grafo_ptr) malloc(sizeof(Grafo_t));
+   MyGrafo->Size = 0;
+   Hash = new THash;
+   Tem_Pop = (hasPop) ? 1 : 0;
+};
+
+
+/*************************/
+int TSkaterGrafo::GetSize(){
+
+  return MyGrafo->Size; //Retorna o tamanho do grafo
+};
+
+
+/*************************/
+/*************************/
+
+bool  TSkaterGrafo::MontaGrafo(TeSTElementSet& regSet) {
+
+//  long nAreas = regSet.numElements();
+
+  TeSTElementSet::iterator it = regSet.begin(); 
+  int  nCov   = (*it).getPropertyVector().size();
+
+
+  //Monta lista de areas
+
+  TeCoord2D centroid;
+  (*it).centroid(centroid);
+  X_min=X_max=centroid.x();
+  Y_min=Y_max=centroid.y();
+  //Obtem o numero de variaveis --> se tem populacao e menos um
+  if (this->Tem_Pop)
+          MyGrafo->Num_Var = nCov-1; //Obtem o numero de variaveis
+  else
+          MyGrafo->Num_Var = nCov;
+
+  string val;
+  int i;
+
+  //Monta areas
+  while (it != regSet.end()) 
+  {
+		(*it).centroid(centroid);    
+		MyGrafo->Nos = 
+		  (Grafo_ptr) realloc(MyGrafo->Nos,sizeof(Grafo_t)*((MyGrafo->Size)+1));
+		sprintf(MyGrafo->Nos[MyGrafo->Size].Label,"%s",(*it).objectId().c_str());
+		MyGrafo->Nos[MyGrafo->Size].Vizinhos = NULL;
+		MyGrafo->Nos[MyGrafo->Size].ArViz = NULL;
+		Hash->Insere(MyGrafo->Nos[MyGrafo->Size].Label,MyGrafo->Size);
+		MyGrafo->Nos[MyGrafo->Size].X = centroid.x();
+		if(centroid.x() < X_min) X_min =centroid.x();// Procura limites da tela
+		else if(centroid.x() > X_max) X_max = centroid.x();
+    
+		MyGrafo->Nos[MyGrafo->Size].Y =centroid.y();
+		if(centroid.y()< Y_min) Y_min = centroid.y(); //Procura limites da tela
+		else if(centroid.y() > Y_max) Y_max = centroid.y();
+    
+		MyGrafo->Nos[MyGrafo->Size].Variaveis = 
+		  (double *) malloc(sizeof(double)*MyGrafo->Num_Var);
+		for(i=0;i<MyGrafo->Num_Var;i++) {
+		  (*it).getPropertyValue(val, i);
+		  MyGrafo->Nos[MyGrafo->Size].Variaveis[i] = atof(val.c_str()); 
+		}
+		if (Tem_Pop) {
+		  (*it).getPropertyValue(val, MyGrafo->Num_Var);
+		  MyGrafo->Nos[MyGrafo->Size].Populacao = (int)atof(val.c_str());//covs[a*nCov+nCov-1];
+		}
+		else
+		  MyGrafo->Nos[MyGrafo->Size].Populacao = 0;
+    
+		MyGrafo->Nos[MyGrafo->Size].Mark=1;
+		(MyGrafo->Size)++;
+		(++it);
+  }
+
+
+  //Monta vizinhanca
+   //Monta matriz de vizinhanca
+	TeProxMatrixLocalAdjacencyStrategy matrix(&regSet, TePOLYGONS);         
+	TeGeneralizedProxMatrix neighMatrix(&matrix);
+
+  int L_indice,V_indice;
+  double dist;
+
+  it = regSet.begin();
+	
+	while ( it != regSet.end())
+	{
+		TeNeighboursMap	neighbors = neighMatrix.getMapNeighbours((*it).objectId());
+
+		//Grafo eh desconexo
+		if (neighbors.size() == 0) 
+		{
+		  delete Hash;
+		  return false;
+		}
+
+		L_indice = Hash->Pesquisa((*it).objectId().c_str());
+		MyGrafo->Nos[L_indice].Vizinhos = new TListaVizinho;
+		MyGrafo->Nos[L_indice].ArViz = new TListaVizinho;
+
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+	 			
+		while(itNeigs != neighbors.end())
+		{
+     
+		   V_indice = Hash->Pesquisa(((*itNeigs).first).c_str());
+		   dist = Distancia(L_indice,V_indice);
+		   MyGrafo->Nos[L_indice].Vizinhos->Insere(V_indice,dist);
+		   (++itNeigs);
+		}
+		(++it);
+	}
+
+  delete Hash;
+  return true;
+}
+
+
+/*************************/
+double TSkaterGrafo::Distancia(int L_indice, int V_indice){
+
+   int i;
+   double Acc=0;
+
+   for(i=0;i < MyGrafo->Num_Var;i++)
+      Acc += (MyGrafo->Nos[L_indice].Variaveis[i] - MyGrafo->Nos[V_indice].Variaveis[i]) *
+             (MyGrafo->Nos[L_indice].Variaveis[i] - MyGrafo->Nos[V_indice].Variaveis[i]);
+   return sqrt(Acc);
+};
+
+//-------------------------------------
+void  TSkaterGrafo::Escalona(double *X, double *Y){
+  *X = Cx *(*X + Gamax);
+  *Y = Cy *(*Y + Gamay);
+};
+
+/***************************/
+//Retorna o Indice e o peso do proximo Vizinho -1 se nao houver mais vizinhos
+void  TSkaterGrafo::Adjacente(int *Indice,double *Peso,int i){
+   MyGrafo->Nos[i].Vizinhos->Adjacente(Indice,Peso);
+};
+
+void  TSkaterGrafo::Adjacente1(int *Indice,double *Peso,int i){
+   MyGrafo->Nos[i].ArViz->Adjacente(Indice,Peso);
+};
+
+//--------------------------------------------------------
+void  TSkaterGrafo::Escala(int Altura,int Largura){
+
+  Cx = (Largura - 2*(RAIO))/(X_max-X_min);
+  Gamax = -RAIO/Cx - X_min;
+
+  Cy = (Altura - 2*(RAIO))/(Y_max-Y_min);
+  Gamay = -RAIO/Cy - Y_min;
+};
+//--------------------------------------------------------
+double  TSkaterGrafo::Get_X(int Indice){
+   return MyGrafo->Nos[Indice].X;
+};
+
+//--------------------------------------------------------
+double  TSkaterGrafo::Get_Y(int Indice){
+   return MyGrafo->Nos[Indice].Y;
+};
+//---------------------------------------------
+int  TSkaterGrafo::GetNum_Var(){
+  return MyGrafo->Num_Var;
+};
diff --git a/src/terralib/stat/TeSkaterGrafo.h b/src/terralib/stat/TeSkaterGrafo.h
new file mode 100644
index 0000000..7ae0304
--- /dev/null
+++ b/src/terralib/stat/TeSkaterGrafo.h
@@ -0,0 +1,75 @@
+#include "hash.h"
+#include "lista.h"
+#define RAIO 4
+//---------------------------------------------------------------------------
+#ifndef GrafoH
+#define GrafoH
+//---------------------------------------------------------------------------
+
+class TeSTElementSet;
+
+class TSkaterGrafo {
+
+public:
+
+    typedef struct No_Grafo{
+      char Label[50];
+      double X;
+      double Y;
+      TListaVizinho *Vizinhos;
+      TListaVizinho *ArViz;
+      double *Variaveis;
+      int Populacao;
+      char Mark;
+    } Grafo_t, *Grafo_ptr;
+
+    typedef struct Grafo{
+       Grafo_ptr Nos;
+       int Num_Var;
+       int Size;
+    }MyGrafo_t,*MyGrafo_ptr;
+
+/**** Funcoes Publicas ****/
+ TSkaterGrafo(bool hasPop);
+ bool  MontaGrafo(TeSTElementSet& regSet);
+ void  Escalona(double *,double *);
+ void  Escala(int,int);
+ void  Adjacente(int *,double *,int i);
+ void  Adjacente1(int *,double *,int i);
+ int Size() {return GetSize();}
+ double MinX() {return X_min;}
+ double MaxX() {return X_max;}
+ double MinY() {return Y_min;}
+ double MaxY() {return Y_max;}
+ double Coord_X(int Indice){return Get_X(Indice);}
+ double Coord_Y(int Indice) {return Get_Y(Indice);}
+ int Num_Var() {return GetNum_Var();}
+
+
+ /***** Area Privada *****/
+private:
+    MyGrafo_ptr MyGrafo;
+    THash *Hash;
+    double X_min,X_max;//Usado para conversao de escala
+    double Y_min,Y_max;//Usado para conversao de escala
+    double Cx,Gamax;   //Usados na conversao de escala
+    double Cy,Gamay;   //Usados na conversao de escala
+
+    double  Distancia(int,int);
+    double  Get_X(int Indice);
+    double  Get_Y(int Indice);
+    int GetSize();
+    int  GetNum_Var();
+
+     //Variaveis que sao inicializadas de fora
+    char *NArq;
+    char *NViz;
+    char Tem_Pop;
+
+    friend class TArvore;
+    friend class TParticao;
+    friend class TPrincipal;
+    friend class TEstatistica;
+};
+
+#endif
diff --git a/src/terralib/stat/TeSpatialStatistics.cpp b/src/terralib/stat/TeSpatialStatistics.cpp
new file mode 100644
index 0000000..5baf107
--- /dev/null
+++ b/src/terralib/stat/TeSpatialStatistics.cpp
@@ -0,0 +1,987 @@
+#include "TeSpatialStatistics.h"
+#include "TeLayer.h"
+#include "TeGeneralizedProxMatrix.h"
+#include "TeSTEvent.h"
+#include "TeSTElementSet.h"
+#include "TeStatistics.h"
+#include "TeProgress.h"
+
+
+bool 
+TeLocalMean (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+	
+	TeSTEventSet::iterator itObjs = elemSet->begin();
+	double numberNeighbors;
+
+	while (itObjs != elemSet->end())
+	{
+		double sum = 0.;
+		double localMean = 0.;
+
+		TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+		numberNeighbors = neighbors.size();
+		
+		while(itNeigs != neighbors.end())
+		{
+			//retrieve the neighbor attribute value
+			double val;
+			if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+				return false;
+						
+			// find the weight associated with the neighbor (attribute of index 0)
+			double weight = (*itNeigs).second.Weight();
+
+			sum +=  weight * val;  
+			++itNeigs;
+		}
+
+		localMean = sum;
+		
+		TeAttributeRep rep;
+		rep.name_ = "LocalMean";
+		rep.type_ = TeREAL;
+		(*itObjs).addProperty(localMean, rep, false);
+		
+		rep.name_  = "NumNeighbors";
+		rep.type_ = TeINT;
+		(*itObjs).addProperty((double)numberNeighbors, rep, false);
+		
+		++itObjs;
+	}
+
+	return true;
+}
+
+double
+TeMoranIndex2 (TeSTEventSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+	double moran = 0;
+	TeSTEventSet::iterator itObjs = elemSet->begin();
+	int numberObjs = elemSet->numSTInstance();
+
+	while ( itObjs != elemSet->end())
+	{
+		double normObjVal = (*itObjs)[indexAttr] - mean;
+		double li = 0.;
+		double weightSum = 0.;
+
+		
+		TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+		while(itNeigs != neighbors.end())
+		{
+			//retrieve the neighbor attribute value
+			double val;
+			if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+				return 0.;
+									
+			 // normalize the property
+			double normNeighVal =  val - mean;
+
+			// find the weight associated with the neighbor (attribute of index 0)
+			double weight = (*itNeigs).second.Weight();
+			li +=  weight * ( normNeighVal )  * ( normObjVal );  // se dividir pela vari�ncia � o �ndice local de moran
+			weightSum += weight;
+			++itNeigs;
+		}
+
+		if (weightSum != 0.)
+			li /= weightSum;
+		
+
+		moran += li;
+
+		++itObjs;
+	}
+
+	if ( numberObjs > 1 )
+		return moran /  ( var * ( numberObjs - 1 ) );
+	else 
+		return moran / var;
+}
+
+double
+TeMoranIndex (TeSTEventSet* elemSet, int indexZ, int indexWZ)
+{
+	double variance = 0.;
+	double sum = 0;
+	int number = 0;
+
+	variance = TeSecondMoment (elemSet->begin(), elemSet->end(), 0, indexZ);  
+	TeSTEventSet::iterator it = elemSet->begin();
+	
+	while (it != elemSet->end())
+	{
+		double z = (*it)[indexZ];
+		double wz = (*it)[indexWZ];
+		double ZxWZ;
+		if(variance==0)
+			ZxWZ = 0.;
+		else
+			ZxWZ = (z*wz)/variance; 
+
+		//keep 
+		TeAttributeRep rep;
+		rep.name_ = "MoranIndex"; 
+		rep.type_ = TeREAL;
+		(*it).addProperty(ZxWZ, rep, false); 
+		
+		sum += ZxWZ;
+		number++; 
+		++it; 
+	}
+	
+	return sum /= number;
+}
+
+double
+TeGlobalMoranSignificance (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+						   unsigned int permutationsNumber, double moranIndex)
+{
+	
+	vector<double> permutationsResults(permutationsNumber);
+	double significance;
+	
+	unsigned int objectsNumber = elemSet->numSTInstance();
+	
+	//progress bar
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(permutationsNumber);
+		
+	vector<double> deviations(objectsNumber);
+	vector<double>::iterator itDev = deviations.begin();
+	TeSTEventSet::iterator itObjs = elemSet->begin();
+	while(itObjs != elemSet->end())
+	{
+		(*itDev) = (*itObjs)[indexAttr]; //attribute value
+		++itObjs;
+		++itDev;
+	}
+
+	TeStatisticValMap stat;
+	if(!TeCalculateStatistics(elemSet->begin(), elemSet->end(), stat, 0))
+		return 0.;
+
+	double mean = stat[TeMEAN];
+	double var = stat[TeVARIANCE];
+	
+	srand(time(0));
+	unsigned int i;
+	for (i = 0; i < permutationsNumber; i++)
+	{
+		TeSTEventSet changedObjects;
+
+		itObjs = elemSet->begin();
+
+		// chande values 
+		while(itObjs != elemSet->end())
+		{
+			TeSTEvent stoChange; 
+			stoChange.objectId((*itObjs).objectId());
+			
+			double ranaux = rand();
+			int randon = (int) ((ranaux * (objectsNumber-1))/RAND_MAX );
+			double value = deviations[randon];
+						
+			stoChange.addProperty(value);
+			
+			changedObjects.insertSTInstance (stoChange);
+			++itObjs;
+		}
+		
+		permutationsResults[i] = TeMoranIndex2 (&changedObjects, mean, var, proxMatrix, 0);
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return 0.;
+			}
+			else
+				TeProgress::instance()->setProgress(i);
+		}
+	}
+
+	// verify the significance
+	int position = 0;
+	significance = 0;
+	unsigned int k;
+	for (k = 0; k < permutationsNumber; k++)
+	{
+		if (moranIndex < permutationsResults[k]) //>
+			position++;
+	}
+	if ( moranIndex >= 0)
+		significance = (double) (position+1) / (permutationsNumber+1);
+	else
+		significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+		
+	
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+		
+	return significance;
+}
+
+
+void
+TeMoranMap (TeSTEventSet* elemSet, int indexLISAMap, int indexBoxMap)
+{
+	TeSTEventSet::iterator it = elemSet->begin();
+	while ( it != elemSet->end())
+	{
+		double result = 0.0;
+		int lisaMap = (int)((*it)[indexLISAMap]);
+
+		if (lisaMap != 0)
+			result = (*it)[indexBoxMap];
+				
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "MoranMap"; 
+		rep.type_ = TeREAL;
+		(*it).addProperty(result, rep, false); 
+
+		++it;
+	}
+}
+
+bool 
+TeGStatistics (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+
+	TeSTEventSet::iterator itObjs = elemSet->begin();
+	double totalSum = 0.;
+	double excludSum = 0.;
+
+	totalSum = TeSum(itObjs, elemSet->end(), indexAttr);
+	
+	itObjs = elemSet->begin();
+
+	//progress bar
+	int step = 0;
+	int numSteps = elemSet->numSTInstance();
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(numSteps);
+
+	while ( itObjs != elemSet->end() )
+	{
+		double valObj = (*itObjs)[indexAttr];
+		excludSum = totalSum - valObj;
+		
+		double G = 0;
+		double GStar = valObj;
+	
+		TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+		int neigNumber = neighbors.size();
+
+		if(itNeigs != neighbors.end())
+		{
+			while(itNeigs != neighbors.end())
+			{
+				// retrieve the property value associated to this neighbor 
+				double val;
+				if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+					return false;
+
+				G +=  val;
+				GStar +=  val;
+				
+				++itNeigs;
+			}
+
+			G /= neigNumber;
+			GStar /= (neigNumber+1);
+				
+			G /= excludSum; 
+			GStar /= totalSum;
+		}
+	
+		//insert the indexes in the sET
+		TeAttributeRep rep;
+		rep.name_ = "G"; 
+		rep.type_ = TeREAL;
+		(*itObjs).addProperty(G, rep, false); 
+
+		rep.name_ = "GStar";
+		(*itObjs).addProperty(GStar, rep, false); 
+
+		++itObjs;
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+	}
+	
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+void
+TeBoxMap (TeSTEventSet* elemSet, int indexZ, int indexWZ, double mean)
+{
+	
+	TeSTEventSet::iterator it_begin = elemSet->begin(); 
+	while ( it_begin != elemSet->end())
+	{
+		int result=0;
+
+		if ( ((*it_begin)[indexZ] >= mean) &&  ((*it_begin)[indexWZ] >= mean))   
+			result = 1;
+		else if ( ((*it_begin)[indexZ] < mean)  &&  ((*it_begin)[indexWZ] >= mean))	
+			result = 4;	
+		else if ( ((*it_begin)[indexZ] < mean)  &&  ((*it_begin)[indexWZ] < mean))
+			result = 2;		
+		else if ( ((*it_begin)[indexZ] >= mean) &&  ((*it_begin)[indexWZ] < mean))
+			result = 3;
+
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "BoxMap"; 
+		rep.type_ = TeINT;
+		(*it_begin).addProperty((double)result, rep, false); 
+
+		++it_begin;
+	}	
+}
+
+bool TeLisaStatisticalSignificance ( TeSTEventSet* elemSet, int indexZ, int indexLISA, 
+									 int indexNeighNum, int permutationsNumber) 
+ {
+	double sum;
+	double WZperm;
+	double significance;
+
+	TeSTEventSet::iterator it = elemSet->begin();
+
+	double variance = TeSecondMoment (it, elemSet->end(), 0, indexZ);
+
+	int index = 0;
+	it = elemSet->begin();
+	int objectsNumber = elemSet->numSTInstance();
+
+	//progress bar
+	int step = 0;
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(objectsNumber);
+
+	vector<double> deviations(objectsNumber);
+	vector<double>::iterator it_dev = deviations.begin();
+	while(it != elemSet->end())
+	{
+		(*it_dev) = (*it)[indexZ];
+		++it;
+		++it_dev;
+	}
+	
+	srand(time(0));
+	it = elemSet->begin();
+	
+
+	while ( it != elemSet->end())
+	{
+		int neighborsNumber = (int)((*it)[indexNeighNum]);
+
+		vector<double> permut(permutationsNumber);
+		for (int j = 0; j < permutationsNumber; j++)
+		{
+			int randon = 0;
+			sum = 0;
+			set<int> setNeigh;
+			for (int k = 0; k < neighborsNumber; k++)
+			{
+				double ranaux = rand();
+				randon = (int)((ranaux * (objectsNumber-1))/RAND_MAX);
+				if (index == randon || (setNeigh.find(randon) != setNeigh.end()) )
+					k--;	// raffle annulled	
+				else
+				{		
+					setNeigh.insert(randon);
+					sum += deviations[randon];
+				}
+			}
+
+			if(neighborsNumber==0)
+				WZperm = 0.;
+			else
+				WZperm = sum/neighborsNumber;
+
+			if(variance==0)
+				permut[j] = 0.;
+			else
+				permut[j] = deviations[index] * WZperm / variance;
+		}	
+
+		int position = 0;
+		for (int k = 0; k < permutationsNumber; k++)
+		{
+			if (((*it)[indexLISA]) > permut[k])
+				position++;
+		}
+ 		if ( ((*it)[indexLISA]) >= 0)
+			significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+		else
+			significance = (double) position/( permutationsNumber + 1 );
+			
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "LISASig"; 
+		rep.type_ = TeREAL;
+		(*it).addProperty(significance, rep, false); 
+
+		++it;
+		++index;
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+	}
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	return true;
+}
+
+
+void
+TeLisaMap (TeSTEventSet* elemSet, int indexSignifLISA, int /* permutationNumber */)
+{
+	TeSTEventSet::iterator begin = elemSet->begin();
+	while (begin != elemSet->end())
+	{
+		int significanceClass = 0;
+		if ( ( (*begin)[indexSignifLISA] <= 0.001 ))  /*&& (permutationNumber >= 999)*/ 
+			significanceClass = 3;
+		else if ( ((*begin)[indexSignifLISA] <= 0.01) && ((*begin)[indexSignifLISA] > 0.001 )) /*&& (permutationNumber >= 99)*/ 
+			significanceClass = 2;
+		else if ( ((*begin)[indexSignifLISA] <= 0.05) && ((*begin)[indexSignifLISA] > 0.01))
+			significanceClass = 1;
+
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "LISAMap"; 
+		rep.type_ = TeINT;
+		(*begin).addProperty((double)significanceClass, rep, false); 
+
+		++begin;
+	}
+}
+
+//-------------------- using TeSTElementSet
+//-------------------- not templated because Visual C++ 6.0
+
+bool 
+TeLocalMean (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+	
+	TeSTElementSet::iterator itObjs = elemSet->begin();
+	double numberNeighbors;
+
+	while (itObjs != elemSet->end())
+	{
+		double sum = 0.;
+		double localMean = 0.;
+
+		TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+		numberNeighbors = neighbors.size();
+		
+		while(itNeigs != neighbors.end())
+		{
+			//retrieve the neighbor attribute value
+			double val;
+			if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+				return false;
+						
+			// find the weight associated with the neighbor (attribute of index 0)
+			double weight = (*itNeigs).second.Weight();
+
+			sum +=  weight * val;  
+			++itNeigs;
+		}
+
+		localMean = sum;
+		
+		TeAttributeRep rep;
+		rep.name_ = "LocalMean";
+		rep.type_ = TeREAL;
+		(*itObjs).addProperty(localMean, rep, false);
+		
+		rep.name_  = "NumNeighbors";
+		rep.type_ = TeINT;
+		(*itObjs).addProperty((double)numberNeighbors, rep, false);
+		
+		++itObjs;
+	}
+
+	return true;
+}
+
+double
+TeMoranIndex2 (TeSTElementSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+	double moran = 0;
+	TeSTElementSet::iterator itObjs = elemSet->begin();
+	int numberObjs = elemSet->numSTInstance();
+
+	while ( itObjs != elemSet->end())
+	{
+		double normObjVal = (*itObjs)[indexAttr] - mean;
+		double li = 0.;
+		double weightSum = 0.;
+
+		
+		TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+
+		while(itNeigs != neighbors.end())
+		{
+			//retrieve the neighbor attribute value
+			double val;
+			if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+				return 0.;
+									
+			 // normalize the property
+			double normNeighVal =  val - mean;
+
+			// find the weight associated with the neighbor (attribute of index 0)
+			double weight = (*itNeigs).second.Weight();
+			li +=  weight * ( normNeighVal )  * ( normObjVal );  // se dividir pela vari�ncia � o �ndice local de moran
+			weightSum += weight;
+			++itNeigs;
+		}
+
+		if (weightSum != 0.)
+			li /= weightSum;
+		
+
+		moran += li;
+
+		++itObjs;
+	}
+
+	if ( numberObjs > 1 )
+		return moran /  ( var * ( numberObjs - 1 ) );
+	else 
+		return moran / var;
+}
+
+double
+TeMoranIndex (TeSTElementSet* elemSet, int indexZ, int indexWZ)
+{
+	double variance = 0.;
+	double sum = 0;
+	int number = 0;
+
+	variance = TeSecondMoment (elemSet->begin(), elemSet->end(), 0, indexZ);  
+	TeSTElementSet::iterator it = elemSet->begin();
+	
+	while (it != elemSet->end())
+	{
+		double z = (*it)[indexZ];
+		double wz = (*it)[indexWZ];
+		double ZxWZ;
+		if(variance==0)
+			ZxWZ = 0.;
+		else
+			ZxWZ = (z*wz)/variance; 
+
+		//keep 
+		TeAttributeRep rep;
+		rep.name_ = "MoranIndex"; 
+		rep.type_ = TeREAL;
+		(*it).addProperty(ZxWZ, rep, false); 
+		
+		sum += ZxWZ;
+		number++; 
+		++it; 
+	}
+	
+	return sum /= number;
+}
+
+double
+TeGlobalMoranSignificance (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+						   unsigned int permutationsNumber, double moranIndex)
+{
+	
+	vector<double> permutationsResults(permutationsNumber);
+	double significance;
+	
+	unsigned int objectsNumber = elemSet->numSTInstance();
+	
+	//progress bar
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(permutationsNumber);
+		
+	vector<double> deviations(objectsNumber);
+	vector<double>::iterator itDev = deviations.begin();
+	TeSTElementSet::iterator itObjs = elemSet->begin();
+	while(itObjs != elemSet->end())
+	{
+		(*itDev) = (*itObjs)[indexAttr]; //attribute value
+		++itObjs;
+		++itDev;
+	}
+
+	TeStatisticValMap stat;
+	if(!TeCalculateStatistics(elemSet->begin(), elemSet->end(), stat, 0))
+		return 0.;
+
+	double mean = stat[TeMEAN];
+	double var = stat[TeVARIANCE];
+
+	srand(time(0));	
+	unsigned int i;
+	for (i = 0; i < permutationsNumber; i++)
+	{
+		TeSTElementSet changedObjects;
+
+		itObjs = elemSet->begin();
+
+		// chande values 
+		while(itObjs != elemSet->end())
+		{
+			TeSTInstance stoChange; 
+			stoChange.objectId((*itObjs).objectId());
+
+			double ranaux = rand();
+			int randon = (int) ((ranaux * (objectsNumber-1))/RAND_MAX);
+			double value = deviations[randon];
+						
+			stoChange.addProperty(value);
+			
+			changedObjects.insertSTInstance (stoChange);
+			++itObjs;
+		}
+		
+		permutationsResults[i] = TeMoranIndex2 (&changedObjects, mean, var, proxMatrix, 0);
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return 0.;
+			}
+			else
+				TeProgress::instance()->setProgress(i);
+		}
+	}
+
+	// verify the significance
+	int position = 0;
+	significance = 0;
+	unsigned int k;
+	for (k = 0; k < permutationsNumber; k++)
+	{
+		if (moranIndex < permutationsResults[k]) //>
+			position++;
+	}
+	if ( moranIndex >= 0)
+		significance = (double) (position+1) / (permutationsNumber+1);
+	else
+		significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+		
+	
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+		
+	return significance;
+}
+
+
+void
+TeMoranMap (TeSTElementSet* elemSet, int indexLISAMap, int indexBoxMap)
+{
+	TeSTElementSet::iterator it = elemSet->begin();
+	while ( it != elemSet->end())
+	{
+		double result = 0.0;
+		int lisaMap = (int)((*it)[indexLISAMap]);
+
+		if (lisaMap != 0)
+			result = (*it)[indexBoxMap];
+				
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "MoranMap"; 
+		rep.type_ = TeREAL;
+		(*it).addProperty(result, rep, false); 
+
+		++it;
+	}
+}
+
+bool 
+TeGStatistics (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr)
+{
+
+	TeSTElementSet::iterator itObjs = elemSet->begin();
+	double totalSum = 0.;
+	double excludSum = 0.;
+
+	totalSum = TeSum(itObjs, elemSet->end(), indexAttr);
+	
+	itObjs = elemSet->begin();
+
+	//progress bar
+	int step = 0;
+	int numSteps = elemSet->numSTInstance();
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(numSteps);
+
+	while ( itObjs != elemSet->end() )
+	{
+		double valObj = (*itObjs)[indexAttr];
+		excludSum = totalSum - valObj;
+		
+		double G = 0;
+		double GStar = valObj;
+	
+		TeNeighboursMap neighbors = proxMatrix->getMapNeighbours((*itObjs).objectId());
+		TeNeighboursMap::iterator itNeigs = neighbors.begin();
+		int neigNumber = neighbors.size();
+
+		if(itNeigs != neighbors.end())
+		{
+			while(itNeigs != neighbors.end())
+			{
+				// retrieve the property value associated to this neighbor 
+				double val;
+				if(!elemSet->getAttributeValue ((*itNeigs).first, indexAttr, val))
+					return false;
+
+				G +=  val;
+				GStar +=  val;
+				
+				++itNeigs;
+			}
+
+			G /= neigNumber;
+			GStar /= (neigNumber+1);
+				
+			G /= excludSum; 
+			GStar /= totalSum;
+		}
+	
+		//insert the indexes in the sET
+		TeAttributeRep rep;
+		rep.name_ = "G"; 
+		rep.type_ = TeREAL;
+		(*itObjs).addProperty(G, rep, false); 
+
+		rep.name_ = "GStar";
+		(*itObjs).addProperty(GStar, rep, false); 
+
+		++itObjs;
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+	}
+	
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+	return true;
+}
+
+void
+TeBoxMap (TeSTElementSet* elemSet, int indexZ, int indexWZ, double mean)
+{
+	
+	TeSTElementSet::iterator it_begin = elemSet->begin(); 
+	while ( it_begin != elemSet->end())
+	{
+		int result=0;
+
+		if ( ((*it_begin)[indexZ] >= mean) &&  ((*it_begin)[indexWZ] >= mean))   
+			result = 1;
+		else if ( ((*it_begin)[indexZ] < mean)  &&  ((*it_begin)[indexWZ] >= mean))	
+			result = 4;	
+		else if ( ((*it_begin)[indexZ] < mean)  &&  ((*it_begin)[indexWZ] < mean))
+			result = 2;		
+		else if ( ((*it_begin)[indexZ] >= mean) &&  ((*it_begin)[indexWZ] < mean))
+			result = 3;
+
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "BoxMap"; 
+		rep.type_ = TeINT;
+		(*it_begin).addProperty((double)result, rep, false); 
+
+		++it_begin;
+	}	
+}
+
+bool TeLisaStatisticalSignificance ( TeSTElementSet* elemSet, int indexZ, int indexLISA, 
+									 int indexNeighNum, int permutationsNumber) 
+ {
+	double sum;
+	double WZperm;
+	double significance;
+
+	TeSTElementSet::iterator it = elemSet->begin();
+
+	double variance = TeSecondMoment (it, elemSet->end(), 0, indexZ);
+
+	int index = 0;
+	it = elemSet->begin();
+	int objectsNumber = elemSet->numSTInstance();
+
+	//progress bar
+	int step = 0;
+	if(TeProgress::instance())
+		TeProgress::instance()->setTotalSteps(objectsNumber);
+
+	vector<double> deviations(objectsNumber);
+	vector<double>::iterator it_dev = deviations.begin();
+	while(it != elemSet->end())
+	{
+		(*it_dev) = (*it)[indexZ];
+		++it;
+		++it_dev;
+	}
+
+	it = elemSet->begin();
+	srand(time(0));
+	while ( it != elemSet->end())
+	{
+		int neighborsNumber = (int)((*it)[indexNeighNum]);
+
+		vector<double> permut(permutationsNumber);
+		
+		for (int j = 0; j < permutationsNumber; j++)
+		{
+			int randon = 0;
+			sum = 0;
+			set<int> setNeigh;
+			for (int k = 0; k < neighborsNumber; k++)
+			{
+				double ranaux = rand();
+				randon = (int)((ranaux * (objectsNumber-1))/RAND_MAX);
+				if (index == randon || (setNeigh.find(randon) != setNeigh.end()) )
+					k--;	// raffle annulled	
+				else
+				{		
+					setNeigh.insert(randon);
+					sum += deviations[randon];
+				}
+			}
+
+			if(neighborsNumber==0)
+				WZperm = 0.;
+			else
+				WZperm = sum/neighborsNumber;
+
+			if(variance==0)
+				permut[j] = 0.;
+			else
+				permut[j] = deviations[index] * WZperm / variance;
+		}	
+
+		int position = 0;
+		for (int k = 0; k < permutationsNumber; k++)
+		{
+			if (((*it)[indexLISA]) > permut[k])
+				position++;
+		}
+ 		if ( ((*it)[indexLISA]) >= 0)
+			significance = (double) (permutationsNumber-position)/(permutationsNumber+1);
+		else
+			significance = (double) position/( permutationsNumber + 1 );
+			
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "LISASig"; 
+		rep.type_ = TeREAL;
+		(*it).addProperty(significance, rep, false); 
+
+		++it;
+		++index;
+
+		if(TeProgress::instance())
+		{
+			if (TeProgress::instance()->wasCancelled())
+			{
+				TeProgress::instance()->reset();
+				return false;
+			}
+			else
+				TeProgress::instance()->setProgress(step);
+		}	
+		++step;
+	}
+
+	if (TeProgress::instance())
+		TeProgress::instance()->reset();
+
+	return true;
+}
+
+
+void
+TeLisaMap (TeSTElementSet* elemSet, int indexSignifLISA, int /* permutationNumber */)
+{
+	TeSTElementSet::iterator begin = elemSet->begin();
+	while (begin != elemSet->end())
+	{
+		int significanceClass = 0;
+		if ( ( (*begin)[indexSignifLISA] <= 0.001 ))  /*&& (permutationNumber >= 999)*/ 
+			significanceClass = 3;
+		else if ( ((*begin)[indexSignifLISA] <= 0.01) && ((*begin)[indexSignifLISA] > 0.001 )) /*&& (permutationNumber >= 99)*/ 
+			significanceClass = 2;
+		else if ( ((*begin)[indexSignifLISA] <= 0.05) && ((*begin)[indexSignifLISA] > 0.01))
+			significanceClass = 1;
+
+		//keep
+		TeAttributeRep rep;
+		rep.name_ = "LISAMap"; 
+		rep.type_ = TeINT;
+		(*begin).addProperty((double)significanceClass, rep, false); 
+
+		++begin;
+	}
+}
+
+
+
+
+
+
+
+
+
diff --git a/src/terralib/stat/TeSpatialStatistics.h b/src/terralib/stat/TeSpatialStatistics.h
new file mode 100644
index 0000000..75472bb
--- /dev/null
+++ b/src/terralib/stat/TeSpatialStatistics.h
@@ -0,0 +1,283 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeSpatialStatistics.h
+    This file provides support for spatial statistics functions
+	\note for a general overview of spatial statistics, please see
+  "Spatial Data Analysis by Example", Bailey and  Gattrell
+*/
+#ifndef  __TERRALIB_INTERNAL_SPATIALSTATISTICS_H
+#define  __TERRALIB_INTERNAL_SPATIALSTATISTICS_H
+
+#include <string>
+#include <vector>
+#include <map>
+#include <set>
+using namespace std;
+
+class TeSTEventSet;
+class TeSTElementSet;
+class TeGeneralizedProxMatrix;
+
+ 
+/** @defgroup SpatialStatistics Spatial Statistics Algorithms
+ *  TerraLib spatial statistics algorithms.
+ *  @{
+*/
+
+/*! \fn void TeLocalMean(TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexAttr);
+    \brief calculates the local mean (WZ) and the number of neighbors for each object 
+	\param elemSet		a set of objects  
+	\param proxMatrix	proximity matrix  
+	\param indexAttr	the index of the objects which keeps the attributes  
+*/
+bool 
+TeLocalMean (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0); 
+
+
+/*! \fn void TeLocalMean(TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexAttr);
+    \brief calculates the local mean (WZ) and the number of neighbors for each object 
+	\param elemSet		a set of objects  
+	\param proxMatrix	proximity matrix  
+	\param indexAttr	the index of the objects which keeps the attributes  
+*/
+bool 
+TeLocalMean (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0); 
+
+
+/** @defgroup TeMoranIndex Moran Index Algorithm
+ *  @ingroup SpatialStatistics
+ *  @{
+*/
+
+/*! \fn double TeMoranIndex2 (TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+    \brief calculates the local moran index for each object and returns the global moran index  
+	\param elemSet		a set of objects 
+	\param proxMatrix	proximity matrix  
+	\param indexAttr	the index of the objects which keeps the attributes  
+*/
+double
+TeMoranIndex2 (TeSTEventSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0); 
+
+/*! \fn double TeMoranIndex2 (TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+    \brief calculates the local moran index for each object and returns the global moran index  
+	\param elemSet		a set of objects 
+	\param proxMatrix	proximity matrix  
+	\param indexAttr	the index of the objects which keeps the attributes  
+*/
+double
+TeMoranIndex2 (TeSTElementSet* elemSet, const double& mean, const double& var, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0); 
+
+
+/*! \fn double TeMoranIndex (TeSTEventSet* elemSet, int indexZ, int indexWZ)
+    \brief calculates the local moran index (WZ) for each object and returns the global moran index  
+	\param elemSet		a set of objects 
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param indexWZ		the index of the objects which keeps the local mean deviations (WZ) 
+*/
+double
+TeMoranIndex (TeSTEventSet* elemSet, int indexZ, int indexWZ); 
+
+/*! \fn double TeMoranIndex (TeSTElementSet* elemSet, int indexZ, int indexWZ)
+    \brief calculates the local moran index (WZ) for each object and returns the global moran index  
+	\param elemSet		a set of objects 
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param indexWZ		the index of the objects which keeps the local mean deviations (WZ) 
+*/
+double
+TeMoranIndex (TeSTElementSet* elemSet, int indexZ, int indexWZ); 
+
+/*! \fn double TeGlobalMoranSignificance (TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexZ, unsigned int permutationsNumber, double moranIndex)
+    \brief calculates and returns the global moran significance    
+	\param elemSet		a set of objects  
+	\param proxMatrix	proximity matrix      
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param permutationsNumber	number of the permutations used to calculate the significance
+	\param moranIndex	the global moran index 
+*/
+double
+TeGlobalMoranSignificance (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+						   unsigned int permutationsNumber, double moranIndex); 
+
+/*! \fn double TeGlobalMoranSignificance (TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexZ, unsigned int permutationsNumber, double moranIndex)
+    \brief calculates and returns the global moran significance    
+	\param elemSet		a set of objects  
+	\param proxMatrix	proximity matrix      
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param permutationsNumber	number of the permutations used to calculate the significance
+	\param moranIndex	the global moran index 
+*/
+double
+TeGlobalMoranSignificance (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr,
+						   unsigned int permutationsNumber, double moranIndex); 
+
+
+
+/*! \fn void TeMoranMap (TeSTEventSet* elemSet, int indexLISAMap, int indexBoxMap)
+    \brief classifies the objects based in the scatterplot of moran index and statistical significance
+	\param elemSet		a set of objects 
+	\param indexLISAMap	the index of the objects which keeps the statistical significances of the moran local indexes (LISA) 
+	\param indexBoxMap	the index of the objects which keeps the classifications of the statistical significance of the moran local indexes 
+*/
+void
+TeMoranMap (TeSTEventSet* elemSet, int indexLISAMap, int indexBoxMap); 
+
+/*! \fn void TeMoranMap (TeSTElementSet* elemSet, int indexLISAMap, int indexBoxMap)
+    \brief classifies the objects based in the scatterplot of moran index and statistical significance
+	\param elemSet		a set of objects 
+	\param indexLISAMap	the index of the objects which keeps the statistical significances of the moran local indexes (LISA) 
+	\param indexBoxMap	the index of the objects which keeps the classifications of the statistical significance of the moran local indexes 
+*/
+void
+TeMoranMap (TeSTElementSet* elemSet, int indexLISAMap, int indexBoxMap); 
+
+
+/** @} */ 
+
+/*! \fn void TeGStatistics (TeSTEventSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+    \brief calculates the G and G* statistics for each object 
+	\param elemSet		a set of objects 
+	\param proxMatrix	proximity matrix      
+	\param indexAttr	the index of the objects which keeps the attributes  
+*/
+bool 
+TeGStatistics (TeSTEventSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0 ); 
+
+
+/*! \fn void TeGStatistics (TeSTElementSet* elemSet, ProxMatrix& proxMatrix, int indexAttr)
+    \brief calculates the G and G* statistics for each object 
+	\param elemSet		a set of objects 
+	\param proxMatrix	proximity matrix      
+	\param indexAttr	the index of the objects which keeps the attributes  
+*/
+bool 
+TeGStatistics (TeSTElementSet* elemSet, TeGeneralizedProxMatrix* proxMatrix, int indexAttr=0 ); 
+
+
+
+/*! \fn void TeBoxMap (TeSTEventSet* elemSet, int indexZ, int indexWZ, double mean)
+    \brief classifies the objects in quadrants based in the scatterplot of moran index 
+	\param elemSet		a set of objects 
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param indexWZ		the index of the objects which keeps the local mean deviations (WZ) 
+	\param mean			the global mean
+*/
+void
+TeBoxMap (TeSTEventSet* elemSet, int indexZ, int indexWZ, double mean); 
+
+
+/*! \fn void TeBoxMap (TeSTElementSet* elemSet, int indexZ, int indexWZ, double mean)
+    \brief classifies the objects in quadrants based in the scatterplot of moran index 
+	\param elemSet		a set of objects 
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param indexWZ		the index of the objects which keeps the local mean deviations (WZ) 
+	\param mean			the global mean
+*/
+void
+TeBoxMap (TeSTElementSet* elemSet, int indexZ, int indexWZ, double mean); 
+
+
+
+/*! \fn void TeLisaStatisticalSignificance ( TeSTEventSet* elemSet, int indexZ, int indexLISA, int indexNeighNum, int permutationsNumber)
+    \brief evaluates the statistical significance of the moran local indexes (LISA) 
+	\param elemSet		a set of objects 
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param indexLISA	the index of the objects which keeps the local moran indexes (LISA) 
+	\param indexNeighNum		the index of the objects which keeps the numbers of neighbours  
+	\param permutationsNumber	number of the permutations used to evaluate the significance
+*/
+bool TeLisaStatisticalSignificance ( TeSTEventSet* elemSet, int indexZ, int indexLISA, 
+									 int indexNeighNum, int permutationsNumber);  
+ 
+/*! \fn void TeLisaStatisticalSignificance ( TeSTElementSet* elemSet, int indexZ, int indexLISA, int indexNeighNum, int permutationsNumber)
+    \brief evaluates the statistical significance of the moran local indexes (LISA) 
+	\param elemSet		a set of objects 
+	\param indexZ		the index of the objects which keeps the deviations (Z)    
+	\param indexLISA	the index of the objects which keeps the local moran indexes (LISA) 
+	\param indexNeighNum		the index of the objects which keeps the numbers of neighbours  
+	\param permutationsNumber	number of the permutations used to evaluate the significance
+*/
+bool TeLisaStatisticalSignificance ( TeSTElementSet* elemSet, int indexZ, int indexLISA, 
+									 int indexNeighNum, int permutationsNumber);  
+
+
+/*! \fn void TeLisaMap ( TeSTEventSet* elemSet, int indexSignifLISA, int permutationNumber)
+    \brief classifies the objects based in the statistical significance of the moran local indexes (LISA) 
+	\param elemSet				a set of objects  
+	\param indexSignifLISA		the index of the objects which keeps the statistical significances of the local moran indexes (LISA) 
+	\param permutationNumber	number of the permutations used to evaluate the significance
+*/
+void
+TeLisaMap (TeSTEventSet* elemSet, int indexSignifLISA, int /* permutationNumber */); 
+
+
+/*! \fn void TeLisaMap ( TeSTElementSet* elemSet, int indexSignifLISA, int permutationNumber)
+    \brief classifies the objects based in the statistical significance of the moran local indexes (LISA) 
+	\param elemSet				a set of objects  
+	\param indexSignifLISA		the index of the objects which keeps the statistical significances of the local moran indexes (LISA) 
+	\param permutationNumber	number of the permutations used to evaluate the significance
+*/
+void
+TeLisaMap (TeSTElementSet* elemSet, int indexSignifLISA, int /* permutationNumber */); 
+
+/** @defgroup BayesEstimation Bayes estimation Algorithm
+ *  @ingroup SpatialStatistics
+ *  @{
+*/
+//! Calculates the empirical Bayes estimation
+template <typename It> void
+TeEmpiricalBayes (It rBegin, It rEnd, It n, double mean, double variance, It bayes)
+{
+	double w= 0.;
+	while (rBegin != rEnd)
+	{
+		w = variance / ( variance + ( mean/(*n)) );
+		*bayes = w*(*rBegin) + (1-w)*mean;
+		rBegin++; n++; bayes++;
+	}
+}
+
+//! Calculates the local Bayes estimation
+template <typename It> void
+TeSpatialEmpiricalBayes (It rBegin, It rEnd, It n, It mean, It variance, It bayes)
+{
+	double w = 0.;
+	while (rBegin != rEnd)
+	{
+		w = (*variance)/( (*variance) + ( (*mean)/n ));	
+		*bayes = w*(*rBegin) + (1-w)*(*mean);
+		rBegin++; n++; mean++; variance++; bayes++;
+	}
+}
+  
+/** @} */ 
+/** @} */ 
+
+/** \example STObjectSetExample3.cpp
+ *	This is an example of how to use spatial statistic algorithms from 
+	a Spatial Temporal Object Set (STObjectSet) and proximity matrix.
+ */
+
+
+#endif
+
diff --git a/src/terralib/stat/TeStatDataStructures.cpp b/src/terralib/stat/TeStatDataStructures.cpp
new file mode 100644
index 0000000..4b9e726
--- /dev/null
+++ b/src/terralib/stat/TeStatDataStructures.cpp
@@ -0,0 +1,85 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY 
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+
+#include "TeStatDataStructures.h"
+#include "TeSTElementSet.h"
+
+
+TeSTStatInstance::TeSTStatInstance(int nDlbProp) : TeSTInstance() 
+{
+     initDbl(nDlbProp);
+}
+
+        
+TeSTStatInstance::TeSTStatInstance(TeSTInstance other, int nd, int ad): TeSTInstance(other)
+{
+      initDbl(nd+ad);
+      int n;
+      //Copia propriedades de um como double
+      TeProperty prop;
+      for(n = 0; n < nd; n++) 
+	  {
+        other.getProperty(prop, n);
+        if ((prop.attr_.rep_.type_ != TeREAL) &&
+          (prop.attr_.rep_.type_ != TeINT)) 
+		{
+          dblProperties_[n] = 0.0;
+        }
+        else 
+		{
+          dblProperties_[n] = atof(prop.value_.c_str());
+        }
+      }
+}
+
+    
+TeSTStatInstance::TeSTStatInstance(const TeSTStatInstance& other) : TeSTInstance(other) 
+{
+      initDbl(other.nDblProperties_);
+      int n;
+      for(n = 0; n < nDblProperties_; n++) 
+	  {
+        dblProperties_[n] = other.dblProperties_[n];
+      }
+}
+    
+
+void
+TeSTStatInstanceSet::Copy(TeSTElementSet& stoSet, int nDbl, int aDbl) 
+{
+      
+      TeSTElementSet::iterator it = stoSet.begin();
+      while (it != stoSet.end()) {
+        //Insere elemento no mapa atual e inicializa double
+        TeSTStatInstance* nObj = new TeSTStatInstance(*it, nDbl, aDbl);
+        objs_.push_back(*nObj);  
+        ++it;
+      }
+}
+    
+    
+int TeSTStatInstanceSet::numObjects() 
+{
+      return objs_.size();
+}
+    
diff --git a/src/terralib/stat/TeStatDataStructures.h b/src/terralib/stat/TeStatDataStructures.h
new file mode 100644
index 0000000..7055446
--- /dev/null
+++ b/src/terralib/stat/TeStatDataStructures.h
@@ -0,0 +1,455 @@
+/************************************************************************************
+Exploring and analysis of geographical data using TerraLib and TerraView
+
+Copyright � 2003,2004 INPE and LESTE/UFMG.
+
+Partially funded by CNPq - Project SAUDAVEL, under grant no. 552044/2002-4,
+SENASP-MJ and INPE
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This program is distributed hoping it will be useful, however, WITHOUT ANY 
+WARRANTIES; neither to the implicit warranty of MERCHANTABILITY OR SUITABILITY FOR
+AN SPECIFIC FINALITY. Consult the GNU General Public License for more details.
+
+You must have received a copy of the GNU General Public License with this program.
+In negative case, write to the Free Software Foundation, Inc. in the following
+address: 59 Temple Street, Suite 330, Boston, MA 02111-1307 USA.
+***********************************************************************************/
+
+/*! \file TeStatDataStructures.h
+    This file deals with special data structures for spatial statistics 
+*/
+#ifndef __TERRALIB_INTERNAL_STATDATASTRUCTURES_H
+#define __TERRALIB_INTERNAL_STATDATASTRUCTURES_H
+
+#include "TeProjection.h"
+#include "TeRaster.h"
+#include "TeAttribute.h"
+#include "TeCoord2D.h"
+#include "TeSTInstance.h"
+
+class TeSTElementSet;
+
+class TeGridElement
+{
+	TeRaster* parent_;
+
+public:
+	int col_;
+	int lin_;
+
+	TeGridElement(TeRaster* rst=0, int col=0, int lin=0):
+	parent_(rst),
+	col_(col),
+	lin_(lin)
+	{}
+
+	void setColLin(int col, int lin)
+	{ 	col_ = col; lin_ = lin; 	}
+
+	void setRaster(TeRaster* rst)
+	{	parent_ = rst; }
+
+	void addProperty(TeProperty propK)
+	{	
+		double val = atof(propK.value_.c_str());
+		parent_->setElement(col_,lin_,val);
+	}
+
+	bool getDoubleProperty(int /* idx */, double& value) 
+	{	return parent_->getElement(col_, lin_, value);	}
+
+	bool setDoubleProperty(int /* idx */, double value) 
+	{	return parent_->setElement(col_,lin_, value);	}
+
+	//** ANDREA -- adaptive kernel support
+	bool getPropertyValue(const string& /* name */, string& value) 
+	{
+		double val;
+		if (parent_->getElement(col_,lin_,val)) 
+		{
+			value = Te2String(val,12);
+			return true;
+		}
+		value = Te2String(-1.0);
+		return false;
+	}
+
+	//** ANDREA -- adaptive kernel support
+	bool setPropertyValue(const string& /* name */, const string&  value) 
+	{
+		double val;
+		val = atof(value.c_str());
+		return parent_->setElement(col_,lin_,val);
+	}
+
+	bool centroid(TeCoord2D& loc)
+	{
+		TeCoord2D pt(col_,lin_);
+		loc = parent_->index2Coord(pt);
+		return true;
+	}
+
+	bool area(double& a)
+	{
+		a = parent_->params().resx_ * parent_->params().resy_;
+		return true;
+	}
+};
+//!  A grid support to generate a map of kernel
+/*! 
+	 This is a wrapper around TeRaster class in order to use  it as
+	 the output of a kernel algorithm. It provides iterators and  methods
+	 so that Kernel Map algorithms can use it in the same way as when using 
+	 a set of polygonal regions as support.
+*/
+class TeKernelGridSupport
+{
+	TeRaster* rasterImp_;
+public:
+
+	TeKernelGridSupport(TeBox& bb, int ncols, TeProjection* proj)
+	{
+		TeRasterParams par;
+		par.decoderIdentifier_=  "MEM";
+		par.fileName_ = "rasterTemp";
+
+		double resx = bb.width()/ncols;
+		TeBox newBox = adjustToCut(bb,resx,resx);
+		par.boundingBoxResolution(newBox.x1_,newBox.y1_,newBox.x2_,newBox.y2_,resx,resx);
+		newBox = par.boundingBox();
+		par.nBands(1);
+		par.projection(proj);
+		par.setDataType(TeDOUBLE);
+		par.setDummy(-TeMAXFLOAT);
+		par.setPhotometric(TeRASTERMULTIBAND);
+		par.useDummy_ = true;
+		par.mode_ = 'c';
+
+		rasterImp_ = new TeRaster(par);
+		if (!rasterImp_ || !rasterImp_->init())
+		{
+			delete rasterImp_;
+			rasterImp_ = 0;
+		}
+	}
+
+
+	~TeKernelGridSupport()
+	{
+		if (!rasterImp_)
+		{
+			delete rasterImp_;
+			rasterImp_ = 0;
+		}
+	}
+
+	bool status()
+	{	return (rasterImp_ && rasterImp_->status()); }
+
+	/** ANDREA -- method to return total area from polygon cut, if any **/
+	double totalArea() 
+	{ return TeGeometryArea(rasterImp_->params().boundingBox()); }
+
+  /** ANDREA -- method to returnal number of elements, adaptive kernel **/
+	int numObjects() 
+	{
+		TeRasterParams par;
+		par = rasterImp_->params();
+		return par.ncols_ * par.nlines_;
+	}
+
+	//-----
+	class iterator
+	{
+		friend class TeKernelGridSupport;
+
+	protected:
+		TeRaster::iterator  curItRaster_; //guarda iterador que pode ser de poligono ou nao
+		TeGridElement elem_;
+
+	public:
+		iterator(TeRaster* rst=0): curItRaster_(0)
+		{ elem_.setRaster(rst); }
+
+		~iterator() {}
+
+		iterator(TeRaster::iterator itr, TeRaster* rst=0) :
+			curItRaster_(itr)
+		{ 
+			elem_.setRaster(rst);
+			elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+		}
+
+		iterator& operator++()
+		{
+			//curItRaster_->operator++();
+			curItRaster_.moveForward();
+			elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+			return *this;
+		}
+
+		bool operator==(const iterator& rhs) const
+		{ return ((this->curItRaster_) ==   (rhs.curItRaster_)); }
+
+		bool operator!=(const iterator& rhs) const
+		{ return !((this->curItRaster_) ==   (rhs.curItRaster_));}
+
+		iterator& operator=(const iterator& other)
+		{
+			if ( this != &other )
+			{
+				curItRaster_ = other.curItRaster_;
+				elem_ = other.elem_;
+			}
+			return *this;
+		}
+
+		TeGridElement& operator*() { return elem_; }
+
+		TeGridElement& operator->() { return elem_; }
+	};
+
+  	//-----
+	class iteratorPoly
+	{
+		friend class TeKernelGridSupport;
+
+	protected:
+    TeRaster::iteratorPoly curItRaster_; //guarda iterador que pode ser de poligono ou nao
+		TeGridElement elem_;
+
+	public:
+		iteratorPoly(TeRaster* rst=0): curItRaster_(0)
+		{ elem_.setRaster(rst); }
+
+        ~iteratorPoly() {}
+
+		iteratorPoly(TeRaster::iteratorPoly itr, TeRaster* rst=0) :
+			curItRaster_(itr)
+		{ 
+			elem_.setRaster(rst);
+			elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+		}
+
+		iteratorPoly& operator++()
+		{
+			//curItRaster_->operator++();
+			curItRaster_.moveForward();
+			elem_.setColLin(curItRaster_.currentColumn(), curItRaster_.currentLine());
+			return *this;
+		}
+
+		bool operator==(const iteratorPoly& rhs) const
+		{	return ((this->curItRaster_) ==   (rhs.curItRaster_)); }
+
+		bool operator!=(const iteratorPoly& rhs) const
+		{ return !((this->curItRaster_) ==   (rhs.curItRaster_)); }
+
+		iteratorPoly& operator=(const iteratorPoly& other)
+		{
+			if ( this != &other )
+			{
+				curItRaster_ = other.curItRaster_;
+				elem_ = other.elem_;
+			}
+			return *this;
+		}
+
+		TeGridElement& operator*() { return elem_; }
+
+		TeGridElement& operator->() { return elem_; }
+	};
+
+
+	//-----
+
+	TeRaster* raster()
+	{	return rasterImp_; }
+
+	iterator begin()
+	{
+		TeRasterParams par = rasterImp_->params();
+		TeRaster::iterator itbegin(0,0,par.ncols_,par.nlines_,par.nBands(),rasterImp_);
+		TeKernelGridSupport::iterator it(itbegin,rasterImp_);
+		return it;
+	}
+
+	iteratorPoly begin(TePolygon poly)
+	{
+		TeRaster::iteratorPoly itRasterBegin_ = rasterImp_->begin(poly,TeBBoxPixelInters);
+		TeKernelGridSupport::iteratorPoly it(itRasterBegin_, rasterImp_);
+		return it;
+	}
+
+	iterator end()
+	{
+		TeRasterParams par = rasterImp_->params();
+		TeRaster::iterator itend =  TeRaster::iterator(par.ncols_,par.nlines_-1,par.ncols_,par.nlines_,par.nBands(),rasterImp_);
+		TeKernelGridSupport::iterator it(itend,rasterImp_);
+		return it;
+	}
+
+	iteratorPoly end(TePolygon poly)
+	{
+		TeRaster::iteratorPoly itRasterEnd_ =  rasterImp_->end(poly,TeBBoxPixelInters);
+		TeKernelGridSupport::iteratorPoly it(itRasterEnd_,rasterImp_);
+		return it;
+	}
+};
+
+
+/////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////
+//! An instance in time of a spatial object, with specialized members for TerraStat
+class TeSTStatInstance : public  TeSTInstance
+{
+
+  protected:
+
+  int     nDblProperties_;
+  double* dblProperties_;
+
+  void initDbl(int n) {
+    nDblProperties_ = n;
+    if (n == 0) {
+      dblProperties_ = NULL;
+    }
+    else {
+      dblProperties_ = new double[n];
+    }
+  }
+
+  public:
+    
+	TeSTStatInstance(int nDlbProp = 0); 
+
+     //! Copy constructor
+    TeSTStatInstance(TeSTInstance other, int nd, int ad); 
+
+    //! Copy constructor
+    TeSTStatInstance(const TeSTStatInstance& other);     
+
+    bool setDoubleProperty(int idx, double value) {
+      if ((idx < 0) || (idx > nDblProperties_))
+        return false;
+      dblProperties_[idx] = value;
+      return true;
+    }
+
+    bool getDoubleProperty(int idx, double& value) {
+      if ((idx < 0) || (idx > nDblProperties_))
+        return false;
+      value = dblProperties_[idx];
+      return true;
+    }
+
+	  //! Destructor
+    ~TeSTStatInstance(){
+      
+      if (dblProperties_ != NULL)
+        delete [] dblProperties_;
+    }
+
+};
+ 
+class TeSTStatInstanceSet  
+{
+  
+  
+  protected:
+    
+    // map of object identification to its instances in time
+    vector<TeSTStatInstance >	objs_;	
+    
+  public:
+    
+    //Constroi um a partir de outro
+    TeSTStatInstanceSet() {
+    }
+    
+    void Copy(TeSTElementSet& stoSet, int nDbl=0, int aDbl = 0); 
+    
+    int numObjects(); 
+    
+    class iterator {
+      vector<TeSTStatInstance >::iterator it_;
+      
+    public:
+      iterator(vector<TeSTStatInstance >::iterator i){it_ = i;}
+      
+      ~iterator(){}
+      
+      iterator& operator++()
+      {
+        ++it_;
+        return *this;
+      }
+      
+      bool operator==(const iterator& rhs) const
+      {
+        return ((this->it_) ==   (rhs.it_));
+      }
+      
+      bool operator!=(const iterator& rhs) const
+      {
+        return !((this->it_) ==   (rhs.it_));
+      }
+      
+      iterator& operator=(const iterator& other)
+      {
+        if ( this != &other )
+        {
+          it_ = other.it_;
+        }
+        return *this;
+      }
+      
+      TeSTStatInstance& operator*() { return *(it_); }
+    };
+    
+    iterator begin() {  
+      return TeSTStatInstanceSet::iterator(objs_.begin());
+    }
+    
+    iterator end() {
+      return TeSTStatInstanceSet::iterator(objs_.end());
+    }
+    
+};
+
+// Classe de eventos pontuais
+class TePointTInstanceSet : public TeSTStatInstanceSet
+{
+
+  public:
+
+  TePointTInstanceSet() : TeSTStatInstanceSet() {}
+
+  
+  iterator begin(const TeCoord2D& /* center */, const double& /* radius */)
+  {
+    return TeSTStatInstanceSet::begin();
+  }
+
+  iterator end(const TeCoord2D& /* center */, const double& /* radius */)
+  {
+    return TeSTStatInstanceSet::end();
+  }
+
+  iterator begin()
+  {
+    return TeSTStatInstanceSet::begin();
+  }
+
+  iterator end()
+  {
+    return TeSTStatInstanceSet::end();
+  }
+};
+
+#endif
diff --git a/src/terralib/stat/TeTreeMinimum.cpp b/src/terralib/stat/TeTreeMinimum.cpp
new file mode 100644
index 0000000..f5d7394
--- /dev/null
+++ b/src/terralib/stat/TeTreeMinimum.cpp
@@ -0,0 +1,379 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+#include <math.h>
+#include "TeTreeMinimum.h"
+
+bool 
+compare_dissimilarity(const graph_link &graph_link1, const graph_link &graph_link2)
+{
+	if (graph_link1.Dissimilarity_ < graph_link2.Dissimilarity_) 
+		return true;
+	else
+		return false;
+}
+
+void TeCreateDissMatrix (TeSelectedObjectMap& objects, TeProxMatrix& proxMatrix, 
+					  matrix& mat_diss, double &Diss_max) 
+{
+	string GeoId1, GeoId2;
+	TeSelectedObjectVector  neighbors;
+	int num_neighbors;
+	double val1, val2;
+	int DISS_TYPE = 1;
+	double Diss = 0.;	
+	Diss_max = 0.;	
+	graph graph_;
+	int tamanho = 0;
+
+	TeSelectedObjectMap::iterator it = objects.begin();
+	int num_objects = objects.size();
+
+	while ( it != objects.end() )
+	{
+		((*it).second).slice_ = 0.;
+		GeoId1 = (*it).first;
+		neighbors = proxMatrix [GeoId1];
+		num_neighbors = neighbors.size();
+		graph_.clear();
+		tamanho = graph_.size();
+		double difer = 0.;
+		for (int i = 0; i< num_neighbors;   i++)
+		{
+			GeoId2 = neighbors[i].geoid_;
+			TeSelectedObjectMap::iterator it2 = objects.find(GeoId2);
+			//leitura dos valores
+			for (int j = 0; j < (*it).second.properties_.size(); j++)
+			{
+				val1 = atof ( ((*it).second).properties_[j].value_.c_str() );
+				val2 = atof ( ((*it2).second).properties_[j].value_.c_str() );		
+				difer = val1 - val2;
+				if (DISS_TYPE)
+					Diss+= difer*difer;		// distancia euclidiana (y=1)
+				else
+					Diss+= double(fabs(difer));		// distancia quarteirao (y=0)
+			}
+			if (DISS_TYPE)
+				Diss = sqrt(Diss);
+			
+			//	guarda maior valor
+			if (Diss > Diss_max)
+				Diss_max = Diss;
+
+			//escrever na estrutura map de grafos
+			if (GeoId1 != GeoId2)
+				graph_.push_back(graph_link(GeoId1,GeoId2,Diss));
+		}
+		sort(graph_.begin(), graph_.end(), compare_dissimilarity); 
+		mat_diss[GeoId1] = graph_;
+		it++;
+	}
+}
+
+void
+TeCreateMinimumTree (TeSelectedObjectMap& objects, matrix& DissMatrix, 
+					 graph& Min_Tree, double Diss_max)
+{
+	// GERAR ARVORE MINIMA
+	map<int,string> nos_MimTree;  //container que armazenar� n�s da �rvore minima
+	// escolha do primeiro n�
+	TeSelectedObjectMap::iterator it = objects.begin();
+
+	string GeoId1 = (*it).first;	
+	int num_nos = 0;	//n�mero de n�s na �rvore m�nima
+
+	nos_MimTree[num_nos++] = GeoId1;
+	string GeoId2 = DissMatrix[GeoId1][0].GeoId2_;  //A matriz possui as linhas ordenadas pela menor dissimilaridade
+	nos_MimTree[num_nos++] = GeoId2;
+
+	graph_link link1(GeoId1, GeoId2, DissMatrix[GeoId1][0].Dissimilarity_);
+	Min_Tree.push_back(link1);
+
+	double Diss_mim;
+	graph::iterator it_link = DissMatrix[GeoId1].begin();
+	DissMatrix[GeoId1].erase(it_link);	//apaga link j� analisado
+
+	int num_objects = objects.size();
+	bool no_novo = false;
+
+	while ((num_nos) < num_objects)
+	{
+		Diss_mim = Diss_max;
+		no_novo = false;
+		for (int i = 0; i < nos_MimTree.size(); i++)
+		{
+			string no_atual = nos_MimTree[i];
+			if ((DissMatrix[no_atual].size() != 0) & (DissMatrix[no_atual][0].Dissimilarity_ < Diss_mim))
+			{
+				GeoId1 = DissMatrix[nos_MimTree[i]][0].GeoId1_;
+				GeoId2 = DissMatrix[nos_MimTree[i]][0].GeoId2_;
+				Diss_mim = DissMatrix[nos_MimTree[i]][0].Dissimilarity_;
+				no_novo = true;
+			}
+		}
+
+		// verifica se n� j� pertence � �rvore
+		string no_atual;
+		for (int j = 0; j < nos_MimTree.size(); j++)
+		{
+			no_atual = nos_MimTree[j];
+			if(no_atual == GeoId2)
+				no_novo = false;
+		}
+
+		// se n� � novo, inclui link na �rvore m�nima
+		if (no_novo)
+		{
+			nos_MimTree[num_nos++] = GeoId2;
+			graph_link link2(GeoId1, GeoId2, Diss_mim);
+			Min_Tree.push_back(link2);
+		}
+
+		DissMatrix[GeoId1].erase(DissMatrix[GeoId1].begin());
+	}
+}
+
+
+void
+TeCreateSubTrees( TeSelectedObjectMap& objects,graph& Min_Tree, 
+				 TeSelectedObjectMap& result, int num_regioes)
+{ 
+	double	SSA1 = 0., SSA2 = 0., SSTO = 0.;
+	graph::iterator it1 = Min_Tree.begin();
+	graph::iterator it2 = Min_Tree.begin();
+	graph::iterator itMax = Min_Tree.begin();
+	result.clear();
+	TeSelectedObjectMap::iterator it = objects.begin();
+
+	vector<string> subtree_vertexes_1, subtree1;
+	vector<string> subtree_vertexes_2, subtree2;
+
+	// h� necessidade de zerar o slice!
+	for (int regiao = 1; regiao < num_regioes; regiao++)
+	{
+		double link_cost = 0.;
+		graph_link bigest_cost("","",0.); 
+		int contagem = 0;
+		it1 = Min_Tree.begin();
+		while (it1 != Min_Tree.end())
+		{
+			graph MT_copy;
+ 
+			string GeoId1 = it1->GeoId1_;
+			string GeoId2 = it1->GeoId2_;
+			subtree_vertexes_1.clear();			
+			subtree_vertexes_2.clear();
+
+			subtree_vertexes_1.push_back(GeoId1);
+			subtree_vertexes_2.push_back(GeoId2);
+
+			int actual_vert = 0;
+			string new_vertixe;
+
+			while (actual_vert < subtree_vertexes_1.size())
+			{
+				it2 = Min_Tree.begin();
+				bool new_v = false;
+
+				while (it2 != Min_Tree.end())
+				{
+					if ((subtree_vertexes_1[actual_vert] == it2->GeoId1_) && 
+						(subtree_vertexes_2[0] != it2->GeoId2_ ))
+					{
+						new_vertixe = it2->GeoId2_; new_v = true;
+					} else if ((subtree_vertexes_1[actual_vert] == it2->GeoId2_) && 
+						(subtree_vertexes_2[0] != it2->GeoId1_ ))
+					{
+						new_vertixe = it2->GeoId1_; new_v = true;
+					}
+					if ((new_v) && (find(subtree_vertexes_1.begin(), subtree_vertexes_1.end(), new_vertixe) == subtree_vertexes_1.end()))
+							subtree_vertexes_1.push_back(new_vertixe);
+					it2++;
+				}
+				actual_vert++;
+			}
+
+			actual_vert = 0;
+			while (actual_vert < subtree_vertexes_2.size())
+			{
+				it2 = Min_Tree.begin();
+				bool new_v = false;
+
+				while (it2 != Min_Tree.end())
+				{
+					if ((subtree_vertexes_2[actual_vert] == it2->GeoId1_) && 
+						(subtree_vertexes_1[0] != it2->GeoId2_ ))
+					{
+						new_vertixe = it2->GeoId2_; new_v = true;
+					} else if ((subtree_vertexes_2[actual_vert] == it2->GeoId2_) && 
+						(subtree_vertexes_1[0] != it2->GeoId1_ ))
+					{
+						new_vertixe = it2->GeoId1_; new_v = true;
+					}
+					if ((new_v) && (find(subtree_vertexes_2.begin(), subtree_vertexes_2.end(), new_vertixe) == subtree_vertexes_2.end()))
+							subtree_vertexes_2.push_back(new_vertixe);
+					it2++;
+				}
+				actual_vert++;
+			}				
+
+			//Calcular o vetor m�dia
+			int tam1 = subtree_vertexes_1.size();
+			int tam2 = subtree_vertexes_2.size();
+			
+			int attributes_number = ((*it).second).properties_.size();
+
+			vector <double> sum1, sum2, total_sum;	
+			vector<double> mean1, mean2, global_mean;
+			for (int i = 0; i < attributes_number  ; i++)
+			{
+				sum1.push_back(0.);	sum2.push_back(0.);	total_sum.push_back(0.);
+				mean1.push_back(0.); mean2.push_back(0.); global_mean.push_back(0.);
+			}
+
+
+			string GeoId;
+			vector<string>::iterator it_s = subtree_vertexes_1.begin();
+
+			double valor = 0.;
+			while ( it_s != subtree_vertexes_1.end() )
+			{
+				GeoId = (*it_s).c_str();
+				it = objects.find(GeoId);				
+				for (int i = 0; i < attributes_number  ; i++)
+				{
+					valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+					sum1[i] += valor;
+				}
+				it_s++;
+			}
+
+			it_s = subtree_vertexes_2.begin();
+			while ( it_s != subtree_vertexes_2.end() )
+			{
+				GeoId = (*it_s).c_str();
+				it = objects.find(GeoId);				
+				for (int i = 0; i < attributes_number ; i++)
+				{
+					valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+					sum2[i] += valor;
+				}	
+				it_s++;
+			}
+
+			for (int k = 0; k < attributes_number ; k++)
+			{
+				total_sum[k] = sum1[k] + sum2[k];
+			}				
+
+
+			for (int j = 0; j < attributes_number ; j++)
+			{
+				 mean1[j] = sum1[j]/tam1; 
+				 mean2[j] =	sum2[j]/tam2;
+				 global_mean[j] = total_sum[j]/(tam1+tam2);
+			}			
+
+			// Calculo do SSTO e SSA's		
+			double SSA1 = 0.; SSA2 = 0.; SSTO = 0.; 
+			double desvio1 = 0., desvio2 = 0., desvioGlobal = 0.;
+
+			it_s = subtree_vertexes_1.begin();
+			while ( it_s != subtree_vertexes_1.end() )
+			{
+				GeoId = (*it_s).c_str();
+				it = objects.find(GeoId);				
+				for (int i=0; i<attributes_number; i++)
+				{
+					valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+					desvio1 = valor - mean1[i];
+					desvioGlobal = valor - global_mean[i];
+					SSA1 += desvio1*desvio1;
+					SSTO += desvioGlobal*desvioGlobal;
+				}
+				it_s++;
+			}
+
+			it_s = subtree_vertexes_2.begin();
+			while ( it_s != subtree_vertexes_2.end() )
+			{
+				GeoId = (*it_s).c_str();
+				it = objects.find(GeoId);
+				for (int i=0; i<attributes_number; i++)
+				{
+					valor = atof ( ((*it).second).properties_[i].value_.c_str() );
+					desvio2 = valor - mean2[i];
+					desvioGlobal = valor - global_mean[i];
+					SSA2 += desvio2*desvio2;
+					SSTO += desvioGlobal*desvioGlobal;
+				}
+				it_s++;
+			}
+			
+			// Calculo do custo de aresta
+			double link_cost = SSTO - SSA1 - SSA2;
+
+			if (link_cost > bigest_cost.Dissimilarity_)
+			{
+				bigest_cost.Dissimilarity_ = link_cost;
+				bigest_cost.GeoId1_= GeoId1;
+				bigest_cost.GeoId2_= GeoId2;
+				subtree1 = subtree_vertexes_1;
+				subtree2 = subtree_vertexes_2;
+				itMax = it1; //armazena o iterator para o n� mais caro
+			}
+
+			it1++;
+		}
+		// excluir link
+		string teste1 = itMax->GeoId1_;
+		string teste2 = itMax->GeoId2_;
+		Min_Tree.erase(itMax);
+
+		// atualizar slice
+		vector<string>::iterator it_s = subtree2.begin();
+		int contador = 0;
+		while (it_s != subtree2.end())
+		{
+			it = objects.find((*it_s).c_str());
+			((*it).second).slice_ = regiao;						
+			it_s++;
+			contador++;
+		}
+
+	}
+
+	// Transfer objects to map
+//	TeSelectedObjectMap	*objectsMap = layer.objectMap();//->objectMap();
+	it = objects.begin();
+	while ( it != objects.end() )
+	{
+		string GeoId = (*it).first;
+//		(*objectsMap)[GeoId] = (*it).second;
+		TeSelectedObject obj = ( *it ).second;
+		obj.properties_[0].attr_.semantic_ = "Cluster index";
+		obj.properties_[0].value_ = Te2String (((*it).second).slice_ );
+		result [ obj.geoid_] = obj;
+		++it;
+	}
+
+}
\ No newline at end of file
diff --git a/src/terralib/stat/TeTreeMinimum.h b/src/terralib/stat/TeTreeMinimum.h
new file mode 100644
index 0000000..6562286
--- /dev/null
+++ b/src/terralib/stat/TeTreeMinimum.h
@@ -0,0 +1,89 @@
+/************************************************************************************
+TerraLib - a library for developing GIS applications.
+Copyright � 2001-2004 INPE and Tecgraf/PUC-Rio.
+
+This code is part of the TerraLib library.
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+You should have received a copy of the GNU Lesser General Public
+License along with this library.
+
+The authors reassure the license terms regarding the warranties.
+They specifically disclaim any warranties, including, but not limited to,
+the implied warranties of merchantability and fitness for a particular purpose.
+The library provided hereunder is on an "as is" basis, and the authors have no
+obligation to provide maintenance, support, updates, enhancements, or modifications.
+In no event shall INPE and Tecgraf / PUC-Rio be held liable to any party for direct,
+indirect, special, incidental, or consequential damages arising out of the use
+of this library and its documentation.
+*************************************************************************************/
+
+/*! \file TeTreeMinimum.h
+    This file contains functions related to the Tree Minimum clustering algorithm
+*/
+#ifndef  __TERRALIB_INTERNAL_TREEMINIMUM_H
+#define  __TERRALIB_INTERNAL_TREEMINIMUM_H
+
+#include <vector>
+#include <map>
+#include <string>
+
+#include "TeSelectedObject.h"
+#include "TeSpatialStatistics.h"
+#include "TeLayer.h"
+
+using namespace std;
+
+class graph_link
+{
+public:
+	string GeoId1_;
+	string GeoId2_;
+	double Dissimilarity_;
+
+	~graph_link()
+	{}
+
+
+	graph_link() :
+		GeoId1_(""),
+		GeoId2_("")
+	{}
+
+	graph_link(const string& GeoId1, const string& GeoId2):
+		GeoId1_(GeoId1),
+		GeoId2_(GeoId2)
+	{}
+
+	graph_link(const string& GeoId1, const string& GeoId2, const double Dissimilarity)  :
+		GeoId1_(GeoId1),
+		GeoId2_(GeoId2),
+		Dissimilarity_(Dissimilarity)
+	{}
+
+ 
+	void set_Dissimilatiry (const double Dissimilarity)
+	{	Dissimilarity_ = Dissimilarity;	}
+
+	bool compare_dissimilarity(const graph_link &graph_link1, const graph_link &graph_link2);
+//	bool graph_link::operator<(const graph_link &graph_link1, const graph_link &graph_link2);
+};
+
+
+
+typedef vector<graph_link> graph;
+
+typedef map<string,graph> matrix;
+
+void TeCreateDissMatrix (TeSelectedObjectMap& Objects, TeProxMatrix& proxMatrix,
+					   matrix& mat_diss, double& Diss_max);
+
+void TeCreateMinimumTree ( TeSelectedObjectMap& Objects, matrix& DissMatrix, graph& Min_Tree, double Diss_max);
+
+void TeCreateSubTrees( TeSelectedObjectMap& Objects, graph& Min_Tree,
+					  TeSelectedObjectMap& result, int num_regioes);
+
+#endif
\ No newline at end of file
diff --git a/src/terralib/stat/erro.h b/src/terralib/stat/erro.h
new file mode 100644
index 0000000..80ca0b6
--- /dev/null
+++ b/src/terralib/stat/erro.h
@@ -0,0 +1,6 @@
+#ifndef ErroH
+#define ErroH
+#include <stdlib.h>
+#include <stdio.h>
+#define FatalError(x) {printf("%s\n", x); exit(0);}
+#endif
diff --git a/src/terralib/stat/filaDouble.cpp b/src/terralib/stat/filaDouble.cpp
new file mode 100644
index 0000000..0448d34
--- /dev/null
+++ b/src/terralib/stat/filaDouble.cpp
@@ -0,0 +1,58 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#include "erro.h"
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "filaDouble.h"
+TFilaDouble::TFilaDouble(){
+     mFila = (Fila_ptr) malloc(sizeof(Fila_t));
+     if (!mFila) FatalError("Mem�ria FilaInt");
+     mFila->Head = NULL;
+     mFila->Tail = NULL;
+     mFila->Size = 0;
+}
+//---------------------------------------------------------------------------
+TFilaDouble::~TFilaDouble(){
+ delete mFila;
+}
+//---------------------------------------------------------------------------
+void TFilaDouble::Insere(double Item){
+   Item_ptr novo;
+
+    novo=(Item_ptr) malloc(sizeof(Item_t));
+    if (!novo){
+        FatalError("Falta de mem�ria!");
+    }
+    novo->Item = Item;
+    novo->Proximo = NULL;
+    if(mFila->Size)
+      mFila->Tail->Proximo = novo;
+    else
+      mFila->Head = novo;
+    mFila->Tail = novo;
+    (mFila->Size)++;
+}
+//---------------------------------------------------------------------------
+double  TFilaDouble::Retira(){
+  Item_ptr Aux;
+  double i;
+
+  if(!mFila->Size) {
+    FatalError("Tirando de Fila Vazia!");
+  }
+
+  Aux = mFila->Head;
+  i=Aux->Item;
+  mFila->Head = mFila->Head->Proximo;
+  if (mFila->Size == 1) mFila->Tail = NULL;
+  (mFila->Size)--;
+  free(Aux);
+  return i;
+}
+//---------------------------------------------------------------------------
+int  TFilaDouble::GetSize(){
+ return mFila->Size;
+}
+
diff --git a/src/terralib/stat/filaDouble.h b/src/terralib/stat/filaDouble.h
new file mode 100644
index 0000000..2830aab
--- /dev/null
+++ b/src/terralib/stat/filaDouble.h
@@ -0,0 +1,27 @@
+//---------------------------------------------------------------------------
+#ifndef FilaDoubleH
+#define FilaDoubleH
+class TFilaDouble {
+  private:
+    typedef struct it {
+      double Item;
+      struct it *Proximo;
+    }Item_t,*Item_ptr;
+
+    typedef struct Fila {
+      Item_ptr Head;
+      Item_ptr Tail;
+      int Size;
+    }Fila_t,*Fila_ptr;
+    Fila_ptr mFila;
+   int  GetSize();
+public:
+  TFilaDouble();
+  ~TFilaDouble();
+  void Insere(double);
+  double  Retira();
+  int Size() {return GetSize();}
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/filaInt.cpp b/src/terralib/stat/filaInt.cpp
new file mode 100644
index 0000000..6fc1012
--- /dev/null
+++ b/src/terralib/stat/filaInt.cpp
@@ -0,0 +1,58 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "erro.h"
+#include "filaInt.h"
+TFilaInt::TFilaInt(){
+     mFila = (Fila_ptr) malloc(sizeof(Fila_t));
+     if (!mFila) FatalError("Mem�ria FilaInt");
+     mFila->Head = NULL;
+     mFila->Tail = NULL;
+     mFila->Size = 0;
+}
+//---------------------------------------------------------------------------
+TFilaInt::~TFilaInt(){
+ delete mFila;
+}
+//---------------------------------------------------------------------------
+void  TFilaInt::Insere(int Raiz){
+   Item_ptr novo;
+
+    novo=(Item_ptr) malloc(sizeof(Item_t));
+    if (!novo){
+       FatalError("Falta de mem�ria!");
+    }
+    novo->Raiz = Raiz;
+    novo->Proximo = NULL;
+    if(mFila->Size)
+      mFila->Tail->Proximo = novo;
+    else
+      mFila->Head = novo;
+    mFila->Tail = novo;
+    (mFila->Size)++;
+}
+//---------------------------------------------------------------------------
+int  TFilaInt::Retira(){
+  Item_ptr Aux;
+  int i;
+
+  if(!mFila->Size) {
+    FatalError("Tirando de Fila Vazia!");
+  }
+
+  Aux = mFila->Head;
+  i=Aux->Raiz;
+  mFila->Head = mFila->Head->Proximo;
+  if (mFila->Size == 1) mFila->Tail = NULL;
+  (mFila->Size)--;
+  free(Aux);
+  return i;
+}
+//---------------------------------------------------------------------------
+int  TFilaInt::GetSize(){
+ return mFila->Size;
+}
+
diff --git a/src/terralib/stat/filaInt.h b/src/terralib/stat/filaInt.h
new file mode 100644
index 0000000..cd98d67
--- /dev/null
+++ b/src/terralib/stat/filaInt.h
@@ -0,0 +1,27 @@
+//---------------------------------------------------------------------------
+#ifndef FilaIntH
+#define FilaIntH
+class TFilaInt {
+  private:
+    typedef struct it {
+      int Raiz;
+      struct it *Proximo;
+    }Item_t,*Item_ptr;
+
+    typedef struct Fila {
+      Item_ptr Head;
+      Item_ptr Tail;
+      int Size;
+    }Fila_t,*Fila_ptr;
+    Fila_ptr mFila;
+   int  GetSize();
+public:
+  TFilaInt();
+  ~TFilaInt();
+  void  Insere(int);
+  int  Retira();
+  int Size() {return GetSize();}
+};
+
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/filaR.cpp b/src/terralib/stat/filaR.cpp
new file mode 100644
index 0000000..f023f93
--- /dev/null
+++ b/src/terralib/stat/filaR.cpp
@@ -0,0 +1,79 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "filaR.h"
+#include "erro.h"
+
+TFilaR::TFilaR(){
+     mFila = (Fila_ptr) malloc(sizeof(Fila_t));
+     if (!mFila) FatalError("Mem�ria FilaR");
+     mFila->Head = NULL;
+     mFila->Next = NULL;
+     mFila->Atual = NULL;
+     mFila->Size = 0;
+}
+//---------------------------------------------------------------------------
+TFilaR::~TFilaR(){
+ delete mFila;
+}
+//---------------------------------------------------------------------------
+void  TFilaR::Insere(int Raiz,double Desvio,long Populacao){
+   Item_ptr novo;
+
+    novo=(Item_ptr) malloc(sizeof(Item_t));
+    if (!novo) {
+      FatalError("Falta de mem�ria!");
+    }
+    novo->Raiz = Raiz;
+    novo->Desvio = Desvio;
+    novo->Queda = 0;
+    novo->Populacao = Populacao;
+    novo->Proximo = mFila->Head;
+
+    mFila->Head = novo;
+    mFila->Atual = novo;
+    mFila->Next = novo;
+    (mFila->Size)++;
+}
+//---------------------------------------------------------------------------
+void  TFilaR::Retira(int Raiz){
+  Item_ptr Aux,Prev;
+
+  if(!mFila->Size) {
+    FatalError("Fila Vazia!");
+  }
+
+  Aux = mFila->Head;
+  if(Aux->Raiz == Raiz) {
+    mFila->Head = Aux->Proximo;
+    (mFila->Size)--;
+  } else {
+     while (Aux && Aux->Raiz != Raiz){
+       Prev = Aux;
+       Aux = Aux->Proximo;
+     }
+     Prev->Proximo = Aux->Proximo;
+     (mFila->Size)--;
+     free(Aux);
+  }
+  mFila->Atual = mFila->Head;
+  mFila->Next = mFila->Head;
+}
+//---------------------------------------------------------------------------
+int  TFilaR::Proximo(){
+  int i;
+  if(!mFila->Next) {
+    mFila->Next = mFila->Head;
+    mFila->Atual = mFila->Head;
+    return -1;
+  }
+  i = mFila->Next->Raiz;
+  mFila->Atual = mFila->Next;
+  mFila->Next = mFila->Next->Proximo;
+  return i;
+}
+//---------------------------------------------------------------------------
+
diff --git a/src/terralib/stat/filaR.h b/src/terralib/stat/filaR.h
new file mode 100644
index 0000000..ee0b32e
--- /dev/null
+++ b/src/terralib/stat/filaR.h
@@ -0,0 +1,36 @@
+//---------------------------------------------------------------------------
+#ifndef FilaRH
+#define FilaRH
+
+class TFilaR {
+public:
+    typedef struct Item {
+      int Raiz; // Indice no vetor da raiz do grupamento
+      double Centro_X,Centro_Y; // Centroide do grupamento
+      int Num_Areas; // Numero de areas dentro do grupamento
+      double Desvio; // Desvio dentro do grupamento
+      double Queda; // Quanto cai o desvio com uma particao
+      double D1,D2; // desvio nos dois grupos gerados
+      int R1,R2; // Indice no vetor das raizes dos grupos gerados
+      long P1,P2; // populacao nos grupos gerados
+      long Populacao; // Populacao do grupamento
+      struct Item *Proximo; // Proximo item na lista de raizes
+    }Item_t,*Item_ptr;
+
+    typedef struct Fila {
+      Item_ptr Head;
+      int Size;
+      Item_ptr Atual;// Utilizado para acesso aos dados
+      Item_ptr Next; //Para Pesquisa
+    }Fila_t,*Fila_ptr;
+
+  Fila_ptr mFila;
+  
+  TFilaR();
+  ~TFilaR();
+  void  Insere(int,double,long);
+  void  Retira(int);
+  int  Proximo();
+};
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/hash.cpp b/src/terralib/stat/hash.cpp
new file mode 100644
index 0000000..3606b78
--- /dev/null
+++ b/src/terralib/stat/hash.cpp
@@ -0,0 +1,53 @@
+//---------------------------------------------------------------------------
+#ifdef WIN32
+#pragma hdrstop
+#endif
+#include <stdlib.h>
+#include <stdio.h>
+#include "hash.h"
+
+THash::THash(){//Construtora
+   MyHash = new Hash_t[HASH_SIZE];
+   if(!MyHash) 
+     FatalError("Falta de mem�ria para o Hash");
+};
+
+void  THash::Insere(char* SKey,unsigned int Indice){
+  unsigned int Hash_Indice;
+  unsigned long Key;
+  Hash_ptr Novo;
+
+  sscanf(SKey,"%ld",&Key);
+
+  Novo = (Hash_ptr) malloc(sizeof(Hash_t));
+  if(!Novo) FatalError("Falta de mem�ria para o Hash");
+
+  Hash_Indice = Hash_Function(Key);
+  Novo->Next = MyHash[Hash_Indice].Next;
+  Novo->Key = Key;
+  Novo->Indice = Indice;
+  MyHash[Hash_Indice].Next = Novo;
+};
+
+unsigned int  THash::Pesquisa(const char* SKey){
+   Hash_ptr Aux;
+   unsigned int Hash_Indice;
+   unsigned long Key;
+
+   sscanf(SKey,"%ld",&Key);
+   Hash_Indice = Hash_Function(Key); //Obtem posicao no Hash
+   Aux=MyHash[Hash_Indice].Next;//Prepara para a pesquisa
+   while((Aux != NULL) && (Aux->Key != Key)) Aux=Aux->Next;//Faz a pesquisa
+
+   if (Aux == NULL) {
+    FatalError("Pesquisa no hash");
+   }
+   return Aux->Indice;//Retorna o resultado
+};
+
+unsigned int  THash::Hash_Function(unsigned long Key){
+  return Key%HASH_SIZE;
+};
+
+//---------------------------------------------------------------------------
+
diff --git a/src/terralib/stat/hash.h b/src/terralib/stat/hash.h
new file mode 100644
index 0000000..fbf17c2
--- /dev/null
+++ b/src/terralib/stat/hash.h
@@ -0,0 +1,26 @@
+//---------------------------------------------------------------------------
+#ifndef HashH
+#define HashH
+#define HASH_SIZE 1000
+#include "erro.h"
+class THash{
+
+/*** Area Privada ***/
+private:
+  typedef struct Hash_Type{
+     unsigned long Key;
+     unsigned int Indice;
+     struct Hash_Type *Next;
+  }Hash_t,*Hash_ptr;
+
+  Hash_ptr MyHash;
+  unsigned int  Hash_Function(unsigned long);
+
+/*** Area Publica ***/
+public:
+   THash();//Construtora
+   void  Insere(char *,unsigned int);
+   unsigned int  Pesquisa(const char *);
+};
+//---------------------------------------------------------------------------
+#endif
diff --git a/src/terralib/stat/heap.cpp b/src/terralib/stat/heap.cpp
new file mode 100644
index 0000000..72f2ad2
--- /dev/null
+++ b/src/terralib/stat/heap.cpp
@@ -0,0 +1,124 @@
+//---------------------------------------------------------------------------
+#include <limits.h>
+#include <stdlib.h>
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "heap.h"
+#include "erro.h"
+
+/********* Mantem a propriedade de Heap (Para Baixo) *****/
+void  THeap::DownHeap(int i){
+   int l;// esquerda
+   int r;// direita
+
+   int max;
+   TipoHeap_t swap;
+
+   l=2*i; //filho da esquerda de i
+   r=2*i+1;// filho da direita de i
+   if ((l<=MyHeap->Size) && (MyHeap->Nos[l].Chave < MyHeap->Nos[r].Chave))
+      max=l;
+    else
+      max=i;
+   if ((r<=MyHeap->Size) && (MyHeap->Nos[r].Chave < MyHeap->Nos[max].Chave))
+      max=r;
+   if (max!=i) {
+      /* Atualiza KeyAux */
+      KeyAux[MyHeap->Nos[i].Indice] = max;
+      KeyAux[MyHeap->Nos[max].Indice] = i;
+
+      /*** Troca Heap[i] com Heap[max] ***/
+      swap = MyHeap->Nos[i];
+      MyHeap->Nos[i] = MyHeap->Nos[max];
+      MyHeap->Nos[max] = swap;
+      /***  Fim da troca *****/
+      DownHeap(max); // Continua o processo
+     };
+};
+
+/******** Mantem a propriedade de Heap (Para Cima) *********/
+void THeap::UpHeap(int i){
+  TipoHeap_t Aux;
+  int swap;
+
+  Aux = MyHeap->Nos[i];
+  /* Guarda a posicao ocupada pelo Indice[i] no Heap */
+  swap = MyHeap->Nos[i].Indice;
+
+  while (i>1 && MyHeap->Nos[i/2].Chave > Aux.Chave){
+
+     /* Atualiza a KeyAux */
+     KeyAux[MyHeap->Nos[i/2].Indice] = i;
+
+     MyHeap->Nos[i] = MyHeap->Nos[i/2];
+     i/=2;
+  };
+  MyHeap->Nos[i] = Aux;
+  /* Atualiza a posicao do KeyAux do item que subiu no Heap */
+  KeyAux[swap] = i;
+};
+
+/******** Funcao que monta o Heap a partir de um Array *****/
+void THeap::Build_Heap(){
+   int i;
+
+   for (i=(MyHeap->Size)/2;i>=1;i--)
+      THeap::DownHeap(i);
+};
+
+/******** Extrai o elemento de maior prioridade e remonta o Heap ********/
+int THeap::Extract_Min(){
+    int min;
+
+    if (MyHeap->Size<1) FatalError("Heap Vazio"); /*acrescentar mensagem de erro*/
+    min=MyHeap->Nos[1].Indice;
+
+    /** Atualiza o KeyAux do Item que foi pra frente */
+    KeyAux[MyHeap->Nos[MyHeap->Size].Indice] = 1;
+    /** Atualiza o KeyAux do Item que foi pro vinagre */
+    KeyAux[MyHeap->Nos[1].Indice] = -1;
+
+    MyHeap->Nos[1] = MyHeap->Nos[MyHeap->Size];
+
+    (MyHeap->Size)--;
+    DownHeap(1);
+    return min;
+};
+
+THeap::THeap(int Size){
+   int i;
+  /*** Inicializacao do Heap ***/
+  MyHeap = new Heap_t;
+  MyHeap->Size = Size;
+  MyHeap->Nos = (TipoHeap_ptr) malloc(sizeof(TipoHeap_t)*(MyHeap->Size+1));
+  KeyAux = (int *) malloc(sizeof(int)*Size);
+  /*** Preenchimento do Heap ***/
+  MyHeap->Nos[1].Chave = 0; // Inicializacao do nodo 1
+  MyHeap->Nos[1].Indice = 0;
+  KeyAux[0]=1;
+  for(i=2;i<=MyHeap->Size;i++) {
+    KeyAux[i-1]=i;
+    MyHeap->Nos[i].Chave = INT_MAX;
+    MyHeap->Nos[i].Indice = i-1;
+  };
+};
+
+/****************************/
+ int THeap::Empty(){
+   return !(MyHeap->Size);
+ };
+
+/*************************/
+double  THeap::GetKey(int Indice){
+   return MyHeap->Nos[KeyAux[Indice]].Chave;
+};
+
+/****************************/
+void  THeap::SetKey(int Indice,double NKey){
+   MyHeap->Nos[KeyAux[Indice]].Chave = NKey;
+   UpHeap(KeyAux[Indice]);
+};
+
+
diff --git a/src/terralib/stat/heap.h b/src/terralib/stat/heap.h
new file mode 100644
index 0000000..3c0cf00
--- /dev/null
+++ b/src/terralib/stat/heap.h
@@ -0,0 +1,36 @@
+//---------------------------------------------------------------------------
+#ifndef heapH
+#define heapH
+#include "TeSkaterGrafo.h"
+//---------------------------------------------------------------------------
+class THeap {
+
+/********  Area Privada  *********/
+private:
+    /* Tipo dos nos do heap */
+    typedef struct TipoHeap {
+        double Chave;
+        int Indice;
+      }TipoHeap_t,*TipoHeap_ptr;
+
+    /* Estrutura do TAD Heap : Tamanho + Vetor */
+    typedef struct Heap {
+        int Size;
+        TipoHeap_ptr Nos;
+        }Heap_t, *Heap_ptr;
+   int *KeyAux;
+   Heap_ptr MyHeap;
+   void  Build_Heap();
+   void  UpHeap(int);
+   void  DownHeap(int);
+   double  GetKey(int);
+
+/********  Area Publica  *********/
+public:
+   THeap(int);
+   double Key(int Indice) {return GetKey(Indice);}
+   void  SetKey(int,double);
+   int  Extract_Min();
+   int  Empty();
+};
+#endif
diff --git a/src/terralib/stat/lista.cpp b/src/terralib/stat/lista.cpp
new file mode 100644
index 0000000..3b19370
--- /dev/null
+++ b/src/terralib/stat/lista.cpp
@@ -0,0 +1,111 @@
+//---------------------------------------------------------------------------
+#include <stdlib.h>
+#include <stdio.h>
+
+#ifdef WIN32
+#pragma hdrstop
+#endif
+
+#include "lista.h"
+//---------------------------------------------------------------------------
+TListaVizinho::TListaVizinho(){
+     Lista = (Lista_ptr) malloc(sizeof(Lista_t));
+     if (!Lista) {
+       FatalError("Erro interno A1! \n Entre em contato com o desenvolvedor.");
+     };
+     Lista->Head = NULL;
+     Lista->Next = NULL;
+     Lista->NextB = NULL;
+     Lista->Size = 0;
+  };
+
+//---------------------------------------------------------------------------
+void  TListaVizinho::Insere(int indice,double peso){
+    Vizinho_ptr novo;
+
+    novo=(Vizinho_ptr) malloc(sizeof(Vizinho_t));
+    if (!novo) FatalError("Lista Erro"); /* Incluir mensagem de erro */
+
+    novo->Indice = indice;
+    novo->Peso = peso;
+    novo->Proximo = Lista->Head;
+
+    Lista->Head = novo;
+    Lista->Next=novo;
+    Lista->NextB=novo;
+    (Lista->Size)++;
+
+ };
+
+//---------------------------------------------------------------------------
+void  TListaVizinho::Adjacente(int *Indice,double *Peso) 
+{
+	try
+	{
+		if(!Lista) 
+			return;
+		
+		if(Lista->Size==0)
+			return; 
+
+		if (Lista->Next) {
+		 *Indice = Lista->Next->Indice;
+		 *Peso = Lista->Next->Peso;
+		 Lista->Next=Lista->Next->Proximo;
+	   }
+	   else {
+		 *Indice = -1;
+		 Lista->Next = Lista->Head;
+	   }
+	}
+	catch(...)
+	{
+		*Indice = -1;
+		return;
+	}
+ };
+
+//---------------------------------------------------------------------------
+void TListaVizinho::AdjacenteB(int *Indice,double *Peso){
+
+
+   if (Lista->NextB) {
+     *Indice = Lista->NextB->Indice;
+     *Peso = Lista->NextB->Peso;
+     Lista->NextB=Lista->NextB->Proximo;
+   }
+   else {
+     *Indice = -1;
+     Lista->NextB = Lista->Head;
+   };
+ };
+
+//---------------------------------------------------------------------------
+int TListaVizinho::GetSize(){
+  return Lista->Size;
+};
+
+//---------------------------------------------------------------------------
+void TListaVizinho::Retira(int Indice){
+  Vizinho_ptr Aux,Prev;
+
+  if(!Lista->Size) {
+    FatalError("Erro interno A2! \n\nEntre em contato com o desenvolvedor.");
+  };
+
+  Aux = Lista->Head;
+  if(Aux->Indice == Indice) {
+    Lista->Head = Aux->Proximo;
+    (Lista->Size)--;
+    Lista->Next = Aux->Proximo;
+    Lista->NextB = Aux->Proximo;
+  } else {
+     Prev = Aux;
+     for(;Aux->Indice != Indice;Aux = Aux->Proximo)
+       Prev = Aux;
+     Prev->Proximo = Aux->Proximo;
+     (Lista->Size)--;
+     free(Aux);
+  };
+};
+
diff --git a/src/terralib/stat/lista.h b/src/terralib/stat/lista.h
new file mode 100644
index 0000000..a2385d2
--- /dev/null
+++ b/src/terralib/stat/lista.h
@@ -0,0 +1,31 @@
+#ifndef ListaH
+#define ListaH
+
+#include "erro.h"
+class TListaVizinho{
+
+private:
+    typedef struct Vizinho {
+      int Indice;
+      double Peso;
+      struct Vizinho *Proximo;
+    }Vizinho_t,*Vizinho_ptr;
+
+    typedef struct ListaVizinho{
+      Vizinho_ptr Head;
+      int Size;
+      Vizinho_ptr Next; /* Utilizado para pesquisa */
+      Vizinho_ptr NextB; /* Utilizado para pesquisa e apelacao */
+      }Lista_t, *Lista_ptr;
+
+    Lista_ptr Lista;
+    int  GetSize();
+public:
+  TListaVizinho();
+  void  Insere(int,double);
+  void  Retira(int);
+  void  Adjacente(int *,double *);
+  void  AdjacenteB(int *,double *);
+  int Size;
+};
+#endif
diff --git a/src/tiff/cpl_csv.c b/src/tiff/cpl_csv.c
new file mode 100644
index 0000000..0c55abf
--- /dev/null
+++ b/src/tiff/cpl_csv.c
@@ -0,0 +1,1013 @@
+/******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * cpl_csv.c: Support functions for accessing CSV files.
+ *
+ * $Log: cpl_csv.c,v $
+ * Revision 1.3  2004/03/19 11:51:23  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.15  2003/01/20 06:46:35  warmerda
+ * search for pcs.csv, not horiz_cs.csv
+ *
+ * Revision 1.14  2003/01/15 04:39:58  warmerda
+ * change internal name of CSVAccess
+ *
+ * Revision 1.13  2002/11/28 22:26:41  warmerda
+ * upgraded to proper CSV formatting, and in-memory caching
+ *
+ * Revision 1.12  2002/06/19 03:51:15  warmerda
+ * migrated cpl_csv.h into cpl_serv.h
+ *
+ * Revision 1.11  2001/03/05 04:49:56  warmerda
+ * try to clear CPLReadLine buffer on deaccess
+ *
+ * Revision 1.10  2001/01/17 15:32:19  warmerda
+ * Include /usr/share/epsg_csv and share/epsg_csv in csv search path.
+ *
+ * Revision 1.9  2000/12/12 19:34:36  warmerda
+ * Use CSV_DATA_DIR if defined.
+ *
+ * Revision 1.8  2000/08/22 04:33:33  warmerda
+ * added support for /usr/local/shared/epsg_csv
+ *
+ * Revision 1.7  1999/12/03 14:42:59  warmerda
+ * Passing a NULL filename into CSVAccess() now results in a graceful
+ * failure to open the file.
+ *
+ * Revision 1.6  1999/06/26 17:28:51  warmerda
+ * Fixed reading of records with newlines embedded in quoted strings.
+ *
+ * Revision 1.5  1999/05/04 03:07:24  warmerda
+ * avoid warning
+ *
+ * Revision 1.4  1999/04/28 19:59:56  warmerda
+ * added some doxygen style documentation
+ *
+ * Revision 1.3  1999/03/17 19:53:15  geotiff
+ * sys includes moved to cpl_serv.h
+ *
+ * Revision 1.2  1999/03/10 16:54:42  geotiff
+ * Added use of the GEOTIFF_CSV environment variable to locate CSV files.
+ *
+ * Revision 1.1  1999/03/09 15:57:04  geotiff
+ * New
+ *
+ * Revision 1.2  1999/02/24 16:23:21  warmerda
+ * added lots
+ *
+ * Revision 1.1  1999/01/05 16:52:36  warmerda
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geo_tiffp.h"
+
+/* ==================================================================== */
+/*      The CSVTable is a persistant set of info about an open CSV      */
+/*      table.  While it doesn't currently maintain a record index,     */
+/*      or in-memory copy of the table, it could be changed to do so    */
+/*      in the future.                                                  */
+/* ==================================================================== */
+typedef struct ctb {
+    FILE        *fp;
+
+    struct ctb *psNext;
+
+    char        *pszFilename;
+
+    char        **papszFieldNames;
+
+    char        **papszRecFields;
+
+    int         iLastLine;
+
+    /* Cache for whole file */
+    int         nLineCount;
+    char        **papszLines;
+    int         *panLineIndex;
+    char        *pszRawData;
+} CSVTable;
+
+static CSVTable *psCSVTableList = NULL;
+
+/************************************************************************/
+/*                             CSVAccess()                              */
+/*                                                                      */
+/*      This function will fetch a handle to the requested table.       */
+/*      If not found in the ``open table list'' the table will be       */
+/*      opened and added to the list.  Eventually this function may     */
+/*      become public with an abstracted return type so that            */
+/*      applications can set options about the table.  For now this     */
+/*      isn't done.                                                     */
+/************************************************************************/
+
+static CSVTable *gtCSVAccess( const char * pszFilename )
+
+{
+    CSVTable    *psTable;
+    FILE        *fp;
+
+/* -------------------------------------------------------------------- */
+/*      Is the table already in the list.                               */
+/* -------------------------------------------------------------------- */
+    for( psTable = psCSVTableList; psTable != NULL; psTable = psTable->psNext )
+    {
+        if( EQUAL(psTable->pszFilename,pszFilename) )
+        {
+            /*
+             * Eventually we should consider promoting to the front of
+             * the list to accelerate frequently accessed tables.
+             */
+            
+            return( psTable );
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      If not, try to open it.                                         */
+/* -------------------------------------------------------------------- */
+    fp = VSIFOpen( pszFilename, "rb" );
+    if( fp == NULL )
+        return NULL;
+
+/* -------------------------------------------------------------------- */
+/*      Create an information structure about this table, and add to    */
+/*      the front of the list.                                          */
+/* -------------------------------------------------------------------- */
+    psTable = (CSVTable *) CPLCalloc(sizeof(CSVTable),1);
+
+    psTable->fp = fp;
+    psTable->pszFilename = CPLStrdup( pszFilename );
+    psTable->psNext = psCSVTableList;
+    
+    psCSVTableList = psTable;
+
+/* -------------------------------------------------------------------- */
+/*      Read the table header record containing the field names.        */
+/* -------------------------------------------------------------------- */
+    psTable->papszFieldNames = CSVReadParseLine( fp );
+
+    return( psTable );
+}
+
+/************************************************************************/
+/*                            CSVDeaccess()                             */
+/************************************************************************/
+
+void CSVDeaccess( const char * pszFilename )
+
+{
+    CSVTable    *psLast, *psTable;
+    
+/* -------------------------------------------------------------------- */
+/*      A NULL means deaccess all tables.                               */
+/* -------------------------------------------------------------------- */
+    if( pszFilename == NULL )
+    {
+        while( psCSVTableList != NULL )
+            CSVDeaccess( psCSVTableList->pszFilename );
+        
+        return;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Find this table.                                                */
+/* -------------------------------------------------------------------- */
+    psLast = NULL;
+    for( psTable = psCSVTableList;
+         psTable != NULL && !EQUAL(psTable->pszFilename,pszFilename);
+         psTable = psTable->psNext )
+    {
+        psLast = psTable;
+    }
+
+    if( psTable == NULL )
+    {
+        return;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Remove the link from the list.                                  */
+/* -------------------------------------------------------------------- */
+    if( psLast != NULL )
+        psLast->psNext = psTable->psNext;
+    else
+        psCSVTableList = psTable->psNext;
+
+/* -------------------------------------------------------------------- */
+/*      Free the table.                                                 */
+/* -------------------------------------------------------------------- */
+    if( psTable->fp != NULL )
+        VSIFClose( psTable->fp );
+
+    CSLDestroy( psTable->papszFieldNames );
+    CSLDestroy( psTable->papszRecFields );
+    CPLFree( psTable->pszFilename );
+    CPLFree( psTable->panLineIndex );
+    CPLFree( psTable->pszRawData );
+    CPLFree( psTable->papszLines );
+
+    CPLFree( psTable );
+
+    CPLReadLine( NULL );
+}
+
+/************************************************************************/
+/*                            CSVSplitLine()                            */
+/*                                                                      */
+/*      Tokenize a CSV line into fields in the form of a string         */
+/*      list.  This is used instead of the CPLTokenizeString()          */
+/*      because it provides correct CSV escaping and quoting            */
+/*      semantics.                                                      */
+/************************************************************************/
+
+static char **CSVSplitLine( const char *pszString )
+
+{
+    char        **papszRetList = NULL;
+    char        *pszToken;
+    int         nTokenMax, nTokenLen;
+
+    pszToken = (char *) CPLCalloc(10,1);
+    nTokenMax = 10;
+    
+    while( pszString != NULL && *pszString != '\0' )
+    {
+        int     bInString = FALSE;
+
+        nTokenLen = 0;
+        
+        /* Try to find the next delimeter, marking end of token */
+        for( ; *pszString != '\0'; pszString++ )
+        {
+
+            /* End if this is a delimeter skip it and break. */
+            if( !bInString && *pszString == ',' )
+            {
+                pszString++;
+                break;
+            }
+            
+            if( *pszString == '"' )
+            {
+                if( !bInString || pszString[1] != '"' )
+                {
+                    bInString = !bInString;
+                    continue;
+                }
+                else  /* doubled quotes in string resolve to one quote */
+                {
+                    pszString++;
+                }
+            }
+
+            if( nTokenLen >= nTokenMax-2 )
+            {
+                nTokenMax = nTokenMax * 2 + 10;
+                pszToken = (char *) CPLRealloc( pszToken, nTokenMax );
+            }
+
+            pszToken[nTokenLen] = *pszString;
+            nTokenLen++;
+        }
+
+        pszToken[nTokenLen] = '\0';
+        papszRetList = CSLAddString( papszRetList, pszToken );
+
+        /* If the last token is an empty token, then we have to catch
+         * it now, otherwise we won't reenter the loop and it will be lost. 
+         */
+        if ( *pszString == '\0' && *(pszString-1) == ',' )
+        {
+            papszRetList = CSLAddString( papszRetList, "" );
+        }
+    }
+
+    if( papszRetList == NULL )
+        papszRetList = (char **) CPLCalloc(sizeof(char *),1);
+
+    CPLFree( pszToken );
+
+    return papszRetList;
+}
+
+/************************************************************************/
+/*                          CSVFindNextLine()                           */
+/*                                                                      */
+/*      Find the start of the next line, while at the same time zero    */
+/*      terminating this line.  Take into account that there may be     */
+/*      newline indicators within quoted strings, and that quotes       */
+/*      can be escaped with a backslash.                                */
+/************************************************************************/
+
+static char *CSVFindNextLine( char *pszThisLine )
+
+{
+    int  nQuoteCount = 0, i;
+
+    for( i = 0; pszThisLine[i] != '\0'; i++ )
+    {
+        if( pszThisLine[i] == '\"'
+            && (i == 0 || pszThisLine[i-1] != '\\') )
+            nQuoteCount++;
+
+        if( (pszThisLine[i] == 10 || pszThisLine[i] == 13)
+            && (nQuoteCount % 2) == 0 )
+            break;
+    }
+
+    while( pszThisLine[i] == 10 || pszThisLine[i] == 13 )
+        pszThisLine[i++] = '\0';
+
+    if( pszThisLine[i] == '\0' )
+        return NULL;
+    else
+        return pszThisLine + i;
+}
+
+/************************************************************************/
+/*                             CSVIngest()                              */
+/*                                                                      */
+/*      Load entire file into memory and setup index if possible.       */
+/************************************************************************/
+
+static void CSVIngest( const char *pszFilename )
+
+{
+    CSVTable *psTable = gtCSVAccess( pszFilename );
+    int       nFileLen, i, nMaxLineCount, iLine = 0;
+    char *pszThisLine;
+
+    if( psTable->pszRawData != NULL )
+        return;
+
+/* -------------------------------------------------------------------- */
+/*      Ingest whole file.                                              */
+/* -------------------------------------------------------------------- */
+    VSIFSeek( psTable->fp, 0, SEEK_END );
+    nFileLen = VSIFTell( psTable->fp );
+    VSIRewind( psTable->fp );
+
+    psTable->pszRawData = (char *) CPLMalloc(nFileLen+1);
+    if( (int) VSIFRead( psTable->pszRawData, 1, nFileLen, psTable->fp ) 
+        != nFileLen )
+    {
+        CPLFree( psTable->pszRawData );
+        psTable->pszRawData = NULL;
+
+        CPLError( CE_Failure, CPLE_FileIO, "Read of file %s failed.", 
+                  psTable->pszFilename );
+        return;
+    }
+
+    psTable->pszRawData[nFileLen] = '\0';
+
+/* -------------------------------------------------------------------- */
+/*      Get count of newlines so we can allocate line array.            */
+/* -------------------------------------------------------------------- */
+    nMaxLineCount = 0;
+    for( i = 0; i < nFileLen; i++ )
+    {
+        if( psTable->pszRawData[i] == 10 )
+            nMaxLineCount++;
+    }
+
+    psTable->papszLines = (char **) CPLCalloc(sizeof(char*),nMaxLineCount);
+    
+/* -------------------------------------------------------------------- */
+/*      Build a list of record pointers into the raw data buffer        */
+/*      based on line terminators.  Zero terminate the line             */
+/*      strings.                                                        */
+/* -------------------------------------------------------------------- */
+    /* skip header line */
+    pszThisLine = CSVFindNextLine( psTable->pszRawData );
+
+    while( pszThisLine != NULL && iLine < nMaxLineCount )
+    {
+        psTable->papszLines[iLine++] = pszThisLine;
+        pszThisLine = CSVFindNextLine( pszThisLine );
+    }
+
+    psTable->nLineCount = iLine;
+
+/* -------------------------------------------------------------------- */
+/*      Allocate and populate index array.  Ensure they are in          */
+/*      ascending order so that binary searches can be done on the      */
+/*      array.                                                          */
+/* -------------------------------------------------------------------- */
+    psTable->panLineIndex = (int *) CPLMalloc(sizeof(int)*psTable->nLineCount);
+    for( i = 0; i < psTable->nLineCount; i++ )
+    {
+        psTable->panLineIndex[i] = atoi(psTable->papszLines[i]);
+
+        if( i > 0 && psTable->panLineIndex[i] < psTable->panLineIndex[i-1] )
+        {
+            CPLFree( psTable->panLineIndex );
+            psTable->panLineIndex = NULL;
+            break;
+        }
+    }
+
+    psTable->iLastLine = -1;
+
+/* -------------------------------------------------------------------- */
+/*      We should never need the file handle against, so close it.      */
+/* -------------------------------------------------------------------- */
+    VSIFClose( psTable->fp );
+    psTable->fp = NULL;
+}
+
+/************************************************************************/
+/*                          CSVReadParseLine()                          */
+/*                                                                      */
+/*      Read one line, and return split into fields.  The return        */
+/*      result is a stringlist, in the sense of the CSL functions.      */
+/************************************************************************/
+
+char **CSVReadParseLine( FILE * fp )
+
+{
+    const char  *pszLine;
+    char        *pszWorkLine;
+    char        **papszReturn;
+
+    CPLAssert( fp != NULL );
+    if( fp == NULL )
+        return( NULL );
+    
+    pszLine = CPLReadLine( fp );
+    if( pszLine == NULL )
+        return( NULL );
+
+/* -------------------------------------------------------------------- */
+/*      If there are no quotes, then this is the simple case.           */
+/*      Parse, and return tokens.                                       */
+/* -------------------------------------------------------------------- */
+    if( strchr(pszLine,'\"') == NULL )
+        return CSVSplitLine( pszLine );
+
+/* -------------------------------------------------------------------- */
+/*      We must now count the quotes in our working string, and as      */
+/*      long as it is odd, keep adding new lines.                       */
+/* -------------------------------------------------------------------- */
+    pszWorkLine = CPLStrdup( pszLine );
+
+    while( TRUE )
+    {
+        int             i, nCount = 0;
+
+        for( i = 0; pszWorkLine[i] != '\0'; i++ )
+        {
+            if( pszWorkLine[i] == '\"'
+                && (i == 0 || pszWorkLine[i-1] != '\\') )
+                nCount++;
+        }
+
+        if( nCount % 2 == 0 )
+            break;
+
+        pszLine = CPLReadLine( fp );
+        if( pszLine == NULL )
+            break;
+
+        pszWorkLine = (char *)
+            CPLRealloc(pszWorkLine,
+                       strlen(pszWorkLine) + strlen(pszLine) + 1);
+        strcat( pszWorkLine, pszLine );
+    }
+    
+    papszReturn = CSVSplitLine( pszWorkLine );
+
+    CPLFree( pszWorkLine );
+
+    return papszReturn;
+}
+
+/************************************************************************/
+/*                             CSVCompare()                             */
+/*                                                                      */
+/*      Compare a field to a search value using a particular            */
+/*      criteria.                                                       */
+/************************************************************************/
+
+static int CSVCompare( const char * pszFieldValue, const char * pszTarget,
+                       CSVCompareCriteria eCriteria )
+
+{
+    if( eCriteria == CC_ExactString )
+    {
+        return( strcmp( pszFieldValue, pszTarget ) == 0 );
+    }
+    else if( eCriteria == CC_ApproxString )
+    {
+        return( EQUAL( pszFieldValue, pszTarget ) );
+    }
+    else if( eCriteria == CC_Integer )
+    {
+        return( atoi(pszFieldValue) == atoi(pszTarget) );
+    }
+
+    return FALSE;
+}
+
+/************************************************************************/
+/*                            CSVScanLines()                            */
+/*                                                                      */
+/*      Read the file scanline for lines where the key field equals     */
+/*      the indicated value with the suggested comparison criteria.     */
+/*      Return the first matching line split into fields.               */
+/************************************************************************/
+
+char **CSVScanLines( FILE *fp, int iKeyField, const char * pszValue,
+                     CSVCompareCriteria eCriteria )
+
+{
+    char        **papszFields = NULL;
+    int         bSelected = FALSE, nTestValue;
+
+    CPLAssert( pszValue != NULL );
+    CPLAssert( iKeyField >= 0 );
+    CPLAssert( fp != NULL );
+    
+    nTestValue = atoi(pszValue);
+    
+    while( !bSelected ) {
+        papszFields = CSVReadParseLine( fp );
+        if( papszFields == NULL )
+            return( NULL );
+
+        if( CSLCount( papszFields ) < iKeyField+1 )
+        {
+            /* not selected */
+        }
+        else if( eCriteria == CC_Integer
+                 && atoi(papszFields[iKeyField]) == nTestValue )
+        {
+            bSelected = TRUE;
+        }
+        else
+        {
+            bSelected = CSVCompare( papszFields[iKeyField], pszValue,
+                                    eCriteria );
+        }
+
+        if( !bSelected )
+        {
+            CSLDestroy( papszFields );
+            papszFields = NULL;
+        }
+    }
+    
+    return( papszFields );
+}
+
+/************************************************************************/
+/*                        CSVScanLinesIndexed()                         */
+/*                                                                      */
+/*      Read the file scanline for lines where the key field equals     */
+/*      the indicated value with the suggested comparison criteria.     */
+/*      Return the first matching line split into fields.               */
+/************************************************************************/
+
+static char **
+CSVScanLinesIndexed( CSVTable *psTable, int nKeyValue )
+
+{
+    int         iTop, iBottom, iMiddle, iResult = -1;
+
+    CPLAssert( psTable->panLineIndex != NULL );
+
+/* -------------------------------------------------------------------- */
+/*      Find target record with binary search.                          */
+/* -------------------------------------------------------------------- */
+    iTop = psTable->nLineCount-1;
+    iBottom = 0;
+
+    while( iTop >= iBottom )
+    {
+        iMiddle = (iTop + iBottom) / 2;
+        if( psTable->panLineIndex[iMiddle] > nKeyValue )
+            iTop = iMiddle - 1;
+        else if( psTable->panLineIndex[iMiddle] < nKeyValue )
+            iBottom = iMiddle + 1;
+        else
+        {
+            iResult = iMiddle;
+            break;
+        }
+    }
+
+    if( iResult == -1 )
+        return NULL;
+
+/* -------------------------------------------------------------------- */
+/*      Parse target line, and update iLastLine indicator.              */
+/* -------------------------------------------------------------------- */
+    psTable->iLastLine = iResult;
+    
+    return CSVSplitLine( psTable->papszLines[iResult] );
+}
+
+/************************************************************************/
+/*                        CSVScanLinesIngested()                        */
+/*                                                                      */
+/*      Read the file scanline for lines where the key field equals     */
+/*      the indicated value with the suggested comparison criteria.     */
+/*      Return the first matching line split into fields.               */
+/************************************************************************/
+
+static char **
+CSVScanLinesIngested( CSVTable *psTable, int iKeyField, const char * pszValue,
+                      CSVCompareCriteria eCriteria )
+
+{
+    char        **papszFields = NULL;
+    int         bSelected = FALSE, nTestValue;
+
+    CPLAssert( pszValue != NULL );
+    CPLAssert( iKeyField >= 0 );
+
+    nTestValue = atoi(pszValue);
+    
+/* -------------------------------------------------------------------- */
+/*      Short cut for indexed files.                                    */
+/* -------------------------------------------------------------------- */
+    if( iKeyField == 0 && eCriteria == CC_Integer 
+        && psTable->panLineIndex != NULL )
+        return CSVScanLinesIndexed( psTable, nTestValue );
+    
+/* -------------------------------------------------------------------- */
+/*      Scan from in-core lines.                                        */
+/* -------------------------------------------------------------------- */
+    while( !bSelected && psTable->iLastLine+1 < psTable->nLineCount ) {
+        psTable->iLastLine++;
+        papszFields = CSVSplitLine( psTable->papszLines[psTable->iLastLine] );
+
+        if( CSLCount( papszFields ) < iKeyField+1 )
+        {
+            /* not selected */
+        }
+        else if( eCriteria == CC_Integer
+                 && atoi(papszFields[iKeyField]) == nTestValue )
+        {
+            bSelected = TRUE;
+        }
+        else
+        {
+            bSelected = CSVCompare( papszFields[iKeyField], pszValue,
+                                    eCriteria );
+        }
+
+        if( !bSelected )
+        {
+            CSLDestroy( papszFields );
+            papszFields = NULL;
+        }
+    }
+    
+    return( papszFields );
+}
+
+/************************************************************************/
+/*                            CSVScanFile()                             */
+/*                                                                      */
+/*      Scan a whole file using criteria similar to above, but also     */
+/*      taking care of file opening and closing.                        */
+/************************************************************************/
+
+char **CSVScanFile( const char * pszFilename, int iKeyField,
+                    const char * pszValue, CSVCompareCriteria eCriteria )
+
+{
+    CSVTable    *psTable;
+
+/* -------------------------------------------------------------------- */
+/*      Get access to the table.                                        */
+/* -------------------------------------------------------------------- */
+    CPLAssert( pszFilename != NULL );
+
+    if( iKeyField < 0 )
+        return NULL;
+
+    psTable = gtCSVAccess( pszFilename );
+    if( psTable == NULL )
+        return NULL;
+    
+    CSVIngest( pszFilename );
+
+/* -------------------------------------------------------------------- */
+/*      Does the current record match the criteria?  If so, just        */
+/*      return it again.                                                */
+/* -------------------------------------------------------------------- */
+    if( iKeyField >= 0
+        && iKeyField < CSLCount(psTable->papszRecFields)
+        && CSVCompare(pszValue,psTable->papszRecFields[iKeyField],eCriteria) )
+    {
+        return psTable->papszRecFields;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Scan the file from the beginning, replacing the ``current       */
+/*      record'' in our structure with the one that is found.           */
+/* -------------------------------------------------------------------- */
+    psTable->iLastLine = -1;
+    CSLDestroy( psTable->papszRecFields );
+
+    if( psTable->pszRawData != NULL )
+        psTable->papszRecFields = 
+            CSVScanLinesIngested( psTable, iKeyField, pszValue, eCriteria );
+    else
+    {
+        VSIRewind( psTable->fp );
+        CPLReadLine( psTable->fp );         /* throw away the header line */
+    
+        psTable->papszRecFields =
+            CSVScanLines( psTable->fp, iKeyField, pszValue, eCriteria );
+    }
+
+    return( psTable->papszRecFields );
+}
+
+/************************************************************************/
+/*                           CPLGetFieldId()                            */
+/*                                                                      */
+/*      Read the first record of a CSV file (rewinding to be sure),     */
+/*      and find the field with the indicated name.  Returns -1 if      */
+/*      it fails to find the field name.  Comparison is case            */
+/*      insensitive, but otherwise exact.  After this function has      */
+/*      been called the file pointer will be positioned just after      */
+/*      the first record.                                               */
+/************************************************************************/
+
+int CSVGetFieldId( FILE * fp, const char * pszFieldName )
+
+{
+    char        **papszFields;
+    int         i;
+    
+    CPLAssert( fp != NULL && pszFieldName != NULL );
+
+    VSIRewind( fp );
+
+    papszFields = CSVReadParseLine( fp );
+    for( i = 0; papszFields != NULL && papszFields[i] != NULL; i++ )
+    {
+        if( EQUAL(papszFields[i],pszFieldName) )
+        {
+            CSLDestroy( papszFields );
+            return i;
+        }
+    }
+
+    CSLDestroy( papszFields );
+
+    return -1;
+}
+
+/************************************************************************/
+/*                         CSVGetFileFieldId()                          */
+/*                                                                      */
+/*      Same as CPLGetFieldId(), except that we get the file based      */
+/*      on filename, rather than having an existing handle.             */
+/************************************************************************/
+
+int CSVGetFileFieldId( const char * pszFilename, const char * pszFieldName )
+
+{
+    CSVTable    *psTable;
+    int         i;
+    
+/* -------------------------------------------------------------------- */
+/*      Get access to the table.                                        */
+/* -------------------------------------------------------------------- */
+    CPLAssert( pszFilename != NULL );
+
+    psTable = gtCSVAccess( pszFilename );
+    if( psTable == NULL )
+        return -1;
+
+/* -------------------------------------------------------------------- */
+/*      Find the requested field.                                       */
+/* -------------------------------------------------------------------- */
+    for( i = 0;
+         psTable->papszFieldNames != NULL
+             && psTable->papszFieldNames[i] != NULL;
+         i++ )
+    {
+        if( EQUAL(psTable->papszFieldNames[i],pszFieldName) )
+        {
+            return i;
+        }
+    }
+
+    return -1;
+}
+
+
+/************************************************************************/
+/*                         CSVScanFileByName()                          */
+/*                                                                      */
+/*      Same as CSVScanFile(), but using a field name instead of a      */
+/*      field number.                                                   */
+/************************************************************************/
+
+char **CSVScanFileByName( const char * pszFilename,
+                          const char * pszKeyFieldName,
+                          const char * pszValue, CSVCompareCriteria eCriteria )
+
+{
+    int         iKeyField;
+
+    iKeyField = CSVGetFileFieldId( pszFilename, pszKeyFieldName );
+    if( iKeyField == -1 )
+        return NULL;
+
+    return( CSVScanFile( pszFilename, iKeyField, pszValue, eCriteria ) );
+}
+
+/************************************************************************/
+/*                            CSVGetField()                             */
+/*                                                                      */
+/*      The all-in-one function to fetch a particular field value       */
+/*      from a CSV file.  Note this function will return an empty       */
+/*      string, rather than NULL if it fails to find the desired        */
+/*      value for some reason.  The caller can't establish that the     */
+/*      fetch failed.                                                   */
+/************************************************************************/
+
+const char *CSVGetField( const char * pszFilename,
+                         const char * pszKeyFieldName,
+                         const char * pszKeyFieldValue,
+                         CSVCompareCriteria eCriteria,
+                         const char * pszTargetField )
+
+{
+    CSVTable    *psTable;
+    char        **papszRecord;
+    int         iTargetField;
+    
+/* -------------------------------------------------------------------- */
+/*      Find the table.                                                 */
+/* -------------------------------------------------------------------- */
+    psTable = gtCSVAccess( pszFilename );
+    if( psTable == NULL )
+        return "";
+
+/* -------------------------------------------------------------------- */
+/*      Find the correct record.                                        */
+/* -------------------------------------------------------------------- */
+    papszRecord = CSVScanFileByName( pszFilename, pszKeyFieldName,
+                                     pszKeyFieldValue, eCriteria );
+
+    if( papszRecord == NULL )
+        return "";
+
+/* -------------------------------------------------------------------- */
+/*      Figure out which field we want out of this.                     */
+/* -------------------------------------------------------------------- */
+    iTargetField = CSVGetFileFieldId( pszFilename, pszTargetField );
+    if( iTargetField < 0 )
+        return "";
+
+    if( iTargetField >= CSLCount( papszRecord ) )
+        return "";
+
+    return( papszRecord[iTargetField] );
+}
+
+/************************************************************************/
+/*                            CSVFilename()                             */
+/*                                                                      */
+/*      Return the full path to a particular CSV file.  This will       */
+/*      eventually be something the application can override.           */
+/************************************************************************/
+
+static const char *(*pfnCSVFilenameHook)(const char *) = NULL;
+
+const char * CSVFilename( const char *pszBasename )
+
+{
+    static char		szPath[512];
+
+    if( pfnCSVFilenameHook == NULL )
+    {
+        FILE	*fp = NULL;
+
+        if( getenv("GEOTIFF_CSV") != NULL )
+        {
+            sprintf( szPath, "%s/%s", getenv("GEOTIFF_CSV"), pszBasename );
+        }
+#ifdef CSV_DATA_DIR
+        else 
+        {
+            sprintf( szPath, "%s/%s", CSV_DATA_DIR, pszBasename );
+        }
+#else
+        else if( (fp = fopen( "/usr/local/share/epsg/csv/pcs.csv", "rt" )) != NULL )
+        {
+            sprintf( szPath, "/usr/local/share/epsg/csv/%s", pszBasename );
+        }
+        else if( (fp = fopen( "csv/pcs.csv", "rt" )) != NULL )
+        {
+            sprintf( szPath, "csv/%s", pszBasename );
+        }
+        else if( (fp = fopen( "share/epsg_csv/pcs.csv", "rt" )) != NULL )
+        {
+            sprintf( szPath, "share/epsg_csv/%s", pszBasename );
+        }
+        else if( (fp = fopen( "/usr/share/epsg_csv/pcs.csv", "rt" )) != NULL )
+        {
+            sprintf( szPath, "/usr/share/epsg_csv/%s", pszBasename );
+        }
+        else
+        {
+            sprintf( szPath, "/usr/local/share/epsg_csv/%s", pszBasename );
+        }
+#endif
+
+        if( fp != NULL )
+            fclose( fp );
+        
+        return( szPath );
+    }
+    else
+        return( pfnCSVFilenameHook( pszBasename ) );
+}
+
+/************************************************************************/
+/*                         SetCSVFilenameHook()                         */
+/*                                                                      */
+/*      Applications can use this to set a function that will           */
+/*      massage CSV filenames.                                          */
+/************************************************************************/
+
+/**
+ * Override CSV file search method.
+ *
+ * @param CSVFileOverride The pointer to a function which will return the
+ * full path for a given filename.
+  *
+
+This function allows an application to override how the GTIFGetDefn() and related function find the CSV (Comma Separated
+Value) values required. The pfnHook argument should be a pointer to a function that will take in a CSV filename and return a
+full path to the file. The returned string should be to an internal static buffer so that the caller doesn't have to free the result.
+
+<b>Example:</b><br>
+
+The listgeo utility uses the following override function if the user
+specified a CSV file directory with the -t commandline switch (argument
+put into CSVDirName).  <p>
+
+<pre>
+
+    ...
+
+
+    SetCSVFilenameHook( CSVFileOverride );
+
+    ...
+
+
+static const char *CSVFileOverride( const char * pszInput )
+
+{
+    static char         szPath[1024];
+
+#ifdef WIN32
+    sprintf( szPath, "%s\\%s", CSVDirName, pszInput );
+#else    
+    sprintf( szPath, "%s/%s", CSVDirName, pszInput );
+#endif    
+
+    return( szPath );
+}
+</pre>
+
+*/
+
+void SetCSVFilenameHook( const char *(*pfnNewHook)( const char * ) )
+
+{
+    pfnCSVFilenameHook = pfnNewHook;
+}
diff --git a/src/tiff/cpl_csv.h b/src/tiff/cpl_csv.h
new file mode 100644
index 0000000..db4a1f8
--- /dev/null
+++ b/src/tiff/cpl_csv.h
@@ -0,0 +1,86 @@
+/******************************************************************************
+ * $Id: cpl_csv.h,v 1.1 2002/07/30 19:57:50 juan Exp $
+ *
+ * Project:  Common Portability Library
+ * Purpose:  Functions for reading and scaning CSV (comma separated,
+ *           variable length text files holding tables) files.  
+ * Author:   Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: cpl_csv.h,v $
+ * Revision 1.1  2002/07/30 19:57:50  juan
+ * File added
+ *
+ * Revision 1.1  2002/02/04 18:49:02  juan
+ * Arquivo adicionado
+ *
+ * Revision 1.1  1999/10/06 19:26:24  juan
+ * Add files for geotiff
+ *
+ * Revision 1.2  1999/03/17 20:42:40  geotiff
+ * Dont export the CSV functions from the DLL
+ *
+ * Revision 1.1  1999/03/09 15:57:04  geotiff
+ * New
+ *
+ * Revision 1.2  1999/02/24 16:22:58  warmerda
+ * cpl_csv.c
+ *
+ */
+
+#ifndef CPL_CSV_H_INCLUDED
+#define CPL_CSV_H_INCLUDED
+
+#include "cpl_serv.h"
+
+CPL_C_START
+
+typedef enum {
+    CC_ExactString,
+    CC_ApproxString,
+    CC_Integer
+} CSVCompareCriteria;
+
+const char  *CSVFilename( const char * );
+
+char  **CSVReadParseLine( FILE * );
+char  **CSVScanLines( FILE *, int, const char *, CSVCompareCriteria );
+char  **CSVScanFile( const char *, int, const char *,
+                            CSVCompareCriteria );
+char  **CSVScanFileByName( const char *, const char *, const char *,
+                                  CSVCompareCriteria );
+int  CSVGetFieldId( FILE *, const char * );
+int  CSVGetFileFieldId( const char *, const char * );
+
+void  CSVDeaccess( const char * );
+
+const char  *CSVGetField( const char *, const char *, const char *,
+                                 CSVCompareCriteria, const char * );
+
+void CPL_DLL SetCSVFilenameHook( const char *(*)(const char *) );
+
+CPL_C_END
+
+#endif /* ndef CPL_CSV_H_INCLUDED */
+
diff --git a/src/tiff/cpl_serv.c b/src/tiff/cpl_serv.c
new file mode 100644
index 0000000..7f8f7a6
--- /dev/null
+++ b/src/tiff/cpl_serv.c
@@ -0,0 +1,599 @@
+/******************************************************************************
+ * Copyright (c) 1998, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * cpl_serv.c: Various Common Portability Library derived convenience functions
+ *
+ * $Log: cpl_serv.c,v $
+ * Revision 1.3  2004/03/19 11:51:23  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.8  2001/07/09 20:14:37  warmerda
+ * Another problem freeing pszRLBuffer and not setting to NULL.
+ *
+ * Revision 1.7  2001/04/17 13:40:43  warmerda
+ * fixed freeing of line buffer in CPLReadLine(), init ptr to NULL
+ *
+ * Revision 1.6  2001/03/05 04:56:17  warmerda
+ * make it possible to deallocate CPLReadLine buffer
+ *
+ * Revision 1.5  2000/09/30 03:35:05  warmerda
+ * Fixed CPLReadLine() to use avoid calling VSIRealloc() on a NULL pointer.
+ *
+ * Revision 1.4  1999/06/25 04:35:26  warmerda
+ * Fixed to actually support long lines.
+ *
+ * Revision 1.3  1999/03/17 20:43:03  geotiff
+ * Avoid use of size_t keyword
+ *
+ * Revision 1.2  1999/03/10 18:22:39  geotiff
+ * Added string.h, fixed backslash escaping
+ *
+ * Revision 1.1  1999/03/09 15:57:04  geotiff
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geo_tiffp.h"
+
+#ifdef HAVE_STRING_H
+#  include <string.h>
+#endif
+#if defined(HAVE_STRINGS_H) && !defined(HAVE_STRING_H)
+#  include <strings.h>
+#endif
+
+/************************************************************************/
+/*                             CPLCalloc()                              */
+/************************************************************************/
+
+void *CPLCalloc( int nCount, int nSize )
+
+{
+    void	*pReturn;
+
+    if( nSize == 0 )
+        return NULL;
+    
+    pReturn = VSICalloc( nCount, nSize );
+    if( pReturn == NULL )
+    {
+        CPLError( CE_Fatal, CPLE_OutOfMemory,
+                  "CPLCalloc(): Out of memory allocating %d bytes.\n",
+                  nSize * nCount );
+    }
+
+    return pReturn;
+}
+
+/************************************************************************/
+/*                             CPLMalloc()                              */
+/************************************************************************/
+
+void *CPLMalloc( int nSize )
+
+{
+    void	*pReturn;
+
+    if( nSize == 0 )
+        return NULL;
+    
+    pReturn = VSIMalloc( nSize );
+    if( pReturn == NULL )
+    {
+        CPLError( CE_Fatal, CPLE_OutOfMemory,
+                  "CPLMalloc(): Out of memory allocating %d bytes.\n",
+                  nSize );
+    }
+
+    return pReturn;
+}
+
+/************************************************************************/
+/*                             CPLRealloc()                             */
+/************************************************************************/
+
+void * CPLRealloc( void * pData, int nNewSize )
+
+{
+    void	*pReturn;
+
+    if( pData == NULL )
+        pReturn = VSIMalloc( nNewSize );
+    else
+        pReturn = VSIRealloc( pData, nNewSize );
+    
+    if( pReturn == NULL )
+    {
+        CPLError( CE_Fatal, CPLE_OutOfMemory,
+                  "CPLRealloc(): Out of memory allocating %d bytes.\n",
+                  nNewSize );
+    }
+
+    return pReturn;
+}
+
+/************************************************************************/
+/*                             CPLStrdup()                              */
+/************************************************************************/
+
+char *CPLStrdup( const char * pszString )
+
+{
+    char	*pszReturn;
+
+    if( pszString == NULL )
+        pszString = "";
+
+    pszReturn = VSIMalloc( strlen(pszString)+1 );
+        
+    if( pszReturn == NULL )
+    {
+        CPLError( CE_Fatal, CPLE_OutOfMemory,
+                  "CPLStrdup(): Out of memory allocating %d bytes.\n",
+                  strlen(pszString) );
+        
+    }
+
+    strcpy( pszReturn, pszString );
+    
+    return( pszReturn );
+}
+
+/************************************************************************/
+/*                            CPLReadLine()                             */
+/*                                                                      */
+/*      Read a line of text from the given file handle, taking care     */
+/*      to capture CR and/or LF and strip off ... equivelent of         */
+/*      DKReadLine().  Pointer to an internal buffer is returned.       */
+/*      The application shouldn't free it, or depend on it's value      */
+/*      past the next call to CPLReadLine()                             */
+/************************************************************************/
+
+const char *CPLReadLine( FILE * fp )
+
+{
+    static char	*pszRLBuffer = NULL;
+    static int	nRLBufferSize = 0;
+    int		nLength, nReadSoFar = 0;
+
+/* -------------------------------------------------------------------- */
+/*      Cleanup case.                                                   */
+/* -------------------------------------------------------------------- */
+    if( fp == NULL )
+    {
+        CPLFree( pszRLBuffer );
+        pszRLBuffer = NULL;
+        nRLBufferSize = 0;
+        return NULL;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Loop reading chunks of the line till we get to the end of       */
+/*      the line.                                                       */
+/* -------------------------------------------------------------------- */
+    do {
+/* -------------------------------------------------------------------- */
+/*      Grow the working buffer if we have it nearly full.  Fail out    */
+/*      of read line if we can't reallocate it big enough (for          */
+/*      instance for a _very large_ file with no newlines).             */
+/* -------------------------------------------------------------------- */
+        if( nRLBufferSize-nReadSoFar < 128 )
+        {
+            nRLBufferSize = nRLBufferSize*2 + 128;
+            if( pszRLBuffer == NULL )
+                pszRLBuffer = (char *) VSIMalloc(nRLBufferSize);
+            else
+                pszRLBuffer = (char *) VSIRealloc(pszRLBuffer, nRLBufferSize);
+            if( pszRLBuffer == NULL )
+            {
+                nRLBufferSize = 0;
+                return NULL;
+            }
+        }
+
+/* -------------------------------------------------------------------- */
+/*      Do the actual read.                                             */
+/* -------------------------------------------------------------------- */
+        if( VSIFGets( pszRLBuffer+nReadSoFar, nRLBufferSize-nReadSoFar, fp )
+            == NULL )
+        {
+            CPLFree( pszRLBuffer );
+            pszRLBuffer = NULL;
+            nRLBufferSize = 0;
+
+            return NULL;
+        }
+
+        nReadSoFar = strlen(pszRLBuffer);
+
+    } while( nReadSoFar == nRLBufferSize - 1
+             && pszRLBuffer[nRLBufferSize-2] != 13
+             && pszRLBuffer[nRLBufferSize-2] != 10 );
+
+/* -------------------------------------------------------------------- */
+/*      Clear CR and LF off the end.                                    */
+/* -------------------------------------------------------------------- */
+    nLength = strlen(pszRLBuffer);
+    if( nLength > 0
+        && (pszRLBuffer[nLength-1] == 10 || pszRLBuffer[nLength-1] == 13) )
+    {
+        pszRLBuffer[--nLength] = '\0';
+    }
+    
+    if( nLength > 0
+        && (pszRLBuffer[nLength-1] == 10 || pszRLBuffer[nLength-1] == 13) )
+    {
+        pszRLBuffer[--nLength] = '\0';
+    }
+
+    return( pszRLBuffer );
+}
+
+
+/*=====================================================================
+                    StringList manipulation functions.
+ =====================================================================*/
+
+/**********************************************************************
+ *                       CSLAddString()
+ *
+ * Append a string to a StringList and return a pointer to the modified
+ * StringList.
+ * If the input StringList is NULL, then a new StringList is created.
+ **********************************************************************/
+char **CSLAddString(char **papszStrList, const char *pszNewString)
+{
+    int nItems=0;
+
+    if (pszNewString == NULL)
+        return papszStrList;    /* Nothing to do!*/
+
+    /* Allocate room for the new string */
+    if (papszStrList == NULL)
+        papszStrList = (char**) CPLCalloc(2,sizeof(char*));
+    else
+    {
+        nItems = CSLCount(papszStrList);
+        papszStrList = (char**)CPLRealloc(papszStrList, 
+                                          (nItems+2)*sizeof(char*));
+    }
+
+    /* Copy the string in the list */
+    papszStrList[nItems] = CPLStrdup(pszNewString);
+    papszStrList[nItems+1] = NULL;
+
+    return papszStrList;
+}
+
+/**********************************************************************
+ *                       CSLCount()
+ *
+ * Return the number of lines in a Stringlist.
+ **********************************************************************/
+int CSLCount(char **papszStrList)
+{
+    int nItems=0;
+
+    if (papszStrList)
+    {
+        while(*papszStrList != NULL)
+        {
+            nItems++;
+            papszStrList++;
+        }
+    }
+
+    return nItems;
+}
+
+
+/************************************************************************/
+/*                            CSLGetField()                             */
+/*                                                                      */
+/*      Fetches the indicated field, being careful not to crash if      */
+/*      the field doesn't exist within this string list.  The           */
+/*      returned pointer should not be freed, and doesn't               */
+/*      necessarily last long.                                          */
+/************************************************************************/
+
+const char * CSLGetField( char ** papszStrList, int iField )
+
+{
+    int         i;
+
+    if( papszStrList == NULL || iField < 0 )
+        return( "" );
+
+    for( i = 0; i < iField+1; i++ )
+    {
+        if( papszStrList[i] == NULL )
+            return "";
+    }
+
+    return( papszStrList[iField] );
+}
+
+/**********************************************************************
+ *                       CSLDestroy()
+ *
+ * Free all memory used by a StringList.
+ **********************************************************************/
+void CSLDestroy(char **papszStrList)
+{
+    char **papszPtr;
+
+    if (papszStrList)
+    {
+        papszPtr = papszStrList;
+        while(*papszPtr != NULL)
+        {
+            CPLFree(*papszPtr);
+            papszPtr++;
+        }
+
+        CPLFree(papszStrList);
+    }
+}
+
+
+/**********************************************************************
+ *                       CSLDuplicate()
+ *
+ * Allocate and return a copy of a StringList.
+ **********************************************************************/
+char    **CSLDuplicate(char **papszStrList)
+{
+    char **papszNewList, **papszSrc, **papszDst;
+    int  nLines;
+
+    nLines = CSLCount(papszStrList);
+
+    if (nLines == 0)
+        return NULL;
+
+    papszNewList = (char **)CPLMalloc((nLines+1)*sizeof(char*));
+    papszSrc = papszStrList;
+    papszDst = papszNewList;
+
+    while(*papszSrc != NULL)
+    {
+        *papszDst = CPLStrdup(*papszSrc);
+
+        papszSrc++;
+        papszDst++;
+    }
+    *papszDst = NULL;
+
+    return papszNewList;
+}
+
+/**********************************************************************
+ *                       CSLTokenizeString()
+ *
+ * Tokenizes a string and returns a StringList with one string for
+ * each token.
+ **********************************************************************/
+char    **CSLTokenizeString( const char *pszString )
+{
+    return CSLTokenizeStringComplex( pszString, " ", TRUE, FALSE );
+}
+
+/************************************************************************/
+/*                      CSLTokenizeStringComplex()                      */
+/*                                                                      */
+/*      The ultimate tokenizer?                                         */
+/************************************************************************/
+
+char ** CSLTokenizeStringComplex( const char * pszString,
+                                  const char * pszDelimiters,
+                                  int bHonourStrings, int bAllowEmptyTokens )
+
+{
+    char	**papszRetList = NULL;
+    char 	*pszToken;
+    int		nTokenMax, nTokenLen;
+
+    pszToken = (char *) CPLCalloc(10,1);
+    nTokenMax = 10;
+    
+    while( pszString != NULL && *pszString != '\0' )
+    {
+        int	bInString = FALSE;
+
+        nTokenLen = 0;
+        
+        /* Try to find the next delimeter, marking end of token */
+        for( ; *pszString != '\0'; pszString++ )
+        {
+
+            /* End if this is a delimeter skip it and break. */
+            if( !bInString && strchr(pszDelimiters, *pszString) != NULL )
+            {
+                pszString++;
+                break;
+            }
+            
+            /* If this is a quote, and we are honouring constant
+               strings, then process the constant strings, with out delim
+               but don't copy over the quotes */
+            if( bHonourStrings && *pszString == '"' )
+            {
+                if( bInString )
+                {
+                    bInString = FALSE;
+                    continue;
+                }
+                else
+                {
+                    bInString = TRUE;
+                    continue;
+                }
+            }
+
+            /* Within string constants we allow for escaped quotes, but
+               in processing them we will unescape the quotes */
+            if( bInString && pszString[0] == '\\' && pszString[1] == '"' )
+            {
+                pszString++;
+            }
+
+            /* Within string constants a \\ sequence reduces to \ */
+            else if( bInString
+                     && pszString[0] == '\\' && pszString[1] == '\\' )
+            {
+                pszString++;
+            }
+
+            if( nTokenLen >= nTokenMax-1 )
+            {
+                nTokenMax = nTokenMax * 2 + 10;
+                pszToken = (char *) CPLRealloc( pszToken, nTokenMax );
+            }
+
+            pszToken[nTokenLen] = *pszString;
+            nTokenLen++;
+        }
+
+        pszToken[nTokenLen] = '\0';
+
+        if( pszToken[0] != '\0' || bAllowEmptyTokens )
+        {
+            papszRetList = CSLAddString( papszRetList, pszToken );
+        }
+    }
+
+    if( papszRetList == NULL )
+        papszRetList = (char **) CPLCalloc(sizeof(char *),1);
+
+    CPLFree( pszToken );
+
+    return papszRetList;
+}
+
+/* static buffer to store the last error message.  We'll assume that error
+ * messages cannot be longer than 2000 chars... which is quite reasonable
+ * (that's 25 lines of 80 chars!!!)
+ */
+static char gszCPLLastErrMsg[2000] = "";
+static int  gnCPLLastErrNo = 0;
+
+static void (*gpfnCPLErrorHandler)(CPLErr, int, const char *) = NULL;
+
+/**********************************************************************
+ *                          CPLError()
+ *
+ * This function records an error code and displays the error message
+ * to stderr.
+ *
+ * The error code can be accessed later using CPLGetLastErrNo()
+ **********************************************************************/
+void    CPLError(CPLErr eErrClass, int err_no, const char *fmt, ...)
+{
+    va_list args;
+
+    /* Expand the error message 
+     */
+    va_start(args, fmt);
+    vsprintf(gszCPLLastErrMsg, fmt, args);
+    va_end(args);
+
+    /* If the user provided his own error handling function, then call
+     * it, otherwise print the error to stderr and return.
+     */
+    gnCPLLastErrNo = err_no;
+
+    if (gpfnCPLErrorHandler != NULL)
+    {
+        gpfnCPLErrorHandler(eErrClass, err_no, gszCPLLastErrMsg);
+    }
+    else
+    {
+        fprintf(stderr, "ERROR %d: %s\n", gnCPLLastErrNo, gszCPLLastErrMsg);
+    }
+
+    if( eErrClass == CE_Fatal )
+        abort();
+}
+
+/**********************************************************************
+ *                          CPLErrorReset()
+ *
+ * Erase any traces of previous errors.
+ **********************************************************************/
+void    CPLErrorReset()
+{
+    gnCPLLastErrNo = 0;
+    gszCPLLastErrMsg[0] = '\0';
+}
+
+
+/**********************************************************************
+ *                          CPLGetLastErrorNo()
+ *
+ **********************************************************************/
+int     CPLGetLastErrorNo()
+{
+    return gnCPLLastErrNo;
+}
+
+/**********************************************************************
+ *                          CPLGetLastErrorMsg()
+ *
+ **********************************************************************/
+const char* CPLGetLastErrorMsg()
+{
+    return gszCPLLastErrMsg;
+}
+
+/**********************************************************************
+ *                          CPLSetErrorHandler()
+ *
+ * Allow the library's user to specify his own error handler function.
+ *
+ * A valid error handler is a C function with the following prototype:
+ *
+ *     void MyErrorHandler(int errno, const char *msg)
+ *
+ * Pass NULL to come back to the default behavior.
+ **********************************************************************/
+
+void     CPLSetErrorHandler(void (*pfnErrorHandler)(CPLErr, int, const char *))
+{
+    gpfnCPLErrorHandler = pfnErrorHandler;
+}
+
+/************************************************************************/
+/*                             _CPLAssert()                             */
+/*                                                                      */
+/*      This function is called only when an assertion fails.           */
+/************************************************************************/
+
+void _CPLAssert( const char * pszExpression, const char * pszFile,
+                 int iLine )
+
+{
+    CPLError( CE_Fatal, CPLE_AssertionFailed,
+              "Assertion `%s' failed\n"
+              "in file `%s', line %d\n",
+              pszExpression, pszFile, iLine );
+}
diff --git a/src/tiff/cpl_serv.h b/src/tiff/cpl_serv.h
new file mode 100644
index 0000000..6672056
--- /dev/null
+++ b/src/tiff/cpl_serv.h
@@ -0,0 +1,276 @@
+/******************************************************************************
+ * Copyright (c) 1998, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * cpl_serv.h
+ *
+ * This include file derived and simplified from the GDAL Common Portability
+ * Library.
+ */
+
+#ifndef CPL_SERV_H_INCLUDED
+#define CPL_SERV_H_INCLUDED
+
+/* ==================================================================== */
+/*	Standard include files.						*/
+/* ==================================================================== */
+
+#include "geo_config.h"
+#include <stdio.h>
+
+#include <math.h>
+
+#ifdef HAVE_STRING_H
+#  include <string.h>
+#endif
+#if defined(HAVE_STRINGS_H) && !defined(HAVE_STRING_H)
+#  include <strings.h>
+#endif
+#ifdef HAVE_STDLIB_H
+#  include <stdlib.h>
+#endif
+
+/**********************************************************************
+ * Do we want to build as a DLL on windows?
+ **********************************************************************/
+#if !defined(CPL_DLL)
+#  if defined(_WIN32) && defined(BUILD_AS_DLL)
+#    define CPL_DLL     __declspec(dllexport)
+#  else
+#    define CPL_DLL
+#  endif
+#endif
+
+/* ==================================================================== */
+/*      Other standard services.                                        */
+/* ==================================================================== */
+#ifdef __cplusplus
+#  define CPL_C_START		extern "C" {
+#  define CPL_C_END		}
+#else
+#  define CPL_C_START
+#  define CPL_C_END
+#endif
+
+#ifndef NULL
+#  define NULL	0
+#endif
+
+#ifndef FALSE
+#  define FALSE	0
+#endif
+
+#ifndef TRUE
+#  define TRUE	1
+#endif
+
+#ifndef MAX
+#  define MIN(a,b)      ((a<b) ? a : b)
+#  define MAX(a,b)      ((a>b) ? a : b)
+#endif
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef ABS
+#  define ABS(x)        ((x<0) ? (-1*(x)) : x)
+#endif
+
+#ifndef EQUAL
+#if defined(_WIN32) && !defined(__CYGWIN__)
+#  define EQUALN(a,b,n)           (strnicmp(a,b,n)==0)
+#  define EQUAL(a,b)              (stricmp(a,b)==0)
+#else
+#  define EQUALN(a,b,n)           (strncasecmp(a,b,n)==0)
+#  define EQUAL(a,b)              (strcasecmp(a,b)==0)
+#endif
+#endif
+
+/* ==================================================================== */
+/*      VSI Services (just map directly onto Standard C services.       */
+/* ==================================================================== */
+
+#define VSIFOpen	fopen
+#define VSIFClose	fclose
+#define VSIFEof		feof
+#define VSIFPrintf	fprintf
+#define VSIFPuts	fputs
+#define VSIFPutc	fputc
+#define VSIFGets	fgets
+#define VSIRewind	rewind
+#define VSIFSeek        fseek
+#define VSIFTell        ftell
+#define VSIFRead        fread
+
+#ifndef notdef
+#define VSICalloc(x,y)	_GTIFcalloc(x*y)
+#define VSIMalloc	_GTIFcalloc
+#define VSIFree	        _GTIFFree
+#define VSIRealloc      _GTIFrealloc
+#else
+#define VSICalloc(x,y)	(((char *) _GTIFcalloc(x*y+4)) + 4)
+#define VSIMalloc(x)	(((char *) _GTIFcalloc((x)+4)) + 4)
+#define VSIFree(x)      _GTIFFree(((char *) (x)) - 4)
+#define VSIRealloc(p,n) (((char *) _GTIFrealloc(((char *)p)-4,(n)+4)) + 4)
+#endif
+
+/* -------------------------------------------------------------------- */
+/*      Safe malloc() API.  Thin cover over VSI functions with fatal    */
+/*      error reporting if memory allocation fails.                     */
+/* -------------------------------------------------------------------- */
+CPL_C_START
+
+#define CPLMalloc  gtCPLMalloc
+#define CPLCalloc  gtCPLCalloc
+#define CPLRealloc gtCPLRealloc
+#define CPLStrdup  gtCPLStrdup
+
+void  *CPLMalloc( int );
+void  *CPLCalloc( int, int );
+void  *CPLRealloc( void *, int );
+char  *CPLStrdup( const char * );
+
+#define CPLFree(x)	{ if( x != NULL ) VSIFree(x); }
+
+/* -------------------------------------------------------------------- */
+/*      Read a line from a text file, and strip of CR/LF.               */
+/* -------------------------------------------------------------------- */
+
+#define CPLReadLine gtCPLReadLine
+
+const char *CPLReadLine( FILE * );
+
+/*=====================================================================
+                   Error handling functions (cpl_error.c)
+ =====================================================================*/
+
+typedef enum
+{
+    CE_None = 0,
+    CE_Log = 1,
+    CE_Warning = 2,
+    CE_Failure = 3,
+    CE_Fatal = 4
+} CPLErr;
+
+#define CPLError      gtCPLError
+#define CPLErrorReset gtCPLErrorReset
+#define CPLGetLastErrorNo gtCPLGetLastErrorNo
+#define CPLGetLastErrorMsg gtCPLGetLastErrorMsg
+#define CPLSetErrorHandler gtCPLSetErrorHandler
+#define _CPLAssert    gt_CPLAssert
+
+void  CPLError(CPLErr eErrClass, int err_no, const char *fmt, ...);
+void  CPLErrorReset();
+int   CPLGetLastErrorNo();
+const char  * CPLGetLastErrorMsg();
+void  CPLSetErrorHandler(void(*pfnErrorHandler)(CPLErr,int,
+                                                       const char *));
+void  _CPLAssert( const char *, const char *, int );
+
+#ifdef DEBUG
+#  define CPLAssert(expr)  ((expr) ? (void)(0) : _CPLAssert(#expr,__FILE__,__LINE__))
+#else
+#  define CPLAssert(expr)
+#endif
+
+CPL_C_END
+
+/* ==================================================================== */
+/*      Well known error codes.                                         */
+/* ==================================================================== */
+
+#define CPLE_AppDefined			1
+#define CPLE_OutOfMemory		2
+#define CPLE_FileIO			3
+#define CPLE_OpenFailed			4
+#define CPLE_IllegalArg			5
+#define CPLE_NotSupported		6
+#define CPLE_AssertionFailed		7
+#define CPLE_NoWriteAccess		8
+
+/*=====================================================================
+                   Stringlist functions (strlist.c)
+ =====================================================================*/
+CPL_C_START
+
+#define CSLAddString gtCSLAddString
+#define CSLCount     gtCSLCount
+#define CSLGetField  gtCSLGetField
+#define CSLDestroy   gtCSLDestroy
+#define CSLDuplicate gtCSLDuplicate
+#define CSLTokenizeString gtCSLTokenizeString
+#define CSLTokenizeStringComplex gtCSLTokenizeStringComplex
+
+char    **CSLAddString(char **papszStrList, const char *pszNewString);
+int     CSLCount(char **papszStrList);
+const char *CSLGetField( char **, int );
+void    CSLDestroy(char **papszStrList);
+char    **CSLDuplicate(char **papszStrList);
+
+char    **CSLTokenizeString(const char *pszString );
+char    **CSLTokenizeStringComplex(const char *pszString,
+                                   const char *pszDelimiter,
+                                   int bHonourStrings, int bAllowEmptyTokens );
+
+/* ==================================================================== */
+/*      .csv file related functions (from cpl_csv.c)                    */
+/* ==================================================================== */
+
+typedef enum {
+    CC_ExactString,
+    CC_ApproxString,
+    CC_Integer
+} CSVCompareCriteria;
+
+#define CSVFilename gtCSVFilename
+#define CSVReadParseLine gtCSVReadParseLine
+#define CSVScanLines gtCSVScanLines
+#define CSVScanFile gtCSVScanFile
+#define CSVScanFileByName gtCSVScanFileByName
+#define CSVGetFieldId gtCSVGetFieldId
+#define CSVDeaccess gtCSVDeaccess
+#define CSVGetField gtCSVGetField
+#define SetCSVFilenameHook gtSetCSVFilenameHook
+#define CSVGetFileFieldId gtCSVGetFileFieldId
+
+const char  *CSVFilename( const char * );
+
+char  **CSVReadParseLine( FILE * );
+char  **CSVScanLines( FILE *, int, const char *, CSVCompareCriteria );
+char  **CSVScanFile( const char *, int, const char *,
+                            CSVCompareCriteria );
+char  **CSVScanFileByName( const char *, const char *, const char *,
+                                  CSVCompareCriteria );
+int  CSVGetFieldId( FILE *, const char * );
+int  CSVGetFileFieldId( const char *, const char * );
+
+void  CSVDeaccess( const char * );
+
+const char  *CSVGetField( const char *, const char *, const char *,
+                                 CSVCompareCriteria, const char * );
+
+void CPL_DLL SetCSVFilenameHook( const char *(*)(const char *) );
+
+CPL_C_END
+
+#endif /* ndef CPL_SERV_H_INCLUDED */
diff --git a/src/tiff/csv/README b/src/tiff/csv/README
new file mode 100644
index 0000000..41e83fd
--- /dev/null
+++ b/src/tiff/csv/README
@@ -0,0 +1,38 @@
+	EPSG Tables
+	===========
+
+The .csv files in this directory are an extract of tables from the EPSG
+projection database in CSV (comma separated value) format.  These same
+files come with the source distribution in the libgeotiff/csv directory.
+Information and source to extract these tables from the EPSG database
+can be found in the source distribution libgeotiff/csv/odbc2csv directory.
+
+Detailed information on the EPSG database can be found at:
+
+  http://www.petroconsultants.com/products/geodetic.htm
+
+
+The tables containing the basic data are: 
+
+ compd_cs:	compound coordinate system data. 
+ ellipsoid:	ellipsoid data. 
+ ellips_alias:	ellipsoid alias data. 
+ geod_datum:	geodetic datum data. 
+ gdatum_alias:	geodetic datum alias data. 
+ geod_trf:	geodetic transformation data. 
+ horiz_cs:	geographic and projected coordinate system data (GCS/PCS codes)
+ p_meridian:	prime meridian data. 
+ trf_method:	transformation method and parameter data. 
+ trf_nonpolynomial: projection and 3- or 7-parameter geodetic
+                    transformation parameter values. 
+ trf_path:	geodetic transformation path data. 
+ uom_angle:	angle unit data. 
+ uom_an_alias:	angle unit alias data: currently not populated. 
+ uom_length:	length unit data. 
+ uom_le_alias:	length unit alias data. 
+ uom_scale:	scale unit data. 
+ uom_sc_alias:	scale unit alias data: currently not populated. 
+ vert_datum:	vertical datum data. 
+ vert_cs:	vertical coordinate system data. 
+ vert_offset:	vertical coordinate system transformation data.
+
diff --git a/src/tiff/csv/alias.csv b/src/tiff/csv/alias.csv
new file mode 100644
index 0000000..8f581dd
--- /dev/null
+++ b/src/tiff/csv/alias.csv
@@ -0,0 +1,2001 @@
+"ALIAS CODE","OBJECT_TABLE_NAME","OBJECT_CODE","NAMING_SYSTEM_CODE","ALIAS","REMARKS"
+1,Coordinate_Operation,1274,7300,LKS94(ETRF89) to WGS 84 (1),
+4,Datum,6258,7300,ETRF89,
+5,Ellipsoid,7013,7300,Modified Clarke 1880 (South Africa),The Clarke 1880 (Arc) figure is one of several modifications to the original definition.  The name Clarke Modified is usually taken to be the RGS modification.  But in southern Africa it is usually taken to be the Arc or Cape modification.
+6,Coordinate_Operation,8570,7300,ED50 to EUREF89 (2),
+7,Unit of Measure,9001,7300,meter,
+8,Unit of Measure,9036,7300,kilometer,Spelling used in US
+9,Coordinate Reference System,21100,7300,Genuk / NEIEZ,
+10,Coordinate_Operation,1036,7301,OSTN97,
+11,Coordinate_Operation,1123,7301,Genuk to WGS 84 (1),
+12,Coordinate_Operation,1149,7301,ETRF89 to WGS 84 (1),
+13,Coordinate_Operation,1273,7301,HD72 to ETRF89 (1),
+14,Coordinate_Operation,1309,7301,DHDN to ETRF89 (1),
+15,Coordinate_Operation,1310,7301,Pulkovo 1942 to ETRF89 (1),
+16,Coordinate_Operation,1311,7301,ED50 to WGS 84 (18),
+17,Coordinate_Operation,1331,7301,EST92 to ETRF89 (1),
+19,Coordinate_Operation,1513,7301,Final Datum 1958 to WGS 84 (1),
+20,Coordinate_Operation,1571,7301,Amersfoort to ETRF89 (1),
+21,Coordinate_Operation,1584,7301,Levant to WGS 72BE (1),
+22,Coordinate_Operation,1585,7301,Levant to WGS 84 (2),
+23,Coordinate_Operation,1586,7301,Levant to WGS 84 (3),
+24,Coordinate_Operation,1587,7301,Levant to WGS 84 (4),
+26,Coordinate_Operation,1589,7301,ED50 to ETRF89 (3),
+28,Coordinate_Operation,1611,7301,IRENET95 to ETRF89 (1),
+29,Coordinate Reference System,2140,7301,NAD83(CSRS98) / SCoPQ zone 3,
+30,Coordinate Reference System,2141,7301,NAD83(CSRS98) / SCoPQ zone 4,
+31,Coordinate Reference System,2142,7301,NAD83(CSRS98) / SCoPQ zone 5,
+32,Coordinate Reference System,2143,7301,NAD83(CSRS98) / SCoPQ zone 6,
+33,Coordinate Reference System,2144,7301,NAD83(CSRS98) / SCoPQ zone 7,
+34,Coordinate Reference System,2145,7301,NAD83(CSRS98) / SCoPQ zone 8,
+35,Coordinate Reference System,2146,7301,NAD83(CSRS98) / SCoPQ zone 9,
+36,Coordinate Reference System,2147,7301,NAD83(CSRS98) / SCoPQ zone 10,
+37,Coordinate Reference System,2159,7301,Sierra Leone 1924 / Peninsular Grid,
+38,Coordinate Reference System,2291,7301,NAD83 / PEI Stereo,
+39,Coordinate Reference System,3200,7301,Final Datum 1958 / Iraq zone,
+40,Coordinate Reference System,4132,7301,Final Datum 1958 (Iran),
+41,Coordinate Reference System,4140,7301,NAD83(CSRS),
+42,Coordinate Reference System,4172,7301,National Geodetic System [Argentina],see http://www.igm.gov.ar/posgar.html
+43,Coordinate Reference System,4211,7301,Genuk,
+44,Datum,4218,7301,Bogota,
+45,Coordinate Reference System,4227,7301,Levant,
+46,Coordinate Reference System,4258,7301,ETRF89,
+47,Coordinate Reference System,4272,7301,GD49,
+48,Coordinate Reference System,4813,7301,Genuk (Jakarta),
+49,Datum,5104,7301,Huang Hai 1956,
+50,Datum,6120,7301,Old Greek,"Adjective ""Old"" applied since introduction of GGRS87 (code 6121)"
+51,Datum,6125,7301,Samboja P2 exc T9,
+52,Datum,6160,7301,Quini-Huao,
+53,Datum,6174,7301,Sierra Leone Peninsular 1924,
+54,Datum,6211,7301,Genuk,
+55,Datum,6218,7301,Bogota,
+56,Datum,6222,7301,South Africa,
+57,Datum,6227,7301,Levant,
+58,Datum,6258,7301,European Terrestrial Reference Frame 1989,
+59,Datum,6269,7301,NAD83 (1986),
+60,Datum,6272,7301,GD49,
+61,Datum,6308,7301,Rikets koordinatsystem 1938,
+62,Ellipsoid,7012,7301,Clarke Modified 1880,The Clarke 1880 (RGS) figure is one of several modifications to the original definition.  The name Clarke Modified is usually taken to be the RGS modification.
+63,Ellipsoid,7013,7301,Clarke 1880 (Cape),
+64,Ellipsoid,7019,7301,International 1979,Adopted by IUGG 1979 Canberra as the Geodetic Reference Spheroid of 1980 (GRS 1980).
+65,Ellipsoid,7022,7301,Hayford 1909,Described as a=6378388 m. and b=6356909 m. from which 1/f derived to be 296.95926...   The figure was adopted as the International ellipsoid in 1924 but with 1/f taken as 297 exactly from which b is derved as 6356911.946 m.
+66,Ellipsoid,7029,7301,McCaw 1924,
+67,Ellipsoid,7030,7301,WGS84,
+68,Ellipsoid,7036,7301,International 1967,More usually known as GRS 1967 to avoid confusion with the International 1924 figure.
+69,Ellipsoid,7043,7301,NWL 10D,Used by Transit Broadcast Ephemeris before 1989. Also referred to as WGS72 spheroid.
+70,Coordinate_Operation,8568,7301,Levant to WGS 84 (1),
+71,Coordinate_Operation,8570,7301,ED50 to ETRF89 (2),
+72,Coordinate_Operation Parameter,8602,7301,Longitude rotation,
+73,Prime Meridian,8913,7301,Kristiania,
+74,Unit of Measure,9001,7301,International metre,
+75,Unit of Measure,9002,7301,international foot,
+76,Unit of Measure,9003,7301,American foot,
+77,Unit of Measure,9005,7301,South African geodetic foot,Not to be confused with the Cape foot.
+78,Unit of Measure,9030,7301,International nautical mile,
+79,Unit of Measure,9039,7301,link (Clarke's ratio),
+80,Unit of Measure,9040,7301,yard,
+81,Unit of Measure,9041,7301,foot,
+82,Unit of Measure,9042,7301,chain,
+83,Unit of Measure,9043,7301,link,
+84,Unit of Measure,9050,7301,yard,
+85,Unit of Measure,9051,7301,foot,
+86,Unit of Measure,9052,7301,chain,
+87,Unit of Measure,9053,7301,link,
+88,Unit of Measure,9060,7301,yard,
+89,Unit of Measure,9061,7301,foot,
+90,Unit of Measure,9062,7301,chain,
+91,Unit of Measure,9063,7301,link,
+92,Unit of Measure,9070,7301,foot,
+93,Unit of Measure,9080,7301,Indian geodetic foot,
+94,Unit of Measure,9081,7301,Indian geodetic foot,
+95,Unit of Measure,9084,7301,yard,= 3 Indian feet.
+96,Unit of Measure,9085,7301,yard,= 3 Indian feet.
+97,Unit of Measure,9094,7301,foot,
+98,Unit of Measure,9114,7301,mil,"Alias also applies to other variations of a mil, especially mil_6300 and mil_6000."
+100,Coordinate_Operation,17001,7301,Ghana TM,
+101,Coordinate_Operation,17901,7301,Mount Eden Circuit 1949,
+102,Coordinate_Operation,17902,7301,Bay of Plenty Circuit 1949,
+103,Coordinate_Operation,17903,7301,Poverty Bay Circuit 1949,
+104,Coordinate_Operation,17904,7301,Hawkes Bay Circuit 1949,
+105,Coordinate_Operation,17905,7301,Taranaki Circuit 1949,
+106,Coordinate_Operation,17906,7301,Tuhirangi Circuit 1949,
+107,Coordinate_Operation,17907,7301,Wanganui Circuit 1949,
+108,Coordinate_Operation,17908,7301,Wairarapa Circuit 1949,
+109,Coordinate_Operation,17909,7301,Wellington Circuit 1949,
+110,Coordinate_Operation,17910,7301,Collingwood Circuit 1949,
+111,Coordinate_Operation,17911,7301,Nelson Circuit 1949,
+112,Coordinate_Operation,17912,7301,Karamea Circuit 1949,
+113,Coordinate_Operation,17913,7301,Buller Circuit 1949,
+114,Coordinate_Operation,17914,7301,Grey Circuit 1949,
+115,Coordinate_Operation,17915,7301,Amuri Circuit 1949,
+116,Coordinate_Operation,17916,7301,Marlborough Circuit 1949,
+117,Coordinate_Operation,17917,7301,Hokitika Circuit 1949,
+118,Coordinate_Operation,17918,7301,Okarito Circuit 1949,
+119,Coordinate_Operation,17919,7301,Jacksons Bay Circuit 1949,
+120,Coordinate_Operation,17920,7301,Mount Pleasant Circuit 1949,
+121,Coordinate_Operation,17921,7301,Gawler Circuit 1949,
+122,Coordinate_Operation,17922,7301,Timaru Circuit 1949,
+123,Coordinate_Operation,17923,7301,Lindis Peak Circuit 1949,
+124,Coordinate_Operation,17924,7301,Mount Nicholas Circuit 1949,
+125,Coordinate_Operation,17925,7301,Mount York Circuit 1949,
+126,Coordinate_Operation,17926,7301,Observation Point Circuit 1949,
+127,Coordinate_Operation,17927,7301,North Taieri Circuit 1949,
+128,Coordinate_Operation,17928,7301,Bluff Circuit 1949,
+129,Coordinate_Operation,19906,7301,IOEPC Lambert,Sometimes seen defined with 2 standard parallels.
+130,Coordinate_Operation,19959,7301,Gold Coast Grid,
+131,Coordinate_Operation,19963,7301,Sierra Leone Peninsula Grid,
+132,Coordinate Reference System,21100,7301,Genuk (Jakarta) / NEIEZ,
+133,Coordinate Reference System,21148,7301,Genuk / UTM zone 48S,
+134,Coordinate Reference System,21150,7301,Genuk / UTM zone 50S,
+135,Coordinate Reference System,22700,7301,Levant / Levant Zone,
+136,Coordinate Reference System,22770,7301,Levant / Syria Lambert,
+137,Coordinate Reference System,22780,7301,Levant / Levant Stereographic,
+138,Coordinate Reference System,25828,7301,ETRF89 / UTM zone 28N,
+139,Coordinate Reference System,25829,7301,ETRF89 / UTM zone 29N,
+140,Coordinate Reference System,25830,7301,ETRF89 / UTM zone 30N,
+141,Coordinate Reference System,25831,7301,ETRF89 / UTM zone 31N,
+142,Coordinate Reference System,25832,7301,ETRF89 / UTM zone 32N,
+143,Coordinate Reference System,25833,7301,ETRF89 / UTM zone 33N,
+144,Coordinate Reference System,25834,7301,ETRF89 / UTM zone 34N,
+145,Coordinate Reference System,25835,7301,ETRF89 / UTM zone 35N,
+146,Coordinate Reference System,25836,7301,ETRF89 / UTM zone 36N,
+147,Coordinate Reference System,25837,7301,ETRF89 / UTM zone 37N,
+148,Coordinate Reference System,25838,7301,ETRF89 / UTM zone 38N,
+149,Coordinate Reference System,25884,7301,ETRF89 / TM Baltic93,
+150,Coordinate Reference System,27258,7301,GD49 / UTM zone 58,
+151,Coordinate Reference System,27259,7301,GD49 / UTM zone 59,
+152,Coordinate Reference System,27260,7301,GD49 / UTM zone 60,
+153,Coordinate Reference System,27291,7301,GD49 / North Island Grid,
+154,Coordinate Reference System,27292,7301,GD49 / South Island Grid,
+155,Coordinate Reference System,30592,7301,Nord Sahara 1959/Voirol Unifie S Algerie,
+156,Coordinate Reference System,30791,7301,Nord Sahara 1959 / Lambert Nord Voirol Unifie 1960,Voirol Unifie 1960 is NOT a geodetic datum nor GeogCRS.  It is two Lambert projected coordinate reference systems based on Nord Sahara 1959 Datum. See also code 30792.
+157,Coordinate Reference System,30792,7301,Nord Sahara 1959 / Lambert Sud Voirol Unifie 1960,Voirol Unifie 1960 is NOT a geodetic datum nor GeogCRS.  It is two Lambert projected coordinate reference systems based on Nord Sahara 1959 Datum. See also code 30791.
+158,Coordinate Reference System,31170,7301,Zanderij / Surinam Old TM,Old country name spelling.
+159,Coordinate Reference System,31171,7301,Zanderij / Surinam TM,Old spelling for country name.
+160,Coordinate Reference System,31300,7301,Belge Lambert 72,
+161,Coordinate_Operation,1026,7302,Madrid to ED50 (1),
+162,Coordinate_Operation,1027,7302,Madrid to ED50 (2),
+163,Coordinate_Operation,1028,7302,Madrid to ED50 (3),
+164,Coordinate_Operation,1029,7302,RD New to ED50/UTM31 (1),
+165,Coordinate_Operation,1030,7302,ED50/UTM31 to RD New (1),
+166,Coordinate_Operation,1031,7302,RD New to ED50/UTM31 (2),
+167,Coordinate_Operation,1032,7302,ED50/UTM31 to RD New (2),
+168,Coordinate_Operation,1274,7302,CS42 to LKS94 (1),
+169,Coordinate_Operation,1283,7302,LKS94 to WGS 84 (1),
+170,Coordinate Reference System,2000,7302,Anguilla 1957 / BWI Grid,
+171,Coordinate Reference System,2001,7302,Antigua 1943 / BWI Grid,
+172,Coordinate Reference System,2002,7302,Dominica 1945 / BWI Grid,
+173,Coordinate Reference System,2003,7302,Grenada 1953 / BWI Grid,
+174,Coordinate Reference System,2004,7302,Montserrat 58 / BWI Grid,
+175,Coordinate Reference System,2005,7302,St Kitts 1955 / BWI Grid,
+176,Coordinate Reference System,2006,7302,St Lucia 1955 / BWI Grid,
+177,Coordinate Reference System,2007,7302,St Vincent 45 / BWI Grid,
+178,Coordinate Reference System,2008,7302,CGQ77 / SCoPQ zone 2,
+179,Coordinate Reference System,2009,7302,CGQ77 / SCoPQ zone 3,
+180,Coordinate Reference System,2010,7302,CGQ77 / SCoPQ zone 4,
+181,Coordinate Reference System,2011,7302,CGQ77 / SCoPQ zone 5,
+182,Coordinate Reference System,2012,7302,CGQ77 / SCoPQ zone 6,
+183,Coordinate Reference System,2013,7302,CGQ77 / SCoPQ zone 7,
+184,Coordinate Reference System,2014,7302,CGQ77 / SCoPQ zone 8,
+185,Coordinate Reference System,2015,7302,CGQ77 / SCoPQ zone 9,
+186,Coordinate Reference System,2016,7302,CGQ77 / SCoPQ zone 10,
+187,Coordinate Reference System,2036,7302,NAD83(CSRS) / NB Stereo,
+188,Coordinate Reference System,2037,7302,NAD83(CSRS) / UTM 19N,
+189,Coordinate Reference System,2038,7302,NAD83(CSRS) / UTM 20N,
+190,Coordinate Reference System,2039,7302,Israeli TM Grid,
+191,Coordinate Reference System,2040,7302,Locodjo 65 / UTM 30N,
+192,Coordinate Reference System,2041,7302,Abidjan 87 / UTM 30N,
+193,Coordinate Reference System,2042,7302,Locodjo 65 / UTM 29N,
+194,Coordinate Reference System,2043,7302,Abidjan 87 / UTM 29N,
+195,Coordinate Reference System,2044,7302,Hanoi 72 / Gauss zone 18,
+196,Coordinate Reference System,2045,7302,Hanoi 72 / Gauss zone 19,
+197,Coordinate Reference System,2046,7302,New S African CS zone 15,
+198,Coordinate Reference System,2047,7302,New S African CS zone 17,
+199,Coordinate Reference System,2048,7302,New S African CS zone 19,
+200,Coordinate Reference System,2049,7302,New S African CS zone 21,
+201,Coordinate Reference System,2050,7302,New S African CS zone 23,
+202,Coordinate Reference System,2051,7302,New S African CS zone 25,
+203,Coordinate Reference System,2052,7302,New S African CS zone 27,
+204,Coordinate Reference System,2053,7302,New S African CS zone 29,
+205,Coordinate Reference System,2054,7302,New S African CS zone 31,
+206,Coordinate Reference System,2055,7302,New S African CS zone 33,
+207,Coordinate Reference System,2056,7302,LV95,
+208,Coordinate Reference System,2066,7302,Mount Dillon / Tobago,
+209,Coordinate Reference System,2067,7302,Naparima 1955 / UTM 20N,
+210,Coordinate Reference System,2081,7302,Chos Malal / Argentina 2,
+211,Coordinate Reference System,2082,7302,Pampa d Castillo / Arg 2,
+212,Coordinate Reference System,2083,7302,Hito XVIII / Argentina 2,
+213,Coordinate Reference System,2084,7302,Hito XVIII / UTM 19S,
+214,Coordinate Reference System,2089,7302,Yemen NGN96 / UTM 38N,
+215,Coordinate Reference System,2090,7302,Yemen NGN96 / UTM 39N,
+216,Coordinate Reference System,2091,7302,S Yemen / Gauss zone 8,
+217,Coordinate Reference System,2092,7302,S Yemen / Gauss zone 9,
+218,Coordinate Reference System,2096,7302,Korean 1985 / East Belt,
+219,Coordinate Reference System,2097,7302,Korean 1985 / Cen. Belt,
+220,Coordinate Reference System,2098,7302,Korean 1985 / West Belt,
+221,Coordinate Reference System,2099,7302,Qatar Plane CS,
+222,Coordinate Reference System,2136,7301,Accra / Gold Coast Grid,
+223,Coordinate Reference System,2137,7301,Accra / Ghana TM,
+224,Coordinate Reference System,2157,7302,IRENET95 / ITM,
+225,Coordinate Reference System,2200,7302,ATS77 / NB Stereographic,
+226,Coordinate Reference System,2290,7302,ATS77 / PEI Stereo,
+227,Coordinate Reference System,2291,7302,NAD83(CSRS) / PEI Stereo,
+228,Coordinate Reference System,2294,7302,ATS77 / MTM NS zone 4,
+229,Coordinate Reference System,2295,7302,ATS77 / MTM NS zone 5,
+230,Coordinate Reference System,2393,7302,KKJ / Finland zone 3,
+231,Coordinate Reference System,2600,7302,LKS94,
+232,Coordinate Reference System,3561,7302,Old Hawaiian / SP zone 1,
+233,Coordinate Reference System,3562,7302,Old Hawaiian / SP zone 2,
+234,Coordinate Reference System,3563,7302,Old Hawaiian / SP zone 3,
+235,Coordinate Reference System,3564,7302,Old Hawaiian / SP zone 4,
+236,Coordinate Reference System,3565,7302,Old Hawaiian / SP zone 5,
+237,Coordinate Reference System,3991,7302,Puerto Rico SPCS 27,
+238,Coordinate Reference System,4134,7302,PSD93,
+239,Coordinate Reference System,4215,7302,BD 50,
+240,Coordinate Reference System,4268,7302,NAD Michigan,
+241,Coordinate Reference System,4313,7302,BD 72,
+242,Coordinate Reference System,4609,7302,CGQ77,
+243,Coordinate Reference System,4809,7302,BD 50 (Brussels),
+244,Datum,5100,7302,msl,
+245,Datum,5101,7302,ODN,
+246,Datum,5102,7302,NGVD29,
+247,Datum,5103,7302,NAVD88,
+248,Datum,5104,7302,Yellow Sea,
+249,Datum,5105,7302,Baltic,
+250,Datum,5106,7302,Caspian,
+251,Datum,5107,7302,NGF,
+252,Datum,5109,7302,NAP,
+253,Datum,5111,7302,AHD,
+254,Datum,5112,7302,AHD (Tasmania),
+255,Datum,5114,7302,CVD28,
+256,Datum,5115,7302,Piraeus86,
+257,Datum,5116,7302,N60,
+258,Datum,5117,7302,RH70,
+259,Datum,5118,7302,NGF - Lallemand,
+260,Datum,5119,7302,NGF - IGN69,
+261,Datum,5120,7302,NGF - IGN78,
+262,Datum,5122,7302,JapanVD,
+263,Datum,5123,7302,PHD93,
+264,Datum,5127,7302,LN02,
+265,Datum,5128,7302,LHN95,
+266,Datum,5129,7302,EVRF2000,
+267,Coordinate Reference System,5701,7302,ODN,
+268,Coordinate Reference System,5702,7302,NGVD29,
+269,Coordinate Reference System,5703,7302,NAVD88,
+270,Coordinate Reference System,5709,7302,NAP,
+271,Coordinate Reference System,5711,7302,AHD,
+272,Coordinate Reference System,5712,7302,AHD (Tasmania),
+273,Coordinate Reference System,5713,7302,CVD28,
+274,Coordinate Reference System,5714,7302,msl height,
+275,Coordinate Reference System,5715,7302,msl depth,
+276,Coordinate Reference System,5723,7302,Japan Levelling Datum,
+277,Coordinate Reference System,5724,7302,PHD93,
+278,Coordinate Reference System,5728,7302,LN02,
+279,Coordinate Reference System,5729,7302,LHN95,
+280,Coordinate Reference System,5730,7302,EVRS2000,
+281,Datum,6121,7302,GGRS87,
+282,Datum,6122,7302,ATS77,
+283,Datum,6123,7302,KKJ,
+284,Datum,6124,7302,RT90,
+285,Datum,6126,7302,LKS94 (ETRS89),
+286,Datum,6130,7302,Moznet,
+287,Datum,6132,7302,FD58,
+288,Datum,6133,7302,EST92,
+289,Datum,6134,7302,PSD93,
+290,Datum,6140,7302,NAD83(CSRS98),
+291,Datum,6151,7302,CHTRF95,
+292,Datum,6152,7302,NAD83(HARN),
+293,Datum,6154,7302,ED50(ED77),
+294,Datum,6156,7302,S-JTSK,
+295,Datum,6159,7302,ELD79,
+296,Datum,6163,7302,YNGN96,
+297,Datum,6170,7302,SIRGAS,
+298,Datum,6171,7302,RGF93,
+299,Datum,6172,7302,POSGAR,
+300,Datum,6202,7302,AGD66,
+301,Datum,6203,7302,AGD84,
+302,Datum,6204,7302,Ain el Abd,
+303,Datum,6215,7302,Belge 1950,
+304,Datum,6230,7302,ED50,
+305,Datum,6231,7302,ED87,
+306,Datum,6237,7302,HD72,
+307,Datum,6238,7302,ID74,
+308,Datum,6242,7302,JAD69,
+309,Datum,6246,7302,KOC,
+310,Datum,6248,7302,PSAD56,
+311,Datum,6258,7302,ETRS89,
+312,Datum,6267,7302,NAD27,
+313,Datum,6269,7302,NAD83,
+314,Datum,6272,7302,NZGD49,
+315,Datum,6275,7302,NTF,
+316,Datum,6278,7302,OSGB70,
+317,Datum,6279,7302,OS(SN)80,
+318,Datum,6280,7302,Padang,
+319,Datum,6283,7302,GDA94,
+320,Datum,6291,7302,SAD69,
+321,Datum,6297,7302,Tananarive,
+322,Datum,6303,7302,TC(1948),
+323,Datum,6305,7302,Voirol Unifie,
+324,Datum,6308,7302,RT38,
+325,Datum,6312,7302,MGI,
+326,Datum,6313,7302,Belge 1972,
+327,Datum,6314,7302,DHDN,
+328,Datum,6318,7302,NGN,
+329,Datum,6319,7302,KUDAMS,
+330,Datum,6322,7302,WGS 72,
+331,Datum,6324,7302,WGS 72BE,
+332,Datum,6326,7302,WGS 84,
+333,Datum,6608,7302,NAD27(76),
+334,Datum,6609,7302,CGQ77,
+335,Datum,6901,7302,ATF (Paris),
+336,Datum,6902,7302,NDG (Paris),
+337,Ellipsoid,7003,7302,ANS,
+338,Coordinate Reference System,7401,7302,NTF / France II + Lalle,
+339,Coordinate Reference System,7402,7302,NTF / France II + IGN69,
+340,Coordinate Reference System,7403,7302,NTF / France III + IGN69,
+341,Coordinate Reference System,7405,7302,GB National Grid + ODN,
+342,Coordinate Reference System,7407,7302,NAD27 / TX_N + NGVD29,
+343,Coordinate_Operation Parameter,8663,7302,k,
+344,Unit of Measure,9001,7302,m,
+345,Unit of Measure,9002,7302,ft,
+346,Unit of Measure,9003,7302,ftUS,
+347,Unit of Measure,9005,7302,ftCla,
+348,Unit of Measure,9014,7302,f,
+349,Unit of Measure,9030,7302,NM,
+350,Unit of Measure,9031,7302,GLM,
+351,Unit of Measure,9033,7302,chUS,
+352,Unit of Measure,9034,7302,lkUS,
+353,Unit of Measure,9035,7302,miUS,
+354,Unit of Measure,9036,7302,km,
+355,Unit of Measure,9037,7302,ydCla,
+356,Unit of Measure,9038,7302,chCla,
+357,Unit of Measure,9039,7302,lkCla,
+358,Unit of Measure,9040,7302,ydSe,
+359,Unit of Measure,9041,7302,ftSe,
+360,Unit of Measure,9042,7302,chSe,
+361,Unit of Measure,9043,7302,lkSe,
+362,Unit of Measure,9050,7302,ydBnA,
+363,Unit of Measure,9051,7302,ftBnA,
+364,Unit of Measure,9052,7302,chBnA,
+365,Unit of Measure,9053,7302,lkBnA,
+366,Unit of Measure,9060,7302,ydBnB,
+367,Unit of Measure,9061,7302,ftBnB,
+368,Unit of Measure,9062,7302,chBnB,
+369,Unit of Measure,9063,7302,lkBnB,
+370,Unit of Measure,9070,7302,ftBr(65),
+371,Unit of Measure,9080,7302,ftInd,
+372,Unit of Measure,9081,7302,ftInd(37),
+373,Unit of Measure,9082,7302,ftInd(62),
+374,Unit of Measure,9083,7302,ftInd(75),
+375,Unit of Measure,9084,7302,ydInd,
+376,Unit of Measure,9085,7302,ydInd(37),
+377,Unit of Measure,9086,7302,ydInd(62),
+378,Unit of Measure,9087,7302,ydInd(75),
+379,Unit of Measure,9093,7302,mi,
+380,Unit of Measure,9094,7302,ftGC,
+381,Unit of Measure,9101,7302,rad,
+382,Unit of Measure,9102,7302,deg,
+383,Unit of Measure,9103,7302,min,
+384,Unit of Measure,9104,7302,sec,
+385,Unit of Measure,9105,7302,gr,
+386,Unit of Measure,9106,7302,g,
+387,Unit of Measure,9107,7302,DMS,
+388,Unit of Measure,9108,7302,DMSH,
+389,Unit of Measure,9109,7302,�rad,
+390,Unit of Measure,9110,7302,DDD.MMSSsss,
+391,Unit of Measure,9111,7302,DDD.MMm,
+392,Unit of Measure,9112,7302,c,
+393,Unit of Measure,9113,7302,cc,
+394,Unit of Measure,9114,7302,mil,
+395,Unit of Measure,9202,7302,ppm,
+396,Unit of Measure,9204,7302,Bin330ftUS,
+397,Unit of Measure,9205,7302,Bin165ftUS,
+398,Unit of Measure,9206,7302,Bin82.5ftUS,
+399,Unit of Measure,9207,7302,Bin37.5m,
+400,Unit of Measure,9208,7302,Bin25m,
+401,Unit of Measure,9209,7302,Bin12.5m,
+402,Unit of Measure,9210,7302,Bin6.25m,
+403,Unit of Measure,9211,7302,Bin3.125m,
+404,Coordinate_Operation Method,9633,7302,OSTN,
+405,Coordinate_Operation Method,9824,7302,UTM,
+406,Coordinate_Operation,10101,7302,Alabama East,
+407,Coordinate_Operation,10102,7302,Alabama West,
+408,Coordinate_Operation,10131,7302,Alabama East,
+409,Coordinate_Operation,10132,7302,Alabama West,
+410,Coordinate_Operation,10201,7302,Arizona East,
+411,Coordinate_Operation,10202,7302,Arizona Central,
+412,Coordinate_Operation,10203,7302,Arizona West,
+413,Coordinate_Operation,10231,7302,Arizona East,
+414,Coordinate_Operation,10232,7302,Arizona Central,
+415,Coordinate_Operation,10233,7302,Arizona West,
+416,Coordinate_Operation,10301,7302,Arkansas North,
+417,Coordinate_Operation,10302,7302,Arkansas South,
+418,Coordinate_Operation Method,9809,7301,Roussilhe,
+419,Coordinate_Operation,10331,7302,Arkansas North,
+420,Coordinate_Operation,10332,7302,Arkansas South,
+421,Coordinate_Operation,10401,7302,California zone I,
+422,Coordinate_Operation,10402,7302,California zone II,
+423,Coordinate_Operation,10403,7302,California zone III,
+424,Coordinate_Operation,10404,7302,California zone IV,
+425,Coordinate_Operation,10405,7302,California zone V,
+426,Coordinate_Operation,10406,7302,California zone VI,
+427,Coordinate_Operation,10407,7302,California zone VII,
+428,Coordinate_Operation,10431,7302,California zone 1,
+429,Coordinate_Operation,10432,7302,California zone 2,
+430,Coordinate_Operation,10433,7302,California zone 3,
+431,Coordinate_Operation,10434,7302,California zone 4,
+432,Coordinate_Operation,10435,7302,California zone 5,
+433,Coordinate_Operation,10436,7302,California zone 6,
+434,Coordinate_Operation,10501,7302,Colorado North,
+435,Coordinate_Operation,10503,7302,Colorado South,
+436,Coordinate_Operation,10531,7302,Colorado North,
+437,Coordinate_Operation,10533,7302,Colorado South,
+438,Coordinate_Operation,10600,7302,Connecticut,
+439,Coordinate_Operation,10630,7302,Connecticut,
+440,Coordinate_Operation,10700,7302,Delaware,
+441,Coordinate_Operation,10730,7302,Delaware,
+442,Coordinate_Operation,10901,7302,Florida East,
+443,Coordinate_Operation,10902,7302,Florida West,
+444,Coordinate_Operation,10903,7302,Florida North,
+445,Coordinate_Operation,10931,7302,Florida East,
+446,Coordinate_Operation,10932,7302,Florida West,
+447,Coordinate_Operation,10933,7302,Florida North,
+448,Coordinate_Operation,11001,7302,Georgia East,
+449,Coordinate_Operation,11002,7302,Georgia West,
+450,Coordinate_Operation,11031,7302,Georgia East,
+451,Coordinate_Operation,11032,7302,Georgia West,
+452,Coordinate_Operation,11101,7302,Idaho East,
+453,Coordinate_Operation,11102,7302,Idaho Central,
+454,Coordinate_Operation,11103,7302,Idaho West,
+455,Coordinate_Operation,11131,7302,Idaho East,
+456,Coordinate_Operation,11132,7302,Idaho Central,
+457,Coordinate_Operation,11133,7302,Idaho West,
+458,Coordinate_Operation,11201,7302,Illinois East,
+459,Coordinate_Operation,11202,7302,Illinois West,
+460,Coordinate_Operation,11231,7302,Illinois East,
+461,Coordinate_Operation,11232,7302,Illinois West,
+462,Coordinate_Operation,11301,7302,Indiana East,
+463,Coordinate_Operation,11302,7302,Indiana West,
+464,Coordinate_Operation,11331,7302,Indiana East,
+465,Coordinate_Operation,11332,7302,Indiana West,
+466,Coordinate_Operation,11401,7302,Iowa North,
+467,Coordinate_Operation,11402,7302,Iowa South,
+468,Coordinate_Operation,11431,7302,Iowa North,
+469,Coordinate_Operation,11432,7302,Iowa South,
+470,Coordinate_Operation,11501,7302,Kansas North,
+471,Coordinate_Operation,11502,7302,Kansas South,
+472,Coordinate_Operation,11531,7302,Kansas North,
+473,Coordinate_Operation,11532,7302,Kansas South,
+474,Coordinate_Operation,11601,7302,Kentucky North,
+475,Coordinate_Operation,11602,7302,Kentucky South,
+476,Coordinate_Operation,11631,7302,Kentucky North,
+477,Coordinate_Operation,11632,7302,Kentucky South,
+478,Coordinate_Operation,11701,7302,Louisiana North,
+479,Coordinate_Operation,11702,7302,Louisiana South,
+480,Coordinate_Operation,11731,7302,Louisiana North,
+481,Coordinate_Operation,11732,7302,Louisiana South,
+482,Coordinate_Operation,11801,7302,Maine East,
+483,Coordinate_Operation,11802,7302,Maine West,
+484,Coordinate_Operation,11831,7302,Maine East,
+485,Coordinate_Operation,11832,7302,Maine West,
+486,Coordinate_Operation,11900,7302,Maryland,
+487,Coordinate_Operation,11930,7302,Maryland,
+488,Coordinate_Operation,12001,7302,Massachusetts Mainland,
+489,Coordinate_Operation,12002,7302,Massachusetts Island,
+490,Coordinate_Operation,12031,7302,Massachusetts Mainland,
+491,Coordinate_Operation,12032,7302,Massachusetts Island,
+492,Coordinate_Operation,12101,7302,Michigan East,
+493,Coordinate_Operation,12102,7302,Michigan Old Central,
+494,Coordinate_Operation,12111,7302,Michigan North,
+495,Coordinate_Operation,12112,7302,Michigan Central,
+496,Coordinate_Operation,12113,7302,Michigan South,
+497,Coordinate_Operation,12141,7302,Michigan North,
+498,Coordinate_Operation,12142,7302,Michigan Central,
+499,Coordinate_Operation,12143,7302,Michigan South,
+500,Coordinate_Operation,12201,7302,Minnesota North,
+501,Coordinate_Operation,12202,7302,Minnesota Central,
+502,Coordinate_Operation,12203,7302,Minnesota South,
+503,Coordinate_Operation,12231,7302,Minnesota North,
+504,Coordinate_Operation,12232,7302,Minnesota Central,
+505,Coordinate_Operation,12233,7302,Minnesota South,
+506,Coordinate_Operation,12301,7302,Mississippi East,
+507,Coordinate_Operation,12302,7302,Mississippi West,
+508,Coordinate_Operation,12331,7302,Mississippi East,
+509,Coordinate_Operation,12332,7302,Mississippi West,
+510,Coordinate_Operation,12401,7302,Missouri  East,
+511,Coordinate_Operation,12402,7302,Missouri Central,
+512,Coordinate_Operation,12403,7302,Missouri West,
+513,Coordinate_Operation,12431,7302,Missouri East,
+514,Coordinate_Operation,12432,7302,Missouri Central,
+515,Coordinate_Operation,12433,7302,Missouri West,
+516,Coordinate_Operation,12501,7302,Montana North,
+517,Coordinate_Operation,12502,7302,Montana Central,
+518,Coordinate_Operation,12503,7302,Montana South,
+519,Coordinate_Operation,12530,7302,Montana,
+520,Coordinate_Operation,12601,7302,Nebraska North,
+521,Coordinate_Operation,12602,7302,Nebraska South,
+522,Coordinate_Operation,12630,7302,Nebraska,
+523,Coordinate_Operation,12701,7302,Nevada  East,
+524,Coordinate_Operation,12702,7302,Nevada Central,
+525,Coordinate_Operation,12703,7302,Nevada West,
+526,Coordinate_Operation,12731,7302,Nevada East,
+527,Coordinate_Operation,12732,7302,Nevada Central,
+528,Coordinate_Operation,12733,7302,Nevada West,
+529,Coordinate_Operation,12800,7302,New Hampshire,
+530,Coordinate_Operation,12830,7302,New Hampshire,
+531,Coordinate_Operation,12900,7302,New Jersey,
+532,Coordinate_Operation,12930,7302,New Jersey,
+533,Coordinate_Operation,13001,7302,New Mexico East,
+534,Coordinate_Operation,13002,7302,New Mexico Central,
+535,Coordinate_Operation,13003,7302,New Mexico West,
+536,Coordinate_Operation,13031,7302,New Mexico East,
+537,Coordinate_Operation,13032,7302,New Mexico Central,
+538,Coordinate_Operation,13033,7302,New Mexico West,
+539,Coordinate_Operation,13101,7302,New York East,
+540,Coordinate_Operation,13102,7302,New York Central,
+541,Coordinate_Operation,13103,7302,New York  West,
+542,Coordinate_Operation,13104,7302,New York Long Island,
+543,Coordinate_Operation,13131,7302,New York East,
+544,Coordinate_Operation,13132,7302,New York Central,
+545,Coordinate_Operation,13133,7302,New York  West,
+546,Coordinate_Operation,13134,7302,New York Long Island,
+547,Coordinate_Operation,13200,7302,North Carolina,
+548,Coordinate_Operation,13230,7302,North Carolina,
+549,Coordinate_Operation,13301,7302,North Dakota North,
+550,Coordinate_Operation,13302,7302,North Dakota South,
+551,Coordinate_Operation,13331,7302,North Dakota North,
+552,Coordinate_Operation,13332,7302,North Dakota South,
+553,Coordinate_Operation,13401,7302,Ohio North,
+554,Coordinate_Operation,13402,7302,Ohio South,
+555,Coordinate_Operation,13431,7302,Ohio North,
+556,Coordinate_Operation,13432,7302,Ohio South,
+557,Coordinate_Operation,13501,7302,Oklahoma North,
+558,Coordinate_Operation,13502,7302,Oklahoma South,
+559,Coordinate_Operation,13531,7302,Oklahoma North,
+560,Coordinate_Operation,13532,7302,Oklahoma South,
+561,Coordinate_Operation,13601,7302,Oregon North,
+562,Coordinate_Operation,13602,7302,Oregon South,
+563,Coordinate_Operation,13631,7302,Oregon North,
+564,Coordinate_Operation,13632,7302,Oregon South,
+565,Coordinate_Operation,13701,7302,Pennsylvania North,
+566,Coordinate_Operation,13702,7302,Pennsylvania South,
+567,Coordinate_Operation,13731,7302,Pennsylvania North,
+568,Coordinate_Operation,13732,7302,Pennsylvania South,
+569,Coordinate_Operation,13800,7302,Rhode Island,
+570,Coordinate_Operation,13830,7302,Rhode Island,
+571,Coordinate_Operation,13901,7302,South Carolina North,
+572,Coordinate_Operation,13902,7302,South Carolina South,
+573,Coordinate_Operation,13930,7302,South Carolina,
+574,Coordinate_Operation,14001,7302,South Dakota North,
+575,Coordinate_Operation,14002,7302,South Dakota South,
+576,Coordinate_Operation,14031,7302,South Dakota North,
+577,Coordinate_Operation,14032,7302,South Dakota South,
+578,Coordinate_Operation,14100,7302,Tennessee,
+579,Coordinate_Operation,14130,7302,Tennessee,
+580,Coordinate_Operation,14201,7302,Texas North,
+581,Coordinate_Operation,14202,7302,Texas North Central,
+582,Coordinate_Operation,14203,7302,Texas Central,
+583,Coordinate_Operation,14204,7302,Texas South Central,
+584,Coordinate_Operation,14205,7302,Texas South,
+585,Coordinate_Operation,14231,7302,Texas North,
+586,Coordinate_Operation,14232,7302,Texas North Central,
+587,Coordinate_Operation,14233,7302,Texas Central,
+588,Coordinate_Operation,14234,7302,Texas South Central,
+589,Coordinate_Operation,14235,7302,Texas South,
+590,Coordinate_Operation,14301,7302,Utah North,
+591,Coordinate_Operation,14302,7302,Utah Central,
+592,Coordinate_Operation,14303,7302,Utah South,
+593,Coordinate_Operation,14331,7302,Utah North,
+594,Coordinate_Operation,14332,7302,Utah Central,
+595,Coordinate_Operation,14333,7302,Utah South,
+596,Coordinate_Operation,14400,7302,Vermont,
+597,Coordinate_Operation,14430,7302,Vermont,
+598,Coordinate_Operation,14501,7302,Virginia North,
+599,Coordinate_Operation,14502,7302,Virginia South,
+600,Coordinate_Operation,14531,7302,Virginia North,
+601,Coordinate_Operation,14532,7302,Virginia South,
+602,Coordinate_Operation,14601,7302,Washington North,
+603,Coordinate_Operation,14602,7302,Washington South,
+604,Coordinate_Operation,14631,7302,Washington North,
+605,Coordinate_Operation,14632,7302,Washington South,
+606,Coordinate_Operation,14701,7302,West Virginia North,
+607,Coordinate_Operation,14702,7302,West Virginia South,
+608,Coordinate_Operation,14731,7302,West Virginia North,
+609,Coordinate_Operation,14732,7302,West Virginia South,
+610,Coordinate_Operation,14801,7302,Wisconsin North,
+611,Coordinate_Operation,14802,7302,Wisconsin Central,
+612,Coordinate_Operation,14803,7302,Wisconsin South,
+613,Coordinate_Operation,14831,7302,Wisconsin North,
+614,Coordinate_Operation,14832,7302,Wisconsin Central,
+615,Coordinate_Operation,14833,7302,Wisconsin South,
+616,Coordinate_Operation,14901,7302,Wyoming East,
+617,Coordinate_Operation,14902,7302,Wyoming East Central,
+618,Coordinate_Operation,14903,7302,Wyoming West Central,
+619,Coordinate_Operation,14904,7302,Wyoming West,
+620,Coordinate_Operation,14931,7302,Wyoming East,
+621,Coordinate_Operation,14932,7302,Wyoming East Central,
+622,Coordinate_Operation,14933,7302,Wyoming West Central,
+623,Coordinate_Operation,14934,7302,Wyoming West,
+624,Coordinate_Operation,15001,7302,Alaska zone 1,
+625,Coordinate_Operation,15002,7302,Alaska zone 2,
+626,Coordinate_Operation,15003,7302,Alaska zone 3,
+627,Coordinate_Operation,15004,7302,Alaska zone 4,
+628,Coordinate_Operation,15005,7302,Alaska zone 5,
+629,Coordinate_Operation,15006,7302,Alaska zone 6,
+630,Coordinate_Operation,15007,7302,Alaska zone 7,
+631,Coordinate_Operation,15008,7302,Alaska zone 8,
+632,Coordinate_Operation,15009,7302,Alaska zone 9,
+633,Coordinate_Operation,15010,7302,Alaska zone 10,
+634,Coordinate_Operation,15031,7302,Alaska zone 1,
+635,Coordinate_Operation,15032,7302,Alaska zone 2,
+636,Coordinate_Operation,15033,7302,Alaska zone 3,
+637,Coordinate_Operation,15034,7302,Alaska zone 4,
+638,Coordinate_Operation,15035,7302,Alaska zone 5,
+639,Coordinate_Operation,15036,7302,Alaska zone 6,
+640,Coordinate_Operation,15037,7302,Alaska zone 7,
+641,Coordinate_Operation,15038,7302,Alaska zone 8,
+642,Coordinate_Operation,15039,7302,Alaska zone 9,
+643,Coordinate_Operation,15040,7302,Alaska zone 10,
+644,Coordinate_Operation,15101,7302,Hawaii  zone 1,
+645,Coordinate_Operation,15102,7302,Hawaii  zone 2,
+646,Coordinate_Operation,15103,7302,Hawaii  zone 3,
+647,Coordinate_Operation,15104,7302,Hawaii  zone 4,
+648,Coordinate_Operation,15105,7302,Hawaii  zone 5,
+649,Coordinate_Operation,15131,7302,Hawaii zone 1,
+650,Coordinate_Operation,15132,7302,Hawaii zone 2,
+651,Coordinate_Operation,15133,7302,Hawaii zone 3,
+652,Coordinate_Operation,15134,7302,Hawaii zone 4,
+653,Coordinate_Operation,15135,7302,Hawaii zone 5,
+654,Coordinate_Operation,15201,7302,Puerto Rico,
+655,Coordinate_Operation,15202,7302,St. Croix,
+656,Coordinate_Operation,15230,7302,Puerto Rico & Virgin Is.,
+657,Coordinate_Operation,15914,7302,BLM 14N (ftUS),
+658,Coordinate_Operation,15915,7302,BLM 15N (ftUS),
+659,Coordinate_Operation,15916,7302,BLM 16N (ftUS),
+660,Coordinate_Operation,15917,7302,BLM 17N (ftUS),
+661,Coordinate_Operation,16061,7302,UPS North,
+662,Coordinate_Operation,16062,7302,UPS South,
+663,Coordinate_Operation,16261,7302,3-degree Gauss zone 1,
+664,Coordinate_Operation,16262,7302,3-degree Gauss zone 2,
+665,Coordinate_Operation,16263,7302,3-degree Gauss zone 3,
+666,Coordinate_Operation,16264,7302,3-degree Gauss zone 4,
+667,Coordinate_Operation,16265,7302,3-degree Gauss zone 5,
+668,Coordinate_Operation,16266,7302,3-degree Gauss zone 6,
+669,Coordinate_Operation,16267,7302,3-degree Gauss zone 7,
+670,Coordinate_Operation,16268,7302,3-degree Gauss zone 8,
+671,Coordinate_Operation,16361,7302,3-deg Gauss-Kruger 3E,
+672,Coordinate_Operation,16362,7302,3-deg Gauss-Kruger 6E,
+673,Coordinate_Operation,16363,7302,3-deg Gauss-Kruger 9E,
+674,Coordinate_Operation,16364,7302,3-deg Gauss-Kruger 12E,
+675,Coordinate_Operation,16365,7302,3-deg Gauss-Kruger 15E,
+676,Coordinate_Operation,16366,7302,3-deg Gauss-Kruger 18E,
+677,Coordinate_Operation,16367,7302,3-deg Gauss-Kruger 21E,
+678,Coordinate_Operation,16368,7302,3-deg Gauss-Kruger 24E,
+679,Coordinate_Operation,17348,7302,MGA zone 48,
+680,Coordinate_Operation,17349,7302,MGA zone 49,
+681,Coordinate_Operation,17350,7302,MGA zone 50,
+682,Coordinate_Operation,17351,7302,MGA zone 51,
+683,Coordinate_Operation,17352,7302,MGA zone 52,
+684,Coordinate_Operation,17353,7302,MGA zone 53,
+685,Coordinate_Operation,17354,7302,MGA zone 54,
+686,Coordinate_Operation,17355,7302,MGA zone 55,
+687,Coordinate_Operation,17356,7302,MGA zone 56,
+688,Coordinate_Operation,17357,7302,MGA zone 57,
+689,Coordinate_Operation,17358,7302,MGA zone 58,
+690,Coordinate_Operation,17448,7302,AMG zone 48,
+691,Coordinate_Operation,17449,7302,AMG zone 49,
+692,Coordinate_Operation,17450,7302,AMG zone 50,
+693,Coordinate_Operation,17451,7302,AMG zone 51,
+694,Coordinate_Operation,17452,7302,AMG zone 52,
+695,Coordinate_Operation,17453,7302,AMG zone 53,
+696,Coordinate_Operation,17454,7302,AMG zone 54,
+697,Coordinate_Operation,17455,7302,AMG zone 55,
+698,Coordinate_Operation,17456,7302,AMG zone 56,
+699,Coordinate_Operation,17457,7302,AMG zone 57,
+700,Coordinate_Operation,17458,7302,AMG zone 58,
+701,Coordinate_Operation,17515,7302,S. African Grid zone 15,
+702,Coordinate_Operation,17517,7302,S. African Grid zone 17,
+703,Coordinate_Operation,17519,7302,S. African Grid zone 19,
+704,Coordinate_Operation,17521,7302,S. African Grid zone 21,
+705,Coordinate_Operation,17523,7302,S. African Grid zone 23,
+706,Coordinate_Operation,17525,7302,S. African Grid zone 25,
+707,Coordinate_Operation,17527,7302,S. African Grid zone 27,
+708,Coordinate_Operation,17529,7302,S. African Grid zone 29,
+709,Coordinate_Operation,17531,7302,S. African Grid zone 31,
+710,Coordinate_Operation,17533,7302,S. African Grid zone 33,
+711,Coordinate_Operation,17611,7302,SW African Grid zone 11,
+712,Coordinate_Operation,17613,7302,SW African Grid zone 13,
+713,Coordinate_Operation,17615,7302,SW African Grid zone 15,
+714,Coordinate_Operation,17617,7302,SW African Grid zone 17,
+715,Coordinate_Operation,17619,7302,SW African Grid zone 19,
+716,Coordinate_Operation,17621,7302,SW African Grid zone 21,
+717,Coordinate_Operation,17623,7302,SW African Grid zone 23,
+718,Coordinate_Operation,17625,7302,SW African Grid zone 25,
+719,Coordinate_Operation,17702,7302,MTM zone 2,
+720,Coordinate_Operation,17801,7302,Japan zone I,
+721,Coordinate_Operation,17802,7302,Japan zone II,
+722,Coordinate_Operation,17803,7302,Japan zone III,
+723,Coordinate_Operation,17804,7302,Japan zone IV,
+724,Coordinate_Operation,17805,7302,Japan zone V,
+725,Coordinate_Operation,17806,7302,Japan zone VI,
+726,Coordinate_Operation,17807,7302,Japan zone VII,
+727,Coordinate_Operation,17808,7302,Japan zone VIII,
+728,Coordinate_Operation,17809,7302,Japan zone IX,
+729,Coordinate_Operation,17810,7302,Japan zone X,
+730,Coordinate_Operation,17811,7302,Japan zone XI,
+731,Coordinate_Operation,17812,7302,Japan zone XII,
+732,Coordinate_Operation,17813,7302,Japan zone XIII,
+733,Coordinate_Operation,17814,7302,Japan zone XIV,
+734,Coordinate_Operation,17815,7302,Japan zone XV,
+735,Coordinate_Operation,17816,7302,Japan zone XVI,
+736,Coordinate_Operation,17817,7302,Japan zone XVII,
+737,Coordinate_Operation,17818,7302,Japan zone XVIII,
+738,Coordinate_Operation,17901,7302,Mt Eden Circuit,
+739,Coordinate_Operation,17920,7302,Mt Pleasant Circuit,
+740,Coordinate_Operation,17924,7302,Mt Nicholas Circuit,
+741,Coordinate_Operation,17925,7302,Mt York Circuit,
+742,Coordinate_Operation,17926,7302,Observation Pt Circuit,
+743,Coordinate_Operation,18031,7302,Argentina 1,
+744,Coordinate_Operation,18032,7302,Argentina 2,
+745,Coordinate_Operation,18033,7302,Argentina 3,
+746,Coordinate_Operation,18034,7302,Argentina 4,
+747,Coordinate_Operation,18035,7302,Argentina 5,
+748,Coordinate_Operation,18036,7302,Argentina 6,
+749,Coordinate_Operation,18037,7302,Argentina 7,
+750,Coordinate_Operation,18044,7302,M28,
+751,Coordinate_Operation,18045,7302,M31,
+752,Coordinate_Operation,18046,7302,M34,
+753,Coordinate_Operation,18051,7302,Colombia 3W,
+754,Coordinate_Operation,18052,7302,Colombia Bogota,
+755,Coordinate_Operation,18053,7302,Colombia 3E,
+756,Coordinate_Operation,18054,7302,Colombia 6E,
+757,Coordinate_Operation,18071,7302,Blue Belt,
+758,Coordinate_Operation,18072,7302,Red Belt,
+759,Coordinate_Operation,18073,7302,Purple Belt,
+760,Coordinate_Operation,18074,7302,Extended Purple Belt,
+761,Coordinate_Operation,18141,7302,North Island Grid,
+762,Coordinate_Operation,18142,7302,South Island Grid,
+763,Coordinate_Operation,18193,7302,Finland zone 3,
+764,Coordinate_Operation,18203,7302,ICS,
+765,Coordinate_Operation,18204,7302,ITM,
+766,Coordinate_Operation,18231,7302,India zone I,
+767,Coordinate_Operation,18232,7302,India zone IIa,
+768,Coordinate_Operation,18233,7302,India zone IIIa,
+769,Coordinate_Operation,18234,7302,India zone IVa,
+770,Coordinate_Operation,18235,7302,India zone IIb,
+771,Coordinate_Operation,18236,7302,India zone I,
+772,Coordinate_Operation,18237,7302,India zone IIa,
+773,Coordinate_Operation,18238,7302,India zone IIb,
+774,Coordinate_Operation,19900,7302,Bahrain Grid,
+775,Coordinate_Operation,19905,7302,NEIEZ,
+776,Coordinate_Operation,19917,7302,NZMG,
+777,Coordinate_Operation,19922,7302,LV03,
+778,Coordinate_Operation,19923,7302,LV03C,
+779,Coordinate_Operation,19928,7302,KTM,
+780,Coordinate_Operation,19929,7302,2.5 gon West,
+781,Coordinate_Operation,19931,7302,EOV,
+782,Coordinate_Operation,19933,7302,PEI Stereographic ATS77,
+783,Coordinate_Operation,19935,7302,R.S.O. Malaya,
+784,Coordinate_Operation,19945,7302,NB Stereographic ATS77,
+785,Coordinate_Operation,19946,7302,NB Stereographic NAD83,
+786,Coordinate_Operation,19950,7302,LV95,
+787,Coordinate_Operation,19951,7302,Nakhl e Taqi,
+788,Coordinate_Operation,19956,7302,R.S.O. Borneo (chSe),
+789,Coordinate_Operation,19957,7302,R.S.O. Borneo (ftSe),
+790,Coordinate_Operation,19958,7302,R.S.O. Borneo (m),
+791,Coordinate_Operation,19960,7302,PEI Stereographic NAD83,
+792,Coordinate_Operation,19962,7302,ITM,
+793,Coordinate Reference System,20004,7302,1995 Coord. Sys. zone 4,
+794,Coordinate Reference System,20005,7302,1995 Coord. Sys. zone 5,
+795,Coordinate Reference System,20006,7302,1995 Coord. Sys. zone 6,
+796,Coordinate Reference System,20007,7302,1995 Coord. Sys. zone 7,
+797,Coordinate Reference System,20008,7302,1995 Coord. Sys. zone 8,
+798,Coordinate Reference System,20009,7302,1995 Coord. Sys. zone 9,
+799,Coordinate Reference System,20010,7302,1995 Coord. Sys. zone 10,
+800,Coordinate Reference System,20011,7302,1995 Coord. Sys. zone 11,
+801,Coordinate Reference System,20012,7302,1995 Coord. Sys. zone 12,
+802,Coordinate Reference System,20013,7302,1995 Coord. Sys. zone 13,
+803,Coordinate Reference System,20014,7302,1995 Coord. Sys. zone 14,
+804,Coordinate Reference System,20015,7302,1995 Coord. Sys. zone 15,
+805,Coordinate Reference System,20016,7302,1995 Coord. Sys. zone 16,
+806,Coordinate Reference System,20017,7302,1995 Coord. Sys. zone 17,
+807,Coordinate Reference System,20018,7302,1995 Coord. Sys. zone 18,
+808,Coordinate Reference System,20019,7302,1995 Coord. Sys. zone 19,
+809,Coordinate Reference System,20020,7302,1995 Coord. Sys. zone 20,
+810,Coordinate Reference System,20021,7302,1995 Coord. Sys. zone 21,
+811,Coordinate Reference System,20022,7302,1995 Coord. Sys. zone 22,
+812,Coordinate Reference System,20023,7302,1995 Coord. Sys. zone 23,
+813,Coordinate Reference System,20024,7302,1995 Coord. Sys. zone 24,
+814,Coordinate Reference System,20025,7302,1995 Coord. Sys. zone 25,
+815,Coordinate Reference System,20026,7302,1995 Coord. Sys. zone 26,
+816,Coordinate Reference System,20027,7302,1995 Coord. Sys. zone 27,
+817,Coordinate Reference System,20028,7302,1995 Coord. Sys. zone 28,
+818,Coordinate Reference System,20029,7302,1995 Coord. Sys. zone 29,
+819,Coordinate Reference System,20030,7302,1995 Coord. Sys. zone 30,
+820,Coordinate Reference System,20031,7302,1995 Coord. Sys. zone 31,
+821,Coordinate Reference System,20032,7302,1995 Coord. Sys. zone 32,
+822,Coordinate Reference System,20064,7302,Pulkovo 1995 / Gauss 4N,
+823,Coordinate Reference System,20065,7302,Pulkovo 1995 / Gauss 5N,
+824,Coordinate Reference System,20066,7302,Pulkovo 1995 / Gauss 6N,
+825,Coordinate Reference System,20067,7302,Pulkovo 1995 / Gauss 7N,
+826,Coordinate Reference System,20068,7302,Pulkovo 1995 / Gauss 8N,
+827,Coordinate Reference System,20069,7302,Pulkovo 1995 / Gauss 9N,
+828,Coordinate Reference System,20070,7302,Pulkovo 1995 / Gauss 10N,
+829,Coordinate Reference System,20071,7302,Pulkovo 1995 / Gauss 11N,
+830,Coordinate Reference System,20072,7302,Pulkovo 1995 / Gauss 12N,
+831,Coordinate Reference System,20073,7302,Pulkovo 1995 / Gauss 13N,
+832,Coordinate Reference System,20074,7302,Pulkovo 1995 / Gauss 14N,
+833,Coordinate Reference System,20075,7302,Pulkovo 1995 / Gauss 15N,
+834,Coordinate Reference System,20076,7302,Pulkovo 1995 / Gauss 16N,
+835,Coordinate Reference System,20077,7302,Pulkovo 1995 / Gauss 17N,
+836,Coordinate Reference System,20078,7302,Pulkovo 1995 / Gauss 18N,
+837,Coordinate Reference System,20079,7302,Pulkovo 1995 / Gauss 19N,
+838,Coordinate Reference System,20080,7302,Pulkovo 1995 / Gauss 20N,
+839,Coordinate Reference System,20081,7302,Pulkovo 1995 / Gauss 21N,
+840,Coordinate Reference System,20082,7302,Pulkovo 1995 / Gauss 22N,
+841,Coordinate Reference System,20083,7302,Pulkovo 1995 / Gauss 23N,
+842,Coordinate Reference System,20084,7302,Pulkovo 1995 / Gauss 24N,
+843,Coordinate Reference System,20085,7302,Pulkovo 1995 / Gauss 25N,
+844,Coordinate Reference System,20086,7302,Pulkovo 1995 / Gauss 26N,
+845,Coordinate Reference System,20087,7302,Pulkovo 1995 / Gauss 27N,
+846,Coordinate Reference System,20088,7302,Pulkovo 1995 / Gauss 28N,
+847,Coordinate Reference System,20089,7302,Pulkovo 1995 / Gauss 29N,
+848,Coordinate Reference System,20090,7302,Pulkovo 1995 / Gauss 30N,
+849,Coordinate Reference System,20091,7302,Pulkovo 1995 / Gauss 31N,
+850,Coordinate Reference System,20092,7302,Pulkovo 1995 / Gauss 32N,
+851,Coordinate Reference System,20437,7302,Ain el Abd / UTM 37N,
+852,Coordinate Reference System,20438,7302,Ain el Abd / UTM 38N,
+853,Coordinate Reference System,20439,7302,Ain el Abd / UTM 39N,
+854,Coordinate Reference System,20790,7302,Lisbon / Portuguese National Grid,
+855,Coordinate Reference System,21100,7302,Batavia / NEIEZ,
+856,Coordinate Reference System,21291,7302,Barbados 1938 / BWI Grid,
+857,Coordinate Reference System,21292,7302,Barbados NationaI Grid,
+858,Coordinate Reference System,21413,7302,Beijing / Gauss zone 13,
+859,Coordinate Reference System,21414,7302,Beijing / Gauss zone 14,
+860,Coordinate Reference System,21415,7302,Beijing / Gauss zone 15,
+861,Coordinate Reference System,21416,7302,Beijing / Gauss zone 16,
+862,Coordinate Reference System,21417,7302,Beijing / Gauss zone 17,
+863,Coordinate Reference System,21418,7302,Beijing / Gauss zone 18,
+864,Coordinate Reference System,21419,7302,Beijing / Gauss zone 19,
+865,Coordinate Reference System,21420,7302,Beijing / Gauss zone 20,
+866,Coordinate Reference System,21421,7302,Beijing / Gauss zone 21,
+867,Coordinate Reference System,21422,7302,Beijing / Gauss zone 22,
+868,Coordinate Reference System,21423,7302,Beijing / Gauss zone 23,
+869,Coordinate Reference System,21473,7302,Beijing / Gauss 13N,
+870,Coordinate Reference System,21474,7302,Beijing / Gauss 14N,
+871,Coordinate Reference System,21475,7302,Beijing / Gauss 15N,
+872,Coordinate Reference System,21476,7302,Beijing / Gauss 16N,
+873,Coordinate Reference System,21477,7302,Beijing / Gauss 17N,
+874,Coordinate Reference System,21478,7302,Beijing / Gauss 18N,
+875,Coordinate Reference System,21479,7302,Beijing / Gauss 19N,
+876,Coordinate Reference System,21480,7302,Beijing / Gauss 20N,
+877,Coordinate Reference System,21481,7302,Beijing / Gauss 21N,
+878,Coordinate Reference System,21482,7302,Beijing / Gauss 22N,
+879,Coordinate Reference System,21483,7302,Beijing / Gauss 23N,
+880,Coordinate Reference System,21500,7302,Belge Lambert 50,
+881,Coordinate Reference System,21780,7302,LV03C,
+882,Coordinate Reference System,21781,7302,LV03,
+883,Coordinate Reference System,21891,7302,Bogota / Colombia 3W,
+884,Coordinate Reference System,21892,7302,Bogota / Colombia Bogota,
+885,Coordinate Reference System,21893,7302,Bogota / Colombia 3E,
+886,Coordinate Reference System,21894,7302,Bogota / Colombia 6E,
+887,Coordinate Reference System,22191,7302,C Inchauspe /Argentina 1,
+888,Coordinate Reference System,22192,7302,C Inchauspe /Argentina 2,
+889,Coordinate Reference System,22193,7302,C Inchauspe /Argentina 3,
+890,Coordinate Reference System,22194,7302,C Inchauspe /Argentina 4,
+891,Coordinate Reference System,22195,7302,C Inchauspe /Argentina 5,
+892,Coordinate Reference System,22196,7302,C Inchauspe /Argentina 6,
+893,Coordinate Reference System,22197,7302,C Inchauspe /Argentina 7,
+894,Coordinate Reference System,22275,7302,South African CS zone 15,
+895,Coordinate Reference System,22277,7302,South African CS zone 17,
+896,Coordinate Reference System,22279,7302,South African CS zone 19,
+897,Coordinate Reference System,22281,7302,South African CS zone 21,
+898,Coordinate Reference System,22283,7302,South African CS zone 23,
+899,Coordinate Reference System,22285,7302,South African CS zone 25,
+900,Coordinate Reference System,22287,7302,South African CS zone 27,
+901,Coordinate Reference System,22289,7302,South African CS zone 29,
+902,Coordinate Reference System,22291,7302,South African CS zone 31,
+903,Coordinate Reference System,22293,7302,South African CS zone 33,
+904,Coordinate Reference System,22300,7302,Tunisia Mining Grid,
+905,Coordinate Reference System,22523,7302,Corrego Alegre / UTM 23S,
+906,Coordinate Reference System,22524,7302,Corrego Alegre / UTM 24S,
+907,Coordinate Reference System,22994,7302,Egypt 1907 / Ext. Purple,
+908,Coordinate Reference System,23946,7302,Indian 1954 / UTM 46N,
+909,Coordinate Reference System,23947,7302,Indian 1954 / UTM 47N,
+910,Coordinate Reference System,23948,7302,Indian 1954 / UTM 48N,
+911,Coordinate Reference System,24047,7302,Indian 1975 / UTM 47N,
+912,Coordinate Reference System,24048,7302,Indian 1975 / UTM 48N,
+913,Coordinate Reference System,24100,7302,Jamaica 1875 / Old Grid,
+914,Coordinate Reference System,24200,7302,JAD69 / Jamaica Grid,
+915,Coordinate Reference System,24305,7302,Kalianpur 37 / UTM 45N,
+916,Coordinate Reference System,24306,7302,Kalianpur 37 / UTM 46N,
+917,Coordinate Reference System,24311,7302,Kalianpur 62 / UTM 41N,
+918,Coordinate Reference System,24312,7302,Kalianpur 62 / UTM 42N,
+919,Coordinate Reference System,24313,7302,Kalianpur 62 / UTM 43N,
+920,Coordinate Reference System,24342,7302,Kalianpur 75 / UTM 42N,
+921,Coordinate Reference System,24343,7302,Kalianpur 75 / UTM 43N,
+922,Coordinate Reference System,24344,7302,Kalianpur 75 / UTM 44N,
+923,Coordinate Reference System,24345,7302,Kalianpur 75 / UTM 45N,
+924,Coordinate Reference System,24346,7302,Kalianpur 75 / UTM 46N,
+925,Coordinate Reference System,24347,7302,Kalianpur 75 / UTM 47N,
+926,Coordinate Reference System,24370,7302,Kalianpur / India 0,
+927,Coordinate Reference System,24371,7302,Kalianpur / India I,
+928,Coordinate Reference System,24372,7302,Kalianpur / India IIa,
+929,Coordinate Reference System,24373,7302,Kalianpur / India III,
+930,Coordinate Reference System,24374,7302,Kalianpur / India IV,
+931,Coordinate Reference System,24375,7302,Kalianpur 37 / India IIb,
+932,Coordinate Reference System,24376,7302,Kalianpur 62 / India I,
+933,Coordinate Reference System,24377,7302,Kalianpur 62 / India IIa,
+934,Coordinate Reference System,24378,7302,Kalianpur 75 / India I,
+935,Coordinate Reference System,24379,7302,Kalianpur 75 / India IIa,
+936,Coordinate Reference System,24380,7302,Kalianpur 75 / India IIb,
+937,Coordinate Reference System,24381,7302,Kalianpur 75 / India III,
+938,Coordinate Reference System,24382,7302,Kalianpur / India IIb,
+939,Coordinate Reference System,24383,7302,Kalianpur 75 / India IV,
+940,Coordinate Reference System,24892,7302,PSAD56 / Peru central,
+941,Coordinate Reference System,25000,7302,Leigon / Ghana Grid,
+942,Coordinate Reference System,25391,7302,Luzon / Philippines I,
+943,Coordinate Reference System,25392,7302,Luzon / Philippines II,
+944,Coordinate Reference System,25393,7302,Luzon / Philippines III,
+945,Coordinate Reference System,25394,7302,Luzon / Philippines IV,
+946,Coordinate Reference System,25395,7302,Luzon / Philippines V,
+947,Coordinate Reference System,25700,7302,Makassar / NEIEZ,
+948,Coordinate Reference System,25932,7302,Malongo 1987 / UTM 32S,
+949,Coordinate Reference System,26391,7302,Minna / Nigeria West,
+950,Coordinate Reference System,26393,7302,Minna / Nigeria East,
+951,Coordinate Reference System,26591,7302,Monte Mario / Italy 1,
+952,Coordinate Reference System,26592,7302,Monte Mario / Italy 2,
+953,Coordinate Reference System,26632,7302,M'poraloko / UTM 32N,
+954,Coordinate Reference System,26692,7302,M'poraloko / UTM 32S,
+955,Coordinate Reference System,26741,7302,NAD27 / California I,
+956,Coordinate Reference System,26742,7302,NAD27 / California II,
+957,Coordinate Reference System,26743,7302,NAD27 / California III,
+958,Coordinate Reference System,26744,7302,NAD27 / California IV,
+959,Coordinate Reference System,26745,7302,NAD27 / California V,
+960,Coordinate Reference System,26746,7302,NAD27 / California VI,
+961,Coordinate Reference System,26747,7302,NAD27 / California VII,
+962,Coordinate Reference System,26786,7302,NAD27 / Massachusetts,
+963,Coordinate Reference System,26787,7302,NAD27 / Massachusetts Is,
+964,Coordinate Reference System,26792,7302,NAD27 / Minnesota Cent.,
+965,Coordinate Reference System,26801,7302,NAD27 / Michigan East,
+966,Coordinate Reference System,26802,7302,NAD27 / Michigan Old Cen,
+967,Coordinate Reference System,26803,7302,NAD27 / Michigan West,
+968,Coordinate Reference System,26811,7302,NAD27 / Michigan North,
+969,Coordinate Reference System,26812,7302,NAD27 / Michigan Central,
+970,Coordinate Reference System,26813,7302,NAD27 / Michigan South,
+971,Coordinate Reference System,26941,7302,NAD83 / California 1,
+972,Coordinate Reference System,26942,7302,NAD83 / California 2,
+973,Coordinate Reference System,26943,7302,NAD83 / California 3,
+974,Coordinate Reference System,26944,7302,NAD83 / California 4,
+975,Coordinate Reference System,26945,7302,NAD83 / California 5,
+976,Coordinate Reference System,26946,7302,NAD83 / California 6,
+977,Coordinate Reference System,26986,7302,NAD83 / Massachusetts,
+978,Coordinate Reference System,26987,7302,NAD83 / Massachusetts Is,
+979,Coordinate Reference System,26992,7302,NAD83 / Minnesota Cent.,
+980,Coordinate Reference System,27038,7302,Nahrwan 1967 / UTM 38N,
+981,Coordinate Reference System,27039,7302,Nahrwan 1967 / UTM 39N,
+982,Coordinate Reference System,27040,7302,Nahrwan 1967 / UTM 40N,
+983,Coordinate Reference System,27120,7302,Naparima 1972 / UTM 20N,
+984,Coordinate Reference System,27200,7302,GD49 / NZ Map Grid,
+985,Coordinate Reference System,27391,7302,NGO 1948 / I,
+986,Coordinate Reference System,27392,7302,NGO 1948 / II,
+987,Coordinate Reference System,27393,7302,NGO 1948 / III,
+988,Coordinate Reference System,27394,7302,NGO 1948 / IV,
+989,Coordinate Reference System,27395,7302,NGO 1948 / V,
+990,Coordinate Reference System,27396,7302,NGO 1948 / VI,
+991,Coordinate Reference System,27397,7302,NGO 1948 / VII,
+992,Coordinate Reference System,27398,7302,NGO 1948 / VIII,
+993,Coordinate Reference System,27500,7302,ATF / Nord de Guerre,
+994,Coordinate Reference System,27581,7302,NTF / France I,
+995,Coordinate Reference System,27582,7302,NTF / France II,
+996,Coordinate Reference System,27583,7302,NTF / France III,
+997,Coordinate Reference System,27584,7302,NTF / France IV,
+998,Coordinate Reference System,27591,7302,NTF / Nord France,
+999,Coordinate Reference System,27592,7302,NTF / Centre France,
+1000,Coordinate Reference System,27593,7302,NTF / Sud France,
+1001,Coordinate Reference System,27594,7302,NTF / Corse,
+1002,Coordinate Reference System,27700,7302,British National Grid,
+1003,Coordinate Reference System,28191,7302,Palestine Grid,
+1004,Coordinate Reference System,28192,7302,Palestine Belt,
+1005,Coordinate Reference System,28193,7302,Israeli CS Grid,
+1006,Coordinate Reference System,28232,7302,Point Noire / UTM 32S,
+1007,Coordinate Reference System,28402,7302,1942 Coord. Sys. zone 2,
+1008,Coordinate Reference System,28403,7302,1942 Coord. Sys. zone 3,
+1009,Coordinate Reference System,28404,7302,1942 Coord. Sys. zone 4,
+1010,Coordinate Reference System,28405,7302,1942 Coord. Sys. zone 5,
+1011,Coordinate Reference System,28406,7302,1942 Coord. Sys. zone 6,
+1012,Coordinate Reference System,28407,7302,1942 Coord. Sys. zone 7,
+1013,Coordinate Reference System,28408,7302,1942 Coord. Sys. zone 8,
+1014,Coordinate Reference System,28409,7302,1942 Coord. Sys. zone 9,
+1015,Coordinate Reference System,28410,7302,1942 Coord. Sys. zone 10,
+1016,Coordinate Reference System,28411,7302,1942 Coord. Sys. zone 11,
+1017,Coordinate Reference System,28412,7302,1942 Coord. Sys. zone 12,
+1018,Coordinate Reference System,28413,7302,1942 Coord. Sys. zone 13,
+1019,Coordinate Reference System,28414,7302,1942 Coord. Sys. zone 14,
+1020,Coordinate Reference System,28415,7302,1942 Coord. Sys. zone 15,
+1021,Coordinate Reference System,28416,7302,1942 Coord. Sys. zone 16,
+1022,Coordinate Reference System,28417,7302,1942 Coord. Sys. zone 17,
+1023,Coordinate Reference System,28418,7302,1942 Coord. Sys. zone 18,
+1024,Coordinate Reference System,28419,7302,1942 Coord. Sys. zone 19,
+1025,Coordinate Reference System,28420,7302,1942 Coord. Sys. zone 20,
+1026,Coordinate Reference System,28421,7302,1942 Coord. Sys. zone 21,
+1027,Coordinate Reference System,28422,7302,1942 Coord. Sys. zone 22,
+1028,Coordinate Reference System,28423,7302,1942 Coord. Sys. zone 23,
+1029,Coordinate Reference System,28424,7302,1942 Coord. Sys. zone 24,
+1030,Coordinate Reference System,28425,7302,1942 Coord. Sys. zone 25,
+1031,Coordinate Reference System,28426,7302,1942 Coord. Sys. zone 26,
+1032,Coordinate Reference System,28427,7302,1942 Coord. Sys. zone 27,
+1033,Coordinate Reference System,28428,7302,1942 Coord. Sys. zone 28,
+1034,Coordinate Reference System,28429,7302,1942 Coord. Sys. zone 29,
+1035,Coordinate Reference System,28430,7302,1942 Coord. Sys. zone 30,
+1036,Coordinate Reference System,28431,7302,1942 Coord. Sys. zone 31,
+1037,Coordinate Reference System,28432,7302,1942 Coord. Sys. zone 32,
+1038,Coordinate Reference System,28462,7302,Pulkovo / Gauss 2N,
+1039,Coordinate Reference System,28463,7302,Pulkovo / Gauss 3N,
+1040,Coordinate Reference System,28464,7302,Pulkovo / Gauss 4N,
+1041,Coordinate Reference System,28465,7302,Pulkovo / Gauss 5N,
+1042,Coordinate Reference System,28466,7302,Pulkovo / Gauss 6N,
+1043,Coordinate Reference System,28467,7302,Pulkovo / Gauss 7N,
+1044,Coordinate Reference System,28468,7302,Pulkovo / Gauss 8N,
+1045,Coordinate Reference System,28469,7302,Pulkovo / Gauss 9N,
+1046,Coordinate Reference System,28470,7302,Pulkovo / Gauss 10N,
+1047,Coordinate Reference System,28471,7302,Pulkovo / Gauss 11N,
+1048,Coordinate Reference System,28472,7302,Pulkovo / Gauss 12N,
+1049,Coordinate Reference System,28473,7302,Pulkovo / Gauss 13N,
+1050,Coordinate Reference System,28474,7302,Pulkovo / Gauss 14N,
+1051,Coordinate Reference System,28475,7302,Pulkovo / Gauss 15N,
+1052,Coordinate Reference System,28476,7302,Pulkovo / Gauss 16N,
+1053,Coordinate Reference System,28477,7302,Pulkovo / Gauss 17N,
+1054,Coordinate Reference System,28478,7302,Pulkovo / Gauss 18N,
+1055,Coordinate Reference System,28479,7302,Pulkovo / Gauss 19N,
+1056,Coordinate Reference System,28480,7302,Pulkovo / Gauss 20N,
+1057,Coordinate Reference System,28481,7302,Pulkovo / Gauss 21N,
+1058,Coordinate Reference System,28482,7302,Pulkovo / Gauss 22N,
+1059,Coordinate Reference System,28483,7302,Pulkovo / Gauss 23N,
+1060,Coordinate Reference System,28484,7302,Pulkovo / Gauss 24N,
+1061,Coordinate Reference System,28485,7302,Pulkovo / Gauss 25N,
+1062,Coordinate Reference System,28486,7302,Pulkovo / Gauss 26N,
+1063,Coordinate Reference System,28487,7302,Pulkovo / Gauss 27N,
+1064,Coordinate Reference System,28488,7302,Pulkovo / Gauss 28N,
+1065,Coordinate Reference System,28489,7302,Pulkovo / Gauss 29N,
+1066,Coordinate Reference System,28490,7302,Pulkovo / Gauss 30N,
+1067,Coordinate Reference System,28491,7302,Pulkovo / Gauss 31N,
+1068,Coordinate Reference System,28492,7302,Pulkovo / Gauss 32N,
+1069,Coordinate Reference System,28600,7302,Qatar National Grid,
+1070,Coordinate Reference System,29220,7302,Sapper Hill / UTM 20S,
+1071,Coordinate Reference System,29221,7302,Sapper Hill / UTM 21S,
+1072,Coordinate Reference System,29333,7302,Schwarzeck / UTM 33S,
+1073,Coordinate Reference System,29371,7302,SW African CS zone 11,
+1074,Coordinate Reference System,29373,7302,SW African CS zone 13,
+1075,Coordinate Reference System,29375,7302,SW African CS zone 15,
+1076,Coordinate Reference System,29377,7302,SW African CS zone 17,
+1077,Coordinate Reference System,29379,7302,SW African CS zone 19,
+1078,Coordinate Reference System,29381,7302,SW African CS zone 21,
+1079,Coordinate Reference System,29383,7302,SW African CS zone 23,
+1080,Coordinate Reference System,29385,7302,SW African CS zone 25,
+1081,Coordinate Reference System,29700,7302,Tananarive  / Laborde,
+1082,Coordinate Reference System,29738,7302,Tananarive / UTM 38S,
+1083,Coordinate Reference System,29739,7302,Tananarive / UTM 39S,
+1084,Coordinate Reference System,29849,7302,Timbalai 1948 / UTM 49N,
+1085,Coordinate Reference System,29850,7302,Timbalai 1948 / UTM 50N,
+1086,Coordinate Reference System,29871,7302,Timbalai  / Borneo (ch),
+1087,Coordinate Reference System,29872,7302,Timbalai  / Borneo (ft),
+1088,Coordinate Reference System,29873,7302,Timbalai  / Borneo (m),
+1089,Coordinate Reference System,29900,7302,TM65 / Irish Nat Grid,
+1090,Coordinate Reference System,30161,7302,Tokyo / Japan zone I,
+1091,Coordinate Reference System,30162,7302,Tokyo / Japan zone II,
+1092,Coordinate Reference System,30163,7302,Tokyo / Japan zone III,
+1093,Coordinate Reference System,30164,7302,Tokyo / Japan zone IV,
+1094,Coordinate Reference System,30165,7302,Tokyo / Japan zone V,
+1095,Coordinate Reference System,30166,7302,Tokyo / Japan zone VI,
+1096,Coordinate Reference System,30167,7302,Tokyo / Japan zone VII,
+1097,Coordinate Reference System,30168,7302,Tokyo / Japan zone VIII,
+1098,Coordinate Reference System,30169,7302,Tokyo / Japan zone IX,
+1099,Coordinate Reference System,30170,7302,Tokyo / Japan zone X,
+1100,Coordinate Reference System,30171,7302,Tokyo / Japan zone XI,
+1101,Coordinate Reference System,30172,7302,Tokyo / Japan zone XII,
+1102,Coordinate Reference System,30173,7302,Tokyo / Japan zone XIII,
+1103,Coordinate Reference System,30174,7302,Tokyo / Japan zone XIV,
+1104,Coordinate Reference System,30175,7302,Tokyo / Japan zone XV,
+1105,Coordinate Reference System,30176,7302,Tokyo / Japan zone XVI,
+1106,Coordinate Reference System,30177,7302,Tokyo / Japan zone XVII,
+1107,Coordinate Reference System,30178,7302,Tokyo / Japan zone XVIII,
+1108,Coordinate Reference System,30200,7302,Trinidad 1903 / Trinidad,
+1109,Coordinate Reference System,30491,7302,Voirol /N Algerie ancien,
+1110,Coordinate Reference System,30492,7302,Voirol /S Algerie ancien,
+1111,Coordinate Reference System,30729,7302,Nord Sahara / UTM 29N,
+1112,Coordinate Reference System,30730,7302,Nord Sahara / UTM 30N,
+1113,Coordinate Reference System,30731,7302,Nord Sahara / UTM 31N,
+1114,Coordinate Reference System,30732,7302,Nord Sahara / UTM 32N,
+1115,Coordinate Reference System,30791,7302,Nord Sahara / N Algerie,
+1116,Coordinate Reference System,30792,7302,Nord Sahara / S Algerie,
+1117,Coordinate Reference System,31265,7302,MGI / Gauss zone 5,
+1118,Coordinate Reference System,31266,7302,MGI / Gauss zone 6,
+1119,Coordinate Reference System,31267,7302,MGI / Gauss zone 7,
+1120,Coordinate Reference System,31268,7302,MGI / Gauss zone 8,
+1121,Coordinate Reference System,31291,7302,MGI / Austria West,
+1122,Coordinate Reference System,31292,7302,MGI / Austria Central,
+1123,Coordinate Reference System,31293,7302,MGI / Austria East,
+1124,Coordinate Reference System,31370,7302,BD 72 / Lambert 72,
+1125,Coordinate Reference System,31461,7302,DHDN / Gauss zone 1,
+1126,Coordinate Reference System,31462,7302,DHDN / Gauss zone 2,
+1127,Coordinate Reference System,31463,7302,DHDN / Gauss zone 3,
+1128,Coordinate Reference System,31464,7302,DHDN / Gauss zone 4,
+1129,Coordinate Reference System,31465,7302,DHDN / Gauss zone 5,
+1130,Coordinate Reference System,31600,7302,Stereo 33,
+1131,Coordinate Reference System,31700,7302,Stereo 70,
+1132,Coordinate Reference System,32013,7302,NAD27 / New Mexico Cent.,
+1133,Coordinate Reference System,32018,7302,NAD27 / New York Long Is,
+1134,Coordinate Reference System,32020,7302,NAD27 / North Dakota N,
+1135,Coordinate Reference System,32021,7302,NAD27 / North Dakota S,
+1136,Coordinate Reference System,32028,7302,NAD27 / Pennsylvania N,
+1137,Coordinate Reference System,32029,7302,NAD27 / Pennsylvania S,
+1138,Coordinate Reference System,32031,7302,NAD27 / South Carolina N,
+1139,Coordinate Reference System,32033,7302,NAD27 / South Carolina S,
+1140,Coordinate Reference System,32034,7302,NAD27 / South Dakota N,
+1141,Coordinate Reference System,32035,7302,NAD27 / South Dakota S,
+1142,Coordinate Reference System,32038,7302,NAD27 / Texas North Cen.,
+1143,Coordinate Reference System,32040,7302,NAD27 / Texas South Cen.,
+1144,Coordinate Reference System,32050,7302,NAD27 / West Virginia N,
+1145,Coordinate Reference System,32051,7302,NAD27 / West Virginia S,
+1146,Coordinate Reference System,32053,7302,NAD27 / Wisconsin Cen.,
+1147,Coordinate Reference System,32056,7302,NAD27 / Wyoming E. Cen.,
+1148,Coordinate Reference System,32057,7302,NAD27 / Wyoming W. Cen.,
+1149,Coordinate Reference System,32113,7302,NAD83 / New Mexico Cent.,
+1150,Coordinate Reference System,32118,7302,NAD83 / New York Long Is,
+1151,Coordinate Reference System,32120,7302,NAD83 / North Dakota N,
+1152,Coordinate Reference System,32121,7302,NAD83 / North Dakota S,
+1153,Coordinate Reference System,32128,7302,NAD83 / Pennsylvania N,
+1154,Coordinate Reference System,32129,7302,NAD83 / Pennsylvania S,
+1155,Coordinate Reference System,32134,7302,NAD83 / South Dakota N,
+1156,Coordinate Reference System,32135,7302,NAD83 / South Dakota S,
+1157,Coordinate Reference System,32138,7302,NAD83 / Texas North Cen.,
+1158,Coordinate Reference System,32140,7302,NAD83 / Texas South Cen.,
+1159,Coordinate Reference System,32150,7302,NAD83 / West Virginia N,
+1160,Coordinate Reference System,32151,7302,NAD83 / West Virginia S,
+1161,Coordinate Reference System,32153,7302,NAD83 / Wisconsin Cen.,
+1162,Coordinate Reference System,32156,7302,NAD83 / Wyoming E. Cen.,
+1163,Coordinate Reference System,32157,7302,NAD83 / Wyoming W. Cen.,
+1164,Unit of Measure,9001,7306,m,
+1165,Unit of Measure,9002,7306,ft,
+1166,Unit of Measure,9003,7306,ftUS,
+1167,Unit of Measure,9005,7306,ftCla,
+1168,Unit of Measure,9014,7306,fathom,
+1169,Unit of Measure,9030,7306,nautmi,
+1170,Unit of Measure,9031,7306,mGer,
+1171,Unit of Measure,9033,7306,chUS,
+1172,Unit of Measure,9034,7306,lkUS,
+1173,Unit of Measure,9035,7306,miUS,
+1174,Unit of Measure,9036,7306,km,
+1175,Unit of Measure,9037,7306,ydCla,
+1176,Unit of Measure,9038,7306,chCla,
+1177,Unit of Measure,9039,7306,lkCla,
+1178,Unit of Measure,9040,7306,ydSe,
+1179,Unit of Measure,9041,7306,ftSe,
+1180,Unit of Measure,9042,7306,chSe,
+1181,Unit of Measure,9043,7306,lkSe,
+1182,Unit of Measure,9050,7306,ydBnA,
+1183,Unit of Measure,9051,7306,ftBnA,
+1184,Unit of Measure,9052,7306,chBnA,
+1185,Unit of Measure,9053,7306,lkBnA,
+1186,Unit of Measure,9060,7306,ydBnB,
+1187,Unit of Measure,9061,7306,ftBnB,
+1188,Unit of Measure,9062,7306,chBnB,
+1189,Unit of Measure,9063,7306,lkBnB,
+1190,Unit of Measure,9070,7306,ftBr(65),
+1191,Unit of Measure,9080,7306,ftInd,
+1192,Unit of Measure,9081,7306,ftInd(37),
+1193,Unit of Measure,9082,7306,ftInd(62),
+1194,Unit of Measure,9083,7306,ftInd(75),
+1195,Unit of Measure,9084,7306,ydInd,
+1196,Unit of Measure,9085,7306,ydInd(37),
+1197,Unit of Measure,9086,7306,ydInd(62),
+1198,Unit of Measure,9087,7306,ydInd(75),
+1199,Unit of Measure,9093,7306,mi,
+1200,Unit of Measure,9094,7306,ftGC,
+1201,Unit of Measure,9101,7306,rad,
+1202,Unit of Measure,9102,7306,dega,
+1203,Unit of Measure,9103,7306,mina,
+1204,Unit of Measure,9104,7306,seca,
+1205,Unit of Measure,9105,7306,gr,
+1206,Unit of Measure,9106,7306,gon,
+1207,Unit of Measure,9107,7306,dega,
+1208,Unit of Measure,9108,7306,dega,
+1209,Unit of Measure,9109,7306,urad,
+1210,Unit of Measure,9110,7306,dega,
+1211,Unit of Measure,9111,7306,dega,
+1212,Unit of Measure,9112,7306,cgr,
+1213,Unit of Measure,9113,7306,ccgr,
+1214,Unit of Measure,9114,7306,mila,
+1215,Coordinate_Operation Method,9824,7302,UTM grid system,
+1216,Coordinate Reference System,4143,7301,C�te D'Ivoire,Same alias also applied to Locodjo 1965 (code 4142).
+1217,Coordinate Reference System,4143,7301,Port Bouet,Same alias also applied to Locodjo 1965 (code 4142).
+1218,Coordinate Reference System,4142,7301,Port Bouet,Same alias also applied to Abidjan 1987 (code 4143).
+1219,Coordinate Reference System,4142,7301,C�te D'Ivoire,Same alias also applied to Abidjan 1987 (code 4143).
+1220,Coordinate Reference System,2164,7301,Cote d'Ivoire / TM 5 NW,Same alias used for Abidjan 1987 / TM 5 NW (code 2165).
+1221,Coordinate Reference System,2164,7301,Port Bouet / TM 5 NW,Same alias used for Abidjan 1987 / TM 5 NW (code 2165).
+1222,Coordinate Reference System,2165,7301,Cote d'Ivoire / TM 5 NW,Same alias used for Locodjo 1965 / TM 5 NW (code 2164).
+1223,Coordinate Reference System,2165,7301,Port Bouet / TM 5 NW,Same alias used for Abidjan 1987 / TM 5 NW (code 2165).
+1224,Coordinate_Operation,1588,7301,ED50 to EUREF89 (1),
+1225,Coordinate_Operation,1588,7301,ED50 to ETRF89 (1),
+1227,Coordinate_Operation,1589,7301,ED50 to EUREF89 (3),
+1229,Datum,6181,7301,LUREF,
+1230,Datum,6180,7302,EST97,
+1231,Datum,6179,7301,42/58,
+1232,Datum,6178,7301,42/83,
+1233,Datum,6312,7308,HR1901,
+1234,Datum,6312,7309,D48,
+1235,Coordinate_Operation Method,9807,7301,Gauss-Kruger,
+1236,Coordinate_Operation Method,9807,7302,TM,
+1237,Datum,6818,7301,Jednotn� Trigonometrick� S�te Katastr�ln� (Ferro),
+1238,Coordinate Reference System,2393,7301,KKJ / Basic Coordinate System zone 3,
+1239,Coordinate Reference System,2391,7301,KKJ / Basic Coordinate System zone 1,
+1240,Coordinate Reference System,2392,7301,KKJ / Basic Coordinate System zone 2,
+1241,Coordinate Reference System,2394,7301,KKJ / Basic Coordinate System zone 4,
+1242,Coordinate Reference System,31467,7301,DHDN / 3-degree Gauss-Kruger zone 3,
+1243,Coordinate Reference System,31468,7301,DHDN / 3-degree Gauss-Kruger zone 4,
+1244,Coordinate Reference System,31469,7301,DHDN / 3-degree Gauss-Kruger zone 5,
+1247,Coordinate Reference System,4178,7301,42/83,
+1248,Coordinate Reference System,31466,7301,DHDN / 3-degree Gauss-Kruger zone 2,
+1249,Coordinate Reference System,2166,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3,
+1250,Coordinate Reference System,2167,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4,
+1251,Coordinate Reference System,4181,7301,LUREF,
+1253,Coordinate Reference System,4258,7301,EUREF89,
+1254,Coordinate Reference System,2170,7301,EUREF89 / CS92,
+1255,Coordinate Reference System,4312,7308,HR1901,
+1256,Coordinate Reference System,4312,7309,D48,
+1257,Coordinate Reference System,4805,7308,HR1901 (Ferro),
+1258,Coordinate Reference System,4805,7309,D48 (Ferro),
+1259,Coordinate Reference System,31275,7308,HDKS zone 5,HDKS = Hrvatski Drzavni Koordinatni Sustav
+1260,Coordinate Reference System,31276,7308,HDKS zone 6,HDKS = Hrvatski Drzavni Koordinatni Sustav
+1261,Coordinate Reference System,31275,7309,D48 zone 5,
+1262,Coordinate Reference System,2169,7301,LUREF / Gauss,
+1263,Coordinate Reference System,31467,7310,PD/83 / Gauss-Kruger zone 3,PD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Thuringen.
+1264,Coordinate Reference System,31468,7310,PD/83 / Gauss-Kruger zone 4,PD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Thuringen.
+1265,Coordinate Reference System,31468,7310,RD/83 / Gauss-Kruger zone 4,RD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Sachsen.
+1266,Coordinate Reference System,31469,7310,RD/83 / Gauss-Kruger zone 4,RD/83 is the result of the transformation from Pulkovo 1942(83) to DHDN for Sachsen.
+1267,Coordinate_Operation,1620,7308,HR1901 to ETRS89 (2),
+1268,Coordinate_Operation,1619,7307,AT_MGI to ETRS89,
+1269,Coordinate_Operation,1622,7307,CZ_S-JTSK to ETRS89,
+1270,Coordinate_Operation,1620,7307,HR_HDKS to ETRS89,
+1271,Coordinate_Operation,1624,7307,SK_S-JTSK to ETRS89,
+1272,Coordinate_Operation,1626,7307,DK_ED50 to ETRS89,
+1273,Coordinate_Operation,1628,7307,GI_ED50 to ETRS89,
+1274,Coordinate_Operation,1630,7307,ES_ED50 (BAL99) to ETRS89,
+1275,Coordinate_Operation,1632,7307,ES_ED50 (EST99) to ETRS89,
+1276,Coordinate_Operation,1634,7307,ES_ED50 (ZNW99) to ETRS89,
+1277,Coordinate_Operation,1636,7307,TR_ED50 to ETRS89,
+1278,Coordinate_Operation,1638,7307,FI_KKJ to ETRS89,
+1279,Coordinate_Operation,1640,7307,IE_Ireland65 to ETRS89,IE_Ireland65 to ETRS89 applies to the Republic of Ireland. Also referred to in EuroGeographics as NI_Ireland65 to ETRS89 for Northern Ireland.
+1280,Coordinate_Operation,1642,7307,LU_LUREF to ETRS89,
+1281,Coordinate_Operation,1644,7307,PL_42/58 to ETRS89,
+1282,Coordinate_Operation,1646,7307,CH_CH1903 to ETRS89,
+1283,Coordinate_Operation,1647,7307,CH_CH1903+ to ETRS89,
+1284,Coordinate_Operation,1648,7307,EE_L-EST97 to ETRS89,
+1285,Coordinate_Operation,1650,7307,FR_ED50 to ETRS89,
+1286,Coordinate_Operation,1651,7307,FR_NTF to ETRS89,
+1287,Coordinate_Operation,1653,7307,NO_NGO1948 to ETRS89,
+1288,Coordinate_Operation,1657,7307,PT_D73 to ETRS89,
+1289,Coordinate_Operation,1655,7307,PT_DLX(HAY) to ETRS89,
+1290,Coordinate_Operation,1652,7307,BE_BD72 to ETRS89,
+1291,Coordinate Reference System,31282,7302,MGI / Austria Central,
+1292,Coordinate Reference System,31283,7302,MGI / Austria East,
+1293,Coordinate Reference System,31281,7302,MGI / Austria West,
+1294,Datum,6176,7302,AAD98,
+1295,Coordinate Reference System,4176,7302,AAD98,
+1296,Datum,6167,7302,NZGD2000,
+1297,Coordinate Reference System,2193,7302,NZGD2000 / NZTM,
+1298,Coordinate_Operation,19971,7302,NZTM,
+1299,Datum,6186,7302,S-JTSK,
+1300,Datum,5119,7301,Nivellement general de la France,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN78 (code 5120).
+1301,Datum,5119,7301,NGF,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN78 (code 5120).
+1302,Datum,5120,7301,NGF,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN69 (code 5119).
+1303,Datum,5118,7301,NGF,This alias is also used for other datum realisations: see NGF - IGN69 (code 5119) and NGF - IGN78 (code 5120).
+1304,Datum,5120,7301,Nivellement general de la France,This alias is also used for other datum realisations: see NGF - Lallemand (code 5118) and NGF - IGN69 (code 5119).
+1305,Datum,5118,7301,Nivellement general de la France,This alias is also used for other datum realisations: see NGF - IGN69 (code 5119) and NGF - IGN78 (code 5120).
+1306,Datum,6143,7301,C�te D'Ivoire (Ivory Coast),This alias is not unique: it is also used for code 6142.
+1307,Datum,6142,7301,C�te D'Ivoire (Ivory Coast),This alias is not unique: it is also used for code 6143.
+1308,Coordinate Reference System,4300,7301,1975 Mapping Adjustment,
+1309,Coordinate Reference System,2196,7301,EUREF89 / Kp2000 Jutland,
+1310,Coordinate Reference System,2196,7301,System 2000 Jylland zoner,
+1311,Coordinate Reference System,2197,7301,EUREF89 / Kp2000 Zealand,
+1312,Coordinate Reference System,2197,7301,System 2000 Sjaelland zoner,
+1313,Coordinate Reference System,2198,7301,EUREF89 / Kp2000 Bornholm,
+1314,Coordinate Reference System,2198,7301,System 2000 Bornholm zoner,
+1315,Datum,6189,7301,SIRGAS-REGVEN,
+1316,Datum,6189,7302,REGVEN,
+1317,datum,6171,7300,R�seau G�od�sique Fran�ais 1993,
+1318,datum,6172,7300,Posiciones Geod�sicas Argentinas,
+1319,datum,6186,7300,Jednotn� Trigonometrick� S�te Katastr�ln�,
+1320,Coordinate Reference System,4314,7310,PD/83,Used for describing result of transformation from Pulkovo 1942(83) to DHDN for Thuringen.
+1321,Coordinate Reference System,4314,7310,RD/83,Used for describing result of transformation from Pulkovo 1942(83) to DHDN for Sachsen.
+1322,Coordinate_Operation,15304,7302,Arizona East (ft),
+1323,Coordinate_Operation,15305,7302,Arizona Central (ft),
+1324,Coordinate_Operation,15306,7302,Arizona West (ft),
+1325,Coordinate_Operation,15307,7302,California zone 1 (ftUS),
+1326,Coordinate_Operation,15308,7302,California zone 2 (ftUS),
+1327,Coordinate_Operation,15309,7302,California zone 3 (ftUS),
+1328,Coordinate_Operation,15310,7302,California zone 4 (ftUS),
+1329,Coordinate_Operation,15311,7302,California zone 5 (ftUS),
+1330,Coordinate_Operation,15312,7302,California zone 6 (ftUS),
+1331,Coordinate_Operation,15313,7302,Colorado North (ftUS),
+1332,Coordinate_Operation,15314,7302,Colorado Central (ftUS),
+1333,Coordinate_Operation,15315,7302,Colorado South (ftUS),
+1334,Coordinate_Operation,15316,7301,Connecticut (ft US),
+1335,Coordinate_Operation,15317,7302,Delaware (ftUS),
+1336,Coordinate_Operation,15318,7301,Florida East (ft US),
+1337,Coordinate_Operation,15319,7302,Florida West (ftUS),
+1338,Coordinate_Operation,15320,7302,Florida North (ftUS),
+1339,Coordinate_Operation,15321,7302,Georgia East (ftUS),
+1340,Coordinate_Operation,15322,7302,Georgia West (ftUS),
+1341,Coordinate_Operation,15323,7302,Idaho East (ftUS),
+1342,Coordinate_Operation,15324,7302,Idaho Central (ftUS),
+1343,Coordinate_Operation,15325,7302,Idaho West (ftUS),
+1344,Coordinate_Operation,15326,7302,Indiana East (ftUS),
+1345,Coordinate_Operation,15327,7302,Indiana West (ftUS),
+1346,Coordinate_Operation,15328,7302,Kentucky North (ftUS),
+1347,Coordinate_Operation,15329,7302,Kentucky South (ftUS),
+1348,Coordinate_Operation,15330,7302,Maryland (ftUS),
+1349,Coordinate_Operation,15331,7302,Massachusetts Mainland (ftUS),
+1350,Coordinate_Operation,15332,7302,Massachusetts Island (ftUS),
+1351,Coordinate_Operation,15333,7302,Michigan North (ft),
+1352,Coordinate_Operation,15334,7302,Michigan Central (ft),
+1353,Coordinate_Operation,15335,7302,Michigan South (ft),
+1354,Coordinate_Operation,15336,7302,Mississippi East (ftUS),
+1355,Coordinate_Operation,15337,7302,Mississippi West (ftUS),
+1356,Coordinate_Operation,15338,7301,Montana (ftUS),
+1357,Coordinate_Operation,15339,7302,New Mexico East (ftUS),
+1358,Coordinate_Operation,15340,7302,New Mexico Central (ftUS),
+1359,Coordinate_Operation,15341,7302,New Mexico West (ftUS),
+1360,Coordinate_Operation,15342,7302,New York East (ftUS),
+1361,Coordinate_Operation,15343,7302,New York Central (ftUS),
+1362,Coordinate_Operation,15344,7302,New York  West (ftUS),
+1363,Coordinate_Operation,15345,7302,New York Long Island (ftUS),
+1364,Coordinate_Operation,15346,7302,North Carolina (ftUS),
+1365,Coordinate_Operation,15347,7302,North Dakota North (ft),
+1366,Coordinate_Operation,15348,7302,North Dakota South (ft),
+1367,Coordinate_Operation,15349,7302,Oklahoma North (ftUS),
+1368,Coordinate_Operation,15350,7302,Oklahoma South (ftUS),
+1369,Coordinate_Operation,15351,7302,Oregon North (ft),
+1370,Coordinate_Operation,15352,7302,Oregon South (ft),
+1371,Coordinate_Operation,15353,7302,Pennsylvania North (ftUS),
+1372,Coordinate_Operation,15354,7301,Pennsylvania South (ftUS),
+1373,Coordinate_Operation,15355,7302,South Carolina (ft),
+1374,Coordinate_Operation,15356,7302,Tennessee (ftUS),
+1375,Coordinate_Operation,15357,7302,Texas North (ftUS),
+1376,Coordinate_Operation,15358,7302,Texas North Central (ftUS),
+1377,Coordinate_Operation,15359,7302,Texas Central (ftUS),
+1378,Coordinate_Operation,15360,7302,Texas South Central (ftUS),
+1379,Coordinate_Operation,15361,7302,Texas South (ftUS),
+1380,Coordinate_Operation,15362,7302,Utah North (ft),
+1381,Coordinate_Operation,15363,7302,Utah Central (ft),
+1382,Coordinate_Operation,15364,7302,Utah South (ft),
+1383,Coordinate_Operation,15365,7302,Virginia North (ftUS),
+1384,Coordinate_Operation,15366,7302,Virginia South (ftUS),
+1385,Coordinate_Operation,15367,7302,Washington North (ftUS),
+1386,Coordinate_Operation,15368,7302,Washington South (ftUS),
+1387,Coordinate_Operation,15369,7302,Wisconsin North (ftUS),
+1388,Coordinate_Operation,15370,7302,Wisconsin Central (ftUS),
+1389,Coordinate_Operation,15371,7302,Wisconsin South (ftUS),
+1390,datum,6190,7302,POSGAR 98,
+1391,datum,6190,7300,Posiciones Geod�sicas Argentinas 1998,
+1392,Coordinate Reference System,4190,7301,National Geodetic System [Argentina],see http://www.igm.gov.ar/posgar.html
+1393,datum,6182,7301,Observatario Flores,
+1394,datum,6182,7302,Azores Occidental 1939,
+1395,datum,6183,7301,Graciosa Base SW,
+1396,datum,6183,7302,Azores Central 1948,
+1397,datum,6184,7301,Sao Bras,
+1398,datum,6184,7302,Azores Oriental 1940,
+1399,Coordinate Reference System,4182,7301,Observatorio Flores,
+1400,Coordinate Reference System,4183,7301,Graciosa,
+1401,Coordinate Reference System,4184,7301,Sao Braz,
+1402,Coordinate_Operation,18084,7301,France zone IV,
+1403,Coordinate_Operation,18083,7301,France zone III,
+1404,Coordinate_Operation,18082,7301,France zone II,
+1405,Coordinate_Operation,18081,7301,France zone I,
+1406,Coordinate_Operation,18093,7301,Sud France,
+1407,Coordinate_Operation,18094,7301,Corse,
+1408,Coordinate_Operation,18092,7301,Centre France,
+1409,Coordinate_Operation,18091,7301,Nord France,
+1410,Coordinate Reference System,27561,7301,NTF (Paris) / Nord France,
+1411,Coordinate Reference System,27562,7301,NTF (Paris) / Centre France,
+1412,Coordinate Reference System,27563,7301,NTF (Paris) / Sud France,
+1413,Coordinate Reference System,27564,7301,NTF (Paris) / Corse,
+1414,Coordinate Reference System,27571,7301,NTF (Paris) / France I,
+1415,Coordinate Reference System,27572,7301,NTF (Paris) / France II,
+1416,Coordinate Reference System,27573,7301,NTF (Paris) / France III,
+1417,Coordinate Reference System,27574,7301,NTF (Paris) / France IV,
+1418,Coordinate Reference System,27572,7301,NTF (Paris) / Lambert zone II Etendue,
+1419,datum,6156,7300,Jednotn� Trigonometrick� S�te Katastr�ln�,
+1421,Coordinate_Operation,1751,7301,Amersfoort to ETRF89 (1),
+1422,Coordinate Reference System,2168,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 5,
+1423,Coordinate_Operation,15302,7302,Tennessee,
+1424,Coordinate_Operation,16269,7302,3-degree Gauss zone 9,
+1425,Coordinate_Operation,16270,7302,3-degree Gauss zone 10,
+1426,Coordinate_Operation,16271,7302,3-degree Gauss zone 11,
+1427,Coordinate_Operation,16272,7302,3-degree Gauss zone 12,
+1428,Coordinate_Operation,16273,7302,3-degree Gauss zone 13,
+1429,Coordinate_Operation,16274,7302,3-degree Gauss zone 14,
+1430,Coordinate_Operation,16275,7302,3-degree Gauss zone 15,
+1431,datum,6123,7300,Kartasto Koordinaati J�rjestelm� 1966,
+1432,Coordinate Reference System,2181,7301,ED50 / Turkey zone 9,
+1433,Coordinate Reference System,2182,7301,ED50 / Turkey zone 10,
+1434,Coordinate Reference System,2183,7301,ED50 / Turkey zone 11,
+1435,Coordinate Reference System,2184,7301,ED50 / Turkey zone 12,
+1436,Coordinate Reference System,2185,7301,ED50 / Turkey zone 13,
+1437,Coordinate Reference System,2186,7301,ED50 / Turkey zone 14,
+1438,Coordinate Reference System,2187,7301,ED50 / Turkey zone 15,
+1439,Coordinate Reference System,2188,7301,Observatorio Flores / UTM zone 25N,
+1440,Coordinate Reference System,2189,7301,Graciosa / UTM zone 26N,
+1441,Coordinate Reference System,2190,7301,Sao Braz / UTM zone 26N,
+1442,Coordinate_Operation,1781,7310,PD/83 to ETRS89,
+1443,Coordinate_Operation,1782,7310,RD/83 to ETRS89,
+1444,Coordinate Reference System,4207,7301,Lisbon 1937,
+1445,Coordinate Reference System,4803,7301,Lisbon 1937 (Lisbon),
+1446,Coordinate Reference System,20791,7301,Lisbon 1937 (Lisbon)/Portuguese Grid,
+1447,Coordinate Reference System,20790,7301,Lisbon 1937 (Lisbon)/Portuguese National Grid,
+1448,Coordinate_Operation,18411,7301,Afrique Occidentale Fran�aise Senegal zone,
+1449,Coordinate_Operation,18412,7301,Afrique Occidentale Fran�aise C�te d'Ivoire zone,
+1450,Coordinate_Operation,18413,7301,Afrique Occidentale Fran�aise Dahomey zone,
+1451,Coordinate_Operation,18415,7301,Afrique Equatoriale Fran�aise ouest zone,
+1452,Coordinate_Operation,18416,7301,Afrique Equatoriale Fran�aise centrale zone,
+1453,Coordinate_Operation,18417,7301,Afrique Equatoriale Fran�aise est zone,
+1454,Coordinate_Operation,18414,7301,Afrique Occidentale Fran�aise Niger zone,
+1455,Coordinate_Operation,18411,7302,AOF Senegal zone,
+1456,Coordinate_Operation,18412,7302,AOF C�te d'Ivoire zone,
+1457,Coordinate_Operation,18413,7302,AOF Dahomey zone,
+1458,Coordinate_Operation,18414,7302,AOF Niger zone,
+1459,Coordinate_Operation,18415,7302,AEF west,
+1460,Coordinate_Operation,18416,7302,AEF central,
+1461,Coordinate_Operation,18417,7302,AEF east,
+1462,Coordinate_Operation Method,9823,7301,Plate Carr�e,This alias only applies if the latitude of natural origin is at the equator.
+1464,Coordinate_Operation,1469,7301,C�te D'Ivoire to WGS 84 (1),Same alias also applied to Abidjan 1987 to WGS 84 (1) (code 1470).
+1465,Coordinate_Operation,1469,7301,Port Bouet to WGS 84 (1),Same alias also applied to Abidjan 1987 to WGS 84 (1) (code 1470).
+1466,Coordinate_Operation,1470,7301,C�te D'Ivoire to WGS 84 (1),Same alias also applied to Locodjo 1965 to WGS 84 (1) (code 1469).
+1467,Coordinate_Operation,1470,7301,Port Bouet to WGS 84 (1),Same alias also applied to Locodjo 1965 to WGS 84 (1) (code 1469).
+1468,Coordinate Reference System,2040,7301,Port Bouet / UTM zone 30N,Same alias used for Abidjan 1987 / UTM zone 30N (code 2041).
+1469,Coordinate Reference System,2040,7301,C�te d'Ivoire / UTM zone 30N,Same alias used for Abidjan 1987 / UTM zone 30N (code 2041).
+1470,Coordinate Reference System,2041,7301,Port Bouet / UTM zone 30N,Same alias used for Locodjo 1965 / UTM zone 30N (code 2040).
+1471,Coordinate Reference System,2041,7301,C�te d'Ivoire / UTM zone 30N,Same alias used for Locodjo 1965 / UTM zone 30N (code 2040).
+1472,Coordinate Reference System,2042,7301,Port Bouet / UTM zone 29N,Same alias used for Abidjan 1987 / UTM zone 29N (code 2043).
+1473,Coordinate Reference System,2042,7301,C�te d'Ivoire / UTM zone 29N,Same alias used for Abidjan 1987 / UTM zone 29N (code 2043).
+1474,Coordinate Reference System,2043,7301,Port Bouet / UTM zone 29N,Same alias used for Locodjo 1965 / UTM zone 29N (code 2042).
+1475,Coordinate Reference System,2043,7301,C�te d'Ivoire / UTM zone 29N,Same alias used for Locodjo 1965 / UTM zone 29N (code 2042).
+1479,Coordinate_Operation,18421,7301,Greenland zone 1 west,
+1480,Coordinate_Operation,18428,7301,Greenland zone 8 west,
+1481,Coordinate Reference System,2297,7301,Qornoq 1927 / Greenland zone 1 west,
+1482,Coordinate Reference System,2307,7301,Qornoq 1927 / Greenland zone 8 west,
+1483,Coordinate Reference System,32113,7301,NAD83 / New Mexico Central (m),
+1484,Coordinate Reference System,26949,7301,NAD83 / Arizona Central (m),
+1485,Coordinate Reference System,26929,7301,NAD83 / Alabama East (m),
+1486,Coordinate Reference System,26930,7301,NAD83 / Alabama West (m),
+1487,Coordinate Reference System,26931,7301,NAD83 / Alaska zone 1 (m),
+1488,Coordinate Reference System,26940,7301,NAD83 / Alaska zone 10 (m),
+1489,Coordinate Reference System,26932,7301,NAD83 / Alaska zone 2 (m),
+1490,Coordinate Reference System,26933,7301,NAD83 / Alaska zone 3 (m),
+1491,Coordinate Reference System,26934,7301,NAD83 / Alaska zone 4 (m),
+1492,Coordinate Reference System,26935,7301,NAD83 / Alaska zone 5 (m),
+1493,Coordinate Reference System,26936,7301,NAD83 / Alaska zone 6 (m),
+1494,Coordinate Reference System,26937,7301,NAD83 / Alaska zone 7 (m),
+1495,Coordinate Reference System,26938,7301,NAD83 / Alaska zone 8 (m),
+1496,Coordinate Reference System,26939,7301,NAD83 / Alaska zone 9 (m),
+1497,Coordinate Reference System,26948,7301,NAD83 / Arizona East (m),
+1498,Coordinate Reference System,26950,7301,NAD83 / Arizona West (m),
+1499,Coordinate Reference System,26951,7301,NAD83 / Arkansas North (m),
+1500,Coordinate Reference System,26952,7301,NAD83 / Arkansas South (m),
+1501,Coordinate Reference System,26941,7301,NAD83 / California zone 1 (m),
+1502,Coordinate Reference System,26942,7301,NAD83 / California zone 2 (m),
+1503,Coordinate Reference System,26943,7301,NAD83 / California zone 3 (m),
+1504,Coordinate Reference System,26944,7301,NAD83 / California zone 4 (m),
+1505,Coordinate Reference System,26945,7301,NAD83 / California zone 5 (m),
+1506,Coordinate Reference System,26946,7301,NAD83 / California zone 6 (m),
+1507,Coordinate Reference System,26954,7301,NAD83 / Colorado Central (m),
+1508,Coordinate Reference System,26953,7301,NAD83 / Colorado North (m),
+1509,Coordinate Reference System,26955,7301,NAD83 / Colorado South (m),
+1510,Coordinate Reference System,26956,7301,NAD83 / Connecticut (m),
+1511,Coordinate Reference System,26957,7301,NAD83 / Delaware (m),
+1512,Coordinate Reference System,26958,7301,NAD83 / Florida East (m),
+1513,Coordinate Reference System,26960,7301,NAD83 / Florida North (m),
+1514,Coordinate Reference System,26959,7301,NAD83 / Florida West (m),
+1515,Coordinate Reference System,26966,7301,NAD83 / Georgia East (m),
+1516,Coordinate Reference System,26967,7301,NAD83 / Georgia West (m),
+1517,Coordinate Reference System,26961,7301,NAD83 / Hawaii zone 1 (m),
+1518,Coordinate Reference System,26962,7301,NAD83 / Hawaii zone 2 (m),
+1519,Coordinate Reference System,26963,7301,NAD83 / Hawaii zone 3 (m),
+1520,Coordinate Reference System,26964,7301,NAD83 / Hawaii zone 4 (m),
+1521,Coordinate Reference System,26965,7301,NAD83 / Hawaii zone 5 (m),
+1522,Coordinate Reference System,26969,7301,NAD83 / Idaho Central (m),
+1523,Coordinate Reference System,26968,7301,NAD83 / Idaho East (m),
+1524,Coordinate Reference System,26970,7301,NAD83 / Idaho West (m),
+1525,Coordinate Reference System,26971,7301,NAD83 / Illinois East (m),
+1526,Coordinate Reference System,26972,7301,NAD83 / Illinois West (m),
+1527,Coordinate Reference System,26973,7301,NAD83 / Indiana East (m),
+1528,Coordinate Reference System,26974,7301,NAD83 / Indiana West (m),
+1529,Coordinate Reference System,26975,7301,NAD83 / Iowa North (m),
+1530,Coordinate Reference System,26976,7301,NAD83 / Iowa South (m),
+1531,Coordinate Reference System,26977,7301,NAD83 / Kansas North (m),
+1532,Coordinate Reference System,26978,7301,NAD83 / Kansas South (m),
+1533,Coordinate Reference System,2205,7301,NAD83 / Kentucky North (m),
+1534,Coordinate Reference System,26980,7301,NAD83 / Kentucky South (m),
+1535,Coordinate Reference System,26981,7301,NAD83 / Louisiana North (m),
+1536,Coordinate Reference System,26982,7301,NAD83 / Louisiana South (m),
+1537,Coordinate Reference System,26983,7301,NAD83 / Maine East (m),
+1538,Coordinate Reference System,26984,7301,NAD83 / Maine West (m),
+1539,Coordinate Reference System,26985,7301,NAD83 / Maryland (m),
+1540,Coordinate Reference System,26987,7301,NAD83 / Massachusetts Island (m),
+1541,Coordinate Reference System,26986,7301,NAD83 / Massachusetts Mainland (m),
+1542,Coordinate Reference System,26989,7301,NAD83 / Michigan Central (m),
+1543,Coordinate Reference System,26988,7301,NAD83 / Michigan North (m),
+1544,Coordinate Reference System,26990,7301,NAD83 / Michigan South (m),
+1545,Coordinate Reference System,26992,7301,NAD83 / Minnesota Central (m),
+1546,Coordinate Reference System,26991,7301,NAD83 / Minnesota North (m),
+1547,Coordinate Reference System,26993,7301,NAD83 / Minnesota South (m),
+1548,Coordinate Reference System,26994,7301,NAD83 / Mississippi East (m),
+1549,Coordinate Reference System,26995,7301,NAD83 / Mississippi West (m),
+1550,Coordinate Reference System,26997,7301,NAD83 / Missouri Central (m),
+1551,Coordinate Reference System,26996,7301,NAD83 / Missouri East (m),
+1552,Coordinate Reference System,26998,7301,NAD83 / Missouri West (m),
+1553,Coordinate Reference System,32100,7301,NAD83 / Montana (m),
+1554,Coordinate Reference System,32104,7301,NAD83 / Nebraska (m),
+1555,Coordinate Reference System,32108,7301,NAD83 / Nevada Central (m),
+1556,Coordinate Reference System,32107,7301,NAD83 / Nevada East (m),
+1557,Coordinate Reference System,32109,7301,NAD83 / Nevada West (m),
+1558,Coordinate Reference System,32110,7301,NAD83 / New Hampshire (m),
+1559,Coordinate Reference System,32111,7301,NAD83 / New Jersey (m),
+1560,Coordinate Reference System,32112,7301,NAD83 / New Mexico East (m),
+1561,Coordinate Reference System,32114,7301,NAD83 / New Mexico West (m),
+1562,Coordinate Reference System,32116,7301,NAD83 / New York Central (m),
+1563,Coordinate Reference System,32115,7301,NAD83 / New York East (m),
+1564,Coordinate Reference System,32118,7301,NAD83 / New York Long Island (m),
+1565,Coordinate Reference System,32117,7301,NAD83 / New York West (m),
+1566,Coordinate Reference System,32119,7301,NAD83 / North Carolina (m),
+1567,Coordinate Reference System,32120,7301,NAD83 / North Dakota North (m),
+1568,Coordinate Reference System,32121,7301,NAD83 / North Dakota South (m),
+1569,Coordinate Reference System,32122,7301,NAD83 / Ohio North (m),
+1570,Coordinate Reference System,32123,7301,NAD83 / Ohio South (m),
+1571,Coordinate Reference System,32124,7301,NAD83 / Oklahoma North (m),
+1572,Coordinate Reference System,32125,7301,NAD83 / Oklahoma South (m),
+1573,Coordinate Reference System,32126,7301,NAD83 / Oregon North (m),
+1574,Coordinate Reference System,32127,7301,NAD83 / Oregon South (m),
+1575,Coordinate Reference System,32128,7301,NAD83 / Pennsylvania North (m),
+1576,Coordinate Reference System,32129,7301,NAD83 / Pennsylvania South (m),
+1577,Coordinate Reference System,32130,7301,NAD83 / Rhode Island (m),
+1578,Coordinate Reference System,32133,7301,NAD83 / South Carolina (m),
+1579,Coordinate Reference System,32134,7301,NAD83 / South Dakota North (m),
+1580,Coordinate Reference System,32135,7301,NAD83 / South Dakota South (m),
+1581,Coordinate Reference System,32136,7301,NAD83 / Tennessee (m),
+1582,Coordinate Reference System,32139,7301,NAD83 / Texas Central (m),
+1583,Coordinate Reference System,32137,7301,NAD83 / Texas North (m),
+1584,Coordinate Reference System,32138,7301,NAD83 / Texas North Central (m),
+1585,Coordinate Reference System,32141,7301,NAD83 / Texas South (m),
+1586,Coordinate Reference System,32140,7301,NAD83 / Texas South Central (m),
+1587,Coordinate Reference System,32143,7301,NAD83 / Utah Central (m),
+1588,Coordinate Reference System,32142,7301,NAD83 / Utah North (m),
+1589,Coordinate Reference System,32144,7301,NAD83 / Utah South (m),
+1590,Coordinate Reference System,32145,7301,NAD83 / Vermont (m),
+1591,Coordinate Reference System,32146,7301,NAD83 / Virginia North (m),
+1592,Coordinate Reference System,32147,7301,NAD83 / Virginia South (m),
+1593,Coordinate Reference System,32148,7301,NAD83 / Washington North (m),
+1594,Coordinate Reference System,32149,7301,NAD83 / Washington South (m),
+1595,Coordinate Reference System,32150,7301,NAD83 / West Virginia North (m),
+1596,Coordinate Reference System,32151,7301,NAD83 / West Virginia South (m),
+1597,Coordinate Reference System,32153,7301,NAD83 / Wisconsin Central (m),
+1598,Coordinate Reference System,32152,7301,NAD83 / Wisconsin North (m),
+1599,Coordinate Reference System,32154,7301,NAD83 / Wisconsin South (m),
+1600,Coordinate Reference System,32155,7301,NAD83 / Wyoming East (m),
+1601,Coordinate Reference System,32156,7301,NAD83 / Wyoming East Central (m),
+1602,Coordinate Reference System,32158,7301,NAD83 / Wyoming West (m),
+1603,Coordinate Reference System,32157,7301,NAD83 / Wyoming West Central (m),
+1604,Coordinate Reference System,32161,7301,NAD83 / Puerto Rico & Virgin Is. (m),
+1605,Coordinate_Operation,10131,7301,Alabama CS83 East zone,
+1606,Coordinate_Operation,10132,7301,Alabama CS83 West zone,
+1607,Coordinate_Operation,10231,7301,Arizona CS83 East zone,
+1608,Coordinate_Operation,10232,7301,Arizona CS83 Central zone,
+1609,Coordinate_Operation,10233,7301,Arizona CS83 West zone,
+1610,Coordinate_Operation,10331,7301,Arkansas CS83 North zone,
+1611,Coordinate_Operation,10332,7301,Arkansas CS83 South zone,
+1612,Coordinate_Operation,10431,7301,California CS83 zone 1,
+1613,Coordinate_Operation,10432,7301,California CS83 zone 2,
+1614,Coordinate_Operation,10433,7301,California CS83 zone 3,
+1615,Coordinate_Operation,10434,7301,California CS83 zone 4,
+1616,Coordinate_Operation,10435,7301,California CS83 zone 5,
+1617,Coordinate_Operation,10436,7301,California CS83 zone 6,
+1618,Coordinate_Operation,10531,7301,Colorado CS83 North zone,
+1619,Coordinate_Operation,10532,7301,Colorado CS83 Central zone,
+1620,Coordinate_Operation,10533,7301,Colorado CS83 South zone,
+1621,Coordinate_Operation,10630,7301,Connecticut CS83,
+1622,Coordinate_Operation,10730,7301,Delaware CS83,
+1623,Coordinate_Operation,10931,7301,Florida CS83 East zone,
+1624,Coordinate_Operation,10932,7301,Florida CS83 West zone,
+1625,Coordinate_Operation,10933,7301,Florida CS83 North zone,
+1626,Coordinate_Operation,11031,7301,Georgia CS83 East zone,
+1627,Coordinate_Operation,11032,7301,Georgia CS83 West zone,
+1628,Coordinate_Operation,11131,7301,Idaho CS83 East zone,
+1629,Coordinate_Operation,11132,7301,Idaho CS83 Central zone,
+1630,Coordinate_Operation,11133,7301,Idaho CS83 West zone,
+1631,Coordinate_Operation,11231,7301,Illinois CS83 East zone,
+1632,Coordinate_Operation,11232,7301,Illinois CS83 West zone,
+1633,Coordinate_Operation,11331,7301,Indiana CS83 East zone,
+1634,Coordinate_Operation,11332,7301,Indiana CS83 West zone,
+1635,Coordinate_Operation,11431,7301,Iowa CS83 North zone,
+1636,Coordinate_Operation,11432,7301,Iowa CS83 South zone,
+1637,Coordinate_Operation,11531,7301,Kansas CS83 North zone,
+1638,Coordinate_Operation,11532,7301,Kansas CS83 South zone,
+1640,Coordinate_Operation,11632,7301,Kentucky CS83 South zone,
+1641,Coordinate_Operation,11731,7301,Louisiana CS83 North zone,
+1642,Coordinate_Operation,11732,7301,Louisiana CS83 South zone,
+1643,Coordinate_Operation,11831,7301,Maine CS83 East zone,
+1644,Coordinate_Operation,11832,7301,Maine CS83 West zone,
+1645,Coordinate_Operation,11930,7301,Maryland CS83,
+1646,Coordinate_Operation,12031,7301,Massachusetts CS83 Mainland zone,
+1647,Coordinate_Operation,12032,7301,Massachusetts CS83 Island zone,
+1648,Coordinate_Operation,12141,7301,Michigan CS83 North zone,
+1649,Coordinate_Operation,12142,7301,Michigan CS83 Central zone,
+1650,Coordinate_Operation,12143,7301,Michigan CS83 South zone,
+1651,Coordinate_Operation,12231,7301,Minnesota CS83 North zone,
+1652,Coordinate_Operation,12232,7301,Minnesota CS83 Central zone,
+1653,Coordinate_Operation,12233,7301,Minnesota CS83 South zone,
+1654,Coordinate_Operation,12331,7301,Mississippi CS83 East zone,
+1655,Coordinate_Operation,12332,7301,Mississippi CS83 West zone,
+1656,Coordinate_Operation,12431,7301,Missouri CS83 East zone,
+1657,Coordinate_Operation,12433,7301,Missouri CS83 West zone,
+1658,Coordinate_Operation,12530,7301,Montana CS83,
+1659,Coordinate_Operation,12630,7301,Nebraska CS83,
+1660,Coordinate_Operation,12731,7301,Nevada CS83 East zone,
+1661,Coordinate_Operation,12732,7301,Nevada CS83 Central zone,
+1662,Coordinate_Operation,12733,7301,Nevada CS83 West zone,
+1663,Coordinate_Operation,12830,7301,New Hampshire CS83,
+1664,Coordinate_Operation,12930,7301,New Jersey CS83,
+1665,Coordinate_Operation,13031,7301,New Mexico CS83 East zone,
+1666,Coordinate_Operation,13032,7301,New Mexico CS83 Central zone,
+1667,Coordinate_Operation,13033,7301,New Mexico CS83 West zone,
+1668,Coordinate_Operation,13131,7301,New York CS83 East zone,
+1669,Coordinate_Operation,13132,7301,New York CS83 Central zone,
+1670,Coordinate_Operation,13133,7301,New York CS83 West zone,
+1671,Coordinate_Operation,13134,7301,New York CS83 Long Island zone,
+1672,Coordinate_Operation,13230,7301,North Carolina CS83,
+1673,Coordinate_Operation,13331,7301,North Dakota CS83 North zone,
+1674,Coordinate_Operation,13332,7301,North Dakota CS83 South zone,
+1675,Coordinate_Operation,13431,7301,Ohio CS83 North zone,
+1676,Coordinate_Operation,13432,7301,Ohio CS83 South zone,
+1677,Coordinate_Operation,13531,7301,Oklahoma CS83 North zone,
+1678,Coordinate_Operation,13532,7301,Oklahoma CS83 South zone,
+1679,Coordinate_Operation,13631,7301,Oregon CS83 North zone,
+1680,Coordinate_Operation,13632,7301,Oregon CS83 South zone,
+1681,Coordinate_Operation,13731,7301,Pennsylvania CS83 North zone,
+1682,Coordinate_Operation,13732,7301,Pennsylvania CS83 South zone,
+1683,Coordinate_Operation,13830,7301,Rhode Island CS83,
+1684,Coordinate_Operation,13930,7301,South Carolina CS83,
+1685,Coordinate_Operation,14031,7301,South Dakota CS83 North zone,
+1686,Coordinate_Operation,14032,7301,South Dakota CS83 South zone,
+1687,Coordinate_Operation,14130,7301,Tennessee CS83,
+1688,Coordinate_Operation,14231,7301,Texas CS83 North zone,
+1689,Coordinate_Operation,14232,7301,Texas CS83 North Central zone,
+1690,Coordinate_Operation,14233,7301,Texas CS83 Central zone,
+1691,Coordinate_Operation,14234,7301,Texas CS83 South Central zone,
+1692,Coordinate_Operation,14235,7301,Texas CS83 South zone,
+1693,Coordinate_Operation,14331,7301,Utah CS83 North zone,
+1694,Coordinate_Operation,14332,7301,Utah CS83 Central zone,
+1695,Coordinate_Operation,14333,7301,Utah CS83 South zone,
+1696,Coordinate_Operation,14430,7301,Vermont CS83,
+1697,Coordinate_Operation,14531,7301,Virginia CS83 North zone,
+1698,Coordinate_Operation,14532,7301,Virginia CS83 South zone,
+1699,Coordinate_Operation,14631,7301,Washington CS83 North zone,
+1700,Coordinate_Operation,14632,7301,Washington CS83 South zone,
+1701,Coordinate_Operation,14731,7301,West Virginia CS83 North zone,
+1702,Coordinate_Operation,14732,7301,West Virginia CS83 South zone,
+1703,Coordinate_Operation,14831,7301,Wisconsin CS83 North zone,
+1704,Coordinate_Operation,14832,7301,Wisconsin CS83 Central zone,
+1705,Coordinate_Operation,14833,7301,Wisconsin CS83 South zone,
+1706,Coordinate_Operation,14931,7301,Wyoming CS83 East zone,
+1707,Coordinate_Operation,14932,7301,Wyoming CS83 East Central zone,
+1708,Coordinate_Operation,14933,7301,Wyoming CS83 West Central zone,
+1709,Coordinate_Operation,14934,7301,Wyoming CS83 West zone,
+1710,Coordinate_Operation,15031,7301,Alaska CS83 zone 1,
+1711,Coordinate_Operation,15032,7301,Alaska CS83 zone 2,
+1712,Coordinate_Operation,15033,7301,Alaska CS83 zone 3,
+1713,Coordinate_Operation,15034,7301,Alaska CS83 zone 4,
+1714,Coordinate_Operation,15035,7301,Alaska CS83 zone 5,
+1715,Coordinate_Operation,15036,7301,Alaska CS83 zone 6,
+1716,Coordinate_Operation,15037,7301,Alaska CS83 zone 7,
+1717,Coordinate_Operation,15038,7301,Alaska CS83 zone 8,
+1718,Coordinate_Operation,15039,7301,Alaska CS83 zone 9,
+1719,Coordinate_Operation,15040,7301,Alaska CS83 zone 10,
+1720,Coordinate_Operation,15131,7301,Hawaii CS83 zone 1,
+1721,Coordinate_Operation,15132,7301,Hawaii CS83 zone 2,
+1722,Coordinate_Operation,15133,7301,Hawaii CS83 zone 3,
+1723,Coordinate_Operation,15134,7301,Hawaii CS83 zone 4,
+1724,Coordinate_Operation,15135,7301,Hawaii CS83 zone 5,
+1725,Coordinate_Operation,15230,7301,Puerto Rico & Virgin Islands CS83,
+1726,Coordinate_Operation,15303,7301,Kentucky CS83 North zone,
+1727,Coordinate_Operation,12432,7301,Missouri CS83 Central zone,
+1728,Coordinate_Operation,15303,7302,Kentucky North,
+1729,Coordinate_Operation,10532,7302,Colorado Central,
+1730,Coordinate Reference System,4282,7301,Congo 1960 Pointe Noire,
+1731,Coordinate Reference System,28232,7301,Congo 1960 Pointe Noire / UTM zone 32S,
+1732,Coordinate_Operation,1801,7301,Congo 1960 Pointe Noire to WGS 84 (2),
+1733,Coordinate_Operation,1802,7301,Congo 1960 Pointe Noire to WGS 84 (3),
+1734,Coordinate_Operation,1200,7301,Congo 1960 Pointe Noire to WGS 84 (1),
+1735,Coordinate_Operation,15914,7301,BLM zone 14N in feet,
+1736,Coordinate_Operation,15915,7301,BLM zone 15N in feet,
+1737,Coordinate_Operation,15916,7301,BLM zone 16N in feet,
+1738,Coordinate_Operation,15917,7301,BLM zone 17N in feet,
+1739,Coordinate Reference System,21149,7301,Genuk / UTM zone 49S,
+1740,Coordinate Reference System,2308,7301,Genuk / TM 109 SE,
+1741,Datum,5133,7302,AIOC95,
+1742,Coordinate Reference System,5705,7301,Kronshstadt,
+1743,Datum,6199,7301,New Egyptian,Old Egyptian is an alias for Egypt 1907 (code 6229).
+1744,Datum,6229,7301,Old Egyptian,New Egyptian is an alias for Egypt 1930 (code 6199).
+1745,Coordinate Reference System,4199,7301,New Egyptian,Old Egyptian is an alias for Egypt 1907 (code 4229).
+1746,Coordinate Reference System,4229,7301,Old Egyptian,New Egyptian is an alias for Egypt 1930 (code 4199).
+1747,Coordinate_Operation,1516,7301,PSAD56 to WGS 84,
+1748,Coordinate_Operation,1813,7301,Genuk to WGS 84 (ONWJ),
+1749,Coordinate Reference System,32064,7301,NAD27 / UTM zone 14N (ftUS),Non-metric equivalent of NAD27 / UTM zone 14N (code 26714). UTM is a metric system so strictly this is not UTM.
+1750,Coordinate Reference System,32065,7301,NAD27 / UTM zone 15N (ftUS),Non-metric equivalent of NAD27 / UTM zone 15N (code 26715). UTM is a metric system so strictly this is not UTM.
+1751,Coordinate Reference System,32066,7301,NAD27 / UTM zone 16N (ftUS),Non-metric equivalent of NAD27 / UTM zone 16N (code 26716). UTM is a metric system so strictly this is not UTM.
+1752,Coordinate Reference System,32067,7301,NAD27 / UTM zone 17N (ftUS),Non-metric equivalent of NAD27 / UTM zone 17N (code 26717). UTM is a metric system so strictly this is not UTM.
+1754,Coordinate Reference System,2319,7301,ED50 / 3-degree Gauss-Kruger CM 27E,
+1755,Coordinate Reference System,2320,7301,ED50 / 3-degree Gauss-Kruger CM 30E,
+1756,Coordinate Reference System,2321,7301,ED50 / 3-degree Gauss-Kruger CM 33E,
+1757,Coordinate Reference System,2322,7301,ED50 / 3-degree Gauss-Kruger CM 36E,
+1758,Coordinate Reference System,2323,7301,ED50 / 3-degree Gauss-Kruger CM 39E,
+1759,Coordinate Reference System,2324,7301,ED50 / 3-degree Gauss-Kruger CM 42E,
+1760,Coordinate Reference System,2325,7301,ED50 / 3-degree Gauss-Kruger CM 45E,
+1761,Datum,6612,7302,JGD2000,
+1762,Datum,5137,7301,Huang Hai 1985,
+1763,Datum,5135,7302,HKPD,
+1765,Coordinate Reference System,5736,7301,Huang Hai 1956,
+1766,Coordinate Reference System,5738,7302,HKPD,
+1767,Coordinate Reference System,2343,7301,Xian 1980 / 6-degree Gauss-Kruger CM 105E,
+1768,Coordinate Reference System,2344,7301,Xian 1980 / 6-degree Gauss-Kruger CM 111E,
+1769,Coordinate Reference System,2338,7301,Xian 1980 / 6-degree Gauss-Kruger CM 75E,
+1770,Coordinate Reference System,2342,7301,Xian 1980 / 6-degree Gauss-Kruger CM 99E,
+1771,Coordinate Reference System,2348,7301,Xian 1980 / 6-degree Gauss-Kruger CM 135E,
+1772,Coordinate Reference System,2339,7301,Xian 1980 / 6-degree Gauss-Kruger CM 81E,
+1773,Coordinate Reference System,2340,7301,Xian 1980 / 6-degree Gauss-Kruger CM 87E,
+1774,Coordinate Reference System,2341,7301,Xian 1980 / 6-degree Gauss-Kruger CM 93E,
+1775,Coordinate Reference System,2345,7301,Xian 1980 / 6-degree Gauss-Kruger CM 117E,
+1776,Coordinate Reference System,2346,7301,Xian 1980 / 6-degree Gauss-Kruger CM 123E,
+1777,Coordinate Reference System,2347,7301,Xian 1980 / 6-degree Gauss-Kruger CM 129E,
+1778,Datum,6611,7302,HK80,
+1779,Datum,5135,7301,Ordnance Datum,This is the former name.
+1780,Datum,5136,7301,Admiralty Datum,This is the former name.
+1781,Coordinate Reference System,5737,7301,Huang Hai 1985,
+1782,Coordinate Reference System,2326,7302,HK 1980 Grid System,
+1783,Coordinate Reference System,4611,7302,HK1980,
+1784,Coordinate_Operation Parameter,8802,7301,Central Meridian,"Abbeviated as ""CM""."
+1785,Coordinate_Operation Parameter,8802,7302,CM,"Abbreviation for ""Central Meridian""."
+1786,Coordinate Reference System,2327,7301,Xian 1980 / 6-degree Gauss-Kruger zone 13,Part of the China National Coordinate System of 1980.
+1787,Coordinate Reference System,2328,7301,Xian 1980 / 6-degree Gauss-Kruger zone 14,Part of the China National Coordinate System of 1980.
+1788,Coordinate Reference System,2329,7301,Xian 1980 / 6-degree Gauss-Kruger zone 15,Part of the China National Coordinate System of 1980.
+1789,Coordinate Reference System,2330,7301,Xian 1980 / 6-degree Gauss-Kruger zone 16,Part of the China National Coordinate System of 1980.
+1790,Coordinate Reference System,2331,7301,Xian 1980 / 6-degree Gauss-Kruger zone 17,Part of the China National Coordinate System of 1980.
+1791,Coordinate Reference System,2332,7301,Xian 1980 / 6-degree Gauss-Kruger zone 18,Part of the China National Coordinate System of 1980.
+1792,Coordinate Reference System,2333,7301,Xian 1980 / 6-degree Gauss-Kruger zone 19,Part of the China National Coordinate System of 1980.
+1793,Coordinate Reference System,2334,7301,Xian 1980 / 6-degree Gauss-Kruger zone 20,Part of the China National Coordinate System of 1980.
+1794,Coordinate Reference System,2335,7301,Xian 1980 / 6-degree Gauss-Kruger zone 21,Part of the China National Coordinate System of 1980.
+1795,Coordinate Reference System,2336,7301,Xian 1980 / 6-degree Gauss-Kruger zone 22,Part of the China National Coordinate System of 1980.
+1796,Coordinate Reference System,2333,7301,Xian 1980 / 6-degree Gauss-Kruger zone 23,Part of the China National Coordinate System of 1980.
+1797,Coordinate Reference System,21413,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 13,
+1798,Coordinate Reference System,21414,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 14,
+1799,Coordinate Reference System,21415,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 15,
+1800,Coordinate Reference System,21416,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 16,
+1801,Coordinate Reference System,21417,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 17,
+1802,Coordinate Reference System,21418,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 18,
+1803,Coordinate Reference System,21419,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 19,
+1804,Coordinate Reference System,21420,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 20,
+1805,Coordinate Reference System,21421,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 21,
+1806,Coordinate Reference System,21422,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 22,
+1807,Coordinate Reference System,21423,7301,Beijing 1954 / 6-degree Gauss-Kruger zone 23,
+1808,Coordinate Reference System,21453,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 75E,
+1809,Coordinate Reference System,21454,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 81E,
+1810,Coordinate Reference System,21455,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 87E,
+1811,Coordinate Reference System,21456,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 93E,
+1812,Coordinate Reference System,21457,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 99E,
+1813,Coordinate Reference System,21458,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 105E,
+1814,Coordinate Reference System,21459,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 111E,
+1815,Coordinate Reference System,21460,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 117E,
+1816,Coordinate Reference System,21461,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 123E,
+1817,Coordinate Reference System,21462,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 129E,
+1818,Coordinate Reference System,21463,7301,Beijing 1954 / 6-degree Gauss-Kruger CM 135E,
+1819,Coordinate_Operation,5405,7302,HKPD to Hong Kong Chart,
+1820,Coordinate Reference System,2044,7301,Hanoi 1972 / 6-degree Gauss-Kruger zone 18,
+1821,Coordinate Reference System,2045,7301,Hanoi 1972 / 6-degree Gauss-Kruger zone 18,
+1822,Coordinate Reference System,2462,7301,Albanian 1987 / 6-degree Gauss-Kruger zone 4,
+1823,Coordinate Reference System,2397,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3,
+1824,Coordinate Reference System,2398,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 4,
+1825,Coordinate Reference System,2399,7301,Pulkovo 1942(83) / 3-degree Gauss-Kruger zone 3,
+1826,Coordinate Reference System,2395,7302,S Yemen / Gauss zone 8,
+1827,Coordinate Reference System,2396,7302,S Yemen / Gauss zone 9,
+1828,Coordinate Reference System,2396,7301,South Yemen / 6-degree Gauss-Kruger zone 9,
+1829,Coordinate Reference System,2395,7301,South Yemen / 6-degree Gauss-Kruger zone 8,
+1830,Coordinate_Operation,18031,7301,Gauss-Kruger zone 1,
+1831,Coordinate_Operation,18032,7301,Gauss-Kruger zone 2,
+1832,Coordinate_Operation,18033,7301,Gauss-Kruger zone 3,
+1833,Coordinate_Operation,18034,7301,Gauss-Kruger zone 4,
+1834,Coordinate_Operation,18035,7301,Gauss-Kruger zone 5,
+1835,Coordinate_Operation,18036,7301,Gauss-Kruger zone 6,
+1836,Coordinate_Operation,18037,7301,Gauss-Kruger zone 7,
+1837,Coordinate Reference System,22191,7301,Campo Inchauspe / Gauss-Kruger zone 1,
+1838,Coordinate Reference System,22192,7301,Campo Inchauspe / Gauss-Kruger zone 2,
+1839,Coordinate Reference System,22193,7301,Campo Inchauspe / Gauss-Kruger zone 3,
+1840,Coordinate Reference System,22194,7301,Campo Inchauspe / Gauss-Kruger zone 4,
+1841,Coordinate Reference System,22195,7301,Campo Inchauspe / Gauss-Kruger zone 5,
+1842,Coordinate Reference System,22196,7301,Campo Inchauspe / Gauss-Kruger zone 6,
+1843,Coordinate Reference System,22197,7301,Campo Inchauspe / Gauss-Kruger zone 7,
+1844,Coordinate Reference System,2081,7301,Chos Malal 1914 / Gauss-Kruger zone 2,
+1845,Coordinate Reference System,2082,7301,Pampa del Castillo / Gauss-Kruger zone 2,
+1846,Coordinate Reference System,2083,7301,Hito XVIII 1963 / Gauss-Kruger zone 2,
+1847,Coordinate Reference System,20004,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 4,
+1848,Coordinate Reference System,20005,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 5,
+1849,Coordinate Reference System,20006,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 6,
+1850,Coordinate Reference System,20007,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 7,
+1851,Coordinate Reference System,20008,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 8,
+1852,Coordinate Reference System,20009,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 9,
+1853,Coordinate Reference System,20010,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 10,
+1854,Coordinate Reference System,20011,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 11,
+1855,Coordinate Reference System,20012,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 12,
+1856,Coordinate Reference System,20013,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 13,
+1857,Coordinate Reference System,20014,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 14,
+1858,Coordinate Reference System,20015,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 15,
+1859,Coordinate Reference System,20016,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 16,
+1860,Coordinate Reference System,20017,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 17,
+1861,Coordinate Reference System,20018,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 18,
+1862,Coordinate Reference System,20019,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 19,
+1863,Coordinate Reference System,20020,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 20,
+1864,Coordinate Reference System,20021,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 21,
+1865,Coordinate Reference System,20022,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 22,
+1866,Coordinate Reference System,20023,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 23,
+1867,Coordinate Reference System,20024,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 24,
+1868,Coordinate Reference System,20025,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 25,
+1869,Coordinate Reference System,20026,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 26,
+1870,Coordinate Reference System,20027,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 27,
+1871,Coordinate Reference System,20028,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 28,
+1872,Coordinate Reference System,20029,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 29,
+1873,Coordinate Reference System,20030,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 30,
+1874,Coordinate Reference System,20031,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 31,
+1875,Coordinate Reference System,20032,7301,Pulkovo 1995 / 6-degree Gauss-Kruger zone 32,
+1876,Coordinate Reference System,28402,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 2,
+1877,Coordinate Reference System,28403,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 3,
+1878,Coordinate Reference System,28404,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 4,
+1879,Coordinate Reference System,28405,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 5,
+1880,Coordinate Reference System,28406,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 6,
+1881,Coordinate Reference System,28407,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 7,
+1882,Coordinate Reference System,28408,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 8,
+1883,Coordinate Reference System,28409,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 9,
+1884,Coordinate Reference System,28410,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 10,
+1885,Coordinate Reference System,28411,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 11,
+1886,Coordinate Reference System,28412,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 12,
+1887,Coordinate Reference System,28413,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 13,
+1888,Coordinate Reference System,28414,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 14,
+1889,Coordinate Reference System,28415,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 15,
+1890,Coordinate Reference System,28416,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 16,
+1891,Coordinate Reference System,28417,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 17,
+1892,Coordinate Reference System,28418,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 18,
+1893,Coordinate Reference System,28419,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 19,
+1894,Coordinate Reference System,28420,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 20,
+1895,Coordinate Reference System,28421,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 21,
+1896,Coordinate Reference System,28422,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 22,
+1897,Coordinate Reference System,28423,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 23,
+1898,Coordinate Reference System,28424,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 24,
+1899,Coordinate Reference System,28425,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 25,
+1900,Coordinate Reference System,28426,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 26,
+1901,Coordinate Reference System,28427,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 27,
+1902,Coordinate Reference System,28428,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 28,
+1903,Coordinate Reference System,28429,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 29,
+1904,Coordinate Reference System,28430,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 30,
+1905,Coordinate Reference System,28431,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 31,
+1906,Coordinate Reference System,28432,7301,Pulkovo 1942 / 6-degree Gauss-Kruger zone 32,
+1907,Coordinate Reference System,2463,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 21E,
+1908,Coordinate Reference System,2464,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 27E,
+1909,Coordinate Reference System,2465,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 33E,
+1910,Coordinate Reference System,2466,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 39E,
+1911,Coordinate Reference System,2467,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 45E,
+1912,Coordinate Reference System,2468,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 51E,
+1913,Coordinate Reference System,2469,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 57E,
+1914,Coordinate Reference System,2470,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 63E,
+1915,Coordinate Reference System,2471,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 69E,
+1916,Coordinate Reference System,2472,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 75E,
+1917,Coordinate Reference System,2473,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 81E,
+1918,Coordinate Reference System,2474,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 87E,
+1919,Coordinate Reference System,2475,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 93E,
+1920,Coordinate Reference System,2476,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 99E,
+1921,Coordinate Reference System,2477,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 105E,
+1922,Coordinate Reference System,2478,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 111E,
+1923,Coordinate Reference System,2479,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 117E,
+1924,Coordinate Reference System,2480,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 123E,
+1925,Coordinate Reference System,2481,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 129E,
+1926,Coordinate Reference System,2482,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 135E,
+1927,Coordinate Reference System,2483,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 141E,
+1928,Coordinate Reference System,2484,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 147E,
+1929,Coordinate Reference System,2485,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 153E,
+1930,Coordinate Reference System,2486,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 159E,
+1931,Coordinate Reference System,2487,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 165E,
+1932,Coordinate Reference System,2488,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 171E,
+1933,Coordinate Reference System,2489,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 177E,
+1934,Coordinate Reference System,2490,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 177W,
+1935,Coordinate Reference System,2491,7301,Pulkovo 1995 / 6-degree Gauss-Kruger CM 171W,
+1936,Coordinate Reference System,2492,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 9E,
+1937,Coordinate Reference System,2493,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 15E,
+1938,Coordinate Reference System,2494,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 21E,
+1939,Coordinate Reference System,2495,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 27E,
+1940,Coordinate Reference System,2496,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 33E,
+1941,Coordinate Reference System,2497,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 39E,
+1942,Coordinate Reference System,2498,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 45E,
+1943,Coordinate Reference System,2499,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 51E,
+1944,Coordinate Reference System,2500,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 57E,
+1945,Coordinate Reference System,2501,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 63E,
+1946,Coordinate Reference System,2502,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 69E,
+1947,Coordinate Reference System,2503,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 75E,
+1948,Coordinate Reference System,2504,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 81E,
+1949,Coordinate Reference System,2505,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 87E,
+1950,Coordinate Reference System,2506,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 93E,
+1951,Coordinate Reference System,2507,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 99E,
+1952,Coordinate Reference System,2508,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 105E,
+1953,Coordinate Reference System,2509,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 111E,
+1954,Coordinate Reference System,2510,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 117E,
+1955,Coordinate Reference System,2511,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 123E,
+1956,Coordinate Reference System,2512,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 129E,
+1957,Coordinate Reference System,2513,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 135E,
+1958,Coordinate Reference System,2514,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 141E,
+1959,Coordinate Reference System,2515,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 147E,
+1960,Coordinate Reference System,2516,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 153E,
+1961,Coordinate Reference System,2517,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 159E,
+1962,Coordinate Reference System,2518,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 165E,
+1963,Coordinate Reference System,2519,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 171E,
+1964,Coordinate Reference System,2520,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 177E,
+1965,Coordinate Reference System,2521,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 177W,
+1966,Coordinate Reference System,2522,7301,Pulkovo 1942 / 6-degree Gauss-Kruger CM 171W,
+1967,Unit of Measure,9115,7302,DM,
+1968,Unit of Measure,9115,7306,dega,
+1969,Coordinate_Operation,1833,7311,ID74 to DGN-95 (3),DGN-95 is a synonym in Indonesia for WGS 84.
+1970,Coordinate_Operation,1832,7311,ID74 to DGN-95 (2),DGN-95 is a synonym in Indonesia for WGS 84.
+1971,Coordinate_Operation,1248,7311,ID74 to DGN-95 (1),DGN-95 is a synonym in Indonesia for WGS 84.
+1972,Coordinate Reference System,2309,7311,DGN-95 / TM 116 SE,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1973,Coordinate Reference System,2310,7311,DGN-95 / TM 132 SE,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1974,Coordinate Reference System,32646,7311,DGN-95 / UTM zone 46N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1975,Coordinate Reference System,32647,7311,DGN-95 / UTM zone 47N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1976,Coordinate Reference System,32648,7311,DGN-95 / UTM zone 48N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1977,Coordinate Reference System,32649,7311,DGN-95 / UTM zone 49N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1978,Coordinate Reference System,32650,7311,DGN-95 / UTM zone 50N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1979,Coordinate Reference System,32651,7311,DGN-95 / UTM zone 51N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1980,Coordinate Reference System,32652,7311,DGN-95 / UTM zone 52N,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1981,Coordinate Reference System,32747,7311,DGN-95 / UTM zone 47S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1982,Coordinate Reference System,32748,7311,DGN-95 / UTM zone 48S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1983,Coordinate Reference System,32749,7311,DGN-95 / UTM zone 49S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1984,Coordinate Reference System,32750,7311,DGN-95 / UTM zone 50S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1985,Coordinate Reference System,32751,7311,DGN-95 / UTM zone 51S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1986,Coordinate Reference System,32752,7311,DGN-95 / UTM zone 52S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1987,Coordinate Reference System,32753,7311,DGN-95 / UTM zone 53S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1988,Coordinate Reference System,32754,7311,DGN-95 / UTM zone 54S,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1990,Coordinate Reference System,4326,7311,DGN-95,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1991,Coordinate Reference System,4327,7311,DGN-95 (geographic 3D),Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1992,Coordinate Reference System,4328,7311,DGN-95 (geocentric),Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1993,Datum,6326,7311,DGN-95,Datum Geodesi Nasional 1995 (DGN-95) is a synonym for WGS 84 in Indonesia.
+1994,Coordinate_Operation,1814,7301,Genuk to WGS 84 (3),
+1996,Datum,6820,7302,Segara (Jakarta),
+1997,Datum,6613,7302,Segara,
+1998,Datum,6613,7301,Samboja,Samboja-1 is one of two stations used as the baseline for extension to government triangulation by Total Indonesia in 1970-71.
+1999,Datum,6613,7301,P2 Exc,P2 Exc is one of two stations used as the baseline for extension to government triangulation by Total Indonesia in 1970-71. P2 Exc is a replacement satellite station to the destroyed station P2.
+2000,Datum,6613,7301,P2 Exc-T9,P2 Exc was a replacement satellite station to the destroyed station P2 from which several Toran stations including T9 were coordinated in 1970-71. When further control work was executed in 1995 P2 Exc was by then destroyed and T9 was used as its origin.
+2001,Coordinate Reference System,4613,7301,Samboja,Oil industry extension in the Mahakam delta region. Also known as P2 Exc and P2 Exc-T9.
+2002,Coordinate Reference System,4613,7301,P2 Exc-T9,Oil industry extension in the Mahakam delta region. Also known as P2 Exc and Samboja.
+2003,Coordinate Reference System,4613,7301,P2 Exc,Oil industry extension in the Mahakam delta region. Also known as P2 Exc-T9 and Samboja.
+2004,Coordinate_Operation,1838,7301,Samboja to WGS 84 (4),
+2005,Coordinate_Operation,1838,7301,P2 Exc-T9 to WGS 84 (4),
+2006,Datum,6614,7302,QND95,
+2008,Coordinate Reference System,2933,7301,Samboja / UTM zone 50S,
+2009,Coordinate Reference System,2933,7301,P2 Exc-T9 / UTM zone 50S,
+2010,Unit of Measure,9110,7301,sexagesimal degree,
+2011,Coordinate Reference System,2952,7301,NAD83(CSRS) / SCoPQ zone 10,
+2012,Coordinate Reference System,2945,7301,NAD83(CSRS) / SCoPQ zone 3,
+2013,Coordinate Reference System,2946,7301,NAD83(CSRS) / SCoPQ zone 4,
+2014,Coordinate Reference System,2947,7301,NAD83(CSRS) / SCoPQ zone 5,
+2015,Coordinate Reference System,2948,7301,NAD83(CSRS) / SCoPQ zone 6,
+2016,Coordinate Reference System,2949,7301,NAD83(CSRS) / SCoPQ zone 7,
+2017,Coordinate Reference System,2950,7301,NAD83(CSRS) / SCoPQ zone 8,
+2018,Coordinate Reference System,2951,7301,NAD83(CSRS) / SCoPQ zone 9,
+2019,Coordinate_Operation,18071,7301,Green Belt,
+2020,Coordinate Reference System,22991,7301,Egypt 1907 / Green Belt,
+2021,Coordinate_Operation Parameter,8806,7301,False westing,"This alias applies only in the case of projection methods which have an axis positive west, e.g. Transverse Mercator (South Orientated)."
+2022,Coordinate_Operation Parameter,8807,7301,False southing,"This alias applies only in the case of projection methods which have an axis positive south, e.g. Transverse Mercator (South Orientated)."
diff --git a/src/tiff/csv/area.csv b/src/tiff/csv/area.csv
new file mode 100644
index 0000000..3e0fe93
--- /dev/null
+++ b/src/tiff/csv/area.csv
@@ -0,0 +1,1751 @@
+"AREA_CODE","AREA_NAME","AREA_OF_USE","ISO_A2_CODE","ISO_A3_CODE","ISO_N_CODE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+1118,China - Hong Kong,China - Hong Kong special administrative region.,HK,HKG,344,"""Hong Kong"" in ISO 3166",EPSG,EPSG,2002-06-22 00:00:00,2002.16,0
+1119,Hungary,Hungary.,HU,HUN,348,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1120,Iceland,Iceland.,IS,ISL,352,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1121,India,India.,IN,IND,356,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1122,Indonesia,Indonesia.,ID,IDN,360,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1123,"Iran, Islamic Republic of",Islamic Republic of Iran,IR,IRN,364,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1124,Iraq,Iraq.,IQ,IRQ,368,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1125,Ireland,Ireland.,IE,IRL,372,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1126,Israel,Israel.,IL,ISR,376,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1127,Italy,Italy.,IT,ITA,380,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1128,Jamaica,Jamaica.,JM,JAM,388,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1129,Japan,Japan.,JP,JPN,392,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1130,Jordan,Jordan.,JO,JOR,400,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1131,Kazakstan,Kazakstan.,KZ,KAZ,398,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1132,Kenya,Kenya.,KE,KEN,404,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1133,Kiribati,Kiribati.,KI,KIR,296,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1134,"Korea, Democratic People's Republic of (North Korea)",Democratic People's Republic of Korea (North Korea).,KP,PRK,408,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1135,"Korea, Republic of (South Korea)",Republic of Korea (South Korea).,KR,KOR,410,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1136,Kuwait,Kuwait.,KW,KWT,414,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1137,Kyrgyzstan,Kyrgyzstan.,KG,KGZ,417,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1138,Lao People's Democratic Republic (Laos).,Lao People's Democratic Republic (Laos).,LA,LAO,418,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1139,Latvia,Latvia.,LV,LVA,428,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1140,Lebanon,Lebanon.,LB,LBN,422,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1141,Lesotho,Lesotho.,LS,LSO,426,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1142,Liberia,Liberia.,LR,LBR,430,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1143,Libyan Arab Jamahiriya,Libyan Arab Jamahiriya.,LY,LBY,434,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1144,Liechtenstein,Liechtenstein.,LI,LIE,438,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1145,Lithuania,Lithuania.,LT,LTU,440,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1146,Luxembourg,Luxembourg.,LU,LUX,442,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1147,China - Macau,China - Macau special administrative region.,MO,MAC,446,"""Macau"" in ISO 3166.",EPSG,EPSG,2002-06-22 00:00:00,2002.16,0
+1148,"Macedonia, The Former Yugoslav Republic of",The Former Yugoslav Republic of Macedonia.,MK,MKD,807,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1149,Madagascar,Madagascar.,MG,MDG,450,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1150,Malawi,Malawi.,MW,MWI,454,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1151,Malaysia,Malaysia.,MY,MYS,458,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1152,Maldives,Maldives.,MV,MDV,462,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1153,Mali,Mali.,ML,MLI,466,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1154,Malta,Malta.,MT,MLT,470,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1155,Marshall Islands,Marshall Islands.,MH,MHL,584,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1156,Martinique,Martinique.,MQ,MTQ,474,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1157,Mauritania,Mauritania.,MR,MRT,478,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1158,Mauritius,Mauritius.,MU,MUS,480,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1159,Mayotte,Mayotte.,YT,MYT,175,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1160,Mexico,Mexico.,MX,MEX,484,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1161,"Micronesia, Federated States of",Federated States of Micronesia.,FM,FSM,583,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1162,"Moldova, Republic of",Republic of Moldova,MD,MDA,498,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1163,Monaco,Monaco.,MC,MCO,492,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1164,Mongolia,Mongolia.,MN,MNG,496,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1165,Montserrat,Montserrat.,MS,MSR,500,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1166,Morocco,Morocco.,MA,MAR,504,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1167,Mozambique,Mozambique.,MZ,MOZ,508,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1168,Myanmar (Burma),Myanmar (Burma).,MM,MMR,104,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/isoISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1169,Namibia,Namibia.,NA,NAM,516,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1170,Nauru,Nauru.,NR,NRU,520,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1171,Nepal,Nepal.,NP,NPL,524,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1172,Netherlands,Netherlands.,NL,NLD,528,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1173,Netherlands Antilles,Netherlands Antilles.,AN,ANT,530,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1174,New Caledonia,New Caledonia.,NC,NCL,540,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1175,New Zealand,New Zealand.,NZ,NZL,554,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1176,Nicaragua,Nicaragua.,NI,NIC,558,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1177,Niger,Niger.,NE,NER,562,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1178,Nigeria,Nigeria.,NG,NGA,566,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1179,Niue,Niue.,NU,NIU,570,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1180,Norfolk Island,Norfolk Island.,NF,NFK,574,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1181,Northern Mariana Islands,Northern Mariana Islands.,MP,MNP,580,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1182,Norway,Norway.,NO,NOR,578,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1183,Oman,Oman.,OM,OMN,512,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1184,Pakistan,Pakistan.,PK,PAK,586,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1185,Palau,Palau.,PW,PLW,585,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1186,Panama,Panama.,PA,PAN,591,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1187,Papua New Guinea (PNG),Papua New Guinea (PNG).,PG,PNG,598,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1188,Paraguay,Paraguay.,PY,PRY,600,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1189,Peru,Peru.,PE,PER,604,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1190,Philippines,Philippines.,PH,PHL,608,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1191,Pitcairn,Pitcairn.,PN,PCN,612,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1192,Poland,Poland.,PL,POL,616,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1193,Portugal,Portugal.,PT,PRT,620,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1194,Puerto Rico,Puerto Rico.,PR,PRI,630,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1195,Qatar,Qatar.,QA,QAT,634,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1196,Reunion,Reunion.,RE,REU,638,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1197,Romania,Romania.,RO,ROU,642,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1198,Russian Federation,Russian Federation.,RU,RUS,643,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1199,Rwanda,Rwanda.,RW,RWA,646,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1200,Saint Kitts and Nevis,Saint Kitts and Nevis.,KN,KNA,659,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1201,Saint Lucia,Saint Lucia.,LC,LCA,662,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1202,Saint Vincent and the Grenadines,Saint Vincent and the Grenadines.,VC,VCT,670,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1203,Samoa,Samoa.,WS,WSM,882,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1204,San Marino,San Marino.,SM,SMR,674,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1205,Sao Tome and Principe,Sao Tome and Principe.,ST,STP,678,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1206,Saudi Arabia,Saudi Arabia.,SA,SAU,682,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1207,Senegal,Senegal.,SN,SEN,686,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1208,Seychelles,Seychelles.,SC,SYC,690,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1209,Sierra Leone,Sierra Leone.,SL,SLE,694,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1210,Singapore,Singapore.,SG,SGP,702,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1211,Slovakia (Slovak Republic),Slovakia (Slovak Republic).,SK,SVK,703,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1212,Slovenia,Slovenia.,SI,SVN,705,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1213,Solomon Islands,Solomon Islands.,SB,SLB,90,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1214,Somalia,Somalia.,SO,SOM,706,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1215,South Africa,South Africa.,ZA,ZAF,710,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1216,South Georgia and the South Sandwich Islands,South Georgia and the South Sandwich Islands.,GS,SGS,239,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1217,Spain,Spain.,ES,ESP,724,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1218,Sri Lanka,Sri Lanka.,LK,LKA,144,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1219,Saint Helena,Saint Helena.,SH,SHN,654,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1220,Saint Pierre and Miquelon,Saint Pierre and Miquelon.,PM,SPM,666,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1221,Sudan,Sudan.,SD,SDN,736,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1222,Suriname,Suriname.,SR,SUR,740,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1223,Svalbard and Jan Mayen,Svalbard and Jan Mayen.,SJ,SJM,744,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1224,Swaziland,Swaziland.,SZ,SWZ,748,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1225,Sweden,Sweden.,SE,SWE,752,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1226,Switzerland,Switzerland.,CH,CHE,756,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1227,Syrian Arab Republic,Syrian Arab Republic.,SY,SYR,760,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1228,"Taiwan, Province of China","Taiwan, Province of China",TW,TWN,158,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1229,Tajikistan,Tajikistan.,TJ,TJK,762,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1230,"Tanzania, United Republic of",United Republic of Tanzania.,TZ,TZA,834,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1231,Thailand,Thailand.,TH,THA,764,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1232,Togo,Togo.,TG,TGO,768,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1233,Tokelau,Tokelau.,TK,TKL,772,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1234,Tonga,Tonga.,TO,TON,776,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1235,Trinidad and Tobago,Trinidad and Tobago.,TT,TTO,780,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1236,Tunisia,Tunisia.,TN,TUN,788,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1237,Turkey,Turkey.,TR,TUR,792,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1238,Turkmenistan,Turkmenistan.,TM,TKM,795,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1239,Turks and Caicos Islands,Turks and Caicos Islands.,TC,TCA,796,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1240,Tuvalu,Tuvalu.,TV,TUV,798,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1241,Uganda,Uganda.,UG,UGA,800,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1242,Ukraine,Ukraine.,UA,UKR,804,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1243,United Arab Emirates (UAE),United Arab Emirates (UAE).,AE,ARE,784,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1244,United Kingdom (UK),United Kingdom (UK).,GB,GBR,826,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1245,United States (USA),United States (USA).,US,USA,840,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1246,United States Minor Outlying Islands,United States Minor Outlying Islands,UM,UMI,581,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1247,Uruguay,Uruguay.,UY,URY,858,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1248,Uzbekistan,Uzbekistan.,UZ,UZB,860,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1249,Vanuatu,Vanuatu.,VU,VUT,548,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1250,Holy See (Vatican City State),Holy See (Vatican City State),VA,VAT,336,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1251,Venezuela,Venezuela.,VE,VEN,862,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1252,Vietnam,Vietnam.,VN,VNM,704,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1253,"Virgin Islands, British",British Virgin Islands.,VG,VGB,92,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1254,"Virgin Islands, US",US Virgin Islands.,VI,VIR,850,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1255,Wallis and Futuna,Wallis and Futuna.,WF,WLF,876,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1256,Western Sahara,Western Sahara.,EH,ESH,732,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1257,Yemen,Yemen.,YE,YEM,887,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1258,Yugoslavia,Yugoslavia.,YU,YUG,891,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1259,"Congo, The Democratic Republic of the Congo (Zaire)",The Democratic Republic of the Congo (Zaire).,CD,COD,180,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1260,Zambia,Zambia.,ZM,ZMB,894,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1261,Zimbabwe,Zimbabwe.,ZW,ZWE,716,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1262,World,World.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1263,Not specified,Not specified.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1264,UK - Great Britain onshore,United Kingdom (UK) - Great Britain - England  Scotland  Wales - onshore; Isle of Man.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1265,Argentina - Comodoro Rivadavia,Argentina - Comodoro Rivadavia area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1266,Venezuela - Puerto La Cruz,Venezuela - Puerto La Cruz area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1267,Venezuela - Barinas,Venezuela - Barinas area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1268,Venezuela - Falcon state,Venezuela - Falcon state.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1269,Venezuela - Pedregal area of Falcon state,Venezuela - Pedregal area of Falcon state.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1270,Venezuela - Maracaibo south,Venezuela - south Maracaibo area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1271,Africa - Ethiopia and Sudan,Ethiopia; Sudan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1272,Asia - Middle East - Kuwait and Saudi,Kuwait; Saudi Arabia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1273,Antigua,Antigua and Barbuda - Antigua.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1274,Brazil - Aratu,Brazil - coastal areas south of 2 deg 55 min South.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1275,Netherlands - onshore,Netherlands - onshore.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1276,"Africa - Botswana, Malawi, Zambia, Zimbabwe.",Botswana; Malawi; Zambia; Zimbabwe.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1277,"Africa - Kenya, Tanzania and Uganda",Kenya; Tanzania; Uganda.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1278,Antarctica - Australian sector,Antarctica - Australian sector.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1279,Australasia - Australia and PNG - AGD66,Australia - Australian Capital Territory (ACT); New South Wales (NSW); Northern Territory (NT); Tasmania; Victoria.  Papua New Guinea (PNG).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1280,Australia - Western Australia (WA),Australia - Western Australia (WA).,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1281,Australia - mainland,Australia - Australian Capital Territory (ACT); New South Wales (NSW); Northern Territories (NT); Queensland; South Australia (SA); Western Australia (WA); Victoria.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1282,Australia - Tasmania,Australia - Tasmania.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1283,Canada - Maritime Provinces,Canada - New Brunswick; Nova Scotia; Prince Edward Island.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1284,Europe - Soviet Union,Armenia;  Azerbaijan;  Belorus;  Estonia;  Georgia;  Kazakstan;  Kirgizstan;  Latvia;  Lithuania;  Moldavia;  Russian Federation;  Tadzhikistan;  Turkmenistan;  Ukraine;  Uzbekistan.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1285,Indonesia - Java,Indonesia - Java.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1286,Europe - Liechtenstein and Switzerland.,Liechtenstein; Switzerland.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1287,Indonesia - Banga & Belitung Islands.,Indonesia - Banga & Belitung Islands.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1288,Angola - Angola proper,Angola - Angola proper,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1289,Canada - CVD28,Canada - Alberta; British Columbia; Manitoba; New Brunswick; Nova Scotia; Ontario; Prince Edward Island; Quebec; Saskatchewan.,,,,,EPSG,EPSG,1996-12-12 00:00:00,,0
+1290,Africa - Botswana and South Africa.,Botswana; South Africa.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1291,Asia - Caspian Sea,Azerbaijan - offshore; Kazakstan - offshore;  Russian Federation - Caspian Sea;  Turkmenistan - offshore.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1292,Argentina - Neuquen province,Argentina - Neuquen province.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1024,Afghanistan,Afghanistan.,AF,AFG,4,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1025,Albania,Albania.,AL,ALB,8,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1026,Algeria,Algeria.,DZ,DZA,12,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1027,American Samoa,American Samoa.,AS,ASM,16,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1028,Andorra,Andorra.,AD,AND,20,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1029,Angola,Angola.,AO,AGO,24,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1030,Anguilla,Anguilla.,AI,AIA,660,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1031,Antarctica,Antarctica.,AQ,ATA,10,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1032,Antigua and Barbuda,Antigua and Barbuda.,AG,ATG,28,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1033,Argentina,Argentina.,AR,ARG,32,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1034,Armenia,Armenia.,AM,ARM,51,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1035,Aruba,Aruba.,AW,ABW,533,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1036,Australia,Australia.,AU,AUS,36,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1037,Austria,Austria.,AT,AUT,40,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1038,Azerbaijan,Azerbaijan.,AZ,AZE,31,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1039,Bahamas,Bahamas.,BS,BHS,44,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1040,Bahrain,Bahrain.,BH,BHR,48,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1041,Bangladesh,Bangladesh.,BD,BGD,50,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1042,Barbados,Barbados.,BB,BRB,52,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1043,Belarus,Belarus.,BY,BLR,112,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1044,Belgium,Belgium.,BE,BEL,56,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1045,Belize,Belize.,BZ,BLZ,84,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1046,Benin,Benin.,BJ,BEN,204,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1047,Bermuda,Bermuda.,BM,BMU,60,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1048,Bhutan,Bhutan.,BT,BTN,64,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1049,Bolivia,Bolivia.,BO,BOL,68,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1050,Bosnia and Herzegowina,Bosnia and Herzegowina.,BA,BIH,70,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1051,Botswana,Botswana.,BW,BWA,72,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1052,Bouvet Island,Bouvet Island.,BV,BVT,74,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1053,Brazil,Brazil.,BR,BRA,76,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1054,British Indian Ocean Territory,British Indian Ocean Territory.,IO,IOT,86,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1055,Brunei Darussalam,Brunei Darussalam.,BN,BRN,96,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1056,Bulgaria,Bulgaria.,BG,BGR,100,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1057,Burkina Faso,Burkina Faso.,BF,BFA,854,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1058,Burundi,Burundi.,BI,BDI,108,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1059,Cambodia,Cambodia.,KH,KHM,116,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1060,Cameroon,Cameroon.,CM,CMR,120,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1061,Canada,Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; Northwest Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon.,CA,CAN,124,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1062,Cape Verde,Cape Verde.,CV,CPV,132,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1063,Cayman Islands,Cayman Islands.,KY,CYM,136,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1064,Central African Republic,Central African Republic.,CF,CAF,140,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1065,Chad,Chad.,TD,TCD,148,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1066,Chile,Chile.,CL,CHL,152,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1067,China,China.,CN,CHN,156,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1068,Christmas Island,Christmas Island.,CX,CXR,162,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1069,Cocos (Keeling) Islands,Cocos (Keeling) Islands.,CC,CCK,166,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1070,Colombia,Colombia.,CO,COL,170,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1071,Comoros,Comoros.,KM,COM,174,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1072,Congo,Congo.,CG,COG,178,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1073,Cook Islands,Cook Islands.,CK,COK,184,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1074,Costa Rica,Costa Rica.,CR,CRI,188,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1075,Cote d'Ivoire (Ivory Coast),C�te d'Ivoire (Ivory Coast).,CI,CIV,384,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1076,Croatia,Croatia.,HR,HRV,191,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1077,Cuba,Cuba.,CU,CUB,192,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1078,Cyprus,Cyprus.,CY,CYP,196,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1079,Czech Republic,Czech Republic.,CZ,CZE,203,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1080,Denmark,Denmark.,DK,DNK,208,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1081,Djibouti,Djibouti.,DJ,DJI,262,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1082,Dominica,Dominica.,DM,DMA,212,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1083,Dominican Republic,Dominican Republic.,DO,DOM,214,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1084,East Timor,East Timor.,TP,TMP,626,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1085,Ecuador,Ecuador.,EC,ECU,218,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1086,Egypt,Egypt.,EG,EGY,818,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1087,El Salvador,El Salvador.,SV,SLV,222,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1088,Equatorial Guinea,Equatorial Guinea.,GQ,GNQ,226,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1089,Eritrea,Eritrea.,ER,ERI,232,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1090,Estonia,Estonia.,EE,EST,233,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1091,Ethiopia,Ethiopia.,ET,ETH,231,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1092,Falkland Islands (Malvinas),Falkland Islands (Malvinas).,FK,FLK,238,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1093,Faroe Islands,Faroe Islands.,FO,FRO,234,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1094,Fiji,Fiji.,FJ,FJI,242,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1095,Finland,Finland.,FI,FIN,246,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1096,France,France.,FR,FRA,250,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1097,French Guiana,French Guiana.,GF,GUF,254,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1098,French Polynesia,French Polynesia.,PF,PYF,258,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1099,French Southern Territories,French Southern Territories.,TF,ATF,260,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1100,Gabon,Gabon.,GA,GAB,266,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1101,Gambia,Gambia.,GM,GMB,270,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1102,Georgia,Georgia.,GE,GEO,268,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1103,Germany,Germany.,DE,DEU,276,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1104,Ghana,Ghana.,GH,GHA,288,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1105,Gibraltar,Gibraltar.,GI,GIB,292,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1106,Greece,Greece.,GR,GRC,300,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1107,Greenland,Greenland.,GL,GRL,304,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1108,Grenada,Grenada.,GD,GRD,308,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1109,Guadeloupe,Guadeloupe.,GP,GLP,312,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1110,Guam,Guam.,GU,GUM,316,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1111,Guatemala,Guatemala.,GT,GTM,320,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1112,Guinea,Guinea.,GN,GIN,324,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1113,Guinea-Bissau,Guinea-Bissau.,GW,GNB,624,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1114,Guyana,Guyana.,GY,GUY,328,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1115,Haiti,Haiti.,HT,HTI,332,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1116,Heard Island and McDonald Islands,Heard Island and McDonald Islands.,HM,HMD,334,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1117,Honduras,Honduras.,HN,HND,340,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,2002.341,0
+1293,Brazil - Corrego Alegre,Brazil - NE coastal area between 45 deg W and 40 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1294,Portugal - onshore,Portugal - onshore.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1295,Germany - DHDN,"Germany - onshore - Baden-Wurtemberg, Bayern, Hessen, Niedersachsen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland, Schleswig-Holstein. Also former DDR states of Sachsen and Thuringen by transformation.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1296,Europe - ED50,Europe - west - Denmark; Faroe Islands; France offshore; Italy; Ireland offshore; Netherlands offshore; Germany offshore; Greece (offshore); North Sea; Norway; Spain; Turkey; United Kingdom UKCS offshore. Egypt - Western Desert.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1297,Europe - ED87,Europe - west.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1298,Europe - ETRS89,Europe: Austria; Belgium; Bosnia and Herzegovina; Croatia; Czech Republic; Denmark; Estonia; Finland; France; Germany; Hungary; Italy; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; Norway; Poland; Portugal; Romania; Slovakia; Slovenia; Spain; Sweden; Switzerland; United Kingdom (UK).,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1299,Europe - EVRF2000,Europe: Austria; Belgium; Bosnia and Herzegovina; Croatia; Czech Republic; Denmark; Estonia; Finland; France; Germany; Hungary; Italy; Latvia; Liechtenstein; Lithuania; Luxembourg; Netherlands; Norway; Poland; Portugal; Romania; Slovakia; Slovenia; Spain; Sweden; Switzerland; United Kingdom (UK).,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1300,Iran - FD58,Islamic Republic of Iran - Gulf coast and Arwaz areas.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1301,Portugal - central Azores,"Portugal - central Azores - Graciosa, Terceira, Sao Jorge, Pico, Faial.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1302,Asia - Cambodia and Vietnam,Cambodia; Vietnam.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1303,South America - Tierra del Fuego.,Argentina and Chile - Tierra del Fuego.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1304,Asia - Myanmar and Thailand,Myanmar (Burma); Thailand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1305,Europe - Ireland (Republic and Ulster),Ireland. United Kingdom (UK) - Northern Ireland (Ulster).,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1306,Europe - Czechoslovakia,Czech Republic; Slovakia.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1307,Asia - Bangladesh; India; Myanmur; Pakistan.,Bangladesh; India; Myanmar (Burma); Pakistan.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1308,Asia - Bangladesh; India; Pakistan.,Bangladesh; India; Pakistan.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1309,Asia - Malaysia (west) and Singapore.,Malaysia - West Malaysia; Singapore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1310,Kuwait - Kuwait City,Kuwait - Kuwait City.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1311,Venezuela - Cabinas,Venezuela - Cabinas area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1312,Venezuela - Lake Maracaibo,Venezuela - Lake Maracaibo area.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1313,Venezuela - Loma Quintana,Venezuela - north.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1314,Portugal - Madeira islands,"Portugal - Madeira, Porto Santo and Desertas islands.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1315,Mozambique - west.,Mozambique - west.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1316,Indonesia - Sulawesi SW,Indonesia - south west Sulawesi.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1317,Angola - Cabinda offshore,Angola - Cabinda offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1318,Angola - Cabinda,Angola - Cabinda,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1319,Venezuela - Maracaibo area,Venezuela - Maracaibo area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1320,Venezuela - Maturin,Venezuela - Maturin area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1321,Europe - MGI,"Austria. Bosnia and Herzegowina. Croatia. FYR Macedonia. Slovenia. Yugoslavia (Serbia, Montenegro).",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1322,Trinidad and Tobago - Tobago,Trinidad and Tobago - Tobago.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1323,USA - conus,United States (USA) - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas; Utah; Vermont; Virg [...]
+1324,USA (all states),United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas [...]
+1325,North America - all Canada and USA subunits,North America: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavet; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; [...]
+1326,France - mainland,France - mainland.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1327,France - Corsica,France - Corsica.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1328,Indonesia - Kalimantan E - Mahakam delta,Indonesia - east Kalimantan - Mahakam delta area.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1329,Mozambique - south,Mozambique - south.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1330,USA - Alaska,United States (USA) - Alaska,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1331,USA - Alaska - St. George Island,United States (USA) - Alaska - St. George Island.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+2040,WGS84 / UTM zone 21N,Between 60 and 54 deg West; northern hemisphere. Barbados. Brazil. Canada - Newfoundland; Quebec. French Guiana. Greenland. Guyana. St. Pierre and Miquelon. Suriname.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2041,WGS84 / UTM zone 21S,Between 60 and 54 deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2042,WGS84 / UTM zone 22N,Between 54 and 48 deg West; northern hemisphere. Brazil. Canada - Newfoundland. French Guiana. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2043,WGS84 / UTM zone 22S,Between 54 and 48 deg West; southern hemisphere. Brazil.  Uruguay.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2044,WGS84 / UTM zone 23N,Between 48 and 42 deg West; northern hemisphere. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2045,WGS84 / UTM zone 23S,Between 48 and 42 deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2046,WGS84 / UTM zone 24N,Between 42 and 36 deg West; northern hemisphere. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2047,WGS84 / UTM zone 24S,Between 42 and 36 deg West; southern hemisphere. Brazil. South Georgia and the South Sandwich Islands.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2048,WGS84 / UTM zone 25N,Between 36 and 30 deg West; northern hemisphere. Greenland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2049,WGS84 / UTM zone 25S,Between 36 and 30 deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2050,WGS84 / UTM zone 26N,Between 30 and 24 deg West; northern hemisphere. Greenland. Iceland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2051,WGS84 / UTM zone 26S,Between 30 and 24 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2052,WGS84 / UTM zone 27N,Between 24 and 18 deg West; northern hemisphere. Greenland. Iceland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2053,WGS84 / UTM zone 27S,Between 24 and 18 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2054,WGS84 / UTM zone 28N,Between 18 and 12 deg West; northern hemisphere. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2055,WGS84 / UTM zone 28S,Between 18 and 12 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2056,WGS84 / UTM zone 29N,Between 12 and 6 deg West; northern hemisphere. Algeria. Cote D'Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2057,WGS84 / UTM zone 29S,Between 12 and 6 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2058,WGS84 / UTM zone 30N,Between 6 deg West and 0 deg East; northern hemisphere. Algeria. Burkino Faso. Cote' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2059,WGS84 / UTM zone 30S,Between 6 deg West and 0 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2060,WGS84 / UTM zone 31N,Between 0 and 6 deg East; northern hemisphere. Algeria. Andorra. Benin. Bukino Faso. Denmark - North Sea. France. Germany - North Sea. Ghana. Luxembourg. Mali. Netherlands. Niger. Nigeria. Norway. Spain. Togo. United Kingdom (UK) - North Sea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2061,WGS84 / UTM zone 31S,Between 0 and 6 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2062,WGS84 / UTM zone 32N,Between 6 and 12 deg East; northern hemisphere. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard and Jan Mayen Islands. Sweden. Switzerland. Tunisia. Vatican City State.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2063,WGS84 / UTM zone 32S,Between 6 and 12 deg East; southern hemisphere. Angola. Congo. Gabon. Namibia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2064,WGS84 / UTM zone 33N,Between 12 and 18 deg East; northern hemisphere. Austria. Bosnia and Herzegowina. Cmeroon. Central African Republic. Chad. Congo. Croatia. Czech Republic. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria. Norway. Poland. San Marino. Slovakia. Slovenia. Svalbard and Jan Mayen Islands. Sweden.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2065,WGS84 / UTM zone 33S,Between 12 and 18 deg East; southern hemisphere. Angola. Congo. Democratic Republic of the Congo (Zaire). Gabon. Namibia. South Africa.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2066,WGS84 / UTM zone 34N,Between 18 and 24 deg East; northern hemisphere. Albania. Belarus. Bosnia and Herzegowina. Bulgaria. Central African Republic. Chad. Croatia. Democratic Republic of the Congo (Zaire). Estonia. Finland. FYR Macedonia. Greece. Hungary. Italy. Latvia. Libya. Lithuania. Norway. Poland. Romania. Russian Federation. Slovakia. Sudan. Svalbard. Sweden. Ukraine. Yugoslavia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2067,WGS84 / UTM zone 34S,Between 18 and 24 deg East; southern hemisphere. Angola. Botswana. Democratic Republic of the Congo (Zaire). Namibia. South Africa. Zambia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2068,WGS84 / UTM zone 35N,Between 24 and 30 deg East; northern hemisphere. Belarus. Bulgaria. Central African Republic. Democratic Republic of the Congo (Zaire). Egypt. Estonia. Finland. Greece. Latvia. Lesotho. Libya. Lithuania. Moldova. Norway. Romania. Russian Federation. Sudan. Svalbard. Turkey. Uganda. Ukraine.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2069,WGS84 / UTM zone 35S,Between 24 and 30 deg East; southern hemisphere. Botswana. Burundi. Democratic Republic of the Congo (Zaire). Rwanda. South Africa. Tanzania. Uganda. Zambia. Zimbabwe.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2070,WGS84 / UTM zone 36N,Between 30 and 36 deg East; northern hemisphere. Belarus. Cyprus. Egypt. Ethiopia. Finland. Israel. Jordan. Kenya. Lebanon. Norway. Russian Federation. Saudi Arabia. Sudan. Syria. Turkey. Uganda. Ukraine.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2071,WGS84 / UTM zone 36S,Between 30 and 36 deg East; southern hemisphere. Burundi. Kenya. Malawi. Mozambique. Rwanda. South Africa. Swaziland. Tanzania. Uganda. Zambia. Zimbabwe.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2072,WGS84 / UTM zone 37N,Between 36 and 42 deg East; northern hemisphere. Djibouti. Egypt. Eritrea. Ethiopia. Georgia. Iraq. Jordan. Kenya. Lebanon. Russian Federation. Saudi Arabia. Somalia. Sudan. Syria. Turkey. Ukraine.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2073,WGS84 / UTM zone 37S,Between 36 and 42 deg East; southern hemisphere. Kenya. Mozambique. Tanzania.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2074,WGS84 / UTM zone 38N,Between 42 and 48 deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Islamic Republic of Iran. Iraq. Kazakstan. Kuwait. Russian Federation. Saudi Arabia. Somalia. Turkey. Yemen.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2075,WGS84 / UTM zone 38S,Between 42 and 48 deg East; southern hemisphere. Madagascar.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2076,WGS84 / UTM zone 39N,Between 48 and 54 deg East; northern hemisphere. Azerbaijan. Bahrain. Islamic Republic of Iran. Kazakstan. Kuwait. Oman. Qatar. Russian Federation. Saudi Arabia. Somalia. Turkmenistan. United Arab Emirates. Yemen.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2077,WGS84 / UTM zone 39S,Between 48 and 54 deg East; southern hemisphere. Madagascar.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2078,WGS84 / UTM zone 40N,Between 54 and 60 deg East; northern hemisphere. Islamic Republic of Iran. Kazakstan. Oman. Russian Federation. Saudi Arabia. Turkmenistan. United Arab Emirates. Uzbekistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2079,WGS84 / UTM zone 40S,Between 54 and 60 deg East; southern hemisphere. Seychelles.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2080,WGS84 / UTM zone 41N,Between 60 and 66 deg East; northern hemisphere. Afghanistan. Islamic Republic of Iran. Kazakstan. Pakistan. Russian Federation. Turkmenistan.  Uzbekistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2081,WGS84 / UTM zone 41S,Between 60 and 66 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2082,WGS84 / UTM zone 42N,Between 66 and 72 deg East; northern hemisphere. Afghanistan. India. Kazakstan. Kyrgyzstan. Pakistan. Russian Federation. Tajikistan. Uzbekistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2083,WGS84 / UTM zone 42S,Between 66 and 72 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2084,WGS84 / UTM zone 43N,Between 72 and 78 deg East; northern hemisphere. China. India. Kazakstan. Kyrgyzstan. Maldives. Pakistan. Russian Federation. Tajikistan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2085,WGS84 / UTM zone 43S,Between 72 and 78 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1332,USA - Alaska - St. Lawrence Island,United States (USA) - Alaska - St. Lawrence Island.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1333,USA - Alaska - St. Paul Island,United States (USA) - Alaska - St. Paul Island.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1334,USA - Hawaii,United States (USA) - Hawaii.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1335,Caribbean - Puerto Rico and the Virgin Islands,Puerto Rico; Virgin Islands (British); Virgin Islands (US).,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1336,Canada - CSRS98,Canada - Alberta; New Brunswick; Saskatchewan; Prince Edward Island; and Quebec.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1
+1337,USA and American Samoa HARN,American Samoa. United States (USA) - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Dakota; Ohio; Oklahoma; Oregon; Rhode Island; South Dakota; Tennessee; Texas; Utah; Vermont; Virginia;  [...]
+1338,Iran - Taheri refinery,Islamic Republic of Iran - Taheri refinery site only.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1339,Trinidad and Tobago - Trinidad,Trinidad and Tobago - Trinidad.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1340,Yemen - South Yemen,Yemen - South Yemen.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1341,South America - all countries,"South America - Argentina, Brazil, Bolivia, Chile, Colombia, Ecuador, French Guiana, Guyana, Paraguay, Peru, Suriname, Uruguay, Venezuela.",,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1342,Sierra Leone - Freetown Peninsula,Sierra Leone - Freetown Peninsula.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1343,Germany - east Germany all states,Germany - states of former East Germany (DDR) - Brandenburg; Mecklenburg-Vorpommern; Sachsen; Sachsen-Anhalt; Thuringen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1344,Portugal - western Azores,"Portugal - western Azores - Flores, Corvo.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1345,Portugal - eastern Azores,"Portugal - eastern Azores - Sao Miguel, Santa Maria.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1346,Qatar - onshore,Qatar - onshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1347,Belgium - onshore,Belgium - onshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1348,South America - PSAD56,Bolivia; Ecuador; Peru; [Venezuela].,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1349,North America - NAD27,North and central America: Antigua and Barbuda. Belize. Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kans [...]
+1350,North America - NAD83,North America: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavet; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. Greenland. Mexico. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississ [...]
+1351,Asia - Middle East - Nahrwan,Arabian Gulf; Kuwait; Qatar - offshore; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1352,Norway - onshore,Norway - onshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1353,France - onshore,France - onshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1354,Europe - British Isles - UK and Ireland,Ireland - onshore.  United Kingdom (UK) - onshore - England; Scotland; Wales; Northern Ireland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1355,Indonesia - Sumatra,Indonesia - Sumatra.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1356,"Asia - Middle East - Israel, Jordan and Palestine Territory",Israel; Jordan; Palestine Territory.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.34,0
+1357,Europe - Pulkovo,Armenia; Azerbaijan; Belarus; Estonia; Georgia; Kazakstan; Kirgistan; Latvia; Lithuania; Moldova; Russian Federation; Tadzhikstan; Turkmenistan; Ukraine; Uzbekistan; Germany (former DDR); Czech Republic; Slovakia; Hungary; Poland; Romania; Latvia; Lithuania; Estonia; Albania.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1358,South America - SAD69,South America - Brazil.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1359,Indonesia - Kalimantan SE,Indonesia - southeast Kalimantan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1360,Indonesia - Kalimantan E,Indonesia - east Kalimantan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1361,Sudan - south,Sudan - south.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1362,Asia - Brunei and East Malaysia,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1363,UAE - Abu Dhabi and Dubai,United Arab Emirates (UAE) - Abu Dhabi; Dubai.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1364,Asia - Japan and Korea,Japan; North Korea; South Korea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1365,Algeria - N of 32 deg N,Algeria - north of 32 deg North.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1366,"Africa - Algeria, Morocco and Tunisia",Algeria; Morocco; Tunisia.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1367,Canada - Ontario,Canada - Ontario.,,,,,EPSG,EPSG,1999-05-12 00:00:00,,0
+1368,Canada - Quebec,Canada - Quebec.,,,,,EPSG,EPSG,1999-10-22 00:00:00,,0
+1369,France - Alsace,France - Alsace.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1370,Venezuela - Deltana,Venezuela - Deltana area.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1371,Venezuela - Guarico state,Venezuela - Guarico state.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1372,USA - Alabama,United States (USA) - Alabama.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1373,USA - Arizona,United States (USA) - Arizona.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1374,USA - Arkansas,United States (USA) - Arkansas.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1375,USA - California,United States (USA) - California.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1376,USA - Colorado,United States (USA) - Colorado.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1377,USA - Connecticut,United States (USA) - Connecticut - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1378,USA - Delaware,United States (USA) - Delaware - counties of Kent; New Castle; Sussex.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1379,USA - Florida,United States (USA) - Florida.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1380,USA - Georgia,United States (USA) - Georgia.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1381,USA - Idaho,United States (USA) - Idaho.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1382,USA - Illinois,United States (USA) - Illinois.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1383,USA - Indiana,United States (USA) - Indiana.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1384,USA - Iowa,United States (USA) - Iowa.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1385,USA - Kansas,United States (USA) - Kansas.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1386,USA - Kentucky,United States (USA) - Kentucky.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1387,USA - Louisiana,United States (USA) - Louisiana.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1388,USA - Maine,United States (USA) - Maine.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1389,USA - Maryland,United States (USA) - Maryland - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Washington; Wicomico; Worcester.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1390,USA - Massachusetts,United States (USA) - Massachusetts.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1391,USA - Michigan,United States (USA) - Michigan.,,,,,EPSG,EPSG,1996-12-12 00:00:00,,0
+1392,USA - Minnesota,United States (USA) - Minnesota.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1393,USA - Mississippi,United States (USA) - Mississippi.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1394,USA - Missouri,United States (USA) - Missouri.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1395,USA - Montana,United States (USA) - Montana - counties of Beaverhead; Big Horn; Blaine; Broadwater; Carbon; Carter; Cascade; Chouteau; Custer; Daniels; Dawson; Deer Lodge; Fallon; Fergus; Flathead; Gallatin; Garfield; Glacier; Golden Valley; Granite; Hill; Jefferson; Judith Basin; Lake; Lewis and Clark; Liberty; Lincoln; Madison; McCone; Meagher; Mineral; Missoula; Musselshell; Park; Petroleum; Phillips; Pondera; Powder River; Powell; Prairie; Ravalli; Richland; Roosevelt; Rosebud;  [...]
+1396,USA - Nebraska,United States (USA) - Nebraska - counties of Adams; Antelope; Arthur; Banner; Blaine; Boone; Box Butte; Boyd; Brown; Buffalo; Burt; Butler; Cass; Cedar; Chase; Cherry; Cheyenne; Clay; Colfax; Cuming; Custer; Dakota; Dawes; Dawson; Deuel; Dixon; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Garfield; Gosper; Grant; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Holt; Hooker; Howard; Jefferson; Johnson; Kearney; Keith; Keya Paha; Kimball [...]
+1397,USA - Nevada,United States (USA) - Nevada.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1398,USA - New Hampshire,United States (USA) - New Hampshire - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1399,USA - New Jersey,United States (USA) - New Jersey - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1400,USA - New Mexico,United States (USA) - New Mexico.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1401,USA - New York,United States (USA) - New York.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1402,USA - North Carolina,United States (USA) - North Carolina - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleveland; Columbus; Craven; Cumberland; Currituck; Dare; Davidson; Davie; Duplin; Durham; Edgecombe; Forsyth; Franklin; Gaston; Gates; Graham; Granville; Greene; Guilford; Halifax; Harnett; Haywood; Henderson; Hertford; [...]
+1403,USA - North Dakota,United States (USA) - North Dakota.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1404,USA - Ohio,United States (USA) - Ohio.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1405,USA - Oklahoma,United States (USA) - Oklahoma.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1406,USA - Oregon,United States (USA) - Oregon.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1407,USA - Pennsylvania,United States (USA) - Pennsylvania.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1408,USA - Rhode Island,United States (USA) - Rhode Island - counties of Bristol; Kent; Newport; Providence; Washington.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1409,USA - South Carolina,United States (USA) - South Carolina - counties of Abbeville; Aiken; Allendale; Anderson; Bamberg; Barnwell; Beaufort; Berkeley; Calhoun; Charleston; Cherokee; Chester; Chesterfield; Clarendon; Colleton; Darlington; Dillon; Dorchester; Edgefield; Fairfield; Florence; Georgetown; Greenville; Greenwood; Hampton; Horry; Jasper; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Orangeburg; Pickens; Richland; Saluda; Spartanb [...]
+1410,USA - South Dakota,United States (USA) - South Dakota.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1411,USA - Tennessee,United States (USA) - Tennessee - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; Fayette; Fentress; Franklin; Gibson; Giles; Grainger; Greene; Grundy; Hamblen; Hamilton; Hancock; Hardeman; Hardin; Hawkins; Haywood; Henderson; Henry; Hickman; Houston; Humphreys; Jackson; Jefferson; Johnson; Knox; Lake; [...]
+1412,USA - Texas,United States (USA) - Texas.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1413,USA - Utah,United States (USA) - Utah.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1414,USA - Vermont,United States (USA) - Vermont - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1415,USA - Virginia,United States (USA) - Virginia.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1416,USA - Washington,United States (USA) - Washington.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1417,USA - West Virginia,United States (USA) - West Virginia.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1418,USA - Wisconsin,United States (USA) - Wisconsin.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1419,USA - Wyoming,United States (USA) - Wyoming.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+1420,Canada - Quebec - E of 57 deg W,Canada - Quebec - east of 57 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1421,Canada - Quebec - 60 to 57 deg W.,Canada - Quebec between 60 and 57 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1422,Canada - Quebec - 63 to 60 deg W,Canada - Quebec between 63 and 60 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1423,Canada - Quebec - 66 to 63 deg W,Canada - Quebec between 66 and 63 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1424,Canada - Quebec - 69 to 66 deg W,Canada - Quebec between 69 and  66 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1425,Canada - Quebec - 72 to 69 deg W,Canada - Quebec between 72 and 69 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1426,Canada - Quebec - 75 to 72 deg W,Canada - Quebec between 75 and 72 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1427,Canada - Quebec - 78 to 75 deg W,Canada - Quebec between 78 and 75 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1428,Canada - Quebec - W of 78 deg W,Canada - Quebec west of 78 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1429,Canada - Ontario - E of 75 deg W,Canada - Ontario - east of 75 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1430,Canada - Ontario - 78 to 75 deg W,Canada - Ontario - between 78 and 75 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1431,Canada - Ontario - MTM zone 10,Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1432,Canada - Ontario - MTM zone 11,Canada - Ontario - south of 46 deg N and west of 81 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1433,Canada - Ontario - MTM zone 12,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1434,Canada - Ontario - MTM zone 13,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1435,Canada - Ontario - 88.5 to 85.5 deg W,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1436,Canada - Ontario - 91.5 to 88.5 deg W,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1437,Canada - Ontario - 94.5 to 91.5 deg W,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1438,Canada - Ontario - W of 94.5 deg W,Canada - Ontario - west of 94 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1439,Canada - Ontario - 96 to 90 deg W,Canada - Ontario - between 96 and 90 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1440,Canada - Ontario - 90 to 84 deg W,Canada - Ontario - between 90 and 84 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1441,Canada - Ontario - 84 to 78 deg W,Canada - Ontario - between 84 and 78 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1442,Canada - Ontario - E of 78 deg W,Canada - Ontario - east of 78 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1443,Canada - Quebec - 78 to 72 deg W,Canada - Quebec - between 78 and 72 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1444,Canada - Quebec - 72 to 66 deg W,Canada - Quebec - between 72 and 66 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1445,Canada - Quebec - 66 to 60 deg W,Canada - Quebec - between 66 and 60 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1446,Canada - Quebec - E of 60 deg W,Canada - Quebec - east of 60 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1447,Canada - New Brunswick,Canada - New Brunswick.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1448,Canada - 72 to 66 deg W,Canada - New Brunswick west of 66 deg West; Quebec between 72 and 66 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1449,Canada - 66 to 60 deg W,Canada - New Brunswick east of 66 deg West; Nova Scotia; Prince Edward Island; Quebec between 66 and 60 deg West.,,,,,EPSG,EPSG,2002-07-13 00:00:00,2002.41,0
+1450,Cote d'Ivoire (Ivory Coast) - E of 6 deg W,C�te d'Ivoire (Ivory Coast) east of 6 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1451,Cote d'Ivoire (Ivory Coast) - W of 6 deg W,C�te d'Ivoire (Ivory Coast) west of 6 deg West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1452,Vietnam - W of 108 deg E,Vietnam - west of 108 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1453,Vietnam - E of 108 deg E,Vietnam - east of 108 deg East.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1454,South Africa - Walvis Bay,South Africa - Walvis Bay.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1455,South Africa - W of 18 deg E,South Africa - west of 18 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1456,South Africa - 18 to 20 deg E,South Africa - between 18 and 20 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1457,South Africa - 20 to 22 deg E,South Africa - between 20 and 22 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1458,South Africa - 22 to 24 deg E,South Africa - between 22 and 24 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1459,South Africa - 24 to 26 deg E,Lesotho  - west of 26 deg East. South Africa - between 24 and 26 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1460,South Africa - 26 to 28 deg E,Lesotho  - east of 26 deg East.  South Africa - between 26 and 28 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1461,South Africa - 28 to 30 deg E,South Africa - between 28 and 30 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1462,South Africa - 30 to 32 deg E,South Africa - between 30 and 32 deg East.  Swaziland.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1463,South Africa - E of 32 deg E,South Africa - east of 32 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1464,Iran - W of 48 deg E,Islamic Republic of Iran - west of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1465,Iran - 48 to 54 deg E,Islamic Republic of Iran - between 48 and 54 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1466,Iran - 54 to 60 deg E,Islamic Republic of Iran - between 54 and 60 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1467,Iran - E of 60 deg E,Islamic Republic of Iran - east of 60 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1468,Guinea - W of 12 deg W,Guinea - west of 12 deg West.,,,,,EPSG,EPSG,1999-12-09 00:00:00,,0
+1469,Guinea - E of 12 deg W,Guinea - east of 12 deg West.,,,,,EPSG,EPSG,1999-12-09 00:00:00,,0
+1470,Libya - W of 10 degrees E,Libyan Arab Jamahiriya - west of 10 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1471,Libya - 10 to 12 degrees E,Libyan Arab Jamahiriya - between 10 and 12 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1472,Libya - 12 to 14 degrees E,Libyan Arab Jamahiriya - between 12 and 14 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1473,Libya - 14 to 16 degrees E,Libyan Arab Jamahiriya - between 14 and 16 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1474,Libya - 16 to 18 degrees E,Libyan Arab Jamahiriya - between 16 and 18 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1475,Libya - 18 to 20 degrees E,Libyan Arab Jamahiriya - between 18 and 20 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1476,Libya - 20 to 22 degrees E,Libyan Arab Jamahiriya - between 20 and 22 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1477,Libya - 22 to 24 degrees E,Libyan Arab Jamahiriya - between 22 and 24 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1478,Libya - E of 24 degrees E,Libyan Arab Jamahiriya - east of 24 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1479,Libya - W of 12 degrees E,Libyan Arab Jamahiriya - west of 12 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1480,Libya - 12 to 18 degrees E,Libyan Arab Jamahiriya - between 12 and 18 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1481,Libya - 18 to 24 degrees E,Libyan Arab Jamahiriya - between 18 and 24 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1482,Libya - W of 15 degrees E,Libyan Arab Jamahiriya - west of 15 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1483,Argentina - Neuquen province - 70.5 to 67.5 deg W,Argentina - Neuquen province between 70 deg 30 min and 67 deg 30 min West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1484,Argentina - Comodoro Rivadavia - W of 67.5 deg W,Argentina - Comodoro Rivadavia area west of 67 deg 30 min West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1485,Argentina - Tierra del Fuego - onshore W of 67.5 deg W,Argentina - Tierra del Fuego onshore west of 67 deg 30 min West.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1486,Argentina - Tierra del Fuego - offshore,Argentina - Tierra del Fuego offshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1487,Cuba - N of 21.5 deg N,Cuba - north of 21deg 30min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1488,Cuba - S of 21.5 deg N,Cuba - south of 21deg 30min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1489,Tunisia - offshore,Tunisia - offshore.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1490,Yemen - W of 48 deg E,Yemen - west of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1491,Yemen - E of 48 deg E,Yemen - east of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1492,Yemen - South Yemen - W of 48 deg E,Yemen - South Yemen west of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1493,Yemen - South Yemen - E of 48 deg E,Yemen - South Yemen east of 48 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1494,Vietnam - Meekong delta,Vietnam - Meekong delta.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1495,Vietnam - offshore Nam Con Son basin,Vietnam - offshore Nam Con Son basin.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1496,South Korea - E of 128 deg E,Republic of Korea (South Korea) - east of 128 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1497,South Korea - 126 to 128 deg E.,Republic of Korea (South Korea) - between 126 and 128 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1498,South Korea - W of 126 deg E,Republic of Korea (South Korea) - west of 126 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1499,Venezuela - Maracaibo - blocks I II and III..,"Venezuela - Maracaibo area offshore blocks I, II and III.",,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+1500,New Zealand - North Island,New Zealand - North Island.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1501,New Zealand - South Island,New Zealand - South Island.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1502,New Zealand - offshore W of 168 deg E,New Zealand - offshore west of 168 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1503,New Zealand - offshore 168 to 174 deg E,New Zealand - offshore between 168 and 174 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1504,New Zealand - offshore E of 174 deg E,New Zealand - offshore east of 174 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1505,Ghana - offshore,Ghana - offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1506,Canada - Saskatchewan - E of 108 deg W,Canada - Saskatchewan east of 108 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1507,Canada - Alberta and Saskatchewan - 114 to 108 deg W,Canada - Alberta east of 114 deg West; Saskatchewan west of 108 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1508,Canada - Alberta W of 114 deg W,Canada - Alberta west of 114 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1509,Sierra Leone - W of 12 deg W,Sierra Leone - west of 12 deg West.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1510,Sierra Leone - E of 12 deg W,Sierra Leone - east of 12 deg West.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1511,USA - conus and Alaska,United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; South Dakota; Tennessee; Texas;  [...]
+1512,Germany - east Germany - W of 10.5 deg E,Germany - states of former East Germany (DDR) west of 10 deg 30 min East - Thuringen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1513,Germany - east Germany - 10.5 to 13.5 deg E,Germany - states of former East Germany (DDR) between 10 deg 30 min and 13 deg 30 min East - Brandenburg; Mecklenburg-Vorpommern; Sachsen; Sachsen-Anhalt; Thuringen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1514,Germany - east Germany - E of 13.5 deg E,Germany - states of former East Germany (DDR) east of 13 deg 30 min East - Brandenburg; Mecklenburg-Vorpommern; Sachsen.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1515,Poland - zone I,Poland - southeast - south of 52 deg 20 min North and east of 18 deg East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1516,Poland - zone II,Poland - northeast - north of 51 deg 20 min North and east of 19 deg East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1517,Poland - zone III,Poland - northwest - north of 52 deg 10 min North and west of 20 deg East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1518,Poland - zone IV,Poland - southwest - south of  53 deg 20 min North and west of 19 deg 05 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1519,Poland - zone V,"Poland - south central - between 49 deg 20 min North and 51 deg 20 min North, 18 deg 20 min East and 19 deg 40min East.",,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1520,Poland - W of 16.5 deg E,Poland - west of 16 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1521,Poland - 16.5 to 19.5 deg E,Poland - between 16 deg 30 min and 19 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1522,Poland - 19.5 to 22.5 deg E,Poland - between 19 deg 30 min and 22 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1523,Poland - E of 22.5 deg E,Poland - east of 22 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1524,Turkey - W of 28.5 deg E,Turkey west of 28 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1525,Turkey - 28.5 to 31.5 deg E,Turkey between 28 deg 30 min and 31 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1526,Turkey - 31.5 to 34.5 deg E,Turkey between 31 deg 30 min and 34 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1527,Turkey - 34.5 to 37.5 deg E,Turkey between 34 deg 30 min and 37 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1528,Turkey - 37.5 to 40.5 deg E,Turkey between 37 deg 30 min and 40 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1529,Turkey - 40.5 to 43.5 deg E,Turkey between 40 deg 30 min and 43 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1530,Turkey - E of 43.5 deg E,Turkey east of 43 deg 30 min East.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1531,Canada - New Brunswick - W of 66 deg W,Canada - New Brunswick - west of 66 deg West.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1532,Canada - Maritime Provinces - E of 66 deg W,Canada - New Brunswick - east of 66 deg W.; Canada - Nova Scotia; Canada - Prince Edward Island.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1533,Canada - Prince Edward Island,Canada - Prince Edward Island.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1534,Canada - Nova Scotia - E of 63 deg W,Canada - Nova Scotia - east of 63 deg West.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1535,Canada - Nova Scotia - W of 63 deg W,Canada - Nova Scotia - west of 63 deg West.,,,,,EPSG,EPSG,1999-05-24 00:00:00,,0
+1536,Finland - W of 22.5 deg E,Finland - west of 22 deg 30 min East.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1537,Finland - 22.5 deg to 25.5 deg E,Finland - between 22 deg 30 min and 25 deg 30 min East.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1538,Finland - zone 3,Finland - between 25 deg 30 min and 28 deg 30 min East for Basic Coordinate System and all Finland for Uniform Coordinate System.,,,,,EPSG,EPSG,2001-09-03 00:00:00,,0
+1539,Finland - E of 28.5 deg E,Finland - east of 28 deg 30 min East.,,,,,EPSG,EPSG,1997-07-22 00:00:00,,0
+1540,Mozambique - W of 36 deg E,Mozambique - west of 36 deg East.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1541,Mozambique - E of 36 deg E,Mozambique - east of 36 deg East.,,,,,EPSG,EPSG,1998-04-16 00:00:00,,0
+1542,Asia - Cambodia and Vietnam - W of 108 deg E,Cambodia; Vietnam west of 108 deg East.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1544,Oman - W of 54 deg E,Oman - west of 54 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1545,Oman - E of 54 deg E,Oman - east of 54 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1546,USA - Hawaii - island of Hawaii,United States (USA) - Hawaii - island of Hawaii.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1547,USA - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1548,USA - Hawaii - Oahu.,United States (USA) - Hawaii - Oahu.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1549,USA - Hawaii - Kauai.,United States (USA) - Hawaii - Kauai.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1550,USA - Hawaii - Niihau.,United States (USA) - Hawaii - Niihau.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1551,Grenada including Grenada Grenadines,Grenada (including Grenada Grenadines).,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1552,Africa - Ethiopia and Sudan - W of 42 deg E,Ethiopia - west of 42 degrees East.  Sudan - west of 42 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1553,Africa - Ethiopia and Sudan - E of 42 deg E,Ethiopia - east of 42 degrees East.  Sudan - east of 42 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1554,Somalia - W of 48 deg E,Somalia - west of 48 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1555,Somalia - E of 48 deg E,Somalia - east of 48 degrees East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1556,Australia - 102 to 108 deg E,Australia - between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1557,Australia - 108 to 114 deg E,Australia - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1558,Australia - 114 to 120 deg E,Australia - between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1559,Australia - 120 to 126 deg E,Australia - between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1560,Australia - 126 to 132 deg E,Australia - between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1561,Australia - 132 to 138 deg E,Australia - between 132 and 138 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1562,Australia - 138 to 144 deg E,Australia - between 138 and 144 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1563,Australia - 144 to 150 deg E,Australia - between 144 and 150 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1564,Australia - 150 to 156 deg E,Australia - between 150 and 156 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1565,Australia - 156 to 162 deg E,Australia - between 156 and 162 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1566,Australia - 162 to 168 deg E,Australia - between 162 and 168 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1567,Australasia - Australia and PNG - 138 to 144 deg E,Australia - between 138 and 144 deg East.  Papua New Guinea (PNG) - west of 144 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1568,Australasia - Australia and PNG - 144 to 150 deg E,Australia - between 144 and 150 deg East.  Papua New Guinea (PNG) - east of 144 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1569,Saudi Arabia - W of 42 deg E,Saudi Arabia - west of 42 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1570,Saudi Arabia - E of 48 deg E,Saudi Arabia - east of 48 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1571,Asia - Middle East - Kuwait and Saudi - 42 to 48 deg E,Kuwait.  Saudi Arabia - between 42 and 48 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1572,Brazil - Aratu - W of 48 deg W,Brazil - coastal areas south of 2 deg 55 min South and west of 48 deg West.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1573,Brazil - Aratu - 48 to 42 deg W,Brazil - coastal areas south of 2 deg 55 min South and between 48 and 42 deg West; offshore Santos basin.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1574,Brazil - Aratu - E of 42 deg W,Brazil - coastal areas south of 2 deg 55 min South and east of 42 deg West; offshore Campos basin.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1575,Africa - Botswana and Zambia - W of 24 deg E,Botswana and Zambia - west of 24 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1576,"Africa - Botswana, Zambia and Zimbabwe - 24 to 30 deg E",Botswana - east of 24 deg East; Zambia - between 24 and 30 deg East; Zimbabwe west of 30 deg East .,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1577,"Africa - Malawi, Zambia and Zimbabwe - E of 30 deg E",Malawi.  Zambia and Zimbabwe - east of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1578,Uganda - N of equator and W of 30 deg E,Uganda - north of equator and west of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1579,Africa - Tanzania and Uganda - S of equator and W of 30 deg E,Tanzania - west of 30 deg East; Uganda south of equator and west of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1580,Africa - Kenya and Uganda - N of equator and 30 to 36 deg E,Kenya - north of equator and west of 36 deg East; Uganda north of equator and east of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1581,"Africa - Kenya, Tanzania and Uganda - S of equator and 30 to 36 deg E",Kenya - south of equator and west of 36 deg East; Tanzania - 30 to 36 deg East; Uganda south of equator and east of 30 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1582,Kenya - N of equator and E of 36 deg E,Kenya - north of equator and east of 36 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1583,Africa - Kenya and Tanzania - S of equator and E of 36 deg E,Kenya - south of equator and east of 36 deg East; Tanzania - east of 36 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1584,Indonesia - Java - W of 108 deg E,Indonesia - Java - west of 108 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1585,Indonesia - Java - E of 114 deg E,Indonesia - Java - east of 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1586,Indonesia - Java - 108 to 114 deg E,Indonesia - Java - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1587,China - W of 78 deg E,China - west of 78 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1588,China - 78 to 84 deg E,China - between 78 and 84 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1589,China - 84 to 90 deg E,China - between 84 and 90 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1590,China - 90 to 96 deg E,China - between 90 and 96 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1591,China - 96 to 102 deg E,China - between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1592,China - 102 to 108 deg E,China - between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1593,China - 108 to 114 deg E,China - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1594,China - 114 to 120 deg E,China - between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1595,China - 120 to 126 deg E,China - between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1596,China - 126 to 132 deg E,China - between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1597,China - E of 132 deg E,China - east of 132 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1598,Colombia - W of 75d 35m W,Colombia - west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1599,Colombia - 75d 35m to 72d 35m W,Colombia - between 1 deg 30 min W and 1 deg 30 min E of Bogota (75d 35m W and 72d 35m W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1600,Colombia - 72d 35m to 69d 35m W,Colombia - between 1 deg 30 min and 4 deg 30 min E of Bogota (72d 35m and 69d 34m W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1601,Colombia - E of 69d 35m W,Colombia - east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+1602,Colombia - offshore W of 78 deg W,Colombia - offshore west of 78 deg W of Greenwich.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1603,Colombia - offshore E of 78 deg W,Colombia - offshore east of 78 deg W of Greenwich.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1604,Angola - Angola proper - offshore,Angola - Angola proper - offshore,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1605,Angola - Angola proper - offshore block 15,Angola - Angola proper - offshore block 15,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1606,Angola - Angola proper - offshore - W of 12 deg E,Angola - Angola proper - offshore - west of 12 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1607,Angola - 12 to 18 deg E,Angola - between 12 and 18 deg East.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+1608,Argentina - W of 70.5 deg W,Argentina - west of 70 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1609,Argentina - 70.5 to 67.5 deg W,Argentina - between 70 deg 30 min and 67 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1610,Argentina - 67.5 to 64.5 deg W,Argentina - between 67 deg 30 min and 64 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1611,Argentina - 64.5 to 61.5 deg W,Argentina - between 64 deg 30 min and 61 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1612,Argentina - 61.5 to 58.5 deg W,Argentina - between 61 deg 30 min and 58 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1613,Argentina - 58.5 to 55.5 deg W,Argentina - between 58 deg 30 min and 55 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1614,Argentina - E of 55.5 deg W,Argentina - east of 55 deg 30 min West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1615,Botswana - W of 21 deg E,Botswana - west of 21 deg East.,,,,,EPSG,EPSG,1995-12-08 00:00:00,,0
+1616,Botswana - 21 to 27 deg E,Botswana - between 21 and 27deg East.,,,,,EPSG,EPSG,1995-12-08 00:00:00,,0
+1617,Botswana - E of 27 deg E,Botswana - east of 27 deg East.,,,,,EPSG,EPSG,1995-12-08 00:00:00,,0
+1618,Tunisia - onshore,Tunisia - onshore.,,,,,EPSG,EPSG,1999-11-15 00:00:00,,0
+1619,Tunisia - N of 34 deg 39 min N,Tunisia - north of 38.5 grads (34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1620,Tunisia - S of 34 deg 39 min N,Tunisia - south of 38.5 grads (34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1621,Brazil - Corrego Alegre - W of 42 deg W,Brazil - NE coastal area between 45 deg West and 42 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1622,Brazil - Corrego Alegre - E of 42 deg W,Brazil - NE coastal area between 42 deg West and 40 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1623,Asia - Middle East - Lebanon and Syria,Lebanon. Syrian Arab Republic.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1624,Germany - W of 7.5 deg E,"Germany west of 7 deg 30 min East - Niedersachsen, Nordrhein-Westfalen, Rheinland-Pfalz, Saarland.",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1625,Germany - 7.5 to 10.5 deg E,"Germany - former West Germany onshore between 7 deg 30 min and 10 deg 30 min East - Baden-Wurtemberg, Bayern, Hessen, Niedersachsen, Nordrhein-Westfalen, Rhineland-Pfalz, Schleswig-Holstein. Also former East German (DDR) state of Thuringen by transformation.",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1626,Germany - 10.5 to 13.5 deg E,"Germany - former West Germany onshore between 10 deg 30 min and 13 deg 30 min East - Bayern, Niedersachsen, Schleswig-Holstein. Also former East German (DDR) states of Sachsen and Thuringen by transformation.",,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1627,Germany - 13.5 to 16.5 deg E,Germany - former West Germany onshore east of 13 deg 30 min East - Bayern. Also former East German (DDR) state of Sachsen by transformation.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1628,Germany - W of 4.5 deg E,Germany - onshore west of 4 deg 30 min East.,,,,Not valid - do not use !,EPSG,EPSG,2000-03-07 00:00:00,,1
+1629,UK - offshore North Sea,United Kingdom (UKCS) - offshore North Sea.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1630,Netherlands - offshore,Netherlands - offshore North Sea.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1631,Europe - ED50 / UTM 28,Europe - between 18 and 12 deg West - Ireland offshore; Spain (Canary Islands); United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1632,Europe - ED50 / UTM 29,Europe - between 12 and 6 deg West - Portugal; Spain; Ireland offshore; United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1633,Europe - ED50 / UTM 30,Europe - between 6 deg West and 0 deg East - Faroe Islands; France offshore; Gibraltar; Ireland offshore; Spain; United Kingdom - UKCS offshore - North Sea west of 0 d eg East).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1634,Europe - ED50 / UTM 31,Europe - between 0 and 6 deg East - Denmark (North Sea); Germany offshore; Netherlands offshore; Norway; Spain (Balearic Islands); United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1635,Europe - ED50 / UTM 32,Europe - between 6 and 12 deg East - Denmark; Germany offshore; Italy; Netherlands offshore; Norway.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1636,Europe - ED50 / UTM 33,Europe - between 12 and 18 deg East - Denmark (Bornholm); Italy; Norway.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1637,Europe - ED50 / UTM 34,Europe - between 18 and 24 deg East - Greece; Norway.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1638,Europe - ED50 / UTM 35,Europe - between 24 and 30 deg East - Greece; Norway; Turkey. Egypt - Western Desert.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1639,Europe - ED50 / UTM 36,Europe - between 30 and 36 deg East - Turkey.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1640,Europe - ED50 / UTM 37,Europe - between 36 and 42 deg East - Turkey.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1641,Europe - ED50 / UTM 38,Europe - between 42 and 48 deg East - Turkey.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1642,Egypt - Sinai peninsula,Egypt - Sinai peninsula.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1643,Egypt - E of 29 deg E,Egypt - east of 29 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1644,Egypt - W of 29 deg E; N of 28 deg 11 min N,Egypt - west of 29 deg E; north of approximately 28 deg 11 min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1645,Egypt - W of 29 deg E; S of 28 deg 11 min N,Egypt - west of 29 deg E; south of approximately 28 deg 11 min North.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1646,Europe - Estonia;  Latvia;  Lithuania.,Estonia;  Latvia;  Lithuania.,,,,,EPSG,EPSG,1998-12-14 00:00:00,,0
+1647,Indonesia - N of equator and W of 96 deg E,Indonesia - north of equator and west of 96 deg East.,,,,,EPSG,EPSG,1995-08-08 00:00:00,,0
+1648,Indonesia - S of equator and W of 96 deg E,Indonesia - south of equator and west of 96 deg East.,,,,,EPSG,EPSG,1995-08-08 00:00:00,,0
+1649,Indonesia - N of equator and 96 to 102 deg E,Indonesia - north of equator and between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1650,Indonesia - S of equator and 96 to 102 deg E,Indonesia - south of equator and between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1651,Indonesia - N of equator and 102 to 108 deg E,Indonesia - north of equator and between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1652,Indonesia - S of equator and 102 to 108 deg E,Indonesia - south of equator and between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1653,Indonesia - N of equator and 108 to 114 deg E,Indonesia - north of equator and between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1654,Indonesia - S of equator and 108 to 114 deg E,Indonesia - south of equator and between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1655,Indonesia - N of equator and 114 to 120 deg E,Indonesia - north of equator and between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1656,Indonesia - S of equator and 114 to 120 deg E,Indonesia - south of equator and between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1657,Indonesia - N of equator and 120 to 126 deg E,Indonesia - north of equator and between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1658,Indonesia - S of equator and 120 to 126 deg E,Indonesia - south of equator and between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1659,Indonesia - N of equator and 126 to 132 deg E,Indonesia - north of equator and between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1660,Indonesia - S of equator and 126 to 132 deg E,Indonesia - south of equator and between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1661,Indonesia - N of equator and 132 to 138 deg E,Indonesia - north of equator and east of 132 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1662,Indonesia - S of equator and 132 to 138 deg E,Indonesia - south of equator and between 132 and 138 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1663,Indonesia - S of equator and E of 138 deg E,Indonesia - south of equator and east of 138 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1664,Myanmar (Burma) - W of 96 deg E,Myanmar (Burma) - west of 96 deg East.,,,,,EPSG,EPSG,1998-06-13 00:00:00,,0
+1665,Asia - Myanmar and Thailand - 96 to 102 deg E,Myanmar (Burma) - east of 96 deg East; Thailand - west of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1666,Thailand - E of 102 deg E,Thailand - east of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1667,Thailand - W of 102 deg E,Thailand - west of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1668,Pakistan - N of 35 deg 35 min N,Pakistan - north of 35 deg 35 min North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1669,Asia - India; Pakistan - 28 to 35.5 deg N,India north of 28 deg North; Pakistan 28 deg to 35 deg 35 min North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1670,Asia - India; Pakistan - zone IIa,India - between 21 and 28 deg North and west of 82 deg East; Pakistan - south of 28 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1671,Asia - Bangladesh; India; Myanmur; Pakistan - zone IIb,Bangladesh; India - north of 22 deg North and east of 82 deg East; Myanmar (Burma) - north of 22 deg North.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1672,India - 15 to 21 deg N,India - between 15 and 21 deg North.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1673,India - S of 15 deg N,India - south of 15 deg North.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1674,Bangladesh - W of 90 deg E,Bangladesh - west of 90 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1675,Bangladesh - E of 90 deg E,Bangladesh - east of 90 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1676,India - N of 28 deg N,India - north of 28 deg North.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1677,India - 21 to 28deg N and W of 82 deg E,India - between 21 and 28 deg North and west of 82 deg East.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1678,India - N of 21 deg N and E of 82 deg E,India - north of 21 deg North and east of 82 deg East.,,,,,EPSG,EPSG,2000-04-23 00:00:00,,0
+1679,India - W of 72 deg E,India - west of 72 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1680,India - 72 to 78 deg E,India - between 72 and 78 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1681,India - 78 to 84 deg E,India - between 78 and 84 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1682,India - 84 to 90 deg E,India - between 84 and 90 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1683,India - 90 to 96 deg E,India - between 90 and 96 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1684,India - E of 96 deg E,India - east of 96 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1685,Pakistan - N of 28 deg N,Pakistan - north of 28 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1686,Pakistan - S of 28 deg N,Pakistan - south of 28 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1687,Pakistan - W of 66 deg E,Pakistan - west of 66 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1688,Pakistan - 66 to 72 deg E,Pakistan - between 66 and 72 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1689,Pakistan - E of 72 deg E,Pakistan - east of 72 deg East.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1690,Malaysia - West Malaysia,Malaysia - West Malaysia.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1691,Malaysia - West Malaysia - W of 102 deg E,Malaysia - West Malaysia west of 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1692,Malaysia - West Malaysia - E of 102 deg E,Malaysia - West Malaysia east of 102 deg East.,,,,,EPSG,EPSG,1995-07-21 00:00:00,,0
+1693,Venezuela - W of 72 deg W,Venezuela - west of 72 deg West.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1694,Venezuela - 72 to 66 deg W,Venezuela - between 72 and 66 deg West.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1695,Venezuela - E of 66 deg W,Venezuela - east of 66 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1696,Gabon - N of equator,Gabon - north of equator.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1697,Gabon - S of equator,Gabon - south of equator.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1698,Philippines - zone I,Philippines - west of 118 deg East.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1699,Philippines - zone II,Philippines - Palawan; Calamian Islands.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1700,Philippines - zone III,Philippines - Luzon (except SE part;); Mindoro.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1701,Philippines - zone IV,Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; west Mindanao.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1702,Philippines - zone V,Philippines - east Mindanao; Bohol; Samar.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1703,Morocco - N of 31.5 deg N,Morocco north of 35 grads (31 deg 30 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1704,Morocco - 27.9 to 31.5 deg N,Morocco between 31 and 35 grads (27 deg 54 min and 31 deg 30 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1705,Morocco - S of 27.9 deg N,Morocco south of 31grads  (27 deg 54 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1706,Austria - W of 11 deg 50 min E,Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1707,Austria - 11 deg 50 min to 14deg 50min E,Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1708,Austria - E of 14 deg 50 min E,Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1709,Europe - former Yugoslavia - W of 16.5 deg E,Bosnia and Herzegowina west of 16 deg 30 min E; Croatia west of 16 deg 30 min E; Slovenia.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1710,Europe - former Yugoslavia - 16.5 to 29.5 deg E,Bosnia and Herzegowina east of 16 deg 30 min E; Croatia east of 16 deg 30 min E; Yugoslavia west of 19 deg 30 min E.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1711,Europe - former Yugoslavia - 19.5 to 22.5 deg E,FYR Macedonia west of 22 deg 30 min E; Yugoslavia between 19 deg 30 min and 22 deg 30 min E.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1712,Europe - former Yugoslavia - E of 22.5 deg E,FYR Macedonia and Yugoslavia east of 22 deg 30 min E.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1713,Nigeria - E of 10.5 deg E,Nigeria east of 10 deg 30 min East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1714,Nigeria - 6.5 to10.5 deg E,Nigeria between 6 deg 30 min and 10 deg 30 min East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1715,Nigeria - W of 6.5 deg E,Nigeria west of 6 deg 30 min East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1716,Nigeria - offshore deep water - W of 6 deg E,Nigeria - offshore beyond continental shelf west of 6 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1717,Nigeria - offshore deep water,Nigeria - offshore beyond continental shelf.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1718,Italy - W of 12 deg E,Italy - west of 12 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1719,Italy - E of 12 deg E,Italy - east of 12 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1720,USA - Michigan - SPCS - E,United States (USA) - Michigan - counties of Alcona; Alpena; Arenac; Bay; Cheboygan; Clinton; Crawford; Genesee; Gladwin; Gratiot; Hillsdale; Huron; Ingham; Iosco; Jackson; Lapeer; Lenawee; Livingston; Macomb; Midland; Monroe; Montmorency; Oakland; Ogemaw; Oscoda; Otsego; Presque Isle; Roscommon; Saginaw; Sanilac; Shiawassee; St. Clair; Tuscola; Washtenaw; Wayne.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1721,USA - Michigan - SPCS - old central,United States (USA) - Michigan - counties of Allegan; Antrim; Barry; Benzie; Berrien; Branch; Calhoun; Cass; Charlevoix; Clare; Eaton; Emmet; Grand Traverse; Ionia; Isabella; Kalamazoo; Kalkaska; Kent; Lake; Leelanau; Manistee; Mason; Mecosta; Missaukee; Montcalm; Muskegon; Newaygo; Oceana; Osceola; Ottawa; St. Joseph; Van Buren; Wexford.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1722,USA - Michigan - SPCS - W,United States (USA) - Michigan - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1723,USA - Michigan - SPCS - N,United States (USA) - Michigan north of approximately 45d 45m North - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1724,USA - Michigan - SPCS - central,United States (USA) - Michigan between approximately 45d 45m & 43d 55m North - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; Oscoda; Otsego; Presque Isle; Roscommon; Wexford.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+1725,USA - Michigan - SPCS - S,United States (USA) - Michigan south of approximately 43d 55m North - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Midland; Monroe; Montcalm; Muskegon; Newaygo; Oakland; Oceana; Ottawa; Saginaw; Sanilac; Shiawassee; St. Clair; St. Joseph; Tuscola; Van Buren; Washtenaw; Wayne.,,,,,EPSG,EPSG,2 [...]
+1726,Mozambique - offshore,Mozambique - offshore.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+1727,Suriname - offshore,Suriname - offshore.,,,,,EPSG,EPSG,2000-06-10 00:00:00,,0
+1728,Algeria - N of 34 deg 39 min N,Algeria - north of 38.5 grads (34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1729,Algeria - 31 deg 30 min  of 34 deg 39 min N,Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1730,North America - NAVD88,North America: Canada - Alberta; British Columbia; Manitoba; New Brunswick; Newfoundland; North West Territories; Nova Scotia; Nunavut; Ontario; Prince Edward Island; Quebec; Saskatchewan; Yukon. United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; N [...]
+1731,France - N of 48.15 deg N,France north of 53.5 grads (48 deg 09 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1732,France - 45.45 to 48.15 deg N,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1733,France - S of 45.45 deg N,France south of 50.5 grads (45 deg 27 min) North.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1734,France - 45.45 to 48.15 deg N. Also all mainland.,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North. Also used over all mainland France.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1735,Algeria - W of 6 deg W,Algeria - west of 6 deg West (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1736,Algeria - 6 to 0 deg W,Algeria - between 6 deg West and 0 deg East (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1737,Algeria - 0 to 6 deg E,Algeria - between 0 and 6 deg East (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1738,Algeria - E of 6 deg E,Algeria - east of 6 deg East (of Greenwich).,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1739,Kuwait - W of 48 deg E,Kuwait - west of 48 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1740,Kuwait - E of 48 deg E,Kuwait - east of 48 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1741,Norway - zone I,Norway - west of 3deg 30min W of Oslo (7deg 13min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1742,Norway - zone II,Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 22.5sec E  and 9deg 33min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1743,Norway - zone III,Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 22.5sec E and 11deg 58min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1744,Norway - zone IV,Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 22.5sec E and 15deg 03min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1745,Norway - zone V,Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 22.5sec E and 18deg 53min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1746,Norway - zone VI,Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 22.5sec E and 22deg 53min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1747,Norway - zone VII,Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 22.5sec E and 26deg 58min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1748,Norway - zone VIII,Norway - east of 16deg 15min E of Oslo (26deg 58min 22.5sec E of Greenwich).,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+1749,Asia - Middle East - Nahrwan / UTM 39,Kuwait east of 48 deg East.  Qatar - offshore.  United Arab Emirates (UAE) - Abu Dhabi - west of 54 deg East.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1750,UAE - E of 54 deg E,United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1751,Peru - E of 73 deg W,Peru - east of 73 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1752,Peru - 79 to 73 deg W,Peru - between 79 and 73 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1753,Peru - W of 79 deg W,Peru - west of 79 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+1754,Brazil - offshore Amazon Cone,Brazil - offshore Amazon Cone.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+1755,South America - PSAD56 / UTM 17S,"South America (Chile; Ecuador; Peru) between 84 and 78 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1756,South America - PSAD56 / UTM 18N,"South America (Ecuador;  [Venezuela]) between 78 and 72 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1757,South America - PSAD56 / UTM 18S,"South America (Chile; Ecuador; Peru) between 78 and 72 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1758,South America - PSAD56 / UTM 19N,"South America (Netherlands Antilles; [Venezuela]) between 72 and 66 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1759,South America - PSAD56 / UTM 19S,"South America (Bolivia; Chile; Peru) between 72 and 66 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1760,South America - PSAD56 / UTM 20N,"South America (Guyana; [Venezuela]) between 66 and 60 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1761,South America - PSAD56 / UTM 20S,"South America (Bolivia) between 66 and 60 deg West, southern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1762,South America - PSAD56 / UTM 21N,"South America (Guyana) between 60 and 54 deg West, northern hemisphere.",,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1763,Russia - W of 24 deg E,Russian Federation - west of 24 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1764,Russia - 24 to 30 deg E,Russian Federation - between 24 and 30 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1765,Russia - 30 to 36 deg E,Russian Federation - between 30 and 36 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1766,Russia - 36 to 42 deg E,Russian Federation - between 36 and 42 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1767,Russia - 42 to 48 deg E,Russian Federation - between 42 and 48 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1768,Russia - 48 to 54 deg E,Russian Federation - between 48 and 54 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1769,Russia - 54 to 60 deg E,Russian Federation - between 54 and 60 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1770,Russia - 60 to 66 deg E,Russian Federation - between 60 and 66 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1771,Russia - 66 to 72 deg E,Russian Federation - between 66 and 72 deg East .,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1772,Russia - 72 to 78 deg E,Russian Federation - between 72 and 78 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1773,Russia - 78 to 84 deg E,Russian Federation - between 78 and 84 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1774,Russia - 84 to 90 deg E,Russian Federation - between 84 and 90 deg East.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+1775,Russia - 90 to 96 deg E,Russian Federation - between 90 and 96 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1776,Russia - 96 to 102 deg E,Russian Federation - between 96 and 102 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1777,Russia - 102 to 108 deg E,Russian Federation - between 102 and 108 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1778,Russia - 108 to 114 deg E,Russian Federation - between 108 and 114 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1779,Russia - 114 to 120 deg E,Russian Federation - between 114 and 120 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1780,Russia - 120 to 126 deg E,Russian Federation - between 120 and 126 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1781,Russia - 126 to 132 deg E,Russian Federation - between 126 and 132 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1782,Russia - 132 to 138 deg E,Russian Federation - between 132 and 138 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1783,Russia - 138 to 144 deg E,Russian Federation - between 138 and 144 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1784,Russia - 144 to 150 deg E,Russian Federation - between 144 and 150 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1785,Russia - 150 to 156 deg E,Russian Federation - between 150 and 156 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1786,Russia - 156 to 162 deg E,Russian Federation - between 156 and 162 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1787,Russia - 162 to 168 deg E,Russian Federation - between 162 and 168 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1788,Russia - 168 to 174 deg E,Russian Federation - between 168 and 174 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1789,Russia - 174 to 180 deg E,Russian Federation - between 174 and 180 deg East .,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1790,Russia - 180 to 174 deg W,Russian Federation - between 180 deg East and 174 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1791,Russia - E of 174 deg W,Russian Federation - east of 174 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1792,Europe - 6deg GK CM 15,Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1793,Europe - 6deg GK CM 21,Estonia; Latvia; Lithuania; Russian Federation; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1794,Europe - 6deg GK CM 27,Belarus - west of 30 deg East;  Estonia; Latvia & Lithuania - east of 24 deg East;  Moldova;  Russian Federation &  Ukraine - 24 to 30 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1795,Europe - 6deg GK CM 33,Belarus - east of 30 deg East;  Russian Federation  &  Ukraine  - 30 to 36 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1796,Europe - 6deg GK CM 39,Georgia - west of 36 deg East;  Russian Federation  - 36 to 42 deg East;  Ukraine - east of 36 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1797,Europe - 6deg GK CM 45,Armenia - west of 48 deg East;  Azerbaijan - west of 48 deg East;  Georgia - east of 42 deg East;  Russian Federation - 42 to 48 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1798,Asia - 6deg GK CM 51,Azerbaijan - east of 48 deg East;  Kazakstan - west of 54 deg East;  Russian Federation - 48 to 54 deg East;  Turkmenistan - west of 54 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1799,Asia - 6deg GK CM 57,Kazakstan;  Russian Federation;  Turkmenistan  - 54 deg  to 60 deg East; Uzbekistan - west of 60 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1800,Asia - 6deg GK CM 63,Kazakstan;  Russian Federation;  Uzbekistan - 60 to 66 deg East;  Turkmenistan - east of 60 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1801,Asia - 6deg GK CM 69,Kazakstan &  Russian Federation - 66 to 72 deg East;  Kirgistan & Tadzhikstan - west of 72 deg East;  Uzbekistan - east of 66 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1802,Asia - 6deg GK CM 75,Kazakstan;  Kirgizstan;  Russian Federation - 72 to 78 deg East;  Tadzhikstan - east of 72 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1803,Asia - 6deg GK CM 81,Kazakstan &  Russian Federation - 78 to 84 deg East; Kirgizstan - east of 78 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1804,Asia - 6deg GK CM 87,Kazakstan - east of 84 deg East;  Russian Federation - 84 to 90 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1805,Europe - 6deg GK CM 9,Czech Republic and Germany (former DDR) - west of 12 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.361,0
+1806,South America - SAD69 / UTM 17S,South America - between 84 and 78 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1807,South America - SAD69 / UTM 18N,South America - between 78 and 72 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1808,South America - SAD69 / UTM 18S,South America - Brazil - between 78 and 72 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1809,South America - SAD69 / UTM 19N,South America - between 72 and 66 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1810,South America - SAD69 / UTM 19S,South America - Brazil - between 72 and 66 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1811,South America - SAD69 / UTM 20N,South America - between 66 and 60 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1812,South America - SAD69 / UTM 20S,South America - Brazil - between 66 and 60 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1813,South America - SAD69 / UTM 21N,South America - between 60 and 54 deg West; northern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1814,South America - SAD69 / UTM 21S,South America - Brazil - between 60 and 54 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1815,South America - SAD69 / UTM 22N,South America - 54deg West to 48deg West; northern hemisphere. Brazil - offshore - Amazon cone.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1816,South America - SAD69 / UTM 22S,South America - Brazil - between 54 and 48 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1817,South America - SAD69 / UTM 23S,South America - between 48 and 42 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1818,South America - SAD69 / UTM 24S,South America - Brazil - between 42 and 36 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1819,South America - SAD69 / UTM 25S,South America - between 36 and 30 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1820,Falkland Islands - W of 60 deg W,Falkland Islands (Malvinas) - west of 60 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1821,Falkland Islands - E of 60 deg W,Falkland Islands (Malvinas) - east of 60 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1822,Namibia - offshore,Namibia - offshore.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+1823,South America - SIRGAS / UTM 17N,Between 84 and 78deg West; northern hemisphere. Ecuador - north of equator. Colombia.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1824,South America - SIRGAS / UTM 17S,Between 84 and 78deg West; southern hemisphere.  Chile. Colombia. Ecuador. Peru.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1825,South America - SIRGAS / UTM 18N,Between 78 and 72deg West; northern hemisphere. Colombia. Ecuador. Venezuela.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1826,South America - SIRGAS / UTM 18S,Between 78 and 72deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1827,South America - SIRGAS / UTM 19N,Between 72 and 66deg West; northern hemisphere. Brazil. Colombia. Venezuela.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1828,South America - SIRGAS / UTM 19S,Between 72 and 66deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1829,South America - SIRGAS / UTM 20N,Between 66 and 60deg West; northern hemisphere. Brazil. Guyana. Venezuela,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1830,South America - SIRGAS / UTM 20S,Between 66 and 60deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1831,South America - SIRGAS / UTM 21N,Between 60 and 54deg West; northern hemisphere.  Brazil. French Guiana. Guyana.  Suriname.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1832,South America - SIRGAS / UTM 21S,Between 60 and 54deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1833,South America - SIRGAS / UTM 22N,Between 54 and 48deg West; northern hemisphere. Brazil.  French Guiana.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1834,South America - SIRGAS / UTM 22S,Between 54 and 48deg West; southern hemisphere. Brazil.  Uruguay.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1835,South America - SIRGAS / UTM 23S,Between 48 and 42deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1836,South America - SIRGAS / UTM 24S,Between 42 and 36deg West; southern hemisphere. Brazil,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1837,South America - SIRGAS / UTM 25S,Between 36 and 30deg West; southern hemisphere. Brazil.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1838,Namibia - W of 12 deg E,Namibia - west of 12 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1839,Namibia - 12 to 14 deg E,Namibia - between 12 and 14 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1840,Namibia - 14 to 16 deg E,Namibia - between 14 and 16 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1841,Namibia - 16 to 18 deg E,Namibia - between 16 and 18 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1842,Namibia - 18 to 20 deg E,Namibia - between 18 and 20 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1843,Namibia - 20 to 22 deg E,Namibia - between 20 and 22 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1844,Namibia - 22 to 24 deg E,Namibia - between 22 and 24 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1845,Namibia - E of 24 deg E,Namibia - east of 24 deg East.,,,,,EPSG,EPSG,1997-06-16 00:00:00,,0
+1846,Sudan - south - W of 30 deg E,Sudan south - west of 30 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1847,Sudan - south - E of 30 deg E,Sudan south - east of 30 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1848,Madagascar - offshore - W of 48 deg E,Madagascar - offshore west of 48 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1849,Madagascar - offshore - E of 48 deg E,Madagascar - offshore east of 48 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1850,UAE - Abu Dhabi - W of 54 deg E,United Arab Emirates (UAE) - Abu Dhabi west of 54 deg East.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1851,Malaysia - East Malaysia,Malaysia - East Malaysia (Sabah; Sarawak).,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+1852,Asia - Brunei and East Malaysia - UTM zone 49,Brunei - offshore; Malaysia - East Malaysia (Sarawak).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1853,Asia - Brunei and East Malaysia - UTM zone 50,Brunei - offshore; Malaysia - East Malaysia (Sabah).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1854,Japan - zone I,Japan - Kyushu west of approximately 130 deg East - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1855,Japan - zone II,Japan - Kyushu east of approximately 130 deg East - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinate System zone I).,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1856,Japan - zone III,Japan - Honshu west of approximately 133 deg 15 min East - Yamaguchi-ken; Shimane-ken; Hiroshima-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1857,Japan - zone IV,Japan - Shikoku - Kagawa-ken; Ehime-ken; Tokushima-ken; Kochi-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1858,Japan - zone V,Japan - Honshu between approximately 133 deg 15 min and 135 deg 10 min East - Hyogo-ken; Tottori-ken; Okayama-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1859,Japan - zone VI,Japan - Honshu between approximately 135 deg 10 min and 136 deg 45 min East - Kyoto-fu; Osaka-fu; Fukui-ken; Shiga-ken; Mie-ken; Nara-ken; Wakayama-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1860,Japan - zone VII,Japan - Honshu between approximately 136 deg 15 min and 137 deg 45 min East - Ishikawa-ken; Toyama-ken; Gifu-ken; Aichi-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1861,Japan - zone VIII,Japan - Honshu between approximately 137 deg 45 min and 139 deg East - Niigata-ken; Nagano-ken; Yamanashi-ken; Shizuoka-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1862,Japan - zone IX,"Japan - Honshu - Tokyo-to. (Excludes offshore island areas of Tokyo-to covered by Japan Plane Rectangular Coordinate System zones XIV, XVIII and XIX).",,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1863,Japan - zone X,Japan - Honshu north of 38 deg North approximately - Aomori-ken; Akita-ken; Yamagata-ken; Iwate-ken; Miyagi-ken.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1864,Japan - zone XI,Japan - Hokkaido west of approximately 141 deg  East  - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1865,Japan - zone XII,Japan - Hokkaido between approximately 141 and 143 deg min East - Sapporo city; Asahikawa city; Wakkanai city; Rumoi city; Bibai city; Yubari city; Iwamizawa city; Tomakomai city; Muroran city; Shibetsu city; Nayoro city; Ashibetsu city; Akabira city; Mikasa city; Takikawa city; Sunagawa city; Ebetsu city; Chitose city; Utashinai city; Fukagawa city; Monbetsu city; Furano city; Noboribetsu city; Eniwa city; Ishikari-shicyo; Monbetsu-gun of Abashiri-shicyo; Kamikawa- [...]
+1866,Japan - zone XIII,Japan - Hokkaido east of approximately 143 deg East  - Kitami city; Obihiro city; Kushiro city; Abashiri city; Nemuro city; Nemuro-shicyo; Kushiro-shicyo; Abashiri-shicyo (except Monbetsu-gun); Tokachi-shicyo.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1867,Japan - zone XIV,Japan - Tokyo-to south of 28 deg North & between 140 deg 30 min & 143 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1868,Japan - zone XV,Japan - Okinawa-ken between 126 and 130 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1869,Japan - zone XVI,Japan - Okinawa-ken west of 126 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1870,Japan - zone XVII,Japan - Okinawa-ken east of 130 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1871,Japan - zone XVIII,Japan - Tokyo-to south of 28 deg North and west of 140 deg 30 min East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1872,Japan - zone XIX,Japan - Tokyo-to south of 28 deg North & east of 143 deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+1873,6-degree TM - N hemisphere CM 177 deg W,Between 180 deg and 174 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1874,6-degree TM - S hemisphere CM 177 deg W,Between 180 deg and 174 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1875,6-degree TM - N hemisphere CM 171 deg W,Between 174 and 168 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1876,6-degree TM - S hemisphere CM 171 deg W,Between 174 and 168 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1877,6-degree TM - N hemisphere CM 165 deg W,Between 168 and 162 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1878,6-degree TM - S hemisphere CM 165 deg W,Between 168 and 162 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1879,6-degree TM - N hemisphere CM 159 deg W,Between 162 and 156 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1880,6-degree TM - S hemisphere CM 159 deg W,Between 162 and 156 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1881,6-degree TM - N hemisphere CM 153 deg W,Between 156 and 150 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1882,6-degree TM - S hemisphere CM 153 deg W,Between 156 and 150 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1883,6-degree TM - N hemisphere CM 147 deg W,Between 150 and 144 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1884,6-degree TM - S hemisphere CM 147 deg W,Between 150 and 144 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1885,6-degree TM - N hemisphere CM 141 deg W,Between 144 and 138 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1886,6-degree TM - S hemisphere CM 141 deg W,Between 144 and 138 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1887,6-degree TM - N hemisphere CM 135 deg W,Between 138 and 132 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1888,6-degree TM - S hemisphere CM 135 deg W,Between 138 and 132 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1889,6-degree TM - N hemisphere CM 129 deg W,Between 132 and 126 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1890,6-degree TM - S hemisphere CM 129 deg W,Between 132 and 126 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1891,6-degree TM - N hemisphere CM 123 deg W,Between 126 and 120 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1892,6-degree TM - S hemisphere CM 123 deg W,Between 126 and 120 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1893,6-degree TM - N hemisphere CM 117 deg W,Between 120 and 114 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1894,6-degree TM - S hemisphere CM 117 deg W,Between 120 and 114 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1895,6-degree TM - N hemisphere CM 111 deg W,Between 114 and 108 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1896,6-degree TM - S hemisphere CM 111 deg W,Between 114 and 108 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1897,6-degree TM - N hemisphere CM 105 deg W,Between 108 and 102 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1898,6-degree TM - S hemisphere CM 105 deg W,Between 108 and 102 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1899,6-degree TM - N hemisphere CM 99 deg W,Between 102 and 96 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1900,6-degree TM - S hemisphere CM 99 deg W,Between 102 and 96 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1901,6-degree TM - N hemisphere CM 93 deg W,Between 96 and 90 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1902,6-degree TM - S hemisphere CM 93 deg W,Between 96 and 90 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1903,6-degree TM - N hemisphere CM 87 deg W,Between 90 and 84 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1904,6-degree TM - S hemisphere CM 87 deg W,Between 90 and 84 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1905,6-degree TM - N hemisphere CM 81 deg W,Between 84 and 78 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1906,6-degree TM - S hemisphere CM 81 deg W,Between 84 and 78 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1907,6-degree TM - N hemisphere CM 75 deg W,Between 78 and 72 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1908,6-degree TM - S hemisphere CM 75 deg W,Between 78 and 72 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1909,6-degree TM - N hemisphere CM 69 deg W,Between 72 and 66 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1910,6-degree TM - S hemisphere CM 69 deg W,Between 72 and 66 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1911,6-degree TM - N hemisphere CM 63 deg W,Between 66 and 60 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1912,6-degree TM - S hemisphere CM 63 deg W,Between 66 and 60 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1913,6-degree TM - N hemisphere CM 57 deg W,Between 60 and 54 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1914,6-degree TM - S hemisphere CM 57 deg W,Between 60 and 54 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1915,6-degree TM - N hemisphere CM 51 deg W,Between 54 and 48 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1916,6-degree TM - S hemisphere CM 51 deg W,Between 54 and 48 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1917,6-degree TM - N hemisphere CM 45 deg W,Between 48 and 42 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1918,6-degree TM - S hemisphere CM 45 deg W,Between 48 and 42 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1919,6-degree TM - N hemisphere CM 39 deg W,Between 42 and 36 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1920,6-degree TM - S hemisphere CM 39 deg W,Between 42 and 36 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1921,6-degree TM - N hemisphere CM 33 deg W,Between 36 and 30 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1922,6-degree TM - S hemisphere CM 33 deg W,Between 36 and 30 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1923,6-degree TM - N hemisphere CM 27 deg W,Between 30 and 24 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1924,6-degree TM - S hemisphere CM 27 deg W,Between 30 and 24 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1925,6-degree TM - N hemisphere CM 21 deg W,Between 24 and 18 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1926,6-degree TM - S hemisphere CM 21 deg W,Between 24 and 18 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1927,6-degree TM - N hemisphere CM 15 deg W,Between 18 and 12 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1928,6-degree TM - S hemisphere CM 15 deg W,Between 18 and 12 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1929,6-degree TM - N hemisphere CM 9 deg W,Between 12 and 6 deg West; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1930,6-degree TM - S hemisphere CM 9 deg W,Between 12 and 6 deg West; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1931,6-degree TM - N hemisphere CM 3 deg W,Between 6 deg West and 0 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1932,6-degree TM - S hemisphere CM 3 deg W,Between 6 deg West and 0 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1933,6-degree TM - N hemisphere CM 3 deg E,Between 0 and 6 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1934,6-degree TM - S hemisphere CM 3 deg E,Between 0 and 6 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1935,6-degree TM - N hemisphere CM 9 deg E,Between 6 and 12 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1936,6-degree TM - S hemisphere CM 9 deg E,Between 6 and 12 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1937,6-degree TM - N hemisphere CM 15 deg E,Between 12 and 18 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1938,6-degree TM - S hemisphere CM 15 deg E,Between 12 and 18 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1939,6-degree TM - N hemisphere CM 21 deg E,Between 18 and 24 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1940,6-degree TM - S hemisphere CM 21 deg E,Between 18 and 24 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1941,6-degree TM - N hemisphere CM 27 deg E,Between 24 and 30 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1942,6-degree TM - S hemisphere CM 27 deg E,Between 24 and 30 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1943,6-degree TM - N hemisphere CM 33 deg E,Between 30 and 36 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1944,6-degree TM - S hemisphere CM 33 deg E,Between 30 and 36 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1945,6-degree TM - N hemisphere CM 39 deg E,Between 36 and 42 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1946,6-degree TM - S hemisphere CM 39 deg E,Between 36 and 42 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1947,6-degree TM - N hemisphere CM 45 deg E,Between 42 and 48 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1948,6-degree TM - S hemisphere CM 45 deg E,Between 42 and 48 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1949,6-degree TM - N hemisphere CM 51 deg E,Between 48 and 54 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1950,6-degree TM - S hemisphere CM 51 deg E,Between 48 and 54 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1951,6-degree TM - N hemisphere CM 57 deg E,Between 54 and 60 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1952,6-degree TM - S hemisphere CM 57 deg E,Between 54 and 60 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1953,6-degree TM - N hemisphere CM 63 deg E,Between 60 and 66 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1954,6-degree TM - S hemisphere CM 63 deg E,Between 60 and 66 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1955,6-degree TM - N hemisphere CM 69 deg E,Between 66 and 72 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1956,6-degree TM - S hemisphere CM 69 deg E,Between 66 and 72 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1957,6-degree TM - N hemisphere CM 75 deg E,Between 72 and 78 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1958,6-degree TM - S hemisphere CM 75 deg E,Between 72 and 78 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1959,6-degree TM - N hemisphere CM 81 deg E,Between 78 and 84 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1960,6-degree TM - S hemisphere CM 81 deg E,Between 78 and 84 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1961,6-degree TM - N hemisphere CM 87 deg E,Between 84 and 90 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1962,6-degree TM - S hemisphere CM 87 deg E,Between 84 and 90 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1963,6-degree TM - N hemisphere CM 93 deg E,Between 90 and 96 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1964,6-degree TM - S hemisphere CM 93 deg E,Between 90 and 96 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1965,6-degree TM - N hemisphere CM 99 deg E,Between 96 and 102eg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1966,6-degree TM - S hemisphere CM 99 deg E,Between 96 and 102eg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1967,6-degree TM - N hemisphere CM 105 deg E,Between 102 and 108 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1968,6-degree TM - S hemisphere CM 105 deg E,Between 102 and 108 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1969,6-degree TM - N hemisphere CM 111 deg E,Between 108 and 114 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1970,6-degree TM - S hemisphere CM 111 deg E,Between 108 and 114 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1971,6-degree TM - N hemisphere CM 117 deg E,Between 114 and 120 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1972,6-degree TM - S hemisphere CM 117 deg E,Between 114 and 120 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1973,6-degree TM - N hemisphere CM 123 deg E,Between 120 and 126 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1974,6-degree TM - S hemisphere CM 123 deg E,Between 120 and 126 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1975,6-degree TM - N hemisphere CM 129 deg E,Between 126 and 132 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1976,6-degree TM - S hemisphere CM 129 deg E,Between 126 and 132 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1977,6-degree TM - N hemisphere CM 135 deg E,Between 132 and 138 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1978,6-degree TM - S hemisphere CM 135 deg E,Between 132 and 138 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1979,6-degree TM - N hemisphere CM 141 deg E,Between 138 and 144 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1980,6-degree TM - S hemisphere CM 141 deg E,Between 138 and 144 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1981,6-degree TM - N hemisphere CM 147 deg E,Between 144 and 150 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1982,6-degree TM - S hemisphere CM 147 deg E,Between 144 and 150 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1983,6-degree TM - N hemisphere CM 153 deg E,Between 150 and 156 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1984,6-degree TM - S hemisphere CM 153 deg E,Between 150 and 156 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1985,6-degree TM - N hemisphere CM 159 deg E,Between 156 and 162 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1986,6-degree TM - S hemisphere CM 159 deg E,Between 156 and 162 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1987,6-degree TM - N hemisphere CM 165 deg E,Between 162 and 168 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1988,6-degree TM - S hemisphere CM 165 deg E,Between 162 and 168 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1989,6-degree TM - N hemisphere CM 171 deg E,Between 168 and 174 deg East; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1990,6-degree TM - S hemisphere CM 171 deg E,Between 168 and 174 deg East; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1991,6-degree TM - N hemisphere CM 177 deg E,Between 174 and 180 deg; northern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1992,6-degree TM - S hemisphere CM 177 deg E,Between 174 and 180 deg; southern hemisphere.,,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+1993,WGS72BE / UTM zone 48N,Between 102 and 108 deg East; northern hemisphere.  Vietnam - offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1994,WGS72BE / UTM zone 49N,Between 108 and 114 deg East; northern hemisphere. Vietnam - offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1995,WGS72BE / UTM zone 49S,Between 108 and 114 deg East; southern hemisphere.  Indonesia - offshore.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+1996,UPS - north,Northern hemisphere polar area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1997,UPS - south,Southern hemisphere polar area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+1998,UTM north,Northern hemisphere between equator and 84 deg North.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+1999,UTM south,Southern hemisphere between equator and 80 deg South.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2000,WGS84 / UTM zone 1N,Between 180 deg and 174 deg West; northern hemisphere; Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2001,WGS84 / UTM zone 1S,Between 180 deg and 174 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2002,WGS84 / UTM zone 2N,Between 174 and 168 deg West; northern hemisphere. Russian Federation; United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2003,WGS84 / UTM zone 2S,Between 174 and 168 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2004,WGS84 / UTM zone 3N,Between 168 and 162 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2005,WGS84 / UTM zone 3S,Between 168 and 162 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2006,WGS84 / UTM zone 4N,Between 162 and 156 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2007,WGS84 / UTM zone 4S,Between 162 and 156 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2008,WGS84 / UTM zone 5N,Between 156 and 150 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2009,WGS84 / UTM zone 5S,Between 156 and 150 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2010,WGS84 / UTM zone 6N,Between 150 and 144 deg West; northern hemisphere. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2011,WGS84 / UTM zone 6S,Between 150 and 144 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2012,WGS84 / UTM zone 7N,Between 144 and 138 deg West; northern hemisphere. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2013,WGS84 / UTM zone 7S,Between 144 and 138 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2014,WGS84 / UTM zone 8N,Between 138 and 132 deg West; northern hemisphere. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2015,WGS84 / UTM zone 8S,Between 138 and 132 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2016,WGS84 / UTM zone 9N,Between 132 and 126 deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2017,WGS84 / UTM zone 9S,Between 132 and 126 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2018,WGS84 / UTM zone 10N,Between 126 and 120 deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2019,WGS84 / UTM zone 10S,Between 126 and 120 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2020,WGS84 / UTM zone 11N,Between 120 and 114 deg West; northern hemisphere. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2021,WGS84 / UTM zone 11S,Between 120 and 114 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2022,WGS84 / UTM zone 12N,Between 114 and 108 deg West; northern hemisphere. Canada - Alberta; North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2023,WGS84 / UTM zone 12S,Between 114 and 108 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2024,WGS84 / UTM zone 13N,Between 108 and 102 deg West; northern hemisphere. Canada - North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2025,WGS84 / UTM zone 13S,Between 108 and 102 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2026,WGS84 / UTM zone 14N,Between 102 and 96 deg West; northern hemisphere. Canada - Manitoba; Nunavut; Saskatchewan.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2027,WGS84 / UTM zone 14S,Between 102 and 96 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2028,WGS84 / UTM zone 15N,Between 96 and 90 deg West; northern hemisphere. Canada - Manitoba; Nunavut; Ontario.  Guatemala.  Mexico.  United States (USA) - Gulf of Mexico (GoM).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2029,WGS84 / UTM zone 15S,Between 96 and 90 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2030,WGS84 / UTM zone 16N,Between 90 and 84 deg West; northern hemisphere. Belize. Canada - Manitoba; Nunavut; Ontario.  Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. Puerto Rico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2031,WGS84 / UTM zone 16S,Between 90 and 84 deg West; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2032,WGS84 / UTM zone 17N,Between 84 and 78 deg West; northern hemisphere. Bahamas. Ecuador - north of equator. Canada - Nunavut; Ontario; Quebec.  Cayman Islands.  Colombia. Costa Rica. Jamaica. Nicaragua. Panama. Puerto Rico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2033,WGS84 / UTM zone 17S,Between 84 and 78 deg West; southern hemisphere. Ecuador. Peru.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2034,WGS84 / UTM zone 18N,Between 78 and 72 deg West; northern hemisphere. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2035,WGS84 / UTM zone 18S,Between 78 and 72 deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2036,WGS84 / UTM zone 19N,Between 72 and 66 deg West; northern hemisphere. Aruba. Bahamas. Brazil. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. Colombia. Dominican Republic. Greenland. Netherlands Antilles. Puerto Rico. Turks and Caicos Islands. United States. Venezuela.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2037,WGS84 / UTM zone 19S,Between 72 and 66 deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2038,WGS84 / UTM zone 20N,Between 66 and 60 deg West; northern hemisphere. Anguilla. Antigua & Barbuda. Bermuda. Brazil. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. Dominica. Greenland. Grenada. Guadeloupe. Guyana. Martinique. Montserrat. Saint Kitts and Nevis. Saint Lucia. Saint Vncent and the Grenadines. Trinidad and Tobago. Venezuela. Virgin islands.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2039,WGS84 / UTM zone 20S,Between 66 and 60 deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2086,WGS84 / UTM zone 44N,Between 78 and 84 deg East; northern hemisphere. China. India. Kazakstan. Kyrgyzstan. Nepal. Russian Federation. Sri Lanka.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2087,WGS84 / UTM zone 44S,Between 78 and 84 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2088,WGS84 / UTM zone 45N,Between 84 and 90 deg East; northern hemisphere. Bangladesh. Bhutan. China. India. Kazakstan. Mongolia. Nepal. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2089,WGS84 / UTM zone 45S,Between 84 and 90 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2090,WGS84 / UTM zone 46N,Between 90 and 96 deg East; northern hemisphere. Bangladesh. Bhutan. China. Indonesia. Mongolia. Myanmar (Burma). Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2091,WGS84 / UTM zone 46S,Between 90 and 96 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2092,WGS84 / UTM zone 47N,Between 96 and 102 deg East; northern hemisphere. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russian Federation. Thailand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2093,WGS84 / UTM zone 47S,Between 96 and 102 deg East; southern hemisphere. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2094,WGS84 / UTM zone 48N,Between 102 and 108 deg East; northern hemisphere. Cambodia. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Russian Federation. Singapore. Thailand. Vietnam.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2095,WGS84 / UTM zone 48S,Between 102 and 108 deg East; southern hemisphere. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2096,WGS84 / UTM zone 49N,Between 108 and 114 deg East; northern hemisphere. China. Hong Kong. Indonesia. Macau. Malaysia - East Malaysia - Sarawak. Mongolia. Russian Federation. Vietnam.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2097,WGS84 / UTM zone 49S,Between 108 and 114 deg East; southern hemisphere. Australia. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2098,WGS84 / UTM zone 50N,Between 114 and 120 deg East; northern hemisphere. Brunei. China. Hong Kong. Indonesia. Malaysia - East Malaysia - Sarawak. Mongolia. Philippines. Russian Federation. Taiwan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2099,WGS84 / UTM zone 50S,Between 114 and 120 deg East; southern hemisphere. Australia. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2100,WGS84 / UTM zone 51N,Between 120 and 126 deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Philippines. Russian Federation.  South Korea. Taiwan.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2101,WGS84 / UTM zone 51S,Between 120 and 126 deg East; southern hemisphere. Australia. East Timor. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2102,WGS84 / UTM zone 52N,Between 126 and 132 deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Russian Federation. South Korea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2103,WGS84 / UTM zone 52S,Between 126 and 132 deg East; southern hemisphere. Australia. East Timor. Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2104,WGS84 / UTM zone 53N,Between 132 and 138 deg East; northern hemisphere. China. Japan. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2105,WGS84 / UTM zone 53S,Between 132 and 138 deg East; southern hemisphere. Australia.  Indonesia.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2106,WGS84 / UTM zone 54N,Between 138 and 144 deg East; northern hemisphere. Japan. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2107,WGS84 / UTM zone 54S,Between 138 and 144 deg East; southern hemisphere. Australia. Indonesia. Papua New Guinea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2108,WGS84 / UTM zone 55N,Between 144 and 150 deg East; northern hemisphere. Japan. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2109,WGS84 / UTM zone 55S,Between 144 and 150 deg East; southern hemisphere. Australia. Papua New Guinea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2110,WGS84 / UTM zone 56N,Between 150 and 156 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2111,WGS84 / UTM zone 56S,Between 150 and 156 deg East; southern hemisphere. Australia. Papua New Guinea.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2112,WGS84 / UTM zone 57N,Between 156 and 162 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2113,WGS84 / UTM zone 57S,Between 156 and 162 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2114,WGS84 / UTM zone 58N,Between 162 and 168 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2115,WGS84 / UTM zone 58S,Between 162 and 168 deg East; southern hemisphere.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2116,WGS84 / UTM zone 59N,Between 168 and 174 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2117,WGS84 / UTM zone 59S,Between 168 and 174 deg East; southern hemisphere. New Zealand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2118,WGS84 / UTM zone 60N,Between 174 and 180 deg East; northern hemisphere. Russian Federation.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2119,WGS84 / UTM zone 60S,Between 174 and 180 deg East; southern hemisphere. New Zealand.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2120,Guatemala - N of 15 deg 50 min N,Guatemala - north of 15 deg 50 min North.,,,,,EPSG,EPSG,1999-08-16 00:00:00,,0
+2121,Guatemala - S of 15 deg 50 min N,Guatemala - south of 15 deg 50 min North.,,,,,EPSG,EPSG,2000-01-06 00:00:00,,0
+2122,Europe - ETRS89 / UTM 28,Europe - between 18 and 12 deg West - United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2123,Europe - ETRS89 / UTM 29,Europe - between 12 and 6 deg West - United Kingdom (UKCS) offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2124,Europe - ETRS89 / UTM 30,Europe - between 6 and 0 deg West.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2125,Europe - ETRS89 / UTM 31,Europe - between 0 and 6 deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2126,Europe - ETRS89 / UTM 32,Europe - between 6 and 12deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2127,Europe - ETRS89 / UTM 33,Europe - between 12 and 18deg East - Germany - Brandenburg; Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2128,Europe - ETRS89 / UTM 34,Europe - between 18 and 24deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2129,Europe - ETRS89 / UTM 35,Europe - between 24 and 30deg East - Norway.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2130,Europe - ETRS89 / UTM 36,Europe - between 30 and 36deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2131,Europe - ETRS89 / UTM 37,Europe - between 36 and 42deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2132,Europe - ETRS89 / UTM 38,Europe - between 42 and 48deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2133,North America - UTM zone 3,North America - between 168 and 162 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2134,North America - UTM zone 4,North America - between 162 and 156 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2135,North America - UTM zone 5,North America - between 156 and 150 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2136,North America - UTM zone 6,North America - between 150 and 144 deg West. United States (USA) - Alaska.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2137,North America - UTM zone 7,North America - between 144 and 138 deg West. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2138,North America - UTM zone 8,North America - between 138 and 132 deg West. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2139,North America - UTM zone 9,North America - between 132 and 126 deg West. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2140,North America - UTM zone 10,North America - between 130 and 120 deg West. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2141,North America - UTM zone 11,North America - between 120 and 114 deg West. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2142,North America - UTM zone 12,North America - between 114 and 108 deg West. Canada - Alberta; North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2143,North America - UTM zone 13,North America - between 108 and 102 deg West. Canada - North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2144,North America - UTM zone 14,North America - between 102 and 96 deg West. Canada - Manitoba; Nunavut; Saskatchewan.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2145,North America - UTM zone 15,North America - between 96 and 90 deg West. Canada - Manitoba; Nunavut; Ontario.  Guatemala.  Mexico.  United States (USA) - Gulf of Mexico (GoM).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2146,North America - UTM zone 16,North America - between 90 and 84 deg West.  Belize. Canada - Manitoba; Nunavut; Ontario.  Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2147,North America - UTM zone 17,North America - between 84 and 78 deg West. Canada - Nunavut; Ontario; Quebec.  Mexico.  United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2148,North America - UTM zone 18,North America - between 78 and 72 deg West. Canada - Nunavut; Ontario; Quebec. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2149,North America - UTM zone 19,North America - between 72 and 66 deg West. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. United States (USA).,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2150,North America - UTM zone 20,North America - between 66 and 60 deg West. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. United States (USA) offshore Atlantic,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2151,Canada - UTM zone 21,North America - between 60 and 54 deg West. Canada - Newfoundland; Quebec.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2152,Canada - UTM zone 22,North America - between 54 and 48 deg West. Canada - Newfoundland.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2153,Canada - UTM zone 23,North America - Canada offshore Atlantic - between 48 and 42 deg West.,,,,,EPSG,EPSG,1995-06-02 00:00:00,,0
+2154,USA - Alabama - SPCS - E,United States (USA) - Alabama east of approximately 86d 37m West - counties Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; St.Clair; Talladega; Tallapoosa.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2155,USA - Alabama - SPCS - W,United States (USA) - Alabama west of approximately 86d 37m West - counties Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2156,USA - Alaska - Panhandle,United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.,,,,,EPSG,EPSG,1996-09-12 00:00:00,,0
+2157,USA - Alaska - Aleutian Islands,United States (USA) - Alaska - Aleutian Islands.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2158,USA - Alaska - 144 to 141 deg W,United States (USA) - Alaska - 144 to 141 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2159,USA - Alaska - 148 to 144 deg W,United States (USA) - Alaska - 148 to 144 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2160,USA - Alaska - 152 to 148 deg W,United States (USA) - Alaska - 152 to 148 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2161,USA - Alaska - 156 to 152 deg W,United States (USA) - Alaska - 156 to 152 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2162,USA - Alaska - 160 to 156 deg W,United States (USA) - Alaska - 160 to 156 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2163,USA - Alaska - 164 to 160 deg W,United States (USA) - Alaska - 164 to 160 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2164,USA - Alaska - N of 54.5 deg N; 168 to 164 deg W,United States (USA) - Alaska - north of 54d 30m North and between 168 to 164 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2165,USA - Alaska - N of 54.5 deg N; W of 168 deg W,United States (USA) - Alaska - north of 54d 30m North and west of 168 deg West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2166,USA - Arizona - SPCS - central,United States (USA) - Arizona between approximately 110d 45m and 113d 20m West - counties Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2167,USA - Arizona - SPCS - E,United States (USA) - Arizona east of approximately 110d 45m West - counties Apache; Cochise; Gila; Graham; Greenlee; Navajo.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2168,USA - Arizona - SPCS - W,United States (USA) - Arizona west of approximately 113d 20m West - counties La Paz; Mohave; Yuma.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2169,USA - Arkansas - SPCS - N,United States (USA) - Arkansas north of approximately 34d 50m North - counties Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawrence; Logan; Madison; Marion; Mississippi; Newton; Perry; Poinsett; Pope; Randolph; Scott; Searcy; Sebastian; Sharp; St. Francis; Stone; Van Buren; Washington; White; Woodruff; Yell.,,,,,EPSG,EPSG,1999-04-22 [...]
+2170,USA - Arkansas - SPCS - S,United States (USA) - Arkansas south of approximately 34d 50m North - counties Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln; Little River; Lonoke; Miller; Monroe; Montgomery; Nevada; Ouachita; Phillips; Pike; Polk; Prairie; Pulaski; Saline; Sevier; Union.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2171,USA - GoM OCS - W of 96 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) west of approximately 96 deg West - protraction areas Corpus Christi; Port Isabel.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2172,USA - GoM OCS - 96 to 90 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) between approximately 96 deg and 90 deg West - protraction areas East Breaks (EB); Alaminos Canyon (AC); Garden Banks (GB); Keathley Canyon (KC); Ewing Bank (EW); Green Canyon (GC); Walker Ridge (WR).,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2173,USA - GoM OCS - 90 to 84 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) between approximately 90 deg and 84 deg West - protraction areas Mobile (MO); Viosca Knoll (VK); Mississippi Canyon (MC); Atwater Valley (AT); Lund; Pensacola; Destin Dome (DD); De Soto Canyon; Lloyd; Henderson; Apalachicola; Florida Middle Ground; The Elbow; Vernon Basin; Howell Hook; Rankin.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2174,USA - GoM OCS - E of 84 deg W,United States (USA) - Gulf of Mexico outer continental shelf (GoM OCS) east of approximately 84 deg West - protraction areas Gainesville; Tarpon Springs; St. Petersburg; Charlotte Harbor; Pulley Ridge; Dry Tortugas; Miami; Key West.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2175,USA - California - SPCS - 1,United States (USA) - California north of approximately 40 deg North - counties Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2176,USA - California - SPCS - 2,United States (USA) - California between approximately 40 deg & 38d 15m North - counties Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2177,USA - California - SPCS - 3,United States (USA) - California between approximately 38d 15m & 37d North - counties Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2178,USA - California - SPCS - 4,United States (USA) - California between approximately 37d & 35d 30m North - counties Fresno; Inyo; Kings; Monterey; San Benito; Tulare.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2179,USA - California - SPCS27 - 5,United States (USA) - California between approximately 35d 50m & 34d North excluding LA - counties Kern; San Bernardino; San Luis Obispo; Santa Barbara; Ventura.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2180,USA - California - SPCS - 6,United States (USA) - California south of approximately 38d 30m North - counties Imperial; Orange; Riverside; San Diego.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2181,USA - California - SPCS27 - 7,United States (USA) - California - Los Angeles county.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2182,USA - California - SPCS83 - 5,United States (USA) - California between approximately 35d 50m & 34d North - counties Kern; Los Angeles; San Bernardino; San Luis Obispo; Santa Barbara; Ventura.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2183,USA - Colorado - SPCS - C,United States (USA) - Colorado between approximately 39d 50m & 38d 30m North - counties Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Park; Pitkin; Summit; Teller.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2184,USA - Colorado - SPCS - N,United States (USA) - Colorado north of approximately 39d 50m North - counties Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2185,USA - Colorado - SPCS - S,United States (USA) - Colorado south of approximately 38d 30m North - counties Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowers; Pueblo; Rio Grande; Saguache; San Juan; San Miguel.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2186,USA - Florida - SPCS - E,United States (USA) - Florida east of approximately 81d 45m West - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie; Volusia.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2187,USA - Florida - SPCS - N,United States (USA) - Florida north of approximately 29d 30m North & west of approximately 82d West - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Rosa; Suwannee; Taylor; Union; Wakulla; Walton; Washington.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2188,USA - Florida - SPCS - W,United States (USA) - Florida west of approximately 81d 45m West & south of approximately 29d 30m North - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2189,USA - Georgia - SPCS - E,United States (USA) - Georgia east of approximately 83d 15m West - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn; Greene; Hancock; Hart; Jeff Davis; Jefferson; Jenkins; Johnson; Lanier; Laurens; Liberty; Lincoln; Long; Madison; McDuffie; McIntosh; Montgomery; Oglethorpe; Pierce; Richmond;  [...]
+2190,USA - Georgia - SPCS - W,United States (USA) - Georgia west of approximately 83d 15m West - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford; Crisp; Dade; Dawson; De Kalb; Decatur; Dooly; Dougherty; Douglas; Early; Fannin; Fayette; Floyd; Forsyth; Fulton; Gilmer; Gordon; Grady; Gwinnett; Habersham; Hall; Haralson; Har [...]
+2191,USA - Idaho - SPCS - central,United States (USA) - Idaho between approximately 113d & 115d West - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2192,USA - Idaho - SPCS - E,United States (USA) - Idaho east of approximately 113d West - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2193,USA - Idaho - SPCS - W,United States (USA) - Idaho - west of approximately 115d West - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2194,USA - Illinois - SPCS - E,United States (USA) - Illinois east of approximately 89d 05m West - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasper; Jefferson; Johnson; Kane; Kankakee; Kendall; La Salle; Lake; Lawrence; Livingston; Macon; Marion; Massac; McHenry; McLean; Moultrie; Piatt; Pope; Richland; Saline; Shelby; V [...]
+2195,USA - Illinois - SPCS - W,United States (USA) - Illinois west of approximately 89d 05m West - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Mason; McDonough; Menard; Mercer; Monroe; Montgomery; Morgan; Ogle; Peoria; Perry; Pike; Pulaski; Putnam; Randolph; Rock Island; Sangamon; Schuyler; Scott; St. Clair; Stark; Steph [...]
+2196,USA - Indiana - SPCS - E,United States (USA) - Indiana east of approximately 86d 25m West - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jackson; Jay; Jefferson; Jennings; Johnson; Kosciusko; Lagrange; Madison; Marion; Marshall; Miami; Noble; Ohio; Randolph; Ripley; Rush; Scott; Shelby; St. Joseph; Steuben; Switzerla [...]
+2197,USA - Indiana - SPCS - W,United States (USA) - Indiana west of approximately 86d 25m West - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Parke; Perry; Pike; Porter; Posey; Pulaski; Putnam; Spencer; Starke; Sullivan; Tippecanoe; Vanderburgh; Vermillion; Vigo; Warren; Warrick; White.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2198,USA - Iowa - SPCS - N,United States (USA) - Iowa north of approximately 42deg North - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; Franklin; Greene; Grundy; Hamilton; Hancock; Hardin; Howard; Humboldt; Ida; Jackson; Jones; Kossuth; Linn; Lyon; Marshall; Mitchell; Monona; O'Brien; Osceola; Palo Alto; Plymouth; Po [...]
+2199,USA - Iowa - SPCS - S,United States (USA) - Iowa south of approximately 42deg North - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Mahaska; Marion; Mills; Monroe; Montgomery; Muscatine; Page; Polk; Pottawattamie; Poweshiek; Ringgold; Scott; Shelby; Taylor; Union; Van Buren; Wapello; Warren; Washington; Wayne.,,,, [...]
+2200,USA - Kansas - SPCS - N,United States (USA) - Kansas north of approximately 38d 45m North - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Morris; Nemaha; Norton; Osborne; Ottawa; Phillips; Pottawatomie; Rawlins; Republic; Riley; Rooks; Russell; Saline; Shawnee; Sheridan; Sherman; Smith; Thomas; Trego; Wabaunsee; Wal [...]
+2201,USA - Kansas - SPCS - S,United States (USA) - Kansas south of approximately 38d 45m North - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Harper; Harvey; Haskell; Hodgeman; Kearny; Kingman; Kiowa; Labette; Lane; Linn; Lyon; Marion; McPherson; Meade; Miami; Montgomery; Morton; Neosho; Ness; Osage; Pawnee; Pratt; Reno; [...]
+2202,USA - Kentucky - SPCS - N,United States (USA) - Kentucky north of approximately 37d 55m North - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawrence; Lewis; Mason; Menifee; Montgomery; Morgan; Nicholas; Oldham; Owen; Pendleton; Robertson; Rowan; Scott; Shelby; Spencer; Trimble; Woodford.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2203,USA - Kentucky - SPCS - S,United States (USA) - Kentucky south of approximately 37d 55m North - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton; Garrard; Graves; Grayson; Green; Hancock; Hardin; Harlan; Hart; Henderson; Hickman; Hopkins; Jackson; Johnson; Knott; Knox; Larue; Laurel; Lee; Leslie; Letcher; Lincoln; Liv [...]
+2204,USA - Louisiana - SPCS - N,United States (USA) - Louisiana north of approximately 30d 55m North - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; Red River; Richland; Sabine; Tensas; Union; Vernon; Webster; West Carroll; Winn.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2205,USA - Louisiana - SPCS27 - S,United States (USA) - Louisiana south of approximately 30d 55m North - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; [...]
+2206,USA - Maine - SPCS - E,United States (USA) - Maine east of approximately 69d 30m West - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2207,USA - Maine - SPCS - W,United States (USA) - Maine west of approximately 69d 30m West - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2208,USA - Massachusetts - SPCS - islands,United States (USA) - Massachusetts offshore - counties of Dukes; Nantucket.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2209,USA - Massachusetts - SPCS - mainland,United States (USA) - Massachusetts onshore - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2210,USA - Montana - SPCS27 - central,United States (USA) - Montana between approximately 47d 50m & 46d 40m North - counties of Cascade; Dawson; Fergus; Garfield; Judith Basin; Lake; Lewis and Clark; McCone; Meagher; Mineral; Missoula; Petroleum; Powell; Prairie; Richland; Sanders; Wibaux.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2211,USA - Montana - SPCS27 - N,United States (USA) - Montana north of approximately 47d 50m North - counties of Blaine; Chouteau; Daniels; Flathead; Glacier; Hill; Liberty; Lincoln; Phillips; Pondera; Roosevelt; Sheridan; Teton; Toole; Valley.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2212,USA - Montana - SPCS27 - S,United States (USA) - Montana south of approximately 46d 40m North - counties of Beaverhead; Big Horn; Broadwater; Carbon; Carter; Custer; Deer Lodge; Fallon; Gallatin; Golden Valley; Granite; Jefferson; Madison; Musselshell; Park; Powder River; Ravalli; Rosebud; Silver Bow; Stillwater; Sweet Grass; Treasure; Wheatland; Yellowstone.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2213,USA - Minnesota - SPCS - central,United States (USA) - Minnesota between approximately 47d 10m & 45d 30m North - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2214,USA - Minnesota - SPCS - N,United States (USA) - Minnesota north of approximately 47d 10m North - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2215,USA - Minnesota - SPCS - S,United States (USA) - Minnesota south of approximately 45d 30m North - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Martin; McLeod; Meeker; Mower; Murray; Nicollet; Nobles; Olmsted; Pipestone; Ramsey; Redwood; Renville; Rice; Rock; Scott; Sherburne; Sibley; Steele; Swift; Wabasha; Waseca; Wa [...]
+2216,USA - Mississippi - SPCS - E,United States (USA) - Mississippi east of approximately 89d 40m West - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; Lee; Lowndes; Marshall; Monroe; Neshoba; Newton; Noxubee; Oktibbeha; Pearl River; Perry; Pontotoc; Prentiss; Scott; Smith; Stone; Tippah; Tishomingo; Union; Wayne; Webster; W [...]
+2217,USA - Mississippi - SPCS - W,United States (USA) - Mississippi west of approximately 89d 40m West - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Montgomery; Panola; Pike; Quitman; Rankin; Sharkey; Simpson; Sunflower; Tallahatchie; Tate; Tunica; Walthall; Warren; Washington; Wilkinson; Yalobusha; Yazoo.,,,,,EPSG,EPSG,2001 [...]
+2218,USA - Missouri - SPCS - central,United States (USA) - Missouri between approximately 91d 45m & 93d 35m West - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Mercer; Miller; Moniteau; Monroe; Morgan; Osage; Ozark; Pettis; Phelps; Polk; Pulaski; Putnam; Randolph; Saline; Schuyler; Scotland; Shelby; Stone; Sullivan; Taney; T [...]
+2219,USA - Missouri - SPCS - E,United States (USA) - Missouri east of approximately 91d 45m West - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Perry; Pike; Ralls; Reynolds; Ripley; Scott; Shannon; St. Charles; St. Francois; St. Louis; Ste. Genevieve; Stoddard; Warren; Washington; Wayne.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2220,USA - Missouri - SPCS - W,United States (USA) - Missouri west of approximately 93d 35m West - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newton; Nodaway; Platte; Ray; St. Clair; Vernon; Worth.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2221,USA - Nebraska - SPCS27 - N,United States (USA) - Nebraska - counties of Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2222,USA - Nebraska - SPCS27 - S,United States (USA) - Nebraska - counties of Adams; Arthur; Banner; Boone; Buffalo; Butler; Cass; Chase; Cheyenne; Clay; Colfax; Custer; Dawson; Deuel; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Gosper; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Howard; Jefferson; Johnson; Kearney; Keith; Kimball; Lancaster; Lincoln; Logan; McPherson; Merrick; Morrill; Nance; Nemaha; Nuckolls; Otoe; Pawnee; Perkins; Phelps; Platte;  [...]
+2223,USA - Nevada - SPCS - central,United States (USA) - Nevada between approximately 117d 15m and 116d West - counties of Lander; Nye.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2224,USA - Nevada - SPCS - E,United States (USA) - Nevada east of approximately 116d  West - counties of Clark; Elko; Eureka; Lincoln; White Pine.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2225,USA - Nevada - SPCS - W,United States (USA) - Nevada west of approximately 117d 15m West - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2226,Canada - Newfoundland - E of 54.5 deg W,Canada - Newfoundland - east of 54 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2227,Canada - Newfoundland - 57.5 to 54.5 deg W,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2228,USA - New Mexico - SPCS - E,United States (USA) - New Mexico east of approximately 105d West - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2229,USA - New Mexico - SPCS27 - central,United States (USA) - New Mexico between approximately 105d & 107d 15m West - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2230,USA - New Mexico - SPCS27 - W,United States (USA) - New Mexico west of approximately 107d 15m West - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2231,USA - New Mexico - SPCS83 - central,United States (USA) - New Mexico between approximately 105d & 107d 15m West - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance; Valencia.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2232,USA - New Mexico - SPCS83 - W,United States (USA) - New Mexico west of approximately 107d 15m West - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2233,USA - New York - SPCS - central,United States (USA) - New York between approximately 75d 15m & 77d 30m West - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2234,USA - New York - SPCS - E,United States (USA) - New York mainland east of approximately 75d 15m West - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence; Sullivan; Ulster; Warren; Washington; Westchester.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2235,USA - New York - SPCS - Long island,United States (USA) - New York - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2236,USA - New York - SPCS - W,United States (USA) - New York west of approximately 77d 30m West - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2237,USA - North Dakota - SPCS - N,United States (USA) - North Dakota north of approximately 47d 25m North - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Traill; Walsh; Ward; Wells; Williams.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2238,USA - North Dakota - SPCS - S,United States (USA) - North Dakota south of approximately 47d 25m North - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slope; Stark; Stutsman.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2239,USA - Ohio - SPCS - N,United States (USA) - Ohio north of approximately 40d 15m North - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan; Lorain; Lucas; Mahoning; Marion; Medina; Mercer; Morrow; Ottawa; Paulding; Portage; Putnam; Richland; Sandusky; Seneca; Shelby; Stark; Summit; Trumbull; Tuscarawas; Union; Van We [...]
+2240,USA - Ohio - SPCS - S,United States (USA) - Ohio south of approximately 40d 15m North - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Meigs; Miami; Monroe; Montgomery; Morgan; Muskingum; Noble; Perry; Pickaway; Pike; Preble; Ross; Scioto; Vinton; Warren; Washington.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2241,USA - Oklahoma - SPCS - N,United States (USA) - Oklahoma north of approximately 35d 20m North - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata; Okfuskee; Oklahoma; Okmulgee; Osage; Ottawa; Pawnee; Payne; Roger Mills; Rogers; Sequoyah; Texas; Tulsa; Wagoner; Washington; Woods; Woodward.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2242,USA - Oklahoma - SPCS - S,United States (USA) - Oklahoma south of approximately 35d 20m North - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McClain; McCurtain; McIntosh; Murray; Pittsburg; Pontotoc; Pottawatomie; Pushmataha; Seminole; Stephens; Tillman; Washita.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2243,USA - Oregon - SPCS - N,United States (USA) - Oregon north of approximately 44d 15m North - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; Yamhill.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2244,USA - Oregon - SPCS - S,United States (USA) - Oregon south of approximately 44d 15m North - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2245,USA - Pennsylvania - SPCS - N,United States (USA) - Pennsylvania north of approximately 40d 50m North - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike; Potter; Sullivan; Susquehanna; Tioga; Union; Venango; Warren; Wayne; Wyoming.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2246,USA - Pennsylvania - SPCS - S,United States (USA) - Pennsylvania south of approximately 40d 50m North - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; Lawrence; Lebanon; Lehigh; Mifflin; Montgomery; Northampton; Perry; Philadelphia; Schuylkill; Snyder; Somerset; Washington; Westmoreland; York.,,,,,EPSG,EPSG,2001-11-06 00 [...]
+2247,USA - South Carolina  - SPCS27 - N,United States (USA) - South Carolina - counties of Abbeville; Anderson; Calhoun; Cherokee; Chester; Chesterfield; Darlington; Dillon; Edgefield; Fairfield; Florence; Greenville; Greenwood; Horry; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Pickens; Richland; Saluda; Spartanburg; Sumter; Union; York.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2248,USA - South Carolina  - SPCS27 - S,United States (USA) - South Carolina - counties of Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg; Williamsburg.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2249,USA - South Dakota - SPCS - N,United States (USA) - South Dakota north of approximately 44d 20m North - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Potter; Roberts; Spink; Sully; Walworth; Ziebach.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2250,USA - South Dakota - SPCS - S,United States (USA) - South Dakota south of approximately 44d 20m North - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook; Mellette; Miner; Minnehaha; Moody; Pennington; Sanborn; Shannon; Stanley; Todd; Tripp; Turner; Union; Yankton.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2251,Caribbean - Puerto Rico and the US Virgin Islands,Puerto Rico and Virgin Islands (US).,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2252,USA - Texas - SPCS - central,United States (USA) - Texas between approximately 32deg & 30d 10m North - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie; Glasscock; Grimes; Hamilton; Hardin; Houston; Hudspeth; Irion; Jasper; Jeff Davis; Kimble; Lampasas; Lee; Leon; Liberty; Limestone; Llano; Loving; Madison; Mason;  [...]
+2253,USA - Texas - SPCS - N,United States (USA) - Texas north of approximately 34d 20m North - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Roberts; Sherman; Swisher; Wheeler.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2254,USA - Texas - SPCS - N central,United States (USA) - Texas between approximately 34d 20m & 32deg North - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foard; Franklin; Gaines; Garza; Grayson; Gregg; Hale; Hardeman; Harrison; Haskell; Henderson; Hill; Hockley; Hood; Hopkins; Howard; Hunt; Jack; Johnson; Jones; Kaufma [...]
+2255,USA - Texas - SPCS27 - S,United States (USA) - Texas south of approximately 28d 05m North - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata.  Gulf of Mexico outer continental shelf (GoM OCS) protraction areas: South Padre Island; North Padre Island; Mustang Island.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2256,USA - Texas - SPCS27 - S central,United States (USA) - Texas between approximately 30d 10m & 28d 05m North - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Ter [...]
+2257,USA - Utah - SPCS - central,United States (USA) - Utah between approximately 40d 50m & 38d 30m North - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2258,USA - Utah - SPCS - N,United States (USA) - Utah north of approximately 40d 50m North - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2259,USA - Utah - SPCS - S,United States (USA) - Utah south of approximately 38d 30m North - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2260,USA - Virginia - SPCS - N,United States (USA) - Virginia north of approximately 38d 05m North - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spotsylvania; Stafford; Warren; Westmoreland.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2261,USA - Virginia - SPCS - S,United States (USA) - Virginia south of approximately 38d 05m North - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colonial Heights; Craig; Cumberland; Dickenson; Dinwiddie; Essex; Floyd; Fluvanna; Franklin; Giles; Gloucester; Goochland; Grayson; Greensville; Halifax; Hampton; Hanover; Henrico [...]
+2262,USA - Washington - SPCS27 - N,United States (USA) - Washington north of approximately 47d 30m North - counties of Chelan; Clallam; Douglas; Ferry; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2263,USA - Washington - SPCS27 - S,United States (USA) - Washington south of approximately 47d 30m North - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2264,USA - West Virginia - SPCS - N,United States (USA) - West Virginia north of approximately 39deg North - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; Wetzel; Wirt; Wood.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2265,USA - West Virginia - SPCS - S,United States (USA) - West Virginia south of approximately 39deg North - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; Randolph; Roane; Summers; Upshur; Wayne; Webster; Wyoming.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2266,USA - Wisconsin - SPCS - central,United States (USA) - Wisconsin between approximately 45d 35m & 44d 15m North - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. Croix; Taylor; Trempealeau; Waupaca; Wood.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2267,USA - Wisconsin - SPCS - N,United States (USA) - Wisconsin north of approximately 45d 35m North - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2268,USA - Wisconsin - SPCS - S,United States (USA) - Wisconsin south of approximately 44d 15m North - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; Richland; Rock; Sauk; Sheboygan; Vernon; Walworth; Washington; Waukesha; Waushara; Winnebago.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2269,USA - Wyoming - SPCS - E,United States (USA) - Wyoming east of approximately 106d West - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2270,USA - Wyoming - SPCS - E central,United States (USA) - Wyoming between approximately 106d & 108d 10m West - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2271,USA - Wyoming - SPCS - W,United States (USA) - Wyoming west of approximately 109d 40m West - counties of Lincoln; Sublette; Teton; Uinta.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2272,USA - Wyoming - SPCS - W central,United States (USA) - Wyoming between approximately 108d 10m & 109d 40m West - counties of Fremont; Hot Springs; Park; Sweetwater.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2273,USA - Washington - SPCS83 - N,United States (USA) - Washington north of approximately 47d 30m North - counties of Chelan; Clallam; Douglas; Ferry; Grant north of approximately 47d30m; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2274,USA - Washington - SPCS83 - S,United States (USA) - Washington south of approximately 47d 30m North - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant south of approximately 47d30m; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2275,Canada - Newfoundland - 60.5 to 57.5 deg W,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2276,Canada - Quebec and Newfoundland - 63 to 60 deg W,Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2277,Canada - Quebec and Newfoundland - 66 to 63 deg W,Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2278,Canada - Quebec and Newfoundland - 69 to 66 deg W,Canada - Quebec and Newfoundland (Labrador) between 69 deg and  66 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2279,Canada - Quebec and Ontario - 75 to 72 deg W,Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2280,Canada - Quebec and Ontario - 78 to 75 deg W,Canada - Quebec and Ontario - between 78 deg and 75 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2281,Canada - Quebec and Ontario - MTM zone 10,Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2282,Cote d'Ivoire (Ivory Coast) - Abidjan area,C�te d'Ivoire (Ivory Coast) - Abidjan area.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2283,Australia - Australian Capital Territory (ACT),Australia - Australian Capital Territory (ACT).,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2284,Australia - Northern Territory (NT),Australia - Northern Territory (NT).,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2285,Australia - Victoria,Australia - Victoria.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2286,Australia - New South Wales (NSW and Victoria,Australia - New South Wales (NSW) and Victoria.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2287,Australia - SE Australia (ACT NSW VIC),"Australia - Australian Capital Territory (ACT), New South Wales (NSW), Victoria.",,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2288,American Samoa - Tutuila and Aunu'u islands,American Samoa - Tutuila and Aunu'u islands.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2289,"American Samoa - Ofu, Olesega and Ta'u islands","American Samoa - Ofu, Olesega and Ta'u islands.",,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2290,Canada - Quebec and Newfoundland - MTM zone 3,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.,,,,,EPSG,EPSG,1997-11-13 00:00:00,,0
+2291,Australasia - Australia and PNG - 150 to 156 deg E,Australia - between 150 and 156 deg East.  Papua New Guinea east of 150 deg East.,,,,,EPSG,EPSG,1995-12-02 00:00:00,,0
+2292,Myanmar (Burma) - 15 to 21 deg N,Myanmar (Burma) - between 15 and 21 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2293,Myanmar (Burma) - S of 15 deg N,Myanmar (Burma) - south of 15 deg North.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2294,Asia - Middle East - Iraq zone,Islamic Republic of Iran - south of 36 deg North. Iraq. Kuwait.,,,,,EPSG,EPSG,1996-04-12 00:00:00,,0
+2295,Caribbean - Windward and Leeward Islands,Windward Islands - Dominica  Grenada  Saint Lucia  Saint Vincent;  Leeward Islands - Anguilla   Antigua (excluding Barbuda)  Montserrat   Saint Kitts and Nevis; Barbados.,,,,,EPSG,EPSG,1999-04-22 00:00:00,,0
+2296,Cote d'Ivoire (Ivory Coast) - offshore.,C�te d'Ivoire (Ivory Coast) - offshore.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2297,USA - California - N of 38 deg N,United States (USA) - California north of 38 deg North.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2298,USA - California - S of 38 deg N,United States (USA) - California south of 38 deg North,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2299,3-degree TM - N hemisphere CM 3 deg E,"Between 1 deg 30 min and 4 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2300,3-degree TM - N hemisphere CM 6 deg E,"Between 4 deg 30 min and 7 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2301,3-degree TM - N hemisphere CM 9 deg E,"Between 7 deg 30 min and 10 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2302,3-degree TM - N hemisphere CM 12 deg E,"Between 10 deg 30 min and 13 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2303,3-degree TM - N hemisphere CM 15 deg E,"Between 13 deg 30 min and 16 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2304,3-degree TM - N hemisphere CM 18 deg E,"Between 16 deg 30 min and 19 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2305,3-degree TM - N hemisphere CM 21 deg E,"Between 19 deg 30 min and 22 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2306,3-degree TM - N hemisphere CM 24 deg E,"Between 22 deg 30 min and 25 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2307,Brazil - Campos; Espirito Santo and Santos basins,Brazil - Campos; Espirito Santo and Santos basins.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2308,Brazil - Tucano basin north,Brazil - Tucano basin north.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2309,Brazil - Tucano basin central,Brazil - Tucano basin central.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2310,Brazil - Tucano basin south,Brazil - Tucano basin south.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2311,Africa - Kenya and Tanzania,Kenya; Tanzania.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2312,"Africa - Botswana, Lesotho, Malawi, Swaziland, Zaire, Zambia, Zimbabwe",Botswana; Lesotho; Malawi; Swaziland; Zaire; Zambia; Zimbabwe.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2313,Canada - Nova Scotia,Canada - Nova Scotia.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2314,Asia - Caspian FSU states,Azerbaijan; Kazakstan; Russian Federation; Turkmenistan - Caspian Sea,,,,,EPSG,EPSG,1999-09-07 00:00:00,,0
+2315,Colombia - Cusiana,Colombia - Casanare province BP Cusiana/Cupiagua field areas.  Also used by Total in Rivera and Gatanas blocks.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2316,Angola - offshore block 5,Angola - offshore block 5.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2317,Angola - offshore block 2,Angola - offshore block 2.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2318,Angola - offshore block 3,Angola - offshore block 3.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2319,Angola - offshore block 7,Angola - offshore block 7.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2320,Angola - offshore blocks 7 8 24 + WGC spec,Angola - offshore blocks 7 and 8.  Also used rounded to integer metre in offshore block 24 and for GSI/HGS/Western Geophysical speculative seismic data throughout offshore Angola.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2321,Angola - offshore blocks 1 and 16,Angola - offshore blocks 1 and 16.,,,,,EPSG,EPSG,1998-12-14 00:00:00,,0
+2322,Angola - offshore blocks 3  7  15 and 17.,"Angola - offshore blocks 3, 7,15 and 17.",,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2323,Angola - offshore blocks 1 16 and 18.,"Angola - offshore blocks 1, 16 and 18.",,,,,EPSG,EPSG,1998-12-14 00:00:00,,0
+2324,Angola - offshore blocks 2  3 17 and 31-33.,"Angola - offshore blocks 2,  3, 17 and 31-33.",,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2325,Argentina - Neuquen province Chos Malal area,Argentina - Neuquen province - Chos Malal area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2326,Germany - former west Germany,Germany - former west Germany.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2327,Syria - Al Whaleed area,Syrian Arab Republic - Al Whaleed area,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2328,Syria - Shaddadeh area,Syrian Arab Republic - Shaddadeh area (36d N 41d E),,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2329,Syria - Deir area,Syrian Arab Republic - Deir area (35d 22m N 40d 06m E),,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2330,Europe - North Sea,Denmark - North Sea;  Germany - North Sea;  Netherlands - offshore;  Norway - North Sea south of 62 deg N; United Kingdom (UKCS) - North Sea south of 62 deg N.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2331,Norway - offshore N of 65 deg N,Norway - offshore north of 65 deg North.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2332,Norway - offshore N of 65 deg N;  Svalbard; Jan Mayen,Norway - offshore north of 65 deg N;  Svalbard and Jan Mayen Islands.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2333,Norway - offshore 62 to 65 deg N and W of 5 deg E,Norway - offshore between 62 and 65 deg North and west of 5 deg East.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2334,Norway - North Sea - offshore S of 62 deg N.,Norway - North Sea - offshore south of 62 deg North.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2335,Spain - Balearic Islands,Spain - Balearic Islands.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2336,Spain - mainland except northwest,Spain - mainland except northwest (north of 41 deg 30m N and west of 4 deg 30 min W).,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2337,Spain - northwest,Spain - northwest (north of 41 deg 30m N and west of 4 deg 30 min W).,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2338,Europe - Portugal and Spain,Portugal; Spain.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2339,Italy - Sardinia,Italy - Sardinia.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+2340,Italy - Sicily,Italy - Sicily.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2341,Egypt - Gulf of Suez,Egypt - Gulf of Suez.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2342,Europe - common offshore,Denmark - offshore. United Kingdom - UKCS offshore east of 6 deg West.,,,,,EPSG,EPSG,1998-06-30 00:00:00,,0
+2343,Europe - British Isles,Ireland; United Kingdom (UK).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2344,Europe - Finland and Norway,Finland; Norway.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2345,Asia - Middle East - Iraq; Israel; Jordan; Lebanon; Kuwait; Saudi Arabia; Syria.,Iraq; Israel; Jordan; Lebanon; Kuwait; Saudi Arabia; Syria.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2346,WGS72BE to WGS84,World.  Vietnam - offshore.,,,,,EPSG,EPSG,1996-12-12 00:00:00,,0
+2347,Algeria - N of 31.5 deg North,Algeria - north of 35g (31 deg 30 min) North.,,,,,EPSG,EPSG,1998-03-12 00:00:00,,0
+2348,Brunei - offshore,Brunei Darussalam - offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2349,Brunei - onshore,Brunei Darussalam - onshore.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2350,Mozambique - A,Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2351,Mozambique - B,Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2352,Mozambique - C,Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2353,Mozambique - D,Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2354,Indonesia - Kalimantan,Indonesia - Kalimantan.,,,,,EPSG,EPSG,1998-03-12 00:00:00,,0
+2355,Falkland Islands - East Falkland Island,Falkland Islands (Malvinas) - East Falkland Island.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2356,Ecuador - Galapagos,Ecuador - Baltra; Galapagos.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2357,Argentina - Tierra del Fuego,Argentina - Tierra del Fuego,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2358,Thailand - Bongkot field,Thailand - Bongkot field.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2359,Vietnam - near 16 deg N,Vietnam - near 16 deg North.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2360,Vietnam - Con Son Island,Vietnam - Con Son Island.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2361,Myanmar (Burma) - Moattama area,Myanmar (Burma) - Moattama area.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2362,Iran - Kangan district,Islamic Republic of Iran - Kangan district.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2363,Venezuela - east,Venezuela - east - Delta Amacuro; Anzoategui; Bolivar; Monagas; Sucre states.,,,,,EPSG,EPSG,1999-11-05 00:00:00,,0
+2364,Philippines - excluding Mindanao,Philippines (excluding Mindanao).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2365,Philippines - Mindanao,Philippines - Mindanao.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2366,Spain - mainland,Spain - mainland.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2367,Spain - mainland NE,Spain - mainland north of the parallel of 42 deg N from the Atlantic Ocean to 42 deg N  4 deg W of Greenwich and then a line from 42 deg N  4 deg W of Greenwich through 40 deg N 0 deg E of Greenwich.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2368,Spain - mainland SW,Spain - mainland south of the parallel of 42 deg N from the Atlantic Ocean to 42 deg N  4 deg W of Greenwich and then a line from 42 deg N  4 deg W of Greenwich through 40 deg N 0 deg E of Greenwich.,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2369,Seychelles - Mahe Island,Seychelles - Mahe Island.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2370,Europe - Boznia and Herzegovina; Croatia; Serbia; Slovenia.,Boznia and Herzegovina; Croatia; Serbia; Slovenia.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2371,Nigeria - south,Nigeria - south.,,,,,EPSG,EPSG,2001-08-28 00:00:00,,0
+2372,Italy - mainland,Italy - mainland.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2373,USA - Alaska including EEZ.,United States (USA) - Alaska including EEZ.,,,,,EPSG,EPSG,2001-08-28 00:00:00,,0
+2374,USA - conus including EEZ.,United States (USA) - lower 48 states including EEZ - Alabama; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island; South Carolina; Sout [...]
+2375,Canada - Saskatchewan,Canada - Saskatchewan.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2376,Canada - Alberta,Canada - Alberta,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2377,USA - Delaware and Maryland,United States (USA) - Delaware and Maryland.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2378,"USA - New England - south (CT, MA, NH, RI, VT)",United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2379,USA - Texas E of 100 deg W,United States (USA) - Texas east of 100 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2380,USA - Texas W of 100 deg W,United States (USA) - Texas west of 100 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2381,USA - Oregon and Washington.,United States (USA) - Oregon and Washington.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2382,USA - Idaho and Montana - E of 113 deg W,United States (USA) - Idaho and Montana - east of 113 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2383,USA - Idaho and Montana - W of 113 deg W,United States (USA) - Idaho and Montana - west of 113 deg West.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2384,Canada - Alberta and British Columbia.,Canada - Alberta; British Columbia.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2385,Panama - Canal Zone,Panama - Canal Zone.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2386,Greenland - Hayes Peninsula,Greenland - Hayes Peninsula.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2387,USA - Alaska - Aleutian Islands east of 180 deg,United States (USA) - Alaska - Aleutian Islands east of 180 deg.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+2388,USA - Alaska - Aleutian Islands west of 180 deg,United States (USA) - Alaska - Aleutian Islands west of 180 deg.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,0
+2389,USA - conus east of Mississippi River,United States (USA) - CONUS east of Mississippi River including Louisiana; Missouri; Minnesota.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2390,USA - conus west of Mississippi River,United States (USA) - CONUS west of Mississippi River.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2391,Oman - Masirah Island,Oman - Masirah Island.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2392,UAE - Abu al Bu Khoosh,United Arab Emirates (UAE) - Abu Dhabi - Abu al Bu Khoosh,,,,,EPSG,EPSG,2000-03-07 00:00:00,,0
+2393,Algeria - Hassi Messaoud,Algeria - Hassi Messaoud.,,,,,EPSG,EPSG,2000-06-23 00:00:00,,0
+2394,UK - Great Britain and UKCS,United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.,,,,,EPSG,EPSG,1998-11-11 00:00:00,,0
+2395,UK - England,United Kingdom (UK) - England.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2396,UK - England; Wales; Isle of Man,United Kingdom (UK) - England; Wales; Isle of Man.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2397,UK - Scotland,United Kingdom (UK) - Scotland (including Shetland Islands).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2398,UK - Wales,United Kingdom (UK) - Wales.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2399,South America - Bolivia; Chile; Colombia;  Ecuador; Guyana; Peru; Venezuela.,Bolivia; Chile; Colombia;  Ecuador; Guyana; Peru; Venezuela.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2400,Bolivia - Madidi,Bolivia - Madidi.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2401,Bolivia - Block 20,Bolivia - Block 20.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2402,Chile - north,Chile - north (near 19 deg South).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2403,Chile - south,Chile - south (near 43 deg South).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2404,Oman - block 4,Oman - block 4.,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2405,Kazakstan - Caspian Sea,Kazakstan - Caspian Sea.,,,,,EPSG,EPSG,2000-02-02 00:00:00,,0
+2406,Qatar - offshore,Qatar - offshore.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2407,Greenland - south,Greenland (South).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2408,Japan - Okinawa,Japan - Okinawa.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2409,Asia - Japan and South Korea,Japan; South Korea; Okinawa.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2410,Canada - NWT; Nunavut; Saskatchewan,Canada - Northwest Territories; Nunavut; Saskatchewan.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2411,Asia - India and Nepal,India; Nepal.,,,,,EPSG,EPSG,1999-10-20 00:00:00,,0
+2412,USA - Alaska excluding Aleutian Islands,United States (USA) - Alaska (Excluding Aleutian Islands).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2413,Bahamas (Except San Salvador Island).,Bahamas (Except San Salvador Island).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2414,Bahamas (San Salvador Island).,Bahamas (San Salvador Island).,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2415,Canada - Manitoba and Ontario,Canada - Manitoba; Ontario.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2416,Canada - New Brunswick; Newfoundland; Nova Scotia; Quebec,Canada - New Brunswick; Newfoundland; Nova Scotia; Quebec.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2417,Canada - Yukon,Canada - Yukon.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2418,Caribbean - central,Antigua; Barbados; Barbuda; Caicos Islands; Cuba; Dominican Republic; Grand Cayman; Jamaica; Turks and Caicos Islands.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2419,Central America -,Belize; Costa Rica; El Salvador; Guatemala; Honduras; Nicaragua.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2420,Europe - west,Austria; Belgium; Denmark; Faroe Islands; Finland; France; Germany (west); Gibraltar; Greece; Italy; Luxembourg; Netherlands; Norway; Portugal; Spain; Sweden; Switzerland.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,0
+2421,Europe - west central,Austria; Denmark; France; Germany (west); Netherlands; Switzerland.,,,,,EPSG,EPSG,1996-10-18 00:00:00,,0
+2424,USA - HARN,American Samoa; Puerto Rico and the Virgin Islands; United States (USA) - Alabama; Alaska; Arizona; Arkansas; California; Colorado; Connecticut; Delaware; Florida; Georgia; Hawaii; Idaho; Illinois; Indiana; Iowa; Kansas; Kentucky; Louisiana; Maine; Maryland; Massachusetts; Michigan; Minnesota; Mississippi; Missouri; Montana; Nebraska; Nevada; New Hampshire; New Jersey; New Mexico; New York; North Carolina; North Dakota; Ohio; Oklahoma; Oregon; Pennsylvania; Rhode Island;  [...]
+2425,Japan - 45d 20m to 46d N; 141d to 142d E.,Japan - 45deg 20min to 46deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2426,Japan - 45d 20m to 46d N; 142d to 143d E.,Japan - 45deg 20min to 46deg North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2427,Japan - 44deg 40min to 45deg 20min N; 141deg to 142deg E.,Japan - 44deg 40min to 45deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2428,Japan - 44deg 40min to 45deg 20min N; 142deg to 143deg E.,Japan - 44deg 40min to 45deg 20min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2429,Japan - 44deg to 44deg 40min N; 141deg to 142deg E.,Japan - 44deg to 44deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2430,Japan - 44deg to 44deg 40min N; 142deg to 143deg E.,Japan - 44deg to 44deg 40min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2431,Japan - 44deg to 44deg 40min N; 143deg to 144deg E.,Japan - 44deg to 44deg 40min North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2432,Japan - 44deg to 44deg 40min N; 144deg to 145deg E.,Japan - 44deg to 44deg 40min North; 144deg to 145deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2433,Japan - 43deg 20min to 44deg N; 141deg to 142deg E.,Japan - 43deg 20min to 44deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2434,Japan - 43deg 20min to 44deg N; 142deg to 143deg E.,Japan - 43deg 20min to 44deg North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2435,Japan - 43deg 20min to 44deg N; 143deg to 144deg E.,Japan - 43deg 20min to 44deg North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2436,Japan - 43deg 20min to 44deg N; 144deg to 145deg E.,Japan - 43deg 20min to 44deg North; 144deg to 145deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2437,Japan - 43deg 20min to 44deg N; 145deg to 146deg E.,Japan - 43deg 20min to 44deg North; 145deg to 146deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2438,Japan - 42deg 40min to 43deg 20min N; 140deg to 141deg E.,Japan - 42deg 40min to 43deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2439,Japan - 42deg 40min to 43deg 20min N; 141deg to 142deg E.,Japan - 42deg 40min to 43deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1999-11-12 00:00:00,,0
+2440,Japan - 42deg 40min to 43deg 20min N; 142deg to 143deg E.,Japan - 42deg 40min to 43deg 20min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2441,Japan - 42deg 40min to 43deg 20min N; 143deg to 144deg E.,Japan - 42deg 40min to 43deg 20min North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2442,Japan - 42deg 40min to 43deg 20min N; 144deg to 145deg E.,Japan - 42deg 40min to 43deg 20min North; 144deg to 145deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2443,Japan - 42deg 40min to 43deg 20min N; 145deg to 146deg E.,Japan - 42deg 40min to 43deg 20min North; 145deg to 146deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2444,Japan - 42deg to 42deg 40min N; 139deg to 140deg E.,Japan - 42deg to 42deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2445,Japan - 42deg to 42deg 40min N; 140deg to 141deg E.,Japan - 42deg to 42deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2446,Japan - 42deg to 42deg 40min N; 141deg to 142deg E.,Japan - 42deg to 42deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2447,Japan - 42deg to 42deg 40min N; 142deg to 143deg E.,Japan - 42deg to 42deg 40min North; 142deg to 143deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2448,Japan - 42deg to 42deg 40min N; 143deg to 144deg E.,Japan - 42deg to 42deg 40min North; 143deg to 144deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2449,Japan - 41deg 20min to 42deg N; 140deg to 141deg E.,Japan - 41deg 20min to 42deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2450,Japan - 41deg 20min to 42deg N; 141deg to 142deg E.,Japan - 41deg 20min to 42deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2451,Japan - 40deg 40min to 41deg 20min N; 140deg to 141deg E.,Japan - 40deg 40min to 41deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2452,Japan - 40deg 40min to 41deg 20min N; 141deg to 142deg E.,Japan - 40deg 40min to 41deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2453,Japan - 40deg to 40deg 40min N; 139deg to 140deg E.,Japan - 40deg to 40deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2454,Japan - 40deg to 40deg 40min N; 140deg to 141deg E.,Japan - 40deg to 40deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2455,Japan - 40deg to 40deg 40min N; 141deg to 142deg E.,Japan - 40deg to 40deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2456,Japan - 39deg 20min to 40deg N; 139deg to 140deg E.,Japan - 39deg 20min to 40deg North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2457,Japan - 39deg 20min to 40deg N; 140deg to 141deg E.,Japan - 39deg 20min to 40deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2458,Japan - 39deg 20min to 40deg N; 141deg to 142deg E.,Japan - 39deg 20min to 40deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2459,Japan - 38deg 40min to 39deg 20min N; 139deg to 140deg E.,Japan - 38deg 40min to 39deg 20min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2460,Japan - 38deg 40min to 39deg 20min N; 140deg to 141deg E.,Japan - 38deg 40min to 39deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2461,Japan - 38deg 40min to 39deg 20min N; 141deg to 142deg E.,Japan - 38deg 40min to 39deg 20min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2462,Japan - 38deg to 38deg 40min N; 139deg to 140deg E.,Japan - 38deg to 38deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2463,Japan - 38deg to 38deg 40min N; 140deg to 141deg E.,Japan - 38deg to 38deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2464,Japan - 38deg to 38deg 40min N; 141deg to 142deg E.,Japan - 38deg to 38deg 40min North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2465,Japan - 37deg 20min to 38deg N; 136deg to 137deg E.,Japan - 37deg 20min to 38deg North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2466,Japan - 37deg 20min to 38deg N; 137deg to 138deg E.,Japan - 37deg 20min to 38deg North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2467,Japan - 37deg 20min to 38deg N; 138deg to 139deg E.,Japan - 37deg 20min to 38deg North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2468,Japan - 37deg 20min to 38deg N; 139deg to 140deg E.,Japan - 37deg 20min to 38deg North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2469,Japan - 37deg 20min to 38deg N; 140deg to 141deg E.,Japan - 37deg 20min to 38deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2470,Japan - 37deg 20min to 38deg N; 141deg to 142deg E.,Japan - 37deg 20min to 38deg North; 141deg to 142deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2471,Japan - 36deg 40min to 37deg 20min N; 136deg to 137deg E.,Japan - 36deg 40min to 37deg 20min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2472,Japan - 36deg 40min to 37deg 20min N; 137deg to 138deg E.,Japan - 36deg 40min to 37deg 20min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2473,Japan - 36deg 40min to 37deg 20min N; 138deg to 139deg E.,Japan - 36deg 40min to 37deg 20min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2474,Japan - 36deg 40min to 37deg 20min N; 139deg to 140deg E.,Japan - 36deg 40min to 37deg 20min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2475,Japan - 36deg 40min to 37deg 20min N; 140deg to 141deg E.,Japan - 36deg 40min to 37deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2476,Japan - 36deg to 37deg 40min N; 136deg to 137deg E.,Japan - 36deg to 36deg 40min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2477,Japan - 36deg to 37deg 40min N; 137deg to 138deg E.,Japan - 36deg to 36deg 40min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2478,Japan - 36deg to 37deg 40min N; 138deg to 139deg E.,Japan - 36deg to 36deg 40min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2479,Japan - 36deg to 37deg 40min N; 139deg to 140deg E.,Japan - 36deg to 36deg 40min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2480,Japan - 36deg to 37deg 40min N; 140deg to 141deg E.,Japan - 36deg to 36deg 40min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2481,Japan - 35deg 20min to 36deg N; 132deg to 133deg E.,Japan - 35deg 20min to 36deg North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2482,Japan - 35deg 20min to 36deg N; 133deg to 134deg E.,Japan - 35deg 20min to 36deg North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2483,Japan - 35deg 20min to 36deg N; 134deg to 135deg E.,Japan - 35deg 20min to 36deg North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2484,Japan - 35deg 20min to 36deg N; 135deg to 136deg E.,Japan - 35deg 20min to 36deg North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2485,Japan - 35deg 20min to 36deg N; 136deg to 137deg E.,Japan - 35deg 20min to 36deg North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2486,Japan - 35deg 20min to 36deg N; 137deg to 138deg E.,Japan - 35deg 20min to 36deg North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2487,Japan - 35deg 20min to 36deg N; 138deg to 139deg E.,Japan - 35deg 20min to 36deg North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2488,Japan - 35deg 20min to 36deg N; 139deg to 140deg E.,Japan - 35deg 20min to 36deg North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2489,Japan - 35deg 20min to 36deg N; 140deg to 141deg E.,Japan - 35deg 20min to 36deg North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2490,Japan - 34deg 40min to 35deg 20min N; 132deg to 133deg E.,Japan - 34deg 40min to 35deg 20min North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2491,Japan - 34deg 40min to 35deg 20min N; 133deg to 134deg E.,Japan - 34deg 40min to 35deg 20min North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2492,Japan - 34deg 40min to 35deg 20min N; 134deg to 135deg E.,Japan - 34deg 40min to 35deg 20min North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2493,Japan - 34deg 40min to 35deg 20min N; 135deg to 136deg E.,Japan - 34deg 40min to 35deg 20min North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2494,Japan - 34deg 40min to 35deg 20min N; 136deg to 137deg E.,Japan - 34deg 40min to 35deg 20min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2495,Japan - 34deg 40min to 35deg 20min N; 137deg to 138deg E.,Japan - 34deg 40min to 35deg 20min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2496,Japan - 34deg 40min to 35deg 20min N; 138deg to 139deg E.,Japan - 34deg 40min to 35deg 20min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2497,Japan - 34deg 40min to 35deg 20min N; 139deg to 140deg E.,Japan - 34deg 40min to 35deg 20min North; 139deg to 140deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2498,Japan - 34deg 40min to 35deg 20min N; 140deg to 141deg E.,Japan - 34deg 40min to 35deg 20min North; 140deg to 141deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2499,Japan - 34deg to 34deg 40min N; 130deg to 131deg E.,Japan - 34deg to 34deg 40min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2500,Japan - 34deg to 34deg 40min N; 131deg to 132deg E.,Japan - 34deg to 34deg 40min North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2501,Japan - 34deg to 34deg 40min N; 132deg to 133deg E.,Japan - 34deg to 34deg 40min North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2502,Japan - 34deg to 34deg 40min N; 133deg to 134deg E.,Japan - 34deg to 34deg 40min North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2503,Japan - 34deg to 34deg 40min N; 134deg to 135deg E.,Japan - 34deg to 34deg 40min North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2504,Japan - 34deg to 34deg 40min N; 135deg to 136deg E.,Japan - 34deg to 34deg 40min North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2505,Japan - 34deg to 34deg 40min N; 136deg to 137deg E.,Japan - 34deg to 34deg 40min North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2506,Japan - 34deg to 34deg 40min N; 137deg to 138deg E.,Japan - 34deg to 34deg 40min North; 137deg to 138deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2507,Japan - 34deg to 34deg 40min N; 138deg to 139deg E.,Japan - 34deg to 34deg 40min North; 138deg to 139deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2508,Japan - 33deg 20min to 34deg N; 129deg to 130deg E.,Japan - 33deg 20min to 34deg North; 129deg to 130deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2509,Japan - 33deg 20min to 34deg N; 130deg to 131deg E.,Japan - 33deg 20min to 34deg North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2510,Japan - 33deg 20min to 34deg N; 131deg to 132deg E.,Japan - 33deg 20min to 34deg North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2511,Japan - 33deg 20min to 34deg N; 132deg to 133deg E.,Japan - 33deg 20min to 34deg North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2512,Japan - 33deg 20min to 34deg N; 133deg to 134deg E.,Japan - 33deg 20min to 34deg North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2513,Japan - 33deg 20min to 34deg N; 134deg to 135deg E.,Japan - 33deg 20min to 34deg North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2514,Japan - 33deg 20min to 34deg N; 135deg to 136deg E.,Japan - 33deg 20min to 34deg North; 135deg to 136deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2515,Japan - 33deg 20min to 34deg N; 136deg to 137deg E.,Japan - 33deg 20min to 34deg North; 136deg to 137deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2516,Japan - 32deg 40min to 33deg 20min N; 129deg to 130deg E.,Japan - 32deg 40min to 33deg 20min North; 129deg to 130deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2517,Japan - 32deg 40min to 33deg 20min N; 130deg to 131deg E.,Japan - 32deg 40min to 33deg 20min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2518,Japan - 32deg 40min to 33deg 20min N; 131deg to 132deg E.,Japan - 32deg 40min to 33deg 20min North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2519,Japan - 32deg 40min to 33deg 20min N; 132deg to 133deg E.,Japan - 32deg 40min to 33deg 20min North; 132deg to 133deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2520,Japan - 32deg 40min to 33deg 20min N; 133deg to 134deg E.,Japan - 32deg 40min to 33deg 20min North; 133deg to 134deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2521,Japan - 32deg 40min to 33deg 20min N; 134deg to 135deg E.,Japan - 32deg 40min to 33deg 20min North; 134deg to 135deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2522,Japan - 32deg to 32deg 40min N; 130deg to 131deg E.,Japan - 32deg to 32deg 40min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2523,Japan - 32deg to 32deg 40min N; 131deg to 132deg E.,Japan - 32deg to 32deg 40min North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2524,Japan - 31deg 20min to 32deg N; 130deg to 131deg E.,Japan - 31deg 20min to 32deg North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2525,Japan - 31deg 20min to 32deg N; 131deg to 132deg E.,Japan - 31deg 20min to 32deg North; 131deg to 132deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2526,Japan - 30deg 40min to 31deg 20min N; 130deg to 131deg E.,Japan - 30deg 40min to 31deg 20min North; 130deg to 131deg East.,,,,,EPSG,EPSG,1998-12-12 00:00:00,,0
+2527,USA - Texas - SPCS83 - S central,United States (USA) - Texas between approximately 30d 10m & 28d 05m North - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Ter [...]
+2528,USA - Texas - SPCS83 - S,United States (USA) - Texas south of approximately 28d 05m North - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2529,USA - Louisiana - SPCS83 - S,United States (USA) - Louisiana south of approximately 30d 55m North - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; [...]
+2530,UK - Northern Ireland,United Kingdom (UK) - Northern Ireland (Ulster).,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2531,Denmark - Jutland and Fuen,Denmark - Jutland and Fuen.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2532,Denmark - Zealand and Lolland,Denmark - Zealand and Lolland.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2533,Denmark - Bornholm,Denmark - Bornholm.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2534,3-degree TM - N hemisphere CM 27 deg E,"Between 25 deg 30 min and 28 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2535,3-degree TM - N hemisphere CM 30 deg E,"Between 28 deg 30 min and 31 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2536,3-degree TM - N hemisphere CM 33 deg E,"Between 31 deg 30 min and 34 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2537,3-degree TM - N hemisphere CM 36 deg E,"Between 34 deg 30 min and 37 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2538,3-degree TM - N hemisphere CM 39 deg E,"Between 37 deg 30 min and 40 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2539,3-degree TM - N hemisphere CM 42 deg E,"Between 40 deg 30 min and 43 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2540,3-degree TM - N hemisphere CM 45 deg E,"Between 43 deg 30 min and 46 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2541,Germany - former west Germany N,Germany - former west Germany north of 52deg 20min N.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2542,Germany - former west Germany C,Germany - former west Germany between 50deg 20min and 52deg 20min N.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2543,Germany - former west Germany S,Germany - former west Germany south of 50deg 20min N.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2544,Germany - Thuringen,Germany - Thuringen.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2545,Germany - Sachsen,Germany - Sachsen.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2546,Romania - offshore,Romania - offshore.,,,,,EPSG,EPSG,2001-11-06 00:00:00,,0
+2547,Yugoslavia - Montenegro,Yugoslavia - Montenegro.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2548,Africa - AOF W of 10deg W,French West Africa west of 10deg West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2549,Africa - AOF 10 to 3.5deg W,French West Africa between 10deg and 3deg 30min West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2550,Africa - AOF 3.5deg W to 4deg E,French West Africa between 3deg 30min West and 4deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2551,Africa - AOF 4 to 9deg E,French West Africa between 4deg and 9deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2552,Africa - AEF 9 to 14deg E,French Equatorial Africa between 9deg and 14deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2553,Africa - AEF 14 to 21deg E,French Equatorial Africa between 14deg and 21deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2554,Africa - AEF east of 21deg E,French Equatorial Africa east of 21deg East.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2555,Cameroon - coastal area,Cameroon - coastal area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2556,Greenland - north of 81 deg N,Greenland - north of 81 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2557,Greenland - east - 78 to 81 deg N,Greenland - east of 44 deg West and between 78 deg and 81 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2558,Greenland - east - 75 to 78 deg N,Greenland - east of 42 deg West and between 75 deg and 78 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2559,Greenland - east - 72 to 75 deg N,Greenland - east of 38 deg West and between 72 deg and 75 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2560,Greenland - east - 69 to 72 deg N,Greenland - east of 38 deg West and between 69 deg and 72 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2561,Greenland - east - 66 to 69 deg N,Greenland - east of 42 deg West and between 66 deg and 69 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2562,Greenland - east - 63 to 66 deg N,Greenland - east of 46 deg West and between 63 deg and 66 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2563,Greenland - west - 78 to 81 deg N,Greenland - west of 44 deg West and between 78 deg and 81 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2564,Greenland - west - 75 to 78 deg N,Greenland - west of 44 deg West and between 75 deg and 78 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2565,Greenland - west - 72 to 75 deg N,Greenland - west of 38 deg West and between 72 deg and 75 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2566,Greenland - west - 69 to 72 deg N,Greenland - west of 38 deg West and between 69 deg and 72 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2567,Greenland - west - 66 to 69 deg N,Greenland - west of 42 deg West and between 66 deg and 69 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2568,Greenland - west - 63 to 66 deg N,Greenland - west of 46 deg West and between 63 deg and 66 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2569,Greenland - south of 63 deg N,Greenland - south of 63 deg North.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2570,Greenland - Scoresbysund area,Greenland - Scoresbysund area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2571,Greenland - Ammassalik area,Greenland - Ammassalik area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2572,Greenland - E of 48d W,Greenland east of 48 deg West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2573,Greenland - W of 48d W,Greenland west of 48 deg West.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2574,Congo - coastal area and offshore,Congo - coastal area and offshore.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2575,Australia - all states,Australia - Australian Capital Territory (ACT); New South Wales (NSW); Northern Territories (NT); Queensland (Qld); South Australia (SA); Tasmania (Tas); Western Australia (WA); Victoria (Vic).,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2576,Australia - AGD84,"Australia - Queensland (Qld), South Australia (SA), Western Australia (WA).",,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2577,Indonesia - Java Sea - ONWJ,Indonesia - Java Sea - offshore northwest Java.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2588,Indonesia - Java Sea - E,Indonesia - eastern Java Sea.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2589,Indonesia - Irian Jaya - Tangguh,Indonesia - Irian Jaya - Tangguh.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2590,Cameroon - Garoua area,Cameroon - Garoua area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2591,Cameroon - N'Djamena area,Cameroon - N'Djamena area.,,,,,EPSG,EPSG,2002-01-18 00:00:00,,0
+2592,Azerbaijan - offshore and Sangachal,Azerbaijan - offshore and Sangachal terminal.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2593,Asia - Azerbaijan and Georgia,Azerbaijan and Georgia,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2594,Azerbaijan - coastal area Baku to Astara,Azerbaijan - coastal area Baku to Astara.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2595,Egypt - Western Desert,Egypt - Western Desert.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2596,Argentina - Tierra del Fuego - offshore W of 66W,Argentina - Tierra del Fuego offshore west of 66 deg West.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2597,Argentina - Tierra del Fuego - offshore E of 66W,Argentina - Tierra del Fuego offshore east of 66 deg West.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2598,Algeria - District 3,Algeria - District 3 (In Salah).,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2599,Algeria - In Amenas,Algeria - In Amenas block.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2600,Algeria - Hassi Bir Reikaz,Algeria - Hassi Bir Reikaz.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,0
+2601,Norway - offshore N of 62 deg N;  Svalbard; Jan Mayen,Norway - offshore north of 62 deg N;  Svalbard and Jan Mayen Islands.,,,,,EPSG,EPSG,2001-08-15 00:00:00,,0
+2602,"Palestine Territory, Occupied","Palestine Territory, Occupied.",PS,PSE,275,,ISO 3166 Maintenance Agency.  ftp://ftp.fu-berlin.de/pub/doc/iso,EPSG,2002-06-22 00:00:00,,0
+2603,Asia - Middle East - Israel and Palestine Territory,Asia - Middle East - Israel and Palestine Territory.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2604,3-degree TM - N hemisphere CM 48 deg E,"Between 46 deg 30 min and 49 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2605,3-degree TM - N hemisphere CM 51 deg E,"Between 49 deg 30 min and 52 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2606,3-degree TM - N hemisphere CM 54 deg E,"Between 52 deg 30 min and 55 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2607,3-degree TM - N hemisphere CM 57 deg E,"Between 55 deg 30 min and 58 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2608,3-degree TM - N hemisphere CM 60 deg E,"Between 58 deg 30 min and 61 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2609,3-degree TM - N hemisphere CM 63 deg E,"Between 61 deg 30 min and 64 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2610,3-degree TM - N hemisphere CM 66 deg E,"Between 64 deg 30 min and 67 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2611,3-degree TM - N hemisphere CM 69 deg E,"Between 67 deg 30 min and 70 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2612,3-degree TM - N hemisphere CM 72 deg E,"Between 70 deg 30 min and 73 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2613,3-degree TM - N hemisphere CM 75 deg E,"Between 73 deg 30 min and 76 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2614,3-degree TM - N hemisphere CM 78 deg E,"Between 76 deg 30 min and 79 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2615,3-degree TM - N hemisphere CM 81 deg E,"Between 79 deg 30 min and 82 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2616,3-degree TM - N hemisphere CM 84 deg E,"Between 82 deg 30 min and 85 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2617,3-degree TM - N hemisphere CM 87 deg E,"Between 85 deg 30 min and 88 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2618,3-degree TM - N hemisphere CM 90 deg E,"Between 88 deg 30 min and 91 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2619,3-degree TM - N hemisphere CM 93 deg E,"Between 91 deg 30 min and 94 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2620,3-degree TM - N hemisphere CM 96 deg E,"Between 94 deg 30 min and 97 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2621,3-degree TM - N hemisphere CM 99 deg E,"Between 97 deg 30 min and 100 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2622,3-degree TM - N hemisphere CM 102 deg E,"Between 100 deg 30 min and 103 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2623,3-degree TM - N hemisphere CM 105 deg E,"Between 103 deg 30 min and 106 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2624,3-degree TM - N hemisphere CM 108 deg E,"Between 106 deg 30 min and 109 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2625,3-degree TM - N hemisphere CM 111 deg E,"Between 109 deg 30 min and 112 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2626,3-degree TM - N hemisphere CM 114 deg E,"Between 112 deg 30 min and 115 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2627,3-degree TM - N hemisphere CM 117 deg E,"Between 115 deg 30 min and 118 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2628,3-degree TM - N hemisphere CM 120 deg E,"Between 118 deg 30 min and 121 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2629,3-degree TM - N hemisphere CM 123 deg E,"Between 121 deg 30 min and 124 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2630,3-degree TM - N hemisphere CM 126 deg E,"Between 124 deg 30 min and 127 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2631,3-degree TM - N hemisphere CM 129 deg E,"Between 127 deg 30 min and 130 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2632,3-degree TM - N hemisphere CM 132 deg E,"Between 130 deg 30 min and 133 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2633,3-degree TM - N hemisphere CM 135 deg E,"Between 133 deg 30 min and 136 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2634,3-degree TM - N hemisphere CM 138 deg E,"Between 136 deg 30 min and 139 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2635,3-degree TM - N hemisphere CM 141 deg E,"Between 139 deg 30 min and 142 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2636,3-degree TM - N hemisphere CM 144 deg E,"Between 142 deg 30 min and 145 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2637,3-degree TM - N hemisphere CM 147 deg E,"Between 145 deg 30 min and 148 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2638,3-degree TM - N hemisphere CM 150 deg E,"Between 148 deg 30 min and 151 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2639,3-degree TM - N hemisphere CM 153 deg E,"Between 151 deg 30 min and 154 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2640,3-degree TM - N hemisphere CM 156 deg E,"Between 154 deg 30 min and 157 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2641,3-degree TM - N hemisphere CM 159 deg E,"Between 157 deg 30 min and 160 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2642,3-degree TM - N hemisphere CM 162 deg E,"Between 160 deg 30 min and 163 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2643,3-degree TM - N hemisphere CM 165 deg E,"Between 163 deg 30 min and 166 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2644,3-degree TM - N hemisphere CM 168 deg E,"Between 166 deg 30 min and 169 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2645,3-degree TM - N hemisphere CM 171 deg E,"Between 169 deg 30 min and 172 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2646,3-degree TM - N hemisphere CM 174 deg E,"Between 172 deg 30 min and 175 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2647,3-degree TM - N hemisphere CM 177 deg E,"Between 175 deg 30 min and 178 deg 30 min East, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2648,3-degree TM - N hemisphere CM 180 deg,"Between 178 deg 30 min East and 178 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2649,3-degree TM - N hemisphere CM 177 deg W,"Between 178 deg 30 min and 175 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2650,3-degree TM - N hemisphere CM 174 deg W,"Between 175 deg 30 min and 172 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2651,3-degree TM - N hemisphere CM 171 deg W,"Between 172 deg 30 min and 169 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2652,3-degree TM - N hemisphere CM 168 deg W,"Between 169 deg 30 min and 166 deg 30 min West, northern hemisphere.",,,,,EPSG,EPSG,2002-06-22 00:00:00,2002.341,0
+2653,Europe - 3deg GK CM 21 deg E,Russian Federation and Ukraine - between 19 deg 30 min and 22 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2654,Europe - 3deg GK CM 24 deg E,"Belarus, Russian Federation and Ukraine - between 22 deg 30 min and 25 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2655,Europe - 3deg GK CM 27 deg E,"Belarus, Moldova, Russian Federation and Ukraine - between 25 deg 30 min and 28 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2656,Europe - 3deg GK CM 30 deg E,"Belarus, Moldova, Russian Federation and Ukraine - between 28 deg 30 min and 31 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2657,Europe - 3deg GK CM 33 deg E,"Belarus, Russian Federation and Ukraine - between 31 deg 30 min and 34 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2658,Europe - 3deg GK CM 36 deg E,Russian Federation and Ukraine - between 34 deg 30 min and 37 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2659,Europe - 3deg GK CM 39 deg E,"Georgia, Russian Federation  and Ukraine - between 37 deg 30 min and 40 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2660,Europe - 3deg GK CM 42 deg E,"Georgia, Russian Federation - between 40 deg 30 min and 43 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2661,Europe - 3deg GK CM 45 deg E,"Armenia, Azerbaijan, Georgia and Russian Federation - between 43 deg 30 min and 46 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2662,Europe - 3deg GK CM 48 deg E,"Azerbaijan, Georgia and Russian Federation - between 46 deg 30 min and 49 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2663,Europe - 3deg GK CM 51 deg E,"Azerbaijan, Georgia and Russian Federation - between 49 deg 30 min and 52 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2664,Asia - 3deg GK CM 54 deg E,"Kazakstan, Russian Federation and Turkmenistan - between 52 deg 30 min and 55 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2665,Asia - 3deg GK CM 57 deg E,"Kazakstan, Russian Federation and Turkmenistan - between 55 deg 30 min and 58 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2666,Asia - 3deg GK CM 60 deg E,"Kazakstan, Russian Federation, Turkmenistan and Uzbekistan - between 58 deg 30 min and 61 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2667,Asia - 3deg GK CM 63 deg E,"Kazakstan, Russian Federation, Turkmenistan and Uzbekistan - between 61 deg 30 min and 64 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2668,Asia - 3deg GK CM 66 deg E,"Kazakstan, Russian Federation, Turkmenistan and Uzbekistan - between 64 deg 30 min and 67 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2669,Asia - 3deg GK CM 69 deg E,"Kazakstan, Kyrgyzstan, Russian Federation, Tajikistan and Uzbekistan - between 67 deg 30 min and 70 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2670,Asia - 3deg GK CM 72 deg E,"Kazakstan, Kyrgyzstan, Russian Federation, Tajikistan and Uzbekistan - between 70 deg 30 min and 73 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2671,Asia - 3deg GK CM 75 deg E,"Kazakstan, Kyrgyzstan, Russian Federation and Tajikistan - between 73 deg 30 min and 76 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2672,Asia - 3deg GK CM 78 deg E,"Kazakstan, Kyrgyzstan and Russian Federation - between 76 deg 30 min and 79 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2673,Asia - 3deg GK CM 81 deg E,"Kazakstan, Kyrgyzstan and Russian Federation - between 79 deg 30 min and 82 deg 30 min East.",,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2674,Asia - 3deg GK CM 84 deg E,Kazakstan and Russian Federation - between 82 deg 30 min and 85 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2675,Asia - 3deg GK CM 87 deg E,Kazakstan and Russian Federation - between 85 deg 30 min and 88 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2676,Russia - 88.5 to 91.5 deg E,Russian Federation - between 88 deg 30 min and 91 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2677,Russia - 91.5 to 94.5 deg E,Russian Federation - between 91 deg 30 min and 94 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2678,Russia - 94.5 to 97.5 deg E,Russian Federation - between 94 deg 30 min and 97 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2679,Russia - 97.5 to 100.5 deg E,Russian Federation - between 97 deg 30 min and 100 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2680,Russia - 100.5 to 103.5 deg E,Russian Federation - between 100 deg 30 min and 103 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2681,Russia - 103.5 to 106.5 deg E,Russian Federation - between 103 deg 30 min and 106 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2682,Russia - 106.5 to 109.5 deg E,Russian Federation - between 106 deg 30 min and 109 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2683,Russia - 109.5 to 112.5 deg E,Russian Federation - between 109 deg 30 min and 112 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2684,Russia - 112.5 to 115.5 deg E,Russian Federation - between 112 deg 30 min and 115 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2685,Russia - 115.5 to 118.5 deg E,Russian Federation - between 115 deg 30 min and 118 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2686,Russia - 118.5 to 121.5 deg E,Russian Federation - between 118 deg 30 min and 121 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2687,Russia - 121.5 to 124.5 deg E,Russian Federation - between 121 deg 30 min and 124 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2688,Russia - 124.5 to 127.5 deg E,Russian Federation - between 124 deg 30 min and 127 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2689,Russia - 127.5 to 130.5 deg E,Russian Federation - between 127 deg 30 min and 130 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2690,Russia - 130.5 to 133.5 deg E,Russian Federation - between 130 deg 30 min and 133 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2691,Russia - 133.5 to 136.5 deg E,Russian Federation - between 133 deg 30 min and 136 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2692,Russia - 136.5 to 139.5 deg E,Russian Federation - between 136 deg 30 min and 139 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2693,Russia - 139.5 to 142.5 deg E,Russian Federation - between 139 deg 30 min and 142 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2694,Russia - 142.5 to 145.5 deg E,Russian Federation - between 142 deg 30 min and 145 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2695,Russia - 145.5 to 148.5 deg E,Russian Federation - between 145 deg 30 min and 148 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2696,Russia - 148.5 to 151.5 deg E,Russian Federation - between 148 deg 30 min and 151 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2697,Russia - 151.5 to 154.5 deg E,Russian Federation - between 151 deg 30 min and 154 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2698,Russia - 154.5 to 157.5 deg E,Russian Federation - between 154 deg 30 min and 157 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2699,Russia - 157.5 to 160.5 deg E,Russian Federation - between 157 deg 30 min and 160 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2700,Russia - 160.5 to 163.5 deg E,Russian Federation - between 160 deg 30 min and 163 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2701,Russia - 163.5 to 166.5 deg E,Russian Federation - between 163 deg 30 min and 166 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2702,Russia - 166.5 to 170.5 deg E,Russian Federation - between 166 deg 30 min and 169 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2703,Russia - 169.5 to 172.5 deg E,Russian Federation - between 169 deg 30 min and 172 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2704,Russia - 172.5 to 175.5 deg E,Russian Federation - between 172 deg 30 min and 175 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2705,Russia - 175.5 to 178.5 deg E,Russian Federation - between 175 deg 30 min and 178 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2706,Russia - 178.5E to 178.5 deg W,Russian Federation - between 178 deg 30 min East and 178 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2707,Russia - 178.5 to 175.5 deg W,Russian Federation - between 178 deg 30 min and 175 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2708,Russia - 175.5 to 172.5 deg W,Russian Federation - between 175 deg 30 min and 172 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2709,Russia - 172.5 to 169.5 deg W,Russian Federation - between 172 deg 30 min and 169 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2710,Russia - 169.5 to 166.5 deg W,Russian Federation - between 169 deg 30 min and 166 deg 30 min West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2711,China - 73.5 to 76.5 deg E,China - between 73 deg 30 min and 76 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2712,China - 76.5 to 79.5 deg E,China - between 76 deg 30 min and 79 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2713,China - 79.5 to 82.5 deg E,China - between 79 deg 30 min and 82 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2714,China - 82.5 to 85.5 deg E,China - between 82 deg 30 min and 85 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2715,China - 85.5 to 88.5 deg E,China - between 85 deg 30 min and 88 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2716,China - 88.5 to 91.5 deg E,China - between 88 deg 30 min and 91 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2717,China - 91.5 to 94.5 deg E,China - between 91 deg 30 min and 94 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2718,China - 94.5 to 97.5 deg E,China - between 94 deg 30 min and 97 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2719,China - 97.5 to 100.5 deg E,China - between 97 deg 30 min and 100 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2720,China - 100.5 to 103.5 deg E,China - between 100 deg 30 min and 103 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2721,China - 103.5 to 106.5 deg E,China - between 103 deg 30 min and 106 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2722,China - 106.5 to 109.5 deg E,China - between 106 deg 30 min and 109 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2723,China - 109.5 to 112.5 deg E,China - between 109 deg 30 min and 112 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2724,China - 112.5 to 115.5 deg E,China - between 112 deg 30 min and 115 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2725,China - 115.5 to 118.5 deg E,China - between 115 deg 30 min and 118 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2726,China - 118.5 to 121.5 deg E,China - between 118 deg 30 min and 121 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2727,China - 121.5 to 124.5 deg E,China - between 121 deg 30 min and 124 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2728,China - 124.5 to 127.5 deg E,China - between 124 deg 30 min and 127 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2729,China - 127.5 to 130.5 deg E,China - between 127 deg 30 min and 130 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2730,China - 130.5 to 133.5 deg E,China - between 130 deg 30 min and 133 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2731,China - 133.5 to 136.5 deg E,China - between 133 deg 30 min and 136 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2732,6-degree TM - CM 81 deg W,Between 84 and 78 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2733,6-degree TM - CM 75 deg W,Between 78 and 72 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2734,6-degree TM - CM 69 deg W,Between 72 and 66 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2735,6-degree TM - CM 63 deg W,Between 66 and 60 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2736,6-degree TM - CM 57 deg W,Between 60 and 54 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2737,6-degree TM - CM 51 deg W,Between 54 and 48 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2738,6-degree TM - CM 45 deg W,Between 48 and 42 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2739,6-degree TM - CM 39 deg W,Between 42 and 36 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2740,6-degree TM - CM 33 deg W,Between 36 and 30 deg West.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2741,6-degree TM - CM 9 deg E,Between 6 and 12 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2742,6-degree TM - CM 15 deg E,Between 12 and 18 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2743,6-degree TM - CM 21 deg E,Between 18 and 24 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2744,6-degree TM - CM 27 deg E,Between 24 and 30 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2745,6-degree TM - CM 33 deg E,Between 30 and 36 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2746,6-degree TM - CM 39 deg E,Between 36 and 42 deg East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2747,Russia - 19.5 to 22.5 deg E,Russian Federation - between 19 deg 30 min and 22 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2748,Russia - 22.5 to 25.5 deg E,Russian Federation - between 22 deg 30 min and 25 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2749,Russia - 25.5 to 28.5 deg E,Russian Federation - between 25 deg 30 min and 28 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2750,Russia - 28.5 to 31.5 deg E,Russian Federation - between 28 deg 30 min and 31 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2751,Russia - 31.5 to 34.5 deg E,Russian Federation - between 31 deg 30 min and 34 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2752,Russia - 34.5 to 37.5 deg E,Russian Federation - between 34 deg 30 min and 37 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2753,Russia - 37.5 to 40.5 deg E,Russian Federation - between 37 deg 30 min and 40 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2754,Russia - 40.5 to 43.5 deg E,Russian Federation - between 40 deg 30 min and 43 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2755,Russia - 43.5 to 46.5 deg E,Russian Federation - between 43 deg 30 min and 46 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2756,Russia - 46.5 to 49.5 deg E,Russian Federation - between 46 deg 30 min and 49 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2757,Russia - 49.5 to 52.5 deg E,Russian Federation - between 49 deg 30 min and 52 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2758,Russia - 52.5 to 55.5 deg E,Russian Federation - between 52 deg 30 min and 55 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2759,Russia - 55.5 to 58.5 deg E,Russian Federation - between 55 deg 30 min and 58 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2760,Russia - 58.5 to 61.5 deg E,Russian Federation - between 58 deg 30 min and 61 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2761,Russia - 61.5 to 64.5 deg E,Russian Federation - between 61 deg 30 min and 64 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2762,Russia - 64.5 to 67.5 deg E,Russian Federation - between 64 deg 30 min and 67 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2763,Russia - 67.5 to 70.5 deg E,Russian Federation - between 67 deg 30 min and 70 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2764,Russia - 70.5 to 73.5 deg E,Russian Federation - between 70 deg 30 min and 73 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2765,Russia - 73.5 to 76.5 deg E,Russian Federation - between 73 deg 30 min and 76 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2766,Russia - 76.5 to 79.5 deg E,Russian Federation - between 76 deg 30 min and 79 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2767,Russia - 79.5 to 82.5 deg E,Russian Federation - between 79 deg 30 min and 82 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2768,Russia - 82.5 to 85.5 deg E,Russian Federation - between 82 deg 30 min and 85 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2769,Russia - 85.5 to 88.5 deg E,Russian Federation - between 85 deg 30 min and 88 deg 30 min East.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2770,Indonesia - Kalimantan NE,Indonesia - northeast Kalimantan.,,,,,EPSG,EPSG,2002-06-22 00:00:00,,0
+2771,Niger - SE,Niger - south east,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2772,Asia - CS63 zone A1,Armenia and Georgia west of 43deg 02min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2773,Asia - CS63 zone A2,Armenia and Georgia between 43 deg 02min and 46 deg 02 min E; Azerbaijan west of 46 deg 02 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2774,Asia - CS63 zone A3,Armenia and Georgia east of 46 deg 02 min E; Azerbaijan between 46 deg 02min and 49 deg 02 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2775,Asia - CS63 zone A4,Azerbaijan east of 49 deg 02 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2776,Asia - CS63 zone K2,Kazakstan between 49 deg 16 min and 52 deg 16 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2777,Asia - CS63 zone K3,Kazakstan between 52 deg 16 min and 55 deg 16 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2778,Asia - CS63 zone K4,Kazakstan between 55 deg 16 min and 58 deg 16 min E.,,,,,EPSG,EPSG,2002-06-28 00:00:00,,0
+2779,Portugal - Selvagens,Portugal - Selvagens island (Madeira group).,,,,,EPSG,EPSG,2001-06-05 00:00:00,,0
+2780,Malaysia - East Malaysia - offshore,Malaysia - East Malaysia (Sabah; Sarawak) - offshore.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2781,Iran - Kharg Island,Islamic Republic of Iran - Kharg Island.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2782,Iran - Lavan Island and Balal field,Islamic Republic of Iran - Lavan Island and Balal field.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2783,Iran - South Pars block 2,Islamic Republic of Iran - South Pars field blocks 2 and 3.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2784,Canada - CSRS,Canada - Alberta; New Brunswick; Nova Scotia; Saskatchewan; Prince Edward Island; and Quebec.,,,,,EPSG,EPSG,2002-07-13 00:00:00,,0
+2785,Libya - Murzuq,Libyan Arab Jamahiriya - Murzuq field,,,,,EPSG,EPSG,2002-07-16 00:00:00,,0
+2786,Libya - Mabruk,Libyan Arab Jamahiriya - Mabruk field,,,,,EPSG,EPSG,2002-07-16 00:00:00,,0
diff --git a/src/tiff/csv/codes.csv b/src/tiff/csv/codes.csv
new file mode 100644
index 0000000..9bd878f
--- /dev/null
+++ b/src/tiff/csv/codes.csv
@@ -0,0 +1,84 @@
+"RECORD_ID","TABLE_NAME","TABLE_CONTENTS","CODE_MINIMUM","CODE_MAXIMUM","ALLOCATED_LOW","ALLOCATED_HIGH","REMARKS"
+0.01,Note: EPSG codes reserved range.,,0,32767,,,EPSG reserved code range 0-32766.  Users should allocated codes outside of this range.
+1.0,Alias,Aliases for data in all tables.,1,,1,2020,Autonumbered. Code range also used in other tables.
+2.0,Area,Area of use,1024,32767,1024,2784,Allocated sequentially - codes have no meaning. Code range also used in other tables.
+3.0,Change,Change records,,,,,Allocated sequentially with calendar year.
+4.0,Codes,EPSG codes,,,,,(This table)
+5.0,Coordinate Axis,Coordinate system attributes,,,,,No codes allocated - intersection table using dual key codes of related tables.
+6.0,Coordinate Axis Name,Coordinate system axis names,9900,9999,9901,9928,Allocated sequentially - codes have no meaning.
+7.0,Coordinate Reference System,Coordinate Reference System data,,,,,
+7.1,Coordinate Reference System,      Geographic coordinate reference systems,,,,,
+7.11,Coordinate Reference System,            geogCRS unspecified datum,4000,4099,4001,4047,
+7.12,Coordinate Reference System,            geogCRS non-WGS systems (1),4120,4139,4120,4139,Form ProjCRS 20yy to 39yy.  Range full.
+7.13,Coordinate Reference System,            geogCRS non-WGS systems (2),4140,4199,4140,4199,Added sequentially - codes have no meaning. Range full.
+7.14,Coordinate Reference System,            geogCRS non-WGS systems (3),4200,4319,4200,4319,Form ProjCRS 200yy to 319yy.  Range full.
+7.15,Coordinate Reference System,            geogCRS non-WGS systems (4),4600,4799,4600,4617,Added sequentially - codes have no meaning.
+7.16,Coordinate Reference System,            geogCRS NAD systems overflow,4320,4321,4320,4321,Form ProjCRS 320yy to 321yy.  Range full.
+7.17,Coordinate Reference System,            geogCRS WGS systems,4322,4327,4322,4327,Form ProjCRS 322yy to 327yy.  Range full.
+7.18,Coordinate Reference System,            geogCRS non-Greenwich prime meridian equivalent,4800,4899,4801,4820,Form ProjCRS 20yy to 39yy and 200yy to 319yy as in 6.12 and 6.14.
+7.19,Coordinate Reference System,            geogCRS no Greenwich prime meridian,4900,4999,4901,4904,
+7.3,Coordinate Reference System,      Projected coordinate reference systems,,,,,
+7.31,Coordinate Reference System,            projCRS (1a),2000,3999,2000,3992,Historically allocated from geogCRS 4120-4139. Now being infilled sequentially.
+7.32,Coordinate Reference System,            projCRS (1b),2000,3999,2000,2963,Now being allocated sequentially around codes previously allocated from geogCRS 4120-4139.
+7.35,Coordinate Reference System,            projCRS (2),20000,32766,20004,32766,Historically allocated from geogCRS 4200-4327. Will be infilled sequentially after range 2000-3999 full.
+7.4,Coordinate Reference System,      Vertical coordinate reference systems,,,,,
+7.41,Coordinate Reference System,            using ellipsoidal datum,,,,,Deleted in v3.2
+7.42,Coordinate Reference System,            using geoidal datum,5600,5799,5701,5739,
+7.5,Coordinate Reference System,      Engineering coordinate reference systems,5800,5999,5800,5816,
+7.6,Coordinate Reference System,      Compound coordinate reference systems,7400,7999,7401,7413,
+8.0,Coordinate System,Coordinate System descriptions,,,,,
+8.1,Coordinate System,    Cartesian coordinate systems used in geocentric CRSs,6500,6500,6500,6500,
+8.2,Coordinate System,    Cartesian coordinate systems used in projected CRSs,4400,4599,4400,4532,
+8.3,Coordinate System,    Cartesian coordinate systems used only in Engineering CRSs,6501,6599,,,
+8.4,Coordinate System,    Ellipsoidal and spherical coordinate systems,6400,6449,6401,6404,
+8.5,Coordinate System,    Gravity-related coordinate systems,6450,6499,6497,6499,
+9.0,Coordinate_Operation,Coordinate Operations,,,,,
+9.1,Coordinate_Operation,      Map Projections (Coordinate Conversions),,,,,Codes between 10000 and 19999.
+9.11,Coordinate_Operation,             US State Plane,10000,15999,10001,15917,non-continuous allocation due to semi-heirarchical coding by State.
+9.12,Coordinate_Operation,             global zoned systems,16000,16399,160,163,last two digits indicate zone number
+9.13,Coordinate_Operation,             TM (pseudo UTM) systems NE hem.,16400,16580,16400,16506,systems in the N and E hemispheres.  Digits indicate longitude of origin.
+9.14,Coordinate_Operation,             TM (pseudo UTM) systems SE hem.,16600,16780,16611,16732,systems in the S and E hemispheres.  Digits indicate longitude of origin.
+9.15,Coordinate_Operation,             TM (pseudo UTM) systems SW hem.,16800,16980,,,systems in the S and W hemispheres.  Digits indicate longitude of origin.
+9.16,Coordinate_Operation,             TM (pseudo UTM) systems NW hem.,17000,17180,17001,17054,systems in the N and W hemispheres.  Digits indicate longitude of origin.
+9.17,Coordinate_Operation,             large zoned systems,17200,17999,173,179,last two digits usually indicate zone number
+9.18,Coordinate_Operation,             small zoned systems,18000,18999,1801,1844,last digit indicates zone number
+9.19,Coordinate_Operation,             individual zones,19000,19999,19000,19979,
+9.3,Coordinate_Operation,      Coordinate Transformations,,,,,
+9.31,Coordinate_Operation,             Single-step geodetic transformations,1024,1099,1025,1038,
+9.32,Coordinate_Operation,             Single-step geodetic transformations,1100,1099,1025,1864,
+9.34,Coordinate_Operation,             Concatenated geodetic transformations,8000,8999,8046,8635,
+9.37,Coordinate_Operation,             Vertical offset data,5400,5599,5400,5405,
+10.0,Coordinate_Operation Method,Coordinate Operation methods and required parameter names,,,,,
+10.1,Coordinate_Operation Method,    transformation methods,9600,9699,9601,9636,
+10.2,Coordinate_Operation Method,    reserved for operation methods,9700,9799,,,
+10.3,Coordinate_Operation Method,    conversion (map projection) methods,9800,9899,9801,9828,
+11.0,Coordinate_Operation Parameter,Coordinate Operation parameter names and descriptions,8600,8899,,,
+11.1,Coordinate_Operation Parameter,    Parameters used in transformations,8600,8699,8601,8667,
+11.2,Coordinate_Operation Parameter,    reserved for operation parameters,8700,8799,,,
+11.3,Coordinate_Operation Parameter,    Parameters used in conversions,8880,8899,8801,8831,
+12.0,Coordinate_Operation Parameter Usage,Links parameters with operation methods,,,,,No codes allocated - intersection table using dual key codes of related tables.
+13.0,Coordinate_Operation Parameter Value,Values of transformation and conversion parameters,,,,,No codes allocated - intersection table using triple key codes of related tables.
+14.0,Coordinate_Operation Path,Concatenated transformation steps,,,,,No codes allocated - intersection table using dual key codes of related tables.
+15.1,Datum,Geodetic Datum data,,,,,
+15.11,Datum,    unspecified datum,6000,6099,6001,6047,Form GeogCRS 4000 to 4099.
+15.12,Datum,    WGS systems,6322,6327,6322,6327,Form GeogCRS 4322 to 4327.  Range full.
+15.13,Datum,    NAD systems overflow,6320,6321,6320,6321,Form GeogCRS 4320 to 4321.  Range full.
+15.14,Datum,    non-WGS systems (1),6120,6139,6120,6139,Form GeogCRS 4120 to 4139.  Range full.
+15.15,Datum,    non-WGS systems (2),6140,6199,6140,6199,Form GeogCRS 4140 to 4199.  Range full.
+15.16,Datum,    non-WGS systems (3),6200,6319,6200,6319,Form GeogCRS 4200 to 4319.  Range full.
+15.17,Datum,    non-WGS systems (4),6600,6799,6600,6617,Form GeogCRS 4600 to 4799.
+15.18,Datum,    non-Greenwich prime meridian equivalent,6800,6899,6801,6820,Form GeogCRS 4800 to 4899.
+15.19,Datum,    no Greenwich prime meridian,6900,6999,6901,6904,Form GeogCRS 4900 to 4999.
+15.3,Datum,Vertical datum data,,,,,
+15.31,Datum,    ellipsoidal datum,,,,,Deleted in v3.2
+15.32,Datum,    geoidal datum,5000,5199,5100,5137,
+15.4,Datum,Engineering Datum data,9300,9599,9300,9313,
+16.0,Deprecation,Deprecated records reasons and replacement trail,1,,2,426,Autonumbered. Code range also used in other tables.
+17.0,Ellipsoid,Ellipsoid data,7000,7299,7001,7049,
+18.0,Naming System,Naming System names,7300,7399,7300,7311,
+19.0,Prime Meridian,Prime Meridian data,8900,8999,8901,8913,
+20.0,Unit of Measure,,,,,,
+20.1,Unit of Measure,Angle unit data,9100,9199,9101,9115,
+20.2,Unit of Measure,Length unit data,9000,9099,9001,9094,
+20.3,Unit of Measure,Scale unit data,9200,9299,9201,9211,
+21.0,Version History,,,,,,
diff --git a/src/tiff/csv/compd_cs.c b/src/tiff/csv/compd_cs.c
new file mode 100644
index 0000000..ff62cb7
--- /dev/null
+++ b/src/tiff/csv/compd_cs.c
@@ -0,0 +1,12 @@
+#include "defs.h"
+datafile_rows_t compd_cs_row_1[] = {"COMPOUNDCS_CODE","COMPOUNDCS_EPSG_NAME","COMPOUNDCS_EPSG_ABBR","COMPOUNDCS_USER_NAME","DESCRIPTION","AREA_OF_USE","HORIZCS_CODE","VERTCS_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t compd_cs_row_2[] = {"7400","NTF (Paris) + NGF IGN69","","","","France - mainland.","4807","5720","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_3[] = {"7401","NTF (Paris) / France II + NGF Lallemand","NTF / France II + Lalle","","","France - mainland.","27582","5719","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_4[] = {"7402","NTF (Paris) / France II + NGF IGN69","NTF / France II + IGN69","","","France - mainland.","27582","5720","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_5[] = {"7403","NTF (Paris) / France III + NGF IGN69","NTF / France III + IGN69","","","France south of 50.5 grads (45 deg 27 min) North.","27583","5720","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_6[] = {"7404","RT90 + RH70","","","","Sweden.","4124","5718","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","When combined with geoid model RN92 forms geographic 3D coordinate system RR92.","",NULL};
+datafile_rows_t compd_cs_row_7[] = {"7405","OSGB36 / British National Grid + ODN","GB National Grid + ODN","","","United Kingdom (UK) - Great Britain.","27700","5701","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_8[] = {"7406","NAD27 + NGVD29","","","","United States (USA).","4267","5702","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t compd_cs_row_9[] = {"7407","NAD27 / Texas North + NGVD29","NAD27 / TX_N + NGVD29","","","United States (USA) - Texas.","32037","5702","1997-11-13 00:00:00","","EPSG","","",NULL};
+
+datafile_rows_t *compd_cs_rows[] = {compd_cs_row_1,compd_cs_row_2,compd_cs_row_3,compd_cs_row_4,compd_cs_row_5,compd_cs_row_6,compd_cs_row_7,compd_cs_row_8,compd_cs_row_9,NULL};
diff --git a/src/tiff/csv/compd_cs.csv b/src/tiff/csv/compd_cs.csv
new file mode 100644
index 0000000..6cd788a
--- /dev/null
+++ b/src/tiff/csv/compd_cs.csv
@@ -0,0 +1,9 @@
+"COMPOUNDCS_CODE","COMPOUNDCS_EPSG_NAME","COMPOUNDCS_EPSG_ABBR","COMPOUNDCS_USER_NAME","DESCRIPTION","AREA_OF_USE","HORIZCS_CODE","VERTCS_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+7400,NTF (Paris) + NGF IGN69,,,,France - mainland.,4807,5720,1997-11-13 00:00:00,,EPSG,,
+7401,NTF (Paris) / France II + NGF Lallemand,NTF / France II + Lalle,,,France - mainland.,27582,5719,1997-11-13 00:00:00,,EPSG,,
+7402,NTF (Paris) / France II + NGF IGN69,NTF / France II + IGN69,,,France - mainland.,27582,5720,1997-11-13 00:00:00,,EPSG,,
+7403,NTF (Paris) / France III + NGF IGN69,NTF / France III + IGN69,,,France south of 50.5 grads (45 deg 27 min) North.,27583,5720,1997-11-13 00:00:00,,EPSG,,
+7404,RT90 + RH70,,,,Sweden.,4124,5718,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,When combined with geoid model RN92 forms geographic 3D coordinate system RR92.,
+7405,OSGB36 / British National Grid + ODN,GB National Grid + ODN,,,United Kingdom (UK) - Great Britain.,27700,5701,1997-11-13 00:00:00,,EPSG,,
+7406,NAD27 + NGVD29,,,,United States (USA).,4267,5702,1997-11-13 00:00:00,,EPSG,,
+7407,NAD27 / Texas North + NGVD29,NAD27 / TX_N + NGVD29,,,United States (USA) - Texas.,32037,5702,1997-11-13 00:00:00,,EPSG,,
diff --git a/src/tiff/csv/coordinate_axis.csv b/src/tiff/csv/coordinate_axis.csv
new file mode 100644
index 0000000..70f8d47
--- /dev/null
+++ b/src/tiff/csv/coordinate_axis.csv
@@ -0,0 +1,75 @@
+"COORD_SYS_CODE","COORD_AXIS_NAME_CODE","COORD_AXIS_ORIENTATION","COORD_AXIS_ABBREVIATION","UOM_CODE","ORDER"
+4400,9906,east,E,9001,1
+4400,9907,north,N,9001,2
+4401,9906,east,E,9062,1
+4401,9907,north,N,9062,2
+4402,9906,east,E,9042,1
+4402,9907,north,N,9042,2
+4403,9906,east,E,9005,1
+4403,9907,north,N,9005,2
+4404,9906,east,E,9094,1
+4404,9907,north,N,9094,2
+4405,9906,east,E,9041,1
+4405,9907,north,N,9041,2
+4406,9906,east,X,9036,1
+4406,9907,north,Y,9036,2
+4407,9906,east,E,9039,1
+4407,9907,north,N,9039,2
+4408,9906,east,E,9084,1
+4408,9907,north,N,9084,2
+4409,9906,east,E,9040,1
+4409,9907,north,N,9040,2
+4495,9906,east,X,9002,1
+4495,9907,north,Y,9002,2
+4496,9906,east,E(X),9001,1
+4496,9907,north,N(Y),9001,2
+4497,9906,east,X,9003,1
+4497,9907,north,Y,9003,2
+4498,9906,east,Y,9001,1
+4498,9907,north,X,9001,2
+4499,9906,east,X,9001,1
+4499,9907,north,Y,9001,2
+4500,9906,east,E,9001,2
+4500,9907,north,N,9001,1
+4501,9907,north,N,9001,1
+4501,9908,west,E,9001,2
+4530,9906,east,Y,9001,2
+4530,9907,north,X,9001,1
+4531,9906,east,y,9001,2
+4531,9907,north,x,9001,1
+4532,9906,east,X,9001,2
+4532,9907,north,Y,9001,1
+6401,9901,north,Lat,9108,1
+6401,9902,east,Long,9108,2
+6401,9903,up,h,9001,3
+6402,9901,north,Lat,9108,1
+6402,9902,east,Long,9108,2
+6403,9901,north,Lat,9105,1
+6403,9902,east,Long,9105,2
+6404,9926,north,lat,9102,1
+6404,9927,east,long,9102,2
+6404,9928,up,R,9001,3
+6497,9904,up,H,9003,1
+6498,9905,down,D,9001,1
+6499,9904,up,H,9001,1
+6500,9910,Geocentre > equator/PM,X,9001,1
+6500,9911,Geocentre > equator/90dE,Y,9001,2
+6500,9912,Geocentre > north pole,Z,9001,3
+6501,9908,west,Y,9001,2
+6501,9909,south,X,9001,1
+6502,9908,west,Y,9031,1
+6502,9909,south,X,9031,2
+6503,9908,west,Y,9001,1
+6503,9909,south,X,9001,2
+6504,9918,north-east,e,9001,2
+6504,9919,north-west,n,9001,1
+6505,9913,north-west,n,9001,1
+6505,9914,north-east,e,9001,2
+6506,9913,east-south-east,I,9205,1
+6506,9914,north-north-east,J,9204,2
+6507,9913,north,X,9001,1
+6507,9914,west,Y,9001,2
+6508,9920,east south east,I,9208,2
+6508,9921,north north east,J,9209,1
+6509,9908,west,M,9001,2
+6509,9909,south,P,9001,1
diff --git a/src/tiff/csv/coordinate_axis_name.csv b/src/tiff/csv/coordinate_axis_name.csv
new file mode 100644
index 0000000..9b98cdb
--- /dev/null
+++ b/src/tiff/csv/coordinate_axis_name.csv
@@ -0,0 +1,29 @@
+"COORD_AXIS_NAME_CODE","COORD_AXIS_NAME","DESCRIPTION","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+9901,Geodetic latitude,"Angle from the equatorial plane to the perpendicular to the ellipsoid through a given point, northwards usually treated as positive.",Used in geographic 2D and geographic 3D coordinate systems.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9902,Geodetic longitude,"Angle from the prime meridian plane to the meridian plane passing through the given point, eastwards usually treated as positive.",Used in geographic 2D and geographic 3D coordinate systems.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9903,Ellipsoidal height,Distance of a point from the ellipsoid measured along the perpendicular from the ellipsoid to this point.  Positive if upwards or outside of the ellipsoid.,"Used only as part of a geographic 3D coordinate system, never on its own.",EPSG based on ISO 19111,EPSG,2000-03-07 00:00:00,,0
+9904,Gravity-related height,"Height influenced by the Earth's gravity field.  In particular, orthometric height or normal height which are both approximations of the distance of a point above sea level. Positive upwards.",Used in a 1D vertical coordinate system.,"ISO 19111 ""Geographical Information - Spatial Referencing by Coordinates"".",EPSG,2000-03-07 00:00:00,,0
+9905,Gravity-related depth,"Depth influenced by the Earth's gravity field, positive downwards.","Similar to gravity-related height, but with the positive increments in the opposite direction.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9906,Easting,East pointing axis used in 2D projected coordinate systems.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9907,Northing,North pointing axis used in 2D projected coordinate systems.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9908,Westing,West pointing axis used in 2D projected coordinate systems (e.g. south oriented transverse Mercator),,EPSG,EPSG,2000-03-07 00:00:00,,0
+9909,Southing,South pointing axis used in 2D projected coordinate systems (e.g. south oriented transverse Mercator),,EPSG,EPSG,2000-03-07 00:00:00,,0
+9910,Geocentric X,"First axis of a right-handed earth centered 3D cartesian coordinate system; lies in the zero-longitude plane, such that a vector pointing in the direction of the positive X will have a longitude of zero.",,EPSG,EPSG,2000-03-07 00:00:00,,0
+9911,Geocentric Y,"Second axis of a right-handed earth centered 3D cartesian coordinate system; perpendicular to the zero-longitude plane, pointing eastward",,EPSG,EPSG,2000-03-07 00:00:00,,0
+9912,Geocentric Z,"Third axis of a right-handed earth centered 3D coordinate system; perpendicular to both X and Y, such that it completes a right-handed coordinate system, the Z-axis is approximately parallel to the earth's rotation axis, positive towards the north pole.",,EPSG,EPSG,2000-03-07 00:00:00,,0
+9913,First local axis,First axis of any local coordinate system.,First and second local coordinate axes are assumed to be horizontal and may be supplemented by 'local height' or 'local depth' to form a local 3D coordinate system.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9914,Second local axis,Second axis of any local coordinate system.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9915,Third local axis,Third axis of any local coordinate system.,"If the local coordinate system is 3-dimensional, then the first and second local coordinate axes shall be horizontal and the third axis vertical.",EPSG,EPSG,2000-06-22 00:00:00,,0
+9916,Local height,"Height influenced by the Earth's gravity field, positive upwards.",Differs from gravity-related height in having an origin offset from sea level.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9917,Local depth,"Depth influenced by the Earth's gravity field, positive downwards.","Similar to local height, but with the positive increments in the opposite direction.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9918,Plant East,An axis of a local engineering grid 2D or 3D coordinate system.  Plant East is 90 degrees clockwise from the Plant North axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical east.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9919,Plant North,An axis of a local engineering grid 2D or 3D coordinate system.  Plant North is 90 degrees counter-clockwise from the Plant East axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical north.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9920,Bin grid I,First axis of seismic bin grid;  positive I is 90 degrees clockwise from positive J-axis when viewed from above the plane containing the two axes.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9921,Bin grid J,Second axis of seismic bin grid;  positive J is 90 degrees counter-clockwise from positive I-axis when viewed from above the plane containing the two axes.,,EPSG,EPSG,2000-03-07 00:00:00,,0
+9922,Inline,First axis of a seismic bingrid.,"Inline is an ambiguous term, varying by usage.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9923,Crossline,Second axis of a seismic bingrid.,"Crossline is an ambiguous term, varying by usage.",EPSG,EPSG,2000-03-07 00:00:00,,0
+9924,Platform East,An axis of an offshore platform engineering grid 2D or 3D coordinate system.  Platform East is 90 degrees clockwise from the Platform North axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical east.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9925,Platform North,An axis of an offshore platform engineering grid 2D or 3D coordinate system.  Platform North is 90 degrees counter-clockwise from the Platform East axis when viewed from above the plane containing the two axes.,Not necessarily orientated to geographical east.,EPSG,EPSG,2000-06-23 00:00:00,,0
+9926,Spherical latitude,"Angle from the equatorial plane to the geocentric point vector, northwards usually treated as positive.",,Open GIS Consortium,EPSG,2002-02-12 00:00:00,,0
+9927,Spherical longitude,"Angle from the prime meridian plane to the meridian plane passing through a point, eastwards usually treated as positive.",,Open GIS Consortium,EPSG,2002-02-12 00:00:00,,0
+9928,Geocentric radius,The distance from the (geocentric) coordinate system origin to a point. The third axis of a spherical coordinate system.,Used to avoid the singularity when the two angles in a 3D polar coordinate system lie in the same plane.,Open GIS Consortium,EPSG,2002-02-12 00:00:00,,0
diff --git a/src/tiff/csv/coordinate_operation.csv b/src/tiff/csv/coordinate_operation.csv
new file mode 100644
index 0000000..d8ca81b
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation.csv
@@ -0,0 +1,2020 @@
+"COORD_OP_CODE","COORD_OP_NAME","COORD_OP_TYPE","SOURCE_CRS_CODE","TARGET_CRS_CODE","COORD_TFM_VERSION","COORD_OP_VARIANT","AREA_OF_USE_CODE","COORD_OP_SCOPE","COORD_OP_METHOD_CODE","UOM_CODE_SOURCE_OFFSETS","UOM_CODE_TARGET_OFFSETS","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","SHOW_OPERATION","DEPRECATED"
+1025,ED50 to ED87 (1),transformation,4230,4231,5Nat-NSea-90,1,2330,?,9630,9102,9102,Latitude differences from ED50 to ED87 in decimal degrees given by coefficients A0 through A14 where m=(latitude - 55) degrees and n=longitude in decimal degrees.  Longitude differences given through coefficients B0 through B14.,Norwegian Mapping Authority publication 1990:1,EPSG,2002-06-22 00:00:00,99.74  2000.55 2002.40,1,0
+1026,Madrid 1870 (Madrid) to ED50 (1),transformation,4903,4230,IGB-Esp,1,2366,?,9617,,,It is preferable to use whichever of either Madrid 1870 (Madrid) to ED50 (2) (code 1002) or Madrid 1870 (Madrid) to ED50 (3) (code 1003) is applicable to the area.,Institut de Geomatica; Barcelona,EPSG,2000-03-07 00:00:00,99.82  99.74,1,0
+1027,Madrid 1870 (Madrid) to ED50 (2),transformation,4903,4230,IGB-Esp N,2,2367,?,9617,,,Use in preference to Madrid 1870 (Madrid) to ED50 (1) (code 1001).,Institut de Geomatica; Barcelona,EPSG,2000-03-07 00:00:00,99.82  99.74,1,0
+1028,Madrid 1870 (Madrid) to ED50 (3),transformation,4903,4230,IGB-Esp S,3,2368,?,9617,,,Use in preference to Madrid 1870 (Madrid) to ED50 (1) (code 1001).,Institut de Geomatica; Barcelona,EPSG,2000-03-07 00:00:00,99.82  99.74,1,0
+1029,Amersfoort / RD New to ED50 / UTM zone 31N (1),transformation,28992,23031,NCG-Nld,1,1172,?,9632,9001,9001,For reverse transformation see ED50 / UTM 31N to Amersfoort / RD New (1) (code 1030).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1030,ED50 / UTM zone 31N to Amersfoort / RD New (1),transformation,23031,28992,NCG-Nld,1,1172,?,9632,9001,9001,For reverse transformation see Amersfoort / RD New to ED50 / UTM zone 31 (1) (code 1029).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1031,Amersfoort / RD New to ED50 / UTM zone 31N (2),transformation,28992,23031,NAM-Nld,2,1172,Oil exploration.,9632,9001,9001,Used by NAM.  For reverse transformation see ED50 / UTM zone 31N to Amersfoort / RD New (2) (code 1032).,Shell / NAM,EPSG,2000-03-07 00:00:00,,1,0
+1032,ED50 / UTM zone 31N to Amersfoort / RD New (2),transformation,23031,28992,NAM-Nld,2,1172,Oil exploration.,9632,9001,9001,Used by NAM.  For reverse transformation see Amersfoort / RD New to ED50 / UTM zone 31 (2) (code 1031).,Shell / NAM,EPSG,2000-03-07 00:00:00,,1,0
+1033,Belge 72 / Lambert to ED50 / UTM zone 31N (1),transformation,31300,23031,NCG-Bel,1,1044,?,9631,9001,9001,For reverse transformation see ED50 / UTM 31N to Belge 72 / Lambert (code 1034).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1034,ED50 / UTM zone 31N to Belge 72 / Lambert (1),transformation,23031,31300,NCG-Bel,1,1044,?,9631,9001,9001,For reverse transformation see Belge 72 / Lambert to ED50 / UTM 31N (code 1033).,"Nederlandse Commissie voor Geodesie publication 30; ""Globale en Lokale Geodetische Systemen""; G. Strang van Hees.",EPSG,2000-03-07 00:00:00,,1,0
+1035,Astra Minas to Campo Inchauspe / Argentina 2,transformation,5800,22192,IHS-Arg ComRiv,1,1265,Oil exploration.,9621,,,,IHS Energy,EPSG,2000-06-23 00:00:00,,1,0
+1036,OSGB 1936 / British National Grid to ETRS89 (1),transformation,27700,4258,OSGB-Gbr,1,1264,Accuracy 0.2m at 67% confidence level.,9633,,,May be taken as approximate transformation OSGB 1936 / British National Grid to WGS 84 - see code 1681.,http://www.gps.gov.uk/gpssurveying.asp,EPSG,2000-10-19 00:00:00,,1,0
+1037,Amersfoort / RD New to ED50 / TM 5 NE (1),transformation,28992,23095,NAM-Nld,1,1630,Oil exploration.,9632,9001,9001,Used by NAM.  For reverse transformation see ED50 / TM 5 NE to Amersfoort / RD New (1) (code 1038).,Shell / NAM,EPSG,2002-07-13 00:00:00,,1,0
+1038,ED50 / TM 5 NE to Amersfoort / RD New (1),transformation,23095,28992,NAM-Nld,2,1630,Oil exploration.,9632,9001,9001,Used by NAM.  For reverse transformation see Amersfoort / RD New to ED50 / TM 5 NE (1) (code 1037).,Shell / NAM,EPSG,2002-07-13 00:00:00,,1,0
+1100,Adindan to WGS 84 (1),transformation,4201,4326,DMA-Eth Sud,1,1271,For military purposes only. Accuracy 5m in each axis.,9603,,,Derived at 22 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1101,Adindan to WGS 84 (2),transformation,4201,4326,DMA-Bfa,2,1057,For military purposes.  Accuracy 25m in each axis.,9603,,,"Derived at 1 station connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Burkino Faso.",U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1102,Adindan to WGS 84 (3),transformation,4201,4326,DMA-Cmr,3,1060,For military purposes.  Accuracy 25m in each axis.,9603,,,"Derived at 1 station connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Cameroon.",U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1103,Adindan to WGS 84 (4),transformation,4201,4326,DMA-Eth,4,1091,For military purposes.  Accuracy 3m in each axis.,9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1104,Adindan to WGS 84 (5),transformation,4201,4326,DMA-Mli,5,1153,For military purposes.  Accuracy 25m in each axis.,9603,,,"Derived at 1 station connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Mali.",U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1105,Adindan to WGS 84 (6),transformation,4201,4326,DMA-Sen,6,1207,For military purposes.  Accuracy 25m in each axis.,9603,,,"Derived at 2 stations connected to the Adindan network through the 1968-69 12th parallel traverse. Note: Adindan datum is used in Ethiopia and Sudan, not Senegal.",U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.38,1,0
+1106,Adindan to WGS 84 (7),transformation,4201,4326,DMA-Sud,7,1221,"For military purposes.  Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1107,Afgooye to WGS 84 (1),transformation,4205,4326,DMA-Som,1,1214,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1108,AGD66 to WGS 84 (1),transformation,4202,4326,DMA-Aus,1,1036,For military purposes only.  Accuracy 3m in each axis.,9603,,,Derived at 105 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1109,AGD84 to WGS 84 (1),transformation,4203,4326,DMA-Aus,1,1036,For military purposes only.  Accuracy 2m in each axis.,9603,,,Derived at 90 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1110,Ain el Abd to WGS 84 (1),transformation,4204,4326,DMA-Bhr,1,1040,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,97.06,1,0
+1111,Ain el Abd to WGS 84 (2),transformation,4204,4326,DMA-Sau,2,1206,For military purposes.  Accuracy 10m in each axis.,9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1112,Amersfoort to WGS 84 (1),transformation,4289,4326,NCG-Nld 93,1,1172,?,9606,,,Superseded by Amersfoort to ETRS89 (2) (code 1751) and Amersfoort to WGS 84 (2) (code 1672).,Nederlandse Commissie voor Geodesie publication 30; 1993.,EPSG,1997-04-11 00:00:00,97.07,1,0
+1113,Arc 1950 to WGS 84 (1),transformation,4209,4326,DMA-mean,1,2312,"For military purposes only.  Accuracy 20m, 33m and 20m in X, Y and Z axes.",9603,,,Derived at 41 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1114,Arc 1950 to WGS 84 (2),transformation,4209,4326,DMA-Bwa,2,1051,"For military purposes.  Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1115,Arc 1950 to WGS 84 (3),transformation,4209,4326,DMA-Bdi,3,1058,For military purposes.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1116,Arc 1950 to WGS 84 (4),transformation,4209,4326,DMA-Lso,4,1141,"For military purposes.  Accuracy 3m, 3m and 8m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1117,Arc 1950 to WGS 84 (5),transformation,4209,4326,DMA-Mwi,5,1150,"For military purposes.  Accuracy 9m, 24m and 8m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1118,Arc 1950 to WGS 84 (6),transformation,4209,4326,DMA-Swz,6,1224,For military purposes.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1119,Arc 1950 to WGS 84 (7),transformation,4209,4326,DMA-Cod,7,1259,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1120,Arc 1950 to WGS 84 (8),transformation,4209,4326,DMA-Zmb,8,1260,"For military purposes.  Accuracy 21m, 21m and 27m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1121,Arc 1950 to WGS 84 (9),transformation,4209,4326,DMA-Zwe,9,1261,"For military purposes.  Accuracy 5m, 8m and 11m in X, Y and Z axes.",9603,,,Derived at 10 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1122,Arc 1960 to WGS 84 (1),transformation,4210,4326,DMA-Ken Tza,1,2311,For military purposes only.  Accuracy 20m in each axis.,9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1123,Batavia to WGS 84 (1),transformation,4211,4326,DMA-Idn Sumatra,1,1355,For military purposes.  Accuracy 3m in each axis.,9603,,,Note: The area of use cited for this transformation (Sumatra) is not consistent with the area of use (Java) for the Batavia (Genuk) coordinate system. Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1124,Bermuda 1957 to WGS 84 (1),transformation,4216,4326,DMA-Bmu,1,1047,For military purposes.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1125,Bogota 1975 to WGS 84 (1),transformation,4218,4326,DMA-Col,1,1070,"For military purposes.  Accuracy 6m, 5m and 6m in X, Y and Z axes.",9603,,,Derived in 1987 at 7 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1126,Bukit Rimpah to WGS 84 (1),transformation,4219,4326,DMA-Idn BBI,1,1287,For military purposes.,9603,,,Accuracy estimates unavailable.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+1127,Campo Inchauspe to WGS 84 (1),transformation,4221,4326,DMA-Arg,1,1033,For military purposes.  Accuracy 5m in each axis.,9603,,,Derived at 20 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1128,Cape to WGS 84 (1),transformation,4222,4326,DMA-Zaf,1,1215,"For military purposes.  Accuracy 3m, 6m and 6m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1129,Cape to WGS 84 (2),transformation,4222,4326,DSLI-Zaf,2,1215,?,9603,,,Parameter values are from Cape to Hartebeesthoek94 (1) (code 1504) assuming that Hartebeesthoek94 and WGS 84 are equivalent within the accuracy of the transformation.,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,1996-10-18 00:00:00,,1,0
+1130,Carthage to WGS 84 (1),transformation,4223,4326,DMA-Tun,1,1236,"For military purposes.  Accuracy 6m, 9m and 8m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1131,Chua to WGS 84 (1),transformation,4224,4326,DMA-Pry,1,1188,"For military purposes.  Accuracy 6m, 9m and 5m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1132,Corrego Alegre to WGS 84 (1),transformation,4225,4326,DMA-Bra,1,1053,"For military purposes.  Accuracy 5m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 17 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1133,ED50 to WGS 84 (1),transformation,4230,4326,DMA-mean,1,2420,"For military purposes only.  Accuracy 3m, 8m and 5m in X, Y and Z axes.",9603,,,Derived at 85 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,97.02,1,0
+1134,ED50 to WGS 84 (2),transformation,4230,4326,DMA-cenEur,2,2421,For military purposes only.  Accuracy 3m each axis.,9603,,,Derived at 52 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1135,ED50 to WGS 84 (3),transformation,4230,4326,DMA-midEast,3,2345,For military purposes only.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1136,ED50 to WGS 84 (4),transformation,4230,4326,DMA-Cyp,4,1078,For military purposes only.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1137,ED50 to WGS 84 (5),transformation,4230,4326,DMA-Egy,5,1086,"For military purposes.  Accuracy 6m, 8m and 8m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1138,ED50 to WGS 84 (6),transformation,4230,4326,DMA-Irl Gbr,6,2343,For military purposes only.  Accuracy 3m in each axis.,9603,,,Derived at 40 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1139,ED50 to WGS 84 (7),transformation,4230,4326,DMA-Fin Nor,7,2344,"For military purposes.  Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 20 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1140,ED50 to WGS 84 (8),transformation,4230,4326,DMA-Grc,8,1106,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1141,ED50(ED77) to WGS 84 (2),transformation,4154,4326,DMA-Irn,2,1123,"For military purposes.  Accuracy 9m, 12m and 11m in X, Y and Z axes.",9603,,,Given by DMA as from ED50.  EPSG interpret that as ED50(ED77) in Iran. Derived at 27 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2000-03-07 00:00:00,2000.06,1,0
+1142,ED50 to WGS 84 (10),transformation,4230,4326,DMA-Ita Sard,10,2339,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1143,ED50 to WGS 84 (11),transformation,4230,4326,DMA-Ita Sic,11,2340,For military purposes only.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1144,ED50 to WGS 84 (12),transformation,4230,4326,DMA-Mlt,12,1154,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1145,ED50 to WGS 84 (13),transformation,4230,4326,DMA-Prt Esp,13,2338,"For military purposes only.  Accuracy 5m, 6m and 3m in X, Y and Z axes.",9603,,,Derived at 18 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1146,ED87 to WGS 84 (1),transformation,4231,4326,5Nat-NSea-90,1,2330,?,9606,,,,"Norwegian Mapping Authority publication 1990:1 and note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge""",EPSG,1997-04-11 00:00:00,97.03  97.04,1,0
+1147,ED50 to ED87 (2),transformation,4230,4231,NMA-Nor N65,2,2331,Geodetic purposes.,9606,,,,"Norwegian Mapping Authority note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge""",EPSG,1997-04-11 00:00:00,97.04,1,0
+1148,Egypt 1907 to WGS 84 (1),transformation,4229,4326,DMA-Egy,1,1086,"For military purposes.  Accuracy 3m, 6m and 8m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1149,ETRS89 to WGS 84 (1),transformation,4258,4326,EPSG-eur,1,2420,ETRS89 is a realisation of WGS 84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,9603,,,,EPSG,EPSG,2000-10-19 00:00:00,97.24  2000.72,1,0
+1150,GDA94 to WGS 84 (1),transformation,4283,4326,EPSG-Aus,1,1036,GDA94 is a realisation of WGS 84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,9603,,,,EPSG,EPSG,1996-10-18 00:00:00,,1,0
+1151,NZGD49 to WGS 84 (1),transformation,4272,4326,DMA-Nzl,1,1175,"For military purposes only.  Accuracy 5m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 14 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1152,Hu Tzu Shan to WGS 84 (1),transformation,4236,4326,DMA-Twn,1,1228,For military purposes.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1153,Indian 1954 to WGS 84 (1),transformation,4239,4326,DMA-Tha,1,1231,"For military purposes.  Accuracy 15m, 6m and 12m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,97.06,1,0
+1154,Indian 1975 to WGS 84 (1),transformation,4240,4326,DMA-Tha,1,1231,"For military purposes.  Accuracy 3m, 2m and 3m in X, Y and Z axes.",9603,,,Derived at 62 stations.,U.S. Defense Mapping Agency  TR8350.2 second edition September 1991,EPSG,1996-10-18 00:00:00,,1,0
+1155,Kalianpur 1937 to WGS 84 (1),transformation,4144,4326,DMA-Bgd,1,1041,"For military purposes.  Accuracy 10m, 8m and 12m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1999-10-20 00:00:00,97.235,1,0
+1156,Kalianpur 1975 to WGS 84 (1),transformation,4146,4326,DMA-Ind Npl,1,2411,"For military purposes.  Accuracy 12m, 10m and 15m in X, Y and Z axes.",9603,,,Care!  DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate. Derived at 7 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1999-10-20 00:00:00,97.235,1,0
+1157,Kandawala to WGS 84 (1),transformation,4244,4326,DMA-Lka,1,1218,For military purposes.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1158,Kertau to WGS 84 (1),transformation,4245,4326,DMA-Mys Sgp,1,1309,"For military purposes.  Accuracy 10m, 8m and 6m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1159,Leigon to WGS 84 (1),transformation,4250,4326,DMA-Gha,1,1104,"For military purposes.  Accuracy 2m, 3m and 2m in X, Y and Z axes.",9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1160,Liberia 1964 to WGS 84 (1),transformation,4251,4326,DMA-Lbr,1,1142,For military purposes only.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1161,Luzon 1911 to WGS 84 (1),transformation,4253,4326,DMA-Phl N,1,2364,"For military purposes.  Accuracy 8m, 11m and 9m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1162,Luzon 1911 to WGS 84 (2),transformation,4253,4326,DMA-Phl Min,2,2365,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1163,M'poraloko to WGS 84 (1),transformation,4266,4326,DMA-Gab,1,1100,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1164,Mahe 1971 to WGS 84 (1),transformation,4256,4326,DMA-Syc,1,2369,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1165,Massawa to WGS 84 (1),transformation,4262,4326,DMA-Eth,1,1089,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1166,Merchich to WGS 84 (1),transformation,4261,4326,DMA-Mar,1,1166,"For military purposes.  Accuracy 5m, 3m and 3m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1167,Minna to WGS 84 (1),transformation,4263,4326,DMA-Cmr,1,1060,For military purposes only.  Accuracy 25m in each axis.,9603,,,"Derived at 2 stations.  Note: Minna is used in Nigeria, not Cameroon.",U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1168,Minna to WGS 84 (2),transformation,4263,4326,DMA-Nga,2,1178,"For military purposes.  Accuracy 3m, 6m and 5m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1169,Monte Mario to WGS 84 (1),transformation,4265,4326,DMA-Ita Sar,1,2339,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1170,NAD27 to WGS 84 (1),transformation,4267,4326,DMA-Carib,1,2418,"For military purposes.  Accuracy 3m, 9m and 12m in X, Y and Z axes.",9603,,,Derived at 15 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1171,NAD27 to WGS 84 (2),transformation,4267,4326,DMA-Cen Am,2,2419,"For military purposes only.  Accuracy 8m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 19 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1172,NAD27 to WGS 84 (3),transformation,4267,4326,DMA-Can,3,1061,"For military purposes only.  Accuracy 15m, 11m and 6m in X, Y and Z axes.",9603,,,Derived at 112 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1173,NAD27 to WGS 84 (4),transformation,4267,4326,DMA-Conus,4,1323,"For military purposes only.  Accuracy 5m, 5m and 6m in X, Y and Z axes.",9603,,,Derived at 405 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1174,NAD27 to WGS 84 (5),transformation,4267,4326,DMA-ConusE,5,2389,"For military purposes only.  Accuracy 5m, 5m and 8m in X, Y and Z axes.",9603,,,Derived at 129 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1175,NAD27 to WGS 84 (6),transformation,4267,4326,DMA-ConusW,6,2390,"For military purposes only.  Accuracy 5m, 3m and 3m in X, Y and Z axes.",9603,,,Derived at 276 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1176,NAD27 to WGS 84 (7),transformation,4267,4326,DMA-USA AK,7,2412,"For military purposes only.  Accuracy 5m, 9m and 5m in X, Y and Z axes.",9603,,,Derived at 47 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1177,NAD27 to WGS 84 (8),transformation,4267,4326,DMA-Bha xSalv,8,2413,"For military purposes.  Accuracy 5m, 3m and 5m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1178,NAD27 to WGS 84 (9),transformation,4267,4326,DMA-Bha Salv,9,2414,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1179,NAD27 to WGS 84 (10),transformation,4267,4326,DMA-Can AB BC,10,2384,"For military purposes only.  Accuracy 8m, 8m and 6m in X, Y and Z axes.",9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1180,NAD27 to WGS 84 (11),transformation,4267,4326,DMA-Can MN ON,11,2415,"For military purposes only.  Accuracy 9m, 5m and 5m in X, Y and Z axes.",9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1181,NAD27 to WGS 84 (12),transformation,4267,4326,DMA-Can E,12,2416,"For military purposes only.  Accuracy 6m, 6m and 3m in X, Y and Z axes.",9603,,,Derived at 37 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1182,NAD27 to WGS 84 (13),transformation,4267,4326,DMA-Can NWT,13,2410,"For military purposes only.  Accuracy 5m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 17 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1183,NAD27 to WGS 84 (14),transformation,4267,4326,DMA-Can Yuk,14,2417,"For military purposes only.  Accuracy 5m, 8m and 3m in X, Y and Z axes.",9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1184,NAD27 to WGS 84 (15),transformation,4267,4326,DMA-Pan,15,2385,For military purposes.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1185,NAD27 to WGS 84 (16),transformation,4267,4326,DMA-Cuba,16,1077,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1186,NAD27 to WGS 84 (17),transformation,4267,4326,DMA-Grl,17,2386,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1187,NAD27 to WGS 84 (18),transformation,4267,4326,DMA-Mex,18,1160,"For military purposes only.  Accuracy 8m, 6m and 6m in X, Y and Z axes.",9603,,,Derived at 22 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1188,NAD83 to WGS 84 (1),transformation,4269,4326,DMA-N Am,1,1325,Accuracy 2m in each axis.,9603,,,Derived at 312 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,97.06,1,0
+1189,Nahrwan 1967 to WGS 84 (1),transformation,4270,4326,DMA-Omn Mas,1,2391,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1190,Nahrwan 1967 to WGS 84 (2),transformation,4270,4326,DMA-Sau,2,1206,For military purposes.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1191,Nahrwan 1967 to WGS 84 (3),transformation,4270,4326,DMA-UAE,3,1243,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1192,Naparima 1972 to WGS 84 (1),transformation,4271,4326,DMA-Tto,1,1235,For military purposes only.,9603,,,CAUTION: EPSG believes that these parameter values include a blunder and that if NIMA transformation parameters are to be used the 1987 version (EPSG code 1307) be used.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1998-06-30 00:00:00,98.102,1,0
+1193,NTF to WGS 84 (1),transformation,4275,4326,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report RT/G 14; January 1988.,EPSG,1996-10-18 00:00:00,,1,0
+1195,OSGB 1936 to WGS 84 (1),transformation,4277,4326,DMA-Gbr,1,1264,"For military purposes only.  Accuracy 10m, 10m and 15m in X, Y and Z axes.",9603,,,Derived at 38 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1196,OSGB 1936 to WGS 84 (2),transformation,4277,4326,DMA-Gbr Eng,2,2395,"For military purposes only.  Accuracy 5m, 5m and 6m in X, Y and Z axes.",9603,,,Derived at 24 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1197,OSGB 1936 to WGS 84 (3),transformation,4277,4326,DMA-Gbr E&W,3,2396,"For military purposes only.  Accuracy 10m, 10m and 15m in X, Y and Z axes.",9603,,,Derived at 25 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1198,OSGB 1936 to WGS 84 (4),transformation,4277,4326,DMA-Gbr Sco,4,2397,For military purposes only.  Accuracy 10m in each axis.,9603,,,Derived at 13 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1199,OSGB 1936 to WGS 84 (5),transformation,4277,4326,DMA-Gbr Wal,5,2398,For military purposes only.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1200,Pointe Noire to WGS 84 (1),transformation,4282,4326,DMA-Cog,1,1072,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1201,PSAD56 to WGS 84 (1),transformation,4248,4326,DMA-mean,1,2399,"For military purposes only.  Accuracy 17m, 27m and 27m in X, Y and Z axes.",9603,,,Derived at 63 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1202,PSAD56 to WGS 84 (2),transformation,4248,4326,DMA-Bol,2,1049,"For military purposes only.  Accuracy 5m, 11m and 14m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1203,PSAD56 to WGS 84 (3),transformation,4248,4326,DMA-Chl N,3,2402,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1204,PSAD56 to WGS 84 (4),transformation,4248,4326,DMA-Chl S,4,2403,For military purposes.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1205,PSAD56 to WGS 84 (5),transformation,4248,4326,DMA-Col,5,1070,For military purposes.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1206,PSAD56 to WGS 84 (6),transformation,4248,4326,DMA-Ecu,6,1085,"For military purposes.  Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1207,PSAD56 to WGS 84 (7),transformation,4248,4326,DMA-Guy,7,1114,"For military purposes.  Accuracy 6m, 14m and 5m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1208,PSAD56 to WGS 84 (8),transformation,4248,4326,DMA-Per,8,1189,"For military purposes only.  Accuracy 6m, 8m and 12m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1209,PSAD56 to WGS 84 (9),transformation,4248,4326,DMA-Ven,9,1251,"For military purposes only.  Accuracy 9m, 14m and 15m in X, Y and Z axes.",9603,,,Derived at 24 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1211,Qornoq to WGS 84 (1),transformation,4287,4326,DMA-Grl S,1,2407,"For military purposes.  Accuracy 25m, 25m and 32m in X, Y and Z axes.",9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,1
+1212,SAD69 to WGS 84 (1),transformation,4291,4326,DMA-mean,1,1341,"For military purposes only.  Accuracy 15m, 6m and 9m in X, Y and Z axes.",9603,,,Derived at 84 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1213,SAD69 to WGS 84 (2),transformation,4291,4326,DMA-Arg,2,1033,For military purposes only.  Accuracy 5m in each axis.,9603,,,Derived at 10 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1214,SAD69 to WGS 84 (3),transformation,4291,4326,DMA-Bol,3,1049,For military purposes.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1215,SAD69 to WGS 84 (4),transformation,4291,4326,DMA-Bra,4,1053,"For military purposes only.  Accuracy 3m, 5m and 5m in X, Y and Z axes.",9603,,,Derived at 22 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1216,SAD69 to WGS 84 (5),transformation,4291,4326,DMA-Chile,5,1066,"For military purposes only.  Accuracy 15m, 8m and 11m in X, Y and Z axes.",9603,,,Derived at 9 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1217,SAD69 to WGS 84 (6),transformation,4291,4326,DMA-Col,6,1070,"For military purposes only.  Accuracy 6m, 6m and 5m in X, Y and Z axes.",9603,,,Derived at 7 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1218,SAD69 to WGS 84 (7),transformation,4291,4326,DMA-Ecu,7,1085,For military purposes.  Accuracy 3m in each axis.,9603,,,Derived at 11 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1219,SAD69 to WGS 84 (8),transformation,4291,4326,DMA-Ecu Gal,8,2356,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1220,SAD69 to WGS 84 (9),transformation,4291,4326,DMA-Guy,9,1114,"For military purposes only.  Accuracy 9m, 5m and 5m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1221,SAD69 to WGS 84 (10),transformation,4291,4326,DMA-Pgy,10,1188,For military purposes.  Accuracy 15m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1222,SAD69 to WGS 84 (11),transformation,4291,4326,DMA-Peru,11,1189,For military purposes.  Accuracy 5m in each axis.,9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1223,SAD69 to WGS 84 (12),transformation,4291,4326,DMA-Tto,12,1235,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1224,SAD69 to WGS 84 (13),transformation,4291,4326,DMA-Ven,13,1251,"For military purposes only.  Accuracy 3m, 6m and 3m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1225,Sapper Hill 1943 to WGS 84 (1),transformation,4292,4326,DMA-Flk E,1,2355,For military purposes.  Accuracy 1m in each axis.,9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1226,Schwarzeck to WGS 84 (1),transformation,4293,4326,DMA-Nam,1,1169,For military purposes only.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1227,Tananarive to WGS 84 (1),transformation,4297,4326,DMA-Mdg,1,1149,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1228,Timbalai 1948 to WGS 84 (1),transformation,4298,4326,DMA-Borneo,1,1362,"For military purposes.  Accuracy 10m, 10m and 12m in X, Y and Z axes.",9603,,,Derived at 8 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1229,TM65 to WGS 84 (1),transformation,4299,4326,DMA-Ire,1,1305,For military purposes only.  Accuracy 3m in each axis.,9603,,,Derived at 7 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1230,Tokyo to WGS 84 (1),transformation,4301,4326,DMA-Jpn Kor,1,2409,"For military purposes only.  Accuracy 20m, 5m and 20m in X, Y and Z axes.",9603,,,Derived at 31 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,97.06,1,0
+1231,Tokyo to WGS 84 (2),transformation,4301,4326,DMA-Jpn,2,1129,"For military purposes only.  Accuracy 8m, 5m and 8m in X, Y and Z axes.",9603,,,Derived at 16 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1232,Tokyo to WGS 84 (3),transformation,4301,4326,DMA-Kor,3,1135,For military purposes only.  Accuracy 2m in each axis.,9603,,,Derived at 29 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,97.06,1,0
+1233,Tokyo to WGS 84 (4),transformation,4301,4326,DMA-Jpn Ok,4,2408,"For military purposes only.  Accuracy 20m, 5m and 20m in X, Y and Z axes.",9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1996-10-18 00:00:00,,1,0
+1234,Yacare to WGS 84 (1),transformation,4309,4326,DMA-Ury,1,1247,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1235,Zanderij to WGS 84 (1),transformation,4311,4326,DMA-Sur,1,1222,"For military purposes.  Accuracy 5m, 5m and 8m in X, Y and Z axes.",9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1996-10-18 00:00:00,,1,0
+1236,AGD84 to WGS 84 (2),transformation,4203,4326,Auslig-Aus old,2,1036,Preliminary estimate - now superseded.,9607,,,"""Higgins parameters"". Superseded by AGD84 to GDA94 (2) (code 1280) and AGD84 to WGS 84 (7) (code 1669).",Australian Surveying and Land Information Group - www.auslig.gov.au/geodesy,EPSG,1997-11-13 00:00:00,,1,0
+1237,WGS 72 to WGS 84 (1),transformation,4322,4326,DMA1,1,1262,For scientific purposes.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1238,WGS 72 to WGS 84 (2),transformation,4322,4326,DMA2,2,1262,For scientific purposes.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1239,WGS 72BE to WGS 72 (1),transformation,4324,4322,DMA,1,1262,Geodesy.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1240,WGS 72BE to WGS 84 (1),transformation,4324,4326,DMA,1,2346,Geodesy.,9606,,,,,EPSG,1996-12-12 00:00:00,,1,0
+1241,NAD27 to NAD83 (1),transformation,4267,4269,NGS-Usa Conus,1,2374,"Accuracy at 67% confidence level is 0.15m onshore, 5m nearshore and undetermined farther offshore.",9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,98.201  98.53  2000.14,1,0
+1243,NAD27 to NAD83 (2),transformation,4267,4269,NGS-Usa AK,2,2373,"Accuracy at 67% confidence level is 0.5m onshore, 5m nearshore and undetermined farther offshore.",9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,98.201  98.53  2000.14,1,0
+1245,ED50 to WGS 84 (16),transformation,4230,4326,DMA-Tun,16,1236,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 4 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1998-04-16 00:00:00,98.11,1,0
+1246,Herat North to WGS 84 (1),transformation,4255,4326,DMA-Afg,1,1024,For military purposes only.,9603,,,No accuracy estimate available.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1247,Kalianpur 1962 to WGS 84 (1),transformation,4145,4326,DMA-Pak,1,1184,For military purposes.,9603,,,Care!  DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.  No accuracy estimate available.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1999-10-20 00:00:00,97.235,1,0
+1248,ID74 to WGS 84 (1),transformation,4238,4326,DMA-Idn,1,1122,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+1249,NAD27 to WGS 84 (21),transformation,4267,4326,DMA-AK AluE,21,2387,"For military purposes only.  Accuracy 6m, 8m and 10m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1250,NAD27 to WGS 84 (22),transformation,4267,4326,DMA-AK AluW,22,2388,For military purposes.  Accuracy 10m in each axis.,9603,,,Derived at 5 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1251,NAD83 to WGS 84 (2),transformation,4269,4326,DMA-AK Alu,2,2157,"For military purposes only.  Accuracy 5m, 2m and 5m in X, Y and Z axes.",9603,,,Derived at 42 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1252,NAD83 to WGS 84 (3),transformation,4269,4326,DMA-USA Hi,3,1334,For military purposes only.  Accuracy 2m in each axis.,9603,,,Derived at 6 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1253,Nord Sahara 1959 to WGS 84 (1),transformation,4307,4326,DMA-Alg,1,1026,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1254,Pulkovo 1942 to WGS 84 (1),transformation,4284,4326,DMA-Rus,1,1198,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1255,Nord Sahara 1959 to WGS 84 (2),transformation,4307,4326,DMA-Dza N,2,1365,For military purposes only.  Accuracy 25m in each axis.,9603,,,CAUTION:  Source CRS described by DMA as from Voirol 1960. EPSG believes that the data used in the derivation of these parameters contains a blunder.  We recommend using transformation North Sahara 1959 to WGS84 (1) (code 1253). Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,2000-06-23 00:00:00,98.15  2000.47,1,0
+1256,Fahud to WGS 84 (1),transformation,4232,4326,DMA-Omn,1,1183,"For military purposes.  Accuracy 3m, 3m and 9m in X, Y and Z axes.",9603,,,"Derived at 7 stations. Source CRS  in information source is called ""Oman"".",U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1997-04-11 00:00:00,,1,0
+1258,Bogota 1975 (Bogota) to Bogota 1975 (Greenwich),transformation,4802,4218,IGAC-Col,1,1070,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1259,Lisbon (Lisbon) to Lisbon (Greenwich),transformation,4803,4207,IGC-Prt,1,1294,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1260,Makassar (Jakarta) to Makassar,transformation,4804,4257,EPSG-Idn Sulawesi,1,1316,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1261,MGI (Ferro) to MGI (Greenwich),transformation,4805,4312,BEV-Aut balk,1,1166,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1262,Monte Mario (Rome) to Monte Mario,transformation,4806,4265,EPSG-Ita,1,1127,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,98.37  99.79,1,0
+1263,Padang (Jakarta) to Padang (Greenwich),transformation,4808,4280,EPSG-Idn Sumatra,1,1355,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1264,Belge 1950 (Brussels) to Belge 1950,transformation,4809,4215,IGN-Bel,1,1347,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1265,Tananarive (Paris) to Tananarive,transformation,4810,4297,EPSG-Mdg,1,1149,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1266,Voirol 1875 (Paris) to Voirol 1875,transformation,4811,4304,IGN-Dza,1,2347,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,0
+1268,Batavia (Jakarta) to Batavia (Greenwich),transformation,4813,4211,EPSG-Idn Java,1,1285,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1269,RT38 (Stockholm) to RT38 (Greenwich),transformation,4814,4308,NLS-Swe,1,1225,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-11-12 00:00:00,99.79,1,1
+1270,Greek (Athens) to Greek (Greenwich),transformation,4815,4120,NTU-Grc,1,1106,Change of prime meridian.,9601,,,,Topography Department; National Technical University of Athens.,EPSG,1999-11-12 00:00:00,99.79,1,1
+1271,Schwarzeck to WGS 84 (2),transformation,4293,4326,SLI-Nam,2,1169,?,9603,,,Beware!   Schwarzeck CRS uses German legal metres.  Example:  Schwarzeck Lat 19d 35m 46.952s S Long 20d 41m 50.649s E; X=5623409.40 Y=2124618.00 Z=-2125847.62 GLM; X=5623485.86 Y=2124646.89 Z=-2125876.53 m; WGS84 X=5624101.50 Y=2124748.97 Z=2126132.34 m.,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-11-13 00:00:00,97.48,1,0
+1272,GGRS87 to WGS 84 (1),transformation,4121,4326,Hel-Grc,1,1106,?,9603,,,,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+1273,HD72 to ETRS89 (1),transformation,4237,4258,ELTE-Hun,1,1119,?,9607,,,May be taken as approximate transformation HD72 to WGS 84 - see code 1677.,http://lazarus.elte.hu/gb/geodez/geod5.htm,EPSG,1997-11-13 00:00:00,97.47,1,1
+1274,Pulkovo 1942 to LKS94(ETRS89) (1),transformation,4284,4126,HNIT-Ltu,1,1145,?,9607,,,May be taken as approximate transformation Pulkovo 1942 to WGS 84 - see code 1679.,HNIT-BALTIC GeoInfoServisas.,EPSG,1998-03-12 00:00:00,,1,0
+1275,ED50 to WGS 84 (17),transformation,4230,4326,IGN-Fra,17,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report 14 (January 1988).,EPSG,1998-04-16 00:00:00,98.11,1,0
+1276,NTF to ED50 (1),transformation,4275,4230,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report 7 (October 1981).,EPSG,1997-11-13 00:00:00,,1,0
+1277,NTF to WGS 72 (1),transformation,4275,4322,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,,IGN technical report 7 (October 1981).,EPSG,1997-11-13 00:00:00,,1,0
+1278,AGD66 to GDA94 (1),transformation,4202,4283,Auslig-Aus 5m,1,1036,5m accuracy.,9603,,,Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html  For higher accuracy requirements see various regional transformations.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,1997-11-13 00:00:00,,1,0
+1279,AGD84 to GDA94 (1),transformation,4203,4283,Auslig-Aus 5m,1,1036,5m accuracy.,9603,,,Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,1997-11-13 00:00:00,,1,0
+1280,AGD84 to GDA94 (2),transformation,4203,4283,Auslig-Aus 1m,2,1036,1m accuracy.,9607,,,Supersedes AGD84 to WGS 84 (2) (code 1236).  May be taken as approximate transformation AGD84 to WGS 84 - see code 1669.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/simil.htm,EPSG,1997-11-13 00:00:00,,1,0
+1282,Samboja to WGS 84 (1),transformation,4125,4326,TOT-Idn Mah,1,1328,Oil exploration.,9603,,,Datum shift derived through ITRF93.,Total Indonesia.,EPSG,2000-03-07 00:00:00,2000.23,1,1
+1283,LKS94(ETRS89) to WGS 84 (1),transformation,4126,4326,HNIT-Ltu,1,1145,LKS94 is a realisation of WGS 84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,9603,,,,HNIT-BALTIC GeoInfoServisas.,EPSG,1998-03-12 00:00:00,98.13,1,0
+1284,Arc 1960 to WGS 84 (2),transformation,4210,4326,NIMA-Ken,2,1132,"For military purposes.  Accuracy 4m, 3m and 3m in X, Y and Z axes.",9603,,,Derived at 24 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-03-12 00:00:00,,1,0
+1285,Arc 1960 to WGS 84 (3),transformation,4210,4326,NIMA-Tza,3,1230,"For military purposes.  Accuracy 6m, 9m and 10m in X, Y and Z axes.",9603,,,Derived at 12 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-03-12 00:00:00,,1,0
+1286,Segora to WGS 84 (1),transformation,4294,4326,NIMA-Idn Kal,1,2354,For military purposes.,9603,,,Accuracy estimate not available.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-03-12 00:00:00,,1,1
+1287,Pulkovo 1942 to WGS 84 (3),transformation,4284,4326,NIMA-Hun,3,1119,For military purposes.  Accuracy 2m in each axis.,9603,,,Derived at 5 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1288,Pulkovo 1942 to WGS 84 (4),transformation,4284,4326,NIMA-Pol,4,1192,"For military purposes only.  Accuracy 4m, 2m and 4m in X, Y and Z axes.",9603,,,Derived at 11 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1289,Pulkovo 1942 to WGS 84 (5),transformation,4284,4326,NIMA-Cze,5,1079,"For military purposes only.  Accuracy 3m, 3m and 2m in X, Y and Z axes.",9603,,,Derived at 6 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1290,Pulkovo 1942 to WGS 84 (6),transformation,4284,4326,NIMA-Lva,6,1139,For military purposes.  Accuracy 2m in each axis.,9603,,,Derived at 5 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1291,Pulkovo 1942 to WGS 84 (7),transformation,4284,4326,NIMA-Kaz,7,1131,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1292,Pulkovo 1942 to WGS 84 (8),transformation,4284,4326,NIMA-Alb,8,1025,For military purposes.  Accuracy 3m in each axis.,9603,,,Derived at 7 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1293,Pulkovo 1942 to WGS 84 (9),transformation,4284,4326,NIMA-Rom,9,1197,"For military purposes.  Accuracy 3m, 5m and 3m in X, Y and Z axes.",9603,,,Derived at 4 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,98.11,1,0
+1294,Voirol 1875 to WGS 84 (1),transformation,4304,4326,NIMA-Dza N,1,2347,For military purposes.,9603,,,Accuracy estimate not available.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,1998-03-12 00:00:00,,1,0
+1296,Trinidad 1903 to WGS 84 (1),transformation,4302,4326,Amoco-Tto Trin,1,1339,Oil exploration.,9603,,,Derived in 1989 by ONI for Amoco.,Trinidad Ministry of Energy and Energy Industries.,EPSG,1998-11-11 00:00:00,98.38,1,0
+1297,Tete to Moznet (1),transformation,4127,4130,DNGC-Moz,1,1167,Residuals as high as 30 metres.,9607,,,Mean of 32 stations. To reduce the size of the residuals; four regional parameter sets (see codes 1298-1301) were developed. May be taken as approximate transformation Moznet to WGS 84 - see code 1683.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1298,Tete to Moznet (2),transformation,4127,4130,DNGC-Moz A,2,2350,Residuals are generally under 1 metre.,9607,,,Mean of 9 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1684.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1299,Tete to Moznet (3),transformation,4127,4130,DNGC-Moz B,3,2351,Residuals are generally under 4 metres.,9607,,,Mean of 6 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1685.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1300,Tete to Moznet (4),transformation,4127,4130,DNGC-Moz C,4,2352,Residuals are generally under 3 metres.,9607,,,Mean of 11 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1686.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1301,Tete to Moznet (5),transformation,4127,4130,DNGC-Moz D,5,2353,Residuals are 5-10 metres.,9607,,,Mean of 7 stations. May be taken as approximate transformation Moznet to WGS 84 - see code 1687.,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+1302,Moznet to WGS 84 (1),transformation,4130,4326,EPSG-Moz,1,1167,For many purposes Moznet can be considered to be coincident with WGS 84. Accuracy better than 1 metre.,9607,,,,EPSG,EPSG,1998-04-16 00:00:00,,1,0
+1303,Pulkovo 1942 to WGS 84 (10),transformation,4284,4326,KCS-Kaz Cas,10,2405,Residuals under 2 m.,9606,,,Mean of 13 stations along entire Kazak coastline.,KazakCaspiShelf consortium.,EPSG,2000-02-02 00:00:00,2000.05,1,0
+1304,Indian 1975 to WGS 84 (2),transformation,4240,4326,NIMA-Tha,2,1231,"For military purposes.  Accuracy 3m, 2m and 3m in X, Y and Z axes.",9603,,,Derived at 62 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,,1,0
+1305,Tokyo to WGS 84 (5),transformation,4301,4326,NIMA-Kor,5,1135,For military purposes.,9603,,,Derived at 29 stations.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,,1,0
+1306,MGI to WGS 84 (1),transformation,4312,4326,NIMA-balk,1,2370,For military purposes only.,9603,,,Accuracy estimate not available.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,1998-04-16 00:00:00,,1,0
+1307,Naparima 1972 to WGS 84 (3),transformation,4271,4326,NIMA-Tto Tob,3,1322,For military purposes only.  Accuracy 15m in each axis.,9603,,,(1) See remarks for tfm code 1192.  (2) Naparima 1972 is an extension to Tobago of the Napaima 1955 geographic CRS of Trindad.  In Trinidad this transformation may also be considered to use Napaima 1955 (code 4158) as its source CRS: see tfm code 1556.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,1998-04-16 00:00:00,,1,0
+1308,NAD83 to WGS 84 (4),transformation,4269,4326,NGS-Usa ITRF94,4,1323,Historical record only - superseded - see remarks.,9607,,,Strictly between NAD83 and ITRF94(1996.0).  Superseded by NAD83 to WGS 84 (5) (code 1515).,US National Geodetic Survey  http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,1999-04-22 00:00:00,99.12  99.38,1,0
+1309,DHDN to ETRS89 (1),transformation,4314,4258,IfAG-Deu W,1,2326,For applications with an accuracy at 5 m level.,9607,,,Mean of 69 stations. May be taken as approximate transformation DHDN to WGS 84 - see code 1673. Also given by EuroGeographics at http://crs.ifag.de/ as a Position Vector transformation with changed values for rotations.,Institute for Cartography and Geodesy; Leipzig.,EPSG,2000-10-19 00:00:00,2000.72,1,0
+1310,Pulkovo 1942 to ETRS89 (1),transformation,4284,4258,IfAG-Deu E,1,1343,Residuals under 2 m.,9607,,,Mean of 20 stations.,Institute for Cartography and Geodesy; Leipzig.,EPSG,2000-10-19 00:00:00,2000.72,1,1
+1311,ED50 to WGS 84 (Common Offshore),transformation,4230,4326,UKOOA-CO,18,2342,Recommended transformation for UKCS petroleum purposes.,9606,,,Based on ED50 to WGS72 (precise ephemeris) 6-nations agreement of 1981 to which precise to broadcast and broadcast to WGS 84 transformations have been concatenated.,The Hydrographic Journal; vol 52 page 50.,EPSG,1998-06-30 00:00:00,98.27,1,0
+1312,NAD27 to NAD83 (3),transformation,4267,4269,GC-Can NT1,3,1061,Historic record only - now superseded - see remarks.,9614,,,Uses NTv1 method.  Superseded in Quebec by code 1462 and elsewhere in 1997 by NTv2 (transformation code 1313).  Input expects longitudes to be positive west; EPSG GeogCRS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,Geomatics Canada - Geodetic Survey Division.,EPSG,2000-03-07 00:00:00,98.57  2000.14,1,0
+1313,NAD27 to NAD83 (4),transformation,4267,4269,GC-Can NT2,4,1061,Accuracy 1-2 metres.,9615,,,Uses NTv2 data files.  Supersedes  NTv1 (transformation code 1312) except in Quebec.  Input expects longitudes to be positive west; EPSG GeogCRS NAD27 (code 4267) and (code 4269) have longitudes positive east.,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,2000-03-07 00:00:00,98.57  2000.14,1,0
+1314,OSGB 1936 to WGS 84 (Petroleum),transformation,4277,4326,UKOOA-Pet,6,2394,Oil exploration. Accuracy better than 4m and generally better than 2m.,9606,,,For a more accurate transformation see OSGB 1936 / British National Grid to ETRS89 (1) (code 1036): contact the Ordnance Survey of Great Britain (http://www.gps.gov.uk/gpssurveying.asp) for details.,UK Offshore Operators Association. Also at EuroGeographics at http://crs.ifag.de,EPSG,1998-11-11 00:00:00,,1,0
+1315,OSGB 1936 to ED50 (UKOOA),transformation,4277,4230,UKOOA-UKCS,1,2394,For oil exploration. Accuracy better than 4m and generally better than 2m.,9606,,,This transformation is concatenated from OSGB36 to WGS 84 (Petroleum) (code 1314) minus ED50 to WGS 84 (Common Offshore) (code 1311).,UK Offshore Operators Association.,EPSG,1998-11-11 00:00:00,,1,0
+1316,Manoca to WGS 84 (1),transformation,4260,4326,SCS-Cmr,1,1060,?,9603,,,,Stolt Comex Seaway and Geoid for Elf.,EPSG,1998-11-11 00:00:00,,1,1
+1317,Camacupa to WGS 72BE (1),transformation,4220,4324,GSI-Ago,1,1604,Oil exploration.,9603,,,Derived by Geophysical Services Inc. in 1979 from mean of Transit results at 7 stations.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1318,Camacupa to WGS 84 (1),transformation,4220,4326,CON-Ago B5,1,2316,Used for oil exploration by Conoco.,9603,,,,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1319,Camacupa to WGS 84 (2),transformation,4220,4326,TEX-Ago B2,2,2317,Used for oil exploration by Texaco.,9603,,,,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1320,Camacupa to WGS 84 (3),transformation,4220,4326,SHL-Ago old,3,2321,Used by Shell prior to 1994.,9606,,,Superseded by Camacupa to WGS 84 (9).,EPSG,EPSG,1998-12-14 00:00:00,98.56,1,0
+1321,Camacupa to WGS 84 (4),transformation,4220,4326,GSI-Ago,4,2320,Used for oil exploration.,9603,,,"Derived as mean of 123 Transit passes at station Cabo Ledo NE base in November 1990. Used by Elf for block 7 up to December 1992 then superseded by Camacupa to WGS 84 (7). Used by Total in block 8, ExxonMobil block 24, Western Geophysical for spec. data.",EPSG,EPSG,2000-03-07 00:00:00,2000.16,1,0
+1322,Camacupa to WGS 84 (5),transformation,4220,4326,ELF-Ago B3 old,5,2318,Used for oil exploration by Elf for block 3 up to December 1992 then Superseded by Camacupa to WGS 84 (7).,9603,,,Derived at station Djeno during coordination of platform PAL F2 in February 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1323,Camacupa to WGS 84 (6),transformation,4220,4326,ELF-Ago B7 old,6,2319,Used for oil exploration by Elf for 1993 block 7 shallow water survey.,9603,,,Derived at Luanda observatory December 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1324,Camacupa to WGS 84 (7),transformation,4220,4326,ELF-Ago B15,7,2322,"Used for oil exploration by Elf for blocks 3, 7 and 17 between December 1992 and 1994 then Superseded by Camacupa to WGS 84 (10).  Used by Exxon for block 15 since 1993.",9603,,,Derived at platform PAL F2 in December 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1325,Camacupa to WGS 84 (8),transformation,4220,4326,ELF-Ago B2 old,8,2317,Used for oil exploration by Total for block 2 between December 1992 and 1994 then Superseded by Camacupa to WGS 84 (10).,9603,,,Derived at platform PAL F2 in December 1992.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1326,Camacupa to WGS 84 (9),transformation,4220,4326,SHL-Ago B16,9,2323,Used by Shell since 1994.,9606,,,Supersedes Camacupa to WGS 84 (3).,EPSG,EPSG,1998-12-14 00:00:00,98.56,1,0
+1327,Camacupa to WGS 84 (10),transformation,4220,4326,ELF-Ago N,10,2324,Used for oil exploration by Elf in blocks 3 and 17 since 1994.  Used by Total in block 2 since 1994. Adopted by BP-Amoco Elf and Exxon for blocks 31-33.,9603,,,Derived at platform PAL F2 in 1994 by Topnav using Doris.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1328,Malongo 1987 to Mhast (1),transformation,4259,4264,CHV-Ago Cab,1,1317,Used for oil exploration.,9603,,,Malongo 1987 is an offshore extension of Mhast adopted by Chevron in 1987.,EPSG,EPSG,1998-11-11 00:00:00,,1,0
+1329,Mhast to WGS 84 (1),transformation,4264,4326,CHV-Ago Cab,1,1317,"Used for oil exploration by Chevron until superseded in 1990 by trf Malongo 1987 to WGS 84 (2), code 1557.",9603,,,"Superseded in 1990 by trf Malongo 1987 to WGS 84 (2), code 1557.  Malongo 1987 is an offshore extension of the Mhast cooordinate system.",Chevron.,EPSG,1998-11-11 00:00:00,,1,0
+1330,Malongo 1987 to WGS 84 (1),transformation,4259,4326,CHV-Ago Cab89,1,1317,"Used for oil exploration by Chevron until superseded in 1990 by trf Malongo 1987 to WGS 84 (2), code 1557.",9603,,,Derived at Station Y in 1989 via WGS72.,Chevron.,EPSG,1998-11-11 00:00:00,,1,0
+1331,EST92 to ETRS89 (1),transformation,4133,4258,UT-Est,1,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,2000-10-19 00:00:00,2000.72,1,0
+1332,Pulkovo 1942 to EST92 (1),transformation,4284,4133,UT-Est,1,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+1333,EST92 to WGS 84 (1),transformation,4133,4326,UT-Est,1,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+1334,Pulkovo 1942 to WGS 84 (12),transformation,4284,4326,UT-Est,12,1090,?,9607,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+1335,Tokyo to WGS 84 (6),transformation,4301,4326,GSI-Jpn 452141,6,2425,For medium accuracy.,9618,,,,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,1998-12-12 00:00:00,,1,1
+1336,Tokyo to WGS 84 (7),transformation,4301,4326,GSI-Jpn 452142,7,2426,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1337,Tokyo to WGS 84 (8),transformation,4301,4326,GSI-Jpn 444141,8,2427,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1338,Tokyo to WGS 84 (9),transformation,4301,4326,GSI-Jpn 444142,9,2428,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1339,Tokyo to WGS 84 (10),transformation,4301,4326,GSI-Jpn 440141,10,2429,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1340,Tokyo to WGS 84 (11),transformation,4301,4326,GSI-Jpn 440142,11,2430,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1341,Tokyo to WGS 84 (12),transformation,4301,4326,GSI-Jpn 440143,12,2431,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1342,Tokyo to WGS 84 (13),transformation,4301,4326,GSI-Jpn 440144,13,2432,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1343,Tokyo to WGS 84 (14),transformation,4301,4326,GSI-Jpn 432141,14,2433,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1344,Tokyo to WGS 84 (15),transformation,4301,4326,GSI-Jpn 432142,15,2434,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1345,Tokyo to WGS 84 (16),transformation,4301,4326,GSI-Jpn 432143,16,2435,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1346,Tokyo to WGS 84 (17),transformation,4301,4326,GSI-Jpn 432144,17,2436,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1347,Tokyo to WGS 84 (18),transformation,4301,4326,GSI-Jpn 432145,18,2437,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1348,Tokyo to WGS 84 (19),transformation,4301,4326,GSI-Jpn 424140,19,2438,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1349,Tokyo to WGS 84 (20),transformation,4301,4326,GSI-Jpn 424141,20,2439,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,99.77 2002.08,1,0
+1350,Tokyo to WGS 84 (21),transformation,4301,4326,GSI-Jpn 424142,21,2440,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1351,Tokyo to WGS 84 (22),transformation,4301,4326,GSI-Jpn 424143,22,2441,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1352,Tokyo to WGS 84 (23),transformation,4301,4326,GSI-Jpn 424144,23,2442,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1353,Tokyo to WGS 84 (24),transformation,4301,4326,GSI-Jpn 424145,24,2443,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1354,Tokyo to WGS 84 (25),transformation,4301,4326,GSI-Jpn 420139,25,2444,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1355,Tokyo to WGS 84 (26),transformation,4301,4326,GSI-Jpn 420140,26,2445,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1356,Tokyo to WGS 84 (27),transformation,4301,4326,GSI-Jpn 420141,27,2446,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1357,Tokyo to WGS 84 (28),transformation,4301,4326,GSI-Jpn 420142,28,2447,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1358,Tokyo to WGS 84 (29),transformation,4301,4326,GSI-Jpn 420143,29,2448,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1359,Tokyo to WGS 84 (30),transformation,4301,4326,GSI-Jpn 412140,30,2449,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1360,Tokyo to WGS 84 (31),transformation,4301,4326,GSI-Jpn 412141,31,2450,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1361,Tokyo to WGS 84 (32),transformation,4301,4326,GSI-Jpn 404140,32,2451,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1362,Tokyo to WGS 84 (33),transformation,4301,4326,GSI-Jpn 404141,33,2452,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1363,Tokyo to WGS 84 (34),transformation,4301,4326,GSI-Jpn 400139,34,2453,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1364,Tokyo to WGS 84 (35),transformation,4301,4326,GSI-Jpn 400140,35,2454,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1365,Tokyo to WGS 84 (36),transformation,4301,4326,GSI-Jpn 400141,36,2455,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1366,Tokyo to WGS 84 (37),transformation,4301,4326,GSI-Jpn 392139,37,2456,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1367,Tokyo to WGS 84 (38),transformation,4301,4326,GSI-Jpn 392140,38,2457,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1368,Tokyo to WGS 84 (39),transformation,4301,4326,GSI-Jpn 392141,39,2458,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1369,Tokyo to WGS 84 (40),transformation,4301,4326,GSI-Jpn 384139,40,2459,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1370,Tokyo to WGS 84 (41),transformation,4301,4326,GSI-Jpn 384140,41,2460,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1371,Tokyo to WGS 84 (42),transformation,4301,4326,GSI-Jpn 384141,42,2461,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1372,Tokyo to WGS 84 (43),transformation,4301,4326,GSI-Jpn 380139,43,2462,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1373,Tokyo to WGS 84 (44),transformation,4301,4326,GSI-Jpn 380140,44,2463,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1374,Tokyo to WGS 84 (45),transformation,4301,4326,GSI-Jpn 380141,45,2464,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1375,Tokyo to WGS 84 (46),transformation,4301,4326,GSI-Jpn 372136,46,2465,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1376,Tokyo to WGS 84 (47),transformation,4301,4326,GSI-Jpn 372137,47,2466,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1377,Tokyo to WGS 84 (48),transformation,4301,4326,GSI-Jpn 372138,48,2467,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1378,Tokyo to WGS 84 (49),transformation,4301,4326,GSI-Jpn 372139,49,2468,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1379,Tokyo to WGS 84 (50),transformation,4301,4326,GSI-Jpn 372140,50,2469,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1380,Tokyo to WGS 84 (51),transformation,4301,4326,GSI-Jpn 372141,51,2470,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1381,Tokyo to WGS 84 (52),transformation,4301,4326,GSI-Jpn 364136,52,2471,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1382,Tokyo to WGS 84 (53),transformation,4301,4326,GSI-Jpn 364137,53,2472,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1383,Tokyo to WGS 84 (54),transformation,4301,4326,GSI-Jpn 364138,54,2473,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1384,Tokyo to WGS 84 (55),transformation,4301,4326,GSI-Jpn 364139,55,2474,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1385,Tokyo to WGS 84 (56),transformation,4301,4326,GSI-Jpn 364140,56,2475,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1386,Tokyo to WGS 84 (57),transformation,4301,4326,GSI-Jpn 360136,57,2476,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1387,Tokyo to WGS 84 (58),transformation,4301,4326,GSI-Jpn 360137,58,2477,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1388,Tokyo to WGS 84 (59),transformation,4301,4326,GSI-Jpn 360138,59,2478,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1389,Tokyo to WGS 84 (60),transformation,4301,4326,GSI-Jpn 360139,60,2479,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1390,Tokyo to WGS 84 (61),transformation,4301,4326,GSI-Jpn 360140,61,2480,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1391,Tokyo to WGS 84 (62),transformation,4301,4326,GSI-Jpn 352132,62,2481,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1392,Tokyo to WGS 84 (63),transformation,4301,4326,GSI-Jpn 352133,63,2482,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1393,Tokyo to WGS 84 (64),transformation,4301,4326,GSI-Jpn 352134,64,2483,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1394,Tokyo to WGS 84 (65),transformation,4301,4326,GSI-Jpn 352135,65,2484,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1395,Tokyo to WGS 84 (66),transformation,4301,4326,GSI-Jpn 352136,66,2485,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1396,Tokyo to WGS 84 (67),transformation,4301,4326,GSI-Jpn 352137,67,2486,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1397,Tokyo to WGS 84 (68),transformation,4301,4326,GSI-Jpn 352138,68,2487,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1398,Tokyo to WGS 84 (69),transformation,4301,4326,GSI-Jpn 352139,69,2488,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1399,Tokyo to WGS 84 (70),transformation,4301,4326,GSI-Jpn 352140,70,2489,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1400,Tokyo to WGS 84 (71),transformation,4301,4326,GSI-Jpn 344132,71,2490,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1401,Tokyo to WGS 84 (72),transformation,4301,4326,GSI-Jpn 344133,72,2491,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1402,Tokyo to WGS 84 (73),transformation,4301,4326,GSI-Jpn 344134,73,2492,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1403,Tokyo to WGS 84 (74),transformation,4301,4326,GSI-Jpn 344135,74,2493,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1404,Tokyo to WGS 84 (75),transformation,4301,4326,GSI-Jpn 344136,75,2494,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1405,Tokyo to WGS 84 (76),transformation,4301,4326,GSI-Jpn 344137,76,2495,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1406,Tokyo to WGS 84 (77),transformation,4301,4326,GSI-Jpn 344138,77,2496,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1407,Tokyo to WGS 84 (78),transformation,4301,4326,GSI-Jpn 344139,78,2497,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1408,Tokyo to WGS 84 (79),transformation,4301,4326,GSI-Jpn 344140,79,2498,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1409,Tokyo to WGS 84 (80),transformation,4301,4326,GSI-Jpn 340130,80,2499,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1410,Tokyo to WGS 84 (81),transformation,4301,4326,GSI-Jpn 340131,81,2500,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1411,Tokyo to WGS 84 (82),transformation,4301,4326,GSI-Jpn 340132,82,2501,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1412,Tokyo to WGS 84 (83),transformation,4301,4326,GSI-Jpn 340133,83,2502,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1413,Tokyo to WGS 84 (84),transformation,4301,4326,GSI-Jpn 340134,84,2503,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1414,Tokyo to WGS 84 (85),transformation,4301,4326,GSI-Jpn 340135,85,2504,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1415,Tokyo to WGS 84 (86),transformation,4301,4326,GSI-Jpn 340136,86,2505,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1416,Tokyo to WGS 84 (87),transformation,4301,4326,GSI-Jpn 340137,87,2506,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1417,Tokyo to WGS 84 (88),transformation,4301,4326,GSI-Jpn 340138,88,2507,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1418,Tokyo to WGS 84 (89),transformation,4301,4326,GSI-Jpn 332129,89,2508,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1419,Tokyo to WGS 84 (90),transformation,4301,4326,GSI-Jpn 332130,90,2509,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1420,Tokyo to WGS 84 (91),transformation,4301,4326,GSI-Jpn 332131,91,2510,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1421,Tokyo to WGS 84 (92),transformation,4301,4326,GSI-Jpn 332132,92,2511,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1422,Tokyo to WGS 84 (93),transformation,4301,4326,GSI-Jpn 332133,93,2512,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1423,Tokyo to WGS 84 (94),transformation,4301,4326,GSI-Jpn 332134,94,2513,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1424,Tokyo to WGS 84 (95),transformation,4301,4326,GSI-Jpn 332135,95,2514,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1425,Tokyo to WGS 84 (96),transformation,4301,4326,GSI-Jpn 332136,96,2515,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1426,Tokyo to WGS 84 (97),transformation,4301,4326,GSI-Jpn 324129,97,2516,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1427,Tokyo to WGS 84 (98),transformation,4301,4326,GSI-Jpn 324130,98,2517,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1428,Tokyo to WGS 84 (99),transformation,4301,4326,GSI-Jpn 324131,99,2518,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1429,Tokyo to WGS 84 (100),transformation,4301,4326,GSI-Jpn 324132,100,2519,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1430,Tokyo to WGS 84 (101),transformation,4301,4326,GSI-Jpn 324133,101,2520,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1431,Tokyo to WGS 84 (102),transformation,4301,4326,GSI-Jpn 324134,102,2521,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1432,Tokyo to WGS 84 (103),transformation,4301,4326,GSI-Jpn 320130,103,2522,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1433,Tokyo to WGS 84 (104),transformation,4301,4326,GSI-Jpn 320131,104,2523,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1434,Tokyo to WGS 84 (105),transformation,4301,4326,GSI-Jpn 320132,105,2524,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1435,Tokyo to WGS 84 (106),transformation,4301,4326,GSI-Jpn 312130,106,2525,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1436,Tokyo to WGS 84 (107),transformation,4301,4326,GSI-Jpn 312131,107,2526,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,2002.08,1,0
+1437,RT90 to ETRS89 (1),transformation,4124,4258,NLS-Swe,1,1225,Accuracy 0.5m.,9607,,,This transformation is actually between ETRS89 and RR92.  RR92 is a geographic 3D coordinate system where the horizontal component is RT90. Also at EuroGeographics; http:/crs.ifag.de/ with change of rotation convention (transformation method). Derived at,National Land Survey of Sweden.,EPSG,2000-10-19 00:00:00,99.11  2000.72,1,0
+1438,Fahud to WGS 84 (2),transformation,4232,4326,PDO-Omn,2,1183,Oil exploration.,9606,,,,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+1439,PSD93 to WGS 84 (1),transformation,4134,4326,PDO-Omn 97,1,1183,Oil exploration. Residuals 0.5m at 67% probability level.,9606,,,Superseded PSD93 to WGS 84 (2) (code 8581) in 1997.,Petroleum Development Oman,EPSG,2001-06-05 00:00:00,2000.28,1,0
+1440,ED50 to WGS 84 (19),transformation,4230,4326,HEL-Grc,19,1106,Used in oil industry.,9603,,,,Geodesy Department; Hellenic Petroleum s.a.,EPSG,1999-04-22 00:00:00,,1,0
+1441,Antigua 1943 to WGS 84 (1),transformation,4601,4326,DOS-Atg Ant,1,1273,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1442,Dominica 1945 to WGS 84 (1),transformation,4602,4326,DOS-Dma,1,1082,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1443,Grenada 1953 to WGS 84 (1),transformation,4603,4326,DOS-Grd,1,1108,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1444,Montserrat 1958 to WGS 84 (1),transformation,4604,4326,DOS-Msr,1,1165,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1445,St. Kitts 1955 to WGS 84 (1),transformation,4605,4326,DOS-Kna,1,1200,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1446,St. Lucia 1955 to WGS 84 (1),transformation,4606,4326,DOS-Lca,1,1201,?,9603,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1447,Anguilla 1957 to WGS 84 (1),transformation,4600,4326,DOS-Aia,1,1030,?,9619,,,,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+1450,ED50 to WGS 84 (20),transformation,4230,4326,NMA-Nor 6265W,20,2333,Oil exploration before 1997/2001.,9620,,,Valid 1991-1997. Superseded in 1997 by ED50 to WGS 84 (22) (code 1590) and in 2001 by ED50 to WGS 84 (23) (code 1612).,"Norwegian Mapping Authority note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge"".",EPSG,2000-03-07 00:00:00,2000.14,1,0
+1451,NAD27(CGQ77) to NAD83 (1),transformation,4609,4269,SGQ-Can QC NT1,1,1368,Historic record only - now superseded - see remarks.,9614,,,Superseded by NAD27(CGQ77) to NAD83 (2) (code 1575).  Uses NT method which expects longitudes positive west; EPSG GeogCRSs CGQ77 (code 4609) and NAD83 (code 4269) have longitudes positive east.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1454,Old Hawaiian to NAD83 (1),transformation,4135,4269,NGS-Usa HI,1,1334,Accuracy at 67% confidence level is 0.2m.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs Old Hawaiian (code 4135) and NAD83 (code 4269) have longitudes positive east.  NADCON data converts from Old Hawaiian Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1455,St. Lawrence Island to NAD83 (1),transformation,4136,4269,NGS-Usa AK StL,1,1332,Accuracy 0.5m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs St. Lawrence (code 4136) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Lawrence Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1456,St. Paul Island to NAD83 (1),transformation,4137,4269,NGS-Usa AK StP,1,1333,Accuracy 0.5m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs St. Paul (code 4137) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Paul Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1457,St. George Island to NAD83 (1),transformation,4138,4269,NGS-Usa AK StG,1,1331,Accuracy 0.5m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs St. George (code 4138) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. George Datum to but makes the transformation appear to be from NAD27.,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1458,AGD66 to GDA94 (2),transformation,4202,4283,Auslig-ACT 1m,2,2283,Recommended for mid-accuracy use in A.C.T.  1m accuracy.,9607,,,For higher accuracy requirements see AGD66 to GDA94 (10) (code 1596).  May be taken as approximate transformation AGD66 to WGS 84 - see code 1665.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1999-05-25 00:00:00,,1,0
+1459,AGD66 to GDA94 (3),transformation,4202,4283,Auslig-Tas 1m old,3,1282,1m accuracy.,9607,,,Superseded in 2000 by AGD66 to GDA94 (8) (code 1594). Differences are sub-metre.,GDA Technical Manual version Dec 1998. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1999-05-25 00:00:00,2000.68,1,0
+1460,AGD66 to GDA94 (4),transformation,4202,4283,Auslig-NSW Vic 1m,4,2286,Recommended for mid-accuracy use in NSW and Victoria.  1m accuracy.,9607,,,For higher accuracy requirements see AGD66 to GDA94 (10) (code 1596).  May be taken as approximate transformation AGD66 to WGS 84 - see code 1666.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1999-05-25 00:00:00,,1,0
+1461,Puerto Rico to NAD83 (1),transformation,4139,4269,NGS-PRVI,1,1335,Accuracy 0.05m at 67% confidence level.,9613,,,,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1462,NAD27 to NAD83 (5),transformation,4267,4269,SGQ-Can QC NT1,5,1368,Historic record only - now superseded - see remarks.,9614,,,Densification for Quebec of code 1312. Superseded by NAD27 to NAD83 (6) (code 1573).  Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1463,NAD27(76) to NAD83 (1),transformation,4608,4269,SGQ-Can Ont,1,1367,?,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(76) (code 4608) and NAD83 (code 4269) have longitudes positive east. May be taken as approximate transformation NAD27(76) to WGS 84 - see code 1690.,Geodetic Survey of Canada   http://www.geod.emr.ca/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1464,AGD66 to GDA94 (5),transformation,4202,4283,OSG-Aus Vic old,5,2285,0.1m accuracy.,9615,,,Superseded by AGD66 to GDA94 (10) (code 1596) and then by AGD66 to GDA94 (11) (code 1803).  Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,http://www.osg.vic.gov.au/tools.htm,EPSG,2000-03-07 00:00:00,99.67  2000.14  2000.68,1,0
+1466,NGO 1948 (Oslo) to NGO1948 (Greenwich),transformation,4817,4273,NGO-Nor,1,1352,Change of prime meridian.,9601,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-11-12 00:00:00,99.79,1,1
+1467,NTF (Paris) to NTF (Greenwich) (1),transformation,4807,4275,IGN-Fra,1,1096,Change of prime meridian.,9601,,,,IGN Paris.,EPSG,1999-11-12 00:00:00,99.63  99.79,1,1
+1468,NTF (Paris) to NTF (Greenwich) (2),transformation,4807,4275,RGS,2,1096,Change of prime meridian.,9601,,,EPSG prefers value from IGN Paris (code 1467).,Royal Geographic Society; London,EPSG,1999-11-12 00:00:00,99.63  99.79,1,1
+1469,Locodjo 1965 to WGS 84 (1),transformation,4142,4326,IGN-Civ,1,2282,?,9603,,,,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+1470,Abidjan 1987 to WGS 84 (1),transformation,4143,4326,IGN-Civ,1,2282,?,9603,,,,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+1471,MGI to WGS 84 (2),transformation,4312,4326,BEV-Aut,1,1037,For applications to an accuracy of 1.5 metres.,9606,,,,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,1
+1472,ATS77 to NAD83(CSRS98) (1),transformation,4122,4140,GIC-Can NB,1,1447,?,9615,,,Introduced in 1999. Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1688.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,2000-10-19 00:00:00,2000.14  2000.66,1,1
+1473,NAD83(CSRS98) to WGS 84 (1),transformation,4140,4326,EPSG-Can,1,1336,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,9603,,,For many purposes NAD83(CSRS98) can be considered to be coincident with WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+1474,NAD83 to NAD83(HARN) (1),transformation,4269,4152,NGS-Usa AL,1,1372,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.  May be taken as approximate transformation NAD83-WGS 84 - see code 1717.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1475,NAD83 to NAD83(HARN) (2),transformation,4269,4152,NGS-Usa AZ,2,1373,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1728.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1476,NAD83 to NAD83(HARN) (3),transformation,4269,4152,NGS-Usa CA n,3,2297,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1739.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1477,NAD83 to NAD83(HARN) (4),transformation,4269,4152,NGS-Usa CA s,4,2298,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1750.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1478,NAD83 to NAD83(HARN) (5),transformation,4269,4152,NGS-Usa CO,5,1376,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1712.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1479,NAD83 to NAD83(HARN) (6),transformation,4269,4152,NGS-Usa GA,6,1380,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1713.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1480,NAD83 to NAD83(HARN) (7),transformation,4269,4152,NGS-Usa FL,7,1379,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1714.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1481,NAD83 to NAD83(HARN) (8),transformation,4269,4152,NGS-Usa ID MT e,8,2382,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.  May be taken as approximate transformation NAD83-WGS 84 - see code 1715.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1482,NAD83 to NAD83(HARN) (9),transformation,4269,4152,NGS-Usa ID MT w,9,2383,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1716.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1483,NAD83 to NAD83(HARN) (10),transformation,4269,4152,NGS-Usa KY,10,1386,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1718.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1484,NAD83 to NAD83(HARN) (11),transformation,4269,4152,NGS-Usa LA,11,1387,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1719.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1485,NAD83 to NAD83(HARN) (12),transformation,4269,4152,NGS-Usa DE MD,12,2377,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1720.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1486,NAD83 to NAD83(HARN) (13),transformation,4269,4152,NGS-Usa ME,13,1388,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1721.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1487,NAD83 to NAD83(HARN) (14),transformation,4269,4152,NGS-Usa MI,14,1391,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1722.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1488,NAD83 to NAD83(HARN) (15),transformation,4269,4152,NGS-Usa MS,15,1393,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1723.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1489,NAD83 to NAD83(HARN) (16),transformation,4269,4152,NGS-Usa NE,16,1396,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1724.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1490,NAD83 to NAD83(HARN) (17),transformation,4269,4152,NGS-Usa NewEng,17,2378,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1725.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1491,NAD83 to NAD83(HARN) (18),transformation,4269,4152,NGS-Usa NM,18,1400,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1726.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1492,NAD83 to NAD83(HARN) (19),transformation,4269,4152,NGS-Usa NY,19,1401,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1727.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1493,NAD83 to NAD83(HARN) (20),transformation,4269,4152,NGS-Usa ND,20,1403,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1729.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1494,NAD83 to NAD83(HARN) (21),transformation,4269,4152,NGS-Usa OK,21,1405,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1730.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1495,NAD83 to NAD83(HARN) (22),transformation,4269,4152,NGS-PRVI,22,1335,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1731.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1496,NAD83 to NAD83(HARN) (23),transformation,4269,4152,NGS-Usa SD,23,1410,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1732.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1497,NAD83 to NAD83(HARN) (24),transformation,4269,4152,NGS-Usa TN,24,1411,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1733.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1498,NAD83 to NAD83(HARN) (25),transformation,4269,4152,NGS-Usa TX e,25,2379,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1734.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1499,NAD83 to NAD83(HARN) (26),transformation,4269,4152,NGS-Usa TX w,26,2380,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1735.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1500,NAD83 to NAD83(HARN) (27),transformation,4269,4152,NGS-Usa VA,27,1415,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1736.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1501,NAD83 to NAD83(HARN) (28),transformation,4269,4152,NGS-Usa OR WA,28,2381,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1737.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1502,NAD83 to NAD83(HARN) (29),transformation,4269,4152,NGS-Usa WI,29,1418,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1738.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1503,NAD83 to NAD83(HARN) (30),transformation,4269,4152,NGS-Usa WY,30,1419,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1740.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-03-07 00:00:00,99.931  2000.14,1,0
+1504,Cape to Hartebeesthoek94 (1),transformation,4222,4148,DSM-Zaf,1,1215,?,9603,,,Also used to transform Cape to WGS 84 - see code 1129.,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-01-06 00:00:00,99.96,1,0
+1505,Hartebeesthoek94 to WGS 84 (1),transformation,4148,4326,EPSG-Zaf,1,1215,For many purposes Hartebeesthoek94 datum can be considered to be coincident with WGS 84.,9603,,,,EPSG,EPSG,2000-01-06 00:00:00,99.96,1,0
+1506,AGD66 to GDA94 (6),transformation,4202,4283,OSG-Tas 0.1m,6,1282,0.1m accuracy.,9615,,,Superseded by AGD66 to GDA94 (11) (code 1803). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,http://www.delm.tas.gov.au/osg/Geodetic_transform.htm,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1507,AGD66 to GDA94 (7),transformation,4202,4283,Auslig-NT 0.1m,7,2284,0.1m accuracy.,9615,,,Superseded by AGD66 to GDA94 (11) (code 1803). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/chapter7.htm#high,EPSG,2000-03-07 00:00:00,2000.14,1,0
+1508,CH1903 to WGS 84 (1),transformation,4149,4326,BfL-CH 1,1,1286,?,9607,,,Implemented in Bundesamt f�r Landestopographie programme GRANIT.,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,1
+1509,CH1903+ to CHTRF95 (1),transformation,4150,4151,BfL-CH,1,1286,For applications to an accuracy of 0.1 metres.,9603,,,This transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRF95 is a realisation of ETRS89. May be taken as approximate transformation CH1903+ to WGS 84 - see code 1676.,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,0
+1510,CH1903 to WGS 84 (2),transformation,4149,4326,BfL-CH 2,2,1286,Accuracy 1.5 metres.,9603,,,These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the accuracy of the distortions in the CH1903 network.,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,1
+1511,CHTRF95 to WGS 84 (1),transformation,4151,4326,EPSG-CH,1,1286,For many purposes CHTRF95 can be considered to be coincident with WGS 84.,9603,,,,EPSG,EPSG,1999-10-20 00:00:00,,1,0
+1512,Rassadiran to WGS 84 (1),transformation,4153,4326,TOT-Irn Taheri,1,1338,Oil industry engineering survey. Used only for terminal site.,9603,,,Derived in 1998 at Assaluyeh (Taheri refinery) by Geoid for Total. Used for South Pars phases 2 and 3.,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+1513,FD58 to WGS 84 (1),transformation,4132,4326,TOT-Irn Kangan,1,2362,Oil exploration.,9603,,,Derived in 1998 in Kangan district by Geoid for Total. Used for South Pars phases 2 and 3.,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+1514,ED50(ED77) to WGS 84 (1),transformation,4154,4326,NCCI-Irn,1,1123,?,9606,,,"Used for South Pars phases 6, 7 and 8.",National Cartographic Centre of Iran,EPSG,1999-10-20 00:00:00,,1,0
+1515,NAD83 to WGS 84 (5),transformation,4269,4326,NGS-Usa ITRF96,5,1323,Geodesy.,9607,,,Strictly between NAD83 and ITRF96(1997.0).  Supersedes NAD83 to WGS 84 (4) (code 1308)., http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,1999-11-05 00:00:00,,1,0
+1516,La Canoa to WGS 84 (1),transformation,4247,4326,LAG-Ven E,1,2363,Parameter values estimated accuracy: � 2.0m;  � 2.7m;  � 1.3m respectively.,9603,,,Also used for PSAD56 to WGS 84 transformations.,"Lagoven; Gonzalez Losano y Rodriguez; ""Determination de los Parametros de Transformacion para el Oriente del Pais""; VII Venezuelan Geophysical Congress; September 1994.",EPSG,1999-11-05 00:00:00,,1,0
+1517,Conakry 1905 to WGS 84 (1),transformation,4315,4326,IGN-Gin,1,1112,?,9603,,,,IGN Paris,EPSG,1999-12-09 00:00:00,,1,0
+1518,Dabola 1981 to WGS 84 (1),transformation,4155,4326,IGN-Gin,1,1112,?,9603,,,,IGN Paris,EPSG,1999-12-09 00:00:00,,1,0
+1519,Bern 1898 (Bern) to CH1903 (Greenwich),transformation,4801,4149,BfL-CH,1,1286,Change of prime meridian.,9601,,,,EPSG,EPSG,1999-12-09 00:00:00,,1,1
+1520,NAD83 to NAD83(HARN) (31),transformation,4269,4152,NGS-Usa HI,31,1334,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1741.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1521,NAD83 to NAD83(HARN) (32),transformation,4269,4152,NGS-Usa IN,32,1383,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1742.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,2000-01-06 00:00:00,,1,0
+1522,NAD83 to NAD83(HARN) (33),transformation,4269,4152,NGS-Usa KS,33,1385,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1743.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1523,NAD83 to NAD83(HARN) (34),transformation,4269,4152,NGS-Usa NV,34,1397,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1744.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1524,NAD83 to NAD83(HARN) (35),transformation,4269,4152,NGS-Usa OH,35,1404,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1745.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1525,NAD83 to NAD83(HARN) (36),transformation,4269,4152,NGS-Usa UT,36,1413,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1746.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1526,NAD83 to NAD83(HARN) (37),transformation,4269,4152,NGS-Usa WV,37,1417,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1747.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1527,Campo Inchauspe to WGS 84 (2),transformation,4221,4326,TOT-Arg Neu,2,2325,Oil exploration.,9603,,,Derived through ties at 2 stations (Cerro Colorado and Chihuido Sur) to 4 IGS stations,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1528,Chos Malal 1914 to Campo Inchauspe (1),transformation,4160,4221,TOT-Arg Neu,1,2325,Oil exploration. Accuracy 10 metres.,9603,,,Derived through common coordinates at 5 stations.,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1529,Hito XVIII to WGS 84 (1),transformation,4254,4326,TOT-Arg TdF,1,2357,Oil exploration.,9606,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1530,NAD27 to WGS 84 (30),transformation,4267,4326,ICH-Cub,30,1077,?,9603,,,,Institut Cubano di Hidrografia (ICH),EPSG,2000-03-07 00:00:00,,1,0
+1531,Nahrwan 1967 to WGS 84 (4),transformation,4270,4326,TOT-UAE Abk,4,2392,Oil exploration.,9603,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1532,M'poraloko to WGS 84 (2),transformation,4266,4326,Elf-Gab94,2,1100,Oil exploration.,9603,,,Derived as mean of Doris determinations at 3 stations in Port Gentil area.,TotalFinaElf,EPSG,2000-03-07 00:00:00,,1,0
+1533,Kalianpur 1937 to WGS 84 (2),transformation,4144,4326,TOT-Mmr Moat,2,2361,Oil exploration.,9603,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1534,Minna to WGS 84 (3),transformation,4263,4326,SHL-Nig S,3,2371,Oil exploration.,9606,,,,Shell Petroleum Development Company,EPSG,2000-03-07 00:00:00,,1,1
+1536,Nahrwan 1967 to WGS 84 (5),transformation,4270,4326,B&R-Qat off,5,1346,Oil exploration.,9603,,,Derived by Brown & Root in 1992 for Qatar General Petroleum Corporation North Field development. Adopted by QGPC for all offshore Qatar.,Qatar General Petroleum Corporation and Total-Fina,EPSG,2000-03-07 00:00:00,2000.53,1,0
+1537,Indian 1975 to WGS 84 (3),transformation,4240,4326,Fug-Tha,3,2358,Oil exploration.,9603,,,Derived in 1995 at point RTSD181.,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+1538,Carthage to WGS 84 (2),transformation,4223,4326,Elf-Tun,2,1489,Oil exploration.,9603,,,Derived at station Chaffar January 1995.,Total / Elf,EPSG,2000-03-07 00:00:00,,1,0
+1539,South Yemen to Yemen NGN96 (1),transformation,4164,4163,IGN-Yem South,1,1340,?,9603,,,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+1540,Yemen NGN96 to WGS 84 (1),transformation,4163,4326,IGN-Yem,1,1257,Accuracy better than 1 metre.,9603,,,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+1541,Indian 1960 to WGS 72BE (1),transformation,4131,4324,PV-Vnm,1,1495,Oil exploration.,9603,,,Derived in Vung Tau area by Technical Navigation for Deminex in 1978.,PetroVietnam,EPSG,2000-03-07 00:00:00,,1,0
+1542,Indian 1960 to WGS 84 (2),transformation,4131,4326,DMA-Vnm 16N,2,2359,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,2000-03-07 00:00:00,,1,0
+1543,Indian 1960 to WGS 84 (3),transformation,4131,4326,DMA-Vnm ConSon,3,2360,For military purposes.  Accuracy 25m in each axis.,9603,,,Derived at 1 station.,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,2000-03-07 00:00:00,,1,0
+1544,Hanoi 1972 to WGS 84 (1),transformation,4147,4326,BP-Vnm,1,1494,Oil exploration.,9603,,,Derived in Vung Tau area.,BP Amoco,EPSG,2000-03-07 00:00:00,,1,0
+1545,Egypt 1907 to WGS 72 (1),transformation,4229,4322,MCE-Egy,1,1086,?,9603,,,,UK Mapping and Charting Establishment,EPSG,2000-03-07 00:00:00,,1,0
+1546,Egypt 1907 to WGS 84 (3),transformation,4229,4326,Racal-Egy GoS,3,2341,Used for oil exploration by GUPCO.,9603,,,,Maridive,EPSG,2000-03-07 00:00:00,,1,0
+1547,Bissau to WGS 84 (1),transformation,4165,4326,DMA-Gnb,1,1113,For military purposes only.  Accuracy 25m in each axis.,9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 second edition September 1991,EPSG,2000-03-07 00:00:00,,1,0
+1548,SAD69 to WGS 84 (14),transformation,4291,4326,IGBE-Bra,14,1053,Medium and small scale mapping.,9603,,,Derived by Brazilean Institute of Geography and Statistics (IGBE) in 1989. Used by ANP.,Agencia Nacional do Petroleo (ANP).,EPSG,2000-03-07 00:00:00,,1,0
+1549,Aratu to WGS 84 (1),transformation,4208,4326,PB-Bra Camp,1,2307,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1550,Aratu to WGS 84 (2),transformation,4208,4326,PB-Bra TucN,2,2308,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1551,Aratu to WGS 84 (3),transformation,4208,4326,PB-Bra TucC,3,2309,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1552,Aratu to WGS 84 (4),transformation,4208,4326,PB-Bra TucS,4,2310,Oil exploration.,9603,,,,Petrobras.,EPSG,2000-03-07 00:00:00,,1,0
+1553,NAD83 to NAD83(HARN) (38),transformation,4269,4152,NGS-Usa IL,38,1382,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1748.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1554,NAD83 to NAD83(HARN) (39),transformation,4269,4152,NGS-Usa NJ,39,1399,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1749.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+1555,Naparima 1955 to WGS 84 (2),transformation,4158,4326,Amoco-Tto Trin,2,1339,Oil exploration.,9603,,,Derived in 1989 by ONI for Amoco.,Trinidad Ministry of Energy and Energy Industries.,EPSG,2000-03-07 00:00:00,2000.351,1,0
+1556,Naparima 1955 to WGS 84 (3),transformation,4158,4326,NIMA-Tto Trin,3,1339,For military purposes.,9603,,,Described by NIMA as Naparima 1972 to WGS 84.  In Trinidad the source CRS is better known as Napaima 1955. EPSG has duplicated the tfm using the alternative source CRSs.  See also tfm code 1307.,EPSG after U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2000-03-07 00:00:00,2000.351,1,0
+1557,Malongo 1987 to WGS 84 (2),transformation,4259,4326,CHV-Ago Cab90,2,1317,Used for oil exploration by Chevron since 1990.,9603,,,Supersedes trf code 1330.  Derived at station Y.,Chevron.,EPSG,2000-05-08 00:00:00,,1,0
+1558,Korean 1995 to WGS 84 (1),transformation,4166,4326,NIMA-Kor,1,1135,For military purposes. Accuracy better than 1 metre.,9603,,,Derived at 5 stations.,NIMA TR8350.2  ftp://164.214.2.65/pub/gg/tr8350.2/changes.pdf,EPSG,2000-06-10 00:00:00,,1,0
+1559,AGD84 to GDA94 (3),transformation,4203,4283,DOLA-Aus WA 0.1m old,3,1280,0.1m accuracy.,9615,,,Superseded by AGD84 to GDA94 (4) (code 1593) (binary file format error) and then by AGD84 to GDA94 (5) (code 1804). Input expects longitudes to be positive west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east.,http://www.dola.wa.gov.au/lotl/survey_geodesy/gda1994/download.html,EPSG,2000-06-10 00:00:00,2000.68,1,1
+1560,Nord Sahara 1959 to WGS 72BE (1),transformation,4307,4324,CGG-Alg HM,1,2393,Oil exploration.,9603,,,Derived at IGN monument CFP19 using Transit.,Various oil company sources.,EPSG,2000-06-23 00:00:00,,1,0
+1561,Qatar 1974 to WGS 84 (1),transformation,4285,4326,DMA-Qat,1,1195,For military purposes only.  Accuracy 20m in each axis.,9603,,,Derived at 3 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2000-10-19 00:00:00,,1,0
+1562,Qatar 1974 to WGS 84 (2),transformation,4285,4326,B&R-Qat off,2,2406,Oil exploration.,9603,,,Derived by Brown & Root in 1992 for Qatar General Petroleum Corporation.,Qatar General Petroleum Corporation and Total-Fina,EPSG,2000-10-19 00:00:00,,1,0
+1563,Qatar 1974 to WGS 84 (3),transformation,4285,4326,CGIS-Qat,3,1346,Oil exploration.,9603,,,Derived by Qatar Centre for GIS.  See Qatar 1974 to WGS 84 (2) (code 1562) for transformation used by QGPC for offshore petroleum industry.,Qatar Centre for GIS,EPSG,2000-10-19 00:00:00,,1,0
+1564,NZGD49 to WGS 84 (2),transformation,4272,4326,OSG-Nzl 4m,2,1175,Transformation accuracy about 4 metres.,9607,,,These parameter values are taken from NZGD49 to NZGD2000 (4) (code 1701) and assume that NZGD2000 and WGS 84 are coincident to within the accuracy of the transformation. For improved accuracy use NZGD49 to WGS 84 (4) (code 1670).,Land Information New Zealand Office of Surveyor General policy statement 97/3.,EPSG,2000-10-19 00:00:00,,1,0
+1565,NZGD2000 to WGS 84 (1),transformation,4167,4326,OSG-Nzl,1,1175,Assumes NZGD2000 is coincident to WGS 84 to the 1m accuracy level.,9603,,,,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,0
+1566,NZGD49 to NZGD2000 (1),transformation,4272,4167,OSG-Nzl 5m,1,1175,5m accuracy.,9603,,,For better accuracy use  NZGD49 to NZGD2000 (4) (code 1701) or NZGD49 to NZGD2000 (3) (code 1568).,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,0
+1567,NZGD49 to NZGD2000 (2),transformation,4272,4167,OSG-Nzl 4m,2,1175,4m accuracy.,9607,,,4m accuracy.  For better accuracy use NZGD49 to NZGD2000 (3) (code 1568),http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,1
+1568,NZGD49 to NZGD2000 (3),transformation,4272,4167,OSG-Nzl 1m,3,1175,0.2m accuracy.,9615,,,These same parameter values may be used to transform to WGS 84 - see NZGD49 to WGS 84 (4) (code 1670).,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2000-10-19 00:00:00,,1,0
+1569,Accra to WGS 84 (1),transformation,4168,4326,MCE-Gha,1,1104,Military survey,9603,,,Derived at 3 common points.,Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+1570,Accra to WGS 72BE (1),transformation,4168,4324,GSI-Gha,1,1505,Oil exploration.,9603,,,Derived be single point Transit observation at several locations.,Various oil industry sources,EPSG,2000-10-19 00:00:00,,1,0
+1571,Amersfoort to ETRS89 (1),transformation,4258,4326,NCG-Nld 2000,1,1172,Accuracy 0.5m,9607,,,"Dutch sources also quote an equivalent transformation with parameter values dX=+593.032 dY=+26.000 dZ=+478.741m, rX rY rZ and dS as this tfm. These values belong to a different transformation method and cannot be used with the Coordinate Frame method.",http://rdnap.kadaster.nl/rd/index.html  Also Nederlandse Commissie voor Geodesie publication 30; 3rd edition 1997.  Also with change of method [...]
+1572,NAD83 to NAD83(CSRS98) (1),transformation,4269,4140,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS98) (code 4140) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,1
+1573,NAD27 to NAD83 (6),transformation,4267,4269,SGQ-Can QC NT2,6,1368,Accuracy 1-2 metres.,9615,,,Supersedes NAD27 to NAD83 (5) (code 1462).  Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,0
+1574,NAD27 to NAD83(CSRS98) (1),transformation,4267,4140,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83(CSRS98) (code 4140) have longitudes positive east. Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1692.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,1
+1575,NAD27(CGQ77) to NAD83 (2),transformation,4609,4269,SGQ-Can QC NT2,2,1368,Accuracy 1-2 metres.,9615,,,Supersedes NAD27(CGQ77) to NAD83 (1) (code 1451).  Uses NT method which expects longitudes positive west; EPSG GeogCRSs CGQ77 and NAD83 (codes 4609 and 4269) have longitudes positive east. Can be taken as approx transformation to WGS 84 - see code 1691.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,0
+1576,NAD27(CGQ77) to NAD83(CSRS98) (1),transformation,4609,4140,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(CGQ77) (code 4609) and NAD83(CSRS98) (code 4140) have longitudes positive east. Can be taken as an approximate transformation NAD27(CGQ77) to WGS 84 - see code 1691.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2000-10-19 00:00:00,,1,1
+1577,American Samoa 1962 to WGS 84 (1),transformation,4169,4326,NIMA-Asm,1,1027,For military purposes. One sigma uncertainty is 25m in each axis.,9603,,,Transformation based on observations at 2 stations in 1993.,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,,1,0
+1578,American Samoa 1962 to NAD83(HARN) (1),transformation,4169,4152,NGS-Asm W,1,2288,Geodetic survey. No accuracy stated.,9613,,,NADCON method which expects longitudes positive west; EPSG GeogCRSs American Samoa 1962 and NAD83(HARN) (codes 4169 and 4159) have longitudes positive east.  NADCON expects latitudes in northern hemisphere and values must be made positive prior to input.,ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon/samoa_readme.txt,EPSG,2000-10-19 00:00:00,,1,0
+1579,American Samoa 1962 to NAD83(HARN) (2),transformation,4169,4152,NGS-Asm E,2,2289,Geodetic survey. No accuracy stated.,9613,,,NADCON method which expects longitudes positive west; EPSG GeogCRSs American Samoa 1962 and NAD83(HARN) (codes 4169 and 4159) have longitudes positive east.  NADCON expects latitudes in northern hemisphere and values must be made positive prior to input.,ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon/samoa_readme.txt,EPSG,2000-10-19 00:00:00,,1,0
+1580,NAD83(HARN) to WGS 84 (1),transformation,4152,4326,EPSG-Usa,1,2424,Approximation at the +/- 1m level assuming that NAD83(HARN) is equivalent to WGS 84.,9603,,,For many purposes NAD83(HARN) can be considered to be coincident with WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,0
+1581,SIRGAS to WGS 84 (1),transformation,4170,4326,NIMA-S America,1,1341,For military purposes.,9603,,,,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,2001.33,1,0
+1582,PSAD56 to WGS 84 (10),transformation,4248,4326,TOT-Bol  Mad,10,2400,Oil exploration.,9603,,,Derived May 1995 by Geoid for Total.  OSU91A geoid model used.,TotalFinaElf,EPSG,2000-10-19 00:00:00,,1,0
+1583,PSAD56 to WGS 84 (11),transformation,4248,4326,TOT-Bol  B20,11,2401,Oil exploration.,9603,,,Derived July 1997 by Geoid from data recorded by UGA for Total.  OSU91A geoid model used.,Total-Fina,EPSG,2000-10-19 00:00:00,,1,0
+1584,Deir ez Zor to WGS 72BE (1),transformation,4227,4324,GECO-Syr,1,2329,Oil exploration.,9603,,,Derived by Transit at station 254 Deir.,Elf,EPSG,2000-10-19 00:00:00,,1,0
+1585,Deir ez Zor to WGS 84 (2),transformation,4227,4326,IGN-Syr,2,1227,?,9603,,,,IGN Paris,EPSG,2000-10-19 00:00:00,,1,0
+1586,Deir ez Zor to WGS 84 (3),transformation,4227,4326,SHL-Syr Whal,3,2327,Oil exploration.,9606,,,Derived in 1995.,Elf,EPSG,2000-10-19 00:00:00,,1,0
+1587,Deir ez Zor to WGS 84 (4),transformation,4227,4326,ELF-Syr Shad,4,2328,Oil exploration.,9603,,,Derived at four stations by Topnav in 1997.,Elf,EPSG,2000-10-19 00:00:00,,1,0
+1588,ED50 to ETRS89 (1),transformation,4230,4258,NMA-Nor N65 1997,1,2332,Accuracy 1m.,9606,,,Included in Statens Kartverk programme wsktrans from 1997. The same parameter values were adopted for ED50 to WGS84 (variant 23) transformation offshore Norway north of 62N from April 2001 - see code 1612.,Statens Kartverk.,EPSG,2001-06-05 00:00:00,2001.06,1,0
+1589,ED50 to ETRS89 (3),transformation,4230,4258,NMA-Nor 6265W,3,2333,Accuracy 2m.,9620,,,Included in Statens Kartverk programme wsktrans from 1997. See ED50 to WGS84 (23) (code 1612) for a simpler transformation accurate to better than 4m.,Statens Kartverk,EPSG,2000-10-19 00:00:00,,1,0
+1590,ED50 to WGS 84 (22),transformation,4230,4326,NMA-Nor 6265W 1997,22,2333,Oil exploration before 2001.,9620,,,Included in Statens Kartverk programme wsktrans between 1997 (v3.1) and 2001 (v4.0). Superseded ED50 to WGS 84 (20) (code 1450) in 1997. Superseded by ED50 to WGS 84 (23) (code 1612) in April 2001.,Statens Kartverk.,EPSG,2000-10-19 00:00:00,,1,0
+1591,RGF93 to ETRS89 (1),transformation,4171,4258,IGN-Fra,1,1096,RGF93 is a regional realisation of ETRS89.,9603,,,May be taken as approximate transformation RGF93 to WGS 84 - see code 1671.,TotalFinaElf,EPSG,2000-10-10 00:00:00,,1,0
+1592,Timbalai 1948 to WGS 84 (2),transformation,4298,4326,BSP-Brn,2,2348,Offshore oil exploration.,9603,,,These parameters produce a coordinate difference of 10m horizontally and 50m vertically compared to Timbalai 1948 to WGS 84 (3) (code 1615).,Brunei Shell Petroleum,EPSG,2002-10-19 00:00:00,,1,0
+1593,AGD84 to GDA94 (4),transformation,4203,4283,DOLA-Aus WA 0.1m,4,1280,0.1m accuracy.,9615,,,Replaced AGD84 to GDA94 (3) (code 1559) but then superseded by AGD84 to GDA94 (5) (code 1804). Input expects longitudes to be positive west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east.,http://www.dola.wa.gov.au/lotl/survey_geodesy/gda1994/download.html,EPSG,2000-10-19 00:00:00,,1,0
+1594,AGD66 to GDA94 (8),transformation,4202,4283,OSG-Tas 1m,8,1282,Recommended for mid-accuracy use in Tasmania.  1m accuracy.,9607,,,Supersedes AGD66 to GDA94 (3) (code 1459) from August 2000.  For higher accuracy requirements see AGD66 to GDA94 (6) (code 1506).  May be taken as approximate transformation AGD66 to WGS 84 - see code 1667.,GDA Technical Manual (August 2000 revision) and http://www.delm.tas.gov.au/osg/Geodetic_transform.htm,EPSG,2000-10-19 00:00:00,,1,0
+1595,AGD66 to GDA94 (9),transformation,4202,4283,Auslig-NT 1m,9,2284,Recommended for mid-accuracy use in Northern Territory. 1m accuracy.,9607,,,For higher accuracy requirements see AGD66 to GDA94 (7) (code 1507).  May be taken as approximate transformation AGD66 to WGS 84 - see code 1668.,GDA Technical Manual. http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,2000-10-19 00:00:00,,1,0
+1596,AGD66 to GDA94 (10),transformation,4202,4283,OSG-Aus SE 0.1m,10,2287,0.1m accuracy.,9615,,,In Victoria supersedes AGD66 to GDA94 (5) (code 1464). Superseded by AGD66 to GDA94 (11) (code 1803).  Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,http://www.osg.vic.gov.au/tools.htm,EPSG,2000-10-19 00:00:00,,1,0
+1597,Bogota 1975 to WGS 84 (2),transformation,4218,4326,BP-Col CusCup,2,2315,Oil exploration.,9603,,,Derived in 1995 by WGC at first order stations Recreo and Mena via multi-day ties to 4 IGS stations. Residuals under 20cm.,Various industry sources,EPSG,2000-10-19 00:00:00,,1,0
+1598,POSGAR to WGS 84 (1),transformation,4172,4326,EPSG-Arg,1,1033,?,9603,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+1599,ATS77 to NAD83(CSRS98) (2),transformation,4122,4140,PEI DOT-Can PEI,2,1533,?,9615,,,Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1689.,PEI Department of Transportation & Public Works,EPSG,2000-10-19 00:00:00,,1,1
+1600,NAD27 to NAD83(CSRS98) (2),transformation,4267,4140,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1703.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+1601,NAD83 to NAD83(CSRS98) (2),transformation,4269,4140,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1697.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+1602,NAD83 to NAD83(CSRS98) (3),transformation,4267,4140,AB Env-Can AB,2,2376,Accuracy 1-2 metres.,9615,,,"This gridded difference file  AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some software suites.  Formats identical, but AB file is provincial fit only.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca,EPSG,2000-10-19 00:00:00,,1,1
+1603,NAD27 to ATS77 (1),transformation,4267,4122,SNB-Can NB,1,1447,?,9634,,,For reverse transformation see ATS77 to NAD27 (1) (code 1606),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1604,NAD27 to ATS77 (2),transformation,4267,4122,SNB-Can PEI,2,1533,?,9634,,,For reverse transformation see ATS77 to NAD27 (2) (code 1607),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1605,NAD27 to ATS77 (3),transformation,4267,4122,SNB-Can NS,3,2313,?,9634,,,For reverse transformation see ATS77 to NAD27 (3) (code 1608),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1606,ATS77 to NAD27 (1),transformation,4122,4267,SNB-Can NB,1,1447,?,9634,,,For reverse transformation see NAD27 to ATS77 (1) (code 1603),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1607,ATS77 to NAD27 (2),transformation,4122,4267,SNB-Can NS,2,2313,?,9634,,,For reverse transformation see NAD27 to ATS77 (2) (code 1604),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1608,ATS77 to NAD27 (3),transformation,4122,4267,SNB-Can PEI,3,1533,?,9634,,,For reverse transformation see NAD27 to ATS77 (3) (code 1605),Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,1,0
+1609,BD72 to WGS 84 (1),transformation,4313,4326,IGN-Bel 7,1,1044,For applications to an accuracy of 1 metre.,9607,,,,IGN Brussels www.ngi.be/FR/FR2-1-5-1.shtm,EPSG,2000-10-19 00:00:00,,1,0
+1610,BD72 to WGS 84 (2),transformation,4313,4326,IGN-Bel 3,2,1044,For applications to an accuracy of 5 metres.,9603,,,,IGN Brussels www.ngi.be/FR/FR2-1-5-1.shtm,EPSG,2000-10-19 00:00:00,,1,0
+1611,IRENET95 to ETRS89 (1),transformation,4173,4258,OSI-Ire,1,1305,?,9603,,,May be taken as approximate transformation IRENET95 to WGS 84 - see code 1678.,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+1612,ED50 to WGS 84 (23),transformation,4230,4326,EPSG-Nor N62 2001,23,2601,Oil industry offshore.,9606,,,"Parameter values are taken from ED50 to ETRS89 (1), code 1588. Adopted for ED50 to WGS84 transformations offshore Norway north of 62N from April 2001 when it superseded code 1590. Included in Statens Kartverk programme wsktrans from v4.0.",EPSG Guidance Note #10,EPSG,2001-06-05 00:00:00,,1,0
+1613,ED50 to WGS 84 (24),transformation,4230,4326,EPSG-Nor S62 2001,24,2334,Approximation to 1 metre for oil industry use.,9606,,,"Approximation to 1 metre of concatenated transformation ED50 to WGS 84 (14), code 8046. 8046 remains the transformation promulgated by Statens Kartverk but 1613 recommended by EPSG for practical oil industry usage.",EPSG Guidance Note #10,EPSG,2001-06-05 00:00:00,,1,0
+1614,Sierra Leone 1968 to WGS 84 (1),transformation,4175,4326,NIMA-Sle,1,1209,Accuracy +/- 15m in each axis.,9603,,,Determined at 8 stations. Info. source has the source CRS as Sierra Leone 1960.  Sierra Leone 1968 is a readjustment of the 1960 network: coordinates changed by less than 3 metres.,"NIMA TR8350.2 revision 3, 1997.",EPSG,2001-06-05 00:00:00,,1,0
+1615,Timbalai 1948 to WGS 84 (3),transformation,4298,4326,SD-Brn,3,2349,Topographic and engineering survey onshore.,9603,,,These parameters produce a coordinate difference of 10m horizontally and 50m vertically compared to Timbalai 1948 to WGS 84 (2) (code 1592).,Brunei Survey Department,EPSG,2001-06-05 00:00:00,,1,0
+1616,PSD93 to WGS 72 (1),transformation,4134,4322,PDO-Omn 93,1,1183,Oil exploration. Residuals 1.2m at 67% probability level.,9606,,,,Petroleum Development Oman,EPSG,2001-06-05 00:00:00,,1,0
+1617,PSD93 to WGS 84 (3),transformation,4134,4326,Tot-Omn 95,3,2404,Oil exploration.,9606,,,Accuracy better than 0.5m in block 4.,TotalFinaElf,EPSG,2001-06-05 00:00:00,,1,0
+1618,MGI to WGS 84 (3),transformation,4312,4326,BEV-Aut,3,1037,For applications to an accuracy of 1.5 metres.,9606,,,Same transformation parameters but to lesser precision used for MGI to ETRS89 (1) (code 1619).,Bundesamt f�r Eich- und Vermessungswesen via EuroGeographics http://crs.ifag.de,EPSG,2001-06-05 00:00:00,,1,0
+1619,MGI to ETRS89 (1),transformation,4312,4258,BEV-Aut,1,1037,For applications to an accuracy of 1.5 metres.,9606,,,Same transformation parameters but to greater precision used for MGI to WGS 84 (3) (code 1618).,Bundesamt f�r Eich- und Vermessungswesen via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1620,MGI to ETRS89 (2),transformation,4312,4258,DGU-Hrv,2,1076,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation MGI to WGS 84 - see code 1621.,Drzavna Geodetska Uprava via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1621,MGI to WGS 84 (4),transformation,4312,4326,EPSG-Hrv,4,1076,For applications to an accuracy of 1 metre.,9606,,,Parameter values from MGI to ETRS89 (2) (code 1620). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1622,S-JTSK to ETRS89 (1),transformation,4156,4258,CUZK-Cze,1,1079,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation S-JTSK to WGS 84 - see code 1623.,Cesky Urad Zememericky a Katastraln via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1623,S-JTSK to WGS 84 (1),transformation,4156,4326,EPSG-Cze,1,1079,For applications to an accuracy of 1 metre.,9606,,,Parameter values from S-JTSK to ETRS89 (1) (code 1622). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1624,S-JTSK to ETRS89 (2),transformation,4156,4258,UGKK-Svk,2,1211,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation S-JTSK to WGS 84 - see code 1625.,"Urad Geodezie, Kartografie a Katastra via EuroGeographics; http://crs.ifag.de/",EPSG,2001-06-05 00:00:00,,1,0
+1625,S-JTSK to WGS 84 (2),transformation,4156,4326,EPSG-Svk,2,1211,For applications to an accuracy of 1 metre.,9606,,,Parameter values from S-JTSK to ETRS89 (2) (code 1624). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1626,ED50 to ETRS89 (4),transformation,4230,4258,KMS-Dnk,4,1080,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1627.,Kort & Matrikelstyrelsen via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1627,ED50 to WGS 84 (25),transformation,4230,4326,EPSG-Dnk,25,1080,For applications to an accuracy of 1 metre.,9606,,,Parameter values from ED50 to ETRS89 (4) (code 1626). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1628,ED50 to ETRS89 (5),transformation,4230,4258,DGC-Gib,5,1105,For applications to an accuracy of 1 metre.,9603,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1629.,UK Defence Geographic and Imagery Intelligence Agency via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1629,ED50 to WGS 84 (26),transformation,4230,4326,EPSG-Gib,26,1105,For applications to an accuracy of 1 metre.,9603,,,Parameter values from ED50 to ETRS89 (5) (code 1628). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1630,ED50 to ETRS89 (6),transformation,4230,4258,IGN-Esp Bal,6,2335,For applications to an accuracy of 1.5 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1631.,Centro Nacional de Informacion Geografica via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1631,ED50 to WGS 84 (27),transformation,4230,4326,EPSG-Esp Bal,27,2335,For applications to an accuracy of 1.5 metres.,9606,,,Parameter values from ED50 to ETRS89 (6) (code 1630). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1632,ED50 to ETRS89 (7),transformation,4230,4258,IGN-Esp,7,2336,For applications to an accuracy of 1.5 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1633.,Centro Nacional de Informacion Geografica via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1633,ED50 to WGS 84 (28),transformation,4230,4326,EPSG-Esp,28,2336,For applications to an accuracy of 1.5 metres.,9606,,,Parameter values from ED50 to ETRS89 (7) (code 1632). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1634,ED50 to ETRS89 (8),transformation,4230,4258,IGN-Esp NW,8,2337,For applications to an accuracy of 1.5 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1635.,Centro Nacional de Informacion Geografica via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1635,ED50 to WGS 84 (29),transformation,4230,4326,EPSG-Esp NW,29,2337,For applications to an accuracy of 1.5 metres.,9606,,,Parameter values from ED50 to ETRS89 (8) (code 1634). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1638,KKJ to ETRS89 (1),transformation,4123,4258,NLS-Fin,1,1095,For applications to an accuracy of 1 to 2 metres.,9606,,,May be taken as approximate transformation KKJ to WGS 84 - see code 1639.,National Land Survey of Finland via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1639,KKJ to WGS 84 (1),transformation,4123,4326,EPSG-Fin,1,1095,For applications to an accuracy of 1 to 2 metres.,9606,,,Parameter values from KKJ to ETRS89 (1) (code 1638). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1640,TM65 to ETRS89 (1),transformation,4299,4258,OSI-Ire,1,1305,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation TM65 to WGS 84 - see code 1641.,Ordnance Survey Ireland via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1641,TM65 to WGS 84 (2),transformation,4299,4326,EPSG-Ire,2,1305,For applications to an accuracy of 1 metre.,9606,,,Parameter values from TM65 to ETRS89 (1) (code 1640). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1642,Luxembourg 1930 to ETRS89 (1),transformation,4181,4258,ACT-Lux,1,1146,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation Luxembourg 1930 to WGS 84 - see code 1643.,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1643,Luxembourg 1930 to WGS 84 (1),transformation,4181,4326,EPSG-Lux,1,1146,For applications to an accuracy of 1 metre.,9606,,,Parameter values from Luxembourg 1930 to ETRS89 (1) (code 1642). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1644,Pulkovo 1942(58) to ETRS89 (1),transformation,4179,4258,GUGK-Pol,1,1192,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation Pulkovo 1942(58) to WGS 84 - see code 1645.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1645,Pulkovo 1942(58) to WGS 84 (1),transformation,4179,4326,EPSG-Pol,1,1192,For applications to an accuracy of 1 metre.,9606,,,Parameter values from Pulkovo 1942(58) to ETRS89 (1) (code 1644). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1646,CH1903 to ETRS89 (1),transformation,4149,4258,BfL-Che,1,1286,Accuracy 1.5 metres.,9603,,,These parameters are strictly from CH1903+ to CHTRF95 or ETRS89 but are used as from CH1903 as an approximation which is within the accuracy of the distortions in the CH1903 network. They are given to full precision as CH1903 to WGS 84 (1) (code 1510).,Bundesamt f�r Landestopographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1647,CH1903+ to ETRS89 (1),transformation,4150,4258,BfL-Che,1,1286,For applications to an accuracy of 0.1 metres.,9603,,,This transformation is also given as CH1903+ to CHTRF95 (1) (code 1509). CHTRF95 is a local realisation of ETRS89.,Bundesamt f�r Landestopographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1648,EST97 to ETRS89 (1),transformation,4180,4258,NLB-Est,1,1090,EST97 is a realisation of ETRS89.,9603,,,May be taken as approximate transformation EST97 to WGS 84 - see code 1649.,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1649,EST97 to WGS 84 (1),transformation,4180,4326,EPSG-Est,1,1090,For applications to an accuracy of 1 metre.,9603,,,Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1650,ED50 to ETRS89 (10),transformation,4230,4258,IGN-Fra,10,1096,For applications to an accuracy of 2 metres.,9603,,,These same parameter values are used to transform to WGS 84. See ED50 to WGS 84 (17) (code 1275).,Institut Geographique National via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1651,NTF to ETRS89 (1),transformation,4275,4258,IGN-Fra,1,1096,For applications to an accuracy of 2 metres.,9603,,,These same parameter values are used to transform to WGS 84. See NTF to WGS 84 (1) (code 1193).,Institut Geographique National via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1652,BD72 to ETRS89 (1),transformation,4313,4258,IGN-Bel,1,1044,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation BD72 to WGS 84 - see code 1609.,Institut Geographique National via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1653,NGO 1948 to ETRS89 (1),transformation,4273,4258,SKV-Nor,1,1352,For applications to an accuracy of 3 metres.,9606,,,May be taken as approximate transformation NGO 1948 to WGS 84 - see code 1654.,Statens Kartverk via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1654,NGO 1948 to WGS 84 (1),transformation,4273,4326,EPSG-Nor,1,1352,For applications to an accuracy of 3 metres.,9606,,,Parameter values from NGO 1948 to ETRS89 (1) (code 1653). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1655,Lisbon to ETRS89 (1),transformation,4207,4258,ICC-Prt 2000,1,1294,For applications to an accuracy of 3 metres.,9606,,,Derived in 2000 at 8 stations.  Superseded by 2001 derivation (code 1790).,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1656,Lisbon to WGS 84 (1),transformation,4207,4258,EPSG-Prt 2000,1,1294,For applications to an accuracy of 3 metres.,9606,,,Parameter values from Lisbon to ETRS89 (1) (code 1655). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,1
+1657,Datum 73 to ETRS89 (1),transformation,4274,4258,ICC-Prt 2000,1,1294,For applications to an accuracy of 2 metres.,9606,,,Derived in 2000 at 8 stations.  Superseded by 2001 derivation (code 1792).,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1658,Datum 73 to WGS 84 (1),transformation,4274,4258,EPSG-Prt 2000,1,1294,For applications to an accuracy of 2 metres.,9606,,,Parameter values from Datum 73 to ETRS89 (1) (code 1657). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,1
+1659,Monte Mario to ETRS89 (1),transformation,4265,4258,IGM-Ita main,1,2372,Accuracy: 4 metres,9606,,,May be taken as approximate transformation Monte Mario to WGS 84 - see code 1660.,Istituto Geografico Militare Italiano via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1660,Monte Mario to WGS 84 (4),transformation,4265,4326,EPSG-Ita main,4,2372,Accuracy: 4 metres,9606,,,Parameter values from Monte Mario to ETRS89 (1) (code 1659). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1661,Monte Mario to ETRS89 (2),transformation,4265,4258,IGM-Ita Sar,2,2339,Accuracy: 4 metres,9606,,,May be taken as approximate transformation Monte Mario to WGS 84 - see code 1662.,Istituto Geografico Militare Italiano via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1662,Monte Mario to WGS 84 (2),transformation,4265,4326,EPSG-Ita Sar,2,2339,Accuracy: 4 metres,9606,,,Parameter values from Monte Mario to ETRS89 (2) (code 1661). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1663,Monte Mario to ETRS89 (3),transformation,4265,4258,IGM-Ita Sic,3,2340,Accuracy: 4 metres,9606,,,May be taken as approximate transformation Monte Mario to WGS 84 - see code 1664.,Istituto Geografico Militare Italiano via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+1664,Monte Mario to WGS 84 (3),transformation,4265,4326,EPSG-Ita Sic,3,2340,Accuracy: 4 metres,9606,,,Parameter values from Monte Mario to ETRS89 (3) (code 1663). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+1665,AGD66 to WGS 84 (12),transformation,4202,4326,EPSG-ACT 1m,12,2283,Recommended for mid-accuracy use in A.C.T.  1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (2) (code 1458). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1666,AGD66 to WGS 84 (13),transformation,4202,4326,EPSG-NSW Vic 1m,13,2286,Recommended for mid-accuracy use in NSW and Victoria.  1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (4) (code 1460). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1667,AGD66 to WGS 84 (14),transformation,4202,4326,EPSG-Tas 1m,14,1282,Recommended for mid-accuracy use in Tasmania.  1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (8) (code 1594). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1668,AGD66 to WGS 84 (15),transformation,4202,4326,EPSG-NT 1m,15,2284,Recommended for mid-accuracy use in Northern Territory. 1m accuracy.,9607,,,Parameter values from AGD66 to GDA94 (9) (code 1595). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1669,AGD84 to WGS 84 (7),transformation,4203,4326,EPSG-Aus 1m,7,1036,1m accuracy.,9607,,,Parameter values from AGD84 to GDA94 (2) (code 1280). Assumes GDA94 and WGS 84 can be considered the same to within the accuracy of the transformation. Supersedes AGD84 to WGS 84 (2) (code 1236).,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1670,NZGD49 to WGS 84 (3),transformation,4272,4326,EPSG-Nzl 1m,3,1175,Accuracy about 1m.,9615,,,Parameter file is from NZGD49 to NZGD2000 (3) (code 1568) and assumes  WGS 84 is coincident with NZGD2000 to the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1671,RGF93 to WGS 84 (1),transformation,4171,4326,EPSG-Fra,1,1096,Approximation at the +/- 1m level.,9603,,,Parameter values from RGF93 to ETRS89 (1) (code 1591) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1672,Amersfoort to WGS 84 (2),transformation,4289,4326,EPSG-Nld,2,1275,Approximation at the +/- 1m level.,9607,,,Parameter values from Amersfoort to ETRS89 (2) (code 1751) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation. Supersedes Amersfoort to WGS 84 (1) (code 1112).,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1673,DHDN to WGS 84 (1),transformation,4314,4326,EPSG-Deu W,1,2326,For applications with an accuracy at 5 m level.,9607,,,Parameter values from DHDN to ETRS89 (1) (code 1309) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1674,Pulkovo 1942(83) to ETRS89 (1),transformation,4178,4258,IfAG-Deu E,1,1343,Residuals under 2 m.,9607,,,Mean of 20 stations. May be taken as approximate transformation to WGS 84 - see code 1675. Also given by EuroGeographics at http://crs.ifag.de/ as a Position Vector transformation with changed values for rotations. Superseded in 2001 by code 1775.,Institute for Cartography and Geodesy; Leipzig.,EPSG,2001-08-15 00:00:00,,1,0
+1675,Pulkovo 1942(83) to WGS 84 (1),transformation,4178,4326,EPSG-Deu E,1,1343,Residuals under 2 m.,9607,,,Parameter values from Pulkovo 1942(83) to ETRS89 (1) (code 1674) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1676,CH1903+ to WGS 84 (1),transformation,4150,4326,BfL-CH,1,1286,Approximation at the +/- 1m level.,9603,,,Parameter values are from CH1903+ to CHTRF95 (1) (code 1509) assuming that CHTRF95 is equivalent to WGS 84. That transformation is also given as CH1903+ to ETRS89 (1) (code 1647). CHTRF95 is a realisation of ETRS89.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1677,HD72 to WGS 84 (1),transformation,4237,4326,EPSG-Hun,1,1119,Approximation at the +/- 1m level.,9607,,,Parameter values taken from HD72 to ETRS89 (1) (code 1273) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,1
+1678,IRENET95 to WGS 84 (1),transformation,4173,4326,EPSG-Ire,1,1305,Approximation at the +/- 1m level.,9603,,,Assumes that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1679,Pulkovo 1942 to WGS 84 (2),transformation,4284,4326,EPSG-Ltu,2,1145,Approximation at the +/- 1m level.,9607,,,Parameter values taken from Pulkovo 1942 to LKS94(ETRS89) (1) (code 1274) assuming that LKS94(ETRS89) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1680,RT90 to WGS 84 (1),transformation,4124,4326,EPSG-Swe,1,1225,Approximation at the +/- 1m level.,9607,,,Parameter values from RT90 to ETRS89 (1) (code 1437) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1681,OSGB 1936 / British National Grid to WGS 84 (1),transformation,27700,4326,EPSG-Gbr,1,1264,Accuracy about 0.5m.,9633,,,Parameter values taken from OSGB 1936 / British National Grid to ETRS89 (1) (code 1036) assuming that ETRS89 is coincident with WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1682,South Yemen to WGS 84 (1),transformation,4164,4326,EPSG-Yem South,1,1340,Approximation at the +/- 1m level.,9603,,,Parameter values taken from South Yemen to Yemen NGN96 (1) (code 1539) assuming that NGN96 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1683,Tete to WGS 84 (1),transformation,4127,4326,EPSG-Moz,1,1167,Residuals as high as 30 metres.,9607,,,Parameter values taken from Tete to Moznet (1) (code 1297) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1684,Tete to WGS 84 (2),transformation,4127,4326,EPSG-Moz A,2,2350,Residuals are generally under 1 metre.,9607,,,Parameter values taken from Tete to Moznet (2) (code 1298) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1685,Tete to WGS 84 (3),transformation,4127,4326,EPSG-Moz B,3,2351,Residuals are generally under 4 metres.,9607,,,Parameter values taken from Tete to Moznet (3) (code 1299) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1686,Tete to WGS 84 (4),transformation,4127,4326,EPSG-Moz C,4,2352,Residuals are generally under 3 metres.,9607,,,Parameter values taken from Tete to Moznet (4) (code 1300) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1687,Tete to WGS 84 (5),transformation,4127,4326,EPSG-Moz D,5,2353,Residuals are 5-10 metres.,9607,,,Parameter values taken from Tete to Moznet (5) (code 1301) assuming that Moznet is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1688,ATS77 to WGS 84 (1),transformation,4122,4326,EPSG-Can NB,1,1447,Approximation at the +/- 1m level.,9615,,,Parameter file is from ATS77 to NAD83(CSRS) (1) (code 1841) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1689,ATS77 to WGS 84 (2),transformation,4122,4326,EPSG-Can PEI,2,1533,Approximation at the +/- 1m level.,9615,,,Parameter file is from ATS77 to NAD83(CSRS) (2) (code 1846) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1690,NAD27(76) to WGS 84 (1),transformation,4608,4326,EPSG-Can On,1,1367,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27(76) to NAD83 (1) (code 1463) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1691,NAD27(CGQ77) to WGS 84 (3),transformation,4609,4326,EPSG-Can Qc NT2,3,1368,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27(CGQ77) to NAD83(CSRS) (1) (code 1845) assuming that NAD83(CSRS98) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1692,NAD27 to WGS 84 (34),transformation,4267,4326,EPSG-Can QC,34,1368,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27 to NAD83(CSRS) (1) (code 1844) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1693,NAD27 to WGS 84 (33),transformation,4267,4326,EPSG-Can,33,1061,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27 to NAD83 (4) (code 1313) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1694,American Samoa 1962 to WGS 84 (2),transformation,4169,4326,EPSG-Asm W,2,2288,Accuracy 1m.,9613,,,"Parameter files are from American Samoa 1962 to NAD83(HARN) (1) (code 1578), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84 within the accuracy of the transformation.",EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1695,American Samoa 1962 to WGS 84 (3),transformation,4169,4326,EPSG-Asm E,3,2289,Accuracy 1m.,9613,,,"Parameter files are from American Samoa 1962 to NAD83(HARN) (2) (code 1579), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84 within the accuracy of the transformation.",EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1696,NAD83 to WGS 84 (6),transformation,4269,4326,EPSG-Can QC,6,1368,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD83 to NAD83(CSRS) (1) (code 1843) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1697,NAD83 to WGS 84 (7),transformation,4269,4326,EPSG-Can SK,7,2375,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD83 to NAD83(CSRS8) (2) (code 1848) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1698,St. George Island to WGS 84 (1),transformation,4138,4326,EPSG-Usa AK StG,1,1331,Approximation at the +/- 1 to 2m level.,9613,,,Parameter files are from St. George Island to NAD83 (1) (code 1457) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1699,St. Lawrence Island to WGS 84 (1),transformation,4136,4326,EPSG-Usa AK StL,1,1332,Approximation at the +/- 1 to 2m level.,9613,,,Parameter files are from St. Lawrence Island to NAD83 (1) (code 1455) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1700,St. Paul Island to WGS 84 (1),transformation,4137,4326,EPSG-Usa AK StP,1,1333,Approximation at the +/- 1 to 2m level.,9613,,,Parameter files are from St. Paul Island to NAD83 (1) (code 1456) assuming that NAD83 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1701,NZGD49 to NZGD2000 (2),transformation,4272,4167,OSG-Nzl 4m,2,1175,4m accuracy.,9607,,,For better accuracy use NZGD49 to NZGD2000 (3) (code 1568).,http://www.linz.govt.nz/services/surveysystem/osgpublications/nzgd2000_trans.html,EPSG,2001-08-28 00:00:00,,1,0
+1702,NAD83 to WGS 84 (8),transformation,4269,4326,EPSG-Can AB,8,2376,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD83 to NAD83(CSRS) (3) (code 1849) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation. This file  AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some sodtware.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1703,NAD27 to WGS 84 (32),transformation,4267,4326,EPSG-Can SK,32,2375,Approximation at the +/- 1m level.,9615,,,Parameter file is from NAD27 to NAD83(CSRS98) (1) (code 1600) assuming that NAD83(CSRS98) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1704,NAD83 to NAD83(HARN) (40),transformation,4269,4152,NGS-Usa AR,40,1374,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1708.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1705,NAD83 to NAD83(HARN) (41),transformation,4269,4152,NGS-Usa IA,41,1384,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.  May be taken as approximate transformation NAD83-WGS 84 - see code 1709.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1706,NAD83 to NAD83(HARN) (42),transformation,4269,4152,NGS-Usa MN,42,1392,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.   May be taken as approximate transformation NAD83-WGS 84 - see code 1710.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1707,NAD83 to NAD83(HARN) (43),transformation,4269,4152,NGS-Usa MO,43,1394,Geodetic survey. Accuracy 0.05m at 67% confidence level.,9613,,,Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(HARN) (code 4152) have longitudes positive east.  May be taken as approximate transformation NAD83-WGS 84 - see code 1711.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+1708,NAD83 to WGS 84 (12),transformation,4269,4326,EPSG-USA Ar,12,1374,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (40) (code 1704) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1709,NAD83 to WGS 84 (13),transformation,4269,4326,EPSG-Usa IA,13,1384,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (41) (code 1705) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1710,NAD83 to WGS 84 (14),transformation,4269,4326,EPSG-Usa MN,14,1392,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (42) (code 1706) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1711,NAD83 to WGS 84 (15),transformation,4269,4326,EPSG-Usa MO,15,1394,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (43) (code 1707) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1712,NAD83 to WGS 84 (16),transformation,4269,4326,EPSG-Usa CO,16,1376,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (5) (code 1478) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1713,NAD83 to WGS 84 (17),transformation,4269,4326,EPSG-Usa GA,17,1380,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (6) (code 1479) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1714,NAD83 to WGS 84 (18),transformation,4269,4326,EPSG-Usa FL,18,1379,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (7) (code 1480) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1715,NAD83 to WGS 84 (19),transformation,4269,4326,EPSG-Usa ID MT e,19,2382,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (8) (code 1481) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1716,NAD83 to WGS 84 (20),transformation,4269,4326,EPSG-Usa ID MT w,20,2383,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (9) (code 1482) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1717,NAD83 to WGS 84 (21),transformation,4269,4326,EPSG-Usa AL,21,1372,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (1) (code 1474) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1718,NAD83 to WGS 84 (22),transformation,4269,4326,EPSG-Usa KY,22,1386,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (10) (code 1483) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1719,NAD83 to WGS 84 (23),transformation,4269,4326,EPSG-Usa LA,23,1387,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (11) (code 1484) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1720,NAD83 to WGS 84 (24),transformation,4269,4326,EPSG-Usa DE MD,24,2377,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (12) (code 1485) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1721,NAD83 to WGS 84 (25),transformation,4269,4326,EPSG-Usa ME,25,1388,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (13) (code 1486) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1722,NAD83 to WGS 84 (26),transformation,4269,4326,EPSG-Usa MI,26,1391,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (14) (code 1487) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1723,NAD83 to WGS 84 (27),transformation,4269,4326,EPSG-Usa MS,27,1393,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (15) (code 1488) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1724,NAD83 to WGS 84 (28),transformation,4269,4326,EPSG-Usa NE,28,1396,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (16) (code 1489) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1725,NAD83 to WGS 84 (29),transformation,4269,4326,EPSG-Usa NewEng,29,2378,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (17) (code 1490) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1726,NAD83 to WGS 84 (30),transformation,4269,4326,EPSG-Usa NM,30,1400,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (18) (code 1491) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1727,NAD83 to WGS 84 (31),transformation,4269,4326,EPSG-Usa NY,31,1401,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (19) (code 1492) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1728,NAD83 to WGS 84 (32),transformation,4269,4326,EPSG-Usa AZ,32,1373,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (2) (code 1475) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1729,NAD83 to WGS 84 (33),transformation,4269,4326,EPSG-Usa ND,33,1403,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (20) (code 1493) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1730,NAD83 to WGS 84 (34),transformation,4269,4326,EPSG-Usa OK,34,1405,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (21) (code 1494) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1731,NAD83 to WGS 84 (35),transformation,4269,4326,EPSG-PRVI,35,1335,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (22) (code 1495) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1732,NAD83 to WGS 84 (36),transformation,4269,4326,EPSG-Usa SD,36,1410,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (23) (code 1496) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1733,NAD83 to WGS 84 (37),transformation,4269,4326,EPSG-Usa TN,37,1411,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (24) (code 1497) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1734,NAD83 to WGS 84 (38),transformation,4269,4326,EPSG-Usa TX e,38,2379,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (25) (code 1498) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1735,NAD83 to WGS 84 (39),transformation,4269,4326,EPSG-Usa TX w,39,2380,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (26) (code 1499) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1736,NAD83 to WGS 84 (40),transformation,4269,4326,EPSG-Usa VA,40,1415,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (27) (code 1500) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1737,NAD83 to WGS 84 (41),transformation,4269,4326,EPSG-Usa OR WA,41,2381,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (28) (code 1501) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1738,NAD83 to WGS 84 (42),transformation,4269,4326,EPSG-Usa WI,42,1418,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (29) (code 1502) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1739,NAD83 to WGS 84 (43),transformation,4269,4326,EPSG-Usa CA n,43,2297,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (3) (code 1476) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1740,NAD83 to WGS 84 (44),transformation,4269,4326,EPSG-Usa WY,44,1419,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (30) (code 1503) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1741,NAD83 to WGS 84 (45),transformation,4269,4326,EPSG-Usa HI,45,1334,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (31) (code 1520) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1742,NAD83 to WGS 84 (46),transformation,4269,4326,EPSG-Usa IN,46,1383,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (32) (code 1521) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1743,NAD83 to WGS 84 (47),transformation,4269,4326,EPSG-Usa KS,47,1385,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (33) (code 1522) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1744,NAD83 to WGS 84 (48),transformation,4269,4326,EPSG-Usa NV,48,1397,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (34) (code 1523) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1745,NAD83 to WGS 84 (49),transformation,4269,4326,EPSG-Usa OH,49,1404,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (35) (code 1524) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1746,NAD83 to WGS 84 (50),transformation,4269,4326,EPSG-Usa UT,50,1413,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (36) (code 1525) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1747,NAD83 to WGS 84 (51),transformation,4269,4326,EPSG-Usa WV,51,1417,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (37) (code 1526) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1748,NAD83 to WGS 84 (52),transformation,4269,4326,EPSG-Usa IL,52,1382,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (38) (code 1553) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1749,NAD83 to WGS 84 (53),transformation,4269,4326,EPSG-Usa NJ,53,1399,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (39) (code 1554) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1750,NAD83 to WGS 84 (54),transformation,4269,4326,EPSG-Usa CA s,54,2298,Approximation at the +/- 1m level.,9613,,,Parameter files are from NAD83 to NAD83(HARN) (4) (code 1477) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+1751,Amersfoort to ETRS89 (1),transformation,4289,4258,NCG-Nld 2000,1,1172,Accuracy 0.5m,9607,,,"Dutch sources also quote an equivalent transformation with parameter values dX=+593.032 dY=+26.000 dZ=+478.741m, rX rY rZ and dS as this tfm. These values belong to a different transformation method and cannot be used with the Coordinate Frame method.",http://rdnap.kadaster.nl/rd/index.html  Also Nederlandse Commissie voor Geodesie publication 30; 3rd edition 1997.  Also with change of method [...]
+1752,NAD83 to NAD83(CSRS98) (3),transformation,4269,4140,AB Env-Can AB,3,2376,?,9615,,,"This gridded difference file  AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some software suites.  Formats identical, but AB file is provincial fit only.  Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1702.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca,EPSG,2000-10-19  [...]
+1753,CH1903 to WGS 84 (1),transformation,4149,4326,BfL-CH 1,1,1286,?,9607,,,Implemented in Bundesamt f�r Landestopographie programme GRANIT.,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,2001-08-28 00:00:00,,1,0
+1754,Minna to WGS 84 (3),transformation,4263,4326,SHL-Nga S,3,2371,Oil exploration.,9606,,,"Used by Shell SPDC throughout southern Nigeria onshore, delta and shallow offshore from 1994; adopted by Total for offshore OPL246.",Shell Petroleum Development Company,EPSG,2002-03-15 00:00:00,2001.38  2002.29,1,0
+1755,Bogota 1975 (Bogota) to Bogota 1975,transformation,4802,4218,IGAC-Col,1,1070,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1756,Lisbon (Lisbon) to Lisbon,transformation,4803,4207,IGC-Prt,1,1294,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1757,MGI (Ferro) to MGI,transformation,4805,4312,BEV-Aut balk,1,1166,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1758,Padang (Jakarta) to Padang,transformation,4808,4280,EPSG-Idn Sumatra,1,1355,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1759,Batavia (Jakarta) to Batavia,transformation,4813,4211,EPSG-Idn Java,1,1285,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1760,RT38 (Stockholm) to RT38,transformation,4814,4308,NLS-Swe,1,1225,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1761,Greek (Athens) to Greek,transformation,4815,4120,NTU-Grc,1,1106,Change of prime meridian.,9601,,,,Topography Department; National Technical University of Athens.,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1762,NGO 1948 (Oslo) to NGO1948,transformation,4817,4273,NGO-Nor,1,1352,Change of prime meridian.,9601,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,2001-10-04 00:00:00,2001.39,1,0
+1763,NTF (Paris) to NTF (1),transformation,4807,4275,IGN-Fra,1,1096,Change of prime meridian.,9601,,,,IGN Paris.,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1764,NTF (Paris) to NTF (2),transformation,4807,4275,RGS,2,1096,Change of prime meridian.,9601,,,EPSG prefers value from IGN Paris (code 1467).,Royal Geographic Society; London,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1765,Bern 1898 (Bern) to CH1903,transformation,4801,4149,BfL-CH,1,1286,Change of prime meridian.,9601,,,,EPSG,EPSG,2001-10-04 00:00:00,2001.39,1,0
+1766,CH1903 to WGS 84 (2),transformation,4149,4326,BfL-CH 2,2,1286,Accuracy 1.5 metres.,9603,,,These parameters are strictly between CH1903+ and CHTRF95 (code 1509) or ETRS89 (code 1647) but are used given to lesser precision from CH1903 to WGS 84 as an approximation which is within the accuracy of the distortions in the CH1903 network.,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,200 [...]
+1767,REGVEN to SIRGAS (1),transformation,4189,4170,CN-Ven,1,1251,Accuracy 2 centimetres.,9603,,,,Instituto Geografia de Venezuela Simon Bolivar,EPSG,2001-11-06 00:00:00,,1,0
+1768,REGVEN to WGS 84 (1),transformation,4189,4326,EPSG-Ven,1,1251,Approximation at the +/- 1m level.,9603,,,,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1769,PSAD56 to REGVEN (1),transformation,4248,4189,IGSB-Ven,1,1251,?,9636,,,,Instituto Geografia de Venezuela Simon Bolivar,EPSG,2001-11-06 00:00:00,,1,0
+1770,PSAD56 to WGS84 (1),transformation,4248,4326,EPSG-Ven,1,1251,Approximation at the +/- 1m level.,9636,,,Parameter vales are from PSAD56 to REGVEN (1) (code 1769) assuming that REGVEN is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1771,La Canoa to REGVEN (1),transformation,4247,4189,IGSB-Ven,1,1251,?,9636,,,,Instituto Geografia de Venezuela Simon Bolivar,EPSG,2001-11-06 00:00:00,,1,0
+1772,La Canoa to WGS84 (1),transformation,4247,4326,EPSG-Ven,1,1251,Approximation at the +/- 1m level.,9636,,,Parameter vales are from La Canoa to REGVEN (1) (code 1771) assuming that REGVEN is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1773,POSGAR 98 to WGS 84 (1),transformation,4190,4326,EPSG-Arg,1,1033,Approximation at the +/- 1m level.,9603,,,,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1774,POSGAR 98 to SIRGAS (1),transformation,4190,4170,IGM-Arg,1,1033,POSGAR 98 is a densification of SIRGAS.,9603,,,,ISBN 85-240-0647-1. Sistema de Refer�ncia Geoc�ntrico para a Am�rica do Sul: Relat�rio Final. IGBE Rio de Janeiro 1997.,EPSG,2001-11-06 00:00:00,,1,0
+1775,Pulkovo 1942(83) to ETRS89 (2),transformation,4178,4258,IfAG-Deu E 0.1m,2,1343,For applications with an accuracy at 0.1m level,9606,,,Derived at 35 points of the German GPS Network DREF. From 2001 supersedes Pulkovo 1942(83) to ETRS89 (1) (code 1674).,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1776,DHDN to ETRS89 (2),transformation,4314,4258,IfAG-Deu W 3m,2,2326,For applications with an accuracy at 3 m level,9606,,,Mean of 109 stations. May be taken as approximate transformation DHDN to WGS 84 - see code 1777.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1777,DHDN to WGS 84 (2),transformation,4314,4326,EPSG-Deu W 3m,2,2326,For applications with an accuracy at 3 m level,9606,,,Parameter values from DHDN to ETRS89 (2) (code 1776) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1778,DHDN to ETRS89 (3),transformation,4314,4258,IfAG-Deu W-S,3,2543,For applications with an accuracy at 0.1m level,9606,,,Derived at 10 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1779,DHDN to ETRS89 (4),transformation,4314,4258,IfAG-Deu W-cen,4,2542,For applications with an accuracy at 0.1m level,9606,,,Derived at 27 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1780,DHDN to ETRS89 (5),transformation,4314,4258,IfAG-Deu W-N,5,2541,For applications with an accuracy at 0.1m level,9606,,,Derived at 21 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1781,DHDN to ETRS89 (6),transformation,4314,4258,IfAG-Deu Thur,6,2544,For applications with an accuracy at 0.1m level,9606,,,Derived at 10 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1782,DHDN to ETRS89 (7),transformation,4314,4258,IfAG-Deu Sach,7,2545,For applications with an accuracy at 0.1m level,9606,,,Derived at 35 points of the German GPS Network DREF.,Institute for Cartography and Geodesy; Leipzig via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1783,ED50 to ETRS89 (9),transformation,4230,4258,HGK-Tur,9,1237,For applications to an accuracy of 2 metres.,9606,,,May be taken as approximate transformation ED50 to WGS 84 - see code 1784.,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1784,ED50 to WGS 84 (30),transformation,4230,4326,EPSG-Tur,30,1237,For applications to an accuracy of 2 metres.,9606,,,Parameter values from ED50 to ETRS89 (9) (code 1783). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1785,MGI to ETRS89 (3),transformation,4312,4258,GURS-Svn,3,1212,For applications to an accuracy of 1 metre.,9606,,,May be taken as approximate transformation MGI to WGS 84 - see code 1786.,Geodetska Uprava Republike Slovenij via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1786,MGI to WGS 84 (5),transformation,4312,4326,EPSG-Svn,5,1212,For applications to an accuracy of 1 metre.,9606,,,Parameter values from MGI to ETRS89 (3) (code 1785). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1787,RT90 to ETRS89 (2),transformation,4124,4258,NLS-Swe 2001,2,1225,Accuracy 0.1m.,9607,,,Derived at 165 points. Supersedes RT90 to ETRS89 (1) (code 1437). May be taken as approximate transformation RT90 to WGS 84 - see code 1787.,National Land Survey of Sweden (http://www.lm.se/geodesi/refsys/eng/refsys-eng.htm) via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+1788,RT90 to WGS 84 (2),transformation,4124,4326,EPSG-Swe 2001,2,1225,Approximation at the +/- 1m level.,9607,,,Parameter values from RT90 to ETRS89 (1) (code 1787) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+1789,Dealui Piscului 1933 to WGS 84 (1),transformation,4316,4326,NAMR-Rom,1,1197,?,9603,,,,Petromar and NAMR,EPSG,2001-11-06 00:00:00,,1,0
+1790,Lisbon to ETRS89 (2),transformation,4207,4258,ICC-Prt 2001,2,1294,For applications to an accuracy of 2 metres.,9606,,,Derived in 2001.  Supersedes Lisbon to ETRS89 (1) (code 1655). May be taken as approximate transformation Lisbon to WGS 84 - see code 1791.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2002-01-18 00:00:00,,1,0
+1791,Lisbon to WGS 84 (2),transformation,4207,4258,EPSG-Prt 2001,2,1294,For applications to an accuracy of 2 metres.,9606,,,Parameter values from Lisbon to ETRS89 (2) (code 1790). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2002-01-18 00:00:00,,1,0
+1792,Datum 73 to ETRS89 (2),transformation,4274,4258,ICC-Prt 2001,2,1294,For applications to an accuracy of 1 metre.,9606,,,Derived in 2001.  Supersedes Datum 73 to ETRS89 (1) (code 1657).  May be taken as approximate transformation Datum 73 to WGS 84 - see code 1793.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2002-01-18 00:00:00,,1,0
+1793,Datum 73 to WGS 84 (2),transformation,4274,4258,EPSG-Prt 2001,2,1294,For applications to an accuracy of 1 metre.,9606,,,Parameter values from Datum 73 to ETRS89 (2) (code 1792). Assumes ETRS89 and WGS 84 can be considered the same to within the accuracy of the transformation.,EPSG,EPSG,2002-01-18 00:00:00,,1,0
+1794,MGI to WGS 84 (6),transformation,4312,4326,JPet-Yug,6,2547,Oil industry,9603,,,For more accurate transformation see MGI to WGS 84 (7) (code 1795).,Jugopetrol,EPSG,2002-01-18 00:00:00,,1,0
+1795,MGI to WGS 84 (7),transformation,4312,4326,JPET-Yug MB,7,2547,Oil industry,9636,,,,Jugopetrol,EPSG,2002-01-18 00:00:00,,1,0
+1796,Manoca 1962 to WGS 84 (1),transformation,4193,4326,ELF94-Cmr,1,2555,Oil industry,9603,,,"Derived at two points, checked at a third by Stolt Comex Seaway and Geoid for Elf.",TotalFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+1797,Qornoq 1927 to WGS 84 (1),transformation,4194,4326,DMA-Grl S,1,2407,"For military purposes.  Accuracy 25m, 25m and 32m in X, Y and Z axes.",9603,,,Derived at 2 stations.,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,2002-01-18 00:00:00,,1,0
+1798,Qornoq 1927 to WGS 84 (2),transformation,4194,4326,KMS-Grl,2,1107,Topographic mapping.,9606,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+1799,Scoresbysund 1952 to WGS 84 (1),transformation,4195,4326,KMS-Grl Scosd,1,2570,Topographic mapping.,9606,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+1800,Ammassalik 1958 to WGS 84 (1),transformation,4196,4326,KMS-Grl Ammlk,1,2571,Topographic mapping.,9606,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+1801,Pointe Noire to WGS 84 (2),transformation,4282,4326,CGG94-Cog,2,2574,?,9603,,,Derived in 1994 by CGG/Topnav using DORIS system on various stations along the coastline.,TotalFinaElf,EPSG,2002-02-08 00:00:00,,1,0
+1802,Pointe Noire to WGS 84 (3),transformation,4282,4326,ELF95-Cog,3,2574,Used by Elf since May 1995 for all offshore Congo operations.,9606,,,Derived by Geoid for Elf in May 1995 using GPS and IGS data by tying 4 geodetic points to ITRF93 epoch 1995.4.,TotalFinaElf,EPSG,2002-02-08 00:00:00,,1,0
+1803,AGD66 to GDA94 (11),transformation,4202,4283,ICSM-Aus 0.1m,11,2575,0.1m accuracy.,9615,,,"Supersedes AGD66 to GDA94 variants 6, 7 and 10 (codes 1506 1507 1596). Variant 10 (1596) superseded #5 (1464). Input expects longitudes to be positive west; EPSG GeogCRS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.",GDA Technical Manual.  http://www.anzlic.org.au/icsm/gdatm/chapter7.htm,EPSG,2002-01-18 00:00:00,,1,0
+1804,AGD84 to GDA94 (5),transformation,4203,4283,Auslig-Aus 0.1m,5,2576,0.1m accuracy.,9615,,,Supersedes AGD84 to GDA94 (4) (code 1593) which itself replaced variant 3 (code1159).  Input expects longitudes to be positive west; EPSG GeogCRS AGD84 (code 4203) and GDA94 (code 4283) both have longitudes positive east.,GDA Technical Manual.  http://www.anzlic.org.au/icsm/gdatm/chapter7.htm,EPSG,2002-01-18 00:00:00,,1,0
+1805,Garoua to WGS 72BE (1),transformation,4197,4324,ELF-Cmr,1,2590,Oil industry exploration.,9603,,,Derived in 1981 by Decca Survey France for Elf Serepca.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+1806,Kousseri to WGS 72BE (1),transformation,4198,4324,ELF-Cmr,1,2591,Oil industry expoloration.,9603,,,Derived in 1981 by Decca Survey France for Elf Serepca.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+1807,Pulkovo 1942 to WGS 84 (13),transformation,4284,4326,BP-Aze Aioc95,13,1038,Oil industry operations by AIOC prior to 1997.,9606,,,"Derived via WGS72 values taken from SOCAR Magnavox 1502 manual. Used by AIOC 1995-1997 then superseded by the AIOC97 values (tfm code 1808).
+Do not confuse with AIOC95 vertical datum as used in southern Caspian Sea and at Sangachal terminal by AIOC.",BP,EPSG,2002-02-12 00:00:00,,1,0
+1808,Pulkovo 1942 to WGS 84 (14),transformation,4284,4326,BP-Aze Aioc97,14,2593,Oil industry operations.,9606,,,"Mean of 3 stations in western Georgia, 4 stations in eastern Georgia and 4 stations in eastern Azerbaijan.  Derived for use on AIOC early oil western export pipeline, but adopted for all AIOC work superseding the 1995 AIOC transformation (code 1807).",BP,EPSG,2002-02-12 00:00:00,,1,0
+1809,Pulkovo 1942 to WGS 84 (15),transformation,4284,4326,TFE-Aze97,15,2594,Oil industry operations.,9606,,,Parameter values calculated by Elf Exp[loration and Production based on geodetic survey carried out by Azerbaijan State Committee for Geodesy and Cartography.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+1810,ED50 to WGS 84 (31),transformation,4230,4326,wgc72-Egy,31,2595,Oil industry exploration and production operations.,9606,,,Derived via concatenation through WGS72.  The ED50 to WGS72 step is the Sepplin 1974 value for all Europe.,Western Geophysical,EPSG,2002-02-12 00:00:00,,1,0
+1811,PSAD56 to WGS 84 (12),transformation,4248,4326,PB-Braz N,12,1754,Oil industry exploration.,9603,,,Used by Petrobras for shelf operations.,Petrobras,EPSG,2002-02-12 00:00:00,,1,0
+1812,Indian 1975 to WGS 84 (4),transformation,4240,4326,Auslig-Tha,4,1231,Cadastral survey.,9606,,,,Auslig via GPS World.,EPSG,2002-02-12 00:00:00,,1,0
+1813,Batavia to WGS 84 (2),transformation,4211,4326,ARCO-Idn ONWJ,2,2577,Oil industry operations.,9603,,,,Arco geodetic database,EPSG,2002-02-12 00:00:00,,1,0
+1814,Batavia to WGS 84 (3),transformation,4211,4326,KOM-Idn EJGP,3,2588,Oil industry operations.,9603,,,Used by PT Komaritim for Nippon Steel during East Java Gas Pipeline construction.,PT Komaritim report S808/91.,EPSG,2002-02-12 00:00:00,,1,0
+1815,Nord Sahara 1959 to WGS 84 (4),transformation,4307,4326,BP-Alg D3,4,2598,Oil industry operations.,9606,,,Used by BP in District 3 and In Salah Gas.,BP,EPSG,2002-02-12 00:00:00,,1,0
+1816,Nord Sahara 1959 to WGS 84 (5),transformation,4307,4326,BPA-Alg InAm,5,2599,Oil industry operations.,9603,,,Derived at astro station central to concession.  Significant and varying differences (>100m) at 4 neighbouring astro stations.,BP,EPSG,2002-02-12 00:00:00,,1,0
+1817,Nord Sahara 1959 to WGS 84 (6),transformation,4307,4326,ARCO-Alg HBR,6,2600,Oil industry operations.,9603,,,Derived at astro station Guerrara.,Arco geodetic database,EPSG,2002-02-12 00:00:00,,1,0
+1818,Minna to WGS 84 (4),transformation,4263,4326,RSL-Nga,4,1717,Oil industry operations.,9606,,,Concatenated via WGS 72BE. Adopted by Statoil.,Racal Survey Nigeria,EPSG,2002-02-12 00:00:00,,1,0
+1819,Minna to WGS 84 (5),transformation,4263,4326,SPD-Nga S,5,2371,Oil industry operations.,9606,,,Used by Shell in southern Nigeria and Total in OPL246.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,1
+1820,Minna to WGS 84 (6),transformation,4263,4326,CON89-Nga,6,1717,Oil industry operations.,9603,,,Derived by Nortech at station L40 Minna using NNPC 1989 GPS network tied to 4 ADOS stations. Used by Conoco in OPLs 219-220 to cm precision and ExxonMobil in OPL 209 to dm precision..,TotalFinaElf,EPSG,2002-07-16 00:00:00,2002.29,1,0
+1821,Minna to WGS 84 (7),transformation,4263,4326,ELF94-Nga,7,1717,Oil industry operations.,9603,,,"Derived by Elf Petroleum Nigeria in 1994 at 3 stations (M101 onshore, offshore platforms XSW06 and XSV39) and used in OMLs 99-102 and OPLs 222-223.",TotalFinaElf,EPSG,2002-07-16 00:00:00,2002.29,1,0
+1822,Minna to WGS 84 (8),transformation,4263,4326,SHL-Nga OPL W,8,1717,Oil industry exploration and production.,9603,,,"Used by Shell SNEPCO for OPLs 209-213 and 316. Derived during 1990 Niger Delta control survey at 4 stations (XSU27, 30 31 and 35).",Shell Nigeria Exploration and Production Company,EPSG,2002-03-15 00:00:00,,1,0
+1823,Minna to WGS 84 (9),transformation,4263,4326,SHL-Nga OPL S,9,1717,Oil industry exploration and production.,9603,,,"Used by Shell SNEPCO for OPLs 217-223. Derived during 1990 Niger Delta control survey at 4 stations (XSU38, 41, 44 and 45).",Shell Nigeria Exploration and Production Company,EPSG,2002-03-15 00:00:00,,1,0
+1824,Minna to WGS 84 (10),transformation,4263,4326,SHL-Nga Gongola,10,2371,Oil industry exploration and production.,9603,,,Used by Shell SNEPCO for Gongola basin.,Shell International Exploration and Production,EPSG,2002-03-15 00:00:00,,1,0
+1825,Hong Kong 1980 to WGS 84 (1),transformation,4611,4326,LSD-HKG 2002,1,1118,Accuracy to 1m level.,9606,,,Published 1st March 2002.,"Geodetic Survey Section, Survey and Mapping Office, Lands Department, Hong Kong. http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+1826,JGD2000 to WGS 84 (1),transformation,4612,4326,EPSG-Jpn,1,1129,Approximation at the +/- 1m level.,9603,,,,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+1827,Tokyo to WGS 84 (6),transformation,4301,4326,GSI-Jpn 452141,6,2425,For medium accuracy.,9618,,,,http://vldb.gsi.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,2002-06-22 00:00:00,,1,0
+1828,Yoff to WGS 72 (1),transformation,4310,4322,DMA-SEN,1,1207,Military survey.,9603,,,,DMA,EPSG,2002-06-22 00:00:00,,1,0
+1829,HD72 to ETRS89 (1),transformation,4237,4258,FOMI-Hun,1,1119,Accuracy at decimetre level throughout Hungary.,9607,,,May be taken as approximate transformation HD72 to WGS 84 - see code 1830.,Institute of Geodetic Survey and Remote Sensing (FOMI) reflected at http://lazarus.elte.hu/gb/geodez/geod5.htm,EPSG,2002-06-22 00:00:00,,1,0
+1830,HD72 to WGS 84 (1),transformation,4237,4326,EPSG-Hun,1,1119,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,9607,,,Parameter values taken from HD72 to ETRS89 (1) (code 1829) assuming that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+1831,HD72 to WGS 84 (2),transformation,4237,4326,ELTE-Hun,2,1119,Accuracy better than 1m in all three dimensions throughout Hungary.,9603,,,Derived at fundamental point Szolohegy and tested at 99 stations throughout Hungary.,"Timar, Molnar and Pasztor; Eotvos University, in Geodezia es Kartografia 54(1) pp11-16.  www.fomi.hu/internet/magyar/szaklap/geodkart.htm",EPSG,2002-06-22 00:00:00,,1,0
+1832,ID74 to WGS 84 (2),transformation,4238,4326,Rac91-Idn,2,1122,For oil industry purposes.,9606,,,Derived via coordinates of 2 Pulse8 stations. Use of D74 to WGS 84 (3) (code 1833) is recommended.,Racal Survey,EPSG,2002-06-22 00:00:00,,1,0
+1833,ID74 to WGS 84 (3),transformation,4238,4326,Bak-Idn,3,1122,"Standard deviations of translations are 1.3, 1.1 and 3.6m, of rotations 0.11, 0.06 and 0.04 sec and ppm 0.18.",9607,,,Derived at 38 stations.,Bakosurtanal.,EPSG,2002-06-22 00:00:00,,1,0
+1834,Segara to WGS 84 (1),transformation,4294,4326,NIMA-Idn Kal,1,2354,For military purposes.,9603,,,Accuracy estimate not available.,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,2002-06-22 00:00:00,,1,0
+1835,Segara to WGS 84 (2),transformation,4294,4326,Shl-Idn Kal E,2,1360,Oil exploration.,9603,,,,Shell,EPSG,2002-06-22 00:00:00,,1,0
+1836,Segara to WGS 84 (3),transformation,4294,4326,Shl-Idn Kal NE,3,2770,Oil exploration.,9603,,,,Shell,EPSG,2002-06-22 00:00:00,,1,0
+1837,Makassar to WGS 84 (1),transformation,4257,4326,Shl-Idn Sul SW,1,1316,Oil exploration.,9603,,,,Shell,EPSG,2002-06-22 00:00:00,,1,0
+1838,Segara to WGS 84 (4),transformation,4613,4326,TOT-Idn Mah,4,1328,Oil exploration.,9603,,,Datum shift derived through ITRF93.,Total Indonesia.,EPSG,2002-06-22 00:00:00,,1,0
+1839,Beduaram to WGS 72BE (1),transformation,4213,4324,ELF-Ner SE,1,2771,Oil exploration.,9603,,,,TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+1840,QND95 to WGS 84 (1),transformation,4614,4326,CGIS-Qat,1,1346,Parameter values are defined and therefore exact.,9606,,,"Transformation defines QND95. May be approximated to 1m throughout Qatar by geocentric translation transformation with dX=-127.78098m, dY=-283.37477m, dZ=+21.24081m.",Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,1,0
+1841,ATS77 to NAD83(CSRS) (1),transformation,4122,4617,GIC-Can NB,1,1447,Accuracy 1-2 metres.,9615,,,Introduced in 1999. Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1688.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,2002-07-13 00:00:00,,1,0
+1842,NAD83(CSRS) to WGS 84 (1),transformation,4617,4326,EPSG-Can,1,1336,Approximation at the +/- 1m level assuming that NAD83(CSRS) is equivalent to WGS 84.,9603,,,For many purposes NAD83(CSRS) can be considered to be coincident with WGS 84.,EPSG,EPSG,2002-07-13 00:00:00,,1,0
+1843,NAD83 to NAD83(CSRS) (1),transformation,4269,4617,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD83 (code 4269) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1696.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2002-07-13 00:00:00,,1,0
+1844,NAD27 to NAD83(CSRS) (1),transformation,4267,4617,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27 (code 4267) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1692.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2002-07-13 00:00:00,,1,0
+1845,NAD27(CGQ77) to NAD83(CSRS) (1),transformation,4609,4617,SGQ-Can QC,1,1368,Accuracy 1-2 metres.,9615,,,Uses NT method which expects longitudes positive west; EPSG GeogCRSs NAD27(CGQ77) (code 4609) and NAD83(CSRS) (code 4617) have longitudes positive east. Can be taken as an approximate transformation NAD27(CGQ77) to WGS 84 - see code 1691.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,2002-07-13 00:00:00,,1,0
+1846,ATS77 to NAD83(CSRS) (2),transformation,4122,4617,PEI DOT-Can PEI,2,1533,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1689.,PEI Department of Transportation & Public Works,EPSG,2002-07-13 00:00:00,,1,0
+1847,NAD27 to NAD83(CSRS) (2),transformation,4267,4617,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 1703.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2002-07-13 00:00:00,,1,0
+1848,NAD83 to NAD83(CSRS) (2),transformation,4269,4617,SK PMC-Can SK,2,2375,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1697.,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2002-07-13 00:00:00,,1,0
+1849,NAD83 to NAD83(CSRS) (3),transformation,4269,4617,AB Env-Can AB,3,2376,Accuracy 1-2 metres.,9615,,,"This gridded difference file  AB_CSRS.DAC will need to be renamed to AB_CSRS.gsb to run in some software suites.  Formats identical, but AB file is provincial fit only.  Can be taken as an approximate transformation NAD83 to WGS 84 - see code 1702.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca [...]
+1850,ATS77 to NAD83(CSRS) (3),transformation,4122,4617,NSGC-Can NS,2,2313,Accuracy 1-2 metres.,9615,,,Can be taken as an approximate transformation ATS77 to WGS 84 - see code 1851.,Nova Scotia Geomatics Centre -   Contact aflemmin at linux1.nsgc.gov.ns.ca or telephone 902-667-6409,EPSG,2002-07-13 00:00:00,,1,0
+1851,ATS77 to WGS 84 (3),transformation,4122,4326,EPSG-Can NS,2,2313,Approximation at the +/- 1m level.,9615,,,Parameter file is from ATS77 to NAD83(CSRS) (3) (code 1850) assuming that NAD83(CSRS) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2002-07-13 00:00:00,,1,0
+1852,Timbalai 1948 to WGS 84 (4),transformation,4298,4326,SSB-Mys E,4,2780,Oil exploration.,9606,,,Derived by Racal Survey for SSB at 24 coastal stations (including Timbalai fundamental point and 6 other primary triangulation stations) between in Sabah (Kudat southwards) and Sarawak (Sibu northwards).,Sarawak Shell Berhard,EPSG,2002-07-13 00:00:00,,1,0
+1854,FD58 to WGS 84 (2),transformation,4132,4326,TFE-Irn Lavan,2,2782,Oil Exploration,9603,,,Derived by Geoid for Elf in 1999.  EGM96 geoid used.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1855,FD58 to WGS 84 (3),transformation,4132,4326,TFE-Irn Kharg,3,2781,Oil Exploration,9603,,,Derived by Geoid for Elf in 1999.  EGM96 geoid used.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1856,ED50(ED77) to WGS 84 (3),transformation,4154,4326,TFE-Irn SPars,3,2783,Oil Exploration,9603,,,Derived in Kangan district by Geoid for Total in 1998.  Used for South Pars phases 2 and 3.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1857,ED50(ED77) to WGS 84 (4),transformation,4154,4326,TFE-Irn Lavan,4,2782,Oil Exploration,9603,,,Derived in 1999 on Lavan island by Geoid for Elf.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1858,ED50(ED77) to WGS 84 (5),transformation,4154,4326,TFE-Irn Kharg,5,2781,Oil Exploration,9603,,,Derived by Geoid for Elf in 1999.  EGM96 geoid used.,TotalFinaElf,EPSG,2002-07-13 00:00:00,,1,0
+1859,ELD79 to WGS 84 (1),transformation,4159,4326,REP-Lby MZQ,1,2785,Oil Exploration,9603,,,Used by Repsol. Reliability of connection to ELD79 questionned.,Oil industry sources.,EPSG,2002-07-16 00:00:00,,1,0
+1860,ELD79 to WGS 84 (2),transformation,4159,4326,TFE-Lby MZQ,2,2785,Oil Exploration. 3-dimensional SD at 11 points is 0.5m.,9603,,,Derived December 2001 by NAGECO. Connected to ITRF via Remsa 2000 data. Used by TotalFinaElf.,TotalFinaElf,EPSG,2002-07-16 00:00:00,,1,0
+1861,ELD79 to WGS 84 (3),transformation,4159,4326,TFE-Lby MBK94,3,2786,Oil Exploration,9603,,,Derived by GEOID in 1994 from Transit satellite data. Used by TotalFinaElf.,TotalFinaElf,EPSG,2002-07-16 00:00:00,,1,0
+1862,ELD79 to WGS 84 (4),transformation,4159,4326,TFE-Lby MBK00,4,2786,Oil Exploration,9606,,,Derived by Geoid in 2000 from ITRF connection by NAGECO for TotalFinaElf. For historic compatibility TFE use the 1994 tfm ELD79 to WGS 84 (3) (code 1861).,TotalFinaElf,EPSG,2002-07-16 00:00:00,,1,0
+1863,ELD79 to WGS 84 (5),transformation,4159,4326,GMRA-Lby,5,2786,Engineering survey and oil exploration,9607,,,Derived for the Great Man-made River Authority (GMRA). Used by Saga in Mabruk blocks A and B.,Norsk Hydro,EPSG,2002-07-16 00:00:00,,1,0
+5400,Baltic to Caspian,transformation,5705,5706,Caspian Sea,1,2314,Vertical datum change for hydrographic charting.,9616,,,Baltic datum is 28m above Caspian datum.,,EPSG,1999-09-07 00:00:00,97.61,1,0
+5401,Belfast to Malin Head,transformation,5732,5731,OSNI-Gbr NI,1,1305,Vertical datum change for large scale topographic mapping and engineering survey.,9616,,,Belfast datum is 37mm above Malin Head datum.,,EPSG,2001-11-06 00:00:00,,1,0
+5402,Baltic to AIOC95,transformation,5705,5734,AIOC95-Aze,1,2592,Vertical datum change for engineering surveying.,9616,,,Baltic datum is 26.3m above AIOC95 datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5403,AIOC95 to Caspian,transformation,5734,5706,AIOC95-Aze,1,2592,Vertical datum change for hydrographic charting.,9616,,,AIOC95 datum is 1.7m above Caspian datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5404,Baltic to Black Sea,transformation,5705,5735,Black Sea,1,1102,Vertical datum change.,9616,,,Baltic datum is 0.4m above Black Sea datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5405,Hong Kong Principal height to Hong Kong Chart depth,transformation,5738,5739,SMO-HK,1,1118,Vertical datum change for hydrographic charting.,9616,,,HKPD is 0.146m above chart datum.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+8046,ED50 to WGS 84 (14),concatenated operation,4230,4326,5Nat-NSea90,14,2330,Primarily oil industry usage.,,,,"1990 agreement between Denmark, Germany, Great Britain, Netherlands and Norway.  Supersedes 1981 6-nations agreement between ED50 and WGS72 or WGS72BE. Only actively used offshore Norway but see ED50 to WGS 84 (24) (code 1613) for simpler transformation.","Norwegian Mapping Authority publication 1990:1 ""The transformation between ED50 and WGS84 for exploration purposes in the  [...]
+8047,ED50 to WGS 84 (15),concatenated operation,4230,4326,NMA-Nor N65 1991,15,2331,Oil exploration before 2001.,,,,"Superseded by codes 8569 and 1612 in 1997 and 2001.
+The concatenation of transformations 1147 and 1146 gives the following position vector tfm: dX=-84.491  dY=-100.559  dZ=-114.209 metres rX= -2.4006  rY=-0.5367  rZ=-2.3742 microradians  dS=+0.2947 ppm.","Statenskartverk note of January 1991 ""Om transformasjon mellom geodetiske datum i Norge"".",EPSG,1996-10-18 00:00:00,,1,0
+8094,NTF (Paris) to WGS 84 (1),concatenated operation,4807,4326,EPSG-Fra,1,1096,?,,,,,EPSG,EPSG,1996-10-18 00:00:00,,1,0
+8174,Bogota 1975 (Bogota) to WGS 84 (1),concatenated operation,4802,4326,DMA-Col,1,1070,"For military purposes.  Accuracy 6m, 5m and 6m in X, Y and Z axes.",,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8175,Monte Mario (Rome) to WGS 84 (1),concatenated operation,4806,4326,EPSG-Ita,1,2339,For military purposes.  Accuracy 25m in each axis.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8176,Tananarive (Paris) to WGS 84 (1),concatenated operation,4810,4326,EPSG-Mdg,1,1149,For military purposes.  Accuracy not available.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8178,Batavia (Jakarta) to WGS 84 (1),concatenated operation,4813,4326,EPSG-Idn Sumatra,1,1355,For military purposes.  Accuracy 3m in each axis.,,,,,EPSG,EPSG,1997-04-11 00:00:00,,1,0
+8183,HD72 to WGS 84 (1),concatenated operation,4237,4326,EPSG-Hun,1,1119,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1997-07-22 00:00:00,,1,1
+8186,NTF (Paris) to ED50 (1),concatenated operation,4807,4230,EPSG-Fra,1,1096,?,,,,,EPSG,EPSG,1997-11-13 00:00:00,,1,0
+8188,NTF (Paris) to WGS 72 (1),concatenated operation,4807,4322,EPSG-Fra,1,1096,?,,,,,EPSG,EPSG,1997-11-13 00:00:00,,1,0
+8190,AGD66 to WGS 84 (2),concatenated operation,4202,4326,EPSG-Aus 5m,2,1036,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.  0.1m accuracy.,EPSG,EPSG,1998-12-16 00:00:00,98.50,1,1
+8192,AGD84 to WGS 84 (3),concatenated operation,4203,4326,EPSG-Aus 5m,3,1036,5m accuracy. Approximation assuming that GDA94 is equivalent to WGS 84.,,,,Approximation assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1998-12-16 00:00:00,98.50,1,1
+8194,AGD84 to WGS 84 (4),concatenated operation,4203,4326,EPSG-Aus 1m,4,1036,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1998-12-16 00:00:00,98.50,1,1
+8195,RT90 to WGS 84 (1),concatenated operation,4124,4326,EPSG-Swe,1,1225,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1999-04-22 00:00:00,99.11,1,1
+8199,Pulkovo 1942 to WGS 84 (2),concatenated operation,4284,4326,EPSG-Ltu,2,1145,Approximation at the +/- 1m level assuming that LKS94(ETRS89) is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that LKS94(ETRS89) is equivalent to WGS 84.,EPSG,EPSG,1998-03-12 00:00:00,,1,1
+8211,Voirol 1875 (Paris) to WGS 84 (1),concatenated operation,4811,4326,EPSG-Dza N,1,2347,Oil exploration.,,,,,EPSG,EPSG,1998-03-12 00:00:00,,1,0
+8215,Tete to WGS 84 (1),concatenated operation,4127,4326,EPSG-Moz,1,1167,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8217,Tete to WGS 84 (2),concatenated operation,4127,4326,EPSG-Moz A,2,2350,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8219,Tete to WGS 84 (3),concatenated operation,4127,4326,EPSG-Moz B,3,2351,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8221,Tete to WGS 84 (4),concatenated operation,4127,4326,EPSG-Moz C,4,2352,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8223,Tete to WGS 84 (5),concatenated operation,4127,4326,EPSG-Moz D,5,2353,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that Moznet is equivalent to WGS 84.,EPSG,EPSG,1998-04-16 00:00:00,,1,1
+8234,DHDN to WGS 84 (1),concatenated operation,4314,4326,EPSG-Deu W,1,2326,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1998-06-30 00:00:00,,1,1
+8236,Pulkovo 1942 to WGS 84 (11),concatenated operation,4284,4326,EPSG-Deu E,11,1343,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRF89 is equivalent to WGS 84.,EPSG,EPSG,1998-06-30 00:00:00,,1,1
+8241,Madrid 1870 (Madrid) to WGS 84 (1),concatenated operation,4903,4326,EPSG-Esp,1,1217,?,,,,,See individual transformations.,EPSG,1998-11-11 00:00:00,,1,0
+8243,NAD27 to WGS 84 (25),concatenated operation,4267,4326,EPSG-Can old,25,1061,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.  Superseded by NAD27 to WGS 84 (27) (code 8404) in Quebec and NAD27 to WGS 84 (26) (code 8245) elsewhere in Canada.,EPSG,EPSG,1998-11-11 00:00:00,,1,1
+8245,NAD27 to WGS 84 (26),concatenated operation,4267,4326,EPSG-Can,26,1061,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1998-11-11 00:00:00,,1,1
+8263,MGI (Ferro) to WGS 84 (1),concatenated operation,4805,4326,DMA-balk,1,2370,For military purposes only.,,,,Accuracy estimate is not available.,EPSG,EPSG,1998-12-12 00:00:00,,1,0
+8386,Old Hawaiian to WGS 84 (1),concatenated operation,4135,4326,EPSG-Usa Hi,1,1334,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8388,St. Lawrence Island to WGS 84 (1),concatenated operation,4136,4326,EPSG-Usa AK StL,1,1332,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8390,St. Paul Island to WGS 84 (1),concatenated operation,4137,4326,EPSG-Usa AK StP,1,1333,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8392,St. George Island to WGS 84 (1),concatenated operation,4138,4326,EPSG-Usa AK StG,1,1331,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8394,NAD27(CGQ77) to WGS 84 (1),concatenated operation,4609,4326,EPSG-Can Qc NT1,1,1368,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.  Superseded by NAD27(CGQ77) to WGS 84 (2) (code 8564).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8396,AGD66 to WGS 84 (3),concatenated operation,4202,4326,EPSG-Aus ACT 1m,3,2283,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.  Superseded by AGD66 to WGS 84 (11) (code 8581).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8398,AGD66 to WGS 84 (4),concatenated operation,4202,4326,EPSG-Aus Tas 1m,4,1282,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.  Superseded by AGD66 to WGS 84 (9) (code 8576).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8400,AGD66 to WGS 84 (5),concatenated operation,4202,4326,EPSG-Aus NSW Vic 1m,5,2286,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8402,Puerto Rico to WGS 84 (1),concatenated operation,4139,4326,EPSG-PRVI,1,1335,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8404,NAD27 to WGS 84 (27),concatenated operation,4267,4326,EPSG-Can QC,27,1368,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.  Superseded by NAD27 to WGS 84 (31) (code 8565).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8406,NAD27(76) to WGS 84 (1),concatenated operation,4608,4326,EPSG-Can On,1,1367,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83 is equivalent to WGS 84.,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8408,AGD66 to WGS 84 (6),concatenated operation,4202,4326,EPSG-Aus Vic 0.1m,6,2285,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.   Superseded by AGD66 to WGS 84 (11) (code 8578).,EPSG,EPSG,1999-05-24 00:00:00,,1,1
+8418,ATS77 to WGS 84 (1),concatenated operation,4122,4326,EPSG-Can NB,1,1447,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8419,ATS77 to WGS 84 (2),concatenated operation,4122,4326,EPSG-Can PEI,2,1533,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8420,NAD27 to WGS 84 (32),concatenated operation,4267,4326,SK PMC-Can SK,32,2375,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+8421,NAD83 to WGS 84 (7),concatenated operation,4269,4326,SK PMC-Can SK,7,2375,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,Dir Geodetic Surveys; SaskGeomatics Div.; Saskatchewan Property Management Company.,EPSG,2000-10-19 00:00:00,,1,1
+8422,NAD83 to WGS 84 (8),concatenated operation,4269,4326,Alb Env-Can AB,8,2376,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,"The gridded difference file  AB_CSRS.DAC in STEP 1 will need to be renamed to AB_CSRS.gsb to run in some software suites.  Formats identical, but AB file is provincial fit only.",Geodetic Control Section; Land and Forest Svc; Alberta Environment; http://www.gov.ab.ca/env/land/dos/ or email to geoff.banham at gov.ab.ca,EPSG [...]
+8453,AGD66 to WGS 84 (7),concatenated operation,4202,4326,EPSG-Aus Tas 0.1m,7,1282,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8454,AGD66 to WGS 84 (8),concatenated operation,4202,4326,EPSG-Aus NT 0.1m,8,2284,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8457,CH1903+ to WGS 84 (1),concatenated operation,4150,4326,EPSG-CH,1,1286,Approximation at the +/- 1m level assuming that CHTRF95 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that CHTRF95 is equivalent to WGS 84.,EPSG,EPSG,1999-10-20 00:00:00,,1,1
+8460,NAD27 to NAD83(HARN) (1),concatenated operation,4267,4152,NGS-Usa AL,1,1372,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8590.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8461,NAD27 to NAD83(HARN) (2),concatenated operation,4267,4152,NGS-Usa AZ,2,1373,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8591.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8462,NAD27 to NAD83(HARN) (3),concatenated operation,4267,4152,NGS-Usa CA n,3,2297,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8593.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8463,NAD27 to NAD83(HARN) (4),concatenated operation,4267,4152,NGS-Usa CA s,4,2298,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8594.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8464,NAD27 to NAD83(HARN) (5),concatenated operation,4267,4152,NGS-Usa CO,5,1376,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8595.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8465,NAD27 to NAD83(HARN) (6),concatenated operation,4267,4152,NGS-Usa GA,6,1380,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8597.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8466,NAD27 to NAD83(HARN) (7),concatenated operation,4267,4152,NGS-Usa FL,7,1379,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8596.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8467,NAD27 to NAD83(HARN) (8),concatenated operation,4267,4152,NGS-Usa ID MT e,8,2382,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8611.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8468,NAD27 to NAD83(HARN) (9),concatenated operation,4267,4152,NGS-Usa ID MT w,9,2383,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8612.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8469,NAD27 to NAD83(HARN) (10),concatenated operation,4267,4152,NGS-Usa KY,10,1386,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8602.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8470,NAD27 to NAD83(HARN) (11),concatenated operation,4267,4152,NGS-Usa LA,11,1387,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8603.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8471,NAD27 to NAD83(HARN) (12),concatenated operation,4267,4152,NGS-Usa DE MD,12,2377,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8605.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8472,NAD27 to NAD83(HARN) (13),concatenated operation,4267,4152,NGS-Usa ME,13,1388,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8604.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8473,NAD27 to NAD83(HARN) (14),concatenated operation,4267,4152,NGS-Usa MI,14,1391,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8607.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8474,NAD27 to NAD83(HARN) (15),concatenated operation,4267,4152,NGS-Usa MS,15,1393,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8609.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8475,NAD27 to NAD83(HARN) (16),concatenated operation,4267,4152,NGS-Usa NE,16,1396,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8613.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8476,NAD27 to NAD83(HARN) (17),concatenated operation,4267,4152,NGS-Usa NewEng,17,2378,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8606.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8477,NAD27 to NAD83(HARN) (18),concatenated operation,4267,4152,NGS-Usa NM,18,1400,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8616.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8478,NAD27 to NAD83(HARN) (19),concatenated operation,4267,4152,NGS-Usa NY,19,1401,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8617.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8479,NAD27 to NAD83(HARN) (20),concatenated operation,4267,4152,NGS-Usa ND,20,1403,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8618.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8480,NAD27 to NAD83(HARN) (21),concatenated operation,4267,4152,NGS-Usa OK,21,1405,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8620.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8481,Puerto Rico to NAD83(HARN) (1),concatenated operation,4139,4152,NGS-PRVI,1,1335,Accuracy 0.1m at 67% confidence level.,,,,May be taken as approximate transformation Puerto Rico to WGS 84 - see code 8583.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8482,NAD27 to NAD83(HARN) (22),concatenated operation,4267,4152,NGS-Usa SD,22,1410,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8622.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8483,NAD27 to NAD83(HARN) (23),concatenated operation,4267,4152,NGS-Usa TN,23,1411,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8623.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8484,NAD27 to NAD83(HARN) (24),concatenated operation,4267,4152,NGS-Usa TX e,24,2379,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8624.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8485,NAD27 to NAD83(HARN) (25),concatenated operation,4267,4152,NGS-Usa TX w,25,2380,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8625.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8486,NAD27 to NAD83(HARN) (26),concatenated operation,4267,4152,NGS-Usa VA,26,1415,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8627.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8487,NAD27 to NAD83(HARN) (27),concatenated operation,4267,4152,NGS-Usa OR WA,27,2381,"Accuracy at 67% confidence level is 0.2m onshore, 5m nearshore and undetermined farther offshore.",,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8621.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8488,NAD27 to NAD83(HARN) (28),concatenated operation,4267,4152,NGS-Usa WI,28,1418,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8629.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8489,NAD27 to NAD83(HARN) (29),concatenated operation,4267,4152,NGS-Usa WY,29,1419,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8630.,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,1999-10-20 00:00:00,,1,0
+8496,NAD27 to WGS 84 (28),concatenated operation,4267,4326,NGS-Usa conus,28,2374,Geodetic survey.,,,,,Both transformations from US National Geodetic Survey.,EPSG,1999-10-20 00:00:00,,1,0
+8497,NAD27 to WGS 84 (29),concatenated operation,4267,4326,NGS-Usa AK,29,2373,Geodetic survey.,,,,,Both transformations from US National Geodetic Survey.,EPSG,1999-10-20 00:00:00,,1,1
+8508,Old Hawaiian to NAD83(HARN) (1),concatenated operation,4135,4152,NGS-Usa HI,1,1334,Assumes NAD83 is coincident with NAD83(HARN). Accuracy about 1m.,,,,"Uses NADCON method which expects longitudes positive west; EPSG GeogCRSs Old Hawaiian (code 4135), NAD83 (code 4269) and NAD83(HARN) have longitudes positive east.  May be taken as approximate transformation Old Hawaiin to WGS 84 - see code 8582.",US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00 [...]
+8509,NAD27 to NAD83(HARN) (30),concatenated operation,4267,4152,NGS-Usa IN,30,1383,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8599.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8510,NAD27 to NAD83(HARN) (31),concatenated operation,4267,4152,NGS-Usa KS,31,1385,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8601.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8511,NAD27 to NAD83(HARN) (32),concatenated operation,4267,4152,NGS-Usa NV,32,1397,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8614.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8512,NAD27 to NAD83(HARN) (33),concatenated operation,4267,4152,NGS-Usa OH,33,1404,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8619.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8513,NAD27 to NAD83(HARN) (34),concatenated operation,4267,4152,NGS-Usa UT,34,1413,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8626.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8514,NAD27 to NAD83(HARN) (35),concatenated operation,4267,4152,NGS-Usa WV,35,1417,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8628.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8517,Chos Malal 1914 to WGS 84 (1),concatenated operation,4160,4326,TOT-Arg Neu,1,2325,Oil exploration,,,,May be implemented using a single step geocentric translations of dx=+5.5m dY=+176.7m dZ=+141.4m.,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+8530,South Yemen to WGS 84 (1),concatenated operation,4164,4326,IGN-Yem South,1,1340,Approximation at the +/- 1m level assuming that NGN96 is equivalent to WGS 84.,,,,May be implemented as a single transformation using geocentric translations transformation method with parameter values dX=-76m dY=-138m dZ=+67m.,IGN Paris,EPSG,2000-03-07 00:00:00,,1,1
+8532,Indian 1960 to WGS 84 (1),concatenated operation,4131,4326,PV-Vnm,1,1495,Oil exploration.,,,,May be implemented as a single transformation using position vector 7-parameter geocentric transformation method with parameter values dX=+199m dY=+931m dZ=+318.9m rX=rY=0 sec rZ=+0.814 sec dS=-0.38 ppm.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+8537,Egypt 1907 to WGS 84 (2),concatenated operation,4229,4326,MCE-Egy,2,1086,Oil exploration.,,,,Used by Shell.  May be implemented as a single transformation using position vector 7-parameter geocentric transformation method with parameter values dX=-121.8m dY=+98.1m dZ=-10.7m rX=rY=0 sec rZ=+0.554 sec dS=+0.2263 ppm.,Maridive,EPSG,2000-03-07 00:00:00,,1,0
+8553,NAD27 to NAD83(HARN) (36),concatenated operation,4267,4152,NGS-Usa IL,36,1382,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8598.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8554,NAD27 to NAD83(HARN) (37),concatenated operation,4267,4152,NGS-Usa NJ,37,1399,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8615.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2000-01-06 00:00:00,,1,0
+8560,AGD84 to WGS 84 (5),concatenated operation,4203,4326,EPSG-Aus WA,5,1280,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.  Superseded by AGD84 to WGS 84 (6) (code 8579).,EPSG,EPSG,2000-06-10 00:00:00,,1,1
+8562,Nord Sahara 1959 to WGS 84 (3),concatenated operation,4307,4326,CGG-Alg HM,3,2393,Oil exploration.,,,,Derived at IGN monument CFP19 using Transit.  Can be implemented as a single 7-param Position Vector transformation with parameter values of dX=-156m dY=-87.2m dZ=+287.8m; rX=rY=0 rZ=+0.814sec; dS=-0.38ppm.,,EPSG,2000-06-23 00:00:00,,1,0
+8563,NZGD49 to WGS 84 (3),concatenated operation,4272,4326,OSG-Nzl 1m,3,1175,Assumes WGS 84 is coincident with NZGD2000. Accuracy about 1m.,,,,Assumes WGS 84 is coincident with NZGD2000. Accuracy about 1m.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8564,NAD27(CGQ77) to WGS 84 (2),concatenated operation,4609,4326,EPSG-Can Qc NT2,2,1368,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8565,NAD27 to WGS 84 (31),concatenated operation,4267,4326,EPSG-Can Que,31,1368,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8566,NAD83 to WGS 84 (6),concatenated operation,4269,4326,EPSG-Can Qc,6,1368,Approximation at the +/- 1m level assuming that NAD83(CSRS98) is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8567,OSGB36 / National Grid to WGS 84 (1),concatenated operation,27700,4326,EPSG-Gbr,1,1264,Assumes ETRS89 is coincident with WGS 84.  Accuracy about 0.5m.,,,,Assumes ETRF89 is coincident with WGS 84.  Accuracy about 0.5m.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8568,Deir ez Zor to WGS 84 (1),concatenated operation,4227,4326,EPSG-Syr,1,2329,Oil exploration,,,,"Can be implemented as a position vector tfm with param. values dX=-174.6  dY=-3.1 dZ=238.1m; rX=rY=0 rZ=0.814""; dS=-0.38 ppm.",EPSG,EPSG,2000-10-19 00:00:00,,1,0
+8569,ED50 to WGS 84 (21),concatenated operation,4230,4326,EPSG-Nor N65 1997,21,2332,Oil exploration before 1997/2001.,,,,Included in Statens Kartverk programme wsktrans between 1997 (v3.1) and 2001 (v4.0). Superseded by ED50 to WGS 84 (23) (code 1612) in April 2001.,EPSG guidance note #10.,EPSG,2000-10-19 00:00:00,2001.224,1,0
+8570,ED50 to ETRS89 (2),concatenated operation,4230,4258,5Nat-NSea98,2,2330,Offshore.,,,,Taken from ED50 to WGS 84 (14) (code 8046). In 1998 agreed that within the accuracy of that transformation WGS 84 equates to ETRS89 and the transformation would relate ED50 to ETRS89.,Statens Kartverk.,EPSG,2001-06-05 00:00:00,2000.72  2001.06,1,0
+8571,Accra to WGS 84 (2),concatenated operation,4168,4326,EPSG-Gha,2,1505,Oil industry.,,,,"Can be implemented as a position vector tfm with param. values dX=-171.16 dY=17.29 dZ=325.21m; rX=rY=0 rZ=0.814""; dS=-0.38 ppm. Found in use within oil industry erroneously concatenated as dX=-171.16 dY=17.29 dZ=327.81m; rX=rY0 rZ=0.554"" dS=0.2263 ppm.",EPSG,EPSG,2000-10-19 00:00:00,,1,0
+8572,Amersfoort to WGS 84 (2),concatenated operation,4289,4326,EPSG-Nld,2,1275,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Parameter values for step 1 from Amersfoort to ETRS89 (2) (code 1751). Step 2 assumes that ETRS89 is equivalent to WGS 84 within the accuracy of the transformation. Supersedes Amersfoort to WGS 84 (1) (code 1112).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8573,RGF93 to WGS 84 (1),concatenated operation,4171,4326,EPSG-Fra,1,1096,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8574,American Samoa 1962 to WGS 84 (2),concatenated operation,4169,4326,EPSG-Asm,2,2288,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84.",,,,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARNS) can be considered to be coincident with WGS 84.",EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8575,American Samoa 1962 to WGS 84 (3),concatenated operation,4169,4326,EPSG-Asm,3,2289,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARN) can be considered to be coincident with WGS 84.",,,,"Transformation actually to NAD83(HARN), but for many purposes NAD83(HARNS) can be considered to be coincident with WGS 84.",EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8576,AGD66 to WGS 84 (9),concatenated operation,4202,4326,EPSG-Aus Tas 1m,9,1282,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.  Supersedes AGD66 to WGS 84 (4) (code 8398).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8577,AGD66 to WGS 84 (10),concatenated operation,4202,4326,EPSG-Aus NT,10,2284,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8578,AGD66 to WGS 84 (11),concatenated operation,4202,4326,EPSG-Aus,11,2287,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.   Supersedes AGD66 to WGS 84 (3) (code 8396) and AGD66 to WGS 84 (6) (code 8408).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8579,AGD84 to WGS 84 (6),concatenated operation,4203,4326,EPSG-Aus WA,6,1280,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that GDA94 is equivalent to WGS 84.  Supersedes AGD84 to WGS 84 (5) (code 8560).,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8580,IRENET95 to WGS 84 (1),concatenated operation,4173,4326,OSI-Ire,1,1305,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,,,,Approximation at the +/- 1m level assuming that ETRS89 is equivalent to WGS 84.,EPSG,EPSG,2000-10-19 00:00:00,,1,1
+8581,PSD93 to WGS 84 (2),concatenated operation,4134,4326,PDO-Omn 93,2,1183,Oil exploration.,,,,"Superseded by PSD93 to WGS 84 (1) (code 1439) in 1997. Can be implemented as a position vector tfm with parameter values dX= -182.046 dY= -225.604 dZ=+173.384m rX= -0.616 rY= -1.655 rZ=+8.378"" dS=16.8673ppm.",Petroleum Development Oman,EPSG,2001-06-05 00:00:00,,1,0
+8582,Old Hawaiian to WGS 84 (2),concatenated operation,4135,4326,EPSG-Usa Hi,2,1334,Approximation at the +/- 1m level.,,,,Transformation steps are from Old Hawaiian to NAD83(HARN) (1) (code 8508) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8583,Puerto Rico to WGS 84 (2),concatenated operation,4139,4326,EPSG-PRVI,2,1335,Approximation at the +/- 1m level.,,,,Transformation steps are from Puerto Rico to NAD83(HARN) (1) (code 8481) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2002-01-18 00:00:00,2002.02,1,0
+8584,NAD27 to NAD83(CSRS98) (3),concatenated operation,4267,4140,EPSG-Can AB,3,2376,Accuracy 1-2 metres.,,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 8585.,EPSG,EPSG,2001-08-15 00:00:00,,1,1
+8585,NAD27 to WGS 84 (36),concatenated operation,4267,4326,EPSG-Can AB,36,2376,Approximation at the +/- 1m level.,,,,Steps based on concatenated transformation NAD27 to NAD83(CSRS) (3) (code 8635) assuming that NAD83(CSRS) is equivalent to WGS 84.,EPSG,EPSG,2002-07-13 00:00:00,2002.41,1,0
+8586,NAD27 to NAD83(HARN) (38),concatenated operation,4267,4152,NGS-Usa AR,38,1374,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8592.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8587,NAD27 to NAD83(HARN) (39),concatenated operation,4267,4152,NGS-Usa IA,39,1384,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8600.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8588,NAD27 to NAD83(HARN) (40),concatenated operation,4267,4152,NGS-Usa MN,40,1392,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8608.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8589,NAD27 to NAD83(HARN) (41),concatenated operation,4267,4152,NGS-Usa MO,41,1394,Accuracy at 67% confidence level is 0.2m.,,,,May be taken as approximate transformation NAD27 to WGS 84 - see code 8610.,US Coast & Geodetic Survey  ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon,EPSG,2001-08-15 00:00:00,,1,0
+8590,NAD27 to WGS 84 (37),concatenated operation,4267,4152,EPSG-Usa AL,37,1372,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (1) (code 8460) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8591,NAD27 to WGS 84 (38),concatenated operation,4267,4326,EPSG-Usa AZ,38,1373,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (2) (code 8461) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8592,NAD27 to WGS 84 (39),concatenated operation,4267,4326,EPSG-Usa AR,39,1374,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (38) (code 8586) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8593,NAD27 to WGS 84 (40),concatenated operation,4267,4326,EPSG-Usa CA n,40,2297,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (3) (code 8462) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8594,NAD27 to WGS 84 (41),concatenated operation,4267,4326,EPSG-Usa CA s,41,2298,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (4) (code 8463) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8595,NAD27 to WGS 84 (42),concatenated operation,4267,4326,EPSG-Usa CO,42,1376,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (5) (code 8464) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8596,NAD27 to WGS 84 (43),concatenated operation,4267,4326,EPSG-Usa FL,43,1379,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (7) (code 8466) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8597,NAD27 to WGS 84 (44),concatenated operation,4267,4326,EPSG-Usa GA,44,1380,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (6) (code 8465) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8598,NAD27 to WGS 84 (45),concatenated operation,4267,4326,EPSG-Usa IL,45,1382,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (36) (code 8553) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8599,NAD27 to WGS 84 (46),concatenated operation,4267,4326,EPSG-Usa IN,46,1383,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (30) (code 8509) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8600,NAD27 to WGS 84 (47),concatenated operation,4267,4326,EPSG-Usa IA,47,1384,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (39) (code 8587) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8601,NAD27 to WGS 84 (48),concatenated operation,4267,4326,EPSG-Usa KS,48,1385,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (31) (code 8510) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8602,NAD27 to WGS 84 (49),concatenated operation,4267,4326,EPSG-Usa KY,49,1386,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (10) (code 8469) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8603,NAD27 to WGS 84 (50),concatenated operation,4267,4326,EPSG-Usa LA,50,1387,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (11) (code 8470) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8604,NAD27 to WGS 84 (51),concatenated operation,4267,4326,EPSG-Usa ME,51,1388,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (13) (code 8472) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8605,NAD27 to WGS 84 (52),concatenated operation,4267,4326,EPSG-Usa DE MD,52,2377,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (12) (code 8471) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8606,NAD27 to WGS 84 (53),concatenated operation,4267,4326,EPSG-Usa NewEng,53,2378,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (17) (code 8476) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8607,NAD27 to WGS 84 (54),concatenated operation,4267,4326,EPSG-Usa MI,54,1391,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (14) (code 8473) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8608,NAD27 to WGS 84 (55),concatenated operation,4267,4326,EPSG-Usa MN,55,1392,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (40) (code 8588) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8609,NAD27 to WGS 84 (56),concatenated operation,4267,4326,EPSG-Usa MS,56,1393,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (15) (code 8474) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8610,NAD27 to WGS 84 (57),concatenated operation,4267,4326,EPSG-Usa MO,57,1394,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (41) (code 8589) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8611,NAD27 to WGS 84 (58),concatenated operation,4267,4326,EPSG-Usa ID MT e,58,2382,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (8) (code 8467) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8612,NAD27 to WGS 84 (59),concatenated operation,4267,4326,EPSG-Usa ID MT w,59,2383,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (9) (code 8468) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8613,NAD27 to WGS 84 (60),concatenated operation,4267,4326,EPSG-Usa NE,60,1396,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (16) (code 8475) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8614,NAD27 to WGS 84 (61),concatenated operation,4267,4326,EPSG-Usa NV,61,1397,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (32) (code 8511) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8615,NAD27 to WGS 84 (62),concatenated operation,4267,4326,EPSG-Usa NJ,62,1399,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (37) (code 8554) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8616,NAD27 to WGS 84 (63),concatenated operation,4267,4326,EPSG-Usa NM,63,1400,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (18) (code 8477) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8617,NAD27 to WGS 84 (64),concatenated operation,4267,4326,EPSG-Usa NY,64,1401,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (19) (code 8478) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8618,NAD27 to WGS 84 (65),concatenated operation,4267,4326,EPSG-Usa ND,65,1403,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (20) (code 8479) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8619,NAD27 to WGS 84 (66),concatenated operation,4267,4326,EPSG-Usa OH,66,1404,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (33) (code 8512) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8620,NAD27 to WGS 84 (67),concatenated operation,4267,4326,EPSG-Usa OK,67,1405,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (21) (code 8480) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8621,NAD27 to WGS 84 (68),concatenated operation,4267,4326,EPSG-Usa OR WA,68,2381,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (27) (code 8487) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8622,NAD27 to WGS 84 (69),concatenated operation,4267,4326,EPSG-Usa SD,69,1410,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (22) (code 8482) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8623,NAD27 to WGS 84 (70),concatenated operation,4267,4326,EPSG-Usa TN,70,1411,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (23) (code 8483) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8624,NAD27 to WGS 84 (71),concatenated operation,4267,4326,EPSG-Usa TX e,71,2379,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (24) (code 8484) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8625,NAD27 to WGS 84 (72),concatenated operation,4267,4326,EPSG-Usa TX w,72,2380,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (25) (code 8485) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8626,NAD27 to WGS 84 (73),concatenated operation,4267,4326,EPSG-Usa UT,73,1413,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (34) (code 8513) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8627,NAD27 to WGS 84 (74),concatenated operation,4267,4326,EPSG-Usa VA,74,1415,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (26) (code 8486) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8628,NAD27 to WGS 84 (75),concatenated operation,4267,4326,EPSG-Usa WV,75,1417,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (35) (code 8514) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8629,NAD27 to WGS 84 (76),concatenated operation,4267,4326,EPSG-Usa WI,76,1418,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (28) (code 8488) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8630,NAD27 to WGS 84 (77),concatenated operation,4267,4326,EPSG-Usa WY,77,1419,Approximation at the +/- 1m level.,,,,Transformation steps are from NAD27 to NAD83(HARN) (29) (code 8489) assuming that NAD83(HARN) is equivalent to WGS 84 within the accuracy of the transformation.,EPSG,EPSG,2001-08-15 00:00:00,,1,0
+8631,Garoua to WGS 84 (1),concatenated operation,4197,4326,EPSG-Cmr,1,2590,Oil industry.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+8632,Kousseri to WGS 84 (1),concatenated operation,4198,4326,EPSG-Cmr,1,2591,Oil industry.,,,,,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+8633,Yoff to WGS 84 (1),concatenated operation,4310,4326,EPSG-SEN,1,1207,Military purposes.,,,,"Derived via WGS72. Can be used as a single positon vector transformation with parameter vaues of dX = -37 m, dY = +157 m, dZ = +89.5 m, rX = rY = 0 sec, RZ = 0.554 sec, dS = 0.219 ppm",TotalFinaElf,EPSG,2002-06-22 00:00:00,,1,0
+8634,Beduaram to WGS 84 (1),concatenated operation,4213,4326,ELF-Ner SE,1,2771,Oil exploration.,,,,"Derived via WGS72BE. Can be used as a single positon vector transformation with parameter vaues of dX = -101 m, dY = -111 m, dZ = +188.9 m, rX = rY = 0 sec, RZ = 0.814 sec, dS = -0.38 ppm",TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+8635,NAD27 to NAD83(CSRS) (3),concatenated operation,4267,4617,EPSG-Can AB,3,2376,Accuracy 1-2 metres.,,,,Can be taken as an approximate transformation NAD27 to WGS 84 - see code 8585.,EPSG,EPSG,2002-07-13 00:00:00,,1,0
+10101,Alabama CS27 East zone,conversion,,,,,2154,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+10102,Alabama CS27 West zone,conversion,,,,,2155,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+10131,SPCS83 Alabama East zone (meters),conversion,,,,,2154,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+10132,SPCS83 Alabama West zone (meters),conversion,,,,,2155,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+10201,Arizona Coordinate System East zone,conversion,,,,,2167,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+10202,Arizona Coordinate System Central zone,conversion,,,,,2166,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+10203,Arizona Coordinate System West zone,conversion,,,,,2168,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+10231,SPCS83 Arizona East zone (meters),conversion,,,,,2167,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines origin in International feet.  FE = 700000ft.  See code 15304 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.093  2001.03,1,0
+10232,SPCS83 Arizona Central zone (meters),conversion,,,,,2166,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines origin in International feet.  FE = 700000ft.  See code 15305 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+10233,SPCS83 Arizona West zone (meters),conversion,,,,,2168,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines origin in International feet.  FE = 700000ft.  See code 15306 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.093  2001.03,1,0
+10301,Arkansas CS27 North,conversion,,,,,2169,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10302,Arkansas CS27 South,conversion,,,,,2170,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10331,SPCS83 Arkansas North zone (meters),conversion,,,,,2169,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10332,SPCS83 Arkansas South zone (meters),conversion,,,,,2170,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10401,California CS27 zone I,conversion,,,,,2175,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10402,California CS27 zone II,conversion,,,,,2176,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10403,California CS27 zone III,conversion,,,,,2177,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10404,California CS27 zone IV,conversion,,,,,2178,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10405,California CS27 zone V,conversion,,,,,2179,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10406,California CS27 zone VI,conversion,,,,,2180,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10407,California CS27 zone VII,conversion,,,,,2181,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10431,SPCS83 California zone 1 (meters),conversion,,,,,2175,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15307 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10432,SPCS83 California zone 2 (meters),conversion,,,,,2176,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15308 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10433,SPCS83 California zone 3 (meters),conversion,,,,,2177,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15309 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10434,SPCS83 California zone 4 (meters),conversion,,,,,2178,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15310 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10435,SPCS83 California zone 5 (meters),conversion,,,,,2182,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15311 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10436,SPCS83 California zone 6 (meters),conversion,,,,,2180,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15312 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10501,Colorado CS27 North zone,conversion,,,,,2184,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10502,Colorado CS27 Central zone,conversion,,,,,2183,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10503,Colorado CS27 South zone,conversion,,,,,2185,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10531,SPCS83 Colorado North zone (meters),conversion,,,,,2184,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15313 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10532,SPCS83 Colorado Central zone (meters),conversion,,,,,2183,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15314 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10533,SPCS83 Colorado South zone (meters),conversion,,,,,2185,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15315 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+10600,Connecticut CS27,conversion,,,,,1377,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  99.28  2000.094,1,0
+10630,SPCS83 Connecticut zone (meters),conversion,,,,,1377,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15316 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+10700,Delaware CS27,conversion,,,,,1378,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+10730,SPCS83 Delaware zone (meters),conversion,,,,,1378,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15317 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.094  2001.03,1,0
+10901,Florida CS27 East zone,conversion,,,,,2186,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+10902,Florida CS27 West zone,conversion,,,,,2188,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+10903,Florida CS27 North zone,conversion,,,,,2187,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+10931,SPCS83 Florida East zone (meters),conversion,,,,,2186,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15318 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+10932,SPCS83 Florida West zone (meters),conversion,,,,,2188,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15319 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+10933,SPCS83 Florida North zone (meters),conversion,,,,,2187,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15320 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11001,Georgia CS27 East zone,conversion,,,,,2189,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11002,Georgia CS27 West zone,conversion,,,,,2190,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11031,SPCS83 Georgia East zone (meters),conversion,,,,,2189,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15321 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11032,SPCS83 Georgia West zone (meters),conversion,,,,,2190,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15322 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11101,Idaho CS27 East zone,conversion,,,,,2192,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11102,Idaho CS27 Central zone,conversion,,,,,2191,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11103,Idaho CS27 West zone,conversion,,,,,2193,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11131,SPCS83 Idaho East zone (meters),conversion,,,,,2192,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15323 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11132,SPCS83 Idaho Central zone (meters),conversion,,,,,2191,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15324 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11133,SPCS83 Idaho West zone (meters),conversion,,,,,2193,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15325 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11201,Illinois CS27 East zone,conversion,,,,,2194,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11202,Illinois CS27 West zone,conversion,,,,,2195,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11231,SPCS83 Illinois East zone (meters),conversion,,,,,2194,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11232,SPCS83 Illinois West zone (meters),conversion,,,,,2195,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11301,Indiana CS27 East zone,conversion,,,,,2196,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11302,Indiana CS27 West zone,conversion,,,,,2197,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11331,SPCS83 Indiana East zone (meters),conversion,,,,,2196,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15326 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11332,SPCS83 Indiana West zone (meters),conversion,,,,,2197,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15327 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11401,Iowa CS27 North zone,conversion,,,,,2198,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11402,Iowa CS27 South zone,conversion,,,,,2199,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11431,SPCS83 Iowa North zone (meters),conversion,,,,,2198,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11432,SPCS83 Iowa South zone (meters),conversion,,,,,2199,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11501,Kansas CS27 North zone,conversion,,,,,2200,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11502,Kansas CS27 South zone,conversion,,,,,2201,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11531,SPCS83 Kansas North zone (meters),conversion,,,,,2200,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11532,SPCS83 Kansas South zone (meters),conversion,,,,,2201,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11601,Kentucky CS27 North zone,conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11602,Kentucky CS27 South zone,conversion,,,,,2203,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11631,Kentucky CS83 North zone,conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28,1,1
+11632,SPCS83 Kentucky South zone (meters),conversion,,,,,2203,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15329 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11701,Louisiana CS27 North zone,conversion,,,,,2204,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11702,Louisiana CS27 South zone,conversion,,,,,2205,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+11731,SPCS83 Louisiana North zone (meters),conversion,,,,,2204,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11732,SPCS83 Louisiana South zone (meters),conversion,,,,,2529,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+11801,Maine CS27 East zone,conversion,,,,,2206,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11802,Maine CS27 West zone,conversion,,,,,2207,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+11831,SPCS83 Maine East zone (meters),conversion,,,,,2206,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11832,SPCS83 Maine West zone (meters),conversion,,,,,2207,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+11900,Maryland CS27,conversion,,,,,1389,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  99.28  2000.094,1,0
+11930,SPCS83 Maryland zone (meters),conversion,,,,,1389,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15330 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+12001,Massachusetts CS27 Mainland zone,conversion,,,,,2209,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12002,Massachusetts CS27 Island zone,conversion,,,,,2208,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12031,SPCS83 Massachusetts Mainland zone (meters),conversion,,,,,2209,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15331 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12032,SPCS83 Massachusetts Island zone (meters),conversion,,,,,2208,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15332 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12101,Michigan State Plane East zone,conversion,,,,,1720,Obsolete.,9807,,,Superseded by north central and south zones.,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  98.22  2000.092,1,0
+12102,Michigan State Plane Old Central zone,conversion,,,,,1721,Obsolete.,9807,,,Superseded by north central and south zones.,USGS Professional Paper #1395,EPSG,1998-11-11 00:00:00,95.30  96.29  98.22,1,0
+12103,Michigan State Plane West zone,conversion,,,,,1722,Obsolete.,9807,,,Superseded by north central and south zones.,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  98.22  2000.092,1,0
+12111,Michigan CS27 North zone,conversion,,,,,1723,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.28  96.29  98.22  99.28,1,0
+12112,Michigan CS27 Central zone,conversion,,,,,1724,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.28  96.29  98.22  99.28,1,0
+12113,Michigan CS27 South zone,conversion,,,,,1725,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.28  96.29  98.22  99.28,1,0
+12141,SPCS83 Michigan North zone (meters),conversion,,,,,1723,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15333 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12142,SPCS83 Michigan Central zone (meters),conversion,,,,,1724,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15334 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12143,SPCS83 Michigan South zone (meters),conversion,,,,,1725,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15335 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12201,Minnesota CS27 North zone,conversion,,,,,2214,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12202,Minnesota CS27 Central zone,conversion,,,,,2213,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12203,Minnesota CS27 South zone,conversion,,,,,2215,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12231,SPCS83 Minnesota North zone (meters),conversion,,,,,2214,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12232,SPCS83 Minnesota Central zone (meters),conversion,,,,,2213,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12233,SPCS83 Minnesota South zone (meters),conversion,,,,,2215,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+12301,Mississippi CS27 East zone,conversion,,,,,2216,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+12302,Mississippi CS27 West zone,conversion,,,,,2217,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+12331,SPCS83 Mississippi East zone (meters),conversion,,,,,2216,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15336 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12332,SPCS83 Mississippi West zone (meters),conversion,,,,,2217,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15337 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12401,Missouri CS27 East zone,conversion,,,,,2219,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.18  95.30  96.29  2000.092,1,0
+12402,Missouri CS27 Central zone,conversion,,,,,2218,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+12403,Missouri CS27 West zone,conversion,,,,,2220,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+12431,SPCS83 Missouri East zone (meters),conversion,,,,,2219,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12432,SPCS83 Missouri Central zone (meters),conversion,,,,,2218,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12433,SPCS83 Missouri West zone (meters),conversion,,,,,2220,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12501,Montana CS27 North zone,conversion,,,,,2211,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12502,Montana CS27 Central zone,conversion,,,,,2210,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12503,Montana CS27 South zone,conversion,,,,,2212,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12530,SPCS83 Montana zone (meters),conversion,,,,,1395,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15338 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+12601,Nebraska CS27 North zone,conversion,,,,,2221,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12602,Nebraska CS27 South zone,conversion,,,,,2222,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+12630,SPCS83 Nebraska zone (meters),conversion,,,,,1396,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+12701,Nevada CS27 East zone,conversion,,,,,2224,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+12702,Nevada CS27 Central zone,conversion,,,,,2223,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.093,1,0
+12703,Nevada CS27 West zone,conversion,,,,,2225,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+12731,SPCS83 Nevada East zone (meters),conversion,,,,,2224,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12732,SPCS83 Nevada Central zone (meters),conversion,,,,,2223,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12733,SPCS83 Nevada West zone (meters),conversion,,,,,2225,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+12800,New Hampshire CS27,conversion,,,,,1398,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+12830,SPCS83 New Hampshire zone (meters),conversion,,,,,1398,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.094  2001.03,1,0
+12900,New Jersey CS27,conversion,,,,,1399,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.094,1,0
+12930,SPCS83 New Jersey zone (meters),conversion,,,,,1399,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.094  2001.03,1,0
+13001,New Mexico CS27 East zone,conversion,,,,,2228,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+13002,New Mexico CS27 Central zone,conversion,,,,,2229,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+13003,New Mexico CS27 West zone,conversion,,,,,2230,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+13031,SPCS83 New Mexico East zone (meters),conversion,,,,,2228,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15339 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+13032,SPCS83 New Mexico Central zone (meters),conversion,,,,,2231,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15340 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+13033,SPCS83 New Mexico West zone (meters),conversion,,,,,2232,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15341 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+13101,New York CS27 East zone,conversion,,,,,2234,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.18  95.30  96.29  2000.092,1,0
+13102,New York CS27 Central zone,conversion,,,,,2233,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+13103,New York CS27 West zone,conversion,,,,,2236,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+13104,New York CS27 Long Island zone,conversion,,,,,2235,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13131,SPCS83 New York East zone (meters),conversion,,,,,2234,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15342 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+13132,SPCS83 New York Central zone (meters),conversion,,,,,2233,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15343 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+13133,SPCS83 New York West zone (meters),conversion,,,,,2236,Used for large and medium scale topographic mapping and engineering survey.,9807,,,See code 15344 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+13134,SPCS83 New York Long Island zone (meters),conversion,,,,,2235,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15345 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13200,North Carolina CS27,conversion,,,,,1402,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  99.28  2000.094,1,0
+13230,SPCS83 North Carolina zone (meters),conversion,,,,,1402,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15346 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+13301,North Dakota CS27 North zone,conversion,,,,,2237,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13302,North Dakota CS27 South zone,conversion,,,,,2238,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13331,SPCS83 North Dakota North zone (meters),conversion,,,,,2237,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15347 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13332,SPCS83 North Dakota South zone (meters),conversion,,,,,2238,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15348 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13401,Ohio CS27 North zone,conversion,,,,,2239,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13402,Ohio CS27 South zone,conversion,,,,,2240,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13431,SPCS83 Ohio North zone (meters),conversion,,,,,2239,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13432,SPCS83 Ohio South zone (meters),conversion,,,,,2240,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13501,Oklahoma CS27 North zone,conversion,,,,,2241,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13502,Oklahoma CS27 South zone,conversion,,,,,2242,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13531,SPCS83 Oklahoma North zone (meters),conversion,,,,,2241,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15349 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13532,SPCS83 Oklahoma South zone (meters),conversion,,,,,2242,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15350 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13601,Oregon CS27 North zone,conversion,,,,,2243,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13602,Oregon CS27 South zone,conversion,,,,,2244,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13631,SPCS83 Oregon North zone (meters),conversion,,,,,2243,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15351 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13632,SPCS83 Oregon South zone (meters),conversion,,,,,2244,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15352 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13701,Pennsylvania CS27 North zone,conversion,,,,,2245,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13702,Pennsylvania CS27 South zone,conversion,,,,,2246,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13731,SPCS83 Pennsylvania North zone (meters),conversion,,,,,2245,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15353 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13732,SPCS83 Pennsylvania South zone (meters),conversion,,,,,2246,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15354 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+13800,Rhode Island CS27,conversion,,,,,1408,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.094,1,0
+13830,SPCS83 Rhode Island zone (meters),conversion,,,,,1408,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.094  2001.03,1,0
+13901,South Carolina CS27 North zone,conversion,,,,,2247,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13902,South Carolina CS27 South zone,conversion,,,,,2248,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+13930,SPCS83 South Carolina zone (meters),conversion,,,,,1409,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15355 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+14001,South Dakota CS27 North zone,conversion,,,,,2249,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14002,South Dakota CS27 South zone,conversion,,,,,2250,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14031,SPCS83 South Dakota North zone (meters),conversion,,,,,2249,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14032,SPCS83 South Dakota South zone (meters),conversion,,,,,2250,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14100,Tennessee CS27,conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  99.28  2000.094,1,1
+14130,SPCS83 Tennessee zone (meters),conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15356 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2000.094  2001.03,1,0
+14201,Texas CS27 North zone,conversion,,,,,2253,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14202,Texas CS27 North Central zone,conversion,,,,,2254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14203,Texas CS27 Central zone,conversion,,,,,2252,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14204,Texas CS27 South Central zone,conversion,,,,,2256,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14205,Texas CS27 South zone,conversion,,,,,2255,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14231,SPCS83 Texas North zone (meters),conversion,,,,,2253,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15357 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14232,SPCS83 Texas North Central zone (meters),conversion,,,,,2254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15358 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14233,SPCS83 Texas Central zone (meters),conversion,,,,,2252,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15359 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14234,SPCS83 Texas South Central zone (meters),conversion,,,,,2527,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15360 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14235,SPCS83 Texas South zone (meters),conversion,,,,,2528,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15361 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14301,Utah CS27 North zone,conversion,,,,,2258,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14302,Utah CS27 Central zone,conversion,,,,,2257,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14303,Utah CS27 South zone,conversion,,,,,2259,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14331,SPCS83 Utah North zone (meters),conversion,,,,,2258,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15362 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14332,SPCS83 Utah Central zone (meters),conversion,,,,,2257,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15363 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14333,SPCS83 Utah South zone (meters),conversion,,,,,2259,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15364 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14400,Vermont CS27,conversion,,,,,1414,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.094,1,0
+14430,SPCS83 Vermont zone (meters),conversion,,,,,1414,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.094  2001.03,1,0
+14501,Virginia CS27 North zone,conversion,,,,,2260,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14502,Virginia CS27 South zone,conversion,,,,,2261,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14531,SPCS83 Virginia North zone (meters),conversion,,,,,2260,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15365 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14532,SPCS83 Virginia South zone (meters),conversion,,,,,2261,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15366 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14601,Washington CS27 North zone,conversion,,,,,2262,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14602,Washington CS27 South zone,conversion,,,,,2263,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14631,SPCS83 Washington North zone (meters),conversion,,,,,2273,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15367 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14632,SPCS83 Washington South zone (meters),conversion,,,,,2274,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15368 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14701,West Virginia CS27 North zone,conversion,,,,,2264,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14702,West Virginia CS27 South zone,conversion,,,,,2265,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14731,SPCS83 West Virginia North zone (meters),conversion,,,,,2264,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14732,SPCS83 West Virginia South zone (meters),conversion,,,,,2265,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14801,Wisconsin CS27 North zone,conversion,,,,,2267,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14802,Wisconsin CS27 Central zone,conversion,,,,,2266,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14803,Wisconsin CS27 South zone,conversion,,,,,2268,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+14831,SPCS83 Wisconsin North zone (meters),conversion,,,,,2267,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15369 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14832,SPCS83 Wisconsin Central zone (meters),conversion,,,,,2266,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15370 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14833,SPCS83 Wisconsin South zone (meters),conversion,,,,,2268,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15371 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+14901,Wyoming CS27 East zone,conversion,,,,,2269,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+14902,Wyoming CS27 East Central zone,conversion,,,,,2270,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+14903,Wyoming CS27 West Central zone,conversion,,,,,2272,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+14904,Wyoming CS27 West zone,conversion,,,,,2271,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  2000.092,1,0
+14931,SPCS83 Wyoming East zone (meters),conversion,,,,,2269,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.092  2001.03,1,0
+14932,SPCS83 Wyoming East Central zone (meters),conversion,,,,,2270,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.092  2001.03,1,0
+14933,SPCS83 Wyoming West Central zone (meters),conversion,,,,,2272,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.092  2001.03,1,0
+14934,SPCS83 Wyoming West zone (meters),conversion,,,,,2271,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2000.092  2001.03,1,0
+15001,Alaska CS27 zone 1,conversion,,,,,2156,Used for large and medium scale topographic mapping and engineering survey.,9812,,,"If using Oblique Mercator method (code 9815), Ec=2685642.82 ftUS, Nc=1887198.47 ftUS.",USGS Professional Paper #1395,EPSG,1997-04-11 00:00:00,96.29  97.08,1,0
+15002,Alaska CS27 zone 2,conversion,,,,,2158,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15003,Alaska CS27 zone 3,conversion,,,,,2159,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15004,Alaska CS27 zone 4,conversion,,,,,2160,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15005,Alaska CS27 zone 5,conversion,,,,,2161,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15006,Alaska CS27 zone 6,conversion,,,,,2162,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15007,Alaska CS27 zone 7,conversion,,,,,2163,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15008,Alaska CS27 zone 8,conversion,,,,,2164,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15009,Alaska CS27 zone 9,conversion,,,,,2165,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15010,Alaska CS27 zone 10,conversion,,,,,2157,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+15031,SPCS83 Alaska zone 1 (meters),conversion,,,,,2156,Used for large and medium scale topographic mapping and engineering survey.,9812,,,"If using Oblique Mercator method (code 9815), Ec=818585.57 m, Nc=575219.25 m.",NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,96.29  2001.03,1,0
+15032,SPCS83 Alaska zone 2 (meters),conversion,,,,,2158,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15033,SPCS83 Alaska zone 3 (meters),conversion,,,,,2159,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15034,SPCS83 Alaska zone 4 (meters),conversion,,,,,2160,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15035,SPCS83 Alaska zone 5 (meters),conversion,,,,,2161,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15036,SPCS83 Alaska zone 6 (meters),conversion,,,,,2162,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15037,SPCS83 Alaska zone 7 (meters),conversion,,,,,2163,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15038,SPCS83 Alaska zone 8 (meters),conversion,,,,,2164,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15039,SPCS83 Alaska zone 9 (meters),conversion,,,,,2165,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15040,SPCS83 Alaska zone 10 (meters),conversion,,,,,2157,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+15101,Hawaii CS27 zone 1,conversion,,,,,1546,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15102,Hawaii CS27 zone 2,conversion,,,,,1547,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15103,Hawaii CS27 zone 3,conversion,,,,,1548,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15104,Hawaii CS27 zone 4,conversion,,,,,1549,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15105,Hawaii CS27 zone 5,conversion,,,,,1550,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,USGS Professional Paper #1395,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+15131,SPCS83 Hawaii zone 1 (meters),conversion,,,,,1546,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15132,SPCS83 Hawaii zone 2 (meters),conversion,,,,,1547,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15133,SPCS83 Hawaii zone 3 (meters),conversion,,,,,1548,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15134,SPCS83 Hawaii zone 4 (meters),conversion,,,,,1549,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15135,SPCS83 Hawaii zone 5 (meters),conversion,,,,,1550,Used for large and medium scale topographic mapping and engineering survey.,9807,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  2001.03,1,0
+15201,Puerto Rico CS27,conversion,,,,,1194,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  99.28  2000.094,1,0
+15202,St. Croix CS27,conversion,,,,,1254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2000-03-07 00:00:00,95.30  96.29  99.28  2000.094,1,0
+15230,SPCS83 Puerto Rico & Virgin Islands zone (meters),conversion,,,,,2251,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,NOAA manual NOS NGS 5,EPSG,2001-11-06 00:00:00,95.30  96.29  99.28  2001.03,1,0
+15300,American Samoa Lambert,conversion,,,,,1027,Used for large and medium scale topographic mapping and engineering survey.,9801,,,Per Snyder: Map Projections - a Working Manual:  At origin x=500000 ft; y=o but radius to latitude of origin = -82000000 feet.  US National Geodetic Survey confirms use of zero for False Northing.,US National Geodetic Survey (NGS),EPSG,2000-10-19 00:00:00,,1,1
+15301,American Samoa Lambert,conversion,,,,,1027,Used for large and medium scale topographic mapping and engineering survey.,9801,,,Per Snyder: Map Projections - a Working Manual:  At origin x=500000 ft; y=o but radius to latitude of origin = -82000000 feet.  US National Geodetic Survey confirms use of zero for False Northing.,US National Geodetic Survey (NGS),EPSG,2001-08-28 00:00:00,,1,0
+15302,Tennessee CS27,conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,,USGS Professional Paper #1395,EPSG,2001-10-04 00:00:00,2001.45,1,0
+15303,SPCS83 Kentucky North zone (meters),conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,See code 15328 for equivalent non-metric definition.,NOAA manual NOS NGS 5,EPSG,2001-10-04 00:00:00,2001.03  2001.45,1,0
+15304,SPCS83 Arizona East zone (International feet),conversion,,,,,2167,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 10231.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15305,SPCS83 Arizona Central zone (International feet),conversion,,,,,2166,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 10232.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15306,SPCS83 Arizona West zone (International feet),conversion,,,,,2168,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 10233.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15307,SPCS83 California zone 1 (US Survey feet),conversion,,,,,2175,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10431.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15308,SPCS83 California zone 2 (US Survey feet),conversion,,,,,2176,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10432.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15309,SPCS83 California zone 3 (US Survey feet),conversion,,,,,2177,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10433.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15310,SPCS83 California zone 4 (US Survey feet),conversion,,,,,2178,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10434.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15311,SPCS83 California zone 5 (US Survey feet),conversion,,,,,2182,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10435.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15312,SPCS83 California zone 6 (US Survey feet),conversion,,,,,2180,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10436.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15313,SPCS83 Colorado North zone (US Survey feet),conversion,,,,,2184,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10531.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15314,SPCS83 Colorado Central zone (US Survey feet),conversion,,,,,2183,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10532.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15315,SPCS83 Colorado South zone (US Survey feet),conversion,,,,,2185,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10533.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15316,SPCS83 Connecticut zone (US Survey feet),conversion,,,,,1377,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10630.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15317,SPCS83 Delaware zone (US Survey feet),conversion,,,,,1378,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10730.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15318,SPCS83 Florida East zone (US Survey feet),conversion,,,,,2186,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10931.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15319,SPCS83 Florida West zone (US Survey feet),conversion,,,,,2188,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10932.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15320,SPCS83 Florida North zone (US Survey feet),conversion,,,,,2187,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10933.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15321,SPCS83 Georgia East zone (US Survey feet),conversion,,,,,2189,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11031.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15322,SPCS83 Georgia West zone (US Survey feet),conversion,,,,,2190,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 10031.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15323,SPCS83 Idaho East zone (US Survey feet),conversion,,,,,2192,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11131.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15324,SPCS83 Idaho Central zone (US Survey feet),conversion,,,,,2191,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11132.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15325,SPCS83 Idaho West zone (US Survey feet),conversion,,,,,2193,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11133.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15326,SPCS83 Indiana East zone (US Survey feet),conversion,,,,,2196,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11331.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15327,SPCS83 Indiana West zone (US Survey feet),conversion,,,,,2197,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11332.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15328,SPCS83 Kentucky North zone (US Survey feet),conversion,,,,,2202,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 15303.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15329,SPCS83 Kentucky South zone (US Survey feet),conversion,,,,,2203,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11632.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15330,SPCS83 Maryland zone (US Survey feet),conversion,,,,,1389,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 11930.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15331,SPCS83 Massachusetts Mainland zone (US Survey feet),conversion,,,,,2209,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12031.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15332,SPCS83 Massachusetts Island zone (US Survey feet),conversion,,,,,2208,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12032.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15333,SPCS83 Michigan North zone (International feet),conversion,,,,,1723,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12141.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15334,SPCS83 Michigan Central zone (International feet),conversion,,,,,1724,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12142.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15335,SPCS83 Michigan South zone (International feet),conversion,,,,,1725,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12143.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15336,SPCS83 Mississippi East zone (US Survey feet),conversion,,,,,2216,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12331.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15337,SPCS83 Mississippi West zone (US Survey feet),conversion,,,,,2217,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 12332.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15338,SPCS83 Montana zone (International feet),conversion,,,,,1395,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 12530.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15339,SPCS83 New Mexico East zone (US Survey feet),conversion,,,,,2228,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13031.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15340,SPCS83 New Mexico Central zone (US Survey feet),conversion,,,,,2231,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13032.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15341,SPCS83 New Mexico West zone (US Survey feet),conversion,,,,,2232,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13033.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15342,SPCS83 New York East zone (US Survey feet),conversion,,,,,2234,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13131.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15343,SPCS83 New York Central zone (US Survey feet),conversion,,,,,2233,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13132.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15344,SPCS83 New York West zone (US Survey feet),conversion,,,,,2236,Used for large and medium scale topographic mapping and engineering survey.,9807,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13133.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15345,SPCS83 New York Long Island zone (US Survey feet),conversion,,,,,2235,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13134.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15346,SPCS83 North Carolina zone (US Survey feet),conversion,,,,,1402,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13230.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15347,SPCS83 North Dakota North zone (International feet),conversion,,,,,2237,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13331.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15348,SPCS83 North Dakota South zone (International feet),conversion,,,,,2238,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13332.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15349,SPCS83 Oklahoma North zone (US Survey feet),conversion,,,,,2241,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13531.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15350,SPCS83 Oklahoma South zone (US Survey feet),conversion,,,,,2242,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13532.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15351,SPCS83 Oregon North zone (International feet),conversion,,,,,2243,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13631.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15352,SPCS83 Oregon South zone (International feet),conversion,,,,,2244,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13632.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15353,SPCS83 Pennsylvania North zone (US Survey feet),conversion,,,,,2245,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13731.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15354,SPCS83 Pennsylvania South zone (US Survey feet),conversion,,,,,2246,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 13732.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15355,SPCS83 South Carolina zone (International feet),conversion,,,,,1409,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 13930.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15356,SPCS83 Tennessee zone (US Survey feet),conversion,,,,,1411,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14130.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15357,SPCS83 Texas North zone (US Survey feet),conversion,,,,,2253,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14231.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15358,SPCS83 Texas North Central zone (US Survey feet),conversion,,,,,2254,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14232.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15359,SPCS83 Texas Central zone (US Survey feet),conversion,,,,,2252,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14233.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15360,SPCS83 Texas South Central zone (US Survey feet),conversion,,,,,2527,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14234.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15361,SPCS83 Texas South zone (US Survey feet),conversion,,,,,2528,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14235.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15362,SPCS83 Utah North zone (International feet),conversion,,,,,2258,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 14331.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15363,SPCS83 Utah Central zone (International feet),conversion,,,,,2257,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 14333.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15364,SPCS83 Utah South zone (International feet),conversion,,,,,2259,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as International feet (note: not US Survey feet). For equivalent metric Federal definition see code 14334.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15365,SPCS83 Virginia North zone (US Survey feet),conversion,,,,,2260,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14531.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15366,SPCS83 Virginia South zone (US Survey feet),conversion,,,,,2261,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14532.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15367,SPCS83 Washington North zone (US Survey feet),conversion,,,,,2273,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14631.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15368,SPCS83 Washington South zone (US Survey feet),conversion,,,,,2274,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14632.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15369,SPCS83 Wisconsin North zone (US Survey feet),conversion,,,,,2267,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14831.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15370,SPCS83 Wisconsin Central zone (US Survey feet),conversion,,,,,2266,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14832.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15371,SPCS83 Wisconsin South zone (US Survey feet),conversion,,,,,2268,Used for large and medium scale topographic mapping and engineering survey.,9802,,,State law defines grid unit as US Survey feet. For equivalent metric Federal definition see code 14833.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+15914,BLM zone 14N (US survey feet),conversion,,,,,2171,US survey foot form of UTM zone 14N,9807,,,"Sometimes locally referred to as ""UTM zone 14"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30  96.29  2002.12,1,0
+15915,BLM zone 15N (US survey feet),conversion,,,,,2172,US survey foot form of UTM zone 15N,9807,,,"Sometimes locally referred to as ""UTM zone 15"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30  96.29  2002.12,1,0
+15916,BLM zone 16N (US survey feet),conversion,,,,,2173,US survey foot form of UTM zone 16N,9807,,,"Sometimes locally referred to as ""UTM zone 16"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30  96.29  2002.12,1,0
+15917,BLM zone 17N (US survey feet),conversion,,,,,2174,US survey foot form of UTM zone 17N,9807,,,"Sometimes locally referred to as ""UTM zone 17"".",Minerals Management Service offshore protraction diagrams.,EPSG,2002-02-12 00:00:00,95.30  96.29  2002.12,1,0
+16000,UTM grid system (northern hemisphere),conversion,,,,,1998,For strict use within zone boundaries,9824,,,Use UTM zone xx N (codes 16001-16060) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+16001,UTM zone 1N,conversion,,,,,1873,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16002,UTM zone 2N,conversion,,,,,1875,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16003,UTM zone 3N,conversion,,,,,1877,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16004,UTM zone 4N,conversion,,,,,1879,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16005,UTM zone 5N,conversion,,,,,1881,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16006,UTM zone 6N,conversion,,,,,1883,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16007,UTM zone 7N,conversion,,,,,1885,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16008,UTM zone 8N,conversion,,,,,1887,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16009,UTM zone 9N,conversion,,,,,1889,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16010,UTM zone 10N,conversion,,,,,1891,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16011,UTM zone 11N,conversion,,,,,1893,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16012,UTM zone 12N,conversion,,,,,1895,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16013,UTM zone 13N,conversion,,,,,1897,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16014,UTM zone 14N,conversion,,,,,1899,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16015,UTM zone 15N,conversion,,,,,1901,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16016,UTM zone 16N,conversion,,,,,1903,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16017,UTM zone 17N,conversion,,,,,1905,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16018,UTM zone 18N,conversion,,,,,1907,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16019,UTM zone 19N,conversion,,,,,1909,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16020,UTM zone 20N,conversion,,,,,1911,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16021,UTM zone 21N,conversion,,,,,1913,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16022,UTM zone 22N,conversion,,,,,1915,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16023,UTM zone 23N,conversion,,,,,1917,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16024,UTM zone 24N,conversion,,,,,1919,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16025,UTM zone 25N,conversion,,,,,1921,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16026,UTM zone 26N,conversion,,,,,1923,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16027,UTM zone 27N,conversion,,,,,1925,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16028,UTM zone 28N,conversion,,,,,1927,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16029,UTM zone 29N,conversion,,,,,1929,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16030,UTM zone 30N,conversion,,,,,1931,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16031,UTM zone 31N,conversion,,,,,1933,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16032,UTM zone 32N,conversion,,,,,1935,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16033,UTM zone 33N,conversion,,,,,1937,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16034,UTM zone 34N,conversion,,,,,1939,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16035,UTM zone 35N,conversion,,,,,1941,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16036,UTM zone 36N,conversion,,,,,1943,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16037,UTM zone 37N,conversion,,,,,1945,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16038,UTM zone 38N,conversion,,,,,1947,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16039,UTM zone 39N,conversion,,,,,1949,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16040,UTM zone 40N,conversion,,,,,1951,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16041,UTM zone 41N,conversion,,,,,1953,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16042,UTM zone 42N,conversion,,,,,1955,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16043,UTM zone 43N,conversion,,,,,1957,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16044,UTM zone 44N,conversion,,,,,1959,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16045,UTM zone 45N,conversion,,,,,1961,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16046,UTM zone 46N,conversion,,,,,1963,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16047,UTM zone 47N,conversion,,,,,1965,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16048,UTM zone 48N,conversion,,,,,1967,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16049,UTM zone 49N,conversion,,,,,1969,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16050,UTM zone 50N,conversion,,,,,1971,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16051,UTM zone 51N,conversion,,,,,1973,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16052,UTM zone 52N,conversion,,,,,1975,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16053,UTM zone 53N,conversion,,,,,1977,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16054,UTM zone 54N,conversion,,,,,1979,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16055,UTM zone 55N,conversion,,,,,1981,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16056,UTM zone 56N,conversion,,,,,1983,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16057,UTM zone 57N,conversion,,,,,1985,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16058,UTM zone 58N,conversion,,,,,1987,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16059,UTM zone 59N,conversion,,,,,1989,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16060,UTM zone 60N,conversion,,,,,1991,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16061,Universal Polar Stereographic North,conversion,,,,,1996,Large and medium scale topographic mapping and engineering survey.,9810,,,,,EPSG,2000-03-07 00:00:00,97.18  2000.094,1,0
+16070,3-degree Gauss-Kruger zone 40,conversion,,,,,2628,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 120E (code 16170). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16071,3-degree Gauss-Kruger zone 41,conversion,,,,,2629,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 123E (code 16171). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16072,3-degree Gauss-Kruger zone 42,conversion,,,,,2630,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 126E (code 16172). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16073,3-degree Gauss-Kruger zone 43,conversion,,,,,2631,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 129E (code 16173). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16074,3-degree Gauss-Kruger zone 44,conversion,,,,,2632,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 132E (code 16174). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16075,3-degree Gauss-Kruger zone 45,conversion,,,,,2633,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 135E (code 16175). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16076,3-degree Gauss-Kruger zone 46,conversion,,,,,2634,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 138E (code 16176). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16077,3-degree Gauss-Kruger zone 47,conversion,,,,,2635,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 141E (code 16177). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16078,3-degree Gauss-Kruger zone 48,conversion,,,,,2636,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 144E (code 16178). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16079,3-degree Gauss-Kruger zone 49,conversion,,,,,2637,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 147E (code 16179). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16080,3-degree Gauss-Kruger zone 50,conversion,,,,,2638,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 150E (code 16180). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16081,3-degree Gauss-Kruger zone 51,conversion,,,,,2639,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 153E (code 16181). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16082,3-degree Gauss-Kruger zone 52,conversion,,,,,2640,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 156E (code 16182). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16083,3-degree Gauss-Kruger zone 53,conversion,,,,,2641,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 159E (code 16183). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16084,3-degree Gauss-Kruger zone 54,conversion,,,,,2642,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 162E (code 16184). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16085,3-degree Gauss-Kruger zone 55,conversion,,,,,2643,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 165E (code 16185). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16086,3-degree Gauss-Kruger zone 56,conversion,,,,,2644,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 168E (code 16186). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16087,3-degree Gauss-Kruger zone 57,conversion,,,,,2645,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 171E (code 16187). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16088,3-degree Gauss-Kruger zone 58,conversion,,,,,2646,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 174E (code 16188). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16089,3-degree Gauss-Kruger zone 59,conversion,,,,,2647,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 177E (code 16189). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16090,3-degree Gauss-Kruger zone 60,conversion,,,,,2648,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 180 (code 16190). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16091,3-degree Gauss-Kruger zone 61,conversion,,,,,2649,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 177W (code 16191). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16092,3-degree Gauss-Kruger zone 62,conversion,,,,,2650,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 174W (code 16192). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16093,3-degree Gauss-Kruger zone 63,conversion,,,,,2651,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 171W (code 16193). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16094,3-degree Gauss-Kruger zone 64,conversion,,,,,2652,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 168W (code 16194). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16100,UTM grid system (southern hemisphere),conversion,,,,,1999,For strict use within zone boundaries,9824,,,Use UTM zone xx S (codes 16101-16160) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+16101,UTM zone 1S,conversion,,,,,1874,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16102,UTM zone 2S,conversion,,,,,1876,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16103,UTM zone 3S,conversion,,,,,1878,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16104,UTM zone 4S,conversion,,,,,1880,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16105,UTM zone 5S,conversion,,,,,1882,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16106,UTM zone 6S,conversion,,,,,1884,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16107,UTM zone 7S,conversion,,,,,1886,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16108,UTM zone 8S,conversion,,,,,1888,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16109,UTM zone 9S,conversion,,,,,1890,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16110,UTM zone 10S,conversion,,,,,1892,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16111,UTM zone 11S,conversion,,,,,1894,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16112,UTM zone 12S,conversion,,,,,1896,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16113,UTM zone 13S,conversion,,,,,1898,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16114,UTM zone 14S,conversion,,,,,1900,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16115,UTM zone 15S,conversion,,,,,1902,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16116,UTM zone 16S,conversion,,,,,1904,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16117,UTM zone 17S,conversion,,,,,1906,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16118,UTM zone 18S,conversion,,,,,1908,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16119,UTM zone 19S,conversion,,,,,1910,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16120,UTM zone 20S,conversion,,,,,1912,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16121,UTM zone 21S,conversion,,,,,1914,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16122,UTM zone 22S,conversion,,,,,1916,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16123,UTM zone 23S,conversion,,,,,1918,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16124,UTM zone 24S,conversion,,,,,1920,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16125,UTM zone 25S,conversion,,,,,1922,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16126,UTM zone 26S,conversion,,,,,1924,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16127,UTM zone 27S,conversion,,,,,1926,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16128,UTM zone 28S,conversion,,,,,1928,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16129,UTM zone 29S,conversion,,,,,1930,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16130,UTM zone 30S,conversion,,,,,1932,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16131,UTM zone 31S,conversion,,,,,1934,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16132,UTM zone 32S,conversion,,,,,1936,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16133,UTM zone 33S,conversion,,,,,1938,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16134,UTM zone 34S,conversion,,,,,1940,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16135,UTM zone 35S,conversion,,,,,1942,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16136,UTM zone 36S,conversion,,,,,1944,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16137,UTM zone 37S,conversion,,,,,1946,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16138,UTM zone 38S,conversion,,,,,1948,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16139,UTM zone 39S,conversion,,,,,1950,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16140,UTM zone 40S,conversion,,,,,1952,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16141,UTM zone 41S,conversion,,,,,1954,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16142,UTM zone 42S,conversion,,,,,1956,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16143,UTM zone 43S,conversion,,,,,1958,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16144,UTM zone 44S,conversion,,,,,1960,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16145,UTM zone 45S,conversion,,,,,1962,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16146,UTM zone 46S,conversion,,,,,1964,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16147,UTM zone 47S,conversion,,,,,1966,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16148,UTM zone 48S,conversion,,,,,1968,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16149,UTM zone 49S,conversion,,,,,1970,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16150,UTM zone 50S,conversion,,,,,1972,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16151,UTM zone 51S,conversion,,,,,1974,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16152,UTM zone 52S,conversion,,,,,1976,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16153,UTM zone 53S,conversion,,,,,1978,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16154,UTM zone 54S,conversion,,,,,1980,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16155,UTM zone 55S,conversion,,,,,1982,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16156,UTM zone 56S,conversion,,,,,1984,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16157,UTM zone 57S,conversion,,,,,1986,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16158,UTM zone 58S,conversion,,,,,1988,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16159,UTM zone 59S,conversion,,,,,1990,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16160,UTM zone 60S,conversion,,,,,1992,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.28,1,0
+16161,Universal Polar Stereographic South,conversion,,,,,1997,Large and medium scale topographic mapping and engineering survey.,9810,,,,,EPSG,2000-03-07 00:00:00,97.18  2000.094,1,0
+16170,3-degree Gauss-Kruger CM 120E,conversion,,,,,2628,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 40N (code 16070) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16171,3-degree Gauss-Kruger CM 123E,conversion,,,,,2629,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 41N (code 16071) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16172,3-degree Gauss-Kruger CM 126E,conversion,,,,,2630,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 42N (code 16072) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16173,3-degree Gauss-Kruger CM 129E,conversion,,,,,2631,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 43N (code 16073) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16174,3-degree Gauss-Kruger CM 132E,conversion,,,,,2632,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 44N (code 16074) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16175,3-degree Gauss-Kruger CM 135E,conversion,,,,,2633,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 45N (code 16075) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16176,3-degree Gauss-Kruger CM 138E,conversion,,,,,2634,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 46N (code 16076) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16177,3-degree Gauss-Kruger CM 141E,conversion,,,,,2635,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 47N (code 16077) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16178,3-degree Gauss-Kruger CM 144E,conversion,,,,,2636,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 48N (code 16078) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16179,3-degree Gauss-Kruger CM 147E,conversion,,,,,2637,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 49N (code 16079) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16180,3-degree Gauss-Kruger CM 150E,conversion,,,,,2638,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 50N (code 16080) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16181,3-degree Gauss-Kruger CM 153E,conversion,,,,,2639,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 51N (code 16081) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16182,3-degree Gauss-Kruger CM 156E,conversion,,,,,2640,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 52N (code 16082) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16183,3-degree Gauss-Kruger CM 159E,conversion,,,,,2641,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 53N (code 16083) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16184,3-degree Gauss-Kruger CM 162E,conversion,,,,,2642,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 54N (code 16084) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16185,3-degree Gauss-Kruger CM 165E,conversion,,,,,2643,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 55N (code 16085) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16186,3-degree Gauss-Kruger CM 168E,conversion,,,,,2644,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 56N (code 16086) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16187,3-degree Gauss-Kruger CM 171E,conversion,,,,,2645,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 57N (code 16087) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16188,3-degree Gauss-Kruger CM 174E,conversion,,,,,2646,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 58N (code 16088) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16189,3-degree Gauss-Kruger CM 177E,conversion,,,,,2647,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 59N (code 16089) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16190,3-degree Gauss-Kruger CM 180,conversion,,,,,2648,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 60N (code 16090) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16191,3-degree Gauss-Kruger CM 177W,conversion,,,,,2649,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 61N (code 16091) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16192,3-degree Gauss-Kruger CM 174W,conversion,,,,,2650,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 62N (code 16092) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16193,3-degree Gauss-Kruger CM 171W,conversion,,,,,2651,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 63N (code 16093) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16194,3-degree Gauss-Kruger CM 168W,conversion,,,,,2652,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 64N (code 16094) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16201,6-degree Gauss-Kruger zone 1,conversion,,,,,1933,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 3E (code 16301). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16202,6-degree Gauss-Kruger zone 2,conversion,,,,,2741,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 9E (code 16302). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16203,6-degree Gauss-Kruger zone 3,conversion,,,,,2742,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 15E (code 16303). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16204,6-degree Gauss-Kruger zone 4,conversion,,,,,2743,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 21E (code 16304). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16205,6-degree Gauss-Kruger zone 5,conversion,,,,,2744,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 27E (code 16305). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16206,6-degree Gauss-Kruger zone 6,conversion,,,,,2745,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 33E (code 16306). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16207,6-degree Gauss-Kruger zone 7,conversion,,,,,2746,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 39E (code 16307). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16208,6-degree Gauss-Kruger zone 8,conversion,,,,,1947,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 45E (code 16308). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16209,6-degree Gauss-Kruger zone 9,conversion,,,,,1949,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 51E (code 16309). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16210,6-degree Gauss-Kruger zone 10,conversion,,,,,1951,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 57E (code 16310). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16211,6-degree Gauss-Kruger zone 11,conversion,,,,,1953,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 63E (code 16311). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16212,6-degree Gauss-Kruger zone 12,conversion,,,,,1955,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 69E (code 16312). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16213,6-degree Gauss-Kruger zone 13,conversion,,,,,1957,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 75E (code 16313). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16214,6-degree Gauss-Kruger zone 14,conversion,,,,,1959,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 81E (code 16314). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16215,6-degree Gauss-Kruger zone 15,conversion,,,,,1961,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 87E (code 16315). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16216,6-degree Gauss-Kruger zone 16,conversion,,,,,1963,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 93E (code 16316). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16217,6-degree Gauss-Kruger zone 17,conversion,,,,,1965,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 99E (code 16317). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16218,6-degree Gauss-Kruger zone 18,conversion,,,,,1967,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 105E (code 16318). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16219,6-degree Gauss-Kruger zone 19,conversion,,,,,1969,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 111E (code 16319). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16220,6-degree Gauss-Kruger zone 20,conversion,,,,,1971,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 117E (code 16320). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16221,6-degree Gauss-Kruger zone 21,conversion,,,,,1973,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 123E (code 16321). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16222,6-degree Gauss-Kruger zone 22,conversion,,,,,1975,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 129E (code 16322). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16223,6-degree Gauss-Kruger zone 23,conversion,,,,,1977,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 135E (code 16323). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16224,6-degree Gauss-Kruger zone 24,conversion,,,,,1979,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 141E (code 16324). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16225,6-degree Gauss-Kruger zone 25,conversion,,,,,1981,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 147E (code 16325). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16226,6-degree Gauss-Kruger zone 26,conversion,,,,,1983,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 153E (code 16326). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16227,6-degree Gauss-Kruger zone 27,conversion,,,,,1985,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 159E (code 16327). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16228,6-degree Gauss-Kruger zone 28,conversion,,,,,1987,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 165E (code 16328). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16229,6-degree Gauss-Kruger zone 29,conversion,,,,,1989,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 171E (code 16329). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16230,6-degree Gauss-Kruger zone 30,conversion,,,,,1991,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 177E (code 16330). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16231,6-degree Gauss-Kruger zone 31,conversion,,,,,1873,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 177W (code 16331). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16232,6-degree Gauss-Kruger zone 32,conversion,,,,,1875,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 171W (code 16332). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16233,6-degree Gauss-Kruger zone 33,conversion,,,,,1877,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 165W (code 16333). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16234,6-degree Gauss-Kruger zone 34,conversion,,,,,1879,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 159W (code 16334). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16235,6-degree Gauss-Kruger zone 35,conversion,,,,,1881,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 153W (code 16335). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16236,6-degree Gauss-Kruger zone 36,conversion,,,,,1883,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 147W (code 16336). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16237,6-degree Gauss-Kruger zone 37,conversion,,,,,1885,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 141W (code 16337). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16238,6-degree Gauss-Kruger zone 38,conversion,,,,,1887,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 135W (code 16338). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16239,6-degree Gauss-Kruger zone 39,conversion,,,,,1889,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 129W (code 16339). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16240,6-degree Gauss-Kruger zone 40,conversion,,,,,1891,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 123W (code 16340). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16241,6-degree Gauss-Kruger zone 41,conversion,,,,,1893,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 117W (code 16341). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16242,6-degree Gauss-Kruger zone 42,conversion,,,,,1895,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 111W (code 16342). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16243,6-degree Gauss-Kruger zone 43,conversion,,,,,1897,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 105W (code 16343). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16244,6-degree Gauss-Kruger zone 44,conversion,,,,,1899,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 99W (code 16344). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16245,6-degree Gauss-Kruger zone 45,conversion,,,,,1901,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 93W (code 16345). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16246,6-degree Gauss-Kruger zone 46,conversion,,,,,1903,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 87W (code 16346). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16247,6-degree Gauss-Kruger zone 47,conversion,,,,,2732,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 81W (code 16347). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16248,6-degree Gauss-Kruger zone 48,conversion,,,,,2733,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 75W (code 16348). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16249,6-degree Gauss-Kruger zone 49,conversion,,,,,2734,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 69W (code 16349). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16250,6-degree Gauss-Kruger zone 50,conversion,,,,,2735,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 63W (code 16350). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16251,6-degree Gauss-Kruger zone 51,conversion,,,,,2736,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 57W (code 16351). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16252,6-degree Gauss-Kruger zone 52,conversion,,,,,2737,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 51W (code 16352). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16253,6-degree Gauss-Kruger zone 53,conversion,,,,,2738,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 45W (code 16353). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16254,6-degree Gauss-Kruger zone 54,conversion,,,,,2739,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 39W (code 16354). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16255,6-degree Gauss-Kruger zone 55,conversion,,,,,1921,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 33W (code 16355). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16256,6-degree Gauss-Kruger zone 56,conversion,,,,,1923,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 27W (code 16356). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16257,6-degree Gauss-Kruger zone 57,conversion,,,,,1925,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 21W (code 16357). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16258,6-degree Gauss-Kruger zone 58,conversion,,,,,1927,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 15W (code 16358). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16259,6-degree Gauss-Kruger zone 59,conversion,,,,,1929,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 9W (code 16359). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16260,6-degree Gauss-Kruger zone 60,conversion,,,,,1931,Medium scale topographic mapping.,9807,,,Also found with zone truncated from false easting: see 6-degree Gauss-Kruger cm 3W (code 16360). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16261,3-degree Gauss-Kruger zone 1,conversion,,,,,2299,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 3E (code 16361). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16262,3-degree Gauss-Kruger zone 2,conversion,,,,,2300,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 6E (code 16362). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16263,3-degree Gauss-Kruger zone 3,conversion,,,,,2301,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 9E (code 16363). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16264,3-degree Gauss-Kruger zone 4,conversion,,,,,2302,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 12E (code 16364). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16265,3-degree Gauss-Kruger zone 5,conversion,,,,,2303,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 15E (code 16365). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16266,3-degree Gauss-Kruger zone 6,conversion,,,,,2304,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 18E (code 16366). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16267,3-degree Gauss-Kruger zone 7,conversion,,,,,2305,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 21E (code 16367). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16268,3-degree Gauss-Kruger zone 8,conversion,,,,,2306,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 24E (code 16368). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16269,3-degree Gauss-Kruger zone 9,conversion,,,,,2534,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 27E (code 16369). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16270,3-degree Gauss-Kruger zone 10,conversion,,,,,2535,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 30E (code 16370). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16271,3-degree Gauss-Kruger zone 11,conversion,,,,,2536,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 33E (code 16371). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16272,3-degree Gauss-Kruger zone 12,conversion,,,,,2537,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 36E (code 16372). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16273,3-degree Gauss-Kruger zone 13,conversion,,,,,2538,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 39E (code 16373). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16274,3-degree Gauss-Kruger zone 14,conversion,,,,,2539,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 42E (code 16374). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16275,3-degree Gauss-Kruger zone 15,conversion,,,,,2540,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 45E (code 16375). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16276,3-degree Gauss-Kruger zone 16,conversion,,,,,2604,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 48E (code 16376). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16277,3-degree Gauss-Kruger zone 17,conversion,,,,,2605,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 51E (code 16377). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16278,3-degree Gauss-Kruger zone 18,conversion,,,,,2606,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 54E (code 16378). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16279,3-degree Gauss-Kruger zone 19,conversion,,,,,2607,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 57E (code 16379). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16280,3-degree Gauss-Kruger zone 20,conversion,,,,,2608,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 60E (code 16380). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16281,3-degree Gauss-Kruger zone 21,conversion,,,,,2609,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 63E (code 16381). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16282,3-degree Gauss-Kruger zone 22,conversion,,,,,2610,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 66E (code 16382). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16283,3-degree Gauss-Kruger zone 23,conversion,,,,,2611,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 69E (code 16383). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16284,3-degree Gauss-Kruger zone 24,conversion,,,,,2612,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 72E (code 16384). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16285,3-degree Gauss-Kruger zone 25,conversion,,,,,2613,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 75E (code 16385). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16286,3-degree Gauss-Kruger zone 26,conversion,,,,,2614,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 78E (code 16386). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16287,3-degree Gauss-Kruger zone 27,conversion,,,,,2615,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 81E (code 16387). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16288,3-degree Gauss-Kruger zone 28,conversion,,,,,2616,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 84E (code 16388). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16289,3-degree Gauss-Kruger zone 29,conversion,,,,,2617,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 87E (code 16389). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16290,3-degree Gauss-Kruger zone 30,conversion,,,,,2618,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 90E (code 16390). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16291,3-degree Gauss-Kruger zone 31,conversion,,,,,2619,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 93E (code 16391). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16292,3-degree Gauss-Kruger zone 32,conversion,,,,,2620,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 96E (code 16392). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16293,3-degree Gauss-Kruger zone 33,conversion,,,,,2621,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 99E (code 16393). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16294,3-degree Gauss-Kruger zone 34,conversion,,,,,2622,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 102E (code 16394). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16295,3-degree Gauss-Kruger zone 35,conversion,,,,,2623,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 105E (code 16395). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16296,3-degree Gauss-Kruger zone 36,conversion,,,,,2624,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 108E (code 16396). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16297,3-degree Gauss-Kruger zone 37,conversion,,,,,2625,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 111E (code 16397). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16298,3-degree Gauss-Kruger zone 38,conversion,,,,,2626,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 114E (code 16398). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16299,3-degree Gauss-Kruger zone 39,conversion,,,,,2627,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,Also found with zone truncated from false easting: see 3-degree Gauss-Kruger cm 117E (code 16399). Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16301,6-degree Gauss-Kruger CM 3E,conversion,,,,,1933,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 1N (code 16201) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16302,6-degree Gauss-Kruger CM 9E,conversion,,,,,1935,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 2N (code 16202) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16303,6-degree Gauss-Kruger CM 15E,conversion,,,,,1937,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 3N (code 16203) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16304,6-degree Gauss-Kruger CM 21E,conversion,,,,,1939,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 4N (code 16204) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16305,6-degree Gauss-Kruger CM 27E,conversion,,,,,1941,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 5N (code 16205) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16306,6-degree Gauss-Kruger CM 33E,conversion,,,,,1943,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 6N (code 16206) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16307,6-degree Gauss-Kruger CM 39E,conversion,,,,,1945,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 7N (code 16207) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16308,6-degree Gauss-Kruger CM 45E,conversion,,,,,1947,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 8N (code 16208) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16309,6-degree Gauss-Kruger CM 51E,conversion,,,,,1949,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 9N (code 16209) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16310,6-degree Gauss-Kruger CM 57E,conversion,,,,,1951,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 10N (code 16210) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16311,6-degree Gauss-Kruger CM 63E,conversion,,,,,1953,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 11N (code 16211) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16312,6-degree Gauss-Kruger CM 69E,conversion,,,,,1955,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 12N (code 16212) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16313,6-degree Gauss-Kruger CM 75E,conversion,,,,,1957,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 13N (code 16213) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16314,6-degree Gauss-Kruger CM 81E,conversion,,,,,1959,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 14N (code 16214) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16315,6-degree Gauss-Kruger CM 87E,conversion,,,,,1961,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 15N (code 16215) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16316,6-degree Gauss-Kruger CM 93E,conversion,,,,,1963,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 16N (code 16216) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16317,6-degree Gauss-Kruger CM 99E,conversion,,,,,1965,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 17N (code 16217) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16318,6-degree Gauss-Kruger CM 105E,conversion,,,,,1967,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 18N (code 16218) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16319,6-degree Gauss-Kruger CM 111E,conversion,,,,,1969,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 19N (code 16219) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16320,6-degree Gauss-Kruger CM 117E,conversion,,,,,1971,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 20N (code 16220) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16321,6-degree Gauss-Kruger CM 123E,conversion,,,,,1973,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 21N (code 16221) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16322,6-degree Gauss-Kruger CM 129E,conversion,,,,,1975,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 22N (code 16222) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16323,6-degree Gauss-Kruger CM 135E,conversion,,,,,1977,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 23N (code 16223) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16324,6-degree Gauss-Kruger CM 141E,conversion,,,,,1979,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 24N (code 16224) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16325,6-degree Gauss-Kruger CM 147E,conversion,,,,,1981,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 25N (code 16225) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16326,6-degree Gauss-Kruger CM 153E,conversion,,,,,1983,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 26N (code 16226) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16327,6-degree Gauss-Kruger CM 159E,conversion,,,,,1985,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 27N (code 16227) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16328,6-degree Gauss-Kruger CM 165E,conversion,,,,,1987,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 28N (code 16228) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16329,6-degree Gauss-Kruger CM 171E,conversion,,,,,1989,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 29N (code 16229) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16330,6-degree Gauss-Kruger CM 177E,conversion,,,,,1991,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 30N (code 16230) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16331,6-degree Gauss-Kruger CM 177W,conversion,,,,,1873,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 31N (code 16231) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16332,6-degree Gauss-Kruger CM 171W,conversion,,,,,1875,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 32N (code 16232) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,95.28 2002.36,1,0
+16333,6-degree Gauss-Kruger CM 165W,conversion,,,,,1877,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 33N (code 16233) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16334,6-degree Gauss-Kruger CM 159W,conversion,,,,,1879,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 34N (code 16234) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16335,6-degree Gauss-Kruger CM 153W,conversion,,,,,1881,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 35N (code 16235) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16336,6-degree Gauss-Kruger CM 147W,conversion,,,,,1883,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 36N (code 16236) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16337,6-degree Gauss-Kruger CM 141W,conversion,,,,,1885,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 37N (code 16237) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16338,6-degree Gauss-Kruger CM 135W,conversion,,,,,1887,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 38N (code 16238) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16339,6-degree Gauss-Kruger CM 129W,conversion,,,,,1889,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 39N (code 16239) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16340,6-degree Gauss-Kruger CM 123W,conversion,,,,,1891,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 40N (code 16240) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16341,6-degree Gauss-Kruger CM 117W,conversion,,,,,1893,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 41N (code 16241) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16342,6-degree Gauss-Kruger CM 111W,conversion,,,,,1895,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 42N (code 16242) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16343,6-degree Gauss-Kruger CM 105W,conversion,,,,,1897,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 43N (code 16243) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16344,6-degree Gauss-Kruger CM 99W,conversion,,,,,1899,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 44N (code 16244) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16345,6-degree Gauss-Kruger CM 93W,conversion,,,,,1901,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 45N (code 16245) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16346,6-degree Gauss-Kruger CM 87W,conversion,,,,,1903,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 46N (code 16246) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16347,6-degree Gauss-Kruger CM 81W,conversion,,,,,1905,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 47N (code 16247) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16348,6-degree Gauss-Kruger CM 75W,conversion,,,,,1907,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 48N (code 16248) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16349,6-degree Gauss-Kruger CM 69W,conversion,,,,,1909,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 49N (code 16249) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16350,6-degree Gauss-Kruger CM 63W,conversion,,,,,1911,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 50N (code 16250) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16351,6-degree Gauss-Kruger CM 57W,conversion,,,,,1913,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 51N (code 16251) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16352,6-degree Gauss-Kruger CM 51W,conversion,,,,,1915,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 52N (code 16252) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16353,6-degree Gauss-Kruger CM 45W,conversion,,,,,1917,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 53N (code 16253) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16354,6-degree Gauss-Kruger CM 39W,conversion,,,,,1919,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 54N (code 16254) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16355,6-degree Gauss-Kruger CM 33W,conversion,,,,,1921,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 55N (code 16255) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16356,6-degree Gauss-Kruger CM 27W,conversion,,,,,1923,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 56N (code 16256) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16357,6-degree Gauss-Kruger CM 21W,conversion,,,,,1925,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 57N (code 16257) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16358,6-degree Gauss-Kruger CM 15W,conversion,,,,,1927,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 58N (code 16258) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16359,6-degree Gauss-Kruger CM 9W,conversion,,,,,1929,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 59N (code 16259) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16360,6-degree Gauss-Kruger CM 3W,conversion,,,,,1931,Medium scale topographic mapping.,9807,,,6-degree Gauss-Kruger zone 60N (code 16260) without zone prefix to FE. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16361,3-degree Gauss-Kruger CM 3E,conversion,,,,,2299,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 1N (code 16261) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16362,3-degree Gauss-Kruger CM 6E,conversion,,,,,2300,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 2N (code 16262) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16363,3-degree Gauss-Kruger CM 9E,conversion,,,,,2301,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 3N (code 16263) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16364,3-degree Gauss-Kruger CM 12E,conversion,,,,,2302,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 4N (code 16264) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16365,3-degree Gauss-Kruger CM 15E,conversion,,,,,2303,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 5N (code 16265) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16366,3-degree Gauss-Kruger CM 18E,conversion,,,,,2304,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 6N (code 16266) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16367,3-degree Gauss-Kruger CM 21E,conversion,,,,,2305,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 7N (code 16267) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16368,3-degree Gauss-Kruger CM 24E,conversion,,,,,2306,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 8N (code 16268) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+16369,3-degree Gauss-Kruger CM 27E,conversion,,,,,2534,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 9N (code 16269) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16370,3-degree Gauss-Kruger CM 30E,conversion,,,,,2535,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 10N (code 16270) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16371,3-degree Gauss-Kruger CM 33E,conversion,,,,,2536,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 11N (code 16271) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16372,3-degree Gauss-Kruger CM 36E,conversion,,,,,2537,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 12N (code 16272) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16373,3-degree Gauss-Kruger CM 39E,conversion,,,,,2538,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 13N (code 16273) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16374,3-degree Gauss-Kruger CM 42E,conversion,,,,,2539,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 14N (code 16274) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16375,3-degree Gauss-Kruger CM 45E,conversion,,,,,2540,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 15N (code 16275) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16376,3-degree Gauss-Kruger CM 48E,conversion,,,,,2604,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 16N (code 16276) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16377,3-degree Gauss-Kruger CM 51E,conversion,,,,,2605,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 17N (code 16277) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16378,3-degree Gauss-Kruger CM 54E,conversion,,,,,2606,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 18N (code 16278) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16379,3-degree Gauss-Kruger CM 57E,conversion,,,,,2607,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 19N (code 16279) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16380,3-degree Gauss-Kruger CM 60E,conversion,,,,,2608,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 20N (code 16280) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16381,3-degree Gauss-Kruger CM 63E,conversion,,,,,2609,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 21N (code 16281) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16382,3-degree Gauss-Kruger CM 66E,conversion,,,,,2610,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 22N (code 16282) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16383,3-degree Gauss-Kruger CM 69E,conversion,,,,,2611,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 23N (code 16283) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16384,3-degree Gauss-Kruger CM 72E,conversion,,,,,2612,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 24N (code 16284) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16385,3-degree Gauss-Kruger CM 75E,conversion,,,,,2613,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 25N (code 16285) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16386,3-degree Gauss-Kruger CM 78E,conversion,,,,,2614,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 26N (code 16286) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16387,3-degree Gauss-Kruger CM 81E,conversion,,,,,2615,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 27N (code 16287) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16388,3-degree Gauss-Kruger CM 84E,conversion,,,,,2616,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 28N (code 16288) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16389,3-degree Gauss-Kruger CM 87E,conversion,,,,,2617,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 29N (code 16289) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16390,3-degree Gauss-Kruger CM 90E,conversion,,,,,2618,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 30N (code 16290) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16391,3-degree Gauss-Kruger CM 93E,conversion,,,,,2619,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 31N (code 16291) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16392,3-degree Gauss-Kruger CM 96E,conversion,,,,,2620,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 32N (code 16292) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16393,3-degree Gauss-Kruger CM 99E,conversion,,,,,2621,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 33N (code 16293) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16394,3-degree Gauss-Kruger CM 102E,conversion,,,,,2622,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 34N (code 16294) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16395,3-degree Gauss-Kruger CM 105E,conversion,,,,,2623,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 35N (code 16295) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16396,3-degree Gauss-Kruger CM 108E,conversion,,,,,2624,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 36N (code 16296) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16397,3-degree Gauss-Kruger CM 111E,conversion,,,,,2625,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 37N (code 16297) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16398,3-degree Gauss-Kruger CM 114E,conversion,,,,,2626,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 38N (code 16298) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16399,3-degree Gauss-Kruger CM 117E,conversion,,,,,2627,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,3-degree Gauss-Kruger zone 39N (code 16299) without zone prefix to false easting value. Original transformation by Gauss-Kruger formula.,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+16400,TM 0 N,conversion,,,,,1629,Oil exploration.,9807,,,,Shell UK,EPSG,1998-11-11 00:00:00,,1,0
+16405,TM 5 NE,conversion,,,,,1630,Oil exploration.,9807,,,,NAM,EPSG,1998-11-11 00:00:00,,1,0
+16406,TM 6 NE,conversion,,,,,1717,Oil exploration.,9807,,,Used by ExxonMobil for deepwater blocks offshore Nigeria.,ExxonMobil,EPSG,2002-02-12 00:00:00,,1,0
+16411,TM 11 NE,conversion,,,,,1489,Oil exploration.,9807,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+16412,TM 12 NE,conversion,,,,,1143,Oil exploration.,9807,,,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+16413,TM 13 NE,conversion,,,,,2771,Oil exploration.,9807,,,,TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+16430,TM 30 NE,conversion,,,,,2546,Oil exploration.,9807,,,,TotalFinaElf,EPSG,2001-11-06 00:00:00,,1,0
+16506,TM 106 NE,conversion,,,,,1495,Oil exploration.,9807,,,,PetroVietnam,EPSG,2000-03-07 00:00:00,,1,0
+16586,GK 106 NE,conversion,,,,,1494,Oil exploration.,9807,,,,BP Amoco,EPSG,2000-03-07 00:00:00,,1,0
+16611,TM 11.30 SE,conversion,,,,,1605,Oil exploration.,9807,,,,Esso Angola,EPSG,1998-11-11 00:00:00,,1,0
+16612,TM 12 SE,conversion,,,,,1604,Oil exploration.,9807,,,,Shell Angola,EPSG,1998-11-11 00:00:00,,1,0
+16636,TM 36 SE,conversion,,,,,1726,Oil exploration.,9807,,,,BP Mozambique,EPSG,1998-11-11 00:00:00,,1,0
+16709,TM 109 SE,conversion,,,,,2577,Oil exploration.,9807,,,Used by Arco and BP for ONWJ.,BP,EPSG,2002-02-12 00:00:00,,1,0
+16716,TM 116 SE,conversion,,,,,2588,Oil exploration.,9807,,,Used by BP for Terang-Sirasun.,BP,EPSG,2002-02-12 00:00:00,,1,0
+16732,TM 132 SE,conversion,,,,,2589,Oil exploration.,9807,,,Used for Tangguh developments.,BP,EPSG,2002-02-12 00:00:00,,1,0
+17001,TM 1 NW,conversion,,,,,1505,Oil exploration.,9807,,,,Various industry sources,EPSG,2000-10-19 00:00:00,,1,0
+17005,TM 5 NW,conversion,,,,,2296,Oil exploration.,9807,,,,Various oil industry sources,EPSG,2001-06-05 00:00:00,,1,0
+17054,TM 54 NW,conversion,,,,,1727,Oil exploration.,9807,,,,Shell,EPSG,2000-06-10 00:00:00,,1,0
+17348,Map Grid of Australia zone 48,conversion,,,,,1556,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17349,Map Grid of Australia zone 49,conversion,,,,,1557,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17350,Map Grid of Australia zone 50,conversion,,,,,1558,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17351,Map Grid of Australia zone 51,conversion,,,,,1559,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17352,Map Grid of Australia zone 52,conversion,,,,,1560,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17353,Map Grid of Australia zone 53,conversion,,,,,1561,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17354,Map Grid of Australia zone 54,conversion,,,,,1562,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17355,Map Grid of Australia zone 55,conversion,,,,,1563,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17356,Map Grid of Australia zone 56,conversion,,,,,1564,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17357,Map Grid of Australia zone 57,conversion,,,,,1565,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17358,Map Grid of Australia zone 58,conversion,,,,,1566,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17448,Australian Map Grid zone 48,conversion,,,,,1556,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17449,Australian Map Grid zone 49,conversion,,,,,1557,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17450,Australian Map Grid zone 50,conversion,,,,,1558,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17451,Australian Map Grid zone 51,conversion,,,,,1559,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17452,Australian Map Grid zone 52,conversion,,,,,1560,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17453,Australian Map Grid zone 53,conversion,,,,,1561,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17454,Australian Map Grid zone 54,conversion,,,,,1567,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17455,Australian Map Grid zone 55,conversion,,,,,1568,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17456,Australian Map Grid zone 56,conversion,,,,,2291,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17457,Australian Map Grid zone 57,conversion,,,,,1565,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17458,Australian Map Grid zone 58,conversion,,,,,1566,Large and medium scale topographic mapping and engineering survey.,9807,,,Grid convergence uses opposite sign convention to UTM,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+17515,South African Survey Grid zone 15,conversion,,,,,1454,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17517,South African Survey Grid zone 17,conversion,,,,,1455,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17519,South African Survey Grid zone 19,conversion,,,,,1456,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17521,South African Survey Grid zone 21,conversion,,,,,1457,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17523,South African Survey Grid zone 23,conversion,,,,,1458,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17525,South African Survey Grid zone 25,conversion,,,,,1459,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17527,South African Survey Grid zone 27,conversion,,,,,1460,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17529,South African Survey Grid zone 29,conversion,,,,,1461,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17531,South African Survey Grid zone 31,conversion,,,,,1462,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17533,South African Survey Grid zone 33,conversion,,,,,1463,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+17611,South West African Survey Grid zone 11,conversion,,,,,1838,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17613,South West African Survey Grid zone 13,conversion,,,,,1839,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17615,South West African Survey Grid zone 15,conversion,,,,,1840,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17617,South West African Survey Grid zone 17,conversion,,,,,1841,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17619,South West African Survey Grid zone 19,conversion,,,,,1842,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17621,South West African Survey Grid zone 21,conversion,,,,,1843,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17623,South West African Survey Grid zone 23,conversion,,,,,1844,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17625,South West African Survey Grid zone 25,conversion,,,,,1845,"Large and medium scale topographic mapping, cadastral and engineering survey.",9808,,,"Transformation method sometimes described as ""Gauss conform"".",Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,1997-06-16 00:00:00,95.30  96.29  97.16,1,0
+17700,MTM Quebec zone 2,conversion,,,,,1420,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+17701,MTM zone 1,conversion,,,,,2226,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17702,MTM Newfoundland zone 2,conversion,,,,,2227,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17703,MTM zone 3,conversion,,,,,2290,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17704,MTM zone 4,conversion,,,,,2276,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17705,MTM zone 5,conversion,,,,,2277,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17706,MTM zone 6,conversion,,,,,2278,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+17707,MTM zone 7,conversion,,,,,1425,Large and medium scale topographic mapping and engineering survey.,9807,,,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+17708,MTM zone 8,conversion,,,,,2279,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17709,MTM zone 9,conversion,,,,,2280,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17710,MTM zone 10,conversion,,,,,2281,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17711,MTM zone 11,conversion,,,,,1432,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17712,MTM zone 12,conversion,,,,,1433,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17713,MTM zone 13,conversion,,,,,1434,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17714,MTM zone 14,conversion,,,,,1435,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17715,MTM zone 15,conversion,,,,,1436,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17716,MTM zone 16,conversion,,,,,1437,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17717,MTM zone 17,conversion,,,,,1438,Large and medium scale topographic mapping and engineering survey.,9807,,,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+17794,MTM Nova Scotia zone 4,conversion,,,,,1534,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1999-05-24 00:00:00,99.042,1,0
+17795,MTM Nova Scotia zone 5,conversion,,,,,1535,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1999-05-24 00:00:00,99.042,1,0
+17801,Japan Plane Rectangular CS zone I,conversion,,,,,1854,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17802,Japan Plane Rectangular CS zone II,conversion,,,,,1855,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17803,Japan Plane Rectangular CS zone III,conversion,,,,,1856,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17804,Japan Plane Rectangular CS zone IV,conversion,,,,,1857,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17805,Japan Plane Rectangular CS zone V,conversion,,,,,1858,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17806,Japan Plane Rectangular CS zone VI,conversion,,,,,1859,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17807,Japan Plane Rectangular CS zone VII,conversion,,,,,1860,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17808,Japan Plane Rectangular CS zone VIII,conversion,,,,,1861,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17809,Japan Plane Rectangular CS zone IX,conversion,,,,,1862,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17810,Japan Plane Rectangular CS zone X,conversion,,,,,1863,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17811,Japan Plane Rectangular CS zone XI,conversion,,,,,1864,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17812,Japan Plane Rectangular CS zone XII,conversion,,,,,1865,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17813,Japan Plane Rectangular CS zone XIII,conversion,,,,,1866,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+17814,Japan Plane Rectangular CS zone XIV,conversion,,,,,1867,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17815,Japan Plane Rectangular CS zone XV,conversion,,,,,1868,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17816,Japan Plane Rectangular CS zone XVI,conversion,,,,,1869,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17817,Japan Plane Rectangular CS zone XVII,conversion,,,,,1870,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17818,Japan Plane Rectangular CS zone XVIII,conversion,,,,,1871,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17819,Japan Plane Rectangular CS zone XIX,conversion,,,,,1872,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,Original transformation by Gauss-Kruger formula.,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+17901,Mount Eden Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Mount Eden Circuit 2000 (code 17931) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17902,Bay of Plenty Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Bay of Plenty Circuit 2000 (code 17932) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17903,Poverty Bay Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Poverty Bay Circuit 2000 (code 17933) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17904,Hawkes Bay Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Hawkes Bay Circuit 2000 (code 17934) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17905,Taranaki Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Taranaki Circuit 2000 (code 17935) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17906,Tuhirangi Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Tuhirangi Circuit 2000 (code 17936) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17907,Wanganui Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Wanganui Circuit 2000 (code 17937) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17908,Wairarapa Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Wairarapa Circuit 2000 (code 17938) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17909,Wellington Circuit,conversion,,,,,1500,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Wellington Circuit 2000 (code 17939) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17910,Collingwood Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Collingwood Circuit 2000 (code 17940) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17911,Nelson Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Nelson Circuit 2000 (code 17941) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17912,Karamea Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Karamea Circuit 2000 (code 17942) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17913,Buller Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Buller Circuit 2000 (code 17943) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17914,Grey Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Grey Circuit 2000 (code 17944) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17915,Amuri Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Amuri Circuit 2000 (code 17945) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17916,Marlborough Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Marlborough Circuit 2000 (code 17946) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17917,Hokitika Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Hokitika Circuit 2000 (code 17947) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17918,Okarito Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Okarito Circuit 2000 (code 17948) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17919,Jacksons Bay Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Jacksons Bay Circuit 2000 (code 17949) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17920,Mount Pleasant Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Mount Pleasant Circuit 2000 (code 17950) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17921,Gawler Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Gawler Circuit 2000 (code 17951) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17922,Timaru Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Timaru Circuit 2000 (code 17952) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17923,Lindis Peak Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Lindis Peak Circuit 2000 (code 17953) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17924,Mount Nicholas Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Mount Nicholas Circuit 2000 (code 17954) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17925,Mount York Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Mount York Circuit 2000 (code 17955) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17926,Observation Point Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Observation Point Circuit 2000 (code 17956) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17927,North Taieri Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by North Taieri Circuit 2000 (code 17957) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17928,Bluff Circuit,conversion,,,,,1501,Cadastral surveying.,9807,,,Superseded Imperial measure circuit in 1972.  Superseded by Bluff Circuit 2000 (code 17958) from March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17931,Mount Eden Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Mount Eden Circuit (code 17901) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17932,Bay of Plenty Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Bay of Plenty Circuit (code 17902) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17933,Poverty Bay Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Poverty Bay Circuit (code 17903) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17934,Hawkes Bay Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Hawkes Bay Circuit (code 17904) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17935,Taranaki Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Taranaki Circuit (code 17905) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17936,Tuhirangi Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Tuhirangi Circuit (code 17906) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17937,Wanganui Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Wanganui Circuit (code 17907) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17938,Wairarapa Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Wairarapa Circuit (code 17908) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17939,Wellington Circuit 2000,conversion,,,,,1500,Cadastral surveying.,9807,,,Supersedes Wellington Circuit (code 17909) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17940,Collingwood Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Collingwood Circuit (code 17910) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17941,Nelson Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Nelson Circuit (code 17911) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17942,Karamea Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Karamea Circuit (code 17912) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17943,Buller Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Buller Circuit (code 17913) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17944,Grey Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Grey Circuit (code 17914) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17945,Amuri Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Amuri Circuit (code 17915) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17946,Marlborough Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Marlborough Circuit (code 17916) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17947,Hokitika Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Hokitika Circuit (code 17917) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17948,Okarito Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Okarito Circuit (code 17918) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17949,Jacksons Bay Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Jacksons Bay Circuit (code 17919) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17950,Mount Pleasant Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Mount Pleasant Circuit (code 17920) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17951,Gawler Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Gawler Circuit (code 17921) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17952,Timaru Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Timaru Circuit (code 17922) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17953,Lindis Peak Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Lindis Peak Circuit (code 17923) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17954,Mount Nicholas Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Mount Nicholas Circuit (code 17924) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17955,Mount York Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Mount York Circuit (code 17925) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17956,Observation Point Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Observation Point Circuit (code 17926) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17957,North Taieri Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes North Taieri Circuit (code 17927) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+17958,Bluff Circuit 2000,conversion,,,,,1501,Cadastral surveying.,9807,,,Supersedes Bluff Circuit (code 17928) after 1st March 2000.,Land Information New Zealand OSG Technical Report 8; April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+18011,Nord Algerie (ancienne),conversion,,,,,1728,Large and medium scale topographic mapping and engineering survey.,9801,,,Used with Voirol 1875 datum - now superseded.,,EPSG,1996-09-12 00:00:00,,1,0
+18012,Sud Algerie (ancienne),conversion,,,,,1729,Large and medium scale topographic mapping and engineering survey.,9801,,,Used with Voirol 1875 datum - now superseded.,,EPSG,1996-09-12 00:00:00,,1,0
+18021,Nord Algerie,conversion,,,,,1728,Large and medium scale topographic mapping and engineering survey.,9801,,,Use with Nord Sahara 1959 datum.,,EPSG,1996-09-12 00:00:00,,1,0
+18022,Sud Algerie,conversion,,,,,1729,Large and medium scale topographic mapping and engineering survey.,9801,,,Use with Nord Sahara 1959 datum.,,EPSG,1996-09-12 00:00:00,,1,0
+18031,Argentina zone 1,conversion,,,,,1608,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18032,Argentina zone 2,conversion,,,,,1609,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18033,Argentina zone 3,conversion,,,,,1610,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18034,Argentina zone 4,conversion,,,,,1611,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18035,Argentina zone 5,conversion,,,,,1612,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18036,Argentina zone 6,conversion,,,,,1613,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18037,Argentina zone 7,conversion,,,,,1614,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,2002-06-22 00:00:00,95.30 2002.36,1,0
+18041,Austria West Zone,conversion,,,,,1706,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by M28 (EPSG code 18044).,,EPSG,1997-04-11 00:00:00,95.30  96.29  97.01  98.48,1,0
+18042,Austria Central Zone,conversion,,,,,1707,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by M31 (EPSG code 18045).,,EPSG,1997-04-11 00:00:00,95.30  96.29  97.01  98.48,1,0
+18043,Austria East Zone,conversion,,,,,1708,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by M34 (EPSG code 18046).,,EPSG,1997-04-11 00:00:00,95.30  96.29  97.01  98.48,1,0
+18044,Austria M28,conversion,,,,,1706,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Austria West zone (EPSG code 18041).,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,0
+18045,Austria M31,conversion,,,,,1707,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Austria Central zone (EPSG code 18042).,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,0
+18046,Austria M34,conversion,,,,,1708,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Austria East zone (EPSG code 18043).,Bundesamt f�r Eich- und Vermessungswesen,EPSG,1999-10-20 00:00:00,,1,0
+18051,Colombia West zone,conversion,,,,,1598,Large and medium scale topographic mapping and engineering survey.,9807,,,"Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as ""6 west"".",,EPSG,1997-04-11 00:00:00,95.30  96.29  97.11,1,0
+18052,Colombia Bogota zone,conversion,,,,,1599,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula,,EPSG,1997-04-11 00:00:00,95.30  96.29  97.11,1,0
+18053,Colombia East Central zone,conversion,,,,,1600,Large and medium scale topographic mapping and engineering survey.,9807,,,"Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as ""3 east"".",,EPSG,1997-04-11 00:00:00,95.30  96.29  97.11,1,0
+18054,Colombia East zone,conversion,,,,,1601,Large and medium scale topographic mapping and engineering survey.,9807,,,"Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as ""6 east"".",,EPSG,1997-04-11 00:00:00,95.30  96.29  97.11,1,0
+18061,Cuba Norte,conversion,,,,,1487,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18062,Cuba Sur,conversion,,,,,1488,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18071,Egypt Blue Belt,conversion,,,,,1642,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2002-07-16 00:00:00,2002.49,1,0
+18072,Egypt Red Belt,conversion,,,,,1643,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+18073,Egypt Purple Belt,conversion,,,,,1644,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+18074,Egypt Extended Purple Belt,conversion,,,,,1645,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+18081,Lambert zone I,conversion,,,,,1731,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Nord France (code 18091).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26  2001.54,1,0
+18082,Lambert zone II,conversion,,,,,1734,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Centre France (code 18092).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26  2001.54,1,0
+18083,Lambert zone III,conversion,,,,,1733,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Sud France (code 18093).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26  2001.54,1,0
+18084,Lambert zone IV,conversion,,,,,1327,Large and medium scale topographic mapping and engineering survey.,9801,,,Introduced 1972. Supersedes Lambert Corse (code 18094).,IGN Paris.,EPSG,2001-11-06 00:00:00,2001.54,1,0
+18085,Lambert-93,conversion,,,,,1326,Large and medium scale topographic mapping and engineering survey.,9802,,,,IGN - Paris,EPSG,2000-10-19 00:00:00,,1,0
+18086,France EuroLambert,conversion,,,,,1326,Medium scale topographic and statistical mapping.,9801,,,This is Lambert zone II (code 18082) parameters converted from grads/Paris to degrees/Greenwich for use with ED50.,IGN Paris via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18091,Lambert Nord France,conversion,,,,,1731,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone I (code 18081).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26  2001.54,1,0
+18092,Lambert Centre France,conversion,,,,,1734,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone II (code 18082).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26  2001.54,1,0
+18093,Lambert Sud France,conversion,,,,,1733,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone III (code 18083).,IGN Paris.,EPSG,2001-11-06 00:00:00,95.26  2001.54,1,0
+18094,Lambert Corse,conversion,,,,,1327,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded in 1972 by Lambert zone IV (code 18084).,IGN Paris.,EPSG,2001-11-06 00:00:00,2001.54,1,0
+18110,India zone 0,conversion,,,,,1668,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.30  96.01  96.02  96.29  97.23,1,0
+18111,India zone I,conversion,,,,,1669,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.30  96.02  96.29  97.23,1,0
+18112,India zone IIa,conversion,,,,,1670,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.28  96.02  97.23,1,0
+18113,India zone IIb,conversion,,,,,1671,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,2000-03-07 00:00:00,95.28  96.02  97.23  2000.094,1,0
+18114,India zone IIIa,conversion,,,,,1672,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,2000-03-07 00:00:00,95.28  96.02  97.23  2000.094,1,0
+18115,India zone IIIb,conversion,,,,,2292,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.28  96.02  97.23,1,0
+18116,India zone IVa,conversion,,,,,1673,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,2000-03-07 00:00:00,95.28  96.02  97.23  2000.094,1,0
+18117,India zone IVb,conversion,,,,,2293,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,US Army Map Service projection tables; 1943.,EPSG,1999-10-20 00:00:00,95.28  96.02  97.23,1,0
+18121,Italy zone 1,conversion,,,,,1718,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Boaga formula,,EPSG,1995-12-02 00:00:00,,1,0
+18122,Italy zone 2,conversion,,,,,1719,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Boaga formula,,EPSG,1995-12-02 00:00:00,,1,0
+18131,Nord Maroc,conversion,,,,,1703,Large and medium scale topographic mapping and engineering survey.,9801,,,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,IGN Paris.,EPSG,1996-09-12 00:00:00,99.203,1,0
+18132,Sud Maroc,conversion,,,,,1704,Large and medium scale topographic mapping and engineering survey.,9801,,,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,IGN Paris.,EPSG,1996-09-12 00:00:00,99.203,1,0
+18133,Sahara,conversion,,,,,1705,Large and medium scale topographic mapping and engineering survey.,9801,,,Created in 1977 to cover Sahara Marocain (ex Spanish Sahara),IGN Paris.,EPSG,1996-09-12 00:00:00,,1,0
+18141,New Zealand North Island National Grid,conversion,,,,,1500,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by New Zealand Map Grid (code 19917).  Used for topographic mapping.,,EPSG,1999-10-20 00:00:00,95.30  96.29  97.231,1,0
+18142,New Zealand South Island National Grid,conversion,,,,,1501,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by New Zealand Map Grid (code 19917).  Used for topographic mapping.,,EPSG,1999-10-20 00:00:00,95.30  96.29  97.231,1,0
+18151,Nigeria West Belt,conversion,,,,,1715,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18152,Nigeria Mid Belt,conversion,,,,,1714,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18153,Nigeria East Belt,conversion,,,,,1713,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18161,Peru west zone,conversion,,,,,1753,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18162,Peru central zone,conversion,,,,,1752,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18163,Peru east zone,conversion,,,,,1751,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+18171,Philippines zone I,conversion,,,,,1698,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18172,Philippines zone II,conversion,,,,,1699,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18173,Philippines zone III,conversion,,,,,1700,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18174,Philippines zone IV,conversion,,,,,1701,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18175,Philippines zone V,conversion,,,,,1702,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,2000-03-07 00:00:00,95.30 2000.93,1,0
+18181,Nord Tunisie,conversion,,,,,1619,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1996-09-12 00:00:00,95.30,1,0
+18182,Sud Tunisie,conversion,,,,,1620,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1996-09-12 00:00:00,,1,0
+18191,Finland zone 1,conversion,,,,,1536,Large and medium scale topographic mapping and engineering survey.,9807,,,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18192,Finland zone 2,conversion,,,,,1537,Large and medium scale topographic mapping and engineering survey.,9807,,,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18193,Finland Uniform Coordinate System,conversion,,,,,1095,Large and medium scale topographic mapping and engineering survey.,9807,,,Used by Uniform Coordinate System over all country and also by zone 3 of Basic Coordinate System at larger scales.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18194,Finland zone 4,conversion,,,,,1539,Large and medium scale topographic mapping and engineering survey.,9807,,,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+18201,Palestine Grid,conversion,,,,,1356,Large and medium scale topographic mapping and engineering survey.,9806,,,Also encountered as a Transverse Mercator projection with scale factor of 1.  The difference in conversion caused by the change of formula does not exceed 2m within Israel.  Within the State of Israel superseded by the Israeli CS Grid (EPSG code 18203).,,EPSG,1999-04-22 00:00:00,,1,0
+18202,Palestine Belt,conversion,,,,,1356,Large and medium scale topographic mapping and engineering survey.,9807,,,"Originally constructed as the Palestine Grid - EPSG code 18201. Adopted by the US Army Map Service as ""Palestine Belt"" with change of projection method and false northing (FN). Sometimes seen with unchanged FN of 126867.909.",,EPSG,1999-04-22 00:00:00,,1,0
+18203,Israeli CS,conversion,,,,,2603,Large and medium scale topographic mapping and engineering survey.,9806,,,,Survey of Israel   ftp://ftp.rd.soi.gov.il/doc,EPSG,2002-06-22 00:00:00,2002.34,1,0
+18204,Israeli TM,conversion,,,,,2603,Large and medium scale topographic mapping and engineering survey.,9807,,,Designed to approximate Israeli CRS grid in north-central Israel.,Survey of Israel   ftp://ftp.rd.soi.gov.il/doc,EPSG,2002-06-22 00:00:00,2002.34,1,0
+18211,Guatemala Norte,conversion,,,,,2120,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,1999-08-16 00:00:00,,1,0
+18212,Guatemala Sur,conversion,,,,,2121,Large and medium scale topographic mapping and engineering survey.,9801,,,,,EPSG,2000-01-06 00:00:00,99.95,1,0
+18221,NGO zone I,conversion,,,,,1741,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18222,NGO zone II,conversion,,,,,1742,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18223,NGO zone III,conversion,,,,,1743,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18224,NGO zone IV,conversion,,,,,1744,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18225,NGO zone V,conversion,,,,,1745,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18226,NGO zone VI,conversion,,,,,1746,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18227,NGO zone VII,conversion,,,,,1747,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18228,NGO zone VIII,conversion,,,,,1748,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,,"J. Danielsen; ""Transformasjoner ved Norges Geografiske Oppm�ling""; Kart Og Plan nr 1; 1982.",EPSG,1999-10-20 00:00:00,,1,0
+18231,India zone I (1975 metres),conversion,,,,,1676,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18232,India zone IIa (1975 metres),conversion,,,,,1677,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18233,India zone IIIa (1975 metres),conversion,,,,,1672,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18234,India zone IVa (1975 metres),conversion,,,,,1673,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18235,India zone IIb (1975 metres),conversion,,,,,1678,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18236,India zone I (1962 metres),conversion,,,,,1685,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,1999-10-20 00:00:00,,1,0
+18237,India zone IIa (1962 metres),conversion,,,,,1686,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,1999-10-20 00:00:00,,1,0
+18238,India zone IIb (1937 metres),conversion,,,,,1041,Large and medium scale topographic mapping and engineering survey.,9801,,,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,,EPSG,2000-04-23 00:00:00,2000.39,1,0
+18240,Libya zone 5,conversion,,,,,1470,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18241,Libya zone 6,conversion,,,,,1471,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18242,Libya zone 7,conversion,,,,,1472,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18243,Libya zone 8,conversion,,,,,1473,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18244,Libya zone 9,conversion,,,,,1474,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18245,Libya zone 10,conversion,,,,,1475,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18246,Libya zone 11,conversion,,,,,1476,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18247,Libya zone 12,conversion,,,,,1477,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18248,Libya zone 13,conversion,,,,,1478,Large and medium scale topographic mapping and engineering survey.,9807,,,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+18251,Korea East Belt,conversion,,,,,1496,Large and medium scale topographic mapping and engineering survey.,9807,,,,Clifford J. Mugnier; Photogrammertric Engineering and Remote Sensing,EPSG,2000-03-07 00:00:00,,1,0
+18252,Korea Central Belt,conversion,,,,,1497,Large and medium scale topographic mapping and engineering survey.,9807,,,,Clifford J. Mugnier; Photogrammertric Engineering and Remote Sensing,EPSG,2000-03-07 00:00:00,,1,0
+18253,Korea West Belt,conversion,,,,,1498,Large and medium scale topographic mapping and engineering survey.,9807,,,,Clifford J. Mugnier; Photogrammertric Engineering and Remote Sensing,EPSG,2000-03-07 00:00:00,,1,0
+18260,Maracaibo Grid (M1),conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (0 0) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+18261,Maracaibo Grid,conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (200000 200000) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+18262,Maracaibo Grid (M3),conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (500000 500000) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-03-07 00:00:00,,1,0
+18263,Maracaibo La Rosa Grid,conversion,,,,,1319,Oil exploration.,9801,,,Grid coordinates are (-17044E 29545N) at Maracaibo Cathedral.,Various oil company sources.,EPSG,2000-06-23 00:00:00,,1,0
+18275,Balkans zone 5,conversion,,,,,1709,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18276,Balkans zone 6,conversion,,,,,1710,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18277,Balkans zone 7,conversion,,,,,1711,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18278,Balkans zone 8,conversion,,,,,1712,Large and medium scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+18281,Poland zone I,conversion,,,,,1515,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18282,Poland zone II,conversion,,,,,1516,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18283,Poland zone III,conversion,,,,,1517,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18284,Poland zone IV,conversion,,,,,1518,"Civilian topographic mapping, cadastral and engineering survey.",9809,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18285,Poland zone V,conversion,,,,,1519,"Civilian topographic mapping, cadastral and engineering survey.",9807,,,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18300,Poland CS92,conversion,,,,,1192,"Mapping at scales of 1:10,000 and smaller",9807,,,See Poland CS2000 zones (codes 18305-08) for cadastral survey and mapping at larger scales.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18305,Poland CS2000 zone 5,conversion,,,,,1520,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18306,Poland CS2000 zone 6,conversion,,,,,1521,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18307,Poland CS2000 zone 7,conversion,,,,,1522,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18308,Poland CS2000 zone 8,conversion,,,,,1523,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See Poland CS92 (code 18300) for mapping at 1:10,000 and smaller scales.",Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+18401,Kp2000 Jylland og Fyn,conversion,,,,,2531,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See UTM zone 32N (code 16032) for mapping at 1:10,000 and smaller scales.",Kort og Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+18402,Kp2000 Sjaelland,conversion,,,,,2532,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See UTM zone 32N (code 16032) for mapping at 1:10,000 and smaller scales.",Kort og Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+18403,Kp2000 Bornholm,conversion,,,,,2533,"Topographic mapping at scales of 1:5,000 and larger, cadastral and engineering survey.",9807,,,"See UTM zone 33N (code 16033) for mapping at 1:10,000 and smaller scales.",Kort og Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+18411,French West Africa Senegal zone,conversion,,,,,2548,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18412,French West Africa Ivory Coast zone,conversion,,,,,2549,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18413,French West Africa Dahomey zone,conversion,,,,,2550,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18414,French West Africa Niger zone,conversion,,,,,2551,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18415,French Equatorial Africa west zone,conversion,,,,,2552,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18416,French Equatorial Africa central zone,conversion,,,,,2553,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18417,French Equatorial Africa east zone,conversion,,,,,2554,Small scale topographic mapping.,9807,,,Superseded in 1950 by UTM.,TotatFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+18421,Greenland zone 1 east,conversion,,,,,2556,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18422,Greenland zone 2 east,conversion,,,,,2557,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18423,Greenland zone 3 east,conversion,,,,,2558,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18424,Greenland zone 4 east,conversion,,,,,2559,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18425,Greenland zone 5 east,conversion,,,,,2560,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18426,Greenland zone 6 east,conversion,,,,,2561,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18427,Greenland zone 7 east,conversion,,,,,2562,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18428,Greenland zone 8 east,conversion,,,,,2569,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18432,Greenland zone 2 west,conversion,,,,,2563,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18433,Greenland zone 3 west,conversion,,,,,2564,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18434,Greenland zone 4 west,conversion,,,,,2565,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18435,Greenland zone 5 west,conversion,,,,,2566,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18436,Greenland zone 6 west,conversion,,,,,2567,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18437,Greenland zone 7 west,conversion,,,,,2568,Topographic mapping,9826,,,,"Kort og Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+18441,CS63 zone A1,conversion,,,,,2772,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18442,CS63 zone A2,conversion,,,,,2773,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18443,CS63 zone A3,conversion,,,,,2774,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18444,CS63 zone A4,conversion,,,,,2775,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18446,CS63 zone K2,conversion,,,,,2776,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18447,CS63 zone K3,conversion,,,,,2777,Large scale topographic mapping and engineering survey.,9807,,,,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+18448,CS63 zone K4,conversion,,,,,2778,Large scale topographic mapping and engineering survey.,9807,,,,KazGeodezia,EPSG,2002-06-28 00:00:00,,1,0
+19900,Bahrain State Grid,conversion,,,,,1040,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+19901,Belge Lambert 50,conversion,,,,,1347,Large and medium scale topographic mapping and engineering survey.,9802,,,"If software cannot handle latitude of false origin of 90 deg N, use latitude of false origin = 50.5 sexagesimal degrees with northing at false origin = 131983.890 m.","""Systemes de reference et formules de transformation en usage en Belgique""; IGN Brussels",EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+19902,Belge Lambert 72,conversion,,,,,1347,Large and medium scale topographic mapping and engineering survey.,9803,,,"Rotation from Belge Lambert 50 to Belge Lambert 72 is +29.2985sec. An equivalent using the conventional Lambert Conic Conformal (2SP) method (Belgian Lambert 72, code 19961) was introduced in 2000.","""Systemes de reference et formules de transformation en usage en Belgique""; IGN Brussels",EPSG,1999-04-22 00:00:00,95.30  96.29  99.28,1,0
+19903,Nord de Guerre,conversion,,,,,1369,Obsolete.,9801,,,,,EPSG,1996-09-12 00:00:00,,1,0
+19904,Ghana Metre Grid,conversion,,,,,1104,Large and medium scale topographic mapping and engineering survey.,9807,,,Supersedes Ghana National Grid (code 19959) from 1978.  British foot (Sears 1922) used to convert projection defining parameters.,Ordnance Survey International,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+19905,Netherlands East Indies Equatorial Zone,conversion,,,,,1122,Large and medium scale topographic mapping and engineering survey.,9804,,,,US Army Map Service projection tables; 1943.,EPSG,1995-12-02 00:00:00,95.30,1,0
+19906,Iraq zone,conversion,,,,,2294,Large and medium scale topographic mapping and engineering survey.,9801,,,,US Army Map Service projection tables; 1943.,EPSG,1996-04-12 00:00:00,95.30  96.29,1,0
+19907,Iraq National Grid,conversion,,,,,1124,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+19908,Irish National Grid,conversion,,,,,1305,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,1
+19909,Jamaica (Old Grid),conversion,,,,,1128,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded by Jamaica (New Grid).,,EPSG,1995-12-02 00:00:00,95.28,1,0
+19910,Jamaica National Grid,conversion,,,,,1128,Large and medium scale topographic mapping and engineering survey.,9801,,,Supersedes Jamaica (Old Grid).,,EPSG,1995-12-02 00:00:00,95.28,1,0
+19911,Laborde Grid,conversion,,,,,1149,Large and medium scale topographic mapping and engineering survey.,9815,,,Can also use transformation method 9813.,,EPSG,1997-11-13 00:00:00,97.613,1,0
+19913,RD Old,conversion,,,,,1275,Large and medium scale topographic mapping and engineering survey.,9809,,,,Nederlandse Commissie voor Geodesie publication 30.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+19914,RD New,conversion,,,,,1275,Large and medium scale topographic mapping and engineering survey.,9809,,,,Nederlandse Commissie voor Geodesie publication 30.,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+19915,Aden Zone,conversion,,,,,1257,Large and medium scale topographic mapping and engineering survey.,9801,,,,US Army Map Service projection tables; 1943.,EPSG,1995-12-02 00:00:00,95.28,1,0
+19916,British National Grid,conversion,,,,,1264,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30,1,0
+19917,New Zealand Map Grid,conversion,,,,,1175,Large and medium scale topographic mapping and engineering survey.,9811,,,Supersedes North and South Island National Grids (codes 18141-2).  Used for topographic mapping.,Dept. of Lands and Surveys Technical Circular 1973/32; 23 Nov 1973.,EPSG,1995-12-02 00:00:00,95.28,1,0
+19919,Qatar National Grid,conversion,,,,,1195,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+19920,Singapore Grid,conversion,,,,,1210,Large and medium scale topographic mapping and engineering survey.,9806,,,,,EPSG,1995-12-02 00:00:00,95.30  96.29,1,0
+19921,Spain,conversion,,,,,1217,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded by UTM,,EPSG,1995-12-02 00:00:00,95.28,1,0
+19922,Swiss New Grid,conversion,,,,,1286,Large and medium scale topographic mapping and engineering survey.,9815,,,,"""Die Projektionen der schweizerischen Plan- und Kartenwerke""; J. Bolliger 1967",EPSG,1997-11-13 00:00:00,95.30  96.29  97.27  97.612  97.62,1,0
+19923,Swiss Old Grid,conversion,,,,,1286,Large and medium scale topographic mapping and engineering survey.,9815,,,Superseded by LV03 (19922).,"""Die Projektionen der schweizerischen Plan- und Kartenwerke""; J. Bolliger 1967",EPSG,1997-11-13 00:00:00,95.30  96.29  97.612  97.62,1,0
+19924,Tobago Grid,conversion,,,,,1322,Large and medium scale topographic mapping and engineering survey.,9806,,,,,EPSG,1999-10-20 00:00:00,95.30  96.29  97.231,1,0
+19925,Trinidad Grid,conversion,,,,,1339,Large and medium scale topographic mapping and engineering survey.,9806,,,,,EPSG,1999-10-20 00:00:00,95.30  96.29  97.231,1,0
+19926,Stereo 70,conversion,,,,,1197,Large and medium scale topographic mapping and engineering survey.,9809,,,Supersedes Stereo 33 (code 19927).,,EPSG,1996-04-12 00:00:00,,1,0
+19927,Stereo 33,conversion,,,,,1197,Large and medium scale topographic mapping and engineering survey.,9809,,,Superseded by Stereo 70 (code 19926),,EPSG,1996-04-12 00:00:00,96.29,1,0
+19928,Kuwait TM,conversion,,,,,1310,Large and medium scale topographic mapping and engineering survey.,9807,,,,,EPSG,1996-04-12 00:00:00,,1,0
+19929,Swedish National Projection,conversion,,,,,1225,"Large and medium scale topographic mapping, cadastral and engineering survey.",9807,,,"Used since 1938 superseding 6 old zones.  Longitude of natural origin is 2.5 gon west of Stockholm prime meridian; transformation is also known as ""2.5 gon West of old Stockholm observatory"".",Lantmateriet of Sweden; private communication.,EPSG,1997-11-13 00:00:00,96.29  97.39,1,0
+19930,Greek Grid,conversion,,,,,1106,Large and medium scale topographic mapping and engineering survey.,9807,,,Created for use with GGRS87.,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+19931,Egyseges Orszagos Vetuleti,conversion,,,,,1119,Large and medium scale topographic mapping and engineering survey.,9815,,,EOV = Uniform National Projection,http://lazarus.elte.hu/gb/geodez/geod2.htm,EPSG,1997-07-22 00:00:00,,1,0
+19933,Prince Edward Island Stereographic (ATS77),conversion,,,,,1533,Large and medium scale topographic mapping and engineering survey.,9809,,,In use from 1979.  To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+19934,Lithuania 1994,conversion,,,,,1145,Large and medium scale topographic mapping and engineering survey.,9807,,,,HNIT-BALTIC GeoInfoServisas,EPSG,1998-03-12 00:00:00,,1,0
+19935,Rectified Skew Orthomorphic Malaya Grid,conversion,,,,,1690,Large and medium scale topographic mapping and engineering survey.,9812,,,"If using Oblique Mercator method (code 9815), Ec=23505.515 chSe, Nc=21992.646 chSe.",UK Directorate of Overseas Surveys paper,EPSG,1999-10-20 00:00:00,97.231,1,0
+19936,Portuguese National Grid,conversion,,,,,1294,Large and medium scale topographic mapping and engineering survey for military purposes.,9807,,,Original transformation by Gauss-Kruger formula.,Instituto Portugues de Cartografia e Cadastro,EPSG,1998-11-11 00:00:00,95.30  96.29  98.42,1,0
+19937,Tunisia Mining Grid,conversion,,,,,1618,Minerals licencing,9816,,,Origin: Djebel Kebar,Mining decree of 1st January 1953,EPSG,1999-11-15 00:00:00,99.81,1,0
+19938,Estonian National Grid,conversion,,,,,1090,Large and medium scale topographic mapping and engineering survey.,9802,,,Coordinates at the projection origin match those of TM Baltic 93.,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1999-04-22 00:00:00,99.28,1,0
+19939,TM Baltic 93,conversion,,,,,1646,Large and medium scale topographic mapping and engineering survey.,9807,,,,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+19940,Levant Zone,conversion,,,,,1623,Large and medium scale topographic mapping and engineering survey.,9817,,,Superseded by projection using full Lambert formula  (EPSG code 19948) from 1973.,US Army Map Service projection tables; 1943.,EPSG,1999-04-22 00:00:00,,1,0
+19941,Brazil Polyconic,conversion,,,,,1053,Small scale mapping,9818,,,,PetroBras,EPSG,1999-10-20 00:00:00,99.55,1,0
+19942,British West Indies Grid,conversion,,,,,2295,Large and medium scale topographic mapping and engineering survey.,9807,,,,"UK Royal Engineers projection tables P10/25, 1943.",EPSG,1999-04-22 00:00:00,,1,0
+19943,Barbados National Grid,conversion,,,,,1042,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded British West Indies Grid (19942) after 1983.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+19944,Quebec Lambert Projection,conversion,,,,,1368,Medium and small scale mapping,9802,,,,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,1999-10-22 00:00:00,,1,0
+19945,New Brunswick Stereographic (ATS77),conversion,,,,,1447,Large and medium scale topographic mapping and engineering survey.,9809,,,In use from 1979.  To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1999-10-20 00:00:00,99.61,1,0
+19946,New Brunswick Stereographic (NAD83),conversion,,,,,1447,Large and medium scale topographic mapping and engineering survey.,9809,,,In use from 1999.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1999-10-20 00:00:00,,1,0
+19947,Austria Lambert,conversion,,,,,1037,Medium and small scale mapping,9802,,,,Bundesamt f�r Eich- und Vermessungswesen,EPSG,2000-01-07 00:00:00,99.94,1,0
+19948,Syria Lambert,conversion,,,,,1623,Large and medium scale topographic mapping and engineering survey.,9801,,,Superseded Levant zone using same parameters but truncated near-conformal method (code 19940) from 1973.,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+19949,Levant Stereographic,conversion,,,,,1623,Large and medium scale topographic mapping and engineering survey.,9809,,,Used  prior to World War II for cadastral and large scale topographic mapping.,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+19950,Landesvermessung 1995,conversion,,,,,1286,Large and medium scale topographic mapping and engineering survey.,9815,,,,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,1,0
+19951,Nakhl e Taqi Oblique Mercator,conversion,,,,,1338,Large and medium scale topographic mapping and engineering survey.,9815,,,Used only for terminal site.,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+19952,Krovak,conversion,,,,,1306,Large and medium scale topographic mapping and engineering survey.,9819,,,,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,1,0
+19953,Qatar Grid,conversion,,,,,1346,Large and medium scale topographic mapping and engineering survey.,9806,,,,Maersk Oil and Gas,EPSG,2000-03-07 00:00:00,,1,0
+19954,Suriname Old TM,conversion,,,,,1222,Large and medium scale topographic mapping and engineering survey.,9807,,,Introduced in 1975.  Superseded by Suriname TM in 1979.,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+19955,Suriname TM,conversion,,,,,1222,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded Suriname Old TM in 1979 (scale factor changed).,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+19956,Rectified Skew Orthomorphic Borneo Grid (chains),conversion,,,,,1362,Large and medium scale topographic mapping and engineering survey.,9815,,,See 19957 and 19958 for feet and metres versions. If using Hotine Oblique Mercator method (code 9812) FE = FN = 0 chSe.  Being superseded by metric version (code 19958).,Directorate of Colonial Surveys projection tables 1954 revision.,EPSG,2002-07-13 00:00:00,2002.47,1,0
+19957,Rectified Skew Orthomorphic Borneo Grid (feet),conversion,,,,,1851,Large and medium scale topographic mapping and engineering survey.,9815,,,See 19956 and 19958 for chains and metres versions. If using Hotine Oblique Mercator method (code 9812) FE = FN = 0 ftSe.   Being superseded by metric version (code 19958).,EPSG unit conversion of Directorate of Colonial Surveys projection tables 1954 revision.,EPSG,2002-07-13 00:00:00,2002.47,1,0
+19958,Rectified Skew Orthomorphic Borneo Grid (metres),conversion,,,,,1362,Large and medium scale topographic mapping and engineering survey.,9815,,,See 19956 and 19957 for chains and feet versions.  Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  If using Hotine Oblique Mercator method (code 9812) FE = FN = 0 m.,EPSG unit conversion of Directorate of Colonial Surveys projection tables 1954 revision.,EPSG,2000-10-19 00:00:00,,1,0
+19959,Ghana National Grid,conversion,,,,,1104,Large and medium scale topographic mapping and engineering survey.,9807,,,Superseded by Ghana metric grid (code 19904).,Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+19960,Prince Edward Isl. Stereographic (NAD83),conversion,,,,,1533,Large and medium scale topographic mapping and engineering survey.,9809,,,False Easting and False Northing changed from values used with ATS77  (which were FE=700000m; FN=400000m) to these new values when used with NAD83 (CSRS).   New values are FE=400000m; FN=800000m; adopted in 2000.,PEI Department of Transportation & Public Works; Mr. Serge Bernard,EPSG,2000-10-19 00:00:00,,1,0
+19961,Belgian Lambert 72,conversion,,,,,1347,Large and medium scale topographic mapping and engineering survey.,9802,,,"Introduced in 2000. Equivalent to Belge Lambert 72 (code 19902).  
+If software cannot handle latitude of false origin of 90 deg N, use latitude of false origin = 50� 47' 57.704"" with northing at false origin = 165 372.956 m.",IGN Brussels www.ngi.be/FR/FR2-1-5-1.shtm and EuroGeographics; http://crs.ifag.de/,EPSG,2000-10-19 00:00:00,,1,0
+19962,Irish Transverse Mercator,conversion,,,,,1305,Large and medium scale topographic mapping and engineering survey.,9807,,,,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+19963,Sierra Leone New Colony Grid,conversion,,,,,1342,Topographic mapping and engineering survey.,9807,,,Supersedes the Sierra Leone Colony Grid. New grid is 422.3 ft west and 112.1 ft south of old grid.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+19964,New War Office Sierra Leone Grid,conversion,,,,,1342,Topographic mapping and engineering survey.,9807,,,Supersedes the War Office Sierra Leone Grid. New grid is 422.3 ft west and 112.1 ft south of old grid.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+19965,US National Atlas Equal Area,conversion,,,,,1245,Statistical mapping,9821,,,,"United States Geological Survey, Western Geographic Science Center.",EPSG,2001-06-05 00:00:00,,1,0
+19966,Luxembourg Gauss,conversion,,,,,1146,Large and medium scale topographic mapping and engineering survey.,9807,,,,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+19967,Slovenia Grid,conversion,,,,,1212,Large and medium scale topographic mapping and engineering survey.,9807,,,,Geodetska Uprava Republike Slovenije via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+19968,Plate Carree,conversion,,,,,1262,Graticule coordinates in rectangular Cartesian form.,9823,,,Origin at intersection of equator and prime meridian.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+19969,Portuguese Grid,conversion,,,,,1294,Large and medium scale topographic mapping and engineering survey.,9807,,,Original transformation by Gauss-Kruger formula.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+19971,New Zealand Transverse Mercator,conversion,,,,,1175,Large and medium scale topographic mapping and engineering survey.,9807,,,,Land Information New Zealand,EPSG,2001-08-28 00:00:00,,1,0
+19972,Irish Grid,conversion,,,,,1305,Large and medium scale topographic mapping and engineering survey.,9807,,,Defined as part of the 1965 and 1975 mapping adustments in which the scale factor was introduced as a best fit to retain existing grid coordinates.,Ordnance Survey of Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+19973,Irish National Grid,conversion,,,,,2530,Large and medium scale topographic mapping and engineering survey.,9807,,,Used only with the 1952 geodetic adjustment. Superseded by the 1975 Mapping Adjustment: see code 19972.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+19974,Modified Portuguese Grid,conversion,,,,,1294,Large and medium scale topographic mapping and engineering survey.,9807,,,Applied to Datum 73. Grid position at origin is coincident with the unmodified grid applied to Lisbon datum.,Instituto Portugues de Cartografia e Cadastro via EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+19975,Trinidad Grid (Clarke's feet),conversion,,,,,1339,Oil industry exploration and production.,9806,,,"Foot version of EPSG code 19925. Not an official system, but used by some US-based organisations including Amoco Trinidad.",BP,EPSG,2002-02-12 00:00:00,,1,0
+19976,ICN Regional,conversion,,,,,1251,Small scale topographic and geological mapping.,9802,,,,Institute Cartografica Nacional,EPSG,2002-02-12 00:00:00,,1,0
+19977,Aramco Lambert,conversion,,,,,1206,Oil industry exploration and production.,9802,,,Used by Saudi Aramco when area of interest crosses UTM zone boundary. Adopted by partners for Core Venture 1 (South Ghawar) area.,Saudi Aramco,EPSG,2002-02-12 00:00:00,,1,0
+19978,Hong Kong 1980 Grid,conversion,,,,,1118,"Large scale topographic mapping, cadastral and engineering survey.",9807,,,"Grid origin is Partiridge Hill triangulation station (old trig ""2"").","Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+19979,Portugal Bonne,conversion,,,,,1294,"1:50,000 topographic mapping.",9828,,,,"Instituto Portugues de Cartografia e Cadastro, http://www.ipcc.pt/portuguese/produtos/cartografia/50m.html",EPSG,2002-07-13 00:00:00,,1,0
diff --git a/src/tiff/csv/coordinate_operation_method.csv b/src/tiff/csv/coordinate_operation_method.csv
new file mode 100644
index 0000000..bc0956c
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_method.csv
@@ -0,0 +1,1513 @@
+"COORD_OP_METHOD_CODE","COORD_OP_METHOD_NAME","REVERSE_OP","FORMULA","EXAMPLE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+9601,Longitude rotation,1,Target_longitude = Source_longitude + longitude_offset.,,This transformation allows calculation of the longitude of a point in the target system by adding the parameter value to the longitude value of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9602,Geographic/geocentric conversions,1,"Latitude, P, and Longitude, L, in terms of Geographic Coordinate Reference System A may 
+be expressed in terms of a geocentric (earth centred) Cartesian coordinate reference system X, Y, Z 
+with the Z axis corresponding with the Polar axis positive northwards, the X axis through 
+the intersection of the Greenwich meridian and equator, and the Y axis through the 
+intersection of the equator with longitude 90 degrees E. If the prime meridian for geogCRS A is not 
+Greewich, longitudes must first be transformed to their Greenwich equivalent. If the earth's 
+spheroidal semi major axis is a, semi minor axis  b, and inverse flattening 1/f,  then
+
+   XA=   (nu + hA) cos P cos L
+   YA=   (nu + hA) cos P sin L
+   ZA=  ((1 - e^2) nu + hA) sin P
+
+where nu is the prime vertical radius of curvature at latitude P and is equal to 
+   nu = a /(1 - e^2*sin^2(P))^0.5,
+   P and L are respectively the latitude and longitude (related to Greenwich) of the point 
+   h is height above the ellipsoid, (topographic height plus geoidal height), and
+   e is the eccentricity of the ellipsoid where e^2 = (a^2 -b^2)/a^2 = 2f -f^2
+                                                                                                                                                 
+Cartesian coordinates in geocentric coordinate reference system B may be used to derive geographical coordinates in terms of geographic coordinate reference system B by:
+   P   =  arctan (ZB + e^2* nu*sin P) / (XB^2 + YB^2)^0.5 by iteration
+   L   = arctan YB/XB
+   hB  =  XB sec L sec P  - nu
+
+where LB is relative to Greenwich. If the geographic system has a non Greenwich prime 
+meridian, the Greenwich value of the local prime meridian should be applied to longitude.
+
+(Note that h is the height above the ellipsoid. This is the height value which is 
+delivered by Transit and GPS satellite observations but is not the topographic 
+height value which is normally used for national mapping and levelling operations. 
+The topographic height is usually the height above mean sea level or an alternative 
+level reference for the country. If one starts with a topographic height,  it will be 
+necessary to convert it to an ellipsoid height before using the above transformation 
+formulas. h = N + H, where N is the geoid height above the ellipsoid at the point 
+and is sometimes negative, and H is the height of the point above the geoid. The 
+height above the geoid is often taken to be that above mean sea level, perhaps with 
+a constant correction applied. Geoid heights of points above the nationally used 
+ellipsoid may not be readily available. For the WGS84 ellipsoid the value of N, 
+representing the height of the geoid relative to the ellipsoid, can vary between 
+values of -100m in the Sri Lanka area to +60m in the North Atlantic.)","Consider a North Sea point with coordinates derived by GPS satellite in the WGS 84 geographical coordinate system with coordinates of:
+
+           latitude    53 deg 48 min 33.82 sec N, 
+           longitude 02 deg 07 min 46.38 sec E, 
+    and ellipsoidal height 73.0m, 
+
+whose coordinates are required in terms of the ED50 geographical coordinate system which takes the International 1924 ellipsoid. The three parameter datum shift from WGS 84 to ED50 for this North Sea area is given as dX = +84.87m, dY = +96.49m, dZ = +116.95m. 
+
+The WGS 84 geographical coordinates convert to the following geocentric values using the above formulas for X, Y, Z:
+
+   XA = 3771 793.97m
+   YA =   140 253.34m
+   ZA = 5124 304.35m
+
+Applying the quoted datum shifts to these, we obtain new geocentric values now related to ED50:
+
+   XB = 3771 878.84m
+   YB =   140 349.83m
+   ZB = 5124 421.30m
+
+These convert to ED50 values on the International 1924 ellipsoid as:
+           latitude    53 deg 48 min 36.565 sec N, 
+           longitude 02 deg 07 min 51.477 sec E, 
+    and ellipsoidal height 28.02 m, 
+
+Note that the derived height is referred to the International 1924 ellipsoidal surface and will need a further correction for the height of the geoid at this point in order to relate it to Mean Sea Level.","This is a parameter-less conversion.   It is often concatenated in applications with the 3- or 7-parameter transformations 9603, 9606 and 9607 to form a geographic to geographic transformation.","EPSG guidance note #7 from ""Transformation from spatial to geographical coordinates""; B [...]
+9603,Geocentric translations,1,Xt = Xs + dX;  Yt = Ys + dY;  Zt = Zs + dZ,"Given a three parameter datum shift from WGS 84 to ED50 for this North Sea area is given as 
+dX = +84.87m, dY = +96.49m, dZ = +116.95m. 
+
+The WGS84 geographical coordinates convert to the following WGS 84 geocentric values using 
+the above formulas for X, Y, Z:
+
+   XA = 3771 793.97m
+   YA =   140 253.34m
+   ZA = 5124 304.35m
+
+Applying the given datum shifts to these, we obtain new geocentric values now related 
+to ED50:
+
+   XB = 3771 878.84m
+   YB =   140 349.83m
+   ZB = 5124 421.30m",This transformation allows calculation of coordinates in the target system by adding the parameter value to the corresponding coordinate values of the point in the source system.,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9604,Molodenski,1,See information source.,See information source.,,,EPSG,1996-09-18 00:00:00,,0
+9605,Abridged Molodenski,1,"As an alternative to the computation of the new latitude, longitude and height above ellipsoid in discrete steps through geocentric coordinates, the changes in these geographic coordinates may be derived directly by formulas derived by Molodenski. Abridged versions of these formulas, which are quite satisfactory for three parameter transformations, are as follows:
+
+Dlat "" = [(-dX*sin(lat)*cos(lon)) - (dY*sin(lat)*sin(lon)) + (dZ*cos(lat)) + (((a*Df) + (f*Da))*sin(2*lat))] / (rho * sin(1""))
+
+Dlon "" = (-dX*sin(lon) + dY*cos(lon)) / ((nu*cos(lat)) * sin(1""))
+
+Dh = (dX*cos(lat)*cos(lon)) + (dY*cos(lat)*sin(lon)) + (dZ*sin(lat)) + ((a*Df + f*Da)*(sin(lat)^2)) - Da
+
+where the dX, dY and dZ terms are as before, and rho and nu are the meridian and prime vertical radii of curvature at the given latitude (lat) on the first ellipsoid, Da is the difference in the semi-major axes (a1 - a2) of the first and second ellipsoids and Df  is the difference in the flattening of the two ellipsoids.
+
+The formulas for Dlat and Dlon indicate changes in latitude and longitude in arc-seconds.",See information source.,"This transformation is a truncated Taylor series expansion of a transformation between two geographic coordinate systems, modelled as a set of geocentric translations.",EPSG guidance note #7.,EPSG,1999-04-22 00:00:00,99.01,0
+9606,Position Vector 7-param. transformation,1,"Transformation of coordinates from one geographic coordinate reference system into another (also known as a ""datum transformation"") is usually carried out as an implicit concatenation of three transformations:
+[geographical to geocentric >> geocentric to geocentric >> geocentric to geographic]
+
+The middle part of the concatenated transformation, from geocentric to geocentric, is usually described as a simplified 7-parameter Helmert transformation, expressed in matrix form with 7 parameters, in what is known as the ""Bursa-Wolf"" formula:
+
+   (Xt)             (  1       -Rz    +Ry)      (Xs)     (dX)
+   (Yt)  =  M *  ( +Rz      1      -Rx)  *  (Ys)  + (dY)
+   (Zt)              ( -Ry   +Rx       1 )      (Zs)      (dZ)
+
+The parameters are commonly referred to defining the transformation ""from source coordinate reference system to target coordinate reference system"", whereby (Xs, Ys, Zs) are the coordinates of the point in the source geocentric coordinate reference system and (Xt, Yt, Zt) are the coordinates of the point in the target geocentric coordinate reference system.  But that does not define the parameters uniquely; neither is the definition of the parameters implied in the formula, as is often [...]
+
+(dX, dY, dZ)   :Translation vector, to be added to the point's position vector in the source coordinate reference system in order to transform from source system to target system; also: the coordinates of the origin of the source coordinate reference system in the target coordinate reference system.
+
+(Rx, Ry, Rz)   :Rotations to be applied to the point's vector.  The sign convention is such that a positive rotation about an axis is defined as a clockwise rotation of the position vector when viewed from the origin of the Cartesian coordinate reference system in the positive direction of that axis; e.g. a positive rotation about the Z-axis only from source system to target system will result in a larger longitude value for the point in the target system.  Although rotation angles may b [...]
+
+M                  :The scale correction to be made to the position vector in the source coordinate reference system in order to obtain the correct scale in the target coordinate reference system. M = (1 + dS*10^-6), where dS is the scale correction expressed in parts per million. 
+
+<<<<<This text continues in the description of the Coordinate Frame Rotation formula>>>>>","Input point: 
+Coordinate reference system: WGS 72 (geographic 3D)
+  Latitude =   55 deg 00 min 00 sec 
+  Longitude =  4 deg 00 min 00 sec 
+  Ellipsoidal height =  0 m
+
+This transforms to Cartesian geocentric coords:
+    X = 3 657 660.66 (m)  
+    Y =    255 768.55 (m)
+    Z = 5 201 382.11 (m)
+
+Transformation parameters WGS 72 to WGS 84:
+   dX (m) = 0.000 
+   dY (m) = 0.000 
+   dZ (m) = +4.5
+   RX ("") = 0.000 
+   RY ("") = 0.000
+   RZ ("") = +0.554
+   Scale (ppm) = +0.219
+
+Application of the 7 parameter Position Vector Transformation results in WGS 84 coordinates of:
+   X = 3 657 660.78 (m)
+   Y =    255 778.43 (m)
+   Z = 5 201 387.75 (m)
+
+This converts into:
+   Latitude =   55 deg 00 min 00.090 sec
+   Longitude =  4 deg 00 min 00.554 sec
+   Ellipsoidal height =  +3.22 m
+on the WGS 84 geographic 3D coordinate reference system.",Note the analogy with the Coordinate Frame Rotation (code 9607) but beware of the differences!  The Position Vector convention is used by IAG and recommended by ISO 19111.,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,98.16,0
+9607,Coordinate Frame rotation,1,"<<<<<This text is continued from the description of the Position Vector Transformation formula>>>>>
+
+Although being common practice particularly in the European E&P industry, the Position Vector Transformation sign convention is not universally accepted.  A variation on this formula is also used, particularly in the USA E&P industry.  That formula is based on the same definition of translation and scale parameters, but a different definition of the rotation parameters.  The associated convention is known as the ""Coordinate Frame Rotation"" convention (EPSG coordinate operation method c [...]
+The formula is:
+
+   (X�)             (  1      +Rz      -Ry)     (X)      (dX)
+   (Y�)  =  M *  ( -Rz       1      +Rx)  * (Y)  +  (dY)
+   (Z�)              ( +Ry   -Rx        1 )     (Z)       (dZ)
+
+and the parameters are defined as:
+
+(dX, dY, dZ)   : Translation vector, to be added to the point's position vector in the source coordinate reference system in order to transform from source coordinate reference system to target coordinate reference system; also: the coordinates of the origin of source coordinate reference system in the target frame.
+
+(Rx, Ry, Rz)   : Rotations to be applied to the coordinate reference frame.  The sign convention is such that a positive rotation of the frame about an axis is defined as a clockwise rotation of the coordinate reference frame when viewed from the origin of the Cartesian coordinate reference system in the positive direction of that axis, that is a positive rotation about the Z-axis only from source coordinate reference system to target coordinate reference system will result in a smaller  [...]
+
+M                  : The scale factor to be applied to the position vector in the source coordinate reference system  in order to obtain the correct scale of the target coordinate reference system. M = (1+dS*10^-6), where dS is the scale correction expressed in parts per million.
+
+In the absence of rotations the two formulas are identical; the difference is solely in the rotations. The name of the second method reflects this.
+
+Note that the same rotation that is defined as positive in the first method is consequently negative in the second and vice versa.  It is therefore crucial that the convention underlying the definition of the rotation parameters is clearly understood and is communicated when exchanging datum transformation parameters, so that the parameters may be associated with the correct coordinate transformation method (algorithm).","The same example as for the Position Vector Transformation (coordi [...]
+
+Transformation parameters Coordinate Frame Rotation convention:
+dX (m) = 0.000 
+dY (m) = 0.000 
+dZ (m) = +4.5 
+RX ("") = 0.000
+RY ("") = 0.000
+RZ ("") = -0.554
+Scale (ppm) = +0.219
+
+Please note that only the rotation has changed sign as compared to the Position Vector Transformation.",Note the analogy with the Position Vector transformation (code 9606) but beware of the differences!  The Position Vector convention is used by IAG and recommended by ISO 19111.,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9613,NADCON,1,See information source.,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Input expects longitudes to be positive west.,US Coast and geodetic Survey - http://www.ngs.noaa.gov,EPSG,1996-09-18 00:00:00,,0
+9614,NTv1,1,See information source.,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Superseded in 1997 by NTv2 (transformation method code 9615).   Input expects longitudes to be positive west.,Geomatics Canada - Geodetic Survey Division.,EPSG,1997-11-13 00:00:00,,0
+9615,NTv2,1,See information source.,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Supersedes  NTv1 (transformation method code 9614).  Input expects longitudes to be positive west.,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,1997-11-13 00:00:00,,0
+9616,Vertical Offset,1,"Xt = [(Xs * Us) + (A * Ua)] * (m / Ut)
+
+where 
+Xt = value in the target vertical coordinate reference system.
+
+Xs = value in the source vertical coordinate reference system; 
+
+A is the value of the origin of the target system in the source system.
+
+m is unit direction multiplier (m=1 if both systems are height or both are depth; m = �1 if one system is height and the other system is depth; the value of m is implied through the vertical coordinate reference system type attribute).
+
+Us Ut and Ua are unit conversion ratios to metres for the source and target systems and the offset value A respectively.",,This transformation allows calculation of height (or depth) in the target system by adding the parameter value to the height (or depth)-value of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9617,Madrid to ED50,0,"The polynomial expressions are:
+
+      dLat seconds = A0 + (A1*lat) + (A2*lon) + (A3*H)
+      dLon seconds = B00 + B0 + (B1*lat) + (B2*lon) + (B3*H)
+
+where latitude lat and longitude lon are in decimal degrees referred to the Madrid 1870 (Madrid) geographic coordinate reference system and H is gravity-related height in metres.  B00 is the longitude (in seconds) of the Madrid meridian measured from the Greenwich meridian; it is the value to be applied to a longitude relative to the Madrid meridian to transform it to a longitude relative to the Greenwich meridan.
+
+The results of these expressions are applied through the formulae:
+Lat(ED50) = Lat(M1870(M))  + dLat
+and Lon(ED50) = Lon(M1870(M))  + dLon.","Input point coordinate system: Madrid 1870 (Madrid) (geographic 3D)
+   Latitude    =  42 deg 38 min 52.77 sec N 
+                    = 42.647992 degrees
+   Longitude  =    3 deg 39 min 34.57 sec E of Madrid
+                     = +3.659603 degrees from the Madrid meridian.
+   Height        =  0 m
+
+For the north zone transformation:
+A1 = 11.328779
+A2 = -0.1674
+A3 = -0.03852
+A4 = 0.0000379
+B0 = -13276.58
+B1 = 2.5079425
+B2 = 0.8352
+B3 = -0.00864
+B4 = -0.0000038
+
+dLat = +4.05 seconds
+
+Then ED50 latitude = 42 deg 38 min 52.77 sec N + 4.05sec
+                               = 42 deg 38 min 56.82 sec N
+
+
+dLon = -13270.54 seconds  = -3 deg 41 min 10.54 sec
+
+Then ED50 longitude = 3 deg 39 min 34.57 sec E - 3 deg 41 min 10.54 sec
+                                  = 0 deg 01 min 35.97 sec W of Greenwich.",,"EPSG guidance note #7, after Institut de Geomatica; Barcelona.",EPSG,2000-03-07 00:00:00,99.284  99.82  99.64,0
+9618,Geographical and Height Offsets,1,"Lat_T = Lat_S + latitude_offset 
+Lon_T = Lon_S + longitude_offset 
+EllipsoidHeight_T = GravityHeight_S + gravity-related_to_ellipsoid_height_offset.",,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9619,Geographical Offsets,1,"Lat_T = Lat_S + latitude_offset 
+Lon_T = Lon_S + longitude_offset.",,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,EPSG guidance note #7.,EPSG,1999-11-12 00:00:00,99.79,0
+9620,Norway Offshore Interpolation,0,See information source.,,,"Norwegian Mapping Authority note of 13-Feb-1991 ""Om Transformasjon mellom Geodetiske Datum i Norge"".",EPSG,1999-04-22 00:00:00,,0
+9621,Similarity transformation,0,"The similarity transformation in algebraic form is:
+
+XT = XT0  + XS. dS. cos q  + YS. dS . sin q
+YT = YT0  � XS. dS. sin q  + YS. dS . cos q
+
+where:
+XT0 , YT0    =   the coordinates of the origin point of the source coordinate reference system expressed in the target coordinate reference system;
+1+dS           =  the length of one unit in the source coordinate reference system expressed in units of the target coordinate reference system;
+q                  = the angle about which the axes of the source coordinate reference system need to be rotated to coincide with the axes of the target coordinate reference system, counter-clockwise being positive. Alternatively, the bearing of the source coordinate reference system Y-axis measured relative to target coordinate reference system north.
+
+The similarity transformation can also be described as a special case of the parametric affine transformation where coefficients A1 = B2  and  A2 =  - B1.
+
+Reversibility
+In contrast with the affine transformation, the similarity transformation parameters are reversible, but only on the condition that the scale difference between the two coordinate systems is small (order of several parts per million).  Then dS is the deviation from unity of the ratio of the units of measure of the two coordinate reference systems. In these cases the reverse transformation would require a scale correction of 1/(1+dS) * (1-dS).  This enables usage of the same scale and rot [...]
+Target coordinate system:	Campo Inchauspe / Argentina 2 (projected 2D system)
+
+Note that for the Astra Minas Grid the coordinate axes are:
+X  (positive axis oriented north)
+Y  (positive axis oriented west)
+and coordinates are quoted in that order.
+
+whereas for Campo Inchauspe / Argentina 2 the axes are:
+X (positive axis oriented north)
+Y (positive axis oriented east)
+and coordinates are quoted in that order.
+
+Thus the Astra Minas grid X and Y axes map to the Campo Inchauspe / Argentina 2 Y and X-axes respectively.  With respect to the symbols in the formulas,
+XS  = Astra Minas X
+YS  = Astra Minas Y
+XT  = Campo Inchauspe / Argentina 2 Y
+YT  = Campo Inchauspe / Argentina 2 X
+
+Parameters of the similarity transformation:
+XT0	=	2610200.48 metre
+YT0	=	4905282.73 metre
+*	= 271o 05� 30�  = 271.0916667 degrees
+k	= 0  whence (1+k)=1.0
+
+Forward calculation for Astra Minas point :  X (north) =10000 m, Y (west) =50000 m. 
+
+XS  = Astra Minas X = 10000
+YS  = Astra Minas Y = 50000
+
+Gauss-Kruger zone 2 Easting (Y) = XT = XT0  + XS. dS. cos q  + YS. dS . sin q
+					  = 2610200.48 + (50000 * 1.0 * cos(271.0916667deg)) 
+						+ (10000 * 1.0 * sin(271.0916667deg))
+					  = 2601154.90 m.
+
+Gauss-Kruger zone 2 Northing (X) =YT = YT0  � XS. dS. sin q  + YS. dS . cos q
+				    = 4905282.73 - (50000*1.0* sin(271.0916667deg))
+					+ (10000 * 1.0 * cos(271.0916667deg))
+						    = 4955464.17 m.",Defined for two-dimensional coordinate systems.,EPSG guidance note #7.,EPSG,2000-10-19 00:00:00,2000.83,0
+9622,Affine orthogonal geometric transformation,0,"XT = XT0   +   XS .  k . dSX . cos q   +   YS .  k .  dSY  . sin q
+YT = YT0   �   XS .  k .  dSX . sin q    +   YS .  k .  dSY  . cos q
+
+where:
+
+XT0 ,YT0  = the coordinates of the origin point of the source coordinate reference system, expressed in the target coordinate reference system;
+dSX , dSY  = the length of one unit of the source  axis, expressed in units of the target axis, for the X axes and the Y- axes respectively;
+k = point scale factor of the target coordinate reference system in a chosen reference point;
+q  = the angle through which the source coordinate reference system axes must be rotated to coincide with the target coordinate refderence system axes (counter-clockwise is positive). Alternatively, the bearing (clockwise positive) of the source coordinate reference system Y-axis measured relative to target coordinate reference system north.","Source coordinate system: imaginary 3D seismic acquisition bin grid.  The two axes are orthogonal, but the unit on the I-axis is 25 metres, whilst [...]
+The target projected coordinate system is WGS 84 / UTM Zone 31N and the origin of the bin grid (centre of bin 0,0) is defined at E = 456781.0, N = 5836723.0.  The projected coordinate system point scale factor at the bin grid origin is 0.99984.
+The map grid bearing of the I and J axes are 110* and 20* respectively.  Thus the angle through which both the positive I and J axes need to be rotated to coincide with the positive Easting axis and Northing axis respectively is +20 degrees.
+
+Hence: 
+XT0 ,	=    456 781.0 m
+YT0	= 5 836 723.0 m
+dSX 	= 25
+dSY	= 12.5
+k 	= 0.99984
+q	= +20 degrees
+
+Forward calculation for centre of bin with coordinates: I = 300, J = 247:
+
+XT = Easting   = XT0   +   XS . k . dSX . cos q   +   YS . k . dSY  . sin q    = 464 855.62 m.
+
+YT = Northing = YT0   �   XS . k . dSX . sin q    +   YS . k . dSY  . cos q  = 5 837 055.90 m
+
+Reverse calculation for this point:
+XS = [( XT  � XT0) . cos qY  �  (YT � YT0) . sin qY ] / [k . dSX  . cos (qX � qY)] = 230 bins
+
+YS = [(XT   � XT0) . sin qX   +  (YT � YT0) . cos qX ] / [k . dSY . cos (qX � qY)]  = 162 bins",,EPSG guidance note #7.,EPSG,2000-06-10 00:00:00,,0
+9623,Affine general geometric transformation,0,"The geometric representation of the general affine transformation:
+XT = XT0   +  XS . k . dSX  . cos qX   +  YS . k . dSY  . sin qY
+YT = YT0  �  XS . k . dSX   . sin qX   +  YS . k. dSY  . cos qY 
+where:
+
+XT0 ,YT0  = the coordinates of the origin point of the source coordinate reference system, expressed in the target coordinate reference system;
+dSX , dSY  = the length of one unit of the source axis, expressed in units of the target axis, for the first and second source and target axis pairs respectively;
+qX , qY   = the angles about which the source coordinate reference system axes XS and YS must be rotated to coincide with the target coordinate reference system axes XT and YT respectively (counter-clockwise being positive).
+k = point scale factor of the target coordinate reference system in a chosen reference point;
+ 
+Comparing the algebraic representation with the parameters of the parameteric form (code 9624) it can be seen that the parametric and geometric forms of the affine transformation are related as follows:
+A0  =  XT0
+A1  = k . dSX . cos qX  
+A2  = k . dSY . sin qY
+B0  =  YT0
+B1  =   � k . dSX . sin qX
+B2  =   k . dSY . cos qY
+
+Reversibility
+The parameters for an affine transformation cannot be used for the reverse transformation.  However, the reverse transformation is another affine transformation using the same formulas but with different parameters.  The reverse parameter values can be calculated from from the formulae provided above and applying those to same algorithm.  Alternatively the reverse transformation can be described by a different formula, as shown below, using the same parameters as the forward transformation:
+
+XS = [( XT  � XT0) . cos qY  �  (YT � YT0) . sin qY ] / [k . dSX  . cos (qX � qY)]
+YS = [(XT   � XT0) . sin qX   +  (YT � YT0) . cos qX ] / [k . dSY . cos (qX � qY)]",,,EPSG guidance note #7.,EPSG,2000-06-10 00:00:00,,0
+9624,Affine general parametric transformation,0,"XT   =  A0  +  A1. XS  +  A2.YS
+YT   =  B0  +  B1. XS  +  B2.YS
+where
+XT , YT  are the coordinates of a point P in the target coordinate reference system;
+XS , YS   are the coordinates of P in the source coordinate reference system.
+
+Reversibility
+The parameter values for an affine transformation cannot be used for the reverse transformation.  However, the reverse transformation is another affine transformation using the same formulas but with different parameter values.  The reverse parameter values, indicated by a prime (�), can be calculated from those of the forward transformation as follows:
+
+D    = A1 . B2   �   A2 . B1
+A0� = (A2 . B0   �   B2 . A0) / D
+B0� = (B1 . A0   �   A1 . B0) / D
+A1� = +B2 / D
+A2� = � A2 / D
+B1� = � B1 / D
+B2� = +A1 / D",,,EPSG guidance note #7,EPSG,2000-06-10 00:00:00,,0
+9625,General polynomial (2nd-order),0,"The simplest of all polynomials is the general polynomial function. In order to avoid problems of numerical instability this type of polynomial should be used after reducing the input parameters, usually coordinate offsets U and V relative to a central evaluation point, to �manageable� numbers, between �10 and +10 at most.
+
+U = XS - XS0 in defined units (which may not be those of the coordinate reference system),
+V = YS - YS0
+
+Then (XT - XT0) = (XS - XS0) + dX
+         (YT - YT0) = (YS - YS0) + dY 
+or
+XT  = XS - XS0 + XT0 + dX
+YT  = YS - YS0 + YT0 + dY
+
+where
+XT , YT   are coordinates in the target coordinate reference system,
+XS , YS  are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0  are coordinates of the evaluation point in the target coordinate reference system.
+
+and where
+dX = A0 + A1.U + A2.V + A3.U2 + A4.U.V + A5.V2
+dY = B0 + B1.U + B2.V +B3.U2 +B4.U.V +B5.V2",,,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9626,General polynomial (3rd-order),0,"The simplest of all polynomials is the general polynomial function. In order to avoid problems of numerical instability this type of polynomial should be used after reducing the input parameters, usually coordinate offsets U and V relative to a central evaluation point, to �manageable� numbers, between �10 and +10 at most.
+
+U = XS - XS0 in defined units (which may not be those of the coordinate reference system),
+V = YS - YS0
+
+Then (XT - XT0) = (XS - XS0) + dX
+         (YT - YT0) = (YS - YS0) + dY 
+or
+XT  = XS - XS0 + XT0 + dX
+YT  = YS - YS0 + YT0 + dY
+
+where
+XT , YT   are coordinates in the target coordinate reference system,
+XS , YS  are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0  are coordinates of the evaluation point in the target coordinate reference system.
+
+and where
+dX = A0 + A1.U + A2.V + A3.U2 + A4.U.V + A5.V2 + A6.U3 + A7.U2.V + A8.U.V2 + A9.V3
+dY = B0 + B1.U + B2.V +B3.U2 +B4.U.V +B5.V2 + B6.U3 +B7.U2.V +B8.U.V2 +B9.V3",,,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9627,General polynomial (4th-order),0,"The simplest of all polynomials is the general polynomial function. In order to avoid problems of numerical instability this type of polynomial should be used after reducing the input parameters, usually coordinate offsets U and V relative to a central evaluation point, to �manageable� numbers, between �10 and +10 at most.
+
+U = XS - XS0 in defined units (which may not be those of the coordinate reference system),
+V = YS - YS0
+
+Then (XT - XT0) = (XS - XS0) + dX
+         (YT - YT0) = (YS - YS0) + dY 
+or
+XT  = XS - XS0 + XT0 + dX
+YT  = YS - YS0 + YT0 + dY
+
+where
+XT , YT   are coordinates in the target coordinate reference system,
+XS , YS  are coordinates in the source coordinate reference system,
+XS0 , YS0 are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0  are coordinates of the evaluation point in the target coordinate reference system.
+
+and where
+dX = A0 + A1.U + A2.V + A3.U2 + A4.U.V + A5.V2 + A6.U3 + A7.U2.V + A8.U.V2 + A9.V3 + A10.U4 + A11.U3.V + A12.U2.V2 + A13.U.V3 + A14.V4
+
+dY = B0 + B1.U + B2.V +B3.U2 +B4.U.V +B5.V2 + B6.U3 +B7.U2.V +B8.U.V2 +B9.V3 + B10.U4 + B11.U3.V + B12.U2.V2 + B13.U.V3 + B14.V4",,,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9628,Reversible polynomial (2nd-order),1,See EPSG Guidance Note 7.,,Reversibility is subject to constraints.  See Guidance Note 7 for clarification.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.64,0
+9629,Reversible polynomial (3rd-order),1,See EPSG Guidance Note 7.,,Reversibility is subject to constraints.  See Guidance Note 7 for clarification.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.64,0
+9630,Reversible polynomial (4th-order),1,See EPSG Guidance Note 7.,"For geodetic transformation ED50 to ED87 (1)
+
+Offset unit:  degree
+Ordinate 1 of evaluation point X0  =   55� 00' 00.000""N  = +55 degrees
+Ordinate 2 of evaluation point Y0  =     0� 00' 00.000""E   =   +0 degrees
+
+Parameters:
+A0 = -5.56098E-06   A1 = -1.55391E-06   ...   A14 = -4.01383E-09
+B0 = +1.48944E-05   B2 = +2.68191E-05  ...   B14 = +7.62236E-09
+
+Forward calculation for: 
+ED50 Latitude     = Xs =52* 30�30""N   =     +52.508333333 degrees
+ED50 Longitude  = Ys =  2*E=      +2.0 degrees   
+
+U = XS - X0 =  * ED50 - X0  = 52.508333333 - 55.0 = -2.491666667 degrees
+V = YS - Y0 =  * ED50 - Y0   = 2.0 - 0.0 = 2.0 degrees
+
+dX = A0 + A1.U + ... + A14.V4
+      = -5.56098E-06 + (-1.55391E-06 * -2.491666667) + ... + (-4.01383E-09 * 2.0^4)
+      = -3.12958E-06 degrees
+
+dY = B0 + B1.U + ... + B14.V4
+      = +1.48944E-05 + (2.68191E-05 * -2.491666667) + ... + (7.62236E-09 * 2.0^4)
+      = +9.80126E-06 degrees
+
+Then  ED87 Latitude  =   XT = XS + dX
+                                  =  52.508333333 - 3.12958E-06   degrees
+                                  = 52* 30� 29.9887"" N
+
+ED87 Longitude  =   YT = YS + dY
+                           = 2* 00� 00.0353"" E
+
+
+Reverse calculation for transformation ED50 to ED87 (1).
+The transformation method for the ED50 to ED87 (1) transformation, 4th-order reversible polynomial, is reversible. The same formulas may be applied for the reverse calculation, but coefficients A0 through A14 and B0 through B14 are applied with reversal of their signs. Sign reversal is not applied to the coordinates of the evaluation point. Thus:
+Ordinate 1 of evaluation point X0  =   55� 00' 00.000""N  = +55 degrees
+Ordinate 2 of evaluation point Y0  =     0� 00' 00.000""E   =   +0 degrees
+A0  = +5.56098E-06   A1 = +1.55391E-06   ...   A14 = +4.01383E-09
+B0  = -1.48944E-05    B1 = -2.68191E-05    ...   B14 = -7.62236E-09
+
+Reverse calculation for: 
+ED87 Latitude     = XS = 52� 30�29.9887""N   =     +52.5083301944 degrees
+ED87 Longitude  = YS =   2� 00� 00.0353"" E   =     +2.0000098055 degrees   
+
+U = 52.5083301944 - 55.0 = -2.4916698056 degrees
+V = 2.0000098055 - 0.0 = 2.0000098055 degrees
+
+dX = A0 + A1.U + ... + A14.V4
+      = +5.56098E-06 + (1.55391E-06 * -2.491666667) + ... + (4.01383E-09 * 2.0000098055^4)
+      = +3.12957E-06 degrees
+
+dY = B0 + B1.U + ... + B14.V4
+      = -1.48944E-05 + (-2.68191E-05 * -2.491666667) + ... + (-7.62236E-09 * 2.0000098055^4)
+      = -9.80124E-06 degrees
+
+Then ED50 Latitude  =   XT = XS + dX
+                                 = 52.5083301944 + 3.12957E-06   degrees
+                                 = 52� 30� 30.000"" N
+
+ED50 Longitude  =   YT = YS + dY
+                           = 2� 00� 00.000"" E",Reversibility is subject to constraints.  See Guidance Note 7 for clarification.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.64,0
+9631,Complex polynomial (3rd-order),0,"The relationship between two projected coordinate reference systems may be approximated more elegantly by a single polynomial regression formula written in terms of complex numbers. The advantage is that the dependence between the �A� and �B� coefficients (for U and V) is taken into account in the formula, resulting in fewer coefficients for the same order polynomial. A third-order polynomial in complex numbers is used in Belgium.  A fourth-order po [...]
+
+(dX + i. dY) = (A1 + i. A2).(U + i.V) + (A3 + i. A4).(U + i.V)^2 + (A5 + i. A6).(U + i.V)^3 
+
+where U = (XS - XS0).10-5
+and     V = (YS - YS0).10-5
+
+Then
+XT  = XS - XS0 + XT0 + dX
+YT  = YS - YS0 + YT0 + dY
+
+where
+XT , YT      are coordinates in the target coordinate reference system,
+XS , YS      are coordinates in the source coordinate reference system,
+XS0 , YS0   are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0   are coordinates of the evaluation point in the target coordinate reference system.
+
+Note that the zero order coefficients of the general polynomial, A0 and B0, have apparently disappeared.  In reality they are absorbed by the different coordinates of the source and of the target evaluation point, which in this case, are numerically very different because of the use of two different projected coordinate reference systems for source and target.
+
+The transformation parameter values (the coefficients) are not reversible.  For the reverse transformation a different set of parameter values are required, used within the same formulas as the forward direction","For transformation Belge Lambert 72 to ED50 / UTM zone 31N,
+
+Eo1 = 0
+No1 = 0
+Eo2 = 449681.702
+No2 = 5460505.326
+A1 = -71.3747
+A2 = 1858.8407
+A3 = -5.4504
+A4 = -16.9681
+A5 = 4.0783
+A6 = 0.2193
+
+For source coordinate system E1=200000  N1=100000, then
+E2 = 647737.377  N2 = 5564124.227.",Coordinate pairs treated as complex numbers.  This exploits the correlation between the polynomial coefficients and leads to a smaller number of coefficients than the regular 3rd-order polynomial.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9632,Complex polynomial (4th-order),0,"The relationship between two projected coordinate reference systems may be approximated more elegantly by a single polynomial regression formula written in terms of complex numbers. The advantage is that the dependence between the �A� and �B� coefficients (for U and V) is taken into account in the formula, resulting in fewer coefficients for the same order polynomial. A third-order polynomial in complex numbers is used in Belgium.  A fourth-order po [...]
+
+(dX + i. dY) = (A1 + i. A2).(U + i.V) + (A3 + i. A4).(U + i.V)^2 + (A5 + i. A6).(U + i.V)^3 + (A7 + i.A8).(U + i.V)^4
+
+where U = (XS - XS0).10-5
+and     V = (YS - YS0).10-5
+
+Then
+XT  = XS - XS0 + XT0 + dX
+YT  = YS - YS0 + YT0 + dY
+
+where
+XT , YT      are coordinates in the target coordinate reference system,
+XS , YS      are coordinates in the source coordinate reference system,
+XS0 , YS0   are coordinates of the evaluation point in the source coordinate reference system,
+XT0 , YT0   are coordinates of the evaluation point in the target coordinate reference system.
+
+Note that the zero order coefficients of the general polynomial, A0 and B0, have apparently disappeared.  In reality they are absorbed by the different coordinates of the source and of the target evaluation point, which in this case, are numerically very different because of the use of two different projected coordinate reference systems for source and target.
+
+The transformation parameter values (the coefficients) are not reversible.  For the reverse transformation a different set of parameter values are required, used within the same formulas as the forward direction.","For transformation RD / Netherlands New to ED50 / UTM zone 31N,
+
+Eo1 = 155000
+No1 = 463000
+Eo2 = 663395.607
+No2 = 5781194.380
+A1 = -51.681
+A2 = 3290.525
+A3 = 20.172
+A4 = 1.133
+A5 = 2.075
+A6 = 0.251
+A7 = 0.075
+A8 = -0.012
+
+For source coordinate system E1=200000  N1=500000, then
+E2 =707155.557  N2 = 5819663.128.",Coordinate pairs treated as complex numbers.  This exploits the correlation between the polynomial coefficients and leads to a smaller number of coefficients than the regular 4th-order polynomial.,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,,0
+9633,Ordnance Survey National Transformation,1,See information source.,See information source.,Geodetic transformation between ETRS89 (or WGS 84) and OSGB36 / National Grid.  Uses ETRS89 / National Grid as an intermediate coordinate system for bi-linear interpolation of gridded grid coordinate differences.,http://www.gps.gov.uk/gpssurveying.asp,EPSG,2000-10-19 00:00:00,,0
+9634,Maritime Provinces polynomial interpolation,0,"The transformation makes use of a residual file for each Canadian maritime province.  The process of residual interpolation accounts for local variations in the coordinate system and provides a transformation accuracy of +/- 5 cm.
+
+By using a second residual file, the transformation may be reversed.  Only one residual file is in use by the method during any given execution.",,This transformation is an executable module within the application NBGeocalc.  It is an adaptation of the ESTPM program developed by Geodetic Survey of Canada.,Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,0
+9635,Geographic3D to Geographic2D+GravityRelatedHeight,1,"This is a complex, multi-step transformation, involving the application of a geoid height difference interpolated at a point in a ""geoid model"". The geoid model should be available as a regular grid of latitude and longitude with the height of the geoid above the ellipsoid at each grid node. Only the height is affected by this transformation; the geodetic latitude and longitude are not.
+
+The transformation involves the following sequence of steps:
+�  Selection of a subset of the geoid file covering the extent of the points to be transformed.
+�  If the geoid file is not based on the source or target CRS, it needs to be transformed first. This involves transformation of the chosen subset of the geoid file from its orignal Geographic 3D CRS to the Geographic 3D CRS that is the source or the target of this transformation.
+�  Calculation of the height of the geoid above the ellipsoid (""geoid undulation"") at the relevant point(s). This is achieved through a bi-linear interpolation of the geoid undulation, using the latitude and longitude to locate the point in the sub-grid.  This step results in the height of the geoid above the ellipsoid (N) of the Geographic 3D CRS, whether source or target.
+�  At each point, the application of the calculated geoid undulation to the height to be transformed.
+
+H=h-N for Geographic3D to Geographic2D+GravityRelatedHeight
+
+h=H+N for Geographic2D+GravityRelatedHeight to Geographic3D
+
+where h = the ellipsoidal height (height above the ellipsoid in a geographic 3D CRS)
+and H = the Gravity-Related Height component of the compound CRS.",,"Transformation from a Geographic 3D CRS to a Compound CRS consisting of a Geographic 2D CRS and a Vertical CRS, or vice versa. The Geographic 3D and the Geographic 2D CRS must be based on the same Geodetic Datum.",,EPSG,2001-06-05 00:00:00,,0
+9636,Molodenski-Badekas transformation,1,"To eliminate high correlation between the translations and rotations in the derivation of parameter values for the Helmert transformation methods (coordinate operation metghod codes 9606 and 9607), instead of the rotations being derived about the geocentric coordinate reference system origin they may be derived at a location within the points used in the determination. Three additional parameters, the coordinates of the rotation point, are then r [...]
+
+   (Xt)             (  1       +Rz    -Ry)      (Xs - Xp)      (Xp)       (dX)
+   (Yt)  =  M *  ( -Rz      1      +Rx)  *  (Ys - Yp)  +  (Yp)  +  (dY)
+   (Zt)              ( +Ry   -Rx       1 )      (Zs - Zp)      (Zp)       (dZ)
+
+and the parameters are defined as:
+
+(dX, dY, dZ)   : Translation vector, to be added to the point's position vector in the source coordinate system in order to transform from source coordinate reference system to target coordinate reference system; also: the coordinates of the origin of source coordinate reference system in the target frame.
+
+(Rx, Ry, Rz)   : Rotations to be applied to the coordinate reference frame.  The sign convention is such that a positive rotation of the frame about an axis is defined as a clockwise rotation of the coordinate reference frame when viewed from the origin of the Cartesian coordinate system in the positive direction of that axis, that is a positive rotation about the Z-axis only from source coordinate reference system to target coordinate reference system will result in a smaller longitude  [...]
+
+(Xp, Yp, Zp)   : Coordinates of the point about which the coordinate reference frame is rotated, given in the source Cartesian coordinate reference system. 
+
+M                  : The scale factor to be applied to the position vector in the source coordinate reference system  in order to obtain the correct scale of the target coordinate reference system. M = (1+dS*10^-6), where dS is the scale correction expressed in parts per million.
+
+Reversibility.
+The Molodensky-Badekas transformation in a strict mathematical sense is not reversible, i.e. in principle the same parameter values cannot be used to execute the reverse transformation. This is because the evaluation point coordinates are in the forward direction source coordinate reference system and the rotations have been derived about this point. They should not be applied about the point having the same coordinate values in the target coordinate reference system, as is required for  [...]
+9801,Lambert Conic Conformal (1SP),1,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:
+
+E = FE + r sin(theta)
+N = FN + r0 - r cos(theta)
+where
+n = sin lat0
+r = a F t^n k0     for r0, and r
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5     for m0, lat0, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.
+t  = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2)   for t0 and t using lat0 and lat respectively.
+F = m0/(n  t1^n)
+theta = n(lon - lon0)
+
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:
+
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}
+lon = theta'/n +lon0
+where
+theta' = arctan[(E - FE)/{r0 -(N - FN)}]
+r' = +/-[(E - FE)^2 + {r0 - (N - FN)}^2]^0.5
+t' = (r'/(a k0 F))^(1/n)
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System JAD69 / Jamaica National Grid
+
+Parameters:
+Ellipsoid:  Clarke 1866, a = 6378206.400 m., 1/f = 294.97870
+                                   then  e = 0.08227185 and e^2 = 0.00676866
+
+Latitude Natural Origin         18 deg 00 min 00 sec N  =  0.31415927 rad
+Longitude Natural Origin     77 deg 00 min 00 sec W = -1.34390352 rad
+Scale factor at origin            1.000000
+False Eastings  FE               250000.00 m
+False Northings FN              150000.00 m
+
+Forward calculation for: 
+Latitude:     17 deg 55 min 55.80 sec N  =  0.31297535 rad
+Longitude:  76 deg 56 min 37.26 sec W = -1.34292061 rad
+first gives
+m0    =  0.95136402        t0 =  0.72806411
+F       =  3.39591092        n  =  0.30901699
+r        =  19643955.26     r0  =  19636447.86
+theta =  0.00030374        t   =  0.728965259
+
+Then Easting E   =     255966.58 m
+         Northing N =      142493.51 m
+
+Reverse calculation for the same easting and northing first gives
+
+theta' =  0.000303736
+t'        =  0.728965259
+m0     =  0.95136402
+r'        =  19643955.26
+
+Then Latitude     = 17 deg 55 min 55.800 sec N
+         Longitude  = 76 deg 56 min 37.260 sec W",,EPSG guidance note #7.,EPSG,2001-06-05 00:00:00,2001.08,0
+9802,Lambert Conic Conformal (2SP),1,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:
+
+E = EF + r sin(theta)
+N = NF + rF - r cos(theta)
+where
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5     for m1, lat1, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.
+t  = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2)   for t1, t2, tF and t using lat1, lat2, latF and lat respectively.
+n = (loge(m1) - loge(m2))/(loge(t1) - loge(t2))
+F = m1/(n  t1^n)
+r =  a F t^n         for rF and r, where rF is the radius of the parallel of latitude of the false origin.
+theta = n(lon - lon0)
+
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:
+
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}
+lon = theta'/n +lon0
+where
+r' = +/-[(E - EF)^2 + {rF - (N - NF)}^2]^0.5 , taking the sign of n
+t' = (r'/(aF))^(1/n)
+theta' = arctan [(E- EF)/(rF - (N- NF))]
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System NAD27 / Texas South Central
+
+Parameters:
+Ellipsoid  Clarke 1866, a = 6378206.400 metres = 20925832.16 US survey feet
+                                   1/f = 294.97870
+then e = 0.08227185 and e^2 = 0.00676866
+
+First Standard Parallel          28o23'00""N  =   0.49538262 rad
+Second Standard Parallel    30o17'00""N  =   0.52854388 rad
+Latitude False Origin            27o50'00""N  =   0.48578331 rad
+Longitude False Origin         99o00'00""W = -1.72787596 rad
+Easting at false origin           2000000.00  US survey feet
+Northing at false origin          0.00  US survey feet
+
+Forward calculation for: 
+Latitude       28o30'00.00""N  =  0.49741884 rad
+Longitude    96o00'00.00""W = -1.67551608 rad
+
+first gives :
+m1    = 0.88046050      m2 = 0.86428642
+t        = 0.59686306      tF  = 0.60475101
+t1      = 0.59823957      t2 = 0.57602212
+n       = 0.48991263       F = 2.31154807
+r        = 37565039.86    rF = 37807441.20
+theta = 0.02565177
+
+Then Easting E =      2963503.91 US survey feet
+         Northing N =      254759.80 US survey feet
+
+Reverse calculation for same easting and northing first gives:
+theta' = 0.025651765     r' = 37565039.86
+t'        = 0.59686306
+
+Then Latitude     	= 28o30'00.000""N
+         Longitude   = 96o00'00.000""W",,EPSG guidance note #7.,EPSG,2001-06-05 00:00:00,99.281  2001.08,0
+9803,Lambert Conic Conformal (2SP Belgium),1,"For the Lambert Conic Conformal (2 SP Belgium), the formulas for the regular two standard parallel case (coordinate operation method code 9802) are used except for: 
+
+Easting, E = EF + r sin (theta - alpha)
+Northing, N = NF + rF - r cos (theta - alpha)
+
+and for the reverse formulas
+lon = ((theta' + alpha)/n) +lon0
+where alpha = 29.2985 seconds.","For Projected Coordinate System Belge 1972 / Belge Lambert 72
+
+Parameters:
+Ellipsoid  International 1924,  a = 6378388 metres
+                                              1/f = 297
+then e = 0.08199189 and e^2 = 0.006722670
+
+First Standard Parallel        49o50'00""N       =   0.86975574 rad
+Second Standard Parallel  51o10'00""N       =   0.89302680 rad
+Latitude False Origin          90o00'00""N       =   1.57079633 rad
+Longitude False Origin         4o21'24.983""E = 0.07604294 rad
+Easting at false origin EF        150000.01  metres
+Northing at false origin NF    5400088.44  metres
+
+Forward calculation for: 
+Latitude        50o40'46.461""N  =  0.88452540 rad
+Longitude       5o48'26.533""E   = 0.10135773 rad
+
+first gives :
+m1     = 0.64628304         m2 = 0.62834001
+t        = 0.59686306          tF  = 0.00000000
+t1      = 0.36750382           t2 = 0.35433583
+n       = 0.77164219            F = 1.81329763
+r        = 37565039.86         rF = 0.00
+alpha =	0.00014204     theta = 0.01953396
+
+Then Easting E  =      251763.20 metres
+         Northing N =      153034.13 metres
+
+Reverse calculation for same easting and northing first gives:
+theta' = 0.01939192      r' = 548041.03
+t' = 0.35913403
+Then Latitude   =    50o40'46.461""N
+         Longitude =     5o48'26.533""E",In 2000 this modification was replaced through use of the regular Lambert Conic Conformal (2SP) method [9802] with appropriately modified parameter values.,EPSG guidance note #7.,EPSG,1999-04-22 00:00:00,99.281,0
+9804,Mercator (1SP),1,"The formulas to derive projected Easting and Northing coordinates are:
+
+E = FE + a*k0(lon - lon0)              
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))/(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.
+
+The reverse formulas to derive latitude and longitude from E and N values are:
+
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi) 
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)
++ (7e^6/120 +  81e^8/1120) sin(6chi)  + (4279e^8/161280) sin(8chi)
+
+where chi = pi/2 - 2 arctan t
+t = B^((FN-N)/(a*k0)) 
+B = base of the natural logarithm, 2.7182818...
+and  for the 2 SP Case, k0 is calculated as for the forward transformation above.
+lon  =  ((E - FE)/(a*k0))  + lon0","For Projected Coordinate System Makassar / NEIEZ
+
+Parameters:
+Ellipsoid   Bessel 1841  a = 6377397.155 m   1/f = 299.15281
+then e = 0.08169683
+
+Latitude Natural Origin         00o00'00""N  = 0.0000000 rad
+Longitude Natural Origin    110o00'00""E  = 1.91986218 rad
+Scale factor ko                  0.997
+False Eastings FE              3900000.00 m
+False Northings FN              900000.00 m
+
+Forward calculation for: 
+Latitude            3o00'00.00""S   = -0.05235988 rad
+Longitude     120o00'00.00""E   =  2.09439510 rad
+gives
+Easting  E   =      5009726.58 m
+Northing N  =        569150.82 m
+
+Reverse calculation for same easting and northing first gives :
+t    = 1.0534121
+chi = -0.0520110
+
+Then Latitude     =   3o00'00.000""S
+         Longitude  = 120o00'00.000""E",,EPSG guidance note #7.,EPSG,2001-06-05 00:00:00,2001.08,0
+9805,Mercator (2SP),1,"The formulas to derive projected Easting and Northing coordinates are:
+
+For the two standard parallel case, k0 is first calculated from
+
+k0 = cos(latSP1)/(1 - e^2*sin^2(latSP1))^0.5 
+ 
+where latSP1 is the absolute value of the first standard parallel (i.e. positive).  
+
+Then, for both one and two standard parallel cases, 
+
+E = FE + a*k0(lon - lon0)              
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.
+
+The reverse formulas to derive latitude and longitude from E and N values are:
+
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi) 
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)
++ (7e^6/120 +  81e^8/1120) sin(6chi)  + (4279e^8/161280) sin(8chi)
+
+where chi = pi/2 - 2 arctan t
+t = B^((FN-N)/a*k0) 
+B = base of the natural logarithm, 2.7182818...
+and  for the 2 SP Case, k0 is calculated as for the forward transformation above.
+lon  =  ((E - FE)/a*k0)  + lon0","For Projected Coordinate System Pulkovo 1942 / Mercator Caspian Sea
+
+Parameters:
+Ellipsoid  Krassowski 1940   a = 6378245.00m   1/f = 298.300
+then e = 0.08181333 and e^2 = 0.00669342
+
+Latitude first SP                             42o00'00""N = 0.73303829 rad
+Longitude Natural Origin                51o00'00""E = 0.89011792 rad
+False Eastings FE                          0.00 m
+False Northings (at equator) FN     0.00 m
+  
+then natural origin at latitude of 0oN has scale factor k0=  0.74426089
+
+Forward calculation for: 
+Latitude        53o00'00.00""N = 0.9250245 rad
+Longitude     53o00'00.00""E  = 0.9250245 rad
+
+gives Easting E   =     165704.29 m 
+          Northing N =   5171848.07 m
+
+Reverse calculation for same easting and northing first gives :
+t = 0.33639129    chi = 0.92179596
+
+Then Latitude     =  53o00'00.000""N
+          Longitude  =  53o00'00.000""E",,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9806,Cassini-Soldner,1,"The formulas to derive projected Easting and Northing coordinates are:
+
+Easting E = FE + nu[A - TA^3/6 -(8 - T + 8C)TA^5/120]
+
+Northing N = FN + M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 6C)A^4/24]
+
+where A = (lon - lon0)cos(lat)
+T = tan^2(lat)
+C = e2 cos2*/(1 - e2)        nu = a /(1 - esq*sin^2(lat))^0.5 
+and M, the distance along the meridian from equator to latitude lat, is given by
+M = a[1 - e^2/4 - 3e^4/64 - 5e^6/256 -....)*lat - (3e^2/8 + 3e^4/32 + 45e^6/1024 +....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]
+with lat in radians.
+
+M0 is the value of M calculated for the latitude of the chosen origin. This may not necessarily be chosen as the equator.
+
+To compute latitude and longitude from Easting and Northing the reverse formulas are:
+lat = lat1 - (nu1tan(lat1)/rho1)[D2/2 - (1 + 3*T1)D^4/24]
+lon =  lon0 + [D - T1*D^3/3 + (1 + 3*T1)T1*D^5/15]/cos(lat1)
+
+where lat1 is the latitude of the point on the central meridian which has the same Northing as the point whose coordinates are sought, and is found from:
+lat1 = mu1 + (3*e1/2 - 27*e1^3/32 +.....)sin(2*mu1) + (21*e1^2/16 - 55*e1^4/32 + ....)sin(4*mu1)+ (151*e1^3/96 +.....)sin(6*mu1) + (1097*e1^4/512 - ....)sin(8*mu1) + ......
+where
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]
+M1 = M0 + (N - FN)
+T1 = tan^2(lat1)
+D = (E - FE)/nu1","For Projected Coordinate System Trinidad 1903 / Trinidad Grid 
+Parameters:
+Ellipsoid   Clarke 1858     a = 20926348 ft    = 31706587.88 links
+                                        b = 20855233 ft
+
+then 1/f = 294.97870 and e^2 = 0.00676866
+
+Latitude Natural Origin       10o26'30""N  =  0.182241463 rad
+Longitude Natural Origin    61o20'00""W = -1.07046861 rad
+False Eastings FE              430000.00 links
+False Northings FN            325000.00 links
+
+Forward calculation for: 
+Latitude       10o00'00.00"" N = 0.17453293 rad
+Longitude    62o00'00.00""W = -1.08210414 rad
+
+A = -0.01145876      C = 0.00662550
+T = 0.03109120      M = 5496860.24    nu = 31709831.92     M0 = 5739691.12
+
+Then Easting E    =  66644.94 links
+          Northing N =  82536.22 links
+
+Reverse calculation for same easting and northing first gives :
+e1    =   0.00170207       D  =     -0.01145875
+T1   = 0.03109544         M1 =      5497227.34
+nu1  = 31709832.34       mu1 =    0.17367306
+phi1 = 0.17454458         rho1 =    31501122.40
+
+
+Then Latitude     = 10o00'00.000""N
+         Longitude  =  62o00'00.000""W",,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9807,Transverse Mercator,1,"The formulas to derive the projected Easting and Northing coordinates are in the form of a series as follows:
+
+Easting, E =  FE + k0*nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'sq)A^5/120]	
+
+Northing, N =  FN + k0{M - M0 + nu*tan(lat)[A^2/2 + (5 - T + 9C + 4C^2)A^4/24 + (61 - 58T + T^2 + 600C - 330e'sq)A^6/720]} 
+where T = tan^2(lat)                nu = a /(1 - esq*sin^2(lat))^0.5
+C = esq*cos^2(lat)/(1 - esq)
+A = (lon - lon0)cos(lat), with lon and lon0 in radians.
+M = a[(1 - esq/4 - 3e^4/64 - 5e^6/256 -....)lat - (3esq/8 + 3e^4/32 + 45e^6/1024+....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]
+with lat in radians and M0 for lat0, the latitude of the origin, derived in the same way.
+
+The reverse formulas to convert Easting and Northing projected coordinates to latitude and longitude are:
+
+lat = lat1 - (nu1*tan(lat1)/rho1)[D^2/2 - (5 + 3*T1 + 10*C1 - 4*C1^2 - 9*e'^2)D^4/24 + (61 + 90*T1 + 298*C1 + 45*T1^2 - 252*e'^2 - 3*C1^2)D^6/720]
+lon = lon0 + [D - (1 + 2*T1 + C1)D^3/6 + (5 - 2*C1 + 28*T1 - 3*C1^2 + 8*e'^2 + 24*T1^2)D^5/120] / cos(lat1)
+where lat1 may be found as for the Cassini projection from:
+
+lat1 = mu1 + ((3*e1)/2 - 27*e1^3/32 +.....)sin(2*lat1) + (21*e1^2/16 -55*e1^4/32 + ....)sin(4*lat1)+ (151*e1^3/96 +.....)sin(6*lat1) + (1097*e1^4/512 - ....)sin(8*lat1) + ......
+and where  nu1 = a /(1 - esq*sin^2(lat1))^0.5                                     rho1 = a(1 - esq)/(1 - esq*sin^2(lat1))^1.5
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]
+M1 = M0 + (N - FN)/k0
+T1 = tan^2(lat1)
+C1 = e'^2*cos^2(lat1)
+D = (E - FE)/(nu1*k0), with nu1 = nu for lat1
+
+For areas south of the equator the value of latitude lat will be negative and the formulas above, to compute the E and N,  will automatically result in the correct values. Note that the false northings of the origin, if the equator, will need to be large to avoid negative northings and for the UTM projection is in fact 10,000,000m. Alternatively, as in the case of Argentina's Transverse Mercator (Gauss-Kruger) zones, the origin is at the south pole with a northings of zero. However each  [...]
+different zones having the same eastings, every point in the country, irrespective of its projection zone, will have a unique set of projected system coordinates. Strict application of the above formulas, with south latitudes negative, will result in the derivation of the correct Eastings and Northings. 
+
+Similarly, in applying the reverse formulas to determine a latitude south of the equator, a negative sign for lat results from a negative lat1 which in turn results from a negative M1.","For Projected Coordinate System OSGB 1936 / British National Grid
+
+Parameters:
+Ellipsoid  Airy 1830  a = 6377563.396 m  1/f = 299.32496
+then e'^2 = 0.00671534 and e^2 = 0.00667054
+
+Latitude Natural Origin         49o00'00""N   = 0.85521133 rad
+Longitude Natural Origin        2o00'00""W  = -0.03490659 rad
+Scale factor ko                     0.9996013                                                                                              False Eastings FE                 400000.00 m
+False Northings FN              -100000.00 m
+
+Forward calculation for: 
+Latitude       50o30'00.00""N  = 0.88139127 rad
+Longitude    00o30'00.00""E  = 0.00872665 rad
+A  = 0.02775415       C = 0.00271699
+T =  1.47160434       M = 5596050.46
+M0 = 5429228.60     nu  = 6390266.03
+
+Then Easting E =        577274.99 m
+          Northing N =       69740.50 m
+
+Reverse calculations for same easting and northing first gives :
+e1 =    0.00167322      mu1 = 0.87939562
+M1 = 5599036.80        nu1 = 6390275.88
+phi1  = 0.88185987      D = 0.02775243
+rho1 =6372980.21       C1 =  0.00271391
+T1 = 1.47441726
+
+Then Latitude       = 50o30'00.000""N
+         Longitude    = 00o30'00.000""E",,EPSG guidance note #7.,EPSG,1996-09-18 00:00:00,,0
+9808,Transverse Mercator (South Orientated),1,"For the mapping of southern Africa a south oriented Transverse Mercator projection is used. Here the coordinate axes are called Westings and Southings and increment to the West and South from the origin respectively.  The standard Transverse Mercator formulas (coordinate operation method code 9807) need to be modified to cope with this arrangement with
+
+Westing, W = FE - k0 nu[A + (1 - T + C)A^3/6 + (5 - 18*T + T^2 + 72*C - 58*e'^2)A^5/120]
+
+Southing, S = FN - k0{M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 9*C + 4*C^2)A^4/24 + (61 - 58*T + T^2 + 600*C - 330*e'^2)A^6/720]}
+
+In these formulas the terms FE and FN retain their definition, i.e. in the Transverse Mercator (South Orientated) method they increase the Westing and Southing value at the natural origin. In this method they are effectively false westing (FW) and false southing (FS) respectively.
+
+For the reverse formulas, those for the standard Transverse Mercator above apply, with the exception that:
+
+M1 = M0 - (S - FN)/k0
+and D = -(W - FE)/(nu1*k0), with nu1 = nu for lat1",,,EPSG guidance note #7.,EPSG,2002-07-31 00:00:00,2002.51,0
+9809,Oblique Stereographic,1,"Given the geodetic origin of the projection at the tangent point (lat0, lon0), the parameters defining the conformal sphere are:
+
+R= sqrt( rho0 * nu0)
+n=  sqrt{1+[(e2*cos^4(lat0))/(1-e2)}
+c=  [(n+sin(lat0)) (1-sin(chi0))]/[(n-sin(lat0)) (1+sin(chi0))]
+
+where:	sin(chi0) = (w1-1)/(w1+1)
+w1 = (S1.(S2)^e)^n
+S1 = (1+sin(lat0))/(1-sin(lat0))
+S2 = (1-e sin(lat0))/(1+e sin(lat0))
+
+The conformal latitude and longitude (chi0,lambda0) of the origin are then computed from :
+
+chi0 = asin[(w2-1)/(w2+1)]
+
+where S1 and S2 are as above and  w2 = c (S1(S2)^e)^n
+ 
+lambda0  = lon0
+
+For any point with geodetic coordinates (lat, lon) the equivalent conformal latitude and longitude (chi, lambda) are computed from 
+lambda = n(lon-lambda0) + lambda0
+chi = asin[(w-1)/(w+1)]
+
+where w = c (Ss (Sb)^e)^n
+Sa = (1+sin(lat))/(1-sin(lat))
+Sb = (1-e.sin(lat))/(1+e.sin(lat))
+ 
+Then B = [1+sin(chi) sin(chi0) + cos(chi) cos(chi0) cos(lambda-lambda0)]
+
+N = FN + 2 R k0 [sin(chi) cos(chi0) - cos(chi) sin(chi0) cos(lambda-lambda0)] / B
+
+E = FE + 2 R k0 cos(chi) sin(lambda-lambda0) / B
+
+
+The reverse formulae to compute the geodetic coordinates from the grid coordinates involves computing the conformal values, then the isometric latitude and finally the geodetic values.
+
+The parameters of the conformal sphere and conformal latitude and longitude at the origin are computed as above. Then for any point with Stereographic grid coordinates (E,N) :
+
+chi = chi0 + 2 atan[{(N-FN)-(E-FE) tan (j/2)} / (2 R k0)]
+
+lambda = j + 2 i + lambda0
+
+where g = 2 R k0 tan(pi/4 - chi0/2)
+h = 4 R k0 tan(chi0) + g
+i = atan[(E-FE) / {h+(N-FN)}]
+j = atan[(E-FE) / (g-(N-FN)] - i
+
+Geodetic longitude lon = (lambda-lambda0 ) / n +  lambda0
+
+Isometric latitude psi = 0.5 ln [(1+ sin(chi)) / { c (1-  sin(chi))}] / n
+
+First approximation lat1 = 2 atan(e^psi)  - pi/2  where e=base of natural logarithms.
+
+psii = isometric latitude at lati
+
+where psii= ln[{tan(lati/2 + pi/4}  {(1-e sin(lati))/(1+e sin(lati))}^(e/2)]
+ 
+Then iterate lat(i+1) = lati - ( psii - psi ) cos(lati) (1 -e^2 sin^2(lati)) / (1 - e^2)
+
+until the change in lat is sufficiently small.
+
+For Oblique Stereographic projections centred on points in the southern hemisphere,  the signs of E, N, lon0, lon,  must be reversed to be used in the equations and lat will be negative anyway as a southerly latitude.
+
+An alternative approach is given by Snyder, where, instead of defining a single conformal sphere at the origin point, the conformal latitude at each point on the ellipsoid is computed.  The conformal longitude is then always equivalent to the geodetic longitude.  This approach is a valid alternative to the above, but gives slightly different results away from the origin point. It is therefore considered by EPSG to be a different coordinate operation method to that described above.","For  [...]
+
+Parameters:
+Ellipsoid   Bessel 1841    a = 6377397.155 m    1/f = 299.15281
+then e = 0.08169683
+
+Latitude Natural Origin      52o09'22.178""N  = 0.910296727 rad
+Longitude Natural Origin     5o23'15.500""E  =  0.094032038 rad
+Scale factor k0                 0.9999079
+False Eastings FE             155000.00 m
+False Northings FN           463000.00 m
+
+Forward calculation for: 
+
+Latitude    53oN = 0.925024504 rad
+Longitude   6oE = 0.104719755 rad
+
+first gives the conformal sphere constants:
+
+rho0 = 6374588.71    nu0 = 6390710.613
+R = 6382644.571    n = 1.000475857    c  = 1.007576465
+
+where S1 = 8.509582274  S2 = 0.878790173  w1 = 8.428769183
+sin chi0 = 0.787883237
+
+w   = 8.492629457   chi0 = 0.909684757      D0 = d0 
+
+for the point  chi  = 0.924394997    D = 0.104724841
+
+hence B = 1.999870665    N = 557057.739    E = 196105.283
+
+reverse calculation for the same Easting and Northing first gives:
+
+g = 4379954.188    h = 37197327.96   i = 0.001102255   j = 0.008488122
+
+then  D = 0.10472467  Longitude = 0.104719584 rad =  6 deg E
+
+chi  = 0.924394767    psi = 1.089495123
+phi1 = 0.921804948       psi1 = 1.084170164
+phi2 = 0.925031162       psi2 = 1.089506925
+phi3 = 0.925024504       psi3 = 1.089495505
+phi4 = 0.925024504
+
+Then Latitude      = 53o00'00.000""N
+          Longitude   =   6o00'00.000""E","This is not the same as the projection method of the same name in USGS Professional Paper no. 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,99.811,0
+9810,Polar Stereographic,1,"For the forward transformation from latitude and longitude,
+
+E = FE + rho sin(lon - lon0)
+N = FN - rho cos(lon - lon0)
+where
+rho = 2 a ko t /{[((1+e)^(1+e)) ((1-e)^(1-e))]^0.5}
+t = tan (pi/4 - lat/2) / [(1-esin(lat) ) / (1 + e sin(lat))]^(e/2)
+
+For the reverse transformation,
+
+lat = chi+ (e^2/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2 chi) 
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4 chi)
++ (7e^6/120 +  81e^8/1120) sin(6 chi)  + (4279e^8/161280) sin(8 chi)
+
+lon = lon0+ arctan [(E-FE) / (FN-N)]
+
+where chi  = pi/2 - 2 arctan t
+t   =  rho [((1+e)^(1+e)) ((1-e)^(1-e))]^0.5} / 2 a ko
+rho = [(E-FE)^2  + (N - FN)^2]^0.5",,,"US Geological Survey Professional Paper 1395; ""Map Projections - A Working Manual"";  J. Snyder",EPSG,1996-09-18 00:00:00,,0
+9811,New Zealand Map Grid,1,b,,,New Zealand Department of Lands technical circular 1973/32,EPSG,1996-09-18 00:00:00,,0
+9812,Hotine Oblique Mercator,1,"The following constants for the projection may be calculated :
+
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)
+D = B (1 - esq)^0.5  / (cos(latc) * ( 1 - esq*sin^2(latc))^0.5)
+if D < 1 to avoid problems with computation of F make D^2  = 1 
+F = D + (D^2 - 1)^0.5  * SIGN(latc)
+H = F* t0*B
+G = (F - 1/F) / 2
+gamma0 = asin(sin(alphac) / D)
+lon0 = lonc - (asin(G*tan(gamma0))) / B
+
+Then compute the (uc , vc) co-ordinates for the centre point (fc , lc).
+vc =0
+
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)
+but for the special cases where alphac = 90 degrees then 
+uc = A*(lonc - lon0)  
+
+ 
+Forward case: To compute (E,N) from a given (lat,lon) :
+
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)
+Q = H / t^B
+S = (Q - 1 / Q) / 2
+T = (Q + 1 / Q) / 2
+V = sin(B (lon - lon0))
+U = (- V cos(gamma0) + S sin(gamma0)) / T
+v = A ln((1 - U) / (1 + U)) / 2 B
+u = A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B
+
+The rectified skew co-ordinates are then derived from:
+E = v cos(gammac) + u sin(gammac) + FE
+N = u cos(gammac) - v sin(gammac) + FN
+
+Reverse case: Compute (lat,lon)  from a given (E,N)  :
+
+v� = (E - FE) cos(gammac) - (N - FN) sin(gammac)
+u� = (N - FN) cos(gammac) + (E - FE) sin(gammac)
+
+Q� = e- (B v �/ A)  where e is the base of natural logarithms.
+S' = (Q� - 1 / Q�) / 2
+T� = (Q� + 1 / Q�) / 2
+V� = sin (B u� / A)
+U� = (V� cos(gammac) + S� sin(gammac)) / T�
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)
+
+chi = pi / 2 - 2 atan(t�)
+
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) +  sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) +  sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) +  sin(8chi).(4279 e^8 / 161280)
+
+lon=  lon0  - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B","For Projected Coordinate System  Timbalai 1948 / R.S.O. Borneo (m)
+
+Parameters:
+Ellipsoid:  Everest 1830 (1967 Definition)
+a = 6377298.556 metres 1/f = 300.8017
+then e = 0.081472981and e2 = 0.006637847
+
+Latitude Projection Centre fc = 4o00'00""N = 0.069813170 rad
+Longitude Projection Centre lc = 115o00'00""E = 2.007128640 rad
+Azimuth of central line ac = 53o18'56.9537"" = 0.930536611 rad
+Rectified to skew gc= 53o07'48.3685"" = 0.927295218 rad
+Scale factor ko= 0.99984
+False Eastings FE = 0.00 m
+False Northings FN = 0.00 m
+
+Forward calculation for: 
+Latitude lat = 5o23'14.1129""N = 0.094025313 rad
+Longitude lon = 115o48'19.8196""E = 2.021187362 rad
+
+B = 1.003303209            F = 1.072121256
+A =6376278.686            H = 1.000002991
+to = 0.932946976          g0 = 0.927295218
+D = 1.002425787           lon0 = 1.914373469
+D2 =1.004857458
+uc =738096.09              vc =0.00
+
+t =0.910700729             Q =1.098398182
+S =0.093990763            T = 1.004407419
+V =0.106961709            U = 0.010967247
+v =-69702.787                u =901334.257
+
+Then Easting E =      679245.73 m
+        Northing N =     596562.78 m
+
+Reverse calculations for same easting and northing first gives :
+v� =   -69702.787              u� =901334.257
+Q� = 1.011028053
+S�  = 0.010967907          T� = 1.000060146
+V� = 0.141349378           U� = 0.093578324
+t� = 0.910700729             c = 0.093404829
+
+Then Latitude = 5o23'14.113""N
+         Longitude = 115o48'19.820""E",,EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,97.62  99.811,0
+9813,Laborde Oblique Mercator,1,See information source.,See information source.,Can be accomodated by Oblique Mercator method (code 9815).,"""La nouvelle projection du Service Geographique de Madagascar""; J. Laborde; 1928",EPSG,1996-09-18 00:00:00,97.613,0
+9814,Swiss Oblique Cylindrical,1,See information source.,See information source.,Can be accomodated by Oblique Mercator method (code 9815).,"""Die projecktionen der Schweizerischen Plan und Kartenwerke""; J Bollinger; 1967",EPSG,1996-09-18 00:00:00,97.612,0
+9815,Oblique Mercator,1,"The following constants for the projection may be calculated :
+
+B = (1 + e^2 * cos^4(latc) / (1 - e^2 ))^0.5
+A = a * B * kc *(1 - e^2 )^0.5 / ( 1 - e^2 * sin^2(latc))
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)
+D = B (1 - e^2)^0.5  / (cos(latc) * ( 1 - e^2*sin^2(latc))^0.5)
+if D < 1 to avoid problems with computation of F make D^2  = 1 
+F = D + (D^2 - 1)^0.5  * SIGN(latc)
+H = F* t0*B
+G = (F - 1/F) / 2
+gamma0 = asin(sin(alphac) / D)
+lon0 = lonc - (asin(G*tan(gamma0))) / B
+vc =0
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)
+but for the special cases where alphac = 90 degrees (e.g. Hungary, Switzerland) then 
+uc = A*(lonc - lon0)  
+
+ 
+Forward case: To compute (E,N) from a given (lat,lon) :
+
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)
+Q = H / t^B
+S = (Q - 1 / Q) / 2
+T = (Q + 1 / Q) / 2
+V = sin(B (lon - lon0))
+U = (- V cos(gamma0) + S sin(gamma0)) / T
+v = A ln((1 - U) / (1 + U)) / 2 B
+u = (A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B) - (uc . SIGN(lon - lonc))
+
+The rectified skew co-ordinates are then derived from:
+E = v cos(gammac) + u sin(gammac) + Ec
+N = u cos(gammac) - v sin(gammac) + Nc
+
+Reverse case: Compute (lat,lon)  from a given (E,N)  :
+
+v� = (E - Ec) cos(gammac) - (N - Nc) sin(gammac)
+u� = (N - Nc) cos(gammac) + (E - Ec) sin(gammac) + uc
+
+Q� = e- (B v �/ A)  where e is the base of natural logarithms.
+S' = (Q� - 1 / Q�) / 2
+T� = (Q� + 1 / Q�) / 2
+V� = sin (B u� / A)
+U� = (V� cos(gammac) + S� sin(gammac)) / T�
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)
+
+chi = pi / 2 - 2 atan(t�)
+
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) +  sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) +  sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) +  sin(8chi).(4279 e^8 / 161280)
+
+lon=  lon0  - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B","For Projected Coordinate System  Timbalai 1948 / R.S.O. Borneo (m)
+
+Parameters:
+Ellipsoid:  Everest 1830 (1967 Definition)
+a = 6377298.556 metres 1/f = 300.8017
+then e = 0.081472981and e2 = 0.006637847
+
+Latitude Projection Centre fc = 4o00'00""N = 0.069813170 rad
+Longitude Projection Centre lc = 115o00'00""E = 2.007128640 rad
+Azimuth of central line ac = 53o18'56.9537"" = 0.930536611 rad
+Rectified to skew gc= 53o07'48.3685"" = 0.927295218 rad
+Scale factor ko= 0.99984
+Easting at projection centre Ec = 590476.87 m
+Northing at projection centre Nc = 442857.65 m
+
+Forward calculation for: 
+Latitude lat = 5o23'14.1129""N = 0.094025313 rad
+Longitude lon = 115o48'19.8196""E = 2.021187362 rad
+
+B = 1.003303209            F = 1.072121256
+A =6376278.686            H = 1.000002991
+to = 0.932946976          g0 = 0.927295218
+D = 1.002425787           lon0 = 1.914373469
+D2 =1.004857458
+uc =738096.09              vc =0.00
+
+t =0.910700729             Q =1.098398182
+S =0.093990763            T = 1.004407419
+V =0.106961709            U = 0.010967247
+v =-69702.787                u =163238.163
+
+Then Easting E =      679245.73 m
+        Northing N =     596562.78 m
+
+Reverse calculations for same easting and northing first gives :
+v� =   -69702.787              u� =901334.257
+Q� = 1.011028053
+S�  = 0.010967907          T� = 1.000060146
+V� = 0.141349378           U� = 0.093578324
+t� = 0.910700729             c = 0.093404829
+
+Then Latitude = 5o23'14.113""N
+         Longitude = 115o48'19.820""E",,EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,99.811,0
+9816,Tunisia Mining Grid,1,"This grid is used as the basis for mineral leasing in Tunsia.  Lease areas are approximately 2 x 2 km or 400 hectares.  The corners of these blocks are defined through a six figure grid reference where the first three digits are an easting in kilometres and the last three digits are a northing.  The latitudes and longitudes for block corners at 2 km intervals are tabulated in a mining decree dated 1st January 1953.  From this tabulation in which geographical c [...]
+a)  the minimum easting is 94 km, on which the longitude is 5.68989 grads east of Paris.
+b)  the maximum easting is 490 km, on which the longitude is 10.51515 grads east of Paris.
+c)  each 2 km grid easting interval equals 0.02437 grads.
+d)  the minimum northing is 40 km, on which the latitude is 33.39 grads.
+e)  the maximum northing is 860 km, on which the latitude is 41.6039 grads.
+f)  between 40 km N and 360 km N, each 2 km grid northing interval equals 0.02004 grads.
+g)  between 360 km N and 860 km N, each 2 km grid northing interval equals 0.02003 grads.
+
+Formulae are:
+
+Grads from Paris
+
+Lat (grads) = 36.5964 + [(N - 360) * A] 
+where N is in kilometres and A = 0.010015 if N > 360, else A = 0.01002.
+
+LonParis (grads) = 7.83445 + [(E - 270) * 0.012185], where E is in kilometres.
+
+The reverse formulae are:
+
+E (km) = 270 + [(LonParis - 7.83445) / 0.012185] where LonParis is in grads.
+
+N (km) = 360 + [(Lat - 36.5964) / B] 
+where Lat is in grads and B = 0.010015  if  lat>36.5964, else B = 0.01002.
+
+Degrees from Greenwich.
+
+Modern practice in Tunisia is to quote latitude and longitude in degrees with longitudes referenced to the Greenwich meridian.  The formulae required in addition to the above are:
+
+Lat (degrees) =  (Latg * 0.9) where Latg is in grads.
+LonGreenwich (degrees) = [(LonParis + 2.5969213) * 0.9] where LonParis is in grads.
+
+
+Lat (grads) =  (Latd / 0.9) where Latd is in decimal degrees.
+LonParis (grads) = [(LonGreenwich / 0.9) - 2.5969213)] where LonGreenwich is in decimal degrees.","For grid location 302598,
+Latitude = 36.5964 + [(598 - 360) * A].  As N > 360, A = 0.010015.
+Latitude = 38.97997 grads = 35.08197 degrees.
+
+Longitude  = 7.83445 + [(E - 270) * 0.012185, where E = 302.
+Longitude  = 8.22437 grads east of Paris = 9.73916 degrees east of Greenwich.",,EPSG guidance note #7.,EPSG,2000-03-07 00:00:00,99.811  2000.08,0
+9817,Lambert Conic Near-Conformal,1,"To compute the Lambert Conic Near-Conformal the following formulae are used;
+
+E = FE + r sin(theta)
+N = FN + M + r sin(theta) tan(theta/2) using the natural origin rather than the false origin.
+
+Compute constants for the ellipse:
+
+n = (a-b)/(a+b)  
+A� = a [ 1- n + 5 (n^2 - n^3 ) / 4 + 81 ( n^4 - n^5 ) / 64]*pi /180 
+B� = 3 a [ n - n^2 + 7 ( n^3 - n^4 ) / 8 + 55 n^5 / 64] / 2
+C� = 15 a [ n^2 -n^3 + 3 ( n^4 - n^5 ) / 4 ] / 16
+D� = 35 a [ n^3 - n^4 + 11 n^5 / 16 ] / 48
+E� = 315 a [ n^4 - n^5 ] / 512
+
+Then compute the meridional arc from the equator to the parallel.
+s0 = A� lat0 - B� sin(2 lat0) + C� sin(4 lat0) - D� sin(6 lat0) + E� sin(8 lat0) where lat0 in the first term is in degrees
+s0 = A� lat - B� sin(2 lat) + C� sin(4 lat) - D� sin(6 lat) + E� sin(8 lat) where lat0 in the first term is in degrees
+m = s - s0
+A = 1 / (6 rho0 nu0) 
+M = ko ( m + A m^3.  This is the term that is truncated to the third order.
+Ms = M per second of arc = M / ((lat - lat0) * 3600)
+
+theta = (lon - lon0) sin(lat0)
+ro = ko nu0 / tan(lat0)
+r = ro - M
+
+The reverse formulas for lat and lon  from E and N with r0 and Ms as above:
+
+lat  = M�/ (Ms * 3600) + lat0   where lat0 and lat are in degrees
+lon  =  lon0 + theta� / sin(lat0)  where lont0 and lon are in radians
+
+where
+E� = E - FE              N� = N - FN
+theta� = arctan [E� / (r0 - N�)]
+r� = E� / sin(theta�) 
+M� = r0 - r'","For Projected Coordinate System: Deir ez Zor / Levant Zone
+
+Parameters:
+Ellipsoid  Clarke 1880 (IGN)  a = 6378249.2 m  1/f = 293.46602
+then b = 6356515.000    n = 0.001706682563
+
+Latitude Natural Origin  = 34o 39'00"" N = 0.604756586 rad
+Longitude Natural Origin = 37o 21'00"" E=  0.651880476 rad
+Scale factor at origin ko = 0.99962560
+False Eastings FE  = 300000.00 m
+False Northings FN  = 300000.00 m
+
+Forward calculation for: 
+Latitude of 37d 31' 17.625"" N = 0.654874806 rad
+Longitude of 34d 08' 11.291"" E = 0.595793792 rad
+first gives
+A = 4.1067494 * 10e-15      A�=111131.8633
+B�= 16300.64407     C�= 17.38751     D�= 0.02308      E�= 0.000033
+so = 3835482.233    s  = 4154101.458     m = 318619.225
+M = 318632.72         Ms = 30.82262319
+q = -0.03188875       ro = 9235264.405     r = 8916631.685
+
+Then Easting E =   15707.96 m (c.f. E =   15708.00 using full formulae)
+         Northing N =      623165.96 m (c.f. N = 623167.20 using full formulae)
+
+Reverse calculation for the same easting and northing first gives
+
+q' = -0.03188875
+r�  =  8916631.685
+M�= 318632.72 
+
+Latitude =      0.654874806 rad = 37d 31' 17.625"" N
+Longitude = 0.595793792 rad =  34d 08' 11.291"" E",The Lambert Near-Conformal projection is derived from the Lambert Conformal Conic projection by truncating the series expansion of the projection formulae.,EPSG guidance note #7.,EPSG,1999-11-15 00:00:00,99.811,0
+9818,American Polyconic,1,See information source.,,See information source for formula and example.,"US Geological Survey Professional Paper 1395; ""Map Projections - A Working Manual"";  J. Snyder",EPSG,1999-10-20 00:00:00,99.55,0
+9819,Krovak Oblique Conic Conformal,1,"From the defining parameters the following constants for the projection may be calculated :
+
+B=((1 + e^2 cos^4(latC)) / (1 - e^2 ))^0.5
+A=a (1 - e^2 )^0.5 / ( 1 - e^2 sin^2 (latC))
+gamma0=asin(sin (latC) / B)
+t0 =tan(pi / 4 + gamma0 / 2) . ((1 + e sin(latC)) / (1 - e sin (latC)))^(e.B/2) / tan(pi / 4 + latC/ 2)^B
+n = sin lat1
+r0=kc  A / tan (lat1)
+
+To derive the projected Southing and Westing coordinates of a point with geographical coordinates (lat, lon) the formulas for the oblique conic conformal are:
+
+Southing:    X  = Ec + r cos theta
+Westing:     Y = Nc + r sin theta
+ 
+where
+
+U=2 (atan ( k tan^B (lat/2 + pi / 4 ) ((1 + e sin (lat)) / (1 - e sin (lat)))^(e.B/2 )) - pi / 4)
+V=B (lonc -  lon)
+S=asin ( cos (alphaC) sin ( U ) + sin (alphaC) cos (U) cos (V) )
+D=asin ( cos ( U ) sin ( V ) / cos ( S ) )
+theta=n D
+r=r0 tan(pi / 4 + gamma0/ 2) / tan^n ( S/2 + pi / 4 )
+
+The reverse formulas to derive the latitude and longitude of a point from its Southing and Westing values are:
+
+latj = 2*(atan(k^(-1/B) tan^(1/B) ( U�/2 + pi / 4 ) ((1 + e sin ( lat j-1) / (1 - e sin ( latj-1))^(e/2) ) - pi / 4) 
+where j = 1,2 and the latitude is found by iteration.
+lon = lonc - V' / B
+where
+r' =[(X - Ec)^2 + (Y - Nc)^2]^(1/2)  
+theta'=arctan [(X- Ec)/(Y- Nc)]
+D'=theta' / sin ( lat1)
+S'=2*(atan((r0 / r )^(1/n) tan(pi / 4 + lat0/ 2)) - pi / 4)
+U'=asin ( cos (alphaC) sin ( S' ) - sin (alphaC) cos (S') cos (D') )
+V'=asin ( cos (S') sin (D') / cos (U'))","For Projected Coordinate Reference System: S-JTSK (Ferro) / Krovak
+
+N.B. Krovak projection uses Ferro as the prime meridian. This has a longitude with reference to Greenwich of 17 deg 40 min West. To apply the formulae the defining longitudes must be corrected to the Greenwich meridian.
+
+Parameters:
+Ellipsoid  Bessel 1841   a = 6377397.155m  1/f = 299.15281
+    then    e = 0.081696831        e2 = 0.006674372
+
+Latitude of projection centre = 49o 30'00"" N =  0.604756586 rad
+Longitude of Origin = 42o 30'00"" East of Ferro
+Longitude of Ferro is 17o 40'00"" West of Greenwich
+Longitude of Origin = 24o 50'00"" East of Greenwich = 0.433423431   rad
+Latitude of pseudo standard parallel = 78o 30'00"" N
+Azimuth of centre line = 30o 17' 17.303""
+Scale factor on pseudo Standard Parallel (ko) = 0.99990
+Easting at projection centre (Ec) = 0.00 m
+Northing  at projection centre = 0.00 m
+
+Projection constants:
+B=1.000597498
+A=6380703.61
+*gamma0=0.863239103
+t0=1.003419164
+n= 0.979924705
+r0=1298039.005
+
+Forward calculation for: 
+Latitude = 50o 12' 32.4416"" N = 0.876312566 rad
+Longitude = 16o 50' 59.1790"" E = 0.294083999 rad
+
+Gives
+
+U=0.875596949
+V=0.139422687
+S=1.386275049
+D=0.506554623
+theta=0.496385389
+r0=1194731.014
+
+Then Southing X =  1050538.643 m
+         Westing  Y =    568990.997 m
+
+Reverse calculation for the same Southing and Westing gives
+
+r' =1194731.014
+theta' =0.496385389
+D'=0.506554623
+S'=1.386275049
+U'=0.875596949
+V'=0.139422687
+lat(iteration 1)=0.876310601 
+lat(iteration 2)=0.876312560
+lat(iteration3)=0.876312566
+
+Latitude = 0.876312566 rad = 50o 12' 32.4416"" N
+Longitude = 0.595793792 rad = 16o 50' 59.1790"" E",,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,0
+9820,Lambert Azimuthal Equal Area,1,See information source or EPSG Guidance Note 7.,See information source.,This is the ellipsoidal form of the projection.,"USGS Professional Paper 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG,2001-06-05 00:00:00,,0
+9821,Lambert Azimuthal Equal Area (Spherical),1,See information source.,See information source.,This is the spherical form of the projection.  See coordinate operation method Lambert Azimuthal Equal Area (code 9820) for ellipsoidal form.  Differences of several tens of metres result from comparison of the two methods.,"USGS Professional Paper 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG,2001-06-05 00:00:00,,0
+9822,Albers Equal Area,1,See information source or EPSG Guidance Note 7.,See Information Source.,,"USGS Professional Paper 1395, ""Map Projections - A Working Manual"" by John P. Snyder.",EPSG,2001-06-05 00:00:00,,0
+9823,Equidistant Cylindrical,1,"This method has one of the simplest formulas available. If the latitude of natural origin (*O) is at the equator the method is also known as Plate Carr�e. It is not used for rigorous topographic mapping because its distortion characteristics are unsuitable. Formulas are included to distinguish this map projection method from an approach sometimes mistakenly called by the same name and used for simple computer display of geographic coordinates � see Pseudo  [...]
+
+For the forward calculation:
+
+X =  R . (lon - lonO) . cos(latO)
+Y =  R .  lat
+
+where R = [a^2 * (1 �  e^2)]^0.5
+and lat and lon are expressed in radians.
+
+For the reverse calculation:
+
+lat = Y / R  
+lon = lonO + (X / R cos(latO))
+
+where R is as for the forward method.",See information source.,"If the latitude of natural origin is at the equator, also known as Plate Carr�e. See also Pseudo Plate Carree, method code 9825.","US Geological Survey Professional Paper 1395; ""Map Projections - A Working Manual"";  J. Snyder.",EPSG,2001-11-06 00:00:00,,0
+9824,Transverse Mercator Zoned Grid System,1,"The standard Transverse Mercator formulas (coordinate operation method 9807) are modified as follows:
+
+Zone number, Z, = int((Long + LongI + W) / W)  with Long,  LongI and W in degrees. 
+where (LongI) is the Initial Longitude of the zoned grid system
+and W is the width of each zone of the zoned grid system.
+If Long < 0, Long = (Long + 360) degrees.
+
+Then,
+   Long0  = [Z * W] � [LongI + (W/2)]
+
+For the forward calculation,
+   Easting, E =  Z*10^6 + FE + k0.nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'^2)A^5/120]
+   
+and in the reverse calculation for longitude, 
+   D = (E � [FE + Z*10^6])/(nu1.k0)",,If locations fall outwith the fixed zones the general Transverse Mercator method (code 9807) must be used for each zone.,EPSG Guidance Note #7.,EPSG,2001-06-05 00:00:00,,0
+9825,Pseudo Plate Carree,1,"X = Lon
+Y = Lat
+
+Lat = Y
+Lon = X",,"Used only for depiction of graticule (latitude/longitude) coordinates on a computer display. The axes units are decimal degrees and of variable scale. The origin is at Lat = 0, Long = 0. See Equidistant Cylindrical, code 9823, for proper Plate Carr�e.",EPSG,EPSG,2001-11-06 00:00:00,,0
+9826,Lambert Conic Conformal (West Orientated),1,"In older mapping of Denmark and Greenland the Lambert Conic Conformal is used with axes positive north and west. To derive the projected Westing and Northing coordinates of a point with geographical coordinates (Lat, Lon) the formulas are as for the standard Lambert Conic Conformal (1SP) case (coordinate operation method code 9801) except for:
+
+W =  FE � r.sin(theta)
+
+In this formula the term FE retains its definition, i.e. in the Lambert Conic Conformal (West Orientated) method it increases the Westing value at the natural origin. In this method it is effectively false westing (FW).
+
+The reverse formulas to derive the latitude and longitude of a point from its Westing and Northing values are as for the standard Lambert Conic Conformal (1SP) case except for:
+
+theta' = arctan[(FE � W)/{r0 � (N � FN)}]
+r' = +/-[(FE � W)^2 + {r0 � (N � FN)}^2]^0.5",,,EPSG guidance note #7.,EPSG,2002-01-16 00:00:00,,0
+9827,Bonne,1,See information source or EPSG Guidance Note 7.,See information source.,,"US Geological Survey Professional Paper 1395, ""Map Projections - A Working Manual"" by John P Snyder.",EPSG,2002-07-13 00:00:00,,0
+9828,Bonne (South Orientated),1,See EPSG Guidance Note 7.,,,EPSG Guidance Note number 7.,EPSG,2002-07-13 00:00:00,,0
diff --git a/src/tiff/csv/coordinate_operation_parameter.csv b/src/tiff/csv/coordinate_operation_parameter.csv
new file mode 100644
index 0000000..480aa35
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_parameter.csv
@@ -0,0 +1,99 @@
+"PARAMETER_CODE","PARAMETER_NAME","DESCRIPTION","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+8601,Latitude offset,The difference between the latitude values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8602,Longitude offset,The difference between the longitude values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8603,Vertical Offset,The difference between the height or depth values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8604,Geoid undulation,"The height of the geoid above a specified ellipsoid.  Indicated by symbol N.  Usually interpolated within a geoid model.
+N = h - H, where h is the height above the ellipsoid and H is the gravity-related height.",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8605,X-axis translation,The difference between the X values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8606,Y-axis translation,The difference between the Y values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8607,Z-axis translation,The difference between the Z values of a point in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8608,X-axis rotation,"The angular difference between the Y and Z axes directions of target and source coordinate reference systems. This is a rotation about the X axis as viewed from the origin looking along that axis. The particular method defines which direction is positive, and what is being rotated (point or axis).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8609,Y-axis rotation,"The angular difference between the X and Z axes directions of target and source coordinate reference systems. This is a rotation about theY axis as viewed from the origin looking along that axis. The particular method defines which direction is positive, and what is being rotated (point or axis).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8610,Z-axis rotation,"The angular difference between the X and Y axes directions of target and source coordinate reference systems. This is a rotation about the Z axis as viewed from the origin looking along that axis. The particular method defines which direction is positive, and what is being rotated (point or axis).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8611,Scale difference,"The scale difference increased by unity equals the ratio of an the length of an arbitrary distance between two points in target and source coordinate reference systems.  This is usually averaged for the intersection area of the two coordinate reference systems. 
+
+If a distance of 100 km in the source coordinate reference system translates into a distance of 100.001 km in the target coordinate reference system, the scale difference is 1 ppm (the ratio being 1.000001).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8612,Scale factor for source coordinate reference system first axis,"The unit of measure of the source coordinate reference system first axis, expressed in the unit of measure of the target coordinate reference system.",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8613,Scale factor for source coordinate reference system second axis,"The unit of measure of the source coordinate reference system second axis, expressed in the unit of measure of the target coordinate reference system",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8614,Rotation angle of source coordinate reference system axes,"Angle (counter-clockwise positive) through which both of the source coordinate reference system axes need to rotated to coincide with the corresponding target coordinate reference system axes.  
+
+Alternatively, the bearing (clockwise positive) of the source coordinate reference system YS-axis measured relative to target coordinate reference system north.",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8615,Rotation angle of source coordinate reference system first axis,Angle (counter-clockwise positive) through which the source coordinate reference system's first axis needs to rotated to coincide with the corresponding axis of the target coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8616,Rotation angle of source coordinate reference system second axis,Angle (counter-clockwise positive) through which the source coordinate reference system's second axis needs to rotated to coincide with the corresponding axis of the target coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8617,Ordinate 1 of evaluation point,The value of the first ordinate value of the evaluation point.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8618,Ordinate 2 of evaluation point,The value of the second ordinate of the evaluation point.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8619,Ordinate 1 of evaluation point in source CRS,The value of the first ordinate of the evaluation point expressed in the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8620,Ordinate 2 of evaluation point in source CRS,The value of the second ordinate of the evaluation point expressed in the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8621,Ordinate 1 of evaluation point in target CRS,The value of the first ordinate of the evaluation point expressed in the target coordinate reference system.  In the case of an affine transformation the evaluation point is the origin of the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8622,Ordinate 2 of evaluation point in target CRS,The value of the second ordinate of the evaluation point expressed in the target coordinate reference system.  In the case of an affine transformation the evaluation point is the origin of the source coordinate reference system.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8623,A0,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8624,A1,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8625,A2,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8626,A3,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8627,A4,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8628,A5,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8629,A6,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8630,A7,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8631,A8,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8632,A9,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8633,A10,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8634,A11,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8635,A12,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8636,A13,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8637,A14,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8638,B00,Coefficient used only in the Madrid to ED50 polynomial transformation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8639,B0,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8640,B1,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8641,B2,Coefficient used in affine (general parametric) and polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8642,B3,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8643,B4,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8644,B5,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8645,B6,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8646,B7,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8647,B8,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8648,B9,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8649,B10,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8650,B11,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8651,B12,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8652,B13,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8653,B14,Coefficient used in polynomial transformations.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8654,Semi-major axis length difference,The difference between the semi-major axis values of the ellipsoids used in the target and source coordinate reference systems.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8655,Flattening difference,"The difference between the flattening values of the ellipsoids used in the target and source coordinate reference systems. 
+
+flattening  = 1 / (inverse_flattening).",EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8656,Latitude and longitude difference file,The name of the [path and] file containing latitude and longitude differences.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8657,Latitude difference file,The name of the [path and] file containing latitude differences.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8658,Longitude difference file,The name of the [path and] file containing longitude differences.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8659,Geod. tfm. code for northern boundary,The EPSG code for the geodetic transformation applied at the northern boundary of the interpolation area.  Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8660,Geod. tfm. code for southern boundary,The EPSG code for the geodetic transformation applied at the southern boundary of the interpolation area.  Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8661,Geod. tfm. name for northern boundary,The EPSG name for the geodetic transformation applied at the northern boundary of the interpolation area.  Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8662,Geod. tfm. name for southern boundary,The EPSG name for the geodetic transformation applied at the southern boundary of the interpolation area.  Applies to Norwegian offshore interpolation method.,EPSG guidance note number 7.,EPSG,2000-06-23 00:00:00,,0
+8663,Point scale factor,The point scale factor in a selected point of the target coordinate reference system. to be used as representative figure of the scale of the target coordinate reference system in a the area to which a coordinate transformation is defined.,EPSG guidance note number 7 (June 2000 Revision),EPSG,2000-06-29 00:00:00,,0
+8664,Easting and northing difference file,The name of the [path and] file containing easting and northing differences.,Ordnance Survey of Great Britain,EPSG,2000-10-19 00:00:00,,0
+8665,Maritime Province residual file,Coordinate differences at control points,Survey of New Brunswick,EPSG,2000-10-19 00:00:00,,0
+8666,Geoid model file,The name of the [path and] file containing geoid heights.,EPSG,EPSG,2001-06-05 00:00:00,,0
+8667,Ordinate 3 of evaluation point,The value of the third ordinate of the evaluation point.,EPSG guidance note number 7.,EPSG,2001-11-06 00:00:00,,0
+8801,Latitude of natural origin,"The latitude of the point from which the values of both the geographical coordinates on the ellipsoid and the grid coordinates on the projection are deemed to increment or decrement for computational purposes. Alternatively it may be considered as the latitude of the point which in the absence of application of false coordinates has grid coordinates of (0,0).",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8802,Longitude of natural origin,"The longitude of the point from which the values of both the geographical coordinates on the ellipsoid and the grid coordinates on the projection are deemed to increment or decrement for computational purposes. Alternatively it may be considered as the longitude of the point which in the absence of application of false coordinates has grid coordinates of (0,0).  Sometimes known as ""central meridian (CM)"".",EPSG guidance note number 7.,EPSG,2002-06-22 0 [...]
+8805,Scale factor at natural origin,"The factor by which the map grid is reduced or enlarged during the projection process, defined by its value at the natural origin.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8806,False easting,"Since the natural origin may be at or near the centre of the projection and under normal coordinate circumstances would thus give rise to negative coordinates over parts of the mapped area, this origin is usually given false coordinates which are large enough to avoid this inconvenience. The False Easting, FE, is the value assigned to the abscissa (east or west) axis of the projection grid at the natural origin.",EPSG guidance note number 7.,EPSG,2002-07-31 00:00:00,2 [...]
+8807,False northing,"Since the natural origin may be at or near the centre of the projection and under normal coordinate circumstances would thus give rise to negative coordinates over parts of the mapped area, this origin is usually given false coordinates which are large enough to avoid this inconvenience. The False Northing, FN, is the value assigned to the ordinate (north or south) axis of the projection grid at the natural origin.",EPSG guidance note number 7.,EPSG,2002-07-31 00:00: [...]
+8811,Latitude of projection centre,"For an oblique projection, this is the latitude of the point at which the azimuth of the central line is defined.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8812,Longitude of projection centre,"For an oblique projection, this is the longitude of the point at which the azimuth of the central line is defined.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8813,Azimuth of initial line,"The azimuthal direction (north zero, east of north being positive) of the great circle which is the centre line of an oblique projection. The azimuth is given at the projection center.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8814,Angle from Rectified to Skew Grid,The angle at the natural origin of an oblique projection through which the natural coordinate reference system is rotated to make the projection north axis parallel with true north.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8815,Scale factor on initial line,"The factor by which the map grid is reduced or enlarged during the projection process, defined by its value at the projection center.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8816,Easting at projection centre,The easting value assigned to the projection centre.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8817,Northing at projection centre,The northing value assigned to the projection centre.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8818,Latitude of pseudo standard parallel,"Latitude of the parallel on which the conic or cylindrical projection is based.  This latitude is not geographic, but is defined on the conformal sphere AFTER its rotation to obtain the oblique aspect of the projection",EPSG guidance note number 7,EPSG,2000-03-07 00:00:00,,0
+8819,Scale factor on pseudo standard parallel,"The factor by which the map grid is reduced or enlarged during the projection process, defined by its value at the pseudo-standard parallel.",EPSG guidance note number 7.,EPSG,2000-03-07 00:00:00,,0
+8821,Latitude of false origin,The latitude of the point which is not the natural origin and at which grid coordinate values false easting and false northing are defined.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8822,Longitude of false origin,The longitude of the point which is not the natural origin and at which grid coordinate values false easting and false northing are defined.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8823,Latitude of 1st standard parallel,"For a conic projection with two standard parallels, this is the latitude of intersection of the cone with the ellipsoid that is nearest the pole.  Scale is true along this parallel.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8824,Latitude of 2nd standard parallel,"For a conic projection with two standard parallels, this is the latitude of intersection of the cone with the ellipsoid that is furthest from the pole.  Scale is true along this parallel.",EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8826,Easting at false origin,The easting value assigned to the false origin.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8827,Northing at false origin,The northing value assigned to the false origin.,EPSG guidance note number 7.,EPSG,1999-09-09 00:00:00,,0
+8828,Spherical latitude of origin,The latitude of the point from which the values of both the geographical coordinates on the sphere and the grid coordinates on a spherical projection are deemed to increment or decrement for computational purposes.,EPSG guidance note number 7.,EPSG,2001-06-05 00:00:00,,0
+8829,Spherical longitude of origin,The longitude of the point from which the values of both the geographical coordinates on the sphere and the grid coordinates on a spherical projection are deemed to increment or decrement for computational purposes.,EPSG guidance note number 7.,EPSG,2001-06-05 00:00:00,,0
+8830,Initial longitude,The longitude of the western limit of the first zone of a Transverse Mercator zoned grid system.,EPSG,EPSG,2001-06-05 00:00:00,,0
+8831,Zone width,The longitude width of a zone of a Transverse Mercator zoned grid system.,EPSG,EPSG,2001-06-05 00:00:00,,0
diff --git a/src/tiff/csv/coordinate_operation_parameter_value.csv b/src/tiff/csv/coordinate_operation_parameter_value.csv
new file mode 100644
index 0000000..dc26765
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_parameter_value.csv
@@ -0,0 +1,8406 @@
+"COORD_OP_CODE","COORD_OP_METHOD_CODE","PARAMETER_CODE","PARAMETER_VALUE","PARAM_VALUE_FILE_REF","UOM_CODE"
+1025,9630,8617,55.0,,9102
+1025,9630,8618,0.0,,9102
+1025,9630,8623,-0.00000556098,,9203
+1025,9630,8624,-0.00000155391,,9203
+1025,9630,8625,-0.00000040262,,9203
+1025,9630,8626,-0.000000509693,,9203
+1025,9630,8627,-0.000000819775,,9203
+1025,9630,8628,-0.000000247592,,9203
+1025,9630,8629,0.000000136682,,9203
+1025,9630,8630,0.000000186198,,9203
+1025,9630,8631,0.00000012335,,9203
+1025,9630,8632,0.0000000568797,,9203
+1025,9630,8633,-0.00000000232217,,9203
+1025,9630,8634,-0.00000000769931,,9203
+1025,9630,8635,-0.00000000786953,,9203
+1025,9630,8636,-0.00000000612216,,9203
+1025,9630,8637,-0.00000000401382,,9203
+1025,9630,8639,0.0000148944,,9203
+1025,9630,8640,0.00000268191,,9203
+1025,9630,8641,0.0000024529,,9203
+1025,9630,8642,0.0000002944,,9203
+1025,9630,8643,0.0000015226,,9203
+1025,9630,8644,0.000000910592,,9203
+1025,9630,8645,-0.000000382241,,9203
+1025,9630,8646,-0.000000851732,,9203
+1025,9630,8647,-0.000000566713,,9203
+1025,9630,8648,-0.000000185188,,9203
+1025,9630,8649,0.0000000284312,,9203
+1025,9630,8650,0.0000000684853,,9203
+1025,9630,8651,0.0000000500828,,9203
+1025,9630,8652,0.0000000415937,,9203
+1025,9630,8653,0.00000000762236,,9203
+1026,9617,8623,8.4386918,,9203
+1026,9617,8624,-0.0972,,9203
+1026,9617,8625,-0.03672,,9203
+1026,9617,8626,0.0000406,,9203
+1026,9617,8638,-13276.58,,9203
+1026,9617,8639,2.6620443,,9203
+1026,9617,8640,0.07992,,9203
+1026,9617,8641,-0.0036,,9203
+1026,9617,8642,-0.0000109,,9203
+1027,9617,8623,11.328779,,9203
+1027,9617,8624,-0.1674,,9203
+1027,9617,8625,-0.03852,,9203
+1027,9617,8626,0.0000379,,9203
+1027,9617,8638,-13276.58,,9203
+1027,9617,8639,2.5079425,,9203
+1027,9617,8640,0.08352,,9203
+1027,9617,8641,-0.00864,,9203
+1027,9617,8642,-0.0000038,,9203
+1028,9617,8623,6.2280987,,9203
+1028,9617,8624,-0.03924,,9203
+1028,9617,8625,-0.03276,,9203
+1028,9617,8626,0.0000284,,9203
+1028,9617,8638,-13276.58,,9104
+1028,9617,8639,2.9368989,,9203
+1028,9617,8640,0.07272,,9203
+1028,9617,8641,0.00216,,9203
+1028,9617,8642,-0.0000179,,9203
+1029,9632,8619,155000.0,,9001
+1029,9632,8620,463000.0,,9001
+1029,9632,8621,663395.607,,9001
+1029,9632,8622,5781194.38,,9001
+1029,9632,8624,-51.681,,9203
+1029,9632,8625,3290.525,,9203
+1029,9632,8626,20.172,,9203
+1029,9632,8627,1.133,,9203
+1029,9632,8628,2.075,,9203
+1029,9632,8629,0.251,,9203
+1029,9632,8630,0.075,,9203
+1029,9632,8631,-0.012,,9203
+1030,9632,8619,663395.607,,9001
+1030,9632,8620,5781194.38,,9001
+1030,9632,8621,155000.0,,9001
+1030,9632,8622,463000.0,,9001
+1030,9632,8624,56.619,,9203
+1030,9632,8625,3290.362,,9203
+1030,9632,8626,20.184,,9203
+1030,9632,8627,-0.861,,9203
+1030,9632,8628,2.082,,9203
+1030,9632,8629,-0.023,,9203
+1030,9632,8630,0.07,,9203
+1030,9632,8631,-0.025,,9203
+1031,9632,8619,155000.0,,9001
+1031,9632,8620,463000.0,,9001
+1031,9632,8621,663395.563,,9001
+1031,9632,8622,5781194.442,,9001
+1031,9632,8624,-51.718,,9203
+1031,9632,8625,3290.521,,9203
+1031,9632,8626,20.154,,9203
+1031,9632,8627,1.152,,9203
+1031,9632,8628,2.061,,9203
+1031,9632,8629,0.238,,9203
+1031,9632,8630,0.058,,9203
+1031,9632,8631,-0.013,,9203
+1032,9632,8619,663395.563,,9001
+1032,9632,8620,5781194.442,,9001
+1032,9632,8621,155000.0,,9001
+1032,9632,8622,463000.0,,9001
+1032,9632,8624,99943.4175,,9203
+1032,9632,8625,-3290.3612,,9203
+1032,9632,8626,-20.1673,,9203
+1032,9632,8627,0.8387,,9203
+1032,9632,8628,-2.0651,,9203
+1032,9632,8629,0.0334,,9203
+1032,9632,8630,-0.0523,,9203
+1032,9632,8631,0.23,,9203
+1033,9631,8619,0.0,,9001
+1033,9631,8620,0.0,,9001
+1033,9631,8621,449681.702,,9001
+1033,9631,8622,5460505.326,,9001
+1033,9631,8624,-71.3747,,9203
+1033,9631,8625,1858.8407,,9203
+1033,9631,8626,-5.4504,,9203
+1033,9631,8627,-16.9681,,9203
+1033,9631,8628,4.0783,,9203
+1033,9631,8629,0.2193,,9203
+1034,9631,8619,500000.0,,9001
+1034,9631,8620,5500000.0,,9001
+1034,9631,8621,448933.793,,9001
+1034,9631,8622,5461423.984,,9001
+1034,9631,8624,28.7827,,9203
+1034,9631,8625,-1843.8236,,9203
+1034,9631,8626,0.0864,,9203
+1034,9631,8627,11.9065,,9203
+1034,9631,8628,-4.0793,,9203
+1034,9631,8629,0.0809,,9203
+1035,9621,8611,0.0,,9202
+1035,9621,8614,271.053,,9110
+1035,9621,8621,2610200.48,,9001
+1035,9621,8622,4905282.73,,9001
+1036,9633,8664,,ostn97.txt,
+1037,9632,8619,155000.0,,9001
+1037,9632,8620,463000.0,,9001
+1037,9632,8621,526577.124,,9001
+1037,9632,8622,5778575.474,,9001
+1037,9632,8624,99969.1014,,9203
+1037,9632,8625,533.6385,,9203
+1037,9632,8626,3.3943,,9203
+1037,9632,8627,-0.1391,,9203
+1037,9632,8628,2.0658,,9203
+1037,9632,8629,0.0677,,9203
+1037,9632,8630,0.0561,,9203
+1037,9632,8631,-0.0148,,9203
+1038,9632,8619,526577.124,,9001
+1038,9632,8620,5778575.474,,9001
+1038,9632,8621,155000.0,,9001
+1038,9632,8622,463000.0,,9001
+1038,9632,8624,100028.0577,,9203
+1038,9632,8625,-533.9532,,9203
+1038,9632,8626,-3.3943,,9203
+1038,9632,8627,0.1935,,9203
+1038,9632,8628,-2.0687,,9203
+1038,9632,8629,-0.0235,,9203
+1038,9632,8630,-0.0554,,9203
+1038,9632,8631,0.0167,,9203
+1100,9603,8605,-166.0,,9001
+1100,9603,8606,-15.0,,9001
+1100,9603,8607,204.0,,9001
+1101,9603,8605,-118.0,,9001
+1101,9603,8606,-14.0,,9001
+1101,9603,8607,218.0,,9001
+1102,9603,8605,-134.0,,9001
+1102,9603,8606,-2.0,,9001
+1102,9603,8607,210.0,,9001
+1103,9603,8605,-165.0,,9001
+1103,9603,8606,-11.0,,9001
+1103,9603,8607,206.0,,9001
+1104,9603,8605,-123.0,,9001
+1104,9603,8606,-20.0,,9001
+1104,9603,8607,220.0,,9001
+1105,9603,8605,-128.0,,9001
+1105,9603,8606,-18.0,,9001
+1105,9603,8607,224.0,,9001
+1106,9603,8605,-161.0,,9001
+1106,9603,8606,-14.0,,9001
+1106,9603,8607,205.0,,9001
+1107,9603,8605,-43.0,,9001
+1107,9603,8606,-163.0,,9001
+1107,9603,8607,45.0,,9001
+1108,9603,8605,-133.0,,9001
+1108,9603,8606,-48.0,,9001
+1108,9603,8607,148.0,,9001
+1109,9603,8605,-134.0,,9001
+1109,9603,8606,-48.0,,9001
+1109,9603,8607,149.0,,9001
+1110,9603,8605,-150.0,,9001
+1110,9603,8606,-250.0,,9001
+1110,9603,8607,-1.0,,9001
+1111,9603,8605,-143.0,,9001
+1111,9603,8606,-236.0,,9001
+1111,9603,8607,7.0,,9001
+1112,9606,8605,593.16,,9001
+1112,9606,8606,26.15,,9001
+1112,9606,8607,478.54,,9001
+1112,9606,8608,-6.3239,,9109
+1112,9606,8609,-0.5008,,9109
+1112,9606,8610,-5.5487,,9109
+1112,9606,8611,4.0775,,9202
+1113,9603,8605,-143.0,,9001
+1113,9603,8606,-90.0,,9001
+1113,9603,8607,-294.0,,9001
+1114,9603,8605,-138.0,,9001
+1114,9603,8606,-105.0,,9001
+1114,9603,8607,-289.0,,9001
+1115,9603,8605,-153.0,,9001
+1115,9603,8606,-5.0,,9001
+1115,9603,8607,-292.0,,9001
+1116,9603,8605,-125.0,,9001
+1116,9603,8606,-108.0,,9001
+1116,9603,8607,-295.0,,9001
+1117,9603,8605,-161.0,,9001
+1117,9603,8606,-73.0,,9001
+1117,9603,8607,-317.0,,9001
+1118,9603,8605,-134.0,,9001
+1118,9603,8606,-105.0,,9001
+1118,9603,8607,-295.0,,9001
+1119,9603,8605,-169.0,,9001
+1119,9603,8606,-19.0,,9001
+1119,9603,8607,-278.0,,9001
+1120,9603,8605,-147.0,,9001
+1120,9603,8606,-74.0,,9001
+1120,9603,8607,-283.0,,9001
+1121,9603,8605,-142.0,,9001
+1121,9603,8606,-96.0,,9001
+1121,9603,8607,-293.0,,9001
+1122,9603,8605,-160.0,,9001
+1122,9603,8606,-6.0,,9001
+1122,9603,8607,-302.0,,9001
+1123,9603,8605,-377.0,,9001
+1123,9603,8606,681.0,,9001
+1123,9603,8607,-50.0,,9001
+1124,9603,8605,-73.0,,9001
+1124,9603,8606,213.0,,9001
+1124,9603,8607,296.0,,9001
+1125,9603,8605,307.0,,9001
+1125,9603,8606,304.0,,9001
+1125,9603,8607,-318.0,,9001
+1126,9603,8605,-384.0,,9001
+1126,9603,8606,664.0,,9001
+1126,9603,8607,-48.0,,9001
+1127,9603,8605,-148.0,,9001
+1127,9603,8606,136.0,,9001
+1127,9603,8607,90.0,,9001
+1128,9603,8605,-136.0,,9001
+1128,9603,8606,-108.0,,9001
+1128,9603,8607,-292.0,,9001
+1129,9603,8605,-134.73,,9001
+1129,9603,8606,-110.92,,9001
+1129,9603,8607,-292.66,,9001
+1130,9603,8605,-263.0,,9001
+1130,9603,8606,6.0,,9001
+1130,9603,8607,431.0,,9001
+1131,9603,8605,-134.0,,9001
+1131,9603,8606,229.0,,9001
+1131,9603,8607,-29.0,,9001
+1132,9603,8605,-206.0,,9001
+1132,9603,8606,172.0,,9001
+1132,9603,8607,-6.0,,9001
+1133,9603,8605,-87.0,,9001
+1133,9603,8606,-98.0,,9001
+1133,9603,8607,-121.0,,9001
+1134,9603,8605,-87.0,,9001
+1134,9603,8606,-96.0,,9001
+1134,9603,8607,-120.0,,9001
+1135,9603,8605,-103.0,,9001
+1135,9603,8606,-106.0,,9001
+1135,9603,8607,-141.0,,9001
+1136,9603,8605,-104.0,,9001
+1136,9603,8606,-101.0,,9001
+1136,9603,8607,-140.0,,9001
+1137,9603,8605,-130.0,,9001
+1137,9603,8606,-117.0,,9001
+1137,9603,8607,-151.0,,9001
+1138,9603,8605,-86.0,,9001
+1138,9603,8606,-96.0,,9001
+1138,9603,8607,-120.0,,9001
+1139,9603,8605,-87.0,,9001
+1139,9603,8606,-95.0,,9001
+1139,9603,8607,-120.0,,9001
+1140,9603,8605,-84.0,,9001
+1140,9603,8606,-95.0,,9001
+1140,9603,8607,-130.0,,9001
+1141,9603,8605,-117.0,,9001
+1141,9603,8606,-132.0,,9001
+1141,9603,8607,-164.0,,9001
+1142,9603,8605,-97.0,,9001
+1142,9603,8606,-103.0,,9001
+1142,9603,8607,-120.0,,9001
+1143,9603,8605,-97.0,,9001
+1143,9603,8606,-88.0,,9001
+1143,9603,8607,-135.0,,9001
+1144,9603,8605,-107.0,,9001
+1144,9603,8606,-88.0,,9001
+1144,9603,8607,-149.0,,9001
+1145,9603,8605,-84.0,,9001
+1145,9603,8606,-107.0,,9001
+1145,9603,8607,-120.0,,9001
+1146,9606,8605,-82.981,,9001
+1146,9606,8606,-99.719,,9001
+1146,9606,8607,-110.709,,9001
+1146,9606,8608,-0.5076,,9109
+1146,9606,8609,0.1503,,9109
+1146,9606,8610,0.3898,,9109
+1146,9606,8611,-0.3143,,9202
+1147,9606,8605,-1.51,,9001
+1147,9606,8606,-0.84,,9001
+1147,9606,8607,-3.5,,9001
+1147,9606,8608,-1.893,,9109
+1147,9606,8609,-0.687,,9109
+1147,9606,8610,-2.764,,9109
+1147,9606,8611,0.609,,9202
+1148,9603,8605,-130.0,,9001
+1148,9603,8606,110.0,,9001
+1148,9603,8607,-13.0,,9001
+1149,9603,8605,0.0,,9001
+1149,9603,8606,0.0,,9001
+1149,9603,8607,0.0,,9001
+1150,9603,8605,0.0,,9001
+1150,9603,8606,0.0,,9001
+1150,9603,8607,0.0,,9001
+1151,9603,8605,84.0,,9001
+1151,9603,8606,-22.0,,9001
+1151,9603,8607,209.0,,9001
+1152,9603,8605,-637.0,,9001
+1152,9603,8606,-549.0,,9001
+1152,9603,8607,-203.0,,9001
+1153,9603,8605,217.0,,9001
+1153,9603,8606,823.0,,9001
+1153,9603,8607,299.0,,9001
+1154,9603,8605,209.0,,9001
+1154,9603,8606,818.0,,9001
+1154,9603,8607,290.0,,9001
+1155,9603,8605,282.0,,9001
+1155,9603,8606,726.0,,9001
+1155,9603,8607,254.0,,9001
+1156,9603,8605,295.0,,9001
+1156,9603,8606,736.0,,9001
+1156,9603,8607,257.0,,9001
+1157,9603,8605,-97.0,,9001
+1157,9603,8606,787.0,,9001
+1157,9603,8607,86.0,,9001
+1158,9603,8605,-11.0,,9001
+1158,9603,8606,851.0,,9001
+1158,9603,8607,5.0,,9001
+1159,9603,8605,-130.0,,9001
+1159,9603,8606,29.0,,9001
+1159,9603,8607,364.0,,9001
+1160,9603,8605,-90.0,,9001
+1160,9603,8606,40.0,,9001
+1160,9603,8607,88.0,,9001
+1161,9603,8605,-133.0,,9001
+1161,9603,8606,-77.0,,9001
+1161,9603,8607,-51.0,,9001
+1162,9603,8605,-133.0,,9001
+1162,9603,8606,-79.0,,9001
+1162,9603,8607,-72.0,,9001
+1163,9603,8605,-74.0,,9001
+1163,9603,8606,-130.0,,9001
+1163,9603,8607,42.0,,9001
+1164,9603,8605,41.0,,9001
+1164,9603,8606,-220.0,,9001
+1164,9603,8607,-134.0,,9001
+1165,9603,8605,639.0,,9001
+1165,9603,8606,405.0,,9001
+1165,9603,8607,60.0,,9001
+1166,9603,8605,31.0,,9001
+1166,9603,8606,146.0,,9001
+1166,9603,8607,47.0,,9001
+1167,9603,8605,-81.0,,9001
+1167,9603,8606,-84.0,,9001
+1167,9603,8607,115.0,,9001
+1168,9603,8605,-92.0,,9001
+1168,9603,8606,-93.0,,9001
+1168,9603,8607,122.0,,9001
+1169,9603,8605,-225.0,,9001
+1169,9603,8606,-65.0,,9001
+1169,9603,8607,9.0,,9001
+1170,9603,8605,-3.0,,9001
+1170,9603,8606,142.0,,9001
+1170,9603,8607,183.0,,9001
+1171,9603,8605,0.0,,9001
+1171,9603,8606,125.0,,9001
+1171,9603,8607,194.0,,9001
+1172,9603,8605,-10.0,,9001
+1172,9603,8606,158.0,,9001
+1172,9603,8607,187.0,,9001
+1173,9603,8605,-8.0,,9001
+1173,9603,8606,160.0,,9001
+1173,9603,8607,176.0,,9001
+1174,9603,8605,-9.0,,9001
+1174,9603,8606,161.0,,9001
+1174,9603,8607,179.0,,9001
+1175,9603,8605,-8.0,,9001
+1175,9603,8606,159.0,,9001
+1175,9603,8607,175.0,,9001
+1176,9603,8605,-5.0,,9001
+1176,9603,8606,135.0,,9001
+1176,9603,8607,172.0,,9001
+1177,9603,8605,-4.0,,9001
+1177,9603,8606,154.0,,9001
+1177,9603,8607,178.0,,9001
+1178,9603,8605,1.0,,9001
+1178,9603,8606,140.0,,9001
+1178,9603,8607,165.0,,9001
+1179,9603,8605,-7.0,,9001
+1179,9603,8606,162.0,,9001
+1179,9603,8607,188.0,,9001
+1180,9603,8605,-9.0,,9001
+1180,9603,8606,157.0,,9001
+1180,9603,8607,184.0,,9001
+1181,9603,8605,-22.0,,9001
+1181,9603,8606,160.0,,9001
+1181,9603,8607,190.0,,9001
+1182,9603,8605,4.0,,9001
+1182,9603,8606,159.0,,9001
+1182,9603,8607,188.0,,9001
+1183,9603,8605,-7.0,,9001
+1183,9603,8606,139.0,,9001
+1183,9603,8607,181.0,,9001
+1184,9603,8605,0.0,,9001
+1184,9603,8606,125.0,,9001
+1184,9603,8607,201.0,,9001
+1185,9603,8605,-9.0,,9001
+1185,9603,8606,152.0,,9001
+1185,9603,8607,178.0,,9001
+1186,9603,8605,11.0,,9001
+1186,9603,8606,114.0,,9001
+1186,9603,8607,195.0,,9001
+1187,9603,8605,-12.0,,9001
+1187,9603,8606,130.0,,9001
+1187,9603,8607,190.0,,9001
+1188,9603,8605,0.0,,9001
+1188,9603,8606,0.0,,9001
+1188,9603,8607,0.0,,9001
+1189,9603,8605,-247.0,,9001
+1189,9603,8606,-148.0,,9001
+1189,9603,8607,369.0,,9001
+1190,9603,8605,-243.0,,9001
+1190,9603,8606,-192.0,,9001
+1190,9603,8607,477.0,,9001
+1191,9603,8605,-249.0,,9001
+1191,9603,8606,-156.0,,9001
+1191,9603,8607,381.0,,9001
+1192,9603,8605,-10.0,,9001
+1192,9603,8606,375.0,,9001
+1192,9603,8607,165.0,,9001
+1193,9603,8605,-168.0,,9001
+1193,9603,8606,-60.0,,9001
+1193,9603,8607,320.0,,9001
+1195,9603,8605,375.0,,9001
+1195,9603,8606,-111.0,,9001
+1195,9603,8607,431.0,,9001
+1196,9603,8605,371.0,,9001
+1196,9603,8606,-112.0,,9001
+1196,9603,8607,434.0,,9001
+1197,9603,8605,371.0,,9001
+1197,9603,8606,-111.0,,9001
+1197,9603,8607,434.0,,9001
+1198,9603,8605,384.0,,9001
+1198,9603,8606,-111.0,,9001
+1198,9603,8607,425.0,,9001
+1199,9603,8605,370.0,,9001
+1199,9603,8606,-108.0,,9001
+1199,9603,8607,434.0,,9001
+1200,9603,8605,-148.0,,9001
+1200,9603,8606,51.0,,9001
+1200,9603,8607,-291.0,,9001
+1201,9603,8605,-288.0,,9001
+1201,9603,8606,175.0,,9001
+1201,9603,8607,-376.0,,9001
+1202,9603,8605,-270.0,,9001
+1202,9603,8606,188.0,,9001
+1202,9603,8607,-388.0,,9001
+1203,9603,8605,-270.0,,9001
+1203,9603,8606,183.0,,9001
+1203,9603,8607,-390.0,,9001
+1204,9603,8605,-305.0,,9001
+1204,9603,8606,243.0,,9001
+1204,9603,8607,-442.0,,9001
+1205,9603,8605,-282.0,,9001
+1205,9603,8606,169.0,,9001
+1205,9603,8607,-371.0,,9001
+1206,9603,8605,-278.0,,9001
+1206,9603,8606,171.0,,9001
+1206,9603,8607,-367.0,,9001
+1207,9603,8605,-298.0,,9001
+1207,9603,8606,159.0,,9001
+1207,9603,8607,-369.0,,9001
+1208,9603,8605,-279.0,,9001
+1208,9603,8606,175.0,,9001
+1208,9603,8607,-379.0,,9001
+1209,9603,8605,-295.0,,9001
+1209,9603,8606,173.0,,9001
+1209,9603,8607,-371.0,,9001
+1211,9603,8605,164.0,,9001
+1211,9603,8606,138.0,,9001
+1211,9603,8607,-189.0,,9001
+1212,9603,8605,-57.0,,9001
+1212,9603,8606,1.0,,9001
+1212,9603,8607,-41.0,,9001
+1213,9603,8605,-62.0,,9001
+1213,9603,8606,-1.0,,9001
+1213,9603,8607,-37.0,,9001
+1214,9603,8605,-61.0,,9001
+1214,9603,8606,2.0,,9001
+1214,9603,8607,-48.0,,9001
+1215,9603,8605,-60.0,,9001
+1215,9603,8606,-2.0,,9001
+1215,9603,8607,-41.0,,9001
+1216,9603,8605,-75.0,,9001
+1216,9603,8606,-1.0,,9001
+1216,9603,8607,-44.0,,9001
+1217,9603,8605,-44.0,,9001
+1217,9603,8606,6.0,,9001
+1217,9603,8607,-36.0,,9001
+1218,9603,8605,-48.0,,9001
+1218,9603,8606,3.0,,9001
+1218,9603,8607,-44.0,,9001
+1219,9603,8605,-47.0,,9001
+1219,9603,8606,26.0,,9001
+1219,9603,8607,-42.0,,9001
+1220,9603,8605,-53.0,,9001
+1220,9603,8606,3.0,,9001
+1220,9603,8607,-47.0,,9001
+1221,9603,8605,-61.0,,9001
+1221,9603,8606,2.0,,9001
+1221,9603,8607,-33.0,,9001
+1222,9603,8605,-58.0,,9001
+1222,9603,8606,0.0,,9001
+1222,9603,8607,-44.0,,9001
+1223,9603,8605,-45.0,,9001
+1223,9603,8606,12.0,,9001
+1223,9603,8607,-33.0,,9001
+1224,9603,8605,-45.0,,9001
+1224,9603,8606,8.0,,9001
+1224,9603,8607,-33.0,,9001
+1225,9603,8605,-355.0,,9001
+1225,9603,8606,21.0,,9001
+1225,9603,8607,72.0,,9001
+1226,9603,8605,616.0,,9001
+1226,9603,8606,97.0,,9001
+1226,9603,8607,-251.0,,9001
+1227,9603,8605,-189.0,,9001
+1227,9603,8606,-242.0,,9001
+1227,9603,8607,-91.0,,9001
+1228,9603,8605,-679.0,,9001
+1228,9603,8606,669.0,,9001
+1228,9603,8607,-48.0,,9001
+1229,9603,8605,506.0,,9001
+1229,9603,8606,-122.0,,9001
+1229,9603,8607,611.0,,9001
+1230,9603,8605,-148.0,,9001
+1230,9603,8606,507.0,,9001
+1230,9603,8607,685.0,,9001
+1231,9603,8605,-148.0,,9001
+1231,9603,8606,507.0,,9001
+1231,9603,8607,685.0,,9001
+1232,9603,8605,-146.0,,9001
+1232,9603,8606,507.0,,9001
+1232,9603,8607,687.0,,9001
+1233,9603,8605,-158.0,,9001
+1233,9603,8606,507.0,,9001
+1233,9603,8607,676.0,,9001
+1234,9603,8605,-155.0,,9001
+1234,9603,8606,171.0,,9001
+1234,9603,8607,37.0,,9001
+1235,9603,8605,-265.0,,9001
+1235,9603,8606,120.0,,9001
+1235,9603,8607,-358.0,,9001
+1236,9607,8605,-116.0,,9001
+1236,9607,8606,-50.47,,9001
+1236,9607,8607,141.69,,9001
+1236,9607,8608,-0.23,,9104
+1236,9607,8609,-0.39,,9104
+1236,9607,8610,-0.344,,9104
+1236,9607,8611,0.0983,,9202
+1237,9606,8605,0.0,,9001
+1237,9606,8606,0.0,,9001
+1237,9606,8607,4.5,,9001
+1237,9606,8608,0.0,,9104
+1237,9606,8609,0.0,,9104
+1237,9606,8610,0.554,,9104
+1237,9606,8611,0.2263,,9202
+1238,9606,8605,0.0,,9001
+1238,9606,8606,0.0,,9001
+1238,9606,8607,4.5,,9001
+1238,9606,8608,0.0,,9104
+1238,9606,8609,0.0,,9104
+1238,9606,8610,0.554,,9104
+1238,9606,8611,0.219,,9202
+1239,9606,8605,0.0,,9001
+1239,9606,8606,0.0,,9001
+1239,9606,8607,-2.6,,9001
+1239,9606,8608,0.0,,9104
+1239,9606,8609,0.0,,9104
+1239,9606,8610,0.26,,9104
+1239,9606,8611,-0.6063,,9202
+1240,9606,8605,0.0,,9001
+1240,9606,8606,0.0,,9001
+1240,9606,8607,1.9,,9001
+1240,9606,8608,0.0,,9104
+1240,9606,8609,0.0,,9104
+1240,9606,8610,0.814,,9104
+1240,9606,8611,-0.38,,9202
+1241,9613,8657,,conus.las,
+1241,9613,8658,,conus.los,
+1243,9613,8657,,alaska.las,
+1243,9613,8658,,alaska.los,
+1245,9603,8605,-112.0,,9001
+1245,9603,8606,-77.0,,9001
+1245,9603,8607,-145.0,,9001
+1246,9603,8605,-333.0,,9001
+1246,9603,8606,-222.0,,9001
+1246,9603,8607,114.0,,9001
+1247,9603,8605,283.0,,9001
+1247,9603,8606,682.0,,9001
+1247,9603,8607,231.0,,9001
+1248,9603,8605,-24.0,,9001
+1248,9603,8606,-15.0,,9001
+1248,9603,8607,5.0,,9001
+1249,9603,8605,-2.0,,9001
+1249,9603,8606,152.0,,9001
+1249,9603,8607,149.0,,9001
+1250,9603,8605,2.0,,9001
+1250,9603,8606,204.0,,9001
+1250,9603,8607,105.0,,9001
+1251,9603,8605,-2.0,,9001
+1251,9603,8606,0.0,,9001
+1251,9603,8607,4.0,,9001
+1252,9603,8605,1.0,,9001
+1252,9603,8606,1.0,,9001
+1252,9603,8607,-1.0,,9001
+1253,9603,8605,-186.0,,9001
+1253,9603,8606,-93.0,,9001
+1253,9603,8607,310.0,,9001
+1254,9603,8605,28.0,,9001
+1254,9603,8606,-130.0,,9001
+1254,9603,8607,-95.0,,9001
+1255,9603,8605,-123.0,,9001
+1255,9603,8606,-206.0,,9001
+1255,9603,8607,219.0,,9001
+1256,9603,8605,-346.0,,9001
+1256,9603,8606,-1.0,,9001
+1256,9603,8607,224.0,,9001
+1258,9601,8602,-74.04513,,9110
+1259,9601,8602,-9.0754862,,9110
+1260,9601,8602,106.482779,,9110
+1261,9601,8602,-17.4,,9110
+1262,9601,8602,12.27084,,9110
+1263,9601,8602,106.482779,,9110
+1264,9601,8602,4.220471,,9110
+1265,9601,8602,2.5969213,,9105
+1266,9601,8602,2.5969213,,9105
+1268,9601,8602,106.482779,,9110
+1269,9601,8602,18.03298,,9110
+1270,9601,8602,23.4258815,,9110
+1271,9603,8605,615.64,,9001
+1271,9603,8606,102.08,,9001
+1271,9603,8607,-255.81,,9001
+1272,9603,8605,-199.87,,9001
+1272,9603,8606,74.79,,9001
+1272,9603,8607,246.62,,9001
+1273,9607,8605,-56.0,,9001
+1273,9607,8606,75.77,,9001
+1273,9607,8607,15.31,,9001
+1273,9607,8608,-0.37,,9104
+1273,9607,8609,-0.2,,9104
+1273,9607,8610,-0.21,,9104
+1273,9607,8611,-1.01,,9202
+1274,9607,8605,-40.595,,9001
+1274,9607,8606,-18.55,,9001
+1274,9607,8607,-69.339,,9001
+1274,9607,8608,-2.508,,9104
+1274,9607,8609,-1.832,,9104
+1274,9607,8610,2.611,,9104
+1274,9607,8611,-4.299,,9202
+1275,9603,8605,-84.0,,9001
+1275,9603,8606,-97.0,,9001
+1275,9603,8607,-117.0,,9001
+1276,9603,8605,-84.0,,9001
+1276,9603,8606,37.0,,9001
+1276,9603,8607,437.0,,9001
+1277,9603,8605,-168.0,,9001
+1277,9603,8606,-72.0,,9001
+1277,9603,8607,314.0,,9001
+1278,9603,8605,-127.8,,9001
+1278,9603,8606,-52.3,,9001
+1278,9603,8607,152.9,,9001
+1279,9603,8605,-128.5,,9001
+1279,9603,8606,-53.0,,9001
+1279,9603,8607,153.4,,9001
+1280,9607,8605,-117.763,,9001
+1280,9607,8606,-51.51,,9001
+1280,9607,8607,139.061,,9001
+1280,9607,8608,-0.292,,9104
+1280,9607,8609,-0.443,,9104
+1280,9607,8610,-0.277,,9104
+1280,9607,8611,-0.191,,9202
+1282,9603,8605,-404.78,,9001
+1282,9603,8606,685.68,,9001
+1282,9603,8607,45.47,,9001
+1283,9603,8605,0.0,,9001
+1283,9603,8606,0.0,,9001
+1283,9603,8607,0.0,,9001
+1284,9603,8605,-157.0,,9001
+1284,9603,8606,-2.0,,9001
+1284,9603,8607,-299.0,,9001
+1285,9603,8605,-175.0,,9001
+1285,9603,8606,-23.0,,9001
+1285,9603,8607,-303.0,,9001
+1286,9603,8605,-403.0,,9001
+1286,9603,8606,684.0,,9001
+1286,9603,8607,41.0,,9001
+1287,9603,8605,28.0,,9001
+1287,9603,8606,-121.0,,9001
+1287,9603,8607,-77.0,,9001
+1288,9603,8605,23.0,,9001
+1288,9603,8606,-124.0,,9001
+1288,9603,8607,-82.0,,9001
+1289,9603,8605,26.0,,9001
+1289,9603,8606,-121.0,,9001
+1289,9603,8607,-78.0,,9001
+1290,9603,8605,24.0,,9001
+1290,9603,8606,-124.0,,9001
+1290,9603,8607,-82.0,,9001
+1291,9603,8605,15.0,,9001
+1291,9603,8606,-130.0,,9001
+1291,9603,8607,-84.0,,9001
+1292,9603,8605,24.0,,9001
+1292,9603,8606,-130.0,,9001
+1292,9603,8607,-92.0,,9001
+1293,9603,8605,28.0,,9001
+1293,9603,8606,-121.0,,9001
+1293,9603,8607,-77.0,,9001
+1294,9603,8605,-73.0,,9001
+1294,9603,8606,-247.0,,9001
+1294,9603,8607,227.0,,9001
+1296,9603,8605,-61.702,,9001
+1296,9603,8606,284.488,,9001
+1296,9603,8607,472.052,,9001
+1297,9607,8605,-115.064,,9001
+1297,9607,8606,-87.39,,9001
+1297,9607,8607,-101.716,,9001
+1297,9607,8608,0.058,,9104
+1297,9607,8609,-4.001,,9104
+1297,9607,8610,2.062,,9104
+1297,9607,8611,9.366,,9202
+1298,9607,8605,-82.875,,9001
+1298,9607,8606,-57.097,,9001
+1298,9607,8607,-156.768,,9001
+1298,9607,8608,2.158,,9104
+1298,9607,8609,-1.524,,9104
+1298,9607,8610,0.982,,9104
+1298,9607,8611,-0.359,,9202
+1299,9607,8605,-138.527,,9001
+1299,9607,8606,-91.999,,9001
+1299,9607,8607,-114.591,,9001
+1299,9607,8608,0.14,,9104
+1299,9607,8609,-3.363,,9104
+1299,9607,8610,2.217,,9104
+1299,9607,8611,11.748,,9202
+1300,9607,8605,-73.472,,9001
+1300,9607,8606,-51.66,,9001
+1300,9607,8607,-112.482,,9001
+1300,9607,8608,-0.953,,9104
+1300,9607,8609,-4.6,,9104
+1300,9607,8610,2.368,,9104
+1300,9607,8611,0.586,,9202
+1301,9607,8605,219.315,,9001
+1301,9607,8606,168.975,,9001
+1301,9607,8607,-166.145,,9001
+1301,9607,8608,-0.198,,9104
+1301,9607,8609,-5.926,,9104
+1301,9607,8610,2.356,,9104
+1301,9607,8611,-57.104,,9202
+1302,9607,8605,0.0,,9001
+1302,9607,8606,0.0,,9001
+1302,9607,8607,0.0,,9001
+1302,9607,8608,0.0,,9104
+1302,9607,8609,0.0,,9104
+1302,9607,8610,0.0,,9104
+1302,9607,8611,0.0,,9202
+1303,9606,8605,43.822,,9001
+1303,9606,8606,-108.842,,9001
+1303,9606,8607,-119.585,,9001
+1303,9606,8608,1.455,,9104
+1303,9606,8609,-0.761,,9104
+1303,9606,8610,0.737,,9104
+1303,9606,8611,0.549,,9202
+1304,9603,8605,210.0,,9001
+1304,9603,8606,814.0,,9001
+1304,9603,8607,289.0,,9001
+1305,9603,8605,-147.0,,9001
+1305,9603,8606,506.0,,9001
+1305,9603,8607,687.0,,9001
+1306,9603,8605,682.0,,9001
+1306,9603,8606,-203.0,,9001
+1306,9603,8607,480.0,,9001
+1307,9603,8605,-2.0,,9001
+1307,9603,8606,374.0,,9001
+1307,9603,8607,172.0,,9001
+1308,9607,8605,-0.9738,,9001
+1308,9607,8606,1.9453,,9001
+1308,9607,8607,0.5486,,9001
+1308,9607,8608,-0.00000013357,,9101
+1308,9607,8609,-0.00000004872,,9101
+1308,9607,8610,-0.00000005507,,9101
+1308,9607,8611,0.0,,9202
+1309,9607,8605,582.0,,9001
+1309,9607,8606,105.0,,9001
+1309,9607,8607,414.0,,9001
+1309,9607,8608,-1.04,,9104
+1309,9607,8609,-0.35,,9104
+1309,9607,8610,3.08,,9104
+1309,9607,8611,8.3,,9202
+1310,9607,8605,24.0,,9001
+1310,9607,8606,-123.0,,9001
+1310,9607,8607,-94.0,,9001
+1310,9607,8608,-0.02,,9104
+1310,9607,8609,0.25,,9104
+1310,9607,8610,0.13,,9104
+1310,9607,8611,1.1,,9202
+1311,9606,8605,-89.5,,9001
+1311,9606,8606,-93.8,,9001
+1311,9606,8607,-123.1,,9001
+1311,9606,8608,0.0,,9104
+1311,9606,8609,0.0,,9104
+1311,9606,8610,-0.156,,9104
+1311,9606,8611,1.2,,9202
+1312,9614,8656,,NTv1_0.gsb,
+1313,9615,8656,,NTv2_0.gsb,
+1314,9606,8605,446.448,,9001
+1314,9606,8606,-125.157,,9001
+1314,9606,8607,542.06,,9001
+1314,9606,8608,0.15,,9104
+1314,9606,8609,0.247,,9104
+1314,9606,8610,0.842,,9104
+1314,9606,8611,-20.489,,9202
+1315,9606,8605,535.948,,9001
+1315,9606,8606,-31.357,,9001
+1315,9606,8607,665.16,,9001
+1315,9606,8608,0.15,,9104
+1315,9606,8609,0.247,,9104
+1315,9606,8610,0.998,,9104
+1315,9606,8611,-21.689,,9202
+1316,9603,8605,-70.9,,9001
+1316,9603,8606,-151.8,,9001
+1316,9603,8607,-41.4,,9001
+1317,9603,8605,-37.2,,9001
+1317,9603,8606,-370.6,,9001
+1317,9603,8607,-228.5,,9001
+1318,9603,8605,-42.01,,9001
+1318,9603,8606,-332.21,,9001
+1318,9603,8607,-229.75,,9001
+1319,9603,8605,-40.0,,9001
+1319,9603,8606,-354.0,,9001
+1319,9603,8607,-224.0,,9001
+1320,9606,8605,-37.2,,9001
+1320,9606,8606,-370.6,,9001
+1320,9606,8607,-224.0,,9001
+1320,9606,8608,0.0,,9104
+1320,9606,8609,0.0,,9104
+1320,9606,8610,0.554,,9104
+1320,9606,8611,0.219,,9202
+1321,9603,8605,-41.8,,9001
+1321,9603,8606,-342.2,,9001
+1321,9603,8607,-228.2,,9001
+1322,9603,8605,-55.5,,9001
+1322,9603,8606,-348.0,,9001
+1322,9603,8607,-229.2,,9001
+1323,9603,8605,-43.0,,9001
+1323,9603,8606,-337.0,,9001
+1323,9603,8607,-233.0,,9001
+1324,9603,8605,-48.0,,9001
+1324,9603,8606,-345.0,,9001
+1324,9603,8607,-231.0,,9001
+1325,9603,8605,-48.6,,9001
+1325,9603,8606,-345.1,,9001
+1325,9603,8607,-230.8,,9001
+1326,9606,8605,-41.057,,9001
+1326,9606,8606,-374.564,,9001
+1326,9606,8607,-226.287,,9001
+1326,9606,8608,0.0,,9104
+1326,9606,8609,0.0,,9104
+1326,9606,8610,0.554,,9104
+1326,9606,8611,0.219,,9202
+1327,9603,8605,-50.9,,9001
+1327,9603,8606,-347.6,,9001
+1327,9603,8607,-231.0,,9001
+1328,9603,8605,0.0,,9001
+1328,9603,8606,0.0,,9001
+1328,9603,8607,0.0,,9001
+1329,9603,8605,-252.95,,9001
+1329,9603,8606,-4.11,,9001
+1329,9603,8607,-96.38,,9001
+1330,9603,8605,-252.95,,9001
+1330,9603,8606,-4.11,,9001
+1330,9603,8607,-96.38,,9001
+1331,9607,8605,0.0,,9001
+1331,9607,8606,0.0,,9001
+1331,9607,8607,0.0,,9001
+1331,9607,8608,0.0,,9104
+1331,9607,8609,0.0,,9104
+1331,9607,8610,0.0,,9104
+1331,9607,8611,0.0,,9202
+1332,9607,8605,21.53219,,9001
+1332,9607,8606,-97.00027,,9001
+1332,9607,8607,-60.74046,,9001
+1332,9607,8608,-0.99548,,9104
+1332,9607,8609,-0.58147,,9104
+1332,9607,8610,-0.2418,,9104
+1332,9607,8611,-4.5981,,9202
+1333,9607,8605,0.055,,9001
+1333,9607,8606,-0.541,,9001
+1333,9607,8607,-0.185,,9001
+1333,9607,8608,-0.0183,,9104
+1333,9607,8609,0.0003,,9104
+1333,9607,8610,0.007,,9104
+1333,9607,8611,-0.014,,9202
+1334,9607,8605,21.58719,,9001
+1334,9607,8606,-97.54127,,9001
+1334,9607,8607,-60.92546,,9001
+1334,9607,8608,-1.01378,,9104
+1334,9607,8609,-0.58117,,9104
+1334,9607,8610,-0.2348,,9104
+1334,9607,8611,-4.6121,,9202
+1335,9618,8601,7.92,,9108
+1335,9618,8602,-13.88,,9104
+1335,9618,8604,26.1,,9001
+1336,9618,8601,7.94,,9104
+1336,9618,8602,-13.97,,9104
+1336,9618,8604,26.9,,9001
+1337,9618,8601,8.1,,9104
+1337,9618,8602,-13.81,,9104
+1337,9618,8604,27.2,,9001
+1338,9618,8601,8.15,,9104
+1338,9618,8602,-13.95,,9104
+1338,9618,8604,28.4,,9001
+1339,9618,8601,8.37,,9104
+1339,9618,8602,-13.65,,9104
+1339,9618,8604,29.0,,9001
+1340,9618,8601,8.44,,9104
+1340,9618,8602,-13.87,,9104
+1340,9618,8604,30.9,,9001
+1341,9618,8601,8.61,,9104
+1341,9618,8602,-14.08,,9104
+1341,9618,8604,30.7,,9001
+1342,9618,8601,8.73,,9104
+1342,9618,8602,-14.3,,9104
+1342,9618,8604,30.9,,9001
+1343,9618,8601,8.63,,9104
+1343,9618,8602,-13.49,,9104
+1343,9618,8604,30.9,,9001
+1344,9618,8601,8.71,,9104
+1344,9618,8602,-13.73,,9104
+1344,9618,8604,31.6,,9001
+1345,9618,8601,8.84,,9104
+1345,9618,8602,-14.03,,9104
+1345,9618,8604,31.2,,9001
+1346,9618,8601,8.98,,9104
+1346,9618,8602,-14.33,,9104
+1346,9618,8604,32.5,,9001
+1347,9618,8601,9.1,,9104
+1347,9618,8602,-14.56,,9104
+1347,9618,8604,32.6,,9001
+1348,9618,8601,8.79,,9104
+1348,9618,8602,-13.0,,9104
+1348,9618,8604,33.3,,9001
+1349,9618,8601,8.84,,9104
+1349,9618,8602,-13.31,,9104
+1349,9618,8604,31.4,,9001
+1350,9618,8601,8.98,,9104
+1350,9618,8602,-13.59,,9104
+1350,9618,8604,30.9,,9001
+1351,9618,8601,9.1,,9104
+1351,9618,8602,-13.91,,9104
+1351,9618,8604,29.3,,9001
+1352,9618,8601,9.17,,9104
+1352,9618,8602,-14.27,,9104
+1352,9618,8604,31.3,,9001
+1353,9618,8601,9.23,,9104
+1353,9618,8602,-14.52,,9104
+1353,9618,8604,31.4,,9001
+1354,9618,8601,8.9,,9104
+1354,9618,8602,-12.68,,9104
+1354,9618,8604,34.4,,9001
+1355,9618,8601,8.99,,9104
+1355,9618,8602,-12.8,,9104
+1355,9618,8604,34.2,,9001
+1356,9618,8601,9.0,,9104
+1356,9618,8602,-13.07,,9104
+1356,9618,8604,31.7,,9001
+1357,9618,8601,9.21,,9104
+1357,9618,8602,-13.51,,9104
+1357,9618,8604,27.5,,9001
+1358,9618,8601,9.33,,9104
+1358,9618,8602,-13.66,,9104
+1358,9618,8604,23.8,,9001
+1359,9618,8601,9.25,,9104
+1359,9618,8602,-12.72,,9104
+1359,9618,8604,34.2,,9001
+1360,9618,8601,9.39,,9104
+1360,9618,8602,-12.91,,9104
+1360,9618,8604,31.8,,9001
+1361,9618,8601,9.55,,9104
+1361,9618,8602,-12.63,,9104
+1361,9618,8604,35.6,,9001
+1362,9618,8601,9.62,,9104
+1362,9618,8602,-12.82,,9104
+1362,9618,8604,34.7,,9001
+1363,9618,8601,9.81,,9104
+1363,9618,8602,-12.29,,9104
+1363,9618,8604,36.6,,9001
+1364,9618,8601,9.81,,9104
+1364,9618,8602,-12.45,,9104
+1364,9618,8604,37.5,,9001
+1365,9618,8601,9.92,,9104
+1365,9618,8602,-12.79,,9104
+1365,9618,8604,38.3,,9001
+1366,9618,8601,9.91,,9104
+1366,9618,8602,-12.21,,9104
+1366,9618,8604,36.6,,9001
+1367,9618,8601,10.08,,9104
+1367,9618,8602,-12.35,,9104
+1367,9618,8604,39.0,,9001
+1368,9618,8601,10.19,,9104
+1368,9618,8602,-12.74,,9104
+1368,9618,8604,40.3,,9001
+1369,9618,8601,10.29,,9104
+1369,9618,8602,-12.13,,9104
+1369,9618,8604,38.5,,9001
+1370,9618,8601,10.33,,9104
+1370,9618,8602,-12.27,,9104
+1370,9618,8604,40.1,,9001
+1371,9618,8601,10.45,,9104
+1371,9618,8602,-12.61,,9104
+1371,9618,8604,41.7,,9001
+1372,9618,8601,10.54,,9104
+1372,9618,8602,-11.96,,9104
+1372,9618,8604,39.1,,9001
+1373,9618,8601,10.65,,9104
+1373,9618,8602,-12.27,,9104
+1373,9618,8604,41.7,,9001
+1374,9618,8601,10.67,,9104
+1374,9618,8602,-12.5,,9104
+1374,9618,8604,41.1,,9001
+1375,9618,8601,10.67,,9104
+1375,9618,8602,-10.86,,9104
+1375,9618,8604,38.5,,9001
+1376,9618,8601,10.68,,9104
+1376,9618,8602,-10.97,,9104
+1376,9618,8604,36.0,,9001
+1377,9618,8601,10.8,,9104
+1377,9618,8602,-11.53,,9104
+1377,9618,8604,39.7,,9001
+1378,9618,8601,10.8,,9104
+1378,9618,8602,-11.73,,9104
+1378,9618,8604,40.9,,9001
+1379,9618,8601,10.92,,9104
+1379,9618,8602,-12.16,,9104
+1379,9618,8604,42.3,,9001
+1380,9618,8601,11.0,,9104
+1380,9618,8602,-12.25,,9104
+1380,9618,8604,41.2,,9001
+1381,9618,8601,10.83,,9104
+1381,9618,8602,-10.77,,9104
+1381,9618,8604,36.2,,9001
+1382,9618,8601,10.95,,9104
+1382,9618,8602,-11.0,,9104
+1382,9618,8604,38.7,,9001
+1383,9618,8601,10.97,,9104
+1383,9618,8602,-11.34,,9104
+1383,9618,8604,40.8,,9001
+1384,9618,8601,11.04,,9104
+1384,9618,8602,-11.69,,9104
+1384,9618,8604,43.3,,9001
+1385,9618,8601,11.17,,9104
+1385,9618,8602,-12.05,,9104
+1385,9618,8604,42.6,,9001
+1386,9618,8601,11.11,,9104
+1386,9618,8602,-10.59,,9104
+1386,9618,8604,37.3,,9001
+1387,9618,8601,11.16,,9104
+1387,9618,8602,-10.97,,9104
+1387,9618,8604,40.3,,9001
+1388,9618,8601,11.29,,9104
+1388,9618,8602,-11.23,,9104
+1388,9618,8604,42.4,,9001
+1389,9618,8601,11.36,,9104
+1389,9618,8602,-11.59,,9104
+1389,9618,8604,42.5,,9001
+1390,9618,8601,11.44,,9104
+1390,9618,8602,-11.88,,9104
+1390,9618,8604,40.3,,9001
+1391,9618,8601,11.27,,9104
+1391,9618,8602,-9.31,,9104
+1391,9618,8604,30.9,,9001
+1392,9618,8601,11.33,,9104
+1392,9618,8602,-9.52,,9104
+1392,9618,8604,33.8,,9001
+1393,9618,8601,11.38,,9104
+1393,9618,8602,-9.86,,9104
+1393,9618,8604,34.9,,9001
+1394,9618,8601,11.41,,9104
+1394,9618,8602,-10.14,,9104
+1394,9618,8604,35.7,,9001
+1395,9618,8601,11.39,,9104
+1395,9618,8602,-10.52,,9104
+1395,9618,8604,37.5,,9001
+1396,9618,8601,11.49,,9104
+1396,9618,8602,-10.83,,9104
+1396,9618,8604,39.3,,9001
+1397,9618,8601,11.58,,9104
+1397,9618,8602,-11.21,,9104
+1397,9618,8604,41.7,,9001
+1398,9618,8601,11.65,,9104
+1398,9618,8602,-11.53,,9104
+1398,9618,8604,38.5,,9001
+1399,9618,8601,11.72,,9104
+1399,9618,8602,-11.8,,9104
+1399,9618,8604,34.5,,9001
+1400,9618,8601,11.44,,9104
+1400,9618,8602,-9.21,,9104
+1400,9618,8604,32.7,,9001
+1401,9618,8601,11.47,,9104
+1401,9618,8602,-9.52,,9104
+1401,9618,8604,35.2,,9001
+1402,9618,8601,11.55,,9104
+1402,9618,8602,-9.8,,9104
+1402,9618,8604,35.4,,9001
+1403,9618,8601,11.61,,9104
+1403,9618,8602,-10.12,,9104
+1403,9618,8604,35.9,,9001
+1404,9618,8601,11.66,,9104
+1404,9618,8602,-10.47,,9104
+1404,9618,8604,37.0,,9001
+1405,9618,8601,11.78,,9104
+1405,9618,8602,-10.79,,9104
+1405,9618,8604,39.8,,9001
+1406,9618,8601,11.85,,9104
+1406,9618,8602,-11.13,,9104
+1406,9618,8604,39.9,,9001
+1407,9618,8601,11.9,,9104
+1407,9618,8602,-11.47,,9104
+1407,9618,8604,36.9,,9001
+1408,9618,8601,11.91,,9104
+1408,9618,8602,-11.69,,9104
+1408,9618,8604,33.7,,9001
+1409,9618,8601,11.65,,9104
+1409,9618,8602,-8.59,,9104
+1409,9618,8604,29.7,,9001
+1410,9618,8601,11.68,,9104
+1410,9618,8602,-8.8,,9104
+1410,9618,8604,30.5,,9001
+1411,9618,8601,11.73,,9104
+1411,9618,8602,-9.04,,9104
+1411,9618,8604,30.9,,9001
+1412,9618,8601,11.72,,9104
+1412,9618,8602,-9.48,,9104
+1412,9618,8604,35.1,,9001
+1413,9618,8601,11.81,,9104
+1413,9618,8602,9.74,,9104
+1413,9618,8604,35.8,,9001
+1414,9618,8601,11.88,,9104
+1414,9618,8602,-10.1,,9104
+1414,9618,8604,37.1,,9001
+1415,9618,8601,11.91,,9104
+1415,9618,8602,-10.35,,9104
+1415,9618,8604,37.9,,9001
+1416,9618,8601,11.9,,9104
+1416,9618,8602,-10.7,,9104
+1416,9618,8604,39.3,,9001
+1417,9618,8601,12.02,,9104
+1417,9618,8602,-11.09,,9104
+1417,9618,8604,38.2,,9001
+1418,9618,8601,11.87,,9104
+1418,9618,8602,-8.23,,9104
+1418,9618,8604,29.7,,9001
+1419,9618,8601,11.84,,9104
+1419,9618,8602,-8.44,,9104
+1419,9618,8604,30.6,,9001
+1420,9618,8601,11.94,,9104
+1420,9618,8602,-8.71,,9104
+1420,9618,8604,30.2,,9001
+1421,9618,8601,11.99,,9104
+1421,9618,8602,-9.02,,9104
+1421,9618,8604,30.9,,9001
+1422,9618,8601,12.05,,9104
+1422,9618,8602,-9.36,,9104
+1422,9618,8604,35.0,,9001
+1423,9618,8601,12.1,,9104
+1423,9618,8602,-9.64,,9104
+1423,9618,8604,35.5,,9001
+1424,9618,8601,12.1,,9104
+1424,9618,8602,-10.08,,9104
+1424,9618,8604,37.3,,9001
+1425,9618,8601,12.07,,9104
+1425,9618,8602,-10.25,,9104
+1425,9618,8604,37.3,,9001
+1426,9618,8601,12.0,,9104
+1426,9618,8602,-8.15,,9104
+1426,9618,8604,32.1,,9001
+1427,9618,8601,12.06,,9104
+1427,9618,8602,-8.38,,9104
+1427,9618,8604,31.0,,9001
+1428,9618,8601,12.17,,9104
+1428,9618,8602,-8.69,,9104
+1428,9618,8604,30.3,,9001
+1429,9618,8601,12.23,,9104
+1429,9618,8602,-8.99,,9104
+1429,9618,8604,31.7,,9001
+1430,9618,8601,12.21,,9104
+1430,9618,8602,-9.21,,9104
+1430,9618,8604,34.3,,9001
+1431,9618,8601,12.28,,9104
+1431,9618,8602,-9.6,,9104
+1431,9618,8604,33.3,,9001
+1432,9618,8601,12.28,,9104
+1432,9618,8602,-8.25,,9104
+1432,9618,8604,31.0,,9001
+1433,9618,8601,12.37,,9104
+1433,9618,8602,-8.55,,9104
+1433,9618,8604,29.1,,9001
+1434,9618,8601,12.53,,9104
+1434,9618,8602,-8.21,,9104
+1434,9618,8604,31.0,,9001
+1435,9618,8601,12.57,,9104
+1435,9618,8602,-8.4,,9104
+1435,9618,8604,28.4,,9001
+1436,9618,8601,12.71,,9104
+1436,9618,8602,-8.17,,9104
+1436,9618,8604,29.9,,9001
+1437,9607,8605,419.3836,,9001
+1437,9607,8606,99.3335,,9001
+1437,9607,8607,591.3451,,9001
+1437,9607,8608,-0.850389,,9104
+1437,9607,8609,-1.817277,,9104
+1437,9607,8610,7.862238,,9104
+1437,9607,8611,-0.99496,,9202
+1438,9606,8605,-333.102,,9001
+1438,9606,8606,-11.02,,9001
+1438,9606,8607,230.69,,9001
+1438,9606,8608,0.0,,9104
+1438,9606,8609,0.0,,9104
+1438,9606,8610,0.554,,9104
+1438,9606,8611,0.219,,9202
+1439,9606,8605,-180.624,,9001
+1439,9606,8606,-225.516,,9001
+1439,9606,8607,173.919,,9001
+1439,9606,8608,-0.81,,9104
+1439,9606,8609,-1.898,,9104
+1439,9606,8610,8.336,,9104
+1439,9606,8611,16.71006,,9202
+1440,9603,8605,-86.0,,9001
+1440,9603,8606,-92.2,,9001
+1440,9603,8607,-127.5,,9001
+1441,9603,8605,-255.0,,9001
+1441,9603,8606,-15.0,,9001
+1441,9603,8607,71.0,,9001
+1442,9603,8605,725.0,,9001
+1442,9603,8606,685.0,,9001
+1442,9603,8607,536.0,,9001
+1443,9603,8605,72.0,,9001
+1443,9603,8606,213.7,,9001
+1443,9603,8607,93.0,,9001
+1444,9603,8605,174.0,,9001
+1444,9603,8606,359.0,,9001
+1444,9603,8607,365.0,,9001
+1445,9603,8605,9.0,,9001
+1445,9603,8606,183.0,,9001
+1445,9603,8607,236.0,,9001
+1446,9603,8605,-149.0,,9001
+1446,9603,8606,128.0,,9001
+1446,9603,8607,296.0,,9001
+1447,9619,8601,-18.0,,9104
+1447,9619,8602,4.4,,9104
+1450,9620,8659,8047.0,,
+1450,9620,8660,8046.0,,
+1450,9620,8661,,ED50 to WGS 84 (15),
+1450,9620,8662,,ED50 to WGS 84 (14),
+1451,9614,8656,,PQV4.DAC,
+1454,9613,8657,,hawaii.las,
+1454,9613,8658,,hawaii.los,
+1455,9613,8657,,stlrnc.las,
+1455,9613,8658,,stlrnc.los,
+1456,9613,8657,,stpaul.las,
+1456,9613,8658,,stpaul.los,
+1457,9613,8657,,stgeorge.las,
+1457,9613,8658,,stgeorge.los,
+1458,9607,8605,-129.193,,9001
+1458,9607,8606,-41.212,,9001
+1458,9607,8607,130.73,,9001
+1458,9607,8608,-0.246,,9104
+1458,9607,8609,-0.374,,9104
+1458,9607,8610,-0.329,,9104
+1458,9607,8611,-2.955,,9202
+1459,9607,8605,-120.695,,9001
+1459,9607,8606,-62.73,,9001
+1459,9607,8607,165.46,,9001
+1459,9607,8608,-0.109,,9104
+1459,9607,8609,0.141,,9104
+1459,9607,8610,0.116,,9104
+1459,9607,8611,2.733,,9202
+1460,9607,8605,-119.353,,9001
+1460,9607,8606,-48.301,,9001
+1460,9607,8607,139.484,,9001
+1460,9607,8608,-0.415,,9104
+1460,9607,8609,-0.26,,9104
+1460,9607,8610,-0.437,,9104
+1460,9607,8611,-0.613,,9202
+1461,9613,8657,,prvi.las,
+1461,9613,8658,,prvi.los,
+1462,9614,8656,,GS2783v1.QUE,
+1463,9615,8656,,May76v20.gsb,
+1464,9615,8656,,vic_0799.gsb,
+1466,9601,8602,10.43225,,9110
+1467,9601,8602,2.5969213,,9105
+1468,9601,8602,2.201395,,9110
+1469,9603,8605,-125.0,,9001
+1469,9603,8606,53.0,,9001
+1469,9603,8607,467.0,,9001
+1470,9603,8605,-124.76,,9001
+1470,9603,8606,53.0,,9001
+1470,9603,8607,466.79,,9001
+1471,9606,8605,-577.326,,9001
+1471,9606,8606,-90.129,,9001
+1471,9606,8607,-463.919,,9001
+1471,9606,8608,-15.8537,,9113
+1471,9606,8609,-4.55,,9113
+1471,9606,8610,-16.3489,,9113
+1471,9606,8611,-2.4232,,9201
+1472,9615,8656,,NB7783v2.gsb,
+1473,9603,8605,0.0,,9001
+1473,9603,8606,0.0,,9001
+1473,9603,8607,0.0,,9001
+1474,9613,8657,,alhpgn.las,
+1474,9613,8658,,alhpgn.los,
+1475,9613,8657,,azhpgn.las,
+1475,9613,8658,,azhpgn.los,
+1476,9613,8657,,cnhpgn.las,
+1476,9613,8658,,cnhpgn.los,
+1477,9613,8657,,cshpgn.las,
+1477,9613,8658,,cshpgn.los,
+1478,9613,8657,,cohpgn.las,
+1478,9613,8658,,cohpgn.los,
+1479,9613,8657,,gahpgn.las,
+1479,9613,8658,,gahpgn.los,
+1480,9613,8657,,flhpgn.las,
+1480,9613,8658,,flhpgn.los,
+1481,9613,8657,,emhpgn.las,
+1481,9613,8658,,emhpgn.los,
+1482,9613,8657,,wmhpgn.las,
+1482,9613,8658,,wmhpgn.los,
+1483,9613,8657,,kyhpgn.las,
+1483,9613,8658,,kyhpgn.los,
+1484,9613,8657,,lahpgn.las,
+1484,9613,8658,,lahpgn.los,
+1485,9613,8657,,mdhpgn.las,
+1485,9613,8658,,mdhpgn.los,
+1486,9613,8657,,mehpgn.las,
+1486,9613,8658,,mehpgn.los,
+1487,9613,8657,,mihpgn.las,
+1487,9613,8658,,mihpgn.los,
+1488,9613,8657,,mshpgn.las,
+1488,9613,8658,,mshpgn.los,
+1489,9613,8657,,nbhpgn.las,
+1489,9613,8658,,nbhpgn.los,
+1490,9613,8657,,nehpgn.las,
+1490,9613,8658,,nehpgn.los,
+1491,9613,8657,,nmhpgn.las,
+1491,9613,8658,,nmhpgn.los,
+1492,9613,8657,,nyhpgn.las,
+1492,9613,8658,,nyhpgn.los,
+1493,9613,8657,,ndhpgn.las,
+1493,9613,8658,,ndhpgn.los,
+1494,9613,8657,,okhpgn.las,
+1494,9613,8658,,okhpgn.los,
+1495,9613,8657,,pvhpgn.las,
+1495,9613,8658,,pvhpgn.los,
+1496,9613,8657,,sdhpgn.las,
+1496,9613,8658,,sdhpgn.los,
+1497,9613,8657,,tnhpgn.las,
+1497,9613,8658,,tnhpgn.los,
+1498,9613,8657,,ethpgn.las,
+1498,9613,8658,,ethpgn.los,
+1499,9613,8657,,wthpgn.las,
+1499,9613,8658,,wthpgn.los,
+1500,9613,8657,,vahpgn.las,
+1500,9613,8658,,vahpgn.los,
+1501,9613,8657,,wohpgn.las,
+1501,9613,8658,,wohpgn.los,
+1502,9613,8657,,wihpgn.las,
+1502,9613,8658,,wihpgn.los,
+1503,9613,8657,,wyhpgn.las,
+1503,9613,8658,,wyhpgn.los,
+1504,9603,8605,-134.73,,9001
+1504,9603,8606,-110.92,,9001
+1504,9603,8607,-292.66,,9001
+1505,9603,8605,0.0,,9001
+1505,9603,8606,0.0,,9001
+1505,9603,8607,0.0,,9001
+1506,9615,8656,,tas_1098.gsb,
+1507,9615,8656,,nt_0599.gsb,
+1508,9607,8605,660.077,,9001
+1508,9607,8606,13.551,,9001
+1508,9607,8607,369.344,,9001
+1508,9607,8608,2.484,,9113
+1508,9607,8609,1.783,,9113
+1508,9607,8610,2.939,,9113
+1508,9607,8611,5.66,,9201
+1509,9603,8605,674.374,,9001
+1509,9603,8606,15.056,,9001
+1509,9603,8607,405.346,,9001
+1510,9603,8605,674.374,,9001
+1510,9603,8606,15.056,,9001
+1510,9603,8607,405.346,,9001
+1511,9603,8605,0.0,,9001
+1511,9603,8606,0.0,,9001
+1511,9603,8607,0.0,,9001
+1512,9603,8605,-133.63,,9001
+1512,9603,8606,-157.5,,9001
+1512,9603,8607,-158.62,,9001
+1513,9603,8605,-241.54,,9001
+1513,9603,8606,-163.64,,9001
+1513,9603,8607,396.06,,9001
+1514,9606,8605,-110.33,,9001
+1514,9606,8606,-97.73,,9001
+1514,9606,8607,-119.85,,9001
+1514,9606,8608,0.3423,,9104
+1514,9606,8609,1.1634,,9104
+1514,9606,8610,0.2715,,9104
+1514,9606,8611,0.063,,9202
+1515,9607,8605,-0.991,,9001
+1515,9607,8606,1.9072,,9001
+1515,9607,8607,0.5129,,9001
+1515,9607,8608,-0.000000125033,,9101
+1515,9607,8609,-0.000000046785,,9101
+1515,9607,8610,-0.000000056529,,9101
+1515,9607,8611,0.0,,9202
+1516,9603,8605,-273.5,,9001
+1516,9603,8606,110.6,,9001
+1516,9603,8607,-357.9,,9001
+1517,9603,8605,-23.0,,9001
+1517,9603,8606,259.0,,9001
+1517,9603,8607,-9.0,,9001
+1518,9603,8605,-83.0,,9001
+1518,9603,8606,37.0,,9001
+1518,9603,8607,124.0,,9001
+1519,9601,8602,7.26225,,9110
+1520,9613,8657,,hihpgn.las,
+1520,9613,8658,,hihpgn.los,
+1521,9613,8657,,inhpgn.las,
+1521,9613,8658,,inhpgn.los,
+1522,9613,8657,,kshpgn.las,
+1522,9613,8658,,kshpgn.los,
+1523,9613,8657,,nvhpgn.las,
+1523,9613,8658,,nvhpgn.los,
+1524,9613,8657,,ohhpgn.las,
+1524,9613,8658,,ohhpgn.los,
+1525,9613,8657,,uthpgn.las,
+1525,9613,8658,,uthpgn.los,
+1526,9613,8657,,wvhpgn.las,
+1526,9613,8658,,wvhpgn.los,
+1527,9603,8605,-154.5,,9001
+1527,9603,8606,150.7,,9001
+1527,9603,8607,100.4,,9001
+1528,9603,8605,160.0,,9001
+1528,9603,8606,26.0,,9001
+1528,9603,8607,41.0,,9001
+1529,9606,8605,18.38,,9001
+1529,9606,8606,192.45,,9001
+1529,9606,8607,96.82,,9001
+1529,9606,8608,0.056,,9104
+1529,9606,8609,-0.142,,9104
+1529,9606,8610,-0.2,,9104
+1529,9606,8611,-0.0013,,9202
+1530,9603,8605,-4.2,,9001
+1530,9603,8606,135.4,,9001
+1530,9603,8607,181.9,,9001
+1531,9603,8605,-245.0,,9001
+1531,9603,8606,-153.9,,9001
+1531,9603,8607,382.8,,9001
+1532,9603,8605,-80.7,,9001
+1532,9603,8606,-132.5,,9001
+1532,9603,8607,41.1,,9001
+1533,9603,8605,214.0,,9001
+1533,9603,8606,804.0,,9001
+1533,9603,8607,268.0,,9001
+1534,9606,8605,-111.92,,9001
+1534,9606,8606,-87.85,,9001
+1534,9606,8607,114.5,,9001
+1534,9606,8608,1.875,,9104
+1534,9606,8609,0.202,,9104
+1534,9606,8610,0.219,,9104
+1534,9606,8611,0.032,,9201
+1536,9603,8605,-250.2,,9001
+1536,9603,8606,-153.09,,9001
+1536,9603,8607,391.7,,9001
+1537,9603,8605,204.64,,9001
+1537,9603,8606,834.74,,9001
+1537,9603,8607,293.8,,9001
+1538,9603,8605,-260.1,,9001
+1538,9603,8606,5.5,,9001
+1538,9603,8607,432.2,,9001
+1539,9603,8605,-76.0,,9001
+1539,9603,8606,-138.0,,9001
+1539,9603,8607,67.0,,9001
+1540,9603,8605,0.0,,9001
+1540,9603,8606,0.0,,9001
+1540,9603,8607,0.0,,9001
+1541,9603,8605,199.0,,9001
+1541,9603,8606,931.0,,9001
+1541,9603,8607,317.0,,9001
+1542,9603,8605,198.0,,9001
+1542,9603,8606,881.0,,9001
+1542,9603,8607,317.0,,9001
+1543,9603,8605,182.0,,9001
+1543,9603,8606,915.0,,9001
+1543,9603,8607,344.0,,9001
+1544,9603,8605,-17.51,,9001
+1544,9603,8606,-108.32,,9001
+1544,9603,8607,-62.39,,9001
+1545,9603,8605,-121.8,,9001
+1545,9603,8606,98.1,,9001
+1545,9603,8607,-15.2,,9001
+1546,9603,8605,-146.21,,9001
+1546,9603,8606,112.63,,9001
+1546,9603,8607,4.05,,9001
+1547,9603,8605,-173.0,,9001
+1547,9603,8606,253.0,,9001
+1547,9603,8607,27.0,,9001
+1548,9603,8605,-66.87,,9001
+1548,9603,8606,4.37,,9001
+1548,9603,8607,-38.52,,9001
+1549,9603,8605,-158.0,,9001
+1549,9603,8606,315.0,,9001
+1549,9603,8607,-148.0,,9001
+1550,9603,8605,-139.62,,9001
+1550,9603,8606,290.53,,9001
+1550,9603,8607,-150.29,,9001
+1551,9603,8605,-141.15,,9001
+1551,9603,8606,293.44,,9001
+1551,9603,8607,-150.56,,9001
+1552,9603,8605,-142.48,,9001
+1552,9603,8606,296.03,,9001
+1552,9603,8607,-149.74,,9001
+1553,9613,8657,,ilhpgn.las,
+1553,9613,8658,,ilhpgn.los,
+1554,9613,8657,,njhpgn.las,
+1554,9613,8658,,njhpgn.los,
+1555,9603,8605,-0.465,,9001
+1555,9603,8606,372.095,,9001
+1555,9603,8607,171.736,,9001
+1556,9603,8605,-2.0,,9001
+1556,9603,8606,374.0,,9001
+1556,9603,8607,172.0,,9001
+1557,9603,8605,-254.1,,9001
+1557,9603,8606,-5.4,,9001
+1557,9603,8607,-100.3,,9001
+1558,9603,8605,0.0,,9001
+1558,9603,8606,0.0,,9001
+1558,9603,8607,0.0,,9001
+1559,9615,8656,,wa_0400.gsb,
+1560,9603,8605,-156.5,,9001
+1560,9603,8606,-87.2,,9001
+1560,9603,8607,285.9,,9001
+1561,9603,8605,-128.0,,9001
+1561,9603,8606,-283.0,,9001
+1561,9603,8607,22.0,,9001
+1562,9603,8605,-128.16,,9001
+1562,9603,8606,-282.42,,9001
+1562,9603,8607,21.93,,9001
+1563,9603,8605,-128.033,,9001
+1563,9603,8606,-283.697,,9001
+1563,9603,8607,21.052,,9001
+1564,9607,8605,59.47,,9001
+1564,9607,8606,-5.04,,9001
+1564,9607,8607,187.44,,9001
+1564,9607,8608,-0.47,,9104
+1564,9607,8609,0.1,,9104
+1564,9607,8610,-1.024,,9104
+1564,9607,8611,-4.5993,,9202
+1565,9603,8605,0.0,,9001
+1565,9603,8606,0.0,,9001
+1565,9603,8607,0.0,,9001
+1566,9603,8605,54.4,,9001
+1566,9603,8606,-20.1,,9001
+1566,9603,8607,183.1,,9001
+1567,9607,8605,59.47,,9001
+1567,9607,8606,-5.04,,9001
+1567,9607,8607,187.44,,9001
+1567,9607,8608,-0.47,,9104
+1567,9607,8609,0.1,,9104
+1567,9607,8610,1.024,,9104
+1567,9607,8611,-4.5993,,9202
+1568,9615,8656,,nzgd2kgrid0005.gsb,
+1569,9603,8605,-199.0,,9001
+1569,9603,8606,32.0,,9001
+1569,9603,8607,322.0,,9001
+1570,9603,8605,-171.16,,9001
+1570,9603,8606,17.29,,9001
+1570,9603,8607,323.31,,9001
+1571,9607,8605,565.04,,9001
+1571,9607,8606,49.91,,9001
+1571,9607,8607,465.84,,9001
+1571,9607,8608,1.9848,,9109
+1571,9607,8609,-1.7439,,9109
+1571,9607,8610,9.0587,,9109
+1571,9607,8611,4.0772,,9202
+1572,9615,8656,,NAD83-98.gsb,
+1573,9615,8656,,QUE27-83.gsb,
+1574,9615,8656,,QUE27-98.gsb,
+1575,9615,8656,,CGQ77-83.gsb,
+1576,9615,8656,,CGQ77-98.gsb,
+1577,9603,8605,-115.0,,9001
+1577,9603,8606,118.0,,9001
+1577,9603,8607,426.0,,9001
+1578,9613,8657,,wshpgn.las,
+1578,9613,8658,,wshpgn.los,
+1579,9613,8657,,eshpgn.las,
+1579,9613,8658,,eshpgn.los,
+1580,9603,8605,0.0,,9001
+1580,9603,8606,0.0,,9001
+1580,9603,8607,0.0,,9001
+1581,9603,8605,0.0,,9001
+1581,9603,8606,0.0,,9001
+1581,9603,8607,0.0,,9001
+1582,9603,8605,-259.73,,9001
+1582,9603,8606,173.12,,9001
+1582,9603,8607,-398.27,,9001
+1583,9603,8605,-307.7,,9001
+1583,9603,8606,265.3,,9001
+1583,9603,8607,-363.5,,9001
+1584,9603,8605,-174.6,,9001
+1584,9603,8606,-3.1,,9001
+1584,9603,8607,236.2,,9001
+1585,9603,8605,-177.5,,9001
+1585,9603,8606,14.1,,9001
+1585,9603,8607,237.6,,9001
+1586,9606,8605,-175.09,,9001
+1586,9606,8606,1.218,,9001
+1586,9606,8607,238.831,,9001
+1586,9606,8608,-0.047,,9104
+1586,9606,8609,0.019,,9104
+1586,9606,8610,0.808,,9104
+1586,9606,8611,0.1698,,9202
+1587,9603,8605,-191.77,,9001
+1587,9603,8606,15.01,,9001
+1587,9603,8607,235.07,,9001
+1588,9606,8605,-116.641,,9001
+1588,9606,8606,-56.931,,9001
+1588,9606,8607,-110.559,,9001
+1588,9606,8608,4.327,,9109
+1588,9606,8609,4.464,,9109
+1588,9606,8610,-4.444,,9109
+1588,9606,8611,-3.52,,9202
+1589,9620,8659,1588.0,,
+1589,9620,8660,8570.0,,
+1589,9620,8661,,ED50 to ETRF89 (1),
+1589,9620,8662,,ED50 to ETRF89 (2),
+1590,9620,8659,8569.0,,
+1590,9620,8660,8046.0,,
+1590,9620,8661,,ED50 to WGS 84 (21),
+1590,9620,8662,,ED50 to WGS 84 (14),
+1591,9603,8605,0.0,,9001
+1591,9603,8606,0.0,,9001
+1591,9603,8607,0.0,,9001
+1592,9603,8605,-678.0,,9001
+1592,9603,8606,670.0,,9001
+1592,9603,8607,-48.0,,9001
+1593,9615,8656,,wa_0700.gsb,
+1594,9607,8605,-120.271,,9001
+1594,9607,8606,-64.543,,9001
+1594,9607,8607,161.632,,9001
+1594,9607,8608,-0.217,,9104
+1594,9607,8609,0.067,,9104
+1594,9607,8610,0.129,,9104
+1594,9607,8611,2.499,,9202
+1595,9607,8605,-124.133,,9001
+1595,9607,8606,-42.003,,9001
+1595,9607,8607,137.4,,9001
+1595,9607,8608,0.008,,9104
+1595,9607,8609,-0.557,,9104
+1595,9607,8610,-0.178,,9104
+1595,9607,8611,-1.854,,9202
+1596,9615,8656,,SEAust_21_06_00.gsb,
+1597,9603,8605,304.5,,9001
+1597,9603,8606,306.5,,9001
+1597,9603,8607,-318.1,,9001
+1598,9603,8605,0.0,,9001
+1598,9603,8606,0.0,,9001
+1598,9603,8607,0.0,,9001
+1599,9615,8656,,PE7783V2.gsb,
+1600,9615,8656,,SK27-98.gsb,
+1601,9615,8656,,SK83-98.gsb,
+1602,9615,8656,,AB_CSRS.DAC,
+1603,9634,8665,,TRNB2777.DAT,
+1604,9634,8665,,TRNS2777.DAT,
+1605,9634,8665,,TRPE2777.DAT,
+1606,9634,8665,,TRNB2777.DAT,
+1607,9634,8665,,TRNS2777.DAT,
+1608,9634,8665,,TRPE2777.DAT,
+1609,9607,8605,-99.059,,9001
+1609,9607,8606,53.322,,9001
+1609,9607,8607,-112.486,,9001
+1609,9607,8608,-0.419,,9104
+1609,9607,8609,0.83,,9104
+1609,9607,8610,-1.885,,9104
+1609,9607,8611,0.999999,,9201
+1610,9603,8605,-125.8,,9001
+1610,9603,8606,79.9,,9001
+1610,9603,8607,-100.5,,9001
+1611,9603,8605,0.0,,9001
+1611,9603,8606,0.0,,9001
+1611,9603,8607,0.0,,9001
+1612,9606,8605,-116.641,,9001
+1612,9606,8606,-56.931,,9001
+1612,9606,8607,-110.559,,9001
+1612,9606,8608,0.893,,9104
+1612,9606,8609,0.921,,9104
+1612,9606,8610,-0.917,,9104
+1612,9606,8611,-3.52,,9202
+1613,9606,8605,-90.365,,9001
+1613,9606,8606,-101.13,,9001
+1613,9606,8607,-123.384,,9001
+1613,9606,8608,0.333,,9104
+1613,9606,8609,0.077,,9104
+1613,9606,8610,0.894,,9104
+1613,9606,8611,1.994,,9202
+1614,9603,8605,-88.0,,9001
+1614,9603,8606,4.0,,9001
+1614,9603,8607,101.0,,9001
+1615,9603,8605,-726.282,,9001
+1615,9603,8606,703.611,,9001
+1615,9603,8607,-48.999,,9001
+1616,9606,8605,-182.046,,9001
+1616,9606,8606,-225.604,,9001
+1616,9606,8607,168.884,,9001
+1616,9606,8608,-0.616,,9104
+1616,9606,8609,-1.655,,9104
+1616,9606,8610,7.824,,9104
+1616,9606,8611,16.641,,9202
+1617,9606,8605,-191.808,,9001
+1617,9606,8606,-250.512,,9001
+1617,9606,8607,167.861,,9001
+1617,9606,8608,-0.792,,9104
+1617,9606,8609,-1.653,,9104
+1617,9606,8610,8.558,,9104
+1617,9606,8611,20.703,,9202
+1618,9606,8605,577.326,,9001
+1618,9606,8606,90.129,,9001
+1618,9606,8607,463.919,,9001
+1618,9606,8608,5.137,,9104
+1618,9606,8609,1.474,,9104
+1618,9606,8610,5.297,,9104
+1618,9606,8611,2.4232,,9202
+1619,9606,8605,577.3,,9001
+1619,9606,8606,90.1,,9001
+1619,9606,8607,463.9,,9001
+1619,9606,8608,5.137,,9104
+1619,9606,8609,1.474,,9104
+1619,9606,8610,5.297,,9104
+1619,9606,8611,2.42,,9202
+1620,9606,8605,551.7,,9001
+1620,9606,8606,162.9,,9001
+1620,9606,8607,467.9,,9001
+1620,9606,8608,6.04,,9104
+1620,9606,8609,1.96,,9104
+1620,9606,8610,-11.38,,9104
+1620,9606,8611,-4.82,,9202
+1621,9606,8605,551.7,,9001
+1621,9606,8606,162.9,,9001
+1621,9606,8607,467.9,,9001
+1621,9606,8608,6.04,,9104
+1621,9606,8609,1.96,,9104
+1621,9606,8610,-11.38,,9104
+1621,9606,8611,-4.82,,9202
+1622,9606,8605,570.8,,9001
+1622,9606,8606,85.7,,9001
+1622,9606,8607,462.8,,9001
+1622,9606,8608,4.998,,9104
+1622,9606,8609,1.587,,9104
+1622,9606,8610,5.261,,9104
+1622,9606,8611,3.56,,9202
+1623,9606,8605,570.8,,9001
+1623,9606,8606,85.7,,9001
+1623,9606,8607,462.8,,9001
+1623,9606,8608,4.998,,9104
+1623,9606,8609,1.587,,9104
+1623,9606,8610,5.261,,9104
+1623,9606,8611,3.56,,9202
+1624,9606,8605,559.0,,9001
+1624,9606,8606,68.7,,9001
+1624,9606,8607,451.5,,9001
+1624,9606,8608,7.92,,9104
+1624,9606,8609,4.073,,9104
+1624,9606,8610,4.251,,9104
+1624,9606,8611,5.71,,9202
+1625,9606,8605,559.0,,9001
+1625,9606,8606,68.7,,9001
+1625,9606,8607,451.5,,9001
+1625,9606,8608,7.92,,9104
+1625,9606,8609,4.073,,9104
+1625,9606,8610,4.251,,9104
+1625,9606,8611,5.71,,9202
+1626,9606,8605,-81.1,,9001
+1626,9606,8606,-89.4,,9001
+1626,9606,8607,-115.8,,9001
+1626,9606,8608,0.485,,9104
+1626,9606,8609,0.024,,9104
+1626,9606,8610,0.413,,9104
+1626,9606,8611,-0.54,,9202
+1627,9606,8605,-81.1,,9001
+1627,9606,8606,-89.4,,9001
+1627,9606,8607,-115.8,,9001
+1627,9606,8608,0.485,,9104
+1627,9606,8609,0.024,,9104
+1627,9606,8610,0.413,,9104
+1627,9606,8611,-0.54,,9202
+1628,9603,8605,-116.8,,9001
+1628,9603,8606,-106.4,,9001
+1628,9603,8607,-154.4,,9001
+1629,9603,8605,-116.8,,9001
+1629,9603,8606,-106.4,,9001
+1629,9603,8607,-154.4,,9001
+1630,9606,8605,-181.5,,9001
+1630,9606,8606,-90.3,,9001
+1630,9606,8607,-187.2,,9001
+1630,9606,8608,0.144,,9104
+1630,9606,8609,0.492,,9104
+1630,9606,8610,-0.394,,9104
+1630,9606,8611,17.57,,9202
+1631,9606,8605,-181.5,,9001
+1631,9606,8606,-90.3,,9001
+1631,9606,8607,-187.2,,9001
+1631,9606,8608,0.144,,9104
+1631,9606,8609,0.492,,9104
+1631,9606,8610,-0.394,,9104
+1631,9606,8611,17.57,,9202
+1632,9606,8605,-131.0,,9001
+1632,9606,8606,-100.3,,9001
+1632,9606,8607,-163.4,,9001
+1632,9606,8608,-1.244,,9104
+1632,9606,8609,-0.02,,9104
+1632,9606,8610,-1.144,,9104
+1632,9606,8611,9.39,,9202
+1633,9606,8605,-131.0,,9001
+1633,9606,8606,-100.3,,9001
+1633,9606,8607,-163.4,,9001
+1633,9606,8608,-1.244,,9104
+1633,9606,8609,-0.02,,9104
+1633,9606,8610,-1.144,,9104
+1633,9606,8611,9.39,,9202
+1634,9606,8605,-178.4,,9001
+1634,9606,8606,-83.2,,9001
+1634,9606,8607,-221.3,,9001
+1634,9606,8608,0.54,,9104
+1634,9606,8609,-0.532,,9104
+1634,9606,8610,-0.126,,9104
+1634,9606,8611,21.2,,9202
+1635,9606,8605,-178.4,,9001
+1635,9606,8606,-83.2,,9001
+1635,9606,8607,-221.3,,9001
+1635,9606,8608,0.54,,9104
+1635,9606,8609,-0.532,,9104
+1635,9606,8610,-0.126,,9104
+1635,9606,8611,21.2,,9202
+1638,9606,8605,-90.7,,9001
+1638,9606,8606,-106.1,,9001
+1638,9606,8607,-119.2,,9001
+1638,9606,8608,4.09,,9104
+1638,9606,8609,0.218,,9104
+1638,9606,8610,-1.05,,9104
+1638,9606,8611,1.37,,9202
+1639,9606,8605,-90.7,,9001
+1639,9606,8606,-106.1,,9001
+1639,9606,8607,-119.2,,9001
+1639,9606,8608,4.09,,9104
+1639,9606,8609,0.218,,9104
+1639,9606,8610,-1.05,,9104
+1639,9606,8611,1.37,,9202
+1640,9606,8605,482.5,,9001
+1640,9606,8606,-130.6,,9001
+1640,9606,8607,564.6,,9001
+1640,9606,8608,-1.042,,9104
+1640,9606,8609,-0.214,,9104
+1640,9606,8610,-0.631,,9104
+1640,9606,8611,8.15,,9202
+1641,9606,8605,482.5,,9001
+1641,9606,8606,-130.6,,9001
+1641,9606,8607,564.6,,9001
+1641,9606,8608,-1.042,,9104
+1641,9606,8609,-0.214,,9104
+1641,9606,8610,-0.631,,9104
+1641,9606,8611,8.15,,9202
+1642,9606,8605,-193.0,,9001
+1642,9606,8606,13.7,,9001
+1642,9606,8607,-39.3,,9001
+1642,9606,8608,-0.41,,9104
+1642,9606,8609,-2.933,,9104
+1642,9606,8610,2.688,,9104
+1642,9606,8611,0.43,,9202
+1643,9606,8605,-193.0,,9001
+1643,9606,8606,13.7,,9001
+1643,9606,8607,-39.3,,9001
+1643,9606,8608,-0.41,,9104
+1643,9606,8609,-2.933,,9104
+1643,9606,8610,2.688,,9104
+1643,9606,8611,0.43,,9202
+1644,9606,8605,33.4,,9001
+1644,9606,8606,-146.6,,9001
+1644,9606,8607,-76.3,,9001
+1644,9606,8608,-0.359,,9104
+1644,9606,8609,-0.053,,9104
+1644,9606,8610,0.844,,9104
+1644,9606,8611,-0.84,,9202
+1645,9606,8605,33.4,,9001
+1645,9606,8606,-146.6,,9001
+1645,9606,8607,-76.3,,9001
+1645,9606,8608,-0.359,,9104
+1645,9606,8609,-0.053,,9104
+1645,9606,8610,0.844,,9104
+1645,9606,8611,-0.84,,9202
+1646,9603,8605,674.4,,9001
+1646,9603,8606,15.1,,9001
+1646,9603,8607,405.3,,9001
+1647,9603,8605,674.374,,9001
+1647,9603,8606,15.056,,9001
+1647,9603,8607,405.346,,9001
+1648,9603,8605,0.0,,9001
+1648,9603,8606,0.0,,9001
+1648,9603,8607,0.0,,9001
+1649,9603,8605,0.0,,9001
+1649,9603,8606,0.0,,9001
+1649,9603,8607,0.0,,9001
+1650,9603,8605,-84.0,,9001
+1650,9603,8606,-97.0,,9001
+1650,9603,8607,-117.0,,9001
+1651,9603,8605,-168.0,,9001
+1651,9603,8606,-60.0,,9001
+1651,9603,8607,320.0,,9001
+1652,9606,8605,-99.1,,9001
+1652,9606,8606,53.3,,9001
+1652,9606,8607,-112.5,,9001
+1652,9606,8608,0.419,,9104
+1652,9606,8609,-0.83,,9104
+1652,9606,8610,1.885,,9104
+1652,9606,8611,-1.0,,9202
+1653,9606,8605,278.3,,9001
+1653,9606,8606,93.0,,9001
+1653,9606,8607,474.5,,9001
+1653,9606,8608,7.889,,9104
+1653,9606,8609,0.05,,9104
+1653,9606,8610,-6.61,,9104
+1653,9606,8611,6.21,,9202
+1654,9606,8605,278.3,,9001
+1654,9606,8606,93.0,,9001
+1654,9606,8607,474.5,,9001
+1654,9606,8608,7.889,,9104
+1654,9606,8609,0.05,,9104
+1654,9606,8610,-6.61,,9104
+1654,9606,8611,6.21,,9202
+1655,9606,8605,-280.9,,9001
+1655,9606,8606,-89.8,,9001
+1655,9606,8607,130.2,,9001
+1655,9606,8608,-1.721,,9104
+1655,9606,8609,0.355,,9104
+1655,9606,8610,-0.371,,9104
+1655,9606,8611,-5.92,,9202
+1656,9606,8605,-280.9,,9001
+1656,9606,8606,-89.8,,9001
+1656,9606,8607,130.2,,9001
+1656,9606,8608,-1.721,,9104
+1656,9606,8609,0.355,,9104
+1656,9606,8610,-0.371,,9104
+1656,9606,8611,-5.92,,9202
+1657,9606,8605,-238.2,,9001
+1657,9606,8606,85.2,,9001
+1657,9606,8607,29.9,,9001
+1657,9606,8608,0.166,,9104
+1657,9606,8609,0.046,,9104
+1657,9606,8610,1.248,,9104
+1657,9606,8611,2.03,,9202
+1658,9606,8605,-238.2,,9001
+1658,9606,8606,85.2,,9001
+1658,9606,8607,29.9,,9001
+1658,9606,8608,0.166,,9104
+1658,9606,8609,0.046,,9104
+1658,9606,8610,1.248,,9104
+1658,9606,8611,2.03,,9202
+1659,9606,8605,-104.1,,9001
+1659,9606,8606,-49.1,,9001
+1659,9606,8607,-9.9,,9001
+1659,9606,8608,0.971,,9104
+1659,9606,8609,-2.917,,9104
+1659,9606,8610,0.714,,9104
+1659,9606,8611,-11.68,,9202
+1660,9606,8605,-104.1,,9001
+1660,9606,8606,-49.1,,9001
+1660,9606,8607,-9.9,,9001
+1660,9606,8608,0.971,,9104
+1660,9606,8609,-2.917,,9104
+1660,9606,8610,0.714,,9104
+1660,9606,8611,-11.68,,9202
+1661,9606,8605,-168.6,,9001
+1661,9606,8606,-34.0,,9001
+1661,9606,8607,38.6,,9001
+1661,9606,8608,-0.374,,9104
+1661,9606,8609,-0.679,,9104
+1661,9606,8610,-1.379,,9104
+1661,9606,8611,-9.48,,9202
+1662,9606,8605,-168.6,,9001
+1662,9606,8606,-34.0,,9001
+1662,9606,8607,38.6,,9001
+1662,9606,8608,-0.374,,9104
+1662,9606,8609,-0.679,,9104
+1662,9606,8610,-1.379,,9104
+1662,9606,8611,-9.48,,9202
+1663,9606,8605,-50.2,,9001
+1663,9606,8606,-50.4,,9001
+1663,9606,8607,84.8,,9001
+1663,9606,8608,-0.69,,9104
+1663,9606,8609,-2.012,,9104
+1663,9606,8610,0.459,,9104
+1663,9606,8611,-28.08,,9202
+1664,9606,8605,-50.2,,9001
+1664,9606,8606,-50.4,,9001
+1664,9606,8607,84.8,,9001
+1664,9606,8608,-0.69,,9104
+1664,9606,8609,-2.012,,9104
+1664,9606,8610,0.459,,9104
+1664,9606,8611,-28.08,,9202
+1665,9607,8605,-129.193,,9001
+1665,9607,8606,-41.212,,9001
+1665,9607,8607,130.73,,9001
+1665,9607,8608,-0.246,,9104
+1665,9607,8609,-0.374,,9104
+1665,9607,8610,-0.329,,9104
+1665,9607,8611,-2.955,,9202
+1666,9607,8605,-119.353,,9001
+1666,9607,8606,-48.301,,9001
+1666,9607,8607,139.484,,9001
+1666,9607,8608,-0.415,,9104
+1666,9607,8609,-0.26,,9104
+1666,9607,8610,-0.437,,9104
+1666,9607,8611,-0.613,,9202
+1667,9607,8605,-120.271,,9001
+1667,9607,8606,-64.543,,9001
+1667,9607,8607,161.632,,9001
+1667,9607,8608,-0.217,,9104
+1667,9607,8609,0.067,,9104
+1667,9607,8610,0.129,,9104
+1667,9607,8611,2.499,,9202
+1668,9607,8605,-124.133,,9001
+1668,9607,8606,-42.003,,9001
+1668,9607,8607,137.4,,9001
+1668,9607,8608,0.008,,9104
+1668,9607,8609,-0.557,,9104
+1668,9607,8610,-0.178,,9104
+1668,9607,8611,-1.854,,9202
+1669,9607,8605,-117.763,,9001
+1669,9607,8606,-51.51,,9001
+1669,9607,8607,139.061,,9001
+1669,9607,8608,-0.292,,9104
+1669,9607,8609,-0.443,,9104
+1669,9607,8610,-0.277,,9104
+1669,9607,8611,-0.191,,9202
+1670,9615,8656,,nzgd2kgrid0005.gsb,
+1671,9603,8605,0.0,,9001
+1671,9603,8606,0.0,,9001
+1671,9603,8607,0.0,,9001
+1672,9607,8605,565.04,,9001
+1672,9607,8606,49.91,,9001
+1672,9607,8607,465.84,,9001
+1672,9607,8608,1.9848,,9109
+1672,9607,8609,-1.7439,,9109
+1672,9607,8610,9.0587,,9109
+1672,9607,8611,4.0772,,9202
+1673,9607,8605,582.0,,9001
+1673,9607,8606,105.0,,9001
+1673,9607,8607,414.0,,9001
+1673,9607,8608,-1.04,,9104
+1673,9607,8609,-0.35,,9104
+1673,9607,8610,3.08,,9104
+1673,9607,8611,8.3,,9202
+1674,9607,8605,24.0,,9001
+1674,9607,8606,-123.0,,9001
+1674,9607,8607,-94.0,,9001
+1674,9607,8608,-0.02,,9104
+1674,9607,8609,0.25,,9104
+1674,9607,8610,0.13,,9104
+1674,9607,8611,1.1,,9202
+1675,9607,8605,24.0,,9001
+1675,9607,8606,-123.0,,9001
+1675,9607,8607,-94.0,,9001
+1675,9607,8608,-0.02,,9104
+1675,9607,8609,0.25,,9104
+1675,9607,8610,0.13,,9104
+1675,9607,8611,1.1,,9202
+1676,9603,8605,674.374,,9001
+1676,9603,8606,15.056,,9001
+1676,9603,8607,405.346,,9001
+1677,9607,8605,56.0,,9001
+1677,9607,8606,75.77,,9001
+1677,9607,8607,15.31,,9001
+1677,9607,8608,-0.37,,9104
+1677,9607,8609,-0.2,,9104
+1677,9607,8610,-0.21,,9104
+1677,9607,8611,-1.01,,9202
+1678,9603,8605,0.0,,9001
+1678,9603,8606,0.0,,9001
+1678,9603,8607,0.0,,9001
+1679,9607,8605,-40.595,,9001
+1679,9607,8606,-18.55,,9001
+1679,9607,8607,-69.339,,9001
+1679,9607,8608,-2.508,,9104
+1679,9607,8609,-1.832,,9104
+1679,9607,8610,2.611,,9104
+1679,9607,8611,-4.299,,9202
+1680,9607,8605,419.3836,,9001
+1680,9607,8606,99.3335,,9001
+1680,9607,8607,591.3451,,9001
+1680,9607,8608,-0.850389,,9104
+1680,9607,8609,-1.817277,,9104
+1680,9607,8610,7.862238,,9104
+1680,9607,8611,-0.99496,,9202
+1681,9633,8664,,ostn97.txt,
+1682,9603,8605,-76.0,,9001
+1682,9603,8606,-138.0,,9001
+1682,9603,8607,67.0,,9001
+1683,9607,8605,-115.064,,9001
+1683,9607,8606,-87.39,,9001
+1683,9607,8607,-101.716,,9001
+1683,9607,8608,0.058,,9104
+1683,9607,8609,-4.001,,9104
+1683,9607,8610,2.062,,9104
+1683,9607,8611,9.366,,9202
+1684,9607,8605,-82.875,,9001
+1684,9607,8606,-57.097,,9001
+1684,9607,8607,-156.768,,9001
+1684,9607,8608,2.158,,9104
+1684,9607,8609,-1.524,,9104
+1684,9607,8610,0.982,,9104
+1684,9607,8611,-0.359,,9202
+1685,9607,8605,-138.527,,9001
+1685,9607,8606,-91.999,,9001
+1685,9607,8607,-114.591,,9001
+1685,9607,8608,0.14,,9104
+1685,9607,8609,-3.363,,9104
+1685,9607,8610,2.217,,9104
+1685,9607,8611,11.748,,9202
+1686,9607,8605,-73.472,,9001
+1686,9607,8606,-51.66,,9001
+1686,9607,8607,-112.482,,9001
+1686,9607,8608,-0.953,,9104
+1686,9607,8609,-4.6,,9104
+1686,9607,8610,2.368,,9104
+1686,9607,8611,0.586,,9202
+1687,9607,8605,219.315,,9001
+1687,9607,8606,168.975,,9001
+1687,9607,8607,-166.145,,9001
+1687,9607,8608,-0.198,,9104
+1687,9607,8609,-5.926,,9104
+1687,9607,8610,2.356,,9104
+1687,9607,8611,-57.104,,9202
+1688,9615,8656,,NB7783v2.gsb,
+1689,9615,8656,,PE7783V2.gsb,
+1690,9615,8656,,May76v20.gsb,
+1691,9615,8656,,CGQ77-98.gsb,
+1692,9615,8656,,QUE27-98.gsb,
+1693,9615,8656,,NTv2_0.gsb,
+1694,9613,8657,,wshpgn.las,
+1694,9613,8658,,wshpgn.los,
+1695,9613,8657,,eshpgn.las,
+1695,9613,8658,,eshpgn.los,
+1696,9615,8656,,NAD83-98.gsb,
+1697,9615,8656,,SK83-98.gsb,
+1698,9613,8657,,stgeorge.las,
+1698,9613,8658,,stgeorge.los,
+1699,9613,8657,,stlrnc.las,
+1699,9613,8658,,stlrnc.los,
+1700,9613,8657,,stpaul.las,
+1700,9613,8658,,stpaul.los,
+1701,9607,8605,59.47,,9001
+1701,9607,8606,-5.04,,9001
+1701,9607,8607,187.44,,9001
+1701,9607,8608,-0.47,,9104
+1701,9607,8609,0.1,,9104
+1701,9607,8610,-1.024,,9104
+1701,9607,8611,-4.5993,,9202
+1702,9615,8656,,AB_CSRS.DAC,
+1703,9615,8656,,SK27-98.gsb,
+1704,9613,8657,,arhpgn.las,
+1704,9613,8658,,arhpgn.los,
+1705,9613,8657,,iahpgn.las,
+1705,9613,8658,,iahpgn.los,
+1706,9613,8657,,mnhpgn.las,
+1706,9613,8658,,mnhpgn.los,
+1707,9613,8657,,mohpgn.las,
+1707,9613,8658,,mohpgn.los,
+1708,9613,8657,,arhpgn.las,
+1708,9613,8658,,arhpgn.los,
+1709,9613,8657,,iahpgn.las,
+1709,9613,8658,,iahpgn.los,
+1710,9613,8657,,mnhpgn.las,
+1710,9613,8658,,mnhpgn.los,
+1711,9613,8657,,mohpgn.las,
+1711,9613,8658,,mohpgn.los,
+1712,9613,8657,,cohpgn.las,
+1712,9613,8658,,cohpgn.los,
+1713,9613,8657,,gahpgn.las,
+1713,9613,8658,,gahpgn.los,
+1714,9613,8657,,flhpgn.las,
+1714,9613,8658,,flhpgn.los,
+1715,9613,8657,,emhpgn.las,
+1715,9613,8658,,emhpgn.los,
+1716,9613,8657,,wmhpgn.las,
+1716,9613,8658,,wmhpgn.los,
+1717,9613,8657,,alhpgn.las,
+1717,9613,8658,,alhpgn.los,
+1718,9613,8657,,kyhpgn.las,
+1718,9613,8658,,kyhpgn.los,
+1719,9613,8657,,lahpgn.las,
+1719,9613,8658,,lahpgn.los,
+1720,9613,8657,,mdhpgn.las,
+1720,9613,8658,,mdhpgn.los,
+1721,9613,8657,,mehpgn.las,
+1721,9613,8658,,mehpgn.los,
+1722,9613,8657,,mihpgn.las,
+1722,9613,8658,,mihpgn.los,
+1723,9613,8657,,mshpgn.las,
+1723,9613,8658,,mshpgn.los,
+1724,9613,8657,,nbhpgn.las,
+1724,9613,8658,,nbhpgn.los,
+1725,9613,8657,,nehpgn.las,
+1725,9613,8658,,nehpgn.los,
+1726,9613,8657,,nmhpgn.las,
+1726,9613,8658,,nmhpgn.los,
+1727,9613,8657,,nyhpgn.las,
+1727,9613,8658,,nyhpgn.los,
+1728,9613,8657,,azhpgn.las,
+1728,9613,8658,,azhpgn.los,
+1729,9613,8657,,ndhpgn.las,
+1729,9613,8658,,ndhpgn.los,
+1730,9613,8657,,okhpgn.las,
+1730,9613,8658,,okhpgn.los,
+1731,9613,8657,,pvhpgn.las,
+1731,9613,8658,,pvhpgn.los,
+1732,9613,8657,,sdhpgn.las,
+1732,9613,8658,,sdhpgn.los,
+1733,9613,8657,,tnhpgn.las,
+1733,9613,8658,,tnhpgn.los,
+1734,9613,8657,,ethpgn.las,
+1734,9613,8658,,ethpgn.los,
+1735,9613,8657,,wthpgn.las,
+1735,9613,8658,,wthpgn.los,
+1736,9613,8657,,vahpgn.las,
+1736,9613,8658,,vahpgn.los,
+1737,9613,8657,,wohpgn.las,
+1737,9613,8658,,wohpgn.los,
+1738,9613,8657,,wihpgn.las,
+1738,9613,8658,,wihpgn.los,
+1739,9613,8657,,cnhpgn.las,
+1739,9613,8658,,cnhpgn.los,
+1740,9613,8657,,wyhpgn.las,
+1740,9613,8658,,wyhpgn.los,
+1741,9613,8657,,hihpgn.las,
+1741,9613,8658,,hihpgn.los,
+1742,9613,8657,,inhpgn.las,
+1742,9613,8658,,inhpgn.los,
+1743,9613,8657,,kshpgn.las,
+1743,9613,8658,,kshpgn.los,
+1744,9613,8657,,nvhpgn.las,
+1744,9613,8658,,nvhpgn.los,
+1745,9613,8657,,ohhpgn.las,
+1745,9613,8658,,ohhpgn.los,
+1746,9613,8657,,uthpgn.las,
+1746,9613,8658,,uthpgn.los,
+1747,9613,8657,,wvhpgn.las,
+1747,9613,8658,,wvhpgn.los,
+1748,9613,8657,,ilhpgn.las,
+1748,9613,8658,,ilhpgn.los,
+1749,9613,8657,,njhpgn.las,
+1749,9613,8658,,njhpgn.los,
+1750,9613,8657,,cshpgn.las,
+1750,9613,8658,,cshpgn.los,
+1751,9607,8605,565.04,,9001
+1751,9607,8606,49.91,,9001
+1751,9607,8607,465.84,,9001
+1751,9607,8608,1.9848,,9109
+1751,9607,8609,-1.7439,,9109
+1751,9607,8610,9.0587,,9109
+1751,9607,8611,4.0772,,9202
+1752,9615,8656,,AB_CSRS.DAC,
+1753,9607,8605,660.077,,9001
+1753,9607,8606,13.551,,9001
+1753,9607,8607,369.344,,9001
+1753,9607,8608,2.484,,9113
+1753,9607,8609,1.783,,9113
+1753,9607,8610,2.939,,9113
+1753,9607,8611,5.66,,9202
+1754,9606,8605,-111.92,,9001
+1754,9606,8606,-87.85,,9001
+1754,9606,8607,114.5,,9001
+1754,9606,8608,1.875,,9104
+1754,9606,8609,0.202,,9104
+1754,9606,8610,0.219,,9104
+1754,9606,8611,0.032,,9202
+1755,9601,8602,-74.04513,,9110
+1756,9601,8602,-9.0754862,,9110
+1757,9601,8602,-17.4,,9110
+1758,9601,8602,106.482779,,9110
+1759,9601,8602,106.482779,,9110
+1760,9601,8602,18.03298,,9110
+1761,9601,8602,23.4258815,,9110
+1762,9601,8602,10.43225,,9110
+1763,9601,8602,2.5969213,,9105
+1764,9601,8602,2.201395,,9110
+1765,9601,8602,7.26225,,9110
+1766,9603,8605,674.4,,9001
+1766,9603,8606,15.1,,9001
+1766,9603,8607,405.3,,9001
+1767,9603,8605,0.0,,9001
+1767,9603,8606,0.0,,9001
+1767,9603,8607,0.0,,9001
+1768,9603,8605,0.0,,9001
+1768,9603,8606,0.0,,9001
+1768,9603,8607,0.0,,9001
+1769,9636,8605,-270.933,,9001
+1769,9636,8606,115.599,,9001
+1769,9636,8607,-360.226,,9001
+1769,9636,8608,-5.266,,9104
+1769,9636,8609,-1.238,,9104
+1769,9636,8610,2.381,,9104
+1769,9636,8611,-5.109,,9202
+1769,9636,8617,2464351.59,,9001
+1769,9636,8618,-5783466.61,,9001
+1769,9636,8667,974809.81,,9001
+1770,9636,8605,-270.933,,9001
+1770,9636,8606,115.599,,9001
+1770,9636,8607,-360.226,,9001
+1770,9636,8608,-5.266,,9104
+1770,9636,8609,-1.238,,9104
+1770,9636,8610,2.381,,9104
+1770,9636,8611,-5.109,,9202
+1770,9636,8617,2464351.59,,9001
+1770,9636,8618,-5783466.61,,9001
+1770,9636,8667,974809.81,,9001
+1771,9636,8605,-270.933,,9001
+1771,9636,8606,115.599,,9001
+1771,9636,8607,-360.226,,9001
+1771,9636,8608,-5.266,,9104
+1771,9636,8609,-1.238,,9104
+1771,9636,8610,2.381,,9104
+1771,9636,8611,-5.109,,9202
+1771,9636,8617,2464351.59,,9001
+1771,9636,8618,-5783466.61,,9001
+1771,9636,8667,974809.81,,9001
+1772,9636,8605,-270.933,,9001
+1772,9636,8606,115.599,,9001
+1772,9636,8607,-360.226,,9001
+1772,9636,8608,-5.266,,9104
+1772,9636,8609,-1.238,,9104
+1772,9636,8610,2.381,,9104
+1772,9636,8611,-5.109,,9202
+1772,9636,8617,2464351.59,,9001
+1772,9636,8618,-5783466.61,,9001
+1772,9636,8667,974809.81,,9001
+1773,9603,8605,0.0,,9001
+1773,9603,8606,0.0,,9001
+1773,9603,8607,0.0,,9001
+1774,9603,8605,0.0,,9001
+1774,9603,8606,0.0,,9001
+1774,9603,8607,0.0,,9001
+1775,9606,8605,24.9,,9001
+1775,9606,8606,-126.4,,9001
+1775,9606,8607,-93.2,,9001
+1775,9606,8608,-0.063,,9104
+1775,9606,8609,-0.247,,9104
+1775,9606,8610,-0.041,,9104
+1775,9606,8611,1.01,,9202
+1776,9606,8605,598.1,,9001
+1776,9606,8606,73.7,,9001
+1776,9606,8607,418.2,,9001
+1776,9606,8608,0.202,,9104
+1776,9606,8609,0.045,,9104
+1776,9606,8610,-2.455,,9104
+1776,9606,8611,6.7,,9202
+1777,9606,8605,598.1,,9001
+1777,9606,8606,73.7,,9001
+1777,9606,8607,418.2,,9001
+1777,9606,8608,0.202,,9104
+1777,9606,8609,0.045,,9104
+1777,9606,8610,-2.455,,9104
+1777,9606,8611,6.7,,9202
+1778,9606,8605,597.1,,9001
+1778,9606,8606,71.4,,9001
+1778,9606,8607,412.1,,9001
+1778,9606,8608,0.894,,9104
+1778,9606,8609,0.068,,9104
+1778,9606,8610,-1.563,,9104
+1778,9606,8611,7.58,,9202
+1779,9606,8605,584.8,,9001
+1779,9606,8606,67.0,,9001
+1779,9606,8607,400.3,,9001
+1779,9606,8608,0.105,,9104
+1779,9606,8609,0.013,,9104
+1779,9606,8610,-2.378,,9104
+1779,9606,8611,10.29,,9202
+1780,9606,8605,590.5,,9001
+1780,9606,8606,69.5,,9001
+1780,9606,8607,411.6,,9001
+1780,9606,8608,-0.796,,9104
+1780,9606,8609,-0.052,,9104
+1780,9606,8610,-3.601,,9104
+1780,9606,8611,8.3,,9202
+1781,9606,8605,599.4,,9001
+1781,9606,8606,72.4,,9001
+1781,9606,8607,419.2,,9001
+1781,9606,8608,-0.062,,9104
+1781,9606,8609,-0.022,,9104
+1781,9606,8610,-2.723,,9104
+1781,9606,8611,6.46,,9202
+1782,9606,8605,612.4,,9001
+1782,9606,8606,77.0,,9001
+1782,9606,8607,440.2,,9001
+1782,9606,8608,-0.054,,9104
+1782,9606,8609,0.057,,9104
+1782,9606,8610,-2.797,,9104
+1782,9606,8611,2.55,,9202
+1783,9606,8605,-84.1,,9001
+1783,9606,8606,-101.8,,9001
+1783,9606,8607,-129.7,,9001
+1783,9606,8608,0.0,,9104
+1783,9606,8609,0.0,,9104
+1783,9606,8610,0.468,,9104
+1783,9606,8611,1.05,,9202
+1784,9606,8605,-84.1,,9001
+1784,9606,8606,-101.8,,9001
+1784,9606,8607,-129.7,,9001
+1784,9606,8608,0.0,,9104
+1784,9606,8609,0.0,,9104
+1784,9606,8610,0.468,,9104
+1784,9606,8611,1.05,,9202
+1785,9606,8605,426.9,,9001
+1785,9606,8606,142.6,,9001
+1785,9606,8607,460.1,,9001
+1785,9606,8608,4.91,,9104
+1785,9606,8609,4.49,,9104
+1785,9606,8610,-12.42,,9104
+1785,9606,8611,17.1,,9202
+1786,9606,8605,426.9,,9001
+1786,9606,8606,142.6,,9001
+1786,9606,8607,460.1,,9001
+1786,9606,8608,4.91,,9104
+1786,9606,8609,4.49,,9104
+1786,9606,8610,-12.42,,9104
+1786,9606,8611,17.1,,9202
+1787,9607,8605,414.1,,9001
+1787,9607,8606,41.3,,9001
+1787,9607,8607,603.1,,9001
+1787,9607,8608,-0.855,,9104
+1787,9607,8609,2.141,,9104
+1787,9607,8610,-7.023,,9104
+1787,9607,8611,0.0,,9202
+1788,9607,8605,414.1,,9001
+1788,9607,8606,41.3,,9001
+1788,9607,8607,603.1,,9001
+1788,9607,8608,-0.855,,9104
+1788,9607,8609,2.141,,9104
+1788,9607,8610,-7.023,,9104
+1788,9607,8611,0.0,,9202
+1789,9603,8605,103.25,,9001
+1789,9603,8606,-100.4,,9001
+1789,9603,8607,-307.19,,9001
+1790,9606,8605,-282.1,,9001
+1790,9606,8606,-72.2,,9001
+1790,9606,8607,120.0,,9001
+1790,9606,8608,-1.592,,9104
+1790,9606,8609,0.145,,9104
+1790,9606,8610,-0.89,,9104
+1790,9606,8611,-4.46,,9202
+1791,9606,8605,-282.1,,9001
+1791,9606,8606,-72.2,,9001
+1791,9606,8607,120.0,,9001
+1791,9606,8608,-1.592,,9104
+1791,9606,8609,0.145,,9104
+1791,9606,8610,-0.89,,9104
+1791,9606,8611,-4.46,,9202
+1792,9606,8605,-231.0,,9001
+1792,9606,8606,102.6,,9001
+1792,9606,8607,29.8,,9001
+1792,9606,8608,0.615,,9104
+1792,9606,8609,-0.198,,9104
+1792,9606,8610,0.881,,9104
+1792,9606,8611,1.79,,9202
+1793,9606,8605,-231.0,,9001
+1793,9606,8606,102.6,,9001
+1793,9606,8607,29.8,,9001
+1793,9606,8608,0.615,,9104
+1793,9606,8609,-0.198,,9104
+1793,9606,8610,0.881,,9104
+1793,9606,8611,1.79,,9202
+1794,9603,8605,695.5,,9001
+1794,9603,8606,-216.6,,9001
+1794,9603,8607,491.1,,9001
+1795,9636,8605,408.0895,,9001
+1795,9636,8606,-288.9616,,9001
+1795,9636,8607,791.5498,,9001
+1795,9636,8608,-4.078662,,9104
+1795,9636,8609,0.022669,,9104
+1795,9636,8610,9.825424,,9104
+1795,9636,8611,94.060626,,9202
+1795,9636,8617,4444943.0248,,9001
+1795,9636,8618,1518098.4827,,9001
+1795,9636,8667,4302370.0765,,9001
+1796,9603,8605,-70.9,,9001
+1796,9603,8606,-151.8,,9001
+1796,9603,8607,-41.4,,9001
+1797,9603,8605,164.0,,9001
+1797,9603,8606,138.0,,9001
+1797,9603,8607,-189.0,,9001
+1798,9606,8605,163.511,,9001
+1798,9606,8606,127.533,,9001
+1798,9606,8607,-159.789,,9001
+1798,9606,8608,0.0,,9104
+1798,9606,8609,0.0,,9104
+1798,9606,8610,0.814,,9104
+1798,9606,8611,-0.6,,9202
+1799,9606,8605,105.0,,9001
+1799,9606,8606,326.0,,9001
+1799,9606,8607,-102.5,,9001
+1799,9606,8608,0.0,,9104
+1799,9606,8609,0.0,,9104
+1799,9606,8610,0.814,,9104
+1799,9606,8611,-0.6,,9202
+1800,9606,8605,-45.0,,9001
+1800,9606,8606,417.0,,9001
+1800,9606,8607,-3.5,,9001
+1800,9606,8608,0.0,,9104
+1800,9606,8609,0.0,,9104
+1800,9606,8610,0.814,,9104
+1800,9606,8611,-0.6,,9202
+1801,9603,8605,-145.0,,9001
+1801,9603,8606,52.7,,9001
+1801,9603,8607,-291.6,,9001
+1802,9606,8605,-178.3,,9001
+1802,9606,8606,-316.7,,9001
+1802,9606,8607,-131.5,,9001
+1802,9606,8608,5.278,,9104
+1802,9606,8609,6.077,,9104
+1802,9606,8610,10.979,,9104
+1802,9606,8611,19.166,,9202
+1803,9615,8656,,A66 National (13.09.01).gsb,
+1804,9615,8656,,National 84 (02.07.01).gsb,
+1805,9603,8605,-56.1,,9001
+1805,9603,8606,-167.8,,9001
+1805,9603,8607,13.1,,9001
+1806,9603,8605,-104.4,,9001
+1806,9603,8606,-136.6,,9001
+1806,9603,8607,201.2,,9001
+1807,9606,8605,27.0,,9001
+1807,9606,8606,-135.0,,9001
+1807,9606,8607,-84.5,,9001
+1807,9606,8608,0.0,,9104
+1807,9606,8609,0.0,,9104
+1807,9606,8610,0.554,,9104
+1807,9606,8611,0.2263,,9202
+1808,9606,8605,686.1,,9001
+1808,9606,8606,-123.5,,9001
+1808,9606,8607,-574.4,,9001
+1808,9606,8608,8.045,,9104
+1808,9606,8609,-23.366,,9104
+1808,9606,8610,10.791,,9104
+1808,9606,8611,-2.926,,9202
+1809,9606,8605,926.4,,9001
+1809,9606,8606,-715.9,,9001
+1809,9606,8607,-186.4,,9001
+1809,9606,8608,-10.364,,9104
+1809,9606,8609,-20.78,,9104
+1809,9606,8610,26.452,,9104
+1809,9606,8611,-7.224,,9202
+1810,9606,8605,-84.0,,9001
+1810,9606,8606,-103.0,,9001
+1810,9606,8607,-122.5,,9001
+1810,9606,8608,0.0,,9104
+1810,9606,8609,0.0,,9104
+1810,9606,8610,0.554,,9104
+1810,9606,8611,0.2263,,9202
+1811,9603,8605,-291.87,,9001
+1811,9603,8606,106.37,,9001
+1811,9603,8607,-364.52,,9001
+1812,9606,8605,293.0,,9001
+1812,9606,8606,836.0,,9001
+1812,9606,8607,318.0,,9001
+1812,9606,8608,0.5,,9104
+1812,9606,8609,1.6,,9104
+1812,9606,8610,-2.8,,9104
+1812,9606,8611,2.1,,9202
+1813,9603,8605,-378.873,,9001
+1813,9603,8606,676.002,,9001
+1813,9603,8607,-46.255,,9001
+1814,9603,8605,-377.7,,9001
+1814,9603,8606,675.1,,9001
+1814,9603,8607,-52.2,,9001
+1815,9606,8605,-152.9,,9001
+1815,9606,8606,43.8,,9001
+1815,9606,8607,358.3,,9001
+1815,9606,8608,2.714,,9104
+1815,9606,8609,1.386,,9104
+1815,9606,8610,-2.788,,9104
+1815,9606,8611,-6.743,,9202
+1816,9603,8605,-95.7,,9001
+1816,9603,8606,10.2,,9001
+1816,9603,8607,158.9,,9001
+1817,9603,8605,-165.914,,9001
+1817,9603,8606,-70.607,,9001
+1817,9603,8607,305.009,,9001
+1818,9606,8605,-89.0,,9001
+1818,9606,8606,-112.0,,9001
+1818,9606,8607,125.9,,9001
+1818,9606,8608,0.0,,9104
+1818,9606,8609,0.0,,9104
+1818,9606,8610,0.814,,9104
+1818,9606,8611,-0.38,,9202
+1819,9606,8605,-111.92,,9001
+1819,9606,8606,-87.85,,9001
+1819,9606,8607,114.5,,9001
+1819,9606,8608,1.875,,9104
+1819,9606,8609,0.202,,9104
+1819,9606,8610,0.219,,9104
+1819,9606,8611,0.032,,9202
+1820,9603,8605,-93.2,,9001
+1820,9603,8606,-93.31,,9001
+1820,9603,8607,121.156,,9001
+1821,9603,8605,-88.98,,9001
+1821,9603,8606,-83.23,,9001
+1821,9603,8607,113.55,,9001
+1822,9603,8605,-92.726,,9001
+1822,9603,8606,-90.304,,9001
+1822,9603,8607,115.735,,9001
+1823,9603,8605,-93.134,,9001
+1823,9603,8606,-86.647,,9001
+1823,9603,8607,114.196,,9001
+1824,9603,8605,-93.0,,9001
+1824,9603,8606,-94.0,,9001
+1824,9603,8607,124.0,,9001
+1825,9606,8605,-162.619,,9001
+1825,9606,8606,-276.959,,9001
+1825,9606,8607,-161.764,,9001
+1825,9606,8608,0.067753,,9104
+1825,9606,8609,-2.243649,,9104
+1825,9606,8610,-1.158827,,9104
+1825,9606,8611,-1.094246,,9202
+1826,9603,8605,0.0,,9001
+1826,9603,8606,0.0,,9001
+1826,9603,8607,0.0,,9001
+1827,9618,8601,7.92,,9104
+1827,9618,8602,-13.88,,9104
+1827,9618,8604,26.1,,9001
+1828,9603,8605,-37.0,,9001
+1828,9603,8606,157.0,,9001
+1828,9603,8607,85.0,,9001
+1829,9607,8605,56.0,,9001
+1829,9607,8606,-75.77,,9001
+1829,9607,8607,-15.31,,9001
+1829,9607,8608,0.37,,9104
+1829,9607,8609,0.2,,9104
+1829,9607,8610,0.21,,9104
+1829,9607,8611,1.01,,9202
+1830,9607,8605,56.0,,9001
+1830,9607,8606,-75.77,,9001
+1830,9607,8607,-15.31,,9001
+1830,9607,8608,0.37,,9104
+1830,9607,8609,0.2,,9104
+1830,9607,8610,0.21,,9104
+1830,9607,8611,1.01,,9202
+1831,9603,8605,57.01,,9001
+1831,9603,8606,-69.97,,9001
+1831,9603,8607,-9.29,,9001
+1832,9606,8605,2.691,,9001
+1832,9606,8606,-14.757,,9001
+1832,9606,8607,4.724,,9001
+1832,9606,8608,0.0,,9104
+1832,9606,8609,0.0,,9104
+1832,9606,8610,0.774,,9104
+1832,9606,8611,-0.6,,9202
+1833,9607,8605,-1.977,,9001
+1833,9607,8606,-13.06,,9001
+1833,9607,8607,-9.993,,9001
+1833,9607,8608,-0.364,,9104
+1833,9607,8609,-0.254,,9104
+1833,9607,8610,-0.689,,9104
+1833,9607,8611,-1.037,,9202
+1834,9603,8605,-403.0,,9001
+1834,9603,8606,684.0,,9001
+1834,9603,8607,41.0,,9001
+1835,9603,8605,-387.06,,9001
+1835,9603,8606,636.53,,9001
+1835,9603,8607,46.29,,9001
+1836,9603,8605,-403.4,,9001
+1836,9603,8606,681.12,,9001
+1836,9603,8607,46.56,,9001
+1837,9603,8605,-587.8,,9001
+1837,9603,8606,519.75,,9001
+1837,9603,8607,145.76,,9001
+1838,9603,8605,-404.78,,9001
+1838,9603,8606,685.68,,9001
+1838,9603,8607,45.47,,9001
+1839,9603,8605,-101.0,,9001
+1839,9603,8606,-111.0,,9001
+1839,9603,8607,187.0,,9001
+1840,9606,8605,-119.4248,,9001
+1840,9606,8606,-303.65872,,9001
+1840,9606,8607,-11.00061,,9001
+1840,9606,8608,1.164298,,9104
+1840,9606,8609,0.174458,,9104
+1840,9606,8610,1.096259,,9104
+1840,9606,8611,3.657065,,9202
+1841,9615,8656,,NB7783v2.gsb,
+1842,9603,8605,0.0,,9001
+1842,9603,8606,0.0,,9001
+1842,9603,8607,0.0,,9001
+1843,9615,8656,,NAD83-98.gsb,
+1844,9615,8656,,QUE27-98.gsb,
+1845,9615,8656,,CGQ77-98.gsb,
+1846,9615,8656,,PE7783V2.gsb,
+1847,9615,8656,,SK27-98.gsb,
+1848,9615,8656,,SK83-98.gsb,
+1849,9615,8656,,AB_CSRS.DAC,
+1850,9615,8656,,NS778301.gsb,
+1851,9615,8656,,NS778301.gsb,
+1852,9606,8605,-533.4,,9001
+1852,9606,8606,669.2,,9001
+1852,9606,8607,-52.5,,9001
+1852,9606,8608,0.0,,9104
+1852,9606,8609,0.0,,9104
+1852,9606,8610,4.28,,9104
+1852,9606,8611,9.4,,9202
+1854,9603,8605,-239.1,,9001
+1854,9603,8606,-170.02,,9001
+1854,9603,8607,397.5,,9001
+1855,9603,8605,-244.72,,9001
+1855,9603,8606,-162.773,,9001
+1855,9603,8607,400.75,,9001
+1856,9603,8605,-122.89,,9001
+1856,9603,8606,-159.08,,9001
+1856,9603,8607,-168.74,,9001
+1857,9603,8605,-84.78,,9001
+1857,9603,8606,-107.55,,9001
+1857,9603,8607,-137.25,,9001
+1858,9603,8605,-123.92,,9001
+1858,9603,8606,-155.515,,9001
+1858,9603,8607,-157.721,,9001
+1859,9603,8605,-69.06,,9001
+1859,9603,8606,-90.71,,9001
+1859,9603,8607,-142.56,,9001
+1860,9603,8605,-113.997,,9001
+1860,9603,8606,-97.076,,9001
+1860,9603,8607,-152.312,,9001
+1861,9603,8605,-114.5,,9001
+1861,9603,8606,-96.1,,9001
+1861,9603,8607,-151.9,,9001
+1862,9606,8605,-194.513,,9001
+1862,9606,8606,-63.978,,9001
+1862,9606,8607,-25.759,,9001
+1862,9606,8608,-3.4027,,9104
+1862,9606,8609,3.756,,9104
+1862,9606,8610,-3.352,,9104
+1862,9606,8611,-0.9175,,9202
+1863,9607,8605,-389.691,,9001
+1863,9607,8606,64.502,,9001
+1863,9607,8607,210.209,,9001
+1863,9607,8608,-0.086,,9104
+1863,9607,8609,-14.314,,9104
+1863,9607,8610,6.39,,9104
+1863,9607,8611,0.9264,,9202
+5400,9616,8603,-28.0,,9001
+5401,9616,8603,-0.037,,9001
+5402,9616,8603,-26.3,,9001
+5403,9616,8603,-1.7,,9001
+5404,9616,8603,-0.4,,9001
+5405,9616,8603,0.146,,9001
+10101,9807,8801,30.3,,9110
+10101,9807,8802,-85.5,,9110
+10101,9807,8805,0.99996,,9201
+10101,9807,8806,500000.0,,9003
+10101,9807,8807,0.0,,9003
+10102,9807,8801,30.0,,9110
+10102,9807,8802,-87.3,,9110
+10102,9807,8805,0.999933333,,9201
+10102,9807,8806,500000.0,,9003
+10102,9807,8807,0.0,,9003
+10131,9807,8801,30.3,,9110
+10131,9807,8802,-85.5,,9110
+10131,9807,8805,0.99996,,9201
+10131,9807,8806,200000.0,,9001
+10131,9807,8807,0.0,,9001
+10132,9807,8801,30.0,,9110
+10132,9807,8802,-87.3,,9110
+10132,9807,8805,0.999933333,,9201
+10132,9807,8806,600000.0,,9001
+10132,9807,8807,0.0,,9001
+10201,9807,8801,31.0,,9110
+10201,9807,8802,-110.1,,9110
+10201,9807,8805,0.9999,,9201
+10201,9807,8806,500000.0,,9003
+10201,9807,8807,0.0,,9003
+10202,9807,8801,31.0,,9110
+10202,9807,8802,-111.55,,9110
+10202,9807,8805,0.9999,,9201
+10202,9807,8806,500000.0,,9003
+10202,9807,8807,0.0,,9003
+10203,9807,8801,31.0,,9110
+10203,9807,8802,-113.45,,9110
+10203,9807,8805,0.999933333,,9201
+10203,9807,8806,500000.0,,9003
+10203,9807,8807,0.0,,9003
+10231,9807,8801,31.0,,9110
+10231,9807,8802,-110.1,,9110
+10231,9807,8805,0.9999,,9201
+10231,9807,8806,213360.0,,9001
+10231,9807,8807,0.0,,9001
+10232,9807,8801,31.0,,9110
+10232,9807,8802,-111.55,,9110
+10232,9807,8805,0.9999,,9201
+10232,9807,8806,213360.0,,9001
+10232,9807,8807,0.0,,9001
+10233,9807,8801,31.0,,9110
+10233,9807,8802,-113.45,,9110
+10233,9807,8805,0.999933333,,9201
+10233,9807,8806,213360.0,,9001
+10233,9807,8807,0.0,,9001
+10301,9802,8821,34.2,,9110
+10301,9802,8822,-92.0,,9110
+10301,9802,8823,36.14,,9110
+10301,9802,8824,34.56,,9110
+10301,9802,8826,2000000.0,,9003
+10301,9802,8827,0.0,,9003
+10302,9802,8821,32.4,,9110
+10302,9802,8822,-92.0,,9110
+10302,9802,8823,34.46,,9110
+10302,9802,8824,33.18,,9110
+10302,9802,8826,2000000.0,,9003
+10302,9802,8827,0.0,,9003
+10331,9802,8821,34.2,,9110
+10331,9802,8822,-92.0,,9110
+10331,9802,8823,36.14,,9110
+10331,9802,8824,34.56,,9110
+10331,9802,8826,400000.0,,9001
+10331,9802,8827,0.0,,9001
+10332,9802,8821,32.4,,9110
+10332,9802,8822,-92.0,,9110
+10332,9802,8823,34.46,,9110
+10332,9802,8824,33.18,,9110
+10332,9802,8826,400000.0,,9001
+10332,9802,8827,400000.0,,9001
+10401,9802,8821,39.2,,9110
+10401,9802,8822,-122.0,,9110
+10401,9802,8823,41.4,,9110
+10401,9802,8824,40.0,,9110
+10401,9802,8826,2000000.0,,9003
+10401,9802,8827,0.0,,9003
+10402,9802,8821,37.4,,9110
+10402,9802,8822,-122.0,,9110
+10402,9802,8823,39.5,,9110
+10402,9802,8824,38.2,,9110
+10402,9802,8826,2000000.0,,9003
+10402,9802,8827,0.0,,9003
+10403,9802,8821,36.3,,9110
+10403,9802,8822,-120.3,,9110
+10403,9802,8823,38.26,,9110
+10403,9802,8824,37.04,,9110
+10403,9802,8826,2000000.0,,9003
+10403,9802,8827,0.0,,9003
+10404,9802,8821,35.2,,9110
+10404,9802,8822,-119.0,,9110
+10404,9802,8823,37.15,,9110
+10404,9802,8824,36.0,,9110
+10404,9802,8826,2000000.0,,9003
+10404,9802,8827,0.0,,9003
+10405,9802,8821,33.3,,9110
+10405,9802,8822,-118.0,,9110
+10405,9802,8823,35.28,,9110
+10405,9802,8824,34.02,,9110
+10405,9802,8826,2000000.0,,9003
+10405,9802,8827,0.0,,9003
+10406,9802,8821,32.1,,9110
+10406,9802,8822,-116.15,,9110
+10406,9802,8823,33.53,,9110
+10406,9802,8824,32.47,,9110
+10406,9802,8826,2000000.0,,9003
+10406,9802,8827,0.0,,9003
+10407,9802,8821,34.08,,9110
+10407,9802,8822,-118.2,,9110
+10407,9802,8823,34.25,,9110
+10407,9802,8824,33.52,,9110
+10407,9802,8826,4186692.58,,9003
+10407,9802,8827,416926.74,,9003
+10431,9802,8821,39.2,,9110
+10431,9802,8822,-122.0,,9110
+10431,9802,8823,41.4,,9110
+10431,9802,8824,40.0,,9110
+10431,9802,8826,2000000.0,,9001
+10431,9802,8827,500000.0,,9001
+10432,9802,8821,37.4,,9110
+10432,9802,8822,-122.0,,9110
+10432,9802,8823,39.5,,9110
+10432,9802,8824,38.2,,9110
+10432,9802,8826,2000000.0,,9001
+10432,9802,8827,500000.0,,9001
+10433,9802,8821,36.3,,9110
+10433,9802,8822,-120.3,,9110
+10433,9802,8823,38.26,,9110
+10433,9802,8824,37.04,,9110
+10433,9802,8826,2000000.0,,9001
+10433,9802,8827,500000.0,,9001
+10434,9802,8821,35.2,,9110
+10434,9802,8822,-119.0,,9110
+10434,9802,8823,37.15,,9110
+10434,9802,8824,36.0,,9110
+10434,9802,8826,2000000.0,,9001
+10434,9802,8827,500000.0,,9001
+10435,9802,8821,33.3,,9110
+10435,9802,8822,-118.0,,9110
+10435,9802,8823,35.28,,9110
+10435,9802,8824,34.02,,9110
+10435,9802,8826,2000000.0,,9001
+10435,9802,8827,500000.0,,9001
+10436,9802,8821,32.1,,9110
+10436,9802,8822,-116.15,,9110
+10436,9802,8823,33.53,,9110
+10436,9802,8824,32.47,,9110
+10436,9802,8826,2000000.0,,9001
+10436,9802,8827,500000.0,,9001
+10501,9802,8821,39.2,,9110
+10501,9802,8822,-105.3,,9110
+10501,9802,8823,39.43,,9110
+10501,9802,8824,40.47,,9110
+10501,9802,8826,2000000.0,,9003
+10501,9802,8827,0.0,,9003
+10502,9802,8821,37.5,,9110
+10502,9802,8822,-105.3,,9110
+10502,9802,8823,39.45,,9110
+10502,9802,8824,38.27,,9110
+10502,9802,8826,2000000.0,,9003
+10502,9802,8827,0.0,,9003
+10503,9802,8821,36.4,,9110
+10503,9802,8822,-105.3,,9110
+10503,9802,8823,38.26,,9110
+10503,9802,8824,37.14,,9110
+10503,9802,8826,2000000.0,,9003
+10503,9802,8827,0.0,,9003
+10531,9802,8821,39.2,,9110
+10531,9802,8822,-105.3,,9110
+10531,9802,8823,40.47,,9110
+10531,9802,8824,39.43,,9110
+10531,9802,8826,914401.8289,,9001
+10531,9802,8827,304800.6096,,9001
+10532,9802,8821,37.5,,9110
+10532,9802,8822,-105.3,,9110
+10532,9802,8823,39.45,,9110
+10532,9802,8824,38.27,,9110
+10532,9802,8826,914401.8289,,9001
+10532,9802,8827,304800.6096,,9001
+10533,9802,8821,36.4,,9110
+10533,9802,8822,-105.3,,9110
+10533,9802,8823,38.26,,9110
+10533,9802,8824,37.14,,9110
+10533,9802,8826,914401.8289,,9001
+10533,9802,8827,304800.6096,,9001
+10600,9802,8821,40.5,,9110
+10600,9802,8822,-72.45,,9110
+10600,9802,8823,41.52,,9110
+10600,9802,8824,41.12,,9110
+10600,9802,8826,600000.0,,9003
+10600,9802,8827,0.0,,9003
+10630,9802,8821,40.5,,9110
+10630,9802,8822,-72.45,,9110
+10630,9802,8823,41.52,,9110
+10630,9802,8824,41.12,,9110
+10630,9802,8826,304800.6096,,9001
+10630,9802,8827,152400.3048,,9001
+10700,9807,8801,38.0,,9110
+10700,9807,8802,-75.25,,9110
+10700,9807,8805,0.999995,,9201
+10700,9807,8806,500000.0,,9003
+10700,9807,8807,0.0,,9003
+10730,9807,8801,38.0,,9110
+10730,9807,8802,-75.25,,9110
+10730,9807,8805,0.999995,,9201
+10730,9807,8806,200000.0,,9001
+10730,9807,8807,0.0,,9001
+10901,9807,8801,24.2,,9110
+10901,9807,8802,-81.0,,9110
+10901,9807,8805,0.999941177,,9201
+10901,9807,8806,500000.0,,9003
+10901,9807,8807,0.0,,9003
+10902,9807,8801,24.2,,9110
+10902,9807,8802,-82.0,,9110
+10902,9807,8805,0.999941177,,9201
+10902,9807,8806,500000.0,,9003
+10902,9807,8807,0.0,,9003
+10903,9802,8821,29.0,,9110
+10903,9802,8822,-84.3,,9110
+10903,9802,8823,30.45,,9110
+10903,9802,8824,29.35,,9110
+10903,9802,8826,2000000.0,,9003
+10903,9802,8827,0.0,,9003
+10931,9807,8801,24.2,,9110
+10931,9807,8802,-81.0,,9110
+10931,9807,8805,0.999941177,,9201
+10931,9807,8806,200000.0,,9001
+10931,9807,8807,0.0,,9001
+10932,9807,8801,24.2,,9110
+10932,9807,8802,-82.0,,9110
+10932,9807,8805,0.999941177,,9201
+10932,9807,8806,200000.0,,9001
+10932,9807,8807,0.0,,9001
+10933,9802,8821,29.0,,9110
+10933,9802,8822,-84.3,,9110
+10933,9802,8823,30.45,,9110
+10933,9802,8824,29.35,,9110
+10933,9802,8826,600000.0,,9001
+10933,9802,8827,0.0,,9001
+11001,9807,8801,30.0,,9110
+11001,9807,8802,-82.1,,9110
+11001,9807,8805,0.9999,,9201
+11001,9807,8806,500000.0,,9003
+11001,9807,8807,0.0,,9003
+11002,9807,8801,30.0,,9110
+11002,9807,8802,-84.1,,9110
+11002,9807,8805,0.9999,,9201
+11002,9807,8806,500000.0,,9003
+11002,9807,8807,0.0,,9003
+11031,9807,8801,30.0,,9110
+11031,9807,8802,-82.1,,9110
+11031,9807,8805,0.9999,,9201
+11031,9807,8806,200000.0,,9001
+11031,9807,8807,0.0,,9001
+11032,9807,8801,30.0,,9110
+11032,9807,8802,-84.1,,9110
+11032,9807,8805,0.9999,,9201
+11032,9807,8806,700000.0,,9001
+11032,9807,8807,0.0,,9001
+11101,9807,8801,41.4,,9110
+11101,9807,8802,-112.1,,9110
+11101,9807,8805,0.999947368,,9201
+11101,9807,8806,500000.0,,9003
+11101,9807,8807,0.0,,9003
+11102,9807,8801,41.4,,9110
+11102,9807,8802,-114.0,,9110
+11102,9807,8805,0.999947368,,9201
+11102,9807,8806,500000.0,,9003
+11102,9807,8807,0.0,,9003
+11103,9807,8801,41.4,,9110
+11103,9807,8802,-115.45,,9110
+11103,9807,8805,0.999933333,,9201
+11103,9807,8806,500000.0,,9003
+11103,9807,8807,0.0,,9003
+11131,9807,8801,41.4,,9110
+11131,9807,8802,-112.1,,9110
+11131,9807,8805,0.999947368,,9201
+11131,9807,8806,200000.0,,9001
+11131,9807,8807,0.0,,9001
+11132,9807,8801,41.4,,9110
+11132,9807,8802,-114.0,,9110
+11132,9807,8805,0.999947368,,9201
+11132,9807,8806,500000.0,,9001
+11132,9807,8807,0.0,,9001
+11133,9807,8801,41.4,,9110
+11133,9807,8802,-115.45,,9110
+11133,9807,8805,0.999933333,,9201
+11133,9807,8806,800000.0,,9001
+11133,9807,8807,0.0,,9001
+11201,9807,8801,36.4,,9110
+11201,9807,8802,-88.2,,9110
+11201,9807,8805,0.999975,,9201
+11201,9807,8806,500000.0,,9003
+11201,9807,8807,0.0,,9003
+11202,9807,8801,36.4,,9110
+11202,9807,8802,-90.1,,9110
+11202,9807,8805,0.999941177,,9201
+11202,9807,8806,500000.0,,9003
+11202,9807,8807,0.0,,9003
+11231,9807,8801,36.4,,9110
+11231,9807,8802,-88.2,,9110
+11231,9807,8805,0.999975,,9201
+11231,9807,8806,300000.0,,9001
+11231,9807,8807,0.0,,9001
+11232,9807,8801,36.4,,9110
+11232,9807,8802,-90.1,,9110
+11232,9807,8805,0.999941177,,9201
+11232,9807,8806,700000.0,,9001
+11232,9807,8807,0.0,,9001
+11301,9807,8801,37.3,,9110
+11301,9807,8802,-85.4,,9110
+11301,9807,8805,0.999966667,,9201
+11301,9807,8806,500000.0,,9003
+11301,9807,8807,0.0,,9003
+11302,9807,8801,37.3,,9110
+11302,9807,8802,-87.05,,9110
+11302,9807,8805,0.999966667,,9201
+11302,9807,8806,500000.0,,9003
+11302,9807,8807,0.0,,9003
+11331,9807,8801,37.3,,9110
+11331,9807,8802,-85.4,,9110
+11331,9807,8805,0.999966667,,9201
+11331,9807,8806,100000.0,,9001
+11331,9807,8807,250000.0,,9001
+11332,9807,8801,37.3,,9110
+11332,9807,8802,-87.05,,9110
+11332,9807,8805,0.999966667,,9201
+11332,9807,8806,900000.0,,9001
+11332,9807,8807,250000.0,,9001
+11401,9802,8821,41.3,,9110
+11401,9802,8822,-93.3,,9110
+11401,9802,8823,43.16,,9110
+11401,9802,8824,42.04,,9110
+11401,9802,8826,2000000.0,,9003
+11401,9802,8827,0.0,,9003
+11402,9802,8821,40.0,,9110
+11402,9802,8822,-93.3,,9110
+11402,9802,8823,41.47,,9110
+11402,9802,8824,40.37,,9110
+11402,9802,8826,2000000.0,,9003
+11402,9802,8827,0.0,,9003
+11431,9802,8821,41.3,,9110
+11431,9802,8822,-93.3,,9110
+11431,9802,8823,43.16,,9110
+11431,9802,8824,42.04,,9110
+11431,9802,8826,1500000.0,,9001
+11431,9802,8827,1000000.0,,9001
+11432,9802,8821,40.0,,9110
+11432,9802,8822,-93.3,,9110
+11432,9802,8823,41.47,,9110
+11432,9802,8824,40.37,,9110
+11432,9802,8826,500000.0,,9001
+11432,9802,8827,0.0,,9001
+11501,9802,8821,38.2,,9110
+11501,9802,8822,-98.0,,9110
+11501,9802,8823,39.47,,9110
+11501,9802,8824,38.43,,9110
+11501,9802,8826,2000000.0,,9003
+11501,9802,8827,0.0,,9003
+11502,9802,8821,36.4,,9110
+11502,9802,8822,-98.3,,9110
+11502,9802,8823,38.34,,9110
+11502,9802,8824,37.16,,9110
+11502,9802,8826,2000000.0,,9003
+11502,9802,8827,0.0,,9003
+11531,9802,8821,38.2,,9110
+11531,9802,8822,-98.0,,9110
+11531,9802,8823,39.47,,9110
+11531,9802,8824,38.43,,9110
+11531,9802,8826,400000.0,,9001
+11531,9802,8827,0.0,,9001
+11532,9802,8821,36.4,,9110
+11532,9802,8822,-98.3,,9110
+11532,9802,8823,38.34,,9110
+11532,9802,8824,37.16,,9110
+11532,9802,8826,400000.0,,9001
+11532,9802,8827,400000.0,,9001
+11601,9802,8821,37.3,,9110
+11601,9802,8822,-84.15,,9110
+11601,9802,8823,37.58,,9110
+11601,9802,8824,38.58,,9110
+11601,9802,8826,2000000.0,,9003
+11601,9802,8827,0.0,,9003
+11602,9802,8821,36.2,,9110
+11602,9802,8822,-85.45,,9110
+11602,9802,8823,36.44,,9110
+11602,9802,8824,37.56,,9110
+11602,9802,8826,2000000.0,,9003
+11602,9802,8827,0.0,,9003
+11631,9802,8821,37.3,,9110
+11631,9802,8822,-84.15,,9110
+11631,9802,8823,37.58,,9110
+11631,9802,8824,37.58,,9110
+11631,9802,8826,500000.0,,9001
+11631,9802,8827,0.0,,9001
+11632,9802,8821,36.2,,9110
+11632,9802,8822,-85.45,,9110
+11632,9802,8823,37.56,,9110
+11632,9802,8824,36.44,,9110
+11632,9802,8826,500000.0,,9001
+11632,9802,8827,500000.0,,9001
+11701,9802,8821,30.4,,9110
+11701,9802,8822,-92.3,,9110
+11701,9802,8823,31.1,,9110
+11701,9802,8824,32.4,,9110
+11701,9802,8826,2000000.0,,9003
+11701,9802,8827,0.0,,9003
+11702,9802,8821,28.4,,9110
+11702,9802,8822,-91.2,,9110
+11702,9802,8823,29.18,,9110
+11702,9802,8824,30.42,,9110
+11702,9802,8826,2000000.0,,9003
+11702,9802,8827,0.0,,9003
+11731,9802,8821,30.3,,9110
+11731,9802,8822,-92.3,,9110
+11731,9802,8823,32.4,,9110
+11731,9802,8824,31.1,,9110
+11731,9802,8826,1000000.0,,9001
+11731,9802,8827,0.0,,9001
+11732,9802,8821,28.3,,9110
+11732,9802,8822,-91.2,,9110
+11732,9802,8823,30.42,,9110
+11732,9802,8824,29.18,,9110
+11732,9802,8826,1000000.0,,9001
+11732,9802,8827,0.0,,9001
+11801,9807,8801,43.5,,9110
+11801,9807,8802,-68.3,,9110
+11801,9807,8805,0.9999,,9201
+11801,9807,8806,500000.0,,9003
+11801,9807,8807,0.0,,9003
+11802,9807,8801,42.5,,9110
+11802,9807,8802,-70.1,,9110
+11802,9807,8805,0.999966667,,9201
+11802,9807,8806,500000.0,,9003
+11802,9807,8807,0.0,,9003
+11831,9807,8801,43.4,,9110
+11831,9807,8802,-68.3,,9110
+11831,9807,8805,0.9999,,9201
+11831,9807,8806,300000.0,,9001
+11831,9807,8807,0.0,,9001
+11832,9807,8801,42.5,,9110
+11832,9807,8802,-70.1,,9110
+11832,9807,8805,0.999966667,,9201
+11832,9807,8806,900000.0,,9001
+11832,9807,8807,0.0,,9001
+11900,9802,8821,37.5,,9110
+11900,9802,8822,-77.0,,9110
+11900,9802,8823,38.18,,9110
+11900,9802,8824,39.27,,9110
+11900,9802,8826,800000.0,,9003
+11900,9802,8827,0.0,,9003
+11930,9802,8821,37.4,,9110
+11930,9802,8822,-77.0,,9110
+11930,9802,8823,39.27,,9110
+11930,9802,8824,38.18,,9110
+11930,9802,8826,400000.0,,9001
+11930,9802,8827,0.0,,9001
+12001,9802,8821,41.0,,9110
+12001,9802,8822,-71.3,,9110
+12001,9802,8823,41.43,,9110
+12001,9802,8824,42.41,,9110
+12001,9802,8826,600000.0,,9003
+12001,9802,8827,0.0,,9003
+12002,9802,8821,41.0,,9110
+12002,9802,8822,-70.3,,9110
+12002,9802,8823,41.17,,9110
+12002,9802,8824,41.29,,9110
+12002,9802,8826,200000.0,,9003
+12002,9802,8827,0.0,,9003
+12031,9802,8821,41.0,,9110
+12031,9802,8822,-71.3,,9110
+12031,9802,8823,42.41,,9110
+12031,9802,8824,41.43,,9110
+12031,9802,8826,200000.0,,9001
+12031,9802,8827,750000.0,,9001
+12032,9802,8821,41.0,,9110
+12032,9802,8822,-70.3,,9110
+12032,9802,8823,41.29,,9110
+12032,9802,8824,41.17,,9110
+12032,9802,8826,500000.0,,9001
+12032,9802,8827,0.0,,9001
+12101,9807,8801,41.3,,9110
+12101,9807,8802,-83.4,,9110
+12101,9807,8805,0.999942857,,9201
+12101,9807,8806,500000.0,,9003
+12101,9807,8807,0.0,,9003
+12102,9807,8801,41.3,,9110
+12102,9807,8802,-85.45,,9110
+12102,9807,8805,0.999909091,,9201
+12102,9807,8806,500000.0,,9003
+12102,9807,8807,0.0,,9003
+12103,9807,8801,41.3,,9110
+12103,9807,8802,-88.45,,9110
+12103,9807,8805,0.999909091,,9201
+12103,9807,8806,500000.0,,9003
+12103,9807,8807,0.0,,9003
+12111,9802,8821,44.47,,9110
+12111,9802,8822,-87.0,,9110
+12111,9802,8823,45.29,,9110
+12111,9802,8824,47.05,,9110
+12111,9802,8826,2000000.0,,9003
+12111,9802,8827,0.0,,9003
+12112,9802,8821,43.19,,9110
+12112,9802,8822,-84.2,,9110
+12112,9802,8823,44.11,,9110
+12112,9802,8824,45.42,,9110
+12112,9802,8826,2000000.0,,9003
+12112,9802,8827,0.0,,9003
+12113,9802,8821,41.3,,9110
+12113,9802,8822,-84.2,,9110
+12113,9802,8823,42.06,,9110
+12113,9802,8824,43.4,,9110
+12113,9802,8826,2000000.0,,9003
+12113,9802,8827,0.0,,9003
+12141,9802,8821,44.47,,9110
+12141,9802,8822,-87.0,,9110
+12141,9802,8823,47.05,,9110
+12141,9802,8824,45.29,,9110
+12141,9802,8826,8000000.0,,9001
+12141,9802,8827,0.0,,9001
+12142,9802,8821,43.19,,9110
+12142,9802,8822,-84.22,,9110
+12142,9802,8823,45.42,,9110
+12142,9802,8824,44.11,,9110
+12142,9802,8826,6000000.0,,9001
+12142,9802,8827,0.0,,9001
+12143,9802,8821,41.3,,9110
+12143,9802,8822,-84.22,,9110
+12143,9802,8823,43.4,,9110
+12143,9802,8824,42.06,,9110
+12143,9802,8826,4000000.0,,9001
+12143,9802,8827,0.0,,9001
+12201,9802,8821,46.3,,9110
+12201,9802,8822,-93.06,,9110
+12201,9802,8823,47.02,,9110
+12201,9802,8824,48.38,,9110
+12201,9802,8826,2000000.0,,9003
+12201,9802,8827,0.0,,9003
+12202,9802,8821,45.0,,9110
+12202,9802,8822,-94.15,,9110
+12202,9802,8823,45.37,,9110
+12202,9802,8824,47.03,,9110
+12202,9802,8826,2000000.0,,9003
+12202,9802,8827,0.0,,9003
+12203,9802,8821,43.0,,9110
+12203,9802,8822,-94.0,,9110
+12203,9802,8823,43.47,,9110
+12203,9802,8824,45.13,,9110
+12203,9802,8826,2000000.0,,9003
+12203,9802,8827,0.0,,9003
+12231,9802,8821,46.3,,9110
+12231,9802,8822,-93.06,,9110
+12231,9802,8823,48.38,,9110
+12231,9802,8824,47.02,,9110
+12231,9802,8826,800000.0,,9001
+12231,9802,8827,100000.0,,9001
+12232,9802,8821,45.0,,9110
+12232,9802,8822,-94.15,,9110
+12232,9802,8823,47.03,,9110
+12232,9802,8824,45.37,,9110
+12232,9802,8826,800000.0,,9001
+12232,9802,8827,100000.0,,9001
+12233,9802,8821,43.0,,9110
+12233,9802,8822,-94.0,,9110
+12233,9802,8823,45.13,,9110
+12233,9802,8824,43.47,,9110
+12233,9802,8826,800000.0,,9001
+12233,9802,8827,100000.0,,9001
+12301,9807,8801,29.4,,9110
+12301,9807,8802,-88.5,,9110
+12301,9807,8805,0.99996,,9201
+12301,9807,8806,500000.0,,9003
+12301,9807,8807,0.0,,9003
+12302,9807,8801,30.3,,9110
+12302,9807,8802,-90.2,,9110
+12302,9807,8805,0.999941177,,9201
+12302,9807,8806,500000.0,,9003
+12302,9807,8807,0.0,,9003
+12331,9807,8801,29.3,,9110
+12331,9807,8802,-88.5,,9110
+12331,9807,8805,0.99995,,9201
+12331,9807,8806,300000.0,,9001
+12331,9807,8807,0.0,,9001
+12332,9807,8801,29.3,,9110
+12332,9807,8802,-90.2,,9110
+12332,9807,8805,0.99995,,9201
+12332,9807,8806,700000.0,,9001
+12332,9807,8807,0.0,,9001
+12401,9807,8801,35.5,,9110
+12401,9807,8802,-90.3,,9110
+12401,9807,8805,0.999933333,,9201
+12401,9807,8806,500000.0,,9003
+12401,9807,8807,0.0,,9003
+12402,9807,8801,35.5,,9110
+12402,9807,8802,-92.3,,9110
+12402,9807,8805,0.999933333,,9201
+12402,9807,8806,500000.0,,9003
+12402,9807,8807,0.0,,9003
+12403,9807,8801,36.1,,9110
+12403,9807,8802,-94.3,,9110
+12403,9807,8805,0.999941177,,9201
+12403,9807,8806,500000.0,,9003
+12403,9807,8807,0.0,,9003
+12431,9807,8801,35.5,,9110
+12431,9807,8802,-90.3,,9110
+12431,9807,8805,0.999933333,,9201
+12431,9807,8806,250000.0,,9001
+12431,9807,8807,0.0,,9001
+12432,9807,8801,35.5,,9110
+12432,9807,8802,-92.3,,9110
+12432,9807,8805,0.999933333,,9201
+12432,9807,8806,500000.0,,9001
+12432,9807,8807,0.0,,9001
+12433,9807,8801,36.1,,9110
+12433,9807,8802,-94.3,,9110
+12433,9807,8805,0.999941177,,9201
+12433,9807,8806,850000.0,,9001
+12433,9807,8807,0.0,,9001
+12501,9802,8821,47.0,,9110
+12501,9802,8822,-109.3,,9110
+12501,9802,8823,48.43,,9110
+12501,9802,8824,47.51,,9110
+12501,9802,8826,2000000.0,,9003
+12501,9802,8827,0.0,,9003
+12502,9802,8821,45.5,,9110
+12502,9802,8822,-109.3,,9110
+12502,9802,8823,47.53,,9110
+12502,9802,8824,46.27,,9110
+12502,9802,8826,2000000.0,,9003
+12502,9802,8827,0.0,,9003
+12503,9802,8821,44.0,,9110
+12503,9802,8822,-109.3,,9110
+12503,9802,8823,46.24,,9110
+12503,9802,8824,44.52,,9110
+12503,9802,8826,2000000.0,,9003
+12503,9802,8827,0.0,,9003
+12530,9802,8821,44.15,,9110
+12530,9802,8822,-109.3,,9110
+12530,9802,8823,49.0,,9110
+12530,9802,8824,45.0,,9110
+12530,9802,8826,600000.0,,9001
+12530,9802,8827,0.0,,9001
+12601,9802,8821,41.2,,9110
+12601,9802,8822,-100.0,,9110
+12601,9802,8823,41.51,,9110
+12601,9802,8824,42.49,,9110
+12601,9802,8826,2000000.0,,9003
+12601,9802,8827,0.0,,9003
+12602,9802,8821,39.4,,9110
+12602,9802,8822,-99.3,,9110
+12602,9802,8823,40.17,,9110
+12602,9802,8824,41.43,,9110
+12602,9802,8826,2000000.0,,9003
+12602,9802,8827,0.0,,9003
+12630,9802,8821,39.5,,9110
+12630,9802,8822,-100.0,,9110
+12630,9802,8823,43.0,,9110
+12630,9802,8824,40.0,,9110
+12630,9802,8826,500000.0,,9001
+12630,9802,8827,0.0,,9001
+12701,9807,8801,34.45,,9110
+12701,9807,8802,-115.35,,9110
+12701,9807,8805,0.9999,,9201
+12701,9807,8806,500000.0,,9003
+12701,9807,8807,0.0,,9003
+12702,9807,8801,34.45,,9110
+12702,9807,8802,-116.4,,9110
+12702,9807,8805,0.9999,,9201
+12702,9807,8806,500000.0,,9003
+12702,9807,8807,0.0,,9003
+12703,9807,8801,34.45,,9110
+12703,9807,8802,-118.35,,9110
+12703,9807,8805,0.9999,,9201
+12703,9807,8806,500000.0,,9003
+12703,9807,8807,0.0,,9003
+12731,9807,8801,34.45,,9110
+12731,9807,8802,-115.35,,9110
+12731,9807,8805,0.9999,,9201
+12731,9807,8806,200000.0,,9001
+12731,9807,8807,8000000.0,,9001
+12732,9807,8801,34.45,,9110
+12732,9807,8802,-116.4,,9110
+12732,9807,8805,0.9999,,9201
+12732,9807,8806,500000.0,,9001
+12732,9807,8807,6000000.0,,9001
+12733,9807,8801,34.45,,9110
+12733,9807,8802,-118.35,,9110
+12733,9807,8805,0.9999,,9201
+12733,9807,8806,800000.0,,9001
+12733,9807,8807,4000000.0,,9001
+12800,9807,8801,42.3,,9110
+12800,9807,8802,-71.4,,9110
+12800,9807,8805,0.999966667,,9201
+12800,9807,8806,500000.0,,9003
+12800,9807,8807,0.0,,9003
+12830,9807,8801,42.3,,9110
+12830,9807,8802,-71.4,,9110
+12830,9807,8805,0.999966667,,9201
+12830,9807,8806,300000.0,,9001
+12830,9807,8807,0.0,,9001
+12900,9807,8801,38.5,,9110
+12900,9807,8802,-74.4,,9110
+12900,9807,8805,0.999975,,9201
+12900,9807,8806,2000000.0,,9003
+12900,9807,8807,0.0,,9003
+12930,9807,8801,38.5,,9110
+12930,9807,8802,-74.3,,9110
+12930,9807,8805,0.9999,,9201
+12930,9807,8806,150000.0,,9001
+12930,9807,8807,0.0,,9001
+13001,9807,8801,31.0,,9110
+13001,9807,8802,-104.2,,9110
+13001,9807,8805,0.999909091,,9201
+13001,9807,8806,500000.0,,9003
+13001,9807,8807,0.0,,9003
+13002,9807,8801,31.0,,9110
+13002,9807,8802,-106.15,,9110
+13002,9807,8805,0.9999,,9201
+13002,9807,8806,500000.0,,9003
+13002,9807,8807,0.0,,9003
+13003,9807,8801,31.0,,9110
+13003,9807,8802,-107.5,,9110
+13003,9807,8805,0.999916667,,9201
+13003,9807,8806,500000.0,,9003
+13003,9807,8807,0.0,,9003
+13031,9807,8801,31.0,,9110
+13031,9807,8802,-104.2,,9110
+13031,9807,8805,0.999909091,,9201
+13031,9807,8806,165000.0,,9001
+13031,9807,8807,0.0,,9001
+13032,9807,8801,31.0,,9110
+13032,9807,8802,-106.15,,9110
+13032,9807,8805,0.9999,,9201
+13032,9807,8806,500000.0,,9001
+13032,9807,8807,0.0,,9001
+13033,9807,8801,31.0,,9110
+13033,9807,8802,-107.5,,9110
+13033,9807,8805,0.999916667,,9201
+13033,9807,8806,830000.0,,9001
+13033,9807,8807,0.0,,9001
+13101,9807,8801,40.0,,9110
+13101,9807,8802,-74.2,,9110
+13101,9807,8805,0.999966667,,9201
+13101,9807,8806,500000.0,,9003
+13101,9807,8807,0.0,,9003
+13102,9807,8801,40.0,,9110
+13102,9807,8802,-76.35,,9110
+13102,9807,8805,0.9999375,,9201
+13102,9807,8806,500000.0,,9003
+13102,9807,8807,0.0,,9003
+13103,9807,8801,40.0,,9110
+13103,9807,8802,-78.35,,9110
+13103,9807,8805,0.9999375,,9201
+13103,9807,8806,500000.0,,9003
+13103,9807,8807,0.0,,9003
+13104,9802,8821,40.3,,9110
+13104,9802,8822,-74.0,,9110
+13104,9802,8823,41.02,,9110
+13104,9802,8824,40.4,,9110
+13104,9802,8826,1000000.0,,9003
+13104,9802,8827,0.0,,9003
+13131,9807,8801,38.5,,9110
+13131,9807,8802,-74.3,,9110
+13131,9807,8805,0.9999,,9201
+13131,9807,8806,150000.0,,9001
+13131,9807,8807,0.0,,9001
+13132,9807,8801,40.0,,9110
+13132,9807,8802,-76.35,,9110
+13132,9807,8805,0.9999375,,9201
+13132,9807,8806,250000.0,,9001
+13132,9807,8807,0.0,,9001
+13133,9807,8801,40.0,,9110
+13133,9807,8802,-78.35,,9110
+13133,9807,8805,0.9999375,,9201
+13133,9807,8806,350000.0,,9001
+13133,9807,8807,0.0,,9001
+13134,9802,8821,40.1,,9110
+13134,9802,8822,-74.0,,9110
+13134,9802,8823,41.02,,9110
+13134,9802,8824,40.4,,9110
+13134,9802,8826,300000.0,,9001
+13134,9802,8827,0.0,,9001
+13200,9802,8821,33.45,,9110
+13200,9802,8822,-79.0,,9110
+13200,9802,8823,34.2,,9110
+13200,9802,8824,36.1,,9110
+13200,9802,8826,2000000.0,,9003
+13200,9802,8827,0.0,,9003
+13230,9802,8821,33.45,,9110
+13230,9802,8822,-79.0,,9110
+13230,9802,8823,36.1,,9110
+13230,9802,8824,34.2,,9110
+13230,9802,8826,609601.22,,9001
+13230,9802,8827,0.0,,9001
+13301,9802,8821,47.0,,9110
+13301,9802,8822,-100.3,,9110
+13301,9802,8823,47.26,,9110
+13301,9802,8824,48.44,,9110
+13301,9802,8826,2000000.0,,9003
+13301,9802,8827,0.0,,9003
+13302,9802,8821,45.4,,9110
+13302,9802,8822,-100.3,,9110
+13302,9802,8823,46.11,,9110
+13302,9802,8824,47.29,,9110
+13302,9802,8826,2000000.0,,9003
+13302,9802,8827,0.0,,9003
+13331,9802,8821,47.0,,9110
+13331,9802,8822,-100.3,,9110
+13331,9802,8823,48.44,,9110
+13331,9802,8824,47.26,,9110
+13331,9802,8826,600000.0,,9001
+13331,9802,8827,0.0,,9001
+13332,9802,8821,45.4,,9110
+13332,9802,8822,-100.3,,9110
+13332,9802,8823,47.29,,9110
+13332,9802,8824,46.11,,9110
+13332,9802,8826,600000.0,,9001
+13332,9802,8827,0.0,,9001
+13401,9802,8821,39.4,,9110
+13401,9802,8822,-82.3,,9110
+13401,9802,8823,40.26,,9110
+13401,9802,8824,41.42,,9110
+13401,9802,8826,2000000.0,,9003
+13401,9802,8827,0.0,,9003
+13402,9802,8821,38.0,,9110
+13402,9802,8822,-82.3,,9110
+13402,9802,8823,38.44,,9110
+13402,9802,8824,40.02,,9110
+13402,9802,8826,2000000.0,,9003
+13402,9802,8827,0.0,,9003
+13431,9802,8821,39.4,,9110
+13431,9802,8822,-82.3,,9110
+13431,9802,8823,41.42,,9110
+13431,9802,8824,40.26,,9110
+13431,9802,8826,600000.0,,9001
+13431,9802,8827,0.0,,9001
+13432,9802,8821,38.0,,9110
+13432,9802,8822,-82.3,,9110
+13432,9802,8823,40.02,,9110
+13432,9802,8824,38.44,,9110
+13432,9802,8826,600000.0,,9001
+13432,9802,8827,0.0,,9001
+13501,9802,8821,35.0,,9110
+13501,9802,8822,-98.0,,9110
+13501,9802,8823,35.34,,9110
+13501,9802,8824,36.46,,9110
+13501,9802,8826,2000000.0,,9003
+13501,9802,8827,0.0,,9003
+13502,9802,8821,33.2,,9110
+13502,9802,8822,-98.0,,9110
+13502,9802,8823,33.56,,9110
+13502,9802,8824,35.14,,9110
+13502,9802,8826,2000000.0,,9003
+13502,9802,8827,0.0,,9003
+13531,9802,8821,35.0,,9110
+13531,9802,8822,-98.0,,9110
+13531,9802,8823,36.46,,9110
+13531,9802,8824,35.34,,9110
+13531,9802,8826,600000.0,,9001
+13531,9802,8827,0.0,,9001
+13532,9802,8821,33.2,,9110
+13532,9802,8822,-98.0,,9110
+13532,9802,8823,35.14,,9110
+13532,9802,8824,33.56,,9110
+13532,9802,8826,600000.0,,9001
+13532,9802,8827,0.0,,9001
+13601,9802,8821,43.4,,9110
+13601,9802,8822,-120.3,,9110
+13601,9802,8823,44.2,,9110
+13601,9802,8824,46.0,,9110
+13601,9802,8826,2000000.0,,9003
+13601,9802,8827,0.0,,9003
+13602,9802,8821,41.4,,9110
+13602,9802,8822,-120.3,,9110
+13602,9802,8823,42.2,,9110
+13602,9802,8824,44.0,,9110
+13602,9802,8826,2000000.0,,9003
+13602,9802,8827,0.0,,9003
+13631,9802,8821,43.4,,9110
+13631,9802,8822,-120.3,,9110
+13631,9802,8823,46.0,,9110
+13631,9802,8824,44.2,,9110
+13631,9802,8826,2500000.0,,9001
+13631,9802,8827,0.0,,9001
+13632,9802,8821,41.4,,9110
+13632,9802,8822,-120.3,,9110
+13632,9802,8823,44.0,,9110
+13632,9802,8824,42.2,,9110
+13632,9802,8826,1500000.0,,9001
+13632,9802,8827,0.0,,9001
+13701,9802,8821,40.1,,9110
+13701,9802,8822,-77.45,,9110
+13701,9802,8823,40.53,,9110
+13701,9802,8824,41.57,,9110
+13701,9802,8826,2000000.0,,9003
+13701,9802,8827,0.0,,9003
+13702,9802,8821,39.2,,9110
+13702,9802,8822,-77.45,,9110
+13702,9802,8823,39.56,,9110
+13702,9802,8824,40.48,,9110
+13702,9802,8826,2000000.0,,9003
+13702,9802,8827,0.0,,9003
+13731,9802,8821,40.1,,9110
+13731,9802,8822,-77.45,,9110
+13731,9802,8823,41.57,,9110
+13731,9802,8824,40.53,,9110
+13731,9802,8826,600000.0,,9001
+13731,9802,8827,0.0,,9001
+13732,9802,8821,39.2,,9110
+13732,9802,8822,-77.45,,9110
+13732,9802,8823,40.58,,9110
+13732,9802,8824,39.56,,9110
+13732,9802,8826,600000.0,,9001
+13732,9802,8827,0.0,,9001
+13800,9807,8801,41.05,,9110
+13800,9807,8802,-71.3,,9110
+13800,9807,8805,0.9999938,,9201
+13800,9807,8806,500000.0,,9003
+13800,9807,8807,0.0,,9003
+13830,9807,8801,41.05,,9110
+13830,9807,8802,-71.3,,9110
+13830,9807,8805,0.99999375,,9201
+13830,9807,8806,100000.0,,9001
+13830,9807,8807,0.0,,9001
+13901,9802,8821,33.0,,9110
+13901,9802,8822,-81.0,,9110
+13901,9802,8823,33.46,,9110
+13901,9802,8824,34.58,,9110
+13901,9802,8826,2000000.0,,9003
+13901,9802,8827,0.0,,9003
+13902,9802,8821,31.5,,9110
+13902,9802,8822,-81.0,,9110
+13902,9802,8823,32.2,,9110
+13902,9802,8824,33.4,,9110
+13902,9802,8826,2000000.0,,9003
+13902,9802,8827,0.0,,9003
+13930,9802,8821,31.5,,9110
+13930,9802,8822,-81.0,,9110
+13930,9802,8823,34.5,,9110
+13930,9802,8824,32.3,,9110
+13930,9802,8826,609600.0,,9001
+13930,9802,8827,0.0,,9001
+14001,9802,8821,43.5,,9110
+14001,9802,8822,-100.0,,9110
+14001,9802,8823,44.25,,9110
+14001,9802,8824,45.41,,9110
+14001,9802,8826,2000000.0,,9003
+14001,9802,8827,0.0,,9003
+14002,9802,8821,42.2,,9110
+14002,9802,8822,-100.2,,9110
+14002,9802,8823,42.5,,9110
+14002,9802,8824,44.24,,9110
+14002,9802,8826,2000000.0,,9003
+14002,9802,8827,0.0,,9003
+14031,9802,8821,43.5,,9110
+14031,9802,8822,-100.0,,9110
+14031,9802,8823,45.41,,9110
+14031,9802,8824,44.25,,9110
+14031,9802,8826,600000.0,,9001
+14031,9802,8827,0.0,,9001
+14032,9802,8821,42.2,,9110
+14032,9802,8822,-100.2,,9110
+14032,9802,8823,44.24,,9110
+14032,9802,8824,42.5,,9110
+14032,9802,8826,600000.0,,9001
+14032,9802,8827,0.0,,9001
+14100,9802,8821,34.4,,9110
+14100,9802,8822,-86.0,,9110
+14100,9802,8823,35.15,,9110
+14100,9802,8824,36.25,,9110
+14100,9802,8826,100000.0,,9003
+14100,9802,8827,0.0,,9003
+14130,9802,8821,34.2,,9110
+14130,9802,8822,-86.0,,9110
+14130,9802,8823,36.25,,9110
+14130,9802,8824,35.15,,9110
+14130,9802,8826,600000.0,,9001
+14130,9802,8827,0.0,,9001
+14201,9802,8821,34.0,,9110
+14201,9802,8822,-101.3,,9110
+14201,9802,8823,34.39,,9110
+14201,9802,8824,36.11,,9110
+14201,9802,8826,2000000.0,,9003
+14201,9802,8827,0.0,,9003
+14202,9802,8821,31.4,,9110
+14202,9802,8822,-97.3,,9110
+14202,9802,8823,32.08,,9110
+14202,9802,8824,33.58,,9110
+14202,9802,8826,2000000.0,,9003
+14202,9802,8827,0.0,,9003
+14203,9802,8821,29.4,,9110
+14203,9802,8822,-100.2,,9110
+14203,9802,8823,30.07,,9110
+14203,9802,8824,31.53,,9110
+14203,9802,8826,2000000.0,,9003
+14203,9802,8827,0.0,,9003
+14204,9802,8821,27.5,,9110
+14204,9802,8822,-99.0,,9110
+14204,9802,8823,28.23,,9110
+14204,9802,8824,30.17,,9110
+14204,9802,8826,2000000.0,,9003
+14204,9802,8827,0.0,,9003
+14205,9802,8821,25.4,,9110
+14205,9802,8822,-98.3,,9110
+14205,9802,8823,26.1,,9110
+14205,9802,8824,27.5,,9110
+14205,9802,8826,2000000.0,,9003
+14205,9802,8827,0.0,,9003
+14231,9802,8821,34.0,,9110
+14231,9802,8822,-101.3,,9110
+14231,9802,8823,36.11,,9110
+14231,9802,8824,34.39,,9110
+14231,9802,8826,200000.0,,9001
+14231,9802,8827,1000000.0,,9001
+14232,9802,8821,31.4,,9110
+14232,9802,8822,-98.3,,9110
+14232,9802,8823,33.58,,9110
+14232,9802,8824,32.08,,9110
+14232,9802,8826,600000.0,,9001
+14232,9802,8827,2000000.0,,9001
+14233,9802,8821,29.4,,9110
+14233,9802,8822,-100.2,,9110
+14233,9802,8823,31.53,,9110
+14233,9802,8824,30.07,,9110
+14233,9802,8826,700000.0,,9001
+14233,9802,8827,3000000.0,,9001
+14234,9802,8821,27.5,,9110
+14234,9802,8822,-99.0,,9110
+14234,9802,8823,30.17,,9110
+14234,9802,8824,28.23,,9110
+14234,9802,8826,600000.0,,9001
+14234,9802,8827,4000000.0,,9001
+14235,9802,8821,25.4,,9110
+14235,9802,8822,-98.3,,9110
+14235,9802,8823,27.5,,9110
+14235,9802,8824,26.1,,9110
+14235,9802,8826,300000.0,,9001
+14235,9802,8827,5000000.0,,9001
+14301,9802,8821,40.2,,9110
+14301,9802,8822,-111.3,,9110
+14301,9802,8823,40.43,,9110
+14301,9802,8824,41.47,,9110
+14301,9802,8826,2000000.0,,9003
+14301,9802,8827,0.0,,9003
+14302,9802,8821,38.2,,9110
+14302,9802,8822,-111.3,,9110
+14302,9802,8823,39.01,,9110
+14302,9802,8824,40.39,,9110
+14302,9802,8826,2000000.0,,9003
+14302,9802,8827,0.0,,9003
+14303,9802,8821,36.4,,9110
+14303,9802,8822,-111.3,,9110
+14303,9802,8823,37.13,,9110
+14303,9802,8824,38.21,,9110
+14303,9802,8826,2000000.0,,9003
+14303,9802,8827,0.0,,9003
+14331,9802,8821,40.2,,9110
+14331,9802,8822,-111.3,,9110
+14331,9802,8823,41.47,,9110
+14331,9802,8824,40.43,,9110
+14331,9802,8826,500000.0,,9001
+14331,9802,8827,1000000.0,,9001
+14332,9802,8821,38.2,,9110
+14332,9802,8822,-111.3,,9110
+14332,9802,8823,40.39,,9110
+14332,9802,8824,39.01,,9110
+14332,9802,8826,500000.0,,9001
+14332,9802,8827,2000000.0,,9001
+14333,9802,8821,36.4,,9110
+14333,9802,8822,-111.3,,9110
+14333,9802,8823,38.21,,9110
+14333,9802,8824,37.13,,9110
+14333,9802,8826,500000.0,,9001
+14333,9802,8827,3000000.0,,9001
+14400,9807,8801,42.3,,9110
+14400,9807,8802,-72.3,,9110
+14400,9807,8805,0.999964286,,9201
+14400,9807,8806,500000.0,,9003
+14400,9807,8807,0.0,,9003
+14430,9807,8801,42.3,,9110
+14430,9807,8802,-72.3,,9110
+14430,9807,8805,0.999964286,,9201
+14430,9807,8806,500000.0,,9001
+14430,9807,8807,0.0,,9001
+14501,9802,8821,37.4,,9110
+14501,9802,8822,-78.3,,9110
+14501,9802,8823,38.02,,9110
+14501,9802,8824,39.12,,9110
+14501,9802,8826,2000000.0,,9003
+14501,9802,8827,0.0,,9003
+14502,9802,8821,36.2,,9110
+14502,9802,8822,-78.3,,9110
+14502,9802,8823,36.46,,9110
+14502,9802,8824,37.58,,9110
+14502,9802,8826,2000000.0,,9003
+14502,9802,8827,0.0,,9003
+14531,9802,8821,37.4,,9110
+14531,9802,8822,-78.3,,9110
+14531,9802,8823,39.12,,9110
+14531,9802,8824,38.02,,9110
+14531,9802,8826,3500000.0,,9001
+14531,9802,8827,2000000.0,,9001
+14532,9802,8821,36.2,,9110
+14532,9802,8822,-78.3,,9110
+14532,9802,8823,37.58,,9110
+14532,9802,8824,36.46,,9110
+14532,9802,8826,3500000.0,,9001
+14532,9802,8827,1000000.0,,9001
+14601,9802,8821,47.0,,9110
+14601,9802,8822,-120.5,,9110
+14601,9802,8823,47.3,,9110
+14601,9802,8824,48.44,,9110
+14601,9802,8826,2000000.0,,9003
+14601,9802,8827,0.0,,9003
+14602,9802,8821,45.2,,9110
+14602,9802,8822,-120.3,,9110
+14602,9802,8823,45.5,,9110
+14602,9802,8824,47.2,,9110
+14602,9802,8826,2000000.0,,9003
+14602,9802,8827,0.0,,9003
+14631,9802,8821,47.0,,9110
+14631,9802,8822,-120.5,,9110
+14631,9802,8823,48.44,,9110
+14631,9802,8824,47.3,,9110
+14631,9802,8826,500000.0,,9001
+14631,9802,8827,0.0,,9001
+14632,9802,8821,45.2,,9110
+14632,9802,8822,-120.3,,9110
+14632,9802,8823,47.2,,9110
+14632,9802,8824,45.5,,9110
+14632,9802,8826,500000.0,,9001
+14632,9802,8827,0.0,,9001
+14701,9802,8821,38.3,,9110
+14701,9802,8822,-79.3,,9110
+14701,9802,8823,39.0,,9110
+14701,9802,8824,40.15,,9110
+14701,9802,8826,2000000.0,,9003
+14701,9802,8827,0.0,,9003
+14702,9802,8821,37.0,,9110
+14702,9802,8822,-81.0,,9110
+14702,9802,8823,37.29,,9110
+14702,9802,8824,38.53,,9110
+14702,9802,8826,2000000.0,,9003
+14702,9802,8827,0.0,,9003
+14731,9802,8821,38.3,,9110
+14731,9802,8822,-79.3,,9110
+14731,9802,8823,40.15,,9110
+14731,9802,8824,39.0,,9110
+14731,9802,8826,600000.0,,9001
+14731,9802,8827,0.0,,9001
+14732,9802,8821,37.0,,9110
+14732,9802,8822,-81.0,,9110
+14732,9802,8823,38.53,,9110
+14732,9802,8824,37.29,,9110
+14732,9802,8826,600000.0,,9001
+14732,9802,8827,0.0,,9001
+14801,9802,8821,45.1,,9110
+14801,9802,8822,-90.0,,9110
+14801,9802,8823,45.34,,9110
+14801,9802,8824,46.46,,9110
+14801,9802,8826,2000000.0,,9003
+14801,9802,8827,0.0,,9003
+14802,9802,8821,43.5,,9110
+14802,9802,8822,-90.0,,9110
+14802,9802,8823,44.15,,9110
+14802,9802,8824,45.3,,9110
+14802,9802,8826,2000000.0,,9003
+14802,9802,8827,0.0,,9003
+14803,9802,8821,42.0,,9110
+14803,9802,8822,-90.0,,9110
+14803,9802,8823,42.44,,9110
+14803,9802,8824,44.04,,9110
+14803,9802,8826,2000000.0,,9003
+14803,9802,8827,0.0,,9003
+14831,9802,8821,45.1,,9110
+14831,9802,8822,-90.0,,9110
+14831,9802,8823,46.46,,9110
+14831,9802,8824,45.34,,9110
+14831,9802,8826,600000.0,,9001
+14831,9802,8827,0.0,,9001
+14832,9802,8821,43.5,,9110
+14832,9802,8822,-90.0,,9110
+14832,9802,8823,45.3,,9110
+14832,9802,8824,44.15,,9110
+14832,9802,8826,600000.0,,9001
+14832,9802,8827,0.0,,9001
+14833,9802,8821,42.0,,9110
+14833,9802,8822,-90.0,,9110
+14833,9802,8823,44.04,,9110
+14833,9802,8824,42.44,,9110
+14833,9802,8826,600000.0,,9001
+14833,9802,8827,0.0,,9001
+14901,9807,8801,40.4,,9110
+14901,9807,8802,-105.1,,9110
+14901,9807,8805,0.999941177,,9201
+14901,9807,8806,500000.0,,9003
+14901,9807,8807,0.0,,9003
+14902,9807,8801,40.4,,9110
+14902,9807,8802,-107.2,,9110
+14902,9807,8805,0.999941177,,9201
+14902,9807,8806,500000.0,,9003
+14902,9807,8807,0.0,,9003
+14903,9807,8801,40.4,,9110
+14903,9807,8802,-108.45,,9110
+14903,9807,8805,0.999941177,,9201
+14903,9807,8806,500000.0,,9003
+14903,9807,8807,0.0,,9003
+14904,9807,8801,40.4,,9110
+14904,9807,8802,-110.05,,9110
+14904,9807,8805,0.999941177,,9201
+14904,9807,8806,500000.0,,9003
+14904,9807,8807,0.0,,9003
+14931,9807,8801,40.3,,9110
+14931,9807,8802,-105.1,,9110
+14931,9807,8805,0.9999375,,9201
+14931,9807,8806,200000.0,,9001
+14931,9807,8807,0.0,,9001
+14932,9807,8801,40.3,,9110
+14932,9807,8802,-107.2,,9110
+14932,9807,8805,0.9999375,,9201
+14932,9807,8806,400000.0,,9001
+14932,9807,8807,100000.0,,9001
+14933,9807,8801,40.3,,9110
+14933,9807,8802,-108.45,,9110
+14933,9807,8805,0.9999375,,9201
+14933,9807,8806,600000.0,,9001
+14933,9807,8807,0.0,,9001
+14934,9807,8801,40.3,,9110
+14934,9807,8802,-110.05,,9110
+14934,9807,8805,0.9999375,,9201
+14934,9807,8806,800000.0,,9001
+14934,9807,8807,100000.0,,9001
+15001,9812,8806,16404166.67,,9003
+15001,9812,8807,-16404166.67,,9003
+15001,9812,8811,57.0,,9110
+15001,9812,8812,-133.4,,9110
+15001,9812,8813,323.07483685,,9110
+15001,9812,8814,323.07483685,,9110
+15001,9812,8815,0.9999,,9201
+15002,9807,8801,54.0,,9102
+15002,9807,8802,-142.0,,9102
+15002,9807,8805,0.9999,,9201
+15002,9807,8806,500000.0,,9003
+15002,9807,8807,0.0,,9003
+15003,9807,8801,54.0,,9102
+15003,9807,8802,-146.0,,9102
+15003,9807,8805,0.9999,,9201
+15003,9807,8806,500000.0,,9003
+15003,9807,8807,0.0,,9003
+15004,9807,8801,54.0,,9102
+15004,9807,8802,-150.0,,9102
+15004,9807,8805,0.9999,,9201
+15004,9807,8806,500000.0,,9003
+15004,9807,8807,0.0,,9003
+15005,9807,8801,54.0,,9102
+15005,9807,8802,-154.0,,9102
+15005,9807,8805,0.9999,,9201
+15005,9807,8806,500000.0,,9003
+15005,9807,8807,0.0,,9003
+15006,9807,8801,54.0,,9102
+15006,9807,8802,-158.0,,9102
+15006,9807,8805,0.9999,,9201
+15006,9807,8806,500000.0,,9003
+15006,9807,8807,0.0,,9003
+15007,9807,8801,54.0,,9102
+15007,9807,8802,-162.0,,9102
+15007,9807,8805,0.9999,,9201
+15007,9807,8806,700000.0,,9003
+15007,9807,8807,0.0,,9003
+15008,9807,8801,54.0,,9102
+15008,9807,8802,-166.0,,9102
+15008,9807,8805,0.9999,,9201
+15008,9807,8806,500000.0,,9003
+15008,9807,8807,0.0,,9003
+15009,9807,8801,54.0,,9102
+15009,9807,8802,-170.0,,9102
+15009,9807,8805,0.9999,,9201
+15009,9807,8806,600000.0,,9003
+15009,9807,8807,0.0,,9003
+15010,9802,8821,51.0,,9110
+15010,9802,8822,-176.0,,9110
+15010,9802,8823,53.5,,9110
+15010,9802,8824,51.5,,9110
+15010,9802,8826,3000000.0,,9003
+15010,9802,8827,0.0,,9003
+15031,9812,8806,5000000.0,,9001
+15031,9812,8807,-5000000.0,,9001
+15031,9812,8811,57.0,,9110
+15031,9812,8812,-133.4,,9110
+15031,9812,8813,323.07483685,,9110
+15031,9812,8814,323.07483685,,9110
+15031,9812,8815,0.9999,,9201
+15032,9807,8801,54.0,,9102
+15032,9807,8802,-142.0,,9102
+15032,9807,8805,0.9999,,9201
+15032,9807,8806,500000.0,,9001
+15032,9807,8807,0.0,,9001
+15033,9807,8801,54.0,,9102
+15033,9807,8802,-146.0,,9102
+15033,9807,8805,0.9999,,9201
+15033,9807,8806,500000.0,,9001
+15033,9807,8807,0.0,,9001
+15034,9807,8801,54.0,,9102
+15034,9807,8802,-150.0,,9102
+15034,9807,8805,0.9999,,9201
+15034,9807,8806,500000.0,,9001
+15034,9807,8807,0.0,,9001
+15035,9807,8801,54.0,,9102
+15035,9807,8802,-154.0,,9102
+15035,9807,8805,0.9999,,9201
+15035,9807,8806,500000.0,,9001
+15035,9807,8807,0.0,,9001
+15036,9807,8801,54.0,,9102
+15036,9807,8802,-158.0,,9102
+15036,9807,8805,0.9999,,9201
+15036,9807,8806,500000.0,,9001
+15036,9807,8807,0.0,,9001
+15037,9807,8801,54.0,,9102
+15037,9807,8802,-162.0,,9102
+15037,9807,8805,0.9999,,9201
+15037,9807,8806,500000.0,,9001
+15037,9807,8807,0.0,,9001
+15038,9807,8801,54.0,,9102
+15038,9807,8802,-166.0,,9102
+15038,9807,8805,0.9999,,9201
+15038,9807,8806,500000.0,,9001
+15038,9807,8807,0.0,,9001
+15039,9807,8801,54.0,,9102
+15039,9807,8802,-170.0,,9102
+15039,9807,8805,0.9999,,9201
+15039,9807,8806,500000.0,,9001
+15039,9807,8807,0.0,,9001
+15040,9802,8821,51.0,,9110
+15040,9802,8822,-176.0,,9110
+15040,9802,8823,53.5,,9110
+15040,9802,8824,51.5,,9110
+15040,9802,8826,1000000.0,,9001
+15040,9802,8827,0.0,,9001
+15101,9807,8801,18.5,,9110
+15101,9807,8802,-155.3,,9110
+15101,9807,8805,0.999966667,,9201
+15101,9807,8806,500000.0,,9003
+15101,9807,8807,0.0,,9003
+15102,9807,8801,20.2,,9110
+15102,9807,8802,-156.4,,9110
+15102,9807,8805,0.999966667,,9201
+15102,9807,8806,500000.0,,9003
+15102,9807,8807,0.0,,9003
+15103,9807,8801,21.1,,9110
+15103,9807,8802,-158.0,,9110
+15103,9807,8805,0.99999,,9201
+15103,9807,8806,500000.0,,9003
+15103,9807,8807,0.0,,9003
+15104,9807,8801,21.5,,9110
+15104,9807,8802,-159.3,,9110
+15104,9807,8805,0.99999,,9201
+15104,9807,8806,500000.0,,9003
+15104,9807,8807,0.0,,9003
+15105,9807,8801,21.4,,9110
+15105,9807,8802,-160.1,,9110
+15105,9807,8805,1.0,,9201
+15105,9807,8806,500000.0,,9003
+15105,9807,8807,0.0,,9003
+15131,9807,8801,18.5,,9110
+15131,9807,8802,-155.3,,9110
+15131,9807,8805,0.999966667,,9201
+15131,9807,8806,500000.0,,9001
+15131,9807,8807,0.0,,9001
+15132,9807,8801,20.2,,9110
+15132,9807,8802,-156.4,,9110
+15132,9807,8805,0.999966667,,9201
+15132,9807,8806,500000.0,,9001
+15132,9807,8807,0.0,,9001
+15133,9807,8801,21.1,,9110
+15133,9807,8802,-158.0,,9110
+15133,9807,8805,0.99999,,9201
+15133,9807,8806,500000.0,,9001
+15133,9807,8807,0.0,,9001
+15134,9807,8801,21.5,,9110
+15134,9807,8802,-159.3,,9110
+15134,9807,8805,0.99999,,9201
+15134,9807,8806,500000.0,,9001
+15134,9807,8807,0.0,,9001
+15135,9807,8801,21.4,,9110
+15135,9807,8802,-160.1,,9110
+15135,9807,8805,1.0,,9201
+15135,9807,8806,500000.0,,9001
+15135,9807,8807,0.0,,9001
+15201,9802,8821,17.5,,9110
+15201,9802,8822,-66.26,,9110
+15201,9802,8823,18.26,,9110
+15201,9802,8824,18.02,,9110
+15201,9802,8826,500000.0,,9003
+15201,9802,8827,0.0,,9003
+15202,9802,8821,17.5,,9110
+15202,9802,8822,-66.26,,9110
+15202,9802,8823,18.26,,9110
+15202,9802,8824,18.02,,9110
+15202,9802,8826,500000.0,,9003
+15202,9802,8827,100000.0,,9003
+15230,9802,8821,17.5,,9110
+15230,9802,8822,-66.26,,9110
+15230,9802,8823,18.26,,9110
+15230,9802,8824,18.02,,9110
+15230,9802,8826,200000.0,,9001
+15230,9802,8827,200000.0,,9001
+15300,9801,8801,-14.16,,9110
+15300,9801,8802,170.0,,9110
+15300,9801,8805,1.0,,9201
+15300,9801,8806,500000.0,,9003
+15300,9801,8807,0.0,,9003
+15301,9801,8801,-14.16,,9110
+15301,9801,8802,-170.0,,9110
+15301,9801,8805,1.0,,9201
+15301,9801,8806,500000.0,,9003
+15301,9801,8807,0.0,,9003
+15302,9802,8821,34.4,,9110
+15302,9802,8822,-86.0,,9110
+15302,9802,8823,35.15,,9110
+15302,9802,8824,36.25,,9110
+15302,9802,8826,2000000.0,,9003
+15302,9802,8827,100000.0,,9003
+15303,9802,8821,37.3,,9110
+15303,9802,8822,-84.15,,9110
+15303,9802,8823,37.58,,9110
+15303,9802,8824,38.58,,9110
+15303,9802,8826,500000.0,,9001
+15303,9802,8827,0.0,,9001
+15304,9807,8801,31.0,,9110
+15304,9807,8802,-110.1,,9110
+15304,9807,8805,0.9999,,9201
+15304,9807,8806,700000.0,,9002
+15304,9807,8807,0.0,,9002
+15305,9807,8801,31.0,,9110
+15305,9807,8802,-111.55,,9110
+15305,9807,8805,0.9999,,9201
+15305,9807,8806,700000.0,,9002
+15305,9807,8807,0.0,,9002
+15306,9807,8801,31.0,,9110
+15306,9807,8802,-113.45,,9110
+15306,9807,8805,0.999933333,,9201
+15306,9807,8806,700000.0,,9002
+15306,9807,8807,0.0,,9002
+15307,9802,8821,39.2,,9110
+15307,9802,8822,-122.0,,9110
+15307,9802,8823,41.4,,9110
+15307,9802,8824,40.0,,9110
+15307,9802,8826,6561666.667,,9003
+15307,9802,8827,1640416.667,,9003
+15308,9802,8821,37.4,,9110
+15308,9802,8822,-122.0,,9110
+15308,9802,8823,39.5,,9110
+15308,9802,8824,38.2,,9110
+15308,9802,8826,6561666.667,,9003
+15308,9802,8827,1640416.667,,9003
+15309,9802,8821,36.3,,9110
+15309,9802,8822,-120.3,,9110
+15309,9802,8823,38.26,,9110
+15309,9802,8824,37.04,,9110
+15309,9802,8826,6561666.667,,9003
+15309,9802,8827,1640416.667,,9003
+15310,9802,8821,35.2,,9110
+15310,9802,8822,-119.0,,9110
+15310,9802,8823,37.15,,9110
+15310,9802,8824,36.0,,9110
+15310,9802,8826,6561666.667,,9003
+15310,9802,8827,1640416.667,,9003
+15311,9802,8821,33.3,,9110
+15311,9802,8822,-118.0,,9110
+15311,9802,8823,35.28,,9110
+15311,9802,8824,34.02,,9110
+15311,9802,8826,6561666.667,,9003
+15311,9802,8827,1640416.667,,9003
+15312,9802,8821,32.1,,9110
+15312,9802,8822,-116.15,,9110
+15312,9802,8823,33.53,,9110
+15312,9802,8824,32.47,,9110
+15312,9802,8826,6561666.667,,9003
+15312,9802,8827,1640416.667,,9003
+15313,9802,8821,39.2,,9110
+15313,9802,8822,-105.3,,9110
+15313,9802,8823,40.47,,9110
+15313,9802,8824,39.43,,9110
+15313,9802,8826,3000000.0,,9003
+15313,9802,8827,1000000.0,,9003
+15314,9802,8821,37.5,,9110
+15314,9802,8822,-105.3,,9110
+15314,9802,8823,39.45,,9110
+15314,9802,8824,38.27,,9110
+15314,9802,8826,3000000.0,,9003
+15314,9802,8827,1000000.0,,9003
+15315,9802,8821,36.4,,9110
+15315,9802,8822,-105.3,,9110
+15315,9802,8823,38.26,,9110
+15315,9802,8824,37.14,,9110
+15315,9802,8826,3000000.0,,9003
+15315,9802,8827,1000000.0,,9003
+15316,9802,8821,40.5,,9110
+15316,9802,8822,-72.45,,9110
+15316,9802,8823,41.52,,9110
+15316,9802,8824,41.12,,9110
+15316,9802,8826,1000000.0,,9003
+15316,9802,8827,500000.0,,9003
+15317,9807,8801,38.0,,9110
+15317,9807,8802,-75.25,,9110
+15317,9807,8805,0.999995,,9201
+15317,9807,8806,656166.667,,9003
+15317,9807,8807,0.0,,9003
+15318,9807,8801,24.2,,9110
+15318,9807,8802,-81.0,,9110
+15318,9807,8805,0.999941177,,9201
+15318,9807,8806,656166.667,,9003
+15318,9807,8807,0.0,,9003
+15319,9807,8801,24.2,,9110
+15319,9807,8802,-82.0,,9110
+15319,9807,8805,0.999941177,,9201
+15319,9807,8806,656166.667,,9003
+15319,9807,8807,0.0,,9003
+15320,9802,8821,29.0,,9110
+15320,9802,8822,-84.3,,9110
+15320,9802,8823,30.45,,9110
+15320,9802,8824,29.35,,9110
+15320,9802,8826,1968500.0,,9003
+15320,9802,8827,0.0,,9003
+15321,9807,8801,30.0,,9110
+15321,9807,8802,-82.1,,9110
+15321,9807,8805,0.9999,,9201
+15321,9807,8806,656166.667,,9003
+15321,9807,8807,0.0,,9003
+15322,9807,8801,30.0,,9110
+15322,9807,8802,-84.1,,9110
+15322,9807,8805,0.9999,,9201
+15322,9807,8806,2296583.333,,9003
+15322,9807,8807,0.0,,9003
+15323,9807,8801,41.4,,9110
+15323,9807,8802,-112.1,,9110
+15323,9807,8805,0.999947368,,9201
+15323,9807,8806,656166.667,,9003
+15323,9807,8807,0.0,,9003
+15324,9807,8801,41.4,,9110
+15324,9807,8802,-114.0,,9110
+15324,9807,8805,0.999947368,,9201
+15324,9807,8806,1640416.667,,9003
+15324,9807,8807,0.0,,9003
+15325,9807,8801,41.4,,9110
+15325,9807,8802,-115.45,,9110
+15325,9807,8805,0.999933333,,9201
+15325,9807,8806,2624666.667,,9003
+15325,9807,8807,0.0,,9003
+15326,9807,8801,37.3,,9110
+15326,9807,8802,-85.4,,9110
+15326,9807,8805,0.999966667,,9201
+15326,9807,8806,328083.333,,9003
+15326,9807,8807,818125.0,,9003
+15327,9807,8801,37.3,,9110
+15327,9807,8802,-87.05,,9110
+15327,9807,8805,0.999966667,,9201
+15327,9807,8806,2952750.0,,9003
+15327,9807,8807,818125.0,,9003
+15328,9802,8821,37.3,,9110
+15328,9802,8822,-84.15,,9110
+15328,9802,8823,37.58,,9110
+15328,9802,8824,38.58,,9110
+15328,9802,8826,1640416.667,,9003
+15328,9802,8827,0.0,,9003
+15329,9802,8821,36.2,,9110
+15329,9802,8822,-85.45,,9110
+15329,9802,8823,37.56,,9110
+15329,9802,8824,36.44,,9110
+15329,9802,8826,1640416.667,,9003
+15329,9802,8827,1640416.667,,9003
+15330,9802,8821,37.4,,9110
+15330,9802,8822,-77.0,,9110
+15330,9802,8823,39.27,,9110
+15330,9802,8824,38.18,,9110
+15330,9802,8826,1312333.333,,9003
+15330,9802,8827,0.0,,9003
+15331,9802,8821,41.0,,9110
+15331,9802,8822,-71.3,,9110
+15331,9802,8823,42.41,,9110
+15331,9802,8824,41.43,,9110
+15331,9802,8826,656166.667,,9003
+15331,9802,8827,2460625.0,,9003
+15332,9802,8821,41.0,,9110
+15332,9802,8822,-70.3,,9110
+15332,9802,8823,41.29,,9110
+15332,9802,8824,41.17,,9110
+15332,9802,8826,1640416.667,,9003
+15332,9802,8827,0.0,,9003
+15333,9802,8821,44.47,,9110
+15333,9802,8822,-87.0,,9110
+15333,9802,8823,47.05,,9110
+15333,9802,8824,45.29,,9110
+15333,9802,8826,26246719.16,,9002
+15333,9802,8827,0.0,,9002
+15334,9802,8821,43.19,,9110
+15334,9802,8822,-84.22,,9110
+15334,9802,8823,45.42,,9110
+15334,9802,8824,44.11,,9110
+15334,9802,8826,19685039.37,,9002
+15334,9802,8827,0.0,,9002
+15335,9802,8821,41.3,,9110
+15335,9802,8822,-84.22,,9110
+15335,9802,8823,43.4,,9110
+15335,9802,8824,42.06,,9110
+15335,9802,8826,13123359.58,,9002
+15335,9802,8827,0.0,,9002
+15336,9807,8801,29.3,,9110
+15336,9807,8802,-88.5,,9110
+15336,9807,8805,0.99995,,9201
+15336,9807,8806,984250.0,,9003
+15336,9807,8807,0.0,,9003
+15337,9807,8801,29.3,,9110
+15337,9807,8802,-90.2,,9110
+15337,9807,8805,0.99995,,9201
+15337,9807,8806,2296583.333,,9003
+15337,9807,8807,0.0,,9003
+15338,9802,8821,44.15,,9110
+15338,9802,8822,-109.3,,9110
+15338,9802,8823,49.0,,9110
+15338,9802,8824,45.0,,9110
+15338,9802,8826,1968503.937,,9002
+15338,9802,8827,0.0,,9002
+15339,9807,8801,31.0,,9110
+15339,9807,8802,-104.2,,9110
+15339,9807,8805,0.999909091,,9201
+15339,9807,8806,541337.5,,9003
+15339,9807,8807,0.0,,9003
+15340,9807,8801,31.0,,9110
+15340,9807,8802,-106.15,,9110
+15340,9807,8805,0.9999,,9201
+15340,9807,8806,1640416.667,,9003
+15340,9807,8807,0.0,,9003
+15341,9807,8801,31.0,,9110
+15341,9807,8802,-107.5,,9110
+15341,9807,8805,0.999916667,,9201
+15341,9807,8806,2723091.667,,9003
+15341,9807,8807,0.0,,9003
+15342,9807,8801,38.5,,9110
+15342,9807,8802,-74.3,,9110
+15342,9807,8805,0.9999,,9201
+15342,9807,8806,492125.0,,9003
+15342,9807,8807,0.0,,9003
+15343,9807,8801,40.0,,9110
+15343,9807,8802,-76.35,,9110
+15343,9807,8805,0.9999375,,9201
+15343,9807,8806,820208.333,,9003
+15343,9807,8807,0.0,,9003
+15344,9807,8801,40.0,,9110
+15344,9807,8802,-78.35,,9110
+15344,9807,8805,0.9999375,,9201
+15344,9807,8806,1148291.667,,9003
+15344,9807,8807,0.0,,9003
+15345,9802,8821,40.1,,9110
+15345,9802,8822,-74.0,,9110
+15345,9802,8823,41.02,,9110
+15345,9802,8824,40.4,,9110
+15345,9802,8826,984250.0,,9003
+15345,9802,8827,0.0,,9003
+15346,9802,8821,33.45,,9110
+15346,9802,8822,-79.0,,9110
+15346,9802,8823,36.1,,9110
+15346,9802,8824,34.2,,9110
+15346,9802,8826,2000000.0,,9003
+15346,9802,8827,0.0,,9003
+15347,9802,8821,47.0,,9110
+15347,9802,8822,-100.3,,9110
+15347,9802,8823,48.44,,9110
+15347,9802,8824,47.26,,9110
+15347,9802,8826,1968503.937,,9002
+15347,9802,8827,0.0,,9002
+15348,9802,8821,45.4,,9110
+15348,9802,8822,-100.3,,9110
+15348,9802,8823,47.29,,9110
+15348,9802,8824,46.11,,9110
+15348,9802,8826,1968503.937,,9002
+15348,9802,8827,0.0,,9002
+15349,9802,8821,35.0,,9110
+15349,9802,8822,-98.0,,9110
+15349,9802,8823,36.46,,9110
+15349,9802,8824,35.34,,9110
+15349,9802,8826,1968500.0,,9003
+15349,9802,8827,0.0,,9003
+15350,9802,8821,33.2,,9110
+15350,9802,8822,-98.0,,9110
+15350,9802,8823,35.14,,9110
+15350,9802,8824,33.56,,9110
+15350,9802,8826,1968500.0,,9003
+15350,9802,8827,0.0,,9003
+15351,9802,8821,43.4,,9110
+15351,9802,8822,-120.3,,9110
+15351,9802,8823,46.0,,9110
+15351,9802,8824,44.2,,9110
+15351,9802,8826,8202099.738,,9002
+15351,9802,8827,0.0,,9002
+15352,9802,8821,41.4,,9110
+15352,9802,8822,-120.3,,9110
+15352,9802,8823,44.0,,9110
+15352,9802,8824,42.2,,9110
+15352,9802,8826,4921259.843,,9002
+15352,9802,8827,0.0,,9002
+15353,9802,8821,40.1,,9110
+15353,9802,8822,-77.45,,9110
+15353,9802,8823,41.57,,9110
+15353,9802,8824,40.53,,9110
+15353,9802,8826,1968500.0,,9003
+15353,9802,8827,0.0,,9003
+15354,9802,8821,39.2,,9110
+15354,9802,8822,-77.45,,9110
+15354,9802,8823,40.58,,9110
+15354,9802,8824,39.56,,9110
+15354,9802,8826,1968500.0,,9003
+15354,9802,8827,0.0,,9003
+15355,9802,8821,31.5,,9110
+15355,9802,8822,-81.0,,9110
+15355,9802,8823,34.5,,9110
+15355,9802,8824,32.3,,9110
+15355,9802,8826,2000000.0,,9002
+15355,9802,8827,0.0,,9002
+15356,9802,8821,34.2,,9110
+15356,9802,8822,-86.0,,9110
+15356,9802,8823,36.25,,9110
+15356,9802,8824,35.15,,9110
+15356,9802,8826,1968500.0,,9003
+15356,9802,8827,0.0,,9003
+15357,9802,8821,34.0,,9110
+15357,9802,8822,-101.3,,9110
+15357,9802,8823,36.11,,9110
+15357,9802,8824,34.39,,9110
+15357,9802,8826,656166.667,,9003
+15357,9802,8827,3280833.333,,9003
+15358,9802,8821,31.4,,9110
+15358,9802,8822,-98.3,,9110
+15358,9802,8823,33.58,,9110
+15358,9802,8824,32.08,,9110
+15358,9802,8826,1968500.0,,9003
+15358,9802,8827,6561666.667,,9003
+15359,9802,8821,29.4,,9110
+15359,9802,8822,-100.2,,9110
+15359,9802,8823,31.53,,9110
+15359,9802,8824,30.07,,9110
+15359,9802,8826,2296583.333,,9003
+15359,9802,8827,9842500.0,,9003
+15360,9802,8821,27.5,,9110
+15360,9802,8822,-99.0,,9110
+15360,9802,8823,30.17,,9110
+15360,9802,8824,28.23,,9110
+15360,9802,8826,1968500.0,,9003
+15360,9802,8827,13123333.333,,9003
+15361,9802,8821,25.4,,9110
+15361,9802,8822,-98.3,,9110
+15361,9802,8823,27.5,,9110
+15361,9802,8824,26.1,,9110
+15361,9802,8826,984250.0,,9003
+15361,9802,8827,16404166.667,,9003
+15362,9802,8821,40.2,,9110
+15362,9802,8822,-111.3,,9110
+15362,9802,8823,41.47,,9110
+15362,9802,8824,40.43,,9110
+15362,9802,8826,1640419.948,,9002
+15362,9802,8827,3280839.895,,9002
+15363,9802,8821,38.2,,9110
+15363,9802,8822,-111.3,,9110
+15363,9802,8823,40.39,,9110
+15363,9802,8824,39.01,,9110
+15363,9802,8826,1640419.948,,9002
+15363,9802,8827,6561679.79,,9002
+15364,9802,8821,36.4,,9110
+15364,9802,8822,-111.3,,9110
+15364,9802,8823,38.21,,9110
+15364,9802,8824,37.13,,9110
+15364,9802,8826,1640419.948,,9002
+15364,9802,8827,9842519.685,,9002
+15365,9802,8821,37.4,,9110
+15365,9802,8822,-78.3,,9110
+15365,9802,8823,39.12,,9110
+15365,9802,8824,38.02,,9110
+15365,9802,8826,11482916.667,,9003
+15365,9802,8827,6561666.667,,9003
+15366,9802,8821,36.2,,9110
+15366,9802,8822,-78.3,,9110
+15366,9802,8823,37.58,,9110
+15366,9802,8824,36.46,,9110
+15366,9802,8826,11482916.667,,9003
+15366,9802,8827,3280833.333,,9003
+15367,9802,8821,47.0,,9110
+15367,9802,8822,-120.5,,9110
+15367,9802,8823,48.44,,9110
+15367,9802,8824,47.3,,9110
+15367,9802,8826,1640416.667,,9003
+15367,9802,8827,0.0,,9003
+15368,9802,8821,45.2,,9110
+15368,9802,8822,-120.3,,9110
+15368,9802,8823,47.2,,9110
+15368,9802,8824,45.5,,9110
+15368,9802,8826,1640416.667,,9003
+15368,9802,8827,0.0,,9003
+15369,9802,8821,45.1,,9110
+15369,9802,8822,-90.0,,9110
+15369,9802,8823,46.46,,9110
+15369,9802,8824,45.34,,9110
+15369,9802,8826,1968500.0,,9003
+15369,9802,8827,0.0,,9003
+15370,9802,8821,43.5,,9110
+15370,9802,8822,-90.0,,9110
+15370,9802,8823,45.3,,9110
+15370,9802,8824,44.15,,9110
+15370,9802,8826,1968500.0,,9003
+15370,9802,8827,0.0,,9003
+15371,9802,8821,42.0,,9110
+15371,9802,8822,-90.0,,9110
+15371,9802,8823,44.04,,9110
+15371,9802,8824,42.44,,9110
+15371,9802,8826,1968500.0,,9003
+15371,9802,8827,0.0,,9003
+15914,9807,8801,0.0,,9102
+15914,9807,8802,-99.0,,9102
+15914,9807,8805,0.9996,,9201
+15914,9807,8806,1640416.67,,9003
+15914,9807,8807,0.0,,9003
+15915,9807,8801,0.0,,9102
+15915,9807,8802,-93.0,,9102
+15915,9807,8805,0.9996,,9201
+15915,9807,8806,1640416.67,,9003
+15915,9807,8807,0.0,,9003
+15916,9807,8801,0.0,,9102
+15916,9807,8802,-87.0,,9102
+15916,9807,8805,0.9996,,9201
+15916,9807,8806,1640416.67,,9003
+15916,9807,8807,0.0,,9003
+15917,9807,8801,0.0,,9102
+15917,9807,8802,-81.0,,9102
+15917,9807,8805,0.9996,,9201
+15917,9807,8806,1640416.67,,9003
+15917,9807,8807,0.0,,9003
+16000,9824,8801,0.0,,9102
+16000,9824,8805,0.9996,,9201
+16000,9824,8806,500000.0,,9001
+16000,9824,8807,0.0,,9001
+16000,9824,8830,-180.0,,9102
+16000,9824,8831,6.0,,9102
+16001,9807,8801,0.0,,9102
+16001,9807,8802,-177.0,,9102
+16001,9807,8805,0.9996,,9201
+16001,9807,8806,500000.0,,9001
+16001,9807,8807,0.0,,9001
+16002,9807,8801,0.0,,9102
+16002,9807,8802,-171.0,,9102
+16002,9807,8805,0.9996,,9201
+16002,9807,8806,500000.0,,9001
+16002,9807,8807,0.0,,9001
+16003,9807,8801,0.0,,9102
+16003,9807,8802,-165.0,,9102
+16003,9807,8805,0.9996,,9201
+16003,9807,8806,500000.0,,9001
+16003,9807,8807,0.0,,9001
+16004,9807,8801,0.0,,9102
+16004,9807,8802,-159.0,,9102
+16004,9807,8805,0.9996,,9201
+16004,9807,8806,500000.0,,9001
+16004,9807,8807,0.0,,9001
+16005,9807,8801,0.0,,9102
+16005,9807,8802,-153.0,,9102
+16005,9807,8805,0.9996,,9201
+16005,9807,8806,500000.0,,9001
+16005,9807,8807,0.0,,9001
+16006,9807,8801,0.0,,9102
+16006,9807,8802,-147.0,,9102
+16006,9807,8805,0.9996,,9201
+16006,9807,8806,500000.0,,9001
+16006,9807,8807,0.0,,9001
+16007,9807,8801,0.0,,9102
+16007,9807,8802,-141.0,,9102
+16007,9807,8805,0.9996,,9201
+16007,9807,8806,500000.0,,9001
+16007,9807,8807,0.0,,9001
+16008,9807,8801,0.0,,9102
+16008,9807,8802,-135.0,,9102
+16008,9807,8805,0.9996,,9201
+16008,9807,8806,500000.0,,9001
+16008,9807,8807,0.0,,9001
+16009,9807,8801,0.0,,9102
+16009,9807,8802,-129.0,,9102
+16009,9807,8805,0.9996,,9201
+16009,9807,8806,500000.0,,9001
+16009,9807,8807,0.0,,9001
+16010,9807,8801,0.0,,9102
+16010,9807,8802,-123.0,,9102
+16010,9807,8805,0.9996,,9201
+16010,9807,8806,500000.0,,9001
+16010,9807,8807,0.0,,9001
+16011,9807,8801,0.0,,9102
+16011,9807,8802,-117.0,,9102
+16011,9807,8805,0.9996,,9201
+16011,9807,8806,500000.0,,9001
+16011,9807,8807,0.0,,9001
+16012,9807,8801,0.0,,9102
+16012,9807,8802,-111.0,,9102
+16012,9807,8805,0.9996,,9201
+16012,9807,8806,500000.0,,9001
+16012,9807,8807,0.0,,9001
+16013,9807,8801,0.0,,9102
+16013,9807,8802,-105.0,,9102
+16013,9807,8805,0.9996,,9201
+16013,9807,8806,500000.0,,9001
+16013,9807,8807,0.0,,9001
+16014,9807,8801,0.0,,9102
+16014,9807,8802,-99.0,,9102
+16014,9807,8805,0.9996,,9201
+16014,9807,8806,500000.0,,9001
+16014,9807,8807,0.0,,9001
+16015,9807,8801,0.0,,9102
+16015,9807,8802,-93.0,,9102
+16015,9807,8805,0.9996,,9201
+16015,9807,8806,500000.0,,9001
+16015,9807,8807,0.0,,9001
+16016,9807,8801,0.0,,9102
+16016,9807,8802,-87.0,,9102
+16016,9807,8805,0.9996,,9201
+16016,9807,8806,500000.0,,9001
+16016,9807,8807,0.0,,9001
+16017,9807,8801,0.0,,9102
+16017,9807,8802,-81.0,,9102
+16017,9807,8805,0.9996,,9201
+16017,9807,8806,500000.0,,9001
+16017,9807,8807,0.0,,9001
+16018,9807,8801,0.0,,9102
+16018,9807,8802,-75.0,,9102
+16018,9807,8805,0.9996,,9201
+16018,9807,8806,500000.0,,9001
+16018,9807,8807,0.0,,9001
+16019,9807,8801,0.0,,9102
+16019,9807,8802,-69.0,,9102
+16019,9807,8805,0.9996,,9201
+16019,9807,8806,500000.0,,9001
+16019,9807,8807,0.0,,9001
+16020,9807,8801,0.0,,9102
+16020,9807,8802,-63.0,,9102
+16020,9807,8805,0.9996,,9201
+16020,9807,8806,500000.0,,9001
+16020,9807,8807,0.0,,9001
+16021,9807,8801,0.0,,9102
+16021,9807,8802,-57.0,,9102
+16021,9807,8805,0.9996,,9201
+16021,9807,8806,500000.0,,9001
+16021,9807,8807,0.0,,9001
+16022,9807,8801,0.0,,9102
+16022,9807,8802,-51.0,,9102
+16022,9807,8805,0.9996,,9201
+16022,9807,8806,500000.0,,9001
+16022,9807,8807,0.0,,9001
+16023,9807,8801,0.0,,9102
+16023,9807,8802,-45.0,,9102
+16023,9807,8805,0.9996,,9201
+16023,9807,8806,500000.0,,9001
+16023,9807,8807,0.0,,9001
+16024,9807,8801,0.0,,9102
+16024,9807,8802,-39.0,,9102
+16024,9807,8805,0.9996,,9201
+16024,9807,8806,500000.0,,9001
+16024,9807,8807,0.0,,9001
+16025,9807,8801,0.0,,9102
+16025,9807,8802,-33.0,,9102
+16025,9807,8805,0.9996,,9201
+16025,9807,8806,500000.0,,9001
+16025,9807,8807,0.0,,9001
+16026,9807,8801,0.0,,9102
+16026,9807,8802,-27.0,,9102
+16026,9807,8805,0.9996,,9201
+16026,9807,8806,500000.0,,9001
+16026,9807,8807,0.0,,9001
+16027,9807,8801,0.0,,9102
+16027,9807,8802,-21.0,,9102
+16027,9807,8805,0.9996,,9201
+16027,9807,8806,500000.0,,9001
+16027,9807,8807,0.0,,9001
+16028,9807,8801,0.0,,9102
+16028,9807,8802,-15.0,,9102
+16028,9807,8805,0.9996,,9201
+16028,9807,8806,500000.0,,9001
+16028,9807,8807,0.0,,9001
+16029,9807,8801,0.0,,9102
+16029,9807,8802,-9.0,,9102
+16029,9807,8805,0.9996,,9201
+16029,9807,8806,500000.0,,9001
+16029,9807,8807,0.0,,9001
+16030,9807,8801,0.0,,9102
+16030,9807,8802,-3.0,,9102
+16030,9807,8805,0.9996,,9201
+16030,9807,8806,500000.0,,9001
+16030,9807,8807,0.0,,9001
+16031,9807,8801,0.0,,9102
+16031,9807,8802,3.0,,9102
+16031,9807,8805,0.9996,,9201
+16031,9807,8806,500000.0,,9001
+16031,9807,8807,0.0,,9001
+16032,9807,8801,0.0,,9102
+16032,9807,8802,9.0,,9102
+16032,9807,8805,0.9996,,9201
+16032,9807,8806,500000.0,,9001
+16032,9807,8807,0.0,,9001
+16033,9807,8801,0.0,,9102
+16033,9807,8802,15.0,,9102
+16033,9807,8805,0.9996,,9201
+16033,9807,8806,500000.0,,9001
+16033,9807,8807,0.0,,9001
+16034,9807,8801,0.0,,9102
+16034,9807,8802,21.0,,9102
+16034,9807,8805,0.9996,,9201
+16034,9807,8806,500000.0,,9001
+16034,9807,8807,0.0,,9001
+16035,9807,8801,0.0,,9102
+16035,9807,8802,27.0,,9102
+16035,9807,8805,0.9996,,9201
+16035,9807,8806,500000.0,,9001
+16035,9807,8807,0.0,,9001
+16036,9807,8801,0.0,,9102
+16036,9807,8802,33.0,,9102
+16036,9807,8805,0.9996,,9201
+16036,9807,8806,500000.0,,9001
+16036,9807,8807,0.0,,9001
+16037,9807,8801,0.0,,9102
+16037,9807,8802,39.0,,9102
+16037,9807,8805,0.9996,,9201
+16037,9807,8806,500000.0,,9001
+16037,9807,8807,0.0,,9001
+16038,9807,8801,0.0,,9102
+16038,9807,8802,45.0,,9102
+16038,9807,8805,0.9996,,9201
+16038,9807,8806,500000.0,,9001
+16038,9807,8807,0.0,,9001
+16039,9807,8801,0.0,,9102
+16039,9807,8802,51.0,,9102
+16039,9807,8805,0.9996,,9201
+16039,9807,8806,500000.0,,9001
+16039,9807,8807,0.0,,9001
+16040,9807,8801,0.0,,9102
+16040,9807,8802,57.0,,9102
+16040,9807,8805,0.9996,,9201
+16040,9807,8806,500000.0,,9001
+16040,9807,8807,0.0,,9001
+16041,9807,8801,0.0,,9102
+16041,9807,8802,63.0,,9102
+16041,9807,8805,0.9996,,9201
+16041,9807,8806,500000.0,,9001
+16041,9807,8807,0.0,,9001
+16042,9807,8801,0.0,,9102
+16042,9807,8802,69.0,,9102
+16042,9807,8805,0.9996,,9201
+16042,9807,8806,500000.0,,9001
+16042,9807,8807,0.0,,9001
+16043,9807,8801,0.0,,9102
+16043,9807,8802,75.0,,9102
+16043,9807,8805,0.9996,,9201
+16043,9807,8806,500000.0,,9001
+16043,9807,8807,0.0,,9001
+16044,9807,8801,0.0,,9102
+16044,9807,8802,81.0,,9102
+16044,9807,8805,0.9996,,9201
+16044,9807,8806,500000.0,,9001
+16044,9807,8807,0.0,,9001
+16045,9807,8801,0.0,,9102
+16045,9807,8802,87.0,,9102
+16045,9807,8805,0.9996,,9201
+16045,9807,8806,500000.0,,9001
+16045,9807,8807,0.0,,9001
+16046,9807,8801,0.0,,9102
+16046,9807,8802,93.0,,9102
+16046,9807,8805,0.9996,,9201
+16046,9807,8806,500000.0,,9001
+16046,9807,8807,0.0,,9001
+16047,9807,8801,0.0,,9102
+16047,9807,8802,99.0,,9102
+16047,9807,8805,0.9996,,9201
+16047,9807,8806,500000.0,,9001
+16047,9807,8807,0.0,,9001
+16048,9807,8801,0.0,,9102
+16048,9807,8802,105.0,,9102
+16048,9807,8805,0.9996,,9201
+16048,9807,8806,500000.0,,9001
+16048,9807,8807,0.0,,9001
+16049,9807,8801,0.0,,9102
+16049,9807,8802,111.0,,9102
+16049,9807,8805,0.9996,,9201
+16049,9807,8806,500000.0,,9001
+16049,9807,8807,0.0,,9001
+16050,9807,8801,0.0,,9102
+16050,9807,8802,117.0,,9102
+16050,9807,8805,0.9996,,9201
+16050,9807,8806,500000.0,,9001
+16050,9807,8807,0.0,,9001
+16051,9807,8801,0.0,,9102
+16051,9807,8802,123.0,,9102
+16051,9807,8805,0.9996,,9201
+16051,9807,8806,500000.0,,9001
+16051,9807,8807,0.0,,9001
+16052,9807,8801,0.0,,9102
+16052,9807,8802,129.0,,9102
+16052,9807,8805,0.9996,,9201
+16052,9807,8806,500000.0,,9001
+16052,9807,8807,0.0,,9001
+16053,9807,8801,0.0,,9102
+16053,9807,8802,135.0,,9102
+16053,9807,8805,0.9996,,9201
+16053,9807,8806,500000.0,,9001
+16053,9807,8807,0.0,,9001
+16054,9807,8801,0.0,,9102
+16054,9807,8802,141.0,,9102
+16054,9807,8805,0.9996,,9201
+16054,9807,8806,500000.0,,9001
+16054,9807,8807,0.0,,9001
+16055,9807,8801,0.0,,9102
+16055,9807,8802,147.0,,9102
+16055,9807,8805,0.9996,,9201
+16055,9807,8806,500000.0,,9001
+16055,9807,8807,0.0,,9001
+16056,9807,8801,0.0,,9102
+16056,9807,8802,153.0,,9102
+16056,9807,8805,0.9996,,9201
+16056,9807,8806,500000.0,,9001
+16056,9807,8807,0.0,,9001
+16057,9807,8801,0.0,,9102
+16057,9807,8802,159.0,,9102
+16057,9807,8805,0.9996,,9201
+16057,9807,8806,500000.0,,9001
+16057,9807,8807,0.0,,9001
+16058,9807,8801,0.0,,9102
+16058,9807,8802,165.0,,9102
+16058,9807,8805,0.9996,,9201
+16058,9807,8806,500000.0,,9001
+16058,9807,8807,0.0,,9001
+16059,9807,8801,0.0,,9102
+16059,9807,8802,171.0,,9102
+16059,9807,8805,0.9996,,9201
+16059,9807,8806,500000.0,,9001
+16059,9807,8807,0.0,,9001
+16060,9807,8801,0.0,,9102
+16060,9807,8802,177.0,,9102
+16060,9807,8805,0.9996,,9201
+16060,9807,8806,500000.0,,9001
+16060,9807,8807,0.0,,9001
+16061,9810,8801,90.0,,9102
+16061,9810,8802,0.0,,9102
+16061,9810,8805,0.994,,9201
+16061,9810,8806,2000000.0,,9001
+16061,9810,8807,2000000.0,,9001
+16070,9807,8801,0.0,,9102
+16070,9807,8802,120.0,,9102
+16070,9807,8805,1.0,,9201
+16070,9807,8806,40500000.0,,9001
+16070,9807,8807,0.0,,9001
+16071,9807,8801,0.0,,9102
+16071,9807,8802,123.0,,9102
+16071,9807,8805,1.0,,9201
+16071,9807,8806,41500000.0,,9001
+16071,9807,8807,0.0,,9001
+16072,9807,8801,0.0,,9102
+16072,9807,8802,126.0,,9102
+16072,9807,8805,1.0,,9201
+16072,9807,8806,42500000.0,,9001
+16072,9807,8807,0.0,,9001
+16073,9807,8801,0.0,,9102
+16073,9807,8802,129.0,,9102
+16073,9807,8805,1.0,,9201
+16073,9807,8806,43500000.0,,9001
+16073,9807,8807,0.0,,9001
+16074,9807,8801,0.0,,9102
+16074,9807,8802,132.0,,9102
+16074,9807,8805,1.0,,9201
+16074,9807,8806,44500000.0,,9001
+16074,9807,8807,0.0,,9001
+16075,9807,8801,0.0,,9102
+16075,9807,8802,135.0,,9102
+16075,9807,8805,1.0,,9201
+16075,9807,8806,45500000.0,,9001
+16075,9807,8807,0.0,,9001
+16076,9807,8801,0.0,,9102
+16076,9807,8802,138.0,,9102
+16076,9807,8805,1.0,,9201
+16076,9807,8806,46500000.0,,9001
+16076,9807,8807,0.0,,9001
+16077,9807,8801,0.0,,9102
+16077,9807,8802,141.0,,9102
+16077,9807,8805,1.0,,9201
+16077,9807,8806,47500000.0,,9001
+16077,9807,8807,0.0,,9001
+16078,9807,8801,0.0,,9102
+16078,9807,8802,144.0,,9102
+16078,9807,8805,1.0,,9201
+16078,9807,8806,48500000.0,,9001
+16078,9807,8807,0.0,,9001
+16079,9807,8801,0.0,,9102
+16079,9807,8802,147.0,,9102
+16079,9807,8805,1.0,,9201
+16079,9807,8806,49500000.0,,9001
+16079,9807,8807,0.0,,9001
+16080,9807,8801,0.0,,9102
+16080,9807,8802,150.0,,9102
+16080,9807,8805,1.0,,9201
+16080,9807,8806,50500000.0,,9001
+16080,9807,8807,0.0,,9001
+16081,9807,8801,0.0,,9102
+16081,9807,8802,153.0,,9102
+16081,9807,8805,1.0,,9201
+16081,9807,8806,51500000.0,,9001
+16081,9807,8807,0.0,,9001
+16082,9807,8801,0.0,,9102
+16082,9807,8802,156.0,,9102
+16082,9807,8805,1.0,,9201
+16082,9807,8806,52500000.0,,9001
+16082,9807,8807,0.0,,9001
+16083,9807,8801,0.0,,9102
+16083,9807,8802,159.0,,9102
+16083,9807,8805,1.0,,9201
+16083,9807,8806,53500000.0,,9001
+16083,9807,8807,0.0,,9001
+16084,9807,8801,0.0,,9102
+16084,9807,8802,162.0,,9102
+16084,9807,8805,1.0,,9201
+16084,9807,8806,54500000.0,,9001
+16084,9807,8807,0.0,,9001
+16085,9807,8801,0.0,,9102
+16085,9807,8802,165.0,,9102
+16085,9807,8805,1.0,,9201
+16085,9807,8806,55500000.0,,9001
+16085,9807,8807,0.0,,9001
+16086,9807,8801,0.0,,9102
+16086,9807,8802,168.0,,9102
+16086,9807,8805,1.0,,9201
+16086,9807,8806,56500000.0,,9001
+16086,9807,8807,0.0,,9001
+16087,9807,8801,0.0,,9102
+16087,9807,8802,171.0,,9102
+16087,9807,8805,1.0,,9201
+16087,9807,8806,57500000.0,,9001
+16087,9807,8807,0.0,,9001
+16088,9807,8801,0.0,,9102
+16088,9807,8802,174.0,,9102
+16088,9807,8805,1.0,,9201
+16088,9807,8806,58500000.0,,9001
+16088,9807,8807,0.0,,9001
+16089,9807,8801,0.0,,9102
+16089,9807,8802,177.0,,9102
+16089,9807,8805,1.0,,9201
+16089,9807,8806,59500000.0,,9001
+16089,9807,8807,0.0,,9001
+16090,9807,8801,0.0,,9102
+16090,9807,8802,180.0,,9102
+16090,9807,8805,1.0,,9201
+16090,9807,8806,60000000.0,,9001
+16090,9807,8807,0.0,,9001
+16091,9807,8801,0.0,,9102
+16091,9807,8802,-177.0,,9102
+16091,9807,8805,1.0,,9201
+16091,9807,8806,61500000.0,,9001
+16091,9807,8807,0.0,,9001
+16092,9807,8801,0.0,,9102
+16092,9807,8802,-174.0,,9102
+16092,9807,8805,1.0,,9201
+16092,9807,8806,62500000.0,,9001
+16092,9807,8807,0.0,,9001
+16093,9807,8801,0.0,,9102
+16093,9807,8802,-171.0,,9102
+16093,9807,8805,1.0,,9201
+16093,9807,8806,63500000.0,,9001
+16093,9807,8807,0.0,,9001
+16094,9807,8801,0.0,,9102
+16094,9807,8802,-168.0,,9102
+16094,9807,8805,1.0,,9201
+16094,9807,8806,64500000.0,,9001
+16094,9807,8807,0.0,,9001
+16100,9824,8801,0.0,,9102
+16100,9824,8805,0.9996,,9201
+16100,9824,8806,500000.0,,9001
+16100,9824,8807,10000000.0,,9001
+16100,9824,8830,-180.0,,9102
+16100,9824,8831,6.0,,9102
+16101,9807,8801,0.0,,9102
+16101,9807,8802,-177.0,,9102
+16101,9807,8805,0.9996,,9201
+16101,9807,8806,500000.0,,9001
+16101,9807,8807,10000000.0,,9001
+16102,9807,8801,0.0,,9102
+16102,9807,8802,-171.0,,9102
+16102,9807,8805,0.9996,,9201
+16102,9807,8806,500000.0,,9001
+16102,9807,8807,10000000.0,,9001
+16103,9807,8801,0.0,,9102
+16103,9807,8802,-165.0,,9102
+16103,9807,8805,0.9996,,9201
+16103,9807,8806,500000.0,,9001
+16103,9807,8807,10000000.0,,9001
+16104,9807,8801,0.0,,9102
+16104,9807,8802,-159.0,,9102
+16104,9807,8805,0.9996,,9201
+16104,9807,8806,500000.0,,9001
+16104,9807,8807,10000000.0,,9001
+16105,9807,8801,0.0,,9102
+16105,9807,8802,-153.0,,9102
+16105,9807,8805,0.9996,,9201
+16105,9807,8806,500000.0,,9001
+16105,9807,8807,10000000.0,,9001
+16106,9807,8801,0.0,,9102
+16106,9807,8802,-147.0,,9102
+16106,9807,8805,0.9996,,9201
+16106,9807,8806,500000.0,,9001
+16106,9807,8807,10000000.0,,9001
+16107,9807,8801,0.0,,9102
+16107,9807,8802,-141.0,,9102
+16107,9807,8805,0.9996,,9201
+16107,9807,8806,500000.0,,9001
+16107,9807,8807,10000000.0,,9001
+16108,9807,8801,0.0,,9102
+16108,9807,8802,-135.0,,9102
+16108,9807,8805,0.9996,,9201
+16108,9807,8806,500000.0,,9001
+16108,9807,8807,10000000.0,,9001
+16109,9807,8801,0.0,,9102
+16109,9807,8802,-129.0,,9102
+16109,9807,8805,0.9996,,9201
+16109,9807,8806,500000.0,,9001
+16109,9807,8807,10000000.0,,9001
+16110,9807,8801,0.0,,9102
+16110,9807,8802,-123.0,,9102
+16110,9807,8805,0.9996,,9201
+16110,9807,8806,500000.0,,9001
+16110,9807,8807,10000000.0,,9001
+16111,9807,8801,0.0,,9102
+16111,9807,8802,-117.0,,9102
+16111,9807,8805,0.9996,,9201
+16111,9807,8806,500000.0,,9001
+16111,9807,8807,10000000.0,,9001
+16112,9807,8801,0.0,,9102
+16112,9807,8802,-111.0,,9102
+16112,9807,8805,0.9996,,9201
+16112,9807,8806,500000.0,,9001
+16112,9807,8807,10000000.0,,9001
+16113,9807,8801,0.0,,9102
+16113,9807,8802,-105.0,,9102
+16113,9807,8805,0.9996,,9201
+16113,9807,8806,500000.0,,9001
+16113,9807,8807,10000000.0,,9001
+16114,9807,8801,0.0,,9102
+16114,9807,8802,-99.0,,9102
+16114,9807,8805,0.9996,,9201
+16114,9807,8806,500000.0,,9001
+16114,9807,8807,10000000.0,,9001
+16115,9807,8801,0.0,,9102
+16115,9807,8802,-93.0,,9102
+16115,9807,8805,0.9996,,9201
+16115,9807,8806,500000.0,,9001
+16115,9807,8807,10000000.0,,9001
+16116,9807,8801,0.0,,9102
+16116,9807,8802,-87.0,,9102
+16116,9807,8805,0.9996,,9201
+16116,9807,8806,500000.0,,9001
+16116,9807,8807,10000000.0,,9001
+16117,9807,8801,0.0,,9102
+16117,9807,8802,-81.0,,9102
+16117,9807,8805,0.9996,,9201
+16117,9807,8806,500000.0,,9001
+16117,9807,8807,10000000.0,,9001
+16118,9807,8801,0.0,,9102
+16118,9807,8802,-75.0,,9102
+16118,9807,8805,0.9996,,9201
+16118,9807,8806,500000.0,,9001
+16118,9807,8807,10000000.0,,9001
+16119,9807,8801,0.0,,9102
+16119,9807,8802,-69.0,,9102
+16119,9807,8805,0.9996,,9201
+16119,9807,8806,500000.0,,9001
+16119,9807,8807,10000000.0,,9001
+16120,9807,8801,0.0,,9102
+16120,9807,8802,-63.0,,9102
+16120,9807,8805,0.9996,,9201
+16120,9807,8806,500000.0,,9001
+16120,9807,8807,10000000.0,,9001
+16121,9807,8801,0.0,,9102
+16121,9807,8802,-57.0,,9102
+16121,9807,8805,0.9996,,9201
+16121,9807,8806,500000.0,,9001
+16121,9807,8807,10000000.0,,9001
+16122,9807,8801,0.0,,9102
+16122,9807,8802,-51.0,,9102
+16122,9807,8805,0.9996,,9201
+16122,9807,8806,500000.0,,9001
+16122,9807,8807,10000000.0,,9001
+16123,9807,8801,0.0,,9102
+16123,9807,8802,-45.0,,9102
+16123,9807,8805,0.9996,,9201
+16123,9807,8806,500000.0,,9001
+16123,9807,8807,10000000.0,,9001
+16124,9807,8801,0.0,,9102
+16124,9807,8802,-39.0,,9102
+16124,9807,8805,0.9996,,9201
+16124,9807,8806,500000.0,,9001
+16124,9807,8807,10000000.0,,9001
+16125,9807,8801,0.0,,9102
+16125,9807,8802,-33.0,,9102
+16125,9807,8805,0.9996,,9201
+16125,9807,8806,500000.0,,9001
+16125,9807,8807,10000000.0,,9001
+16126,9807,8801,0.0,,9102
+16126,9807,8802,-27.0,,9102
+16126,9807,8805,0.9996,,9201
+16126,9807,8806,500000.0,,9001
+16126,9807,8807,10000000.0,,9001
+16127,9807,8801,0.0,,9102
+16127,9807,8802,-21.0,,9102
+16127,9807,8805,0.9996,,9201
+16127,9807,8806,500000.0,,9001
+16127,9807,8807,10000000.0,,9001
+16128,9807,8801,0.0,,9102
+16128,9807,8802,-15.0,,9102
+16128,9807,8805,0.9996,,9201
+16128,9807,8806,500000.0,,9001
+16128,9807,8807,10000000.0,,9001
+16129,9807,8801,0.0,,9102
+16129,9807,8802,-9.0,,9102
+16129,9807,8805,0.9996,,9201
+16129,9807,8806,500000.0,,9001
+16129,9807,8807,10000000.0,,9001
+16130,9807,8801,0.0,,9102
+16130,9807,8802,-3.0,,9102
+16130,9807,8805,0.9996,,9201
+16130,9807,8806,500000.0,,9001
+16130,9807,8807,10000000.0,,9001
+16131,9807,8801,0.0,,9102
+16131,9807,8802,3.0,,9102
+16131,9807,8805,0.9996,,9201
+16131,9807,8806,500000.0,,9001
+16131,9807,8807,10000000.0,,9001
+16132,9807,8801,0.0,,9102
+16132,9807,8802,9.0,,9102
+16132,9807,8805,0.9996,,9201
+16132,9807,8806,500000.0,,9001
+16132,9807,8807,10000000.0,,9001
+16133,9807,8801,0.0,,9102
+16133,9807,8802,15.0,,9102
+16133,9807,8805,0.9996,,9201
+16133,9807,8806,500000.0,,9001
+16133,9807,8807,10000000.0,,9001
+16134,9807,8801,0.0,,9102
+16134,9807,8802,21.0,,9102
+16134,9807,8805,0.9996,,9201
+16134,9807,8806,500000.0,,9001
+16134,9807,8807,10000000.0,,9001
+16135,9807,8801,0.0,,9102
+16135,9807,8802,27.0,,9102
+16135,9807,8805,0.9996,,9201
+16135,9807,8806,500000.0,,9001
+16135,9807,8807,10000000.0,,9001
+16136,9807,8801,0.0,,9102
+16136,9807,8802,33.0,,9102
+16136,9807,8805,0.9996,,9201
+16136,9807,8806,500000.0,,9001
+16136,9807,8807,10000000.0,,9001
+16137,9807,8801,0.0,,9102
+16137,9807,8802,39.0,,9102
+16137,9807,8805,0.9996,,9201
+16137,9807,8806,500000.0,,9001
+16137,9807,8807,10000000.0,,9001
+16138,9807,8801,0.0,,9102
+16138,9807,8802,45.0,,9102
+16138,9807,8805,0.9996,,9201
+16138,9807,8806,500000.0,,9001
+16138,9807,8807,10000000.0,,9001
+16139,9807,8801,0.0,,9102
+16139,9807,8802,51.0,,9102
+16139,9807,8805,0.9996,,9201
+16139,9807,8806,500000.0,,9001
+16139,9807,8807,10000000.0,,9001
+16140,9807,8801,0.0,,9102
+16140,9807,8802,57.0,,9102
+16140,9807,8805,0.9996,,9201
+16140,9807,8806,500000.0,,9001
+16140,9807,8807,10000000.0,,9001
+16141,9807,8801,0.0,,9102
+16141,9807,8802,63.0,,9102
+16141,9807,8805,0.9996,,9201
+16141,9807,8806,500000.0,,9001
+16141,9807,8807,10000000.0,,9001
+16142,9807,8801,0.0,,9102
+16142,9807,8802,69.0,,9102
+16142,9807,8805,0.9996,,9201
+16142,9807,8806,500000.0,,9001
+16142,9807,8807,10000000.0,,9001
+16143,9807,8801,0.0,,9102
+16143,9807,8802,75.0,,9102
+16143,9807,8805,0.9996,,9201
+16143,9807,8806,500000.0,,9001
+16143,9807,8807,10000000.0,,9001
+16144,9807,8801,0.0,,9102
+16144,9807,8802,81.0,,9102
+16144,9807,8805,0.9996,,9201
+16144,9807,8806,500000.0,,9001
+16144,9807,8807,10000000.0,,9001
+16145,9807,8801,0.0,,9102
+16145,9807,8802,87.0,,9102
+16145,9807,8805,0.9996,,9201
+16145,9807,8806,500000.0,,9001
+16145,9807,8807,10000000.0,,9001
+16146,9807,8801,0.0,,9102
+16146,9807,8802,93.0,,9102
+16146,9807,8805,0.9996,,9201
+16146,9807,8806,500000.0,,9001
+16146,9807,8807,10000000.0,,9001
+16147,9807,8801,0.0,,9102
+16147,9807,8802,99.0,,9102
+16147,9807,8805,0.9996,,9201
+16147,9807,8806,500000.0,,9001
+16147,9807,8807,10000000.0,,9001
+16148,9807,8801,0.0,,9102
+16148,9807,8802,105.0,,9102
+16148,9807,8805,0.9996,,9201
+16148,9807,8806,500000.0,,9001
+16148,9807,8807,10000000.0,,9001
+16149,9807,8801,0.0,,9102
+16149,9807,8802,111.0,,9102
+16149,9807,8805,0.9996,,9201
+16149,9807,8806,500000.0,,9001
+16149,9807,8807,10000000.0,,9001
+16150,9807,8801,0.0,,9102
+16150,9807,8802,117.0,,9102
+16150,9807,8805,0.9996,,9201
+16150,9807,8806,500000.0,,9001
+16150,9807,8807,10000000.0,,9001
+16151,9807,8801,0.0,,9102
+16151,9807,8802,123.0,,9102
+16151,9807,8805,0.9996,,9201
+16151,9807,8806,500000.0,,9001
+16151,9807,8807,10000000.0,,9001
+16152,9807,8801,0.0,,9102
+16152,9807,8802,129.0,,9102
+16152,9807,8805,0.9996,,9201
+16152,9807,8806,500000.0,,9001
+16152,9807,8807,10000000.0,,9001
+16153,9807,8801,0.0,,9102
+16153,9807,8802,135.0,,9102
+16153,9807,8805,0.9996,,9201
+16153,9807,8806,500000.0,,9001
+16153,9807,8807,10000000.0,,9001
+16154,9807,8801,0.0,,9102
+16154,9807,8802,141.0,,9102
+16154,9807,8805,0.9996,,9201
+16154,9807,8806,500000.0,,9001
+16154,9807,8807,10000000.0,,9001
+16155,9807,8801,0.0,,9102
+16155,9807,8802,147.0,,9102
+16155,9807,8805,0.9996,,9201
+16155,9807,8806,500000.0,,9001
+16155,9807,8807,10000000.0,,9001
+16156,9807,8801,0.0,,9102
+16156,9807,8802,153.0,,9102
+16156,9807,8805,0.9996,,9201
+16156,9807,8806,500000.0,,9001
+16156,9807,8807,10000000.0,,9001
+16157,9807,8801,0.0,,9102
+16157,9807,8802,159.0,,9102
+16157,9807,8805,0.9996,,9201
+16157,9807,8806,500000.0,,9001
+16157,9807,8807,10000000.0,,9001
+16158,9807,8801,0.0,,9102
+16158,9807,8802,165.0,,9102
+16158,9807,8805,0.9996,,9201
+16158,9807,8806,500000.0,,9001
+16158,9807,8807,10000000.0,,9001
+16159,9807,8801,0.0,,9102
+16159,9807,8802,171.0,,9102
+16159,9807,8805,0.9996,,9201
+16159,9807,8806,500000.0,,9001
+16159,9807,8807,10000000.0,,9001
+16160,9807,8801,0.0,,9102
+16160,9807,8802,177.0,,9102
+16160,9807,8805,0.9996,,9201
+16160,9807,8806,500000.0,,9001
+16160,9807,8807,10000000.0,,9001
+16161,9810,8801,-90.0,,9102
+16161,9810,8802,0.0,,9102
+16161,9810,8805,0.994,,9201
+16161,9810,8806,2000000.0,,9001
+16161,9810,8807,2000000.0,,9001
+16170,9807,8801,0.0,,9102
+16170,9807,8802,120.0,,9102
+16170,9807,8805,1.0,,9201
+16170,9807,8806,500000.0,,9001
+16170,9807,8807,0.0,,9001
+16171,9807,8801,0.0,,9102
+16171,9807,8802,123.0,,9102
+16171,9807,8805,1.0,,9201
+16171,9807,8806,500000.0,,9001
+16171,9807,8807,0.0,,9001
+16172,9807,8801,0.0,,9102
+16172,9807,8802,126.0,,9102
+16172,9807,8805,1.0,,9201
+16172,9807,8806,500000.0,,9001
+16172,9807,8807,0.0,,9001
+16173,9807,8801,0.0,,9102
+16173,9807,8802,129.0,,9102
+16173,9807,8805,1.0,,9201
+16173,9807,8806,500000.0,,9001
+16173,9807,8807,0.0,,9001
+16174,9807,8801,0.0,,9102
+16174,9807,8802,132.0,,9102
+16174,9807,8805,1.0,,9201
+16174,9807,8806,500000.0,,9001
+16174,9807,8807,0.0,,9001
+16175,9807,8801,0.0,,9102
+16175,9807,8802,135.0,,9102
+16175,9807,8805,1.0,,9201
+16175,9807,8806,500000.0,,9001
+16175,9807,8807,0.0,,9001
+16176,9807,8801,0.0,,9102
+16176,9807,8802,138.0,,9102
+16176,9807,8805,1.0,,9201
+16176,9807,8806,500000.0,,9001
+16176,9807,8807,0.0,,9001
+16177,9807,8801,0.0,,9102
+16177,9807,8802,141.0,,9102
+16177,9807,8805,1.0,,9201
+16177,9807,8806,500000.0,,9001
+16177,9807,8807,0.0,,9001
+16178,9807,8801,0.0,,9102
+16178,9807,8802,144.0,,9102
+16178,9807,8805,1.0,,9201
+16178,9807,8806,500000.0,,9001
+16178,9807,8807,0.0,,9001
+16179,9807,8801,0.0,,9102
+16179,9807,8802,147.0,,9102
+16179,9807,8805,1.0,,9201
+16179,9807,8806,500000.0,,9001
+16179,9807,8807,0.0,,9001
+16180,9807,8801,0.0,,9102
+16180,9807,8802,150.0,,9102
+16180,9807,8805,1.0,,9201
+16180,9807,8806,500000.0,,9001
+16180,9807,8807,0.0,,9001
+16181,9807,8801,0.0,,9102
+16181,9807,8802,153.0,,9102
+16181,9807,8805,1.0,,9201
+16181,9807,8806,500000.0,,9001
+16181,9807,8807,0.0,,9001
+16182,9807,8801,0.0,,9102
+16182,9807,8802,156.0,,9102
+16182,9807,8805,1.0,,9201
+16182,9807,8806,500000.0,,9001
+16182,9807,8807,0.0,,9001
+16183,9807,8801,0.0,,9102
+16183,9807,8802,159.0,,9102
+16183,9807,8805,1.0,,9201
+16183,9807,8806,500000.0,,9001
+16183,9807,8807,0.0,,9001
+16184,9807,8801,0.0,,9102
+16184,9807,8802,162.0,,9102
+16184,9807,8805,1.0,,9201
+16184,9807,8806,500000.0,,9001
+16184,9807,8807,0.0,,9001
+16185,9807,8801,0.0,,9102
+16185,9807,8802,165.0,,9102
+16185,9807,8805,1.0,,9201
+16185,9807,8806,500000.0,,9001
+16185,9807,8807,0.0,,9001
+16186,9807,8801,0.0,,9102
+16186,9807,8802,168.0,,9102
+16186,9807,8805,1.0,,9201
+16186,9807,8806,500000.0,,9001
+16186,9807,8807,0.0,,9001
+16187,9807,8801,0.0,,9102
+16187,9807,8802,171.0,,9102
+16187,9807,8805,1.0,,9201
+16187,9807,8806,500000.0,,9001
+16187,9807,8807,0.0,,9001
+16188,9807,8801,0.0,,9102
+16188,9807,8802,174.0,,9102
+16188,9807,8805,1.0,,9201
+16188,9807,8806,500000.0,,9001
+16188,9807,8807,0.0,,9001
+16189,9807,8801,0.0,,9102
+16189,9807,8802,177.0,,9102
+16189,9807,8805,1.0,,9201
+16189,9807,8806,500000.0,,9001
+16189,9807,8807,0.0,,9001
+16190,9807,8801,0.0,,9102
+16190,9807,8802,180.0,,9102
+16190,9807,8805,1.0,,9201
+16190,9807,8806,500000.0,,9001
+16190,9807,8807,0.0,,9001
+16191,9807,8801,0.0,,9102
+16191,9807,8802,-177.0,,9102
+16191,9807,8805,1.0,,9201
+16191,9807,8806,500000.0,,9001
+16191,9807,8807,0.0,,9001
+16192,9807,8801,0.0,,9102
+16192,9807,8802,-174.0,,9102
+16192,9807,8805,1.0,,9201
+16192,9807,8806,500000.0,,9001
+16192,9807,8807,0.0,,9001
+16193,9807,8801,0.0,,9102
+16193,9807,8802,-171.0,,9102
+16193,9807,8805,1.0,,9201
+16193,9807,8806,500000.0,,9001
+16193,9807,8807,0.0,,9001
+16194,9807,8801,0.0,,9102
+16194,9807,8802,-168.0,,9102
+16194,9807,8805,1.0,,9201
+16194,9807,8806,500000.0,,9001
+16194,9807,8807,0.0,,9001
+16201,9807,8801,0.0,,9102
+16201,9807,8802,3.0,,9102
+16201,9807,8805,1.0,,9201
+16201,9807,8806,1500000.0,,9001
+16201,9807,8807,0.0,,9001
+16202,9807,8801,0.0,,9102
+16202,9807,8802,9.0,,9102
+16202,9807,8805,1.0,,9201
+16202,9807,8806,2500000.0,,9001
+16202,9807,8807,0.0,,9001
+16203,9807,8801,0.0,,9102
+16203,9807,8802,15.0,,9102
+16203,9807,8805,1.0,,9201
+16203,9807,8806,3500000.0,,9001
+16203,9807,8807,0.0,,9001
+16204,9807,8801,0.0,,9102
+16204,9807,8802,21.0,,9102
+16204,9807,8805,1.0,,9201
+16204,9807,8806,4500000.0,,9001
+16204,9807,8807,0.0,,9001
+16205,9807,8801,0.0,,9102
+16205,9807,8802,27.0,,9102
+16205,9807,8805,1.0,,9201
+16205,9807,8806,5500000.0,,9001
+16205,9807,8807,0.0,,9001
+16206,9807,8801,0.0,,9102
+16206,9807,8802,33.0,,9102
+16206,9807,8805,1.0,,9201
+16206,9807,8806,6500000.0,,9001
+16206,9807,8807,0.0,,9001
+16207,9807,8801,0.0,,9102
+16207,9807,8802,39.0,,9102
+16207,9807,8805,1.0,,9201
+16207,9807,8806,7500000.0,,9001
+16207,9807,8807,0.0,,9001
+16208,9807,8801,0.0,,9102
+16208,9807,8802,45.0,,9102
+16208,9807,8805,1.0,,9201
+16208,9807,8806,8500000.0,,9001
+16208,9807,8807,0.0,,9001
+16209,9807,8801,0.0,,9102
+16209,9807,8802,51.0,,9102
+16209,9807,8805,1.0,,9201
+16209,9807,8806,9500000.0,,9001
+16209,9807,8807,0.0,,9001
+16210,9807,8801,0.0,,9102
+16210,9807,8802,57.0,,9102
+16210,9807,8805,1.0,,9201
+16210,9807,8806,10500000.0,,9001
+16210,9807,8807,0.0,,9001
+16211,9807,8801,0.0,,9102
+16211,9807,8802,63.0,,9102
+16211,9807,8805,1.0,,9201
+16211,9807,8806,11500000.0,,9001
+16211,9807,8807,0.0,,9001
+16212,9807,8801,0.0,,9102
+16212,9807,8802,69.0,,9102
+16212,9807,8805,1.0,,9201
+16212,9807,8806,12500000.0,,9001
+16212,9807,8807,0.0,,9001
+16213,9807,8801,0.0,,9102
+16213,9807,8802,75.0,,9102
+16213,9807,8805,1.0,,9201
+16213,9807,8806,13500000.0,,9001
+16213,9807,8807,0.0,,9001
+16214,9807,8801,0.0,,9102
+16214,9807,8802,81.0,,9102
+16214,9807,8805,1.0,,9201
+16214,9807,8806,14500000.0,,9001
+16214,9807,8807,0.0,,9001
+16215,9807,8801,0.0,,9102
+16215,9807,8802,87.0,,9102
+16215,9807,8805,1.0,,9201
+16215,9807,8806,15500000.0,,9001
+16215,9807,8807,0.0,,9001
+16216,9807,8801,0.0,,9102
+16216,9807,8802,93.0,,9102
+16216,9807,8805,1.0,,9201
+16216,9807,8806,16500000.0,,9001
+16216,9807,8807,0.0,,9001
+16217,9807,8801,0.0,,9102
+16217,9807,8802,99.0,,9102
+16217,9807,8805,1.0,,9201
+16217,9807,8806,17500000.0,,9001
+16217,9807,8807,0.0,,9001
+16218,9807,8801,0.0,,9102
+16218,9807,8802,105.0,,9102
+16218,9807,8805,1.0,,9201
+16218,9807,8806,18500000.0,,9001
+16218,9807,8807,0.0,,9001
+16219,9807,8801,0.0,,9102
+16219,9807,8802,111.0,,9102
+16219,9807,8805,1.0,,9201
+16219,9807,8806,19500000.0,,9001
+16219,9807,8807,0.0,,9001
+16220,9807,8801,0.0,,9102
+16220,9807,8802,117.0,,9102
+16220,9807,8805,1.0,,9201
+16220,9807,8806,20500000.0,,9001
+16220,9807,8807,0.0,,9001
+16221,9807,8801,0.0,,9102
+16221,9807,8802,123.0,,9102
+16221,9807,8805,1.0,,9201
+16221,9807,8806,21500000.0,,9001
+16221,9807,8807,0.0,,9001
+16222,9807,8801,0.0,,9102
+16222,9807,8802,129.0,,9102
+16222,9807,8805,1.0,,9201
+16222,9807,8806,22500000.0,,9001
+16222,9807,8807,0.0,,9001
+16223,9807,8801,0.0,,9102
+16223,9807,8802,135.0,,9102
+16223,9807,8805,1.0,,9201
+16223,9807,8806,23500000.0,,9001
+16223,9807,8807,0.0,,9001
+16224,9807,8801,0.0,,9102
+16224,9807,8802,141.0,,9102
+16224,9807,8805,1.0,,9201
+16224,9807,8806,24500000.0,,9001
+16224,9807,8807,0.0,,9001
+16225,9807,8801,0.0,,9102
+16225,9807,8802,147.0,,9102
+16225,9807,8805,1.0,,9201
+16225,9807,8806,25500000.0,,9001
+16225,9807,8807,0.0,,9001
+16226,9807,8801,0.0,,9102
+16226,9807,8802,153.0,,9102
+16226,9807,8805,1.0,,9201
+16226,9807,8806,26500000.0,,9001
+16226,9807,8807,0.0,,9001
+16227,9807,8801,0.0,,9102
+16227,9807,8802,159.0,,9102
+16227,9807,8805,1.0,,9201
+16227,9807,8806,27500000.0,,9001
+16227,9807,8807,0.0,,9001
+16228,9807,8801,0.0,,9102
+16228,9807,8802,165.0,,9102
+16228,9807,8805,1.0,,9201
+16228,9807,8806,28500000.0,,9001
+16228,9807,8807,0.0,,9001
+16229,9807,8801,0.0,,9102
+16229,9807,8802,171.0,,9102
+16229,9807,8805,1.0,,9201
+16229,9807,8806,29500000.0,,9001
+16229,9807,8807,0.0,,9001
+16230,9807,8801,0.0,,9102
+16230,9807,8802,177.0,,9102
+16230,9807,8805,1.0,,9201
+16230,9807,8806,30500000.0,,9001
+16230,9807,8807,0.0,,9001
+16231,9807,8801,0.0,,9102
+16231,9807,8802,-177.0,,9102
+16231,9807,8805,1.0,,9201
+16231,9807,8806,31500000.0,,9001
+16231,9807,8807,0.0,,9001
+16232,9807,8801,0.0,,9102
+16232,9807,8802,-171.0,,9102
+16232,9807,8805,1.0,,9201
+16232,9807,8806,32500000.0,,9001
+16232,9807,8807,0.0,,9001
+16233,9807,8801,0.0,,9102
+16233,9807,8802,-165.0,,9102
+16233,9807,8805,1.0,,9201
+16233,9807,8806,33500000.0,,9001
+16233,9807,8807,0.0,,9001
+16234,9807,8801,0.0,,9102
+16234,9807,8802,-159.0,,9102
+16234,9807,8805,1.0,,9201
+16234,9807,8806,34500000.0,,9001
+16234,9807,8807,0.0,,9001
+16235,9807,8801,0.0,,9102
+16235,9807,8802,-153.0,,9102
+16235,9807,8805,1.0,,9201
+16235,9807,8806,35500000.0,,9001
+16235,9807,8807,0.0,,9001
+16236,9807,8801,0.0,,9102
+16236,9807,8802,-147.0,,9102
+16236,9807,8805,1.0,,9201
+16236,9807,8806,36500000.0,,9001
+16236,9807,8807,0.0,,9001
+16237,9807,8801,0.0,,9102
+16237,9807,8802,-141.0,,9102
+16237,9807,8805,1.0,,9201
+16237,9807,8806,37500000.0,,9001
+16237,9807,8807,0.0,,9001
+16238,9807,8801,0.0,,9102
+16238,9807,8802,-135.0,,9102
+16238,9807,8805,1.0,,9201
+16238,9807,8806,38500000.0,,9001
+16238,9807,8807,0.0,,9001
+16239,9807,8801,0.0,,9102
+16239,9807,8802,-129.0,,9102
+16239,9807,8805,1.0,,9201
+16239,9807,8806,39500000.0,,9001
+16239,9807,8807,0.0,,9001
+16240,9807,8801,0.0,,9102
+16240,9807,8802,-123.0,,9102
+16240,9807,8805,1.0,,9201
+16240,9807,8806,40500000.0,,9001
+16240,9807,8807,0.0,,9001
+16241,9807,8801,0.0,,9102
+16241,9807,8802,-117.0,,9102
+16241,9807,8805,1.0,,9201
+16241,9807,8806,41500000.0,,9001
+16241,9807,8807,0.0,,9001
+16242,9807,8801,0.0,,9102
+16242,9807,8802,-111.0,,9102
+16242,9807,8805,1.0,,9201
+16242,9807,8806,42500000.0,,9001
+16242,9807,8807,0.0,,9001
+16243,9807,8801,0.0,,9102
+16243,9807,8802,-105.0,,9102
+16243,9807,8805,1.0,,9201
+16243,9807,8806,43500000.0,,9001
+16243,9807,8807,0.0,,9001
+16244,9807,8801,0.0,,9102
+16244,9807,8802,-99.0,,9102
+16244,9807,8805,1.0,,9201
+16244,9807,8806,44500000.0,,9001
+16244,9807,8807,0.0,,9001
+16245,9807,8801,0.0,,9102
+16245,9807,8802,-93.0,,9102
+16245,9807,8805,1.0,,9201
+16245,9807,8806,45500000.0,,9001
+16245,9807,8807,0.0,,9001
+16246,9807,8801,0.0,,9102
+16246,9807,8802,-87.0,,9102
+16246,9807,8805,1.0,,9201
+16246,9807,8806,46500000.0,,9001
+16246,9807,8807,0.0,,9001
+16247,9807,8801,0.0,,9102
+16247,9807,8802,-81.0,,9102
+16247,9807,8805,1.0,,9201
+16247,9807,8806,47500000.0,,9001
+16247,9807,8807,0.0,,9001
+16248,9807,8801,0.0,,9102
+16248,9807,8802,-75.0,,9102
+16248,9807,8805,1.0,,9201
+16248,9807,8806,48500000.0,,9001
+16248,9807,8807,0.0,,9001
+16249,9807,8801,0.0,,9102
+16249,9807,8802,-69.0,,9102
+16249,9807,8805,1.0,,9201
+16249,9807,8806,49500000.0,,9001
+16249,9807,8807,0.0,,9001
+16250,9807,8801,0.0,,9102
+16250,9807,8802,-63.0,,9102
+16250,9807,8805,1.0,,9201
+16250,9807,8806,50500000.0,,9001
+16250,9807,8807,0.0,,9001
+16251,9807,8801,0.0,,9102
+16251,9807,8802,-57.0,,9102
+16251,9807,8805,1.0,,9201
+16251,9807,8806,51500000.0,,9001
+16251,9807,8807,0.0,,9001
+16252,9807,8801,0.0,,9102
+16252,9807,8802,-51.0,,9102
+16252,9807,8805,1.0,,9201
+16252,9807,8806,52500000.0,,9001
+16252,9807,8807,0.0,,9001
+16253,9807,8801,0.0,,9102
+16253,9807,8802,-45.0,,9102
+16253,9807,8805,1.0,,9201
+16253,9807,8806,53500000.0,,9001
+16253,9807,8807,0.0,,9001
+16254,9807,8801,0.0,,9102
+16254,9807,8802,-39.0,,9102
+16254,9807,8805,1.0,,9201
+16254,9807,8806,54500000.0,,9001
+16254,9807,8807,0.0,,9001
+16255,9807,8801,0.0,,9102
+16255,9807,8802,-33.0,,9102
+16255,9807,8805,1.0,,9201
+16255,9807,8806,55500000.0,,9001
+16255,9807,8807,0.0,,9001
+16256,9807,8801,0.0,,9102
+16256,9807,8802,-27.0,,9102
+16256,9807,8805,1.0,,9201
+16256,9807,8806,56500000.0,,9001
+16256,9807,8807,0.0,,9001
+16257,9807,8801,0.0,,9102
+16257,9807,8802,-21.0,,9102
+16257,9807,8805,1.0,,9201
+16257,9807,8806,57500000.0,,9001
+16257,9807,8807,0.0,,9001
+16258,9807,8801,0.0,,9102
+16258,9807,8802,-15.0,,9102
+16258,9807,8805,1.0,,9201
+16258,9807,8806,58500000.0,,9001
+16258,9807,8807,0.0,,9001
+16259,9807,8801,0.0,,9102
+16259,9807,8802,-9.0,,9102
+16259,9807,8805,1.0,,9201
+16259,9807,8806,59500000.0,,9001
+16259,9807,8807,0.0,,9001
+16260,9807,8801,0.0,,9102
+16260,9807,8802,-3.0,,9102
+16260,9807,8805,1.0,,9201
+16260,9807,8806,60500000.0,,9001
+16260,9807,8807,0.0,,9001
+16261,9807,8801,0.0,,9102
+16261,9807,8802,3.0,,9102
+16261,9807,8805,1.0,,9201
+16261,9807,8806,1500000.0,,9001
+16261,9807,8807,0.0,,9001
+16262,9807,8801,0.0,,9102
+16262,9807,8802,6.0,,9102
+16262,9807,8805,1.0,,9201
+16262,9807,8806,2500000.0,,9001
+16262,9807,8807,0.0,,9001
+16263,9807,8801,0.0,,9102
+16263,9807,8802,9.0,,9102
+16263,9807,8805,1.0,,9201
+16263,9807,8806,3500000.0,,9001
+16263,9807,8807,0.0,,9001
+16264,9807,8801,0.0,,9102
+16264,9807,8802,12.0,,9102
+16264,9807,8805,1.0,,9201
+16264,9807,8806,4500000.0,,9001
+16264,9807,8807,0.0,,9001
+16265,9807,8801,0.0,,9102
+16265,9807,8802,15.0,,9102
+16265,9807,8805,1.0,,9201
+16265,9807,8806,5500000.0,,9001
+16265,9807,8807,0.0,,9001
+16266,9807,8801,0.0,,9102
+16266,9807,8802,18.0,,9102
+16266,9807,8805,1.0,,9201
+16266,9807,8806,6500000.0,,9001
+16266,9807,8807,0.0,,9001
+16267,9807,8801,0.0,,9102
+16267,9807,8802,21.0,,9102
+16267,9807,8805,1.0,,9201
+16267,9807,8806,7500000.0,,9001
+16267,9807,8807,0.0,,9001
+16268,9807,8801,0.0,,9102
+16268,9807,8802,24.0,,9102
+16268,9807,8805,1.0,,9201
+16268,9807,8806,8500000.0,,9001
+16268,9807,8807,0.0,,9001
+16269,9807,8801,0.0,,9102
+16269,9807,8802,27.0,,9102
+16269,9807,8805,1.0,,9201
+16269,9807,8806,9500000.0,,9001
+16269,9807,8807,0.0,,9001
+16270,9807,8801,0.0,,9102
+16270,9807,8802,30.0,,9102
+16270,9807,8805,1.0,,9201
+16270,9807,8806,10500000.0,,9001
+16270,9807,8807,0.0,,9001
+16271,9807,8801,0.0,,9102
+16271,9807,8802,33.0,,9102
+16271,9807,8805,1.0,,9201
+16271,9807,8806,11500000.0,,9001
+16271,9807,8807,0.0,,9001
+16272,9807,8801,0.0,,9102
+16272,9807,8802,36.0,,9102
+16272,9807,8805,1.0,,9201
+16272,9807,8806,12500000.0,,9001
+16272,9807,8807,0.0,,9001
+16273,9807,8801,0.0,,9102
+16273,9807,8802,39.0,,9102
+16273,9807,8805,1.0,,9201
+16273,9807,8806,13500000.0,,9001
+16273,9807,8807,0.0,,9001
+16274,9807,8801,0.0,,9102
+16274,9807,8802,42.0,,9102
+16274,9807,8805,1.0,,9201
+16274,9807,8806,14500000.0,,9001
+16274,9807,8807,0.0,,9001
+16275,9807,8801,0.0,,9102
+16275,9807,8802,45.0,,9102
+16275,9807,8805,1.0,,9201
+16275,9807,8806,15500000.0,,9001
+16275,9807,8807,0.0,,9001
+16276,9807,8801,0.0,,9102
+16276,9807,8802,48.0,,9102
+16276,9807,8805,1.0,,9201
+16276,9807,8806,16500000.0,,9001
+16276,9807,8807,0.0,,9001
+16277,9807,8801,0.0,,9102
+16277,9807,8802,51.0,,9102
+16277,9807,8805,1.0,,9201
+16277,9807,8806,17500000.0,,9001
+16277,9807,8807,0.0,,9001
+16278,9807,8801,0.0,,9102
+16278,9807,8802,54.0,,9102
+16278,9807,8805,1.0,,9201
+16278,9807,8806,18500000.0,,9001
+16278,9807,8807,0.0,,9001
+16279,9807,8801,0.0,,9102
+16279,9807,8802,57.0,,9102
+16279,9807,8805,1.0,,9201
+16279,9807,8806,19500000.0,,9001
+16279,9807,8807,0.0,,9001
+16280,9807,8801,0.0,,9102
+16280,9807,8802,60.0,,9102
+16280,9807,8805,1.0,,9201
+16280,9807,8806,20500000.0,,9001
+16280,9807,8807,0.0,,9001
+16281,9807,8801,0.0,,9102
+16281,9807,8802,63.0,,9102
+16281,9807,8805,1.0,,9201
+16281,9807,8806,21500000.0,,9001
+16281,9807,8807,0.0,,9001
+16282,9807,8801,0.0,,9102
+16282,9807,8802,66.0,,9102
+16282,9807,8805,1.0,,9201
+16282,9807,8806,22500000.0,,9001
+16282,9807,8807,0.0,,9001
+16283,9807,8801,0.0,,9102
+16283,9807,8802,69.0,,9102
+16283,9807,8805,1.0,,9201
+16283,9807,8806,23500000.0,,9001
+16283,9807,8807,0.0,,9001
+16284,9807,8801,0.0,,9102
+16284,9807,8802,72.0,,9102
+16284,9807,8805,1.0,,9201
+16284,9807,8806,24500000.0,,9001
+16284,9807,8807,0.0,,9001
+16285,9807,8801,0.0,,9102
+16285,9807,8802,75.0,,9102
+16285,9807,8805,1.0,,9201
+16285,9807,8806,25500000.0,,9001
+16285,9807,8807,0.0,,9001
+16286,9807,8801,0.0,,9102
+16286,9807,8802,78.0,,9102
+16286,9807,8805,1.0,,9201
+16286,9807,8806,26500000.0,,9001
+16286,9807,8807,0.0,,9001
+16287,9807,8801,0.0,,9102
+16287,9807,8802,81.0,,9102
+16287,9807,8805,1.0,,9201
+16287,9807,8806,27500000.0,,9001
+16287,9807,8807,0.0,,9001
+16288,9807,8801,0.0,,9102
+16288,9807,8802,84.0,,9102
+16288,9807,8805,1.0,,9201
+16288,9807,8806,28500000.0,,9001
+16288,9807,8807,0.0,,9001
+16289,9807,8801,0.0,,9102
+16289,9807,8802,87.0,,9102
+16289,9807,8805,1.0,,9201
+16289,9807,8806,29500000.0,,9001
+16289,9807,8807,0.0,,9001
+16290,9807,8801,0.0,,9102
+16290,9807,8802,90.0,,9102
+16290,9807,8805,1.0,,9201
+16290,9807,8806,30500000.0,,9001
+16290,9807,8807,0.0,,9001
+16291,9807,8801,0.0,,9102
+16291,9807,8802,93.0,,9102
+16291,9807,8805,1.0,,9201
+16291,9807,8806,31500000.0,,9001
+16291,9807,8807,0.0,,9001
+16292,9807,8801,0.0,,9102
+16292,9807,8802,96.0,,9102
+16292,9807,8805,1.0,,9201
+16292,9807,8806,32500000.0,,9001
+16292,9807,8807,0.0,,9001
+16293,9807,8801,0.0,,9102
+16293,9807,8802,99.0,,9102
+16293,9807,8805,1.0,,9201
+16293,9807,8806,33500000.0,,9001
+16293,9807,8807,0.0,,9001
+16294,9807,8801,0.0,,9102
+16294,9807,8802,102.0,,9102
+16294,9807,8805,1.0,,9201
+16294,9807,8806,34500000.0,,9001
+16294,9807,8807,0.0,,9001
+16295,9807,8801,0.0,,9102
+16295,9807,8802,105.0,,9102
+16295,9807,8805,1.0,,9201
+16295,9807,8806,35500000.0,,9001
+16295,9807,8807,0.0,,9001
+16296,9807,8801,0.0,,9102
+16296,9807,8802,108.0,,9102
+16296,9807,8805,1.0,,9201
+16296,9807,8806,36500000.0,,9001
+16296,9807,8807,0.0,,9001
+16297,9807,8801,0.0,,9102
+16297,9807,8802,111.0,,9102
+16297,9807,8805,1.0,,9201
+16297,9807,8806,37500000.0,,9001
+16297,9807,8807,0.0,,9001
+16298,9807,8801,0.0,,9102
+16298,9807,8802,114.0,,9102
+16298,9807,8805,1.0,,9201
+16298,9807,8806,38500000.0,,9001
+16298,9807,8807,0.0,,9001
+16299,9807,8801,0.0,,9102
+16299,9807,8802,117.0,,9102
+16299,9807,8805,1.0,,9201
+16299,9807,8806,39500000.0,,9001
+16299,9807,8807,0.0,,9001
+16301,9807,8801,0.0,,9102
+16301,9807,8802,3.0,,9102
+16301,9807,8805,1.0,,9201
+16301,9807,8806,500000.0,,9001
+16301,9807,8807,0.0,,9001
+16302,9807,8801,0.0,,9102
+16302,9807,8802,9.0,,9102
+16302,9807,8805,1.0,,9201
+16302,9807,8806,500000.0,,9001
+16302,9807,8807,0.0,,9001
+16303,9807,8801,0.0,,9102
+16303,9807,8802,15.0,,9102
+16303,9807,8805,1.0,,9201
+16303,9807,8806,500000.0,,9001
+16303,9807,8807,0.0,,9001
+16304,9807,8801,0.0,,9102
+16304,9807,8802,21.0,,9102
+16304,9807,8805,1.0,,9201
+16304,9807,8806,500000.0,,9001
+16304,9807,8807,0.0,,9001
+16305,9807,8801,0.0,,9102
+16305,9807,8802,27.0,,9102
+16305,9807,8805,1.0,,9201
+16305,9807,8806,500000.0,,9001
+16305,9807,8807,0.0,,9001
+16306,9807,8801,0.0,,9102
+16306,9807,8802,33.0,,9102
+16306,9807,8805,1.0,,9201
+16306,9807,8806,500000.0,,9001
+16306,9807,8807,0.0,,9001
+16307,9807,8801,0.0,,9102
+16307,9807,8802,39.0,,9102
+16307,9807,8805,1.0,,9201
+16307,9807,8806,500000.0,,9001
+16307,9807,8807,0.0,,9001
+16308,9807,8801,0.0,,9102
+16308,9807,8802,45.0,,9102
+16308,9807,8805,1.0,,9201
+16308,9807,8806,500000.0,,9001
+16308,9807,8807,0.0,,9001
+16309,9807,8801,0.0,,9102
+16309,9807,8802,51.0,,9102
+16309,9807,8805,1.0,,9201
+16309,9807,8806,500000.0,,9001
+16309,9807,8807,0.0,,9001
+16310,9807,8801,0.0,,9102
+16310,9807,8802,57.0,,9102
+16310,9807,8805,1.0,,9201
+16310,9807,8806,500000.0,,9001
+16310,9807,8807,0.0,,9001
+16311,9807,8801,0.0,,9102
+16311,9807,8802,63.0,,9102
+16311,9807,8805,1.0,,9201
+16311,9807,8806,500000.0,,9001
+16311,9807,8807,0.0,,9001
+16312,9807,8801,0.0,,9102
+16312,9807,8802,69.0,,9102
+16312,9807,8805,1.0,,9201
+16312,9807,8806,500000.0,,9001
+16312,9807,8807,0.0,,9001
+16313,9807,8801,0.0,,9102
+16313,9807,8802,75.0,,9102
+16313,9807,8805,1.0,,9201
+16313,9807,8806,500000.0,,9001
+16313,9807,8807,0.0,,9001
+16314,9807,8801,0.0,,9102
+16314,9807,8802,81.0,,9102
+16314,9807,8805,1.0,,9201
+16314,9807,8806,500000.0,,9001
+16314,9807,8807,0.0,,9001
+16315,9807,8801,0.0,,9102
+16315,9807,8802,87.0,,9102
+16315,9807,8805,1.0,,9201
+16315,9807,8806,500000.0,,9001
+16315,9807,8807,0.0,,9001
+16316,9807,8801,0.0,,9102
+16316,9807,8802,93.0,,9102
+16316,9807,8805,1.0,,9201
+16316,9807,8806,500000.0,,9001
+16316,9807,8807,0.0,,9001
+16317,9807,8801,0.0,,9102
+16317,9807,8802,99.0,,9102
+16317,9807,8805,1.0,,9201
+16317,9807,8806,500000.0,,9001
+16317,9807,8807,0.0,,9001
+16318,9807,8801,0.0,,9102
+16318,9807,8802,105.0,,9102
+16318,9807,8805,1.0,,9201
+16318,9807,8806,500000.0,,9001
+16318,9807,8807,0.0,,9001
+16319,9807,8801,0.0,,9102
+16319,9807,8802,111.0,,9102
+16319,9807,8805,1.0,,9201
+16319,9807,8806,500000.0,,9001
+16319,9807,8807,0.0,,9001
+16320,9807,8801,0.0,,9102
+16320,9807,8802,117.0,,9102
+16320,9807,8805,1.0,,9201
+16320,9807,8806,500000.0,,9001
+16320,9807,8807,0.0,,9001
+16321,9807,8801,0.0,,9102
+16321,9807,8802,123.0,,9102
+16321,9807,8805,1.0,,9201
+16321,9807,8806,500000.0,,9001
+16321,9807,8807,0.0,,9001
+16322,9807,8801,0.0,,9102
+16322,9807,8802,129.0,,9102
+16322,9807,8805,1.0,,9201
+16322,9807,8806,500000.0,,9001
+16322,9807,8807,0.0,,9001
+16323,9807,8801,0.0,,9102
+16323,9807,8802,135.0,,9102
+16323,9807,8805,1.0,,9201
+16323,9807,8806,500000.0,,9001
+16323,9807,8807,0.0,,9001
+16324,9807,8801,0.0,,9102
+16324,9807,8802,141.0,,9102
+16324,9807,8805,1.0,,9201
+16324,9807,8806,500000.0,,9001
+16324,9807,8807,0.0,,9001
+16325,9807,8801,0.0,,9102
+16325,9807,8802,147.0,,9102
+16325,9807,8805,1.0,,9201
+16325,9807,8806,500000.0,,9001
+16325,9807,8807,0.0,,9001
+16326,9807,8801,0.0,,9102
+16326,9807,8802,153.0,,9102
+16326,9807,8805,1.0,,9201
+16326,9807,8806,500000.0,,9001
+16326,9807,8807,0.0,,9001
+16327,9807,8801,0.0,,9102
+16327,9807,8802,159.0,,9102
+16327,9807,8805,1.0,,9201
+16327,9807,8806,500000.0,,9001
+16327,9807,8807,0.0,,9001
+16328,9807,8801,0.0,,9102
+16328,9807,8802,165.0,,9102
+16328,9807,8805,1.0,,9201
+16328,9807,8806,500000.0,,9001
+16328,9807,8807,0.0,,9001
+16329,9807,8801,0.0,,9102
+16329,9807,8802,171.0,,9102
+16329,9807,8805,1.0,,9201
+16329,9807,8806,500000.0,,9001
+16329,9807,8807,0.0,,9001
+16330,9807,8801,0.0,,9102
+16330,9807,8802,177.0,,9102
+16330,9807,8805,1.0,,9201
+16330,9807,8806,500000.0,,9001
+16330,9807,8807,0.0,,9001
+16331,9807,8801,0.0,,9102
+16331,9807,8802,-177.0,,9102
+16331,9807,8805,1.0,,9201
+16331,9807,8806,500000.0,,9001
+16331,9807,8807,0.0,,9001
+16332,9807,8801,0.0,,9102
+16332,9807,8802,-171.0,,9102
+16332,9807,8805,1.0,,9201
+16332,9807,8806,500000.0,,9001
+16332,9807,8807,0.0,,9001
+16333,9807,8801,0.0,,9102
+16333,9807,8802,-165.0,,9102
+16333,9807,8805,1.0,,9201
+16333,9807,8806,500000.0,,9001
+16333,9807,8807,0.0,,9001
+16334,9807,8801,0.0,,9102
+16334,9807,8802,-159.0,,9102
+16334,9807,8805,1.0,,9201
+16334,9807,8806,500000.0,,9001
+16334,9807,8807,0.0,,9001
+16335,9807,8801,0.0,,9102
+16335,9807,8802,-153.0,,9102
+16335,9807,8805,1.0,,9201
+16335,9807,8806,500000.0,,9001
+16335,9807,8807,0.0,,9001
+16336,9807,8801,0.0,,9102
+16336,9807,8802,-147.0,,9102
+16336,9807,8805,1.0,,9201
+16336,9807,8806,500000.0,,9001
+16336,9807,8807,0.0,,9001
+16337,9807,8801,0.0,,9102
+16337,9807,8802,-141.0,,9102
+16337,9807,8805,1.0,,9201
+16337,9807,8806,500000.0,,9001
+16337,9807,8807,0.0,,9001
+16338,9807,8801,0.0,,9102
+16338,9807,8802,-135.0,,9102
+16338,9807,8805,1.0,,9201
+16338,9807,8806,500000.0,,9001
+16338,9807,8807,0.0,,9001
+16339,9807,8801,0.0,,9102
+16339,9807,8802,-129.0,,9102
+16339,9807,8805,1.0,,9201
+16339,9807,8806,500000.0,,9001
+16339,9807,8807,0.0,,9001
+16340,9807,8801,0.0,,9102
+16340,9807,8802,-123.0,,9102
+16340,9807,8805,1.0,,9201
+16340,9807,8806,500000.0,,9001
+16340,9807,8807,0.0,,9001
+16341,9807,8801,0.0,,9102
+16341,9807,8802,-117.0,,9102
+16341,9807,8805,1.0,,9201
+16341,9807,8806,500000.0,,9001
+16341,9807,8807,0.0,,9001
+16342,9807,8801,0.0,,9102
+16342,9807,8802,-111.0,,9102
+16342,9807,8805,1.0,,9201
+16342,9807,8806,500000.0,,9001
+16342,9807,8807,0.0,,9001
+16343,9807,8801,0.0,,9102
+16343,9807,8802,-105.0,,9102
+16343,9807,8805,1.0,,9201
+16343,9807,8806,500000.0,,9001
+16343,9807,8807,0.0,,9001
+16344,9807,8801,0.0,,9102
+16344,9807,8802,-99.0,,9102
+16344,9807,8805,1.0,,9201
+16344,9807,8806,500000.0,,9001
+16344,9807,8807,0.0,,9001
+16345,9807,8801,0.0,,9102
+16345,9807,8802,-93.0,,9102
+16345,9807,8805,1.0,,9201
+16345,9807,8806,500000.0,,9001
+16345,9807,8807,0.0,,9001
+16346,9807,8801,0.0,,9102
+16346,9807,8802,-87.0,,9102
+16346,9807,8805,1.0,,9201
+16346,9807,8806,500000.0,,9001
+16346,9807,8807,0.0,,9001
+16347,9807,8801,0.0,,9102
+16347,9807,8802,-81.0,,9102
+16347,9807,8805,1.0,,9201
+16347,9807,8806,500000.0,,9001
+16347,9807,8807,0.0,,9001
+16348,9807,8801,0.0,,9102
+16348,9807,8802,-75.0,,9102
+16348,9807,8805,1.0,,9201
+16348,9807,8806,500000.0,,9001
+16348,9807,8807,0.0,,9001
+16349,9807,8801,0.0,,9102
+16349,9807,8802,-69.0,,9102
+16349,9807,8805,1.0,,9201
+16349,9807,8806,500000.0,,9001
+16349,9807,8807,0.0,,9001
+16350,9807,8801,0.0,,9102
+16350,9807,8802,-63.0,,9102
+16350,9807,8805,1.0,,9201
+16350,9807,8806,500000.0,,9001
+16350,9807,8807,0.0,,9001
+16351,9807,8801,0.0,,9102
+16351,9807,8802,-57.0,,9102
+16351,9807,8805,1.0,,9201
+16351,9807,8806,500000.0,,9001
+16351,9807,8807,0.0,,9001
+16352,9807,8801,0.0,,9102
+16352,9807,8802,-51.0,,9102
+16352,9807,8805,1.0,,9201
+16352,9807,8806,500000.0,,9001
+16352,9807,8807,0.0,,9001
+16353,9807,8801,0.0,,9102
+16353,9807,8802,-45.0,,9102
+16353,9807,8805,1.0,,9201
+16353,9807,8806,500000.0,,9001
+16353,9807,8807,0.0,,9001
+16354,9807,8801,0.0,,9102
+16354,9807,8802,-39.0,,9102
+16354,9807,8805,1.0,,9201
+16354,9807,8806,500000.0,,9001
+16354,9807,8807,0.0,,9001
+16355,9807,8801,0.0,,9102
+16355,9807,8802,-33.0,,9102
+16355,9807,8805,1.0,,9201
+16355,9807,8806,500000.0,,9001
+16355,9807,8807,0.0,,9001
+16356,9807,8801,0.0,,9102
+16356,9807,8802,-27.0,,9102
+16356,9807,8805,1.0,,9201
+16356,9807,8806,500000.0,,9001
+16356,9807,8807,0.0,,9001
+16357,9807,8801,0.0,,9102
+16357,9807,8802,-21.0,,9102
+16357,9807,8805,1.0,,9201
+16357,9807,8806,500000.0,,9001
+16357,9807,8807,0.0,,9001
+16358,9807,8801,0.0,,9102
+16358,9807,8802,-15.0,,9102
+16358,9807,8805,1.0,,9201
+16358,9807,8806,500000.0,,9001
+16358,9807,8807,0.0,,9001
+16359,9807,8801,0.0,,9102
+16359,9807,8802,-9.0,,9102
+16359,9807,8805,1.0,,9201
+16359,9807,8806,500000.0,,9001
+16359,9807,8807,0.0,,9001
+16360,9807,8801,0.0,,9102
+16360,9807,8802,-3.0,,9102
+16360,9807,8805,1.0,,9201
+16360,9807,8806,500000.0,,9001
+16360,9807,8807,0.0,,9001
+16361,9807,8801,0.0,,9102
+16361,9807,8802,3.0,,9102
+16361,9807,8805,1.0,,9201
+16361,9807,8806,500000.0,,9001
+16361,9807,8807,0.0,,9001
+16362,9807,8801,0.0,,9102
+16362,9807,8802,6.0,,9102
+16362,9807,8805,1.0,,9201
+16362,9807,8806,500000.0,,9001
+16362,9807,8807,0.0,,9001
+16363,9807,8801,0.0,,9102
+16363,9807,8802,9.0,,9102
+16363,9807,8805,1.0,,9201
+16363,9807,8806,500000.0,,9001
+16363,9807,8807,0.0,,9001
+16364,9807,8801,0.0,,9102
+16364,9807,8802,12.0,,9102
+16364,9807,8805,1.0,,9201
+16364,9807,8806,500000.0,,9001
+16364,9807,8807,0.0,,9001
+16365,9807,8801,0.0,,9102
+16365,9807,8802,15.0,,9102
+16365,9807,8805,1.0,,9201
+16365,9807,8806,500000.0,,9001
+16365,9807,8807,0.0,,9001
+16366,9807,8801,0.0,,9102
+16366,9807,8802,18.0,,9102
+16366,9807,8805,1.0,,9201
+16366,9807,8806,500000.0,,9001
+16366,9807,8807,0.0,,9001
+16367,9807,8801,0.0,,9102
+16367,9807,8802,21.0,,9102
+16367,9807,8805,1.0,,9201
+16367,9807,8806,500000.0,,9001
+16367,9807,8807,0.0,,9001
+16368,9807,8801,0.0,,9102
+16368,9807,8802,24.0,,9102
+16368,9807,8805,1.0,,9201
+16368,9807,8806,500000.0,,9001
+16368,9807,8807,0.0,,9001
+16369,9807,8801,0.0,,9102
+16369,9807,8802,27.0,,9102
+16369,9807,8805,1.0,,9201
+16369,9807,8806,500000.0,,9001
+16369,9807,8807,0.0,,9001
+16370,9807,8801,0.0,,9102
+16370,9807,8802,30.0,,9102
+16370,9807,8805,1.0,,9201
+16370,9807,8806,500000.0,,9001
+16370,9807,8807,0.0,,9001
+16371,9807,8801,0.0,,9102
+16371,9807,8802,33.0,,9102
+16371,9807,8805,1.0,,9201
+16371,9807,8806,500000.0,,9001
+16371,9807,8807,0.0,,9001
+16372,9807,8801,0.0,,9102
+16372,9807,8802,36.0,,9102
+16372,9807,8805,1.0,,9201
+16372,9807,8806,500000.0,,9001
+16372,9807,8807,0.0,,9001
+16373,9807,8801,0.0,,9102
+16373,9807,8802,39.0,,9102
+16373,9807,8805,1.0,,9201
+16373,9807,8806,500000.0,,9001
+16373,9807,8807,0.0,,9001
+16374,9807,8801,0.0,,9102
+16374,9807,8802,42.0,,9102
+16374,9807,8805,1.0,,9201
+16374,9807,8806,500000.0,,9001
+16374,9807,8807,0.0,,9001
+16375,9807,8801,0.0,,9102
+16375,9807,8802,45.0,,9102
+16375,9807,8805,1.0,,9201
+16375,9807,8806,500000.0,,9001
+16375,9807,8807,0.0,,9001
+16376,9807,8801,0.0,,9102
+16376,9807,8802,48.0,,9102
+16376,9807,8805,1.0,,9001
+16376,9807,8806,500000.0,,9001
+16376,9807,8807,0.0,,9201
+16377,9807,8801,0.0,,9102
+16377,9807,8802,51.0,,9102
+16377,9807,8805,1.0,,9201
+16377,9807,8806,500000.0,,9001
+16377,9807,8807,0.0,,9001
+16378,9807,8801,0.0,,9102
+16378,9807,8802,54.0,,9102
+16378,9807,8805,1.0,,9201
+16378,9807,8806,500000.0,,9001
+16378,9807,8807,0.0,,9001
+16379,9807,8801,0.0,,9102
+16379,9807,8802,57.0,,9102
+16379,9807,8805,1.0,,9201
+16379,9807,8806,500000.0,,9001
+16379,9807,8807,0.0,,9001
+16380,9807,8801,0.0,,9102
+16380,9807,8802,60.0,,9102
+16380,9807,8805,1.0,,9201
+16380,9807,8806,500000.0,,9001
+16380,9807,8807,0.0,,9001
+16381,9807,8801,0.0,,9102
+16381,9807,8802,63.0,,9102
+16381,9807,8805,1.0,,9201
+16381,9807,8806,500000.0,,9001
+16381,9807,8807,0.0,,9001
+16382,9807,8801,0.0,,9102
+16382,9807,8802,66.0,,9102
+16382,9807,8805,1.0,,9201
+16382,9807,8806,500000.0,,9001
+16382,9807,8807,0.0,,9001
+16383,9807,8801,0.0,,9102
+16383,9807,8802,69.0,,9102
+16383,9807,8805,1.0,,9201
+16383,9807,8806,500000.0,,9001
+16383,9807,8807,0.0,,9001
+16384,9807,8801,0.0,,9102
+16384,9807,8802,72.0,,9102
+16384,9807,8805,1.0,,9201
+16384,9807,8806,500000.0,,9001
+16384,9807,8807,0.0,,9001
+16385,9807,8801,0.0,,9102
+16385,9807,8802,75.0,,9102
+16385,9807,8805,1.0,,9201
+16385,9807,8806,500000.0,,9001
+16385,9807,8807,0.0,,9001
+16386,9807,8801,0.0,,9102
+16386,9807,8802,78.0,,9102
+16386,9807,8805,1.0,,9201
+16386,9807,8806,500000.0,,9001
+16386,9807,8807,0.0,,9001
+16387,9807,8801,0.0,,9102
+16387,9807,8802,81.0,,9102
+16387,9807,8805,1.0,,9201
+16387,9807,8806,500000.0,,9001
+16387,9807,8807,0.0,,9001
+16388,9807,8801,0.0,,9102
+16388,9807,8802,84.0,,9102
+16388,9807,8805,1.0,,9201
+16388,9807,8806,500000.0,,9001
+16388,9807,8807,0.0,,9001
+16389,9807,8801,0.0,,9102
+16389,9807,8802,87.0,,9102
+16389,9807,8805,1.0,,9201
+16389,9807,8806,500000.0,,9001
+16389,9807,8807,0.0,,9001
+16390,9807,8801,0.0,,9102
+16390,9807,8802,90.0,,9102
+16390,9807,8805,1.0,,9201
+16390,9807,8806,500000.0,,9001
+16390,9807,8807,0.0,,9001
+16391,9807,8801,0.0,,9102
+16391,9807,8802,93.0,,9102
+16391,9807,8805,1.0,,9201
+16391,9807,8806,500000.0,,9001
+16391,9807,8807,0.0,,9001
+16392,9807,8801,0.0,,9102
+16392,9807,8802,96.0,,9102
+16392,9807,8805,1.0,,9201
+16392,9807,8806,500000.0,,9001
+16392,9807,8807,0.0,,9001
+16393,9807,8801,0.0,,9102
+16393,9807,8802,99.0,,9102
+16393,9807,8805,1.0,,9201
+16393,9807,8806,500000.0,,9001
+16393,9807,8807,0.0,,9001
+16394,9807,8801,0.0,,9102
+16394,9807,8802,102.0,,9102
+16394,9807,8805,1.0,,9201
+16394,9807,8806,500000.0,,9001
+16394,9807,8807,0.0,,9001
+16395,9807,8801,0.0,,9102
+16395,9807,8802,105.0,,9102
+16395,9807,8805,1.0,,9201
+16395,9807,8806,500000.0,,9001
+16395,9807,8807,0.0,,9001
+16396,9807,8801,0.0,,9102
+16396,9807,8802,108.0,,9102
+16396,9807,8805,1.0,,9201
+16396,9807,8806,500000.0,,9001
+16396,9807,8807,0.0,,9001
+16397,9807,8801,0.0,,9102
+16397,9807,8802,111.0,,9102
+16397,9807,8805,1.0,,9201
+16397,9807,8806,500000.0,,9001
+16397,9807,8807,0.0,,9001
+16398,9807,8801,0.0,,9102
+16398,9807,8802,114.0,,9102
+16398,9807,8805,1.0,,9201
+16398,9807,8806,500000.0,,9001
+16398,9807,8807,0.0,,9001
+16399,9807,8801,0.0,,9102
+16399,9807,8802,117.0,,9102
+16399,9807,8805,1.0,,9201
+16399,9807,8806,500000.0,,9001
+16399,9807,8807,0.0,,9001
+16400,9807,8801,0.0,,9102
+16400,9807,8802,0.0,,9102
+16400,9807,8805,0.9996,,9201
+16400,9807,8806,500000.0,,9001
+16400,9807,8807,0.0,,9001
+16405,9807,8801,0.0,,9102
+16405,9807,8802,5.0,,9102
+16405,9807,8805,0.9996,,9201
+16405,9807,8806,500000.0,,9001
+16405,9807,8807,0.0,,9001
+16406,9807,8801,0.0,,9102
+16406,9807,8802,6.0,,9102
+16406,9807,8805,0.9996,,9201
+16406,9807,8806,500000.0,,9001
+16406,9807,8807,0.0,,9001
+16411,9807,8801,0.0,,9102
+16411,9807,8802,11.0,,9102
+16411,9807,8805,0.9996,,9201
+16411,9807,8806,500000.0,,9001
+16411,9807,8807,0.0,,9001
+16412,9807,8801,0.0,,9102
+16412,9807,8802,12.0,,9102
+16412,9807,8805,0.9996,,9201
+16412,9807,8806,500000.0,,9001
+16412,9807,8807,0.0,,9001
+16413,9807,8801,0.0,,9102
+16413,9807,8802,13.0,,9102
+16413,9807,8805,0.9996,,9201
+16413,9807,8806,500000.0,,9001
+16413,9807,8807,0.0,,9001
+16430,9807,8801,0.0,,9102
+16430,9807,8802,30.0,,9102
+16430,9807,8805,0.9996,,9201
+16430,9807,8806,500000.0,,9001
+16430,9807,8807,0.0,,9001
+16506,9807,8801,0.0,,9102
+16506,9807,8802,106.0,,9102
+16506,9807,8805,0.9996,,9201
+16506,9807,8806,500000.0,,9001
+16506,9807,8807,0.0,,9001
+16586,9807,8801,0.0,,9102
+16586,9807,8802,106.0,,9102
+16586,9807,8805,1.0,,9201
+16586,9807,8806,500000.0,,9001
+16586,9807,8807,0.0,,9001
+16611,9807,8801,0.0,,9110
+16611,9807,8802,11.3,,9110
+16611,9807,8805,0.9996,,9201
+16611,9807,8806,500000.0,,9001
+16611,9807,8807,10000000.0,,9001
+16612,9807,8801,0.0,,9102
+16612,9807,8802,12.0,,9102
+16612,9807,8805,0.9996,,9201
+16612,9807,8806,500000.0,,9001
+16612,9807,8807,10000000.0,,9001
+16636,9807,8801,0.0,,9102
+16636,9807,8802,36.0,,9102
+16636,9807,8805,0.9996,,9201
+16636,9807,8806,500000.0,,9001
+16636,9807,8807,10000000.0,,9001
+16709,9807,8801,0.0,,9102
+16709,9807,8802,109.0,,9102
+16709,9807,8805,0.9996,,9201
+16709,9807,8806,500000.0,,9001
+16709,9807,8807,10000000.0,,9001
+16716,9807,8801,0.0,,9102
+16716,9807,8802,116.0,,9102
+16716,9807,8805,0.9996,,9201
+16716,9807,8806,500000.0,,9001
+16716,9807,8807,10000000.0,,9001
+16732,9807,8801,0.0,,9102
+16732,9807,8802,132.0,,9102
+16732,9807,8805,0.9996,,9201
+16732,9807,8806,500000.0,,9001
+16732,9807,8807,10000000.0,,9001
+17001,9807,8801,0.0,,9102
+17001,9807,8802,-1.0,,9102
+17001,9807,8805,0.9996,,9201
+17001,9807,8806,500000.0,,9001
+17001,9807,8807,0.0,,9001
+17005,9807,8801,0.0,,9102
+17005,9807,8802,-5.0,,9102
+17005,9807,8805,0.9996,,9201
+17005,9807,8806,500000.0,,9001
+17005,9807,8807,0.0,,9001
+17054,9807,8801,0.0,,9102
+17054,9807,8802,-54.0,,9102
+17054,9807,8805,0.9996,,9201
+17054,9807,8806,500000.0,,9001
+17054,9807,8807,0.0,,9001
+17348,9807,8801,0.0,,9102
+17348,9807,8802,105.0,,9102
+17348,9807,8805,0.9996,,9201
+17348,9807,8806,500000.0,,9001
+17348,9807,8807,10000000.0,,9001
+17349,9807,8801,0.0,,9102
+17349,9807,8802,111.0,,9102
+17349,9807,8805,0.9996,,9201
+17349,9807,8806,500000.0,,9001
+17349,9807,8807,10000000.0,,9001
+17350,9807,8801,0.0,,9102
+17350,9807,8802,117.0,,9102
+17350,9807,8805,0.9996,,9201
+17350,9807,8806,500000.0,,9001
+17350,9807,8807,10000000.0,,9001
+17351,9807,8801,0.0,,9102
+17351,9807,8802,123.0,,9102
+17351,9807,8805,0.9996,,9201
+17351,9807,8806,500000.0,,9001
+17351,9807,8807,10000000.0,,9001
+17352,9807,8801,0.0,,9102
+17352,9807,8802,129.0,,9102
+17352,9807,8805,0.9996,,9201
+17352,9807,8806,500000.0,,9001
+17352,9807,8807,10000000.0,,9001
+17353,9807,8801,0.0,,9102
+17353,9807,8802,135.0,,9102
+17353,9807,8805,0.9996,,9201
+17353,9807,8806,500000.0,,9001
+17353,9807,8807,10000000.0,,9001
+17354,9807,8801,0.0,,9102
+17354,9807,8802,141.0,,9102
+17354,9807,8805,0.9996,,9201
+17354,9807,8806,500000.0,,9001
+17354,9807,8807,10000000.0,,9001
+17355,9807,8801,0.0,,9102
+17355,9807,8802,147.0,,9102
+17355,9807,8805,0.9996,,9201
+17355,9807,8806,500000.0,,9001
+17355,9807,8807,10000000.0,,9001
+17356,9807,8801,0.0,,9102
+17356,9807,8802,153.0,,9102
+17356,9807,8805,0.9996,,9201
+17356,9807,8806,500000.0,,9001
+17356,9807,8807,10000000.0,,9001
+17357,9807,8801,0.0,,9102
+17357,9807,8802,159.0,,9102
+17357,9807,8805,0.9996,,9201
+17357,9807,8806,500000.0,,9001
+17357,9807,8807,10000000.0,,9001
+17358,9807,8801,0.0,,9102
+17358,9807,8802,165.0,,9102
+17358,9807,8805,0.9996,,9201
+17358,9807,8806,500000.0,,9001
+17358,9807,8807,10000000.0,,9001
+17448,9807,8801,0.0,,9102
+17448,9807,8802,105.0,,9102
+17448,9807,8805,0.9996,,9201
+17448,9807,8806,500000.0,,9001
+17448,9807,8807,10000000.0,,9001
+17449,9807,8801,0.0,,9102
+17449,9807,8802,111.0,,9102
+17449,9807,8805,0.9996,,9201
+17449,9807,8806,500000.0,,9001
+17449,9807,8807,10000000.0,,9001
+17450,9807,8801,0.0,,9102
+17450,9807,8802,117.0,,9102
+17450,9807,8805,0.9996,,9201
+17450,9807,8806,500000.0,,9001
+17450,9807,8807,10000000.0,,9001
+17451,9807,8801,0.0,,9102
+17451,9807,8802,123.0,,9102
+17451,9807,8805,0.9996,,9201
+17451,9807,8806,500000.0,,9001
+17451,9807,8807,10000000.0,,9001
+17452,9807,8801,0.0,,9102
+17452,9807,8802,129.0,,9102
+17452,9807,8805,0.9996,,9201
+17452,9807,8806,500000.0,,9001
+17452,9807,8807,10000000.0,,9001
+17453,9807,8801,0.0,,9102
+17453,9807,8802,135.0,,9102
+17453,9807,8805,0.9996,,9201
+17453,9807,8806,500000.0,,9001
+17453,9807,8807,10000000.0,,9001
+17454,9807,8801,0.0,,9102
+17454,9807,8802,141.0,,9102
+17454,9807,8805,0.9996,,9201
+17454,9807,8806,500000.0,,9001
+17454,9807,8807,10000000.0,,9001
+17455,9807,8801,0.0,,9102
+17455,9807,8802,147.0,,9102
+17455,9807,8805,0.9996,,9201
+17455,9807,8806,500000.0,,9001
+17455,9807,8807,10000000.0,,9001
+17456,9807,8801,0.0,,9102
+17456,9807,8802,153.0,,9102
+17456,9807,8805,0.9996,,9201
+17456,9807,8806,500000.0,,9001
+17456,9807,8807,10000000.0,,9001
+17457,9807,8801,0.0,,9102
+17457,9807,8802,159.0,,9102
+17457,9807,8805,0.9996,,9201
+17457,9807,8806,500000.0,,9001
+17457,9807,8807,10000000.0,,9001
+17458,9807,8801,0.0,,9102
+17458,9807,8802,165.0,,9102
+17458,9807,8805,0.9996,,9201
+17458,9807,8806,500000.0,,9001
+17458,9807,8807,10000000.0,,9001
+17515,9808,8801,0.0,,9102
+17515,9808,8802,15.0,,9102
+17515,9808,8805,1.0,,9201
+17515,9808,8806,0.0,,9001
+17515,9808,8807,0.0,,9001
+17517,9808,8801,0.0,,9102
+17517,9808,8802,17.0,,9102
+17517,9808,8805,1.0,,9201
+17517,9808,8806,0.0,,9001
+17517,9808,8807,0.0,,9001
+17519,9808,8801,0.0,,9102
+17519,9808,8802,19.0,,9102
+17519,9808,8805,1.0,,9201
+17519,9808,8806,0.0,,9001
+17519,9808,8807,0.0,,9001
+17521,9808,8801,0.0,,9102
+17521,9808,8802,21.0,,9102
+17521,9808,8805,1.0,,9201
+17521,9808,8806,0.0,,9001
+17521,9808,8807,0.0,,9001
+17523,9808,8801,0.0,,9102
+17523,9808,8802,23.0,,9102
+17523,9808,8805,1.0,,9201
+17523,9808,8806,0.0,,9001
+17523,9808,8807,0.0,,9001
+17525,9808,8801,0.0,,9102
+17525,9808,8802,25.0,,9102
+17525,9808,8805,1.0,,9201
+17525,9808,8806,0.0,,9001
+17525,9808,8807,0.0,,9001
+17527,9808,8801,0.0,,9102
+17527,9808,8802,27.0,,9102
+17527,9808,8805,1.0,,9201
+17527,9808,8806,0.0,,9001
+17527,9808,8807,0.0,,9001
+17529,9808,8801,0.0,,9102
+17529,9808,8802,29.0,,9102
+17529,9808,8805,1.0,,9201
+17529,9808,8806,0.0,,9001
+17529,9808,8807,0.0,,9001
+17531,9808,8801,0.0,,9102
+17531,9808,8802,31.0,,9102
+17531,9808,8805,1.0,,9201
+17531,9808,8806,0.0,,9001
+17531,9808,8807,0.0,,9001
+17533,9808,8801,0.0,,9102
+17533,9808,8802,33.0,,9102
+17533,9808,8805,1.0,,9201
+17533,9808,8806,0.0,,9001
+17533,9808,8807,0.0,,9001
+17611,9808,8801,-22.0,,9102
+17611,9808,8802,11.0,,9102
+17611,9808,8805,1.0,,9201
+17611,9808,8806,0.0,,9031
+17611,9808,8807,0.0,,9031
+17613,9808,8801,-22.0,,9102
+17613,9808,8802,13.0,,9102
+17613,9808,8805,1.0,,9201
+17613,9808,8806,0.0,,9031
+17613,9808,8807,0.0,,9031
+17615,9808,8801,-22.0,,9102
+17615,9808,8802,15.0,,9102
+17615,9808,8805,1.0,,9201
+17615,9808,8806,0.0,,9031
+17615,9808,8807,0.0,,9031
+17617,9808,8801,-22.0,,9102
+17617,9808,8802,17.0,,9102
+17617,9808,8805,1.0,,9201
+17617,9808,8806,0.0,,9031
+17617,9808,8807,0.0,,9031
+17619,9808,8801,-22.0,,9102
+17619,9808,8802,19.0,,9102
+17619,9808,8805,1.0,,9201
+17619,9808,8806,0.0,,9031
+17619,9808,8807,0.0,,9031
+17621,9808,8801,-22.0,,9102
+17621,9808,8802,21.0,,9102
+17621,9808,8805,1.0,,9201
+17621,9808,8806,0.0,,9031
+17621,9808,8807,0.0,,9031
+17623,9808,8801,-22.0,,9102
+17623,9808,8802,23.0,,9102
+17623,9808,8805,1.0,,9201
+17623,9808,8806,0.0,,9031
+17623,9808,8807,0.0,,9031
+17625,9808,8801,-22.0,,9102
+17625,9808,8802,25.0,,9102
+17625,9808,8805,1.0,,9201
+17625,9808,8806,0.0,,9031
+17625,9808,8807,0.0,,9031
+17700,9807,8801,0.0,,9110
+17700,9807,8802,-55.3,,9110
+17700,9807,8805,0.9999,,9201
+17700,9807,8806,304800.0,,9001
+17700,9807,8807,0.0,,9001
+17701,9807,8801,0.0,,9102
+17701,9807,8802,-53.0,,9102
+17701,9807,8805,0.9999,,9201
+17701,9807,8806,304800.0,,9001
+17701,9807,8807,0.0,,9001
+17702,9807,8801,0.0,,9102
+17702,9807,8802,-56.0,,9102
+17702,9807,8805,0.9999,,9201
+17702,9807,8806,304800.0,,9001
+17702,9807,8807,0.0,,9001
+17703,9807,8801,0.0,,9110
+17703,9807,8802,-58.3,,9110
+17703,9807,8805,0.9999,,9201
+17703,9807,8806,304800.0,,9001
+17703,9807,8807,0.0,,9001
+17704,9807,8801,0.0,,9110
+17704,9807,8802,-61.3,,9110
+17704,9807,8805,0.9999,,9201
+17704,9807,8806,304800.0,,9001
+17704,9807,8807,0.0,,9001
+17705,9807,8801,0.0,,9110
+17705,9807,8802,-64.3,,9110
+17705,9807,8805,0.9999,,9201
+17705,9807,8806,304800.0,,9001
+17705,9807,8807,0.0,,9001
+17706,9807,8801,0.0,,9110
+17706,9807,8802,-67.3,,9110
+17706,9807,8805,0.9999,,9201
+17706,9807,8806,304800.0,,9001
+17706,9807,8807,0.0,,9001
+17707,9807,8801,0.0,,9110
+17707,9807,8802,-70.3,,9110
+17707,9807,8805,0.9999,,9201
+17707,9807,8806,304800.0,,9001
+17707,9807,8807,0.0,,9001
+17708,9807,8801,0.0,,9110
+17708,9807,8802,-73.3,,9110
+17708,9807,8805,0.9999,,9201
+17708,9807,8806,304800.0,,9001
+17708,9807,8807,0.0,,9001
+17709,9807,8801,0.0,,9110
+17709,9807,8802,-76.3,,9110
+17709,9807,8805,0.9999,,9201
+17709,9807,8806,304800.0,,9001
+17709,9807,8807,0.0,,9001
+17710,9807,8801,0.0,,9110
+17710,9807,8802,-79.3,,9110
+17710,9807,8805,0.9999,,9201
+17710,9807,8806,304800.0,,9001
+17710,9807,8807,0.0,,9001
+17711,9807,8801,0.0,,9110
+17711,9807,8802,-82.3,,9110
+17711,9807,8805,0.9999,,9201
+17711,9807,8806,304800.0,,9001
+17711,9807,8807,0.0,,9001
+17712,9807,8801,0.0,,9102
+17712,9807,8802,-81.0,,9102
+17712,9807,8805,0.9999,,9201
+17712,9807,8806,304800.0,,9001
+17712,9807,8807,0.0,,9001
+17713,9807,8801,0.0,,9102
+17713,9807,8802,-84.0,,9102
+17713,9807,8805,0.9999,,9201
+17713,9807,8806,304800.0,,9001
+17713,9807,8807,0.0,,9001
+17714,9807,8801,0.0,,9102
+17714,9807,8802,-87.0,,9102
+17714,9807,8805,0.9999,,9201
+17714,9807,8806,304800.0,,9001
+17714,9807,8807,0.0,,9001
+17715,9807,8801,0.0,,9102
+17715,9807,8802,-90.0,,9102
+17715,9807,8805,0.9999,,9201
+17715,9807,8806,304800.0,,9001
+17715,9807,8807,0.0,,9001
+17716,9807,8801,0.0,,9102
+17716,9807,8802,-93.0,,9102
+17716,9807,8805,0.9999,,9201
+17716,9807,8806,304800.0,,9001
+17716,9807,8807,0.0,,9001
+17717,9807,8801,0.0,,9102
+17717,9807,8802,-96.0,,9102
+17717,9807,8805,0.9999,,9201
+17717,9807,8806,304800.0,,9001
+17717,9807,8807,0.0,,9001
+17794,9807,8801,0.0,,9110
+17794,9807,8802,-61.3,,9110
+17794,9807,8805,0.9999,,9201
+17794,9807,8806,4500000.0,,9001
+17794,9807,8807,0.0,,9001
+17795,9807,8801,0.0,,9110
+17795,9807,8802,-64.3,,9110
+17795,9807,8805,0.9999,,9201
+17795,9807,8806,5500000.0,,9001
+17795,9807,8807,0.0,,9001
+17801,9807,8801,33.0,,9110
+17801,9807,8802,129.3,,9110
+17801,9807,8805,0.9999,,9201
+17801,9807,8806,0.0,,9001
+17801,9807,8807,0.0,,9001
+17802,9807,8801,33.0,,9110
+17802,9807,8802,131.0,,9110
+17802,9807,8805,0.9999,,9201
+17802,9807,8806,0.0,,9001
+17802,9807,8807,0.0,,9001
+17803,9807,8801,36.0,,9110
+17803,9807,8802,132.1,,9110
+17803,9807,8805,0.9999,,9201
+17803,9807,8806,0.0,,9001
+17803,9807,8807,0.0,,9001
+17804,9807,8801,33.0,,9110
+17804,9807,8802,133.3,,9110
+17804,9807,8805,0.9999,,9201
+17804,9807,8806,0.0,,9001
+17804,9807,8807,0.0,,9001
+17805,9807,8801,36.0,,9110
+17805,9807,8802,134.2,,9110
+17805,9807,8805,0.9999,,9201
+17805,9807,8806,0.0,,9001
+17805,9807,8807,0.0,,9001
+17806,9807,8801,36.0,,9110
+17806,9807,8802,136.0,,9110
+17806,9807,8805,0.9999,,9201
+17806,9807,8806,0.0,,9001
+17806,9807,8807,0.0,,9001
+17807,9807,8801,36.0,,9110
+17807,9807,8802,137.1,,9110
+17807,9807,8805,0.9999,,9201
+17807,9807,8806,0.0,,9001
+17807,9807,8807,0.0,,9001
+17808,9807,8801,36.0,,9110
+17808,9807,8802,138.3,,9110
+17808,9807,8805,0.9999,,9201
+17808,9807,8806,0.0,,9001
+17808,9807,8807,0.0,,9001
+17809,9807,8801,36.0,,9110
+17809,9807,8802,139.5,,9110
+17809,9807,8805,0.9999,,9201
+17809,9807,8806,0.0,,9001
+17809,9807,8807,0.0,,9001
+17810,9807,8801,40.0,,9110
+17810,9807,8802,140.5,,9110
+17810,9807,8805,0.9999,,9201
+17810,9807,8806,0.0,,9001
+17810,9807,8807,0.0,,9001
+17811,9807,8801,44.0,,9110
+17811,9807,8802,140.15,,9110
+17811,9807,8805,0.9999,,9201
+17811,9807,8806,0.0,,9001
+17811,9807,8807,0.0,,9001
+17812,9807,8801,44.0,,9110
+17812,9807,8802,142.15,,9110
+17812,9807,8805,0.9999,,9201
+17812,9807,8806,0.0,,9001
+17812,9807,8807,0.0,,9001
+17813,9807,8801,44.0,,9110
+17813,9807,8802,144.15,,9110
+17813,9807,8805,0.9999,,9201
+17813,9807,8806,0.0,,9001
+17813,9807,8807,0.0,,9001
+17814,9807,8801,26.0,,9110
+17814,9807,8802,142.0,,9110
+17814,9807,8805,0.9999,,9201
+17814,9807,8806,0.0,,9001
+17814,9807,8807,0.0,,9001
+17815,9807,8801,26.0,,9110
+17815,9807,8802,127.3,,9110
+17815,9807,8805,0.9999,,9201
+17815,9807,8806,0.0,,9001
+17815,9807,8807,0.0,,9001
+17816,9807,8801,26.0,,9110
+17816,9807,8802,124.0,,9110
+17816,9807,8805,0.9999,,9201
+17816,9807,8806,0.0,,9001
+17816,9807,8807,0.0,,9001
+17817,9807,8801,26.0,,9110
+17817,9807,8802,131.0,,9110
+17817,9807,8805,0.9999,,9201
+17817,9807,8806,0.0,,9001
+17817,9807,8807,0.0,,9001
+17818,9807,8801,20.0,,9110
+17818,9807,8802,136.0,,9110
+17818,9807,8805,0.9999,,9201
+17818,9807,8806,0.0,,9001
+17818,9807,8807,0.0,,9001
+17819,9807,8801,26.0,,9110
+17819,9807,8802,154.0,,9110
+17819,9807,8805,0.9999,,9201
+17819,9807,8806,0.0,,9001
+17819,9807,8807,0.0,,9001
+17901,9807,8801,-36.5247515,,9110
+17901,9807,8802,174.45516217,,9110
+17901,9807,8805,0.9999,,9201
+17901,9807,8806,300000.0,,9001
+17901,9807,8807,700000.0,,9001
+17902,9807,8801,-37.45404993,,9110
+17902,9807,8802,176.27583101,,9110
+17902,9807,8805,1.0,,9201
+17902,9807,8806,300000.0,,9001
+17902,9807,8807,700000.0,,9001
+17903,9807,8801,-38.372893,,9110
+17903,9807,8802,177.53082906,,9110
+17903,9807,8805,1.0,,9201
+17903,9807,8806,300000.0,,9001
+17903,9807,8807,700000.0,,9001
+17904,9807,8801,-39.39033455,,9110
+17904,9807,8802,176.40252499,,9110
+17904,9807,8805,1.0,,9201
+17904,9807,8806,300000.0,,9001
+17904,9807,8807,700000.0,,9001
+17905,9807,8801,-39.08087299,,9110
+17905,9807,8802,174.13408423,,9110
+17905,9807,8805,1.0,,9201
+17905,9807,8806,300000.0,,9001
+17905,9807,8807,700000.0,,9001
+17906,9807,8801,-39.30448934,,9110
+17906,9807,8802,175.38241325,,9110
+17906,9807,8805,1.0,,9201
+17906,9807,8806,300000.0,,9001
+17906,9807,8807,700000.0,,9001
+17907,9807,8801,-40.14310097,,9110
+17907,9807,8802,175.29171586,,9110
+17907,9807,8805,1.0,,9201
+17907,9807,8806,300000.0,,9001
+17907,9807,8807,700000.0,,9001
+17908,9807,8801,-40.55319175,,9110
+17908,9807,8802,175.38504588,,9110
+17908,9807,8805,1.0,,9201
+17908,9807,8806,300000.0,,9001
+17908,9807,8807,700000.0,,9001
+17909,9807,8801,-41.18047507,,9110
+17909,9807,8802,174.46358432,,9110
+17909,9807,8805,1.0,,9201
+17909,9807,8806,300000.0,,9001
+17909,9807,8807,700000.0,,9001
+17910,9807,8801,-40.42531326,,9110
+17910,9807,8802,172.40193674,,9110
+17910,9807,8805,1.0,,9201
+17910,9807,8806,300000.0,,9001
+17910,9807,8807,700000.0,,9001
+17911,9807,8801,-41.1628361,,9110
+17911,9807,8802,173.17575405,,9110
+17911,9807,8805,1.0,,9201
+17911,9807,8806,300000.0,,9001
+17911,9807,8807,700000.0,,9001
+17912,9807,8801,-41.17236815,,9110
+17912,9807,8802,172.06325015,,9110
+17912,9807,8805,1.0,,9201
+17912,9807,8806,300000.0,,9001
+17912,9807,8807,700000.0,,9001
+17913,9807,8801,-41.48388903,,9110
+17913,9807,8802,171.34525362,,9110
+17913,9807,8805,1.0,,9201
+17913,9807,8806,300000.0,,9001
+17913,9807,8807,700000.0,,9001
+17914,9807,8801,-42.20012994,,9110
+17914,9807,8802,171.32591767,,9110
+17914,9807,8805,1.0,,9201
+17914,9807,8806,300000.0,,9001
+17914,9807,8807,700000.0,,9001
+17915,9807,8801,-42.41208197,,9110
+17915,9807,8802,173.00364802,,9110
+17915,9807,8805,1.0,,9201
+17915,9807,8806,300000.0,,9001
+17915,9807,8807,700000.0,,9001
+17916,9807,8801,-41.3240152,,9110
+17916,9807,8802,173.48074668,,9110
+17916,9807,8805,1.0,,9201
+17916,9807,8806,300000.0,,9001
+17916,9807,8807,700000.0,,9001
+17917,9807,8801,-42.53107605,,9110
+17917,9807,8802,170.58479766,,9110
+17917,9807,8805,1.0,,9201
+17917,9807,8806,300000.0,,9001
+17917,9807,8807,700000.0,,9001
+17918,9807,8801,-43.06364613,,9110
+17918,9807,8802,170.1539333,,9110
+17918,9807,8805,1.0,,9201
+17918,9807,8806,300000.0,,9001
+17918,9807,8807,700000.0,,9001
+17919,9807,8801,-43.58400904,,9110
+17919,9807,8802,168.36225612,,9110
+17919,9807,8805,1.0,,9201
+17919,9807,8806,300000.0,,9001
+17919,9807,8807,700000.0,,9001
+17920,9807,8801,-43.35262953,,9110
+17920,9807,8802,172.43378969,,9110
+17920,9807,8805,1.0,,9201
+17920,9807,8806,300000.0,,9001
+17920,9807,8807,700000.0,,9001
+17921,9807,8801,-43.44553616,,9110
+17921,9807,8802,171.21386945,,9110
+17921,9807,8805,1.0,,9201
+17921,9807,8806,300000.0,,9001
+17921,9807,8807,700000.0,,9001
+17922,9807,8801,-44.24079933,,9110
+17922,9807,8802,171.0326103,,9110
+17922,9807,8805,1.0,,9201
+17922,9807,8806,300000.0,,9001
+17922,9807,8807,700000.0,,9001
+17923,9807,8801,-44.44069647,,9110
+17923,9807,8802,169.28039183,,9110
+17923,9807,8805,1.0,,9201
+17923,9807,8806,300000.0,,9001
+17923,9807,8807,700000.0,,9001
+17924,9807,8801,-45.07584493,,9110
+17924,9807,8802,168.23551083,,9110
+17924,9807,8805,1.0,,9201
+17924,9807,8806,300000.0,,9001
+17924,9807,8807,700000.0,,9001
+17925,9807,8801,-45.33494142,,9110
+17925,9807,8802,167.44199024,,9110
+17925,9807,8805,1.0,,9201
+17925,9807,8806,300000.0,,9001
+17925,9807,8807,700000.0,,9001
+17926,9807,8801,-45.48583078,,9110
+17926,9807,8802,170.37429426,,9110
+17926,9807,8805,1.0,,9201
+17926,9807,8806,300000.0,,9001
+17926,9807,8807,700000.0,,9001
+17927,9807,8801,-45.51414481,,9110
+17927,9807,8802,170.16573208,,9110
+17927,9807,8805,0.99996,,9201
+17927,9807,8806,300000.0,,9001
+17927,9807,8807,700000.0,,9001
+17928,9807,8801,-46.36000346,,9110
+17928,9807,8802,168.20343392,,9110
+17928,9807,8805,1.0,,9201
+17928,9807,8806,300002.66,,9001
+17928,9807,8807,699999.58,,9001
+17931,9807,8801,-36.5247,,9110
+17931,9807,8802,174.4551,,9110
+17931,9807,8805,0.9999,,9201
+17931,9807,8806,400000.0,,9001
+17931,9807,8807,800000.0,,9001
+17932,9807,8801,-37.454,,9110
+17932,9807,8802,176.2758,,9110
+17932,9807,8805,1.0,,9201
+17932,9807,8806,400000.0,,9001
+17932,9807,8807,800000.0,,9001
+17933,9807,8801,-38.3728,,9110
+17933,9807,8802,177.5308,,9110
+17933,9807,8805,1.0,,9201
+17933,9807,8806,400000.0,,9001
+17933,9807,8807,800000.0,,9001
+17934,9807,8801,-39.3903,,9110
+17934,9807,8802,176.4025,,9110
+17934,9807,8805,1.0,,9201
+17934,9807,8806,400000.0,,9001
+17934,9807,8807,800000.0,,9001
+17935,9807,8801,-39.0808,,9110
+17935,9807,8802,174.134,,9110
+17935,9807,8805,1.0,,9201
+17935,9807,8806,400000.0,,9001
+17935,9807,8807,800000.0,,9001
+17936,9807,8801,-39.3044,,9110
+17936,9807,8802,175.3824,,9110
+17936,9807,8805,1.0,,9201
+17936,9807,8806,400000.0,,9001
+17936,9807,8807,800000.0,,9001
+17937,9807,8801,-40.1431,,9110
+17937,9807,8802,175.2917,,9110
+17937,9807,8805,1.0,,9201
+17937,9807,8806,400000.0,,9001
+17937,9807,8807,800000.0,,9001
+17938,9807,8801,-40.5531,,9110
+17938,9807,8802,175.385,,9110
+17938,9807,8805,1.0,,9201
+17938,9807,8806,400000.0,,9001
+17938,9807,8807,800000.0,,9001
+17939,9807,8801,-41.1804,,9110
+17939,9807,8802,174.4635,,9110
+17939,9807,8805,1.0,,9201
+17939,9807,8806,400000.0,,9001
+17939,9807,8807,800000.0,,9001
+17940,9807,8801,-40.4253,,9110
+17940,9807,8802,172.4019,,9110
+17940,9807,8805,1.0,,9201
+17940,9807,8806,400000.0,,9001
+17940,9807,8807,800000.0,,9001
+17941,9807,8801,-41.1628,,9110
+17941,9807,8802,173.1757,,9110
+17941,9807,8805,1.0,,9201
+17941,9807,8806,400000.0,,9001
+17941,9807,8807,800000.0,,9001
+17942,9807,8801,-41.1723,,9110
+17942,9807,8802,172.0632,,9110
+17942,9807,8805,1.0,,9201
+17942,9807,8806,400000.0,,9001
+17942,9807,8807,800000.0,,9001
+17943,9807,8801,-41.4838,,9110
+17943,9807,8802,171.3452,,9110
+17943,9807,8805,1.0,,9201
+17943,9807,8806,400000.0,,9001
+17943,9807,8807,800000.0,,9001
+17944,9807,8801,-42.2001,,9110
+17944,9807,8802,171.3259,,9110
+17944,9807,8805,1.0,,9201
+17944,9807,8806,400000.0,,9001
+17944,9807,8807,800000.0,,9001
+17945,9807,8801,-42.412,,9110
+17945,9807,8802,173.0036,,9110
+17945,9807,8805,1.0,,9201
+17945,9807,8806,400000.0,,9001
+17945,9807,8807,800000.0,,9001
+17946,9807,8801,-41.324,,9110
+17946,9807,8802,173.4807,,9110
+17946,9807,8805,1.0,,9201
+17946,9807,8806,400000.0,,9001
+17946,9807,8807,800000.0,,9001
+17947,9807,8801,-42.531,,9110
+17947,9807,8802,170.5847,,9110
+17947,9807,8805,1.0,,9201
+17947,9807,8806,400000.0,,9001
+17947,9807,8807,800000.0,,9001
+17948,9807,8801,-43.0636,,9110
+17948,9807,8802,170.1539,,9110
+17948,9807,8805,1.0,,9201
+17948,9807,8806,400000.0,,9001
+17948,9807,8807,800000.0,,9001
+17949,9807,8801,-43.584,,9110
+17949,9807,8802,168.3622,,9110
+17949,9807,8805,1.0,,9201
+17949,9807,8806,400000.0,,9001
+17949,9807,8807,800000.0,,9001
+17950,9807,8801,-43.3526,,9110
+17950,9807,8802,172.4337,,9110
+17950,9807,8805,1.0,,9201
+17950,9807,8806,400000.0,,9001
+17950,9807,8807,800000.0,,9001
+17951,9807,8801,-43.4455,,9110
+17951,9807,8802,171.2138,,9110
+17951,9807,8805,1.0,,9201
+17951,9807,8806,400000.0,,9001
+17951,9807,8807,800000.0,,9001
+17952,9807,8801,-44.2407,,9110
+17952,9807,8802,171.0326,,9110
+17952,9807,8805,1.0,,9201
+17952,9807,8806,400000.0,,9001
+17952,9807,8807,800000.0,,9001
+17953,9807,8801,-44.4406,,9110
+17953,9807,8802,169.2803,,9110
+17953,9807,8805,1.0,,9201
+17953,9807,8806,400000.0,,9001
+17953,9807,8807,800000.0,,9001
+17954,9807,8801,-45.0758,,9110
+17954,9807,8802,168.2355,,9110
+17954,9807,8805,1.0,,9201
+17954,9807,8806,400000.0,,9001
+17954,9807,8807,800000.0,,9001
+17955,9807,8801,-45.3349,,9110
+17955,9807,8802,167.4419,,9110
+17955,9807,8805,1.0,,9201
+17955,9807,8806,400000.0,,9001
+17955,9807,8807,800000.0,,9001
+17956,9807,8801,-45.4858,,9110
+17956,9807,8802,170.3742,,9110
+17956,9807,8805,1.0,,9201
+17956,9807,8806,400000.0,,9001
+17956,9807,8807,800000.0,,9001
+17957,9807,8801,-45.5141,,9110
+17957,9807,8802,170.1657,,9110
+17957,9807,8805,0.99996,,9201
+17957,9807,8806,400000.0,,9001
+17957,9807,8807,800000.0,,9001
+17958,9807,8801,-46.36,,9110
+17958,9807,8802,168.2034,,9110
+17958,9807,8805,1.0,,9201
+17958,9807,8806,400000.0,,9001
+17958,9807,8807,800000.0,,9001
+18011,9801,8801,40.0,,9105
+18011,9801,8802,3.0,,9105
+18011,9801,8805,0.999625544,,9201
+18011,9801,8806,500000.0,,9001
+18011,9801,8807,300000.0,,9001
+18012,9801,8801,37.0,,9105
+18012,9801,8802,3.0,,9105
+18012,9801,8805,0.999625769,,9201
+18012,9801,8806,500000.0,,9001
+18012,9801,8807,300000.0,,9001
+18021,9801,8801,40.0,,9105
+18021,9801,8802,3.0,,9105
+18021,9801,8805,0.999625544,,9201
+18021,9801,8806,500135.0,,9001
+18021,9801,8807,300090.0,,9001
+18022,9801,8801,37.0,,9105
+18022,9801,8802,3.0,,9105
+18022,9801,8805,0.999625769,,9201
+18022,9801,8806,500135.0,,9001
+18022,9801,8807,300090.0,,9001
+18031,9807,8801,-90.0,,9102
+18031,9807,8802,-72.0,,9102
+18031,9807,8805,1.0,,9201
+18031,9807,8806,1500000.0,,9001
+18031,9807,8807,0.0,,9001
+18032,9807,8801,-90.0,,9102
+18032,9807,8802,-69.0,,9102
+18032,9807,8805,1.0,,9201
+18032,9807,8806,2500000.0,,9001
+18032,9807,8807,0.0,,9001
+18033,9807,8801,-90.0,,9102
+18033,9807,8802,-66.0,,9102
+18033,9807,8805,1.0,,9201
+18033,9807,8806,3500000.0,,9001
+18033,9807,8807,0.0,,9001
+18034,9807,8801,-90.0,,9102
+18034,9807,8802,-63.0,,9102
+18034,9807,8805,1.0,,9201
+18034,9807,8806,4500000.0,,9001
+18034,9807,8807,0.0,,9001
+18035,9807,8801,-90.0,,9102
+18035,9807,8802,-60.0,,9102
+18035,9807,8805,1.0,,9201
+18035,9807,8806,5500000.0,,9001
+18035,9807,8807,0.0,,9001
+18036,9807,8801,-90.0,,9102
+18036,9807,8802,-57.0,,9102
+18036,9807,8805,1.0,,9201
+18036,9807,8806,6500000.0,,9001
+18036,9807,8807,0.0,,9001
+18037,9807,8801,-90.0,,9102
+18037,9807,8802,-54.0,,9102
+18037,9807,8805,1.0,,9201
+18037,9807,8806,7500000.0,,9001
+18037,9807,8807,0.0,,9001
+18041,9807,8801,0.0,,9102
+18041,9807,8802,28.0,,9102
+18041,9807,8805,1.0,,9201
+18041,9807,8806,0.0,,9001
+18041,9807,8807,0.0,,9001
+18042,9807,8801,0.0,,9102
+18042,9807,8802,31.0,,9102
+18042,9807,8805,1.0,,9201
+18042,9807,8806,0.0,,9001
+18042,9807,8807,0.0,,9001
+18043,9807,8801,0.0,,9102
+18043,9807,8802,34.0,,9102
+18043,9807,8805,1.0,,9201
+18043,9807,8806,0.0,,9001
+18043,9807,8807,0.0,,9001
+18044,9807,8801,0.0,,9110
+18044,9807,8802,10.2,,9110
+18044,9807,8805,1.0,,9201
+18044,9807,8806,150000.0,,9001
+18044,9807,8807,0.0,,9001
+18045,9807,8801,0.0,,9110
+18045,9807,8802,13.2,,9110
+18045,9807,8805,1.0,,9201
+18045,9807,8806,450000.0,,9001
+18045,9807,8807,0.0,,9001
+18046,9807,8801,0.0,,9110
+18046,9807,8802,16.2,,9110
+18046,9807,8805,1.0,,9201
+18046,9807,8806,750000.0,,9001
+18046,9807,8807,0.0,,9001
+18051,9807,8801,4.355657,,9110
+18051,9807,8802,-77.04513,,9110
+18051,9807,8805,1.0,,9201
+18051,9807,8806,1000000.0,,9001
+18051,9807,8807,1000000.0,,9001
+18052,9807,8801,4.355657,,9110
+18052,9807,8802,-74.04513,,9110
+18052,9807,8805,1.0,,9201
+18052,9807,8806,1000000.0,,9001
+18052,9807,8807,1000000.0,,9001
+18053,9807,8801,4.355657,,9110
+18053,9807,8802,-71.04513,,9110
+18053,9807,8805,1.0,,9201
+18053,9807,8806,1000000.0,,9001
+18053,9807,8807,1000000.0,,9001
+18054,9807,8801,4.355657,,9110
+18054,9807,8802,-68.04513,,9110
+18054,9807,8805,1.0,,9201
+18054,9807,8806,1000000.0,,9001
+18054,9807,8807,1000000.0,,9001
+18061,9801,8801,22.21,,9110
+18061,9801,8802,-81.0,,9110
+18061,9801,8805,0.99993602,,9201
+18061,9801,8806,500000.0,,9001
+18061,9801,8807,280296.016,,9001
+18062,9801,8801,20.43,,9110
+18062,9801,8802,-76.5,,9110
+18062,9801,8805,0.99994848,,9201
+18062,9801,8806,500000.0,,9001
+18062,9801,8807,229126.939,,9001
+18071,9807,8801,30.0,,9102
+18071,9807,8802,35.0,,9102
+18071,9807,8805,1.0,,9201
+18071,9807,8806,300000.0,,9001
+18071,9807,8807,1100000.0,,9001
+18072,9807,8801,30.0,,9102
+18072,9807,8802,31.0,,9102
+18072,9807,8805,1.0,,9201
+18072,9807,8806,615000.0,,9001
+18072,9807,8807,810000.0,,9001
+18073,9807,8801,30.0,,9102
+18073,9807,8802,27.0,,9102
+18073,9807,8805,1.0,,9201
+18073,9807,8806,700000.0,,9001
+18073,9807,8807,200000.0,,9001
+18074,9807,8801,30.0,,9102
+18074,9807,8802,27.0,,9102
+18074,9807,8805,1.0,,9201
+18074,9807,8806,700000.0,,9001
+18074,9807,8807,1200000.0,,9001
+18081,9801,8801,55.0,,9105
+18081,9801,8802,0.0,,9105
+18081,9801,8805,0.999877341,,9201
+18081,9801,8806,600000.0,,9001
+18081,9801,8807,1200000.0,,9001
+18082,9801,8801,52.0,,9105
+18082,9801,8802,0.0,,9105
+18082,9801,8805,0.99987742,,9201
+18082,9801,8806,600000.0,,9001
+18082,9801,8807,2200000.0,,9001
+18083,9801,8801,49.0,,9105
+18083,9801,8802,0.0,,9105
+18083,9801,8805,0.999877499,,9201
+18083,9801,8806,600000.0,,9001
+18083,9801,8807,3200000.0,,9001
+18084,9801,8801,46.85,,9105
+18084,9801,8802,0.0,,9105
+18084,9801,8805,0.99994471,,9201
+18084,9801,8806,234.358,,9001
+18084,9801,8807,4185861.369,,9001
+18085,9802,8821,46.3,,9110
+18085,9802,8822,3.0,,9110
+18085,9802,8823,49.0,,9110
+18085,9802,8824,44.0,,9110
+18085,9802,8826,700000.0,,9001
+18085,9802,8827,6600000.0,,9001
+18086,9801,8801,46.48,,9110
+18086,9801,8802,2.2014025,,9110
+18086,9801,8805,0.99987742,,9201
+18086,9801,8806,600000.0,,9001
+18086,9801,8807,2200000.0,,9001
+18091,9801,8801,55.0,,9105
+18091,9801,8802,0.0,,9105
+18091,9801,8805,0.999877341,,9201
+18091,9801,8806,600000.0,,9001
+18091,9801,8807,200000.0,,9001
+18092,9801,8801,52.0,,9105
+18092,9801,8802,0.0,,9105
+18092,9801,8805,0.99987742,,9201
+18092,9801,8806,600000.0,,9001
+18092,9801,8807,200000.0,,9001
+18093,9801,8801,49.0,,9105
+18093,9801,8802,0.0,,9105
+18093,9801,8805,0.999877499,,9201
+18093,9801,8806,600000.0,,9001
+18093,9801,8807,200000.0,,9001
+18094,9801,8801,46.85,,9105
+18094,9801,8802,0.0,,9105
+18094,9801,8805,0.99994471,,9201
+18094,9801,8806,234.358,,9001
+18094,9801,8807,185861.369,,9001
+18110,9801,8801,39.3,,9110
+18110,9801,8802,68.0,,9110
+18110,9801,8805,0.99846154,,9201
+18110,9801,8806,2355500.0,,9084
+18110,9801,8807,2590000.0,,9084
+18111,9801,8801,32.3,,9110
+18111,9801,8802,68.0,,9110
+18111,9801,8805,0.99878641,,9201
+18111,9801,8806,3000000.0,,9084
+18111,9801,8807,1000000.0,,9084
+18112,9801,8801,26.0,,9102
+18112,9801,8802,74.0,,9102
+18112,9801,8805,0.99878641,,9201
+18112,9801,8806,3000000.0,,9084
+18112,9801,8807,1000000.0,,9084
+18113,9801,8801,26.0,,9102
+18113,9801,8802,90.0,,9102
+18113,9801,8805,0.99878641,,9201
+18113,9801,8806,3000000.0,,9084
+18113,9801,8807,1000000.0,,9084
+18114,9801,8801,19.0,,9102
+18114,9801,8802,80.0,,9102
+18114,9801,8805,0.99878641,,9201
+18114,9801,8806,3000000.0,,9084
+18114,9801,8807,1000000.0,,9084
+18115,9801,8801,19.0,,9102
+18115,9801,8802,100.0,,9102
+18115,9801,8805,0.99878641,,9201
+18115,9801,8806,3000000.0,,9084
+18115,9801,8807,1000000.0,,9084
+18116,9801,8801,12.0,,9102
+18116,9801,8802,80.0,,9102
+18116,9801,8805,0.99878641,,9201
+18116,9801,8806,3000000.0,,9084
+18116,9801,8807,1000000.0,,9084
+18117,9801,8801,12.0,,9102
+18117,9801,8802,100.0,,9102
+18117,9801,8805,0.99878641,,9201
+18117,9801,8806,3000000.0,,9084
+18117,9801,8807,1000000.0,,9084
+18121,9807,8801,0.0,,9102
+18121,9807,8802,9.0,,9102
+18121,9807,8805,0.9996,,9201
+18121,9807,8806,1500000.0,,9001
+18121,9807,8807,0.0,,9001
+18122,9807,8801,0.0,,9102
+18122,9807,8802,15.0,,9102
+18122,9807,8805,0.9996,,9201
+18122,9807,8806,2520000.0,,9001
+18122,9807,8807,0.0,,9001
+18131,9801,8801,37.0,,9105
+18131,9801,8802,-6.0,,9105
+18131,9801,8805,0.999625769,,9201
+18131,9801,8806,500000.0,,9001
+18131,9801,8807,300000.0,,9001
+18132,9801,8801,33.0,,9105
+18132,9801,8802,-6.0,,9105
+18132,9801,8805,0.999615596,,9201
+18132,9801,8806,500000.0,,9001
+18132,9801,8807,300000.0,,9001
+18133,9801,8801,29.0,,9105
+18133,9801,8802,-6.0,,9105
+18133,9801,8805,0.9996,,9201
+18133,9801,8806,1200000.0,,9001
+18133,9801,8807,400000.0,,9001
+18141,9807,8801,-39.0,,9110
+18141,9807,8802,175.3,,9110
+18141,9807,8805,1.0,,9201
+18141,9807,8806,300000.0,,9040
+18141,9807,8807,400000.0,,9040
+18142,9807,8801,-44.0,,9110
+18142,9807,8802,171.3,,9110
+18142,9807,8805,1.0,,9201
+18142,9807,8806,500000.0,,9040
+18142,9807,8807,500000.0,,9040
+18151,9807,8801,4.0,,9110
+18151,9807,8802,4.3,,9110
+18151,9807,8805,0.99975,,9201
+18151,9807,8806,230738.26,,9001
+18151,9807,8807,0.0,,9001
+18152,9807,8801,4.0,,9110
+18152,9807,8802,8.3,,9110
+18152,9807,8805,0.99975,,9201
+18152,9807,8806,670553.98,,9001
+18152,9807,8807,0.0,,9001
+18153,9807,8801,4.0,,9110
+18153,9807,8802,12.3,,9110
+18153,9807,8805,0.99975,,9201
+18153,9807,8806,1110369.7,,9001
+18153,9807,8807,0.0,,9001
+18161,9807,8801,-6.0,,9110
+18161,9807,8802,-80.3,,9110
+18161,9807,8805,0.99983008,,9201
+18161,9807,8806,222000.0,,9001
+18161,9807,8807,1426834.743,,9001
+18162,9807,8801,-9.3,,9110
+18162,9807,8802,-76.0,,9110
+18162,9807,8805,0.99932994,,9201
+18162,9807,8806,720000.0,,9001
+18162,9807,8807,1039979.159,,9001
+18163,9807,8801,-9.3,,9110
+18163,9807,8802,-70.3,,9110
+18163,9807,8805,0.99952992,,9201
+18163,9807,8806,1324000.0,,9001
+18163,9807,8807,1040084.558,,9001
+18171,9807,8801,0.0,,9102
+18171,9807,8802,117.0,,9102
+18171,9807,8805,0.99995,,9201
+18171,9807,8806,500000.0,,9001
+18171,9807,8807,0.0,,9001
+18172,9807,8801,0.0,,9102
+18172,9807,8802,119.0,,9102
+18172,9807,8805,0.99995,,9201
+18172,9807,8806,500000.0,,9001
+18172,9807,8807,0.0,,9001
+18173,9807,8801,0.0,,9102
+18173,9807,8802,121.0,,9102
+18173,9807,8805,0.99995,,9201
+18173,9807,8806,500000.0,,9001
+18173,9807,8807,0.0,,9001
+18174,9807,8801,0.0,,9102
+18174,9807,8802,123.0,,9102
+18174,9807,8805,0.99995,,9201
+18174,9807,8806,500000.0,,9001
+18174,9807,8807,0.0,,9001
+18175,9807,8801,0.0,,9102
+18175,9807,8802,125.0,,9102
+18175,9807,8805,0.99995,,9201
+18175,9807,8806,500000.0,,9001
+18175,9807,8807,0.0,,9001
+18181,9801,8801,40.0,,9105
+18181,9801,8802,11.0,,9105
+18181,9801,8805,0.999625544,,9201
+18181,9801,8806,500000.0,,9001
+18181,9801,8807,300000.0,,9001
+18182,9801,8801,37.0,,9105
+18182,9801,8802,11.0,,9105
+18182,9801,8805,0.999625769,,9201
+18182,9801,8806,500000.0,,9001
+18182,9801,8807,300000.0,,9001
+18191,9807,8801,0.0,,9102
+18191,9807,8802,21.0,,9102
+18191,9807,8805,1.0,,9201
+18191,9807,8806,1500000.0,,9001
+18191,9807,8807,0.0,,9001
+18192,9807,8801,0.0,,9102
+18192,9807,8802,24.0,,9102
+18192,9807,8805,1.0,,9201
+18192,9807,8806,2500000.0,,9001
+18192,9807,8807,0.0,,9001
+18193,9807,8801,0.0,,9102
+18193,9807,8802,27.0,,9102
+18193,9807,8805,1.0,,9201
+18193,9807,8806,3500000.0,,9001
+18193,9807,8807,0.0,,9001
+18194,9807,8801,0.0,,9102
+18194,9807,8802,30.0,,9102
+18194,9807,8805,1.0,,9201
+18194,9807,8806,4500000.0,,9001
+18194,9807,8807,0.0,,9001
+18201,9806,8801,31.4402749,,9110
+18201,9806,8802,35.124349,,9110
+18201,9806,8806,170251.555,,9001
+18201,9806,8807,126867.909,,9001
+18202,9807,8801,31.4402749,,9110
+18202,9807,8802,35.124349,,9110
+18202,9807,8805,1.0,,9201
+18202,9807,8806,170251.555,,9001
+18202,9807,8807,1126867.909,,9001
+18203,9806,8801,31.4402749,,9110
+18203,9806,8802,35.124349,,9110
+18203,9806,8806,170251.555,,9001
+18203,9806,8807,1126867.909,,9001
+18204,9807,8801,31.4403817,,9110
+18204,9807,8802,35.1216261,,9110
+18204,9807,8805,1.0000067,,9201
+18204,9807,8806,219529.584,,9001
+18204,9807,8807,626907.39,,9001
+18211,9801,8801,16.49,,9110
+18211,9801,8802,-90.2,,9110
+18211,9801,8805,0.99992226,,9201
+18211,9801,8806,500000.0,,9001
+18211,9801,8807,292209.579,,9001
+18212,9801,8801,14.54,,9110
+18212,9801,8802,-90.2,,9110
+18212,9801,8805,0.99989906,,9201
+18212,9801,8806,500000.0,,9001
+18212,9801,8807,325992.681,,9001
+18221,9807,8801,58.0,,9110
+18221,9807,8802,-4.4,,9110
+18221,9807,8805,1.0,,9201
+18221,9807,8806,0.0,,9001
+18221,9807,8807,0.0,,9001
+18222,9807,8801,58.0,,9110
+18222,9807,8802,-2.2,,9110
+18222,9807,8805,1.0,,9201
+18222,9807,8806,0.0,,9001
+18222,9807,8807,0.0,,9001
+18223,9807,8801,58.0,,9110
+18223,9807,8802,0.0,,9110
+18223,9807,8805,1.0,,9201
+18223,9807,8806,0.0,,9001
+18223,9807,8807,0.0,,9001
+18224,9807,8801,58.0,,9110
+18224,9807,8802,2.3,,9110
+18224,9807,8805,1.0,,9201
+18224,9807,8806,0.0,,9001
+18224,9807,8807,0.0,,9001
+18225,9807,8801,58.0,,9110
+18225,9807,8802,6.1,,9110
+18225,9807,8805,1.0,,9201
+18225,9807,8806,0.0,,9001
+18225,9807,8807,0.0,,9001
+18226,9807,8801,58.0,,9110
+18226,9807,8802,10.1,,9110
+18226,9807,8805,1.0,,9201
+18226,9807,8806,0.0,,9001
+18226,9807,8807,0.0,,9001
+18227,9807,8801,58.0,,9110
+18227,9807,8802,14.1,,9110
+18227,9807,8805,1.0,,9201
+18227,9807,8806,0.0,,9001
+18227,9807,8807,0.0,,9001
+18228,9807,8801,58.0,,9110
+18228,9807,8802,18.2,,9110
+18228,9807,8805,1.0,,9201
+18228,9807,8806,0.0,,9001
+18228,9807,8807,0.0,,9001
+18231,9801,8801,32.3,,9110
+18231,9801,8802,68.0,,9110
+18231,9801,8805,0.99878641,,9201
+18231,9801,8806,2743195.5,,9001
+18231,9801,8807,914398.5,,9001
+18232,9801,8801,26.0,,9102
+18232,9801,8802,74.0,,9102
+18232,9801,8805,0.99878641,,9201
+18232,9801,8806,2743195.5,,9001
+18232,9801,8807,914398.5,,9001
+18233,9801,8801,19.0,,9102
+18233,9801,8802,80.0,,9102
+18233,9801,8805,0.99878641,,9201
+18233,9801,8806,2743195.5,,9001
+18233,9801,8807,914398.5,,9001
+18234,9801,8801,12.0,,9102
+18234,9801,8802,80.0,,9102
+18234,9801,8805,0.99878641,,9201
+18234,9801,8806,2743195.5,,9001
+18234,9801,8807,914398.5,,9001
+18235,9801,8801,26.0,,9102
+18235,9801,8802,90.0,,9102
+18235,9801,8805,0.99878641,,9201
+18235,9801,8806,2743195.5,,9001
+18235,9801,8807,914398.5,,9001
+18236,9801,8801,32.3,,9110
+18236,9801,8802,68.0,,9110
+18236,9801,8805,0.99878641,,9201
+18236,9801,8806,2743196.4,,9001
+18236,9801,8807,914398.8,,9001
+18237,9801,8801,26.0,,9102
+18237,9801,8802,74.0,,9102
+18237,9801,8805,0.99878641,,9201
+18237,9801,8806,2743196.4,,9001
+18237,9801,8807,914398.8,,9001
+18238,9801,8801,26.0,,9102
+18238,9801,8802,90.0,,9102
+18238,9801,8805,0.99878641,,9201
+18238,9801,8806,2743185.69,,9001
+18238,9801,8807,914395.23,,9001
+18240,9807,8801,0.0,,9102
+18240,9807,8802,9.0,,9102
+18240,9807,8805,0.9999,,9201
+18240,9807,8806,200000.0,,9001
+18240,9807,8807,0.0,,9001
+18241,9807,8801,0.0,,9102
+18241,9807,8802,11.0,,9102
+18241,9807,8805,0.9999,,9201
+18241,9807,8806,200000.0,,9001
+18241,9807,8807,0.0,,9001
+18242,9807,8801,0.0,,9102
+18242,9807,8802,13.0,,9102
+18242,9807,8805,0.9999,,9201
+18242,9807,8806,200000.0,,9001
+18242,9807,8807,0.0,,9001
+18243,9807,8801,0.0,,9102
+18243,9807,8802,15.0,,9102
+18243,9807,8805,0.9999,,9201
+18243,9807,8806,200000.0,,9001
+18243,9807,8807,0.0,,9001
+18244,9807,8801,0.0,,9102
+18244,9807,8802,17.0,,9102
+18244,9807,8805,0.9999,,9201
+18244,9807,8806,200000.0,,9001
+18244,9807,8807,0.0,,9001
+18245,9807,8801,0.0,,9102
+18245,9807,8802,19.0,,9102
+18245,9807,8805,0.9999,,9201
+18245,9807,8806,200000.0,,9001
+18245,9807,8807,0.0,,9001
+18246,9807,8801,0.0,,9102
+18246,9807,8802,21.0,,9102
+18246,9807,8805,0.9999,,9201
+18246,9807,8806,200000.0,,9001
+18246,9807,8807,0.0,,9001
+18247,9807,8801,0.0,,9102
+18247,9807,8802,23.0,,9102
+18247,9807,8805,0.9999,,9201
+18247,9807,8806,200000.0,,9001
+18247,9807,8807,0.0,,9001
+18248,9807,8801,0.0,,9102
+18248,9807,8802,25.0,,9102
+18248,9807,8805,0.9999,,9201
+18248,9807,8806,200000.0,,9001
+18248,9807,8807,0.0,,9001
+18251,9807,8801,38.0,,9102
+18251,9807,8802,129.0,,9102
+18251,9807,8805,1.0,,9201
+18251,9807,8806,200000.0,,9001
+18251,9807,8807,500000.0,,9001
+18252,9807,8801,38.0,,9102
+18252,9807,8802,127.0,,9102
+18252,9807,8805,1.0,,9201
+18252,9807,8806,200000.0,,9001
+18252,9807,8807,500000.0,,9001
+18253,9807,8801,38.0,,9102
+18253,9807,8802,125.0,,9102
+18253,9807,8805,1.0,,9201
+18253,9807,8806,200000.0,,9001
+18253,9807,8807,500000.0,,9001
+18260,9801,8801,10.1,,9110
+18260,9801,8802,-71.3620224,,9110
+18260,9801,8805,1.0,,9201
+18260,9801,8806,0.0,,9001
+18260,9801,8807,-52684.972,,9001
+18261,9801,8801,10.1,,9110
+18261,9801,8802,-71.3620224,,9110
+18261,9801,8805,1.0,,9201
+18261,9801,8806,200000.0,,9001
+18261,9801,8807,147315.028,,9001
+18262,9801,8801,10.1,,9110
+18262,9801,8802,-71.3620224,,9110
+18262,9801,8805,1.0,,9201
+18262,9801,8806,500000.0,,9001
+18262,9801,8807,447315.028,,9001
+18263,9801,8801,10.1,,9110
+18263,9801,8802,-71.3620224,,9110
+18263,9801,8805,1.0,,9201
+18263,9801,8806,-17044.0,,9001
+18263,9801,8807,-23139.97,,9001
+18275,9807,8801,0.0,,9102
+18275,9807,8802,15.0,,9102
+18275,9807,8805,0.9999,,9201
+18275,9807,8806,5500000.0,,9001
+18275,9807,8807,0.0,,9001
+18276,9807,8801,0.0,,9102
+18276,9807,8802,18.0,,9102
+18276,9807,8805,0.9999,,9201
+18276,9807,8806,6500000.0,,9001
+18276,9807,8807,0.0,,9001
+18277,9807,8801,0.0,,9102
+18277,9807,8802,21.0,,9102
+18277,9807,8805,0.9999,,9201
+18277,9807,8806,7500000.0,,9001
+18277,9807,8807,0.0,,9001
+18278,9807,8801,0.0,,9102
+18278,9807,8802,24.0,,9102
+18278,9807,8805,0.9999,,9201
+18278,9807,8806,8500000.0,,9001
+18278,9807,8807,0.0,,9001
+18281,9809,8801,50.373,,9110
+18281,9809,8802,21.05,,9110
+18281,9809,8805,0.9998,,9201
+18281,9809,8806,4637000.0,,9001
+18281,9809,8807,5647000.0,,9001
+18282,9809,8801,53.0007,,9110
+18282,9809,8802,21.301,,9110
+18282,9809,8805,0.9998,,9201
+18282,9809,8806,4603000.0,,9001
+18282,9809,8807,5806000.0,,9001
+18283,9809,8801,53.35,,9110
+18283,9809,8802,17.003,,9110
+18283,9809,8805,0.9998,,9201
+18283,9809,8806,3501000.0,,9001
+18283,9809,8807,5999000.0,,9001
+18284,9809,8801,51.4015,,9110
+18284,9809,8802,16.402,,9110
+18284,9809,8805,0.9998,,9201
+18284,9809,8806,3703000.0,,9001
+18284,9809,8807,5627000.0,,9001
+18285,9807,8801,0.0,,9110
+18285,9807,8802,18.573,,9110
+18285,9807,8805,0.999983,,9201
+18285,9807,8806,237000.0,,9001
+18285,9807,8807,-4700000.0,,9001
+18300,9807,8801,0.0,,9102
+18300,9807,8802,19.0,,9102
+18300,9807,8805,0.9993,,9201
+18300,9807,8806,500000.0,,9001
+18300,9807,8807,-5300000.0,,9001
+18305,9807,8801,0.0,,9102
+18305,9807,8802,15.0,,9102
+18305,9807,8805,0.999923,,9201
+18305,9807,8806,5500000.0,,9001
+18305,9807,8807,0.0,,9001
+18306,9807,8801,0.0,,9102
+18306,9807,8802,18.0,,9102
+18306,9807,8805,0.999923,,9201
+18306,9807,8806,6500000.0,,9001
+18306,9807,8807,0.0,,9001
+18307,9807,8801,0.0,,9102
+18307,9807,8802,21.0,,9102
+18307,9807,8805,0.999923,,9201
+18307,9807,8806,7500000.0,,9001
+18307,9807,8807,0.0,,9001
+18308,9807,8801,0.0,,9102
+18308,9807,8802,24.0,,9102
+18308,9807,8805,0.999923,,9201
+18308,9807,8806,8500000.0,,9001
+18308,9807,8807,0.0,,9001
+18401,9807,8801,0.0,,9110
+18401,9807,8802,9.3,,9110
+18401,9807,8805,0.99995,,9201
+18401,9807,8806,200000.0,,9001
+18401,9807,8807,0.0,,9001
+18402,9807,8801,0.0,,9102
+18402,9807,8802,12.0,,9102
+18402,9807,8805,0.99995,,9201
+18402,9807,8806,500000.0,,9001
+18402,9807,8807,0.0,,9001
+18403,9807,8801,0.0,,9102
+18403,9807,8802,15.0,,9102
+18403,9807,8805,1.0,,9201
+18403,9807,8806,900000.0,,9001
+18403,9807,8807,0.0,,9001
+18411,9807,8801,0.0,,9110
+18411,9807,8802,-13.3,,9110
+18411,9807,8805,0.999,,9201
+18411,9807,8806,1000000.0,,9001
+18411,9807,8807,1000000.0,,9001
+18412,9807,8801,0.0,,9110
+18412,9807,8802,-6.3,,9110
+18412,9807,8805,0.999,,9201
+18412,9807,8806,1000000.0,,9001
+18412,9807,8807,1000000.0,,9001
+18413,9807,8801,0.0,,9110
+18413,9807,8802,0.3,,9110
+18413,9807,8805,0.999,,9201
+18413,9807,8806,1000000.0,,9001
+18413,9807,8807,1000000.0,,9001
+18414,9807,8801,0.0,,9110
+18414,9807,8802,7.3,,9110
+18414,9807,8805,0.999,,9201
+18414,9807,8806,1000000.0,,9001
+18414,9807,8807,1000000.0,,9001
+18415,9807,8801,0.0,,9110
+18415,9807,8802,10.3,,9110
+18415,9807,8805,0.999,,9201
+18415,9807,8806,1000000.0,,9001
+18415,9807,8807,1000000.0,,9001
+18416,9807,8801,0.0,,9110
+18416,9807,8802,17.4,,9110
+18416,9807,8805,0.999,,9201
+18416,9807,8806,1000000.0,,9001
+18416,9807,8807,1000000.0,,9001
+18417,9807,8801,0.0,,9110
+18417,9807,8802,24.3,,9110
+18417,9807,8805,0.999,,9201
+18417,9807,8806,1000000.0,,9001
+18417,9807,8807,1000000.0,,9001
+18421,9826,8801,82.3,,9110
+18421,9826,8802,-40.0,,9110
+18421,9826,8805,1.0,,9201
+18421,9826,8806,0.0,,9001
+18421,9826,8807,0.0,,9001
+18422,9826,8801,79.3,,9110
+18422,9826,8802,-24.0,,9110
+18422,9826,8805,1.0,,9201
+18422,9826,8806,0.0,,9001
+18422,9826,8807,0.0,,9001
+18423,9826,8801,76.3,,9110
+18423,9826,8802,-20.0,,9110
+18423,9826,8805,1.0,,9201
+18423,9826,8806,0.0,,9001
+18423,9826,8807,0.0,,9001
+18424,9826,8801,73.3,,9110
+18424,9826,8802,-24.0,,9110
+18424,9826,8805,1.0,,9201
+18424,9826,8806,0.0,,9001
+18424,9826,8807,0.0,,9001
+18425,9826,8801,70.3,,9110
+18425,9826,8802,-24.0,,9110
+18425,9826,8805,1.0,,9201
+18425,9826,8806,0.0,,9001
+18425,9826,8807,0.0,,9001
+18426,9826,8801,67.3,,9110
+18426,9826,8802,-32.0,,9110
+18426,9826,8805,1.0,,9201
+18426,9826,8806,0.0,,9001
+18426,9826,8807,0.0,,9001
+18427,9826,8801,64.3,,9110
+18427,9826,8802,-40.0,,9110
+18427,9826,8805,1.0,,9201
+18427,9826,8806,0.0,,9001
+18427,9826,8807,0.0,,9001
+18428,9826,8801,61.3,,9110
+18428,9826,8802,-48.0,,9110
+18428,9826,8805,1.0,,9201
+18428,9826,8806,0.0,,9001
+18428,9826,8807,0.0,,9001
+18432,9826,8801,79.3,,9110
+18432,9826,8802,-64.0,,9110
+18432,9826,8805,1.0,,9201
+18432,9826,8806,0.0,,9001
+18432,9826,8807,0.0,,9001
+18433,9826,8801,76.3,,9110
+18433,9826,8802,-64.0,,9110
+18433,9826,8805,1.0,,9201
+18433,9826,8806,0.0,,9001
+18433,9826,8807,0.0,,9001
+18434,9826,8801,73.3,,9110
+18434,9826,8802,-52.0,,9110
+18434,9826,8805,1.0,,9201
+18434,9826,8806,0.0,,9001
+18434,9826,8807,0.0,,9001
+18435,9826,8801,70.3,,9110
+18435,9826,8802,-52.0,,9110
+18435,9826,8805,1.0,,9201
+18435,9826,8806,0.0,,9001
+18435,9826,8807,0.0,,9001
+18436,9826,8801,67.3,,9110
+18436,9826,8802,-52.0,,9110
+18436,9826,8805,1.0,,9201
+18436,9826,8806,0.0,,9001
+18436,9826,8807,0.0,,9001
+18437,9826,8801,64.3,,9110
+18437,9826,8802,-52.0,,9110
+18437,9826,8805,1.0,,9201
+18437,9826,8806,0.0,,9001
+18437,9826,8807,0.0,,9001
+18441,9807,8801,0.07,,9110
+18441,9807,8802,41.32,,9110
+18441,9807,8805,1.0,,9003
+18441,9807,8806,1300000.0,,9001
+18441,9807,8807,0.0,,9001
+18442,9807,8801,0.07,,9110
+18442,9807,8802,44.32,,9110
+18442,9807,8805,1.0,,9003
+18442,9807,8806,2300000.0,,9001
+18442,9807,8807,0.0,,9001
+18443,9807,8801,0.07,,9110
+18443,9807,8802,47.32,,9110
+18443,9807,8805,1.0,,9201
+18443,9807,8806,3300000.0,,9001
+18443,9807,8807,0.0,,9001
+18444,9807,8801,0.07,,9110
+18444,9807,8802,50.32,,9110
+18444,9807,8805,1.0,,9201
+18444,9807,8806,4300000.0,,9001
+18444,9807,8807,0.0,,9001
+18446,9807,8801,0.08,,9110
+18446,9807,8802,50.46,,9110
+18446,9807,8805,1.0,,9201
+18446,9807,8806,2300000.0,,9001
+18446,9807,8807,0.0,,9001
+18447,9807,8801,0.08,,9110
+18447,9807,8802,53.46,,9110
+18447,9807,8805,1.0,,9201
+18447,9807,8806,3300000.0,,9001
+18447,9807,8807,0.0,,9001
+18448,9807,8801,0.08,,9110
+18448,9807,8802,56.46,,9110
+18448,9807,8805,1.0,,9201
+18448,9807,8806,4300000.0,,9001
+18448,9807,8807,0.0,,9001
+19900,9807,8801,0.0,,9102
+19900,9807,8802,51.0,,9102
+19900,9807,8805,0.9996,,9201
+19900,9807,8806,500000.0,,9001
+19900,9807,8807,0.0,,9001
+19901,9802,8821,90.0,,9110
+19901,9802,8822,0.0,,9110
+19901,9802,8823,49.5,,9110
+19901,9802,8824,51.1,,9110
+19901,9802,8826,150000.0,,9001
+19901,9802,8827,5400000.0,,9001
+19902,9803,8821,90.0,,9110
+19902,9803,8822,4.2124983,,9110
+19902,9803,8823,49.5,,9110
+19902,9803,8824,51.1,,9110
+19902,9803,8826,150000.01256,,9001
+19902,9803,8827,5400088.4378,,9001
+19903,9801,8801,55.0,,9105
+19903,9801,8802,6.0,,9105
+19903,9801,8805,0.99950908,,9201
+19903,9801,8806,500000.0,,9001
+19903,9801,8807,300000.0,,9001
+19904,9807,8801,4.4,,9110
+19904,9807,8802,-1.0,,9110
+19904,9807,8805,0.99975,,9201
+19904,9807,8806,274319.51,,9001
+19904,9807,8807,0.0,,9001
+19905,9804,8801,0.0,,9102
+19905,9804,8802,110.0,,9102
+19905,9804,8805,0.997,,9201
+19905,9804,8806,3900000.0,,9001
+19905,9804,8807,900000.0,,9001
+19906,9801,8801,32.3,,9110
+19906,9801,8802,45.0,,9110
+19906,9801,8805,0.9987864078,,9201
+19906,9801,8806,1500000.0,,9001
+19906,9801,8807,1166200.0,,9001
+19907,9807,8801,29.0134566,,9110
+19907,9807,8802,46.3,,9110
+19907,9807,8805,0.9994,,9201
+19907,9807,8806,800000.0,,9001
+19907,9807,8807,0.0,,9001
+19908,9807,8801,53.3,,9110
+19908,9807,8802,-8.0,,9110
+19908,9807,8805,1.000035,,9201
+19908,9807,8806,200000.0,,9001
+19908,9807,8807,250000.0,,9001
+19909,9801,8801,18.0,,9102
+19909,9801,8802,-77.0,,9102
+19909,9801,8805,1.0,,9201
+19909,9801,8806,550000.0,,9005
+19909,9801,8807,400000.0,,9005
+19910,9801,8801,18.0,,9102
+19910,9801,8802,-77.0,,9102
+19910,9801,8805,1.0,,9201
+19910,9801,8806,250000.0,,9001
+19910,9801,8807,150000.0,,9001
+19911,9815,8811,-21.0,,9105
+19911,9815,8812,49.0,,9105
+19911,9815,8813,21.0,,9105
+19911,9815,8814,21.0,,9105
+19911,9815,8815,0.9995,,9201
+19911,9815,8816,400000.0,,9001
+19911,9815,8817,800000.0,,9001
+19913,9809,8801,52.0922178,,9110
+19913,9809,8802,5.23155,,9110
+19913,9809,8805,0.9999079,,9201
+19913,9809,8806,0.0,,9001
+19913,9809,8807,0.0,,9001
+19914,9809,8801,52.0922178,,9110
+19914,9809,8802,5.23155,,9110
+19914,9809,8805,0.9999079,,9201
+19914,9809,8806,155000.0,,9001
+19914,9809,8807,463000.0,,9001
+19915,9801,8801,15.0,,9102
+19915,9801,8802,45.0,,9102
+19915,9801,8805,0.999365678,,9201
+19915,9801,8806,1500000.0,,9001
+19915,9801,8807,1000000.0,,9001
+19916,9807,8801,49.0,,9102
+19916,9807,8802,-2.0,,9102
+19916,9807,8805,0.999601272,,9201
+19916,9807,8806,400000.0,,9001
+19916,9807,8807,-100000.0,,9001
+19917,9811,8801,-41.0,,9102
+19917,9811,8802,173.0,,9102
+19917,9811,8806,2510000.0,,9001
+19917,9811,8807,6023150.0,,9001
+19919,9807,8801,24.27,,9110
+19919,9807,8802,51.13,,9110
+19919,9807,8805,0.99999,,9201
+19919,9807,8806,200000.0,,9001
+19919,9807,8807,300000.0,,9001
+19920,9806,8801,1.1715528,,9110
+19920,9806,8802,103.5110808,,9110
+19920,9806,8806,30000.0,,9001
+19920,9806,8807,30000.0,,9001
+19921,9801,8801,40.0,,9102
+19921,9801,8802,0.0,,9102
+19921,9801,8805,0.9988085293,,9201
+19921,9801,8806,600000.0,,9001
+19921,9801,8807,600000.0,,9001
+19922,9815,8811,46.570866,,9110
+19922,9815,8812,7.26225,,9110
+19922,9815,8813,90.0,,9110
+19922,9815,8814,90.0,,9110
+19922,9815,8815,1.0,,9201
+19922,9815,8816,600000.0,,9001
+19922,9815,8817,200000.0,,9001
+19923,9815,8811,46.570866,,9110
+19923,9815,8812,0.0,,9110
+19923,9815,8813,90.0,,9110
+19923,9815,8814,90.0,,9110
+19923,9815,8815,1.0,,9201
+19923,9815,8816,0.0,,9001
+19923,9815,8817,0.0,,9001
+19924,9806,8801,11.1507843,,9110
+19924,9806,8802,-60.4109632,,9110
+19924,9806,8806,187500.0,,9039
+19924,9806,8807,180000.0,,9039
+19925,9806,8801,10.263,,9110
+19925,9806,8802,-61.2,,9110
+19925,9806,8806,430000.0,,9039
+19925,9806,8807,325000.0,,9039
+19926,9809,8801,46.0,,9102
+19926,9809,8802,25.0,,9102
+19926,9809,8805,0.99975,,9201
+19926,9809,8806,500000.0,,9001
+19926,9809,8807,500000.0,,9001
+19927,9809,8801,45.54,,9110
+19927,9809,8802,25.23328772,,9110
+19927,9809,8805,0.9996667,,9201
+19927,9809,8806,500000.0,,9001
+19927,9809,8807,500000.0,,9001
+19928,9807,8801,0.0,,9102
+19928,9807,8802,48.0,,9102
+19928,9807,8805,0.9996,,9201
+19928,9807,8806,500000.0,,9001
+19928,9807,8807,0.0,,9001
+19929,9807,8801,0.0,,9110
+19929,9807,8802,15.48298,,9110
+19929,9807,8805,1.0,,9201
+19929,9807,8806,1500000.0,,9001
+19929,9807,8807,0.0,,9001
+19930,9807,8801,0.0,,9102
+19930,9807,8802,24.0,,9102
+19930,9807,8805,0.9996,,9201
+19930,9807,8806,500000.0,,9001
+19930,9807,8807,0.0,,9001
+19931,9815,8811,47.08398174,,9110
+19931,9815,8812,19.02548584,,9110
+19931,9815,8813,90.0,,9110
+19931,9815,8814,90.0,,9110
+19931,9815,8815,0.99993,,9201
+19931,9815,8816,650000.0,,9001
+19931,9815,8817,200000.0,,9001
+19933,9809,8801,47.15,,9110
+19933,9809,8802,-63.0,,9110
+19933,9809,8805,0.999912,,9201
+19933,9809,8806,700000.0,,9001
+19933,9809,8807,400000.0,,9001
+19934,9807,8801,0.0,,9102
+19934,9807,8802,24.0,,9102
+19934,9807,8805,0.9998,,9201
+19934,9807,8806,500000.0,,9001
+19934,9807,8807,0.0,,9001
+19935,9812,8806,40000.0,,9062
+19935,9812,8807,0.0,,9062
+19935,9812,8811,4.0,,9110
+19935,9812,8812,102.15,,9110
+19935,9812,8813,323.01328458,,9110
+19935,9812,8814,323.07483685,,9110
+19935,9812,8815,0.99984,,9201
+19936,9807,8801,39.4,,9110
+19936,9807,8802,1.0,,9110
+19936,9807,8805,1.0,,9201
+19936,9807,8806,200000.0,,9001
+19936,9807,8807,300000.0,,9001
+19937,9816,8821,38.81973,,9105
+19937,9816,8822,7.83445,,9105
+19937,9816,8826,270.0,,9036
+19937,9816,8827,582.0,,9036
+19938,9802,8821,57.310319415,,9110
+19938,9802,8822,24.0,,9110
+19938,9802,8823,59.2,,9110
+19938,9802,8824,58.0,,9110
+19938,9802,8826,500000.0,,9001
+19938,9802,8827,6375000.0,,9001
+19939,9807,8801,0.0,,9102
+19939,9807,8802,24.0,,9102
+19939,9807,8805,0.9996,,9201
+19939,9807,8806,500000.0,,9001
+19939,9807,8807,0.0,,9001
+19940,9817,8801,34.39,,9110
+19940,9817,8802,37.21,,9110
+19940,9817,8805,0.9996256,,9201
+19940,9817,8806,300000.0,,9001
+19940,9817,8807,300000.0,,9001
+19941,9818,8801,0.0,,9102
+19941,9818,8802,-54.0,,9102
+19941,9818,8806,5000000.0,,9001
+19941,9818,8807,10000000.0,,9001
+19942,9807,8801,0.0,,9102
+19942,9807,8802,-62.0,,9102
+19942,9807,8805,0.9995,,9201
+19942,9807,8806,400000.0,,9001
+19942,9807,8807,0.0,,9001
+19943,9807,8801,13.1035,,9110
+19943,9807,8802,-59.3335,,9110
+19943,9807,8805,0.9999986,,9201
+19943,9807,8806,30000.0,,9001
+19943,9807,8807,75000.0,,9001
+19944,9802,8821,44.0,,9110
+19944,9802,8822,-68.3,,9110
+19944,9802,8823,60.0,,9110
+19944,9802,8824,46.0,,9110
+19944,9802,8826,0.0,,9001
+19944,9802,8827,0.0,,9001
+19945,9809,8801,46.3,,9110
+19945,9809,8802,-66.3,,9110
+19945,9809,8805,0.999912,,9201
+19945,9809,8806,300000.0,,9001
+19945,9809,8807,800000.0,,9001
+19946,9809,8801,46.3,,9110
+19946,9809,8802,-66.3,,9110
+19946,9809,8805,0.999912,,9201
+19946,9809,8806,2500000.0,,9001
+19946,9809,8807,7500000.0,,9001
+19947,9802,8821,47.3,,9110
+19947,9802,8822,13.2,,9110
+19947,9802,8823,49.0,,9110
+19947,9802,8824,46.0,,9110
+19947,9802,8826,400000.0,,9001
+19947,9802,8827,400000.0,,9001
+19948,9801,8801,34.39,,9110
+19948,9801,8802,37.21,,9110
+19948,9801,8805,0.9996256,,9201
+19948,9801,8806,300000.0,,9001
+19948,9801,8807,300000.0,,9001
+19949,9809,8801,38.0,,9105
+19949,9809,8802,43.5,,9105
+19949,9809,8805,0.9995341,,9201
+19949,9809,8806,0.0,,9001
+19949,9809,8807,0.0,,9001
+19950,9815,8811,46.570866,,9110
+19950,9815,8812,7.26225,,9110
+19950,9815,8813,90.0,,9110
+19950,9815,8814,90.0,,9110
+19950,9815,8815,1.0,,9201
+19950,9815,8816,2600000.0,,9001
+19950,9815,8817,1200000.0,,9001
+19951,9815,8811,27.31077837,,9110
+19951,9815,8812,52.3612741,,9110
+19951,9815,8813,0.34179803,,9110
+19951,9815,8814,0.34179803,,9110
+19951,9815,8815,0.999895934,,9201
+19951,9815,8816,658377.437,,9001
+19951,9815,8817,3044969.194,,9001
+19952,9819,8811,49.3,,9110
+19952,9819,8812,42.3,,9110
+19952,9819,8813,30.1717303,,9110
+19952,9819,8816,0.0,,9001
+19952,9819,8817,0.0,,9001
+19952,9819,8818,78.3,,9110
+19952,9819,8819,0.9999,,9201
+19953,9806,8801,25.22565,,9110
+19953,9806,8802,50.4541,,9110
+19953,9806,8806,100000.0,,9001
+19953,9806,8807,100000.0,,9001
+19954,9807,8801,0.0,,9110
+19954,9807,8802,-55.41,,9110
+19954,9807,8805,0.9996,,9201
+19954,9807,8806,500000.0,,9001
+19954,9807,8807,0.0,,9001
+19955,9807,8801,0.0,,9110
+19955,9807,8802,-55.41,,9110
+19955,9807,8805,0.9999,,9201
+19955,9807,8806,500000.0,,9001
+19955,9807,8807,0.0,,9001
+19956,9815,8811,4.0,,9110
+19956,9815,8812,115.0,,9110
+19956,9815,8813,53.18569537,,9110
+19956,9815,8814,53.07483685,,9110
+19956,9815,8815,0.99984,,9201
+19956,9815,8816,29352.4763,,9042
+19956,9815,8817,22014.3572,,9042
+19957,9815,8811,4.0,,9110
+19957,9815,8812,115.0,,9110
+19957,9815,8813,53.18569537,,9110
+19957,9815,8814,53.07483685,,9110
+19957,9815,8815,0.99984,,9201
+19957,9815,8816,1937263.44,,9041
+19957,9815,8817,1452947.58,,9041
+19958,9815,8811,4.0,,9110
+19958,9815,8812,115.0,,9110
+19958,9815,8813,53.18569537,,9110
+19958,9815,8814,53.07483685,,9110
+19958,9815,8815,0.99984,,9201
+19958,9815,8816,590476.87,,9001
+19958,9815,8817,442857.65,,9001
+19959,9807,8801,4.4,,9110
+19959,9807,8802,-1.0,,9110
+19959,9807,8805,0.99975,,9201
+19959,9807,8806,900000.0,,9094
+19959,9807,8807,0.0,,9094
+19960,9809,8801,47.15,,9110
+19960,9809,8802,-63.0,,9110
+19960,9809,8805,0.999912,,9201
+19960,9809,8806,400000.0,,9001
+19960,9809,8807,800000.0,,9001
+19961,9802,8821,90.0,,9110
+19961,9802,8822,4.2202952,,9110
+19961,9802,8823,51.100000204,,9110
+19961,9802,8824,49.500000204,,9110
+19961,9802,8826,150000.013,,9001
+19961,9802,8827,5400088.438,,9001
+19962,9807,8801,53.3,,9110
+19962,9807,8802,-8.0,,9110
+19962,9807,8805,0.99982,,9201
+19962,9807,8806,600000.0,,9001
+19962,9807,8807,750000.0,,9001
+19963,9807,8801,6.4,,9110
+19963,9807,8802,-12.0,,9110
+19963,9807,8805,1.0,,9201
+19963,9807,8806,500000.0,,9094
+19963,9807,8807,0.0,,9094
+19964,9807,8801,6.4,,9110
+19964,9807,8802,-12.0,,9110
+19964,9807,8805,1.0,,9201
+19964,9807,8806,800000.0,,9094
+19964,9807,8807,600000.0,,9094
+19965,9821,8806,0.0,,9001
+19965,9821,8807,0.0,,9001
+19965,9821,8828,45.0,,9102
+19965,9821,8829,-100.0,,9102
+19966,9807,8801,49.5,,9110
+19966,9807,8802,6.1,,9110
+19966,9807,8805,1.0,,9201
+19966,9807,8806,80000.0,,9001
+19966,9807,8807,100000.0,,9001
+19967,9807,8801,0.0,,9110
+19967,9807,8802,15.0,,9110
+19967,9807,8805,0.9999,,9201
+19967,9807,8806,500000.0,,9001
+19967,9807,8807,0.0,,9001
+19968,9823,8801,0.0,,9102
+19968,9823,8802,0.0,,9102
+19969,9807,8801,39.4,,9110
+19969,9807,8802,1.0,,9110
+19969,9807,8805,1.0,,9201
+19969,9807,8806,0.0,,9001
+19969,9807,8807,0.0,,9001
+19971,9807,8801,0.0,,9102
+19971,9807,8802,173.0,,9102
+19971,9807,8805,0.9996,,9201
+19971,9807,8806,1600000.0,,9001
+19971,9807,8807,10000000.0,,9001
+19972,9807,8801,53.3,,9110
+19972,9807,8802,-8.0,,9110
+19972,9807,8805,1.000035,,9201
+19972,9807,8806,200000.0,,9001
+19972,9807,8807,250000.0,,9001
+19973,9807,8801,53.3,,9110
+19973,9807,8802,-8.0,,9110
+19973,9807,8805,1.0,,9201
+19973,9807,8806,200000.0,,9001
+19973,9807,8807,250000.0,,9001
+19974,9807,8801,39.4,,9110
+19974,9807,8802,-8.0754862,,9110
+19974,9807,8805,1.0,,9201
+19974,9807,8806,180.598,,9001
+19974,9807,8807,-86.99,,9001
+19975,9806,8801,10.263,,9110
+19975,9806,8802,-61.2,,9110
+19975,9806,8806,283800.0,,9005
+19975,9806,8807,214500.0,,9005
+19976,9802,8821,6.0,,9102
+19976,9802,8822,-66.0,,9102
+19976,9802,8823,9.0,,9102
+19976,9802,8824,3.0,,9102
+19976,9802,8826,1000000.0,,9001
+19976,9802,8827,1000000.0,,9001
+19977,9802,8821,25.0522236,,9110
+19977,9802,8822,48.0,,9102
+19977,9802,8823,17.0,,9102
+19977,9802,8824,33.0,,9102
+19977,9802,8826,0.0,,9001
+19977,9802,8827,0.0,,9001
+19978,9807,8801,22.184368,,9110
+19978,9807,8802,114.10428,,9110
+19978,9807,8805,1.0,,9201
+19978,9807,8806,836694.05,,9001
+19978,9807,8807,819069.8,,9001
+19979,9828,8801,39.4,,9110
+19979,9828,8802,1.0,,9110
+19979,9828,8806,0.0,,9001
+19979,9828,8807,0.0,,9001
diff --git a/src/tiff/csv/coordinate_operation_path.csv b/src/tiff/csv/coordinate_operation_path.csv
new file mode 100644
index 0000000..afaf70b
--- /dev/null
+++ b/src/tiff/csv/coordinate_operation_path.csv
@@ -0,0 +1,336 @@
+"CONCAT_OPERATION_CODE","SINGLE_OPERATION_CODE","OP_PATH_STEP"
+8046,1025,1
+8046,1146,2
+8047,1146,2
+8047,1147,1
+8094,1193,2
+8094,1763,1
+8174,1125,2
+8174,1755,1
+8175,1169,2
+8175,1262,1
+8176,1227,2
+8176,1265,1
+8178,1123,2
+8178,1759,1
+8183,1149,2
+8183,1273,1
+8186,1276,2
+8186,1763,1
+8188,1277,2
+8188,1763,1
+8190,1150,2
+8190,1278,1
+8192,1150,2
+8192,1279,1
+8194,1150,2
+8194,1280,1
+8195,1149,2
+8195,1437,1
+8199,1274,1
+8199,1283,2
+8211,1266,1
+8211,1294,2
+8215,1297,1
+8215,1302,2
+8217,1298,1
+8217,1302,2
+8219,1299,1
+8219,1302,2
+8221,1300,1
+8221,1302,2
+8223,1301,1
+8223,1302,2
+8234,1149,2
+8234,1309,1
+8236,1149,2
+8236,1310,1
+8241,1026,1
+8241,1145,2
+8243,1188,2
+8243,1312,1
+8245,1188,2
+8245,1313,1
+8263,1306,2
+8263,1757,1
+8386,1188,2
+8386,1454,1
+8388,1188,2
+8388,1455,1
+8390,1188,2
+8390,1456,1
+8392,1188,2
+8392,1457,1
+8394,1188,2
+8394,1451,1
+8396,1150,2
+8396,1458,1
+8398,1150,2
+8398,1459,1
+8400,1150,2
+8400,1460,1
+8402,1188,2
+8402,1461,1
+8404,1188,2
+8404,1462,1
+8406,1188,2
+8406,1463,1
+8408,1150,2
+8408,1464,1
+8418,1472,1
+8418,1473,2
+8419,1473,2
+8419,1599,1
+8420,1473,2
+8420,1600,1
+8421,1473,2
+8421,1601,1
+8422,1473,2
+8422,1602,1
+8453,1150,2
+8453,1506,1
+8454,1150,2
+8454,1507,1
+8457,1509,1
+8457,1511,2
+8460,1241,1
+8460,1474,2
+8461,1241,1
+8461,1475,2
+8462,1241,1
+8462,1476,2
+8463,1241,1
+8463,1477,2
+8464,1241,1
+8464,1478,2
+8465,1241,1
+8465,1479,2
+8466,1241,1
+8466,1480,2
+8467,1241,1
+8467,1481,2
+8468,1241,1
+8468,1482,2
+8469,1241,1
+8469,1483,2
+8470,1241,1
+8470,1484,2
+8471,1241,1
+8471,1485,2
+8472,1241,1
+8472,1486,2
+8473,1241,1
+8473,1487,2
+8474,1241,1
+8474,1488,2
+8475,1241,1
+8475,1489,2
+8476,1241,1
+8476,1490,2
+8477,1241,1
+8477,1491,2
+8478,1241,1
+8478,1492,2
+8479,1241,1
+8479,1493,2
+8480,1241,1
+8480,1494,2
+8481,1241,1
+8481,1495,2
+8482,1496,2
+8482,1747,1
+8483,1241,1
+8483,1497,2
+8484,1241,1
+8484,1498,2
+8485,1241,1
+8485,1499,2
+8486,1241,1
+8486,1500,2
+8487,1241,1
+8487,1501,2
+8488,1241,1
+8488,1502,2
+8489,1241,1
+8489,1503,2
+8496,1241,1
+8496,1515,2
+8497,1243,1
+8497,1515,2
+8508,1454,1
+8508,1520,2
+8509,1241,1
+8509,1521,2
+8510,1241,1
+8510,1522,2
+8511,1241,1
+8511,1523,2
+8512,1241,1
+8512,1524,2
+8513,1241,1
+8513,1525,2
+8514,1241,1
+8514,1526,2
+8517,1527,2
+8517,1528,1
+8530,1539,1
+8530,1540,2
+8532,1240,2
+8532,1541,1
+8537,1237,2
+8537,1545,1
+8553,1241,1
+8553,1553,2
+8554,1241,1
+8554,1554,2
+8560,1150,2
+8560,1559,1
+8562,1240,2
+8562,1560,1
+8563,1565,2
+8563,1568,1
+8564,1473,2
+8564,1576,1
+8565,1188,2
+8565,1574,1
+8566,1188,2
+8566,1572,1
+8567,1036,1
+8567,1149,2
+8568,1240,2
+8568,1584,1
+8569,1149,2
+8569,1588,1
+8570,1025,1
+8570,1146,2
+8570,1149,3
+8571,1240,2
+8571,1570,1
+8572,1149,2
+8572,1571,1
+8573,1149,2
+8573,1591,1
+8574,1578,1
+8574,1580,2
+8575,1579,1
+8575,1580,2
+8576,1150,2
+8576,1594,1
+8577,1150,2
+8577,1595,1
+8578,1150,2
+8578,1596,1
+8579,1150,2
+8579,1593,1
+8580,1149,2
+8580,1611,1
+8581,1237,2
+8581,1616,1
+8582,1454,1
+8582,1741,2
+8583,1461,1
+8583,1731,2
+8584,1313,1
+8584,1752,2
+8585,1313,1
+8585,1702,2
+8586,1241,1
+8586,1704,2
+8587,1241,1
+8587,1705,2
+8588,1241,1
+8588,1706,2
+8589,1241,1
+8589,1707,2
+8590,1241,1
+8590,1717,2
+8591,1241,1
+8591,1728,2
+8592,1241,1
+8592,1708,2
+8593,1241,1
+8593,1739,2
+8594,1241,1
+8594,1750,2
+8595,1241,1
+8595,1712,2
+8596,1241,1
+8596,1714,2
+8597,1241,1
+8597,1713,2
+8598,1241,1
+8598,1748,2
+8599,1241,1
+8599,1742,2
+8600,1241,1
+8600,1709,2
+8601,1241,1
+8601,1743,2
+8602,1241,1
+8602,1718,2
+8603,1241,1
+8603,1719,2
+8604,1241,1
+8604,1721,2
+8605,1241,1
+8605,1720,2
+8606,1241,1
+8606,1725,2
+8607,1241,1
+8607,1722,2
+8608,1241,1
+8608,1710,2
+8609,1241,1
+8609,1723,2
+8610,1241,1
+8610,1711,2
+8611,1241,1
+8611,1715,2
+8612,1241,1
+8612,1716,2
+8613,1241,1
+8613,1724,2
+8614,1241,1
+8614,1744,2
+8615,1241,1
+8615,1749,2
+8616,1241,1
+8616,1726,2
+8617,1241,1
+8617,1727,2
+8618,1241,1
+8618,1729,2
+8619,1241,1
+8619,1745,2
+8620,1241,1
+8620,1730,2
+8621,1241,1
+8621,1737,2
+8622,1241,1
+8622,1732,2
+8623,1241,1
+8623,1733,2
+8624,1241,1
+8624,1734,2
+8625,1241,1
+8625,1735,2
+8626,1241,1
+8626,1746,2
+8627,1241,1
+8627,1736,2
+8628,1241,1
+8628,1747,2
+8629,1241,1
+8629,1738,2
+8630,1241,1
+8630,1740,2
+8631,1240,2
+8631,1805,1
+8632,1240,2
+8632,1806,1
+8633,1238,2
+8633,1828,1
+8634,1240,2
+8634,1839,1
+8635,1313,1
+8635,1849,2
diff --git a/src/tiff/csv/coordinate_reference_system.csv b/src/tiff/csv/coordinate_reference_system.csv
new file mode 100644
index 0000000..f6e94b7
--- /dev/null
+++ b/src/tiff/csv/coordinate_reference_system.csv
@@ -0,0 +1,2609 @@
+"COORD_REF_SYS_CODE","COORD_REF_SYS_NAME","AREA_OF_USE_CODE","COORD_REF_SYS_KIND","COORD_SYS_CODE","DATUM_CODE","SOURCE_GEOGCRS_CODE","PROJECTION_CONV_CODE","CMPD_HORIZCRS_CODE","CMPD_VERTCRS_CODE","CRS_SCOPE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","SHOW_CRS","DEPRECATED"
+2100,GGRS87 / Greek Grid,1106,projected,4400,,4121,19930,,,Large and medium scale topographic mapping and engineering survey.,Oil industry uses ED50 / UTM zone 34N and ED50 / UTM zone 35N.,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+2101,Lake / Maracaibo Grid M1,1319,projected,4499,,4249,18260,,,Oil exploration.,Grid coordinates are (0 0) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum).   Used by Creole; MGO and Sun.,Various oil company sources.,EPSG,2000-06-10 00:00:00,,1,0
+2102,Lake / Maracaibo Grid,1319,projected,4499,,4249,18261,,,Oil exploration.,Grid coordinates are (200000 200000) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum).  Used for Lake triangulation coordinate listing.,Various oil company sources.,EPSG,2000-06-10 00:00:00,,1,0
+2103,Lake / Maracaibo Grid M3,1319,projected,4499,,4249,18262,,,Oil exploration.,Grid coordinates are (500000 500000) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum).  Used by Varco.,Various oil company sources.,EPSG,2000-06-10 00:00:00,,1,0
+2104,Lake / Maracaibo La Rosa Grid,1499,projected,4499,,4249,18263,,,Oil exploration.,"Grid coordinates are (X=-17044 Y=29545) at Maracaibo Cathedral (10deg 38min 34.678sec N; 71deg 36min 20.224sec W; Lake datum).
+Do not confuse with the La Rosa grid used in the Cabinas area (code 5810).",Various oil company sources.,EPSG,2000-06-23 00:00:00,,1,0
+2105,NZGD2000 / Mount Eden Circuit 2000,1500,projected,4500,,4167,17931,,,Cadastral surveys.,Superseded NZGD49 / Mount Eden Circuit 2000 (code 27205) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2106,NZGD2000 / Bay of Plenty Circuit 2000,1500,projected,4500,,4167,17932,,,Cadastral surveys.,Superseded NZGD49 / Bay of Plenty Circuit 2000 (code 27206) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2107,NZGD2000 / Poverty Bay Circuit 2000,1500,projected,4500,,4167,17933,,,Cadastral surveys.,Superseded NZGD49 / Poverty Bay 2000 (code 27207) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2108,NZGD2000 / Hawkes Bay Circuit 2000,1500,projected,4500,,4167,17934,,,Cadastral surveys.,Superseded NZGD49 / Hawkes Bay Circuit 2000 (code 27208) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2109,NZGD2000 / Taranaki Circuit 2000,1500,projected,4500,,4167,17935,,,Cadastral surveys.,Superseded NZGD49 / Taranaki Circuit 2000 (code 27209) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2110,NZGD2000 / Tuhirangi Circuit 2000,1500,projected,4500,,4167,17936,,,Cadastral surveys.,Superseded NZGD49 / Tuhirangi Circuit 2000 (code 27210) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2111,NZGD2000 / Wanganui Circuit 2000,1500,projected,4500,,4167,17937,,,Cadastral surveys.,Superseded NZGD49 / Wanganui Circuit 2000 (code 27211) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2112,NZGD2000 / Wairarapa Circuit 2000,1500,projected,4500,,4167,17938,,,Cadastral surveys.,Superseded NZGD49 / Wairarapa Circuit 2000 (code 27212) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2113,NZGD2000 / Wellington Circuit 2000,1500,projected,4500,,4167,17939,,,Cadastral surveys.,Superseded NZGD49 / Wellington Circuit 2000 (code 27213) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2114,NZGD2000 / Collingwood Circuit 2000,1501,projected,4500,,4167,17940,,,Cadastral surveys.,Superseded NZGD49 / Collingwood Circuit 2000 (code 27214) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2115,NZGD2000 / Nelson Circuit 2000,1501,projected,4500,,4167,17941,,,Cadastral surveys.,Superseded NZGD49 / Nelson Circuit 2000 (code 27215) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2116,NZGD2000 / Karamea Circuit 2000,1501,projected,4500,,4167,17942,,,Cadastral surveys.,Superseded NZGD49 / Karamea Circuit 2000 (code 27216) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2117,NZGD2000 / Buller Circuit 2000,1501,projected,4500,,4167,17943,,,Cadastral surveys.,Superseded NZGD49 / Buller Circuit 2000 (code 27217) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2118,NZGD2000 / Grey Circuit 2000,1501,projected,4500,,4167,17944,,,Cadastral surveys.,Superseded NZGD49 / Grey Circuit 2000 (code 27218) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2119,NZGD2000 / Amuri Circuit 2000,1501,projected,4500,,4167,17945,,,Cadastral surveys.,Superseded NZGD49 / Amuri Circuit 2000 (code 27219) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2120,NZGD2000 / Marlborough Circuit 2000,1501,projected,4500,,4167,17946,,,Cadastral surveys.,Superseded NZGD49 / Marlborough Circuit 2000 (code 27220) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2121,NZGD2000 / Hokitika Circuit 2000,1501,projected,4500,,4167,17947,,,Cadastral surveys.,Superseded NZGD49 / Hokitika Circuit 2000 (code 27221) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2122,NZGD2000 / Okarito Circuit 2000,1501,projected,4500,,4167,17948,,,Cadastral surveys.,Superseded NZGD49 / Okarito Circuit 2000 (code 27222) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2123,NZGD2000 / Jacksons Bay Circuit 2000,1501,projected,4500,,4167,17949,,,Cadastral surveys.,Superseded NZGD49 / Jacksons Bay Circuit 2000 (code 27223) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2124,NZGD2000 / Mount Pleasant Circuit 2000,1501,projected,4500,,4167,17950,,,Cadastral surveys.,Superseded NZGD49 / Mount Pleasant Circuit 2000 (code 27224) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2125,NZGD2000 / Gawler Circuit 2000,1501,projected,4500,,4167,17951,,,Cadastral surveys.,Superseded NZGD49 / Gawler Circuit 2000 (code 27225) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2126,NZGD2000 / Timaru Circuit 2000,1501,projected,4500,,4167,17952,,,Cadastral surveys.,Superseded NZGD49 / Timaru Circuit 2000 (code 27226) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2127,NZGD2000 / Lindis Peak Circuit 2000,1501,projected,4500,,4167,17953,,,Cadastral surveys.,Superseded NZGD49 / Lindis Peak Circuit 2000 (code 27227) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2128,NZGD2000 / Mount Nicholas Circuit 2000,1501,projected,4500,,4167,17954,,,Cadastral surveys.,Superseded NZGD49 / Mount Nicholas Circuit 2000 (code 27228) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2129,NZGD2000 / Mount York Circuit 2000,1501,projected,4500,,4167,17955,,,Cadastral surveys.,Superseded NZGD49 / Mount York Circuit 2000 (code 27229) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2130,NZGD2000 / Observation Point Circuit 2000,1501,projected,4500,,4167,17956,,,Cadastral surveys.,Superseded NZGD49 / Observation Point Circuit 2000 (code 27230) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2131,NZGD2000 / North Taieri Circuit 2000,1501,projected,4500,,4167,17957,,,Cadastral surveys.,Superseded NZGD49 / North Taieri Circuit 2000 (code 27231) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2132,NZGD2000 / Bluff Circuit 2000,1501,projected,4500,,4167,17958,,,Cadastral surveys.,Superseded NZGD49 / Bluff Circuit 2000 (code 27232) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+2133,NZGD2000 / UTM zone 58S,1502,projected,4400,,4167,16158,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / UTM zone 58S (code 27258) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+2134,NZGD2000 / UTM zone 59S,1503,projected,4400,,4167,16159,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / UTM zone 59S (code 27259) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+2135,NZGD2000 / UTM zone 60S,1504,projected,4400,,4167,16160,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / UTM zone 60S (code 27260) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+2136,Accra / Ghana National Grid,1104,projected,4404,,4168,19959,,,Large and medium scale topographic mapping and engineering survey.,"Ellipsoid semi-major axis (a)=20926201 Gold Coast feet.  ProjCRS sometimes found in metric form: 1 Gold Coast foot = 0.3047997101815 m.
+Superseded by Leigon / Ghana Metric Grid from 1978.",Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+2137,Accra / TM 1 NW,1505,projected,4400,,4168,17001,,,Oil exploration.,,Various oil industry sources,EPSG,2000-10-19 00:00:00,,1,0
+2138,NAD27(CGQ77) / Quebec Lambert,1368,projected,4499,,4609,19944,,,Medium and small scale mapping.,Superseded NAD27 / Quebec Lambert (code 32098) in 1977.,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,2000-10-19 00:00:00,,1,0
+2139,NAD83(CSRS98) / SCoPQ zone 2,1420,projected,4499,,4140,17700,,,Large and medium scale topographic mapping and engineering survey.,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2140,NAD83(CSRS98) / MTM zone 3,1421,projected,4496,,4140,17703,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 3"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2141,NAD83(CSRS98) / MTM zone 4,1422,projected,4496,,4140,17704,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 4"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2142,NAD83(CSRS98) / MTM zone 5,1423,projected,4496,,4140,17705,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 5"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2143,NAD83(CSRS98) / MTM zone 6,1424,projected,4496,,4140,17706,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 6"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2144,NAD83(CSRS98) / MTM zone 7,1425,projected,4496,,4140,17707,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 7"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2145,NAD83(CSRS98) / MTM zone 8,1426,projected,4496,,4140,17708,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 8"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2146,NAD83(CSRS98) / MTM zone 9,1427,projected,4496,,4140,17709,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 9"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2147,NAD83(CSRS98) / MTM zone 10,1428,projected,4496,,4140,17710,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 10"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2000-10-19 00:00:00,,1,1
+2148,NAD83(CSRS98) / UTM zone 21N,1446,projected,4400,,4140,16021,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2149,NAD83(CSRS98) / UTM zone 18N,1443,projected,4400,,4140,16018,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2150,NAD83(CSRS98) / UTM zone 17N,1428,projected,4400,,4140,16017,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2151,NAD83(CSRS98) / UTM zone 13N,1506,projected,4400,,4140,16013,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2152,NAD83(CSRS98) / UTM zone 12N,1507,projected,4400,,4140,16012,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2153,NAD83(CSRS98) / UTM zone 11N,1508,projected,4400,,4140,16011,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2000-10-19 00:00:00,,1,1
+2154,RGF93 / Lambert-93,1326,projected,4499,,4171,18085,,,Large and medium scale topographic mapping and engineering survey.,,IGN - Paris,EPSG,2000-10-19 00:00:00,,1,0
+2155,American Samoa 1962 / American Samoa Lambert,1027,projected,4497,,4169,15300,,,Large and medium scale topographic mapping and engineering survey.,Superseded by projCRS 2156 as of mid-2000.,US National Geodetic Survey (NGS)  http://www.ngs.noaa.gov/,EPSG,2000-10-19 00:00:00,,1,1
+2156,NAD83(HARN) / UTM zone 59S,1027,projected,4400,,4152,16159,,,Large and medium scale topographic mapping and engineering survey.,Supersedes projCRS 2155; effective in 2000.    Deprecated due to error in projection and replaced by code 2195.,US National Geodetic Survey (NGS)  http://www.ngs.noaa.gov/,EPSG,2000-10-19 00:00:00,,1,1
+2157,IRENET95 / Irish Transverse Mercator,1305,projected,4400,,4173,19962,,,Large and medium scale topographic mapping and engineering survey.,Supersedes TM75 / Irish Grid (code 29903) from 1/1/2001.,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+2158,IRENET95 / UTM zone 29N,1305,projected,4400,,4173,16029,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+2159,Sierra Leone 1924 / New Colony Grid,1342,projected,4404,,4174,19963,,,Topographic mapping and engineering survey.,Supersedes the Sierra Leone 1924 / Colony Grid. New grid is 422.3 ft west and 112.1 ft south of old grid.  Ellipsoid semi-major axis (a)=20926201 Gold Coast feet; 1 Gold Coast foot = 0.3047997101815 m.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2160,Sierra Leone 1924 / New War Office Grid,1342,projected,4404,,4174,19964,,,Topographic mapping,Supersedes the Sierra Leone War Office Grid. New grid is 422.3 ft west and 112.1 ft south of old grid. Ellipsoid semi-major axis (a)=20926201 Gold Coast feet; 1 Gold Coast foot = 0.3047997101815 m.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2161,Sierra Leone 1968 / UTM zone 28N,1509,projected,4400,,4175,16028,,,Topographic mapping and engineering survey.,Supersedes Sierra Leone 1960 / UTM zone 28N.  The 1968 readjustment coordinates are within 3m of the 1960 provisional adjustment.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2162,Sierra Leone 1968 / UTM zone 29N,1510,projected,4400,,4175,16029,,,Topographic mapping and engineering survey.,Supersedes Sierra Leone 1960 / UTM zone 29N.  The 1968 readjustment coordinates are within 3m of the 1960 provisional adjustment.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+2163,US National Atlas Equal Area,1245,projected,4499,,4047,19965,,,For small scale (1:1million and smaller) statistical mapping.,Uses spherical projection formulae.  USGS describe geogCRS as NAD83 but this would require ellipsoidal projection formulae.,"United States Geological Survey, Western Geographic Science Center",EPSG,2001-06-05 00:00:00,,1,0
+2164,Locodjo 1965 / TM 5 NW,2296,projected,4400,,4142,17005,,,Oil industry use.,,Various oil industry sources,EPSG,2001-06-05 00:00:00,,1,0
+2165,Abidjan 1987 / TM 5 NW,2296,projected,4400,,4143,17005,,,Oil Industry,,Various oil industry sources,EPSG,2001-06-05 00:00:00,,1,0
+2166,Pulkovo 1942(83) / Gauss Kruger zone 3,1512,projected,4530,,4178,16263,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",In Thuringen superseded by DHDN / Gauss Kruger zone 3.,EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2167,Pulkovo 1942(83) / Gauss Kruger zone 4,1513,projected,4530,,4178,16264,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N. 
+In Sachsen and Thuringen superseded by DHDN / Gauss Kruger zone 4.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2168,Pulkovo 1942(83) / Gauss Kruger zone 5,1512,projected,4530,,4178,16265,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N. 
+In Sachsen superseded by DHDN / Gauss Kruger zone 5.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2169,Luxembourg 1930 / Gauss,1146,projected,4530,,4181,19966,,,Large and medium scale topographic mapping and engineering survey.,,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2170,MGI / Slovenia Grid,1212,projected,4530,,4312,19967,,,Large and medium scale topographic mapping and engineering survey.,Truncated form of MGI / Balkans zone 5 (code 31275).,,EPSG,2001-06-05 00:00:00,,1,0
+2171,Pulkovo 1942(58) / Poland zone I,1515,projected,4530,,4179,18281,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 7 and 8 (codes 2178-79).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2172,Pulkovo 1942(58) / Poland zone II,1516,projected,4530,,4179,18282,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 7 and 8 (codes 2178-79).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2173,Pulkovo 1942(58) / Poland zone III,1517,projected,4530,,4179,18283,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 5 and 6 (codes 2176-77).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2174,Pulkovo 1942(58) / Poland zone IV,1518,projected,4530,,4179,18284,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zones 5 and 6 (codes 2176-77).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2175,Pulkovo 1942(58) / Poland zone V,1519,projected,4530,,4179,18285,,,Large and medium scale topographic mapping and engineering survey.,To be phased out after 2009. Superseded by ETRS89 / Poland CS2000 zone 6 (code 2177).,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2176,ETRS89 / Poland CS2000 zone 5,1520,projected,4531,,4258,18305,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2177,ETRS89 / Poland CS2000 zone 6,1521,projected,4531,,4258,18306,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2178,ETRS89 / Poland CS2000 zone 7,1522,projected,4531,,4258,18307,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2179,ETRS89 / Poland CS2000 zone 8,1523,projected,4531,,4258,18308,,,"Large (1:5,000 and greater) scale topographic mapping and cadastral survey.",See ETRS89 / Poland CS92 (code 2170) for smaller scale mapping.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2180,ETRS89 / Poland CS92,1192,projected,4531,,4258,18300,,,"Medium and small scale topographic mapping (1:10,000 and smaller).",See ETRS89 / Poland CS2000 zones 5- 8 (codes 2176-79) for large scale purposes.,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2188,Azores Occidental 1939 / UTM zone 25N,1344,projected,4400,,4182,16025,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2189,Azores Central 1948 / UTM zone 26N,1301,projected,4400,,4183,16026,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2190,Azores Oriental 1940 / UTM zone 26N,1345,projected,4400,,4184,16026,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2191,Madeira 1936 / UTM zone 28N,1314,projected,4400,,4185,16028,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+2192,ED50 / France EuroLambert,1326,projected,4499,,4230,18086,,,Medium scale topographic and statistical mapping.,,IGN Paris via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+2193,NZGD2000 / New Zealand Transverse Mercator,1175,projected,4500,,4167,19971,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NZGD49 / New Zealand Map Grid (code 27200) from July 2001.,Shell Todd Oil Services.,EPSG,2001-08-28 00:00:00,,1,0
+2194,American Samoa 1962 / American Samoa Lambert,1027,projected,4497,,4169,15301,,,Large and medium scale topographic mapping and engineering survey.,Superseded by projCRS 2156 as of mid-2000.,US National Geodetic Survey (NGS)  http://www.ngs.noaa.gov/,EPSG,2001-08-28 00:00:00,,1,0
+2195,NAD83(HARN) / UTM zone 2S,1027,projected,4400,,4152,16102,,,Large and medium scale topographic mapping and engineering survey.,Supersedes projCRS 2194; effective in 2000,US National Geodetic Survey (NGS)  http://www.ngs.noaa.gov/,EPSG,2001-08-28 00:00:00,,1,0
+2196,ETRS89 / Kp2000 Jutland,2531,projected,4400,,4258,18401,,,"Large and scale topographic mapping, cadastral and engineering survey.  Note: for medium scale topographic mapping ETRS89 / UTM zone 32N (code 25832) is used.",Supersedes System 34 Jutland zone.,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+2197,ETRS89 / Kp2000 Zealand,2532,projected,4400,,4258,18402,,,"Large and scale topographic mapping, cadastral and engineering survey.  Note: for medium scale topographic mapping ETRS89 / UTM zone 32N (code 25832) is used.",Supersedes System 34 Zealand zone.,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+2198,ETRS89 / Kp2000 Bornholm,2533,projected,4400,,4258,18403,,,"Large and scale topographic mapping, cadastral and engineering survey.  Note: for medium scale topographic mapping ETRS89 / UTM zone 33N (code 25833) is used.",Supersedes System 45.,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+2199,Albanian 1987 / Gauss Kruger zone 4,1025,projected,4530,,4191,16204,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",,EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,1
+2200,ATS77 / New Brunswick Stereographic (ATS77),1447,projected,4500,,4122,19945,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979.  To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1999-10-20 00:00:00,99.61,1,0
+2201,REGVEN / UTM zone 18N,1693,projected,4400,,4189,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+2000,Anguilla 1957 / British West Indies Grid,1030,projected,4400,,4600,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2001,Antigua 1943 / British West Indies Grid,1273,projected,4400,,4601,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2002,Dominica 1945 / British West Indies Grid,1082,projected,4400,,4602,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2003,Grenada 1953 / British West Indies Grid,1551,projected,4400,,4603,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2004,Montserrat 58 / British West Indies Grid,1165,projected,4400,,4604,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2005,St Kitts 1955 / British West Indies Grid,1200,projected,4400,,4605,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2006,St Lucia 1955 / British West Indies Grid,1201,projected,4400,,4606,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2007,St Vincent 45 / British West Indies Grid,1202,projected,4400,,4607,19942,,,Large and medium scale topographic mapping and engineering survey.,,Ordnance Survey of Great Britain,EPSG,2000-03-07 00:00:00,99.74,1,0
+2008,NAD27(CGQ77) / SCoPQ zone 2,1420,projected,4499,,4609,17700,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2009,NAD27(CGQ77) / SCoPQ zone 3,1421,projected,4499,,4609,17703,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2010,NAD27(CGQ77) / SCoPQ zone 4,1422,projected,4499,,4609,17704,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2011,NAD27(CGQ77) / SCoPQ zone 5,1423,projected,4499,,4609,17705,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2012,NAD27(CGQ77) / SCoPQ zone 6,1424,projected,4499,,4609,17706,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2013,NAD27(CGQ77) / SCoPQ zone 7,1425,projected,4499,,4609,17707,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2014,NAD27(CGQ77) / SCoPQ zone 8,1426,projected,4499,,4609,17708,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2015,NAD27(CGQ77) / SCoPQ zone 9,1427,projected,4499,,4609,17709,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2016,NAD27(CGQ77) / SCoPQ zone 10,1428,projected,4499,,4609,17710,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2017,NAD27(76) / MTM zone 8,1429,projected,4499,,4608,17708,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2018,NAD27(76) / MTM zone 9,1430,projected,4499,,4608,17709,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2019,NAD27(76) / MTM zone 10,1431,projected,4499,,4608,17710,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2020,NAD27(76) / MTM zone 11,1432,projected,4400,,4608,17711,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2021,NAD27(76) / MTM zone 12,1433,projected,4400,,4608,17712,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2022,NAD27(76) / MTM zone 13,1434,projected,4400,,4608,17713,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2023,NAD27(76) / MTM zone 14,1435,projected,4400,,4608,17714,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2024,NAD27(76) / MTM zone 15,1436,projected,4400,,4608,17715,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2025,NAD27(76) / MTM zone 16,1437,projected,4400,,4608,17716,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2026,NAD27(76) / MTM zone 17,1438,projected,4400,,4608,17717,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,2000-03-07 00:00:00,99.74,1,0
+2027,NAD27(76) / UTM zone 15N,1439,projected,4400,,4608,16015,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 15N (code 26715).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2028,NAD27(76) / UTM zone 16N,1440,projected,4400,,4608,16016,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 16N (code 26716).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2029,NAD27(76) / UTM zone 17N,1441,projected,4400,,4608,16017,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 17N (code 26717).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2030,NAD27(76) / UTM zone 18N,1442,projected,4400,,4608,16018,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 18N (code 26718).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2031,NAD27(CGQ77) / UTM zone 17N,1428,projected,4400,,4609,16017,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 17N (code 26717).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2032,NAD27(CGQ77) / UTM zone 18N,1443,projected,4400,,4609,16018,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 18N (code 26718).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2033,NAD27(CGQ77) / UTM zone 19N,1444,projected,4400,,4609,16019,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 19N (code 26719).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2034,NAD27(CGQ77) / UTM zone 20N,1445,projected,4400,,4609,16020,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 20N (code 26720).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2035,NAD27(CGQ77) / UTM zone 21N,1446,projected,4400,,4609,16021,,,Large and medium scale topographic mapping and engineering survey.,Supersedes NAD27 / UTM zone 21N (code 26721).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2036,NAD83(CSRS98) / New Brunswick Stereo,1447,projected,4500,,4140,19946,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-03-07 00:00:00,99.74  99.90,1,1
+2037,NAD83(CSRS98) / UTM zone 19N,1448,projected,4400,,4140,16019,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-03-07 00:00:00,99.74  99.90,1,1
+2038,NAD83(CSRS98) / UTM zone 20N,1449,projected,4400,,4140,16020,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-03-07 00:00:00,99.74  99.90,1,1
+2039,Israel / Israeli TM Grid,2603,projected,4400,,4141,18204,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Israeli CS Grid (EPSG code 28193).,Survey of Israel.,EPSG,2002-06-22 00:00:00,99.74  2002.34,1,0
+2040,Locodjo 1965 / UTM zone 30N,1450,projected,4400,,4142,16030,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Abidjan 87 / UTM 30N (EPSG code 2041).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2041,Abidjan 1987 / UTM zone 30N,1450,projected,4400,,4143,16030,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Locodjo 65 / UTM 30N (EPSG code 2040).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2042,Locodjo 1965 / UTM zone 29N,1451,projected,4400,,4142,16029,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Abidjan 87 / UTM 29N (EPSG code 2043).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2043,Abidjan 1987 / UTM zone 29N,1451,projected,4400,,4143,16029,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Locodjo 65 / UTM 29N (EPSG code 2042).,IGN Paris,EPSG,2000-03-07 00:00:00,99.74,1,0
+2044,Hanoi 1972 / Gauss-Kruger zone 18,1452,projected,4530,,4147,16218,,,Large and medium scale topographic mapping and engineering survey.,Replaces use of Indian 1960 / UTM zone 48 after 1988.,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2045,Hanoi 1972 / Gauss-Kruger zone 19,1453,projected,4530,,4147,16219,,,Large and medium scale topographic mapping and engineering survey.,Replaces use of Indian 1960 / UTM zone 49 after 1988.,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2046,Hartebeesthoek94 / Lo15,1454,projected,6503,,4148,17515,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2047,Hartebeesthoek94 / Lo17,1455,projected,6503,,4148,17517,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2048,Hartebeesthoek94 / Lo19,1456,projected,6503,,4148,17519,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2049,Hartebeesthoek94 / Lo21,1457,projected,6503,,4148,17521,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2050,Hartebeesthoek94 / Lo23,1458,projected,6503,,4148,17523,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2051,Hartebeesthoek94 / Lo25,1459,projected,6503,,4148,17525,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2052,Hartebeesthoek94 / Lo27,1460,projected,6503,,4148,17527,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2053,Hartebeesthoek94 / Lo29,1461,projected,6503,,4148,17529,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2054,Hartebeesthoek94 / Lo31,1462,projected,6503,,4148,17531,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2055,Hartebeesthoek94 / Lo33,1463,projected,6503,,4148,17533,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-03-07 00:00:00,99.74  99.96  99.98  2000.04,1,0
+2056,CH1903+ / LV95,1286,projected,4498,,4150,19950,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes CH1903/LV03 (code 21781).,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2057,Rassadiran / Nakhl e Taqi,1338,projected,4400,,4153,19951,,,Engineering survey for terminal site only.,,Total-Fina,EPSG,2000-03-07 00:00:00,99.74,1,0
+2058,ED50(ED77) / UTM zone 38N,1464,projected,4400,,4154,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2059,ED50(ED77) / UTM zone 39N,1465,projected,4400,,4154,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2060,ED50(ED77) / UTM zone 40N,1466,projected,4400,,4154,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2061,ED50(ED77) / UTM zone 41N,1467,projected,4400,,4154,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2062,Madrid 1870 (Madrid) / Spain,1217,projected,4499,,4903,19921,,,Large and medium scale topographic mapping and engineering survey.,Superseded by ED50 / UTM after 1966.,,EPSG,2000-03-07 00:00:00,99.74,1,0
+2063,Dabola 1981 / UTM zone 28N,1468,projected,4400,,4315,16028,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Conakry 1905 / UTM zone 28 (EPSG code 31528).,,EPSG,1999-12-09 00:00:00,,1,0
+2064,Dabola 1981 / UTM zone 29N,1469,projected,4400,,4315,16029,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Conakry 1905 / UTM zone 29 (EPSG code 31529).,,EPSG,1999-12-09 00:00:00,,1,0
+2065,S-JTSK (Ferro) / Krovak,1306,projected,6501,,4818,19952,,,Large and medium scale topographic mapping and engineering survey.,,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,1,0
+2066,Mount Dillon / Tobago Grid,1322,projected,4407,,4157,19924,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,0
+2067,Naparima 1955 / UTM zone 20N,1339,projected,4400,,4158,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,0
+2068,ELD79 / Libya zone 5,1470,projected,4499,,4159,18240,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2069,ELD79 / Libya zone 6,1471,projected,4499,,4159,18241,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2070,ELD79 / Libya zone 7,1472,projected,4499,,4159,18242,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2071,ELD79 / Libya zone 8,1473,projected,4499,,4159,18243,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2072,ELD79 / Libya zone 9,1474,projected,4499,,4159,18244,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2073,ELD79 / Libya zone 10,1475,projected,4499,,4159,18245,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2074,ELD79 / Libya zone 11,1476,projected,4499,,4159,18246,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2075,ELD79 / Libya zone 12,1477,projected,4499,,4159,18247,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2076,ELD79 / Libya zone 13,1478,projected,4499,,4159,18248,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2077,ELD79 / UTM zone 32N,1479,projected,4400,,4159,16032,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2078,ELD79 / UTM zone 33N,1480,projected,4400,,4159,16033,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2079,ELD79 / UTM zone 34N,1481,projected,4400,,4159,16034,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2080,ELD79 / UTM zone 35N,1478,projected,4400,,4159,16035,,,Large and medium scale topographic mapping and engineering survey.,,Brown and Root,EPSG,2000-03-07 00:00:00,,1,0
+2081,Chos Malal 1914 / Argentina zone 2,1483,projected,4530,,4160,18032,,,Oil exploration.,,Various oil industry records,EPSG,2002-06-22 00:00:00,2002.36,1,0
+2082,Pampa del Castillo / Argentina zone 2,1484,projected,4530,,4161,18032,,,Oil exploration.,,Various oil industry records,EPSG,2002-06-22 00:00:00,2002.36,1,0
+2083,Hito XVIII 1963 / Argentina zone 2,1485,projected,4530,,4254,18032,,,Large and medium scale topographic mapping and engineering survey.,,Total-Fina,EPSG,2002-06-22 00:00:00,2002.36,1,0
+2084,Hito XVIII 1963 / UTM zone 19S,1486,projected,4400,,4254,16119,,,Large and medium scale topographic mapping and engineering survey.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2085,NAD27 / Cuba Norte,1487,projected,4532,,4267,18061,,,Large and medium scale topographic mapping and engineering survey.,,Institut Cubano di Hidrografia (ICH),EPSG,2000-03-07 00:00:00,,1,0
+2086,NAD27 / Cuba Sur,1488,projected,4532,,4267,18062,,,Large and medium scale topographic mapping and engineering survey.,,Institut Cubano di Hidrografia (ICH),EPSG,2000-03-07 00:00:00,,1,0
+2087,ELD79 / TM 12 NE,1482,projected,4400,,4159,16412,,,Oil exploration.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2088,Carthage / TM 11 NE,1489,projected,4400,,4223,16411,,,Oil exploration by Total.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2089,Yemen NGN96 / UTM zone 38N,1490,projected,4400,,4163,16038,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+2090,Yemen NGN96 / UTM zone 39N,1491,projected,4400,,4163,16039,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+2091,South Yemen / Gauss Kruger zone 8,1492,projected,4530,,4164,16208,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,1
+2092,South Yemen / Gauss Kruger zone 9,1493,projected,4530,,4164,16209,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,1
+2093,Hanoi 1972 / GK 106 NE,1494,projected,4530,,4147,16586,,,Used for cadastral and large scale topographic mapping.,,BP Amoco,EPSG,2000-03-07 00:00:00,,1,0
+2094,WGS 72BE / TM 106 NE,1495,projected,4400,,4324,16506,,,Oil exploration by Total for blocks 10 and 11-1.,,Total-Fina,EPSG,2000-03-07 00:00:00,,1,0
+2095,Bissau / UTM zone 28N,1113,projected,4400,,4165,16028,,,Large and medium scale topographic mapping and engineering survey.,,US National Imagery and Mapping Agency TR8350.2.,EPSG,2000-03-07 00:00:00,,1,0
+2096,Korean 1985 / Korea East Belt,1496,projected,4530,,4162,18251,,,Large and medium scale topographic mapping and engineering survey.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+2097,Korean 1985 / Korea Central Belt,1497,projected,4530,,4162,18252,,,Large and medium scale topographic mapping and engineering survey.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+2098,Korean 1985 / Korea West Belt,1498,projected,4530,,4162,18253,,,Large and medium scale topographic mapping and engineering survey.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+2099,Qatar 1948 / Qatar Grid,1346,projected,4400,,4286,19953,,,Large and medium scale topographic mapping and engineering survey.,Also known as Qatar Plane Coordinate or QPC system.  Superseded by Qatar National Grid (code 28600).,,EPSG,2000-03-07 00:00:00,,1,0
+2202,REGVEN / UTM zone 19N,1694,projected,4400,,4189,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+2203,REGVEN / UTM zone 20N,1695,projected,4400,,4189,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+2204,NAD27 / Tennessee,1411,projected,4497,,4267,15302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,2001.45,1,0
+2205,NAD83 / Kentucky North,2202,projected,4499,,4269,15303,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2246 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2001-11-06 00:00:00,2001.45,1,0
+2206,ED50 / 3-degree Gauss-Kruger zone 9,1524,projected,4530,,4230,16269,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM27 (code 2319).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2207,ED50 / 3-degree Gauss-Kruger zone 10,1525,projected,4530,,4230,16270,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM30 (code 2320).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2208,ED50 / 3-degree Gauss-Kruger zone 11,1526,projected,4530,,4230,16271,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM33 (code 2321).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2209,ED50 / 3-degree Gauss-Kruger zone 12,1527,projected,4530,,4230,16272,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM36 (code 2322).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2210,ED50 / 3-degree Gauss-Kruger zone 13,1528,projected,4530,,4230,16273,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM39 (code 2323).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2211,ED50 / 3-degree Gauss-Kruger zone 14,1529,projected,4530,,4230,16274,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM42 (code 2324).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2212,ED50 / 3-degree Gauss-Kruger zone 15,1530,projected,4530,,4230,16275,,,Large scale topographic mapping and cadastral survey.,Also found with truncated false easting - see ED50 / TM45 (code 2325).,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+2213,ETRS89 / TM 30 NE,2546,projected,4400,,4258,16430,,,Oil industry usage.,,,EPSG,2001-11-06 00:00:00,,1,0
+2214,Douala 1948 / AOF west,1060,projected,4400,,4192,18415,,,Medium and small scale topographic mapping and engineering survey.,Superseded by Manoca 1962 / UTM zone 32N (code 2215).,,EPSG,2002-01-18 00:00:00,,1,0
+2215,Manoca 1962 / UTM zone 32N,1060,projected,4400,,4193,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-01-18 00:00:00,,1,0
+2216,Qornoq 1927 / UTM zone 22N,2573,projected,4400,,4194,16022,,,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+2217,Qornoq 1927 / UTM zone 23N,2572,projected,4400,,4194,16023,,,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+2218,Scoresbysund 1952 / Greenland zone 5 east,2560,projected,4501,,4195,18425,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2219,ATS77 / UTM zone 19N,1531,projected,4400,,4122,16019,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979.  To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-22 00:00:00,,1,0
+2220,ATS77 / UTM zone 20N,1532,projected,4400,,4122,16020,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979.  To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-22 00:00:00,,1,0
+2221,Scoresbysund 1952 / Greenland zone 6 east,2561,projected,4501,,4195,18426,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2222,NAD83 / Arizona East (ft),2167,projected,4495,,4269,15304,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26948. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2223,NAD83 / Arizona Central (ft),2166,projected,4495,,4269,15305,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26949. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2224,NAD83 / Arizona West (ft),2168,projected,4495,,4269,15306,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26950. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2225,NAD83 / California zone 1 (ftUS),2175,projected,4497,,4269,15307,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26941. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2226,NAD83 / California zone 2 (ftUS),2176,projected,4497,,4269,15308,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26942. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2227,NAD83 / California zone 3 (ftUS),2177,projected,4497,,4269,15309,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26943. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2228,NAD83 / California zone 4 (ftUS),2178,projected,4497,,4269,15310,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26944. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2229,NAD83 / California zone 5 (ftUS),2182,projected,4497,,4269,15311,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26945. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2230,NAD83 / California zone 6 (ftUS),2180,projected,4497,,4269,15312,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26946. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2231,NAD83 / Colorado North (ftUS),2184,projected,4497,,4269,15313,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26953. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2232,NAD83 / Colorado Central (ftUS),2183,projected,4497,,4269,15314,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26954. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2233,NAD83 / Colorado South (ftUS),2185,projected,4497,,4269,15315,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26955. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2234,NAD83 / Connecticut (ftUS),1377,projected,4497,,4269,15316,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26956. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2235,NAD83 / Delaware (ftUS),1378,projected,4497,,4269,15317,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26957. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2236,NAD83 / Florida East (ftUS),2186,projected,4497,,4269,15318,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26958. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2237,NAD83 / Florida West (ftUS),2188,projected,4497,,4269,15319,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26959. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2238,NAD83 / Florida North (ftUS),2187,projected,4497,,4269,15320,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26960. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2239,NAD83 / Georgia East (ftUS),2189,projected,4497,,4269,15321,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26966. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2240,NAD83 / Georgia West (ftUS),2190,projected,4497,,4269,15322,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26967. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2241,NAD83 / Idaho East (ftUS),2192,projected,4497,,4269,15323,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26968. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2242,NAD83 / Idaho Central (ftUS),2191,projected,4497,,4269,15324,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26969. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2243,NAD83 / Idaho West (ftUS),2193,projected,4497,,4269,15325,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26970. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2244,NAD83 / Indiana East (ftUS),2196,projected,4497,,4269,15326,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26973. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2245,NAD83 / Indiana West (ftUS),2197,projected,4497,,4269,15327,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26974. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2246,NAD83 / Kentucky North (ftUS),2202,projected,4497,,4269,15328,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 2205. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2247,NAD83 / Kentucky South (ftUS),2203,projected,4497,,4269,15329,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26980. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2248,NAD83 / Maryland (ftUS),1389,projected,4497,,4269,15330,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26985. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2249,NAD83 / Massachusetts Mainland (ftUS),2209,projected,4497,,4269,15331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26986. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2250,NAD83 / Massachusetts Island (ftUS),2208,projected,4497,,4269,15332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26987. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2251,NAD83 / Michigan North (ft),1723,projected,4495,,4269,15333,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26988. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2252,NAD83 / Michigan Central (ft),1724,projected,4495,,4269,15334,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26989. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2253,NAD83 / Michigan South (ft),1725,projected,4495,,4269,15335,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26990. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2254,NAD83 / Mississippi East (ftUS),2216,projected,4497,,4269,15336,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26994. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2255,NAD83 / Mississippi West (ftUS),2217,projected,4497,,4269,15337,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 26995. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2256,NAD83 / Montana (ft),1395,projected,4495,,4269,15338,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32100. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2257,NAD83 / New Mexico East (ftUS),2228,projected,4497,,4269,15339,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32112. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2258,NAD83 / New Mexico Central (ftUS),2231,projected,4497,,4269,15340,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32113. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2259,NAD83 / New Mexico West (ftUS),2232,projected,4497,,4269,15341,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32114. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2260,NAD83 / New York East (ftUS),2234,projected,4497,,4269,15342,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32115. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2261,NAD83 / New York Central (ftUS),2233,projected,4497,,4269,15343,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32116. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2262,NAD83 / New York West (ftUS),2236,projected,4497,,4269,15344,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32117. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2263,NAD83 / New York Long Island (ftUS),2235,projected,4497,,4269,15345,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32118. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2264,NAD83 / North Carolina (ftUS),1402,projected,4497,,4269,15346,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32119.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2265,NAD83 / North Dakota North (ft),2237,projected,4495,,4269,15347,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32120. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2266,NAD83 / North Dakota South (ft),2238,projected,4495,,4269,15348,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32121. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2267,NAD83 / Oklahoma North (ftUS),2241,projected,4497,,4269,15349,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32124. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2268,NAD83 / Oklahoma South (ftUS),2242,projected,4497,,4269,15350,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32125. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2269,NAD83 / Oregon North (ft),2243,projected,4495,,4269,15351,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32126. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2270,NAD83 / Oregon South (ft),2244,projected,4495,,4269,15352,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32127. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2271,NAD83 / Pennsylvania North (ftUS),2245,projected,4497,,4269,15353,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32128.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2272,NAD83 / Pennsylvania South (ftUS),2246,projected,4497,,4269,15354,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32129.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2273,NAD83 / South Carolina (ft),1409,projected,4495,,4269,15355,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32133.,National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2274,NAD83 / Tennessee (ftUS),1411,projected,4497,,4269,15356,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32136. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2275,NAD83 / Texas North (ftUS),2253,projected,4497,,4269,15357,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32137. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2276,NAD83 / Texas North Central (ftUS),2254,projected,4497,,4269,15358,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32138. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2277,NAD83 / Texas Central (ftUS),2252,projected,4497,,4269,15359,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32139. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2278,NAD83 / Texas South Central (ftUS),2527,projected,4497,,4269,15360,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32140. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2279,NAD83 / Texas South (ftUS),2528,projected,4497,,4269,15361,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32141. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2280,NAD83 / Utah North (ft),2258,projected,4495,,4269,15362,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32142. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2281,NAD83 / Utah Central (ft),2257,projected,4495,,4269,15363,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32143. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2282,NAD83 / Utah South (ft),2259,projected,4495,,4269,15364,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32144. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2283,NAD83 / Virginia North (ftUS),2260,projected,4497,,4269,15365,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32146. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2284,NAD83 / Virginia South (ftUS),2261,projected,4497,,4269,15366,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32147. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2285,NAD83 / Washington North (ftUS),2273,projected,4497,,4269,15367,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32148. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2286,NAD83 / Washington South (ftUS),2274,projected,4497,,4269,15368,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32149. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2287,NAD83 / Wisconsin North (ftUS),2267,projected,4497,,4269,15369,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32152. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2288,NAD83 / Wisconsin Central (ftUS),2266,projected,4497,,4269,15370,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32153. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2289,NAD83 / Wisconsin South (ftUS),2268,projected,4497,,4269,15371,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  Federal definition is metric - see code 32154. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",National Geodetic Survey  http://www.ngs.noaa.gov/INFO/Policy/st_plane.html,EPSG,2001-11-06 00:00:00,,1,0
+2290,ATS77 / Prince Edward Isl. Stereographic (ATS77),1533,projected,4496,,4122,19933,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979.  To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+2291,NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83),1533,projected,4496,,4122,19960,,,Large and medium scale topographic mapping and engineering survey.,Deprecated due to error in source geogCRS.,PEI Department of Transportation & Public Works,EPSG,2000-10-19 00:00:00,,1,1
+2292,NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83),1533,projected,4496,,4140,19960,,,Large and medium scale topographic mapping and engineering survey.,,PEI Department of Transportation & Public Works,EPSG,2001-08-28 00:00:00,,1,1
+2294,ATS77 / MTM Nova Scotia zone 4,1534,projected,4400,,4122,17794,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979.  To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+2295,ATS77 / MTM Nova Scotia zone 5,1535,projected,4400,,4122,17795,,,Large and medium scale topographic mapping and engineering survey.,In use from 1979.  To be phased out in late 1990's.,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,1997-11-13 00:00:00,,1,0
+2296,Ammassalik 1958 / Greenland zone 7 east,2562,projected,4501,,4196,18427,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2297,Qornoq 1927 / Greenland zone 1 east,2556,projected,4501,,4194,18421,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2298,Qornoq 1927 / Greenland zone 2 east,2557,projected,4501,,4194,18422,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2299,Qornoq 1927 / Greenland zone 2 west,2563,projected,4501,,4194,18432,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2300,Qornoq 1927 / Greenland zone 3 east,2558,projected,4501,,4194,18423,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2301,Qornoq 1927 / Greenland zone 3 west,2564,projected,4501,,4194,18433,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2302,Qornoq 1927 / Greenland zone 4 east,2559,projected,4501,,4194,18424,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2303,Qornoq 1927 / Greenland zone 4 west,2565,projected,4501,,4194,18434,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2304,Qornoq 1927 / Greenland zone 5 west,2566,projected,4501,,4194,18435,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2305,Qornoq 1927 / Greenland zone 6 west,2567,projected,4501,,4194,18436,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2306,Qornoq 1927 / Greenland zone 7 west,2568,projected,4501,,4194,18437,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2307,Qornoq 1927 / Greenland zone 8 east,2569,projected,4501,,4194,18428,,,Topographic mapping.,Coordinate system second axis has abbreviation E but is positive to the west.,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-26 00:00:00,,1,0
+2308,Batavia / TM 109 SE,2577,projected,4400,,4211,16709,,,Used by Arco and BP for ONWJ.,,BP Indonesia.,EPSG,2002-02-12 00:00:00,,1,0
+2309,WGS 84 / TM 116 SE,2588,projected,4400,,4326,16716,,,Used by BP for Terang-Sirasun.,,BP Indonesia.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+2310,WGS 84 / TM 132 SE,2589,projected,4400,,4326,16732,,,Used for hydrocarbons exploration and development.,,BP Indonesia.,EPSG,2002-06-22 00:00:00,2002.151,1,0
+2311,WGS 84 / TM 6 NE,1717,projected,4400,,4326,16406,,,Used for oil exploration by ExxonMobil.,,ExxonMobil.,EPSG,2002-02-12 00:00:00,,1,0
+2312,Garoua / UTM zone 33N,2590,projected,4400,,4197,16033,,,Large and medium scale topographic mapping and engineering survey.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2313,Kousseri / UTM zone 33N,2591,projected,4400,,4198,16033,,,Large and medium scale topographic mapping and engineering survey.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2314,Trinidad 1903 / Trinidad Grid (ftCla),1322,projected,4403,,4302,19975,,,Oil industry exploration and production.,Foot version of Trinidad 1903 / Trinidad Grid (code 30200) used by some US-based companies including Amoco Trinidad.,BP,EPSG,2002-02-12 00:00:00,,1,0
+2315,Campo Inchauspe / UTM zone 19S,2596,projected,4400,,4221,16119,,,Oil industry exploration.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2316,Campo Inchauspe / UTM zone 20S,2597,projected,4400,,4221,16120,,,Oil industry exploration.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+2317,PSAD56 / ICN Regional,1251,projected,4499,,4248,19976,,,Small scale topographic and geological mapping.,,Institute Cartografica Nacional,EPSG,2002-02-12 00:00:00,,1,0
+2318,Ain el Abd / Aramco Lambert,1206,projected,4400,,4204,19977,,,Oil industry exploration and production.,Used by Saudi Aramco when area of interest crosses UTM zone boundary. Adopted by partners for Core Venture 1 (South Ghawar) area.,Saudi Aramco,EPSG,2002-02-12 00:00:00,,1,0
+2319,ED50 / TM27,1524,projected,4530,,4230,16369,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 9 (code 2206).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2320,ED50 / TM30,1525,projected,4530,,4230,16370,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 10 (code 2207).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2321,ED50 / TM33,1526,projected,4530,,4230,16371,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 11 (code 2208).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2322,ED50 / TM36,1527,projected,4530,,4230,16372,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 12 (code 2209).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2323,ED50 / TM39,1528,projected,4530,,4230,16373,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 13 (code 2210).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2324,ED50 / TM42,1529,projected,4530,,4230,16374,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 14 (code 2211).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2325,ED50 / TM45,1530,projected,4530,,4230,16375,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with zone number prefix to false easting - see ED50 / 3-degree Gauss-Kruger zone 15 (code 2212).,General Command of Mapping via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2326,Hong Kong 1980 Grid System,1118,projected,4500,,4611,19978,,,"Large scale topographic mapping, cadastral and engineering survey.",Supersedes Hong Kong 1963 Grid system and its 1976 metric variant.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+2327,Xian 1980 / Gauss-Kruger zone 13,1587,projected,4530,,4610,16213,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 75E (code 2338).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2328,Xian 1980 / Gauss-Kruger zone 14,1588,projected,4530,,4610,16214,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 81E (code 2339).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2329,Xian 1980 / Gauss-Kruger zone 15,1589,projected,4530,,4610,16215,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 87E (code 2340).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2330,Xian 1980 / Gauss-Kruger zone 16,1590,projected,4530,,4610,16216,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 93E (code 2341).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2331,Xian 1980 / Gauss-Kruger zone 17,1591,projected,4530,,4610,16217,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 99E (code 2342).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2332,Xian 1980 / Gauss-Kruger zone 18,1592,projected,4530,,4610,16218,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 105E (code 2343).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2333,Xian 1980 / Gauss-Kruger zone 19,1593,projected,4530,,4610,16219,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 111E (code 2344).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2334,Xian 1980 / Gauss-Kruger zone 20,1594,projected,4530,,4610,16220,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 117E (code 2345).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2335,Xian 1980 / Gauss-Kruger zone 21,1595,projected,4530,,4610,16221,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 123E (code 2346).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2336,Xian 1980 / Gauss-Kruger zone 22,1596,projected,4530,,4610,16222,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 129E (code 2347).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2337,Xian 1980 / Gauss-Kruger zone 23,1597,projected,4530,,4610,16223,,,Medium scale topographic mapping.,Also found with truncated false easting - see Xian 1980 / [6-degree] Gauss-Kruger CM 135E (code 2348).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2338,Xian 1980 / Gauss-Kruger CM 75E,1587,projected,4530,,4610,16313,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 13 (code 2327).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2339,Xian 1980 / Gauss-Kruger CM 81E,1588,projected,4530,,4610,16314,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 14 (code 2328).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2340,Xian 1980 / Gauss-Kruger CM 87E,1589,projected,4530,,4610,16315,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 15 (code 2329).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2341,Xian 1980 / Gauss-Kruger CM 93E,1590,projected,4530,,4610,16316,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 16 (code 2330).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2342,Xian 1980 / Gauss-Kruger CM 99E,1591,projected,4530,,4610,16317,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 17 (code 2331).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2343,Xian 1980 / Gauss-Kruger CM 105E,1592,projected,4530,,4610,16318,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 18 (code 2332).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2344,Xian 1980 / Gauss-Kruger CM 111E,1593,projected,4530,,4610,16319,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 19 (code 2333).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2345,Xian 1980 / Gauss-Kruger CM 117E,1594,projected,4530,,4610,16320,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 20 (code 2334).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2346,Xian 1980 / Gauss-Kruger CM 123E,1595,projected,4530,,4610,16321,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 21 (code 2335).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2347,Xian 1980 / Gauss-Kruger CM 129E,1596,projected,4530,,4610,16322,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 22 (code 2336).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2348,Xian 1980 / Gauss-Kruger CM 135E,1597,projected,4530,,4610,16323,,,Medium scale topographic mapping.,Truncated form of Xian 1980 / [6-degree] Gauss-Kruger zone 23 (code 2337).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2349,Xian 1980 / 3-degree Gauss-Kruger zone 25,2711,projected,4530,,4610,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 75E (code 2370).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2350,Xian 1980 / 3-degree Gauss-Kruger zone 26,2712,projected,4530,,4610,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 78E (code 2371).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2351,Xian 1980 / 3-degree Gauss-Kruger zone 27,2713,projected,4530,,4610,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 81E (code 2372).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2352,Xian 1980 / 3-degree Gauss-Kruger zone 28,2714,projected,4530,,4610,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 84E (code 2373).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2353,Xian 1980 / 3-degree Gauss-Kruger zone 29,2715,projected,4530,,4610,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 87E (code 2374).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2354,Xian 1980 / 3-degree Gauss-Kruger zone 30,2716,projected,4530,,4610,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 90E (code 2375).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2355,Xian 1980 / 3-degree Gauss-Kruger zone 31,2717,projected,4530,,4610,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 93E (code 2376).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2356,Xian 1980 / 3-degree Gauss-Kruger zone 32,2718,projected,4530,,4610,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 96E (code 2377).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2357,Xian 1980 / 3-degree Gauss-Kruger zone 33,2719,projected,4530,,4610,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 99E (code 2378).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2358,Xian 1980 / 3-degree Gauss-Kruger zone 34,2720,projected,4530,,4610,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 102E (code 2379).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2359,Xian 1980 / 3-degree Gauss-Kruger zone 35,2721,projected,4530,,4610,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 105E (code 2380).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2360,Xian 1980 / 3-degree Gauss-Kruger zone 36,2722,projected,4530,,4610,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 108E (code 2381).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2361,Xian 1980 / 3-degree Gauss-Kruger zone 37,2723,projected,4530,,4610,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 111E (code 2382).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2362,Xian 1980 / 3-degree Gauss-Kruger zone 38,2724,projected,4530,,4610,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 114E (code 2383).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2363,Xian 1980 / 3-degree Gauss-Kruger zone 39,2725,projected,4530,,4610,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 117E (code 2384).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2364,Xian 1980 / 3-degree Gauss-Kruger zone 40,2726,projected,4530,,4610,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 123E (code 2385).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2365,Xian 1980 / 3-degree Gauss-Kruger zone 41,2727,projected,4530,,4610,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 126E (code 2386).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2366,Xian 1980 / 3-degree Gauss-Kruger zone 42,2728,projected,4530,,4610,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 126E (code 2387).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2367,Xian 1980 / 3-degree Gauss-Kruger zone 43,2729,projected,4530,,4610,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 129E (code 2388).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2368,Xian 1980 / 3-degree Gauss-Kruger zone 44,2730,projected,4530,,4610,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 132E (code 2389).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2369,Xian 1980 / 3-degree Gauss-Kruger zone 45,2731,projected,4530,,4610,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Xian 1980 / 3-degree Gauss-Kruger CM 135E (code 2390).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2370,Xian 1980 / 3-degree Gauss-Kruger CM 75E,2711,projected,4530,,4610,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 25 (code 2349).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2371,Xian 1980 / 3-degree Gauss-Kruger CM 78E,2712,projected,4530,,4610,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 26 (code 2350).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2372,Xian 1980 / 3-degree Gauss-Kruger CM 81E,2713,projected,4530,,4610,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 27 (code 2351).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2373,Xian 1980 / 3-degree Gauss-Kruger CM 84E,2714,projected,4530,,4610,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 28 (code 2352).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2374,Xian 1980 / 3-degree Gauss-Kruger CM 87E,2715,projected,4530,,4610,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 29 (code 2353).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2375,Xian 1980 / 3-degree Gauss-Kruger CM 90E,2716,projected,4530,,4610,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 30 (code 2354).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2376,Xian 1980 / 3-degree Gauss-Kruger CM 93E,2717,projected,4530,,4610,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 31 (code 2355).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2377,Xian 1980 / 3-degree Gauss-Kruger CM 96E,2718,projected,4530,,4610,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 32 (code 2356).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2378,Xian 1980 / 3-degree Gauss-Kruger CM 99E,2719,projected,4530,,4610,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 33 (code 2357).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2379,Xian 1980 / 3-degree Gauss-Kruger CM 102E,2720,projected,4530,,4610,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 34 (code 2358).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2380,Xian 1980 / 3-degree Gauss-Kruger CM 105E,2721,projected,4530,,4610,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 35 (code 2359).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2381,Xian 1980 / 3-degree Gauss-Kruger CM 108E,2722,projected,4530,,4610,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 36 (code 2360).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2382,Xian 1980 / 3-degree Gauss-Kruger CM 111E,2723,projected,4530,,4610,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 37 (code 2361).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2383,Xian 1980 / 3-degree Gauss-Kruger CM 114E,2724,projected,4530,,4610,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 38 (code 2362).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2384,Xian 1980 / 3-degree Gauss-Kruger CM 117E,2725,projected,4530,,4610,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 39 (code 2363).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2385,Xian 1980 / 3-degree Gauss-Kruger CM 120E,2726,projected,4530,,4610,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 40 (code 2364).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2386,Xian 1980 / 3-degree Gauss-Kruger CM 123E,2727,projected,4530,,4610,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 41 (code 2365).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2387,Xian 1980 / 3-degree Gauss-Kruger CM 126E,2728,projected,4530,,4610,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 42 (code 2366).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2388,Xian 1980 / 3-degree Gauss-Kruger CM 129E,2729,projected,4530,,4610,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 43 (code 2367).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2389,Xian 1980 / 3-degree Gauss-Kruger CM 132E,2730,projected,4530,,4610,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 44 (code 2368).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2390,Xian 1980 / 3-degree Gauss-Kruger CM 135E,2731,projected,4530,,4610,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Xian 1980 / 3-degree Gauss-Kruger zone 45 (code 2369).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2391,KKJ / Finland zone 1,1536,projected,4530,,4123,18191,,,Large and medium scale topographic mapping and engineering survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2392,KKJ / Finland zone 2,1537,projected,4530,,4123,18192,,,Large and medium scale topographic mapping and engineering survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2393,KKJ / Finland Uniform Coordinate System,1538,projected,4530,,4123,18193,,,Large and medium scale topographic mapping and engineering survey.,Known as Uniform Coordinate System when used over all country and also as Basic Coordinate System zone 3 at larger scales.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2394,KKJ / Finland zone 4,1539,projected,4530,,4123,18194,,,Large and medium scale topographic mapping and engineering survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+2395,South Yemen / Gauss-Kruger zone 8,1492,projected,4530,,4164,16208,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2002-06-22 00:00:00,,1,0
+2396,South Yemen / Gauss-Kruger zone 9,1493,projected,4530,,4164,16209,,,Large and medium scale topographic mapping and engineering survey.,,IGN Paris,EPSG,2002-06-22 00:00:00,,1,0
+2397,Pulkovo 1942(83) / Gauss-Kruger zone 3,1512,projected,4530,,4178,16263,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",In Thuringen superseded by DHDN / Gauss Kruger zone 3.,EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2398,Pulkovo 1942(83) / Gauss-Kruger zone 4,1513,projected,4530,,4178,16264,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N. 
+In Sachsen and Thuringen superseded by DHDN / Gauss Kruger zone 4.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2399,Pulkovo 1942(83) / Gauss-Kruger zone 5,1512,projected,4530,,4178,16265,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.","In Brandenburg superseded by ETRS89 / UTM zone 33N. 
+In Sachsen superseded by DHDN / Gauss Kruger zone 5.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2400,RT90 2.5 gon W,1225,projected,4530,,4124,19929,,,Large and medium scale topographic mapping and engineering survey.,,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+2401,Beijing 1954 / 3-degree Gauss-Kruger zone 25,2711,projected,4530,,4214,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 75E (code 2422). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 25 (code 2349).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2402,Beijing 1954 / 3-degree Gauss-Kruger zone 26,2712,projected,4530,,4214,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 78E (code 2423). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 26 (code 2350).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2403,Beijing 1954 / 3-degree Gauss-Kruger zone 27,2713,projected,4530,,4214,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 81E (code 2424). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 27 (code 2351).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2404,Beijing 1954 / 3-degree Gauss-Kruger zone 28,2714,projected,4530,,4214,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 84E (code 2425). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 28 (code 2352).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2405,Beijing 1954 / 3-degree Gauss-Kruger zone 29,2715,projected,4530,,4214,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 87E (code 2426). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 29 (code 2353).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2406,Beijing 1954 / 3-degree Gauss-Kruger zone 30,2716,projected,4530,,4214,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 90E (code 2427). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 30 (code 2354).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2407,Beijing 1954 / 3-degree Gauss-Kruger zone 31,2717,projected,4530,,4214,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 93E (code 2428). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 31 (code 2355).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2408,Beijing 1954 / 3-degree Gauss-Kruger zone 32,2718,projected,4530,,4214,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 96E (code 2429). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 32 (code 2356).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2409,Beijing 1954 / 3-degree Gauss-Kruger zone 33,2719,projected,4530,,4214,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 99E (code 2430). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 33 (code 2357).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2410,Beijing 1954 / 3-degree Gauss-Kruger zone 34,2720,projected,4530,,4214,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 102E (code 2431). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 34 (code 2358).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2411,Beijing 1954 / 3-degree Gauss-Kruger zone 35,2721,projected,4530,,4214,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 105E (code 2432). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 35 (code 2359).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2412,Beijing 1954 / 3-degree Gauss-Kruger zone 36,2722,projected,4530,,4214,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 108E (code 2433). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 36 (code 2360).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2413,Beijing 1954 / 3-degree Gauss-Kruger zone 37,2723,projected,4530,,4214,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 111E (code 2434). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 37 (code 2361).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2414,Beijing 1954 / 3-degree Gauss-Kruger zone 38,2724,projected,4530,,4214,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 114E (code 2435). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 38 (code 2362).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2415,Beijing 1954 / 3-degree Gauss-Kruger zone 39,2725,projected,4530,,4214,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 117E (code 2436). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 39 (code 2363).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2416,Beijing 1954 / 3-degree Gauss-Kruger zone 40,2726,projected,4530,,4214,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 120E (code 2437). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 40 (code 2364).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2417,Beijing 1954 / 3-degree Gauss-Kruger zone 41,2727,projected,4530,,4214,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 123E (code 2438). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 41 (code 2365).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2418,Beijing 1954 / 3-degree Gauss-Kruger zone 42,2728,projected,4530,,4214,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 126E (code 2439). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 42 (code 2366).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2419,Beijing 1954 / 3-degree Gauss-Kruger zone 43,2729,projected,4530,,4214,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 129E (code 2440). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 43 (code 2367).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2420,Beijing 1954 / 3-degree Gauss-Kruger zone 44,2730,projected,4530,,4214,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 132E (code 2441). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 44 (code 2368).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2421,Beijing 1954 / 3-degree Gauss-Kruger zone 45,2731,projected,4530,,4214,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Beijing 1954 / 3-degree Gauss-Kruger CM 135E (code 2442). Superseded by Xian 1980 / 3-degree Gauss-Kruger zone 45 (code 2369).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2422,Beijing 1954 / 3-degree Gauss-Kruger CM 75E,2711,projected,4530,,4214,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 25 (code 2401). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 75E (code 2370).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2423,Beijing 1954 / 3-degree Gauss-Kruger CM 78E,2712,projected,4530,,4214,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 26 (code 2402). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 78E (code 2371).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2424,Beijing 1954 / 3-degree Gauss-Kruger CM 81E,2713,projected,4530,,4214,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 27 (code 2403). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 81E (code 2372).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2425,Beijing 1954 / 3-degree Gauss-Kruger CM 84E,2714,projected,4530,,4214,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 28 (code 2404). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 84E (code 2373).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2426,Beijing 1954 / 3-degree Gauss-Kruger CM 87E,2715,projected,4530,,4214,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 29 (code 2405). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 87E (code 2374).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2427,Beijing 1954 / 3-degree Gauss-Kruger CM 90E,2716,projected,4530,,4214,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 30 (code 2406). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 90E (code 2375).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2428,Beijing 1954 / 3-degree Gauss-Kruger CM 93E,2717,projected,4530,,4214,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 31 (code 2407). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 93E (code 2376).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2429,Beijing 1954 / 3-degree Gauss-Kruger CM 96E,2718,projected,4530,,4214,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 32 (code 2408). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 96E (code 2377).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2430,Beijing 1954 / 3-degree Gauss-Kruger CM 99E,2719,projected,4530,,4214,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 33 (code 2409). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 99E (code 2378).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2431,Beijing 1954 / 3-degree Gauss-Kruger CM 102E,2720,projected,4530,,4214,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 45 (code 2421). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 102E (code 2379).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2432,Beijing 1954 / 3-degree Gauss-Kruger CM 105E,2721,projected,4530,,4214,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 35 (code 2411). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 105E (code 2380).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2433,Beijing 1954 / 3-degree Gauss-Kruger CM 108E,2722,projected,4530,,4214,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 36 (code 2412). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 108E (code 2381).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2434,Beijing 1954 / 3-degree Gauss-Kruger CM 111E,2723,projected,4530,,4214,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 37 (code 2413). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 111E (code 2382).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2435,Beijing 1954 / 3-degree Gauss-Kruger CM 114E,2724,projected,4530,,4214,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 38 (code 2414). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 114E (code 2383).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2436,Beijing 1954 / 3-degree Gauss-Kruger CM 117E,2725,projected,4530,,4214,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 39 (code 2415). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 117E (code 2384).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2437,Beijing 1954 / 3-degree Gauss-Kruger CM 120E,2726,projected,4530,,4214,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 40 (code 2416). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 120E (code 2385).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2438,Beijing 1954 / 3-degree Gauss-Kruger CM 123E,2727,projected,4530,,4214,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 41 (code 2417). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 123E (code 2386).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2439,Beijing 1954 / 3-degree Gauss-Kruger CM 126E,2728,projected,4530,,4214,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 42 (code 2418). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 126E (code 2387).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2440,Beijing 1954 / 3-degree Gauss-Kruger CM 129E,2729,projected,4530,,4214,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 43 (code 2419). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 129E (code 2388).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2441,Beijing 1954 / 3-degree Gauss-Kruger CM 132E,2730,projected,4530,,4214,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 44 (code 2420). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 132E (code 2389).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2442,Beijing 1954 / 3-degree Gauss-Kruger CM 135E,2731,projected,4530,,4214,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Beijing 1954 / 3-degree Gauss-Kruger zone 45 (code 2421). Superseded by Xian 1980 / 3-degree Gauss-Kruger CM 135E (code 2390).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2443,JGD2000 / Japan Plane Rectangular CS I,1854,projected,4530,,4612,17801,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS I (code 30161).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2444,JGD2000 / Japan Plane Rectangular CS II,1855,projected,4530,,4612,17802,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS II (code 30162).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2445,JGD2000 / Japan Plane Rectangular CS III,1856,projected,4530,,4612,17803,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS III (code 30163).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2446,JGD2000 / Japan Plane Rectangular CS IV,1857,projected,4530,,4612,17804,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS IV (code 30164).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2447,JGD2000 / Japan Plane Rectangular CS V,1858,projected,4530,,4612,17805,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS V (code 30165).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2448,JGD2000 / Japan Plane Rectangular CS VI,1859,projected,4530,,4612,17806,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS VI (code 30166).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2449,JGD2000 / Japan Plane Rectangular CS VII,1860,projected,4530,,4612,17807,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS VII (code 30167).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2450,JGD2000 / Japan Plane Rectangular CS VIII,1861,projected,4530,,4612,17808,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS VIII (code 30168).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2451,JGD2000 / Japan Plane Rectangular CS IX,1862,projected,4530,,4612,17809,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS IX (code 30169).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2452,JGD2000 / Japan Plane Rectangular CS X,1863,projected,4530,,4612,17810,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS X (code 30170).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2453,JGD2000 / Japan Plane Rectangular CS XI,1864,projected,4530,,4612,17811,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XI (code 30171).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2454,JGD2000 / Japan Plane Rectangular CS XII,1865,projected,4530,,4612,17812,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XII (code 30172).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2455,JGD2000 / Japan Plane Rectangular CS XIII,1866,projected,4530,,4612,17813,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XIII (code 30173).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2456,JGD2000 / Japan Plane Rectangular CS XIV,1867,projected,4530,,4612,17814,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XIV (code 30174).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2457,JGD2000 / Japan Plane Rectangular CS XV,1868,projected,4530,,4612,17815,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XV (code 30175).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2458,JGD2000 / Japan Plane Rectangular CS XVI,1869,projected,4530,,4612,17816,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XVI (code 30176).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2459,JGD2000 / Japan Plane Rectangular CS XVII,1870,projected,4530,,4612,17817,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XVII (code 30177).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2460,JGD2000 / Japan Plane Rectangular CS XVIII,1871,projected,4530,,4612,17818,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XVIII (code 30178).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2461,JGD2000 / Japan Plane Rectangular CS XIX,1872,projected,4530,,4612,17819,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Tokyo / Japan Plane Rectangular CS XIX (code 30179).,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,,1,0
+2462,Albanian 1987 / Gauss-Kruger zone 4,1025,projected,4530,,4191,16204,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",,EuroGeographics; http://crs.ifag.de/,EPSG,2002-06-22 00:00:00,,1,0
+2463,Pulkovo 1995 / Gauss-Kruger CM 21E,1763,projected,4530,,4200,16304,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 4 (code 20004).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,0
+2464,Pulkovo 1995 / Gauss-Kruger CM 27E,1764,projected,4530,,4200,16305,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 5 (code 20005).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2465,Pulkovo 1995 / Gauss-Kruger CM 33E,1765,projected,4530,,4200,16306,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 6 (code 20006).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2466,Pulkovo 1995 / Gauss-Kruger CM 39E,1766,projected,4530,,4200,16307,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 7 (code 20007).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2467,Pulkovo 1995 / Gauss-Kruger CM 45E,1767,projected,4530,,4200,16308,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 8 (code 20008).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2468,Pulkovo 1995 / Gauss-Kruger CM 51E,1768,projected,4530,,4200,16309,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 9 (code 20009).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2469,Pulkovo 1995 / Gauss-Kruger CM 57E,1769,projected,4530,,4200,16310,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 10 (code 20010).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2470,Pulkovo 1995 / Gauss-Kruger CM 63E,1770,projected,4530,,4200,16311,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 11 (code 20011).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2471,Pulkovo 1995 / Gauss-Kruger CM 69E,1771,projected,4530,,4200,16312,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 12 (code 20012).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2472,Pulkovo 1995 / Gauss-Kruger CM 75E,1772,projected,4530,,4200,16313,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 13 (code 20013).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2473,Pulkovo 1995 / Gauss-Kruger CM 81E,1773,projected,4530,,4200,16314,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 14 (code 20014).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2474,Pulkovo 1995 / Gauss-Kruger CM 87E,1774,projected,4530,,4200,16315,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 15 (code 20015).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2475,Pulkovo 1995 / Gauss-Kruger CM 93E,1775,projected,4530,,4200,16316,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 16 (code 20016).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2476,Pulkovo 1995 / Gauss-Kruger CM 99E,1776,projected,4530,,4200,16317,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 17 (code 20017).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2477,Pulkovo 1995 / Gauss-Kruger CM 105E,1777,projected,4530,,4200,16318,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 18 (code 20018).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2478,Pulkovo 1995 / Gauss-Kruger CM 111E,1778,projected,4530,,4200,16319,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 19 (code 20019).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2479,Pulkovo 1995 / Gauss-Kruger CM 117E,1779,projected,4530,,4200,16320,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 20 (code 20020).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2480,Pulkovo 1995 / Gauss-Kruger CM 123E,1780,projected,4530,,4200,16321,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 21 (code 20021).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2481,Pulkovo 1995 / Gauss-Kruger CM 129E,1781,projected,4530,,4200,16322,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 22 (code 20022).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2482,Pulkovo 1995 / Gauss-Kruger CM 135E,1782,projected,4530,,4200,16323,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 23 (code 20023).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2483,Pulkovo 1995 / Gauss-Kruger CM 141E,1783,projected,4530,,4200,16324,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 24 (code 20024).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2484,Pulkovo 1995 / Gauss-Kruger CM 147E,1784,projected,4530,,4200,16325,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 25 (code 20025).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2485,Pulkovo 1995 / Gauss-Kruger CM 153E,1785,projected,4530,,4200,16326,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 26 (code 20026).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2486,Pulkovo 1995 / Gauss-Kruger CM 159E,1786,projected,4530,,4200,16327,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 27 (code 20027).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2487,Pulkovo 1995 / Gauss-Kruger CM 165E,1787,projected,4530,,4200,16328,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 28 (code 20028).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2488,Pulkovo 1995 / Gauss-Kruger CM 171E,1788,projected,4530,,4200,16329,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 29 (code 20029).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2489,Pulkovo 1995 / Gauss-Kruger CM 177E,1789,projected,4530,,4200,16330,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 30 (code 20030).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2490,Pulkovo 1995 / Gauss-Kruger CM 177W,1790,projected,4530,,4200,16331,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 31 (code 20031).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2491,Pulkovo 1995 / Gauss-Kruger CM 171W,1791,projected,4530,,4200,16332,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1995 / Gauss-Kruger zone 32 (code 20032).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,,1,0
+2492,Pulkovo 1942 / Gauss-Kruger CM 9E,1805,projected,4530,,4284,16302,,,Military mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 2 (code 28402).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2493,Pulkovo 1942 / Gauss-Kruger CM 15E,1792,projected,4530,,4284,16303,,,Military mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 3 (code 28403).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2494,Pulkovo 1942 / Gauss-Kruger CM 21E,1793,projected,4530,,4284,16304,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 4 (code 28404).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2495,Pulkovo 1942 / Gauss-Kruger CM 27E,1794,projected,4530,,4284,16305,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 5 (code 28405).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2496,Pulkovo 1942 / Gauss-Kruger CM 33E,1795,projected,4530,,4284,16306,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 6 (code 28406).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2497,Pulkovo 1942 / Gauss-Kruger CM 39E,1796,projected,4530,,4284,16307,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 7 (code 28407).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2498,Pulkovo 1942 / Gauss-Kruger CM 45E,1797,projected,4530,,4284,16308,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 8 (code 28408).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2499,Pulkovo 1942 / Gauss-Kruger CM 51E,1798,projected,4530,,4284,16309,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 9 (code 28409).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2500,Pulkovo 1942 / Gauss-Kruger CM 57E,1799,projected,4530,,4284,16310,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 10 (code 28410).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2501,Pulkovo 1942 / Gauss-Kruger CM 63E,1800,projected,4530,,4284,16311,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 11 (code 28411).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2502,Pulkovo 1942 / Gauss-Kruger CM 69E,1801,projected,4530,,4284,16312,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 12 (code 28412).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2503,Pulkovo 1942 / Gauss-Kruger CM 75E,1802,projected,4530,,4284,16313,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 13 (code 28413).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2504,Pulkovo 1942 / Gauss-Kruger CM 81E,1803,projected,4530,,4284,16314,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 14 (code 28414).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2505,Pulkovo 1942 / Gauss-Kruger CM 87E,1804,projected,4530,,4284,16315,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 15 (code 28415).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2506,Pulkovo 1942 / Gauss-Kruger CM 93E,1775,projected,4530,,4284,16316,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 16 (code 28416).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2507,Pulkovo 1942 / Gauss-Kruger CM 99E,1776,projected,4530,,4284,16317,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 17 (code 28417).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2508,Pulkovo 1942 / Gauss-Kruger CM 105E,1777,projected,4530,,4284,16318,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 18 (code 28418).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2509,Pulkovo 1942 / Gauss-Kruger CM 111E,1778,projected,4530,,4284,16319,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 19 (code 28419).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2510,Pulkovo 1942 / Gauss-Kruger CM 117E,1779,projected,4530,,4284,16320,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 20 (code 28420).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2511,Pulkovo 1942 / Gauss-Kruger CM 123E,1780,projected,4530,,4284,16321,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 21 (code 28421).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2512,Pulkovo 1942 / Gauss-Kruger CM 129E,1781,projected,4530,,4284,16322,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 22 (code 28422).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2513,Pulkovo 1942 / Gauss-Kruger CM 135E,1782,projected,4530,,4284,16323,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 23 (code 28423).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2514,Pulkovo 1942 / Gauss-Kruger CM 141E,1783,projected,4530,,4284,16324,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 24 (code 28424).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2515,Pulkovo 1942 / Gauss-Kruger CM 147E,1784,projected,4530,,4284,16325,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 25 (code 28425).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2516,Pulkovo 1942 / Gauss-Kruger CM 153E,1785,projected,4530,,4284,16326,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 26 (code 28426).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2517,Pulkovo 1942 / Gauss-Kruger CM 159E,1786,projected,4530,,4284,16327,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 27 (code 28427).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2518,Pulkovo 1942 / Gauss-Kruger CM 165E,1787,projected,4530,,4284,16328,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 28 (code 28428).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2519,Pulkovo 1942 / Gauss-Kruger CM 171E,1788,projected,4530,,4284,16329,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 29 (code 28429).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2520,Pulkovo 1942 / Gauss-Kruger CM 177E,1789,projected,4530,,4284,16330,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 30 (code 28430).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2521,Pulkovo 1942 / Gauss-Kruger CM 177W,1790,projected,4530,,4284,16331,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 31 (code 28431).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2522,Pulkovo 1942 / Gauss-Kruger CM 171W,1791,projected,4530,,4284,16332,,,Medium scale topographic mapping.,Truncated form of Pulkovo 1942 / Gauss-Kruger zone 32 (code 28432).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2523,Pulkovo 1942 / 3-degree Gauss-Kruger zone 7,2653,projected,4530,,4284,16267,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E (code 2582).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2524,Pulkovo 1942 / 3-degree Gauss-Kruger zone 8,2654,projected,4530,,4284,16268,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E (code 2583).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2525,Pulkovo 1942 / 3-degree Gauss-Kruger zone 9,2655,projected,4530,,4284,16269,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E (code 2584).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2526,Pulkovo 1942 / 3-degree Gauss-Kruger zone 10,2656,projected,4530,,4284,16270,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E (code 2585).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2527,Pulkovo 1942 / 3-degree Gauss-Kruger zone 11,2657,projected,4530,,4284,16271,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E (code 2586).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2528,Pulkovo 1942 / 3-degree Gauss-Kruger zone 12,2658,projected,4530,,4284,16272,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E (code 2587).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2529,Pulkovo 1942 / 3-degree Gauss-Kruger zone 13,2659,projected,4530,,4284,16273,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E (code 2588).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2530,Pulkovo 1942 / 3-degree Gauss-Kruger zone 14,2660,projected,4530,,4284,16274,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E (code 2589).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2531,Pulkovo 1942 / 3-degree Gauss-Kruger zone 15,2661,projected,4530,,4284,16275,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E (code 2590).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2532,Pulkovo 1942 / 3-degree Gauss-Kruger zone 16,2662,projected,4530,,4284,16276,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E (code 2591).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2533,Pulkovo 1942 / 3-degree Gauss-Kruger zone 17,2663,projected,4530,,4284,16277,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E (code 2592).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2534,Pulkovo 1942 / 3-degree Gauss-Kruger zone 18,2664,projected,4530,,4284,16278,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E (code 2593).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2535,Pulkovo 1942 / 3-degree Gauss-Kruger zone 19,2665,projected,4530,,4284,16279,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E (code 2594).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2536,Pulkovo 1942 / 3-degree Gauss-Kruger zone 20,2666,projected,4530,,4284,16280,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E (code 2595).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2537,Pulkovo 1942 / 3-degree Gauss-Kruger zone 21,2667,projected,4530,,4284,16281,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E (code 2596).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2538,Pulkovo 1942 / 3-degree Gauss-Kruger zone 22,2668,projected,4530,,4284,16282,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E (code 2597).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2539,Pulkovo 1942 / 3-degree Gauss-Kruger zone 23,2669,projected,4530,,4284,16283,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E (code 2598).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2540,Pulkovo 1942 / 3-degree Gauss-Kruger zone 24,2670,projected,4530,,4284,16284,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E (code 2599).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2541,Pulkovo 1942 / 3-degree Gauss-Kruger zone 25,2671,projected,4530,,4284,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E (code 2601).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2542,Pulkovo 1942 / 3-degree Gauss-Kruger zone 26,2672,projected,4530,,4284,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E (code 2602).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2543,Pulkovo 1942 / 3-degree Gauss-Kruger zone 27,2673,projected,4530,,4284,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E (code 2603).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2544,Pulkovo 1942 / 3-degree Gauss-Kruger zone 28,2674,projected,4530,,4284,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E (code 2604).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2545,Pulkovo 1942 / 3-degree Gauss-Kruger zone 29,2675,projected,4530,,4284,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E (code 2605).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2546,Pulkovo 1942 / 3-degree Gauss-Kruger zone 30,2676,projected,4530,,4284,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E (code 2606).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2547,Pulkovo 1942 / 3-degree Gauss-Kruger zone 31,2677,projected,4530,,4284,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E (code 2607).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2548,Pulkovo 1942 / 3-degree Gauss-Kruger zone 32,2678,projected,4530,,4284,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E (code 2608).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2549,Pulkovo 1942 / 3-degree Gauss-Kruger zone 33,2679,projected,4530,,4284,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E (code 2609).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2550,Samboja / UTM zone 50S,1328,projected,4400,,4125,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+2551,Pulkovo 1942 / 3-degree Gauss-Kruger zone 34,2680,projected,4530,,4284,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E (code 2610).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2552,Pulkovo 1942 / 3-degree Gauss-Kruger zone 35,2681,projected,4530,,4284,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E (code 2611).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2553,Pulkovo 1942 / 3-degree Gauss-Kruger zone 36,2682,projected,4530,,4284,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E (code 2612).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2554,Pulkovo 1942 / 3-degree Gauss-Kruger zone 37,2683,projected,4530,,4284,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E (code 2613).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2555,Pulkovo 1942 / 3-degree Gauss-Kruger zone 38,2684,projected,4530,,4284,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E (code 2614).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2556,Pulkovo 1942 / 3-degree Gauss-Kruger zone 39,2685,projected,4530,,4284,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E (code 2615).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2557,Pulkovo 1942 / 3-degree Gauss-Kruger zone 40,2686,projected,4530,,4284,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E (code 2616).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2558,Pulkovo 1942 / 3-degree Gauss-Kruger zone 41,2687,projected,4530,,4284,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E (code 2617).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2559,Pulkovo 1942 / 3-degree Gauss-Kruger zone 42,2688,projected,4530,,4284,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E (code 2618).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2560,Pulkovo 1942 / 3-degree Gauss-Kruger zone 43,2689,projected,4530,,4284,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E (code 2619).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2561,Pulkovo 1942 / 3-degree Gauss-Kruger zone 44,2690,projected,4530,,4284,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E (code 2620).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2562,Pulkovo 1942 / 3-degree Gauss-Kruger zone 45,2691,projected,4530,,4284,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E (code 2621).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2563,Pulkovo 1942 / 3-degree Gauss-Kruger zone 46,2692,projected,4530,,4284,16076,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E (code 2622).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2564,Pulkovo 1942 / 3-degree Gauss-Kruger zone 47,2693,projected,4530,,4284,16077,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E (code 2623).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2565,Pulkovo 1942 / 3-degree Gauss-Kruger zone 48,2694,projected,4530,,4284,16078,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E (code 2624).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2566,Pulkovo 1942 / 3-degree Gauss-Kruger zone 49,2695,projected,4530,,4284,16079,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E (code 2625).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2567,Pulkovo 1942 / 3-degree Gauss-Kruger zone 50,2696,projected,4530,,4284,16080,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E (code 2626).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2568,Pulkovo 1942 / 3-degree Gauss-Kruger zone 51,2697,projected,4530,,4284,16081,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E (code 2627).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2569,Pulkovo 1942 / 3-degree Gauss-Kruger zone 52,2698,projected,4530,,4284,16082,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E (code 2628).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2570,Pulkovo 1942 / 3-degree Gauss-Kruger zone 53,2699,projected,4530,,4284,16083,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E (code 2629).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2571,Pulkovo 1942 / 3-degree Gauss-Kruger zone 54,2700,projected,4530,,4284,16084,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E (code 2630).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2572,Pulkovo 1942 / 3-degree Gauss-Kruger zone 55,2701,projected,4530,,4284,16085,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E (code 2631).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2573,Pulkovo 1942 / 3-degree Gauss-Kruger zone 56,2702,projected,4530,,4284,16086,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E (code 2632).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2574,Pulkovo 1942 / 3-degree Gauss-Kruger zone 57,2703,projected,4530,,4284,16087,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E (code 2633).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2575,Pulkovo 1942 / 3-degree Gauss-Kruger zone 58,2704,projected,4530,,4284,16088,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E (code 2634).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2576,Pulkovo 1942 / 3-degree Gauss-Kruger zone 59,2705,projected,4530,,4284,16089,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E (code 2635).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2577,Pulkovo 1942 / 3-degree Gauss-Kruger zone 60,2706,projected,4530,,4284,16090,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E (code 2636).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2578,Pulkovo 1942 / 3-degree Gauss-Kruger zone 61,2707,projected,4530,,4284,16091,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W (code 2637).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2579,Pulkovo 1942 / 3-degree Gauss-Kruger zone 62,2708,projected,4530,,4284,16092,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W (code 2638).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2580,Pulkovo 1942 / 3-degree Gauss-Kruger zone 63,2709,projected,4530,,4284,16093,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W (code 2639).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2581,Pulkovo 1942 / 3-degree Gauss-Kruger zone 64,2710,projected,4530,,4284,16094,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W (code 2640).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2582,Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E,2747,projected,4530,,4284,16367,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 7 (code 2523).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2583,Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E,2654,projected,4530,,4284,16368,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 8 (code 2524).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2584,Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E,2655,projected,4530,,4284,16369,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 9 (code 2525).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2585,Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E,2656,projected,4530,,4284,16370,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 10 (code 2526).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2586,Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E,2657,projected,4530,,4284,16371,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 11 (code 2527).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2587,Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E,2658,projected,4530,,4284,16372,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 12 (code 2528).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2588,Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E,2659,projected,4530,,4284,16373,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 13 (code 2529).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2589,Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E,2660,projected,4530,,4284,16374,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 14 (code 2530).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2590,Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E,2661,projected,4530,,4284,16375,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 15 (code 2531).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2591,Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E,2662,projected,4530,,4284,16376,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 16 (code 2532).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2592,Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E,2663,projected,4530,,4284,16377,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 17 (code 2533).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2593,Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E,2664,projected,4530,,4284,16378,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 18 (code 2534).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2594,Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E,2665,projected,4530,,4284,16379,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 19 (code 2535).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2595,Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E,2666,projected,4530,,4284,16380,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 20 (code 2536).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2596,Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E,2667,projected,4530,,4284,16381,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 21 (code 2537).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2597,Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E,2668,projected,4530,,4284,16382,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 22 (code 2538).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2598,Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E,2669,projected,4530,,4284,16383,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 23 (code 2539).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2599,Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E,2670,projected,4530,,4284,16384,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 24 (code 2540).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2600,Lietuvos Koordinoei Sistema 1994,1145,projected,4530,,4126,19934,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1998-03-12 00:00:00,,1,0
+2601,Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E,2671,projected,4530,,4284,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 25 (code 2541).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2602,Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E,2672,projected,4530,,4284,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 26 (code 2542).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2603,Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E,2673,projected,4530,,4284,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 27 (code 2543).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2604,Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E,2674,projected,4530,,4284,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 28 (code 2544).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2605,Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E,2675,projected,4530,,4284,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 29 (code 2545).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2606,Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E,2676,projected,4530,,4284,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 30 (code 2546).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2607,Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E,2677,projected,4530,,4284,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 31 (code 2547).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2608,Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E,2678,projected,4530,,4284,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 32 (code 2548).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2609,Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E,2679,projected,4530,,4284,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 33 (code 2549).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2610,Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E,2680,projected,4530,,4284,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 34 (code 2551).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2611,Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E,2681,projected,4530,,4284,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 35 (code 2552).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2612,Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E,2682,projected,4530,,4284,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 36 (code 2553).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2613,Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E,2683,projected,4530,,4284,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 37 (code 2554).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2614,Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E,2684,projected,4530,,4284,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 38 (code 2555).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2615,Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E,2685,projected,4530,,4284,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 39 (code 2556).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2616,Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E,2686,projected,4530,,4284,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 40 (code 2557).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2617,Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E,2687,projected,4530,,4284,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 41 (code 2558).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2618,Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E,2688,projected,4530,,4284,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 42 (code 2559).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2619,Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E,2689,projected,4530,,4284,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 43 (code 2560).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2620,Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E,2690,projected,4530,,4284,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 44 (code 2561).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2621,Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E,2691,projected,4530,,4284,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 45 (code 2562).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2622,Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E,2692,projected,4530,,4284,16176,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 46 (code 2563).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2623,Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E,2693,projected,4530,,4284,16177,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 47 (code 2564).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2624,Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E,2694,projected,4530,,4284,16178,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 48 (code 2565).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2625,Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E,2695,projected,4530,,4284,16179,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 49 (code 2566).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2626,Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E,2696,projected,4530,,4284,16180,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 50 (code 2567).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2627,Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E,2697,projected,4530,,4284,16181,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 51 (code 2568).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2628,Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E,2698,projected,4530,,4284,16182,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 52 (code 2569).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2629,Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E,2699,projected,4530,,4284,16183,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 53 (code 2570).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2630,Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E,2700,projected,4530,,4284,16184,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 54 (code 2571).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2631,Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E,2701,projected,4530,,4284,16185,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 55 (code 2572).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2632,Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E,2702,projected,4530,,4284,16186,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 56 (code 2573).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2633,Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E,2703,projected,4530,,4284,16187,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 57 (code 2574).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2634,Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E,2704,projected,4530,,4284,16188,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 58 (code 2575).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2635,Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E,2705,projected,4530,,4284,16189,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 59 (code 2576).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2636,Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E,2706,projected,4530,,4284,16190,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 60 (code 2577).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2637,Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W,2707,projected,4530,,4284,16191,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 61 (code 2578).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2638,Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W,2708,projected,4530,,4284,16192,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 62 (code 2579).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2639,Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W,2709,projected,4530,,4284,16193,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 63 (code 2580).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2640,Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W,2710,projected,4530,,4284,16194,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1942 / 3-degree Gauss-Kruger zone 64 (code 2581).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2641,Pulkovo 1995 / 3-degree Gauss-Kruger zone 7,2747,projected,4530,,4284,16267,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E (code 2699).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2642,Pulkovo 1995 / 3-degree Gauss-Kruger zone 8,2748,projected,4530,,4284,16268,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E (code 2700).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2643,Pulkovo 1995 / 3-degree Gauss-Kruger zone 9,2749,projected,4530,,4284,16269,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E (code 2701).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2644,Pulkovo 1995 / 3-degree Gauss-Kruger zone 10,2750,projected,4530,,4284,16270,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E (code 2702).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2645,Pulkovo 1995 / 3-degree Gauss-Kruger zone 11,2751,projected,4530,,4284,16271,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E (code 2703).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2646,Pulkovo 1995 / 3-degree Gauss-Kruger zone 12,2752,projected,4530,,4284,16272,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E (code 2704).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2647,Pulkovo 1995 / 3-degree Gauss-Kruger zone 13,2753,projected,4530,,4284,16273,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E (code 2705).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2648,Pulkovo 1995 / 3-degree Gauss-Kruger zone 14,2754,projected,4530,,4284,16274,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E (code 2706).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2649,Pulkovo 1995 / 3-degree Gauss-Kruger zone 15,2755,projected,4530,,4284,16275,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E (code 2707).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2650,Pulkovo 1995 / 3-degree Gauss-Kruger zone 16,2756,projected,4530,,4284,16276,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E (code 2708).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2651,Pulkovo 1995 / 3-degree Gauss-Kruger zone 17,2757,projected,4530,,4284,16277,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E (code 2709).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2652,Pulkovo 1995 / 3-degree Gauss-Kruger zone 18,2758,projected,4530,,4284,16278,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E (code 2710).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2653,Pulkovo 1995 / 3-degree Gauss-Kruger zone 19,2759,projected,4530,,4284,16279,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E (code 2711).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2654,Pulkovo 1995 / 3-degree Gauss-Kruger zone 20,2760,projected,4530,,4284,16280,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E (code 2712).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2655,Pulkovo 1995 / 3-degree Gauss-Kruger zone 21,2761,projected,4530,,4284,16281,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E (code 2713).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2656,Pulkovo 1995 / 3-degree Gauss-Kruger zone 22,2762,projected,4530,,4284,16282,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E (code 2714).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2657,Pulkovo 1995 / 3-degree Gauss-Kruger zone 23,2763,projected,4530,,4284,16283,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E (code 2715).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2658,Pulkovo 1995 / 3-degree Gauss-Kruger zone 24,2764,projected,4530,,4284,16284,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E (code 2716).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2659,Pulkovo 1995 / 3-degree Gauss-Kruger zone 25,2765,projected,4530,,4284,16285,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E (code 2717).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2660,Pulkovo 1995 / 3-degree Gauss-Kruger zone 26,2766,projected,4530,,4284,16286,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E (code 2718).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2661,Pulkovo 1995 / 3-degree Gauss-Kruger zone 27,2767,projected,4530,,4284,16287,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E (code 2719).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2662,Pulkovo 1995 / 3-degree Gauss-Kruger zone 28,2768,projected,4530,,4284,16288,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E (code 2720).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2663,Pulkovo 1995 / 3-degree Gauss-Kruger zone 29,2769,projected,4530,,4284,16289,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E (code 2721).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2664,Pulkovo 1995 / 3-degree Gauss-Kruger zone 30,2676,projected,4530,,4284,16290,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E (code 2722).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2665,Pulkovo 1995 / 3-degree Gauss-Kruger zone 31,2677,projected,4530,,4284,16291,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E (code 2723).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2666,Pulkovo 1995 / 3-degree Gauss-Kruger zone 32,2678,projected,4530,,4284,16292,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E (code 2724).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2667,Pulkovo 1995 / 3-degree Gauss-Kruger zone 33,2679,projected,4530,,4284,16293,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E (code 2725).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2668,Pulkovo 1995 / 3-degree Gauss-Kruger zone 34,2680,projected,4530,,4284,16294,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E (code 2726).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2669,Pulkovo 1995 / 3-degree Gauss-Kruger zone 35,2681,projected,4530,,4284,16295,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E (code 2727).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2670,Pulkovo 1995 / 3-degree Gauss-Kruger zone 36,2682,projected,4530,,4284,16296,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E (code 2728).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2671,Pulkovo 1995 / 3-degree Gauss-Kruger zone 37,2683,projected,4530,,4284,16297,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E (code 2729).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2672,Pulkovo 1995 / 3-degree Gauss-Kruger zone 38,2684,projected,4530,,4284,16298,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E (code 2730).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2673,Pulkovo 1995 / 3-degree Gauss-Kruger zone 39,2685,projected,4530,,4284,16299,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E (code 2731).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2674,Pulkovo 1995 / 3-degree Gauss-Kruger zone 40,2686,projected,4530,,4284,16070,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E (code 2732).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2675,Pulkovo 1995 / 3-degree Gauss-Kruger zone 41,2687,projected,4530,,4284,16071,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E (code 2733).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2676,Pulkovo 1995 / 3-degree Gauss-Kruger zone 42,2688,projected,4530,,4284,16072,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E (code 2734).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2677,Pulkovo 1995 / 3-degree Gauss-Kruger zone 43,2689,projected,4530,,4284,16073,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E (code 2735).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2678,Pulkovo 1995 / 3-degree Gauss-Kruger zone 44,2690,projected,4530,,4284,16074,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E (code 2738).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2679,Pulkovo 1995 / 3-degree Gauss-Kruger zone 45,2691,projected,4530,,4284,16075,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E (code 2739).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2680,Pulkovo 1995 / 3-degree Gauss-Kruger zone 46,2692,projected,4530,,4284,16076,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E (code 2740).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2681,Pulkovo 1995 / 3-degree Gauss-Kruger zone 47,2693,projected,4530,,4284,16077,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E (code 2741).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2682,Pulkovo 1995 / 3-degree Gauss-Kruger zone 48,2694,projected,4530,,4284,16078,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E (code 2742).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2683,Pulkovo 1995 / 3-degree Gauss-Kruger zone 49,2695,projected,4530,,4284,16079,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E (code 2743).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2684,Pulkovo 1995 / 3-degree Gauss-Kruger zone 50,2696,projected,4530,,4284,16080,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E (code 2744).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2685,Pulkovo 1995 / 3-degree Gauss-Kruger zone 51,2697,projected,4530,,4284,16081,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E (code 2745).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2686,Pulkovo 1995 / 3-degree Gauss-Kruger zone 52,2698,projected,4530,,4284,16082,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E (code 2746).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2687,Pulkovo 1995 / 3-degree Gauss-Kruger zone 53,2699,projected,4530,,4284,16083,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E (code 2747).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2688,Pulkovo 1995 / 3-degree Gauss-Kruger zone 54,2700,projected,4530,,4284,16084,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E (code 2748).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2689,Pulkovo 1995 / 3-degree Gauss-Kruger zone 55,2701,projected,4530,,4284,16085,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E (code 2749).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2690,Pulkovo 1995 / 3-degree Gauss-Kruger zone 56,2702,projected,4530,,4284,16086,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E (code 2750).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2691,Pulkovo 1995 / 3-degree Gauss-Kruger zone 57,2703,projected,4530,,4284,16087,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E (code 2751).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2692,Pulkovo 1995 / 3-degree Gauss-Kruger zone 58,2704,projected,4530,,4284,16088,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E (code 2752).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2693,Pulkovo 1995 / 3-degree Gauss-Kruger zone 59,2705,projected,4530,,4284,16089,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E (code 2753).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2694,Pulkovo 1995 / 3-degree Gauss-Kruger zone 60,2706,projected,4530,,4284,16090,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E (code 2754).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2695,Pulkovo 1995 / 3-degree Gauss-Kruger zone 61,2707,projected,4530,,4284,16091,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W (code 2755).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2696,Pulkovo 1995 / 3-degree Gauss-Kruger zone 62,2708,projected,4530,,4284,16092,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W (code 2756).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2697,Pulkovo 1995 / 3-degree Gauss-Kruger zone 63,2709,projected,4530,,4284,16093,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W (code 2757).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2698,Pulkovo 1995 / 3-degree Gauss-Kruger zone 64,2710,projected,4530,,4284,16094,,,"Large scale topographic mapping, cadastral and engineering survey.",Also found with truncated false easting - see Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W (code 2758).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2699,Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E,2747,projected,4530,,4284,16367,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 7 (code 2641).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2700,Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E,2654,projected,4530,,4284,16368,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 8 (code 2642).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2701,Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E,2655,projected,4530,,4284,16369,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 9 (code 2643).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2702,Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E,2656,projected,4530,,4284,16370,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 10 (code 2644).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2703,Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E,2657,projected,4530,,4284,16371,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 11 (code 2645).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2704,Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E,2658,projected,4530,,4284,16372,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 12 (code 2646).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2705,Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E,2659,projected,4530,,4284,16373,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 13 (code 2647).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2706,Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E,2660,projected,4530,,4284,16374,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 14 (code 2648).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2707,Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E,2661,projected,4530,,4284,16375,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 15 (code 2649).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2708,Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E,2662,projected,4530,,4284,16376,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 16 (code 2650).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2709,Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E,2663,projected,4530,,4284,16377,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 17 (code 2651).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2710,Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E,2664,projected,4530,,4284,16378,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 18 (code 2652).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2711,Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E,2665,projected,4530,,4284,16379,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 19 (code 2653).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2712,Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E,2666,projected,4530,,4284,16380,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 20 (code 2654).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2713,Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E,2667,projected,4530,,4284,16381,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 21 (code 2655).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2714,Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E,2668,projected,4530,,4284,16382,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 22 (code 2656).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2715,Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E,2669,projected,4530,,4284,16383,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 23 (code 2657).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2716,Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E,2670,projected,4530,,4284,16384,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 24 (code 2658).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2717,Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E,2671,projected,4530,,4284,16385,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 25 (code 2659).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2718,Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E,2672,projected,4530,,4284,16386,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 26 (code 2660).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2719,Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E,2673,projected,4530,,4284,16387,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 27 (code 2661).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2720,Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E,2674,projected,4530,,4284,16388,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 28 (code 2662).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2721,Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E,2675,projected,4530,,4284,16389,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 29 (code 2663).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2722,Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E,2676,projected,4530,,4284,16390,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 30 (code 2664).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2723,Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E,2677,projected,4530,,4284,16391,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 31 (code 2665).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2724,Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E,2678,projected,4530,,4284,16392,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 32 (code 2666).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2725,Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E,2679,projected,4530,,4284,16393,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 33 (code 2667).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2726,Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E,2680,projected,4530,,4284,16394,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 34 (code 2668).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2727,Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E,2681,projected,4530,,4284,16395,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 35 (code 2669).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2728,Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E,2682,projected,4530,,4284,16396,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 36 (code 2670).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2729,Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E,2683,projected,4530,,4284,16397,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 37 (code 2671).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2730,Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E,2684,projected,4530,,4284,16398,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 38 (code 2672).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2731,Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E,2685,projected,4530,,4284,16399,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 39 (code 2673).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2732,Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E,2686,projected,4530,,4284,16170,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 40 (code 2674).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2733,Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E,2687,projected,4530,,4284,16171,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 41 (code 2675).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2734,Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E,2688,projected,4530,,4284,16172,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 42 (code 2676).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2735,Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E,2689,projected,4530,,4284,16173,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 43 (code 2677).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2736,Tete / UTM zone 36S,1540,projected,4400,,4127,16136,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+2737,Tete / UTM zone 37S,1541,projected,4400,,4127,16137,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+2738,Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E,2690,projected,4530,,4284,16174,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 44 (code 2678).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2739,Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E,2691,projected,4530,,4284,16175,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 45 (code 2679).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2740,Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E,2692,projected,4530,,4284,16176,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 46 (code 2680).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2741,Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E,2693,projected,4530,,4284,16177,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 47 (code 2681).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2742,Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E,2694,projected,4530,,4284,16178,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 48 (code 2682).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2743,Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E,2695,projected,4530,,4284,16179,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 49 (code 2683).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2744,Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E,2696,projected,4530,,4284,16180,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 50 (code 2684).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2745,Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E,2697,projected,4530,,4284,16181,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 51 (code 2685).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2746,Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E,2698,projected,4530,,4284,16182,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 52 (code 2686).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2747,Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E,2699,projected,4530,,4284,16183,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 53 (code 2687).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2748,Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E,2700,projected,4530,,4284,16184,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 54 (code 2688).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2749,Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E,2701,projected,4530,,4284,16185,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 55 (code 2689).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2750,Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E,2702,projected,4530,,4284,16186,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 56 (code 2690).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2751,Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E,2703,projected,4530,,4284,16187,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 57 (code 2691).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2752,Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E,2704,projected,4530,,4284,16188,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 58 (code 2692).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2753,Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E,2705,projected,4530,,4284,16189,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 59 (code 2693).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2754,Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E,2706,projected,4530,,4284,16190,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 60 (code 2694).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2755,Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W,2707,projected,4530,,4284,16191,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 61 (code 2695).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2756,Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W,2708,projected,4530,,4284,16192,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 62 (code 2696).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2757,Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W,2709,projected,4530,,4284,16193,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 63 (code 2697).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2758,Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W,2710,projected,4530,,4284,16194,,,"Large scale topographic mapping, cadastral and engineering survey.",Truncated form of Pulkovo 1995 / 3-degree Gauss-Kruger zone 64 (code 2698).,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2759,NAD83(HARN) / Alabama East,2154,projected,4499,,4152,10131,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2760,NAD83(HARN) / Alabama West,2155,projected,4499,,4152,10132,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2761,NAD83(HARN) / Arizona East,2167,projected,4499,,4152,10231,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2222 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2762,NAD83(HARN) / Arizona Central,2166,projected,4499,,4152,10232,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2223 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2763,NAD83(HARN) / Arizona West,2168,projected,4499,,4152,10233,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2224 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2764,NAD83(HARN) / Arkansas North,2169,projected,4499,,4152,10331,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2765,NAD83(HARN) / Arkansas South,2170,projected,4499,,4152,10332,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2766,NAD83(HARN) / California zone 1,2175,projected,4499,,4152,10431,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2225 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2767,NAD83(HARN) / California zone 2,2176,projected,4499,,4152,10432,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2226 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2768,NAD83(HARN) / California zone 3,2177,projected,4499,,4152,10433,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2227 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2769,NAD83(HARN) / California zone 4,2178,projected,4499,,4152,10434,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2228 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2770,NAD83(HARN) / California zone 5,2182,projected,4499,,4152,10435,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2229 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2771,NAD83(HARN) / California zone 6,2180,projected,4499,,4152,10436,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2230 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2772,NAD83(HARN) / Colorado North,2184,projected,4499,,4152,10531,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2231 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2773,NAD83(HARN) / Colorado Central,2183,projected,4499,,4152,10532,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2232 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2774,NAD83(HARN) / Colorado South,2185,projected,4499,,4152,10533,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2233 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2775,NAD83(HARN) / Connecticut,1377,projected,4499,,4152,10630,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2234 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2776,NAD83(HARN) / Delaware,1378,projected,4499,,4152,10730,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2235 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2777,NAD83(HARN) / Florida East,2186,projected,4499,,4152,10931,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2236 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2778,NAD83(HARN) / Florida West,2188,projected,4499,,4152,10932,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2237 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2779,NAD83(HARN) / Florida North,2187,projected,4499,,4152,10933,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2238 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2780,NAD83(HARN) / Georgia East,2189,projected,4499,,4152,11031,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2239 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2781,NAD83(HARN) / Georgia West,2190,projected,4499,,4152,11032,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2240 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2782,NAD83(HARN) / Hawaii zone 1,1546,projected,4499,,4152,15131,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2783,NAD83(HARN) / Hawaii zone 2,1547,projected,4499,,4152,15132,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2784,NAD83(HARN) / Hawaii zone 3,1548,projected,4499,,4152,15133,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2785,NAD83(HARN) / Hawaii zone 4,1549,projected,4499,,4152,15134,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2786,NAD83(HARN) / Hawaii zone 5,1550,projected,4499,,4152,15135,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2787,NAD83(HARN) / Idaho East,2192,projected,4499,,4152,11131,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2241 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2788,NAD83(HARN) / Idaho Central,2191,projected,4499,,4152,11132,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2242 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2789,NAD83(HARN) / Idaho West,2193,projected,4499,,4152,11133,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2243 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2790,NAD83(HARN) / Illinois East,2194,projected,4499,,4152,11231,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2791,NAD83(HARN) / Illinois West,2195,projected,4499,,4152,11232,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2792,NAD83(HARN) / Indiana East,2196,projected,4499,,4152,11331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2244 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2793,NAD83(HARN) / Indiana West,2197,projected,4499,,4152,11332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2245 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2794,NAD83(HARN) / Iowa North,2198,projected,4499,,4152,11431,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2795,NAD83(HARN) / Iowa South,2199,projected,4499,,4152,11432,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2796,NAD83(HARN) / Kansas North,2200,projected,4499,,4152,11531,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2797,NAD83(HARN) / Kansas South,2201,projected,4499,,4152,11532,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2798,NAD83(HARN) / Kentucky North,2202,projected,4499,,4152,15303,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2246 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2799,NAD83(HARN) / Kentucky South,2203,projected,4499,,4152,11632,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2247 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2800,NAD83(HARN) / Louisiana North,2204,projected,4499,,4152,11731,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2801,NAD83(HARN) / Louisiana South,2529,projected,4499,,4152,11732,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2802,NAD83(HARN) / Maine East,2206,projected,4499,,4152,11831,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2803,NAD83(HARN) / Maine West,2207,projected,4499,,4152,11832,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2804,NAD83(HARN) / Maryland,1389,projected,4499,,4152,11930,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2248 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2805,NAD83(HARN) / Massachusetts Mainland,2209,projected,4499,,4152,12031,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2249 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2806,NAD83(HARN) / Massachusetts Island,2208,projected,4499,,4152,12032,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2250 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2807,NAD83(HARN) / Michigan North,1723,projected,4499,,4152,12141,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2251 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2808,NAD83(HARN) / Michigan Central,1724,projected,4499,,4152,12142,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2252 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2809,NAD83(HARN) / Michigan South,1725,projected,4499,,4152,12143,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2253 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2810,NAD83(HARN) / Minnesota North,2214,projected,4499,,4152,12231,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2811,NAD83(HARN) / Minnesota Central,2213,projected,4499,,4152,12232,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2812,NAD83(HARN) / Minnesota South,2215,projected,4499,,4152,12233,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2813,NAD83(HARN) / Mississippi East,2216,projected,4499,,4152,12331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2254 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2814,NAD83(HARN) / Mississippi West,2217,projected,4499,,4152,12332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2255 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2815,NAD83(HARN) / Missouri East,2219,projected,4499,,4152,12431,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2816,NAD83(HARN) / Missouri Central,2218,projected,4499,,4152,12432,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2817,NAD83(HARN) / Missouri West,2220,projected,4499,,4152,12433,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2818,NAD83(HARN) / Montana,1395,projected,4499,,4152,12530,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2256 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2819,NAD83(HARN) / Nebraska,1396,projected,4499,,4152,12630,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2820,NAD83(HARN) / Nevada East,2224,projected,4499,,4152,12731,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2821,NAD83(HARN) / Nevada Central,2223,projected,4499,,4152,12732,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2822,NAD83(HARN) / Nevada West,2225,projected,4499,,4152,12733,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2823,NAD83(HARN) / New Hampshire,1398,projected,4499,,4152,12830,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2824,NAD83(HARN) / New Jersey,1399,projected,4499,,4152,12930,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2825,NAD83(HARN) / New Mexico East,2228,projected,4499,,4152,13031,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2257 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2826,NAD83(HARN) / New Mexico Central,2231,projected,4499,,4152,13032,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2258 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2827,NAD83(HARN) / New Mexico West,2232,projected,4499,,4152,13033,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2259 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2828,NAD83(HARN) / New York East,2234,projected,4499,,4152,13131,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2260 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2829,NAD83(HARN) / New York Central,2233,projected,4499,,4152,13132,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2261 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2830,NAD83(HARN) / New York West,2236,projected,4499,,4152,13133,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2263 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2831,NAD83(HARN) / New York Long Island,2235,projected,4499,,4152,13134,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2264 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2832,NAD83(HARN) / North Dakota North,2237,projected,4499,,4152,13331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2265 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2833,NAD83(HARN) / North Dakota South,2238,projected,4499,,4152,13332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2266 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2834,NAD83(HARN) / Ohio North,2239,projected,4499,,4152,13431,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2835,NAD83(HARN) / Ohio South,2240,projected,4499,,4152,13432,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2836,NAD83(HARN) / Oklahoma North,2241,projected,4499,,4152,13531,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2267 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2837,NAD83(HARN) / Oklahoma South,2242,projected,4499,,4152,13532,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2268 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2838,NAD83(HARN) / Oregon North,2243,projected,4499,,4152,13631,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2269 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2839,NAD83(HARN) / Oregon South,2244,projected,4499,,4152,13632,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2270 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2840,NAD83(HARN) / Rhode Island,1408,projected,4499,,4152,13830,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2841,NAD83(HARN) / South Dakota North,2249,projected,4499,,4152,14031,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2842,NAD83(HARN) / South Dakota South,2250,projected,4499,,4152,14032,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2843,NAD83(HARN) / Tennessee,1411,projected,4499,,4152,14130,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2274 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2844,NAD83(HARN) / Texas North,2253,projected,4499,,4152,14231,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2275 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2845,NAD83(HARN) / Texas North Central,2254,projected,4499,,4152,14232,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2276 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2846,NAD83(HARN) / Texas Central,2252,projected,4499,,4152,14233,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2277 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2847,NAD83(HARN) / Texas South Central,2527,projected,4499,,4152,14234,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2278 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2848,NAD83(HARN) / Texas South,2528,projected,4499,,4152,14235,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2279 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2849,NAD83(HARN) / Utah North,2258,projected,4499,,4152,14331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2280 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2850,NAD83(HARN) / Utah Central,2257,projected,4499,,4152,14332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2281 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2851,NAD83(HARN) / Utah South,2259,projected,4499,,4152,14333,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2282 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2852,NAD83(HARN) / Vermont,1414,projected,4499,,4152,14430,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2853,NAD83(HARN) / Virginia North,2260,projected,4499,,4152,14531,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2283 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2854,NAD83(HARN) / Virginia South,2261,projected,4499,,4152,14532,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2284 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2855,NAD83(HARN) / Washington North,2273,projected,4499,,4152,14631,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2285 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2856,NAD83(HARN) / Washington South,2274,projected,4499,,4152,14632,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2286 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2857,NAD83(HARN) / West Virginia North,2264,projected,4499,,4152,14731,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2858,NAD83(HARN) / West Virginia South,2265,projected,4499,,4152,14732,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2859,NAD83(HARN) / Wisconsin North,2267,projected,4499,,4152,14831,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2287 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2860,NAD83(HARN) / Wisconsin Central,2266,projected,4499,,4152,14832,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2288 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2861,NAD83(HARN) / Wisconsin South,2268,projected,4499,,4152,14833,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2289 for equivalent non-metric definition.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2862,NAD83(HARN) / Wyoming East,2269,projected,4499,,4152,14931,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2863,NAD83(HARN) / Wyoming East Central,2270,projected,4499,,4152,14932,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2864,NAD83(HARN) / Wyoming West Central,2272,projected,4499,,4152,14933,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2865,NAD83(HARN) / Wyoming West,2271,projected,4499,,4152,14934,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2866,NAD83(HARN) / Puerto Rico & Virgin Is.,2251,projected,4499,,4152,15230,,,Large and medium scale topographic mapping and engineering survey.,,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2867,NAD83(HARN) / Arizona East (ft),2167,projected,4495,,4152,15304,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26948.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2868,NAD83(HARN) / Arizona Central (ft),2166,projected,4495,,4152,15305,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26949.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2869,NAD83(HARN) / Arizona West (ft),2168,projected,4495,,4152,15306,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26950.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2870,NAD83(HARN) / California zone 1 (ftUS),2175,projected,4497,,4152,15307,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26941.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2871,NAD83(HARN) / California zone 2 (ftUS),2176,projected,4497,,4152,15308,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26942.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2872,NAD83(HARN) / California zone 3 (ftUS),2177,projected,4497,,4152,15309,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26943.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2873,NAD83(HARN) / California zone 4 (ftUS),2178,projected,4497,,4152,15310,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26944.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2874,NAD83(HARN) / California zone 5 (ftUS),2182,projected,4497,,4152,15311,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26945.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2875,NAD83(HARN) / California zone 6 (ftUS),2180,projected,4497,,4152,15312,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26946.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2876,NAD83(HARN) / Colorado North (ftUS),2184,projected,4497,,4152,15313,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26953.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2877,NAD83(HARN) / Colorado Central (ftUS),2183,projected,4497,,4152,15314,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26954.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2878,NAD83(HARN) / Colorado South (ftUS),2185,projected,4497,,4152,15315,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26955.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2879,NAD83(HARN) / Connecticut (ftUS),1377,projected,4497,,4152,15316,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26956.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2880,NAD83(HARN) / Delaware (ftUS),1378,projected,4497,,4152,15317,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26957.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2881,NAD83(HARN) / Florida East (ftUS),2186,projected,4497,,4152,15318,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26958.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2882,NAD83(HARN) / Florida West (ftUS),2188,projected,4497,,4152,15319,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26959.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2883,NAD83(HARN) / Florida North (ftUS),2187,projected,4497,,4152,15320,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26960.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2884,NAD83(HARN) / Georgia East (ftUS),2189,projected,4497,,4152,15321,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26966.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2885,NAD83(HARN) / Georgia West (ftUS),2190,projected,4497,,4152,15322,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26967.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2886,NAD83(HARN) / Idaho East (ftUS),2192,projected,4497,,4152,15323,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26968.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2887,NAD83(HARN) / Idaho Central (ftUS),2191,projected,4497,,4152,15324,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26969.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2888,NAD83(HARN) / Idaho West (ftUS),2193,projected,4497,,4152,15325,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26970.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2889,NAD83(HARN) / Indiana East (ftUS),2196,projected,4497,,4152,15326,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26973.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2890,NAD83(HARN) / Indiana West (ftUS),2197,projected,4497,,4152,15327,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26974.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2891,NAD83(HARN) / Kentucky North (ftUS),2202,projected,4497,,4152,15328,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26979.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2892,NAD83(HARN) / Kentucky South (ftUS),2203,projected,4497,,4152,15329,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26980.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2893,NAD83(HARN) / Maryland (ftUS),1389,projected,4497,,4152,15330,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26985.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2894,NAD83(HARN) / Massachusetts Mainland (ftUS),2209,projected,4497,,4152,15331,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26986.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2895,NAD83(HARN) / Massachusetts Island (ftUS),2208,projected,4497,,4152,15332,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26987.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2896,NAD83(HARN) / Michigan North (ft),1723,projected,4495,,4152,15333,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26988.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2897,NAD83(HARN) / Michigan Central (ft),1724,projected,4495,,4152,15334,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26989.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2898,NAD83(HARN) / Michigan South (ft),1725,projected,4495,,4152,15335,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 26990.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2899,NAD83(HARN) / Mississippi East (ftUS),2216,projected,4497,,4152,15336,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26994.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2900,NAD83(HARN) / Mississippi West (ftUS),2217,projected,4497,,4152,15337,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 26995.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2901,NAD83(HARN) / Montana (ft),1395,projected,4495,,4152,15338,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32100.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2902,NAD83(HARN) / New Mexico East (ftUS),2228,projected,4497,,4152,15339,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32112.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2903,NAD83(HARN) / New Mexico Central (ftUS),2231,projected,4497,,4152,15340,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32113.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2904,NAD83(HARN) / New Mexico West (ftUS),2232,projected,4497,,4152,15341,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32114.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2905,NAD83(HARN) / New York East (ftUS),2234,projected,4497,,4152,15342,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32115.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2906,NAD83(HARN) / New York Central (ftUS),2233,projected,4497,,4152,15343,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32116.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2907,NAD83(HARN) / New York West (ftUS),2236,projected,4497,,4152,15344,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32117.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2908,NAD83(HARN) / New York Long Island (ftUS),2235,projected,4497,,4152,15345,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32118.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2909,NAD83(HARN) / North Dakota North (ft),2237,projected,4495,,4152,15347,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32120.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2910,NAD83(HARN) / North Dakota South (ft),2238,projected,4495,,4152,15348,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32121.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2911,NAD83(HARN) / Oklahoma North (ftUS),2241,projected,4497,,4152,15349,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32124.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2912,NAD83(HARN) / Oklahoma South (ftUS),2242,projected,4497,,4152,15350,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32125.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2913,NAD83(HARN) / Oregon North (ft),2243,projected,4495,,4152,15351,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32126.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2914,NAD83(HARN) / Oregon South (ft),2244,projected,4495,,4152,15352,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32127.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2915,NAD83(HARN) / Tennessee (ftUS),1411,projected,4497,,4152,15356,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32136.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2916,NAD83(HARN) / Texas North (ftUS),2253,projected,4497,,4152,15357,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32137.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2917,NAD83(HARN) / Texas North Central (ftUS),2254,projected,4497,,4152,15358,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32138.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2918,NAD83(HARN) / Texas Central (ftUS),2252,projected,4497,,4152,15359,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32139.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2919,NAD83(HARN) / Texas South Central (ftUS),2527,projected,4497,,4152,15360,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32140.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2920,NAD83(HARN) / Texas South (ftUS),2528,projected,4497,,4152,15361,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32141.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2921,NAD83(HARN) / Utah North (ft),2258,projected,4495,,4152,15362,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32142.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2922,NAD83(HARN) / Utah Central (ft),2257,projected,4495,,4152,15363,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32143.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2923,NAD83(HARN) / Utah South (ft),2259,projected,4495,,4152,15364,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  Federal definition is metric - see code 32144.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2924,NAD83(HARN) / Virginia North (ftUS),2260,projected,4497,,4152,15365,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32146.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2925,NAD83(HARN) / Virginia South (ftUS),2261,projected,4497,,4152,15366,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32147.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2926,NAD83(HARN) / Washington North (ftUS),2273,projected,4497,,4152,15367,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32148.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2927,NAD83(HARN) / Washington South (ftUS),2274,projected,4497,,4152,15368,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32149.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2928,NAD83(HARN) / Wisconsin North (ftUS),2267,projected,4497,,4152,15369,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32152.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2929,NAD83(HARN) / Wisconsin Central (ftUS),2266,projected,4497,,4152,15370,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32153.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2930,NAD83(HARN) / Wisconsin South (ftUS),2268,projected,4497,,4152,15371,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  Federal definition is metric - see code 32154.,National Geodetic Survey,EPSG,2002-06-22 00:00:00,,1,0
+2931,Beduaram / TM 13 NE,2771,projected,4497,,4213,16413,,,Oil exploration.,Used by Elf in 1986.,TotalFinaElf,EPSG,2002-06-28 00:00:00,,1,0
+2932,QND95 / Qatar National Grid,1346,projected,4400,,4614,19919,,,Large and medium scale topographic mapping and engineering survey.,,Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,1,0
+2933,Segara / UTM zone 50S,1328,projected,4400,,4613,16150,,,Large and medium scale topographic mapping and engineering survey.,,TotalFinaElf,EPSG,2002-06-22 00:00:00,,1,0
+2934,Segara (Jakarta) / NEIEZ,1360,projected,4499,,4820,19905,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+2935,Pulkovo 1942 / CS63 zone A1,2772,projected,4530,,4284,18441,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2936,Pulkovo 1942 / CS63 zone A2,2773,projected,4530,,4284,18442,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2937,Pulkovo 1942 / CS63 zone A3,2774,projected,4530,,4284,18443,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2938,Pulkovo 1942 / CS63 zone A4,2775,projected,4530,,4284,18444,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2939,Pulkovo 1942 / CS63 zone K2,2776,projected,4530,,4284,18446,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2940,Pulkovo 1942 / CS63 zone K3,2777,projected,4530,,4284,18447,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2941,Pulkovo 1942 / CS63 zone K4,2778,projected,4530,,4284,18448,,,"Large scale topographic mapping, cadastral and engineering survey.",,EPSG,EPSG,2002-06-28 00:00:00,,1,0
+2942,Porto Santo / UTM zone 28N,1314,projected,4400,,4615,16028,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+2943,Selvagem Grande / UTM zone 28N,2779,projected,4400,,4616,16028,,,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+2944,NAD83(CSRS) / SCoPQ zone 2,1420,projected,4499,,4617,17700,,,Large and medium scale topographic mapping and engineering survey.,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2945,NAD83(CSRS) / MTM zone 3,1421,projected,4496,,4617,17703,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 3"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2946,NAD83(CSRS) / MTM zone 4,1422,projected,4496,,4617,17704,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 4"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2947,NAD83(CSRS) / MTM zone 5,1423,projected,4496,,4617,17705,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 5"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2948,NAD83(CSRS) / MTM zone 6,1424,projected,4496,,4617,17706,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 6"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2949,NAD83(CSRS) / MTM zone 7,1425,projected,4496,,4617,17707,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 7"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2950,NAD83(CSRS) / MTM zone 8,1426,projected,4496,,4617,17708,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 8"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2951,NAD83(CSRS) / MTM zone 9,1427,projected,4496,,4617,17709,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 9"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2952,NAD83(CSRS) / MTM zone 10,1428,projected,4496,,4617,17710,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83(CSRS98) / SCoPQ zone 10"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,2002-07-13 00:00:00,,1,0
+2953,NAD83(CSRS) / New Brunswick Stereo,1447,projected,4500,,4617,19946,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+2954,NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83),1533,projected,4496,,4617,19960,,,Large and medium scale topographic mapping and engineering survey.,,PEI Department of Transportation & Public Works,EPSG,2002-07-13 00:00:00,,1,0
+2955,NAD83(CSRS) / UTM zone 11N,1508,projected,4400,,4617,16011,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2956,NAD83(CSRS) / UTM zone 12N,1507,projected,4400,,4617,16012,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2957,NAD83(CSRS) / UTM zone 13N,1506,projected,4400,,4617,16013,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2958,NAD83(CSRS) / UTM zone 17N,1428,projected,4400,,4617,16017,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2959,NAD83(CSRS) / UTM zone 18N,1443,projected,4400,,4617,16018,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2960,NAD83(CSRS) / UTM zone 19N,1448,projected,4400,,4617,16019,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+2961,NAD83(CSRS) / UTM zone 20N,1449,projected,4400,,4617,16020,,,Large and medium scale topographic mapping and engineering survey.,In use from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+2962,NAD83(CSRS) / UTM zone 21N,1446,projected,4400,,4617,16021,,,Large and medium scale topographic mapping and engineering survey.,In use from 2000.,Geomatics Canada.,EPSG,2002-07-13 00:00:00,,1,0
+2963,Lisbon 1890 (Lisbon) / Portugal Bonne,1294,projected,6509,,4904,19979,,,Medium scale topographic mapping.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt/portuguese/produtos/cartografia/50m.html,EPSG,2002-07-13 00:00:00,,1,0
+3036,Moznet / UTM zone 36S,1540,projected,4400,,4130,16136,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+3037,Moznet / UTM zone 37S,1541,projected,4400,,4130,16137,,,Large and medium scale topographic mapping and engineering survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+3148,Indian 1960 / UTM zone 48N,1542,projected,4400,,4131,16048,,,Large and medium scale topographic mapping and engineering survey.,In Vietnam superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,,EPSG,1998-11-11 00:00:00,,1,0
+3149,Indian 1960 / UTM zone 49N,1453,projected,4400,,4131,16049,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,,EPSG,1998-11-11 00:00:00,,1,0
+3176,Indian 1960 / TM 106 NE,1495,projected,4400,,4131,16506,,,Used by Petrovietnam for offshore block 15.,,Petrovietnam,EPSG,1998-11-11 00:00:00,,1,0
+3200,FD58 / Iraq zone,1300,projected,4400,,4132,19906,,,Large and medium scale topographic mapping and engineering survey.,,IOEPC records.,EPSG,1998-11-11 00:00:00,,1,0
+3300,Estonian Coordinate System of 1992,1090,projected,4530,,4133,19938,,,Used for 1:20000 and larger scale mapping.,Superseded by Estonian Coordinate System of 1997 (code 3301).,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+3301,Estonian Coordinate System of 1997,1090,projected,4530,,4180,19938,,,Used for 1:20000 and larger scale mapping.,Supersedes Estonian Coordinate System of 1992 (code 3300).,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+3439,PSD93 / UTM zone 39N,1544,projected,4400,,4134,16039,,,Oil exploration and production.,Supersedes Fahud / UTM zone 39N projCS (code 23239). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+3440,PSD93 / UTM zone 40N,1545,projected,4400,,4134,16040,,,Oil exploration and production.,Supersedes Fahud / UTM zone 40N projCS (code 23240). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+3561,Old Hawaiian / Hawaii zone 1,1546,projected,4497,,4135,15101,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 1.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3562,Old Hawaiian / Hawaii zone 2,1547,projected,4497,,4135,15102,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 2.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3563,Old Hawaiian / Hawaii zone 3,1548,projected,4497,,4135,15103,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 3.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3564,Old Hawaiian / Hawaii zone 4,1549,projected,4497,,4135,15104,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 4.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3565,Old Hawaiian / Hawaii zone 5,1550,projected,4497,,4135,15105,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Hawaii zone 5.,,EPSG,1999-05-24 00:00:00,99.322,1,0
+3920,Puerto Rico / UTM zone 20N,1253,projected,4400,,4139,16020,,,Large and medium scale topographic mapping and engineering survey.,NAD27 / UTM zone 20 N (code 26720) used for military purposes.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+3991,Puerto Rico State Plane CS of 1927,1194,projected,4497,,4139,15201,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / Puerto Rico State Plane CS.,US National Geodetic Survey,EPSG,1999-05-24 00:00:00,99.323,1,0
+3992,Puerto Rico / St. Croix,1254,projected,4497,,4139,15202,,,Large and medium scale topographic mapping and engineering survey.,Sometimes erroneously referred to as NAD27 / St. Croix State Plane CS.,US National Geodetic Survey,EPSG,1999-05-24 00:00:00,99.323,1,0
+4001,Unknown datum based upon the Airy 1830 ellipsoid,1263,geographic 2D,6402,6001,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4002,Unknown datum based upon the Airy Modified 1849 ellipsoid,1263,geographic 2D,6402,6002,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4003,Unknown datum based upon the Australian National Spheroid,1263,geographic 2D,6402,6003,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4004,Unknown datum based upon the Bessel 1841 ellipsoid,1263,geographic 2D,6402,6004,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4005,Unknown datum based upon the Bessel Modified ellipsoid,1263,geographic 2D,6402,6005,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4006,Unknown datum based upon the Bessel Namibia ellipsoid,1263,geographic 2D,6402,6006,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4007,Unknown datum based upon the Clarke 1858 ellipsoid,1263,geographic 2D,6402,6007,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4008,Unknown datum based upon the Clarke 1866 ellipsoid,1263,geographic 2D,6402,6008,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4009,Unknown datum based upon the Clarke 1866 Michigan ellipsoid,1263,geographic 2D,6402,6009,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4010,Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid,1263,geographic 2D,6402,6010,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4011,Unknown datum based upon the Clarke 1880 (IGN) ellipsoid,1263,geographic 2D,6402,6011,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4012,Unknown datum based upon the Clarke 1880 (RGS) ellipsoid,1263,geographic 2D,6402,6012,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4013,Unknown datum based upon the Clarke 1880 (Arc) ellipsoid,1263,geographic 2D,6402,6013,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4014,Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid,1263,geographic 2D,6402,6014,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4015,Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid,1263,geographic 2D,6402,6015,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4016,Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid,1263,geographic 2D,6402,6016,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4018,Unknown datum based upon the Everest 1830 Modified ellipsoid,1263,geographic 2D,6402,6018,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4019,Unknown datum based upon the GRS 1980 ellipsoid,1263,geographic 2D,6402,6019,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4020,Unknown datum based upon the Helmert 1906 ellipsoid,1263,geographic 2D,6402,6020,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4021,Unknown datum based upon the Indonesian National Spheroid,1263,geographic 2D,6402,6021,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4022,Unknown datum based upon the International 1924 ellipsoid,1263,geographic 2D,6402,6022,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4024,Unknown datum based upon the Krassowsky 1940 ellipsoid,1263,geographic 2D,6402,6024,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4025,Unknown datum based upon the NWL 9D ellipsoid,1263,geographic 2D,6402,6025,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4027,Unknown datum based upon the Plessis 1817 ellipsoid,1263,geographic 2D,6402,6027,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4028,Unknown datum based upon the Struve 1860 ellipsoid,1263,geographic 2D,6402,6028,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4029,Unknown datum based upon the War Office ellipsoid,1263,geographic 2D,6402,6029,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4030,Unknown datum based upon the WGS 84 ellipsoid,1263,geographic 2D,6402,6030,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4031,Unknown datum based upon the GEM 10C ellipsoid,1263,geographic 2D,6402,6031,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4032,Unknown datum based upon the OSU86F ellipsoid,1263,geographic 2D,6402,6032,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4033,Unknown datum based upon the OSU91A ellipsoid,1263,geographic 2D,6402,6033,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4034,Unknown datum based upon the Clarke 1880 ellipsoid,1263,geographic 2D,6402,6034,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,0
+4035,Unknown datum based upon the Authalic Sphere,1263,geographic 2D,6402,6035,,,,,Not recommended.,Deprecated. Use code 4047.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0,1
+4036,Unknown datum based upon the GRS 1967 ellipsoid,1263,geographic 2D,6402,6036,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4041,Unknown datum based upon the Average Terrestrial System 1977 ellipsoid,1263,geographic 2D,6402,6041,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4042,Unknown datum based upon the Everest (1830 Definition) ellipsoid,1263,geographic 2D,6402,6042,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4043,Unknown datum based upon the WGS 72 ellipsoid,1263,geographic 2D,6402,6043,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4044,Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid,1263,geographic 2D,6402,6044,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4045,Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid,1263,geographic 2D,6402,6045,,,,,Not recommended.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0,0
+4047,Unspecified based upon the GRS 1980 Authalic Sphere,1263,geographic 2D,6402,6047,,,,,Small scale statistical mapping.,Use only in cases where geodetic datum is unknown.,EPSG,EPSG,2001-06-05 00:00:00,,0,0
+4120,Greek,1106,geographic 2D,6402,6120,,,,,Geodetic survey.,,Topography Department; National Technical University of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+4121,GGRS87,1106,geographic 2D,6402,6121,,,,,Geodetic survey.,,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+4122,ATS77,1283,geographic 2D,6402,6122,,,,,Geodetic survey.,In use from 1979.  To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-22 00:00:00,,1,0
+4123,KKJ,1095,geographic 2D,6402,6123,,,,,Geodetic survey.,,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+4124,RT90,1225,geographic 2D,6402,6124,,,,,Geodetic survey.,,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+4125,Samboja,1328,geographic 2D,6402,6125,,,,,Geodetic survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+4126,LKS94 (ETRS89),1145,geographic 2D,6402,6126,,,,,Geodetic survey.,,,EPSG,1998-03-13 00:00:00,,1,0
+4127,Tete,1167,geographic 2D,6402,6127,,,,,Geodetic survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4128,Madzansua,1315,geographic 2D,6402,6128,,,,,Geodetic survey.,Superseded by values transformed to Tete geogCS (code 4127).,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4129,Observatario,1329,geographic 2D,6402,6129,,,,,Geodetic survey.,Superseded by values transformed to Tete geogCS (code 4127).,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4130,Moznet,1167,geographic 2D,6402,6130,,,,,Geodetic survey.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+4131,Indian 1960,1302,geographic 2D,6402,6131,,,,,Geodetic survey.,,,EPSG,1998-11-11 00:00:00,,1,0
+4132,FD58,1300,geographic 2D,6402,6132,,,,,Geodetic survey.,,IOEPC records.,EPSG,1998-11-11 00:00:00,,1,0
+4133,EST92,1090,geographic 2D,6402,6133,,,,,Geodetic survey.,Superseded by EST97 (code 4180).,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,1,0
+4134,PDO Survey Datum 1993,1183,geographic 2D,6402,6134,,,,,Geodetic survey.,Supersedes Fahud geogCS (code 4232). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+4135,Old Hawaiian,1334,geographic 2D,6402,6135,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4136,St. Lawrence Island,1332,geographic 2D,6402,6136,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4137,St. Paul Island,1333,geographic 2D,6402,6137,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4138,St. George Island,1331,geographic 2D,6402,6138,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4139,Puerto Rico,1335,geographic 2D,6402,6139,,,,,Geodetic surveying for civilian purposes.,NAD27 (code 4267) used for military purposes.  Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-24 00:00:00,,1,0
+4140,NAD83(CSRS98),1336,geographic 2D,6402,6140,,,,,Geodetic survey.,In New Brunswick superseded ATS77 from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2000-10-19 00:00:00,99.90,1,1
+4141,Israel,2603,geographic 2D,6402,6141,,,,,Geodetic survey.,Supersedes Palestine 1923.,Survey of Israel,EPSG,2002-06-22 00:00:00,2002.34,1,0
+4142,Locodjo 1965,1075,geographic 2D,6402,6142,,,,,Geodetic survey.,Superseded by Abidjan 1987 (EPSG code 4143).,IGN Paris,EPSG,1999-10-20 00:00:00,,1,0
+4143,Abidjan 1987,1075,geographic 2D,6402,6143,,,,,Geodetic survey.,Supersedes Locodjo 1965 (EPSG code 4142).,IGN Paris,EPSG,2001-06-05 00:00:00,2001.11,1,0
+4144,Kalianpur 1937,1308,geographic 2D,6402,6144,,,,,Geodetic survey.,Adopts 1937 metric conversion of 0.30479841 metres per Indian foot.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,,1,0
+4145,Kalianpur 1962,1184,geographic 2D,6402,6145,,,,,Geodetic survey.,Adopts 1962 metric conversion of 0.3047996 metres per Indian foot.,,EPSG,1999-10-20 00:00:00,,1,0
+4146,Kalianpur 1975,1121,geographic 2D,6402,6146,,,,,Geodetic survey.,Adopts 1975 metric conversion of 0.3047995 metres per Indian foot.,,EPSG,1999-10-20 00:00:00,,1,0
+4147,Hanoi 1972,1252,geographic 2D,6402,6147,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4148,Hartebeesthoek94,1215,geographic 2D,6402,6148,,,,,Geodetic survey.,Supersedes Cape (code 4222) from 1999.,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-01-06 00:00:00,99.96  2000.04,1,0
+4149,CH1903,1286,geographic 2D,6402,6149,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4150,CH1903+,1286,geographic 2D,6402,6150,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4151,CHTRF95,1286,geographic 2D,6402,6151,,,,,Geodetic survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+4152,NAD83(HARN),1337,geographic 2D,6402,6152,,,,,Geodetic survey.,,National Geodetic Survey,EPSG,1999-10-20 00:00:00,,1,0
+4153,Rassadiran,1338,geographic 2D,6402,6153,,,,,Geodetic survey.,,Total-Fina,EPSG,1999-10-20 00:00:00,,1,0
+4154,ED50(ED77),1123,geographic 2D,6402,6154,,,,,Geodetic survey.,,National Cartographic Centre of Iran,EPSG,1999-10-20 00:00:00,,1,0
+4155,Dabola 1981,1112,geographic 2D,6402,6155,,,,,Geodetic survey.,Supersedes Conakry 1905 (EPSG code 4315).,IGN Paris,EPSG,1999-12-09 00:00:00,,1,0
+4156,S-JTSK,1306,geographic 2D,6402,6156,,,,,Geodetic survey.,"S-JTSK is the Uniform Trigonometric Cadastral Network.  It is a modification of the Austrian MGI geogCRS, code 4312.",Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2001-08-28 00:00:00,2001.26,1,0
+4157,Mount Dillon,1322,geographic 2D,6402,6157,,,,,Geodetic survey.,,University of the West Indies Geodetic Services.,EPSG,2000-03-07 00:00:00,,1,0
+4158,Naparima 1955,1339,geographic 2D,6402,6158,,,,,Geodetic survey.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,2000-03-07 00:00:00,,1,0
+4159,ELD79,1143,geographic 2D,6402,6159,,,,,Geodetic survey.,,Various oil company records.,EPSG,2000-03-07 00:00:00,,1,0
+4160,Chos Malal 1914,1292,geographic 2D,6402,6160,,,,,Geodetic survey.,Superseded by Campo Inchauspe (geogCS code 4221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,1,0
+4161,Pampa del Castillo,1265,geographic 2D,6402,6161,,,,,Geodetic surveying within the oil industry.,Superseded by Campo Inchauspe (geogCS code 4221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,1,0
+4162,Korean 1985,1135,geographic 2D,6402,6162,,,,,Geodetic survey.,Supersedes use of Tokyo datum.,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,1,0
+4163,Yemen NGN96,1257,geographic 2D,6402,6163,,,,,Geodetic survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+4164,South Yemen,1340,geographic 2D,6402,6164,,,,,Geodetic survey.,,IGN Paris,EPSG,2000-03-07 00:00:00,,1,0
+4165,Bissau,1113,geographic 2D,6402,6165,,,,,Geodetic survey.,,NIMA,EPSG,2000-03-07 00:00:00,,1,0
+4166,Korean 1995,1135,geographic 2D,6402,6166,,,,,Geodetic survey.,,NIMA TR8350.2  ftp://164.214.2.65/pub/gg/tr8350.2/changes.pdf,EPSG,2000-05-08 00:00:00,,1,0
+4167,NZGD2000,1175,geographic 2D,6402,6167,,,,,Geodetic survey.,Supersedes NZGD49 (code 4272) from March 2000.,Land Information New Zealand.,EPSG,2000-10-19 00:00:00,,1,0
+4168,Accra,1104,geographic 2D,6402,6168,,,,,Geodetic survey.,"Ellipsoid semi-major axis (a)=20926201 exactly Gold Coast feet. 
+Superseded by Leigon (code 4250) in 1978.",Ordnance Survey International,EPSG,2000-10-19 00:00:00,,1,0
+4169,American Samoa 1962,1027,geographic 2D,6402,6169,,,,,Geodetic survey.,,NIMA TR8350.2 revision of January 2000 and ftp://ftp.ngs.noaa.gov/pub/pcsoft/nadcon/samoa_readme.txt,EPSG,2000-10-19 00:00:00,,1,0
+4170,SIRGAS,1341,geographic 2D,6402,6170,,,,,Geodetic survey.,,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,2001.33,1,0
+4171,RGF93,1096,geographic 2D,6402,6171,,,,,Geodetic survey.,,TotalFinaElf,EPSG,2000-10-19 00:00:00,,1,0
+4172,POSGAR,1033,geographic 2D,6402,6172,,,,,Geodetic survey.,"A geodetic network of 127 high accuracy surved points that define the National Geodetic System (Sistema Geod�sico Nacional), adopted by IGM in May 1997",http://www.igm.gov.ar/posgar.html,EPSG,2000-10-19 00:00:00,2001.051,1,1
+4173,IRENET95,1305,geographic 2D,6402,6173,,,,,Geodetic survey.,,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,1,0
+4174,Sierra Leone 1924,1342,geographic 2D,6402,6174,,,,,Geodetic survey.,Ellipsoid semi-major axis (a)=20926201 exactly Gold Coast feet; 1 Gold Coast foot = 0.3047997101815 m.,Ordnance Survey International,EPSG,2001-06-05 00:00:00,,1,0
+4175,Sierra Leone 1968,1209,geographic 2D,6402,6175,,,,,Geodetic survey.,Supersedes Sierra Leone 1960.  The 1968 readjustment coordinates are within 3m of the 1960 provisional adjustment.,Ordnance Survey International.,EPSG,2001-06-05 00:00:00,,1,0
+4176,Australian Antarctic,1278,geographic 2D,6402,6176,,,,,Geodetic survey.,,Standards Australia,ISO 19127,2001-06-05 00:00:00,,1,0
+4178,Pulkovo 1942(83),1343,geographic 2D,6402,6178,,,,,Geodetic survey.,"In Brandenburg superseded by ETRS89. 
+In Sachsen and Thuringen superseded by DHDN.",Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4179,Pulkovo 1942(58),1192,geographic 2D,6402,6179,,,,,Geodetic survey.,,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4180,EST97,1090,geographic 2D,6402,6180,,,,,Geodetic survey.,Supersedes EST92 (code 4133).,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4181,Luxembourg 1930,1146,geographic 2D,6402,6181,,,,,Geodetic survey,,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4182,Azores Occidental 1939,1344,geographic 2D,6402,6182,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4183,Azores Central 1948,1301,geographic 2D,6402,6183,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4184,Azores Oriental 1940,1345,geographic 2D,6402,6184,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+4185,Madeira 1936,1314,geographic 2D,6402,6185,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,1
+4188,OSNI 1952,2530,geographic 2D,6402,6188,,,,,Geodesy and topographic mapping.,Superseded by 1975 Mapping Adjustment.  See code 4300.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,0,0
+4189,REGVEN,1251,geographic 2D,6402,6189,,,,,Geodetic survey.,Densification in Venezuela of SIRGAS.,Servicio Autonomo de Geografia y Cartografia Nacional.,EPSG,2001-11-06 00:00:00,,1,0
+4190,POSGAR 98,1033,geographic 2D,6402,6190,,,,,Geodetic survey.,A geodetic network of 127 high accuracy surved points that define the National Geodetic System (Sistema Geod�sico Nacional). Densification of SIRGAS 1995.,http://www.igm.gov.ar/posgar.html,EPSG,2001-11-06 00:00:00,,1,0
+4191,Albanian 1987,1025,geographic 2D,6402,6191,,,,,Geodetic survey.,,EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,1,0
+4192,Douala 1948,1060,geographic 2D,6402,6192,,,,,Geodetic survey.,Superseded by Manoca 1962 (code 4193).,TotalFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+4193,Manoca 1962,1060,geographic 2D,6402,6193,,,,,Geodetic survey.,Supersedes Doula 1948 (code 4192). The intent of the Bukuva 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.,TotalFinaElf,EPSG,2002-01-18 00:00:00,,1,0
+4194,Qornoq 1927,1107,geographic 2D,6402,6194,,,,,Geodetic survey.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+4195,Scoresbysund 1952,2570,geographic 2D,6402,6195,,,,,Geodetic survey.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+4196,Ammassalik 1958,2571,geographic 2D,6402,6196,,,,,Geodetic survey.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,1,0
+4197,Garoua,2590,geographic 2D,6402,6197,,,,,Geodetic survey.,The intent of the Bukuva 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+4198,Kousseri,2591,geographic 2D,6402,6198,,,,,Geodetic survey.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,1,0
+4199,Egypt 1930,1086,geographic 2D,6402,6199,,,,,Scientific purposes only.,"Note that Egypt 1930 uses the International 1924 ellipsoid, unlike the Egypt 1907 CRS (code 4229) which uses the Helmert ellipsoid. Oil industry references to the Egypt 1930 name and the Helmert ellipsoid probably mean Egypt 1907.",,EPSG,2002-02-12 00:00:00,,1,0
+4200,Pulkovo 1995,1198,geographic 2D,6402,6200,,,,,Geodetic survey.,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,0
+4201,Adindan,1271,geographic 2D,6402,6201,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4202,AGD66,1279,geographic 2D,6402,6202,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4203,AGD84,1036,geographic 2D,6402,6203,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4204,Ain el Abd,1272,geographic 2D,6402,6204,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4205,Afgooye,1214,geographic 2D,6402,6205,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4206,Agadez,1177,geographic 2D,6402,6206,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4207,Lisbon,1294,geographic 2D,6402,6207,,,,,Geodetic survey.,Supersedes Lisbon 1890 system which used Bessel 1841 ellipsoid. Superseded by Datum 73 (code 4274).,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,2001.551,1,0
+4208,Aratu,1274,geographic 2D,6402,6208,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4209,Arc 1950,1276,geographic 2D,6402,6209,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4210,Arc 1960,1277,geographic 2D,6402,6210,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4211,Batavia,1285,geographic 2D,6402,6211,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4212,Barbados 1938,1042,geographic 2D,6402,6212,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,99.171,1,0
+4213,Beduaram,2771,geographic 2D,6402,6213,,,,,Geodetic survey.,,,EPSG,2002-06-28 00:00:00,2002.43,1,0
+4214,Beijing 1954,1067,geographic 2D,6402,6214,,,,,Geodetic survey.,Superseded by Xian 1980 (code 4610).,,EPSG,1995-06-02 00:00:00,,1,0
+4215,Belge 1950,1347,geographic 2D,6402,6215,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4216,Bermuda 1957,1047,geographic 2D,6402,6216,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4218,Bogota 1975,1070,geographic 2D,6402,6218,,,,,Geodetic survey.,"Supersedes earlier 3 adjustments of 1951, 1944 and 1941.","IGAC special publication no. 1, ""Geodesia"" 4th edition, 1975.",EPSG,2000-10-19 00:00:00,2000.20,1,0
+4219,Bukit Rimpah,1287,geographic 2D,6402,6219,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4220,Camacupa,1288,geographic 2D,6402,6220,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4221,Campo Inchauspe,1033,geographic 2D,6402,6221,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4222,Cape,1290,geographic 2D,6402,6222,,,,,Geodetic survey.,Superseded by Hartbeesthoek94 from 1999.,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,1995-06-02 00:00:00,2000.04,1,0
+4223,Carthage,1236,geographic 2D,6402,6223,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4224,Chua,1053,geographic 2D,6402,6224,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4225,Corrego Alegre,1293,geographic 2D,6402,6225,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4226,Cote d'Ivoire,1075,geographic 2D,6402,6226,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4227,Deir ez Zor,1623,geographic 2D,6402,6227,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4228,Douala,1060,geographic 2D,6402,6228,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4229,Egypt 1907,1086,geographic 2D,6402,6229,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4230,ED50,1296,geographic 2D,6402,6230,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4231,ED87,1297,geographic 2D,6402,6231,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4232,Fahud,1183,geographic 2D,6402,6232,,,,,Geodetic survey.,Since 1993 superseded by PSD93 geogCS (code 4134). Maximum differences to Fahud adjustment are 20 metres.,,EPSG,1995-06-02 00:00:00,,1,0
+4233,Gandajika 1970,1152,geographic 2D,6402,6233,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4234,Garoua,1060,geographic 2D,6402,6234,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4235,Guyane Francaise,1097,geographic 2D,6402,6235,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4236,Hu Tzu Shan,1228,geographic 2D,6402,6236,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4237,HD72,1119,geographic 2D,6402,6237,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4238,ID74,1122,geographic 2D,6402,6238,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4239,Indian 1954,1304,geographic 2D,6402,6239,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4240,Indian 1975,1231,geographic 2D,6402,6240,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4241,Jamaica 1875,1128,geographic 2D,6402,6241,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4242,JAD69,1128,geographic 2D,6402,6242,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4243,Kalianpur 1880,1307,geographic 2D,6402,6243,,,,,Geodetic survey.,,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,97.23,1,0
+4244,Kandawala,1218,geographic 2D,6402,6244,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4245,Kertau,1309,geographic 2D,6402,6245,,,,,Geodetic survey.,Adopts metric conversion of 39.370113 inches per metre.,,EPSG,1995-06-02 00:00:00,,1,0
+4246,KOC,1136,geographic 2D,6402,6246,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4247,La Canoa,1251,geographic 2D,6402,6247,,,,,Geodetic survey.,PSAD56 uses same origin.,,EPSG,1995-06-02 00:00:00,,1,0
+4248,PSAD56,1348,geographic 2D,6402,6248,,,,,Geodetic survey.,Origin is same as La Canoa.  In Venezuela known as La Canoa.,,EPSG,1995-06-02 00:00:00,,1,0
+4249,Lake,1312,geographic 2D,6402,6249,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4250,Leigon,1104,geographic 2D,6402,6250,,,,,Geodetic survey.,Superseded Accra (code 4168) from 1978.,Ordnance Survey International,EPSG,1995-06-02 00:00:00,,1,0
+4251,Liberia 1964,1142,geographic 2D,6402,6251,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4252,Lome,1232,geographic 2D,6402,6252,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4253,Luzon 1911,1190,geographic 2D,6402,6253,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4254,Hito XVIII 1963,1303,geographic 2D,6402,6254,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4255,Herat North,1024,geographic 2D,6402,6255,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4256,Mahe 1971,1208,geographic 2D,6402,6256,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4257,Makassar,1316,geographic 2D,6402,6257,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4258,ETRS89,1298,geographic 2D,6402,6258,,,,,Geodetic survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,Norwegian Geodetic Institute geodetic publication 1990:1,EPSG,2000-10-19 00:00:00,97.11  99.11 2000.72,1,0
+4259,Malongo 1987,1317,geographic 2D,6402,6259,,,,,Geodetic survey.,Offshore extension of Mhast GeogCS (4264) using Transit translocation from Station Y at Malongo base camp.,Chevron Petroleum Technology,EPSG,1995-06-02 00:00:00,,1,0
+4260,Manoca,1060,geographic 2D,6402,6260,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,2002.01,1,1
+4261,Merchich,1166,geographic 2D,6402,6261,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4262,Massawa,1089,geographic 2D,6402,6262,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4263,Minna,1178,geographic 2D,6402,6263,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4264,Mhast,1318,geographic 2D,6402,6264,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4265,Monte Mario,1127,geographic 2D,6402,6265,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4266,M'poraloko,1100,geographic 2D,6402,6266,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4267,NAD27,1349,geographic 2D,6402,6267,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.  Superseded by NAD27(76) (code 4608) in Ontario and CGQ77 (code 4609) in Quebec.,,EPSG,1995-06-02 00:00:00,99.04,1,0
+4268,NAD27 Michigan,1391,geographic 2D,6402,6268,,,,,Geodetic survey.,Ellipsoid taken to be 800ft above geoid. Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1996-12-12 00:00:00,96.28,1,0
+4269,NAD83,1350,geographic 2D,6402,6269,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1995-06-02 00:00:00,,1,0
+4270,Nahrwan 1967,1351,geographic 2D,6402,6270,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4271,Naparima 1972,1322,geographic 2D,6402,6271,,,,,Geodetic survey.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,1995-06-02 00:00:00,,1,0
+4272,NZGD49,1175,geographic 2D,6402,6272,,,,,Geodetic survey.,Superseded by NZGD49 in March 2000.,New Zealand Department of Lands and Surveys Technical Report No. 1; 1978.,EPSG,2000-10-19 00:00:00,2000.702,1,0
+4273,NGO 1948,1352,geographic 2D,6402,6273,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4274,Datum 73,1294,geographic 2D,6402,6274,,,,,Geodetic survey.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,,1,0
+4275,NTF,1353,geographic 2D,6402,6275,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4276,NSWC 9Z-2,1262,geographic 2D,6402,6276,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4277,OSGB 1936,1264,geographic 2D,6402,6277,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4278,OSGB70,1264,geographic 2D,6402,6278,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4279,OS(SN)80,1354,geographic 2D,6402,6279,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4280,Padang,1355,geographic 2D,6402,6280,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4281,Palestine 1923,1356,geographic 2D,6402,6281,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4282,Pointe Noire,1072,geographic 2D,6402,6282,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,2002.05,1,0
+4283,GDA94,1036,geographic 2D,6402,6283,,,,,Geodetic survey.,,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-06-02 00:00:00,,1,0
+4284,Pulkovo 1942,1357,geographic 2D,6402,6284,,,,,Geodetic survey.,For Germany see Pulkovo 1942(83); for Poland see Pulkovo 1942(58).,,EPSG,1995-06-02 00:00:00,,1,0
+4285,Qatar 1974,1346,geographic 2D,6402,6285,,,,,Geodetic survey.,,Qatar Centre for Geographic Information.,EPSG,2000-03-07 00:00:00,2000.29  (2001.27),1,0
+4286,Qatar 1948,1346,geographic 2D,6402,6286,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4287,Qornoq,1107,geographic 2D,6402,6287,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4288,Loma Quintana,1313,geographic 2D,6402,6288,,,,,Geodetic survey.,Superseded by La Canoa (code 4247).,,EPSG,1995-06-02 00:00:00,,1,0
+4289,Amersfoort,1275,geographic 2D,6402,6289,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4291,SAD69,1358,geographic 2D,6402,6291,,,,,Geodetic survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251.  Error introduced if not using the truncated precision is 0 to 31mm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+4292,Sapper Hill 1943,1092,geographic 2D,6402,6292,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4293,Schwarzeck,1169,geographic 2D,6402,6293,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4294,Segora,1359,geographic 2D,6402,6294,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+4295,Serindung,1360,geographic 2D,6402,6295,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4296,Sudan,1361,geographic 2D,6402,6296,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4297,Tananarive,1149,geographic 2D,6402,6297,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4298,Timbalai 1948,1362,geographic 2D,6402,6298,,,,,Geodetic survey.,Adopts metric conversion of 39.370147 inches per metre.,,EPSG,1995-06-02 00:00:00,,1,0
+4299,TM65,1125,geographic 2D,6402,6299,,,,,Basis for topographic mapping in Republic of Ireland between 1965 and 1975; for scientific purposes only in Northern Ireland.,Superseded by 1975 Mapping Adjustment. See code 4300.,,EPSG,1995-06-02 00:00:00,,1,0
+4300,TM75,1305,geographic 2D,6402,6300,,,,,Basis for topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1,0
+4301,Tokyo,1364,geographic 2D,6402,6301,,,,,Geodetic survey.,Superseded by JGD2000 (code 4612) from April 2002.,Geographic Survey Institute; Japan; Bulletin 40 (March 1994).  Also http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,1,0
+4302,Trinidad 1903,1322,geographic 2D,6402,6302,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4303,TC(1948),1363,geographic 2D,6402,6303,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4304,Voirol 1875,1365,geographic 2D,6402,6304,,,,,Geodetic survey.,,IGN Paris,EPSG,1995-06-02 00:00:00,,1,0
+4306,Bern 1938,1286,geographic 2D,6402,6306,,,,,Used for the geographic coordinates overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,,,EPSG,1995-06-02 00:00:00,,1,0
+4307,Nord Sahara 1959,1366,geographic 2D,6402,6307,,,,,Geodetic survey.,Sometimes incorrectly referred to as Voirol Unifie 1960. Voirol Unifie 1960 is NOT a GeogCRS:  it is two projected coordinate reference systems based on  Nord Sahara 1959.  See codes 30791 and 30792.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2002-08-29 00:00:00,2000.47  2002.56,1,0
+4308,RT38,1225,geographic 2D,6402,6308,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,97.09,1,0
+4309,Yacare,1247,geographic 2D,6402,6309,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4310,Yoff,1207,geographic 2D,6402,6310,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4311,Zanderij,1222,geographic 2D,6402,6311,,,,,Geodetic survey.,Introduced in 1975.,Shell International,EPSG,1995-06-02 00:00:00,,1,0
+4312,MGI,1321,geographic 2D,6402,6312,,,,,Geodetic survey.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,1995-06-02 00:00:00,,1,0
+4313,Belge 1972,1347,geographic 2D,6402,6313,,,,,Geodetic survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+4314,DHDN,1295,geographic 2D,6402,6314,,,,,Geodetic survey.,,EPSG,EPSG,1995-06-02 00:00:00,,1,0
+4315,Conakry 1905,1112,geographic 2D,6402,6315,,,,,Geodetic survey.,Superseded by Dabola 1981 (EPSG code 4155).,IGN Paris,EPSG,1995-06-02 00:00:00,,1,0
+4316,Dealul Piscului 1933,1197,geographic 2D,6402,6316,,,,,Geodetic survey.,Superseded by 1970 system (geogCS code 4317).,,EPSG,1996-04-12 00:00:00,,1,0
+4317,Dealul Piscului 1970,1197,geographic 2D,6402,6317,,,,,Geodetic survey.,Supersedes 1933 system (geogCS code 4316).,,EPSG,1996-04-12 00:00:00,,1,0
+4318,NGN,1136,geographic 2D,6402,6318,,,,,Geodetic survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+4319,KUDAMS,1310,geographic 2D,6402,6319,,,,,Geodetic survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+4322,WGS 72,1262,geographic 2D,6402,6322,,,,,Geodetic survey.,Superseded by WGS 84.,,EPSG,1995-06-02 00:00:00,,1,0
+4324,WGS 72BE,1262,geographic 2D,6402,6324,,,,,Geodetic survey.,Broadcast ephemeris. Superseded by WGS 84.,,EPSG,1995-06-02 00:00:00,,1,0
+4326,WGS 84,1262,geographic 2D,6402,6326,,,,,Used by the GPS satellite navigation system and for NATO military geodetic surveying.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+4327,WGS 84 (geographic 3D),1262,geographic 3D,6401,6326,,,,,Used by the GPS satellite navigation system.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+4328,WGS 84 (geocentric),1262,geocentric,6500,6326,,,,,Used by the GPS satellite navigation system.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+4600,Anguilla 1957,1030,geographic 2D,6402,6600,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4601,Antigua 1943,1273,geographic 2D,6402,6601,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4602,Dominica 1945,1082,geographic 2D,6402,6602,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4603,Grenada 1953,1551,geographic 2D,6402,6603,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4604,Montserrat 1958,1165,geographic 2D,6402,6604,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4605,St. Kitts 1955,1200,geographic 2D,6402,6605,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4606,St. Lucia 1955,1201,geographic 2D,6402,6606,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4607,St. Vincent 1945,1202,geographic 2D,6402,6607,,,,,Geodetic survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+4608,NAD27(76),1367,geographic 2D,6402,6608,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-12 00:00:00,,1,0
+4609,NAD27(CGQ77),1368,geographic 2D,6402,6609,,,,,Geodetic survey.,Note: this coordinate system includes longitudes which are POSITIVE EAST.,,EPSG,1999-05-12 00:00:00,,1,0
+4610,Xian 1980,1067,geographic 2D,6402,6610,,,,,Geodesy.,Supersedes Beijing 1954 (code 4214).,,EPSG,2002-02-12 00:00:00,,1,0
+4611,Hong Kong 1980,1118,geographic 2D,6402,6611,,,,,Geodetic and engineering surveying.,Supersedes Hong Kong 1963.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+4612,JGD2000,1129,geographic 2D,6402,6612,,,,,Geodesy.,Supersedes Tokyo (code 4301) from April 2002.,Japanese Survey Federation.,EPSG,2002-04-25 00:00:00,,1,0
+4613,Segara,1360,geographic 2D,6402,6613,,,,,Geodetic survey.,,EPSG,EPSG,2002-06-22 00:00:00,,1,0
+4614,QND95,1346,geographic 2D,6402,6614,,,,,Geodetic survey.,,Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,1,0
+4615,Porto Santo,1314,geographic 2D,6402,6615,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+4616,Selvagem Grande,2779,geographic 2D,6402,6616,,,,,Geodetic survey.,,Instituto Geografico e Cadastral Lisbon; http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,1,0
+4617,NAD83(CSRS),1336,geographic 2D,6402,6140,,,,,Geodetic survey.,In New Brunswick superseded ATS77 from 1999.,Service New Brunswick Land and Information Standards Manual,EPSG,2002-07-13 00:00:00,,1,0
+4801,Bern 1898 (Bern),1286,geographic 2D,6402,6801,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4802,Bogota 1975 (Bogota),1070,geographic 2D,6402,6802,,,,,Geodetic survey.,"Supersedes earlier 3 adjustments of 1951, 1944 and 1941.","IGAC special publication no. 1, ""Geodesia"" 4th edition, 1975.",EPSG,2000-10-19 00:00:00,2000.07 2000.20,1,0
+4803,Lisbon (Lisbon),1294,geographic 2D,6402,6803,,,,,Geodetic survey.,Supersedes Lisbon 1890 system which used Bessel 1841 ellipsoid.  Superseded by Datum 73 (code 4274).,Instituto Geografico e Cadastral; Lisbon,EPSG,2000-03-07 00:00:00,97.12  2000.07  2001.551,1,0
+4804,Makassar (Jakarta),1316,geographic 2D,6402,6804,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4805,MGI (Ferro),1321,geographic 2D,6402,6805,,,,,Geodetic survey.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4806,Monte Mario (Rome),1127,geographic 2D,6402,6806,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4807,NTF (Paris),1353,geographic 2D,6403,6807,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4808,Padang (Jakarta),1355,geographic 2D,6402,6808,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4809,Belge 1950 (Brussels),1347,geographic 2D,6402,6809,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4810,Tananarive (Paris),1149,geographic 2D,6403,6810,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4811,Voirol 1875 (Paris),1365,geographic 2D,6403,6811,,,,,Geodetic survey.,Superseded by Nord Sahara 1959 (Paris) (code 4812).,IGN Paris,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4813,Batavia (Jakarta),1285,geographic 2D,6402,6813,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4814,RT38 (Stockholm),1225,geographic 2D,6402,6814,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4815,Greek (Athens),1106,geographic 2D,6402,6815,,,,,Geodetic survey.,,Topography Department; National Technical University of Greece.,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4816,Carthage (Paris),1236,geographic 2D,6403,6816,,,,,Geodetic survey.,Superseded by Greenwich-based Carthage geogCS.,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4817,NGO 1948 (Oslo),1352,geographic 2D,6402,6817,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4818,S-JTSK (Ferro),1306,geographic 2D,6402,6818,,,,,Geodetic survey.,"S-JTSK(Ferro) is the Uniform Trigonometric Cadastral Network.  It is a modification of  the Austrian MGI (Ferro) geogCS, code 4805.",Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2000-03-07 00:00:00,,1,0
+4819,Nord Sahara 1959 (Paris),1366,geographic 2D,6403,6819,,,,,Geodetic survey.,,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2000-10-19 00:00:00,2000.74,1,0
+4820,Segara (Jakarta),1285,geographic 2D,6402,6820,,,,,Geodetic survey.,,,EPSG,2002-06-22 00:00:00,,1,0
+4901,ATF (Paris),1326,geographic 2D,6403,6901,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4902,NDG (Paris),1369,geographic 2D,6403,6902,,,,,Geodetic survey.,,,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4903,Madrid 1870 (Madrid),1217,geographic 2D,6402,6903,,,,,Geodetic survey.,,Institut de Geomatica; Barcelona.,EPSG,2000-03-07 00:00:00,2000.07,1,0
+4904,Lisbon 1890 (Lisbon),1294,geographic 2D,6402,6904,,,,,Geodetic survey.,Superseded by Lisbon 1937 system which uses International 1924 ellipsoid.,Instituto Geografico e Cadastral; Lisbon,EPSG,2002-07-13 00:00:00,,1,0
+5701,Newlyn,1264,vertical,6499,5101,,,,,Geodetic and engineering surveying.,,,EPSG,1995-06-02 00:00:00,,1,0
+5702,National Geodetic Vertical Datum of 1929,1323,vertical,6497,5102,,,,,Geodetic and engineering surveying.,,,EPSG,1996-10-18 00:00:00,,1,0
+5703,North American Vertical Datum of 1988,1730,vertical,6499,5103,,,,,Geodetic and engineering surveying.,,,EPSG,1996-10-18 00:00:00,,1,0
+5704,Yellow Sea,1067,vertical,6499,5104,,,,,Geodetic and engineering surveying.,,,EPSG,1995-06-02 00:00:00,,1,1
+5705,Baltic,1284,vertical,6499,5105,,,,,Geodetic and engineering surveying.,,,EPSG,1996-09-12 00:00:00,,1,0
+5706,Caspian,1291,vertical,6498,5106,,,,,Used for Soviet Union nautical charting of the Caspian Sea.,Capsian Sea water levels are now offset appreciably from this datum.,,EPSG,1996-09-12 00:00:00,,1,0
+5709,Normaal Amsterdams Peil,1275,vertical,6499,5109,,,,,Geodetic and engineering surveying.,,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,2000-03-07 00:00:00,2000.10,1,0
+5710,Oostende,1347,vertical,6499,5110,,,,,Geodetic and engineering surveying.,,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,1996-09-12 00:00:00,,1,0
+5711,Australian Height Datum,1281,vertical,6499,5111,,,,,Geodetic and engineering surveying.,,http://www.auslig.gov.au/geodesy,EPSG,1996-09-12 00:00:00,,1,0
+5712,Australian Height Datum (Tasmania),1282,vertical,6499,5112,,,,,Geodetic and engineering surveying.,,,EPSG,1996-09-12 00:00:00,,1,0
+5713,Canadian Vertical Datum of 1928,1289,vertical,6499,5114,,,,,Geodetic and engineering surveying.,,,EPSG,1996-12-12 00:00:00,,1,0
+5714,mean sea level height,1262,vertical,6499,5100,,,,,Used for hydrographic surveying.,Approximates geoid.  Not specific to any location or epoch.,,EPSG,1996-04-12 00:00:00,,1,0
+5715,mean sea level depth,1262,vertical,6498,5100,,,,,Used for hydrographic surveying.,Approximates geoid.  Not specific to any location or epoch.,,EPSG,1996-10-18 00:00:00,,1,0
+5716,Piraeus,1106,vertical,6499,5115,,,,,Geodetic and engineering surveying.,,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,1997-06-16 00:00:00,,1,0
+5717,N60,1095,vertical,6499,5116,,,,,Geodetic and engineering surveying.,In use since 1968.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,1,0
+5718,RH70,1225,vertical,6499,5117,,,,,Geodetic and engineering surveying.,,National and Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+5719,NGF Lallemand,1326,vertical,6499,5118,,,,,Geodetic and engineering surveying.,Generally but not entirely superseded by NGF IGN69 (code 5720).,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994",EPSG,1997-11-13 00:00:00,,1,0
+5720,NGF IGN69,1326,vertical,6499,5119,,,,,Geodetic and engineering surveying.,,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994",EPSG,1997-11-13 00:00:00,,1,0
+5721,NGF IGN78,1327,vertical,6499,5120,,,,,Geodetic and engineering surveying.,,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994",EPSG,1997-11-13 00:00:00,,1,0
+5722,Maputo,1167,vertical,6499,5121,,,,,Geodetic and engineering surveying.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,1,0
+5723,Japanese Standard Levelling Datum,1129,vertical,6499,5122,,,,,Geodetic and engineering surveying.,,Ministry of Construction; Japan.  http://vldb.gsi-mc.jp/sokuchi/datum/image/heichoku2.gif,EPSG,2002-06-22 00:00:00,2002.08,1,0
+5724,PDO Height Datum 1993,1183,vertical,6499,5123,,,,,Geodetic and engineering surveying.,Supersedes Fahud vertical datum (code 5725) from 1993.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+5725,Fahud Height Datum 1993,1183,vertical,6499,5124,,,,,Geodetic and engineering surveying.,Superseded by PHD93 (code 5724)  from 1993.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,1,0
+5726,Ha Tien 1960,1302,vertical,6499,5125,,,,,Geodetic and engineering surveying.,In Vietnam superseded by Hon Dau from 1992.,,EPSG,1999-10-20 00:00:00,,1,0
+5727,Hon Dau 1992,1252,vertical,6499,5126,,,,,Geodetic and engineering surveying.,In Vietnam supersedes Ha Tien from 1992.,,EPSG,1999-10-20 00:00:00,,1,0
+5728,Landesnivellement 1902,1286,vertical,6499,5127,,,,,Geodetic and engineering surveying.,To be superseded by LHN95 (code 5729).,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,1,0
+5729,Landeshohennetz 1995,1286,vertical,6499,5128,,,,,Geodetic and engineering surveying.,To supersede LN02 (code 5728).,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,1,0
+5730,European Vertical Reference System 2000,1298,vertical,6499,5129,,,,,For pan-European products and services.,,IAG subcommission for Europe,EPSG,2000-10-19 00:00:00,,1,0
+5731,Malin Head,1305,vertical,6499,5130,,,,,Topographic mapping at all scales in Republic and medium and small scales in Northern Ireland.,Belfast (code 5732) used for large scale topographic mapping in Northern Ireland.,Ordnance Survey of Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+5732,Belfast,2530,vertical,6499,5131,,,,,Large scale topographic mapping.,Malin Head (code 5731) used for medium and small scale topographic mapping.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+5733,Dansk Normal Nul,1080,vertical,6499,5132,,,,,Topographic mapping and engineering survey.,,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,1,0
+5734,AIOC95 depths,2592,vertical,6498,5133,,,,,Used by AIOC and BP for all offshore Azerbaijan activities and also as a height system for engineering survey at Sangachal terminal.,AIOC95 datum is 1.7m above Caspian datum and 26.3m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5735,Black Sea,1102,vertical,6499,5134,,,,,Hydrographic surveying and since breakup of Former Soviet Union also topographic mapping.,Black Sea datum is 0.4m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,1,0
+5736,Yellow Sea 1956,1067,vertical,6499,5104,,,,,Geodetic and engineering surveying.,Superseded by Yellow Sea 1985 (code 5737).,Guangdong Province Land Resource Information Centre,EPSG,2002-06-22 00:00:00,,1,0
+5737,Yellow Sea 1985,1067,vertical,6499,5137,,,,,Geodetic and engineering surveying.,Supersedes Yellow Sea 1956 (code 5736).,Guangdong Province Land Resource Information Centre,EPSG,2002-06-22 00:00:00,,1,0
+5738,Hong Kong Principal Datum,1118,vertical,6499,5135,,,,,"Geodetic, topographic and engineering surveying.",,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+5739,Hong Kong Chart Datum,1118,vertical,6498,5136,,,,,Hydrographic charting.,Chart datum is 0.15 metres below Hong Kong Principal Datum (CRS code 5738) and 1.38m below MSL at Quarry Bay.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,1,0
+5800,Astra Minas Grid,1265,engineering,6507,9300,,,,,Oil exploration.,,,EPSG,2000-03-07 00:00:00,,1,0
+5801,Barcelona Grid B1,1266,engineering,4500,9301,,,,,Oil exploration by MGO and Talon.,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona.  500000E 300000 N at 10deg 08min 06sec N  64deg 41min 17sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-03-07 00:00:00,,1,0
+5802,Barcelona Grid B2,1266,engineering,4500,9301,,,,,Oil exploration by Phillips; Mobil; Texas; Mercedes; Varco.,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona.  500000E 300000 N at 10deg 08min 06sec N  64deg 41min 07.5sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-03-07 00:00:00,,1,0
+5803,Maturin Grid,1320,engineering,4500,9302,,,,,Oil exploration by MGO and Talon.,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona.  500000E 300000 N at 10deg 08min 06sec N  64deg 41min 17sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-03-07 00:00:00,,1,0
+5804,EPSG seismic bin grid example A,1263,engineering,6508,9312,,,,,Example only - fictitious.,"Bin grid I=J=1 at WGS 84 / UTM zone 31N 456781E 5836723N.
+Bin grid orientation = 20 degrees grid.  Bin width I=25m, J=12.5m.  Bin increment I=1, J=1.  Scale factor at origin 0.99984",UKOOA P6/98 seismic bin grid guideline.,EPSG,2000-06-23 00:00:00,,1,0
+5805,EPSG seismic bin grid example B,1263,engineering,6506,9312,,,,,Example only - fictitious.,,,EPSG,2000-06-23 00:00:00,,1,0
+5806,EPSG local engineering grid example A,1263,engineering,6505,9313,,,,,Example only - fictitious.,"Coordinates are 0,0 at conductor slot A1.",EPSG,EPSG,2000-06-23 00:00:00,,1,0
+5807,EPSG local engineering grid example B,1263,engineering,6504,9313,,,,,Example only - fictitious.,"Shows alternative use of coordinate axis name.
+
+Coordinates are 0,0 at conductor slot A1.",EPSG,EPSG,2000-06-23 00:00:00,,1,0
+5808,Maracaibo Cross Grid M4,1319,engineering,4500,9303,,,,,Oil exploration by Chevron and CVP.,Grid coordinates 200000N 200000E at Cruz Canada Morillo in Maracaibo.  The cross is ascribed coordinates of 10deg 38min 22sec N; 71deg 37min 18sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5809,Maracaibo Cross Grid M5,1319,engineering,4500,9303,,,,,Oil exploration by Texas.,Grid coordinates 200000N 200000E at Cruz Canada Morillo in Maracaibo.  The cross is ascribed coordinates of 10deg 38min 32.3sec N; 71deg 37min 12.1sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5810,La Rosa Grid,1311,engineering,4500,9304,,,,,Oil exploration.,Grid coordinates (0 0) at the monument in La Rosa (10deg 22min 40.417sec N 71deg 26min 59.488sec W; Loma Qunitana datum).  Origin possibly at Cerro Penal (71deg 12min 58sec W) where grid north aligned to true north.  See Lake / Maracaibo La Rosa grid.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5811,Mene Grande,1270,engineering,4500,9305,,,,,Oil exploration by Shell.,Grid coordinates (0 0) at the monument in Santa Barabara; Mene Grande.  The monument is ascribed coordinates of 9deg 52min 25.488sec N; 70deg 54min 35.310sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5812,El Cubo,1269,engineering,4500,9306,,,,,Oil exploration by Shell.,Grid coordinates (0 0) at El Cubo (8deg 44min 17.258sec N; 72deg 30min 09.01sec W).,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5813,Dabajuro,1268,engineering,4500,9307,,,,,Oil exploration by Chevron Creole and Texas.,Grid coordinates 200000N 200000E at the centre of the tower of the church at Dabajuro.  The tower is ascribed coordinates of 11deg 01min 19sec N; 70deg 40min 40sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5814,Tucupita,1370,engineering,4500,9308,,,,,Oil exploration by Creole and Texas.,Grid coordinates 200000N 200000E at centre of the Bolivar plaza in Tucupita.  The plaza is ascribed coordinates of 9deg 03min 32sec N; 62deg 03min 07.6sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5815,Santa Maria de Ipire,1371,engineering,4500,9310,,,,,Oil exploration by Creole  Phillips and Varco.,Grid coordinates 200000N 200000E at concrete monument PR-1 in the Bolivar plaza in Santa Maria de Ipire.  The monument is ascribed coordinates of 8deg 40min 06sec N; 65deg 19min 09sec W.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+5816,Barinas west base,1267,engineering,4500,9311,,,,,Oil exploration by Sinclair.,Grid coordinates 200000N 200000E at the west base monument in Barinas.,Ministry of Mines standards manual of 1974.,EPSG,2000-06-23 00:00:00,,1,0
+7400,NTF (Paris) + NGF IGN69,1326,compound,,,,,4807,5720,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7401,NTF (Paris) / France II + NGF Lallemand,1326,compound,,,,,27582,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+7402,NTF (Paris) / France II + NGF IGN69,1326,compound,,,,,27582,5720,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+7403,NTF (Paris) / France III + NGF IGN69,1733,compound,,,,,27583,5720,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,1
+7404,RT90 + RH70,1225,compound,,,,,4124,5718,Large and medium scale topographic mapping and engineering survey.,When combined with geoid model RN92 forms geographic 3D coordinate system RR92.,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,1,0
+7405,OSGB36 / British National Grid + ODN,1264,compound,,,,,27700,5701,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7406,NAD27 + NGVD29,1323,compound,,,,,4267,5702,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7407,NAD27 / Texas North + NGVD29,2253,compound,,,,,32037,5702,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+7408,RD/NAP,1275,compound,,,,,4289,5709,Large and medium scale topographic mapping and engineering survey.,,http://rdnap.kadaster.nl/rd/index.html,EPSG,2000-10-19 00:00:00,,1,0
+7409,ETRS89 + EVRS2000,1298,compound,,,,,4258,5730,For pan-European products and services.,,IAG subcommission for Europe,EPSG,2000-10-19 00:00:00,,1,0
+7410,PSHD93,1183,compound,,,,,4134,5724,Oil exploration.,,Petroleum Development Oman,EPSG,2001-06-05 00:00:00,,1,0
+7411,NTF (Paris) / Lambert zone II + NGF Lallemand,1326,compound,,,,,27572,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+7412,NTF (Paris) / Lambert zone II + NGF IGN69,1326,compound,,,,,27572,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+7413,NTF (Paris) / Lambert zone III + NGF IGN69,1733,compound,,,,,27573,5719,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2001-11-06 00:00:00,,1,0
+20004,Pulkovo 1995 / Gauss-Kruger zone 4,1763,projected,4530,,4200,16204,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 21E (code 2463).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20005,Pulkovo 1995 / Gauss-Kruger zone 5,1764,projected,4530,,4200,16205,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 27E (code 2464).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20006,Pulkovo 1995 / Gauss-Kruger zone 6,1765,projected,4530,,4200,16206,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 33E (code 2465).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20007,Pulkovo 1995 / Gauss-Kruger zone 7,1766,projected,4530,,4200,16207,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 39E (code 2466).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20008,Pulkovo 1995 / Gauss-Kruger zone 8,1767,projected,4530,,4200,16208,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 45E (code 2467).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20009,Pulkovo 1995 / Gauss-Kruger zone 9,1768,projected,4530,,4200,16209,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 51E (code 2468).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20010,Pulkovo 1995 / Gauss-Kruger zone 10,1769,projected,4530,,4200,16210,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 57E (code 2469).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20011,Pulkovo 1995 / Gauss-Kruger zone 11,1770,projected,4530,,4200,16211,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 63E (code 2470).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20012,Pulkovo 1995 / Gauss-Kruger zone 12,1771,projected,4530,,4200,16212,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 69E (code 2471).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20013,Pulkovo 1995 / Gauss-Kruger zone 13,1772,projected,4530,,4200,16213,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 75E (code 2472).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20014,Pulkovo 1995 / Gauss-Kruger zone 14,1773,projected,4530,,4200,16214,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 81E (code 2473).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20015,Pulkovo 1995 / Gauss-Kruger zone 15,1774,projected,4530,,4200,16215,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 87E (code 2474).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20016,Pulkovo 1995 / Gauss-Kruger zone 16,1775,projected,4530,,4200,16216,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 93E (code 2475).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20017,Pulkovo 1995 / Gauss-Kruger zone 17,1776,projected,4530,,4200,16217,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 99E (code 2476).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20018,Pulkovo 1995 / Gauss-Kruger zone 18,1777,projected,4530,,4200,16218,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 105E (code 2477).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20019,Pulkovo 1995 / Gauss-Kruger zone 19,1778,projected,4530,,4200,16219,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 111E (code 2478).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20020,Pulkovo 1995 / Gauss-Kruger zone 20,1779,projected,4530,,4200,16220,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 117E (code 2479).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20021,Pulkovo 1995 / Gauss-Kruger zone 21,1780,projected,4530,,4200,16221,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 123E (code 2480).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20022,Pulkovo 1995 / Gauss-Kruger zone 22,1781,projected,4530,,4200,16222,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 129E (code 2481).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20023,Pulkovo 1995 / Gauss-Kruger zone 23,1782,projected,4530,,4200,16223,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 135E (code 2482).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20024,Pulkovo 1995 / Gauss-Kruger zone 24,1783,projected,4530,,4200,16224,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 141E (code 2483).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20025,Pulkovo 1995 / Gauss-Kruger zone 25,1784,projected,4530,,4200,16225,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 147E (code 2484).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20026,Pulkovo 1995 / Gauss-Kruger zone 26,1785,projected,4530,,4200,16226,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 153E (code 2485).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20027,Pulkovo 1995 / Gauss-Kruger zone 27,1786,projected,4530,,4200,16227,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 159E (code 2486).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20028,Pulkovo 1995 / Gauss-Kruger zone 28,1787,projected,4530,,4200,16228,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 165E (code 2487).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20029,Pulkovo 1995 / Gauss-Kruger zone 29,1788,projected,4530,,4200,16229,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 171E (code 2488).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20030,Pulkovo 1995 / Gauss-Kruger zone 30,1789,projected,4530,,4200,16230,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 177E (code 2489).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20031,Pulkovo 1995 / Gauss-Kruger zone 31,1790,projected,4530,,4200,16231,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 177W (code 2490).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20032,Pulkovo 1995 / Gauss-Kruger zone 32,1791,projected,4530,,4200,16232,,,Medium scale topographic mapping.,Also found with truncated false easting - see Pulkovo 1995 / Gauss-Kruger CM 171W (code 2491).,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,2002-06-22 00:00:00,2002.36,1,0
+20064,Pulkovo 1995 / Gauss-Kruger 4N,1763,projected,4530,,4200,16304,,,Truncated form of Gauss-Kruger zone 4,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20065,Pulkovo 1995 / Gauss-Kruger 5N,1764,projected,4530,,4200,16305,,,Truncated form of Gauss-Kruger zone 5,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20066,Pulkovo 1995 / Gauss-Kruger 6N,1765,projected,4530,,4200,16306,,,Truncated form of Gauss-Kruger zone 6,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20067,Pulkovo 1995 / Gauss-Kruger 7N,1766,projected,4530,,4200,16307,,,Truncated form of Gauss-Kruger zone 7,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20068,Pulkovo 1995 / Gauss-Kruger 8N,1767,projected,4530,,4200,16308,,,Truncated form of Gauss-Kruger zone 8,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20069,Pulkovo 1995 / Gauss-Kruger 9N,1768,projected,4530,,4200,16309,,,Truncated form of Gauss-Kruger zone 9,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20070,Pulkovo 1995 / Gauss-Kruger 10N,1769,projected,4530,,4200,16310,,,Truncated form of Gauss-Kruger zone 10,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20071,Pulkovo 1995 / Gauss-Kruger 11N,1770,projected,4530,,4200,16311,,,Truncated form of Gauss-Kruger zone 11,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20072,Pulkovo 1995 / Gauss-Kruger 12N,1771,projected,4530,,4200,16312,,,Truncated form of Gauss-Kruger zone 12,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20073,Pulkovo 1995 / Gauss-Kruger 13N,1772,projected,4530,,4200,16313,,,Truncated form of Gauss-Kruger zone 13,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20074,Pulkovo 1995 / Gauss-Kruger 14N,1773,projected,4530,,4200,16314,,,Truncated form of Gauss-Kruger zone 14,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20075,Pulkovo 1995 / Gauss-Kruger 15N,1774,projected,4530,,4200,16315,,,Truncated form of Gauss-Kruger zone 15,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20076,Pulkovo 1995 / Gauss-Kruger 16N,1775,projected,4530,,4200,16316,,,Truncated form of Gauss-Kruger zone 16,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20077,Pulkovo 1995 / Gauss-Kruger 17N,1776,projected,4530,,4200,16317,,,Truncated form of Gauss-Kruger zone 17,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20078,Pulkovo 1995 / Gauss-Kruger 18N,1777,projected,4530,,4200,16318,,,Truncated form of Gauss-Kruger zone 18,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20079,Pulkovo 1995 / Gauss-Kruger 19N,1778,projected,4530,,4200,16319,,,Truncated form of Gauss-Kruger zone 19,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20080,Pulkovo 1995 / Gauss-Kruger 20N,1779,projected,4530,,4200,16320,,,Truncated form of Gauss-Kruger zone 20,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20081,Pulkovo 1995 / Gauss-Kruger 21N,1780,projected,4530,,4200,16321,,,Truncated form of Gauss-Kruger zone 21,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20082,Pulkovo 1995 / Gauss-Kruger 22N,1781,projected,4530,,4200,16322,,,Truncated form of Gauss-Kruger zone 22,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20083,Pulkovo 1995 / Gauss-Kruger 23N,1782,projected,4530,,4200,16323,,,Truncated form of Gauss-Kruger zone 23,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20084,Pulkovo 1995 / Gauss-Kruger 24N,1783,projected,4530,,4200,16324,,,Truncated form of Gauss-Kruger zone 24,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20085,Pulkovo 1995 / Gauss-Kruger 25N,1784,projected,4530,,4200,16325,,,Truncated form of Gauss-Kruger zone 25,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20086,Pulkovo 1995 / Gauss-Kruger 26N,1785,projected,4530,,4200,16326,,,Truncated form of Gauss-Kruger zone 26,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20087,Pulkovo 1995 / Gauss-Kruger 27N,1786,projected,4530,,4200,16327,,,Truncated form of Gauss-Kruger zone 27,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20088,Pulkovo 1995 / Gauss-Kruger 28N,1787,projected,4530,,4200,16328,,,Truncated form of Gauss-Kruger zone 28,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20089,Pulkovo 1995 / Gauss-Kruger 29N,1788,projected,4530,,4200,16329,,,Truncated form of Gauss-Kruger zone 29,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20090,Pulkovo 1995 / Gauss-Kruger 30N,1789,projected,4530,,4200,16330,,,Truncated form of Gauss-Kruger zone 30,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20091,Pulkovo 1995 / Gauss-Kruger 31N,1790,projected,4530,,4200,16331,,,Truncated form of Gauss-Kruger zone 31,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20092,Pulkovo 1995 / Gauss-Kruger 32N,1791,projected,4530,,4200,16332,,,Truncated form of Gauss-Kruger zone 32,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,1,1
+20137,Adindan / UTM zone 37N,1552,projected,4400,,4201,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20138,Adindan / UTM zone 38N,1553,projected,4400,,4201,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20248,AGD66 / AMG zone 48,1556,projected,4400,,4202,17448,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20249,AGD66 / AMG zone 49,1557,projected,4400,,4202,17449,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20250,AGD66 / AMG zone 50,1558,projected,4400,,4202,17450,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20251,AGD66 / AMG zone 51,1559,projected,4400,,4202,17451,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20252,AGD66 / AMG zone 52,1560,projected,4400,,4202,17452,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20253,AGD66 / AMG zone 53,1561,projected,4400,,4202,17453,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20254,AGD66 / AMG zone 54,1567,projected,4400,,4202,17454,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20255,AGD66 / AMG zone 55,1568,projected,4400,,4202,17455,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20256,AGD66 / AMG zone 56,1564,projected,4400,,4202,17456,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20257,AGD66 / AMG zone 57,1565,projected,4400,,4202,17457,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20258,AGD66 / AMG zone 58,1566,projected,4400,,4202,17458,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20348,AGD84 / AMG zone 48,1556,projected,4400,,4203,17448,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20349,AGD84 / AMG zone 49,1557,projected,4400,,4203,17449,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20350,AGD84 / AMG zone 50,1558,projected,4400,,4203,17450,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20351,AGD84 / AMG zone 51,1559,projected,4400,,4203,17451,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20352,AGD84 / AMG zone 52,1560,projected,4400,,4203,17452,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20353,AGD84 / AMG zone 53,1561,projected,4400,,4203,17453,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20354,AGD84 / AMG zone 54,1562,projected,4400,,4203,17454,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20355,AGD84 / AMG zone 55,1563,projected,4400,,4203,17455,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20356,AGD84 / AMG zone 56,1564,projected,4400,,4203,17456,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20357,AGD84 / AMG zone 57,1565,projected,4400,,4203,17457,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20358,AGD84 / AMG zone 58,1566,projected,4400,,4203,17458,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20437,Ain el Abd / UTM zone 37N,1569,projected,4400,,4204,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.59,1,0
+20438,Ain el Abd / UTM zone 38N,1571,projected,4400,,4204,16038,,,"Large and medium scale topographic mapping and engineering survey. In Kuwait Oil production (but not exploration - see KOC Lambert, code 24600).","Known in Kuwait as ""KOC UTM"". Used by KOC for engineering but not explorartion (see KOC Lambert, code 24600).",,EPSG,1997-11-13 00:00:00,97.59,1,0
+20439,Ain el Abd / UTM zone 39N,1570,projected,4400,,4204,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.59,1,0
+20499,Ain el Abd / Bahrain Grid,1040,projected,4400,,4204,19900,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20538,Afgooye / UTM zone 38N,1554,projected,4400,,4205,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20539,Afgooye / UTM zone 39N,1555,projected,4400,,4205,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+20790,Lisbon (Lisbon)/Portuguese National Grid,1294,projected,4499,,4803,19936,,,Large and medium scale topographic mapping and engineering survey for military purposes.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1998-11-11 00:00:00,98.42  2000.551,1,0
+20791,Lisbon (Lisbon)/Portuguese Grid,1294,projected,4499,,4803,19969,,,Large and medium scale topographic mapping and engineering survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+20822,Aratu / UTM zone 22S,1572,projected,4400,,4208,16122,,,Oil exploration and production.,,,EPSG,1995-07-21 00:00:00,95.191,1,0
+20823,Aratu / UTM zone 23S,1573,projected,4400,,4208,16123,,,Oil exploration and production.,,,EPSG,1995-07-21 00:00:00,95.191,1,0
+20824,Aratu / UTM zone 24S,1574,projected,4400,,4208,16124,,,Oil exploration and production.,,,EPSG,1995-07-21 00:00:00,95.191,1,0
+20934,Arc 1950 / UTM zone 34S,1575,projected,4400,,4209,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+20935,Arc 1950 / UTM zone 35S,1576,projected,4400,,4209,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+20936,Arc 1950 / UTM zone 36S,1577,projected,4400,,4209,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21035,Arc 1960 / UTM zone 35S,1579,projected,4400,,4210,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21036,Arc 1960 / UTM zone 36S,1581,projected,4400,,4210,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21037,Arc 1960 / UTM zone 37S,1583,projected,4400,,4210,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21095,Arc 1960 / UTM zone 35N,1578,projected,4400,,4210,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21096,Arc 1960 / UTM zone 36N,1580,projected,4400,,4210,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21097,Arc 1960 / UTM zone 37N,1582,projected,4400,,4210,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,,1,0
+21100,Batavia (Jakarta) / NEIEZ,1285,projected,4499,,4813,19905,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21148,Batavia / UTM zone 48S,1584,projected,4400,,4211,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21149,Batavia / UTM zone 49S,1586,projected,4400,,4211,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21150,Batavia / UTM zone 50S,1585,projected,4400,,4211,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+21291,Barbados 1938 / British West Indies Grid,1042,projected,4400,,4212,19942,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by Barbados National Grid (code 21292) from 1983.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+21292,Barbados 1938 / Barbados National Grid,1042,projected,4400,,4212,19943,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes Barbados 1938 / BWI Grid (code 21291) from 1983.,Ordnance Survey of Great Britain,EPSG,1999-04-22 00:00:00,,1,0
+21413,Beijing 1954 / Gauss-Kruger zone 13,1587,projected,4530,,4214,16213,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 75E (code 24153). Superseded by Xian 1980 / Gauss-Kruger zone 13 (code 2327).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21414,Beijing 1954 / Gauss-Kruger zone 14,1588,projected,4530,,4214,16214,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 81E (code 24154). Superseded by Xian 1980 / Gauss-Kruger zone 14 (code 2328).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21415,Beijing 1954 / Gauss-Kruger zone 15,1589,projected,4530,,4214,16215,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 87E (code 24155). Superseded by Xian 1980 / Gauss-Kruger zone 15 (code 2329).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21416,Beijing 1954 / Gauss-Kruger zone 16,1590,projected,4530,,4214,16216,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 93E (code 24156). Superseded by Xian 1980 / Gauss-Kruger zone 16 (code 2330).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21417,Beijing 1954 / Gauss-Kruger zone 17,1591,projected,4530,,4214,16217,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 99E (code 24157). Superseded by Xian 1980 / Gauss-Kruger zone 17 (code 2331).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21418,Beijing 1954 / Gauss-Kruger zone 18,1592,projected,4530,,4214,16218,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 105E (code 24158). Superseded by Xian 1980 / Gauss-Kruger zone 18 (code 2332).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21419,Beijing 1954 / Gauss-Kruger zone 19,1593,projected,4530,,4214,16219,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 111E (code 24159). Superseded by Xian 1980 / Gauss-Kruger zone 19 (code 2333).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21420,Beijing 1954 / Gauss-Kruger zone 20,1594,projected,4530,,4214,16220,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 117E (code 24160). Superseded by Xian 1980 / Gauss-Kruger zone 20 (code 2334).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21421,Beijing 1954 / Gauss-Kruger zone 21,1595,projected,4530,,4214,16221,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 123E (code 24161). Superseded by Xian 1980 / Gauss-Kruger zone 21 (code 2335).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21422,Beijing 1954 / Gauss-Kruger zone 22,1596,projected,4530,,4214,16222,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 129E (code 24162). Superseded by Xian 1980 / Gauss-Kruger zone 22 (code 2336).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21423,Beijing 1954 / Gauss-Kruger zone 23,1597,projected,4530,,4214,16223,,,Medium scale topographic mapping.,Also found with truncated false easting - see Beijing 1954 / Gauss-Kruger CM 135E (code 24163). Superseded by Xian 1980 / Gauss-Kruger zone 23 (code 2337).,,EPSG,2002-06-22 00:00:00,2002.16,1,0
+21453,Beijing 1954 / Gauss-Kruger CM 75E,1587,projected,4530,,4214,16313,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 13 (code 21413). Superseded by Xian 1980 / Gauss-Kruger CM 75E (code 2338).,,EPSG,2002-06-22 00:00:00,,1,0
+21454,Beijing 1954 / Gauss-Kruger CM 81E,1588,projected,4530,,4214,16314,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 14 (code 21414). Superseded by Xian 1980 / Gauss-Kruger CM 81E (code 2339).,,EPSG,2002-06-22 00:00:00,,1,0
+21455,Beijing 1954 / Gauss-Kruger CM 87E,1589,projected,4530,,4214,16315,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 15 (code 21415). Superseded by Xian 1980 / Gauss-Kruger CM 87E (code 2340).,,EPSG,2002-06-22 00:00:00,,1,0
+21456,Beijing 1954 / Gauss-Kruger CM 93E,1590,projected,4530,,4214,16316,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 16 (code 21416). Superseded by Xian 1980 / Gauss-Kruger CM 93E (code 2341).,,EPSG,2002-06-22 00:00:00,,1,0
+21457,Beijing 1954 / Gauss-Kruger CM 99E,1591,projected,4530,,4214,16317,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 17 (code 21417). Superseded by Xian 1980 / Gauss-Kruger CM 99E (code 2342).,,EPSG,2002-06-22 00:00:00,,1,0
+21458,Beijing 1954 / Gauss-Kruger CM 105E,1592,projected,4530,,4214,16318,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 18 (code 21418). Superseded by Xian 1980 / Gauss-Kruger CM 105E (code 2343).,,EPSG,2002-06-22 00:00:00,,1,0
+21459,Beijing 1954 / Gauss-Kruger CM 111E,1593,projected,4530,,4214,16319,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 19 (code 21419). Superseded by Xian 1980 / Gauss-Kruger CM 111E (code 2344).,,EPSG,2002-06-22 00:00:00,,1,0
+21460,Beijing 1954 / Gauss-Kruger CM 117E,1594,projected,4530,,4214,16320,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 20 (code 21420). Superseded by Xian 1980 / Gauss-Kruger CM 117E (code 2345).,,EPSG,2002-06-22 00:00:00,,1,0
+21461,Beijing 1954 / Gauss-Kruger CM 123E,1595,projected,4530,,4214,16321,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 21 (code 21421). Superseded by Xian 1980 / Gauss-Kruger CM 123E (code 2346).,,EPSG,2002-06-22 00:00:00,,1,0
+21462,Beijing 1954 / Gauss-Kruger CM 129E,1596,projected,4530,,4214,16322,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 22 (code 21422). Superseded by Xian 1980 / Gauss-Kruger CM 129E (code 2347).,,EPSG,2002-06-22 00:00:00,,1,0
+21463,Beijing 1954 / Gauss-Kruger CM 135E,1597,projected,4530,,4214,16323,,,Medium scale topographic mapping.,Truncated form of Beijing 1954 / Gauss-Kruger zone 33 (code 21423). Superseded by Xian 1980 / Gauss-Kruger CM 135E (code 2348).,,EPSG,2002-06-22 00:00:00,,1,0
+21473,Beijing 1954 / Gauss-Kruger 13N,1587,projected,4530,,4214,16313,,,Truncated form of Gauss-Kruger zone 13,,,EPSG,1995-06-02 00:00:00,,1,1
+21474,Beijing 1954 / Gauss-Kruger 14N,1588,projected,4530,,4214,16314,,,Truncated form of Gauss-Kruger zone 14,,,EPSG,1995-06-02 00:00:00,,1,1
+21475,Beijing 1954 / Gauss-Kruger 15N,1589,projected,4530,,4214,16315,,,Truncated form of Gauss-Kruger zone 15,,,EPSG,1995-06-02 00:00:00,,1,1
+21476,Beijing 1954 / Gauss-Kruger 16N,1590,projected,4530,,4214,16316,,,Truncated form of Gauss-Kruger zone 16,,,EPSG,1995-06-02 00:00:00,,1,1
+21477,Beijing 1954 / Gauss-Kruger 17N,1591,projected,4530,,4214,16317,,,Truncated form of Gauss-Kruger zone 17,,,EPSG,1995-06-02 00:00:00,,1,1
+21478,Beijing 1954 / Gauss-Kruger 18N,1592,projected,4530,,4214,16318,,,Truncated form of Gauss-Kruger zone 18,,,EPSG,1995-06-02 00:00:00,,1,1
+21479,Beijing 1954 / Gauss-Kruger 19N,1593,projected,4530,,4214,16319,,,Truncated form of Gauss-Kruger zone 19,,,EPSG,1995-06-02 00:00:00,,1,1
+21480,Beijing 1954 / Gauss-Kruger 20N,1594,projected,4530,,4214,16320,,,Truncated form of Gauss-Kruger zone 20,,,EPSG,1995-06-02 00:00:00,,1,1
+21481,Beijing 1954 / Gauss-Kruger 21N,1595,projected,4530,,4214,16321,,,Truncated form of Gauss-Kruger zone 21,,,EPSG,1995-06-02 00:00:00,,1,1
+21482,Beijing 1954 / Gauss-Kruger 22N,1596,projected,4530,,4214,16322,,,Truncated form of Gauss-Kruger zone 22,,,EPSG,1995-06-02 00:00:00,,1,1
+21483,Beijing 1954 / Gauss-Kruger 23N,1597,projected,4530,,4214,16323,,,Truncated form of Gauss-Kruger zone 23,,,EPSG,1995-06-02 00:00:00,,1,1
+21500,Belge 1950 (Brussels) / Belge Lambert 50,1347,projected,4499,,4809,19901,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Belge 1972 / Belge Lambert 72 (code 31300) and Belge 1972 / Belgian Lambert 72 (code 31370).,,EPSG,1997-04-11 00:00:00,97.13,1,0
+21780,Bern 1898 (Bern) / LV03C,1286,projected,4498,,4801,19923,,,Large and medium scale topographic mapping and engineering survey.,Superseded by CH1903 / LV03 (code 21781).,,EPSG,1997-06-30 00:00:00,97.27  97.62,1,0
+21781,CH1903 / LV03,1286,projected,4498,,4149,19922,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes LV03C (code 21780).  Superseded by CH1903+/LV95 (code 2056).,,EPSG,1999-10-20 00:00:00,2001.29,1,0
+21817,Bogota 1975 / UTM zone 17N,1602,projected,4400,,4218,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,2000.20,1,0
+21818,Bogota 1975 / UTM zone 18N,1603,projected,4400,,4218,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,2000.20,1,0
+21891,Bogota 1975 / Colombia West zone,1598,projected,4499,,4218,18051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11  97.57 2000.20,1,0
+21892,Bogota 1975 / Colombia Bogota zone,1599,projected,4499,,4218,18052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11  97.57 2000.20,1,0
+21893,Bogota 1975 / Colombia East Central zone,1600,projected,4499,,4218,18053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11  97.57 2000.20,1,0
+21894,Bogota 1975 / Colombia East,1601,projected,4499,,4218,18054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,97.11  97.57 2000.20,1,0
+22032,Camacupa / UTM zone 32S,1606,projected,4400,,4220,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.58,1,0
+22033,Camacupa / UTM zone 33S,1607,projected,4400,,4220,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-11-13 00:00:00,97.58,1,0
+22091,Camacupa / TM 11.30 SE,1605,projected,4400,,4220,16611,,,Oil exploration by Esso Angola offshore blocks 15 and 24.,,Esso Angola,EPSG,1998-11-11 00:00:00,,1,0
+22092,Camacupa / TM 12 SE,1604,projected,4400,,4220,16612,,,"Oil exploration by Shell Angola for offshore blocks 1 and 16  and by BP Amoco, Elf and Esso for offshore blocks 31-33.",,Shell Angola,EPSG,1998-11-11 00:00:00,,1,0
+22191,Campo Inchauspe / Argentina 1,1608,projected,4530,,4221,18031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22192,Campo Inchauspe / Argentina 2,1609,projected,4530,,4221,18032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22193,Campo Inchauspe / Argentina 3,1610,projected,4530,,4221,18033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22194,Campo Inchauspe / Argentina 4,1611,projected,4530,,4221,18034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22195,Campo Inchauspe / Argentina 5,1612,projected,4530,,4221,18035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22196,Campo Inchauspe / Argentina 6,1613,projected,4530,,4221,18036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22197,Campo Inchauspe / Argentina 7,1614,projected,4530,,4221,18037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,97.72 2002.36,1,0
+22234,Cape / UTM zone 34S,1615,projected,4400,,4222,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-12-08 00:00:00,,1,0
+22235,Cape / UTM zone 35S,1617,projected,4400,,4222,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-12-08 00:00:00,,1,0
+22236,Cape / UTM zone 36S,1616,projected,4400,,4222,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-12-08 00:00:00,,1,0
+22275,South African Coordinate System zone 15,1454,projected,6503,,4222,17515,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22277,South African Coordinate System zone 17,1455,projected,6503,,4222,17517,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22279,South African Coordinate System zone 19,1456,projected,6503,,4222,17519,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22281,South African Coordinate System zone 21,1457,projected,6503,,4222,17521,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22283,South African Coordinate System zone 23,1458,projected,6503,,4222,17523,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22285,South African Coordinate System zone 25,1459,projected,6503,,4222,17525,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22287,South African Coordinate System zone 27,1460,projected,6503,,4222,17527,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22289,South African Coordinate System zone 29,1461,projected,6503,,4222,17529,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22291,South African Coordinate System zone 31,1462,projected,6503,,4222,17531,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22293,South African Coordinate System zone 33,1463,projected,6503,,4222,17533,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,"Directorate of Surveys and Mapping, Mowbray, South Africa.",EPSG,2000-03-07 00:00:00,99.98  2000.04,1,0
+22300,Carthage (Paris) / Tunisia Mining Grid,1618,projected,4406,,4816,19937,,,Large and medium scale topographic mapping and engineering survey.,CAUTION: Carthage datum did not exist when the 1953 decree was issued and an inference is that grid should be applied to the Voirol 1875 geogCS.  Common practice assumes that the current Tunisian geodetic datum of Carthage applies.,,EPSG,1998-11-11 00:00:00,,1,0
+22332,Carthage / UTM zone 32N,1489,projected,4400,,4223,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22391,Carthage / Nord Tunisie,1619,projected,4499,,4223,18181,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22392,Carthage / Sud Tunisie,1620,projected,4499,,4223,18182,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22523,Corrego Alegre / UTM zone 23S,1621,projected,4400,,4225,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22524,Corrego Alegre / UTM zone 24S,1622,projected,4400,,4225,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22700,Deir ez Zor / Levant Zone,1623,projected,4499,,4227,19940,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Deir ez Zor / Syria Lambert (EPSG code 22770) from 1973.,,EPSG,1999-04-22 00:00:00,,1,0
+22770,Deir ez Zor / Syria Lambert,1623,projected,4499,,4227,19948,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Deir ez Zor / Levant zone (EPSG code 22700) from 1973.,,EPSG,1999-10-20 00:00:00,,1,0
+22780,Deir ez Zor / Levant Stereographic,1623,projected,4499,,4227,19949,,,Used  prior to World War II for cadastral and large scale topographic mapping.,,,EPSG,2000-10-19 00:00:00,,1,0
+22832,Douala / UTM zone 32N,1060,projected,4400,,4228,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+22991,Egypt 1907 / Blue Belt,1642,projected,4400,,4229,18071,,,Military topographic mapping.  Oil industry usually uses Egypt 1907 / Red Belt rather than this projected CRS.,Also known as Egypt 1907 / Green Belt.,,EPSG,2002-07-16 00:00:00,2002.49,1,0
+22992,Egypt 1907 / Red Belt,1643,projected,4400,,4229,18072,,,Large and medium scale topographic mapping and engineering survey.,See also Egypt 1907 / Blue Belt for non oil industry usage in Sinai peninsula.,,EPSG,1995-06-02 00:00:00,,1,0
+22993,Egypt 1907 / Purple Belt,1644,projected,4400,,4229,18073,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+22994,Egypt 1907 / Extended Purple Belt,1645,projected,4400,,4229,18074,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23028,ED50 / UTM zone 28N,1631,projected,4400,,4230,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23029,ED50 / UTM zone 29N,1632,projected,4400,,4230,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23030,ED50 / UTM zone 30N,1633,projected,4400,,4230,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23031,ED50 / UTM zone 31N,1634,projected,4400,,4230,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23032,ED50 / UTM zone 32N,1635,projected,4400,,4230,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23033,ED50 / UTM zone 33N,1636,projected,4400,,4230,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23034,ED50 / UTM zone 34N,1637,projected,4400,,4230,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23035,ED50 / UTM zone 35N,1638,projected,4400,,4230,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23036,ED50 / UTM zone 36N,1639,projected,4400,,4230,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23037,ED50 / UTM zone 37N,1640,projected,4400,,4230,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23038,ED50 / UTM zone 38N,1641,projected,4400,,4230,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23090,ED50 / TM 0 N,1629,projected,4400,,4230,16400,,,Used by Shell UK for UKCS North Sea oil exploration and production.,,Shell UK,EPSG,1998-11-11 00:00:00,,1,0
+23095,ED50 / TM 5 NE,1630,projected,4400,,4230,16405,,,Used by NAM for Dutch Sector of the North Sea oil exploration and production.,,NAM,EPSG,1998-11-11 00:00:00,,1,0
+23239,Fahud / UTM zone 39N,1544,projected,4400,,4232,16039,,,Large and medium scale topographic mapping and engineering survey.,Since 1993 superseded by PSD93 / UTM zone 39N projCS (code 3439). Maximum differences to Fahud adjustment are 20 metres.,,EPSG,1995-06-02 00:00:00,,1,0
+23240,Fahud / UTM zone 40N,1545,projected,4400,,4232,16040,,,Large and medium scale topographic mapping and engineering survey.,Since 1993 superseded by PSD93 / UTM zone 40N projCS (code 3440). Maximum differences to Fahud adjustment are 20 metres.,,EPSG,1995-06-02 00:00:00,,1,0
+23433,Garoua / UTM zone 33N,1060,projected,4400,,4234,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,1
+23700,HD72 / EOV,1119,projected,4498,,4237,19931,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1997-07-22 00:00:00,,1,0
+23846,ID74 / UTM zone 46N,1647,projected,4400,,4238,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-08-08 00:00:00,95.193  95.20,1,0
+23847,ID74 / UTM zone 47N,1649,projected,4400,,4238,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23848,ID74 / UTM zone 48N,1651,projected,4400,,4238,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23849,ID74 / UTM zone 49N,1653,projected,4400,,4238,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23850,ID74 / UTM zone 50N,1655,projected,4400,,4238,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23851,ID74 / UTM zone 51N,1657,projected,4400,,4238,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23852,ID74 / UTM zone 52N,1659,projected,4400,,4238,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23853,ID74 / UTM zone 53N,1661,projected,4400,,4238,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23886,ID74 / UTM zone 46S,1648,projected,4400,,4238,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-08-08 00:00:00,95.193  95.20,1,0
+23887,ID74 / UTM zone 47S,1650,projected,4400,,4238,16147,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23888,ID74 / UTM zone 48S,1652,projected,4400,,4238,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23889,ID74 / UTM zone 49S,1654,projected,4400,,4238,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23890,ID74 / UTM zone 50S,1656,projected,4400,,4238,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23891,ID74 / UTM zone 51S,1658,projected,4400,,4238,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23892,ID74 / UTM zone 52S,1660,projected,4400,,4238,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23893,ID74 / UTM zone 53S,1662,projected,4400,,4238,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23894,ID74 / UTM zone 54S,1663,projected,4400,,4238,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.193,1,0
+23946,Indian 1954 / UTM zone 46N,1664,projected,4400,,4239,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1998-06-13 00:00:00,,1,0
+23947,Indian 1954 / UTM zone 47N,1665,projected,4400,,4239,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+23948,Indian 1954 / UTM zone 48N,1666,projected,4400,,4239,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24047,Indian 1975 / UTM zone 47N,1667,projected,4400,,4240,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24048,Indian 1975 / UTM zone 48N,1666,projected,4400,,4240,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24100,Jamaica 1875 / Jamaica (Old Grid),1128,projected,4403,,4241,19909,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by 24200 (JAD69 / Jamaica National Grid).,,EPSG,1995-06-02 00:00:00,,1,0
+24200,JAD69 / Jamaica National Grid,1128,projected,4400,,4242,19910,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Supersedes 24100 (JAD69 / Jamaica National Grid).,,EPSG,1995-06-02 00:00:00,,1,0
+24305,Kalianpur 1937 / UTM zone 45N,1674,projected,4400,,4144,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24306,Kalianpur 1937 / UTM zone 46N,1675,projected,4400,,4144,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24311,Kalianpur 1962 / UTM zone 41N,1687,projected,4400,,4145,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24312,Kalianpur 1962 / UTM zone 42N,1688,projected,4400,,4145,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24313,Kalianpur 1962 / UTM zone 43N,1689,projected,4400,,4145,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24342,Kalianpur 1975 / UTM zone 42N,1679,projected,4400,,4146,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24343,Kalianpur 1975 / UTM zone 43N,1680,projected,4400,,4146,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24344,Kalianpur 1975 / UTM zone 44N,1681,projected,4400,,4146,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24345,Kalianpur 1975 / UTM zone 45N,1682,projected,4400,,4146,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24346,Kalianpur 1975 / UTM zone 46N,1683,projected,4400,,4146,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24347,Kalianpur 1975 / UTM zone 47N,1684,projected,4400,,4146,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,,1,0
+24370,Kalianpur 1880 / India zone 0,1668,projected,4408,,4243,18110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24371,Kalianpur 1880 / India zone I,1669,projected,4408,,4243,18111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24372,Kalianpur 1880 / India zone IIa,1670,projected,4408,,4243,18112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24373,Kalianpur 1880 / India zone III,1672,projected,4408,,4243,18114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24374,Kalianpur 1880 / India zone IV,1673,projected,4408,,4243,18116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24375,Kalianpur 1937 / India zone IIb,1041,projected,4400,,4144,18238,,,Large and medium scale topographic mapping and engineering survey.,Used by Bangladesh since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and Benoit's 1895 British inch-metre ratio of 39.370115 rounded as Ind ft = 0.30479841m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24376,Kalianpur 1962 / India zone I,1685,projected,4400,,4145,18236,,,Large and medium scale topographic mapping and engineering survey.,Used by Pakistan since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24377,Kalianpur 1962 / India zone IIa,1686,projected,4400,,4145,18237,,,Large and medium scale topographic mapping and engineering survey.,Used by Pakistan since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24378,Kalianpur 1975 / India zone I,1676,projected,4400,,4146,18231,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24379,Kalianpur 1975 / India zone IIa,1677,projected,4400,,4146,18232,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24380,Kalianpur 1975 / India zone IIb,1678,projected,4400,,4146,18235,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24381,Kalianpur 1975 / India zone III,1672,projected,4400,,4146,18233,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24382,Kalianpur 1880 / India zone IIb,1671,projected,4408,,4243,18113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24383,Kalianpur 1975 / India zone IV,1673,projected,4400,,4146,18234,,,Large and medium scale topographic mapping and engineering survey.,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,,EPSG,1999-10-20 00:00:00,97.23,1,0
+24500,Kertau / Singapore Grid,1210,projected,4400,,4245,19920,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24547,Kertau / UTM zone 47N,1691,projected,4400,,4245,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24548,Kertau / UTM zone 48N,1692,projected,4400,,4245,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-07-21 00:00:00,95.192,1,0
+24571,Kertau / R.S.O. Malaya (ch),1690,projected,4401,,4245,19935,,,Large and medium scale topographic mapping and engineering survey.,Adopts metric conversion of 39.370113 inches per metre.,,EPSG,1999-10-20 00:00:00,97.231,1,0
+24600,KOC Lambert,1136,projected,4400,,4246,19906,,,"Oil industry exploration (but not production - see Ain el Abd / UTM zone 38N, code 20438).","Used by KOC for exploration but not engineering (see Ain el Abd / UTM zone 38N, code 24600).",,EPSG,1996-04-12 00:00:00,,1,0
+24718,La Canoa / UTM zone 18N,1693,projected,4400,,4247,16018,,,Large and medium scale topographic mapping and engineering survey.,Sometimes referred to as PSAD56 / UTM zone 18N.,,EPSG,1999-10-20 00:00:00,,1,0
+24719,La Canoa / UTM zone 19N,1694,projected,4400,,4247,16019,,,Large and medium scale topographic mapping and engineering survey.,Sometimes referred to as PSAD56 / UTM zone 19N.,,EPSG,1999-10-20 00:00:00,,1,0
+24720,La Canoa / UTM zone 20N,1695,projected,4400,,4247,16020,,,Large and medium scale topographic mapping and engineering survey.,Sometimes referred to as PSAD56 / UTM zone 20N.,,EPSG,1995-06-02 00:00:00,,1,0
+24818,PSAD56 / UTM zone 18N,1756,projected,4400,,4248,16018,,,Large and medium scale topographic mapping and engineering survey.,In Venezuela also known as La Canoa / UTM zone 18N.,,EPSG,1995-06-02 00:00:00,,1,0
+24819,PSAD56 / UTM zone 19N,1758,projected,4400,,4248,16019,,,Large and medium scale topographic mapping and engineering survey.,In Venezuela also known as La Canoa / UTM zone 19N.,,EPSG,1995-06-02 00:00:00,,1,0
+24820,PSAD56 / UTM zone 20N,1760,projected,4400,,4248,16020,,,Large and medium scale topographic mapping and engineering survey.,In Venezuela also known as La Canoa / UTM zone 20N.,,EPSG,1995-06-02 00:00:00,,1,0
+24821,PSAD56 / UTM zone 21N,1762,projected,4400,,4248,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24877,PSAD56 / UTM zone 17S,1755,projected,4400,,4248,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24878,PSAD56 / UTM zone 18S,1757,projected,4400,,4248,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24879,PSAD56 / UTM zone 19S,1759,projected,4400,,4248,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24880,PSAD56 / UTM zone 20S,1761,projected,4400,,4248,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24882,PSAD56 / UTM zone 22S,1754,projected,4400,,4248,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+24891,PSAD56 / Peru west zone,1753,projected,4499,,4248,18161,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24892,PSAD56 / Peru central zone,1752,projected,4499,,4248,18162,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+24893,PSAD56 / Peru east zone,1751,projected,4499,,4248,18163,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25000,Leigon / Ghana Metre Grid,1104,projected,4400,,4250,19904,,,Large and medium scale topographic mapping and engineering survey.,Superseded Accra / Ghana National Grid (code 2136) in 1978.,,EPSG,1995-06-02 00:00:00,,1,0
+25231,Lome / UTM zone 31N,1232,projected,4400,,4252,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25391,Luzon 1911 / Philippines zone I,1698,projected,4499,,4253,18171,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25392,Luzon 1911 / Philippines zone II,1699,projected,4499,,4253,18172,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25393,Luzon 1911 / Philippines zone III,1700,projected,4499,,4253,18173,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25394,Luzon 1911 / Philippines zone IV,1701,projected,4499,,4253,18174,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25395,Luzon 1911 / Philippines zone V,1702,projected,4499,,4253,18175,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25700,Makassar (Jakarta) / NEIEZ,1316,projected,4499,,4804,19905,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+25828,ETRS89 / UTM zone 28N,2122,projected,4400,,4258,16028,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25829,ETRS89 / UTM zone 29N,2123,projected,4400,,4258,16029,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25830,ETRS89 / UTM zone 30N,2124,projected,4400,,4258,16030,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25831,ETRS89 / UTM zone 31N,2125,projected,4400,,4258,16031,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25832,ETRS89 / UTM zone 32N,2126,projected,4400,,4258,16032,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25833,ETRS89 / UTM zone 33N,2127,projected,4400,,4258,16033,,,Large and medium scale topographic mapping and engineering survey.,Used for all state of Brandenburg including those areas west of 12 deg E.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25834,ETRS89 / UTM zone 34N,2128,projected,4400,,4258,16034,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25835,ETRS89 / UTM zone 35N,2129,projected,4400,,4258,16035,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25836,ETRS89 / UTM zone 36N,2130,projected,4400,,4258,16036,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25837,ETRS89 / UTM zone 37N,2131,projected,4400,,4258,16037,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25838,ETRS89 / UTM zone 38N,2132,projected,4400,,4258,16038,,,Large and medium scale topographic mapping and engineering survey.,The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used as synonyms.,,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25884,ETRS89 / TM Baltic93,1646,projected,4530,,4258,19939,,,Large and medium scale topographic mapping and engineering survey.,Used as a common coordinate system for the Baltic states and for medium and small scale mapping in Estonia since 1993.,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,2000-10-19 00:00:00,99.11 2000.72,1,0
+25932,Malongo 1987 / UTM zone 32S,1317,projected,4400,,4259,16132,,,Oil exploration,,,EPSG,1995-06-02 00:00:00,,1,0
+26191,Merchich / Nord Maroc,1703,projected,4499,,4261,18131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26192,Merchich / Sud Maroc,1704,projected,4499,,4261,18132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26193,Merchich / Sahara,1705,projected,4499,,4261,18133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26237,Massawa / UTM zone 37N,1089,projected,4400,,4262,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26331,Minna / UTM zone 31N,1716,projected,4400,,4263,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26332,Minna / UTM zone 32N,1717,projected,4400,,4263,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26391,Minna / Nigeria West Belt,1715,projected,4400,,4263,18151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26392,Minna / Nigeria Mid Belt,1714,projected,4400,,4263,18152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26393,Minna / Nigeria East Belt,1713,projected,4400,,4263,18153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26432,Mhast / UTM zone 32S,1318,projected,4400,,4264,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26591,Monte Mario (Rome) / Italy zone 1,1718,projected,4499,,4806,18121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26592,Monte Mario (Rome) / Italy zone 2,1719,projected,4499,,4806,18122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26632,M'poraloko / UTM zone 32N,1696,projected,4400,,4266,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26692,M'poraloko / UTM zone 32S,1697,projected,4400,,4266,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26703,NAD27 / UTM zone 3N,2133,projected,4400,,4267,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26704,NAD27 / UTM zone 4N,2134,projected,4400,,4267,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26705,NAD27 / UTM zone 5N,2135,projected,4400,,4267,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26706,NAD27 / UTM zone 6N,2136,projected,4400,,4267,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26707,NAD27 / UTM zone 7N,2137,projected,4400,,4267,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26708,NAD27 / UTM zone 8N,2138,projected,4400,,4267,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26709,NAD27 / UTM zone 9N,2139,projected,4400,,4267,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26710,NAD27 / UTM zone 10N,2140,projected,4400,,4267,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26711,NAD27 / UTM zone 11N,2141,projected,4400,,4267,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26712,NAD27 / UTM zone 12N,2142,projected,4400,,4267,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26713,NAD27 / UTM zone 13N,2143,projected,4400,,4267,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26714,NAD27 / UTM zone 14N,2144,projected,4400,,4267,16014,,,Large and medium scale topographic mapping and engineering survey.,See NAD27 / BLM 14N (feet) (code 32064) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26715,NAD27 / UTM zone 15N,2145,projected,4400,,4267,16015,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 15N (code 2027). See NAD27 / BLM 15N (feet) (code 32065) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26716,NAD27 / UTM zone 16N,2146,projected,4400,,4267,16016,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 16N (code 2028). See NAD27 / BLM 16N (feet) (code 32066) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26717,NAD27 / UTM zone 17N,2147,projected,4400,,4267,16017,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 17N (code 2029).  In Quebec superseded by NAD27(CGQ77) / UTM zone 17N (code 2031). See NAD27 / BLM 17N (feet) (code 32067) for non-metric equivalent used in US Gulf of Mexico.,,EPSG,1995-06-02 00:00:00,,1,0
+26718,NAD27 / UTM zone 18N,2148,projected,4400,,4267,16018,,,Large and medium scale topographic mapping and engineering survey.,In Ontario superseded by NAD27(76) / UTM zone 18N (code 2030).  In Quebec superseded by NAD27(CGQ77) / UTM zone 18N (code 2032).,,EPSG,1995-06-02 00:00:00,,1,0
+26719,NAD27 / UTM zone 19N,2149,projected,4400,,4267,16019,,,Large and medium scale topographic mapping and engineering survey.,In Quebec superseded by NAD27(CGQ77) / UTM zone 19N (code 2033).,,EPSG,1995-06-02 00:00:00,,1,0
+26720,NAD27 / UTM zone 20N,2150,projected,4400,,4267,16020,,,Large and medium scale topographic mapping and engineering survey.,In Quebec superseded by NAD27(CGQ77) / UTM zone 20N (code 2034).,,EPSG,1995-06-02 00:00:00,,1,0
+26721,NAD27 / UTM zone 21N,2151,projected,4400,,4267,16021,,,Large and medium scale topographic mapping and engineering survey.,In Quebec superseded by NAD27(CGQ77) / UTM zone 21N (code 2035).,,EPSG,1995-06-02 00:00:00,,1,0
+26722,NAD27 / UTM zone 22N,2152,projected,4400,,4267,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26729,NAD27 / Alabama East,2154,projected,4497,,4267,10101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26730,NAD27 / Alabama West,2155,projected,4497,,4267,10102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26731,NAD27 / Alaska zone 1,2156,projected,4497,,4267,15001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26732,NAD27 / Alaska zone 2,2158,projected,4497,,4267,15002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26733,NAD27 / Alaska zone 3,2159,projected,4497,,4267,15003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26734,NAD27 / Alaska zone 4,2160,projected,4497,,4267,15004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26735,NAD27 / Alaska zone 5,2161,projected,4497,,4267,15005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26736,NAD27 / Alaska zone 6,2162,projected,4497,,4267,15006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26737,NAD27 / Alaska zone 7,2163,projected,4497,,4267,15007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26738,NAD27 / Alaska zone 8,2164,projected,4497,,4267,15008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26739,NAD27 / Alaska zone 9,2165,projected,4497,,4267,15009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26740,NAD27 / Alaska zone 10,2157,projected,4497,,4267,15010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26741,NAD27 / California zone I,2175,projected,4497,,4267,10401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26742,NAD27 / California zone II,2176,projected,4497,,4267,10402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26743,NAD27 / California zone III,2177,projected,4497,,4267,10403,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26744,NAD27 / California zone IV,2178,projected,4497,,4267,10404,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26745,NAD27 / California zone V,2179,projected,4497,,4267,10405,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26746,NAD27 / California zone VI,2180,projected,4497,,4267,10406,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26747,NAD27 / California zone VII,2181,projected,4497,,4267,10407,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26748,NAD27 / Arizona East,2167,projected,4497,,4267,10201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,95.25  2000.091,1,0
+26749,NAD27 / Arizona Central,2166,projected,4497,,4267,10202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-08-22 00:00:00,95.25,1,0
+26750,NAD27 / Arizona West,2168,projected,4497,,4267,10203,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,95.25  2000.091,1,0
+26751,NAD27 / Arkansas North,2169,projected,4497,,4267,10301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26752,NAD27 / Arkansas South,2170,projected,4497,,4267,10302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26753,NAD27 / Colorado North,2184,projected,4497,,4267,10501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26754,NAD27 / Colorado Central,2183,projected,4497,,4267,10502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26755,NAD27 / Colorado South,2185,projected,4497,,4267,10503,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26756,NAD27 / Connecticut,1377,projected,4497,,4267,10600,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26757,NAD27 / Delaware,1378,projected,4497,,4267,10700,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26758,NAD27 / Florida East,2186,projected,4497,,4267,10901,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26759,NAD27 / Florida West,2188,projected,4497,,4267,10902,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26760,NAD27 / Florida North,2187,projected,4497,,4267,10903,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26766,NAD27 / Georgia East,2189,projected,4497,,4267,11001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26767,NAD27 / Georgia West,2190,projected,4497,,4267,11002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26768,NAD27 / Idaho East,2192,projected,4497,,4267,11101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26769,NAD27 / Idaho Central,2191,projected,4497,,4267,11102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26770,NAD27 / Idaho West,2193,projected,4497,,4267,11103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26771,NAD27 / Illinois East,2194,projected,4497,,4267,11201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26772,NAD27 / Illinois West,2195,projected,4497,,4267,11202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26773,NAD27 / Indiana East,2196,projected,4497,,4267,11301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26774,NAD27 / Indiana West,2197,projected,4497,,4267,11302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26775,NAD27 / Iowa North,2198,projected,4497,,4267,11401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26776,NAD27 / Iowa South,2199,projected,4497,,4267,11402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26777,NAD27 / Kansas North,2200,projected,4497,,4267,11501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26778,NAD27 / Kansas South,2201,projected,4497,,4267,11502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26779,NAD27 / Kentucky North,2202,projected,4497,,4267,11601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26780,NAD27 / Kentucky South,2203,projected,4497,,4267,11602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26781,NAD27 / Louisiana North,2204,projected,4497,,4267,11701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26782,NAD27 / Louisiana South,2205,projected,4497,,4267,11702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26783,NAD27 / Maine East,2206,projected,4497,,4267,11801,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26784,NAD27 / Maine West,2207,projected,4497,,4267,11802,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26785,NAD27 / Maryland,1389,projected,4497,,4267,11900,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26786,NAD27 / Massachusetts Mainland,2209,projected,4497,,4267,12001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26787,NAD27 / Massachusetts Island,2208,projected,4497,,4267,12002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26791,NAD27 / Minnesota North,2214,projected,4497,,4267,12201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26792,NAD27 / Minnesota Central,2213,projected,4497,,4267,12202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26793,NAD27 / Minnesota South,2215,projected,4497,,4267,12203,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26794,NAD27 / Mississippi East,2216,projected,4497,,4267,12301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26795,NAD27 / Mississippi West,2217,projected,4497,,4267,12302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26796,NAD27 / Missouri East,2219,projected,4497,,4267,12401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26797,NAD27 / Missouri Central,2218,projected,4497,,4267,12402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26798,NAD27 / Missouri West,2220,projected,4497,,4267,12403,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26801,NAD Michigan / Michigan East,1720,projected,4497,,4268,12101,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 26811 26812 and 26813.,,EPSG,1998-11-11 00:00:00,95.25  97.19  98.22  2000.091,1,0
+26802,NAD Michigan / Michigan Old Central,1721,projected,4497,,4268,12102,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 26811 26812 and 26813.,,EPSG,1998-11-11 00:00:00,95.25  97.19  98.22,1,0
+26803,NAD Michigan / Michigan West,1722,projected,4497,,4268,12103,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 26811 26812 and 26813.,,EPSG,1998-11-11 00:00:00,95.25  97.19  98.22  2000.091,1,0
+26811,NAD Michigan / Michigan North,1723,projected,4497,,4268,12111,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 26801 26802 and 26803.,,EPSG,1998-11-11 00:00:00,96.28  98.22,1,0
+26812,NAD Michigan / Michigan Central,1724,projected,4497,,4268,12112,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 26801 26802 and 26803.,,EPSG,1998-11-11 00:00:00,96.28  97.19  98.22,1,0
+26813,NAD Michigan / Michigan South,1725,projected,4497,,4268,12113,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 26801 26802 and 26803.,,EPSG,1998-11-11 00:00:00,96.28  97.19  98.22,1,0
+26903,NAD83 / UTM zone 3N,2133,projected,4400,,4269,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26904,NAD83 / UTM zone 4N,2134,projected,4400,,4269,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26905,NAD83 / UTM zone 5N,2135,projected,4400,,4269,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26906,NAD83 / UTM zone 6N,2136,projected,4400,,4269,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26907,NAD83 / UTM zone 7N,2137,projected,4400,,4269,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26908,NAD83 / UTM zone 8N,2138,projected,4400,,4269,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26909,NAD83 / UTM zone 9N,2139,projected,4400,,4269,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26910,NAD83 / UTM zone 10N,2140,projected,4400,,4269,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26911,NAD83 / UTM zone 11N,2141,projected,4400,,4269,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26912,NAD83 / UTM zone 12N,2142,projected,4400,,4269,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26913,NAD83 / UTM zone 13N,2143,projected,4400,,4269,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26914,NAD83 / UTM zone 14N,2144,projected,4400,,4269,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26915,NAD83 / UTM zone 15N,2145,projected,4400,,4269,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26916,NAD83 / UTM zone 16N,2146,projected,4400,,4269,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26917,NAD83 / UTM zone 17N,2147,projected,4400,,4269,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26918,NAD83 / UTM zone 18N,2148,projected,4400,,4269,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26919,NAD83 / UTM zone 19N,2149,projected,4400,,4269,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26920,NAD83 / UTM zone 20N,2150,projected,4400,,4269,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26921,NAD83 / UTM zone 21N,2151,projected,4400,,4269,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26922,NAD83 / UTM zone 22N,2152,projected,4400,,4269,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26923,NAD83 / UTM zone 23N,2153,projected,4400,,4269,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26929,NAD83 / Alabama East,2154,projected,4499,,4269,10131,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26930,NAD83 / Alabama West,2155,projected,4499,,4269,10132,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26931,NAD83 / Alaska zone 1,2156,projected,4499,,4269,15031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26932,NAD83 / Alaska zone 2,2158,projected,4499,,4269,15032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26933,NAD83 / Alaska zone 3,2159,projected,4499,,4269,15033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26934,NAD83 / Alaska zone 4,2160,projected,4499,,4269,15034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26935,NAD83 / Alaska zone 5,2161,projected,4499,,4269,15035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26936,NAD83 / Alaska zone 6,2162,projected,4499,,4269,15036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26937,NAD83 / Alaska zone 7,2163,projected,4499,,4269,15037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26938,NAD83 / Alaska zone 8,2164,projected,4499,,4269,15038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26939,NAD83 / Alaska zone 9,2165,projected,4499,,4269,15039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26940,NAD83 / Alaska zone 10,2157,projected,4499,,4269,15040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+26941,NAD83 / California zone 1,2175,projected,4499,,4269,10431,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2225 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26942,NAD83 / California zone 2,2176,projected,4499,,4269,10432,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2226 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26943,NAD83 / California zone 3,2177,projected,4499,,4269,10433,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2227 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26944,NAD83 / California zone 4,2178,projected,4499,,4269,10434,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2228 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26945,NAD83 / California zone 5,2182,projected,4499,,4269,10435,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2229 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26946,NAD83 / California zone 6,2180,projected,4499,,4269,10436,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2230 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26948,NAD83 / Arizona East,2167,projected,4499,,4269,10231,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2222 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26949,NAD83 / Arizona Central,2166,projected,4499,,4269,10232,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2223 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26950,NAD83 / Arizona West,2168,projected,4499,,4269,10233,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2224 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26951,NAD83 / Arkansas North,2169,projected,4499,,4269,10331,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26952,NAD83 / Arkansas South,2170,projected,4499,,4269,10332,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26953,NAD83 / Colorado North,2184,projected,4499,,4269,10531,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2231 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26954,NAD83 / Colorado Central,2183,projected,4499,,4269,10532,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2232 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26955,NAD83 / Colorado South,2185,projected,4499,,4269,10533,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2233 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26956,NAD83 / Connecticut,1377,projected,4499,,4269,10630,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2234 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26957,NAD83 / Delaware,1378,projected,4499,,4269,10730,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2235 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26958,NAD83 / Florida East,2186,projected,4499,,4269,10931,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2236 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26959,NAD83 / Florida West,2188,projected,4499,,4269,10932,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2237 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26960,NAD83 / Florida North,2187,projected,4499,,4269,10933,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2238 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26961,NAD83 / Hawaii zone 1,1546,projected,4499,,4269,15131,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26962,NAD83 / Hawaii zone 2,1547,projected,4499,,4269,15132,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26963,NAD83 / Hawaii zone 3,1548,projected,4499,,4269,15133,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26964,NAD83 / Hawaii zone 4,1549,projected,4499,,4269,15134,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26965,NAD83 / Hawaii zone 5,1550,projected,4499,,4269,15135,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26966,NAD83 / Georgia East,2189,projected,4499,,4269,11031,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2239 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26967,NAD83 / Georgia West,2190,projected,4499,,4269,11032,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2240 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26968,NAD83 / Idaho East,2192,projected,4499,,4269,11131,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2241 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26969,NAD83 / Idaho Central,2191,projected,4499,,4269,11132,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2242 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26970,NAD83 / Idaho West,2193,projected,4499,,4269,11133,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2243 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26971,NAD83 / Illinois East,2194,projected,4499,,4269,11231,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26972,NAD83 / Illinois West,2195,projected,4499,,4269,11232,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26973,NAD83 / Indiana East,2196,projected,4499,,4269,11331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2244 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26974,NAD83 / Indiana West,2197,projected,4499,,4269,11332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2245 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26975,NAD83 / Iowa North,2198,projected,4499,,4269,11431,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26976,NAD83 / Iowa South,2199,projected,4499,,4269,11432,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26977,NAD83 / Kansas North,2200,projected,4499,,4269,11531,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26978,NAD83 / Kansas South,2201,projected,4499,,4269,11532,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26979,NAD83 / Kentucky North,2202,projected,4499,,4269,11631,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,1
+26980,NAD83 / Kentucky South,2203,projected,4499,,4269,11632,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2247 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26981,NAD83 / Louisiana North,2204,projected,4499,,4269,11731,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26982,NAD83 / Louisiana South,2529,projected,4499,,4269,11732,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26983,NAD83 / Maine East,2206,projected,4499,,4269,11831,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26984,NAD83 / Maine West,2207,projected,4499,,4269,11832,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26985,NAD83 / Maryland,1389,projected,4499,,4269,11930,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2248 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26986,NAD83 / Massachusetts Mainland,2209,projected,4499,,4269,12031,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2249 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26987,NAD83 / Massachusetts Island,2208,projected,4499,,4269,12032,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2250 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26988,NAD83 / Michigan North,1723,projected,4499,,4269,12141,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2251 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26989,NAD83 / Michigan Central,1724,projected,4499,,4269,12142,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2252 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26990,NAD83 / Michigan South,1725,projected,4499,,4269,12143,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2253 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26991,NAD83 / Minnesota North,2214,projected,4499,,4269,12231,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26992,NAD83 / Minnesota Central,2213,projected,4499,,4269,12232,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26993,NAD83 / Minnesota South,2215,projected,4499,,4269,12233,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26994,NAD83 / Mississippi East,2216,projected,4499,,4269,12331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2254 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26995,NAD83 / Mississippi West,2217,projected,4499,,4269,12332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2255 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26996,NAD83 / Missouri East,2219,projected,4499,,4269,12431,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+26997,NAD83 / Missouri Central,2218,projected,4499,,4269,12432,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+26998,NAD83 / Missouri West,2220,projected,4499,,4269,12433,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+27038,Nahrwan 1967 / UTM zone 38N,1739,projected,4400,,4270,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+27039,Nahrwan 1967 / UTM zone 39N,1749,projected,4400,,4270,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,96.12,1,0
+27040,Nahrwan 1967 / UTM zone 40N,1750,projected,4400,,4270,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+27120,Naparima 1972 / UTM zone 20N,1322,projected,4400,,4271,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.351,1,0
+27200,NZGD49 / New Zealand Map Grid,1175,projected,4400,,4272,19917,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 27291 (NZGD49 / North Island Grid) and 27292 (NZGD49 / South Island Grid) from 1972.,,EPSG,2000-10-19 00:00:00,2000.702,1,0
+27205,NZGD49 / Mount Eden Circuit,1501,projected,4500,,4272,17901,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Mount Eden Circuit 2000 (code 2105) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27206,NZGD49 / Bay of Plenty Circuit,1500,projected,4500,,4272,17902,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Bay of Plenty Circuit 2000 (code 2106) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27207,NZGD49 / Poverty Bay Circuit,1500,projected,4500,,4272,17903,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Poverty Bay Circuit 2000 (code 2107) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27208,NZGD49 / Hawkes Bay Circuit,1500,projected,4500,,4272,17904,,,Cadastral survey.,Superseded Hawkes Bay 1931 datum with Imperial measure version of projection in 1972.  Superseded by NZGD2000 / Hawkes Bay Circuit 2000 (code 2108) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27209,NZGD49 / Taranaki Circuit,1500,projected,4500,,4272,17905,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Taranaki Circuit 2000 (code 2109) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27210,NZGD49 / Tuhirangi Circuit,1500,projected,4500,,4272,17906,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Tuhirangi Circuit 2000 (code 2110) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27211,NZGD49 / Wanganui Circuit,1500,projected,4500,,4272,17907,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Wanganui Circuit 2000 (code 2111) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27212,NZGD49 / Wairarapa Circuit,1500,projected,4500,,4272,17908,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Wairarapa Circuit 2000 (code 2112) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27213,NZGD49 / Wellington Circuit,1500,projected,4500,,4272,17909,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Wellington Circuit 2000 (code 2113) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27214,NZGD49 / Collingwood Circuit,1501,projected,4500,,4272,17910,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Collingwood Circuit 2000 (code 2114) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27215,NZGD49 / Nelson Circuit,1501,projected,4500,,4272,17911,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Nelson Circuit 2000 (code 2115) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27216,NZGD49 / Karamea Circuit,1501,projected,4500,,4272,17912,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Karamea Circuit 2000 (code 2116) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27217,NZGD49 / Buller Circuit,1501,projected,4500,,4272,17913,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Buller Circuit 2000 (code 2117) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27218,NZGD49 / Grey Circuit,1501,projected,4500,,4272,17914,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Grey Circuit 2000 (code 2118) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27219,NZGD49 / Amuri Circuit,1501,projected,4500,,4272,17915,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Amuri Circuit 2000 (code 2119) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27220,NZGD49 / Marlborough Circuit,1501,projected,4500,,4272,17916,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Marlborough Circuit 2000 (code 2120) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27221,NZGD49 / Hokitika Circuit,1501,projected,4500,,4272,17917,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Hokitika Circuit 2000 (code 2121) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27222,NZGD49 / Okarito Circuit,1501,projected,4500,,4272,17918,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Okarito Circuit 2000 (code 2122) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27223,NZGD49 / Jacksons Bay Circuit,1501,projected,4500,,4272,17919,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Jacksons Bay Circuit 2000 (code 2123) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27224,NZGD49 / Mount Pleasant Circuit,1501,projected,4500,,4272,17920,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Mount Pleasant Circuit 2000 (code 2124) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27225,NZGD49 / Gawler Circuit,1501,projected,4500,,4272,17921,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Gawler Circuit 2000 (code 2125) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27226,NZGD49 / Timaru Circuit,1501,projected,4500,,4272,17922,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Timaru Circuit 2000 (code 2126) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27227,NZGD49 / Lindis Peak Circuit,1501,projected,4500,,4272,17923,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Lindis Peak Circuit 2000 (code 2127) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27228,NZGD49 / Mount Nicholas Circuit,1501,projected,4500,,4272,17924,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Mount Nicholas Circuit 2000 (code 2128) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27229,NZGD49 / Mount York Circuit,1501,projected,4500,,4272,17925,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Mount York Circuit 2000 (code 2129) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27230,NZGD49 / Observation Point Circuit,1501,projected,4500,,4272,17926,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Observation Point Circuit 2000 (code 2130) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27231,NZGD49 / North Taieri Circuit,1501,projected,4500,,4272,17927,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / North Taieri Circuit 2000 (code 2131) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27232,NZGD49 / Bluff Circuit,1501,projected,4500,,4272,17928,,,Cadastral survey.,Superseded Imperial measure version in 1972.  Superseded by NZGD2000 / Bluff Circuit 2000 (code 2132) from March 2000.,Land Information New Zealand OSG Technical Report 8; 16 April 1999.,EPSG,2000-10-19 00:00:00,,1,0
+27258,NZGD49 / UTM zone 58S,1502,projected,4400,,4272,16158,,,Oil exploration.,Superseded by NZGD2000 / UTM zone 58S (code 2133) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+27259,NZGD49 / UTM zone 59S,1503,projected,4400,,4272,16159,,,Oil exploration.,Superseded by NZGD2000 / UTM zone 59S (code 2134) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+27260,NZGD49 / UTM zone 60S,1504,projected,4400,,4272,16160,,,Oil exploration.,Superseded by NZGD2000 / UTM zone 60S (code 2135) from March 2000.,,EPSG,2000-10-19 00:00:00,,1,0
+27291,NZGD49 / North Island Grid,1500,projected,4409,,4272,18141,,,Large and medium scale topographic mapping and engineering survey.,Sears 1922 British foot-metre conversion factor applied to ellipsoid.  Superseded by 27200 (GD49 / New Zealand Map Grid) in 1972.,,EPSG,2000-10-19 00:00:00,97.231 2000.702,1,0
+27292,NZGD49 / South Island Grid,1501,projected,4409,,4272,18142,,,Large and medium scale topographic mapping and engineering survey.,Sears 1922 British foot-metre conversion factor applied to ellipsoid.  Superseded by 27200 (GD49 / New Zealand Map Grid) in 1972.,,EPSG,2000-10-19 00:00:00,97.231 2000.702,1,0
+27391,NGO 1948 (Oslo) / NGO zone I,1741,projected,4531,,4817,18221,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N.,,EPSG,1999-10-20 00:00:00,,1,0
+27392,NGO 1948 (Oslo) / NGO zone II,1742,projected,4531,,4817,18222,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N.,,EPSG,1999-10-20 00:00:00,,1,0
+27393,NGO 1948 (Oslo) / NGO zone III,1743,projected,4531,,4817,18223,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N.,,EPSG,1999-10-20 00:00:00,,1,0
+27394,NGO 1948 (Oslo) / NGO zone IV,1744,projected,4531,,4817,18224,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 32N and ETRF89 / UTM zone 33N.,,EPSG,1999-10-20 00:00:00,,1,0
+27395,NGO 1948 (Oslo) / NGO zone V,1745,projected,4531,,4817,18225,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 33N and ETRF89 / UTM zone 34N.,,EPSG,1999-10-20 00:00:00,,1,0
+27396,NGO 1948 (Oslo) / NGO zone VI,1746,projected,4531,,4817,18226,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 34N.,,EPSG,1999-10-20 00:00:00,,1,0
+27397,NGO 1948 (Oslo) / NGO zone VII,1747,projected,4531,,4817,18227,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 34N and ETRF89 / UTM zone 35N.,,EPSG,1999-10-20 00:00:00,,1,0
+27398,NGO 1948 (Oslo) / NGO zone VIII,1748,projected,4531,,4817,18228,,,Large (>1:50000) scale mapping and cadastral work.,To be phased out and replaced by ETRF89 / UTM zone 35N.,,EPSG,1999-10-20 00:00:00,,1,0
+27429,Datum 73 / UTM zone 29N,1294,projected,4400,,4274,16029,,,Large and medium scale topographic mapping and engineering survey.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,,1,0
+27492,Datum 73 / Modified Portuguese Grid,1294,projected,4530,,4274,19974,,,Large and medium scale topographic mapping and engineering survey.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+27500,ATF (Paris) / Nord de Guerre,1369,projected,4499,,4901,19903,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+27561,NTF (Paris) / Lambert Nord France,1731,projected,4499,,4807,18091,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone I (code 27571) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27562,NTF (Paris) / Lambert Centre France,1732,projected,4499,,4807,18092,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone II (code 27572) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27563,NTF (Paris) / Lambert Sud France,1733,projected,4499,,4807,18093,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone III (code 27573) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27564,NTF (Paris) / Lambert Corse,1327,projected,4499,,4807,18094,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF (Paris) / France zone IV (code 27574) from 1972.,,EPSG,2001-11-06 00:00:00,,1,0
+27571,NTF (Paris) / Lambert zone I,1731,projected,4499,,4807,18081,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Nord France (code 27561).,,EPSG,2001-11-06 00:00:00,,1,0
+27572,NTF (Paris) / Lambert zone II,1734,projected,4499,,4807,18082,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Centre France (code 27562).,,EPSG,2001-11-06 00:00:00,,1,0
+27573,NTF (Paris) / Lambert zone III,1733,projected,4499,,4807,18083,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Sud France (code 27563).,,EPSG,2001-11-06 00:00:00,,1,0
+27574,NTF (Paris) / Lambert zone IV,1327,projected,4499,,4807,18084,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF (Paris) / Lambert Corse (code 27564).,,EPSG,2001-11-06 00:00:00,,1,0
+27581,NTF (Paris) / France I,1731,projected,4499,,4807,18081,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Nord France (code 27591).,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27582,NTF (Paris) / France II,1734,projected,4499,,4807,18082,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Centre France (code 27592).,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27583,NTF (Paris) / France III,1733,projected,4499,,4807,18083,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Sud France (code 27593).,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27584,NTF (Paris) / France IV,1327,projected,4499,,4807,18084,,,Large and medium scale topographic mapping and engineering survey.,Introduced 1972. Supersedes NTF / Corse (code 27594).,,EPSG,1996-04-12 00:00:00,,1,1
+27591,NTF (Paris) / Nord France,1731,projected,4499,,4807,18091,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France I (code 27581) from 1972.,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27592,NTF (Paris) / Centre France,1732,projected,4499,,4807,18092,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France II (code 27582) from 1972.,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27593,NTF (Paris) / Sud France,1733,projected,4499,,4807,18093,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France III (code 27583) from 1972.,,EPSG,1996-04-12 00:00:00,95.26,1,1
+27594,NTF (Paris) / Corse,1327,projected,4499,,4807,18094,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NTF / France IV (code 27584) from 1972.,,EPSG,1996-04-12 00:00:00,,1,1
+27700,OSGB 1936 / British National Grid,1264,projected,4400,,4277,19916,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28191,Palestine 1923 / Palestine Grid,1356,projected,4400,,4281,18201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+28192,Palestine 1923 / Palestine Belt,1356,projected,4400,,4281,18202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-04-22 00:00:00,,1,0
+28193,Palestine 1923 / Israeli CS Grid,2603,projected,4400,,4281,18203,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Israeli TM Grid (EPSG code 2039).,Survey of Israel.,EPSG,2002-06-22 00:00:00,2002.34,1,0
+28232,Pointe Noire / UTM zone 32S,1072,projected,4400,,4282,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,2002.05,1,0
+28348,GDA94 / MGA zone 48,1556,projected,4400,,4283,17348,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28349,GDA94 / MGA zone 49,1557,projected,4400,,4283,17349,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28350,GDA94 / MGA zone 50,1558,projected,4400,,4283,17350,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28351,GDA94 / MGA zone 51,1559,projected,4400,,4283,17351,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28352,GDA94 / MGA zone 52,1560,projected,4400,,4283,17352,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28353,GDA94 / MGA zone 53,1561,projected,4400,,4283,17353,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28354,GDA94 / MGA zone 54,1562,projected,4400,,4283,17354,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28355,GDA94 / MGA zone 55,1563,projected,4400,,4283,17355,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28356,GDA94 / MGA zone 56,1564,projected,4400,,4283,17356,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28357,GDA94 / MGA zone 57,1565,projected,4400,,4283,17357,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28358,GDA94 / MGA zone 58,1566,projected,4400,,4283,17358,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+28402,Pulkovo 1942 / Gauss-Kruger zone 2,1805,projected,4530,,4284,16202,,,Military mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 9E (code 2492).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28403,Pulkovo 1942 / Gauss-Kruger zone 3,1792,projected,4530,,4284,16203,,,Military mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 15E (code 2493).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28404,Pulkovo 1942 / Gauss-Kruger zone 4,1793,projected,4530,,4284,16204,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 21E (code 2494).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28405,Pulkovo 1942 / Gauss-Kruger zone 5,1794,projected,4530,,4284,16205,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 27E (code 2495).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28406,Pulkovo 1942 / Gauss-Kruger zone 6,1795,projected,4530,,4284,16206,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 33E (code 2496).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28407,Pulkovo 1942 / Gauss-Kruger zone 7,1796,projected,4530,,4284,16207,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 39E (code 2497).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28408,Pulkovo 1942 / Gauss-Kruger zone 8,1797,projected,4530,,4284,16208,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 45E (code 2498).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28409,Pulkovo 1942 / Gauss-Kruger zone 9,1798,projected,4530,,4284,16209,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 51E (code 2499).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28410,Pulkovo 1942 / Gauss-Kruger zone 10,1799,projected,4530,,4284,16210,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 57E (code 2500).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28411,Pulkovo 1942 / Gauss-Kruger zone 11,1800,projected,4530,,4284,16211,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 63E (code 2501).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28412,Pulkovo 1942 / Gauss-Kruger zone 12,1801,projected,4530,,4284,16212,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 69E (code 2502).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28413,Pulkovo 1942 / Gauss-Kruger zone 13,1802,projected,4530,,4284,16213,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 75E (code 2503).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28414,Pulkovo 1942 / Gauss-Kruger zone 14,1803,projected,4530,,4284,16214,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 81E (code 2504).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28415,Pulkovo 1942 / Gauss-Kruger zone 15,1804,projected,4530,,4284,16215,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 87E (code 2505).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28416,Pulkovo 1942 / Gauss-Kruger zone 16,1775,projected,4530,,4284,16216,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 93E (code 2506).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28417,Pulkovo 1942 / Gauss-Kruger zone 17,1776,projected,4530,,4284,16217,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 99E (code 2507).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28418,Pulkovo 1942 / Gauss-Kruger zone 18,1777,projected,4530,,4284,16218,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 105E (code 2508).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28419,Pulkovo 1942 / Gauss-Kruger zone 19,1778,projected,4530,,4284,16219,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 111E (code 2509).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28420,Pulkovo 1942 / Gauss-Kruger zone 20,1779,projected,4530,,4284,16220,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 117E (code 2510).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28421,Pulkovo 1942 / Gauss-Kruger zone 21,1780,projected,4530,,4284,16221,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 123E (code 2511).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28422,Pulkovo 1942 / Gauss-Kruger zone 22,1781,projected,4530,,4284,16222,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 129E (code 2512).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28423,Pulkovo 1942 / Gauss-Kruger zone 23,1782,projected,4530,,4284,16223,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 135E (code 2513).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28424,Pulkovo 1942 / Gauss-Kruger zone 24,1783,projected,4530,,4284,16224,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 141E (code 2514).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28425,Pulkovo 1942 / Gauss-Kruger zone 25,1784,projected,4530,,4284,16225,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 147E (code 2515).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28426,Pulkovo 1942 / Gauss-Kruger zone 26,1785,projected,4530,,4284,16226,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 153E (code 2516).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28427,Pulkovo 1942 / Gauss-Kruger zone 27,1786,projected,4530,,4284,16227,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 159E (code 2517).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28428,Pulkovo 1942 / Gauss-Kruger zone 28,1787,projected,4530,,4284,16228,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 165E (code 2518).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28429,Pulkovo 1942 / Gauss-Kruger zone 29,1788,projected,4530,,4284,16229,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 171E (code 2519).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28430,Pulkovo 1942 / Gauss-Kruger zone 30,1789,projected,4530,,4284,16230,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 177E (code 2520).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28431,Pulkovo 1942 / Gauss-Kruger zone 31,1790,projected,4530,,4284,16231,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 177W (code 2521).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28432,Pulkovo 1942 / Gauss-Kruger zone 32,1791,projected,4530,,4284,16232,,,Medium scale topographic mapping.,Also found with truncated fase easting - see Pulkovo 1942 / Gauss-Kruger CM 171W (code 2522).,EPSG,EPSG,2002-06-22 00:00:00,2002.36,1,0
+28462,Pulkovo 1942 / Gauss-Kruger 2N,1805,projected,4530,,4284,16302,,,Truncated form of Gauss-Kruger zone 2,,,EPSG,1998-06-30 00:00:00,,1,1
+28463,Pulkovo 1942 / Gauss-Kruger 3N,1792,projected,4530,,4284,16303,,,Military mapping.,Truncated form of Gauss-Kruger zone 3,,EPSG,1998-06-30 00:00:00,,1,1
+28464,Pulkovo 1942 / Gauss-Kruger 4N,1793,projected,4530,,4284,16304,,,Military mapping.,,,EPSG,1995-06-02 00:00:00,,1,1
+28465,Pulkovo 1942 / Gauss-Kruger 5N,1794,projected,4530,,4284,16305,,,Truncated form of Gauss-Kruger zone 5,,,EPSG,1995-06-02 00:00:00,,1,1
+28466,Pulkovo 1942 / Gauss-Kruger 6N,1795,projected,4530,,4284,16306,,,Truncated form of Gauss-Kruger zone 6,,,EPSG,1995-06-02 00:00:00,,1,1
+28467,Pulkovo 1942 / Gauss-Kruger 7N,1796,projected,4530,,4284,16307,,,Truncated form of Gauss-Kruger zone 7,,,EPSG,1995-06-02 00:00:00,,1,1
+28468,Pulkovo 1942 / Gauss-Kruger 8N,1797,projected,4530,,4284,16308,,,Truncated form of Gauss-Kruger zone 8,,,EPSG,1995-06-02 00:00:00,,1,1
+28469,Pulkovo 1942 / Gauss-Kruger 9N,1798,projected,4530,,4284,16309,,,Truncated form of Gauss-Kruger zone 9,,,EPSG,1995-06-02 00:00:00,,1,1
+28470,Pulkovo 1942 / Gauss-Kruger 10N,1799,projected,4530,,4284,16310,,,Truncated form of Gauss-Kruger zone 10,,,EPSG,1995-06-02 00:00:00,,1,1
+28471,Pulkovo 1942 / Gauss-Kruger 11N,1800,projected,4530,,4284,16311,,,Truncated form of Gauss-Kruger zone 11,,,EPSG,1995-06-02 00:00:00,,1,1
+28472,Pulkovo 1942 / Gauss-Kruger 12N,1801,projected,4530,,4284,16312,,,Truncated form of Gauss-Kruger zone 12,,,EPSG,1995-06-02 00:00:00,,1,1
+28473,Pulkovo 1942 / Gauss-Kruger 13N,1802,projected,4530,,4284,16313,,,Truncated form of Gauss-Kruger zone 13,,,EPSG,1995-06-02 00:00:00,,1,1
+28474,Pulkovo 1942 / Gauss-Kruger 14N,1803,projected,4530,,4284,16314,,,Truncated form of Gauss-Kruger zone 14,,,EPSG,1995-06-02 00:00:00,,1,1
+28475,Pulkovo 1942 / Gauss-Kruger 15N,1804,projected,4530,,4284,16315,,,Truncated form of Gauss-Kruger zone 15,,,EPSG,1995-06-02 00:00:00,,1,1
+28476,Pulkovo 1942 / Gauss-Kruger 16N,1775,projected,4530,,4284,16316,,,Truncated form of Gauss-Kruger zone 16,,,EPSG,1995-06-02 00:00:00,,1,1
+28477,Pulkovo 1942 / Gauss-Kruger 17N,1776,projected,4530,,4284,16317,,,Truncated form of Gauss-Kruger zone 17,,,EPSG,1995-06-02 00:00:00,,1,1
+28478,Pulkovo 1942 / Gauss-Kruger 18N,1777,projected,4530,,4284,16318,,,Truncated form of Gauss-Kruger zone 18,,,EPSG,1995-06-02 00:00:00,,1,1
+28479,Pulkovo 1942 / Gauss-Kruger 19N,1778,projected,4530,,4284,16319,,,Truncated form of Gauss-Kruger zone 19,,,EPSG,1995-06-02 00:00:00,,1,1
+28480,Pulkovo 1942 / Gauss-Kruger 20N,1779,projected,4530,,4284,16320,,,Truncated form of Gauss-Kruger zone 20,,,EPSG,1995-06-02 00:00:00,,1,1
+28481,Pulkovo 1942 / Gauss-Kruger 21N,1780,projected,4530,,4284,16321,,,Truncated form of Gauss-Kruger zone 21,,,EPSG,1995-06-02 00:00:00,,1,1
+28482,Pulkovo 1942 / Gauss-Kruger 22N,1781,projected,4530,,4284,16322,,,Truncated form of Gauss-Kruger zone 22,,,EPSG,1995-06-02 00:00:00,,1,1
+28483,Pulkovo 1942 / Gauss-Kruger 23N,1782,projected,4530,,4284,16323,,,Truncated form of Gauss-Kruger zone 23,,,EPSG,1995-06-02 00:00:00,,1,1
+28484,Pulkovo 1942 / Gauss-Kruger 24N,1783,projected,4530,,4284,16324,,,Truncated form of Gauss-Kruger zone 24,,,EPSG,1995-06-02 00:00:00,,1,1
+28485,Pulkovo 1942 / Gauss-Kruger 25N,1784,projected,4530,,4284,16325,,,Truncated form of Gauss-Kruger zone 25,,,EPSG,1995-06-02 00:00:00,,1,1
+28486,Pulkovo 1942 / Gauss-Kruger 26N,1785,projected,4530,,4284,16326,,,Truncated form of Gauss-Kruger zone 26,,,EPSG,1995-06-02 00:00:00,,1,1
+28487,Pulkovo 1942 / Gauss-Kruger 27N,1786,projected,4530,,4284,16327,,,Truncated form of Gauss-Kruger zone 27,,,EPSG,1995-06-02 00:00:00,,1,1
+28488,Pulkovo 1942 / Gauss-Kruger 28N,1787,projected,4530,,4284,16328,,,Truncated form of Gauss-Kruger zone 28,,,EPSG,1995-06-02 00:00:00,,1,1
+28489,Pulkovo 1942 / Gauss-Kruger 29N,1788,projected,4530,,4284,16329,,,Truncated form of Gauss-Kruger zone 29,,,EPSG,1995-06-02 00:00:00,,1,1
+28490,Pulkovo 1942 / Gauss-Kruger 30N,1789,projected,4530,,4284,16330,,,Truncated form of Gauss-Kruger zone 30,,,EPSG,1995-06-02 00:00:00,,1,1
+28491,Pulkovo 1942 / Gauss-Kruger 31N,1790,projected,4530,,4284,16331,,,Truncated form of Gauss-Kruger zone 31,,,EPSG,1995-06-02 00:00:00,,1,1
+28492,Pulkovo 1942 / Gauss-Kruger 32N,1791,projected,4530,,4284,16332,,,Truncated form of Gauss-Kruger zone 32,,,EPSG,1995-06-02 00:00:00,,1,1
+28600,Qatar 1974 / Qatar National Grid,1346,projected,4400,,4285,19919,,,Large and medium scale topographic mapping and engineering survey.,,Qatar Centre for Geographic Information.,EPSG,2000-03-07 00:00:00,2000.29,1,0
+28991,Amersfoort / RD Old,1275,projected,4499,,4289,19913,,,Large and medium scale topographic mapping and engineering survey.,Superseded by 28992 (Amersfoort / RD New).,,EPSG,2000-03-07 00:00:00,2000.37,1,0
+28992,Amersfoort / RD New,1275,projected,4499,,4289,19914,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 28991 (Amersfoort / RD Old).,,EPSG,2000-03-07 00:00:00,2000.37,1,0
+29100,SAD69 / Brazil Polyconic,1053,projected,4499,,4291,19941,,,Small scale mapping.,,PetroBras,EPSG,1999-04-22 00:00:00,,1,0
+29118,SAD69 / UTM zone 18N,1807,projected,4400,,4291,16018,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29119,SAD69 / UTM zone 19N,1809,projected,4400,,4291,16019,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29120,SAD69 / UTM zone 20N,1811,projected,4400,,4291,16020,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29121,SAD69 / UTM zone 21N,1813,projected,4400,,4291,16021,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29122,SAD69 / UTM zone 22N,1815,projected,4400,,4291,16022,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29177,SAD69 / UTM zone 17S,1806,projected,4400,,4291,16117,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29178,SAD69 / UTM zone 18S,1808,projected,4400,,4291,16118,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29179,SAD69 / UTM zone 19S,1810,projected,4400,,4291,16119,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29180,SAD69 / UTM zone 20S,1812,projected,4400,,4291,16120,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29181,SAD69 / UTM zone 21S,1814,projected,4400,,4291,16121,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29182,SAD69 / UTM zone 22S,1816,projected,4400,,4291,16122,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29183,SAD69 / UTM zone 23S,1817,projected,4400,,4291,16123,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29184,SAD69 / UTM zone 24S,1818,projected,4400,,4291,16124,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29185,SAD69 / UTM zone 25S,1819,projected,4400,,4291,16125,,,Large and medium scale topographic mapping and engineering survey.,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,,EPSG,1995-06-02 00:00:00,97.252,1,0
+29220,Sapper Hill 1943 / UTM zone 20S,1820,projected,4400,,4292,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29221,Sapper Hill 1943 / UTM zone 21S,1821,projected,4400,,4292,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29333,Schwarzeck / UTM zone 33S,1822,projected,4400,,4293,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+29371,South West African Coord. System zone 11,1838,projected,6502,,4293,17611,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29373,South West African Coord. System zone 13,1839,projected,6502,,4293,17613,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29375,South West African Coord. System zone 15,1840,projected,6502,,4293,17615,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29377,South West African Coord. System zone 17,1841,projected,6502,,4293,17617,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29379,South West African Coord. System zone 19,1842,projected,6502,,4293,17619,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29381,South West African Coord. System zone 21,1843,projected,6502,,4293,17621,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29383,South West African Coord. System zone 23,1844,projected,6502,,4293,17623,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29385,South West African Coord. System zone 25,1845,projected,6502,,4293,17625,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",,,EPSG,2000-03-07 00:00:00,97.16  99.98,1,0
+29635,Sudan / UTM zone 35N,1846,projected,4400,,4296,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29636,Sudan / UTM zone 36N,1847,projected,4400,,4296,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29700,Tananarive (Paris) / Laborde Grid,1149,projected,4499,,4810,19911,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29738,Tananarive / UTM zone 38S,1848,projected,4400,,4297,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29739,Tananarive / UTM zone 39S,1849,projected,4400,,4297,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29849,Timbalai 1948 / UTM zone 49N,1852,projected,4400,,4298,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29850,Timbalai 1948 / UTM zone 50N,1853,projected,4400,,4298,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+29871,Timbalai 1948 / R.S.O. Borneo (ch),1362,projected,4402,,4298,19956,,,Large and medium scale topographic mapping and engineering survey.,Adopts metric conversion of 39.370147 inches per metre. Being superseded by metric version (code 29873).,,EPSG,2002-07-13 00:00:00,97.231  2000.60  2002.47,1,0
+29872,Timbalai 1948 / R.S.O. Borneo (ft),1851,projected,4405,,4298,19957,,,Large and medium scale topographic mapping and engineering survey.,Original projection definition in chains.  1 chain = 66 feet.  Adopts Sears 1922 metric conversion of 39.370147 inches per metre.  Being superseded by metric version (code 29873).,,EPSG,2002-07-13 00:00:00,97.231  2000.60  2002.47,1,0
+29873,Timbalai 1948 / R.S.O. Borneo (m),1362,projected,4400,,4298,19958,,,Large and medium scale topographic mapping and engineering survey.,Original projection definition in chains.  1 chain = 66 feet=792 inches.  Adopts Sears 1922 metric conversion of 39.370147 inches per metre.,,EPSG,2000-10-19 00:00:00,2000.60,1,0
+29900,TM65 / Irish National Grid,1305,projected,4400,,4299,19908,,,Large and medium scale topographic mapping and engineering survey.,Superseded by IRENET95 / Irish Transverse Mercator (code 2157) from 1/1/2001.  Deprecated due to change of name - see 29902.,Ordnance Survey of Ireland,EPSG,1995-06-02 00:00:00,,1,1
+29901,OSNI 1952 / Irish National Grid,2530,projected,4400,,4188,19973,,,Large and medium scale topographic mapping and engineering survey.,Not used in Republic of Ireland.  Superseded in 1975 by TM75 / Irish Grid (code 29903).,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+29902,TM65 / Irish Grid,1125,projected,4400,,4299,19972,,,Large and medium scale topographic mapping and engineering survey.,Not used in Northern Ireland.  Superseded by TM75 / Irish Grid (code 29903) in 1975.,Ordnance Survey of Ireland.,EPSG,2001-11-06 00:00:00,,1,0
+29903,TM75 / Irish Grid,1305,projected,4400,,4300,19972,,,Large and medium scale topographic mapping and engineering survey.,Supersedes both OSNI 1952 / Irish National Grid (code 29901) and TM65 / Irish Grid (code 29902) from 1975.  Superseded by IRENET95 / Irish Transverse Mercator (code 2157) from 1/1/2001.,Ordnance Survey of Ireland,EPSG,2001-11-06 00:00:00,,1,0
+30161,Tokyo / Japan Plane Rectangular CS I,1854,projected,4530,,4301,17801,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS I (code 2443) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30162,Tokyo / Japan Plane Rectangular CS II,1855,projected,4530,,4301,17802,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS II (code 2444) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30163,Tokyo / Japan Plane Rectangular CS III,1856,projected,4530,,4301,17803,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS III (code 2445) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30164,Tokyo / Japan Plane Rectangular CS IV,1857,projected,4530,,4301,17804,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS IV (code 2446) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30165,Tokyo / Japan Plane Rectangular CS V,1858,projected,4530,,4301,17805,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS V (code 2447) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30166,Tokyo / Japan Plane Rectangular CS VI,1859,projected,4530,,4301,17806,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS VI (code 2448) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30167,Tokyo / Japan Plane Rectangular CS VII,1860,projected,4530,,4301,17807,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS VII (code 2449) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30168,Tokyo / Japan Plane Rectangular CS VIII,1861,projected,4530,,4301,17808,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS VIII (code 2450) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30169,Tokyo / Japan Plane Rectangular CS IX,1862,projected,4530,,4301,17809,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS IX (code 2451) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30170,Tokyo / Japan Plane Rectangular CS X,1863,projected,4530,,4301,17810,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS X (code 2452) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30171,Tokyo / Japan Plane Rectangular CS XI,1864,projected,4530,,4301,17811,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XI (code 2453) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30172,Tokyo / Japan Plane Rectangular CS XII,1865,projected,4530,,4301,17812,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XII (code 2454) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30173,Tokyo / Japan Plane Rectangular CS XIII,1866,projected,4530,,4301,17813,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XIII (code 2455) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08,1,0
+30174,Tokyo / Japan Plane Rectangular CS XIV,1867,projected,4530,,4301,17814,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XIV (code 2456) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,1,0
+30175,Tokyo / Japan Plane Rectangular CS XV,1868,projected,4530,,4301,17815,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XV (code 2457) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30176,Tokyo / Japan Plane Rectangular CS XVI,1869,projected,4530,,4301,17816,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Superseded by JGD2000 / Japan Plane Rectangular CS XVI (code 2458) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,1,0
+30177,Tokyo / Japan Plane Rectangular CS XVII,1870,projected,4530,,4301,17817,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XVII (code 2459) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30178,Tokyo / Japan Plane Rectangular CS XVIII,1871,projected,4530,,4301,17818,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XVIII (code 2460) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30179,Tokyo / Japan Plane Rectangular CS XIX,1872,projected,4530,,4301,17819,,,"Large and medium scale topographic mapping, cadastral and engineering survey.",Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low. Superseded by JGD2000 / Japan Plane Rectangular CS XIX (code 2461) from April 2002.,Geographic Survey Institute; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,99.97 2002.08 2002.081,1,0
+30200,Trinidad 1903 / Trinidad Grid,1322,projected,4407,,4302,19925,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.231,1,0
+30339,TC(1948) / UTM zone 39N,1850,projected,4400,,4303,16039,,,Oil exploration.,,,EPSG,1995-06-02 00:00:00,,1,0
+30340,TC(1948) / UTM zone 40N,1750,projected,4400,,4303,16040,,,Oil exploration.,,,EPSG,1995-06-02 00:00:00,,1,0
+30491,Voirol 1875 / Nord Algerie (ancienne),1728,projected,4499,,4304,18011,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Nord Sahara 1959 / Voirol Unifie Nord (code 30791).,,EPSG,1995-06-02 00:00:00,,1,0
+30492,Voirol 1875 / Sud Algerie (ancienne),1729,projected,4499,,4304,18012,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Nord Sahara 1959 / Voirol Unifie Nord (code 30792).,,EPSG,1995-06-02 00:00:00,,1,0
+30729,Nord Sahara 1959 / UTM zone 29N,1735,projected,4400,,4307,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30730,Nord Sahara 1959 / UTM zone 30N,1736,projected,4400,,4307,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30731,Nord Sahara 1959 / UTM zone 31N,1737,projected,4400,,4307,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30732,Nord Sahara 1959 / UTM zone 32N,1738,projected,4400,,4307,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+30791,Nord Sahara 1959 / Voirol Unifie Nord,1728,projected,4499,,4307,18021,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Voirol 1875 / Nord Algeria ancienne (code 30491).  Grid coordinates on average across Algeria are unchanged although local differences reach 30 metres; geographic coordinate equivalents do change.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2002-08-29 00:00:00,2002.56,1,0
+30792,Nord Sahara 1959 / Voirol Unifie Sud,1729,projected,4499,,4307,18022,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Voirol 1875 / Sud Algeria ancienne (code 30492).  Grid coordinates on average across Algeria are unchanged although local differences reach 30 metres; geographic coordinate equivalents do change.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2002-08-29 00:00:00,2002.56,1,0
+30800,RT38 2.5 gon W,1225,projected,4530,,4308,19929,,,Large and medium scale topographic mapping and engineering survey.,,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,97.14  97.39,1,0
+31028,Yoff / UTM zone 28N,1207,projected,4400,,4310,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+31121,Zanderij / UTM zone 21N,1222,projected,4400,,4311,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+31154,Zanderij / TM 54 NW,1727,projected,4400,,4311,17054,,,Large and medium scale topographic mapping and engineering survey.,,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+31170,Zanderij / Suriname Old TM,1222,projected,4400,,4311,19954,,,Large and medium scale topographic mapping and engineering survey.,Introduced in 1975.  Superseded by Zanderij / Suriname TM in 1979.,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+31171,Zanderij / Suriname TM,1222,projected,4400,,4311,19955,,,Large and medium scale topographic mapping and engineering survey.,Superseded Zanderij / Suriname Old TM in 1979.,Shell International,EPSG,2000-06-10 00:00:00,,1,0
+31265,MGI / 3-degree Gauss zone 5,1709,projected,4499,,4312,16265,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31266,MGI / 3-degree Gauss zone 6,1710,projected,4499,,4312,16266,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31267,MGI / 3-degree Gauss zone 7,1711,projected,4499,,4312,16267,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31268,MGI / 3-degree Gauss zone 8,1712,projected,4499,,4312,16268,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,,1,1
+31275,MGI / Balkans zone 5,1709,projected,4530,,4312,18275,,,Large and medium scale topographic mapping and engineering survey.,In Slovenia the truncated form MGI / Slovenia Grid (code 2169) is preferred.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+31276,MGI / Balkans zone 6,1710,projected,4530,,4312,18276,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+31277,MGI / Balkans zone 7,1711,projected,4530,,4312,18277,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+31278,MGI / Balkans zone 8,1712,projected,4530,,4312,18277,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-06-05 00:00:00,,1,1
+31279,MGI / Balkans zone 8,1712,projected,4530,,4312,18278,,,Large and medium scale topographic mapping and engineering survey.,,EPSG,EPSG,2001-08-28 00:00:00,,1,0
+31281,MGI (Ferro) / Austria West Zone,1706,projected,4530,,4805,18041,,,Large and medium scale topographic mapping and engineering survey.,Superseded by MGI / M28 (EPSG code 31284) based on Greenwich meridian.,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31282,MGI (Ferro) / Austria Central Zone,1708,projected,4530,,4805,18042,,,Large and medium scale topographic mapping and engineering survey.,Superseded by MGI / M31 (EPSG code 31285) based on Greenwich meridian.,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31283,MGI (Ferro) / Austria East Zone,1707,projected,4530,,4805,18043,,,Large and medium scale topographic mapping and engineering survey.,Superseded by MGI / M34 (EPSG code 31286) based on Greenwich meridian.,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31284,MGI / M28,1706,projected,4530,,4312,18044,,,Large and medium scale topographic mapping and engineering survey.,Supersedes MGI (Ferro) / Austria West zone (EPSG code 31281).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31285,MGI / M31,1707,projected,4530,,4312,18045,,,Large and medium scale topographic mapping and engineering survey.,Supersedes MGI (Ferro) / Austria Central zone (EPSG code 31282).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31286,MGI / M34,1708,projected,4530,,4312,18046,,,Large and medium scale topographic mapping and engineering survey.,Supersedes MGI (Ferro) / Austria East zone (EPSG code 31283).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31287,MGI / Austria Lambert,1037,projected,4530,,4312,19947,,,Medium and small scale mapping.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,2001-06-05 00:00:00,,1,0
+31291,MGI (Ferro) / Austria West Zone,1706,projected,4499,,4805,18041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,97.01,1,1
+31292,MGI (Ferro) / Austria Central Zone,1708,projected,4499,,4805,18042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,97.01,1,1
+31293,MGI (Ferro) / Austria East Zone,1707,projected,4499,,4805,18043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,97.01,1,1
+31294,MGI / M28,1706,projected,4499,,4312,18044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31295,MGI / M31,1707,projected,4499,,4312,18045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31296,MGI / M34,1708,projected,4499,,4312,18046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31297,MGI / Austria Lambert,1037,projected,4499,,4312,19947,,,Medium and small scale mapping.,,,EPSG,1999-10-20 00:00:00,97.01,1,1
+31300,Belge 1972 / Belge Lambert 72,1347,projected,4499,,4313,19902,,,Large and medium scale topographic mapping and engineering survey.,Supersedes 21500 (Belge 1950 / Belge Lambert 50).  An alternative - Belge 1972 / Belgian Lambert 72 (code 31370) - was introduced in 2000 to use the standard Lambert Conic Conformal (2SP) projection method (code 9802).  EPSG recommends this alternative.,IGN Brussels.,EPSG,1995-06-02 00:00:00,,1,0
+31370,Belge 1972 / Belgian Lambert 72,1347,projected,4499,,4313,19961,,,Large and medium scale topographic mapping and engineering survey.,"Introduced in 2000 as an alternative to CRS code 31300 to avoid the special projection method LCC (2SP Belgium) (code 9803). If software cannot handle latitude of origin 90�N, use latitude of origin = 50� 47' 57.704""N with Nf = 165372.956 m.",IGN Brussels www.ngi.be/html-files/french/0038.html,EPSG,2000-10-19 00:00:00,,1,0
+31461,DHDN / 3-degree Gauss zone 1,1628,projected,4499,,4314,16261,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31462,DHDN / 3-degree Gauss zone 2,1624,projected,4499,,4314,16262,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31463,DHDN / 3-degree Gauss zone 3,1625,projected,4499,,4314,16263,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31464,DHDN / 3-degree Gauss zone 4,1626,projected,4499,,4314,16264,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31465,DHDN / 3-degree Gauss zone 5,1627,projected,4499,,4314,16265,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.101,1,1
+31466,DHDN / Gauss-Kruger zone 2,1624,projected,4530,,4314,16262,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31467,DHDN / Gauss-Kruger zone 3,1625,projected,4530,,4314,16263,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31468,DHDN / Gauss-Kruger zone 4,1626,projected,4530,,4314,16264,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31469,DHDN / Gauss-Kruger zone 5,1627,projected,4530,,4314,16265,,,"Large and medium scale topographic mapping and engineering survey, cadastral survey.",Zone width 3 degrees.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1,0
+31528,Conakry 1905 / UTM zone 28N,1468,projected,4400,,4315,16028,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Dabola 1981 / UTM zone 28 (EPSG code 2063).,,EPSG,1999-12-09 00:00:00,,1,0
+31529,Conakry 1905 / UTM zone 29N,1469,projected,4400,,4315,16029,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Dabola 1981 / UTM zone 29 (EPSG code 2064).,,EPSG,1999-12-09 00:00:00,,1,0
+31600,Dealul Piscului 1933/ Stereo 33,1197,projected,4499,,4316,19927,,,Large and medium scale topographic mapping and engineering survey.,Superseded by Stereo 70 system (ProjCS code 31700).,,EPSG,1996-04-12 00:00:00,,1,0
+31700,Dealul Piscului 1970/ Stereo 70,1197,projected,4530,,4317,19926,,,Large and medium scale topographic mapping and engineering survey.,Supersedes Stereo 33 system.,,EPSG,1996-04-12 00:00:00,,1,0
+31838,NGN / UTM zone 38N,1739,projected,4400,,4318,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+31839,NGN / UTM zone 39N,1740,projected,4400,,4318,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-04-12 00:00:00,,1,0
+31900,KUDAMS / KTM,1310,projected,4400,,4319,19928,,,Large scale engineering and utility mapping.,,,EPSG,1996-04-12 00:00:00,,1,0
+31986,SIRGAS / UTM zone 17N,1823,projected,4400,,4170,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31987,SIRGAS / UTM zone 18N,1825,projected,4400,,4170,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31988,SIRGAS / UTM zone 19N,1827,projected,4400,,4170,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31989,SIRGAS / UTM zone 20N,1829,projected,4400,,4170,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31990,SIRGAS / UTM zone 21N,1831,projected,4400,,4170,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31991,SIRGAS / UTM zone 22N,1833,projected,4400,,4170,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31992,SIRGAS / UTM zone 17S,1824,projected,4400,,4170,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31993,SIRGAS / UTM zone 18S,1826,projected,4400,,4170,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31994,SIRGAS / UTM zone 19S,1828,projected,4400,,4170,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31995,SIRGAS / UTM zone 20S,1830,projected,4400,,4170,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31996,SIRGAS / UTM zone 21S,1832,projected,4400,,4170,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31997,SIRGAS / UTM zone 22S,1834,projected,4400,,4170,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31998,SIRGAS / UTM zone 23S,1835,projected,4400,,4170,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+31999,SIRGAS / UTM zone 24S,1836,projected,4400,,4170,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+32000,SIRGAS / UTM zone 25S,1837,projected,4400,,4170,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-10-19 00:00:00,,1,0
+32001,NAD27 / Montana North,2211,projected,4497,,4267,12501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32002,NAD27 / Montana Central,2210,projected,4497,,4267,12502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32003,NAD27 / Montana South,2212,projected,4497,,4267,12503,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32005,NAD27 / Nebraska North,2221,projected,4497,,4267,12601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32006,NAD27 / Nebraska South,2222,projected,4497,,4267,12602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32007,NAD27 / Nevada East,2224,projected,4497,,4267,12701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32008,NAD27 / Nevada Central,2223,projected,4497,,4267,12702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32009,NAD27 / Nevada West,2225,projected,4497,,4267,12703,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32010,NAD27 / New Hampshire,1398,projected,4497,,4267,12800,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32011,NAD27 / New Jersey,1399,projected,4497,,4267,12900,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32012,NAD27 / New Mexico East,2228,projected,4497,,4267,13001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32013,NAD27 / New Mexico Central,2229,projected,4497,,4267,13002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32014,NAD27 / New Mexico West,2230,projected,4497,,4267,13003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32015,NAD27 / New York East,2234,projected,4497,,4267,13101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32016,NAD27 / New York Central,2233,projected,4497,,4267,13102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32017,NAD27 / New York West,2236,projected,4497,,4267,13103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32018,NAD27 / New York Long Island,2235,projected,4497,,4267,13104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32019,NAD27 / North Carolina,1402,projected,4497,,4267,13200,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32020,NAD27 / North Dakota North,2237,projected,4497,,4267,13301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32021,NAD27 / North Dakota South,2238,projected,4497,,4267,13302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32022,NAD27 / Ohio North,2239,projected,4497,,4267,13401,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32023,NAD27 / Ohio South,2240,projected,4497,,4267,13402,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32024,NAD27 / Oklahoma North,2241,projected,4497,,4267,13501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32025,NAD27 / Oklahoma South,2242,projected,4497,,4267,13502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32026,NAD27 / Oregon North,2243,projected,4497,,4267,13601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32027,NAD27 / Oregon South,2244,projected,4497,,4267,13602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32028,NAD27 / Pennsylvania North,2245,projected,4497,,4267,13701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32029,NAD27 / Pennsylvania South,2246,projected,4497,,4267,13702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32030,NAD27 / Rhode Island,1408,projected,4497,,4267,13800,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32031,NAD27 / South Carolina North,2247,projected,4497,,4267,13901,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32033,NAD27 / South Carolina South,2248,projected,4497,,4267,13902,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32034,NAD27 / South Dakota North,2249,projected,4497,,4267,14001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32035,NAD27 / South Dakota South,2250,projected,4497,,4267,14002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32036,NAD27 / Tennessee,1411,projected,4497,,4267,14100,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,1
+32037,NAD27 / Texas North,2253,projected,4497,,4267,14201,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32038,NAD27 / Texas North Central,2254,projected,4497,,4267,14202,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32039,NAD27 / Texas Central,2252,projected,4497,,4267,14203,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32040,NAD27 / Texas South Central,2256,projected,4497,,4267,14204,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32041,NAD27 / Texas South,2255,projected,4497,,4267,14205,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32042,NAD27 / Utah North,2258,projected,4497,,4267,14301,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32043,NAD27 / Utah Central,2257,projected,4497,,4267,14302,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32044,NAD27 / Utah South,2259,projected,4497,,4267,14303,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32045,NAD27 / Vermont,1414,projected,4497,,4267,14400,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32046,NAD27 / Virginia North,2260,projected,4497,,4267,14501,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32047,NAD27 / Virginia South,2261,projected,4497,,4267,14502,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32048,NAD27 / Washington North,2262,projected,4497,,4267,14601,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32049,NAD27 / Washington South,2263,projected,4497,,4267,14602,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32050,NAD27 / West Virginia North,2264,projected,4497,,4267,14701,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32051,NAD27 / West Virginia South,2265,projected,4497,,4267,14702,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32052,NAD27 / Wisconsin North,2267,projected,4497,,4267,14801,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32053,NAD27 / Wisconsin Central,2266,projected,4497,,4267,14802,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32054,NAD27 / Wisconsin South,2268,projected,4497,,4267,14803,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32055,NAD27 / Wyoming East,2269,projected,4497,,4267,14901,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32056,NAD27 / Wyoming East Central,2270,projected,4497,,4267,14902,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32057,NAD27 / Wyoming West Central,2272,projected,4497,,4267,14903,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32058,NAD27 / Wyoming West,2271,projected,4497,,4267,14904,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32061,NAD27 / Guatemala Norte,2120,projected,4499,,4267,18211,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1999-08-18 00:00:00,,1,0
+32062,NAD27 / Guatemala Sur,2121,projected,4499,,4267,18212,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-01-06 00:00:00,99.95,1,0
+32064,NAD27 / BLM 14N (ftUS),2171,projected,4497,,4267,15914,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32065,NAD27 / BLM 15N (ftUS),2171,projected,4497,,4267,15915,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32066,NAD27 / BLM 16N (ftUS),2171,projected,4497,,4267,15916,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32067,NAD27 / BLM 17N (ftUS),2171,projected,4497,,4267,15917,,,"Minerals (including oil) management, exploration and production.",,EPSG,EPSG,2002-02-12 00:00:00,,1,0
+32074,NAD27 / BLM 14N (feet),2171,projected,4497,,4267,15914,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,96.03,1,1
+32075,NAD27 / BLM 15N (feet),2172,projected,4497,,4267,15915,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,96.03,1,1
+32076,NAD27 / BLM 16N (feet),2173,projected,4497,,4267,15916,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,95.27  96.03,1,1
+32077,NAD27 / BLM 17N (feet),2174,projected,4497,,4267,15917,,,"Minerals (including oil) management, exploration and production.",,,EPSG,1996-04-12 00:00:00,96.03,1,1
+32081,NAD27 / MTM zone 1,2226,projected,4400,,4267,17701,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32082,NAD27 / MTM zone 2,2227,projected,4400,,4267,17702,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32083,NAD27 / MTM zone 3,2275,projected,4400,,4267,17703,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32084,NAD27 / MTM zone 4,2276,projected,4400,,4267,17704,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32085,NAD27 / MTM zone 5,2277,projected,4400,,4267,17705,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32086,NAD27 / MTM zone 6,2278,projected,4400,,4267,17706,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32098,NAD27 / Quebec Lambert,1368,projected,4499,,4267,19944,,,Large and medium scale topographic mapping and engineering survey.,Superseded by NAD27(CGQ77) / Quebec Lambert (code 2137) in 1977.,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,2000-10-19 00:00:00,,1,0
+32100,NAD83 / Montana,1395,projected,4499,,4269,12530,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2256 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32104,NAD83 / Nebraska,1396,projected,4499,,4269,12630,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32107,NAD83 / Nevada East,2224,projected,4499,,4269,12731,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32108,NAD83 / Nevada Central,2223,projected,4499,,4269,12732,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32109,NAD83 / Nevada West,2225,projected,4499,,4269,12733,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32110,NAD83 / New Hampshire,1398,projected,4499,,4269,12830,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32111,NAD83 / New Jersey,1399,projected,4499,,4269,12930,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32112,NAD83 / New Mexico East,2228,projected,4499,,4269,13031,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2257 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32113,NAD83 / New Mexico Central,2231,projected,4499,,4269,13032,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2258 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32114,NAD83 / New Mexico West,2232,projected,4499,,4269,13033,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2259 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32115,NAD83 / New York East,2234,projected,4499,,4269,13131,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2260 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32116,NAD83 / New York Central,2233,projected,4499,,4269,13132,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2261 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32117,NAD83 / New York West,2236,projected,4499,,4269,13133,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2263 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32118,NAD83 / New York Long Island,2235,projected,4499,,4269,13134,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2264 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32119,NAD83 / North Carolina,1402,projected,4499,,4269,13230,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2264 for equivalent non-metric definition.,,EPSG,2000-03-07 00:00:00,98.30  2000.091,1,0
+32120,NAD83 / North Dakota North,2237,projected,4499,,4269,13331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2265 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32121,NAD83 / North Dakota South,2238,projected,4499,,4269,13332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2266 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32122,NAD83 / Ohio North,2239,projected,4499,,4269,13431,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32123,NAD83 / Ohio South,2240,projected,4499,,4269,13432,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32124,NAD83 / Oklahoma North,2241,projected,4499,,4269,13531,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2267 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32125,NAD83 / Oklahoma South,2242,projected,4499,,4269,13532,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2268 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32126,NAD83 / Oregon North,2243,projected,4499,,4269,13631,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2269 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32127,NAD83 / Oregon South,2244,projected,4499,,4269,13632,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2270 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32128,NAD83 / Pennsylvania North,2245,projected,4499,,4269,13731,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2271 for equivalent non-metric definition.,,EPSG,1995-06-02 00:00:00,,1,0
+32129,NAD83 / Pennsylvania South,2246,projected,4499,,4269,13732,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in US survey feet.  See code 2272 for equivalent non-metric definition.,,EPSG,1995-06-02 00:00:00,,1,0
+32130,NAD83 / Rhode Island,1408,projected,4499,,4269,13830,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32133,NAD83 / South Carolina,1409,projected,4499,,4269,13930,,,Large and medium scale topographic mapping and engineering survey.,State law defines system in International feet (note: not US survey feet).  See code 2273 for equivalent non-metric definition.,,EPSG,1995-06-02 00:00:00,,1,0
+32134,NAD83 / South Dakota North,2249,projected,4499,,4269,14031,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32135,NAD83 / South Dakota South,2250,projected,4499,,4269,14032,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32136,NAD83 / Tennessee,1411,projected,4499,,4269,14130,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2274 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32137,NAD83 / Texas North,2253,projected,4499,,4269,14231,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2275 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32138,NAD83 / Texas North Central,2254,projected,4499,,4269,14232,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2276 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32139,NAD83 / Texas Central,2252,projected,4499,,4269,14233,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2277 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32140,NAD83 / Texas South Central,2527,projected,4499,,4269,14234,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2278 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32141,NAD83 / Texas South,2528,projected,4499,,4269,14235,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2279 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32142,NAD83 / Utah North,2258,projected,4499,,4269,14331,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2280 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32143,NAD83 / Utah Central,2257,projected,4499,,4269,14332,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2281 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32144,NAD83 / Utah South,2259,projected,4499,,4269,14333,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in International feet (note: not US survey feet).  See code 2282 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32145,NAD83 / Vermont,1414,projected,4499,,4269,14430,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32146,NAD83 / Virginia North,2260,projected,4499,,4269,14531,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2283 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32147,NAD83 / Virginia South,2261,projected,4499,,4269,14532,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2284 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32148,NAD83 / Washington North,2273,projected,4499,,4269,14631,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2285 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32149,NAD83 / Washington South,2274,projected,4499,,4269,14632,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2286 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32150,NAD83 / West Virginia North,2264,projected,4499,,4269,14731,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32151,NAD83 / West Virginia South,2265,projected,4499,,4269,14732,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32152,NAD83 / Wisconsin North,2267,projected,4499,,4269,14831,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2287 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32153,NAD83 / Wisconsin Central,2266,projected,4499,,4269,14832,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2288 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32154,NAD83 / Wisconsin South,2268,projected,4499,,4269,14833,,,Large and medium scale topographic mapping and engineering survey.,"State law defines system in US survey feet.  See code 2289 for equivalent non-metric definition. For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32155,NAD83 / Wyoming East,2269,projected,4499,,4269,14931,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32156,NAD83 / Wyoming East Central,2270,projected,4499,,4269,14932,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32157,NAD83 / Wyoming West Central,2272,projected,4499,,4269,14933,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32158,NAD83 / Wyoming West,2271,projected,4499,,4269,14934,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,2000-03-07 00:00:00,2000.091,1,0
+32161,NAD83 / Puerto Rico & Virgin Is.,2251,projected,4499,,4269,15230,,,Large and medium scale topographic mapping and engineering survey.,"For applications with an accuracy of better than 1m, superseded by NAD83(HARN) / SPCS.",,EPSG,1995-06-02 00:00:00,,1,0
+32180,NAD83 / SCoPQ zone 2,1420,projected,4499,,4269,17700,,,Large and medium scale topographic mapping and engineering survey.,,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+32181,NAD83 / MTM zone 1,2226,projected,4496,,4269,17701,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32182,NAD83 / MTM zone 2,2227,projected,4496,,4269,17702,,,Large and medium scale topographic mapping and engineering survey.,,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32183,NAD83 / MTM zone 3,2275,projected,4496,,4269,17703,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 3"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32184,NAD83 / MTM zone 4,2276,projected,4496,,4269,17704,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 4"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32185,NAD83 / MTM zone 5,2277,projected,4496,,4269,17705,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 5"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32186,NAD83 / MTM zone 6,2278,projected,4496,,4269,17706,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 6"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,1997-11-13 00:00:00,,1,0
+32187,NAD83 / MTM zone 7,1425,projected,4496,,4269,17707,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 7"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,1997-11-13 00:00:00,,1,0
+32188,NAD83 / MTM zone 8,2279,projected,4496,,4269,17708,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 8"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32189,NAD83 / MTM zone 9,2280,projected,4496,,4269,17709,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 9"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32190,NAD83 / MTM zone 10,2281,projected,4496,,4269,17710,,,Large and medium scale topographic mapping and engineering survey.,"Known in Quebec as ""NAD83 / SCoPQ zone 10"" with axis 1 and 2 abbreviations of ""X"" and ""Y"" respectively.",Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32191,NAD83 / MTM zone 11,1432,projected,4400,,4269,17711,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32192,NAD83 / MTM zone 12,1433,projected,4400,,4269,17712,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32193,NAD83 / MTM zone 13,1434,projected,4400,,4269,17713,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32194,NAD83 / MTM zone 14,1435,projected,4400,,4269,17714,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32195,NAD83 / MTM zone 15,1436,projected,4400,,4269,17715,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32196,NAD83 / MTM zone 16,1437,projected,4400,,4269,17716,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32197,NAD83 / MTM zone 17,1438,projected,4400,,4269,17717,,,Large and medium scale topographic mapping and engineering survey.,,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,1997-11-13 00:00:00,,1,0
+32198,NAD83 / Quebec Lambert,1368,projected,4499,,4269,19944,,,Large and medium scale topographic mapping and engineering survey.,,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,1999-10-20 00:00:00,,1,0
+32201,WGS 72 / UTM zone 1N,1873,projected,4400,,4322,16001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32202,WGS 72 / UTM zone 2N,1875,projected,4400,,4322,16002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32203,WGS 72 / UTM zone 3N,1877,projected,4400,,4322,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32204,WGS 72 / UTM zone 4N,1879,projected,4400,,4322,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32205,WGS 72 / UTM zone 5N,1881,projected,4400,,4322,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32206,WGS 72 / UTM zone 6N,1883,projected,4400,,4322,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32207,WGS 72 / UTM zone 7N,1885,projected,4400,,4322,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32208,WGS 72 / UTM zone 8N,1887,projected,4400,,4322,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32209,WGS 72 / UTM zone 9N,1889,projected,4400,,4322,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32210,WGS 72 / UTM zone 10N,1891,projected,4400,,4322,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32211,WGS 72 / UTM zone 11N,1893,projected,4400,,4322,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32212,WGS 72 / UTM zone 12N,1895,projected,4400,,4322,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32213,WGS 72 / UTM zone 13N,1897,projected,4400,,4322,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32214,WGS 72 / UTM zone 14N,1899,projected,4400,,4322,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32215,WGS 72 / UTM zone 15N,1901,projected,4400,,4322,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32216,WGS 72 / UTM zone 16N,1903,projected,4400,,4322,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32217,WGS 72 / UTM zone 17N,1905,projected,4400,,4322,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32218,WGS 72 / UTM zone 18N,1907,projected,4400,,4322,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32219,WGS 72 / UTM zone 19N,1909,projected,4400,,4322,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32220,WGS 72 / UTM zone 20N,1911,projected,4400,,4322,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32221,WGS 72 / UTM zone 21N,1913,projected,4400,,4322,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32222,WGS 72 / UTM zone 22N,1915,projected,4400,,4322,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32223,WGS 72 / UTM zone 23N,1917,projected,4400,,4322,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32224,WGS 72 / UTM zone 24N,1919,projected,4400,,4322,16024,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32225,WGS 72 / UTM zone 25N,1921,projected,4400,,4322,16025,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32226,WGS 72 / UTM zone 26N,1923,projected,4400,,4322,16026,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32227,WGS 72 / UTM zone 27N,1925,projected,4400,,4322,16027,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32228,WGS 72 / UTM zone 28N,1927,projected,4400,,4322,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32229,WGS 72 / UTM zone 29N,1929,projected,4400,,4322,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32230,WGS 72 / UTM zone 30N,1931,projected,4400,,4322,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32231,WGS 72 / UTM zone 31N,1933,projected,4400,,4322,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32232,WGS 72 / UTM zone 32N,1935,projected,4400,,4322,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32233,WGS 72 / UTM zone 33N,1937,projected,4400,,4322,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32234,WGS 72 / UTM zone 34N,1939,projected,4400,,4322,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32235,WGS 72 / UTM zone 35N,1941,projected,4400,,4322,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32236,WGS 72 / UTM zone 36N,1943,projected,4400,,4322,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32237,WGS 72 / UTM zone 37N,1945,projected,4400,,4322,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32238,WGS 72 / UTM zone 38N,1947,projected,4400,,4322,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32239,WGS 72 / UTM zone 39N,1949,projected,4400,,4322,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32240,WGS 72 / UTM zone 40N,1951,projected,4400,,4322,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32241,WGS 72 / UTM zone 41N,1953,projected,4400,,4322,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32242,WGS 72 / UTM zone 42N,1955,projected,4400,,4322,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32243,WGS 72 / UTM zone 43N,1957,projected,4400,,4322,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32244,WGS 72 / UTM zone 44N,1959,projected,4400,,4322,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32245,WGS 72 / UTM zone 45N,1961,projected,4400,,4322,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32246,WGS 72 / UTM zone 46N,1963,projected,4400,,4322,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32247,WGS 72 / UTM zone 47N,1965,projected,4400,,4322,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32248,WGS 72 / UTM zone 48N,1967,projected,4400,,4322,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32249,WGS 72 / UTM zone 49N,1969,projected,4400,,4322,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32250,WGS 72 / UTM zone 50N,1971,projected,4400,,4322,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32251,WGS 72 / UTM zone 51N,1973,projected,4400,,4322,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32252,WGS 72 / UTM zone 52N,1975,projected,4400,,4322,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32253,WGS 72 / UTM zone 53N,1977,projected,4400,,4322,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32254,WGS 72 / UTM zone 54N,1979,projected,4400,,4322,16054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32255,WGS 72 / UTM zone 55N,1981,projected,4400,,4322,16055,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32256,WGS 72 / UTM zone 56N,1983,projected,4400,,4322,16056,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32257,WGS 72 / UTM zone 57N,1985,projected,4400,,4322,16057,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32258,WGS 72 / UTM zone 58N,1987,projected,4400,,4322,16058,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32259,WGS 72 / UTM zone 59N,1989,projected,4400,,4322,16059,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32260,WGS 72 / UTM zone 60N,1991,projected,4400,,4322,16060,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32301,WGS 72 / UTM zone 1S,1874,projected,4400,,4322,16101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32302,WGS 72 / UTM zone 2S,1876,projected,4400,,4322,16102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32303,WGS 72 / UTM zone 3S,1878,projected,4400,,4322,16103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32304,WGS 72 / UTM zone 4S,1880,projected,4400,,4322,16104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32305,WGS 72 / UTM zone 5S,1882,projected,4400,,4322,16105,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32306,WGS 72 / UTM zone 6S,1884,projected,4400,,4322,16106,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32307,WGS 72 / UTM zone 7S,1886,projected,4400,,4322,16107,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32308,WGS 72 / UTM zone 8S,1888,projected,4400,,4322,16108,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32309,WGS 72 / UTM zone 9S,1890,projected,4400,,4322,16109,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32310,WGS 72 / UTM zone 10S,1892,projected,4400,,4322,16110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32311,WGS 72 / UTM zone 11S,1894,projected,4400,,4322,16111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32312,WGS 72 / UTM zone 12S,1896,projected,4400,,4322,16112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32313,WGS 72 / UTM zone 13S,1898,projected,4400,,4322,16113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32314,WGS 72 / UTM zone 14S,1900,projected,4400,,4322,16114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32315,WGS 72 / UTM zone 15S,1902,projected,4400,,4322,16115,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32316,WGS 72 / UTM zone 16S,1904,projected,4400,,4322,16116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32317,WGS 72 / UTM zone 17S,1906,projected,4400,,4322,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32318,WGS 72 / UTM zone 18S,1908,projected,4400,,4322,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32319,WGS 72 / UTM zone 19S,1910,projected,4400,,4322,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32320,WGS 72 / UTM zone 20S,1912,projected,4400,,4322,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32321,WGS 72 / UTM zone 21S,1914,projected,4400,,4322,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32322,WGS 72 / UTM zone 22S,1916,projected,4400,,4322,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32323,WGS 72 / UTM zone 23S,1918,projected,4400,,4322,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32324,WGS 72 / UTM zone 24S,1920,projected,4400,,4322,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32325,WGS 72 / UTM zone 25S,1922,projected,4400,,4322,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32326,WGS 72 / UTM zone 26S,1924,projected,4400,,4322,16126,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32327,WGS 72 / UTM zone 27S,1926,projected,4400,,4322,16127,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32328,WGS 72 / UTM zone 28S,1928,projected,4400,,4322,16128,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32329,WGS 72 / UTM zone 29S,1930,projected,4400,,4322,16129,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32330,WGS 72 / UTM zone 30S,1932,projected,4400,,4322,16130,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32331,WGS 72 / UTM zone 31S,1934,projected,4400,,4322,16131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32332,WGS 72 / UTM zone 32S,1936,projected,4400,,4322,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32333,WGS 72 / UTM zone 33S,1938,projected,4400,,4322,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32334,WGS 72 / UTM zone 34S,1940,projected,4400,,4322,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32335,WGS 72 / UTM zone 35S,1942,projected,4400,,4322,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32336,WGS 72 / UTM zone 36S,1944,projected,4400,,4322,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32337,WGS 72 / UTM zone 37S,1946,projected,4400,,4322,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32338,WGS 72 / UTM zone 38S,1948,projected,4400,,4322,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32339,WGS 72 / UTM zone 39S,1950,projected,4400,,4322,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32340,WGS 72 / UTM zone 40S,1952,projected,4400,,4322,16140,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32341,WGS 72 / UTM zone 41S,1954,projected,4400,,4322,16141,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32342,WGS 72 / UTM zone 42S,1956,projected,4400,,4322,16142,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32343,WGS 72 / UTM zone 43S,1958,projected,4400,,4322,16143,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32344,WGS 72 / UTM zone 44S,1960,projected,4400,,4322,16144,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32345,WGS 72 / UTM zone 45S,1962,projected,4400,,4322,16145,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32346,WGS 72 / UTM zone 46S,1964,projected,4400,,4322,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32347,WGS 72 / UTM zone 47S,1966,projected,4400,,4322,16147,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32348,WGS 72 / UTM zone 48S,1968,projected,4400,,4322,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32349,WGS 72 / UTM zone 49S,1970,projected,4400,,4322,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32350,WGS 72 / UTM zone 50S,1972,projected,4400,,4322,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32351,WGS 72 / UTM zone 51S,1974,projected,4400,,4322,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32352,WGS 72 / UTM zone 52S,1976,projected,4400,,4322,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32353,WGS 72 / UTM zone 53S,1978,projected,4400,,4322,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32354,WGS 72 / UTM zone 54S,1980,projected,4400,,4322,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32355,WGS 72 / UTM zone 55S,1982,projected,4400,,4322,16155,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32356,WGS 72 / UTM zone 56S,1984,projected,4400,,4322,16156,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32357,WGS 72 / UTM zone 57S,1986,projected,4400,,4322,16157,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32358,WGS 72 / UTM zone 58S,1988,projected,4400,,4322,16158,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32359,WGS 72 / UTM zone 59S,1990,projected,4400,,4322,16159,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32360,WGS 72 / UTM zone 60S,1992,projected,4400,,4322,16160,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32401,WGS 72BE / UTM zone 1N,1873,projected,4400,,4324,16001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32402,WGS 72BE / UTM zone 2N,1876,projected,4400,,4324,16002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32403,WGS 72BE / UTM zone 3N,1877,projected,4400,,4324,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32404,WGS 72BE / UTM zone 4N,1879,projected,4400,,4324,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32405,WGS 72BE / UTM zone 5N,1881,projected,4400,,4324,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32406,WGS 72BE / UTM zone 6N,1883,projected,4400,,4324,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32407,WGS 72BE / UTM zone 7N,1885,projected,4400,,4324,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32408,WGS 72BE / UTM zone 8N,1887,projected,4400,,4324,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32409,WGS 72BE / UTM zone 9N,1889,projected,4400,,4324,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32410,WGS 72BE / UTM zone 10N,1891,projected,4400,,4324,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32411,WGS 72BE / UTM zone 11N,1893,projected,4400,,4324,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32412,WGS 72BE / UTM zone 12N,1895,projected,4400,,4324,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32413,WGS 72BE / UTM zone 13N,1897,projected,4400,,4324,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32414,WGS 72BE / UTM zone 14N,1899,projected,4400,,4324,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32415,WGS 72BE / UTM zone 15N,1901,projected,4400,,4324,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32416,WGS 72BE / UTM zone 16N,1903,projected,4400,,4324,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32417,WGS 72BE / UTM zone 17N,1905,projected,4400,,4324,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32418,WGS 72BE / UTM zone 18N,1907,projected,4400,,4324,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32419,WGS 72BE / UTM zone 19N,1909,projected,4400,,4324,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32420,WGS 72BE / UTM zone 20N,1911,projected,4400,,4324,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32421,WGS 72BE / UTM zone 21N,1913,projected,4400,,4324,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32422,WGS 72BE / UTM zone 22N,1915,projected,4400,,4324,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32423,WGS 72BE / UTM zone 23N,1917,projected,4400,,4324,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32424,WGS 72BE / UTM zone 24N,1919,projected,4400,,4324,16024,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32425,WGS 72BE / UTM zone 25N,1921,projected,4400,,4324,16025,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32426,WGS 72BE / UTM zone 26N,1923,projected,4400,,4324,16026,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32427,WGS 72BE / UTM zone 27N,1925,projected,4400,,4324,16027,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32428,WGS 72BE / UTM zone 28N,1927,projected,4400,,4324,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32429,WGS 72BE / UTM zone 29N,1929,projected,4400,,4324,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32430,WGS 72BE / UTM zone 30N,1931,projected,4400,,4324,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32431,WGS 72BE / UTM zone 31N,1933,projected,4400,,4324,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32432,WGS 72BE / UTM zone 32N,1935,projected,4400,,4324,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32433,WGS 72BE / UTM zone 33N,1937,projected,4400,,4324,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32434,WGS 72BE / UTM zone 34N,1939,projected,4400,,4324,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32435,WGS 72BE / UTM zone 35N,1941,projected,4400,,4324,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32436,WGS 72BE / UTM zone 36N,1943,projected,4400,,4324,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32437,WGS 72BE / UTM zone 37N,1945,projected,4400,,4324,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32438,WGS 72BE / UTM zone 38N,1947,projected,4400,,4324,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32439,WGS 72BE / UTM zone 39N,1949,projected,4400,,4324,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32440,WGS 72BE / UTM zone 40N,1951,projected,4400,,4324,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32441,WGS 72BE / UTM zone 41N,1953,projected,4400,,4324,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32442,WGS 72BE / UTM zone 42N,1955,projected,4400,,4324,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32443,WGS 72BE / UTM zone 43N,1957,projected,4400,,4324,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32444,WGS 72BE / UTM zone 44N,1959,projected,4400,,4324,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32445,WGS 72BE / UTM zone 45N,1961,projected,4400,,4324,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32446,WGS 72BE / UTM zone 46N,1963,projected,4400,,4324,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32447,WGS 72BE / UTM zone 47N,1965,projected,4400,,4324,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32448,WGS 72BE / UTM zone 48N,1993,projected,4400,,4324,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32449,WGS 72BE / UTM zone 49N,1994,projected,4400,,4324,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32450,WGS 72BE / UTM zone 50N,1971,projected,4400,,4324,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32451,WGS 72BE / UTM zone 51N,1973,projected,4400,,4324,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32452,WGS 72BE / UTM zone 52N,1975,projected,4400,,4324,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32453,WGS 72BE / UTM zone 53N,1977,projected,4400,,4324,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32454,WGS 72BE / UTM zone 54N,1979,projected,4400,,4324,16054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32455,WGS 72BE / UTM zone 55N,1981,projected,4400,,4324,16055,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32456,WGS 72BE / UTM zone 56N,1983,projected,4400,,4324,16056,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32457,WGS 72BE / UTM zone 57N,1985,projected,4400,,4324,16057,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32458,WGS 72BE / UTM zone 58N,1987,projected,4400,,4324,16058,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32459,WGS 72BE / UTM zone 59N,1989,projected,4400,,4324,16059,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32460,WGS 72BE / UTM zone 60N,1991,projected,4400,,4324,16060,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32501,WGS 72BE / UTM zone 1S,1874,projected,4400,,4324,16101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32502,WGS 72BE / UTM zone 2S,1876,projected,4400,,4324,16102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32503,WGS 72BE / UTM zone 3S,1878,projected,4400,,4324,16103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32504,WGS 72BE / UTM zone 4S,1880,projected,4400,,4324,16104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32505,WGS 72BE / UTM zone 5S,1882,projected,4400,,4324,16105,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32506,WGS 72BE / UTM zone 6S,1884,projected,4400,,4324,16106,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32507,WGS 72BE / UTM zone 7S,1886,projected,4400,,4324,16107,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32508,WGS 72BE / UTM zone 8S,1888,projected,4400,,4324,16108,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32509,WGS 72BE / UTM zone 9S,1890,projected,4400,,4324,16109,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32510,WGS 72BE / UTM zone 10S,1892,projected,4400,,4324,16110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32511,WGS 72BE / UTM zone 11S,1894,projected,4400,,4324,16111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32512,WGS 72BE / UTM zone 12S,1896,projected,4400,,4324,16112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32513,WGS 72BE / UTM zone 13S,1898,projected,4400,,4324,16113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32514,WGS 72BE / UTM zone 14S,1900,projected,4400,,4324,16114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32515,WGS 72BE / UTM zone 15S,1902,projected,4400,,4324,16115,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32516,WGS 72BE / UTM zone 16S,1904,projected,4400,,4324,16116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32517,WGS 72BE / UTM zone 17S,1906,projected,4400,,4324,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32518,WGS 72BE / UTM zone 18S,1908,projected,4400,,4324,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32519,WGS 72BE / UTM zone 19S,1910,projected,4400,,4324,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32520,WGS 72BE / UTM zone 20S,1912,projected,4400,,4324,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32521,WGS 72BE / UTM zone 21S,1914,projected,4400,,4324,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32522,WGS 72BE / UTM zone 22S,1916,projected,4400,,4324,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32523,WGS 72BE / UTM zone 23S,1918,projected,4400,,4324,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32524,WGS 72BE / UTM zone 24S,1920,projected,4400,,4324,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32525,WGS 72BE / UTM zone 25S,1922,projected,4400,,4324,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32526,WGS 72BE / UTM zone 26S,1924,projected,4400,,4324,16126,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32527,WGS 72BE / UTM zone 27S,1926,projected,4400,,4324,16127,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32528,WGS 72BE / UTM zone 28S,1928,projected,4400,,4324,16128,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32529,WGS 72BE / UTM zone 29S,1930,projected,4400,,4324,16129,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32530,WGS 72BE / UTM zone 30S,1932,projected,4400,,4324,16130,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32531,WGS 72BE / UTM zone 31S,1934,projected,4400,,4324,16131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32532,WGS 72BE / UTM zone 32S,1936,projected,4400,,4324,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32533,WGS 72BE / UTM zone 33S,1938,projected,4400,,4324,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32534,WGS 72BE / UTM zone 34S,1940,projected,4400,,4324,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32535,WGS 72BE / UTM zone 35S,1942,projected,4400,,4324,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32536,WGS 72BE / UTM zone 36S,1944,projected,4400,,4324,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32537,WGS 72BE / UTM zone 37S,1946,projected,4400,,4324,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32538,WGS 72BE / UTM zone 38S,1948,projected,4400,,4324,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32539,WGS 72BE / UTM zone 39S,1950,projected,4400,,4324,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32540,WGS 72BE / UTM zone 40S,1952,projected,4400,,4324,16140,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32541,WGS 72BE / UTM zone 41S,1954,projected,4400,,4324,16141,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32542,WGS 72BE / UTM zone 42S,1956,projected,4400,,4324,16142,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32543,WGS 72BE / UTM zone 43S,1958,projected,4400,,4324,16143,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32544,WGS 72BE / UTM zone 44S,1960,projected,4400,,4324,16144,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32545,WGS 72BE / UTM zone 45S,1962,projected,4400,,4324,16145,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32546,WGS 72BE / UTM zone 46S,1964,projected,4400,,4324,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32547,WGS 72BE / UTM zone 47S,1966,projected,4400,,4324,16147,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32548,WGS 72BE / UTM zone 48S,1968,projected,4400,,4324,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32549,WGS 72BE / UTM zone 49S,1995,projected,4400,,4324,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32550,WGS 72BE / UTM zone 50S,1972,projected,4400,,4324,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32551,WGS 72BE / UTM zone 51S,1974,projected,4400,,4324,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32552,WGS 72BE / UTM zone 52S,1976,projected,4400,,4324,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32553,WGS 72BE / UTM zone 53S,1978,projected,4400,,4324,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32554,WGS 72BE / UTM zone 54S,1980,projected,4400,,4324,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32555,WGS 72BE / UTM zone 55S,1982,projected,4400,,4324,16155,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32556,WGS 72BE / UTM zone 56S,1984,projected,4400,,4324,16156,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32557,WGS 72BE / UTM zone 57S,1986,projected,4400,,4324,16157,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32558,WGS 72BE / UTM zone 58S,1988,projected,4400,,4324,16158,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32559,WGS 72BE / UTM zone 59S,1990,projected,4400,,4324,16159,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32560,WGS 72BE / UTM zone 60S,1992,projected,4400,,4324,16160,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32600,WGS 84 / UTM grid system (northern hemisphere),1998,projected,4400,,4326,16000,,,For strict use within zone boundaries,Use WGS 84 / UTM zone xx N (codes 32601-32660) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+32601,WGS 84 / UTM zone 1N,2000,projected,4400,,4326,16001,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32602,WGS 84 / UTM zone 2N,2002,projected,4400,,4326,16002,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32603,WGS 84 / UTM zone 3N,2004,projected,4400,,4326,16003,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32604,WGS 84 / UTM zone 4N,2006,projected,4400,,4326,16004,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32605,WGS 84 / UTM zone 5N,2008,projected,4400,,4326,16005,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32606,WGS 84 / UTM zone 6N,2010,projected,4400,,4326,16006,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32607,WGS 84 / UTM zone 7N,2012,projected,4400,,4326,16007,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32608,WGS 84 / UTM zone 8N,2014,projected,4400,,4326,16008,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32609,WGS 84 / UTM zone 9N,2016,projected,4400,,4326,16009,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32610,WGS 84 / UTM zone 10N,2018,projected,4400,,4326,16010,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32611,WGS 84 / UTM zone 11N,2020,projected,4400,,4326,16011,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32612,WGS 84 / UTM zone 12N,2022,projected,4400,,4326,16012,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32613,WGS 84 / UTM zone 13N,2024,projected,4400,,4326,16013,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32614,WGS 84 / UTM zone 14N,2026,projected,4400,,4326,16014,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32615,WGS 84 / UTM zone 15N,2028,projected,4400,,4326,16015,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32616,WGS 84 / UTM zone 16N,2030,projected,4400,,4326,16016,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32617,WGS 84 / UTM zone 17N,2032,projected,4400,,4326,16017,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32618,WGS 84 / UTM zone 18N,2034,projected,4400,,4326,16018,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32619,WGS 84 / UTM zone 19N,2036,projected,4400,,4326,16019,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32620,WGS 84 / UTM zone 20N,2038,projected,4400,,4326,16020,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32621,WGS 84 / UTM zone 21N,2040,projected,4400,,4326,16021,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32622,WGS 84 / UTM zone 22N,2042,projected,4400,,4326,16022,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32623,WGS 84 / UTM zone 23N,2044,projected,4400,,4326,16023,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32624,WGS 84 / UTM zone 24N,2046,projected,4400,,4326,16024,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32625,WGS 84 / UTM zone 25N,2048,projected,4400,,4326,16025,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32626,WGS 84 / UTM zone 26N,2050,projected,4400,,4326,16026,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32627,WGS 84 / UTM zone 27N,2052,projected,4400,,4326,16027,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32628,WGS 84 / UTM zone 28N,2054,projected,4400,,4326,16028,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32629,WGS 84 / UTM zone 29N,2056,projected,4400,,4326,16029,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32630,WGS 84 / UTM zone 30N,2058,projected,4400,,4326,16030,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32631,WGS 84 / UTM zone 31N,2060,projected,4400,,4326,16031,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32632,WGS 84 / UTM zone 32N,2062,projected,4400,,4326,16032,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32633,WGS 84 / UTM zone 33N,2064,projected,4400,,4326,16033,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32634,WGS 84 / UTM zone 34N,2066,projected,4400,,4326,16034,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32635,WGS 84 / UTM zone 35N,2068,projected,4400,,4326,16035,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32636,WGS 84 / UTM zone 36N,2070,projected,4400,,4326,16036,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32637,WGS 84 / UTM zone 37N,2072,projected,4400,,4326,16037,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32638,WGS 84 / UTM zone 38N,2074,projected,4400,,4326,16038,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32639,WGS 84 / UTM zone 39N,2076,projected,4400,,4326,16039,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32640,WGS 84 / UTM zone 40N,2078,projected,4400,,4326,16040,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32641,WGS 84 / UTM zone 41N,2080,projected,4400,,4326,16041,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32642,WGS 84 / UTM zone 42N,2082,projected,4400,,4326,16042,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32643,WGS 84 / UTM zone 43N,2084,projected,4400,,4326,16043,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32644,WGS 84 / UTM zone 44N,2086,projected,4400,,4326,16044,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32645,WGS 84 / UTM zone 45N,2088,projected,4400,,4326,16045,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32646,WGS 84 / UTM zone 46N,2090,projected,4400,,4326,16046,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32647,WGS 84 / UTM zone 47N,2092,projected,4400,,4326,16047,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32648,WGS 84 / UTM zone 48N,2094,projected,4400,,4326,16048,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32649,WGS 84 / UTM zone 49N,2096,projected,4400,,4326,16049,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32650,WGS 84 / UTM zone 50N,2098,projected,4400,,4326,16050,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32651,WGS 84 / UTM zone 51N,2100,projected,4400,,4326,16051,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32652,WGS 84 / UTM zone 52N,2102,projected,4400,,4326,16052,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32653,WGS 84 / UTM zone 53N,2104,projected,4400,,4326,16053,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32654,WGS 84 / UTM zone 54N,2106,projected,4400,,4326,16054,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32655,WGS 84 / UTM zone 55N,2108,projected,4400,,4326,16055,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32656,WGS 84 / UTM zone 56N,2110,projected,4400,,4326,16056,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32657,WGS 84 / UTM zone 57N,2112,projected,4400,,4326,16057,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32658,WGS 84 / UTM zone 58N,2114,projected,4400,,4326,16058,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32659,WGS 84 / UTM zone 59N,2116,projected,4400,,4326,16059,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32660,WGS 84 / UTM zone 60N,2118,projected,4400,,4326,16060,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32661,WGS 84 / UPS North,1996,projected,4400,,4326,16061,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-09-12 00:00:00,,1,0
+32662,WGS 84 / Plate Carree,1262,projected,4499,,4326,19968,,,Graticule coordinates expressed in simple Cartesian form.,Origin is at intersection of equator and Greenwich meridian. Note: this is not the same as plotting unrectified graticule coordinates on a computer display using the so-called pseudo Plate Carr�e method: here the grid units are metres.,EPSG,EPSG,2001-11-06 00:00:00,,1,0
+32700,WGS 84 / UTM grid system (southern hemisphere),1999,projected,4400,,4326,16100,,,For strict use within zone boundaries,Use WGS 84 / UTM zone xx S (codes 32701-32760) for use outwith zone boundary or when easting is not prefixed by zone number.,EPSG,EPSG,2001-06-05 00:00:00,,1,0
+32701,WGS 84 / UTM zone 1S,2001,projected,4400,,4326,16101,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32702,WGS 84 / UTM zone 2S,2003,projected,4400,,4326,16102,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32703,WGS 84 / UTM zone 3S,2005,projected,4400,,4326,16103,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32704,WGS 84 / UTM zone 4S,2007,projected,4400,,4326,16104,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32705,WGS 84 / UTM zone 5S,2009,projected,4400,,4326,16105,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32706,WGS 84 / UTM zone 6S,2011,projected,4400,,4326,16106,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32707,WGS 84 / UTM zone 7S,2013,projected,4400,,4326,16107,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32708,WGS 84 / UTM zone 8S,2015,projected,4400,,4326,16108,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32709,WGS 84 / UTM zone 9S,2017,projected,4400,,4326,16109,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32710,WGS 84 / UTM zone 10S,2019,projected,4400,,4326,16110,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32711,WGS 84 / UTM zone 11S,2021,projected,4400,,4326,16111,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32712,WGS 84 / UTM zone 12S,2023,projected,4400,,4326,16112,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32713,WGS 84 / UTM zone 13S,2025,projected,4400,,4326,16113,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32714,WGS 84 / UTM zone 14S,2027,projected,4400,,4326,16114,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32715,WGS 84 / UTM zone 15S,2029,projected,4400,,4326,16115,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32716,WGS 84 / UTM zone 16S,2031,projected,4400,,4326,16116,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32717,WGS 84 / UTM zone 17S,2033,projected,4400,,4326,16117,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32718,WGS 84 / UTM zone 18S,2035,projected,4400,,4326,16118,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32719,WGS 84 / UTM zone 19S,2037,projected,4400,,4326,16119,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32720,WGS 84 / UTM zone 20S,2039,projected,4400,,4326,16120,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32721,WGS 84 / UTM zone 21S,2041,projected,4400,,4326,16121,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32722,WGS 84 / UTM zone 22S,2043,projected,4400,,4326,16122,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32723,WGS 84 / UTM zone 23S,2045,projected,4400,,4326,16123,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32724,WGS 84 / UTM zone 24S,2047,projected,4400,,4326,16124,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32725,WGS 84 / UTM zone 25S,2049,projected,4400,,4326,16125,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32726,WGS 84 / UTM zone 26S,2051,projected,4400,,4326,16126,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32727,WGS 84 / UTM zone 27S,2053,projected,4400,,4326,16127,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32728,WGS 84 / UTM zone 28S,2055,projected,4400,,4326,16128,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32729,WGS 84 / UTM zone 29S,2057,projected,4400,,4326,16129,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32730,WGS 84 / UTM zone 30S,2059,projected,4400,,4326,16130,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32731,WGS 84 / UTM zone 31S,2061,projected,4400,,4326,16131,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32732,WGS 84 / UTM zone 32S,2063,projected,4400,,4326,16132,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32733,WGS 84 / UTM zone 33S,2065,projected,4400,,4326,16133,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32734,WGS 84 / UTM zone 34S,2067,projected,4400,,4326,16134,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32735,WGS 84 / UTM zone 35S,2069,projected,4400,,4326,16135,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32736,WGS 84 / UTM zone 36S,2071,projected,4400,,4326,16136,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32737,WGS 84 / UTM zone 37S,2073,projected,4400,,4326,16137,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32738,WGS 84 / UTM zone 38S,2075,projected,4400,,4326,16138,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32739,WGS 84 / UTM zone 39S,2077,projected,4400,,4326,16139,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32740,WGS 84 / UTM zone 40S,2079,projected,4400,,4326,16140,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32741,WGS 84 / UTM zone 41S,2081,projected,4400,,4326,16141,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32742,WGS 84 / UTM zone 42S,2083,projected,4400,,4326,16142,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32743,WGS 84 / UTM zone 43S,2085,projected,4400,,4326,16143,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32744,WGS 84 / UTM zone 44S,2087,projected,4400,,4326,16144,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32745,WGS 84 / UTM zone 45S,2089,projected,4400,,4326,16145,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32746,WGS 84 / UTM zone 46S,2091,projected,4400,,4326,16146,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32747,WGS 84 / UTM zone 47S,2093,projected,4400,,4326,16147,,,Large and medium scale topographic mapping and engineering survey.Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32748,WGS 84 / UTM zone 48S,2095,projected,4400,,4326,16148,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32749,WGS 84 / UTM zone 49S,2097,projected,4400,,4326,16149,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32750,WGS 84 / UTM zone 50S,2099,projected,4400,,4326,16150,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32751,WGS 84 / UTM zone 51S,2101,projected,4400,,4326,16151,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32752,WGS 84 / UTM zone 52S,2103,projected,4400,,4326,16152,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32753,WGS 84 / UTM zone 53S,2105,projected,4400,,4326,16153,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32754,WGS 84 / UTM zone 54S,2107,projected,4400,,4326,16154,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,2002-06-22 00:00:00,2002.151,1,0
+32755,WGS 84 / UTM zone 55S,2109,projected,4400,,4326,16155,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32756,WGS 84 / UTM zone 56S,2111,projected,4400,,4326,16156,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32757,WGS 84 / UTM zone 57S,2113,projected,4400,,4326,16157,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32758,WGS 84 / UTM zone 58S,2115,projected,4400,,4326,16158,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32759,WGS 84 / UTM zone 59S,2117,projected,4400,,4326,16159,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32760,WGS 84 / UTM zone 60S,2119,projected,4400,,4326,16160,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1995-06-02 00:00:00,,1,0
+32761,WGS 84 / UPS South,1997,projected,4400,,4326,16161,,,Large and medium scale topographic mapping and engineering survey.,,,EPSG,1996-09-12 00:00:00,,1,0
+32766,WGS 84 / TM 36 SE,1726,projected,4400,,4326,16636,,,Used for oil exploration by BP Mozambique for Offshore Zambezi block oil exploration.,,BP Mozambique.,EPSG,1998-11-11 00:00:00,,1,0
diff --git a/src/tiff/csv/coordinate_system.csv b/src/tiff/csv/coordinate_system.csv
new file mode 100644
index 0000000..bd6c254
--- /dev/null
+++ b/src/tiff/csv/coordinate_system.csv
@@ -0,0 +1,38 @@
+"COORD_SYS_CODE","COORD_SYS_NAME","COORD_SYS_TYPE","DIMENSION","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+4400,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4401,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: chBnB.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4402,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: chSe.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4403,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: ftCla.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4404,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: ftGC.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4405,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: ftSe.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4406,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: km.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4407,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: lkCla.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4408,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: ydInd.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4409,"Cartesian 2D CS.  Axes: easting, northing (E,N). Orientations: east, north.  UoM: ydSe.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4495,"Cartesian 2D CS.  Axes: easting, northing (X,Y). Orientations: east, north.  UoM: ft.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-11-06 00:00:00,,0
+4496,"Cartesian 2D CS.  Axes: easting, northing [E(X),N(Y)]. Orientations: east, north.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4497,"Cartesian 2D CS.  Axes: easting, northing (X,Y). Orientations: east, north.  UoM: ftUS.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4498,"Cartesian 2D CS.  Axes: easting, northing (Y,X). Orientations: east, north.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4499,"Cartesian 2D CS.  Axes: easting, northing (X,Y). Orientations: east, north.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4500,"Cartesian 2D CS.  Axes: northing, easting (N,E). Orientations: north, east.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4501,"Cartesian 2D CS.  Axes: northing, westing (N,E). Orientations: north, west.  UoM: m.",Cartesian,2,Used in Danish projected coordinate reference systems. Note that second axis has abbreviation E but is positive west.,EPSG,EPSG,2002-01-26 00:00:00,,0
+4530,"Cartesian 2D CS.  Axes: northing, easting (X,Y). Orientations: north, east.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4531,"Cartesian 2D CS.  Axes: northing, easting (x,y). Orientations: north, east.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+4532,"Cartesian 2D CS.  Axes: northing, easting (Y,X). Orientations: north, east.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6401,"Ellipsoidal 3D CS. Axes: latitude, longitude, ellipsoidal height. Orientations: east, north, up.  UoM: DMSH,metres.",ellipsoidal,3,Used in geographic 3D coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6402,"Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: east, north.  UoM: DMSH.",ellipsoidal,2,Used in geographic 2D coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6403,"Ellipsoidal 2D CS. Axes: latitude, longitude. Orientations: east, north.  UoM: grads.",ellipsoidal,2,Used in geographic 2D coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6404,"Spherical 3D CS. Axes: latitude, longitude, radius. Orientations: north, east, up.  UoM: degrees, degrees, metres.",spherical,3,Used in geocentric 3D coordinate reference systems.,Open GIS Consortium,EPSG,2002-06-22 00:00:00,2002.30,0
+6497,Gravity-related CS. Axis: height (H). Orientation: up.  UoM: ftUS.,gravity-related,1,Used in vertical coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6498,Gravity-related CS. Axis: depth (D). Orientation: down.  UoM: m.,gravity-related,1,Used in vertical coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6499,Gravity-related CS. Axis: height (H). Orientation: up.  UoM: m.,gravity-related,1,Used in vertical coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6500,"Earth centred, earth fixed, righthanded 3D coordinate system, consisting of 3 orthogonal axes with X and Y axes in the equatorial plane,  positive Z-axis parallel to mean earth rotation axis and pointing towards North Pole. UoM: m.",Cartesian,3,"Cartesian 3D CS, used in geocentric coordinate reference systems.",EPSG,EPSG,2001-01-19 00:00:00,,0
+6501,"Cartesian 2D CS.  Axes: southing, westing (X,Y). Orientations: south, west.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6502,"Cartesian 2D CS.  Axes: westing, southing (Y,X). Orientations: west, south.  UoM: GLM.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6503,"Cartesian 2D CS.  Axes: westing, southing (Y,X). Orientations: west, south.  UoM: m.",Cartesian,2,Used in projected and engineering coordinate reference systems.,EPSG,EPSG,2001-04-29 00:00:00,,0
+6504,"Cartesian 2D CS.  Axes: plant N, Plant E (n,e). Orientations: northwest, northeast.  UoM: m.",Cartesian,2,Used in engineering coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6505,"Cartesian 2D CS.  Axes: 1st local axis, 2nd local axis (n,e). Orientations: northwest, northeast.  UoM: m.",Cartesian,2,Used in engineering coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6506,"Cartesian 2D CS.  Axes: 1st local axis, 2nd local axis (I,J). Orientations: ese/nne.  UoM: 165 x 330 ftUS.",Cartesian,2,Used in engineering coordinate reference systems for seismic bin grids.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6507,"Cartesian 2D CS.  Axes: 1st local axis, 2nd local axis (X,Y). Orientations: north, west.  UoM: m.",Cartesian,2,Used in engineering coordinate reference systems.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6508,"Cartesian 2D CS.  Axes: bin grid J, bin grid I (J,I). Orientations: nne/ese.  UoM: 12.5 x 25m.",Cartesian,2,Used in engineering coordinate reference systems for seismic bin grids.,EPSG,EPSG,2001-01-19 00:00:00,,0
+6509,"Cartesian 2D CS.  Axes: southing, westing (P,M). Orientations: south, west.  UoM: m.",Cartesian,2,Used in old projected coordinate reference systems in Portugal.,EPSG,EPSG,2002-07-13 00:00:00,,0
diff --git a/src/tiff/csv/datum.csv b/src/tiff/csv/datum.csv
new file mode 100644
index 0000000..de0f951
--- /dev/null
+++ b/src/tiff/csv/datum.csv
@@ -0,0 +1,332 @@
+"DATUM_CODE","DATUM_NAME","DATUM_TYPE","ORIGIN_DESCRIPTION","REALIZATION_EPOCH","ELLIPSOID_CODE","PRIME_MERIDIAN_CODE","AREA_OF_USE_CODE","DATUM_SCOPE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+5100,Mean Sea Level,vertical,,,,,1262,Hydrography.,"msl has geographic and temporal components.  Users are advised to not use this generic vertical datum but to define specific instances of msl based on knowledge of these components; for instance ""msl at xxx during 19yy"".",,EPSG,1996-04-12 00:00:00,,0
+5101,Ordnance Datum Newlyn,vertical,,,,,1264,"Topographic mapping, geodesy.",,,EPSG,1996-10-18 00:00:00,,0
+5102,National Geodetic Vertical Datum 1929,vertical,26 tide gauges in the US and Canada.,1929,,,1323,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5103,North American Vertical Datum 1988,vertical,"Father's Point, Rimouski, Quebec.",1988,,,1325,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5104,Yellow Sea 1956,vertical,2 years tide readings at Qingdao.,1956,,,1067,"Topographic mapping, geodesy.",Superseded by Yellow Sea 1985 datum.,,EPSG,2002-06-22 00:00:00,2002.16,0
+5105,Baltic Sea,vertical,Average water level at Kronshtadt,,,,1284,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5106,Caspian Sea,vertical,Defined as -28.0m Baltic datum,,,,1291,Hydrography.,,,EPSG,1996-09-12 00:00:00,,0
+5107,Nivellement general de la France,vertical,Mean sea level at Marseille,,,,1326,"Topographic mapping, geodesy.",The CNIG states that NGF is a general term applying to all vertical network readjustments of France and recommends more specific terminology. See codes 5118-5120.,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1996-09-12 00:00:00,,1
+5109,Normaal Amsterdams Peil,vertical,,,,,1172,"Topographic mapping, geodesy, hydrography.",,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,1996-09-12 00:00:00,,0
+5110,Oostende,vertical,Mean low water during 1958,1958,,,1044,"Topographic mapping, geodesy.",,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,1996-09-12 00:00:00,,0
+5111,Australian Height Datum,vertical,MSL 1966-68 at 30 gauges around coast.,1968,,,1281,"Topographic mapping, geodesy.",,http://www.auslig.gov.au/geodesy,EPSG,1996-09-12 00:00:00,,0
+5112,Australian Height Datum (Tasmania),vertical,MSL 1972 at Hobart and Burnie.,1972,,,1282,"Topographic mapping, geodesy.",,,EPSG,1996-09-12 00:00:00,,0
+5113,Sea Level,vertical,,,,,1262,Hydrography.,An unspecified local vertical datum not recommended for use.,,EPSG,1996-09-12 00:00:00,,0
+5114,Canadian Vertical Datum of 1928,vertical,,1928,,,1289,"Topographic mapping, geodesy.",,,EPSG,1996-12-12 00:00:00,,0
+5115,Piraeus Harbour 1986,vertical,MSL determined during 1986.,1986,,,1106,"Topographic mapping, geodesy.",,Geodesy Department; Public Pertoleum Corporation of Greece,EPSG,1997-06-16 00:00:00,,0
+5116,Helsinki 1960,vertical,MSL at Helsinki during 1960.,1960,,,1095,"Topographic mapping, geodesy.",,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,0
+5117,Rikets hoghtsystem 1970,vertical,,1970,,,1225,"Topographic mapping, geodesy.",,National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,0
+5118,Nivellement general de la France - Lalle,vertical,Mean sea level at Marseille.,,,,1326,"Geodesy, topographic mapping, engineering survey.",,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1997-11-13 00:00:00,2001.47,0
+5119,Nivellement general de la France - IGN69,vertical,Mean sea level at Marseille.,1969,,,1326,"Geodesy, topographic mapping, engineering survey.",,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1997-11-13 00:00:00,2001.47,0
+5120,Nivellement general de la France - IGN78,vertical,,1978,,,1327,"Geodesy, topographic mapping, engineering survey.",,"Conseil National de l'Information Geographique groupe de travail ""Reseaux de Nivellement"" recommendations v5.1 April 1994.",EPSG,1997-11-13 00:00:00,2001.47,0
+5121,Maputo,vertical,Mean sea level at Maputo.,,,,1167,Topographic mapping.,,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+5122,Japanese Standard Levelling Datum 1949,vertical,24.4140 metres above mean sea level Tokyo Bay.,1949,,,1129,"Topographic mapping, geodesy.",,Ministry of Construction; Japan.  http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,2002.08,0
+5123,PDO Height Datum 1993,vertical,,1993,,,1183,Oil industry mapping.,Misclosure between Muscat and Salalah less than .5 meters with differences from of up to 5 meters from old Fahud Datum.  The PHD93 adjustment was initially known as the Spine.  Supercedes Fahud Vertical Datum (Code 5124) from 1993.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,0
+5124,Fahud Height Datum,vertical,,,,,1183,Oil industry mapping.,Superceded by PHD93 Datum (Code 5123) in 1993.  Based on reciprocal trigonometric heighting based on single MSL determination at Mina Al Fahal.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,0
+5125,Ha Tien 1960,vertical,,1960,,,1302,"Topographic mapping, geodesy.",In Vietnam replaced by Hon Dau in 1992.,,EPSG,1999-10-20 00:00:00,,0
+5126,Hon Dau 1992,vertical,,1992,,,1252,"Topographic mapping, geodesy.",Supersedes Ha Tien in Vietnam.,,EPSG,1999-10-20 00:00:00,,0
+5127,Landesnivellement 1902,vertical,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,1902,,,1286,"Topographic mapping, geodesy.",,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+5128,Landeshohennetz 1995,vertical,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,1995,,,1286,"Geodesy, cadastre, topographic mapping, engineering survey.",,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+5129,European Vertical Reference Frame 2000,vertical,Geopotential number at Normaal Amsterdams Peil is zero.,2000,,,1299,Geodesy.,Realised by geopotential numbers and normal heights of the United European Levelling Network.,,EPSG,2000-10-19 00:00:00,,0
+5130,Malin Head,vertical,Mean sea level between January 1960 and December 1969.,1970,,,1305,Topographic mapping,,Ordnance Survey Ireland,EPSG,2001-11-06 00:00:00,,0
+5131,Belfast,vertical,"Mean sea level between 1951 and 1956 at Clarendon Dock, Belfast.",1957,,,2530,Large scale topographic mapping,,Ordnance Survey Northern Ireland,EPSG,2001-11-06 00:00:00,,0
+5132,Dansk Normal Nul,vertical,,,,,1080,Topographic mapping and engineering survey,,Kort & Matrikelstyrelsen,EPSG,2001-11-06 00:00:00,,0
+5133,AIOC 1995,vertical,Average level of Caspian Sea at the Oil Rocks tide gauge June-September 1995.,1995,,,2592,Oil industry mapping.,AIOC 1995 datum is 1.7m above Caspian datum and 26.3m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,0
+5134,Black Sea,vertical,,,,,1102,Hydrographic surveying and since break-up of Former Soviet Union also topographic mapping.,Black Sea datum is 0.4m below Baltic datum.,BP,EPSG,2002-02-12 00:00:00,,0
+5135,Hong Kong Principal Datum,vertical,"1.23m below the mean of 19 years (1965-83) observations of tide levels at North Point, Victoria Harbour.",1980,,,1118,"Geodesy, engineering survey, cadastre.",,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,0
+5136,Hong Kong Chart Datum,vertical,Approximates to Lowest Astronomic Tide level (LAT).,,,,1118,Hydrographic survey and charting.,Chart datum is 0.15 metres below Hong Kong Principal Datum (code 5135) and 1.38m below MSL at Quarry Bay.,"Survey and Mapping Office, Lands Department. Http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,0
+5137,Yellow Sea 1985,vertical,20 years tide readings at Qingdao.,1985,,,1067,"Topographic mapping, geodesy.",Supersedes Yellow Sea 1956 datum.,Guangdong Province Land Resource Information Centre,EPSG,2002-06-22 00:00:00,,0
+6001,Not specified (based on Airy 1830 ellipsoid),geodetic,,,7001,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6002,Not specified (based on Airy Modified 1849 ellipsoid),geodetic,,,7002,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6003,Not specified (based on Australian National Spheroid),geodetic,,,7003,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6004,Not specified (based on Bessel 1841 ellipsoid),geodetic,,,7004,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6005,Not specified (based on Bessel Modified ellipsoid),geodetic,,,7005,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6006,Not specified (based on Bessel Namibia ellipsoid),geodetic,,,7046,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2001-01-21 00:00:00,96.08  2000.42  2001.15,0
+6007,Not specified (based on Clarke 1858 ellipsoid),geodetic,,,7007,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6008,Not specified (based on Clarke 1866 ellipsoid),geodetic,,,7008,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6009,Not specified (based on Clarke 1866 Michigan ellipsoid),geodetic,,,7009,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6010,Not specified (based on Clarke 1880 (Benoit) ellipsoid),geodetic,,,7010,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6011,Not specified (based on Clarke 1880 (IGN) ellipsoid),geodetic,,,7011,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6012,Not specified (based on Clarke 1880 (RGS) ellipsoid),geodetic,,,7012,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6013,Not specified (based on Clarke 1880 (Arc) ellipsoid),geodetic,,,7013,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6014,Not specified (based on Clarke 1880 (SGA 1922) ellipsoid),geodetic,,,7014,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6015,Not specified (based on Everest 1830 (1937 Adjustment) ellipsoid),geodetic,,,7015,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6016,Not specified (based on Everest 1830 (1967 Definition) ellipsoid),geodetic,,,7016,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6018,Not specified (based on Everest 1830 Modified ellipsoid),geodetic,,,7018,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6019,Not specified (based on GRS 1980 ellipsoid),geodetic,,,7019,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6020,Not specified (based on Helmert 1906 ellipsoid),geodetic,,,7020,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6021,Not specified (based on Indonesian National Spheroid),geodetic,,,7021,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6022,Not specified (based on International 1924 ellipsoid),geodetic,,,7022,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6024,Not specified (based on Krassowsky 1940 ellipsoid),geodetic,,,7024,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6025,Not specified (based on NWL 9D ellipsoid),geodetic,,,7025,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6027,Not specified (based on Plessis 1817 ellipsoid),geodetic,,,7027,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6028,Not specified (based on Struve 1860 ellipsoid),geodetic,,,7028,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6029,Not specified (based on War Office ellipsoid),geodetic,,,7029,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6030,Not specified (based on WGS 84 ellipsoid),geodetic,,,7030,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6031,Not specified (based on GEM 10C ellipsoid),geodetic,,,7031,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6032,Not specified (based on OSU86F ellipsoid),geodetic,,,7032,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6033,Not specified (based on OSU91A ellipsoid),geodetic,,,7033,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6034,Not specified (based on Clarke 1880 ellipsoid),geodetic,,,7034,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,96.08  2000.42,0
+6035,Not specified (based on Authalic Sphere),geodetic,,,7035,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown. Deprecated and superseded by 6047.,EPSG,EPSG,2001-06-05 00:00:00,96.08  2000.42,1
+6036,Not specified (based on GRS 1967 ellipsoid),geodetic,,,7036,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6041,Not specified (based on Average Terrestrial System 1977 ellipsoid),geodetic,,,7041,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6042,Not specified (based on Everest (1830 Definition) ellipsoid),geodetic,,,7042,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6043,Not specified (based on WGS 72 ellipsoid),geodetic,,,7043,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6044,Not specified (based on Everest 1830 (1962 Definition) ellipsoid),geodetic,,,7044,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6045,Not specified (based on Everest 1830 (1975 Definition) ellipsoid),geodetic,,,7045,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2000-05-03 00:00:00,2000.42,0
+6047,Not specified (based on GRS 1980 Authalic Sphere),geodetic,,,7047,8901,1263,Not a valid datum.,Included for coordinate reference systems where datum is unknown.,EPSG,EPSG,2001-06-25 00:00:00,2001.19,0
+6120,Greek,geodetic,Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 23 deg 42 min 58.815 sec E of Greenwich,,7004,8901,1106,Topographic mapping.,See geodetic datum alias 6404.  Used as basis of topographic mapping based on Hatt projection.,Topography Department; National Technical University of Athens,EPSG,1997-06-16 00:00:00,,0
+6121,Greek Geodetic Reference System 1987,geodetic,Fundamental point: Dionysos; latitude 38 deg 04 min 33.8 sec N; longitude 23 deg 55 min 51.0 sec E of Greenwich; geoid height 7.0 m.,1987,7019,8901,1106,Topographic mapping.,Superseded (old) Greek datum.  Oil industry work based on ED50.,L. Portokalakis; Public Petroleum Corporation of Greece,EPSG,1997-06-16 00:00:00,,0
+6122,Average Terrestrial System 1977,geodetic,,1977,7041,8901,1283,Topographic mapping.,In use from 1979.  To be phased out in late 1990's.,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,1997-07-02 00:00:00,,0
+6123,Kartasto Koordinaati Jarjestelma 1966,geodetic,Adjustment with fundamental point SF31 based on ED50 transformed to best fit the older VVJ adjustment.,1966,7022,8901,1095,"Geodesy, cadastre, topographic mapping, engineering survey.",Adopted in 1970.,www.nls.fi/maa/papers/kkj.html,EPSG,1997-07-22 00:00:00,,0
+6124,Rikets koordinatsystem 1990,geodetic,,1982,7004,8901,1225,"Geodesy, cadastre, topographic mapping, engineering survey.",Supersedes RT38 adjustment (datum code 6308),National Land Survey of Sweden,EPSG,1997-11-13 00:00:00,,0
+6125,Samboja,geodetic,Original origin station P2 Exc now destroyed.  Extensions recomputed using Toran station T9 as origin.,,7004,8901,1328,Topographic mapping.,,Total Indonesia.,EPSG,1997-11-13 00:00:00,,1
+6126,Lithuania 1994 (ETRS89),geodetic,Densification from 4  ETRS89 points.,1994,7019,8901,1145,"Topographic mapping, geodesy.",Densification of ETRS89 during the 1992 Baltic campaign.,HNIT-Baltic GeoInfoServisas,EPSG,1998-03-12 00:00:00,,0
+6127,Tete,geodetic,Fundamental point: Tete.,,7008,8901,1167,Topographic mapping.,,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6128,Madzansua,geodetic,Fundamental point: Madzansua.,,7008,8901,1315,Topographic mapping.,Superseded by transformation to Tete datum (datum code 6127).,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6129,Observatario,geodetic,Fundamental point: Maputo observatory.,,7008,8901,1329,Topographic mapping.,Superseded by transformation to Tete datum (datum code 6127).,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6130,Moznet (ITRF94),geodetic,ITRF 1994 epoch 20,,7030,8901,1167,Topographic mapping.,,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,1998-04-16 00:00:00,,0
+6131,Indian 1960,geodetic,,,7015,8901,1302,Topographic mapping.,DMA adjustment of IndoChina part of the Indian 1954 network to better fit local geoid.  Also known as Indian (DMA Reduced).,,EPSG,1998-11-11 00:00:00,,0
+6132,Final Datum 1958,geodetic,Fundamental point: Maniyur.  Latitude: 31 deg 23 min 59.19 sec N; Longitude: 48 deg 32 min 31.38 sec E (of Greenwich).,,7012,8901,1300,Oil industry mapping.,Network included in Nahrwan 1967 adjustment.,IOEPC records,EPSG,1998-11-11 00:00:00,,0
+6133,Estonia 1992,geodetic,Densification from 4  ETRS89 points.,1992,7019,8901,1090,"Topographic mapping, geodesy.",Based on ETRS89 as established during the 1992 Baltic campaign. Superseded by Estonia 1997 adjustment (code 6180).,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,1998-12-14 00:00:00,,0
+6134,PDO Survey Datum 1993,geodetic,Adjustment best fitted to Fahud network.,1993,7012,8901,1183,Oil industry mapping.,Supersedes Fahud datum (code 6232). Maximum differences to Fahud adjustment are 20 metres.,Petroleum Development Oman,EPSG,1999-04-22 00:00:00,,0
+6135,Old Hawaiian,geodetic,Fundamental Point: Oahu West Base Astro.  Latitude: 21 deg 18 min 13.89 sec N; longitude 157 deg 50 min 55.79 sec W (of Greenwich),,7008,8901,1334,Topographic mapping.,Hawaiian Islands were never on NAD27 but rather on Old Hawaiian Datum.  NADCON conversion program provides transformation from Old Hawaiian Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file) and t [...]
+6136,St. Lawrence Island,geodetic,,,7008,8901,1332,Topographic mapping.,Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. Lawrence Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,1999-05-24 00:00:00,,0
+6137,St. Paul Island,geodetic,,,7008,8901,1333,Topographic mapping.,Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. Paul Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,1999-05-24 00:00:00,,0
+6138,St. George Island,geodetic,,,7008,8901,1331,Topographic mapping.,Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. George Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,1999-05-24 00:00:00,,0
+6139,Puerto Rico,geodetic,,,7008,8901,1335,Topographic mapping.,NADCON conversion program provides transformation from Puerto Rico Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.,Ordnance Survey of Great Britain and http://www.ngs.noaa.gov/ (NADCON readme file).,EPSG,1999-05-24 00:00:00,,0
+6140,NAD83 Canadian Spatial Reference System,geodetic,,1998,7019,8901,1336,Geodesy.,Supersedes ATS77 from 1999 in New Brunswick.,Service New Brunswick Land and Information Standards Manual,EPSG,1999-10-20 00:00:00,,0
+6141,Israel,geodetic,Fundamental Point:  Latitude: 31 deg 44 min 03.817 sec N; Longitude: 35 deg 12 min 16.261 sec E (of Greenwich).,,7019,8901,2603,Topographic mapping.,,Survey of Israel.,EPSG,2002-06-22 00:00:00,2002.34,0
+6142,Locodjo 1965,geodetic,Fundamental Point: T5 Banco. Latitude: 5 deg 18 min 50.5 sec N; Longitude: 4 deg 02 min 05.1 sec W (of Greenwich).,1965,7012,8901,1075,Topographic mapping.,,IGN Paris.,EPSG,1999-10-20 00:00:00,,0
+6143,Abidjan 1987,geodetic,Fundamental Point: Abidjan I. Latitude: 5 deg 18 min 51.01 sec N; Longitude: 4 deg 02 min 06.04 sec W (of Greenwich).,1987,7012,8901,1075,Topographic mapping.,,IGN Paris.,EPSG,1999-10-20 00:00:00,,0
+6144,Kalianpur 1937,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1937,7015,8901,1308,Topographic mapping.,Supersedes 1880 adjustment except for topographic mapping.  Superseded in Pakistan by 1962 metrication conversion and in India by 1975 metrication conversion.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,,0
+6145,Kalianpur 1962,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1962,7044,8901,1184,Topographic mapping.,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1962).,,EPSG,1999-10-20 00:00:00,,0
+6146,Kalianpur 1975,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1975,7045,8901,1121,Topographic mapping.,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1975).,,EPSG,1999-10-20 00:00:00,,0
+6147,Hanoi 1972,geodetic,,1972,7024,8901,1252,"Geodesy, cadastre, topographic mapping, engineering survey.",,PetroVietnam,EPSG,1999-10-20 00:00:00,,0
+6148,Hartebeesthoek94,geodetic,Coincident with ITRF91 (1994.0) at Hartebeesthoek astronomical observatory near Pretoria.,1994,7030,8901,1215,"Geodesy, cadastre, topographic mapping, engineering survey.",Supersedes Cape datum (code 6222).,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,2000-01-06 00:00:00,99.96,0
+6149,CH1903,geodetic,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).,1903,7004,8901,1286,Topographic mapping.,,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+6150,CH1903+,geodetic,Fundamental Point: Zimmerwald observatory.,,7004,8901,1286,"Geodesy, topographic mapping.",,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,2001-11-06 00:00:00,2001.52,0
+6151,Swiss Terrestrial Reference Frame 1995,geodetic,ETRF89 at 1993.0,1995,7019,8901,1286,"Geodesy, cadastre, topographic mapping, engineering survey.",,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,1999-10-20 00:00:00,,0
+6152,NAD83 (High Accuracy Regional Network),geodetic,,,7019,8901,1337,Geodesy.,,National Geodetic Survey,EPSG,1999-10-20 00:00:00,,0
+6153,Rassadiran,geodetic,Fundamental Point: Total1. Latitude: 27 deg 31 min 07.784 sec N; Longitude: 52 deg 36 min 12.741 sec E (of Greenwich).,,7022,8901,1338,Oil industry mapping.,,Total-Fina,EPSG,1999-11-20 00:00:00,,0
+6154,European Datum 1950(1977),geodetic,Extension of ED50 over Iran.,1977,7022,8901,1123,Topographic mapping.,Sometimes referred to as ED50-ED77.,National Cartographic Centre of Iran,EPSG,1999-11-20 00:00:00,,0
+6155,Dabola 1981,geodetic,,1981,7011,8901,1112,Topographic mapping.,,IGN Paris,EPSG,1999-12-09 00:00:00,,0
+6156,Jednotne Trigonometricke Site Katastralni,geodetic,"Modification of Austrian MGI datum, code 6312.",,7004,8901,1306,"Geodesy, cadastre, topographic mapping, engineering survey.",S-JTSK = System of the Unified Trigonometrical Cadastral Network.,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2001-11-06 00:00:00,2001.26  2001.51,0
+6157,Mount Dillon,geodetic,Fundamental Point: Mount Dillon triangulation station. Latitude: 11 deg  15 min 07.843 sec N; Longitude: 60 deg 41 min 09.632 sec W (of Greenwich).,,7007,8901,1322,Topographic mapping.,,University of the West Indies Geodetic Services.,EPSG,2000-03-07 00:00:00,,0
+6158,Naparima 1955,geodetic,Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).,1955,7022,8901,1339,Topographic mapping.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,2000-03-07 00:00:00,,0
+6159,European Libyan Datum 1979,geodetic,,1979,7022,8901,1143,Topographic mapping.,,Brown and Root,EPSG,2000-03-07 00:00:00,,0
+6160,Chos Malal 1914,geodetic,Chos Malal police station.,1914,7022,8901,1292,Oil industry mapping.,Also known as Quini-Huao.  Superseded by Campo Inchauspe (code 6221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,0
+6161,Pampa del Castillo,geodetic,,,7022,8901,1265,Oil industry mapping.,Used in Comodoro Rivadavia area.  Superseded by Campo Inchauspe (code 6221).,Various oil company records.,EPSG,2000-03-07 00:00:00,,0
+6162,Korean Datum 1985,geodetic,Fundamental point: Suwon; latitude 37 deg 16 min 31.9034 sec N; longitude 127 deg 03 min 05.1451 sec E of Greenwich.,1985,7004,8901,1135,Topographic mapping.,,Clifford J. Mugnier; in Photogrammetric Engineering & Remote Sensing November 1999. http://www.asprs.org/resources.html,EPSG,2000-03-07 00:00:00,2001.28,0
+6163,Yemen National Geodetic Network 1996,geodetic,Sana'a IGN reference marker,1996,7030,8901,1257,Topographic mapping.,,IGN Paris,EPSG,2000-03-07 00:00:00,,0
+6164,South Yemen,geodetic,,,7024,8901,1340,Topographic mapping.,,IGN Paris,EPSG,2000-03-07 00:00:00,,0
+6165,Bissau,geodetic,,,7022,8901,1113,Topographic mapping.,,NIMA TR8350.2,EPSG,2000-03-07 00:00:00,,0
+6166,Korean Datum 1995,geodetic,,1995,7030,8901,1135,Topographic mapping.,,NIMA TR8350.2  ftp://164.214.2.65/pub/gg/tr8350.2/changes.pdf,EPSG,2000-05-08 00:00:00,,0
+6167,New Zealand Geodetic Datum 2000,geodetic,Based on ITRF96 epoch 2000.0,2000,7019,8901,1175,"Geodesy, cadastre, topographic mapping, engineering survey.",,Land Information New Zealand.,EPSG,2000-10-19 00:00:00,,0
+6168,Accra,geodetic,Fundamental Point: GCS Station 547. Latitude: 5 deg 23 min 43.3 sec N; Longitude: 0 deg 11 min 52.3 sec W (of Greenwich).,,7029,8901,1104,Topographic mapping.,Superseded in 1978 by Leigon datum (code 6250).,Ordnance Survey International,EPSG,2000-10-12 00:00:00,,0
+6169,American Samoa 1962,geodetic,,1962,7008,8901,1027,Topographic mapping.,,NIMA TR8350.2 revision of January 2000,EPSG,2000-10-19 00:00:00,,0
+6170,Sistema de Referencia Geocentrico para America del Sur,geodetic,ITRF94 epoch 1995.42.,1995,7019,8901,1342,Geodesy.,Realised by a frame of 58 stations observed in 1995 and adjusted in the ITRF94.,NIMA TR8350.2 revision of January 2000.,EPSG,2000-10-19 00:00:00,,0
+6171,Reseau Geodesique Francais 1993,geodetic,Coincident with ETRS89,1993,7019,8901,1096,Geodesy.,,TotalFinaElf,EPSG,2001-11-06 00:00:00,2001.51,0
+6172,Posiciones Geodesicas Argentinas,geodetic,,1994,7019,8901,1033,"Topographic mapping, geodesy.","Una red geod�sica de 127 puntos materializados
+en el terreno que definen el Sistema Geod�sico Nacional.  [A geodetic network of 127 points defining the National Geodetic System.] Superseded by POSGAR98 (code 6190).",http://www.igm.gov.ar/posgar.html,EPSG,2000-10-19 00:00:00,,1
+6173,IRENET95,geodetic,ETRS89 stations in Ireland,1995,7019,8901,1305,Geodesy.,Densification of ETRS89,Ordnance Survey of Ireland,EPSG,2000-10-19 00:00:00,,0
+6174,Sierra Leone Colony 1924,geodetic,Fundamental Point: Kortright. Latitude: 8 deg 28 min 44.4 sec N; Longitude: 13 deg 13 min 03.81 sec W (of Greenwich).,1924,7029,8901,1342,"Topographic mapping, engineering survey.",,Ordnance Survey International.,EPSG,2001-06-05 00:00:00,,0
+6175,Sierra Leone 1968,geodetic,Fundamental Point: SLX2 Astro. Latitude: 8 deg 27 min 17.567 sec N; Longitude: 12 deg 49 min 40.186 sec W (of Greenwich).,1968,7012,8901,1209,"Topographic mapping, engineering survey.",Extension and readjustment with additional observations of 1960 network.  Coordinates of 1960 stations change by less than 3 metres.,Ordnance Survey International.,EPSG,2001-06-05 00:00:00,,0
+6176,Australian Antarctic Datum 1998,geodetic,,1998,7019,8901,1278,Topographic mapping.,,Standards Australia,ISO 19127,2001-06-05 00:00:00,,0
+6178,Pulkovo 1942/83,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,1983,7024,8901,1343,"Geodesy, cadastre, topographic mapping, engineering survey.",International adjustment of Uniforrm Astro-Geodetic Network of countries of central and eastern Europe.,Bundesamt f�r Kartographie und Geod�sie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6179,Pulkovo 1942/58,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,1958,7024,8901,1192,"Geodesy, cadastre, topographic mapping, engineering survey.",,Glowny Urzad Geodezji i Kartografii via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6180,Estonia 1997,geodetic,Densification of ETRS89 during EUREF-ESTONIA97 campaign through transformation from ITRF96 epoch 1997.56.,1997,7019,8901,1090,"Geodesy, cadastre, topographic mapping, engineering survey.",Supersedes Estonia 1992 adjustment (code 6133).,Estonian National Land Board via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6181,Luxembourg 1930,geodetic,Northern station of Habay-la-Neuve baseline in Belgium.,1930,7022,8901,1146,"Geodesy, cadastre, topographic mapping, engineering survey.",,Administration du Cadastre et de la Topographie via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6182,Azores Occidental Islands 1939,geodetic,Fundamental Point: Observatario Meteorologico Flores.,1939,7022,8901,1344,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6183,Azores Central Islands 1948,geodetic,Fundamental Point: Graciosa west base.,1948,7022,8901,1301,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2002-07-13 00:00:00,2002.25,0
+6184,Azores Oriental Islands 1940,geodetic,Fundamental Point: Forte de S�o Bras.,1940,7022,8901,1345,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+6185,Madeira 1936,geodetic,Fundamental Point: Madeira SE Base.,1936,7022,8901,1314,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon via EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,1
+6188,OSNI 1952,geodetic,Position fixed to the coordinates from the 19th century Principle Triangulation of station Divis. Scale and orientation controlled by position of Principle Triangulation stations Knocklayd and Trostan.,1952,7001,8901,2530,Geodesy and topographic mapping.,Superseded by 1975 Mapping Adjustment.,Ordnance Survey of Northern Ireland.,EPSG,2001-11-06 00:00:00,,0
+6189,Red Geodesica Venezolana,geodetic,Realised by a frame of 67 stations observed in 1995 as a densification of the SIRGAS campaign and adjusted in the ITRF94.,2000,7019,8901,1251,Geodesy.,,Servicio Autonomo de Geografia y Cartografia Nacional.,EPSG,2001-06-11 00:00:00,,0
+6190,Posiciones Geodesicas Argentinas 1998,geodetic,Densification of SIRGAS 1995; ITRF94 epoch 1995.42.,1998,7019,8901,1033,"Topographic mapping, geodesy.",Una red geod�sica de 127 puntos materializados en el terreno que definen el Sistema Geod�sico Nacional.  [A geodetic network of 127 points defining the National Geodetic System.] Supersedes the 1994 POSGAR adjustment (code 6172).,http://www.igm.gov.ar/posgar.html,EPSG,2001-11-06 00:00:00,,0
+6191,Albanian 1987,geodetic,,1987,7024,8901,1025,"Geodesy, cadastre, topographic mapping, engineering survey.",,EuroGeographics; http://crs.ifag.de/,EPSG,2001-11-06 00:00:00,,0
+6192,Douala 1948,geodetic,"South pillar of Doula base; 4deg 00min 40.64sec N, 9deg 42min 30.41sec E",1948,7022,8901,1060,Topographic mapping.,Superseded  by Manoca 1962 datum (code 6193).,TotalFinaElf,EPSG,2002-01-18 00:00:00,,0
+6193,Manoca 1962,geodetic,"Reservoir centre at the  Manoca tower (""tube Suel""), 3deg 51min 49.896sec N, 9deg 36min 49.347sec E.",1962,7011,8901,1060,Topographic mapping.,The intent of the Bukavu 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.  Supersedes Douala 1948 (code 6192).,TotalFinaElf,EPSG,2002-01-18 00:00:00,,0
+6194,Qornoq 1927,geodetic,,1927,7022,8901,1107,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,0
+6195,Scoresbysund 1952,geodetic,,1952,7022,8901,2570,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,0
+6196,Ammassalik 1958,geodetic,,1958,7022,8901,2571,Topographic mapping.,,"Kort & Matrikelstyrelsen, Copenhagen.",EPSG,2002-01-18 00:00:00,,0
+6197,Garoua,geodetic,IGN astronomical station and benchmark no. 16 at Tongo; 8deg 55min 08.74sec N  13deg 30min 43.19sec E.,,7012,8901,2590,Topographic mapping.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,0
+6198,Kousseri,geodetic,IGN astronomical station Dabanga; 11deg 55min 05.9sec N  14deg 38min 40.8sec E.,,7012,8901,2591,Topographic mapping.,,TotalFinaElf,EPSG,2002-02-12 00:00:00,,0
+6199,Egypt 1930,geodetic,Fundamental Point: Station F1. Latitude: 30 deg 01 min 42.86 sec N; Longitude: 31 deg 16 min 37.05 sec E (of Greenwich).,1930,7022,8901,1086,Used for scientific purposes only.,"Note that Egypt 1930 uses the International 1924 ellipsoid, unlike the Egypt 1907 datum (code 6229) which uses the Helmert ellipsoid. Oil industry references to the Egypt 1930 datum name and the Helmert ellipsoid probably mean Egypt 1907 datum.",,EPSG,2002-02-12 00:00:00,,0
+6200,Pulkovo 1995,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 15.359 sec N; Longitude: 30 deg 19 min 28.318 sec E (of Greenwich).,1995,7024,8901,1198,Scientific adjustment.,,"""Main Terms of Reference for the State Geodetic Network""; Federal Geodetic Service of Russia; 1994",EPSG,1996-09-12 00:00:00,,0
+6201,Adindan,geodetic,Fundamental Point: Station 15; Adindan. Latitude: 22 deg 10 min  7.110 sec N; Longitude: 31 deg 29 min 21.608 sec E (of Greenwich).,,7012,8901,1271,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6202,Australian Geodetic Datum 1966,geodetic,Fundamental Point: Johnson Memorial. Latitude: 25 deg 56 min 54.551 sec S; Longitude: 133 deg 12 min 30.077 sec E (of Greenwich).,1966,7003,8901,1279,Topographic mapping.,,Australian Map Grid Technical Manual. National Mapping Council of Australia Technical Publication 7; 1972.,EPSG,1995-06-02 00:00:00,,0
+6203,Australian Geodetic Datum 1984,geodetic,,1984,7003,8901,1280,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6204,Ain el Abd 1970,geodetic,Fundamental Point: Ain El Abd.  Latitude: 28 deg  14 min 06.171 sec N; Longitude: 48 deg 16 min 20.906 sec E (of Greenwich).,1970,7022,8901,1272,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6205,Afgooye,geodetic,,,7024,8901,1214,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6206,Agadez,geodetic,,,7011,8901,1177,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6207,Lisbon 1937,geodetic,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 9 deg 07 min 54.862 sec W (of Greenwich).,1937,7022,8901,1294,Topographic mapping.,Supersedes Lisbon 1890 adjustment (which used Bessel 1841 ellipsoid).,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,2001.551,0
+6208,Aratu,geodetic,,,7022,8901,1274,Oil industry geodetic purposes.,,,EPSG,1995-06-02 00:00:00,,0
+6209,Arc 1950,geodetic,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,1950,7013,8901,1276,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6210,Arc 1960,geodetic,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,1960,7012,8901,1277,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6211,Batavia,geodetic,Fundamental Point: Longitude at Batavia Astro. Station. Latitude: 6 deg  7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich). Latitude and azimuth at Genuk.,,7004,8901,1285,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6212,Barbados 1938,geodetic,Fundamental point: HMS Challenger astro station M1; latitude 13 deg 04 min 32.53 sec N; longitude 59 deg 36 min 29.34 sec W (of Greenwich).,1938,7012,8901,1042,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,99.171,0
+6213,Beduaram,geodetic,,,7011,8901,1177,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6214,Beijing 1954,geodetic,,1954,7024,8901,1067,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6215,Reseau National Belge 1950,geodetic,Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).,1950,7022,8901,1347,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6216,Bermuda 1957,geodetic,,1957,7008,8901,1047,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6218,Bogota 1975,geodetic,Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 74 deg  4 min 51.300 sec W (of Greenwich).,1975,7022,8901,1070,Topographic mapping.,Supersedes 1951 adjustment.,"Instituto Geografico Agustin Caduzzi (IGAC) special publication no. 1, 4th edition (1975) ""Geodesia: Resultados Definitvos de Parte de las Redes Geodesicas Establecidas en el Pais"".",EPSG,2000-10-19 00:00:00,2000.20,0
+6219,Bukit Rimpah,geodetic,2deg 00min 40.16sec S  105deg 51min 39.76sec E (of Greenwich).,,7004,8901,1287,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6220,Camacupa,geodetic,,,7012,8901,1288,Coastal hydrography.,,,EPSG,1995-06-02 00:00:00,,0
+6221,Campo Inchauspe,geodetic,Fundamental Point: Campo Inchauspe. Latitude: 35 deg 58 min 17.000 sec S; Longitude: 62 deg 10 min 12.000 sec W (of Greenwich).,,7022,8901,1033,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6222,Cape,geodetic,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,,7013,8901,1290,"Geodesy, cadastre, topographic mapping, engineering survey.",,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,1996-10-18 00:00:00,96.25  99.69,0
+6223,Carthage,geodetic,,,7011,8901,1236,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6224,Chua,geodetic,Fundamental Point: Chua. Latitude: 19 deg 45 min 41.160 sec S; Longitude: 48 deg  6 min  7.560 sec W (of Greenwich).,,7022,8901,1053,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6225,Corrego Alegre,geodetic,Fundamental Point: Corrego Alegre. Latitude: 19 deg 50 min 15.140 sec S; Longitude: 48 deg 57 min 42.750 sec W (of Greenwich).,,7022,8901,1293,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6226,Cote d'Ivoire,geodetic,,,7011,8901,1075,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,2001.11,1
+6227,Deir ez Zor,geodetic,Fundamental Point: Trig. 254 Deir. Latitude: 35 deg 21 min 49.975 sec N; Longitude: 40 deg  5 min 46.770 sec E (of Greenwich).,,7011,8901,1623,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6228,Douala,geodetic,,,7011,8901,1060,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6229,Egypt 1907,geodetic,Fundamental Point: Station F1. Latitude: 30 deg 01 min 42.86 sec N; Longitude: 31 deg 16 min 33.60 sec E (of Greenwich).,1907,7020,8901,1086,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6230,European Datum 1950,geodetic,Fundamental Point: Potsdam (Helmert Tower). Latitude: 52 deg 22 min 51.4456 sec N; Longitude: 13 deg  3 min 58.9283 sec E (of Greenwich).,1950,7022,8901,1296,"Topographic mapping, geodesy.",,,EPSG,1995-06-02 00:00:00,,0
+6231,European Datum 1987,geodetic,,1987,7022,8901,2420,Scientific network.,,,EPSG,1995-06-02 00:00:00,,0
+6232,Fahud,geodetic,Fundamental Point: Station NO68-024 Fahud. Latitude: 22 deg 17 min 31.182 sec N; Longitude: 56 deg 29 min 18.820 sec E (of Greenwich).,,7012,8901,1183,Oil industry mapping.,Superseded by PSD93 (code 6134).,Petroleum Development Oman.,EPSG,1995-06-02 00:00:00,,0
+6233,Gandajika 1970,geodetic,,1970,7022,8901,1152,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6234,Garoua,geodetic,,,7011,8901,1060,Topographic mapping.,The intent of the Bukavu 1953 conference was to adopt the Clarke 1880 (RGN) ellipsoid (code 7012) but in practice this datum has used the IGN version.,,EPSG,1995-06-02 00:00:00,,1
+6235,Guyane Francaise,geodetic,,,7022,8901,1097,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6236,Hu Tzu Shan,geodetic,,,7022,8901,1228,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6237,Hungarian Datum 1972,geodetic,"Fundamental Point: Szolohegy. Latitude: 47 deg 17 min 32,6156 sec N; Longitude 19 deg 36 min 09.9865 sec E; geoid height 6.56m.",1972,7036,8901,1119,Topographic mapping.,,http://lazarus.elte.hu/gb/geodez/geod3.htm,EPSG,1996-10-18 00:00:00,96.09,0
+6238,Indonesian Datum 1974,geodetic,"Fundamental Point: Padang. Latitude: 0 deg 56 min 38.414 sec S; Longitude: 100 deg 22 min  8.804 sec E (of Greenwich). Ellipsoidal height 3.190m, gravity-related height 14.0m above mean sea level.",1974,7021,8901,1122,Topographic mapping.,,Bakosurtanal 1979 paper by Jacob Rais.,EPSG,2002-06-22 00:00:00,2002.151,0
+6239,Indian 1954,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1954,7015,8901,1304,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6240,Indian 1975,geodetic,Fundamental Point: Khau Sakaerang,1975,7015,8901,1231,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6241,Jamaica 1875,geodetic,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,1875,7034,8901,1128,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6242,Jamaica 1969,geodetic,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,1969,7008,8901,1128,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6243,Kalianpur 1880,geodetic,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,1880,7042,8901,1307,Topographic mapping.,Includes 1916 extrension into Burma (Myanmar).  Superseded by 1937 adjustment.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,1999-10-20 00:00:00,97.23,0
+6244,Kandawala,geodetic,,,7015,8901,1218,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6245,Kertau,geodetic,Fundamental Point: Kertau. Latitude: 3 deg 27 min 50.710 sec N; Longitude: 102 deg 37 min 24.550 sec E (of Greenwich).,,7018,8901,1309,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6246,Kuwait Oil Company,geodetic,,,7012,8901,1136,Oil industry mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6247,La Canoa,geodetic,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,,7022,8901,1251,"Geodesy, topographic mapping, engineering survey.",Origin also adopted for PSAD56.,,EPSG,1995-06-02 00:00:00,,0
+6248,Provisional South American Datum 1956,geodetic,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,1956,7022,8901,1348,Topographic mapping.,Same origin as La Canoa datum.,,EPSG,1995-06-02 00:00:00,,0
+6249,Lake,geodetic,Fundamental Point: Maracaibo Cathedral. Latitude: 10 deg 38 min 34.678 sec N; Longitude: 71 deg 36 min 20.224 sec W (of Greenwich).,,7022,8901,1312,Oil industry mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6250,Leigon,geodetic,"Fundamental Point: GCS Station 121, Leigon. Latitude: 5 deg 38 min 52.27 sec N; Longitude: 0 deg 11 min 46.08 sec W (of Greenwich).",,7012,8901,1104,Topographic mapping.,Superseded Accra datum (code 6168) from 1978.  Coordinates at Leigon fundamental point defined as Accra datum values for that point.,Ordnance Survey International,EPSG,1995-06-02 00:00:00,,0
+6251,Liberia 1964,geodetic,,1964,7012,8901,1142,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6252,Lome,geodetic,,,7011,8901,1232,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6253,Luzon 1911,geodetic,Fundamental Point: Balacan. Latitude: 13 deg 33 min 41.000 sec N; Longitude: 121 deg 52 min  03.000 sec E (of Greenwich).,1911,7008,8901,1190,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6254,Hito XVIII 1963,geodetic,Chile-Argentina boundary survey.,1963,7022,8901,1303,Geodesy.,Used in Tierra del Fuego.,Various oil company records.,EPSG,1995-06-02 00:00:00,,0
+6255,Herat North,geodetic,,,7022,8901,1024,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6256,Mahe 1971,geodetic,Fundamental Point: Mahe,1971,7012,8901,1208,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6257,Makassar,geodetic,Fundamental Point: Moncongloe,,7004,8901,1316,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6258,European Terrestrial Reference System 1989,geodetic,,1989,7019,8901,1298,Geodesy.,"Coincides with WGS84 at the one metre level.
+The distinction in usage between ETRF89 and ETRS89 is confused: although in principle conceptually different in practice both are used for the realisation.",,EPSG,2000-10-19 00:00:00,97.11  97.55  99.111 2000.72,0
+6259,Malongo 1987,geodetic,Fundamental Point: Station Y at Malongo base camp. Latitude: 5 deg 23 min 34.327 sec S; Longitude: 12 deg 12 min  02.393 sec E (of Greenwich).,1987,7022,8901,1317,Oil industry mapping.,Offshore extension of Mhast datum (6264) using Transit translocation.,Chevron Petroleum Technology.,EPSG,1995-06-02 00:00:00,,0
+6260,Manoca,geodetic,,,7012,8901,1060,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6261,Merchich,geodetic,"Fundamental Point: Merchich. Latitude: 33� 26' 59.672"" N; Longitude: 7� 33' 27.295""  W (of Greenwich).",1922,7011,8901,1166,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6262,Massawa,geodetic,,,7004,8901,1089,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6263,Minna,geodetic,Fundamental Point: Minna base station L40. Latitude: 9 deg 38 min  09.000 sec N; Longitude: 6 deg 30 min 59.000 sec E (of Greenwich).,,7012,8901,1178,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6264,Mhast,geodetic,,,7022,8901,1318,Coastal hydrography.,,,EPSG,1995-06-02 00:00:00,,0
+6265,Monte Mario,geodetic,Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg  00 min  00.000 sec E (of Rome).,,7022,8901,1127,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6266,M'poraloko,geodetic,,,7011,8901,1100,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6267,North American Datum 1927,geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,1927,7008,8901,1349,Topographic mapping.,Superseded by North American Datum 1983 (NAD83),,EPSG,1995-06-02 00:00:00,,0
+6268,NAD Michigan,geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,,7009,8901,1391,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6269,North American Datum 1983,geodetic,Origin at geocentre.,1986,7019,8901,1350,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6270,Nahrwan 1967,geodetic,Fundamental point: Nahrwan south base.  Latitude: 33 deg 19 min 10.87 sec N; Longitude: 44 deg 43 min 25.54 sec E (of Greenwich).,1967,7012,8901,1351,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6271,Naparima 1972,geodetic,Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).,1972,7022,8901,1322,Topographic mapping.,Naparima 1972 is an extension of the Naparima 1955 network of Trinidad to include Tobago.,Ordnance Survey International.,EPSG,1995-06-02 00:00:00,,0
+6272,New Zealand Geodetic Datum 1949,geodetic,Fundamental Point: Papatahi. Latitude: 41 deg 19 min  8.900 sec S; Longitude: 175 deg  02 min 51.000 sec E (of Greenwich).,1949,7022,8901,1175,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,2000-10-19 00:00:00,2000.702,0
+6273,NGO 1948,geodetic,,1948,7005,8901,1352,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6274,Datum 73,geodetic,"Fundamental Point:  TF4, Melrica. Latitude: 39 deg 41 min 37.30 sec N; Longitude: 8 deg 07 min 53.31 sec W (of Greenwich).",1964,7022,8901,1294,Topographic mapping.,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,,0
+6275,Nouvelle Triangulation Francaise,geodetic,Fundamental Point: Pantheon. Latitude: 48 deg 50 min 46.52 sec N; Longitude: 2 deg 20 min 48.67 sec E (of Greenwich).,1898,7011,8901,1353,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6276,NSWC 9Z-2,geodetic,,,7025,8901,1262,Satellite navigation.,Transit precise ephemeris before 1991.,,EPSG,1995-06-02 00:00:00,,0
+6277,OSGB 1936,geodetic,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,1936,7001,8901,1264,Topographic mapping.Topographic mapping.Topographic mapping.Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6278,OSGB 1970 (SN),geodetic,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,1970,7001,8901,1354,Scientific network.,,,EPSG,1995-06-02 00:00:00,,0
+6279,OS (SN) 1980,geodetic,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,1980,7001,8901,1354,Scientific network.,,,EPSG,1995-06-02 00:00:00,,0
+6280,Padang 1884,geodetic,Fundamental Point: Padang,1884,7004,8901,1355,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6281,Palestine 1923,geodetic,Fundamental Point: Point 82'M  Jerusalem. Latitude: 31 deg 44 min  2.749 sec N; Longitude: 35 deg 12 min 43.490 sec E (of Greenwich).,1923,7010,8901,1356,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6282,Congo 1960 Pointe Noire,geodetic,Fundamental Point: Point Noire Astro. Latitude: 4 deg 47 min  0.100 sec S; Longitude: 11 deg 51 min  1.550 sec E (of Greenwich).,1960,7011,8901,1072,Topographic mapping.,,,EPSG,2002-01-18 00:00:00,2002.05,0
+6283,Geocentric Datum of Australia 1994,geodetic,,1994,7019,8901,1036,"Topographic mapping, geodesy.",Coincident with WGS84 to within 1 metre.,Australian Surveying and Land Information Group Internet WWW page.,EPSG,1995-06-02 00:00:00,,0
+6284,Pulkovo 1942,geodetic,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,1942,7024,8901,1357,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6285,Qatar 1974,geodetic,Fundamental Point: Station G3,1974,7022,8901,1346,Topographic mapping.,,,EPSG,2001-08-28 00:00:00,2001.27,0
+6286,Qatar 1948,geodetic,Fundamental Point: Sokey 0 M. Latitude: 25 deg 22 min 56.500 sec N; Longitude: 50 deg 45 min 41.000 sec E (of Greenwich).,1948,7020,8901,1346,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6287,Qornoq,geodetic,,1927,7022,8901,1107,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6288,Loma Quintana,geodetic,Fundamental Point: Loma Quintana,,7022,8901,1313,Topographic mapping.,Superseded by La Canoa (code 6247).,,EPSG,1995-06-02 00:00:00,,0
+6289,Amersfoort,geodetic,Fundamental Point: Amersfoort. Latitude: 52 deg  09 min 22.178 sec N; Longitude: 5 deg 23 min 15.478 sec E (of Greenwich).,,7004,8901,1275,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,2000-10-19 00:00:00,2000.56,0
+6291,South American Datum 1969,geodetic,,1969,7036,8901,1358,Topographic mapping.,SAD69 uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision is 0 to 31mm.,,EPSG,1996-10-18 00:00:00,96.09  97.252,0
+6292,Sapper Hill 1943,geodetic,,1943,7022,8901,1092,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6293,Schwarzeck,geodetic,,,7046,8901,1169,Topographic mapping.,,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,2001-01-21 00:00:00,2001.15,0
+6294,Segora,geodetic,,,7004,8901,1359,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,1
+6295,Serindung,geodetic,,,7004,8901,1360,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6296,Sudan,geodetic,,,7011,8901,1361,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6297,Tananarive 1925,geodetic,Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min  2.100 sec S; Longitude: 45 deg 12 min 52.800 sec E (of Greenwich).,2025,7022,8901,1149,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6298,Timbalai 1948,geodetic,Fundamental Point: Timbalai. Latitude: 5 deg 17 min  3.548 sec N; Longitude: 115 deg 10 min 56.409 sec E (of Greenwich).,1948,7016,8901,1362,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6299,TM65,geodetic,Adjusted to best mean fit 12 stations of the OSNI 1952 primary adjustment to within 0.5m.,1965,7002,8901,1305,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6300,TM75,geodetic,Adjusted to best mean fit 9 stations of the OSNI 1952 primary adjustment in Northern Ireland plus the 1965 values of 3 stations in the Republic of Ireland.,1975,7002,8901,1305,"Geodesy, topographic mapping and engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6301,Tokyo,geodetic,Fundamental Point: Nikon-Keido-Genten. Latitude: 35 deg 39 min 17.5148 sec N; Longitude: 139 deg 44 min 40.5020 sec E (of Greenwich).,,7004,8901,1364,"Geodesy, cadastre, topographic mapping, engineering survey.",Superseded by Japanese Geodetic Datum 2000 (code 6611).,Geographic Survey Institute; Japan; Bulletin 40 (March 1994).  Also http://vldb.gsi.go.jp/sokuchi/datum/tokyodatum.html,EPSG,2002-06-22 00:00:00,98.46  2002.08,0
+6302,Trinidad 1903,geodetic,Harbour Master's Flagstaff; Port of Spain.,1903,7007,8901,1339,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6303,Trucial Coast 1948,geodetic,Fundamental Point: TC1. Latitude: 25 deg 23 min 50.190 sec N; Longitude: 55 deg 26 min 43.950 sec E (of Greenwich).,1948,7020,8901,1363,Oil industry mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6304,Voirol 1875,geodetic,Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.,1875,7011,8901,1365,Topographic mapping.,,IGN Paris,EPSG,1995-06-02 00:00:00,,0
+6306,Bern 1938,geodetic,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  7.890 sec N; Longitude: 7 deg 26 min 22.335 sec E (of Greenwich).,1938,7004,8901,1286,Topographic mapping.,This redetermination of the coordinates of fundamental point is used for scientific purposes and as the graticule overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,"""Die Projektionen der schweizerischen Plan- und Kartenwerke""; J. Bolliger 1967",EPSG,1 [...]
+6307,Nord Sahara 1959,geodetic,,1959,7012,8901,1366,Topographic mapping.,Sometimes incorrectly referred to as Voirol Unifie 1960. Voirol Unifie 1960 is NOT a datum:  it is two projected coordinate systems based on  Nord Sahara 1959.  See coordinate system codes 30791 and 30792.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,1999-10-20 00:00:00,99.62,0
+6308,Stockholm 1938,geodetic,Fundamental Point: Stockholm observatory,1938,7004,8901,1225,"Geodesy, cadastre, topographic mapping, engineering survey.",Superseded by RT90 adjustment (datum code 6124),,EPSG,1996-04-12 00:00:00,,0
+6309,Yacare,geodetic,,,7022,8901,1247,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6310,Yoff,geodetic,,,7011,8901,1207,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6311,Zanderij,geodetic,,,7022,8901,1222,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6312,Militar-Geographische Institut,geodetic,Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 16 deg 17 min 41.06 sec E (of Greenwich).,1901,7004,8901,1321,Topographic mapping.,Croatia is planning to define a new modern datum to supersede HR1901 (info from EuroGeographics; http://crs.ifag.de/).,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,1995-06-02 00:00:00,,0
+6313,Reseau National Belge 1972,geodetic,Fundamental Point: Uccle observatory. Latitude: 50 deg 47 min 57.704 sec N; Longitude: 4 deg 21 min 24.983 sec E (of Greenwich).,1972,7022,8901,1347,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6314,Deutsches Hauptdreiecksnetz,geodetic,Fundamental Point: Rauenberg. Latitude: 52 deg 27 min 12.021 sec N; Longitude: 13 deg 22 min 04.928 sec E (of Greenwich).,,7004,8901,1295,"Geodesy, cadastre, topographic mapping, engineering survey.",Deprecated because name misspelt.,,EPSG,2001-11-06 00:00:00,2001.511,0
+6315,Conakry 1905,geodetic,Fundamental Point: Conakry. Latitude: 10.573766g N; Longitude: 17.833682g W (of Paris).,1905,7011,8901,1112,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6316,Dealul Piscului 1933,geodetic,Fundamental point: latitude 44 deg 24 min 33.9606 sec N; longitude 26 deg 06 min 44.8772 sec E (of Greenwich).,1933,7022,8901,1197,Topographic mapping.,Superseded by 1970 adjustment (datum code 6317),Institute for Geodesy Photogrametry and Land Management,EPSG,1996-04-12 00:00:00,,0
+6317,Dealul Piscului 1970,geodetic,Fundamental point: latitude 44 deg 24 min 23.7709 sec N; longitude 26deg 06 min 44.1265 sec E (of Greenwich).,1970,7024,8901,1197,Topographic mapping.,Supersedes 1933 adjustment (datum code 6316),Institute for Geodesy Photogrametry and Land Management,EPSG,1996-04-12 00:00:00,,0
+6318,National Geodetic Network,geodetic,,,7030,8901,1136,Geodesy.,,,EPSG,1996-04-12 00:00:00,,0
+6319,Kuwait Utility,geodetic,,,7019,8901,1310,"Cadastre, engineering survey.",,,EPSG,1996-04-12 00:00:00,,0
+6322,World Geodetic System 1972,geodetic,,1972,7043,8901,1262,Satellite navigation.,Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE. Datum code 6323 reserved for southern hemisphere ProjCS's.,,EPSG,1999-04-22 00:00:00,99.03,0
+6324,WGS 72 Transit Broadcast Ephemeris,geodetic,,1972,7043,8901,1262,Satellite navigation.,Alleged datum for use with Transit broadcast ephemeris prior to 1989. Relationship to WGS 72 has changed over time.  Datum code 6325 reserved for southern hemisphere ProjCS's.,,EPSG,1999-04-22 00:00:00,99.03,0
+6326,World Geodetic System 1984,geodetic,Origin at geocentre.,1984,7030,8901,1262,Satellite navigation.,Datum code 6327 reserved for southern hemisphere ProjCS's,,EPSG,2002-06-22 00:00:00,2002.151,0
+6600,Anguilla 1957,geodetic,Fundamental point: station A4.,1957,7012,8901,1030,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6601,Antigua 1943,geodetic,Fundamental point: station A14.,1943,7012,8901,1273,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6602,Dominica 1945,geodetic,Fundamental point: station M12.,1945,7012,8901,1082,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6603,Grenada 1953,geodetic,Fundamental point: station GS8.,1953,7012,8901,1551,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6604,Montserrat 1958,geodetic,Fundamental point: station M36.,1958,7012,8901,1165,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6605,St. Kitts 1955,geodetic,Fundamental point: station K12.,1955,7012,8901,1200,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6606,St. Lucia 1955,geodetic,Fundamental point: station DCS3.,1955,7012,8901,1201,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6607,St. Vincent 1945,geodetic,Fundamental point: station V1.,1945,7012,8901,1202,Topographic mapping.,,Ordnance Survey of Great Britain.,EPSG,1999-04-22 00:00:00,,0
+6608,North American Datum 1927 (1976),geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,1976,7008,8901,1367,"Geodesy, cadastre, topographic mapping, engineering survey.",NAD27(76) used in Ontario for all maps at scale 1/20 000 and larger; elsewhere in Canada for selected purposes.,Geodetic Survey of Canada.,EPSG,1999-05-12 00:00:00,,0
+6609,North American Datum 1927 (CGQ77),geodetic,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,1977,7008,8901,1368,"Geodesy, cadastre, topographic mapping, engineering survey.",NAD27 (CGQ77) used in Quebec for all maps at scale 1/20 000 and larger; generally for maps issued by the Quebec cartography office whose reference system is CGQ77.,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,1 [...]
+6610,Xian 1980,geodetic,,1980,7049,8901,1067,"Geodesy, topographic and engineering survey.",,BP,EPSG,2002-02-12 00:00:00,,0
+6611,Hong Kong 1980,geodetic,"Trig ""Zero"", 38.4 feet south along the transit circle of the Kowloon Observatory. Latitude 22deg 18min 12.82sec North, longitude 114deg 10min 18.75sec East.",1980,7022,8901,1118,"Geodesy, topgraphic and engineering survey, cadastre.",Supersedes Hong Kong 1963 datum and 1973 metric adjustment.,"Survey and Mapping Office, Lands Department. http://www.info.gov.hk/landsd/mapping/tindex.htm",EPSG,2002-06-22 00:00:00,,0
+6612,Japanese Geodetic Datum 2000,geodetic,ITRF94,2000,7019,8901,1129,"Geodesy, topographic and engineering survey.",Instigated under amendment to the Japanese Surveying Law with effect from April 2002. Supersedes Tokyo datum (code 6301).,Japanese Survey Federation.,EPSG,2002-06-22 00:00:00,,0
+6613,Gunung Segara,geodetic,Station P5 (Gunung Segara) 0deg 32min 12.83sec S  117deg 08min 48.47sec E (of Greenwich).,,7004,8901,1360,Topographic mapping.,,TotalFinaElf.,EPSG,2002-06-22 00:00:00,,0
+6614,Qatar National Datum 1995,geodetic,Defined by transformation from WGS 84 - see coordinate operation code 1840.,1995,7022,8901,1346,Topographic mapping.,,Qatar Centre for Geographic Information.,EPSG,2002-06-28 00:00:00,,0
+6615,Porto Santo,geodetic,,1936,7022,8901,1314,Topographic mapping.,For Selvagens island see Selvagem Grande (code 6616).,Instituto Geografico e Cadastral Lisbon http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,0
+6616,Selvagem Grande,geodetic,,,7022,8901,2779,Topographic mapping.,,Instituto Geografico e Cadastral Lisbon http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,0
+6801,CH1903 (Bern),geodetic,Fundamental Point: Bern observatory. Latitude: 46 deg 57 min  8.660 sec N; Longitude: 0,1903,7004,8907,1286,Topographic mapping.,,Bundesamt f�r Landestopographie,EPSG,1999-10-20 00:00:00,,0
+6802,Bogota 1975 (Bogota),geodetic,Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 0,1975,7022,8904,1070,Topographic mapping.,,,EPSG,2000-10-19 00:00:00,2000.20,0
+6803,Lisbon 1937 (Lisbon),geodetic,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 0,1937,7022,8902,1294,Topographic mapping.,Supersedes Lisbon 1890 adjustment (which used Bessel 1841 ellipsoid).,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,2001.551,0
+6804,Makassar (Jakarta),geodetic,Fundamental Point: Moncongloe,,7004,8908,1316,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6805,Militar-Geographische Institut (Ferro),geodetic,Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 33 deg 57 min 41.06 sec E of Ferro.,1901,7004,8909,1321,Topographic mapping.,,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,1995-06-02 00:00:00,,0
+6806,Monte Mario (Rome),geodetic,Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg  00 min  00.000 sec E (of Rome).,,7022,8906,1127,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6807,Nouvelle Triangulation Francaise (Paris),geodetic,Fundamental Point: Pantheon,,7011,8903,1353,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6808,Padang 1884 (Jakarta),geodetic,Fundamental Point: Padang,1884,7004,8908,1355,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6809,Reseau National Belge 1950 (Brussels),geodetic,Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).,1950,7022,8910,1347,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6810,Tananarive 1925 (Paris),geodetic,Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min  2.100 sec S; Longitude: 0,1925,7022,8903,1149,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6811,Voirol 1875 (Paris),geodetic,Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.,1875,7011,8903,1365,Topographic mapping.,,IGN Paris,EPSG,1995-06-02 00:00:00,,0
+6813,Batavia (Jakarta),geodetic,Fundamental Point: Longitude at Batavia Astro. Station. Latitude: 6 deg  7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich). Latitude and azimuth at Genuk.,,7004,8908,1285,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6814,Stockholm 1938 (Stockholm),geodetic,Fundamental Point: Stockholm observatory,1938,7004,8911,1225,"Geodesy, cadastre, topographic mapping, engineering survey.",Superseded by RT90 adjustment (datum code 6124),,EPSG,1996-04-12 00:00:00,,0
+6815,Greek (Athens),geodetic,Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 0 deg E of Athens.,,7004,8912,1106,Topographic mapping.,See geodetic datum alias 6404.  Used as basis of topographic mapping based on Hatt projection.,Topography Department; National Technical University of Athens,EPSG,1997-06-16 00:00:00,,0
+6816,Carthage (Paris),geodetic,,,7011,8903,1236,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6817,NGO 1948 (Oslo),geodetic,,1948,7005,8913,1352,"Geodesy, cadastre, topographic mapping, engineering survey.",,,EPSG,1995-06-02 00:00:00,,0
+6818,S-JTSK (Ferro),geodetic,Modification of Austrian MGI (Ferro) datum.,1920,7004,8909,1306,"Geodesy, cadastre, topographic mapping, engineering survey.",,Research Institute for Geodesy Topography and Cartography (VUGTK); Prague.,EPSG,2001-08-28 00:00:00,2001.26,0
+6819,Nord Sahara 1959 (Paris),geodetic,,1959,7012,8903,1366,Topographic mapping.,Conformal transformation from adjustment in ED50 terms.,"""Le System Geodesique Nord-Sahara""; IGN Paris",EPSG,2000-06-23 00:00:00,,0
+6820,Gunung Segara (Jakarta),geodetic,Station P5 (Gunung Segara) 0deg 32min 12.83sec S  117deg 08min 48.47sec E of Greenwich (8deg 20min 20.68sec E of Jakarta).,,7004,8908,1360,Topographic mapping.,,,EPSG,2002-06-22 00:00:00,,0
+6901,Ancienne Triangulation Francaise (Paris),geodetic,,,7027,8903,1326,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6902,Nord de Guerre (Paris),geodetic,,,7027,8903,1369,Topographic mapping.,,,EPSG,1995-06-02 00:00:00,,0
+6903,Madrid 1870 (Madrid),geodetic,Fundamental point: Madrid observatory.,1870,7028,8905,1217,Topographic mapping.,,Institut de Geomatica; Barcelona,EPSG,1998-11-11 00:00:00,,0
+6904,Lisbon 1890 (Lisbon),geodetic,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 0,1937,7004,8902,1294,Topographic mapping.,Superseded by Lisbon 1937 adjustment (which uses International 1924 ellipsoid).,Instituto Geografico e Cadastral; Lisbon. http://www.ipcc.pt,EPSG,2002-07-13 00:00:00,,0
+9300,Astra Minas,engineering,Origin at 45 deg 59 min 54.79 sec S; 67 deg 34 min 38.94 sec W.,,,,1265,Oil industry mapping.,,,EPSG,2000-03-07 00:00:00,,0
+9301,Barcelona,engineering,Centre of the gateway of San Cristobal chuch; Plaza Boyaca; Barcelona.,,,,1266,Oil industry mapping.,Coordinates variously given as 10deg 08min 06sec N  64deg 41min 17sec W and 10deg 08min 06sec N  64deg 41min 07.5sec W.  It is not clear whether there should be two local datums.,"Ministry of Mines standards manual, 1974.",EPSG,2000-03-07 00:00:00,,0
+9302,Maturin,engineering,Concrete post PR-1 in Plaza Bolivar; Maturin.  9deg 44min 55sec N  63deg 10min 40sec W.,,,,1320,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9303,Maracaibo Cross,engineering,Cruz Canada Morillo in Maracaibo; 10deg 38min 32.328sec N  71deg 37min 12.12sec W  Loma Quintana datum.,,,,1319,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9304,La Rosa,engineering,Monument in La Rosa; 10deg 22min 40.417sec N  71deg 26min 59.488sec W  Loma Quintana datum.,,,,1311,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9305,Mene Grande,engineering,Monument in Santa Barbara; Mene Grande.  9deg 52min 25.488sec N  70deg 54min 35.310sec W.,,,,1270,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9306,El Cubo,engineering,8deg 44min 17.258sec N  72deg 30min 09.01sec W.,,,,1269,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9307,Dabajuro,engineering,Church tower at Dabajuro; 11deg 01min 19sec N  70deg 40min 40sec W.,,,,1268,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9308,Tucupita,engineering,Centre of Plaza Bolivar; Tucupita; 9deg 03min 32sec N  62deg 03min 07.6sec W.,,,,1370,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9309,El Mene,engineering,10deg 04min 49.1sec N  71deg 02min 10sec W.,,,,1270,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9310,Santa Maria de Ipire,engineering,Concrete post PR-1 in Plaza Bolivar; Santa Maria de Ipire; 8deg 40min 06sec N  65deg 19min 09sec W.,,,,1371,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9311,Barinas west base,engineering,Concrete pillar,,,,1267,Oil industry mapping.,,"Ministry of Mines standards manual, 1974.",EPSG,2000-06-10 00:00:00,,0
+9312,EPSG example  X,engineering,Bin grid I=J=1 at WGS 84 / UTM zone 31N 456781E 5836723N.,,,,1263,Example only.,"Bin grid orientation = 20 degrees grid.  Bin width I=25m, J=12.5m.  Bin increment I=1, J=1.  Scale factor at origin 0.99984.
+
+Example only!",UKOOA P6/98 documentation,EPSG,2000-06-23 00:00:00,,0
+9313,EPSG example Platform Y,engineering,Conductor slot A1,,,,1263,Example only.,Example only,EPSG,EPSG,2000-06-23 00:00:00,,0
diff --git a/src/tiff/csv/deprecation.csv b/src/tiff/csv/deprecation.csv
new file mode 100644
index 0000000..4910cce
--- /dev/null
+++ b/src/tiff/csv/deprecation.csv
@@ -0,0 +1,276 @@
+"DEPRECATION_ID","DEPRECATION_DATE","CHANGE_ID","OBJECT_TABLE_NAME","OBJECT_CODE","REPLACED_BY","DEPRECATION_REASON"
+2,2001-08-15 00:00:00,2001.223,Coordinate_Operation,8563,1670,Replaced concatenated tfm with zero step by single tfm.
+3,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8457,1676,Replaced concatenated tfm with zero step by single tfm.
+4,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8236,1675,Replaced concatenated tfm with zero step by single tfm.
+5,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8183,1677,Replaced concatenated tfm with zero step by single tfm.
+6,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8195,1680,Replaced concatenated tfm with zero step by single tfm.
+7,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8199,1679,Replaced concatenated tfm with zero step by single tfm.
+8,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8234,1673,Replaced concatenated tfm with zero step by single tfm.
+9,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8567,1681,Replaced concatenated tfm with zero step by single tfm.
+10,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8572,1672,Replaced concatenated tfm with zero step by single tfm.
+11,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8573,1671,Replaced concatenated tfm with zero step by single tfm.
+12,2001-08-15 00:00:00,2001.222,Coordinate_Operation,8580,1678,Replaced concatenated tfm with zero step by single tfm.
+13,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8396,1665,Replaced concatenated tfm with zero step by single tfm.
+14,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8400,1666,Replaced concatenated tfm with zero step by single tfm.
+15,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8576,1667,Replaced concatenated tfm with zero step by single tfm.
+16,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8577,1668,Replaced concatenated tfm with zero step by single tfm.
+17,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8194,1669,Replaced concatenated tfm with zero step by single tfm.
+18,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1665,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+19,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8192,1669,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+20,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8398,1667,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+21,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8408,1666,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+22,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8453,1667,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+23,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8454,1668,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+24,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8560,1669,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+25,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8578,1665,Replaced concatenated tfm with zero step by single tfms with 1m accuracy.
+26,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8579,1669,Replaced concatenated tfm with zero step by single tfm with 1m accuracy.
+27,2001-10-04 00:00:00,2001.121,Coordinate_Operation,1510,1766,NMA has reduced precision with which it quotes parameter values for this tfm.
+28,2001-10-04 00:00:00,2001.45,Coordinate_Operation,14100,15302,Error in parameter values for easting and northing at grid origin.
+29,2001-10-04 00:00:00,2001.45,Coordinate_Operation,11631,15303,Error in parameter value for latitude of 2nd standard parallel.
+30,2001-08-28 00:00:00,2001.37,Coordinate_Operation,1508,1753,Incorrect unit assigned to scale difference parameter value.
+32,2001-06-05 00:00:00,2001.07,Ellipsoid,7035,7047,"Changed from general ""Sphere"" to specific ""GRS 1980 Authalic Sphere""."
+33,2001-06-25 00:00:00,2001.19,Ellipsoid,7047,7048,Incorrect radius (semi-major and semi-minor axes).
+34,2001-06-21 00:00:00,2001.07,Datum,6035,6047,"Name changed to reflect use of specific ""GRS 1980 Authalic Sphere"" rather than general ""Sphere""."
+35,1997-11-13 00:00:00,97.372,Datum,5107,5118,Replace this general name to specific.
+38,,2001.181,Datum,6314,6177,Correction to name spelling.
+39,2001-08-28 00:00:00,2001.32,Coordinate Reference System,2156,2195,ProjCRS 2156 invalid as linked to projection in wrong hemisphere and has wrong name.
+40,2001-08-28 00:00:00,2001.32,Coordinate_Operation,15300,15301,Longitude of natural origin has incorrect value (wrong hemisphere).
+41,2001-08-28 00:00:00,2001.3,Coordinate Reference System,2291,2292,Source geogCRS code is in error.
+42,2001-06-05 00:00:00,2001.07,Coordinate Reference System,4035,4047,"Changed from general ""Sphere"" to specific ""GRS 1980 Authalic Sphere""."
+43,2001-08-28 00:00:00,2001.47,Datum,6226,6142,Does not exist except as an alias of 6142 and 6143.
+44,2001-06-05 00:00:00,2001.11,Coordinate Reference System,4226,4142,Does not exist except as an alias of 4142 and 4143.
+45,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31461,,ProjCRS zone not used.
+46,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31462,31466,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+47,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31463,31467,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+48,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31464,31468,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+49,2001-06-05 00:00:00,2001.181,Coordinate Reference System,31465,31469,ProjCRS related to inappropriate coordinate system resulting in incorrect axes and name.
+50,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31265,31275,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+51,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31266,31276,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+52,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8564,1691,Replaced concatenated tfm with zero step by single tfm.
+53,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8404,1692,Replaced concatenated tfm with zero step by single tfm.
+54,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8565,1692,Replaced concatenated tfm with zero step by single tfm.
+55,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8243,1693,Replaced concatenated tfm with zero step by single tfm.
+56,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8245,1693,Replaced concatenated tfm with zero step by single tfm.
+57,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8574,1694,Replaced concatenated tfm with zero step by single tfm.
+58,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8575,1695,Replaced concatenated tfm with zero step by single tfm.
+59,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8566,1696,Replaced concatenated tfm with zero step by single tfm.
+60,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8421,1697,Replaced concatenated tfm with zero step by single tfm.
+61,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8388,1698,Replaced concatenated tfm with zero step by single tfm.
+62,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8390,1699,Replaced concatenated tfm with zero step by single tfm.
+63,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8392,1700,Replaced concatenated tfm with zero step by single tfm.
+64,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8422,1702,Replaced concatenated tfm with zero step by single tfm.
+65,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8215,1683,Replaced concatenated tfm with zero step by single tfm.
+66,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8217,1684,Replaced concatenated tfm with zero step by single tfm.
+67,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8219,1685,Replaced concatenated tfm with zero step by single tfm.
+68,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8221,1686,Replaced concatenated tfm with zero step by single tfm.
+69,2001-08-15 00:00:00,2001.226,Coordinate_Operation,8223,1687,Replaced concatenated tfm with zero step by single tfm.
+70,2001-08-15 00:00:00,2001.225,Coordinate_Operation,8530,1682,Replaced concatenated tfm with zero step by single tfm.
+71,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31267,31277,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+72,2001-06-05 00:00:00,2001.18,Coordinate Reference System,31268,31278,ProjCRS related to inappropriate projection (coordinate operation) and CS resulting in incorrect scale factor and axes order and abbreviation.
+73,2001-08-28 00:00:00,2001.31,Coordinate Reference System,31278,31279,ProjCRS related to incorrect projection.
+74,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31291,31281,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+75,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31292,31282,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+76,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31293,31283,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+77,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31294,31284,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+78,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31295,31285,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+79,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31296,31286,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+80,2001-06-05 00:00:00,2001.182,Coordinate Reference System,31297,31287,ProjCRS related to inappropriate coordinate system resulting in incorrect axes.
+81,2001-06-05 00:00:00,2001.183,Coordinate_Operation,1471,1618,Error in signs of all transformation parameter values and for scale factor also incorrect units.
+82,2001-08-15 00:00:00,2001.122,Coordinate_Operation,1310,1674,Change of source CRS.
+83,2001-08-28 00:00:00,2001.4,Coordinate_Operation,8497,,Invalid concatenation: area of use of steps 1 and 2 do not overlap.
+84,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1258,1755,Correction to name.
+85,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1259,1756,Correction to name.
+86,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1261,1757,Correction to name.
+87,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1263,1758,Correction to name.
+88,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1268,1759,Correction to name.
+89,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1269,1760,Correction to name.
+90,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1270,1761,Correction to name.
+91,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1466,1762,Correction to name.
+92,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1467,1763,Correction to name.
+93,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1468,1764,Correction to name.
+94,2001-10-04 00:00:00,2001.39,Coordinate_Operation,1519,1765,Correction to name.
+95,2001-08-28 00:00:00,2001.38,Coordinate_Operation,1534,1754,Incorrect unit assigned to scale difference parameter value.
+96,2001-08-28 00:00:00,2001.35,Coordinate_Operation,1602,1752,Incorrect source geogCRS code assigned.
+97,2001-08-28 00:00:00,2001.34,Coordinate_Operation,1571,1751,Incorrect source and target geogCRS codes assigned.
+98,2001-08-28 00:00:00,2001.23,Coordinate_Operation,1567,1701,Incorrect parameter value for z-axis rotation.
+99,2001-08-15 00:00:00,2001.228,Coordinate_Operation,8386,8582,Changed second step from zero to HARN.
+100,2001-08-15 00:00:00,2001.228,Coordinate_Operation,8402,8583,Changed second step from zero to HARN.
+101,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8418,1688,Replaced concatenated tfm with zero step by single tfm.
+102,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8419,1689,Replaced concatenated tfm with zero step by single tfm.
+103,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8406,1690,Replaced concatenated tfm with zero step by single tfm.
+104,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8394,1691,Replaced concatenated tfm with zero step by single tfm.
+105,2001-11-06 00:00:00,2001.48,Coordinate_Operation,19908,19972,Change name.
+106,2001-08-28 00:00:00,2001.48,Coordinate Reference System,29900,29902,Change name.
+107,2001-06-05 00:00:00,2001.181,Area,1628,,Invalid area - country does not extend into this longitude range..
+108,2001-08-15 00:00:00,2001.227,Coordinate_Operation,8420,1703,Replaced concatenated tfm with zero step by single tfm.
+109,2001-08-28 00:00:00,2001.32,Coordinate Reference System,2155,2194,Dependent upon deprecated coordinate operation 15300.
+112,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1666,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+117,1997-11-13 00:00:00,97.372,Datum,5107,5120,Replace this general name to specific.
+135,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1667,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+142,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8578,1666,Replaced concatenated tfm with zero step by single tfms with 1m accuracy.
+160,2001-08-28 00:00:00,2001.47,Datum,6226,6143,Does not exist except as an alias of 6142 and 6143.
+161,2001-06-05 00:00:00,2001.11,Coordinate Reference System,4226,4143,Does not exist except as an alias of 4142 and 4143.
+229,2001-08-15 00:00:00,2001.221,Coordinate_Operation,8190,1668,Replaced concatenated tfms with zero step by single tfm with 1m accuracy.
+233,1997-11-13 00:00:00,97.372,Datum,5107,5119,Replace this general name to specific.
+237,2001-11-06 00:00:00,2001.53,Datum,6172,6190,Original name POSGAR is ambiguous given 1994 and 1998 adjustments.
+240,2001-11-06 00:00:00,2001.53,Coordinate Reference System,4172,4190,Original name POSGAR is ambiguous given 1994 and 1998 adjustments.
+242,2001-11-06 00:00:00,2001.53,Coordinate_Operation,1598,1773,Dependent upon deprecated source CRS 4172.
+244,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27581,27571,Changed projCRS name.
+245,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27582,27572,Changed projCRS name.
+246,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27583,27573,Changed projCRS name.
+247,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27584,27574,Changed projCRS name.
+248,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27591,27561,Changed projCRS name.
+249,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27592,27562,Changed projCRS name.
+250,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27593,27563,Changed projCRS name.
+251,2001-11-06 00:00:00,2001.54,Coordinate Reference System,27594,27564,Changed projCRS name.
+260,2001-11-06 00:00:00,2001.54,Coordinate Reference System,7401,7411,Dependent projCRS name changed.
+261,2001-11-06 00:00:00,2001.54,Coordinate Reference System,7402,7412,Dependent projCRS name changed.
+262,2001-11-06 00:00:00,2001.54,Coordinate Reference System,7403,7413,Dependent projCRS name changed.
+266,2001-01-21 00:00:00,2001.15,Ellipsoid,7006,7046,Change of axis unit from International metre to German Legal Metre to reflect local usage.
+268,2001-11-06 00:00:00,2001.45,Coordinate Reference System,32036,2204,Dependent map projection 11631 in error.
+270,2001-11-06 00:00:00,2001.45,Coordinate Reference System,26979,2205,Dependent map projection 14100 in error.
+272,2002-01-18 00:00:00,2001.03,Coordinate_Operation,1656,,EPSG copy of ITRF transformation superseded by tfm code 1791.
+273,2002-01-18 00:00:00,2001.03,Coordinate_Operation,1658,,EPSG copy of ITRF transformation superseded by tfm code 1793.
+274,2002-01-18 00:00:00,2002.01,Datum,6228,6192,Incorrect ellipsoid attached.
+276,2002-01-18 00:00:00,2002.01,Datum,6260,6193,Incorrect ellipsoid attached.
+278,2002-01-18 00:00:00,2002.01,Coordinate Reference System,4228,4192,Dependent datum 6228 in error.
+280,2002-01-18 00:00:00,2002.01,Coordinate Reference System,4260,4193,Dependent datum 6260 in error.
+282,2002-01-18 00:00:00,2002.01,Coordinate Reference System,22832,2214,Dependent geogCRS 4228 deprecated due to datum error.
+285,2002-01-18 00:00:00,2001.17,Datum,6287,6194,Change of name.
+287,2002-01-18 00:00:00,2001.17,Coordinate Reference System,4287,4194,Change of name (adjustment date added).
+288,2002-01-18 00:00:00,2001.17,Coordinate_Operation,1211,1797,Dependent source CRS name changed.
+289,2002-02-12 00:00:00,2002.06,Coordinate_Operation,1559,1593,8-bit binary grid file format inconsistent with NTv2 16-bit format.
+290,2002-02-12 00:00:00,2002.01,Datum,6234,6197,Incorrect ellipsoid attached.
+291,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32074,32064,Change name to include unit abbreviation per US State Plane CRSs.
+294,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32075,32065,Change name to include unit abbreviation per US State Plane CRSs.
+295,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32076,32066,Change name to include unit abbreviation per US State Plane CRSs.
+296,2002-02-12 00:00:00,2002.21,Coordinate Reference System,32077,32067,Change name to include unit abbreviation per US State Plane CRSs.
+297,2002-03-15 00:00:00,2002.29,Coordinate_Operation,1819,1754,Duplication of data already given in transformation 1754.
+298,2002-06-22 00:00:00,2002.16,Coordinate Reference System,5704,5736,Change of name following readjustment.
+299,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21473,21453,Change of CRS name to indicate longitude of origin.
+300,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21474,21454,Change of CRS name to indicate longitude of origin.
+301,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21475,21455,Change of CRS name to indicate longitude of origin.
+302,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21476,21456,Change of CRS name to indicate longitude of origin.
+303,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21477,21457,Change of CRS name to indicate longitude of origin.
+304,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21478,21458,Change of CRS name to indicate longitude of origin.
+305,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21479,21459,Change of CRS name to indicate longitude of origin.
+306,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21480,21460,Change of CRS name to indicate longitude of origin.
+307,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21481,21461,Change of CRS name to indicate longitude of origin.
+308,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21482,21462,Change of CRS name to indicate longitude of origin.
+309,2002-06-22 00:00:00,2002.16,Coordinate Reference System,21483,21463,Change of CRS name to indicate longitude of origin.
+311,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2199,2462,Added hyphen to Gauss-Kruger in CRS name.
+312,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2166,2397,Added hyphen to Gauss-Kruger in CRS name.
+313,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2167,2398,Added hyphen to Gauss-Kruger in CRS name.
+314,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2168,2399,Added hyphen to Gauss-Kruger in CRS name.
+315,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2091,2395,Added hyphen to Gauss-Kruger in CRS name.
+316,2002-06-22 00:00:00,2002.36,Coordinate Reference System,2092,2396,Added hyphen to Gauss-Kruger in CRS name.
+317,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20092,2491,Change of CRS name to indicate longitude of origin.
+318,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20091,2490,Change of CRS name to indicate longitude of origin.
+319,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20090,2489,Change of CRS name to indicate longitude of origin.
+320,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20089,2488,Change of CRS name to indicate longitude of origin.
+321,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20088,2487,Change of CRS name to indicate longitude of origin.
+322,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20087,2486,Change of CRS name to indicate longitude of origin.
+323,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20086,2485,Change of CRS name to indicate longitude of origin.
+324,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20085,2484,Change of CRS name to indicate longitude of origin.
+325,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20084,2483,Change of CRS name to indicate longitude of origin.
+326,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20083,2482,Change of CRS name to indicate longitude of origin.
+327,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20082,2481,Change of CRS name to indicate longitude of origin.
+328,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20081,2480,Change of CRS name to indicate longitude of origin.
+329,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20080,2479,Change of CRS name to indicate longitude of origin.
+330,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20079,2478,Change of CRS name to indicate longitude of origin.
+331,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20078,2477,Change of CRS name to indicate longitude of origin.
+332,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20077,2476,Change of CRS name to indicate longitude of origin.
+333,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20076,2475,Change of CRS name to indicate longitude of origin.
+334,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20075,2474,Change of CRS name to indicate longitude of origin.
+335,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20074,2473,Change of CRS name to indicate longitude of origin.
+336,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20073,2472,Change of CRS name to indicate longitude of origin.
+337,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20072,2471,Change of CRS name to indicate longitude of origin.
+338,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20071,2470,Change of CRS name to indicate longitude of origin.
+339,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20070,2469,Change of CRS name to indicate longitude of origin.
+340,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20069,2468,Change of CRS name to indicate longitude of origin.
+341,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20068,2467,Change of CRS name to indicate longitude of origin.
+342,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20067,2466,Change of CRS name to indicate longitude of origin.
+343,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20066,2465,Change of CRS name to indicate longitude of origin.
+344,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20065,2464,Change of CRS name to indicate longitude of origin.
+345,2002-06-22 00:00:00,2002.36,Coordinate Reference System,20064,2463,Change of CRS name to indicate longitude of origin.
+346,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28462,2492,Change of CRS name to indicate longitude of origin.
+347,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28463,2493,Change of CRS name to indicate longitude of origin.
+348,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28464,2494,Change of CRS name to indicate longitude of origin.
+349,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28465,2495,Change of CRS name to indicate longitude of origin.
+350,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28466,2496,Change of CRS name to indicate longitude of origin.
+351,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28467,2497,Change of CRS name to indicate longitude of origin.
+352,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28468,2498,Change of CRS name to indicate longitude of origin.
+353,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28469,2499,Change of CRS name to indicate longitude of origin.
+354,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28470,2500,Change of CRS name to indicate longitude of origin.
+355,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28471,2501,Change of CRS name to indicate longitude of origin.
+356,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28472,2502,Change of CRS name to indicate longitude of origin.
+357,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28473,2503,Change of CRS name to indicate longitude of origin.
+358,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28474,2504,Change of CRS name to indicate longitude of origin.
+359,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28475,2505,Change of CRS name to indicate longitude of origin.
+360,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28476,2506,Change of CRS name to indicate longitude of origin.
+361,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28477,2507,Change of CRS name to indicate longitude of origin.
+362,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28478,2508,Change of CRS name to indicate longitude of origin.
+363,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28479,2509,Change of CRS name to indicate longitude of origin.
+364,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28480,2510,Change of CRS name to indicate longitude of origin.
+365,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28481,2511,Change of CRS name to indicate longitude of origin.
+366,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28482,2512,Change of CRS name to indicate longitude of origin.
+367,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28483,2513,Change of CRS name to indicate longitude of origin.
+368,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28484,2514,Change of CRS name to indicate longitude of origin.
+369,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28485,2515,Change of CRS name to indicate longitude of origin.
+370,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28486,2516,Change of CRS name to indicate longitude of origin.
+371,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28487,2517,Change of CRS name to indicate longitude of origin.
+372,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28488,2518,Change of CRS name to indicate longitude of origin.
+373,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28489,2519,Change of CRS name to indicate longitude of origin.
+374,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28490,2520,Change of CRS name to indicate longitude of origin.
+375,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28491,2521,Change of CRS name to indicate longitude of origin.
+376,2002-06-22 00:00:00,2002.36,Coordinate Reference System,28492,2522,Change of CRS name to indicate longitude of origin.
+377,2002-06-22 00:00:00,2002.32,Coordinate_Operation,1316,1796,Change of source CRS name.
+378,2002-06-22 00:00:00,2002.4,Coordinate_Operation,1335,1827,Incorrect unit for latitude offset.
+379,2002-06-22 00:00:00,2002.37,Coordinate_Operation,1273,1829,Incorrect sign of transformation parameter values for direction of transformation.
+380,2002-06-22 00:00:00,2002.37,Coordinate_Operation,1677,1830,Error in in sign of dX relative to source transformation 1273. Incorrect sign of transformation parameter values (other than dX) for direction of transformation.
+381,2002-06-22 00:00:00,2002.151,Datum,6294,6613,Change of spelling of name.
+382,2002-06-22 00:00:00,2002.151,Coordinate Reference System,4294,4613,Change of spelling of name.
+383,2002-06-22 00:00:00,2002.151,Coordinate_Operation,1286,1834,Change of spelling of name of source CRS.
+384,2002-06-22 00:00:00,2002.151,Datum,6125,6613,Not a self-standing datum but an extension of the Segara datum.
+385,2002-06-22 00:00:00,2002.151,Coordinate Reference System,4125,4613,Samboja is not a separate geogCRS but an extension of the Segara CRS.
+386,2002-06-22 00:00:00,2002.151,Coordinate_Operation,1282,1838,Change of name of source CRS
+387,2002-06-22 00:00:00,2002.151,Coordinate Reference System,2550,2933,Change name of source geogCRS.
+388,2002-07-13 00:00:00,2002.25,Datum,6185,6615,Information from Portugal suggests EuroGeographics information is incomplete.
+389,2002-07-13 00:00:00,2002.25,Datum,6185,6616,Information from Portugal suggests EuroGeographics information is incomplete.
+390,2002-07-13 00:00:00,2002.25,Coordinate Reference System,4185,4615,Information from Portugal suggests EuroGeographics information is incomplete.
+391,2002-07-13 00:00:00,2002.25,Coordinate Reference System,4185,4616,Information from Portugal suggests EuroGeographics information is incomplete.
+392,2002-07-13 00:00:00,2002.25,Coordinate Reference System,2191,2942,Information from Portugal suggests EuroGeographics information is incomplete.
+393,2002-07-13 00:00:00,2002.25,Coordinate Reference System,2191,2943,Information from Portugal suggests EuroGeographics information is incomplete.
+394,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1473,1842,Change of Source CRS name
+395,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1472,1841,Change in Target CRS name.
+396,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1599,1846,Change in Target CRS name.
+397,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1574,1844,Change in Target CRS name.
+398,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1600,1847,Change in Target CRS name.
+399,2002-07-13 00:00:00,2002.41,Coordinate_Operation,8584,8635,Change in Target CRS name.
+400,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1576,1845,Change in Target CRS name.
+401,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1572,1843,Change in Target CRS name.
+402,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1601,1848,Change in Target CRS name.
+403,2002-07-13 00:00:00,2002.41,Coordinate_Operation,1752,1849,Change in Target CRS name.
+404,2002-07-13 00:00:00,2002.41,Coordinate Reference System,4140,4617,Change of CRS name to accord with revised Geomatics Canada practice.
+405,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2147,2952,Change of geogCRS name to accord with revised Geomatics Canada practice.
+406,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2140,2945,Change of geogCRS name to accord with revised Geomatics Canada practice.
+407,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2141,2946,Change of geogCRS name to accord with revised Geomatics Canada practice.
+408,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2142,2947,Change of geogCRS name to accord with revised Geomatics Canada practice.
+409,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2143,2948,Change of geogCRS name to accord with revised Geomatics Canada practice.
+410,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2144,2949,Change of geogCRS name to accord with revised Geomatics Canada practice.
+411,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2145,2950,Change of geogCRS name to accord with revised Geomatics Canada practice.
+412,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2146,2951,Change of geogCRS name to accord with revised Geomatics Canada practice.
+413,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2036,2953,Change of geogCRS name to accord with revised Geomatics Canada practice.
+414,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2292,2954,Change of geogCRS name to accord with revised Geomatics Canada practice.
+415,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2139,2944,Change of geogCRS name to accord with revised Geomatics Canada practice.
+416,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2153,2955,Change of geogCRS name to accord with revised Geomatics Canada practice.
+417,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2152,2956,Change of geogCRS name to accord with revised Geomatics Canada practice.
+418,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2151,2957,Change of geogCRS name to accord with revised Geomatics Canada practice.
+419,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2150,2958,Change of geogCRS name to accord with revised Geomatics Canada practice.
+420,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2149,2959,Change of geogCRS name to accord with revised Geomatics Canada practice.
+421,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2037,2960,Change of geogCRS name to accord with revised Geomatics Canada practice.
+422,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2038,2961,Change of geogCRS name to accord with revised Geomatics Canada practice.
+423,2002-07-13 00:00:00,2002.41,Coordinate Reference System,2148,2962,Change of geogCRS name to accord with revised Geomatics Canada practice.
+424,2002-02-12 00:00:00,2002.01,Coordinate Reference System,4234,4197,Dependent datum 6228 deprecated due to ellipsoid error.
+425,2002-02-12 00:00:00,2002.01,Coordinate Reference System,23433,2312,Dependent geogCRS 4234 deprecated due to ellipsoid error.
+426,2002-07-13 00:00:00,2002.41,Area,1336,2784,Expansion of area of use.
diff --git a/src/tiff/csv/ellips_alias.c b/src/tiff/csv/ellips_alias.c
new file mode 100644
index 0000000..6cdda23
--- /dev/null
+++ b/src/tiff/csv/ellips_alias.c
@@ -0,0 +1,10 @@
+#include "defs.h"
+datafile_rows_t ellips_alias_row_1[] = {"ELLIPSOID_ALIAS_CODE","ELLIPSOID_ALIAS_NAME","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t ellips_alias_row_2[] = {"7023","International 1967","7036","1996-10-18 00:00:00","","EPSG","Adopted by IUGG 1967 Lucerne. Inverse flattening defined to 2 d.p.  More usually known as GRS 1967 to avoid confusion with the International 1924 figure.","96.09",NULL};
+datafile_rows_t ellips_alias_row_3[] = {"7026","NWL 10D","7043","1999-04-22 00:00:00","","EPSG","Used by Transit Broadcast Ephemeris before 1989. Also referred to as WGS72 spheroid.","99.03",NULL};
+datafile_rows_t ellips_alias_row_4[] = {"7037","Clarke Modified 1880","7012","1996-10-18 00:00:00","","EPSG","The Clarke 1880 (RGS) figure is one of several modifications to the original definition.  The name Clarke Modified is usually taken to be the RGS modification.","",NULL};
+datafile_rows_t ellips_alias_row_5[] = {"7038","International 1979","7019","1996-10-18 00:00:00","","EPSG","Adopted by IUGG 1979 Canberra as the Geodetic Reference Spheroid of 1980 (GRS 1980).","",NULL};
+datafile_rows_t ellips_alias_row_6[] = {"7039","Hayford 1909","7022","1996-10-18 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser","EPSG","Described as a=6378388 m. and b=6356909 m. from which 1/f derived to be 296.95926...   The figure was adopted as the International ellipsoid in 1924 but with 1/f taken as 297 exactly from which b is derved as 6356911.946 m.","",NULL};
+datafile_rows_t ellips_alias_row_7[] = {"7040","WGS84","7030","1996-10-18 00:00:00","","EPSG","","",NULL};
+
+datafile_rows_t *ellips_alias_rows[] = {ellips_alias_row_1,ellips_alias_row_2,ellips_alias_row_3,ellips_alias_row_4,ellips_alias_row_5,ellips_alias_row_6,ellips_alias_row_7,NULL};
diff --git a/src/tiff/csv/ellips_alias.csv b/src/tiff/csv/ellips_alias.csv
new file mode 100644
index 0000000..22ae710
--- /dev/null
+++ b/src/tiff/csv/ellips_alias.csv
@@ -0,0 +1,7 @@
+"ELLIPSOID_ALIAS_CODE","ELLIPSOID_ALIAS_NAME","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+7023,International 1967,7036,1996-10-18 00:00:00,,EPSG,Adopted by IUGG 1967 Lucerne. Inverse flattening defined to 2 d.p.  More usually known as GRS 1967 to avoid confusion with the International 1924 figure.,96.09
+7026,NWL 10D,7043,1999-04-22 00:00:00,,EPSG,Used by Transit Broadcast Ephemeris before 1989. Also referred to as WGS72 spheroid.,99.03
+7037,Clarke Modified 1880,7012,1996-10-18 00:00:00,,EPSG,The Clarke 1880 (RGS) figure is one of several modifications to the original definition.  The name Clarke Modified is usually taken to be the RGS modification.,
+7038,International 1979,7019,1996-10-18 00:00:00,,EPSG,Adopted by IUGG 1979 Canberra as the Geodetic Reference Spheroid of 1980 (GRS 1980).,
+7039,Hayford 1909,7022,1996-10-18 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser",EPSG,Described as a=6378388 m. and b=6356909 m. from which 1/f derived to be 296.95926...   The figure was adopted as the International ellipsoid in 1924 but with 1/f taken as 297 exactly from which b is derved as 6356911.946 m.,
+7040,WGS84,7030,1996-10-18 00:00:00,,EPSG,,
diff --git a/src/tiff/csv/ellipsoid.c b/src/tiff/csv/ellipsoid.c
new file mode 100644
index 0000000..35c6e2e
--- /dev/null
+++ b/src/tiff/csv/ellipsoid.c
@@ -0,0 +1,42 @@
+#include "defs.h"
+datafile_rows_t ellipsoid_row_1[] = {"ELLIPSOID_CODE","ELLIPSOID_EPSG_NAME","ELLIPSOID_USER_NAME","SEMI_MAJOR_AXIS","UOM_LENGTH_CODE","INV_FLATTENING","SEMI_MINOR_AXIS","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t ellipsoid_row_2[] = {"7001","Airy 1830","","6377563.396","9001","299.3249646","","1995-06-02 00:00:00","Ordnance Survey of Great Britain.","EPSG","Original definition is a=20923713 and b=20853810 feet of 1796.   For the 1936 retriangulation OSGB defines the relationship of feet of 1796 to the International metre through log(1.48401603) exactly [=0.3048007491...]. 1/f is given to 7 decimal places.","98.321  98.34",NULL};
+datafile_rows_t ellipsoid_row_3[] = {"7002","Airy Modified 1849","","6377340.189","9001","299.3249646","","1995-06-02 00:00:00","","EPSG","OSGB Airy 1830 figure rescaled by 1.000035 to best fit the primary triangulation of Ireland.","98.321",NULL};
+datafile_rows_t ellipsoid_row_4[] = {"7003","Australian National Spheroid","","6378160.0","9001","298.25","","1995-06-02 00:00:00","\"Australian Map Grid Technical Manual\"; National Mapping Council of Australia Special Publication #7; 1972","EPSG","Based on the GRS 1967 figure but with 1/f taken to 2 decimal places exactly.","",NULL};
+datafile_rows_t ellipsoid_row_5[] = {"7004","Bessel 1841","","6377397.155","9001","299.1528128","","1999-04-22 00:00:00","US Army Map Service Technical Manual; 1943.","EPSG","Original Bessel definition is a=3272077.14 and b=3261139.33 toise. This used a weighted mean of values from several authors but did not account for differences in the length of the various toise: the \"Bessel toise\" is therefore of uncertain length.","98.321  98.34",NULL};
+datafile_rows_t ellipsoid_row_6[] = {"7005","Bessel Modified","","6377492.018","9001","299.1528128","","1999-04-22 00:00:00","","EPSG","Used in Norway and also in Sweden with a 1mm increase in semi-major axis.","98.321",NULL};
+datafile_rows_t ellipsoid_row_7[] = {"7006","Bessel Namibia","","6377483.865","9001","299.1528128","","1999-04-22 00:00:00","","EPSG","a = 6377397.155 German legal metres. This is the same value as the Bessel 1841 figure (code 7004) but in different units.  Used in Namibia.","97.16",NULL};
+datafile_rows_t ellipsoid_row_8[] = {"7007","Clarke 1858","","20926348.0","9005","","20855233.0","1995-06-02 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.","EPSG","Clarke's 1858/II solution. Derived parameters: a = 6378293.645m using his 1865 ratio of 0.304797265 feet per metre; 1/f = 294.26068�  In historic usage in Australia 1/f taken to two decimal places (294.26 exactly); elsewhere a and b used to derive 1/f.","99.70",NULL};
+datafile_rows_t ellipsoid_row_9[] = {"7008","Clarke 1866","","6378206.4","9001","","6356583.8","1995-06-02 00:00:00","US Army Map Service Technical Manual No. 7; 1943.","EPSG","Original definition a=20926062 and b=20855121 (British) feet. Uses Clarke's 1865 inch-metre ratio of 39.370432 to obtain metres. (Metric value then converted to US survey feet for use in the United States using 39.37 exactly giving a=20925832.16 ft US).","98.34",NULL};
+datafile_rows_t ellipsoid_row_10[] = {"7009","Clarke 1866 Michigan","","20926631.531","9003","","20855688.674","1995-06-02 00:00:00","USGS Professional Paper #1395.","EPSG","Used for Michigan NAD27 State Plane zones.  Radius = ellipsoid radius + 800 feet; this approximates the average elevation of the state.   Derived parameter: 1/f = 294.97870","98.22",NULL};
+datafile_rows_t ellipsoid_row_11[] = {"7010","Clarke 1880 (Benoit)","","6378300.789","9001","","6356566.435","1995-06-02 00:00:00","","EPSG","Adopts Clarke's values for a and b.  Uses Benoit's 1895 ratio of 0.9143992 metres per yard to convert to metres.","",NULL};
+datafile_rows_t ellipsoid_row_12[] = {"7011","Clarke 1880 (IGN)","","6378249.2","9001","","6356515.0","1998-04-16 00:00:00","","EPSG","Adopts Clarke's values for a and b using his 1865 ratio of 39.370432 inches per metre to convert axes to metres.","98.12",NULL};
+datafile_rows_t ellipsoid_row_13[] = {"7012","Clarke 1880 (RGS)","","6378249.145","9001","293.465","","1995-06-02 00:00:00","Empire Survey Review #32; 1939.","EPSG","Adopts Clarke's values for a and 1/f.  Adopts his 1865 ratio of 39.370432 inches per metre to convert semi-major axis to metres. Also known as Clarke Modified 1880.","",NULL};
+datafile_rows_t ellipsoid_row_14[] = {"7013","Clarke 1880 (Arc)","","6378249.145","9001","293.4663077","","1999-04-22 00:00:00","","EPSG","Adopts Clarke's value for a with derived 1/f.  Uses his 1865 ratio of 39.370432 inch per metre to convert semi-major axis to metres.","",NULL};
+datafile_rows_t ellipsoid_row_15[] = {"7014","Clarke 1880 (SGA 1922)","","6378249.2","9001","293.46598","","1995-06-02 00:00:00","","EPSG","Used in Old French Triangulation (ATF).   Uses Clarke's 1865 inch-metre ratio of 39.370432 to convert axes to metres.","",NULL};
+datafile_rows_t ellipsoid_row_16[] = {"7015","Everest 1830 (1937 Adjustment)","","6377276.345","9001","300.8017","","1996-10-18 00:00:00","Survey of India professional paper #28; 1939","EPSG","Used for the 1937 readjustment of Indian triangulation.  Clarke's 1865 Indian-British foot ratio (0.99999566) and Benoit's 1898 British inch-metre ratio (39.370113) rounded as 0.30479841 exactly and applied to Everest's 1830 definition taken as a and 1/f","96.20",NULL};
+datafile_rows_t ellipsoid_row_17[] = {"7016","Everest 1830 (1967 Definition)","","6377298.556","9001","300.8017","","1995-06-02 00:00:00","","EPSG","Adopted 1967 for use in East Malaysia.  Applies Sears 1922 inch-metre ratio of 39.370147 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.","",NULL};
+datafile_rows_t ellipsoid_row_18[] = {"7018","Everest 1830 Modified","","6377304.063","9001","300.8017","","1995-06-02 00:00:00","","EPSG","Adopted 1967 for use in West Malaysia.  Applies Benoit 1898 inch-metre ratio of 39.370113 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.","",NULL};
+datafile_rows_t ellipsoid_row_19[] = {"7019","GRS 1980","","6378137.0","9001","298.257222101","","1998-11-11 00:00:00","\"Geodetic Reference System 1980\" by H. Moritz; Bulletin Geodesique","EPSG","Adopted by IUGG 1979 Canberra.  Inverse flattening is derived from geocentric gravitational constant GM = 3986005e8 m*m*m/s/s; dynamic form factor J2 = 108263e8 and Earth's angular velocity = 7292115e-11 rad/s.","98.11  98.32",NULL};
+datafile_rows_t ellipsoid_row_20[] = {"7020","Helmert 1906","","6378200.0","9001","298.3","","1995-06-02 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser","EPSG","Helmert 1906/III solution.","",NULL};
+datafile_rows_t ellipsoid_row_21[] = {"7021","Indonesian National Spheroid","","6378160.0","9001","298.247","","1995-06-02 00:00:00","Rais paper.","EPSG","Based on the GRS 1967 figure but with 1/f taken to 3 decimal places exactly.","",NULL};
+datafile_rows_t ellipsoid_row_22[] = {"7022","International 1924","","6378388.0","9001","297.0","","1995-06-02 00:00:00","","EPSG","Adopted by IUGG 1924 in Madrid. Based on Hayford 1909/1910 figures.","",NULL};
+datafile_rows_t ellipsoid_row_23[] = {"7024","Krassowsky 1940","","6378245.0","9001","298.3","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t ellipsoid_row_24[] = {"7025","NWL 9D","","6378145.0","9001","298.25","","1995-06-02 00:00:00","","EPSG","Used by Transit Precise Ephemeris between October 1971 and January 1987.","",NULL};
+datafile_rows_t ellipsoid_row_25[] = {"7027","Plessis 1817","","6376523.0","9001","308.64","","1995-06-02 00:00:00","IGN Paris \"Constants d'Ellipsoides\" February 1972.","EPSG","Rescaling of Delambre 1810 figure (a=6376985 m) to make meridional arc from equator to pole equal to 10000000 metres exactly. (Ref: Strasser).","",NULL};
+datafile_rows_t ellipsoid_row_26[] = {"7028","Struve 1860","","6378298.3","9001","294.73","","1998-11-11 00:00:00","\"Geodesia y Cartografia Matematica\" by Fernando Martin Asin; ISBN 84-398-0248-X.","EPSG","Original definition of semi-major axis given as 3272539 toise.  In \"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" , Strasser suggests a conversion factor of 1.94903631 which gives a=6378297.337 metres.","98.07  98.34",NULL};
+datafile_rows_t ellipsoid_row_27[] = {"7029","War Office","","6378300.583","9001","296.0","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t ellipsoid_row_28[] = {"7030","WGS 84","","6378137.0","9001","298.257223563","","1998-11-11 00:00:00","DMA Technical Manual 8350.2-B","EPSG","Inverse flattening derived from four defining parameters (semi-major axis; C20 = -484.16685*10e-6; earth's angular velocity w = 7292115e11 rad/sec; gravitational constant GM = 3986005e8 m*m*m/s/s).","98.32",NULL};
+datafile_rows_t ellipsoid_row_29[] = {"7031","GEM 10C","","6378137.0","9001","298.257223563","","1995-06-02 00:00:00","","EPSG","Used for  GEM 10C Gravity Potential Model.","98.32",NULL};
+datafile_rows_t ellipsoid_row_30[] = {"7032","OSU86F","","6378136.2","9001","298.257223563","","1995-06-02 00:00:00","","EPSG","Used for OSU86 gravity potential (geoidal) model.","98.32",NULL};
+datafile_rows_t ellipsoid_row_31[] = {"7033","OSU91A","","6378136.3","9001","298.257223563","","1995-06-02 00:00:00","","EPSG","Used for OSU91 gravity potential (geoidal) model.","98.32",NULL};
+datafile_rows_t ellipsoid_row_32[] = {"7034","Clarke 1880","","20926202.0","9005","293.465","20854895.0","1995-06-02 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.","EPSG","Clarke gave a and b and also 1/f=293.465 (to 3 decimal places).  1/f derived from a and b = 293.4663077�","",NULL};
+datafile_rows_t ellipsoid_row_33[] = {"7035","Sphere","","6371000.0","9001","","6371000.0","1995-06-02 00:00:00","","EPSG","Authalic sphere.  1/f is infinite.","",NULL};
+datafile_rows_t ellipsoid_row_34[] = {"7036","GRS 1967","","6378160.0","9001","298.247167427","","1998-11-11 00:00:00","\"Geodetic Reference System 1967\"; International Association of Geodesy special publication number 3; August 1971.","EPSG","Adopted by IUGG 1967 Lucerne.  Inverse flattening given is derived from geocentric gravitational constant (GM)= 398603e9 m*m*m/s/s; dynamic form factor (J2) = 0.0010827 and Earth's angular velocity w = 7.2921151467e-5 rad/s.","96.09  97.252  98.32 [...]
+datafile_rows_t ellipsoid_row_35[] = {"7041","Average Terrestrial System 1977","","6378135.0","9001","298.257","","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual","EPSG","","98.321",NULL};
+datafile_rows_t ellipsoid_row_36[] = {"7042","Everest (1830 Definition)","","20922931.8","9080","300.8017","20853374.58","1999-10-20 00:00:00","\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser","EPSG","Everest gave a and b to 2 decimal places and also 1/f=300.8017 (to 4 decimal places).","97.23",NULL};
+datafile_rows_t ellipsoid_row_37[] = {"7043","WGS 72","","6378135.0","9001","298.26","","1999-04-22 00:00:00","","EPSG","","99.03",NULL};
+datafile_rows_t ellipsoid_row_38[] = {"7044","Everest 1830 (1962 Definition)","","6377301.243","9001","300.8017255","","1999-10-20 00:00:00","","EPSG","Used by Pakistan since metrication.  Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded with slight error as 1 Ind ft = 0.3047995m exactly and applied to Everest's 1830 definition of a & b.","",NULL};
+datafile_rows_t ellipsoid_row_39[] = {"7045","Everest 1830 (1975 Definition)","","6377299.151","9001","300.8017255","","1999-10-20 00:00:00","","EPSG","Used by India since metrication.  Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded as 1 Ind ft = 0.3047995m exactly applied to Everest's 1830 original definition taken as a and b.","",NULL};
+
+datafile_rows_t *ellipsoid_rows[] = {ellipsoid_row_1,ellipsoid_row_2,ellipsoid_row_3,ellipsoid_row_4,ellipsoid_row_5,ellipsoid_row_6,ellipsoid_row_7,ellipsoid_row_8,ellipsoid_row_9,ellipsoid_row_10,ellipsoid_row_11,ellipsoid_row_12,ellipsoid_row_13,ellipsoid_row_14,ellipsoid_row_15,ellipsoid_row_16,ellipsoid_row_17,ellipsoid_row_18,ellipsoid_row_19,ellipsoid_row_20,ellipsoid_row_21,ellipsoid_row_22,ellipsoid_row_23,ellipsoid_row_24,ellipsoid_row_25,ellipsoid_row_26,ellipsoid_row_27,ellip [...]
diff --git a/src/tiff/csv/ellipsoid.csv b/src/tiff/csv/ellipsoid.csv
new file mode 100644
index 0000000..ca0cda9
--- /dev/null
+++ b/src/tiff/csv/ellipsoid.csv
@@ -0,0 +1,39 @@
+"ELLIPSOID_CODE","ELLIPSOID_EPSG_NAME","ELLIPSOID_USER_NAME","SEMI_MAJOR_AXIS","UOM_LENGTH_CODE","INV_FLATTENING","SEMI_MINOR_AXIS","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+7001,Airy 1830,,6377563.396,9001,299.3249646,,1995-06-02 00:00:00,Ordnance Survey of Great Britain.,EPSG,Original definition is a=20923713 and b=20853810 feet of 1796.   For the 1936 retriangulation OSGB defines the relationship of feet of 1796 to the International metre through log(1.48401603) exactly [=0.3048007491...]. 1/f is given to 7 decimal places.,98.321  98.34
+7002,Airy Modified 1849,,6377340.189,9001,299.3249646,,1995-06-02 00:00:00,,EPSG,OSGB Airy 1830 figure rescaled by 1.000035 to best fit the primary triangulation of Ireland.,98.321
+7003,Australian National Spheroid,,6378160.0,9001,298.25,,1995-06-02 00:00:00,"\"Australian Map Grid Technical Manual\"; National Mapping Council of Australia Special Publication #7; 1972",EPSG,Based on the GRS 1967 figure but with 1/f taken to 2 decimal places exactly.,
+7004,Bessel 1841,,6377397.155,9001,299.1528128,,1999-04-22 00:00:00,US Army Map Service Technical Manual; 1943.,EPSG,"Original Bessel definition is a=3272077.14 and b=3261139.33 toise. This used a weighted mean of values from several authors but did not account for differences in the length of the various toise: the \"Bessel toise\" is therefore of uncertain length.",98.321  98.34
+7005,Bessel Modified,,6377492.018,9001,299.1528128,,1999-04-22 00:00:00,,EPSG,Used in Norway and also in Sweden with a 1mm increase in semi-major axis.,98.321
+7006,Bessel Namibia,,6377483.865,9001,299.1528128,,1999-04-22 00:00:00,,EPSG,a = 6377397.155 German legal metres. This is the same value as the Bessel 1841 figure (code 7004) but in different units.  Used in Namibia.,97.16
+7007,Clarke 1858,,20926348.0,9005,,20855233.0,1995-06-02 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.",EPSG,Clarke's 1858/II solution. Derived parameters: a = 6378293.645m using his 1865 ratio of 0.304797265 feet per metre; 1/f = 294.26068�  In historic usage in Australia 1/f taken to two decimal places (294.26 exactly); elsewhere a and b used to derive 1/f.,99.70
+7008,Clarke 1866,,6378206.4,9001,,6356583.8,1995-06-02 00:00:00,US Army Map Service Technical Manual No. 7; 1943.,EPSG,Original definition a=20926062 and b=20855121 (British) feet. Uses Clarke's 1865 inch-metre ratio of 39.370432 to obtain metres. (Metric value then converted to US survey feet for use in the United States using 39.37 exactly giving a=20925832.16 ft US).,98.34
+7009,Clarke 1866 Michigan,,20926631.531,9003,,20855688.674,1995-06-02 00:00:00,USGS Professional Paper #1395.,EPSG,Used for Michigan NAD27 State Plane zones.  Radius = ellipsoid radius + 800 feet; this approximates the average elevation of the state.   Derived parameter: 1/f = 294.97870,98.22
+7010,Clarke 1880 (Benoit),,6378300.789,9001,,6356566.435,1995-06-02 00:00:00,,EPSG,Adopts Clarke's values for a and b.  Uses Benoit's 1895 ratio of 0.9143992 metres per yard to convert to metres.,
+7011,Clarke 1880 (IGN),,6378249.2,9001,,6356515.0,1998-04-16 00:00:00,,EPSG,Adopts Clarke's values for a and b using his 1865 ratio of 39.370432 inches per metre to convert axes to metres.,98.12
+7012,Clarke 1880 (RGS),,6378249.145,9001,293.465,,1995-06-02 00:00:00,Empire Survey Review #32; 1939.,EPSG,Adopts Clarke's values for a and 1/f.  Adopts his 1865 ratio of 39.370432 inches per metre to convert semi-major axis to metres. Also known as Clarke Modified 1880.,
+7013,Clarke 1880 (Arc),,6378249.145,9001,293.4663077,,1999-04-22 00:00:00,,EPSG,Adopts Clarke's value for a with derived 1/f.  Uses his 1865 ratio of 39.370432 inch per metre to convert semi-major axis to metres.,
+7014,Clarke 1880 (SGA 1922),,6378249.2,9001,293.46598,,1995-06-02 00:00:00,,EPSG,Used in Old French Triangulation (ATF).   Uses Clarke's 1865 inch-metre ratio of 39.370432 to convert axes to metres.,
+7015,Everest 1830 (1937 Adjustment),,6377276.345,9001,300.8017,,1996-10-18 00:00:00,Survey of India professional paper #28; 1939,EPSG,Used for the 1937 readjustment of Indian triangulation.  Clarke's 1865 Indian-British foot ratio (0.99999566) and Benoit's 1898 British inch-metre ratio (39.370113) rounded as 0.30479841 exactly and applied to Everest's 1830 definition taken as a and 1/f,96.20
+7016,Everest 1830 (1967 Definition),,6377298.556,9001,300.8017,,1995-06-02 00:00:00,,EPSG,Adopted 1967 for use in East Malaysia.  Applies Sears 1922 inch-metre ratio of 39.370147 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.,
+7018,Everest 1830 Modified,,6377304.063,9001,300.8017,,1995-06-02 00:00:00,,EPSG,Adopted 1967 for use in West Malaysia.  Applies Benoit 1898 inch-metre ratio of 39.370113 to Everest 1830 original definition of a and 1/f but with a taken to be in British rather than Indian feet.,
+7019,GRS 1980,,6378137.0,9001,298.257222101,,1998-11-11 00:00:00,"\"Geodetic Reference System 1980\" by H. Moritz; Bulletin Geodesique",EPSG,Adopted by IUGG 1979 Canberra.  Inverse flattening is derived from geocentric gravitational constant GM = 3986005e8 m*m*m/s/s; dynamic form factor J2 = 108263e8 and Earth's angular velocity = 7292115e-11 rad/s.,98.11  98.32
+7020,Helmert 1906,,6378200.0,9001,298.3,,1995-06-02 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser",EPSG,Helmert 1906/III solution.,
+7021,Indonesian National Spheroid,,6378160.0,9001,298.247,,1995-06-02 00:00:00,Rais paper.,EPSG,Based on the GRS 1967 figure but with 1/f taken to 3 decimal places exactly.,
+7022,International 1924,,6378388.0,9001,297.0,,1995-06-02 00:00:00,,EPSG,Adopted by IUGG 1924 in Madrid. Based on Hayford 1909/1910 figures.,
+7024,Krassowsky 1940,,6378245.0,9001,298.3,,1995-06-02 00:00:00,,EPSG,,
+7025,NWL 9D,,6378145.0,9001,298.25,,1995-06-02 00:00:00,,EPSG,Used by Transit Precise Ephemeris between October 1971 and January 1987.,
+7027,Plessis 1817,,6376523.0,9001,308.64,,1995-06-02 00:00:00,"IGN Paris \"Constants d'Ellipsoides\" February 1972.",EPSG,Rescaling of Delambre 1810 figure (a=6376985 m) to make meridional arc from equator to pole equal to 10000000 metres exactly. (Ref: Strasser).,
+7028,Struve 1860,,6378298.3,9001,294.73,,1998-11-11 00:00:00,"\"Geodesia y Cartografia Matematica\" by Fernando Martin Asin; ISBN 84-398-0248-X.",EPSG,"Original definition of semi-major axis given as 3272539 toise.  In \"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" , Strasser suggests a conversion factor of 1.94903631 which gives a=6378297.337 metres.",98.07  98.34
+7029,War Office,,6378300.583,9001,296.0,,1995-06-02 00:00:00,,EPSG,,
+7030,WGS 84,,6378137.0,9001,298.257223563,,1998-11-11 00:00:00,DMA Technical Manual 8350.2-B,EPSG,Inverse flattening derived from four defining parameters (semi-major axis; C20 = -484.16685*10e-6; earth's angular velocity w = 7292115e11 rad/sec; gravitational constant GM = 3986005e8 m*m*m/s/s).,98.32
+7031,GEM 10C,,6378137.0,9001,298.257223563,,1995-06-02 00:00:00,,EPSG,Used for  GEM 10C Gravity Potential Model.,98.32
+7032,OSU86F,,6378136.2,9001,298.257223563,,1995-06-02 00:00:00,,EPSG,Used for OSU86 gravity potential (geoidal) model.,98.32
+7033,OSU91A,,6378136.3,9001,298.257223563,,1995-06-02 00:00:00,,EPSG,Used for OSU91 gravity potential (geoidal) model.,98.32
+7034,Clarke 1880,,20926202.0,9005,293.465,20854895.0,1995-06-02 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser.",EPSG,Clarke gave a and b and also 1/f=293.465 (to 3 decimal places).  1/f derived from a and b = 293.4663077�,
+7035,Sphere,,6371000.0,9001,,6371000.0,1995-06-02 00:00:00,,EPSG,Authalic sphere.  1/f is infinite.,
+7036,GRS 1967,,6378160.0,9001,298.247167427,,1998-11-11 00:00:00,"\"Geodetic Reference System 1967\"; International Association of Geodesy special publication number 3; August 1971.",EPSG,Adopted by IUGG 1967 Lucerne.  Inverse flattening given is derived from geocentric gravitational constant (GM)= 398603e9 m*m*m/s/s; dynamic form factor (J2) = 0.0010827 and Earth's angular velocity w = 7.2921151467e-5 rad/s.,96.09  97.252  98.32
+7041,Average Terrestrial System 1977,,6378135.0,9001,298.257,,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual,EPSG,,98.321
+7042,Everest (1830 Definition),,20922931.8,9080,300.8017,20853374.58,1999-10-20 00:00:00,"\"Ellipsoidisch Parameter der Erdfigur (1800-1950)\" by Georg Strasser",EPSG,Everest gave a and b to 2 decimal places and also 1/f=300.8017 (to 4 decimal places).,97.23
+7043,WGS 72,,6378135.0,9001,298.26,,1999-04-22 00:00:00,,EPSG,,99.03
+7044,Everest 1830 (1962 Definition),,6377301.243,9001,300.8017255,,1999-10-20 00:00:00,,EPSG,Used by Pakistan since metrication.  Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded with slight error as 1 Ind ft = 0.3047995m exactly and applied to Everest's 1830 definition of a & b.,
+7045,Everest 1830 (1975 Definition),,6377299.151,9001,300.8017255,,1999-10-20 00:00:00,,EPSG,Used by India since metrication.  Clarke's 1865 Indian foot-British foot ratio (0.99999566) and his 1865 British inch-metre ratio (39.369971) rounded as 1 Ind ft = 0.3047995m exactly applied to Everest's 1830 original definition taken as a and b.,
diff --git a/src/tiff/csv/gcs.csv b/src/tiff/csv/gcs.csv
new file mode 100644
index 0000000..5c92614
--- /dev/null
+++ b/src/tiff/csv/gcs.csv
@@ -0,0 +1,278 @@
+"COORD_REF_SYS_CODE","COORD_REF_SYS_NAME","DATUM_CODE","DATUM_NAME","GREENWICH_DATUM","UOM_CODE","ELLIPSOID_CODE","PRIME_MERIDIAN_CODE","COORD_OP_METHOD_CODE","DX","DY","DZ","RX","RY","RZ","DS"
+4001,Unknown datum based upon the Airy 1830 ellipsoid,6001,"Not specified (based on Airy 1830 ellipsoid)",6001,9108,7001,8901,,,,,,,,
+4002,Unknown datum based upon the Airy Modified 1849 ellipsoid,6002,"Not specified (based on Airy Modified 1849 ellipsoid)",6002,9108,7002,8901,,,,,,,,
+4003,Unknown datum based upon the Australian National Spheroid,6003,"Not specified (based on Australian National Spheroid)",6003,9108,7003,8901,,,,,,,,
+4004,Unknown datum based upon the Bessel 1841 ellipsoid,6004,"Not specified (based on Bessel 1841 ellipsoid)",6004,9108,7004,8901,,,,,,,,
+4005,Unknown datum based upon the Bessel Modified ellipsoid,6005,"Not specified (based on Bessel Modified ellipsoid)",6005,9108,7005,8901,,,,,,,,
+4006,Unknown datum based upon the Bessel Namibia ellipsoid,6006,"Not specified (based on Bessel Namibia ellipsoid)",6006,9108,7046,8901,,,,,,,,
+4007,Unknown datum based upon the Clarke 1858 ellipsoid,6007,"Not specified (based on Clarke 1858 ellipsoid)",6007,9108,7007,8901,,,,,,,,
+4008,Unknown datum based upon the Clarke 1866 ellipsoid,6008,"Not specified (based on Clarke 1866 ellipsoid)",6008,9108,7008,8901,,,,,,,,
+4009,Unknown datum based upon the Clarke 1866 Michigan ellipsoid,6009,"Not specified (based on Clarke 1866 Michigan ellipsoid)",6009,9108,7009,8901,,,,,,,,
+4010,"Unknown datum based upon the Clarke 1880 (Benoit) ellipsoid",6010,"Not specified (based on Clarke 1880 (Benoit) ellipsoid)",6010,9108,7010,8901,,,,,,,,
+4011,"Unknown datum based upon the Clarke 1880 (IGN) ellipsoid",6011,"Not specified (based on Clarke 1880 (IGN) ellipsoid)",6011,9108,7011,8901,,,,,,,,
+4012,"Unknown datum based upon the Clarke 1880 (RGS) ellipsoid",6012,"Not specified (based on Clarke 1880 (RGS) ellipsoid)",6012,9108,7012,8901,,,,,,,,
+4013,"Unknown datum based upon the Clarke 1880 (Arc) ellipsoid",6013,"Not specified (based on Clarke 1880 (Arc) ellipsoid)",6013,9108,7013,8901,,,,,,,,
+4014,"Unknown datum based upon the Clarke 1880 (SGA 1922) ellipsoid",6014,"Not specified (based on Clarke 1880 (SGA 1922) ellipsoid)",6014,9108,7014,8901,,,,,,,,
+4015,"Unknown datum based upon the Everest 1830 (1937 Adjustment) ellipsoid",6015,"Not specified (based on Everest 1830 (1937 Adjustment) ellipsoid)",6015,9108,7015,8901,,,,,,,,
+4016,"Unknown datum based upon the Everest 1830 (1967 Definition) ellipsoid",6016,"Not specified (based on Everest 1830 (1967 Definition) ellipsoid)",6016,9108,7016,8901,,,,,,,,
+4018,Unknown datum based upon the Everest 1830 Modified ellipsoid,6018,"Not specified (based on Everest 1830 Modified ellipsoid)",6018,9108,7018,8901,,,,,,,,
+4019,Unknown datum based upon the GRS 1980 ellipsoid,6019,"Not specified (based on GRS 1980 ellipsoid)",6019,9108,7019,8901,,,,,,,,
+4020,Unknown datum based upon the Helmert 1906 ellipsoid,6020,"Not specified (based on Helmert 1906 ellipsoid)",6020,9108,7020,8901,,,,,,,,
+4021,Unknown datum based upon the Indonesian National Spheroid,6021,"Not specified (based on Indonesian National Spheroid)",6021,9108,7021,8901,,,,,,,,
+4022,Unknown datum based upon the International 1924 ellipsoid,6022,"Not specified (based on International 1924 ellipsoid)",6022,9108,7022,8901,,,,,,,,
+4024,Unknown datum based upon the Krassowsky 1940 ellipsoid,6024,"Not specified (based on Krassowsky 1940 ellipsoid)",6024,9108,7024,8901,,,,,,,,
+4025,Unknown datum based upon the NWL 9D ellipsoid,6025,"Not specified (based on NWL 9D ellipsoid)",6025,9108,7025,8901,,,,,,,,
+4027,Unknown datum based upon the Plessis 1817 ellipsoid,6027,"Not specified (based on Plessis 1817 ellipsoid)",6027,9108,7027,8901,,,,,,,,
+4028,Unknown datum based upon the Struve 1860 ellipsoid,6028,"Not specified (based on Struve 1860 ellipsoid)",6028,9108,7028,8901,,,,,,,,
+4029,Unknown datum based upon the War Office ellipsoid,6029,"Not specified (based on War Office ellipsoid)",6029,9108,7029,8901,,,,,,,,
+4030,Unknown datum based upon the WGS 84 ellipsoid,6030,"Not specified (based on WGS 84 ellipsoid)",6030,9108,7030,8901,,,,,,,,
+4031,Unknown datum based upon the GEM 10C ellipsoid,6031,"Not specified (based on GEM 10C ellipsoid)",6031,9108,7031,8901,,,,,,,,
+4032,Unknown datum based upon the OSU86F ellipsoid,6032,"Not specified (based on OSU86F ellipsoid)",6032,9108,7032,8901,,,,,,,,
+4033,Unknown datum based upon the OSU91A ellipsoid,6033,"Not specified (based on OSU91A ellipsoid)",6033,9108,7033,8901,,,,,,,,
+4034,Unknown datum based upon the Clarke 1880 ellipsoid,6034,"Not specified (based on Clarke 1880 ellipsoid)",6034,9108,7034,8901,,,,,,,,
+4035,Unknown datum based upon the Authalic Sphere,6035,"Not specified (based on Authalic Sphere)",6035,9108,7035,8901,,,,,,,,
+4036,Unknown datum based upon the GRS 1967 ellipsoid,6036,"Not specified (based on GRS 1967 ellipsoid)",6036,9108,7036,8901,,,,,,,,
+4041,Unknown datum based upon the Average Terrestrial System 1977 ellipsoid,6041,"Not specified (based on Average Terrestrial System 1977 ellipsoid)",6041,9108,7041,8901,,,,,,,,
+4042,"Unknown datum based upon the Everest (1830 Definition) ellipsoid",6042,"Not specified (based on Everest (1830 Definition) ellipsoid)",6042,9108,7042,8901,,,,,,,,
+4043,Unknown datum based upon the WGS 72 ellipsoid,6043,"Not specified (based on WGS 72 ellipsoid)",6043,9108,7043,8901,,,,,,,,
+4044,"Unknown datum based upon the Everest 1830 (1962 Definition) ellipsoid",6044,"Not specified (based on Everest 1830 (1962 Definition) ellipsoid)",6044,9108,7044,8901,,,,,,,,
+4045,"Unknown datum based upon the Everest 1830 (1975 Definition) ellipsoid",6045,"Not specified (based on Everest 1830 (1975 Definition) ellipsoid)",6045,9108,7045,8901,,,,,,,,
+4047,Unspecified based upon the GRS 1980 Authalic Sphere,6047,"Not specified (based on GRS 1980 Authalic Sphere)",6047,9108,7047,8901,,,,,,,,
+4120,Greek,6120,Greek,6120,9108,7004,8901,,,,,,,,
+4121,GGRS87,6121,Greek Geodetic Reference System 1987,6121,9108,7019,8901,9603,-199.87,74.79,246.62,,,,
+4122,ATS77,6122,Average Terrestrial System 1977,6122,9108,7041,8901,,,,,,,,
+4123,KKJ,6123,Kartasto Koordinaati Jarjestelma 1966,6123,9108,7022,8901,9606,-90.7,-106.1,-119.2,4.09,0.218,-1.05,1.37
+4124,RT90,6124,Rikets koordinatsystem 1990,6124,9108,7004,8901,,,,,,,,
+4125,Samboja,6125,Samboja,6125,9108,7004,8901,9603,-404.78,685.68,45.47,,,,
+4126,"LKS94 (ETRS89)",6126,"Lithuania 1994 (ETRS89)",6126,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4127,Tete,6127,Tete,6127,9108,7008,8901,,,,,,,,
+4128,Madzansua,6128,Madzansua,6128,9108,7008,8901,,,,,,,,
+4129,Observatario,6129,Observatario,6129,9108,7008,8901,,,,,,,,
+4130,Moznet,6130,"Moznet (ITRF94)",6130,9108,7030,8901,9607,0.0,0.0,0.0,0.0,0.0,0.0,0.0
+4131,Indian 1960,6131,Indian 1960,6131,9108,7015,8901,,,,,,,,
+4132,FD58,6132,Final Datum 1958,6132,9108,7012,8901,,,,,,,,
+4133,EST92,6133,Estonia 1992,6133,9108,7019,8901,9607,0.055,-0.541,-0.185,-0.0183,0.0003,0.007,-0.014
+4134,PDO Survey Datum 1993,6134,PDO Survey Datum 1993,6134,9108,7012,8901,,,,,,,,
+4135,Old Hawaiian,6135,Old Hawaiian,6135,9108,7008,8901,,,,,,,,
+4136,St. Lawrence Island,6136,St. Lawrence Island,6136,9108,7008,8901,,,,,,,,
+4137,St. Paul Island,6137,St. Paul Island,6137,9108,7008,8901,,,,,,,,
+4138,St. George Island,6138,St. George Island,6138,9108,7008,8901,,,,,,,,
+4139,Puerto Rico,6139,Puerto Rico,6139,9108,7008,8901,,,,,,,,
+4140,"NAD83(CSRS98)",6140,NAD83 Canadian Spatial Reference System,6140,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4141,Israel,6141,Israel,6141,9108,7019,8901,,,,,,,,
+4142,Locodjo 1965,6142,Locodjo 1965,6142,9108,7012,8901,9603,-125.0,53.0,467.0,,,,
+4143,Abidjan 1987,6143,Abidjan 1987,6143,9108,7012,8901,9603,-124.76,53.0,466.79,,,,
+4144,Kalianpur 1937,6144,Kalianpur 1937,6144,9108,7015,8901,,,,,,,,
+4145,Kalianpur 1962,6145,Kalianpur 1962,6145,9108,7044,8901,9603,283.0,682.0,231.0,,,,
+4146,Kalianpur 1975,6146,Kalianpur 1975,6146,9108,7045,8901,9603,295.0,736.0,257.0,,,,
+4147,Hanoi 1972,6147,Hanoi 1972,6147,9108,7024,8901,9603,-17.51,-108.32,-62.39,,,,
+4148,Hartebeesthoek94,6148,Hartebeesthoek94,6148,9108,7030,8901,9603,0.0,0.0,0.0,,,,
+4149,CH1903,6149,CH1903,6149,9108,7004,8901,,,,,,,,
+4150,"CH1903+",6150,"CH1903+",6150,9108,7004,8901,9603,674.374,15.056,405.346,,,,
+4151,CHTRF95,6151,Swiss Terrestrial Reference Frame 1995,6151,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4152,"NAD83(HARN)",6152,"NAD83 (High Accuracy Regional Network)",6152,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4153,Rassadiran,6153,Rassadiran,6153,9108,7022,8901,9603,-133.63,-157.5,-158.62,,,,
+4154,"ED50(ED77)",6154,"European Datum 1950(1977)",6154,9108,7022,8901,,,,,,,,
+4155,Dabola 1981,6155,Dabola 1981,6155,9108,7011,8901,9603,-83.0,37.0,124.0,,,,
+4156,S-JTSK,6156,Jednotne Trigonometricke Site Katastralni,6156,9108,7004,8901,,,,,,,,
+4157,Mount Dillon,6157,Mount Dillon,6157,9108,7007,8901,,,,,,,,
+4158,Naparima 1955,6158,Naparima 1955,6158,9108,7022,8901,,,,,,,,
+4159,ELD79,6159,European Libyan Datum 1979,6159,9108,7022,8901,,,,,,,,
+4160,Chos Malal 1914,6160,Chos Malal 1914,6160,9108,7022,8901,,,,,,,,
+4161,Pampa del Castillo,6161,Pampa del Castillo,6161,9108,7022,8901,,,,,,,,
+4162,Korean 1985,6162,Korean Datum 1985,6162,9108,7004,8901,,,,,,,,
+4163,Yemen NGN96,6163,Yemen National Geodetic Network 1996,6163,9108,7030,8901,9603,0.0,0.0,0.0,,,,
+4164,South Yemen,6164,South Yemen,6164,9108,7024,8901,9603,-76.0,-138.0,67.0,,,,
+4165,Bissau,6165,Bissau,6165,9108,7022,8901,9603,-173.0,253.0,27.0,,,,
+4166,Korean 1995,6166,Korean Datum 1995,6166,9108,7030,8901,9603,0.0,0.0,0.0,,,,
+4167,NZGD2000,6167,New Zealand Geodetic Datum 2000,6167,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4168,Accra,6168,Accra,6168,9108,7029,8901,9603,-199.0,32.0,322.0,,,,
+4169,American Samoa 1962,6169,American Samoa 1962,6169,9108,7008,8901,9603,-115.0,118.0,426.0,,,,
+4170,SIRGAS,6170,Sistema de Referencia Geocentrico para America del Sur,6170,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4171,RGF93,6171,Reseau Geodesique Francais 1993,6171,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4172,POSGAR,6172,Posiciones Geodesicas Argentinas,6172,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4173,IRENET95,6173,IRENET95,6173,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4174,Sierra Leone 1924,6174,Sierra Leone Colony 1924,6174,9108,7029,8901,,,,,,,,
+4175,Sierra Leone 1968,6175,Sierra Leone 1968,6175,9108,7012,8901,9603,-88.0,4.0,101.0,,,,
+4176,Australian Antarctic,6176,Australian Antarctic Datum 1998,6176,9108,7019,8901,,,,,,,,
+4178,"Pulkovo 1942(83)",6178,"Pulkovo 1942/83",6178,9108,7024,8901,9607,24.0,-123.0,-94.0,-0.02,0.25,0.13,1.1
+4179,"Pulkovo 1942(58)",6179,"Pulkovo 1942/58",6179,9108,7024,8901,9606,33.4,-146.6,-76.3,-0.359,-0.053,0.844,-0.84
+4180,EST97,6180,Estonia 1997,6180,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4181,Luxembourg 1930,6181,Luxembourg 1930,6181,9108,7022,8901,9606,-193.0,13.7,-39.3,-0.41,-2.933,2.688,0.43
+4182,Azores Occidental 1939,6182,Azores Occidental Islands 1939,6182,9108,7022,8901,,,,,,,,
+4183,Azores Central 1948,6183,Azores Central Islands 1948,6183,9108,7022,8901,,,,,,,,
+4184,Azores Oriental 1940,6184,Azores Oriental Islands 1940,6184,9108,7022,8901,,,,,,,,
+4185,Madeira 1936,6185,Madeira 1936,6185,9108,7022,8901,,,,,,,,
+4188,OSNI 1952,6188,OSNI 1952,6188,9108,7001,8901,,,,,,,,
+4189,REGVEN,6189,Red Geodesica Venezolana,6189,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4190,POSGAR 98,6190,Posiciones Geodesicas Argentinas 1998,6190,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4191,Albanian 1987,6191,Albanian 1987,6191,9108,7024,8901,,,,,,,,
+4192,Douala 1948,6192,Douala 1948,6192,9108,7022,8901,,,,,,,,
+4193,Manoca 1962,6193,Manoca 1962,6193,9108,7011,8901,9603,-70.9,-151.8,-41.4,,,,
+4194,Qornoq 1927,6194,Qornoq 1927,6194,9108,7022,8901,,,,,,,,
+4195,Scoresbysund 1952,6195,Scoresbysund 1952,6195,9108,7022,8901,9606,105.0,326.0,-102.5,0.0,0.0,0.814,-0.6
+4196,Ammassalik 1958,6196,Ammassalik 1958,6196,9108,7022,8901,9606,-45.0,417.0,-3.5,0.0,0.0,0.814,-0.6
+4197,Garoua,6197,Garoua,6197,9108,7012,8901,,,,,,,,
+4198,Kousseri,6198,Kousseri,6198,9108,7012,8901,,,,,,,,
+4199,Egypt 1930,6199,Egypt 1930,6199,9108,7022,8901,,,,,,,,
+4200,Pulkovo 1995,6200,Pulkovo 1995,6200,9108,7024,8901,,,,,,,,
+4201,Adindan,6201,Adindan,6201,9108,7012,8901,,,,,,,,
+4202,AGD66,6202,Australian Geodetic Datum 1966,6202,9108,7003,8901,,,,,,,,
+4203,AGD84,6203,Australian Geodetic Datum 1984,6203,9108,7003,8901,,,,,,,,
+4204,Ain el Abd,6204,Ain el Abd 1970,6204,9108,7022,8901,,,,,,,,
+4205,Afgooye,6205,Afgooye,6205,9108,7024,8901,9603,-43.0,-163.0,45.0,,,,
+4206,Agadez,6206,Agadez,6206,9108,7011,8901,,,,,,,,
+4207,Lisbon,6207,Lisbon 1937,6207,9108,7022,8901,,,,,,,,
+4208,Aratu,6208,Aratu,6208,9108,7022,8901,,,,,,,,
+4209,Arc 1950,6209,Arc 1950,6209,9108,7013,8901,,,,,,,,
+4210,Arc 1960,6210,Arc 1960,6210,9108,7012,8901,,,,,,,,
+4211,Batavia,6211,Batavia,6211,9108,7004,8901,,,,,,,,
+4212,Barbados 1938,6212,Barbados 1938,6212,9108,7012,8901,,,,,,,,
+4213,Beduaram,6213,Beduaram,6213,9108,7011,8901,,,,,,,,
+4214,Beijing 1954,6214,Beijing 1954,6214,9108,7024,8901,,,,,,,,
+4215,Belge 1950,6215,Reseau National Belge 1950,6215,9108,7022,8901,,,,,,,,
+4216,Bermuda 1957,6216,Bermuda 1957,6216,9108,7008,8901,9603,-73.0,213.0,296.0,,,,
+4218,Bogota 1975,6218,Bogota 1975,6218,9108,7022,8901,,,,,,,,
+4219,Bukit Rimpah,6219,Bukit Rimpah,6219,9108,7004,8901,9603,-384.0,664.0,-48.0,,,,
+4220,Camacupa,6220,Camacupa,6220,9108,7012,8901,,,,,,,,
+4221,Campo Inchauspe,6221,Campo Inchauspe,6221,9108,7022,8901,,,,,,,,
+4222,Cape,6222,Cape,6222,9108,7013,8901,,,,,,,,
+4223,Carthage,6223,Carthage,6223,9108,7011,8901,,,,,,,,
+4224,Chua,6224,Chua,6224,9108,7022,8901,9603,-134.0,229.0,-29.0,,,,
+4225,Corrego Alegre,6225,Corrego Alegre,6225,9108,7022,8901,9603,-206.0,172.0,-6.0,,,,
+4226,"Cote d'Ivoire",6226,"Cote d'Ivoire",6226,9108,7011,8901,,,,,,,,
+4227,Deir ez Zor,6227,Deir ez Zor,6227,9108,7011,8901,,,,,,,,
+4228,Douala,6228,Douala,6228,9108,7011,8901,,,,,,,,
+4229,Egypt 1907,6229,Egypt 1907,6229,9108,7020,8901,,,,,,,,
+4230,ED50,6230,European Datum 1950,6230,9108,7022,8901,,,,,,,,
+4231,ED87,6231,European Datum 1987,6231,9108,7022,8901,9606,-82.981,-99.719,-110.709,-0.5076,0.1503,0.3898,-0.3143
+4232,Fahud,6232,Fahud,6232,9108,7012,8901,,,,,,,,
+4233,Gandajika 1970,6233,Gandajika 1970,6233,9108,7022,8901,,,,,,,,
+4234,Garoua,6234,Garoua,6234,9108,7011,8901,,,,,,,,
+4235,Guyane Francaise,6235,Guyane Francaise,6235,9108,7022,8901,,,,,,,,
+4236,Hu Tzu Shan,6236,Hu Tzu Shan,6236,9108,7022,8901,9603,-637.0,-549.0,-203.0,,,,
+4237,HD72,6237,Hungarian Datum 1972,6237,9108,7036,8901,,,,,,,,
+4238,ID74,6238,Indonesian Datum 1974,6238,9108,7021,8901,,,,,,,,
+4239,Indian 1954,6239,Indian 1954,6239,9108,7015,8901,9603,217.0,823.0,299.0,,,,
+4240,Indian 1975,6240,Indian 1975,6240,9108,7015,8901,,,,,,,,
+4241,Jamaica 1875,6241,Jamaica 1875,6241,9108,7034,8901,,,,,,,,
+4242,JAD69,6242,Jamaica 1969,6242,9108,7008,8901,,,,,,,,
+4243,Kalianpur 1880,6243,Kalianpur 1880,6243,9108,7042,8901,,,,,,,,
+4244,Kandawala,6244,Kandawala,6244,9108,7015,8901,9603,-97.0,787.0,86.0,,,,
+4245,Kertau,6245,Kertau,6245,9108,7018,8901,9603,-11.0,851.0,5.0,,,,
+4246,KOC,6246,Kuwait Oil Company,6246,9108,7012,8901,,,,,,,,
+4247,La Canoa,6247,La Canoa,6247,9108,7022,8901,9603,-273.5,110.6,-357.9,,,,
+4248,PSAD56,6248,Provisional South American Datum 1956,6248,9108,7022,8901,,,,,,,,
+4249,Lake,6249,Lake,6249,9108,7022,8901,,,,,,,,
+4250,Leigon,6250,Leigon,6250,9108,7012,8901,9603,-130.0,29.0,364.0,,,,
+4251,Liberia 1964,6251,Liberia 1964,6251,9108,7012,8901,9603,-90.0,40.0,88.0,,,,
+4252,Lome,6252,Lome,6252,9108,7011,8901,,,,,,,,
+4253,Luzon 1911,6253,Luzon 1911,6253,9108,7008,8901,,,,,,,,
+4254,Hito XVIII 1963,6254,Hito XVIII 1963,6254,9108,7022,8901,9606,18.38,192.45,96.82,0.056,-0.142,-0.2,-0.0013
+4255,Herat North,6255,Herat North,6255,9108,7022,8901,9603,-333.0,-222.0,114.0,,,,
+4256,Mahe 1971,6256,Mahe 1971,6256,9108,7012,8901,9603,41.0,-220.0,-134.0,,,,
+4257,Makassar,6257,Makassar,6257,9108,7004,8901,9603,-587.8,519.75,145.76,,,,
+4258,ETRS89,6258,European Terrestrial Reference System 1989,6258,9108,7019,8901,,,,,,,,
+4259,Malongo 1987,6259,Malongo 1987,6259,9108,7022,8901,,,,,,,,
+4260,Manoca,6260,Manoca,6260,9108,7012,8901,9603,-70.9,-151.8,-41.4,,,,
+4261,Merchich,6261,Merchich,6261,9108,7011,8901,9603,31.0,146.0,47.0,,,,
+4262,Massawa,6262,Massawa,6262,9108,7004,8901,9603,639.0,405.0,60.0,,,,
+4263,Minna,6263,Minna,6263,9108,7012,8901,,,,,,,,
+4264,Mhast,6264,Mhast,6264,9108,7022,8901,9603,-252.95,-4.11,-96.38,,,,
+4265,Monte Mario,6265,Monte Mario,6265,9108,7022,8901,,,,,,,,
+4266,"M'poraloko",6266,"M'poraloko",6266,9108,7011,8901,,,,,,,,
+4267,NAD27,6267,North American Datum 1927,6267,9108,7008,8901,,,,,,,,
+4268,NAD27 Michigan,6268,NAD Michigan,6268,9108,7009,8901,,,,,,,,
+4269,NAD83,6269,North American Datum 1983,6269,9108,7019,8901,,,,,,,,
+4270,Nahrwan 1967,6270,Nahrwan 1967,6270,9108,7012,8901,,,,,,,,
+4271,Naparima 1972,6271,Naparima 1972,6271,9108,7022,8901,,,,,,,,
+4272,NZGD49,6272,New Zealand Geodetic Datum 1949,6272,9108,7022,8901,,,,,,,,
+4273,NGO 1948,6273,NGO 1948,6273,9108,7005,8901,9606,278.3,93.0,474.5,7.889,0.05,-6.61,6.21
+4274,Datum 73,6274,Datum 73,6274,9108,7022,8901,,,,,,,,
+4275,NTF,6275,Nouvelle Triangulation Francaise,6275,9108,7011,8901,9603,-168.0,-60.0,320.0,,,,
+4276,NSWC 9Z-2,6276,NSWC 9Z-2,6276,9108,7025,8901,,,,,,,,
+4277,OSGB 1936,6277,OSGB 1936,6277,9108,7001,8901,,,,,,,,
+4278,OSGB70,6278,"OSGB 1970 (SN)",6278,9108,7001,8901,,,,,,,,
+4279,"OS(SN)80",6279,"OS (SN) 1980",6279,9108,7001,8901,,,,,,,,
+4280,Padang,6280,Padang 1884,6280,9108,7004,8901,,,,,,,,
+4281,Palestine 1923,6281,Palestine 1923,6281,9108,7010,8901,,,,,,,,
+4282,Pointe Noire,6282,Congo 1960 Pointe Noire,6282,9108,7011,8901,,,,,,,,
+4283,GDA94,6283,Geocentric Datum of Australia 1994,6283,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4284,Pulkovo 1942,6284,Pulkovo 1942,6284,9108,7024,8901,,,,,,,,
+4285,Qatar 1974,6285,Qatar 1974,6285,9108,7022,8901,,,,,,,,
+4286,Qatar 1948,6286,Qatar 1948,6286,9108,7020,8901,,,,,,,,
+4287,Qornoq,6287,Qornoq,6287,9108,7022,8901,9603,164.0,138.0,-189.0,,,,
+4288,Loma Quintana,6288,Loma Quintana,6288,9108,7022,8901,,,,,,,,
+4289,Amersfoort,6289,Amersfoort,6289,9108,7004,8901,,,,,,,,
+4291,SAD69,6291,South American Datum 1969,6291,9108,7036,8901,,,,,,,,
+4292,Sapper Hill 1943,6292,Sapper Hill 1943,6292,9108,7022,8901,9603,-355.0,21.0,72.0,,,,
+4293,Schwarzeck,6293,Schwarzeck,6293,9108,7046,8901,,,,,,,,
+4294,Segora,6294,Segora,6294,9108,7004,8901,,,,,,,,
+4295,Serindung,6295,Serindung,6295,9108,7004,8901,,,,,,,,
+4296,Sudan,6296,Sudan,6296,9108,7011,8901,,,,,,,,
+4297,Tananarive,6297,Tananarive 1925,6297,9108,7022,8901,9603,-189.0,-242.0,-91.0,,,,
+4298,Timbalai 1948,6298,Timbalai 1948,6298,9108,7016,8901,,,,,,,,
+4299,TM65,6299,TM65,6299,9108,7002,8901,,,,,,,,
+4300,TM75,6300,TM75,6300,9108,7002,8901,,,,,,,,
+4301,Tokyo,6301,Tokyo,6301,9108,7004,8901,,,,,,,,
+4302,Trinidad 1903,6302,Trinidad 1903,6302,9108,7007,8901,9603,-61.702,284.488,472.052,,,,
+4303,"TC(1948)",6303,Trucial Coast 1948,6303,9108,7020,8901,,,,,,,,
+4304,Voirol 1875,6304,Voirol 1875,6304,9108,7011,8901,9603,-73.0,-247.0,227.0,,,,
+4306,Bern 1938,6306,Bern 1938,6306,9108,7004,8901,,,,,,,,
+4307,Nord Sahara 1959,6307,Nord Sahara 1959,6307,9108,7012,8901,,,,,,,,
+4308,RT38,6308,Stockholm 1938,6308,9108,7004,8901,,,,,,,,
+4309,Yacare,6309,Yacare,6309,9108,7022,8901,9603,-155.0,171.0,37.0,,,,
+4310,Yoff,6310,Yoff,6310,9108,7011,8901,,,,,,,,
+4311,Zanderij,6311,Zanderij,6311,9108,7022,8901,9603,-265.0,120.0,-358.0,,,,
+4312,MGI,6312,Militar-Geographische Institut,6312,9108,7004,8901,,,,,,,,
+4313,Belge 1972,6313,Reseau National Belge 1972,6313,9108,7022,8901,,,,,,,,
+4314,DHDN,6314,Deutsches Hauptdreiecksnetz,6314,9108,7004,8901,,,,,,,,
+4315,Conakry 1905,6315,Conakry 1905,6315,9108,7011,8901,9603,-23.0,259.0,-9.0,,,,
+4316,Dealul Piscului 1933,6316,Dealul Piscului 1933,6316,9108,7022,8901,9603,103.25,-100.4,-307.19,,,,
+4317,Dealul Piscului 1970,6317,Dealul Piscului 1970,6317,9108,7024,8901,,,,,,,,
+4318,NGN,6318,National Geodetic Network,6318,9108,7030,8901,,,,,,,,
+4319,KUDAMS,6319,Kuwait Utility,6319,9108,7019,8901,,,,,,,,
+4322,WGS 72,6322,World Geodetic System 1972,6322,9108,7043,8901,,,,,,,,
+4324,WGS 72BE,6324,WGS 72 Transit Broadcast Ephemeris,6324,9108,7043,8901,9606,0.0,0.0,1.9,0.0,0.0,0.814,-0.38
+4326,WGS 84,6326,World Geodetic System 1984,6326,9108,7030,8901,,,,,,,,
+4600,Anguilla 1957,6600,Anguilla 1957,6600,9108,7012,8901,,,,,,,,
+4601,Antigua 1943,6601,Antigua 1943,6601,9108,7012,8901,9603,-255.0,-15.0,71.0,,,,
+4602,Dominica 1945,6602,Dominica 1945,6602,9108,7012,8901,9603,725.0,685.0,536.0,,,,
+4603,Grenada 1953,6603,Grenada 1953,6603,9108,7012,8901,9603,72.0,213.7,93.0,,,,
+4604,Montserrat 1958,6604,Montserrat 1958,6604,9108,7012,8901,9603,174.0,359.0,365.0,,,,
+4605,St. Kitts 1955,6605,St. Kitts 1955,6605,9108,7012,8901,9603,9.0,183.0,236.0,,,,
+4606,St. Lucia 1955,6606,St. Lucia 1955,6606,9108,7012,8901,9603,-149.0,128.0,296.0,,,,
+4607,St. Vincent 1945,6607,St. Vincent 1945,6607,9108,7012,8901,,,,,,,,
+4608,"NAD27(76)",6608,"North American Datum 1927 (1976)",6608,9108,7008,8901,,,,,,,,
+4609,"NAD27(CGQ77)",6609,"North American Datum 1927 (CGQ77)",6609,9108,7008,8901,,,,,,,,
+4610,Xian 1980,6610,Xian 1980,6610,9108,7049,8901,,,,,,,,
+4611,Hong Kong 1980,6611,Hong Kong 1980,6611,9108,7022,8901,9606,-162.619,-276.959,-161.764,0.067753,-2.243649,-1.158827,-1.094246
+4612,JGD2000,6612,Japanese Geodetic Datum 2000,6612,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4613,Segara,6613,Gunung Segara,6613,9108,7004,8901,9603,-404.78,685.68,45.47,,,,
+4614,QND95,6614,Qatar National Datum 1995,6614,9108,7022,8901,9606,-119.4248,-303.65872,-11.00061,1.164298,0.174458,1.096259,3.657065
+4615,Porto Santo,6615,Porto Santo,6615,9108,7022,8901,,,,,,,,
+4616,Selvagem Grande,6616,Selvagem Grande,6616,9108,7022,8901,,,,,,,,
+4617,"NAD83(CSRS)",6140,NAD83 Canadian Spatial Reference System,6140,9108,7019,8901,9603,0.0,0.0,0.0,,,,
+4801,"Bern 1898 (Bern)",6801,"CH1903 (Bern)",6149,9108,7004,8907,,,,,,,,
+4802,"Bogota 1975 (Bogota)",6802,"Bogota 1975 (Bogota)",6218,9108,7022,8904,,,,,,,,
+4803,"Lisbon (Lisbon)",6803,"Lisbon 1937 (Lisbon)",6207,9108,7022,8902,,,,,,,,
+4804,"Makassar (Jakarta)",6804,"Makassar (Jakarta)",6257,9108,7004,8908,9603,-587.8,519.75,145.76,,,,
+4805,"MGI (Ferro)",6805,"Militar-Geographische Institut (Ferro)",6312,9108,7004,8909,,,,,,,,
+4806,"Monte Mario (Rome)",6806,"Monte Mario (Rome)",6265,9108,7022,8906,,,,,,,,
+4807,"NTF (Paris)",6807,"Nouvelle Triangulation Francaise (Paris)",6275,9105,7011,8903,9603,-168.0,-60.0,320.0,,,,
+4808,"Padang (Jakarta)",6808,"Padang 1884 (Jakarta)",6280,9108,7004,8908,,,,,,,,
+4809,"Belge 1950 (Brussels)",6809,"Reseau National Belge 1950 (Brussels)",6215,9108,7022,8910,,,,,,,,
+4810,"Tananarive (Paris)",6810,"Tananarive 1925 (Paris)",6297,9105,7022,8903,9603,-189.0,-242.0,-91.0,,,,
+4811,"Voirol 1875 (Paris)",6811,"Voirol 1875 (Paris)",6304,9105,7011,8903,9603,-73.0,-247.0,227.0,,,,
+4813,"Batavia (Jakarta)",6813,"Batavia (Jakarta)",6211,9108,7004,8908,,,,,,,,
+4814,"RT38 (Stockholm)",6814,"Stockholm 1938 (Stockholm)",6308,9108,7004,8911,,,,,,,,
+4815,"Greek (Athens)",6815,"Greek (Athens)",6120,9108,7004,8912,,,,,,,,
+4816,"Carthage (Paris)",6816,"Carthage (Paris)",6816,9105,7011,8903,,,,,,,,
+4817,"NGO 1948 (Oslo)",6817,"NGO 1948 (Oslo)",6273,9108,7005,8913,9606,278.3,93.0,474.5,7.889,0.05,-6.61,6.21
+4818,"S-JTSK (Ferro)",6818,"S-JTSK (Ferro)",6818,9108,7004,8909,,,,,,,,
+4819,"Nord Sahara 1959 (Paris)",6819,"Nord Sahara 1959 (Paris)",6819,9105,7012,8903,,,,,,,,
+4820,"Segara (Jakarta)",6820,"Gunung Segara (Jakarta)",6820,9108,7004,8908,,,,,,,,
+4901,"ATF (Paris)",6901,"Ancienne Triangulation Francaise (Paris)",6901,9105,7027,8903,,,,,,,,
+4902,"NDG (Paris)",6902,"Nord de Guerre (Paris)",6902,9105,7027,8903,,,,,,,,
+4903,"Madrid 1870 (Madrid)",6903,"Madrid 1870 (Madrid)",6903,9108,7028,8905,,,,,,,,
+4904,"Lisbon 1890 (Lisbon)",6904,"Lisbon 1890 (Lisbon)",6904,9108,7004,8902,,,,,,,,
diff --git a/src/tiff/csv/gdatum_alias.c b/src/tiff/csv/gdatum_alias.c
new file mode 100644
index 0000000..997aa7a
--- /dev/null
+++ b/src/tiff/csv/gdatum_alias.c
@@ -0,0 +1,11 @@
+#include "defs.h"
+datafile_rows_t gdatum_alias_row_1[] = {"GEOD_DATUM_ALIAS_CODE","GEOD_DATUM_ALIAS_NAME","GEOD_DATUM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t gdatum_alias_row_2[] = {"6400","ETRS89","6258","1999-04-22 00:00:00","","EPSG","Coincides with WGS84 at the one metre level.","99.111",NULL};
+datafile_rows_t gdatum_alias_row_3[] = {"6401","South Africa","6222","1996-10-18 00:00:00","Private Communication, Directorate of Surveys and Land Information, Cape Town.","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_4[] = {"6402","Genuk","6211","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_5[] = {"6403","NAD83 (1986)","6269","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_6[] = {"6404","Old Greek","6120","1997-06-16 00:00:00","Topographic Department; National Technical University of Greece.","EPSG","Adjective \"Old\" applied since introduction of GGRS87 (code 6121)","",NULL};
+datafile_rows_t gdatum_alias_row_7[] = {"6405","Rikets koordinatsystem 1938","6308","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t gdatum_alias_row_8[] = {"6406","Samboja P2 exc T9","6125","1997-11-13 00:00:00","Total Indonesia","EPSG","","",NULL};
+
+datafile_rows_t *gdatum_alias_rows[] = {gdatum_alias_row_1,gdatum_alias_row_2,gdatum_alias_row_3,gdatum_alias_row_4,gdatum_alias_row_5,gdatum_alias_row_6,gdatum_alias_row_7,gdatum_alias_row_8,NULL};
diff --git a/src/tiff/csv/gdatum_alias.csv b/src/tiff/csv/gdatum_alias.csv
new file mode 100644
index 0000000..5f79125
--- /dev/null
+++ b/src/tiff/csv/gdatum_alias.csv
@@ -0,0 +1,8 @@
+"GEOD_DATUM_ALIAS_CODE","GEOD_DATUM_ALIAS_NAME","GEOD_DATUM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+6400,ETRS89,6258,1999-04-22 00:00:00,,EPSG,Coincides with WGS84 at the one metre level.,99.111
+6401,South Africa,6222,1996-10-18 00:00:00,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,,
+6402,Genuk,6211,1996-10-18 00:00:00,,EPSG,,
+6403,NAD83 (1986),6269,1996-12-12 00:00:00,,EPSG,,
+6404,Old Greek,6120,1997-06-16 00:00:00,Topographic Department; National Technical University of Greece.,EPSG,"Adjective \"Old\" applied since introduction of GGRS87 (code 6121)",
+6405,Rikets koordinatsystem 1938,6308,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+6406,Samboja P2 exc T9,6125,1997-11-13 00:00:00,Total Indonesia,EPSG,,
diff --git a/src/tiff/csv/geod_datum.c b/src/tiff/csv/geod_datum.c
new file mode 100644
index 0000000..e4ea816
--- /dev/null
+++ b/src/tiff/csv/geod_datum.c
@@ -0,0 +1,213 @@
+#include "defs.h"
+datafile_rows_t geod_datum_row_1[] = {"GEOD_DATUM_CODE","GEOD_DAT_EPSG_NAME","GEOD_DAT_EPSG_ABBR","GEOD_DAT_USER_NAME","ORIGIN_DESCRIPTION","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t geod_datum_row_2[] = {"6001","Not specified (based on ellipsoid 7001)","","","","7001","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_3[] = {"6002","Not specified (based on ellipsoid 7002)","","","","7002","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_4[] = {"6003","Not specified (based on ellipsoid 7003)","","","","7003","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_5[] = {"6004","Not specified (based on ellipsoid 7004)","","","","7004","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_6[] = {"6005","Not specified (based on ellipsoid 7005)","","","","7005","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_7[] = {"6006","Not specified (based on ellipsoid 7006)","","","","7006","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_8[] = {"6007","Not specified (based on ellipsoid 7007)","","","","7007","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_9[] = {"6008","Not specified (based on ellipsoid 7008)","","","","7008","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_10[] = {"6009","Not specified (based on ellipsoid 7009)","","","","7009","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_11[] = {"6010","Not specified (based on ellipsoid 7010)","","","","7010","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_12[] = {"6011","Not specified (based on ellipsoid 7011)","","","","7011","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_13[] = {"6012","Not specified (based on ellipsoid 7012)","","","","7012","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_14[] = {"6013","Not specified (based on ellipsoid 7013)","","","","7013","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_15[] = {"6014","Not specified (based on ellipsoid 7014)","","","","7014","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_16[] = {"6015","Not specified (based on ellipsoid 7015)","","","","7015","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_17[] = {"6016","Not specified (based on ellipsoid 7016)","","","","7016","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_18[] = {"6017","Not specified (based on ellipsoid 7017)","","","","7044","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_19[] = {"6018","Not specified (based on ellipsoid 7018)","","","","7018","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_20[] = {"6019","Not specified (based on ellipsoid 7019)","","","","7019","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_21[] = {"6020","Not specified (based on ellipsoid 7020)","","","","7020","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_22[] = {"6021","Not specified (based on ellipsoid 7021)","","","","7021","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_23[] = {"6022","Not specified (based on ellipsoid 7022)","","","","7022","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_24[] = {"6024","Not specified (based on ellipsoid 7024)","","","","7024","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_25[] = {"6025","Not specified (based on ellipsoid 7025)","","","","7025","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_26[] = {"6027","Not specified (based on ellipsoid 7027)","","","","7027","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_27[] = {"6028","Not specified (based on ellipsoid 7028)","","","","7028","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_28[] = {"6029","Not specified (based on ellipsoid 7029)","","","","7029","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_29[] = {"6030","Not specified (based on ellipsoid 7030)","","","","7030","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_30[] = {"6031","Not specified (based on ellipsoid 7031)","","","","7031","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_31[] = {"6032","Not specified (based on ellipsoid 7032)","","","","7032","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_32[] = {"6033","Not specified (based on ellipsoid 7033)","","","","7033","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_33[] = {"6034","Not specified (based on ellipsoid 7034)","","","","7034","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_34[] = {"6035","Not specified (based on ellipsoid 7035)","","","","7035","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","96.08",NULL};
+datafile_rows_t geod_datum_row_35[] = {"6036","Not specified (based on ellipsoid 7036)","","","","7036","1996-09-12 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_36[] = {"6041","Not specified (based on ellipsoid 7041)","","","","7041","1999-10-20 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_37[] = {"6042","Not specified (based on ellipsoid 7042)","","","","7042","1999-10-20 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_38[] = {"6043","Not specified (based on ellipsoid 7043)","","","","7043","1999-10-20 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_39[] = {"6044","Not specified (based on ellipsoid 7044)","","","","7044","1999-10-20 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_40[] = {"6045","Not specified (based on ellipsoid 7045)","","","","7045","1999-10-20 00:00:00","","EPSG","Not a valid datum.  Included for coordinate systems where datum is unknown.","",NULL};
+datafile_rows_t geod_datum_row_41[] = {"6120","Greek","","","Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 23 deg 42 min 58.815 sec E of Greenwich","7004","1997-06-16 00:00:00","Topography Department; National Technical University of Athens","EPSG","See geodetic datum alias 6404.  Used as basis of topographic mapping based on Hatt projection.","",NULL};
+datafile_rows_t geod_datum_row_42[] = {"6121","Greek Geodetic Reference System 1987","GGRS87","","Fundamental point: Dionysos; latitude 38 deg 04 min 33.8 sec N; longitude 23 deg 55 min 51.0 sec E of Greenwich; geoid height 7.0 m.","7019","1997-06-16 00:00:00","L. Portokalakis; Public Petroleum Corporation of Greece","EPSG","Superseded (old) Greek datum.  Oil industry work based on ED50.","",NULL};
+datafile_rows_t geod_datum_row_43[] = {"6122","Average Terrestrial System 1977","ATS77","","","7041","1997-07-02 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t geod_datum_row_44[] = {"6123","Kartastokoordinaattijarjestelma","KKJ","","Adjustment with fundamental point based on ED50 transformed to best fit the older VVJ adjustment.","7022","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","Adopted in 1970.","",NULL};
+datafile_rows_t geod_datum_row_45[] = {"6124","Rikets koordinatsystem 1990","RT90","","","7004","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","Supersedes RT38 adjustment (datum code 6308)","",NULL};
+datafile_rows_t geod_datum_row_46[] = {"6125","Samboja","","","Original origin station P2 Exc now destroyed.  Extensions recomputed using Toran station T9 as origin.","7004","1997-11-13 00:00:00","Total Indonesia.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_47[] = {"6126","Lithuania 1994 (ETRS89)","LKS94 (ETRS89)","","Densification from 4  ETRF89 points.","7019","1998-03-12 00:00:00","HNIT-Baltic GeoInfoServisas","EPSG","Densification of ETRS89 during the 1992 Baltic campaign.","",NULL};
+datafile_rows_t geod_datum_row_48[] = {"6127","Tete","","","Fundamental point: Tete.","7008","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_49[] = {"6128","Madzansua","","","Fundamental point: Madzansua.","7008","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by transformation to Tete datum (datum code 6127).","",NULL};
+datafile_rows_t geod_datum_row_50[] = {"6129","Observatario","","","Fundamental point: Maputo observatory.","7008","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by transformation to Tete datum (datum code 6127).","",NULL};
+datafile_rows_t geod_datum_row_51[] = {"6130","Moznet (ITRF94)","Moznet","","ITRF 1994 epoch 20","7030","1998-04-16 00:00:00","Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_52[] = {"6131","Indian 1960","","","","7015","1998-11-11 00:00:00","","EPSG","DMA adjustment of IndoChina part of the Indian 1954 network to better fit local geoid.  Also known as Indian (DMA Reduced).","",NULL};
+datafile_rows_t geod_datum_row_53[] = {"6132","Final Datum 1958","FD58","","Fundamental point: Maniyur.  Latitude: 31 deg 23 min 59.19 sec N; Longitude: 48 deg 32 min 31.38 sec E (of Greenwich).","7012","1998-11-11 00:00:00","IOEPC records","EPSG","Network included in Nahrwan 1967 adjustment.","",NULL};
+datafile_rows_t geod_datum_row_54[] = {"6133","Estonia 1992","EST92","","Densification from 4  ETRS89 points.","7019","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Based on ETRS89 as established during the 1992 Baltic campaign.","",NULL};
+datafile_rows_t geod_datum_row_55[] = {"6134","PDO Survey Datum 1993","PSD93","","Adjustment best fitted to Fahud network.","7012","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud datum (code 6232). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t geod_datum_row_56[] = {"6135","Old Hawaiian","","","Fundamental Point: Oahu West Base Astro.  Latitude: 21 deg 18 min 13.89 sec N; longitude 157 deg 50 min 55.79 sec W (of Greenwich)","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file) and the NIMA publication http://164.214.2.59/publications/guides/Datum_Pamphlet/datum.html","EPSG","Hawaiian Islands were never on NAD27 but rather on Old Hawaiian Datum.  NADCON conversion program provides transform [...]
+datafile_rows_t geod_datum_row_57[] = {"6136","St. Lawrence Island","","","","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file)","EPSG","Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. Lawrence Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_58[] = {"6137","St. Paul Island","","","","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file)","EPSG","Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. Paul Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_59[] = {"6138","St. George Island","","","","7008","1999-05-24 00:00:00","http://www.ngs.noaa.gov/ (NADCON readme file)","EPSG","Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. George Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_60[] = {"6139","Puerto Rico","","","","7008","1999-05-24 00:00:00","Ordnance Survey of Great Britain and http://www.ngs.noaa.gov/ (NADCON readme file).","EPSG","NADCON conversion program provides transformation from Puerto Rico Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.","",NULL};
+datafile_rows_t geod_datum_row_61[] = {"6140","NAD83 Canadian Spatial Reference System","NAD83(CSRS98)","","","7019","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","Supersedes ATS77 from 1999 in New Brunswick.","",NULL};
+datafile_rows_t geod_datum_row_62[] = {"6141","Israel","","","Fundamental Point:  Latitude: 31 deg 44 min 03.817 sec N; Longitude: 35 deg 12 min 16.261 sec E (of Greenwich).","7019","1999-10-20 00:00:00","Survey of Israel.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_63[] = {"6142","Locodjo 1965","","","Fundamental Point: T5 Banco. Latitude: 5 deg 18 min 50.5 sec N; Longitude: 4 deg 02 min 05.1 sec W (of Greenwich).","7012","1999-10-20 00:00:00","IGN Paris.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_64[] = {"6143","Abidjan 1987","","","Fundamental Point: Abidjan I. Latitude: 5 deg 18 min 51.01 sec N; Longitude: 4 deg 02 min 06.04 sec W (of Greenwich).","7012","1999-10-20 00:00:00","IGN Paris.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_65[] = {"6144","Kalianpur 1937","","","Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7015","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Supercedes 1880 adjustment except for topographic mapping.  Superseded in Pakistan by 1962 metrication conversion and in India by 1975 metrication conv [...]
+datafile_rows_t geod_datum_row_66[] = {"6145","Kalianpur 1962","","","Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7044","1999-10-20 00:00:00","","EPSG","1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1962).","",NULL};
+datafile_rows_t geod_datum_row_67[] = {"6146","Kalianpur 1975","","","Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7045","1999-10-20 00:00:00","","EPSG","1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1975).","",NULL};
+datafile_rows_t geod_datum_row_68[] = {"6147","Hanoi 1972","","","","7024","1999-10-20 00:00:00","PetroVietnam","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_69[] = {"6148","Hartbeesthoek94","","","Coincident with ITRF91 (1994.0) at Hartbeesthoek astronomical observatory near Pretoria.","7030","1999-10-22 00:00:00","Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm","EPSG","Supersedes Cape datum (code 6222).","",NULL};
+datafile_rows_t geod_datum_row_70[] = {"6149","CH1903","","","Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).","7004","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_71[] = {"6150","CH1903+","","","Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).","7004","1999-10-20 00:00:00","Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_72[] = {"6151","Swiss Terrestrial Reference Frame 1995","CHTRF95","","ETRF89 at 1993.0","7019","1999-10-20 00:00:00","Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_73[] = {"6152","NAD83 (High Accuracy Regional Network)","NAD83(HARN)","","","7019","1999-10-20 00:00:00","National Geodetic Survey","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_74[] = {"6153","Rassadiran","","","Fundamental point: Total 1","7022","1999-11-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_75[] = {"6154","ED50(ED77)","","","Extension of ED50 over Iran","7022","1999-11-20 00:00:00","National Cartographic Centre of Iran","EPSG","Sometimes referred to as ED50-ED77","",NULL};
+datafile_rows_t geod_datum_row_76[] = {"6200","Pulkovo 1995","","","Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 15.359 sec N; Longitude: 30 deg 19 min 28.318 sec E (of Greenwich).","7024","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_77[] = {"6201","Adindan","","","Fundamental Point: Station 15; Adindan. Latitude: 22 deg 10 min  7.110 sec N; Longitude: 31 deg 29 min 21.608 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_78[] = {"6202","Australian Geodetic Datum 1966","AGD66","","Fundamental Point: Johnson Memorial. Latitude: 25 deg 56 min 54.551 sec S; Longitude: 133 deg 12 min 30.077 sec E (of Greenwich).","7003","1995-06-02 00:00:00","Australian Map Grid Technical Manual. National Mapping Council of Australia Technical Publication 7; 1972.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_79[] = {"6203","Australian Geodetic Datum 1984","AGD84","","","7003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_80[] = {"6204","Ain el Abd 1970","Ain el Abd","","Fundamental Point: Ain El Abd.  Latitude: 28 deg  14 min 06.171 sec N; Longitude: 48 deg 16 min 20.906 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_81[] = {"6205","Afgooye","","","","7024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_82[] = {"6206","Agadez","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_83[] = {"6207","Lisbon","","","Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 9 deg 07 min 54.862 sec W (of Greenwich).","7022","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_84[] = {"6208","Aratu","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_85[] = {"6209","Arc 1950","","","Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).","7013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_86[] = {"6210","Arc 1960","","","Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_87[] = {"6211","Batavia","","","Fundamental Point: Batavia Astro. Station. Latitude: 6 deg  7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich).","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_88[] = {"6212","Barbados 1938","","","Fundamental point: HMS Challenger astro station M1; latitude 13 deg 04 min 32.53 sec N; longitude 59 deg 36 min 29.34 sec W (of Greenwich).","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","99.171",NULL};
+datafile_rows_t geod_datum_row_89[] = {"6213","Beduaram","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_90[] = {"6214","Beijing 1954","","","","7024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_91[] = {"6215","Reseau National Belge 1950","Belge 1950","","Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_92[] = {"6216","Bermuda 1957","","","","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_93[] = {"6218","Bogota","","","Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 74 deg  4 min 51.300 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_94[] = {"6219","Bukit Rimpah","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_95[] = {"6220","Camacupa","","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_96[] = {"6221","Campo Inchauspe","","","Fundamental Point: Campo Inchauspe. Latitude: 35 deg 58 min 17.000 sec S; Longitude: 62 deg 10 min 12.000 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_97[] = {"6222","Cape","","","Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).","7013","1996-10-18 00:00:00","Private Communication, Directorate of Surveys and Land Information, Cape Town.","EPSG","","96.25  99.69",NULL};
+datafile_rows_t geod_datum_row_98[] = {"6223","Carthage","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_99[] = {"6224","Chua","","","Fundamental Point: Chua. Latitude: 19 deg 45 min 41.160 sec S; Longitude: 48 deg  6 min  7.560 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_100[] = {"6225","Corrego Alegre","","","Fundamental Point: Corrego Alegre. Latitude: 19 deg 50 min 15.140 sec S; Longitude: 48 deg 57 min 42.750 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_101[] = {"6226","Cote d'Ivoire","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_102[] = {"6227","Deir ez Zor","","","Fundamental Point: Trig. 254 Deir. Latitude: 35 deg 21 min 49.975 sec N; Longitude: 40 deg  5 min 46.770 sec E (of Greenwich).","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_103[] = {"6228","Douala","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_104[] = {"6229","Egypt 1907","","","Fundamental Point: Station F1. Latitude: 30 deg  1 min 42.860 sec N; Longitude: 31 deg 16 min 33.600 sec E (of Greenwich).","7020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_105[] = {"6230","European Datum 1950","ED50","","Fundamental Point: Potsdam (Helmert Tower). Latitude: 52 deg 22 min 51.450 sec N; Longitude: 13 deg  3 min 58.740 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_106[] = {"6231","European Datum 1987","ED87","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_107[] = {"6232","Fahud","","","Fundamental Point: Station NO68-024 Fahud. Latitude: 22 deg 17 min 31.182 sec N; Longitude: 56 deg 29 min 18.820 sec E (of Greenwich).","7012","1995-06-02 00:00:00","Petroleum Development Oman.","EPSG","Superseded by PSD93 (code 6134).","",NULL};
+datafile_rows_t geod_datum_row_108[] = {"6233","Gandajika 1970","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_109[] = {"6234","Garoua","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_110[] = {"6235","Guyane Francaise","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_111[] = {"6236","Hu Tzu Shan","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_112[] = {"6237","Hungarian Datum 1972","HD72","","Fundamental Point: Szolohegy. Latitude: 47 deg 17 min 32,6156 sec N; Longitude 19 deg 36 min 09.9865 sec E; geoid height 6.56m.","7036","1996-10-18 00:00:00","http://lazarus.elte.hu/gb/geodez/geod3.htm","EPSG","","96.09",NULL};
+datafile_rows_t geod_datum_row_113[] = {"6238","Indonesian Datum 1974","ID74","","Fundamental Point: Padang. Latitude: 0 deg 56 min 38.414 sec S; Longitude: 100 deg 22 min  8.804 sec E (of Greenwich).","7021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_114[] = {"6239","Indian 1954","","","Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_115[] = {"6240","Indian 1975","","","Fundamental Point: Khau Sakaerang","7015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_116[] = {"6241","Jamaica 1875","","","Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).","7034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_117[] = {"6242","Jamaica 1969","JAD69","","Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_118[] = {"6243","Kalianpur 1880","","","Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).","7042","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Includes 1916 extrension into Burma (Myanmar).  Superseded by 1937 adjustment.","97.23",NULL};
+datafile_rows_t geod_datum_row_119[] = {"6244","Kandawala","","","","7015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_120[] = {"6245","Kertau","","","Fundamental Point: Kertau. Latitude: 3 deg 27 min 50.710 sec N; Longitude: 102 deg 37 min 24.550 sec E (of Greenwich).","7018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_121[] = {"6246","Kuwait Oil Company","KOC","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_122[] = {"6247","La Canoa","","","Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","Origin also adopted for PSAD56.","",NULL};
+datafile_rows_t geod_datum_row_123[] = {"6248","Provisional South American Datum 1956","PSAD56","","Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","Same origin as La Canoa datum.","",NULL};
+datafile_rows_t geod_datum_row_124[] = {"6249","Lake","","","Fundamental Point: Maracaibo Cathedral. Latitude: 10 deg 38 min 34.678 sec N; Longitude: 71 deg 36 min 20.224 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_125[] = {"6250","Leigon","","","Fundamental Point: GCS Station 121. Latitude: 5 deg 38 min 52.270 sec N; Longitude: 0 deg 11 min 46.080 sec W (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_126[] = {"6251","Liberia 1964","","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_127[] = {"6252","Lome","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_128[] = {"6253","Luzon 1911","","","Fundamental Point: Balacan. Latitude: 13 deg 33 min 41.000 sec N; Longitude: 121 deg 52 min  03.000 sec E (of Greenwich).","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_129[] = {"6254","Hito XVIII 1963","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_130[] = {"6255","Herat North","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_131[] = {"6256","Mahe 1971","","","Fundamental Point: Mahe","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_132[] = {"6257","Makassar","","","Fundamental Point: Moncongloe","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_133[] = {"6258","European Terrestrial Reference Frame 89","ETRF89","","","7019","1999-04-22 00:00:00","","EPSG","Coincides with WGS84 at the one metre level.","97.11  97.55  99.111",NULL};
+datafile_rows_t geod_datum_row_134[] = {"6259","Malongo 1987","","","Fundamental Point: Station Y at Malongo base camp. Latitude: 5 deg 23 min 34.327 sec S; Longitude: 12 deg 12 min  02.393 sec E (of Greenwich).","7022","1995-06-02 00:00:00","Chevron Petroleum Technology.","EPSG","Offshore extension of Mhast datum (6264) using Transit translocation.","",NULL};
+datafile_rows_t geod_datum_row_135[] = {"6260","Manoca","","","","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_136[] = {"6261","Merchich","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_137[] = {"6262","Massawa","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_138[] = {"6263","Minna","","","Fundamental Point: Minna base station L40. Latitude: 9 deg 38 min  09.000 sec N; Longitude: 6 deg 30 min 59.000 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_139[] = {"6264","Mhast","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_140[] = {"6265","Monte Mario","","","Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg  00 min  00.000 sec E (of Rome).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_141[] = {"6266","M'poraloko","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_142[] = {"6267","North American Datum 1927","NAD27","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_143[] = {"6268","NAD Michigan","","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_144[] = {"6269","North American Datum 1983","NAD83","","Origin at geocentre.","7019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_145[] = {"6270","Nahrwan 1967","","","Fundamental point: Nahrwan south base.  Latitude: 33 deg 19 min 10.87 sec N; Longitude: 44 deg 43 min 25.54 sec E (of Greenwich).","7012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_146[] = {"6271","Naparima 1972","","","Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_147[] = {"6272","New Zealand Geodetic Datum 1949","GD49","","Fundamental Point: Papatahi. Latitude: 41 deg 19 min  8.900 sec S; Longitude: 175 deg  02 min 51.000 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_148[] = {"6273","NGO 1948","","","","7005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_149[] = {"6274","Datum 73","","","Fundamental Point:  Latitude: 39 deg 41 min 37.30 sec N; Longitude: 8 deg 07 min 53.31 sec W (of Greenwich).","7022","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_150[] = {"6275","Nouvelle Triangulation Francaise","NTF","","Fundamental Point: Pantheon","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_151[] = {"6276","NSWC 9Z-2","","","","7025","1995-06-02 00:00:00","","EPSG","Transit precise ephemeris before 1991.","",NULL};
+datafile_rows_t geod_datum_row_152[] = {"6277","OSGB 1936","","","Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).","7001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_153[] = {"6278","OSGB 1970 (SN)","OSGB70","","Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).","7001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_154[] = {"6279","OS (SN) 1980","OS(SN)80","","Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).","7001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_155[] = {"6280","Padang 1884","Padang","","Fundamental Point: Padang","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_156[] = {"6281","Palestine 1923","","","Fundamental Point: Point 82'M  Jerusalem. Latitude: 31 deg 44 min  2.749 sec N; Longitude: 35 deg 12 min 43.490 sec E (of Greenwich).","7010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_157[] = {"6282","Pointe Noire","","","Fundamental Point: Point Noire Astro. Latitude: 4 deg 47 min  0.100 sec S; Longitude: 11 deg 51 min  1.550 sec E (of Greenwich).","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_158[] = {"6283","Geocentric Datum of Australia 1994","GDA94","","","7019","1995-06-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Coincident with WGS84 to within 1 metre.","",NULL};
+datafile_rows_t geod_datum_row_159[] = {"6284","Pulkovo 1942","","","Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).","7024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_160[] = {"6285","Qatar","","","Fundamental Point: Station G3","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_161[] = {"6286","Qatar 1948","","","Fundamental Point: Sokey 0 M. Latitude: 25 deg 22 min 56.500 sec N; Longitude: 50 deg 45 min 41.000 sec E (of Greenwich).","7020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_162[] = {"6287","Qornoq","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_163[] = {"6288","Loma Quintana","","","Fundamental Point: Loma Quintana","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_164[] = {"6289","Amersfoort","","","Fundamental Point: Amersfoort. Latitude: 52 deg  09 min 22.178 sec N; Longitude: 5 deg 23 min 15.478 sec E (of Greenwich).","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_165[] = {"6291","South American Datum 1969","SAD69","","","7036","1996-10-18 00:00:00","","EPSG","SAD69 uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision is 0 to 31mm.","96.09  97.252",NULL};
+datafile_rows_t geod_datum_row_166[] = {"6292","Sapper Hill 1943","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_167[] = {"6293","Schwarzeck","","","","7006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_168[] = {"6294","Segora","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_169[] = {"6295","Serindung","","","","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_170[] = {"6296","Sudan","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_171[] = {"6297","Tananarive 1925","Tananarive","","Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min  2.100 sec S; Longitude: 45 deg 12 min 52.800 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_172[] = {"6298","Timbalai 1948","","","Fundamental Point: Timbalai. Latitude: 5 deg 17 min  3.548 sec N; Longitude: 115 deg 10 min 56.409 sec E (of Greenwich).","7016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_173[] = {"6299","TM65","","","","7002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_174[] = {"6300","TM75","","","","7002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_175[] = {"6301","Tokyo","","","Fundamental Point: Nikon-Keido-Genten. Latitude: 35 deg 39 min 17.5148 sec N; Longitude: 139 deg 44 min 40.5020 sec E (of Greenwich).","7004","1995-06-02 00:00:00","Geographic Survey Institute; Japan; Bulletin 40 (March 1994).  Also http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html","EPSG","","98.46",NULL};
+datafile_rows_t geod_datum_row_176[] = {"6302","Trinidad 1903","","","","7007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_177[] = {"6303","Trucial Coast 1948","TC(1948)","","Fundamental Point: TC1. Latitude: 25 deg 23 min 50.190 sec N; Longitude: 55 deg 26 min 43.950 sec E (of Greenwich).","7020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_178[] = {"6304","Voirol 1875","","","Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.","7011","1995-06-02 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_179[] = {"6305","Voirol Unifie 1960","Voirol Unifie","","","7012","1999-10-20 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","Conformal transformation from ED50. Used only with Lambert Algeria zones: in other cases use Nord Sahara 1959 geodetic datum.","99.62",NULL};
+datafile_rows_t geod_datum_row_180[] = {"6306","Bern 1938","","","Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  7.890 sec N; Longitude: 7 deg 26 min 22.335 sec E (of Greenwich).","7004","1995-06-02 00:00:00","\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967","EPSG","This redetermination of the coordinates of fundamental point is used for scientific purposes and as the graticule overprinted on topographic maps constructed on the CH1903 / [...]
+datafile_rows_t geod_datum_row_181[] = {"6307","Nord Sahara 1959","","","","7012","1999-10-20 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","Conformal transformation from ED50.","99.62",NULL};
+datafile_rows_t geod_datum_row_182[] = {"6308","Stockholm 1938","RT38","","Fundamental Point: Stockholm observatory","7004","1996-04-12 00:00:00","","EPSG","Superseded by RT90 adjustment (datum code 6124)","",NULL};
+datafile_rows_t geod_datum_row_183[] = {"6309","Yacare","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_184[] = {"6310","Yoff","","","","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_185[] = {"6311","Zanderij","","","","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_186[] = {"6312","Militar-Geographische Institut","MGI","","Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 16 deg 17 min 41.06 sec E (of Greenwich).","7004","1995-06-02 00:00:00","Bundesamt fur Eich- und Vermessungswesen; Wien","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_187[] = {"6313","Reseau National Belge 1972","Belge 1972","","Fundamental Point: Uccle observatory. Latitude: 50 deg 47 min 57.704 sec N; Longitude: 4 deg 21 min 24.983 sec E (of Greenwich).","7022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_188[] = {"6314","Deutsche Hauptdreiecksnetz","DHDN","","Fundamental Point: Potsdam. Latitude: 52 deg 22 min 53.954 sec N; Longitude: 13 deg 04 min 01.153 sec E (of Greenwich).","7004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_189[] = {"6315","Conakry 1905","","","Fundamental Point: Conakry. Latitude: 10.573766g N; Longitude: 17.833682g W (of Paris).","7011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_190[] = {"6316","Dealul Piscului 1933","","","Fundamental point: latitude 44 deg 24 min 33.9606 sec N; longitude 26 deg 06 min 44.8772 sec E (of Greenwich).","7022","1996-04-12 00:00:00","Institute for Geodesy Photogrametry and Land Management","EPSG","Superseded by 1970 adjustment (datum code 6317)","",NULL};
+datafile_rows_t geod_datum_row_191[] = {"6317","Dealul Piscului 1970","","","Fundamental point: latitude 44 deg 24 min 23.7709 sec N; longitude 26deg 06 min 44.1265 sec E (of Greenwich).","7024","1996-04-12 00:00:00","Institute for Geodesy Photogrametry and Land Management","EPSG","Supersedes 1933 adjustment (datum code 6316)","",NULL};
+datafile_rows_t geod_datum_row_192[] = {"6318","National Geodetic Network","NGN","","","7030","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_193[] = {"6319","Kuwait Utility","KUDAMS","","","7019","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_194[] = {"6322","World Geodetic System 1972","WGS 72","","","7043","1999-04-22 00:00:00","","EPSG","Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE.                                                                                                                  \
+Datum code 6323 reserved for southern hemisphere ProjCS's.","99.03",NULL};
+datafile_rows_t geod_datum_row_195[] = {"6324","WGS 72 Transit Broadcast Ephemeris","WGS 72BE","","","7043","1999-04-22 00:00:00","","EPSG","Alleged datum for use with Transit broadcast ephemeris prior to 1989. Relationship to WGS 72 has changed over time.  Datum code 6325 reserved for southern hemisphere ProjCS's.","99.03",NULL};
+datafile_rows_t geod_datum_row_196[] = {"6326","World Geodetic System 1984","WGS 84","","Origin at geocentre.","7030","1995-06-02 00:00:00","","EPSG","Datum code 6327 reserved for southern hemisphere ProjCS's","",NULL};
+datafile_rows_t geod_datum_row_197[] = {"6600","Anguilla 1957","","","Fundamental point: station A4.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_198[] = {"6601","Antigua 1943","","","Fundamental point: station A14.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_199[] = {"6602","Dominica 1945","","","Fundamental point: station M12.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_200[] = {"6603","Grenada 1953","","","Fundamental point: station GS8.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_201[] = {"6604","Montserrat 1958","","","Fundamental point: station M36.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_202[] = {"6605","St. Kitts 1955","","","Fundamental point: station K12.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_203[] = {"6606","St. Lucia 1955","","","Fundamental point: station DCS3.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_204[] = {"6607","St. Vincent 1945","","","Fundamental point: station V1.","7012","1999-04-22 00:00:00","Ordnance Survey of Great Britain.","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_205[] = {"6608","North American Datum 1927 (1976)","NAD27(76)","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7008","1999-05-12 00:00:00","Geodetic Survey of Canada.","EPSG","NAD27(76) used in Ontario for all maps at scale 1/20 000 and larger; elsewhere in Canada for selected purposes.","",NULL};
+datafile_rows_t geod_datum_row_206[] = {"6609","North American Datum 1927 (CGQ77)","CGQ77","","Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).","7008","1999-05-12 00:00:00","Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca","EPSG","NAD27 (CGQ77) used in Quebec for all maps at scale 1/20 000 and larger; generally for maps issued by the Quebec cartography office whose reference system is CGQ77.", [...]
+datafile_rows_t geod_datum_row_207[] = {"6901","Ancienne Triangulation Francaise","ATF","","","7027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_208[] = {"6902","Nord de Guerre","NDG","","","7027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_datum_row_209[] = {"6903","Madrid 1870","","","Fundamental point: Madrid observatory.","7028","1998-11-11 00:00:00","Institut de Geomatica; Barcelona","EPSG","","",NULL};
+
+datafile_rows_t *geod_datum_rows[] = {geod_datum_row_1,geod_datum_row_2,geod_datum_row_3,geod_datum_row_4,geod_datum_row_5,geod_datum_row_6,geod_datum_row_7,geod_datum_row_8,geod_datum_row_9,geod_datum_row_10,geod_datum_row_11,geod_datum_row_12,geod_datum_row_13,geod_datum_row_14,geod_datum_row_15,geod_datum_row_16,geod_datum_row_17,geod_datum_row_18,geod_datum_row_19,geod_datum_row_20,geod_datum_row_21,geod_datum_row_22,geod_datum_row_23,geod_datum_row_24,geod_datum_row_25,geod_datum_ro [...]
diff --git a/src/tiff/csv/geod_datum.csv b/src/tiff/csv/geod_datum.csv
new file mode 100644
index 0000000..94a13d9
--- /dev/null
+++ b/src/tiff/csv/geod_datum.csv
@@ -0,0 +1,210 @@
+"GEOD_DATUM_CODE","GEOD_DAT_EPSG_NAME","GEOD_DAT_EPSG_ABBR","GEOD_DAT_USER_NAME","ORIGIN_DESCRIPTION","ELLIPSOID_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+6001,Not specified (based on ellipsoid 7001),,,,7001,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6002,Not specified (based on ellipsoid 7002),,,,7002,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6003,Not specified (based on ellipsoid 7003),,,,7003,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6004,Not specified (based on ellipsoid 7004),,,,7004,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6005,Not specified (based on ellipsoid 7005),,,,7005,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6006,Not specified (based on ellipsoid 7006),,,,7006,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6007,Not specified (based on ellipsoid 7007),,,,7007,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6008,Not specified (based on ellipsoid 7008),,,,7008,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6009,Not specified (based on ellipsoid 7009),,,,7009,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6010,Not specified (based on ellipsoid 7010),,,,7010,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6011,Not specified (based on ellipsoid 7011),,,,7011,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6012,Not specified (based on ellipsoid 7012),,,,7012,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6013,Not specified (based on ellipsoid 7013),,,,7013,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6014,Not specified (based on ellipsoid 7014),,,,7014,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6015,Not specified (based on ellipsoid 7015),,,,7015,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6016,Not specified (based on ellipsoid 7016),,,,7016,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6017,Not specified (based on ellipsoid 7017),,,,7044,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6018,Not specified (based on ellipsoid 7018),,,,7018,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6019,Not specified (based on ellipsoid 7019),,,,7019,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6020,Not specified (based on ellipsoid 7020),,,,7020,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6021,Not specified (based on ellipsoid 7021),,,,7021,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6022,Not specified (based on ellipsoid 7022),,,,7022,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6024,Not specified (based on ellipsoid 7024),,,,7024,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6025,Not specified (based on ellipsoid 7025),,,,7025,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6027,Not specified (based on ellipsoid 7027),,,,7027,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6028,Not specified (based on ellipsoid 7028),,,,7028,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6029,Not specified (based on ellipsoid 7029),,,,7029,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6030,Not specified (based on ellipsoid 7030),,,,7030,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6031,Not specified (based on ellipsoid 7031),,,,7031,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6032,Not specified (based on ellipsoid 7032),,,,7032,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6033,Not specified (based on ellipsoid 7033),,,,7033,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6034,Not specified (based on ellipsoid 7034),,,,7034,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6035,Not specified (based on ellipsoid 7035),,,,7035,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,96.08
+6036,Not specified (based on ellipsoid 7036),,,,7036,1996-09-12 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,
+6041,Not specified (based on ellipsoid 7041),,,,7041,1999-10-20 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,
+6042,Not specified (based on ellipsoid 7042),,,,7042,1999-10-20 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,
+6043,Not specified (based on ellipsoid 7043),,,,7043,1999-10-20 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,
+6044,Not specified (based on ellipsoid 7044),,,,7044,1999-10-20 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,
+6045,Not specified (based on ellipsoid 7045),,,,7045,1999-10-20 00:00:00,,EPSG,Not a valid datum.  Included for coordinate systems where datum is unknown.,
+6120,Greek,,,Fundamental point: Athens Observatory; latitude 37 deg 58 min 20.132 sec N; longitude 23 deg 42 min 58.815 sec E of Greenwich,7004,1997-06-16 00:00:00,Topography Department; National Technical University of Athens,EPSG,See geodetic datum alias 6404.  Used as basis of topographic mapping based on Hatt projection.,
+6121,Greek Geodetic Reference System 1987,GGRS87,,Fundamental point: Dionysos; latitude 38 deg 04 min 33.8 sec N; longitude 23 deg 55 min 51.0 sec E of Greenwich; geoid height 7.0 m.,7019,1997-06-16 00:00:00,L. Portokalakis; Public Petroleum Corporation of Greece,EPSG,Superseded (old) Greek datum.  Oil industry work based on ED50.,
+6122,Average Terrestrial System 1977,ATS77,,,7041,1997-07-02 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+6123,Kartastokoordinaattijarjestelma,KKJ,,Adjustment with fundamental point based on ED50 transformed to best fit the older VVJ adjustment.,7022,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,Adopted in 1970.,
+6124,Rikets koordinatsystem 1990,RT90,,,7004,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,Supersedes RT38 adjustment (datum code 6308),
+6125,Samboja,,,Original origin station P2 Exc now destroyed.  Extensions recomputed using Toran station T9 as origin.,7004,1997-11-13 00:00:00,Total Indonesia.,EPSG,,
+6126,Lithuania 1994 (ETRS89),LKS94 (ETRS89),,Densification from 4  ETRF89 points.,7019,1998-03-12 00:00:00,HNIT-Baltic GeoInfoServisas,EPSG,Densification of ETRS89 during the 1992 Baltic campaign.,
+6127,Tete,,,Fundamental point: Tete.,7008,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+6128,Madzansua,,,Fundamental point: Madzansua.,7008,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by transformation to Tete datum (datum code 6127).,
+6129,Observatario,,,Fundamental point: Maputo observatory.,7008,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by transformation to Tete datum (datum code 6127).,
+6130,Moznet (ITRF94),Moznet,,ITRF 1994 epoch 20,7030,1998-04-16 00:00:00,Mozambique Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+6131,Indian 1960,,,,7015,1998-11-11 00:00:00,,EPSG,DMA adjustment of IndoChina part of the Indian 1954 network to better fit local geoid.  Also known as Indian (DMA Reduced).,
+6132,Final Datum 1958,FD58,,Fundamental point: Maniyur.  Latitude: 31 deg 23 min 59.19 sec N; Longitude: 48 deg 32 min 31.38 sec E (of Greenwich).,7012,1998-11-11 00:00:00,IOEPC records,EPSG,Network included in Nahrwan 1967 adjustment.,
+6133,Estonia 1992,EST92,,Densification from 4  ETRS89 points.,7019,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Based on ETRS89 as established during the 1992 Baltic campaign.,
+6134,PDO Survey Datum 1993,PSD93,,Adjustment best fitted to Fahud network.,7012,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud datum (code 6232). Maximum differences to Fahud adjustment are 20 metres.,
+6135,Old Hawaiian,,,Fundamental Point: Oahu West Base Astro.  Latitude: 21 deg 18 min 13.89 sec N; longitude 157 deg 50 min 55.79 sec W (of Greenwich),7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file) and the NIMA publication http://164.214.2.59/publications/guides/Datum_Pamphlet/datum.html,EPSG,Hawaiian Islands were never on NAD27 but rather on Old Hawaiian Datum.  NADCON conversion program provides transformation from Old Hawaiian Datum to NAD83 (original 1986 real [...]
+6136,St. Lawrence Island,,,,7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. Lawrence Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,
+6137,St. Paul Island,,,,7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. Paul Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,
+6138,St. George Island,,,,7008,1999-05-24 00:00:00,http://www.ngs.noaa.gov/ (NADCON readme file),EPSG,Many Alaskan islands were never on NAD27 but rather on independent datums.  NADCON conversion program provides transformation from St. George Island Datum to NAD83 (original 1986 realization) - making the transformation appear to user as if from NAD27.,
+6139,Puerto Rico,,,,7008,1999-05-24 00:00:00,Ordnance Survey of Great Britain and http://www.ngs.noaa.gov/ (NADCON readme file).,EPSG,NADCON conversion program provides transformation from Puerto Rico Datum to NAD83 (original 1986 realization) but making the transformation appear to user as if from NAD27.,
+6140,NAD83 Canadian Spatial Reference System,NAD83(CSRS98),,,7019,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,Supersedes ATS77 from 1999 in New Brunswick.,
+6141,Israel,,,Fundamental Point:  Latitude: 31 deg 44 min 03.817 sec N; Longitude: 35 deg 12 min 16.261 sec E (of Greenwich).,7019,1999-10-20 00:00:00,Survey of Israel.,EPSG,,
+6142,Locodjo 1965,,,Fundamental Point: T5 Banco. Latitude: 5 deg 18 min 50.5 sec N; Longitude: 4 deg 02 min 05.1 sec W (of Greenwich).,7012,1999-10-20 00:00:00,IGN Paris.,EPSG,,
+6143,Abidjan 1987,,,Fundamental Point: Abidjan I. Latitude: 5 deg 18 min 51.01 sec N; Longitude: 4 deg 02 min 06.04 sec W (of Greenwich).,7012,1999-10-20 00:00:00,IGN Paris.,EPSG,,
+6144,Kalianpur 1937,,,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7015,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Supercedes 1880 adjustment except for topographic mapping.  Superseded in Pakistan by 1962 metrication conversion and in India by 1975 metrication conversion.,
+6145,Kalianpur 1962,,,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7044,1999-10-20 00:00:00,,EPSG,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1962).,
+6146,Kalianpur 1975,,,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7045,1999-10-20 00:00:00,,EPSG,1937 adjustment rescaled by ratio metric conversions of Indian foot (1937) to Indian foot (1975).,
+6147,Hanoi 1972,,,,7024,1999-10-20 00:00:00,PetroVietnam,EPSG,,
+6148,Hartbeesthoek94,,,Coincident with ITRF91 (1994.0) at Hartbeesthoek astronomical observatory near Pretoria.,7030,1999-10-22 00:00:00,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,Supersedes Cape datum (code 6222).,
+6149,CH1903,,,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).,7004,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,,
+6150,CH1903+,,,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  8.660 sec N; Longitude: 7 deg 26 min 22.500 sec E (of Greenwich).,7004,1999-10-20 00:00:00,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+6151,Swiss Terrestrial Reference Frame 1995,CHTRF95,,ETRF89 at 1993.0,7019,1999-10-20 00:00:00,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+6152,NAD83 (High Accuracy Regional Network),NAD83(HARN),,,7019,1999-10-20 00:00:00,National Geodetic Survey,EPSG,,
+6153,Rassadiran,,,Fundamental point: Total 1,7022,1999-11-20 00:00:00,Total-Fina,EPSG,,
+6154,ED50(ED77),,,Extension of ED50 over Iran,7022,1999-11-20 00:00:00,National Cartographic Centre of Iran,EPSG,Sometimes referred to as ED50-ED77,
+6200,Pulkovo 1995,,,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 15.359 sec N; Longitude: 30 deg 19 min 28.318 sec E (of Greenwich).,7024,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+6201,Adindan,,,Fundamental Point: Station 15; Adindan. Latitude: 22 deg 10 min  7.110 sec N; Longitude: 31 deg 29 min 21.608 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6202,Australian Geodetic Datum 1966,AGD66,,Fundamental Point: Johnson Memorial. Latitude: 25 deg 56 min 54.551 sec S; Longitude: 133 deg 12 min 30.077 sec E (of Greenwich).,7003,1995-06-02 00:00:00,Australian Map Grid Technical Manual. National Mapping Council of Australia Technical Publication 7; 1972.,EPSG,,
+6203,Australian Geodetic Datum 1984,AGD84,,,7003,1995-06-02 00:00:00,,EPSG,,
+6204,Ain el Abd 1970,Ain el Abd,,Fundamental Point: Ain El Abd.  Latitude: 28 deg  14 min 06.171 sec N; Longitude: 48 deg 16 min 20.906 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6205,Afgooye,,,,7024,1995-06-02 00:00:00,,EPSG,,
+6206,Agadez,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6207,Lisbon,,,Fundamental Point: Castelo Sao Jorge; Lisbon. Latitude: 38 deg 42 min 43.631 sec N; Longitude: 9 deg 07 min 54.862 sec W (of Greenwich).,7022,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+6208,Aratu,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6209,Arc 1950,,,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,7013,1995-06-02 00:00:00,,EPSG,,
+6210,Arc 1960,,,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6211,Batavia,,,Fundamental Point: Batavia Astro. Station. Latitude: 6 deg  7 min 39.520 sec S; Longitude: 106 deg 48 min 27.790 sec E (of Greenwich).,7004,1995-06-02 00:00:00,,EPSG,,
+6212,Barbados 1938,,,Fundamental point: HMS Challenger astro station M1; latitude 13 deg 04 min 32.53 sec N; longitude 59 deg 36 min 29.34 sec W (of Greenwich).,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,99.171
+6213,Beduaram,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6214,Beijing 1954,,,,7024,1995-06-02 00:00:00,,EPSG,,
+6215,Reseau National Belge 1950,Belge 1950,,Fundamental Point: Lommel (tower). Latitude: 51 deg 13 min 47.334 sec N; Longitude: 0 deg 56 min 44.773 sec E (of Brussels).,7022,1995-06-02 00:00:00,,EPSG,,
+6216,Bermuda 1957,,,,7008,1995-06-02 00:00:00,,EPSG,,
+6218,Bogota,,,Fundamental Point: Bogota observatory. Latitude: 4 deg 35 min 56.570 sec N; Longitude: 74 deg  4 min 51.300 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6219,Bukit Rimpah,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6220,Camacupa,,,,7012,1995-06-02 00:00:00,,EPSG,,
+6221,Campo Inchauspe,,,Fundamental Point: Campo Inchauspe. Latitude: 35 deg 58 min 17.000 sec S; Longitude: 62 deg 10 min 12.000 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6222,Cape,,,Fundamental Point: Buffelsfontein. Latitude: 33 deg 59 min 32.000 sec S; Longitude: 25 deg 30 min 44.622 sec E (of Greenwich).,7013,1996-10-18 00:00:00,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,,96.25  99.69
+6223,Carthage,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6224,Chua,,,Fundamental Point: Chua. Latitude: 19 deg 45 min 41.160 sec S; Longitude: 48 deg  6 min  7.560 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6225,Corrego Alegre,,,Fundamental Point: Corrego Alegre. Latitude: 19 deg 50 min 15.140 sec S; Longitude: 48 deg 57 min 42.750 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6226,Cote d'Ivoire,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6227,Deir ez Zor,,,Fundamental Point: Trig. 254 Deir. Latitude: 35 deg 21 min 49.975 sec N; Longitude: 40 deg  5 min 46.770 sec E (of Greenwich).,7011,1995-06-02 00:00:00,,EPSG,,
+6228,Douala,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6229,Egypt 1907,,,Fundamental Point: Station F1. Latitude: 30 deg  1 min 42.860 sec N; Longitude: 31 deg 16 min 33.600 sec E (of Greenwich).,7020,1995-06-02 00:00:00,,EPSG,,
+6230,European Datum 1950,ED50,,Fundamental Point: Potsdam (Helmert Tower). Latitude: 52 deg 22 min 51.450 sec N; Longitude: 13 deg  3 min 58.740 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6231,European Datum 1987,ED87,,,7022,1995-06-02 00:00:00,,EPSG,,
+6232,Fahud,,,Fundamental Point: Station NO68-024 Fahud. Latitude: 22 deg 17 min 31.182 sec N; Longitude: 56 deg 29 min 18.820 sec E (of Greenwich).,7012,1995-06-02 00:00:00,Petroleum Development Oman.,EPSG,Superseded by PSD93 (code 6134).,
+6233,Gandajika 1970,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6234,Garoua,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6235,Guyane Francaise,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6236,Hu Tzu Shan,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6237,Hungarian Datum 1972,HD72,,"Fundamental Point: Szolohegy. Latitude: 47 deg 17 min 32,6156 sec N; Longitude 19 deg 36 min 09.9865 sec E; geoid height 6.56m.",7036,1996-10-18 00:00:00,http://lazarus.elte.hu/gb/geodez/geod3.htm,EPSG,,96.09
+6238,Indonesian Datum 1974,ID74,,Fundamental Point: Padang. Latitude: 0 deg 56 min 38.414 sec S; Longitude: 100 deg 22 min  8.804 sec E (of Greenwich).,7021,1995-06-02 00:00:00,,EPSG,,
+6239,Indian 1954,,,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7015,1995-06-02 00:00:00,,EPSG,,
+6240,Indian 1975,,,Fundamental Point: Khau Sakaerang,7015,1995-06-02 00:00:00,,EPSG,,
+6241,Jamaica 1875,,,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,7034,1995-06-02 00:00:00,,EPSG,,
+6242,Jamaica 1969,JAD69,,Fundamental Point: Fort Charles Flagstaff. Latitude: 17 deg 55 min 55.800 sec N; Longitude: 76 deg 56 min 37.260 sec W (of Greenwich).,7008,1995-06-02 00:00:00,,EPSG,,
+6243,Kalianpur 1880,,,Fundamental Point: Kalianpur. Latitude: 24 deg  07 min 11.260 sec N; Longitude: 77 deg 39 min 17.570 sec E (of Greenwich).,7042,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Includes 1916 extrension into Burma (Myanmar).  Superseded by 1937 adjustment.,97.23
+6244,Kandawala,,,,7015,1995-06-02 00:00:00,,EPSG,,
+6245,Kertau,,,Fundamental Point: Kertau. Latitude: 3 deg 27 min 50.710 sec N; Longitude: 102 deg 37 min 24.550 sec E (of Greenwich).,7018,1995-06-02 00:00:00,,EPSG,,
+6246,Kuwait Oil Company,KOC,,,7012,1995-06-02 00:00:00,,EPSG,,
+6247,La Canoa,,,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,Origin also adopted for PSAD56.,
+6248,Provisional South American Datum 1956,PSAD56,,Fundamental Point: La Canoa. Latitude: 8 deg 34 min 17.170 sec N; Longitude: 63 deg 51 min 34.880 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,Same origin as La Canoa datum.,
+6249,Lake,,,Fundamental Point: Maracaibo Cathedral. Latitude: 10 deg 38 min 34.678 sec N; Longitude: 71 deg 36 min 20.224 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6250,Leigon,,,Fundamental Point: GCS Station 121. Latitude: 5 deg 38 min 52.270 sec N; Longitude: 0 deg 11 min 46.080 sec W (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6251,Liberia 1964,,,,7012,1995-06-02 00:00:00,,EPSG,,
+6252,Lome,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6253,Luzon 1911,,,Fundamental Point: Balacan. Latitude: 13 deg 33 min 41.000 sec N; Longitude: 121 deg 52 min  03.000 sec E (of Greenwich).,7008,1995-06-02 00:00:00,,EPSG,,
+6254,Hito XVIII 1963,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6255,Herat North,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6256,Mahe 1971,,,Fundamental Point: Mahe,7012,1995-06-02 00:00:00,,EPSG,,
+6257,Makassar,,,Fundamental Point: Moncongloe,7004,1995-06-02 00:00:00,,EPSG,,
+6258,European Terrestrial Reference Frame 89,ETRF89,,,7019,1999-04-22 00:00:00,,EPSG,Coincides with WGS84 at the one metre level.,97.11  97.55  99.111
+6259,Malongo 1987,,,Fundamental Point: Station Y at Malongo base camp. Latitude: 5 deg 23 min 34.327 sec S; Longitude: 12 deg 12 min  02.393 sec E (of Greenwich).,7022,1995-06-02 00:00:00,Chevron Petroleum Technology.,EPSG,Offshore extension of Mhast datum (6264) using Transit translocation.,
+6260,Manoca,,,,7012,1995-06-02 00:00:00,,EPSG,,
+6261,Merchich,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6262,Massawa,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6263,Minna,,,Fundamental Point: Minna base station L40. Latitude: 9 deg 38 min  09.000 sec N; Longitude: 6 deg 30 min 59.000 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6264,Mhast,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6265,Monte Mario,,,Fundamental Point: Monte Mario. Latitude: 41 deg 55 min 25.510 sec N; Longitude: 0 deg  00 min  00.000 sec E (of Rome).,7022,1995-06-02 00:00:00,,EPSG,,
+6266,M'poraloko,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6267,North American Datum 1927,NAD27,,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7008,1995-06-02 00:00:00,,EPSG,,
+6268,NAD Michigan,,,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7009,1995-06-02 00:00:00,,EPSG,,
+6269,North American Datum 1983,NAD83,,Origin at geocentre.,7019,1995-06-02 00:00:00,,EPSG,,
+6270,Nahrwan 1967,,,Fundamental point: Nahrwan south base.  Latitude: 33 deg 19 min 10.87 sec N; Longitude: 44 deg 43 min 25.54 sec E (of Greenwich).,7012,1995-06-02 00:00:00,,EPSG,,
+6271,Naparima 1972,,,Fundamental Point: Naparima. Latitude: 10 deg 16 min 44.860 sec N; Longitude: 61 deg 27 min 34.620 sec W (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6272,New Zealand Geodetic Datum 1949,GD49,,Fundamental Point: Papatahi. Latitude: 41 deg 19 min  8.900 sec S; Longitude: 175 deg  02 min 51.000 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6273,NGO 1948,,,,7005,1995-06-02 00:00:00,,EPSG,,
+6274,Datum 73,,,Fundamental Point:  Latitude: 39 deg 41 min 37.30 sec N; Longitude: 8 deg 07 min 53.31 sec W (of Greenwich).,7022,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+6275,Nouvelle Triangulation Francaise,NTF,,Fundamental Point: Pantheon,7011,1995-06-02 00:00:00,,EPSG,,
+6276,NSWC 9Z-2,,,,7025,1995-06-02 00:00:00,,EPSG,Transit precise ephemeris before 1991.,
+6277,OSGB 1936,,,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,7001,1995-06-02 00:00:00,,EPSG,,
+6278,OSGB 1970 (SN),OSGB70,,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,7001,1995-06-02 00:00:00,,EPSG,,
+6279,OS (SN) 1980,OS(SN)80,,Fundamental Point: Herstmonceux. Latitude: 50 deg 51 min 55.271 sec N; Longitude: 0 deg 20 min 45.882 sec E (of Greenwich).,7001,1995-06-02 00:00:00,,EPSG,,
+6280,Padang 1884,Padang,,Fundamental Point: Padang,7004,1995-06-02 00:00:00,,EPSG,,
+6281,Palestine 1923,,,Fundamental Point: Point 82'M  Jerusalem. Latitude: 31 deg 44 min  2.749 sec N; Longitude: 35 deg 12 min 43.490 sec E (of Greenwich).,7010,1995-06-02 00:00:00,,EPSG,,
+6282,Pointe Noire,,,Fundamental Point: Point Noire Astro. Latitude: 4 deg 47 min  0.100 sec S; Longitude: 11 deg 51 min  1.550 sec E (of Greenwich).,7011,1995-06-02 00:00:00,,EPSG,,
+6283,Geocentric Datum of Australia 1994,GDA94,,,7019,1995-06-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Coincident with WGS84 to within 1 metre.,
+6284,Pulkovo 1942,,,Fundamental Point: Pulkovo observatory. Latitude: 59 deg 46 min 18.550 sec N; Longitude: 30 deg 19 min 42.090 sec E (of Greenwich).,7024,1995-06-02 00:00:00,,EPSG,,
+6285,Qatar,,,Fundamental Point: Station G3,7022,1995-06-02 00:00:00,,EPSG,,
+6286,Qatar 1948,,,Fundamental Point: Sokey 0 M. Latitude: 25 deg 22 min 56.500 sec N; Longitude: 50 deg 45 min 41.000 sec E (of Greenwich).,7020,1995-06-02 00:00:00,,EPSG,,
+6287,Qornoq,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6288,Loma Quintana,,,Fundamental Point: Loma Quintana,7022,1995-06-02 00:00:00,,EPSG,,
+6289,Amersfoort,,,Fundamental Point: Amersfoort. Latitude: 52 deg  09 min 22.178 sec N; Longitude: 5 deg 23 min 15.478 sec E (of Greenwich).,7004,1995-06-02 00:00:00,,EPSG,,
+6291,South American Datum 1969,SAD69,,,7036,1996-10-18 00:00:00,,EPSG,SAD69 uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision is 0 to 31mm.,96.09  97.252
+6292,Sapper Hill 1943,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6293,Schwarzeck,,,,7006,1995-06-02 00:00:00,,EPSG,,
+6294,Segora,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6295,Serindung,,,,7004,1995-06-02 00:00:00,,EPSG,,
+6296,Sudan,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6297,Tananarive 1925,Tananarive,,Fundamental Point: Tananarive observatory. Latitude: 18 deg 55 min  2.100 sec S; Longitude: 45 deg 12 min 52.800 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6298,Timbalai 1948,,,Fundamental Point: Timbalai. Latitude: 5 deg 17 min  3.548 sec N; Longitude: 115 deg 10 min 56.409 sec E (of Greenwich).,7016,1995-06-02 00:00:00,,EPSG,,
+6299,TM65,,,,7002,1995-06-02 00:00:00,,EPSG,,
+6300,TM75,,,,7002,1995-06-02 00:00:00,,EPSG,,
+6301,Tokyo,,,Fundamental Point: Nikon-Keido-Genten. Latitude: 35 deg 39 min 17.5148 sec N; Longitude: 139 deg 44 min 40.5020 sec E (of Greenwich).,7004,1995-06-02 00:00:00,Geographic Survey Institute; Japan; Bulletin 40 (March 1994).  Also http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html,EPSG,,98.46
+6302,Trinidad 1903,,,,7007,1995-06-02 00:00:00,,EPSG,,
+6303,Trucial Coast 1948,TC(1948),,Fundamental Point: TC1. Latitude: 25 deg 23 min 50.190 sec N; Longitude: 55 deg 26 min 43.950 sec E (of Greenwich).,7020,1995-06-02 00:00:00,,EPSG,,
+6304,Voirol 1875,,,Fundamental Point: Voirol. Latitude: 40.835864 grads N; Longitude: 0.788735 grads E of Paris.,7011,1995-06-02 00:00:00,IGN Paris,EPSG,,
+6305,Voirol Unifie 1960,Voirol Unifie,,,7012,1999-10-20 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,Conformal transformation from ED50. Used only with Lambert Algeria zones: in other cases use Nord Sahara 1959 geodetic datum.,99.62
+6306,Bern 1938,,,Fundamental Point: Old Bern observatory. Latitude: 46 deg 57 min  7.890 sec N; Longitude: 7 deg 26 min 22.335 sec E (of Greenwich).,7004,1995-06-02 00:00:00,"\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967",EPSG,This redetermination of the coordinates of fundamental point is used for scientific purposes and as the graticule overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,
+6307,Nord Sahara 1959,,,,7012,1999-10-20 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,Conformal transformation from ED50.,99.62
+6308,Stockholm 1938,RT38,,Fundamental Point: Stockholm observatory,7004,1996-04-12 00:00:00,,EPSG,Superseded by RT90 adjustment (datum code 6124),
+6309,Yacare,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6310,Yoff,,,,7011,1995-06-02 00:00:00,,EPSG,,
+6311,Zanderij,,,,7022,1995-06-02 00:00:00,,EPSG,,
+6312,Militar-Geographische Institut,MGI,,Fundamental Point: Hermannskogel. Latitude: 48 deg 16 min 15.29 sec N; Longitude: 16 deg 17 min 41.06 sec E (of Greenwich).,7004,1995-06-02 00:00:00,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,,
+6313,Reseau National Belge 1972,Belge 1972,,Fundamental Point: Uccle observatory. Latitude: 50 deg 47 min 57.704 sec N; Longitude: 4 deg 21 min 24.983 sec E (of Greenwich).,7022,1995-06-02 00:00:00,,EPSG,,
+6314,Deutsche Hauptdreiecksnetz,DHDN,,Fundamental Point: Potsdam. Latitude: 52 deg 22 min 53.954 sec N; Longitude: 13 deg 04 min 01.153 sec E (of Greenwich).,7004,1995-06-02 00:00:00,,EPSG,,
+6315,Conakry 1905,,,Fundamental Point: Conakry. Latitude: 10.573766g N; Longitude: 17.833682g W (of Paris).,7011,1995-06-02 00:00:00,,EPSG,,
+6316,Dealul Piscului 1933,,,Fundamental point: latitude 44 deg 24 min 33.9606 sec N; longitude 26 deg 06 min 44.8772 sec E (of Greenwich).,7022,1996-04-12 00:00:00,Institute for Geodesy Photogrametry and Land Management,EPSG,Superseded by 1970 adjustment (datum code 6317),
+6317,Dealul Piscului 1970,,,Fundamental point: latitude 44 deg 24 min 23.7709 sec N; longitude 26deg 06 min 44.1265 sec E (of Greenwich).,7024,1996-04-12 00:00:00,Institute for Geodesy Photogrametry and Land Management,EPSG,Supersedes 1933 adjustment (datum code 6316),
+6318,National Geodetic Network,NGN,,,7030,1996-04-12 00:00:00,,EPSG,,
+6319,Kuwait Utility,KUDAMS,,,7019,1996-04-12 00:00:00,,EPSG,,
+6322,World Geodetic System 1972,WGS 72,,,7043,1999-04-22 00:00:00,,EPSG,"Used by GPS before 1987. For Transit satellite positioning see also WGS 72BE.                                                                                                                  \
+Datum code 6323 reserved for southern hemisphere ProjCS's.",99.03
+6324,WGS 72 Transit Broadcast Ephemeris,WGS 72BE,,,7043,1999-04-22 00:00:00,,EPSG,Alleged datum for use with Transit broadcast ephemeris prior to 1989. Relationship to WGS 72 has changed over time.  Datum code 6325 reserved for southern hemisphere ProjCS's.,99.03
+6326,World Geodetic System 1984,WGS 84,,Origin at geocentre.,7030,1995-06-02 00:00:00,,EPSG,Datum code 6327 reserved for southern hemisphere ProjCS's,
+6600,Anguilla 1957,,,Fundamental point: station A4.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6601,Antigua 1943,,,Fundamental point: station A14.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6602,Dominica 1945,,,Fundamental point: station M12.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6603,Grenada 1953,,,Fundamental point: station GS8.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6604,Montserrat 1958,,,Fundamental point: station M36.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6605,St. Kitts 1955,,,Fundamental point: station K12.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6606,St. Lucia 1955,,,Fundamental point: station DCS3.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6607,St. Vincent 1945,,,Fundamental point: station V1.,7012,1999-04-22 00:00:00,Ordnance Survey of Great Britain.,EPSG,,
+6608,North American Datum 1927 (1976),NAD27(76),,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7008,1999-05-12 00:00:00,Geodetic Survey of Canada.,EPSG,NAD27(76) used in Ontario for all maps at scale 1/20 000 and larger; elsewhere in Canada for selected purposes.,
+6609,North American Datum 1927 (CGQ77),CGQ77,,Fundamental Point: Meade's Ranch. Latitude: 39 deg 13 min 26.686 sec N; Longitude: 98 deg 32 min 30.506 sec W (of Greenwich).,7008,1999-05-12 00:00:00,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,NAD27 (CGQ77) used in Quebec for all maps at scale 1/20 000 and larger; generally for maps issued by the Quebec cartography office whose reference system is CGQ77.,
+6901,Ancienne Triangulation Francaise,ATF,,,7027,1995-06-02 00:00:00,,EPSG,,
+6902,Nord de Guerre,NDG,,,7027,1995-06-02 00:00:00,,EPSG,,
+6903,Madrid 1870,,,Fundamental point: Madrid observatory.,7028,1998-11-11 00:00:00,Institut de Geomatica; Barcelona,EPSG,,
diff --git a/src/tiff/csv/geod_trf.c b/src/tiff/csv/geod_trf.c
new file mode 100644
index 0000000..9e6808c
--- /dev/null
+++ b/src/tiff/csv/geod_trf.c
@@ -0,0 +1,492 @@
+#include "defs.h"
+datafile_rows_t geod_trf_row_1[] = {"GEOD_TRF_CODE","GEOD_TRF_EPSG_NAME","GEOD_TRF_USER_NAME","DESCRIPTION","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","COORD_TRF_VARIANT","CONCAT_TRF_AREA_OF_USE","COORD_TRF_PATH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","CONCAT_TRF_REMARKS","CHANGE_ID",NULL};
+datafile_rows_t geod_trf_row_2[] = {"8000","Adindan to WGS 84 (1)","","DMA-Eth Sud","4201","4326","1","","8400","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_3[] = {"8001","Adindan to WGS 84 (2)","","DMA-Bfa","4201","4326","2","","8401","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_4[] = {"8002","Adindan to WGS 84 (3)","","DMA-Cmr","4201","4326","3","","8402","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_5[] = {"8003","Adindan to WGS 84 (4)","","DMA-Eth","4201","4326","4","","8403","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_6[] = {"8004","Adindan to WGS 84 (5)","","DMA-Mli","4201","4326","5","","8404","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_7[] = {"8005","Adindan to WGS 84 (6)","","DMA-Sen","4201","4326","6","","8405","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_8[] = {"8006","Adindan to WGS 84 (7)","","DMA-Sud","4201","4326","7","","8406","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_9[] = {"8007","Afgooye to WGS 84 (1)","","DMA-Som","4205","4326","1","","8407","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_10[] = {"8008","AGD66 to WGS 84 (1)","","DMA-Aus","4202","4326","1","","8408","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_11[] = {"8009","AGD84 to WGS 84 (1)","","DMA-Aus","4203","4326","1","","8409","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_12[] = {"8010","Ain el Abd to WGS 84 (1)","","DMA-Bhr","4204","4326","1","","8410","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_13[] = {"8011","Ain el Abd to WGS 84 (2)","","DMA-Sau","4204","4326","2","","8411","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_14[] = {"8012","Amersfoort to WGS 84 (1)","","NCG-Nld","4289","4326","1","","8412","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_15[] = {"8013","Arc 1950 to WGS 84 (1)","","DMA-mean","4209","4326","1","","8413","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_16[] = {"8014","Arc 1950 to WGS 84 (2)","","DMA-Bwa","4209","4326","2","","8414","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_17[] = {"8015","Arc 1950 to WGS 84 (3)","","DMA-Bdi","4209","4326","3","","8415","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_18[] = {"8016","Arc 1950 to WGS 84 (4)","","DMA-Lso","4209","4326","4","","8416","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_19[] = {"8017","Arc 1950 to WGS 84 (5)","","DMA-Mwi","4209","4326","5","","8417","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_20[] = {"8018","Arc 1950 to WGS 84 (6)","","DMA-Swz","4209","4326","6","","8418","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_21[] = {"8019","Arc 1950 to WGS 84 (7)","","DMA-Cod","4209","4326","7","","8419","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_22[] = {"8020","Arc 1950 to WGS 84 (8)","","DMA-Zmb","4209","4326","8","","8420","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_23[] = {"8021","Arc 1950 to WGS 84 (9)","","DMA-Zwe","4209","4326","9","","8421","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_24[] = {"8022","Arc 1960 to WGS 84 (1)","","DMA-Ken Tza","4210","4326","1","","8422","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_25[] = {"8023","Batavia to WGS 84 (1)","","DMA-Idn Sumatra","4211","4326","1","","8423","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_26[] = {"8024","Bermuda 1957 to WGS 84 (1)","","DMA-Bmu","4216","4326","1","","8424","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_27[] = {"8025","Bogota to WGS 84 (1)","","DMA-Col","4218","4326","1","","8425","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_28[] = {"8026","Bukit Rimpah to WGS 84 (1)","","DMA-Idn Beli","4219","4326","1","","8426","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_29[] = {"8027","Campo Inchauspe to WGS 84 (1)","","DMA-Arg","4221","4326","1","","8427","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_30[] = {"8028","Cape to WGS 84 (1)","","DMA-Zaf","4222","4326","1","","8428","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_31[] = {"8029","Cape to WGS 84 (2)","","DSLI-Zaf","4222","4326","2","","8429","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_32[] = {"8030","Carthage to WGS 84 (1)","","DMA-Tun","4223","4326","1","","8430","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_33[] = {"8031","Chua to WGS 84 (1)","","DMA-Pry","4224","4326","1","","8431","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_34[] = {"8032","Corrego Alegre to WGS 84 (1)","","DMA-Bra","4225","4326","1","","8432","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_35[] = {"8033","ED50 to WGS 84 (1)","","DMA-mean","4230","4326","1","","8433","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_36[] = {"8034","ED50 to WGS 84 (2)","","DMA-cenEur","4230","4326","2","","8434","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_37[] = {"8035","ED50 to WGS 84 (3)","","DMA-midEast","4230","4326","3","","8435","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_38[] = {"8036","ED50 to WGS 84 (4)","","DMA-Cyp","4230","4326","4","","8436","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_39[] = {"8037","ED50 to WGS 84 (5)","","DMA-Egy","4230","4326","5","","8437","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_40[] = {"8038","ED50 to WGS 84 (6)","","DMA-Irl Gbr","4230","4326","6","","8438","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_41[] = {"8039","ED50 to WGS 84 (7)","","DMA-Fin Nor","4230","4326","7","","8439","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_42[] = {"8040","ED50 to WGS 84 (8)","","DMA-Grc","4230","4326","8","","8440","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_43[] = {"8041","ED50 to WGS 84 (9)","","DMA-Irn","4230","4326","9","","8441","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_44[] = {"8042","ED50 to WGS 84 (10)","","DMA-Ita Sard","4230","4326","10","","8442","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_45[] = {"8043","ED50 to WGS 84 (11)","","DMA-Ita Sic","4230","4326","11","","8443","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_46[] = {"8044","ED50 to WGS 84 (12)","","DMA-Mlt","4230","4326","12","","8444","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_47[] = {"8045","ED50 to WGS 84 (13)","","DMA-Prt Esp","4230","4326","13","","8445","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_48[] = {"8046","ED50 to WGS 84 (14)","","6Nat-NSea","4230","4326","14","Denmark - North Sea;  Germany - North Sea;  Netherlands - offshore;  Norway - North Sea south of 62 deg N; United Kingdom (UKCS) - North Sea south of 62 deg N.","8446","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_49[] = {"8047","ED50 to WGS 84 (15)","","NMA-Nor N65","4230","4326","15","Norway - offshore north of 65 deg N.","8447","1996-10-18 00:00:00","","EPSG","The concatenation of transformations 1147 and 1146 gives the following position vector tfm: dX=-84.491  dY=-100.559  dZ=-114.209 metres rX= -2.4006  rY=-0.5367  rZ=-2.3742 microradians  dS=+0.2947 ppm.","",NULL};
+datafile_rows_t geod_trf_row_50[] = {"8048","Egypt 1907 to WGS 84 (1)","","DMA-Egy","4229","4326","1","","8448","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_51[] = {"8049","ETRF89 to WGS 84 (1)","","EPSG-eur","4258","4326","1","","8449","1997-06-19 00:00:00","","EPSG","","97.24",NULL};
+datafile_rows_t geod_trf_row_52[] = {"8050","GDA94 to WGS 84 (1)","","EPSG-Aus","4283","4326","1","","8450","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_53[] = {"8051","GD49 to WGS 84 (1)","","DMA-Nzl","4272","4326","1","","8451","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_54[] = {"8052","Hu Tzu Shan to WGS 84 (1)","","DMA-Twn","4236","4326","1","","8452","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_55[] = {"8053","Indian 1954 to WGS 84 (1)","","DMA-Tha","4239","4326","1","","8453","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_56[] = {"8054","Indian 1975 to WGS 84 (1)","","DMA-Tha","4240","4326","1","","8454","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_57[] = {"8055","Kalianpur 1937 to WGS 84 (1)","","DMA-Bgd","4144","4326","1","","8455","1999-10-20 00:00:00","","EPSG","","97.235",NULL};
+datafile_rows_t geod_trf_row_58[] = {"8056","Kalianpur 1975 to WGS 84 (1)","","DMA-Ind Npl","4146","4326","1","","8456","1999-10-20 00:00:00","","EPSG","","97.235",NULL};
+datafile_rows_t geod_trf_row_59[] = {"8057","Kandawala to WGS 84 (1)","","DMA-Lka","4244","4326","1","","8457","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_60[] = {"8058","Kertau to WGS 84 (1)","","DMA-Mys Sgp","4245","4326","1","","8458","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_61[] = {"8059","Leigon to WGS 84 (1)","","DMA-Gha","4250","4326","1","","8459","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_62[] = {"8060","Liberia 1964 to WGS 84 (1)","","DMA-Lbr","4251","4326","1","","8460","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_63[] = {"8061","Luzon 1911 to WGS 84 (1)","","DMA-Phl N","4253","4326","1","","8461","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_64[] = {"8062","Luzon 1911 to WGS 84 (2)","","DMA-Phl Min","4253","4326","2","","8462","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_65[] = {"8063","M'poraloko to WGS 84 (1)","","DMA-Gab","4266","4326","1","","8463","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_66[] = {"8064","Mahe 1971 to WGS 84 (1)","","DMA-Syc","4256","4326","1","","8464","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_67[] = {"8065","Massawa to WGS 84 (1)","","DMA-Eth","4262","4326","1","","8465","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_68[] = {"8066","Merchich to WGS 84 (1)","","DMA-Mar","4261","4326","1","","8466","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_69[] = {"8067","Minna to WGS 84 (1)","","DMA-Cmr","4263","4326","1","","8467","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_70[] = {"8068","Minna to WGS 84 (2)","","DMA-Nga","4263","4326","2","","8468","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_71[] = {"8069","Monte Mario to WGS 84 (1)","","DMA-Ita Sar","4265","4326","1","","8469","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_72[] = {"8070","NAD27 to WGS 84 (1)","","DMA-Carib","4267","4326","1","","8470","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_73[] = {"8071","NAD27 to WGS 84 (2)","","DMA-Cen Am","4267","4326","2","","8471","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_74[] = {"8072","NAD27 to WGS 84 (3)","","DMA-Can","4267","4326","3","","8472","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_75[] = {"8073","NAD27 to WGS 84 (4)","","DMA-Conus","4267","4326","4","","8473","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_76[] = {"8074","NAD27 to WGS 84 (5)","","DMA-ConusE","4267","4326","5","","8474","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_77[] = {"8075","NAD27 to WGS 84 (6)","","DMA-ConusW","4267","4326","6","","8475","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_78[] = {"8076","NAD27 to WGS 84 (7)","","DMA-USA AK","4267","4326","7","","8476","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_79[] = {"8077","NAD27 to WGS 84 (8)","","DMA-Bha xSalv","4267","4326","8","","8477","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_80[] = {"8078","NAD27 to WGS 84 (9)","","DMA-Bha Salv","4267","4326","9","","8478","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_81[] = {"8079","NAD27 to WGS 84 (10)","","DMA-Can AB BC","4267","4326","10","","8479","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_82[] = {"8080","NAD27 to WGS 84 (11)","","DMA-Can MN ON","4267","4326","11","","8480","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_83[] = {"8081","NAD27 to WGS 84 (12)","","DMA-Can E","4267","4326","12","","8481","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_84[] = {"8082","NAD27 to WGS 84 (13)","","DMA-Can NWT","4267","4326","13","","8482","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_85[] = {"8083","NAD27 to WGS 84 (14)","","DMA-Can Yuk","4267","4326","14","","8483","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_86[] = {"8084","NAD27 to WGS 84 (15)","","DMA-Pan","4267","4326","15","","8484","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_87[] = {"8085","NAD27 to WGS 84 (16)","","DMA-Cuba","4267","4326","16","","8485","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_88[] = {"8086","NAD27 to WGS 84 (17)","","DMA-Grl","4267","4326","17","","8486","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_89[] = {"8087","NAD27 to WGS 84 (18)","","DMA-Mex","4267","4326","18","","8487","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_90[] = {"8088","NAD83 to WGS 84 (1)","","DMA-N Am","4269","4326","1","","8488","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_91[] = {"8089","Nahrwan 1967 to WGS 84 (1)","","DMA-Omn Mas","4270","4326","1","","8489","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_92[] = {"8090","Nahrwan 1967 to WGS 84 (2)","","DMA-Sau","4270","4326","2","","8490","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_93[] = {"8091","Nahrwan 1967 to WGS 84 (3)","","DMA-UAE","4270","4326","3","","8491","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_94[] = {"8092","Naparima 1972 to WGS 84 (1)","","DMA-Tto","4271","4326","1","","8492","1998-06-30 00:00:00","","EPSG","","98.102",NULL};
+datafile_rows_t geod_trf_row_95[] = {"8093","NTF to WGS 84 (1)","","IGN-Fra","4275","4326","1","","8493","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_96[] = {"8094","NTF (Paris) to WGS 84 (1)","","EPSG-Fra","4807","4326","1","France..","8494","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_97[] = {"8095","OSGB 1936 to WGS 84 (1)","","DMA-Gbr","4277","4326","1","","8495","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_98[] = {"8096","OSGB 1936 to WGS 84 (2)","","DMA-Gbr Eng","4277","4326","2","","8496","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_99[] = {"8097","OSGB 1936 to WGS 84 (3)","","DMA-Gbr E&W","4277","4326","3","","8497","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_100[] = {"8098","OSGB 1936 to WGS 84 (4)","","DMA-Gbr Sco","4277","4326","4","","8498","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_101[] = {"8099","OSGB 1936 to WGS 84 (5)","","DMA-Gbr Wal","4277","4326","5","","8499","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_102[] = {"8100","Pointe Noire to WGS 84 (1)","","DMA-Cog","4282","4326","1","","8500","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_103[] = {"8101","PSAD56 to WGS 84 (1)","","DMA-mean","4248","4326","1","","8501","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_104[] = {"8102","PSAD56 to WGS 84 (2)","","DMA-Bol","4248","4326","2","","8502","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_105[] = {"8103","PSAD56 to WGS 84 (3)","","DMA-Chl N","4248","4326","3","","8503","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_106[] = {"8104","PSAD56 to WGS 84 (4)","","DMA Chl S","4248","4326","4","","8504","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_107[] = {"8105","PSAD56 to WGS 84 (5)","","DMA-Col","4248","4326","5","","8505","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_108[] = {"8106","PSAD56 to WGS 84 (6)","","DMA-Ecu","4248","4326","6","","8506","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_109[] = {"8107","PSAD56 to WGS 84 (7)","","DMA-Guy","4248","4326","7","","8507","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_110[] = {"8108","PSAD56 to WGS 84 (8)","","DMA-Per","4248","4326","8","","8508","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_111[] = {"8109","PSAD56 to WGS 84 (9)","","DMA-Ven","4248","4326","9","","8509","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_112[] = {"8110","Qatar to WGS 84 (1)","","DMA-Qat","4285","4326","1","","8510","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_113[] = {"8111","Qornoq to WGS 84 (1)","","DMA-Grl S","4287","4326","1","","8511","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_114[] = {"8112","SAD69 to WGS 84 (1)","","DMA-mean","4291","4326","1","","8512","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_115[] = {"8113","SAD69 to WGS 84 (2)","","DMA-Arg","4291","4326","2","","8513","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_116[] = {"8114","SAD69 to WGS 84 (3)","","DMA-Bol","4291","4326","3","","8514","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_117[] = {"8115","SAD69 to WGS 84 (4)","","DMA-Bra","4291","4326","4","","8515","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_118[] = {"8116","SAD69 to WGS 84 (5)","","DMA-Chile","4291","4326","5","","8516","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_119[] = {"8117","SAD69 to WGS 84 (6)","","DMA-Col","4291","4326","6","","8517","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_120[] = {"8118","SAD69 to WGS 84 (7)","","DMA-Ecu","4291","4326","7","","8518","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_121[] = {"8119","SAD69 to WGS 84 (8)","","DMA-Ecu Gal","4291","4326","8","","8519","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_122[] = {"8120","SAD69 to WGS 84 (9)","","DMA-Guyana","4291","4326","9","","8520","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_123[] = {"8121","SAD69 to WGS 84 (10)","","DMA-Pgy","4291","4326","10","","8521","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_124[] = {"8122","SAD69 to WGS 84 (11)","","DMA-Peru","4291","4326","11","","8522","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_125[] = {"8123","SAD69 to WGS 84 (12)","","DMA-Tto","4291","4326","12","","8523","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_126[] = {"8124","SAD69 to WGS 84 (13)","","DMA-Ven","4291","4326","13","","8524","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_127[] = {"8125","Sapper Hill 1943 to WGS 84 (1)","","DMA-Flk E","4292","4326","1","","8525","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_128[] = {"8126","Schwarzeck to WGS 84 (1)","","DMA-Nam","4293","4326","1","","8526","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_129[] = {"8127","Tananarive to WGS 84 (1)","","DMA-Mdg","4297","4326","1","","8527","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_130[] = {"8128","Timbalai 1948 to WGS 84 (1)","","DMA-Borneo","4298","4326","1","","8528","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_131[] = {"8129","TM65 to WGS 84 (1)","","DMA-Ire","4299","4326","1","","8529","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_132[] = {"8130","Tokyo to WGS 84 (1)","","DMA-Jpn Kor","4301","4326","1","","8530","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_133[] = {"8131","Tokyo to WGS 84 (2)","","DMA-Jpn","4301","4326","2","","8531","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_134[] = {"8132","Tokyo to WGS 84 (3)","","DMA-Kor","4301","4326","3","","8532","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_135[] = {"8133","Tokyo to WGS 84 (4)","","DMA-Jpn Ok","4301","4326","4","","8533","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_136[] = {"8134","Yacare to WGS 84 (1)","","DMA-Ury","4309","4326","1","","8534","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_137[] = {"8135","Zanderij to WGS 84 (1)","","DMA-Sur","4311","4326","1","","8535","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_138[] = {"8136","ED50 to ED87 (1)","","6Nat-NSea","4230","4231","1","","8536","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_139[] = {"8137","ED87 to WGS 84 (1)","","6Nat-NSea","4231","4326","1","","8537","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_140[] = {"8138","ED50 to ED87 (2)","","NMA-Nor N65","4230","4231","2","","8538","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_141[] = {"8139","AGD84 to WGS 84 (2)","","Auslig-Aus old","4203","4326","2","","8539","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_142[] = {"8140","WGS 72 to WGS 84 (1)","","DMA","4322","4326","1","","8540","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_143[] = {"8141","WGS 72 to WGS 84 (2)","","","4322","4326","2","","8541","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_144[] = {"8142","WGS 72BE to WGS 72 (1)","","","4324","4322","1","","8542","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_145[] = {"8143","WGS 72BE to WGS 84 (1)","","","4324","4326","1","","8543","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_146[] = {"8144","NAD27 to NAD83 (1)","","NGS-Conus","4267","4269","1","","8544","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_147[] = {"8146","NAD27 to NAD83 (2)","","NGS-Usa AK","4267","4269","2","","8546","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_148[] = {"8148","ED50 to WGS 84 (16)","","DMA-Tun","4230","4326","16","","8548","1997-06-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_149[] = {"8149","Herat North to WGS 84 (1)","","DMA-Afg","4255","4326","1","","8549","1997-06-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_150[] = {"8150","Kalianpur 1962 to WGS 84 (1)","","DMA-Pak","4145","4326","1","","8550","1999-10-20 00:00:00","","EPSG","","97.235",NULL};
+datafile_rows_t geod_trf_row_151[] = {"8151","ID74 to WGS 84 (1)","","DMA-Idn","4238","4326","1","","8551","1997-06-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_152[] = {"8152","NAD27 to WGS 84 (21)","","DMA-AK AluE","4267","4326","21","","8552","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_153[] = {"8153","NAD27 to WGS 84 (22)","","DMA-AK AluW","4267","4326","22","","8553","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_154[] = {"8154","NAD83 to WGS 84 (2)","","DMA-AK Alu","4269","4326","2","","8554","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_155[] = {"8155","NAD83 to WGS 84 (3)","","DMA-USA Hi","4269","4326","3","","8555","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_156[] = {"8156","Nord Sahara 1959 to WGS 84 (1)","","DMA-Alg","4307","4326","1","","8556","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_157[] = {"8157","Pulkovo 1942 to WGS 84 (1)","","DMA-Rus","4284","4326","1","","8557","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_158[] = {"8158","Voirol Unifie to WGS 84 (1)","","DMA-Alg N","4305","4326","1","","8558","1997-04-11 00:00:00","","EPSG","","98.15",NULL};
+datafile_rows_t geod_trf_row_159[] = {"8159","Fahud to WGS 84 (1)","","DMA-Omn","4232","4326","1","","8559","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_160[] = {"8160","NTF (Paris) to NTF (1)","","IGN-Fra","4807","4275","1","","8560","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_161[] = {"8161","Bern 1898 (Bern) to Bern 1898 (1)","","BfL-CH","4801","4217","1","","8561","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_162[] = {"8162","Bogota (Bogota) to Bogota (1)","","IGAC-Col","4802","4218","1","","8562","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_163[] = {"8163","Lisbon (Lisbon) to Lisbon (1)","","IGC-Prt","4803","4207","1","","8564","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_164[] = {"8164","Makassar (Jakarta) to Makassar (1)","","EPSG-Idn Sulawesi","4804","4257","1","","8565","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_165[] = {"8165","MGI (Ferro) to MGI (1)","","BEV-Aut balk","4805","4312","1","","8566","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_166[] = {"8166","Monte Mario (Rome) to Monte Mario (1)","","EPSG-Ita","4806","4265","1","","8567","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_167[] = {"8167","Padang (Jakarta) to Padang (1)","","EPSG-Idn Sumatra","4808","4280","1","","8569","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_168[] = {"8168","Belge 1950 (Brussels) to Belge 1950 (1)","","IGN-Bel","4809","4215","1","","8570","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_169[] = {"8169","Tananarive (Paris) to Tananarive (1)","","EPSG-Mdg","4810","4297","1","","8571","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_170[] = {"8170","Voirol 1875 (Paris) to Voirol 1875 (1)","","IGN-Dza","4811","4304","1","","8573","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_171[] = {"8171","Voirol Unifie (Paris) to Voirol Unifie(1","","IGN-Dza","4812","4305","1","","8574","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_172[] = {"8172","Batavia (Jakarta) to Batavia (1)","","EPSG-Idn Java","4813","4211","1","","8576","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_173[] = {"8173","RT38 (Stockholm) to RT38 (1)","","NLS-Swe","4814","4308","1","","8578","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_174[] = {"8174","Bogota (Bogota) to WGS 84 (1)","","EPSG-Col","4802","4326","1","Colombia.","8563","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_175[] = {"8175","Monte Mario (Rome) to WGS 84 (1)","","EPSG-Ita","4806","4326","1","Italy (Sardinia).","8568","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_176[] = {"8176","Tananarive (Paris) to WGS 84 (1)","","EPSG-Mdg","4810","4326","1","Madagascar.","8572","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_177[] = {"8177","Voirol Unifie (Paris) to WGS 84 (1)","","EPSG-Dza N","4812","4326","1","Algeria - north of 35g (31 deg 30 min) North","8575","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_178[] = {"8178","Batavia (Jakarta) to WGS 84 (1)","","EPSG-Idn Sumatra","4813","4326","1","Indonesia (Sumatra).","8577","1997-04-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_179[] = {"8179","Greek (Athens) to Greek (1)","","NTU-Grc","4815","4120","1","","8579","1998-12-14 00:00:00","","EPSG","","98.52",NULL};
+datafile_rows_t geod_trf_row_180[] = {"8180","Schwarzeck to WGS 84 (2)","","SLI-Nam","4293","4326","2","","8580","1998-11-19 00:00:00","","EPSG","","98.46",NULL};
+datafile_rows_t geod_trf_row_181[] = {"8181","GGRS87 to WGS 84 (1)","","Hel-Grc","4121","4326","1","","8581","1997-06-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_182[] = {"8182","HD72 to ETRF89 (1)","","ELTE-Hun","4237","4258","1","","8582","1997-11-13 00:00:00","","EPSG","","97.47",NULL};
+datafile_rows_t geod_trf_row_183[] = {"8183","HD72 to WGS 84 (1)","","EPSG-Hun","4237","4326","1","Hungary.","8583","1997-07-22 00:00:00","","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_184[] = {"8184","ED50 to WGS 84 (17)","","IGN-Fra","4230","4326","17","","8584","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_185[] = {"8185","NTF to ED50 (1)","","IGN-Fra","4275","4230","1","","8585","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_186[] = {"8186","NTF (Paris) to ED50 (1)","","EPSG-Fra","4807","4230","1","France","8586","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_187[] = {"8187","NTF to WGS 72 (1)","","IGN-Fra","4275","4322","1","","8587","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_188[] = {"8188","NTF (Paris) to WGS 72 (1)","","EPSG-Fra","4807","4322","1","France.","8588","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_189[] = {"8189","AGD66 to GDA94 (1)","","Auslig-Aus 5m","4202","4283","1","","8589","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_190[] = {"8190","AGD66 to WGS 84 (2)","","EPSG-Aus 5m","4202","4326","2","Australia..","8590","1998-12-16 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","98.50",NULL};
+datafile_rows_t geod_trf_row_191[] = {"8191","AGD84 to GDA94 (1)","","Auslig-Aus 5m","4203","4283","1","","8591","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_192[] = {"8192","AGD84 to WGS 84 (3)","","EPSG-Aus 5m","4203","4326","3","Australia","8592","1998-12-16 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","98.50",NULL};
+datafile_rows_t geod_trf_row_193[] = {"8193","AGD84 to GDA94 (2)","","Auslig-Aus 1m","4203","4283","2","","8593","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_194[] = {"8194","AGD84 to WGS 84 (4)","","EPSG-Aus 1m","4203","4326","4","Australia.","8594","1998-12-16 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","98.50",NULL};
+datafile_rows_t geod_trf_row_195[] = {"8195","RT90 to WGS 84 (1)","","EPSG-Swe","4124","4326","1","Sweden.","8595","1999-04-22 00:00:00","","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","99.11",NULL};
+datafile_rows_t geod_trf_row_196[] = {"8196","Samboja to WGS 84 (1)","","TOT-Idn Mah","4125","4326","1","","8596","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_197[] = {"8197","Pulkovo 1942 to LKS94 (1)","","HNIT-Ltu","4284","4126","1","","8597","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_198[] = {"8198","LKS94 to WGS 84 (1)","","HNIT-Ltu","4126","4326","1","","8598","1998-04-16 00:00:00","","EPSG","For many purposes LKS94 can be assumed to be coincident with WGS 84.","98.13",NULL};
+datafile_rows_t geod_trf_row_199[] = {"8199","Pulkovo 1942 to WGS 84 (2)","","EPSG-Ltu","4284","4326","2","Lithuania.","8609","1998-03-12 00:00:00","","EPSG","For many purposes LKS94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_200[] = {"8200","Pulkovo 1942 to WGS 84 (3)","","NIMA-Hun","4284","4326","3","","8602","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_201[] = {"8201","Pulkovo 1942 to WGS 84 (4)","","NIMA-Pol","4284","4326","4","","8603","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_202[] = {"8202","Pulkovo 1942 to WGS 84 (5)","","NIMA-Cze","4284","4326","5","","8604","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_203[] = {"8203","Pulkovo 1942 to WGS 84 (6)","","NIMA-Lva","4284","4326","6","","8605","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_204[] = {"8204","Pulkovo 1942 to WGS 84 (7)","","NIMA-Kaz","4284","4326","7","","8606","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_205[] = {"8205","Pulkovo 1942 to WGS 84 (8)","","NIMA-Alb","4284","4326","8","","8607","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_206[] = {"8206","Pulkovo 1942 to WGS 84 (9)","","NIMA-Rom","4284","4326","9","","8608","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_207[] = {"8207","Arc 1960 to WGS 84 (2)","","NIMA-Ken","4210","4326","2","","8599","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_208[] = {"8208","Arc 1960 to WGS 84 (3)","","NIMA-Tza","4210","4326","3","","8600","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_209[] = {"8209","Segora to WGS 84 (1)","","NIMA-Idn Kal","4294","4326","1","","8601","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_210[] = {"8210","Voirol 1875 to WGS 84 (1)","","NIMA-Dza N","4304","4326","1","","8610","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_211[] = {"8211","Voirol 1875 (Paris) to WGS 84 (1)","","EPSG-Dza N","4811","4326","1","Algeria - north of 35g (31 deg 30 min) North.","8611","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_212[] = {"8212","Naparima 1972 to WGS 84 (2)","","MEEI-Tto","4271","4326","2","","8612","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_213[] = {"8213","Trinidad 1903 to WGS 84 (1)","","MEEI-Trin","4302","4326","1","","8613","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_214[] = {"8214","Tete to Moznet (1)","","DNGC-Moz","4127","4130","1","","8614","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_215[] = {"8215","Tete to WGS 84 (1)","","EPSG-Moz","4127","4326","1","Mozambique - average for whole country.","8615","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_216[] = {"8216","Tete to Moznet (2)","","DNGC-Moz A","4127","4130","2","","8616","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_217[] = {"8217","Tete to WGS 84 (2)","","EPSG-Moz A","4127","4326","2","Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.","8617","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_218[] = {"8218","Tete to Moznet (3)","","DNGC-Moz B","4127","4130","3","","8618","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_219[] = {"8219","Tete to WGS 84 (3)","","EPSG-Moz B","4127","4326","3","Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.","8619","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_220[] = {"8220","Tete to Moznet (4)","","DNGC-Moz C","4127","4130","4","","8620","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_221[] = {"8221","Tete to WGS 84 (4)","","EPSG-Moz C","4127","4326","4","Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.","8621","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_222[] = {"8222","Tete to Moznet (5)","","DNGC-Moz D","4127","4130","5","","8622","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_223[] = {"8223","Tete to WGS 84 (5)","","EPSG-Moz D","4127","4326","5","Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.","8623","1998-04-16 00:00:00","","EPSG","For many purposes Moznet can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_224[] = {"8224","Moznet to WGS 84 (1)","","EPSG-Moz","4130","4326","1","","8624","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_225[] = {"8225","Pulkovo 1942 to WGS 84 (10)","","KCS-Kaz Cas","4284","4326","10","","8625","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_226[] = {"8226","Indian 1975 to WGS 84 (2)","","NIMA-Tha","4240","4326","2","","8626","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_227[] = {"8227","Tokyo to WGS 84 (5)","","NIMA-Kor","4301","4326","5","","8627","1998-11-19 00:00:00","","EPSG","","98.46",NULL};
+datafile_rows_t geod_trf_row_228[] = {"8228","MGI to WGS 84 (1)","","NIMA-balk","4312","4326","1","","8628","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_229[] = {"8229","Naparima 1972 to WGS 84 (3)","","NIMA-Tto","4271","4326","3","","8629","1998-04-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_230[] = {"8233","DHDN to ETRF89 (1)","","IfAG-Deu W","4314","4258","1","","8633","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_231[] = {"8234","DHDN to WGS 84 (1)","","EPSG-Deu W","4314","4326","1","Germany - former west Germany.","8634","1998-06-30 00:00:00","EPSG","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_232[] = {"8235","Pulkovo 1942 to ETRF89 (1)","","IfAG-Deu E","4284","4258","1","","8635","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_233[] = {"8236","Pulkovo 1942 to WGS 84 (11)","","EPSG-Deu E","4284","4326","11","Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.","8636","1998-06-30 00:00:00","","EPSG","For many purposes ETRF89 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_234[] = {"8237","ED50 to WGS 84 (Common Offshore)","","UKOOA-CO","4230","4326","18","","8637","1998-06-30 00:00:00","","EPSG","","98.27",NULL};
+datafile_rows_t geod_trf_row_235[] = {"8238","Madrid 1870 (Madrid) to ED50 (1)","","IGB-Esp","4903","4230","1","","8638","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_236[] = {"8239","Madrid 1870 (Madrid) to ED50 (2)","","IGB-Esp N","4903","4230","2","","8639","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_237[] = {"8240","Madrid 1870 (Madrid) to ED50 (3)","","IGB-Esp S","4903","4230","3","","8640","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_238[] = {"8241","Madrid 1870 (Madrid) to WGS 84 (1)","","EPSG-Esp","4903","4326","1","Spain.","8641","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_239[] = {"8242","NAD27 to NAD83 (3)","","GC-Can NT1","4267","4269","3","","8642","1998-11-11 00:00:00","","EPSG","","98.57",NULL};
+datafile_rows_t geod_trf_row_240[] = {"8243","NAD27 to WGS 84 (25)","","EPSG-Can old","4267","4326","25","Canada","8643","1998-11-11 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_241[] = {"8244","NAD27 to NAD83 (4)","","GC-Can","4267","4269","4","","8644","1998-11-11 00:00:00","","EPSG","","98.57",NULL};
+datafile_rows_t geod_trf_row_242[] = {"8245","NAD27 to WGS 84 (26)","","EPSG-Can","4267","4326","26","Canada.","8645","1998-11-11 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_243[] = {"8246","OSGB 1936 to WGS 84 (Petroleum)","","UKOOA-Pet","4277","4326","6","","8646","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_244[] = {"8247","OSGB 1936 to ED50 (UKOOA)","","UKOOA-UKCS","4277","4230","1","","8647","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_245[] = {"8248","Manoca to WGS 84 (1)","","SCS-Cmr","4260","4326","1","","8648","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_246[] = {"8249","Camacupa to WGS 72BE (1)","","GSI-Ago","4220","4324","1","","8649","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_247[] = {"8250","Camacupa to WGS 84 (1)","","CON-Ago B5","4220","4326","1","","8650","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_248[] = {"8251","Camacupa to WGS 84 (2)","","TEX-Ago B2","4220","4326","2","","8651","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_249[] = {"8252","Camacupa to WGS 84 (3)","","SHL-Ago old","4220","4326","3","","8652","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_250[] = {"8253","Camacupa to WGS 84 (4)","","GSI-Ago","4220","4326","4","","8653","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_251[] = {"8254","Camacupa to WGS 84 (5)","","ELF-Ago B3 old","4220","4326","5","","8654","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_252[] = {"8255","Camacupa to WGS 84 (6)","","ELF-Ago B7 old","4220","4326","6","","8655","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_253[] = {"8256","Camacupa to WGS 84 (7)","","ELF-Ago B15","4220","4326","7","","8656","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_254[] = {"8257","Camacupa to WGS 84 (8)","","ELF-Ago B2 old","4220","4326","8","","8657","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_255[] = {"8258","Camacupa to WGS 84 (9)","","SHL-Ago B16","4220","4326","9","","8658","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_256[] = {"8259","Camacupa to WGS 84 (10)","","ELF-Ago N","4220","4326","10","","8659","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_257[] = {"8260","Malongo 1987 to Mhast (1)","","CHV-Ago Cab","4259","4264","1","","8660","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_258[] = {"8261","Mhast to WGS 84 (1)","","CHV-Ago Cab","4264","4326","1","","8661","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_259[] = {"8262","Malongo 1987 to WGS 84 (1)","","CHV-Ago Cab","4259","4326","1","","8662","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_260[] = {"8263","MGI (Ferro) to WGS 84 (1)","","DMA-balk","4805","4326","1","MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.","8663","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_261[] = {"8264","EST92 to ETRF89 (1)","","UT-Est","4133","4258","1","","8664","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_262[] = {"8265","Pulkovo 1942 to EST92 (1)","","UT-Est","4284","4133","1","","8665","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_263[] = {"8266","EST92 to WGS 84 (1)","","UT-Est","4133","4326","1","","8666","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_264[] = {"8267","Pulkovo 1942 to WGS 84 (12)","","UT-Est","4284","4326","12","","8667","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_265[] = {"8268","Tokyo to WGS 84 (6)","","GSI-Jpn 452141","4301","4326","6","","8668","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_266[] = {"8269","Tokyo to WGS 84 (7)","","GSI-Jpn 452142","4301","4326","7","","8669","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_267[] = {"8270","Tokyo to WGS 84 (8)","","GSI-Jpn 444141","4301","4326","8","","8670","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_268[] = {"8271","Tokyo to WGS 84 (9)","","GSI-Jpn 444142","4301","4326","9","","8671","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_269[] = {"8272","Tokyo to WGS 84 (10)","","GSI-Jpn 440141","4301","4326","10","","8672","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_270[] = {"8273","Tokyo to WGS 84 (11)","","GSI-Jpn 440142","4301","4326","11","","8673","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_271[] = {"8274","Tokyo to WGS 84 (12)","","GSI-Jpn 440143","4301","4326","12","","8674","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_272[] = {"8275","Tokyo to WGS 84 (13)","","GSI-Jpn 440144","4301","4326","13","","8675","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_273[] = {"8276","Tokyo to WGS 84 (14)","","GSI-Jpn 432141","4301","4326","14","","8676","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_274[] = {"8277","Tokyo to WGS 84 (15)","","GSI-Jpn 432142","4301","4326","15","","8677","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_275[] = {"8278","Tokyo to WGS 84 (16)","","GSI-Jpn 432143","4301","4326","16","","8678","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_276[] = {"8279","Tokyo to WGS 84 (17)","","GSI-Jpn 432144","4301","4326","17","","8679","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_277[] = {"8280","Tokyo to WGS 84 (18)","","GSI-Jpn 432145","4301","4326","18","","8680","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_278[] = {"8281","Tokyo to WGS 84 (19)","","GSI-Jpn 424140","4301","4326","19","","8681","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_279[] = {"8282","Tokyo to WGS 84 (20)","","GSI-Jpn 424141","4301","4326","20","","8682","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_280[] = {"8283","Tokyo to WGS 84 (21)","","GSI-Jpn 424142","4301","4326","21","","8683","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_281[] = {"8284","Tokyo to WGS 84 (22)","","GSI-Jpn 424143","4301","4326","22","","8684","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_282[] = {"8285","Tokyo to WGS 84 (23)","","GSI-Jpn 424144","4301","4326","23","","8685","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_283[] = {"8286","Tokyo to WGS 84 (24)","","GSI-Jpn 424145","4301","4326","24","","8686","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_284[] = {"8287","Tokyo to WGS 84 (25)","","GSI-Jpn 420139","4301","4326","25","","8687","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_285[] = {"8288","Tokyo to WGS 84 (26)","","GSI-Jpn 420140","4301","4326","26","","8688","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_286[] = {"8289","Tokyo to WGS 84 (27)","","GSI-Jpn","4301","4326","27","","8689","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_287[] = {"8290","Tokyo to WGS 84 (28)","","GSI-Jpn","4301","4326","28","","8690","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_288[] = {"8291","Tokyo to WGS 84 (29)","","GSI-Jpn","4301","4326","29","","8691","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_289[] = {"8292","Tokyo to WGS 84 (30)","","GSI-Jpn","4301","4326","30","","8692","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_290[] = {"8293","Tokyo to WGS 84 (31)","","GSI-Jpn","4301","4326","31","","8693","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_291[] = {"8294","Tokyo to WGS 84 (32)","","GSI-Jpn","4301","4326","32","","8694","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_292[] = {"8295","Tokyo to WGS 84 (33)","","GSI-Jpn","4301","4326","33","","8695","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_293[] = {"8296","Tokyo to WGS 84 (34)","","GSI-Jpn","4301","4326","34","","8696","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_294[] = {"8297","Tokyo to WGS 84 (35)","","GSI-Jpn","4301","4326","35","","8697","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_295[] = {"8298","Tokyo to WGS 84 (36)","","GSI-Jpn","4301","4326","36","","8698","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_296[] = {"8299","Tokyo to WGS 84 (37)","","GSI-Jpn","4301","4326","37","","8699","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_297[] = {"8300","Tokyo to WGS 84 (38)","","GSI-Jpn","4301","4326","38","","8700","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_298[] = {"8301","Tokyo to WGS 84 (39)","","GSI-Jpn","4301","4326","39","","8701","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_299[] = {"8302","Tokyo to WGS 84 (40)","","GSI-Jpn","4301","4326","40","","8702","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_300[] = {"8303","Tokyo to WGS 84 (41)","","GSI-Jpn","4301","4326","41","","8703","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_301[] = {"8304","Tokyo to WGS 84 (42)","","GSI-Jpn","4301","4326","42","","8704","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_302[] = {"8305","Tokyo to WGS 84 (43)","","GSI-Jpn","4301","4326","43","","8705","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_303[] = {"8306","Tokyo to WGS 84 (44)","","GSI-Jpn","4301","4326","44","","8706","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_304[] = {"8307","Tokyo to WGS 84 (45)","","GSI-Jpn","4301","4326","45","","8707","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_305[] = {"8308","Tokyo to WGS 84 (46)","","GSI-Jpn","4301","4326","46","","8708","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_306[] = {"8309","Tokyo to WGS 84 (47)","","GSI-Jpn","4301","4326","47","","8709","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_307[] = {"8310","Tokyo to WGS 84 (48)","","GSI-Jpn","4301","4326","48","","8710","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_308[] = {"8311","Tokyo to WGS 84 (49)","","GSI-Jpn","4301","4326","49","","8711","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_309[] = {"8312","Tokyo to WGS 84 (50)","","GSI-Jpn","4301","4326","50","","8712","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_310[] = {"8313","Tokyo to WGS 84 (51)","","GSI-Jpn","4301","4326","51","","8713","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_311[] = {"8314","Tokyo to WGS 84 (52)","","GSI-Jpn","4301","4326","52","","8714","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_312[] = {"8315","Tokyo to WGS 84 (53)","","GSI-Jpn","4301","4326","53","","8715","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_313[] = {"8316","Tokyo to WGS 84 (54)","","GSI-Jpn","4301","4326","54","","8716","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_314[] = {"8317","Tokyo to WGS 84 (55)","","GSI-Jpn","4301","4326","55","","8717","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_315[] = {"8318","Tokyo to WGS 84 (56)","","GSI-Jpn","4301","4326","56","","8718","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_316[] = {"8319","Tokyo to WGS 84 (57)","","GSI-Jpn","4301","4326","57","","8719","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_317[] = {"8320","Tokyo to WGS 84 (58)","","GSI-Jpn","4301","4326","58","","8720","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_318[] = {"8321","Tokyo to WGS 84 (59)","","GSI-Jpn","4301","4326","59","","8721","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_319[] = {"8322","Tokyo to WGS 84 (60)","","GSI-Jpn","4301","4326","60","","8722","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_320[] = {"8323","Tokyo to WGS 84 (61)","","GSI-Jpn","4301","4326","61","","8723","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_321[] = {"8324","Tokyo to WGS 84 (62)","","GSI-Jpn","4301","4326","62","","8724","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_322[] = {"8325","Tokyo to WGS 84 (63)","","GSI-Jpn","4301","4326","63","","8725","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_323[] = {"8326","Tokyo to WGS 84 (64)","","GSI-Jpn","4301","4326","64","","8726","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_324[] = {"8327","Tokyo to WGS 84 (65)","","GSI-Jpn","4301","4326","65","","8727","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_325[] = {"8328","Tokyo to WGS 84 (66)","","GSI-Jpn","4301","4326","66","","8728","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_326[] = {"8329","Tokyo to WGS 84 (67)","","GSI-Jpn","4301","4326","67","","8729","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_327[] = {"8330","Tokyo to WGS 84 (68)","","GSI-Jpn","4301","4326","68","","8730","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_328[] = {"8331","Tokyo to WGS 84 (69)","","GSI-Jpn","4301","4326","69","","8731","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_329[] = {"8332","Tokyo to WGS 84 (70)","","GSI-Jpn","4301","4326","70","","8732","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_330[] = {"8333","Tokyo to WGS 84 (71)","","GSI-Jpn","4301","4326","71","","8733","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_331[] = {"8334","Tokyo to WGS 84 (72)","","GSI-Jpn","4301","4326","72","","8734","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_332[] = {"8335","Tokyo to WGS 84 (73)","","GSI-Jpn","4301","4326","73","","8735","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_333[] = {"8336","Tokyo to WGS 84 (74)","","GSI-Jpn","4301","4326","74","","8736","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_334[] = {"8337","Tokyo to WGS 84 (75)","","GSI-Jpn","4301","4326","75","","8737","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_335[] = {"8338","Tokyo to WGS 84 (76)","","GSI-Jpn","4301","4326","76","","8738","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_336[] = {"8339","Tokyo to WGS 84 (77)","","GSI-Jpn","4301","4326","77","","8739","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_337[] = {"8340","Tokyo to WGS 84 (78)","","GSI-Jpn","4301","4326","78","","8740","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_338[] = {"8341","Tokyo to WGS 84 (79)","","GSI-Jpn","4301","4326","79","","8741","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_339[] = {"8342","Tokyo to WGS 84 (80)","","GSI-Jpn","4301","4326","80","","8742","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_340[] = {"8343","Tokyo to WGS 84 (81)","","GSI-Jpn","4301","4326","81","","8743","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_341[] = {"8344","Tokyo to WGS 84 (82)","","GSI-Jpn","4301","4326","82","","8744","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_342[] = {"8345","Tokyo to WGS 84 (83)","","GSI-Jpn","4301","4326","83","","8745","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_343[] = {"8346","Tokyo to WGS 84 (84)","","GSI-Jpn","4301","4326","84","","8746","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_344[] = {"8347","Tokyo to WGS 84 (85)","","GSI-Jpn","4301","4326","85","","8747","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_345[] = {"8348","Tokyo to WGS 84 (86)","","GSI-Jpn","4301","4326","86","","8748","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_346[] = {"8349","Tokyo to WGS 84 (87)","","GSI-Jpn","4301","4326","87","","8749","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_347[] = {"8350","Tokyo to WGS 84 (88)","","GSI-Jpn","4301","4326","88","","8750","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_348[] = {"8351","Tokyo to WGS 84 (89)","","GSI-Jpn","4301","4326","89","","8751","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_349[] = {"8352","Tokyo to WGS 84 (90)","","GSI-Jpn","4301","4326","90","","8752","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_350[] = {"8353","Tokyo to WGS 84 (91)","","GSI-Jpn","4301","4326","91","","8753","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_351[] = {"8354","Tokyo to WGS 84 (92)","","GSI-Jpn","4301","4326","92","","8754","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_352[] = {"8355","Tokyo to WGS 84 (93)","","GSI-Jpn","4301","4326","93","","8755","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_353[] = {"8356","Tokyo to WGS 84 (94)","","GSI-Jpn","4301","4326","94","","8756","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_354[] = {"8357","Tokyo to WGS 84 (95)","","GSI-Jpn","4301","4326","95","","8757","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_355[] = {"8358","Tokyo to WGS 84 (96)","","GSI-Jpn","4301","4326","96","","8758","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_356[] = {"8359","Tokyo to WGS 84 (97)","","GSI-Jpn","4301","4326","97","","8759","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_357[] = {"8360","Tokyo to WGS 84 (98)","","GSI-Jpn","4301","4326","98","","8760","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_358[] = {"8361","Tokyo to WGS 84 (99)","","GSI-Jpn","4301","4326","99","","8761","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_359[] = {"8362","Tokyo to WGS 84 (100)","","GSI-Jpn 324132","4301","4326","100","","8762","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_360[] = {"8363","Tokyo to WGS 84 (101)","","GSI-Jpn 324133","4301","4326","101","","8763","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_361[] = {"8364","Tokyo to WGS 84 (102)","","GSI-Jpn 324134","4301","4326","102","","8764","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_362[] = {"8365","Tokyo to WGS 84 (103)","","GSI-Jpn 320130","4301","4326","103","","8765","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_363[] = {"8366","Tokyo to WGS 84 (104)","","GSI-Jpn 320131","4301","4326","104","","8766","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_364[] = {"8367","Tokyo to WGS 84 (105)","","GSI-Jpn 320132","4301","4326","105","","8767","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_365[] = {"8368","Tokyo to WGS 84 (106)","","GSI-Jpn 312130","4301","4326","106","","8768","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_366[] = {"8369","Tokyo to WGS 84 (107)","","GSI-Jpn 312131","4301","4326","107","","8769","1998-12-14 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_367[] = {"8370","Fahud to WGS 84 (2)","","PDO-Omn","4232","4326","2","","8770","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_368[] = {"8371","PSD93 to WGS 84 (1)","","PDO-Omn","4134","4326","1","","8771","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_369[] = {"8372","ED50 to WGS 84 (19)","","HEL-Grc","4230","4326","19","","8772","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_370[] = {"8373","Antigua 1943 to WGS 84 (1)","","DOS-Atg Ant","4601","4326","1","","8773","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_371[] = {"8374","Dominica 1945 to WGS 84 (1)","","DOS-Dma","4602","4326","1","","8774","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_372[] = {"8375","Grenada 1953 to WGS 84 (1)","","DOS-Grd","4603","4326","1","","8775","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_373[] = {"8376","Montserrat 1958 to WGS 84 (1)","","DOS-Msr","4604","4326","1","","8776","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_374[] = {"8377","St. Kitts 1955 to WGS 84 (1)","","DOS-Kna","4605","4326","1","","8777","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_375[] = {"8378","St. Lucia 1955 to WGS 84 (1)","","DOS-Lca","4606","4326","1","","8778","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_376[] = {"8379","Anguilla 1957 to WGS 84 (1)","","DOS-Aia","4600","4326","1","","8779","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_377[] = {"8380","RT90 to ETRF89 (1)","","NLS-Swe","4124","4258","1","","8780","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_378[] = {"8384","ED50 to WGS 84 (20)","","NMA-Nor 6265W","4230","4326","20","","8784","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_379[] = {"8385","Old Hawaiian to NAD83 (1)","","NGS-Usa Hi","4135","4269","1","","8785","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_380[] = {"8386","Old Hawaiian to WGS 84 (1)","","EPSG-US Hi","4135","4326","1","United States - Hawaii","8786","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_381[] = {"8387","St. Lawrence Island to NAD83 (1)","","NGS-Usa AK StL","4136","4269","1","","8787","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_382[] = {"8388","St. Lawrence Island to WGS 84 (1)","","EPSG-US StL","4136","4326","1","United States - Alaska - St. Lawrence Island.","8788","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_383[] = {"8389","St. Paul Island to NAD83 (1)","","NGS-Usa AK StP","4137","4269","1","","8789","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_384[] = {"8390","St. Paul Island to WGS 84 (1)","","EPSG-US StP","4137","4326","1","United States - Alaska - St. Paul Island.","8790","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_385[] = {"8391","St. George Island to NAD83 (1)","","NGS-Usa AK StG","4138","4269","1","","8791","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_386[] = {"8392","St. George Island to WGS 84 (1)","","EPSG-USA StG","4138","4326","1","United States - Alaska - St. George Island.","8792","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_387[] = {"8393","NAD27(CGQ77)  to NAD83 (1)","","SGQ-Can QC","4609","4269","1","","8793","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_388[] = {"8394","NAD27(CGQ77) to WGS 84 (1)","","EPSG-Can Qc","4609","4326","1","Canada - Quebec","8794","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_389[] = {"8395","AGD66 to GDA94 (2)","","Auslig-ACT 1m","4202","4283","2","","8795","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_390[] = {"8396","AGD66 to WGS 84 (3)","","EPSG-Aus ACT 1m","4202","4326","3","Australia - ACT.","8796","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_391[] = {"8397","AGD66 to GDA94 (3)","","Auslig-Tas 1m","4202","4283","3","","8797","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_392[] = {"8398","AGD66 to WGS 84 (4)","","EPSG-Aus Tas 1m","4202","4326","4","Australia - Tasmania.","8798","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_393[] = {"8399","AGD66 to GDA94 (4)","","Auslig-NSW Vic","4202","4283","4","","8799","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_394[] = {"8400","AGD66 to WGS 84 (5)","","EPSG-Aus NSW Vic 1m","4202","4326","5","Australia - New South Wales (NSW) and Victoria.","8800","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_395[] = {"8401","Puerto Rico to NAD83 (1)","","NGS-PRVI","4139","4269","1","","8801","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_396[] = {"8402","Puerto Rico to WGS 84 (1)","","EPSG-PRVI","4139","4326","1","Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).","8802","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_397[] = {"8403","NAD27 to NAD83 (5)","","SGQ-Can QC","4267","4269","5","","8803","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_398[] = {"8404","NAD27 to WGS 84 (27)","","EPSG-Can QC","4267","4326","27","Canada - Quebec","8804","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_399[] = {"8405","NAD27(76) to NAD83 (1)","","SGQ-Can Ont","4608","4269","1","","8805","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_400[] = {"8406","NAD27(76) to WGS 84 (1)","","EPSG-Can On","4608","4326","1","Canada - Ontario","8806","1999-05-24 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_401[] = {"8407","AGD66 to GDA94 (5)","","OSG-Aus Vic","4202","4283","5","","8807","1999-05-24 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_402[] = {"8408","AGD66 to WGS 84 (6)","","EPSG-Aus Vic 0.1m","4202","4326","6","Australia - Victoria","8808","1999-05-24 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_403[] = {"8411","NGO 1948 (Oslo) to NGO 1948 (1)","","NGO-Nor","4817","4273","1","","8811","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_404[] = {"8412","NTF (Paris) to NTF (2)","","RGS","4807","4275","2","","8812","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_405[] = {"8413","Locodjo 1965 to WGS 84 (1)","","IGN-Civ","4142","4326","1","","8813","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_406[] = {"8414","Abidjan 1987 to WGS 84 (1)","","IGN-Civ","4143","4326","1","","8814","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_407[] = {"8415","MGI to WGS 84 (2)","","BEV-Aut","4312","4326","1","","8815","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_408[] = {"8416","ATS 77 to NAD83(CSRS98) (1)","","GIC-Can NB","4122","4140","1","","8816","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_409[] = {"8417","NAD83(CSRS98) to WGS 84 (1)","","EPSG-Can","4140","4326","1","","8817","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_410[] = {"8418","ATS 77 to WGS 84 (1)","","EPSG-Can NB","4122","4326","1","Canada - New Brunswick","8818","1999-10-20 00:00:00","EPSG","EPSG","For many purposes NAD83(CSRS) can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_411[] = {"8419","NAD83 to NAD83(HARN) (1)","","NGS-Usa AL","4269","4152","1","","8819","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_412[] = {"8420","NAD83 to NAD83(HARN) (2)","","NGS-Usa AZ","4269","4152","2","","8820","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_413[] = {"8421","NAD83 to NAD83(HARN) (3)","","NGS-Usa CA n","4269","4152","3","","8821","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_414[] = {"8422","NAD83 to NAD83(HARN) (4)","","NGS-Usa CA s","4269","4152","4","","8822","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_415[] = {"8423","NAD83 to NAD83(HARN) (5)","","NGS-Usa CO","4269","4152","5","","8823","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_416[] = {"8424","NAD83 to NAD83(HARN) (6)","","NGS-Usa GA","4269","4152","6","","8824","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_417[] = {"8425","NAD83 to NAD83(HARN) (7)","","NGS-Usa FL","4269","4152","7","","8825","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_418[] = {"8426","NAD83 to NAD83(HARN) (8)","","NGS-Usa ID MT e","4269","4152","8","","8826","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_419[] = {"8427","NAD83 to NAD83(HARN) (9)","","NGS-Usa ID MT w","4269","4152","9","","8827","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_420[] = {"8428","NAD83 to NAD83(HARN) (10)","","NGS-Usa KY","4269","4152","10","","8828","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_421[] = {"8429","NAD83 to NAD83(HARN) (11)","","NGS-Usa LA","4269","4152","11","","8829","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_422[] = {"8430","NAD83 to NAD83(HARN) (12)","","NGS-Usa DE MD","4269","4152","12","","8830","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_423[] = {"8431","NAD83 to NAD83(HARN) (13)","","NGS-Usa ME","4269","4152","13","","8831","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_424[] = {"8432","NAD83 to NAD83(HARN) (14)","","NGS-Usa MI","4269","4152","14","","8832","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_425[] = {"8433","NAD83 to NAD83(HARN) (15)","","NGS-Usa MS","4269","4152","15","","8833","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_426[] = {"8434","NAD83 to NAD83(HARN) (16)","","NGS-Usa NE","4269","4152","16","","8834","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_427[] = {"8435","NAD83 to NAD83(HARN) (17)","","NGS-US NewEng","4269","4152","17","","8835","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_428[] = {"8436","NAD83 to NAD83(HARN) (18)","","NGS-Usa NM","4269","4152","18","","8836","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_429[] = {"8437","NAD83 to NAD83(HARN) (19)","","NGS-Usa NY","4269","4152","19","","8837","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_430[] = {"8438","NAD83 to NAD83(HARN) (20)","","NGS-Usa ND","4269","4152","20","","8838","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_431[] = {"8439","NAD83 to NAD83(HARN) (21)","","NGS-Usa OK","4269","4152","21","","8839","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_432[] = {"8440","NAD83 to NAD83(HARN) (22)","","NGS-PRVI","4269","4152","22","","8840","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_433[] = {"8441","NAD83 to NAD83(HARN) (23)","","NGS-Usa SD","4269","4152","23","","8841","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_434[] = {"8442","NAD83 to NAD83(HARN) (24)","","NGS-Usa TN","4269","4152","24","","8842","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_435[] = {"8443","NAD83 to NAD83(HARN) (25)","","NGS-Usa TX e","4269","4152","25","","8843","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_436[] = {"8444","NAD83 to NAD83(HARN) (26)","","NGS-Usa TX w","4269","4152","26","","8844","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_437[] = {"8445","NAD83 to NAD83(HARN) (27)","","NGS-Usa VA","4269","4152","27","","8845","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_438[] = {"8446","NAD83 to NAD83(HARN) (28)","","NGS-Usa OR WA","4269","4152","28","","8846","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_439[] = {"8447","NAD83 to NAD83(HARN) (29)","","NGS-Usa WI","4269","4152","29","","8847","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_440[] = {"8448","NAD83 to NAD83(HARN) (30)","","NGS-Usa WY","4269","4152","30","","8848","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_441[] = {"8449","Cape to Hartbeesthoek94 (1)","","DSM-Zaf","4222","4148","1","","8849","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_442[] = {"8450","Hartbeesthoek94 to WGS 84 (1)","","EPSG-Zaf","4148","4326","1","","8850","1999-10-20 00:00:00","","EPSG","For many purposes Hartbeesthoek94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_443[] = {"8451","AGD66 to GDA94 (6)","","Auslig-Tas","4202","4283","6","","8851","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_444[] = {"8452","AGD66 to GDA94 (7)","","Auslig-NT","4202","4283","7","","8852","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_445[] = {"8453","AGD66 to WGS 84 (7)","","EPSG-Aus Tas 0.1m","4202","4326","7","Australia - Tasmania.","8853","1999-10-20 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_446[] = {"8454","AGD66 to WGS 84 (8)","","EPSG-Aus NT 0.1m","4202","4326","8","Australia - Northern Territory.","8854","1999-10-20 00:00:00","","EPSG","For many purposes GDA94 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_447[] = {"8455","CH1903 to WGS 84 (1)","","BfL-CH 1","4149","4326","1","","8855","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_448[] = {"8456","CH1903+ to CHTRF95 (1)","","BfL-CH","4150","4151","1","","8856","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_449[] = {"8457","CH1903+ to WGS 84 (1)","","EPSG-CH","4150","4326","1","Liechtenstein;  Switzerland.","8857","1999-10-20 00:00:00","EPSG","EPSG","For many purposes CHTRF95 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_450[] = {"8458","CH1903 to WGS 84 (2)","","BfL-CH 2","4149","4326","2","","8858","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_451[] = {"8459","CHTRF95 to WGS 84 (1)","","EPSG-CH","4151","4326","1","","8859","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_452[] = {"8460","NAD27 to NAD83(HARN) (1)","","NGS-Usa AL","4267","4152","1","United States (USA) - Alabama.","8860","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_453[] = {"8461","NAD27 to NAD83(HARN) (2)","","NGS-Usa AZ","4267","4152","2","United States (USA) - Arizona.","8861","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_454[] = {"8462","NAD27 to NAD83(HARN) (3)","","NGS-Usa CA n","4267","4152","3","United States (USA) - California north of 38 deg N.","8862","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_455[] = {"8463","NAD27 to NAD83(HARN) (4)","","NGS-Usa CA s","4267","4152","4","United States (USA) - California south of 38 deg N.","8863","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_456[] = {"8464","NAD27 to NAD83(HARN) (5)","","NGS-Usa CO","4267","4152","5","United States (USA) - Colorado.","8864","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_457[] = {"8465","NAD27 to NAD83(HARN) (6)","","NGS-Usa GA","4267","4152","6","United States (USA) - Georgia.","8865","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_458[] = {"8466","NAD27 to NAD83(HARN) (7)","","NGS-Usa FL","4267","4152","7","United States (USA) - Florida.","8866","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_459[] = {"8467","NAD27 to NAD83(HARN) (8)","","NGS-Usa ID MT e","4267","4152","8","United States (USA) - Idaho and Montana - east of 113 deg W.","8867","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_460[] = {"8468","NAD27 to NAD83(HARN) (9)","","NGS-Usa ID MT w","4267","4152","9","United States (USA) - Idaho and Montana - west of 113 deg W.","8868","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_461[] = {"8469","NAD27 to NAD83(HARN) (10)","","NGS-Usa KY","4267","4152","10","United States (USA) - Kentucky.","8869","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_462[] = {"8470","NAD27 to NAD83(HARN) (11)","","NGS-Usa LA","4267","4152","11","United States (USA) - Louisiana.","8870","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_463[] = {"8471","NAD27 to NAD83(HARN) (12)","","NGS-Usa DE MD","4267","4152","12","United States (USA) - Delaware and Maryland.","8871","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_464[] = {"8472","NAD27 to NAD83(HARN) (13)","","NGS-Usa ME","4267","4152","13","United States (USA) - Maine.","8872","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_465[] = {"8473","NAD27 to NAD83(HARN) (14)","","NGS-Usa MI","4267","4152","14","United States (USA) - Michigan.","8873","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_466[] = {"8474","NAD27 to NAD83(HARN) (15)","","NGS-Usa MS","4267","4152","15","United States (USA) - Mississippi.","8874","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_467[] = {"8475","NAD27 to NAD83(HARN) (16)","","NGS-Usa NE","4267","4152","16","United States (USA) - Nebraska.","8875","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_468[] = {"8476","NAD27 to NAD83(HARN) (17)","","NGS-US NewEng","4267","4152","18","United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.","8876","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_469[] = {"8477","NAD27 to NAD83(HARN) (18)","","NGS-Usa NM","4267","4152","18","United States (USA) - New Mexico.","8877","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_470[] = {"8478","NAD27 to NAD83(HARN) (19)","","NGS-Usa NY","4267","4152","19","United States (USA) - New York.","8878","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_471[] = {"8479","NAD27 to NAD83(HARN) (20)","","NGS-Usa ND","4267","4152","20","United States (USA) - North Dakota.","8879","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_472[] = {"8480","NAD27 to NAD83(HARN) (21)","","NGS-Usa OK","4267","4152","21","United States (USA) - Oklahoma.","8880","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_473[] = {"8481","Puerto Rico to NAD83(HARN) (1)","","NGS-PRVI","4139","4152","1","United States (USA) - Puerto Rico and the Virgin Islands.","8881","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_474[] = {"8482","NAD27 to NAD83(HARN) (22)","","NGS-Usa SD","4267","4152","22","United States (USA) - South Dakota.","8882","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_475[] = {"8483","NAD27 to NAD83(HARN) (23)","","NGS-Usa TN","4267","4152","23","United States (USA) - Tennessee","8883","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_476[] = {"8484","NAD27 to NAD83(HARN) (24)","","NGS-Usa TX e","4267","4152","24","United States (USA) - Texas east of 100deg West.","8884","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_477[] = {"8485","NAD27 to NAD83(HARN) (25)","","NGS-Usa TX w","4267","4152","25","United States (USA) - Texas west of 100deg West.","8885","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_478[] = {"8486","NAD27 to NAD83(HARN) (26)","","NGS-Usa VA","4267","4152","26","United States (USA) - Virginia.","8886","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_479[] = {"8487","NAD27 to NAD83(HARN) (27)","","NGS-Usa OR WA","4267","4152","27","United States (USA) - Oregan; Washington.","8887","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_480[] = {"8488","NAD27 to NAD83(HARN) (28)","","NGS-Usa WI","4267","4152","28","United States (USA) - Wisconsin.","8888","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_481[] = {"8489","NAD27 to NAD83(HARN) (29)","","NGS-Usa WY","4267","4152","29","United States (USA) - Wyoming.","8889","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_482[] = {"8490","Rassadiran to WGS 84 (1)","","TOT-Taheri","4153","4326","1","Iran - Taheri refinery site.","8890","1999-10-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_483[] = {"8491","FD58 to WGS 84 (1)","","TOT-Kangan","4132","4326","1","Iran - Kangan district","8891","1999-10-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_484[] = {"8492","ED50(ED77) to WGS 84 (1)","","NCCI-Irn","4154","4326","1","Iran","8892","1999-10-20 00:00:00","National Cartographic Centre of Iran","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_485[] = {"8493","NAD83 to WGS 84 (4)","","NGS-Usa","4269","4326","4","United States (USA).","8893","1999-11-05 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_486[] = {"8494","NAD83 to WGS 84 (5)","","NGS-Usa","4269","4326","5","United States (USA).","8894","1999-11-05 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_487[] = {"8495","La Canoa to WGS 84 (1)","","LAG-Ven E","4247","4326","1","","8895","1999-11-05 00:00:00","","EPSG","","",NULL};
+datafile_rows_t geod_trf_row_488[] = {"8496","NAD27 to WGS 84 (28)","","NGS-Usa conus","4267","4326","28","United States (USA) - lower 48 states including EEZ.","8896","1999-10-20 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+datafile_rows_t geod_trf_row_489[] = {"8497","NAD27 to WGS 84 (29)","","NGS-Usa AK","4267","4326","29","United States (USA) - Alaska including EEZ.","8897","1999-10-20 00:00:00","","EPSG","For many purposes NAD83 can be assumed to be coincident with WGS 84.","",NULL};
+
+datafile_rows_t *geod_trf_rows[] = {geod_trf_row_1,geod_trf_row_2,geod_trf_row_3,geod_trf_row_4,geod_trf_row_5,geod_trf_row_6,geod_trf_row_7,geod_trf_row_8,geod_trf_row_9,geod_trf_row_10,geod_trf_row_11,geod_trf_row_12,geod_trf_row_13,geod_trf_row_14,geod_trf_row_15,geod_trf_row_16,geod_trf_row_17,geod_trf_row_18,geod_trf_row_19,geod_trf_row_20,geod_trf_row_21,geod_trf_row_22,geod_trf_row_23,geod_trf_row_24,geod_trf_row_25,geod_trf_row_26,geod_trf_row_27,geod_trf_row_28,geod_trf_row_29,g [...]
diff --git a/src/tiff/csv/geod_trf.csv b/src/tiff/csv/geod_trf.csv
new file mode 100644
index 0000000..921ccc6
--- /dev/null
+++ b/src/tiff/csv/geod_trf.csv
@@ -0,0 +1,489 @@
+"GEOD_TRF_CODE","GEOD_TRF_EPSG_NAME","GEOD_TRF_USER_NAME","DESCRIPTION","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","COORD_TRF_VARIANT","CONCAT_TRF_AREA_OF_USE","COORD_TRF_PATH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","CONCAT_TRF_REMARKS","CHANGE_ID"
+8000,Adindan to WGS 84 (1),,DMA-Eth Sud,4201,4326,1,,8400,1996-10-18 00:00:00,,EPSG,,
+8001,Adindan to WGS 84 (2),,DMA-Bfa,4201,4326,2,,8401,1996-10-18 00:00:00,,EPSG,,
+8002,Adindan to WGS 84 (3),,DMA-Cmr,4201,4326,3,,8402,1996-10-18 00:00:00,,EPSG,,
+8003,Adindan to WGS 84 (4),,DMA-Eth,4201,4326,4,,8403,1996-10-18 00:00:00,,EPSG,,
+8004,Adindan to WGS 84 (5),,DMA-Mli,4201,4326,5,,8404,1996-10-18 00:00:00,,EPSG,,
+8005,Adindan to WGS 84 (6),,DMA-Sen,4201,4326,6,,8405,1996-10-18 00:00:00,,EPSG,,
+8006,Adindan to WGS 84 (7),,DMA-Sud,4201,4326,7,,8406,1996-10-18 00:00:00,,EPSG,,
+8007,Afgooye to WGS 84 (1),,DMA-Som,4205,4326,1,,8407,1996-10-18 00:00:00,,EPSG,,
+8008,AGD66 to WGS 84 (1),,DMA-Aus,4202,4326,1,,8408,1996-10-18 00:00:00,,EPSG,,
+8009,AGD84 to WGS 84 (1),,DMA-Aus,4203,4326,1,,8409,1996-10-18 00:00:00,,EPSG,,
+8010,Ain el Abd to WGS 84 (1),,DMA-Bhr,4204,4326,1,,8410,1996-10-18 00:00:00,,EPSG,,
+8011,Ain el Abd to WGS 84 (2),,DMA-Sau,4204,4326,2,,8411,1996-10-18 00:00:00,,EPSG,,
+8012,Amersfoort to WGS 84 (1),,NCG-Nld,4289,4326,1,,8412,1996-10-18 00:00:00,,EPSG,,
+8013,Arc 1950 to WGS 84 (1),,DMA-mean,4209,4326,1,,8413,1996-10-18 00:00:00,,EPSG,,
+8014,Arc 1950 to WGS 84 (2),,DMA-Bwa,4209,4326,2,,8414,1996-10-18 00:00:00,,EPSG,,
+8015,Arc 1950 to WGS 84 (3),,DMA-Bdi,4209,4326,3,,8415,1996-10-18 00:00:00,,EPSG,,
+8016,Arc 1950 to WGS 84 (4),,DMA-Lso,4209,4326,4,,8416,1996-10-18 00:00:00,,EPSG,,
+8017,Arc 1950 to WGS 84 (5),,DMA-Mwi,4209,4326,5,,8417,1996-10-18 00:00:00,,EPSG,,
+8018,Arc 1950 to WGS 84 (6),,DMA-Swz,4209,4326,6,,8418,1996-10-18 00:00:00,,EPSG,,
+8019,Arc 1950 to WGS 84 (7),,DMA-Cod,4209,4326,7,,8419,1996-10-18 00:00:00,,EPSG,,
+8020,Arc 1950 to WGS 84 (8),,DMA-Zmb,4209,4326,8,,8420,1996-10-18 00:00:00,,EPSG,,
+8021,Arc 1950 to WGS 84 (9),,DMA-Zwe,4209,4326,9,,8421,1996-10-18 00:00:00,,EPSG,,
+8022,Arc 1960 to WGS 84 (1),,DMA-Ken Tza,4210,4326,1,,8422,1996-10-18 00:00:00,,EPSG,,
+8023,Batavia to WGS 84 (1),,DMA-Idn Sumatra,4211,4326,1,,8423,1996-10-18 00:00:00,,EPSG,,
+8024,Bermuda 1957 to WGS 84 (1),,DMA-Bmu,4216,4326,1,,8424,1996-10-18 00:00:00,,EPSG,,
+8025,Bogota to WGS 84 (1),,DMA-Col,4218,4326,1,,8425,1996-10-18 00:00:00,,EPSG,,
+8026,Bukit Rimpah to WGS 84 (1),,DMA-Idn Beli,4219,4326,1,,8426,1996-10-18 00:00:00,,EPSG,,
+8027,Campo Inchauspe to WGS 84 (1),,DMA-Arg,4221,4326,1,,8427,1996-10-18 00:00:00,,EPSG,,
+8028,Cape to WGS 84 (1),,DMA-Zaf,4222,4326,1,,8428,1996-10-18 00:00:00,,EPSG,,
+8029,Cape to WGS 84 (2),,DSLI-Zaf,4222,4326,2,,8429,1996-10-18 00:00:00,,EPSG,,
+8030,Carthage to WGS 84 (1),,DMA-Tun,4223,4326,1,,8430,1996-10-18 00:00:00,,EPSG,,
+8031,Chua to WGS 84 (1),,DMA-Pry,4224,4326,1,,8431,1996-10-18 00:00:00,,EPSG,,
+8032,Corrego Alegre to WGS 84 (1),,DMA-Bra,4225,4326,1,,8432,1996-10-18 00:00:00,,EPSG,,
+8033,ED50 to WGS 84 (1),,DMA-mean,4230,4326,1,,8433,1996-10-18 00:00:00,,EPSG,,
+8034,ED50 to WGS 84 (2),,DMA-cenEur,4230,4326,2,,8434,1996-10-18 00:00:00,,EPSG,,
+8035,ED50 to WGS 84 (3),,DMA-midEast,4230,4326,3,,8435,1996-10-18 00:00:00,,EPSG,,
+8036,ED50 to WGS 84 (4),,DMA-Cyp,4230,4326,4,,8436,1996-10-18 00:00:00,,EPSG,,
+8037,ED50 to WGS 84 (5),,DMA-Egy,4230,4326,5,,8437,1996-10-18 00:00:00,,EPSG,,
+8038,ED50 to WGS 84 (6),,DMA-Irl Gbr,4230,4326,6,,8438,1996-10-18 00:00:00,,EPSG,,
+8039,ED50 to WGS 84 (7),,DMA-Fin Nor,4230,4326,7,,8439,1996-10-18 00:00:00,,EPSG,,
+8040,ED50 to WGS 84 (8),,DMA-Grc,4230,4326,8,,8440,1996-10-18 00:00:00,,EPSG,,
+8041,ED50 to WGS 84 (9),,DMA-Irn,4230,4326,9,,8441,1996-10-18 00:00:00,,EPSG,,
+8042,ED50 to WGS 84 (10),,DMA-Ita Sard,4230,4326,10,,8442,1996-10-18 00:00:00,,EPSG,,
+8043,ED50 to WGS 84 (11),,DMA-Ita Sic,4230,4326,11,,8443,1996-10-18 00:00:00,,EPSG,,
+8044,ED50 to WGS 84 (12),,DMA-Mlt,4230,4326,12,,8444,1996-10-18 00:00:00,,EPSG,,
+8045,ED50 to WGS 84 (13),,DMA-Prt Esp,4230,4326,13,,8445,1996-10-18 00:00:00,,EPSG,,
+8046,ED50 to WGS 84 (14),,6Nat-NSea,4230,4326,14,Denmark - North Sea;  Germany - North Sea;  Netherlands - offshore;  Norway - North Sea south of 62 deg N; United Kingdom (UKCS) - North Sea south of 62 deg N.,8446,1996-10-18 00:00:00,,EPSG,,
+8047,ED50 to WGS 84 (15),,NMA-Nor N65,4230,4326,15,Norway - offshore north of 65 deg N.,8447,1996-10-18 00:00:00,,EPSG,The concatenation of transformations 1147 and 1146 gives the following position vector tfm: dX=-84.491  dY=-100.559  dZ=-114.209 metres rX= -2.4006  rY=-0.5367  rZ=-2.3742 microradians  dS=+0.2947 ppm.,
+8048,Egypt 1907 to WGS 84 (1),,DMA-Egy,4229,4326,1,,8448,1996-10-18 00:00:00,,EPSG,,
+8049,ETRF89 to WGS 84 (1),,EPSG-eur,4258,4326,1,,8449,1997-06-19 00:00:00,,EPSG,,97.24
+8050,GDA94 to WGS 84 (1),,EPSG-Aus,4283,4326,1,,8450,1996-10-18 00:00:00,,EPSG,,
+8051,GD49 to WGS 84 (1),,DMA-Nzl,4272,4326,1,,8451,1996-10-18 00:00:00,,EPSG,,
+8052,Hu Tzu Shan to WGS 84 (1),,DMA-Twn,4236,4326,1,,8452,1996-10-18 00:00:00,,EPSG,,
+8053,Indian 1954 to WGS 84 (1),,DMA-Tha,4239,4326,1,,8453,1996-10-18 00:00:00,,EPSG,,
+8054,Indian 1975 to WGS 84 (1),,DMA-Tha,4240,4326,1,,8454,1996-10-18 00:00:00,,EPSG,,
+8055,Kalianpur 1937 to WGS 84 (1),,DMA-Bgd,4144,4326,1,,8455,1999-10-20 00:00:00,,EPSG,,97.235
+8056,Kalianpur 1975 to WGS 84 (1),,DMA-Ind Npl,4146,4326,1,,8456,1999-10-20 00:00:00,,EPSG,,97.235
+8057,Kandawala to WGS 84 (1),,DMA-Lka,4244,4326,1,,8457,1996-10-18 00:00:00,,EPSG,,
+8058,Kertau to WGS 84 (1),,DMA-Mys Sgp,4245,4326,1,,8458,1996-10-18 00:00:00,,EPSG,,
+8059,Leigon to WGS 84 (1),,DMA-Gha,4250,4326,1,,8459,1996-10-18 00:00:00,,EPSG,,
+8060,Liberia 1964 to WGS 84 (1),,DMA-Lbr,4251,4326,1,,8460,1996-10-18 00:00:00,,EPSG,,
+8061,Luzon 1911 to WGS 84 (1),,DMA-Phl N,4253,4326,1,,8461,1996-10-18 00:00:00,,EPSG,,
+8062,Luzon 1911 to WGS 84 (2),,DMA-Phl Min,4253,4326,2,,8462,1996-10-18 00:00:00,,EPSG,,
+8063,M'poraloko to WGS 84 (1),,DMA-Gab,4266,4326,1,,8463,1996-10-18 00:00:00,,EPSG,,
+8064,Mahe 1971 to WGS 84 (1),,DMA-Syc,4256,4326,1,,8464,1996-10-18 00:00:00,,EPSG,,
+8065,Massawa to WGS 84 (1),,DMA-Eth,4262,4326,1,,8465,1996-10-18 00:00:00,,EPSG,,
+8066,Merchich to WGS 84 (1),,DMA-Mar,4261,4326,1,,8466,1996-10-18 00:00:00,,EPSG,,
+8067,Minna to WGS 84 (1),,DMA-Cmr,4263,4326,1,,8467,1996-10-18 00:00:00,,EPSG,,
+8068,Minna to WGS 84 (2),,DMA-Nga,4263,4326,2,,8468,1996-10-18 00:00:00,,EPSG,,
+8069,Monte Mario to WGS 84 (1),,DMA-Ita Sar,4265,4326,1,,8469,1996-10-18 00:00:00,,EPSG,,
+8070,NAD27 to WGS 84 (1),,DMA-Carib,4267,4326,1,,8470,1996-10-18 00:00:00,,EPSG,,
+8071,NAD27 to WGS 84 (2),,DMA-Cen Am,4267,4326,2,,8471,1996-10-18 00:00:00,,EPSG,,
+8072,NAD27 to WGS 84 (3),,DMA-Can,4267,4326,3,,8472,1996-10-18 00:00:00,,EPSG,,
+8073,NAD27 to WGS 84 (4),,DMA-Conus,4267,4326,4,,8473,1996-10-18 00:00:00,,EPSG,,
+8074,NAD27 to WGS 84 (5),,DMA-ConusE,4267,4326,5,,8474,1996-10-18 00:00:00,,EPSG,,
+8075,NAD27 to WGS 84 (6),,DMA-ConusW,4267,4326,6,,8475,1996-10-18 00:00:00,,EPSG,,
+8076,NAD27 to WGS 84 (7),,DMA-USA AK,4267,4326,7,,8476,1996-10-18 00:00:00,,EPSG,,
+8077,NAD27 to WGS 84 (8),,DMA-Bha xSalv,4267,4326,8,,8477,1996-10-18 00:00:00,,EPSG,,
+8078,NAD27 to WGS 84 (9),,DMA-Bha Salv,4267,4326,9,,8478,1996-10-18 00:00:00,,EPSG,,
+8079,NAD27 to WGS 84 (10),,DMA-Can AB BC,4267,4326,10,,8479,1996-10-18 00:00:00,,EPSG,,
+8080,NAD27 to WGS 84 (11),,DMA-Can MN ON,4267,4326,11,,8480,1996-10-18 00:00:00,,EPSG,,
+8081,NAD27 to WGS 84 (12),,DMA-Can E,4267,4326,12,,8481,1996-10-18 00:00:00,,EPSG,,
+8082,NAD27 to WGS 84 (13),,DMA-Can NWT,4267,4326,13,,8482,1996-10-18 00:00:00,,EPSG,,
+8083,NAD27 to WGS 84 (14),,DMA-Can Yuk,4267,4326,14,,8483,1996-10-18 00:00:00,,EPSG,,
+8084,NAD27 to WGS 84 (15),,DMA-Pan,4267,4326,15,,8484,1996-10-18 00:00:00,,EPSG,,
+8085,NAD27 to WGS 84 (16),,DMA-Cuba,4267,4326,16,,8485,1996-10-18 00:00:00,,EPSG,,
+8086,NAD27 to WGS 84 (17),,DMA-Grl,4267,4326,17,,8486,1996-10-18 00:00:00,,EPSG,,
+8087,NAD27 to WGS 84 (18),,DMA-Mex,4267,4326,18,,8487,1996-10-18 00:00:00,,EPSG,,
+8088,NAD83 to WGS 84 (1),,DMA-N Am,4269,4326,1,,8488,1996-10-18 00:00:00,,EPSG,,
+8089,Nahrwan 1967 to WGS 84 (1),,DMA-Omn Mas,4270,4326,1,,8489,1996-10-18 00:00:00,,EPSG,,
+8090,Nahrwan 1967 to WGS 84 (2),,DMA-Sau,4270,4326,2,,8490,1996-10-18 00:00:00,,EPSG,,
+8091,Nahrwan 1967 to WGS 84 (3),,DMA-UAE,4270,4326,3,,8491,1996-10-18 00:00:00,,EPSG,,
+8092,Naparima 1972 to WGS 84 (1),,DMA-Tto,4271,4326,1,,8492,1998-06-30 00:00:00,,EPSG,,98.102
+8093,NTF to WGS 84 (1),,IGN-Fra,4275,4326,1,,8493,1996-10-18 00:00:00,,EPSG,,
+8094,NTF (Paris) to WGS 84 (1),,EPSG-Fra,4807,4326,1,France..,8494,1996-10-18 00:00:00,,EPSG,,
+8095,OSGB 1936 to WGS 84 (1),,DMA-Gbr,4277,4326,1,,8495,1996-10-18 00:00:00,,EPSG,,
+8096,OSGB 1936 to WGS 84 (2),,DMA-Gbr Eng,4277,4326,2,,8496,1996-10-18 00:00:00,,EPSG,,
+8097,OSGB 1936 to WGS 84 (3),,DMA-Gbr E&W,4277,4326,3,,8497,1996-10-18 00:00:00,,EPSG,,
+8098,OSGB 1936 to WGS 84 (4),,DMA-Gbr Sco,4277,4326,4,,8498,1996-10-18 00:00:00,,EPSG,,
+8099,OSGB 1936 to WGS 84 (5),,DMA-Gbr Wal,4277,4326,5,,8499,1996-10-18 00:00:00,,EPSG,,
+8100,Pointe Noire to WGS 84 (1),,DMA-Cog,4282,4326,1,,8500,1996-10-18 00:00:00,,EPSG,,
+8101,PSAD56 to WGS 84 (1),,DMA-mean,4248,4326,1,,8501,1996-10-18 00:00:00,,EPSG,,
+8102,PSAD56 to WGS 84 (2),,DMA-Bol,4248,4326,2,,8502,1996-10-18 00:00:00,,EPSG,,
+8103,PSAD56 to WGS 84 (3),,DMA-Chl N,4248,4326,3,,8503,1996-10-18 00:00:00,,EPSG,,
+8104,PSAD56 to WGS 84 (4),,DMA Chl S,4248,4326,4,,8504,1996-10-18 00:00:00,,EPSG,,
+8105,PSAD56 to WGS 84 (5),,DMA-Col,4248,4326,5,,8505,1996-10-18 00:00:00,,EPSG,,
+8106,PSAD56 to WGS 84 (6),,DMA-Ecu,4248,4326,6,,8506,1996-10-18 00:00:00,,EPSG,,
+8107,PSAD56 to WGS 84 (7),,DMA-Guy,4248,4326,7,,8507,1996-10-18 00:00:00,,EPSG,,
+8108,PSAD56 to WGS 84 (8),,DMA-Per,4248,4326,8,,8508,1996-10-18 00:00:00,,EPSG,,
+8109,PSAD56 to WGS 84 (9),,DMA-Ven,4248,4326,9,,8509,1996-10-18 00:00:00,,EPSG,,
+8110,Qatar to WGS 84 (1),,DMA-Qat,4285,4326,1,,8510,1996-10-18 00:00:00,,EPSG,,
+8111,Qornoq to WGS 84 (1),,DMA-Grl S,4287,4326,1,,8511,1996-10-18 00:00:00,,EPSG,,
+8112,SAD69 to WGS 84 (1),,DMA-mean,4291,4326,1,,8512,1996-10-18 00:00:00,,EPSG,,
+8113,SAD69 to WGS 84 (2),,DMA-Arg,4291,4326,2,,8513,1996-10-18 00:00:00,,EPSG,,
+8114,SAD69 to WGS 84 (3),,DMA-Bol,4291,4326,3,,8514,1996-10-18 00:00:00,,EPSG,,
+8115,SAD69 to WGS 84 (4),,DMA-Bra,4291,4326,4,,8515,1996-10-18 00:00:00,,EPSG,,
+8116,SAD69 to WGS 84 (5),,DMA-Chile,4291,4326,5,,8516,1996-10-18 00:00:00,,EPSG,,
+8117,SAD69 to WGS 84 (6),,DMA-Col,4291,4326,6,,8517,1996-10-18 00:00:00,,EPSG,,
+8118,SAD69 to WGS 84 (7),,DMA-Ecu,4291,4326,7,,8518,1996-10-18 00:00:00,,EPSG,,
+8119,SAD69 to WGS 84 (8),,DMA-Ecu Gal,4291,4326,8,,8519,1996-10-18 00:00:00,,EPSG,,
+8120,SAD69 to WGS 84 (9),,DMA-Guyana,4291,4326,9,,8520,1996-10-18 00:00:00,,EPSG,,
+8121,SAD69 to WGS 84 (10),,DMA-Pgy,4291,4326,10,,8521,1996-10-18 00:00:00,,EPSG,,
+8122,SAD69 to WGS 84 (11),,DMA-Peru,4291,4326,11,,8522,1996-10-18 00:00:00,,EPSG,,
+8123,SAD69 to WGS 84 (12),,DMA-Tto,4291,4326,12,,8523,1996-10-18 00:00:00,,EPSG,,
+8124,SAD69 to WGS 84 (13),,DMA-Ven,4291,4326,13,,8524,1996-10-18 00:00:00,,EPSG,,
+8125,Sapper Hill 1943 to WGS 84 (1),,DMA-Flk E,4292,4326,1,,8525,1996-10-18 00:00:00,,EPSG,,
+8126,Schwarzeck to WGS 84 (1),,DMA-Nam,4293,4326,1,,8526,1996-10-18 00:00:00,,EPSG,,
+8127,Tananarive to WGS 84 (1),,DMA-Mdg,4297,4326,1,,8527,1996-10-18 00:00:00,,EPSG,,
+8128,Timbalai 1948 to WGS 84 (1),,DMA-Borneo,4298,4326,1,,8528,1996-10-18 00:00:00,,EPSG,,
+8129,TM65 to WGS 84 (1),,DMA-Ire,4299,4326,1,,8529,1996-10-18 00:00:00,,EPSG,,
+8130,Tokyo to WGS 84 (1),,DMA-Jpn Kor,4301,4326,1,,8530,1996-10-18 00:00:00,,EPSG,,
+8131,Tokyo to WGS 84 (2),,DMA-Jpn,4301,4326,2,,8531,1996-10-18 00:00:00,,EPSG,,
+8132,Tokyo to WGS 84 (3),,DMA-Kor,4301,4326,3,,8532,1996-10-18 00:00:00,,EPSG,,
+8133,Tokyo to WGS 84 (4),,DMA-Jpn Ok,4301,4326,4,,8533,1996-10-18 00:00:00,,EPSG,,
+8134,Yacare to WGS 84 (1),,DMA-Ury,4309,4326,1,,8534,1996-10-18 00:00:00,,EPSG,,
+8135,Zanderij to WGS 84 (1),,DMA-Sur,4311,4326,1,,8535,1996-10-18 00:00:00,,EPSG,,
+8136,ED50 to ED87 (1),,6Nat-NSea,4230,4231,1,,8536,1996-10-18 00:00:00,,EPSG,,
+8137,ED87 to WGS 84 (1),,6Nat-NSea,4231,4326,1,,8537,1996-10-18 00:00:00,,EPSG,,
+8138,ED50 to ED87 (2),,NMA-Nor N65,4230,4231,2,,8538,1996-10-18 00:00:00,,EPSG,,
+8139,AGD84 to WGS 84 (2),,Auslig-Aus old,4203,4326,2,,8539,1996-12-12 00:00:00,,EPSG,,
+8140,WGS 72 to WGS 84 (1),,DMA,4322,4326,1,,8540,1996-12-12 00:00:00,,EPSG,,
+8141,WGS 72 to WGS 84 (2),,,4322,4326,2,,8541,1996-12-12 00:00:00,,EPSG,,
+8142,WGS 72BE to WGS 72 (1),,,4324,4322,1,,8542,1996-12-12 00:00:00,,EPSG,,
+8143,WGS 72BE to WGS 84 (1),,,4324,4326,1,,8543,1996-12-12 00:00:00,,EPSG,,
+8144,NAD27 to NAD83 (1),,NGS-Conus,4267,4269,1,,8544,1996-12-12 00:00:00,,EPSG,,
+8146,NAD27 to NAD83 (2),,NGS-Usa AK,4267,4269,2,,8546,1996-12-12 00:00:00,,EPSG,,
+8148,ED50 to WGS 84 (16),,DMA-Tun,4230,4326,16,,8548,1997-06-12 00:00:00,,EPSG,,
+8149,Herat North to WGS 84 (1),,DMA-Afg,4255,4326,1,,8549,1997-06-12 00:00:00,,EPSG,,
+8150,Kalianpur 1962 to WGS 84 (1),,DMA-Pak,4145,4326,1,,8550,1999-10-20 00:00:00,,EPSG,,97.235
+8151,ID74 to WGS 84 (1),,DMA-Idn,4238,4326,1,,8551,1997-06-12 00:00:00,,EPSG,,
+8152,NAD27 to WGS 84 (21),,DMA-AK AluE,4267,4326,21,,8552,1997-04-11 00:00:00,,EPSG,,
+8153,NAD27 to WGS 84 (22),,DMA-AK AluW,4267,4326,22,,8553,1997-04-11 00:00:00,,EPSG,,
+8154,NAD83 to WGS 84 (2),,DMA-AK Alu,4269,4326,2,,8554,1997-04-11 00:00:00,,EPSG,,
+8155,NAD83 to WGS 84 (3),,DMA-USA Hi,4269,4326,3,,8555,1997-04-11 00:00:00,,EPSG,,
+8156,Nord Sahara 1959 to WGS 84 (1),,DMA-Alg,4307,4326,1,,8556,1997-04-11 00:00:00,,EPSG,,
+8157,Pulkovo 1942 to WGS 84 (1),,DMA-Rus,4284,4326,1,,8557,1997-04-11 00:00:00,,EPSG,,
+8158,Voirol Unifie to WGS 84 (1),,DMA-Alg N,4305,4326,1,,8558,1997-04-11 00:00:00,,EPSG,,98.15
+8159,Fahud to WGS 84 (1),,DMA-Omn,4232,4326,1,,8559,1997-04-11 00:00:00,,EPSG,,
+8160,NTF (Paris) to NTF (1),,IGN-Fra,4807,4275,1,,8560,1997-04-11 00:00:00,,EPSG,,
+8161,Bern 1898 (Bern) to Bern 1898 (1),,BfL-CH,4801,4217,1,,8561,1997-04-11 00:00:00,,EPSG,,
+8162,Bogota (Bogota) to Bogota (1),,IGAC-Col,4802,4218,1,,8562,1997-04-11 00:00:00,,EPSG,,
+8163,Lisbon (Lisbon) to Lisbon (1),,IGC-Prt,4803,4207,1,,8564,1997-04-11 00:00:00,,EPSG,,
+8164,Makassar (Jakarta) to Makassar (1),,EPSG-Idn Sulawesi,4804,4257,1,,8565,1997-04-11 00:00:00,,EPSG,,
+8165,MGI (Ferro) to MGI (1),,BEV-Aut balk,4805,4312,1,,8566,1997-04-11 00:00:00,,EPSG,,
+8166,Monte Mario (Rome) to Monte Mario (1),,EPSG-Ita,4806,4265,1,,8567,1997-04-11 00:00:00,,EPSG,,
+8167,Padang (Jakarta) to Padang (1),,EPSG-Idn Sumatra,4808,4280,1,,8569,1997-04-11 00:00:00,,EPSG,,
+8168,Belge 1950 (Brussels) to Belge 1950 (1),,IGN-Bel,4809,4215,1,,8570,1997-04-11 00:00:00,,EPSG,,
+8169,Tananarive (Paris) to Tananarive (1),,EPSG-Mdg,4810,4297,1,,8571,1997-04-11 00:00:00,,EPSG,,
+8170,Voirol 1875 (Paris) to Voirol 1875 (1),,IGN-Dza,4811,4304,1,,8573,1997-04-11 00:00:00,,EPSG,,
+8171,Voirol Unifie (Paris) to Voirol Unifie(1,,IGN-Dza,4812,4305,1,,8574,1997-04-11 00:00:00,,EPSG,,
+8172,Batavia (Jakarta) to Batavia (1),,EPSG-Idn Java,4813,4211,1,,8576,1997-04-11 00:00:00,,EPSG,,
+8173,RT38 (Stockholm) to RT38 (1),,NLS-Swe,4814,4308,1,,8578,1997-04-11 00:00:00,,EPSG,,
+8174,Bogota (Bogota) to WGS 84 (1),,EPSG-Col,4802,4326,1,Colombia.,8563,1997-04-11 00:00:00,,EPSG,,
+8175,Monte Mario (Rome) to WGS 84 (1),,EPSG-Ita,4806,4326,1,Italy (Sardinia).,8568,1997-04-11 00:00:00,,EPSG,,
+8176,Tananarive (Paris) to WGS 84 (1),,EPSG-Mdg,4810,4326,1,Madagascar.,8572,1997-04-11 00:00:00,,EPSG,,
+8177,Voirol Unifie (Paris) to WGS 84 (1),,EPSG-Dza N,4812,4326,1,Algeria - north of 35g (31 deg 30 min) North,8575,1997-04-11 00:00:00,,EPSG,,
+8178,Batavia (Jakarta) to WGS 84 (1),,EPSG-Idn Sumatra,4813,4326,1,Indonesia (Sumatra).,8577,1997-04-11 00:00:00,,EPSG,,
+8179,Greek (Athens) to Greek (1),,NTU-Grc,4815,4120,1,,8579,1998-12-14 00:00:00,,EPSG,,98.52
+8180,Schwarzeck to WGS 84 (2),,SLI-Nam,4293,4326,2,,8580,1998-11-19 00:00:00,,EPSG,,98.46
+8181,GGRS87 to WGS 84 (1),,Hel-Grc,4121,4326,1,,8581,1997-06-16 00:00:00,,EPSG,,
+8182,HD72 to ETRF89 (1),,ELTE-Hun,4237,4258,1,,8582,1997-11-13 00:00:00,,EPSG,,97.47
+8183,HD72 to WGS 84 (1),,EPSG-Hun,4237,4326,1,Hungary.,8583,1997-07-22 00:00:00,,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,
+8184,ED50 to WGS 84 (17),,IGN-Fra,4230,4326,17,,8584,1997-11-13 00:00:00,,EPSG,,
+8185,NTF to ED50 (1),,IGN-Fra,4275,4230,1,,8585,1997-11-13 00:00:00,,EPSG,,
+8186,NTF (Paris) to ED50 (1),,EPSG-Fra,4807,4230,1,France,8586,1997-11-13 00:00:00,,EPSG,,
+8187,NTF to WGS 72 (1),,IGN-Fra,4275,4322,1,,8587,1997-11-13 00:00:00,,EPSG,,
+8188,NTF (Paris) to WGS 72 (1),,EPSG-Fra,4807,4322,1,France.,8588,1997-11-13 00:00:00,,EPSG,,
+8189,AGD66 to GDA94 (1),,Auslig-Aus 5m,4202,4283,1,,8589,1997-11-13 00:00:00,,EPSG,,
+8190,AGD66 to WGS 84 (2),,EPSG-Aus 5m,4202,4326,2,Australia..,8590,1998-12-16 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,98.50
+8191,AGD84 to GDA94 (1),,Auslig-Aus 5m,4203,4283,1,,8591,1997-11-13 00:00:00,,EPSG,,
+8192,AGD84 to WGS 84 (3),,EPSG-Aus 5m,4203,4326,3,Australia,8592,1998-12-16 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,98.50
+8193,AGD84 to GDA94 (2),,Auslig-Aus 1m,4203,4283,2,,8593,1997-11-13 00:00:00,,EPSG,,
+8194,AGD84 to WGS 84 (4),,EPSG-Aus 1m,4203,4326,4,Australia.,8594,1998-12-16 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,98.50
+8195,RT90 to WGS 84 (1),,EPSG-Swe,4124,4326,1,Sweden.,8595,1999-04-22 00:00:00,,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,99.11
+8196,Samboja to WGS 84 (1),,TOT-Idn Mah,4125,4326,1,,8596,1997-11-13 00:00:00,,EPSG,,
+8197,Pulkovo 1942 to LKS94 (1),,HNIT-Ltu,4284,4126,1,,8597,1998-03-12 00:00:00,,EPSG,,
+8198,LKS94 to WGS 84 (1),,HNIT-Ltu,4126,4326,1,,8598,1998-04-16 00:00:00,,EPSG,For many purposes LKS94 can be assumed to be coincident with WGS 84.,98.13
+8199,Pulkovo 1942 to WGS 84 (2),,EPSG-Ltu,4284,4326,2,Lithuania.,8609,1998-03-12 00:00:00,,EPSG,For many purposes LKS94 can be assumed to be coincident with WGS 84.,
+8200,Pulkovo 1942 to WGS 84 (3),,NIMA-Hun,4284,4326,3,,8602,1998-03-12 00:00:00,,EPSG,,
+8201,Pulkovo 1942 to WGS 84 (4),,NIMA-Pol,4284,4326,4,,8603,1998-03-12 00:00:00,,EPSG,,
+8202,Pulkovo 1942 to WGS 84 (5),,NIMA-Cze,4284,4326,5,,8604,1998-03-12 00:00:00,,EPSG,,
+8203,Pulkovo 1942 to WGS 84 (6),,NIMA-Lva,4284,4326,6,,8605,1998-03-12 00:00:00,,EPSG,,
+8204,Pulkovo 1942 to WGS 84 (7),,NIMA-Kaz,4284,4326,7,,8606,1998-03-12 00:00:00,,EPSG,,
+8205,Pulkovo 1942 to WGS 84 (8),,NIMA-Alb,4284,4326,8,,8607,1998-03-12 00:00:00,,EPSG,,
+8206,Pulkovo 1942 to WGS 84 (9),,NIMA-Rom,4284,4326,9,,8608,1998-03-12 00:00:00,,EPSG,,
+8207,Arc 1960 to WGS 84 (2),,NIMA-Ken,4210,4326,2,,8599,1998-03-12 00:00:00,,EPSG,,
+8208,Arc 1960 to WGS 84 (3),,NIMA-Tza,4210,4326,3,,8600,1998-03-12 00:00:00,,EPSG,,
+8209,Segora to WGS 84 (1),,NIMA-Idn Kal,4294,4326,1,,8601,1998-03-12 00:00:00,,EPSG,,
+8210,Voirol 1875 to WGS 84 (1),,NIMA-Dza N,4304,4326,1,,8610,1998-03-12 00:00:00,,EPSG,,
+8211,Voirol 1875 (Paris) to WGS 84 (1),,EPSG-Dza N,4811,4326,1,Algeria - north of 35g (31 deg 30 min) North.,8611,1998-03-12 00:00:00,,EPSG,,
+8212,Naparima 1972 to WGS 84 (2),,MEEI-Tto,4271,4326,2,,8612,1998-04-16 00:00:00,,EPSG,,
+8213,Trinidad 1903 to WGS 84 (1),,MEEI-Trin,4302,4326,1,,8613,1998-04-16 00:00:00,,EPSG,,
+8214,Tete to Moznet (1),,DNGC-Moz,4127,4130,1,,8614,1998-04-16 00:00:00,,EPSG,,
+8215,Tete to WGS 84 (1),,EPSG-Moz,4127,4326,1,Mozambique - average for whole country.,8615,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8216,Tete to Moznet (2),,DNGC-Moz A,4127,4130,2,,8616,1998-04-16 00:00:00,,EPSG,,
+8217,Tete to WGS 84 (2),,EPSG-Moz A,4127,4326,2,Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.,8617,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8218,Tete to Moznet (3),,DNGC-Moz B,4127,4130,3,,8618,1998-04-16 00:00:00,,EPSG,,
+8219,Tete to WGS 84 (3),,EPSG-Moz B,4127,4326,3,Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.,8619,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8220,Tete to Moznet (4),,DNGC-Moz C,4127,4130,4,,8620,1998-04-16 00:00:00,,EPSG,,
+8221,Tete to WGS 84 (4),,EPSG-Moz C,4127,4326,4,Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.,8621,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8222,Tete to Moznet (5),,DNGC-Moz D,4127,4130,5,,8622,1998-04-16 00:00:00,,EPSG,,
+8223,Tete to WGS 84 (5),,EPSG-Moz D,4127,4326,5,Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.,8623,1998-04-16 00:00:00,,EPSG,For many purposes Moznet can be assumed to be coincident with WGS 84.,
+8224,Moznet to WGS 84 (1),,EPSG-Moz,4130,4326,1,,8624,1998-04-16 00:00:00,,EPSG,,
+8225,Pulkovo 1942 to WGS 84 (10),,KCS-Kaz Cas,4284,4326,10,,8625,1998-04-16 00:00:00,,EPSG,,
+8226,Indian 1975 to WGS 84 (2),,NIMA-Tha,4240,4326,2,,8626,1998-04-16 00:00:00,,EPSG,,
+8227,Tokyo to WGS 84 (5),,NIMA-Kor,4301,4326,5,,8627,1998-11-19 00:00:00,,EPSG,,98.46
+8228,MGI to WGS 84 (1),,NIMA-balk,4312,4326,1,,8628,1998-04-16 00:00:00,,EPSG,,
+8229,Naparima 1972 to WGS 84 (3),,NIMA-Tto,4271,4326,3,,8629,1998-04-16 00:00:00,,EPSG,,
+8233,DHDN to ETRF89 (1),,IfAG-Deu W,4314,4258,1,,8633,1998-06-30 00:00:00,,EPSG,,
+8234,DHDN to WGS 84 (1),,EPSG-Deu W,4314,4326,1,Germany - former west Germany.,8634,1998-06-30 00:00:00,EPSG,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,
+8235,Pulkovo 1942 to ETRF89 (1),,IfAG-Deu E,4284,4258,1,,8635,1998-06-30 00:00:00,,EPSG,,
+8236,Pulkovo 1942 to WGS 84 (11),,EPSG-Deu E,4284,4326,11,Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.,8636,1998-06-30 00:00:00,,EPSG,For many purposes ETRF89 can be assumed to be coincident with WGS 84.,
+8237,ED50 to WGS 84 (Common Offshore),,UKOOA-CO,4230,4326,18,,8637,1998-06-30 00:00:00,,EPSG,,98.27
+8238,Madrid 1870 (Madrid) to ED50 (1),,IGB-Esp,4903,4230,1,,8638,1998-11-11 00:00:00,,EPSG,,
+8239,Madrid 1870 (Madrid) to ED50 (2),,IGB-Esp N,4903,4230,2,,8639,1998-11-11 00:00:00,,EPSG,,
+8240,Madrid 1870 (Madrid) to ED50 (3),,IGB-Esp S,4903,4230,3,,8640,1998-11-11 00:00:00,,EPSG,,
+8241,Madrid 1870 (Madrid) to WGS 84 (1),,EPSG-Esp,4903,4326,1,Spain.,8641,1998-11-11 00:00:00,,EPSG,,
+8242,NAD27 to NAD83 (3),,GC-Can NT1,4267,4269,3,,8642,1998-11-11 00:00:00,,EPSG,,98.57
+8243,NAD27 to WGS 84 (25),,EPSG-Can old,4267,4326,25,Canada,8643,1998-11-11 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8244,NAD27 to NAD83 (4),,GC-Can,4267,4269,4,,8644,1998-11-11 00:00:00,,EPSG,,98.57
+8245,NAD27 to WGS 84 (26),,EPSG-Can,4267,4326,26,Canada.,8645,1998-11-11 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8246,OSGB 1936 to WGS 84 (Petroleum),,UKOOA-Pet,4277,4326,6,,8646,1998-11-11 00:00:00,,EPSG,,
+8247,OSGB 1936 to ED50 (UKOOA),,UKOOA-UKCS,4277,4230,1,,8647,1998-11-11 00:00:00,,EPSG,,
+8248,Manoca to WGS 84 (1),,SCS-Cmr,4260,4326,1,,8648,1998-11-11 00:00:00,,EPSG,,
+8249,Camacupa to WGS 72BE (1),,GSI-Ago,4220,4324,1,,8649,1998-11-11 00:00:00,,EPSG,,
+8250,Camacupa to WGS 84 (1),,CON-Ago B5,4220,4326,1,,8650,1998-11-11 00:00:00,,EPSG,,
+8251,Camacupa to WGS 84 (2),,TEX-Ago B2,4220,4326,2,,8651,1998-11-11 00:00:00,,EPSG,,
+8252,Camacupa to WGS 84 (3),,SHL-Ago old,4220,4326,3,,8652,1998-11-11 00:00:00,,EPSG,,
+8253,Camacupa to WGS 84 (4),,GSI-Ago,4220,4326,4,,8653,1998-11-11 00:00:00,,EPSG,,
+8254,Camacupa to WGS 84 (5),,ELF-Ago B3 old,4220,4326,5,,8654,1998-11-11 00:00:00,,EPSG,,
+8255,Camacupa to WGS 84 (6),,ELF-Ago B7 old,4220,4326,6,,8655,1998-11-11 00:00:00,,EPSG,,
+8256,Camacupa to WGS 84 (7),,ELF-Ago B15,4220,4326,7,,8656,1998-11-11 00:00:00,,EPSG,,
+8257,Camacupa to WGS 84 (8),,ELF-Ago B2 old,4220,4326,8,,8657,1998-11-11 00:00:00,,EPSG,,
+8258,Camacupa to WGS 84 (9),,SHL-Ago B16,4220,4326,9,,8658,1998-11-11 00:00:00,,EPSG,,
+8259,Camacupa to WGS 84 (10),,ELF-Ago N,4220,4326,10,,8659,1998-11-11 00:00:00,,EPSG,,
+8260,Malongo 1987 to Mhast (1),,CHV-Ago Cab,4259,4264,1,,8660,1998-11-11 00:00:00,,EPSG,,
+8261,Mhast to WGS 84 (1),,CHV-Ago Cab,4264,4326,1,,8661,1998-11-11 00:00:00,,EPSG,,
+8262,Malongo 1987 to WGS 84 (1),,CHV-Ago Cab,4259,4326,1,,8662,1998-11-11 00:00:00,,EPSG,,
+8263,MGI (Ferro) to WGS 84 (1),,DMA-balk,4805,4326,1,MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.,8663,1998-12-14 00:00:00,,EPSG,,
+8264,EST92 to ETRF89 (1),,UT-Est,4133,4258,1,,8664,1998-12-14 00:00:00,,EPSG,,
+8265,Pulkovo 1942 to EST92 (1),,UT-Est,4284,4133,1,,8665,1998-12-14 00:00:00,,EPSG,,
+8266,EST92 to WGS 84 (1),,UT-Est,4133,4326,1,,8666,1998-12-14 00:00:00,,EPSG,,
+8267,Pulkovo 1942 to WGS 84 (12),,UT-Est,4284,4326,12,,8667,1998-12-14 00:00:00,,EPSG,,
+8268,Tokyo to WGS 84 (6),,GSI-Jpn 452141,4301,4326,6,,8668,1998-12-14 00:00:00,,EPSG,,
+8269,Tokyo to WGS 84 (7),,GSI-Jpn 452142,4301,4326,7,,8669,1998-12-14 00:00:00,,EPSG,,
+8270,Tokyo to WGS 84 (8),,GSI-Jpn 444141,4301,4326,8,,8670,1998-12-14 00:00:00,,EPSG,,
+8271,Tokyo to WGS 84 (9),,GSI-Jpn 444142,4301,4326,9,,8671,1998-12-14 00:00:00,,EPSG,,
+8272,Tokyo to WGS 84 (10),,GSI-Jpn 440141,4301,4326,10,,8672,1998-12-14 00:00:00,,EPSG,,
+8273,Tokyo to WGS 84 (11),,GSI-Jpn 440142,4301,4326,11,,8673,1998-12-14 00:00:00,,EPSG,,
+8274,Tokyo to WGS 84 (12),,GSI-Jpn 440143,4301,4326,12,,8674,1998-12-14 00:00:00,,EPSG,,
+8275,Tokyo to WGS 84 (13),,GSI-Jpn 440144,4301,4326,13,,8675,1998-12-14 00:00:00,,EPSG,,
+8276,Tokyo to WGS 84 (14),,GSI-Jpn 432141,4301,4326,14,,8676,1998-12-14 00:00:00,,EPSG,,
+8277,Tokyo to WGS 84 (15),,GSI-Jpn 432142,4301,4326,15,,8677,1998-12-14 00:00:00,,EPSG,,
+8278,Tokyo to WGS 84 (16),,GSI-Jpn 432143,4301,4326,16,,8678,1998-12-14 00:00:00,,EPSG,,
+8279,Tokyo to WGS 84 (17),,GSI-Jpn 432144,4301,4326,17,,8679,1998-12-14 00:00:00,,EPSG,,
+8280,Tokyo to WGS 84 (18),,GSI-Jpn 432145,4301,4326,18,,8680,1998-12-14 00:00:00,,EPSG,,
+8281,Tokyo to WGS 84 (19),,GSI-Jpn 424140,4301,4326,19,,8681,1998-12-14 00:00:00,,EPSG,,
+8282,Tokyo to WGS 84 (20),,GSI-Jpn 424141,4301,4326,20,,8682,1998-12-14 00:00:00,,EPSG,,
+8283,Tokyo to WGS 84 (21),,GSI-Jpn 424142,4301,4326,21,,8683,1998-12-14 00:00:00,,EPSG,,
+8284,Tokyo to WGS 84 (22),,GSI-Jpn 424143,4301,4326,22,,8684,1998-12-14 00:00:00,,EPSG,,
+8285,Tokyo to WGS 84 (23),,GSI-Jpn 424144,4301,4326,23,,8685,1998-12-14 00:00:00,,EPSG,,
+8286,Tokyo to WGS 84 (24),,GSI-Jpn 424145,4301,4326,24,,8686,1998-12-14 00:00:00,,EPSG,,
+8287,Tokyo to WGS 84 (25),,GSI-Jpn 420139,4301,4326,25,,8687,1998-12-14 00:00:00,,EPSG,,
+8288,Tokyo to WGS 84 (26),,GSI-Jpn 420140,4301,4326,26,,8688,1998-12-14 00:00:00,,EPSG,,
+8289,Tokyo to WGS 84 (27),,GSI-Jpn,4301,4326,27,,8689,1998-12-14 00:00:00,,EPSG,,
+8290,Tokyo to WGS 84 (28),,GSI-Jpn,4301,4326,28,,8690,1998-12-14 00:00:00,,EPSG,,
+8291,Tokyo to WGS 84 (29),,GSI-Jpn,4301,4326,29,,8691,1998-12-14 00:00:00,,EPSG,,
+8292,Tokyo to WGS 84 (30),,GSI-Jpn,4301,4326,30,,8692,1998-12-14 00:00:00,,EPSG,,
+8293,Tokyo to WGS 84 (31),,GSI-Jpn,4301,4326,31,,8693,1998-12-14 00:00:00,,EPSG,,
+8294,Tokyo to WGS 84 (32),,GSI-Jpn,4301,4326,32,,8694,1998-12-14 00:00:00,,EPSG,,
+8295,Tokyo to WGS 84 (33),,GSI-Jpn,4301,4326,33,,8695,1998-12-14 00:00:00,,EPSG,,
+8296,Tokyo to WGS 84 (34),,GSI-Jpn,4301,4326,34,,8696,1998-12-14 00:00:00,,EPSG,,
+8297,Tokyo to WGS 84 (35),,GSI-Jpn,4301,4326,35,,8697,1998-12-14 00:00:00,,EPSG,,
+8298,Tokyo to WGS 84 (36),,GSI-Jpn,4301,4326,36,,8698,1998-12-14 00:00:00,,EPSG,,
+8299,Tokyo to WGS 84 (37),,GSI-Jpn,4301,4326,37,,8699,1998-12-14 00:00:00,,EPSG,,
+8300,Tokyo to WGS 84 (38),,GSI-Jpn,4301,4326,38,,8700,1998-12-14 00:00:00,,EPSG,,
+8301,Tokyo to WGS 84 (39),,GSI-Jpn,4301,4326,39,,8701,1998-12-14 00:00:00,,EPSG,,
+8302,Tokyo to WGS 84 (40),,GSI-Jpn,4301,4326,40,,8702,1998-12-14 00:00:00,,EPSG,,
+8303,Tokyo to WGS 84 (41),,GSI-Jpn,4301,4326,41,,8703,1998-12-14 00:00:00,,EPSG,,
+8304,Tokyo to WGS 84 (42),,GSI-Jpn,4301,4326,42,,8704,1998-12-14 00:00:00,,EPSG,,
+8305,Tokyo to WGS 84 (43),,GSI-Jpn,4301,4326,43,,8705,1998-12-14 00:00:00,,EPSG,,
+8306,Tokyo to WGS 84 (44),,GSI-Jpn,4301,4326,44,,8706,1998-12-14 00:00:00,,EPSG,,
+8307,Tokyo to WGS 84 (45),,GSI-Jpn,4301,4326,45,,8707,1998-12-14 00:00:00,,EPSG,,
+8308,Tokyo to WGS 84 (46),,GSI-Jpn,4301,4326,46,,8708,1998-12-14 00:00:00,,EPSG,,
+8309,Tokyo to WGS 84 (47),,GSI-Jpn,4301,4326,47,,8709,1998-12-14 00:00:00,,EPSG,,
+8310,Tokyo to WGS 84 (48),,GSI-Jpn,4301,4326,48,,8710,1998-12-14 00:00:00,,EPSG,,
+8311,Tokyo to WGS 84 (49),,GSI-Jpn,4301,4326,49,,8711,1998-12-14 00:00:00,,EPSG,,
+8312,Tokyo to WGS 84 (50),,GSI-Jpn,4301,4326,50,,8712,1998-12-14 00:00:00,,EPSG,,
+8313,Tokyo to WGS 84 (51),,GSI-Jpn,4301,4326,51,,8713,1998-12-14 00:00:00,,EPSG,,
+8314,Tokyo to WGS 84 (52),,GSI-Jpn,4301,4326,52,,8714,1998-12-14 00:00:00,,EPSG,,
+8315,Tokyo to WGS 84 (53),,GSI-Jpn,4301,4326,53,,8715,1998-12-14 00:00:00,,EPSG,,
+8316,Tokyo to WGS 84 (54),,GSI-Jpn,4301,4326,54,,8716,1998-12-14 00:00:00,,EPSG,,
+8317,Tokyo to WGS 84 (55),,GSI-Jpn,4301,4326,55,,8717,1998-12-14 00:00:00,,EPSG,,
+8318,Tokyo to WGS 84 (56),,GSI-Jpn,4301,4326,56,,8718,1998-12-14 00:00:00,,EPSG,,
+8319,Tokyo to WGS 84 (57),,GSI-Jpn,4301,4326,57,,8719,1998-12-14 00:00:00,,EPSG,,
+8320,Tokyo to WGS 84 (58),,GSI-Jpn,4301,4326,58,,8720,1998-12-14 00:00:00,,EPSG,,
+8321,Tokyo to WGS 84 (59),,GSI-Jpn,4301,4326,59,,8721,1998-12-14 00:00:00,,EPSG,,
+8322,Tokyo to WGS 84 (60),,GSI-Jpn,4301,4326,60,,8722,1998-12-14 00:00:00,,EPSG,,
+8323,Tokyo to WGS 84 (61),,GSI-Jpn,4301,4326,61,,8723,1998-12-14 00:00:00,,EPSG,,
+8324,Tokyo to WGS 84 (62),,GSI-Jpn,4301,4326,62,,8724,1998-12-14 00:00:00,,EPSG,,
+8325,Tokyo to WGS 84 (63),,GSI-Jpn,4301,4326,63,,8725,1998-12-14 00:00:00,,EPSG,,
+8326,Tokyo to WGS 84 (64),,GSI-Jpn,4301,4326,64,,8726,1998-12-14 00:00:00,,EPSG,,
+8327,Tokyo to WGS 84 (65),,GSI-Jpn,4301,4326,65,,8727,1998-12-14 00:00:00,,EPSG,,
+8328,Tokyo to WGS 84 (66),,GSI-Jpn,4301,4326,66,,8728,1998-12-14 00:00:00,,EPSG,,
+8329,Tokyo to WGS 84 (67),,GSI-Jpn,4301,4326,67,,8729,1998-12-14 00:00:00,,EPSG,,
+8330,Tokyo to WGS 84 (68),,GSI-Jpn,4301,4326,68,,8730,1998-12-14 00:00:00,,EPSG,,
+8331,Tokyo to WGS 84 (69),,GSI-Jpn,4301,4326,69,,8731,1998-12-14 00:00:00,,EPSG,,
+8332,Tokyo to WGS 84 (70),,GSI-Jpn,4301,4326,70,,8732,1998-12-14 00:00:00,,EPSG,,
+8333,Tokyo to WGS 84 (71),,GSI-Jpn,4301,4326,71,,8733,1998-12-14 00:00:00,,EPSG,,
+8334,Tokyo to WGS 84 (72),,GSI-Jpn,4301,4326,72,,8734,1998-12-14 00:00:00,,EPSG,,
+8335,Tokyo to WGS 84 (73),,GSI-Jpn,4301,4326,73,,8735,1998-12-14 00:00:00,,EPSG,,
+8336,Tokyo to WGS 84 (74),,GSI-Jpn,4301,4326,74,,8736,1998-12-14 00:00:00,,EPSG,,
+8337,Tokyo to WGS 84 (75),,GSI-Jpn,4301,4326,75,,8737,1998-12-14 00:00:00,,EPSG,,
+8338,Tokyo to WGS 84 (76),,GSI-Jpn,4301,4326,76,,8738,1998-12-14 00:00:00,,EPSG,,
+8339,Tokyo to WGS 84 (77),,GSI-Jpn,4301,4326,77,,8739,1998-12-14 00:00:00,,EPSG,,
+8340,Tokyo to WGS 84 (78),,GSI-Jpn,4301,4326,78,,8740,1998-12-14 00:00:00,,EPSG,,
+8341,Tokyo to WGS 84 (79),,GSI-Jpn,4301,4326,79,,8741,1998-12-14 00:00:00,,EPSG,,
+8342,Tokyo to WGS 84 (80),,GSI-Jpn,4301,4326,80,,8742,1998-12-14 00:00:00,,EPSG,,
+8343,Tokyo to WGS 84 (81),,GSI-Jpn,4301,4326,81,,8743,1998-12-14 00:00:00,,EPSG,,
+8344,Tokyo to WGS 84 (82),,GSI-Jpn,4301,4326,82,,8744,1998-12-14 00:00:00,,EPSG,,
+8345,Tokyo to WGS 84 (83),,GSI-Jpn,4301,4326,83,,8745,1998-12-14 00:00:00,,EPSG,,
+8346,Tokyo to WGS 84 (84),,GSI-Jpn,4301,4326,84,,8746,1998-12-14 00:00:00,,EPSG,,
+8347,Tokyo to WGS 84 (85),,GSI-Jpn,4301,4326,85,,8747,1998-12-14 00:00:00,,EPSG,,
+8348,Tokyo to WGS 84 (86),,GSI-Jpn,4301,4326,86,,8748,1998-12-14 00:00:00,,EPSG,,
+8349,Tokyo to WGS 84 (87),,GSI-Jpn,4301,4326,87,,8749,1998-12-14 00:00:00,,EPSG,,
+8350,Tokyo to WGS 84 (88),,GSI-Jpn,4301,4326,88,,8750,1998-12-14 00:00:00,,EPSG,,
+8351,Tokyo to WGS 84 (89),,GSI-Jpn,4301,4326,89,,8751,1998-12-14 00:00:00,,EPSG,,
+8352,Tokyo to WGS 84 (90),,GSI-Jpn,4301,4326,90,,8752,1998-12-14 00:00:00,,EPSG,,
+8353,Tokyo to WGS 84 (91),,GSI-Jpn,4301,4326,91,,8753,1998-12-14 00:00:00,,EPSG,,
+8354,Tokyo to WGS 84 (92),,GSI-Jpn,4301,4326,92,,8754,1998-12-14 00:00:00,,EPSG,,
+8355,Tokyo to WGS 84 (93),,GSI-Jpn,4301,4326,93,,8755,1998-12-14 00:00:00,,EPSG,,
+8356,Tokyo to WGS 84 (94),,GSI-Jpn,4301,4326,94,,8756,1998-12-14 00:00:00,,EPSG,,
+8357,Tokyo to WGS 84 (95),,GSI-Jpn,4301,4326,95,,8757,1998-12-14 00:00:00,,EPSG,,
+8358,Tokyo to WGS 84 (96),,GSI-Jpn,4301,4326,96,,8758,1998-12-14 00:00:00,,EPSG,,
+8359,Tokyo to WGS 84 (97),,GSI-Jpn,4301,4326,97,,8759,1998-12-14 00:00:00,,EPSG,,
+8360,Tokyo to WGS 84 (98),,GSI-Jpn,4301,4326,98,,8760,1998-12-14 00:00:00,,EPSG,,
+8361,Tokyo to WGS 84 (99),,GSI-Jpn,4301,4326,99,,8761,1998-12-14 00:00:00,,EPSG,,
+8362,Tokyo to WGS 84 (100),,GSI-Jpn 324132,4301,4326,100,,8762,1998-12-14 00:00:00,,EPSG,,
+8363,Tokyo to WGS 84 (101),,GSI-Jpn 324133,4301,4326,101,,8763,1998-12-14 00:00:00,,EPSG,,
+8364,Tokyo to WGS 84 (102),,GSI-Jpn 324134,4301,4326,102,,8764,1998-12-14 00:00:00,,EPSG,,
+8365,Tokyo to WGS 84 (103),,GSI-Jpn 320130,4301,4326,103,,8765,1998-12-14 00:00:00,,EPSG,,
+8366,Tokyo to WGS 84 (104),,GSI-Jpn 320131,4301,4326,104,,8766,1998-12-14 00:00:00,,EPSG,,
+8367,Tokyo to WGS 84 (105),,GSI-Jpn 320132,4301,4326,105,,8767,1998-12-14 00:00:00,,EPSG,,
+8368,Tokyo to WGS 84 (106),,GSI-Jpn 312130,4301,4326,106,,8768,1998-12-14 00:00:00,,EPSG,,
+8369,Tokyo to WGS 84 (107),,GSI-Jpn 312131,4301,4326,107,,8769,1998-12-14 00:00:00,,EPSG,,
+8370,Fahud to WGS 84 (2),,PDO-Omn,4232,4326,2,,8770,1999-04-22 00:00:00,,EPSG,,
+8371,PSD93 to WGS 84 (1),,PDO-Omn,4134,4326,1,,8771,1999-04-22 00:00:00,,EPSG,,
+8372,ED50 to WGS 84 (19),,HEL-Grc,4230,4326,19,,8772,1999-04-22 00:00:00,,EPSG,,
+8373,Antigua 1943 to WGS 84 (1),,DOS-Atg Ant,4601,4326,1,,8773,1999-04-22 00:00:00,,EPSG,,
+8374,Dominica 1945 to WGS 84 (1),,DOS-Dma,4602,4326,1,,8774,1999-04-22 00:00:00,,EPSG,,
+8375,Grenada 1953 to WGS 84 (1),,DOS-Grd,4603,4326,1,,8775,1999-04-22 00:00:00,,EPSG,,
+8376,Montserrat 1958 to WGS 84 (1),,DOS-Msr,4604,4326,1,,8776,1999-04-22 00:00:00,,EPSG,,
+8377,St. Kitts 1955 to WGS 84 (1),,DOS-Kna,4605,4326,1,,8777,1999-04-22 00:00:00,,EPSG,,
+8378,St. Lucia 1955 to WGS 84 (1),,DOS-Lca,4606,4326,1,,8778,1999-04-22 00:00:00,,EPSG,,
+8379,Anguilla 1957 to WGS 84 (1),,DOS-Aia,4600,4326,1,,8779,1999-04-22 00:00:00,,EPSG,,
+8380,RT90 to ETRF89 (1),,NLS-Swe,4124,4258,1,,8780,1999-04-22 00:00:00,,EPSG,,
+8384,ED50 to WGS 84 (20),,NMA-Nor 6265W,4230,4326,20,,8784,1999-04-22 00:00:00,,EPSG,,
+8385,Old Hawaiian to NAD83 (1),,NGS-Usa Hi,4135,4269,1,,8785,1999-05-24 00:00:00,,EPSG,,
+8386,Old Hawaiian to WGS 84 (1),,EPSG-US Hi,4135,4326,1,United States - Hawaii,8786,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8387,St. Lawrence Island to NAD83 (1),,NGS-Usa AK StL,4136,4269,1,,8787,1999-05-24 00:00:00,,EPSG,,
+8388,St. Lawrence Island to WGS 84 (1),,EPSG-US StL,4136,4326,1,United States - Alaska - St. Lawrence Island.,8788,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8389,St. Paul Island to NAD83 (1),,NGS-Usa AK StP,4137,4269,1,,8789,1999-05-24 00:00:00,,EPSG,,
+8390,St. Paul Island to WGS 84 (1),,EPSG-US StP,4137,4326,1,United States - Alaska - St. Paul Island.,8790,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8391,St. George Island to NAD83 (1),,NGS-Usa AK StG,4138,4269,1,,8791,1999-05-24 00:00:00,,EPSG,,
+8392,St. George Island to WGS 84 (1),,EPSG-USA StG,4138,4326,1,United States - Alaska - St. George Island.,8792,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8393,NAD27(CGQ77)  to NAD83 (1),,SGQ-Can QC,4609,4269,1,,8793,1999-05-24 00:00:00,,EPSG,,
+8394,NAD27(CGQ77) to WGS 84 (1),,EPSG-Can Qc,4609,4326,1,Canada - Quebec,8794,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8395,AGD66 to GDA94 (2),,Auslig-ACT 1m,4202,4283,2,,8795,1999-05-24 00:00:00,,EPSG,,
+8396,AGD66 to WGS 84 (3),,EPSG-Aus ACT 1m,4202,4326,3,Australia - ACT.,8796,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8397,AGD66 to GDA94 (3),,Auslig-Tas 1m,4202,4283,3,,8797,1999-05-24 00:00:00,,EPSG,,
+8398,AGD66 to WGS 84 (4),,EPSG-Aus Tas 1m,4202,4326,4,Australia - Tasmania.,8798,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8399,AGD66 to GDA94 (4),,Auslig-NSW Vic,4202,4283,4,,8799,1999-05-24 00:00:00,,EPSG,,
+8400,AGD66 to WGS 84 (5),,EPSG-Aus NSW Vic 1m,4202,4326,5,Australia - New South Wales (NSW) and Victoria.,8800,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8401,Puerto Rico to NAD83 (1),,NGS-PRVI,4139,4269,1,,8801,1999-05-24 00:00:00,,EPSG,,
+8402,Puerto Rico to WGS 84 (1),,EPSG-PRVI,4139,4326,1,Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).,8802,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8403,NAD27 to NAD83 (5),,SGQ-Can QC,4267,4269,5,,8803,1999-05-24 00:00:00,,EPSG,,
+8404,NAD27 to WGS 84 (27),,EPSG-Can QC,4267,4326,27,Canada - Quebec,8804,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8405,NAD27(76) to NAD83 (1),,SGQ-Can Ont,4608,4269,1,,8805,1999-05-24 00:00:00,,EPSG,,
+8406,NAD27(76) to WGS 84 (1),,EPSG-Can On,4608,4326,1,Canada - Ontario,8806,1999-05-24 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8407,AGD66 to GDA94 (5),,OSG-Aus Vic,4202,4283,5,,8807,1999-05-24 00:00:00,,EPSG,,
+8408,AGD66 to WGS 84 (6),,EPSG-Aus Vic 0.1m,4202,4326,6,Australia - Victoria,8808,1999-05-24 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8411,NGO 1948 (Oslo) to NGO 1948 (1),,NGO-Nor,4817,4273,1,,8811,1999-10-20 00:00:00,,EPSG,,
+8412,NTF (Paris) to NTF (2),,RGS,4807,4275,2,,8812,1999-10-20 00:00:00,,EPSG,,
+8413,Locodjo 1965 to WGS 84 (1),,IGN-Civ,4142,4326,1,,8813,1999-10-20 00:00:00,,EPSG,,
+8414,Abidjan 1987 to WGS 84 (1),,IGN-Civ,4143,4326,1,,8814,1999-10-20 00:00:00,,EPSG,,
+8415,MGI to WGS 84 (2),,BEV-Aut,4312,4326,1,,8815,1999-10-20 00:00:00,,EPSG,,
+8416,ATS 77 to NAD83(CSRS98) (1),,GIC-Can NB,4122,4140,1,,8816,1999-10-20 00:00:00,,EPSG,,
+8417,NAD83(CSRS98) to WGS 84 (1),,EPSG-Can,4140,4326,1,,8817,1999-10-20 00:00:00,,EPSG,,
+8418,ATS 77 to WGS 84 (1),,EPSG-Can NB,4122,4326,1,Canada - New Brunswick,8818,1999-10-20 00:00:00,EPSG,EPSG,For many purposes NAD83(CSRS) can be assumed to be coincident with WGS 84.,
+8419,NAD83 to NAD83(HARN) (1),,NGS-Usa AL,4269,4152,1,,8819,1999-10-20 00:00:00,,EPSG,,
+8420,NAD83 to NAD83(HARN) (2),,NGS-Usa AZ,4269,4152,2,,8820,1999-10-20 00:00:00,,EPSG,,
+8421,NAD83 to NAD83(HARN) (3),,NGS-Usa CA n,4269,4152,3,,8821,1999-10-20 00:00:00,,EPSG,,
+8422,NAD83 to NAD83(HARN) (4),,NGS-Usa CA s,4269,4152,4,,8822,1999-10-20 00:00:00,,EPSG,,
+8423,NAD83 to NAD83(HARN) (5),,NGS-Usa CO,4269,4152,5,,8823,1999-10-20 00:00:00,,EPSG,,
+8424,NAD83 to NAD83(HARN) (6),,NGS-Usa GA,4269,4152,6,,8824,1999-10-20 00:00:00,,EPSG,,
+8425,NAD83 to NAD83(HARN) (7),,NGS-Usa FL,4269,4152,7,,8825,1999-10-20 00:00:00,,EPSG,,
+8426,NAD83 to NAD83(HARN) (8),,NGS-Usa ID MT e,4269,4152,8,,8826,1999-10-20 00:00:00,,EPSG,,
+8427,NAD83 to NAD83(HARN) (9),,NGS-Usa ID MT w,4269,4152,9,,8827,1999-10-20 00:00:00,,EPSG,,
+8428,NAD83 to NAD83(HARN) (10),,NGS-Usa KY,4269,4152,10,,8828,1999-10-20 00:00:00,,EPSG,,
+8429,NAD83 to NAD83(HARN) (11),,NGS-Usa LA,4269,4152,11,,8829,1999-10-20 00:00:00,,EPSG,,
+8430,NAD83 to NAD83(HARN) (12),,NGS-Usa DE MD,4269,4152,12,,8830,1999-10-20 00:00:00,,EPSG,,
+8431,NAD83 to NAD83(HARN) (13),,NGS-Usa ME,4269,4152,13,,8831,1999-10-20 00:00:00,,EPSG,,
+8432,NAD83 to NAD83(HARN) (14),,NGS-Usa MI,4269,4152,14,,8832,1999-10-20 00:00:00,,EPSG,,
+8433,NAD83 to NAD83(HARN) (15),,NGS-Usa MS,4269,4152,15,,8833,1999-10-20 00:00:00,,EPSG,,
+8434,NAD83 to NAD83(HARN) (16),,NGS-Usa NE,4269,4152,16,,8834,1999-10-20 00:00:00,,EPSG,,
+8435,NAD83 to NAD83(HARN) (17),,NGS-US NewEng,4269,4152,17,,8835,1999-10-20 00:00:00,,EPSG,,
+8436,NAD83 to NAD83(HARN) (18),,NGS-Usa NM,4269,4152,18,,8836,1999-10-20 00:00:00,,EPSG,,
+8437,NAD83 to NAD83(HARN) (19),,NGS-Usa NY,4269,4152,19,,8837,1999-10-20 00:00:00,,EPSG,,
+8438,NAD83 to NAD83(HARN) (20),,NGS-Usa ND,4269,4152,20,,8838,1999-10-20 00:00:00,,EPSG,,
+8439,NAD83 to NAD83(HARN) (21),,NGS-Usa OK,4269,4152,21,,8839,1999-10-20 00:00:00,,EPSG,,
+8440,NAD83 to NAD83(HARN) (22),,NGS-PRVI,4269,4152,22,,8840,1999-10-20 00:00:00,,EPSG,,
+8441,NAD83 to NAD83(HARN) (23),,NGS-Usa SD,4269,4152,23,,8841,1999-10-20 00:00:00,,EPSG,,
+8442,NAD83 to NAD83(HARN) (24),,NGS-Usa TN,4269,4152,24,,8842,1999-10-20 00:00:00,,EPSG,,
+8443,NAD83 to NAD83(HARN) (25),,NGS-Usa TX e,4269,4152,25,,8843,1999-10-20 00:00:00,,EPSG,,
+8444,NAD83 to NAD83(HARN) (26),,NGS-Usa TX w,4269,4152,26,,8844,1999-10-20 00:00:00,,EPSG,,
+8445,NAD83 to NAD83(HARN) (27),,NGS-Usa VA,4269,4152,27,,8845,1999-10-20 00:00:00,,EPSG,,
+8446,NAD83 to NAD83(HARN) (28),,NGS-Usa OR WA,4269,4152,28,,8846,1999-10-20 00:00:00,,EPSG,,
+8447,NAD83 to NAD83(HARN) (29),,NGS-Usa WI,4269,4152,29,,8847,1999-10-20 00:00:00,,EPSG,,
+8448,NAD83 to NAD83(HARN) (30),,NGS-Usa WY,4269,4152,30,,8848,1999-10-20 00:00:00,,EPSG,,
+8449,Cape to Hartbeesthoek94 (1),,DSM-Zaf,4222,4148,1,,8849,1999-10-20 00:00:00,,EPSG,,
+8450,Hartbeesthoek94 to WGS 84 (1),,EPSG-Zaf,4148,4326,1,,8850,1999-10-20 00:00:00,,EPSG,For many purposes Hartbeesthoek94 can be assumed to be coincident with WGS 84.,
+8451,AGD66 to GDA94 (6),,Auslig-Tas,4202,4283,6,,8851,1999-10-20 00:00:00,,EPSG,,
+8452,AGD66 to GDA94 (7),,Auslig-NT,4202,4283,7,,8852,1999-10-20 00:00:00,,EPSG,,
+8453,AGD66 to WGS 84 (7),,EPSG-Aus Tas 0.1m,4202,4326,7,Australia - Tasmania.,8853,1999-10-20 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8454,AGD66 to WGS 84 (8),,EPSG-Aus NT 0.1m,4202,4326,8,Australia - Northern Territory.,8854,1999-10-20 00:00:00,,EPSG,For many purposes GDA94 can be assumed to be coincident with WGS 84.,
+8455,CH1903 to WGS 84 (1),,BfL-CH 1,4149,4326,1,,8855,1999-10-20 00:00:00,,EPSG,,
+8456,CH1903+ to CHTRF95 (1),,BfL-CH,4150,4151,1,,8856,1999-10-20 00:00:00,,EPSG,,
+8457,CH1903+ to WGS 84 (1),,EPSG-CH,4150,4326,1,Liechtenstein;  Switzerland.,8857,1999-10-20 00:00:00,EPSG,EPSG,For many purposes CHTRF95 can be assumed to be coincident with WGS 84.,
+8458,CH1903 to WGS 84 (2),,BfL-CH 2,4149,4326,2,,8858,1999-10-20 00:00:00,,EPSG,,
+8459,CHTRF95 to WGS 84 (1),,EPSG-CH,4151,4326,1,,8859,1999-10-20 00:00:00,,EPSG,,
+8460,NAD27 to NAD83(HARN) (1),,NGS-Usa AL,4267,4152,1,United States (USA) - Alabama.,8860,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8461,NAD27 to NAD83(HARN) (2),,NGS-Usa AZ,4267,4152,2,United States (USA) - Arizona.,8861,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8462,NAD27 to NAD83(HARN) (3),,NGS-Usa CA n,4267,4152,3,United States (USA) - California north of 38 deg N.,8862,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8463,NAD27 to NAD83(HARN) (4),,NGS-Usa CA s,4267,4152,4,United States (USA) - California south of 38 deg N.,8863,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8464,NAD27 to NAD83(HARN) (5),,NGS-Usa CO,4267,4152,5,United States (USA) - Colorado.,8864,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8465,NAD27 to NAD83(HARN) (6),,NGS-Usa GA,4267,4152,6,United States (USA) - Georgia.,8865,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8466,NAD27 to NAD83(HARN) (7),,NGS-Usa FL,4267,4152,7,United States (USA) - Florida.,8866,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8467,NAD27 to NAD83(HARN) (8),,NGS-Usa ID MT e,4267,4152,8,United States (USA) - Idaho and Montana - east of 113 deg W.,8867,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8468,NAD27 to NAD83(HARN) (9),,NGS-Usa ID MT w,4267,4152,9,United States (USA) - Idaho and Montana - west of 113 deg W.,8868,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8469,NAD27 to NAD83(HARN) (10),,NGS-Usa KY,4267,4152,10,United States (USA) - Kentucky.,8869,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8470,NAD27 to NAD83(HARN) (11),,NGS-Usa LA,4267,4152,11,United States (USA) - Louisiana.,8870,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8471,NAD27 to NAD83(HARN) (12),,NGS-Usa DE MD,4267,4152,12,United States (USA) - Delaware and Maryland.,8871,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8472,NAD27 to NAD83(HARN) (13),,NGS-Usa ME,4267,4152,13,United States (USA) - Maine.,8872,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8473,NAD27 to NAD83(HARN) (14),,NGS-Usa MI,4267,4152,14,United States (USA) - Michigan.,8873,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8474,NAD27 to NAD83(HARN) (15),,NGS-Usa MS,4267,4152,15,United States (USA) - Mississippi.,8874,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8475,NAD27 to NAD83(HARN) (16),,NGS-Usa NE,4267,4152,16,United States (USA) - Nebraska.,8875,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8476,NAD27 to NAD83(HARN) (17),,NGS-US NewEng,4267,4152,18,United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.,8876,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8477,NAD27 to NAD83(HARN) (18),,NGS-Usa NM,4267,4152,18,United States (USA) - New Mexico.,8877,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8478,NAD27 to NAD83(HARN) (19),,NGS-Usa NY,4267,4152,19,United States (USA) - New York.,8878,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8479,NAD27 to NAD83(HARN) (20),,NGS-Usa ND,4267,4152,20,United States (USA) - North Dakota.,8879,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8480,NAD27 to NAD83(HARN) (21),,NGS-Usa OK,4267,4152,21,United States (USA) - Oklahoma.,8880,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8481,Puerto Rico to NAD83(HARN) (1),,NGS-PRVI,4139,4152,1,United States (USA) - Puerto Rico and the Virgin Islands.,8881,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8482,NAD27 to NAD83(HARN) (22),,NGS-Usa SD,4267,4152,22,United States (USA) - South Dakota.,8882,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8483,NAD27 to NAD83(HARN) (23),,NGS-Usa TN,4267,4152,23,United States (USA) - Tennessee,8883,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8484,NAD27 to NAD83(HARN) (24),,NGS-Usa TX e,4267,4152,24,United States (USA) - Texas east of 100deg West.,8884,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8485,NAD27 to NAD83(HARN) (25),,NGS-Usa TX w,4267,4152,25,United States (USA) - Texas west of 100deg West.,8885,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8486,NAD27 to NAD83(HARN) (26),,NGS-Usa VA,4267,4152,26,United States (USA) - Virginia.,8886,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8487,NAD27 to NAD83(HARN) (27),,NGS-Usa OR WA,4267,4152,27,United States (USA) - Oregan; Washington.,8887,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8488,NAD27 to NAD83(HARN) (28),,NGS-Usa WI,4267,4152,28,United States (USA) - Wisconsin.,8888,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8489,NAD27 to NAD83(HARN) (29),,NGS-Usa WY,4267,4152,29,United States (USA) - Wyoming.,8889,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,,
+8490,Rassadiran to WGS 84 (1),,TOT-Taheri,4153,4326,1,Iran - Taheri refinery site.,8890,1999-10-20 00:00:00,Total-Fina,EPSG,,
+8491,FD58 to WGS 84 (1),,TOT-Kangan,4132,4326,1,Iran - Kangan district,8891,1999-10-20 00:00:00,Total-Fina,EPSG,,
+8492,ED50(ED77) to WGS 84 (1),,NCCI-Irn,4154,4326,1,Iran,8892,1999-10-20 00:00:00,National Cartographic Centre of Iran,EPSG,,
+8493,NAD83 to WGS 84 (4),,NGS-Usa,4269,4326,4,United States (USA).,8893,1999-11-05 00:00:00,,EPSG,,
+8494,NAD83 to WGS 84 (5),,NGS-Usa,4269,4326,5,United States (USA).,8894,1999-11-05 00:00:00,,EPSG,,
+8495,La Canoa to WGS 84 (1),,LAG-Ven E,4247,4326,1,,8895,1999-11-05 00:00:00,,EPSG,,
+8496,NAD27 to WGS 84 (28),,NGS-Usa conus,4267,4326,28,United States (USA) - lower 48 states including EEZ.,8896,1999-10-20 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
+8497,NAD27 to WGS 84 (29),,NGS-Usa AK,4267,4326,29,United States (USA) - Alaska including EEZ.,8897,1999-10-20 00:00:00,,EPSG,For many purposes NAD83 can be assumed to be coincident with WGS 84.,
diff --git a/src/tiff/csv/horiz_cs.c b/src/tiff/csv/horiz_cs.c
new file mode 100644
index 0000000..4096f60
--- /dev/null
+++ b/src/tiff/csv/horiz_cs.c
@@ -0,0 +1,1496 @@
+#include "defs.h"
+datafile_rows_t horiz_cs_row_1[] = {"HORIZCS_CODE","HORIZCS_EPSG_NAME","HORIZCS_EPSG_ABBR","HORIZCS_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_SYS_TYPE","GEOD_DATUM_CODE","PRIME_MERIDIAN_CODE","ORIENT_POSITIVE_AXIS_1","ORIENT_POSITIVE_AXIS_2","COORD_SYS_AXIS_1_ABBR","COORD_SYS_AXIS_2_ABBR","UOM_LENGTH_CODE","UOM_ANGLE_CODE","SOURCE_GEOGCS_CODE","PROJECTION_TRF_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t horiz_cs_row_2[] = {"200","Anguilla 1957 / British West Indies Grid","Anguilla 1957 / BWI Grid","","","Anguilla","projected 2D","","","East","North","E","N","9001","","4600","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_3[] = {"201","Antigua 1943 / British West Indies Grid","Antigua 1943 / BWI Grid","","","Antigua and Barbuda - Antigua","projected 2D","","","East","North","E","N","9001","","4601","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_4[] = {"202","Dominica 1945 / British West Indies Grid","Dominica 1945 / BWI Grid","","","Dominica","projected 2D","","","East","North","E","N","9001","","4602","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_5[] = {"203","Grenada 1953 / British West Indies Grid","Grenada 1953 / BWI Grid","","","Grenada (including Grenada Grenadines)","projected 2D","","","East","North","E","N","9001","","4603","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_6[] = {"204","Montserrat 58 / British West Indies Grid","Montserrat 58 / BWI Grid","","","Montserrat","projected 2D","","","East","North","E","N","9001","","4604","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_7[] = {"205","St Kitts 1955 / British West Indies Grid","St Kitts 1955 / BWI Grid","","","Saint Kitts and Nevis","projected 2D","","","East","North","E","N","9001","","4605","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_8[] = {"206","St Lucia 1955 / British West Indies Grid","St Lucia 1955 / BWI Grid","","","Saint Lucia","projected 2D","","","East","North","E","N","9001","","4606","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_9[] = {"207","St Vincent 45 / British West Indies Grid","St Vincent 45 / BWI Grid","","","Saint Vincent and the Grenadines","projected 2D","","","East","North","E","N","9001","","4607","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_10[] = {"208","NAD27(CGQ77) / SCoPQ zone 2","CGQ77 / SCoPQ zone 2","","","Canada - Quebec - east of 57 deg East.","projected 2D","","","East","North","X","Y","9001","","4609","17700","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_11[] = {"209","NAD27(CGQ77) / SCoPQ zone 3","CGQ77 / SCoPQ zone 3","","","Canada - Quebec between 60 deg and 57 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17703","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_12[] = {"210","NAD27(CGQ77) / SCoPQ zone 4","CGQ77 / SCoPQ zone 4","","","Canada - Quebec between 63 deg and 60 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17704","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_13[] = {"211","NAD27(CGQ77) / SCoPQ zone 5","CGQ77 / SCoPQ zone 5","","","Canada - Quebec between 66 deg and 63 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17705","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_14[] = {"212","NAD27(CGQ77) / SCoPQ zone 6","CGQ77 / SCoPQ zone 6","","","Canada - Quebec between 69 deg and  66 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17706","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_15[] = {"213","NAD27(CGQ77) / SCoPQ zone 7","CGQ77 / SCoPQ zone 7","","","Canada - Quebec between 72 deg and 69 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17707","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_16[] = {"214","NAD27(CGQ77) / SCoPQ zone 8","CGQ77 / SCoPQ zone 8","","","Canada - Quebec between 75 deg and 72 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17708","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_17[] = {"215","NAD27(CGQ77) / SCoPQ zone 9","CGQ77 / SCoPQ zone 9","","","Canada - Quebec between 78 deg and 75 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17709","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_18[] = {"216","NAD27(CGQ77) / SCoPQ zone 10","CGQ77 / SCoPQ zone 10","","","Canada - Quebec west of 78 deg West.","projected 2D","","","East","North","X","Y","9001","","4609","17710","1999-07-24 00:00:00","Geodetic Service of Quebec; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_19[] = {"217","NAD27(76) / MTM zone 8","","","","Canada - Ontario - east of 75 deg West.","projected 2D","","","East","North","X","Y","9001","","4608","17708","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_20[] = {"218","NAD27(76) / MTM zone 9","","","","Canada - Ontario - between 78 deg and 75 deg West.","projected 2D","","","East","North","X","Y","9001","","4608","17709","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_21[] = {"219","NAD27(76) / MTM zone 10","","","","Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.","projected 2D","","","East","North","X","Y","9001","","4608","17710","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_22[] = {"220","NAD27(76) / MTM zone 11","","","","Canada - Ontario - south of 46 deg N and west of 81 deg West.","projected 2D","","","East","North","E","N","9001","","4608","17711","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_23[] = {"221","NAD27(76) / MTM zone 12","","","","Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.","projected 2D","","","East","North","E","N","9001","","4608","17712","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_24[] = {"222","NAD27(76) / MTM zone 13","","","","Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.","projected 2D","","","East","North","E","N","9001","","4608","17713","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_25[] = {"223","NAD27(76) / MTM zone 14","","","","Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17714","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_26[] = {"224","NAD27(76) / MTM zone 15","","","","Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17715","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_27[] = {"225","NAD27(76) / MTM zone 16","","","","Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17716","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_28[] = {"226","NAD27(76) / MTM zone 17","","","","Canada - Ontario - west of 94 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4608","17717","1999-07-24 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_29[] = {"227","NAD27(76) / UTM zone 15N","","","","Canada - Ontario - 96deg West  to 90deg West.","projected 2D","","","East","North","E","N","9001","","4608","16015","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 15N (code 26715).","",NULL};
+datafile_rows_t horiz_cs_row_30[] = {"228","NAD27(76) / UTM zone 16N","","","","Canada - Ontario - 90deg West  to 84deg West.","projected 2D","","","East","North","E","N","9001","","4608","16016","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 16N (code 26716).","",NULL};
+datafile_rows_t horiz_cs_row_31[] = {"229","NAD27(76) / UTM zone 17N","","","","Canada - Ontario - 84deg West  to 78deg West.","projected 2D","","","East","North","E","N","9001","","4608","16017","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 17N (code 26717).","",NULL};
+datafile_rows_t horiz_cs_row_32[] = {"230","NAD27(76) / UTM zone 18N","","","","Canada - Ontario - east of 78 deg West.","projected 2D","","","East","North","E","N","9001","","4608","16018","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 18N (code 26718).","",NULL};
+datafile_rows_t horiz_cs_row_33[] = {"231","NAD27(CGQ77) / UTM zone 17N","CGQ77 / UTM zone 17N","","","Canada - Quebec - west of 78 deg West.","projected 2D","","","East","North","E","N","9001","","4609","16017","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 17N (code 26717).","",NULL};
+datafile_rows_t horiz_cs_row_34[] = {"232","NAD27(CGQ77) / UTM zone 18N","CGQ77 / UTM zone 18N","","","Canada - Quebec -78deg West  to 72deg West.","projected 2D","","","East","North","E","N","9001","","4609","16018","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 18N (code 26718).","",NULL};
+datafile_rows_t horiz_cs_row_35[] = {"233","NAD27(CGQ77) / UTM zone 19N","CGQ77 / UTM zone 19N","","","Canada - Quebec - 72deg West  to 66deg West.","projected 2D","","","East","North","E","N","9001","","4609","16019","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 19N (code 26719).","",NULL};
+datafile_rows_t horiz_cs_row_36[] = {"234","NAD27(CGQ77) / UTM zone 20N","CGQ77 / UTM zone 20N","","","Canada - Quebec - 66deg West  to 60deg West.","projected 2D","","","East","North","E","N","9001","","4609","16020","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 20N (code 26720).","",NULL};
+datafile_rows_t horiz_cs_row_37[] = {"235","NAD27(CGQ77) / UTM zone 21N","CGQ77 / UTM zone 21N","","","Canada - Quebec - east of 60deg West.","projected 2D","","","East","North","E","N","9001","","4609","16021","1999-07-24 00:00:00","","EPSG","Supersedes NAD27 / UTM zone 21N (code 26721).","",NULL};
+datafile_rows_t horiz_cs_row_38[] = {"236","NAD83(CSRS98) / New Brunswick Stereo","NAD83(98) / NB Stereo","","","Canada - New Brunswick","projected 2D","","","North","East","N","E","9001","","4140","19946","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","In use from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_39[] = {"237","NAD83(CSRS98) / UTM zone 19N","NAD83(98) / UTM 19N","","","Canada - New Brunswick west of 66 deg West.","projected 2D","","","East","North","E","N","9001","","4140","16019","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","In use from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_40[] = {"238","NAD83(CSRS98) / UTM zone 20N","NAD83(98) / UTM 20N","","","Canada - New Brunswick east of 66 deg West.","projected 2D","","","East","North","E","N","9001","","4140","16020","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","In use from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_41[] = {"239","Israel / Israeli TM Grid","Israeli TM Grid","","","Israel.","projected 2D","","","East","North","E","N","9001","","4141","18204","1999-10-20 00:00:00","Survey of Israel.","EPSG","Supercedes Israeli CS Grid (EPSG code 28193).","",NULL};
+datafile_rows_t horiz_cs_row_42[] = {"240","Locodjo 1965 / UTM zone 30N","Locodjo 65 / UTM 30N","","","Cote D'Ivoire (Ivory Coast) east of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4142","16030","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded by Abidjan 87 / UTM 30N (EPSG code 241).","",NULL};
+datafile_rows_t horiz_cs_row_43[] = {"241","Abidjan 1987 / UTM zone 30N","Abidjan 87 / UTM 30N","","","Cote D'Ivoire (Ivory Coast) east of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4143","16030","1999-10-20 00:00:00","IGN Paris","EPSG","Supersedes Locodjo 65 / UTM 30N (EPSG code 240).","",NULL};
+datafile_rows_t horiz_cs_row_44[] = {"242","Locodjo 1965 / UTM zone 29N","Locodjo 65 / UTM 29N","","","Cote D'Ivoire (Ivory Coast) west of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4142","16029","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded by Abidjan 87 / UTM 29N (EPSG code 243).","",NULL};
+datafile_rows_t horiz_cs_row_45[] = {"243","Abidjan 1987 / UTM zone 29N","Abidjan 87 / UTM 29N","","","Cote D'Ivoire (Ivory Coast) west of 6 deg West.","projected 2D","","","East","North","E","N","9001","","4143","16029","1999-10-20 00:00:00","IGN Paris","EPSG","Supersedes Locodjo 65 / UTM 29N (EPSG code 242).","",NULL};
+datafile_rows_t horiz_cs_row_46[] = {"244","Hanoi 1972 / Gauss-Kruger zone 18","Hanoi 72 / Gauss zone 18","","","Vietnam - west of 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4147","16218","1999-10-20 00:00:00","","EPSG","Replaces use of Indian 1960 / UTM zone 48 after 1988.","",NULL};
+datafile_rows_t horiz_cs_row_47[] = {"245","Hanoi 1972 / Gauss-Kruger zone 19","Hanoi 72 / Gauss zone 19","","","Vietnam - east of 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4147","16219","1999-10-20 00:00:00","","EPSG","Replaces use of Indian 1960 / UTM zone 48 after 1988.","",NULL};
+datafile_rows_t horiz_cs_row_48[] = {"246","Hartbeesthoek94 / Lo15","New S African CS zone 15","","","South Africa - Walvis Bay.","projected 2D","","","West","South","W","S","9001","","4148","17515","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_49[] = {"247","Hartbeesthoek94 / Lo17","New S African CS zone 17","","","South Africa - west of 18 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17517","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_50[] = {"248","Hartbeesthoek94 / Lo19","New S African CS zone 19","","","South Africa - 18 to 20 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17519","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_51[] = {"249","Hartbeesthoek94 / Lo21","New S African CS zone 21","","","South Africa - 20 to 22 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17521","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_52[] = {"250","Hartbeesthoek94 / Lo23","New S African CS zone 23","","","South Africa - 22 to 24 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17523","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_53[] = {"251","Hartbeesthoek94 / Lo25","New S African CS zone 25","","","Lestho  - west of 26 deg East; South Africa - 24 to 26 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17525","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_54[] = {"252","Hartbeesthoek94 / Lo27","New S African CS zone 27","","","Lestho  - east of 26 deg East;  South Africa - 26 to 28 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17527","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_55[] = {"253","Hartbeesthoek94 / Lo29","New S African CS zone 29","","","South Africa - 28 to 30 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17529","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_56[] = {"254","Hartbeesthoek94 / Lo31","New S African CS zone 31","","","South Africa - 30 to 32 deg East;  Swaziland.","projected 2D","","","West","South","W","S","9001","","4148","17533","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_57[] = {"255","Hartbeesthoek94 / Lo33","New S African CS zone 33","","","South Africa - east of 32 deg East.","projected 2D","","","West","South","W","S","9001","","4148","17533","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_58[] = {"256","CH1903+ / LV95","LV95","","","Liechtenstein; Switzerland.","projected 2D","","","East","North","Y","X","9001","","4150","19950","1999-10-20 00:00:00","","EPSG","Supersedes CH1903/LV03 (code 21781).","",NULL};
+datafile_rows_t horiz_cs_row_59[] = {"257","Rassadiran / Nakhl e Taqi","","","","Iran - Taheri refinery site only.","projected 2D","","","East","North","E","N","9001","","4153","19951","1999-10-20 00:00:00","Total-Fina","EPSG","Used for terminal site only.","",NULL};
+datafile_rows_t horiz_cs_row_60[] = {"258","ED50(ED77) / UTM zone 38N","","","","Iran - west of 48deg East.","projected 2D","","","East","North","E","N","9001","","4154","16038","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_61[] = {"259","ED50(ED77) / UTM zone 39N","","","","Iran - 48deg to 54 deg East.","projected 2D","","","East","North","E","N","9001","","4154","16039","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_62[] = {"260","ED50(ED77) / UTM zone 40N","","","","Iran - 54deg to 60 deg East.","projected 2D","","","East","North","E","N","9001","","4154","16040","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_63[] = {"261","ED50(ED77) / UTM zone 41N","","","","Iran - east of 60deg East.","projected 2D","","","East","North","E","N","9001","","4154","16041","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_64[] = {"300","Madrid 1870 (Madrid) / Spain","","","","Spain","projected 2D","","","East","North","X","Y","9001","","4903","19921","1998-11-11 00:00:00","","EPSG","Superseded by ED50 / UTM after 1966.","",NULL};
+datafile_rows_t horiz_cs_row_65[] = {"2100","GGRS87 / Greek Grid","","","","Greece","projected 2D","","","East","North","E","N","9001","","4121","19930","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","Oil industry uses ED50 / UTM zone 34N and ED50 / UTM zone 35N.","",NULL};
+datafile_rows_t horiz_cs_row_66[] = {"2200","ATS77 / New Brunswick Stereographic","ATS77 / NB Stereographic","","","Canada - New Brunswick","projected 2D","","","North","East","N","E","9001","","4122","19945","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979.  To be phased out in late 1990's.","99.61",NULL};
+datafile_rows_t horiz_cs_row_67[] = {"2219","ATS77 / UTM zone 19N","","","","Canada - New Brunswick - west of 66 deg W.","projected 2D","","","East","North","E","N","9001","","4122","16019","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_68[] = {"2220","ATS77 / UTM zone 20N","","","","Canada - New Brunswick - east of 66 deg W.; Canada - Nova Scotia; Canada - Prince Edward Island.","projected 2D","","","East","North","E","N","9001","","4122","16020","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_69[] = {"2290","ATS77 / Prince Edward Isl. Stereographic","ATS77 / PEI Stereo","","","Canada - Prince Edward Island","projected 2D","","","East","North","E(X)","N(Y)","9001","","4122","19933","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_70[] = {"2294","ATS77 / MTM Nova Scotia zone 4","ATS77 / MTM NS zone 4","","","Canada - Nova Scotia - east of 63 deg West.","projected 2D","","","East","North","E","N","9001","","4122","17794","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_71[] = {"2295","ATS77 / MTM Nova Scotia zone 5","ATS77 / MTM NS zone 5","","","Canada - Nova Scotia - west of 63 deg West.","projected 2D","","","East","North","E","N","9001","","4122","17795","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_72[] = {"2391","KKJ / Finland zone 1","","","","Finland - west of 22deg 30min E.","projected 2D","","","North","East","X","Y","9001","","4123","18191","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_73[] = {"2392","KKJ / Finland zone 2","","","","Finland - 22deg 30 min to 25deg 30min E.","projected 2D","","","North","East","X","Y","9001","","4123","18192","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_74[] = {"2393","KKJ / Finland Uniform Coordinate System","KKJ / Finland zone 3","","","Finland; Finland - 25 deg 30min E to 28deg 30min E.","projected 2D","","","North","East","X","Y","9001","","4123","18193","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","Known as Uniform Coordinate System when used over all country and also as Basic Coordinate System zone 3 at larger scales.","",NULL};
+datafile_rows_t horiz_cs_row_75[] = {"2394","KKJ / Finland zone 4","","","","Finland - east of 28deg 30 min E.","projected 2D","","","North","East","X","Y","9001","","4123","18194","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_76[] = {"2400","RT90 2.5 gon W","","","","Sweden","projected 2D","","","North","East","X","Y","9001","","4124","19929","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_77[] = {"2550","Samboja / UTM zone 50S","","","","Indonesia - east Kalimantan - Mahakam delta area.","projected 2D","","","East","North","E","N","9001","","4125","16150","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_78[] = {"2600","Lietuvos Koordinoei Sistema 1994","LKS94","","","Lithuania","projected 2D","","","North","East","X","Y","9001","","4126","19934","1998-03-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_79[] = {"2736","Tete / UTM zone 36S","","","","Mozambique - west of 36 deg E.","projected 2D","","","East","North","E","N","9001","","4127","16136","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_80[] = {"2737","Tete / UTM zone 37S","","","","Mozambique - east of 36 deg E","projected 2D","","","East","North","E","N","9001","","4127","16137","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_81[] = {"3036","Moznet / UTM zone 36S","","","","Mozambique - west of 36 deg E.","projected 2D","","","East","North","E","N","9001","","4130","16136","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_82[] = {"3037","Moznet / UTM zone 37S","","","","Mozambique - east of 36 deg E","projected 2D","","","East","North","E","N","9001","","4130","16137","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_83[] = {"3148","Indian 1960 / UTM zone 48N","","","","Cambodia; Vietnam west of 108deg East.","projected 2D","","","East","North","E","N","9001","","4131","16048","1998-11-11 00:00:00","","EPSG","In Vietnam superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.","",NULL};
+datafile_rows_t horiz_cs_row_84[] = {"3149","Indian 1960 / UTM zone 49N","","","","Vietnam east of 108deg East.","projected 2D","","","East","North","E","N","9001","","4131","16049","1998-11-11 00:00:00","","EPSG","Superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.","",NULL};
+datafile_rows_t horiz_cs_row_85[] = {"3176","Indian 1960 / TM 106 NE","","","","Vietnam - offshore.","projected 2D","","","East","North","E","N","9001","","4131","16506","1998-11-11 00:00:00","Petrovietnam","EPSG","Used by Petrovietnam for offshore block 15.","",NULL};
+datafile_rows_t horiz_cs_row_86[] = {"3200","FD58 / Iraq zone","","","","Iran - Gulf coast and Arwaz areas.","projected 2D","","","East","North","E","N","9001","","4132","19906","1998-11-11 00:00:00","IOEPC records.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_87[] = {"3300","Estonian Coordinate System of 1992","","","","Estonia.","projected 2D","","","North","East","X","Y","9001","","4133","19938","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Used for 1:20000 and larger scale mapping.","",NULL};
+datafile_rows_t horiz_cs_row_88[] = {"3439","PSD93 / UTM zone 39N","","","","Oman - west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4134","16039","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud / UTM zone 39N projCS (code 23239). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_89[] = {"3440","PSD93 / UTM zone 40N","","","","Oman - east of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4134","16040","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud / UTM zone 40N projCS (code 23240). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_90[] = {"3561","Old Hawaiian / Hawaii zone 1","Old Hawaiian / SP zone 1","","","United States (USA) - Hawaii - island of Hawaii.","projected 2D","","","East","North","X","Y","9003","","4135","15101","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 1.","99.322",NULL};
+datafile_rows_t horiz_cs_row_91[] = {"3562","Old Hawaiian / Hawaii zone 2","Old Hawaiian / SP zone 2","","","United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","projected 2D","","","East","North","X","Y","9003","","4135","15102","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 2.","99.322",NULL};
+datafile_rows_t horiz_cs_row_92[] = {"3563","Old Hawaiian / Hawaii zone 3","Old Hawaiian / SP zone 3","","","United States (USA) - Hawaii - Oahu.","projected 2D","","","East","North","X","Y","9003","","4135","15103","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 3.","99.322",NULL};
+datafile_rows_t horiz_cs_row_93[] = {"3564","Old Hawaiian / Hawaii zone 4","Old Hawaiian / SP zone 4","","","United States (USA) - Hawaii - Kauai.","projected 2D","","","East","North","X","Y","9003","","4135","15104","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 4.","99.322",NULL};
+datafile_rows_t horiz_cs_row_94[] = {"3565","Old Hawaiian / Hawaii zone 5","Old Hawaiian / SP zone 5","","","United States (USA) - Hawaii - Niihau.","projected 2D","","","East","North","X","Y","9003","","4135","15105","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Hawaii zone 5.","99.322",NULL};
+datafile_rows_t horiz_cs_row_95[] = {"3920","Puerto Rico / UTM zone 20N","","","","British Virgin Islands (civilian).","projected 2D","","","East","North","E","N","9001","","4139","16020","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","NAD27 / UTM zone 20 N (code 26720) used for military purposes.","",NULL};
+datafile_rows_t horiz_cs_row_96[] = {"3991","Puerto Rico State Plane CS of 1927","Puerto Rico SPCS 27","","","Puerto Rico.","projected 2D","","","East","North","X","Y","9003","","4139","15201","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / Puerto Rico State Plane CS.","99.323",NULL};
+datafile_rows_t horiz_cs_row_97[] = {"3992","Puerto Rico / St. Croix","","","","US Virgin Islands (U.S.).","projected 2D","","","East","North","X","Y","9003","","4139","15202","1999-05-24 00:00:00","","EPSG","Sometimes erroneously referred to as NAD27 / St. Croix State Plane CS.","99.323",NULL};
+datafile_rows_t horiz_cs_row_98[] = {"4001","Unknown datum based upon ellipsoid 7001","","","","","geographic 2D","6001","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_99[] = {"4002","Unknown datum based upon ellipsoid 7002","","","","","geographic 2D","6002","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_100[] = {"4003","Unknown datum based upon ellipsoid 7003","","","","","geographic 2D","6003","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_101[] = {"4004","Unknown datum based upon ellipsoid 7004","","","","","geographic 2D","6004","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_102[] = {"4005","Unknown datum based upon ellipsoid 7005","","","","","geographic 2D","6005","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_103[] = {"4006","Unknown datum based upon ellipsoid 7006","","","","","geographic 2D","6006","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_104[] = {"4007","Unknown datum based upon ellipsoid 7007","","","","","geographic 2D","6007","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_105[] = {"4008","Unknown datum based upon ellipsoid 7008","","","","","geographic 2D","6008","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_106[] = {"4009","Unknown datum based upon ellipsoid 7009","","","","","geographic 2D","6009","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_107[] = {"4010","Unknown datum based upon ellipsoid 7010","","","","","geographic 2D","6010","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_108[] = {"4011","Unknown datum based upon ellipsoid 7011","","","","","geographic 2D","6011","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_109[] = {"4012","Unknown datum based upon ellipsoid 7012","","","","","geographic 2D","6012","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_110[] = {"4013","Unknown datum based upon ellipsoid 7013","","","","","geographic 2D","6013","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_111[] = {"4014","Unknown datum based upon ellipsoid 7014","","","","","geographic 2D","6014","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_112[] = {"4015","Unknown datum based upon ellipsoid 7015","","","","","geographic 2D","6015","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_113[] = {"4016","Unknown datum based upon ellipsoid 7016","","","","","geographic 2D","6016","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_114[] = {"4017","Unknown datum based upon ellipsoid 7017","","","","","geographic 2D","6017","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_115[] = {"4018","Unknown datum based upon ellipsoid 7018","","","","","geographic 2D","6018","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_116[] = {"4019","Unknown datum based upon ellipsoid 7019","","","","","geographic 2D","6019","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_117[] = {"4020","Unknown datum based upon ellipsoid 7020","","","","","geographic 2D","6020","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_118[] = {"4021","Unknown datum based upon ellipsoid 7021","","","","","geographic 2D","6021","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_119[] = {"4022","Unknown datum based upon ellipsoid 7022","","","","","geographic 2D","6022","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_120[] = {"4024","Unknown datum based upon ellipsoid 7024","","","","","geographic 2D","6024","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_121[] = {"4025","Unknown datum based upon ellipsoid 7025","","","","","geographic 2D","6025","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_122[] = {"4027","Unknown datum based upon ellipsoid 7027","","","","","geographic 2D","6027","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_123[] = {"4028","Unknown datum based upon ellipsoid 7028","","","","","geographic 2D","6028","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_124[] = {"4029","Unknown datum based upon ellipsoid 7029","","","","","geographic 2D","6029","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_125[] = {"4030","Unknown datum based upon ellipsoid 7030","","","","","geographic 2D","6030","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_126[] = {"4031","Unknown datum based upon ellipsoid 7031","","","","","geographic 2D","6031","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_127[] = {"4032","Unknown datum based upon ellipsoid 7032","","","","","geographic 2D","6032","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_128[] = {"4033","Unknown datum based upon ellipsoid 7033","","","","","geographic 2D","6033","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_129[] = {"4034","Unknown datum based upon ellipsoid 7034","","","","","geographic 2D","6034","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_130[] = {"4035","Unknown datum based upon ellipsoid 7035","","","","","geographic 2D","6035","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","96.08",NULL};
+datafile_rows_t horiz_cs_row_131[] = {"4036","Unknown datum based upon ellipsoid 7036","","","","","geographic 2D","6036","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_132[] = {"4041","Unknown datum based upon ellipsoid 7041","","","","","geographic 2D","6041","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_133[] = {"4042","Unknown datum based upon ellipsoid 7042","","","","","geographic 2D","6042","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_134[] = {"4043","Unknown datum based upon ellipsoid 7043","","","","","geographic 2D","6043","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_135[] = {"4044","Unknown datum based upon ellipsoid 7044","","","","","geographic 2D","6044","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_136[] = {"4045","Unknown datum based upon ellipsoid 7045","","","","","geographic 2D","6045","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Not recommended.  Use only in cases where geodetic datum unknown.","",NULL};
+datafile_rows_t horiz_cs_row_137[] = {"4120","Greek","","","","Greece","geographic 2D","6120","8901","North","East","Lat","Long","","9108","","","1997-06-16 00:00:00","Topography Department; National Technical University of Greece.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_138[] = {"4121","GGRS87","","","","Greece","geographic 2D","6121","8901","North","East","Lat","Long","","9108","","","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_139[] = {"4122","ATS77","","","","Canada - New Brunswick; Canada - Nova Scotia - onshore; Canada - Prince Edward Island.","geographic 2D","6122","8901","North","East","Lat","Long","","9108","","","1997-07-22 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t horiz_cs_row_140[] = {"4123","KKJ","","","","Finland","geographic 2D","6123","8901","North","East","Lat","Long","","9108","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_141[] = {"4124","RT90","","","","Sweden","geographic 2D","6124","8901","North","East","Lat","Long","","9108","","","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_142[] = {"4125","Samboja","","","","Indonesia - east Kalimantan - Mahakam delta area.","geographic 2D","6125","8901","North","East","Lat","Long","","9108","","","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_143[] = {"4126","LKS94 (ETRS89)","","","","Lithuania","geographic 2D","6126","8901","North","East","Lat","Long","","9108","","","1998-03-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_144[] = {"4127","Tete","","","","Mozambique","geographic 2D","6127","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_145[] = {"4128","Madzansua","","","","Mozambique - west","geographic 2D","6128","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by values transformed to Tete geogCS (code 4127).","",NULL};
+datafile_rows_t horiz_cs_row_146[] = {"4129","Observatario","","","","Mozambique - south","geographic 2D","6129","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Superseded by values transformed to Tete geogCS (code 4127).","",NULL};
+datafile_rows_t horiz_cs_row_147[] = {"4130","Moznet","","","","Mozambique","geographic 2D","6130","8901","North","East","Lat","Long","","9108","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_148[] = {"4131","Indian 1960","","","","Cambodia; Vietnam","geographic 2D","6131","8901","North","East","Lat","Long","","9108","","","1998-11-11 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_149[] = {"4132","FD58","","","","Iran - Gulf coast and Arwaz areas.","geographic 2D","6132","8901","North","East","Lat","Long","","9108","","","1998-11-11 00:00:00","IOEPC records.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_150[] = {"4133","EST92","","","","Estonia","geographic 2D","6133","8901","North","East","Lat","Long","","9108","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Densification of ETRS89 as established during 1992 Baltic campaign.","",NULL};
+datafile_rows_t horiz_cs_row_151[] = {"4134","PDO Survey Datum 1993","PSD93","","","Oman","geographic 2D","6134","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud geogCS (code 4232). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_152[] = {"4135","Old Hawaiian","","","","United States (USA) - Hawaii","geographic 2D","6135","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_153[] = {"4136","St. Lawrence Island","","","","United States (USA) - Alaska - St. Lawrence Island","geographic 2D","6136","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_154[] = {"4137","St. Paul Island","","","","United States (USA) - Alaska - St. Paul Island","geographic 2D","6137","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_155[] = {"4138","St. George Island","","","","United States (USA) - Alaska - St. George Island","geographic 2D","6138","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_156[] = {"4139","Puerto Rico","","","","Puerto Rico; Virgin Islands (British); Virgin Islands (U.S.).","geographic 2D","6139","8901","North","East","Lat","Long","","9108","","","1999-05-24 00:00:00","","EPSG","Used for civilian purposes.  NAD27 (code 4267) used for military purposes.  Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_157[] = {"4140","NAD83(CSRS98)","","","","Canada - New Brunswick","geographic 2D","6140","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","Service New Brunswick Land and Information Standards Manual","EPSG","Supersedes ATS77 from 1999 in New Brunswick.","",NULL};
+datafile_rows_t horiz_cs_row_158[] = {"4141","Israel","","","","Israel.","geographic 2D","6141","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","Survey of Israel","EPSG","Supersedes Palestine 1923 in Israel.","",NULL};
+datafile_rows_t horiz_cs_row_159[] = {"4142","Locodjo 1965","","","","Cote D'Ivoire (Ivory Coast).","geographic 2D","6142","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded by Abidjan 1987 (EPSG code 4143).","",NULL};
+datafile_rows_t horiz_cs_row_160[] = {"4143","Abidjan 1987","","","","Cote D'Ivoire (Ivory Coast).","geographic 2D","6143","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","IGN Paris","EPSG","Supersedes Locodjo 1967 (EPSG code 4142).","",NULL};
+datafile_rows_t horiz_cs_row_161[] = {"4144","Kalianpur 1937","","","","Bangladesh; India; Pakistan","geographic 2D","6144","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Adopts 1937 metric conversion of 0.30479841 metres per Indian foot.","",NULL};
+datafile_rows_t horiz_cs_row_162[] = {"4145","Kalianpur 1962","","","","Pakistan","geographic 2D","6145","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Adopts 1962 metric conversion of 0.3047996 metres per Indian foot.","",NULL};
+datafile_rows_t horiz_cs_row_163[] = {"4146","Kalianpur 1975","","","","India","geographic 2D","6146","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Adopts 1975 metric conversion of 0.3047995 metres per Indian foot.","",NULL};
+datafile_rows_t horiz_cs_row_164[] = {"4147","Hanoi 1972","","","","Vietnam","geographic 2D","6147","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_165[] = {"4148","Hartbeesthoek94","","","","South Africa.","geographic 2D","6148","8901","North","East","Lat","Long","","9108","","","1999-10-22 00:00:00","","EPSG","Supercedes Cape (code 4222) from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_166[] = {"4149","CH1903","","","","Liechtenstein; Switzerland","geographic 2D","6149","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_167[] = {"4150","CH1903+","","","","Liechtenstein; Switzerland","geographic 2D","6150","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_168[] = {"4151","CHTRF95","","","","Liechtenstein; Switzerland","geographic 2D","6151","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_169[] = {"4152","NAD83(HARN)","","","","United States (US)","geographic 2D","6152","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","National Geodetic Survey","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_170[] = {"4153","Rassadiran","","","","Iran - Taheri refinery site only.","geographic 2D","6153","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","Used only for onshore terminal site.","",NULL};
+datafile_rows_t horiz_cs_row_171[] = {"4154","ED50(ED77)","","","","Iran","geographic 2D","6154","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_172[] = {"4200","Pulkovo 1995","","","","Russia","geographic 2D","6200","8901","North","East","Lat","Long","","9108","","","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_173[] = {"4201","Adindan","","","","Ethiopia; Sudan","geographic 2D","6201","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_174[] = {"4202","AGD66","","","","Australia; Papua New Guinea","geographic 2D","6202","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_175[] = {"4203","AGD84","","","","Australia","geographic 2D","6203","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_176[] = {"4204","Ain el Abd","","","","Kuwait; Saudi Arabia","geographic 2D","6204","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_177[] = {"4205","Afgooye","","","","Somalia","geographic 2D","6205","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_178[] = {"4206","Agadez","","","","Niger","geographic 2D","6206","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_179[] = {"4207","Lisbon","","","","Portugal - onshore","geographic 2D","6207","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_180[] = {"4208","Aratu","","","","Brazil - coastal areas south of 2 deg 55 min S.","geographic 2D","6208","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_181[] = {"4209","Arc 1950","","","","Botswana; Malawi; Zambia; Zimbabwe.","geographic 2D","6209","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_182[] = {"4210","Arc 1960","","","","Kenya; Tanzania; Uganda.","geographic 2D","6210","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_183[] = {"4211","Batavia","","","","Indonesia - Java","geographic 2D","6211","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_184[] = {"4212","Barbados 1938","","","","Barbados","geographic 2D","6212","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","99.171",NULL};
+datafile_rows_t horiz_cs_row_185[] = {"4213","Beduaram","","","","Niger","geographic 2D","6213","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_186[] = {"4214","Beijing 1954","","","","China","geographic 2D","6214","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_187[] = {"4215","Belge 1950","","","","Belgium - onshore","geographic 2D","6215","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_188[] = {"4216","Bermuda 1957","","","","Bermuda","geographic 2D","6216","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_189[] = {"4218","Bogota","","","","Colombia","geographic 2D","6218","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_190[] = {"4219","Bukit Rimpah","","","","Indonesia - Banga & Belitung Islands","geographic 2D","6219","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_191[] = {"4220","Camacupa","","","","Angola","geographic 2D","6220","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_192[] = {"4221","Campo Inchauspe","","","","Argentina","geographic 2D","6221","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_193[] = {"4222","Cape","","","","Botswana; South Africa.","geographic 2D","6222","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Superceded by Hartbeesthoek94 from 1999.","",NULL};
+datafile_rows_t horiz_cs_row_194[] = {"4223","Carthage","","","","Tunisia","geographic 2D","6223","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_195[] = {"4224","Chua","","","","Brazil","geographic 2D","6224","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_196[] = {"4225","Corrego Alegre","","","","Brazil - NE coastal area between 45 deg W and 40 deg W.","geographic 2D","6225","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_197[] = {"4226","Cote d'Ivoire","","","","Cote d'Ivoire","geographic 2D","6226","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_198[] = {"4227","Deir ez Zor","","","","Syrian Arab Republic","geographic 2D","6227","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_199[] = {"4228","Douala","","","","Cameroon","geographic 2D","6228","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_200[] = {"4229","Egypt 1907","","","","Egypt","geographic 2D","6229","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_201[] = {"4230","ED50","","","","Europe - west - Spain; France offshore; United Kingdom UKCS offshore; Netherlands offshore; Germany offshore North Sea; Denmark; Norway; Turkey.","geographic 2D","6230","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_202[] = {"4231","ED87","","","","Europe - west.","geographic 2D","6231","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_203[] = {"4232","Fahud","","","","Oman","geographic 2D","6232","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Since 1993 superseded by PSD93 geogCS (code 4134). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_204[] = {"4233","Gandajika 1970","","","","Maldives","geographic 2D","6233","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_205[] = {"4234","Garoua","","","","Cameroon","geographic 2D","6234","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_206[] = {"4235","Guyane Francaise","","","","French Guyana","geographic 2D","6235","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_207[] = {"4236","Hu Tzu Shan","","","","Taiwan","geographic 2D","6236","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_208[] = {"4237","HD72","","","","Hungary","geographic 2D","6237","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_209[] = {"4238","ID74","","","","Indonesia","geographic 2D","6238","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_210[] = {"4239","Indian 1954","","","","Myanmar (Burma); Thailand","geographic 2D","6239","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_211[] = {"4240","Indian 1975","","","","Thailand","geographic 2D","6240","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_212[] = {"4241","Jamaica 1875","","","","Jamaica","geographic 2D","6241","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_213[] = {"4242","JAD69","","","","Jamaica","geographic 2D","6242","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_214[] = {"4243","Kalianpur 1880","","","","Bangladesh; India; Myanmar (Burma); Pakistan","geographic 2D","6243","8901","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_215[] = {"4244","Kandawala","","","","Sri Lanka","geographic 2D","6244","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_216[] = {"4245","Kertau","","","","Malaysia - West Malaysia; Singapore","geographic 2D","6245","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Adopts metric conversion of 39.370113 inches per metre.","",NULL};
+datafile_rows_t horiz_cs_row_217[] = {"4246","KOC","","","","Kuwait","geographic 2D","6246","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_218[] = {"4247","La Canoa","","","","Venezuela","geographic 2D","6247","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","PSAD56 uses same origin.","",NULL};
+datafile_rows_t horiz_cs_row_219[] = {"4248","PSAD56","","","","Bolivia; Ecuador; Peru; [Venezuela]","geographic 2D","6248","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Origin is same as La Canoa.  In Venezuela known as La Canoa.","",NULL};
+datafile_rows_t horiz_cs_row_220[] = {"4249","Lake","","","","Venezuela - Lake Maracaibo area","geographic 2D","6249","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_221[] = {"4250","Leigon","","","","Ghana","geographic 2D","6250","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_222[] = {"4251","Liberia 1964","","","","Liberia","geographic 2D","6251","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_223[] = {"4252","Lome","","","","Togo","geographic 2D","6252","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_224[] = {"4253","Luzon 1911","","","","Philippines","geographic 2D","6253","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_225[] = {"4254","Hito XVIII 1963","","","","Chile - Tierra del Fuego","geographic 2D","6254","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_226[] = {"4255","Herat North","","","","Afghanistan","geographic 2D","6255","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_227[] = {"4256","Mahe 1971","","","","Seychelles","geographic 2D","6256","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_228[] = {"4257","Makassar","","","","Indonesia - south west Sulawesi","geographic 2D","6257","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_229[] = {"4258","ETRF89","","","","Europe - Hungary; Norway; Sweden; United Kingdom (UKCS) offshore.","geographic 2D","6258","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","Norwegian Geodetic Institute geodetic publication 1990:1","EPSG","","97.11  99.11",NULL};
+datafile_rows_t horiz_cs_row_230[] = {"4259","Malongo 1987","","","","Angola - Cabinda offshore","geographic 2D","6259","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Chevron Petroleum Technology","EPSG","Offshore extension of Mhast GeogCS (4264) using Transit translocation from Station Y at Malongo base camp.","",NULL};
+datafile_rows_t horiz_cs_row_231[] = {"4260","Manoca","","","","Cameroon","geographic 2D","6260","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_232[] = {"4261","Merchich","","","","Morocco","geographic 2D","6261","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_233[] = {"4262","Massawa","","","","Eritrea","geographic 2D","6262","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_234[] = {"4263","Minna","","","","Nigeria","geographic 2D","6263","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_235[] = {"4264","Mhast","","","","Angola - Cabinda","geographic 2D","6264","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_236[] = {"4265","Monte Mario","","","","Italy","geographic 2D","6265","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_237[] = {"4266","M'poraloko","","","","Gabon","geographic 2D","6266","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_238[] = {"4267","NAD27","","","","North and central America - Canada; Mexico; United States (USA).","geographic 2D","6267","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.  Superseded by NAD27(76) (code 4608) in Ontario and CGQ77 (code 4609) in Quebec.","99.04",NULL};
+datafile_rows_t horiz_cs_row_239[] = {"4268","NAD27 Michigan","NAD Michigan","","","United States (USA) - Michigan","geographic 2D","6268","8901","North","East","Lat","Long","","9108","","","1996-12-12 00:00:00","","EPSG","Ellipsoid taken to be 800ft above geoid. Note: this coordinate system includes longitudes which are POSITIVE EAST.","96.28",NULL};
+datafile_rows_t horiz_cs_row_240[] = {"4269","NAD83","","","","Canada: Greenland; Mexico; United States (USA)","geographic 2D","6269","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_241[] = {"4270","Nahrwan 1967","","","","Arabian Gulf; Kuwait; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.","geographic 2D","6270","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_242[] = {"4271","Naparima 1972","","","","Trinidad and Tobago","geographic 2D","6271","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_243[] = {"4272","GD49","","","","New Zealand","geographic 2D","6272","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_244[] = {"4273","NGO 1948","","","","Norway - onshore","geographic 2D","6273","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_245[] = {"4274","Datum 73","","","","Portugal - onshore","geographic 2D","6274","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_246[] = {"4275","NTF","","","","France - onshore","geographic 2D","6275","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_247[] = {"4276","NSWC 9Z-2","","","","World","geographic 2D","6276","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_248[] = {"4277","OSGB 1936","","","","United Kingdom (UK) - Great Britain - England  Scotland  Wales - onshore; Isle of Man.","geographic 2D","6277","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_249[] = {"4278","OSGB70","","","","United Kingdom (UK) - Great Britain - England  Scotland  wales - onshore","geographic 2D","6278","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_250[] = {"4279","OS(SN)80","","","","Ireland - onshore; United Kingdom (UK) - England  Scotland  Wales  Northern Ireland - onshore E","geographic 2D","6279","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_251[] = {"4280","Padang","","","","Indonesia - Sumatra","geographic 2D","6280","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_252[] = {"4281","Palestine 1923","","","","Israel; Jordan; Lebanon","geographic 2D","6281","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_253[] = {"4282","Pointe Noire","","","","Congo","geographic 2D","6282","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_254[] = {"4283","GDA94","","","","Australia","geographic 2D","6283","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_255[] = {"4284","Pulkovo 1942","","","","Armenia; Azerbaijan; Belarus; Estonia; Georgia; Kazakstan; Kirgistan; Latvia; Lithuania; Moldova; Russia; Tadzhikstan; Turkmenistan; Ukraine; Uzbekistan; Germany (former DDR); Czech Republic; Hungary; Poland; Romania; Latvia; Lithuania; Estonia; Albania","geographic 2D","6284","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_256[] = {"4285","Qatar","","","","Qatar - onshore","geographic 2D","6285","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_257[] = {"4286","Qatar 1948","","","","Qatar - onshore","geographic 2D","6286","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_258[] = {"4287","Qornoq","","","","Greenland","geographic 2D","6287","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_259[] = {"4288","Loma Quintana","","","","Venezuela - north","geographic 2D","6288","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_260[] = {"4289","Amersfoort","","","","Netherlands - onshore","geographic 2D","6289","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_261[] = {"4291","SAD69","","","","South America - Brazil","geographic 2D","6291","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251.  Error introduced if not using the truncated precision is 0 to 31mm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_262[] = {"4292","Sapper Hill 1943","","","","Falkland Islands","geographic 2D","6292","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_263[] = {"4293","Schwarzeck","","","","Namibia","geographic 2D","6293","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_264[] = {"4294","Segora","","","","Indonesia - southeast Kalimantan","geographic 2D","6294","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_265[] = {"4295","Serindung","","","","Indonesia - east Kalimantan","geographic 2D","6295","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_266[] = {"4296","Sudan","","","","Sudan - south","geographic 2D","6296","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_267[] = {"4297","Tananarive","","","","Madagascar","geographic 2D","6297","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_268[] = {"4298","Timbalai 1948","","","","Brunei; Malaysia - East Malaysia (Sabah; Sarawak).","geographic 2D","6298","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Adopts metric conversion of 39.370147 inches per metre.","",NULL};
+datafile_rows_t horiz_cs_row_269[] = {"4299","TM65","","","","Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore","geographic 2D","6299","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_270[] = {"4300","TM75","","","","Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore","geographic 2D","6300","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_271[] = {"4301","Tokyo","","","","Japan; North Korea; South Korea","geographic 2D","6301","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_272[] = {"4302","Trinidad 1903","","","","Trinidad and Tobago - Trinidad","geographic 2D","6302","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_273[] = {"4303","TC(1948)","","","","United Arab Emirates (UAE) - Abu Dhabi; Dubai","geographic 2D","6303","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_274[] = {"4304","Voirol 1875","","","","Algeria - north of 32 deg N","geographic 2D","6304","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_275[] = {"4305","Voirol Unifie","","","","Algeria - north of 32 deg N","geographic 2D","6305","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_276[] = {"4306","Bern 1938","","","","Liechtenstein; Switzerland","geographic 2D","6306","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","Used for the geographic coordinates overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).","",NULL};
+datafile_rows_t horiz_cs_row_277[] = {"4307","Nord Sahara 1959","","","","Algeria; Morocco; Tunisia","geographic 2D","6307","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_278[] = {"4308","RT38","","","","Sweden","geographic 2D","6308","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","97.09",NULL};
+datafile_rows_t horiz_cs_row_279[] = {"4309","Yacare","","","","Uruguay","geographic 2D","6309","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_280[] = {"4310","Yoff","","","","Senegal","geographic 2D","6310","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_281[] = {"4311","Zanderij","","","","Suriname","geographic 2D","6311","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_282[] = {"4312","MGI","","","","Austria; Yugoslavia","geographic 2D","6312","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Bundesamt fur Eich- und Vermessungswesen; Wien","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_283[] = {"4313","Belge 1972","","","","Belgium - onshore","geographic 2D","6313","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_284[] = {"4314","DHDN","","","","Germany - onshore","geographic 2D","6314","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_285[] = {"4315","Conakry 1905","","","","Guinea","geographic 2D","6315","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_286[] = {"4316","Dealul Piscului 1933","","","","Romania","geographic 2D","6316","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","Superseded by 1970 system (geogCS code 4317).","",NULL};
+datafile_rows_t horiz_cs_row_287[] = {"4317","Dealul Piscului 1970","","","","Romania","geographic 2D","6317","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","Supersedes 1933 system (geogCS code 4316).","",NULL};
+datafile_rows_t horiz_cs_row_288[] = {"4318","NGN","","","","Kuwait","geographic 2D","6318","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_289[] = {"4319","KUDAMS","","","","Kuwait - Kuwait City","geographic 2D","6319","8901","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_290[] = {"4322","WGS 72","","","","World","geographic 2D","6322","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","GeogCS code 4323 reserved for use with  ProjCS's.","",NULL};
+datafile_rows_t horiz_cs_row_291[] = {"4324","WGS 72BE","","","","World","geographic 2D","6324","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","GeogCS code 4325 reserved for use with  ProjCS's.","",NULL};
+datafile_rows_t horiz_cs_row_292[] = {"4326","WGS 84","","","","World","geographic 2D","6326","8901","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","GeogCS code 4327 reserved for use with  ProjCS's.","",NULL};
+datafile_rows_t horiz_cs_row_293[] = {"4600","Anguilla 1957","","","","Anguilla","geographic 2D","6600","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_294[] = {"4601","Antigua 1943","","","","Antigua and Barbuda - Antigua","geographic 2D","6601","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_295[] = {"4602","Dominica 1945","","","","Dominica","geographic 2D","6602","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_296[] = {"4603","Grenada 1953","","","","Grenada (including Grenada Grenadines)","geographic 2D","6603","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_297[] = {"4604","Montserrat 1958","","","","Montserrat","geographic 2D","6604","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_298[] = {"4605","St. Kitts 1955","","","","Saint Kitts and Nevis","geographic 2D","6605","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_299[] = {"4606","St. Lucia 1955","","","","Saint Lucia","geographic 2D","6606","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_300[] = {"4607","St. Vincent 1945","","","","Saint Vincent and the Grenadines","geographic 2D","6607","8901","North","East","Lat","Long","","9108","","","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_301[] = {"4608","NAD27(76)","","","","Canada - Ontario","geographic 2D","6608","8901","North","East","Lat","Long","","9108","","","1999-05-12 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_302[] = {"4609","NAD27(CGQ77)","CGQ77","","","Canada - Quebec","geographic 2D","6609","8901","North","East","Lat","Long","","9108","","","1999-05-12 00:00:00","","EPSG","Note: this coordinate system includes longitudes which are POSITIVE EAST.","",NULL};
+datafile_rows_t horiz_cs_row_303[] = {"4801","Bern 1898 (Bern)","","","","Liechtenstein; Switzerland","geographic 2D","6149","8907","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_304[] = {"4802","Bogota (Bogota)","","","","Colombia","geographic 2D","6218","8904","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_305[] = {"4803","Lisbon (Lisbon)","","","","Portugal - onshore","geographic 2D","6207","8902","North","East","Lat","Long","","9108","","","1997-04-11 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","97.12",NULL};
+datafile_rows_t horiz_cs_row_306[] = {"4804","Makassar (Jakarta)","","","","Indonesia - south west Sulawesi","geographic 2D","6257","8908","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_307[] = {"4805","MGI (Ferro)","","","","Austria; Yugoslavia","geographic 2D","6312","8909","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","Bundesamt fur Eich- und Vermessungswesen; Wien","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_308[] = {"4806","Monte Mario (Rome)","","","","Italy","geographic 2D","6265","8906","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_309[] = {"4807","NTF (Paris)","","","","France - onshore","geographic 2D","6275","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_310[] = {"4808","Padang (Jakarta)","","","","Indonesia - Sumatra","geographic 2D","6280","8908","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_311[] = {"4809","Belge 1950 (Brussels)","","","","Belgium - onshore","geographic 2D","6215","8910","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_312[] = {"4810","Tananarive (Paris)","","","","Madagascar","geographic 2D","6297","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_313[] = {"4811","Voirol 1875 (Paris)","","","","Algeria - north of 32 deg N","geographic 2D","6304","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_314[] = {"4812","Voirol Unifie (Paris)","","","","Algeria - north of 32 deg N","geographic 2D","6305","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","\"Le System Geodesique Nord-Sahara\"; IGN Paris","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_315[] = {"4813","Batavia (Jakarta)","","","","Indonesia - Java","geographic 2D","6211","8908","North","East","Lat","Long","","9108","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_316[] = {"4814","RT38 (Stockholm)","","","","Sweden","geographic 2D","6308","8911","North","East","Lat","Long","","9108","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_317[] = {"4815","Greek (Athens)","","","","Greece","geographic 2D","6120","8912","North","East","Lat","Long","","9108","","","1997-06-16 00:00:00","Topography Department; National Technical University of Greece.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_318[] = {"4816","Carthage (Paris)","","","","Tunisia","geographic 2D","6223","8903","North","East","Lat","Long","","9105","","","1998-11-11 00:00:00","","EPSG","Superseded by Greenwich-based Carthage geogCS.","",NULL};
+datafile_rows_t horiz_cs_row_319[] = {"4817","NGO 1948 (Oslo)","","","","Norway - onshore","geographic 2D","6273","8913","North","East","Lat","Long","","9108","","","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_320[] = {"4901","ATF (Paris)","","","","France","geographic 2D","6901","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_321[] = {"4902","NDG (Paris)","","","","France - Alsace","geographic 2D","6902","8903","North","East","Lat","Long","","9105","","","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_322[] = {"4903","Madrid 1870 (Madrid)","","","","Spain","geographic 2D","6903","8905","North","East","Lat","Long","","9108","","","1998-11-11 00:00:00","Institut de Geomatica; Barcelona.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_323[] = {"20004","Pulkovo 1995 / Gauss-Kruger zone 4","1995 Coord. Sys. zone 4","","","Russia - west of 24 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16204","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_324[] = {"20005","Pulkovo 1995 / Gauss-Kruger zone 5","1995 Coord. Sys. zone 5","","","Russia - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16205","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_325[] = {"20006","Pulkovo 1995 / Gauss-Kruger zone 6","1995 Coord. Sys. zone 6","","","Russia - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16206","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_326[] = {"20007","Pulkovo 1995 / Gauss-Kruger zone 7","1995 Coord. Sys. zone 7","","","Russia - 36 deg to 42 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16207","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_327[] = {"20008","Pulkovo 1995 / Gauss-Kruger zone 8","1995 Coord. Sys. zone 8","","","Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16208","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_328[] = {"20009","Pulkovo 1995 / Gauss-Kruger zone 9","1995 Coord. Sys. zone 9","","","Russia - 48 deg to 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16209","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_329[] = {"20010","Pulkovo 1995 / Gauss-Kruger zone 10","1995 Coord. Sys. zone 10","","","Russia - 54 deg  to 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16210","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_330[] = {"20011","Pulkovo 1995 / Gauss-Kruger zone 11","1995 Coord. Sys. zone 11","","","Russia - 60 deg to 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16211","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_331[] = {"20012","Pulkovo 1995 / Gauss-Kruger zone 12","1995 Coord. Sys. zone 12","","","Russia - 66 deg to 72 deg East .","projected 2D","","","North","East","X","Y","9001","","4200","16212","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_332[] = {"20013","Pulkovo 1995 / Gauss-Kruger zone 13","1995 Coord. Sys. zone 13","","","Russia - 72 deg to 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16213","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_333[] = {"20014","Pulkovo 1995 / Gauss-Kruger zone 14","1995 Coord. Sys. zone 14","","","Russia - 78 deg to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16214","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_334[] = {"20015","Pulkovo 1995 / Gauss-Kruger zone 15","1995 Coord. Sys. zone 15","","","Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16215","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_335[] = {"20016","Pulkovo 1995 / Gauss-Kruger zone 16","1995 Coord. Sys. zone 16","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16216","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_336[] = {"20017","Pulkovo 1995 / Gauss-Kruger zone 17","1995 Coord. Sys. zone 17","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16217","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_337[] = {"20018","Pulkovo 1995 / Gauss-Kruger zone 18","1995 Coord. Sys. zone 18","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16218","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_338[] = {"20019","Pulkovo 1995 / Gauss-Kruger zone 19","1995 Coord. Sys. zone 19","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16219","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_339[] = {"20020","Pulkovo 1995 / Gauss-Kruger zone 20","1995 Coord. Sys. zone 20","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16220","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_340[] = {"20021","Pulkovo 1995 / Gauss-Kruger zone 21","1995 Coord. Sys. zone 21","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16221","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_341[] = {"20022","Pulkovo 1995 / Gauss-Kruger zone 22","1995 Coord. Sys. zone 22","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16222","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_342[] = {"20023","Pulkovo 1995 / Gauss-Kruger zone 23","1995 Coord. Sys. zone 23","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16223","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_343[] = {"20024","Pulkovo 1995 / Gauss-Kruger zone 24","1995 Coord. Sys. zone 24","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16224","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_344[] = {"20025","Pulkovo 1995 / Gauss-Kruger zone 25","1995 Coord. Sys. zone 25","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16225","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_345[] = {"20026","Pulkovo 1995 / Gauss-Kruger zone 26","1995 Coord. Sys. zone 26","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16226","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_346[] = {"20027","Pulkovo 1995 / Gauss-Kruger zone 27","1995 Coord. Sys. zone 27","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16227","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_347[] = {"20028","Pulkovo 1995 / Gauss-Kruger zone 28","1995 Coord. Sys. zone 28","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16228","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_348[] = {"20029","Pulkovo 1995 / Gauss-Kruger zone 29","1995 Coord. Sys. zone 29","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16229","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_349[] = {"20030","Pulkovo 1995 / Gauss-Kruger zone 30","1995 Coord. Sys. zone 30","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4200","16230","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_350[] = {"20031","Pulkovo 1995 / Gauss-Kruger zone 31","1995 Coord. Sys. zone 31","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16231","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_351[] = {"20032","Pulkovo 1995 / Gauss-Kruger zone 32","1995 Coord. Sys. zone 32","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16232","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_352[] = {"20064","Pulkovo 1995 / Gauss-Kruger 4N","Pulkovo 1995 / Gauss 4N","","","Russia - west of 24 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16304","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_353[] = {"20065","Pulkovo 1995 / Gauss-Kruger 5N","Pulkovo 1995 / Gauss 5N","","","Russia - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16305","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_354[] = {"20066","Pulkovo 1995 / Gauss-Kruger 6N","Pulkovo 1995 / Gauss 6N","","","Russia - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16306","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_355[] = {"20067","Pulkovo 1995 / Gauss-Kruger 7N","Pulkovo 1995 / Gauss 7N","","","Russia - 36 deg to 42 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16307","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_356[] = {"20068","Pulkovo 1995 / Gauss-Kruger 8N","Pulkovo 1995 / Gauss 8N","","","Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16308","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_357[] = {"20069","Pulkovo 1995 / Gauss-Kruger 9N","Pulkovo 1995 / Gauss 9N","","","Russia - 48 deg to 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16309","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_358[] = {"20070","Pulkovo 1995 / Gauss-Kruger 10N","Pulkovo 1995 / Gauss 10N","","","Russia - 54 deg  to 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16310","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_359[] = {"20071","Pulkovo 1995 / Gauss-Kruger 11N","Pulkovo 1995 / Gauss 11N","","","Russia - 60 deg to 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16311","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_360[] = {"20072","Pulkovo 1995 / Gauss-Kruger 12N","Pulkovo 1995 / Gauss 12N","","","Russia - 66 deg to 72 deg East .","projected 2D","","","North","East","X","Y","9001","","4200","16312","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_361[] = {"20073","Pulkovo 1995 / Gauss-Kruger 13N","Pulkovo 1995 / Gauss 13N","","","Russia - 72 deg to 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16313","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_362[] = {"20074","Pulkovo 1995 / Gauss-Kruger 14N","Pulkovo 1995 / Gauss 14N","","","Russia - 78 deg to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16314","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_363[] = {"20075","Pulkovo 1995 / Gauss-Kruger 15N","Pulkovo 1995 / Gauss 15N","","","Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16315","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_364[] = {"20076","Pulkovo 1995 / Gauss-Kruger 16N","Pulkovo 1995 / Gauss 16N","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16316","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_365[] = {"20077","Pulkovo 1995 / Gauss-Kruger 17N","Pulkovo 1995 / Gauss 17N","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16317","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_366[] = {"20078","Pulkovo 1995 / Gauss-Kruger 18N","Pulkovo 1995 / Gauss 18N","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16318","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_367[] = {"20079","Pulkovo 1995 / Gauss-Kruger 19N","Pulkovo 1995 / Gauss 19N","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16319","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_368[] = {"20080","Pulkovo 1995 / Gauss-Kruger 20N","Pulkovo 1995 / Gauss 20N","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16320","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_369[] = {"20081","Pulkovo 1995 / Gauss-Kruger 21N","Pulkovo 1995 / Gauss 21N","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16321","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_370[] = {"20082","Pulkovo 1995 / Gauss-Kruger 22N","Pulkovo 1995 / Gauss 22N","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16322","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_371[] = {"20083","Pulkovo 1995 / Gauss-Kruger 23N","Pulkovo 1995 / Gauss 23N","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16323","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_372[] = {"20084","Pulkovo 1995 / Gauss-Kruger 24N","Pulkovo 1995 / Gauss 24N","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16324","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_373[] = {"20085","Pulkovo 1995 / Gauss-Kruger 25N","Pulkovo 1995 / Gauss 25N","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16325","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_374[] = {"20086","Pulkovo 1995 / Gauss-Kruger 26N","Pulkovo 1995 / Gauss 26N","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16326","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_375[] = {"20087","Pulkovo 1995 / Gauss-Kruger 27N","Pulkovo 1995 / Gauss 27N","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16327","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_376[] = {"20088","Pulkovo 1995 / Gauss-Kruger 28N","Pulkovo 1995 / Gauss 28N","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16328","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_377[] = {"20089","Pulkovo 1995 / Gauss-Kruger 29N","Pulkovo 1995 / Gauss 29N","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4200","16329","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_378[] = {"20090","Pulkovo 1995 / Gauss-Kruger 30N","Pulkovo 1995 / Gauss 30N","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4200","16330","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_379[] = {"20091","Pulkovo 1995 / Gauss-Kruger 31N","Pulkovo 1995 / Gauss 31N","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16331","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_380[] = {"20092","Pulkovo 1995 / Gauss-Kruger 32N","Pulkovo 1995 / Gauss 32N","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4200","16332","1996-09-12 00:00:00","\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_381[] = {"20137","Adindan / UTM zone 37N","","","","Ethiopia - west of 42 degrees East.  Sudan - west of 42 degrees East.","projected 2D","","","East","North","E","N","9001","","4201","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_382[] = {"20138","Adindan / UTM zone 38N","","","","Ethiopia - east of 42 degrees East.  Sudan - east of 42 degrees East.","projected 2D","","","East","North","E","N","9001","","4201","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_383[] = {"20248","AGD66 / AMG zone 48","","","","Australia - 102deg East to 108deg East.","projected 2D","","","East","North","E","N","9001","","4202","17448","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_384[] = {"20249","AGD66 / AMG zone 49","","","","Australia - 108deg East to 114deg East.","projected 2D","","","East","North","E","N","9001","","4202","17449","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_385[] = {"20250","AGD66 / AMG zone 50","","","","Australia - 114deg East to 120deg East.","projected 2D","","","East","North","E","N","9001","","4202","17450","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_386[] = {"20251","AGD66 / AMG zone 51","","","","Australia - 120deg East to 126deg East.","projected 2D","","","East","North","E","N","9001","","4202","17451","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_387[] = {"20252","AGD66 / AMG zone 52","","","","Australia - 126deg East to 132deg East.","projected 2D","","","East","North","E","N","9001","","4202","17452","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_388[] = {"20253","AGD66 / AMG zone 53","","","","Australia - 132deg East to 138deg East.","projected 2D","","","East","North","E","N","9001","","4202","17453","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_389[] = {"20254","AGD66 / AMG zone 54","","","","Australia - 138deg East to 144deg East.  Papua New Guinea - west of 144deg East.","projected 2D","","","East","North","E","N","9001","","4202","17454","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_390[] = {"20255","AGD66 / AMG zone 55","","","","Australia - 144deg East to 150deg East.  Papua New Guinea - 144deg East to 150deg East.","projected 2D","","","East","North","E","N","9001","","4202","17455","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_391[] = {"20256","AGD66 / AMG zone 56","","","","Australia - 150deg East to 156deg East.","projected 2D","","","East","North","E","N","9001","","4202","17456","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_392[] = {"20257","AGD66 / AMG zone 57","","","","Australia - 156deg East to 162deg East.","projected 2D","","","East","North","E","N","9001","","4202","17457","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_393[] = {"20258","AGD66 / AMG zone 58","","","","Australia - 162deg East to 168deg East.","projected 2D","","","East","North","E","N","9001","","4202","17458","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_394[] = {"20348","AGD84 / AMG zone 48","","","","Australia - 102deg East to 108deg East.","projected 2D","","","East","North","E","N","9001","","4203","17448","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_395[] = {"20349","AGD84 / AMG zone 49","","","","Australia - 108deg East to 114deg East.","projected 2D","","","East","North","E","N","9001","","4203","17449","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_396[] = {"20350","AGD84 / AMG zone 50","","","","Australia - 114deg East to 120deg East.","projected 2D","","","East","North","E","N","9001","","4203","17450","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_397[] = {"20351","AGD84 / AMG zone 51","","","","Australia - 120deg East to 126deg East.","projected 2D","","","East","North","E","N","9001","","4203","17451","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_398[] = {"20352","AGD84 / AMG zone 52","","","","Australia - 126deg East to 132deg East.","projected 2D","","","East","North","E","N","9001","","4203","17452","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_399[] = {"20353","AGD84 / AMG zone 53","","","","Australia - 132deg East to 138deg East.","projected 2D","","","East","North","E","N","9001","","4203","17453","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_400[] = {"20354","AGD84 / AMG zone 54","","","","Australia - 138deg East to 144deg East.  Papua - New Guinea west of 144deg East.","projected 2D","","","East","North","E","N","9001","","4203","17454","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_401[] = {"20355","AGD84 / AMG zone 55","","","","Australia - 144deg East to 150deg East.  Papua New Guinea - 144deg East to 150deg East.","projected 2D","","","East","North","E","N","9001","","4203","17455","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_402[] = {"20356","AGD84 / AMG zone 56","","","","Australia - 150deg East to 156deg East.","projected 2D","","","East","North","E","N","9001","","4203","17456","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_403[] = {"20357","AGD84 / AMG zone 57","","","","Australia - 156deg East to 162deg East.","projected 2D","","","East","North","E","N","9001","","4203","17457","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_404[] = {"20358","AGD84 / AMG zone 58","","","","Australia - 162deg East to 168deg East.","projected 2D","","","East","North","E","N","9001","","4203","17458","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_405[] = {"20437","Ain el Abd / UTM zone 37N","Ain el Abd / UTM 37N","","","Saudi Arabia - west of 42 degrees East.","projected 2D","","","East","North","E","N","9001","","4204","16037","1997-11-13 00:00:00","","EPSG","","97.59",NULL};
+datafile_rows_t horiz_cs_row_406[] = {"20438","Ain el Abd / UTM zone 38N","Ain el Abd / UTM 38N","","","Kuwait.  Saudi Arabia - between 42 degrees and 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4204","16038","1997-11-13 00:00:00","","EPSG","Known in Kuwait as \"KOC UTM\".","97.59",NULL};
+datafile_rows_t horiz_cs_row_407[] = {"20439","Ain el Abd / UTM zone 39N","Ain el Abd / UTM 39N","","","Saudi Arabia - east of 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4204","16039","1997-11-13 00:00:00","","EPSG","","97.59",NULL};
+datafile_rows_t horiz_cs_row_408[] = {"20499","Ain el Abd / Bahrain Grid","","","","Bahrain.","projected 2D","","","East","North","E","N","9001","","4204","19900","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_409[] = {"20538","Afgooye / UTM zone 38N","","","","Somalia - west of 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4205","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_410[] = {"20539","Afgooye / UTM zone 39N","","","","Somalia - east of 48 degrees East.","projected 2D","","","East","North","E","N","9001","","4205","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_411[] = {"20790","Lisbon (Lisbon)/Portuguese National Grid","Lisbon / Portuguese Grid","","","Portugal - onshore.","projected 2D","","","East","North","X","Y","9001","","4803","19936","1998-11-11 00:00:00","","EPSG","","98.42",NULL};
+datafile_rows_t horiz_cs_row_412[] = {"20822","Aratu / UTM zone 22S","","","","Brazil - coastal areas south of 2 deg 55 min South and west of 48 deg West.","projected 2D","","","East","North","E","N","9001","","4208","16122","1995-07-21 00:00:00","","EPSG","","95.191",NULL};
+datafile_rows_t horiz_cs_row_413[] = {"20823","Aratu / UTM zone 23S","","","","Brazil - coastal areas south of 2 deg 55 min South and between 48 and 42 deg West; offshore Santos basin.","projected 2D","","","East","North","E","N","9001","","4208","16123","1995-07-21 00:00:00","","EPSG","","95.191",NULL};
+datafile_rows_t horiz_cs_row_414[] = {"20824","Aratu / UTM zone 24S","","","","Brazil - coastal areas south of 2 deg 55 min South and east of 42 deg West; offshore Campos basin.","projected 2D","","","East","North","E","N","9001","","4208","16124","1995-07-21 00:00:00","","EPSG","","95.191",NULL};
+datafile_rows_t horiz_cs_row_415[] = {"20934","Arc 1950 / UTM zone 34S","","","","Botswana & Zambia - west of 24 deg East.","projected 2D","","","East","North","E","N","9001","","4209","16134","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_416[] = {"20935","Arc 1950 / UTM zone 35S","","","","Botswana - east of 24 deg East; Zambia - 24 to 30 deg East; Zimbabwe west of 30 deg East .","projected 2D","","","East","North","E","N","9001","","4209","16135","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_417[] = {"20936","Arc 1950 / UTM zone 36S","","","","Malawi; Zambia & Zimbabwe - east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4209","16136","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_418[] = {"21035","Arc 1960 / UTM zone 35S","","","","Tanzania - west of 30 deg East; Uganda south of equator and west of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16135","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_419[] = {"21036","Arc 1960 / UTM zone 36S","","","","Kenya - south of equator and west of 36 deg East; Tanzania - 30 to 36 deg East; Uganda south of equator and east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16136","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_420[] = {"21037","Arc 1960 / UTM zone 37S","","","","Kenya - south of equator and east of 36 deg East; Tanzania - east of 36 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16137","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_421[] = {"21095","Arc 1960 / UTM zone 35N","","","","Uganda north of equator and west of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16035","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_422[] = {"21096","Arc 1960 / UTM zone 36N","","","","Kenya - north of equator and west of 36 deg East; Uganda north of equator and east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16036","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_423[] = {"21097","Arc 1960 / UTM zone 37N","","","","Kenya - north of equator and east of 36 deg East.","projected 2D","","","East","North","E","N","9001","","4210","16037","1997-11-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_424[] = {"21100","Batavia (Jakarta) / NEIEZ","Batavia / NEIEZ","","","Indonesia - Java.","projected 2D","","","East","North","X","Y","9001","","4813","19905","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_425[] = {"21148","Batavia / UTM zone 48S","","","","Indonesia - Java west of 108 deg East.","projected 2D","","","East","North","E","N","9001","","4211","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_426[] = {"21149","Batavia / UTM zone 49S","","","","Indonesia - Java between 108 and 114 deg East.","projected 2D","","","East","North","E","N","9001","","4211","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_427[] = {"21150","Batavia / UTM zone 50S","","","","Indonesia - Java east of 114 deg East.","projected 2D","","","East","North","E","N","9001","","4211","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_428[] = {"21291","Barbados 1938 / British West Indies Grid","Barbados 1938 / BWI Grid","","","Barbados","projected 2D","","","East","North","E","N","9001","","4212","19942","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","Superseded by Barbados National Grid (code 21292) from 1983.","",NULL};
+datafile_rows_t horiz_cs_row_429[] = {"21292","Barbados 1938 / Barbados National Grid","Barbados NationaI Grid","","","Barbados","projected 2D","","","East","North","E","N","9001","","4212","19943","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","Supersedes Barbados 1938 / BWI Grid (code 21291) from 1983.","",NULL};
+datafile_rows_t horiz_cs_row_430[] = {"21413","Beijing 1954 / Gauss-Kruger zone 13","Beijing / Gauss zone 13","","","China - west of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16213","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_431[] = {"21414","Beijing 1954 / Gauss-Kruger zone 14","Beijing / Gauss zone 14","","","China - 78 deg East  to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16214","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_432[] = {"21415","Beijing 1954 / Gauss-Kruger zone 15","Beijing / Gauss zone 15","","","China - 84 deg East  to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16215","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_433[] = {"21416","Beijing 1954 / Gauss-Kruger zone 16","Beijing / Gauss zone 16","","","China - 90 deg East  to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16216","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_434[] = {"21417","Beijing 1954 / Gauss-Kruger zone 17","Beijing / Gauss zone 17","","","China - 96 deg East  to 102eg E","projected 2D","","","North","East","X","Y","9001","","4214","16217","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_435[] = {"21418","Beijing 1954 / Gauss-Kruger zone 18","Beijing / Gauss zone 18","","","China - 102 deg East  to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16218","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_436[] = {"21419","Beijing 1954 / Gauss-Kruger zone 19","Beijing / Gauss zone 19","","","China - 108 deg East  to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16219","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_437[] = {"21420","Beijing 1954 / Gauss-Kruger zone 20","Beijing / Gauss zone 20","","","China - 114 deg East  to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16220","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_438[] = {"21421","Beijing 1954 / Gauss-Kruger zone 21","Beijing / Gauss zone 21","","","China - 120 deg East  to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16221","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_439[] = {"21422","Beijing 1954 / Gauss-Kruger zone 22","Beijing / Gauss zone 22","","","China - 126 deg East  to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16222","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_440[] = {"21423","Beijing 1954 / Gauss-Kruger zone 23","Beijing / Gauss zone 23","","","China - east of 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16223","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_441[] = {"21473","Beijing 1954 / Gauss-Kruger 13N","Beijing / Gauss 13N","","","China - west of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16313","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_442[] = {"21474","Beijing 1954 / Gauss-Kruger 14N","Beijing / Gauss 14N","","","China - 78 deg East  to 84 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16314","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_443[] = {"21475","Beijing 1954 / Gauss-Kruger 15N","Beijing / Gauss 15N","","","China - 84 deg East  to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16315","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_444[] = {"21476","Beijing 1954 / Gauss-Kruger 16N","Beijing / Gauss 16N","","","China - 90 deg East  to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16316","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_445[] = {"21477","Beijing 1954 / Gauss-Kruger 17N","Beijing / Gauss 17N","","","China - 96 deg East  to 102eg E","projected 2D","","","North","East","X","Y","9001","","4214","16317","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_446[] = {"21478","Beijing 1954 / Gauss-Kruger 18N","Beijing / Gauss 18N","","","China - 102 deg East  to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16318","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_447[] = {"21479","Beijing 1954 / Gauss-Kruger 19N","Beijing / Gauss 19N","","","China - 108 deg East  to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16319","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_448[] = {"21480","Beijing 1954 / Gauss-Kruger 20N","Beijing / Gauss 20N","","","China - 114 deg East  to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16320","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_449[] = {"21481","Beijing 1954 / Gauss-Kruger 21N","Beijing / Gauss 21N","","","China - 120 deg East  to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16321","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_450[] = {"21482","Beijing 1954 / Gauss-Kruger 22N","Beijing / Gauss 22N","","","China - 126 deg East  to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16322","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_451[] = {"21483","Beijing 1954 / Gauss-Kruger 23N","Beijing / Gauss 23N","","","China - east of 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4214","16323","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_452[] = {"21500","Belge 1950 (Brussels) / Belge Lambert 50","Belge Lambert 50","","","Belgium - onshore.","projected 2D","","","East","North","X","Y","9001","","4809","19901","1997-04-11 00:00:00","","EPSG","Superseded by 31300 (Belge 1972 / Belge Lambert 72).","97.13",NULL};
+datafile_rows_t horiz_cs_row_453[] = {"21780","Bern 1898 (Bern) / LV03C","LV03C","","","Liechtenstein.  Switzerland.","projected 2D","","","East","North","Y","X","9001","","4801","19923","1997-06-30 00:00:00","","EPSG","Superseded by CH1903 / LV03 (code 21781).","97.27  97.62",NULL};
+datafile_rows_t horiz_cs_row_454[] = {"21781","CH1903 / LV03","LV03","","","Liechtenstein; Switzerland.","projected 2D","","","East","North","Y","X","9001","","4149","19922","1999-10-20 00:00:00","","EPSG","Supersedes LV03C (code 21780).  Superseded by CH1903+/LV95 (code 256).","",NULL};
+datafile_rows_t horiz_cs_row_455[] = {"21817","Bogota / UTM zone 17N","","","","Colombia - offshore west of 78 deg W of Greenwich.","projected 2D","","","East","North","E","N","9001","","4218","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_456[] = {"21818","Bogota / UTM zone 18N","","","","Colombia - offshore east of 78 deg W of Greenwich.","projected 2D","","","East","North","E","N","9001","","4218","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_457[] = {"21891","Bogota / Colombia West zone","Bogota / Colombia 3W","","","Colombia - west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18051","1997-11-13 00:00:00","","EPSG","","97.11  97.57",NULL};
+datafile_rows_t horiz_cs_row_458[] = {"21892","Bogota / Colombia Bogota zone","Bogota / Colombia Bogota","","","Colombia - 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18052","1997-11-13 00:00:00","","EPSG","","97.11  97.57",NULL};
+datafile_rows_t horiz_cs_row_459[] = {"21893","Bogota / Colombia East Central zone","Bogota / Colombia 3E","","","Colombia - 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18053","1997-11-13 00:00:00","","EPSG","","97.11  97.57",NULL};
+datafile_rows_t horiz_cs_row_460[] = {"21894","Bogota / Colombia East","Bogota / Colombia 6E","","","Colombia - east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).","projected 2D","","","East","North","X","Y","9001","","4218","18054","1997-11-13 00:00:00","","EPSG","","97.11  97.57",NULL};
+datafile_rows_t horiz_cs_row_461[] = {"22032","Camacupa / UTM zone 32S","","","","Angola - west of 12 deg East.","projected 2D","","","East","North","E","N","9001","","4220","16132","1997-11-13 00:00:00","","EPSG","","97.58",NULL};
+datafile_rows_t horiz_cs_row_462[] = {"22033","Camacupa / UTM zone 33S","","","","Angola - east of 12 deg East.","projected 2D","","","East","North","E","N","9001","","4220","16133","1997-11-13 00:00:00","","EPSG","","97.58",NULL};
+datafile_rows_t horiz_cs_row_463[] = {"22091","Camacupa / TM 11.30 SE","","","","Angola - offshore.","projected 2D","","","East","North","E","N","9001","","4220","16611","1998-11-11 00:00:00","Esso Angola","EPSG","Used by Esso Angola for offshore blocks 15 and 24.","",NULL};
+datafile_rows_t horiz_cs_row_464[] = {"22092","Camacupa / TM 12 SE","","","","Angola - offshore.","projected 2D","","","East","North","E","N","9001","","4220","16612","1998-11-11 00:00:00","Shell Angola","EPSG","Used by Shell Angola for offshore blocks 1 and 16.  Used by BP Amoco, Elf and Esso for offshore blocks 31-33.","",NULL};
+datafile_rows_t horiz_cs_row_465[] = {"22191","Campo Inchauspe / Argentina 1","C Inchauspe /Argentina 1","","","Argentina - west of 70 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18031","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_466[] = {"22192","Campo Inchauspe / Argentina 2","C Inchauspe /Argentina 2","","","Argentina - between 70 deg 30 min and 67 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18032","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_467[] = {"22193","Campo Inchauspe / Argentina 3","C Inchauspe /Argentina 3","","","Argentina - between 67 deg 30 min and 64 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18033","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_468[] = {"22194","Campo Inchauspe / Argentina 4","C Inchauspe /Argentina 4","","","Argentina - between 64 deg 30 min and 61 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18034","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_469[] = {"22195","Campo Inchauspe / Argentina 5","C Inchauspe /Argentina 5","","","Argentina - between 61 deg 30 min and 58 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18035","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_470[] = {"22196","Campo Inchauspe / Argentina 6","C Inchauspe /Argentina 6","","","Argentina - between 58 deg 30 min and 55 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18036","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_471[] = {"22197","Campo Inchauspe / Argentina 7","C Inchauspe /Argentina 7","","","Argentina - east of 55 deg 30 min West.","projected 2D","","","North","East","X","Y","9001","","4221","18037","1999-11-15 00:00:00","","EPSG","","97.72",NULL};
+datafile_rows_t horiz_cs_row_472[] = {"22234","Cape / UTM zone 34S","","","","Botswana - west of 21deg East.","projected 2D","","","East","North","E","N","9001","","4222","16134","1995-12-08 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_473[] = {"22235","Cape / UTM zone 35S","","","","Botswana - east of 27deg East.","projected 2D","","","East","North","E","N","9001","","4222","16135","1995-12-08 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_474[] = {"22236","Cape / UTM zone 36S","","","","Botswana - between 21 and 27deg East.","projected 2D","","","East","North","E","N","9001","","4222","16136","1995-12-08 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_475[] = {"22275","South African Coordinate System zone 15","South African CS zone 15","","","South Africa - Walvis Bay.","projected 2D","","","West","South","W","S","9001","","4222","17515","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_476[] = {"22277","South African Coordinate System zone 17","South African CS zone 17","","","South Africa - west of 18 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17517","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_477[] = {"22279","South African Coordinate System zone 19","South African CS zone 19","","","South Africa - 18 to 20 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17519","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_478[] = {"22281","South African Coordinate System zone 21","South African CS zone 21","","","South Africa - 20 to 22 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17521","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_479[] = {"22283","South African Coordinate System zone 23","South African CS zone 23","","","South Africa - 22 to 24 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17523","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_480[] = {"22285","South African Coordinate System zone 25","South African CS zone 25","","","Lestho  - west of 26 deg East; South Africa - 24 to 26 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17525","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_481[] = {"22287","South African Coordinate System zone 27","South African CS zone 27","","","Lestho  - east of 26 deg East;  South Africa - 26 to 28 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17527","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_482[] = {"22289","South African Coordinate System zone 29","South African CS zone 29","","","South Africa - 28 to 30 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17529","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_483[] = {"22291","South African Coordinate System zone 31","South African CS zone 31","","","South Africa - 30 to 32 deg East;  Swaziland.","projected 2D","","","West","South","W","S","9001","","4222","17531","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_484[] = {"22293","South African Coordinate System zone 33","South African CS zone 33","","","South Africa - east of 32 deg East.","projected 2D","","","West","South","W","S","9001","","4222","17533","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_485[] = {"22300","Carthage (Paris) / Tunisia Mining Grid","Tunisia Mining Grid","","","Tunisia - onshore.","projected 2D","","","East","North","X","Y","9036","","4816","19937","1998-11-11 00:00:00","","EPSG","CAUTION: Carthage datum did not exist when the 1953 decree was issued and an inference is that grid should be applied to the Voirol 1875 geogCS.  Common practice assumes that the current Tunisian geodetic datum of Carthage applies.","",NULL};
+datafile_rows_t horiz_cs_row_486[] = {"22332","Carthage / UTM zone 32N","","","","Tunisia - offshore.","projected 2D","","","East","North","X","Y","9001","","4223","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_487[] = {"22391","Carthage / Nord Tunisie","","","","Tunisia - north of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4223","18181","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_488[] = {"22392","Carthage / Sud Tunisie","","","","Tunisia - south of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4223","18182","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_489[] = {"22523","Corrego Alegre / UTM zone 23S","Corrego Alegre / UTM 23S","","","Brazil - NE coastal area between 45 deg W and 42 deg W.","projected 2D","","","East","North","E","N","9001","","4225","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_490[] = {"22524","Corrego Alegre / UTM zone 24S","Corrego Alegre / UTM 24S","","","Brazil - NE coastal area between 42 deg W and 40 deg W.","projected 2D","","","East","North","E","N","9001","","4225","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_491[] = {"22700","Deir ez Zor / Levant Zone","","","","Syrian Arab Republic west of 39 deg E.","projected 2D","","","East","North","X","Y","9001","","4227","19940","1999-04-22 00:00:00","","EPSG","Superseded by Deir ez Zor / Syria Lambert (EPSG code 22770) from 1973.","",NULL};
+datafile_rows_t horiz_cs_row_492[] = {"22770","Deir ez Zor / Syria Lambert","","","","Syrian Arab Republic","projected 2D","","","East","North","X","Y","9001","","4227","19948","1999-10-20 00:00:00","","EPSG","Supersedes Deir ez Zor / Levant zone (EPSG code 22700) from 1973.","",NULL};
+datafile_rows_t horiz_cs_row_493[] = {"22832","Douala / UTM zone 32N","","","","Cameroon.","projected 2D","","","East","North","E","N","9001","","4228","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_494[] = {"22991","Egypt 1907 / Blue Belt","","","","Egypt  - Sinai peninsula.","projected 2D","","","East","North","E","N","9001","","4229","18071","1999-04-22 00:00:00","","EPSG","Also known as Egypt 1907 / Green Belt.    Oil industry usually uses Egypt 1907 / Red Belt rather than this projected CS.","",NULL};
+datafile_rows_t horiz_cs_row_495[] = {"22992","Egypt 1907 / Red Belt","","","","Egypt  - east of 29 deg East.","projected 2D","","","East","North","E","N","9001","","4229","18072","1995-06-02 00:00:00","","EPSG","See also Egypt 1907 / Blue Belt for non oil industry usage in Sinai peninsula.","",NULL};
+datafile_rows_t horiz_cs_row_496[] = {"22993","Egypt 1907 / Purple Belt","","","","Egypt -  west of 29 deg E; north of approx 28 deg 11 min North.","projected 2D","","","East","North","E","N","9001","","4229","18073","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_497[] = {"22994","Egypt 1907 / Extended Purple Belt","Egypt 1907 / Ext. Purple","","","Egypt  - west of 29 deg E; south of approx 28 deg 11 min North.","projected 2D","","","East","North","E","N","9001","","4229","18074","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_498[] = {"23028","ED50 / UTM zone 28N","","","","Europe - 18deg West to 12deg West - Ireland offshore; United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4230","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_499[] = {"23029","ED50 / UTM zone 29N","","","","Europe - 12deg West to 6deg West - Portugal; Spain; Ireland offshore; United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4230","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_500[] = {"23030","ED50 / UTM zone 30N","","","","Europe - 6deg West to 0deg - Spain; France offshore; Ireland offshore; United Kingdom - UKCS offshore - North Sea west of 0 deg East).","projected 2D","","","East","North","E","N","9001","","4230","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_501[] = {"23031","ED50 / UTM zone 31N","","","","Europe - 0deg to 6deg East - Denmark (North Sea); Germany offshore; Netherlands offshore; Norway; United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4230","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_502[] = {"23032","ED50 / UTM zone 32N","","","","Europe - 6deg East  to 12deg East - Denmark; Germany offshore; Netherlands offshore; Norway.","projected 2D","","","East","North","E","N","9001","","4230","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_503[] = {"23033","ED50 / UTM zone 33N","","","","Europe - 12deg East  to 18deg East - Denmark including Bornholm; Norway.","projected 2D","","","East","North","E","N","9001","","4230","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_504[] = {"23034","ED50 / UTM zone 34N","","","","Europe - 18deg East  to 24deg East - Greece; Norway.","projected 2D","","","East","North","E","N","9001","","4230","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_505[] = {"23035","ED50 / UTM zone 35N","","","","Europe - 24deg East  to 30deg East - Greece; Norway; Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_506[] = {"23036","ED50 / UTM zone 36N","","","","Europe - 30deg East  to 36deg East - Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_507[] = {"23037","ED50 / UTM zone 37N","","","","Europe - 36deg East  to 42deg East - Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_508[] = {"23038","ED50 / UTM zone 38N","","","","Europe - 42deg East  to 48deg East - Turkey.","projected 2D","","","East","North","E","N","9001","","4230","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_509[] = {"23090","ED50 / TM 0 N","","","","United Kingdom (UKCS) - offshore North Sea.","projected 2D","","","East","North","E","N","9001","","4230","16400","1998-11-11 00:00:00","Shell UK","EPSG","Used by Shell UK for North Sea","",NULL};
+datafile_rows_t horiz_cs_row_510[] = {"23095","ED50 / TM 5 NE","","","","Netherlands - offshore North Sea.","projected 2D","","","East","North","E","N","9001","","4230","16405","1998-11-11 00:00:00","NAM","EPSG","Used by NAM","",NULL};
+datafile_rows_t horiz_cs_row_511[] = {"23239","Fahud / UTM zone 39N","","","","Oman - west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4232","16039","1995-06-02 00:00:00","","EPSG","Since 1993 superseded by PSD93 / UTM zone 39N projCS (code 3439). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_512[] = {"23240","Fahud / UTM zone 40N","","","","Oman - east of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4232","16040","1995-06-02 00:00:00","","EPSG","Since 1993 superseded by PSD93 / UTM zone 40N projCS (code 3440). Maximum differences to Fahud adjustment are 20 metres.","",NULL};
+datafile_rows_t horiz_cs_row_513[] = {"23433","Garoua / UTM zone 33N","","","","Cameroon.","projected 2D","","","East","North","E","N","9001","","4234","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_514[] = {"23700","HD72 / EOV","","","","Hungary","projected 2D","","","East","North","Y","X","9001","","4237","19931","1997-07-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_515[] = {"23846","ID74 / UTM zone 46N","","","","Indonesia - north of equator and west of 96 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16046","1995-08-08 00:00:00","","EPSG","","95.193  95.20",NULL};
+datafile_rows_t horiz_cs_row_516[] = {"23847","ID74 / UTM zone 47N","","","","Indonesia - north of equator and between 96 deg and 102 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16047","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_517[] = {"23848","ID74 / UTM zone 48N","","","","Indonesia - north of equator and between 102 deg and 108 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16048","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_518[] = {"23849","ID74 / UTM zone 49N","","","","Indonesia - north of equator and between 108 deg and 114 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16049","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_519[] = {"23850","ID74 / UTM zone 50N","","","","Indonesia - north of equator and between 114 deg and 120 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16050","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_520[] = {"23851","ID74 / UTM zone 51N","","","","Indonesia - north of equator and between 120 deg and 126 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16051","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_521[] = {"23852","ID74 / UTM zone 52N","","","","Indonesia - north of equator and between 126 deg and 132 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16052","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_522[] = {"23853","ID74 / UTM zone 53N","","","","Indonesia - north of equator and east of 132 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16053","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_523[] = {"23886","ID74 / UTM zone 46S","","","","Indonesia - south of equator and west of 96 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16146","1995-08-08 00:00:00","","EPSG","","95.193  95.20",NULL};
+datafile_rows_t horiz_cs_row_524[] = {"23887","ID74 / UTM zone 47S","","","","Indonesia - south of equator and between 96 deg and 102 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16147","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_525[] = {"23888","ID74 / UTM zone 48S","","","","Indonesia - south of equator and between 102 deg and 108 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16148","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_526[] = {"23889","ID74 / UTM zone 49S","","","","Indonesia - south of equator and between 108 deg and 114 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16149","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_527[] = {"23890","ID74 / UTM zone 50S","","","","Indonesia - south of equator and between 114 deg and 120 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16150","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_528[] = {"23891","ID74 / UTM zone 51S","","","","Indonesia - south of equator and between 120 deg and 126 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16151","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_529[] = {"23892","ID74 / UTM zone 52S","","","","Indonesia - south of equator and between 126 deg and 132 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16152","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_530[] = {"23893","ID74 / UTM zone 53S","","","","Indonesia - south of equator and between 132 deg and 138 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16153","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_531[] = {"23894","ID74 / UTM zone 54S","","","","Indonesia - south of equator and east of 138 deg East.","projected 2D","","","East","North","E","N","9001","","4238","16154","1995-07-21 00:00:00","","EPSG","","95.193",NULL};
+datafile_rows_t horiz_cs_row_532[] = {"23946","Indian 1954 / UTM zone 46N","Indian 1954 / UTM 46N","","","Myanmar (Burma) - west of 96 deg East.","projected 2D","","","East","North","E","N","9001","","4239","16046","1998-06-13 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_533[] = {"23947","Indian 1954 / UTM zone 47N","Indian 1954 / UTM 47N","","","Myanmar (Burma) - east of 96 deg East; Thailand - west of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4239","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_534[] = {"23948","Indian 1954 / UTM zone 48N","Indian 1954 / UTM 48N","","","Thailand - east of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4239","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_535[] = {"24047","Indian 1975 / UTM zone 47N","Indian 1975 / UTM 47N","","","Thailand - west of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4240","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_536[] = {"24048","Indian 1975 / UTM zone 48N","Indian 1975 / UTM 48N","","","Thailand - east of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4240","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_537[] = {"24100","Jamaica 1875 / Jamaica (Old Grid)","Jamaica 1875 / Old Grid","","","Jamaica.","projected 2D","","","East","North","E","N","9005","","4241","19909","1995-06-02 00:00:00","","EPSG","Superseded by 24200 (JAD69 / Jamaica National Grid).","",NULL};
+datafile_rows_t horiz_cs_row_538[] = {"24200","JAD69 / Jamaica National Grid","JAD69 / Jamaica Grid","","","Jamaica.","projected 2D","","","East","North","E","N","9001","","4242","19910","1995-06-02 00:00:00","","EPSG","Supersedes 24100 (JAD69 / Jamaica National Grid).","",NULL};
+datafile_rows_t horiz_cs_row_539[] = {"24305","Kalianpur 1937 / UTM zone 45N","Kalianpur 37 / UTM 45N","","","Bangladesh - west of 90deg East.","projected 2D","","","East","North","E","N","9001","","4144","16045","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_540[] = {"24306","Kalianpur 1937 / UTM zone 46N","Kalianpur 37 / UTM 46N","","","Bangladesh - east of 90deg East.","projected 2D","","","East","North","E","N","9001","","4144","16046","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_541[] = {"24311","Kalianpur 1962 / UTM zone 41N","Kalianpur 62 / UTM 41N","","","Pakistan - west of 66deg East.","projected 2D","","","East","North","E","N","9001","","4145","16041","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_542[] = {"24312","Kalianpur 1962 / UTM zone 42N","Kalianpur 62 / UTM 42N","","","Pakistan - between 66 and 72deg East.","projected 2D","","","East","North","E","N","9001","","4145","16042","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_543[] = {"24313","Kalianpur 1962 / UTM zone 43N","Kalianpur 62 / UTM 43N","","","Pakistan - east of 72deg East.","projected 2D","","","East","North","E","N","9001","","4145","16043","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_544[] = {"24342","Kalianpur 1975 / UTM zone 42N","Kalianpur 75 / UTM 42N","","","India - west of 72deg East.","projected 2D","","","East","North","E","N","9001","","4146","16042","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_545[] = {"24343","Kalianpur 1975 / UTM zone 43N","Kalianpur 75 / UTM 43N","","","India - between 72 and 78deg East.","projected 2D","","","East","North","E","N","9001","","4146","16043","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_546[] = {"24344","Kalianpur 1975 / UTM zone 44N","Kalianpur 75 / UTM 44N","","","India - between 78 and 84deg East.","projected 2D","","","East","North","E","N","9001","","4146","16044","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_547[] = {"24345","Kalianpur 1975 / UTM zone 45N","Kalianpur 75 / UTM 45N","","","India - between 84 and 90deg East.","projected 2D","","","East","North","E","N","9001","","4146","16045","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_548[] = {"24346","Kalianpur 1975 / UTM zone 46N","Kalianpur 75 / UTM 46N","","","India - between 90 and 96deg East.","projected 2D","","","East","North","E","N","9001","","4146","16046","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_549[] = {"24347","Kalianpur 1975 / UTM zone 47N","Kalianpur 75 / UTM 47N","","","India - east of 96deg East.","projected 2D","","","East","North","E","N","9001","","4146","16047","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_550[] = {"24370","Kalianpur 1880 / India zone 0","Kalianpur / India 0","","","Pakistan north of 35 deg 35 min North.","projected 2D","","","East","North","E","N","9084","","4243","18110","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_551[] = {"24371","Kalianpur 1880 / India zone I","Kalianpur / India I","","","India north of 28 deg North; Pakistan 28 deg to 35 deg 35 min North.","projected 2D","","","East","North","E","N","9084","","4243","18111","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_552[] = {"24372","Kalianpur 1880 / India zone IIa","Kalianpur / India IIa","","","India - between 21 deg and 28 deg North and  west of 82 deg East; Pakistan - south of 28 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18112","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_553[] = {"24373","Kalianpur 1880 / India zone III","Kalianpur / India III","","","India - between 15 deg and 21 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18114","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_554[] = {"24374","Kalianpur 1880 / India zone IV","Kalianpur / India IV","","","India - south of 15 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18116","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_555[] = {"24375","Kalianpur 1937 / India zone IIb","Kalianpur 37 / India IIb","","","Bangladesh.","projected 2D","","","East","North","E","N","9001","","4144","18238","1999-10-20 00:00:00","","EPSG","Used by Bangladesh since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and Benoit's 1895 British inch-metre ratio of 39.370115 rounded as Ind ft = 0.30479841m exactly.","97.23",NULL};
+datafile_rows_t horiz_cs_row_556[] = {"24376","Kalianpur 1962 / India zone I","Kalianpur 62 / India I","","","Pakistan - north of 28deg North.","projected 2D","","","East","North","E","N","9001","","4145","18236","1999-10-20 00:00:00","","EPSG","Used by Pakistan since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exac [...]
+datafile_rows_t horiz_cs_row_557[] = {"24377","Kalianpur 1962 / India zone IIa","Kalianpur 62 / India IIa","","","Pakistan - south of 28deg North.","projected 2D","","","East","North","E","N","9001","","4145","18237","1999-10-20 00:00:00","","EPSG","Used by Pakistan since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m  [...]
+datafile_rows_t horiz_cs_row_558[] = {"24378","Kalianpur 1975 / India zone I","Kalianpur 75 / India I","","","India - north of 28deg North and west of 82deg East.","projected 2D","","","East","North","E","N","9001","","4146","18231","1999-10-20 00:00:00","","EPSG","Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","97.23 [...]
+datafile_rows_t horiz_cs_row_559[] = {"24379","Kalianpur 1975 / India zone IIa","Kalianpur 75 / India IIa","","","India - between 28deg and 21deg North and west of 82deg East.","projected 2D","","","East","North","E","N","9001","","4146","18232","1999-10-20 00:00:00","","EPSG","Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exa [...]
+datafile_rows_t horiz_cs_row_560[] = {"24380","Kalianpur 1975 / India zone IIb","Kalianpur 75 / India IIb","","","India - north of 21deg North and east of 82deg East.","projected 2D","","","East","North","E","N","9001","","4146","18235","1999-10-20 00:00:00","","EPSG","Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","9 [...]
+datafile_rows_t horiz_cs_row_561[] = {"24381","Kalianpur 1975 / India zone III","Kalianpur 75 / India III","","","India - between 21deg and 15deg North.","projected 2D","","","East","North","E","N","9001","","4146","18233","1999-10-20 00:00:00","","EPSG","Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","97.23",NULL};
+datafile_rows_t horiz_cs_row_562[] = {"24382","Kalianpur 1880 / India zone IIb","Kalianpur / India IIb","","","Bangladesh; India - north of 22 deg North and east of 82 deg East; Myanmar (Burma) - north of 22 deg North.","projected 2D","","","East","North","E","N","9084","","4243","18113","1999-10-20 00:00:00","","EPSG","","97.23",NULL};
+datafile_rows_t horiz_cs_row_563[] = {"24383","Kalianpur 1975 / India zone IV","Kalianpur 75 / India IV","","","India - south of 21deg North.","projected 2D","","","East","North","E","N","9001","","4146","18234","1999-10-20 00:00:00","","EPSG","Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.","97.23",NULL};
+datafile_rows_t horiz_cs_row_564[] = {"24500","Kertau / Singapore Grid","","","","Singapore.","projected 2D","","","East","North","E","N","9001","","4245","19920","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_565[] = {"24547","Kertau / UTM zone 47N","","","","Malaysia - West Malaysia west of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4245","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_566[] = {"24548","Kertau / UTM zone 48N","","","","Malaysia - West Malaysia east of 102 deg East.","projected 2D","","","East","North","E","N","9001","","4245","16048","1995-07-21 00:00:00","","EPSG","","95.192",NULL};
+datafile_rows_t horiz_cs_row_567[] = {"24571","Kertau / R.S.O. Malaya (ch)","","","","Malaysia - West Malaysia","projected 2D","","","East","North","E","N","9062","","4245","19935","1999-10-20 00:00:00","","EPSG","Adopts metric conversion of 39.370113 inches per metre.","97.231",NULL};
+datafile_rows_t horiz_cs_row_568[] = {"24600","KOC Lambert","","","","Kuwait.","projected 2D","","","East","North","E","N","9001","","4246","19906","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_569[] = {"24718","La Canoa / UTM zone 18N","","","","Venezuela - west of 72 deg West.","projected 2D","","","East","North","E","N","9001","","4247","16018","1999-10-20 00:00:00","","EPSG","Sometimes referred to as PSAD56 / UTM zone 18N.","",NULL};
+datafile_rows_t horiz_cs_row_570[] = {"24719","La Canoa / UTM zone 19N","","","","Venezuela - between 72 and 66 deg West.","projected 2D","","","East","North","E","N","9001","","4247","16019","1999-10-20 00:00:00","","EPSG","Sometimes referred to as PSAD56 / UTM zone 19N.","",NULL};
+datafile_rows_t horiz_cs_row_571[] = {"24720","La Canoa / UTM zone 20N","","","","Venezuela - east of 66 deg West.","projected 2D","","","East","North","E","N","9001","","4247","16020","1995-06-02 00:00:00","","EPSG","Sometimes referred to as PSAD56 / UTM zone 20N.","",NULL};
+datafile_rows_t horiz_cs_row_572[] = {"24818","PSAD56 / UTM zone 18N","","","","South America (Ecuador;  [Venezuela]) 78deg West to 72deg West.","projected 2D","","","East","North","E","N","9001","","4248","16018","1995-06-02 00:00:00","","EPSG","In Venezuela also known as La Canoa / UTM zone 18N.","",NULL};
+datafile_rows_t horiz_cs_row_573[] = {"24819","PSAD56 / UTM zone 19N","","","","South America (Netherlands Antilles; [Venezuela]) 72deg West  to 66deg West.","projected 2D","","","East","North","E","N","9001","","4248","16019","1995-06-02 00:00:00","","EPSG","In Venezuela also known as La Canoa / UTM zone 19N.","",NULL};
+datafile_rows_t horiz_cs_row_574[] = {"24820","PSAD56 / UTM zone 20N","","","","South America (Guyana; [Venezuela]) 66deg West  to 60deg West.","projected 2D","","","East","North","E","N","9001","","4248","16020","1995-06-02 00:00:00","","EPSG","In Venezuela also known as La Canoa / UTM zone 20N.","",NULL};
+datafile_rows_t horiz_cs_row_575[] = {"24821","PSAD56 / UTM zone 21N","","","","South America (Guyana; Suriname) 60deg West  to 54deg West.","projected 2D","","","East","North","E","N","9001","","4248","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_576[] = {"24877","PSAD56 / UTM zone 17S","","","","South America (Chile; Ecuador; Peru) 84deg West  to 78deg West.","projected 2D","","","East","North","E","N","9001","","4248","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_577[] = {"24878","PSAD56 / UTM zone 18S","","","","South America (Chile; Ecuador; Peru) 78deg West  to 72deg West.","projected 2D","","","East","North","E","N","9001","","4248","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_578[] = {"24879","PSAD56 / UTM zone 19S","","","","South America (Bolivia; Chile; Peru) 72deg West  to 66deg West.","projected 2D","","","East","North","E","N","9001","","4248","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_579[] = {"24880","PSAD56 / UTM zone 20S","","","","South America (Bolivia) 66deg West  to 60deg West.","projected 2D","","","East","North","E","N","9001","","4248","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_580[] = {"24882","PSAD56 / UTM zone 22S","","","","Brazil - offshore Amazon Cone","projected 2D","","","East","North","E","N","9001","","4248","16122","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_581[] = {"24891","PSAD56 / Peru west zone","","","","Peru west of 79 deg West.","projected 2D","","","East","North","X","Y","9001","","4248","18161","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_582[] = {"24892","PSAD56 / Peru central zone","PSAD56 / Peru central","","","Peru 79 to 73 deg West.","projected 2D","","","East","North","X","Y","9001","","4248","18162","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_583[] = {"24893","PSAD56 / Peru east zone","","","","Peru east of 73 deg West.","projected 2D","","","East","North","X","Y","9001","","4248","18163","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_584[] = {"25000","Leigon / Ghana Metre Grid","Leigon / Ghana Grid","","","Ghana.","projected 2D","","","East","North","E","N","9001","","4250","19904","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_585[] = {"25231","Lome / UTM zone 31N","","","","Togo.","projected 2D","","","East","North","E","N","9001","","4252","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_586[] = {"25391","Luzon 1911 / Philippines zone I","Luzon / Philippines I","","","Philippines - west of 118 deg East.","projected 2D","","","East","North","X","Y","9001","","4253","18171","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_587[] = {"25392","Luzon 1911 / Philippines zone II","Luzon / Philippines II","","","Philippines - Palawan; Calamian Islands.","projected 2D","","","East","North","X","Y","9001","","4253","18172","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_588[] = {"25393","Luzon 1911 / Philippines zone III","Luzon / Philippines III","","","Philippines - Luzon (except SE part;); Mindoro.","projected 2D","","","East","North","X","Y","9001","","4253","18173","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_589[] = {"25394","Luzon 1911 / Philippines zone IV","Luzon / Philippines IV","","","Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; west Mindanao.","projected 2D","","","East","North","X","Y","9001","","4253","18174","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_590[] = {"25395","Luzon 1911 / Philippines zone V","Luzon / Philippines V","","","Philippines - east Mindanao; Bohol; Samar.","projected 2D","","","East","North","X","Y","9001","","4253","18175","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_591[] = {"25700","Makassar (Jakarta) / NEIEZ","Makassar / NEIEZ","","","Indonesia - south west Sulawesi.","projected 2D","","","East","North","X","Y","9001","","4804","19905","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_592[] = {"25828","ETRF89 / UTM zone 28N","","","","Europe - 18deg West to 12deg West - United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4258","16028","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_593[] = {"25829","ETRF89 / UTM zone 29N","","","","Europe - 12deg West to 6deg West - United Kingdom (UKCS) offshore.","projected 2D","","","East","North","E","N","9001","","4258","16029","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_594[] = {"25830","ETRF89 / UTM zone 30N","","","","Europe - 6deg West to 0deg.","projected 2D","","","East","North","E","N","9001","","4258","16030","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_595[] = {"25831","ETRF89 / UTM zone 31N","","","","Europe - 0deg to 6deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16031","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_596[] = {"25832","ETRF89 / UTM zone 32N","","","","Europe - 6deg East  to 12deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16032","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_597[] = {"25833","ETRF89 / UTM zone 33N","","","","Europe - 12deg East  to 18deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16033","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_598[] = {"25834","ETRF89 / UTM zone 34N","","","","Europe - 18deg East  to 24deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16034","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_599[] = {"25835","ETRF89 / UTM zone 35N","","","","Europe - 24deg East  to 30deg East - Norway.","projected 2D","","","East","North","E","N","9001","","4258","16035","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_600[] = {"25836","ETRF89 / UTM zone 36N","","","","Europe - 30deg East  to 36deg East.","projected 2D","","","East","North","E","N","9001","","4258","16036","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_601[] = {"25837","ETRF89 / UTM zone 37N","","","","Europe - 36deg East  to 42deg East.","projected 2D","","","East","North","E","N","9001","","4258","16037","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_602[] = {"25838","ETRF89 / UTM zone 38N","","","","Europe - 42deg East  to 48deg East.","projected 2D","","","East","North","E","N","9001","","4258","16038","1999-04-22 00:00:00","","EPSG","","99.11",NULL};
+datafile_rows_t horiz_cs_row_603[] = {"25884","ETRF89 / TM Baltic93","","","","Estonia;  Latvia;  Lithuania.","projected 2D","","","North","East","X","Y","9001","","4258","19939","1999-04-22 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Used as a common coordinate system for the Baltic states and for medium and small scale mapping in Estonia since 1993.","99.11",NULL};
+datafile_rows_t horiz_cs_row_604[] = {"25932","Malongo 1987 / UTM zone 32S","Malongo 1987 / UTM 32S","","","Angola - Cabinda.","projected 2D","","","East","North","E","N","9001","","4259","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_605[] = {"26191","Merchich / Nord Maroc","","","","Morocco north of 35 grads (31 deg 30 min) North.","projected 2D","","","East","North","X","Y","9001","","4261","18131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_606[] = {"26192","Merchich / Sud Maroc","","","","Morocco 31grads to 35grads  (27 deg 54 min to 31 deg 30 min) North.","projected 2D","","","East","North","X","Y","9001","","4261","18132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_607[] = {"26193","Merchich / Sahara","","","","Morocco south of 31grads  (27 deg 54 min) North.","projected 2D","","","East","North","X","Y","9001","","4261","18133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_608[] = {"26237","Massawa / UTM zone 37N","","","","Eritrea.","projected 2D","","","East","North","E","N","9001","","4262","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_609[] = {"26331","Minna / UTM zone 31N","","","","Nigeria - offshore beyond continental shelf west of 6 deg East.","projected 2D","","","East","North","E","N","9001","","4263","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_610[] = {"26332","Minna / UTM zone 32N","","","","Nigeria - offshore beyond continental shelf.","projected 2D","","","East","North","E","N","9001","","4263","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_611[] = {"26391","Minna / Nigeria West Belt","Minna / Nigeria West","","","Nigeria west of 6 deg 30 min East.","projected 2D","","","East","North","E","N","9001","","4263","18151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_612[] = {"26392","Minna / Nigeria Mid Belt","","","","Nigeria between 6 deg 30 min and 10 deg 30 min East.","projected 2D","","","East","North","E","N","9001","","4263","18152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_613[] = {"26393","Minna / Nigeria East Belt","Minna / Nigeria East","","","Nigeria east of 10 deg 30 min East.","projected 2D","","","East","North","E","N","9001","","4263","18153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_614[] = {"26432","Mhast / UTM zone 32S","","","","Angola - Cabinda.","projected 2D","","","East","North","E","N","9001","","4264","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_615[] = {"26591","Monte Mario (Rome) / Italy zone 1","Monte Mario / Italy 1","","","Italy west of 12 deg East.","projected 2D","","","East","North","X","Y","9001","","4806","18121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_616[] = {"26592","Monte Mario (Rome) / Italy zone 2","Monte Mario / Italy 2","","","Italy east of 12 deg East.","projected 2D","","","East","North","X","Y","9001","","4806","18122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_617[] = {"26632","M'poraloko / UTM zone 32N","M'poraloko / UTM 32N","","","Gabon - north of equator.","projected 2D","","","East","North","E","N","9001","","4266","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_618[] = {"26692","M'poraloko / UTM zone 32S","M'poraloko / UTM 32S","","","Gabon - south of equator.","projected 2D","","","East","North","E","N","9001","","4266","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_619[] = {"26703","NAD27 / UTM zone 3N","","","","North America - United States (USA) - Alaska - 168deg West  to 162deg West.","projected 2D","","","East","North","E","N","9001","","4267","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_620[] = {"26704","NAD27 / UTM zone 4N","","","","North America - United States (USA) - Alaska - 162deg West  to 156deg West.","projected 2D","","","East","North","E","N","9001","","4267","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_621[] = {"26705","NAD27 / UTM zone 5N","","","","North America - United States (USA) - Alaska - 156deg West  to 150deg West.","projected 2D","","","East","North","E","N","9001","","4267","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_622[] = {"26706","NAD27 / UTM zone 6N","","","","North America - United States (USA) - Alaska - 150deg West  to 144deg West.","projected 2D","","","East","North","E","N","9001","","4267","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_623[] = {"26707","NAD27 / UTM zone 7N","","","","North America - Canada; United States (USA) - Alaska - 144deg West  to 138deg West.","projected 2D","","","East","North","E","N","9001","","4267","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_624[] = {"26708","NAD27 / UTM zone 8N","","","","North America - Canada; United States (USA) - 138deg West  to 132deg West.","projected 2D","","","East","North","E","N","9001","","4267","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_625[] = {"26709","NAD27 / UTM zone 9N","","","","North America - Canada; United States (USA) - 132deg West  to 126deg West.","projected 2D","","","East","North","E","N","9001","","4267","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_626[] = {"26710","NAD27 / UTM zone 10N","","","","North America - Canada; United States (USA) - 130deg West  to 120deg West.","projected 2D","","","East","North","E","N","9001","","4267","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_627[] = {"26711","NAD27 / UTM zone 11N","","","","North America - Canada; Mexico; United States (USA) - 120deg West  to 114deg West.","projected 2D","","","East","North","E","N","9001","","4267","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_628[] = {"26712","NAD27 / UTM zone 12N","","","","North America - Canada; Mexico; United States (USA) - 114deg West  to 108deg West.","projected 2D","","","East","North","E","N","9001","","4267","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_629[] = {"26713","NAD27 / UTM zone 13N","","","","North America - Canada; Mexico; United States (USA) - 108deg West  to 102deg West.","projected 2D","","","East","North","E","N","9001","","4267","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_630[] = {"26714","NAD27 / UTM zone 14N","","","","North America - Canada; Mexico; United States (USA) - 102deg West  to 96deg West.","projected 2D","","","East","North","E","N","9001","","4267","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_631[] = {"26715","NAD27 / UTM zone 15N","","","","North America - Canada; Mexico; United States (USA) - 96deg West  to 90deg West.","projected 2D","","","East","North","E","N","9001","","4267","16015","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 15N (code 227).","",NULL};
+datafile_rows_t horiz_cs_row_632[] = {"26716","NAD27 / UTM zone 16N","","","","North America - Canada; Mexico; United States (USA) - 90deg West  to 84deg West.","projected 2D","","","East","North","E","N","9001","","4267","16016","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 16N (code 228).","",NULL};
+datafile_rows_t horiz_cs_row_633[] = {"26717","NAD27 / UTM zone 17N","","","","North America - Canada; Mexico; United States (USA) - 84deg West  to 78deg West.","projected 2D","","","East","North","E","N","9001","","4267","16017","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 17N (code 229).  In Quebec superseded by NAD27(CGQ77) / UTM zone 17N (code 231).","",NULL};
+datafile_rows_t horiz_cs_row_634[] = {"26718","NAD27 / UTM zone 18N","","","","North America - Canada; United States (USA) - 78deg West  to 72deg West.","projected 2D","","","East","North","E","N","9001","","4267","16018","1995-06-02 00:00:00","","EPSG","In Ontario superseded by NAD27(76) / UTM zone 18N (code 230).  In Quebec superseded by NAD27(CGQ77) / UTM zone 18N (code 232).","",NULL};
+datafile_rows_t horiz_cs_row_635[] = {"26719","NAD27 / UTM zone 19N","","","","North America - Canada; United States (USA) - 72deg West  to 66deg West.","projected 2D","","","East","North","E","N","9001","","4267","16019","1995-06-02 00:00:00","","EPSG","In Quebec superseded by NAD27(CGQ77) / UTM zone 19N (code 233).","",NULL};
+datafile_rows_t horiz_cs_row_636[] = {"26720","NAD27 / UTM zone 20N","","","","North America - Antigua and Barbuda - Barbuda.  British Virgin Islands (military).  Canada; United States (USA) offshore Atlantic - 66deg West  to 60deg West.","projected 2D","","","East","North","E","N","9001","","4267","16020","1995-06-02 00:00:00","","EPSG","In Quebec superseded by NAD27(CGQ77) / UTM zone 20N (code 234).","",NULL};
+datafile_rows_t horiz_cs_row_637[] = {"26721","NAD27 / UTM zone 21N","","","","North America - Canada - 60deg West  to 54deg West.","projected 2D","","","East","North","E","N","9001","","4267","16021","1995-06-02 00:00:00","","EPSG","In Quebec superseded by NAD27(CGQ77) / UTM zone 21N (code 235).","",NULL};
+datafile_rows_t horiz_cs_row_638[] = {"26722","NAD27 / UTM zone 22N","","","","North America - Canada - 54deg West  to 48deg West.","projected 2D","","","East","North","E","N","9001","","4267","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_639[] = {"26729","NAD27 / Alabama East","","","","United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Mad","projected 2D","","","East","North","X","Y","9003","","4267","10101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_640[] = {"26730","NAD27 / Alabama West","","","","United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawr","projected 2D","","","East","North","X","Y","9003","","4267","10102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_641[] = {"26731","NAD27 / Alaska zone 1","","","","United States - Alaska - Panhandle.","projected 2D","","","East","North","X","Y","9003","","4267","15001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_642[] = {"26732","NAD27 / Alaska zone 2","","","","United States - Alaska - 141deg to 144deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_643[] = {"26733","NAD27 / Alaska zone 3","","","","United States - Alaska - 144deg to 148deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_644[] = {"26734","NAD27 / Alaska zone 4","","","","United States - Alaska - 148deg to 152deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_645[] = {"26735","NAD27 / Alaska zone 5","","","","United States - Alaska - 152deg to 156deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_646[] = {"26736","NAD27 / Alaska zone 6","","","","United States - Alaska - 156deg to 160deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_647[] = {"26737","NAD27 / Alaska zone 7","","","","United States - Alaska - 160deg to 164deg West.","projected 2D","","","East","North","X","Y","9003","","4267","15007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_648[] = {"26738","NAD27 / Alaska zone 8","","","","United States - Alaska - 164deg to 168deg West; north of 54d 30m North.","projected 2D","","","East","North","X","Y","9003","","4267","15008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_649[] = {"26739","NAD27 / Alaska zone 9","","","","United States - Alaska - West of 168deg West and north of 54d 30m North.","projected 2D","","","East","North","X","Y","9003","","4267","15009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_650[] = {"26740","NAD27 / Alaska zone 10","","","","United States - Alaska - Aleutian Islands.","projected 2D","","","East","North","X","Y","9003","","4267","15010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_651[] = {"26741","NAD27 / California zone I","NAD27 / California I","","","United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity","projected 2D","","","East","North","X","Y","9003","","4267","10401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_652[] = {"26742","NAD27 / California zone II","NAD27 / California II","","","United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba","projected 2D","","","East","North","X","Y","9003","","4267","10402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_653[] = {"26743","NAD27 / California zone III","NAD27 / California III","","","United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne","projected 2D","","","East","North","X","Y","9003","","4267","10403","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_654[] = {"26744","NAD27 / California zone IV","NAD27 / California IV","","","United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare","projected 2D","","","East","North","X","Y","9003","","4267","10404","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_655[] = {"26745","NAD27 / California zone V","NAD27 / California V","","","United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; San Bernardino; San Luis Obispo; Santa Barbara; Ventura","projected 2D","","","East","North","X","Y","9003","","4267","10405","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_656[] = {"26746","NAD27 / California zone VI","NAD27 / California VI","","","United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego","projected 2D","","","East","North","X","Y","9003","","4267","10406","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_657[] = {"26747","NAD27 / California zone VII","NAD27 / California VII","","","United States - California - Los Angeles.","projected 2D","","","East","North","X","Y","9003","","4267","10407","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_658[] = {"26748","NAD27 / Arizona East","","","","United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo","projected 2D","","","East","North","X","Y","9003","","4267","10201","1995-08-22 00:00:00","","EPSG","","95.25",NULL};
+datafile_rows_t horiz_cs_row_659[] = {"26749","NAD27 / Arizona Central","","","","United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai","projected 2D","","","East","North","X","Y","9003","","4267","10202","1995-08-22 00:00:00","","EPSG","","95.25",NULL};
+datafile_rows_t horiz_cs_row_660[] = {"26750","NAD27 / Arizona West","","","","United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma","projected 2D","","","East","North","X","Y","9003","","4267","10203","1995-08-22 00:00:00","","EPSG","","95.25",NULL};
+datafile_rows_t horiz_cs_row_661[] = {"26751","NAD27 / Arkansas North","","","","United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawr","projected 2D","","","East","North","X","Y","9003","","4267","10301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_662[] = {"26752","NAD27 / Arkansas South","","","","United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln;","projected 2D","","","East","North","X","Y","9003","","4267","10302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_663[] = {"26753","NAD27 / Colorado North","","","","United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma","projected 2D","","","East","North","X","Y","9003","","4267","10501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_664[] = {"26754","NAD27 / Colorado Central","","","","United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Par","projected 2D","","","East","North","X","Y","9003","","4267","10502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_665[] = {"26755","NAD27 / Colorado South","","","","United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowe","projected 2D","","","East","North","X","Y","9003","","4267","10503","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_666[] = {"26756","NAD27 / Connecticut","","","","United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham","projected 2D","","","East","North","X","Y","9003","","4267","10600","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_667[] = {"26757","NAD27 / Delaware","","","","United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex","projected 2D","","","East","North","X","Y","9003","","4267","10700","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_668[] = {"26758","NAD27 / Florida East","","","","United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie","projected 2D","","","East","North","X","Y","9003","","4267","10901","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_669[] = {"26759","NAD27 / Florida West","","","","United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter","projected 2D","","","East","North","X","Y","9003","","4267","10902","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_670[] = {"26760","NAD27 / Florida North","","","","United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Ros","projected 2D","","","East","North","X","Y","9003","","4267","10903","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_671[] = {"26766","NAD27 / Georgia East","","","","United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn","projected 2D","","","East","North","X","Y","9003","","4267","11001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_672[] = {"26767","NAD27 / Georgia West","","","","United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford;","projected 2D","","","East","North","X","Y","9003","","4267","11002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_673[] = {"26768","NAD27 / Idaho East","","","","United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton","projected 2D","","","East","North","X","Y","9003","","4267","11101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_674[] = {"26769","NAD27 / Idaho Central","","","","United States (USA) - daho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls","projected 2D","","","East","North","X","Y","9003","","4267","11102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_675[] = {"26770","NAD27 / Idaho West","","","","United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington","projected 2D","","","East","North","X","Y","9003","","4267","11103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_676[] = {"26771","NAD27 / Illinois East","","","","United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasp","projected 2D","","","East","North","X","Y","9003","","4267","11201","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_677[] = {"26772","NAD27 / Illinois West","","","","United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Ma","projected 2D","","","East","North","X","Y","9003","","4267","11202","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_678[] = {"26773","NAD27 / Indiana East","","","","United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jac","projected 2D","","","East","North","X","Y","9003","","4267","11301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_679[] = {"26774","NAD27 / Indiana West","","","","United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Park","projected 2D","","","East","North","X","Y","9003","","4267","11302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_680[] = {"26775","NAD27 / Iowa North","","","","United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; F","projected 2D","","","East","North","X","Y","9003","","4267","11401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_681[] = {"26776","NAD27 / Iowa South","","","","United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Ma","projected 2D","","","East","North","X","Y","9003","","4267","11402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_682[] = {"26777","NAD27 / Kansas North","","","","United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Mo","projected 2D","","","East","North","X","Y","9003","","4267","11501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_683[] = {"26778","NAD27 / Kansas South","","","","United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Har","projected 2D","","","East","North","X","Y","9003","","4267","11502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_684[] = {"26779","NAD27 / Kentucky North","","","","United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawr","projected 2D","","","East","North","X","Y","9003","","4267","11601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_685[] = {"26780","NAD27 / Kentucky South","","","","United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton","projected 2D","","","East","North","X","Y","9003","","4267","11602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_686[] = {"26781","NAD27 / Louisiana North","","","","United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; R","projected 2D","","","East","North","X","Y","9003","","4267","11701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_687[] = {"26782","NAD27 / Louisiana South","","","","United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orlean","projected 2D","","","East","North","X","Y","9003","","4267","11702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_688[] = {"26783","NAD27 / Maine East","","","","United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington","projected 2D","","","East","North","X","Y","9003","","4267","11801","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_689[] = {"26784","NAD27 / Maine West","","","","United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York","projected 2D","","","East","North","X","Y","9003","","4267","11802","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_690[] = {"26785","NAD27 / Maryland","","","","United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Was","projected 2D","","","East","North","X","Y","9003","","4267","11900","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_691[] = {"26786","NAD27 / Massachusetts Mainland","NAD27 / Massachusetts","","","United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester","projected 2D","","","East","North","X","Y","9003","","4267","12001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_692[] = {"26787","NAD27 / Massachusetts Island","NAD27 / Massachusetts Is","","","United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket","projected 2D","","","East","North","X","Y","9003","","4267","12002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_693[] = {"26791","NAD27 / Minnesota North","","","","United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis","projected 2D","","","East","North","X","Y","9003","","4267","12201","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_694[] = {"26792","NAD27 / Minnesota Central","NAD27 / Minnesota Cent.","","","United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin","projected 2D","","","East","North","X","Y","9003","","4267","12202","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_695[] = {"26793","NAD27 / Minnesota South","","","","United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Ma","projected 2D","","","East","North","X","Y","9003","","4267","12203","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_696[] = {"26794","NAD27 / Mississippi East","","","","United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; ","projected 2D","","","East","North","X","Y","9003","","4267","12301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_697[] = {"26795","NAD27 / Mississippi West","","","","United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Mon","projected 2D","","","East","North","X","Y","9003","","4267","12302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_698[] = {"26796","NAD27 / Missouri East","","","","United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Per","projected 2D","","","East","North","X","Y","9003","","4267","12401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_699[] = {"26797","NAD27 / Missouri Central","","","","United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Merce","projected 2D","","","East","North","X","Y","9003","","4267","12402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_700[] = {"26798","NAD27 / Missouri West","","","","United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newt","projected 2D","","","East","North","X","Y","9003","","4267","12403","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_701[] = {"26801","NAD Michigan / Michigan East","NAD27 / Michigan East","","","United States (USA) - Michigan - MI_E - counties of Alcona; Alpena; Arenac; Bay; Cheboygan; Clinton; Crawford; Genesee; Gladwin; Gratiot; Hillsdale; Huron; Ingham; Iosco; Jackson; Lapeer; Lenawee; Livingston; Macomb; Midland; Monroe; Montmorency; Oakland; ","projected 2D","","","East","North","X","Y","9003","","4268","12101","1998-11-11 00:00:00","","EPSG","Superseded by 26811 2681 [...]
+datafile_rows_t horiz_cs_row_702[] = {"26802","NAD Michigan / Michigan Old Central","NAD27 / Michigan Old Cen","","","United States (USA) - Michigan - MI_C - counties of Allegan; Antrim; Barry; Benzie; Berrien; Branch; Calhoun; Cass; Charlevoix; Clare; Eaton; Emmet; Grand Traverse; Ionia; Isabella; Kalamazoo; Kalkaska; Kent; Lake; Leelanau; Manistee; Mason; Mecosta; Missa","projected 2D","","","East","North","X","Y","9003","","4268","12102","1998-11-11 00:00:00","","EPSG","Superseded by  [...]
+datafile_rows_t horiz_cs_row_703[] = {"26803","NAD Michigan / Michigan West","NAD27 / Michigan West","","","United States (USA) - Michigan - MI_W - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft","projected 2D","","","East","North","X","Y","9003","","4268","12103","1998-11-11 00:00:00","","EPSG","Superseded by 26811 26812 and 26813.","95.25  97.19  98.22",NULL};
+datafile_rows_t horiz_cs_row_704[] = {"26811","NAD Michigan / Michigan North","NAD27 / Michigan North","","","United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft","projected 2D","","","East","North","X","Y","9003","","4268","12111","1998-11-11 00:00:00","","EPSG","Supersedes 26801 26802 and 26803.","96.28  98.22",NULL};
+datafile_rows_t horiz_cs_row_705[] = {"26812","NAD Michigan / Michigan Central","NAD27 / Michigan Central","","","United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; O","projected 2D","","","East","North","X","Y","9003","","4268","12112","1998-11-11 00:00:00","","EPSG","Supersedes 26801 2 [...]
+datafile_rows_t horiz_cs_row_706[] = {"26813","NAD Michigan / Michigan South","NAD27 / Michigan South","","","United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Mi","projected 2D","","","East","North","X","Y","9003","","4268","12113","1998-11-11 00:00:00","","EPSG","Supersedes 26801 26802 [...]
+datafile_rows_t horiz_cs_row_707[] = {"26903","NAD83 / UTM zone 3N","","","","North America - United States (USA) - Alaska - 168deg West  to 162deg West.","projected 2D","","","East","North","E","N","9001","","4269","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_708[] = {"26904","NAD83 / UTM zone 4N","","","","North America - United States (USA) - Alaska - 162deg West  to 156deg West.","projected 2D","","","East","North","E","N","9001","","4269","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_709[] = {"26905","NAD83 / UTM zone 5N","","","","North America - United States (USA) - Alaska - 156deg West  to 150deg West.","projected 2D","","","East","North","E","N","9001","","4269","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_710[] = {"26906","NAD83 / UTM zone 6N","","","","North America - United States (USA) - Alaska - 150deg West  to 144deg West.","projected 2D","","","East","North","E","N","9001","","4269","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_711[] = {"26907","NAD83 / UTM zone 7N","","","","North America - Canada; United States (USA) - Alaska - 144deg West  to 138deg West.","projected 2D","","","East","North","E","N","9001","","4269","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_712[] = {"26908","NAD83 / UTM zone 8N","","","","North America - Canada; United States (USA) - 138deg West  to 132deg West.","projected 2D","","","East","North","E","N","9001","","4269","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_713[] = {"26909","NAD83 / UTM zone 9N","","","","North America - Canada; United States (USA) - 132deg West  to 126deg West.","projected 2D","","","East","North","E","N","9001","","4269","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_714[] = {"26910","NAD83 / UTM zone 10N","","","","North America - Canada; United States (USA) - 130deg West  to 120deg West.","projected 2D","","","East","North","E","N","9001","","4269","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_715[] = {"26911","NAD83 / UTM zone 11N","","","","North America - Canada; Mexico; United States (USA) - 120deg West  to 114deg West.","projected 2D","","","East","North","E","N","9001","","4269","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_716[] = {"26912","NAD83 / UTM zone 12N","","","","North America - Canada; Mexico; United States (USA) - 114deg West  to 108deg West.","projected 2D","","","East","North","E","N","9001","","4269","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_717[] = {"26913","NAD83 / UTM zone 13N","","","","North America - Canada; Mexico; United States (USA) - 108deg West  to 102deg West.","projected 2D","","","East","North","E","N","9001","","4269","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_718[] = {"26914","NAD83 / UTM zone 14N","","","","North America - Canada; Mexico; United States (USA) - 102deg West  to 96deg West.","projected 2D","","","East","North","E","N","9001","","4269","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_719[] = {"26915","NAD83 / UTM zone 15N","","","","North America - Canada; Mexico; United States (USA) - 96deg West  to 90deg West.","projected 2D","","","East","North","E","N","9001","","4269","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_720[] = {"26916","NAD83 / UTM zone 16N","","","","North America - Canada; Mexico; United States (USA) - 90deg West  to 84deg West.","projected 2D","","","East","North","E","N","9001","","4269","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_721[] = {"26917","NAD83 / UTM zone 17N","","","","North America - Canada; Mexico; United States (USA) - 84deg West  to 78deg West.","projected 2D","","","East","North","E","N","9001","","4269","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_722[] = {"26918","NAD83 / UTM zone 18N","","","","North America - Canada; United States (USA) - 78deg West  to 72deg West.","projected 2D","","","East","North","E","N","9001","","4269","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_723[] = {"26919","NAD83 / UTM zone 19N","","","","North America - Canada; United States (USA) - 72deg West  to 66deg West.","projected 2D","","","East","North","E","N","9001","","4269","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_724[] = {"26920","NAD83 / UTM zone 20N","","","","North America - Canada; United States (USA) offshore Atlantic - 66deg West  to 60deg West.","projected 2D","","","East","North","E","N","9001","","4269","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_725[] = {"26921","NAD83 / UTM zone 21N","","","","North America - Canada - 60deg West  to 54deg West.","projected 2D","","","East","North","E","N","9001","","4269","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_726[] = {"26922","NAD83 / UTM zone 22N","","","","North America - Canada - Newfoundland - 54deg West  to 48deg West.","projected 2D","","","East","North","E","N","9001","","4269","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_727[] = {"26923","NAD83 / UTM zone 23N","","","","North America - Canada offshore Atlantic - 48deg West  to 42deg West.","projected 2D","","","East","North","E","N","9001","","4269","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_728[] = {"26929","NAD83 / Alabama East","","","","United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Mad","projected 2D","","","East","North","X","Y","9001","","4269","10131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_729[] = {"26930","NAD83 / Alabama West","","","","United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawr","projected 2D","","","East","North","X","Y","9001","","4269","10132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_730[] = {"26931","NAD83 / Alaska zone 1","","","","United States - Alaska - Panhandle.","projected 2D","","","East","North","X","Y","9001","","4269","15031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_731[] = {"26932","NAD83 / Alaska zone 2","","","","United States - Alaska - 141deg to 144deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_732[] = {"26933","NAD83 / Alaska zone 3","","","","United States - Alaska - 144deg to 148deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_733[] = {"26934","NAD83 / Alaska zone 4","","","","United States - Alaska - 148deg to 152deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_734[] = {"26935","NAD83 / Alaska zone 5","","","","United States - Alaska - 152deg to 156deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_735[] = {"26936","NAD83 / Alaska zone 6","","","","United States - Alaska - 156deg to 160deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_736[] = {"26937","NAD83 / Alaska zone 7","","","","United States - Alaska - 160deg to 164deg West.","projected 2D","","","East","North","X","Y","9001","","4269","15037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_737[] = {"26938","NAD83 / Alaska zone 8","","","","United States - Alaska - 164deg to 168deg West north of 54d 30m North.","projected 2D","","","East","North","X","Y","9001","","4269","15038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_738[] = {"26939","NAD83 / Alaska zone 9","","","","United States - Alaska - west of 168deg West and north of 54d 30m North.","projected 2D","","","East","North","X","Y","9001","","4269","15039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_739[] = {"26940","NAD83 / Alaska zone 10","","","","United States - Alaska - Aleutian Islands.","projected 2D","","","East","North","X","Y","9001","","4269","15040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_740[] = {"26941","NAD83 / California zone 1","NAD83 / California 1","","","United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity","projected 2D","","","East","North","X","Y","9001","","4269","10431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_741[] = {"26942","NAD83 / California zone 2","NAD83 / California 2","","","United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba","projected 2D","","","East","North","X","Y","9001","","4269","10432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_742[] = {"26943","NAD83 / California zone 3","NAD83 / California 3","","","United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne","projected 2D","","","East","North","X","Y","9001","","4269","10433","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_743[] = {"26944","NAD83 / California zone 4","NAD83 / California 4","","","United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare","projected 2D","","","East","North","X","Y","9001","","4269","10434","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_744[] = {"26945","NAD83 / California zone 5","NAD83 / California 5","","","United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; Los Angeles; San Bernardino; San Luis Obispo; Santa Barbara; Ventura","projected 2D","","","East","North","X","Y","9001","","4269","10435","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_745[] = {"26946","NAD83 / California zone 6","NAD83 / California 6","","","United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego","projected 2D","","","East","North","X","Y","9001","","4269","10436","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_746[] = {"26948","NAD83 / Arizona  East","","","","United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo","projected 2D","","","East","North","X","Y","9001","","4269","10231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_747[] = {"26949","NAD83 / Arizona Central","","","","United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai","projected 2D","","","East","North","X","Y","9001","","4269","10232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_748[] = {"26950","NAD83 / Arizona West","","","","United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma","projected 2D","","","East","North","X","Y","9001","","4269","10233","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_749[] = {"26951","NAD83 / Arkansas North","","","","United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawr","projected 2D","","","East","North","X","Y","9001","","4269","10331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_750[] = {"26952","NAD83 / Arkansas South","","","","United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln;","projected 2D","","","East","North","X","Y","9001","","4269","10332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_751[] = {"26953","NAD83 / Colorado North","","","","United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma","projected 2D","","","East","North","X","Y","9001","","4269","10531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_752[] = {"26954","NAD83 / Colorado Central","","","","United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Par","projected 2D","","","East","North","X","Y","9001","","4269","10532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_753[] = {"26955","NAD83 / Colorado South","","","","United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowe","projected 2D","","","East","North","X","Y","9001","","4269","10533","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_754[] = {"26956","NAD83 / Connecticut","","","","United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham","projected 2D","","","East","North","X","Y","9001","","4269","10630","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_755[] = {"26957","NAD83 / Delaware","","","","United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex","projected 2D","","","East","North","X","Y","9001","","4269","10730","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_756[] = {"26958","NAD83 / Florida  East","","","","United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie","projected 2D","","","East","North","X","Y","9001","","4269","10931","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_757[] = {"26959","NAD83 / Florida  West","","","","United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter","projected 2D","","","East","North","X","Y","9001","","4269","10932","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_758[] = {"26960","NAD83 / Florida North","","","","United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Ros","projected 2D","","","East","North","X","Y","9001","","4269","10933","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_759[] = {"26961","NAD83 / Hawaii  zone 1","","","","United States - Hawaii - island of Hawaii.","projected 2D","","","East","North","X","Y","9001","","4269","15131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_760[] = {"26962","NAD83 / Hawaii  zone 2","","","","United States - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","projected 2D","","","East","North","X","Y","9001","","4269","15132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_761[] = {"26963","NAD83 / Hawaii  zone 3","","","","United States - Hawaii - Oahu.","projected 2D","","","East","North","X","Y","9001","","4269","15133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_762[] = {"26964","NAD83 / Hawaii  zone 4","","","","United States - Hawaii - Kauai.","projected 2D","","","East","North","X","Y","9001","","4269","15134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_763[] = {"26965","NAD83 / Hawaii  zone 5","","","","United States - Hawaii - Niihau.","projected 2D","","","East","North","X","Y","9001","","4269","15135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_764[] = {"26966","NAD83 / Georgia  East","","","","United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn","projected 2D","","","East","North","X","Y","9001","","4269","11031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_765[] = {"26967","NAD83 / Georgia West","","","","United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford;","projected 2D","","","East","North","X","Y","9001","","4269","11032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_766[] = {"26968","NAD83 / Idaho  East","","","","United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton","projected 2D","","","East","North","X","Y","9001","","4269","11131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_767[] = {"26969","NAD83 / Idaho  Central","","","","United States (USA) - Idaho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls","projected 2D","","","East","North","X","Y","9001","","4269","11132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_768[] = {"26970","NAD83 / Idaho  West","","","","United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington","projected 2D","","","East","North","X","Y","9001","","4269","11133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_769[] = {"26971","NAD83 / Illinois  East","","","","United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasp","projected 2D","","","East","North","X","Y","9001","","4269","11231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_770[] = {"26972","NAD83 / Illinois  West","","","","United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Ma","projected 2D","","","East","North","X","Y","9001","","4269","11232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_771[] = {"26973","NAD83 / Indiana  East","","","","United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jac","projected 2D","","","East","North","X","Y","9001","","4269","11331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_772[] = {"26974","NAD83 / Indiana  West","","","","United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Park","projected 2D","","","East","North","X","Y","9001","","4269","11332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_773[] = {"26975","NAD83 / Iowa North","","","","United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; F","projected 2D","","","East","North","X","Y","9001","","4269","11431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_774[] = {"26976","NAD83 / Iowa South","","","","United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Ma","projected 2D","","","East","North","X","Y","9001","","4269","11432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_775[] = {"26977","NAD83 / Kansas North","","","","United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Mo","projected 2D","","","East","North","X","Y","9001","","4269","11531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_776[] = {"26978","NAD83 / Kansas South","","","","United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Har","projected 2D","","","East","North","X","Y","9001","","4269","11532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_777[] = {"26979","NAD83 / Kentucky North","","","","United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawr","projected 2D","","","East","North","X","Y","9001","","4269","11631","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_778[] = {"26980","NAD83 / Kentucky South","","","","United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton","projected 2D","","","East","North","X","Y","9001","","4269","11632","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_779[] = {"26981","NAD83 / Louisiana North","","","","United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; R","projected 2D","","","East","North","X","Y","9001","","4269","11731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_780[] = {"26982","NAD83 / Louisiana South","","","","United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orlean","projected 2D","","","East","North","X","Y","9001","","4269","11732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_781[] = {"26983","NAD83 / Maine  East","","","","United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington","projected 2D","","","East","North","X","Y","9001","","4269","11831","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_782[] = {"26984","NAD83 / Maine  West","","","","United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York","projected 2D","","","East","North","X","Y","9001","","4269","11832","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_783[] = {"26985","NAD83 / Maryland","","","","United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Was","projected 2D","","","East","North","X","Y","9001","","4269","11930","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_784[] = {"26986","NAD83 / Massachusetts Mainland","NAD83 / Massachusetts","","","United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester","projected 2D","","","East","North","X","Y","9001","","4269","12031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_785[] = {"26987","NAD83 / Massachusetts Island","NAD83 / Massachusetts Is","","","United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket","projected 2D","","","East","North","X","Y","9001","","4269","12032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_786[] = {"26988","NAD83 / Michigan North","","","","United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft","projected 2D","","","East","North","X","Y","9001","","4269","12141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_787[] = {"26989","NAD83 / Michigan Central","","","","United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; O","projected 2D","","","East","North","X","Y","9001","","4269","12142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_788[] = {"26990","NAD83 / Michigan South","","","","United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Mi","projected 2D","","","East","North","X","Y","9001","","4269","12143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_789[] = {"26991","NAD83 / Minnesota North","","","","United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis","projected 2D","","","East","North","X","Y","9001","","4269","12231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_790[] = {"26992","NAD83 / Minnesota Central","NAD83 / Minnesota Cent.","","","United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin","projected 2D","","","East","North","X","Y","9001","","4269","12232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_791[] = {"26993","NAD83 / Minnesota South","","","","United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Ma","projected 2D","","","East","North","X","Y","9001","","4269","12233","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_792[] = {"26994","NAD83 / Mississippi East","","","","United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; ","projected 2D","","","East","North","X","Y","9001","","4269","12331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_793[] = {"26995","NAD83 / Mississippi West","","","","United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Mon","projected 2D","","","East","North","X","Y","9001","","4269","12332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_794[] = {"26996","NAD83 / Missouri  East","","","","United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Per","projected 2D","","","East","North","X","Y","9001","","4269","12431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_795[] = {"26997","NAD83 / Missouri Central","","","","United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Merce","projected 2D","","","East","North","X","Y","9001","","4269","12432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_796[] = {"26998","NAD83 / Missouri  West","","","","United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newt","projected 2D","","","East","North","X","Y","9001","","4269","12433","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_797[] = {"27038","Nahrwan 1967 / UTM zone 38N","Nahrwan 1967 / UTM 38N","","","Kuwait west of 48 deg East.","projected 2D","","","East","North","E","N","9001","","4270","16038","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_798[] = {"27039","Nahrwan 1967 / UTM zone 39N","Nahrwan 1967 / UTM 39N","","","Kuwait east of 48 deg East.  United Arab Emirates (UAE) - Abu Dhabi - west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4270","16039","1996-04-12 00:00:00","","EPSG","","96.12",NULL};
+datafile_rows_t horiz_cs_row_799[] = {"27040","Nahrwan 1967 / UTM zone 40N","Nahrwan 1967 / UTM 40N","","","United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.","projected 2D","","","East","North","E","N","9001","","4270","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_800[] = {"27120","Naparima 1972 / UTM zone 20N","Naparima / UTM 20N","","","Trinidad and Tobago.","projected 2D","","","East","North","E","N","9001","","4271","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_801[] = {"27200","GD49 / New Zealand Map Grid","GD49 / NZ Map Grid","","","New Zealand.","projected 2D","","","East","North","E","N","9001","","4272","19917","1995-06-02 00:00:00","","EPSG","Supersedes 27291 (GD49 / North Island Grid) and 27292 (GD49 / South Island Grid).","",NULL};
+datafile_rows_t horiz_cs_row_802[] = {"27291","GD49 / North Island Grid","","","","New Zealand - North Island.","projected 2D","","","East","North","E","N","9040","","4272","18141","1999-10-20 00:00:00","","EPSG","Sears 1922 British foot-metre conversion factor applied to ellipsoid.  Superseded by 27200 (GD49 / New Zealand Map Grid).","97.231",NULL};
+datafile_rows_t horiz_cs_row_803[] = {"27292","GD49 / South Island Grid","","","","New Zealand - South Island.","projected 2D","","","East","North","E","N","9040","","4272","18142","1999-10-20 00:00:00","","EPSG","Sears 1922 British foot-metre conversion factor applied to ellipsoid.  Superseded by 27200 (GD49 / New Zealand Map Grid).","97.231",NULL};
+datafile_rows_t horiz_cs_row_804[] = {"27391","NGO 1948 (Oslo) / NGO zone I","NGO 1948 / I","","","Norway - west of 3deg 30min W of Oslo (7deg 13min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18221","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N.","",NULL};
+datafile_rows_t horiz_cs_row_805[] = {"27392","NGO 1948 (Oslo) / NGO zone II","NGO 1948 / II","","","Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 20.5sec E  and 9deg 33min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18222","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N.","",NULL};
+datafile_rows_t horiz_cs_row_806[] = {"27393","NGO 1948 (Oslo) / NGO zone III","NGO 1948 / III","","","Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 20.5sec E and 11deg 58min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18223","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N.","",NULL};
+datafile_rows_t horiz_cs_row_807[] = {"27394","NGO 1948 (Oslo) / NGO zone IV","NGO 1948 / IV","","","Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 20.5sec E and 15deg 03min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18224","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N and ETRF89 / UTM zone 33N.","",NULL};
+datafile_rows_t horiz_cs_row_808[] = {"27395","NGO 1948 (Oslo) / NGO zone V","NGO 1948 / V","","","Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 20.5sec E and 18deg 53min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18225","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 33N and ETRF89 / UTM zone 34N.","",NULL};
+datafile_rows_t horiz_cs_row_809[] = {"27396","NGO 1948 (Oslo) / NGO zone VI","NGO 1948 / VI","","","Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 20.5sec E and 22deg 53min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18226","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 34N.","",NULL};
+datafile_rows_t horiz_cs_row_810[] = {"27397","NGO 1948 (Oslo) / NGO zone VII","NGO 1948 / VII","","","Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 20.5sec E and 26deg 58min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18227","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 34N and ETRF89 / UTM zone 35N.","",NULL};
+datafile_rows_t horiz_cs_row_811[] = {"27398","NGO 1948 (Oslo) / NGO zone VIII","NGO 1948 / VIII","","","Norway - east of 16deg 15min E of Oslo (26deg 58min 20.5sec E of Greenwich).","projected 2D","","","North","East","x","y","9001","","4817","18228","1999-10-20 00:00:00","","EPSG","Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 35N.","",NULL};
+datafile_rows_t horiz_cs_row_812[] = {"27429","Datum 73 / UTM zone 29N","","","","Portugal - onshore.","projected 2D","","","East","North","E","N","9001","","4274","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_813[] = {"27500","ATF (Paris) / Nord de Guerre","ATF / Nord de Guerre","","","France - Alsace.","projected 2D","","","East","North","X","Y","9001","","4901","19903","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_814[] = {"27581","NTF (Paris) / France I","NTF / France I","","","France north of 53.5 grads (48 deg 09 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18081","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Nord France (code 27591).","95.26",NULL};
+datafile_rows_t horiz_cs_row_815[] = {"27582","NTF (Paris) / France II","NTF / France II","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North. Also used over all mainlanf France.","projected 2D","","","East","North","X","Y","9001","","4807","18082","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Centre France (code 27592).","95.26",NULL};
+datafile_rows_t horiz_cs_row_816[] = {"27583","NTF (Paris) / France III","NTF / France III","","","France south of 50.5 grads (45 deg 27 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18083","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Sud France (code 27593).","95.26",NULL};
+datafile_rows_t horiz_cs_row_817[] = {"27584","NTF (Paris) / France IV","NTF / France IV","","","France - Corsica","projected 2D","","","East","North","X","Y","9001","","4807","18084","1996-04-12 00:00:00","","EPSG","Introduced 1972. Supersedes NTF / Corse (code 27594).","",NULL};
+datafile_rows_t horiz_cs_row_818[] = {"27591","NTF (Paris) / Nord France","NTF / Nord France","","","France north of 53.5 grads (48 deg 09 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18091","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France I (code 27581) from 1972.","95.26",NULL};
+datafile_rows_t horiz_cs_row_819[] = {"27592","NTF (Paris) / Centre France","NTF / Centre France","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18092","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France II (code 27582) from 1972.","95.26",NULL};
+datafile_rows_t horiz_cs_row_820[] = {"27593","NTF (Paris) / Sud France","NTF / Sud France","","","France south of 50.5 grads (45 deg 27 min) North.","projected 2D","","","East","North","X","Y","9001","","4807","18093","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France III (code 27583) from 1972.","95.26",NULL};
+datafile_rows_t horiz_cs_row_821[] = {"27594","NTF (Paris) / Corse","NTF / Corse","","","France - Corsica","projected 2D","","","East","North","X","Y","9001","","4807","18094","1996-04-12 00:00:00","","EPSG","Superseded by NTF / France IV (code 27584) from 1972.","",NULL};
+datafile_rows_t horiz_cs_row_822[] = {"27700","OSGB 1936 / British National Grid","British National Grid","","","United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.","projected 2D","","","East","North","E","N","9001","","4277","19916","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_823[] = {"28191","Palestine 1923 / Palestine Grid","Palestine Grid","","","Israel; Jordan","projected 2D","","","East","North","E","N","9001","","4281","18201","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_824[] = {"28192","Palestine 1923 / Palestine Belt","Palestine Belt","","","Israel; Jordan","projected 2D","","","East","North","E","N","9001","","4281","18202","1999-04-22 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_825[] = {"28193","Palestine 1923 / Israeli CS Grid","Israeli CS Grid","","","Israel.","projected 2D","","","East","North","E","N","9001","","4281","18203","1999-10-20 00:00:00","Survey of Israel.","EPSG","Superceded by Israeli TM Grid (EPSG code 239).","",NULL};
+datafile_rows_t horiz_cs_row_826[] = {"28232","Pointe Noire / UTM zone 32S","Point Noire / UTM 32S","","","Congo.","projected 2D","","","East","North","E","N","9001","","4282","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_827[] = {"28348","GDA94 / MGA zone 48","","","","Australia - 102deg East  to 108deg East.","projected 2D","","","East","North","E","N","9001","","4283","17348","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_828[] = {"28349","GDA94 / MGA zone 49","","","","Australia - 108deg East  to 114deg East.","projected 2D","","","East","North","E","N","9001","","4283","17349","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_829[] = {"28350","GDA94 / MGA zone 50","","","","Australia - 114deg East  to 120deg East.","projected 2D","","","East","North","E","N","9001","","4283","17350","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_830[] = {"28351","GDA94 / MGA zone 51","","","","Australia - 120deg East  to 126deg East.","projected 2D","","","East","North","E","N","9001","","4283","17351","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_831[] = {"28352","GDA94 / MGA zone 52","","","","Australia - 126deg East  to 132deg East.","projected 2D","","","East","North","E","N","9001","","4283","17352","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_832[] = {"28353","GDA94 / MGA zone 53","","","","Australia - 132deg East  to 138deg East.","projected 2D","","","East","North","E","N","9001","","4283","17353","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_833[] = {"28354","GDA94 / MGA zone 54","","","","Australia - 138deg East  to 144deg East.","projected 2D","","","East","North","E","N","9001","","4283","17354","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_834[] = {"28355","GDA94 / MGA zone 55","","","","Australia - 144deg East  to 150deg East.","projected 2D","","","East","North","E","N","9001","","4283","17355","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_835[] = {"28356","GDA94 / MGA zone 56","","","","Australia - 150deg East  to 156deg East.","projected 2D","","","East","North","E","N","9001","","4283","17356","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_836[] = {"28357","GDA94 / MGA zone 57","","","","Australia - 156deg East  to 162deg East.","projected 2D","","","East","North","E","N","9001","","4283","17357","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_837[] = {"28358","GDA94 / MGA zone 58","","","","Australia - 162deg East  to 168deg East.","projected 2D","","","East","North","E","N","9001","","4283","17358","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_838[] = {"28402","Pulkovo 1942 / Gauss-Kruger zone 2","1942 Coord. Sys. zone 2","","","Czech Republic and Germany (former DDR) - west of 12 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16202","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_839[] = {"28403","Pulkovo 1942 / Gauss-Kruger zone 3","1942 Coord. Sys. zone 3","","","Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16203","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_840[] = {"28404","Pulkovo 1942 / Gauss-Kruger zone 4","1942 Coord. Sys. zone 4","","","Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16204","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_841[] = {"28405","Pulkovo 1942 / Gauss-Kruger zone 5","1942 Coord. Sys. zone 5","","","Belarus - west of 30 deg East;  Estonia; Latvia & Lithuania - east of 24 deg East;  Moldova;  Russia &  Ukraine - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16205","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_842[] = {"28406","Pulkovo 1942 / Gauss-Kruger zone 6","1942 Coord. Sys. zone 6","","","Belarus - east of 30 deg East;  Russia  &  Ukraine  - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16206","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_843[] = {"28407","Pulkovo 1942 / Gauss-Kruger zone 7","1942 Coord. Sys. zone 7","","","Georgia - west of 36 deg East;  Russia  - 36 deg to 42 deg East;  Ukraine - east of 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16207","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_844[] = {"28408","Pulkovo 1942 / Gauss-Kruger zone 8","1942 Coord. Sys. zone 8","","","Armenia  Azerbaijan - west of 48 deg East;  Georgia - east of 42 deg East;  Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16208","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_845[] = {"28409","Pulkovo 1942 / Gauss-Kruger zone 9","1942 Coord. Sys. zone 9","","","Azerbaijan - east of 48 deg East;  Kazakstan - west of 54 deg East;  Russia - 48 deg to 54 deg East;  Turkmenistan - west of 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16209","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_846[] = {"28410","Pulkovo 1942 / Gauss-Kruger zone 10","1942 Coord. Sys. zone 10","","","Kazakstan;  Russia;  Turkmenistan  - 54 deg  to 60 deg East; Uzbekistan - west of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16210","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_847[] = {"28411","Pulkovo 1942 / Gauss-Kruger zone 11","1942 Coord. Sys. zone 11","","","Kazakstan;  Russia;  Uzbekistan - 60 deg to 66 deg East;  Turkmenistan - east of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16211","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_848[] = {"28412","Pulkovo 1942 / Gauss-Kruger zone 12","1942 Coord. Sys. zone 12","","","Kazakstan &  Russia - 66 deg to 72 deg East;  Kirgistan & Tadzhikstan - west of 72 deg East;  Uzbekistan - east of 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16212","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_849[] = {"28413","Pulkovo 1942 / Gauss-Kruger zone 13","1942 Coord. Sys. zone 13","","","Kazakstan;  Kirgizstan;  Russia - 72 deg to 78 deg East;  Tadzhikstan - east of 72 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16213","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_850[] = {"28414","Pulkovo 1942 / Gauss-Kruger zone 14","1942 Coord. Sys. zone 14","","","Kazakstan &  Russia - 78 deg to 84 deg East; Kirgizstan - east of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16214","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_851[] = {"28415","Pulkovo 1942 / Gauss-Kruger zone 15","1942 Coord. Sys. zone 15","","","Kazakstan - east of 84 deg East;  Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16215","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_852[] = {"28416","Pulkovo 1942 / Gauss-Kruger zone 16","1942 Coord. Sys. zone 16","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16216","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_853[] = {"28417","Pulkovo 1942 / Gauss-Kruger zone 17","1942 Coord. Sys. zone 17","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16217","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_854[] = {"28418","Pulkovo 1942 / Gauss-Kruger zone 18","1942 Coord. Sys. zone 18","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16218","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_855[] = {"28419","Pulkovo 1942 / Gauss-Kruger zone 19","1942 Coord. Sys. zone 19","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16219","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_856[] = {"28420","Pulkovo 1942 / Gauss-Kruger zone 20","1942 Coord. Sys. zone 20","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16220","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_857[] = {"28421","Pulkovo 1942 / Gauss-Kruger zone 21","1942 Coord. Sys. zone 21","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16221","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_858[] = {"28422","Pulkovo 1942 / Gauss-Kruger zone 22","1942 Coord. Sys. zone 22","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16222","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_859[] = {"28423","Pulkovo 1942 / Gauss-Kruger zone 23","1942 Coord. Sys. zone 23","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16223","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_860[] = {"28424","Pulkovo 1942 / Gauss-Kruger zone 24","1942 Coord. Sys. zone 24","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16224","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_861[] = {"28425","Pulkovo 1942 / Gauss-Kruger zone 25","1942 Coord. Sys. zone 25","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16225","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_862[] = {"28426","Pulkovo 1942 / Gauss-Kruger zone 26","1942 Coord. Sys. zone 26","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16226","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_863[] = {"28427","Pulkovo 1942 / Gauss-Kruger zone 27","1942 Coord. Sys. zone 27","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16227","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_864[] = {"28428","Pulkovo 1942 / Gauss-Kruger zone 28","1942 Coord. Sys. zone 28","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16228","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_865[] = {"28429","Pulkovo 1942 / Gauss-Kruger zone 29","1942 Coord. Sys. zone 29","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16229","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_866[] = {"28430","Pulkovo 1942 / Gauss-Kruger zone 30","1942 Coord. Sys. zone 30","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4284","16230","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_867[] = {"28431","Pulkovo 1942 / Gauss-Kruger zone 31","1942 Coord. Sys. zone 31","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_868[] = {"28432","Pulkovo 1942 / Gauss-Kruger zone 32","1942 Coord. Sys. zone 32","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_869[] = {"28462","Pulkovo 1942 / Gauss-Kruger 2N","Pulkovo / Gauss 2N","","","Czech Republic and Germany (former DDR) - west of 12 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16302","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_870[] = {"28463","Pulkovo 1942 / Gauss-Kruger 3N","Pulkovo / Gauss 3N","","","Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16303","1998-06-30 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_871[] = {"28464","Pulkovo 1942 / Gauss-Kruger 4N","Pulkovo / Gauss 4N","","","Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16304","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_872[] = {"28465","Pulkovo 1942 / Gauss-Kruger 5N","Pulkovo / Gauss 5N","","","Belarus - west of 30 deg East;  Estonia; Latvia & Lithuania - east of 24 deg East;  Moldova;  Russia &  Ukraine - 24 deg to 30 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16305","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_873[] = {"28466","Pulkovo 1942 / Gauss-Kruger 6N","Pulkovo / Gauss 6N","","","Belarus - east of 30 deg East;  Russia  &  Ukraine  - 30 deg to 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16306","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_874[] = {"28467","Pulkovo 1942 / Gauss-Kruger 7N","Pulkovo / Gauss 7N","","","Georgia - west of 36 deg East;  Russia  - 36 deg to 42 deg East;  Ukraine - east of 36 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16307","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_875[] = {"28468","Pulkovo 1942 / Gauss-Kruger 8N","Pulkovo / Gauss 8N","","","Armenia - west of 48 deg East;  Azerbaijan - west of 48 deg East;  Georgia - east of 42 deg East;  Russia - 42 deg to 48 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16308","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_876[] = {"28469","Pulkovo 1942 / Gauss-Kruger 9N","Pulkovo / Gauss 9N","","","Azerbaijan - east of 48 deg East;  Kazakstan - west of 54 deg East;  Russia - 48 deg to 54 deg East;  Turkmenistan - west of 54 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16309","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_877[] = {"28470","Pulkovo 1942 / Gauss-Kruger 10N","Pulkovo / Gauss 10N","","","Kazakstan;  Russia;  Turkmenistan  - 54 deg  to 60 deg East;  Uzbekistan - west of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16310","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_878[] = {"28471","Pulkovo 1942 / Gauss-Kruger 11N","Pulkovo / Gauss 11N","","","Kazakstan;  Russia;  Uzbekistan - 60 deg to 66 deg East;  Turkmenistan - east of 60 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16311","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_879[] = {"28472","Pulkovo 1942 / Gauss-Kruger 12N","Pulkovo / Gauss 12N","","","Kazakstan &  Russia - 66 deg to 72 deg East;  Kirgistan & Tadzhikstan - west of 72 deg East;  Uzbekistan - east of 66 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16312","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_880[] = {"28473","Pulkovo 1942 / Gauss-Kruger 13N","Pulkovo / Gauss 13N","","","Kazakstan;  Kirgizstan;  Russia - 72 deg to 78 deg East;  Tadzhikstan - east of 72 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16313","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_881[] = {"28474","Pulkovo 1942 / Gauss-Kruger 14N","Pulkovo / Gauss 14N","","","Kazakstan &  Russia - 78 deg to 84 deg East;  Kirgizstan - east of 78 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16314","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_882[] = {"28475","Pulkovo 1942 / Gauss-Kruger 15N","Pulkovo / Gauss 15N","","","Kazakstan - east of 84 deg East;  Russia - 84 deg to 90 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16315","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_883[] = {"28476","Pulkovo 1942 / Gauss-Kruger 16N","Pulkovo / Gauss 16N","","","Russia - 90 deg to 96 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16316","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_884[] = {"28477","Pulkovo 1942 / Gauss-Kruger 17N","Pulkovo / Gauss 17N","","","Russia - 96 deg to 102deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16317","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_885[] = {"28478","Pulkovo 1942 / Gauss-Kruger 18N","Pulkovo / Gauss 18N","","","Russia - 102 deg to 108 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16318","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_886[] = {"28479","Pulkovo 1942 / Gauss-Kruger 19N","Pulkovo / Gauss 19N","","","Russia - 108 deg to 114 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16319","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_887[] = {"28480","Pulkovo 1942 / Gauss-Kruger 20N","Pulkovo / Gauss 20N","","","Russia - 114 deg to 120 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16320","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_888[] = {"28481","Pulkovo 1942 / Gauss-Kruger 21N","Pulkovo / Gauss 21N","","","Russia - 120 deg to 126 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16321","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_889[] = {"28482","Pulkovo 1942 / Gauss-Kruger 22N","Pulkovo / Gauss 22N","","","Russia - 126 deg to 132 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16322","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_890[] = {"28483","Pulkovo 1942 / Gauss-Kruger 23N","Pulkovo / Gauss 23N","","","Russia - 132 deg to 138 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16323","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_891[] = {"28484","Pulkovo 1942 / Gauss-Kruger 24N","Pulkovo / Gauss 24N","","","Russia - 138 deg to 144 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16324","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_892[] = {"28485","Pulkovo 1942 / Gauss-Kruger 25N","Pulkovo / Gauss 25N","","","Russia - 144 deg to 150 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16325","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_893[] = {"28486","Pulkovo 1942 / Gauss-Kruger 26N","Pulkovo / Gauss 26N","","","Russia - 150 deg to 156 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16326","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_894[] = {"28487","Pulkovo 1942 / Gauss-Kruger 27N","Pulkovo / Gauss 27N","","","Russia - 156 deg to 162 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16327","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_895[] = {"28488","Pulkovo 1942 / Gauss-Kruger 28N","Pulkovo / Gauss 28N","","","Russia - 162 deg to 168 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16328","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_896[] = {"28489","Pulkovo 1942 / Gauss-Kruger 29N","Pulkovo / Gauss 29N","","","Russia - 168 deg to 174 deg East.","projected 2D","","","North","East","X","Y","9001","","4284","16329","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_897[] = {"28490","Pulkovo 1942 / Gauss-Kruger 30N","Pulkovo / Gauss 30N","","","Russia - 174 deg East to 180 deg.","projected 2D","","","North","East","X","Y","9001","","4284","16330","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_898[] = {"28491","Pulkovo 1942 / Gauss-Kruger 31N","Pulkovo / Gauss 31N","","","Russia - 180 deg to 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_899[] = {"28492","Pulkovo 1942 / Gauss-Kruger 32N","Pulkovo / Gauss 32N","","","Russia - east of 174 deg West.","projected 2D","","","North","East","X","Y","9001","","4284","16332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_900[] = {"28600","Qatar / Qatar National Grid","Qatar National Grid","","","Qatar - onshore.","projected 2D","","","East","North","E","N","9001","","4286","19919","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_901[] = {"28991","RD / Netherlands Old","","","","Netherlands - onshore.","projected 2D","","","East","North","X","Y","9001","","4289","19913","1995-06-02 00:00:00","","EPSG","Superseded by 28992 (RD / Netherlands New).","",NULL};
+datafile_rows_t horiz_cs_row_902[] = {"28992","RD / Netherlands New","","","","Netherlands - onshore.","projected 2D","","","East","North","X","Y","9001","","4289","19914","1995-06-02 00:00:00","","EPSG","Supersedes 28991 (RD / Netherlands Old).","",NULL};
+datafile_rows_t horiz_cs_row_903[] = {"29100","SAD69 / Brazil Polyconic","","","","Brazil","projected 2D","","","East","North","X","Y","9001","","4291","19941","1999-04-22 00:00:00","PetroBras","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_904[] = {"29118","SAD69 / UTM zone 18N","","","","South America - 78deg West to 72deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16018","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_905[] = {"29119","SAD69 / UTM zone 19N","","","","South America - 72deg West to 66deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16019","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_906[] = {"29120","SAD69 / UTM zone 20N","","","","South America - 66deg West to 60deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16020","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_907[] = {"29121","SAD69 / UTM zone 21N","","","","South America - 60deg West to 54deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16021","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_908[] = {"29122","SAD69 / UTM zone 22N","","","","South America - 54deg West to 48deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16022","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_909[] = {"29177","SAD69 / UTM zone 17S","","","","South America - 84deg West to 78deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16117","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_910[] = {"29178","SAD69 / UTM zone 18S","","","","South America - Brazil - 78deg West to 72deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16118","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_911[] = {"29179","SAD69 / UTM zone 19S","","","","South America - Brazil - 72deg West to 66deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16119","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_912[] = {"29180","SAD69 / UTM zone 20S","","","","South America - Brazil - 66deg West to 60deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16120","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_913[] = {"29181","SAD69 / UTM zone 21S","","","","South America - Brazil - 60deg West to 54deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16121","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_914[] = {"29182","SAD69 / UTM zone 22S","","","","South America - Brazil - 54deg West to 48deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4291","16122","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_915[] = {"29183","SAD69 / UTM zone 23S","","","","South America - 48deg West to 42deg West.","projected 2D","","","East","North","E","N","9001","","4291","16123","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_916[] = {"29184","SAD69 / UTM zone 24S","","","","South America - Brazil - 42deg West to 36deg West.","projected 2D","","","East","North","E","N","9001","","4291","16124","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_917[] = {"29185","SAD69 / UTM zone 25S","","","","South America - 36deg West to 30deg West.","projected 2D","","","East","North","E","N","9001","","4291","16125","1995-06-02 00:00:00","","EPSG","Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.","97.252",NULL};
+datafile_rows_t horiz_cs_row_918[] = {"29220","Sapper Hill 1943 / UTM zone 20S","Sapper Hill / UTM 20S","","","Falkland Islands - west of 60 deg West.","projected 2D","","","East","North","E","N","9001","","4292","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_919[] = {"29221","Sapper Hill 1943 / UTM zone 21S","Sapper Hill / UTM 21S","","","Falkland Islands - east of 60 deg West.","projected 2D","","","East","North","E","N","9001","","4292","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_920[] = {"29333","Schwarzeck / UTM zone 33S","Schwarzeck / UTM 33S","","","Namibia - offshore.","projected 2D","","","East","North","E","N","9001","","4293","16133","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_921[] = {"29371","South West African Coord. System zone 11","SW African CS zone 11","","","Namibia - west of 12 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17611","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_922[] = {"29373","South West African Coord. System zone 13","SW African CS zone 13","","","Namibia - 12 to 14 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17613","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_923[] = {"29375","South West African Coord. System zone 15","SW African CS zone 15","","","Namibia - 14 to 16 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17615","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_924[] = {"29377","South West African Coord. System zone 17","SW African CS zone 17","","","Namibia - 16 to 18 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17617","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_925[] = {"29379","South West African Coord. System zone 19","SW African CS zone 19","","","Namibia - 18 to 20 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17619","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_926[] = {"29381","South West African Coord. System zone 21","SW African CS zone 21","","","Namibia - 20 to 22 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17621","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_927[] = {"29383","South West African Coord. System zone 23","SW African CS zone 23","","","Namibia - 22 to 24 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17623","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_928[] = {"29385","South West African Coord. System zone 25","SW African CS zone 25","","","Namibia - east of 24 deg East.","projected 2D","","","West","South","W","S","9031","","4293","17625","1997-06-16 00:00:00","","EPSG","","97.16",NULL};
+datafile_rows_t horiz_cs_row_929[] = {"29635","Sudan / UTM zone 35N","","","","Sudan - south - west of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4296","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_930[] = {"29636","Sudan / UTM zone 36N","","","","Sudan - south - east of 30 deg East.","projected 2D","","","East","North","E","N","9001","","4296","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_931[] = {"29700","Tananarive (Paris) / Laborde Grid","Tananarive  / Laborde","","","Madagascar.","projected 2D","","","East","North","X","Y","9001","","4810","19911","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_932[] = {"29738","Tananarive / UTM zone 38S","Tananarive / UTM 38S","","","Madagascar - offshore west of 48 deg East.","projected 2D","","","East","North","E","N","9001","","4297","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_933[] = {"29739","Tananarive / UTM zone 39S","Tananarive / UTM 39S","","","Madagascar - offshore east of 48 deg East.","projected 2D","","","East","North","E","N","9001","","4297","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_934[] = {"29849","Timbalai 1948 / UTM zone 49N","Timbalai 1948 / UTM 49N","","","Brunei - offshore; Malaysia - East Malaysia (Sarawak).","projected 2D","","","East","North","E","N","9001","","4298","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_935[] = {"29850","Timbalai 1948 / UTM zone 50N","Timbalai 1948 / UTM 50N","","","Brunei - offshore; Malaysia - East Malaysia (Sabah).","projected 2D","","","East","North","E","N","9001","","4298","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_936[] = {"29871","Timbalai 1948 / R.S.O. Borneo (ch)","Timbalai  / Borneo (ch)","","","Malaysia - East Malaysia (Sabah; Sarawak).","projected 2D","","","East","North","E","N","9042","","4298","19912","1999-10-20 00:00:00","","EPSG","Adopts metric conversion of 39.370147 inches per metre.","97.231",NULL};
+datafile_rows_t horiz_cs_row_937[] = {"29872","Timbalai 1948 / R.S.O. Borneo (ft)","Timbalai  / Borneo (ft)","","","Brunei; Malaysia - East Malaysia (Sabah; Sarawak).","projected 2D","","","East","North","E","N","9041","","4298","19912","1999-10-20 00:00:00","","EPSG","Original projection definition in chains.  1 chain = 66 feet=792 inches.  Adopts metric conversion of 39.370147 inches per metre.","97.231",NULL};
+datafile_rows_t horiz_cs_row_938[] = {"29873","Timbalai 1948 / R.S.O. Borneo (m)","Timbalai  / Borneo (m)","","","Brunei.","projected 2D","","","East","North","E","N","9001","","4298","19912","1997-07-22 00:00:00","","EPSG","Original projection definition in chains.  1 chain = 66 feet=792 inches.  Adopts metric conversion of 39.370147 inches per metre.","",NULL};
+datafile_rows_t horiz_cs_row_939[] = {"29900","TM65 / Irish National Grid","TM65 / Irish Nat Grid","","","Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore","projected 2D","","","East","North","E","N","9001","","4299","19908","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_940[] = {"30161","Tokyo / Japan Plane Rectangular CS I","Tokyo / Japan zone I","","","Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).","projected 2D","","","North","East","X","Y","9001","","4301","17801","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_941[] = {"30162","Tokyo / Japan Plane Rectangular CS II","Tokyo / Japan zone II","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17802","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_942[] = {"30163","Tokyo / Japan Plane Rectangular CS III","Tokyo / Japan zone III","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17803","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_943[] = {"30164","Tokyo / Japan Plane Rectangular CS IV","Tokyo / Japan zone IV","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17804","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_944[] = {"30165","Tokyo / Japan Plane Rectangular CS V","Tokyo / Japan zone V","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17805","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_945[] = {"30166","Tokyo / Japan Plane Rectangular CS VI","Tokyo / Japan zone VI","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17806","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_946[] = {"30167","Tokyo / Japan Plane Rectangular CS VII","Tokyo / Japan zone VII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17807","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_947[] = {"30168","Tokyo / Japan Plane Rectangular CS VIII","Tokyo / Japan zone VIII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17808","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_948[] = {"30169","Tokyo / Japan Plane Rectangular CS IX","Tokyo / Japan zone IX","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17809","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_949[] = {"30170","Tokyo / Japan Plane Rectangular CS X","Tokyo / Japan zone X","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","projected 2D","","","North","East","X","Y","9001","","4301","17810","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_950[] = {"30171","Tokyo / Japan Plane Rectangular CS XI","Tokyo / Japan zone XI","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","projected 2D","","","North","East","X","Y","9001","","4301","17811","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_951[] = {"30172","Tokyo / Japan Plane Rectangular CS XII","Tokyo / Japan zone XII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","projected 2D","","","North","East","X","Y","9001","","4301","17812","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_952[] = {"30173","Tokyo / Japan Plane Rectangular CS XIII","Tokyo / Japan zone XIII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","projected 2D","","","North","East","X","Y","9001","","4301","17813","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_953[] = {"30174","Tokyo / Japan Plane Rectangular CS XIV","Tokyo / Japan zone XIV","","","Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17814","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_954[] = {"30175","Tokyo / Japan Plane Rectangular CS XV","Tokyo / Japan zone XV","","","Japan - Okinawa-ken between 126 deg &130 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17815","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_955[] = {"30176","Tokyo / Japan Plane Rectangular CS XVI","Tokyo / Japan zone XVI","","","Japan - Okinawa-ken west of 126 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17816","1998-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_956[] = {"30177","Tokyo / Japan Plane Rectangular CS XVII","Tokyo / Japan zone XVII","","","Japan - Okinawa-ken east of 130 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17817","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_957[] = {"30178","Tokyo / Japan Plane Rectangular CS XVIII","Tokyo / Japan zone XVIII","","","Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.","projected 2D","","","North","East","X","Y","9001","","4301","17818","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_958[] = {"30179","Tokyo / Japan Plane Rectangular CS XIX","Tokyo / Japan zone XIX","","","Japan - Tokyo-to south of 28 N & east of 143 deg E.","projected 2D","","","North","East","X","Y","9001","","4301","17819","1998-12-12 00:00:00","","EPSG","Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.","",NULL};
+datafile_rows_t horiz_cs_row_959[] = {"30200","Trinidad 1903 / Trinidad Grid","Trinidad 1903 / Trinidad","","","Trinidad and Tobago - Trinidad","projected 2D","","","East","North","E","N","9039","","4302","19925","1999-10-20 00:00:00","","EPSG","","97.231",NULL};
+datafile_rows_t horiz_cs_row_960[] = {"30339","TC(1948) / UTM zone 39N","","","","United Arab Emirates (UAE) - Abu Dhabi west of 54 deg East.","projected 2D","","","East","North","E","N","9001","","4303","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_961[] = {"30340","TC(1948) / UTM zone 40N","","","","United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai.","projected 2D","","","East","North","E","N","9001","","4303","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_962[] = {"30491","Voirol 1875 / Nord Algerie (ancienne)","Voirol /N Algerie ancien","","","Algeria - north of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4304","18011","1995-06-02 00:00:00","","EPSG","Superseded by 30591 (Voirol Unifie / Algeria Nord).","",NULL};
+datafile_rows_t horiz_cs_row_963[] = {"30492","Voirol 1875 / Sud Algerie (ancienne)","Voirol /S Algerie ancien","","","Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4304","18012","1995-06-02 00:00:00","","EPSG","Superseded by 30592 (Voirol Unifie / Algeria Sud).","",NULL};
+datafile_rows_t horiz_cs_row_964[] = {"30591","Voirol Unifie / Nord Algerie","Voirol Unifie /N Algerie","","","Algeria - north of 38.5 grads (34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4305","18021","1995-06-02 00:00:00","","EPSG","Supersedes 30491 (Voirol 1875 / Nord Algeria ancienne).","",NULL};
+datafile_rows_t horiz_cs_row_965[] = {"30592","Voirol Unifie / Sud Algerie","Voirol Unifie /S Algerie","","","Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.","projected 2D","","","East","North","X","Y","9001","","4305","18022","1995-06-02 00:00:00","","EPSG","Supersedes 30492 (Voirol 1875 / Sud Algeria ancienne).","",NULL};
+datafile_rows_t horiz_cs_row_966[] = {"30729","Nord Sahara 1959 / UTM zone 29N","Nord Sahara / UTM 29N","","","Algeria west of 6 deg West (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16029","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_967[] = {"30730","Nord Sahara 1959 / UTM zone 30N","Nord Sahara / UTM 30N","","","Algeria 6 deg West to 0 deg East (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16030","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_968[] = {"30731","Nord Sahara 1959 / UTM zone 31N","Nord Sahara / UTM 31N","","","Algeria 0 deg to 6 deg East (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16031","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_969[] = {"30732","Nord Sahara 1959 / UTM zone 32N","Nord Sahara / UTM 32N","","","Algeria east of 6 deg East (of Greenwich).","projected 2D","","","East","North","E","N","9001","","4307","16032","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_970[] = {"30800","RT38 2.5 gon W","","","","Sweden","projected 2D","","","North","East","X","Y","9001","","4308","19929","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","97.14  97.39",NULL};
+datafile_rows_t horiz_cs_row_971[] = {"31028","Yoff / UTM zone 28N","","","","Senegal.","projected 2D","","","East","North","E","N","9001","","4310","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_972[] = {"31121","Zanderij / UTM zone 21N","","","","Suriname.","projected 2D","","","East","North","E","N","9001","","4311","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_973[] = {"31291","MGI (Ferro) / Austria West Zone","MGI / Austria West","","","Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4805","18041","1995-06-02 00:00:00","","EPSG","Superceded by MGI / M34 (EPSG code 31296).","97.01",NULL};
+datafile_rows_t horiz_cs_row_974[] = {"31292","MGI (Ferro) / Austria Central Zone","MGI / Austria Central","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4805","18042","1995-06-02 00:00:00","","EPSG","Superceded by MGI / M31 (EPSG code 31295).","97.01",NULL};
+datafile_rows_t horiz_cs_row_975[] = {"31293","MGI (Ferro) / Austria East Zone","MGI / Austria East","","","Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4805","18043","1995-06-02 00:00:00","","EPSG","Superceded by MGI / M28 (EPSG code 31294).","97.01",NULL};
+datafile_rows_t horiz_cs_row_976[] = {"31294","MGI / M28","","","","Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4312","18044","1999-10-20 00:00:00","","EPSG","Supercedes MGI (Ferro) / Austria East zone (EPSG code 31293).","",NULL};
+datafile_rows_t horiz_cs_row_977[] = {"31295","MGI / M31","","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4312","18045","1999-10-20 00:00:00","","EPSG","Supercedes MGI (Ferro) / Austria Central zone (EPSG code 31292).","",NULL};
+datafile_rows_t horiz_cs_row_978[] = {"31296","MGI / M34","","","","Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).","projected 2D","","","East","North","X","Y","9001","","4312","18046","1999-10-20 00:00:00","","EPSG","Supercedes MGI (Ferro) / Austria West zone (EPSG code 31291).","",NULL};
+datafile_rows_t horiz_cs_row_979[] = {"31297","MGI / Austria Lambert","","","","Austria","projected 2D","","","East","North","X","Y","9001","","4312","19947","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_980[] = {"31300","Belge 1972 / Belge Lambert 72","Belge Lambert 72","","","Belgium - onshore.","projected 2D","","","East","North","X","Y","9001","","4313","19902","1995-06-02 00:00:00","","EPSG","Supersedes 21500 (Belge 1950 / Belge Lambert 50).","",NULL};
+datafile_rows_t horiz_cs_row_981[] = {"31491","DHDN / Germany zone 1","","","","Germany - onshore west of 4 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_982[] = {"31492","DHDN / Germany zone 2","","","","Germany - onshore between 4 deg 30 min and 7 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_983[] = {"31493","DHDN / Germany zone 3","","","","Germany - onshore between 7 deg 30 min and 10 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_984[] = {"31494","DHDN / Germany zone 4","","","","Germany - onshore between 10 deg 30 min and 13 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_985[] = {"31495","DHDN / Germany zone 5","","","","Germany - onshore between 13 deg 30 min and 16 deg 30 min East.","projected 2D","","","East","North","X","Y","9001","","4314","18105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_986[] = {"31600","Dealul Piscului 1933/ Stereo 33","Stereo 33","","","Romania.","projected 2D","","","East","North","X","Y","9001","","4316","19927","1996-04-12 00:00:00","","EPSG","Superseded by Stereo 70 system (ProjCS code 31700).","",NULL};
+datafile_rows_t horiz_cs_row_987[] = {"31700","Dealul Piscului 1970/ Stereo 70","Stereo 70","","","Romania.","projected 2D","","","North","East","X","Y","9001","","4317","19926","1996-04-12 00:00:00","","EPSG","Supersedes Stereo 33 system.","",NULL};
+datafile_rows_t horiz_cs_row_988[] = {"31838","NGN / UTM zone 38N","","","","Kuwait west of 48deg East.","projected 2D","","","East","North","E","N","9001","","4318","16038","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_989[] = {"31839","NGN / UTM zone 39N","","","","Kuwait east of 48deg East.","projected 2D","","","East","North","E","N","9001","","4318","16039","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_990[] = {"31900","KUDAMS / KTM","","","","Kuwait - Kuwait City.","projected 2D","","","East","North","E","N","9001","","4319","19928","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_991[] = {"32001","NAD27 / Montana North","","","","United States (USA) - Montana - MT_N - counties of Blaine; Chouteau; Daniels; Flathead; Glacier; Hill; Liberty; Lincoln; Phillips; Pondera; Roosevelt; Sheridan; Teton; Toole; Valley","projected 2D","","","East","North","X","Y","9003","","4267","12501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_992[] = {"32002","NAD27 / Montana Central","","","","United States (USA) - Montana - MT_C - counties of Cascade; Dawson; Fergus; Garfield; Judith Basin; Lake; Lewis and Clark; McCone; Meagher; Mineral; Missoula; Petroleum; Powell; Prairie; Richland; Sanders; Wibaux","projected 2D","","","East","North","X","Y","9003","","4267","12502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_993[] = {"32003","NAD27 / Montana South","","","","United States (USA) - Montana - MT_S - counties of Beaverhead; Big Horn; Broadwater; Carbon; Carter; Custer; Deer Lodge; Fallon; Gallatin; Golden Valley; Granite; Jefferson; Madison; Musselshell; Park; Powder River; Ravalli; Rosebud; Silver Bow; Stillwater","projected 2D","","","East","North","X","Y","9003","","4267","12503","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_994[] = {"32005","NAD27 / Nebraska North","","","","United States (USA) - Nebraska - NE_N - counties of Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; ","projected 2D","","","East","North","X","Y","9003","","4267","12601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_995[] = {"32006","NAD27 / Nebraska South","","","","United States (USA) - Nebraska - NE_S - counties of Adams; Arthur; Banner; Boone; Buffalo; Butler; Cass; Chase; Cheyenne; Clay; Colfax; Custer; Dawson; Deuel; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Gosper; Greeley; Hall;","projected 2D","","","East","North","X","Y","9003","","4267","12602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_996[] = {"32007","NAD27 / Nevada East","","","","United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine","projected 2D","","","East","North","X","Y","9003","","4267","12701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_997[] = {"32008","NAD27 / Nevada Central","","","","United States (USA) - Nevada - NV_C - counties of Lander; Nye","projected 2D","","","East","North","X","Y","9003","","4267","12702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_998[] = {"32009","NAD27 / Nevada West","","","","United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe","projected 2D","","","East","North","X","Y","9003","","4267","12703","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_999[] = {"32010","NAD27 / New Hampshire","","","","United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan","projected 2D","","","East","North","X","Y","9003","","4267","12800","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1000[] = {"32011","NAD27 / New Jersey","","","","United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren","projected 2D","","","East","North","X","Y","9003","","4267","12900","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1001[] = {"32012","NAD27 / New Mexico East","","","","United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union","projected 2D","","","East","North","X","Y","9003","","4267","13001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1002[] = {"32013","NAD27 / New Mexico Central","NAD27 / New Mexico Cent.","","","United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance","projected 2D","","","East","North","X","Y","9003","","4267","13002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1003[] = {"32014","NAD27 / New Mexico West","","","","United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia","projected 2D","","","East","North","X","Y","9003","","4267","13003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1004[] = {"32015","NAD27 / New York East","","","","United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence","projected 2D","","","East","North","X","Y","9003","","4267","13101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1005[] = {"32016","NAD27 / New York Central","","","","United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates","projected 2D","","","East","North","X","Y","9003","","4267","13102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1006[] = {"32017","NAD27 / New York West","","","","United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming","projected 2D","","","East","North","X","Y","9003","","4267","13103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1007[] = {"32018","NAD27 / New York Long Island","NAD27 / New York Long Is","","","United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk","projected 2D","","","East","North","X","Y","9003","","4267","13104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1008[] = {"32019","NAD27 / North Carolina","","","","United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleve","projected 2D","","","East","North","X","Y","9003","","4267","13200","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1009[] = {"32020","NAD27 / North Dakota North","NAD27 / North Dakota N","","","United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Trail","projected 2D","","","East","North","X","Y","9003","","4267","13301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1010[] = {"32021","NAD27 / North Dakota South","NAD27 / North Dakota S","","","United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slo","projected 2D","","","East","North","X","Y","9003","","4267","13302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1011[] = {"32022","NAD27 / Ohio North","","","","United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan;","projected 2D","","","East","North","X","Y","9003","","4267","13401","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1012[] = {"32023","NAD27 / Ohio South","","","","United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Mei","projected 2D","","","East","North","X","Y","9003","","4267","13402","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1013[] = {"32024","NAD27 / Oklahoma North","","","","United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata;","projected 2D","","","East","North","X","Y","9003","","4267","13501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1014[] = {"32025","NAD27 / Oklahoma South","","","","United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McC","projected 2D","","","East","North","X","Y","9003","","4267","13502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1015[] = {"32026","NAD27 / Oregon North","","","","United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; ","projected 2D","","","East","North","X","Y","9003","","4267","13601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1016[] = {"32027","NAD27 / Oregon South","","","","United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur","projected 2D","","","East","North","X","Y","9003","","4267","13602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1017[] = {"32028","NAD27 / Pennsylvania North","NAD27 / Pennsylvania N","","","United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike;","projected 2D","","","East","North","X","Y","9003","","4267","13701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1018[] = {"32029","NAD27 / Pennsylvania South","NAD27 / Pennsylvania S","","","United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; ","projected 2D","","","East","North","X","Y","9003","","4267","13702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1019[] = {"32030","NAD27 / Rhode Island","","","","United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington","projected 2D","","","East","North","X","Y","9003","","4267","13800","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1020[] = {"32031","NAD27 / South Carolina North","NAD27 / South Carolina N","","","United States (USA) - South Carolina - SC_N - counties of Abbeville; Anderson; Calhoun; Cherokee; Chester; Chesterfield; Darlington; Dillon; Edgefield; Fairfield; Florence; Greenville; Greenwood; Horry; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; ","projected 2D","","","East","North","X","Y","9003","","4267","13901","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1021[] = {"32033","NAD27 / South Carolina South","NAD27 / South Carolina S","","","United States (USA) - South Carolina - SC_S - counties of Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg; Williamsburg","projected 2D","","","East","North","X","Y","9003","","4267","13902","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1022[] = {"32034","NAD27 / South Dakota North","NAD27 / South Dakota N","","","United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Po","projected 2D","","","East","North","X","Y","9003","","4267","14001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1023[] = {"32035","NAD27 / South Dakota South","NAD27 / South Dakota S","","","United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook;","projected 2D","","","East","North","X","Y","9003","","4267","14002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1024[] = {"32036","NAD27 / Tennessee","","","","United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; F","projected 2D","","","East","North","X","Y","9003","","4267","14100","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1025[] = {"32037","NAD27 / Texas North","","","","United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Rob","projected 2D","","","East","North","X","Y","9003","","4267","14201","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1026[] = {"32038","NAD27 / Texas North Central","NAD27 / Texas North Cen.","","","United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foa","projected 2D","","","East","North","X","Y","9003","","4267","14202","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1027[] = {"32039","NAD27 / Texas Central","","","","United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie;","projected 2D","","","East","North","X","Y","9003","","4267","14203","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1028[] = {"32040","NAD27 / Texas South Central","NAD27 / Texas South Cen.","","","United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; H","projected 2D","","","East","North","X","Y","9003","","4267","14204","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1029[] = {"32041","NAD27 / Texas South","","","","United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata;  - Gulf of Mexico outer continental shelf (OCS) protraction areas: South Padre Island","projected 2D","","","East","North","X","Y","9003","","4267","14205","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1030[] = {"32042","NAD27 / Utah North","","","","United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber","projected 2D","","","East","North","X","Y","9003","","4267","14301","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1031[] = {"32043","NAD27 / Utah Central","","","","United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch","projected 2D","","","East","North","X","Y","9003","","4267","14302","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1032[] = {"32044","NAD27 / Utah South","","","","United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne","projected 2D","","","East","North","X","Y","9003","","4267","14303","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1033[] = {"32045","NAD27 / Vermont","","","","United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor","projected 2D","","","East","North","X","Y","9003","","4267","14400","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1034[] = {"32046","NAD27 / Virginia North","","","","United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spo","projected 2D","","","East","North","X","Y","9003","","4267","14501","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1035[] = {"32047","NAD27 / Virginia South","","","","United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colo","projected 2D","","","East","North","X","Y","9003","","4267","14502","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1036[] = {"32048","NAD27 / Washington North","","","","United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom","projected 2D","","","East","North","X","Y","9003","","4267","14601","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1037[] = {"32049","NAD27 / Washington South","","","","United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima","projected 2D","","","East","North","X","Y","9003","","4267","14602","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1038[] = {"32050","NAD27 / West Virginia North","NAD27 / West Virginia N","","","United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; W","projected 2D","","","East","North","X","Y","9003","","4267","14701","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1039[] = {"32051","NAD27 / West Virginia South","NAD27 / West Virginia S","","","United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; ","projected 2D","","","East","North","X","Y","9003","","4267","14702","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1040[] = {"32052","NAD27 / Wisconsin North","","","","United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn","projected 2D","","","East","North","X","Y","9003","","4267","14801","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1041[] = {"32053","NAD27 / Wisconsin Central","NAD27 / Wisconsin Cen.","","","United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. ","projected 2D","","","East","North","X","Y","9003","","4267","14802","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1042[] = {"32054","NAD27 / Wisconsin South","","","","United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; R","projected 2D","","","East","North","X","Y","9003","","4267","14803","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1043[] = {"32055","NAD27 / Wyoming East","","","","United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston","projected 2D","","","East","North","X","Y","9003","","4267","14901","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1044[] = {"32056","NAD27 / Wyoming East Central","NAD27 / Wyoming E. Cen.","","","United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie","projected 2D","","","East","North","X","Y","9003","","4267","14902","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1045[] = {"32057","NAD27 / Wyoming West Central","NAD27 / Wyoming W. Cen.","","","United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater","projected 2D","","","East","North","X","Y","9003","","4267","14903","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1046[] = {"32058","NAD27 / Wyoming West","","","","United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta","projected 2D","","","East","North","X","Y","9003","","4267","14904","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1047[] = {"32061","NAD27 / Guatemala Norte","","","","Guatemala - north of 15 deg 50 min North.","projected 2D","","","East","North","X","Y","9001","","4267","18211","1999-08-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1048[] = {"32062","NAD27 / Guatemala Sud","","","","Guatemala - south of 15 deg 50 min North.","projected 2D","","","East","North","X","Y","9001","","4267","18212","1999-08-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1049[] = {"32074","NAD27 / BLM 14N (feet)","","","","United States - Gulf of Mexico - west of approximately 96 deg West - outer continental shelf (OCS) protraction areas Corpus Christi; Port Isabel.","projected 2D","","","East","North","X","Y","9003","","4267","15914","1996-04-12 00:00:00","","EPSG","","96.03",NULL};
+datafile_rows_t horiz_cs_row_1050[] = {"32075","NAD27 / BLM 15N (feet)","","","","United States - Gulf of Mexico - 96 deg to 90 deg West - outer continental shelf (OCS) protraction areas East Breaks (EB); Alaminos Canyon (AC); Garden Banks (GB); Keathley Canyon (KC); Ewing Bank (EW); Green Canyon (GC); Walker Ridge (WR).","projected 2D","","","East","North","X","Y","9003","","4267","15915","1996-04-12 00:00:00","","EPSG","","96.03",NULL};
+datafile_rows_t horiz_cs_row_1051[] = {"32076","NAD27 / BLM 16N (feet)","","","","United States - Gulf of Mexico - 90 deg to 84 deg West - outer continental shelf (OCS) protraction areas Mobile (MO); Viosca Knoll (VK); Mississippi Canyon (MC); Atwater Valley (AT); Lund; Pensacola; Destin Dome (DD); De Soto Canyon; Lloyd; Henderson; Apal","projected 2D","","","East","North","X","Y","9003","","4267","15916","1996-04-12 00:00:00","","EPSG","","95.27  96.03",NULL};
+datafile_rows_t horiz_cs_row_1052[] = {"32077","NAD27 / BLM 17N (feet)","","","","United States - Gulf of Mexico - east of 84 deg West - outer continental shelf (OCS) protraction areas Gainesville; Tarpon Springs; St. Petersburg; Charlotte Harbor; Pulley Ridge; Dry Tortugas; Miami; Key West.","projected 2D","","","East","North","X","Y","9003","","4267","15917","1996-04-12 00:00:00","","EPSG","","96.03",NULL};
+datafile_rows_t horiz_cs_row_1053[] = {"32081","NAD27 / MTM zone 1","","","","Canada - Newfoundland - east of 54 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4267","17701","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1054[] = {"32082","NAD27 / MTM zone 2","","","","Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.","projected 2D","","","East","North","E","N","9001","","4267","17702","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1055[] = {"32083","NAD27 / MTM zone 3","","","","Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4267","17703","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1056[] = {"32084","NAD27 / MTM zone 4","","","","Canada - Newfoundland (Labrador) between 63 deg and 60 deg West.","projected 2D","","","East","North","E","N","9001","","4267","17704","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1057[] = {"32085","NAD27 / MTM zone 5","","","","Canada - Newfoundland (Labrador) between 66 deg and 63 deg West.","projected 2D","","","East","North","E","N","9001","","4267","17705","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1058[] = {"32086","NAD27 / MTM zone 6","","","","Canada - Newfoundland (Labrador) between 69 deg and  66 deg West.","projected 2D","","","East","North","E","N","9001","","4267","17706","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1059[] = {"32100","NAD83 / Montana","","","","United States (USA) - Montana - MT - counties of Beaverhead; Big Horn; Blaine; Broadwater; Carbon; Carter; Cascade; Chouteau; Custer; Daniels; Dawson; Deer Lodge; Fallon; Fergus; Flathead; Gallatin; Garfield; Glacier; Golden Valley; Granite; Hill; Jefferso","projected 2D","","","East","North","X","Y","9001","","4269","12530","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1060[] = {"32104","NAD83 / Nebraska","","","","United States (USA) - Nebraska - NE - counties of Adams; Antelope; Arthur; Banner; Blaine; Boone; Box Butte; Boyd; Brown; Buffalo; Burt; Butler; Cass; Cedar; Chase; Cherry; Cheyenne; Clay; Colfax; Cuming; Custer; Dakota; Dawes; Dawson; Deuel; Dixon; Dodge;","projected 2D","","","East","North","X","Y","9001","","4269","12630","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1061[] = {"32107","NAD83 / Nevada  East","","","","United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine","projected 2D","","","East","North","X","Y","9001","","4269","12731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1062[] = {"32108","NAD83 / Nevada Central","","","","United States (USA) - Nevada - NV_C - counties of Lander; Nye","projected 2D","","","East","North","X","Y","9001","","4269","12732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1063[] = {"32109","NAD83 / Nevada West","","","","United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe","projected 2D","","","East","North","X","Y","9001","","4269","12733","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1064[] = {"32110","NAD83 / New Hampshire","","","","United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan","projected 2D","","","East","North","X","Y","9001","","4269","12830","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1065[] = {"32111","NAD83 / New Jersey","","","","United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren","projected 2D","","","East","North","X","Y","9001","","4269","12930","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1066[] = {"32112","NAD83 / New Mexico East","","","","United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union","projected 2D","","","East","North","X","Y","9001","","4269","13031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1067[] = {"32113","NAD83 / New Mexico Central","NAD83 / New Mexico Cent.","","","United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance; Valencia","projected 2D","","","East","North","X","Y","9001","","4269","13032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1068[] = {"32114","NAD83 / New Mexico West","","","","United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra","projected 2D","","","East","North","X","Y","9001","","4269","13033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1069[] = {"32115","NAD83 / New York  East","","","","United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence","projected 2D","","","East","North","X","Y","9001","","4269","13131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1070[] = {"32116","NAD83 / New York Central","","","","United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates","projected 2D","","","East","North","X","Y","9001","","4269","13132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1071[] = {"32117","NAD83 / New York  West","","","","United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming","projected 2D","","","East","North","X","Y","9001","","4269","13133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1072[] = {"32118","NAD83 / New York Long Island","NAD83 / New York Long Is","","","United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk","projected 2D","","","East","North","X","Y","9001","","4269","13134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1073[] = {"32119","NAD83 / North Carolina","","","","United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleve","projected 2D","","","East","North","X","Y","9001","","4269","13230","1998-11-11 00:00:00","","EPSG","","98.30",NULL};
+datafile_rows_t horiz_cs_row_1074[] = {"32120","NAD83 / North Dakota North","NAD83 / North Dakota N","","","United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Trail","projected 2D","","","East","North","X","Y","9001","","4269","13331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1075[] = {"32121","NAD83 / North Dakota South","NAD83 / North Dakota S","","","United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slo","projected 2D","","","East","North","X","Y","9001","","4269","13332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1076[] = {"32122","NAD83 / Ohio North","","","","United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan;","projected 2D","","","East","North","X","Y","9001","","4269","13431","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1077[] = {"32123","NAD83 / Ohio South","","","","United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Mei","projected 2D","","","East","North","X","Y","9001","","4269","13432","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1078[] = {"32124","NAD83 / Oklahoma North","","","","United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata;","projected 2D","","","East","North","X","Y","9001","","4269","13531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1079[] = {"32125","NAD83 / Oklahoma South","","","","United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McC","projected 2D","","","East","North","X","Y","9001","","4269","13532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1080[] = {"32126","NAD83 / Oregon North","","","","United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; ","projected 2D","","","East","North","X","Y","9001","","4269","13631","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1081[] = {"32127","NAD83 / Oregon South","","","","United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur","projected 2D","","","East","North","X","Y","9001","","4269","13632","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1082[] = {"32128","NAD83 / Pennsylvania North","NAD83 / Pennsylvania N","","","United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike;","projected 2D","","","East","North","X","Y","9001","","4269","13731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1083[] = {"32129","NAD83 / Pennsylvania South","NAD83 / Pennsylvania S","","","United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; ","projected 2D","","","East","North","X","Y","9001","","4269","13732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1084[] = {"32130","NAD83 / Rhode Island","","","","United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington","projected 2D","","","East","North","X","Y","9001","","4269","13830","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1085[] = {"32133","NAD83 / South Carolina","","","","United States (USA) - South Carolina - SC - counties of Abbeville; Aiken; Allendale; Anderson; Bamberg; Barnwell; Beaufort; Berkeley; Calhoun; Charleston; Cherokee; Chester; Chesterfield; Clarendon; Colleton; Darlington; Dillon; Dorchester; Edgefield; Fair","projected 2D","","","East","North","X","Y","9001","","4269","13930","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1086[] = {"32134","NAD83 / South Dakota North","NAD83 / South Dakota N","","","United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Po","projected 2D","","","East","North","X","Y","9001","","4269","14031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1087[] = {"32135","NAD83 / South Dakota South","NAD83 / South Dakota S","","","United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook;","projected 2D","","","East","North","X","Y","9001","","4269","14032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1088[] = {"32136","NAD83 / Tennessee","","","","United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; F","projected 2D","","","East","North","X","Y","9001","","4269","14130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1089[] = {"32137","NAD83 / Texas North","","","","United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Rob","projected 2D","","","East","North","X","Y","9001","","4269","14231","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1090[] = {"32138","NAD83 / Texas North Central","NAD83 / Texas North Cen.","","","United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foa","projected 2D","","","East","North","X","Y","9001","","4269","14232","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1091[] = {"32139","NAD83 / Texas Central","","","","United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie;","projected 2D","","","East","North","X","Y","9001","","4269","14233","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1092[] = {"32140","NAD83 / Texas South Central","NAD83 / Texas South Cen.","","","United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; H","projected 2D","","","East","North","X","Y","9001","","4269","14234","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1093[] = {"32141","NAD83 / Texas South","","","","United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata","projected 2D","","","East","North","X","Y","9001","","4269","14235","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1094[] = {"32142","NAD83 / Utah North","","","","United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber","projected 2D","","","East","North","X","Y","9001","","4269","14331","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1095[] = {"32143","NAD83 / Utah Central","","","","United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch","projected 2D","","","East","North","X","Y","9001","","4269","14332","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1096[] = {"32144","NAD83 / Utah South","","","","United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne","projected 2D","","","East","North","X","Y","9001","","4269","14333","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1097[] = {"32145","NAD83 / Vermont","","","","United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor","projected 2D","","","East","North","X","Y","9001","","4269","14430","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1098[] = {"32146","NAD83 / Virginia North","","","","United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spo","projected 2D","","","East","North","X","Y","9001","","4269","14531","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1099[] = {"32147","NAD83 / Virginia South","","","","United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colo","projected 2D","","","East","North","X","Y","9001","","4269","14532","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1100[] = {"32148","NAD83 / Washington North","","","","United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Grant north of approx. 47d30m; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom","projected 2D","","","East","North","X","Y","9001","","4269","14631","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1101[] = {"32149","NAD83 / Washington South","","","","United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant south of approx. 47d30m; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla","projected 2D","","","East","North","X","Y","9001","","4269","14632","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1102[] = {"32150","NAD83 / West Virginia North","NAD83 / West Virginia N","","","United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; W","projected 2D","","","East","North","X","Y","9001","","4269","14731","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1103[] = {"32151","NAD83 / West Virginia South","NAD83 / West Virginia S","","","United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; ","projected 2D","","","East","North","X","Y","9001","","4269","14732","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1104[] = {"32152","NAD83 / Wisconsin North","","","","United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn","projected 2D","","","East","North","X","Y","9001","","4269","14831","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1105[] = {"32153","NAD83 / Wisconsin Central","NAD83 / Wisconsin Cen.","","","United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. ","projected 2D","","","East","North","X","Y","9001","","4269","14832","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1106[] = {"32154","NAD83 / Wisconsin South","","","","United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; R","projected 2D","","","East","North","X","Y","9001","","4269","14833","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1107[] = {"32155","NAD83 / Wyoming East","","","","United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston","projected 2D","","","East","North","X","Y","9001","","4269","14931","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1108[] = {"32156","NAD83 / Wyoming East Central","NAD83 / Wyoming E. Cen.","","","United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie","projected 2D","","","East","North","X","Y","9001","","4269","14932","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1109[] = {"32157","NAD83 / Wyoming West Central","NAD83 / Wyoming W. Cen.","","","United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater","projected 2D","","","East","North","X","Y","9001","","4269","14933","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1110[] = {"32158","NAD83 / Wyoming West","","","","United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta","projected 2D","","","East","North","X","Y","9001","","4269","14934","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1111[] = {"32161","NAD83 / Puerto Rico & Virgin Is.","","","","Puerto Rico and U.S. Virgin Islands.","projected 2D","","","East","North","X","Y","9001","","4269","15230","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1112[] = {"32180","NAD83 / SCoPQ zone 2","","","","Canada - Quebec - east of 57 deg East.","projected 2D","","","East","North","X","Y","9001","","4269","17700","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1113[] = {"32181","NAD83 / MTM zone 1","","","","Canada - Newfoundland - east of 54 deg 30 min West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17701","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1114[] = {"32182","NAD83 / MTM zone 2","","","","Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17702","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1115[] = {"32183","NAD83 / MTM zone 3","","","","Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17703","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / [...]
+datafile_rows_t horiz_cs_row_1116[] = {"32184","NAD83 / MTM zone 4","","","","Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17704","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 4\" with axis 1 and 2 abbreviation [...]
+datafile_rows_t horiz_cs_row_1117[] = {"32185","NAD83 / MTM zone 5","","","","Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17705","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 5\" with axis 1 and 2 abbreviation [...]
+datafile_rows_t horiz_cs_row_1118[] = {"32186","NAD83 / MTM zone 6","","","","Canada - Quebec and Newfoundland (Labrador) between 69 deg and  66 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17706","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 6\" with axis 1 and 2 abbreviatio [...]
+datafile_rows_t horiz_cs_row_1119[] = {"32187","NAD83 / MTM zone 7","","","","Canada - Quebec between 72 deg and 69 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17707","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 7\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.","",NULL};
+datafile_rows_t horiz_cs_row_1120[] = {"32188","NAD83 / MTM zone 8","","","","Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17708","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 8\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.","",NULL};
+datafile_rows_t horiz_cs_row_1121[] = {"32189","NAD83 / MTM zone 9","","","","Canada - Quebec and Ontario - between 78 deg and 75 deg West.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17709","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","Known in Quebec as \"NAD83 / SCoPQ zone 9\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.","",NULL};
+datafile_rows_t horiz_cs_row_1122[] = {"32190","NAD83 / MTM zone 10","","","","Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.","projected 2D","","","East","North","E(X)","N(Y)","9001","","4269","17710","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.", [...]
+datafile_rows_t horiz_cs_row_1123[] = {"32191","NAD83 / MTM zone 11","","","","Canada - Ontario - south of 46 deg N and west of 81 deg West.","projected 2D","","","East","North","E","N","9001","","4269","17711","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1124[] = {"32192","NAD83 / MTM zone 12","","","","Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.","projected 2D","","","East","North","E","N","9001","","4269","17712","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1125[] = {"32193","NAD83 / MTM zone 13","","","","Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.","projected 2D","","","East","North","E","N","9001","","4269","17713","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1126[] = {"32194","NAD83 / MTM zone 14","","","","Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17714","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1127[] = {"32195","NAD83 / MTM zone 15","","","","Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17715","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1128[] = {"32196","NAD83 / MTM zone 16","","","","Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17716","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1129[] = {"32197","NAD83 / MTM zone 17","","","","Canada - Ontario - west of 94 deg 30 min West.","projected 2D","","","East","North","E","N","9001","","4269","17717","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1130[] = {"32198","NAD83 / Quebec Lambert","","","","Canada - Quebec","projected 2D","","","East","North","X","Y","9001","","4269","19944","1999-10-20 00:00:00","Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1131[] = {"32201","WGS 72 / UTM zone 1N","","","","180deg to 174deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1132[] = {"32202","WGS 72 / UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1133[] = {"32203","WGS 72 / UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1134[] = {"32204","WGS 72 / UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1135[] = {"32205","WGS 72 / UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1136[] = {"32206","WGS 72 / UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1137[] = {"32207","WGS 72 / UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1138[] = {"32208","WGS 72 / UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1139[] = {"32209","WGS 72 / UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1140[] = {"32210","WGS 72 / UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1141[] = {"32211","WGS 72 / UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1142[] = {"32212","WGS 72 / UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1143[] = {"32213","WGS 72 / UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1144[] = {"32214","WGS 72 / UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1145[] = {"32215","WGS 72 / UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1146[] = {"32216","WGS 72 / UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1147[] = {"32217","WGS 72 / UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1148[] = {"32218","WGS 72 / UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1149[] = {"32219","WGS 72 / UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1150[] = {"32220","WGS 72 / UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1151[] = {"32221","WGS 72 / UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1152[] = {"32222","WGS 72 / UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1153[] = {"32223","WGS 72 / UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1154[] = {"32224","WGS 72 / UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1155[] = {"32225","WGS 72 / UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16025","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1156[] = {"32226","WGS 72 / UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16026","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1157[] = {"32227","WGS 72 / UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1158[] = {"32228","WGS 72 / UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1159[] = {"32229","WGS 72 / UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1160[] = {"32230","WGS 72 / UTM zone 30N","","","","6deg West to 0deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1161[] = {"32231","WGS 72 / UTM zone 31N","","","","0deg to 6deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1162[] = {"32232","WGS 72 / UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1163[] = {"32233","WGS 72 / UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1164[] = {"32234","WGS 72 / UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1165[] = {"32235","WGS 72 / UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1166[] = {"32236","WGS 72 / UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1167[] = {"32237","WGS 72 / UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1168[] = {"32238","WGS 72 / UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1169[] = {"32239","WGS 72 / UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1170[] = {"32240","WGS 72 / UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1171[] = {"32241","WGS 72 / UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16041","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1172[] = {"32242","WGS 72 / UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16042","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1173[] = {"32243","WGS 72 / UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16043","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1174[] = {"32244","WGS 72 / UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16044","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1175[] = {"32245","WGS 72 / UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16045","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1176[] = {"32246","WGS 72 / UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16046","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1177[] = {"32247","WGS 72 / UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1178[] = {"32248","WGS 72 / UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1179[] = {"32249","WGS 72 / UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1180[] = {"32250","WGS 72 / UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1181[] = {"32251","WGS 72 / UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16051","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1182[] = {"32252","WGS 72 / UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16052","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1183[] = {"32253","WGS 72 / UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16053","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1184[] = {"32254","WGS 72 / UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16054","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1185[] = {"32255","WGS 72 / UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16055","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1186[] = {"32256","WGS 72 / UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16056","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1187[] = {"32257","WGS 72 / UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16057","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1188[] = {"32258","WGS 72 / UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16058","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1189[] = {"32259","WGS 72 / UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16059","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1190[] = {"32260","WGS 72 / UTM zone 60N","","","","174deg East to 180deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16060","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1191[] = {"32301","WGS 72 / UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1192[] = {"32302","WGS 72 / UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1193[] = {"32303","WGS 72 / UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1194[] = {"32304","WGS 72 / UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1195[] = {"32305","WGS 72 / UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1196[] = {"32306","WGS 72 / UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16106","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1197[] = {"32307","WGS 72 / UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16107","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1198[] = {"32308","WGS 72 / UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16108","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1199[] = {"32309","WGS 72 / UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16109","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1200[] = {"32310","WGS 72 / UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16110","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1201[] = {"32311","WGS 72 / UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16111","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1202[] = {"32312","WGS 72 / UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16112","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1203[] = {"32313","WGS 72 / UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16113","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1204[] = {"32314","WGS 72 / UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16114","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1205[] = {"32315","WGS 72 / UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16115","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1206[] = {"32316","WGS 72 / UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16116","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1207[] = {"32317","WGS 72 / UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1208[] = {"32318","WGS 72 / UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1209[] = {"32319","WGS 72 / UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1210[] = {"32320","WGS 72 / UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1211[] = {"32321","WGS 72 / UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1212[] = {"32322","WGS 72 / UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1213[] = {"32323","WGS 72 / UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1214[] = {"32324","WGS 72 / UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1215[] = {"32325","WGS 72 / UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16125","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1216[] = {"32326","WGS 72 / UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16126","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1217[] = {"32327","WGS 72 / UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16127","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1218[] = {"32328","WGS 72 / UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16128","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1219[] = {"32329","WGS 72 / UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16129","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1220[] = {"32330","WGS 72 / UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1221[] = {"32331","WGS 72 / UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1222[] = {"32332","WGS 72 / UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1223[] = {"32333","WGS 72 / UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1224[] = {"32334","WGS 72 / UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1225[] = {"32335","WGS 72 / UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1226[] = {"32336","WGS 72 / UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16136","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1227[] = {"32337","WGS 72 / UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16137","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1228[] = {"32338","WGS 72 / UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1229[] = {"32339","WGS 72 / UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1230[] = {"32340","WGS 72 / UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16140","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1231[] = {"32341","WGS 72 / UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1232[] = {"32342","WGS 72 / UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1233[] = {"32343","WGS 72 / UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1234[] = {"32344","WGS 72 / UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16144","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1235[] = {"32345","WGS 72 / UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16145","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1236[] = {"32346","WGS 72 / UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16146","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1237[] = {"32347","WGS 72 / UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16147","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1238[] = {"32348","WGS 72 / UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1239[] = {"32349","WGS 72 / UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1240[] = {"32350","WGS 72 / UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1241[] = {"32351","WGS 72 / UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1242[] = {"32352","WGS 72 / UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1243[] = {"32353","WGS 72 / UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1244[] = {"32354","WGS 72 / UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16154","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1245[] = {"32355","WGS 72 / UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16155","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1246[] = {"32356","WGS 72 / UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16156","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1247[] = {"32357","WGS 72 / UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16157","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1248[] = {"32358","WGS 72 / UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16158","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1249[] = {"32359","WGS 72 / UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16159","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1250[] = {"32360","WGS 72 / UTM zone 60S","","","","174deg East to 180deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4322","16160","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1251[] = {"32401","WGS 72BE / UTM zone 1N","","","","180deg to 174deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1252[] = {"32402","WGS 72BE / UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1253[] = {"32403","WGS 72BE / UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1254[] = {"32404","WGS 72BE / UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1255[] = {"32405","WGS 72BE / UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1256[] = {"32406","WGS 72BE / UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1257[] = {"32407","WGS 72BE / UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1258[] = {"32408","WGS 72BE / UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1259[] = {"32409","WGS 72BE / UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1260[] = {"32410","WGS 72BE / UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1261[] = {"32411","WGS 72BE / UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1262[] = {"32412","WGS 72BE / UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1263[] = {"32413","WGS 72BE / UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1264[] = {"32414","WGS 72BE / UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1265[] = {"32415","WGS 72BE / UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1266[] = {"32416","WGS 72BE / UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1267[] = {"32417","WGS 72BE / UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1268[] = {"32418","WGS 72BE / UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1269[] = {"32419","WGS 72BE / UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1270[] = {"32420","WGS 72BE / UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1271[] = {"32421","WGS 72BE / UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1272[] = {"32422","WGS 72BE / UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1273[] = {"32423","WGS 72BE / UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1274[] = {"32424","WGS 72BE / UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1275[] = {"32425","WGS 72BE / UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16025","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1276[] = {"32426","WGS 72BE / UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16026","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1277[] = {"32427","WGS 72BE / UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1278[] = {"32428","WGS 72BE / UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1279[] = {"32429","WGS 72BE / UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1280[] = {"32430","WGS 72BE / UTM zone 30N","","","","6deg West to 0deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1281[] = {"32431","WGS 72BE / UTM zone 31N","","","","0deg to 6deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1282[] = {"32432","WGS 72BE / UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1283[] = {"32433","WGS 72BE / UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1284[] = {"32434","WGS 72BE / UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1285[] = {"32435","WGS 72BE / UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1286[] = {"32436","WGS 72BE / UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1287[] = {"32437","WGS 72BE / UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1288[] = {"32438","WGS 72BE / UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1289[] = {"32439","WGS 72BE / UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1290[] = {"32440","WGS 72BE / UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1291[] = {"32441","WGS 72BE / UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16041","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1292[] = {"32442","WGS 72BE / UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16042","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1293[] = {"32443","WGS 72BE / UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16043","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1294[] = {"32444","WGS 72BE / UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16044","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1295[] = {"32445","WGS 72BE / UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16045","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1296[] = {"32446","WGS 72BE / UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16046","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1297[] = {"32447","WGS 72BE / UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1298[] = {"32448","WGS 72BE / UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1299[] = {"32449","WGS 72BE / UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1300[] = {"32450","WGS 72BE / UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1301[] = {"32451","WGS 72BE / UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16051","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1302[] = {"32452","WGS 72BE / UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16052","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1303[] = {"32453","WGS 72BE / UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16053","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1304[] = {"32454","WGS 72BE / UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16054","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1305[] = {"32455","WGS 72BE / UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16055","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1306[] = {"32456","WGS 72BE / UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16056","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1307[] = {"32457","WGS 72BE / UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16057","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1308[] = {"32458","WGS 72BE / UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16058","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1309[] = {"32459","WGS 72BE / UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16059","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1310[] = {"32460","WGS 72BE / UTM zone 60N","","","","174deg East to 180deg; northern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16060","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1311[] = {"32501","WGS 72BE / UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1312[] = {"32502","WGS 72BE / UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1313[] = {"32503","WGS 72BE / UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1314[] = {"32504","WGS 72BE / UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1315[] = {"32505","WGS 72BE / UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1316[] = {"32506","WGS 72BE / UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16106","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1317[] = {"32507","WGS 72BE / UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16107","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1318[] = {"32508","WGS 72BE / UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16108","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1319[] = {"32509","WGS 72BE / UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16109","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1320[] = {"32510","WGS 72BE / UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16110","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1321[] = {"32511","WGS 72BE / UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16111","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1322[] = {"32512","WGS 72BE / UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16112","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1323[] = {"32513","WGS 72BE / UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16113","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1324[] = {"32514","WGS 72BE / UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16114","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1325[] = {"32515","WGS 72BE / UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16115","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1326[] = {"32516","WGS 72BE / UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16116","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1327[] = {"32517","WGS 72BE / UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1328[] = {"32518","WGS 72BE / UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1329[] = {"32519","WGS 72BE / UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1330[] = {"32520","WGS 72BE / UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1331[] = {"32521","WGS 72BE / UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1332[] = {"32522","WGS 72BE / UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1333[] = {"32523","WGS 72BE / UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1334[] = {"32524","WGS 72BE / UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1335[] = {"32525","WGS 72BE / UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16125","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1336[] = {"32526","WGS 72BE / UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16126","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1337[] = {"32527","WGS 72BE / UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16127","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1338[] = {"32528","WGS 72BE / UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16128","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1339[] = {"32529","WGS 72BE / UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16129","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1340[] = {"32530","WGS 72BE / UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1341[] = {"32531","WGS 72BE / UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1342[] = {"32532","WGS 72BE / UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1343[] = {"32533","WGS 72BE / UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1344[] = {"32534","WGS 72BE / UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1345[] = {"32535","WGS 72BE / UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1346[] = {"32536","WGS 72BE / UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16136","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1347[] = {"32537","WGS 72BE / UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16137","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1348[] = {"32538","WGS 72BE / UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1349[] = {"32539","WGS 72BE / UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1350[] = {"32540","WGS 72BE / UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16140","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1351[] = {"32541","WGS 72BE / UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1352[] = {"32542","WGS 72BE / UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1353[] = {"32543","WGS 72BE / UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1354[] = {"32544","WGS 72BE / UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16144","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1355[] = {"32545","WGS 72BE / UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16145","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1356[] = {"32546","WGS 72BE / UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16146","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1357[] = {"32547","WGS 72BE / UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16147","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1358[] = {"32548","WGS 72BE / UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1359[] = {"32549","WGS 72BE / UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1360[] = {"32550","WGS 72BE / UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1361[] = {"32551","WGS 72BE / UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1362[] = {"32552","WGS 72BE / UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1363[] = {"32553","WGS 72BE / UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1364[] = {"32554","WGS 72BE / UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16154","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1365[] = {"32555","WGS 72BE / UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16155","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1366[] = {"32556","WGS 72BE / UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16156","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1367[] = {"32557","WGS 72BE / UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16157","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1368[] = {"32558","WGS 72BE / UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16158","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1369[] = {"32559","WGS 72BE / UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16159","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1370[] = {"32560","WGS 72BE / UTM zone 60S","","","","174deg East to 180deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4324","16160","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1371[] = {"32601","WGS 84 / UTM zone 1N","","","","180deg to 174deg West; northern hemisphere; Russia.","projected 2D","","","East","North","E","N","9001","","4326","16001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1372[] = {"32602","WGS 84 / UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere. Russia; United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16002","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1373[] = {"32603","WGS 84 / UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16003","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1374[] = {"32604","WGS 84 / UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16004","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1375[] = {"32605","WGS 84 / UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16005","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1376[] = {"32606","WGS 84 / UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16006","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1377[] = {"32607","WGS 84 / UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16007","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1378[] = {"32608","WGS 84 / UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16008","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1379[] = {"32609","WGS 84 / UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16009","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1380[] = {"32610","WGS 84 / UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).","projected 2D","","","East","North","E","N","9001","","4326","16010","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1381[] = {"32611","WGS 84 / UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16011","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1382[] = {"32612","WGS 84 / UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere. Canada - Alberta; North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16012","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1383[] = {"32613","WGS 84 / UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere. Canada - North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16013","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1384[] = {"32614","WGS 84 / UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere. Canada - Manitoba; Nunavut; Saskatchewan.  Mexico.  United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16014","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1385[] = {"32615","WGS 84 / UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere. Canada - Manitoba; Nunavut; Ontario.  Guatemala.  Mexico.  United States (USA) - Gulf of Mexico (GoM).","projected 2D","","","East","North","E","N","9001","","4326","16015","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1386[] = {"32616","WGS 84 / UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere. Belize. Canada - Manitoba; Nunavut; Ontario.  Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. Puerto Rico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16016","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1387[] = {"32617","WGS 84 / UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere. Bahamas. Ecuador - north of equator. Canada - Nunavut; Ontario; Quebec.  Cayman Islands.  Colombia. Costa Rica. Jamaica. Nicaragua. Panama. Puerto Rico. United States (USA).","projected 2D","","","East","North","E","N","9001","","4326","16017","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1388[] = {"32618","WGS 84 / UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.","projected 2D","","","East","North","E","N","9001","","4326","16018","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1389[] = {"32619","WGS 84 / UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere. Aruba. Bahamas. Brazil. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. Colombia. Dominican Republic. Greenland. Netherlands Antilles. Puerto Rico. Turks and Caicos Islands. Unite","projected 2D","","","East","North","E","N","9001","","4326","16019","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1390[] = {"32620","WGS 84 / UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere. Anguilla. Antigua & Barbuda. Bermuda. Brazil. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. Dominica. Greenland. Grenada. Guadeloupe. Guyana","projected 2D","","","East","North","E","N","9001","","4326","16020","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1391[] = {"32621","WGS 84 / UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere. Barbados. Brazil. Canada - Newfoundland; Quebec. French Guiana. Greenland. Guyana. St. Pierre and Miquelon. Suriname.","projected 2D","","","East","North","E","N","9001","","4326","16021","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1392[] = {"32622","WGS 84 / UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere. Brazil. Canada - Newfoundland. French Guiana. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16022","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1393[] = {"32623","WGS 84 / UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16023","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1394[] = {"32624","WGS 84 / UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16024","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1395[] = {"32625","WGS 84 / UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere. Greenland.","projected 2D","","","East","North","E","N","9001","","4326","16025","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1396[] = {"32626","WGS 84 / UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere. Greenland. Iceland.","projected 2D","","","East","North","E","N","9001","","4326","16026","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1397[] = {"32627","WGS 84 / UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere. Greenland. Iceland.","projected 2D","","","East","North","E","N","9001","","4326","16027","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1398[] = {"32628","WGS 84 / UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.","projected 2D","","","East","North","E","N","9001","","4326","16028","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1399[] = {"32629","WGS 84 / UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere. Algeria. Cote D'Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.","projected 2D","","","East","North","E","N","9001","","4326","16029","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1400[] = {"32630","WGS 84 / UTM zone 30N","","","","6deg West to 0deg; northern hemisphere. Algeria. Burkino Faso. Cote' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).","projected 2D","","","East","North","E","N","9001","","4326","16030","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1401[] = {"32631","WGS 84 / UTM zone 31N","","","","0deg to 6deg East; northern hemisphere. Algeria. Andorra. Benin. Bukino Faso. Denmark - North Sea. France. Germany - North Sea. Ghana. Luxembourg. Mali. Netherlands. Niger. Nigeria. Norway. Spain. Togo. United Kingdom (UK) - North Sea.","projected 2D","","","East","North","E","N","9001","","4326","16031","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1402[] = {"32632","WGS 84 / UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard and Jan Mayen Islands. S","projected 2D","","","East","North","E","N","9001","","4326","16032","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1403[] = {"32633","WGS 84 / UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere. Austria. Bosnia and Herzegowina. Cmeroon. Central African Republic. Chad. Congo. Croatia. Czech Republic. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria.","projected 2D","","","East","North","E","N","9001","","4326","16033","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1404[] = {"32634","WGS 84 / UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere. Albania. Belarus. Bosnia and Herzegowina. Bulgaria. Central African Republic. Chad. Croatia. Democratic Republic of the Congo (Zaire). Estonia. Finland. FYR Macedonia. Greece. Hungary. Italy. Latvia. Libya. Li","projected 2D","","","East","North","E","N","9001","","4326","16034","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1405[] = {"32635","WGS 84 / UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere. Belarus. Bulgaria. Central African Republic. Democratic Republic of the Congo (Zaire). Egypt. Estonia. Finland. Greece. Latvia. Lesotho. Libya. Lithuania. Moldova. Norway. Romania. Russia. Sudan. Svalbard. Tur","projected 2D","","","East","North","E","N","9001","","4326","16035","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1406[] = {"32636","WGS 84 / UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere. Belarus. Cyprus. Egypt. Ethiopia. Finland. Israel. Jordan. Kenya. Lebanon. Norway. Russia. Saudi Arabia. Sudan. Syria. Turkey. Uganda. Ukraine.","projected 2D","","","East","North","E","N","9001","","4326","16036","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1407[] = {"32637","WGS 84 / UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere. Djibouti. Egypt. Eritrea. Ethiopia. Georgia. Iraq. Jordan. Kenya. Lebanon. Russia. Saudi Arabia. Somalia. Sudan. Syria. Turkey. Ukraine.","projected 2D","","","East","North","E","N","9001","","4326","16037","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1408[] = {"32638","WGS 84 / UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Iran. Iraq. Kazakhstan. Kuwait. Russia. Saudi Arabia. Somalia. Turkey. Yemen.","projected 2D","","","East","North","E","N","9001","","4326","16038","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1409[] = {"32639","WGS 84 / UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere. Azerbaijan. Bahrain. Iran. Kazakhstan. Kuwait. Oman. Qatar. Russia. Saudi Arabia. Somalia. Turkmenistan. United Arab Emirates. Yemen.","projected 2D","","","East","North","E","N","9001","","4326","16039","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1410[] = {"32640","WGS 84 / UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere. Iran. Kazakhstan. Oman. Russia. Saudi Arabia. Turkmenistan. United Arab Emirates. Uzbekistan.","projected 2D","","","East","North","E","N","9001","","4326","16040","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1411[] = {"32641","WGS 84 / UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere. Afghanistan. Iran. Kazakhstan. Pakistan. Russia. Turkmenistan.  Uzbekistan.","projected 2D","","","East","North","E","N","9001","","4326","16041","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1412[] = {"32642","WGS 84 / UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere. Afghanistan. India. Kazakhstan. Kyrgyzstan. Pakistan. Russia. Tajikistan. Uzbekistan.","projected 2D","","","East","North","E","N","9001","","4326","16042","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1413[] = {"32643","WGS 84 / UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Maldives. Pakistan. Russia. Tajikistan.","projected 2D","","","East","North","E","N","9001","","4326","16043","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1414[] = {"32644","WGS 84 / UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Nepal. Russia. Sri Lanka.","projected 2D","","","East","North","E","N","9001","","4326","16044","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1415[] = {"32645","WGS 84 / UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere. Bangladesh. Bhutan. China. India. Kazakhstan. Mongolia. Nepal. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16045","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1416[] = {"32646","WGS 84 / UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere. Bangladesh. Bhutan. China. Indonesia. Mongolia. Myanmar (Burma). Russia.","projected 2D","","","East","North","E","N","9001","","4326","16046","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1417[] = {"32647","WGS 84 / UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russia. Thailand.","projected 2D","","","East","North","E","N","9001","","4326","16047","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1418[] = {"32648","WGS 84 / UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere. Cambodia. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Russia. Singapore. Thailand. Vietnam.","projected 2D","","","East","North","E","N","9001","","4326","16048","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1419[] = {"32649","WGS 84 / UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere. China. Hong Kong. Indonesia. Macau. Malaysia - East Malaysia - Sarawak. Mongolia. Russia. Vietnam.","projected 2D","","","East","North","E","N","9001","","4326","16049","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1420[] = {"32650","WGS 84 / UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere. Brunei. China. Indonesia. Malaysia - East Malaysia - Sarawak. Mongolia. Philippines. Russia. Taiwan.","projected 2D","","","East","North","E","N","9001","","4326","16050","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1421[] = {"32651","WGS 84 / UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Philippines. Russia.  South Korea. Taiwan.","projected 2D","","","East","North","E","N","9001","","4326","16051","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1422[] = {"32652","WGS 84 / UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Russia. South Korea.","projected 2D","","","East","North","E","N","9001","","4326","16052","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1423[] = {"32653","WGS 84 / UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere. China. Japan. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16053","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1424[] = {"32654","WGS 84 / UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere. Japan. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16054","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1425[] = {"32655","WGS 84 / UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere. Japan. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16055","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1426[] = {"32656","WGS 84 / UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16056","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1427[] = {"32657","WGS 84 / UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16057","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1428[] = {"32658","WGS 84 / UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16058","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1429[] = {"32659","WGS 84 / UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16059","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1430[] = {"32660","WGS 84 / UTM zone 60N","","","","174deg East to 180deg; northern hemisphere. Russia.","projected 2D","","","East","North","E","N","9001","","4326","16060","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1431[] = {"32661","WGS 84 / UPS North","","","","Polar areas north of 84 deg N.","projected 2D","","","East","North","E","N","9001","","4326","16061","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1432[] = {"32701","WGS 84 / UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16101","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1433[] = {"32702","WGS 84 / UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16102","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1434[] = {"32703","WGS 84 / UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16103","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1435[] = {"32704","WGS 84 / UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16104","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1436[] = {"32705","WGS 84 / UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16105","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1437[] = {"32706","WGS 84 / UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16106","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1438[] = {"32707","WGS 84 / UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16107","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1439[] = {"32708","WGS 84 / UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16108","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1440[] = {"32709","WGS 84 / UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16109","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1441[] = {"32710","WGS 84 / UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16110","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1442[] = {"32711","WGS 84 / UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16111","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1443[] = {"32712","WGS 84 / UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16112","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1444[] = {"32713","WGS 84 / UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16113","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1445[] = {"32714","WGS 84 / UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16114","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1446[] = {"32715","WGS 84 / UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16115","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1447[] = {"32716","WGS 84 / UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16116","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1448[] = {"32717","WGS 84 / UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere. Ecuador. Peru.","projected 2D","","","East","North","E","N","9001","","4326","16117","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1449[] = {"32718","WGS 84 / UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.","projected 2D","","","East","North","E","N","9001","","4326","16118","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1450[] = {"32719","WGS 84 / UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.","projected 2D","","","East","North","E","N","9001","","4326","16119","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1451[] = {"32720","WGS 84 / UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.","projected 2D","","","East","North","E","N","9001","","4326","16120","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1452[] = {"32721","WGS 84 / UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.","projected 2D","","","East","North","E","N","9001","","4326","16121","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1453[] = {"32722","WGS 84 / UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere. Brazil.  Uruguay.","projected 2D","","","East","North","E","N","9001","","4326","16122","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1454[] = {"32723","WGS 84 / UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere. Brazil.","projected 2D","","","East","North","E","N","9001","","4326","16123","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1455[] = {"32724","WGS 84 / UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere. Brazil. South Georgia and the South Sandwich Islands.","projected 2D","","","East","North","E","N","9001","","4326","16124","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1456[] = {"32725","WGS 84 / UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere. Brazil.","projected 2D","","","East","North","E","N","9001","","4326","16125","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1457[] = {"32726","WGS 84 / UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16126","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1458[] = {"32727","WGS 84 / UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16127","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1459[] = {"32728","WGS 84 / UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16128","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1460[] = {"32729","WGS 84 / UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16129","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1461[] = {"32730","WGS 84 / UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16130","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1462[] = {"32731","WGS 84 / UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16131","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1463[] = {"32732","WGS 84 / UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere. Angola. Congo. Gabon. Namibia.","projected 2D","","","East","North","E","N","9001","","4326","16132","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1464[] = {"32733","WGS 84 / UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere. Angola. Congo. Democratic Republic of the Congo (Zaire). Gabon. Namibia. South Africa.","projected 2D","","","East","North","E","N","9001","","4326","16133","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1465[] = {"32734","WGS 84 / UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere. Angola. Botswana. Democratic Republic of the Congo (Zaire). Namibia. South Africa. Zambia.","projected 2D","","","East","North","E","N","9001","","4326","16134","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1466[] = {"32735","WGS 84 / UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere. Botswana. Burundi. Democratic Republic of the Congo (Zaire). Rwanda. South Africa. Tanzania. Uganda. Zambia. Zimbabwe.","projected 2D","","","East","North","E","N","9001","","4326","16135","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1467[] = {"32736","WGS 84 / UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere. Burundi. Kenya. Malawi. Mozambique. Rwanda. South Africa. Swaziland. Tanzania. Uganda. Zambia. Zimbabwe.","projected 2D","","","East","North","E","N","9001","","4326","16136","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1468[] = {"32737","WGS 84 / UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere. Kenya. Mozambique. Tanzania.","projected 2D","","","East","North","E","N","9001","","4326","16137","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1469[] = {"32738","WGS 84 / UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere. Madagascar.","projected 2D","","","East","North","E","N","9001","","4326","16138","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1470[] = {"32739","WGS 84 / UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere. Madagascar.","projected 2D","","","East","North","E","N","9001","","4326","16139","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1471[] = {"32740","WGS 84 / UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere. Seychelles.","projected 2D","","","East","North","E","N","9001","","4326","16140","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1472[] = {"32741","WGS 84 / UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16141","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1473[] = {"32742","WGS 84 / UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16142","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1474[] = {"32743","WGS 84 / UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16143","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1475[] = {"32744","WGS 84 / UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16144","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1476[] = {"32745","WGS 84 / UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16145","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1477[] = {"32746","WGS 84 / UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16146","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1478[] = {"32747","WGS 84 / UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16147","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1479[] = {"32748","WGS 84 / UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16148","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1480[] = {"32749","WGS 84 / UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere. Australia. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16149","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1481[] = {"32750","WGS 84 / UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere. Australia. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16150","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1482[] = {"32751","WGS 84 / UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere. Australia. East Timor. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16151","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1483[] = {"32752","WGS 84 / UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere. Australia. East Timor. Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16152","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1484[] = {"32753","WGS 84 / UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere. Australia.  Indonesia.","projected 2D","","","East","North","E","N","9001","","4326","16153","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1485[] = {"32754","WGS 84 / UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere. Australia. Indonesia. Papua New Guinea.","projected 2D","","","East","North","E","N","9001","","4326","16154","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1486[] = {"32755","WGS 84 / UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere. Australia. Papua New Guinea.","projected 2D","","","East","North","E","N","9001","","4326","16155","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1487[] = {"32756","WGS 84 / UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere. Australia. Papua New Guinea.","projected 2D","","","East","North","E","N","9001","","4326","16156","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1488[] = {"32757","WGS 84 / UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16157","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1489[] = {"32758","WGS 84 / UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","projected 2D","","","East","North","E","N","9001","","4326","16158","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1490[] = {"32759","WGS 84 / UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere. New Zealand.","projected 2D","","","East","North","E","N","9001","","4326","16159","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1491[] = {"32760","WGS 84 / UTM zone 60S","","","","174deg East to 180deg; southern hemisphere. New Zealand.","projected 2D","","","East","North","E","N","9001","","4326","16160","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1492[] = {"32761","WGS 84 / UPS South","","","","Polar areas south of 80 deg S.","projected 2D","","","East","North","E","N","9001","","4326","16161","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t horiz_cs_row_1493[] = {"32766","WGS 84 / TM 36 SE","","","","Mozambique - offshore.","projected 2D","","","East","North","E","N","9001","","4326","16636","1998-11-11 00:00:00","BP Mozambique","EPSG","Used by BP Mozambique for Offshore Zambezi block.","",NULL};
+
+datafile_rows_t *horiz_cs_rows[] = {horiz_cs_row_1,horiz_cs_row_2,horiz_cs_row_3,horiz_cs_row_4,horiz_cs_row_5,horiz_cs_row_6,horiz_cs_row_7,horiz_cs_row_8,horiz_cs_row_9,horiz_cs_row_10,horiz_cs_row_11,horiz_cs_row_12,horiz_cs_row_13,horiz_cs_row_14,horiz_cs_row_15,horiz_cs_row_16,horiz_cs_row_17,horiz_cs_row_18,horiz_cs_row_19,horiz_cs_row_20,horiz_cs_row_21,horiz_cs_row_22,horiz_cs_row_23,horiz_cs_row_24,horiz_cs_row_25,horiz_cs_row_26,horiz_cs_row_27,horiz_cs_row_28,horiz_cs_row_29,h [...]
diff --git a/src/tiff/csv/horiz_cs.csv b/src/tiff/csv/horiz_cs.csv
new file mode 100644
index 0000000..b0f757a
--- /dev/null
+++ b/src/tiff/csv/horiz_cs.csv
@@ -0,0 +1,1493 @@
+"HORIZCS_CODE","HORIZCS_EPSG_NAME","HORIZCS_EPSG_ABBR","HORIZCS_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_SYS_TYPE","GEOD_DATUM_CODE","PRIME_MERIDIAN_CODE","ORIENT_POSITIVE_AXIS_1","ORIENT_POSITIVE_AXIS_2","COORD_SYS_AXIS_1_ABBR","COORD_SYS_AXIS_2_ABBR","UOM_LENGTH_CODE","UOM_ANGLE_CODE","SOURCE_GEOGCS_CODE","PROJECTION_TRF_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+200,Anguilla 1957 / British West Indies Grid,Anguilla 1957 / BWI Grid,,,Anguilla,projected 2D,,,East,North,E,N,9001,,4600,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+201,Antigua 1943 / British West Indies Grid,Antigua 1943 / BWI Grid,,,Antigua and Barbuda - Antigua,projected 2D,,,East,North,E,N,9001,,4601,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+202,Dominica 1945 / British West Indies Grid,Dominica 1945 / BWI Grid,,,Dominica,projected 2D,,,East,North,E,N,9001,,4602,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+203,Grenada 1953 / British West Indies Grid,Grenada 1953 / BWI Grid,,,Grenada (including Grenada Grenadines),projected 2D,,,East,North,E,N,9001,,4603,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+204,Montserrat 58 / British West Indies Grid,Montserrat 58 / BWI Grid,,,Montserrat,projected 2D,,,East,North,E,N,9001,,4604,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+205,St Kitts 1955 / British West Indies Grid,St Kitts 1955 / BWI Grid,,,Saint Kitts and Nevis,projected 2D,,,East,North,E,N,9001,,4605,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+206,St Lucia 1955 / British West Indies Grid,St Lucia 1955 / BWI Grid,,,Saint Lucia,projected 2D,,,East,North,E,N,9001,,4606,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+207,St Vincent 45 / British West Indies Grid,St Vincent 45 / BWI Grid,,,Saint Vincent and the Grenadines,projected 2D,,,East,North,E,N,9001,,4607,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+208,NAD27(CGQ77) / SCoPQ zone 2,CGQ77 / SCoPQ zone 2,,,Canada - Quebec - east of 57 deg East.,projected 2D,,,East,North,X,Y,9001,,4609,17700,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+209,NAD27(CGQ77) / SCoPQ zone 3,CGQ77 / SCoPQ zone 3,,,Canada - Quebec between 60 deg and 57 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17703,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+210,NAD27(CGQ77) / SCoPQ zone 4,CGQ77 / SCoPQ zone 4,,,Canada - Quebec between 63 deg and 60 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17704,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+211,NAD27(CGQ77) / SCoPQ zone 5,CGQ77 / SCoPQ zone 5,,,Canada - Quebec between 66 deg and 63 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17705,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+212,NAD27(CGQ77) / SCoPQ zone 6,CGQ77 / SCoPQ zone 6,,,Canada - Quebec between 69 deg and  66 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17706,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+213,NAD27(CGQ77) / SCoPQ zone 7,CGQ77 / SCoPQ zone 7,,,Canada - Quebec between 72 deg and 69 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17707,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+214,NAD27(CGQ77) / SCoPQ zone 8,CGQ77 / SCoPQ zone 8,,,Canada - Quebec between 75 deg and 72 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17708,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+215,NAD27(CGQ77) / SCoPQ zone 9,CGQ77 / SCoPQ zone 9,,,Canada - Quebec between 78 deg and 75 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17709,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+216,NAD27(CGQ77) / SCoPQ zone 10,CGQ77 / SCoPQ zone 10,,,Canada - Quebec west of 78 deg West.,projected 2D,,,East,North,X,Y,9001,,4609,17710,1999-07-24 00:00:00,Geodetic Service of Quebec; Quebec Ministry of Natural Resources.,EPSG,,
+217,NAD27(76) / MTM zone 8,,,,Canada - Ontario - east of 75 deg West.,projected 2D,,,East,North,X,Y,9001,,4608,17708,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+218,NAD27(76) / MTM zone 9,,,,Canada - Ontario - between 78 deg and 75 deg West.,projected 2D,,,East,North,X,Y,9001,,4608,17709,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+219,NAD27(76) / MTM zone 10,,,,Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,projected 2D,,,East,North,X,Y,9001,,4608,17710,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+220,NAD27(76) / MTM zone 11,,,,Canada - Ontario - south of 46 deg N and west of 81 deg West.,projected 2D,,,East,North,E,N,9001,,4608,17711,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+221,NAD27(76) / MTM zone 12,,,,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,projected 2D,,,East,North,E,N,9001,,4608,17712,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+222,NAD27(76) / MTM zone 13,,,,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,projected 2D,,,East,North,E,N,9001,,4608,17713,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+223,NAD27(76) / MTM zone 14,,,,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17714,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+224,NAD27(76) / MTM zone 15,,,,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17715,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+225,NAD27(76) / MTM zone 16,,,,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17716,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+226,NAD27(76) / MTM zone 17,,,,Canada - Ontario - west of 94 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4608,17717,1999-07-24 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+227,NAD27(76) / UTM zone 15N,,,,Canada - Ontario - 96deg West  to 90deg West.,projected 2D,,,East,North,E,N,9001,,4608,16015,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 15N (code 26715).,
+228,NAD27(76) / UTM zone 16N,,,,Canada - Ontario - 90deg West  to 84deg West.,projected 2D,,,East,North,E,N,9001,,4608,16016,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 16N (code 26716).,
+229,NAD27(76) / UTM zone 17N,,,,Canada - Ontario - 84deg West  to 78deg West.,projected 2D,,,East,North,E,N,9001,,4608,16017,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 17N (code 26717).,
+230,NAD27(76) / UTM zone 18N,,,,Canada - Ontario - east of 78 deg West.,projected 2D,,,East,North,E,N,9001,,4608,16018,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 18N (code 26718).,
+231,NAD27(CGQ77) / UTM zone 17N,CGQ77 / UTM zone 17N,,,Canada - Quebec - west of 78 deg West.,projected 2D,,,East,North,E,N,9001,,4609,16017,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 17N (code 26717).,
+232,NAD27(CGQ77) / UTM zone 18N,CGQ77 / UTM zone 18N,,,Canada - Quebec -78deg West  to 72deg West.,projected 2D,,,East,North,E,N,9001,,4609,16018,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 18N (code 26718).,
+233,NAD27(CGQ77) / UTM zone 19N,CGQ77 / UTM zone 19N,,,Canada - Quebec - 72deg West  to 66deg West.,projected 2D,,,East,North,E,N,9001,,4609,16019,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 19N (code 26719).,
+234,NAD27(CGQ77) / UTM zone 20N,CGQ77 / UTM zone 20N,,,Canada - Quebec - 66deg West  to 60deg West.,projected 2D,,,East,North,E,N,9001,,4609,16020,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 20N (code 26720).,
+235,NAD27(CGQ77) / UTM zone 21N,CGQ77 / UTM zone 21N,,,Canada - Quebec - east of 60deg West.,projected 2D,,,East,North,E,N,9001,,4609,16021,1999-07-24 00:00:00,,EPSG,Supersedes NAD27 / UTM zone 21N (code 26721).,
+236,NAD83(CSRS98) / New Brunswick Stereo,NAD83(98) / NB Stereo,,,Canada - New Brunswick,projected 2D,,,North,East,N,E,9001,,4140,19946,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,In use from 1999.,
+237,NAD83(CSRS98) / UTM zone 19N,NAD83(98) / UTM 19N,,,Canada - New Brunswick west of 66 deg West.,projected 2D,,,East,North,E,N,9001,,4140,16019,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,In use from 1999.,
+238,NAD83(CSRS98) / UTM zone 20N,NAD83(98) / UTM 20N,,,Canada - New Brunswick east of 66 deg West.,projected 2D,,,East,North,E,N,9001,,4140,16020,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,In use from 1999.,
+239,Israel / Israeli TM Grid,Israeli TM Grid,,,Israel.,projected 2D,,,East,North,E,N,9001,,4141,18204,1999-10-20 00:00:00,Survey of Israel.,EPSG,Supercedes Israeli CS Grid (EPSG code 28193).,
+240,Locodjo 1965 / UTM zone 30N,Locodjo 65 / UTM 30N,,,Cote D'Ivoire (Ivory Coast) east of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4142,16030,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded by Abidjan 87 / UTM 30N (EPSG code 241).,
+241,Abidjan 1987 / UTM zone 30N,Abidjan 87 / UTM 30N,,,Cote D'Ivoire (Ivory Coast) east of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4143,16030,1999-10-20 00:00:00,IGN Paris,EPSG,Supersedes Locodjo 65 / UTM 30N (EPSG code 240).,
+242,Locodjo 1965 / UTM zone 29N,Locodjo 65 / UTM 29N,,,Cote D'Ivoire (Ivory Coast) west of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4142,16029,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded by Abidjan 87 / UTM 29N (EPSG code 243).,
+243,Abidjan 1987 / UTM zone 29N,Abidjan 87 / UTM 29N,,,Cote D'Ivoire (Ivory Coast) west of 6 deg West.,projected 2D,,,East,North,E,N,9001,,4143,16029,1999-10-20 00:00:00,IGN Paris,EPSG,Supersedes Locodjo 65 / UTM 29N (EPSG code 242).,
+244,Hanoi 1972 / Gauss-Kruger zone 18,Hanoi 72 / Gauss zone 18,,,Vietnam - west of 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4147,16218,1999-10-20 00:00:00,,EPSG,Replaces use of Indian 1960 / UTM zone 48 after 1988.,
+245,Hanoi 1972 / Gauss-Kruger zone 19,Hanoi 72 / Gauss zone 19,,,Vietnam - east of 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4147,16219,1999-10-20 00:00:00,,EPSG,Replaces use of Indian 1960 / UTM zone 48 after 1988.,
+246,Hartbeesthoek94 / Lo15,New S African CS zone 15,,,South Africa - Walvis Bay.,projected 2D,,,West,South,W,S,9001,,4148,17515,1999-10-20 00:00:00,,EPSG,,
+247,Hartbeesthoek94 / Lo17,New S African CS zone 17,,,South Africa - west of 18 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17517,1999-10-20 00:00:00,,EPSG,,
+248,Hartbeesthoek94 / Lo19,New S African CS zone 19,,,South Africa - 18 to 20 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17519,1999-10-20 00:00:00,,EPSG,,
+249,Hartbeesthoek94 / Lo21,New S African CS zone 21,,,South Africa - 20 to 22 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17521,1999-10-20 00:00:00,,EPSG,,
+250,Hartbeesthoek94 / Lo23,New S African CS zone 23,,,South Africa - 22 to 24 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17523,1999-10-20 00:00:00,,EPSG,,
+251,Hartbeesthoek94 / Lo25,New S African CS zone 25,,,Lestho  - west of 26 deg East; South Africa - 24 to 26 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17525,1999-10-20 00:00:00,,EPSG,,
+252,Hartbeesthoek94 / Lo27,New S African CS zone 27,,,Lestho  - east of 26 deg East;  South Africa - 26 to 28 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17527,1999-10-20 00:00:00,,EPSG,,
+253,Hartbeesthoek94 / Lo29,New S African CS zone 29,,,South Africa - 28 to 30 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17529,1999-10-20 00:00:00,,EPSG,,
+254,Hartbeesthoek94 / Lo31,New S African CS zone 31,,,South Africa - 30 to 32 deg East;  Swaziland.,projected 2D,,,West,South,W,S,9001,,4148,17533,1999-10-20 00:00:00,,EPSG,,
+255,Hartbeesthoek94 / Lo33,New S African CS zone 33,,,South Africa - east of 32 deg East.,projected 2D,,,West,South,W,S,9001,,4148,17533,1999-10-20 00:00:00,,EPSG,,
+256,CH1903+ / LV95,LV95,,,Liechtenstein; Switzerland.,projected 2D,,,East,North,Y,X,9001,,4150,19950,1999-10-20 00:00:00,,EPSG,Supersedes CH1903/LV03 (code 21781).,
+257,Rassadiran / Nakhl e Taqi,,,,Iran - Taheri refinery site only.,projected 2D,,,East,North,E,N,9001,,4153,19951,1999-10-20 00:00:00,Total-Fina,EPSG,Used for terminal site only.,
+258,ED50(ED77) / UTM zone 38N,,,,Iran - west of 48deg East.,projected 2D,,,East,North,E,N,9001,,4154,16038,1999-10-20 00:00:00,,EPSG,,
+259,ED50(ED77) / UTM zone 39N,,,,Iran - 48deg to 54 deg East.,projected 2D,,,East,North,E,N,9001,,4154,16039,1999-10-20 00:00:00,,EPSG,,
+260,ED50(ED77) / UTM zone 40N,,,,Iran - 54deg to 60 deg East.,projected 2D,,,East,North,E,N,9001,,4154,16040,1999-10-20 00:00:00,,EPSG,,
+261,ED50(ED77) / UTM zone 41N,,,,Iran - east of 60deg East.,projected 2D,,,East,North,E,N,9001,,4154,16041,1999-10-20 00:00:00,,EPSG,,
+300,Madrid 1870 (Madrid) / Spain,,,,Spain,projected 2D,,,East,North,X,Y,9001,,4903,19921,1998-11-11 00:00:00,,EPSG,Superseded by ED50 / UTM after 1966.,
+2100,GGRS87 / Greek Grid,,,,Greece,projected 2D,,,East,North,E,N,9001,,4121,19930,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,Oil industry uses ED50 / UTM zone 34N and ED50 / UTM zone 35N.,
+2200,ATS77 / New Brunswick Stereographic,ATS77 / NB Stereographic,,,Canada - New Brunswick,projected 2D,,,North,East,N,E,9001,,4122,19945,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979.  To be phased out in late 1990's.,99.61
+2219,ATS77 / UTM zone 19N,,,,Canada - New Brunswick - west of 66 deg W.,projected 2D,,,East,North,E,N,9001,,4122,16019,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+2220,ATS77 / UTM zone 20N,,,,Canada - New Brunswick - east of 66 deg W.; Canada - Nova Scotia; Canada - Prince Edward Island.,projected 2D,,,East,North,E,N,9001,,4122,16020,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+2290,ATS77 / Prince Edward Isl. Stereographic,ATS77 / PEI Stereo,,,Canada - Prince Edward Island,projected 2D,,,East,North,E(X),N(Y),9001,,4122,19933,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+2294,ATS77 / MTM Nova Scotia zone 4,ATS77 / MTM NS zone 4,,,Canada - Nova Scotia - east of 63 deg West.,projected 2D,,,East,North,E,N,9001,,4122,17794,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+2295,ATS77 / MTM Nova Scotia zone 5,ATS77 / MTM NS zone 5,,,Canada - Nova Scotia - west of 63 deg West.,projected 2D,,,East,North,E,N,9001,,4122,17795,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+2391,KKJ / Finland zone 1,,,,Finland - west of 22deg 30min E.,projected 2D,,,North,East,X,Y,9001,,4123,18191,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+2392,KKJ / Finland zone 2,,,,Finland - 22deg 30 min to 25deg 30min E.,projected 2D,,,North,East,X,Y,9001,,4123,18192,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+2393,KKJ / Finland Uniform Coordinate System,KKJ / Finland zone 3,,,Finland; Finland - 25 deg 30min E to 28deg 30min E.,projected 2D,,,North,East,X,Y,9001,,4123,18193,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,Known as Uniform Coordinate System when used over all country and also as Basic Coordinate System zone 3 at larger scales.,
+2394,KKJ / Finland zone 4,,,,Finland - east of 28deg 30 min E.,projected 2D,,,North,East,X,Y,9001,,4123,18194,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+2400,RT90 2.5 gon W,,,,Sweden,projected 2D,,,North,East,X,Y,9001,,4124,19929,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+2550,Samboja / UTM zone 50S,,,,Indonesia - east Kalimantan - Mahakam delta area.,projected 2D,,,East,North,E,N,9001,,4125,16150,1997-11-13 00:00:00,,EPSG,,
+2600,Lietuvos Koordinoei Sistema 1994,LKS94,,,Lithuania,projected 2D,,,North,East,X,Y,9001,,4126,19934,1998-03-12 00:00:00,,EPSG,,
+2736,Tete / UTM zone 36S,,,,Mozambique - west of 36 deg E.,projected 2D,,,East,North,E,N,9001,,4127,16136,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+2737,Tete / UTM zone 37S,,,,Mozambique - east of 36 deg E,projected 2D,,,East,North,E,N,9001,,4127,16137,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+3036,Moznet / UTM zone 36S,,,,Mozambique - west of 36 deg E.,projected 2D,,,East,North,E,N,9001,,4130,16136,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+3037,Moznet / UTM zone 37S,,,,Mozambique - east of 36 deg E,projected 2D,,,East,North,E,N,9001,,4130,16137,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+3148,Indian 1960 / UTM zone 48N,,,,Cambodia; Vietnam west of 108deg East.,projected 2D,,,East,North,E,N,9001,,4131,16048,1998-11-11 00:00:00,,EPSG,In Vietnam superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,
+3149,Indian 1960 / UTM zone 49N,,,,Vietnam east of 108deg East.,projected 2D,,,East,North,E,N,9001,,4131,16049,1998-11-11 00:00:00,,EPSG,Superseded by Hanoi 72 / Gauss zone 18 from 1988 onwards.,
+3176,Indian 1960 / TM 106 NE,,,,Vietnam - offshore.,projected 2D,,,East,North,E,N,9001,,4131,16506,1998-11-11 00:00:00,Petrovietnam,EPSG,Used by Petrovietnam for offshore block 15.,
+3200,FD58 / Iraq zone,,,,Iran - Gulf coast and Arwaz areas.,projected 2D,,,East,North,E,N,9001,,4132,19906,1998-11-11 00:00:00,IOEPC records.,EPSG,,
+3300,Estonian Coordinate System of 1992,,,,Estonia.,projected 2D,,,North,East,X,Y,9001,,4133,19938,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Used for 1:20000 and larger scale mapping.,
+3439,PSD93 / UTM zone 39N,,,,Oman - west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4134,16039,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud / UTM zone 39N projCS (code 23239). Maximum differences to Fahud adjustment are 20 metres.,
+3440,PSD93 / UTM zone 40N,,,,Oman - east of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4134,16040,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud / UTM zone 40N projCS (code 23240). Maximum differences to Fahud adjustment are 20 metres.,
+3561,Old Hawaiian / Hawaii zone 1,Old Hawaiian / SP zone 1,,,United States (USA) - Hawaii - island of Hawaii.,projected 2D,,,East,North,X,Y,9003,,4135,15101,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 1.,99.322
+3562,Old Hawaiian / Hawaii zone 2,Old Hawaiian / SP zone 2,,,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,projected 2D,,,East,North,X,Y,9003,,4135,15102,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 2.,99.322
+3563,Old Hawaiian / Hawaii zone 3,Old Hawaiian / SP zone 3,,,United States (USA) - Hawaii - Oahu.,projected 2D,,,East,North,X,Y,9003,,4135,15103,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 3.,99.322
+3564,Old Hawaiian / Hawaii zone 4,Old Hawaiian / SP zone 4,,,United States (USA) - Hawaii - Kauai.,projected 2D,,,East,North,X,Y,9003,,4135,15104,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 4.,99.322
+3565,Old Hawaiian / Hawaii zone 5,Old Hawaiian / SP zone 5,,,United States (USA) - Hawaii - Niihau.,projected 2D,,,East,North,X,Y,9003,,4135,15105,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Hawaii zone 5.,99.322
+3920,Puerto Rico / UTM zone 20N,,,,British Virgin Islands (civilian).,projected 2D,,,East,North,E,N,9001,,4139,16020,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,NAD27 / UTM zone 20 N (code 26720) used for military purposes.,
+3991,Puerto Rico State Plane CS of 1927,Puerto Rico SPCS 27,,,Puerto Rico.,projected 2D,,,East,North,X,Y,9003,,4139,15201,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / Puerto Rico State Plane CS.,99.323
+3992,Puerto Rico / St. Croix,,,,US Virgin Islands (U.S.).,projected 2D,,,East,North,X,Y,9003,,4139,15202,1999-05-24 00:00:00,,EPSG,Sometimes erroneously referred to as NAD27 / St. Croix State Plane CS.,99.323
+4001,Unknown datum based upon ellipsoid 7001,,,,,geographic 2D,6001,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4002,Unknown datum based upon ellipsoid 7002,,,,,geographic 2D,6002,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4003,Unknown datum based upon ellipsoid 7003,,,,,geographic 2D,6003,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4004,Unknown datum based upon ellipsoid 7004,,,,,geographic 2D,6004,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4005,Unknown datum based upon ellipsoid 7005,,,,,geographic 2D,6005,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4006,Unknown datum based upon ellipsoid 7006,,,,,geographic 2D,6006,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4007,Unknown datum based upon ellipsoid 7007,,,,,geographic 2D,6007,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4008,Unknown datum based upon ellipsoid 7008,,,,,geographic 2D,6008,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4009,Unknown datum based upon ellipsoid 7009,,,,,geographic 2D,6009,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4010,Unknown datum based upon ellipsoid 7010,,,,,geographic 2D,6010,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4011,Unknown datum based upon ellipsoid 7011,,,,,geographic 2D,6011,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4012,Unknown datum based upon ellipsoid 7012,,,,,geographic 2D,6012,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4013,Unknown datum based upon ellipsoid 7013,,,,,geographic 2D,6013,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4014,Unknown datum based upon ellipsoid 7014,,,,,geographic 2D,6014,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4015,Unknown datum based upon ellipsoid 7015,,,,,geographic 2D,6015,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4016,Unknown datum based upon ellipsoid 7016,,,,,geographic 2D,6016,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4017,Unknown datum based upon ellipsoid 7017,,,,,geographic 2D,6017,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4018,Unknown datum based upon ellipsoid 7018,,,,,geographic 2D,6018,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4019,Unknown datum based upon ellipsoid 7019,,,,,geographic 2D,6019,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4020,Unknown datum based upon ellipsoid 7020,,,,,geographic 2D,6020,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4021,Unknown datum based upon ellipsoid 7021,,,,,geographic 2D,6021,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4022,Unknown datum based upon ellipsoid 7022,,,,,geographic 2D,6022,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4024,Unknown datum based upon ellipsoid 7024,,,,,geographic 2D,6024,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4025,Unknown datum based upon ellipsoid 7025,,,,,geographic 2D,6025,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4027,Unknown datum based upon ellipsoid 7027,,,,,geographic 2D,6027,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4028,Unknown datum based upon ellipsoid 7028,,,,,geographic 2D,6028,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4029,Unknown datum based upon ellipsoid 7029,,,,,geographic 2D,6029,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4030,Unknown datum based upon ellipsoid 7030,,,,,geographic 2D,6030,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4031,Unknown datum based upon ellipsoid 7031,,,,,geographic 2D,6031,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4032,Unknown datum based upon ellipsoid 7032,,,,,geographic 2D,6032,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4033,Unknown datum based upon ellipsoid 7033,,,,,geographic 2D,6033,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4034,Unknown datum based upon ellipsoid 7034,,,,,geographic 2D,6034,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4035,Unknown datum based upon ellipsoid 7035,,,,,geographic 2D,6035,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,96.08
+4036,Unknown datum based upon ellipsoid 7036,,,,,geographic 2D,6036,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,
+4041,Unknown datum based upon ellipsoid 7041,,,,,geographic 2D,6041,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,
+4042,Unknown datum based upon ellipsoid 7042,,,,,geographic 2D,6042,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,
+4043,Unknown datum based upon ellipsoid 7043,,,,,geographic 2D,6043,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,
+4044,Unknown datum based upon ellipsoid 7044,,,,,geographic 2D,6044,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,
+4045,Unknown datum based upon ellipsoid 7045,,,,,geographic 2D,6045,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Not recommended.  Use only in cases where geodetic datum unknown.,
+4120,Greek,,,,Greece,geographic 2D,6120,8901,North,East,Lat,Long,,9108,,,1997-06-16 00:00:00,Topography Department; National Technical University of Greece.,EPSG,,
+4121,GGRS87,,,,Greece,geographic 2D,6121,8901,North,East,Lat,Long,,9108,,,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,,
+4122,ATS77,,,,Canada - New Brunswick; Canada - Nova Scotia - onshore; Canada - Prince Edward Island.,geographic 2D,6122,8901,North,East,Lat,Long,,9108,,,1997-07-22 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+4123,KKJ,,,,Finland,geographic 2D,6123,8901,North,East,Lat,Long,,9108,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+4124,RT90,,,,Sweden,geographic 2D,6124,8901,North,East,Lat,Long,,9108,,,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+4125,Samboja,,,,Indonesia - east Kalimantan - Mahakam delta area.,geographic 2D,6125,8901,North,East,Lat,Long,,9108,,,1997-11-13 00:00:00,,EPSG,,
+4126,LKS94 (ETRS89),,,,Lithuania,geographic 2D,6126,8901,North,East,Lat,Long,,9108,,,1998-03-13 00:00:00,,EPSG,,
+4127,Tete,,,,Mozambique,geographic 2D,6127,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+4128,Madzansua,,,,Mozambique - west,geographic 2D,6128,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by values transformed to Tete geogCS (code 4127).,
+4129,Observatario,,,,Mozambique - south,geographic 2D,6129,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Superseded by values transformed to Tete geogCS (code 4127).,
+4130,Moznet,,,,Mozambique,geographic 2D,6130,8901,North,East,Lat,Long,,9108,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+4131,Indian 1960,,,,Cambodia; Vietnam,geographic 2D,6131,8901,North,East,Lat,Long,,9108,,,1998-11-11 00:00:00,,EPSG,,
+4132,FD58,,,,Iran - Gulf coast and Arwaz areas.,geographic 2D,6132,8901,North,East,Lat,Long,,9108,,,1998-11-11 00:00:00,IOEPC records.,EPSG,,
+4133,EST92,,,,Estonia,geographic 2D,6133,8901,North,East,Lat,Long,,9108,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Densification of ETRS89 as established during 1992 Baltic campaign.,
+4134,PDO Survey Datum 1993,PSD93,,,Oman,geographic 2D,6134,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud geogCS (code 4232). Maximum differences to Fahud adjustment are 20 metres.,
+4135,Old Hawaiian,,,,United States (USA) - Hawaii,geographic 2D,6135,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4136,St. Lawrence Island,,,,United States (USA) - Alaska - St. Lawrence Island,geographic 2D,6136,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4137,St. Paul Island,,,,United States (USA) - Alaska - St. Paul Island,geographic 2D,6137,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4138,St. George Island,,,,United States (USA) - Alaska - St. George Island,geographic 2D,6138,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4139,Puerto Rico,,,,Puerto Rico; Virgin Islands (British); Virgin Islands (U.S.).,geographic 2D,6139,8901,North,East,Lat,Long,,9108,,,1999-05-24 00:00:00,,EPSG,Used for civilian purposes.  NAD27 (code 4267) used for military purposes.  Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4140,NAD83(CSRS98),,,,Canada - New Brunswick,geographic 2D,6140,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,Service New Brunswick Land and Information Standards Manual,EPSG,Supersedes ATS77 from 1999 in New Brunswick.,
+4141,Israel,,,,Israel.,geographic 2D,6141,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,Survey of Israel,EPSG,Supersedes Palestine 1923 in Israel.,
+4142,Locodjo 1965,,,,Cote D'Ivoire (Ivory Coast).,geographic 2D,6142,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded by Abidjan 1987 (EPSG code 4143).,
+4143,Abidjan 1987,,,,Cote D'Ivoire (Ivory Coast).,geographic 2D,6143,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,IGN Paris,EPSG,Supersedes Locodjo 1967 (EPSG code 4142).,
+4144,Kalianpur 1937,,,,Bangladesh; India; Pakistan,geographic 2D,6144,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Adopts 1937 metric conversion of 0.30479841 metres per Indian foot.,
+4145,Kalianpur 1962,,,,Pakistan,geographic 2D,6145,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Adopts 1962 metric conversion of 0.3047996 metres per Indian foot.,
+4146,Kalianpur 1975,,,,India,geographic 2D,6146,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Adopts 1975 metric conversion of 0.3047995 metres per Indian foot.,
+4147,Hanoi 1972,,,,Vietnam,geographic 2D,6147,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4148,Hartbeesthoek94,,,,South Africa.,geographic 2D,6148,8901,North,East,Lat,Long,,9108,,,1999-10-22 00:00:00,,EPSG,Supercedes Cape (code 4222) from 1999.,
+4149,CH1903,,,,Liechtenstein; Switzerland,geographic 2D,6149,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4150,CH1903+,,,,Liechtenstein; Switzerland,geographic 2D,6150,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4151,CHTRF95,,,,Liechtenstein; Switzerland,geographic 2D,6151,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4152,NAD83(HARN),,,,United States (US),geographic 2D,6152,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,National Geodetic Survey,EPSG,,
+4153,Rassadiran,,,,Iran - Taheri refinery site only.,geographic 2D,6153,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,Used only for onshore terminal site.,
+4154,ED50(ED77),,,,Iran,geographic 2D,6154,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4200,Pulkovo 1995,,,,Russia,geographic 2D,6200,8901,North,East,Lat,Long,,9108,,,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+4201,Adindan,,,,Ethiopia; Sudan,geographic 2D,6201,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4202,AGD66,,,,Australia; Papua New Guinea,geographic 2D,6202,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4203,AGD84,,,,Australia,geographic 2D,6203,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4204,Ain el Abd,,,,Kuwait; Saudi Arabia,geographic 2D,6204,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4205,Afgooye,,,,Somalia,geographic 2D,6205,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4206,Agadez,,,,Niger,geographic 2D,6206,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4207,Lisbon,,,,Portugal - onshore,geographic 2D,6207,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+4208,Aratu,,,,Brazil - coastal areas south of 2 deg 55 min S.,geographic 2D,6208,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4209,Arc 1950,,,,Botswana; Malawi; Zambia; Zimbabwe.,geographic 2D,6209,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4210,Arc 1960,,,,Kenya; Tanzania; Uganda.,geographic 2D,6210,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4211,Batavia,,,,Indonesia - Java,geographic 2D,6211,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4212,Barbados 1938,,,,Barbados,geographic 2D,6212,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,99.171
+4213,Beduaram,,,,Niger,geographic 2D,6213,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4214,Beijing 1954,,,,China,geographic 2D,6214,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4215,Belge 1950,,,,Belgium - onshore,geographic 2D,6215,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4216,Bermuda 1957,,,,Bermuda,geographic 2D,6216,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4218,Bogota,,,,Colombia,geographic 2D,6218,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4219,Bukit Rimpah,,,,Indonesia - Banga & Belitung Islands,geographic 2D,6219,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4220,Camacupa,,,,Angola,geographic 2D,6220,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4221,Campo Inchauspe,,,,Argentina,geographic 2D,6221,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4222,Cape,,,,Botswana; South Africa.,geographic 2D,6222,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Superceded by Hartbeesthoek94 from 1999.,
+4223,Carthage,,,,Tunisia,geographic 2D,6223,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4224,Chua,,,,Brazil,geographic 2D,6224,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4225,Corrego Alegre,,,,Brazil - NE coastal area between 45 deg W and 40 deg W.,geographic 2D,6225,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4226,Cote d'Ivoire,,,,Cote d'Ivoire,geographic 2D,6226,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4227,Deir ez Zor,,,,Syrian Arab Republic,geographic 2D,6227,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4228,Douala,,,,Cameroon,geographic 2D,6228,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4229,Egypt 1907,,,,Egypt,geographic 2D,6229,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4230,ED50,,,,Europe - west - Spain; France offshore; United Kingdom UKCS offshore; Netherlands offshore; Germany offshore North Sea; Denmark; Norway; Turkey.,geographic 2D,6230,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4231,ED87,,,,Europe - west.,geographic 2D,6231,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4232,Fahud,,,,Oman,geographic 2D,6232,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Since 1993 superseded by PSD93 geogCS (code 4134). Maximum differences to Fahud adjustment are 20 metres.,
+4233,Gandajika 1970,,,,Maldives,geographic 2D,6233,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4234,Garoua,,,,Cameroon,geographic 2D,6234,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4235,Guyane Francaise,,,,French Guyana,geographic 2D,6235,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4236,Hu Tzu Shan,,,,Taiwan,geographic 2D,6236,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4237,HD72,,,,Hungary,geographic 2D,6237,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4238,ID74,,,,Indonesia,geographic 2D,6238,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4239,Indian 1954,,,,Myanmar (Burma); Thailand,geographic 2D,6239,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4240,Indian 1975,,,,Thailand,geographic 2D,6240,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4241,Jamaica 1875,,,,Jamaica,geographic 2D,6241,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4242,JAD69,,,,Jamaica,geographic 2D,6242,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4243,Kalianpur 1880,,,,Bangladesh; India; Myanmar (Burma); Pakistan,geographic 2D,6243,8901,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,,97.23
+4244,Kandawala,,,,Sri Lanka,geographic 2D,6244,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4245,Kertau,,,,Malaysia - West Malaysia; Singapore,geographic 2D,6245,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Adopts metric conversion of 39.370113 inches per metre.,
+4246,KOC,,,,Kuwait,geographic 2D,6246,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4247,La Canoa,,,,Venezuela,geographic 2D,6247,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,PSAD56 uses same origin.,
+4248,PSAD56,,,,Bolivia; Ecuador; Peru; [Venezuela],geographic 2D,6248,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Origin is same as La Canoa.  In Venezuela known as La Canoa.,
+4249,Lake,,,,Venezuela - Lake Maracaibo area,geographic 2D,6249,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4250,Leigon,,,,Ghana,geographic 2D,6250,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4251,Liberia 1964,,,,Liberia,geographic 2D,6251,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4252,Lome,,,,Togo,geographic 2D,6252,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4253,Luzon 1911,,,,Philippines,geographic 2D,6253,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4254,Hito XVIII 1963,,,,Chile - Tierra del Fuego,geographic 2D,6254,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4255,Herat North,,,,Afghanistan,geographic 2D,6255,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4256,Mahe 1971,,,,Seychelles,geographic 2D,6256,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4257,Makassar,,,,Indonesia - south west Sulawesi,geographic 2D,6257,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4258,ETRF89,,,,Europe - Hungary; Norway; Sweden; United Kingdom (UKCS) offshore.,geographic 2D,6258,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,Norwegian Geodetic Institute geodetic publication 1990:1,EPSG,,97.11  99.11
+4259,Malongo 1987,,,,Angola - Cabinda offshore,geographic 2D,6259,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Chevron Petroleum Technology,EPSG,Offshore extension of Mhast GeogCS (4264) using Transit translocation from Station Y at Malongo base camp.,
+4260,Manoca,,,,Cameroon,geographic 2D,6260,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4261,Merchich,,,,Morocco,geographic 2D,6261,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4262,Massawa,,,,Eritrea,geographic 2D,6262,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4263,Minna,,,,Nigeria,geographic 2D,6263,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4264,Mhast,,,,Angola - Cabinda,geographic 2D,6264,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4265,Monte Mario,,,,Italy,geographic 2D,6265,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4266,M'poraloko,,,,Gabon,geographic 2D,6266,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4267,NAD27,,,,North and central America - Canada; Mexico; United States (USA).,geographic 2D,6267,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.  Superseded by NAD27(76) (code 4608) in Ontario and CGQ77 (code 4609) in Quebec.,99.04
+4268,NAD27 Michigan,NAD Michigan,,,United States (USA) - Michigan,geographic 2D,6268,8901,North,East,Lat,Long,,9108,,,1996-12-12 00:00:00,,EPSG,Ellipsoid taken to be 800ft above geoid. Note: this coordinate system includes longitudes which are POSITIVE EAST.,96.28
+4269,NAD83,,,,Canada: Greenland; Mexico; United States (USA),geographic 2D,6269,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4270,Nahrwan 1967,,,,Arabian Gulf; Kuwait; United Arab Emirates (UAE) - Abu Dhabi; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,geographic 2D,6270,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4271,Naparima 1972,,,,Trinidad and Tobago,geographic 2D,6271,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4272,GD49,,,,New Zealand,geographic 2D,6272,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4273,NGO 1948,,,,Norway - onshore,geographic 2D,6273,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4274,Datum 73,,,,Portugal - onshore,geographic 2D,6274,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,
+4275,NTF,,,,France - onshore,geographic 2D,6275,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4276,NSWC 9Z-2,,,,World,geographic 2D,6276,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4277,OSGB 1936,,,,United Kingdom (UK) - Great Britain - England  Scotland  Wales - onshore; Isle of Man.,geographic 2D,6277,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4278,OSGB70,,,,United Kingdom (UK) - Great Britain - England  Scotland  wales - onshore,geographic 2D,6278,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4279,OS(SN)80,,,,Ireland - onshore; United Kingdom (UK) - England  Scotland  Wales  Northern Ireland - onshore E,geographic 2D,6279,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4280,Padang,,,,Indonesia - Sumatra,geographic 2D,6280,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4281,Palestine 1923,,,,Israel; Jordan; Lebanon,geographic 2D,6281,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4282,Pointe Noire,,,,Congo,geographic 2D,6282,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4283,GDA94,,,,Australia,geographic 2D,6283,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,,
+4284,Pulkovo 1942,,,,Armenia; Azerbaijan; Belarus; Estonia; Georgia; Kazakstan; Kirgistan; Latvia; Lithuania; Moldova; Russia; Tadzhikstan; Turkmenistan; Ukraine; Uzbekistan; Germany (former DDR); Czech Republic; Hungary; Poland; Romania; Latvia; Lithuania; Estonia; Albania,geographic 2D,6284,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4285,Qatar,,,,Qatar - onshore,geographic 2D,6285,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4286,Qatar 1948,,,,Qatar - onshore,geographic 2D,6286,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4287,Qornoq,,,,Greenland,geographic 2D,6287,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4288,Loma Quintana,,,,Venezuela - north,geographic 2D,6288,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4289,Amersfoort,,,,Netherlands - onshore,geographic 2D,6289,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4291,SAD69,,,,South America - Brazil,geographic 2D,6291,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251.  Error introduced if not using the truncated precision is 0 to 31mm.,97.252
+4292,Sapper Hill 1943,,,,Falkland Islands,geographic 2D,6292,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4293,Schwarzeck,,,,Namibia,geographic 2D,6293,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4294,Segora,,,,Indonesia - southeast Kalimantan,geographic 2D,6294,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4295,Serindung,,,,Indonesia - east Kalimantan,geographic 2D,6295,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4296,Sudan,,,,Sudan - south,geographic 2D,6296,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4297,Tananarive,,,,Madagascar,geographic 2D,6297,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4298,Timbalai 1948,,,,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,geographic 2D,6298,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Adopts metric conversion of 39.370147 inches per metre.,
+4299,TM65,,,,Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore,geographic 2D,6299,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4300,TM75,,,,Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore,geographic 2D,6300,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4301,Tokyo,,,,Japan; North Korea; South Korea,geographic 2D,6301,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4302,Trinidad 1903,,,,Trinidad and Tobago - Trinidad,geographic 2D,6302,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4303,TC(1948),,,,United Arab Emirates (UAE) - Abu Dhabi; Dubai,geographic 2D,6303,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4304,Voirol 1875,,,,Algeria - north of 32 deg N,geographic 2D,6304,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,IGN Paris,EPSG,,
+4305,Voirol Unifie,,,,Algeria - north of 32 deg N,geographic 2D,6305,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,,
+4306,Bern 1938,,,,Liechtenstein; Switzerland,geographic 2D,6306,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,Used for the geographic coordinates overprinted on topographic maps constructed on the CH1903 / LV03 projected CS (code 21781).,
+4307,Nord Sahara 1959,,,,Algeria; Morocco; Tunisia,geographic 2D,6307,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,,
+4308,RT38,,,,Sweden,geographic 2D,6308,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,97.09
+4309,Yacare,,,,Uruguay,geographic 2D,6309,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4310,Yoff,,,,Senegal,geographic 2D,6310,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4311,Zanderij,,,,Suriname,geographic 2D,6311,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4312,MGI,,,,Austria; Yugoslavia,geographic 2D,6312,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,,
+4313,Belge 1972,,,,Belgium - onshore,geographic 2D,6313,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4314,DHDN,,,,Germany - onshore,geographic 2D,6314,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4315,Conakry 1905,,,,Guinea,geographic 2D,6315,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4316,Dealul Piscului 1933,,,,Romania,geographic 2D,6316,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,Superseded by 1970 system (geogCS code 4317).,
+4317,Dealul Piscului 1970,,,,Romania,geographic 2D,6317,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,Supersedes 1933 system (geogCS code 4316).,
+4318,NGN,,,,Kuwait,geographic 2D,6318,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,,
+4319,KUDAMS,,,,Kuwait - Kuwait City,geographic 2D,6319,8901,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,,
+4322,WGS 72,,,,World,geographic 2D,6322,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,GeogCS code 4323 reserved for use with  ProjCS's.,
+4324,WGS 72BE,,,,World,geographic 2D,6324,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,GeogCS code 4325 reserved for use with  ProjCS's.,
+4326,WGS 84,,,,World,geographic 2D,6326,8901,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,GeogCS code 4327 reserved for use with  ProjCS's.,
+4600,Anguilla 1957,,,,Anguilla,geographic 2D,6600,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4601,Antigua 1943,,,,Antigua and Barbuda - Antigua,geographic 2D,6601,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4602,Dominica 1945,,,,Dominica,geographic 2D,6602,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4603,Grenada 1953,,,,Grenada (including Grenada Grenadines),geographic 2D,6603,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4604,Montserrat 1958,,,,Montserrat,geographic 2D,6604,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4605,St. Kitts 1955,,,,Saint Kitts and Nevis,geographic 2D,6605,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4606,St. Lucia 1955,,,,Saint Lucia,geographic 2D,6606,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4607,St. Vincent 1945,,,,Saint Vincent and the Grenadines,geographic 2D,6607,8901,North,East,Lat,Long,,9108,,,1999-04-22 00:00:00,,EPSG,,
+4608,NAD27(76),,,,Canada - Ontario,geographic 2D,6608,8901,North,East,Lat,Long,,9108,,,1999-05-12 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4609,NAD27(CGQ77),CGQ77,,,Canada - Quebec,geographic 2D,6609,8901,North,East,Lat,Long,,9108,,,1999-05-12 00:00:00,,EPSG,Note: this coordinate system includes longitudes which are POSITIVE EAST.,
+4801,Bern 1898 (Bern),,,,Liechtenstein; Switzerland,geographic 2D,6149,8907,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4802,Bogota (Bogota),,,,Colombia,geographic 2D,6218,8904,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4803,Lisbon (Lisbon),,,,Portugal - onshore,geographic 2D,6207,8902,North,East,Lat,Long,,9108,,,1997-04-11 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,97.12
+4804,Makassar (Jakarta),,,,Indonesia - south west Sulawesi,geographic 2D,6257,8908,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4805,MGI (Ferro),,,,Austria; Yugoslavia,geographic 2D,6312,8909,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,Bundesamt fur Eich- und Vermessungswesen; Wien,EPSG,,
+4806,Monte Mario (Rome),,,,Italy,geographic 2D,6265,8906,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4807,NTF (Paris),,,,France - onshore,geographic 2D,6275,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4808,Padang (Jakarta),,,,Indonesia - Sumatra,geographic 2D,6280,8908,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4809,Belge 1950 (Brussels),,,,Belgium - onshore,geographic 2D,6215,8910,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4810,Tananarive (Paris),,,,Madagascar,geographic 2D,6297,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4811,Voirol 1875 (Paris),,,,Algeria - north of 32 deg N,geographic 2D,6304,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,IGN Paris,EPSG,,
+4812,Voirol Unifie (Paris),,,,Algeria - north of 32 deg N,geographic 2D,6305,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,"\"Le System Geodesique Nord-Sahara\"; IGN Paris",EPSG,,
+4813,Batavia (Jakarta),,,,Indonesia - Java,geographic 2D,6211,8908,North,East,Lat,Long,,9108,,,1995-06-02 00:00:00,,EPSG,,
+4814,RT38 (Stockholm),,,,Sweden,geographic 2D,6308,8911,North,East,Lat,Long,,9108,,,1996-04-12 00:00:00,,EPSG,,
+4815,Greek (Athens),,,,Greece,geographic 2D,6120,8912,North,East,Lat,Long,,9108,,,1997-06-16 00:00:00,Topography Department; National Technical University of Greece.,EPSG,,
+4816,Carthage (Paris),,,,Tunisia,geographic 2D,6223,8903,North,East,Lat,Long,,9105,,,1998-11-11 00:00:00,,EPSG,Superseded by Greenwich-based Carthage geogCS.,
+4817,NGO 1948 (Oslo),,,,Norway - onshore,geographic 2D,6273,8913,North,East,Lat,Long,,9108,,,1999-10-20 00:00:00,,EPSG,,
+4901,ATF (Paris),,,,France,geographic 2D,6901,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4902,NDG (Paris),,,,France - Alsace,geographic 2D,6902,8903,North,East,Lat,Long,,9105,,,1995-06-02 00:00:00,,EPSG,,
+4903,Madrid 1870 (Madrid),,,,Spain,geographic 2D,6903,8905,North,East,Lat,Long,,9108,,,1998-11-11 00:00:00,Institut de Geomatica; Barcelona.,EPSG,,
+20004,Pulkovo 1995 / Gauss-Kruger zone 4,1995 Coord. Sys. zone 4,,,Russia - west of 24 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16204,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20005,Pulkovo 1995 / Gauss-Kruger zone 5,1995 Coord. Sys. zone 5,,,Russia - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16205,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20006,Pulkovo 1995 / Gauss-Kruger zone 6,1995 Coord. Sys. zone 6,,,Russia - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16206,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20007,Pulkovo 1995 / Gauss-Kruger zone 7,1995 Coord. Sys. zone 7,,,Russia - 36 deg to 42 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16207,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20008,Pulkovo 1995 / Gauss-Kruger zone 8,1995 Coord. Sys. zone 8,,,Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16208,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20009,Pulkovo 1995 / Gauss-Kruger zone 9,1995 Coord. Sys. zone 9,,,Russia - 48 deg to 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16209,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20010,Pulkovo 1995 / Gauss-Kruger zone 10,1995 Coord. Sys. zone 10,,,Russia - 54 deg  to 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16210,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20011,Pulkovo 1995 / Gauss-Kruger zone 11,1995 Coord. Sys. zone 11,,,Russia - 60 deg to 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16211,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20012,Pulkovo 1995 / Gauss-Kruger zone 12,1995 Coord. Sys. zone 12,,,Russia - 66 deg to 72 deg East .,projected 2D,,,North,East,X,Y,9001,,4200,16212,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20013,Pulkovo 1995 / Gauss-Kruger zone 13,1995 Coord. Sys. zone 13,,,Russia - 72 deg to 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16213,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20014,Pulkovo 1995 / Gauss-Kruger zone 14,1995 Coord. Sys. zone 14,,,Russia - 78 deg to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16214,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20015,Pulkovo 1995 / Gauss-Kruger zone 15,1995 Coord. Sys. zone 15,,,Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16215,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20016,Pulkovo 1995 / Gauss-Kruger zone 16,1995 Coord. Sys. zone 16,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16216,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20017,Pulkovo 1995 / Gauss-Kruger zone 17,1995 Coord. Sys. zone 17,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16217,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20018,Pulkovo 1995 / Gauss-Kruger zone 18,1995 Coord. Sys. zone 18,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16218,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20019,Pulkovo 1995 / Gauss-Kruger zone 19,1995 Coord. Sys. zone 19,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16219,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20020,Pulkovo 1995 / Gauss-Kruger zone 20,1995 Coord. Sys. zone 20,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16220,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20021,Pulkovo 1995 / Gauss-Kruger zone 21,1995 Coord. Sys. zone 21,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16221,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20022,Pulkovo 1995 / Gauss-Kruger zone 22,1995 Coord. Sys. zone 22,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16222,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20023,Pulkovo 1995 / Gauss-Kruger zone 23,1995 Coord. Sys. zone 23,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16223,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20024,Pulkovo 1995 / Gauss-Kruger zone 24,1995 Coord. Sys. zone 24,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16224,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20025,Pulkovo 1995 / Gauss-Kruger zone 25,1995 Coord. Sys. zone 25,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16225,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20026,Pulkovo 1995 / Gauss-Kruger zone 26,1995 Coord. Sys. zone 26,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16226,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20027,Pulkovo 1995 / Gauss-Kruger zone 27,1995 Coord. Sys. zone 27,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16227,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20028,Pulkovo 1995 / Gauss-Kruger zone 28,1995 Coord. Sys. zone 28,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16228,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20029,Pulkovo 1995 / Gauss-Kruger zone 29,1995 Coord. Sys. zone 29,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16229,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20030,Pulkovo 1995 / Gauss-Kruger zone 30,1995 Coord. Sys. zone 30,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4200,16230,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20031,Pulkovo 1995 / Gauss-Kruger zone 31,1995 Coord. Sys. zone 31,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16231,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20032,Pulkovo 1995 / Gauss-Kruger zone 32,1995 Coord. Sys. zone 32,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16232,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20064,Pulkovo 1995 / Gauss-Kruger 4N,Pulkovo 1995 / Gauss 4N,,,Russia - west of 24 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16304,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20065,Pulkovo 1995 / Gauss-Kruger 5N,Pulkovo 1995 / Gauss 5N,,,Russia - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16305,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20066,Pulkovo 1995 / Gauss-Kruger 6N,Pulkovo 1995 / Gauss 6N,,,Russia - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16306,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20067,Pulkovo 1995 / Gauss-Kruger 7N,Pulkovo 1995 / Gauss 7N,,,Russia - 36 deg to 42 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16307,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20068,Pulkovo 1995 / Gauss-Kruger 8N,Pulkovo 1995 / Gauss 8N,,,Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16308,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20069,Pulkovo 1995 / Gauss-Kruger 9N,Pulkovo 1995 / Gauss 9N,,,Russia - 48 deg to 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16309,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20070,Pulkovo 1995 / Gauss-Kruger 10N,Pulkovo 1995 / Gauss 10N,,,Russia - 54 deg  to 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16310,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20071,Pulkovo 1995 / Gauss-Kruger 11N,Pulkovo 1995 / Gauss 11N,,,Russia - 60 deg to 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16311,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20072,Pulkovo 1995 / Gauss-Kruger 12N,Pulkovo 1995 / Gauss 12N,,,Russia - 66 deg to 72 deg East .,projected 2D,,,North,East,X,Y,9001,,4200,16312,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20073,Pulkovo 1995 / Gauss-Kruger 13N,Pulkovo 1995 / Gauss 13N,,,Russia - 72 deg to 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16313,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20074,Pulkovo 1995 / Gauss-Kruger 14N,Pulkovo 1995 / Gauss 14N,,,Russia - 78 deg to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16314,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20075,Pulkovo 1995 / Gauss-Kruger 15N,Pulkovo 1995 / Gauss 15N,,,Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16315,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20076,Pulkovo 1995 / Gauss-Kruger 16N,Pulkovo 1995 / Gauss 16N,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16316,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20077,Pulkovo 1995 / Gauss-Kruger 17N,Pulkovo 1995 / Gauss 17N,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16317,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20078,Pulkovo 1995 / Gauss-Kruger 18N,Pulkovo 1995 / Gauss 18N,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16318,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20079,Pulkovo 1995 / Gauss-Kruger 19N,Pulkovo 1995 / Gauss 19N,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16319,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20080,Pulkovo 1995 / Gauss-Kruger 20N,Pulkovo 1995 / Gauss 20N,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16320,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20081,Pulkovo 1995 / Gauss-Kruger 21N,Pulkovo 1995 / Gauss 21N,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16321,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20082,Pulkovo 1995 / Gauss-Kruger 22N,Pulkovo 1995 / Gauss 22N,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16322,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20083,Pulkovo 1995 / Gauss-Kruger 23N,Pulkovo 1995 / Gauss 23N,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16323,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20084,Pulkovo 1995 / Gauss-Kruger 24N,Pulkovo 1995 / Gauss 24N,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16324,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20085,Pulkovo 1995 / Gauss-Kruger 25N,Pulkovo 1995 / Gauss 25N,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16325,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20086,Pulkovo 1995 / Gauss-Kruger 26N,Pulkovo 1995 / Gauss 26N,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16326,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20087,Pulkovo 1995 / Gauss-Kruger 27N,Pulkovo 1995 / Gauss 27N,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16327,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20088,Pulkovo 1995 / Gauss-Kruger 28N,Pulkovo 1995 / Gauss 28N,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16328,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20089,Pulkovo 1995 / Gauss-Kruger 29N,Pulkovo 1995 / Gauss 29N,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4200,16329,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20090,Pulkovo 1995 / Gauss-Kruger 30N,Pulkovo 1995 / Gauss 30N,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4200,16330,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20091,Pulkovo 1995 / Gauss-Kruger 31N,Pulkovo 1995 / Gauss 31N,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16331,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20092,Pulkovo 1995 / Gauss-Kruger 32N,Pulkovo 1995 / Gauss 32N,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4200,16332,1996-09-12 00:00:00,"\"Main Terms of Reference for the State Geodetic Network\"; Federal Geodetic Service of Russia; 1994",EPSG,,
+20137,Adindan / UTM zone 37N,,,,Ethiopia - west of 42 degrees East.  Sudan - west of 42 degrees East.,projected 2D,,,East,North,E,N,9001,,4201,16037,1995-06-02 00:00:00,,EPSG,,
+20138,Adindan / UTM zone 38N,,,,Ethiopia - east of 42 degrees East.  Sudan - east of 42 degrees East.,projected 2D,,,East,North,E,N,9001,,4201,16038,1995-06-02 00:00:00,,EPSG,,
+20248,AGD66 / AMG zone 48,,,,Australia - 102deg East to 108deg East.,projected 2D,,,East,North,E,N,9001,,4202,17448,1995-06-02 00:00:00,,EPSG,,
+20249,AGD66 / AMG zone 49,,,,Australia - 108deg East to 114deg East.,projected 2D,,,East,North,E,N,9001,,4202,17449,1995-06-02 00:00:00,,EPSG,,
+20250,AGD66 / AMG zone 50,,,,Australia - 114deg East to 120deg East.,projected 2D,,,East,North,E,N,9001,,4202,17450,1995-06-02 00:00:00,,EPSG,,
+20251,AGD66 / AMG zone 51,,,,Australia - 120deg East to 126deg East.,projected 2D,,,East,North,E,N,9001,,4202,17451,1995-06-02 00:00:00,,EPSG,,
+20252,AGD66 / AMG zone 52,,,,Australia - 126deg East to 132deg East.,projected 2D,,,East,North,E,N,9001,,4202,17452,1995-06-02 00:00:00,,EPSG,,
+20253,AGD66 / AMG zone 53,,,,Australia - 132deg East to 138deg East.,projected 2D,,,East,North,E,N,9001,,4202,17453,1995-06-02 00:00:00,,EPSG,,
+20254,AGD66 / AMG zone 54,,,,Australia - 138deg East to 144deg East.  Papua New Guinea - west of 144deg East.,projected 2D,,,East,North,E,N,9001,,4202,17454,1995-06-02 00:00:00,,EPSG,,
+20255,AGD66 / AMG zone 55,,,,Australia - 144deg East to 150deg East.  Papua New Guinea - 144deg East to 150deg East.,projected 2D,,,East,North,E,N,9001,,4202,17455,1995-06-02 00:00:00,,EPSG,,
+20256,AGD66 / AMG zone 56,,,,Australia - 150deg East to 156deg East.,projected 2D,,,East,North,E,N,9001,,4202,17456,1995-06-02 00:00:00,,EPSG,,
+20257,AGD66 / AMG zone 57,,,,Australia - 156deg East to 162deg East.,projected 2D,,,East,North,E,N,9001,,4202,17457,1995-06-02 00:00:00,,EPSG,,
+20258,AGD66 / AMG zone 58,,,,Australia - 162deg East to 168deg East.,projected 2D,,,East,North,E,N,9001,,4202,17458,1995-06-02 00:00:00,,EPSG,,
+20348,AGD84 / AMG zone 48,,,,Australia - 102deg East to 108deg East.,projected 2D,,,East,North,E,N,9001,,4203,17448,1995-06-02 00:00:00,,EPSG,,
+20349,AGD84 / AMG zone 49,,,,Australia - 108deg East to 114deg East.,projected 2D,,,East,North,E,N,9001,,4203,17449,1995-06-02 00:00:00,,EPSG,,
+20350,AGD84 / AMG zone 50,,,,Australia - 114deg East to 120deg East.,projected 2D,,,East,North,E,N,9001,,4203,17450,1995-06-02 00:00:00,,EPSG,,
+20351,AGD84 / AMG zone 51,,,,Australia - 120deg East to 126deg East.,projected 2D,,,East,North,E,N,9001,,4203,17451,1995-06-02 00:00:00,,EPSG,,
+20352,AGD84 / AMG zone 52,,,,Australia - 126deg East to 132deg East.,projected 2D,,,East,North,E,N,9001,,4203,17452,1995-06-02 00:00:00,,EPSG,,
+20353,AGD84 / AMG zone 53,,,,Australia - 132deg East to 138deg East.,projected 2D,,,East,North,E,N,9001,,4203,17453,1995-06-02 00:00:00,,EPSG,,
+20354,AGD84 / AMG zone 54,,,,Australia - 138deg East to 144deg East.  Papua - New Guinea west of 144deg East.,projected 2D,,,East,North,E,N,9001,,4203,17454,1995-06-02 00:00:00,,EPSG,,
+20355,AGD84 / AMG zone 55,,,,Australia - 144deg East to 150deg East.  Papua New Guinea - 144deg East to 150deg East.,projected 2D,,,East,North,E,N,9001,,4203,17455,1995-06-02 00:00:00,,EPSG,,
+20356,AGD84 / AMG zone 56,,,,Australia - 150deg East to 156deg East.,projected 2D,,,East,North,E,N,9001,,4203,17456,1995-06-02 00:00:00,,EPSG,,
+20357,AGD84 / AMG zone 57,,,,Australia - 156deg East to 162deg East.,projected 2D,,,East,North,E,N,9001,,4203,17457,1995-06-02 00:00:00,,EPSG,,
+20358,AGD84 / AMG zone 58,,,,Australia - 162deg East to 168deg East.,projected 2D,,,East,North,E,N,9001,,4203,17458,1995-06-02 00:00:00,,EPSG,,
+20437,Ain el Abd / UTM zone 37N,Ain el Abd / UTM 37N,,,Saudi Arabia - west of 42 degrees East.,projected 2D,,,East,North,E,N,9001,,4204,16037,1997-11-13 00:00:00,,EPSG,,97.59
+20438,Ain el Abd / UTM zone 38N,Ain el Abd / UTM 38N,,,Kuwait.  Saudi Arabia - between 42 degrees and 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4204,16038,1997-11-13 00:00:00,,EPSG,"Known in Kuwait as \"KOC UTM\".",97.59
+20439,Ain el Abd / UTM zone 39N,Ain el Abd / UTM 39N,,,Saudi Arabia - east of 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4204,16039,1997-11-13 00:00:00,,EPSG,,97.59
+20499,Ain el Abd / Bahrain Grid,,,,Bahrain.,projected 2D,,,East,North,E,N,9001,,4204,19900,1995-06-02 00:00:00,,EPSG,,
+20538,Afgooye / UTM zone 38N,,,,Somalia - west of 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4205,16038,1995-06-02 00:00:00,,EPSG,,
+20539,Afgooye / UTM zone 39N,,,,Somalia - east of 48 degrees East.,projected 2D,,,East,North,E,N,9001,,4205,16039,1995-06-02 00:00:00,,EPSG,,
+20790,Lisbon (Lisbon)/Portuguese National Grid,Lisbon / Portuguese Grid,,,Portugal - onshore.,projected 2D,,,East,North,X,Y,9001,,4803,19936,1998-11-11 00:00:00,,EPSG,,98.42
+20822,Aratu / UTM zone 22S,,,,Brazil - coastal areas south of 2 deg 55 min South and west of 48 deg West.,projected 2D,,,East,North,E,N,9001,,4208,16122,1995-07-21 00:00:00,,EPSG,,95.191
+20823,Aratu / UTM zone 23S,,,,Brazil - coastal areas south of 2 deg 55 min South and between 48 and 42 deg West; offshore Santos basin.,projected 2D,,,East,North,E,N,9001,,4208,16123,1995-07-21 00:00:00,,EPSG,,95.191
+20824,Aratu / UTM zone 24S,,,,Brazil - coastal areas south of 2 deg 55 min South and east of 42 deg West; offshore Campos basin.,projected 2D,,,East,North,E,N,9001,,4208,16124,1995-07-21 00:00:00,,EPSG,,95.191
+20934,Arc 1950 / UTM zone 34S,,,,Botswana & Zambia - west of 24 deg East.,projected 2D,,,East,North,E,N,9001,,4209,16134,1997-11-13 00:00:00,,EPSG,,
+20935,Arc 1950 / UTM zone 35S,,,,Botswana - east of 24 deg East; Zambia - 24 to 30 deg East; Zimbabwe west of 30 deg East .,projected 2D,,,East,North,E,N,9001,,4209,16135,1997-11-13 00:00:00,,EPSG,,
+20936,Arc 1950 / UTM zone 36S,,,,Malawi; Zambia & Zimbabwe - east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4209,16136,1997-11-13 00:00:00,,EPSG,,
+21035,Arc 1960 / UTM zone 35S,,,,Tanzania - west of 30 deg East; Uganda south of equator and west of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16135,1997-11-13 00:00:00,,EPSG,,
+21036,Arc 1960 / UTM zone 36S,,,,Kenya - south of equator and west of 36 deg East; Tanzania - 30 to 36 deg East; Uganda south of equator and east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16136,1997-11-13 00:00:00,,EPSG,,
+21037,Arc 1960 / UTM zone 37S,,,,Kenya - south of equator and east of 36 deg East; Tanzania - east of 36 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16137,1997-11-13 00:00:00,,EPSG,,
+21095,Arc 1960 / UTM zone 35N,,,,Uganda north of equator and west of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16035,1997-11-13 00:00:00,,EPSG,,
+21096,Arc 1960 / UTM zone 36N,,,,Kenya - north of equator and west of 36 deg East; Uganda north of equator and east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16036,1997-11-13 00:00:00,,EPSG,,
+21097,Arc 1960 / UTM zone 37N,,,,Kenya - north of equator and east of 36 deg East.,projected 2D,,,East,North,E,N,9001,,4210,16037,1997-11-13 00:00:00,,EPSG,,
+21100,Batavia (Jakarta) / NEIEZ,Batavia / NEIEZ,,,Indonesia - Java.,projected 2D,,,East,North,X,Y,9001,,4813,19905,1995-06-02 00:00:00,,EPSG,,
+21148,Batavia / UTM zone 48S,,,,Indonesia - Java west of 108 deg East.,projected 2D,,,East,North,E,N,9001,,4211,16148,1995-06-02 00:00:00,,EPSG,,
+21149,Batavia / UTM zone 49S,,,,Indonesia - Java between 108 and 114 deg East.,projected 2D,,,East,North,E,N,9001,,4211,16149,1995-06-02 00:00:00,,EPSG,,
+21150,Batavia / UTM zone 50S,,,,Indonesia - Java east of 114 deg East.,projected 2D,,,East,North,E,N,9001,,4211,16150,1995-06-02 00:00:00,,EPSG,,
+21291,Barbados 1938 / British West Indies Grid,Barbados 1938 / BWI Grid,,,Barbados,projected 2D,,,East,North,E,N,9001,,4212,19942,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,Superseded by Barbados National Grid (code 21292) from 1983.,
+21292,Barbados 1938 / Barbados National Grid,Barbados NationaI Grid,,,Barbados,projected 2D,,,East,North,E,N,9001,,4212,19943,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,Supersedes Barbados 1938 / BWI Grid (code 21291) from 1983.,
+21413,Beijing 1954 / Gauss-Kruger zone 13,Beijing / Gauss zone 13,,,China - west of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16213,1995-06-02 00:00:00,,EPSG,,
+21414,Beijing 1954 / Gauss-Kruger zone 14,Beijing / Gauss zone 14,,,China - 78 deg East  to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16214,1995-06-02 00:00:00,,EPSG,,
+21415,Beijing 1954 / Gauss-Kruger zone 15,Beijing / Gauss zone 15,,,China - 84 deg East  to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16215,1995-06-02 00:00:00,,EPSG,,
+21416,Beijing 1954 / Gauss-Kruger zone 16,Beijing / Gauss zone 16,,,China - 90 deg East  to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16216,1995-06-02 00:00:00,,EPSG,,
+21417,Beijing 1954 / Gauss-Kruger zone 17,Beijing / Gauss zone 17,,,China - 96 deg East  to 102eg E,projected 2D,,,North,East,X,Y,9001,,4214,16217,1995-06-02 00:00:00,,EPSG,,
+21418,Beijing 1954 / Gauss-Kruger zone 18,Beijing / Gauss zone 18,,,China - 102 deg East  to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16218,1995-06-02 00:00:00,,EPSG,,
+21419,Beijing 1954 / Gauss-Kruger zone 19,Beijing / Gauss zone 19,,,China - 108 deg East  to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16219,1995-06-02 00:00:00,,EPSG,,
+21420,Beijing 1954 / Gauss-Kruger zone 20,Beijing / Gauss zone 20,,,China - 114 deg East  to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16220,1995-06-02 00:00:00,,EPSG,,
+21421,Beijing 1954 / Gauss-Kruger zone 21,Beijing / Gauss zone 21,,,China - 120 deg East  to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16221,1995-06-02 00:00:00,,EPSG,,
+21422,Beijing 1954 / Gauss-Kruger zone 22,Beijing / Gauss zone 22,,,China - 126 deg East  to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16222,1995-06-02 00:00:00,,EPSG,,
+21423,Beijing 1954 / Gauss-Kruger zone 23,Beijing / Gauss zone 23,,,China - east of 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16223,1995-06-02 00:00:00,,EPSG,,
+21473,Beijing 1954 / Gauss-Kruger 13N,Beijing / Gauss 13N,,,China - west of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16313,1995-06-02 00:00:00,,EPSG,,
+21474,Beijing 1954 / Gauss-Kruger 14N,Beijing / Gauss 14N,,,China - 78 deg East  to 84 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16314,1995-06-02 00:00:00,,EPSG,,
+21475,Beijing 1954 / Gauss-Kruger 15N,Beijing / Gauss 15N,,,China - 84 deg East  to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16315,1995-06-02 00:00:00,,EPSG,,
+21476,Beijing 1954 / Gauss-Kruger 16N,Beijing / Gauss 16N,,,China - 90 deg East  to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16316,1995-06-02 00:00:00,,EPSG,,
+21477,Beijing 1954 / Gauss-Kruger 17N,Beijing / Gauss 17N,,,China - 96 deg East  to 102eg E,projected 2D,,,North,East,X,Y,9001,,4214,16317,1995-06-02 00:00:00,,EPSG,,
+21478,Beijing 1954 / Gauss-Kruger 18N,Beijing / Gauss 18N,,,China - 102 deg East  to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16318,1995-06-02 00:00:00,,EPSG,,
+21479,Beijing 1954 / Gauss-Kruger 19N,Beijing / Gauss 19N,,,China - 108 deg East  to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16319,1995-06-02 00:00:00,,EPSG,,
+21480,Beijing 1954 / Gauss-Kruger 20N,Beijing / Gauss 20N,,,China - 114 deg East  to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16320,1995-06-02 00:00:00,,EPSG,,
+21481,Beijing 1954 / Gauss-Kruger 21N,Beijing / Gauss 21N,,,China - 120 deg East  to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16321,1995-06-02 00:00:00,,EPSG,,
+21482,Beijing 1954 / Gauss-Kruger 22N,Beijing / Gauss 22N,,,China - 126 deg East  to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16322,1995-06-02 00:00:00,,EPSG,,
+21483,Beijing 1954 / Gauss-Kruger 23N,Beijing / Gauss 23N,,,China - east of 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4214,16323,1995-06-02 00:00:00,,EPSG,,
+21500,Belge 1950 (Brussels) / Belge Lambert 50,Belge Lambert 50,,,Belgium - onshore.,projected 2D,,,East,North,X,Y,9001,,4809,19901,1997-04-11 00:00:00,,EPSG,Superseded by 31300 (Belge 1972 / Belge Lambert 72).,97.13
+21780,Bern 1898 (Bern) / LV03C,LV03C,,,Liechtenstein.  Switzerland.,projected 2D,,,East,North,Y,X,9001,,4801,19923,1997-06-30 00:00:00,,EPSG,Superseded by CH1903 / LV03 (code 21781).,97.27  97.62
+21781,CH1903 / LV03,LV03,,,Liechtenstein; Switzerland.,projected 2D,,,East,North,Y,X,9001,,4149,19922,1999-10-20 00:00:00,,EPSG,Supersedes LV03C (code 21780).  Superseded by CH1903+/LV95 (code 256).,
+21817,Bogota / UTM zone 17N,,,,Colombia - offshore west of 78 deg W of Greenwich.,projected 2D,,,East,North,E,N,9001,,4218,16017,1995-06-02 00:00:00,,EPSG,,
+21818,Bogota / UTM zone 18N,,,,Colombia - offshore east of 78 deg W of Greenwich.,projected 2D,,,East,North,E,N,9001,,4218,16018,1995-06-02 00:00:00,,EPSG,,
+21891,Bogota / Colombia West zone,Bogota / Colombia 3W,,,Colombia - west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18051,1997-11-13 00:00:00,,EPSG,,97.11  97.57
+21892,Bogota / Colombia Bogota zone,Bogota / Colombia Bogota,,,Colombia - 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18052,1997-11-13 00:00:00,,EPSG,,97.11  97.57
+21893,Bogota / Colombia East Central zone,Bogota / Colombia 3E,,,Colombia - 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18053,1997-11-13 00:00:00,,EPSG,,97.11  97.57
+21894,Bogota / Colombia East,Bogota / Colombia 6E,,,Colombia - east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).,projected 2D,,,East,North,X,Y,9001,,4218,18054,1997-11-13 00:00:00,,EPSG,,97.11  97.57
+22032,Camacupa / UTM zone 32S,,,,Angola - west of 12 deg East.,projected 2D,,,East,North,E,N,9001,,4220,16132,1997-11-13 00:00:00,,EPSG,,97.58
+22033,Camacupa / UTM zone 33S,,,,Angola - east of 12 deg East.,projected 2D,,,East,North,E,N,9001,,4220,16133,1997-11-13 00:00:00,,EPSG,,97.58
+22091,Camacupa / TM 11.30 SE,,,,Angola - offshore.,projected 2D,,,East,North,E,N,9001,,4220,16611,1998-11-11 00:00:00,Esso Angola,EPSG,Used by Esso Angola for offshore blocks 15 and 24.,
+22092,Camacupa / TM 12 SE,,,,Angola - offshore.,projected 2D,,,East,North,E,N,9001,,4220,16612,1998-11-11 00:00:00,Shell Angola,EPSG,"Used by Shell Angola for offshore blocks 1 and 16.  Used by BP Amoco, Elf and Esso for offshore blocks 31-33.",
+22191,Campo Inchauspe / Argentina 1,C Inchauspe /Argentina 1,,,Argentina - west of 70 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18031,1999-11-15 00:00:00,,EPSG,,97.72
+22192,Campo Inchauspe / Argentina 2,C Inchauspe /Argentina 2,,,Argentina - between 70 deg 30 min and 67 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18032,1999-11-15 00:00:00,,EPSG,,97.72
+22193,Campo Inchauspe / Argentina 3,C Inchauspe /Argentina 3,,,Argentina - between 67 deg 30 min and 64 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18033,1999-11-15 00:00:00,,EPSG,,97.72
+22194,Campo Inchauspe / Argentina 4,C Inchauspe /Argentina 4,,,Argentina - between 64 deg 30 min and 61 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18034,1999-11-15 00:00:00,,EPSG,,97.72
+22195,Campo Inchauspe / Argentina 5,C Inchauspe /Argentina 5,,,Argentina - between 61 deg 30 min and 58 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18035,1999-11-15 00:00:00,,EPSG,,97.72
+22196,Campo Inchauspe / Argentina 6,C Inchauspe /Argentina 6,,,Argentina - between 58 deg 30 min and 55 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18036,1999-11-15 00:00:00,,EPSG,,97.72
+22197,Campo Inchauspe / Argentina 7,C Inchauspe /Argentina 7,,,Argentina - east of 55 deg 30 min West.,projected 2D,,,North,East,X,Y,9001,,4221,18037,1999-11-15 00:00:00,,EPSG,,97.72
+22234,Cape / UTM zone 34S,,,,Botswana - west of 21deg East.,projected 2D,,,East,North,E,N,9001,,4222,16134,1995-12-08 00:00:00,,EPSG,,
+22235,Cape / UTM zone 35S,,,,Botswana - east of 27deg East.,projected 2D,,,East,North,E,N,9001,,4222,16135,1995-12-08 00:00:00,,EPSG,,
+22236,Cape / UTM zone 36S,,,,Botswana - between 21 and 27deg East.,projected 2D,,,East,North,E,N,9001,,4222,16136,1995-12-08 00:00:00,,EPSG,,
+22275,South African Coordinate System zone 15,South African CS zone 15,,,South Africa - Walvis Bay.,projected 2D,,,West,South,W,S,9001,,4222,17515,1996-04-12 00:00:00,,EPSG,,
+22277,South African Coordinate System zone 17,South African CS zone 17,,,South Africa - west of 18 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17517,1996-04-12 00:00:00,,EPSG,,
+22279,South African Coordinate System zone 19,South African CS zone 19,,,South Africa - 18 to 20 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17519,1996-04-12 00:00:00,,EPSG,,
+22281,South African Coordinate System zone 21,South African CS zone 21,,,South Africa - 20 to 22 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17521,1996-04-12 00:00:00,,EPSG,,
+22283,South African Coordinate System zone 23,South African CS zone 23,,,South Africa - 22 to 24 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17523,1996-04-12 00:00:00,,EPSG,,
+22285,South African Coordinate System zone 25,South African CS zone 25,,,Lestho  - west of 26 deg East; South Africa - 24 to 26 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17525,1996-04-12 00:00:00,,EPSG,,
+22287,South African Coordinate System zone 27,South African CS zone 27,,,Lestho  - east of 26 deg East;  South Africa - 26 to 28 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17527,1996-04-12 00:00:00,,EPSG,,
+22289,South African Coordinate System zone 29,South African CS zone 29,,,South Africa - 28 to 30 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17529,1996-04-12 00:00:00,,EPSG,,
+22291,South African Coordinate System zone 31,South African CS zone 31,,,South Africa - 30 to 32 deg East;  Swaziland.,projected 2D,,,West,South,W,S,9001,,4222,17531,1996-04-12 00:00:00,,EPSG,,
+22293,South African Coordinate System zone 33,South African CS zone 33,,,South Africa - east of 32 deg East.,projected 2D,,,West,South,W,S,9001,,4222,17533,1996-04-12 00:00:00,,EPSG,,
+22300,Carthage (Paris) / Tunisia Mining Grid,Tunisia Mining Grid,,,Tunisia - onshore.,projected 2D,,,East,North,X,Y,9036,,4816,19937,1998-11-11 00:00:00,,EPSG,CAUTION: Carthage datum did not exist when the 1953 decree was issued and an inference is that grid should be applied to the Voirol 1875 geogCS.  Common practice assumes that the current Tunisian geodetic datum of Carthage applies.,
+22332,Carthage / UTM zone 32N,,,,Tunisia - offshore.,projected 2D,,,East,North,X,Y,9001,,4223,16032,1995-06-02 00:00:00,,EPSG,,
+22391,Carthage / Nord Tunisie,,,,Tunisia - north of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4223,18181,1995-06-02 00:00:00,,EPSG,,
+22392,Carthage / Sud Tunisie,,,,Tunisia - south of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4223,18182,1995-06-02 00:00:00,,EPSG,,
+22523,Corrego Alegre / UTM zone 23S,Corrego Alegre / UTM 23S,,,Brazil - NE coastal area between 45 deg W and 42 deg W.,projected 2D,,,East,North,E,N,9001,,4225,16123,1995-06-02 00:00:00,,EPSG,,
+22524,Corrego Alegre / UTM zone 24S,Corrego Alegre / UTM 24S,,,Brazil - NE coastal area between 42 deg W and 40 deg W.,projected 2D,,,East,North,E,N,9001,,4225,16124,1995-06-02 00:00:00,,EPSG,,
+22700,Deir ez Zor / Levant Zone,,,,Syrian Arab Republic west of 39 deg E.,projected 2D,,,East,North,X,Y,9001,,4227,19940,1999-04-22 00:00:00,,EPSG,Superseded by Deir ez Zor / Syria Lambert (EPSG code 22770) from 1973.,
+22770,Deir ez Zor / Syria Lambert,,,,Syrian Arab Republic,projected 2D,,,East,North,X,Y,9001,,4227,19948,1999-10-20 00:00:00,,EPSG,Supersedes Deir ez Zor / Levant zone (EPSG code 22700) from 1973.,
+22832,Douala / UTM zone 32N,,,,Cameroon.,projected 2D,,,East,North,E,N,9001,,4228,16032,1995-06-02 00:00:00,,EPSG,,
+22991,Egypt 1907 / Blue Belt,,,,Egypt  - Sinai peninsula.,projected 2D,,,East,North,E,N,9001,,4229,18071,1999-04-22 00:00:00,,EPSG,Also known as Egypt 1907 / Green Belt.    Oil industry usually uses Egypt 1907 / Red Belt rather than this projected CS.,
+22992,Egypt 1907 / Red Belt,,,,Egypt  - east of 29 deg East.,projected 2D,,,East,North,E,N,9001,,4229,18072,1995-06-02 00:00:00,,EPSG,See also Egypt 1907 / Blue Belt for non oil industry usage in Sinai peninsula.,
+22993,Egypt 1907 / Purple Belt,,,,Egypt -  west of 29 deg E; north of approx 28 deg 11 min North.,projected 2D,,,East,North,E,N,9001,,4229,18073,1995-06-02 00:00:00,,EPSG,,
+22994,Egypt 1907 / Extended Purple Belt,Egypt 1907 / Ext. Purple,,,Egypt  - west of 29 deg E; south of approx 28 deg 11 min North.,projected 2D,,,East,North,E,N,9001,,4229,18074,1995-06-02 00:00:00,,EPSG,,
+23028,ED50 / UTM zone 28N,,,,Europe - 18deg West to 12deg West - Ireland offshore; United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4230,16028,1995-06-02 00:00:00,,EPSG,,
+23029,ED50 / UTM zone 29N,,,,Europe - 12deg West to 6deg West - Portugal; Spain; Ireland offshore; United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4230,16029,1995-06-02 00:00:00,,EPSG,,
+23030,ED50 / UTM zone 30N,,,,Europe - 6deg West to 0deg - Spain; France offshore; Ireland offshore; United Kingdom - UKCS offshore - North Sea west of 0 deg East).,projected 2D,,,East,North,E,N,9001,,4230,16030,1995-06-02 00:00:00,,EPSG,,
+23031,ED50 / UTM zone 31N,,,,Europe - 0deg to 6deg East - Denmark (North Sea); Germany offshore; Netherlands offshore; Norway; United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4230,16031,1995-06-02 00:00:00,,EPSG,,
+23032,ED50 / UTM zone 32N,,,,Europe - 6deg East  to 12deg East - Denmark; Germany offshore; Netherlands offshore; Norway.,projected 2D,,,East,North,E,N,9001,,4230,16032,1995-06-02 00:00:00,,EPSG,,
+23033,ED50 / UTM zone 33N,,,,Europe - 12deg East  to 18deg East - Denmark including Bornholm; Norway.,projected 2D,,,East,North,E,N,9001,,4230,16033,1995-06-02 00:00:00,,EPSG,,
+23034,ED50 / UTM zone 34N,,,,Europe - 18deg East  to 24deg East - Greece; Norway.,projected 2D,,,East,North,E,N,9001,,4230,16034,1995-06-02 00:00:00,,EPSG,,
+23035,ED50 / UTM zone 35N,,,,Europe - 24deg East  to 30deg East - Greece; Norway; Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16035,1995-06-02 00:00:00,,EPSG,,
+23036,ED50 / UTM zone 36N,,,,Europe - 30deg East  to 36deg East - Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16036,1995-06-02 00:00:00,,EPSG,,
+23037,ED50 / UTM zone 37N,,,,Europe - 36deg East  to 42deg East - Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16037,1995-06-02 00:00:00,,EPSG,,
+23038,ED50 / UTM zone 38N,,,,Europe - 42deg East  to 48deg East - Turkey.,projected 2D,,,East,North,E,N,9001,,4230,16038,1995-06-02 00:00:00,,EPSG,,
+23090,ED50 / TM 0 N,,,,United Kingdom (UKCS) - offshore North Sea.,projected 2D,,,East,North,E,N,9001,,4230,16400,1998-11-11 00:00:00,Shell UK,EPSG,Used by Shell UK for North Sea,
+23095,ED50 / TM 5 NE,,,,Netherlands - offshore North Sea.,projected 2D,,,East,North,E,N,9001,,4230,16405,1998-11-11 00:00:00,NAM,EPSG,Used by NAM,
+23239,Fahud / UTM zone 39N,,,,Oman - west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4232,16039,1995-06-02 00:00:00,,EPSG,Since 1993 superseded by PSD93 / UTM zone 39N projCS (code 3439). Maximum differences to Fahud adjustment are 20 metres.,
+23240,Fahud / UTM zone 40N,,,,Oman - east of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4232,16040,1995-06-02 00:00:00,,EPSG,Since 1993 superseded by PSD93 / UTM zone 40N projCS (code 3440). Maximum differences to Fahud adjustment are 20 metres.,
+23433,Garoua / UTM zone 33N,,,,Cameroon.,projected 2D,,,East,North,E,N,9001,,4234,16033,1995-06-02 00:00:00,,EPSG,,
+23700,HD72 / EOV,,,,Hungary,projected 2D,,,East,North,Y,X,9001,,4237,19931,1997-07-22 00:00:00,,EPSG,,
+23846,ID74 / UTM zone 46N,,,,Indonesia - north of equator and west of 96 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16046,1995-08-08 00:00:00,,EPSG,,95.193  95.20
+23847,ID74 / UTM zone 47N,,,,Indonesia - north of equator and between 96 deg and 102 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16047,1995-07-21 00:00:00,,EPSG,,95.193
+23848,ID74 / UTM zone 48N,,,,Indonesia - north of equator and between 102 deg and 108 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16048,1995-07-21 00:00:00,,EPSG,,95.193
+23849,ID74 / UTM zone 49N,,,,Indonesia - north of equator and between 108 deg and 114 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16049,1995-07-21 00:00:00,,EPSG,,95.193
+23850,ID74 / UTM zone 50N,,,,Indonesia - north of equator and between 114 deg and 120 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16050,1995-07-21 00:00:00,,EPSG,,95.193
+23851,ID74 / UTM zone 51N,,,,Indonesia - north of equator and between 120 deg and 126 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16051,1995-07-21 00:00:00,,EPSG,,95.193
+23852,ID74 / UTM zone 52N,,,,Indonesia - north of equator and between 126 deg and 132 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16052,1995-07-21 00:00:00,,EPSG,,95.193
+23853,ID74 / UTM zone 53N,,,,Indonesia - north of equator and east of 132 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16053,1995-07-21 00:00:00,,EPSG,,95.193
+23886,ID74 / UTM zone 46S,,,,Indonesia - south of equator and west of 96 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16146,1995-08-08 00:00:00,,EPSG,,95.193  95.20
+23887,ID74 / UTM zone 47S,,,,Indonesia - south of equator and between 96 deg and 102 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16147,1995-07-21 00:00:00,,EPSG,,95.193
+23888,ID74 / UTM zone 48S,,,,Indonesia - south of equator and between 102 deg and 108 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16148,1995-07-21 00:00:00,,EPSG,,95.193
+23889,ID74 / UTM zone 49S,,,,Indonesia - south of equator and between 108 deg and 114 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16149,1995-07-21 00:00:00,,EPSG,,95.193
+23890,ID74 / UTM zone 50S,,,,Indonesia - south of equator and between 114 deg and 120 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16150,1995-07-21 00:00:00,,EPSG,,95.193
+23891,ID74 / UTM zone 51S,,,,Indonesia - south of equator and between 120 deg and 126 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16151,1995-07-21 00:00:00,,EPSG,,95.193
+23892,ID74 / UTM zone 52S,,,,Indonesia - south of equator and between 126 deg and 132 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16152,1995-07-21 00:00:00,,EPSG,,95.193
+23893,ID74 / UTM zone 53S,,,,Indonesia - south of equator and between 132 deg and 138 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16153,1995-07-21 00:00:00,,EPSG,,95.193
+23894,ID74 / UTM zone 54S,,,,Indonesia - south of equator and east of 138 deg East.,projected 2D,,,East,North,E,N,9001,,4238,16154,1995-07-21 00:00:00,,EPSG,,95.193
+23946,Indian 1954 / UTM zone 46N,Indian 1954 / UTM 46N,,,Myanmar (Burma) - west of 96 deg East.,projected 2D,,,East,North,E,N,9001,,4239,16046,1998-06-13 00:00:00,,EPSG,,
+23947,Indian 1954 / UTM zone 47N,Indian 1954 / UTM 47N,,,Myanmar (Burma) - east of 96 deg East; Thailand - west of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4239,16047,1995-06-02 00:00:00,,EPSG,,
+23948,Indian 1954 / UTM zone 48N,Indian 1954 / UTM 48N,,,Thailand - east of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4239,16048,1995-06-02 00:00:00,,EPSG,,
+24047,Indian 1975 / UTM zone 47N,Indian 1975 / UTM 47N,,,Thailand - west of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4240,16047,1995-06-02 00:00:00,,EPSG,,
+24048,Indian 1975 / UTM zone 48N,Indian 1975 / UTM 48N,,,Thailand - east of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4240,16048,1995-06-02 00:00:00,,EPSG,,
+24100,Jamaica 1875 / Jamaica (Old Grid),Jamaica 1875 / Old Grid,,,Jamaica.,projected 2D,,,East,North,E,N,9005,,4241,19909,1995-06-02 00:00:00,,EPSG,Superseded by 24200 (JAD69 / Jamaica National Grid).,
+24200,JAD69 / Jamaica National Grid,JAD69 / Jamaica Grid,,,Jamaica.,projected 2D,,,East,North,E,N,9001,,4242,19910,1995-06-02 00:00:00,,EPSG,Supersedes 24100 (JAD69 / Jamaica National Grid).,
+24305,Kalianpur 1937 / UTM zone 45N,Kalianpur 37 / UTM 45N,,,Bangladesh - west of 90deg East.,projected 2D,,,East,North,E,N,9001,,4144,16045,1999-10-20 00:00:00,,EPSG,,
+24306,Kalianpur 1937 / UTM zone 46N,Kalianpur 37 / UTM 46N,,,Bangladesh - east of 90deg East.,projected 2D,,,East,North,E,N,9001,,4144,16046,1999-10-20 00:00:00,,EPSG,,
+24311,Kalianpur 1962 / UTM zone 41N,Kalianpur 62 / UTM 41N,,,Pakistan - west of 66deg East.,projected 2D,,,East,North,E,N,9001,,4145,16041,1999-10-20 00:00:00,,EPSG,,
+24312,Kalianpur 1962 / UTM zone 42N,Kalianpur 62 / UTM 42N,,,Pakistan - between 66 and 72deg East.,projected 2D,,,East,North,E,N,9001,,4145,16042,1999-10-20 00:00:00,,EPSG,,
+24313,Kalianpur 1962 / UTM zone 43N,Kalianpur 62 / UTM 43N,,,Pakistan - east of 72deg East.,projected 2D,,,East,North,E,N,9001,,4145,16043,1999-10-20 00:00:00,,EPSG,,
+24342,Kalianpur 1975 / UTM zone 42N,Kalianpur 75 / UTM 42N,,,India - west of 72deg East.,projected 2D,,,East,North,E,N,9001,,4146,16042,1999-10-20 00:00:00,,EPSG,,
+24343,Kalianpur 1975 / UTM zone 43N,Kalianpur 75 / UTM 43N,,,India - between 72 and 78deg East.,projected 2D,,,East,North,E,N,9001,,4146,16043,1999-10-20 00:00:00,,EPSG,,
+24344,Kalianpur 1975 / UTM zone 44N,Kalianpur 75 / UTM 44N,,,India - between 78 and 84deg East.,projected 2D,,,East,North,E,N,9001,,4146,16044,1999-10-20 00:00:00,,EPSG,,
+24345,Kalianpur 1975 / UTM zone 45N,Kalianpur 75 / UTM 45N,,,India - between 84 and 90deg East.,projected 2D,,,East,North,E,N,9001,,4146,16045,1999-10-20 00:00:00,,EPSG,,
+24346,Kalianpur 1975 / UTM zone 46N,Kalianpur 75 / UTM 46N,,,India - between 90 and 96deg East.,projected 2D,,,East,North,E,N,9001,,4146,16046,1999-10-20 00:00:00,,EPSG,,
+24347,Kalianpur 1975 / UTM zone 47N,Kalianpur 75 / UTM 47N,,,India - east of 96deg East.,projected 2D,,,East,North,E,N,9001,,4146,16047,1999-10-20 00:00:00,,EPSG,,
+24370,Kalianpur 1880 / India zone 0,Kalianpur / India 0,,,Pakistan north of 35 deg 35 min North.,projected 2D,,,East,North,E,N,9084,,4243,18110,1999-10-20 00:00:00,,EPSG,,97.23
+24371,Kalianpur 1880 / India zone I,Kalianpur / India I,,,India north of 28 deg North; Pakistan 28 deg to 35 deg 35 min North.,projected 2D,,,East,North,E,N,9084,,4243,18111,1999-10-20 00:00:00,,EPSG,,97.23
+24372,Kalianpur 1880 / India zone IIa,Kalianpur / India IIa,,,India - between 21 deg and 28 deg North and  west of 82 deg East; Pakistan - south of 28 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18112,1999-10-20 00:00:00,,EPSG,,97.23
+24373,Kalianpur 1880 / India zone III,Kalianpur / India III,,,India - between 15 deg and 21 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18114,1999-10-20 00:00:00,,EPSG,,97.23
+24374,Kalianpur 1880 / India zone IV,Kalianpur / India IV,,,India - south of 15 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18116,1999-10-20 00:00:00,,EPSG,,97.23
+24375,Kalianpur 1937 / India zone IIb,Kalianpur 37 / India IIb,,,Bangladesh.,projected 2D,,,East,North,E,N,9001,,4144,18238,1999-10-20 00:00:00,,EPSG,Used by Bangladesh since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and Benoit's 1895 British inch-metre ratio of 39.370115 rounded as Ind ft = 0.30479841m exactly.,97.23
+24376,Kalianpur 1962 / India zone I,Kalianpur 62 / India I,,,Pakistan - north of 28deg North.,projected 2D,,,East,North,E,N,9001,,4145,18236,1999-10-20 00:00:00,,EPSG,Used by Pakistan since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,97.23
+24377,Kalianpur 1962 / India zone IIa,Kalianpur 62 / India IIa,,,Pakistan - south of 28deg North.,projected 2D,,,East,North,E,N,9001,,4145,18237,1999-10-20 00:00:00,,EPSG,Used by Pakistan since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded by G.Bomford with slight error as Ind ft = 0.3048996m exactly.,97.23
+24378,Kalianpur 1975 / India zone I,Kalianpur 75 / India I,,,India - north of 28deg North and west of 82deg East.,projected 2D,,,East,North,E,N,9001,,4146,18231,1999-10-20 00:00:00,,EPSG,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24379,Kalianpur 1975 / India zone IIa,Kalianpur 75 / India IIa,,,India - between 28deg and 21deg North and west of 82deg East.,projected 2D,,,East,North,E,N,9001,,4146,18232,1999-10-20 00:00:00,,EPSG,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24380,Kalianpur 1975 / India zone IIb,Kalianpur 75 / India IIb,,,India - north of 21deg North and east of 82deg East.,projected 2D,,,East,North,E,N,9001,,4146,18235,1999-10-20 00:00:00,,EPSG,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24381,Kalianpur 1975 / India zone III,Kalianpur 75 / India III,,,India - between 21deg and 15deg North.,projected 2D,,,East,North,E,N,9001,,4146,18233,1999-10-20 00:00:00,,EPSG,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24382,Kalianpur 1880 / India zone IIb,Kalianpur / India IIb,,,Bangladesh; India - north of 22 deg North and east of 82 deg East; Myanmar (Burma) - north of 22 deg North.,projected 2D,,,East,North,E,N,9084,,4243,18113,1999-10-20 00:00:00,,EPSG,,97.23
+24383,Kalianpur 1975 / India zone IV,Kalianpur 75 / India IV,,,India - south of 21deg North.,projected 2D,,,East,North,E,N,9001,,4146,18234,1999-10-20 00:00:00,,EPSG,Used by India since metrication.  Metric conversion applies A.R.Clarke's Indian foot-British foot ratio of 0.99999566 and J.S.Clark's 1865 British inch-metre ratio of 39.369971 rounded as 1 Ind ft = 0.3048995m exactly.,97.23
+24500,Kertau / Singapore Grid,,,,Singapore.,projected 2D,,,East,North,E,N,9001,,4245,19920,1995-06-02 00:00:00,,EPSG,,
+24547,Kertau / UTM zone 47N,,,,Malaysia - West Malaysia west of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4245,16047,1995-06-02 00:00:00,,EPSG,,
+24548,Kertau / UTM zone 48N,,,,Malaysia - West Malaysia east of 102 deg East.,projected 2D,,,East,North,E,N,9001,,4245,16048,1995-07-21 00:00:00,,EPSG,,95.192
+24571,Kertau / R.S.O. Malaya (ch),,,,Malaysia - West Malaysia,projected 2D,,,East,North,E,N,9062,,4245,19935,1999-10-20 00:00:00,,EPSG,Adopts metric conversion of 39.370113 inches per metre.,97.231
+24600,KOC Lambert,,,,Kuwait.,projected 2D,,,East,North,E,N,9001,,4246,19906,1996-04-12 00:00:00,,EPSG,,
+24718,La Canoa / UTM zone 18N,,,,Venezuela - west of 72 deg West.,projected 2D,,,East,North,E,N,9001,,4247,16018,1999-10-20 00:00:00,,EPSG,Sometimes referred to as PSAD56 / UTM zone 18N.,
+24719,La Canoa / UTM zone 19N,,,,Venezuela - between 72 and 66 deg West.,projected 2D,,,East,North,E,N,9001,,4247,16019,1999-10-20 00:00:00,,EPSG,Sometimes referred to as PSAD56 / UTM zone 19N.,
+24720,La Canoa / UTM zone 20N,,,,Venezuela - east of 66 deg West.,projected 2D,,,East,North,E,N,9001,,4247,16020,1995-06-02 00:00:00,,EPSG,Sometimes referred to as PSAD56 / UTM zone 20N.,
+24818,PSAD56 / UTM zone 18N,,,,South America (Ecuador;  [Venezuela]) 78deg West to 72deg West.,projected 2D,,,East,North,E,N,9001,,4248,16018,1995-06-02 00:00:00,,EPSG,In Venezuela also known as La Canoa / UTM zone 18N.,
+24819,PSAD56 / UTM zone 19N,,,,South America (Netherlands Antilles; [Venezuela]) 72deg West  to 66deg West.,projected 2D,,,East,North,E,N,9001,,4248,16019,1995-06-02 00:00:00,,EPSG,In Venezuela also known as La Canoa / UTM zone 19N.,
+24820,PSAD56 / UTM zone 20N,,,,South America (Guyana; [Venezuela]) 66deg West  to 60deg West.,projected 2D,,,East,North,E,N,9001,,4248,16020,1995-06-02 00:00:00,,EPSG,In Venezuela also known as La Canoa / UTM zone 20N.,
+24821,PSAD56 / UTM zone 21N,,,,South America (Guyana; Suriname) 60deg West  to 54deg West.,projected 2D,,,East,North,E,N,9001,,4248,16021,1995-06-02 00:00:00,,EPSG,,
+24877,PSAD56 / UTM zone 17S,,,,South America (Chile; Ecuador; Peru) 84deg West  to 78deg West.,projected 2D,,,East,North,E,N,9001,,4248,16117,1995-06-02 00:00:00,,EPSG,,
+24878,PSAD56 / UTM zone 18S,,,,South America (Chile; Ecuador; Peru) 78deg West  to 72deg West.,projected 2D,,,East,North,E,N,9001,,4248,16118,1995-06-02 00:00:00,,EPSG,,
+24879,PSAD56 / UTM zone 19S,,,,South America (Bolivia; Chile; Peru) 72deg West  to 66deg West.,projected 2D,,,East,North,E,N,9001,,4248,16119,1995-06-02 00:00:00,,EPSG,,
+24880,PSAD56 / UTM zone 20S,,,,South America (Bolivia) 66deg West  to 60deg West.,projected 2D,,,East,North,E,N,9001,,4248,16120,1995-06-02 00:00:00,,EPSG,,
+24882,PSAD56 / UTM zone 22S,,,,Brazil - offshore Amazon Cone,projected 2D,,,East,North,E,N,9001,,4248,16122,1999-04-22 00:00:00,,EPSG,,
+24891,PSAD56 / Peru west zone,,,,Peru west of 79 deg West.,projected 2D,,,East,North,X,Y,9001,,4248,18161,1995-06-02 00:00:00,,EPSG,,
+24892,PSAD56 / Peru central zone,PSAD56 / Peru central,,,Peru 79 to 73 deg West.,projected 2D,,,East,North,X,Y,9001,,4248,18162,1995-06-02 00:00:00,,EPSG,,
+24893,PSAD56 / Peru east zone,,,,Peru east of 73 deg West.,projected 2D,,,East,North,X,Y,9001,,4248,18163,1995-06-02 00:00:00,,EPSG,,
+25000,Leigon / Ghana Metre Grid,Leigon / Ghana Grid,,,Ghana.,projected 2D,,,East,North,E,N,9001,,4250,19904,1995-06-02 00:00:00,,EPSG,,
+25231,Lome / UTM zone 31N,,,,Togo.,projected 2D,,,East,North,E,N,9001,,4252,16031,1995-06-02 00:00:00,,EPSG,,
+25391,Luzon 1911 / Philippines zone I,Luzon / Philippines I,,,Philippines - west of 118 deg East.,projected 2D,,,East,North,X,Y,9001,,4253,18171,1995-06-02 00:00:00,,EPSG,,
+25392,Luzon 1911 / Philippines zone II,Luzon / Philippines II,,,Philippines - Palawan; Calamian Islands.,projected 2D,,,East,North,X,Y,9001,,4253,18172,1995-06-02 00:00:00,,EPSG,,
+25393,Luzon 1911 / Philippines zone III,Luzon / Philippines III,,,Philippines - Luzon (except SE part;); Mindoro.,projected 2D,,,East,North,X,Y,9001,,4253,18173,1995-06-02 00:00:00,,EPSG,,
+25394,Luzon 1911 / Philippines zone IV,Luzon / Philippines IV,,,Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; west Mindanao.,projected 2D,,,East,North,X,Y,9001,,4253,18174,1995-06-02 00:00:00,,EPSG,,
+25395,Luzon 1911 / Philippines zone V,Luzon / Philippines V,,,Philippines - east Mindanao; Bohol; Samar.,projected 2D,,,East,North,X,Y,9001,,4253,18175,1995-06-02 00:00:00,,EPSG,,
+25700,Makassar (Jakarta) / NEIEZ,Makassar / NEIEZ,,,Indonesia - south west Sulawesi.,projected 2D,,,East,North,X,Y,9001,,4804,19905,1995-06-02 00:00:00,,EPSG,,
+25828,ETRF89 / UTM zone 28N,,,,Europe - 18deg West to 12deg West - United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4258,16028,1999-04-22 00:00:00,,EPSG,,99.11
+25829,ETRF89 / UTM zone 29N,,,,Europe - 12deg West to 6deg West - United Kingdom (UKCS) offshore.,projected 2D,,,East,North,E,N,9001,,4258,16029,1999-04-22 00:00:00,,EPSG,,99.11
+25830,ETRF89 / UTM zone 30N,,,,Europe - 6deg West to 0deg.,projected 2D,,,East,North,E,N,9001,,4258,16030,1999-04-22 00:00:00,,EPSG,,99.11
+25831,ETRF89 / UTM zone 31N,,,,Europe - 0deg to 6deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16031,1999-04-22 00:00:00,,EPSG,,99.11
+25832,ETRF89 / UTM zone 32N,,,,Europe - 6deg East  to 12deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16032,1999-04-22 00:00:00,,EPSG,,99.11
+25833,ETRF89 / UTM zone 33N,,,,Europe - 12deg East  to 18deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16033,1999-04-22 00:00:00,,EPSG,,99.11
+25834,ETRF89 / UTM zone 34N,,,,Europe - 18deg East  to 24deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16034,1999-04-22 00:00:00,,EPSG,,99.11
+25835,ETRF89 / UTM zone 35N,,,,Europe - 24deg East  to 30deg East - Norway.,projected 2D,,,East,North,E,N,9001,,4258,16035,1999-04-22 00:00:00,,EPSG,,99.11
+25836,ETRF89 / UTM zone 36N,,,,Europe - 30deg East  to 36deg East.,projected 2D,,,East,North,E,N,9001,,4258,16036,1999-04-22 00:00:00,,EPSG,,99.11
+25837,ETRF89 / UTM zone 37N,,,,Europe - 36deg East  to 42deg East.,projected 2D,,,East,North,E,N,9001,,4258,16037,1999-04-22 00:00:00,,EPSG,,99.11
+25838,ETRF89 / UTM zone 38N,,,,Europe - 42deg East  to 48deg East.,projected 2D,,,East,North,E,N,9001,,4258,16038,1999-04-22 00:00:00,,EPSG,,99.11
+25884,ETRF89 / TM Baltic93,,,,Estonia;  Latvia;  Lithuania.,projected 2D,,,North,East,X,Y,9001,,4258,19939,1999-04-22 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Used as a common coordinate system for the Baltic states and for medium and small scale mapping in Estonia since 1993.,99.11
+25932,Malongo 1987 / UTM zone 32S,Malongo 1987 / UTM 32S,,,Angola - Cabinda.,projected 2D,,,East,North,E,N,9001,,4259,16132,1995-06-02 00:00:00,,EPSG,,
+26191,Merchich / Nord Maroc,,,,Morocco north of 35 grads (31 deg 30 min) North.,projected 2D,,,East,North,X,Y,9001,,4261,18131,1995-06-02 00:00:00,,EPSG,,
+26192,Merchich / Sud Maroc,,,,Morocco 31grads to 35grads  (27 deg 54 min to 31 deg 30 min) North.,projected 2D,,,East,North,X,Y,9001,,4261,18132,1995-06-02 00:00:00,,EPSG,,
+26193,Merchich / Sahara,,,,Morocco south of 31grads  (27 deg 54 min) North.,projected 2D,,,East,North,X,Y,9001,,4261,18133,1995-06-02 00:00:00,,EPSG,,
+26237,Massawa / UTM zone 37N,,,,Eritrea.,projected 2D,,,East,North,E,N,9001,,4262,16037,1995-06-02 00:00:00,,EPSG,,
+26331,Minna / UTM zone 31N,,,,Nigeria - offshore beyond continental shelf west of 6 deg East.,projected 2D,,,East,North,E,N,9001,,4263,16031,1995-06-02 00:00:00,,EPSG,,
+26332,Minna / UTM zone 32N,,,,Nigeria - offshore beyond continental shelf.,projected 2D,,,East,North,E,N,9001,,4263,16032,1995-06-02 00:00:00,,EPSG,,
+26391,Minna / Nigeria West Belt,Minna / Nigeria West,,,Nigeria west of 6 deg 30 min East.,projected 2D,,,East,North,E,N,9001,,4263,18151,1995-06-02 00:00:00,,EPSG,,
+26392,Minna / Nigeria Mid Belt,,,,Nigeria between 6 deg 30 min and 10 deg 30 min East.,projected 2D,,,East,North,E,N,9001,,4263,18152,1995-06-02 00:00:00,,EPSG,,
+26393,Minna / Nigeria East Belt,Minna / Nigeria East,,,Nigeria east of 10 deg 30 min East.,projected 2D,,,East,North,E,N,9001,,4263,18153,1995-06-02 00:00:00,,EPSG,,
+26432,Mhast / UTM zone 32S,,,,Angola - Cabinda.,projected 2D,,,East,North,E,N,9001,,4264,16132,1995-06-02 00:00:00,,EPSG,,
+26591,Monte Mario (Rome) / Italy zone 1,Monte Mario / Italy 1,,,Italy west of 12 deg East.,projected 2D,,,East,North,X,Y,9001,,4806,18121,1995-06-02 00:00:00,,EPSG,,
+26592,Monte Mario (Rome) / Italy zone 2,Monte Mario / Italy 2,,,Italy east of 12 deg East.,projected 2D,,,East,North,X,Y,9001,,4806,18122,1995-06-02 00:00:00,,EPSG,,
+26632,M'poraloko / UTM zone 32N,M'poraloko / UTM 32N,,,Gabon - north of equator.,projected 2D,,,East,North,E,N,9001,,4266,16032,1995-06-02 00:00:00,,EPSG,,
+26692,M'poraloko / UTM zone 32S,M'poraloko / UTM 32S,,,Gabon - south of equator.,projected 2D,,,East,North,E,N,9001,,4266,16132,1995-06-02 00:00:00,,EPSG,,
+26703,NAD27 / UTM zone 3N,,,,North America - United States (USA) - Alaska - 168deg West  to 162deg West.,projected 2D,,,East,North,E,N,9001,,4267,16003,1995-06-02 00:00:00,,EPSG,,
+26704,NAD27 / UTM zone 4N,,,,North America - United States (USA) - Alaska - 162deg West  to 156deg West.,projected 2D,,,East,North,E,N,9001,,4267,16004,1995-06-02 00:00:00,,EPSG,,
+26705,NAD27 / UTM zone 5N,,,,North America - United States (USA) - Alaska - 156deg West  to 150deg West.,projected 2D,,,East,North,E,N,9001,,4267,16005,1995-06-02 00:00:00,,EPSG,,
+26706,NAD27 / UTM zone 6N,,,,North America - United States (USA) - Alaska - 150deg West  to 144deg West.,projected 2D,,,East,North,E,N,9001,,4267,16006,1995-06-02 00:00:00,,EPSG,,
+26707,NAD27 / UTM zone 7N,,,,North America - Canada; United States (USA) - Alaska - 144deg West  to 138deg West.,projected 2D,,,East,North,E,N,9001,,4267,16007,1995-06-02 00:00:00,,EPSG,,
+26708,NAD27 / UTM zone 8N,,,,North America - Canada; United States (USA) - 138deg West  to 132deg West.,projected 2D,,,East,North,E,N,9001,,4267,16008,1995-06-02 00:00:00,,EPSG,,
+26709,NAD27 / UTM zone 9N,,,,North America - Canada; United States (USA) - 132deg West  to 126deg West.,projected 2D,,,East,North,E,N,9001,,4267,16009,1995-06-02 00:00:00,,EPSG,,
+26710,NAD27 / UTM zone 10N,,,,North America - Canada; United States (USA) - 130deg West  to 120deg West.,projected 2D,,,East,North,E,N,9001,,4267,16010,1995-06-02 00:00:00,,EPSG,,
+26711,NAD27 / UTM zone 11N,,,,North America - Canada; Mexico; United States (USA) - 120deg West  to 114deg West.,projected 2D,,,East,North,E,N,9001,,4267,16011,1995-06-02 00:00:00,,EPSG,,
+26712,NAD27 / UTM zone 12N,,,,North America - Canada; Mexico; United States (USA) - 114deg West  to 108deg West.,projected 2D,,,East,North,E,N,9001,,4267,16012,1995-06-02 00:00:00,,EPSG,,
+26713,NAD27 / UTM zone 13N,,,,North America - Canada; Mexico; United States (USA) - 108deg West  to 102deg West.,projected 2D,,,East,North,E,N,9001,,4267,16013,1995-06-02 00:00:00,,EPSG,,
+26714,NAD27 / UTM zone 14N,,,,North America - Canada; Mexico; United States (USA) - 102deg West  to 96deg West.,projected 2D,,,East,North,E,N,9001,,4267,16014,1995-06-02 00:00:00,,EPSG,,
+26715,NAD27 / UTM zone 15N,,,,North America - Canada; Mexico; United States (USA) - 96deg West  to 90deg West.,projected 2D,,,East,North,E,N,9001,,4267,16015,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 15N (code 227).,
+26716,NAD27 / UTM zone 16N,,,,North America - Canada; Mexico; United States (USA) - 90deg West  to 84deg West.,projected 2D,,,East,North,E,N,9001,,4267,16016,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 16N (code 228).,
+26717,NAD27 / UTM zone 17N,,,,North America - Canada; Mexico; United States (USA) - 84deg West  to 78deg West.,projected 2D,,,East,North,E,N,9001,,4267,16017,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 17N (code 229).  In Quebec superseded by NAD27(CGQ77) / UTM zone 17N (code 231).,
+26718,NAD27 / UTM zone 18N,,,,North America - Canada; United States (USA) - 78deg West  to 72deg West.,projected 2D,,,East,North,E,N,9001,,4267,16018,1995-06-02 00:00:00,,EPSG,In Ontario superseded by NAD27(76) / UTM zone 18N (code 230).  In Quebec superseded by NAD27(CGQ77) / UTM zone 18N (code 232).,
+26719,NAD27 / UTM zone 19N,,,,North America - Canada; United States (USA) - 72deg West  to 66deg West.,projected 2D,,,East,North,E,N,9001,,4267,16019,1995-06-02 00:00:00,,EPSG,In Quebec superseded by NAD27(CGQ77) / UTM zone 19N (code 233).,
+26720,NAD27 / UTM zone 20N,,,,North America - Antigua and Barbuda - Barbuda.  British Virgin Islands (military).  Canada; United States (USA) offshore Atlantic - 66deg West  to 60deg West.,projected 2D,,,East,North,E,N,9001,,4267,16020,1995-06-02 00:00:00,,EPSG,In Quebec superseded by NAD27(CGQ77) / UTM zone 20N (code 234).,
+26721,NAD27 / UTM zone 21N,,,,North America - Canada - 60deg West  to 54deg West.,projected 2D,,,East,North,E,N,9001,,4267,16021,1995-06-02 00:00:00,,EPSG,In Quebec superseded by NAD27(CGQ77) / UTM zone 21N (code 235).,
+26722,NAD27 / UTM zone 22N,,,,North America - Canada - 54deg West  to 48deg West.,projected 2D,,,East,North,E,N,9001,,4267,16022,1995-06-02 00:00:00,,EPSG,,
+26729,NAD27 / Alabama East,,,,United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; St.Clair; Talladega; Tallapoosa,projected 2D,,,East,North,X,Y,9003,,4267,10101,1995-06-02 00:00:00,,EPSG,,
+26730,NAD27 / Alabama West,,,,United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston,projected 2D,,,East,North,X,Y,9003,,4267,10102,1995-06-02 0 [...]
+26731,NAD27 / Alaska zone 1,,,,United States - Alaska - Panhandle.,projected 2D,,,East,North,X,Y,9003,,4267,15001,1995-06-02 00:00:00,,EPSG,,
+26732,NAD27 / Alaska zone 2,,,,United States - Alaska - 141deg to 144deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15002,1995-06-02 00:00:00,,EPSG,,
+26733,NAD27 / Alaska zone 3,,,,United States - Alaska - 144deg to 148deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15003,1995-06-02 00:00:00,,EPSG,,
+26734,NAD27 / Alaska zone 4,,,,United States - Alaska - 148deg to 152deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15004,1995-06-02 00:00:00,,EPSG,,
+26735,NAD27 / Alaska zone 5,,,,United States - Alaska - 152deg to 156deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15005,1995-06-02 00:00:00,,EPSG,,
+26736,NAD27 / Alaska zone 6,,,,United States - Alaska - 156deg to 160deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15006,1995-06-02 00:00:00,,EPSG,,
+26737,NAD27 / Alaska zone 7,,,,United States - Alaska - 160deg to 164deg West.,projected 2D,,,East,North,X,Y,9003,,4267,15007,1995-06-02 00:00:00,,EPSG,,
+26738,NAD27 / Alaska zone 8,,,,United States - Alaska - 164deg to 168deg West; north of 54d 30m North.,projected 2D,,,East,North,X,Y,9003,,4267,15008,1995-06-02 00:00:00,,EPSG,,
+26739,NAD27 / Alaska zone 9,,,,United States - Alaska - West of 168deg West and north of 54d 30m North.,projected 2D,,,East,North,X,Y,9003,,4267,15009,1995-06-02 00:00:00,,EPSG,,
+26740,NAD27 / Alaska zone 10,,,,United States - Alaska - Aleutian Islands.,projected 2D,,,East,North,X,Y,9003,,4267,15010,1995-06-02 00:00:00,,EPSG,,
+26741,NAD27 / California zone I,NAD27 / California I,,,United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity,projected 2D,,,East,North,X,Y,9003,,4267,10401,1995-06-02 00:00:00,,EPSG,,
+26742,NAD27 / California zone II,NAD27 / California II,,,United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba,projected 2D,,,East,North,X,Y,9003,,4267,10402,1995-06-02 00:00:00,,EPSG,,
+26743,NAD27 / California zone III,NAD27 / California III,,,United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne,projected 2D,,,East,North,X,Y,9003,,4267,10403,1995-06-02 00:00:00,,EPSG,,
+26744,NAD27 / California zone IV,NAD27 / California IV,,,United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare,projected 2D,,,East,North,X,Y,9003,,4267,10404,1995-06-02 00:00:00,,EPSG,,
+26745,NAD27 / California zone V,NAD27 / California V,,,United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; San Bernardino; San Luis Obispo; Santa Barbara; Ventura,projected 2D,,,East,North,X,Y,9003,,4267,10405,1995-06-02 00:00:00,,EPSG,,
+26746,NAD27 / California zone VI,NAD27 / California VI,,,United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego,projected 2D,,,East,North,X,Y,9003,,4267,10406,1995-06-02 00:00:00,,EPSG,,
+26747,NAD27 / California zone VII,NAD27 / California VII,,,United States - California - Los Angeles.,projected 2D,,,East,North,X,Y,9003,,4267,10407,1995-06-02 00:00:00,,EPSG,,
+26748,NAD27 / Arizona East,,,,United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo,projected 2D,,,East,North,X,Y,9003,,4267,10201,1995-08-22 00:00:00,,EPSG,,95.25
+26749,NAD27 / Arizona Central,,,,United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai,projected 2D,,,East,North,X,Y,9003,,4267,10202,1995-08-22 00:00:00,,EPSG,,95.25
+26750,NAD27 / Arizona West,,,,United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma,projected 2D,,,East,North,X,Y,9003,,4267,10203,1995-08-22 00:00:00,,EPSG,,95.25
+26751,NAD27 / Arkansas North,,,,United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawrence; Logan; Madison; Marion; Mississippi; Newton; Perry; Poinsett; Pope; Randolph; Scott; Searcy; Sebastian; Sharp; St. Francis; Stone; Van Buren; Washington; White; Woodruff; Yell,projected 2D,,,East,No [...]
+26752,NAD27 / Arkansas South,,,,United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln; Little River; Lonoke; Miller; Monroe; Montgomery; Nevada; Ouachita; Phillips; Pike; Polk; Prairie; Pulaski; Saline; Sevier; Union,projected 2D,,,East,North,X,Y,9003,,4267,10302,1995-06-02 00:00:00,,EPSG,,
+26753,NAD27 / Colorado North,,,,United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma,projected 2D,,,East,North,X,Y,9003,,4267,10501,1995-06-02 00:00:00,,EPSG,,
+26754,NAD27 / Colorado Central,,,,United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Park; Pitkin; Summit; Teller,projected 2D,,,East,North,X,Y,9003,,4267,10502,1995-06-02 00:00:00,,EPSG,,
+26755,NAD27 / Colorado South,,,,United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowers; Pueblo; Rio Grande; Saguache; San Juan; San Miguel,projected 2D,,,East,North,X,Y,9003,,4267,10503,1995-06-02 00:00:00,,EPSG,,
+26756,NAD27 / Connecticut,,,,United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham,projected 2D,,,East,North,X,Y,9003,,4267,10600,1995-06-02 00:00:00,,EPSG,,
+26757,NAD27 / Delaware,,,,United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex,projected 2D,,,East,North,X,Y,9003,,4267,10700,1995-06-02 00:00:00,,EPSG,,
+26758,NAD27 / Florida East,,,,United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie; Volusia,projected 2D,,,East,North,X,Y,9003,,4267,10901,1995-06-02 00:00:00,,EPSG,,
+26759,NAD27 / Florida West,,,,United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter,projected 2D,,,East,North,X,Y,9003,,4267,10902,1995-06-02 00:00:00,,EPSG,,
+26760,NAD27 / Florida North,,,,United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Rosa; Suwannee; Taylor; Union; Wakulla; Walton; Washington,projected 2D,,,East,North,X,Y,9003,,4267,10903,1995-06-02 00:00:00,,EPSG,,
+26766,NAD27 / Georgia East,,,,United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn; Greene; Hancock; Hart; Jeff Davis; Jefferson; Jenkins; Johnson; Lanier; Laurens; Liberty; Lincoln; Long; Madison; McDuffie; McIntosh; Montgomery; Oglethorpe; Pierce; Richmond; Screven; Stephens; Taliaferr [...]
+26767,NAD27 / Georgia West,,,,United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford; Crisp; Dade; Dawson; De Kalb; Decatur; Dooly; Dougherty; Douglas; Early; Fannin; Fayette; Floyd; Forsyth; Fulton; Gilmer; Gordon; Grady; Gwinnett; Habersham; Hall; Haralson; Harris; Heard; Henry; Houston;  [...]
+26768,NAD27 / Idaho East,,,,United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton,projected 2D,,,East,North,X,Y,9003,,4267,11101,1995-06-02 00:00:00,,EPSG,,
+26769,NAD27 / Idaho Central,,,,United States (USA) - daho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls,projected 2D,,,East,North,X,Y,9003,,4267,11102,1995-06-02 00:00:00,,EPSG,,
+26770,NAD27 / Idaho West,,,,United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington,projected 2D,,,East,North,X,Y,9003,,4267,11103,1995-06-02 00:00:00,,EPSG,,
+26771,NAD27 / Illinois East,,,,United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasper; Jefferson; Johnson; Kane; Kankakee; Kendall; La Salle; Lake; Lawrence; Livingston; Macon; Marion; Massac; McHenry; McLean; Moultrie; Piatt; Pope; Richland; Saline; Shelby; Vermilion; Wabash; Wayne; Whi [...]
+26772,NAD27 / Illinois West,,,,United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Mason; McDonough; Menard; Mercer; Monroe; Montgomery; Morgan; Ogle; Peoria; Perry; Pike; Pulaski; Putnam; Randolph; Rock Island; Sangamon; Schuyler; Scott; St. Clair; Stark; Stephenson; Tazewell; Union; Warr [...]
+26773,NAD27 / Indiana East,,,,United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jackson; Jay; Jefferson; Jennings; Johnson; Kosciusko; Lagrange; Madison; Marion; Marshall; Miami; Noble; Ohio; Randolph; Ripley; Rush; Scott; Shelby; St. Joseph; Steuben; Switzerland; Tipton; Union; Wabash; W [...]
+26774,NAD27 / Indiana West,,,,United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Parke; Perry; Pike; Porter; Posey; Pulaski; Putnam; Spencer; Starke; Sullivan; Tippecanoe; Vanderburgh; Vermillion; Vigo; Warren; Warrick; White,projected 2D,,,East,North,X,Y,9003,,4267,11302,1995-06-02 00:00:0 [...]
+26775,NAD27 / Iowa North,,,,United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; Franklin; Greene; Grundy; Hamilton; Hancock; Hardin; Howard; Humboldt; Ida; Jackson; Jones; Kossuth; Linn; Lyon; Marshall; Mitchell; Monona; O'Brien; Osceola; Palo Alto; Plymouth; Pocahontas; Sac; Sioux; Story [...]
+26776,NAD27 / Iowa South,,,,United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Mahaska; Marion; Mills; Monroe; Montgomery; Muscatine; Page; Polk; Pottawattamie; Poweshiek; Ringgold; Scott; Shelby; Taylor; Union; Van Buren; Wapello; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9 [...]
+26777,NAD27 / Kansas North,,,,United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Morris; Nemaha; Norton; Osborne; Ottawa; Phillips; Pottawatomie; Rawlins; Republic; Riley; Rooks; Russell; Saline; Shawnee; Sheridan; Sherman; Smith; Thomas; Trego; Wabaunsee; Wallace; Washington; Wyandotte,p [...]
+26778,NAD27 / Kansas South,,,,United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Harper; Harvey; Haskell; Hodgeman; Kearny; Kingman; Kiowa; Labette; Lane; Linn; Lyon; Marion; McPherson; Meade; Miami; Montgomery; Morton; Neosho; Ness; Osage; Pawnee; Pratt; Reno; Rice; Rush; Scott; Sedgwick; [...]
+26779,NAD27 / Kentucky North,,,,United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawrence; Lewis; Mason; Menifee; Montgomery; Morgan; Nicholas; Oldham; Owen; Pendleton; Robertson; Rowan; Scott; Shelby; Spencer; Trimble; Woodford,projected 2D,,,East,North,X,Y,9003,,4267,11601,1995-06-02 00 [...]
+26780,NAD27 / Kentucky South,,,,United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton; Garrard; Graves; Grayson; Green; Hancock; Hardin; Harlan; Hart; Henderson; Hickman; Hopkins; Jackson; Johnson; Knott; Knox; Larue; Laurel; Lee; Leslie; Letcher; Lincoln; Livingston; Logan; Lyon; Madison [...]
+26781,NAD27 / Louisiana North,,,,United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; Red River; Richland; Sabine; Tensas; Union; Vernon; Webster; West Carroll; Winn,projected 2D,,,East,North,X,Y,9003,,4267,11701,1995-06-02 00:00:00,,EPSG,,
+26782,NAD27 / Louisiana South,,,,United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; Vermilion; Washington; West Ba [...]
+26783,NAD27 / Maine East,,,,United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington,projected 2D,,,East,North,X,Y,9003,,4267,11801,1995-06-02 00:00:00,,EPSG,,
+26784,NAD27 / Maine West,,,,United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York,projected 2D,,,East,North,X,Y,9003,,4267,11802,1995-06-02 00:00:00,,EPSG,,
+26785,NAD27 / Maryland,,,,United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Washington; Wicomico; Worcester,projected 2D,,,East,North,X,Y,9003,,4267,11900,1995-06-02 00:00:00,,EPSG,,
+26786,NAD27 / Massachusetts Mainland,NAD27 / Massachusetts,,,United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester,projected 2D,,,East,North,X,Y,9003,,4267,12001,1995-06-02 00:00:00,,EPSG,,
+26787,NAD27 / Massachusetts Island,NAD27 / Massachusetts Is,,,United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket,projected 2D,,,East,North,X,Y,9003,,4267,12002,1995-06-02 00:00:00,,EPSG,,
+26791,NAD27 / Minnesota North,,,,United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis,projected 2D,,,East,North,X,Y,9003,,4267,12201,1995-06-02 00:00:00,,EPSG,,
+26792,NAD27 / Minnesota Central,NAD27 / Minnesota Cent.,,,United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin,projected 2D,,,East,North,X,Y,9003,,4267,12202,1995-06-02 00:00:00,,EPSG,,
+26793,NAD27 / Minnesota South,,,,United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Martin; McLeod; Meeker; Mower; Murray; Nicollet; Nobles; Olmsted; Pipestone; Ramsey; Redwood; Renville; Rice; Rock; Scott; Sherburne; Sibley; Steele; Swift; Wabasha; Waseca; Washington; Watonwan; Winona; W [...]
+26794,NAD27 / Mississippi East,,,,United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; Lee; Lowndes; Marshall; Monroe; Neshoba; Newton; Noxubee; Oktibbeha; Pearl River; Perry; Pontotoc; Prentiss; Scott; Smith; Stone; Tippah; Tishomingo; Union; Wayne; Webster; Winston,projected 2D,,,East,N [...]
+26795,NAD27 / Mississippi West,,,,United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Montgomery; Panola; Pike; Quitman; Rankin; Sharkey; Simpson; Sunflower; Tallahatchie; Tate; Tunica; Walthall; Warren; Washington; Wilkinson; Yalobusha; Yazoo,projected 2D,,,East,North,X,Y,9003,,4267,12302, [...]
+26796,NAD27 / Missouri East,,,,United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Perry; Pike; Ralls; Reynolds; Ripley; Scott; Shannon; St. Charles; St. Francois; St. Louis; Ste. Genevieve; Stoddard; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9003,,4267,12401,1995-06-02 00:00: [...]
+26797,NAD27 / Missouri Central,,,,United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Mercer; Miller; Moniteau; Monroe; Morgan; Osage; Ozark; Pettis; Phelps; Polk; Pulaski; Putnam; Randolph; Saline; Schuyler; Scotland; Shelby; Stone; Sullivan; Taney; Texas; Webster; Wright,projected 2D,,,East [...]
+26798,NAD27 / Missouri West,,,,United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newton; Nodaway; Platte; Ray; St. Clair; Vernon; Worth,projected 2D,,,East,North,X,Y,9003,,4267,12403,1995-06-02 00:00:00,,EPSG,,
+26801,NAD Michigan / Michigan East,NAD27 / Michigan East,,,United States (USA) - Michigan - MI_E - counties of Alcona; Alpena; Arenac; Bay; Cheboygan; Clinton; Crawford; Genesee; Gladwin; Gratiot; Hillsdale; Huron; Ingham; Iosco; Jackson; Lapeer; Lenawee; Livingston; Macomb; Midland; Monroe; Montmorency; Oakland; Ogemaw; Oscoda; Otsego; Presque Isle; Roscommon; Saginaw; Sanilac; Shiawassee; St. Clair; Tuscola; Washtenaw; Wayne,projected 2D,,,East,North,X,Y,9003,,4268,12101,1998-11-11 00: [...]
+26802,NAD Michigan / Michigan Old Central,NAD27 / Michigan Old Cen,,,United States (USA) - Michigan - MI_C - counties of Allegan; Antrim; Barry; Benzie; Berrien; Branch; Calhoun; Cass; Charlevoix; Clare; Eaton; Emmet; Grand Traverse; Ionia; Isabella; Kalamazoo; Kalkaska; Kent; Lake; Leelanau; Manistee; Mason; Mecosta; Missaukee; Montcalm; Muskegon; Newaygo; Oceana; Osceola; Ottawa; St. Joseph; Van Buren; Wexford,projected 2D,,,East,North,X,Y,9003,,4268,12102,1998-11-11 00:00:00,,EPSG,Sup [...]
+26803,NAD Michigan / Michigan West,NAD27 / Michigan West,,,United States (USA) - Michigan - MI_W - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft,projected 2D,,,East,North,X,Y,9003,,4268,12103,1998-11-11 00:00:00,,EPSG,Superseded by 26811 26812 and 26813.,95.25  97.19  98.22
+26811,NAD Michigan / Michigan North,NAD27 / Michigan North,,,United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft,projected 2D,,,East,North,X,Y,9003,,4268,12111,1998-11-11 00:00:00,,EPSG,Supersedes 26801 26802 and 26803.,96.28  98.22
+26812,NAD Michigan / Michigan Central,NAD27 / Michigan Central,,,United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; Oscoda; Otsego; Presque Isle; Roscommon; Wexford,projected 2D,,,East,North,X,Y,9003,,4268,12112,1998-11-11 00:00:00,,EPSG,Supersedes 26801 26802 and 26803.,96.28  97.19  98.22
+26813,NAD Michigan / Michigan South,NAD27 / Michigan South,,,United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Midland; Monroe; Montcalm; Muskegon; Newaygo; Oakland; Oceana; Ottawa; Saginaw; Sanilac; Shiawassee; St. Clair; St. Joseph; Tuscola; Van Buren; Washtenaw; Wayne,projected 2D,,,E [...]
+26903,NAD83 / UTM zone 3N,,,,North America - United States (USA) - Alaska - 168deg West  to 162deg West.,projected 2D,,,East,North,E,N,9001,,4269,16003,1995-06-02 00:00:00,,EPSG,,
+26904,NAD83 / UTM zone 4N,,,,North America - United States (USA) - Alaska - 162deg West  to 156deg West.,projected 2D,,,East,North,E,N,9001,,4269,16004,1995-06-02 00:00:00,,EPSG,,
+26905,NAD83 / UTM zone 5N,,,,North America - United States (USA) - Alaska - 156deg West  to 150deg West.,projected 2D,,,East,North,E,N,9001,,4269,16005,1995-06-02 00:00:00,,EPSG,,
+26906,NAD83 / UTM zone 6N,,,,North America - United States (USA) - Alaska - 150deg West  to 144deg West.,projected 2D,,,East,North,E,N,9001,,4269,16006,1995-06-02 00:00:00,,EPSG,,
+26907,NAD83 / UTM zone 7N,,,,North America - Canada; United States (USA) - Alaska - 144deg West  to 138deg West.,projected 2D,,,East,North,E,N,9001,,4269,16007,1995-06-02 00:00:00,,EPSG,,
+26908,NAD83 / UTM zone 8N,,,,North America - Canada; United States (USA) - 138deg West  to 132deg West.,projected 2D,,,East,North,E,N,9001,,4269,16008,1995-06-02 00:00:00,,EPSG,,
+26909,NAD83 / UTM zone 9N,,,,North America - Canada; United States (USA) - 132deg West  to 126deg West.,projected 2D,,,East,North,E,N,9001,,4269,16009,1995-06-02 00:00:00,,EPSG,,
+26910,NAD83 / UTM zone 10N,,,,North America - Canada; United States (USA) - 130deg West  to 120deg West.,projected 2D,,,East,North,E,N,9001,,4269,16010,1995-06-02 00:00:00,,EPSG,,
+26911,NAD83 / UTM zone 11N,,,,North America - Canada; Mexico; United States (USA) - 120deg West  to 114deg West.,projected 2D,,,East,North,E,N,9001,,4269,16011,1995-06-02 00:00:00,,EPSG,,
+26912,NAD83 / UTM zone 12N,,,,North America - Canada; Mexico; United States (USA) - 114deg West  to 108deg West.,projected 2D,,,East,North,E,N,9001,,4269,16012,1995-06-02 00:00:00,,EPSG,,
+26913,NAD83 / UTM zone 13N,,,,North America - Canada; Mexico; United States (USA) - 108deg West  to 102deg West.,projected 2D,,,East,North,E,N,9001,,4269,16013,1995-06-02 00:00:00,,EPSG,,
+26914,NAD83 / UTM zone 14N,,,,North America - Canada; Mexico; United States (USA) - 102deg West  to 96deg West.,projected 2D,,,East,North,E,N,9001,,4269,16014,1995-06-02 00:00:00,,EPSG,,
+26915,NAD83 / UTM zone 15N,,,,North America - Canada; Mexico; United States (USA) - 96deg West  to 90deg West.,projected 2D,,,East,North,E,N,9001,,4269,16015,1995-06-02 00:00:00,,EPSG,,
+26916,NAD83 / UTM zone 16N,,,,North America - Canada; Mexico; United States (USA) - 90deg West  to 84deg West.,projected 2D,,,East,North,E,N,9001,,4269,16016,1995-06-02 00:00:00,,EPSG,,
+26917,NAD83 / UTM zone 17N,,,,North America - Canada; Mexico; United States (USA) - 84deg West  to 78deg West.,projected 2D,,,East,North,E,N,9001,,4269,16017,1995-06-02 00:00:00,,EPSG,,
+26918,NAD83 / UTM zone 18N,,,,North America - Canada; United States (USA) - 78deg West  to 72deg West.,projected 2D,,,East,North,E,N,9001,,4269,16018,1995-06-02 00:00:00,,EPSG,,
+26919,NAD83 / UTM zone 19N,,,,North America - Canada; United States (USA) - 72deg West  to 66deg West.,projected 2D,,,East,North,E,N,9001,,4269,16019,1995-06-02 00:00:00,,EPSG,,
+26920,NAD83 / UTM zone 20N,,,,North America - Canada; United States (USA) offshore Atlantic - 66deg West  to 60deg West.,projected 2D,,,East,North,E,N,9001,,4269,16020,1995-06-02 00:00:00,,EPSG,,
+26921,NAD83 / UTM zone 21N,,,,North America - Canada - 60deg West  to 54deg West.,projected 2D,,,East,North,E,N,9001,,4269,16021,1995-06-02 00:00:00,,EPSG,,
+26922,NAD83 / UTM zone 22N,,,,North America - Canada - Newfoundland - 54deg West  to 48deg West.,projected 2D,,,East,North,E,N,9001,,4269,16022,1995-06-02 00:00:00,,EPSG,,
+26923,NAD83 / UTM zone 23N,,,,North America - Canada offshore Atlantic - 48deg West  to 42deg West.,projected 2D,,,East,North,E,N,9001,,4269,16023,1995-06-02 00:00:00,,EPSG,,
+26929,NAD83 / Alabama East,,,,United States (USA) - Alabama - AL_E - counties east of approx 86d 37m West - Barbour; Bullock; Calhoun; Chambers; Cherokee; Clay; Cleburne; Coffee; Coosa; Covington; Crenshaw; Dale; De Kalb; Elmore; Etowah; Geneva; Henry; Houston; Jackson; Lee; Macon; Madison; Marshall; Montgomery; Pike; Randolph; Russell; St.Clair; Talladega; Tallapoosa,projected 2D,,,East,North,X,Y,9001,,4269,10131,1995-06-02 00:00:00,,EPSG,,
+26930,NAD83 / Alabama West,,,,United States (USA) - Alabama - AL_W - counties west of approx 86d 37m West - Autauga; Baldwin; Bibb; Blount; Butler; Chilton; Choctaw; Clarke; Colbert; Conecuh; Cullman; Dallas; Escambia; Fayette; Franklin; Greene; Hale; Jefferson; Lamar; Lauderdale; Lawrence; Limestone; Lowndes; Marengo; Marion; Mobile; Monroe; Morgan; Perry; Pickens; Shelby; Sumter; Tuscaloosa; Walker; Washington; Wilcox; Winston,projected 2D,,,East,North,X,Y,9001,,4269,10132,1995-06-02 0 [...]
+26931,NAD83 / Alaska zone 1,,,,United States - Alaska - Panhandle.,projected 2D,,,East,North,X,Y,9001,,4269,15031,1995-06-02 00:00:00,,EPSG,,
+26932,NAD83 / Alaska zone 2,,,,United States - Alaska - 141deg to 144deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15032,1995-06-02 00:00:00,,EPSG,,
+26933,NAD83 / Alaska zone 3,,,,United States - Alaska - 144deg to 148deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15033,1995-06-02 00:00:00,,EPSG,,
+26934,NAD83 / Alaska zone 4,,,,United States - Alaska - 148deg to 152deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15034,1995-06-02 00:00:00,,EPSG,,
+26935,NAD83 / Alaska zone 5,,,,United States - Alaska - 152deg to 156deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15035,1995-06-02 00:00:00,,EPSG,,
+26936,NAD83 / Alaska zone 6,,,,United States - Alaska - 156deg to 160deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15036,1995-06-02 00:00:00,,EPSG,,
+26937,NAD83 / Alaska zone 7,,,,United States - Alaska - 160deg to 164deg West.,projected 2D,,,East,North,X,Y,9001,,4269,15037,1995-06-02 00:00:00,,EPSG,,
+26938,NAD83 / Alaska zone 8,,,,United States - Alaska - 164deg to 168deg West north of 54d 30m North.,projected 2D,,,East,North,X,Y,9001,,4269,15038,1995-06-02 00:00:00,,EPSG,,
+26939,NAD83 / Alaska zone 9,,,,United States - Alaska - west of 168deg West and north of 54d 30m North.,projected 2D,,,East,North,X,Y,9001,,4269,15039,1995-06-02 00:00:00,,EPSG,,
+26940,NAD83 / Alaska zone 10,,,,United States - Alaska - Aleutian Islands.,projected 2D,,,East,North,X,Y,9001,,4269,15040,1995-06-02 00:00:00,,EPSG,,
+26941,NAD83 / California zone 1,NAD83 / California 1,,,United States (USA) - California - CA_1 - counties north of approx 40 deg North - Del Norte; Humboldt; Lassen; Modoc; Plumas; Shasta; Siskiyou; Tehama; Trinity,projected 2D,,,East,North,X,Y,9001,,4269,10431,1995-06-02 00:00:00,,EPSG,,
+26942,NAD83 / California zone 2,NAD83 / California 2,,,United States (USA) - California - CA_2 - counties between approx 40 deg & 38d 15m North - Alpine; Amador; Butte; Colusa; El Dorado; Glenn; Lake; Mendocino; Napa; Nevada; Placer; Sacramento; Sierra; Solano; Sonoma; Sutter; Yolo; Yuba,projected 2D,,,East,North,X,Y,9001,,4269,10432,1995-06-02 00:00:00,,EPSG,,
+26943,NAD83 / California zone 3,NAD83 / California 3,,,United States (USA) - California - CA_3 - counties between approx 38d 15m & 37d North - Alameda; Calaveras; Contra Costa; Madera; Marin; Mariposa; Merced; Mono; San Francisco; San Joaquin; San Mateo; Santa Clara; Santa Cruz; Stanislaus; Tuolumne,projected 2D,,,East,North,X,Y,9001,,4269,10433,1995-06-02 00:00:00,,EPSG,,
+26944,NAD83 / California zone 4,NAD83 / California 4,,,United States (USA) - California - CA_4 - counties between approx 37d & 35d 30m North - Fresno; Inyo; Kings; Monterey; San Benito; Tulare,projected 2D,,,East,North,X,Y,9001,,4269,10434,1995-06-02 00:00:00,,EPSG,,
+26945,NAD83 / California zone 5,NAD83 / California 5,,,United States (USA) - California - CA_5 - counties between approx 35d 50m & 34d North - Kern; Los Angeles; San Bernardino; San Luis Obispo; Santa Barbara; Ventura,projected 2D,,,East,North,X,Y,9001,,4269,10435,1995-06-02 00:00:00,,EPSG,,
+26946,NAD83 / California zone 6,NAD83 / California 6,,,United States (USA) - California - CA_6 - counties south of approx 38d 30m North - Imperial; Orange; Riverside; San Diego,projected 2D,,,East,North,X,Y,9001,,4269,10436,1995-06-02 00:00:00,,EPSG,,
+26948,NAD83 / Arizona  East,,,,United States (USA) - Arizona - AZ_E - counties east of approx 110d 45m West - Apache; Cochise; Gila; Graham; Greenlee; Navajo,projected 2D,,,East,North,X,Y,9001,,4269,10231,1995-06-02 00:00:00,,EPSG,,
+26949,NAD83 / Arizona Central,,,,United States (USA) - Arizona - AZ_C - counties between approx 110d 45m and 113d 20m West - Coconino; Maricopa; Pima; Pinal; Santa Cruz; Yavapai,projected 2D,,,East,North,X,Y,9001,,4269,10232,1995-06-02 00:00:00,,EPSG,,
+26950,NAD83 / Arizona West,,,,United States (USA) - Arizona - AZ_W - counties west of approx 113d 20m West - La Paz; Mohave; Yuma,projected 2D,,,East,North,X,Y,9001,,4269,10233,1995-06-02 00:00:00,,EPSG,,
+26951,NAD83 / Arkansas North,,,,United States (USA) - Arkansas - AR_N - counties north of approx 34d 50m North - Baxter; Benton; Boone; Carroll; Clay; Cleburne; Conway; Craighead; Crawford; Crittenden; Cross; Faulkner; Franklin; Fulton; Greene; Independence; Izard; Jackson; Johnson; Lawrence; Logan; Madison; Marion; Mississippi; Newton; Perry; Poinsett; Pope; Randolph; Scott; Searcy; Sebastian; Sharp; St. Francis; Stone; Van Buren; Washington; White; Woodruff; Yell,projected 2D,,,East,No [...]
+26952,NAD83 / Arkansas South,,,,United States (USA) - Arkansas - AR_S - counties south of approx 34d 50m North - Arkansas; Ashley; Bradley; Calhoun; Chicot; Clark; Cleveland; Columbia; Dallas; Desha; Drew; Garland; Grant; Hempstead; Hot Spring; Howard; Jefferson; Lafayette; Lee; Lincoln; Little River; Lonoke; Miller; Monroe; Montgomery; Nevada; Ouachita; Phillips; Pike; Polk; Prairie; Pulaski; Saline; Sevier; Union,projected 2D,,,East,North,X,Y,9001,,4269,10332,1995-06-02 00:00:00,,EPSG,,
+26953,NAD83 / Colorado North,,,,United States (USA) - Colorado - CO_N - counties north of approx 39d 50m North - Adams; Boulder; Gilpin; Grand; Jackson; Larimer; Logan; Moffat; Morgan; Phillips; Rio Blanco; Routt; Sedgwick; Washington; Weld; Yuma,projected 2D,,,East,North,X,Y,9001,,4269,10531,1995-06-02 00:00:00,,EPSG,,
+26954,NAD83 / Colorado Central,,,,United States (USA) - Colorado - CO_C - counties between approx 39d 50m & 38d 30m North - Arapahoe; Chaffee; Cheyenne; Clear Creek; Delta; Denver; Douglas; Eagle; El Paso; Elbert; Fremont; Garfield; Gunnison; Jefferson; Kit Carson; Lake; Lincoln; Mesa; Park; Pitkin; Summit; Teller,projected 2D,,,East,North,X,Y,9001,,4269,10532,1995-06-02 00:00:00,,EPSG,,
+26955,NAD83 / Colorado South,,,,United States (USA) - Colorado - CO_S - counties south of approx 38d 30m North - Alamosa; Archuleta; Baca; Bent; Conejos; Costilla; Crowley; Custer; Dolores; Hinsdale; Huerfano; Kiowa; La Plata; Las Animas; Mineral; Montezuma; Montrose; Otero; Ouray; Prowers; Pueblo; Rio Grande; Saguache; San Juan; San Miguel,projected 2D,,,East,North,X,Y,9001,,4269,10533,1995-06-02 00:00:00,,EPSG,,
+26956,NAD83 / Connecticut,,,,United States (USA) - Connecticut - CT - counties of Fairfield; Hartford; Litchfield; Middlesex; New Haven; New London; Tolland; Windham,projected 2D,,,East,North,X,Y,9001,,4269,10630,1995-06-02 00:00:00,,EPSG,,
+26957,NAD83 / Delaware,,,,United States (USA) - Delaware - DE - counties of Kent; New Castle; Sussex,projected 2D,,,East,North,X,Y,9001,,4269,10730,1995-06-02 00:00:00,,EPSG,,
+26958,NAD83 / Florida  East,,,,United States (USA) - Florida - FL_E - counties of Brevard; Broward; Clay; Collier; Dade; Duval; Flagler; Glades; Hendry; Highlands; Indian River; Lake; Martin; Monroe; Nassau; Okeechobee; Orange; Osceola; Palm Beach; Putnam; Seminole; St. Johns; St. Lucie; Volusia,projected 2D,,,East,North,X,Y,9001,,4269,10931,1995-06-02 00:00:00,,EPSG,,
+26959,NAD83 / Florida  West,,,,United States (USA) - Florida - FL_W - counties of Charlotte; Citrus; De Soto; Hardee; Hernando; Hillsborough; Lee; Levy; Manatee; Marion; Pasco; Pinellas; Polk; Sarasota; Sumter,projected 2D,,,East,North,X,Y,9001,,4269,10932,1995-06-02 00:00:00,,EPSG,,
+26960,NAD83 / Florida North,,,,United States (USA) - Florida - FL_N - counties of Alachua; Baker; Bay; Bradford; Calhoun; Columbia; Dixie; Escambia; Escambia; Franklin; Gadsden; Gilchrist; Gulf; Hamilton; Holmes; Jackson; Jefferson; Lafayette; Leon; Liberty; Madison; Okaloosa; Santa Rosa; Suwannee; Taylor; Union; Wakulla; Walton; Washington,projected 2D,,,East,North,X,Y,9001,,4269,10933,1995-06-02 00:00:00,,EPSG,,
+26961,NAD83 / Hawaii  zone 1,,,,United States - Hawaii - island of Hawaii.,projected 2D,,,East,North,X,Y,9001,,4269,15131,1995-06-02 00:00:00,,EPSG,,
+26962,NAD83 / Hawaii  zone 2,,,,United States - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,projected 2D,,,East,North,X,Y,9001,,4269,15132,1995-06-02 00:00:00,,EPSG,,
+26963,NAD83 / Hawaii  zone 3,,,,United States - Hawaii - Oahu.,projected 2D,,,East,North,X,Y,9001,,4269,15133,1995-06-02 00:00:00,,EPSG,,
+26964,NAD83 / Hawaii  zone 4,,,,United States - Hawaii - Kauai.,projected 2D,,,East,North,X,Y,9001,,4269,15134,1995-06-02 00:00:00,,EPSG,,
+26965,NAD83 / Hawaii  zone 5,,,,United States - Hawaii - Niihau.,projected 2D,,,East,North,X,Y,9001,,4269,15135,1995-06-02 00:00:00,,EPSG,,
+26966,NAD83 / Georgia  East,,,,United States (USA) - Georgia - GA_E - counties of Appling; Atkinson; Bacon; Baldwin; Brantley; Bryan; Bulloch; Burke; Camden; Candler; Charlton; Chatham; Clinch; Coffee; Columbia; Dodge; Echols; Effingham; Elbert; Emanuel; Evans; Franklin; Glascock; Glynn; Greene; Hancock; Hart; Jeff Davis; Jefferson; Jenkins; Johnson; Lanier; Laurens; Liberty; Lincoln; Long; Madison; McDuffie; McIntosh; Montgomery; Oglethorpe; Pierce; Richmond; Screven; Stephens; Taliafer [...]
+26967,NAD83 / Georgia West,,,,United States (USA) - Georgia - GA_W - counties of Baker; Banks; Barrow; Bartow; Ben Hill; Berrien; Bibb; Bleckley; Brooks; Butts; Calhoun; Carroll; Catoosa; Chattahoochee; Chattooga; Cherokee; Clarke; Clay; Clayton; Cobb; Colquitt; Cook; Coweta; Crawford; Crisp; Dade; Dawson; De Kalb; Decatur; Dooly; Dougherty; Douglas; Early; Fannin; Fayette; Floyd; Forsyth; Fulton; Gilmer; Gordon; Grady; Gwinnett; Habersham; Hall; Haralson; Harris; Heard; Henry; Houston;  [...]
+26968,NAD83 / Idaho  East,,,,United States (USA) - Idaho - ID_E - counties of Bannock; Bear Lake; Bingham; Bonneville; Caribou; Clark; Franklin; Fremont; Jefferson; Madison; Oneida; Power; Teton,projected 2D,,,East,North,X,Y,9001,,4269,11131,1995-06-02 00:00:00,,EPSG,,
+26969,NAD83 / Idaho  Central,,,,United States (USA) - Idaho - ID_C - counties of Blaine; Butte; Camas; Cassia; Custer; Gooding; Jerome; Lemhi; Lincoln; Minidoka; Twin Falls,projected 2D,,,East,North,X,Y,9001,,4269,11132,1995-06-02 00:00:00,,EPSG,,
+26970,NAD83 / Idaho  West,,,,United States (USA) - Idaho - ID_W - counties of Ada; Adams; Benewah; Boise; Bonner; Boundary; Canyon; Clearwater; Elmore; Gem; Idaho; Kootenai; Latah; Lewis; Nez Perce; Owyhee; Payette; Shoshone; Valley; Washington,projected 2D,,,East,North,X,Y,9001,,4269,11133,1995-06-02 00:00:00,,EPSG,,
+26971,NAD83 / Illinois  East,,,,United States (USA) - Illinois - IL_E - counties of Boone; Champaign; Clark; Clay; Coles; Cook; Crawford; Cumberland; De Kalb; De Witt; Douglas; Du Page; Edgar; Edwards; Effingham; Fayette; Ford; Franklin; Gallatin; Grundy; Hamilton; Hardin; Iroquois; Jasper; Jefferson; Johnson; Kane; Kankakee; Kendall; La Salle; Lake; Lawrence; Livingston; Macon; Marion; Massac; McHenry; McLean; Moultrie; Piatt; Pope; Richland; Saline; Shelby; Vermilion; Wabash; Wayne; Wh [...]
+26972,NAD83 / Illinois  West,,,,United States (USA) - Illinois - IL_W - counties of Adams; Alexander; Bond; Brown; Bureau; Calhoun; Carroll; Cass; Christian; Clinton; Fulton; Greene; Hancock; Henderson; Henry; Jackson; Jersey; Jo Daviess; Knox; Lee; Logan; Macoupin; Madison; Marshall; Mason; McDonough; Menard; Mercer; Monroe; Montgomery; Morgan; Ogle; Peoria; Perry; Pike; Pulaski; Putnam; Randolph; Rock Island; Sangamon; Schuyler; Scott; St. Clair; Stark; Stephenson; Tazewell; Union; War [...]
+26973,NAD83 / Indiana  East,,,,United States (USA) - Indiana - IN_E - counties of Adams; Allen; Bartholomew; Blackford; Brown; Cass; Clark; De Kalb; Dearborn; Decatur; Delaware; Elkhart; Fayette; Floyd; Franklin; Fulton; Grant; Hamilton; Hancock; Harrison; Henry; Howard; Huntington; Jackson; Jay; Jefferson; Jennings; Johnson; Kosciusko; Lagrange; Madison; Marion; Marshall; Miami; Noble; Ohio; Randolph; Ripley; Rush; Scott; Shelby; St. Joseph; Steuben; Switzerland; Tipton; Union; Wabash;  [...]
+26974,NAD83 / Indiana  West,,,,United States (USA) - Indiana - IN_W - counties of Benton; Boone; Carroll; Clay; Clinton; Crawford; Daviess; Dubois; Fountain; Gibson; Greene; Hendricks; Jasper; Knox; La Porte; Lake; Lawrence; Martin; Monroe; Montgomery; Morgan; Newton; Orange; Owen; Parke; Perry; Pike; Porter; Posey; Pulaski; Putnam; Spencer; Starke; Sullivan; Tippecanoe; Vanderburgh; Vermillion; Vigo; Warren; Warrick; White,projected 2D,,,East,North,X,Y,9001,,4269,11332,1995-06-02 00:00: [...]
+26975,NAD83 / Iowa North,,,,United States (USA) - Iowa - IA_N - counties of Allamakee; Benton; Black Hawk; Boone; Bremer; Buchanan; Buena Vista; Butler; Calhoun; Carroll; Cerro Gordo; Cherokee; Chickasaw; Clay; Clayton; Crawford; Delaware; Dickinson; Dubuque; Emmet; Fayette; Floyd; Franklin; Greene; Grundy; Hamilton; Hancock; Hardin; Howard; Humboldt; Ida; Jackson; Jones; Kossuth; Linn; Lyon; Marshall; Mitchell; Monona; O'Brien; Osceola; Palo Alto; Plymouth; Pocahontas; Sac; Sioux; Story [...]
+26976,NAD83 / Iowa South,,,,United States (USA) - Iowa - IA_S - counties of Adair; Adams; Appanoose; Audubon; Cass; Cedar; Clarke; Clinton; Dallas; Davis; Decatur; Des Moines; Fremont; Guthrie; Harrison; Henry; Iowa; Jasper; Jefferson; Johnson; Keokuk; Lee; Louisa; Lucas; Madison; Mahaska; Marion; Mills; Monroe; Montgomery; Muscatine; Page; Polk; Pottawattamie; Poweshiek; Ringgold; Scott; Shelby; Taylor; Union; Van Buren; Wapello; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9 [...]
+26977,NAD83 / Kansas North,,,,United States (USA) - Kansas - KS_N - counties of Atchison; Brown; Cheyenne; Clay; Cloud; Decatur; Dickinson; Doniphan; Douglas; Ellis; Ellsworth; Geary; Gove; Graham; Jackson; Jefferson; Jewell; Johnson; Leavenworth; Lincoln; Logan; Marshall; Mitchell; Morris; Nemaha; Norton; Osborne; Ottawa; Phillips; Pottawatomie; Rawlins; Republic; Riley; Rooks; Russell; Saline; Shawnee; Sheridan; Sherman; Smith; Thomas; Trego; Wabaunsee; Wallace; Washington; Wyandotte,p [...]
+26978,NAD83 / Kansas South,,,,United States (USA) - Kansas - KS_S - counties of Allen; Anderson; Barber; Barton; Bourbon; Butler; Chase; Chautauqua; Cherokee; Clark; Coffey; Comanche; Cowley; Crawford; Edwards; Elk; Finney; Ford; Franklin; Grant; Gray; Greeley; Greenwood; Hamilton; Harper; Harvey; Haskell; Hodgeman; Kearny; Kingman; Kiowa; Labette; Lane; Linn; Lyon; Marion; McPherson; Meade; Miami; Montgomery; Morton; Neosho; Ness; Osage; Pawnee; Pratt; Reno; Rice; Rush; Scott; Sedgwick; [...]
+26979,NAD83 / Kentucky North,,,,United States (USA) - Kentucky - KY_N - counties of Anderson; Bath; Boone; Bourbon; Boyd; Bracken; Bullitt; Campbell; Carroll; Carter; Clark; Elliott; Fayette; Fleming; Franklin; Gallatin; Grant; Greenup; Harrison; Henry; Jefferson; Jessamine; Kenton; Lawrence; Lewis; Mason; Menifee; Montgomery; Morgan; Nicholas; Oldham; Owen; Pendleton; Robertson; Rowan; Scott; Shelby; Spencer; Trimble; Woodford,projected 2D,,,East,North,X,Y,9001,,4269,11631,1995-06-02 00 [...]
+26980,NAD83 / Kentucky South,,,,United States (USA) - Kentucky - KY_S - counties of Adair; Allen; Ballard; Barren; Bell; Boyle; Breathitt; Breckinridge; Butler; Caldwell; Calloway; Carlisle; Casey; Christian; Clay; Clinton; Crittenden; Cumberland; Daviess; Edmonson; Estill; Floyd; Fulton; Garrard; Graves; Grayson; Green; Hancock; Hardin; Harlan; Hart; Henderson; Hickman; Hopkins; Jackson; Johnson; Knott; Knox; Larue; Laurel; Lee; Leslie; Letcher; Lincoln; Livingston; Logan; Lyon; Madison [...]
+26981,NAD83 / Louisiana North,,,,United States (USA) - Louisiana - LA_N - counties of Avoyelles; Bienville; Bossier; Caddo; Caldwell; Catahoula; Claiborne; Concordia; De Soto; East Carroll; Franklin; Grant; Jackson; La Salle; Lincoln; Madison; Morehouse; Natchitoches; Ouachita; Rapides; Red River; Richland; Sabine; Tensas; Union; Vernon; Webster; West Carroll; Winn,projected 2D,,,East,North,X,Y,9001,,4269,11731,1995-06-02 00:00:00,,EPSG,,
+26982,NAD83 / Louisiana South,,,,United States (USA) - Louisiana - LA_S - counties of Acadia; Allen; Ascension; Assumption; Beauregard; Calcasieu; Cameron; East Baton Rouge; East Feliciana; Evangeline; Iberia; Iberville; Jefferson; Jefferson Davis; Lafayette; LaFourche; Livingston; Orleans; Plaquemines; Pointe Coupee; St. Bernard; St. Charles; St. Helena; St. James; St. John the Baptist; St. Landry; St. Martin; St. Mary; St. Tammany; Tangipahoa; Terrebonne; Vermilion; Washington; West Ba [...]
+26983,NAD83 / Maine  East,,,,United States (USA) - Maine - ME_E - counties of Aroostook; Hancock; Knox; Penobscot; Piscataquis; Waldo; Washington,projected 2D,,,East,North,X,Y,9001,,4269,11831,1995-06-02 00:00:00,,EPSG,,
+26984,NAD83 / Maine  West,,,,United States (USA) - Maine - ME_W - counties of Androscoggin; Cumberland; Franklin; Kennebec; Lincoln; Oxford; Sagadahoc; Somerset; York,projected 2D,,,East,North,X,Y,9001,,4269,11832,1995-06-02 00:00:00,,EPSG,,
+26985,NAD83 / Maryland,,,,United States (USA) - Maryland -MD - counties of Allegany; Anne Arundel; Baltimore; Calvert; Caroline; Carroll; Cecil; Charles; Dorchester; Frederick; Garrett; Harford; Howard; Kent; Montgomery; Prince Georges; Queen Annes; Somerset; St. Marys; Talbot; Washington; Wicomico; Worcester,projected 2D,,,East,North,X,Y,9001,,4269,11930,1995-06-02 00:00:00,,EPSG,,
+26986,NAD83 / Massachusetts Mainland,NAD83 / Massachusetts,,,United States (USA) - Massachusetts - MA_M - counties of Barnstable; Berkshire; Bristol; Essex; Franklin; Hampden; Hampshire; Middlesex; Norfolk; Plymouth; Suffolk; Worcester,projected 2D,,,East,North,X,Y,9001,,4269,12031,1995-06-02 00:00:00,,EPSG,,
+26987,NAD83 / Massachusetts Island,NAD83 / Massachusetts Is,,,United States (USA) - Massachusetts - MA_I - counties of Dukes; Nantucket,projected 2D,,,East,North,X,Y,9001,,4269,12032,1995-06-02 00:00:00,,EPSG,,
+26988,NAD83 / Michigan North,,,,United States (USA) - Michigan - MI_N - counties of Alger; Baraga; Chippewa; Delta; Dickinson; Gogebic; Houghton; Iron; Keweenaw; Luce; Mackinac; Marquette; Menominee; Ontonagon; Schoolcraft,projected 2D,,,East,North,X,Y,9001,,4269,12141,1995-06-02 00:00:00,,EPSG,,
+26989,NAD83 / Michigan Central,,,,United States (USA) - Michigan - MI_C - counties of Alcona; Alpena; Antrim; Arenac; Benzie; Charlevoix; Cheboygan; Clare; Crawford; Emmet; Gladwin; Grand Traverse; Iosco; Kalkaska; Lake; Leelanau; Manistee; Mason; Missaukee; Montmorency; Ogemaw; Osceola; Oscoda; Otsego; Presque Isle; Roscommon; Wexford,projected 2D,,,East,North,X,Y,9001,,4269,12142,1995-06-02 00:00:00,,EPSG,,
+26990,NAD83 / Michigan South,,,,United States (USA) - Michigan - MI_S - counties of Allegan; Barry; Bay; Berrien; Branch; Calhoun; Cass; Clinton; Eaton; Genesee; Gratiot; Hillsdale; Huron; Ingham; Ionia; Isabella; Jackson; Kalamazoo; Kent; Lapeer; Lenawee; Livingston; Macomb; Mecosta; Midland; Monroe; Montcalm; Muskegon; Newaygo; Oakland; Oceana; Ottawa; Saginaw; Sanilac; Shiawassee; St. Clair; St. Joseph; Tuscola; Van Buren; Washtenaw; Wayne,projected 2D,,,East,North,X,Y,9001,,4269,1214 [...]
+26991,NAD83 / Minnesota North,,,,United States (USA) - Minnesota - MN_N - counties of Beltrami; Clearwater; Cook; Itasca; Kittson; Koochiching; Lake; Lake of the Woods; Mahnomen; Marshall; Norman; Pennington; Polk; Red Lake; Roseau; St. Louis,projected 2D,,,East,North,X,Y,9001,,4269,12231,1995-06-02 00:00:00,,EPSG,,
+26992,NAD83 / Minnesota Central,NAD83 / Minnesota Cent.,,,United States (USA) - Minnesota - MN_C - counties of Aitkin; Becker; Benton; Carlton; Cass; Chisago; Clay; Crow Wing; Douglas; Grant; Hubbard; Isanti; Kanabec; Mille Lacs; Morrison; Otter Tail; Pine; Pope; Stearns; Stevens; Todd; Traverse; Wadena; Wilkin,projected 2D,,,East,North,X,Y,9001,,4269,12232,1995-06-02 00:00:00,,EPSG,,
+26993,NAD83 / Minnesota South,,,,United States (USA) - Minnesota - MN_S - counties of Anoka; Big Stone; Blue Earth; Brown; Carver; Chippewa; Cottonwood; Dakota; Dodge; Faribault; Fillmore; Freeborn; Goodhue; Hennepin; Houston; Jackson; Kandiyohi; Lac Qui Parle; Le Sueur; Lincoln; Lyon; Martin; McLeod; Meeker; Mower; Murray; Nicollet; Nobles; Olmsted; Pipestone; Ramsey; Redwood; Renville; Rice; Rock; Scott; Sherburne; Sibley; Steele; Swift; Wabasha; Waseca; Washington; Watonwan; Winona; W [...]
+26994,NAD83 / Mississippi East,,,,United States (USA) - Mississippi - MS_E - counties of Alcorn; Attala; Benton; Calhoun; Chickasaw; Choctaw; Clarke; Clay; Covington; Forrest; George; Greene; Hancock; Harrison; Itawamba; Jackson; Jasper; Jones; Kemper; Lafayette; Lamar; Lauderdale; Leake; Lee; Lowndes; Marshall; Monroe; Neshoba; Newton; Noxubee; Oktibbeha; Pearl River; Perry; Pontotoc; Prentiss; Scott; Smith; Stone; Tippah; Tishomingo; Union; Wayne; Webster; Winston,projected 2D,,,East,N [...]
+26995,NAD83 / Mississippi West,,,,United States (USA) - Mississippi - MS_W - counties of Adams; Amite; Bolivar; Carroll; Claiborne; Coahoma; Copiah; De Soto; Franklin; Grenada; Hinds; Holmes; Humphreys; Issaquena; Jefferson; Jefferson Davis; Lawrence; Leflore; Lincoln; Madison; Marion; Montgomery; Panola; Pike; Quitman; Rankin; Sharkey; Simpson; Sunflower; Tallahatchie; Tate; Tunica; Walthall; Warren; Washington; Wilkinson; Yalobusha; Yazoo,projected 2D,,,East,North,X,Y,9001,,4269,12332, [...]
+26996,NAD83 / Missouri  East,,,,United States (USA) - Missouri - MO_E - counties of Bollinger; Butler; Cape Girardeau; Carter; Clark; Crawford; Dent; Dunklin; Franklin; Gasconade; Iron; Jefferson; Lewis; Lincoln; Madison; Marion; Mississippi; Montgomery; New Madrid; Oregon; Pemiscot; Perry; Pike; Ralls; Reynolds; Ripley; Scott; Shannon; St. Charles; St. Francois; St. Louis; Ste. Genevieve; Stoddard; Warren; Washington; Wayne,projected 2D,,,East,North,X,Y,9001,,4269,12431,1995-06-02 00:00 [...]
+26997,NAD83 / Missouri Central,,,,United States (USA) - Missouri - MO_C - counties of Adair; Audrain; Benton; Boone; Callaway; Camden; Carroll; Chariton; Christian; Cole; Cooper; Dallas; Douglas; Greene; Grundy; Hickory; Howard; Howell; Knox; Laclede; Linn; Livingston; Macon; Maries; Mercer; Miller; Moniteau; Monroe; Morgan; Osage; Ozark; Pettis; Phelps; Polk; Pulaski; Putnam; Randolph; Saline; Schuyler; Scotland; Shelby; Stone; Sullivan; Taney; Texas; Webster; Wright,projected 2D,,,East [...]
+26998,NAD83 / Missouri  West,,,,United States (USA) - Missouri - MO_W - counties of Andrew; Atchison; Barry; Barton; Bates; Buchanan; Caldwell; Cass; Cedar; Clay; Clinton; Dade; Daviess; De Kalb; Gentry; Harrison; Henry; Holt; Jackson; Jasper; Johnson; Lafayette; Lawrence; McDonald; Newton; Nodaway; Platte; Ray; St. Clair; Vernon; Worth,projected 2D,,,East,North,X,Y,9001,,4269,12433,1995-06-02 00:00:00,,EPSG,,
+27038,Nahrwan 1967 / UTM zone 38N,Nahrwan 1967 / UTM 38N,,,Kuwait west of 48 deg East.,projected 2D,,,East,North,E,N,9001,,4270,16038,1996-04-12 00:00:00,,EPSG,,
+27039,Nahrwan 1967 / UTM zone 39N,Nahrwan 1967 / UTM 39N,,,Kuwait east of 48 deg East.  United Arab Emirates (UAE) - Abu Dhabi - west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4270,16039,1996-04-12 00:00:00,,EPSG,,96.12
+27040,Nahrwan 1967 / UTM zone 40N,Nahrwan 1967 / UTM 40N,,,United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai; Sharjah; Ajman; Fujairah; Ras Al Kaimah; Umm Al Qaiwain.,projected 2D,,,East,North,E,N,9001,,4270,16040,1995-06-02 00:00:00,,EPSG,,
+27120,Naparima 1972 / UTM zone 20N,Naparima / UTM 20N,,,Trinidad and Tobago.,projected 2D,,,East,North,E,N,9001,,4271,16020,1995-06-02 00:00:00,,EPSG,,
+27200,GD49 / New Zealand Map Grid,GD49 / NZ Map Grid,,,New Zealand.,projected 2D,,,East,North,E,N,9001,,4272,19917,1995-06-02 00:00:00,,EPSG,Supersedes 27291 (GD49 / North Island Grid) and 27292 (GD49 / South Island Grid).,
+27291,GD49 / North Island Grid,,,,New Zealand - North Island.,projected 2D,,,East,North,E,N,9040,,4272,18141,1999-10-20 00:00:00,,EPSG,Sears 1922 British foot-metre conversion factor applied to ellipsoid.  Superseded by 27200 (GD49 / New Zealand Map Grid).,97.231
+27292,GD49 / South Island Grid,,,,New Zealand - South Island.,projected 2D,,,East,North,E,N,9040,,4272,18142,1999-10-20 00:00:00,,EPSG,Sears 1922 British foot-metre conversion factor applied to ellipsoid.  Superseded by 27200 (GD49 / New Zealand Map Grid).,97.231
+27391,NGO 1948 (Oslo) / NGO zone I,NGO 1948 / I,,,Norway - west of 3deg 30min W of Oslo (7deg 13min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18221,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N.,
+27392,NGO 1948 (Oslo) / NGO zone II,NGO 1948 / II,,,Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 20.5sec E  and 9deg 33min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18222,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N.,
+27393,NGO 1948 (Oslo) / NGO zone III,NGO 1948 / III,,,Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 20.5sec E and 11deg 58min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18223,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N.,
+27394,NGO 1948 (Oslo) / NGO zone IV,NGO 1948 / IV,,,Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 20.5sec E and 15deg 03min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18224,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 32N and ETRF89 / UTM zone 33N.,
+27395,NGO 1948 (Oslo) / NGO zone V,NGO 1948 / V,,,Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 20.5sec E and 18deg 53min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18225,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 33N and ETRF89 / UTM zone 34N.,
+27396,NGO 1948 (Oslo) / NGO zone VI,NGO 1948 / VI,,,Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 20.5sec E and 22deg 53min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18226,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 34N.,
+27397,NGO 1948 (Oslo) / NGO zone VII,NGO 1948 / VII,,,Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 20.5sec E and 26deg 58min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18227,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 34N and ETRF89 / UTM zone 35N.,
+27398,NGO 1948 (Oslo) / NGO zone VIII,NGO 1948 / VIII,,,Norway - east of 16deg 15min E of Oslo (26deg 58min 20.5sec E of Greenwich).,projected 2D,,,North,East,x,y,9001,,4817,18228,1999-10-20 00:00:00,,EPSG,Used for large (>1:50000) scale mapping and cadastral work.  To be phased out and replaced by ETRF89 / UTM zone 35N.,
+27429,Datum 73 / UTM zone 29N,,,,Portugal - onshore.,projected 2D,,,East,North,E,N,9001,,4274,16029,1995-06-02 00:00:00,,EPSG,,
+27500,ATF (Paris) / Nord de Guerre,ATF / Nord de Guerre,,,France - Alsace.,projected 2D,,,East,North,X,Y,9001,,4901,19903,1995-06-02 00:00:00,,EPSG,,
+27581,NTF (Paris) / France I,NTF / France I,,,France north of 53.5 grads (48 deg 09 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18081,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Nord France (code 27591).,95.26
+27582,NTF (Paris) / France II,NTF / France II,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North. Also used over all mainlanf France.,projected 2D,,,East,North,X,Y,9001,,4807,18082,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Centre France (code 27592).,95.26
+27583,NTF (Paris) / France III,NTF / France III,,,France south of 50.5 grads (45 deg 27 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18083,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Sud France (code 27593).,95.26
+27584,NTF (Paris) / France IV,NTF / France IV,,,France - Corsica,projected 2D,,,East,North,X,Y,9001,,4807,18084,1996-04-12 00:00:00,,EPSG,Introduced 1972. Supersedes NTF / Corse (code 27594).,
+27591,NTF (Paris) / Nord France,NTF / Nord France,,,France north of 53.5 grads (48 deg 09 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18091,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France I (code 27581) from 1972.,95.26
+27592,NTF (Paris) / Centre France,NTF / Centre France,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18092,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France II (code 27582) from 1972.,95.26
+27593,NTF (Paris) / Sud France,NTF / Sud France,,,France south of 50.5 grads (45 deg 27 min) North.,projected 2D,,,East,North,X,Y,9001,,4807,18093,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France III (code 27583) from 1972.,95.26
+27594,NTF (Paris) / Corse,NTF / Corse,,,France - Corsica,projected 2D,,,East,North,X,Y,9001,,4807,18094,1996-04-12 00:00:00,,EPSG,Superseded by NTF / France IV (code 27584) from 1972.,
+27700,OSGB 1936 / British National Grid,British National Grid,,,United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.,projected 2D,,,East,North,E,N,9001,,4277,19916,1995-06-02 00:00:00,,EPSG,,
+28191,Palestine 1923 / Palestine Grid,Palestine Grid,,,Israel; Jordan,projected 2D,,,East,North,E,N,9001,,4281,18201,1999-04-22 00:00:00,,EPSG,,
+28192,Palestine 1923 / Palestine Belt,Palestine Belt,,,Israel; Jordan,projected 2D,,,East,North,E,N,9001,,4281,18202,1999-04-22 00:00:00,,EPSG,,
+28193,Palestine 1923 / Israeli CS Grid,Israeli CS Grid,,,Israel.,projected 2D,,,East,North,E,N,9001,,4281,18203,1999-10-20 00:00:00,Survey of Israel.,EPSG,Superceded by Israeli TM Grid (EPSG code 239).,
+28232,Pointe Noire / UTM zone 32S,Point Noire / UTM 32S,,,Congo.,projected 2D,,,East,North,E,N,9001,,4282,16132,1995-06-02 00:00:00,,EPSG,,
+28348,GDA94 / MGA zone 48,,,,Australia - 102deg East  to 108deg East.,projected 2D,,,East,North,E,N,9001,,4283,17348,1995-06-02 00:00:00,,EPSG,,
+28349,GDA94 / MGA zone 49,,,,Australia - 108deg East  to 114deg East.,projected 2D,,,East,North,E,N,9001,,4283,17349,1995-06-02 00:00:00,,EPSG,,
+28350,GDA94 / MGA zone 50,,,,Australia - 114deg East  to 120deg East.,projected 2D,,,East,North,E,N,9001,,4283,17350,1995-06-02 00:00:00,,EPSG,,
+28351,GDA94 / MGA zone 51,,,,Australia - 120deg East  to 126deg East.,projected 2D,,,East,North,E,N,9001,,4283,17351,1995-06-02 00:00:00,,EPSG,,
+28352,GDA94 / MGA zone 52,,,,Australia - 126deg East  to 132deg East.,projected 2D,,,East,North,E,N,9001,,4283,17352,1995-06-02 00:00:00,,EPSG,,
+28353,GDA94 / MGA zone 53,,,,Australia - 132deg East  to 138deg East.,projected 2D,,,East,North,E,N,9001,,4283,17353,1995-06-02 00:00:00,,EPSG,,
+28354,GDA94 / MGA zone 54,,,,Australia - 138deg East  to 144deg East.,projected 2D,,,East,North,E,N,9001,,4283,17354,1995-06-02 00:00:00,,EPSG,,
+28355,GDA94 / MGA zone 55,,,,Australia - 144deg East  to 150deg East.,projected 2D,,,East,North,E,N,9001,,4283,17355,1995-06-02 00:00:00,,EPSG,,
+28356,GDA94 / MGA zone 56,,,,Australia - 150deg East  to 156deg East.,projected 2D,,,East,North,E,N,9001,,4283,17356,1995-06-02 00:00:00,,EPSG,,
+28357,GDA94 / MGA zone 57,,,,Australia - 156deg East  to 162deg East.,projected 2D,,,East,North,E,N,9001,,4283,17357,1995-06-02 00:00:00,,EPSG,,
+28358,GDA94 / MGA zone 58,,,,Australia - 162deg East  to 168deg East.,projected 2D,,,East,North,E,N,9001,,4283,17358,1995-06-02 00:00:00,,EPSG,,
+28402,Pulkovo 1942 / Gauss-Kruger zone 2,1942 Coord. Sys. zone 2,,,Czech Republic and Germany (former DDR) - west of 12 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16202,1998-06-30 00:00:00,,EPSG,,
+28403,Pulkovo 1942 / Gauss-Kruger zone 3,1942 Coord. Sys. zone 3,,,Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16203,1998-06-30 00:00:00,,EPSG,,
+28404,Pulkovo 1942 / Gauss-Kruger zone 4,1942 Coord. Sys. zone 4,,,Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16204,1995-06-02 00:00:00,,EPSG,,
+28405,Pulkovo 1942 / Gauss-Kruger zone 5,1942 Coord. Sys. zone 5,,,Belarus - west of 30 deg East;  Estonia; Latvia & Lithuania - east of 24 deg East;  Moldova;  Russia &  Ukraine - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16205,1995-06-02 00:00:00,,EPSG,,
+28406,Pulkovo 1942 / Gauss-Kruger zone 6,1942 Coord. Sys. zone 6,,,Belarus - east of 30 deg East;  Russia  &  Ukraine  - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16206,1995-06-02 00:00:00,,EPSG,,
+28407,Pulkovo 1942 / Gauss-Kruger zone 7,1942 Coord. Sys. zone 7,,,Georgia - west of 36 deg East;  Russia  - 36 deg to 42 deg East;  Ukraine - east of 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16207,1995-06-02 00:00:00,,EPSG,,
+28408,Pulkovo 1942 / Gauss-Kruger zone 8,1942 Coord. Sys. zone 8,,,Armenia  Azerbaijan - west of 48 deg East;  Georgia - east of 42 deg East;  Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16208,1995-06-02 00:00:00,,EPSG,,
+28409,Pulkovo 1942 / Gauss-Kruger zone 9,1942 Coord. Sys. zone 9,,,Azerbaijan - east of 48 deg East;  Kazakstan - west of 54 deg East;  Russia - 48 deg to 54 deg East;  Turkmenistan - west of 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16209,1995-06-02 00:00:00,,EPSG,,
+28410,Pulkovo 1942 / Gauss-Kruger zone 10,1942 Coord. Sys. zone 10,,,Kazakstan;  Russia;  Turkmenistan  - 54 deg  to 60 deg East; Uzbekistan - west of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16210,1995-06-02 00:00:00,,EPSG,,
+28411,Pulkovo 1942 / Gauss-Kruger zone 11,1942 Coord. Sys. zone 11,,,Kazakstan;  Russia;  Uzbekistan - 60 deg to 66 deg East;  Turkmenistan - east of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16211,1995-06-02 00:00:00,,EPSG,,
+28412,Pulkovo 1942 / Gauss-Kruger zone 12,1942 Coord. Sys. zone 12,,,Kazakstan &  Russia - 66 deg to 72 deg East;  Kirgistan & Tadzhikstan - west of 72 deg East;  Uzbekistan - east of 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16212,1995-06-02 00:00:00,,EPSG,,
+28413,Pulkovo 1942 / Gauss-Kruger zone 13,1942 Coord. Sys. zone 13,,,Kazakstan;  Kirgizstan;  Russia - 72 deg to 78 deg East;  Tadzhikstan - east of 72 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16213,1995-06-02 00:00:00,,EPSG,,
+28414,Pulkovo 1942 / Gauss-Kruger zone 14,1942 Coord. Sys. zone 14,,,Kazakstan &  Russia - 78 deg to 84 deg East; Kirgizstan - east of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16214,1995-06-02 00:00:00,,EPSG,,
+28415,Pulkovo 1942 / Gauss-Kruger zone 15,1942 Coord. Sys. zone 15,,,Kazakstan - east of 84 deg East;  Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16215,1995-06-02 00:00:00,,EPSG,,
+28416,Pulkovo 1942 / Gauss-Kruger zone 16,1942 Coord. Sys. zone 16,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16216,1995-06-02 00:00:00,,EPSG,,
+28417,Pulkovo 1942 / Gauss-Kruger zone 17,1942 Coord. Sys. zone 17,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16217,1995-06-02 00:00:00,,EPSG,,
+28418,Pulkovo 1942 / Gauss-Kruger zone 18,1942 Coord. Sys. zone 18,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16218,1995-06-02 00:00:00,,EPSG,,
+28419,Pulkovo 1942 / Gauss-Kruger zone 19,1942 Coord. Sys. zone 19,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16219,1995-06-02 00:00:00,,EPSG,,
+28420,Pulkovo 1942 / Gauss-Kruger zone 20,1942 Coord. Sys. zone 20,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16220,1995-06-02 00:00:00,,EPSG,,
+28421,Pulkovo 1942 / Gauss-Kruger zone 21,1942 Coord. Sys. zone 21,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16221,1995-06-02 00:00:00,,EPSG,,
+28422,Pulkovo 1942 / Gauss-Kruger zone 22,1942 Coord. Sys. zone 22,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16222,1995-06-02 00:00:00,,EPSG,,
+28423,Pulkovo 1942 / Gauss-Kruger zone 23,1942 Coord. Sys. zone 23,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16223,1995-06-02 00:00:00,,EPSG,,
+28424,Pulkovo 1942 / Gauss-Kruger zone 24,1942 Coord. Sys. zone 24,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16224,1995-06-02 00:00:00,,EPSG,,
+28425,Pulkovo 1942 / Gauss-Kruger zone 25,1942 Coord. Sys. zone 25,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16225,1995-06-02 00:00:00,,EPSG,,
+28426,Pulkovo 1942 / Gauss-Kruger zone 26,1942 Coord. Sys. zone 26,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16226,1995-06-02 00:00:00,,EPSG,,
+28427,Pulkovo 1942 / Gauss-Kruger zone 27,1942 Coord. Sys. zone 27,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16227,1995-06-02 00:00:00,,EPSG,,
+28428,Pulkovo 1942 / Gauss-Kruger zone 28,1942 Coord. Sys. zone 28,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16228,1995-06-02 00:00:00,,EPSG,,
+28429,Pulkovo 1942 / Gauss-Kruger zone 29,1942 Coord. Sys. zone 29,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16229,1995-06-02 00:00:00,,EPSG,,
+28430,Pulkovo 1942 / Gauss-Kruger zone 30,1942 Coord. Sys. zone 30,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4284,16230,1995-06-02 00:00:00,,EPSG,,
+28431,Pulkovo 1942 / Gauss-Kruger zone 31,1942 Coord. Sys. zone 31,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16231,1995-06-02 00:00:00,,EPSG,,
+28432,Pulkovo 1942 / Gauss-Kruger zone 32,1942 Coord. Sys. zone 32,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16232,1995-06-02 00:00:00,,EPSG,,
+28462,Pulkovo 1942 / Gauss-Kruger 2N,Pulkovo / Gauss 2N,,,Czech Republic and Germany (former DDR) - west of 12 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16302,1998-06-30 00:00:00,,EPSG,,
+28463,Pulkovo 1942 / Gauss-Kruger 3N,Pulkovo / Gauss 3N,,,Czech Republic and Germany ( former DDR) - east of 12 deg East; Poland and Slovakia - west of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16303,1998-06-30 00:00:00,,EPSG,,
+28464,Pulkovo 1942 / Gauss-Kruger 4N,Pulkovo / Gauss 4N,,,Estonia; Latvia; Lithuania; Russia; Ukraine; - west of 24 deg East; Poland - east of 24 deg East; Slovakia east of 18 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16304,1995-06-02 00:00:00,,EPSG,,
+28465,Pulkovo 1942 / Gauss-Kruger 5N,Pulkovo / Gauss 5N,,,Belarus - west of 30 deg East;  Estonia; Latvia & Lithuania - east of 24 deg East;  Moldova;  Russia &  Ukraine - 24 deg to 30 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16305,1995-06-02 00:00:00,,EPSG,,
+28466,Pulkovo 1942 / Gauss-Kruger 6N,Pulkovo / Gauss 6N,,,Belarus - east of 30 deg East;  Russia  &  Ukraine  - 30 deg to 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16306,1995-06-02 00:00:00,,EPSG,,
+28467,Pulkovo 1942 / Gauss-Kruger 7N,Pulkovo / Gauss 7N,,,Georgia - west of 36 deg East;  Russia  - 36 deg to 42 deg East;  Ukraine - east of 36 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16307,1995-06-02 00:00:00,,EPSG,,
+28468,Pulkovo 1942 / Gauss-Kruger 8N,Pulkovo / Gauss 8N,,,Armenia - west of 48 deg East;  Azerbaijan - west of 48 deg East;  Georgia - east of 42 deg East;  Russia - 42 deg to 48 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16308,1995-06-02 00:00:00,,EPSG,,
+28469,Pulkovo 1942 / Gauss-Kruger 9N,Pulkovo / Gauss 9N,,,Azerbaijan - east of 48 deg East;  Kazakstan - west of 54 deg East;  Russia - 48 deg to 54 deg East;  Turkmenistan - west of 54 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16309,1995-06-02 00:00:00,,EPSG,,
+28470,Pulkovo 1942 / Gauss-Kruger 10N,Pulkovo / Gauss 10N,,,Kazakstan;  Russia;  Turkmenistan  - 54 deg  to 60 deg East;  Uzbekistan - west of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16310,1995-06-02 00:00:00,,EPSG,,
+28471,Pulkovo 1942 / Gauss-Kruger 11N,Pulkovo / Gauss 11N,,,Kazakstan;  Russia;  Uzbekistan - 60 deg to 66 deg East;  Turkmenistan - east of 60 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16311,1995-06-02 00:00:00,,EPSG,,
+28472,Pulkovo 1942 / Gauss-Kruger 12N,Pulkovo / Gauss 12N,,,Kazakstan &  Russia - 66 deg to 72 deg East;  Kirgistan & Tadzhikstan - west of 72 deg East;  Uzbekistan - east of 66 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16312,1995-06-02 00:00:00,,EPSG,,
+28473,Pulkovo 1942 / Gauss-Kruger 13N,Pulkovo / Gauss 13N,,,Kazakstan;  Kirgizstan;  Russia - 72 deg to 78 deg East;  Tadzhikstan - east of 72 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16313,1995-06-02 00:00:00,,EPSG,,
+28474,Pulkovo 1942 / Gauss-Kruger 14N,Pulkovo / Gauss 14N,,,Kazakstan &  Russia - 78 deg to 84 deg East;  Kirgizstan - east of 78 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16314,1995-06-02 00:00:00,,EPSG,,
+28475,Pulkovo 1942 / Gauss-Kruger 15N,Pulkovo / Gauss 15N,,,Kazakstan - east of 84 deg East;  Russia - 84 deg to 90 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16315,1995-06-02 00:00:00,,EPSG,,
+28476,Pulkovo 1942 / Gauss-Kruger 16N,Pulkovo / Gauss 16N,,,Russia - 90 deg to 96 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16316,1995-06-02 00:00:00,,EPSG,,
+28477,Pulkovo 1942 / Gauss-Kruger 17N,Pulkovo / Gauss 17N,,,Russia - 96 deg to 102deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16317,1995-06-02 00:00:00,,EPSG,,
+28478,Pulkovo 1942 / Gauss-Kruger 18N,Pulkovo / Gauss 18N,,,Russia - 102 deg to 108 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16318,1995-06-02 00:00:00,,EPSG,,
+28479,Pulkovo 1942 / Gauss-Kruger 19N,Pulkovo / Gauss 19N,,,Russia - 108 deg to 114 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16319,1995-06-02 00:00:00,,EPSG,,
+28480,Pulkovo 1942 / Gauss-Kruger 20N,Pulkovo / Gauss 20N,,,Russia - 114 deg to 120 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16320,1995-06-02 00:00:00,,EPSG,,
+28481,Pulkovo 1942 / Gauss-Kruger 21N,Pulkovo / Gauss 21N,,,Russia - 120 deg to 126 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16321,1995-06-02 00:00:00,,EPSG,,
+28482,Pulkovo 1942 / Gauss-Kruger 22N,Pulkovo / Gauss 22N,,,Russia - 126 deg to 132 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16322,1995-06-02 00:00:00,,EPSG,,
+28483,Pulkovo 1942 / Gauss-Kruger 23N,Pulkovo / Gauss 23N,,,Russia - 132 deg to 138 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16323,1995-06-02 00:00:00,,EPSG,,
+28484,Pulkovo 1942 / Gauss-Kruger 24N,Pulkovo / Gauss 24N,,,Russia - 138 deg to 144 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16324,1995-06-02 00:00:00,,EPSG,,
+28485,Pulkovo 1942 / Gauss-Kruger 25N,Pulkovo / Gauss 25N,,,Russia - 144 deg to 150 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16325,1995-06-02 00:00:00,,EPSG,,
+28486,Pulkovo 1942 / Gauss-Kruger 26N,Pulkovo / Gauss 26N,,,Russia - 150 deg to 156 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16326,1995-06-02 00:00:00,,EPSG,,
+28487,Pulkovo 1942 / Gauss-Kruger 27N,Pulkovo / Gauss 27N,,,Russia - 156 deg to 162 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16327,1995-06-02 00:00:00,,EPSG,,
+28488,Pulkovo 1942 / Gauss-Kruger 28N,Pulkovo / Gauss 28N,,,Russia - 162 deg to 168 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16328,1995-06-02 00:00:00,,EPSG,,
+28489,Pulkovo 1942 / Gauss-Kruger 29N,Pulkovo / Gauss 29N,,,Russia - 168 deg to 174 deg East.,projected 2D,,,North,East,X,Y,9001,,4284,16329,1995-06-02 00:00:00,,EPSG,,
+28490,Pulkovo 1942 / Gauss-Kruger 30N,Pulkovo / Gauss 30N,,,Russia - 174 deg East to 180 deg.,projected 2D,,,North,East,X,Y,9001,,4284,16330,1995-06-02 00:00:00,,EPSG,,
+28491,Pulkovo 1942 / Gauss-Kruger 31N,Pulkovo / Gauss 31N,,,Russia - 180 deg to 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16331,1995-06-02 00:00:00,,EPSG,,
+28492,Pulkovo 1942 / Gauss-Kruger 32N,Pulkovo / Gauss 32N,,,Russia - east of 174 deg West.,projected 2D,,,North,East,X,Y,9001,,4284,16332,1995-06-02 00:00:00,,EPSG,,
+28600,Qatar / Qatar National Grid,Qatar National Grid,,,Qatar - onshore.,projected 2D,,,East,North,E,N,9001,,4286,19919,1995-06-02 00:00:00,,EPSG,,
+28991,RD / Netherlands Old,,,,Netherlands - onshore.,projected 2D,,,East,North,X,Y,9001,,4289,19913,1995-06-02 00:00:00,,EPSG,Superseded by 28992 (RD / Netherlands New).,
+28992,RD / Netherlands New,,,,Netherlands - onshore.,projected 2D,,,East,North,X,Y,9001,,4289,19914,1995-06-02 00:00:00,,EPSG,Supersedes 28991 (RD / Netherlands Old).,
+29100,SAD69 / Brazil Polyconic,,,,Brazil,projected 2D,,,East,North,X,Y,9001,,4291,19941,1999-04-22 00:00:00,PetroBras,EPSG,,
+29118,SAD69 / UTM zone 18N,,,,South America - 78deg West to 72deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16018,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.251.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29119,SAD69 / UTM zone 19N,,,,South America - 72deg West to 66deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16019,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29120,SAD69 / UTM zone 20N,,,,South America - 66deg West to 60deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16020,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29121,SAD69 / UTM zone 21N,,,,South America - 60deg West to 54deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16021,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29122,SAD69 / UTM zone 22N,,,,South America - 54deg West to 48deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16022,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29177,SAD69 / UTM zone 17S,,,,South America - 84deg West to 78deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16117,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29178,SAD69 / UTM zone 18S,,,,South America - Brazil - 78deg West to 72deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16118,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29179,SAD69 / UTM zone 19S,,,,South America - Brazil - 72deg West to 66deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16119,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29180,SAD69 / UTM zone 20S,,,,South America - Brazil - 66deg West to 60deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16120,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29181,SAD69 / UTM zone 21S,,,,South America - Brazil - 60deg West to 54deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16121,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29182,SAD69 / UTM zone 22S,,,,South America - Brazil - 54deg West to 48deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4291,16122,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29183,SAD69 / UTM zone 23S,,,,South America - 48deg West to 42deg West.,projected 2D,,,East,North,E,N,9001,,4291,16123,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29184,SAD69 / UTM zone 24S,,,,South America - Brazil - 42deg West to 36deg West.,projected 2D,,,East,North,E,N,9001,,4291,16124,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29185,SAD69 / UTM zone 25S,,,,South America - 36deg West to 30deg West.,projected 2D,,,East,North,E,N,9001,,4291,16125,1995-06-02 00:00:00,,EPSG,Uses GRS67 ellipsoid with 1/f to exactly 2 decimal places.  Precision of ellipsoid entry increased from 2 to 5 dp with change id 97.252.  Error introduced if not using the truncated precision will not exceed 5 cm.,97.252
+29220,Sapper Hill 1943 / UTM zone 20S,Sapper Hill / UTM 20S,,,Falkland Islands - west of 60 deg West.,projected 2D,,,East,North,E,N,9001,,4292,16120,1995-06-02 00:00:00,,EPSG,,
+29221,Sapper Hill 1943 / UTM zone 21S,Sapper Hill / UTM 21S,,,Falkland Islands - east of 60 deg West.,projected 2D,,,East,North,E,N,9001,,4292,16121,1995-06-02 00:00:00,,EPSG,,
+29333,Schwarzeck / UTM zone 33S,Schwarzeck / UTM 33S,,,Namibia - offshore.,projected 2D,,,East,North,E,N,9001,,4293,16133,1996-04-12 00:00:00,,EPSG,,
+29371,South West African Coord. System zone 11,SW African CS zone 11,,,Namibia - west of 12 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17611,1997-06-16 00:00:00,,EPSG,,97.16
+29373,South West African Coord. System zone 13,SW African CS zone 13,,,Namibia - 12 to 14 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17613,1997-06-16 00:00:00,,EPSG,,97.16
+29375,South West African Coord. System zone 15,SW African CS zone 15,,,Namibia - 14 to 16 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17615,1997-06-16 00:00:00,,EPSG,,97.16
+29377,South West African Coord. System zone 17,SW African CS zone 17,,,Namibia - 16 to 18 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17617,1997-06-16 00:00:00,,EPSG,,97.16
+29379,South West African Coord. System zone 19,SW African CS zone 19,,,Namibia - 18 to 20 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17619,1997-06-16 00:00:00,,EPSG,,97.16
+29381,South West African Coord. System zone 21,SW African CS zone 21,,,Namibia - 20 to 22 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17621,1997-06-16 00:00:00,,EPSG,,97.16
+29383,South West African Coord. System zone 23,SW African CS zone 23,,,Namibia - 22 to 24 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17623,1997-06-16 00:00:00,,EPSG,,97.16
+29385,South West African Coord. System zone 25,SW African CS zone 25,,,Namibia - east of 24 deg East.,projected 2D,,,West,South,W,S,9031,,4293,17625,1997-06-16 00:00:00,,EPSG,,97.16
+29635,Sudan / UTM zone 35N,,,,Sudan - south - west of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4296,16035,1995-06-02 00:00:00,,EPSG,,
+29636,Sudan / UTM zone 36N,,,,Sudan - south - east of 30 deg East.,projected 2D,,,East,North,E,N,9001,,4296,16036,1995-06-02 00:00:00,,EPSG,,
+29700,Tananarive (Paris) / Laborde Grid,Tananarive  / Laborde,,,Madagascar.,projected 2D,,,East,North,X,Y,9001,,4810,19911,1995-06-02 00:00:00,,EPSG,,
+29738,Tananarive / UTM zone 38S,Tananarive / UTM 38S,,,Madagascar - offshore west of 48 deg East.,projected 2D,,,East,North,E,N,9001,,4297,16138,1995-06-02 00:00:00,,EPSG,,
+29739,Tananarive / UTM zone 39S,Tananarive / UTM 39S,,,Madagascar - offshore east of 48 deg East.,projected 2D,,,East,North,E,N,9001,,4297,16139,1995-06-02 00:00:00,,EPSG,,
+29849,Timbalai 1948 / UTM zone 49N,Timbalai 1948 / UTM 49N,,,Brunei - offshore; Malaysia - East Malaysia (Sarawak).,projected 2D,,,East,North,E,N,9001,,4298,16049,1995-06-02 00:00:00,,EPSG,,
+29850,Timbalai 1948 / UTM zone 50N,Timbalai 1948 / UTM 50N,,,Brunei - offshore; Malaysia - East Malaysia (Sabah).,projected 2D,,,East,North,E,N,9001,,4298,16050,1995-06-02 00:00:00,,EPSG,,
+29871,Timbalai 1948 / R.S.O. Borneo (ch),Timbalai  / Borneo (ch),,,Malaysia - East Malaysia (Sabah; Sarawak).,projected 2D,,,East,North,E,N,9042,,4298,19912,1999-10-20 00:00:00,,EPSG,Adopts metric conversion of 39.370147 inches per metre.,97.231
+29872,Timbalai 1948 / R.S.O. Borneo (ft),Timbalai  / Borneo (ft),,,Brunei; Malaysia - East Malaysia (Sabah; Sarawak).,projected 2D,,,East,North,E,N,9041,,4298,19912,1999-10-20 00:00:00,,EPSG,Original projection definition in chains.  1 chain = 66 feet=792 inches.  Adopts metric conversion of 39.370147 inches per metre.,97.231
+29873,Timbalai 1948 / R.S.O. Borneo (m),Timbalai  / Borneo (m),,,Brunei.,projected 2D,,,East,North,E,N,9001,,4298,19912,1997-07-22 00:00:00,,EPSG,Original projection definition in chains.  1 chain = 66 feet=792 inches.  Adopts metric conversion of 39.370147 inches per metre.,
+29900,TM65 / Irish National Grid,TM65 / Irish Nat Grid,,,Ireland - onshore; United Kingdom (UK) - Northern Ireland (Ulster) onshore,projected 2D,,,East,North,E,N,9001,,4299,19908,1995-06-02 00:00:00,,EPSG,,
+30161,Tokyo / Japan Plane Rectangular CS I,Tokyo / Japan zone I,,,Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).,projected 2D,,,North,East,X,Y,9001,,4301,17801,1998-12-12 00:00:00,,EPSG,,
+30162,Tokyo / Japan Plane Rectangular CS II,Tokyo / Japan zone II,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17802,1998-12-12 00:00:00,,EPSG,,
+30163,Tokyo / Japan Plane Rectangular CS III,Tokyo / Japan zone III,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17803,1998-12-12 00:00:00,,EPSG,,
+30164,Tokyo / Japan Plane Rectangular CS IV,Tokyo / Japan zone IV,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17804,1998-12-12 00:00:00,,EPSG,,
+30165,Tokyo / Japan Plane Rectangular CS V,Tokyo / Japan zone V,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17805,1998-12-12 00:00:00,,EPSG,,
+30166,Tokyo / Japan Plane Rectangular CS VI,Tokyo / Japan zone VI,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17806,1998-12-12 00:00:00,,EPSG,,
+30167,Tokyo / Japan Plane Rectangular CS VII,Tokyo / Japan zone VII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17807,1998-12-12 00:00:00,,EPSG,,
+30168,Tokyo / Japan Plane Rectangular CS VIII,Tokyo / Japan zone VIII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17808,1998-12-12 00:00:00,,EPSG,,
+30169,Tokyo / Japan Plane Rectangular CS IX,Tokyo / Japan zone IX,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17809,1998-12-12 00:00:00,,EPSG,,
+30170,Tokyo / Japan Plane Rectangular CS X,Tokyo / Japan zone X,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,projected 2D,,,North,East,X,Y,9001,,4301,17810,1998-12-12 00:00:00,,EPSG,,
+30171,Tokyo / Japan Plane Rectangular CS XI,Tokyo / Japan zone XI,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,projected 2D,,,North,East,X,Y,9001,,4301,17811,1998-12-12 00:00:00,,EPSG,,
+30172,Tokyo / Japan Plane Rectangular CS XII,Tokyo / Japan zone XII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,projected 2D,,,North,East,X,Y,9001,,4301,17812,1998-12-12 00:00:00,,EPSG,,
+30173,Tokyo / Japan Plane Rectangular CS XIII,Tokyo / Japan zone XIII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,projected 2D,,,North,East,X,Y,9001,,4301,17813,1998-12-12 00:00:00,,EPSG,,
+30174,Tokyo / Japan Plane Rectangular CS XIV,Tokyo / Japan zone XIV,,,Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17814,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30175,Tokyo / Japan Plane Rectangular CS XV,Tokyo / Japan zone XV,,,Japan - Okinawa-ken between 126 deg &130 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17815,1998-12-12 00:00:00,,EPSG,,
+30176,Tokyo / Japan Plane Rectangular CS XVI,Tokyo / Japan zone XVI,,,Japan - Okinawa-ken west of 126 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17816,1998-12-12 00:00:00,,EPSG,,
+30177,Tokyo / Japan Plane Rectangular CS XVII,Tokyo / Japan zone XVII,,,Japan - Okinawa-ken east of 130 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17817,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30178,Tokyo / Japan Plane Rectangular CS XVIII,Tokyo / Japan zone XVIII,,,Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.,projected 2D,,,North,East,X,Y,9001,,4301,17818,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30179,Tokyo / Japan Plane Rectangular CS XIX,Tokyo / Japan zone XIX,,,Japan - Tokyo-to south of 28 N & east of 143 deg E.,projected 2D,,,North,East,X,Y,9001,,4301,17819,1998-12-12 00:00:00,,EPSG,Although legally defined as Tokyo datum the accuracy of the geodetic connection to mainland Japan is low.,
+30200,Trinidad 1903 / Trinidad Grid,Trinidad 1903 / Trinidad,,,Trinidad and Tobago - Trinidad,projected 2D,,,East,North,E,N,9039,,4302,19925,1999-10-20 00:00:00,,EPSG,,97.231
+30339,TC(1948) / UTM zone 39N,,,,United Arab Emirates (UAE) - Abu Dhabi west of 54 deg East.,projected 2D,,,East,North,E,N,9001,,4303,16039,1995-06-02 00:00:00,,EPSG,,
+30340,TC(1948) / UTM zone 40N,,,,United Arab Emirates (UAE) - Abu Dhabi east of 54 deg East; Dubai.,projected 2D,,,East,North,E,N,9001,,4303,16040,1995-06-02 00:00:00,,EPSG,,
+30491,Voirol 1875 / Nord Algerie (ancienne),Voirol /N Algerie ancien,,,Algeria - north of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4304,18011,1995-06-02 00:00:00,,EPSG,Superseded by 30591 (Voirol Unifie / Algeria Nord).,
+30492,Voirol 1875 / Sud Algerie (ancienne),Voirol /S Algerie ancien,,,Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4304,18012,1995-06-02 00:00:00,,EPSG,Superseded by 30592 (Voirol Unifie / Algeria Sud).,
+30591,Voirol Unifie / Nord Algerie,Voirol Unifie /N Algerie,,,Algeria - north of 38.5 grads (34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4305,18021,1995-06-02 00:00:00,,EPSG,Supersedes 30491 (Voirol 1875 / Nord Algeria ancienne).,
+30592,Voirol Unifie / Sud Algerie,Voirol Unifie /S Algerie,,,Algeria - 35 grads to 38.5 grads (31 deg 30 min to 34 deg 39 min) North.,projected 2D,,,East,North,X,Y,9001,,4305,18022,1995-06-02 00:00:00,,EPSG,Supersedes 30492 (Voirol 1875 / Sud Algeria ancienne).,
+30729,Nord Sahara 1959 / UTM zone 29N,Nord Sahara / UTM 29N,,,Algeria west of 6 deg West (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16029,1996-04-12 00:00:00,,EPSG,,
+30730,Nord Sahara 1959 / UTM zone 30N,Nord Sahara / UTM 30N,,,Algeria 6 deg West to 0 deg East (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16030,1996-04-12 00:00:00,,EPSG,,
+30731,Nord Sahara 1959 / UTM zone 31N,Nord Sahara / UTM 31N,,,Algeria 0 deg to 6 deg East (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16031,1996-04-12 00:00:00,,EPSG,,
+30732,Nord Sahara 1959 / UTM zone 32N,Nord Sahara / UTM 32N,,,Algeria east of 6 deg East (of Greenwich).,projected 2D,,,East,North,E,N,9001,,4307,16032,1996-04-12 00:00:00,,EPSG,,
+30800,RT38 2.5 gon W,,,,Sweden,projected 2D,,,North,East,X,Y,9001,,4308,19929,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,97.14  97.39
+31028,Yoff / UTM zone 28N,,,,Senegal.,projected 2D,,,East,North,E,N,9001,,4310,16028,1995-06-02 00:00:00,,EPSG,,
+31121,Zanderij / UTM zone 21N,,,,Suriname.,projected 2D,,,East,North,E,N,9001,,4311,16021,1995-06-02 00:00:00,,EPSG,,
+31291,MGI (Ferro) / Austria West Zone,MGI / Austria West,,,Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4805,18041,1995-06-02 00:00:00,,EPSG,Superceded by MGI / M34 (EPSG code 31296).,97.01
+31292,MGI (Ferro) / Austria Central Zone,MGI / Austria Central,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4805,18042,1995-06-02 00:00:00,,EPSG,Superceded by MGI / M31 (EPSG code 31295).,97.01
+31293,MGI (Ferro) / Austria East Zone,MGI / Austria East,,,Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4805,18043,1995-06-02 00:00:00,,EPSG,Superceded by MGI / M28 (EPSG code 31294).,97.01
+31294,MGI / M28,,,,Austria west of 11deg 50min East of Greenwich (29 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4312,18044,1999-10-20 00:00:00,,EPSG,Supercedes MGI (Ferro) / Austria East zone (EPSG code 31293).,
+31295,MGI / M31,,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29 deg 30 min and 32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4312,18045,1999-10-20 00:00:00,,EPSG,Supercedes MGI (Ferro) / Austria Central zone (EPSG code 31292).,
+31296,MGI / M34,,,,Austria east of 14deg 50min East of Greenwich (32 deg 30 min East of Ferro).,projected 2D,,,East,North,X,Y,9001,,4312,18046,1999-10-20 00:00:00,,EPSG,Supercedes MGI (Ferro) / Austria West zone (EPSG code 31291).,
+31297,MGI / Austria Lambert,,,,Austria,projected 2D,,,East,North,X,Y,9001,,4312,19947,1999-10-20 00:00:00,,EPSG,,
+31300,Belge 1972 / Belge Lambert 72,Belge Lambert 72,,,Belgium - onshore.,projected 2D,,,East,North,X,Y,9001,,4313,19902,1995-06-02 00:00:00,,EPSG,Supersedes 21500 (Belge 1950 / Belge Lambert 50).,
+31491,DHDN / Germany zone 1,,,,Germany - onshore west of 4 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18101,1995-06-02 00:00:00,,EPSG,,
+31492,DHDN / Germany zone 2,,,,Germany - onshore between 4 deg 30 min and 7 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18102,1995-06-02 00:00:00,,EPSG,,
+31493,DHDN / Germany zone 3,,,,Germany - onshore between 7 deg 30 min and 10 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18103,1995-06-02 00:00:00,,EPSG,,
+31494,DHDN / Germany zone 4,,,,Germany - onshore between 10 deg 30 min and 13 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18104,1995-06-02 00:00:00,,EPSG,,
+31495,DHDN / Germany zone 5,,,,Germany - onshore between 13 deg 30 min and 16 deg 30 min East.,projected 2D,,,East,North,X,Y,9001,,4314,18105,1995-06-02 00:00:00,,EPSG,,
+31600,Dealul Piscului 1933/ Stereo 33,Stereo 33,,,Romania.,projected 2D,,,East,North,X,Y,9001,,4316,19927,1996-04-12 00:00:00,,EPSG,Superseded by Stereo 70 system (ProjCS code 31700).,
+31700,Dealul Piscului 1970/ Stereo 70,Stereo 70,,,Romania.,projected 2D,,,North,East,X,Y,9001,,4317,19926,1996-04-12 00:00:00,,EPSG,Supersedes Stereo 33 system.,
+31838,NGN / UTM zone 38N,,,,Kuwait west of 48deg East.,projected 2D,,,East,North,E,N,9001,,4318,16038,1996-04-12 00:00:00,,EPSG,,
+31839,NGN / UTM zone 39N,,,,Kuwait east of 48deg East.,projected 2D,,,East,North,E,N,9001,,4318,16039,1996-04-12 00:00:00,,EPSG,,
+31900,KUDAMS / KTM,,,,Kuwait - Kuwait City.,projected 2D,,,East,North,E,N,9001,,4319,19928,1996-04-12 00:00:00,,EPSG,,
+32001,NAD27 / Montana North,,,,United States (USA) - Montana - MT_N - counties of Blaine; Chouteau; Daniels; Flathead; Glacier; Hill; Liberty; Lincoln; Phillips; Pondera; Roosevelt; Sheridan; Teton; Toole; Valley,projected 2D,,,East,North,X,Y,9003,,4267,12501,1995-06-02 00:00:00,,EPSG,,
+32002,NAD27 / Montana Central,,,,United States (USA) - Montana - MT_C - counties of Cascade; Dawson; Fergus; Garfield; Judith Basin; Lake; Lewis and Clark; McCone; Meagher; Mineral; Missoula; Petroleum; Powell; Prairie; Richland; Sanders; Wibaux,projected 2D,,,East,North,X,Y,9003,,4267,12502,1995-06-02 00:00:00,,EPSG,,
+32003,NAD27 / Montana South,,,,United States (USA) - Montana - MT_S - counties of Beaverhead; Big Horn; Broadwater; Carbon; Carter; Custer; Deer Lodge; Fallon; Gallatin; Golden Valley; Granite; Jefferson; Madison; Musselshell; Park; Powder River; Ravalli; Rosebud; Silver Bow; Stillwater; Sweet Grass; Treasure; Wheatland; Yellowstone,projected 2D,,,East,North,X,Y,9003,,4267,12503,1995-06-02 00:00:00,,EPSG,,
+32005,NAD27 / Nebraska North,,,,United States (USA) - Nebraska - NE_N - counties of Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler,projected 2D,,,East,North,X,Y,9003,,4267,12601,1995-06-02 00:00:00,,EPSG,,
+32006,NAD27 / Nebraska South,,,,United States (USA) - Nebraska - NE_S - counties of Adams; Arthur; Banner; Boone; Buffalo; Butler; Cass; Chase; Cheyenne; Clay; Colfax; Custer; Dawson; Deuel; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Gosper; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Howard; Jefferson; Johnson; Kearney; Keith; Kimball; Lancaster; Lincoln; Logan; McPherson; Merrick; Morrill; Nance; Nemaha; Nuckolls; Otoe; Pawnee; Perkins; Phelps; Pl [...]
+32007,NAD27 / Nevada East,,,,United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine,projected 2D,,,East,North,X,Y,9003,,4267,12701,1995-06-02 00:00:00,,EPSG,,
+32008,NAD27 / Nevada Central,,,,United States (USA) - Nevada - NV_C - counties of Lander; Nye,projected 2D,,,East,North,X,Y,9003,,4267,12702,1995-06-02 00:00:00,,EPSG,,
+32009,NAD27 / Nevada West,,,,United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe,projected 2D,,,East,North,X,Y,9003,,4267,12703,1995-06-02 00:00:00,,EPSG,,
+32010,NAD27 / New Hampshire,,,,United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan,projected 2D,,,East,North,X,Y,9003,,4267,12800,1995-06-02 00:00:00,,EPSG,,
+32011,NAD27 / New Jersey,,,,United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren,projected 2D,,,East,North,X,Y,9003,,4267,12900,1995-06-02 00:00:00,,EPSG,,
+32012,NAD27 / New Mexico East,,,,United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union,projected 2D,,,East,North,X,Y,9003,,4267,13001,1995-06-02 00:00:00,,EPSG,,
+32013,NAD27 / New Mexico Central,NAD27 / New Mexico Cent.,,,United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance,projected 2D,,,East,North,X,Y,9003,,4267,13002,1995-06-02 00:00:00,,EPSG,,
+32014,NAD27 / New Mexico West,,,,United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra; Valencia,projected 2D,,,East,North,X,Y,9003,,4267,13003,1995-06-02 00:00:00,,EPSG,,
+32015,NAD27 / New York East,,,,United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence; Sullivan; Ulster; Warren; Washington; Westchester,projected 2D,,,East,North,X,Y,9003,,4267,13101,1995-06-02 00:00:00,,EPSG,,
+32016,NAD27 / New York Central,,,,United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates,projected 2D,,,East,North,X,Y,9003,,4267,13102,1995-06-02 00:00:00,,EPSG,,
+32017,NAD27 / New York West,,,,United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming,projected 2D,,,East,North,X,Y,9003,,4267,13103,1995-06-02 00:00:00,,EPSG,,
+32018,NAD27 / New York Long Island,NAD27 / New York Long Is,,,United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk,projected 2D,,,East,North,X,Y,9003,,4267,13104,1995-06-02 00:00:00,,EPSG,,
+32019,NAD27 / North Carolina,,,,United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleveland; Columbus; Craven; Cumberland; Currituck; Dare; Davidson; Davie; Duplin; Durham; Edgecombe; Forsyth; Franklin; Gaston; Gates; Graham; Granville; Greene; Guilford; Halifax; Harnett; Haywood; Henderson [...]
+32020,NAD27 / North Dakota North,NAD27 / North Dakota N,,,United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Traill; Walsh; Ward; Wells; Williams,projected 2D,,,East,North,X,Y,9003,,4267,13301,1995-06-02 00:00:00,,EPSG,,
+32021,NAD27 / North Dakota South,NAD27 / North Dakota S,,,United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slope; Stark; Stutsman,projected 2D,,,East,North,X,Y,9003,,4267,13302,1995-06-02 00:00:00,,EPSG,,
+32022,NAD27 / Ohio North,,,,United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan; Lorain; Lucas; Mahoning; Marion; Medina; Mercer; Morrow; Ottawa; Paulding; Portage; Putnam; Richland; Sandusky; Seneca; Shelby; Stark; Summit; Trumbull; Tuscarawas; Union; Van Wert; Wayne; Williams; Wood; Wy [...]
+32023,NAD27 / Ohio South,,,,United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Meigs; Miami; Monroe; Montgomery; Morgan; Muskingum; Noble; Perry; Pickaway; Pike; Preble; Ross; Scioto; Vinton; Warren; Washington,projected 2D,,,East,North,X,Y,9003,,4267,13402,1995-06-02 00:00:00,,EPSG,,
+32024,NAD27 / Oklahoma North,,,,United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata; Okfuskee; Oklahoma; Okmulgee; Osage; Ottawa; Pawnee; Payne; Roger Mills; Rogers; Sequoyah; Texas; Tulsa; Wagoner; Washington; Woods; Woodward,projected 2D,,,East,North,X,Y,9003,,4267,13501,1995-06-02 00: [...]
+32025,NAD27 / Oklahoma South,,,,United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McClain; McCurtain; McIntosh; Murray; Pittsburg; Pontotoc; Pottawatomie; Pushmataha; Seminole; Stephens; Tillman; Washita,projected 2D,,,East,North,X,Y,9003,,4267,13502,1995-06-02 00:00:00,,EPSG,,
+32026,NAD27 / Oregon North,,,,United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; Yamhill,projected 2D,,,East,North,X,Y,9003,,4267,13601,1995-06-02 00:00:00,,EPSG,,
+32027,NAD27 / Oregon South,,,,United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur,projected 2D,,,East,North,X,Y,9003,,4267,13602,1995-06-02 00:00:00,,EPSG,,
+32028,NAD27 / Pennsylvania North,NAD27 / Pennsylvania N,,,United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike; Potter; Sullivan; Susquehanna; Tioga; Union; Venango; Warren; Wayne; Wyoming,projected 2D,,,East,North,X,Y,9003,,4267,13701,1995-06-02 00:00:00,,EPSG,,
+32029,NAD27 / Pennsylvania South,NAD27 / Pennsylvania S,,,United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; Lawrence; Lebanon; Lehigh; Mifflin; Montgomery; Northampton; Perry; Philadelphia; Schuylkill; Snyder; Somerset; Washington; Westmoreland; York,projected 2D,,,East,North,X,Y,9003, [...]
+32030,NAD27 / Rhode Island,,,,United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington,projected 2D,,,East,North,X,Y,9003,,4267,13800,1995-06-02 00:00:00,,EPSG,,
+32031,NAD27 / South Carolina North,NAD27 / South Carolina N,,,United States (USA) - South Carolina - SC_N - counties of Abbeville; Anderson; Calhoun; Cherokee; Chester; Chesterfield; Darlington; Dillon; Edgefield; Fairfield; Florence; Greenville; Greenwood; Horry; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Pickens; Richland; Saluda; Spartanburg; Sumter; Union; York,projected 2D,,,East,North,X,Y,9003,,4267,13901,1995-06-02 00:00:00,,EPSG,,
+32033,NAD27 / South Carolina South,NAD27 / South Carolina S,,,United States (USA) - South Carolina - SC_S - counties of Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg; Williamsburg,projected 2D,,,East,North,X,Y,9003,,4267,13902,1995-06-02 00:00:00,,EPSG,,
+32034,NAD27 / South Dakota North,NAD27 / South Dakota N,,,United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Potter; Roberts; Spink; Sully; Walworth; Ziebach,projected 2D,,,East,North,X,Y,9003,,4267,14001,1995-06-02 00:00:00,,EPSG,,
+32035,NAD27 / South Dakota South,NAD27 / South Dakota S,,,United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook; Mellette; Miner; Minnehaha; Moody; Pennington; Sanborn; Shannon; Stanley; Todd; Tripp; Turner; Union; Yankton,projected 2D,,,East,North,X,Y,9003,,4267,14002,1995-06-02 00:00:00,,EPSG,,
+32036,NAD27 / Tennessee,,,,United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; Fayette; Fentress; Franklin; Gibson; Giles; Grainger; Greene; Grundy; Hamblen; Hamilton; Hancock; Hardeman; Hardin; Hawkins; Haywood; Henderson; Henry; Hickman; Houston; Humphreys; Jackson; Jefferson; Johnson;  [...]
+32037,NAD27 / Texas North,,,,United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Roberts; Sherman; Swisher; Wheeler,projected 2D,,,East,North,X,Y,9003,,4267,14201,1995-06-02 00:00:00,,EPSG,,
+32038,NAD27 / Texas North Central,NAD27 / Texas North Cen.,,,United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foard; Franklin; Gaines; Garza; Grayson,projected 2D,,,East,North,X,Y,9003,,4267,14202,1995-06-02 00:00:00,,EPSG,,
+32039,NAD27 / Texas Central,,,,United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie; Glasscock; Grimes; Hamilton; Hardin; Houston; Hudspeth; Irion; Jasper; Jeff Davis; Kimble; Lampasas; Lee; Leon; Liberty; Limestone; Llano; Loving; Madison; Mason; McCulloch; McLennan; Menard; Midland; Mil [...]
+32040,NAD27 / Texas South Central,NAD27 / Texas South Cen.,,,United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Terrell; Uvalde; Va [...]
+32041,NAD27 / Texas South,,,,United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata;  - Gulf of Mexico outer continental shelf (OCS) protraction areas: South Padre Island; North Padre Island; Mustang Island.,projected 2D,,,East,North,X,Y,9003,,4267,14205,1995-06-02 00:00:00,,EPSG,,
+32042,NAD27 / Utah North,,,,United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber,projected 2D,,,East,North,X,Y,9003,,4267,14301,1995-06-02 00:00:00,,EPSG,,
+32043,NAD27 / Utah Central,,,,United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch,projected 2D,,,East,North,X,Y,9003,,4267,14302,1995-06-02 00:00:00,,EPSG,,
+32044,NAD27 / Utah South,,,,United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne,projected 2D,,,East,North,X,Y,9003,,4267,14303,1995-06-02 00:00:00,,EPSG,,
+32045,NAD27 / Vermont,,,,United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor,projected 2D,,,East,North,X,Y,9003,,4267,14400,1995-06-02 00:00:00,,EPSG,,
+32046,NAD27 / Virginia North,,,,United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spotsylvania; Stafford; Warren; Westmoreland,projected 2D,,,East,North,X,Y,9003,,4267,14501,1995-06-02 00:00:00,,EPSG,,
+32047,NAD27 / Virginia South,,,,United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colonial Heights; Craig; Cumberland; Dickenson; Dinwiddie; Essex; Floyd; Fluvanna; Franklin; Giles; Gloucester; Goochland; Grayson; Greensville; Halifax; Hampton; Hanover; Henrico; Henry; Isle of Wight; James [...]
+32048,NAD27 / Washington North,,,,United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom,projected 2D,,,East,North,X,Y,9003,,4267,14601,1995-06-02 00:00:00,,EPSG,,
+32049,NAD27 / Washington South,,,,United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima,projected 2D,,,East,North,X,Y,9003,,4267,14602,1995-06-02 00:00:00,,EPSG,,
+32050,NAD27 / West Virginia North,NAD27 / West Virginia N,,,United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; Wetzel; Wirt; Wood,projected 2D,,,East,North,X,Y,9003,,4267,14701,1995-06-02 00:00:00,,EPSG,,
+32051,NAD27 / West Virginia South,NAD27 / West Virginia S,,,United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; Randolph; Roane; Summers; Upshur; Wayne; Webster; Wyoming,projected 2D,,,East,North,X,Y,9003,,4267,14702,1995-06-02 00:00:00,,EPSG,,
+32052,NAD27 / Wisconsin North,,,,United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn,projected 2D,,,East,North,X,Y,9003,,4267,14801,1995-06-02 00:00:00,,EPSG,,
+32053,NAD27 / Wisconsin Central,NAD27 / Wisconsin Cen.,,,United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. Croix; Taylor; Trempealeau; Waupaca; Wood,projected 2D,,,East,North,X,Y,9003,,4267,14802,1995-06-02 00:00:00,,EPSG,,
+32054,NAD27 / Wisconsin South,,,,United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; Richland; Rock; Sauk; Sheboygan; Vernon; Walworth; Washington; Waukesha; Waushara; Winnebago,projected 2D,,,East,North,X,Y,9003,,4267,14803,1995-06-02 00:00:00,,EPSG,,
+32055,NAD27 / Wyoming East,,,,United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston,projected 2D,,,East,North,X,Y,9003,,4267,14901,1995-06-02 00:00:00,,EPSG,,
+32056,NAD27 / Wyoming East Central,NAD27 / Wyoming E. Cen.,,,United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie,projected 2D,,,East,North,X,Y,9003,,4267,14902,1995-06-02 00:00:00,,EPSG,,
+32057,NAD27 / Wyoming West Central,NAD27 / Wyoming W. Cen.,,,United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater,projected 2D,,,East,North,X,Y,9003,,4267,14903,1995-06-02 00:00:00,,EPSG,,
+32058,NAD27 / Wyoming West,,,,United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta,projected 2D,,,East,North,X,Y,9003,,4267,14904,1995-06-02 00:00:00,,EPSG,,
+32061,NAD27 / Guatemala Norte,,,,Guatemala - north of 15 deg 50 min North.,projected 2D,,,East,North,X,Y,9001,,4267,18211,1999-08-18 00:00:00,,EPSG,,
+32062,NAD27 / Guatemala Sud,,,,Guatemala - south of 15 deg 50 min North.,projected 2D,,,East,North,X,Y,9001,,4267,18212,1999-08-18 00:00:00,,EPSG,,
+32074,NAD27 / BLM 14N (feet),,,,United States - Gulf of Mexico - west of approximately 96 deg West - outer continental shelf (OCS) protraction areas Corpus Christi; Port Isabel.,projected 2D,,,East,North,X,Y,9003,,4267,15914,1996-04-12 00:00:00,,EPSG,,96.03
+32075,NAD27 / BLM 15N (feet),,,,United States - Gulf of Mexico - 96 deg to 90 deg West - outer continental shelf (OCS) protraction areas East Breaks (EB); Alaminos Canyon (AC); Garden Banks (GB); Keathley Canyon (KC); Ewing Bank (EW); Green Canyon (GC); Walker Ridge (WR).,projected 2D,,,East,North,X,Y,9003,,4267,15915,1996-04-12 00:00:00,,EPSG,,96.03
+32076,NAD27 / BLM 16N (feet),,,,United States - Gulf of Mexico - 90 deg to 84 deg West - outer continental shelf (OCS) protraction areas Mobile (MO); Viosca Knoll (VK); Mississippi Canyon (MC); Atwater Valley (AT); Lund; Pensacola; Destin Dome (DD); De Soto Canyon; Lloyd; Henderson; Apalachicola; Florida Middle Ground; The Elbow; Vernon Basin; Howell Hook.,projected 2D,,,East,North,X,Y,9003,,4267,15916,1996-04-12 00:00:00,,EPSG,,95.27  96.03
+32077,NAD27 / BLM 17N (feet),,,,United States - Gulf of Mexico - east of 84 deg West - outer continental shelf (OCS) protraction areas Gainesville; Tarpon Springs; St. Petersburg; Charlotte Harbor; Pulley Ridge; Dry Tortugas; Miami; Key West.,projected 2D,,,East,North,X,Y,9003,,4267,15917,1996-04-12 00:00:00,,EPSG,,96.03
+32081,NAD27 / MTM zone 1,,,,Canada - Newfoundland - east of 54 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4267,17701,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32082,NAD27 / MTM zone 2,,,,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,projected 2D,,,East,North,E,N,9001,,4267,17702,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32083,NAD27 / MTM zone 3,,,,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4267,17703,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32084,NAD27 / MTM zone 4,,,,Canada - Newfoundland (Labrador) between 63 deg and 60 deg West.,projected 2D,,,East,North,E,N,9001,,4267,17704,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32085,NAD27 / MTM zone 5,,,,Canada - Newfoundland (Labrador) between 66 deg and 63 deg West.,projected 2D,,,East,North,E,N,9001,,4267,17705,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32086,NAD27 / MTM zone 6,,,,Canada - Newfoundland (Labrador) between 69 deg and  66 deg West.,projected 2D,,,East,North,E,N,9001,,4267,17706,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32100,NAD83 / Montana,,,,United States (USA) - Montana - MT - counties of Beaverhead; Big Horn; Blaine; Broadwater; Carbon; Carter; Cascade; Chouteau; Custer; Daniels; Dawson; Deer Lodge; Fallon; Fergus; Flathead; Gallatin; Garfield; Glacier; Golden Valley; Granite; Hill; Jefferson; Judith Basin; Lake; Lewis and Clark; Liberty; Lincoln; Madison; McCone; Meagher; Mineral; Missoula; Musselshell; Park; Petroleum; Phillips; Pondera; Powder River; Powell; Prairie; Ravalli; Richland; Roosevelt [...]
+32104,NAD83 / Nebraska,,,,United States (USA) - Nebraska - NE - counties of Adams; Antelope; Arthur; Banner; Blaine; Boone; Box Butte; Boyd; Brown; Buffalo; Burt; Butler; Cass; Cedar; Chase; Cherry; Cheyenne; Clay; Colfax; Cuming; Custer; Dakota; Dawes; Dawson; Deuel; Dixon; Dodge; Douglas; Dundy; Fillmore; Franklin; Frontier; Furnas; Gage; Garden; Garfield; Gosper; Grant; Greeley; Hall; Hamilton; Harlan; Hayes; Hitchcock; Holt; Hooker; Howard; Jefferson; Johnson; Kearney; Keith; Keya Pa [...]
+32107,NAD83 / Nevada  East,,,,United States (USA) - Nevada - NV_E - counties of Clark; Elko; Eureka; Lincoln; White Pine,projected 2D,,,East,North,X,Y,9001,,4269,12731,1995-06-02 00:00:00,,EPSG,,
+32108,NAD83 / Nevada Central,,,,United States (USA) - Nevada - NV_C - counties of Lander; Nye,projected 2D,,,East,North,X,Y,9001,,4269,12732,1995-06-02 00:00:00,,EPSG,,
+32109,NAD83 / Nevada West,,,,United States (USA) - Nevada - NV_W - counties of Churchill; Douglas; Esmeralda; Humboldt; Lyon; Mineral; Pershing; Storey; Washoe,projected 2D,,,East,North,X,Y,9001,,4269,12733,1995-06-02 00:00:00,,EPSG,,
+32110,NAD83 / New Hampshire,,,,United States (USA) - New Hampshire - NH - counties of Belknap; Carroll; Cheshire; Coos; Grafton; Hillsborough; Merrimack; Rockingham; Strafford; Sullivan,projected 2D,,,East,North,X,Y,9001,,4269,12830,1995-06-02 00:00:00,,EPSG,,
+32111,NAD83 / New Jersey,,,,United States (USA) - New Jersey - NJ - counties of Atlantic; Bergen; Burlington; Camden; Cape May; Cumberland; Essex; Gloucester; Hudson; Hunterdon; Mercer; Middlesex; Monmouth; Morris; Ocean; Passaic; Salem; Somerset; Sussex; Union; Warren,projected 2D,,,East,North,X,Y,9001,,4269,12930,1995-06-02 00:00:00,,EPSG,,
+32112,NAD83 / New Mexico East,,,,United States (USA) - New Mexico - NM_E - counties of Chaves; Colfax; Curry; De Baca; Eddy; Guadalupe; Harding; Lea; Mora; Quay; Roosevelt; San Miguel; Union,projected 2D,,,East,North,X,Y,9001,,4269,13031,1995-06-02 00:00:00,,EPSG,,
+32113,NAD83 / New Mexico Central,NAD83 / New Mexico Cent.,,,United States (USA) - New Mexico - NM_C - counties of Bernalillo; Dona Ana; Lincoln; Los Alamos; Otero; Rio Arriba; Sandoval; Santa Fe; Socorro; Taos; Torrance; Valencia,projected 2D,,,East,North,X,Y,9001,,4269,13032,1995-06-02 00:00:00,,EPSG,,
+32114,NAD83 / New Mexico West,,,,United States (USA) - New Mexico - NM_W - counties of Catron; Cibola; Grant; Hidalgo; Luna; McKinley; San Juan; Sierra,projected 2D,,,East,North,X,Y,9001,,4269,13033,1995-06-02 00:00:00,,EPSG,,
+32115,NAD83 / New York  East,,,,United States (USA) - New York - NY_E - counties of Albany; Clinton; Columbia; Delaware; Dutchess; Essex; Franklin; Fulton; Greene; Hamilton; Herkimer; Montgomery; Orange; Otsego; Putnam; Rensselaer; Rockland; Saratoga; Schenectady; Schoharie; St. Lawrence; Sullivan; Ulster; Warren; Washington; Westchester,projected 2D,,,East,North,X,Y,9001,,4269,13131,1995-06-02 00:00:00,,EPSG,,
+32116,NAD83 / New York Central,,,,United States (USA) - New York - NY_C - counties of Broome; Cayuga; Chemung; Chenango; Cortland; Jefferson; Lewis; Madison; Oneida; Onondaga; Ontario; Oswego; Schuyler; Seneca; Steuben; Tioga; Tompkins; Wayne; Yates,projected 2D,,,East,North,X,Y,9001,,4269,13132,1995-06-02 00:00:00,,EPSG,,
+32117,NAD83 / New York  West,,,,United States (USA) - New York - NY_W - counties of Allegany; Cattaraugus; Chautauqua; Erie; Genesee; Livingston; Monroe; Niagara; Orleans; Wyoming,projected 2D,,,East,North,X,Y,9001,,4269,13133,1995-06-02 00:00:00,,EPSG,,
+32118,NAD83 / New York Long Island,NAD83 / New York Long Is,,,United States (USA) - New York - NY_LI - counties of Bronx; Kings; Nassau; New York; Queens; Richmond; Suffolk,projected 2D,,,East,North,X,Y,9001,,4269,13134,1995-06-02 00:00:00,,EPSG,,
+32119,NAD83 / North Carolina,,,,United States (USA) - North Carolina - NC - counties of Alamance; Alexander; Alleghany; Anson; Ashe; Avery; Beaufort; Bertie; Bladen; Brunswick; Buncombe; Burke; Cabarrus; Caldwell; Camden; Carteret; Caswell; Catawba; Chatham; Cherokee; Chowan; Clay; Cleveland; Columbus; Craven; Cumberland; Currituck; Dare; Davidson; Davie; Duplin; Durham; Edgecombe; Forsyth; Franklin; Gaston; Gates; Graham; Granville; Greene; Guilford; Halifax; Harnett; Haywood; Henderson [...]
+32120,NAD83 / North Dakota North,NAD83 / North Dakota N,,,United States (USA) - North Dakota - ND_N - counties of Benson; Bottineau; Burke; Cavalier; Divide; Eddy; Foster; Grand Forks; Griggs; McHenry; McKenzie; McLean; Mountrial; Nelson; Pembina; Pierce; Ramsey; Renville; Rolette; Sheridan; Steele; Towner; Traill; Walsh; Ward; Wells; Williams,projected 2D,,,East,North,X,Y,9001,,4269,13331,1995-06-02 00:00:00,,EPSG,,
+32121,NAD83 / North Dakota South,NAD83 / North Dakota S,,,United States (USA) - North Dakota - ND_S - counties of Adams; Barnes; Billings; Bowman; Burleigh; Cass; Dickey; Dunn; Emmons; Golden Valley; Grant; Hettinger; Kidder; La Moure; Logan; McIntosh; Mercer; Morton; Oliver; Ransom; Richland; Sargent; Sioux; Slope; Stark; Stutsman,projected 2D,,,East,North,X,Y,9001,,4269,13332,1995-06-02 00:00:00,,EPSG,,
+32122,NAD83 / Ohio North,,,,United States (USA) - Ohio - OH_N - counties of Allen;Ashland; Ashtabula; Auglaize; Carroll; Columbiana; Coshocton; Crawford; Cuyahoga; Defiance; Delaware; Erie; Fulton; Geauga; Hancock; Hardin; Harrison; Henry; Holmes; Huron; Jefferson; Knox; Lake; Logan; Lorain; Lucas; Mahoning; Marion; Medina; Mercer; Morrow; Ottawa; Paulding; Portage; Putnam; Richland; Sandusky; Seneca; Shelby; Stark; Summit; Trumbull; Tuscarawas; Union; Van Wert; Wayne; Williams; Wood; Wy [...]
+32123,NAD83 / Ohio South,,,,United States (USA) - Ohio - OH_S - counties of Adams; Athens; Belmont; Brown; Butler; Champaign; Clark; Clermont; Clinton; Darke; Fairfield; Fayette; Franklin; Gallia; Greene; Guernsey; Hamilton; Highland; Hocking; Jackson; Lawrence; Licking; Madison; Meigs; Miami; Monroe; Montgomery; Morgan; Muskingum; Noble; Perry; Pickaway; Pike; Preble; Ross; Scioto; Vinton; Warren; Washington,projected 2D,,,East,North,X,Y,9001,,4269,13432,1995-06-02 00:00:00,,EPSG,,
+32124,NAD83 / Oklahoma North,,,,United States (USA) - Oklahoma - OK_N - counties of Adair; Alfalfa; Beaver; Blaine; Canadian; Cherokee; Cimarron; Craig; Creek; Custer; Delaware; Dewey; Ellis; Garfield; Grant; Harper; Kay; Kingfisher; Lincoln; Logan; Major; Mayes; Muskogee; Noble; Nowata; Okfuskee; Oklahoma; Okmulgee; Osage; Ottawa; Pawnee; Payne; Roger Mills; Rogers; Sequoyah; Texas; Tulsa; Wagoner; Washington; Woods; Woodward,projected 2D,,,East,North,X,Y,9001,,4269,13531,1995-06-02 00: [...]
+32125,NAD83 / Oklahoma South,,,,United States (USA) - Oklahoma - OK_S - counties of Atoka; Beckham; Bryan; Caddo; Carter; Choctaw; Cleveland; Coal; Comanche; Cotton; Garvin; Grady; Greer; Harmon; Haskell; Hughes; Jackson; Jefferson; Johnston; Kiowa; Latimer; Le Flore; Love; Marshall; McClain; McCurtain; McIntosh; Murray; Pittsburg; Pontotoc; Pottawatomie; Pushmataha; Seminole; Stephens; Tillman; Washita,projected 2D,,,East,North,X,Y,9001,,4269,13532,1995-06-02 00:00:00,,EPSG,,
+32126,NAD83 / Oregon North,,,,United States (USA) - Oregon - OR_N - counties of Baker; Benton; Clackamas; Clatsop; Columbia; Gilliam; Grant; Hood River; Jefferson; Lincoln; Linn; Marion; Morrow; Multnomah; Polk; Sherman; Tillamook; Umatilla; Union; Wallowa; Wasco; Washington; Wheeler; Yamhill,projected 2D,,,East,North,X,Y,9001,,4269,13631,1995-06-02 00:00:00,,EPSG,,
+32127,NAD83 / Oregon South,,,,United States (USA) - Oregon - OR_S - counties of Coos; Crook; Curry; Deschutes; Douglas; Harney; Jackson; Josephine; Klamath; Lake; Lane; Malheur,projected 2D,,,East,North,X,Y,9001,,4269,13632,1995-06-02 00:00:00,,EPSG,,
+32128,NAD83 / Pennsylvania North,NAD83 / Pennsylvania N,,,United States (USA) - Pennsylvania - PA_N - counties of Bradford; Cameron; Carbon; Centre; Clarion; Clearfield; Clinton; Columbia; Crawford; Elk; Erie; Forest; Jefferson; Lackawanna; Luzerne; Lycoming; McKean; Mercer; Monroe; Montour; Northumberland; Pike; Potter; Sullivan; Susquehanna; Tioga; Union; Venango; Warren; Wayne; Wyoming,projected 2D,,,East,North,X,Y,9001,,4269,13731,1995-06-02 00:00:00,,EPSG,,
+32129,NAD83 / Pennsylvania South,NAD83 / Pennsylvania S,,,United States (USA) - Pennsylvania - PA_S - counties of Adams; Allegheny; Armstrong; Beaver; Bedford; Berks; Blair; Bucks; Butler; Cambria; Chester; Cumberland; Dauphin; Delaware; Fayette; Franklin; Fulton; Greene; Huntingdon; Indiana; Juniata; Lancaster; Lawrence; Lebanon; Lehigh; Mifflin; Montgomery; Northampton; Perry; Philadelphia; Schuylkill; Snyder; Somerset; Washington; Westmoreland; York,projected 2D,,,East,North,X,Y,9001, [...]
+32130,NAD83 / Rhode Island,,,,United States (USA) - Rhode Island - RI - counties of Bristol; Kent; Newport; Providence; Washington,projected 2D,,,East,North,X,Y,9001,,4269,13830,1995-06-02 00:00:00,,EPSG,,
+32133,NAD83 / South Carolina,,,,United States (USA) - South Carolina - SC - counties of Abbeville; Aiken; Allendale; Anderson; Bamberg; Barnwell; Beaufort; Berkeley; Calhoun; Charleston; Cherokee; Chester; Chesterfield; Clarendon; Colleton; Darlington; Dillon; Dorchester; Edgefield; Fairfield; Florence; Georgetown; Greenville; Greenwood; Hampton; Horry; Jasper; Kershaw; Lancaster; Laurens; Lee; Lexington; Marion; Marlboro; McCormick; Newberry; Oconee; Orangeburg; Pickens; Richland; Salud [...]
+32134,NAD83 / South Dakota North,NAD83 / South Dakota N,,,United States (USA) - South Dakota - SD_N - counties of Beadle; Brookings; Brown; Butte; Campbell; Clark; Codington; Corson; Day; Deuel; Dewey; Edmunds; Faulk; Grant; Hamlin; Hand; Harding; Hyde; Kingsbury; Lawrence; Marshall; McPherson; Meade; Perkins; Potter; Roberts; Spink; Sully; Walworth; Ziebach,projected 2D,,,East,North,X,Y,9001,,4269,14031,1995-06-02 00:00:00,,EPSG,,
+32135,NAD83 / South Dakota South,NAD83 / South Dakota S,,,United States (USA) - South Dakota - SD_S - counties of Aurora; Bennett; Bon Homme; Brule; Buffalo; Charles Mix; Clay; Custer; Davison; Douglas; Fall River; Gregory; Haakon; Hanson; Hughes; Hutchinson; Jackson; Jerauld; Jones; Lake; Lincoln; Lyman; McCook; Mellette; Miner; Minnehaha; Moody; Pennington; Sanborn; Shannon; Stanley; Todd; Tripp; Turner; Union; Yankton,projected 2D,,,East,North,X,Y,9001,,4269,14032,1995-06-02 00:00:00,,EPSG,,
+32136,NAD83 / Tennessee,,,,United States (USA) - Tennessee - TN - counties of Anderson; Bedford; Benton; Bledsoe; Blount; Bradley; Campbell; Cannon; Carroll; Carter; Cheatham; Chester; Claiborne; Clay; Cocke; Coffee; Crockett; Cumberland; Davidson; De Kalb; Decatur; Dickson; Dyer; Fayette; Fentress; Franklin; Gibson; Giles; Grainger; Greene; Grundy; Hamblen; Hamilton; Hancock; Hardeman; Hardin; Hawkins; Haywood; Henderson; Henry; Hickman; Houston; Humphreys; Jackson; Jefferson; Johnson;  [...]
+32137,NAD83 / Texas North,,,,United States (USA) - Texas -TX_N - counties of: Armstrong; Briscoe; Carson; Castro; Childress; Collingsworth; Dallam; Deaf Smith; Donley; Gray; Hall; Hansford; Hartley; Hemphill; Hutchinson; Lipscomb; Moore; Ochiltree; Oldham; Parmer; Potter; Randall; Roberts; Sherman; Swisher; Wheeler,projected 2D,,,East,North,X,Y,9001,,4269,14231,1995-06-02 00:00:00,,EPSG,,
+32138,NAD83 / Texas North Central,NAD83 / Texas North Cen.,,,United States (USA) - Texas -TX_NC - counties of: Andrews; Archer; Bailey; Baylor; Borden; Bowie; Callahan; Camp; Cass; Clay; Cochran; Collin; Cooke; Cottle; Crosby; Dallas; Dawson; Delta; Denton; Dickens; Eastland; Ellis; Erath; Fannin; Fisher; Floyd; Foard; Franklin; Gaines; Garza; Grayson,projected 2D,,,East,North,X,Y,9001,,4269,14232,1995-06-02 00:00:00,,EPSG,,
+32139,NAD83 / Texas Central,,,,United States (USA) - Texas -TX_C - counties of Anderson; Angelina; Bastrop; Bell; Blanco; Bosque; Brazos; Brown; Burleson; Burnet; Cherokee; Coke; Coleman; Comanche; Concho; Coryell; Crane; Crockett; Culberson; Ector; El Paso; Falls; Freestone; Gillespie; Glasscock; Grimes; Hamilton; Hardin; Houston; Hudspeth; Irion; Jasper; Jeff Davis; Kimble; Lampasas; Lee; Leon; Liberty; Limestone; Llano; Loving; Madison; Mason; McCulloch; McLennan; Menard; Midland; Mil [...]
+32140,NAD83 / Texas South Central,NAD83 / Texas South Cen.,,,United States (USA) - Texas -TX_SC - counties of Aransas; Atascosa; Austin; Bandera; Bee; Bexar; Brazoria; Brewster; Caldwell; Calhoun; Chambers; Colorado; Comal; De Witt; Dimmit; Edwards; Fayette; Fort Bend; Frio; Galveston; Goliad; Gonzales; Guadalupe; Harris; Hays; Jackson; Jefferson; Karnes; Kendall; Kerr; Kinney; La Salle; Lavaca; Live Oak; Matagorda; Maverick; McMullen; Medina; Presidio; Real; Refugio; Terrell; Uvalde; Va [...]
+32141,NAD83 / Texas South,,,,United States (USA) - Texas -TX_S - counties of Brooks; Cameron; Duval; Hidalgo; Jim Hogg; Jim Wells; Kenedy; Kleberg; Nueces; San Patricio; Starr; Webb; Willacy; Zapata,projected 2D,,,East,North,X,Y,9001,,4269,14235,1995-06-02 00:00:00,,EPSG,,
+32142,NAD83 / Utah North,,,,United States (USA) - Utah - UT_N - counties of Box Elder; Cache; Daggett; Davis; Morgan; Rich; Summit; Weber,projected 2D,,,East,North,X,Y,9001,,4269,14331,1995-06-02 00:00:00,,EPSG,,
+32143,NAD83 / Utah Central,,,,United States (USA) - Utah - UT_C - counties of Carbon; Duchesne; Emery; Grand; Juab; Millard; Salt Lake; Sanpete; Sevier; Tooele; Uintah; Utah; Wasatch,projected 2D,,,East,North,X,Y,9001,,4269,14332,1995-06-02 00:00:00,,EPSG,,
+32144,NAD83 / Utah South,,,,United States (USA) - Utah - UT_S - counties of Beaver; Garfield; Iron; Kane; Piute; San Juan; Washington; Wayne,projected 2D,,,East,North,X,Y,9001,,4269,14333,1995-06-02 00:00:00,,EPSG,,
+32145,NAD83 / Vermont,,,,United States (USA) - Vermont - VT - counties of Addison; Bennington; Caledonia; Chittenden; Essex; Franklin; Grand Isle; Lamoille; Orange; Orleans; Rutland; Washington; Windham; Windsor,projected 2D,,,East,North,X,Y,9001,,4269,14430,1995-06-02 00:00:00,,EPSG,,
+32146,NAD83 / Virginia North,,,,United States (USA) - Virginia - VA_N - counties of Arlington; Augusta; Bath; Caroline; Clarke; Culpeper; Fairfax; Fauquier; Frederick; Greene; Highland; King George; Loudoun; Madison; Orange; Page; Prince William; Rappahannock; Rockingham; Shenandoah; Spotsylvania; Stafford; Warren; Westmoreland,projected 2D,,,East,North,X,Y,9001,,4269,14531,1995-06-02 00:00:00,,EPSG,,
+32147,NAD83 / Virginia South,,,,United States (USA) - Virginia - VA_S - counties of Accomack; Albemarle; Alleghany; Amelia; Amherst; Appomattox; Bedford; Bland; Botetourt; Bristol; Brunswick; Buchanan; Buckingham; Campbell; Carroll; Charles City; Charlotte; Chesapeake; Chesterfield; Colonial Heights; Craig; Cumberland; Dickenson; Dinwiddie; Essex; Floyd; Fluvanna; Franklin; Giles; Gloucester; Goochland; Grayson; Greensville; Halifax; Hampton; Hanover; Henrico; Henry; Isle of Wight; James [...]
+32148,NAD83 / Washington North,,,,United States (USA) - Washington - WA_N - counties of Chelan; Clallam; Douglas; Ferry; Grant north of approx. 47d30m; Island; Jefferson; King; Kitsap; Lincoln; Okanogan; Pend Oreille; San Juan; Skagit; Snohomish; Spokane; Stevens; Whatcom,projected 2D,,,East,North,X,Y,9001,,4269,14631,1995-06-02 00:00:00,,EPSG,,
+32149,NAD83 / Washington South,,,,United States (USA) - Washington - WA_S - counties of Adams; Asotin; Benton; Clark; Columbia; Cowlitz; Franklin; Garfield; Grant south of approx. 47d30m; Grays Harbor; Kittitas; Klickitat; Lewis; Mason; Pacific; Pierce; Skamania; Thurston; Wahkiakum; Walla Walla; Whitman; Yakima,projected 2D,,,East,North,X,Y,9001,,4269,14632,1995-06-02 00:00:00,,EPSG,,
+32150,NAD83 / West Virginia North,NAD83 / West Virginia N,,,United States (USA) - West Virginia - WV_N - counties of Barbour; Berkeley; Brooke; Doddridge; Grant; Hampshire; Hancock; Hardy; Harrison; Jefferson; Marion; Marshall; Mineral; Monongalia; Morgan; Ohio; Pleasants; Preston; Ritchie; Taylor; Tucker; Tyler; Wetzel; Wirt; Wood,projected 2D,,,East,North,X,Y,9001,,4269,14731,1995-06-02 00:00:00,,EPSG,,
+32151,NAD83 / West Virginia South,NAD83 / West Virginia S,,,United States (USA) - West Virginia - WV_S - counties of Boone; Braxton; Cabell; Calhoun; Clay; Fayette; Gilmer; Greenbrier; Jackson; Kanawha; Lewis; Lincoln; Logan; Mason; McDowell; Mercer; Mingo; Monroe; Nicholas; Pendleton; Pocahontas; Putnam; Raleigh; Randolph; Roane; Summers; Upshur; Wayne; Webster; Wyoming,projected 2D,,,East,North,X,Y,9001,,4269,14732,1995-06-02 00:00:00,,EPSG,,
+32152,NAD83 / Wisconsin North,,,,United States (USA) - Wisconsin - WI_N - counties of Ashland; Bayfield; Burnett; Douglas; Florence; Forest; Iron; Oneida; Price; Sawyer; Vilas; Washburn,projected 2D,,,East,North,X,Y,9001,,4269,14831,1995-06-02 00:00:00,,EPSG,,
+32153,NAD83 / Wisconsin Central,NAD83 / Wisconsin Cen.,,,United States (USA) - Wisconsin - WI_C - counties of Barron; Brown; Buffalo; Chippewa; Clark; Door; Dunn; Eau Claire; Jackson; Kewaunee; Langlade; Lincoln; Marathon; Marinette; Menominee; Oconto; Outagamie; Pepin; Pierce; Polk; Portage; Rusk; Shawano; St. Croix; Taylor; Trempealeau; Waupaca; Wood,projected 2D,,,East,North,X,Y,9001,,4269,14832,1995-06-02 00:00:00,,EPSG,,
+32154,NAD83 / Wisconsin South,,,,United States (USA) - Wisconsin - WI_S - counties of Adams; Calumet; Columbia; Crawford; Dane; Dodge; Fond Du Lac; Grant; Green; Green Lake; Iowa; Jefferson; Juneau; Kenosha; La Crosse; Lafayette; Manitowoc; Marquette; Milwaukee; Monroe; Ozaukee; Racine; Richland; Rock; Sauk; Sheboygan; Vernon; Walworth; Washington; Waukesha; Waushara; Winnebago,projected 2D,,,East,North,X,Y,9001,,4269,14833,1995-06-02 00:00:00,,EPSG,,
+32155,NAD83 / Wyoming East,,,,United States (USA) - Wyoming - WY_E - counties of Albany; Campbell; Converse; Crook; Goshen; Laramie; Niobrara; Platte; Weston,projected 2D,,,East,North,X,Y,9001,,4269,14931,1995-06-02 00:00:00,,EPSG,,
+32156,NAD83 / Wyoming East Central,NAD83 / Wyoming E. Cen.,,,United States (USA) - Wyoming - WY_EC - counties of Big Horn; Carbon; Johnson; Natrona; Sheridan; Washakie,projected 2D,,,East,North,X,Y,9001,,4269,14932,1995-06-02 00:00:00,,EPSG,,
+32157,NAD83 / Wyoming West Central,NAD83 / Wyoming W. Cen.,,,United States (USA) - Wyoming - WY_WC - counties of Fremont; Hot Springs; Park; Sweetwater,projected 2D,,,East,North,X,Y,9001,,4269,14933,1995-06-02 00:00:00,,EPSG,,
+32158,NAD83 / Wyoming West,,,,United States (USA) - Wyoming - WY_W - counties of Lincoln; Sublette; Teton; Uinta,projected 2D,,,East,North,X,Y,9001,,4269,14934,1995-06-02 00:00:00,,EPSG,,
+32161,NAD83 / Puerto Rico & Virgin Is.,,,,Puerto Rico and U.S. Virgin Islands.,projected 2D,,,East,North,X,Y,9001,,4269,15230,1995-06-02 00:00:00,,EPSG,,
+32180,NAD83 / SCoPQ zone 2,,,,Canada - Quebec - east of 57 deg East.,projected 2D,,,East,North,X,Y,9001,,4269,17700,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,,
+32181,NAD83 / MTM zone 1,,,,Canada - Newfoundland - east of 54 deg 30 min West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17701,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32182,NAD83 / MTM zone 2,,,,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17702,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+32183,NAD83 / MTM zone 3,,,,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17703,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 3\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32184,NAD83 / MTM zone 4,,,,Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17704,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 4\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32185,NAD83 / MTM zone 5,,,,Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17705,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 5\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32186,NAD83 / MTM zone 6,,,,Canada - Quebec and Newfoundland (Labrador) between 69 deg and  66 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17706,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 6\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32187,NAD83 / MTM zone 7,,,,Canada - Quebec between 72 deg and 69 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17707,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 7\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32188,NAD83 / MTM zone 8,,,,Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17708,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 8\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32189,NAD83 / MTM zone 9,,,,Canada - Quebec and Ontario - between 78 deg and 75 deg West.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17709,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 9\" with axis 1 and 2 abbreviations of \"X\" and \"Y\" respectively.",
+32190,NAD83 / MTM zone 10,,,,Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,projected 2D,,,East,North,E(X),N(Y),9001,,4269,17710,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,"Known in Quebec as \"NAD83 / SCoPQ zone 10\" with axis 1 and 2 abbrevia [...]
+32191,NAD83 / MTM zone 11,,,,Canada - Ontario - south of 46 deg N and west of 81 deg West.,projected 2D,,,East,North,E,N,9001,,4269,17711,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32192,NAD83 / MTM zone 12,,,,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,projected 2D,,,East,North,E,N,9001,,4269,17712,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32193,NAD83 / MTM zone 13,,,,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,projected 2D,,,East,North,E,N,9001,,4269,17713,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32194,NAD83 / MTM zone 14,,,,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17714,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32195,NAD83 / MTM zone 15,,,,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17715,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32196,NAD83 / MTM zone 16,,,,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17716,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32197,NAD83 / MTM zone 17,,,,Canada - Ontario - west of 94 deg 30 min West.,projected 2D,,,East,North,E,N,9001,,4269,17717,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+32198,NAD83 / Quebec Lambert,,,,Canada - Quebec,projected 2D,,,East,North,X,Y,9001,,4269,19944,1999-10-20 00:00:00,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,,
+32201,WGS 72 / UTM zone 1N,,,,180deg to 174deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16001,1995-06-02 00:00:00,,EPSG,,
+32202,WGS 72 / UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16002,1995-06-02 00:00:00,,EPSG,,
+32203,WGS 72 / UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16003,1995-06-02 00:00:00,,EPSG,,
+32204,WGS 72 / UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16004,1995-06-02 00:00:00,,EPSG,,
+32205,WGS 72 / UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16005,1995-06-02 00:00:00,,EPSG,,
+32206,WGS 72 / UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16006,1995-06-02 00:00:00,,EPSG,,
+32207,WGS 72 / UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16007,1995-06-02 00:00:00,,EPSG,,
+32208,WGS 72 / UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16008,1995-06-02 00:00:00,,EPSG,,
+32209,WGS 72 / UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16009,1995-06-02 00:00:00,,EPSG,,
+32210,WGS 72 / UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16010,1995-06-02 00:00:00,,EPSG,,
+32211,WGS 72 / UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16011,1995-06-02 00:00:00,,EPSG,,
+32212,WGS 72 / UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16012,1995-06-02 00:00:00,,EPSG,,
+32213,WGS 72 / UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16013,1995-06-02 00:00:00,,EPSG,,
+32214,WGS 72 / UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16014,1995-06-02 00:00:00,,EPSG,,
+32215,WGS 72 / UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16015,1995-06-02 00:00:00,,EPSG,,
+32216,WGS 72 / UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16016,1995-06-02 00:00:00,,EPSG,,
+32217,WGS 72 / UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16017,1995-06-02 00:00:00,,EPSG,,
+32218,WGS 72 / UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16018,1995-06-02 00:00:00,,EPSG,,
+32219,WGS 72 / UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16019,1995-06-02 00:00:00,,EPSG,,
+32220,WGS 72 / UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16020,1995-06-02 00:00:00,,EPSG,,
+32221,WGS 72 / UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16021,1995-06-02 00:00:00,,EPSG,,
+32222,WGS 72 / UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16022,1995-06-02 00:00:00,,EPSG,,
+32223,WGS 72 / UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16023,1995-06-02 00:00:00,,EPSG,,
+32224,WGS 72 / UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16024,1995-06-02 00:00:00,,EPSG,,
+32225,WGS 72 / UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16025,1995-06-02 00:00:00,,EPSG,,
+32226,WGS 72 / UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16026,1995-06-02 00:00:00,,EPSG,,
+32227,WGS 72 / UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16027,1995-06-02 00:00:00,,EPSG,,
+32228,WGS 72 / UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16028,1995-06-02 00:00:00,,EPSG,,
+32229,WGS 72 / UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16029,1995-06-02 00:00:00,,EPSG,,
+32230,WGS 72 / UTM zone 30N,,,,6deg West to 0deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16030,1995-06-02 00:00:00,,EPSG,,
+32231,WGS 72 / UTM zone 31N,,,,0deg to 6deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16031,1995-06-02 00:00:00,,EPSG,,
+32232,WGS 72 / UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16032,1995-06-02 00:00:00,,EPSG,,
+32233,WGS 72 / UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16033,1995-06-02 00:00:00,,EPSG,,
+32234,WGS 72 / UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16034,1995-06-02 00:00:00,,EPSG,,
+32235,WGS 72 / UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16035,1995-06-02 00:00:00,,EPSG,,
+32236,WGS 72 / UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16036,1995-06-02 00:00:00,,EPSG,,
+32237,WGS 72 / UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16037,1995-06-02 00:00:00,,EPSG,,
+32238,WGS 72 / UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16038,1995-06-02 00:00:00,,EPSG,,
+32239,WGS 72 / UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16039,1995-06-02 00:00:00,,EPSG,,
+32240,WGS 72 / UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16040,1995-06-02 00:00:00,,EPSG,,
+32241,WGS 72 / UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16041,1995-06-02 00:00:00,,EPSG,,
+32242,WGS 72 / UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16042,1995-06-02 00:00:00,,EPSG,,
+32243,WGS 72 / UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16043,1995-06-02 00:00:00,,EPSG,,
+32244,WGS 72 / UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16044,1995-06-02 00:00:00,,EPSG,,
+32245,WGS 72 / UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16045,1995-06-02 00:00:00,,EPSG,,
+32246,WGS 72 / UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16046,1995-06-02 00:00:00,,EPSG,,
+32247,WGS 72 / UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16047,1995-06-02 00:00:00,,EPSG,,
+32248,WGS 72 / UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16048,1995-06-02 00:00:00,,EPSG,,
+32249,WGS 72 / UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16049,1995-06-02 00:00:00,,EPSG,,
+32250,WGS 72 / UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16050,1995-06-02 00:00:00,,EPSG,,
+32251,WGS 72 / UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16051,1995-06-02 00:00:00,,EPSG,,
+32252,WGS 72 / UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16052,1995-06-02 00:00:00,,EPSG,,
+32253,WGS 72 / UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16053,1995-06-02 00:00:00,,EPSG,,
+32254,WGS 72 / UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16054,1995-06-02 00:00:00,,EPSG,,
+32255,WGS 72 / UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16055,1995-06-02 00:00:00,,EPSG,,
+32256,WGS 72 / UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16056,1995-06-02 00:00:00,,EPSG,,
+32257,WGS 72 / UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16057,1995-06-02 00:00:00,,EPSG,,
+32258,WGS 72 / UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16058,1995-06-02 00:00:00,,EPSG,,
+32259,WGS 72 / UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16059,1995-06-02 00:00:00,,EPSG,,
+32260,WGS 72 / UTM zone 60N,,,,174deg East to 180deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16060,1995-06-02 00:00:00,,EPSG,,
+32301,WGS 72 / UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16101,1995-06-02 00:00:00,,EPSG,,
+32302,WGS 72 / UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16102,1995-06-02 00:00:00,,EPSG,,
+32303,WGS 72 / UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16103,1995-06-02 00:00:00,,EPSG,,
+32304,WGS 72 / UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16104,1995-06-02 00:00:00,,EPSG,,
+32305,WGS 72 / UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16105,1995-06-02 00:00:00,,EPSG,,
+32306,WGS 72 / UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16106,1995-06-02 00:00:00,,EPSG,,
+32307,WGS 72 / UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16107,1995-06-02 00:00:00,,EPSG,,
+32308,WGS 72 / UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16108,1995-06-02 00:00:00,,EPSG,,
+32309,WGS 72 / UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16109,1995-06-02 00:00:00,,EPSG,,
+32310,WGS 72 / UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16110,1995-06-02 00:00:00,,EPSG,,
+32311,WGS 72 / UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16111,1995-06-02 00:00:00,,EPSG,,
+32312,WGS 72 / UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16112,1995-06-02 00:00:00,,EPSG,,
+32313,WGS 72 / UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16113,1995-06-02 00:00:00,,EPSG,,
+32314,WGS 72 / UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16114,1995-06-02 00:00:00,,EPSG,,
+32315,WGS 72 / UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16115,1995-06-02 00:00:00,,EPSG,,
+32316,WGS 72 / UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16116,1995-06-02 00:00:00,,EPSG,,
+32317,WGS 72 / UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16117,1995-06-02 00:00:00,,EPSG,,
+32318,WGS 72 / UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16118,1995-06-02 00:00:00,,EPSG,,
+32319,WGS 72 / UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16119,1995-06-02 00:00:00,,EPSG,,
+32320,WGS 72 / UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16120,1995-06-02 00:00:00,,EPSG,,
+32321,WGS 72 / UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16121,1995-06-02 00:00:00,,EPSG,,
+32322,WGS 72 / UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16122,1995-06-02 00:00:00,,EPSG,,
+32323,WGS 72 / UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16123,1995-06-02 00:00:00,,EPSG,,
+32324,WGS 72 / UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16124,1995-06-02 00:00:00,,EPSG,,
+32325,WGS 72 / UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16125,1995-06-02 00:00:00,,EPSG,,
+32326,WGS 72 / UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16126,1995-06-02 00:00:00,,EPSG,,
+32327,WGS 72 / UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16127,1995-06-02 00:00:00,,EPSG,,
+32328,WGS 72 / UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16128,1995-06-02 00:00:00,,EPSG,,
+32329,WGS 72 / UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16129,1995-06-02 00:00:00,,EPSG,,
+32330,WGS 72 / UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16130,1995-06-02 00:00:00,,EPSG,,
+32331,WGS 72 / UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16131,1995-06-02 00:00:00,,EPSG,,
+32332,WGS 72 / UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16132,1995-06-02 00:00:00,,EPSG,,
+32333,WGS 72 / UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16133,1995-06-02 00:00:00,,EPSG,,
+32334,WGS 72 / UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16134,1995-06-02 00:00:00,,EPSG,,
+32335,WGS 72 / UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16135,1995-06-02 00:00:00,,EPSG,,
+32336,WGS 72 / UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16136,1995-06-02 00:00:00,,EPSG,,
+32337,WGS 72 / UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16137,1995-06-02 00:00:00,,EPSG,,
+32338,WGS 72 / UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16138,1995-06-02 00:00:00,,EPSG,,
+32339,WGS 72 / UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16139,1995-06-02 00:00:00,,EPSG,,
+32340,WGS 72 / UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16140,1995-06-02 00:00:00,,EPSG,,
+32341,WGS 72 / UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16141,1995-06-02 00:00:00,,EPSG,,
+32342,WGS 72 / UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16142,1995-06-02 00:00:00,,EPSG,,
+32343,WGS 72 / UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16143,1995-06-02 00:00:00,,EPSG,,
+32344,WGS 72 / UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16144,1995-06-02 00:00:00,,EPSG,,
+32345,WGS 72 / UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16145,1995-06-02 00:00:00,,EPSG,,
+32346,WGS 72 / UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16146,1995-06-02 00:00:00,,EPSG,,
+32347,WGS 72 / UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16147,1995-06-02 00:00:00,,EPSG,,
+32348,WGS 72 / UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16148,1995-06-02 00:00:00,,EPSG,,
+32349,WGS 72 / UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16149,1995-06-02 00:00:00,,EPSG,,
+32350,WGS 72 / UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16150,1995-06-02 00:00:00,,EPSG,,
+32351,WGS 72 / UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16151,1995-06-02 00:00:00,,EPSG,,
+32352,WGS 72 / UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16152,1995-06-02 00:00:00,,EPSG,,
+32353,WGS 72 / UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16153,1995-06-02 00:00:00,,EPSG,,
+32354,WGS 72 / UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16154,1995-06-02 00:00:00,,EPSG,,
+32355,WGS 72 / UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16155,1995-06-02 00:00:00,,EPSG,,
+32356,WGS 72 / UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16156,1995-06-02 00:00:00,,EPSG,,
+32357,WGS 72 / UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16157,1995-06-02 00:00:00,,EPSG,,
+32358,WGS 72 / UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16158,1995-06-02 00:00:00,,EPSG,,
+32359,WGS 72 / UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16159,1995-06-02 00:00:00,,EPSG,,
+32360,WGS 72 / UTM zone 60S,,,,174deg East to 180deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4322,16160,1995-06-02 00:00:00,,EPSG,,
+32401,WGS 72BE / UTM zone 1N,,,,180deg to 174deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16001,1995-06-02 00:00:00,,EPSG,,
+32402,WGS 72BE / UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16002,1995-06-02 00:00:00,,EPSG,,
+32403,WGS 72BE / UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16003,1995-06-02 00:00:00,,EPSG,,
+32404,WGS 72BE / UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16004,1995-06-02 00:00:00,,EPSG,,
+32405,WGS 72BE / UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16005,1995-06-02 00:00:00,,EPSG,,
+32406,WGS 72BE / UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16006,1995-06-02 00:00:00,,EPSG,,
+32407,WGS 72BE / UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16007,1995-06-02 00:00:00,,EPSG,,
+32408,WGS 72BE / UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16008,1995-06-02 00:00:00,,EPSG,,
+32409,WGS 72BE / UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16009,1995-06-02 00:00:00,,EPSG,,
+32410,WGS 72BE / UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16010,1995-06-02 00:00:00,,EPSG,,
+32411,WGS 72BE / UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16011,1995-06-02 00:00:00,,EPSG,,
+32412,WGS 72BE / UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16012,1995-06-02 00:00:00,,EPSG,,
+32413,WGS 72BE / UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16013,1995-06-02 00:00:00,,EPSG,,
+32414,WGS 72BE / UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16014,1995-06-02 00:00:00,,EPSG,,
+32415,WGS 72BE / UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16015,1995-06-02 00:00:00,,EPSG,,
+32416,WGS 72BE / UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16016,1995-06-02 00:00:00,,EPSG,,
+32417,WGS 72BE / UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16017,1995-06-02 00:00:00,,EPSG,,
+32418,WGS 72BE / UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16018,1995-06-02 00:00:00,,EPSG,,
+32419,WGS 72BE / UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16019,1995-06-02 00:00:00,,EPSG,,
+32420,WGS 72BE / UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16020,1995-06-02 00:00:00,,EPSG,,
+32421,WGS 72BE / UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16021,1995-06-02 00:00:00,,EPSG,,
+32422,WGS 72BE / UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16022,1995-06-02 00:00:00,,EPSG,,
+32423,WGS 72BE / UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16023,1995-06-02 00:00:00,,EPSG,,
+32424,WGS 72BE / UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16024,1995-06-02 00:00:00,,EPSG,,
+32425,WGS 72BE / UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16025,1995-06-02 00:00:00,,EPSG,,
+32426,WGS 72BE / UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16026,1995-06-02 00:00:00,,EPSG,,
+32427,WGS 72BE / UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16027,1995-06-02 00:00:00,,EPSG,,
+32428,WGS 72BE / UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16028,1995-06-02 00:00:00,,EPSG,,
+32429,WGS 72BE / UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16029,1995-06-02 00:00:00,,EPSG,,
+32430,WGS 72BE / UTM zone 30N,,,,6deg West to 0deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16030,1995-06-02 00:00:00,,EPSG,,
+32431,WGS 72BE / UTM zone 31N,,,,0deg to 6deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16031,1995-06-02 00:00:00,,EPSG,,
+32432,WGS 72BE / UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16032,1995-06-02 00:00:00,,EPSG,,
+32433,WGS 72BE / UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16033,1995-06-02 00:00:00,,EPSG,,
+32434,WGS 72BE / UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16034,1995-06-02 00:00:00,,EPSG,,
+32435,WGS 72BE / UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16035,1995-06-02 00:00:00,,EPSG,,
+32436,WGS 72BE / UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16036,1995-06-02 00:00:00,,EPSG,,
+32437,WGS 72BE / UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16037,1995-06-02 00:00:00,,EPSG,,
+32438,WGS 72BE / UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16038,1995-06-02 00:00:00,,EPSG,,
+32439,WGS 72BE / UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16039,1995-06-02 00:00:00,,EPSG,,
+32440,WGS 72BE / UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16040,1995-06-02 00:00:00,,EPSG,,
+32441,WGS 72BE / UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16041,1995-06-02 00:00:00,,EPSG,,
+32442,WGS 72BE / UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16042,1995-06-02 00:00:00,,EPSG,,
+32443,WGS 72BE / UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16043,1995-06-02 00:00:00,,EPSG,,
+32444,WGS 72BE / UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16044,1995-06-02 00:00:00,,EPSG,,
+32445,WGS 72BE / UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16045,1995-06-02 00:00:00,,EPSG,,
+32446,WGS 72BE / UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16046,1995-06-02 00:00:00,,EPSG,,
+32447,WGS 72BE / UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16047,1995-06-02 00:00:00,,EPSG,,
+32448,WGS 72BE / UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16048,1995-06-02 00:00:00,,EPSG,,
+32449,WGS 72BE / UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16049,1995-06-02 00:00:00,,EPSG,,
+32450,WGS 72BE / UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16050,1995-06-02 00:00:00,,EPSG,,
+32451,WGS 72BE / UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16051,1995-06-02 00:00:00,,EPSG,,
+32452,WGS 72BE / UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16052,1995-06-02 00:00:00,,EPSG,,
+32453,WGS 72BE / UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16053,1995-06-02 00:00:00,,EPSG,,
+32454,WGS 72BE / UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16054,1995-06-02 00:00:00,,EPSG,,
+32455,WGS 72BE / UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16055,1995-06-02 00:00:00,,EPSG,,
+32456,WGS 72BE / UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16056,1995-06-02 00:00:00,,EPSG,,
+32457,WGS 72BE / UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16057,1995-06-02 00:00:00,,EPSG,,
+32458,WGS 72BE / UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16058,1995-06-02 00:00:00,,EPSG,,
+32459,WGS 72BE / UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16059,1995-06-02 00:00:00,,EPSG,,
+32460,WGS 72BE / UTM zone 60N,,,,174deg East to 180deg; northern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16060,1995-06-02 00:00:00,,EPSG,,
+32501,WGS 72BE / UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16101,1995-06-02 00:00:00,,EPSG,,
+32502,WGS 72BE / UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16102,1995-06-02 00:00:00,,EPSG,,
+32503,WGS 72BE / UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16103,1995-06-02 00:00:00,,EPSG,,
+32504,WGS 72BE / UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16104,1995-06-02 00:00:00,,EPSG,,
+32505,WGS 72BE / UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16105,1995-06-02 00:00:00,,EPSG,,
+32506,WGS 72BE / UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16106,1995-06-02 00:00:00,,EPSG,,
+32507,WGS 72BE / UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16107,1995-06-02 00:00:00,,EPSG,,
+32508,WGS 72BE / UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16108,1995-06-02 00:00:00,,EPSG,,
+32509,WGS 72BE / UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16109,1995-06-02 00:00:00,,EPSG,,
+32510,WGS 72BE / UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16110,1995-06-02 00:00:00,,EPSG,,
+32511,WGS 72BE / UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16111,1995-06-02 00:00:00,,EPSG,,
+32512,WGS 72BE / UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16112,1995-06-02 00:00:00,,EPSG,,
+32513,WGS 72BE / UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16113,1995-06-02 00:00:00,,EPSG,,
+32514,WGS 72BE / UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16114,1995-06-02 00:00:00,,EPSG,,
+32515,WGS 72BE / UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16115,1995-06-02 00:00:00,,EPSG,,
+32516,WGS 72BE / UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16116,1995-06-02 00:00:00,,EPSG,,
+32517,WGS 72BE / UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16117,1995-06-02 00:00:00,,EPSG,,
+32518,WGS 72BE / UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16118,1995-06-02 00:00:00,,EPSG,,
+32519,WGS 72BE / UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16119,1995-06-02 00:00:00,,EPSG,,
+32520,WGS 72BE / UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16120,1995-06-02 00:00:00,,EPSG,,
+32521,WGS 72BE / UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16121,1995-06-02 00:00:00,,EPSG,,
+32522,WGS 72BE / UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16122,1995-06-02 00:00:00,,EPSG,,
+32523,WGS 72BE / UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16123,1995-06-02 00:00:00,,EPSG,,
+32524,WGS 72BE / UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16124,1995-06-02 00:00:00,,EPSG,,
+32525,WGS 72BE / UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16125,1995-06-02 00:00:00,,EPSG,,
+32526,WGS 72BE / UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16126,1995-06-02 00:00:00,,EPSG,,
+32527,WGS 72BE / UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16127,1995-06-02 00:00:00,,EPSG,,
+32528,WGS 72BE / UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16128,1995-06-02 00:00:00,,EPSG,,
+32529,WGS 72BE / UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16129,1995-06-02 00:00:00,,EPSG,,
+32530,WGS 72BE / UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16130,1995-06-02 00:00:00,,EPSG,,
+32531,WGS 72BE / UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16131,1995-06-02 00:00:00,,EPSG,,
+32532,WGS 72BE / UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16132,1995-06-02 00:00:00,,EPSG,,
+32533,WGS 72BE / UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16133,1995-06-02 00:00:00,,EPSG,,
+32534,WGS 72BE / UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16134,1995-06-02 00:00:00,,EPSG,,
+32535,WGS 72BE / UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16135,1995-06-02 00:00:00,,EPSG,,
+32536,WGS 72BE / UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16136,1995-06-02 00:00:00,,EPSG,,
+32537,WGS 72BE / UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16137,1995-06-02 00:00:00,,EPSG,,
+32538,WGS 72BE / UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16138,1995-06-02 00:00:00,,EPSG,,
+32539,WGS 72BE / UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16139,1995-06-02 00:00:00,,EPSG,,
+32540,WGS 72BE / UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16140,1995-06-02 00:00:00,,EPSG,,
+32541,WGS 72BE / UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16141,1995-06-02 00:00:00,,EPSG,,
+32542,WGS 72BE / UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16142,1995-06-02 00:00:00,,EPSG,,
+32543,WGS 72BE / UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16143,1995-06-02 00:00:00,,EPSG,,
+32544,WGS 72BE / UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16144,1995-06-02 00:00:00,,EPSG,,
+32545,WGS 72BE / UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16145,1995-06-02 00:00:00,,EPSG,,
+32546,WGS 72BE / UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16146,1995-06-02 00:00:00,,EPSG,,
+32547,WGS 72BE / UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16147,1995-06-02 00:00:00,,EPSG,,
+32548,WGS 72BE / UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16148,1995-06-02 00:00:00,,EPSG,,
+32549,WGS 72BE / UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16149,1995-06-02 00:00:00,,EPSG,,
+32550,WGS 72BE / UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16150,1995-06-02 00:00:00,,EPSG,,
+32551,WGS 72BE / UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16151,1995-06-02 00:00:00,,EPSG,,
+32552,WGS 72BE / UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16152,1995-06-02 00:00:00,,EPSG,,
+32553,WGS 72BE / UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16153,1995-06-02 00:00:00,,EPSG,,
+32554,WGS 72BE / UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16154,1995-06-02 00:00:00,,EPSG,,
+32555,WGS 72BE / UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16155,1995-06-02 00:00:00,,EPSG,,
+32556,WGS 72BE / UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16156,1995-06-02 00:00:00,,EPSG,,
+32557,WGS 72BE / UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16157,1995-06-02 00:00:00,,EPSG,,
+32558,WGS 72BE / UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16158,1995-06-02 00:00:00,,EPSG,,
+32559,WGS 72BE / UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16159,1995-06-02 00:00:00,,EPSG,,
+32560,WGS 72BE / UTM zone 60S,,,,174deg East to 180deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4324,16160,1995-06-02 00:00:00,,EPSG,,
+32601,WGS 84 / UTM zone 1N,,,,180deg to 174deg West; northern hemisphere; Russia.,projected 2D,,,East,North,E,N,9001,,4326,16001,1995-06-02 00:00:00,,EPSG,,
+32602,WGS 84 / UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere. Russia; United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16002,1995-06-02 00:00:00,,EPSG,,
+32603,WGS 84 / UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16003,1995-06-02 00:00:00,,EPSG,,
+32604,WGS 84 / UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16004,1995-06-02 00:00:00,,EPSG,,
+32605,WGS 84 / UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16005,1995-06-02 00:00:00,,EPSG,,
+32606,WGS 84 / UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16006,1995-06-02 00:00:00,,EPSG,,
+32607,WGS 84 / UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere. Canada - British Columbia (BC); Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16007,1995-06-02 00:00:00,,EPSG,,
+32608,WGS 84 / UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere. Canada - British Columbia (BC); North West Territiories; Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16008,1995-06-02 00:00:00,,EPSG,,
+32609,WGS 84 / UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16009,1995-06-02 00:00:00,,EPSG,,
+32610,WGS 84 / UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere. Canada - British Columbia (BC); North West Territories; Nunavut; Yukon. United States (USA) - Alaska (AK).,projected 2D,,,East,North,E,N,9001,,4326,16010,1995-06-02 00:00:00,,EPSG,,
+32611,WGS 84 / UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere. Canada - Alberta; British Columbia (BC); North West Territories; Nunavut. Mexico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16011,1995-06-02 00:00:00,,EPSG,,
+32612,WGS 84 / UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere. Canada - Alberta; North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16012,1995-06-02 00:00:00,,EPSG,,
+32613,WGS 84 / UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere. Canada - North West Territories; Nunavut; Saskatchewan.  Mexico.  United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16013,1995-06-02 00:00:00,,EPSG,,
+32614,WGS 84 / UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere. Canada - Manitoba; Nunavut; Saskatchewan.  Mexico.  United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16014,1995-06-02 00:00:00,,EPSG,,
+32615,WGS 84 / UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere. Canada - Manitoba; Nunavut; Ontario.  Guatemala.  Mexico.  United States (USA) - Gulf of Mexico (GoM).,projected 2D,,,East,North,E,N,9001,,4326,16015,1995-06-02 00:00:00,,EPSG,,
+32616,WGS 84 / UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere. Belize. Canada - Manitoba; Nunavut; Ontario.  Costa Rica. Cuba. El Salvador. Guatemala. Honduras. Mexico. Nicaragua. Puerto Rico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16016,1995-06-02 00:00:00,,EPSG,,
+32617,WGS 84 / UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere. Bahamas. Ecuador - north of equator. Canada - Nunavut; Ontario; Quebec.  Cayman Islands.  Colombia. Costa Rica. Jamaica. Nicaragua. Panama. Puerto Rico. United States (USA).,projected 2D,,,East,North,E,N,9001,,4326,16017,1995-06-02 00:00:00,,EPSG,,
+32618,WGS 84 / UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere. Bahamas. Canada - Nunavut; Ontario; Quebec. Colombia. Cuba. Ecuador. Greenland. Haiti. Jamica. Panama. Turks and Caicos Islands. United States (USA). Venezuela.,projected 2D,,,East,North,E,N,9001,,4326,16018,1995-06-02 00:00:00,,EPSG,,
+32619,WGS 84 / UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere. Aruba. Bahamas. Brazil. Canada - New Brunswick (NB); Newfoundland; Nunavut; Nova Scotia (NS); Quebec. Colombia. Dominican Republic. Greenland. Netherlands Antilles. Puerto Rico. Turks and Caicos Islands. United States. Venezuela.,projected 2D,,,East,North,E,N,9001,,4326,16019,1995-06-02 00:00:00,,EPSG,,
+32620,WGS 84 / UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere. Anguilla. Antigua & Barbuda. Bermuda. Brazil. Canada - New Brunswick (NB); Newfoundland; North west Territories; Nova Scotia (NS); Prince Edward Island; Quebec. Dominica. Greenland. Grenada. Guadeloupe. Guyana. Martinique. Montserrat. Saint Kitts and Nevis. Saint Lucia. Saint Vncent and the Grenadines. Trinidad and Tobago. Venezuela. Virgin islands.,projected 2D,,,East,North,E,N,9001,,4326,16020,1995-06-02 00:0 [...]
+32621,WGS 84 / UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere. Barbados. Brazil. Canada - Newfoundland; Quebec. French Guiana. Greenland. Guyana. St. Pierre and Miquelon. Suriname.,projected 2D,,,East,North,E,N,9001,,4326,16021,1995-06-02 00:00:00,,EPSG,,
+32622,WGS 84 / UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere. Brazil. Canada - Newfoundland. French Guiana. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16022,1995-06-02 00:00:00,,EPSG,,
+32623,WGS 84 / UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16023,1995-06-02 00:00:00,,EPSG,,
+32624,WGS 84 / UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16024,1995-06-02 00:00:00,,EPSG,,
+32625,WGS 84 / UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere. Greenland.,projected 2D,,,East,North,E,N,9001,,4326,16025,1995-06-02 00:00:00,,EPSG,,
+32626,WGS 84 / UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere. Greenland. Iceland.,projected 2D,,,East,North,E,N,9001,,4326,16026,1995-06-02 00:00:00,,EPSG,,
+32627,WGS 84 / UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere. Greenland. Iceland.,projected 2D,,,East,North,E,N,9001,,4326,16027,1995-06-02 00:00:00,,EPSG,,
+32628,WGS 84 / UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere. Gambia. Greenland. Guinea. Guinea-Bissau. Iceland. Ireland - offshore Porcupine Basin. Mauritania. Morocco. Senegal. Sierra Leone. Western Sahara.,projected 2D,,,East,North,E,N,9001,,4326,16028,1995-06-02 00:00:00,,EPSG,,
+32629,WGS 84 / UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere. Algeria. Cote D'Ivoire (Ivory Coast). Faroe Islands. Guinea. Ireland. Mali. Mauritania. Morocco. Portugal. Sierra Leone. Spain. United Kingdom (UK). Western Sahara.,projected 2D,,,East,North,E,N,9001,,4326,16029,1995-06-02 00:00:00,,EPSG,,
+32630,WGS 84 / UTM zone 30N,,,,6deg West to 0deg; northern hemisphere. Algeria. Burkino Faso. Cote' Ivoire (Ivory Coast). Faroe Islands - offshore. France. Ghana. Gibraltar. Ireland - offshore Irish Sea. Mali. Mauritania. Morocco. Spain. United Kingdom (UK).,projected 2D,,,East,North,E,N,9001,,4326,16030,1995-06-02 00:00:00,,EPSG,,
+32631,WGS 84 / UTM zone 31N,,,,0deg to 6deg East; northern hemisphere. Algeria. Andorra. Benin. Bukino Faso. Denmark - North Sea. France. Germany - North Sea. Ghana. Luxembourg. Mali. Netherlands. Niger. Nigeria. Norway. Spain. Togo. United Kingdom (UK) - North Sea.,projected 2D,,,East,North,E,N,9001,,4326,16031,1995-06-02 00:00:00,,EPSG,,
+32632,WGS 84 / UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere. Algeria. Austria. Cameroon. Denmark. Equatorial Guinea. France. Gabon. Germany. Italy. Libya. Liechtenstein. Monaco. Netherlands. Niger. Nigeria. Norway. Sao Tome and Principe. Svalbard and Jan Mayen Islands. Sweden. Switzerland. Tunisia. Vatican City State.,projected 2D,,,East,North,E,N,9001,,4326,16032,1995-06-02 00:00:00,,EPSG,,
+32633,WGS 84 / UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere. Austria. Bosnia and Herzegowina. Cmeroon. Central African Republic. Chad. Congo. Croatia. Czech Republic. Democratic Republic of the Congo (Zaire). Gabon. Germany. Hungary. Italy. Libya. Malta. Niger. Nigeria. Norway. Poland. San Marino. Slovakia. Slovenia. Svalbard and Jan Mayen Islands. Sweden.,projected 2D,,,East,North,E,N,9001,,4326,16033,1995-06-02 00:00:00,,EPSG,,
+32634,WGS 84 / UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere. Albania. Belarus. Bosnia and Herzegowina. Bulgaria. Central African Republic. Chad. Croatia. Democratic Republic of the Congo (Zaire). Estonia. Finland. FYR Macedonia. Greece. Hungary. Italy. Latvia. Libya. Lithuania. Norway. Poland. Romania. Russia. Slovakia. Sudan. Svalbard. Sweden. Ukraine. Yugoslavia.,projected 2D,,,East,North,E,N,9001,,4326,16034,1995-06-02 00:00:00,,EPSG,,
+32635,WGS 84 / UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere. Belarus. Bulgaria. Central African Republic. Democratic Republic of the Congo (Zaire). Egypt. Estonia. Finland. Greece. Latvia. Lesotho. Libya. Lithuania. Moldova. Norway. Romania. Russia. Sudan. Svalbard. Turkey. Uganda. Ukraine.,projected 2D,,,East,North,E,N,9001,,4326,16035,1995-06-02 00:00:00,,EPSG,,
+32636,WGS 84 / UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere. Belarus. Cyprus. Egypt. Ethiopia. Finland. Israel. Jordan. Kenya. Lebanon. Norway. Russia. Saudi Arabia. Sudan. Syria. Turkey. Uganda. Ukraine.,projected 2D,,,East,North,E,N,9001,,4326,16036,1995-06-02 00:00:00,,EPSG,,
+32637,WGS 84 / UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere. Djibouti. Egypt. Eritrea. Ethiopia. Georgia. Iraq. Jordan. Kenya. Lebanon. Russia. Saudi Arabia. Somalia. Sudan. Syria. Turkey. Ukraine.,projected 2D,,,East,North,E,N,9001,,4326,16037,1995-06-02 00:00:00,,EPSG,,
+32638,WGS 84 / UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere. Armenia. Azerbaijan. Djibouti. Eritrea. Ethiopia. Georgia. Iran. Iraq. Kazakhstan. Kuwait. Russia. Saudi Arabia. Somalia. Turkey. Yemen.,projected 2D,,,East,North,E,N,9001,,4326,16038,1995-06-02 00:00:00,,EPSG,,
+32639,WGS 84 / UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere. Azerbaijan. Bahrain. Iran. Kazakhstan. Kuwait. Oman. Qatar. Russia. Saudi Arabia. Somalia. Turkmenistan. United Arab Emirates. Yemen.,projected 2D,,,East,North,E,N,9001,,4326,16039,1995-06-02 00:00:00,,EPSG,,
+32640,WGS 84 / UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere. Iran. Kazakhstan. Oman. Russia. Saudi Arabia. Turkmenistan. United Arab Emirates. Uzbekistan.,projected 2D,,,East,North,E,N,9001,,4326,16040,1995-06-02 00:00:00,,EPSG,,
+32641,WGS 84 / UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere. Afghanistan. Iran. Kazakhstan. Pakistan. Russia. Turkmenistan.  Uzbekistan.,projected 2D,,,East,North,E,N,9001,,4326,16041,1995-06-02 00:00:00,,EPSG,,
+32642,WGS 84 / UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere. Afghanistan. India. Kazakhstan. Kyrgyzstan. Pakistan. Russia. Tajikistan. Uzbekistan.,projected 2D,,,East,North,E,N,9001,,4326,16042,1995-06-02 00:00:00,,EPSG,,
+32643,WGS 84 / UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Maldives. Pakistan. Russia. Tajikistan.,projected 2D,,,East,North,E,N,9001,,4326,16043,1995-06-02 00:00:00,,EPSG,,
+32644,WGS 84 / UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere. China. India. Kazakhstan. Kyrgyzstan. Nepal. Russia. Sri Lanka.,projected 2D,,,East,North,E,N,9001,,4326,16044,1995-06-02 00:00:00,,EPSG,,
+32645,WGS 84 / UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere. Bangladesh. Bhutan. China. India. Kazakhstan. Mongolia. Nepal. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16045,1995-06-02 00:00:00,,EPSG,,
+32646,WGS 84 / UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere. Bangladesh. Bhutan. China. Indonesia. Mongolia. Myanmar (Burma). Russia.,projected 2D,,,East,North,E,N,9001,,4326,16046,1995-06-02 00:00:00,,EPSG,,
+32647,WGS 84 / UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Myanmar (Burma). Russia. Thailand.,projected 2D,,,East,North,E,N,9001,,4326,16047,1995-06-02 00:00:00,,EPSG,,
+32648,WGS 84 / UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere. Cambodia. China. Indonesia. Laos. Malaysia - West Malaysia. Mongolia. Russia. Singapore. Thailand. Vietnam.,projected 2D,,,East,North,E,N,9001,,4326,16048,1995-06-02 00:00:00,,EPSG,,
+32649,WGS 84 / UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere. China. Hong Kong. Indonesia. Macau. Malaysia - East Malaysia - Sarawak. Mongolia. Russia. Vietnam.,projected 2D,,,East,North,E,N,9001,,4326,16049,1995-06-02 00:00:00,,EPSG,,
+32650,WGS 84 / UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere. Brunei. China. Indonesia. Malaysia - East Malaysia - Sarawak. Mongolia. Philippines. Russia. Taiwan.,projected 2D,,,East,North,E,N,9001,,4326,16050,1995-06-02 00:00:00,,EPSG,,
+32651,WGS 84 / UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Philippines. Russia.  South Korea. Taiwan.,projected 2D,,,East,North,E,N,9001,,4326,16051,1995-06-02 00:00:00,,EPSG,,
+32652,WGS 84 / UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere. China. Indonesia. Japan. North Korea. Russia. South Korea.,projected 2D,,,East,North,E,N,9001,,4326,16052,1995-06-02 00:00:00,,EPSG,,
+32653,WGS 84 / UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere. China. Japan. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16053,1995-06-02 00:00:00,,EPSG,,
+32654,WGS 84 / UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere. Japan. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16054,1995-06-02 00:00:00,,EPSG,,
+32655,WGS 84 / UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere. Japan. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16055,1995-06-02 00:00:00,,EPSG,,
+32656,WGS 84 / UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16056,1995-06-02 00:00:00,,EPSG,,
+32657,WGS 84 / UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16057,1995-06-02 00:00:00,,EPSG,,
+32658,WGS 84 / UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16058,1995-06-02 00:00:00,,EPSG,,
+32659,WGS 84 / UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16059,1995-06-02 00:00:00,,EPSG,,
+32660,WGS 84 / UTM zone 60N,,,,174deg East to 180deg; northern hemisphere. Russia.,projected 2D,,,East,North,E,N,9001,,4326,16060,1995-06-02 00:00:00,,EPSG,,
+32661,WGS 84 / UPS North,,,,Polar areas north of 84 deg N.,projected 2D,,,East,North,E,N,9001,,4326,16061,1996-09-12 00:00:00,,EPSG,,
+32701,WGS 84 / UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16101,1995-06-02 00:00:00,,EPSG,,
+32702,WGS 84 / UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16102,1995-06-02 00:00:00,,EPSG,,
+32703,WGS 84 / UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16103,1995-06-02 00:00:00,,EPSG,,
+32704,WGS 84 / UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16104,1995-06-02 00:00:00,,EPSG,,
+32705,WGS 84 / UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16105,1995-06-02 00:00:00,,EPSG,,
+32706,WGS 84 / UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16106,1995-06-02 00:00:00,,EPSG,,
+32707,WGS 84 / UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16107,1995-06-02 00:00:00,,EPSG,,
+32708,WGS 84 / UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16108,1995-06-02 00:00:00,,EPSG,,
+32709,WGS 84 / UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16109,1995-06-02 00:00:00,,EPSG,,
+32710,WGS 84 / UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16110,1995-06-02 00:00:00,,EPSG,,
+32711,WGS 84 / UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16111,1995-06-02 00:00:00,,EPSG,,
+32712,WGS 84 / UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16112,1995-06-02 00:00:00,,EPSG,,
+32713,WGS 84 / UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16113,1995-06-02 00:00:00,,EPSG,,
+32714,WGS 84 / UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16114,1995-06-02 00:00:00,,EPSG,,
+32715,WGS 84 / UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16115,1995-06-02 00:00:00,,EPSG,,
+32716,WGS 84 / UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16116,1995-06-02 00:00:00,,EPSG,,
+32717,WGS 84 / UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere. Ecuador. Peru.,projected 2D,,,East,North,E,N,9001,,4326,16117,1995-06-02 00:00:00,,EPSG,,
+32718,WGS 84 / UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere. Argentina. Brazil. Chile. Colombia. Ecuador. Peru.,projected 2D,,,East,North,E,N,9001,,4326,16118,1995-06-02 00:00:00,,EPSG,,
+32719,WGS 84 / UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere. Argentina. Bolivia. Brazil. Chile. Colombia. Peru.,projected 2D,,,East,North,E,N,9001,,4326,16119,1995-06-02 00:00:00,,EPSG,,
+32720,WGS 84 / UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay.,projected 2D,,,East,North,E,N,9001,,4326,16120,1995-06-02 00:00:00,,EPSG,,
+32721,WGS 84 / UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere. Argentina. Bolivia. Brazil. Falkland Islands (Malvinas). Paraguay. Uruguay.,projected 2D,,,East,North,E,N,9001,,4326,16121,1995-06-02 00:00:00,,EPSG,,
+32722,WGS 84 / UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere. Brazil.  Uruguay.,projected 2D,,,East,North,E,N,9001,,4326,16122,1995-06-02 00:00:00,,EPSG,,
+32723,WGS 84 / UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere. Brazil.,projected 2D,,,East,North,E,N,9001,,4326,16123,1995-06-02 00:00:00,,EPSG,,
+32724,WGS 84 / UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere. Brazil. South Georgia and the South Sandwich Islands.,projected 2D,,,East,North,E,N,9001,,4326,16124,1995-06-02 00:00:00,,EPSG,,
+32725,WGS 84 / UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere. Brazil.,projected 2D,,,East,North,E,N,9001,,4326,16125,1995-06-02 00:00:00,,EPSG,,
+32726,WGS 84 / UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16126,1995-06-02 00:00:00,,EPSG,,
+32727,WGS 84 / UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16127,1995-06-02 00:00:00,,EPSG,,
+32728,WGS 84 / UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16128,1995-06-02 00:00:00,,EPSG,,
+32729,WGS 84 / UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16129,1995-06-02 00:00:00,,EPSG,,
+32730,WGS 84 / UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16130,1995-06-02 00:00:00,,EPSG,,
+32731,WGS 84 / UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16131,1995-06-02 00:00:00,,EPSG,,
+32732,WGS 84 / UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere. Angola. Congo. Gabon. Namibia.,projected 2D,,,East,North,E,N,9001,,4326,16132,1995-06-02 00:00:00,,EPSG,,
+32733,WGS 84 / UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere. Angola. Congo. Democratic Republic of the Congo (Zaire). Gabon. Namibia. South Africa.,projected 2D,,,East,North,E,N,9001,,4326,16133,1995-06-02 00:00:00,,EPSG,,
+32734,WGS 84 / UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere. Angola. Botswana. Democratic Republic of the Congo (Zaire). Namibia. South Africa. Zambia.,projected 2D,,,East,North,E,N,9001,,4326,16134,1995-06-02 00:00:00,,EPSG,,
+32735,WGS 84 / UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere. Botswana. Burundi. Democratic Republic of the Congo (Zaire). Rwanda. South Africa. Tanzania. Uganda. Zambia. Zimbabwe.,projected 2D,,,East,North,E,N,9001,,4326,16135,1995-06-02 00:00:00,,EPSG,,
+32736,WGS 84 / UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere. Burundi. Kenya. Malawi. Mozambique. Rwanda. South Africa. Swaziland. Tanzania. Uganda. Zambia. Zimbabwe.,projected 2D,,,East,North,E,N,9001,,4326,16136,1995-06-02 00:00:00,,EPSG,,
+32737,WGS 84 / UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere. Kenya. Mozambique. Tanzania.,projected 2D,,,East,North,E,N,9001,,4326,16137,1995-06-02 00:00:00,,EPSG,,
+32738,WGS 84 / UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere. Madagascar.,projected 2D,,,East,North,E,N,9001,,4326,16138,1995-06-02 00:00:00,,EPSG,,
+32739,WGS 84 / UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere. Madagascar.,projected 2D,,,East,North,E,N,9001,,4326,16139,1995-06-02 00:00:00,,EPSG,,
+32740,WGS 84 / UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere. Seychelles.,projected 2D,,,East,North,E,N,9001,,4326,16140,1995-06-02 00:00:00,,EPSG,,
+32741,WGS 84 / UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16141,1995-06-02 00:00:00,,EPSG,,
+32742,WGS 84 / UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16142,1995-06-02 00:00:00,,EPSG,,
+32743,WGS 84 / UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16143,1995-06-02 00:00:00,,EPSG,,
+32744,WGS 84 / UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16144,1995-06-02 00:00:00,,EPSG,,
+32745,WGS 84 / UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16145,1995-06-02 00:00:00,,EPSG,,
+32746,WGS 84 / UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16146,1995-06-02 00:00:00,,EPSG,,
+32747,WGS 84 / UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16147,1995-06-02 00:00:00,,EPSG,,
+32748,WGS 84 / UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16148,1995-06-02 00:00:00,,EPSG,,
+32749,WGS 84 / UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere. Australia. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16149,1995-06-02 00:00:00,,EPSG,,
+32750,WGS 84 / UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere. Australia. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16150,1995-06-02 00:00:00,,EPSG,,
+32751,WGS 84 / UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere. Australia. East Timor. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16151,1995-06-02 00:00:00,,EPSG,,
+32752,WGS 84 / UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere. Australia. East Timor. Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16152,1995-06-02 00:00:00,,EPSG,,
+32753,WGS 84 / UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere. Australia.  Indonesia.,projected 2D,,,East,North,E,N,9001,,4326,16153,1995-06-02 00:00:00,,EPSG,,
+32754,WGS 84 / UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere. Australia. Indonesia. Papua New Guinea.,projected 2D,,,East,North,E,N,9001,,4326,16154,1995-06-02 00:00:00,,EPSG,,
+32755,WGS 84 / UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere. Australia. Papua New Guinea.,projected 2D,,,East,North,E,N,9001,,4326,16155,1995-06-02 00:00:00,,EPSG,,
+32756,WGS 84 / UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere. Australia. Papua New Guinea.,projected 2D,,,East,North,E,N,9001,,4326,16156,1995-06-02 00:00:00,,EPSG,,
+32757,WGS 84 / UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16157,1995-06-02 00:00:00,,EPSG,,
+32758,WGS 84 / UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,projected 2D,,,East,North,E,N,9001,,4326,16158,1995-06-02 00:00:00,,EPSG,,
+32759,WGS 84 / UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere. New Zealand.,projected 2D,,,East,North,E,N,9001,,4326,16159,1995-06-02 00:00:00,,EPSG,,
+32760,WGS 84 / UTM zone 60S,,,,174deg East to 180deg; southern hemisphere. New Zealand.,projected 2D,,,East,North,E,N,9001,,4326,16160,1995-06-02 00:00:00,,EPSG,,
+32761,WGS 84 / UPS South,,,,Polar areas south of 80 deg S.,projected 2D,,,East,North,E,N,9001,,4326,16161,1996-09-12 00:00:00,,EPSG,,
+32766,WGS 84 / TM 36 SE,,,,Mozambique - offshore.,projected 2D,,,East,North,E,N,9001,,4326,16636,1998-11-11 00:00:00,BP Mozambique,EPSG,Used by BP Mozambique for Offshore Zambezi block.,
diff --git a/src/tiff/csv/naming_system.csv b/src/tiff/csv/naming_system.csv
new file mode 100644
index 0000000..4867050
--- /dev/null
+++ b/src/tiff/csv/naming_system.csv
@@ -0,0 +1,13 @@
+"NAMING_SYSTEM_CODE","NAMING_SYSTEM_NAME","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+7300,EPSG alternative spelling,An alternative spelling of the EPSG name; assigned by EPSG.,EPSG,EPSG,2000-05-07 00:00:00,,0
+7301,EPSG alias,An alternative name assigned by EPSG.,EPSG,EPSG,2000-05-07 00:00:00,,0
+7302,EPSG abbreviation,An abbreviation assigned by EPSG.,EPSG,EPSG,2000-05-07 00:00:00,,0
+7303,User name,An alternative name assigned by user; not populated by EPSG.,(User to insert),EPSG,2000-05-07 00:00:00,,0
+7304,User alias,A secondary alternative name assigned by user; not populated by EPSG.,(User to insert),EPSG,2000-05-07 00:00:00,,0
+7305,User abbreviation,An abbreviation assigned by user; not populated by EPSG.,(User to insert),EPSG,2000-05-07 00:00:00,,0
+7306,POSC acronym,An abbreviation assigned by the Petrotechnical Open Software Corporation (POSC).,POSC,EPSG,2000-05-07 00:00:00,,0
+7307,EuroGeographics Identifier,A unique identifier used in the compilation of European national mapping agency data by EuroGeographics.,EuroGeographics; http://crs.ifag.de/,EPSG,2001-06-05 00:00:00,,0
+7308,Croatia alternative identifier,,EPSG,EPSG,2001-06-05 00:00:00,,0
+7309,Slovenia alternative identifier,,EPSG,EPSG,2001-06-05 00:00:00,,0
+7310,Germany alternative identifier,An alternative name used by the BfK.,EPSG,EPSG,2001-06-05 00:00:00,,0
+7311,Indonesian alternative identifier,An alternative name used by Bakosurtanal.,EPSG,EPSG,2002-06-22 00:00:00,,0
diff --git a/src/tiff/csv/p_meridian.c b/src/tiff/csv/p_meridian.c
new file mode 100644
index 0000000..f39beb2
--- /dev/null
+++ b/src/tiff/csv/p_meridian.c
@@ -0,0 +1,17 @@
+#include "defs.h"
+datafile_rows_t p_meridian_row_1[] = {"PRIME_MERIDIAN_CODE","PRIME_MERID_EPSG_NAME","PRIME_MERID_USER_NAME","GREENWICH_LONGITUDE","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t p_meridian_row_2[] = {"8901","Greenwich","","0.0","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_3[] = {"8902","Lisbon","","-9.0754862","9110","1995-06-02 00:00:00","Instituto Geografico e Cadastral; Lisbon","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_4[] = {"8903","Paris","","2.5969213","9105","1995-06-02 00:00:00","Institut Geographique National (IGN); Paris","EPSG","Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.","",NULL};
+datafile_rows_t p_meridian_row_5[] = {"8904","Bogota","","-74.04513","9110","1995-06-02 00:00:00","Instituto Geografico \"Augustin Cadazzi\" (IGAC); Bogota","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_6[] = {"8905","Madrid","","-3.411658","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_7[] = {"8906","Rome","","12.27084","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_8[] = {"8907","Bern","","7.26225","9110","1995-06-02 00:00:00","Bundesamt f�r Landestopographie","EPSG","1895 value.  Newer value of 7 deg 26 min 22.335 sec E determined in 1938.","96.29",NULL};
+datafile_rows_t p_meridian_row_9[] = {"8908","Jakarta","","106.482779","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_10[] = {"8909","Ferro","","-17.4","9110","1995-06-02 00:00:00","","EPSG","Used in Austria and former Czechoslovakia.","96.29",NULL};
+datafile_rows_t p_meridian_row_11[] = {"8910","Brussels","","4.220471","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_12[] = {"8911","Stockholm","","18.03298","9110","1995-06-02 00:00:00","","EPSG","","96.29",NULL};
+datafile_rows_t p_meridian_row_13[] = {"8912","Athens","","23.4258815","9110","1997-06-16 00:00:00","Topography Department; National Technical University of Athens.","EPSG","Used in Greece for older mapping based on Hatt projection.","",NULL};
+datafile_rows_t p_meridian_row_14[] = {"8913","Oslo","","10.43225","9110","1999-10-20 00:00:00","Statens kartverk - Geodesi dividsion","EPSG","Formerly known as Kristiana and Christiana.","",NULL};
+
+datafile_rows_t *p_meridian_rows[] = {p_meridian_row_1,p_meridian_row_2,p_meridian_row_3,p_meridian_row_4,p_meridian_row_5,p_meridian_row_6,p_meridian_row_7,p_meridian_row_8,p_meridian_row_9,p_meridian_row_10,p_meridian_row_11,p_meridian_row_12,p_meridian_row_13,p_meridian_row_14,NULL};
diff --git a/src/tiff/csv/p_meridian.csv b/src/tiff/csv/p_meridian.csv
new file mode 100644
index 0000000..9e289fe
--- /dev/null
+++ b/src/tiff/csv/p_meridian.csv
@@ -0,0 +1,14 @@
+"PRIME_MERIDIAN_CODE","PRIME_MERID_EPSG_NAME","PRIME_MERID_USER_NAME","GREENWICH_LONGITUDE","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+8901,Greenwich,,0.0,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8902,Lisbon,,-9.0754862,9110,1995-06-02 00:00:00,Instituto Geografico e Cadastral; Lisbon,EPSG,,96.29
+8903,Paris,,2.5969213,9105,1995-06-02 00:00:00,Institut Geographique National (IGN); Paris,EPSG,Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.,
+8904,Bogota,,-74.04513,9110,1995-06-02 00:00:00,"Instituto Geografico \"Augustin Cadazzi\" (IGAC); Bogota",EPSG,,96.29
+8905,Madrid,,-3.411658,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8906,Rome,,12.27084,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8907,Bern,,7.26225,9110,1995-06-02 00:00:00,Bundesamt f�r Landestopographie,EPSG,1895 value.  Newer value of 7 deg 26 min 22.335 sec E determined in 1938.,96.29
+8908,Jakarta,,106.482779,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8909,Ferro,,-17.4,9110,1995-06-02 00:00:00,,EPSG,Used in Austria and former Czechoslovakia.,96.29
+8910,Brussels,,4.220471,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8911,Stockholm,,18.03298,9110,1995-06-02 00:00:00,,EPSG,,96.29
+8912,Athens,,23.4258815,9110,1997-06-16 00:00:00,Topography Department; National Technical University of Athens.,EPSG,Used in Greece for older mapping based on Hatt projection.,
+8913,Oslo,,10.43225,9110,1999-10-20 00:00:00,Statens kartverk - Geodesi dividsion,EPSG,Formerly known as Kristiana and Christiana.,
diff --git a/src/tiff/csv/pcs.csv b/src/tiff/csv/pcs.csv
new file mode 100644
index 0000000..f7c38a4
--- /dev/null
+++ b/src/tiff/csv/pcs.csv
@@ -0,0 +1,2251 @@
+"COORD_REF_SYS_CODE","COORD_REF_SYS_NAME","UOM_CODE","SOURCE_GEOGCRS_CODE","COORD_OP_CODE","COORD_OP_METHOD_CODE","PARAMETER_CODE_1","PARAMETER_VALUE_1","PARAMETER_UOM_1","PARAMETER_CODE_2","PARAMETER_VALUE_2","PARAMETER_UOM_2","PARAMETER_CODE_3","PARAMETER_VALUE_3","PARAMETER_UOM_3","PARAMETER_CODE_4","PARAMETER_VALUE_4","PARAMETER_UOM_4","PARAMETER_CODE_5","PARAMETER_VALUE_5","PARAMETER_UOM_5","PARAMETER_CODE_6","PARAMETER_VALUE_6","PARAMETER_UOM_6","PARAMETER_CODE_7","PARAMETER_VALUE_ [...]
+2000,"Anguilla 1957 / British West Indies Grid",9001,4600,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2001,"Antigua 1943 / British West Indies Grid",9001,4601,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2002,"Dominica 1945 / British West Indies Grid",9001,4602,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2003,"Grenada 1953 / British West Indies Grid",9001,4603,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2004,"Montserrat 58 / British West Indies Grid",9001,4604,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2005,"St Kitts 1955 / British West Indies Grid",9001,4605,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2006,"St Lucia 1955 / British West Indies Grid",9001,4606,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2007,"St Vincent 45 / British West Indies Grid",9001,4607,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+2008,"NAD27(CGQ77) / SCoPQ zone 2",9001,4609,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2009,"NAD27(CGQ77) / SCoPQ zone 3",9001,4609,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2010,"NAD27(CGQ77) / SCoPQ zone 4",9001,4609,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2011,"NAD27(CGQ77) / SCoPQ zone 5",9001,4609,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2012,"NAD27(CGQ77) / SCoPQ zone 6",9001,4609,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2013,"NAD27(CGQ77) / SCoPQ zone 7",9001,4609,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2014,"NAD27(CGQ77) / SCoPQ zone 8",9001,4609,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2015,"NAD27(CGQ77) / SCoPQ zone 9",9001,4609,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2016,"NAD27(CGQ77) / SCoPQ zone 10",9001,4609,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2017,"NAD27(76) / MTM zone 8",9001,4608,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2018,"NAD27(76) / MTM zone 9",9001,4608,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2019,"NAD27(76) / MTM zone 10",9001,4608,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2020,"NAD27(76) / MTM zone 11",9001,4608,17711,9807,8801,0.0,9110,8802,-82.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2021,"NAD27(76) / MTM zone 12",9001,4608,17712,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2022,"NAD27(76) / MTM zone 13",9001,4608,17713,9807,8801,0.0,9102,8802,-84.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2023,"NAD27(76) / MTM zone 14",9001,4608,17714,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2024,"NAD27(76) / MTM zone 15",9001,4608,17715,9807,8801,0.0,9102,8802,-90.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2025,"NAD27(76) / MTM zone 16",9001,4608,17716,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2026,"NAD27(76) / MTM zone 17",9001,4608,17717,9807,8801,0.0,9102,8802,-96.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2027,"NAD27(76) / UTM zone 15N",9001,4608,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2028,"NAD27(76) / UTM zone 16N",9001,4608,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2029,"NAD27(76) / UTM zone 17N",9001,4608,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2030,"NAD27(76) / UTM zone 18N",9001,4608,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2031,"NAD27(CGQ77) / UTM zone 17N",9001,4609,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2032,"NAD27(CGQ77) / UTM zone 18N",9001,4609,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2033,"NAD27(CGQ77) / UTM zone 19N",9001,4609,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2034,"NAD27(CGQ77) / UTM zone 20N",9001,4609,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2035,"NAD27(CGQ77) / UTM zone 21N",9001,4609,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2036,"NAD83(CSRS98) / New Brunswick Stereo",9001,4140,19946,9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,2500000.0,9001,8807,7500000.0,9001,,,,,,
+2037,"NAD83(CSRS98) / UTM zone 19N",9001,4140,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2038,"NAD83(CSRS98) / UTM zone 20N",9001,4140,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2039,"Israel / Israeli TM Grid",9001,4141,18204,9807,8801,31.4403817,9110,8802,35.1216261,9110,8805,1.0000067,9201,8806,219529.584,9001,8807,626907.39,9001,,,,,,
+2040,"Locodjo 1965 / UTM zone 30N",9001,4142,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2041,"Abidjan 1987 / UTM zone 30N",9001,4143,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2042,"Locodjo 1965 / UTM zone 29N",9001,4142,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2043,"Abidjan 1987 / UTM zone 29N",9001,4143,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2044,"Hanoi 1972 / Gauss-Kruger zone 18",9001,4147,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2045,"Hanoi 1972 / Gauss-Kruger zone 19",9001,4147,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2046,"Hartebeesthoek94 / Lo15",9001,4148,17515,9808,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2047,"Hartebeesthoek94 / Lo17",9001,4148,17517,9808,8801,0.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2048,"Hartebeesthoek94 / Lo19",9001,4148,17519,9808,8801,0.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2049,"Hartebeesthoek94 / Lo21",9001,4148,17521,9808,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2050,"Hartebeesthoek94 / Lo23",9001,4148,17523,9808,8801,0.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2051,"Hartebeesthoek94 / Lo25",9001,4148,17525,9808,8801,0.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2052,"Hartebeesthoek94 / Lo27",9001,4148,17527,9808,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2053,"Hartebeesthoek94 / Lo29",9001,4148,17529,9808,8801,0.0,9102,8802,29.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2054,"Hartebeesthoek94 / Lo31",9001,4148,17531,9808,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2055,"Hartebeesthoek94 / Lo33",9001,4148,17533,9808,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2056,"CH1903+ / LV95",9001,4150,19950,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,2600000.0,9001,8817,1200000.0,9001
+2057,"Rassadiran / Nakhl e Taqi",9001,4153,19951,9815,8811,27.31077837,9110,8812,52.3612741,9110,8813,0.34179803,9110,8814,0.34179803,9110,8815,0.999895934,9201,8816,658377.437,9001,8817,3044969.194,9001
+2058,"ED50(ED77) / UTM zone 38N",9001,4154,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2059,"ED50(ED77) / UTM zone 39N",9001,4154,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2060,"ED50(ED77) / UTM zone 40N",9001,4154,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2061,"ED50(ED77) / UTM zone 41N",9001,4154,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2062,"Madrid 1870 (Madrid) / Spain",9001,4903,19921,9801,8801,40.0,9102,8802,0.0,9102,8805,0.9988085293,9201,8806,600000.0,9001,8807,600000.0,9001,,,,,,
+2063,"Dabola 1981 / UTM zone 28N",9001,4315,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2064,"Dabola 1981 / UTM zone 29N",9001,4315,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2065,"S-JTSK (Ferro) / Krovak",9001,4818,19952,9819,8811,49.3,9110,8812,42.3,9110,8813,30.1717303,9110,8816,0.0,9001,8817,0.0,9001,8818,78.3,9110,8819,0.9999,9201
+2066,"Mount Dillon / Tobago Grid",9039,4157,19924,9806,8801,11.1507843,9110,8802,-60.4109632,9110,8806,187500.0,9039,8807,180000.0,9039,,,,,,,,,
+2067,"Naparima 1955 / UTM zone 20N",9001,4158,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2068,"ELD79 / Libya zone 5",9001,4159,18240,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2069,"ELD79 / Libya zone 6",9001,4159,18241,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2070,"ELD79 / Libya zone 7",9001,4159,18242,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2071,"ELD79 / Libya zone 8",9001,4159,18243,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2072,"ELD79 / Libya zone 9",9001,4159,18244,9807,8801,0.0,9102,8802,17.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2073,"ELD79 / Libya zone 10",9001,4159,18245,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2074,"ELD79 / Libya zone 11",9001,4159,18246,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2075,"ELD79 / Libya zone 12",9001,4159,18247,9807,8801,0.0,9102,8802,23.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2076,"ELD79 / Libya zone 13",9001,4159,18248,9807,8801,0.0,9102,8802,25.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2077,"ELD79 / UTM zone 32N",9001,4159,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2078,"ELD79 / UTM zone 33N",9001,4159,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2079,"ELD79 / UTM zone 34N",9001,4159,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2080,"ELD79 / UTM zone 35N",9001,4159,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2081,"Chos Malal 1914 / Argentina zone 2",9001,4160,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2082,"Pampa del Castillo / Argentina zone 2",9001,4161,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2083,"Hito XVIII 1963 / Argentina zone 2",9001,4254,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2084,"Hito XVIII 1963 / UTM zone 19S",9001,4254,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2085,"NAD27 / Cuba Norte",9001,4267,18061,9801,8801,22.21,9110,8802,-81.0,9110,8805,0.99993602,9201,8806,500000.0,9001,8807,280296.016,9001,,,,,,
+2086,"NAD27 / Cuba Sur",9001,4267,18062,9801,8801,20.43,9110,8802,-76.5,9110,8805,0.99994848,9201,8806,500000.0,9001,8807,229126.939,9001,,,,,,
+2087,"ELD79 / TM 12 NE",9001,4159,16412,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2088,"Carthage / TM 11 NE",9001,4223,16411,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2089,"Yemen NGN96 / UTM zone 38N",9001,4163,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2090,"Yemen NGN96 / UTM zone 39N",9001,4163,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2091,"South Yemen / Gauss Kruger zone 8",9001,4164,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2092,"South Yemen / Gauss Kruger zone 9",9001,4164,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2093,"Hanoi 1972 / GK 106 NE",9001,4147,16586,9807,8801,0.0,9102,8802,106.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2094,"WGS 72BE / TM 106 NE",9001,4324,16506,9807,8801,0.0,9102,8802,106.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2095,"Bissau / UTM zone 28N",9001,4165,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2096,"Korean 1985 / Korea East Belt",9001,4162,18251,9807,8801,38.0,9102,8802,129.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+2097,"Korean 1985 / Korea Central Belt",9001,4162,18252,9807,8801,38.0,9102,8802,127.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+2098,"Korean 1985 / Korea West Belt",9001,4162,18253,9807,8801,38.0,9102,8802,125.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+2099,"Qatar 1948 / Qatar Grid",9001,4286,19953,9806,8801,25.22565,9110,8802,50.4541,9110,8806,100000.0,9001,8807,100000.0,9001,,,,,,,,,
+2100,"GGRS87 / Greek Grid",9001,4121,19930,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2101,"Lake / Maracaibo Grid M1",9001,4249,18260,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,0.0,9001,8807,-52684.972,9001,,,,,,
+2102,"Lake / Maracaibo Grid",9001,4249,18261,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,200000.0,9001,8807,147315.028,9001,,,,,,
+2103,"Lake / Maracaibo Grid M3",9001,4249,18262,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,500000.0,9001,8807,447315.028,9001,,,,,,
+2104,"Lake / Maracaibo La Rosa Grid",9001,4249,18263,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,-17044.0,9001,8807,-23139.97,9001,,,,,,
+2105,"NZGD2000 / Mount Eden Circuit 2000",9001,4167,17931,9807,8801,-36.5247,9110,8802,174.4551,9110,8805,0.9999,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2106,"NZGD2000 / Bay of Plenty Circuit 2000",9001,4167,17932,9807,8801,-37.454,9110,8802,176.2758,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2107,"NZGD2000 / Poverty Bay Circuit 2000",9001,4167,17933,9807,8801,-38.3728,9110,8802,177.5308,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2108,"NZGD2000 / Hawkes Bay Circuit 2000",9001,4167,17934,9807,8801,-39.3903,9110,8802,176.4025,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2109,"NZGD2000 / Taranaki Circuit 2000",9001,4167,17935,9807,8801,-39.0808,9110,8802,174.134,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2110,"NZGD2000 / Tuhirangi Circuit 2000",9001,4167,17936,9807,8801,-39.3044,9110,8802,175.3824,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2111,"NZGD2000 / Wanganui Circuit 2000",9001,4167,17937,9807,8801,-40.1431,9110,8802,175.2917,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2112,"NZGD2000 / Wairarapa Circuit 2000",9001,4167,17938,9807,8801,-40.5531,9110,8802,175.385,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2113,"NZGD2000 / Wellington Circuit 2000",9001,4167,17939,9807,8801,-41.1804,9110,8802,174.4635,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2114,"NZGD2000 / Collingwood Circuit 2000",9001,4167,17940,9807,8801,-40.4253,9110,8802,172.4019,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2115,"NZGD2000 / Nelson Circuit 2000",9001,4167,17941,9807,8801,-41.1628,9110,8802,173.1757,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2116,"NZGD2000 / Karamea Circuit 2000",9001,4167,17942,9807,8801,-41.1723,9110,8802,172.0632,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2117,"NZGD2000 / Buller Circuit 2000",9001,4167,17943,9807,8801,-41.4838,9110,8802,171.3452,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2118,"NZGD2000 / Grey Circuit 2000",9001,4167,17944,9807,8801,-42.2001,9110,8802,171.3259,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2119,"NZGD2000 / Amuri Circuit 2000",9001,4167,17945,9807,8801,-42.412,9110,8802,173.0036,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2120,"NZGD2000 / Marlborough Circuit 2000",9001,4167,17946,9807,8801,-41.324,9110,8802,173.4807,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2121,"NZGD2000 / Hokitika Circuit 2000",9001,4167,17947,9807,8801,-42.531,9110,8802,170.5847,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2122,"NZGD2000 / Okarito Circuit 2000",9001,4167,17948,9807,8801,-43.0636,9110,8802,170.1539,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2123,"NZGD2000 / Jacksons Bay Circuit 2000",9001,4167,17949,9807,8801,-43.584,9110,8802,168.3622,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2124,"NZGD2000 / Mount Pleasant Circuit 2000",9001,4167,17950,9807,8801,-43.3526,9110,8802,172.4337,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2125,"NZGD2000 / Gawler Circuit 2000",9001,4167,17951,9807,8801,-43.4455,9110,8802,171.2138,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2126,"NZGD2000 / Timaru Circuit 2000",9001,4167,17952,9807,8801,-44.2407,9110,8802,171.0326,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2127,"NZGD2000 / Lindis Peak Circuit 2000",9001,4167,17953,9807,8801,-44.4406,9110,8802,169.2803,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2128,"NZGD2000 / Mount Nicholas Circuit 2000",9001,4167,17954,9807,8801,-45.0758,9110,8802,168.2355,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2129,"NZGD2000 / Mount York Circuit 2000",9001,4167,17955,9807,8801,-45.3349,9110,8802,167.4419,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2130,"NZGD2000 / Observation Point Circuit 2000",9001,4167,17956,9807,8801,-45.4858,9110,8802,170.3742,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2131,"NZGD2000 / North Taieri Circuit 2000",9001,4167,17957,9807,8801,-45.5141,9110,8802,170.1657,9110,8805,0.99996,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2132,"NZGD2000 / Bluff Circuit 2000",9001,4167,17958,9807,8801,-46.36,9110,8802,168.2034,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2133,"NZGD2000 / UTM zone 58S",9001,4167,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2134,"NZGD2000 / UTM zone 59S",9001,4167,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2135,"NZGD2000 / UTM zone 60S",9001,4167,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2136,"Accra / Ghana National Grid",9094,4168,19959,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,900000.0,9094,8807,0.0,9094,,,,,,
+2137,"Accra / TM 1 NW",9001,4168,17001,9807,8801,0.0,9102,8802,-1.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2138,"NAD27(CGQ77) / Quebec Lambert",9001,4609,19944,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+2139,"NAD83(CSRS98) / SCoPQ zone 2",9001,4140,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2140,"NAD83(CSRS98) / MTM zone 3",9001,4140,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2141,"NAD83(CSRS98) / MTM zone 4",9001,4140,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2142,"NAD83(CSRS98) / MTM zone 5",9001,4140,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2143,"NAD83(CSRS98) / MTM zone 6",9001,4140,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2144,"NAD83(CSRS98) / MTM zone 7",9001,4140,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2145,"NAD83(CSRS98) / MTM zone 8",9001,4140,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2146,"NAD83(CSRS98) / MTM zone 9",9001,4140,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2147,"NAD83(CSRS98) / MTM zone 10",9001,4140,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2148,"NAD83(CSRS98) / UTM zone 21N",9001,4140,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2149,"NAD83(CSRS98) / UTM zone 18N",9001,4140,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2150,"NAD83(CSRS98) / UTM zone 17N",9001,4140,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2151,"NAD83(CSRS98) / UTM zone 13N",9001,4140,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2152,"NAD83(CSRS98) / UTM zone 12N",9001,4140,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2153,"NAD83(CSRS98) / UTM zone 11N",9001,4140,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2154,"RGF93 / Lambert-93",9001,4171,18085,9802,8821,46.3,9110,8822,3.0,9110,8823,49.0,9110,8824,44.0,9110,8826,700000.0,9001,8827,6600000.0,9001,,,
+2155,"American Samoa 1962 / American Samoa Lambert",9003,4169,15300,9801,8801,-14.16,9110,8802,170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+2156,"NAD83(HARN) / UTM zone 59S",9001,4152,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2157,"IRENET95 / Irish Transverse Mercator",9001,4173,19962,9807,8801,53.3,9110,8802,-8.0,9110,8805,0.99982,9201,8806,600000.0,9001,8807,750000.0,9001,,,,,,
+2158,"IRENET95 / UTM zone 29N",9001,4173,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2159,"Sierra Leone 1924 / New Colony Grid",9094,4174,19963,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,500000.0,9094,8807,0.0,9094,,,,,,
+2160,"Sierra Leone 1924 / New War Office Grid",9094,4174,19964,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,800000.0,9094,8807,600000.0,9094,,,,,,
+2161,"Sierra Leone 1968 / UTM zone 28N",9001,4175,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2162,"Sierra Leone 1968 / UTM zone 29N",9001,4175,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2163,US National Atlas Equal Area,9001,4047,19965,9821,8806,0.0,9001,8807,0.0,9001,8828,45.0,9102,8829,-100.0,9102,,,,,,,,,
+2164,"Locodjo 1965 / TM 5 NW",9001,4142,17005,9807,8801,0.0,9102,8802,-5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2165,"Abidjan 1987 / TM 5 NW",9001,4143,17005,9807,8801,0.0,9102,8802,-5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2166,"Pulkovo 1942(83) / Gauss Kruger zone 3",9001,4178,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+2167,"Pulkovo 1942(83) / Gauss Kruger zone 4",9001,4178,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2168,"Pulkovo 1942(83) / Gauss Kruger zone 5",9001,4178,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2169,"Luxembourg 1930 / Gauss",9001,4181,19966,9807,8801,49.5,9110,8802,6.1,9110,8805,1.0,9201,8806,80000.0,9001,8807,100000.0,9001,,,,,,
+2170,"MGI / Slovenia Grid",9001,4312,19967,9807,8801,0.0,9110,8802,15.0,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2171,"Pulkovo 1942(58) / Poland zone I",9001,4179,18281,9809,8801,50.373,9110,8802,21.05,9110,8805,0.9998,9201,8806,4637000.0,9001,8807,5647000.0,9001,,,,,,
+2172,"Pulkovo 1942(58) / Poland zone II",9001,4179,18282,9809,8801,53.0007,9110,8802,21.301,9110,8805,0.9998,9201,8806,4603000.0,9001,8807,5806000.0,9001,,,,,,
+2173,"Pulkovo 1942(58) / Poland zone III",9001,4179,18283,9809,8801,53.35,9110,8802,17.003,9110,8805,0.9998,9201,8806,3501000.0,9001,8807,5999000.0,9001,,,,,,
+2174,"Pulkovo 1942(58) / Poland zone IV",9001,4179,18284,9809,8801,51.4015,9110,8802,16.402,9110,8805,0.9998,9201,8806,3703000.0,9001,8807,5627000.0,9001,,,,,,
+2175,"Pulkovo 1942(58) / Poland zone V",9001,4179,18285,9807,8801,0.0,9110,8802,18.573,9110,8805,0.999983,9201,8806,237000.0,9001,8807,-4700000.0,9001,,,,,,
+2176,"ETRS89 / Poland CS2000 zone 5",9001,4258,18305,9807,8801,0.0,9102,8802,15.0,9102,8805,0.999923,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2177,"ETRS89 / Poland CS2000 zone 6",9001,4258,18306,9807,8801,0.0,9102,8802,18.0,9102,8805,0.999923,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+2178,"ETRS89 / Poland CS2000 zone 7",9001,4258,18307,9807,8801,0.0,9102,8802,21.0,9102,8805,0.999923,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+2179,"ETRS89 / Poland CS2000 zone 8",9001,4258,18308,9807,8801,0.0,9102,8802,24.0,9102,8805,0.999923,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2180,"ETRS89 / Poland CS92",9001,4258,18300,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9993,9201,8806,500000.0,9001,8807,-5300000.0,9001,,,,,,
+2188,"Azores Occidental 1939 / UTM zone 25N",9001,4182,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2189,"Azores Central 1948 / UTM zone 26N",9001,4183,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2190,"Azores Oriental 1940 / UTM zone 26N",9001,4184,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2191,"Madeira 1936 / UTM zone 28N",9001,4185,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2192,"ED50 / France EuroLambert",9001,4230,18086,9801,8801,46.48,9110,8802,2.2014025,9110,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+2193,"NZGD2000 / New Zealand Transverse Mercator",9001,4167,19971,9807,8801,0.0,9102,8802,173.0,9102,8805,0.9996,9201,8806,1600000.0,9001,8807,10000000.0,9001,,,,,,
+2194,"American Samoa 1962 / American Samoa Lambert",9003,4169,15301,9801,8801,-14.16,9110,8802,-170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+2195,"NAD83(HARN) / UTM zone 2S",9001,4152,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2196,"ETRS89 / Kp2000 Jutland",9001,4258,18401,9807,8801,0.0,9110,8802,9.3,9110,8805,0.99995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2197,"ETRS89 / Kp2000 Zealand",9001,4258,18402,9807,8801,0.0,9102,8802,12.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2198,"ETRS89 / Kp2000 Bornholm",9001,4258,18403,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+2199,"Albanian 1987 / Gauss Kruger zone 4",9001,4191,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2200,"ATS77 / New Brunswick Stereographic (ATS77)",9001,4122,19945,9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,300000.0,9001,8807,800000.0,9001,,,,,,
+2201,"REGVEN / UTM zone 18N",9001,4189,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2202,"REGVEN / UTM zone 19N",9001,4189,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2203,"REGVEN / UTM zone 20N",9001,4189,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2204,"NAD27 / Tennessee",9003,4267,15302,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,2000000.0,9003,8827,100000.0,9003,,,
+2205,"NAD83 / Kentucky North",9001,4269,15303,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2206,"ED50 / 3-degree Gauss-Kruger zone 9",9001,4230,16269,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2207,"ED50 / 3-degree Gauss-Kruger zone 10",9001,4230,16270,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+2208,"ED50 / 3-degree Gauss-Kruger zone 11",9001,4230,16271,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+2209,"ED50 / 3-degree Gauss-Kruger zone 12",9001,4230,16272,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+2210,"ED50 / 3-degree Gauss-Kruger zone 13",9001,4230,16273,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2211,"ED50 / 3-degree Gauss-Kruger zone 14",9001,4230,16274,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2212,"ED50 / 3-degree Gauss-Kruger zone 15",9001,4230,16275,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2213,"ETRS89 / TM 30 NE",9001,4258,16430,9807,8801,0.0,9102,8802,30.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2214,"Douala 1948 / AOF west",9001,4192,18415,9807,8801,0.0,9110,8802,10.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+2215,"Manoca 1962 / UTM zone 32N",9001,4193,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2216,"Qornoq 1927 / UTM zone 22N",9001,4194,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2217,"Qornoq 1927 / UTM zone 23N",9001,4194,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2218,"Scoresbysund 1952 / Greenland zone 5 east",9001,4195,18425,9826,8801,70.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2219,"ATS77 / UTM zone 19N",9001,4122,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2220,"ATS77 / UTM zone 20N",9001,4122,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2221,"Scoresbysund 1952 / Greenland zone 6 east",9001,4195,18426,9826,8801,67.3,9110,8802,-32.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2222,"NAD83 / Arizona East (ft)",9002,4269,15304,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2223,"NAD83 / Arizona Central (ft)",9002,4269,15305,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2224,"NAD83 / Arizona West (ft)",9002,4269,15306,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2225,"NAD83 / California zone 1 (ftUS)",9003,4269,15307,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2226,"NAD83 / California zone 2 (ftUS)",9003,4269,15308,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2227,"NAD83 / California zone 3 (ftUS)",9003,4269,15309,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2228,"NAD83 / California zone 4 (ftUS)",9003,4269,15310,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2229,"NAD83 / California zone 5 (ftUS)",9003,4269,15311,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2230,"NAD83 / California zone 6 (ftUS)",9003,4269,15312,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2231,"NAD83 / Colorado North (ftUS)",9003,4269,15313,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2232,"NAD83 / Colorado Central (ftUS)",9003,4269,15314,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2233,"NAD83 / Colorado South (ftUS)",9003,4269,15315,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2234,"NAD83 / Connecticut (ftUS)",9003,4269,15316,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,1000000.0,9003,8827,500000.0,9003,,,
+2235,"NAD83 / Delaware (ftUS)",9003,4269,15317,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2236,"NAD83 / Florida East (ftUS)",9003,4269,15318,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2237,"NAD83 / Florida West (ftUS)",9003,4269,15319,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2238,"NAD83 / Florida North (ftUS)",9003,4269,15320,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2239,"NAD83 / Georgia East (ftUS)",9003,4269,15321,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2240,"NAD83 / Georgia West (ftUS)",9003,4269,15322,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2241,"NAD83 / Idaho East (ftUS)",9003,4269,15323,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2242,"NAD83 / Idaho Central (ftUS)",9003,4269,15324,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2243,"NAD83 / Idaho West (ftUS)",9003,4269,15325,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,2624666.667,9003,8807,0.0,9003,,,,,,
+2244,"NAD83 / Indiana East (ftUS)",9003,4269,15326,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,328083.333,9003,8807,818125.0,9003,,,,,,
+2245,"NAD83 / Indiana West (ftUS)",9003,4269,15327,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,2952750.0,9003,8807,818125.0,9003,,,,,,
+2246,"NAD83 / Kentucky North (ftUS)",9003,4269,15328,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2247,"NAD83 / Kentucky South (ftUS)",9003,4269,15329,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,1640416.667,9003,8827,1640416.667,9003,,,
+2248,"NAD83 / Maryland (ftUS)",9003,4269,15330,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,1312333.333,9003,8827,0.0,9003,,,
+2249,"NAD83 / Massachusetts Mainland (ftUS)",9003,4269,15331,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,656166.667,9003,8827,2460625.0,9003,,,
+2250,"NAD83 / Massachusetts Island (ftUS)",9003,4269,15332,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2251,"NAD83 / Michigan North (ft)",9002,4269,15333,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,26246719.16,9002,8827,0.0,9002,,,
+2252,"NAD83 / Michigan Central (ft)",9002,4269,15334,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,19685039.37,9002,8827,0.0,9002,,,
+2253,"NAD83 / Michigan South (ft)",9002,4269,15335,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,13123359.58,9002,8827,0.0,9002,,,
+2254,"NAD83 / Mississippi East (ftUS)",9003,4269,15336,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,984250.0,9003,8807,0.0,9003,,,,,,
+2255,"NAD83 / Mississippi West (ftUS)",9003,4269,15337,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2256,"NAD83 / Montana (ft)",9002,4269,15338,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2257,"NAD83 / New Mexico East (ftUS)",9003,4269,15339,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,541337.5,9003,8807,0.0,9003,,,,,,
+2258,"NAD83 / New Mexico Central (ftUS)",9003,4269,15340,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2259,"NAD83 / New Mexico West (ftUS)",9003,4269,15341,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,2723091.667,9003,8807,0.0,9003,,,,,,
+2260,"NAD83 / New York East (ftUS)",9003,4269,15342,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,492125.0,9003,8807,0.0,9003,,,,,,
+2261,"NAD83 / New York Central (ftUS)",9003,4269,15343,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,820208.333,9003,8807,0.0,9003,,,,,,
+2262,"NAD83 / New York West (ftUS)",9003,4269,15344,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,1148291.667,9003,8807,0.0,9003,,,,,,
+2263,"NAD83 / New York Long Island (ftUS)",9003,4269,15345,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,984250.0,9003,8827,0.0,9003,,,
+2264,"NAD83 / North Carolina (ftUS)",9003,4269,15346,9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+2265,"NAD83 / North Dakota North (ft)",9002,4269,15347,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2266,"NAD83 / North Dakota South (ft)",9002,4269,15348,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2267,"NAD83 / Oklahoma North (ftUS)",9003,4269,15349,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2268,"NAD83 / Oklahoma South (ftUS)",9003,4269,15350,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2269,"NAD83 / Oregon North (ft)",9002,4269,15351,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,8202099.738,9002,8827,0.0,9002,,,
+2270,"NAD83 / Oregon South (ft)",9002,4269,15352,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,4921259.843,9002,8827,0.0,9002,,,
+2271,"NAD83 / Pennsylvania North (ftUS)",9003,4269,15353,9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2272,"NAD83 / Pennsylvania South (ftUS)",9003,4269,15354,9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2273,"NAD83 / South Carolina (ft)",9002,4269,15355,9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,2000000.0,9002,8827,0.0,9002,,,
+2274,"NAD83 / Tennessee (ftUS)",9003,4269,15356,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2275,"NAD83 / Texas North (ftUS)",9003,4269,15357,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,656166.667,9003,8827,3280833.333,9003,,,
+2276,"NAD83 / Texas North Central (ftUS)",9003,4269,15358,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,1968500.0,9003,8827,6561666.667,9003,,,
+2277,"NAD83 / Texas Central (ftUS)",9003,4269,15359,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,2296583.333,9003,8827,9842500.0,9003,,,
+2278,"NAD83 / Texas South Central (ftUS)",9003,4269,15360,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,1968500.0,9003,8827,13123333.333,9003,,,
+2279,"NAD83 / Texas South (ftUS)",9003,4269,15361,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,984250.0,9003,8827,16404166.667,9003,,,
+2280,"NAD83 / Utah North (ft)",9002,4269,15362,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,1640419.948,9002,8827,3280839.895,9002,,,
+2281,"NAD83 / Utah Central (ft)",9002,4269,15363,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,1640419.948,9002,8827,6561679.79,9002,,,
+2282,"NAD83 / Utah South (ft)",9002,4269,15364,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,1640419.948,9002,8827,9842519.685,9002,,,
+2283,"NAD83 / Virginia North (ftUS)",9003,4269,15365,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,11482916.667,9003,8827,6561666.667,9003,,,
+2284,"NAD83 / Virginia South (ftUS)",9003,4269,15366,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,11482916.667,9003,8827,3280833.333,9003,,,
+2285,"NAD83 / Washington North (ftUS)",9003,4269,15367,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2286,"NAD83 / Washington South (ftUS)",9003,4269,15368,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2287,"NAD83 / Wisconsin North (ftUS)",9003,4269,15369,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2288,"NAD83 / Wisconsin Central (ftUS)",9003,4269,15370,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2289,"NAD83 / Wisconsin South (ftUS)",9003,4269,15371,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2290,"ATS77 / Prince Edward Isl. Stereographic (ATS77)",9001,4122,19933,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,700000.0,9001,8807,400000.0,9001,,,,,,
+2291,"NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83)",9001,4122,19960,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2292,"NAD83(CSRS98) / Prince Edward Isl. Stereographic (NAD83)",9001,4140,19960,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2294,"ATS77 / MTM Nova Scotia zone 4",9001,4122,17794,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2295,"ATS77 / MTM Nova Scotia zone 5",9001,4122,17795,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2296,"Ammassalik 1958 / Greenland zone 7 east",9001,4196,18427,9826,8801,64.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2297,"Qornoq 1927 / Greenland zone 1 east",9001,4194,18421,9826,8801,82.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2298,"Qornoq 1927 / Greenland zone 2 east",9001,4194,18422,9826,8801,79.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2299,"Qornoq 1927 / Greenland zone 2 west",9001,4194,18432,9826,8801,79.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2300,"Qornoq 1927 / Greenland zone 3 east",9001,4194,18423,9826,8801,76.3,9110,8802,-20.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2301,"Qornoq 1927 / Greenland zone 3 west",9001,4194,18433,9826,8801,76.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2302,"Qornoq 1927 / Greenland zone 4 east",9001,4194,18424,9826,8801,73.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2303,"Qornoq 1927 / Greenland zone 4 west",9001,4194,18434,9826,8801,73.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2304,"Qornoq 1927 / Greenland zone 5 west",9001,4194,18435,9826,8801,70.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2305,"Qornoq 1927 / Greenland zone 6 west",9001,4194,18436,9826,8801,67.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2306,"Qornoq 1927 / Greenland zone 7 west",9001,4194,18437,9826,8801,64.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2307,"Qornoq 1927 / Greenland zone 8 east",9001,4194,18428,9826,8801,61.3,9110,8802,-48.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2308,"Batavia / TM 109 SE",9001,4211,16709,9807,8801,0.0,9102,8802,109.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2309,"WGS 84 / TM 116 SE",9001,4326,16716,9807,8801,0.0,9102,8802,116.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2310,"WGS 84 / TM 132 SE",9001,4326,16732,9807,8801,0.0,9102,8802,132.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2311,"WGS 84 / TM 6 NE",9001,4326,16406,9807,8801,0.0,9102,8802,6.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2312,"Garoua / UTM zone 33N",9001,4197,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2313,"Kousseri / UTM zone 33N",9001,4198,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2314,"Trinidad 1903 / Trinidad Grid (ftCla)",9005,4302,19975,9806,8801,10.263,9110,8802,-61.2,9110,8806,283800.0,9005,8807,214500.0,9005,,,,,,,,,
+2315,"Campo Inchauspe / UTM zone 19S",9001,4221,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2316,"Campo Inchauspe / UTM zone 20S",9001,4221,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2317,"PSAD56 / ICN Regional",9001,4248,19976,9802,8821,6.0,9102,8822,-66.0,9102,8823,9.0,9102,8824,3.0,9102,8826,1000000.0,9001,8827,1000000.0,9001,,,
+2318,"Ain el Abd / Aramco Lambert",9001,4204,19977,9802,8821,25.0522236,9110,8822,48.0,9102,8823,17.0,9102,8824,33.0,9102,8826,0.0,9001,8827,0.0,9001,,,
+2319,"ED50 / TM27",9001,4230,16369,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2320,"ED50 / TM30",9001,4230,16370,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2321,"ED50 / TM33",9001,4230,16371,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2322,"ED50 / TM36",9001,4230,16372,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2323,"ED50 / TM39",9001,4230,16373,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2324,"ED50 / TM42",9001,4230,16374,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2325,"ED50 / TM45",9001,4230,16375,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2326,Hong Kong 1980 Grid System,9001,4611,19978,9807,8801,22.184368,9110,8802,114.10428,9110,8805,1.0,9201,8806,836694.05,9001,8807,819069.8,9001,,,,,,
+2327,"Xian 1980 / Gauss-Kruger zone 13",9001,4610,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2328,"Xian 1980 / Gauss-Kruger zone 14",9001,4610,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2329,"Xian 1980 / Gauss-Kruger zone 15",9001,4610,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2330,"Xian 1980 / Gauss-Kruger zone 16",9001,4610,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+2331,"Xian 1980 / Gauss-Kruger zone 17",9001,4610,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+2332,"Xian 1980 / Gauss-Kruger zone 18",9001,4610,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2333,"Xian 1980 / Gauss-Kruger zone 19",9001,4610,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2334,"Xian 1980 / Gauss-Kruger zone 20",9001,4610,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+2335,"Xian 1980 / Gauss-Kruger zone 21",9001,4610,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+2336,"Xian 1980 / Gauss-Kruger zone 22",9001,4610,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+2337,"Xian 1980 / Gauss-Kruger zone 23",9001,4610,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+2338,"Xian 1980 / Gauss-Kruger CM 75E",9001,4610,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2339,"Xian 1980 / Gauss-Kruger CM 81E",9001,4610,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2340,"Xian 1980 / Gauss-Kruger CM 87E",9001,4610,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2341,"Xian 1980 / Gauss-Kruger CM 93E",9001,4610,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2342,"Xian 1980 / Gauss-Kruger CM 99E",9001,4610,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2343,"Xian 1980 / Gauss-Kruger CM 105E",9001,4610,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2344,"Xian 1980 / Gauss-Kruger CM 111E",9001,4610,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2345,"Xian 1980 / Gauss-Kruger CM 117E",9001,4610,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2346,"Xian 1980 / Gauss-Kruger CM 123E",9001,4610,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2347,"Xian 1980 / Gauss-Kruger CM 129E",9001,4610,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2348,"Xian 1980 / Gauss-Kruger CM 135E",9001,4610,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2349,"Xian 1980 / 3-degree Gauss-Kruger zone 25",9001,4610,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2350,"Xian 1980 / 3-degree Gauss-Kruger zone 26",9001,4610,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2351,"Xian 1980 / 3-degree Gauss-Kruger zone 27",9001,4610,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2352,"Xian 1980 / 3-degree Gauss-Kruger zone 28",9001,4610,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2353,"Xian 1980 / 3-degree Gauss-Kruger zone 29",9001,4610,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2354,"Xian 1980 / 3-degree Gauss-Kruger zone 30",9001,4610,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2355,"Xian 1980 / 3-degree Gauss-Kruger zone 31",9001,4610,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2356,"Xian 1980 / 3-degree Gauss-Kruger zone 32",9001,4610,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2357,"Xian 1980 / 3-degree Gauss-Kruger zone 33",9001,4610,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2358,"Xian 1980 / 3-degree Gauss-Kruger zone 34",9001,4610,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2359,"Xian 1980 / 3-degree Gauss-Kruger zone 35",9001,4610,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2360,"Xian 1980 / 3-degree Gauss-Kruger zone 36",9001,4610,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2361,"Xian 1980 / 3-degree Gauss-Kruger zone 37",9001,4610,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2362,"Xian 1980 / 3-degree Gauss-Kruger zone 38",9001,4610,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2363,"Xian 1980 / 3-degree Gauss-Kruger zone 39",9001,4610,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2364,"Xian 1980 / 3-degree Gauss-Kruger zone 40",9001,4610,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2365,"Xian 1980 / 3-degree Gauss-Kruger zone 41",9001,4610,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2366,"Xian 1980 / 3-degree Gauss-Kruger zone 42",9001,4610,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2367,"Xian 1980 / 3-degree Gauss-Kruger zone 43",9001,4610,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2368,"Xian 1980 / 3-degree Gauss-Kruger zone 44",9001,4610,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2369,"Xian 1980 / 3-degree Gauss-Kruger zone 45",9001,4610,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2370,"Xian 1980 / 3-degree Gauss-Kruger CM 75E",9001,4610,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2371,"Xian 1980 / 3-degree Gauss-Kruger CM 78E",9001,4610,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2372,"Xian 1980 / 3-degree Gauss-Kruger CM 81E",9001,4610,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2373,"Xian 1980 / 3-degree Gauss-Kruger CM 84E",9001,4610,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2374,"Xian 1980 / 3-degree Gauss-Kruger CM 87E",9001,4610,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2375,"Xian 1980 / 3-degree Gauss-Kruger CM 90E",9001,4610,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2376,"Xian 1980 / 3-degree Gauss-Kruger CM 93E",9001,4610,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2377,"Xian 1980 / 3-degree Gauss-Kruger CM 96E",9001,4610,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2378,"Xian 1980 / 3-degree Gauss-Kruger CM 99E",9001,4610,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2379,"Xian 1980 / 3-degree Gauss-Kruger CM 102E",9001,4610,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2380,"Xian 1980 / 3-degree Gauss-Kruger CM 105E",9001,4610,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2381,"Xian 1980 / 3-degree Gauss-Kruger CM 108E",9001,4610,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2382,"Xian 1980 / 3-degree Gauss-Kruger CM 111E",9001,4610,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2383,"Xian 1980 / 3-degree Gauss-Kruger CM 114E",9001,4610,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2384,"Xian 1980 / 3-degree Gauss-Kruger CM 117E",9001,4610,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2385,"Xian 1980 / 3-degree Gauss-Kruger CM 120E",9001,4610,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2386,"Xian 1980 / 3-degree Gauss-Kruger CM 123E",9001,4610,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2387,"Xian 1980 / 3-degree Gauss-Kruger CM 126E",9001,4610,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2388,"Xian 1980 / 3-degree Gauss-Kruger CM 129E",9001,4610,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2389,"Xian 1980 / 3-degree Gauss-Kruger CM 132E",9001,4610,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2390,"Xian 1980 / 3-degree Gauss-Kruger CM 135E",9001,4610,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2391,"KKJ / Finland zone 1",9001,4123,18191,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+2392,"KKJ / Finland zone 2",9001,4123,18192,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+2393,"KKJ / Finland Uniform Coordinate System",9001,4123,18193,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+2394,"KKJ / Finland zone 4",9001,4123,18194,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2395,"South Yemen / Gauss-Kruger zone 8",9001,4164,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2396,"South Yemen / Gauss-Kruger zone 9",9001,4164,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2397,"Pulkovo 1942(83) / Gauss-Kruger zone 3",9001,4178,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+2398,"Pulkovo 1942(83) / Gauss-Kruger zone 4",9001,4178,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2399,"Pulkovo 1942(83) / Gauss-Kruger zone 5",9001,4178,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+2400,RT90 2.5 gon W,9001,4124,19929,9807,8801,0.0,9110,8802,15.48298,9110,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+2401,"Beijing 1954 / 3-degree Gauss-Kruger zone 25",9001,4214,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2402,"Beijing 1954 / 3-degree Gauss-Kruger zone 26",9001,4214,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2403,"Beijing 1954 / 3-degree Gauss-Kruger zone 27",9001,4214,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2404,"Beijing 1954 / 3-degree Gauss-Kruger zone 28",9001,4214,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2405,"Beijing 1954 / 3-degree Gauss-Kruger zone 29",9001,4214,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2406,"Beijing 1954 / 3-degree Gauss-Kruger zone 30",9001,4214,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2407,"Beijing 1954 / 3-degree Gauss-Kruger zone 31",9001,4214,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2408,"Beijing 1954 / 3-degree Gauss-Kruger zone 32",9001,4214,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2409,"Beijing 1954 / 3-degree Gauss-Kruger zone 33",9001,4214,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2410,"Beijing 1954 / 3-degree Gauss-Kruger zone 34",9001,4214,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2411,"Beijing 1954 / 3-degree Gauss-Kruger zone 35",9001,4214,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2412,"Beijing 1954 / 3-degree Gauss-Kruger zone 36",9001,4214,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2413,"Beijing 1954 / 3-degree Gauss-Kruger zone 37",9001,4214,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2414,"Beijing 1954 / 3-degree Gauss-Kruger zone 38",9001,4214,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2415,"Beijing 1954 / 3-degree Gauss-Kruger zone 39",9001,4214,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2416,"Beijing 1954 / 3-degree Gauss-Kruger zone 40",9001,4214,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2417,"Beijing 1954 / 3-degree Gauss-Kruger zone 41",9001,4214,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2418,"Beijing 1954 / 3-degree Gauss-Kruger zone 42",9001,4214,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2419,"Beijing 1954 / 3-degree Gauss-Kruger zone 43",9001,4214,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2420,"Beijing 1954 / 3-degree Gauss-Kruger zone 44",9001,4214,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2421,"Beijing 1954 / 3-degree Gauss-Kruger zone 45",9001,4214,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2422,"Beijing 1954 / 3-degree Gauss-Kruger CM 75E",9001,4214,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2423,"Beijing 1954 / 3-degree Gauss-Kruger CM 78E",9001,4214,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2424,"Beijing 1954 / 3-degree Gauss-Kruger CM 81E",9001,4214,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2425,"Beijing 1954 / 3-degree Gauss-Kruger CM 84E",9001,4214,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2426,"Beijing 1954 / 3-degree Gauss-Kruger CM 87E",9001,4214,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2427,"Beijing 1954 / 3-degree Gauss-Kruger CM 90E",9001,4214,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2428,"Beijing 1954 / 3-degree Gauss-Kruger CM 93E",9001,4214,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2429,"Beijing 1954 / 3-degree Gauss-Kruger CM 96E",9001,4214,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2430,"Beijing 1954 / 3-degree Gauss-Kruger CM 99E",9001,4214,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2431,"Beijing 1954 / 3-degree Gauss-Kruger CM 102E",9001,4214,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2432,"Beijing 1954 / 3-degree Gauss-Kruger CM 105E",9001,4214,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2433,"Beijing 1954 / 3-degree Gauss-Kruger CM 108E",9001,4214,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2434,"Beijing 1954 / 3-degree Gauss-Kruger CM 111E",9001,4214,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2435,"Beijing 1954 / 3-degree Gauss-Kruger CM 114E",9001,4214,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2436,"Beijing 1954 / 3-degree Gauss-Kruger CM 117E",9001,4214,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2437,"Beijing 1954 / 3-degree Gauss-Kruger CM 120E",9001,4214,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2438,"Beijing 1954 / 3-degree Gauss-Kruger CM 123E",9001,4214,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2439,"Beijing 1954 / 3-degree Gauss-Kruger CM 126E",9001,4214,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2440,"Beijing 1954 / 3-degree Gauss-Kruger CM 129E",9001,4214,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2441,"Beijing 1954 / 3-degree Gauss-Kruger CM 132E",9001,4214,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2442,"Beijing 1954 / 3-degree Gauss-Kruger CM 135E",9001,4214,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2443,"JGD2000 / Japan Plane Rectangular CS I",9001,4612,17801,9807,8801,33.0,9110,8802,129.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2444,"JGD2000 / Japan Plane Rectangular CS II",9001,4612,17802,9807,8801,33.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2445,"JGD2000 / Japan Plane Rectangular CS III",9001,4612,17803,9807,8801,36.0,9110,8802,132.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2446,"JGD2000 / Japan Plane Rectangular CS IV",9001,4612,17804,9807,8801,33.0,9110,8802,133.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2447,"JGD2000 / Japan Plane Rectangular CS V",9001,4612,17805,9807,8801,36.0,9110,8802,134.2,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2448,"JGD2000 / Japan Plane Rectangular CS VI",9001,4612,17806,9807,8801,36.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2449,"JGD2000 / Japan Plane Rectangular CS VII",9001,4612,17807,9807,8801,36.0,9110,8802,137.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2450,"JGD2000 / Japan Plane Rectangular CS VIII",9001,4612,17808,9807,8801,36.0,9110,8802,138.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2451,"JGD2000 / Japan Plane Rectangular CS IX",9001,4612,17809,9807,8801,36.0,9110,8802,139.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2452,"JGD2000 / Japan Plane Rectangular CS X",9001,4612,17810,9807,8801,40.0,9110,8802,140.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2453,"JGD2000 / Japan Plane Rectangular CS XI",9001,4612,17811,9807,8801,44.0,9110,8802,140.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2454,"JGD2000 / Japan Plane Rectangular CS XII",9001,4612,17812,9807,8801,44.0,9110,8802,142.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2455,"JGD2000 / Japan Plane Rectangular CS XIII",9001,4612,17813,9807,8801,44.0,9110,8802,144.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2456,"JGD2000 / Japan Plane Rectangular CS XIV",9001,4612,17814,9807,8801,26.0,9110,8802,142.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2457,"JGD2000 / Japan Plane Rectangular CS XV",9001,4612,17815,9807,8801,26.0,9110,8802,127.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2458,"JGD2000 / Japan Plane Rectangular CS XVI",9001,4612,17816,9807,8801,26.0,9110,8802,124.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2459,"JGD2000 / Japan Plane Rectangular CS XVII",9001,4612,17817,9807,8801,26.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2460,"JGD2000 / Japan Plane Rectangular CS XVIII",9001,4612,17818,9807,8801,20.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2461,"JGD2000 / Japan Plane Rectangular CS XIX",9001,4612,17819,9807,8801,26.0,9110,8802,154.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+2462,"Albanian 1987 / Gauss-Kruger zone 4",9001,4191,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+2463,"Pulkovo 1995 / Gauss-Kruger CM 21E",9001,4200,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2464,"Pulkovo 1995 / Gauss-Kruger CM 27E",9001,4200,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2465,"Pulkovo 1995 / Gauss-Kruger CM 33E",9001,4200,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2466,"Pulkovo 1995 / Gauss-Kruger CM 39E",9001,4200,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2467,"Pulkovo 1995 / Gauss-Kruger CM 45E",9001,4200,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2468,"Pulkovo 1995 / Gauss-Kruger CM 51E",9001,4200,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2469,"Pulkovo 1995 / Gauss-Kruger CM 57E",9001,4200,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2470,"Pulkovo 1995 / Gauss-Kruger CM 63E",9001,4200,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2471,"Pulkovo 1995 / Gauss-Kruger CM 69E",9001,4200,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2472,"Pulkovo 1995 / Gauss-Kruger CM 75E",9001,4200,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2473,"Pulkovo 1995 / Gauss-Kruger CM 81E",9001,4200,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2474,"Pulkovo 1995 / Gauss-Kruger CM 87E",9001,4200,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2475,"Pulkovo 1995 / Gauss-Kruger CM 93E",9001,4200,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2476,"Pulkovo 1995 / Gauss-Kruger CM 99E",9001,4200,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2477,"Pulkovo 1995 / Gauss-Kruger CM 105E",9001,4200,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2478,"Pulkovo 1995 / Gauss-Kruger CM 111E",9001,4200,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2479,"Pulkovo 1995 / Gauss-Kruger CM 117E",9001,4200,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2480,"Pulkovo 1995 / Gauss-Kruger CM 123E",9001,4200,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2481,"Pulkovo 1995 / Gauss-Kruger CM 129E",9001,4200,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2482,"Pulkovo 1995 / Gauss-Kruger CM 135E",9001,4200,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2483,"Pulkovo 1995 / Gauss-Kruger CM 141E",9001,4200,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2484,"Pulkovo 1995 / Gauss-Kruger CM 147E",9001,4200,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2485,"Pulkovo 1995 / Gauss-Kruger CM 153E",9001,4200,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2486,"Pulkovo 1995 / Gauss-Kruger CM 159E",9001,4200,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2487,"Pulkovo 1995 / Gauss-Kruger CM 165E",9001,4200,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2488,"Pulkovo 1995 / Gauss-Kruger CM 171E",9001,4200,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2489,"Pulkovo 1995 / Gauss-Kruger CM 177E",9001,4200,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2490,"Pulkovo 1995 / Gauss-Kruger CM 177W",9001,4200,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2491,"Pulkovo 1995 / Gauss-Kruger CM 171W",9001,4200,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2492,"Pulkovo 1942 / Gauss-Kruger CM 9E",9001,4284,16302,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2493,"Pulkovo 1942 / Gauss-Kruger CM 15E",9001,4284,16303,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2494,"Pulkovo 1942 / Gauss-Kruger CM 21E",9001,4284,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2495,"Pulkovo 1942 / Gauss-Kruger CM 27E",9001,4284,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2496,"Pulkovo 1942 / Gauss-Kruger CM 33E",9001,4284,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2497,"Pulkovo 1942 / Gauss-Kruger CM 39E",9001,4284,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2498,"Pulkovo 1942 / Gauss-Kruger CM 45E",9001,4284,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2499,"Pulkovo 1942 / Gauss-Kruger CM 51E",9001,4284,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2500,"Pulkovo 1942 / Gauss-Kruger CM 57E",9001,4284,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2501,"Pulkovo 1942 / Gauss-Kruger CM 63E",9001,4284,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2502,"Pulkovo 1942 / Gauss-Kruger CM 69E",9001,4284,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2503,"Pulkovo 1942 / Gauss-Kruger CM 75E",9001,4284,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2504,"Pulkovo 1942 / Gauss-Kruger CM 81E",9001,4284,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2505,"Pulkovo 1942 / Gauss-Kruger CM 87E",9001,4284,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2506,"Pulkovo 1942 / Gauss-Kruger CM 93E",9001,4284,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2507,"Pulkovo 1942 / Gauss-Kruger CM 99E",9001,4284,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2508,"Pulkovo 1942 / Gauss-Kruger CM 105E",9001,4284,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2509,"Pulkovo 1942 / Gauss-Kruger CM 111E",9001,4284,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2510,"Pulkovo 1942 / Gauss-Kruger CM 117E",9001,4284,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2511,"Pulkovo 1942 / Gauss-Kruger CM 123E",9001,4284,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2512,"Pulkovo 1942 / Gauss-Kruger CM 129E",9001,4284,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2513,"Pulkovo 1942 / Gauss-Kruger CM 135E",9001,4284,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2514,"Pulkovo 1942 / Gauss-Kruger CM 141E",9001,4284,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2515,"Pulkovo 1942 / Gauss-Kruger CM 147E",9001,4284,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2516,"Pulkovo 1942 / Gauss-Kruger CM 153E",9001,4284,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2517,"Pulkovo 1942 / Gauss-Kruger CM 159E",9001,4284,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2518,"Pulkovo 1942 / Gauss-Kruger CM 165E",9001,4284,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2519,"Pulkovo 1942 / Gauss-Kruger CM 171E",9001,4284,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2520,"Pulkovo 1942 / Gauss-Kruger CM 177E",9001,4284,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2521,"Pulkovo 1942 / Gauss-Kruger CM 177W",9001,4284,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2522,"Pulkovo 1942 / Gauss-Kruger CM 171W",9001,4284,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2523,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 7",9001,4284,16267,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+2524,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 8",9001,4284,16268,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2525,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 9",9001,4284,16269,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2526,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 10",9001,4284,16270,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+2527,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 11",9001,4284,16271,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+2528,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 12",9001,4284,16272,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+2529,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 13",9001,4284,16273,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2530,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 14",9001,4284,16274,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2531,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 15",9001,4284,16275,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2532,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 16",9001,4284,16276,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+2533,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 17",9001,4284,16277,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+2534,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 18",9001,4284,16278,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2535,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 19",9001,4284,16279,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2536,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 20",9001,4284,16280,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+2537,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 21",9001,4284,16281,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+2538,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 22",9001,4284,16282,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+2539,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 23",9001,4284,16283,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+2540,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 24",9001,4284,16284,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+2541,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 25",9001,4284,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2542,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 26",9001,4284,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2543,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 27",9001,4284,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2544,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 28",9001,4284,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2545,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 29",9001,4284,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2546,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 30",9001,4284,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2547,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 31",9001,4284,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2548,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 32",9001,4284,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2549,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 33",9001,4284,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2550,"Samboja / UTM zone 50S",9001,4125,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2551,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 34",9001,4284,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2552,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 35",9001,4284,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2553,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 36",9001,4284,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2554,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 37",9001,4284,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2555,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 38",9001,4284,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2556,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 39",9001,4284,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2557,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 40",9001,4284,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2558,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 41",9001,4284,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2559,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 42",9001,4284,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2560,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 43",9001,4284,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2561,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 44",9001,4284,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2562,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 45",9001,4284,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2563,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 46",9001,4284,16076,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+2564,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 47",9001,4284,16077,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+2565,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 48",9001,4284,16078,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+2566,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 49",9001,4284,16079,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+2567,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 50",9001,4284,16080,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+2568,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 51",9001,4284,16081,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+2569,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 52",9001,4284,16082,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+2570,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 53",9001,4284,16083,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+2571,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 54",9001,4284,16084,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+2572,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 55",9001,4284,16085,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+2573,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 56",9001,4284,16086,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+2574,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 57",9001,4284,16087,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+2575,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 58",9001,4284,16088,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+2576,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 59",9001,4284,16089,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+2577,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 60",9001,4284,16090,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,60000000.0,9001,8807,0.0,9001,,,,,,
+2578,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 61",9001,4284,16091,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,61500000.0,9001,8807,0.0,9001,,,,,,
+2579,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 62",9001,4284,16092,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,62500000.0,9001,8807,0.0,9001,,,,,,
+2580,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 63",9001,4284,16093,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,63500000.0,9001,8807,0.0,9001,,,,,,
+2581,"Pulkovo 1942 / 3-degree Gauss-Kruger zone 64",9001,4284,16094,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,64500000.0,9001,8807,0.0,9001,,,,,,
+2582,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 21E",9001,4284,16367,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2583,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 24E",9001,4284,16368,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2584,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 27E",9001,4284,16369,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2585,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 30E",9001,4284,16370,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2586,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 33E",9001,4284,16371,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2587,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 36E",9001,4284,16372,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2588,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 39E",9001,4284,16373,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2589,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 42E",9001,4284,16374,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2590,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 45E",9001,4284,16375,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2591,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 48E",9001,4284,16376,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9001,8806,500000.0,9001,8807,0.0,9201,,,,,,
+2592,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 51E",9001,4284,16377,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2593,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 54E",9001,4284,16378,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2594,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 57E",9001,4284,16379,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2595,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 60E",9001,4284,16380,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2596,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 63E",9001,4284,16381,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2597,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 66E",9001,4284,16382,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2598,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 69E",9001,4284,16383,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2599,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 72E",9001,4284,16384,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2600,Lietuvos Koordinoei Sistema 1994,9001,4126,19934,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9998,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2601,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 75E",9001,4284,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2602,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 78E",9001,4284,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2603,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 81E",9001,4284,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2604,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 84E",9001,4284,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2605,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 87E",9001,4284,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2606,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 90E",9001,4284,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2607,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 93E",9001,4284,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2608,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 96E",9001,4284,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2609,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 99E",9001,4284,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2610,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 102E",9001,4284,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2611,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 105E",9001,4284,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2612,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 108E",9001,4284,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2613,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 111E",9001,4284,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2614,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 114E",9001,4284,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2615,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 117E",9001,4284,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2616,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 120E",9001,4284,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2617,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 123E",9001,4284,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2618,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 126E",9001,4284,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2619,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 129E",9001,4284,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2620,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 132E",9001,4284,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2621,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 135E",9001,4284,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2622,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 138E",9001,4284,16176,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2623,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 141E",9001,4284,16177,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2624,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 144E",9001,4284,16178,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2625,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 147E",9001,4284,16179,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2626,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 150E",9001,4284,16180,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2627,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 153E",9001,4284,16181,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2628,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 156E",9001,4284,16182,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2629,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 159E",9001,4284,16183,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2630,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 162E",9001,4284,16184,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2631,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 165E",9001,4284,16185,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2632,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 168E",9001,4284,16186,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2633,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 171E",9001,4284,16187,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2634,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 174E",9001,4284,16188,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2635,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 177E",9001,4284,16189,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2636,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 180E",9001,4284,16190,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2637,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 177W",9001,4284,16191,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2638,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 174W",9001,4284,16192,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2639,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 171W",9001,4284,16193,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2640,"Pulkovo 1942 / 3-degree Gauss-Kruger CM 168W",9001,4284,16194,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2641,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 7",9001,4284,16267,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+2642,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 8",9001,4284,16268,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+2643,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 9",9001,4284,16269,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+2644,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 10",9001,4284,16270,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+2645,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 11",9001,4284,16271,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+2646,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 12",9001,4284,16272,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+2647,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 13",9001,4284,16273,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+2648,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 14",9001,4284,16274,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+2649,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 15",9001,4284,16275,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+2650,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 16",9001,4284,16276,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+2651,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 17",9001,4284,16277,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+2652,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 18",9001,4284,16278,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+2653,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 19",9001,4284,16279,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+2654,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 20",9001,4284,16280,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+2655,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 21",9001,4284,16281,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+2656,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 22",9001,4284,16282,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+2657,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 23",9001,4284,16283,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+2658,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 24",9001,4284,16284,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+2659,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 25",9001,4284,16285,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+2660,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 26",9001,4284,16286,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+2661,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 27",9001,4284,16287,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+2662,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 28",9001,4284,16288,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+2663,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 29",9001,4284,16289,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+2664,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 30",9001,4284,16290,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+2665,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 31",9001,4284,16291,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+2666,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 32",9001,4284,16292,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+2667,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 33",9001,4284,16293,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+2668,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 34",9001,4284,16294,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+2669,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 35",9001,4284,16295,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+2670,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 36",9001,4284,16296,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+2671,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 37",9001,4284,16297,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+2672,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 38",9001,4284,16298,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+2673,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 39",9001,4284,16299,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+2674,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 40",9001,4284,16070,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+2675,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 41",9001,4284,16071,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+2676,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 42",9001,4284,16072,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+2677,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 43",9001,4284,16073,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+2678,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 44",9001,4284,16074,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+2679,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 45",9001,4284,16075,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+2680,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 46",9001,4284,16076,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+2681,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 47",9001,4284,16077,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+2682,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 48",9001,4284,16078,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+2683,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 49",9001,4284,16079,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+2684,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 50",9001,4284,16080,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+2685,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 51",9001,4284,16081,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+2686,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 52",9001,4284,16082,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+2687,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 53",9001,4284,16083,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+2688,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 54",9001,4284,16084,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+2689,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 55",9001,4284,16085,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+2690,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 56",9001,4284,16086,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+2691,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 57",9001,4284,16087,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+2692,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 58",9001,4284,16088,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+2693,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 59",9001,4284,16089,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+2694,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 60",9001,4284,16090,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,60000000.0,9001,8807,0.0,9001,,,,,,
+2695,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 61",9001,4284,16091,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,61500000.0,9001,8807,0.0,9001,,,,,,
+2696,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 62",9001,4284,16092,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,62500000.0,9001,8807,0.0,9001,,,,,,
+2697,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 63",9001,4284,16093,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,63500000.0,9001,8807,0.0,9001,,,,,,
+2698,"Pulkovo 1995 / 3-degree Gauss-Kruger zone 64",9001,4284,16094,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,64500000.0,9001,8807,0.0,9001,,,,,,
+2699,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 21E",9001,4284,16367,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2700,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 24E",9001,4284,16368,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2701,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 27E",9001,4284,16369,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2702,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 30E",9001,4284,16370,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2703,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 33E",9001,4284,16371,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2704,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 36E",9001,4284,16372,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2705,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 39E",9001,4284,16373,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2706,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 42E",9001,4284,16374,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2707,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 45E",9001,4284,16375,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2708,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 48E",9001,4284,16376,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9001,8806,500000.0,9001,8807,0.0,9201,,,,,,
+2709,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 51E",9001,4284,16377,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2710,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 54E",9001,4284,16378,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2711,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 57E",9001,4284,16379,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2712,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 60E",9001,4284,16380,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2713,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 63E",9001,4284,16381,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2714,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 66E",9001,4284,16382,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2715,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 69E",9001,4284,16383,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2716,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 72E",9001,4284,16384,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2717,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 75E",9001,4284,16385,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2718,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 78E",9001,4284,16386,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2719,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 81E",9001,4284,16387,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2720,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 84E",9001,4284,16388,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2721,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 87E",9001,4284,16389,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2722,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 90E",9001,4284,16390,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2723,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 93E",9001,4284,16391,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2724,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 96E",9001,4284,16392,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2725,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 99E",9001,4284,16393,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2726,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 102E",9001,4284,16394,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2727,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 105E",9001,4284,16395,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2728,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 108E",9001,4284,16396,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2729,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 111E",9001,4284,16397,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2730,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 114E",9001,4284,16398,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2731,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 117E",9001,4284,16399,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2732,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 120E",9001,4284,16170,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2733,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 123E",9001,4284,16171,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2734,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 126E",9001,4284,16172,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2735,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 129E",9001,4284,16173,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2736,"Tete / UTM zone 36S",9001,4127,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2737,"Tete / UTM zone 37S",9001,4127,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2738,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 132E",9001,4284,16174,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2739,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 135E",9001,4284,16175,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2740,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 138E",9001,4284,16176,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2741,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 141E",9001,4284,16177,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2742,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 144E",9001,4284,16178,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2743,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 147E",9001,4284,16179,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2744,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 150E",9001,4284,16180,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2745,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 153E",9001,4284,16181,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2746,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 156E",9001,4284,16182,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2747,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 159E",9001,4284,16183,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2748,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 162E",9001,4284,16184,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2749,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 165E",9001,4284,16185,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2750,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 168E",9001,4284,16186,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2751,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 171E",9001,4284,16187,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2752,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 174E",9001,4284,16188,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2753,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 177E",9001,4284,16189,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2754,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 180E",9001,4284,16190,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2755,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 177W",9001,4284,16191,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2756,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 174W",9001,4284,16192,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2757,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 171W",9001,4284,16193,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2758,"Pulkovo 1995 / 3-degree Gauss-Kruger CM 168W",9001,4284,16194,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2759,"NAD83(HARN) / Alabama East",9001,4152,10131,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2760,"NAD83(HARN) / Alabama West",9001,4152,10132,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+2761,"NAD83(HARN) / Arizona East",9001,4152,10231,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+2762,"NAD83(HARN) / Arizona Central",9001,4152,10232,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+2763,"NAD83(HARN) / Arizona West",9001,4152,10233,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+2764,"NAD83(HARN) / Arkansas North",9001,4152,10331,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,400000.0,9001,8827,0.0,9001,,,
+2765,"NAD83(HARN) / Arkansas South",9001,4152,10332,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+2766,"NAD83(HARN) / California zone 1",9001,4152,10431,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2767,"NAD83(HARN) / California zone 2",9001,4152,10432,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2768,"NAD83(HARN) / California zone 3",9001,4152,10433,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2769,"NAD83(HARN) / California zone 4",9001,4152,10434,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2770,"NAD83(HARN) / California zone 5",9001,4152,10435,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2771,"NAD83(HARN) / California zone 6",9001,4152,10436,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+2772,"NAD83(HARN) / Colorado North",9001,4152,10531,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+2773,"NAD83(HARN) / Colorado Central",9001,4152,10532,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+2774,"NAD83(HARN) / Colorado South",9001,4152,10533,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+2775,"NAD83(HARN) / Connecticut",9001,4152,10630,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,304800.6096,9001,8827,152400.3048,9001,,,
+2776,"NAD83(HARN) / Delaware",9001,4152,10730,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2777,"NAD83(HARN) / Florida East",9001,4152,10931,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2778,"NAD83(HARN) / Florida West",9001,4152,10932,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2779,"NAD83(HARN) / Florida North",9001,4152,10933,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2780,"NAD83(HARN) / Georgia East",9001,4152,11031,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2781,"NAD83(HARN) / Georgia West",9001,4152,11032,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+2782,"NAD83(HARN) / Hawaii zone 1",9001,4152,15131,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2783,"NAD83(HARN) / Hawaii zone 2",9001,4152,15132,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2784,"NAD83(HARN) / Hawaii zone 3",9001,4152,15133,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2785,"NAD83(HARN) / Hawaii zone 4",9001,4152,15134,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2786,"NAD83(HARN) / Hawaii zone 5",9001,4152,15135,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2787,"NAD83(HARN) / Idaho East",9001,4152,11131,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2788,"NAD83(HARN) / Idaho Central",9001,4152,11132,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2789,"NAD83(HARN) / Idaho West",9001,4152,11133,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+2790,"NAD83(HARN) / Illinois East",9001,4152,11231,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2791,"NAD83(HARN) / Illinois West",9001,4152,11232,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+2792,"NAD83(HARN) / Indiana East",9001,4152,11331,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,100000.0,9001,8807,250000.0,9001,,,,,,
+2793,"NAD83(HARN) / Indiana West",9001,4152,11332,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,250000.0,9001,,,,,,
+2794,"NAD83(HARN) / Iowa North",9001,4152,11431,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,1500000.0,9001,8827,1000000.0,9001,,,
+2795,"NAD83(HARN) / Iowa South",9001,4152,11432,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2796,"NAD83(HARN) / Kansas North",9001,4152,11531,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,400000.0,9001,8827,0.0,9001,,,
+2797,"NAD83(HARN) / Kansas South",9001,4152,11532,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+2798,"NAD83(HARN) / Kentucky North",9001,4152,15303,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2799,"NAD83(HARN) / Kentucky South",9001,4152,11632,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,500000.0,9001,8827,500000.0,9001,,,
+2800,"NAD83(HARN) / Louisiana North",9001,4152,11731,9802,8821,30.3,9110,8822,-92.3,9110,8823,32.4,9110,8824,31.1,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+2801,"NAD83(HARN) / Louisiana South",9001,4152,11732,9802,8821,28.3,9110,8822,-91.2,9110,8823,30.42,9110,8824,29.18,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+2802,"NAD83(HARN) / Maine East",9001,4152,11831,9807,8801,43.4,9110,8802,-68.3,9110,8805,0.9999,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2803,"NAD83(HARN) / Maine West",9001,4152,11832,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+2804,"NAD83(HARN) / Maryland",9001,4152,11930,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,400000.0,9001,8827,0.0,9001,,,
+2805,"NAD83(HARN) / Massachusetts Mainland",9001,4152,12031,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,200000.0,9001,8827,750000.0,9001,,,
+2806,"NAD83(HARN) / Massachusetts Island",9001,4152,12032,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2807,"NAD83(HARN) / Michigan North",9001,4152,12141,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,8000000.0,9001,8827,0.0,9001,,,
+2808,"NAD83(HARN) / Michigan Central",9001,4152,12142,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,6000000.0,9001,8827,0.0,9001,,,
+2809,"NAD83(HARN) / Michigan South",9001,4152,12143,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,4000000.0,9001,8827,0.0,9001,,,
+2810,"NAD83(HARN) / Minnesota North",9001,4152,12231,9802,8821,46.3,9110,8822,-93.06,9110,8823,48.38,9110,8824,47.02,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+2811,"NAD83(HARN) / Minnesota Central",9001,4152,12232,9802,8821,45.0,9110,8822,-94.15,9110,8823,47.03,9110,8824,45.37,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+2812,"NAD83(HARN) / Minnesota South",9001,4152,12233,9802,8821,43.0,9110,8822,-94.0,9110,8823,45.13,9110,8824,43.47,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+2813,"NAD83(HARN) / Mississippi East",9001,4152,12331,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2814,"NAD83(HARN) / Mississippi West",9001,4152,12332,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+2815,"NAD83(HARN) / Missouri East",9001,4152,12431,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+2816,"NAD83(HARN) / Missouri Central",9001,4152,12432,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2817,"NAD83(HARN) / Missouri West",9001,4152,12433,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,850000.0,9001,8807,0.0,9001,,,,,,
+2818,"NAD83(HARN) / Montana",9001,4152,12530,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2819,"NAD83(HARN) / Nebraska",9001,4152,12630,9802,8821,39.5,9110,8822,-100.0,9110,8823,43.0,9110,8824,40.0,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2820,"NAD83(HARN) / Nevada East",9001,4152,12731,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,200000.0,9001,8807,8000000.0,9001,,,,,,
+2821,"NAD83(HARN) / Nevada Central",9001,4152,12732,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9001,8807,6000000.0,9001,,,,,,
+2822,"NAD83(HARN) / Nevada West",9001,4152,12733,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,800000.0,9001,8807,4000000.0,9001,,,,,,
+2823,"NAD83(HARN) / New Hampshire",9001,4152,12830,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+2824,"NAD83(HARN) / New Jersey",9001,4152,12930,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+2825,"NAD83(HARN) / New Mexico East",9001,4152,13031,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,165000.0,9001,8807,0.0,9001,,,,,,
+2826,"NAD83(HARN) / New Mexico Central",9001,4152,13032,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2827,"NAD83(HARN) / New Mexico West",9001,4152,13033,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,830000.0,9001,8807,0.0,9001,,,,,,
+2828,"NAD83(HARN) / New York East",9001,4152,13131,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+2829,"NAD83(HARN) / New York Central",9001,4152,13132,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+2830,"NAD83(HARN) / New York West",9001,4152,13133,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,350000.0,9001,8807,0.0,9001,,,,,,
+2831,"NAD83(HARN) / New York Long Island",9001,4152,13134,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,300000.0,9001,8827,0.0,9001,,,
+2832,"NAD83(HARN) / North Dakota North",9001,4152,13331,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2833,"NAD83(HARN) / North Dakota South",9001,4152,13332,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2834,"NAD83(HARN) / Ohio North",9001,4152,13431,9802,8821,39.4,9110,8822,-82.3,9110,8823,41.42,9110,8824,40.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2835,"NAD83(HARN) / Ohio South",9001,4152,13432,9802,8821,38.0,9110,8822,-82.3,9110,8823,40.02,9110,8824,38.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2836,"NAD83(HARN) / Oklahoma North",9001,4152,13531,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2837,"NAD83(HARN) / Oklahoma South",9001,4152,13532,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2838,"NAD83(HARN) / Oregon North",9001,4152,13631,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,2500000.0,9001,8827,0.0,9001,,,
+2839,"NAD83(HARN) / Oregon South",9001,4152,13632,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,1500000.0,9001,8827,0.0,9001,,,
+2840,"NAD83(HARN) / Rhode Island",9001,4152,13830,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.99999375,9201,8806,100000.0,9001,8807,0.0,9001,,,,,,
+2841,"NAD83(HARN) / South Dakota North",9001,4152,14031,9802,8821,43.5,9110,8822,-100.0,9110,8823,45.41,9110,8824,44.25,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2842,"NAD83(HARN) / South Dakota South",9001,4152,14032,9802,8821,42.2,9110,8822,-100.2,9110,8823,44.24,9110,8824,42.5,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2843,"NAD83(HARN) / Tennessee",9001,4152,14130,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2844,"NAD83(HARN) / Texas North",9001,4152,14231,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,200000.0,9001,8827,1000000.0,9001,,,
+2845,"NAD83(HARN) / Texas North Central",9001,4152,14232,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,600000.0,9001,8827,2000000.0,9001,,,
+2846,"NAD83(HARN) / Texas Central",9001,4152,14233,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,700000.0,9001,8827,3000000.0,9001,,,
+2847,"NAD83(HARN) / Texas South Central",9001,4152,14234,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,600000.0,9001,8827,4000000.0,9001,,,
+2848,"NAD83(HARN) / Texas South",9001,4152,14235,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,300000.0,9001,8827,5000000.0,9001,,,
+2849,"NAD83(HARN) / Utah North",9001,4152,14331,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,500000.0,9001,8827,1000000.0,9001,,,
+2850,"NAD83(HARN) / Utah Central",9001,4152,14332,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,500000.0,9001,8827,2000000.0,9001,,,
+2851,"NAD83(HARN) / Utah South",9001,4152,14333,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,500000.0,9001,8827,3000000.0,9001,,,
+2852,"NAD83(HARN) / Vermont",9001,4152,14430,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2853,"NAD83(HARN) / Virginia North",9001,4152,14531,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,3500000.0,9001,8827,2000000.0,9001,,,
+2854,"NAD83(HARN) / Virginia South",9001,4152,14532,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,3500000.0,9001,8827,1000000.0,9001,,,
+2855,"NAD83(HARN) / Washington North",9001,4152,14631,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2856,"NAD83(HARN) / Washington South",9001,4152,14632,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,500000.0,9001,8827,0.0,9001,,,
+2857,"NAD83(HARN) / West Virginia North",9001,4152,14731,9802,8821,38.3,9110,8822,-79.3,9110,8823,40.15,9110,8824,39.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2858,"NAD83(HARN) / West Virginia South",9001,4152,14732,9802,8821,37.0,9110,8822,-81.0,9110,8823,38.53,9110,8824,37.29,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2859,"NAD83(HARN) / Wisconsin North",9001,4152,14831,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2860,"NAD83(HARN) / Wisconsin Central",9001,4152,14832,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2861,"NAD83(HARN) / Wisconsin South",9001,4152,14833,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+2862,"NAD83(HARN) / Wyoming East",9001,4152,14931,9807,8801,40.3,9110,8802,-105.1,9110,8805,0.9999375,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+2863,"NAD83(HARN) / Wyoming East Central",9001,4152,14932,9807,8801,40.3,9110,8802,-107.2,9110,8805,0.9999375,9201,8806,400000.0,9001,8807,100000.0,9001,,,,,,
+2864,"NAD83(HARN) / Wyoming West Central",9001,4152,14933,9807,8801,40.3,9110,8802,-108.45,9110,8805,0.9999375,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+2865,"NAD83(HARN) / Wyoming West",9001,4152,14934,9807,8801,40.3,9110,8802,-110.05,9110,8805,0.9999375,9201,8806,800000.0,9001,8807,100000.0,9001,,,,,,
+2866,"NAD83(HARN) / Puerto Rico & Virgin Is.",9001,4152,15230,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,200000.0,9001,8827,200000.0,9001,,,
+2867,"NAD83(HARN) / Arizona East (ft)",9002,4152,15304,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2868,"NAD83(HARN) / Arizona Central (ft)",9002,4152,15305,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2869,"NAD83(HARN) / Arizona West (ft)",9002,4152,15306,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+2870,"NAD83(HARN) / California zone 1 (ftUS)",9003,4152,15307,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2871,"NAD83(HARN) / California zone 2 (ftUS)",9003,4152,15308,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2872,"NAD83(HARN) / California zone 3 (ftUS)",9003,4152,15309,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2873,"NAD83(HARN) / California zone 4 (ftUS)",9003,4152,15310,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2874,"NAD83(HARN) / California zone 5 (ftUS)",9003,4152,15311,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2875,"NAD83(HARN) / California zone 6 (ftUS)",9003,4152,15312,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+2876,"NAD83(HARN) / Colorado North (ftUS)",9003,4152,15313,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2877,"NAD83(HARN) / Colorado Central (ftUS)",9003,4152,15314,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2878,"NAD83(HARN) / Colorado South (ftUS)",9003,4152,15315,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+2879,"NAD83(HARN) / Connecticut (ftUS)",9003,4152,15316,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,1000000.0,9003,8827,500000.0,9003,,,
+2880,"NAD83(HARN) / Delaware (ftUS)",9003,4152,15317,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2881,"NAD83(HARN) / Florida East (ftUS)",9003,4152,15318,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2882,"NAD83(HARN) / Florida West (ftUS)",9003,4152,15319,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2883,"NAD83(HARN) / Florida North (ftUS)",9003,4152,15320,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2884,"NAD83(HARN) / Georgia East (ftUS)",9003,4152,15321,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2885,"NAD83(HARN) / Georgia West (ftUS)",9003,4152,15322,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2886,"NAD83(HARN) / Idaho East (ftUS)",9003,4152,15323,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+2887,"NAD83(HARN) / Idaho Central (ftUS)",9003,4152,15324,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2888,"NAD83(HARN) / Idaho West (ftUS)",9003,4152,15325,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,2624666.667,9003,8807,0.0,9003,,,,,,
+2889,"NAD83(HARN) / Indiana East (ftUS)",9003,4152,15326,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,328083.333,9003,8807,818125.0,9003,,,,,,
+2890,"NAD83(HARN) / Indiana West (ftUS)",9003,4152,15327,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,2952750.0,9003,8807,818125.0,9003,,,,,,
+2891,"NAD83(HARN) / Kentucky North (ftUS)",9003,4152,15328,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2892,"NAD83(HARN) / Kentucky South (ftUS)",9003,4152,15329,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,1640416.667,9003,8827,1640416.667,9003,,,
+2893,"NAD83(HARN) / Maryland (ftUS)",9003,4152,15330,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,1312333.333,9003,8827,0.0,9003,,,
+2894,"NAD83(HARN) / Massachusetts Mainland (ftUS)",9003,4152,15331,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,656166.667,9003,8827,2460625.0,9003,,,
+2895,"NAD83(HARN) / Massachusetts Island (ftUS)",9003,4152,15332,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2896,"NAD83(HARN) / Michigan North (ft)",9002,4152,15333,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,26246719.16,9002,8827,0.0,9002,,,
+2897,"NAD83(HARN) / Michigan Central (ft)",9002,4152,15334,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,19685039.37,9002,8827,0.0,9002,,,
+2898,"NAD83(HARN) / Michigan South (ft)",9002,4152,15335,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,13123359.58,9002,8827,0.0,9002,,,
+2899,"NAD83(HARN) / Mississippi East (ftUS)",9003,4152,15336,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,984250.0,9003,8807,0.0,9003,,,,,,
+2900,"NAD83(HARN) / Mississippi West (ftUS)",9003,4152,15337,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+2901,"NAD83(HARN) / Montana (ft)",9002,4152,15338,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2902,"NAD83(HARN) / New Mexico East (ftUS)",9003,4152,15339,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,541337.5,9003,8807,0.0,9003,,,,,,
+2903,"NAD83(HARN) / New Mexico Central (ftUS)",9003,4152,15340,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+2904,"NAD83(HARN) / New Mexico West (ftUS)",9003,4152,15341,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,2723091.667,9003,8807,0.0,9003,,,,,,
+2905,"NAD83(HARN) / New York East (ftUS)",9003,4152,15342,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,492125.0,9003,8807,0.0,9003,,,,,,
+2906,"NAD83(HARN) / New York Central (ftUS)",9003,4152,15343,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,820208.333,9003,8807,0.0,9003,,,,,,
+2907,"NAD83(HARN) / New York West (ftUS)",9003,4152,15344,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,1148291.667,9003,8807,0.0,9003,,,,,,
+2908,"NAD83(HARN) / New York Long Island (ftUS)",9003,4152,15345,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,984250.0,9003,8827,0.0,9003,,,
+2909,"NAD83(HARN) / North Dakota North (ft)",9002,4152,15347,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2910,"NAD83(HARN) / North Dakota South (ft)",9002,4152,15348,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+2911,"NAD83(HARN) / Oklahoma North (ftUS)",9003,4152,15349,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2912,"NAD83(HARN) / Oklahoma South (ftUS)",9003,4152,15350,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2913,"NAD83(HARN) / Oregon North (ft)",9002,4152,15351,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,8202099.738,9002,8827,0.0,9002,,,
+2914,"NAD83(HARN) / Oregon South (ft)",9002,4152,15352,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,4921259.843,9002,8827,0.0,9002,,,
+2915,"NAD83(HARN) / Tennessee (ftUS)",9003,4152,15356,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2916,"NAD83(HARN) / Texas North (ftUS)",9003,4152,15357,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,656166.667,9003,8827,3280833.333,9003,,,
+2917,"NAD83(HARN) / Texas North Central (ftUS)",9003,4152,15358,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,1968500.0,9003,8827,6561666.667,9003,,,
+2918,"NAD83(HARN) / Texas Central (ftUS)",9003,4152,15359,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,2296583.333,9003,8827,9842500.0,9003,,,
+2919,"NAD83(HARN) / Texas South Central (ftUS)",9003,4152,15360,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,1968500.0,9003,8827,13123333.333,9003,,,
+2920,"NAD83(HARN) / Texas South (ftUS)",9003,4152,15361,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,984250.0,9003,8827,16404166.667,9003,,,
+2921,"NAD83(HARN) / Utah North (ft)",9002,4152,15362,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,1640419.948,9002,8827,3280839.895,9002,,,
+2922,"NAD83(HARN) / Utah Central (ft)",9002,4152,15363,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,1640419.948,9002,8827,6561679.79,9002,,,
+2923,"NAD83(HARN) / Utah South (ft)",9002,4152,15364,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,1640419.948,9002,8827,9842519.685,9002,,,
+2924,"NAD83(HARN) / Virginia North (ftUS)",9003,4152,15365,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,11482916.667,9003,8827,6561666.667,9003,,,
+2925,"NAD83(HARN) / Virginia South (ftUS)",9003,4152,15366,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,11482916.667,9003,8827,3280833.333,9003,,,
+2926,"NAD83(HARN) / Washington North (ftUS)",9003,4152,15367,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2927,"NAD83(HARN) / Washington South (ftUS)",9003,4152,15368,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+2928,"NAD83(HARN) / Wisconsin North (ftUS)",9003,4152,15369,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2929,"NAD83(HARN) / Wisconsin Central (ftUS)",9003,4152,15370,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2930,"NAD83(HARN) / Wisconsin South (ftUS)",9003,4152,15371,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+2931,"Beduaram / TM 13 NE",9003,4213,16413,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2932,"QND95 / Qatar National Grid",9001,4614,19919,9807,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+2933,"Segara / UTM zone 50S",9001,4613,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+2934,"Segara (Jakarta) / NEIEZ",9001,4820,19905,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+2935,"Pulkovo 1942 / CS63 zone A1",9001,4284,18441,9807,8801,0.07,9110,8802,41.32,9110,8805,1.0,9003,8806,1300000.0,9001,8807,0.0,9001,,,,,,
+2936,"Pulkovo 1942 / CS63 zone A2",9001,4284,18442,9807,8801,0.07,9110,8802,44.32,9110,8805,1.0,9003,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+2937,"Pulkovo 1942 / CS63 zone A3",9001,4284,18443,9807,8801,0.07,9110,8802,47.32,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+2938,"Pulkovo 1942 / CS63 zone A4",9001,4284,18444,9807,8801,0.07,9110,8802,50.32,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+2939,"Pulkovo 1942 / CS63 zone K2",9001,4284,18446,9807,8801,0.08,9110,8802,50.46,9110,8805,1.0,9201,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+2940,"Pulkovo 1942 / CS63 zone K3",9001,4284,18447,9807,8801,0.08,9110,8802,53.46,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+2941,"Pulkovo 1942 / CS63 zone K4",9001,4284,18448,9807,8801,0.08,9110,8802,56.46,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+2942,"Porto Santo / UTM zone 28N",9001,4615,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2943,"Selvagem Grande / UTM zone 28N",9001,4616,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2944,"NAD83(CSRS) / SCoPQ zone 2",9001,4617,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2945,"NAD83(CSRS) / MTM zone 3",9001,4617,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2946,"NAD83(CSRS) / MTM zone 4",9001,4617,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2947,"NAD83(CSRS) / MTM zone 5",9001,4617,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2948,"NAD83(CSRS) / MTM zone 6",9001,4617,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2949,"NAD83(CSRS) / MTM zone 7",9001,4617,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2950,"NAD83(CSRS) / MTM zone 8",9001,4617,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2951,"NAD83(CSRS) / MTM zone 9",9001,4617,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2952,"NAD83(CSRS) / MTM zone 10",9001,4617,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+2953,"NAD83(CSRS) / New Brunswick Stereo",9001,4617,19946,9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,2500000.0,9001,8807,7500000.0,9001,,,,,,
+2954,"NAD83(CSRS) / Prince Edward Isl. Stereographic (NAD83)",9001,4617,19960,9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+2955,"NAD83(CSRS) / UTM zone 11N",9001,4617,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2956,"NAD83(CSRS) / UTM zone 12N",9001,4617,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2957,"NAD83(CSRS) / UTM zone 13N",9001,4617,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2958,"NAD83(CSRS) / UTM zone 17N",9001,4617,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2959,"NAD83(CSRS) / UTM zone 18N",9001,4617,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2960,"NAD83(CSRS) / UTM zone 19N",9001,4617,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2961,"NAD83(CSRS) / UTM zone 20N",9001,4617,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2962,"NAD83(CSRS) / UTM zone 21N",9001,4617,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+2963,"Lisbon 1890 (Lisbon) / Portugal Bonne",9001,4904,19979,9828,8801,39.4,9110,8802,1.0,9110,8806,0.0,9001,8807,0.0,9001,,,,,,,,,
+3036,"Moznet / UTM zone 36S",9001,4130,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+3037,"Moznet / UTM zone 37S",9001,4130,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+3148,"Indian 1960 / UTM zone 48N",9001,4131,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3149,"Indian 1960 / UTM zone 49N",9001,4131,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3176,"Indian 1960 / TM 106 NE",9001,4131,16506,9807,8801,0.0,9102,8802,106.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3200,"FD58 / Iraq zone",9001,4132,19906,9801,8801,32.3,9110,8802,45.0,9110,8805,0.9987864078,9201,8806,1500000.0,9001,8807,1166200.0,9001,,,,,,
+3300,Estonian Coordinate System of 1992,9001,4133,19938,9802,8821,57.310319415,9110,8822,24.0,9110,8823,59.2,9110,8824,58.0,9110,8826,500000.0,9001,8827,6375000.0,9001,,,
+3301,Estonian Coordinate System of 1997,9001,4180,19938,9802,8821,57.310319415,9110,8822,24.0,9110,8823,59.2,9110,8824,58.0,9110,8826,500000.0,9001,8827,6375000.0,9001,,,
+3439,"PSD93 / UTM zone 39N",9001,4134,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3440,"PSD93 / UTM zone 40N",9001,4134,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3561,"Old Hawaiian / Hawaii zone 1",9003,4135,15101,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3562,"Old Hawaiian / Hawaii zone 2",9003,4135,15102,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3563,"Old Hawaiian / Hawaii zone 3",9003,4135,15103,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3564,"Old Hawaiian / Hawaii zone 4",9003,4135,15104,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3565,"Old Hawaiian / Hawaii zone 5",9003,4135,15105,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+3920,"Puerto Rico / UTM zone 20N",9001,4139,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+3991,Puerto Rico State Plane CS of 1927,9003,4139,15201,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,0.0,9003,,,
+3992,"Puerto Rico / St. Croix",9003,4139,15202,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,100000.0,9003,,,
+20004,"Pulkovo 1995 / Gauss-Kruger zone 4",9001,4200,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+20005,"Pulkovo 1995 / Gauss-Kruger zone 5",9001,4200,16205,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+20006,"Pulkovo 1995 / Gauss-Kruger zone 6",9001,4200,16206,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+20007,"Pulkovo 1995 / Gauss-Kruger zone 7",9001,4200,16207,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+20008,"Pulkovo 1995 / Gauss-Kruger zone 8",9001,4200,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+20009,"Pulkovo 1995 / Gauss-Kruger zone 9",9001,4200,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+20010,"Pulkovo 1995 / Gauss-Kruger zone 10",9001,4200,16210,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+20011,"Pulkovo 1995 / Gauss-Kruger zone 11",9001,4200,16211,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+20012,"Pulkovo 1995 / Gauss-Kruger zone 12",9001,4200,16212,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+20013,"Pulkovo 1995 / Gauss-Kruger zone 13",9001,4200,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+20014,"Pulkovo 1995 / Gauss-Kruger zone 14",9001,4200,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+20015,"Pulkovo 1995 / Gauss-Kruger zone 15",9001,4200,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+20016,"Pulkovo 1995 / Gauss-Kruger zone 16",9001,4200,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+20017,"Pulkovo 1995 / Gauss-Kruger zone 17",9001,4200,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+20018,"Pulkovo 1995 / Gauss-Kruger zone 18",9001,4200,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+20019,"Pulkovo 1995 / Gauss-Kruger zone 19",9001,4200,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+20020,"Pulkovo 1995 / Gauss-Kruger zone 20",9001,4200,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+20021,"Pulkovo 1995 / Gauss-Kruger zone 21",9001,4200,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+20022,"Pulkovo 1995 / Gauss-Kruger zone 22",9001,4200,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+20023,"Pulkovo 1995 / Gauss-Kruger zone 23",9001,4200,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+20024,"Pulkovo 1995 / Gauss-Kruger zone 24",9001,4200,16224,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+20025,"Pulkovo 1995 / Gauss-Kruger zone 25",9001,4200,16225,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+20026,"Pulkovo 1995 / Gauss-Kruger zone 26",9001,4200,16226,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+20027,"Pulkovo 1995 / Gauss-Kruger zone 27",9001,4200,16227,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+20028,"Pulkovo 1995 / Gauss-Kruger zone 28",9001,4200,16228,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+20029,"Pulkovo 1995 / Gauss-Kruger zone 29",9001,4200,16229,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+20030,"Pulkovo 1995 / Gauss-Kruger zone 30",9001,4200,16230,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+20031,"Pulkovo 1995 / Gauss-Kruger zone 31",9001,4200,16231,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+20032,"Pulkovo 1995 / Gauss-Kruger zone 32",9001,4200,16232,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+20064,"Pulkovo 1995 / Gauss-Kruger 4N",9001,4200,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20065,"Pulkovo 1995 / Gauss-Kruger 5N",9001,4200,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20066,"Pulkovo 1995 / Gauss-Kruger 6N",9001,4200,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20067,"Pulkovo 1995 / Gauss-Kruger 7N",9001,4200,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20068,"Pulkovo 1995 / Gauss-Kruger 8N",9001,4200,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20069,"Pulkovo 1995 / Gauss-Kruger 9N",9001,4200,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20070,"Pulkovo 1995 / Gauss-Kruger 10N",9001,4200,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20071,"Pulkovo 1995 / Gauss-Kruger 11N",9001,4200,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20072,"Pulkovo 1995 / Gauss-Kruger 12N",9001,4200,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20073,"Pulkovo 1995 / Gauss-Kruger 13N",9001,4200,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20074,"Pulkovo 1995 / Gauss-Kruger 14N",9001,4200,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20075,"Pulkovo 1995 / Gauss-Kruger 15N",9001,4200,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20076,"Pulkovo 1995 / Gauss-Kruger 16N",9001,4200,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20077,"Pulkovo 1995 / Gauss-Kruger 17N",9001,4200,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20078,"Pulkovo 1995 / Gauss-Kruger 18N",9001,4200,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20079,"Pulkovo 1995 / Gauss-Kruger 19N",9001,4200,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20080,"Pulkovo 1995 / Gauss-Kruger 20N",9001,4200,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20081,"Pulkovo 1995 / Gauss-Kruger 21N",9001,4200,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20082,"Pulkovo 1995 / Gauss-Kruger 22N",9001,4200,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20083,"Pulkovo 1995 / Gauss-Kruger 23N",9001,4200,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20084,"Pulkovo 1995 / Gauss-Kruger 24N",9001,4200,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20085,"Pulkovo 1995 / Gauss-Kruger 25N",9001,4200,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20086,"Pulkovo 1995 / Gauss-Kruger 26N",9001,4200,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20087,"Pulkovo 1995 / Gauss-Kruger 27N",9001,4200,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20088,"Pulkovo 1995 / Gauss-Kruger 28N",9001,4200,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20089,"Pulkovo 1995 / Gauss-Kruger 29N",9001,4200,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20090,"Pulkovo 1995 / Gauss-Kruger 30N",9001,4200,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20091,"Pulkovo 1995 / Gauss-Kruger 31N",9001,4200,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20092,"Pulkovo 1995 / Gauss-Kruger 32N",9001,4200,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20137,"Adindan / UTM zone 37N",9001,4201,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20138,"Adindan / UTM zone 38N",9001,4201,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20248,"AGD66 / AMG zone 48",9001,4202,17448,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20249,"AGD66 / AMG zone 49",9001,4202,17449,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20250,"AGD66 / AMG zone 50",9001,4202,17450,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20251,"AGD66 / AMG zone 51",9001,4202,17451,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20252,"AGD66 / AMG zone 52",9001,4202,17452,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20253,"AGD66 / AMG zone 53",9001,4202,17453,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20254,"AGD66 / AMG zone 54",9001,4202,17454,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20255,"AGD66 / AMG zone 55",9001,4202,17455,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20256,"AGD66 / AMG zone 56",9001,4202,17456,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20257,"AGD66 / AMG zone 57",9001,4202,17457,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20258,"AGD66 / AMG zone 58",9001,4202,17458,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20348,"AGD84 / AMG zone 48",9001,4203,17448,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20349,"AGD84 / AMG zone 49",9001,4203,17449,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20350,"AGD84 / AMG zone 50",9001,4203,17450,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20351,"AGD84 / AMG zone 51",9001,4203,17451,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20352,"AGD84 / AMG zone 52",9001,4203,17452,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20353,"AGD84 / AMG zone 53",9001,4203,17453,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20354,"AGD84 / AMG zone 54",9001,4203,17454,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20355,"AGD84 / AMG zone 55",9001,4203,17455,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20356,"AGD84 / AMG zone 56",9001,4203,17456,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20357,"AGD84 / AMG zone 57",9001,4203,17457,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20358,"AGD84 / AMG zone 58",9001,4203,17458,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20437,"Ain el Abd / UTM zone 37N",9001,4204,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20438,"Ain el Abd / UTM zone 38N",9001,4204,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20439,"Ain el Abd / UTM zone 39N",9001,4204,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20499,"Ain el Abd / Bahrain Grid",9001,4204,19900,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20538,"Afgooye / UTM zone 38N",9001,4205,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20539,"Afgooye / UTM zone 39N",9001,4205,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+20790,"Lisbon (Lisbon)/Portuguese National Grid",9001,4803,19936,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+20791,"Lisbon (Lisbon)/Portuguese Grid",9001,4803,19969,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+20822,"Aratu / UTM zone 22S",9001,4208,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20823,"Aratu / UTM zone 23S",9001,4208,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20824,"Aratu / UTM zone 24S",9001,4208,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20934,"Arc 1950 / UTM zone 34S",9001,4209,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20935,"Arc 1950 / UTM zone 35S",9001,4209,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+20936,"Arc 1950 / UTM zone 36S",9001,4209,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21035,"Arc 1960 / UTM zone 35S",9001,4210,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21036,"Arc 1960 / UTM zone 36S",9001,4210,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21037,"Arc 1960 / UTM zone 37S",9001,4210,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21095,"Arc 1960 / UTM zone 35N",9001,4210,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21096,"Arc 1960 / UTM zone 36N",9001,4210,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21097,"Arc 1960 / UTM zone 37N",9001,4210,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21100,"Batavia (Jakarta) / NEIEZ",9001,4813,19905,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+21148,"Batavia / UTM zone 48S",9001,4211,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21149,"Batavia / UTM zone 49S",9001,4211,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21150,"Batavia / UTM zone 50S",9001,4211,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+21291,"Barbados 1938 / British West Indies Grid",9001,4212,19942,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+21292,"Barbados 1938 / Barbados National Grid",9001,4212,19943,9807,8801,13.1035,9110,8802,-59.3335,9110,8805,0.9999986,9201,8806,30000.0,9001,8807,75000.0,9001,,,,,,
+21413,"Beijing 1954 / Gauss-Kruger zone 13",9001,4214,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+21414,"Beijing 1954 / Gauss-Kruger zone 14",9001,4214,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+21415,"Beijing 1954 / Gauss-Kruger zone 15",9001,4214,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+21416,"Beijing 1954 / Gauss-Kruger zone 16",9001,4214,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+21417,"Beijing 1954 / Gauss-Kruger zone 17",9001,4214,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+21418,"Beijing 1954 / Gauss-Kruger zone 18",9001,4214,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+21419,"Beijing 1954 / Gauss-Kruger zone 19",9001,4214,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+21420,"Beijing 1954 / Gauss-Kruger zone 20",9001,4214,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+21421,"Beijing 1954 / Gauss-Kruger zone 21",9001,4214,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+21422,"Beijing 1954 / Gauss-Kruger zone 22",9001,4214,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+21423,"Beijing 1954 / Gauss-Kruger zone 23",9001,4214,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+21453,"Beijing 1954 / Gauss-Kruger CM 75E",9001,4214,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21454,"Beijing 1954 / Gauss-Kruger CM 81E",9001,4214,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21455,"Beijing 1954 / Gauss-Kruger CM 87E",9001,4214,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21456,"Beijing 1954 / Gauss-Kruger CM 93E",9001,4214,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21457,"Beijing 1954 / Gauss-Kruger CM 99E",9001,4214,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21458,"Beijing 1954 / Gauss-Kruger CM 105E",9001,4214,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21459,"Beijing 1954 / Gauss-Kruger CM 111E",9001,4214,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21460,"Beijing 1954 / Gauss-Kruger CM 117E",9001,4214,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21461,"Beijing 1954 / Gauss-Kruger CM 123E",9001,4214,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21462,"Beijing 1954 / Gauss-Kruger CM 129E",9001,4214,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21463,"Beijing 1954 / Gauss-Kruger CM 135E",9001,4214,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21473,"Beijing 1954 / Gauss-Kruger 13N",9001,4214,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21474,"Beijing 1954 / Gauss-Kruger 14N",9001,4214,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21475,"Beijing 1954 / Gauss-Kruger 15N",9001,4214,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21476,"Beijing 1954 / Gauss-Kruger 16N",9001,4214,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21477,"Beijing 1954 / Gauss-Kruger 17N",9001,4214,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21478,"Beijing 1954 / Gauss-Kruger 18N",9001,4214,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21479,"Beijing 1954 / Gauss-Kruger 19N",9001,4214,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21480,"Beijing 1954 / Gauss-Kruger 20N",9001,4214,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21481,"Beijing 1954 / Gauss-Kruger 21N",9001,4214,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21482,"Beijing 1954 / Gauss-Kruger 22N",9001,4214,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21483,"Beijing 1954 / Gauss-Kruger 23N",9001,4214,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21500,"Belge 1950 (Brussels) / Belge Lambert 50",9001,4809,19901,9802,8821,90.0,9110,8822,0.0,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.0,9001,8827,5400000.0,9001,,,
+21780,"Bern 1898 (Bern) / LV03C",9001,4801,19923,9815,8811,46.570866,9110,8812,0.0,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,0.0,9001,8817,0.0,9001
+21781,"CH1903 / LV03",9001,4149,19922,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,600000.0,9001,8817,200000.0,9001
+21817,"Bogota 1975 / UTM zone 17N",9001,4218,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21818,"Bogota 1975 / UTM zone 18N",9001,4218,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+21891,"Bogota 1975 / Colombia West zone",9001,4218,18051,9807,8801,4.355657,9110,8802,-77.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+21892,"Bogota 1975 / Colombia Bogota zone",9001,4218,18052,9807,8801,4.355657,9110,8802,-74.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+21893,"Bogota 1975 / Colombia East Central zone",9001,4218,18053,9807,8801,4.355657,9110,8802,-71.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+21894,"Bogota 1975 / Colombia East",9001,4218,18054,9807,8801,4.355657,9110,8802,-68.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+22032,"Camacupa / UTM zone 32S",9001,4220,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22033,"Camacupa / UTM zone 33S",9001,4220,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22091,"Camacupa / TM 11.30 SE",9001,4220,16611,9807,8801,0.0,9110,8802,11.3,9110,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22092,"Camacupa / TM 12 SE",9001,4220,16612,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22191,"Campo Inchauspe / Argentina 1",9001,4221,18031,9807,8801,-90.0,9102,8802,-72.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+22192,"Campo Inchauspe / Argentina 2",9001,4221,18032,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+22193,"Campo Inchauspe / Argentina 3",9001,4221,18033,9807,8801,-90.0,9102,8802,-66.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+22194,"Campo Inchauspe / Argentina 4",9001,4221,18034,9807,8801,-90.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+22195,"Campo Inchauspe / Argentina 5",9001,4221,18035,9807,8801,-90.0,9102,8802,-60.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+22196,"Campo Inchauspe / Argentina 6",9001,4221,18036,9807,8801,-90.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+22197,"Campo Inchauspe / Argentina 7",9001,4221,18037,9807,8801,-90.0,9102,8802,-54.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+22234,"Cape / UTM zone 34S",9001,4222,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22235,"Cape / UTM zone 35S",9001,4222,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22236,"Cape / UTM zone 36S",9001,4222,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22275,South African Coordinate System zone 15,9001,4222,17515,9808,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22277,South African Coordinate System zone 17,9001,4222,17517,9808,8801,0.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22279,South African Coordinate System zone 19,9001,4222,17519,9808,8801,0.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22281,South African Coordinate System zone 21,9001,4222,17521,9808,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22283,South African Coordinate System zone 23,9001,4222,17523,9808,8801,0.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22285,South African Coordinate System zone 25,9001,4222,17525,9808,8801,0.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22287,South African Coordinate System zone 27,9001,4222,17527,9808,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22289,South African Coordinate System zone 29,9001,4222,17529,9808,8801,0.0,9102,8802,29.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22291,South African Coordinate System zone 31,9001,4222,17531,9808,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22293,South African Coordinate System zone 33,9001,4222,17533,9808,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22300,"Carthage (Paris) / Tunisia Mining Grid",9036,4816,19937,9816,8821,38.81973,9105,8822,7.83445,9105,8826,270.0,9036,8827,582.0,9036,,,,,,,,,
+22332,"Carthage / UTM zone 32N",9001,4223,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+22391,"Carthage / Nord Tunisie",9001,4223,18181,9801,8801,40.0,9105,8802,11.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+22392,"Carthage / Sud Tunisie",9001,4223,18182,9801,8801,37.0,9105,8802,11.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+22523,"Corrego Alegre / UTM zone 23S",9001,4225,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22524,"Corrego Alegre / UTM zone 24S",9001,4225,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+22700,"Deir ez Zor / Levant Zone",9001,4227,19940,9817,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+22770,"Deir ez Zor / Syria Lambert",9001,4227,19948,9801,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+22780,"Deir ez Zor / Levant Stereographic",9001,4227,19949,9809,8801,38.0,9105,8802,43.5,9105,8805,0.9995341,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+22832,"Douala / UTM zone 32N",9001,4228,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+22991,"Egypt 1907 / Blue Belt",9001,4229,18071,9807,8801,30.0,9102,8802,35.0,9102,8805,1.0,9201,8806,300000.0,9001,8807,1100000.0,9001,,,,,,
+22992,"Egypt 1907 / Red Belt",9001,4229,18072,9807,8801,30.0,9102,8802,31.0,9102,8805,1.0,9201,8806,615000.0,9001,8807,810000.0,9001,,,,,,
+22993,"Egypt 1907 / Purple Belt",9001,4229,18073,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,200000.0,9001,,,,,,
+22994,"Egypt 1907 / Extended Purple Belt",9001,4229,18074,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,1200000.0,9001,,,,,,
+23028,"ED50 / UTM zone 28N",9001,4230,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23029,"ED50 / UTM zone 29N",9001,4230,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23030,"ED50 / UTM zone 30N",9001,4230,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23031,"ED50 / UTM zone 31N",9001,4230,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23032,"ED50 / UTM zone 32N",9001,4230,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23033,"ED50 / UTM zone 33N",9001,4230,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23034,"ED50 / UTM zone 34N",9001,4230,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23035,"ED50 / UTM zone 35N",9001,4230,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23036,"ED50 / UTM zone 36N",9001,4230,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23037,"ED50 / UTM zone 37N",9001,4230,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23038,"ED50 / UTM zone 38N",9001,4230,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23090,"ED50 / TM 0 N",9001,4230,16400,9807,8801,0.0,9102,8802,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23095,"ED50 / TM 5 NE",9001,4230,16405,9807,8801,0.0,9102,8802,5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23239,"Fahud / UTM zone 39N",9001,4232,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23240,"Fahud / UTM zone 40N",9001,4232,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23433,"Garoua / UTM zone 33N",9001,4234,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23700,"HD72 / EOV",9001,4237,19931,9815,8811,47.08398174,9110,8812,19.02548584,9110,8813,90.0,9110,8814,90.0,9110,8815,0.99993,9201,8816,650000.0,9001,8817,200000.0,9001
+23846,"ID74 / UTM zone 46N",9001,4238,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23847,"ID74 / UTM zone 47N",9001,4238,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23848,"ID74 / UTM zone 48N",9001,4238,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23849,"ID74 / UTM zone 49N",9001,4238,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23850,"ID74 / UTM zone 50N",9001,4238,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23851,"ID74 / UTM zone 51N",9001,4238,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23852,"ID74 / UTM zone 52N",9001,4238,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23853,"ID74 / UTM zone 53N",9001,4238,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23886,"ID74 / UTM zone 46S",9001,4238,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23887,"ID74 / UTM zone 47S",9001,4238,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23888,"ID74 / UTM zone 48S",9001,4238,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23889,"ID74 / UTM zone 49S",9001,4238,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23890,"ID74 / UTM zone 50S",9001,4238,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23891,"ID74 / UTM zone 51S",9001,4238,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23892,"ID74 / UTM zone 52S",9001,4238,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23893,"ID74 / UTM zone 53S",9001,4238,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23894,"ID74 / UTM zone 54S",9001,4238,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+23946,"Indian 1954 / UTM zone 46N",9001,4239,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23947,"Indian 1954 / UTM zone 47N",9001,4239,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+23948,"Indian 1954 / UTM zone 48N",9001,4239,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24047,"Indian 1975 / UTM zone 47N",9001,4240,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24048,"Indian 1975 / UTM zone 48N",9001,4240,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24100,"Jamaica 1875 / Jamaica (Old Grid)",9005,4241,19909,9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,550000.0,9005,8807,400000.0,9005,,,,,,
+24200,"JAD69 / Jamaica National Grid",9001,4242,19910,9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,250000.0,9001,8807,150000.0,9001,,,,,,
+24305,"Kalianpur 1937 / UTM zone 45N",9001,4144,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24306,"Kalianpur 1937 / UTM zone 46N",9001,4144,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24311,"Kalianpur 1962 / UTM zone 41N",9001,4145,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24312,"Kalianpur 1962 / UTM zone 42N",9001,4145,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24313,"Kalianpur 1962 / UTM zone 43N",9001,4145,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24342,"Kalianpur 1975 / UTM zone 42N",9001,4146,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24343,"Kalianpur 1975 / UTM zone 43N",9001,4146,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24344,"Kalianpur 1975 / UTM zone 44N",9001,4146,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24345,"Kalianpur 1975 / UTM zone 45N",9001,4146,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24346,"Kalianpur 1975 / UTM zone 46N",9001,4146,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24347,"Kalianpur 1975 / UTM zone 47N",9001,4146,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24370,"Kalianpur 1880 / India zone 0",9084,4243,18110,9801,8801,39.3,9110,8802,68.0,9110,8805,0.99846154,9201,8806,2355500.0,9084,8807,2590000.0,9084,,,,,,
+24371,"Kalianpur 1880 / India zone I",9084,4243,18111,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24372,"Kalianpur 1880 / India zone IIa",9084,4243,18112,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24373,"Kalianpur 1880 / India zone III",9084,4243,18114,9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24374,"Kalianpur 1880 / India zone IV",9084,4243,18116,9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24375,"Kalianpur 1937 / India zone IIb",9001,4144,18238,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743185.69,9001,8807,914395.23,9001,,,,,,
+24376,"Kalianpur 1962 / India zone I",9001,4145,18236,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+24377,"Kalianpur 1962 / India zone IIa",9001,4145,18237,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+24378,"Kalianpur 1975 / India zone I",9001,4146,18231,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24379,"Kalianpur 1975 / India zone IIa",9001,4146,18232,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24380,"Kalianpur 1975 / India zone IIb",9001,4146,18235,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24381,"Kalianpur 1975 / India zone III",9001,4146,18233,9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24382,"Kalianpur 1880 / India zone IIb",9084,4243,18113,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+24383,"Kalianpur 1975 / India zone IV",9001,4146,18234,9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+24500,"Kertau / Singapore Grid",9001,4245,19920,9806,8801,1.1715528,9110,8802,103.5110808,9110,8806,30000.0,9001,8807,30000.0,9001,,,,,,,,,
+24547,"Kertau / UTM zone 47N",9001,4245,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24548,"Kertau / UTM zone 48N",9001,4245,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24571,"Kertau / R.S.O. Malaya (ch)",9062,4245,19935,9812,8806,40000.0,9062,8807,0.0,9062,8811,4.0,9110,8812,102.15,9110,8813,323.01328458,9110,8814,323.07483685,9110,8815,0.99984,9201
+24600,KOC Lambert,9001,4246,19906,9801,8801,32.3,9110,8802,45.0,9110,8805,0.9987864078,9201,8806,1500000.0,9001,8807,1166200.0,9001,,,,,,
+24718,"La Canoa / UTM zone 18N",9001,4247,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24719,"La Canoa / UTM zone 19N",9001,4247,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24720,"La Canoa / UTM zone 20N",9001,4247,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24818,"PSAD56 / UTM zone 18N",9001,4248,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24819,"PSAD56 / UTM zone 19N",9001,4248,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24820,"PSAD56 / UTM zone 20N",9001,4248,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24821,"PSAD56 / UTM zone 21N",9001,4248,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+24877,"PSAD56 / UTM zone 17S",9001,4248,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24878,"PSAD56 / UTM zone 18S",9001,4248,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24879,"PSAD56 / UTM zone 19S",9001,4248,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24880,"PSAD56 / UTM zone 20S",9001,4248,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24882,"PSAD56 / UTM zone 22S",9001,4248,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+24891,"PSAD56 / Peru west zone",9001,4248,18161,9807,8801,-6.0,9110,8802,-80.3,9110,8805,0.99983008,9201,8806,222000.0,9001,8807,1426834.743,9001,,,,,,
+24892,"PSAD56 / Peru central zone",9001,4248,18162,9807,8801,-9.3,9110,8802,-76.0,9110,8805,0.99932994,9201,8806,720000.0,9001,8807,1039979.159,9001,,,,,,
+24893,"PSAD56 / Peru east zone",9001,4248,18163,9807,8801,-9.3,9110,8802,-70.3,9110,8805,0.99952992,9201,8806,1324000.0,9001,8807,1040084.558,9001,,,,,,
+25000,"Leigon / Ghana Metre Grid",9001,4250,19904,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,274319.51,9001,8807,0.0,9001,,,,,,
+25231,"Lome / UTM zone 31N",9001,4252,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25391,"Luzon 1911 / Philippines zone I",9001,4253,18171,9807,8801,0.0,9102,8802,117.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25392,"Luzon 1911 / Philippines zone II",9001,4253,18172,9807,8801,0.0,9102,8802,119.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25393,"Luzon 1911 / Philippines zone III",9001,4253,18173,9807,8801,0.0,9102,8802,121.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25394,"Luzon 1911 / Philippines zone IV",9001,4253,18174,9807,8801,0.0,9102,8802,123.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25395,"Luzon 1911 / Philippines zone V",9001,4253,18175,9807,8801,0.0,9102,8802,125.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25700,"Makassar (Jakarta) / NEIEZ",9001,4804,19905,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+25828,"ETRS89 / UTM zone 28N",9001,4258,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25829,"ETRS89 / UTM zone 29N",9001,4258,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25830,"ETRS89 / UTM zone 30N",9001,4258,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25831,"ETRS89 / UTM zone 31N",9001,4258,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25832,"ETRS89 / UTM zone 32N",9001,4258,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25833,"ETRS89 / UTM zone 33N",9001,4258,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25834,"ETRS89 / UTM zone 34N",9001,4258,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25835,"ETRS89 / UTM zone 35N",9001,4258,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25836,"ETRS89 / UTM zone 36N",9001,4258,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25837,"ETRS89 / UTM zone 37N",9001,4258,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25838,"ETRS89 / UTM zone 38N",9001,4258,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25884,"ETRS89 / TM Baltic93",9001,4258,19939,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+25932,"Malongo 1987 / UTM zone 32S",9001,4259,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+26191,"Merchich / Nord Maroc",9001,4261,18131,9801,8801,37.0,9105,8802,-6.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+26192,"Merchich / Sud Maroc",9001,4261,18132,9801,8801,33.0,9105,8802,-6.0,9105,8805,0.999615596,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+26193,"Merchich / Sahara",9001,4261,18133,9801,8801,29.0,9105,8802,-6.0,9105,8805,0.9996,9201,8806,1200000.0,9001,8807,400000.0,9001,,,,,,
+26237,"Massawa / UTM zone 37N",9001,4262,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26331,"Minna / UTM zone 31N",9001,4263,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26332,"Minna / UTM zone 32N",9001,4263,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26391,"Minna / Nigeria West Belt",9001,4263,18151,9807,8801,4.0,9110,8802,4.3,9110,8805,0.99975,9201,8806,230738.26,9001,8807,0.0,9001,,,,,,
+26392,"Minna / Nigeria Mid Belt",9001,4263,18152,9807,8801,4.0,9110,8802,8.3,9110,8805,0.99975,9201,8806,670553.98,9001,8807,0.0,9001,,,,,,
+26393,"Minna / Nigeria East Belt",9001,4263,18153,9807,8801,4.0,9110,8802,12.3,9110,8805,0.99975,9201,8806,1110369.7,9001,8807,0.0,9001,,,,,,
+26432,"Mhast / UTM zone 32S",9001,4264,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+26591,"Monte Mario (Rome) / Italy zone 1",9001,4806,18121,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+26592,"Monte Mario (Rome) / Italy zone 2",9001,4806,18122,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,2520000.0,9001,8807,0.0,9001,,,,,,
+26632,"M'poraloko / UTM zone 32N",9001,4266,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26692,"M'poraloko / UTM zone 32S",9001,4266,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+26703,"NAD27 / UTM zone 3N",9001,4267,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26704,"NAD27 / UTM zone 4N",9001,4267,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26705,"NAD27 / UTM zone 5N",9001,4267,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26706,"NAD27 / UTM zone 6N",9001,4267,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26707,"NAD27 / UTM zone 7N",9001,4267,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26708,"NAD27 / UTM zone 8N",9001,4267,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26709,"NAD27 / UTM zone 9N",9001,4267,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26710,"NAD27 / UTM zone 10N",9001,4267,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26711,"NAD27 / UTM zone 11N",9001,4267,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26712,"NAD27 / UTM zone 12N",9001,4267,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26713,"NAD27 / UTM zone 13N",9001,4267,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26714,"NAD27 / UTM zone 14N",9001,4267,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26715,"NAD27 / UTM zone 15N",9001,4267,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26716,"NAD27 / UTM zone 16N",9001,4267,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26717,"NAD27 / UTM zone 17N",9001,4267,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26718,"NAD27 / UTM zone 18N",9001,4267,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26719,"NAD27 / UTM zone 19N",9001,4267,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26720,"NAD27 / UTM zone 20N",9001,4267,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26721,"NAD27 / UTM zone 21N",9001,4267,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26722,"NAD27 / UTM zone 22N",9001,4267,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26729,"NAD27 / Alabama East",9003,4267,10101,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26730,"NAD27 / Alabama West",9003,4267,10102,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26731,"NAD27 / Alaska zone 1",9003,4267,15001,9812,8806,16404166.67,9003,8807,-16404166.67,9003,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+26732,"NAD27 / Alaska zone 2",9003,4267,15002,9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26733,"NAD27 / Alaska zone 3",9003,4267,15003,9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26734,"NAD27 / Alaska zone 4",9003,4267,15004,9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26735,"NAD27 / Alaska zone 5",9003,4267,15005,9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26736,"NAD27 / Alaska zone 6",9003,4267,15006,9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26737,"NAD27 / Alaska zone 7",9003,4267,15007,9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,700000.0,9003,8807,0.0,9003,,,,,,
+26738,"NAD27 / Alaska zone 8",9003,4267,15008,9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26739,"NAD27 / Alaska zone 9",9003,4267,15009,9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,600000.0,9003,8807,0.0,9003,,,,,,
+26740,"NAD27 / Alaska zone 10",9003,4267,15010,9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,3000000.0,9003,8827,0.0,9003,,,
+26741,"NAD27 / California zone I",9003,4267,10401,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26742,"NAD27 / California zone II",9003,4267,10402,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26743,"NAD27 / California zone III",9003,4267,10403,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26744,"NAD27 / California zone IV",9003,4267,10404,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26745,"NAD27 / California zone V",9003,4267,10405,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26746,"NAD27 / California zone VI",9003,4267,10406,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26747,"NAD27 / California zone VII",9003,4267,10407,9802,8821,34.08,9110,8822,-118.2,9110,8823,34.25,9110,8824,33.52,9110,8826,4186692.58,9003,8827,416926.74,9003,,,
+26748,"NAD27 / Arizona East",9003,4267,10201,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26749,"NAD27 / Arizona Central",9003,4267,10202,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26750,"NAD27 / Arizona West",9003,4267,10203,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26751,"NAD27 / Arkansas North",9003,4267,10301,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26752,"NAD27 / Arkansas South",9003,4267,10302,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26753,"NAD27 / Colorado North",9003,4267,10501,9802,8821,39.2,9110,8822,-105.3,9110,8823,39.43,9110,8824,40.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26754,"NAD27 / Colorado Central",9003,4267,10502,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26755,"NAD27 / Colorado South",9003,4267,10503,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26756,"NAD27 / Connecticut",9003,4267,10600,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,600000.0,9003,8827,0.0,9003,,,
+26757,"NAD27 / Delaware",9003,4267,10700,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26758,"NAD27 / Florida East",9003,4267,10901,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26759,"NAD27 / Florida West",9003,4267,10902,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26760,"NAD27 / Florida North",9003,4267,10903,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26766,"NAD27 / Georgia East",9003,4267,11001,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26767,"NAD27 / Georgia West",9003,4267,11002,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26768,"NAD27 / Idaho East",9003,4267,11101,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26769,"NAD27 / Idaho Central",9003,4267,11102,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26770,"NAD27 / Idaho West",9003,4267,11103,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26771,"NAD27 / Illinois East",9003,4267,11201,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26772,"NAD27 / Illinois West",9003,4267,11202,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26773,"NAD27 / Indiana East",9003,4267,11301,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26774,"NAD27 / Indiana West",9003,4267,11302,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26775,"NAD27 / Iowa North",9003,4267,11401,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26776,"NAD27 / Iowa South",9003,4267,11402,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26777,"NAD27 / Kansas North",9003,4267,11501,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26778,"NAD27 / Kansas South",9003,4267,11502,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26779,"NAD27 / Kentucky North",9003,4267,11601,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26780,"NAD27 / Kentucky South",9003,4267,11602,9802,8821,36.2,9110,8822,-85.45,9110,8823,36.44,9110,8824,37.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26781,"NAD27 / Louisiana North",9003,4267,11701,9802,8821,30.4,9110,8822,-92.3,9110,8823,31.1,9110,8824,32.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26782,"NAD27 / Louisiana South",9003,4267,11702,9802,8821,28.4,9110,8822,-91.2,9110,8823,29.18,9110,8824,30.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26783,"NAD27 / Maine East",9003,4267,11801,9807,8801,43.5,9110,8802,-68.3,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26784,"NAD27 / Maine West",9003,4267,11802,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26785,"NAD27 / Maryland",9003,4267,11900,9802,8821,37.5,9110,8822,-77.0,9110,8823,38.18,9110,8824,39.27,9110,8826,800000.0,9003,8827,0.0,9003,,,
+26786,"NAD27 / Massachusetts Mainland",9003,4267,12001,9802,8821,41.0,9110,8822,-71.3,9110,8823,41.43,9110,8824,42.41,9110,8826,600000.0,9003,8827,0.0,9003,,,
+26787,"NAD27 / Massachusetts Island",9003,4267,12002,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.17,9110,8824,41.29,9110,8826,200000.0,9003,8827,0.0,9003,,,
+26791,"NAD27 / Minnesota North",9003,4267,12201,9802,8821,46.3,9110,8822,-93.06,9110,8823,47.02,9110,8824,48.38,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26792,"NAD27 / Minnesota Central",9003,4267,12202,9802,8821,45.0,9110,8822,-94.15,9110,8823,45.37,9110,8824,47.03,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26793,"NAD27 / Minnesota South",9003,4267,12203,9802,8821,43.0,9110,8822,-94.0,9110,8823,43.47,9110,8824,45.13,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26794,"NAD27 / Mississippi East",9003,4267,12301,9807,8801,29.4,9110,8802,-88.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26795,"NAD27 / Mississippi West",9003,4267,12302,9807,8801,30.3,9110,8802,-90.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26796,"NAD27 / Missouri East",9003,4267,12401,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26797,"NAD27 / Missouri Central",9003,4267,12402,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26798,"NAD27 / Missouri West",9003,4267,12403,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26801,"NAD Michigan / Michigan East",9003,4268,12101,9807,8801,41.3,9110,8802,-83.4,9110,8805,0.999942857,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26802,"NAD Michigan / Michigan Old Central",9003,4268,12102,9807,8801,41.3,9110,8802,-85.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26803,"NAD Michigan / Michigan West",9003,4268,12103,9807,8801,41.3,9110,8802,-88.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+26811,"NAD Michigan / Michigan North",9003,4268,12111,9802,8821,44.47,9110,8822,-87.0,9110,8823,45.29,9110,8824,47.05,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26812,"NAD Michigan / Michigan Central",9003,4268,12112,9802,8821,43.19,9110,8822,-84.2,9110,8823,44.11,9110,8824,45.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26813,"NAD Michigan / Michigan South",9003,4268,12113,9802,8821,41.3,9110,8822,-84.2,9110,8823,42.06,9110,8824,43.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+26903,"NAD83 / UTM zone 3N",9001,4269,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26904,"NAD83 / UTM zone 4N",9001,4269,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26905,"NAD83 / UTM zone 5N",9001,4269,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26906,"NAD83 / UTM zone 6N",9001,4269,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26907,"NAD83 / UTM zone 7N",9001,4269,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26908,"NAD83 / UTM zone 8N",9001,4269,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26909,"NAD83 / UTM zone 9N",9001,4269,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26910,"NAD83 / UTM zone 10N",9001,4269,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26911,"NAD83 / UTM zone 11N",9001,4269,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26912,"NAD83 / UTM zone 12N",9001,4269,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26913,"NAD83 / UTM zone 13N",9001,4269,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26914,"NAD83 / UTM zone 14N",9001,4269,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26915,"NAD83 / UTM zone 15N",9001,4269,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26916,"NAD83 / UTM zone 16N",9001,4269,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26917,"NAD83 / UTM zone 17N",9001,4269,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26918,"NAD83 / UTM zone 18N",9001,4269,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26919,"NAD83 / UTM zone 19N",9001,4269,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26920,"NAD83 / UTM zone 20N",9001,4269,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26921,"NAD83 / UTM zone 21N",9001,4269,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26922,"NAD83 / UTM zone 22N",9001,4269,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26923,"NAD83 / UTM zone 23N",9001,4269,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26929,"NAD83 / Alabama East",9001,4269,10131,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26930,"NAD83 / Alabama West",9001,4269,10132,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+26931,"NAD83 / Alaska zone 1",9001,4269,15031,9812,8806,5000000.0,9001,8807,-5000000.0,9001,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+26932,"NAD83 / Alaska zone 2",9001,4269,15032,9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26933,"NAD83 / Alaska zone 3",9001,4269,15033,9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26934,"NAD83 / Alaska zone 4",9001,4269,15034,9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26935,"NAD83 / Alaska zone 5",9001,4269,15035,9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26936,"NAD83 / Alaska zone 6",9001,4269,15036,9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26937,"NAD83 / Alaska zone 7",9001,4269,15037,9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26938,"NAD83 / Alaska zone 8",9001,4269,15038,9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26939,"NAD83 / Alaska zone 9",9001,4269,15039,9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26940,"NAD83 / Alaska zone 10",9001,4269,15040,9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+26941,"NAD83 / California zone 1",9001,4269,10431,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26942,"NAD83 / California zone 2",9001,4269,10432,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26943,"NAD83 / California zone 3",9001,4269,10433,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26944,"NAD83 / California zone 4",9001,4269,10434,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26945,"NAD83 / California zone 5",9001,4269,10435,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26946,"NAD83 / California zone 6",9001,4269,10436,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+26948,"NAD83 / Arizona East",9001,4269,10231,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+26949,"NAD83 / Arizona Central",9001,4269,10232,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+26950,"NAD83 / Arizona West",9001,4269,10233,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+26951,"NAD83 / Arkansas North",9001,4269,10331,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,400000.0,9001,8827,0.0,9001,,,
+26952,"NAD83 / Arkansas South",9001,4269,10332,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+26953,"NAD83 / Colorado North",9001,4269,10531,9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+26954,"NAD83 / Colorado Central",9001,4269,10532,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+26955,"NAD83 / Colorado South",9001,4269,10533,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+26956,"NAD83 / Connecticut",9001,4269,10630,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,304800.6096,9001,8827,152400.3048,9001,,,
+26957,"NAD83 / Delaware",9001,4269,10730,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26958,"NAD83 / Florida East",9001,4269,10931,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26959,"NAD83 / Florida West",9001,4269,10932,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26960,"NAD83 / Florida North",9001,4269,10933,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,600000.0,9001,8827,0.0,9001,,,
+26961,"NAD83 / Hawaii zone 1",9001,4269,15131,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26962,"NAD83 / Hawaii zone 2",9001,4269,15132,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26963,"NAD83 / Hawaii zone 3",9001,4269,15133,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26964,"NAD83 / Hawaii zone 4",9001,4269,15134,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26965,"NAD83 / Hawaii zone 5",9001,4269,15135,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26966,"NAD83 / Georgia East",9001,4269,11031,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26967,"NAD83 / Georgia West",9001,4269,11032,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+26968,"NAD83 / Idaho East",9001,4269,11131,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+26969,"NAD83 / Idaho Central",9001,4269,11132,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26970,"NAD83 / Idaho West",9001,4269,11133,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+26971,"NAD83 / Illinois East",9001,4269,11231,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+26972,"NAD83 / Illinois West",9001,4269,11232,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+26973,"NAD83 / Indiana East",9001,4269,11331,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,100000.0,9001,8807,250000.0,9001,,,,,,
+26974,"NAD83 / Indiana West",9001,4269,11332,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,250000.0,9001,,,,,,
+26975,"NAD83 / Iowa North",9001,4269,11431,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,1500000.0,9001,8827,1000000.0,9001,,,
+26976,"NAD83 / Iowa South",9001,4269,11432,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,500000.0,9001,8827,0.0,9001,,,
+26977,"NAD83 / Kansas North",9001,4269,11531,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,400000.0,9001,8827,0.0,9001,,,
+26978,"NAD83 / Kansas South",9001,4269,11532,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+26979,"NAD83 / Kentucky North",9001,4269,11631,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,37.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+26980,"NAD83 / Kentucky South",9001,4269,11632,9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,500000.0,9001,8827,500000.0,9001,,,
+26981,"NAD83 / Louisiana North",9001,4269,11731,9802,8821,30.3,9110,8822,-92.3,9110,8823,32.4,9110,8824,31.1,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+26982,"NAD83 / Louisiana South",9001,4269,11732,9802,8821,28.3,9110,8822,-91.2,9110,8823,30.42,9110,8824,29.18,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+26983,"NAD83 / Maine East",9001,4269,11831,9807,8801,43.4,9110,8802,-68.3,9110,8805,0.9999,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+26984,"NAD83 / Maine West",9001,4269,11832,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+26985,"NAD83 / Maryland",9001,4269,11930,9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,400000.0,9001,8827,0.0,9001,,,
+26986,"NAD83 / Massachusetts Mainland",9001,4269,12031,9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,200000.0,9001,8827,750000.0,9001,,,
+26987,"NAD83 / Massachusetts Island",9001,4269,12032,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,500000.0,9001,8827,0.0,9001,,,
+26988,"NAD83 / Michigan North",9001,4269,12141,9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,8000000.0,9001,8827,0.0,9001,,,
+26989,"NAD83 / Michigan Central",9001,4269,12142,9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,6000000.0,9001,8827,0.0,9001,,,
+26990,"NAD83 / Michigan South",9001,4269,12143,9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,4000000.0,9001,8827,0.0,9001,,,
+26991,"NAD83 / Minnesota North",9001,4269,12231,9802,8821,46.3,9110,8822,-93.06,9110,8823,48.38,9110,8824,47.02,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+26992,"NAD83 / Minnesota Central",9001,4269,12232,9802,8821,45.0,9110,8822,-94.15,9110,8823,47.03,9110,8824,45.37,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+26993,"NAD83 / Minnesota South",9001,4269,12233,9802,8821,43.0,9110,8822,-94.0,9110,8823,45.13,9110,8824,43.47,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+26994,"NAD83 / Mississippi East",9001,4269,12331,9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+26995,"NAD83 / Mississippi West",9001,4269,12332,9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+26996,"NAD83 / Missouri East",9001,4269,12431,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+26997,"NAD83 / Missouri Central",9001,4269,12432,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+26998,"NAD83 / Missouri West",9001,4269,12433,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,850000.0,9001,8807,0.0,9001,,,,,,
+27038,"Nahrwan 1967 / UTM zone 38N",9001,4270,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27039,"Nahrwan 1967 / UTM zone 39N",9001,4270,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27040,"Nahrwan 1967 / UTM zone 40N",9001,4270,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27120,"Naparima 1972 / UTM zone 20N",9001,4271,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27200,"NZGD49 / New Zealand Map Grid",9001,4272,19917,9811,8801,-41.0,9102,8802,173.0,9102,8806,2510000.0,9001,8807,6023150.0,9001,,,,,,,,,
+27205,"NZGD49 / Mount Eden Circuit",9001,4272,17901,9807,8801,-36.5247515,9110,8802,174.45516217,9110,8805,0.9999,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27206,"NZGD49 / Bay of Plenty Circuit",9001,4272,17902,9807,8801,-37.45404993,9110,8802,176.27583101,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27207,"NZGD49 / Poverty Bay Circuit",9001,4272,17903,9807,8801,-38.372893,9110,8802,177.53082906,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27208,"NZGD49 / Hawkes Bay Circuit",9001,4272,17904,9807,8801,-39.39033455,9110,8802,176.40252499,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27209,"NZGD49 / Taranaki Circuit",9001,4272,17905,9807,8801,-39.08087299,9110,8802,174.13408423,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27210,"NZGD49 / Tuhirangi Circuit",9001,4272,17906,9807,8801,-39.30448934,9110,8802,175.38241325,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27211,"NZGD49 / Wanganui Circuit",9001,4272,17907,9807,8801,-40.14310097,9110,8802,175.29171586,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27212,"NZGD49 / Wairarapa Circuit",9001,4272,17908,9807,8801,-40.55319175,9110,8802,175.38504588,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27213,"NZGD49 / Wellington Circuit",9001,4272,17909,9807,8801,-41.18047507,9110,8802,174.46358432,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27214,"NZGD49 / Collingwood Circuit",9001,4272,17910,9807,8801,-40.42531326,9110,8802,172.40193674,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27215,"NZGD49 / Nelson Circuit",9001,4272,17911,9807,8801,-41.1628361,9110,8802,173.17575405,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27216,"NZGD49 / Karamea Circuit",9001,4272,17912,9807,8801,-41.17236815,9110,8802,172.06325015,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27217,"NZGD49 / Buller Circuit",9001,4272,17913,9807,8801,-41.48388903,9110,8802,171.34525362,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27218,"NZGD49 / Grey Circuit",9001,4272,17914,9807,8801,-42.20012994,9110,8802,171.32591767,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27219,"NZGD49 / Amuri Circuit",9001,4272,17915,9807,8801,-42.41208197,9110,8802,173.00364802,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27220,"NZGD49 / Marlborough Circuit",9001,4272,17916,9807,8801,-41.3240152,9110,8802,173.48074668,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27221,"NZGD49 / Hokitika Circuit",9001,4272,17917,9807,8801,-42.53107605,9110,8802,170.58479766,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27222,"NZGD49 / Okarito Circuit",9001,4272,17918,9807,8801,-43.06364613,9110,8802,170.1539333,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27223,"NZGD49 / Jacksons Bay Circuit",9001,4272,17919,9807,8801,-43.58400904,9110,8802,168.36225612,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27224,"NZGD49 / Mount Pleasant Circuit",9001,4272,17920,9807,8801,-43.35262953,9110,8802,172.43378969,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27225,"NZGD49 / Gawler Circuit",9001,4272,17921,9807,8801,-43.44553616,9110,8802,171.21386945,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27226,"NZGD49 / Timaru Circuit",9001,4272,17922,9807,8801,-44.24079933,9110,8802,171.0326103,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27227,"NZGD49 / Lindis Peak Circuit",9001,4272,17923,9807,8801,-44.44069647,9110,8802,169.28039183,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27228,"NZGD49 / Mount Nicholas Circuit",9001,4272,17924,9807,8801,-45.07584493,9110,8802,168.23551083,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27229,"NZGD49 / Mount York Circuit",9001,4272,17925,9807,8801,-45.33494142,9110,8802,167.44199024,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27230,"NZGD49 / Observation Point Circuit",9001,4272,17926,9807,8801,-45.48583078,9110,8802,170.37429426,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27231,"NZGD49 / North Taieri Circuit",9001,4272,17927,9807,8801,-45.51414481,9110,8802,170.16573208,9110,8805,0.99996,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+27232,"NZGD49 / Bluff Circuit",9001,4272,17928,9807,8801,-46.36000346,9110,8802,168.20343392,9110,8805,1.0,9201,8806,300002.66,9001,8807,699999.58,9001,,,,,,
+27258,"NZGD49 / UTM zone 58S",9001,4272,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+27259,"NZGD49 / UTM zone 59S",9001,4272,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+27260,"NZGD49 / UTM zone 60S",9001,4272,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+27291,"NZGD49 / North Island Grid",9040,4272,18141,9807,8801,-39.0,9110,8802,175.3,9110,8805,1.0,9201,8806,300000.0,9040,8807,400000.0,9040,,,,,,
+27292,"NZGD49 / South Island Grid",9040,4272,18142,9807,8801,-44.0,9110,8802,171.3,9110,8805,1.0,9201,8806,500000.0,9040,8807,500000.0,9040,,,,,,
+27391,"NGO 1948 (Oslo) / NGO zone I",9001,4817,18221,9807,8801,58.0,9110,8802,-4.4,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27392,"NGO 1948 (Oslo) / NGO zone II",9001,4817,18222,9807,8801,58.0,9110,8802,-2.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27393,"NGO 1948 (Oslo) / NGO zone III",9001,4817,18223,9807,8801,58.0,9110,8802,0.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27394,"NGO 1948 (Oslo) / NGO zone IV",9001,4817,18224,9807,8801,58.0,9110,8802,2.3,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27395,"NGO 1948 (Oslo) / NGO zone V",9001,4817,18225,9807,8801,58.0,9110,8802,6.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27396,"NGO 1948 (Oslo) / NGO zone VI",9001,4817,18226,9807,8801,58.0,9110,8802,10.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27397,"NGO 1948 (Oslo) / NGO zone VII",9001,4817,18227,9807,8801,58.0,9110,8802,14.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27398,"NGO 1948 (Oslo) / NGO zone VIII",9001,4817,18228,9807,8801,58.0,9110,8802,18.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+27429,"Datum 73 / UTM zone 29N",9001,4274,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+27492,"Datum 73 / Modified Portuguese Grid",9001,4274,19974,9807,8801,39.4,9110,8802,-8.0754862,9110,8805,1.0,9201,8806,180.598,9001,8807,-86.99,9001,,,,,,
+27500,"ATF (Paris) / Nord de Guerre",9001,4901,19903,9801,8801,55.0,9105,8802,6.0,9105,8805,0.99950908,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+27561,"NTF (Paris) / Lambert Nord France",9001,4807,18091,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27562,"NTF (Paris) / Lambert Centre France",9001,4807,18092,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27563,"NTF (Paris) / Lambert Sud France",9001,4807,18093,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27564,"NTF (Paris) / Lambert Corse",9001,4807,18094,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,185861.369,9001,,,,,,
+27571,"NTF (Paris) / Lambert zone I",9001,4807,18081,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,1200000.0,9001,,,,,,
+27572,"NTF (Paris) / Lambert zone II",9001,4807,18082,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+27573,"NTF (Paris) / Lambert zone III",9001,4807,18083,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,3200000.0,9001,,,,,,
+27574,"NTF (Paris) / Lambert zone IV",9001,4807,18084,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,4185861.369,9001,,,,,,
+27581,"NTF (Paris) / France I",9001,4807,18081,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,1200000.0,9001,,,,,,
+27582,"NTF (Paris) / France II",9001,4807,18082,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+27583,"NTF (Paris) / France III",9001,4807,18083,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,3200000.0,9001,,,,,,
+27584,"NTF (Paris) / France IV",9001,4807,18084,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,4185861.369,9001,,,,,,
+27591,"NTF (Paris) / Nord France",9001,4807,18091,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27592,"NTF (Paris) / Centre France",9001,4807,18092,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27593,"NTF (Paris) / Sud France",9001,4807,18093,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+27594,"NTF (Paris) / Corse",9001,4807,18094,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,185861.369,9001,,,,,,
+27700,"OSGB 1936 / British National Grid",9001,4277,19916,9807,8801,49.0,9102,8802,-2.0,9102,8805,0.999601272,9201,8806,400000.0,9001,8807,-100000.0,9001,,,,,,
+28191,"Palestine 1923 / Palestine Grid",9001,4281,18201,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,126867.909,9001,,,,,,,,,
+28192,"Palestine 1923 / Palestine Belt",9001,4281,18202,9807,8801,31.4402749,9110,8802,35.124349,9110,8805,1.0,9201,8806,170251.555,9001,8807,1126867.909,9001,,,,,,
+28193,"Palestine 1923 / Israeli CS Grid",9001,4281,18203,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,1126867.909,9001,,,,,,,,,
+28232,"Pointe Noire / UTM zone 32S",9001,4282,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28348,"GDA94 / MGA zone 48",9001,4283,17348,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28349,"GDA94 / MGA zone 49",9001,4283,17349,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28350,"GDA94 / MGA zone 50",9001,4283,17350,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28351,"GDA94 / MGA zone 51",9001,4283,17351,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28352,"GDA94 / MGA zone 52",9001,4283,17352,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28353,"GDA94 / MGA zone 53",9001,4283,17353,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28354,"GDA94 / MGA zone 54",9001,4283,17354,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28355,"GDA94 / MGA zone 55",9001,4283,17355,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28356,"GDA94 / MGA zone 56",9001,4283,17356,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28357,"GDA94 / MGA zone 57",9001,4283,17357,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28358,"GDA94 / MGA zone 58",9001,4283,17358,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+28402,"Pulkovo 1942 / Gauss-Kruger zone 2",9001,4284,16202,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+28403,"Pulkovo 1942 / Gauss-Kruger zone 3",9001,4284,16203,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+28404,"Pulkovo 1942 / Gauss-Kruger zone 4",9001,4284,16204,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+28405,"Pulkovo 1942 / Gauss-Kruger zone 5",9001,4284,16205,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+28406,"Pulkovo 1942 / Gauss-Kruger zone 6",9001,4284,16206,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+28407,"Pulkovo 1942 / Gauss-Kruger zone 7",9001,4284,16207,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+28408,"Pulkovo 1942 / Gauss-Kruger zone 8",9001,4284,16208,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+28409,"Pulkovo 1942 / Gauss-Kruger zone 9",9001,4284,16209,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+28410,"Pulkovo 1942 / Gauss-Kruger zone 10",9001,4284,16210,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+28411,"Pulkovo 1942 / Gauss-Kruger zone 11",9001,4284,16211,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+28412,"Pulkovo 1942 / Gauss-Kruger zone 12",9001,4284,16212,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+28413,"Pulkovo 1942 / Gauss-Kruger zone 13",9001,4284,16213,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+28414,"Pulkovo 1942 / Gauss-Kruger zone 14",9001,4284,16214,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+28415,"Pulkovo 1942 / Gauss-Kruger zone 15",9001,4284,16215,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+28416,"Pulkovo 1942 / Gauss-Kruger zone 16",9001,4284,16216,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+28417,"Pulkovo 1942 / Gauss-Kruger zone 17",9001,4284,16217,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+28418,"Pulkovo 1942 / Gauss-Kruger zone 18",9001,4284,16218,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+28419,"Pulkovo 1942 / Gauss-Kruger zone 19",9001,4284,16219,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+28420,"Pulkovo 1942 / Gauss-Kruger zone 20",9001,4284,16220,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+28421,"Pulkovo 1942 / Gauss-Kruger zone 21",9001,4284,16221,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+28422,"Pulkovo 1942 / Gauss-Kruger zone 22",9001,4284,16222,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+28423,"Pulkovo 1942 / Gauss-Kruger zone 23",9001,4284,16223,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+28424,"Pulkovo 1942 / Gauss-Kruger zone 24",9001,4284,16224,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+28425,"Pulkovo 1942 / Gauss-Kruger zone 25",9001,4284,16225,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+28426,"Pulkovo 1942 / Gauss-Kruger zone 26",9001,4284,16226,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+28427,"Pulkovo 1942 / Gauss-Kruger zone 27",9001,4284,16227,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+28428,"Pulkovo 1942 / Gauss-Kruger zone 28",9001,4284,16228,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+28429,"Pulkovo 1942 / Gauss-Kruger zone 29",9001,4284,16229,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+28430,"Pulkovo 1942 / Gauss-Kruger zone 30",9001,4284,16230,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+28431,"Pulkovo 1942 / Gauss-Kruger zone 31",9001,4284,16231,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+28432,"Pulkovo 1942 / Gauss-Kruger zone 32",9001,4284,16232,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+28462,"Pulkovo 1942 / Gauss-Kruger 2N",9001,4284,16302,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28463,"Pulkovo 1942 / Gauss-Kruger 3N",9001,4284,16303,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28464,"Pulkovo 1942 / Gauss-Kruger 4N",9001,4284,16304,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28465,"Pulkovo 1942 / Gauss-Kruger 5N",9001,4284,16305,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28466,"Pulkovo 1942 / Gauss-Kruger 6N",9001,4284,16306,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28467,"Pulkovo 1942 / Gauss-Kruger 7N",9001,4284,16307,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28468,"Pulkovo 1942 / Gauss-Kruger 8N",9001,4284,16308,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28469,"Pulkovo 1942 / Gauss-Kruger 9N",9001,4284,16309,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28470,"Pulkovo 1942 / Gauss-Kruger 10N",9001,4284,16310,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28471,"Pulkovo 1942 / Gauss-Kruger 11N",9001,4284,16311,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28472,"Pulkovo 1942 / Gauss-Kruger 12N",9001,4284,16312,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28473,"Pulkovo 1942 / Gauss-Kruger 13N",9001,4284,16313,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28474,"Pulkovo 1942 / Gauss-Kruger 14N",9001,4284,16314,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28475,"Pulkovo 1942 / Gauss-Kruger 15N",9001,4284,16315,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28476,"Pulkovo 1942 / Gauss-Kruger 16N",9001,4284,16316,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28477,"Pulkovo 1942 / Gauss-Kruger 17N",9001,4284,16317,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28478,"Pulkovo 1942 / Gauss-Kruger 18N",9001,4284,16318,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28479,"Pulkovo 1942 / Gauss-Kruger 19N",9001,4284,16319,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28480,"Pulkovo 1942 / Gauss-Kruger 20N",9001,4284,16320,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28481,"Pulkovo 1942 / Gauss-Kruger 21N",9001,4284,16321,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28482,"Pulkovo 1942 / Gauss-Kruger 22N",9001,4284,16322,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28483,"Pulkovo 1942 / Gauss-Kruger 23N",9001,4284,16323,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28484,"Pulkovo 1942 / Gauss-Kruger 24N",9001,4284,16324,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28485,"Pulkovo 1942 / Gauss-Kruger 25N",9001,4284,16325,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28486,"Pulkovo 1942 / Gauss-Kruger 26N",9001,4284,16326,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28487,"Pulkovo 1942 / Gauss-Kruger 27N",9001,4284,16327,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28488,"Pulkovo 1942 / Gauss-Kruger 28N",9001,4284,16328,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28489,"Pulkovo 1942 / Gauss-Kruger 29N",9001,4284,16329,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28490,"Pulkovo 1942 / Gauss-Kruger 30N",9001,4284,16330,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28491,"Pulkovo 1942 / Gauss-Kruger 31N",9001,4284,16331,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28492,"Pulkovo 1942 / Gauss-Kruger 32N",9001,4284,16332,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+28600,"Qatar 1974 / Qatar National Grid",9001,4285,19919,9807,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+28991,"Amersfoort / RD Old",9001,4289,19913,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+28992,"Amersfoort / RD New",9001,4289,19914,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000.0,9001,8807,463000.0,9001,,,,,,
+29100,"SAD69 / Brazil Polyconic",9001,4291,19941,9818,8801,0.0,9102,8802,-54.0,9102,8806,5000000.0,9001,8807,10000000.0,9001,,,,,,,,,
+29118,"SAD69 / UTM zone 18N",9001,4291,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29119,"SAD69 / UTM zone 19N",9001,4291,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29120,"SAD69 / UTM zone 20N",9001,4291,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29121,"SAD69 / UTM zone 21N",9001,4291,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29122,"SAD69 / UTM zone 22N",9001,4291,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29177,"SAD69 / UTM zone 17S",9001,4291,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29178,"SAD69 / UTM zone 18S",9001,4291,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29179,"SAD69 / UTM zone 19S",9001,4291,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29180,"SAD69 / UTM zone 20S",9001,4291,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29181,"SAD69 / UTM zone 21S",9001,4291,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29182,"SAD69 / UTM zone 22S",9001,4291,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29183,"SAD69 / UTM zone 23S",9001,4291,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29184,"SAD69 / UTM zone 24S",9001,4291,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29185,"SAD69 / UTM zone 25S",9001,4291,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29220,"Sapper Hill 1943 / UTM zone 20S",9001,4292,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29221,"Sapper Hill 1943 / UTM zone 21S",9001,4292,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29333,"Schwarzeck / UTM zone 33S",9001,4293,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29371,South West African Coord. System zone 11,9031,4293,17611,9808,8801,-22.0,9102,8802,11.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29373,South West African Coord. System zone 13,9031,4293,17613,9808,8801,-22.0,9102,8802,13.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29375,South West African Coord. System zone 15,9031,4293,17615,9808,8801,-22.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29377,South West African Coord. System zone 17,9031,4293,17617,9808,8801,-22.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29379,South West African Coord. System zone 19,9031,4293,17619,9808,8801,-22.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29381,South West African Coord. System zone 21,9031,4293,17621,9808,8801,-22.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29383,South West African Coord. System zone 23,9031,4293,17623,9808,8801,-22.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29385,South West African Coord. System zone 25,9031,4293,17625,9808,8801,-22.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+29635,"Sudan / UTM zone 35N",9001,4296,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29636,"Sudan / UTM zone 36N",9001,4296,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29700,"Tananarive (Paris) / Laborde Grid",9001,4810,19911,9815,8811,-21.0,9105,8812,49.0,9105,8813,21.0,9105,8814,21.0,9105,8815,0.9995,9201,8816,400000.0,9001,8817,800000.0,9001
+29738,"Tananarive / UTM zone 38S",9001,4297,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29739,"Tananarive / UTM zone 39S",9001,4297,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+29849,"Timbalai 1948 / UTM zone 49N",9001,4298,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29850,"Timbalai 1948 / UTM zone 50N",9001,4298,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+29871,"Timbalai 1948 / R.S.O. Borneo (ch)",9042,4298,19956,9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,29352.4763,9042,8817,22014.3572,9042
+29872,"Timbalai 1948 / R.S.O. Borneo (ft)",9041,4298,19957,9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,1937263.44,9041,8817,1452947.58,9041
+29873,"Timbalai 1948 / R.S.O. Borneo (m)",9001,4298,19958,9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,590476.87,9001,8817,442857.65,9001
+29900,"TM65 / Irish National Grid",9001,4299,19908,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+29901,"OSNI 1952 / Irish National Grid",9001,4188,19973,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+29902,"TM65 / Irish Grid",9001,4299,19972,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+29903,"TM75 / Irish Grid",9001,4300,19972,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+30161,"Tokyo / Japan Plane Rectangular CS I",9001,4301,17801,9807,8801,33.0,9110,8802,129.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30162,"Tokyo / Japan Plane Rectangular CS II",9001,4301,17802,9807,8801,33.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30163,"Tokyo / Japan Plane Rectangular CS III",9001,4301,17803,9807,8801,36.0,9110,8802,132.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30164,"Tokyo / Japan Plane Rectangular CS IV",9001,4301,17804,9807,8801,33.0,9110,8802,133.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30165,"Tokyo / Japan Plane Rectangular CS V",9001,4301,17805,9807,8801,36.0,9110,8802,134.2,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30166,"Tokyo / Japan Plane Rectangular CS VI",9001,4301,17806,9807,8801,36.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30167,"Tokyo / Japan Plane Rectangular CS VII",9001,4301,17807,9807,8801,36.0,9110,8802,137.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30168,"Tokyo / Japan Plane Rectangular CS VIII",9001,4301,17808,9807,8801,36.0,9110,8802,138.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30169,"Tokyo / Japan Plane Rectangular CS IX",9001,4301,17809,9807,8801,36.0,9110,8802,139.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30170,"Tokyo / Japan Plane Rectangular CS X",9001,4301,17810,9807,8801,40.0,9110,8802,140.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30171,"Tokyo / Japan Plane Rectangular CS XI",9001,4301,17811,9807,8801,44.0,9110,8802,140.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30172,"Tokyo / Japan Plane Rectangular CS XII",9001,4301,17812,9807,8801,44.0,9110,8802,142.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30173,"Tokyo / Japan Plane Rectangular CS XIII",9001,4301,17813,9807,8801,44.0,9110,8802,144.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30174,"Tokyo / Japan Plane Rectangular CS XIV",9001,4301,17814,9807,8801,26.0,9110,8802,142.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30175,"Tokyo / Japan Plane Rectangular CS XV",9001,4301,17815,9807,8801,26.0,9110,8802,127.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30176,"Tokyo / Japan Plane Rectangular CS XVI",9001,4301,17816,9807,8801,26.0,9110,8802,124.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30177,"Tokyo / Japan Plane Rectangular CS XVII",9001,4301,17817,9807,8801,26.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30178,"Tokyo / Japan Plane Rectangular CS XVIII",9001,4301,17818,9807,8801,20.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30179,"Tokyo / Japan Plane Rectangular CS XIX",9001,4301,17819,9807,8801,26.0,9110,8802,154.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+30200,"Trinidad 1903 / Trinidad Grid",9039,4302,19925,9806,8801,10.263,9110,8802,-61.2,9110,8806,430000.0,9039,8807,325000.0,9039,,,,,,,,,
+30339,"TC(1948) / UTM zone 39N",9001,4303,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30340,"TC(1948) / UTM zone 40N",9001,4303,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30491,"Voirol 1875 / Nord Algerie (ancienne)",9001,4304,18011,9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+30492,"Voirol 1875 / Sud Algerie (ancienne)",9001,4304,18012,9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+30729,"Nord Sahara 1959 / UTM zone 29N",9001,4307,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30730,"Nord Sahara 1959 / UTM zone 30N",9001,4307,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30731,"Nord Sahara 1959 / UTM zone 31N",9001,4307,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30732,"Nord Sahara 1959 / UTM zone 32N",9001,4307,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+30791,"Nord Sahara 1959 / Voirol Unifie Nord",9001,4307,18021,9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+30792,"Nord Sahara 1959 / Voirol Unifie Sud",9001,4307,18022,9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+30800,RT38 2.5 gon W,9001,4308,19929,9807,8801,0.0,9110,8802,15.48298,9110,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+31028,"Yoff / UTM zone 28N",9001,4310,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31121,"Zanderij / UTM zone 21N",9001,4311,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31154,"Zanderij / TM 54 NW",9001,4311,17054,9807,8801,0.0,9102,8802,-54.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31170,"Zanderij / Suriname Old TM",9001,4311,19954,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31171,"Zanderij / Suriname TM",9001,4311,19955,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31265,"MGI / 3-degree Gauss zone 5",9001,4312,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31266,"MGI / 3-degree Gauss zone 6",9001,4312,16266,9807,8801,0.0,9102,8802,18.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+31267,"MGI / 3-degree Gauss zone 7",9001,4312,16267,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+31268,"MGI / 3-degree Gauss zone 8",9001,4312,16268,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+31275,"MGI / Balkans zone 5",9001,4312,18275,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31276,"MGI / Balkans zone 6",9001,4312,18276,9807,8801,0.0,9102,8802,18.0,9102,8805,0.9999,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+31277,"MGI / Balkans zone 7",9001,4312,18277,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+31278,"MGI / Balkans zone 8",9001,4312,18277,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+31279,"MGI / Balkans zone 8",9001,4312,18278,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9999,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+31281,"MGI (Ferro) / Austria West Zone",9001,4805,18041,9807,8801,0.0,9102,8802,28.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31282,"MGI (Ferro) / Austria Central Zone",9001,4805,18042,9807,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31283,"MGI (Ferro) / Austria East Zone",9001,4805,18043,9807,8801,0.0,9102,8802,34.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31284,"MGI / M28",9001,4312,18044,9807,8801,0.0,9110,8802,10.2,9110,8805,1.0,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+31285,"MGI / M31",9001,4312,18045,9807,8801,0.0,9110,8802,13.2,9110,8805,1.0,9201,8806,450000.0,9001,8807,0.0,9001,,,,,,
+31286,"MGI / M34",9001,4312,18046,9807,8801,0.0,9110,8802,16.2,9110,8805,1.0,9201,8806,750000.0,9001,8807,0.0,9001,,,,,,
+31287,"MGI / Austria Lambert",9001,4312,19947,9802,8821,47.3,9110,8822,13.2,9110,8823,49.0,9110,8824,46.0,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+31291,"MGI (Ferro) / Austria West Zone",9001,4805,18041,9807,8801,0.0,9102,8802,28.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31292,"MGI (Ferro) / Austria Central Zone",9001,4805,18042,9807,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31293,"MGI (Ferro) / Austria East Zone",9001,4805,18043,9807,8801,0.0,9102,8802,34.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+31294,"MGI / M28",9001,4312,18044,9807,8801,0.0,9110,8802,10.2,9110,8805,1.0,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+31295,"MGI / M31",9001,4312,18045,9807,8801,0.0,9110,8802,13.2,9110,8805,1.0,9201,8806,450000.0,9001,8807,0.0,9001,,,,,,
+31296,"MGI / M34",9001,4312,18046,9807,8801,0.0,9110,8802,16.2,9110,8805,1.0,9201,8806,750000.0,9001,8807,0.0,9001,,,,,,
+31297,"MGI / Austria Lambert",9001,4312,19947,9802,8821,47.3,9110,8822,13.2,9110,8823,49.0,9110,8824,46.0,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+31300,"Belge 1972 / Belge Lambert 72",9001,4313,19902,9803,8821,90.0,9110,8822,4.2124983,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.01256,9001,8827,5400088.4378,9001,,,
+31370,"Belge 1972 / Belgian Lambert 72",9001,4313,19961,9802,8821,90.0,9110,8822,4.2202952,9110,8823,51.100000204,9110,8824,49.500000204,9110,8826,150000.013,9001,8827,5400088.438,9001,,,
+31461,"DHDN / 3-degree Gauss zone 1",9001,4314,16261,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+31462,"DHDN / 3-degree Gauss zone 2",9001,4314,16262,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+31463,"DHDN / 3-degree Gauss zone 3",9001,4314,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+31464,"DHDN / 3-degree Gauss zone 4",9001,4314,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+31465,"DHDN / 3-degree Gauss zone 5",9001,4314,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31466,"DHDN / Gauss-Kruger zone 2",9001,4314,16262,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+31467,"DHDN / Gauss-Kruger zone 3",9001,4314,16263,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+31468,"DHDN / Gauss-Kruger zone 4",9001,4314,16264,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+31469,"DHDN / Gauss-Kruger zone 5",9001,4314,16265,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+31528,"Conakry 1905 / UTM zone 28N",9001,4315,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31529,"Conakry 1905 / UTM zone 29N",9001,4315,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31600,"Dealul Piscului 1933/ Stereo 33",9001,4316,19927,9809,8801,45.54,9110,8802,25.23328772,9110,8805,0.9996667,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+31700,"Dealul Piscului 1970/ Stereo 70",9001,4317,19926,9809,8801,46.0,9102,8802,25.0,9102,8805,0.99975,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+31838,"NGN / UTM zone 38N",9001,4318,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31839,"NGN / UTM zone 39N",9001,4318,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31900,"KUDAMS / KTM",9001,4319,19928,9807,8801,0.0,9102,8802,48.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31986,"SIRGAS / UTM zone 17N",9001,4170,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31987,"SIRGAS / UTM zone 18N",9001,4170,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31988,"SIRGAS / UTM zone 19N",9001,4170,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31989,"SIRGAS / UTM zone 20N",9001,4170,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31990,"SIRGAS / UTM zone 21N",9001,4170,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31991,"SIRGAS / UTM zone 22N",9001,4170,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+31992,"SIRGAS / UTM zone 17S",9001,4170,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31993,"SIRGAS / UTM zone 18S",9001,4170,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31994,"SIRGAS / UTM zone 19S",9001,4170,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31995,"SIRGAS / UTM zone 20S",9001,4170,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31996,"SIRGAS / UTM zone 21S",9001,4170,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31997,"SIRGAS / UTM zone 22S",9001,4170,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31998,"SIRGAS / UTM zone 23S",9001,4170,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+31999,"SIRGAS / UTM zone 24S",9001,4170,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32000,"SIRGAS / UTM zone 25S",9001,4170,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32001,"NAD27 / Montana North",9003,4267,12501,9802,8821,47.0,9110,8822,-109.3,9110,8823,48.43,9110,8824,47.51,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32002,"NAD27 / Montana Central",9003,4267,12502,9802,8821,45.5,9110,8822,-109.3,9110,8823,47.53,9110,8824,46.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32003,"NAD27 / Montana South",9003,4267,12503,9802,8821,44.0,9110,8822,-109.3,9110,8823,46.24,9110,8824,44.52,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32005,"NAD27 / Nebraska North",9003,4267,12601,9802,8821,41.2,9110,8822,-100.0,9110,8823,41.51,9110,8824,42.49,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32006,"NAD27 / Nebraska South",9003,4267,12602,9802,8821,39.4,9110,8822,-99.3,9110,8823,40.17,9110,8824,41.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32007,"NAD27 / Nevada East",9003,4267,12701,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32008,"NAD27 / Nevada Central",9003,4267,12702,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32009,"NAD27 / Nevada West",9003,4267,12703,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32010,"NAD27 / New Hampshire",9003,4267,12800,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32011,"NAD27 / New Jersey",9003,4267,12900,9807,8801,38.5,9110,8802,-74.4,9110,8805,0.999975,9201,8806,2000000.0,9003,8807,0.0,9003,,,,,,
+32012,"NAD27 / New Mexico East",9003,4267,13001,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32013,"NAD27 / New Mexico Central",9003,4267,13002,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32014,"NAD27 / New Mexico West",9003,4267,13003,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32015,"NAD27 / New York East",9003,4267,13101,9807,8801,40.0,9110,8802,-74.2,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32016,"NAD27 / New York Central",9003,4267,13102,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32017,"NAD27 / New York West",9003,4267,13103,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32018,"NAD27 / New York Long Island",9003,4267,13104,9802,8821,40.3,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,1000000.0,9003,8827,0.0,9003,,,
+32019,"NAD27 / North Carolina",9003,4267,13200,9802,8821,33.45,9110,8822,-79.0,9110,8823,34.2,9110,8824,36.1,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32020,"NAD27 / North Dakota North",9003,4267,13301,9802,8821,47.0,9110,8822,-100.3,9110,8823,47.26,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32021,"NAD27 / North Dakota South",9003,4267,13302,9802,8821,45.4,9110,8822,-100.3,9110,8823,46.11,9110,8824,47.29,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32022,"NAD27 / Ohio North",9003,4267,13401,9802,8821,39.4,9110,8822,-82.3,9110,8823,40.26,9110,8824,41.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32023,"NAD27 / Ohio South",9003,4267,13402,9802,8821,38.0,9110,8822,-82.3,9110,8823,38.44,9110,8824,40.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32024,"NAD27 / Oklahoma North",9003,4267,13501,9802,8821,35.0,9110,8822,-98.0,9110,8823,35.34,9110,8824,36.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32025,"NAD27 / Oklahoma South",9003,4267,13502,9802,8821,33.2,9110,8822,-98.0,9110,8823,33.56,9110,8824,35.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32026,"NAD27 / Oregon North",9003,4267,13601,9802,8821,43.4,9110,8822,-120.3,9110,8823,44.2,9110,8824,46.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32027,"NAD27 / Oregon South",9003,4267,13602,9802,8821,41.4,9110,8822,-120.3,9110,8823,42.2,9110,8824,44.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32028,"NAD27 / Pennsylvania North",9003,4267,13701,9802,8821,40.1,9110,8822,-77.45,9110,8823,40.53,9110,8824,41.57,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32029,"NAD27 / Pennsylvania South",9003,4267,13702,9802,8821,39.2,9110,8822,-77.45,9110,8823,39.56,9110,8824,40.48,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32030,"NAD27 / Rhode Island",9003,4267,13800,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.9999938,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32031,"NAD27 / South Carolina North",9003,4267,13901,9802,8821,33.0,9110,8822,-81.0,9110,8823,33.46,9110,8824,34.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32033,"NAD27 / South Carolina South",9003,4267,13902,9802,8821,31.5,9110,8822,-81.0,9110,8823,32.2,9110,8824,33.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32034,"NAD27 / South Dakota North",9003,4267,14001,9802,8821,43.5,9110,8822,-100.0,9110,8823,44.25,9110,8824,45.41,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32035,"NAD27 / South Dakota South",9003,4267,14002,9802,8821,42.2,9110,8822,-100.2,9110,8823,42.5,9110,8824,44.24,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32036,"NAD27 / Tennessee",9003,4267,14100,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,100000.0,9003,8827,0.0,9003,,,
+32037,"NAD27 / Texas North",9003,4267,14201,9802,8821,34.0,9110,8822,-101.3,9110,8823,34.39,9110,8824,36.11,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32038,"NAD27 / Texas North Central",9003,4267,14202,9802,8821,31.4,9110,8822,-97.3,9110,8823,32.08,9110,8824,33.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32039,"NAD27 / Texas Central",9003,4267,14203,9802,8821,29.4,9110,8822,-100.2,9110,8823,30.07,9110,8824,31.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32040,"NAD27 / Texas South Central",9003,4267,14204,9802,8821,27.5,9110,8822,-99.0,9110,8823,28.23,9110,8824,30.17,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32041,"NAD27 / Texas South",9003,4267,14205,9802,8821,25.4,9110,8822,-98.3,9110,8823,26.1,9110,8824,27.5,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32042,"NAD27 / Utah North",9003,4267,14301,9802,8821,40.2,9110,8822,-111.3,9110,8823,40.43,9110,8824,41.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32043,"NAD27 / Utah Central",9003,4267,14302,9802,8821,38.2,9110,8822,-111.3,9110,8823,39.01,9110,8824,40.39,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32044,"NAD27 / Utah South",9003,4267,14303,9802,8821,36.4,9110,8822,-111.3,9110,8823,37.13,9110,8824,38.21,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32045,"NAD27 / Vermont",9003,4267,14400,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32046,"NAD27 / Virginia North",9003,4267,14501,9802,8821,37.4,9110,8822,-78.3,9110,8823,38.02,9110,8824,39.12,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32047,"NAD27 / Virginia South",9003,4267,14502,9802,8821,36.2,9110,8822,-78.3,9110,8823,36.46,9110,8824,37.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32048,"NAD27 / Washington North",9003,4267,14601,9802,8821,47.0,9110,8822,-120.5,9110,8823,47.3,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32049,"NAD27 / Washington South",9003,4267,14602,9802,8821,45.2,9110,8822,-120.3,9110,8823,45.5,9110,8824,47.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32050,"NAD27 / West Virginia North",9003,4267,14701,9802,8821,38.3,9110,8822,-79.3,9110,8823,39.0,9110,8824,40.15,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32051,"NAD27 / West Virginia South",9003,4267,14702,9802,8821,37.0,9110,8822,-81.0,9110,8823,37.29,9110,8824,38.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32052,"NAD27 / Wisconsin North",9003,4267,14801,9802,8821,45.1,9110,8822,-90.0,9110,8823,45.34,9110,8824,46.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32053,"NAD27 / Wisconsin Central",9003,4267,14802,9802,8821,43.5,9110,8822,-90.0,9110,8823,44.15,9110,8824,45.3,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32054,"NAD27 / Wisconsin South",9003,4267,14803,9802,8821,42.0,9110,8822,-90.0,9110,8823,42.44,9110,8824,44.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+32055,"NAD27 / Wyoming East",9003,4267,14901,9807,8801,40.4,9110,8802,-105.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32056,"NAD27 / Wyoming East Central",9003,4267,14902,9807,8801,40.4,9110,8802,-107.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32057,"NAD27 / Wyoming West Central",9003,4267,14903,9807,8801,40.4,9110,8802,-108.45,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32058,"NAD27 / Wyoming West",9003,4267,14904,9807,8801,40.4,9110,8802,-110.05,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+32061,"NAD27 / Guatemala Norte",9001,4267,18211,9801,8801,16.49,9110,8802,-90.2,9110,8805,0.99992226,9201,8806,500000.0,9001,8807,292209.579,9001,,,,,,
+32062,"NAD27 / Guatemala Sur",9001,4267,18212,9801,8801,14.54,9110,8802,-90.2,9110,8805,0.99989906,9201,8806,500000.0,9001,8807,325992.681,9001,,,,,,
+32064,"NAD27 / BLM 14N (ftUS)",9003,4267,15914,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32065,"NAD27 / BLM 15N (ftUS)",9003,4267,15915,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32066,"NAD27 / BLM 16N (ftUS)",9003,4267,15916,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32067,"NAD27 / BLM 17N (ftUS)",9003,4267,15917,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32074,"NAD27 / BLM 14N (feet)",9003,4267,15914,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32075,"NAD27 / BLM 15N (feet)",9003,4267,15915,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32076,"NAD27 / BLM 16N (feet)",9003,4267,15916,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32077,"NAD27 / BLM 17N (feet)",9003,4267,15917,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+32081,"NAD27 / MTM zone 1",9001,4267,17701,9807,8801,0.0,9102,8802,-53.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32082,"NAD27 / MTM zone 2",9001,4267,17702,9807,8801,0.0,9102,8802,-56.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32083,"NAD27 / MTM zone 3",9001,4267,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32084,"NAD27 / MTM zone 4",9001,4267,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32085,"NAD27 / MTM zone 5",9001,4267,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32086,"NAD27 / MTM zone 6",9001,4267,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32098,"NAD27 / Quebec Lambert",9001,4267,19944,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+32100,"NAD83 / Montana",9001,4269,12530,9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32104,"NAD83 / Nebraska",9001,4269,12630,9802,8821,39.5,9110,8822,-100.0,9110,8823,43.0,9110,8824,40.0,9110,8826,500000.0,9001,8827,0.0,9001,,,
+32107,"NAD83 / Nevada East",9001,4269,12731,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,200000.0,9001,8807,8000000.0,9001,,,,,,
+32108,"NAD83 / Nevada Central",9001,4269,12732,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9001,8807,6000000.0,9001,,,,,,
+32109,"NAD83 / Nevada West",9001,4269,12733,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,800000.0,9001,8807,4000000.0,9001,,,,,,
+32110,"NAD83 / New Hampshire",9001,4269,12830,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+32111,"NAD83 / New Jersey",9001,4269,12930,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+32112,"NAD83 / New Mexico East",9001,4269,13031,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,165000.0,9001,8807,0.0,9001,,,,,,
+32113,"NAD83 / New Mexico Central",9001,4269,13032,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32114,"NAD83 / New Mexico West",9001,4269,13033,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,830000.0,9001,8807,0.0,9001,,,,,,
+32115,"NAD83 / New York East",9001,4269,13131,9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+32116,"NAD83 / New York Central",9001,4269,13132,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+32117,"NAD83 / New York West",9001,4269,13133,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,350000.0,9001,8807,0.0,9001,,,,,,
+32118,"NAD83 / New York Long Island",9001,4269,13134,9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,300000.0,9001,8827,0.0,9001,,,
+32119,"NAD83 / North Carolina",9001,4269,13230,9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,609601.22,9001,8827,0.0,9001,,,
+32120,"NAD83 / North Dakota North",9001,4269,13331,9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32121,"NAD83 / North Dakota South",9001,4269,13332,9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32122,"NAD83 / Ohio North",9001,4269,13431,9802,8821,39.4,9110,8822,-82.3,9110,8823,41.42,9110,8824,40.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32123,"NAD83 / Ohio South",9001,4269,13432,9802,8821,38.0,9110,8822,-82.3,9110,8823,40.02,9110,8824,38.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32124,"NAD83 / Oklahoma North",9001,4269,13531,9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32125,"NAD83 / Oklahoma South",9001,4269,13532,9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32126,"NAD83 / Oregon North",9001,4269,13631,9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,2500000.0,9001,8827,0.0,9001,,,
+32127,"NAD83 / Oregon South",9001,4269,13632,9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,1500000.0,9001,8827,0.0,9001,,,
+32128,"NAD83 / Pennsylvania North",9001,4269,13731,9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32129,"NAD83 / Pennsylvania South",9001,4269,13732,9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32130,"NAD83 / Rhode Island",9001,4269,13830,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.99999375,9201,8806,100000.0,9001,8807,0.0,9001,,,,,,
+32133,"NAD83 / South Carolina",9001,4269,13930,9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,609600.0,9001,8827,0.0,9001,,,
+32134,"NAD83 / South Dakota North",9001,4269,14031,9802,8821,43.5,9110,8822,-100.0,9110,8823,45.41,9110,8824,44.25,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32135,"NAD83 / South Dakota South",9001,4269,14032,9802,8821,42.2,9110,8822,-100.2,9110,8823,44.24,9110,8824,42.5,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32136,"NAD83 / Tennessee",9001,4269,14130,9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32137,"NAD83 / Texas North",9001,4269,14231,9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,200000.0,9001,8827,1000000.0,9001,,,
+32138,"NAD83 / Texas North Central",9001,4269,14232,9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,600000.0,9001,8827,2000000.0,9001,,,
+32139,"NAD83 / Texas Central",9001,4269,14233,9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,700000.0,9001,8827,3000000.0,9001,,,
+32140,"NAD83 / Texas South Central",9001,4269,14234,9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,600000.0,9001,8827,4000000.0,9001,,,
+32141,"NAD83 / Texas South",9001,4269,14235,9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,300000.0,9001,8827,5000000.0,9001,,,
+32142,"NAD83 / Utah North",9001,4269,14331,9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,500000.0,9001,8827,1000000.0,9001,,,
+32143,"NAD83 / Utah Central",9001,4269,14332,9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,500000.0,9001,8827,2000000.0,9001,,,
+32144,"NAD83 / Utah South",9001,4269,14333,9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,500000.0,9001,8827,3000000.0,9001,,,
+32145,"NAD83 / Vermont",9001,4269,14430,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32146,"NAD83 / Virginia North",9001,4269,14531,9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,3500000.0,9001,8827,2000000.0,9001,,,
+32147,"NAD83 / Virginia South",9001,4269,14532,9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,3500000.0,9001,8827,1000000.0,9001,,,
+32148,"NAD83 / Washington North",9001,4269,14631,9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,500000.0,9001,8827,0.0,9001,,,
+32149,"NAD83 / Washington South",9001,4269,14632,9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,500000.0,9001,8827,0.0,9001,,,
+32150,"NAD83 / West Virginia North",9001,4269,14731,9802,8821,38.3,9110,8822,-79.3,9110,8823,40.15,9110,8824,39.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32151,"NAD83 / West Virginia South",9001,4269,14732,9802,8821,37.0,9110,8822,-81.0,9110,8823,38.53,9110,8824,37.29,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32152,"NAD83 / Wisconsin North",9001,4269,14831,9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32153,"NAD83 / Wisconsin Central",9001,4269,14832,9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32154,"NAD83 / Wisconsin South",9001,4269,14833,9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+32155,"NAD83 / Wyoming East",9001,4269,14931,9807,8801,40.3,9110,8802,-105.1,9110,8805,0.9999375,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+32156,"NAD83 / Wyoming East Central",9001,4269,14932,9807,8801,40.3,9110,8802,-107.2,9110,8805,0.9999375,9201,8806,400000.0,9001,8807,100000.0,9001,,,,,,
+32157,"NAD83 / Wyoming West Central",9001,4269,14933,9807,8801,40.3,9110,8802,-108.45,9110,8805,0.9999375,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+32158,"NAD83 / Wyoming West",9001,4269,14934,9807,8801,40.3,9110,8802,-110.05,9110,8805,0.9999375,9201,8806,800000.0,9001,8807,100000.0,9001,,,,,,
+32161,"NAD83 / Puerto Rico & Virgin Is.",9001,4269,15230,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,200000.0,9001,8827,200000.0,9001,,,
+32180,"NAD83 / SCoPQ zone 2",9001,4269,17700,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32181,"NAD83 / MTM zone 1",9001,4269,17701,9807,8801,0.0,9102,8802,-53.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32182,"NAD83 / MTM zone 2",9001,4269,17702,9807,8801,0.0,9102,8802,-56.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32183,"NAD83 / MTM zone 3",9001,4269,17703,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32184,"NAD83 / MTM zone 4",9001,4269,17704,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32185,"NAD83 / MTM zone 5",9001,4269,17705,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32186,"NAD83 / MTM zone 6",9001,4269,17706,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32187,"NAD83 / MTM zone 7",9001,4269,17707,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32188,"NAD83 / MTM zone 8",9001,4269,17708,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32189,"NAD83 / MTM zone 9",9001,4269,17709,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32190,"NAD83 / MTM zone 10",9001,4269,17710,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32191,"NAD83 / MTM zone 11",9001,4269,17711,9807,8801,0.0,9110,8802,-82.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32192,"NAD83 / MTM zone 12",9001,4269,17712,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32193,"NAD83 / MTM zone 13",9001,4269,17713,9807,8801,0.0,9102,8802,-84.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32194,"NAD83 / MTM zone 14",9001,4269,17714,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32195,"NAD83 / MTM zone 15",9001,4269,17715,9807,8801,0.0,9102,8802,-90.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32196,"NAD83 / MTM zone 16",9001,4269,17716,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32197,"NAD83 / MTM zone 17",9001,4269,17717,9807,8801,0.0,9102,8802,-96.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+32198,"NAD83 / Quebec Lambert",9001,4269,19944,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+32201,"WGS 72 / UTM zone 1N",9001,4322,16001,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32202,"WGS 72 / UTM zone 2N",9001,4322,16002,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32203,"WGS 72 / UTM zone 3N",9001,4322,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32204,"WGS 72 / UTM zone 4N",9001,4322,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32205,"WGS 72 / UTM zone 5N",9001,4322,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32206,"WGS 72 / UTM zone 6N",9001,4322,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32207,"WGS 72 / UTM zone 7N",9001,4322,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32208,"WGS 72 / UTM zone 8N",9001,4322,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32209,"WGS 72 / UTM zone 9N",9001,4322,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32210,"WGS 72 / UTM zone 10N",9001,4322,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32211,"WGS 72 / UTM zone 11N",9001,4322,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32212,"WGS 72 / UTM zone 12N",9001,4322,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32213,"WGS 72 / UTM zone 13N",9001,4322,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32214,"WGS 72 / UTM zone 14N",9001,4322,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32215,"WGS 72 / UTM zone 15N",9001,4322,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32216,"WGS 72 / UTM zone 16N",9001,4322,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32217,"WGS 72 / UTM zone 17N",9001,4322,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32218,"WGS 72 / UTM zone 18N",9001,4322,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32219,"WGS 72 / UTM zone 19N",9001,4322,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32220,"WGS 72 / UTM zone 20N",9001,4322,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32221,"WGS 72 / UTM zone 21N",9001,4322,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32222,"WGS 72 / UTM zone 22N",9001,4322,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32223,"WGS 72 / UTM zone 23N",9001,4322,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32224,"WGS 72 / UTM zone 24N",9001,4322,16024,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32225,"WGS 72 / UTM zone 25N",9001,4322,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32226,"WGS 72 / UTM zone 26N",9001,4322,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32227,"WGS 72 / UTM zone 27N",9001,4322,16027,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32228,"WGS 72 / UTM zone 28N",9001,4322,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32229,"WGS 72 / UTM zone 29N",9001,4322,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32230,"WGS 72 / UTM zone 30N",9001,4322,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32231,"WGS 72 / UTM zone 31N",9001,4322,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32232,"WGS 72 / UTM zone 32N",9001,4322,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32233,"WGS 72 / UTM zone 33N",9001,4322,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32234,"WGS 72 / UTM zone 34N",9001,4322,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32235,"WGS 72 / UTM zone 35N",9001,4322,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32236,"WGS 72 / UTM zone 36N",9001,4322,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32237,"WGS 72 / UTM zone 37N",9001,4322,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32238,"WGS 72 / UTM zone 38N",9001,4322,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32239,"WGS 72 / UTM zone 39N",9001,4322,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32240,"WGS 72 / UTM zone 40N",9001,4322,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32241,"WGS 72 / UTM zone 41N",9001,4322,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32242,"WGS 72 / UTM zone 42N",9001,4322,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32243,"WGS 72 / UTM zone 43N",9001,4322,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32244,"WGS 72 / UTM zone 44N",9001,4322,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32245,"WGS 72 / UTM zone 45N",9001,4322,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32246,"WGS 72 / UTM zone 46N",9001,4322,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32247,"WGS 72 / UTM zone 47N",9001,4322,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32248,"WGS 72 / UTM zone 48N",9001,4322,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32249,"WGS 72 / UTM zone 49N",9001,4322,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32250,"WGS 72 / UTM zone 50N",9001,4322,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32251,"WGS 72 / UTM zone 51N",9001,4322,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32252,"WGS 72 / UTM zone 52N",9001,4322,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32253,"WGS 72 / UTM zone 53N",9001,4322,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32254,"WGS 72 / UTM zone 54N",9001,4322,16054,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32255,"WGS 72 / UTM zone 55N",9001,4322,16055,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32256,"WGS 72 / UTM zone 56N",9001,4322,16056,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32257,"WGS 72 / UTM zone 57N",9001,4322,16057,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32258,"WGS 72 / UTM zone 58N",9001,4322,16058,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32259,"WGS 72 / UTM zone 59N",9001,4322,16059,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32260,"WGS 72 / UTM zone 60N",9001,4322,16060,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32301,"WGS 72 / UTM zone 1S",9001,4322,16101,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32302,"WGS 72 / UTM zone 2S",9001,4322,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32303,"WGS 72 / UTM zone 3S",9001,4322,16103,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32304,"WGS 72 / UTM zone 4S",9001,4322,16104,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32305,"WGS 72 / UTM zone 5S",9001,4322,16105,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32306,"WGS 72 / UTM zone 6S",9001,4322,16106,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32307,"WGS 72 / UTM zone 7S",9001,4322,16107,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32308,"WGS 72 / UTM zone 8S",9001,4322,16108,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32309,"WGS 72 / UTM zone 9S",9001,4322,16109,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32310,"WGS 72 / UTM zone 10S",9001,4322,16110,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32311,"WGS 72 / UTM zone 11S",9001,4322,16111,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32312,"WGS 72 / UTM zone 12S",9001,4322,16112,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32313,"WGS 72 / UTM zone 13S",9001,4322,16113,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32314,"WGS 72 / UTM zone 14S",9001,4322,16114,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32315,"WGS 72 / UTM zone 15S",9001,4322,16115,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32316,"WGS 72 / UTM zone 16S",9001,4322,16116,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32317,"WGS 72 / UTM zone 17S",9001,4322,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32318,"WGS 72 / UTM zone 18S",9001,4322,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32319,"WGS 72 / UTM zone 19S",9001,4322,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32320,"WGS 72 / UTM zone 20S",9001,4322,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32321,"WGS 72 / UTM zone 21S",9001,4322,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32322,"WGS 72 / UTM zone 22S",9001,4322,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32323,"WGS 72 / UTM zone 23S",9001,4322,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32324,"WGS 72 / UTM zone 24S",9001,4322,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32325,"WGS 72 / UTM zone 25S",9001,4322,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32326,"WGS 72 / UTM zone 26S",9001,4322,16126,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32327,"WGS 72 / UTM zone 27S",9001,4322,16127,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32328,"WGS 72 / UTM zone 28S",9001,4322,16128,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32329,"WGS 72 / UTM zone 29S",9001,4322,16129,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32330,"WGS 72 / UTM zone 30S",9001,4322,16130,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32331,"WGS 72 / UTM zone 31S",9001,4322,16131,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32332,"WGS 72 / UTM zone 32S",9001,4322,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32333,"WGS 72 / UTM zone 33S",9001,4322,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32334,"WGS 72 / UTM zone 34S",9001,4322,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32335,"WGS 72 / UTM zone 35S",9001,4322,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32336,"WGS 72 / UTM zone 36S",9001,4322,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32337,"WGS 72 / UTM zone 37S",9001,4322,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32338,"WGS 72 / UTM zone 38S",9001,4322,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32339,"WGS 72 / UTM zone 39S",9001,4322,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32340,"WGS 72 / UTM zone 40S",9001,4322,16140,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32341,"WGS 72 / UTM zone 41S",9001,4322,16141,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32342,"WGS 72 / UTM zone 42S",9001,4322,16142,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32343,"WGS 72 / UTM zone 43S",9001,4322,16143,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32344,"WGS 72 / UTM zone 44S",9001,4322,16144,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32345,"WGS 72 / UTM zone 45S",9001,4322,16145,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32346,"WGS 72 / UTM zone 46S",9001,4322,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32347,"WGS 72 / UTM zone 47S",9001,4322,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32348,"WGS 72 / UTM zone 48S",9001,4322,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32349,"WGS 72 / UTM zone 49S",9001,4322,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32350,"WGS 72 / UTM zone 50S",9001,4322,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32351,"WGS 72 / UTM zone 51S",9001,4322,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32352,"WGS 72 / UTM zone 52S",9001,4322,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32353,"WGS 72 / UTM zone 53S",9001,4322,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32354,"WGS 72 / UTM zone 54S",9001,4322,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32355,"WGS 72 / UTM zone 55S",9001,4322,16155,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32356,"WGS 72 / UTM zone 56S",9001,4322,16156,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32357,"WGS 72 / UTM zone 57S",9001,4322,16157,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32358,"WGS 72 / UTM zone 58S",9001,4322,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32359,"WGS 72 / UTM zone 59S",9001,4322,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32360,"WGS 72 / UTM zone 60S",9001,4322,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32401,"WGS 72BE / UTM zone 1N",9001,4324,16001,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32402,"WGS 72BE / UTM zone 2N",9001,4324,16002,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32403,"WGS 72BE / UTM zone 3N",9001,4324,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32404,"WGS 72BE / UTM zone 4N",9001,4324,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32405,"WGS 72BE / UTM zone 5N",9001,4324,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32406,"WGS 72BE / UTM zone 6N",9001,4324,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32407,"WGS 72BE / UTM zone 7N",9001,4324,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32408,"WGS 72BE / UTM zone 8N",9001,4324,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32409,"WGS 72BE / UTM zone 9N",9001,4324,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32410,"WGS 72BE / UTM zone 10N",9001,4324,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32411,"WGS 72BE / UTM zone 11N",9001,4324,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32412,"WGS 72BE / UTM zone 12N",9001,4324,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32413,"WGS 72BE / UTM zone 13N",9001,4324,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32414,"WGS 72BE / UTM zone 14N",9001,4324,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32415,"WGS 72BE / UTM zone 15N",9001,4324,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32416,"WGS 72BE / UTM zone 16N",9001,4324,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32417,"WGS 72BE / UTM zone 17N",9001,4324,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32418,"WGS 72BE / UTM zone 18N",9001,4324,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32419,"WGS 72BE / UTM zone 19N",9001,4324,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32420,"WGS 72BE / UTM zone 20N",9001,4324,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32421,"WGS 72BE / UTM zone 21N",9001,4324,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32422,"WGS 72BE / UTM zone 22N",9001,4324,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32423,"WGS 72BE / UTM zone 23N",9001,4324,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32424,"WGS 72BE / UTM zone 24N",9001,4324,16024,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32425,"WGS 72BE / UTM zone 25N",9001,4324,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32426,"WGS 72BE / UTM zone 26N",9001,4324,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32427,"WGS 72BE / UTM zone 27N",9001,4324,16027,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32428,"WGS 72BE / UTM zone 28N",9001,4324,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32429,"WGS 72BE / UTM zone 29N",9001,4324,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32430,"WGS 72BE / UTM zone 30N",9001,4324,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32431,"WGS 72BE / UTM zone 31N",9001,4324,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32432,"WGS 72BE / UTM zone 32N",9001,4324,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32433,"WGS 72BE / UTM zone 33N",9001,4324,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32434,"WGS 72BE / UTM zone 34N",9001,4324,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32435,"WGS 72BE / UTM zone 35N",9001,4324,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32436,"WGS 72BE / UTM zone 36N",9001,4324,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32437,"WGS 72BE / UTM zone 37N",9001,4324,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32438,"WGS 72BE / UTM zone 38N",9001,4324,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32439,"WGS 72BE / UTM zone 39N",9001,4324,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32440,"WGS 72BE / UTM zone 40N",9001,4324,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32441,"WGS 72BE / UTM zone 41N",9001,4324,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32442,"WGS 72BE / UTM zone 42N",9001,4324,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32443,"WGS 72BE / UTM zone 43N",9001,4324,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32444,"WGS 72BE / UTM zone 44N",9001,4324,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32445,"WGS 72BE / UTM zone 45N",9001,4324,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32446,"WGS 72BE / UTM zone 46N",9001,4324,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32447,"WGS 72BE / UTM zone 47N",9001,4324,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32448,"WGS 72BE / UTM zone 48N",9001,4324,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32449,"WGS 72BE / UTM zone 49N",9001,4324,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32450,"WGS 72BE / UTM zone 50N",9001,4324,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32451,"WGS 72BE / UTM zone 51N",9001,4324,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32452,"WGS 72BE / UTM zone 52N",9001,4324,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32453,"WGS 72BE / UTM zone 53N",9001,4324,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32454,"WGS 72BE / UTM zone 54N",9001,4324,16054,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32455,"WGS 72BE / UTM zone 55N",9001,4324,16055,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32456,"WGS 72BE / UTM zone 56N",9001,4324,16056,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32457,"WGS 72BE / UTM zone 57N",9001,4324,16057,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32458,"WGS 72BE / UTM zone 58N",9001,4324,16058,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32459,"WGS 72BE / UTM zone 59N",9001,4324,16059,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32460,"WGS 72BE / UTM zone 60N",9001,4324,16060,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32501,"WGS 72BE / UTM zone 1S",9001,4324,16101,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32502,"WGS 72BE / UTM zone 2S",9001,4324,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32503,"WGS 72BE / UTM zone 3S",9001,4324,16103,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32504,"WGS 72BE / UTM zone 4S",9001,4324,16104,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32505,"WGS 72BE / UTM zone 5S",9001,4324,16105,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32506,"WGS 72BE / UTM zone 6S",9001,4324,16106,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32507,"WGS 72BE / UTM zone 7S",9001,4324,16107,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32508,"WGS 72BE / UTM zone 8S",9001,4324,16108,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32509,"WGS 72BE / UTM zone 9S",9001,4324,16109,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32510,"WGS 72BE / UTM zone 10S",9001,4324,16110,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32511,"WGS 72BE / UTM zone 11S",9001,4324,16111,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32512,"WGS 72BE / UTM zone 12S",9001,4324,16112,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32513,"WGS 72BE / UTM zone 13S",9001,4324,16113,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32514,"WGS 72BE / UTM zone 14S",9001,4324,16114,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32515,"WGS 72BE / UTM zone 15S",9001,4324,16115,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32516,"WGS 72BE / UTM zone 16S",9001,4324,16116,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32517,"WGS 72BE / UTM zone 17S",9001,4324,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32518,"WGS 72BE / UTM zone 18S",9001,4324,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32519,"WGS 72BE / UTM zone 19S",9001,4324,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32520,"WGS 72BE / UTM zone 20S",9001,4324,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32521,"WGS 72BE / UTM zone 21S",9001,4324,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32522,"WGS 72BE / UTM zone 22S",9001,4324,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32523,"WGS 72BE / UTM zone 23S",9001,4324,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32524,"WGS 72BE / UTM zone 24S",9001,4324,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32525,"WGS 72BE / UTM zone 25S",9001,4324,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32526,"WGS 72BE / UTM zone 26S",9001,4324,16126,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32527,"WGS 72BE / UTM zone 27S",9001,4324,16127,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32528,"WGS 72BE / UTM zone 28S",9001,4324,16128,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32529,"WGS 72BE / UTM zone 29S",9001,4324,16129,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32530,"WGS 72BE / UTM zone 30S",9001,4324,16130,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32531,"WGS 72BE / UTM zone 31S",9001,4324,16131,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32532,"WGS 72BE / UTM zone 32S",9001,4324,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32533,"WGS 72BE / UTM zone 33S",9001,4324,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32534,"WGS 72BE / UTM zone 34S",9001,4324,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32535,"WGS 72BE / UTM zone 35S",9001,4324,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32536,"WGS 72BE / UTM zone 36S",9001,4324,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32537,"WGS 72BE / UTM zone 37S",9001,4324,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32538,"WGS 72BE / UTM zone 38S",9001,4324,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32539,"WGS 72BE / UTM zone 39S",9001,4324,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32540,"WGS 72BE / UTM zone 40S",9001,4324,16140,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32541,"WGS 72BE / UTM zone 41S",9001,4324,16141,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32542,"WGS 72BE / UTM zone 42S",9001,4324,16142,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32543,"WGS 72BE / UTM zone 43S",9001,4324,16143,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32544,"WGS 72BE / UTM zone 44S",9001,4324,16144,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32545,"WGS 72BE / UTM zone 45S",9001,4324,16145,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32546,"WGS 72BE / UTM zone 46S",9001,4324,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32547,"WGS 72BE / UTM zone 47S",9001,4324,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32548,"WGS 72BE / UTM zone 48S",9001,4324,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32549,"WGS 72BE / UTM zone 49S",9001,4324,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32550,"WGS 72BE / UTM zone 50S",9001,4324,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32551,"WGS 72BE / UTM zone 51S",9001,4324,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32552,"WGS 72BE / UTM zone 52S",9001,4324,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32553,"WGS 72BE / UTM zone 53S",9001,4324,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32554,"WGS 72BE / UTM zone 54S",9001,4324,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32555,"WGS 72BE / UTM zone 55S",9001,4324,16155,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32556,"WGS 72BE / UTM zone 56S",9001,4324,16156,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32557,"WGS 72BE / UTM zone 57S",9001,4324,16157,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32558,"WGS 72BE / UTM zone 58S",9001,4324,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32559,"WGS 72BE / UTM zone 59S",9001,4324,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32560,"WGS 72BE / UTM zone 60S",9001,4324,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32600,"WGS 84 / UTM grid system (northern hemisphere)",9001,4326,16000,9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+32601,"WGS 84 / UTM zone 1N",9001,4326,16001,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32602,"WGS 84 / UTM zone 2N",9001,4326,16002,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32603,"WGS 84 / UTM zone 3N",9001,4326,16003,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32604,"WGS 84 / UTM zone 4N",9001,4326,16004,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32605,"WGS 84 / UTM zone 5N",9001,4326,16005,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32606,"WGS 84 / UTM zone 6N",9001,4326,16006,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32607,"WGS 84 / UTM zone 7N",9001,4326,16007,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32608,"WGS 84 / UTM zone 8N",9001,4326,16008,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32609,"WGS 84 / UTM zone 9N",9001,4326,16009,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32610,"WGS 84 / UTM zone 10N",9001,4326,16010,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32611,"WGS 84 / UTM zone 11N",9001,4326,16011,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32612,"WGS 84 / UTM zone 12N",9001,4326,16012,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32613,"WGS 84 / UTM zone 13N",9001,4326,16013,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32614,"WGS 84 / UTM zone 14N",9001,4326,16014,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32615,"WGS 84 / UTM zone 15N",9001,4326,16015,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32616,"WGS 84 / UTM zone 16N",9001,4326,16016,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32617,"WGS 84 / UTM zone 17N",9001,4326,16017,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32618,"WGS 84 / UTM zone 18N",9001,4326,16018,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32619,"WGS 84 / UTM zone 19N",9001,4326,16019,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32620,"WGS 84 / UTM zone 20N",9001,4326,16020,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32621,"WGS 84 / UTM zone 21N",9001,4326,16021,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32622,"WGS 84 / UTM zone 22N",9001,4326,16022,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32623,"WGS 84 / UTM zone 23N",9001,4326,16023,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32624,"WGS 84 / UTM zone 24N",9001,4326,16024,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32625,"WGS 84 / UTM zone 25N",9001,4326,16025,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32626,"WGS 84 / UTM zone 26N",9001,4326,16026,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32627,"WGS 84 / UTM zone 27N",9001,4326,16027,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32628,"WGS 84 / UTM zone 28N",9001,4326,16028,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32629,"WGS 84 / UTM zone 29N",9001,4326,16029,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32630,"WGS 84 / UTM zone 30N",9001,4326,16030,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32631,"WGS 84 / UTM zone 31N",9001,4326,16031,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32632,"WGS 84 / UTM zone 32N",9001,4326,16032,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32633,"WGS 84 / UTM zone 33N",9001,4326,16033,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32634,"WGS 84 / UTM zone 34N",9001,4326,16034,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32635,"WGS 84 / UTM zone 35N",9001,4326,16035,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32636,"WGS 84 / UTM zone 36N",9001,4326,16036,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32637,"WGS 84 / UTM zone 37N",9001,4326,16037,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32638,"WGS 84 / UTM zone 38N",9001,4326,16038,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32639,"WGS 84 / UTM zone 39N",9001,4326,16039,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32640,"WGS 84 / UTM zone 40N",9001,4326,16040,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32641,"WGS 84 / UTM zone 41N",9001,4326,16041,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32642,"WGS 84 / UTM zone 42N",9001,4326,16042,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32643,"WGS 84 / UTM zone 43N",9001,4326,16043,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32644,"WGS 84 / UTM zone 44N",9001,4326,16044,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32645,"WGS 84 / UTM zone 45N",9001,4326,16045,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32646,"WGS 84 / UTM zone 46N",9001,4326,16046,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32647,"WGS 84 / UTM zone 47N",9001,4326,16047,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32648,"WGS 84 / UTM zone 48N",9001,4326,16048,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32649,"WGS 84 / UTM zone 49N",9001,4326,16049,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32650,"WGS 84 / UTM zone 50N",9001,4326,16050,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32651,"WGS 84 / UTM zone 51N",9001,4326,16051,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32652,"WGS 84 / UTM zone 52N",9001,4326,16052,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32653,"WGS 84 / UTM zone 53N",9001,4326,16053,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32654,"WGS 84 / UTM zone 54N",9001,4326,16054,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32655,"WGS 84 / UTM zone 55N",9001,4326,16055,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32656,"WGS 84 / UTM zone 56N",9001,4326,16056,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32657,"WGS 84 / UTM zone 57N",9001,4326,16057,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32658,"WGS 84 / UTM zone 58N",9001,4326,16058,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32659,"WGS 84 / UTM zone 59N",9001,4326,16059,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32660,"WGS 84 / UTM zone 60N",9001,4326,16060,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+32661,"WGS 84 / UPS North",9001,4326,16061,9810,8801,90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+32662,"WGS 84 / Plate Carree",9001,4326,19968,9823,8801,0.0,9102,8802,0.0,9102,,,,,,,,,,,,,,,
+32700,"WGS 84 / UTM grid system (southern hemisphere)",9001,4326,16100,9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+32701,"WGS 84 / UTM zone 1S",9001,4326,16101,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32702,"WGS 84 / UTM zone 2S",9001,4326,16102,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32703,"WGS 84 / UTM zone 3S",9001,4326,16103,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32704,"WGS 84 / UTM zone 4S",9001,4326,16104,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32705,"WGS 84 / UTM zone 5S",9001,4326,16105,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32706,"WGS 84 / UTM zone 6S",9001,4326,16106,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32707,"WGS 84 / UTM zone 7S",9001,4326,16107,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32708,"WGS 84 / UTM zone 8S",9001,4326,16108,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32709,"WGS 84 / UTM zone 9S",9001,4326,16109,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32710,"WGS 84 / UTM zone 10S",9001,4326,16110,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32711,"WGS 84 / UTM zone 11S",9001,4326,16111,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32712,"WGS 84 / UTM zone 12S",9001,4326,16112,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32713,"WGS 84 / UTM zone 13S",9001,4326,16113,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32714,"WGS 84 / UTM zone 14S",9001,4326,16114,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32715,"WGS 84 / UTM zone 15S",9001,4326,16115,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32716,"WGS 84 / UTM zone 16S",9001,4326,16116,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32717,"WGS 84 / UTM zone 17S",9001,4326,16117,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32718,"WGS 84 / UTM zone 18S",9001,4326,16118,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32719,"WGS 84 / UTM zone 19S",9001,4326,16119,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32720,"WGS 84 / UTM zone 20S",9001,4326,16120,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32721,"WGS 84 / UTM zone 21S",9001,4326,16121,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32722,"WGS 84 / UTM zone 22S",9001,4326,16122,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32723,"WGS 84 / UTM zone 23S",9001,4326,16123,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32724,"WGS 84 / UTM zone 24S",9001,4326,16124,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32725,"WGS 84 / UTM zone 25S",9001,4326,16125,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32726,"WGS 84 / UTM zone 26S",9001,4326,16126,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32727,"WGS 84 / UTM zone 27S",9001,4326,16127,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32728,"WGS 84 / UTM zone 28S",9001,4326,16128,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32729,"WGS 84 / UTM zone 29S",9001,4326,16129,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32730,"WGS 84 / UTM zone 30S",9001,4326,16130,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32731,"WGS 84 / UTM zone 31S",9001,4326,16131,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32732,"WGS 84 / UTM zone 32S",9001,4326,16132,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32733,"WGS 84 / UTM zone 33S",9001,4326,16133,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32734,"WGS 84 / UTM zone 34S",9001,4326,16134,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32735,"WGS 84 / UTM zone 35S",9001,4326,16135,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32736,"WGS 84 / UTM zone 36S",9001,4326,16136,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32737,"WGS 84 / UTM zone 37S",9001,4326,16137,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32738,"WGS 84 / UTM zone 38S",9001,4326,16138,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32739,"WGS 84 / UTM zone 39S",9001,4326,16139,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32740,"WGS 84 / UTM zone 40S",9001,4326,16140,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32741,"WGS 84 / UTM zone 41S",9001,4326,16141,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32742,"WGS 84 / UTM zone 42S",9001,4326,16142,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32743,"WGS 84 / UTM zone 43S",9001,4326,16143,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32744,"WGS 84 / UTM zone 44S",9001,4326,16144,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32745,"WGS 84 / UTM zone 45S",9001,4326,16145,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32746,"WGS 84 / UTM zone 46S",9001,4326,16146,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32747,"WGS 84 / UTM zone 47S",9001,4326,16147,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32748,"WGS 84 / UTM zone 48S",9001,4326,16148,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32749,"WGS 84 / UTM zone 49S",9001,4326,16149,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32750,"WGS 84 / UTM zone 50S",9001,4326,16150,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32751,"WGS 84 / UTM zone 51S",9001,4326,16151,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32752,"WGS 84 / UTM zone 52S",9001,4326,16152,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32753,"WGS 84 / UTM zone 53S",9001,4326,16153,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32754,"WGS 84 / UTM zone 54S",9001,4326,16154,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32755,"WGS 84 / UTM zone 55S",9001,4326,16155,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32756,"WGS 84 / UTM zone 56S",9001,4326,16156,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32757,"WGS 84 / UTM zone 57S",9001,4326,16157,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32758,"WGS 84 / UTM zone 58S",9001,4326,16158,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32759,"WGS 84 / UTM zone 59S",9001,4326,16159,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32760,"WGS 84 / UTM zone 60S",9001,4326,16160,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+32761,"WGS 84 / UPS South",9001,4326,16161,9810,8801,-90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+32766,"WGS 84 / TM 36 SE",9001,4326,16636,9807,8801,0.0,9102,8802,36.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
diff --git a/src/tiff/csv/prime_meridian.csv b/src/tiff/csv/prime_meridian.csv
new file mode 100644
index 0000000..3991922
--- /dev/null
+++ b/src/tiff/csv/prime_meridian.csv
@@ -0,0 +1,14 @@
+"PRIME_MERIDIAN_CODE","PRIME_MERIDIAN_NAME","GREENWICH_LONGITUDE","UOM_CODE","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+8901,Greenwich,0.0,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8902,Lisbon,-9.0754862,9110,,Instituto Geografico e Cadastral; Lisbon,EPSG,1995-06-02 00:00:00,96.29,0
+8903,Paris,2.5969213,9105,Value adopted by IGN (Paris) in 1936. Equivalent to 2 deg 20min 14.025sec. Preferred by EPSG to earlier value of 2deg 20min 13.95sec (2.596898 grads) used by RGS London.,Institut Geographique National (IGN); Paris,EPSG,1995-06-02 00:00:00,,0
+8904,Bogota,-74.04513,9110,,"Instituto Geografico ""Augustin Cadazzi"" (IGAC); Bogota",EPSG,1995-06-02 00:00:00,96.29,0
+8905,Madrid,-3.411658,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8906,Rome,12.27084,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8907,Bern,7.26225,9110,1895 value.  Newer value of 7 deg 26 min 22.335 sec E determined in 1938.,Bundesamt f�r Landestopographie,EPSG,1995-06-02 00:00:00,96.29,0
+8908,Jakarta,106.482779,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8909,Ferro,-17.4,9110,Used in Austria and former Czechoslovakia.,,EPSG,1995-06-02 00:00:00,96.29,0
+8910,Brussels,4.220471,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8911,Stockholm,18.03298,9110,,,EPSG,1995-06-02 00:00:00,96.29,0
+8912,Athens,23.4258815,9110,Used in Greece for older mapping based on Hatt projection.,Topography Department; National Technical University of Athens.,EPSG,1997-06-16 00:00:00,,0
+8913,Oslo,10.43225,9110,Formerly known as Kristiania or Christiania.,Statens Kartverk - Geodesidivisjonen,EPSG,1999-10-20 00:00:00,,0
diff --git a/src/tiff/csv/projop_wparm.csv b/src/tiff/csv/projop_wparm.csv
new file mode 100644
index 0000000..092d7b6
--- /dev/null
+++ b/src/tiff/csv/projop_wparm.csv
@@ -0,0 +1,1083 @@
+"COORD_OP_CODE","COORD_OP_NAME","COORD_OP_METHOD_CODE","PARAMETER_CODE_1","PARAMETER_VALUE_1","PARAMETER_UOM_1","PARAMETER_CODE_2","PARAMETER_VALUE_2","PARAMETER_UOM_2","PARAMETER_CODE_3","PARAMETER_VALUE_3","PARAMETER_UOM_3","PARAMETER_CODE_4","PARAMETER_VALUE_4","PARAMETER_UOM_4","PARAMETER_CODE_5","PARAMETER_VALUE_5","PARAMETER_UOM_5","PARAMETER_CODE_6","PARAMETER_VALUE_6","PARAMETER_UOM_6","PARAMETER_CODE_7","PARAMETER_VALUE_7","PARAMETER_UOM_7"
+10101,Alabama CS27 East zone,9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10102,Alabama CS27 West zone,9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10131,"SPCS83 Alabama East zone (meters)",9807,8801,30.3,9110,8802,-85.5,9110,8805,0.99996,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10132,"SPCS83 Alabama West zone (meters)",9807,8801,30.0,9110,8802,-87.3,9110,8805,0.999933333,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+10201,Arizona Coordinate System East zone,9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10202,Arizona Coordinate System Central zone,9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10203,Arizona Coordinate System West zone,9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10231,"SPCS83 Arizona East zone (meters)",9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+10232,"SPCS83 Arizona Central zone (meters)",9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+10233,"SPCS83 Arizona West zone (meters)",9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,213360.0,9001,8807,0.0,9001,,,,,,
+10301,Arkansas CS27 North,9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10302,Arkansas CS27 South,9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10331,"SPCS83 Arkansas North zone (meters)",9802,8821,34.2,9110,8822,-92.0,9110,8823,36.14,9110,8824,34.56,9110,8826,400000.0,9001,8827,0.0,9001,,,
+10332,"SPCS83 Arkansas South zone (meters)",9802,8821,32.4,9110,8822,-92.0,9110,8823,34.46,9110,8824,33.18,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+10401,California CS27 zone I,9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10402,California CS27 zone II,9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10403,California CS27 zone III,9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10404,California CS27 zone IV,9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10405,California CS27 zone V,9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10406,California CS27 zone VI,9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10407,California CS27 zone VII,9802,8821,34.08,9110,8822,-118.2,9110,8823,34.25,9110,8824,33.52,9110,8826,4186692.58,9003,8827,416926.74,9003,,,
+10431,"SPCS83 California zone 1 (meters)",9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10432,"SPCS83 California zone 2 (meters)",9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10433,"SPCS83 California zone 3 (meters)",9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10434,"SPCS83 California zone 4 (meters)",9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10435,"SPCS83 California zone 5 (meters)",9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10436,"SPCS83 California zone 6 (meters)",9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,2000000.0,9001,8827,500000.0,9001,,,
+10501,Colorado CS27 North zone,9802,8821,39.2,9110,8822,-105.3,9110,8823,39.43,9110,8824,40.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10502,Colorado CS27 Central zone,9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10503,Colorado CS27 South zone,9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10531,"SPCS83 Colorado North zone (meters)",9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+10532,"SPCS83 Colorado Central zone (meters)",9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+10533,"SPCS83 Colorado South zone (meters)",9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,914401.8289,9001,8827,304800.6096,9001,,,
+10600,Connecticut CS27,9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,600000.0,9003,8827,0.0,9003,,,
+10630,"SPCS83 Connecticut zone (meters)",9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,304800.6096,9001,8827,152400.3048,9001,,,
+10700,Delaware CS27,9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10730,"SPCS83 Delaware zone (meters)",9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10901,Florida CS27 East zone,9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10902,Florida CS27 West zone,9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+10903,Florida CS27 North zone,9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+10931,"SPCS83 Florida East zone (meters)",9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10932,"SPCS83 Florida West zone (meters)",9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+10933,"SPCS83 Florida North zone (meters)",9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,600000.0,9001,8827,0.0,9001,,,
+11001,Georgia CS27 East zone,9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11002,Georgia CS27 West zone,9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11031,"SPCS83 Georgia East zone (meters)",9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+11032,"SPCS83 Georgia West zone (meters)",9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+11101,Idaho CS27 East zone,9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11102,Idaho CS27 Central zone,9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11103,Idaho CS27 West zone,9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11131,"SPCS83 Idaho East zone (meters)",9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+11132,"SPCS83 Idaho Central zone (meters)",9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+11133,"SPCS83 Idaho West zone (meters)",9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+11201,Illinois CS27 East zone,9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11202,Illinois CS27 West zone,9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11231,"SPCS83 Illinois East zone (meters)",9807,8801,36.4,9110,8802,-88.2,9110,8805,0.999975,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+11232,"SPCS83 Illinois West zone (meters)",9807,8801,36.4,9110,8802,-90.1,9110,8805,0.999941177,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+11301,Indiana CS27 East zone,9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11302,Indiana CS27 West zone,9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11331,"SPCS83 Indiana East zone (meters)",9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,100000.0,9001,8807,250000.0,9001,,,,,,
+11332,"SPCS83 Indiana West zone (meters)",9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,250000.0,9001,,,,,,
+11401,Iowa CS27 North zone,9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11402,Iowa CS27 South zone,9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11431,"SPCS83 Iowa North zone (meters)",9802,8821,41.3,9110,8822,-93.3,9110,8823,43.16,9110,8824,42.04,9110,8826,1500000.0,9001,8827,1000000.0,9001,,,
+11432,"SPCS83 Iowa South zone (meters)",9802,8821,40.0,9110,8822,-93.3,9110,8823,41.47,9110,8824,40.37,9110,8826,500000.0,9001,8827,0.0,9001,,,
+11501,Kansas CS27 North zone,9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11502,Kansas CS27 South zone,9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11531,"SPCS83 Kansas North zone (meters)",9802,8821,38.2,9110,8822,-98.0,9110,8823,39.47,9110,8824,38.43,9110,8826,400000.0,9001,8827,0.0,9001,,,
+11532,"SPCS83 Kansas South zone (meters)",9802,8821,36.4,9110,8822,-98.3,9110,8823,38.34,9110,8824,37.16,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+11601,Kentucky CS27 North zone,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11602,Kentucky CS27 South zone,9802,8821,36.2,9110,8822,-85.45,9110,8823,36.44,9110,8824,37.56,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11631,Kentucky CS83 North zone,9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,37.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+11632,"SPCS83 Kentucky South zone (meters)",9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,500000.0,9001,8827,500000.0,9001,,,
+11701,Louisiana CS27 North zone,9802,8821,30.4,9110,8822,-92.3,9110,8823,31.1,9110,8824,32.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11702,Louisiana CS27 South zone,9802,8821,28.4,9110,8822,-91.2,9110,8823,29.18,9110,8824,30.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+11731,"SPCS83 Louisiana North zone (meters)",9802,8821,30.3,9110,8822,-92.3,9110,8823,32.4,9110,8824,31.1,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+11732,"SPCS83 Louisiana South zone (meters)",9802,8821,28.3,9110,8822,-91.2,9110,8823,30.42,9110,8824,29.18,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+11801,Maine CS27 East zone,9807,8801,43.5,9110,8802,-68.3,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11802,Maine CS27 West zone,9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+11831,"SPCS83 Maine East zone (meters)",9807,8801,43.4,9110,8802,-68.3,9110,8805,0.9999,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+11832,"SPCS83 Maine West zone (meters)",9807,8801,42.5,9110,8802,-70.1,9110,8805,0.999966667,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+11900,Maryland CS27,9802,8821,37.5,9110,8822,-77.0,9110,8823,38.18,9110,8824,39.27,9110,8826,800000.0,9003,8827,0.0,9003,,,
+11930,"SPCS83 Maryland zone (meters)",9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,400000.0,9001,8827,0.0,9001,,,
+12001,Massachusetts CS27 Mainland zone,9802,8821,41.0,9110,8822,-71.3,9110,8823,41.43,9110,8824,42.41,9110,8826,600000.0,9003,8827,0.0,9003,,,
+12002,Massachusetts CS27 Island zone,9802,8821,41.0,9110,8822,-70.3,9110,8823,41.17,9110,8824,41.29,9110,8826,200000.0,9003,8827,0.0,9003,,,
+12031,"SPCS83 Massachusetts Mainland zone (meters)",9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,200000.0,9001,8827,750000.0,9001,,,
+12032,"SPCS83 Massachusetts Island zone (meters)",9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,500000.0,9001,8827,0.0,9001,,,
+12101,Michigan State Plane East zone,9807,8801,41.3,9110,8802,-83.4,9110,8805,0.999942857,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12102,Michigan State Plane Old Central zone,9807,8801,41.3,9110,8802,-85.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12103,Michigan State Plane West zone,9807,8801,41.3,9110,8802,-88.45,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12111,Michigan CS27 North zone,9802,8821,44.47,9110,8822,-87.0,9110,8823,45.29,9110,8824,47.05,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12112,Michigan CS27 Central zone,9802,8821,43.19,9110,8822,-84.2,9110,8823,44.11,9110,8824,45.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12113,Michigan CS27 South zone,9802,8821,41.3,9110,8822,-84.2,9110,8823,42.06,9110,8824,43.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12141,"SPCS83 Michigan North zone (meters)",9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,8000000.0,9001,8827,0.0,9001,,,
+12142,"SPCS83 Michigan Central zone (meters)",9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,6000000.0,9001,8827,0.0,9001,,,
+12143,"SPCS83 Michigan South zone (meters)",9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,4000000.0,9001,8827,0.0,9001,,,
+12201,Minnesota CS27 North zone,9802,8821,46.3,9110,8822,-93.06,9110,8823,47.02,9110,8824,48.38,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12202,Minnesota CS27 Central zone,9802,8821,45.0,9110,8822,-94.15,9110,8823,45.37,9110,8824,47.03,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12203,Minnesota CS27 South zone,9802,8821,43.0,9110,8822,-94.0,9110,8823,43.47,9110,8824,45.13,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12231,"SPCS83 Minnesota North zone (meters)",9802,8821,46.3,9110,8822,-93.06,9110,8823,48.38,9110,8824,47.02,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+12232,"SPCS83 Minnesota Central zone (meters)",9802,8821,45.0,9110,8822,-94.15,9110,8823,47.03,9110,8824,45.37,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+12233,"SPCS83 Minnesota South zone (meters)",9802,8821,43.0,9110,8822,-94.0,9110,8823,45.13,9110,8824,43.47,9110,8826,800000.0,9001,8827,100000.0,9001,,,
+12301,Mississippi CS27 East zone,9807,8801,29.4,9110,8802,-88.5,9110,8805,0.99996,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12302,Mississippi CS27 West zone,9807,8801,30.3,9110,8802,-90.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12331,"SPCS83 Mississippi East zone (meters)",9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+12332,"SPCS83 Mississippi West zone (meters)",9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,700000.0,9001,8807,0.0,9001,,,,,,
+12401,Missouri CS27 East zone,9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12402,Missouri CS27 Central zone,9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12403,Missouri CS27 West zone,9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12431,"SPCS83 Missouri East zone (meters)",9807,8801,35.5,9110,8802,-90.3,9110,8805,0.999933333,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+12432,"SPCS83 Missouri Central zone (meters)",9807,8801,35.5,9110,8802,-92.3,9110,8805,0.999933333,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+12433,"SPCS83 Missouri West zone (meters)",9807,8801,36.1,9110,8802,-94.3,9110,8805,0.999941177,9201,8806,850000.0,9001,8807,0.0,9001,,,,,,
+12501,Montana CS27 North zone,9802,8821,47.0,9110,8822,-109.3,9110,8823,48.43,9110,8824,47.51,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12502,Montana CS27 Central zone,9802,8821,45.5,9110,8822,-109.3,9110,8823,47.53,9110,8824,46.27,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12503,Montana CS27 South zone,9802,8821,44.0,9110,8822,-109.3,9110,8823,46.24,9110,8824,44.52,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12530,"SPCS83 Montana zone (meters)",9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+12601,Nebraska CS27 North zone,9802,8821,41.2,9110,8822,-100.0,9110,8823,41.51,9110,8824,42.49,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12602,Nebraska CS27 South zone,9802,8821,39.4,9110,8822,-99.3,9110,8823,40.17,9110,8824,41.43,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+12630,"SPCS83 Nebraska zone (meters)",9802,8821,39.5,9110,8822,-100.0,9110,8823,43.0,9110,8824,40.0,9110,8826,500000.0,9001,8827,0.0,9001,,,
+12701,Nevada CS27 East zone,9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12702,Nevada CS27 Central zone,9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12703,Nevada CS27 West zone,9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12731,"SPCS83 Nevada East zone (meters)",9807,8801,34.45,9110,8802,-115.35,9110,8805,0.9999,9201,8806,200000.0,9001,8807,8000000.0,9001,,,,,,
+12732,"SPCS83 Nevada Central zone (meters)",9807,8801,34.45,9110,8802,-116.4,9110,8805,0.9999,9201,8806,500000.0,9001,8807,6000000.0,9001,,,,,,
+12733,"SPCS83 Nevada West zone (meters)",9807,8801,34.45,9110,8802,-118.35,9110,8805,0.9999,9201,8806,800000.0,9001,8807,4000000.0,9001,,,,,,
+12800,New Hampshire CS27,9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+12830,"SPCS83 New Hampshire zone (meters)",9807,8801,42.3,9110,8802,-71.4,9110,8805,0.999966667,9201,8806,300000.0,9001,8807,0.0,9001,,,,,,
+12900,New Jersey CS27,9807,8801,38.5,9110,8802,-74.4,9110,8805,0.999975,9201,8806,2000000.0,9003,8807,0.0,9003,,,,,,
+12930,"SPCS83 New Jersey zone (meters)",9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+13001,New Mexico CS27 East zone,9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13002,New Mexico CS27 Central zone,9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13003,New Mexico CS27 West zone,9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13031,"SPCS83 New Mexico East zone (meters)",9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,165000.0,9001,8807,0.0,9001,,,,,,
+13032,"SPCS83 New Mexico Central zone (meters)",9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+13033,"SPCS83 New Mexico West zone (meters)",9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,830000.0,9001,8807,0.0,9001,,,,,,
+13101,New York CS27 East zone,9807,8801,40.0,9110,8802,-74.2,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13102,New York CS27 Central zone,9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13103,New York CS27 West zone,9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13104,New York CS27 Long Island zone,9802,8821,40.3,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,1000000.0,9003,8827,0.0,9003,,,
+13131,"SPCS83 New York East zone (meters)",9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+13132,"SPCS83 New York Central zone (meters)",9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,250000.0,9001,8807,0.0,9001,,,,,,
+13133,"SPCS83 New York West zone (meters)",9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,350000.0,9001,8807,0.0,9001,,,,,,
+13134,"SPCS83 New York Long Island zone (meters)",9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,300000.0,9001,8827,0.0,9001,,,
+13200,North Carolina CS27,9802,8821,33.45,9110,8822,-79.0,9110,8823,34.2,9110,8824,36.1,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13230,"SPCS83 North Carolina zone (meters)",9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,609601.22,9001,8827,0.0,9001,,,
+13301,North Dakota CS27 North zone,9802,8821,47.0,9110,8822,-100.3,9110,8823,47.26,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13302,North Dakota CS27 South zone,9802,8821,45.4,9110,8822,-100.3,9110,8823,46.11,9110,8824,47.29,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13331,"SPCS83 North Dakota North zone (meters)",9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13332,"SPCS83 North Dakota South zone (meters)",9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13401,Ohio CS27 North zone,9802,8821,39.4,9110,8822,-82.3,9110,8823,40.26,9110,8824,41.42,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13402,Ohio CS27 South zone,9802,8821,38.0,9110,8822,-82.3,9110,8823,38.44,9110,8824,40.02,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13431,"SPCS83 Ohio North zone (meters)",9802,8821,39.4,9110,8822,-82.3,9110,8823,41.42,9110,8824,40.26,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13432,"SPCS83 Ohio South zone (meters)",9802,8821,38.0,9110,8822,-82.3,9110,8823,40.02,9110,8824,38.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13501,Oklahoma CS27 North zone,9802,8821,35.0,9110,8822,-98.0,9110,8823,35.34,9110,8824,36.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13502,Oklahoma CS27 South zone,9802,8821,33.2,9110,8822,-98.0,9110,8823,33.56,9110,8824,35.14,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13531,"SPCS83 Oklahoma North zone (meters)",9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13532,"SPCS83 Oklahoma South zone (meters)",9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13601,Oregon CS27 North zone,9802,8821,43.4,9110,8822,-120.3,9110,8823,44.2,9110,8824,46.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13602,Oregon CS27 South zone,9802,8821,41.4,9110,8822,-120.3,9110,8823,42.2,9110,8824,44.0,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13631,"SPCS83 Oregon North zone (meters)",9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,2500000.0,9001,8827,0.0,9001,,,
+13632,"SPCS83 Oregon South zone (meters)",9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,1500000.0,9001,8827,0.0,9001,,,
+13701,Pennsylvania CS27 North zone,9802,8821,40.1,9110,8822,-77.45,9110,8823,40.53,9110,8824,41.57,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13702,Pennsylvania CS27 South zone,9802,8821,39.2,9110,8822,-77.45,9110,8823,39.56,9110,8824,40.48,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13731,"SPCS83 Pennsylvania North zone (meters)",9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13732,"SPCS83 Pennsylvania South zone (meters)",9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,600000.0,9001,8827,0.0,9001,,,
+13800,Rhode Island CS27,9807,8801,41.05,9110,8802,-71.3,9110,8805,0.9999938,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+13830,"SPCS83 Rhode Island zone (meters)",9807,8801,41.05,9110,8802,-71.3,9110,8805,0.99999375,9201,8806,100000.0,9001,8807,0.0,9001,,,,,,
+13901,South Carolina CS27 North zone,9802,8821,33.0,9110,8822,-81.0,9110,8823,33.46,9110,8824,34.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13902,South Carolina CS27 South zone,9802,8821,31.5,9110,8822,-81.0,9110,8823,32.2,9110,8824,33.4,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+13930,"SPCS83 South Carolina zone (meters)",9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,609600.0,9001,8827,0.0,9001,,,
+14001,South Dakota CS27 North zone,9802,8821,43.5,9110,8822,-100.0,9110,8823,44.25,9110,8824,45.41,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14002,South Dakota CS27 South zone,9802,8821,42.2,9110,8822,-100.2,9110,8823,42.5,9110,8824,44.24,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14031,"SPCS83 South Dakota North zone (meters)",9802,8821,43.5,9110,8822,-100.0,9110,8823,45.41,9110,8824,44.25,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14032,"SPCS83 South Dakota South zone (meters)",9802,8821,42.2,9110,8822,-100.2,9110,8823,44.24,9110,8824,42.5,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14100,Tennessee CS27,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,100000.0,9003,8827,0.0,9003,,,
+14130,"SPCS83 Tennessee zone (meters)",9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14201,Texas CS27 North zone,9802,8821,34.0,9110,8822,-101.3,9110,8823,34.39,9110,8824,36.11,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14202,Texas CS27 North Central zone,9802,8821,31.4,9110,8822,-97.3,9110,8823,32.08,9110,8824,33.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14203,Texas CS27 Central zone,9802,8821,29.4,9110,8822,-100.2,9110,8823,30.07,9110,8824,31.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14204,Texas CS27 South Central zone,9802,8821,27.5,9110,8822,-99.0,9110,8823,28.23,9110,8824,30.17,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14205,Texas CS27 South zone,9802,8821,25.4,9110,8822,-98.3,9110,8823,26.1,9110,8824,27.5,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14231,"SPCS83 Texas North zone (meters)",9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,200000.0,9001,8827,1000000.0,9001,,,
+14232,"SPCS83 Texas North Central zone (meters)",9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,600000.0,9001,8827,2000000.0,9001,,,
+14233,"SPCS83 Texas Central zone (meters)",9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,700000.0,9001,8827,3000000.0,9001,,,
+14234,"SPCS83 Texas South Central zone (meters)",9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,600000.0,9001,8827,4000000.0,9001,,,
+14235,"SPCS83 Texas South zone (meters)",9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,300000.0,9001,8827,5000000.0,9001,,,
+14301,Utah CS27 North zone,9802,8821,40.2,9110,8822,-111.3,9110,8823,40.43,9110,8824,41.47,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14302,Utah CS27 Central zone,9802,8821,38.2,9110,8822,-111.3,9110,8823,39.01,9110,8824,40.39,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14303,Utah CS27 South zone,9802,8821,36.4,9110,8822,-111.3,9110,8823,37.13,9110,8824,38.21,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14331,"SPCS83 Utah North zone (meters)",9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,500000.0,9001,8827,1000000.0,9001,,,
+14332,"SPCS83 Utah Central zone (meters)",9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,500000.0,9001,8827,2000000.0,9001,,,
+14333,"SPCS83 Utah South zone (meters)",9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,500000.0,9001,8827,3000000.0,9001,,,
+14400,Vermont CS27,9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14430,"SPCS83 Vermont zone (meters)",9807,8801,42.3,9110,8802,-72.3,9110,8805,0.999964286,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+14501,Virginia CS27 North zone,9802,8821,37.4,9110,8822,-78.3,9110,8823,38.02,9110,8824,39.12,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14502,Virginia CS27 South zone,9802,8821,36.2,9110,8822,-78.3,9110,8823,36.46,9110,8824,37.58,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14531,"SPCS83 Virginia North zone (meters)",9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,3500000.0,9001,8827,2000000.0,9001,,,
+14532,"SPCS83 Virginia South zone (meters)",9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,3500000.0,9001,8827,1000000.0,9001,,,
+14601,Washington CS27 North zone,9802,8821,47.0,9110,8822,-120.5,9110,8823,47.3,9110,8824,48.44,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14602,Washington CS27 South zone,9802,8821,45.2,9110,8822,-120.3,9110,8823,45.5,9110,8824,47.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14631,"SPCS83 Washington North zone (meters)",9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,500000.0,9001,8827,0.0,9001,,,
+14632,"SPCS83 Washington South zone (meters)",9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,500000.0,9001,8827,0.0,9001,,,
+14701,West Virginia CS27 North zone,9802,8821,38.3,9110,8822,-79.3,9110,8823,39.0,9110,8824,40.15,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14702,West Virginia CS27 South zone,9802,8821,37.0,9110,8822,-81.0,9110,8823,37.29,9110,8824,38.53,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14731,"SPCS83 West Virginia North zone (meters)",9802,8821,38.3,9110,8822,-79.3,9110,8823,40.15,9110,8824,39.0,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14732,"SPCS83 West Virginia South zone (meters)",9802,8821,37.0,9110,8822,-81.0,9110,8823,38.53,9110,8824,37.29,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14801,Wisconsin CS27 North zone,9802,8821,45.1,9110,8822,-90.0,9110,8823,45.34,9110,8824,46.46,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14802,Wisconsin CS27 Central zone,9802,8821,43.5,9110,8822,-90.0,9110,8823,44.15,9110,8824,45.3,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14803,Wisconsin CS27 South zone,9802,8821,42.0,9110,8822,-90.0,9110,8823,42.44,9110,8824,44.04,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+14831,"SPCS83 Wisconsin North zone (meters)",9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14832,"SPCS83 Wisconsin Central zone (meters)",9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14833,"SPCS83 Wisconsin South zone (meters)",9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,600000.0,9001,8827,0.0,9001,,,
+14901,Wyoming CS27 East zone,9807,8801,40.4,9110,8802,-105.1,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14902,Wyoming CS27 East Central zone,9807,8801,40.4,9110,8802,-107.2,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14903,Wyoming CS27 West Central zone,9807,8801,40.4,9110,8802,-108.45,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14904,Wyoming CS27 West zone,9807,8801,40.4,9110,8802,-110.05,9110,8805,0.999941177,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+14931,"SPCS83 Wyoming East zone (meters)",9807,8801,40.3,9110,8802,-105.1,9110,8805,0.9999375,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+14932,"SPCS83 Wyoming East Central zone (meters)",9807,8801,40.3,9110,8802,-107.2,9110,8805,0.9999375,9201,8806,400000.0,9001,8807,100000.0,9001,,,,,,
+14933,"SPCS83 Wyoming West Central zone (meters)",9807,8801,40.3,9110,8802,-108.45,9110,8805,0.9999375,9201,8806,600000.0,9001,8807,0.0,9001,,,,,,
+14934,"SPCS83 Wyoming West zone (meters)",9807,8801,40.3,9110,8802,-110.05,9110,8805,0.9999375,9201,8806,800000.0,9001,8807,100000.0,9001,,,,,,
+15001,Alaska CS27 zone 1,9812,8806,16404166.67,9003,8807,-16404166.67,9003,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+15002,Alaska CS27 zone 2,9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15003,Alaska CS27 zone 3,9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15004,Alaska CS27 zone 4,9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15005,Alaska CS27 zone 5,9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15006,Alaska CS27 zone 6,9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15007,Alaska CS27 zone 7,9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,700000.0,9003,8807,0.0,9003,,,,,,
+15008,Alaska CS27 zone 8,9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15009,Alaska CS27 zone 9,9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,600000.0,9003,8807,0.0,9003,,,,,,
+15010,Alaska CS27 zone 10,9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,3000000.0,9003,8827,0.0,9003,,,
+15031,"SPCS83 Alaska zone 1 (meters)",9812,8806,5000000.0,9001,8807,-5000000.0,9001,8811,57.0,9110,8812,-133.4,9110,8813,323.07483685,9110,8814,323.07483685,9110,8815,0.9999,9201
+15032,"SPCS83 Alaska zone 2 (meters)",9807,8801,54.0,9102,8802,-142.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15033,"SPCS83 Alaska zone 3 (meters)",9807,8801,54.0,9102,8802,-146.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15034,"SPCS83 Alaska zone 4 (meters)",9807,8801,54.0,9102,8802,-150.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15035,"SPCS83 Alaska zone 5 (meters)",9807,8801,54.0,9102,8802,-154.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15036,"SPCS83 Alaska zone 6 (meters)",9807,8801,54.0,9102,8802,-158.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15037,"SPCS83 Alaska zone 7 (meters)",9807,8801,54.0,9102,8802,-162.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15038,"SPCS83 Alaska zone 8 (meters)",9807,8801,54.0,9102,8802,-166.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15039,"SPCS83 Alaska zone 9 (meters)",9807,8801,54.0,9102,8802,-170.0,9102,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15040,"SPCS83 Alaska zone 10 (meters)",9802,8821,51.0,9110,8822,-176.0,9110,8823,53.5,9110,8824,51.5,9110,8826,1000000.0,9001,8827,0.0,9001,,,
+15101,Hawaii CS27 zone 1,9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15102,Hawaii CS27 zone 2,9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15103,Hawaii CS27 zone 3,9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15104,Hawaii CS27 zone 4,9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15105,Hawaii CS27 zone 5,9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15131,"SPCS83 Hawaii zone 1 (meters)",9807,8801,18.5,9110,8802,-155.3,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15132,"SPCS83 Hawaii zone 2 (meters)",9807,8801,20.2,9110,8802,-156.4,9110,8805,0.999966667,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15133,"SPCS83 Hawaii zone 3 (meters)",9807,8801,21.1,9110,8802,-158.0,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15134,"SPCS83 Hawaii zone 4 (meters)",9807,8801,21.5,9110,8802,-159.3,9110,8805,0.99999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15135,"SPCS83 Hawaii zone 5 (meters)",9807,8801,21.4,9110,8802,-160.1,9110,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+15201,Puerto Rico CS27,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,0.0,9003,,,
+15202,St. Croix CS27,9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,500000.0,9003,8827,100000.0,9003,,,
+15230,"SPCS83 Puerto Rico & Virgin Islands zone (meters)",9802,8821,17.5,9110,8822,-66.26,9110,8823,18.26,9110,8824,18.02,9110,8826,200000.0,9001,8827,200000.0,9001,,,
+15300,American Samoa Lambert,9801,8801,-14.16,9110,8802,170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15301,American Samoa Lambert,9801,8801,-14.16,9110,8802,-170.0,9110,8805,1.0,9201,8806,500000.0,9003,8807,0.0,9003,,,,,,
+15302,Tennessee CS27,9802,8821,34.4,9110,8822,-86.0,9110,8823,35.15,9110,8824,36.25,9110,8826,2000000.0,9003,8827,100000.0,9003,,,
+15303,"SPCS83 Kentucky North zone (meters)",9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,500000.0,9001,8827,0.0,9001,,,
+15304,"SPCS83 Arizona East zone (International feet)",9807,8801,31.0,9110,8802,-110.1,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+15305,"SPCS83 Arizona Central zone (International feet)",9807,8801,31.0,9110,8802,-111.55,9110,8805,0.9999,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+15306,"SPCS83 Arizona West zone (International feet)",9807,8801,31.0,9110,8802,-113.45,9110,8805,0.999933333,9201,8806,700000.0,9002,8807,0.0,9002,,,,,,
+15307,"SPCS83 California zone 1 (US Survey feet)",9802,8821,39.2,9110,8822,-122.0,9110,8823,41.4,9110,8824,40.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15308,"SPCS83 California zone 2 (US Survey feet)",9802,8821,37.4,9110,8822,-122.0,9110,8823,39.5,9110,8824,38.2,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15309,"SPCS83 California zone 3 (US Survey feet)",9802,8821,36.3,9110,8822,-120.3,9110,8823,38.26,9110,8824,37.04,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15310,"SPCS83 California zone 4 (US Survey feet)",9802,8821,35.2,9110,8822,-119.0,9110,8823,37.15,9110,8824,36.0,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15311,"SPCS83 California zone 5 (US Survey feet)",9802,8821,33.3,9110,8822,-118.0,9110,8823,35.28,9110,8824,34.02,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15312,"SPCS83 California zone 6 (US Survey feet)",9802,8821,32.1,9110,8822,-116.15,9110,8823,33.53,9110,8824,32.47,9110,8826,6561666.667,9003,8827,1640416.667,9003,,,
+15313,"SPCS83 Colorado North zone (US Survey feet)",9802,8821,39.2,9110,8822,-105.3,9110,8823,40.47,9110,8824,39.43,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+15314,"SPCS83 Colorado Central zone (US Survey feet)",9802,8821,37.5,9110,8822,-105.3,9110,8823,39.45,9110,8824,38.27,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+15315,"SPCS83 Colorado South zone (US Survey feet)",9802,8821,36.4,9110,8822,-105.3,9110,8823,38.26,9110,8824,37.14,9110,8826,3000000.0,9003,8827,1000000.0,9003,,,
+15316,"SPCS83 Connecticut zone (US Survey feet)",9802,8821,40.5,9110,8822,-72.45,9110,8823,41.52,9110,8824,41.12,9110,8826,1000000.0,9003,8827,500000.0,9003,,,
+15317,"SPCS83 Delaware zone (US Survey feet)",9807,8801,38.0,9110,8802,-75.25,9110,8805,0.999995,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15318,"SPCS83 Florida East zone (US Survey feet)",9807,8801,24.2,9110,8802,-81.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15319,"SPCS83 Florida West zone (US Survey feet)",9807,8801,24.2,9110,8802,-82.0,9110,8805,0.999941177,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15320,"SPCS83 Florida North zone (US Survey feet)",9802,8821,29.0,9110,8822,-84.3,9110,8823,30.45,9110,8824,29.35,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15321,"SPCS83 Georgia East zone (US Survey feet)",9807,8801,30.0,9110,8802,-82.1,9110,8805,0.9999,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15322,"SPCS83 Georgia West zone (US Survey feet)",9807,8801,30.0,9110,8802,-84.1,9110,8805,0.9999,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+15323,"SPCS83 Idaho East zone (US Survey feet)",9807,8801,41.4,9110,8802,-112.1,9110,8805,0.999947368,9201,8806,656166.667,9003,8807,0.0,9003,,,,,,
+15324,"SPCS83 Idaho Central zone (US Survey feet)",9807,8801,41.4,9110,8802,-114.0,9110,8805,0.999947368,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+15325,"SPCS83 Idaho West zone (US Survey feet)",9807,8801,41.4,9110,8802,-115.45,9110,8805,0.999933333,9201,8806,2624666.667,9003,8807,0.0,9003,,,,,,
+15326,"SPCS83 Indiana East zone (US Survey feet)",9807,8801,37.3,9110,8802,-85.4,9110,8805,0.999966667,9201,8806,328083.333,9003,8807,818125.0,9003,,,,,,
+15327,"SPCS83 Indiana West zone (US Survey feet)",9807,8801,37.3,9110,8802,-87.05,9110,8805,0.999966667,9201,8806,2952750.0,9003,8807,818125.0,9003,,,,,,
+15328,"SPCS83 Kentucky North zone (US Survey feet)",9802,8821,37.3,9110,8822,-84.15,9110,8823,37.58,9110,8824,38.58,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15329,"SPCS83 Kentucky South zone (US Survey feet)",9802,8821,36.2,9110,8822,-85.45,9110,8823,37.56,9110,8824,36.44,9110,8826,1640416.667,9003,8827,1640416.667,9003,,,
+15330,"SPCS83 Maryland zone (US Survey feet)",9802,8821,37.4,9110,8822,-77.0,9110,8823,39.27,9110,8824,38.18,9110,8826,1312333.333,9003,8827,0.0,9003,,,
+15331,"SPCS83 Massachusetts Mainland zone (US Survey feet)",9802,8821,41.0,9110,8822,-71.3,9110,8823,42.41,9110,8824,41.43,9110,8826,656166.667,9003,8827,2460625.0,9003,,,
+15332,"SPCS83 Massachusetts Island zone (US Survey feet)",9802,8821,41.0,9110,8822,-70.3,9110,8823,41.29,9110,8824,41.17,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15333,"SPCS83 Michigan North zone (International feet)",9802,8821,44.47,9110,8822,-87.0,9110,8823,47.05,9110,8824,45.29,9110,8826,26246719.16,9002,8827,0.0,9002,,,
+15334,"SPCS83 Michigan Central zone (International feet)",9802,8821,43.19,9110,8822,-84.22,9110,8823,45.42,9110,8824,44.11,9110,8826,19685039.37,9002,8827,0.0,9002,,,
+15335,"SPCS83 Michigan South zone (International feet)",9802,8821,41.3,9110,8822,-84.22,9110,8823,43.4,9110,8824,42.06,9110,8826,13123359.58,9002,8827,0.0,9002,,,
+15336,"SPCS83 Mississippi East zone (US Survey feet)",9807,8801,29.3,9110,8802,-88.5,9110,8805,0.99995,9201,8806,984250.0,9003,8807,0.0,9003,,,,,,
+15337,"SPCS83 Mississippi West zone (US Survey feet)",9807,8801,29.3,9110,8802,-90.2,9110,8805,0.99995,9201,8806,2296583.333,9003,8807,0.0,9003,,,,,,
+15338,"SPCS83 Montana zone (International feet)",9802,8821,44.15,9110,8822,-109.3,9110,8823,49.0,9110,8824,45.0,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+15339,"SPCS83 New Mexico East zone (US Survey feet)",9807,8801,31.0,9110,8802,-104.2,9110,8805,0.999909091,9201,8806,541337.5,9003,8807,0.0,9003,,,,,,
+15340,"SPCS83 New Mexico Central zone (US Survey feet)",9807,8801,31.0,9110,8802,-106.15,9110,8805,0.9999,9201,8806,1640416.667,9003,8807,0.0,9003,,,,,,
+15341,"SPCS83 New Mexico West zone (US Survey feet)",9807,8801,31.0,9110,8802,-107.5,9110,8805,0.999916667,9201,8806,2723091.667,9003,8807,0.0,9003,,,,,,
+15342,"SPCS83 New York East zone (US Survey feet)",9807,8801,38.5,9110,8802,-74.3,9110,8805,0.9999,9201,8806,492125.0,9003,8807,0.0,9003,,,,,,
+15343,"SPCS83 New York Central zone (US Survey feet)",9807,8801,40.0,9110,8802,-76.35,9110,8805,0.9999375,9201,8806,820208.333,9003,8807,0.0,9003,,,,,,
+15344,"SPCS83 New York West zone (US Survey feet)",9807,8801,40.0,9110,8802,-78.35,9110,8805,0.9999375,9201,8806,1148291.667,9003,8807,0.0,9003,,,,,,
+15345,"SPCS83 New York Long Island zone (US Survey feet)",9802,8821,40.1,9110,8822,-74.0,9110,8823,41.02,9110,8824,40.4,9110,8826,984250.0,9003,8827,0.0,9003,,,
+15346,"SPCS83 North Carolina zone (US Survey feet)",9802,8821,33.45,9110,8822,-79.0,9110,8823,36.1,9110,8824,34.2,9110,8826,2000000.0,9003,8827,0.0,9003,,,
+15347,"SPCS83 North Dakota North zone (International feet)",9802,8821,47.0,9110,8822,-100.3,9110,8823,48.44,9110,8824,47.26,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+15348,"SPCS83 North Dakota South zone (International feet)",9802,8821,45.4,9110,8822,-100.3,9110,8823,47.29,9110,8824,46.11,9110,8826,1968503.937,9002,8827,0.0,9002,,,
+15349,"SPCS83 Oklahoma North zone (US Survey feet)",9802,8821,35.0,9110,8822,-98.0,9110,8823,36.46,9110,8824,35.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15350,"SPCS83 Oklahoma South zone (US Survey feet)",9802,8821,33.2,9110,8822,-98.0,9110,8823,35.14,9110,8824,33.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15351,"SPCS83 Oregon North zone (International feet)",9802,8821,43.4,9110,8822,-120.3,9110,8823,46.0,9110,8824,44.2,9110,8826,8202099.738,9002,8827,0.0,9002,,,
+15352,"SPCS83 Oregon South zone (International feet)",9802,8821,41.4,9110,8822,-120.3,9110,8823,44.0,9110,8824,42.2,9110,8826,4921259.843,9002,8827,0.0,9002,,,
+15353,"SPCS83 Pennsylvania North zone (US Survey feet)",9802,8821,40.1,9110,8822,-77.45,9110,8823,41.57,9110,8824,40.53,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15354,"SPCS83 Pennsylvania South zone (US Survey feet)",9802,8821,39.2,9110,8822,-77.45,9110,8823,40.58,9110,8824,39.56,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15355,"SPCS83 South Carolina zone (International feet)",9802,8821,31.5,9110,8822,-81.0,9110,8823,34.5,9110,8824,32.3,9110,8826,2000000.0,9002,8827,0.0,9002,,,
+15356,"SPCS83 Tennessee zone (US Survey feet)",9802,8821,34.2,9110,8822,-86.0,9110,8823,36.25,9110,8824,35.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15357,"SPCS83 Texas North zone (US Survey feet)",9802,8821,34.0,9110,8822,-101.3,9110,8823,36.11,9110,8824,34.39,9110,8826,656166.667,9003,8827,3280833.333,9003,,,
+15358,"SPCS83 Texas North Central zone (US Survey feet)",9802,8821,31.4,9110,8822,-98.3,9110,8823,33.58,9110,8824,32.08,9110,8826,1968500.0,9003,8827,6561666.667,9003,,,
+15359,"SPCS83 Texas Central zone (US Survey feet)",9802,8821,29.4,9110,8822,-100.2,9110,8823,31.53,9110,8824,30.07,9110,8826,2296583.333,9003,8827,9842500.0,9003,,,
+15360,"SPCS83 Texas South Central zone (US Survey feet)",9802,8821,27.5,9110,8822,-99.0,9110,8823,30.17,9110,8824,28.23,9110,8826,1968500.0,9003,8827,13123333.333,9003,,,
+15361,"SPCS83 Texas South zone (US Survey feet)",9802,8821,25.4,9110,8822,-98.3,9110,8823,27.5,9110,8824,26.1,9110,8826,984250.0,9003,8827,16404166.667,9003,,,
+15362,"SPCS83 Utah North zone (International feet)",9802,8821,40.2,9110,8822,-111.3,9110,8823,41.47,9110,8824,40.43,9110,8826,1640419.948,9002,8827,3280839.895,9002,,,
+15363,"SPCS83 Utah Central zone (International feet)",9802,8821,38.2,9110,8822,-111.3,9110,8823,40.39,9110,8824,39.01,9110,8826,1640419.948,9002,8827,6561679.79,9002,,,
+15364,"SPCS83 Utah South zone (International feet)",9802,8821,36.4,9110,8822,-111.3,9110,8823,38.21,9110,8824,37.13,9110,8826,1640419.948,9002,8827,9842519.685,9002,,,
+15365,"SPCS83 Virginia North zone (US Survey feet)",9802,8821,37.4,9110,8822,-78.3,9110,8823,39.12,9110,8824,38.02,9110,8826,11482916.667,9003,8827,6561666.667,9003,,,
+15366,"SPCS83 Virginia South zone (US Survey feet)",9802,8821,36.2,9110,8822,-78.3,9110,8823,37.58,9110,8824,36.46,9110,8826,11482916.667,9003,8827,3280833.333,9003,,,
+15367,"SPCS83 Washington North zone (US Survey feet)",9802,8821,47.0,9110,8822,-120.5,9110,8823,48.44,9110,8824,47.3,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15368,"SPCS83 Washington South zone (US Survey feet)",9802,8821,45.2,9110,8822,-120.3,9110,8823,47.2,9110,8824,45.5,9110,8826,1640416.667,9003,8827,0.0,9003,,,
+15369,"SPCS83 Wisconsin North zone (US Survey feet)",9802,8821,45.1,9110,8822,-90.0,9110,8823,46.46,9110,8824,45.34,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15370,"SPCS83 Wisconsin Central zone (US Survey feet)",9802,8821,43.5,9110,8822,-90.0,9110,8823,45.3,9110,8824,44.15,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15371,"SPCS83 Wisconsin South zone (US Survey feet)",9802,8821,42.0,9110,8822,-90.0,9110,8823,44.04,9110,8824,42.44,9110,8826,1968500.0,9003,8827,0.0,9003,,,
+15914,"BLM zone 14N (US survey feet)",9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+15915,"BLM zone 15N (US survey feet)",9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+15916,"BLM zone 16N (US survey feet)",9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+15917,"BLM zone 17N (US survey feet)",9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,1640416.67,9003,8807,0.0,9003,,,,,,
+16000,"UTM grid system (northern hemisphere)",9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+16001,UTM zone 1N,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16002,UTM zone 2N,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16003,UTM zone 3N,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16004,UTM zone 4N,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16005,UTM zone 5N,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16006,UTM zone 6N,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16007,UTM zone 7N,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16008,UTM zone 8N,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16009,UTM zone 9N,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16010,UTM zone 10N,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16011,UTM zone 11N,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16012,UTM zone 12N,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16013,UTM zone 13N,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16014,UTM zone 14N,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16015,UTM zone 15N,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16016,UTM zone 16N,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16017,UTM zone 17N,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16018,UTM zone 18N,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16019,UTM zone 19N,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16020,UTM zone 20N,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16021,UTM zone 21N,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16022,UTM zone 22N,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16023,UTM zone 23N,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16024,UTM zone 24N,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16025,UTM zone 25N,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16026,UTM zone 26N,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16027,UTM zone 27N,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16028,UTM zone 28N,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16029,UTM zone 29N,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16030,UTM zone 30N,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16031,UTM zone 31N,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16032,UTM zone 32N,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16033,UTM zone 33N,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16034,UTM zone 34N,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16035,UTM zone 35N,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16036,UTM zone 36N,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16037,UTM zone 37N,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16038,UTM zone 38N,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16039,UTM zone 39N,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16040,UTM zone 40N,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16041,UTM zone 41N,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16042,UTM zone 42N,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16043,UTM zone 43N,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16044,UTM zone 44N,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16045,UTM zone 45N,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16046,UTM zone 46N,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16047,UTM zone 47N,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16048,UTM zone 48N,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16049,UTM zone 49N,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16050,UTM zone 50N,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16051,UTM zone 51N,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16052,UTM zone 52N,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16053,UTM zone 53N,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16054,UTM zone 54N,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16055,UTM zone 55N,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16056,UTM zone 56N,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16057,UTM zone 57N,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16058,UTM zone 58N,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16059,UTM zone 59N,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16060,UTM zone 60N,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16061,Universal Polar Stereographic North,9810,8801,90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+16070,3-degree Gauss-Kruger zone 40,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+16071,3-degree Gauss-Kruger zone 41,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+16072,3-degree Gauss-Kruger zone 42,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+16073,3-degree Gauss-Kruger zone 43,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+16074,3-degree Gauss-Kruger zone 44,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+16075,3-degree Gauss-Kruger zone 45,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+16076,3-degree Gauss-Kruger zone 46,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+16077,3-degree Gauss-Kruger zone 47,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+16078,3-degree Gauss-Kruger zone 48,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+16079,3-degree Gauss-Kruger zone 49,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+16080,3-degree Gauss-Kruger zone 50,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+16081,3-degree Gauss-Kruger zone 51,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+16082,3-degree Gauss-Kruger zone 52,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+16083,3-degree Gauss-Kruger zone 53,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+16084,3-degree Gauss-Kruger zone 54,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+16085,3-degree Gauss-Kruger zone 55,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+16086,3-degree Gauss-Kruger zone 56,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+16087,3-degree Gauss-Kruger zone 57,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+16088,3-degree Gauss-Kruger zone 58,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+16089,3-degree Gauss-Kruger zone 59,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+16090,3-degree Gauss-Kruger zone 60,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,60000000.0,9001,8807,0.0,9001,,,,,,
+16091,3-degree Gauss-Kruger zone 61,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,61500000.0,9001,8807,0.0,9001,,,,,,
+16092,3-degree Gauss-Kruger zone 62,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,62500000.0,9001,8807,0.0,9001,,,,,,
+16093,3-degree Gauss-Kruger zone 63,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,63500000.0,9001,8807,0.0,9001,,,,,,
+16094,3-degree Gauss-Kruger zone 64,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,64500000.0,9001,8807,0.0,9001,,,,,,
+16100,"UTM grid system (southern hemisphere)",9824,8801,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,8830,-180.0,9102,8831,6.0,9102,,,
+16101,UTM zone 1S,9807,8801,0.0,9102,8802,-177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16102,UTM zone 2S,9807,8801,0.0,9102,8802,-171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16103,UTM zone 3S,9807,8801,0.0,9102,8802,-165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16104,UTM zone 4S,9807,8801,0.0,9102,8802,-159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16105,UTM zone 5S,9807,8801,0.0,9102,8802,-153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16106,UTM zone 6S,9807,8801,0.0,9102,8802,-147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16107,UTM zone 7S,9807,8801,0.0,9102,8802,-141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16108,UTM zone 8S,9807,8801,0.0,9102,8802,-135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16109,UTM zone 9S,9807,8801,0.0,9102,8802,-129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16110,UTM zone 10S,9807,8801,0.0,9102,8802,-123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16111,UTM zone 11S,9807,8801,0.0,9102,8802,-117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16112,UTM zone 12S,9807,8801,0.0,9102,8802,-111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16113,UTM zone 13S,9807,8801,0.0,9102,8802,-105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16114,UTM zone 14S,9807,8801,0.0,9102,8802,-99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16115,UTM zone 15S,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16116,UTM zone 16S,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16117,UTM zone 17S,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16118,UTM zone 18S,9807,8801,0.0,9102,8802,-75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16119,UTM zone 19S,9807,8801,0.0,9102,8802,-69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16120,UTM zone 20S,9807,8801,0.0,9102,8802,-63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16121,UTM zone 21S,9807,8801,0.0,9102,8802,-57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16122,UTM zone 22S,9807,8801,0.0,9102,8802,-51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16123,UTM zone 23S,9807,8801,0.0,9102,8802,-45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16124,UTM zone 24S,9807,8801,0.0,9102,8802,-39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16125,UTM zone 25S,9807,8801,0.0,9102,8802,-33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16126,UTM zone 26S,9807,8801,0.0,9102,8802,-27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16127,UTM zone 27S,9807,8801,0.0,9102,8802,-21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16128,UTM zone 28S,9807,8801,0.0,9102,8802,-15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16129,UTM zone 29S,9807,8801,0.0,9102,8802,-9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16130,UTM zone 30S,9807,8801,0.0,9102,8802,-3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16131,UTM zone 31S,9807,8801,0.0,9102,8802,3.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16132,UTM zone 32S,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16133,UTM zone 33S,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16134,UTM zone 34S,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16135,UTM zone 35S,9807,8801,0.0,9102,8802,27.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16136,UTM zone 36S,9807,8801,0.0,9102,8802,33.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16137,UTM zone 37S,9807,8801,0.0,9102,8802,39.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16138,UTM zone 38S,9807,8801,0.0,9102,8802,45.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16139,UTM zone 39S,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16140,UTM zone 40S,9807,8801,0.0,9102,8802,57.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16141,UTM zone 41S,9807,8801,0.0,9102,8802,63.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16142,UTM zone 42S,9807,8801,0.0,9102,8802,69.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16143,UTM zone 43S,9807,8801,0.0,9102,8802,75.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16144,UTM zone 44S,9807,8801,0.0,9102,8802,81.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16145,UTM zone 45S,9807,8801,0.0,9102,8802,87.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16146,UTM zone 46S,9807,8801,0.0,9102,8802,93.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16147,UTM zone 47S,9807,8801,0.0,9102,8802,99.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16148,UTM zone 48S,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16149,UTM zone 49S,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16150,UTM zone 50S,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16151,UTM zone 51S,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16152,UTM zone 52S,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16153,UTM zone 53S,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16154,UTM zone 54S,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16155,UTM zone 55S,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16156,UTM zone 56S,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16157,UTM zone 57S,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16158,UTM zone 58S,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16159,UTM zone 59S,9807,8801,0.0,9102,8802,171.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16160,UTM zone 60S,9807,8801,0.0,9102,8802,177.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16161,Universal Polar Stereographic South,9810,8801,-90.0,9102,8802,0.0,9102,8805,0.994,9201,8806,2000000.0,9001,8807,2000000.0,9001,,,,,,
+16170,3-degree Gauss-Kruger CM 120E,9807,8801,0.0,9102,8802,120.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16171,3-degree Gauss-Kruger CM 123E,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16172,3-degree Gauss-Kruger CM 126E,9807,8801,0.0,9102,8802,126.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16173,3-degree Gauss-Kruger CM 129E,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16174,3-degree Gauss-Kruger CM 132E,9807,8801,0.0,9102,8802,132.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16175,3-degree Gauss-Kruger CM 135E,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16176,3-degree Gauss-Kruger CM 138E,9807,8801,0.0,9102,8802,138.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16177,3-degree Gauss-Kruger CM 141E,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16178,3-degree Gauss-Kruger CM 144E,9807,8801,0.0,9102,8802,144.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16179,3-degree Gauss-Kruger CM 147E,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16180,3-degree Gauss-Kruger CM 150E,9807,8801,0.0,9102,8802,150.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16181,3-degree Gauss-Kruger CM 153E,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16182,3-degree Gauss-Kruger CM 156E,9807,8801,0.0,9102,8802,156.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16183,3-degree Gauss-Kruger CM 159E,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16184,3-degree Gauss-Kruger CM 162E,9807,8801,0.0,9102,8802,162.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16185,3-degree Gauss-Kruger CM 165E,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16186,3-degree Gauss-Kruger CM 168E,9807,8801,0.0,9102,8802,168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16187,3-degree Gauss-Kruger CM 171E,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16188,3-degree Gauss-Kruger CM 174E,9807,8801,0.0,9102,8802,174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16189,3-degree Gauss-Kruger CM 177E,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16190,3-degree Gauss-Kruger CM 180,9807,8801,0.0,9102,8802,180.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16191,3-degree Gauss-Kruger CM 177W,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16192,3-degree Gauss-Kruger CM 174W,9807,8801,0.0,9102,8802,-174.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16193,3-degree Gauss-Kruger CM 171W,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16194,3-degree Gauss-Kruger CM 168W,9807,8801,0.0,9102,8802,-168.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16201,6-degree Gauss-Kruger zone 1,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+16202,6-degree Gauss-Kruger zone 2,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+16203,6-degree Gauss-Kruger zone 3,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+16204,6-degree Gauss-Kruger zone 4,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+16205,6-degree Gauss-Kruger zone 5,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+16206,6-degree Gauss-Kruger zone 6,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+16207,6-degree Gauss-Kruger zone 7,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+16208,6-degree Gauss-Kruger zone 8,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+16209,6-degree Gauss-Kruger zone 9,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+16210,6-degree Gauss-Kruger zone 10,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+16211,6-degree Gauss-Kruger zone 11,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+16212,6-degree Gauss-Kruger zone 12,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+16213,6-degree Gauss-Kruger zone 13,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+16214,6-degree Gauss-Kruger zone 14,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+16215,6-degree Gauss-Kruger zone 15,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+16216,6-degree Gauss-Kruger zone 16,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+16217,6-degree Gauss-Kruger zone 17,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+16218,6-degree Gauss-Kruger zone 18,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+16219,6-degree Gauss-Kruger zone 19,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+16220,6-degree Gauss-Kruger zone 20,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+16221,6-degree Gauss-Kruger zone 21,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+16222,6-degree Gauss-Kruger zone 22,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+16223,6-degree Gauss-Kruger zone 23,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+16224,6-degree Gauss-Kruger zone 24,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+16225,6-degree Gauss-Kruger zone 25,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+16226,6-degree Gauss-Kruger zone 26,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+16227,6-degree Gauss-Kruger zone 27,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+16228,6-degree Gauss-Kruger zone 28,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+16229,6-degree Gauss-Kruger zone 29,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+16230,6-degree Gauss-Kruger zone 30,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+16231,6-degree Gauss-Kruger zone 31,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+16232,6-degree Gauss-Kruger zone 32,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+16233,6-degree Gauss-Kruger zone 33,9807,8801,0.0,9102,8802,-165.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+16234,6-degree Gauss-Kruger zone 34,9807,8801,0.0,9102,8802,-159.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+16235,6-degree Gauss-Kruger zone 35,9807,8801,0.0,9102,8802,-153.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+16236,6-degree Gauss-Kruger zone 36,9807,8801,0.0,9102,8802,-147.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+16237,6-degree Gauss-Kruger zone 37,9807,8801,0.0,9102,8802,-141.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+16238,6-degree Gauss-Kruger zone 38,9807,8801,0.0,9102,8802,-135.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+16239,6-degree Gauss-Kruger zone 39,9807,8801,0.0,9102,8802,-129.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+16240,6-degree Gauss-Kruger zone 40,9807,8801,0.0,9102,8802,-123.0,9102,8805,1.0,9201,8806,40500000.0,9001,8807,0.0,9001,,,,,,
+16241,6-degree Gauss-Kruger zone 41,9807,8801,0.0,9102,8802,-117.0,9102,8805,1.0,9201,8806,41500000.0,9001,8807,0.0,9001,,,,,,
+16242,6-degree Gauss-Kruger zone 42,9807,8801,0.0,9102,8802,-111.0,9102,8805,1.0,9201,8806,42500000.0,9001,8807,0.0,9001,,,,,,
+16243,6-degree Gauss-Kruger zone 43,9807,8801,0.0,9102,8802,-105.0,9102,8805,1.0,9201,8806,43500000.0,9001,8807,0.0,9001,,,,,,
+16244,6-degree Gauss-Kruger zone 44,9807,8801,0.0,9102,8802,-99.0,9102,8805,1.0,9201,8806,44500000.0,9001,8807,0.0,9001,,,,,,
+16245,6-degree Gauss-Kruger zone 45,9807,8801,0.0,9102,8802,-93.0,9102,8805,1.0,9201,8806,45500000.0,9001,8807,0.0,9001,,,,,,
+16246,6-degree Gauss-Kruger zone 46,9807,8801,0.0,9102,8802,-87.0,9102,8805,1.0,9201,8806,46500000.0,9001,8807,0.0,9001,,,,,,
+16247,6-degree Gauss-Kruger zone 47,9807,8801,0.0,9102,8802,-81.0,9102,8805,1.0,9201,8806,47500000.0,9001,8807,0.0,9001,,,,,,
+16248,6-degree Gauss-Kruger zone 48,9807,8801,0.0,9102,8802,-75.0,9102,8805,1.0,9201,8806,48500000.0,9001,8807,0.0,9001,,,,,,
+16249,6-degree Gauss-Kruger zone 49,9807,8801,0.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,49500000.0,9001,8807,0.0,9001,,,,,,
+16250,6-degree Gauss-Kruger zone 50,9807,8801,0.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,50500000.0,9001,8807,0.0,9001,,,,,,
+16251,6-degree Gauss-Kruger zone 51,9807,8801,0.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,51500000.0,9001,8807,0.0,9001,,,,,,
+16252,6-degree Gauss-Kruger zone 52,9807,8801,0.0,9102,8802,-51.0,9102,8805,1.0,9201,8806,52500000.0,9001,8807,0.0,9001,,,,,,
+16253,6-degree Gauss-Kruger zone 53,9807,8801,0.0,9102,8802,-45.0,9102,8805,1.0,9201,8806,53500000.0,9001,8807,0.0,9001,,,,,,
+16254,6-degree Gauss-Kruger zone 54,9807,8801,0.0,9102,8802,-39.0,9102,8805,1.0,9201,8806,54500000.0,9001,8807,0.0,9001,,,,,,
+16255,6-degree Gauss-Kruger zone 55,9807,8801,0.0,9102,8802,-33.0,9102,8805,1.0,9201,8806,55500000.0,9001,8807,0.0,9001,,,,,,
+16256,6-degree Gauss-Kruger zone 56,9807,8801,0.0,9102,8802,-27.0,9102,8805,1.0,9201,8806,56500000.0,9001,8807,0.0,9001,,,,,,
+16257,6-degree Gauss-Kruger zone 57,9807,8801,0.0,9102,8802,-21.0,9102,8805,1.0,9201,8806,57500000.0,9001,8807,0.0,9001,,,,,,
+16258,6-degree Gauss-Kruger zone 58,9807,8801,0.0,9102,8802,-15.0,9102,8805,1.0,9201,8806,58500000.0,9001,8807,0.0,9001,,,,,,
+16259,6-degree Gauss-Kruger zone 59,9807,8801,0.0,9102,8802,-9.0,9102,8805,1.0,9201,8806,59500000.0,9001,8807,0.0,9001,,,,,,
+16260,6-degree Gauss-Kruger zone 60,9807,8801,0.0,9102,8802,-3.0,9102,8805,1.0,9201,8806,60500000.0,9001,8807,0.0,9001,,,,,,
+16261,3-degree Gauss-Kruger zone 1,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+16262,3-degree Gauss-Kruger zone 2,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+16263,3-degree Gauss-Kruger zone 3,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+16264,3-degree Gauss-Kruger zone 4,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+16265,3-degree Gauss-Kruger zone 5,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+16266,3-degree Gauss-Kruger zone 6,9807,8801,0.0,9102,8802,18.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+16267,3-degree Gauss-Kruger zone 7,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+16268,3-degree Gauss-Kruger zone 8,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+16269,3-degree Gauss-Kruger zone 9,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,9500000.0,9001,8807,0.0,9001,,,,,,
+16270,3-degree Gauss-Kruger zone 10,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,10500000.0,9001,8807,0.0,9001,,,,,,
+16271,3-degree Gauss-Kruger zone 11,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,11500000.0,9001,8807,0.0,9001,,,,,,
+16272,3-degree Gauss-Kruger zone 12,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,12500000.0,9001,8807,0.0,9001,,,,,,
+16273,3-degree Gauss-Kruger zone 13,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,13500000.0,9001,8807,0.0,9001,,,,,,
+16274,3-degree Gauss-Kruger zone 14,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,14500000.0,9001,8807,0.0,9001,,,,,,
+16275,3-degree Gauss-Kruger zone 15,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,15500000.0,9001,8807,0.0,9001,,,,,,
+16276,3-degree Gauss-Kruger zone 16,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9201,8806,16500000.0,9001,8807,0.0,9001,,,,,,
+16277,3-degree Gauss-Kruger zone 17,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,17500000.0,9001,8807,0.0,9001,,,,,,
+16278,3-degree Gauss-Kruger zone 18,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,18500000.0,9001,8807,0.0,9001,,,,,,
+16279,3-degree Gauss-Kruger zone 19,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,19500000.0,9001,8807,0.0,9001,,,,,,
+16280,3-degree Gauss-Kruger zone 20,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,20500000.0,9001,8807,0.0,9001,,,,,,
+16281,3-degree Gauss-Kruger zone 21,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,21500000.0,9001,8807,0.0,9001,,,,,,
+16282,3-degree Gauss-Kruger zone 22,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,22500000.0,9001,8807,0.0,9001,,,,,,
+16283,3-degree Gauss-Kruger zone 23,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,23500000.0,9001,8807,0.0,9001,,,,,,
+16284,3-degree Gauss-Kruger zone 24,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,24500000.0,9001,8807,0.0,9001,,,,,,
+16285,3-degree Gauss-Kruger zone 25,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,25500000.0,9001,8807,0.0,9001,,,,,,
+16286,3-degree Gauss-Kruger zone 26,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,26500000.0,9001,8807,0.0,9001,,,,,,
+16287,3-degree Gauss-Kruger zone 27,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,27500000.0,9001,8807,0.0,9001,,,,,,
+16288,3-degree Gauss-Kruger zone 28,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,28500000.0,9001,8807,0.0,9001,,,,,,
+16289,3-degree Gauss-Kruger zone 29,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,29500000.0,9001,8807,0.0,9001,,,,,,
+16290,3-degree Gauss-Kruger zone 30,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,30500000.0,9001,8807,0.0,9001,,,,,,
+16291,3-degree Gauss-Kruger zone 31,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,31500000.0,9001,8807,0.0,9001,,,,,,
+16292,3-degree Gauss-Kruger zone 32,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,32500000.0,9001,8807,0.0,9001,,,,,,
+16293,3-degree Gauss-Kruger zone 33,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,33500000.0,9001,8807,0.0,9001,,,,,,
+16294,3-degree Gauss-Kruger zone 34,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,34500000.0,9001,8807,0.0,9001,,,,,,
+16295,3-degree Gauss-Kruger zone 35,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,35500000.0,9001,8807,0.0,9001,,,,,,
+16296,3-degree Gauss-Kruger zone 36,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,36500000.0,9001,8807,0.0,9001,,,,,,
+16297,3-degree Gauss-Kruger zone 37,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,37500000.0,9001,8807,0.0,9001,,,,,,
+16298,3-degree Gauss-Kruger zone 38,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,38500000.0,9001,8807,0.0,9001,,,,,,
+16299,3-degree Gauss-Kruger zone 39,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,39500000.0,9001,8807,0.0,9001,,,,,,
+16301,6-degree Gauss-Kruger CM 3E,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16302,6-degree Gauss-Kruger CM 9E,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16303,6-degree Gauss-Kruger CM 15E,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16304,6-degree Gauss-Kruger CM 21E,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16305,6-degree Gauss-Kruger CM 27E,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16306,6-degree Gauss-Kruger CM 33E,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16307,6-degree Gauss-Kruger CM 39E,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16308,6-degree Gauss-Kruger CM 45E,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16309,6-degree Gauss-Kruger CM 51E,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16310,6-degree Gauss-Kruger CM 57E,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16311,6-degree Gauss-Kruger CM 63E,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16312,6-degree Gauss-Kruger CM 69E,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16313,6-degree Gauss-Kruger CM 75E,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16314,6-degree Gauss-Kruger CM 81E,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16315,6-degree Gauss-Kruger CM 87E,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16316,6-degree Gauss-Kruger CM 93E,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16317,6-degree Gauss-Kruger CM 99E,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16318,6-degree Gauss-Kruger CM 105E,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16319,6-degree Gauss-Kruger CM 111E,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16320,6-degree Gauss-Kruger CM 117E,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16321,6-degree Gauss-Kruger CM 123E,9807,8801,0.0,9102,8802,123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16322,6-degree Gauss-Kruger CM 129E,9807,8801,0.0,9102,8802,129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16323,6-degree Gauss-Kruger CM 135E,9807,8801,0.0,9102,8802,135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16324,6-degree Gauss-Kruger CM 141E,9807,8801,0.0,9102,8802,141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16325,6-degree Gauss-Kruger CM 147E,9807,8801,0.0,9102,8802,147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16326,6-degree Gauss-Kruger CM 153E,9807,8801,0.0,9102,8802,153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16327,6-degree Gauss-Kruger CM 159E,9807,8801,0.0,9102,8802,159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16328,6-degree Gauss-Kruger CM 165E,9807,8801,0.0,9102,8802,165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16329,6-degree Gauss-Kruger CM 171E,9807,8801,0.0,9102,8802,171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16330,6-degree Gauss-Kruger CM 177E,9807,8801,0.0,9102,8802,177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16331,6-degree Gauss-Kruger CM 177W,9807,8801,0.0,9102,8802,-177.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16332,6-degree Gauss-Kruger CM 171W,9807,8801,0.0,9102,8802,-171.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16333,6-degree Gauss-Kruger CM 165W,9807,8801,0.0,9102,8802,-165.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16334,6-degree Gauss-Kruger CM 159W,9807,8801,0.0,9102,8802,-159.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16335,6-degree Gauss-Kruger CM 153W,9807,8801,0.0,9102,8802,-153.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16336,6-degree Gauss-Kruger CM 147W,9807,8801,0.0,9102,8802,-147.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16337,6-degree Gauss-Kruger CM 141W,9807,8801,0.0,9102,8802,-141.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16338,6-degree Gauss-Kruger CM 135W,9807,8801,0.0,9102,8802,-135.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16339,6-degree Gauss-Kruger CM 129W,9807,8801,0.0,9102,8802,-129.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16340,6-degree Gauss-Kruger CM 123W,9807,8801,0.0,9102,8802,-123.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16341,6-degree Gauss-Kruger CM 117W,9807,8801,0.0,9102,8802,-117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16342,6-degree Gauss-Kruger CM 111W,9807,8801,0.0,9102,8802,-111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16343,6-degree Gauss-Kruger CM 105W,9807,8801,0.0,9102,8802,-105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16344,6-degree Gauss-Kruger CM 99W,9807,8801,0.0,9102,8802,-99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16345,6-degree Gauss-Kruger CM 93W,9807,8801,0.0,9102,8802,-93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16346,6-degree Gauss-Kruger CM 87W,9807,8801,0.0,9102,8802,-87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16347,6-degree Gauss-Kruger CM 81W,9807,8801,0.0,9102,8802,-81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16348,6-degree Gauss-Kruger CM 75W,9807,8801,0.0,9102,8802,-75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16349,6-degree Gauss-Kruger CM 69W,9807,8801,0.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16350,6-degree Gauss-Kruger CM 63W,9807,8801,0.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16351,6-degree Gauss-Kruger CM 57W,9807,8801,0.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16352,6-degree Gauss-Kruger CM 51W,9807,8801,0.0,9102,8802,-51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16353,6-degree Gauss-Kruger CM 45W,9807,8801,0.0,9102,8802,-45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16354,6-degree Gauss-Kruger CM 39W,9807,8801,0.0,9102,8802,-39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16355,6-degree Gauss-Kruger CM 33W,9807,8801,0.0,9102,8802,-33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16356,6-degree Gauss-Kruger CM 27W,9807,8801,0.0,9102,8802,-27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16357,6-degree Gauss-Kruger CM 21W,9807,8801,0.0,9102,8802,-21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16358,6-degree Gauss-Kruger CM 15W,9807,8801,0.0,9102,8802,-15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16359,6-degree Gauss-Kruger CM 9W,9807,8801,0.0,9102,8802,-9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16360,6-degree Gauss-Kruger CM 3W,9807,8801,0.0,9102,8802,-3.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16361,3-degree Gauss-Kruger CM 3E,9807,8801,0.0,9102,8802,3.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16362,3-degree Gauss-Kruger CM 6E,9807,8801,0.0,9102,8802,6.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16363,3-degree Gauss-Kruger CM 9E,9807,8801,0.0,9102,8802,9.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16364,3-degree Gauss-Kruger CM 12E,9807,8801,0.0,9102,8802,12.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16365,3-degree Gauss-Kruger CM 15E,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16366,3-degree Gauss-Kruger CM 18E,9807,8801,0.0,9102,8802,18.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16367,3-degree Gauss-Kruger CM 21E,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16368,3-degree Gauss-Kruger CM 24E,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16369,3-degree Gauss-Kruger CM 27E,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16370,3-degree Gauss-Kruger CM 30E,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16371,3-degree Gauss-Kruger CM 33E,9807,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16372,3-degree Gauss-Kruger CM 36E,9807,8801,0.0,9102,8802,36.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16373,3-degree Gauss-Kruger CM 39E,9807,8801,0.0,9102,8802,39.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16374,3-degree Gauss-Kruger CM 42E,9807,8801,0.0,9102,8802,42.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16375,3-degree Gauss-Kruger CM 45E,9807,8801,0.0,9102,8802,45.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16376,3-degree Gauss-Kruger CM 48E,9807,8801,0.0,9102,8802,48.0,9102,8805,1.0,9001,8806,500000.0,9001,8807,0.0,9201,,,,,,
+16377,3-degree Gauss-Kruger CM 51E,9807,8801,0.0,9102,8802,51.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16378,3-degree Gauss-Kruger CM 54E,9807,8801,0.0,9102,8802,54.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16379,3-degree Gauss-Kruger CM 57E,9807,8801,0.0,9102,8802,57.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16380,3-degree Gauss-Kruger CM 60E,9807,8801,0.0,9102,8802,60.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16381,3-degree Gauss-Kruger CM 63E,9807,8801,0.0,9102,8802,63.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16382,3-degree Gauss-Kruger CM 66E,9807,8801,0.0,9102,8802,66.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16383,3-degree Gauss-Kruger CM 69E,9807,8801,0.0,9102,8802,69.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16384,3-degree Gauss-Kruger CM 72E,9807,8801,0.0,9102,8802,72.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16385,3-degree Gauss-Kruger CM 75E,9807,8801,0.0,9102,8802,75.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16386,3-degree Gauss-Kruger CM 78E,9807,8801,0.0,9102,8802,78.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16387,3-degree Gauss-Kruger CM 81E,9807,8801,0.0,9102,8802,81.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16388,3-degree Gauss-Kruger CM 84E,9807,8801,0.0,9102,8802,84.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16389,3-degree Gauss-Kruger CM 87E,9807,8801,0.0,9102,8802,87.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16390,3-degree Gauss-Kruger CM 90E,9807,8801,0.0,9102,8802,90.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16391,3-degree Gauss-Kruger CM 93E,9807,8801,0.0,9102,8802,93.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16392,3-degree Gauss-Kruger CM 96E,9807,8801,0.0,9102,8802,96.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16393,3-degree Gauss-Kruger CM 99E,9807,8801,0.0,9102,8802,99.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16394,3-degree Gauss-Kruger CM 102E,9807,8801,0.0,9102,8802,102.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16395,3-degree Gauss-Kruger CM 105E,9807,8801,0.0,9102,8802,105.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16396,3-degree Gauss-Kruger CM 108E,9807,8801,0.0,9102,8802,108.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16397,3-degree Gauss-Kruger CM 111E,9807,8801,0.0,9102,8802,111.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16398,3-degree Gauss-Kruger CM 114E,9807,8801,0.0,9102,8802,114.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16399,3-degree Gauss-Kruger CM 117E,9807,8801,0.0,9102,8802,117.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16400,TM 0 N,9807,8801,0.0,9102,8802,0.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16405,TM 5 NE,9807,8801,0.0,9102,8802,5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16406,TM 6 NE,9807,8801,0.0,9102,8802,6.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16411,TM 11 NE,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16412,TM 12 NE,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16413,TM 13 NE,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16430,TM 30 NE,9807,8801,0.0,9102,8802,30.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16506,TM 106 NE,9807,8801,0.0,9102,8802,106.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16586,GK 106 NE,9807,8801,0.0,9102,8802,106.0,9102,8805,1.0,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+16611,TM 11.30 SE,9807,8801,0.0,9110,8802,11.3,9110,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16612,TM 12 SE,9807,8801,0.0,9102,8802,12.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16636,TM 36 SE,9807,8801,0.0,9102,8802,36.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16709,TM 109 SE,9807,8801,0.0,9102,8802,109.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16716,TM 116 SE,9807,8801,0.0,9102,8802,116.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+16732,TM 132 SE,9807,8801,0.0,9102,8802,132.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17001,TM 1 NW,9807,8801,0.0,9102,8802,-1.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+17005,TM 5 NW,9807,8801,0.0,9102,8802,-5.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+17054,TM 54 NW,9807,8801,0.0,9102,8802,-54.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+17348,Map Grid of Australia zone 48,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17349,Map Grid of Australia zone 49,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17350,Map Grid of Australia zone 50,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17351,Map Grid of Australia zone 51,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17352,Map Grid of Australia zone 52,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17353,Map Grid of Australia zone 53,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17354,Map Grid of Australia zone 54,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17355,Map Grid of Australia zone 55,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17356,Map Grid of Australia zone 56,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17357,Map Grid of Australia zone 57,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17358,Map Grid of Australia zone 58,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17448,Australian Map Grid zone 48,9807,8801,0.0,9102,8802,105.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17449,Australian Map Grid zone 49,9807,8801,0.0,9102,8802,111.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17450,Australian Map Grid zone 50,9807,8801,0.0,9102,8802,117.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17451,Australian Map Grid zone 51,9807,8801,0.0,9102,8802,123.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17452,Australian Map Grid zone 52,9807,8801,0.0,9102,8802,129.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17453,Australian Map Grid zone 53,9807,8801,0.0,9102,8802,135.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17454,Australian Map Grid zone 54,9807,8801,0.0,9102,8802,141.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17455,Australian Map Grid zone 55,9807,8801,0.0,9102,8802,147.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17456,Australian Map Grid zone 56,9807,8801,0.0,9102,8802,153.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17457,Australian Map Grid zone 57,9807,8801,0.0,9102,8802,159.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17458,Australian Map Grid zone 58,9807,8801,0.0,9102,8802,165.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,10000000.0,9001,,,,,,
+17515,South African Survey Grid zone 15,9808,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17517,South African Survey Grid zone 17,9808,8801,0.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17519,South African Survey Grid zone 19,9808,8801,0.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17521,South African Survey Grid zone 21,9808,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17523,South African Survey Grid zone 23,9808,8801,0.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17525,South African Survey Grid zone 25,9808,8801,0.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17527,South African Survey Grid zone 27,9808,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17529,South African Survey Grid zone 29,9808,8801,0.0,9102,8802,29.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17531,South African Survey Grid zone 31,9808,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17533,South African Survey Grid zone 33,9808,8801,0.0,9102,8802,33.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17611,South West African Survey Grid zone 11,9808,8801,-22.0,9102,8802,11.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17613,South West African Survey Grid zone 13,9808,8801,-22.0,9102,8802,13.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17615,South West African Survey Grid zone 15,9808,8801,-22.0,9102,8802,15.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17617,South West African Survey Grid zone 17,9808,8801,-22.0,9102,8802,17.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17619,South West African Survey Grid zone 19,9808,8801,-22.0,9102,8802,19.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17621,South West African Survey Grid zone 21,9808,8801,-22.0,9102,8802,21.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17623,South West African Survey Grid zone 23,9808,8801,-22.0,9102,8802,23.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17625,South West African Survey Grid zone 25,9808,8801,-22.0,9102,8802,25.0,9102,8805,1.0,9201,8806,0.0,9031,8807,0.0,9031,,,,,,
+17700,MTM Quebec zone 2,9807,8801,0.0,9110,8802,-55.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17701,MTM zone 1,9807,8801,0.0,9102,8802,-53.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17702,MTM Newfoundland zone 2,9807,8801,0.0,9102,8802,-56.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17703,MTM zone 3,9807,8801,0.0,9110,8802,-58.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17704,MTM zone 4,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17705,MTM zone 5,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17706,MTM zone 6,9807,8801,0.0,9110,8802,-67.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17707,MTM zone 7,9807,8801,0.0,9110,8802,-70.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17708,MTM zone 8,9807,8801,0.0,9110,8802,-73.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17709,MTM zone 9,9807,8801,0.0,9110,8802,-76.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17710,MTM zone 10,9807,8801,0.0,9110,8802,-79.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17711,MTM zone 11,9807,8801,0.0,9110,8802,-82.3,9110,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17712,MTM zone 12,9807,8801,0.0,9102,8802,-81.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17713,MTM zone 13,9807,8801,0.0,9102,8802,-84.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17714,MTM zone 14,9807,8801,0.0,9102,8802,-87.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17715,MTM zone 15,9807,8801,0.0,9102,8802,-90.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17716,MTM zone 16,9807,8801,0.0,9102,8802,-93.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17717,MTM zone 17,9807,8801,0.0,9102,8802,-96.0,9102,8805,0.9999,9201,8806,304800.0,9001,8807,0.0,9001,,,,,,
+17794,MTM Nova Scotia zone 4,9807,8801,0.0,9110,8802,-61.3,9110,8805,0.9999,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+17795,MTM Nova Scotia zone 5,9807,8801,0.0,9110,8802,-64.3,9110,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+17801,Japan Plane Rectangular CS zone I,9807,8801,33.0,9110,8802,129.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17802,Japan Plane Rectangular CS zone II,9807,8801,33.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17803,Japan Plane Rectangular CS zone III,9807,8801,36.0,9110,8802,132.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17804,Japan Plane Rectangular CS zone IV,9807,8801,33.0,9110,8802,133.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17805,Japan Plane Rectangular CS zone V,9807,8801,36.0,9110,8802,134.2,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17806,Japan Plane Rectangular CS zone VI,9807,8801,36.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17807,Japan Plane Rectangular CS zone VII,9807,8801,36.0,9110,8802,137.1,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17808,Japan Plane Rectangular CS zone VIII,9807,8801,36.0,9110,8802,138.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17809,Japan Plane Rectangular CS zone IX,9807,8801,36.0,9110,8802,139.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17810,Japan Plane Rectangular CS zone X,9807,8801,40.0,9110,8802,140.5,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17811,Japan Plane Rectangular CS zone XI,9807,8801,44.0,9110,8802,140.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17812,Japan Plane Rectangular CS zone XII,9807,8801,44.0,9110,8802,142.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17813,Japan Plane Rectangular CS zone XIII,9807,8801,44.0,9110,8802,144.15,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17814,Japan Plane Rectangular CS zone XIV,9807,8801,26.0,9110,8802,142.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17815,Japan Plane Rectangular CS zone XV,9807,8801,26.0,9110,8802,127.3,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17816,Japan Plane Rectangular CS zone XVI,9807,8801,26.0,9110,8802,124.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17817,Japan Plane Rectangular CS zone XVII,9807,8801,26.0,9110,8802,131.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17818,Japan Plane Rectangular CS zone XVIII,9807,8801,20.0,9110,8802,136.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17819,Japan Plane Rectangular CS zone XIX,9807,8801,26.0,9110,8802,154.0,9110,8805,0.9999,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+17901,Mount Eden Circuit,9807,8801,-36.5247515,9110,8802,174.45516217,9110,8805,0.9999,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17902,Bay of Plenty Circuit,9807,8801,-37.45404993,9110,8802,176.27583101,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17903,Poverty Bay Circuit,9807,8801,-38.372893,9110,8802,177.53082906,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17904,Hawkes Bay Circuit,9807,8801,-39.39033455,9110,8802,176.40252499,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17905,Taranaki Circuit,9807,8801,-39.08087299,9110,8802,174.13408423,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17906,Tuhirangi Circuit,9807,8801,-39.30448934,9110,8802,175.38241325,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17907,Wanganui Circuit,9807,8801,-40.14310097,9110,8802,175.29171586,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17908,Wairarapa Circuit,9807,8801,-40.55319175,9110,8802,175.38504588,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17909,Wellington Circuit,9807,8801,-41.18047507,9110,8802,174.46358432,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17910,Collingwood Circuit,9807,8801,-40.42531326,9110,8802,172.40193674,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17911,Nelson Circuit,9807,8801,-41.1628361,9110,8802,173.17575405,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17912,Karamea Circuit,9807,8801,-41.17236815,9110,8802,172.06325015,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17913,Buller Circuit,9807,8801,-41.48388903,9110,8802,171.34525362,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17914,Grey Circuit,9807,8801,-42.20012994,9110,8802,171.32591767,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17915,Amuri Circuit,9807,8801,-42.41208197,9110,8802,173.00364802,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17916,Marlborough Circuit,9807,8801,-41.3240152,9110,8802,173.48074668,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17917,Hokitika Circuit,9807,8801,-42.53107605,9110,8802,170.58479766,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17918,Okarito Circuit,9807,8801,-43.06364613,9110,8802,170.1539333,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17919,Jacksons Bay Circuit,9807,8801,-43.58400904,9110,8802,168.36225612,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17920,Mount Pleasant Circuit,9807,8801,-43.35262953,9110,8802,172.43378969,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17921,Gawler Circuit,9807,8801,-43.44553616,9110,8802,171.21386945,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17922,Timaru Circuit,9807,8801,-44.24079933,9110,8802,171.0326103,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17923,Lindis Peak Circuit,9807,8801,-44.44069647,9110,8802,169.28039183,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17924,Mount Nicholas Circuit,9807,8801,-45.07584493,9110,8802,168.23551083,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17925,Mount York Circuit,9807,8801,-45.33494142,9110,8802,167.44199024,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17926,Observation Point Circuit,9807,8801,-45.48583078,9110,8802,170.37429426,9110,8805,1.0,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17927,North Taieri Circuit,9807,8801,-45.51414481,9110,8802,170.16573208,9110,8805,0.99996,9201,8806,300000.0,9001,8807,700000.0,9001,,,,,,
+17928,Bluff Circuit,9807,8801,-46.36000346,9110,8802,168.20343392,9110,8805,1.0,9201,8806,300002.66,9001,8807,699999.58,9001,,,,,,
+17931,Mount Eden Circuit 2000,9807,8801,-36.5247,9110,8802,174.4551,9110,8805,0.9999,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17932,Bay of Plenty Circuit 2000,9807,8801,-37.454,9110,8802,176.2758,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17933,Poverty Bay Circuit 2000,9807,8801,-38.3728,9110,8802,177.5308,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17934,Hawkes Bay Circuit 2000,9807,8801,-39.3903,9110,8802,176.4025,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17935,Taranaki Circuit 2000,9807,8801,-39.0808,9110,8802,174.134,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17936,Tuhirangi Circuit 2000,9807,8801,-39.3044,9110,8802,175.3824,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17937,Wanganui Circuit 2000,9807,8801,-40.1431,9110,8802,175.2917,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17938,Wairarapa Circuit 2000,9807,8801,-40.5531,9110,8802,175.385,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17939,Wellington Circuit 2000,9807,8801,-41.1804,9110,8802,174.4635,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17940,Collingwood Circuit 2000,9807,8801,-40.4253,9110,8802,172.4019,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17941,Nelson Circuit 2000,9807,8801,-41.1628,9110,8802,173.1757,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17942,Karamea Circuit 2000,9807,8801,-41.1723,9110,8802,172.0632,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17943,Buller Circuit 2000,9807,8801,-41.4838,9110,8802,171.3452,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17944,Grey Circuit 2000,9807,8801,-42.2001,9110,8802,171.3259,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17945,Amuri Circuit 2000,9807,8801,-42.412,9110,8802,173.0036,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17946,Marlborough Circuit 2000,9807,8801,-41.324,9110,8802,173.4807,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17947,Hokitika Circuit 2000,9807,8801,-42.531,9110,8802,170.5847,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17948,Okarito Circuit 2000,9807,8801,-43.0636,9110,8802,170.1539,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17949,Jacksons Bay Circuit 2000,9807,8801,-43.584,9110,8802,168.3622,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17950,Mount Pleasant Circuit 2000,9807,8801,-43.3526,9110,8802,172.4337,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17951,Gawler Circuit 2000,9807,8801,-43.4455,9110,8802,171.2138,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17952,Timaru Circuit 2000,9807,8801,-44.2407,9110,8802,171.0326,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17953,Lindis Peak Circuit 2000,9807,8801,-44.4406,9110,8802,169.2803,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17954,Mount Nicholas Circuit 2000,9807,8801,-45.0758,9110,8802,168.2355,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17955,Mount York Circuit 2000,9807,8801,-45.3349,9110,8802,167.4419,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17956,Observation Point Circuit 2000,9807,8801,-45.4858,9110,8802,170.3742,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17957,North Taieri Circuit 2000,9807,8801,-45.5141,9110,8802,170.1657,9110,8805,0.99996,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+17958,Bluff Circuit 2000,9807,8801,-46.36,9110,8802,168.2034,9110,8805,1.0,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+18011,"Nord Algerie (ancienne)",9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18012,"Sud Algerie (ancienne)",9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18021,Nord Algerie,9801,8801,40.0,9105,8802,3.0,9105,8805,0.999625544,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+18022,Sud Algerie,9801,8801,37.0,9105,8802,3.0,9105,8805,0.999625769,9201,8806,500135.0,9001,8807,300090.0,9001,,,,,,
+18031,Argentina zone 1,9807,8801,-90.0,9102,8802,-72.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+18032,Argentina zone 2,9807,8801,-90.0,9102,8802,-69.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+18033,Argentina zone 3,9807,8801,-90.0,9102,8802,-66.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+18034,Argentina zone 4,9807,8801,-90.0,9102,8802,-63.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+18035,Argentina zone 5,9807,8801,-90.0,9102,8802,-60.0,9102,8805,1.0,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+18036,Argentina zone 6,9807,8801,-90.0,9102,8802,-57.0,9102,8805,1.0,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+18037,Argentina zone 7,9807,8801,-90.0,9102,8802,-54.0,9102,8805,1.0,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+18041,Austria West Zone,9807,8801,0.0,9102,8802,28.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18042,Austria Central Zone,9807,8801,0.0,9102,8802,31.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18043,Austria East Zone,9807,8801,0.0,9102,8802,34.0,9102,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18044,Austria M28,9807,8801,0.0,9110,8802,10.2,9110,8805,1.0,9201,8806,150000.0,9001,8807,0.0,9001,,,,,,
+18045,Austria M31,9807,8801,0.0,9110,8802,13.2,9110,8805,1.0,9201,8806,450000.0,9001,8807,0.0,9001,,,,,,
+18046,Austria M34,9807,8801,0.0,9110,8802,16.2,9110,8805,1.0,9201,8806,750000.0,9001,8807,0.0,9001,,,,,,
+18051,Colombia West zone,9807,8801,4.355657,9110,8802,-77.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18052,Colombia Bogota zone,9807,8801,4.355657,9110,8802,-74.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18053,Colombia East Central zone,9807,8801,4.355657,9110,8802,-71.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18054,Colombia East zone,9807,8801,4.355657,9110,8802,-68.04513,9110,8805,1.0,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18061,Cuba Norte,9801,8801,22.21,9110,8802,-81.0,9110,8805,0.99993602,9201,8806,500000.0,9001,8807,280296.016,9001,,,,,,
+18062,Cuba Sur,9801,8801,20.43,9110,8802,-76.5,9110,8805,0.99994848,9201,8806,500000.0,9001,8807,229126.939,9001,,,,,,
+18071,Egypt Blue Belt,9807,8801,30.0,9102,8802,35.0,9102,8805,1.0,9201,8806,300000.0,9001,8807,1100000.0,9001,,,,,,
+18072,Egypt Red Belt,9807,8801,30.0,9102,8802,31.0,9102,8805,1.0,9201,8806,615000.0,9001,8807,810000.0,9001,,,,,,
+18073,Egypt Purple Belt,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,200000.0,9001,,,,,,
+18074,Egypt Extended Purple Belt,9807,8801,30.0,9102,8802,27.0,9102,8805,1.0,9201,8806,700000.0,9001,8807,1200000.0,9001,,,,,,
+18081,Lambert zone I,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,1200000.0,9001,,,,,,
+18082,Lambert zone II,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+18083,Lambert zone III,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,3200000.0,9001,,,,,,
+18084,Lambert zone IV,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,4185861.369,9001,,,,,,
+18085,Lambert-93,9802,8821,46.3,9110,8822,3.0,9110,8823,49.0,9110,8824,44.0,9110,8826,700000.0,9001,8827,6600000.0,9001,,,
+18086,France EuroLambert,9801,8801,46.48,9110,8802,2.2014025,9110,8805,0.99987742,9201,8806,600000.0,9001,8807,2200000.0,9001,,,,,,
+18091,Lambert Nord France,9801,8801,55.0,9105,8802,0.0,9105,8805,0.999877341,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+18092,Lambert Centre France,9801,8801,52.0,9105,8802,0.0,9105,8805,0.99987742,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+18093,Lambert Sud France,9801,8801,49.0,9105,8802,0.0,9105,8805,0.999877499,9201,8806,600000.0,9001,8807,200000.0,9001,,,,,,
+18094,Lambert Corse,9801,8801,46.85,9105,8802,0.0,9105,8805,0.99994471,9201,8806,234.358,9001,8807,185861.369,9001,,,,,,
+18110,India zone 0,9801,8801,39.3,9110,8802,68.0,9110,8805,0.99846154,9201,8806,2355500.0,9084,8807,2590000.0,9084,,,,,,
+18111,India zone I,9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18112,India zone IIa,9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18113,India zone IIb,9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18114,India zone IIIa,9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18115,India zone IIIb,9801,8801,19.0,9102,8802,100.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18116,India zone IVa,9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18117,India zone IVb,9801,8801,12.0,9102,8802,100.0,9102,8805,0.99878641,9201,8806,3000000.0,9084,8807,1000000.0,9084,,,,,,
+18121,Italy zone 1,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9996,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+18122,Italy zone 2,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9996,9201,8806,2520000.0,9001,8807,0.0,9001,,,,,,
+18131,Nord Maroc,9801,8801,37.0,9105,8802,-6.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18132,Sud Maroc,9801,8801,33.0,9105,8802,-6.0,9105,8805,0.999615596,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18133,Sahara,9801,8801,29.0,9105,8802,-6.0,9105,8805,0.9996,9201,8806,1200000.0,9001,8807,400000.0,9001,,,,,,
+18141,New Zealand North Island National Grid,9807,8801,-39.0,9110,8802,175.3,9110,8805,1.0,9201,8806,300000.0,9040,8807,400000.0,9040,,,,,,
+18142,New Zealand South Island National Grid,9807,8801,-44.0,9110,8802,171.3,9110,8805,1.0,9201,8806,500000.0,9040,8807,500000.0,9040,,,,,,
+18151,Nigeria West Belt,9807,8801,4.0,9110,8802,4.3,9110,8805,0.99975,9201,8806,230738.26,9001,8807,0.0,9001,,,,,,
+18152,Nigeria Mid Belt,9807,8801,4.0,9110,8802,8.3,9110,8805,0.99975,9201,8806,670553.98,9001,8807,0.0,9001,,,,,,
+18153,Nigeria East Belt,9807,8801,4.0,9110,8802,12.3,9110,8805,0.99975,9201,8806,1110369.7,9001,8807,0.0,9001,,,,,,
+18161,Peru west zone,9807,8801,-6.0,9110,8802,-80.3,9110,8805,0.99983008,9201,8806,222000.0,9001,8807,1426834.743,9001,,,,,,
+18162,Peru central zone,9807,8801,-9.3,9110,8802,-76.0,9110,8805,0.99932994,9201,8806,720000.0,9001,8807,1039979.159,9001,,,,,,
+18163,Peru east zone,9807,8801,-9.3,9110,8802,-70.3,9110,8805,0.99952992,9201,8806,1324000.0,9001,8807,1040084.558,9001,,,,,,
+18171,Philippines zone I,9807,8801,0.0,9102,8802,117.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18172,Philippines zone II,9807,8801,0.0,9102,8802,119.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18173,Philippines zone III,9807,8801,0.0,9102,8802,121.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18174,Philippines zone IV,9807,8801,0.0,9102,8802,123.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18175,Philippines zone V,9807,8801,0.0,9102,8802,125.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18181,Nord Tunisie,9801,8801,40.0,9105,8802,11.0,9105,8805,0.999625544,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18182,Sud Tunisie,9801,8801,37.0,9105,8802,11.0,9105,8805,0.999625769,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+18191,Finland zone 1,9807,8801,0.0,9102,8802,21.0,9102,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+18192,Finland zone 2,9807,8801,0.0,9102,8802,24.0,9102,8805,1.0,9201,8806,2500000.0,9001,8807,0.0,9001,,,,,,
+18193,Finland Uniform Coordinate System,9807,8801,0.0,9102,8802,27.0,9102,8805,1.0,9201,8806,3500000.0,9001,8807,0.0,9001,,,,,,
+18194,Finland zone 4,9807,8801,0.0,9102,8802,30.0,9102,8805,1.0,9201,8806,4500000.0,9001,8807,0.0,9001,,,,,,
+18201,Palestine Grid,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,126867.909,9001,,,,,,,,,
+18202,Palestine Belt,9807,8801,31.4402749,9110,8802,35.124349,9110,8805,1.0,9201,8806,170251.555,9001,8807,1126867.909,9001,,,,,,
+18203,Israeli CS,9806,8801,31.4402749,9110,8802,35.124349,9110,8806,170251.555,9001,8807,1126867.909,9001,,,,,,,,,
+18204,Israeli TM,9807,8801,31.4403817,9110,8802,35.1216261,9110,8805,1.0000067,9201,8806,219529.584,9001,8807,626907.39,9001,,,,,,
+18211,Guatemala Norte,9801,8801,16.49,9110,8802,-90.2,9110,8805,0.99992226,9201,8806,500000.0,9001,8807,292209.579,9001,,,,,,
+18212,Guatemala Sur,9801,8801,14.54,9110,8802,-90.2,9110,8805,0.99989906,9201,8806,500000.0,9001,8807,325992.681,9001,,,,,,
+18221,NGO zone I,9807,8801,58.0,9110,8802,-4.4,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18222,NGO zone II,9807,8801,58.0,9110,8802,-2.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18223,NGO zone III,9807,8801,58.0,9110,8802,0.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18224,NGO zone IV,9807,8801,58.0,9110,8802,2.3,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18225,NGO zone V,9807,8801,58.0,9110,8802,6.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18226,NGO zone VI,9807,8801,58.0,9110,8802,10.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18227,NGO zone VII,9807,8801,58.0,9110,8802,14.1,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18228,NGO zone VIII,9807,8801,58.0,9110,8802,18.2,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18231,"India zone I (1975 metres)",9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18232,"India zone IIa (1975 metres)",9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18233,"India zone IIIa (1975 metres)",9801,8801,19.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18234,"India zone IVa (1975 metres)",9801,8801,12.0,9102,8802,80.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18235,"India zone IIb (1975 metres)",9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743195.5,9001,8807,914398.5,9001,,,,,,
+18236,"India zone I (1962 metres)",9801,8801,32.3,9110,8802,68.0,9110,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+18237,"India zone IIa (1962 metres)",9801,8801,26.0,9102,8802,74.0,9102,8805,0.99878641,9201,8806,2743196.4,9001,8807,914398.8,9001,,,,,,
+18238,"India zone IIb (1937 metres)",9801,8801,26.0,9102,8802,90.0,9102,8805,0.99878641,9201,8806,2743185.69,9001,8807,914395.23,9001,,,,,,
+18240,Libya zone 5,9807,8801,0.0,9102,8802,9.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18241,Libya zone 6,9807,8801,0.0,9102,8802,11.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18242,Libya zone 7,9807,8801,0.0,9102,8802,13.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18243,Libya zone 8,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18244,Libya zone 9,9807,8801,0.0,9102,8802,17.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18245,Libya zone 10,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18246,Libya zone 11,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18247,Libya zone 12,9807,8801,0.0,9102,8802,23.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18248,Libya zone 13,9807,8801,0.0,9102,8802,25.0,9102,8805,0.9999,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18251,Korea East Belt,9807,8801,38.0,9102,8802,129.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+18252,Korea Central Belt,9807,8801,38.0,9102,8802,127.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+18253,Korea West Belt,9807,8801,38.0,9102,8802,125.0,9102,8805,1.0,9201,8806,200000.0,9001,8807,500000.0,9001,,,,,,
+18260,"Maracaibo Grid (M1)",9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,0.0,9001,8807,-52684.972,9001,,,,,,
+18261,Maracaibo Grid,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,200000.0,9001,8807,147315.028,9001,,,,,,
+18262,"Maracaibo Grid (M3)",9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,500000.0,9001,8807,447315.028,9001,,,,,,
+18263,Maracaibo La Rosa Grid,9801,8801,10.1,9110,8802,-71.3620224,9110,8805,1.0,9201,8806,-17044.0,9001,8807,-23139.97,9001,,,,,,
+18275,Balkans zone 5,9807,8801,0.0,9102,8802,15.0,9102,8805,0.9999,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+18276,Balkans zone 6,9807,8801,0.0,9102,8802,18.0,9102,8805,0.9999,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+18277,Balkans zone 7,9807,8801,0.0,9102,8802,21.0,9102,8805,0.9999,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+18278,Balkans zone 8,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9999,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+18281,Poland zone I,9809,8801,50.373,9110,8802,21.05,9110,8805,0.9998,9201,8806,4637000.0,9001,8807,5647000.0,9001,,,,,,
+18282,Poland zone II,9809,8801,53.0007,9110,8802,21.301,9110,8805,0.9998,9201,8806,4603000.0,9001,8807,5806000.0,9001,,,,,,
+18283,Poland zone III,9809,8801,53.35,9110,8802,17.003,9110,8805,0.9998,9201,8806,3501000.0,9001,8807,5999000.0,9001,,,,,,
+18284,Poland zone IV,9809,8801,51.4015,9110,8802,16.402,9110,8805,0.9998,9201,8806,3703000.0,9001,8807,5627000.0,9001,,,,,,
+18285,Poland zone V,9807,8801,0.0,9110,8802,18.573,9110,8805,0.999983,9201,8806,237000.0,9001,8807,-4700000.0,9001,,,,,,
+18300,Poland CS92,9807,8801,0.0,9102,8802,19.0,9102,8805,0.9993,9201,8806,500000.0,9001,8807,-5300000.0,9001,,,,,,
+18305,Poland CS2000 zone 5,9807,8801,0.0,9102,8802,15.0,9102,8805,0.999923,9201,8806,5500000.0,9001,8807,0.0,9001,,,,,,
+18306,Poland CS2000 zone 6,9807,8801,0.0,9102,8802,18.0,9102,8805,0.999923,9201,8806,6500000.0,9001,8807,0.0,9001,,,,,,
+18307,Poland CS2000 zone 7,9807,8801,0.0,9102,8802,21.0,9102,8805,0.999923,9201,8806,7500000.0,9001,8807,0.0,9001,,,,,,
+18308,Poland CS2000 zone 8,9807,8801,0.0,9102,8802,24.0,9102,8805,0.999923,9201,8806,8500000.0,9001,8807,0.0,9001,,,,,,
+18401,Kp2000 Jylland og Fyn,9807,8801,0.0,9110,8802,9.3,9110,8805,0.99995,9201,8806,200000.0,9001,8807,0.0,9001,,,,,,
+18402,Kp2000 Sjaelland,9807,8801,0.0,9102,8802,12.0,9102,8805,0.99995,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+18403,Kp2000 Bornholm,9807,8801,0.0,9102,8802,15.0,9102,8805,1.0,9201,8806,900000.0,9001,8807,0.0,9001,,,,,,
+18411,French West Africa Senegal zone,9807,8801,0.0,9110,8802,-13.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18412,French West Africa Ivory Coast zone,9807,8801,0.0,9110,8802,-6.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18413,French West Africa Dahomey zone,9807,8801,0.0,9110,8802,0.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18414,French West Africa Niger zone,9807,8801,0.0,9110,8802,7.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18415,French Equatorial Africa west zone,9807,8801,0.0,9110,8802,10.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18416,French Equatorial Africa central zone,9807,8801,0.0,9110,8802,17.4,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18417,French Equatorial Africa east zone,9807,8801,0.0,9110,8802,24.3,9110,8805,0.999,9201,8806,1000000.0,9001,8807,1000000.0,9001,,,,,,
+18421,Greenland zone 1 east,9826,8801,82.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18422,Greenland zone 2 east,9826,8801,79.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18423,Greenland zone 3 east,9826,8801,76.3,9110,8802,-20.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18424,Greenland zone 4 east,9826,8801,73.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18425,Greenland zone 5 east,9826,8801,70.3,9110,8802,-24.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18426,Greenland zone 6 east,9826,8801,67.3,9110,8802,-32.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18427,Greenland zone 7 east,9826,8801,64.3,9110,8802,-40.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18428,Greenland zone 8 east,9826,8801,61.3,9110,8802,-48.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18432,Greenland zone 2 west,9826,8801,79.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18433,Greenland zone 3 west,9826,8801,76.3,9110,8802,-64.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18434,Greenland zone 4 west,9826,8801,73.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18435,Greenland zone 5 west,9826,8801,70.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18436,Greenland zone 6 west,9826,8801,67.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18437,Greenland zone 7 west,9826,8801,64.3,9110,8802,-52.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+18441,CS63 zone A1,9807,8801,0.07,9110,8802,41.32,9110,8805,1.0,9003,8806,1300000.0,9001,8807,0.0,9001,,,,,,
+18442,CS63 zone A2,9807,8801,0.07,9110,8802,44.32,9110,8805,1.0,9003,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+18443,CS63 zone A3,9807,8801,0.07,9110,8802,47.32,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+18444,CS63 zone A4,9807,8801,0.07,9110,8802,50.32,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+18446,CS63 zone K2,9807,8801,0.08,9110,8802,50.46,9110,8805,1.0,9201,8806,2300000.0,9001,8807,0.0,9001,,,,,,
+18447,CS63 zone K3,9807,8801,0.08,9110,8802,53.46,9110,8805,1.0,9201,8806,3300000.0,9001,8807,0.0,9001,,,,,,
+18448,CS63 zone K4,9807,8801,0.08,9110,8802,56.46,9110,8805,1.0,9201,8806,4300000.0,9001,8807,0.0,9001,,,,,,
+19900,Bahrain State Grid,9807,8801,0.0,9102,8802,51.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19901,Belge Lambert 50,9802,8821,90.0,9110,8822,0.0,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.0,9001,8827,5400000.0,9001,,,
+19902,Belge Lambert 72,9803,8821,90.0,9110,8822,4.2124983,9110,8823,49.5,9110,8824,51.1,9110,8826,150000.01256,9001,8827,5400088.4378,9001,,,
+19903,Nord de Guerre,9801,8801,55.0,9105,8802,6.0,9105,8805,0.99950908,9201,8806,500000.0,9001,8807,300000.0,9001,,,,,,
+19904,Ghana Metre Grid,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,274319.51,9001,8807,0.0,9001,,,,,,
+19905,Netherlands East Indies Equatorial Zone,9804,8801,0.0,9102,8802,110.0,9102,8805,0.997,9201,8806,3900000.0,9001,8807,900000.0,9001,,,,,,
+19906,Iraq zone,9801,8801,32.3,9110,8802,45.0,9110,8805,0.9987864078,9201,8806,1500000.0,9001,8807,1166200.0,9001,,,,,,
+19907,Iraq National Grid,9807,8801,29.0134566,9110,8802,46.3,9110,8805,0.9994,9201,8806,800000.0,9001,8807,0.0,9001,,,,,,
+19908,Irish National Grid,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+19909,"Jamaica (Old Grid)",9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,550000.0,9005,8807,400000.0,9005,,,,,,
+19910,Jamaica National Grid,9801,8801,18.0,9102,8802,-77.0,9102,8805,1.0,9201,8806,250000.0,9001,8807,150000.0,9001,,,,,,
+19911,Laborde Grid,9815,8811,-21.0,9105,8812,49.0,9105,8813,21.0,9105,8814,21.0,9105,8815,0.9995,9201,8816,400000.0,9001,8817,800000.0,9001
+19913,RD Old,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+19914,RD New,9809,8801,52.0922178,9110,8802,5.23155,9110,8805,0.9999079,9201,8806,155000.0,9001,8807,463000.0,9001,,,,,,
+19915,Aden Zone,9801,8801,15.0,9102,8802,45.0,9102,8805,0.999365678,9201,8806,1500000.0,9001,8807,1000000.0,9001,,,,,,
+19916,British National Grid,9807,8801,49.0,9102,8802,-2.0,9102,8805,0.999601272,9201,8806,400000.0,9001,8807,-100000.0,9001,,,,,,
+19917,New Zealand Map Grid,9811,8801,-41.0,9102,8802,173.0,9102,8806,2510000.0,9001,8807,6023150.0,9001,,,,,,,,,
+19919,Qatar National Grid,9807,8801,24.27,9110,8802,51.13,9110,8805,0.99999,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+19920,Singapore Grid,9806,8801,1.1715528,9110,8802,103.5110808,9110,8806,30000.0,9001,8807,30000.0,9001,,,,,,,,,
+19921,Spain,9801,8801,40.0,9102,8802,0.0,9102,8805,0.9988085293,9201,8806,600000.0,9001,8807,600000.0,9001,,,,,,
+19922,Swiss New Grid,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,600000.0,9001,8817,200000.0,9001
+19923,Swiss Old Grid,9815,8811,46.570866,9110,8812,0.0,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,0.0,9001,8817,0.0,9001
+19924,Tobago Grid,9806,8801,11.1507843,9110,8802,-60.4109632,9110,8806,187500.0,9039,8807,180000.0,9039,,,,,,,,,
+19925,Trinidad Grid,9806,8801,10.263,9110,8802,-61.2,9110,8806,430000.0,9039,8807,325000.0,9039,,,,,,,,,
+19926,Stereo 70,9809,8801,46.0,9102,8802,25.0,9102,8805,0.99975,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+19927,Stereo 33,9809,8801,45.54,9110,8802,25.23328772,9110,8805,0.9996667,9201,8806,500000.0,9001,8807,500000.0,9001,,,,,,
+19928,Kuwait TM,9807,8801,0.0,9102,8802,48.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19929,Swedish National Projection,9807,8801,0.0,9110,8802,15.48298,9110,8805,1.0,9201,8806,1500000.0,9001,8807,0.0,9001,,,,,,
+19930,Greek Grid,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19931,Egyseges Orszagos Vetuleti,9815,8811,47.08398174,9110,8812,19.02548584,9110,8813,90.0,9110,8814,90.0,9110,8815,0.99993,9201,8816,650000.0,9001,8817,200000.0,9001
+19933,"Prince Edward Island Stereographic (ATS77)",9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,700000.0,9001,8807,400000.0,9001,,,,,,
+19934,Lithuania 1994,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9998,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19935,Rectified Skew Orthomorphic Malaya Grid,9812,8806,40000.0,9062,8807,0.0,9062,8811,4.0,9110,8812,102.15,9110,8813,323.01328458,9110,8814,323.07483685,9110,8815,0.99984,9201
+19936,Portuguese National Grid,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,300000.0,9001,,,,,,
+19937,Tunisia Mining Grid,9816,8821,38.81973,9105,8822,7.83445,9105,8826,270.0,9036,8827,582.0,9036,,,,,,,,,
+19938,Estonian National Grid,9802,8821,57.310319415,9110,8822,24.0,9110,8823,59.2,9110,8824,58.0,9110,8826,500000.0,9001,8827,6375000.0,9001,,,
+19939,TM Baltic 93,9807,8801,0.0,9102,8802,24.0,9102,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19940,Levant Zone,9817,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+19941,Brazil Polyconic,9818,8801,0.0,9102,8802,-54.0,9102,8806,5000000.0,9001,8807,10000000.0,9001,,,,,,,,,
+19942,British West Indies Grid,9807,8801,0.0,9102,8802,-62.0,9102,8805,0.9995,9201,8806,400000.0,9001,8807,0.0,9001,,,,,,
+19943,Barbados National Grid,9807,8801,13.1035,9110,8802,-59.3335,9110,8805,0.9999986,9201,8806,30000.0,9001,8807,75000.0,9001,,,,,,
+19944,Quebec Lambert Projection,9802,8821,44.0,9110,8822,-68.3,9110,8823,60.0,9110,8824,46.0,9110,8826,0.0,9001,8827,0.0,9001,,,
+19945,"New Brunswick Stereographic (ATS77)",9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,300000.0,9001,8807,800000.0,9001,,,,,,
+19946,"New Brunswick Stereographic (NAD83)",9809,8801,46.3,9110,8802,-66.3,9110,8805,0.999912,9201,8806,2500000.0,9001,8807,7500000.0,9001,,,,,,
+19947,Austria Lambert,9802,8821,47.3,9110,8822,13.2,9110,8823,49.0,9110,8824,46.0,9110,8826,400000.0,9001,8827,400000.0,9001,,,
+19948,Syria Lambert,9801,8801,34.39,9110,8802,37.21,9110,8805,0.9996256,9201,8806,300000.0,9001,8807,300000.0,9001,,,,,,
+19949,Levant Stereographic,9809,8801,38.0,9105,8802,43.5,9105,8805,0.9995341,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+19950,Landesvermessung 1995,9815,8811,46.570866,9110,8812,7.26225,9110,8813,90.0,9110,8814,90.0,9110,8815,1.0,9201,8816,2600000.0,9001,8817,1200000.0,9001
+19951,Nakhl e Taqi Oblique Mercator,9815,8811,27.31077837,9110,8812,52.3612741,9110,8813,0.34179803,9110,8814,0.34179803,9110,8815,0.999895934,9201,8816,658377.437,9001,8817,3044969.194,9001
+19952,Krovak,9819,8811,49.3,9110,8812,42.3,9110,8813,30.1717303,9110,8816,0.0,9001,8817,0.0,9001,8818,78.3,9110,8819,0.9999,9201
+19953,Qatar Grid,9806,8801,25.22565,9110,8802,50.4541,9110,8806,100000.0,9001,8807,100000.0,9001,,,,,,,,,
+19954,Suriname Old TM,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9996,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19955,Suriname TM,9807,8801,0.0,9110,8802,-55.41,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19956,"Rectified Skew Orthomorphic Borneo Grid (chains)",9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,29352.4763,9042,8817,22014.3572,9042
+19957,"Rectified Skew Orthomorphic Borneo Grid (feet)",9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,1937263.44,9041,8817,1452947.58,9041
+19958,"Rectified Skew Orthomorphic Borneo Grid (metres)",9815,8811,4.0,9110,8812,115.0,9110,8813,53.18569537,9110,8814,53.07483685,9110,8815,0.99984,9201,8816,590476.87,9001,8817,442857.65,9001
+19959,Ghana National Grid,9807,8801,4.4,9110,8802,-1.0,9110,8805,0.99975,9201,8806,900000.0,9094,8807,0.0,9094,,,,,,
+19960,"Prince Edward Isl. Stereographic (NAD83)",9809,8801,47.15,9110,8802,-63.0,9110,8805,0.999912,9201,8806,400000.0,9001,8807,800000.0,9001,,,,,,
+19961,Belgian Lambert 72,9802,8821,90.0,9110,8822,4.2202952,9110,8823,51.100000204,9110,8824,49.500000204,9110,8826,150000.013,9001,8827,5400088.438,9001,,,
+19962,Irish Transverse Mercator,9807,8801,53.3,9110,8802,-8.0,9110,8805,0.99982,9201,8806,600000.0,9001,8807,750000.0,9001,,,,,,
+19963,Sierra Leone New Colony Grid,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,500000.0,9094,8807,0.0,9094,,,,,,
+19964,New War Office Sierra Leone Grid,9807,8801,6.4,9110,8802,-12.0,9110,8805,1.0,9201,8806,800000.0,9094,8807,600000.0,9094,,,,,,
+19965,US National Atlas Equal Area,9821,8806,0.0,9001,8807,0.0,9001,8828,45.0,9102,8829,-100.0,9102,,,,,,,,,
+19966,Luxembourg Gauss,9807,8801,49.5,9110,8802,6.1,9110,8805,1.0,9201,8806,80000.0,9001,8807,100000.0,9001,,,,,,
+19967,Slovenia Grid,9807,8801,0.0,9110,8802,15.0,9110,8805,0.9999,9201,8806,500000.0,9001,8807,0.0,9001,,,,,,
+19968,Plate Carree,9823,8801,0.0,9102,8802,0.0,9102,,,,,,,,,,,,,,,
+19969,Portuguese Grid,9807,8801,39.4,9110,8802,1.0,9110,8805,1.0,9201,8806,0.0,9001,8807,0.0,9001,,,,,,
+19971,New Zealand Transverse Mercator,9807,8801,0.0,9102,8802,173.0,9102,8805,0.9996,9201,8806,1600000.0,9001,8807,10000000.0,9001,,,,,,
+19972,Irish Grid,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.000035,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+19973,Irish National Grid,9807,8801,53.3,9110,8802,-8.0,9110,8805,1.0,9201,8806,200000.0,9001,8807,250000.0,9001,,,,,,
+19974,Modified Portuguese Grid,9807,8801,39.4,9110,8802,-8.0754862,9110,8805,1.0,9201,8806,180.598,9001,8807,-86.99,9001,,,,,,
+19975,"Trinidad Grid (Clarke's feet)",9806,8801,10.263,9110,8802,-61.2,9110,8806,283800.0,9005,8807,214500.0,9005,,,,,,,,,
+19976,ICN Regional,9802,8821,6.0,9102,8822,-66.0,9102,8823,9.0,9102,8824,3.0,9102,8826,1000000.0,9001,8827,1000000.0,9001,,,
+19977,Aramco Lambert,9802,8821,25.0522236,9110,8822,48.0,9102,8823,17.0,9102,8824,33.0,9102,8826,0.0,9001,8827,0.0,9001,,,
+19978,Hong Kong 1980 Grid,9807,8801,22.184368,9110,8802,114.10428,9110,8805,1.0,9201,8806,836694.05,9001,8807,819069.8,9001,,,,,,
+19979,Portugal Bonne,9828,8801,39.4,9110,8802,1.0,9110,8806,0.0,9001,8807,0.0,9001,,,,,,,,,
diff --git a/src/tiff/csv/stateplane.csv b/src/tiff/csv/stateplane.csv
new file mode 100644
index 0000000..506af15
--- /dev/null
+++ b/src/tiff/csv/stateplane.csv
@@ -0,0 +1,258 @@
+"ID","STATE","ZONE","PROJ_METHOD","DATUM","USGS_CODE","EPSG_PCS_CODE"
+101,ALABAMA,EAST,1,NAD83,101,26929
+102,ALABAMA,WEST,1,NAD83,102,26930
+201,ARIZONA,EAST,1,NAD83,201,26948
+202,ARIZONA,CENTRAL,1,NAD83,202,26949
+203,ARIZONA,WEST,1,NAD83,203,26950
+301,ARKANSAS,NORTH,2,NAD83,301,26951
+302,ARKANSAS,SOUTH,2,NAD83,302,26952
+401,CALIFORNIA,I,2,NAD83,401,26941
+402,CALIFORNIA,II,2,NAD83,402,26942
+403,CALIFORNIA,III,2,NAD83,403,26943
+404,CALIFORNIA,IV,2,NAD83,404,26944
+405,CALIFORNIA,V,2,NAD83,405,26945
+406,CALIFORNIA,VI,2,NAD83,406,26946
+501,COLORADO,NORTH,2,NAD83,501,26953
+502,COLORADO,CENTRAL,2,NAD83,502,26954
+503,COLORADO,SOUTH,2,NAD83,503,26955
+600,CONNECTICUT,,2,NAD83,600,26956
+700,DELAWARE,,1,NAD83,700,26957
+901,FLORIDA,EAST,1,NAD83,901,26958
+902,FLORIDA,WEST,1,NAD83,902,26959
+903,FLORIDA,NORTH,2,NAD83,903,26960
+1001,GEORGIA,EAST,1,NAD83,1001,26966
+1002,GEORGIA,WEST,1,NAD83,1002,26967
+1101,IDAHO,EAST,1,NAD83,1101,26968
+1102,IDAHO,CENTRAL,1,NAD83,1102,26969
+1103,IDAHO,WEST,1,NAD83,1103,26970
+1201,ILLINOIS,EAST,1,NAD83,1201,26971
+1202,ILLINOIS,WEST,1,NAD83,1202,26972
+1301,INDIANA,EAST,1,NAD83,1301,26973
+1302,INDIANA,WEST,1,NAD83,1302,26974
+1401,IOWA,NORTH,2,NAD83,1401,26975
+1402,IOWA,SOUTH,2,NAD83,1402,26976
+1501,KANSAS,NORTH,2,NAD83,1501,26977
+1502,KANSAS,SOUTH,2,NAD83,1502,26978
+1601,KENTUCKY,NORTH,2,NAD83,1601,2205
+1602,KENTUCKY,SOUTH,2,NAD83,1602,26980
+1701,LOUISIANA,NORTH,2,NAD83,1701,26981
+1702,LOUISIANA,SOUTH,2,NAD83,1702,26982
+1703,LOUISIANA,OFFSHORE,2,NAD83,1703,
+1801,MAINE,EAST,1,NAD83,1801,26983
+1802,MAINE,WEST,1,NAD83,1802,26984
+1900,MARYLAND,,2,NAD83,1900,26985
+2001,MASSACHUSETTS,MAINLAND,2,NAD83,2001,26986
+2002,MASSACHUSETTS,ISLAND,2,NAD83,2002,26987
+2111,MICHIGAN,NORTH,2,NAD83,2111,26988
+2112,MICHIGAN,CENTRAL,2,NAD83,2112,26989
+2113,MICHIGAN,SOUTH,2,NAD83,2113,26990
+2201,MINNESOTA,NORTH,2,NAD83,2201,26991
+2202,MINNESOTA,CENTRAL,2,NAD83,2202,26992
+2203,MINNESOTA,SOUTH,2,NAD83,2203,26993
+2301,MISSISSIPPI,EAST,1,NAD83,2301,26994
+2302,MISSISSIPPI,WEST,1,NAD83,2302,26995
+2401,MISSOURI,EAST,1,NAD83,2401,26996
+2402,MISSOURI,CENTRAL,1,NAD83,2402,26997
+2403,MISSOURI,WEST,1,NAD83,2403,26998
+2500,MONTANA,,2,NAD83,2500,32100
+2600,NEBRASKA,,2,NAD83,2600,32104
+2701,NEVADA,EAST,1,NAD83,2701,32107
+2702,NEVADA,CENTRAL,1,NAD83,2702,32108
+2703,NEVADA,WEST,1,NAD83,2703,32109
+2800,"NEW HAMPSHIRE",,1,NAD83,2800,32110
+2900,"NEW JERSEY",,1,NAD83,2900,32111
+3001,"NEW MEXICO",EAST,1,NAD83,3001,32112
+3002,"NEW MEXICO",CENTRAL,1,NAD83,3002,32113
+3003,"NEW MEXICO",WEST,1,NAD83,3003,32114
+3101,"NEW YORK",EAST,1,NAD83,3101,32115
+3102,"NEW YORK",CENTRAL,1,NAD83,3102,32116
+3103,"NEW YORK",WEST,1,NAD83,3103,32117
+3104,"NEW YORK","LONG ISLAND",2,NAD83,3104,32118
+3200,"NORTH CAROLINA",,2,NAD83,3200,32119
+3301,"NORTH DAKOTA",NORTH,2,NAD83,3301,32120
+3302,"NORTH DAKOTA",SOUTH,2,NAD83,3302,32121
+3401,OHIO,NORTH,2,NAD83,3401,32122
+3402,OHIO,SOUTH,2,NAD83,3402,32123
+3501,OKLAHOMA,NORTH,2,NAD83,3501,32124
+3502,OKLAHOMA,SOUTH,2,NAD83,3502,32125
+3601,OREGON,NORTH,2,NAD83,3601,32126
+3602,OREGON,SOUTH,2,NAD83,3602,32127
+3701,PENNSYLVANIA,NORTH,2,NAD83,3701,32128
+3702,PENNSYLVANIA,SOUTH,2,NAD83,3702,32129
+3800,"RHODE ISLAND",,1,NAD83,3800,32130
+3900,"SOUTH CAROLINA",,2,NAD83,3900,32133
+4001,"SOUTH DAKOTA",NORTH,2,NAD83,4001,32134
+4002,"SOUTH DAKOTA",SOUTH,2,NAD83,4002,32135
+4100,TENNESSEE,,2,NAD83,4100,32136
+4201,TEXAS,NORTH,2,NAD83,4201,32137
+4202,TEXAS,"NORTH CENTRAL",2,NAD83,4202,32138
+4203,TEXAS,CENTRAL,2,NAD83,4203,32139
+4204,TEXAS,"SOUTH CENTRAL",2,NAD83,4204,32140
+4205,TEXAS,SOUTH,2,NAD83,4205,32141
+4301,UTAH,NORTH,2,NAD83,4301,32142
+4302,UTAH,CENTRAL,2,NAD83,4302,32143
+4303,UTAH,SOUTH,2,NAD83,4303,32144
+4400,VERMONT,,1,NAD83,4400,32145
+4501,VIRGINIA,NORTH,2,NAD83,4501,32146
+4502,VIRGINIA,SOUTH,2,NAD83,4502,32147
+4601,WASHINGTON,NORTH,2,NAD83,4601,32148
+4602,WASHINGTON,SOUTH,2,NAD83,4602,32149
+4701,"WEST VIRGINIA",NORTH,2,NAD83,4701,32150
+4702,"WEST VIRGINIA",SOUTH,2,NAD83,4702,32151
+4801,WISCONSIN,NORTH,2,NAD83,4801,32152
+4802,WISCONSIN,CENTRAL,2,NAD83,4802,32153
+4803,WISCONSIN,SOUTH,2,NAD83,4803,32154
+4901,WYOMING,EAST,1,NAD83,4901,32155
+4902,WYOMING,"EAST CENTRAL",1,NAD83,4902,32156
+4903,WYOMING,"WEST CENTRAL",1,NAD83,4903,32157
+4904,WYOMING,WEST,1,NAD83,4904,32158
+5001,ALASKA,"ZONE NO. 1",4,NAD83,5001,26931
+5002,ALASKA,"ZONE NO. 2",1,NAD83,5002,26932
+5003,ALASKA,"ZONE NO. 3",1,NAD83,5003,26933
+5004,ALASKA,"ZONE NO. 4",1,NAD83,5004,26934
+5005,ALASKA,"ZONE NO. 5",1,NAD83,5005,26935
+5006,ALASKA,"ZONE NO. 6",1,NAD83,5006,26936
+5007,ALASKA,"ZONE NO. 7",1,NAD83,5007,26937
+5008,ALASKA,"ZONE NO. 8",1,NAD83,5008,26938
+5009,ALASKA,"ZONE NO. 9",1,NAD83,5009,26939
+5010,ALASKA,"ZONE NO. 10",2,NAD83,5010,26940
+5101,HAWAII,1,1,NAD83,5101,26961
+5102,HAWAII,2,1,NAD83,5102,26962
+5103,HAWAII,3,1,NAD83,5103,26963
+5104,HAWAII,4,1,NAD83,5104,26964
+5105,HAWAII,5,1,NAD83,5105,26965
+5200,"PUERTO RICO AND","VIRGIN ISLANDS",2,NAD83,5200,32161
+10101,ALABAMA,EAST,1,NAD27,101,26729
+10102,ALABAMA,WEST,1,NAD27,102,26730
+10201,ARIZONA,EAST,1,NAD27,201,26748
+10202,ARIZONA,CENTRAL,1,NAD27,202,26749
+10203,ARIZONA,WEST,1,NAD27,203,26750
+10301,ARKANSAS,NORTH,2,NAD27,301,26751
+10302,ARKANSAS,SOUTH,2,NAD27,302,26752
+10401,CALIFORNIA,I,2,NAD27,401,26741
+10402,CALIFORNIA,II,2,NAD27,402,26742
+10403,CALIFORNIA,III,2,NAD27,403,26743
+10404,CALIFORNIA,IV,2,NAD27,404,26744
+10405,CALIFORNIA,V,2,NAD27,405,26745
+10406,CALIFORNIA,VI,2,NAD27,406,26746
+10407,CALIFORNIA,VII,2,NAD27,407,26747
+10501,COLORADO,NORTH,2,NAD27,501,26753
+10502,COLORADO,CENTRAL,2,NAD27,502,26754
+10503,COLORADO,SOUTH,2,NAD27,503,26755
+10600,CONNECTICUT,,2,NAD27,600,26756
+10700,DELAWARE,,1,NAD27,700,26757
+10901,FLORIDA,EAST,1,NAD27,901,26758
+10902,FLORIDA,WEST,1,NAD27,902,26759
+10903,FLORIDA,NORTH,2,NAD27,903,26760
+11001,GEORGIA,EAST,1,NAD27,1001,26766
+11002,GEORGIA,WEST,1,NAD27,1002,26767
+11101,IDAHO,EAST,1,NAD27,1101,26768
+11102,IDAHO,CENTRAL,1,NAD27,1102,26769
+11103,IDAHO,WEST,1,NAD27,1103,26770
+11201,ILLINOIS,EAST,1,NAD27,1201,26771
+11202,ILLINOIS,WEST,1,NAD27,1202,26772
+11301,INDIANA,EAST,1,NAD27,1301,26773
+11302,INDIANA,WEST,1,NAD27,1302,26774
+11401,IOWA,NORTH,2,NAD27,1401,26775
+11402,IOWA,SOUTH,2,NAD27,1402,26776
+11501,KANSAS,NORTH,2,NAD27,1501,26777
+11502,KANSAS,SOUTH,2,NAD27,1502,26778
+11601,KENTUCKY,NORTH,2,NAD27,1601,26779
+11602,KENTUCKY,SOUTH,2,NAD27,1602,26780
+11701,LOUISIANA,NORTH,2,NAD27,1701,26781
+11702,LOUISIANA,SOUTH,2,NAD27,1702,26782
+11703,LOUISIANA,OFFSHORE,2,NAD27,1703,
+11801,MAINE,EAST,1,NAD27,1801,26783
+11802,MAINE,WEST,1,NAD27,1802,26784
+11900,MARYLAND,,2,NAD27,1900,26785
+12001,MASSACHUSETTS,MAINLAND,2,NAD27,2001,26786
+12002,MASSACHUSETTS,ISLAND,2,NAD27,2002,26787
+12101,MICHIGAN,EAST,1,NAD27,2101,26801
+12102,MICHIGAN,"CENTRAL/M",1,NAD27,2102,26802
+12103,MICHIGAN,WEST,1,NAD27,2103,26803
+12111,MICHIGAN,NORTH,2,NAD27,2111,26811
+12112,MICHIGAN,"CENTRAL/L",2,NAD27,2112,26812
+12113,MICHIGAN,SOUTH,2,NAD27,2113,26813
+12201,MINNESOTA,NORTH,2,NAD27,2201,26791
+12202,MINNESOTA,CENTRAL,2,NAD27,2202,26792
+12203,MINNESOTA,SOUTH,2,NAD27,2203,26793
+12301,MISSISSIPPI,EAST,1,NAD27,2301,26794
+12302,MISSISSIPPI,WEST,1,NAD27,2302,26795
+12401,MISSOURI,EAST,1,NAD27,2401,26796
+12402,MISSOURI,CENTRAL,1,NAD27,2402,26797
+12403,MISSOURI,WEST,1,NAD27,2403,26798
+12501,MONTANA,NORTH,2,NAD27,2501,32001
+12502,MONTANA,CENTRAL,2,NAD27,2502,32002
+12503,MONTANA,SOUTH,2,NAD27,2503,32003
+12601,NEBRASKA,NORTH,2,NAD27,2601,32005
+12602,NEBRASKA,SOUTH,2,NAD27,2602,32006
+12701,NEVADA,EAST,1,NAD27,2701,32007
+12702,NEVADA,CENTRAL,1,NAD27,2702,32008
+12703,NEVADA,WEST,1,NAD27,2703,32009
+12800,"NEW HAMPSHIRE",,1,NAD27,2800,32010
+12900,"NEW JERSEY",,1,NAD27,2900,32011
+13001,"NEW MEXICO",EAST,1,NAD27,3001,32012
+13002,"NEW MEXICO",CENTRAL,1,NAD27,3002,32013
+13003,"NEW MEXICO",WEST,1,NAD27,3003,32014
+13101,"NEW YORK",EAST,1,NAD27,3101,32015
+13102,"NEW YORK",CENTRAL,1,NAD27,3102,32016
+13103,"NEW YORK",WEST,1,NAD27,3103,32017
+13104,"NEW YORK","LONG ISLAND",2,NAD27,3104,32018
+13200,"NORTH CAROLINA",,2,NAD27,3200,32019
+13301,"NORTH DAKOTA",NORTH,2,NAD27,3301,32020
+13302,"NORTH DAKOTA",SOUTH,2,NAD27,3302,32021
+13401,OHIO,NORTH,2,NAD27,3401,32022
+13402,OHIO,SOUTH,2,NAD27,3402,32023
+13501,OKLAHOMA,NORTH,2,NAD27,3501,32024
+13502,OKLAHOMA,SOUTH,2,NAD27,3502,32025
+13601,OREGON,NORTH,2,NAD27,3601,32026
+13602,OREGON,SOUTH,2,NAD27,3602,32027
+13701,PENNSYLVANIA,NORTH,2,NAD27,3701,32028
+13702,PENNSYLVANIA,SOUTH,2,NAD27,3702,32029
+13800,"RHODE ISLAND",,1,NAD27,3800,32030
+13901,"SOUTH CAROLINA",NORTH,2,NAD27,3901,32031
+13902,"SOUTH CAROLINA",SOUTH,2,NAD27,3902,32033
+14001,"SOUTH DAKOTA",NORTH,2,NAD27,4001,32034
+14002,"SOUTH DAKOTA",SOUTH,2,NAD27,4002,32035
+14100,TENNESSEE,,2,NAD27,4100,2204
+14201,TEXAS,NORTH,2,NAD27,4201,32037
+14202,TEXAS,"NORTH CENTRAL",2,NAD27,4202,32038
+14203,TEXAS,CENTRAL,2,NAD27,4203,32039
+14204,TEXAS,"SOUTH CENTRAL",2,NAD27,4204,32040
+14205,TEXAS,SOUTH,2,NAD27,4205,32041
+14301,UTAH,NORTH,2,NAD27,4301,32042
+14302,UTAH,CENTRAL,2,NAD27,4302,32043
+14303,UTAH,SOUTH,2,NAD27,4303,32044
+14400,VERMONT,,1,NAD27,4400,32045
+14501,VIRGINIA,NORTH,2,NAD27,4501,32046
+14502,VIRGINIA,SOUTH,2,NAD27,4502,32047
+14601,WASHINGTON,NORTH,2,NAD27,4601,32048
+14602,WASHINGTON,SOUTH,2,NAD27,4602,32049
+14701,"WEST VIRGINIA",NORTH,2,NAD27,4701,32050
+14702,"WEST VIRGINIA",SOUTH,2,NAD27,4702,32051
+14801,WISCONSIN,NORTH,2,NAD27,4801,32052
+14802,WISCONSIN,CENTRAL,2,NAD27,4802,32053
+14803,WISCONSIN,SOUTH,2,NAD27,4803,32054
+14901,WYOMING,EAST,1,NAD27,4901,32055
+14902,WYOMING,"EAST CENTRAL",1,NAD27,4902,32056
+14903,WYOMING,"WEST CENTRAL",1,NAD27,4903,32057
+14904,WYOMING,WEST,1,NAD27,4904,32058
+15001,ALASKA,"ZONE NO. 1",4,NAD27,5001,26731
+15002,ALASKA,"ZONE NO. 2",1,NAD27,5002,26732
+15003,ALASKA,"ZONE NO. 3",1,NAD27,5003,26733
+15004,ALASKA,"ZONE NO. 4",1,NAD27,5004,26734
+15005,ALASKA,"ZONE NO. 5",1,NAD27,5005,26735
+15006,ALASKA,"ZONE NO. 6",1,NAD27,5006,26736
+15007,ALASKA,"ZONE NO. 7",1,NAD27,5007,26737
+15008,ALASKA,"ZONE NO. 8",1,NAD27,5008,26738
+15009,ALASKA,"ZONE NO. 9",1,NAD27,5009,26739
+15010,ALASKA,"ZONE NO. 10",2,NAD27,5010,26740
+15101,HAWAII,1,1,NAD27,5101,3561
+15102,HAWAII,2,1,NAD27,5102,3562
+15103,HAWAII,3,1,NAD27,5103,3563
+15104,HAWAII,4,1,NAD27,5104,3564
+15105,HAWAII,5,1,NAD27,5105,3565
+15201,"PUERTO RICO AND VIRGIN ISLANDS",,2,NAD27,5201,3991
+15202,"VIRGIN ISLANDS","ST. CROIX",2,NAD27,5202,3992
+15300,"AMERICAN SAMOA",,2,NAD27,5300,2155
+15400,"GUAM ISLAND",,3,NAD27,5400,
diff --git a/src/tiff/csv/trf_method.c b/src/tiff/csv/trf_method.c
new file mode 100644
index 0000000..dc7ecb6
--- /dev/null
+++ b/src/tiff/csv/trf_method.c
@@ -0,0 +1,205 @@
+#include "defs.h"
+datafile_rows_t trf_method_row_1[] = {"COORD_TRF_METHOD_CODE","CTRF_METHOD_EPSG_NAME","CTRF_METHOD_USER_NAME","DESCRIPTION","PARAM_1_NAME","PARAM_2_NAME","PARAM_3_NAME","PARAM_4_NAME","PARAM_5_NAME","PARAM_6_NAME","PARAM_7_NAME","PARAM_8_NAME","PARAM_9_NAME","PARAM_10_NAME","PARAM_11_NAME","PARAM_12_NAME","PARAM_13_NAME","PARAM_14_NAME","PARAM_15_NAME","PARAM_16_NAME","PARAM_17_NAME","PARAM_18_NAME","PARAM_19_NAME","PARAM_20_NAME","PARAM_21_NAME","PARAM_22_NAME","PARAM_23_NAME","PARAM_24 [...]
+datafile_rows_t trf_method_row_2[] = {"9601","Longitude rotation","","This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.","Longitude rotation","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Lon2 = Lon1 + longitude_rotation.","","1999-11-12 00:00:00","","EPSG","","99.79",NULL};
+datafile_rows_t trf_method_row_3[] = {"9602","Geodetic/geocentric conversions","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude, P, and Longitude, L, in terms of Geographic Coordinate System (GCS) A may \
+be expressed in terms of a geocentric (earth centred) cartesian coordinate system X, Y, Z \
+with the Z axis corresponding with the Polar axis positive northwards, the X a","Consider a North Sea point with coordinates derived by GPS satellite in the WGS84 geographical coordinate system with coordinates of:\
+\
+           latitude    53 deg 48 min 33.82 sec N, \
+           longitude 02 deg 07 min 46.38 sec E, \
+    and ellipsoid","1996-09-18 00:00:00","\"Transformation from spatial to geographical coordinates\"; B. R. Bowring; Survey Review number 181; July 1976.","EPSG","","97.29",NULL};
+datafile_rows_t trf_method_row_4[] = {"9603","Geocentric translations","","","X-axis translation","Y-axis translation","Z-axis translation","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","If  we may assume that the minor axes of the ellipsoids are parallel, then shifts dX, dY, dZ \
+in the sense from datum A to datum B may then be applied as\
+\
+   XB = XA + dX \
+   YB = YA + dY\
+   ZB = ZA + dZ","Given a three parameter datum shift from WGS84 to ED50 for this North Sea area is given as \
+dX = +84.87m, dY = +96.49m, dZ = +116.95m. \
+\
+The WGS84 geographical coordinates convert to the following GS84 geocentric values using \
+the above formulas for X,","1996-09-18 00:00:00","POSC Epicentre 2.2.1","EPSG","","",NULL};
+datafile_rows_t trf_method_row_5[] = {"9604","Molodenski","","","X-axis translation","Y-axis translation","Z-axis translation","Semi-major axis length difference","Flattening difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_6[] = {"9605","Abridged Molodenski","","","X-axis translation","Y-axis translation","Z-axis translation","Semi-major axis length difference","Flattening difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","As an alternative to the computation of the new latitude, longitude and height above ellipsoid in discrete steps through geocentric coordinates, the changes in these coordinates may be derived direct [...]
+datafile_rows_t trf_method_row_7[] = {"9606","Position Vector 7-param. transformation","","","X-axis translation","Y-axis translation","Z-axis translation","X-axis rotation","Y-axis rotation","Z-axis rotation","Scale difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Transformation of coordinates from one geographic coordinate system into another (also known as a \"datum transformation\") is usually carried out as an implicit concatenat [...]
+[geographical to geocentric >> geocentric to geocentric","Input point: \
+Coordinate system: WGS72 (geographic 3D)\
+  Latitude =   55 deg 00 min 00 sec \
+  Longitude =  4 deg 00 min 00 sec \
+  Ellipsoidal height =  0 m\
+This transforms to cartesian geocentric coords:\
+    X = 3 657 660.66 (m)  \
+    Y =    255 768","1996-09-18 00:00:00","","EPSG","","98.16",NULL};
+datafile_rows_t trf_method_row_8[] = {"9607","Coordinate Frame rotation","","","X-axis translation","Y-axis translation","Z-axis translation","X-axis rotation","Y-axis rotation","Z-axis rotation","Scale difference","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","<<<<<This text is continued from the description of the Position Vector Transformation formula>>>>>\
+\
+Although being common practice in particularly the European E&P industry Position Vector Transformation sign convention is not universally accepted.  A v","The same example as for the Position Vector Transformation can be calculated, however the following transformation parameters have to be applied to achieve the same input and output in terms of coordinate values:\
+\
+Transformation parameters Coordinate Fra","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_9[] = {"9608","Similarity transform","","","A1","A2 * m","A3 * n","B1","B2 * m","B3 * n","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_10[] = {"9609","2-dimensional Affine transformation","","","A1","A2 * m","A3 * n","B1","B2 * m","B3 * n","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_11[] = {"9610","2nd-order Polynomial function","","","Ordinate 1 of source evaluation point","Ordinate 2 of source evaluation point","Ordinate 1 of target evaluation point","Ordinate 2 of target evaluation point","A1","A2 * m","A3 * n","A4 * mm","A5 * mn","A6 * nn","B1","B2 * m","B3 * n","B4 * mm","B5 * mn","B6 * nn","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_method_row_12[] = {"9611","3rd-order Polynomial function","","","Ordinate 1 of source evaluation point","Ordinate 2 of source evaluation point","Ordinate 1 of target evaluation point","Ordinate 2 of target evaluation point","A1","A2 * m","A3 * n","A4 * mm","A5 * mn","A6 * nn","A7 * mmm","A8 * mmn","A9 * mnn","A10 * nnn","B1","B2 * m","B3 * n","B4 * mm","B5 * mn","B6 * nn","B7 * mmm","B8 * mmn","B9 * mnn","B10 * nnn","","","","","","","","","","","","","","","","1996-0 [...]
+datafile_rows_t trf_method_row_13[] = {"9612","4th-order Polynomial function","","","Ordinate 1 of source evaluation point","Ordinate 2 of source evaluation point","Ordinate 1 of target evaluation point","Ordinate 2 of target evaluation point","A1","A2 * m","A3 * n","A4 * mm","A5 * mn","A6 * nn","A7 * mmm","A8 * mmn","A9 * mnn","A10 * nnn","A11 * mmmm","A12 * mmmn","A13 * mmnn","A14 * mnnn","A15 * nnnn","B1","B2 * m","B3 * n","B4 * mm","B5 * mn","B6 * nn","B7 * mmm","B8 * mmn","B9 * mnn" [...]
+datafile_rows_t trf_method_row_14[] = {"9613","NADCON","","Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Used specifically for some NAD27<->NAD83 transformations in USA.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude difference gridded binary file","Longitude difference gridded binary file","","","","1996-09-18 00:00:00","US Coast and geodetic Survey - http://www.ngs.no [...]
+datafile_rows_t trf_method_row_15[] = {"9614","NTv1","","Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Used specifically for some NAD27<->NAD83 transformations in Canada.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude and longitude difference file","","","","","1997-11-13 00:00:00","Geomatics Canada - Geodetic Survey Division.","EPSG","Superceded in 1997 by NTv2 (transf [...]
+datafile_rows_t trf_method_row_16[] = {"9615","NTv2","","Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Latitude and longitude difference file","","","","","1997-11-13 00:00:00","http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html","EPSG","Supercedes  NTv1 (transformation method code 9614).  Input exp [...]
+datafile_rows_t trf_method_row_17[] = {"9616","Vertical Offset","","This transformation allows calculation of ordinate in the target system by adding the parameter value to the ordinate value of the point in the source system.","Vertical offset","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","V2 = [(V1 * U1) + (O12 * Uoff)] * (m / U2) where V2 = value in second vertical coordinate system; V1 = value in first system; O12 is the  [...]
+datafile_rows_t trf_method_row_18[] = {"9617","Madrid to ED50","","","","","","","A","B","C","D","E","F","G","H","J","","","","","","","","","","","","","","","","","","","","","","","","","The original geographic coordinate system for the Spanish mainland was based on Madrid 1870 datum, Struve 1860 ellipsoid, with longitudes related to the Madrid meridian.  Three polynomial expressions have been empirically derived by El Servicio Geogr�fico ","Input point coordinate system: Madrid 1870  [...]
+   Latitude    =  42 deg 38 min 52.77 sec N = 42.647992 degrees\
+   Longitude  =    3 deg 39 min 34.57 sec E of Madrid	\
+                         = +3.659603 degrees from the Madrid merid","1999-11-15 00:00:00","Institut de Geomatica; Barcelona","EPSG","","99.284  99.82",NULL};
+datafile_rows_t trf_method_row_19[] = {"9618","Geographical and Height Offsets","","This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.","Latitude offset","Longitude offset","Gravity-related to ellipsoid height","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Lat2 = Lat1 + latitude_offset;  Lon2 = Lon1 + longitude_offset;  [...]
+datafile_rows_t trf_method_row_20[] = {"9619","Geographical Offsets","","This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.","Latitude offset","Longitude offset","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Lat2 = Lat1 + latitude_offset;  Lon2 = Lon1 + longitude_offset.","","1999-11-12 00:00:00","","EPSG","","99.79",NULL};
+datafile_rows_t trf_method_row_21[] = {"9620","Norway Offshore Interpolation","","","","","","","","Geod. tfm. code for northern boundary","Geod. tfm. code for southern boundary","","","","","","","","","","","","","","","","","","","","","","","","","","","","Geod. tfm. name for northern boundary","Geod. tfm. name for southern boundary","","","","1999-04-22 00:00:00","Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\".","EPSG","","",NULL};
+datafile_rows_t trf_method_row_22[] = {"9801","Lambert Conic Conformal (1SP)","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:\
+\
+E = FE + r sin(theta)\
+N = FN + r0 - r cos(theta)\
+where\
+n = sin lat0\
+r = a F t^n k0     f","For Projected Coordinate System JAD69 / Jamaica National Grid\
+\
+Parameters:\
+Ellipsoid:  Clarke 1866, a = 6378206.400 m., 1/f = 294.97870\
+                                   then  e = 0.08227185 and e^2 = 0.00676866\
+\
+Latitude Natural Origin         18 d","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1","EPSG","","",NULL};
+datafile_rows_t trf_method_row_23[] = {"9802","Lambert Conic Conformal (2SP)","","","Latitude of false origin","Longitude of false origin","Latitude of 1st standard parallel","Latitude of 2nd standard parallel","","Easting at false origin","Northing at false origin","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one s [...]
+\
+E = EF + r sin(theta)\
+N = NF + rF - r cos(theta)\
+where\
+m = cos(lat)/(1 - e^2 sin^2(lat))^","For Projected Coordinate System NAD27 / Texas South Central\
+\
+Parameters:\
+Ellipsoid  Clarke 1866, a = 6378206.400 metres = 20925832.16 US survey feet\
+                                   1/f = 294.97870\
+then e = 0.08227185 and e^2 = 0.00676866\
+\
+First S","1999-04-22 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1","EPSG","","99.281",NULL};
+datafile_rows_t trf_method_row_24[] = {"9803","Lambert Conic Conformal (2SP Belgium)","","","Latitude of false origin","Longitude of false origin","Latitude of 1st standard parallel","Latitude of 2nd standard parallel","","Easting at false origin","Northing at false origin","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Since 1972 a modified form of the two standard parallel case has been used in Belgium.  For the Lambert Conic Conformal (2 SP  [...]
+Easting, E = EF + r sin (theta - alpha)","For Projected Coordinate System Belge l972 / Belge Lambert 72\
+\
+Parameters:\
+Ellipsoid  International 1924,  a = 6378388 metres\
+                                              1/f = 297\
+then e = 0.08199189 and e^2 = 0.006722670\
+\
+First Standard Parallel ","1999-04-22 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1","EPSG","","99.281",NULL};
+datafile_rows_t trf_method_row_25[] = {"9804","Mercator (1SP)","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive projected Easting and Northing coordinates are:\
+\
+E = FE + a*k0(lon - lon0)              \
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.\
+\
+The","For Projected Coordinate System Makassar / NEIEZ\
+\
+Parameters:\
+Ellipsoid   Bessel 1841  a = 6377397.155 m   1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin         00o00'00\"N  = 0.0000000 rad\
+Longitude Natural Origin    110o00'00\"E  = 1.","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2","EPSG","","",NULL};
+datafile_rows_t trf_method_row_26[] = {"9805","Mercator (2SP)","","","Latitude of 1st standard parallel","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive projected Easting and Northing coordinates are:\
+\
+For the two standard parallel case, k0 is first calculated from\
+\
+k0 = cos(latSP1)/(1 - e^2*sin^2(latSP1))^0.5 \
+ \
+where latSP1 is the absolute value of the first standard parallel","For Projected Coordinate System Pulkovo 1942 / Mercator Caspian Sea\
+\
+Parameters:\
+Ellipsoid  Krassowski 1940   a = 6378245.00m   1/f = 298.300\
+then e = 0.08181333 and e^2 = 0.00669342\
+\
+Latitude first SP                             42o00'00\"N = 0.73303","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2","EPSG","","",NULL};
+datafile_rows_t trf_method_row_27[] = {"9806","Cassini-Soldner","","","Latitude of natural origin","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive projected Easting and Northing coordinates are:\
+\
+Easting E = FE + nu[A - TA^3/6 -(8 - T + 8C)TA^5/120]\
+\
+Northing N = FN + M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 6C)A^4/24]\
+\
+where A = (lon - lon0)cos(lat)\
+T = tan^2(lat)\
+C = e2","For Projected Coordinate System Trinidad 1903 / Trinidad Grid \
+Parameters:\
+Ellipsoid   Clarke 1858     a = 20926348 ft    = 31706587.88 links\
+                                        b = 20855233 ft\
+\
+then 1/f = 294.97870 and e^2 = 0.00676866\
+\
+Latitud","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.3","EPSG","","",NULL};
+datafile_rows_t trf_method_row_28[] = {"9807","Transverse Mercator","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The formulas to derive the projected Easting and Northing coordinates are in the form of a series as follows:\
+\
+Easting, E =  FE + k0*nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'sq)A^5/120]	\
+\
+Northing, N =  FN + k0{M - M0 + nu*tan(lat)[A^2/2 + ","For Projected Coordinate System OSGB 1936 / British National Grid\
+\
+Parameters:\
+Ellipsoid  Airy 1830  a = 6377563.396 m  1/f = 299.32496\
+then e'^2 = 0.00671534 and e^2 = 0.00667054\
+\
+Latitude Natural Origin         49o00'00\"N   = 0.85521133 rad\
+Longit","1996-09-18 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.4","EPSG","","",NULL};
+datafile_rows_t trf_method_row_29[] = {"9808","Transverse Mercator (South Orientated)","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","For the mapping of southern Africa a south oriented Transverse Mercator projection is used. Here the coordinate axes are called Westings and Southings and increment to the West  [...]
+datafile_rows_t trf_method_row_30[] = {"9809","Oblique Stereographic","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The coordinate transformation from geographical to projected coordinates is executed via the distance and azimuth of the point from the centre point or origin. For a sphere the formulas are rela [...]
+\
+Parameters:\
+Ellipsoid   Bessel 1841    a = 6377397.155 m    1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin      52o09'22.178\"N  = 0.910296727 rad\
+Longitude Natural Origin     5o23'1","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.6","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_31[] = {"9810","Polar Stereographic","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","For the forward transformation from latitude and longitude,\
+\
+E = FE + rho sin(lon - lon0)\
+N = FN - rho cos(lon - lon0)\
+where\
+rho = 2 a ko t /{[((1+e)^(1+e)) ((1-e)^(1-e))]^0.5}\
+t = tan (pi/4 - lat/2) / [(1-esin(lat) ) / (1 + e sin(lat))]^(e/2)\
+\
+For","","1996-09-18 00:00:00","US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\";  J. Snyder","EPSG","","",NULL};
+datafile_rows_t trf_method_row_32[] = {"9811","New Zealand Map Grid","","","Latitude of natural origin","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","New Zealand Department of Lands technical circular 1973/32","EPSG","","",NULL};
+datafile_rows_t trf_method_row_33[] = {"9812","Hotine Oblique Mercator","","","Latitude of projection centre","Longitude of projection centre","Azimuth of initial line","Angle from Rectified to Skew Grid","Scale factor on initial line","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - e","For Projected Coordinate System  Timbalai 1948 / R.S.O. Borneo (m)\
+\
+Parameters:\
+	Ellipsoid:  Everest 1830 (1967 Definition)\
+				a = 6377298.556 metres 	1/f = 300.8017\
+				then	e = 0.081472981	e2 = 0.006637847\
+					\
+	Latitude Projection Centre	fc  	4","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5","EPSG","","97.62  99.811",NULL};
+datafile_rows_t trf_method_row_34[] = {"9813","Laborde Oblique Mercator","","","Latitude of projection centre","Longitude of projection centre","Azimuth of initial line","","Scale factor on initial line","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","\"La nouvelle projection du Service Geographique de Madagascar\"; J. Laborde; 1928","EPSG","Can be accomodated by Oblique Mercator metho [...]
+datafile_rows_t trf_method_row_35[] = {"9814","Swiss Oblique Cylindrical","","","Latitude of projection centre","Longitude of projection centre","","","","Easting at projection centre","Northing at projection centre","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1996-09-18 00:00:00","\"Die projecktionen der Schweizerischen Plan und Kartenwerke\"; J Bollinger; 1967","EPSG","Can be accomodated by Oblique Mercator method (code 9815).","97.6 [...]
+datafile_rows_t trf_method_row_36[] = {"9815","Oblique Mercator","","","Latitude of projection centre","Longitude of projection centre","Azimuth of initial line","Angle from Rectified to Skew Grid","Scale factor on initial line","Easting at projection centre","Northing at projection centre","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - e","","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_37[] = {"9816","Tunisia Mining Grid","","","Latitude of origin","Longitude of origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","This grid is used as the basis for mineral leasing in Tunsia.  Lease areas are approximately 2 x 2 km or 400 hectares.  The corners of these blocks are defined through a six figure grid reference where the first three digits are an easting in [...]
+Latitude = 36.5964 + [(598 - 360) * A].  As N > 360, A = 0.010015.\
+Latitude = 38.97997 grads = 35.08197 degrees.\
+\
+Longitude  = 7.83445 + [(E - 270) * 0.012185, where E = 302.\
+Longitude  = 8.22437 grads east of Paris = 9.73916","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.8","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_38[] = {"9817","Lambert Conic Near-Conformal","","","Latitude of natural origin","Longitude of natural origin","","","Scale factor at natural origin","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","To compute the Lambert Conic Near-Conformal the following formulae are used;\
+\
+E = FE + r sin(theta)\
+N = FN + M + r sin(theta) tan(theta/2) using the natural origin rather than the false origin.\
+\
+Compute constants for the ellipse:\
+\
+n = (a-b)/(a+b)  ","For Projected Coordinate System: Deir ez Zor / Levant Zone\
+\
+Parameters:\
+Ellipsoid  Clarke 1880 (IGN)  a = 6378249.2 m  1/f = 293.46602\
+then b = 6356515.000    n = 0.001706682563\
+\
+Latitude Natural Origin  = 34o 39'00\" N = 0.604756586 rad\
+Longitude Na","1999-11-15 00:00:00","EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1.1","EPSG","","99.811",NULL};
+datafile_rows_t trf_method_row_39[] = {"9818","American Polyconic","","","Latitude of natural origin","Longitude of natural origin","","","","False easting","False northing","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","1999-10-20 00:00:00","US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\";  J. Snyder","EPSG","","99.55",NULL};
+
+datafile_rows_t *trf_method_rows[] = {trf_method_row_1,trf_method_row_2,trf_method_row_3,trf_method_row_4,trf_method_row_5,trf_method_row_6,trf_method_row_7,trf_method_row_8,trf_method_row_9,trf_method_row_10,trf_method_row_11,trf_method_row_12,trf_method_row_13,trf_method_row_14,trf_method_row_15,trf_method_row_16,trf_method_row_17,trf_method_row_18,trf_method_row_19,trf_method_row_20,trf_method_row_21,trf_method_row_22,trf_method_row_23,trf_method_row_24,trf_method_row_25,trf_method_ro [...]
diff --git a/src/tiff/csv/trf_method.csv b/src/tiff/csv/trf_method.csv
new file mode 100644
index 0000000..7caa6af
--- /dev/null
+++ b/src/tiff/csv/trf_method.csv
@@ -0,0 +1,984 @@
+"COORD_TRF_METHOD_CODE","CTRF_METHOD_EPSG_NAME","CTRF_METHOD_USER_NAME","DESCRIPTION","PARAM_1_NAME","PARAM_2_NAME","PARAM_3_NAME","PARAM_4_NAME","PARAM_5_NAME","PARAM_6_NAME","PARAM_7_NAME","PARAM_8_NAME","PARAM_9_NAME","PARAM_10_NAME","PARAM_11_NAME","PARAM_12_NAME","PARAM_13_NAME","PARAM_14_NAME","PARAM_15_NAME","PARAM_16_NAME","PARAM_17_NAME","PARAM_18_NAME","PARAM_19_NAME","PARAM_20_NAME","PARAM_21_NAME","PARAM_22_NAME","PARAM_23_NAME","PARAM_24_NAME","PARAM_25_NAME","PARAM_26_NAME" [...]
+9601,Longitude rotation,,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,Longitude rotation,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lon2 = Lon1 + longitude_rotation.,,1999-11-12 00:00:00,,EPSG,,99.79
+9602,Geodetic/geocentric conversions,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Latitude, P, and Longitude, L, in terms of Geographic Coordinate System (GCS) A may \
+be expressed in terms of a geocentric (earth centred) cartesian coordinate system X, Y, Z \
+with the Z axis corresponding with the Polar axis positive northwards, the X axis through \
+the intersection of the Greenwich meridian and equator, and the Y axis through the \
+intersection of the equator with longitude 90 degrees E. If the GCS's prime meridian is not \
+Greewich, longitudes must first be converted to their Greenwich equivalent. If the earth's \
+spheroidal semi major axis is a, semi minor axis  b, and inverse flattening 1/f,  then\
+\
+   XA=   (nu + hA) cos P cos L\
+   YA=   (nu + hA) cos P sin L\
+   ZA=  ((1 - e^2) nu + hA) sin P\
+\
+where nu is the prime vertical radius of curvature at latitude P and is equal to \
+   nu = a /(1 - e^2*sin^2(P))^0.5,\
+   P and L are respectively the latitude and longitude (related to Greenwich) of the \
+point \
+   h is height above the ellipsoid, (topographic height plus geoidal height), and\
+   e is the eccentricity of the ellipsoid where e^2 = (a^2 -b^2)/a^2 = 2f -f^2\
+                                                                                                                                                   Cartesian coordinates in geocentric coordinate system  B may be used \
+to derive geographical coordinates in terms of geographic coordinate system B by:\
+   P   =  arctan (ZB + e^2* nu*sin P) / (XB^2 + YB^2)^0.5 by iteration\
+   L   = arctan YB/XB\
+   hB  =  XB sec L sec P  - nu\
+\
+where LB is relative to Greenwich. If the geographic system has a non Greenwich prime \
+meridian, the Greenwich value of the local prime meridian should be applied to longitude.\
+\
+(Note that h is the height above the ellipsoid. This is the height value which is \
+delivered by Transit and GPS satellite observations but is not the topographic \
+height value which is normally used for national mapping and levelling operations. \
+The topographic height is usually the height above mean sea level or an alternative \
+level reference for the country. If one starts with a topographic height,  it will be \
+necessary to convert it to an ellipsoid height before using the above transformation \
+formulas. h = N + H, where N is the geoid height above the ellipsoid at the point \
+and is sometimes negative, and H is the height of the point above the geoid. The \
+height above the geoid is often taken to be that above mean sea level, perhaps with \
+a constant correction applied. Geoid heights of points above the nationally used \
+ellipsoid may not be readily available. For the WGS84 ellipsoid the value of N, \
+representing the height of the geoid relative to the ellipsoid, can vary between \
+values of -100m in the Sri Lanka area to +60m in the North Atlantic.)","Consider a North Sea point with coordinates derived by GPS satellite in the WGS84 geographical coordinate system with coordinates of:\
+\
+           latitude    53 deg 48 min 33.82 sec N, \
+           longitude 02 deg 07 min 46.38 sec E, \
+    and ellipsoidal height 73.0m, \
+\
+whose coordinates are required in terms of the ED50 geographical coordinate system which takes the International 1924 ellipsoid. The three parameter datum shift from WGS84 to ED50 for this North Sea area is given as dX = +84.87m, dY = +96.49m, dZ = +116.95m. \
+\
+The WGS84 geographical coordinates convert to the following geocentric values using the above formulas for X, Y, Z:\
+\
+   XA = 3771 793.97m\
+   YA =   140 253.34m\
+   ZA = 5124 304.35m\
+\
+Applying the quoted datum shifts to these, we obtain new geocentric values now related to ED50:\
+\
+   XB = 3771 878.84m\
+   YB =   140 349.83m\
+   ZB = 5124 421.30m\
+\
+These convert to ED50 values on the International 1924 ellipsoid as:\
+           latitude    53 deg 48 min 36.565 sec N, \
+           longitude 02 deg 07 min 51.477 sec E, \
+    and ellipsoidal height 28.02 m, \
+\
+Note that the derived height is referred to the International 1924 ellipsoidal surface and will need a further correction for the height of the geoid at this point in order to relate it to Mean Sea Level.",1996-09-18 00:00:00,"\"Transformation from spatial to geographical coordinates\"; B. R. Bowring; Survey Review number 181; July 1976.",EPSG,,97.29
+9603,Geocentric translations,,,X-axis translation,Y-axis translation,Z-axis translation,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"If  we may assume that the minor axes of the ellipsoids are parallel, then shifts dX, dY, dZ \
+in the sense from datum A to datum B may then be applied as\
+\
+   XB = XA + dX \
+   YB = YA + dY\
+   ZB = ZA + dZ","Given a three parameter datum shift from WGS84 to ED50 for this North Sea area is given as \
+dX = +84.87m, dY = +96.49m, dZ = +116.95m. \
+\
+The WGS84 geographical coordinates convert to the following GS84 geocentric values using \
+the above formulas for X, Y, Z:\
+\
+   XA = 3771 793.97m\
+   YA =   140 253.34m\
+   ZA = 5124 304.35m\
+\
+Applying the given datum shifts to these, we obtain new geocentric values now related \
+to ED50:\
+\
+   XB = 3771 878.84m\
+   YB =   140 349.83m\
+   ZB = 5124 421.30m",1996-09-18 00:00:00,POSC Epicentre 2.2.1,EPSG,,
+9604,Molodenski,,,X-axis translation,Y-axis translation,Z-axis translation,Semi-major axis length difference,Flattening difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9605,Abridged Molodenski,,,X-axis translation,Y-axis translation,Z-axis translation,Semi-major axis length difference,Flattening difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"As an alternative to the computation of the new latitude, longitude and height above ellipsoid in discrete steps through geocentric coordinates, the changes in these coordinates may be derived directly by formulas derived by Molodenski. Abridged versions of these formulas, which are quite satisfactory for three parame [...]
+\
+Dlat \" = [(-dX*sin(lat)*cos(lon)) - (dY*sin(lat)*sin(lon)) + (dZ*cos(lat)) + (((a*Df) + (f*Da))*sin(2*lat))] / (rho * sin(1\"))\
+\
+Dlon \" = (-dX*sin(lon) + dY*cos(lon)) / ((nu*cos(lat)) * sin(1\"))\
+\
+Dh = (dX*cos(lat)*cos(lon)) + (dY*cos(lat)*sin(lon)) + (dZ*sin(lat)) + ((a*Df + f*Da)*(sin(lat)^2)) - Da\
+\
+where the dX, dY and dZ terms are as before, and rho and nu are the meridian and prime vertical radii of curvature at the given latitude (lat) on the first ellipsoid (see section 1.4), Da is the difference in the semi-major axes (a1 - a2) of the first and second ellipsoids and Df  is the difference in the flattening of the two ellipsoids.\
+\
+The formulas for Dlat and Dlon indicate changes in latitude and longitude in arc-seconds.",,1999-04-22 00:00:00,,EPSG,,99.01
+9606,Position Vector 7-param. transformation,,,X-axis translation,Y-axis translation,Z-axis translation,X-axis rotation,Y-axis rotation,Z-axis rotation,Scale difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Transformation of coordinates from one geographic coordinate system into another (also known as a \"datum transformation\") is usually carried out as an implicit concatenation of three transformations:\
+[geographical to geocentric >> geocentric to geocentric >> geocentric to geographic]\
+\
+The middle part of the concatenated transformation, from geocentric to geocentric, is usually described as a simplified 7-parameter Helmert transformation, expressed in matrix form with 7 parameters, in what is known as the \"Bursa-Wolf\" formula:\
+\
+   (X�)             (  1       -Rz    +Ry)      (X)     (dX)\
+   (Y�)  =  M * ( +Rz     1      -Rx)  *  (Y)  + (dY)\
+   (Z�)              ( -Ry   +Rx       1 )      (Z)      (dZ)\
+\
+The parameters are commonly referred to defining the datum transformation \"from Datum 'A' to Datum 'B'\", whereby (X, Y, Z) are the geocentric coordinates of the point on Datum �A� and (X�, Y�, Z�) are the geocentric coordinates of the point on Datum �B�.  However, that does not define the parameters uniquely; neither is the definition of the parameters implied in the formula, as is often believed.  However, the following definition, which is consistent witth the \"Position Vector Trans [...]
+\
+(dX, dY, dZ)   :Translation vector, to be added to the point's position vector in coordinate system 'A' in order to transform from system 'A' to system 'B'; also: the coordinates of the origin of system 'A' in the 'B' frame.\
+\
+(Rx, Ry, Rz)   :Rotations to be applied to the point's vector.  The sign convention is such that a positive rotation about an axis is defined as a clockwise rotation of the position vector when viewed from the origin of the Cartesian coordinate system in the positive direction of that axis. E.g. a positive rotation about the Z-axis only from system 'A' to system 'B' will result in a larger longitude value for the point in system 'B'.\
+\
+M                  :	The scale correction to be made to the position vector in coordinate system 'A' in order to obtain the correct scale of coordinate system 'B'. M = (1+S*10 6), whereby S is the scale correction expressed in parts per million.  \
+\
+<<<<<This text continues in the description of the Coordinate Frame Rotation formula>>>>>","Input point: \
+Coordinate system: WGS72 (geographic 3D)\
+  Latitude =   55 deg 00 min 00 sec \
+  Longitude =  4 deg 00 min 00 sec \
+  Ellipsoidal height =  0 m\
+This transforms to cartesian geocentric coords:\
+    X = 3 657 660.66 (m)  \
+    Y =    255 768.55 (m)\
+    Z = 5 201 382.11 (m)\
+\
+Transformation parameters WGS72 to WGS84:\
+   dX (m) = 0.000 \
+   dY (m) = 0.000 \
+   dZ (m) = +4.5\
+   RX (\") = 0.000 \
+   RY (\") = 0.000\
+   RZ (\") = +0.554\
+   Scale (ppm) = +0.219\
+\
+Application of the 7 parameter Position Vector Transformation results in WGS 84 coordinates of:\
+   X = 3 657 660.78 (m)\
+   Y =    255 778.43 (m)\
+   Z = 5 201 387.75 (m)\
+This converts into:\
+   Latitude =   55 deg 00 min 00.090 sec\
+   Longitude =  4 deg 00 min 00.554 sec\
+   Ellipsoidal height =  +3.22 m",1996-09-18 00:00:00,,EPSG,,98.16
+9607,Coordinate Frame rotation,,,X-axis translation,Y-axis translation,Z-axis translation,X-axis rotation,Y-axis rotation,Z-axis rotation,Scale difference,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"<<<<<This text is continued from the description of the Position Vector Transformation formula>>>>>\
+\
+Although being common practice in particularly the European E&P industry Position Vector Transformation sign convention is not universally accepted.  A variation on this formula is also used, particularly in the USA E&P industry.  That formula is based on the same definition of translation and scale parameters, but a different definition of the rotation parameters.  The associated convention is known as the \"Coordinate Frame Rotation\" convention. \
+The formula is:\
+\
+   (X�)             (  1      +Rz      -Ry)    (X)      (dX)\
+   (Y�)  =  M * ( -Rz      1      +Rx) * (Y)  +  (dY)\
+   (Z�)              ( +Ry   -Rx        1 )    (Z)       (dZ)\
+\
+and the parameters are defined as:\
+\
+(dX, dY, dZ)   : Translation vector, to be added to the point's position vector in coordinate system 'A' in order to transform from system 'A' to system 'B'; also: the coordinates of the origin of system 'A' in the 'B' frame.\
+\
+(Rx, Ry, Rz)   : Rotations to be applied to the coordinate frame.  The sign convention is such that a positive rotation of the frame about an axis is defined as a clockwise rotation of the coordinate frame when viewed from the origin of the Cartesian coordinate system in the positive direction of that axis, that is a positive rotation about the Z-axis only from system 'A' to system 'B' will result in a smaller longitude value for the point in system 'B'.\
+\
+M                  : The scale factor to be applied to the position vector in coordinate system 'A' in order to obtain the correct scale of coordinate system 'B'. M = (1+S*10 6), whereby S is the scale correction expressed in parts per million.\
+\
+In the absence of rotations the two formulas are identical; the difference is solely in the rotations. The name of the second method reflects this.\
+\
+Note that the same rotation that is defined as positive in the first method is consequently negative in the second and vice versa.  It is therefore crucial that the convention underlying the definition of the rotation parameters is clearly understood and is communicated when exchanging datum transformation parameters, so that the parameters may be associated with the correct coordinate transformation method (algorithm).","The same example as for the Position Vector Transformation can be  [...]
+\
+Transformation parameters Coordinate Frame Rotation convention:\
+dX (m) = 0.000 \
+dY (m) = 0.000 \
+dZ (m) = +4.5 \
+RX (\") = 0.000\
+RY (\") = 0.000\
+RZ (\") = -0.554\
+Scale (ppm) = +0.219\
+\
+Please note that only the rotation has changed sign as compared to the Position Vector Transformation.",1996-09-18 00:00:00,,EPSG,,
+9608,Similarity transform,,,A1,A2 * m,A3 * n,B1,B2 * m,B3 * n,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9609,2-dimensional Affine transformation,,,A1,A2 * m,A3 * n,B1,B2 * m,B3 * n,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9610,2nd-order Polynomial function,,,Ordinate 1 of source evaluation point,Ordinate 2 of source evaluation point,Ordinate 1 of target evaluation point,Ordinate 2 of target evaluation point,A1,A2 * m,A3 * n,A4 * mm,A5 * mn,A6 * nn,B1,B2 * m,B3 * n,B4 * mm,B5 * mn,B6 * nn,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9611,3rd-order Polynomial function,,,Ordinate 1 of source evaluation point,Ordinate 2 of source evaluation point,Ordinate 1 of target evaluation point,Ordinate 2 of target evaluation point,A1,A2 * m,A3 * n,A4 * mm,A5 * mn,A6 * nn,A7 * mmm,A8 * mmn,A9 * mnn,A10 * nnn,B1,B2 * m,B3 * n,B4 * mm,B5 * mn,B6 * nn,B7 * mmm,B8 * mmn,B9 * mnn,B10 * nnn,,,,,,,,,,,,,,,,1996-09-18 00:00:00,,EPSG,,
+9612,4th-order Polynomial function,,,Ordinate 1 of source evaluation point,Ordinate 2 of source evaluation point,Ordinate 1 of target evaluation point,Ordinate 2 of target evaluation point,A1,A2 * m,A3 * n,A4 * mm,A5 * mn,A6 * nn,A7 * mmm,A8 * mmn,A9 * mnn,A10 * nnn,A11 * mmmm,A12 * mmmn,A13 * mmnn,A14 * mnnn,A15 * nnnn,B1,B2 * m,B3 * n,B4 * mm,B5 * mn,B6 * nn,B7 * mmm,B8 * mmn,B9 * mnn,B10 * nnn,B11 * mmmm,B12 * mmmn,B13 * mmnn,B14 * mnnn,B15 * nnnn,,,,"For TRF_POLYNOMIAL 1000, m=Latitu [...]
+9613,NADCON,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Used specifically for some NAD27<->NAD83 transformations in USA.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Latitude difference gridded binary file,Longitude difference gridded binary file,,,,1996-09-18 00:00:00,US Coast and geodetic Survey - http://www.ngs.noaa.gov,EPSG,Input expects longitudes to be positive west.,
+9614,NTv1,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Used specifically for some NAD27<->NAD83 transformations in Canada.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Latitude and longitude difference file,,,,,1997-11-13 00:00:00,Geomatics Canada - Geodetic Survey Division.,EPSG,Superceded in 1997 by NTv2 (transformation method code 9615).   Input expects longitudes to be positive west.,
+9615,NTv2,,Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Latitude and longitude difference file,,,,,1997-11-13 00:00:00,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,Supercedes  NTv1 (transformation method code 9614).  Input expects longitudes to be positive west.,
+9616,Vertical Offset,,This transformation allows calculation of ordinate in the target system by adding the parameter value to the ordinate value of the point in the source system.,Vertical offset,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,V2 = [(V1 * U1) + (O12 * Uoff)] * (m / U2) where V2 = value in second vertical coordinate system; V1 = value in first system; O12 is the value of the the origin of system 2 in system 1; m is unit direction multiplier (m=1 if both systems are height or both ar [...]
+9617,Madrid to ED50,,,,,,,A,B,C,D,E,F,G,H,J,,,,,,,,,,,,,,,,,,,,,,,,,"The original geographic coordinate system for the Spanish mainland was based on Madrid 1870 datum, Struve 1860 ellipsoid, with longitudes related to the Madrid meridian.  Three polynomial expressions have been empirically derived by El Servicio Geogr�fico del Ej�rcito to convert geographical coordinates based on this system to equivalent values based on the European Datum of 1950 (ED50).  The polynomial coefficients der [...]
+\
+The polynomial expressions transformations are:\
+\
+      dLat seconds = A + (B*lon) + (C*lat) + (D*h)\
+      dLon seconds =  (E+F) + (G*lon) + (H*lat) + (J*h)\
+\
+where latitude lat and longitude lon are in decimal degrees referred to the Madrid 1870 (Madrid) geographic coordinate system and h in metres.  E is the longitude (in seconds) of the Madrid meridian measured from the Greenwich meridian; it is the value to be applied to a longitude relative to the Madrid meridian to transform it to a longitude relative to the Greenwich meridan.\
+\
+The results of these expressions are applied through the formulae:\
+Lat(ED50) = Lat(M1870(M))  + dLat\
+and Lon(ED50) = Lon(M1870(M))  + dLon.","Input point coordinate system: Madrid 1870 (Madrid) (geographic 3D)\
+   Latitude    =  42 deg 38 min 52.77 sec N = 42.647992 degrees\
+   Longitude  =    3 deg 39 min 34.57 sec E of Madrid	\
+                         = +3.659603 degrees from the Madrid meridian.\
+   Height =  0 m\
+\
+For the north zone transformation:\
+A = 11.3287790\
+B = -0.0385200\
+C = -0.1674000\
+D = 0.0000379\
+E = -13276.58\
+F = 2.5079425\
+G = -0.0086400\
+H = 0.835200\
+J = -0.0000038\
+\
+dLat = +4.05 seconds\
+\
+Then ED50 latitude = 42 deg 38 min 52.77 sec N + 4.05sec\
+= 42 deg 38 min 56.82 sec N\
+\
+\
+dLon = -13270.54 seconds  = -3 deg 41 min 10.54 sec\
+\
+Then ED50 longitude = 3 deg 39 min 34.57 sec E - 3 deg 41 min 10.54 sec\
+= 0 deg 01 min 35.97 sec W of Greenwich.",1999-11-15 00:00:00,Institut de Geomatica; Barcelona,EPSG,,99.284  99.82
+9618,Geographical and Height Offsets,,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,Latitude offset,Longitude offset,Gravity-related to ellipsoid height,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lat2 = Lat1 + latitude_offset;  Lon2 = Lon1 + longitude_offset; EllipsoidHeight2 = GravityHeight1 + gravity-related_to_ellipsoid_height.,,1999-11-12 00:00:00,,EPSG,,99.79
+9619,Geographical Offsets,,This transformation allows calculation of coordinates in the target system by adding the parameter value to the coordinate values of the point in the source system.,Latitude offset,Longitude offset,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,Lat2 = Lat1 + latitude_offset;  Lon2 = Lon1 + longitude_offset.,,1999-11-12 00:00:00,,EPSG,,99.79
+9620,Norway Offshore Interpolation,,,,,,,,Geod. tfm. code for northern boundary,Geod. tfm. code for southern boundary,,,,,,,,,,,,,,,,,,,,,,,,,,,,Geod. tfm. name for northern boundary,Geod. tfm. name for southern boundary,,,,1999-04-22 00:00:00,"Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\".",EPSG,,
+9801,Lambert Conic Conformal (1SP),,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:\
+\
+E = FE + r sin(theta)\
+N = FN + r0 - r cos(theta)\
+where\
+n = sin lat0\
+r = a F t^n k0     for r0, and r\
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5     for m0, lat0, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.\
+t  = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2)   for t0 and t using lat0 and lat respectively.\
+F = m0/(n  t1^n)\
+theta = n(lon - lon0)\
+\
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:\
+\
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}\
+lon = theta'/n +lon0\
+where\
+theta' = arctan[(E - FE)/{r0 -(N - FN)}]\
+r' = +/-[(E - FE)^2 + {r0 - (N - FN)}^2]^0.5\
+t' = (r'/a k0 F)^(1/n)\
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System JAD69 / Jamaica National Grid\
+\
+Parameters:\
+Ellipsoid:  Clarke 1866, a = 6378206.400 m., 1/f = 294.97870\
+                                   then  e = 0.08227185 and e^2 = 0.00676866\
+\
+Latitude Natural Origin         18 deg 00 min 00 sec N  =  0.31415927 rad\
+Longitude Natural Origin     77 deg 00 min 00 sec W = -1.34390352 rad\
+Scale factor at origin            1.000000\
+False Eastings  FE               250000.00 m\
+False Northings FN              150000.00 m\
+\
+Forward calculation for: \
+Latitude:     17 deg 55 min 55.80 sec N  =  0.31297535 rad\
+Longitude:  76 deg 56 min 37.26 sec W = -1.34292061 rad\
+first gives\
+m0    =  0.95136402        t0 =  0.72806411\
+F       =  3.39591092        n  =  0.30901699\
+r        =  19643955.26     r0  =  19636447.86\
+theta =  0.00030374        t   =  0.728965259\
+\
+Then Easting E   =     255966.58 m\
+         Northing N =      142493.51 m\
+\
+Reverse calculation for the same easting and northing first gives\
+\
+theta' =  0.000303736\
+t'        =  0.728965259\
+m0     =  0.95136402\
+r'        =  19643955.26\
+\
+Then Latitude     = 17 deg 55 min 55.800 sec N\
+         Longitude  = 76 deg 56 min 37.260 sec W",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1",EPSG,,
+9802,Lambert Conic Conformal (2SP),,,Latitude of false origin,Longitude of false origin,Latitude of 1st standard parallel,Latitude of 2nd standard parallel,,Easting at false origin,Northing at false origin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"To derive the projected Easting and Northing coordinates of a point with geographical coordinates (lat,lon) the formulas for the one standard parallel case are:\
+\
+E = EF + r sin(theta)\
+N = NF + rF - r cos(theta)\
+where\
+m = cos(lat)/(1 - e^2 sin^2(lat))^0.5     for m1, lat1, and m2, lat2 where lat1 and lat2 are the latitudes of the standard parallels.\
+t  = tan(pi/4 - lat/2)/[(1 - e sin(lat))/(1 + e sin(lat))]^(e/2)   for t1, t2, tF and t using lat1, lat2, latF and lat respectively.\
+n = (loge(m1) - loge(m2))/(loge(t1) - loge(t2))\
+F = m1/(n  t1^n)\
+r =  a F t^n         for rF and r, where rF is the radius of the parallel of latitude of the false origin.\
+theta = n(lon - lon0)\
+\
+The reverse formulas to derive the latitude and longitude of a point from its Easting and Northing values are:\
+\
+lat = pi/2 - 2arctan{t'[(1 - esin(lat))/(1 + esin(lat))]^(e/2)}\
+lon = theta'/n +lon0\
+where\
+r' = +/-[(E - EF)^2 + {rF - (N - NF)}^2]^0.5 , taking the sign of n\
+t' = (r'/aF)^(1/n)\
+theta' = arctan [(E- EF)/(rF - (N- NF))]\
+and n, F, and rF are derived as for the forward calculation.","For Projected Coordinate System NAD27 / Texas South Central\
+\
+Parameters:\
+Ellipsoid  Clarke 1866, a = 6378206.400 metres = 20925832.16 US survey feet\
+                                   1/f = 294.97870\
+then e = 0.08227185 and e^2 = 0.00676866\
+\
+First Standard Parallel          28o23'00\"N  =   0.49538262 rad\
+Second Standard Parallel    30o17'00\"N  =   0.52854388 rad\
+Latitude False Origin            27o50'00\"N  =   0.48578331 rad\
+Longitude False Origin         99o00'00\"W = -1.72787596 rad\
+Easting at false origin           2000000.00  US survey feet\
+Northing at false origin          0.00  US survey feet\
+\
+Forward calculation for: \
+Latitude       28o30'00.00\"N  =  0.49741884 rad\
+Longitude    96o00'00.00\"W = -1.67551608 rad\
+\
+first gives :\
+m1    = 0.88046050      m2 = 0.86428642\
+t        = 0.59686306      tF  = 0.60475101\
+t1      = 0.59823957      t2 = 0.57602212\
+n       = 0.48991263       F = 2.31154807\
+r        = 37565039.86    rF = 37807441.20\
+theta = 0.02565177\
+\
+Then Easting E =      2963503.91 US survey feet\
+         Northing N =      254759.80 US survey feet\
+\
+Reverse calculation for same easting and northing first gives:\
+theta' = 0.025651765     r' = 37565039.86\
+t'        = 0.59686306\
+\
+Then Latitude     	= 28o30'00.000\"N\
+         Longitude   = 96o00'00.000\"W",1999-04-22 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1",EPSG,,99.281
+9803,Lambert Conic Conformal (2SP Belgium),,,Latitude of false origin,Longitude of false origin,Latitude of 1st standard parallel,Latitude of 2nd standard parallel,,Easting at false origin,Northing at false origin,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"Since 1972 a modified form of the two standard parallel case has been used in Belgium.  For the Lambert Conic Conformal (2 SP Belgium), the formulas for the standard two standard parallel case are used except for: \
+Easting, E = EF + r sin (theta - alpha)\
+Northing, N = NF + rF - r cos (theta - alpha)\
+and for the reverse formulas\
+lon = ((theta' + alpha)/n) +lon0\
+where alpha = 29.2985 seconds.","For Projected Coordinate System Belge l972 / Belge Lambert 72\
+\
+Parameters:\
+Ellipsoid  International 1924,  a = 6378388 metres\
+                                              1/f = 297\
+then e = 0.08199189 and e^2 = 0.006722670\
+\
+First Standard Parallel        49o50'00\"N       =   0.86975574 rad\
+Second Standard Parallel  51o10'00\"N       =   0.89302680 rad\
+Latitude False Origin          90o00'00\"N       =   1.57079633 rad\
+Longitude False Origin         4o21'24.983\"E = 0.07604294 rad\
+Easting at false origin EF        150000.01  metres\
+Northing at false origin NF    5400088.44  metres\
+\
+Forward calculation for: \
+Latitude        50o40'46.461\"N  =  0.88452540 rad\
+Longitude       5o48'26.533\"E   = 0.10135773 rad\
+\
+first gives :\
+m1     = 0.64628304         m2 = 0.62834001\
+t        = 0.59686306          tF  = 0.00000000\
+t1      = 0.36750382           t2 = 0.35433583\
+n       = 0.77164219            F = 1.81329763\
+r        = 37565039.86         rF = 0.00\
+alpha =	0.00014204     theta = 0.01953396\
+\
+Then Easting E  =      251763.20 metres\
+         Northing N =      153034.13 metres\
+\
+Reverse calculation for same easting and northing first gives:\
+theta' = 0.01939192      r' = 548041.03\
+t' = 0.35913403\
+Then Latitude   =    50o40'46.461\"N\
+         Longitude =     5o48'26.533\"E",1999-04-22 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1",EPSG,,99.281
+9804,Mercator (1SP),,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive projected Easting and Northing coordinates are:\
+\
+E = FE + a*k0(lon - lon0)              \
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.\
+\
+The reverse formulas to derive latitude and longitude from E and N values are:\
+\
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi) \
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)\
++ (7e^6/120 +  81e^8/1120) sin(6chi)  + (4279e^8/161280) sin(8chi)\
+\
+where chi = pi/2 - 2 arctan t\
+t = B^((FN-N)/a*k0) \
+B = base of the natural logarithm, 2.7182818...\
+and  for the 2 SP Case, k0 is calculated as for the forward transformation above.\
+lon  =  ((E - FE)/a*k0)  + lon0","For Projected Coordinate System Makassar / NEIEZ\
+\
+Parameters:\
+Ellipsoid   Bessel 1841  a = 6377397.155 m   1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin         00o00'00\"N  = 0.0000000 rad\
+Longitude Natural Origin    110o00'00\"E  = 1.91986218 rad\
+Scale factor ko                  0.997\
+False Eastings FE              3900000.00 m\
+False Northings FN              900000.00 m\
+\
+Forward calculation for: \
+Latitude            3o00'00.00\"S   = -0.05235988 rad\
+Longitude     120o00'00.00\"E   =  2.09439510 rad\
+gives\
+Easting  E   =      5009726.58 m\
+Northing N  =        569150.82 m\
+\
+Reverse calculation for same easting and northing first gives :\
+t    = 1.0534121\
+chi = -0.0520110\
+\
+Then Latitude     =   3o00'00.000\"S\
+         Longitude  = 120o00'00.000\"E",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2",EPSG,,
+9805,Mercator (2SP),,,Latitude of 1st standard parallel,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive projected Easting and Northing coordinates are:\
+\
+For the two standard parallel case, k0 is first calculated from\
+\
+k0 = cos(latSP1)/(1 - e^2*sin^2(latSP1))^0.5 \
+ \
+where latSP1 is the absolute value of the first standard parallel (i.e. positive).  \
+\
+Then, for both one and two standard parallel cases, \
+\
+E = FE + a*k0(lon - lon0)              \
+N = FN + a*k0* ln{tan(pi/4 + lat/2)[(1 - esin(lat))(1 + esin(lat))]^e/2} where symbols are as listed above and logarithms are natural.\
+\
+The reverse formulas to derive latitude and longitude from E and N values are:\
+\
+lat = chi + (esq/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2chi) \
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4chi)\
++ (7e^6/120 +  81e^8/1120) sin(6chi)  + (4279e^8/161280) sin(8chi)\
+\
+where chi = pi/2 - 2 arctan t\
+t = B^((FN-N)/a*k0) \
+B = base of the natural logarithm, 2.7182818...\
+and  for the 2 SP Case, k0 is calculated as for the forward transformation above.\
+lon  =  ((E - FE)/a*k0)  + lon0","For Projected Coordinate System Pulkovo 1942 / Mercator Caspian Sea\
+\
+Parameters:\
+Ellipsoid  Krassowski 1940   a = 6378245.00m   1/f = 298.300\
+then e = 0.08181333 and e^2 = 0.00669342\
+\
+Latitude first SP                             42o00'00\"N = 0.73303829 rad\
+Longitude Natural Origin                51o00'00\"E = 0.89011792 rad\
+False Eastings FE                          0.00 m\
+False Northings (at equator) FN     0.00 m\
+  \
+then natural origin at latitude of 0oN has scale factor k0=  0.74426089\
+\
+Forward calculation for: \
+Latitude        53o00'00.00\"N = 0.9250245 rad\
+Longitude     53o00'00.00\"E  = 0.9250245 rad\
+\
+gives Easting E   =     165704.29 m \
+          Northing N =   5171848.07 m\
+\
+Reverse calculation for same easting and northing first gives :\
+t = 0.33639129    chi = 0.92179596\
+\
+Then Latitude     =  53o00'00.000\"N\
+          Longitude  =  53o00'00.000\"E",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.2",EPSG,,
+9806,Cassini-Soldner,,,Latitude of natural origin,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive projected Easting and Northing coordinates are:\
+\
+Easting E = FE + nu[A - TA^3/6 -(8 - T + 8C)TA^5/120]\
+\
+Northing N = FN + M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 6C)A^4/24]\
+\
+where A = (lon - lon0)cos(lat)\
+T = tan^2(lat)\
+C = e2 cos2*/(1 - e2)        nu = a /(1 - esq*sin^2(lat))^0.5 \
+and M, the distance along the meridian from equator to latitude lat, is given by\
+M = a[1 - e^2/4 - 3e^4/64 - 5e^6/256 -....)*lat - (3e^2/8 + 3e^4/32 + 45e^6/1024 +....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]\
+with lat in radians.\
+\
+M0 is the value of M calculated for the latitude of the chosen origin. This may not necessarily be chosen as the equator.\
+\
+To compute latitude and longitude from Easting and Northing the reverse formulas are:\
+lat = lat1 - (nu1tan(lat1)/rho1)[D2/2 - (1 + 3*T1)D^4/24]\
+lon =  lon0 + [D - T1*D^3/3 + (1 + 3*T1)T1*D^5/15]/cos(lat1)\
+\
+where lat1 is the latitude of the point on the central meridian which has the same Northing as the point whose coordinates are sought, and is found from:\
+lat1 = mu1 + (3*e1/2 - 27*e1^3/32 +.....)sin(2*mu1) + (21*e1^2/16 - 55*e1^4/32 + ....)sin(4*mu1)+ (151*e1^3/96 +.....)sin(6*mu1) + (1097*e1^4/512 - ....)sin(8*mu1) + ......\
+where\
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]\
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]\
+M1 = M0 + (N - FN)\
+T1 = tan^2(lat1)\
+D = (E - FE)/nu1","For Projected Coordinate System Trinidad 1903 / Trinidad Grid \
+Parameters:\
+Ellipsoid   Clarke 1858     a = 20926348 ft    = 31706587.88 links\
+                                        b = 20855233 ft\
+\
+then 1/f = 294.97870 and e^2 = 0.00676866\
+\
+Latitude Natural Origin       10o26'30\"N  =  0.182241463 rad\
+Longitude Natural Origin    61o20'00\"W = -1.07046861 rad\
+False Eastings FE              430000.00 links\
+False Northings FN            325000.00 links\
+\
+Forward calculation for: \
+Latitude       10o00'00.00\" N = 0.17453293 rad\
+Longitude    62o00'00.00\"W = -1.08210414 rad\
+\
+A = -0.01145876      C = 0.00662550\
+T = 0.03109120      M = 5496860.24    nu = 31709831.92     M0 = 5739691.12\
+\
+Then Easting E    =  66644.94 links\
+          Northing N =  82536.22 links\
+\
+Reverse calculation for same easting and northing first gives :\
+e1    =   0.00170207       D  =     -0.01145875\
+T1   = 0.03109544         M1 =      5497227.34\
+nu1  = 31709832.34       mu1 =    0.17367306\
+phi1 = 0.17454458         rho1 =    31501122.40\
+\
+\
+Then Latitude     = 10o00'00.000\"N\
+         Longitude  =  62o00'00.000\"W",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.3",EPSG,,
+9807,Transverse Mercator,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The formulas to derive the projected Easting and Northing coordinates are in the form of a series as follows:\
+\
+Easting, E =  FE + k0*nu[A + (1 - T + C)A^3/6 + (5 - 18T + T^2 + 72C - 58e'sq)A^5/120]	\
+\
+Northing, N =  FN + k0{M - M0 + nu*tan(lat)[A^2/2 + (5 - T + 9C + 4C^2)A^4/24 + (61 - 58T + T^2 + 600C - 330e'sq)A^6/720]} \
+where T = tan^2(lat)                nu = a /(1 - esq*sin^2(lat))^0.5\
+C = esq*cos^2(lat)/(1 - esq)\
+A = (lon - lon0)cos(lat), with lon and lon0 in radians.\
+M = a[(1 - esq/4 - 3e^4/64 - 5e^6/256 -....)lat - (3esq/8 + 3e^4/32 + 45e^6/1024+....)sin(2*lat) + (15e^4/256 + 45e^6/1024 +.....)sin(4*lat) - (35e^6/3072 + ....)sin(6*lat) + .....]\
+with lat in radians and M0 for lat0, the latitude of the origin, derived in the same way.\
+\
+The reverse formulas to convert Easting and Northing projected coordinates to latitude and longitude are:\
+\
+lat = lat1 - (nu1*tan(lat1)/rho1)[D^2/2 - (5 + 3*T1 + 10*C1 - 4*C1^2 - 9*e'^2)D^4/24 + (61 + 90*T1 + 298*C1 + 45*T1^2 - 252*e'^2 - 3*C1^2)D^6/720]\
+lon = lon0 + [D - (1 + 2*T1 + C1)D^3/6 + (5 - 2*C1 + 28*T1 - 3*C1^2 + 8*e'^2 + 24*T1^2)D^5/120] / cos(lat1)\
+where lat1 may be found as for the Cassini projection from:\
+\
+lat1 = mu1 + ((3*e1)/2 - 27*e1^3/32 +.....)sin(2*lat1) + (21*e1^2/16 -55*e1^4/32 + ....)sin(4*lat1)+ (151*e1^3/96 +.....)sin(6*lat1) + (1097*e1^4/512 - ....)sin(8*lat1) + ......\
+and where  nu1 = a /(1 - esq*sin^2(lat1))^0.5                                     rho1 = a(1 - esq)/(1 - esq*sin^2(lat1))^1.5\
+e1 = [1- (1 - esq)^0.5]/[1 + (1 - esq)^0.5]\
+mu1 = M1/[a(1 - esq/4 - 3e^4/64 - 5e^6/256 - ....)]\
+M1 = M0 + (N - FN)/k0\
+T1 = tan^2(lat1)\
+C1 = e'^2*cos^2(lat1)\
+D = (E - FE)/(nu1*k0), with nu1 = nu for lat1\
+\
+For areas south of the equator the value of latitude lat will be negative and the formulas above, to compute the E and N,  will automatically result in the correct values. Note that the false northings of the origin, if the equator, will need to be large to avoid negative northings and for the UTM projection is in fact 10,000,000m. Alternatively, as in the case of Argentina's Transverse Mercator (Gauss-Kruger) zones, the origin is at the south pole with a northings of zero. However each  [...]
+different zones having the same eastings, every point in the country, irrespective of its projection zone, will have a unique set of projected system coordinates. Strict application of the above formulas, with south latitudes negative, will result in the derivation of the correct Eastings and Northings. \
+\
+Similarly, in applying the reverse formulas to determine a latitude south of the equator, a negative sign for lat results from a negative lat1 which in turn results from a negative M1.","For Projected Coordinate System OSGB 1936 / British National Grid\
+\
+Parameters:\
+Ellipsoid  Airy 1830  a = 6377563.396 m  1/f = 299.32496\
+then e'^2 = 0.00671534 and e^2 = 0.00667054\
+\
+Latitude Natural Origin         49o00'00\"N   = 0.85521133 rad\
+Longitude Natural Origin        2o00'00\"W  = -0.03490659 rad\
+Scale factor ko                     0.9996013                                                                                              False Eastings FE                 400000.00 m\
+False Northings FN              -100000.00 m\
+\
+Forward calculation for: \
+Latitude       50o30'00.00\"N  = 0.88139127 rad\
+Longitude    00o30'00.00\"E  = 0.00872665 rad\
+A  = 0.02775415       C = 0.00271699\
+T =  1.47160434       M = 5596050.46\
+M0 = 5429228.60     nu  = 6390266.03\
+\
+Then Easting E =        577274.99 m\
+          Northing N =       69740.50 m\
+\
+Reverse calculations for same easting and northing first gives :\
+e1 =    0.00167322      mu1 = 0.87939562\
+M1 = 5599036.80        nu1 = 6390275.88\
+phi1  = 0.88185987      D = 0.02775243\
+rho1 =6372980.21       C1 =  0.00271391\
+T1 = 1.47441726\
+\
+Then Latitude       = 50o30'00.000\"N\
+         Longitude    = 00o30'00.000\"E",1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.4",EPSG,,
+9808,Transverse Mercator (South Orientated),,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"For the mapping of southern Africa a south oriented Transverse Mercator projection is used. Here the coordinate axes are called Westings and Southings and increment to the West and South from the origin respectively.  The Transverse Mercator formulas need to \
+be modified to cope with this arrangement with\
+\
+Westing, W = k0 nu[A + (1 - T + C)A^3/6 + (5 - 18*T + T^2 + 72*C - 58*e'^2)A^5/120] - FE\
+\
+Southing, S = k0{M - M0 + nu*tan(lat)*[A^2/2 + (5 - T + 9*C + 4*C^2)A^4/24 + (61 - 58*T + T^2 + 600*C - 330*e'^2)A^6/720]}- FN\
+\
+In these formulas the terms FE and FN have been retained for consistency of the terminology.  For the reverse formulas, those for the standard Transverse Mercator above apply, with the exception that:\
+\
+M1 = M0 + (S + FN)/k0\
+and D = (W + FE)/(nu1*k0), with nu1 = nu for lat1",,1996-09-18 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.4",EPSG,,
+9809,Oblique Stereographic,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The coordinate transformation from geographical to projected coordinates is executed via the distance and azimuth of the point from the centre point or origin. For a sphere the formulas are relatively simple. For the ellipsoid the parameters defining the conformal sphere at the tangent point as origin are first de [...]
+\
+Oblique and Equatorial Stereographic Formula\
+\
+Given the geodetic origin of the projection at the tangent point (lat0, lon0), the parameters defining the conformal sphere are:\
+\
+R= sqrt( rho0 * nu0)\
+n=  sqrt{1+[(e2*cos^4(lat0))/(1-e2)}\
+c=  [(n+sin(lat0)) (1-sin(chi0))]/[(n-sin(lat0)) (1+sin(chi0))]\
+\
+where:	sin(chi0) = (w1-1)/(w1+1)\
+w1 = (S1.(S2)^e)^n\
+S1 = (1+sin(lat0))/(1-sin(lat0))\
+S2 = (1-e sin(lat0))/(1+e sin(lat0))\
+\
+The conformal latitude and longitude (chi0,lambda0) of the origin are then computed from :\
+\
+chi0 = asin[(w2-1)/(w2+1)]\
+\
+where S1 and S2 are as above and  w2 = c (S1(S2)^e)^n\
+ \
+lambda0  = lon0\
+\
+For any point with geodetic coordinates (lat, lon) the equivalent conformal latitude and longitude (chi, lambda) are computed from \
+lambda = n(lon-lambda0) + lambda0\
+chi = asin[(w-1)/(w+1)]\
+\
+where w = c (Ss (Sb)^e)^n\
+Sa = (1+sin(lat))/(1-sin(lat))\
+Sb = (1-e.sin(lat))/(1+e.sin(lat))\
+ \
+Then B = [1+sin(chi) sin(chi0) + cos(chi) cos(chi0) cos(lambda-lambda0)]\
+\
+N = FN + 2 R k0 [sin(chi) cos(chi0) - cos(chi) sin(chi0) cos(lambda-lambda0)] / B\
+\
+E = FE + 2 R k0 cos(chi) sin(lambda-lambda0) / B\
+\
+\
+The reverse formulae to compute the geodetic coordinates from the grid coordinates involves computing the conformal values, then the isometric latitude and finally the geodetic values.\
+\
+The parameters of the conformal sphere and conformal latitude and longitude at the origin are computed as above. Then for any point with Stereographic grid coordinates (E,N) :\
+\
+chi = chi0 + 2 atan[{(N-FN)-(E-FE) tan (j/2)} / (2 R k0)]\
+\
+lambda = j + 2 i + lambda0\
+\
+where g = 2 R k0 tan(pi/4 - chi0/2)\
+h = 4 R k0 tan(chi0) + g\
+i = atan[(E-FE) / {h+(N-FN)}]\
+j = atan[(E-FE) / (g-(N-FN)] - i\
+\
+Geodetic longitude lon = (lambda-lambda0 ) / n +  lambda0\
+\
+Isometric latitude psi = 0.5 ln [(1+ sin(chi)) / { c (1-  sin(chi))}] / n\
+\
+First approximation lat1 = 2 atan(e^psi)  - pi/2  where e=base of natural logarithms.\
+\
+psii = isometric latitude at lati\
+\
+where psii= ln[{tan(lati/2 + pi/4}  {(1-e sin(lati))/(1+e sin(lati))}^(e/2)]\
+ \
+Then iterate lat(i+1) = lati - ( psii - psi ) cos(lati) (1 -e^2 sin^2(lati)) / (1 - e^2)\
+\
+until the change in lat is sufficiently small.\
+\
+\
+For Oblique Stereographic projections centred on points in the southern hemisphere,  the signs of E, N, lon0, lon,  must be reversed to be used in the equations and lat will be negative anyway as a southerly latitude.\
+\
+An alternative approach is given by Snyder, where, instead of defining a single conformal sphere at the origin point, the conformal latitude at each point on the ellipsoid is computed. The conformal longitude is then always equivalent to the geodetic longitude. This approach is a valid alternative to the above, but gives slightly different results away from the origin point.  It is therefore considered to be a different projection method.","For Projected Coordinate System RD / Netherlands New\
+\
+Parameters:\
+Ellipsoid   Bessel 1841    a = 6377397.155 m    1/f = 299.15281\
+then e = 0.08169683\
+\
+Latitude Natural Origin      52o09'22.178\"N  = 0.910296727 rad\
+Longitude Natural Origin     5o23'15.500\"E  =  0.094032038 rad\
+Scale factor k0                 0.9999079\
+False Eastings FE             155000.00 m\
+False Northings FN           463000.00 m\
+\
+Forward calculation for: \
+\
+Latitude    53oN = 0.925024504 rad\
+Longitude   6oE = 0.104719755 rad\
+\
+first gives the conformal sphere constants:\
+\
+rho0 = 6374588.71    nu0 = 6390710.613\
+R = 6382644.571    n = 1.000475857    c  = 1.007576465\
+\
+where S1 = 8.509582274  S2 = 0.878790173  w1 = 8.428769183\
+sin chi0 = 0.787883237\
+\
+w   = 8.492629457   chi0 = 0.909684757      D0 = d0 \
+\
+for the point  chi  = 0.924394997    D = 0.104724841\
+\
+hence B = 1.999870665    N = 557057.739    E = 196105.283\
+\
+reverse calculation for the same Easting and Northing first gives:\
+\
+g = 4379954.188    h = 37197327.96   i = 0.001102255   j = 0.008488122\
+\
+then  D = 0.10472467  Longitude = 0.104719584 rad =  6 deg E\
+\
+chi  = 0.924394767    psi = 1.089495123\
+phi1 = 0.921804948       psi1 = 1.084170164\
+phi2 = 0.925031162       psi2 = 1.089506925\
+phi3 = 0.925024504       psi3 = 1.089495505\
+phi4 = 0.925024504\
+\
+Then Latitude      = 53o00'00.000\"N\
+          Longitude   =   6o00'00.000\"E",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.6",EPSG,,99.811
+9810,Polar Stereographic,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"For the forward transformation from latitude and longitude,\
+\
+E = FE + rho sin(lon - lon0)\
+N = FN - rho cos(lon - lon0)\
+where\
+rho = 2 a ko t /{[((1+e)^(1+e)) ((1-e)^(1-e))]^0.5}\
+t = tan (pi/4 - lat/2) / [(1-esin(lat) ) / (1 + e sin(lat))]^(e/2)\
+\
+For the reverse transformation,\
+\
+lat = chi+ (e^2/2 + 5e^4/24 + e^6/12 + 13e^8/360) sin(2 chi) \
++ (7e^4/48 + 29e^6/240 + 811e^8/11520) sin(4 chi)\
++ (7e^6/120 +  81e^8/1120) sin(6 chi)  + (4279e^8/161280) sin(8 chi)\
+\
+lon = lon0+ arctan [(E-FE) / (FN-N)]\
+\
+where chi  = pi/2 - 2 arctan t\
+t   =  rho [((1+e)^(1+e)) ((1-e)^(1-e))]^0.5} / 2 a ko\
+rho = [(E-FE)^2  + (N - FN)^2]^0.5",,1996-09-18 00:00:00,"US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\";  J. Snyder",EPSG,,
+9811,New Zealand Map Grid,,,Latitude of natural origin,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,New Zealand Department of Lands technical circular 1973/32,EPSG,,
+9812,Hotine Oblique Mercator,,,Latitude of projection centre,Longitude of projection centre,Azimuth of initial line,Angle from Rectified to Skew Grid,Scale factor on initial line,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - esq)^0.5  / (cos(latc) * ( 1 - esq*sin^2(latc))^0.5)\
+if D < 1 to avoid problems with computation of F make D^2  = 1 \
+F = D + (D^2 - 1)^0.5  * SIGN(latc)\
+H = F* t0*B\
+G = (F - 1/F) / 2\
+gamma0 = asin(sin(alphac) / D)\
+lon0 = lonc - (asin(G*tan(gamma0))) / B\
+\
+Then compute the (uc , vc) co-ordinates for the centre point (fc , lc).\
+vc =0\
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)\
+\
+but for the special cases where alphac = 90 degrees (e.g. Hungary, Switzerland) then \
+uc = A*(lonc - lon0)  \
+\
+ \
+Forward case: To compute (E,N) from a given (lat,lon) :\
+\
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)\
+Q = H / t^B\
+S = (Q - 1 / Q) / 2\
+T = (Q + 1 / Q) / 2\
+V = sin(B (lon - lon0))\
+U = (- V cos(gamma0) + S sin(gamma0)) / T\
+v = A ln((1 - U) / (1 + U)) / 2 B\
+u = A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B\
+\
+\
+The rectified skew co-ordinates are then derived from:\
+\
+E = v cos(gammac) + u sin(gammac) + FE\
+N = u cos(gammac) - v sin(gammac) + FN\
+\
+Reverse case: Compute (lat,lon)  from a given (E,N)  :\
+\
+v� = (E - FE) cos(gammac) - (N - FN) sin(gammac)\
+u� = (N - FN) cos(gammac) + (E - FE) sin(gammac)\
+\
+Q� = e- (B v �/ A)  where e is the base of natural logarithms.\
+S' = (Q� - 1 / Q�) / 2\
+T� = (Q� + 1 / Q�) / 2\
+V� = sin (B u� / A)\
+U� = (V� cos(gammac) + S� sin(gammac)) / T�\
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)\
+\
+chi = pi / 2 - 2 atan(t�)\
+\
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) +  sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) +  sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) +  sin(8chi).(4279 e^8 / 161280)\
+\
+lon=  lon0  - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B","For Projected Coordinate System  Timbalai 1948 / R.S.O. Borneo (m)\
+\
+Parameters:\
+	Ellipsoid:  Everest 1830 (1967 Definition)\
+				a = 6377298.556 metres 	1/f = 300.8017\
+				then	e = 0.081472981	e2 = 0.006637847\
+					\
+	Latitude Projection Centre	fc  	4o00'00\"N		=	0.069813170 rad\
+	Longitude Projection Centre	lc  	115o00'00\"E	=	2.007128640 rad\
+	Azimuth of central line	ac	53o18'56.9537\"	=	0.930536611 rad\
+	Rectified to skew	gc	53o07'48.3685\"	=	0.927295218 rad\
+	Scale factor	ko	 0.99984\
+	False Eastings	FE	 0.00 m\
+	False Northings	FN	 0.00 m\
+\
+Forward calculation for: \
+	Latitude		f	4o39'20.783\"N		=	0.081258569 rad\
+	Longitude		l	114o28'10.539\"E	=	1.997871312 rad\
+		\
+B = 	1.003303209		F =	1.07212156\
+A =	6376278.686		H = 	1.00000299\
+		to = 	0.932946976		g0 = 	0.92729522\
+		D = 	1.002425787		l0 = 	1.91437347\
+		D2 =	1.004857458\
+	\
+		uc =	738096.09		vc =	0.00\
+		t =	0.922369529		Q =	1.084456854\
+		S =	0.081168129		T = 	1.003288725\
+		V =	0.83675700		U =	0.014680803\
+		v =	-93307.40		u =	734236.558\
+						u-uc =	-3859.536\
+\
+	Then	Easting		E =  	531404.81 m\
+		Northing	N =      515187.85 m\
+\
+Reverse calculations for same easting and northing first gives :\
+		v� =   	-93307.40		u� =	734236.558\
+		u�+uc = 1472332.652		Q� =	1.014790165\
+		S�  =	0.014682385		T� =	1.000107780	\
+		V� =	0.115274794		U� = 	0.080902065\
+		t� = 	0.922369529		c =	0.080721539		\
+				\
+Then	Latitude    	 f  =	4o39'20.783\"N		\
+	Longitude	l   =	114o28'10.539\"E",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5",EPSG,,97.62  99.811
+9813,Laborde Oblique Mercator,,,Latitude of projection centre,Longitude of projection centre,Azimuth of initial line,,Scale factor on initial line,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,"\"La nouvelle projection du Service Geographique de Madagascar\"; J. Laborde; 1928",EPSG,Can be accomodated by Oblique Mercator method (code 9815).,97.613
+9814,Swiss Oblique Cylindrical,,,Latitude of projection centre,Longitude of projection centre,,,,Easting at projection centre,Northing at projection centre,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1996-09-18 00:00:00,"\"Die projecktionen der Schweizerischen Plan und Kartenwerke\"; J Bollinger; 1967",EPSG,Can be accomodated by Oblique Mercator method (code 9815).,97.612
+9815,Oblique Mercator,,,Latitude of projection centre,Longitude of projection centre,Azimuth of initial line,Angle from Rectified to Skew Grid,Scale factor on initial line,Easting at projection centre,Northing at projection centre,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"The following constants for the projection may be calculated :\
+\
+B = (1 + esq * cos^4(latc) / (1 - esq ))^0.5\
+A = a * B * kc *(1 - esq )^0.5 / ( 1 - esq * sin^2(latc))\
+t0 = tan(pi/4 - latc/2) / ((1 - e*sin(latc)) / (1 + e*sin(latc)))^(e/2)\
+D = B (1 - esq)^0.5  / (cos(latc) * ( 1 - esq*sin^2(latc))^0.5)\
+if D < 1 to avoid problems with computation of F make D^2  = 1 \
+F = D + (D^2 - 1)^0.5  * SIGN(latc)\
+H = F* t0*B\
+G = (F - 1/F) / 2\
+gamma0 = asin(sin(alphac) / D)\
+lon0 = lonc - (asin(G*tan(gamma0))) / B\
+\
+Then compute the (uc , vc) co-ordinates for the centre point (fc , lc).\
+vc =0\
+In general: uc = (A / B) atan((Dsq - 1)^0.5 / cos (alphac) ) * SIGN(latc)\
+\
+but for the special cases where alphac = 90 degrees (e.g. Hungary, Switzerland) then \
+uc = A*(lonc - lon0)  \
+\
+ \
+Forward case: To compute (E,N) from a given (lat,lon) :\
+\
+t = tan(pi/4 - lat/2) / ((1 - e sin (lat)) / (1 + e sin (lat)))^(e/2)\
+Q = H / t^B\
+S = (Q - 1 / Q) / 2\
+T = (Q + 1 / Q) / 2\
+V = sin(B (lon - lon0))\
+U = (- V cos(gamma0) + S sin(gamma0)) / T\
+v = A ln((1 - U) / (1 + U)) / 2 B\
+u = (A atan((S cos(gamma0) + V sin(gamma0)) / cos(B (lon - lon0 ))) / B) + (uc . SIGN (lon - lonC))\
+\
+\
+The rectified skew co-ordinates are then derived from:\
+\
+E = v cos(gammac) + u sin(gammac) + Ec\
+N = u cos(gammac) - v sin(gammac) + Nc\
+\
+Reverse case: Compute (lat,lon)  from a given (E,N)  :\
+\
+v� = (E - Ec) cos(gammac) - (N - Nc) sin(gammac)\
+u� = (N - Nc) cos(gammac) + (E - Ec) sin(gammac) + uc\
+\
+Q� = e- (B v �/ A)  where e is the base of natural logarithms.\
+S' = (Q� - 1 / Q�) / 2\
+T� = (Q� + 1 / Q�) / 2\
+V� = sin (B u� / A)\
+U� = (V� cos(gammac) + S� sin(gammac)) / T�\
+t� = (H / ((1 + U�) / (1 - U�))^0.5)^(1 / B)\
+\
+chi = pi / 2 - 2 atan(t�)\
+\
+lat = chi + sin(2chi).( e^2 / 2 + 5*e^4 / 24 + e^6 / 12 + 13*e^8 / 360) +  sin(4*chi).( 7*e^4 /48 + 29*e^6 / 240 + 811*e8 / 11520) +  sin(6chi).( 7*e^6 / 120 + 81*e8 / 1120) +  sin(8chi).(4279 e^8 / 161280)\
+\
+lon=  lon0  - atan ((S� cos(gammac) - V� sin(gammac)) / cos(B*u� / A)) / B",,1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.5",EPSG,,99.811
+9816,Tunisia Mining Grid,,,Latitude of origin,Longitude of origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"This grid is used as the basis for mineral leasing in Tunsia.  Lease areas are approximately 2 x 2 km or 400 hectares.  The corners of these blocks are defined through a six figure grid reference where the first three digits are an easting in kilometres and the last three digits are a northing.  The latitudes and longitudes for block corners at 2 km intervals a [...]
+a)  the minimum easting is 94 km, on which the longitude is 5.68989 grads east of Paris.\
+b)  the maximum easting is 490 km, on which the longitude is 10.51515 grads east of Paris.\
+c)  each 2 km grid easting interval equals 0.02437 grads.\
+d)  the minimum northing is 40 km, on which the latitude is 33.39 grads.\
+e)  the maximum northing is 860 km, on which the latitude is 41.6039 grads.\
+f)  between 40 km N and 360 km N, each 2 km grid northing interval equals 0.02004 grads.\
+g)  between 360 km N and 860 km N, each 2 km grid northing interval equals 0.02003 grads.\
+\
+Formulae are:\
+\
+Grads from Paris\
+\
+Lat (grads) = 36.5964 + [(N - 360) * A] \
+where N is in kilometres and A = 0.010015 if N > 360, else A = 0.01002.\
+\
+LonParis (grads) = 7.83445 + [(E - 270) * 0.012185], where E is in kilometres.\
+\
+The reverse formulae are:\
+\
+E (km) = 270 + [(LonParis - 7.83445) / 0.012185] where LonParis is in grads.\
+\
+N (km) = 360 + [(Lat - 36.5964) / B] \
+where Lat is in grads and B = 0.010015  if  lat>36.5964, else B = 0.01002.\
+\
+Degrees from Greenwich.\
+\
+Modern practice in Tunisia is to quote latitude and longitude in degrees with longitudes referenced to the Greenwich meridian.  The formulae required in addition to the above are:\
+\
+Lat (degrees) =  (Latg * 0.9) where Latg is in grads.\
+LonGreenwich (degrees) = [(LonParis + 2.5969213) * 0.9] where LonParis is in grads.\
+\
+\
+Lat (grads) =  (Latd / 0.9) where Latd is in decimal degrees.\
+LonParis (grads) = [(LonGreenwich / 0.9) - 2.5969213)] where LonGreenwich is in decimal degrees.","For grid location 302598,\
+Latitude = 36.5964 + [(598 - 360) * A].  As N > 360, A = 0.010015.\
+Latitude = 38.97997 grads = 35.08197 degrees.\
+\
+Longitude  = 7.83445 + [(E - 270) * 0.012185, where E = 302.\
+Longitude  = 8.22437 grads east of Paris = 9.73916 degrees east of Greenwich.",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.8",EPSG,,99.811
+9817,Lambert Conic Near-Conformal,,,Latitude of natural origin,Longitude of natural origin,,,Scale factor at natural origin,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"To compute the Lambert Conic Near-Conformal the following formulae are used;\
+\
+E = FE + r sin(theta)\
+N = FN + M + r sin(theta) tan(theta/2) using the natural origin rather than the false origin.\
+\
+Compute constants for the ellipse:\
+\
+n = (a-b)/(a+b)  \
+A� = a [ 1- n + 5 (n^2 - n^3 ) / 4 + 81 ( n^4 - n^5 ) / 64]*pi /180 \
+B� = 3 a [ n - n^2 + 7 ( n^3 - n^4 ) / 8 + 55 n^5 / 64] / 2\
+C� = 15 a [ n^2 -n^3 + 3 ( n^4 - n^5 ) / 4 ] / 16\
+D� = 35 a [ n^3 - n^4 + 11 n^5 / 16 ] / 48\
+E� = 315 a [ n^4 - n^5 ] / 512\
+\
+Then compute the meridional arc from the equator to the parallel.\
+s0 = A� lat0 - B� sin(2 lat0) + C� sin(4 lat0) - D� sin(6 lat0) + E� sin(8 lat0) where lat0 in the first term is in degrees\
+s0 = A� lat - B� sin(2 lat) + C� sin(4 lat) - D� sin(6 lat) + E� sin(8 lat) where lat0 in the first term is in degrees\
+m = s - s0\
+A = 1 / (6 rho0 nu0) \
+M = ko ( m + A m^3.  This is the term that is truncated to the third order.\
+Ms = M per second of arc = M / ((lat - lat0) * 3600)\
+\
+theta = (lon - lon0) sin(lat0)\
+ro = ko nu0 / tan(lat0)\
+r = ro - M\
+\
+The reverse formulas for lat and lon  from E and N with r0 and Ms as above:\
+\
+lat  = M�/ (Ms * 3600) + lat0   where lat0 and lat are in degrees\
+lon  =  lon0 + theta� / sin(lat0)  where lont0 and lon are in radians\
+\
+where\
+E� = E - FE              N� = N - FN\
+theta� = arctan [E� / (r0 - N�)]\
+r� = E� / sin(theta�) \
+M� = r0 - r'","For Projected Coordinate System: Deir ez Zor / Levant Zone\
+\
+Parameters:\
+Ellipsoid  Clarke 1880 (IGN)  a = 6378249.2 m  1/f = 293.46602\
+then b = 6356515.000    n = 0.001706682563\
+\
+Latitude Natural Origin  = 34o 39'00\" N = 0.604756586 rad\
+Longitude Natural Origin = 37o 21'00\" E=  0.651880476 rad\
+Scale factor at origin ko = 0.99962560\
+False Eastings FE  = 300000.00 m\
+False Northings FN  = 300000.00 m\
+\
+Forward calculation for: \
+Latitude of 37d 31' 17.625\" N = 0.654874806 rad\
+Longitude of 34d 08' 11.291\" E = 0.595793792 rad\
+first gives\
+A = 4.1067494 * 10e-15      A�=111131.8633\
+B�= 16300.64407     C�= 17.38751     D�= 0.02308      E�= 0.000033\
+so = 3835482.233    s  = 4154101.458     m = 318619.225\
+M = 318632.72         Ms = 30.82262319\
+q = -0.03188875       ro = 9235264.405     r = 8916631.685\
+\
+Then Easting E =   15707.96 m (c.f. E =   15708.00 using full formulae)\
+         Northing N =      623165.96 m (c.f. N = 623167.20 using full formulae)\
+\
+Reverse calculation for the same easting and northing first gives\
+\
+q' = -0.03188875\
+r�  =  8916631.685\
+M�= 318632.72 \
+\
+Latitude =      0.654874806 rad = 37d 31' 17.625\" N\
+Longitude = 0.595793792 rad =  34d 08' 11.291\" E",1999-11-15 00:00:00,"EPSG Guidance note #7; \"Geographic and Projected Coordinate System Transformations\"; section 1.4.1.1",EPSG,,99.811
+9818,American Polyconic,,,Latitude of natural origin,Longitude of natural origin,,,,False easting,False northing,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1999-10-20 00:00:00,"US Geological Survey Professional Paper 1395; \"Map Projections - A Working Manual\";  J. Snyder",EPSG,,99.55
diff --git a/src/tiff/csv/trf_nonpolynomial.c b/src/tiff/csv/trf_nonpolynomial.c
new file mode 100644
index 0000000..718a6b0
--- /dev/null
+++ b/src/tiff/csv/trf_nonpolynomial.c
@@ -0,0 +1,1082 @@
+#include "defs.h"
+datafile_rows_t trf_nonpolynomial_row_1[] = {"COORD_TRF_CODE","COORD_TRF_EPSG_NAME","COORD_TRF_EPSG_ABBR","COORD_TRF_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_TRF_METHOD_CODE","PARAMETER_1","PARAMETER_2","PARAMETER_3","PARAMETER_4","PARAMETER_5","PARAMETER_6","PARAMETER_7","UOM_LENGTH_CODE","UOM_ANGLE_CODE","PRIME_MERIDIAN_CODE","UOM_SCALE_CODE","PARAMETER_35","PARAMETER_36","PARAMETER_37","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t trf_nonpolynomial_row_2[] = {"1100","Adindan to WGS 84 (1)","","","","MEAN FOR Ethiopia; Sudan.","9603","-166.0","-15.0","204.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_3[] = {"1101","Adindan to WGS 84 (2)","","","","Burkina Faso.","9603","-118.0","-14.0","218.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_4[] = {"1102","Adindan to WGS 84 (3)","","","","Cameroon.","9603","-134.0","-2.0","210.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_5[] = {"1103","Adindan to WGS 84 (4)","","","","Ethiopia.","9603","-165.0","-11.0","206.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_6[] = {"1104","Adindan to WGS 84 (5)","","","","Mali.","9603","-123.0","-20.0","220.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_7[] = {"1105","Adindan to WGS 84 (6)","","","","Senegal.","9603","-128.0","-18.0","224.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_8[] = {"1106","Adindan to WGS 84 (7)","","","","Sudan.","9603","-161.0","-14.0","205.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_9[] = {"1107","Afgooye to WGS 84 (1)","","","","Somalia.","9603","-43.0","-163.0","45.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_10[] = {"1108","AGD66 to WGS 84 (1)","","","","Australia.","9603","-133.0","-48.0","148.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_11[] = {"1109","AGD84 to WGS 84 (1)","","","","Australia.","9603","-134.0","-48.0","149.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_12[] = {"1110","Ain el Abd to WGS 84 (1)","","","","Bahrain.","9603","-150.0","-250.0","-1.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_13[] = {"1111","Ain el Abd to WGS 84 (2)","","","","Saudi Arabia.","9603","-143.0","-236.0","7.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_14[] = {"1112","Amersfoort to WGS 84 (1)","","","","Netherlands.","9606","593.16","26.15","478.54","-6.3239","-0.5008","-5.5487","4.0775","9001","9109","","9202","","","","1997-04-11 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993.","EPSG","","97.07",NULL};
+datafile_rows_t trf_nonpolynomial_row_15[] = {"1113","Arc 1950 to WGS 84 (1)","","","","MEAN FOR Botswana; Lesotho; Malawi; Swaziland; Zaire; Zambia; Zimbabwe.","9603","-143.0","-90.0","-294.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_16[] = {"1114","Arc 1950 to WGS 84 (2)","","","","Botswana.","9603","-138.0","-105.0","-289.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_17[] = {"1115","Arc 1950 to WGS 84 (3)","","","","Burundi.","9603","-153.0","-5.0","-292.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_18[] = {"1116","Arc 1950 to WGS 84 (4)","","","","Lesotho.","9603","-125.0","-108.0","-295.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_19[] = {"1117","Arc 1950 to WGS 84 (5)","","","","Malawi.","9603","-161.0","-73.0","-317.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_20[] = {"1118","Arc 1950 to WGS 84 (6)","","","","Swaziland.","9603","-134.0","-105.0","-295.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_21[] = {"1119","Arc 1950 to WGS 84 (7)","","","","Zaire.","9603","-169.0","-19.0","-278.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_22[] = {"1120","Arc 1950 to WGS 84 (8)","","","","Zambia.","9603","-147.0","-74.0","-283.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_23[] = {"1121","Arc 1950 to WGS 84 (9)","","","","Zimbabwe.","9603","-142.0","-96.0","-293.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_24[] = {"1122","Arc 1960 to WGS 84 (1)","","","","MEAN FOR Kenya; Tanzania.","9603","-160.0","-6.0","-302.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_25[] = {"1123","Batavia to WGS 84 (1)","","","","Indonesia (Sumatra).","9603","-377.0","681.0","-50.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_26[] = {"1124","Bermuda 1957 to WGS 84 (1)","","","","Bermuda.","9603","-73.0","213.0","296.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_27[] = {"1125","Bogota to WGS 84 (1)","","","","Colombia.","9603","307.0","304.0","-318.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_28[] = {"1126","Bukit Rimpah to WGS 84 (1)","","","","Indonesia (Bangka & Belitung Islands).","9603","-384.0","664.0","-48.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_29[] = {"1127","Campo Inchauspe to WGS 84 (1)","","","","Argentina.","9603","-148.0","136.0","90.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_30[] = {"1128","Cape to WGS 84 (1)","","","","South Africa.","9603","-136.0","-108.0","-292.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_31[] = {"1129","Cape to WGS 84 (2)","","","","South Africa.","9603","-134.73","-110.92","-292.66","","","","","9001","","","","","","","1996-10-18 00:00:00","Private Communication, Directorate of Surveys and Land Information, Cape Town.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_32[] = {"1130","Carthage to WGS 84 (1)","","","","Tunisia.","9603","-263.0","6.0","431.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_33[] = {"1131","Chua to WGS 84 (1)","","","","Paraguay.","9603","-134.0","229.0","-29.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_34[] = {"1132","Corrego Alegre to WGS 84 (1)","","","","Brazil.","9603","-206.0","172.0","-6.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_35[] = {"1133","ED50 to WGS 84 (1)","","","","MEAN FOR Austria; Belgium; Denmark; Finland;  France; Germany (west); Gibraltar; Greece;  Italy; Luxembourg; Netherlands; Norway;  Portugal; Spain; Sweden; Switzerland.","9603","-87.0","-98.0","-121.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","97.02",NULL};
+datafile_rows_t trf_nonpolynomial_row_36[] = {"1134","ED50 to WGS 84 (2)","","","","MEAN FOR Austria; Denmark; France; Germany (west); Netherlands; Switzerland.","9603","-87.0","-96.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_37[] = {"1135","ED50 to WGS 84 (3)","","","","MEAN FOR Iraq; Israel; Jordan; Lebanon;  Kuwait; Saudi Arabia; Syria.","9603","-103.0","-106.0","-141.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_38[] = {"1136","ED50 to WGS 84 (4)","","","","Cyprus.","9603","-104.0","-101.0","-140.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_39[] = {"1137","ED50 to WGS 84 (5)","","","","Egypt.","9603","-130.0","-117.0","-151.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_40[] = {"1138","ED50 to WGS 84 (6)","","","","Ireland; United Kingdom (UK).","9603","-86.0","-96.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_41[] = {"1139","ED50 to WGS 84 (7)","","","","Finland; Norway.","9603","-87.0","-95.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_42[] = {"1140","ED50 to WGS 84 (8)","","","","Greece.","9603","-84.0","-95.0","-130.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_43[] = {"1141","ED50 to WGS 84 (9)","","","","Iran.","9603","-117.0","-132.0","-164.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_44[] = {"1142","ED50 to WGS 84 (10)","","","","Italy (Sardinia).","9603","-97.0","-103.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_45[] = {"1143","ED50 to WGS 84 (11)","","","","Italy (Sicily).","9603","-97.0","-88.0","-135.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_46[] = {"1144","ED50 to WGS 84 (12)","","","","Malta.","9603","-107.0","-88.0","-149.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_47[] = {"1145","ED50 to WGS 84 (13)","","","","Portugal; Spain.","9603","-84.0","-107.0","-120.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_48[] = {"1146","ED87 to WGS 84 (1)","","","","Denmark - North Sea;  Germany - North Sea;  Netherlands - offshore;  Norway; United Kingdom (UKCS) - North Sea south of 62 deg N.","9606","-82.981","-99.719","-110.709","-0.5076","0.1503","0.3898","-0.3143","9001","9109","","9202","","","","1997-04-11 00:00:00","Norwegian Mapping Authority publication 1990:1 and note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"","EPSG","","97.03  9 [...]
+datafile_rows_t trf_nonpolynomial_row_49[] = {"1147","ED50 to ED87 (2)","","","","Norway - offshore north of 65 deg N.","9606","-1.51","-0.84","-3.5","-1.893","-0.687","-2.764","0.609","9001","9109","","9202","","","","1997-04-11 00:00:00","Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"","EPSG","","97.04",NULL};
+datafile_rows_t trf_nonpolynomial_row_50[] = {"1148","Egypt 1907 to WGS 84 (1)","","","","Egypt.","9603","-130.0","110.0","-13.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_51[] = {"1149","ETRF89 to WGS 84 (1)","","","","Europe.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1997-06-16 00:00:00","EPSG","EPSG","ETRF89 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.","97.24",NULL};
+datafile_rows_t trf_nonpolynomial_row_52[] = {"1150","GDA94 to WGS 84 (1)","","","","Australia.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1996-10-18 00:00:00","EPSG","EPSG","GDA94 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_53[] = {"1151","GD49 to WGS 84 (1)","","","","New Zealand.","9603","84.0","-22.0","209.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_54[] = {"1152","Hu Tzu Shan to WGS 84 (1)","","","","Taiwan.","9603","-637.0","-549.0","-203.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_55[] = {"1153","Indian 1954 to WGS 84 (1)","","","","Thailand.","9603","217.0","823.0","299.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_56[] = {"1154","Indian 1975 to WGS 84 (1)","","","","Thailand.","9603","209.0","818.0","290.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 second edition September 1991","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_57[] = {"1155","Kalianpur 1937 to WGS 84 (1)","","","","Bangladesh.","9603","282.0","726.0","254.0","","","","","9001","","","","","","","1999-10-20 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","97.235",NULL};
+datafile_rows_t trf_nonpolynomial_row_58[] = {"1156","Kalianpur 1975 to WGS 84 (1)","","","","India; Nepal.","9603","295.0","736.0","257.0","","","","","9001","","","","","","","1999-10-20 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","Care!  DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.","97.235",NULL};
+datafile_rows_t trf_nonpolynomial_row_59[] = {"1157","Kandawala to WGS 84 (1)","","","","Sri Lanka.","9603","-97.0","787.0","86.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_60[] = {"1158","Kertau to WGS 84 (1)","","","","Malaysia - West Malaysia; Singapore.","9603","-11.0","851.0","5.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_61[] = {"1159","Leigon to WGS 84 (1)","","","","Ghana.","9603","-130.0","29.0","364.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_62[] = {"1160","Liberia 1964 to WGS 84 (1)","","","","Liberia.","9603","-90.0","40.0","88.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_63[] = {"1161","Luzon 1911 to WGS 84 (1)","","","","Philippines (excluding Mindanao).","9603","-133.0","-77.0","-51.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_64[] = {"1162","Luzon 1911 to WGS 84 (2)","","","","Philippines (Mindanao).","9603","-133.0","-79.0","-72.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_65[] = {"1163","M'poraloko to WGS 84 (1)","","","","Gabon.","9603","-74.0","-130.0","42.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_66[] = {"1164","Mahe 1971 to WGS 84 (1)","","","","Seychelles - Mahe Island.","9603","41.0","-220.0","-134.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_67[] = {"1165","Massawa to WGS 84 (1)","","","","Ethiopia (Eritrea).","9603","639.0","405.0","60.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_68[] = {"1166","Merchich to WGS 84 (1)","","","","Morocco.","9603","31.0","146.0","47.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_69[] = {"1167","Minna to WGS 84 (1)","","","","Cameroon.","9603","-81.0","-84.0","115.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_70[] = {"1168","Minna to WGS 84 (2)","","","","Nigeria.","9603","-92.0","-93.0","122.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_71[] = {"1169","Monte Mario to WGS 84 (1)","","","","Italy (Sardinia).","9603","-225.0","-65.0","9.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_72[] = {"1170","NAD27 to WGS 84 (1)","","","","MEAN FOR Antigua; Barbados; Barbuda;  Caicos Islands; Cuba; Dominican Republic;  Grand Cayman; Jamaica; Turks Islands.","9603","-3.0","142.0","183.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_73[] = {"1171","NAD27 to WGS 84 (2)","","","","MEAN FOR Belize; Costa Rica; El Salvador;  Guatemala; Honduras; Nicaragua.","9603","0.0","125.0","194.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_74[] = {"1172","NAD27 to WGS 84 (3)","","","","MEAN FOR Canada.","9603","-10.0","158.0","187.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_75[] = {"1173","NAD27 to WGS 84 (4)","","","","MEAN FOR United States (USA) (CONUS).","9603","-8.0","160.0","176.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_76[] = {"1174","NAD27 to WGS 84 (5)","","","","MEAN FOR United States (USA) (CONUS East of Mississippi River  including Louisiana; Missouri; Minnesota).","9603","-9.0","161.0","179.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_77[] = {"1175","NAD27 to WGS 84 (6)","","","","MEAN FOR United States (USA) (CONUS West of Mississippi River).","9603","-8.0","159.0","175.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_78[] = {"1176","NAD27 to WGS 84 (7)","","","","United States (USA) - Alaska (Excluding Aleutian Islands).","9603","-5.0","135.0","172.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_79[] = {"1177","NAD27 to WGS 84 (8)","","","","Bahamas (Except San Salvador Island).","9603","-4.0","154.0","178.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_80[] = {"1178","NAD27 to WGS 84 (9)","","","","Bahamas (San Salvador Island).","9603","1.0","140.0","165.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_81[] = {"1179","NAD27 to WGS 84 (10)","","","","Canada (Alberta; British Columbia).","9603","-7.0","162.0","188.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_82[] = {"1180","NAD27 to WGS 84 (11)","","","","Canada (Manitoba; Ontario).","9603","-9.0","157.0","184.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_83[] = {"1181","NAD27 to WGS 84 (12)","","","","Canada (New Brunswick; Newfoundland; Nova Scotia; Quebec).","9603","-22.0","160.0","190.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_84[] = {"1182","NAD27 to WGS 84 (13)","","","","Canada (Northwest Territories; Nunavut; Saskatchewan).","9603","4.0","159.0","188.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_85[] = {"1183","NAD27 to WGS 84 (14)","","","","Canada (Yukon).","9603","-7.0","139.0","181.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_86[] = {"1184","NAD27 to WGS 84 (15)","","","","Panama - Canal Zone.","9603","0.0","125.0","201.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_87[] = {"1185","NAD27 to WGS 84 (16)","","","","Cuba.","9603","-9.0","152.0","178.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_88[] = {"1186","NAD27 to WGS 84 (17)","","","","Greenland (Hayes Peninsula).","9603","11.0","114.0","195.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_89[] = {"1187","NAD27 to WGS 84 (18)","","","","Mexico.","9603","-12.0","130.0","190.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_90[] = {"1188","NAD83 to WGS 84 (1)","","","","Canada; Central America; Mexico; United States (USA) (Alaska (excluding Aleutian Islands); CONUS).","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","NAD83 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_91[] = {"1189","Nahrwan 1967 to WGS 84 (1)","","","","Oman (Masirah Island).","9603","-247.0","-148.0","369.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_92[] = {"1190","Nahrwan 1967 to WGS 84 (2)","","","","Saudi Arabia.","9603","-243.0","-192.0","477.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_93[] = {"1191","Nahrwan 1967 to WGS 84 (3)","","","","United Arab Emirates (UAE).","9603","-249.0","-156.0","381.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_94[] = {"1192","Naparima 1972 to WGS 84 (1)","","","","Trinidad and Tobago.","9603","-10.0","375.0","165.0","","","","","9001","","","","","","","1998-06-30 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","CAUTION: EPSG believes that these parameter values include a blunder and that if NIMA transformation parameters are to be used the 1987 version (EPSG code 1307) be used.","98.102",NULL};
+datafile_rows_t trf_nonpolynomial_row_95[] = {"1193","NTF to WGS 84 (1)","","","","France.","9603","-168.0","-60.0","320.0","","","","","9001","","","","","","","1996-10-18 00:00:00","IGN technical report RT/G 14; January 1988.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_96[] = {"1195","OSGB 1936 to WGS 84 (1)","","","","MEAN FOR United Kingdom (UK) - Great Britain (England; Scotland; Wales); Isle of Man.","9603","375.0","-111.0","431.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_97[] = {"1196","OSGB 1936 to WGS 84 (2)","","","","United Kingdom (UK) - England.","9603","371.0","-112.0","434.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_98[] = {"1197","OSGB 1936 to WGS 84 (3)","","","","United Kingdom (UK) - England; Wales; Isle of Man.","9603","371.0","-111.0","434.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_99[] = {"1198","OSGB 1936 to WGS 84 (4)","","","","United Kingdom (UK) - Scotland (including Shetland Islands).","9603","384.0","-111.0","425.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_100[] = {"1199","OSGB 1936 to WGS 84 (5)","","","","United Kingdom (UK) - Wales.","9603","370.0","-108.0","434.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_101[] = {"1200","Pointe Noire to WGS 84 (1)","","","","Congo.","9603","-148.0","51.0","-291.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_102[] = {"1201","PSAD56 to WGS 84 (1)","","","","MEAN FOR Bolivia; Chile; Colombia;  Ecuador; Guyana; Peru; Venezuela.","9603","-288.0","175.0","-376.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_103[] = {"1202","PSAD56 to WGS 84 (2)","","","","Bolivia.","9603","-270.0","188.0","-388.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_104[] = {"1203","PSAD56 to WGS 84 (3)","","","","Chile (Northern; near 19 deg S).","9603","-270.0","183.0","-390.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_105[] = {"1204","PSAD56 to WGS 84 (4)","","","","Chile (Southern; near 43 deg S).","9603","-305.0","243.0","-442.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_106[] = {"1205","PSAD56 to WGS 84 (5)","","","","Colombia.","9603","-282.0","169.0","-371.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_107[] = {"1206","PSAD56 to WGS 84 (6)","","","","Ecuador.","9603","-278.0","171.0","-367.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_108[] = {"1207","PSAD56 to WGS 84 (7)","","","","Guyana.","9603","-298.0","159.0","-369.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_109[] = {"1208","PSAD56 to WGS 84 (8)","","","","Peru.","9603","-279.0","175.0","-379.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_110[] = {"1209","PSAD56 to WGS 84 (9)","","","","Venezuela.","9603","-295.0","173.0","-371.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_111[] = {"1210","Qatar to WGS 84 (1)","","","","Qatar.","9603","-128.0","-283.0","22.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_112[] = {"1211","Qornoq to WGS 84 (1)","","","","Greenland (South).","9603","164.0","138.0","-189.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_113[] = {"1212","SAD69 to WGS 84 (1)","","","","MEAN FOR Argentina; Bolivia; Brazil; Chile;  Colombia; Ecuador; Guyana; Paraguay;  Peru; Trinidad & Tobago; Venezuela.","9603","-57.0","1.0","-41.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_114[] = {"1213","SAD69 to WGS 84 (2)","","","","Argentina.","9603","-62.0","-1.0","-37.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_115[] = {"1214","SAD69 to WGS 84 (3)","","","","Bolivia.","9603","-61.0","2.0","-48.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_116[] = {"1215","SAD69 to WGS 84 (4)","","","","Brazil.","9603","-60.0","-2.0","-41.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_117[] = {"1216","SAD69 to WGS 84 (5)","","","","Chile.","9603","-75.0","-1.0","-44.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_118[] = {"1217","SAD69 to WGS 84 (6)","","","","Colombia.","9603","-44.0","6.0","-36.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_119[] = {"1218","SAD69 to WGS 84 (7)","","","","Ecuador.","9603","-48.0","3.0","-44.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_120[] = {"1219","SAD69 to WGS 84 (8)","","","","Ecuador (Baltra; Galapagos).","9603","-47.0","26.0","-42.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_121[] = {"1220","SAD69 to WGS 84 (9)","","","","Guyana.","9603","-53.0","3.0","-47.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_122[] = {"1221","SAD69 to WGS 84 (10)","","","","Paraguay.","9603","-61.0","2.0","-33.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_123[] = {"1222","SAD69 to WGS 84 (11)","","","","Peru.","9603","-58.0","0.0","-44.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_124[] = {"1223","SAD69 to WGS 84 (12)","","","","Trinidad and Tobago.","9603","-45.0","12.0","-33.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_125[] = {"1224","SAD69 to WGS 84 (13)","","","","Venezuela.","9603","-45.0","8.0","-33.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_126[] = {"1225","Sapper Hill 1943 to WGS 84 (1)","","","","Falkland Islands - East Falkland Island.","9603","-355.0","21.0","72.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_127[] = {"1226","Schwarzeck to WGS 84 (1)","","","","Namibia.","9603","616.0","97.0","-251.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_128[] = {"1227","Tananarive to WGS 84 (1)","","","","Madagascar.","9603","-189.0","-242.0","-91.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_129[] = {"1228","Timbalai 1948 to WGS 84 (1)","","","","Brunei; Malaysia (Sabah; Sarawak).","9603","-679.0","669.0","-48.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_130[] = {"1229","TM65 to WGS 84 (1)","","","","Ireland.","9603","506.0","-122.0","611.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_131[] = {"1230","Tokyo to WGS 84 (1)","","","","MEAN FOR Japan; South Korea; Okinawa.","9603","-148.0","507.0","685.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_132[] = {"1231","Tokyo to WGS 84 (2)","","","","Japan.","9603","-148.0","507.0","685.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_133[] = {"1232","Tokyo to WGS 84 (3)","","","","South Korea.","9603","-146.0","507.0","687.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","97.06",NULL};
+datafile_rows_t trf_nonpolynomial_row_134[] = {"1233","Tokyo to WGS 84 (4)","","","","Japan (Okinawa).","9603","-158.0","507.0","676.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_135[] = {"1234","Yacare to WGS 84 (1)","","","","Uruguay.","9603","-155.0","171.0","37.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_136[] = {"1235","Zanderij to WGS 84 (1)","","","","Suriname.","9603","-265.0","120.0","-358.0","","","","","9001","","","","","","","1996-10-18 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_137[] = {"1236","AGD84 to WGS 84 (2)","","","","Australia.","9607","-116.0","-50.47","141.69","-0.23","-0.39","-0.344","0.0983","9001","9104","","9202","","","","1997-11-13 00:00:00","Australian Surveying and Land Information Group - www.auslig.gov.au/geodesy","EPSG","Superseded by AGD84 to GDA94 (2) (code 1280).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_138[] = {"1237","WGS 72 to WGS 84 (1)","","","","World.","9606","0.0","0.0","4.5","0.0","0.0","0.554","0.2263","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_139[] = {"1238","WGS 72 to WGS 84 (2)","","","","World.","9606","0.0","0.0","4.5","0.0","0.0","0.554","0.219","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_140[] = {"1239","WGS 72BE to WGS 72 (1)","","","","World.","9606","0.0","0.0","-2.6","0.0","0.0","0.26","-0.6063","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_141[] = {"1240","WGS 72BE to WGS 84 (1)","","","","World.","9606","0.0","0.0","1.9","0.0","0.0","0.814","-0.38","9001","9104","","9202","","","","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_142[] = {"1241","NAD27 to NAD83 (1)","","","","United States (USA) - lower 48 states including EEZ.","9613","","","","","","","","","9104","","","conus.las","conus.los","","1999-04-22 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.","98.201  98.53",NULL};
+datafile_rows_t trf_nonpolynomial_row_143[] = {"1243","NAD27 to NAD83 (2)","","","","United States (USA) - Alaska including EEZ.","9613","","","","","","","","","9104","","","alaska.las","alaska.los","","1999-04-22 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.","98.201  98.53",NULL};
+datafile_rows_t trf_nonpolynomial_row_144[] = {"1245","ED50 to WGS 84 (16)","","","","Tunisia.","9603","-112.0","-77.0","-145.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_145[] = {"1246","Herat North to WGS 84 (1)","","","","Afghanistan.","9603","-333.0","-222.0","114.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_146[] = {"1247","Kalianpur 1962 to WGS 84 (1)","","","","Pakistan.","9603","283.0","682.0","231.0","","","","","9001","","","","","","","1999-10-20 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","Care!  DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.","97.235",NULL};
+datafile_rows_t trf_nonpolynomial_row_147[] = {"1248","ID74 to WGS 84 (1)","","","","Indonesia.","9603","-24.0","-15.0","5.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_148[] = {"1249","NAD27 to WGS 84 (21)","","","","United States (USA) - Alaska - Aleutian Islands east of 180 deg.","9603","-2.0","152.0","149.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_149[] = {"1250","NAD27 to WGS 84 (22)","","","","United States (USA) - Alaska - Aleutian Islands west of 180 deg.","9603","2.0","204.0","105.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_150[] = {"1251","NAD83 to WGS 84 (2)","","","","United States (USA) - Alaska - Aleutian Islands.","9603","-2.0","0.0","4.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_151[] = {"1252","NAD83 to WGS 84 (3)","","","","United States (USA) - Hawaii.","9603","1.0","1.0","-1.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_152[] = {"1253","Nord Sahara 1959 to WGS 84 (1)","","","","Algeria.","9603","-186.0","-93.0","310.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_153[] = {"1254","Pulkovo 1942 to WGS 84 (1)","","","","Russia.","9603","28.0","-130.0","-95.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_154[] = {"1255","Voirol Unifie to WGS 84 (1)","","","","Algeria - north of 35g (31 deg 30 min) North.","9603","-123.0","-206.0","219.0","","","","","9001","","","","","","","1998-06-30 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","CAUTION:   EPSG believes that the data used in the derivation of these parameters contains a blunder.  We recommend using transformation 1253 [North Sahara 1959 to WGS84 (1)] as Voirol 1 [...]
+datafile_rows_t trf_nonpolynomial_row_155[] = {"1256","Fahud to WGS 84 (1)","","","","Oman.","9603","-346.0","-1.0","224.0","","","","","9001","","","","","","","1997-04-11 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_156[] = {"1257","Bern 1898 (Bern) to Bern 1898","","","","Liechtenstein;  Switzerland.","9601","7.26225","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_157[] = {"1258","Bogota (Bogota) to Bogota","","","","Colombia.","9601","-74.04513","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_158[] = {"1259","Lisbon (Lisbon) to Lisbon","","","","Portugal - onshore.","9601","-9.0754862","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_159[] = {"1260","Makassar (Jakarta) to Makassar","","","","Indonesia - south west Sulawesi.","9601","106.482779","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_160[] = {"1261","MGI (Ferro) to MGI","","","","Austria.","9601","-17.4","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_161[] = {"1262","Monte Mario (Rome) to Monte Mario","","","","Italy.","9601","12.27084","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","98.37  99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_162[] = {"1263","Padang (Jakarta) to Padang","","","","Indonesia - Sumatra.","9601","106.482779","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_163[] = {"1264","Belge 1950 (Brussels) to Belge 1950","","","","Belgium - onshore.","9601","4.220471","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_164[] = {"1265","Tananarive (Paris) to Tananarive","","","","Madagascar.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_165[] = {"1266","Voirol 1875 (Paris) to Voirol 1875","","","","Algeria - north of 32 deg N.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_166[] = {"1267","Voirol Unifie (Paris) to Voirol Unifie","","","","Algeria - north of 32 deg N.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_167[] = {"1268","Batavia (Jakarta) to Batavia","","","","Indonesia - Java.","9601","106.482779","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_168[] = {"1269","RT38 (Stockholm) to RT38","","","","Sweden.","9601","18.03298","","","","","","","","9110","","","","","","1999-11-12 00:00:00","EPSG","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_169[] = {"1270","Greek (Athens) to Greek","","","","Greece - onshore.","9601","23.4258815","","","","","","","","9110","","","","","","1999-11-12 00:00:00","Topography Department; National Technical University of Athens.","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_170[] = {"1271","Schwarzeck to WGS 84 (2)","","","","Namibia.","9603","615.64","102.08","-255.81","","","","","9001","","","","","","","1997-11-13 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Beware !   Schwarzeck CS uses German legal metres.  Example:  Schwarzeck Lat 19d 35m 46.952s S Long 20d 41m 50.649s E; X=5623409.40 Y=2124618.00 Z=-2125847.62 GLM; X=5623485.86 Y=2124646.89 Z=-2125876.53 m; WGS84 X=5 [...]
+datafile_rows_t trf_nonpolynomial_row_171[] = {"1272","GGRS87 to WGS 84 (1)","","","","Greece.","9603","-199.87","74.79","246.62","","","","","9001","","","","","","","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_172[] = {"1273","HD72 to ETRF89 (1)","","","","Hungary.","9607","-56.0","75.77","15.31","-0.37","-0.2","-0.21","-1.01","9001","9104","","9202","","","","1997-11-13 00:00:00","http://lazarus.elte.hu/gb/geodez/geod5.htm","EPSG","","97.47",NULL};
+datafile_rows_t trf_nonpolynomial_row_173[] = {"1274","Pulkovo 1942 to LKS94(ETRS89) (1)","CS42 to LKS94 (1)","","","Lithuania.","9607","-40.595","-18.55","-69.339","-2.508","-1.832","2.611","-4.299","9001","9104","","9202","","","","1998-03-12 00:00:00","HNIT-BALTIC GeoInfoServisas.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_174[] = {"1275","ED50 to WGS 84 (17)","","","","France.","9603","-84.0","-97.0","-117.0","","","","","9001","","","","","","","1998-04-16 00:00:00","IGN technical report 14 (January 1988).","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_175[] = {"1276","NTF to ED50 (1)","","","","France.","9603","-84.0","37.0","437.0","","","","","9001","","","","","","","1997-11-13 00:00:00","IGN technical report 7 (October 1981).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_176[] = {"1277","NTF to WGS 72 (1)","","","","France.","9603","-168.0","-72.0","314.0","","","","","9001","","","","","","","1997-11-13 00:00:00","IGN technical report 7 (October 1981).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_177[] = {"1278","AGD66 to GDA94 (1)","","","","Australia.","9603","-127.8","-52.3","152.9","","","","","9001","","","","","","","1997-11-13 00:00:00","http://www.anzlic.org.au/icsm/gdatm/molodens.htm","EPSG","5m accuracy.  Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html","",NULL};
+datafile_rows_t trf_nonpolynomial_row_178[] = {"1279","AGD84 to GDA94 (1)","","","","Australia.","9603","-128.5","-53.0","153.4","","","","","9001","","","","","","","1997-11-13 00:00:00","http://www.anzlic.org.au/icsm/gdatm/molodens.htm","EPSG","5m accuracy.  Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html","",NULL};
+datafile_rows_t trf_nonpolynomial_row_179[] = {"1280","AGD84 to GDA94 (2)","","","","Australia.","9607","-117.763","-51.51","139.061","-0.292","-0.443","-0.277","-0.191","9001","9104","","9202","","","","1997-11-13 00:00:00","http://www.anzlic.org.au/icsm/gdatm/simil.htm","EPSG","1m accuracy.  Supersedes AGD84 to WGS 84 (2) (code 1236).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_180[] = {"1282","Samboja to WGS 84 (1)","","","","Indonesia - east Kalimantan - Mahakam delta area.","9603","-404.78","-685.68","-45.47","","","","","9001","","","","","","","1997-11-13 00:00:00","Total Indonesia.","EPSG","Datum shift derived through ITRF93.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_181[] = {"1283","LKS94(ETRS89) to WGS 84 (1)","LKS94 to WGS 84 (1)","","","Lithuania.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1998-03-12 00:00:00","HNIT-BALTIC GeoInfoServisas.","EPSG","LKS94 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.","98.13",NULL};
+datafile_rows_t trf_nonpolynomial_row_182[] = {"1284","Arc 1960 to WGS 84 (2)","","","","Kenya.","9603","-157.0","-2.0","-299.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_183[] = {"1285","Arc 1960 to WGS 84 (3)","","","","Tanzania.","9603","-175.0","-23.0","-303.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_184[] = {"1286","Segora to WGS 84 (1)","","","","Indonesia - Kalimantan.","9603","-403.0","684.0","41.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_185[] = {"1287","Pulkovo 1942 to WGS 84 (3)","","","","Hungary.","9603","28.0","-121.0","-77.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_186[] = {"1288","Pulkovo 1942 to WGS 84 (4)","","","","Poland.","9603","23.0","-124.0","-82.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_187[] = {"1289","Pulkovo 1942 to WGS 84 (5)","","","","Czech Republic.","9603","26.0","-121.0","-78.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_188[] = {"1290","Pulkovo 1942 to WGS 84 (6)","","","","Latvia.","9603","24.0","-124.0","-82.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_189[] = {"1291","Pulkovo 1942 to WGS 84 (7)","","","","Kazakstan.","9603","15.0","-130.0","-84.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_190[] = {"1292","Pulkovo 1942 to WGS 84 (8)","","","","Albania.","9603","24.0","-130.0","-92.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_191[] = {"1293","Pulkovo 1942 to WGS 84 (9)","","","","Romania.","9603","28.0","-121.0","-77.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","98.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_192[] = {"1294","Voirol 1875 to WGS 84 (1)","","","","Algeria - north of 35g (31 deg 30 min) North.","9603","-73.0","-247.0","227.0","","","","","9001","","","","","","","1998-03-12 00:00:00","U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_193[] = {"1295","Naparima 1972 to WGS 84 (2)","","","","Trinidad and Tobago.","9603","-0.465","372.095","171.736","","","","","9001","","","","","","","1998-11-11 00:00:00","Trinidad Ministry of Energy and Energy Industries.","EPSG","","98/38",NULL};
+datafile_rows_t trf_nonpolynomial_row_194[] = {"1296","Trinidad 1903 to WGS 84 (1)","","","","Trinidad.","9603","-61.702","284.488","472.052","","","","","9001","","","","","","","1998-11-11 00:00:00","Trinidad Ministry of Energy and Energy Industries.","EPSG","","98/38",NULL};
+datafile_rows_t trf_nonpolynomial_row_195[] = {"1297","Tete to Moznet (1)","","","","Mozambique.","9607","-115.064","-87.39","-101.716","0.058","-4.001","2.062","9.366","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 32 stations. Residuals as high as 30 metres. To reduce the size of the residuals; four regional parameter sets (codes 1298-1301) were developed.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_196[] = {"1298","Tete to Moznet (2)","","","","Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.","9607","-82.875","-57.097","-156.768","2.158","-1.524","0.982","-0.359","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 9 stations; residuals are generally under 1 metre.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_197[] = {"1299","Tete to Moznet (3)","","","","Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.","9607","-138.527","-91.999","-114.591","0.14","-3.363","2.217","11.748","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 6 stations; residuals are generally under 4 metres.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_198[] = {"1300","Tete to Moznet (4)","","","","Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.","9607","-73.472","-51.66","-112.482","-0.953","-4.6","2.368","0.586","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 11 stations; residuals are generally under 3 metres.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_199[] = {"1301","Tete to Moznet (5)","","","","Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.","9607","219.315","168.975","-166.145","-0.198","-5.926","2.356","-57.104","9001","9104","","9202","","","","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean of 7 stations; residuals are 5-10 metres.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_200[] = {"1302","Moznet to WGS 84 (1)","","","","Mozambique.","9607","0.0","0.0","0.0","0.0","0.0","0.0","0.0","9001","9104","","9202","","","","1998-04-16 00:00:00","EPSG","EPSG","For many purposes Moznet can be considered to be coincident with WGS 84. Accuracy better than 1 metre.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_201[] = {"1303","Pulkovo 1942 to WGS 84 (10)","","","","Kazakstan - Caspian.","9606","43.661","-103.342","-124.117","1.659","-0.824","0.653","0.59","9001","9104","","9202","","","","1998-04-16 00:00:00","KazakCaspiShelf consortium.","EPSG","Mean of 13 stations along entire Kazak coastline; residuals under 2 m.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_202[] = {"1304","Indian 1975 to WGS 84 (2)","","","","Thailand.","9603","210.0","814.0","289.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_203[] = {"1305","Tokyo to WGS 84 (5)","","","","South Korea.","9603","-147.0","506.0","687.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_204[] = {"1306","MGI to WGS 84 (1)","","","","MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.","9603","682.0","-203.0","480.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_205[] = {"1307","Naparima 1972 to WGS 84 (3)","","","","Trinidad & Tobago.","9603","-2.0","374.0","172.0","","","","","9001","","","","","","","1998-04-16 00:00:00","U.S. Defense Mapping Agency  TR8350.2 December 1987.","EPSG","See remarks for code 1192.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_206[] = {"1308","NAD83 to WGS 84 (4)","","","","United States (USA)","9607","-0.9738","1.9453","0.5486","-0.00000013357","-0.00000004872","-0.00000005507","0.0","9001","9101","","9202","","","","1999-04-22 00:00:00"," http://www.ngs.noaa.gov/CORS/Derivation.html","EPSG","Strictly between NAD83 and ITRF94(1996.0).  Superseded by NAD83 to WGS 84 (5) (code 1515).","99.12  99.38",NULL};
+datafile_rows_t trf_nonpolynomial_row_207[] = {"1309","DHDN to ETRF89 (1)","","","","Germany - former west Germany.","9607","582.0","105.0","414.0","-1.04","-0.35","3.08","8.3","9001","9104","","9202","","","","1998-06-30 00:00:00","Institute for Cartography and Geodesy; Leipzig.","EPSG","Mean of 69 stations; residuals under 5 m.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_208[] = {"1310","Pulkovo 1942 to ETRF89 (1)","","","","Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.","9607","24.0","-123.0","-94.0","-0.02","0.25","0.13","1.1","9001","9104","","9202","","","","1998-06-30 00:00:00","Institute for Cartography and Geodesy; Leipzig.","EPSG","Mean of 20 stations; residuals under 2 m.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_209[] = {"1311","ED50 to WGS 84 (Common Offshore)","ED50 to WGS 84 (18)","","","United Kingdom - UKCS offshore east of 6 deg west.","9606","-89.5","-93.8","-123.1","0.0","0.0","-0.156","1.2","9001","9104","","9202","","","","1998-06-30 00:00:00","The Hydrographic Journal; vol 52 page 50.","EPSG","Recommended transformation for UKCS petroleum purposes.  Based on ED50 to WGS72 (precise ephemeris) 6-nations agreement of 1981 to which precise to broadcas [...]
+datafile_rows_t trf_nonpolynomial_row_210[] = {"1312","NAD27 to NAD83 (3)","","","","Canada.","9614","","","","","","","","","9104","","","NTv1_0.gsb","","","1999-04-22 00:00:00","Geomatics Canada - Geodetic Survey Division.","EPSG","Uses NTv1 method.  Superseded in 1997 by NTv2 (non-poly transformation code 1313) except in Quebec.   Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_211[] = {"1313","NAD27 to NAD83 (4)","","","","Canada.","9615","","","","","","","","","9104","","","NTv2_0.gsb","","","1999-04-22 00:00:00","http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html","EPSG","Uses NTv2 data files.  Supersedes  NTv1 (non-poly transformation code 1312) except in Quebec.  Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and (code 4269) have longitudes positive east. [...]
+datafile_rows_t trf_nonpolynomial_row_212[] = {"1314","OSGB 1936 to WGS 84 (Petroleum)","","","","United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.","9606","446.448","-125.157","542.06","0.15","0.247","0.842","-20.489","9001","9104","","9202","","","","1998-11-11 00:00:00","UK Offshore Operators Association.","EPSG","Accuracy better than 4m and generally better than 2m.  For a more accurate transformation contact the Ordnance Survey of Great Britain.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_213[] = {"1315","OSGB 1936 to ED50 (UKOOA)","","","","United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.","9606","535.948","-31.357","665.16","0.15","0.247","0.998","-21.689","9001","9104","","9202","","","","1998-11-11 00:00:00","UK Offshore Operators Association.","EPSG","This transformation is concatenated from OSGB36 to WGS 84 (Petroleum) (code 1314) minus ED50 to WGS 84 (Common Offshore) (code 1311).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_214[] = {"1316","Manoca to WGS 84 (1)","","","","Cameroon.","9603","-70.9","-151.8","-41.4","","","","","9001","","","","","","","1998-11-11 00:00:00","Stolt Comex Seaway and Geoid for Elf.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_215[] = {"1317","Camacupa to WGS 72BE (1)","","","","Angola - offshore.","9603","-37.2","-370.6","-228.5","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived by Geophysical Services Inc. in 1979 from mean of Transit results at 7 stations.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_216[] = {"1318","Camacupa to WGS 84 (1)","","","","Angola - offshore block 5.","9603","-42.01","-332.21","-229.75","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Used by Conoco.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_217[] = {"1319","Camacupa to WGS 84 (2)","","","","Angola - offshore block 2.","9603","-40.0","-354.0","-224.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Used by Texaco.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_218[] = {"1320","Camacupa to WGS 84 (3)","","","","Angola - offshore blocks 1 and 16.","9606","-37.2","-370.6","-224.0","0.0","0.0","0.554","0.219","9001","9104","8901","9202","","","","1998-12-14 00:00:00","EPSG","EPSG","Used by Shell prior to 1994.  Superseded by Camacupa to WGS 84 (9).","98.56",NULL};
+datafile_rows_t trf_nonpolynomial_row_219[] = {"1321","Camacupa to WGS 84 (4)","","","","Angola - offshore blocks 7 and 8.  Also used rounded to integer metre for GSI/HGS/Western Geophysical speculative seismic data.","9603","-42.5","-342.5","-228.1","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived as mean of 123 Transit passes at station Cabo Ledo NE base in January 1989.  Used by Total for block 8. Used by Elf for block 7 up to December 1992 then supers [...]
+datafile_rows_t trf_nonpolynomial_row_220[] = {"1322","Camacupa to WGS 84 (5)","","","","Angola - offshore block 3.","9603","-55.5","-348.0","-229.2","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at station Djeno during coordination of platform PAL F2 in February 1992. Used by Elf for block 3 up to December 1992 then superseded by Camacupa to WGS 84 (7).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_221[] = {"1323","Camacupa to WGS 84 (6)","","","","Angola - offshore block 7.","9603","-43.0","-337.0","-233.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at Luanda observatory December 1992.  Used by Elf for 1993 block 7 shallow water survey.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_222[] = {"1324","Camacupa to WGS 84 (7)","","","","Angola - offshore blocks 3  7  15 and 17.","9603","-48.0","-345.0","-231.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at platform PAL F2 in December 1992.  Used by Elf for blocks 3, 7 and 17 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10).  Used by Exxon for block 15 since 1993.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_223[] = {"1325","Camacupa to WGS 84 (8)","","","","Angola - offshore block 2.","9603","-48.6","-345.1","-230.8","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at platform PAL F2 in December 1992. Used by Total for block 2 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_224[] = {"1326","Camacupa to WGS 84 (9)","","","","Angola - offshore blocks 1 16 and 18.","9606","-41.057","-374.564","-226.287","0.0","0.0","0.554","0.219","9001","9104","8901","9202","","","","1998-12-14 00:00:00","EPSG","EPSG","Used by Shell since 1994.  Supersedes Camacupa to WGS 84 (3).","98.56",NULL};
+datafile_rows_t trf_nonpolynomial_row_225[] = {"1327","Camacupa to WGS 84 (10)","","","","Angola - offshore blocks 2  3 17 and 31-33.","9603","-50.9","-347.6","-231.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Derived at platform PAL F2 in 1994 by Topnav using Doris.  Used by Elf in blocks 3 and 17 since 1994.  Used by Total in block 2 since 1994. Adopted by BP-Amoco Elf and Exxon for blocks 31-33.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_226[] = {"1328","Malongo 1987 to Mhast (1)","","","","Angola - Cabinda offshore.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Malongo 1987 is an offshore extension of Mhast adopted by Chevron in 1987.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_227[] = {"1329","Mhast to WGS 84 (1)","","","","Angola - Cabinda offshore.","9603","-252.95","-4.11","-96.38","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_228[] = {"1330","Malongo 1987 to WGS 84 (1)","","","","Angola - Cabinda offshore.","9603","-252.95","-4.11","-96.38","","","","","9001","","","","","","","1998-11-11 00:00:00","EPSG","EPSG","Used by Chevron.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_229[] = {"1331","EST92 to ETRF89 (1)","","","","Estonia","9607","0.0","0.0","0.0","0.0","0.0","0.0","0.0","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_230[] = {"1332","Pulkovo 1942 to EST92 (1)","","","","Estonia.","9607","21.53219","-97.00027","-60.74046","-0.99548","-0.58147","-0.2418","-4.5981","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_231[] = {"1333","EST92 to WGS84 (1)","","","","Estonia.","9607","0.055","-0.541","-0.185","-0.0183","0.0003","0.007","-0.014","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_232[] = {"1334","Pulkovo 1942 to WGS84 (12)","","","","Estonia.","9607","21.58719","-97.54127","-60.92546","-1.01378","-0.58117","-0.2348","-4.6121","9001","9104","","9202","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_233[] = {"1335","Tokyo to WGS 84 (6)","","","","Japan - 45d 20m to 46d N; 141d to 142d E.","9618","7.92","-13.88","26.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_234[] = {"1336","Tokyo to WGS 84 (7)","","","","Japan - 45d 20m to 46d N; 142d to 143d E.","9618","7.94","-13.97","26.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_235[] = {"1337","Tokyo to WGS 84 (8)","","","","Japan - 44deg 40min to 45deg 20min N; 141deg to 142deg E.","9618","8.1","-13.81","27.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_236[] = {"1338","Tokyo to WGS 84 (9)","","","","Japan - 44deg 40min to 45deg 20min N; 142deg to 143deg E.","9618","8.15","-13.95","28.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_237[] = {"1339","Tokyo to WGS 84 (10)","","","","Japan - 44deg to 44deg 40min N; 141deg to 142deg E.","9618","8.37","-13.65","29.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_238[] = {"1340","Tokyo to WGS 84 (11)","","","","Japan - 44deg to 44deg 40min N; 142deg to 143deg E.","9618","8.44","-13.87","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_239[] = {"1341","Tokyo to WGS 84 (12)","","","","Japan - 44deg to 44deg 40min N; 143deg to 144deg E.","9618","8.61","-14.08","30.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_240[] = {"1342","Tokyo to WGS 84 (13)","","","","Japan - 44deg to 44deg 40min N; 144deg to 145deg E.","9618","8.73","-14.3","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_241[] = {"1343","Tokyo to WGS 84 (14)","","","","Japan - 43deg 20min to 44deg N; 141deg to 142deg E.","9618","8.63","-13.49","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_242[] = {"1344","Tokyo to WGS 84 (15)","","","","Japan - 43deg 20min to 44deg N; 142deg to 143deg E.","9618","8.71","-13.73","31.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_243[] = {"1345","Tokyo to WGS 84 (16)","","","","Japan - 43deg 20min to 44deg N; 143deg to 144deg E.","9618","8.84","-14.03","31.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_244[] = {"1346","Tokyo to WGS 84 (17)","","","","Japan - 43deg 20min to 44deg N; 144deg to 145deg E.","9618","8.98","-14.33","32.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_245[] = {"1347","Tokyo to WGS 84 (18)","","","","Japan - 43deg 20min to 44deg N; 145deg to 146deg E.","9618","9.1","-14.56","32.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_246[] = {"1348","Tokyo to WGS 84 (19)","","","","Japan - 42deg 40min to 43deg 20min N; 140deg to 141deg E.","9618","8.79","-13.0","33.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_247[] = {"1349","Tokyo to WGS 84 (20)","","","","Japan - 42deg 40min to 43deg 20min N; 141deg to 142deg E.","9618","8.84","-13.31","31.4","","","","","9001","9104","","","","","","1999-11-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","99.77",NULL};
+datafile_rows_t trf_nonpolynomial_row_248[] = {"1350","Tokyo to WGS 84 (21)","","","","Japan - 42deg 40min to 43deg 20min N; 142deg to 143deg E.","9618","8.98","-13.59","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_249[] = {"1351","Tokyo to WGS 84 (22)","","","","Japan - 42deg 40min to 43deg 20min N; 143deg to 144deg E.","9618","9.1","-13.91","29.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_250[] = {"1352","Tokyo to WGS 84 (23)","","","","Japan - 42deg 40min to 43deg 20min N; 144deg to 145deg E.","9618","9.17","-14.27","31.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_251[] = {"1353","Tokyo to WGS 84 (24)","","","","Japan - 42deg 40min to 43deg 20min N; 145deg to 146deg E.","9618","9.23","-14.52","31.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_252[] = {"1354","Tokyo to WGS 84 (25)","","","","Japan - 42deg to 42deg 40min N; 139deg to 140deg E.","9618","8.9","-12.68","34.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_253[] = {"1355","Tokyo to WGS 84 (26)","","","","Japan - 42deg to 42deg 40min N; 140deg to 141deg E.","9618","8.99","-12.8","34.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_254[] = {"1356","Tokyo to WGS 84 (27)","","","","Japan - 42deg to 42deg 40min N; 141deg to 142deg E.","9618","9.0","-13.07","31.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_255[] = {"1357","Tokyo to WGS 84 (28)","","","","Japan - 42deg to 42deg 40min N; 142deg to 143deg E.","9618","9.21","-13.51","27.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_256[] = {"1358","Tokyo to WGS 84 (29)","","","","Japan - 42deg to 42deg 40min N; 143deg to 144deg E.","9618","9.33","-13.66","23.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_257[] = {"1359","Tokyo to WGS 84 (30)","","","","Japan - 41deg 20min to 42deg N; 140deg to 141deg E.","9618","9.25","-12.72","34.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_258[] = {"1360","Tokyo to WGS 84 (31)","","","","Japan - 41deg 20min to 42deg N; 141deg to 142deg E.","9618","9.39","-12.91","31.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_259[] = {"1361","Tokyo to WGS 84 (32)","","","","Japan - 40deg 40min to 41deg 20min N; 140deg to 141deg E.","9618","9.55","-12.63","35.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_260[] = {"1362","Tokyo to WGS 84 (33)","","","","Japan - 40deg 40min to 41deg 20min N; 141deg to 142deg E.","9618","9.62","-12.82","34.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_261[] = {"1363","Tokyo to WGS 84 (34)","","","","Japan - 40deg to 40deg 40min N; 139deg to 140deg E.","9618","9.81","-12.29","36.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_262[] = {"1364","Tokyo to WGS 84 (35)","","","","Japan - 40deg to 40deg 40min N; 140deg to 141deg E.","9618","9.81","-12.45","37.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_263[] = {"1365","Tokyo to WGS 84 (36)","","","","Japan - 40deg to 40deg 40min N; 141deg to 142deg E.","9618","9.92","-12.79","38.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_264[] = {"1366","Tokyo to WGS 84 (37)","","","","Japan - 39deg 20min to 40deg N; 139deg to 140deg E.","9618","9.91","-12.21","36.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_265[] = {"1367","Tokyo to WGS 84 (38)","","","","Japan - 39deg 20min to 40deg N; 140deg to 141deg E.","9618","10.08","-12.35","39.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_266[] = {"1368","Tokyo to WGS 84 (39)","","","","Japan - 39deg 20min to 40deg N; 141deg to 142deg E.","9618","10.19","-12.74","40.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_267[] = {"1369","Tokyo to WGS 84 (40)","","","","Japan - 38deg 40min to 39deg 20min N; 139deg to 140deg E.","9618","10.29","-12.13","38.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_268[] = {"1370","Tokyo to WGS 84 (41)","","","","Japan - 38deg 40min to 39deg 20min N; 140deg to 141deg E.","9618","10.33","-12.27","40.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_269[] = {"1371","Tokyo to WGS 84 (42)","","","","Japan - 38deg 40min to 39deg 20min N; 141deg to 142deg E.","9618","10.45","-12.61","41.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_270[] = {"1372","Tokyo to WGS 84 (43)","","","","Japan - 38deg to 38deg 40min N; 139deg to 140deg E.","9618","10.54","-11.96","39.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_271[] = {"1373","Tokyo to WGS 84 (44)","","","","Japan - 38deg to 38deg 40min N; 140deg to 141deg E.","9618","10.65","-12.27","41.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_272[] = {"1374","Tokyo to WGS 84 (45)","","","","Japan - 38deg to 38deg 40min N; 141deg to 142deg E.","9618","10.67","-12.5","41.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_273[] = {"1375","Tokyo to WGS 84 (46)","","","","Japan - 37deg 20min to 38deg N; 136deg to 137deg E.","9618","10.67","-10.86","38.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_274[] = {"1376","Tokyo to WGS 84 (47)","","","","Japan - 37deg 20min to 38deg N; 137deg to 138deg E.","9618","10.68","-10.97","36.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_275[] = {"1377","Tokyo to WGS 84 (48)","","","","Japan - 37deg 20min to 38deg N; 138deg to 139deg E.","9618","10.8","-11.53","39.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_276[] = {"1378","Tokyo to WGS 84 (49)","","","","Japan - 37deg 20min to 38deg N; 139deg to 140deg E.","9618","10.8","-11.73","40.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_277[] = {"1379","Tokyo to WGS 84 (50)","","","","Japan - 37deg 20min to 38deg N; 140deg to 141deg E.","9618","10.92","-12.16","42.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_278[] = {"1380","Tokyo to WGS 84 (51)","","","","Japan - 37deg 20min to 38deg N; 141deg to 142deg E.","9618","11.0","-12.25","41.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_279[] = {"1381","Tokyo to WGS 84 (52)","","","","Japan - 36deg 40min to 37deg 20min N; 136deg to 137deg E.","9618","10.83","-10.77","36.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_280[] = {"1382","Tokyo to WGS 84 (53)","","","","Japan - 36deg 40min to 37deg 20min N; 137deg to 138deg E.","9618","10.95","-11.0","38.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_281[] = {"1383","Tokyo to WGS 84 (54)","","","","Japan - 36deg 40min to 37deg 20min N; 138deg to 139deg E.","9618","10.97","-11.34","40.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_282[] = {"1384","Tokyo to WGS 84 (55)","","","","Japan - 36deg 40min to 37deg 20min N; 139deg to 140deg E.","9618","11.04","-11.69","43.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_283[] = {"1385","Tokyo to WGS 84 (56)","","","","Japan - 36deg 40min to 37deg 20min N; 140deg to 141deg E.","9618","11.17","-12.05","42.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_284[] = {"1386","Tokyo to WGS 84 (57)","","","","Japan - 36deg to 37deg 40min N; 136deg to 137deg E.","9618","11.11","-10.59","37.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_285[] = {"1387","Tokyo to WGS 84 (58)","","","","Japan - 36deg to 37deg 40min N; 137deg to 138deg E.","9618","11.16","-10.97","40.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_286[] = {"1388","Tokyo to WGS 84 (59)","","","","Japan - 36deg to 37deg 40min N; 138deg to 139deg E.","9618","11.29","-11.23","42.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_287[] = {"1389","Tokyo to WGS 84 (60)","","","","Japan - 36deg to 37deg 40min N; 139deg to 140deg E.","9618","11.36","-11.59","42.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_288[] = {"1390","Tokyo to WGS 84 (61)","","","","Japan - 36deg to 37deg 40min N; 140deg to 141deg E.","9618","11.44","-11.88","40.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_289[] = {"1391","Tokyo to WGS 84 (62)","","","","Japan - 35deg 20min to 36deg N; 132deg to 133deg E.","9618","11.27","-9.31","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_290[] = {"1392","Tokyo to WGS 84 (63)","","","","Japan - 35deg 20min to 36deg N; 133deg to 134deg E.","9618","11.33","-9.52","33.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_291[] = {"1393","Tokyo to WGS 84 (64)","","","","Japan - 35deg 20min to 36deg N; 134deg to 135deg E.","9618","11.38","-9.86","34.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_292[] = {"1394","Tokyo to WGS 84 (65)","","","","Japan - 35deg 20min to 36deg N; 135deg to 136deg E.","9618","11.41","-10.14","35.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_293[] = {"1395","Tokyo to WGS 84 (66)","","","","Japan - 35deg 20min to 36deg N; 136deg to 137deg E.","9618","11.39","-10.52","37.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_294[] = {"1396","Tokyo to WGS 84 (67)","","","","Japan - 35deg 20min to 36deg N; 137deg to 138deg E.","9618","11.49","-10.83","39.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_295[] = {"1397","Tokyo to WGS 84 (68)","","","","Japan - 35deg 20min to 36deg N; 138deg to 139deg E.","9618","11.58","-11.21","41.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_296[] = {"1398","Tokyo to WGS 84 (69)","","","","Japan - 35deg 20min to 36deg N; 139deg to 140deg E.","9618","11.65","-11.53","38.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_297[] = {"1399","Tokyo to WGS 84 (70)","","","","Japan - 35deg 20min to 36deg N; 140deg to 141deg E.","9618","11.72","-11.8","34.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_298[] = {"1400","Tokyo to WGS 84 (71)","","","","Japan - 34deg 40min to 35deg 20min N; 132deg to 133deg E.","9618","11.44","-9.21","32.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_299[] = {"1401","Tokyo to WGS 84 (72)","","","","Japan - 34deg 40min to 35deg 20min N; 133deg to 134deg E.","9618","11.47","-9.52","35.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_300[] = {"1402","Tokyo to WGS 84 (73)","","","","Japan - 34deg 40min to 35deg 20min N; 134deg to 135deg E.","9618","11.55","-9.8","35.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_301[] = {"1403","Tokyo to WGS 84 (74)","","","","Japan - 34deg 40min to 35deg 20min N; 135deg to 136deg E.","9618","11.61","-10.12","35.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_302[] = {"1404","Tokyo to WGS 84 (75)","","","","Japan - 34deg 40min to 35deg 20min N; 136deg to 137deg E.","9618","11.66","-10.47","37.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_303[] = {"1405","Tokyo to WGS 84 (76)","","","","Japan - 34deg 40min to 35deg 20min N; 137deg to 138deg E.","9618","11.78","-10.79","39.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_304[] = {"1406","Tokyo to WGS 84 (77)","","","","Japan - 34deg 40min to 35deg 20min N; 138deg to 139deg E.","9618","11.85","-11.13","39.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_305[] = {"1407","Tokyo to WGS 84 (78)","","","","Japan - 34deg 40min to 35deg 20min N; 139deg to 140deg E.","9618","11.9","-11.47","36.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_306[] = {"1408","Tokyo to WGS 84 (79)","","","","Japan - 34deg 40min to 35deg 20min N; 140deg to 141deg E.","9618","11.91","-11.69","33.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_307[] = {"1409","Tokyo to WGS 84 (80)","","","","Japan - 34deg to 34deg 40min N; 130deg to 131deg E.","9618","11.65","-8.59","29.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_308[] = {"1410","Tokyo to WGS 84 (81)","","","","Japan - 34deg to 34deg 40min N; 131deg to 132deg E.","9618","11.68","-8.8","30.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_309[] = {"1411","Tokyo to WGS 84 (82)","","","","Japan - 34deg to 34deg 40min N; 132deg to 133deg E.","9618","11.73","-9.04","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_310[] = {"1412","Tokyo to WGS 84 (83)","","","","Japan - 34deg to 34deg 40min N; 133deg to 134deg E.","9618","11.72","-9.48","35.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_311[] = {"1413","Tokyo to WGS 84 (84)","","","","Japan - 34deg to 34deg 40min N; 134deg to 135deg E.","9618","11.81","9.74","35.8","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_312[] = {"1414","Tokyo to WGS 84 (85)","","","","Japan - 34deg to 34deg 40min N; 135deg to 136deg E.","9618","11.88","-10.1","37.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_313[] = {"1415","Tokyo to WGS 84 (86)","","","","Japan - 34deg to 34deg 40min N; 136deg to 137deg E.","9618","11.91","-10.35","37.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_314[] = {"1416","Tokyo to WGS 84 (87)","","","","Japan - 34deg to 34deg 40min N; 137deg to 138deg E.","9618","11.9","-10.7","39.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_315[] = {"1417","Tokyo to WGS 84 (88)","","","","Japan - 34deg to 34deg 40min N; 138deg to 139deg E.","9618","12.02","-11.09","38.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_316[] = {"1418","Tokyo to WGS 84 (89)","","","","Japan - 33deg 20min to 34deg N; 129deg to 130deg E.","9618","11.87","-8.23","29.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_317[] = {"1419","Tokyo to WGS 84 (90)","","","","Japan - 33deg 20min to 34deg N; 130deg to 131deg E.","9618","11.84","-8.44","30.6","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_318[] = {"1420","Tokyo to WGS 84 (91)","","","","Japan - 33deg 20min to 34deg N; 131deg to 132deg E.","9618","11.94","-8.71","30.2","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_319[] = {"1421","Tokyo to WGS 84 (92)","","","","Japan - 33deg 20min to 34deg N; 132deg to 133deg E.","9618","11.99","-9.02","30.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_320[] = {"1422","Tokyo to WGS 84 (93)","","","","Japan - 33deg 20min to 34deg N; 133deg to 134deg E.","9618","12.05","-9.36","35.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_321[] = {"1423","Tokyo to WGS 84 (94)","","","","Japan - 33deg 20min to 34deg N; 134deg to 135deg E.","9618","12.1","-9.64","35.5","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_322[] = {"1424","Tokyo to WGS 84 (95)","","","","Japan - 33deg 20min to 34deg N; 135deg to 136deg E.","9618","12.1","-10.08","37.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_323[] = {"1425","Tokyo to WGS 84 (96)","","","","Japan - 33deg 20min to 34deg N; 136deg to 137deg E.","9618","12.07","-10.25","37.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_324[] = {"1426","Tokyo to WGS 84 (97)","","","","Japan - 32deg 40min to 33deg 20min N; 129deg to 130deg E.","9618","12.0","-8.15","32.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_325[] = {"1427","Tokyo to WGS 84 (98)","","","","Japan - 32deg 40min to 33deg 20min N; 130deg to 131deg E.","9618","12.06","-8.38","31.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_326[] = {"1428","Tokyo to WGS 84 (99)","","","","Japan - 32deg 40min to 33deg 20min N; 131deg to 132deg E.","9618","12.17","-8.69","30.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_327[] = {"1429","Tokyo to WGS 84 (100)","","","","Japan - 32deg 40min to 33deg 20min N; 132deg to 133deg E.","9618","12.23","-8.99","31.7","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_328[] = {"1430","Tokyo to WGS 84 (101)","","","","Japan - 32deg 40min to 33deg 20min N; 133deg to 134deg E.","9618","12.21","-9.21","34.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_329[] = {"1431","Tokyo to WGS 84 (102)","","","","Japan - 32deg 40min to 33deg 20min N; 134deg to 135deg E.","9618","12.28","-9.6","33.3","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_330[] = {"1432","Tokyo to WGS 84 (103)","","","","Japan - 32deg to 32deg 40min N; 130deg to 131deg E.","9618","12.28","-8.25","31.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_331[] = {"1433","Tokyo to WGS 84 (104)","","","","Japan - 32deg to 32deg 40min N; 131deg to 132deg E.","9618","12.37","-8.55","29.1","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_332[] = {"1434","Tokyo to WGS 84 (105)","","","","Japan - 31deg 20min to 32deg N; 130deg to 131deg E.","9618","12.53","-8.21","31.0","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_333[] = {"1435","Tokyo to WGS 84 (106)","","","","Japan - 31deg 20min to 32deg N; 131deg to 132deg E.","9618","12.57","-8.4","28.4","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_334[] = {"1436","Tokyo to WGS 84 (107)","","","","Japan - 30deg 40min to 31deg 20min N; 130deg to 131deg E.","9618","12.71","-8.17","29.9","","","","","9001","9104","","","","","","1998-12-12 00:00:00","http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_335[] = {"1437","RT90 to ETRF89 (1)","","","","Sweden","9607","419.3836","99.3335","591.3451","-0.850389","-1.817277","7.862238","-0.99496","9001","9104","","9202","","","","1999-04-22 00:00:00","National Land Survey of Sweden.","EPSG","This transformation is actually between ETRF89 and RR92.  RR92 is a geographic 3D coordinate system where the horizontal component is RT90.","99.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_336[] = {"1438","Fahud to WGS 84 (2)","","","","Oman.","9606","-333.102","-11.02","230.69","0.0","0.0","0.554","0.219","9001","9104","","9202","","","","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_337[] = {"1439","PSD93 to WGS 84 (1)","","","","Oman.","9606","-180.624","-225.516","173.919","-0.81","-1.898","8.336","16.71006","9001","9104","","9202","","","","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_338[] = {"1440","ED50 to WGS 84 (19)","","","","Greece.","9603","-86.0","-92.2","-127.5","","","","","9001","","","","","","","1999-04-22 00:00:00","Geodesy Department; Hellenic Petroleum s.a.","EPSG","Used in oil industry.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_339[] = {"1441","Antigua 1943 to WGS 84 (1)","","","","Antigua.","9603","-255.0","-15.0","71.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_340[] = {"1442","Dominica 1945 to WGS 84 (1)","","","","Dominica.","9603","725.0","685.0","536.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_341[] = {"1443","Grenada 1953 to WGS 84 (1)","","","","Grenada.","9603","72.0","213.7","93.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_342[] = {"1444","Montserrat 1958 to WGS 84 (1)","","","","Montserrat.","9603","174.0","359.0","365.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_343[] = {"1445","St. Kitts 1955 to WGS 84 (1)","","","","Saint Kitts and Nevis.","9603","9.0","183.0","236.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_344[] = {"1446","St. Lucia 1955 to WGS 84 (1)","","","","Saint Lucia.","9603","-149.0","128.0","296.0","","","","","9001","","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_345[] = {"1447","Anguilla 1957 to WGS 84 (1)","","","","Anguilla.","9619","-18.0","4.4","","","","","","","9104","","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_346[] = {"1450","ED50 to WGS 84 (20)","","","","Norway - offshore between 62 and 65 deg North and west of 5 deg East.","9620","","","","","","8047.0","8046.0","","9102","","","ED50 to WGS 84 (15)","ED50 to WGS 84 (14)","","1999-04-22 00:00:00","Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_347[] = {"1451","NAD27(CGQ77) to NAD83 (1)","","","","Canada - Quebec","9614","","","","","","","","","9104","","","PQV4.DAC","","","1999-05-15 00:00:00","Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca","EPSG","Uses NT method which expects longitudes positive west; EPSG GeogCSs CGQ77 (code 4609) and NAD83 (code 4269) have longitudes positive east.  Supersedes NAD27 to NAD83 (5) (code xxxx).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_348[] = {"1454","Old Hawaiian to NAD83 (1)","","","","United States (USA) - Hawaii including EEZ.","9613","","","","","","","","","9104","","","hawaii.las","hawaii.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Old Hawaiian (code 4135) and NAD83 (code 4269) have longitudes positive east.  NADCON data converts from Old Hawaiian Datum to but ma [...]
+datafile_rows_t trf_nonpolynomial_row_349[] = {"1455","St. Lawrence Island to NAD83 (1)","","","","United States (USA) - Alaska - St. Lawrence Island.","9613","","","","","","","","","9104","","","stlrnc.las","stlrnc.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Lawrence (code 4136) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Lawrence D [...]
+datafile_rows_t trf_nonpolynomial_row_350[] = {"1456","St. Paul Island to NAD83 (1)","","","","United States (USA) - Alaska - St. Paul Island.","9613","","","","","","","","","9104","","","stpaul.las","stpaul.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Paul (code 4137) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Paul Datum to but make [...]
+datafile_rows_t trf_nonpolynomial_row_351[] = {"1457","St. George Island to NAD83 (1)","","","","United States (USA) - Alaska - St. George Island.","9613","","","","","","","","","9104","","","stgeorge.las","stgeorge.los","","1999-05-15 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. George (code 4138) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. George Datum [...]
+datafile_rows_t trf_nonpolynomial_row_352[] = {"1458","AGD66 to GDA94 (2)","","","","Australia - ACT.","9607","-129.193","-41.212","130.73","-0.246","-0.374","-0.329","-2.955","9001","9104","","9202","","","","1999-05-25 00:00:00","http://www.anzlic.org.au/icsm/gdatm/regional.htm","EPSG","1m accuracy.  Recommended for mid-accuracy use in A.C.T.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_353[] = {"1459","AGD66 to GDA94 (3)","","","","Australia - Tasmania.","9607","-120.695","-62.73","165.46","-0.109","0.141","0.116","2.733","9001","9104","","9202","","","","1999-05-25 00:00:00","http://www.anzlic.org.au/icsm/gdatm/regional.htm","EPSG","1m accuracy.  Recommended for mid-accuracy use in Tasmania.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_354[] = {"1460","AGD66 to GDA94 (4)","","","","Australia - New South Wales (NSW) and Victoria.","9607","-119.353","-48.301","139.484","-0.415","-0.26","-0.437","-0.613","9001","9104","","9202","","","","1999-05-25 00:00:00","http://www.anzlic.org.au/icsm/gdatm/regional.htm","EPSG","1m accuracy.  Recommended for mid-accuracy use in NSW and Victoria.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_355[] = {"1461","Puerto Rico to NAD83 (1)","","","","Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).","9613","","","","","","","","","9104","","","prvi.las","prvi.los","","1999-05-24 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Puerto Rico (code 4139) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Puerto Rico Datum [...]
+datafile_rows_t trf_nonpolynomial_row_356[] = {"1462","NAD27 to NAD83 (5)","","","","Canada - Quebec","9614","","","","","","","","","9104","","","GS2783v1.QUE","","","1999-05-24 00:00:00","Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca","EPSG","Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.  Superseded by NAD27(CGQ77) to NAD83 (1) (code 1451).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_357[] = {"1463","NAD27(76) to NAD83 (1)","","","","Canada - Ontario","9615","","","","","","","","","9104","","","May76v20.gsb","","","1999-05-24 00:00:00","Geodetic Survey of Canada   http://www.geod.emr.ca/html-public/GSDapps/English/NTv2_Fact_Sheet.html","EPSG","Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27(76) (code 4608) and NAD83 (code 4269) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_358[] = {"1464","AGD66 to GDA94 (5)","","","","Australia - Victoria.","9615","","","","","","","","","9104","","","vic_0799.gsb","","","1999-10-20 00:00:00","http://www.osg.vic.gov.au/tools.htm","EPSG","0.1m accuracy.  Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.","99.67",NULL};
+datafile_rows_t trf_nonpolynomial_row_359[] = {"1466","NGO 1948 (Oslo) to NGO1948","","","","Norway - onshore.","9601","10.43225","","","","","","","","9110","","","","","","1999-11-12 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","Change of prime meridian.","99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_360[] = {"1467","NTF (Paris) to NTF (1)","","","","France - onshore.","9601","2.5969213","","","","","","","","9105","","","","","","1999-11-12 00:00:00","IGN Paris.","EPSG","Change of prime meridian.","99.63  99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_361[] = {"1468","NTF (Paris) to NTF (2)","","","","France - onshore.","9601","2.201395","","","","","","","","9110","","","","","","1999-11-12 00:00:00","Royal Geographic Society; London","EPSG","Change of prime meridian.  EPSG prefers value from IGN Paris (code 1467).","99.63  99.79",NULL};
+datafile_rows_t trf_nonpolynomial_row_362[] = {"1469","Locodjo 1965 to WGS 84 (1)","","","","Cote D'Ivoire (Ivory Coast)","9603","-125.0","53.0","467.0","","","","","9001","","","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_363[] = {"1470","Abidjan 1987 to WGS 84 (1)","","","","Cote D'Ivoire (Ivory Coast)","9603","-124.76","53.0","466.79","","","","","9001","","","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_364[] = {"1471","MGI to WGS 84 (2)","","","","Austria","9606","-577.326","-90.129","-463.919","-15.8537","-4.55","-16.3489","-2.4232","9001","9113","","9202","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_365[] = {"1472","ATS77 to NAD83(CSRS98) (1)","","","","Canada - New Brunswick","9615","","","","","","","","","9104","","","NT7783v2.gsb","","","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","Introduced in 1999.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_366[] = {"1473","NAD83(CSRS98) to WGS 84 (1)","","","","Canada - New Brunswick","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1999-10-20 00:00:00","EPSG","EPSG","For many purposes NAD83 can be considered to be coincident with WGS 84.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_367[] = {"1474","NAD83 to NAD83(HARN) (1)","","","","United States (USA) - Alabama.","9613","","","","","","","","","9104","","","alhpgn.las","alhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_368[] = {"1475","NAD83 to NAD83(HARN) (2)","","","","United States (USA) - Arizona.","9613","","","","","","","","","9104","","","azhpgn.las","azhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_369[] = {"1476","NAD83 to NAD83(HARN) (3)","","","","United States (USA) - California north of 38 deg N.","9613","","","","","","","","","9104","","","cnhpgn.las","cnhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_370[] = {"1477","NAD83 to NAD83(HARN) (4)","","","","United States (USA) - California south of 38 deg N.","9613","","","","","","","","","9104","","","cshpgn.las","cshpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_371[] = {"1478","NAD83 to NAD83(HARN) (5)","","","","United States (USA) - Colorado.","9613","","","","","","","","","9104","","","cohpgn.las","cohpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_372[] = {"1479","NAD83 to NAD83(HARN) (6)","","","","United States (USA) - Georgia.","9613","","","","","","","","","9104","","","gahpgn.las","gahpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_373[] = {"1480","NAD83 to NAD83(HARN) (7)","","","","United States (USA) - Florida.","9613","","","","","","","","","9104","","","flhpgn.las","flhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_374[] = {"1481","NAD83 to NAD83(HARN) (8)","","","","United States (USA) - Idaho and Montana - east of 113 deg W.","9613","","","","","","","","","9104","","","emhpgn.las","emhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_375[] = {"1482","NAD83 to NAD83(HARN) (9)","","","","United States (USA) - Idaho and Montana - west of 113 deg W.","9613","","","","","","","","","9104","","","wmhpgn.las","wmhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_376[] = {"1483","NAD83 to NAD83(HARN) (10)","","","","United States (USA) - Kentucky.","9613","","","","","","","","","9104","","","kyhpgn.las","kyhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_377[] = {"1484","NAD83 to NAD83(HARN) (11)","","","","United States (USA) - Louisiana.","9613","","","","","","","","","9104","","","lahpgn.las","lahpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_378[] = {"1485","NAD83 to NAD83(HARN) (12)","","","","United States (USA) - Delaware and Maryland.","9613","","","","","","","","","9104","","","mdhpgn.las","mdhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_379[] = {"1486","NAD83 to NAD83(HARN) (13)","","","","United States (USA) - Maine.","9613","","","","","","","","","9104","","","mehpgn.las","mehpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_380[] = {"1487","NAD83 to NAD83(HARN) (14)","","","","United States (USA) - Michigan.","9613","","","","","","","","","9104","","","mihpgn.las","mihpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_381[] = {"1488","NAD83 to NAD83(HARN) (15)","","","","United States (USA) - Mississippi.","9613","","","","","","","","","9104","","","mshpgn.las","mshpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_382[] = {"1489","NAD83 to NAD83(HARN) (16)","","","","United States (USA) - Nebraska.","9613","","","","","","","","","9104","","","nbhpgn.las","nbhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_383[] = {"1490","NAD83 to NAD83(HARN) (17)","","","","United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.","9613","","","","","","","","","9104","","","nehpgn.las","nehpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positiv [...]
+datafile_rows_t trf_nonpolynomial_row_384[] = {"1491","NAD83 to NAD83(HARN) (18)","","","","United States (USA) - New Mexico.","9613","","","","","","","","","9104","","","nmhpgn.las","nmhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_385[] = {"1492","NAD83 to NAD83(HARN) (19)","","","","United States (USA) - New York.","9613","","","","","","","","","9104","","","nyhpgn.las","nyhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_386[] = {"1493","NAD83 to NAD83(HARN) (20)","","","","United States (USA) - North Dakota.","9613","","","","","","","","","9104","","","ndhpgn.las","ndhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_387[] = {"1494","NAD83 to NAD83(HARN) (21)","","","","United States (USA) - Oklahoma.","9613","","","","","","","","","9104","","","okhpgn.las","okhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_388[] = {"1495","NAD83 to NAD83(HARN) (22)","","","","United States (USA) - Puerto Rico and the Virgin Islands.","9613","","","","","","","","","9104","","","pvhpgn.las","pvhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_389[] = {"1496","NAD83 to NAD83(HARN) (23)","","","","United States (USA) - South Dakota.","9613","","","","","","","","","9104","","","sdhpgn.las","sdhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_390[] = {"1497","NAD83 to NAD83(HARN) (24)","","","","United States (USA) - Tennessee","9613","","","","","","","","","9104","","","tnhpgn.las","tnhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_391[] = {"1498","NAD83 to NAD83(HARN) (25)","","","","United States (USA) - Texas east of 100deg West.","9613","","","","","","","","","9104","","","ethpgn.las","ethpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_392[] = {"1499","NAD83 to NAD83(HARN) (26)","","","","United States (USA) - Texas west of 100deg West.","9613","","","","","","","","","9104","","","wthpgn.las","wthpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_393[] = {"1500","NAD83 to NAD83(HARN) (27)","","","","United States (USA) - Virginia.","9613","","","","","","","","","9104","","","vahpgn.las","vahpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_394[] = {"1501","NAD83 to NAD83(HARN) (28)","","","","United States (USA) - Oregan; Washington.","9613","","","","","","","","","9104","","","wohpgn.las","wohpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_395[] = {"1502","NAD83 to NAD83(HARN) (29)","","","","United States (USA) - Wisconsin.","9613","","","","","","","","","9104","","","wihpgn.las","wihpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_396[] = {"1503","NAD83 to NAD83(HARN) (30)","","","","United States (USA) - Wyoming.","9613","","","","","","","","","9104","","","wyhpgn.las","wyhpgn.los","","1999-10-20 00:00:00","US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file","EPSG","Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_397[] = {"1504","Cape to Hartbeesthoek94 (1)","","","","South Africa.","9603","-134.73","-110.92","-292.66","","","","","9001","","","","","","","1999-10-20 00:00:00","Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_398[] = {"1505","Hartbeesthoek94 to WGS 84 (1)","","","","South Africa.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1999-10-20 00:00:00","EPSG","EPSG","For many purposes Hartbeesthoek94 datum can be considered to be coincident with WGS 84.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_399[] = {"1506","AGD66 to GDA94 (6)","","","","Australia - Tasmania.","9615","","","","","","","","","9104","","","tas_1098.gsb","","","1999-10-20 00:00:00","http://www.delm.tas.gov.au/osg/Geodetic_transform.htm","EPSG","0.1m accuracy.  Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_400[] = {"1507","AGD66 to GDA94 (7)","","","","Australia - Northern Territory.","9615","","","","","","","","","9104","","","nt_0599.gsb","","","1999-10-20 00:00:00","http://www.anzlic.org.au/icsm/gdatm/chapter7.htm#high","EPSG","0.1m accuracy.  Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_401[] = {"1508","CH1903 to WGS 84 (1)","","","","Liechtenstein;  Switzerland.","9607","660.077","13.551","369.344","2.484","1.783","2.939","5.66","9001","9113","","9202","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","Implemented in Bundesamt f�r Landestopographie programme GRANIT.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_402[] = {"1509","CH1903+ to CHTRF95 (1)","","","","Liechtenstein;  Switzerland.","9603","674.374","15.056","405.346","","","","","9001","","","","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_403[] = {"1510","CH1903 to WGS 84 (2)","","","","Liechtenstein;  Switzerland.","9603","674.374","15.056","405.346","","","","","9001","","","","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the ac [...]
+datafile_rows_t trf_nonpolynomial_row_404[] = {"1511","CHTRF95 to WGS 84 (1)","","","","Liechtenstein;  Switzerland.","9603","0.0","0.0","0.0","","","","","9001","","","","","","","1999-10-20 00:00:00","EPSG","EPSG","For many purposes CHTRF95 can be considered to be coincident with WGS 84.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_405[] = {"1512","Rassadiran to WGS 84 (1)","","","","Iran - Taheri refinery site only.","9603","-133.63","-157.5","-158.62","","","","","9001","","","","","","","1999-10-20 00:00:00","Total-Fina","EPSG","Used only for terminal site.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_406[] = {"1513","FD58 to WGS 84 (1)","","","","Iran - Kangan district.","9603","-241.54","-163.64","396.06","","","","","9001","","","","","","","1999-10-20 00:00:00","Total-Fina","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_407[] = {"1514","ED50(ED77) to WGS 84 (1)","","","","Iran","9606","-110.33","-97.73","-119.85","0.3423","1.1634","0.2715","0.063","9001","9104","","9202","","","","1999-10-20 00:00:00","National Cartographic Centre of Iran","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_408[] = {"1515","NAD83 to WGS 84 (5)","","","","United States (USA)","9607","-0.991","1.9072","0.5129","-0.000000125033","-0.000000046785","-0.000000056529","0.0","9001","9101","","9202","","","","1999-11-05 00:00:00"," http://www.ngs.noaa.gov/CORS/Derivation.html","EPSG","Strictly between NAD83 and ITRF96(1997.0).  Supersedes NAD83 to WGS 84 (4) (code 1308).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_409[] = {"1516","La Canoa to WGS 84 (1)","","","","Venezuela east - Delta Amacuro; Anzoategui; Bolivar; Monagas; Sucre states.","9603","-273.5","110.6","-357.9","","","","","9001","","","","","","","1999-11-05 00:00:00","Lagoven; Gonzalez Losano y Rodriguez; \"Determination de los Parametros de Transformacion para el Oriente del Pais\"; VII Venezuelan Geophysical Congress; September 1994.","EPSG","Also used for PSAD56 to WGS 84 transformations.  Para [...]
+datafile_rows_t trf_nonpolynomial_row_410[] = {"10101","Alabama CS27 East zone","Alabama East","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.3","-85.5","","","0.99996","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_411[] = {"10102","Alabama CS27 West zone","Alabama West","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.0","-87.3","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_412[] = {"10131","Alabama CS83 East zone","Alabama East","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.3","-85.5","","","0.99996","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_413[] = {"10132","Alabama CS83 West zone","Alabama West","","","United States (USA) - Alabama - Counties east of 86d 37m West.","9807","30.0","-87.3","","","0.999933333","600000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_414[] = {"10201","Arizona Coordinate System  east zone","Arizona East","","","United States (USA) - Arizona - Apache; Cochise; Gila; Graham; Greenlee and Navajo counties; i.e. east of about 110d 45m West.","9807","31.0","-110.1","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_415[] = {"10202","Arizona Coordinate System Central zone","Arizona Central","","","United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west","9807","31.0","-111.55","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_416[] = {"10203","Arizona Coordinate System  west zone","Arizona West","","","United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m","9807","31.0","-113.45","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_417[] = {"10231","Arizona CS83  east zone","Arizona  East","","","United States (USA) - Arizona - counties east of 110d 45m West","9807","31.0","-110.1","","","0.9999","213360.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","State law defines origin in International feet. FE = 700000ft.","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_418[] = {"10232","Arizona CS83 Central zone","Arizona Central","","","United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west","9807","31.0","-111.55","","","0.9999","213360.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","State law defines origin in International feet. FE = 700000ft.","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_419[] = {"10233","Arizona CS83  west zone","Arizona West","","","United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m","9807","31.0","-113.45","","","0.999933333","213360.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","State law defines origin in International feet. FE = 700000ft.","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_420[] = {"10301","Arkansas CS27 North","Arkansas North","","","United States (USA) - Arkansas - counties north of 34d 50m North.","9802","34.2","-92.0","36.14","34.56","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_421[] = {"10302","Arkansas CS27 South","Arkansas South","","","United States (USA) - Arkansas - counties south of 34d 50m North.","9802","32.4","-92.0","34.46","33.18","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_422[] = {"10331","Arkansas CS83 North zone","Arkansas North","","","United States (USA) - Arkansas - counties north of 34d 50m North.","9802","34.2","-92.0","36.14","34.56","","400000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_423[] = {"10332","Arkansas CS83 South zone","Arkansas South","","","United States (USA) - Arkansas - counties south of 34d 50m North.","9802","32.4","-92.0","34.46","33.18","","400000.0","400000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_424[] = {"10401","California CS27 zone I","California zone I","","","United States (USA) - California - counties north of 40deg North.","9802","39.2","-122.0","41.4","40.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_425[] = {"10402","California CS27 zone II","California zone II","","","United States (USA) - California - counties between 40d & 38d 15m North.","9802","37.4","-122.0","39.5","38.2","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_426[] = {"10403","California CS27 zone III","California zone III","","","United States (USA) - California - counties between 38d 15m & 37d North.","9802","36.3","-120.3","38.26","37.04","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_427[] = {"10404","California CS27 zone IV","California zone IV","","","United States (USA) - California - counties between 37d & 35d 30m North.","9802","35.2","-119.0","37.15","36.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_428[] = {"10405","California CS27 zone V","California zone V","","","United States (USA) - California - counties between 35d 50m & 34d North.","9802","33.3","-118.0","35.28","34.02","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_429[] = {"10406","California CS27 zone VI","California zone VI","","","United States (USA) - California - counties south of 34deg North.","9802","32.1","-116.15","33.53","32.47","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_430[] = {"10407","California CS27 zone VII","California zone VII","","","United States (USA) - California - Los Angeles.","9802","34.08","-118.2","34.25","33.52","","4186692.58","416926.74","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_431[] = {"10431","California CS83 zone 1","California zone 1","","","United States (USA) - California - counties north of 40deg North.","9802","39.2","-122.0","41.4","40.0","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_432[] = {"10432","California CS83 zone 2","California zone 2","","","United States (USA) - California - counties between 40d & 38d 15m North.","9802","37.4","-122.0","39.5","38.2","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_433[] = {"10433","California CS83 zone 3","California zone 3","","","United States (USA) - California - counties between 38d 15m & 37d North.","9802","36.3","-120.3","38.26","37.04","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_434[] = {"10434","California CS83 zone 4","California zone 4","","","United States (USA) - California - counties between 37d & 35d 30m North.","9802","35.2","-119.0","37.15","36.0","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_435[] = {"10435","California CS83 zone 5","California zone 5","","","United States (USA) - California - counties between 35d 50m & 34d North.","9802","33.3","-118.0","35.28","34.02","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_436[] = {"10436","California CS83 zone 6","California zone 6","","","United States (USA) - California - counties south of 34deg North.","9802","32.1","-116.15","33.53","32.47","","2000000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_437[] = {"10501","Colorado CS27 North zone","Colorado North","","","United States (USA) - Colorado - counties north of 39d 50m North.","9802","39.2","-105.3","39.43","40.47","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_438[] = {"10502","Colorado CS27 Central zone","Colorado Central","","","United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.","9802","37.5","-105.3","39.45","38.27","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_439[] = {"10503","Colorado CS27 South zone","Colorado South","","","United States (USA) - Colorado - counties south of 38d 30m North.","9802","36.4","-105.3","38.26","37.14","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_440[] = {"10531","Colorado CS83 North zone","Colorado North","","","United States (USA) - Colorado - counties north of 39d 50m North.","9802","39.2","-105.3","40.47","39.43","","914401.8289","304800.6096","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_441[] = {"10532","Colorado CS83 Central zone","Colorado Central","","","United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.","9802","37.5","-105.3","39.45","38.27","","914401.8289","304800.6096","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_442[] = {"10533","Colorado CS83 South zone","Colorado South","","","United States (USA) - Colorado - counties south of 38d 30m North.","9802","36.4","-105.3","38.26","37.14","","914401.8289","304800.6096","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_443[] = {"10600","Connecticut CS27","Connecticut","","","United States (USA) - Connecticut.","9802","40.5","-72.45","41.52","41.12","","600000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_444[] = {"10630","Connecticut CS83","Connecticut","","","United States (USA) - Connecticut.","9802","40.5","-72.45","41.52","41.12","","304800.6096","152400.3048","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_445[] = {"10700","Delaware CS27","Delaware","","","United States (USA) - Delaware.","9807","38.0","-75.25","","","0.999995","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_446[] = {"10730","Delaware CS83","Delaware","","","United States (USA) - Delaware.","9807","38.0","-75.25","","","0.999995","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_447[] = {"10901","Florida CS27 East zone","Florida East","","","United States (USA) - Florida - counties east of 81d 45m West.","9807","24.2","-81.0","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_448[] = {"10902","Florida CS27 West zone","Florida West","","","United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.","9807","24.2","-82.0","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_449[] = {"10903","Florida CS27 North zone","Florida North","","","United States (USA) - Florida - north of 29d 30m North & west of 82d West.","9802","29.0","-84.3","30.45","29.35","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_450[] = {"10931","Florida CS83 East zone","Florida  East","","","United States (USA) - Florida - counties east of 81d 45m West.","9807","24.2","-81.0","","","0.999941177","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_451[] = {"10932","Florida CS83 West zone","Florida  West","","","United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.","9807","24.2","-82.0","","","0.999941177","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_452[] = {"10933","Florida CS83 North zone","Florida North","","","United States (USA) - Florida - north of 29d 30m North & west of 82d West.","9802","29.0","-84.3","30.45","29.35","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_453[] = {"11001","Georgia CS27 East zone","Georgia East","","","United States (USA) - Georgia - counties east of 83d 15m West.","9807","30.0","-82.1","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_454[] = {"11002","Georgia CS27 West zone","Georgia West","","","United States (USA) - Georgia - counties west of 83d 15m West.","9807","30.0","-84.1","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_455[] = {"11031","Georgia CS83 East zone","Georgia  East","","","United States (USA) - Georgia - counties east of 83d 15m West.","9807","30.0","-82.1","","","0.9999","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_456[] = {"11032","Georgia CS83 West zone","Georgia West","","","United States (USA) - Georgia - counties west of 83d 15m West.","9807","30.0","-84.1","","","0.9999","700000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_457[] = {"11101","Idaho CS27 East zone","Idaho East","","","United States (USA) - Idaho - counties east of 113d West.","9807","41.4","-112.1","","","0.999947368","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_458[] = {"11102","Idaho CS27 Central zone","Idaho Central","","","United States (USA) - Idaho - counties between 113d & 115d West.","9807","41.4","-114.0","","","0.999947368","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_459[] = {"11103","Idaho CS27 West zone","Idaho West","","","United States (USA) - Idaho - counties west of 115d West.","9807","41.4","-115.45","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_460[] = {"11131","Idaho CS83 East zone","Idaho  East","","","United States (USA) - Idaho - counties east of 113d West.","9807","41.4","-112.1","","","0.999947368","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_461[] = {"11132","Idaho CS83 Central zone","Idaho  Central","","","United States (USA) - Idaho - counties between 113d & 115d West.","9807","41.4","-114.0","","","0.999947368","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_462[] = {"11133","Idaho CS83 West zone","Idaho  West","","","United States (USA) - Idaho - counties west of 115d West.","9807","41.4","-115.45","","","0.999933333","800000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_463[] = {"11201","Illinois CS27 East zone","Illinois East","","","United States (USA) - Illinois - counties east of 89d 05m West.","9807","36.4","-88.2","","","0.999975","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_464[] = {"11202","Illinois CS27 West zone","Illinois West","","","United States (USA) - Illinois - counties west of 89d 05m West.","9807","36.4","-90.1","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_465[] = {"11231","Illinois CS83 East zone","Illinois  East","","","United States (USA) - Illinois - counties east of 89d 05m West.","9807","36.4","-88.2","","","0.999975","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_466[] = {"11232","Illinois CS83 West zone","Illinois  West","","","United States (USA) - Illinois - counties west of 89d 05m West.","9807","36.4","-90.1","","","0.999941177","700000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_467[] = {"11301","Indiana CS27 East zone","Indiana East","","","United States (USA) - Indiana - counties east of 86d 25m West.","9807","37.3","-85.4","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_468[] = {"11302","Indiana CS27 West zone","Indiana West","","","United States (USA) - Indiana - counties west of 86d 25m West.","9807","37.3","-87.05","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_469[] = {"11331","Indiana CS83 East zone","Indiana  East","","","United States (USA) - Indiana - counties east of 86d 25m West.","9807","37.3","-85.4","","","0.999966667","100000.0","250000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_470[] = {"11332","Indiana CS83 West zone","Indiana  West","","","United States (USA) - Indiana - counties west of 86d 25m West.","9807","37.3","-87.05","","","0.999966667","900000.0","250000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_471[] = {"11401","Iowa CS27 North zone","Iowa North","","","United States (USA) - Iowa - counties north of 42deg North.","9802","41.3","-93.3","43.16","42.04","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_472[] = {"11402","Iowa CS27 South zone","Iowa South","","","United States (USA) - Iowa - counties south of 42deg North.","9802","40.0","-93.3","41.47","40.37","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_473[] = {"11431","Iowa CS83 North zone","Iowa North","","","United States (USA) - Iowa - counties north of 42deg North.","9802","41.3","-93.3","43.16","42.04","","1500000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_474[] = {"11432","Iowa CS83 South zone","Iowa South","","","United States (USA) - Iowa - counties south of 42deg North.","9802","40.0","-93.3","41.47","40.37","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_475[] = {"11501","Kansas CS27 North zone","Kansas North","","","United States (USA) - Kansas - counties north of 38d 45m North.","9802","38.2","-98.0","39.47","38.43","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_476[] = {"11502","Kansas CS27 South zone","Kansas South","","","United States (USA) - Kansas - counties south of 38d 45m North.","9802","36.4","-98.3","38.34","37.16","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_477[] = {"11531","Kansas CS83 North zone","Kansas North","","","United States (USA) - Kansas - counties north of 38d 45m North.","9802","38.2","-98.0","39.47","38.43","","400000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_478[] = {"11532","Kansas CS83 South zone","Kansas South","","","United States (USA) - Kansas - counties south of 38d 45m North.","9802","36.4","-98.3","38.34","37.16","","400000.0","400000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_479[] = {"11601","Kentucky CS27 North zone","Kentucky North","","","United States (USA) - Kentucky - counties north of 37d 55m North.","9802","37.3","-84.15","37.58","38.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_480[] = {"11602","Kentucky CS27 South zone","Kentucky South","","","United States (USA) - Kentucky - counties south of 37d 55m North.","9802","36.2","-85.45","36.44","37.56","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_481[] = {"11631","Kentucky CS83 North zone","Kentucky North","","","United States (USA) - Kentucky - counties north of 37d 55m North.","9802","37.3","-84.15","37.58","37.58","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_482[] = {"11632","Kentucky CS83 South zone","Kentucky South","","","United States (USA) - Kentucky - counties south of 37d 55m North.","9802","36.2","-85.45","37.56","36.44","","500000.0","500000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_483[] = {"11701","Louisiana CS27 North zone","Louisiana North","","","United States (USA) - Louisiana - counties north of 30d 55m North.","9802","30.4","-92.3","31.1","32.4","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_484[] = {"11702","Louisiana CS27 South zone","Louisiana South","","","United States (USA) - Louisiana - counties south of 30d 55m North. Also Gulf of Mexico LA shelf.","9802","28.4","-91.2","29.18","30.42","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_485[] = {"11731","Louisiana CS83 North zone","Louisiana North","","","United States (USA) - Louisiana - counties north of 30d 55m North.","9802","30.3","-92.3","32.4","31.1","","1000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_486[] = {"11732","Louisiana CS83 South zone","Louisiana South","","","United States (USA) - Louisiana - counties south of 30d 55m North.","9802","28.3","-91.2","30.42","29.18","","1000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_487[] = {"11801","Maine CS27 East zone","Maine East","","","United States (USA) - Maine - counties east of 69d 30m West.","9807","43.5","-68.3","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_488[] = {"11802","Maine CS27 West zone","Maine West","","","United States (USA) - Maine - counties west of 69d 30m West.","9807","42.5","-70.1","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_489[] = {"11831","Maine CS83 East zone","Maine  East","","","United States (USA) - Maine - counties east of 69d 30m West.","9807","43.4","-68.3","","","0.9999","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_490[] = {"11832","Maine CS83 West zone","Maine  West","","","United States (USA) - Maine - counties west of 69d 30m West.","9807","42.5","-70.1","","","0.999966667","900000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_491[] = {"11900","Maryland CS27","Maryland","","","United States (USA) - Maryland.","9802","37.5","-77.0","38.18","39.27","","800000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_492[] = {"11930","Maryland CS83","Maryland","","","United States (USA) - Maryland.","9802","37.4","-77.0","39.27","38.18","","400000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_493[] = {"12001","Massachusetts CS27 Mainland zone","Massachusetts Mainland","","","United States (USA) - Massachusetts onshore.","9802","41.0","-71.3","41.43","42.41","","600000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_494[] = {"12002","Massachusetts CS27 Island zone","Massachusetts Island","","","United States (USA) - Massachusetts islands.","9802","41.0","-70.3","41.17","41.29","","200000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_495[] = {"12031","Massachusetts CS83 Mainland zone","Massachusetts Mainland","","","United States (USA) - Massachusetts onshore.","9802","41.0","-71.3","42.41","41.43","","200000.0","750000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_496[] = {"12032","Massachusetts CS83 Island zone","Massachusetts Island","","","United States (USA) - Massachusetts islands.","9802","41.0","-70.3","41.29","41.17","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_497[] = {"12101","Michigan State Plane East zone","Michigan East","","","United States (USA) - Michigan.","9807","41.3","-83.4","","","0.999942857","500000.0","0.0","9003","9110","8901","","","","","1998-11-11 00:00:00","USGS Professional Paper #1395","EPSG","Obsolete. Superseded by north central and south zones.","95.30  96.29  98.22",NULL};
+datafile_rows_t trf_nonpolynomial_row_498[] = {"12102","Michigan State Plane Old Central zone","Michigan Old Central","","","United States (USA) - Michigan.","9807","41.3","-85.45","","","0.999909091","500000.0","0.0","9003","9110","8901","","","","","1998-11-11 00:00:00","USGS Professional Paper #1395","EPSG","Obsolete. Superseded by north central and south zones.","95.30  96.29  98.22",NULL};
+datafile_rows_t trf_nonpolynomial_row_499[] = {"12103","Michigan State Plane West zone","Michigan West","","","United States (USA) - Michigan.","9807","41.3","-88.45","","","0.999909091","500000.0","0.0","9003","9110","8901","","","","","1998-11-11 00:00:00","USGS Professional Paper #1395","EPSG","Obsolete. Superseded by north central and south zones.","95.30  96.29  98.22",NULL};
+datafile_rows_t trf_nonpolynomial_row_500[] = {"12111","Michigan CS27 North zone","Michigan North","","","United States (USA) - Michigan - counties north of 45d 45m North.","9802","44.47","-87.0","45.29","47.05","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.28  96.29  98.22  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_501[] = {"12112","Michigan CS27 Central zone","Michigan Central","","","United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.","9802","43.19","-84.2","44.11","45.42","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.28  96.29  98.22  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_502[] = {"12113","Michigan CS27 South zone","Michigan South","","","United States (USA) - Michigan - counties south of 43d 55m North.","9802","41.3","-84.2","42.06","43.4","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.28  96.29  98.22  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_503[] = {"12141","Michigan CS83 North zone","Michigan North","","","United States (USA) - Michigan - counties north of 45d 45m North.","9802","44.47","-87.0","47.05","45.29","","8000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_504[] = {"12142","Michigan CS83 Central zone","Michigan Central","","","United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.","9802","43.19","-84.22","45.42","44.11","","6000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_505[] = {"12143","Michigan CS83 South zone","Michigan South","","","United States (USA) - Michigan - counties south of 43d 55m North.","9802","41.3","-84.22","43.4","42.06","","4000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_506[] = {"12201","Minnesota CS27 North zone","Minnesota North","","","United States (USA) - Minnesota - counties north of 47d 10m North.","9802","46.3","-93.06","47.02","48.38","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_507[] = {"12202","Minnesota CS27 Central zone","Minnesota Central","","","United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.","9802","45.0","-94.15","45.37","47.03","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_508[] = {"12203","Minnesota CS27 South zone","Minnesota South","","","United States (USA) - Minnesota - counties south of 45d 30m North.","9802","43.0","-94.0","43.47","45.13","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_509[] = {"12231","Minnesota CS83 North zone","Minnesota North","","","United States (USA) - Minnesota - counties north of 47d 10m North.","9802","46.3","-93.06","48.38","47.02","","800000.0","100000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_510[] = {"12232","Minnesota CS83 Central zone","Minnesota Central","","","United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.","9802","45.0","-94.15","47.03","45.37","","800000.0","100000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_511[] = {"12233","Minnesota CS83 South zone","Minnesota South","","","United States (USA) - Minnesota - counties south of 45d 30m North.","9802","43.0","-94.0","45.13","43.47","","800000.0","100000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_512[] = {"12301","Mississippi CS27 East zone","Mississippi East","","","United States (USA) - Mississippi - counties east of 89d 40m West.","9807","29.4","-88.5","","","0.99996","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_513[] = {"12302","Mississippi CS27 West zone","Mississippi West","","","United States (USA) - Mississippi - counties west of 89d 40m West.","9807","30.3","-90.2","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_514[] = {"12331","Mississippi CS83 East zone","Mississippi East","","","United States (USA) - Mississippi - counties east of 89d 40m West.","9807","29.3","-88.5","","","0.99995","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_515[] = {"12332","Mississippi CS83 West zone","Mississippi West","","","United States (USA) - Mississippi - counties west of 89d 40m West.","9807","29.3","-90.2","","","0.99995","700000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_516[] = {"12401","Missouri CS27 East zone","Missouri East","","","United States (USA) - Missouri - counties east of 91d 45m West.","9807","35.5","-90.3","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.18  95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_517[] = {"12402","Missouri CS27 Central zone","Missouri Central","","","United States (USA) - Missouri - counties between 91d 45m & 93d 35m West.","9807","35.5","-92.3","","","0.999933333","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_518[] = {"12403","Missouri CS27 West zone","Missouri West","","","United States (USA) - Missouri - counties west of 93d 35m West.","9807","36.1","-94.3","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_519[] = {"12431","Missouri CS83 East zone","Missouri  East","","","United States (USA) - Missouri - counties east of 91d 45m West..","9807","35.5","-90.3","","","0.999933333","250000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_520[] = {"12432","Missouri CS83 Central zone","Missouri Central","","","United States (USA) - Missouri - counties between 91d 45m & 93d 35m West","9807","35.5","-92.3","","","0.999933333","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_521[] = {"12433","Missouri CS83 West zone","Missouri  West","","","United States (USA) - Missouri - counties west of 93d 35m West.","9807","36.1","-94.3","","","0.999941177","850000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_522[] = {"12501","Montana CS27 North zone","Montana North","","","United States (USA) - Montana - counties north of 47d 50m North.","9802","47.0","-109.3","48.43","47.51","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_523[] = {"12502","Montana CS27 Central zone","Montana Central","","","United States (USA) - Montana - counties between 47d 50m & 46d 40m North.","9802","45.5","-109.3","47.53","46.27","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_524[] = {"12503","Montana CS27 South zone","Montana South","","","United States (USA) - Montana - counties south of 46d 40m North.","9802","44.0","-109.3","46.24","44.52","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_525[] = {"12530","Montana CS83","Montana","","","United States (USA) - Montana.","9802","44.15","-109.3","49.0","45.0","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_526[] = {"12601","Nebraska CS27 North zone","Nebraska North","","","United States - Nebraska -Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler","9802","41.2","-100.0","41.51","42.49","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professio [...]
+datafile_rows_t trf_nonpolynomial_row_527[] = {"12602","Nebraska CS27 South zone","Nebraska South","","","United States (USA) - Nebraska - counties south of and including Scotts Bluff; Morrill; Garden; Arthur; McPherson; Logan; Custer; Valley; Greeley; Boome, Platte; Colfax; Dodge; Washington.","9802","39.4","-99.3","40.17","41.43","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_528[] = {"12630","Nebraska CS83","Nebraska","","","United States (USA) - Nebraska.","9802","39.5","-100.0","43.0","40.0","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_529[] = {"12701","Nevada CS27 East zone","Nevada East","","","United States (USA) - Nevada - counties east of 116d  West & Eureka county.","9807","34.45","-115.35","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_530[] = {"12702","Nevada CS27 Central zone","Nevada Central","","","United States (USA) - Nevada - Lander & Nye counties.","9807","34.45","-116.4","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_531[] = {"12703","Nevada CS27 West zone","Nevada West","","","United States (USA) - Nevada - counties west of 117d 15m West.","9807","34.45","-118.35","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_532[] = {"12731","Nevada CS83 East zone","Nevada  East","","","United States (USA) - Nevada - counties east of 116d  West & Eureka county.","9807","34.45","-115.35","","","0.9999","200000.0","8000000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_533[] = {"12732","Nevada CS83 Central zone","Nevada Central","","","United States (USA) - Nevada - Lander & Nye counties.","9807","34.45","-116.4","","","0.9999","500000.0","6000000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_534[] = {"12733","Nevada CS83 West zone","Nevada West","","","United States (USA) - Nevada - counties west of 117d 15m West.","9807","34.45","-118.35","","","0.9999","800000.0","4000000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_535[] = {"12800","New Hampshire CS27","New Hampshire","","","United States (USA) - New Hampshire.","9807","42.3","-71.4","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_536[] = {"12830","New Hampshire CS83","New Hampshire","","","United States (USA) - New Hampshire.","9807","42.3","-71.4","","","0.999966667","300000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_537[] = {"12900","New Jersey CS27","New Jersey","","","United States (USA) - New Jersey.","9807","38.5","-74.4","","","0.999975","2000000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_538[] = {"12930","New Jersey CS83","New Jersey","","","United States (USA) - New Jersey.","9807","38.5","-74.3","","","0.9999","150000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_539[] = {"13001","New Mexico CS27 East zone","New Mexico East","","","United States (USA) - New Mexico - counties east of 105d West.","9807","31.0","-104.2","","","0.999909091","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_540[] = {"13002","New Mexico CS27 Central zone","New Mexico Central","","","United States (USA) - New Mexico - counties between 105d & 107d 15m West.","9807","31.0","-106.15","","","0.9999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_541[] = {"13003","New Mexico CS27 West zone","New Mexico West","","","United States (USA) - New Mexico - counties west of 107d 15m West.","9807","31.0","-107.5","","","0.999916667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_542[] = {"13031","New Mexico CS83 East zone","New Mexico East","","","United States (USA) - New Mexico - counties east of 105d West.","9807","31.0","-104.2","","","0.999909091","165000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_543[] = {"13032","New Mexico CS83 Central zone","New Mexico Central","","","United States (USA) - New Mexico - counties between 105d & 107d 15m West.","9807","31.0","-106.15","","","0.9999","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_544[] = {"13033","New Mexico CS83 West zone","New Mexico West","","","United States (USA) - New Mexico - counties west of 107d 15m West.","9807","31.0","-107.5","","","0.999916667","830000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_545[] = {"13101","New York CS27 East zone","New York East","","","United States (USA) - New York - counties east of 75d 15m West excluding Long Island.","9807","40.0","-74.2","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.18  95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_546[] = {"13102","New York CS27 Central zone","New York Central","","","United States (USA) - New York - counties between 75d 15m & 77d 30m West.","9807","40.0","-76.35","","","0.9999375","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_547[] = {"13103","New York CS27 West zone","New York West","","","United States (USA) - New York - counties west of 77d 30m West.","9807","40.0","-78.35","","","0.9999375","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_548[] = {"13104","New York CS27 Long Island zone","New York Long Island","","","United States (USA) - New York - Long Island.","9802","40.3","-74.0","41.02","40.4","","1000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_549[] = {"13131","New York CS83 East zone","New York  East","","","United States (USA) - New York - counties east of 75d 15m West excluding Long Island.","9807","38.5","-74.3","","","0.9999","150000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_550[] = {"13132","New York CS83 Central zone","New York Central","","","United States (USA) - New York - counties between 75d 15m & 77d 30m West.","9807","40.0","-76.35","","","0.9999375","250000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_551[] = {"13133","New York CS83 West zone","New York  West","","","United States (USA) - New York - counties west of 77d 30m West.","9807","40.0","-78.35","","","0.9999375","350000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_552[] = {"13134","New York CS83 Long Island zone","New York Long Island","","","United States (USA) - New York - Long Island.","9802","40.1","-74.0","41.02","40.4","","300000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_553[] = {"13200","North Carolina CS27","North Carolina","","","United States (USA) - North Carolina.","9802","33.45","-79.0","34.2","36.1","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_554[] = {"13230","North Carolina CS83","North Carolina","","","United States (USA) - North Carolina.","9802","33.45","-79.0","36.1","34.2","","609601.22","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_555[] = {"13301","North Dakota CS27 North zone","North Dakota North","","","United States (USA) - North Dakota - counties north of 47d 25m North.","9802","47.0","-100.3","47.26","48.44","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_556[] = {"13302","North Dakota CS27 South zone","North Dakota South","","","United States (USA) - North Dakota - counties south of 47d 25m North.","9802","45.4","-100.3","46.11","47.29","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_557[] = {"13331","North Dakota CS83 North zone","North Dakota North","","","United States (USA) - North Dakota - counties north of 47d 25m North.","9802","47.0","-100.3","48.44","47.26","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_558[] = {"13332","North Dakota CS83 South zone","North Dakota South","","","United States (USA) - North Dakota - counties south of 47d 25m North.","9802","45.4","-100.3","47.29","46.11","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_559[] = {"13401","Ohio CS27 North zone","Ohio North","","","United States (USA) - Ohio - counties north of 40d 15m North.","9802","39.4","-82.3","40.26","41.42","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_560[] = {"13402","Ohio CS27 South zone","Ohio South","","","United States (USA) - Ohio - counties south of 40d 15m North.","9802","38.0","-82.3","38.44","40.02","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_561[] = {"13431","Ohio CS83 North zone","Ohio North","","","United States (USA) - Ohio - counties north of 40d 15m North.","9802","39.4","-82.3","41.42","40.26","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_562[] = {"13432","Ohio CS83 South zone","Ohio South","","","United States (USA) - Ohio - counties south of 40d 15m North.","9802","38.0","-82.3","40.02","38.44","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_563[] = {"13501","Oklahoma CS27 North zone","Oklahoma North","","","United States (USA) - Oklahoma - counties north of 35d 20m North.","9802","35.0","-98.0","35.34","36.46","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_564[] = {"13502","Oklahoma CS27 South zone","Oklahoma South","","","United States (USA) - Oklahoma - counties south of 35d 20m North.","9802","33.2","-98.0","33.56","35.14","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_565[] = {"13531","Oklahoma CS83 North zone","Oklahoma North","","","United States (USA) - Oklahoma - counties north of 35d 20m North.","9802","35.0","-98.0","36.46","35.34","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_566[] = {"13532","Oklahoma CS83 South zone","Oklahoma South","","","United States (USA) - Oklahoma - counties south of 35d 20m North.","9802","33.2","-98.0","35.14","33.56","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_567[] = {"13601","Oregon CS27 North zone","Oregon North","","","United States (USA) - Oregon - counties north of 44d 15m North.","9802","43.4","-120.3","44.2","46.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_568[] = {"13602","Oregon CS27 South zone","Oregon South","","","United States (USA) - Oregon - counties south of 44d 15m North.","9802","41.4","-120.3","42.2","44.0","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_569[] = {"13631","Oregon CS83 North zone","Oregon North","","","United States (USA) - Oregon - counties north of 44d 15m North.","9802","43.4","-120.3","46.0","44.2","","2500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_570[] = {"13632","Oregon CS83 South zone","Oregon South","","","United States (USA) - Oregon - counties south of 44d 15m North.","9802","41.4","-120.3","44.0","42.2","","1500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_571[] = {"13701","Pennsylvania CS27 North zone","Pennsylvania North","","","United States (USA) - Pennsylvania - counties north of 40d 50m North.","9802","40.1","-77.45","40.53","41.57","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_572[] = {"13702","Pennsylvania CS27 South zone","Pennsylvania South","","","United States (USA) - Pennsylvania - counties south of 40d 50m North.","9802","39.2","-77.45","39.56","40.48","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_573[] = {"13731","Pennsylvania CS83 North zone","Pennsylvania North","","","United States (USA) - Pennsylvania - counties north of 40d 50m North.","9802","40.1","-77.45","41.57","40.53","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_574[] = {"13732","Pennsylvania CS83 South zone","Pennsylvania South","","","United States (USA) - Pennsylvania - counties south of 40d 50m North.","9802","39.2","-77.45","40.58","39.56","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_575[] = {"13800","Rhode Island CS27","Rhode Island","","","United States (USA) - Rhode Island.","9807","41.05","-71.3","","","0.9999938","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_576[] = {"13830","Rhode Island CS83","Rhode Island","","","United States (USA) - Rhode Island.","9807","41.05","-71.3","","","0.99999375","100000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_577[] = {"13901","South Carolina CS27 North zone","South Carolina North","","","United States (USA) - South Carolina counties north of and including Edgefield; Saluda; Lexington; Calhoun; Sumter; Florence; Marion & Horry.","9802","33.0","-81.0","33.46","34.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_578[] = {"13902","South Carolina CS27 South zone","South Carolina South","","","United States (USA) - South Carolina - Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg & Williamsburg counties.","9802","31.5","-81.0","32.2","33.4","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29 [...]
+datafile_rows_t trf_nonpolynomial_row_579[] = {"13930","South Carolina CS83","South Carolina","","","United States (USA) - South Carolina.","9802","31.5","-81.0","34.5","32.3","","609600.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_580[] = {"14001","South Dakota CS27 North zone","South Dakota North","","","United States (USA) - South Dakota - counties north of 44d 20m North.","9802","43.5","-100.0","44.25","45.41","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_581[] = {"14002","South Dakota CS27 South zone","South Dakota South","","","United States (USA) - South Dakota - counties south of 44d 20m North.","9802","42.2","-100.2","42.5","44.24","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_582[] = {"14031","South Dakota CS83 North zone","South Dakota North","","","United States (USA) - South Dakota - counties north of 44d 20m North.","9802","43.5","-100.0","45.41","44.25","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_583[] = {"14032","South Dakota CS83 South zone","South Dakota South","","","United States (USA) - South Dakota - counties south of 44d 20m North.","9802","42.2","-100.2","44.24","42.5","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_584[] = {"14100","Tennessee CS27","Tennessee","","","United States (USA) - Tennessee.","9802","34.4","-86.0","35.15","36.25","","100000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_585[] = {"14130","Tennessee CS83","Tennessee","","","United States (USA) - Tennessee.","9802","34.2","-86.0","36.25","35.15","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_586[] = {"14201","Texas CS27 North zone","Texas North","","","United States (USA) - Texas - counties north of 34d 20m North.","9802","34.0","-101.3","34.39","36.11","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_587[] = {"14202","Texas CS27 North Central zone","Texas North Central","","","United States (USA) - Texas - counties between 34d 20m & 32deg North.","9802","31.4","-97.3","32.08","33.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_588[] = {"14203","Texas CS27 Central zone","Texas Central","","","United States (USA) - Texas - counties between 32deg & 30d 10m North.","9802","29.4","-100.2","30.07","31.53","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_589[] = {"14204","Texas CS27 South Central zone","Texas South Central","","","United States (USA) - Texas - counties between 30d 10m & 28d 05m North.","9802","27.5","-99.0","28.23","30.17","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_590[] = {"14205","Texas CS27 South zone","Texas South","","","United States (USA) - Texas - counties south of 28d 05m North.","9802","25.4","-98.3","26.1","27.5","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_591[] = {"14231","Texas CS83 North zone","Texas North","","","United States (USA) - Texas - counties north of 34d 20m North.","9802","34.0","-101.3","36.11","34.39","","200000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_592[] = {"14232","Texas CS83 North Central zone","Texas North Central","","","United States (USA) - Texas - counties between 34d 20m & 32deg North.","9802","31.4","-98.3","33.58","32.08","","600000.0","2000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_593[] = {"14233","Texas CS83 Central zone","Texas Central","","","United States (USA) - Texas - counties between 32deg & 30d 10m North.","9802","29.4","-100.2","31.53","30.07","","700000.0","3000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_594[] = {"14234","Texas CS83 South Central zone","Texas South Central","","","United States (USA) - Texas - counties between 30d 10m & 28d 05m North.","9802","27.5","-99.0","30.17","28.23","","600000.0","4000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_595[] = {"14235","Texas CS83 South zone","Texas South","","","United States (USA) - Texas - counties south of 28d 05m North.","9802","25.4","-98.3","27.5","26.1","","300000.0","5000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_596[] = {"14301","Utah CS27 North zone","Utah North","","","United States (USA) - Utah - counties north of 40d 50m North.","9802","40.2","-111.3","40.43","41.47","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_597[] = {"14302","Utah CS27 Central zone","Utah Central","","","United States (USA) - Utah - counties between 40d 50m & 38d 30m North.","9802","38.2","-111.3","39.01","40.39","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_598[] = {"14303","Utah CS27 South zone","Utah South","","","United States (USA) - Utah - counties south of 38d 30m North.","9802","36.4","-111.3","37.13","38.21","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_599[] = {"14331","Utah CS83 North zone","Utah North","","","United States (USA) - Utah - counties north of 40d 50m North.","9802","40.2","-111.3","41.47","40.43","","500000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_600[] = {"14332","Utah CS83 Central zone","Utah Central","","","United States (USA) - Utah - counties between 40d 50m & 38d 30m North.","9802","38.2","-111.3","40.39","39.01","","500000.0","2000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_601[] = {"14333","Utah CS83 South zone","Utah South","","","United States (USA) - Utah - counties south of 38d 30m North.","9802","36.4","-111.3","38.21","37.13","","500000.0","3000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_602[] = {"14400","Vermont CS27","Vermont","","","United States (USA) - Vermont.","9807","42.3","-72.3","","","0.999964286","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_603[] = {"14430","Vermont CS83","Vermont","","","United States (USA) - Vermont.","9807","42.3","-72.3","","","0.999964286","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_604[] = {"14501","Virginia CS27 North zone","Virginia North","","","United States (USA) - Virginia - counties north of 38d 05m North.","9802","37.4","-78.3","38.02","39.12","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_605[] = {"14502","Virginia CS27 South zone","Virginia South","","","United States (USA) - Virginia - counties south of 38d 05m North.","9802","36.2","-78.3","36.46","37.58","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_606[] = {"14531","Virginia CS83 North zone","Virginia North","","","United States (USA) - Virginia - counties north of 38d 05m North.","9802","37.4","-78.3","39.12","38.02","","3500000.0","2000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_607[] = {"14532","Virginia CS83 South zone","Virginia South","","","United States (USA) - Virginia - counties south of 38d 05m North.","9802","36.2","-78.3","37.58","36.46","","3500000.0","1000000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_608[] = {"14601","Washington CS27 North zone","Washington North","","","United States (USA) - Washington - counties north of 47d 30m North.","9802","47.0","-120.5","47.3","48.44","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_609[] = {"14602","Washington CS27 South zone","Washington South","","","United States (USA) - Washington - counties south of 47d 30m North.","9802","45.2","-120.3","45.5","47.2","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_610[] = {"14631","Washington CS83 North zone","Washington North","","","United States (USA) - Washington - counties north of 47d 30m North.","9802","47.0","-120.5","48.44","47.3","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_611[] = {"14632","Washington CS83 South zone","Washington South","","","United States (USA) - Washington - counties south of 47d 30m North.","9802","45.2","-120.3","47.2","45.5","","500000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_612[] = {"14701","West Virginia CS27 North zone","West Virginia North","","","United States (USA) - West Virginia - counties north of 39deg North.","9802","38.3","-79.3","39.0","40.15","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_613[] = {"14702","West Virginia CS27 South zone","West Virginia South","","","United States (USA) - West Virginia - counties south of 39deg North.","9802","37.0","-81.0","37.29","38.53","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_614[] = {"14731","West Virginia CS83 North zone","West Virginia North","","","United States (USA) - West Virginia - counties north of 39deg North.","9802","38.3","-79.3","40.15","39.0","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_615[] = {"14732","West Virginia CS83 South zone","West Virginia South","","","United States (USA) - West Virginia - counties south of 39deg North.","9802","37.0","-81.0","38.53","37.29","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_616[] = {"14801","Wisconsin CS27 North zone","Wisconsin North","","","United States (USA) - Wisconsin - counties north of 45d 35m North.","9802","45.1","-90.0","45.34","46.46","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_617[] = {"14802","Wisconsin CS27 Central zone","Wisconsin Central","","","United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.","9802","43.5","-90.0","44.15","45.3","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_618[] = {"14803","Wisconsin CS27 South zone","Wisconsin South","","","United States (USA) - Wisconsin - counties south of 44d 15m North.","9802","42.0","-90.0","42.44","44.04","","2000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_619[] = {"14831","Wisconsin CS83 North zone","Wisconsin North","","","United States (USA) - Wisconsin - counties north of 45d 35m North.","9802","45.1","-90.0","46.46","45.34","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_620[] = {"14832","Wisconsin CS83 Central zone","Wisconsin Central","","","United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.","9802","43.5","-90.0","45.3","44.15","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_621[] = {"14833","Wisconsin CS83 South zone","Wisconsin South","","","United States (USA) - Wisconsin - counties south of 44d 15m North.","9802","42.0","-90.0","44.04","42.44","","600000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_622[] = {"14901","Wyoming CS27 East zone","Wyoming East","","","United States (USA) - Wyoming - counties east of 106d West.","9807","40.4","-105.1","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_623[] = {"14902","Wyoming CS27 East Central zone","Wyoming East Central","","","United States (USA) - Wyoming - counties between 106d & 108d 10m West.","9807","40.4","-107.2","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_624[] = {"14903","Wyoming CS27 West Central zone","Wyoming West Central","","","United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.","9807","40.4","-108.45","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_625[] = {"14904","Wyoming CS27 West zone","Wyoming West","","","United States (USA) - Wyoming - counties west of 109d 40m West.","9807","40.4","-110.05","","","0.999941177","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_626[] = {"14931","Wyoming CS83 East zone","Wyoming East","","","United States (USA) - Wyoming - counties east of 106d West.","9807","40.3","-105.1","","","0.9999375","200000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_627[] = {"14932","Wyoming CS83 East Central zone","Wyoming East Central","","","United States (USA) - Wyoming - counties between 106d & 108d 10m West.","9807","40.3","-107.2","","","0.9999375","400000.0","100000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_628[] = {"14933","Wyoming CS83 West Central zone","Wyoming West Central","","","United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.","9807","40.3","-108.45","","","0.9999375","600000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_629[] = {"14934","Wyoming CS83 West zone","Wyoming West","","","United States (USA) - Wyoming - counties west of 109d 40m West.","9807","40.3","-110.05","","","0.9999375","800000.0","100000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_630[] = {"15001","Alaska CS27 zone 1","Alaska zone 1","","","United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.","9812","57.0","-133.4","323.07483685","323.07483685","0.9999","16404166.67","-16404166.67","9003","9110","8901","","","","","1997-04-11 00:00:00","USGS Professional Paper #1395","EPSG","","96.29  97.08",NULL};
+datafile_rows_t trf_nonpolynomial_row_631[] = {"15002","Alaska CS27 zone 2","Alaska zone 2","","","United States (USA) - Alaska - 141deg to 144deg West.","9807","54.0","-142.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_632[] = {"15003","Alaska CS27 zone 3","Alaska zone 3","","","United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.","9807","54.0","-146.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_633[] = {"15004","Alaska CS27 zone 4","Alaska zone 4","","","United States (USA) - Alaska - 148deg to 152deg West.","9807","54.0","-150.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_634[] = {"15005","Alaska CS27 zone 5","Alaska zone 5","","","United States (USA) - Alaska - 152deg to 156deg West.","9807","54.0","-154.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_635[] = {"15006","Alaska CS27 zone 6","Alaska zone 6","","","United States (USA) - Alaska - 156deg to 160deg West.","9807","54.0","-158.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_636[] = {"15007","Alaska CS27 zone 7","Alaska zone 7","","","United States (USA) - Alaska - 160deg to 164deg West.","9807","54.0","-162.0","","","0.9999","700000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_637[] = {"15008","Alaska CS27 zone 8","Alaska zone 8","","","United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.","9807","54.0","-166.0","","","0.9999","500000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_638[] = {"15009","Alaska CS27 zone 9","Alaska zone 9","","","United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.","9807","54.0","-170.0","","","0.9999","600000.0","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_639[] = {"15010","Alaska CS27 zone 10","Alaska zone 10","","","United States (USA) - Alaska - Aleutian Islands.","9802","51.0","-176.0","53.5","51.5","","3000000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_640[] = {"15031","Alaska CS83 zone 1","Alaska zone 1","","","United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.","9812","57.0","-133.4","323.07483685","323.07483685","0.9999","5000000.0","-5000000.0","9001","9110","8901","","","","","1996-09-12 00:00:00","NOAA manual NOS NGS 5","EPSG","","96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_641[] = {"15032","Alaska CS83 zone 2","Alaska zone 2","","","United States (USA) - Alaska - 141deg to 144deg West.","9807","54.0","-142.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_642[] = {"15033","Alaska CS83 zone 3","Alaska zone 3","","","United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.","9807","54.0","-146.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_643[] = {"15034","Alaska CS83 zone 4","Alaska zone 4","","","United States (USA) - Alaska - 148deg to 152deg West.","9807","54.0","-150.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_644[] = {"15035","Alaska CS83 zone 5","Alaska zone 5","","","United States (USA) - Alaska - 152deg to 156deg West.","9807","54.0","-154.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_645[] = {"15036","Alaska CS83 zone 6","Alaska zone 6","","","United States (USA) - Alaska - 156deg to 160deg West.","9807","54.0","-158.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_646[] = {"15037","Alaska CS83 zone 7","Alaska zone 7","","","United States (USA) - Alaska - 160deg to 164deg West.","9807","54.0","-162.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_647[] = {"15038","Alaska CS83 zone 8","Alaska zone 8","","","United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.","9807","54.0","-166.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_648[] = {"15039","Alaska CS83 zone 9","Alaska zone 9","","","United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.","9807","54.0","-170.0","","","0.9999","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_649[] = {"15040","Alaska CS83 zone 10","Alaska zone 10","","","United States (USA) - Alaska - Aleutian Islands.","9802","51.0","-176.0","53.5","51.5","","1000000.0","0.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_650[] = {"15101","Hawaii CS27 zone 1","Hawaii zone 1","","","United States (USA) - Hawaii - island of Hawaii.","9807","18.5","-155.3","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_651[] = {"15102","Hawaii CS27 zone 2","Hawaii zone 2","","","United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","9807","20.2","-156.4","","","0.999966667","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_652[] = {"15103","Hawaii CS27 zone 3","Hawaii zone 3","","","United States (USA) - Hawaii - Oahu.","9807","21.1","-158.0","","","0.99999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_653[] = {"15104","Hawaii CS27 zone 4","Hawaii zone 4","","","United States (USA) - Hawaii - Kauai.","9807","21.5","-159.3","","","0.99999","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_654[] = {"15105","Hawaii CS27 zone 5","Hawaii zone 5","","","United States (USA) - Hawaii - Niihau.","9807","21.4","-160.1","","","1.0","500000.0","0.0","9003","9110","8901","","","","","1995-12-02 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_655[] = {"15131","Hawaii CS83 zone 1","Hawaii  zone 1","","","United States (USA) - Hawaii - island of Hawaii.","9807","18.5","-155.3","","","0.999966667","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_656[] = {"15132","Hawaii CS83 zone 2","Hawaii  zone 2","","","United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.","9807","20.2","-156.4","","","0.999966667","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_657[] = {"15133","Hawaii CS83 zone 3","Hawaii  zone 3","","","United States (USA) - Hawaii - Oahu.","9807","21.1","-158.0","","","0.99999","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_658[] = {"15134","Hawaii CS83 zone 4","Hawaii  zone 4","","","United States (USA) - Hawaii - Kauai.","9807","21.5","-159.3","","","0.99999","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_659[] = {"15135","Hawaii CS83 zone 5","Hawaii  zone 5","","","United States (USA) - Hawaii - Niihau.","9807","21.4","-160.1","","","1.0","500000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_660[] = {"15201","Puerto Rico CS27","Puerto Rico","","","Puerto Rico.","9802","17.5","-66.26","18.26","18.02","","500000.0","0.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_661[] = {"15202","St. Croix CS27","St. Croix","","","Virgin Islands of US - St. Croix.","9802","17.5","-66.26","18.26","18.02","","500000.0","100000.0","9003","9110","8901","","","","","1999-04-22 00:00:00","USGS Professional Paper #1395","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_662[] = {"15230","Puerto Rico & Virgin Islands CS83","Puerto Rico & Virgin Is.","","","Puerto Rico & Virgin Islands of US","9802","17.5","-66.26","18.26","18.02","","200000.0","200000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","NOAA manual NOS NGS 5","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_663[] = {"15914","BLM zone 14N in feet","BLM 14N (feet)","","","United States (USA) - Gulf of Mexico - west of 96 deg West approximately.","9807","0.0","-99.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 14\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_664[] = {"15915","BLM zone 15N in feet","BLM 15N (feet)","","","United States (USA) - Gulf of Mexico - 96 deg to 90 deg West approximately.","9807","0.0","-93.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 15\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_665[] = {"15916","BLM zone 16N in feet","BLM 16N (feet)","","","United States (USA) - Gulf of Mexico - 90 deg to 84 deg West approximately.","9807","0.0","-87.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 16\".","95.27  95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_666[] = {"15917","BLM zone 17N in feet","BLM 17N (feet)","","","United States (USA) - Gulf of Mexico - east of 84 deg West approximately.","9807","0.0","-81.0","","","0.9996","1640416.67","0.0","9003","9102","8901","","","","","1995-12-02 00:00:00","Minerals Management Service offshore protraction diagrams.","EPSG","Sometimes locally referred to as \"UTM zone 17\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_667[] = {"16001","UTM zone 1N","","","","180deg to 174deg West; northern hemisphere.","9807","0.0","-177.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_668[] = {"16002","UTM zone 2N","","","","174deg West to 168deg West; northern hemisphere.","9807","0.0","-171.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_669[] = {"16003","UTM zone 3N","","","","168deg West to 162deg West; northern hemisphere.","9807","0.0","-165.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_670[] = {"16004","UTM zone 4N","","","","162deg West to 156deg West; northern hemisphere.","9807","0.0","-159.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_671[] = {"16005","UTM zone 5N","","","","156deg West to 150deg West; northern hemisphere.","9807","0.0","-153.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_672[] = {"16006","UTM zone 6N","","","","150deg West to 144deg West; northern hemisphere.","9807","0.0","-147.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_673[] = {"16007","UTM zone 7N","","","","144deg West to 138deg West; northern hemisphere.","9807","0.0","-141.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_674[] = {"16008","UTM zone 8N","","","","138deg West to 132deg West; northern hemisphere.","9807","0.0","-135.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_675[] = {"16009","UTM zone 9N","","","","132deg West to 126deg West; northern hemisphere.","9807","0.0","-129.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_676[] = {"16010","UTM zone 10N","","","","130deg West to 120deg West; northern hemisphere.","9807","0.0","-123.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_677[] = {"16011","UTM zone 11N","","","","120deg West to 114deg West; northern hemisphere.","9807","0.0","-117.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_678[] = {"16012","UTM zone 12N","","","","114deg West to 108deg West; northern hemisphere.","9807","0.0","-111.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_679[] = {"16013","UTM zone 13N","","","","108deg West to 102deg West; northern hemisphere.","9807","0.0","-105.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_680[] = {"16014","UTM zone 14N","","","","102deg West to 96deg West; northern hemisphere.","9807","0.0","-99.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_681[] = {"16015","UTM zone 15N","","","","96deg West to 90deg West; northern hemisphere.","9807","0.0","-93.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_682[] = {"16016","UTM zone 16N","","","","90deg West to 84deg West; northern hemisphere.","9807","0.0","-87.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_683[] = {"16017","UTM zone 17N","","","","84deg West to 78deg West; northern hemisphere.","9807","0.0","-81.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_684[] = {"16018","UTM zone 18N","","","","78deg West to 72deg West; northern hemisphere.","9807","0.0","-75.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_685[] = {"16019","UTM zone 19N","","","","72deg West to 66deg West; northern hemisphere.","9807","0.0","-69.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_686[] = {"16020","UTM zone 20N","","","","66deg West to 60deg West; northern hemisphere.","9807","0.0","-63.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_687[] = {"16021","UTM zone 21N","","","","60deg West to 54deg West; northern hemisphere.","9807","0.0","-57.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_688[] = {"16022","UTM zone 22N","","","","54deg West to 48deg West; northern hemisphere.","9807","0.0","-51.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_689[] = {"16023","UTM zone 23N","","","","48deg West to 42deg West; northern hemisphere.","9807","0.0","-45.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_690[] = {"16024","UTM zone 24N","","","","42deg West to 36deg West; northern hemisphere.","9807","0.0","-39.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_691[] = {"16025","UTM zone 25N","","","","36deg West to 30deg West; northern hemisphere.","9807","0.0","-33.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_692[] = {"16026","UTM zone 26N","","","","30deg West to 24deg West; northern hemisphere.","9807","0.0","-27.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_693[] = {"16027","UTM zone 27N","","","","24deg West to 18deg West; northern hemisphere.","9807","0.0","-21.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_694[] = {"16028","UTM zone 28N","","","","18deg West to 12deg West; northern hemisphere.","9807","0.0","-15.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_695[] = {"16029","UTM zone 29N","","","","12deg West to 6deg West; northern hemisphere.","9807","0.0","-9.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_696[] = {"16030","UTM zone 30N","","","","6deg West to 0deg; northern hemisphere.","9807","0.0","-3.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_697[] = {"16031","UTM zone 31N","","","","0deg to 6deg East; northern hemisphere.","9807","0.0","3.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_698[] = {"16032","UTM zone 32N","","","","6deg East to 12deg East; northern hemisphere.","9807","0.0","9.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_699[] = {"16033","UTM zone 33N","","","","12deg East to 18deg East; northern hemisphere.","9807","0.0","15.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_700[] = {"16034","UTM zone 34N","","","","18deg East to 24deg East; northern hemisphere.","9807","0.0","21.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_701[] = {"16035","UTM zone 35N","","","","24deg East to 30deg East; northern hemisphere.","9807","0.0","27.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_702[] = {"16036","UTM zone 36N","","","","30deg East to 36deg East; northern hemisphere.","9807","0.0","33.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_703[] = {"16037","UTM zone 37N","","","","36deg East to 42deg East; northern hemisphere.","9807","0.0","39.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_704[] = {"16038","UTM zone 38N","","","","42deg East to 48deg East; northern hemisphere.","9807","0.0","45.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_705[] = {"16039","UTM zone 39N","","","","48deg East to 54deg East; northern hemisphere.","9807","0.0","51.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_706[] = {"16040","UTM zone 40N","","","","54deg East to 60deg East; northern hemisphere.","9807","0.0","57.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_707[] = {"16041","UTM zone 41N","","","","60deg East to 66deg East; northern hemisphere.","9807","0.0","63.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_708[] = {"16042","UTM zone 42N","","","","66deg East to 72deg East; northern hemisphere.","9807","0.0","69.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_709[] = {"16043","UTM zone 43N","","","","72deg East to 78deg East; northern hemisphere.","9807","0.0","75.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_710[] = {"16044","UTM zone 44N","","","","78deg East to 84deg East; northern hemisphere.","9807","0.0","81.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_711[] = {"16045","UTM zone 45N","","","","84deg East to 90deg East; northern hemisphere.","9807","0.0","87.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_712[] = {"16046","UTM zone 46N","","","","90deg East to 96deg East; northern hemisphere.","9807","0.0","93.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_713[] = {"16047","UTM zone 47N","","","","96deg East to 102eg East; northern hemisphere.","9807","0.0","99.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_714[] = {"16048","UTM zone 48N","","","","102deg East to 108deg East; northern hemisphere.","9807","0.0","105.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_715[] = {"16049","UTM zone 49N","","","","108deg East to 114deg East; northern hemisphere.","9807","0.0","111.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_716[] = {"16050","UTM zone 50N","","","","114deg East to 120deg East; northern hemisphere.","9807","0.0","117.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_717[] = {"16051","UTM zone 51N","","","","120deg East to 126deg East; northern hemisphere.","9807","0.0","123.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_718[] = {"16052","UTM zone 52N","","","","126deg East to 132deg East; northern hemisphere.","9807","0.0","129.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_719[] = {"16053","UTM zone 53N","","","","132deg East to 138deg East; northern hemisphere.","9807","0.0","135.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_720[] = {"16054","UTM zone 54N","","","","138deg East to 144deg East; northern hemisphere.","9807","0.0","141.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_721[] = {"16055","UTM zone 55N","","","","144deg East to 150deg East; northern hemisphere.","9807","0.0","147.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_722[] = {"16056","UTM zone 56N","","","","150deg East to 156deg East; northern hemisphere.","9807","0.0","153.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_723[] = {"16057","UTM zone 57N","","","","156deg East to 162deg East; northern hemisphere.","9807","0.0","159.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_724[] = {"16058","UTM zone 58N","","","","162deg East to 168deg East; northern hemisphere.","9807","0.0","165.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_725[] = {"16059","UTM zone 59N","","","","168deg East to 174deg East; northern hemisphere.","9807","0.0","171.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_726[] = {"16060","UTM zone 60N","","","","174deg East to 180deg; northern hemisphere.","9807","0.0","177.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_727[] = {"16061","Universal Polar Stereographic North","UPS North","","","Northern hemisphere polar area.","9810","90.0","0.0","","","0.994","2000000.0","2000000.0","9001","9102","8901","","","","","1997-06-16 00:00:00","","EPSG","","97.18",NULL};
+datafile_rows_t trf_nonpolynomial_row_728[] = {"16101","UTM zone 1S","","","","180deg to 174deg West; southern hemisphere.","9807","0.0","-177.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_729[] = {"16102","UTM zone 2S","","","","174deg West to 168deg West; southern hemisphere.","9807","0.0","-171.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_730[] = {"16103","UTM zone 3S","","","","168deg West to 162deg West; southern hemisphere.","9807","0.0","-165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_731[] = {"16104","UTM zone 4S","","","","162deg West to 156deg West; southern hemisphere.","9807","0.0","-159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_732[] = {"16105","UTM zone 5S","","","","156deg West to 150deg West; southern hemisphere.","9807","0.0","-153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_733[] = {"16106","UTM zone 6S","","","","150deg West to 144deg West; southern hemisphere.","9807","0.0","-147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_734[] = {"16107","UTM zone 7S","","","","144deg West to 138deg West; southern hemisphere.","9807","0.0","-141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_735[] = {"16108","UTM zone 8S","","","","138deg West to 132deg West; southern hemisphere.","9807","0.0","-135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_736[] = {"16109","UTM zone 9S","","","","132deg West to 126deg West; southern hemisphere.","9807","0.0","-129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_737[] = {"16110","UTM zone 10S","","","","130deg West to 120deg West; southern hemisphere.","9807","0.0","-123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_738[] = {"16111","UTM zone 11S","","","","120deg West to 114deg West; southern hemisphere.","9807","0.0","-117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_739[] = {"16112","UTM zone 12S","","","","114deg West to 108deg West; southern hemisphere.","9807","0.0","-111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_740[] = {"16113","UTM zone 13S","","","","108deg West to 102deg West; southern hemisphere.","9807","0.0","-105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_741[] = {"16114","UTM zone 14S","","","","102deg West to 96deg West; southern hemisphere.","9807","0.0","-99.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_742[] = {"16115","UTM zone 15S","","","","96deg West to 90deg West; southern hemisphere.","9807","0.0","-93.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_743[] = {"16116","UTM zone 16S","","","","90deg West to 84deg West; southern hemisphere.","9807","0.0","-87.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_744[] = {"16117","UTM zone 17S","","","","84deg West to 78deg West; southern hemisphere.","9807","0.0","-81.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_745[] = {"16118","UTM zone 18S","","","","78deg West to 72deg West; southern hemisphere.","9807","0.0","-75.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_746[] = {"16119","UTM zone 19S","","","","72deg West to 66deg West; southern hemisphere.","9807","0.0","-69.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_747[] = {"16120","UTM zone 20S","","","","66deg West to 60deg West; southern hemisphere.","9807","0.0","-63.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_748[] = {"16121","UTM zone 21S","","","","60deg West to 54deg West; southern hemisphere.","9807","0.0","-57.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_749[] = {"16122","UTM zone 22S","","","","54deg West to 48deg West; southern hemisphere.","9807","0.0","-51.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_750[] = {"16123","UTM zone 23S","","","","48deg West to 42deg West; southern hemisphere.","9807","0.0","-45.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_751[] = {"16124","UTM zone 24S","","","","42deg West to 36deg West; southern hemisphere.","9807","0.0","-39.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_752[] = {"16125","UTM zone 25S","","","","36deg West to 30deg West; southern hemisphere.","9807","0.0","-33.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_753[] = {"16126","UTM zone 26S","","","","30deg West to 24deg West; southern hemisphere.","9807","0.0","-27.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_754[] = {"16127","UTM zone 27S","","","","24deg West to 18deg West; southern hemisphere.","9807","0.0","-21.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_755[] = {"16128","UTM zone 28S","","","","18deg West to 12deg West; southern hemisphere.","9807","0.0","-15.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_756[] = {"16129","UTM zone 29S","","","","12deg West to 6deg West; southern hemisphere.","9807","0.0","-9.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_757[] = {"16130","UTM zone 30S","","","","6deg West to 0deg; southern hemisphere.","9807","0.0","-3.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_758[] = {"16131","UTM zone 31S","","","","0deg to 6deg East; southern hemisphere.","9807","0.0","3.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_759[] = {"16132","UTM zone 32S","","","","6deg East to 12deg East; southern hemisphere.","9807","0.0","9.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_760[] = {"16133","UTM zone 33S","","","","12deg East to 18deg East; southern hemisphere.","9807","0.0","15.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_761[] = {"16134","UTM zone 34S","","","","18deg East to 24deg East; southern hemisphere.","9807","0.0","21.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_762[] = {"16135","UTM zone 35S","","","","24deg East to 30deg East; southern hemisphere.","9807","0.0","27.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_763[] = {"16136","UTM zone 36S","","","","30deg East to 36deg East; southern hemisphere.","9807","0.0","33.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_764[] = {"16137","UTM zone 37S","","","","36deg East to 42deg East; southern hemisphere.","9807","0.0","39.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_765[] = {"16138","UTM zone 38S","","","","42deg East to 48deg East; southern hemisphere.","9807","0.0","45.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_766[] = {"16139","UTM zone 39S","","","","48deg East to 54deg East; southern hemisphere.","9807","0.0","51.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_767[] = {"16140","UTM zone 40S","","","","54deg East to 60deg East; southern hemisphere.","9807","0.0","57.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_768[] = {"16141","UTM zone 41S","","","","60deg East to 66deg East; southern hemisphere.","9807","0.0","63.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_769[] = {"16142","UTM zone 42S","","","","66deg East to 72deg East; southern hemisphere.","9807","0.0","69.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_770[] = {"16143","UTM zone 43S","","","","72deg East to 78deg East; southern hemisphere.","9807","0.0","75.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_771[] = {"16144","UTM zone 44S","","","","78deg East to 84deg East; southern hemisphere.","9807","0.0","81.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_772[] = {"16145","UTM zone 45S","","","","84deg East to 90deg East; southern hemisphere.","9807","0.0","87.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_773[] = {"16146","UTM zone 46S","","","","90deg East to 96deg East; southern hemisphere.","9807","0.0","93.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_774[] = {"16147","UTM zone 47S","","","","96deg East to 102eg East; southern hemisphere.","9807","0.0","99.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_775[] = {"16148","UTM zone 48S","","","","102deg East to 108deg East; southern hemisphere.","9807","0.0","105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_776[] = {"16149","UTM zone 49S","","","","108deg East to 114deg East; southern hemisphere.","9807","0.0","111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_777[] = {"16150","UTM zone 50S","","","","114deg East to 120deg East; southern hemisphere.","9807","0.0","117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_778[] = {"16151","UTM zone 51S","","","","120deg East to 126deg East; southern hemisphere.","9807","0.0","123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_779[] = {"16152","UTM zone 52S","","","","126deg East to 132deg East; southern hemisphere.","9807","0.0","129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_780[] = {"16153","UTM zone 53S","","","","132deg East to 138deg East; southern hemisphere.","9807","0.0","135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_781[] = {"16154","UTM zone 54S","","","","138deg East to 144deg East; southern hemisphere.","9807","0.0","141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_782[] = {"16155","UTM zone 55S","","","","144deg East to 150deg East; southern hemisphere.","9807","0.0","147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_783[] = {"16156","UTM zone 56S","","","","150deg East to 156deg East; southern hemisphere.","9807","0.0","153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_784[] = {"16157","UTM zone 57S","","","","156deg East to 162deg East; southern hemisphere.","9807","0.0","159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_785[] = {"16158","UTM zone 58S","","","","162deg East to 168deg East; southern hemisphere.","9807","0.0","165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_786[] = {"16159","UTM zone 59S","","","","168deg East to 174deg East; southern hemisphere.","9807","0.0","171.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_787[] = {"16160","UTM zone 60S","","","","174deg East to 180deg; southern hemisphere.","9807","0.0","177.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_788[] = {"16161","Universal Polar Stereographic South","UPS South","","","Southern hemisphere polar area.","9810","-90.0","0.0","","","0.994","2000000.0","2000000.0","9001","9102","8901","","","","","1997-06-16 00:00:00","","EPSG","","97.18",NULL};
+datafile_rows_t trf_nonpolynomial_row_789[] = {"16202","Gauss-Kruger zone 2","","","","6deg East to 12deg East; northern hemisphere.","9807","0.0","9.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_790[] = {"16203","Gauss-Kruger zone 3","","","","12deg East to 18deg East; northern hemisphere.","9807","0.0","15.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_791[] = {"16204","Gauss-Kruger zone 4","","","","18deg East to 24deg East; northern hemisphere.","9807","0.0","21.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_792[] = {"16205","Gauss-Kruger zone 5","","","","24deg East to 30deg East; northern hemisphere.","9807","0.0","27.0","","","1.0","5500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_793[] = {"16206","Gauss-Kruger zone 6","","","","30deg East to 36deg East; northern hemisphere.","9807","0.0","33.0","","","1.0","6500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_794[] = {"16207","Gauss-Kruger zone 7","","","","36deg East to 42deg East; northern hemisphere.","9807","0.0","39.0","","","1.0","7500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_795[] = {"16208","Gauss-Kruger zone 8","","","","42deg East to 48deg East; northern hemisphere.","9807","0.0","45.0","","","1.0","8500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_796[] = {"16209","Gauss-Kruger zone 9","","","","48deg East to 54deg East; northern hemisphere.","9807","0.0","51.0","","","1.0","9500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_797[] = {"16210","Gauss-Kruger zone 10","","","","54deg East to 60deg East; northern hemisphere.","9807","0.0","57.0","","","1.0","10500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_798[] = {"16211","Gauss-Kruger zone 11","","","","60deg East to 66deg East; northern hemisphere.","9807","0.0","63.0","","","1.0","11500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_799[] = {"16212","Gauss-Kruger zone 12","","","","66deg East to 72deg East; northern hemisphere.","9807","0.0","69.0","","","1.0","12500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_800[] = {"16213","Gauss-Kruger zone 13","","","","72deg East to 78deg East; northern hemisphere.","9807","0.0","75.0","","","1.0","13500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_801[] = {"16214","Gauss-Kruger zone 14","","","","78deg East to 84deg East; northern hemisphere.","9807","0.0","81.0","","","1.0","14500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_802[] = {"16215","Gauss-Kruger zone 15","","","","84deg East to 90deg East; northern hemisphere.","9807","0.0","87.0","","","1.0","15500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_803[] = {"16216","Gauss-Kruger zone 16","","","","90deg East to 96deg East; northern hemisphere.","9807","0.0","93.0","","","1.0","16500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_804[] = {"16217","Gauss-Kruger zone 17","","","","96deg East to 102eg East; northern hemisphere.","9807","0.0","99.0","","","1.0","17500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_805[] = {"16218","Gauss-Kruger zone 18","","","","102deg East to 108deg East; northern hemisphere.","9807","0.0","105.0","","","1.0","18500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_806[] = {"16219","Gauss-Kruger zone 19","","","","108deg East to 114deg East; northern hemisphere.","9807","0.0","111.0","","","1.0","19500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_807[] = {"16220","Gauss-Kruger zone 20","","","","114deg East to 120deg East; northern hemisphere.","9807","0.0","117.0","","","1.0","20500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_808[] = {"16221","Gauss-Kruger zone 21","","","","120deg East to 126deg East; northern hemisphere.","9807","0.0","123.0","","","1.0","21500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_809[] = {"16222","Gauss-Kruger zone 22","","","","126deg East to 132deg East; northern hemisphere.","9807","0.0","129.0","","","1.0","22500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_810[] = {"16223","Gauss-Kruger zone 23","","","","132deg East to 138deg East; northern hemisphere.","9807","0.0","135.0","","","1.0","23500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_811[] = {"16224","Gauss-Kruger zone 24","","","","138deg East to 144deg East; northern hemisphere.","9807","0.0","141.0","","","1.0","24500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_812[] = {"16225","Gauss-Kruger zone 25","","","","144deg East to 150deg East; northern hemisphere.","9807","0.0","147.0","","","1.0","25500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_813[] = {"16226","Gauss-Kruger zone 26","","","","150deg East to 156deg East; northern hemisphere.","9807","0.0","153.0","","","1.0","26500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_814[] = {"16227","Gauss-Kruger zone 27","","","","156deg East to 162deg East; northern hemisphere.","9807","0.0","159.0","","","1.0","27500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_815[] = {"16228","Gauss-Kruger zone 28","","","","162deg East to 168deg East; northern hemisphere.","9807","0.0","165.0","","","1.0","28500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_816[] = {"16229","Gauss-Kruger zone 29","","","","168deg East to 174deg East; northern hemisphere.","9807","0.0","171.0","","","1.0","29500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_817[] = {"16230","Gauss-Kruger zone 30","","","","174deg East to 180deg; northern hemisphere.","9807","0.0","177.0","","","1.0","30500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_818[] = {"16231","Gauss-Kruger zone 31","","","","180deg to 174deg West; northern hemisphere.","9807","0.0","-177.0","","","1.0","31500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_819[] = {"16232","Gauss-Kruger zone 32","","","","174deg West to 168deg West; northern hemisphere.","9807","0.0","-171.0","","","1.0","32500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_820[] = {"16302","Gauss-Kruger 2N","","","","6deg East to 12deg East; northern hemisphere.","9807","0.0","9.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_821[] = {"16303","Gauss-Kruger 3N","","","","12deg East to 18deg East; northern hemisphere.","9807","0.0","15.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1998-06-30 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_822[] = {"16304","Gauss-Kruger 4N","","","","18deg East to 24deg East; northern hemisphere.","9807","0.0","21.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_823[] = {"16305","Gauss-Kruger 5N","","","","24deg East to 30deg East; northern hemisphere.","9807","0.0","27.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_824[] = {"16306","Gauss-Kruger 6N","","","","30deg East to 36deg East; northern hemisphere.","9807","0.0","33.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_825[] = {"16307","Gauss-Kruger 7N","","","","36deg East to 42deg East; northern hemisphere.","9807","0.0","39.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_826[] = {"16308","Gauss-Kruger 8N","","","","42deg East to 48deg East; northern hemisphere.","9807","0.0","45.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_827[] = {"16309","Gauss-Kruger 9N","","","","48deg East to 54deg East; northern hemisphere.","9807","0.0","51.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_828[] = {"16310","Gauss-Kruger 10N","","","","54deg East to 60deg East; northern hemisphere.","9807","0.0","57.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_829[] = {"16311","Gauss-Kruger 11N","","","","60deg East to 66deg East; northern hemisphere.","9807","0.0","63.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_830[] = {"16312","Gauss-Kruger 12N","","","","66deg East to 72deg East; northern hemisphere.","9807","0.0","69.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_831[] = {"16313","Gauss-Kruger 13N","","","","72deg East to 78deg East; northern hemisphere.","9807","0.0","75.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_832[] = {"16314","Gauss-Kruger 14N","","","","78deg East to 84deg East; northern hemisphere.","9807","0.0","81.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_833[] = {"16315","Gauss-Kruger 15N","","","","84deg East to 90deg East; northern hemisphere.","9807","0.0","87.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_834[] = {"16316","Gauss-Kruger 16N","","","","90deg East to 96deg East; northern hemisphere.","9807","0.0","93.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_835[] = {"16317","Gauss-Kruger 17N","","","","96deg East to 102eg East; northern hemisphere.","9807","0.0","99.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_836[] = {"16318","Gauss-Kruger 18N","","","","102deg East to 108deg East; northern hemisphere.","9807","0.0","105.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_837[] = {"16319","Gauss-Kruger 19N","","","","108deg East to 114deg East; northern hemisphere.","9807","0.0","111.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_838[] = {"16320","Gauss-Kruger 20N","","","","114deg East to 120deg East; northern hemisphere.","9807","0.0","117.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_839[] = {"16321","Gauss-Kruger 21N","","","","120deg East to 126deg East; northern hemisphere.","9807","0.0","123.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_840[] = {"16322","Gauss-Kruger 22N","","","","126deg East to 132deg East; northern hemisphere.","9807","0.0","129.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_841[] = {"16323","Gauss-Kruger 23N","","","","132deg East to 138deg East; northern hemisphere.","9807","0.0","135.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_842[] = {"16324","Gauss-Kruger 24N","","","","138deg East to 144deg East; northern hemisphere.","9807","0.0","141.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_843[] = {"16325","Gauss-Kruger 25N","","","","144deg East to 150deg East; northern hemisphere.","9807","0.0","147.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_844[] = {"16326","Gauss-Kruger 26N","","","","150deg East to 156deg East; northern hemisphere.","9807","0.0","153.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_845[] = {"16327","Gauss-Kruger 27N","","","","156deg East to 162deg East; northern hemisphere.","9807","0.0","159.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_846[] = {"16328","Gauss-Kruger 28N","","","","162deg East to 168deg East; northern hemisphere.","9807","0.0","165.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_847[] = {"16329","Gauss-Kruger 29N","","","","168deg East to 174deg East; northern hemisphere.","9807","0.0","171.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_848[] = {"16330","Gauss-Kruger 30N","","","","174deg East to 180deg; northern hemisphere.","9807","0.0","177.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_849[] = {"16331","Gauss-Kruger 31N","","","","180deg to 174deg West; northern hemisphere.","9807","0.0","-177.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_850[] = {"16332","Gauss-Kruger 32N","","","","174deg West to 168deg West; northern hemisphere.","9807","0.0","-171.0","","","1.0","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_851[] = {"16400","TM 0 N","","","","United Kingdom (UKCS) - offshore North Sea.","9807","0.0","0.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-11-11 00:00:00","Shell UK","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_852[] = {"16405","TM 5 NE","","","","Netherlands - offshore.","9807","0.0","5.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-11-11 00:00:00","NAM","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_853[] = {"16506","TM 106 NE","","","","Vietnam - offshore.","9807","0.0","106.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-11-11 00:00:00","PetroVietnam","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_854[] = {"16611","TM 11.30 SE","","","","Angola - offshore.","9807","0.0","11.3","","","0.9996","500000.0","10000000.0","9001","9110","8901","","","","","1998-11-11 00:00:00","Esso Angola","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_855[] = {"16612","TM 12 SE","","","","Angola - offshore.","9807","0.0","12.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1998-11-11 00:00:00","Shell Angola","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_856[] = {"16636","TM 36 SE","","","","Mozambique - offshore.","9807","0.0","36.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1998-11-11 00:00:00","BP Mozambique","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_857[] = {"17348","Map Grid of Australia zone 48","MGA zone 48","","","Australia 102deg East  to 108deg East.","9807","0.0","105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_858[] = {"17349","Map Grid of Australia zone 49","MGA zone 49","","","Australia 108deg East  to 114deg East.","9807","0.0","111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_859[] = {"17350","Map Grid of Australia zone 50","MGA zone 50","","","Australia 114deg East  to 120deg East.","9807","0.0","117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_860[] = {"17351","Map Grid of Australia zone 51","MGA zone 51","","","Australia 120deg East  to 126deg East.","9807","0.0","123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_861[] = {"17352","Map Grid of Australia zone 52","MGA zone 52","","","Australia 126deg East  to 132deg East.","9807","0.0","129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_862[] = {"17353","Map Grid of Australia zone 53","MGA zone 53","","","Australia 132deg East  to 138deg East.","9807","0.0","135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_863[] = {"17354","Map Grid of Australia zone 54","MGA zone 54","","","Australia 138deg East  to 144deg East.","9807","0.0","141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_864[] = {"17355","Map Grid of Australia zone 55","MGA zone 55","","","Australia 144deg East  to 150deg East.","9807","0.0","147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_865[] = {"17356","Map Grid of Australia zone 56","MGA zone 56","","","Australia 150deg East  to 156deg East.","9807","0.0","153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_866[] = {"17357","Map Grid of Australia zone 57","MGA zone 57","","","Australia 156deg East  to 162deg East.","9807","0.0","159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_867[] = {"17358","Map Grid of Australia zone 58","MGA zone 58","","","Australia 162deg East  to 168deg East.","9807","0.0","165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Australian Surveying and Land Information Group Internet WWW page.","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_868[] = {"17448","Australian Map Grid zone 48","AMG zone 48","","","Australia 102deg East  to 108deg East.","9807","0.0","105.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_869[] = {"17449","Australian Map Grid zone 49","AMG zone 49","","","Australia 108deg East  to 114deg East.","9807","0.0","111.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_870[] = {"17450","Australian Map Grid zone 50","AMG zone 50","","","Australia 114deg East  to 120deg East.","9807","0.0","117.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_871[] = {"17451","Australian Map Grid zone 51","AMG zone 51","","","Australia 120deg East  to 126deg East.","9807","0.0","123.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_872[] = {"17452","Australian Map Grid zone 52","AMG zone 52","","","Australia 126deg East  to 132deg East.","9807","0.0","129.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_873[] = {"17453","Australian Map Grid zone 53","AMG zone 53","","","Australia 132deg East  to 138deg East.","9807","0.0","135.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_874[] = {"17454","Australian Map Grid zone 54","AMG zone 54","","","Australia 138deg East  to 144deg East.  Papua New Guinea west of 144 deg East.","9807","0.0","141.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_875[] = {"17455","Australian Map Grid zone 55","AMG zone 55","","","Australia 144deg East  to 150deg East.  Papua New Guinea 144deg East  to 150deg East.","9807","0.0","147.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_876[] = {"17456","Australian Map Grid zone 56","AMG zone 56","","","Australia 150deg East  to 156deg East.","9807","0.0","153.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_877[] = {"17457","Australian Map Grid zone 57","AMG zone 57","","","Australia 156deg East  to 162deg East.","9807","0.0","159.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_878[] = {"17458","Australian Map Grid zone 58","AMG zone 58","","","Australia 162deg East  to 168deg East.","9807","0.0","165.0","","","0.9996","500000.0","10000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972","EPSG","Grid convergence uses opposite sign convention to UTM","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_879[] = {"17515","South African Survey Grid zone 15","S. African Grid zone 15","","","South Africa - Walvis Bay.","9808","0.0","15.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_880[] = {"17517","South African Survey Grid zone 17","S. African Grid zone 17","","","South Africa - west of 18 deg East.","9808","0.0","17.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_881[] = {"17519","South African Survey Grid zone 19","S. African Grid zone 19","","","South Africa - 18 to 20 deg East.","9808","0.0","19.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_882[] = {"17521","South African Survey Grid zone 21","S. African Grid zone 21","","","South Africa - 20 to 22 deg East.","9808","0.0","21.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_883[] = {"17523","South African Survey Grid zone 23","S. African Grid zone 23","","","South Africa - 22 to 24 deg East.","9808","0.0","23.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_884[] = {"17525","South African Survey Grid zone 25","S. African Grid zone 25","","","Lestho  - west of 26 deg East; South Africa - 24 to 26 deg East.","9808","0.0","25.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_885[] = {"17527","South African Survey Grid zone 27","S. African Grid zone 27","","","Lestho  - east of 26 deg East;  South Africa - 26 to 28 deg East.","9808","0.0","27.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_886[] = {"17529","South African Survey Grid zone 29","S. African Grid zone 29","","","South Africa - 28 to 30 deg East.","9808","0.0","29.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_887[] = {"17531","South African Survey Grid zone 31","S. African Grid zone 31","","","South Africa - 30 to 32 deg East;  Swaziland.","9808","0.0","31.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_888[] = {"17533","South African Survey Grid zone 33","S. African Grid zone 33","","","South Africa - east of 32 deg East.","9808","0.0","33.0","","","1.0","0.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_889[] = {"17611","South West African Survey Grid zone 11","SW African Grid zone 11","","","Namibia - west of 12 deg East.","9808","-22.0","11.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_890[] = {"17613","South West African Survey Grid zone 13","SW African Grid zone 13","","","Namibia - 12 to 14 deg East.","9808","-22.0","13.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_891[] = {"17615","South West African Survey Grid zone 15","SW African Grid zone 15","","","Namibia - 14 to 16 deg East.","9808","-22.0","15.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_892[] = {"17617","South West African Survey Grid zone 17","SW African Grid zone 17","","","Namibia - 16 to 18 deg East.","9808","-22.0","17.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_893[] = {"17619","South West African Survey Grid zone 19","SW African Grid zone 19","","","Namibia - 18 to 20 deg East.","9808","-22.0","19.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_894[] = {"17621","South West African Survey Grid zone 21","SW African Grid zone 21","","","Namibia - 20 to 22 deg East.","9808","-22.0","21.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_895[] = {"17623","South West African Survey Grid zone 23","SW African Grid zone 23","","","Namibia - 22 to 24 deg East.","9808","-22.0","23.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_896[] = {"17625","South West African Survey Grid zone 25","SW African Grid zone 25","","","Namibia - east of 24 deg East.","9808","-22.0","25.0","","","1.0","0.0","0.0","9031","9102","8901","","","","","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa.","EPSG","Transformation method sometimes described as \"Gauss conform\".","95.30  96.29  97.16",NULL};
+datafile_rows_t trf_nonpolynomial_row_897[] = {"17700","MTM Quebec zone 2","","","","Canada - Quebec - east of 57 deg East.","9807","0.0","-55.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_898[] = {"17701","MTM zone 1","","","","Canada - Newfoundland - east of 54 deg 30 min West.","9807","0.0","-53.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_899[] = {"17702","MTM Newfoundland zone 2","MTM zone 2","","","Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.","9807","0.0","-56.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_900[] = {"17703","MTM zone 3","","","","Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.","9807","0.0","-58.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_901[] = {"17704","MTM zone 4","","","","Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.","9807","0.0","-61.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_902[] = {"17705","MTM zone 5","","","","Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.","9807","0.0","-64.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_903[] = {"17706","MTM zone 6","","","","Canada - Quebec and Newfoundland (Labrador) between 69 deg and  66 deg West.","9807","0.0","-67.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_904[] = {"17707","MTM zone 7","","","","Canada - Quebec between 72 deg and 69 deg West.","9807","0.0","-70.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Topographic Mapping Section; Quebec Ministry of Natural Resources.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_905[] = {"17708","MTM zone 8","","","","Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.","9807","0.0","-73.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_906[] = {"17709","MTM zone 9","","","","Canada - Quebec and Ontario - between 78 deg and 75 deg West.","9807","0.0","-76.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_907[] = {"17710","MTM zone 10","","","","Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.","9807","0.0","-79.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transp [...]
+datafile_rows_t trf_nonpolynomial_row_908[] = {"17711","MTM zone 11","","","","Canada - Ontario - south of 46 deg N and west of 81 deg West.","9807","0.0","-82.3","","","0.9999","304800.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_909[] = {"17712","MTM zone 12","","","","Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.","9807","0.0","-81.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation. [...]
+datafile_rows_t trf_nonpolynomial_row_910[] = {"17713","MTM zone 13","","","","Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.","9807","0.0","-84.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_911[] = {"17714","MTM zone 14","","","","Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.","9807","0.0","-87.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_912[] = {"17715","MTM zone 15","","","","Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.","9807","0.0","-90.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_913[] = {"17716","MTM zone 16","","","","Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.","9807","0.0","-93.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_914[] = {"17717","MTM zone 17","","","","Canada - Ontario - west of 94 deg 30 min West.","9807","0.0","-96.0","","","0.9999","304800.0","0.0","9001","9102","8901","","","","","1997-11-13 00:00:00","Surveys and Mapping Section; Ontario Ministry of Transportation.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_915[] = {"17794","MTM Nova Scotia zone 4","","","","Canada - Nova Scotia - east of 63 deg West.","9807","0.0","-61.3","","","0.9999","4500000.0","0.0","9001","9110","8901","","","","","1999-05-24 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","","99.042",NULL};
+datafile_rows_t trf_nonpolynomial_row_916[] = {"17795","MTM Nova Scotia zone 5","","","","Canada - Nova Scotia - west of 63 deg West.","9807","0.0","-64.3","","","0.9999","5500000.0","0.0","9001","9110","8901","","","","","1999-05-24 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","","99.042",NULL};
+datafile_rows_t trf_nonpolynomial_row_917[] = {"17801","Japan Plane Rectangular CS zone I","Japan zone I","","","Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).","9807","33.0","129.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2 [...]
+datafile_rows_t trf_nonpolynomial_row_918[] = {"17802","Japan Plane Rectangular CS zone II","Japan zone II","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","33.0","131.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_919[] = {"17803","Japan Plane Rectangular CS zone III","Japan zone III","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","132.1","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG", [...]
+datafile_rows_t trf_nonpolynomial_row_920[] = {"17804","Japan Plane Rectangular CS zone IV","Japan zone IV","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","33.0","133.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_921[] = {"17805","Japan Plane Rectangular CS zone V","Japan zone V","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","134.2","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Ori [...]
+datafile_rows_t trf_nonpolynomial_row_922[] = {"17806","Japan Plane Rectangular CS zone VI","Japan zone VI","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","136.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_923[] = {"17807","Japan Plane Rectangular CS zone VII","Japan zone VII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","137.1","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG", [...]
+datafile_rows_t trf_nonpolynomial_row_924[] = {"17808","Japan Plane Rectangular CS zone VIII","Japan zone VIII","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","138.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG [...]
+datafile_rows_t trf_nonpolynomial_row_925[] = {"17809","Japan Plane Rectangular CS zone IX","Japan zone IX","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","36.0","139.5","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","O [...]
+datafile_rows_t trf_nonpolynomial_row_926[] = {"17810","Japan Plane Rectangular CS zone X","Japan zone X","","","Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).","9807","40.0","140.5","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Ori [...]
+datafile_rows_t trf_nonpolynomial_row_927[] = {"17811","Japan Plane Rectangular CS zone XI","Japan zone XI","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","9807","44.0","140.15","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/ima [...]
+datafile_rows_t trf_nonpolynomial_row_928[] = {"17812","Japan Plane Rectangular CS zone XII","Japan zone XII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","9807","44.0","142.15","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/i [...]
+datafile_rows_t trf_nonpolynomial_row_929[] = {"17813","Japan Plane Rectangular CS zone XIII","Japan zone XIII","","","Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.","9807","44.0","144.15","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum [...]
+datafile_rows_t trf_nonpolynomial_row_930[] = {"17814","Japan Plane Rectangular CS zone XIV","Japan zone XIV","","","Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.","9807","26.0","142.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_931[] = {"17815","Japan Plane Rectangular CS zone XV","Japan zone XV","","","Japan - Okinawa-ken between 126 deg &130 deg E.","9807","26.0","127.3","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_932[] = {"17816","Japan Plane Rectangular CS zone XVI","Japan zone XVI","","","Japan - Okinawa-ken west of 126 deg E.","9807","26.0","124.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_933[] = {"17817","Japan Plane Rectangular CS zone XVII","Japan zone XVII","","","Japan - Okinawa-ken east of 130 deg E.","9807","26.0","131.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_934[] = {"17818","Japan Plane Rectangular CS zone XVIII","Japan zone XVIII","","","Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.","9807","20.0","136.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_935[] = {"17819","Japan Plane Rectangular CS zone XIX","Japan zone XIX","","","Japan - Tokyo-to south of 28 N & east of 143 deg E.","9807","26.0","154.0","","","0.9999","0.0","0.0","9001","9110","8901","","","","","1998-12-12 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","Original transformation by Gauss-Kruger formula.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_936[] = {"18011","Nord Algerie (ancienne)","","","","Algeria north of 38.5g (34 deg 39 min) North.","9801","40.0","3.0","","","0.999625544","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Used with Voirol 1875 datum - now superseded.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_937[] = {"18012","Sud Algerie (ancienne)","","","","Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.","9801","37.0","3.0","","","0.999625769","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Used with Voirol 1875 datum - now superseded.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_938[] = {"18021","Nord Algerie","","","","Algeria north of 38.5g (34 deg 39 min) North.","9801","40.0","3.0","","","0.999625544","500135.0","300090.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Use with Voirol Unifie 1960 datum.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_939[] = {"18022","Sud Algerie","","","","Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.","9801","37.0","3.0","","","0.999625769","500135.0","300090.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","Use with Voirol Unifie 1960 datum.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_940[] = {"18031","Argentina zone 1","Argentina 1","","","Argentina west of 70 deg 30 min West.","9807","-90.0","-72.0","","","1.0","1500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_941[] = {"18032","Argentina zone 2","Argentina 2","","","Argentina between 70 deg 30 min and 67 deg 30 min West.","9807","-90.0","-69.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_942[] = {"18033","Argentina zone 3","Argentina 3","","","Argentina between 67 deg 30 min and 64 deg 30 min West.","9807","-90.0","-66.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_943[] = {"18034","Argentina zone 4","Argentina 4","","","Argentina between 64 deg 30 min and 61 deg 30 min West.","9807","-90.0","-63.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_944[] = {"18035","Argentina zone 5","Argentina 5","","","Argentina between 61 deg 30 min and 58 deg 30 min West.","9807","-90.0","-60.0","","","1.0","5500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_945[] = {"18036","Argentina zone 6","Argentina 6","","","Argentina between 58 deg 30 min and 55 deg 30 min West.","9807","-90.0","-57.0","","","1.0","6500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_946[] = {"18037","Argentina zone 7","Argentina 7","","","Argentina east of 55 deg 30 min West.","9807","-90.0","-54.0","","","1.0","7500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_947[] = {"18041","Austria West Zone","","","","Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).","9807","0.0","28.0","","","1.0","0.0","0.0","9001","9102","8909","","","","","1997-04-11 00:00:00","","EPSG","Superseded by M28 (EPSG code 18044).","95.30  96.29  97.01  98.48",NULL};
+datafile_rows_t trf_nonpolynomial_row_948[] = {"18042","Austria Central Zone","","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).","9807","0.0","31.0","","","1.0","0.0","0.0","9001","9102","8909","","","","","1997-04-11 00:00:00","","EPSG","Superseded by M31 (EPSG code 18045).","95.30  96.29  97.01  98.48",NULL};
+datafile_rows_t trf_nonpolynomial_row_949[] = {"18043","Austria East Zone","","","","Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).","9807","0.0","34.0","","","1.0","0.0","0.0","9001","9102","8909","","","","","1997-04-11 00:00:00","","EPSG","Superseded by M34 (EPSG code 18046).","95.30  96.29  97.01  98.48",NULL};
+datafile_rows_t trf_nonpolynomial_row_950[] = {"18044","Austria M28","M28","","","Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).","9807","0.0","10.2","","","1.0","150000.0","0.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","Supersedes Austria West zone (EPSG code 18041).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_951[] = {"18045","Austria M31","M31","","","Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).","9807","0.0","13.2","","","1.0","450000.0","0.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","Supersedes Austria Central zone (EPSG code 18042).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_952[] = {"18046","Austria M34","M34","","","Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).","9807","0.0","16.2","","","1.0","750000.0","0.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","Supersedes Austria East zone (EPSG code 18043).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_953[] = {"18051","Colombia West zone","Colombia 3W","","","Colombia west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).","9807","4.355657","-77.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as \"6 west\".","95.30  96.29  97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_954[] = {"18052","Colombia Bogota zone","Colombia Bogota","","","Colombia 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).","9807","4.355657","-74.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30  96.29  97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_955[] = {"18053","Colombia East Central zone","Colombia 3E","","","Colombia 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).","9807","4.355657","-71.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as \"3 east\".","95.30  96.29  97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_956[] = {"18054","Colombia East zone","Colombia 6E","","","Colombia east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).","9807","4.355657","-68.04513","","","1.0","1000000.0","1000000.0","9001","9110","8901","","","","","1997-04-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as \"6 east\".","95.30  96.29  97.11",NULL};
+datafile_rows_t trf_nonpolynomial_row_957[] = {"18061","Cuba Norte","","","","Cuba","9801","22.21","-81.0","","","0.99993602","500000.0","280296.016","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_958[] = {"18062","Cuba Sur","","","","Cuba","9801","20.43","-76.5","","","0.99994848","500000.0","229126.939","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_959[] = {"18071","Egypt Blue Belt","Blue Belt","","","Egypt  - Sinai peninsula.","9807","30.0","35.0","","","1.0","300000.0","1100000.0","9001","9102","8901","","","","","1999-04-22 00:00:00","","EPSG","Also known as Green Belt.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_960[] = {"18072","Egypt Red Belt","Red Belt","","","Egypt  east of 29 deg East.","9807","30.0","31.0","","","1.0","615000.0","810000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_961[] = {"18073","Egypt Purple Belt","Purple Belt","","","Egypt  west of 29 deg East; north of approx 28 deg 11 min North.","9807","30.0","27.0","","","1.0","700000.0","200000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_962[] = {"18074","Egypt Extended Purple Belt","Extended Purple Belt","","","Egypt  west of 29 deg East; south of approx 28 deg 11 min North.","9807","30.0","27.0","","","1.0","700000.0","1200000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_963[] = {"18081","France I","","","","France north of 53.5 grads (48 deg 09 min) North.","9801","55.0","0.0","","","0.999877341","600000.0","1200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18091.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_964[] = {"18082","France II","","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.","9801","52.0","0.0","","","0.99987742","600000.0","2200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18092.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_965[] = {"18083","France III","","","","France south of 50.5 grads (45 deg 27 min) North.","9801","49.0","0.0","","","0.999877499","600000.0","3200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18093.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_966[] = {"18084","France IV","","","","France - Corsica.","9801","46.85","0.0","","","0.99994471","234.358","4185861.369","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Introduced 1972. See 18094.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_967[] = {"18091","Nord France","","","","France north of 53.5 grads (48 deg 09 min) North.","9801","55.0","0.0","","","0.999877341","600000.0","200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18081 from 1972.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_968[] = {"18092","Centre France","","","","France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.","9801","52.0","0.0","","","0.99987742","600000.0","200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18082 from 1972.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_969[] = {"18093","Sud France","","","","France south of 50.5 grads (45 deg 27 min) North.","9801","49.0","0.0","","","0.999877499","600000.0","200000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18083 from 1972.","95.26",NULL};
+datafile_rows_t trf_nonpolynomial_row_970[] = {"18094","Corse","","","","France - Corsica.","9801","46.85","0.0","","","0.99994471","234.358","185861.369","9001","9105","8903","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","Superseded by 18084 from 1972.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_971[] = {"18101","Germany zone 1","","","","Germany - onshore west of 4 deg 30 min East.","9807","0.0","3.0","","","1.0","1500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_972[] = {"18102","Germany zone 2","","","","Germany - onshore between 4 deg 30 min and 7 deg 30 min East.","9807","0.0","6.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_973[] = {"18103","Germany zone 3","","","","Germany - onshore between 7 deg 30 min and 10 deg 30 min East.","9807","0.0","9.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_974[] = {"18104","Germany zone 4","","","","Germany - onshore between 10 deg 30 min and 13 deg 30 min East.","9807","0.0","12.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_975[] = {"18105","Germany zone 5","","","","Germany - onshore between 13 deg 30 min and 16 deg 30 min East.","9807","0.0","15.0","","","1.0","5500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_976[] = {"18110","India zone 0","","","","Pakistan north of 35 deg 35 min North.","9801","39.3","68.0","","","0.99846154","2355500.0","2590000.0","9084","9110","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.30  96.01  96.02  96.29  97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_977[] = {"18111","India zone I","","","","India north of 28 deg North. Pakistan 28 deg to 35 deg 35 min North.","9801","32.3","68.0","","","0.99878641","3000000.0","1000000.0","9084","9110","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.30  96.02  [...]
+datafile_rows_t trf_nonpolynomial_row_978[] = {"18112","India zone IIa","","","","India - between 21 deg and 28 deg North and  west of 82 deg East; Pakistan - south of 28 deg North.","9801","26.0","74.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion [...]
+datafile_rows_t trf_nonpolynomial_row_979[] = {"18113","India zone IIb","India zone II b","","","Bangladesh; India - north of 21 deg North and east of 82 deg East; Myanmar (Burma) - north of 21 deg North.","9801","26.0","90.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas  [...]
+datafile_rows_t trf_nonpolynomial_row_980[] = {"18114","India zone IIIa","India zone IIIa","","","India - between 15 deg and 21 deg North.","9801","19.0","80.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28  96.02  97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_981[] = {"18115","India zone IIIb","","","","Myanmar (Burma) - between 15 deg and 21 deg North.","9801","19.0","100.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28  96.02  97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_982[] = {"18116","India zone IVa","India zone Iva","","","India - south of 15 deg North.","9801","12.0","80.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28  96.02  97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_983[] = {"18117","India zone IVb","","","","Myanmar - south of 15 deg North.","9801","12.0","100.0","","","0.99878641","3000000.0","1000000.0","9084","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","95.28  96.02  97.23",NULL};
+datafile_rows_t trf_nonpolynomial_row_984[] = {"18121","Italy zone 1","","","","Italy west of 12 deg East (of Greenwich).","9807","0.0","9.0","","","0.9996","1500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Boaga formula","",NULL};
+datafile_rows_t trf_nonpolynomial_row_985[] = {"18122","Italy zone 2","","","","Italy east of 12 deg East (of Greenwich).","9807","0.0","15.0","","","0.9996","2520000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Original transformation by Gauss-Boaga formula","",NULL};
+datafile_rows_t trf_nonpolynomial_row_986[] = {"18131","Nord Maroc","","","","Morocco north of 35 grads (31 deg 30 min) North.","9801","37.0","-6.0","","","0.999625769","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","IGN Paris.","EPSG","A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.","99.203",NULL};
+datafile_rows_t trf_nonpolynomial_row_987[] = {"18132","Sud Maroc","","","","Morocco 31gr to 35gr  (27 deg 54 min to 31 deg 30 min) North.","9801","33.0","-6.0","","","0.999615596","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.","99.203",NULL};
+datafile_rows_t trf_nonpolynomial_row_988[] = {"18133","Sahara","","","","Morocco south of 31gr  (27 deg 54 min) North.","9801","29.0","-6.0","","","0.9996","1200000.0","400000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","IGN Paris","EPSG","Created in 1977 to cover Sahara Marocain (ex Spanish Sahara)","",NULL};
+datafile_rows_t trf_nonpolynomial_row_989[] = {"18141","New Zealand North Island National Grid","North Island Grid","","","New Zealand - North Island.","9807","-39.0","175.3","","","1.0","300000.0","400000.0","9040","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","Superseded by New Zealand Map Grid.","95.30  96.29  97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_990[] = {"18142","New Zealand South Island National Grid","South Island Grid","","","New Zealand - South Island.","9807","-44.0","171.3","","","1.0","500000.0","500000.0","9040","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","Superseded by New Zealand Map Grid.","95.30  96.29  97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_991[] = {"18151","Nigeria West Belt","","","","Nigeria west of 6 deg 30 min East.","9807","4.0","4.3","","","0.99975","230738.26","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_992[] = {"18152","Nigeria Mid Belt","","","","Nigeria between 6 deg 30 min and 10 deg 30 min East.","9807","4.0","8.3","","","0.99975","670553.98","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_993[] = {"18153","Nigeria East Belt","","","","Nigeria east of 10 deg 30 min East.","9807","4.0","12.3","","","0.99975","1110369.7","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_994[] = {"18161","Peru west zone","","","","Peru west of 79 deg West.","9807","-6.0","-80.3","","","0.99983008","222000.0","1426834.743","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_995[] = {"18162","Peru central zone","","","","Peru 79 to 73 deg West.","9807","-9.3","-76.0","","","0.99932994","720000.0","1039979.159","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_996[] = {"18163","Peru east zone","","","","Peru east of 73 deg West.","9807","-9.3","-70.3","","","0.99952992","1324000.0","1040084.558","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_997[] = {"18171","Philippines zone  I","","","","Philippines - west of 118 deg East.","9807","0.0","117.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_998[] = {"18172","Philippines zone  II","","","","Philippines - Palawan; Calamian Islands.","9807","0.0","119.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_999[] = {"18173","Philippines zone  III","","","","Philippines - Luzon (except SE part); Mindoro.","9807","0.0","121.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1000[] = {"18174","Philippines zone  IV","","","","Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; W. Mindanao.","9807","0.0","123.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1001[] = {"18175","Philippines zone  V","","","","Philippines - E. Mindanao; Bohol; Samar.","9807","0.0","125.0","","","0.99995","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1002[] = {"18181","Nord Tunisie","","","","Tunisia north of 38.5 grads (34 deg 39 min) North.","9801","40.0","11.0","","","0.999625544","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1003[] = {"18182","Sud Tunisie","","","","Tunisia south of 38.5 grads (34 deg 39 min) North.","9801","37.0","11.0","","","0.999625769","500000.0","300000.0","9001","9105","8901","","","","","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1004[] = {"18191","Finland zone 1","","","","Finland - west of 22deg 30min E.","9807","0.0","21.0","","","1.0","1500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1005[] = {"18192","Finland zone 2","","","","Finland - 22deg 30 min to 25deg 30min E.","9807","0.0","24.0","","","1.0","2500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1006[] = {"18193","Finland Uniform Coordinate System","Finland zone 3","","","Finland; Finland - 25 deg 30min E to 28deg 30min E.","9807","0.0","27.0","","","1.0","3500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","Used by Uniform Coordinate System over all country and also by zone 3 of Basic Coordinate System at larger scales.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1007[] = {"18194","Finland zone 4","","","","Finland - east of 28deg 30 min E.","9807","0.0","30.0","","","1.0","4500000.0","0.0","9001","9102","8901","","","","","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1008[] = {"18201","Palestine Grid","","","","Israel;  Jordan","9806","31.4402749","35.124349","","","","170251.555","126867.909","9001","9110","8901","","","","","1999-04-22 00:00:00","","EPSG","Also encountered as a Transverse Mercator projection with scale factor of 1.  The difference in conversion caused by the change of formula does not exceed 2m within Israel.  Within the State of Israel superseded by the Israeli CS Grid (EPSG code 18203).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1009[] = {"18202","Palestine Belt","","","","Israel;  Jordan","9807","31.4402749","35.124349","","","1.0","170251.555","1126867.909","9001","9110","8901","","","","","1999-04-22 00:00:00","","EPSG","Originally constructed as the Palestine Grid - EPSG code 18201. Adopted by the US Army Map Service as \"Palestine Belt\" with change of projection method and false northing (FN). Sometimes seen with unchanged FN of 126867.909.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1010[] = {"18203","Israeli CS","ICS","","","Israel","9806","31.4402749","35.124349","","","","170251.555","1126867.909","9001","9110","8901","","","","","1999-10-20 00:00:00","Survey of Israel   ftp://ftp.rd.soi.gov.il/doc","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1011[] = {"18204","Israeli TM","ITM","","","Israel","9807","31.4403817","35.1216261","","","1.0000067","219529.584","626907.39","9001","9110","8901","","","","","1999-10-20 00:00:00","Survey of Israel   ftp://ftp.rd.soi.gov.il/doc","EPSG","Designed to approximate Israeli CS grid in north-central Israel.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1012[] = {"18211","Guatemala Norte","","","","Guatemala north of 15 deg 50 min North.","9801","16.49","-90.2","","","0.99992226","500000.0","292209.579","9001","9110","8901","","","","","1999-08-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1013[] = {"18212","Guatemala Sud","","","","Guatemala south of 15 deg 50 min North.","9801","14.54","-90.2","","","0.99989906","500000.0","325992.681","9001","9110","8901","","","","","1999-08-16 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1014[] = {"18221","NGO zone I","","","","Norway - west of 3deg 30min W of Oslo (7deg 13min 22.5sec E of Greenwich).","9807","58.0","-4.4","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1015[] = {"18222","NGO zone II","","","","Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 22.5sec E  and 9deg 33min 22.5sec E of Greenwich).","9807","58.0","-2.2","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1016[] = {"18223","NGO zone III","","","","Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 22.5sec E and 11deg 58min 22.5sec E of Greenwich).","9807","58.0","0.0","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1017[] = {"18224","NGO zone IV","","","","Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 22.5sec E and 15deg 03min 22.5sec E of Greenwich).","9807","58.0","2.3","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1018[] = {"18225","NGO zone V","","","","Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 22.5sec E and 18deg 53min 22.5sec E of Greenwich).","9807","58.0","6.1","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1019[] = {"18226","NGO zone VI","","","","Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 22.5sec E and 22deg 53min 22.5sec E of Greenwich).","9807","58.0","10.1","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1020[] = {"18227","NGO zone VII","","","","Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 22.5sec E and 26deg 58min 22.5sec E of Greenwich).","9807","58.0","14.1","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1021[] = {"18228","NGO zone VIII","","","","Norway - east of 16deg 15min E of Oslo (26deg 58min 22.5sec E of Greenwich).","9807","58.0","18.2","","","1.0","0.0","0.0","9001","9110","8913","","","","","1999-10-20 00:00:00","J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1022[] = {"18231","India zone I (1975 metres)","India zone I","","","India north of 28 deg North.","9801","32.3","68.0","","","0.99878641","2743185.69","914395.23","9001","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1023[] = {"18232","India zone IIa (1975 metres)","India zone II a","","","India - between 21 deg and 28 deg North and  west of 82 deg East.","9801","26.0","74.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1024[] = {"18233","India zone IIIa (1975 metres)","India zone IIIa","","","India - between 15 deg and 21 deg North.","9801","19.0","80.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1025[] = {"18234","India zone IVa (1975 metres)","India zone IV a","","","India - south of 15 deg North.","9801","12.0","80.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1026[] = {"18235","India zone IIb (1975 metres)","India zone II b","","","India - north of 21 deg North and east of 82 deg East.","9801","26.0","90.0","","","0.99878641","2743185.69","914395.23","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1027[] = {"18236","India zone I (1962 metres)","India zone I","","","Pakistan - north of 28 deg North.","9801","32.3","68.0","","","0.99878641","2743196.4","914398.8","9001","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1028[] = {"18237","India zone IIa (1962 metres)","India zone II a","","","Pakistan - south of 28 deg North.","9801","26.0","74.0","","","0.99878641","2743196.4","914398.8","9001","9102","8901","","","","","1999-10-20 00:00:00","","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1029[] = {"18238","India zone IIb (1937 metres)","India zone II b","","","Bangladesh.","9801","26.0","90.0","","","0.99878641","2743195.5","914398.5","9001","9102","8901","","","","","1999-10-20 00:00:00","US Army Map Service projection tables; 1943.","EPSG","BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1030[] = {"19900","Bahrain State Grid","Bahrain Grid","","","Bahrain.","9807","0.0","51.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1031[] = {"19901","Belge Lambert 50","","","","Belgium - onshore.","9802","90.0","0.0","49.5","51.1","","150000.0","5400000.0","9001","9110","8910","","","","","1999-04-22 00:00:00","\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels","EPSG","","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1032[] = {"19902","Belge Lambert 72","","","","Belgium - onshore.","9803","90.0","4.2124983","49.5","51.1","","150000.01256","5400088.4378","9001","9110","8901","","","","","1999-04-22 00:00:00","\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels","EPSG","Rotation from Belge Lambert 50 to Belge Lambert 72 is +29.2985sec.","95.30  96.29  99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1033[] = {"19903","Nord de Guerre","","","","France - Alsace.","9801","55.0","6.0","","","0.99950908","500000.0","300000.0","9001","9105","8903","","","","","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1034[] = {"19904","Ghana Metre Grid","","","","Ghana.","9807","4.4","-1.0","","","0.99975","274319.51","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1035[] = {"19905","Netherlands East Indies Equatorial Zone","NEIEZ","","","Indonesia.","9804","0.0","110.0","","","0.997","3900000.0","900000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","US Army Map Service projection tables; 1943.","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1036[] = {"19906","Iraq zone","","","","Iran -south of 36 deg North; Iraq;  Kuwait.","9801","32.3","45.0","","","0.99878640776699","1500000.0","1166200.0","9001","9110","8901","","","","","1996-04-12 00:00:00","US Army Map Service projection tables; 1943.","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1037[] = {"19907","Iraq National Grid","","","","Iraq.","9807","29.0134566","46.3","","","0.9994","800000.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1038[] = {"19908","Irish National Grid","","","","Ireland - onshore.  United Kingdom (UK) - Northern Ireland onshore.","9807","53.3","-8.0","","","1.000035","200000.0","250000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1039[] = {"19909","Jamaica (Old Grid)","","","","Jamaica.","9801","18.0","-77.0","","","1.0","550000.0","400000.0","9005","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Superseded by Jamaica (New Grid).","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1040[] = {"19910","Jamaica National Grid","","","","Jamaica.","9801","18.0","-77.0","","","1.0","250000.0","150000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","Supersedes Jamaica (Old Grid).","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1041[] = {"19911","Laborde Grid","","","","Madagascar.","9815","-21.0","49.0","21.0","21.0","0.9995","400000.0","800000.0","9001","9105","8903","","","","","1997-11-13 00:00:00","","EPSG","Can also use transformation method 9813.","97.613",NULL};
+datafile_rows_t trf_nonpolynomial_row_1042[] = {"19912","Rectified Skew Orthomorphic Borneo Grid","R.S.O. Borneo","","","Brunei;  Malaysia - East Malaysia (Sabah; Sarawak).","9812","4.0","115.0","53.18569537","53.07483685","0.99984","0.0","0.0","9042","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","","95.30  96.29  97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1043[] = {"19913","RD Old","","","","Netherlands - onshore.","9809","52.0922178","5.23155","","","0.9999079","0.0","0.0","9001","9110","8901","","","","","1995-12-02 00:00:00","Nederlandse Commissie voor Geodesie publication 30.","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1044[] = {"19914","RD New","","","","Netherlands - onshore.","9809","52.0922178","5.23155","","","0.9999079","155000.0","463000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","Nederlandse Commissie voor Geodesie publication 30.","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1045[] = {"19915","Aden Zone","","","","Yemen.","9801","15.0","45.0","","","0.999365678","1500000.0","1000000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","US Army Map Service projection tables; 1943.","EPSG","","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1046[] = {"19916","British National Grid","","","","United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.","9807","49.0","-2.0","","","0.999601272","400000.0","-100000.0","9001","9102","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30",NULL};
+datafile_rows_t trf_nonpolynomial_row_1047[] = {"19917","New Zealand Map Grid","","","","New Zealand.","9811","-41.0","173.0","","","","2510000.0","6023150.0","9001","9102","8901","","","","","1995-12-02 00:00:00","Dept. of Lands and Surveys Technical Circular 1973/32; 23 Nov 1973.","EPSG","Supersedes North and South Island National Grids.","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1048[] = {"19919","Qatar National Grid","","","","Qatar.","9807","24.27","51.13","","","0.99999","200000.0","300000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1049[] = {"19920","Singapore Grid","","","","Singapore.","9806","1.1715528","103.5110808","","","","30000.0","30000.0","9001","9110","8901","","","","","1995-12-02 00:00:00","","EPSG","","95.30  96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1050[] = {"19921","Spain","","","","Spain.","9801","40.0","0.0","","","0.9988085293","600000.0","600000.0","9001","9102","8905","","","","","1995-12-02 00:00:00","","EPSG","Superseded by UTM","95.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1051[] = {"19922","Swiss New Grid","LV03","","","Liechtenstein;  Switzerland.","9815","46.570866","7.26225","90.0","90.0","1.0","600000.0","200000.0","9001","9110","8901","","","","","1997-11-13 00:00:00","\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967","EPSG","","95.30  96.29  97.27  97.612  97.62",NULL};
+datafile_rows_t trf_nonpolynomial_row_1052[] = {"19923","Swiss Old Grid","LV03C","","","Liechtenstein;  Switzerland.","9815","46.570866","0.0","90.0","90.0","1.0","0.0","0.0","9001","9110","8907","","","","","1997-11-13 00:00:00","\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967","EPSG","Superseded by LV03 (19922).","95.30  96.29  97.612  97.62",NULL};
+datafile_rows_t trf_nonpolynomial_row_1053[] = {"19924","Tobago Grid","","","","Trinidad and Tobago - Tobago.","9806","11.1507843","-60.4109632","","","","187500.0","180000.0","9039","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","","95.30  96.29  97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1054[] = {"19925","Trinidad Grid","","","","Trinidad and Tobago - Trinidad.","9806","10.263","-61.2","","","","430000.0","325000.0","9039","9110","8901","","","","","1999-10-20 00:00:00","","EPSG","","95.30  96.29  97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1055[] = {"19926","Stereo 70","","","","Romania.","9809","46.0","25.0","","","0.99975","500000.0","500000.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","Supersedes Stereo 33 (code 19927).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1056[] = {"19927","Stereo 33","","","","Romania.","9809","45.54","25.23328772","","","0.9996667","500000.0","500000.0","9001","9110","8901","","","","","1996-04-12 00:00:00","","EPSG","Superseded by Stereo 70 (code 19926)","96.29",NULL};
+datafile_rows_t trf_nonpolynomial_row_1057[] = {"19928","Kuwait TM","KTM","","","Kuwait - Kuwait City.","9807","0.0","48.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1996-04-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1058[] = {"19929","Swedish National Projection","2.5 gon West","","","Sweden.","9807","0.0","15.48298","","","1.0","1500000.0","0.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Lantmateriet of Sweden; private communication.","EPSG","Used since 1938 superseding 6 old zones.  Longitude of natural origin is 2.5 gon west of Stockholm prime meridian; transformation is also known as \"2.5 gon West of old Stockholm observatory\".","96.29  97.39",NULL};
+datafile_rows_t trf_nonpolynomial_row_1059[] = {"19930","Greek Grid","","","","Greece","9807","0.0","24.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","Created for use with GGRS87.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1060[] = {"19931","Egyseges Orszagos Vetuleti","EOV","","","Hungary","9815","47.08398174","19.02548584","90.0","90.0","0.99993","650000.0","200000.0","9001","9110","8901","","","","","1997-07-22 00:00:00","http://lazarus.elte.hu/gb/geodez/geod2.htm","EPSG","EOV = Uniform National Projection","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1061[] = {"19933","Prince Edward Island Stereographic","PEI Stereographic","","","Canada - Prince Edward Island","9809","47.15","-63.0","","","0.999912","700000.0","400000.0","9001","9110","8901","","","","","1997-11-13 00:00:00","Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.","EPSG","In use from 1979.  To be phased out in late 1990's.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1062[] = {"19934","Lithuania 1994","","","","Lithuania","9807","0.0","24.0","","","0.9998","500000.0","0.0","9001","9102","8901","","","","","1998-03-12 00:00:00","HNIT-BALTIC GeoInfoServisas","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1063[] = {"19935","Rectified Skew Orthomorphic Malaya Grid","R.S.O. Malaya","","","Malaysia - West Malaysia","9812","4.0","102.15","323.01328458","323.07483685","0.99984","40000.0","0.0","9062","9110","8901","","","","","1999-10-20 00:00:00","UK Directorate of Overseas Surveys paper","EPSG","","97.231",NULL};
+datafile_rows_t trf_nonpolynomial_row_1064[] = {"19936","Portuguese National Grid","","","","Portugal onshore.","9807","39.4","1.0","","","1.0","200000.0","300000.0","9001","9110","8902","","","","","1998-11-11 00:00:00","","EPSG","Original transformation by Gauss-Kruger formula.","95.30  96.29  98.42",NULL};
+datafile_rows_t trf_nonpolynomial_row_1065[] = {"19937","Tunisia Mining Grid","","","","Tunisia - onshore","9816","38.81973","7.83445","","","","270.0","582.0","9036","9105","8903","","","","","1999-11-15 00:00:00","Mining decree of 1st January 1953","EPSG","Origin: Djebel Kebar","99.81",NULL};
+datafile_rows_t trf_nonpolynomial_row_1066[] = {"19938","Estonian National Grid","","","","Estonia","9802","57.310319415","24.0","59.2","58.0","","500000.0","6375000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","Coordinates at the projection origin match those of TM Baltic 93.","99.28",NULL};
+datafile_rows_t trf_nonpolynomial_row_1067[] = {"19939","TM Baltic 93","","","","Estonia; Latvia; Lithuania.","9807","0.0","24.0","","","0.9996","500000.0","0.0","9001","9102","8901","","","","","1998-12-14 00:00:00","http://www.geo.ut.ee/~raivo/estcoord.html","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1068[] = {"19940","Levant Zone","","","","Syrian Arab Republic west of 39 deg E.","9817","34.39","37.21","","","0.9996256","300000.0","300000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","US Army Map Service projection tables; 1943.","EPSG","Superseded by projection using full Lambert formula from 1973. (EPSG code 19948).","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1069[] = {"19941","Brazil Polyconic","","","","Brazil","9818","0.0","-54.0","","","","5000000.0","10000000.0","9001","9102","8901","","","","","1999-10-20 00:00:00","PetroBras","EPSG","","99.55",NULL};
+datafile_rows_t trf_nonpolynomial_row_1070[] = {"19942","British West Indies Grid","","","","Windward Islands - Dominica  Grenada  Saint Lucia  Saint Vincent;  Leeward Islands - Anguilla   Antigua (excluding Barbuda)  Montserrat   Saint Kitts and Nevis; Barbados.","9807","0.0","-62.0","","","0.9995","400000.0","0.0","9001","9102","8901","","","","","1999-04-22 00:00:00","UK Royal Engineers projection tables P10/25, 1943.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1071[] = {"19943","Barbados National Grid","","","","Barbados","9807","13.1035","-59.3335","","","0.9999986","30000.0","75000.0","9001","9110","8901","","","","","1999-04-22 00:00:00","Ordnance Survey of Great Britain","EPSG","Superseded British West Indies Grid (19942) after 1983.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1072[] = {"19944","Quebec Lambert Projection","","","","Canada - Quebec","9802","44.0","-68.3","60.0","46.0","","0.0","0.0","9001","9110","8901","","","","","1999-10-22 00:00:00","Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1073[] = {"19945","New Brunswick Stereographic (ATS77)","NB Stereographic ATS77","","","Canada - New Brunswick - onshore","9809","46.3","-66.3","","","0.999912","300000.0","800000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1979.  To be phased out in late 1990's.","99.61",NULL};
+datafile_rows_t trf_nonpolynomial_row_1074[] = {"19946","New Brunswick Stereographic (NAD83)","NB Stereographic NAD83","","","Canada - New Brunswick - onshore","9809","46.3","-66.3","","","0.999912","2500000.0","7500000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","New Brunswick Geographic Information Corporation land and water information standards manual.","EPSG","In use from 1999.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1075[] = {"19947","Austria Lambert","","","","Austria","9802","13.2","47.3","49.0","46.0","","400000.0","400000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Eich- und Vermessungswesen","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1076[] = {"19948","Syria Lambert","","","","Syrian Arab Republic","9801","34.39","37.21","","","0.9996256","300000.0","300000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","Superseded Levant zone (same parameters but using truncated near-conformal method) from 1973.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1077[] = {"19949","Levant Stereographic","","","","Lebanon","9809","38.0","43.5","","","0.9995341","0.0","0.0","9001","9105","8901","","","","","1999-10-20 00:00:00","IGN Paris","EPSG","Used prior to World War II for cadastral and large scale topographic mapping.","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1078[] = {"19950","Landesvermessung 1995","LV95","","","Liechtenstein;  Switzerland.","9815","46.570866","7.26225","90.0","90.0","1.0","2600000.0","1200000.0","9001","9110","8901","","","","","1999-10-20 00:00:00","Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.","EPSG","","",NULL};
+datafile_rows_t trf_nonpolynomial_row_1079[] = {"19951","Nakhl e Taqi Oblique Mercator","Nakhl e Taqi","","","Iran - Taheri refinery site only.","9815","27.31077837","52.3612741","0.34179803","0.34179803","0.999895934","658377.437","3044969.194","9001","9110","8901","","","","","1999-10-20 00:00:00","Total-Fina","EPSG","Used only for terminal site.","",NULL};
+
+datafile_rows_t *trf_nonpolynomial_rows[] = {trf_nonpolynomial_row_1,trf_nonpolynomial_row_2,trf_nonpolynomial_row_3,trf_nonpolynomial_row_4,trf_nonpolynomial_row_5,trf_nonpolynomial_row_6,trf_nonpolynomial_row_7,trf_nonpolynomial_row_8,trf_nonpolynomial_row_9,trf_nonpolynomial_row_10,trf_nonpolynomial_row_11,trf_nonpolynomial_row_12,trf_nonpolynomial_row_13,trf_nonpolynomial_row_14,trf_nonpolynomial_row_15,trf_nonpolynomial_row_16,trf_nonpolynomial_row_17,trf_nonpolynomial_row_18,trf_no [...]
diff --git a/src/tiff/csv/trf_nonpolynomial.csv b/src/tiff/csv/trf_nonpolynomial.csv
new file mode 100644
index 0000000..17ad8e6
--- /dev/null
+++ b/src/tiff/csv/trf_nonpolynomial.csv
@@ -0,0 +1,1079 @@
+"COORD_TRF_CODE","COORD_TRF_EPSG_NAME","COORD_TRF_EPSG_ABBR","COORD_TRF_USER_NAME","DESCRIPTION","AREA_OF_USE","COORD_TRF_METHOD_CODE","PARAMETER_1","PARAMETER_2","PARAMETER_3","PARAMETER_4","PARAMETER_5","PARAMETER_6","PARAMETER_7","UOM_LENGTH_CODE","UOM_ANGLE_CODE","PRIME_MERIDIAN_CODE","UOM_SCALE_CODE","PARAMETER_35","PARAMETER_36","PARAMETER_37","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+1100,Adindan to WGS 84 (1),,,,MEAN FOR Ethiopia; Sudan.,9603,-166.0,-15.0,204.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1101,Adindan to WGS 84 (2),,,,Burkina Faso.,9603,-118.0,-14.0,218.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1102,Adindan to WGS 84 (3),,,,Cameroon.,9603,-134.0,-2.0,210.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1103,Adindan to WGS 84 (4),,,,Ethiopia.,9603,-165.0,-11.0,206.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1104,Adindan to WGS 84 (5),,,,Mali.,9603,-123.0,-20.0,220.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1105,Adindan to WGS 84 (6),,,,Senegal.,9603,-128.0,-18.0,224.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1106,Adindan to WGS 84 (7),,,,Sudan.,9603,-161.0,-14.0,205.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1107,Afgooye to WGS 84 (1),,,,Somalia.,9603,-43.0,-163.0,45.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1108,AGD66 to WGS 84 (1),,,,Australia.,9603,-133.0,-48.0,148.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1109,AGD84 to WGS 84 (1),,,,Australia.,9603,-134.0,-48.0,149.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1110,Ain el Abd to WGS 84 (1),,,,Bahrain.,9603,-150.0,-250.0,-1.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,97.06
+1111,Ain el Abd to WGS 84 (2),,,,Saudi Arabia.,9603,-143.0,-236.0,7.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1112,Amersfoort to WGS 84 (1),,,,Netherlands.,9606,593.16,26.15,478.54,-6.3239,-0.5008,-5.5487,4.0775,9001,9109,,9202,,,,1997-04-11 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993.,EPSG,,97.07
+1113,Arc 1950 to WGS 84 (1),,,,MEAN FOR Botswana; Lesotho; Malawi; Swaziland; Zaire; Zambia; Zimbabwe.,9603,-143.0,-90.0,-294.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1114,Arc 1950 to WGS 84 (2),,,,Botswana.,9603,-138.0,-105.0,-289.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1115,Arc 1950 to WGS 84 (3),,,,Burundi.,9603,-153.0,-5.0,-292.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1116,Arc 1950 to WGS 84 (4),,,,Lesotho.,9603,-125.0,-108.0,-295.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1117,Arc 1950 to WGS 84 (5),,,,Malawi.,9603,-161.0,-73.0,-317.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1118,Arc 1950 to WGS 84 (6),,,,Swaziland.,9603,-134.0,-105.0,-295.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1119,Arc 1950 to WGS 84 (7),,,,Zaire.,9603,-169.0,-19.0,-278.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1120,Arc 1950 to WGS 84 (8),,,,Zambia.,9603,-147.0,-74.0,-283.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1121,Arc 1950 to WGS 84 (9),,,,Zimbabwe.,9603,-142.0,-96.0,-293.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1122,Arc 1960 to WGS 84 (1),,,,MEAN FOR Kenya; Tanzania.,9603,-160.0,-6.0,-302.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1123,Batavia to WGS 84 (1),,,,Indonesia (Sumatra).,9603,-377.0,681.0,-50.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1124,Bermuda 1957 to WGS 84 (1),,,,Bermuda.,9603,-73.0,213.0,296.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1125,Bogota to WGS 84 (1),,,,Colombia.,9603,307.0,304.0,-318.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1126,Bukit Rimpah to WGS 84 (1),,,,Indonesia (Bangka & Belitung Islands).,9603,-384.0,664.0,-48.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1127,Campo Inchauspe to WGS 84 (1),,,,Argentina.,9603,-148.0,136.0,90.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1128,Cape to WGS 84 (1),,,,South Africa.,9603,-136.0,-108.0,-292.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1129,Cape to WGS 84 (2),,,,South Africa.,9603,-134.73,-110.92,-292.66,,,,,9001,,,,,,,1996-10-18 00:00:00,"Private Communication, Directorate of Surveys and Land Information, Cape Town.",EPSG,,
+1130,Carthage to WGS 84 (1),,,,Tunisia.,9603,-263.0,6.0,431.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1131,Chua to WGS 84 (1),,,,Paraguay.,9603,-134.0,229.0,-29.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1132,Corrego Alegre to WGS 84 (1),,,,Brazil.,9603,-206.0,172.0,-6.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1133,ED50 to WGS 84 (1),,,,MEAN FOR Austria; Belgium; Denmark; Finland;  France; Germany (west); Gibraltar; Greece;  Italy; Luxembourg; Netherlands; Norway;  Portugal; Spain; Sweden; Switzerland.,9603,-87.0,-98.0,-121.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,97.02
+1134,ED50 to WGS 84 (2),,,,MEAN FOR Austria; Denmark; France; Germany (west); Netherlands; Switzerland.,9603,-87.0,-96.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1135,ED50 to WGS 84 (3),,,,MEAN FOR Iraq; Israel; Jordan; Lebanon;  Kuwait; Saudi Arabia; Syria.,9603,-103.0,-106.0,-141.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1136,ED50 to WGS 84 (4),,,,Cyprus.,9603,-104.0,-101.0,-140.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1137,ED50 to WGS 84 (5),,,,Egypt.,9603,-130.0,-117.0,-151.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1138,ED50 to WGS 84 (6),,,,Ireland; United Kingdom (UK).,9603,-86.0,-96.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1139,ED50 to WGS 84 (7),,,,Finland; Norway.,9603,-87.0,-95.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1140,ED50 to WGS 84 (8),,,,Greece.,9603,-84.0,-95.0,-130.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1141,ED50 to WGS 84 (9),,,,Iran.,9603,-117.0,-132.0,-164.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1142,ED50 to WGS 84 (10),,,,Italy (Sardinia).,9603,-97.0,-103.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1143,ED50 to WGS 84 (11),,,,Italy (Sicily).,9603,-97.0,-88.0,-135.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1144,ED50 to WGS 84 (12),,,,Malta.,9603,-107.0,-88.0,-149.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1145,ED50 to WGS 84 (13),,,,Portugal; Spain.,9603,-84.0,-107.0,-120.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1146,ED87 to WGS 84 (1),,,,Denmark - North Sea;  Germany - North Sea;  Netherlands - offshore;  Norway; United Kingdom (UKCS) - North Sea south of 62 deg N.,9606,-82.981,-99.719,-110.709,-0.5076,0.1503,0.3898,-0.3143,9001,9109,,9202,,,,1997-04-11 00:00:00,"Norwegian Mapping Authority publication 1990:1 and note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"",EPSG,,97.03  97.04
+1147,ED50 to ED87 (2),,,,Norway - offshore north of 65 deg N.,9606,-1.51,-0.84,-3.5,-1.893,-0.687,-2.764,0.609,9001,9109,,9202,,,,1997-04-11 00:00:00,"Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"",EPSG,,97.04
+1148,Egypt 1907 to WGS 84 (1),,,,Egypt.,9603,-130.0,110.0,-13.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1149,ETRF89 to WGS 84 (1),,,,Europe.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1997-06-16 00:00:00,EPSG,EPSG,ETRF89 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,97.24
+1150,GDA94 to WGS 84 (1),,,,Australia.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1996-10-18 00:00:00,EPSG,EPSG,GDA94 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,
+1151,GD49 to WGS 84 (1),,,,New Zealand.,9603,84.0,-22.0,209.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1152,Hu Tzu Shan to WGS 84 (1),,,,Taiwan.,9603,-637.0,-549.0,-203.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1153,Indian 1954 to WGS 84 (1),,,,Thailand.,9603,217.0,823.0,299.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,97.06
+1154,Indian 1975 to WGS 84 (1),,,,Thailand.,9603,209.0,818.0,290.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 second edition September 1991,EPSG,,
+1155,Kalianpur 1937 to WGS 84 (1),,,,Bangladesh.,9603,282.0,726.0,254.0,,,,,9001,,,,,,,1999-10-20 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,97.235
+1156,Kalianpur 1975 to WGS 84 (1),,,,India; Nepal.,9603,295.0,736.0,257.0,,,,,9001,,,,,,,1999-10-20 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,Care!  DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.,97.235
+1157,Kandawala to WGS 84 (1),,,,Sri Lanka.,9603,-97.0,787.0,86.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1158,Kertau to WGS 84 (1),,,,Malaysia - West Malaysia; Singapore.,9603,-11.0,851.0,5.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1159,Leigon to WGS 84 (1),,,,Ghana.,9603,-130.0,29.0,364.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1160,Liberia 1964 to WGS 84 (1),,,,Liberia.,9603,-90.0,40.0,88.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1161,Luzon 1911 to WGS 84 (1),,,,Philippines (excluding Mindanao).,9603,-133.0,-77.0,-51.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1162,Luzon 1911 to WGS 84 (2),,,,Philippines (Mindanao).,9603,-133.0,-79.0,-72.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1163,M'poraloko to WGS 84 (1),,,,Gabon.,9603,-74.0,-130.0,42.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1164,Mahe 1971 to WGS 84 (1),,,,Seychelles - Mahe Island.,9603,41.0,-220.0,-134.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1165,Massawa to WGS 84 (1),,,,Ethiopia (Eritrea).,9603,639.0,405.0,60.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1166,Merchich to WGS 84 (1),,,,Morocco.,9603,31.0,146.0,47.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1167,Minna to WGS 84 (1),,,,Cameroon.,9603,-81.0,-84.0,115.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1168,Minna to WGS 84 (2),,,,Nigeria.,9603,-92.0,-93.0,122.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1169,Monte Mario to WGS 84 (1),,,,Italy (Sardinia).,9603,-225.0,-65.0,9.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1170,NAD27 to WGS 84 (1),,,,MEAN FOR Antigua; Barbados; Barbuda;  Caicos Islands; Cuba; Dominican Republic;  Grand Cayman; Jamaica; Turks Islands.,9603,-3.0,142.0,183.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1171,NAD27 to WGS 84 (2),,,,MEAN FOR Belize; Costa Rica; El Salvador;  Guatemala; Honduras; Nicaragua.,9603,0.0,125.0,194.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1172,NAD27 to WGS 84 (3),,,,MEAN FOR Canada.,9603,-10.0,158.0,187.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1173,NAD27 to WGS 84 (4),,,,MEAN FOR United States (USA) (CONUS).,9603,-8.0,160.0,176.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1174,NAD27 to WGS 84 (5),,,,MEAN FOR United States (USA) (CONUS East of Mississippi River  including Louisiana; Missouri; Minnesota).,9603,-9.0,161.0,179.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1175,NAD27 to WGS 84 (6),,,,MEAN FOR United States (USA) (CONUS West of Mississippi River).,9603,-8.0,159.0,175.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1176,NAD27 to WGS 84 (7),,,,United States (USA) - Alaska (Excluding Aleutian Islands).,9603,-5.0,135.0,172.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1177,NAD27 to WGS 84 (8),,,,Bahamas (Except San Salvador Island).,9603,-4.0,154.0,178.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1178,NAD27 to WGS 84 (9),,,,Bahamas (San Salvador Island).,9603,1.0,140.0,165.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1179,NAD27 to WGS 84 (10),,,,Canada (Alberta; British Columbia).,9603,-7.0,162.0,188.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1180,NAD27 to WGS 84 (11),,,,Canada (Manitoba; Ontario).,9603,-9.0,157.0,184.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1181,NAD27 to WGS 84 (12),,,,Canada (New Brunswick; Newfoundland; Nova Scotia; Quebec).,9603,-22.0,160.0,190.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1182,NAD27 to WGS 84 (13),,,,Canada (Northwest Territories; Nunavut; Saskatchewan).,9603,4.0,159.0,188.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1183,NAD27 to WGS 84 (14),,,,Canada (Yukon).,9603,-7.0,139.0,181.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1184,NAD27 to WGS 84 (15),,,,Panama - Canal Zone.,9603,0.0,125.0,201.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1185,NAD27 to WGS 84 (16),,,,Cuba.,9603,-9.0,152.0,178.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1186,NAD27 to WGS 84 (17),,,,Greenland (Hayes Peninsula).,9603,11.0,114.0,195.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1187,NAD27 to WGS 84 (18),,,,Mexico.,9603,-12.0,130.0,190.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1188,NAD83 to WGS 84 (1),,,,Canada; Central America; Mexico; United States (USA) (Alaska (excluding Aleutian Islands); CONUS).,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,NAD83 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,97.06
+1189,Nahrwan 1967 to WGS 84 (1),,,,Oman (Masirah Island).,9603,-247.0,-148.0,369.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1190,Nahrwan 1967 to WGS 84 (2),,,,Saudi Arabia.,9603,-243.0,-192.0,477.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1191,Nahrwan 1967 to WGS 84 (3),,,,United Arab Emirates (UAE).,9603,-249.0,-156.0,381.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1192,Naparima 1972 to WGS 84 (1),,,,Trinidad and Tobago.,9603,-10.0,375.0,165.0,,,,,9001,,,,,,,1998-06-30 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,CAUTION: EPSG believes that these parameter values include a blunder and that if NIMA transformation parameters are to be used the 1987 version (EPSG code 1307) be used.,98.102
+1193,NTF to WGS 84 (1),,,,France.,9603,-168.0,-60.0,320.0,,,,,9001,,,,,,,1996-10-18 00:00:00,IGN technical report RT/G 14; January 1988.,EPSG,,
+1195,OSGB 1936 to WGS 84 (1),,,,MEAN FOR United Kingdom (UK) - Great Britain (England; Scotland; Wales); Isle of Man.,9603,375.0,-111.0,431.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1196,OSGB 1936 to WGS 84 (2),,,,United Kingdom (UK) - England.,9603,371.0,-112.0,434.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1197,OSGB 1936 to WGS 84 (3),,,,United Kingdom (UK) - England; Wales; Isle of Man.,9603,371.0,-111.0,434.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1198,OSGB 1936 to WGS 84 (4),,,,United Kingdom (UK) - Scotland (including Shetland Islands).,9603,384.0,-111.0,425.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1199,OSGB 1936 to WGS 84 (5),,,,United Kingdom (UK) - Wales.,9603,370.0,-108.0,434.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1200,Pointe Noire to WGS 84 (1),,,,Congo.,9603,-148.0,51.0,-291.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1201,PSAD56 to WGS 84 (1),,,,MEAN FOR Bolivia; Chile; Colombia;  Ecuador; Guyana; Peru; Venezuela.,9603,-288.0,175.0,-376.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1202,PSAD56 to WGS 84 (2),,,,Bolivia.,9603,-270.0,188.0,-388.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1203,PSAD56 to WGS 84 (3),,,,Chile (Northern; near 19 deg S).,9603,-270.0,183.0,-390.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1204,PSAD56 to WGS 84 (4),,,,Chile (Southern; near 43 deg S).,9603,-305.0,243.0,-442.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1205,PSAD56 to WGS 84 (5),,,,Colombia.,9603,-282.0,169.0,-371.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1206,PSAD56 to WGS 84 (6),,,,Ecuador.,9603,-278.0,171.0,-367.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1207,PSAD56 to WGS 84 (7),,,,Guyana.,9603,-298.0,159.0,-369.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1208,PSAD56 to WGS 84 (8),,,,Peru.,9603,-279.0,175.0,-379.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1209,PSAD56 to WGS 84 (9),,,,Venezuela.,9603,-295.0,173.0,-371.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1210,Qatar to WGS 84 (1),,,,Qatar.,9603,-128.0,-283.0,22.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1211,Qornoq to WGS 84 (1),,,,Greenland (South).,9603,164.0,138.0,-189.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1212,SAD69 to WGS 84 (1),,,,MEAN FOR Argentina; Bolivia; Brazil; Chile;  Colombia; Ecuador; Guyana; Paraguay;  Peru; Trinidad & Tobago; Venezuela.,9603,-57.0,1.0,-41.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1213,SAD69 to WGS 84 (2),,,,Argentina.,9603,-62.0,-1.0,-37.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1214,SAD69 to WGS 84 (3),,,,Bolivia.,9603,-61.0,2.0,-48.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1215,SAD69 to WGS 84 (4),,,,Brazil.,9603,-60.0,-2.0,-41.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1216,SAD69 to WGS 84 (5),,,,Chile.,9603,-75.0,-1.0,-44.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1217,SAD69 to WGS 84 (6),,,,Colombia.,9603,-44.0,6.0,-36.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1218,SAD69 to WGS 84 (7),,,,Ecuador.,9603,-48.0,3.0,-44.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1219,SAD69 to WGS 84 (8),,,,Ecuador (Baltra; Galapagos).,9603,-47.0,26.0,-42.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1220,SAD69 to WGS 84 (9),,,,Guyana.,9603,-53.0,3.0,-47.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1221,SAD69 to WGS 84 (10),,,,Paraguay.,9603,-61.0,2.0,-33.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1222,SAD69 to WGS 84 (11),,,,Peru.,9603,-58.0,0.0,-44.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1223,SAD69 to WGS 84 (12),,,,Trinidad and Tobago.,9603,-45.0,12.0,-33.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1224,SAD69 to WGS 84 (13),,,,Venezuela.,9603,-45.0,8.0,-33.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1225,Sapper Hill 1943 to WGS 84 (1),,,,Falkland Islands - East Falkland Island.,9603,-355.0,21.0,72.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1226,Schwarzeck to WGS 84 (1),,,,Namibia.,9603,616.0,97.0,-251.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1227,Tananarive to WGS 84 (1),,,,Madagascar.,9603,-189.0,-242.0,-91.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1228,Timbalai 1948 to WGS 84 (1),,,,Brunei; Malaysia (Sabah; Sarawak).,9603,-679.0,669.0,-48.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1229,TM65 to WGS 84 (1),,,,Ireland.,9603,506.0,-122.0,611.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1230,Tokyo to WGS 84 (1),,,,MEAN FOR Japan; South Korea; Okinawa.,9603,-148.0,507.0,685.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,97.06
+1231,Tokyo to WGS 84 (2),,,,Japan.,9603,-148.0,507.0,685.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1232,Tokyo to WGS 84 (3),,,,South Korea.,9603,-146.0,507.0,687.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,97.06
+1233,Tokyo to WGS 84 (4),,,,Japan (Okinawa).,9603,-158.0,507.0,676.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1234,Yacare to WGS 84 (1),,,,Uruguay.,9603,-155.0,171.0,37.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1235,Zanderij to WGS 84 (1),,,,Suriname.,9603,-265.0,120.0,-358.0,,,,,9001,,,,,,,1996-10-18 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,,
+1236,AGD84 to WGS 84 (2),,,,Australia.,9607,-116.0,-50.47,141.69,-0.23,-0.39,-0.344,0.0983,9001,9104,,9202,,,,1997-11-13 00:00:00,Australian Surveying and Land Information Group - www.auslig.gov.au/geodesy,EPSG,Superseded by AGD84 to GDA94 (2) (code 1280).,
+1237,WGS 72 to WGS 84 (1),,,,World.,9606,0.0,0.0,4.5,0.0,0.0,0.554,0.2263,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1238,WGS 72 to WGS 84 (2),,,,World.,9606,0.0,0.0,4.5,0.0,0.0,0.554,0.219,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1239,WGS 72BE to WGS 72 (1),,,,World.,9606,0.0,0.0,-2.6,0.0,0.0,0.26,-0.6063,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1240,WGS 72BE to WGS 84 (1),,,,World.,9606,0.0,0.0,1.9,0.0,0.0,0.814,-0.38,9001,9104,,9202,,,,1996-12-12 00:00:00,,EPSG,,
+1241,NAD27 to NAD83 (1),,,,United States (USA) - lower 48 states including EEZ.,9613,,,,,,,,,9104,,,conus.las,conus.los,,1999-04-22 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,98.201  98.53
+1243,NAD27 to NAD83 (2),,,,United States (USA) - Alaska including EEZ.,9613,,,,,,,,,9104,,,alaska.las,alaska.los,,1999-04-22 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,98.201  98.53
+1245,ED50 to WGS 84 (16),,,,Tunisia.,9603,-112.0,-77.0,-145.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,98.11
+1246,Herat North to WGS 84 (1),,,,Afghanistan.,9603,-333.0,-222.0,114.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1247,Kalianpur 1962 to WGS 84 (1),,,,Pakistan.,9603,283.0,682.0,231.0,,,,,9001,,,,,,,1999-10-20 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,Care!  DMA ellipsoid is inconsistent with EPSG ellipsoid - transformation parameter values may not be appropriate.,97.235
+1248,ID74 to WGS 84 (1),,,,Indonesia.,9603,-24.0,-15.0,5.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1249,NAD27 to WGS 84 (21),,,,United States (USA) - Alaska - Aleutian Islands east of 180 deg.,9603,-2.0,152.0,149.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1250,NAD27 to WGS 84 (22),,,,United States (USA) - Alaska - Aleutian Islands west of 180 deg.,9603,2.0,204.0,105.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1251,NAD83 to WGS 84 (2),,,,United States (USA) - Alaska - Aleutian Islands.,9603,-2.0,0.0,4.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1252,NAD83 to WGS 84 (3),,,,United States (USA) - Hawaii.,9603,1.0,1.0,-1.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1253,Nord Sahara 1959 to WGS 84 (1),,,,Algeria.,9603,-186.0,-93.0,310.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1254,Pulkovo 1942 to WGS 84 (1),,,,Russia.,9603,28.0,-130.0,-95.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1255,Voirol Unifie to WGS 84 (1),,,,Algeria - north of 35g (31 deg 30 min) North.,9603,-123.0,-206.0,219.0,,,,,9001,,,,,,,1998-06-30 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,CAUTION:   EPSG believes that the data used in the derivation of these parameters contains a blunder.  We recommend using transformation 1253 [North Sahara 1959 to WGS84 (1)] as Voirol 1960 geographical coordinates are the same as Nord Sahara 1959 geogs.,98.15
+1256,Fahud to WGS 84 (1),,,,Oman.,9603,-346.0,-1.0,224.0,,,,,9001,,,,,,,1997-04-11 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1257,Bern 1898 (Bern) to Bern 1898,,,,Liechtenstein;  Switzerland.,9601,7.26225,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1258,Bogota (Bogota) to Bogota,,,,Colombia.,9601,-74.04513,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1259,Lisbon (Lisbon) to Lisbon,,,,Portugal - onshore.,9601,-9.0754862,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1260,Makassar (Jakarta) to Makassar,,,,Indonesia - south west Sulawesi.,9601,106.482779,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1261,MGI (Ferro) to MGI,,,,Austria.,9601,-17.4,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1262,Monte Mario (Rome) to Monte Mario,,,,Italy.,9601,12.27084,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,98.37  99.79
+1263,Padang (Jakarta) to Padang,,,,Indonesia - Sumatra.,9601,106.482779,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1264,Belge 1950 (Brussels) to Belge 1950,,,,Belgium - onshore.,9601,4.220471,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1265,Tananarive (Paris) to Tananarive,,,,Madagascar.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1266,Voirol 1875 (Paris) to Voirol 1875,,,,Algeria - north of 32 deg N.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1267,Voirol Unifie (Paris) to Voirol Unifie,,,,Algeria - north of 32 deg N.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1268,Batavia (Jakarta) to Batavia,,,,Indonesia - Java.,9601,106.482779,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1269,RT38 (Stockholm) to RT38,,,,Sweden.,9601,18.03298,,,,,,,,9110,,,,,,1999-11-12 00:00:00,EPSG,EPSG,Change of prime meridian.,99.79
+1270,Greek (Athens) to Greek,,,,Greece - onshore.,9601,23.4258815,,,,,,,,9110,,,,,,1999-11-12 00:00:00,Topography Department; National Technical University of Athens.,EPSG,Change of prime meridian.,99.79
+1271,Schwarzeck to WGS 84 (2),,,,Namibia.,9603,615.64,102.08,-255.81,,,,,9001,,,,,,,1997-11-13 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,Beware !   Schwarzeck CS uses German legal metres.  Example:  Schwarzeck Lat 19d 35m 46.952s S Long 20d 41m 50.649s E; X=5623409.40 Y=2124618.00 Z=-2125847.62 GLM; X=5623485.86 Y=2124646.89 Z=-2125876.53 m; WGS84 X=5624101.50 Y=2124748.97 Z=2126132.34 m.,97.48
+1272,GGRS87 to WGS 84 (1),,,,Greece.,9603,-199.87,74.79,246.62,,,,,9001,,,,,,,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,,
+1273,HD72 to ETRF89 (1),,,,Hungary.,9607,-56.0,75.77,15.31,-0.37,-0.2,-0.21,-1.01,9001,9104,,9202,,,,1997-11-13 00:00:00,http://lazarus.elte.hu/gb/geodez/geod5.htm,EPSG,,97.47
+1274,Pulkovo 1942 to LKS94(ETRS89) (1),CS42 to LKS94 (1),,,Lithuania.,9607,-40.595,-18.55,-69.339,-2.508,-1.832,2.611,-4.299,9001,9104,,9202,,,,1998-03-12 00:00:00,HNIT-BALTIC GeoInfoServisas.,EPSG,,
+1275,ED50 to WGS 84 (17),,,,France.,9603,-84.0,-97.0,-117.0,,,,,9001,,,,,,,1998-04-16 00:00:00,IGN technical report 14 (January 1988).,EPSG,,98.11
+1276,NTF to ED50 (1),,,,France.,9603,-84.0,37.0,437.0,,,,,9001,,,,,,,1997-11-13 00:00:00,IGN technical report 7 (October 1981).,EPSG,,
+1277,NTF to WGS 72 (1),,,,France.,9603,-168.0,-72.0,314.0,,,,,9001,,,,,,,1997-11-13 00:00:00,IGN technical report 7 (October 1981).,EPSG,,
+1278,AGD66 to GDA94 (1),,,,Australia.,9603,-127.8,-52.3,152.9,,,,,9001,,,,,,,1997-11-13 00:00:00,http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,5m accuracy.  Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html,
+1279,AGD84 to GDA94 (1),,,,Australia.,9603,-128.5,-53.0,153.4,,,,,9001,,,,,,,1997-11-13 00:00:00,http://www.anzlic.org.au/icsm/gdatm/molodens.htm,EPSG,5m accuracy.  Parameter values are given to greater precision but no better accuracy at http://www.dehaa.sa.gov.au/res_inform/sicom/where/geobas14.html,
+1280,AGD84 to GDA94 (2),,,,Australia.,9607,-117.763,-51.51,139.061,-0.292,-0.443,-0.277,-0.191,9001,9104,,9202,,,,1997-11-13 00:00:00,http://www.anzlic.org.au/icsm/gdatm/simil.htm,EPSG,1m accuracy.  Supersedes AGD84 to WGS 84 (2) (code 1236).,
+1282,Samboja to WGS 84 (1),,,,Indonesia - east Kalimantan - Mahakam delta area.,9603,-404.78,-685.68,-45.47,,,,,9001,,,,,,,1997-11-13 00:00:00,Total Indonesia.,EPSG,Datum shift derived through ITRF93.,
+1283,LKS94(ETRS89) to WGS 84 (1),LKS94 to WGS 84 (1),,,Lithuania.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1998-03-12 00:00:00,HNIT-BALTIC GeoInfoServisas.,EPSG,LKS94 is a realisation of WGS84 coincident to within 1.5 metres.  This transformation has an accuracy equal to the coincidence figure.,98.13
+1284,Arc 1960 to WGS 84 (2),,,,Kenya.,9603,-157.0,-2.0,-299.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1285,Arc 1960 to WGS 84 (3),,,,Tanzania.,9603,-175.0,-23.0,-303.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1286,Segora to WGS 84 (1),,,,Indonesia - Kalimantan.,9603,-403.0,684.0,41.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1287,Pulkovo 1942 to WGS 84 (3),,,,Hungary.,9603,28.0,-121.0,-77.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1288,Pulkovo 1942 to WGS 84 (4),,,,Poland.,9603,23.0,-124.0,-82.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1289,Pulkovo 1942 to WGS 84 (5),,,,Czech Republic.,9603,26.0,-121.0,-78.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1290,Pulkovo 1942 to WGS 84 (6),,,,Latvia.,9603,24.0,-124.0,-82.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1291,Pulkovo 1942 to WGS 84 (7),,,,Kazakstan.,9603,15.0,-130.0,-84.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1292,Pulkovo 1942 to WGS 84 (8),,,,Albania.,9603,24.0,-130.0,-92.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1293,Pulkovo 1942 to WGS 84 (9),,,,Romania.,9603,28.0,-121.0,-77.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,98.11
+1294,Voirol 1875 to WGS 84 (1),,,,Algeria - north of 35g (31 deg 30 min) North.,9603,-73.0,-247.0,227.0,,,,,9001,,,,,,,1998-03-12 00:00:00,U.S. Defense Mapping Agency  TR8350.2 revision of August 1993.,EPSG,,
+1295,Naparima 1972 to WGS 84 (2),,,,Trinidad and Tobago.,9603,-0.465,372.095,171.736,,,,,9001,,,,,,,1998-11-11 00:00:00,Trinidad Ministry of Energy and Energy Industries.,EPSG,,98/38
+1296,Trinidad 1903 to WGS 84 (1),,,,Trinidad.,9603,-61.702,284.488,472.052,,,,,9001,,,,,,,1998-11-11 00:00:00,Trinidad Ministry of Energy and Energy Industries.,EPSG,,98/38
+1297,Tete to Moznet (1),,,,Mozambique.,9607,-115.064,-87.39,-101.716,0.058,-4.001,2.062,9.366,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 32 stations. Residuals as high as 30 metres. To reduce the size of the residuals; four regional parameter sets (codes 1298-1301) were developed.,
+1298,Tete to Moznet (2),,,,Mozambique - Maputo province and southern part of Gaza province; i.e. south of approximately 24 deg S.,9607,-82.875,-57.097,-156.768,2.158,-1.524,0.982,-0.359,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 9 stations; residuals are generally under 1 metre.,
+1299,Tete to Moznet (3),,,,Mozambique - provinces of Gaza; Inhambane and southern parts of Sofala and Manhica; i.e. between approximately 24 and 20 deg South.,9607,-138.527,-91.999,-114.591,0.14,-3.363,2.217,11.748,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 6 stations; residuals are generally under 4 metres.,
+1300,Tete to Moznet (4),,,,Mozambique - provinces of Sofala north of Beira corridor; Manhica; Tete and Zambezia; i.e. between approximately 20 and 16 deg South.,9607,-73.472,-51.66,-112.482,-0.953,-4.6,2.368,0.586,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 11 stations; residuals are generally under 3 metres.,
+1301,Tete to Moznet (5),,,,Mozambique - provinces of Nampula; Niassa; Cabo Delgado; i.e. north of approximately 16 deg S.,9607,219.315,168.975,-166.145,-0.198,-5.926,2.356,-57.104,9001,9104,,9202,,,,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean of 7 stations; residuals are 5-10 metres.,
+1302,Moznet to WGS 84 (1),,,,Mozambique.,9607,0.0,0.0,0.0,0.0,0.0,0.0,0.0,9001,9104,,9202,,,,1998-04-16 00:00:00,EPSG,EPSG,For many purposes Moznet can be considered to be coincident with WGS 84. Accuracy better than 1 metre.,
+1303,Pulkovo 1942 to WGS 84 (10),,,,Kazakstan - Caspian.,9606,43.661,-103.342,-124.117,1.659,-0.824,0.653,0.59,9001,9104,,9202,,,,1998-04-16 00:00:00,KazakCaspiShelf consortium.,EPSG,Mean of 13 stations along entire Kazak coastline; residuals under 2 m.,
+1304,Indian 1975 to WGS 84 (2),,,,Thailand.,9603,210.0,814.0,289.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1305,Tokyo to WGS 84 (5),,,,South Korea.,9603,-147.0,506.0,687.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1306,MGI to WGS 84 (1),,,,MEAN FOR Boznia and Herzegovina; Croatia; Serbia; Slovenia.,9603,682.0,-203.0,480.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. National Imagery and Mapping Agency  TR8350.2 revision of October 1997; http://164.214.2.59/geospatial/products/GandG/tr83502b/toc.html,EPSG,,
+1307,Naparima 1972 to WGS 84 (3),,,,Trinidad & Tobago.,9603,-2.0,374.0,172.0,,,,,9001,,,,,,,1998-04-16 00:00:00,U.S. Defense Mapping Agency  TR8350.2 December 1987.,EPSG,See remarks for code 1192.,
+1308,NAD83 to WGS 84 (4),,,,United States (USA),9607,-0.9738,1.9453,0.5486,-0.00000013357,-0.00000004872,-0.00000005507,0.0,9001,9101,,9202,,,,1999-04-22 00:00:00, http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,Strictly between NAD83 and ITRF94(1996.0).  Superseded by NAD83 to WGS 84 (5) (code 1515).,99.12  99.38
+1309,DHDN to ETRF89 (1),,,,Germany - former west Germany.,9607,582.0,105.0,414.0,-1.04,-0.35,3.08,8.3,9001,9104,,9202,,,,1998-06-30 00:00:00,Institute for Cartography and Geodesy; Leipzig.,EPSG,Mean of 69 stations; residuals under 5 m.,
+1310,Pulkovo 1942 to ETRF89 (1),,,,Germany - former east Germany - Brandenburg; Mecklenburg-Vorpommern; Sachsen-Anhalt.,9607,24.0,-123.0,-94.0,-0.02,0.25,0.13,1.1,9001,9104,,9202,,,,1998-06-30 00:00:00,Institute for Cartography and Geodesy; Leipzig.,EPSG,Mean of 20 stations; residuals under 2 m.,
+1311,ED50 to WGS 84 (Common Offshore),ED50 to WGS 84 (18),,,United Kingdom - UKCS offshore east of 6 deg west.,9606,-89.5,-93.8,-123.1,0.0,0.0,-0.156,1.2,9001,9104,,9202,,,,1998-06-30 00:00:00,The Hydrographic Journal; vol 52 page 50.,EPSG,Recommended transformation for UKCS petroleum purposes.  Based on ED50 to WGS72 (precise ephemeris) 6-nations agreement of 1981 to which precise to broadcast and broadcast to WGS 84 transformations have been concatenated.,98.27
+1312,NAD27 to NAD83 (3),,,,Canada.,9614,,,,,,,,,9104,,,NTv1_0.gsb,,,1999-04-22 00:00:00,Geomatics Canada - Geodetic Survey Division.,EPSG,Uses NTv1 method.  Superseded in 1997 by NTv2 (non-poly transformation code 1313) except in Quebec.   Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.,
+1313,NAD27 to NAD83 (4),,,,Canada.,9615,,,,,,,,,9104,,,NTv2_0.gsb,,,1999-04-22 00:00:00,http://www.geod.nrcan.gc.ca/products/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,Uses NTv2 data files.  Supersedes  NTv1 (non-poly transformation code 1312) except in Quebec.  Input expects longitudes to be positive west; EPSG GeogCS NAD27 (code 4267) and (code 4269) have longitudes positive east.,
+1314,OSGB 1936 to WGS 84 (Petroleum),,,,United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.,9606,446.448,-125.157,542.06,0.15,0.247,0.842,-20.489,9001,9104,,9202,,,,1998-11-11 00:00:00,UK Offshore Operators Association.,EPSG,Accuracy better than 4m and generally better than 2m.  For a more accurate transformation contact the Ordnance Survey of Great Britain.,
+1315,OSGB 1936 to ED50 (UKOOA),,,,United Kingdom (UKCS) - Great Britain (GB) - England; Scotland; Wales; - North Sea.,9606,535.948,-31.357,665.16,0.15,0.247,0.998,-21.689,9001,9104,,9202,,,,1998-11-11 00:00:00,UK Offshore Operators Association.,EPSG,This transformation is concatenated from OSGB36 to WGS 84 (Petroleum) (code 1314) minus ED50 to WGS 84 (Common Offshore) (code 1311).,
+1316,Manoca to WGS 84 (1),,,,Cameroon.,9603,-70.9,-151.8,-41.4,,,,,9001,,,,,,,1998-11-11 00:00:00,Stolt Comex Seaway and Geoid for Elf.,EPSG,,
+1317,Camacupa to WGS 72BE (1),,,,Angola - offshore.,9603,-37.2,-370.6,-228.5,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived by Geophysical Services Inc. in 1979 from mean of Transit results at 7 stations.,
+1318,Camacupa to WGS 84 (1),,,,Angola - offshore block 5.,9603,-42.01,-332.21,-229.75,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Used by Conoco.,
+1319,Camacupa to WGS 84 (2),,,,Angola - offshore block 2.,9603,-40.0,-354.0,-224.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Used by Texaco.,
+1320,Camacupa to WGS 84 (3),,,,Angola - offshore blocks 1 and 16.,9606,-37.2,-370.6,-224.0,0.0,0.0,0.554,0.219,9001,9104,8901,9202,,,,1998-12-14 00:00:00,EPSG,EPSG,Used by Shell prior to 1994.  Superseded by Camacupa to WGS 84 (9).,98.56
+1321,Camacupa to WGS 84 (4),,,,Angola - offshore blocks 7 and 8.  Also used rounded to integer metre for GSI/HGS/Western Geophysical speculative seismic data.,9603,-42.5,-342.5,-228.1,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived as mean of 123 Transit passes at station Cabo Ledo NE base in January 1989.  Used by Total for block 8. Used by Elf for block 7 up to December 1992 then superseded by Camacupa to WGS 84 (7).,
+1322,Camacupa to WGS 84 (5),,,,Angola - offshore block 3.,9603,-55.5,-348.0,-229.2,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at station Djeno during coordination of platform PAL F2 in February 1992. Used by Elf for block 3 up to December 1992 then superseded by Camacupa to WGS 84 (7).,
+1323,Camacupa to WGS 84 (6),,,,Angola - offshore block 7.,9603,-43.0,-337.0,-233.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at Luanda observatory December 1992.  Used by Elf for 1993 block 7 shallow water survey.,
+1324,Camacupa to WGS 84 (7),,,,Angola - offshore blocks 3  7  15 and 17.,9603,-48.0,-345.0,-231.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,"Derived at platform PAL F2 in December 1992.  Used by Elf for blocks 3, 7 and 17 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10).  Used by Exxon for block 15 since 1993.",
+1325,Camacupa to WGS 84 (8),,,,Angola - offshore block 2.,9603,-48.6,-345.1,-230.8,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at platform PAL F2 in December 1992. Used by Total for block 2 between December 1992 and 1994 then superseded by Camacupa to WGS 84 (10).,
+1326,Camacupa to WGS 84 (9),,,,Angola - offshore blocks 1 16 and 18.,9606,-41.057,-374.564,-226.287,0.0,0.0,0.554,0.219,9001,9104,8901,9202,,,,1998-12-14 00:00:00,EPSG,EPSG,Used by Shell since 1994.  Supersedes Camacupa to WGS 84 (3).,98.56
+1327,Camacupa to WGS 84 (10),,,,Angola - offshore blocks 2  3 17 and 31-33.,9603,-50.9,-347.6,-231.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Derived at platform PAL F2 in 1994 by Topnav using Doris.  Used by Elf in blocks 3 and 17 since 1994.  Used by Total in block 2 since 1994. Adopted by BP-Amoco Elf and Exxon for blocks 31-33.,
+1328,Malongo 1987 to Mhast (1),,,,Angola - Cabinda offshore.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Malongo 1987 is an offshore extension of Mhast adopted by Chevron in 1987.,
+1329,Mhast to WGS 84 (1),,,,Angola - Cabinda offshore.,9603,-252.95,-4.11,-96.38,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,,
+1330,Malongo 1987 to WGS 84 (1),,,,Angola - Cabinda offshore.,9603,-252.95,-4.11,-96.38,,,,,9001,,,,,,,1998-11-11 00:00:00,EPSG,EPSG,Used by Chevron.,
+1331,EST92 to ETRF89 (1),,,,Estonia,9607,0.0,0.0,0.0,0.0,0.0,0.0,0.0,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1332,Pulkovo 1942 to EST92 (1),,,,Estonia.,9607,21.53219,-97.00027,-60.74046,-0.99548,-0.58147,-0.2418,-4.5981,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1333,EST92 to WGS84 (1),,,,Estonia.,9607,0.055,-0.541,-0.185,-0.0183,0.0003,0.007,-0.014,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1334,Pulkovo 1942 to WGS84 (12),,,,Estonia.,9607,21.58719,-97.54127,-60.92546,-1.01378,-0.58117,-0.2348,-4.6121,9001,9104,,9202,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+1335,Tokyo to WGS 84 (6),,,,Japan - 45d 20m to 46d N; 141d to 142d E.,9618,7.92,-13.88,26.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1336,Tokyo to WGS 84 (7),,,,Japan - 45d 20m to 46d N; 142d to 143d E.,9618,7.94,-13.97,26.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1337,Tokyo to WGS 84 (8),,,,Japan - 44deg 40min to 45deg 20min N; 141deg to 142deg E.,9618,8.1,-13.81,27.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1338,Tokyo to WGS 84 (9),,,,Japan - 44deg 40min to 45deg 20min N; 142deg to 143deg E.,9618,8.15,-13.95,28.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1339,Tokyo to WGS 84 (10),,,,Japan - 44deg to 44deg 40min N; 141deg to 142deg E.,9618,8.37,-13.65,29.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1340,Tokyo to WGS 84 (11),,,,Japan - 44deg to 44deg 40min N; 142deg to 143deg E.,9618,8.44,-13.87,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1341,Tokyo to WGS 84 (12),,,,Japan - 44deg to 44deg 40min N; 143deg to 144deg E.,9618,8.61,-14.08,30.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1342,Tokyo to WGS 84 (13),,,,Japan - 44deg to 44deg 40min N; 144deg to 145deg E.,9618,8.73,-14.3,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1343,Tokyo to WGS 84 (14),,,,Japan - 43deg 20min to 44deg N; 141deg to 142deg E.,9618,8.63,-13.49,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1344,Tokyo to WGS 84 (15),,,,Japan - 43deg 20min to 44deg N; 142deg to 143deg E.,9618,8.71,-13.73,31.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1345,Tokyo to WGS 84 (16),,,,Japan - 43deg 20min to 44deg N; 143deg to 144deg E.,9618,8.84,-14.03,31.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1346,Tokyo to WGS 84 (17),,,,Japan - 43deg 20min to 44deg N; 144deg to 145deg E.,9618,8.98,-14.33,32.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1347,Tokyo to WGS 84 (18),,,,Japan - 43deg 20min to 44deg N; 145deg to 146deg E.,9618,9.1,-14.56,32.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1348,Tokyo to WGS 84 (19),,,,Japan - 42deg 40min to 43deg 20min N; 140deg to 141deg E.,9618,8.79,-13.0,33.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1349,Tokyo to WGS 84 (20),,,,Japan - 42deg 40min to 43deg 20min N; 141deg to 142deg E.,9618,8.84,-13.31,31.4,,,,,9001,9104,,,,,,1999-11-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,99.77
+1350,Tokyo to WGS 84 (21),,,,Japan - 42deg 40min to 43deg 20min N; 142deg to 143deg E.,9618,8.98,-13.59,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1351,Tokyo to WGS 84 (22),,,,Japan - 42deg 40min to 43deg 20min N; 143deg to 144deg E.,9618,9.1,-13.91,29.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1352,Tokyo to WGS 84 (23),,,,Japan - 42deg 40min to 43deg 20min N; 144deg to 145deg E.,9618,9.17,-14.27,31.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1353,Tokyo to WGS 84 (24),,,,Japan - 42deg 40min to 43deg 20min N; 145deg to 146deg E.,9618,9.23,-14.52,31.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1354,Tokyo to WGS 84 (25),,,,Japan - 42deg to 42deg 40min N; 139deg to 140deg E.,9618,8.9,-12.68,34.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1355,Tokyo to WGS 84 (26),,,,Japan - 42deg to 42deg 40min N; 140deg to 141deg E.,9618,8.99,-12.8,34.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1356,Tokyo to WGS 84 (27),,,,Japan - 42deg to 42deg 40min N; 141deg to 142deg E.,9618,9.0,-13.07,31.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1357,Tokyo to WGS 84 (28),,,,Japan - 42deg to 42deg 40min N; 142deg to 143deg E.,9618,9.21,-13.51,27.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1358,Tokyo to WGS 84 (29),,,,Japan - 42deg to 42deg 40min N; 143deg to 144deg E.,9618,9.33,-13.66,23.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1359,Tokyo to WGS 84 (30),,,,Japan - 41deg 20min to 42deg N; 140deg to 141deg E.,9618,9.25,-12.72,34.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1360,Tokyo to WGS 84 (31),,,,Japan - 41deg 20min to 42deg N; 141deg to 142deg E.,9618,9.39,-12.91,31.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1361,Tokyo to WGS 84 (32),,,,Japan - 40deg 40min to 41deg 20min N; 140deg to 141deg E.,9618,9.55,-12.63,35.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1362,Tokyo to WGS 84 (33),,,,Japan - 40deg 40min to 41deg 20min N; 141deg to 142deg E.,9618,9.62,-12.82,34.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1363,Tokyo to WGS 84 (34),,,,Japan - 40deg to 40deg 40min N; 139deg to 140deg E.,9618,9.81,-12.29,36.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1364,Tokyo to WGS 84 (35),,,,Japan - 40deg to 40deg 40min N; 140deg to 141deg E.,9618,9.81,-12.45,37.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1365,Tokyo to WGS 84 (36),,,,Japan - 40deg to 40deg 40min N; 141deg to 142deg E.,9618,9.92,-12.79,38.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1366,Tokyo to WGS 84 (37),,,,Japan - 39deg 20min to 40deg N; 139deg to 140deg E.,9618,9.91,-12.21,36.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1367,Tokyo to WGS 84 (38),,,,Japan - 39deg 20min to 40deg N; 140deg to 141deg E.,9618,10.08,-12.35,39.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1368,Tokyo to WGS 84 (39),,,,Japan - 39deg 20min to 40deg N; 141deg to 142deg E.,9618,10.19,-12.74,40.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1369,Tokyo to WGS 84 (40),,,,Japan - 38deg 40min to 39deg 20min N; 139deg to 140deg E.,9618,10.29,-12.13,38.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1370,Tokyo to WGS 84 (41),,,,Japan - 38deg 40min to 39deg 20min N; 140deg to 141deg E.,9618,10.33,-12.27,40.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1371,Tokyo to WGS 84 (42),,,,Japan - 38deg 40min to 39deg 20min N; 141deg to 142deg E.,9618,10.45,-12.61,41.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1372,Tokyo to WGS 84 (43),,,,Japan - 38deg to 38deg 40min N; 139deg to 140deg E.,9618,10.54,-11.96,39.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1373,Tokyo to WGS 84 (44),,,,Japan - 38deg to 38deg 40min N; 140deg to 141deg E.,9618,10.65,-12.27,41.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1374,Tokyo to WGS 84 (45),,,,Japan - 38deg to 38deg 40min N; 141deg to 142deg E.,9618,10.67,-12.5,41.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1375,Tokyo to WGS 84 (46),,,,Japan - 37deg 20min to 38deg N; 136deg to 137deg E.,9618,10.67,-10.86,38.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1376,Tokyo to WGS 84 (47),,,,Japan - 37deg 20min to 38deg N; 137deg to 138deg E.,9618,10.68,-10.97,36.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1377,Tokyo to WGS 84 (48),,,,Japan - 37deg 20min to 38deg N; 138deg to 139deg E.,9618,10.8,-11.53,39.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1378,Tokyo to WGS 84 (49),,,,Japan - 37deg 20min to 38deg N; 139deg to 140deg E.,9618,10.8,-11.73,40.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1379,Tokyo to WGS 84 (50),,,,Japan - 37deg 20min to 38deg N; 140deg to 141deg E.,9618,10.92,-12.16,42.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1380,Tokyo to WGS 84 (51),,,,Japan - 37deg 20min to 38deg N; 141deg to 142deg E.,9618,11.0,-12.25,41.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1381,Tokyo to WGS 84 (52),,,,Japan - 36deg 40min to 37deg 20min N; 136deg to 137deg E.,9618,10.83,-10.77,36.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1382,Tokyo to WGS 84 (53),,,,Japan - 36deg 40min to 37deg 20min N; 137deg to 138deg E.,9618,10.95,-11.0,38.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1383,Tokyo to WGS 84 (54),,,,Japan - 36deg 40min to 37deg 20min N; 138deg to 139deg E.,9618,10.97,-11.34,40.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1384,Tokyo to WGS 84 (55),,,,Japan - 36deg 40min to 37deg 20min N; 139deg to 140deg E.,9618,11.04,-11.69,43.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1385,Tokyo to WGS 84 (56),,,,Japan - 36deg 40min to 37deg 20min N; 140deg to 141deg E.,9618,11.17,-12.05,42.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1386,Tokyo to WGS 84 (57),,,,Japan - 36deg to 37deg 40min N; 136deg to 137deg E.,9618,11.11,-10.59,37.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1387,Tokyo to WGS 84 (58),,,,Japan - 36deg to 37deg 40min N; 137deg to 138deg E.,9618,11.16,-10.97,40.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1388,Tokyo to WGS 84 (59),,,,Japan - 36deg to 37deg 40min N; 138deg to 139deg E.,9618,11.29,-11.23,42.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1389,Tokyo to WGS 84 (60),,,,Japan - 36deg to 37deg 40min N; 139deg to 140deg E.,9618,11.36,-11.59,42.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1390,Tokyo to WGS 84 (61),,,,Japan - 36deg to 37deg 40min N; 140deg to 141deg E.,9618,11.44,-11.88,40.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1391,Tokyo to WGS 84 (62),,,,Japan - 35deg 20min to 36deg N; 132deg to 133deg E.,9618,11.27,-9.31,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1392,Tokyo to WGS 84 (63),,,,Japan - 35deg 20min to 36deg N; 133deg to 134deg E.,9618,11.33,-9.52,33.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1393,Tokyo to WGS 84 (64),,,,Japan - 35deg 20min to 36deg N; 134deg to 135deg E.,9618,11.38,-9.86,34.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1394,Tokyo to WGS 84 (65),,,,Japan - 35deg 20min to 36deg N; 135deg to 136deg E.,9618,11.41,-10.14,35.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1395,Tokyo to WGS 84 (66),,,,Japan - 35deg 20min to 36deg N; 136deg to 137deg E.,9618,11.39,-10.52,37.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1396,Tokyo to WGS 84 (67),,,,Japan - 35deg 20min to 36deg N; 137deg to 138deg E.,9618,11.49,-10.83,39.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1397,Tokyo to WGS 84 (68),,,,Japan - 35deg 20min to 36deg N; 138deg to 139deg E.,9618,11.58,-11.21,41.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1398,Tokyo to WGS 84 (69),,,,Japan - 35deg 20min to 36deg N; 139deg to 140deg E.,9618,11.65,-11.53,38.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1399,Tokyo to WGS 84 (70),,,,Japan - 35deg 20min to 36deg N; 140deg to 141deg E.,9618,11.72,-11.8,34.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1400,Tokyo to WGS 84 (71),,,,Japan - 34deg 40min to 35deg 20min N; 132deg to 133deg E.,9618,11.44,-9.21,32.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1401,Tokyo to WGS 84 (72),,,,Japan - 34deg 40min to 35deg 20min N; 133deg to 134deg E.,9618,11.47,-9.52,35.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1402,Tokyo to WGS 84 (73),,,,Japan - 34deg 40min to 35deg 20min N; 134deg to 135deg E.,9618,11.55,-9.8,35.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1403,Tokyo to WGS 84 (74),,,,Japan - 34deg 40min to 35deg 20min N; 135deg to 136deg E.,9618,11.61,-10.12,35.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1404,Tokyo to WGS 84 (75),,,,Japan - 34deg 40min to 35deg 20min N; 136deg to 137deg E.,9618,11.66,-10.47,37.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1405,Tokyo to WGS 84 (76),,,,Japan - 34deg 40min to 35deg 20min N; 137deg to 138deg E.,9618,11.78,-10.79,39.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1406,Tokyo to WGS 84 (77),,,,Japan - 34deg 40min to 35deg 20min N; 138deg to 139deg E.,9618,11.85,-11.13,39.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1407,Tokyo to WGS 84 (78),,,,Japan - 34deg 40min to 35deg 20min N; 139deg to 140deg E.,9618,11.9,-11.47,36.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1408,Tokyo to WGS 84 (79),,,,Japan - 34deg 40min to 35deg 20min N; 140deg to 141deg E.,9618,11.91,-11.69,33.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1409,Tokyo to WGS 84 (80),,,,Japan - 34deg to 34deg 40min N; 130deg to 131deg E.,9618,11.65,-8.59,29.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1410,Tokyo to WGS 84 (81),,,,Japan - 34deg to 34deg 40min N; 131deg to 132deg E.,9618,11.68,-8.8,30.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1411,Tokyo to WGS 84 (82),,,,Japan - 34deg to 34deg 40min N; 132deg to 133deg E.,9618,11.73,-9.04,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1412,Tokyo to WGS 84 (83),,,,Japan - 34deg to 34deg 40min N; 133deg to 134deg E.,9618,11.72,-9.48,35.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1413,Tokyo to WGS 84 (84),,,,Japan - 34deg to 34deg 40min N; 134deg to 135deg E.,9618,11.81,9.74,35.8,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1414,Tokyo to WGS 84 (85),,,,Japan - 34deg to 34deg 40min N; 135deg to 136deg E.,9618,11.88,-10.1,37.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1415,Tokyo to WGS 84 (86),,,,Japan - 34deg to 34deg 40min N; 136deg to 137deg E.,9618,11.91,-10.35,37.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1416,Tokyo to WGS 84 (87),,,,Japan - 34deg to 34deg 40min N; 137deg to 138deg E.,9618,11.9,-10.7,39.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1417,Tokyo to WGS 84 (88),,,,Japan - 34deg to 34deg 40min N; 138deg to 139deg E.,9618,12.02,-11.09,38.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1418,Tokyo to WGS 84 (89),,,,Japan - 33deg 20min to 34deg N; 129deg to 130deg E.,9618,11.87,-8.23,29.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1419,Tokyo to WGS 84 (90),,,,Japan - 33deg 20min to 34deg N; 130deg to 131deg E.,9618,11.84,-8.44,30.6,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1420,Tokyo to WGS 84 (91),,,,Japan - 33deg 20min to 34deg N; 131deg to 132deg E.,9618,11.94,-8.71,30.2,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1421,Tokyo to WGS 84 (92),,,,Japan - 33deg 20min to 34deg N; 132deg to 133deg E.,9618,11.99,-9.02,30.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1422,Tokyo to WGS 84 (93),,,,Japan - 33deg 20min to 34deg N; 133deg to 134deg E.,9618,12.05,-9.36,35.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1423,Tokyo to WGS 84 (94),,,,Japan - 33deg 20min to 34deg N; 134deg to 135deg E.,9618,12.1,-9.64,35.5,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1424,Tokyo to WGS 84 (95),,,,Japan - 33deg 20min to 34deg N; 135deg to 136deg E.,9618,12.1,-10.08,37.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1425,Tokyo to WGS 84 (96),,,,Japan - 33deg 20min to 34deg N; 136deg to 137deg E.,9618,12.07,-10.25,37.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1426,Tokyo to WGS 84 (97),,,,Japan - 32deg 40min to 33deg 20min N; 129deg to 130deg E.,9618,12.0,-8.15,32.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1427,Tokyo to WGS 84 (98),,,,Japan - 32deg 40min to 33deg 20min N; 130deg to 131deg E.,9618,12.06,-8.38,31.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1428,Tokyo to WGS 84 (99),,,,Japan - 32deg 40min to 33deg 20min N; 131deg to 132deg E.,9618,12.17,-8.69,30.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1429,Tokyo to WGS 84 (100),,,,Japan - 32deg 40min to 33deg 20min N; 132deg to 133deg E.,9618,12.23,-8.99,31.7,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1430,Tokyo to WGS 84 (101),,,,Japan - 32deg 40min to 33deg 20min N; 133deg to 134deg E.,9618,12.21,-9.21,34.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1431,Tokyo to WGS 84 (102),,,,Japan - 32deg 40min to 33deg 20min N; 134deg to 135deg E.,9618,12.28,-9.6,33.3,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1432,Tokyo to WGS 84 (103),,,,Japan - 32deg to 32deg 40min N; 130deg to 131deg E.,9618,12.28,-8.25,31.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1433,Tokyo to WGS 84 (104),,,,Japan - 32deg to 32deg 40min N; 131deg to 132deg E.,9618,12.37,-8.55,29.1,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1434,Tokyo to WGS 84 (105),,,,Japan - 31deg 20min to 32deg N; 130deg to 131deg E.,9618,12.53,-8.21,31.0,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1435,Tokyo to WGS 84 (106),,,,Japan - 31deg 20min to 32deg N; 131deg to 132deg E.,9618,12.57,-8.4,28.4,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1436,Tokyo to WGS 84 (107),,,,Japan - 30deg 40min to 31deg 20min N; 130deg to 131deg E.,9618,12.71,-8.17,29.9,,,,,9001,9104,,,,,,1998-12-12 00:00:00,http://vldb.gsi-mc.go.jp/sokuchi/coordinates/localtrans.html   (Geographical Survey Institute).,EPSG,,
+1437,RT90 to ETRF89 (1),,,,Sweden,9607,419.3836,99.3335,591.3451,-0.850389,-1.817277,7.862238,-0.99496,9001,9104,,9202,,,,1999-04-22 00:00:00,National Land Survey of Sweden.,EPSG,This transformation is actually between ETRF89 and RR92.  RR92 is a geographic 3D coordinate system where the horizontal component is RT90.,99.11
+1438,Fahud to WGS 84 (2),,,,Oman.,9606,-333.102,-11.02,230.69,0.0,0.0,0.554,0.219,9001,9104,,9202,,,,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,,
+1439,PSD93 to WGS 84 (1),,,,Oman.,9606,-180.624,-225.516,173.919,-0.81,-1.898,8.336,16.71006,9001,9104,,9202,,,,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,,
+1440,ED50 to WGS 84 (19),,,,Greece.,9603,-86.0,-92.2,-127.5,,,,,9001,,,,,,,1999-04-22 00:00:00,Geodesy Department; Hellenic Petroleum s.a.,EPSG,Used in oil industry.,
+1441,Antigua 1943 to WGS 84 (1),,,,Antigua.,9603,-255.0,-15.0,71.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1442,Dominica 1945 to WGS 84 (1),,,,Dominica.,9603,725.0,685.0,536.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1443,Grenada 1953 to WGS 84 (1),,,,Grenada.,9603,72.0,213.7,93.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1444,Montserrat 1958 to WGS 84 (1),,,,Montserrat.,9603,174.0,359.0,365.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1445,St. Kitts 1955 to WGS 84 (1),,,,Saint Kitts and Nevis.,9603,9.0,183.0,236.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1446,St. Lucia 1955 to WGS 84 (1),,,,Saint Lucia.,9603,-149.0,128.0,296.0,,,,,9001,,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1447,Anguilla 1957 to WGS 84 (1),,,,Anguilla.,9619,-18.0,4.4,,,,,,,9104,,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,,
+1450,ED50 to WGS 84 (20),,,,Norway - offshore between 62 and 65 deg North and west of 5 deg East.,9620,,,,,,8047.0,8046.0,,9102,,,ED50 to WGS 84 (15),ED50 to WGS 84 (14),,1999-04-22 00:00:00,"Norwegian Mapping Authority note of 13-Feb-1991 \"Om Transformasjon mellom Geodetiske Datum i Norge\"",EPSG,,
+1451,NAD27(CGQ77) to NAD83 (1),,,,Canada - Quebec,9614,,,,,,,,,9104,,,PQV4.DAC,,,1999-05-15 00:00:00,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,Uses NT method which expects longitudes positive west; EPSG GeogCSs CGQ77 (code 4609) and NAD83 (code 4269) have longitudes positive east.  Supersedes NAD27 to NAD83 (5) (code xxxx).,
+1454,Old Hawaiian to NAD83 (1),,,,United States (USA) - Hawaii including EEZ.,9613,,,,,,,,,9104,,,hawaii.las,hawaii.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Old Hawaiian (code 4135) and NAD83 (code 4269) have longitudes positive east.  NADCON data converts from Old Hawaiian Datum to but makes the transformation appear to be from NAD27.,
+1455,St. Lawrence Island to NAD83 (1),,,,United States (USA) - Alaska - St. Lawrence Island.,9613,,,,,,,,,9104,,,stlrnc.las,stlrnc.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Lawrence (code 4136) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Lawrence Datum to but makes the transformation appear to be from NAD27.,
+1456,St. Paul Island to NAD83 (1),,,,United States (USA) - Alaska - St. Paul Island.,9613,,,,,,,,,9104,,,stpaul.las,stpaul.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. Paul (code 4137) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. Paul Datum to but makes the transformation appear to be from NAD27.,
+1457,St. George Island to NAD83 (1),,,,United States (USA) - Alaska - St. George Island.,9613,,,,,,,,,9104,,,stgeorge.las,stgeorge.los,,1999-05-15 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs St. George (code 4138) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from St. George Datum to but makes the transformation appear to be from NAD27.,
+1458,AGD66 to GDA94 (2),,,,Australia - ACT.,9607,-129.193,-41.212,130.73,-0.246,-0.374,-0.329,-2.955,9001,9104,,9202,,,,1999-05-25 00:00:00,http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1m accuracy.  Recommended for mid-accuracy use in A.C.T.,
+1459,AGD66 to GDA94 (3),,,,Australia - Tasmania.,9607,-120.695,-62.73,165.46,-0.109,0.141,0.116,2.733,9001,9104,,9202,,,,1999-05-25 00:00:00,http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1m accuracy.  Recommended for mid-accuracy use in Tasmania.,
+1460,AGD66 to GDA94 (4),,,,Australia - New South Wales (NSW) and Victoria.,9607,-119.353,-48.301,139.484,-0.415,-0.26,-0.437,-0.613,9001,9104,,9202,,,,1999-05-25 00:00:00,http://www.anzlic.org.au/icsm/gdatm/regional.htm,EPSG,1m accuracy.  Recommended for mid-accuracy use in NSW and Victoria.,
+1461,Puerto Rico to NAD83 (1),,,,Puerto Rico; Virgin Islands (U.S.); Virgin Islands (British).,9613,,,,,,,,,9104,,,prvi.las,prvi.los,,1999-05-24 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs Puerto Rico (code 4139) and NAD83 (code 4269) have longitudes positive east. NADCON data converts from Puerto Rico Datum to but makes the transformation appear to be from NAD27.,
+1462,NAD27 to NAD83 (5),,,,Canada - Quebec,9614,,,,,,,,,9104,,,GS2783v1.QUE,,,1999-05-24 00:00:00,Geodetic Service of Quebec.  Contact alain.bernard at mrn.gouv.qc.ca,EPSG,Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27 (code 4267) and NAD83 (code 4269) have longitudes positive east.  Superseded by NAD27(CGQ77) to NAD83 (1) (code 1451).,
+1463,NAD27(76) to NAD83 (1),,,,Canada - Ontario,9615,,,,,,,,,9104,,,May76v20.gsb,,,1999-05-24 00:00:00,Geodetic Survey of Canada   http://www.geod.emr.ca/html-public/GSDapps/English/NTv2_Fact_Sheet.html,EPSG,Uses NT method which expects longitudes positive west; EPSG GeogCSs NAD27(76) (code 4608) and NAD83 (code 4269) have longitudes positive east.,
+1464,AGD66 to GDA94 (5),,,,Australia - Victoria.,9615,,,,,,,,,9104,,,vic_0799.gsb,,,1999-10-20 00:00:00,http://www.osg.vic.gov.au/tools.htm,EPSG,0.1m accuracy.  Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,99.67
+1466,NGO 1948 (Oslo) to NGO1948,,,,Norway - onshore.,9601,10.43225,,,,,,,,9110,,,,,,1999-11-12 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,Change of prime meridian.,99.79
+1467,NTF (Paris) to NTF (1),,,,France - onshore.,9601,2.5969213,,,,,,,,9105,,,,,,1999-11-12 00:00:00,IGN Paris.,EPSG,Change of prime meridian.,99.63  99.79
+1468,NTF (Paris) to NTF (2),,,,France - onshore.,9601,2.201395,,,,,,,,9110,,,,,,1999-11-12 00:00:00,Royal Geographic Society; London,EPSG,Change of prime meridian.  EPSG prefers value from IGN Paris (code 1467).,99.63  99.79
+1469,Locodjo 1965 to WGS 84 (1),,,,Cote D'Ivoire (Ivory Coast),9603,-125.0,53.0,467.0,,,,,9001,,,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,,
+1470,Abidjan 1987 to WGS 84 (1),,,,Cote D'Ivoire (Ivory Coast),9603,-124.76,53.0,466.79,,,,,9001,,,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,,
+1471,MGI to WGS 84 (2),,,,Austria,9606,-577.326,-90.129,-463.919,-15.8537,-4.55,-16.3489,-2.4232,9001,9113,,9202,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,,
+1472,ATS77 to NAD83(CSRS98) (1),,,,Canada - New Brunswick,9615,,,,,,,,,9104,,,NT7783v2.gsb,,,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,Introduced in 1999.,
+1473,NAD83(CSRS98) to WGS 84 (1),,,,Canada - New Brunswick,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1999-10-20 00:00:00,EPSG,EPSG,For many purposes NAD83 can be considered to be coincident with WGS 84.,
+1474,NAD83 to NAD83(HARN) (1),,,,United States (USA) - Alabama.,9613,,,,,,,,,9104,,,alhpgn.las,alhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1475,NAD83 to NAD83(HARN) (2),,,,United States (USA) - Arizona.,9613,,,,,,,,,9104,,,azhpgn.las,azhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1476,NAD83 to NAD83(HARN) (3),,,,United States (USA) - California north of 38 deg N.,9613,,,,,,,,,9104,,,cnhpgn.las,cnhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1477,NAD83 to NAD83(HARN) (4),,,,United States (USA) - California south of 38 deg N.,9613,,,,,,,,,9104,,,cshpgn.las,cshpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1478,NAD83 to NAD83(HARN) (5),,,,United States (USA) - Colorado.,9613,,,,,,,,,9104,,,cohpgn.las,cohpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1479,NAD83 to NAD83(HARN) (6),,,,United States (USA) - Georgia.,9613,,,,,,,,,9104,,,gahpgn.las,gahpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1480,NAD83 to NAD83(HARN) (7),,,,United States (USA) - Florida.,9613,,,,,,,,,9104,,,flhpgn.las,flhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1481,NAD83 to NAD83(HARN) (8),,,,United States (USA) - Idaho and Montana - east of 113 deg W.,9613,,,,,,,,,9104,,,emhpgn.las,emhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1482,NAD83 to NAD83(HARN) (9),,,,United States (USA) - Idaho and Montana - west of 113 deg W.,9613,,,,,,,,,9104,,,wmhpgn.las,wmhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1483,NAD83 to NAD83(HARN) (10),,,,United States (USA) - Kentucky.,9613,,,,,,,,,9104,,,kyhpgn.las,kyhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1484,NAD83 to NAD83(HARN) (11),,,,United States (USA) - Louisiana.,9613,,,,,,,,,9104,,,lahpgn.las,lahpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1485,NAD83 to NAD83(HARN) (12),,,,United States (USA) - Delaware and Maryland.,9613,,,,,,,,,9104,,,mdhpgn.las,mdhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1486,NAD83 to NAD83(HARN) (13),,,,United States (USA) - Maine.,9613,,,,,,,,,9104,,,mehpgn.las,mehpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1487,NAD83 to NAD83(HARN) (14),,,,United States (USA) - Michigan.,9613,,,,,,,,,9104,,,mihpgn.las,mihpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1488,NAD83 to NAD83(HARN) (15),,,,United States (USA) - Mississippi.,9613,,,,,,,,,9104,,,mshpgn.las,mshpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1489,NAD83 to NAD83(HARN) (16),,,,United States (USA) - Nebraska.,9613,,,,,,,,,9104,,,nbhpgn.las,nbhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1490,NAD83 to NAD83(HARN) (17),,,,United States (USA) - Connecticut; Massachusetts; New Hampshire; Rhode Island; Vermont.,9613,,,,,,,,,9104,,,nehpgn.las,nehpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1491,NAD83 to NAD83(HARN) (18),,,,United States (USA) - New Mexico.,9613,,,,,,,,,9104,,,nmhpgn.las,nmhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1492,NAD83 to NAD83(HARN) (19),,,,United States (USA) - New York.,9613,,,,,,,,,9104,,,nyhpgn.las,nyhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1493,NAD83 to NAD83(HARN) (20),,,,United States (USA) - North Dakota.,9613,,,,,,,,,9104,,,ndhpgn.las,ndhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1494,NAD83 to NAD83(HARN) (21),,,,United States (USA) - Oklahoma.,9613,,,,,,,,,9104,,,okhpgn.las,okhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1495,NAD83 to NAD83(HARN) (22),,,,United States (USA) - Puerto Rico and the Virgin Islands.,9613,,,,,,,,,9104,,,pvhpgn.las,pvhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1496,NAD83 to NAD83(HARN) (23),,,,United States (USA) - South Dakota.,9613,,,,,,,,,9104,,,sdhpgn.las,sdhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1497,NAD83 to NAD83(HARN) (24),,,,United States (USA) - Tennessee,9613,,,,,,,,,9104,,,tnhpgn.las,tnhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1498,NAD83 to NAD83(HARN) (25),,,,United States (USA) - Texas east of 100deg West.,9613,,,,,,,,,9104,,,ethpgn.las,ethpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1499,NAD83 to NAD83(HARN) (26),,,,United States (USA) - Texas west of 100deg West.,9613,,,,,,,,,9104,,,wthpgn.las,wthpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1500,NAD83 to NAD83(HARN) (27),,,,United States (USA) - Virginia.,9613,,,,,,,,,9104,,,vahpgn.las,vahpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1501,NAD83 to NAD83(HARN) (28),,,,United States (USA) - Oregan; Washington.,9613,,,,,,,,,9104,,,wohpgn.las,wohpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1502,NAD83 to NAD83(HARN) (29),,,,United States (USA) - Wisconsin.,9613,,,,,,,,,9104,,,wihpgn.las,wihpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1503,NAD83 to NAD83(HARN) (30),,,,United States (USA) - Wyoming.,9613,,,,,,,,,9104,,,wyhpgn.las,wyhpgn.los,,1999-10-20 00:00:00,US Coast & Geodetic Survey  www.ngs.noaa.gov  NADCON readme file,EPSG,Uses NADCON method which expects longitudes positive west; EPSG GeogCSs NAD83 (code 4269) and NAD83(HARN) (code 4140) have longitudes positive east.,
+1504,Cape to Hartbeesthoek94 (1),,,,South Africa.,9603,-134.73,-110.92,-292.66,,,,,9001,,,,,,,1999-10-20 00:00:00,Directorate of Surveys and Mapping; http://w3sli.wcape.gov.za/surveys/mapping/wgs84.htm,EPSG,,
+1505,Hartbeesthoek94 to WGS 84 (1),,,,South Africa.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1999-10-20 00:00:00,EPSG,EPSG,For many purposes Hartbeesthoek94 datum can be considered to be coincident with WGS 84.,
+1506,AGD66 to GDA94 (6),,,,Australia - Tasmania.,9615,,,,,,,,,9104,,,tas_1098.gsb,,,1999-10-20 00:00:00,http://www.delm.tas.gov.au/osg/Geodetic_transform.htm,EPSG,0.1m accuracy.  Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,
+1507,AGD66 to GDA94 (7),,,,Australia - Northern Territory.,9615,,,,,,,,,9104,,,nt_0599.gsb,,,1999-10-20 00:00:00,http://www.anzlic.org.au/icsm/gdatm/chapter7.htm#high,EPSG,0.1m accuracy.  Input expects longitudes to be positive west; EPSG GeogCS AGD66 (code 4202) and GDA94 (code 4283) both have longitudes positive east.,
+1508,CH1903 to WGS 84 (1),,,,Liechtenstein;  Switzerland.,9607,660.077,13.551,369.344,2.484,1.783,2.939,5.66,9001,9113,,9202,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,Implemented in Bundesamt f�r Landestopographie programme GRANIT.,
+1509,CH1903+ to CHTRF95 (1),,,,Liechtenstein;  Switzerland.,9603,674.374,15.056,405.346,,,,,9001,,,,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+1510,CH1903 to WGS 84 (2),,,,Liechtenstein;  Switzerland.,9603,674.374,15.056,405.346,,,,,9001,,,,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,These parameters are strictly between CH1903+ and CHTRF95 but are used from CH1903 as an approximation which is within the accuracy of the distortions within the CH1903 network.,
+1511,CHTRF95 to WGS 84 (1),,,,Liechtenstein;  Switzerland.,9603,0.0,0.0,0.0,,,,,9001,,,,,,,1999-10-20 00:00:00,EPSG,EPSG,For many purposes CHTRF95 can be considered to be coincident with WGS 84.,
+1512,Rassadiran to WGS 84 (1),,,,Iran - Taheri refinery site only.,9603,-133.63,-157.5,-158.62,,,,,9001,,,,,,,1999-10-20 00:00:00,Total-Fina,EPSG,Used only for terminal site.,
+1513,FD58 to WGS 84 (1),,,,Iran - Kangan district.,9603,-241.54,-163.64,396.06,,,,,9001,,,,,,,1999-10-20 00:00:00,Total-Fina,EPSG,,
+1514,ED50(ED77) to WGS 84 (1),,,,Iran,9606,-110.33,-97.73,-119.85,0.3423,1.1634,0.2715,0.063,9001,9104,,9202,,,,1999-10-20 00:00:00,National Cartographic Centre of Iran,EPSG,,
+1515,NAD83 to WGS 84 (5),,,,United States (USA),9607,-0.991,1.9072,0.5129,-0.000000125033,-0.000000046785,-0.000000056529,0.0,9001,9101,,9202,,,,1999-11-05 00:00:00, http://www.ngs.noaa.gov/CORS/Derivation.html,EPSG,Strictly between NAD83 and ITRF96(1997.0).  Supersedes NAD83 to WGS 84 (4) (code 1308).,
+1516,La Canoa to WGS 84 (1),,,,Venezuela east - Delta Amacuro; Anzoategui; Bolivar; Monagas; Sucre states.,9603,-273.5,110.6,-357.9,,,,,9001,,,,,,,1999-11-05 00:00:00,"Lagoven; Gonzalez Losano y Rodriguez; \"Determination de los Parametros de Transformacion para el Oriente del Pais\"; VII Venezuelan Geophysical Congress; September 1994.",EPSG,Also used for PSAD56 to WGS 84 transformations.  Parameter values estimated accuracy: � 2.0m;  � 2.7m;  � 1.3m respectively.,
+10101,Alabama CS27 East zone,Alabama East,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.3,-85.5,,,0.99996,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10102,Alabama CS27 West zone,Alabama West,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.0,-87.3,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10131,Alabama CS83 East zone,Alabama East,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.3,-85.5,,,0.99996,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+10132,Alabama CS83 West zone,Alabama West,,,United States (USA) - Alabama - Counties east of 86d 37m West.,9807,30.0,-87.3,,,0.999933333,600000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+10201,Arizona Coordinate System  east zone,Arizona East,,,United States (USA) - Arizona - Apache; Cochise; Gila; Graham; Greenlee and Navajo counties; i.e. east of about 110d 45m West.,9807,31.0,-110.1,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10202,Arizona Coordinate System Central zone,Arizona Central,,,United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west,9807,31.0,-111.55,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10203,Arizona Coordinate System  west zone,Arizona West,,,United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m,9807,31.0,-113.45,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10231,Arizona CS83  east zone,Arizona  East,,,United States (USA) - Arizona - counties east of 110d 45m West,9807,31.0,-110.1,,,0.9999,213360.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,State law defines origin in International feet. FE = 700000ft.,95.30  96.29
+10232,Arizona CS83 Central zone,Arizona Central,,,United States (USA) - Arizona - Coconino; Maricopa; Pima; Pinal; Santa Cruz and Yavapai counties; i.e between about 110d 45m & 113d 20m west,9807,31.0,-111.55,,,0.9999,213360.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,State law defines origin in International feet. FE = 700000ft.,95.30  96.29
+10233,Arizona CS83  west zone,Arizona West,,,United States (USA) - Arizona - La Paz; Mohave and Yuma counties; i.e west of about 113d 20m,9807,31.0,-113.45,,,0.999933333,213360.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,State law defines origin in International feet. FE = 700000ft.,95.30  96.29
+10301,Arkansas CS27 North,Arkansas North,,,United States (USA) - Arkansas - counties north of 34d 50m North.,9802,34.2,-92.0,36.14,34.56,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10302,Arkansas CS27 South,Arkansas South,,,United States (USA) - Arkansas - counties south of 34d 50m North.,9802,32.4,-92.0,34.46,33.18,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10331,Arkansas CS83 North zone,Arkansas North,,,United States (USA) - Arkansas - counties north of 34d 50m North.,9802,34.2,-92.0,36.14,34.56,,400000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10332,Arkansas CS83 South zone,Arkansas South,,,United States (USA) - Arkansas - counties south of 34d 50m North.,9802,32.4,-92.0,34.46,33.18,,400000.0,400000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10401,California CS27 zone I,California zone I,,,United States (USA) - California - counties north of 40deg North.,9802,39.2,-122.0,41.4,40.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10402,California CS27 zone II,California zone II,,,United States (USA) - California - counties between 40d & 38d 15m North.,9802,37.4,-122.0,39.5,38.2,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10403,California CS27 zone III,California zone III,,,United States (USA) - California - counties between 38d 15m & 37d North.,9802,36.3,-120.3,38.26,37.04,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10404,California CS27 zone IV,California zone IV,,,United States (USA) - California - counties between 37d & 35d 30m North.,9802,35.2,-119.0,37.15,36.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10405,California CS27 zone V,California zone V,,,United States (USA) - California - counties between 35d 50m & 34d North.,9802,33.3,-118.0,35.28,34.02,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10406,California CS27 zone VI,California zone VI,,,United States (USA) - California - counties south of 34deg North.,9802,32.1,-116.15,33.53,32.47,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10407,California CS27 zone VII,California zone VII,,,United States (USA) - California - Los Angeles.,9802,34.08,-118.2,34.25,33.52,,4186692.58,416926.74,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10431,California CS83 zone 1,California zone 1,,,United States (USA) - California - counties north of 40deg North.,9802,39.2,-122.0,41.4,40.0,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10432,California CS83 zone 2,California zone 2,,,United States (USA) - California - counties between 40d & 38d 15m North.,9802,37.4,-122.0,39.5,38.2,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10433,California CS83 zone 3,California zone 3,,,United States (USA) - California - counties between 38d 15m & 37d North.,9802,36.3,-120.3,38.26,37.04,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10434,California CS83 zone 4,California zone 4,,,United States (USA) - California - counties between 37d & 35d 30m North.,9802,35.2,-119.0,37.15,36.0,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10435,California CS83 zone 5,California zone 5,,,United States (USA) - California - counties between 35d 50m & 34d North.,9802,33.3,-118.0,35.28,34.02,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10436,California CS83 zone 6,California zone 6,,,United States (USA) - California - counties south of 34deg North.,9802,32.1,-116.15,33.53,32.47,,2000000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10501,Colorado CS27 North zone,Colorado North,,,United States (USA) - Colorado - counties north of 39d 50m North.,9802,39.2,-105.3,39.43,40.47,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10502,Colorado CS27 Central zone,Colorado Central,,,United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.,9802,37.5,-105.3,39.45,38.27,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10503,Colorado CS27 South zone,Colorado South,,,United States (USA) - Colorado - counties south of 38d 30m North.,9802,36.4,-105.3,38.26,37.14,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10531,Colorado CS83 North zone,Colorado North,,,United States (USA) - Colorado - counties north of 39d 50m North.,9802,39.2,-105.3,40.47,39.43,,914401.8289,304800.6096,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10532,Colorado CS83 Central zone,Colorado Central,,,United States (USA) - Colorado - counties between 39d 50m & 38d 30m North.,9802,37.5,-105.3,39.45,38.27,,914401.8289,304800.6096,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10533,Colorado CS83 South zone,Colorado South,,,United States (USA) - Colorado - counties south of 38d 30m North.,9802,36.4,-105.3,38.26,37.14,,914401.8289,304800.6096,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10600,Connecticut CS27,Connecticut,,,United States (USA) - Connecticut.,9802,40.5,-72.45,41.52,41.12,,600000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10630,Connecticut CS83,Connecticut,,,United States (USA) - Connecticut.,9802,40.5,-72.45,41.52,41.12,,304800.6096,152400.3048,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+10700,Delaware CS27,Delaware,,,United States (USA) - Delaware.,9807,38.0,-75.25,,,0.999995,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10730,Delaware CS83,Delaware,,,United States (USA) - Delaware.,9807,38.0,-75.25,,,0.999995,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+10901,Florida CS27 East zone,Florida East,,,United States (USA) - Florida - counties east of 81d 45m West.,9807,24.2,-81.0,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10902,Florida CS27 West zone,Florida West,,,United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.,9807,24.2,-82.0,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+10903,Florida CS27 North zone,Florida North,,,United States (USA) - Florida - north of 29d 30m North & west of 82d West.,9802,29.0,-84.3,30.45,29.35,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+10931,Florida CS83 East zone,Florida  East,,,United States (USA) - Florida - counties east of 81d 45m West.,9807,24.2,-81.0,,,0.999941177,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+10932,Florida CS83 West zone,Florida  West,,,United States (USA) - Florida - counties west of 81d 45m West & south of 29d 30m North.,9807,24.2,-82.0,,,0.999941177,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+10933,Florida CS83 North zone,Florida North,,,United States (USA) - Florida - north of 29d 30m North & west of 82d West.,9802,29.0,-84.3,30.45,29.35,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11001,Georgia CS27 East zone,Georgia East,,,United States (USA) - Georgia - counties east of 83d 15m West.,9807,30.0,-82.1,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11002,Georgia CS27 West zone,Georgia West,,,United States (USA) - Georgia - counties west of 83d 15m West.,9807,30.0,-84.1,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11031,Georgia CS83 East zone,Georgia  East,,,United States (USA) - Georgia - counties east of 83d 15m West.,9807,30.0,-82.1,,,0.9999,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11032,Georgia CS83 West zone,Georgia West,,,United States (USA) - Georgia - counties west of 83d 15m West.,9807,30.0,-84.1,,,0.9999,700000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11101,Idaho CS27 East zone,Idaho East,,,United States (USA) - Idaho - counties east of 113d West.,9807,41.4,-112.1,,,0.999947368,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11102,Idaho CS27 Central zone,Idaho Central,,,United States (USA) - Idaho - counties between 113d & 115d West.,9807,41.4,-114.0,,,0.999947368,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11103,Idaho CS27 West zone,Idaho West,,,United States (USA) - Idaho - counties west of 115d West.,9807,41.4,-115.45,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11131,Idaho CS83 East zone,Idaho  East,,,United States (USA) - Idaho - counties east of 113d West.,9807,41.4,-112.1,,,0.999947368,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11132,Idaho CS83 Central zone,Idaho  Central,,,United States (USA) - Idaho - counties between 113d & 115d West.,9807,41.4,-114.0,,,0.999947368,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11133,Idaho CS83 West zone,Idaho  West,,,United States (USA) - Idaho - counties west of 115d West.,9807,41.4,-115.45,,,0.999933333,800000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11201,Illinois CS27 East zone,Illinois East,,,United States (USA) - Illinois - counties east of 89d 05m West.,9807,36.4,-88.2,,,0.999975,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11202,Illinois CS27 West zone,Illinois West,,,United States (USA) - Illinois - counties west of 89d 05m West.,9807,36.4,-90.1,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11231,Illinois CS83 East zone,Illinois  East,,,United States (USA) - Illinois - counties east of 89d 05m West.,9807,36.4,-88.2,,,0.999975,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11232,Illinois CS83 West zone,Illinois  West,,,United States (USA) - Illinois - counties west of 89d 05m West.,9807,36.4,-90.1,,,0.999941177,700000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11301,Indiana CS27 East zone,Indiana East,,,United States (USA) - Indiana - counties east of 86d 25m West.,9807,37.3,-85.4,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11302,Indiana CS27 West zone,Indiana West,,,United States (USA) - Indiana - counties west of 86d 25m West.,9807,37.3,-87.05,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11331,Indiana CS83 East zone,Indiana  East,,,United States (USA) - Indiana - counties east of 86d 25m West.,9807,37.3,-85.4,,,0.999966667,100000.0,250000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11332,Indiana CS83 West zone,Indiana  West,,,United States (USA) - Indiana - counties west of 86d 25m West.,9807,37.3,-87.05,,,0.999966667,900000.0,250000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11401,Iowa CS27 North zone,Iowa North,,,United States (USA) - Iowa - counties north of 42deg North.,9802,41.3,-93.3,43.16,42.04,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11402,Iowa CS27 South zone,Iowa South,,,United States (USA) - Iowa - counties south of 42deg North.,9802,40.0,-93.3,41.47,40.37,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11431,Iowa CS83 North zone,Iowa North,,,United States (USA) - Iowa - counties north of 42deg North.,9802,41.3,-93.3,43.16,42.04,,1500000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11432,Iowa CS83 South zone,Iowa South,,,United States (USA) - Iowa - counties south of 42deg North.,9802,40.0,-93.3,41.47,40.37,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11501,Kansas CS27 North zone,Kansas North,,,United States (USA) - Kansas - counties north of 38d 45m North.,9802,38.2,-98.0,39.47,38.43,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11502,Kansas CS27 South zone,Kansas South,,,United States (USA) - Kansas - counties south of 38d 45m North.,9802,36.4,-98.3,38.34,37.16,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11531,Kansas CS83 North zone,Kansas North,,,United States (USA) - Kansas - counties north of 38d 45m North.,9802,38.2,-98.0,39.47,38.43,,400000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11532,Kansas CS83 South zone,Kansas South,,,United States (USA) - Kansas - counties south of 38d 45m North.,9802,36.4,-98.3,38.34,37.16,,400000.0,400000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11601,Kentucky CS27 North zone,Kentucky North,,,United States (USA) - Kentucky - counties north of 37d 55m North.,9802,37.3,-84.15,37.58,38.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11602,Kentucky CS27 South zone,Kentucky South,,,United States (USA) - Kentucky - counties south of 37d 55m North.,9802,36.2,-85.45,36.44,37.56,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11631,Kentucky CS83 North zone,Kentucky North,,,United States (USA) - Kentucky - counties north of 37d 55m North.,9802,37.3,-84.15,37.58,37.58,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11632,Kentucky CS83 South zone,Kentucky South,,,United States (USA) - Kentucky - counties south of 37d 55m North.,9802,36.2,-85.45,37.56,36.44,,500000.0,500000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11701,Louisiana CS27 North zone,Louisiana North,,,United States (USA) - Louisiana - counties north of 30d 55m North.,9802,30.4,-92.3,31.1,32.4,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11702,Louisiana CS27 South zone,Louisiana South,,,United States (USA) - Louisiana - counties south of 30d 55m North. Also Gulf of Mexico LA shelf.,9802,28.4,-91.2,29.18,30.42,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11731,Louisiana CS83 North zone,Louisiana North,,,United States (USA) - Louisiana - counties north of 30d 55m North.,9802,30.3,-92.3,32.4,31.1,,1000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11732,Louisiana CS83 South zone,Louisiana South,,,United States (USA) - Louisiana - counties south of 30d 55m North.,9802,28.3,-91.2,30.42,29.18,,1000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+11801,Maine CS27 East zone,Maine East,,,United States (USA) - Maine - counties east of 69d 30m West.,9807,43.5,-68.3,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11802,Maine CS27 West zone,Maine West,,,United States (USA) - Maine - counties west of 69d 30m West.,9807,42.5,-70.1,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+11831,Maine CS83 East zone,Maine  East,,,United States (USA) - Maine - counties east of 69d 30m West.,9807,43.4,-68.3,,,0.9999,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11832,Maine CS83 West zone,Maine  West,,,United States (USA) - Maine - counties west of 69d 30m West.,9807,42.5,-70.1,,,0.999966667,900000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+11900,Maryland CS27,Maryland,,,United States (USA) - Maryland.,9802,37.5,-77.0,38.18,39.27,,800000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+11930,Maryland CS83,Maryland,,,United States (USA) - Maryland.,9802,37.4,-77.0,39.27,38.18,,400000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12001,Massachusetts CS27 Mainland zone,Massachusetts Mainland,,,United States (USA) - Massachusetts onshore.,9802,41.0,-71.3,41.43,42.41,,600000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12002,Massachusetts CS27 Island zone,Massachusetts Island,,,United States (USA) - Massachusetts islands.,9802,41.0,-70.3,41.17,41.29,,200000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12031,Massachusetts CS83 Mainland zone,Massachusetts Mainland,,,United States (USA) - Massachusetts onshore.,9802,41.0,-71.3,42.41,41.43,,200000.0,750000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12032,Massachusetts CS83 Island zone,Massachusetts Island,,,United States (USA) - Massachusetts islands.,9802,41.0,-70.3,41.29,41.17,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12101,Michigan State Plane East zone,Michigan East,,,United States (USA) - Michigan.,9807,41.3,-83.4,,,0.999942857,500000.0,0.0,9003,9110,8901,,,,,1998-11-11 00:00:00,USGS Professional Paper #1395,EPSG,Obsolete. Superseded by north central and south zones.,95.30  96.29  98.22
+12102,Michigan State Plane Old Central zone,Michigan Old Central,,,United States (USA) - Michigan.,9807,41.3,-85.45,,,0.999909091,500000.0,0.0,9003,9110,8901,,,,,1998-11-11 00:00:00,USGS Professional Paper #1395,EPSG,Obsolete. Superseded by north central and south zones.,95.30  96.29  98.22
+12103,Michigan State Plane West zone,Michigan West,,,United States (USA) - Michigan.,9807,41.3,-88.45,,,0.999909091,500000.0,0.0,9003,9110,8901,,,,,1998-11-11 00:00:00,USGS Professional Paper #1395,EPSG,Obsolete. Superseded by north central and south zones.,95.30  96.29  98.22
+12111,Michigan CS27 North zone,Michigan North,,,United States (USA) - Michigan - counties north of 45d 45m North.,9802,44.47,-87.0,45.29,47.05,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.28  96.29  98.22  99.28
+12112,Michigan CS27 Central zone,Michigan Central,,,United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.,9802,43.19,-84.2,44.11,45.42,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.28  96.29  98.22  99.28
+12113,Michigan CS27 South zone,Michigan South,,,United States (USA) - Michigan - counties south of 43d 55m North.,9802,41.3,-84.2,42.06,43.4,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.28  96.29  98.22  99.28
+12141,Michigan CS83 North zone,Michigan North,,,United States (USA) - Michigan - counties north of 45d 45m North.,9802,44.47,-87.0,47.05,45.29,,8000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12142,Michigan CS83 Central zone,Michigan Central,,,United States (USA) - Michigan - counties between 45d 45m & 43d 55m North.,9802,43.19,-84.22,45.42,44.11,,6000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12143,Michigan CS83 South zone,Michigan South,,,United States (USA) - Michigan - counties south of 43d 55m North.,9802,41.3,-84.22,43.4,42.06,,4000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12201,Minnesota CS27 North zone,Minnesota North,,,United States (USA) - Minnesota - counties north of 47d 10m North.,9802,46.3,-93.06,47.02,48.38,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12202,Minnesota CS27 Central zone,Minnesota Central,,,United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.,9802,45.0,-94.15,45.37,47.03,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12203,Minnesota CS27 South zone,Minnesota South,,,United States (USA) - Minnesota - counties south of 45d 30m North.,9802,43.0,-94.0,43.47,45.13,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12231,Minnesota CS83 North zone,Minnesota North,,,United States (USA) - Minnesota - counties north of 47d 10m North.,9802,46.3,-93.06,48.38,47.02,,800000.0,100000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12232,Minnesota CS83 Central zone,Minnesota Central,,,United States (USA) - Minnesota - counties between 47d 10m & 45d 30m North.,9802,45.0,-94.15,47.03,45.37,,800000.0,100000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12233,Minnesota CS83 South zone,Minnesota South,,,United States (USA) - Minnesota - counties south of 45d 30m North.,9802,43.0,-94.0,45.13,43.47,,800000.0,100000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12301,Mississippi CS27 East zone,Mississippi East,,,United States (USA) - Mississippi - counties east of 89d 40m West.,9807,29.4,-88.5,,,0.99996,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12302,Mississippi CS27 West zone,Mississippi West,,,United States (USA) - Mississippi - counties west of 89d 40m West.,9807,30.3,-90.2,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12331,Mississippi CS83 East zone,Mississippi East,,,United States (USA) - Mississippi - counties east of 89d 40m West.,9807,29.3,-88.5,,,0.99995,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12332,Mississippi CS83 West zone,Mississippi West,,,United States (USA) - Mississippi - counties west of 89d 40m West.,9807,29.3,-90.2,,,0.99995,700000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12401,Missouri CS27 East zone,Missouri East,,,United States (USA) - Missouri - counties east of 91d 45m West.,9807,35.5,-90.3,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.18  95.30  96.29
+12402,Missouri CS27 Central zone,Missouri Central,,,United States (USA) - Missouri - counties between 91d 45m & 93d 35m West.,9807,35.5,-92.3,,,0.999933333,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12403,Missouri CS27 West zone,Missouri West,,,United States (USA) - Missouri - counties west of 93d 35m West.,9807,36.1,-94.3,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12431,Missouri CS83 East zone,Missouri  East,,,United States (USA) - Missouri - counties east of 91d 45m West..,9807,35.5,-90.3,,,0.999933333,250000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12432,Missouri CS83 Central zone,Missouri Central,,,United States (USA) - Missouri - counties between 91d 45m & 93d 35m West,9807,35.5,-92.3,,,0.999933333,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12433,Missouri CS83 West zone,Missouri  West,,,United States (USA) - Missouri - counties west of 93d 35m West.,9807,36.1,-94.3,,,0.999941177,850000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12501,Montana CS27 North zone,Montana North,,,United States (USA) - Montana - counties north of 47d 50m North.,9802,47.0,-109.3,48.43,47.51,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12502,Montana CS27 Central zone,Montana Central,,,United States (USA) - Montana - counties between 47d 50m & 46d 40m North.,9802,45.5,-109.3,47.53,46.27,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12503,Montana CS27 South zone,Montana South,,,United States (USA) - Montana - counties south of 46d 40m North.,9802,44.0,-109.3,46.24,44.52,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12530,Montana CS83,Montana,,,United States (USA) - Montana.,9802,44.15,-109.3,49.0,45.0,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12601,Nebraska CS27 North zone,Nebraska North,,,United States - Nebraska -Antelope; Blaine; Box Butte; Boyd; Brown; Burt; Cedar; Cherry; Cuming; Dakota; Dawes; Dixon; Garfield; Grant; Holt; Hooker; Keya Paha; Knox; Loup; Madison; Pierce; Rock; Sheridan; Sioux; Stanton; Thomas; Thurston; Wayne; Wheeler,9802,41.2,-100.0,41.51,42.49,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12602,Nebraska CS27 South zone,Nebraska South,,,"United States (USA) - Nebraska - counties south of and including Scotts Bluff; Morrill; Garden; Arthur; McPherson; Logan; Custer; Valley; Greeley; Boome, Platte; Colfax; Dodge; Washington.",9802,39.4,-99.3,40.17,41.43,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+12630,Nebraska CS83,Nebraska,,,United States (USA) - Nebraska.,9802,39.5,-100.0,43.0,40.0,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+12701,Nevada CS27 East zone,Nevada East,,,United States (USA) - Nevada - counties east of 116d  West & Eureka county.,9807,34.45,-115.35,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12702,Nevada CS27 Central zone,Nevada Central,,,United States (USA) - Nevada - Lander & Nye counties.,9807,34.45,-116.4,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12703,Nevada CS27 West zone,Nevada West,,,United States (USA) - Nevada - counties west of 117d 15m West.,9807,34.45,-118.35,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12731,Nevada CS83 East zone,Nevada  East,,,United States (USA) - Nevada - counties east of 116d  West & Eureka county.,9807,34.45,-115.35,,,0.9999,200000.0,8000000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12732,Nevada CS83 Central zone,Nevada Central,,,United States (USA) - Nevada - Lander & Nye counties.,9807,34.45,-116.4,,,0.9999,500000.0,6000000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12733,Nevada CS83 West zone,Nevada West,,,United States (USA) - Nevada - counties west of 117d 15m West.,9807,34.45,-118.35,,,0.9999,800000.0,4000000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12800,New Hampshire CS27,New Hampshire,,,United States (USA) - New Hampshire.,9807,42.3,-71.4,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12830,New Hampshire CS83,New Hampshire,,,United States (USA) - New Hampshire.,9807,42.3,-71.4,,,0.999966667,300000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+12900,New Jersey CS27,New Jersey,,,United States (USA) - New Jersey.,9807,38.5,-74.4,,,0.999975,2000000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+12930,New Jersey CS83,New Jersey,,,United States (USA) - New Jersey.,9807,38.5,-74.3,,,0.9999,150000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13001,New Mexico CS27 East zone,New Mexico East,,,United States (USA) - New Mexico - counties east of 105d West.,9807,31.0,-104.2,,,0.999909091,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+13002,New Mexico CS27 Central zone,New Mexico Central,,,United States (USA) - New Mexico - counties between 105d & 107d 15m West.,9807,31.0,-106.15,,,0.9999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+13003,New Mexico CS27 West zone,New Mexico West,,,United States (USA) - New Mexico - counties west of 107d 15m West.,9807,31.0,-107.5,,,0.999916667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+13031,New Mexico CS83 East zone,New Mexico East,,,United States (USA) - New Mexico - counties east of 105d West.,9807,31.0,-104.2,,,0.999909091,165000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13032,New Mexico CS83 Central zone,New Mexico Central,,,United States (USA) - New Mexico - counties between 105d & 107d 15m West.,9807,31.0,-106.15,,,0.9999,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13033,New Mexico CS83 West zone,New Mexico West,,,United States (USA) - New Mexico - counties west of 107d 15m West.,9807,31.0,-107.5,,,0.999916667,830000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13101,New York CS27 East zone,New York East,,,United States (USA) - New York - counties east of 75d 15m West excluding Long Island.,9807,40.0,-74.2,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.18  95.30  96.29
+13102,New York CS27 Central zone,New York Central,,,United States (USA) - New York - counties between 75d 15m & 77d 30m West.,9807,40.0,-76.35,,,0.9999375,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+13103,New York CS27 West zone,New York West,,,United States (USA) - New York - counties west of 77d 30m West.,9807,40.0,-78.35,,,0.9999375,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+13104,New York CS27 Long Island zone,New York Long Island,,,United States (USA) - New York - Long Island.,9802,40.3,-74.0,41.02,40.4,,1000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13131,New York CS83 East zone,New York  East,,,United States (USA) - New York - counties east of 75d 15m West excluding Long Island.,9807,38.5,-74.3,,,0.9999,150000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13132,New York CS83 Central zone,New York Central,,,United States (USA) - New York - counties between 75d 15m & 77d 30m West.,9807,40.0,-76.35,,,0.9999375,250000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13133,New York CS83 West zone,New York  West,,,United States (USA) - New York - counties west of 77d 30m West.,9807,40.0,-78.35,,,0.9999375,350000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13134,New York CS83 Long Island zone,New York Long Island,,,United States (USA) - New York - Long Island.,9802,40.1,-74.0,41.02,40.4,,300000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13200,North Carolina CS27,North Carolina,,,United States (USA) - North Carolina.,9802,33.45,-79.0,34.2,36.1,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13230,North Carolina CS83,North Carolina,,,United States (USA) - North Carolina.,9802,33.45,-79.0,36.1,34.2,,609601.22,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13301,North Dakota CS27 North zone,North Dakota North,,,United States (USA) - North Dakota - counties north of 47d 25m North.,9802,47.0,-100.3,47.26,48.44,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13302,North Dakota CS27 South zone,North Dakota South,,,United States (USA) - North Dakota - counties south of 47d 25m North.,9802,45.4,-100.3,46.11,47.29,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13331,North Dakota CS83 North zone,North Dakota North,,,United States (USA) - North Dakota - counties north of 47d 25m North.,9802,47.0,-100.3,48.44,47.26,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13332,North Dakota CS83 South zone,North Dakota South,,,United States (USA) - North Dakota - counties south of 47d 25m North.,9802,45.4,-100.3,47.29,46.11,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13401,Ohio CS27 North zone,Ohio North,,,United States (USA) - Ohio - counties north of 40d 15m North.,9802,39.4,-82.3,40.26,41.42,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13402,Ohio CS27 South zone,Ohio South,,,United States (USA) - Ohio - counties south of 40d 15m North.,9802,38.0,-82.3,38.44,40.02,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13431,Ohio CS83 North zone,Ohio North,,,United States (USA) - Ohio - counties north of 40d 15m North.,9802,39.4,-82.3,41.42,40.26,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13432,Ohio CS83 South zone,Ohio South,,,United States (USA) - Ohio - counties south of 40d 15m North.,9802,38.0,-82.3,40.02,38.44,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13501,Oklahoma CS27 North zone,Oklahoma North,,,United States (USA) - Oklahoma - counties north of 35d 20m North.,9802,35.0,-98.0,35.34,36.46,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13502,Oklahoma CS27 South zone,Oklahoma South,,,United States (USA) - Oklahoma - counties south of 35d 20m North.,9802,33.2,-98.0,33.56,35.14,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13531,Oklahoma CS83 North zone,Oklahoma North,,,United States (USA) - Oklahoma - counties north of 35d 20m North.,9802,35.0,-98.0,36.46,35.34,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13532,Oklahoma CS83 South zone,Oklahoma South,,,United States (USA) - Oklahoma - counties south of 35d 20m North.,9802,33.2,-98.0,35.14,33.56,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13601,Oregon CS27 North zone,Oregon North,,,United States (USA) - Oregon - counties north of 44d 15m North.,9802,43.4,-120.3,44.2,46.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13602,Oregon CS27 South zone,Oregon South,,,United States (USA) - Oregon - counties south of 44d 15m North.,9802,41.4,-120.3,42.2,44.0,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13631,Oregon CS83 North zone,Oregon North,,,United States (USA) - Oregon - counties north of 44d 15m North.,9802,43.4,-120.3,46.0,44.2,,2500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13632,Oregon CS83 South zone,Oregon South,,,United States (USA) - Oregon - counties south of 44d 15m North.,9802,41.4,-120.3,44.0,42.2,,1500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13701,Pennsylvania CS27 North zone,Pennsylvania North,,,United States (USA) - Pennsylvania - counties north of 40d 50m North.,9802,40.1,-77.45,40.53,41.57,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13702,Pennsylvania CS27 South zone,Pennsylvania South,,,United States (USA) - Pennsylvania - counties south of 40d 50m North.,9802,39.2,-77.45,39.56,40.48,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13731,Pennsylvania CS83 North zone,Pennsylvania North,,,United States (USA) - Pennsylvania - counties north of 40d 50m North.,9802,40.1,-77.45,41.57,40.53,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13732,Pennsylvania CS83 South zone,Pennsylvania South,,,United States (USA) - Pennsylvania - counties south of 40d 50m North.,9802,39.2,-77.45,40.58,39.56,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+13800,Rhode Island CS27,Rhode Island,,,United States (USA) - Rhode Island.,9807,41.05,-71.3,,,0.9999938,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+13830,Rhode Island CS83,Rhode Island,,,United States (USA) - Rhode Island.,9807,41.05,-71.3,,,0.99999375,100000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+13901,South Carolina CS27 North zone,South Carolina North,,,United States (USA) - South Carolina counties north of and including Edgefield; Saluda; Lexington; Calhoun; Sumter; Florence; Marion & Horry.,9802,33.0,-81.0,33.46,34.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13902,South Carolina CS27 South zone,South Carolina South,,,United States (USA) - South Carolina - Aiken; Allendale; Bamberg; Barnwell; Beaufort; Berkeley; Charleston; Clarendon; Colleton; Dorchester; Georgetown; Hampton; Jasper; Orangeburg & Williamsburg counties.,9802,31.5,-81.0,32.2,33.4,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+13930,South Carolina CS83,South Carolina,,,United States (USA) - South Carolina.,9802,31.5,-81.0,34.5,32.3,,609600.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14001,South Dakota CS27 North zone,South Dakota North,,,United States (USA) - South Dakota - counties north of 44d 20m North.,9802,43.5,-100.0,44.25,45.41,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14002,South Dakota CS27 South zone,South Dakota South,,,United States (USA) - South Dakota - counties south of 44d 20m North.,9802,42.2,-100.2,42.5,44.24,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14031,South Dakota CS83 North zone,South Dakota North,,,United States (USA) - South Dakota - counties north of 44d 20m North.,9802,43.5,-100.0,45.41,44.25,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14032,South Dakota CS83 South zone,South Dakota South,,,United States (USA) - South Dakota - counties south of 44d 20m North.,9802,42.2,-100.2,44.24,42.5,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14100,Tennessee CS27,Tennessee,,,United States (USA) - Tennessee.,9802,34.4,-86.0,35.15,36.25,,100000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14130,Tennessee CS83,Tennessee,,,United States (USA) - Tennessee.,9802,34.2,-86.0,36.25,35.15,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14201,Texas CS27 North zone,Texas North,,,United States (USA) - Texas - counties north of 34d 20m North.,9802,34.0,-101.3,34.39,36.11,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14202,Texas CS27 North Central zone,Texas North Central,,,United States (USA) - Texas - counties between 34d 20m & 32deg North.,9802,31.4,-97.3,32.08,33.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14203,Texas CS27 Central zone,Texas Central,,,United States (USA) - Texas - counties between 32deg & 30d 10m North.,9802,29.4,-100.2,30.07,31.53,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14204,Texas CS27 South Central zone,Texas South Central,,,United States (USA) - Texas - counties between 30d 10m & 28d 05m North.,9802,27.5,-99.0,28.23,30.17,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14205,Texas CS27 South zone,Texas South,,,United States (USA) - Texas - counties south of 28d 05m North.,9802,25.4,-98.3,26.1,27.5,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14231,Texas CS83 North zone,Texas North,,,United States (USA) - Texas - counties north of 34d 20m North.,9802,34.0,-101.3,36.11,34.39,,200000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14232,Texas CS83 North Central zone,Texas North Central,,,United States (USA) - Texas - counties between 34d 20m & 32deg North.,9802,31.4,-98.3,33.58,32.08,,600000.0,2000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14233,Texas CS83 Central zone,Texas Central,,,United States (USA) - Texas - counties between 32deg & 30d 10m North.,9802,29.4,-100.2,31.53,30.07,,700000.0,3000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14234,Texas CS83 South Central zone,Texas South Central,,,United States (USA) - Texas - counties between 30d 10m & 28d 05m North.,9802,27.5,-99.0,30.17,28.23,,600000.0,4000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14235,Texas CS83 South zone,Texas South,,,United States (USA) - Texas - counties south of 28d 05m North.,9802,25.4,-98.3,27.5,26.1,,300000.0,5000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14301,Utah CS27 North zone,Utah North,,,United States (USA) - Utah - counties north of 40d 50m North.,9802,40.2,-111.3,40.43,41.47,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14302,Utah CS27 Central zone,Utah Central,,,United States (USA) - Utah - counties between 40d 50m & 38d 30m North.,9802,38.2,-111.3,39.01,40.39,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14303,Utah CS27 South zone,Utah South,,,United States (USA) - Utah - counties south of 38d 30m North.,9802,36.4,-111.3,37.13,38.21,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14331,Utah CS83 North zone,Utah North,,,United States (USA) - Utah - counties north of 40d 50m North.,9802,40.2,-111.3,41.47,40.43,,500000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14332,Utah CS83 Central zone,Utah Central,,,United States (USA) - Utah - counties between 40d 50m & 38d 30m North.,9802,38.2,-111.3,40.39,39.01,,500000.0,2000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14333,Utah CS83 South zone,Utah South,,,United States (USA) - Utah - counties south of 38d 30m North.,9802,36.4,-111.3,38.21,37.13,,500000.0,3000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14400,Vermont CS27,Vermont,,,United States (USA) - Vermont.,9807,42.3,-72.3,,,0.999964286,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+14430,Vermont CS83,Vermont,,,United States (USA) - Vermont.,9807,42.3,-72.3,,,0.999964286,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+14501,Virginia CS27 North zone,Virginia North,,,United States (USA) - Virginia - counties north of 38d 05m North.,9802,37.4,-78.3,38.02,39.12,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14502,Virginia CS27 South zone,Virginia South,,,United States (USA) - Virginia - counties south of 38d 05m North.,9802,36.2,-78.3,36.46,37.58,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14531,Virginia CS83 North zone,Virginia North,,,United States (USA) - Virginia - counties north of 38d 05m North.,9802,37.4,-78.3,39.12,38.02,,3500000.0,2000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14532,Virginia CS83 South zone,Virginia South,,,United States (USA) - Virginia - counties south of 38d 05m North.,9802,36.2,-78.3,37.58,36.46,,3500000.0,1000000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14601,Washington CS27 North zone,Washington North,,,United States (USA) - Washington - counties north of 47d 30m North.,9802,47.0,-120.5,47.3,48.44,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14602,Washington CS27 South zone,Washington South,,,United States (USA) - Washington - counties south of 47d 30m North.,9802,45.2,-120.3,45.5,47.2,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14631,Washington CS83 North zone,Washington North,,,United States (USA) - Washington - counties north of 47d 30m North.,9802,47.0,-120.5,48.44,47.3,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14632,Washington CS83 South zone,Washington South,,,United States (USA) - Washington - counties south of 47d 30m North.,9802,45.2,-120.3,47.2,45.5,,500000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14701,West Virginia CS27 North zone,West Virginia North,,,United States (USA) - West Virginia - counties north of 39deg North.,9802,38.3,-79.3,39.0,40.15,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14702,West Virginia CS27 South zone,West Virginia South,,,United States (USA) - West Virginia - counties south of 39deg North.,9802,37.0,-81.0,37.29,38.53,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14731,West Virginia CS83 North zone,West Virginia North,,,United States (USA) - West Virginia - counties north of 39deg North.,9802,38.3,-79.3,40.15,39.0,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14732,West Virginia CS83 South zone,West Virginia South,,,United States (USA) - West Virginia - counties south of 39deg North.,9802,37.0,-81.0,38.53,37.29,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14801,Wisconsin CS27 North zone,Wisconsin North,,,United States (USA) - Wisconsin - counties north of 45d 35m North.,9802,45.1,-90.0,45.34,46.46,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14802,Wisconsin CS27 Central zone,Wisconsin Central,,,United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.,9802,43.5,-90.0,44.15,45.3,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14803,Wisconsin CS27 South zone,Wisconsin South,,,United States (USA) - Wisconsin - counties south of 44d 15m North.,9802,42.0,-90.0,42.44,44.04,,2000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+14831,Wisconsin CS83 North zone,Wisconsin North,,,United States (USA) - Wisconsin - counties north of 45d 35m North.,9802,45.1,-90.0,46.46,45.34,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14832,Wisconsin CS83 Central zone,Wisconsin Central,,,United States (USA) - Wisconsin - counties between 45d 35m & 44d 15m North.,9802,43.5,-90.0,45.3,44.15,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14833,Wisconsin CS83 South zone,Wisconsin South,,,United States (USA) - Wisconsin - counties south of 44d 15m North.,9802,42.0,-90.0,44.04,42.44,,600000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+14901,Wyoming CS27 East zone,Wyoming East,,,United States (USA) - Wyoming - counties east of 106d West.,9807,40.4,-105.1,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+14902,Wyoming CS27 East Central zone,Wyoming East Central,,,United States (USA) - Wyoming - counties between 106d & 108d 10m West.,9807,40.4,-107.2,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+14903,Wyoming CS27 West Central zone,Wyoming West Central,,,United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.,9807,40.4,-108.45,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+14904,Wyoming CS27 West zone,Wyoming West,,,United States (USA) - Wyoming - counties west of 109d 40m West.,9807,40.4,-110.05,,,0.999941177,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+14931,Wyoming CS83 East zone,Wyoming East,,,United States (USA) - Wyoming - counties east of 106d West.,9807,40.3,-105.1,,,0.9999375,200000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+14932,Wyoming CS83 East Central zone,Wyoming East Central,,,United States (USA) - Wyoming - counties between 106d & 108d 10m West.,9807,40.3,-107.2,,,0.9999375,400000.0,100000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+14933,Wyoming CS83 West Central zone,Wyoming West Central,,,United States (USA) - Wyoming - counties between 108d 10m & 109d 40m West.,9807,40.3,-108.45,,,0.9999375,600000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+14934,Wyoming CS83 West zone,Wyoming West,,,United States (USA) - Wyoming - counties west of 109d 40m West.,9807,40.3,-110.05,,,0.9999375,800000.0,100000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15001,Alaska CS27 zone 1,Alaska zone 1,,,United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.,9812,57.0,-133.4,323.07483685,323.07483685,0.9999,16404166.67,-16404166.67,9003,9110,8901,,,,,1997-04-11 00:00:00,USGS Professional Paper #1395,EPSG,,96.29  97.08
+15002,Alaska CS27 zone 2,Alaska zone 2,,,United States (USA) - Alaska - 141deg to 144deg West.,9807,54.0,-142.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15003,Alaska CS27 zone 3,Alaska zone 3,,,United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.,9807,54.0,-146.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15004,Alaska CS27 zone 4,Alaska zone 4,,,United States (USA) - Alaska - 148deg to 152deg West.,9807,54.0,-150.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15005,Alaska CS27 zone 5,Alaska zone 5,,,United States (USA) - Alaska - 152deg to 156deg West.,9807,54.0,-154.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15006,Alaska CS27 zone 6,Alaska zone 6,,,United States (USA) - Alaska - 156deg to 160deg West.,9807,54.0,-158.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15007,Alaska CS27 zone 7,Alaska zone 7,,,United States (USA) - Alaska - 160deg to 164deg West.,9807,54.0,-162.0,,,0.9999,700000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15008,Alaska CS27 zone 8,Alaska zone 8,,,United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.,9807,54.0,-166.0,,,0.9999,500000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15009,Alaska CS27 zone 9,Alaska zone 9,,,United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.,9807,54.0,-170.0,,,0.9999,600000.0,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15010,Alaska CS27 zone 10,Alaska zone 10,,,United States (USA) - Alaska - Aleutian Islands.,9802,51.0,-176.0,53.5,51.5,,3000000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+15031,Alaska CS83 zone 1,Alaska zone 1,,,United States (USA) - Alaska - east of 141 deg West; i.e. Panhandle.,9812,57.0,-133.4,323.07483685,323.07483685,0.9999,5000000.0,-5000000.0,9001,9110,8901,,,,,1996-09-12 00:00:00,NOAA manual NOS NGS 5,EPSG,,96.29
+15032,Alaska CS83 zone 2,Alaska zone 2,,,United States (USA) - Alaska - 141deg to 144deg West.,9807,54.0,-142.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15033,Alaska CS83 zone 3,Alaska zone 3,,,United States (USA) - Alaska - 144deg to 148deg West excluding Kenai Peninsula; Perry Is. and Esther Is.,9807,54.0,-146.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15034,Alaska CS83 zone 4,Alaska zone 4,,,United States (USA) - Alaska - 148deg to 152deg West.,9807,54.0,-150.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15035,Alaska CS83 zone 5,Alaska zone 5,,,United States (USA) - Alaska - 152deg to 156deg West.,9807,54.0,-154.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15036,Alaska CS83 zone 6,Alaska zone 6,,,United States (USA) - Alaska - 156deg to 160deg West.,9807,54.0,-158.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15037,Alaska CS83 zone 7,Alaska zone 7,,,United States (USA) - Alaska - 160deg to 164deg West.,9807,54.0,-162.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15038,Alaska CS83 zone 8,Alaska zone 8,,,United States (USA) - Alaska - 164deg to 168deg West north of 54d 30m North.,9807,54.0,-166.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15039,Alaska CS83 zone 9,Alaska zone 9,,,United States (USA) - Alaska - west of 168deg West and north of 54d 30m North.,9807,54.0,-170.0,,,0.9999,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15040,Alaska CS83 zone 10,Alaska zone 10,,,United States (USA) - Alaska - Aleutian Islands.,9802,51.0,-176.0,53.5,51.5,,1000000.0,0.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+15101,Hawaii CS27 zone 1,Hawaii zone 1,,,United States (USA) - Hawaii - island of Hawaii.,9807,18.5,-155.3,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15102,Hawaii CS27 zone 2,Hawaii zone 2,,,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,9807,20.2,-156.4,,,0.999966667,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15103,Hawaii CS27 zone 3,Hawaii zone 3,,,United States (USA) - Hawaii - Oahu.,9807,21.1,-158.0,,,0.99999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15104,Hawaii CS27 zone 4,Hawaii zone 4,,,United States (USA) - Hawaii - Kauai.,9807,21.5,-159.3,,,0.99999,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15105,Hawaii CS27 zone 5,Hawaii zone 5,,,United States (USA) - Hawaii - Niihau.,9807,21.4,-160.1,,,1.0,500000.0,0.0,9003,9110,8901,,,,,1995-12-02 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29
+15131,Hawaii CS83 zone 1,Hawaii  zone 1,,,United States (USA) - Hawaii - island of Hawaii.,9807,18.5,-155.3,,,0.999966667,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15132,Hawaii CS83 zone 2,Hawaii  zone 2,,,United States (USA) - Hawaii - Maui; Kahoolawe; Lanai; Molokai.,9807,20.2,-156.4,,,0.999966667,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15133,Hawaii CS83 zone 3,Hawaii  zone 3,,,United States (USA) - Hawaii - Oahu.,9807,21.1,-158.0,,,0.99999,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15134,Hawaii CS83 zone 4,Hawaii  zone 4,,,United States (USA) - Hawaii - Kauai.,9807,21.5,-159.3,,,0.99999,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15135,Hawaii CS83 zone 5,Hawaii  zone 5,,,United States (USA) - Hawaii - Niihau.,9807,21.4,-160.1,,,1.0,500000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29
+15201,Puerto Rico CS27,Puerto Rico,,,Puerto Rico.,9802,17.5,-66.26,18.26,18.02,,500000.0,0.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+15202,St. Croix CS27,St. Croix,,,Virgin Islands of US - St. Croix.,9802,17.5,-66.26,18.26,18.02,,500000.0,100000.0,9003,9110,8901,,,,,1999-04-22 00:00:00,USGS Professional Paper #1395,EPSG,,95.30  96.29  99.28
+15230,Puerto Rico & Virgin Islands CS83,Puerto Rico & Virgin Is.,,,Puerto Rico & Virgin Islands of US,9802,17.5,-66.26,18.26,18.02,,200000.0,200000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,NOAA manual NOS NGS 5,EPSG,,95.30  96.29  99.28
+15914,BLM zone 14N in feet,BLM 14N (feet),,,United States (USA) - Gulf of Mexico - west of 96 deg West approximately.,9807,0.0,-99.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 14\".",95.30  96.29
+15915,BLM zone 15N in feet,BLM 15N (feet),,,United States (USA) - Gulf of Mexico - 96 deg to 90 deg West approximately.,9807,0.0,-93.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 15\".",95.30  96.29
+15916,BLM zone 16N in feet,BLM 16N (feet),,,United States (USA) - Gulf of Mexico - 90 deg to 84 deg West approximately.,9807,0.0,-87.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 16\".",95.27  95.30  96.29
+15917,BLM zone 17N in feet,BLM 17N (feet),,,United States (USA) - Gulf of Mexico - east of 84 deg West approximately.,9807,0.0,-81.0,,,0.9996,1640416.67,0.0,9003,9102,8901,,,,,1995-12-02 00:00:00,Minerals Management Service offshore protraction diagrams.,EPSG,"Sometimes locally referred to as \"UTM zone 17\".",95.30  96.29
+16001,UTM zone 1N,,,,180deg to 174deg West; northern hemisphere.,9807,0.0,-177.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16002,UTM zone 2N,,,,174deg West to 168deg West; northern hemisphere.,9807,0.0,-171.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16003,UTM zone 3N,,,,168deg West to 162deg West; northern hemisphere.,9807,0.0,-165.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16004,UTM zone 4N,,,,162deg West to 156deg West; northern hemisphere.,9807,0.0,-159.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16005,UTM zone 5N,,,,156deg West to 150deg West; northern hemisphere.,9807,0.0,-153.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16006,UTM zone 6N,,,,150deg West to 144deg West; northern hemisphere.,9807,0.0,-147.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16007,UTM zone 7N,,,,144deg West to 138deg West; northern hemisphere.,9807,0.0,-141.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16008,UTM zone 8N,,,,138deg West to 132deg West; northern hemisphere.,9807,0.0,-135.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16009,UTM zone 9N,,,,132deg West to 126deg West; northern hemisphere.,9807,0.0,-129.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16010,UTM zone 10N,,,,130deg West to 120deg West; northern hemisphere.,9807,0.0,-123.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16011,UTM zone 11N,,,,120deg West to 114deg West; northern hemisphere.,9807,0.0,-117.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16012,UTM zone 12N,,,,114deg West to 108deg West; northern hemisphere.,9807,0.0,-111.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16013,UTM zone 13N,,,,108deg West to 102deg West; northern hemisphere.,9807,0.0,-105.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16014,UTM zone 14N,,,,102deg West to 96deg West; northern hemisphere.,9807,0.0,-99.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16015,UTM zone 15N,,,,96deg West to 90deg West; northern hemisphere.,9807,0.0,-93.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16016,UTM zone 16N,,,,90deg West to 84deg West; northern hemisphere.,9807,0.0,-87.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16017,UTM zone 17N,,,,84deg West to 78deg West; northern hemisphere.,9807,0.0,-81.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16018,UTM zone 18N,,,,78deg West to 72deg West; northern hemisphere.,9807,0.0,-75.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16019,UTM zone 19N,,,,72deg West to 66deg West; northern hemisphere.,9807,0.0,-69.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16020,UTM zone 20N,,,,66deg West to 60deg West; northern hemisphere.,9807,0.0,-63.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16021,UTM zone 21N,,,,60deg West to 54deg West; northern hemisphere.,9807,0.0,-57.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16022,UTM zone 22N,,,,54deg West to 48deg West; northern hemisphere.,9807,0.0,-51.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16023,UTM zone 23N,,,,48deg West to 42deg West; northern hemisphere.,9807,0.0,-45.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16024,UTM zone 24N,,,,42deg West to 36deg West; northern hemisphere.,9807,0.0,-39.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16025,UTM zone 25N,,,,36deg West to 30deg West; northern hemisphere.,9807,0.0,-33.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16026,UTM zone 26N,,,,30deg West to 24deg West; northern hemisphere.,9807,0.0,-27.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16027,UTM zone 27N,,,,24deg West to 18deg West; northern hemisphere.,9807,0.0,-21.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16028,UTM zone 28N,,,,18deg West to 12deg West; northern hemisphere.,9807,0.0,-15.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16029,UTM zone 29N,,,,12deg West to 6deg West; northern hemisphere.,9807,0.0,-9.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16030,UTM zone 30N,,,,6deg West to 0deg; northern hemisphere.,9807,0.0,-3.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16031,UTM zone 31N,,,,0deg to 6deg East; northern hemisphere.,9807,0.0,3.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16032,UTM zone 32N,,,,6deg East to 12deg East; northern hemisphere.,9807,0.0,9.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16033,UTM zone 33N,,,,12deg East to 18deg East; northern hemisphere.,9807,0.0,15.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16034,UTM zone 34N,,,,18deg East to 24deg East; northern hemisphere.,9807,0.0,21.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16035,UTM zone 35N,,,,24deg East to 30deg East; northern hemisphere.,9807,0.0,27.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16036,UTM zone 36N,,,,30deg East to 36deg East; northern hemisphere.,9807,0.0,33.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16037,UTM zone 37N,,,,36deg East to 42deg East; northern hemisphere.,9807,0.0,39.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16038,UTM zone 38N,,,,42deg East to 48deg East; northern hemisphere.,9807,0.0,45.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16039,UTM zone 39N,,,,48deg East to 54deg East; northern hemisphere.,9807,0.0,51.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16040,UTM zone 40N,,,,54deg East to 60deg East; northern hemisphere.,9807,0.0,57.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16041,UTM zone 41N,,,,60deg East to 66deg East; northern hemisphere.,9807,0.0,63.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16042,UTM zone 42N,,,,66deg East to 72deg East; northern hemisphere.,9807,0.0,69.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16043,UTM zone 43N,,,,72deg East to 78deg East; northern hemisphere.,9807,0.0,75.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16044,UTM zone 44N,,,,78deg East to 84deg East; northern hemisphere.,9807,0.0,81.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16045,UTM zone 45N,,,,84deg East to 90deg East; northern hemisphere.,9807,0.0,87.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16046,UTM zone 46N,,,,90deg East to 96deg East; northern hemisphere.,9807,0.0,93.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16047,UTM zone 47N,,,,96deg East to 102eg East; northern hemisphere.,9807,0.0,99.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16048,UTM zone 48N,,,,102deg East to 108deg East; northern hemisphere.,9807,0.0,105.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16049,UTM zone 49N,,,,108deg East to 114deg East; northern hemisphere.,9807,0.0,111.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16050,UTM zone 50N,,,,114deg East to 120deg East; northern hemisphere.,9807,0.0,117.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16051,UTM zone 51N,,,,120deg East to 126deg East; northern hemisphere.,9807,0.0,123.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16052,UTM zone 52N,,,,126deg East to 132deg East; northern hemisphere.,9807,0.0,129.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16053,UTM zone 53N,,,,132deg East to 138deg East; northern hemisphere.,9807,0.0,135.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16054,UTM zone 54N,,,,138deg East to 144deg East; northern hemisphere.,9807,0.0,141.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16055,UTM zone 55N,,,,144deg East to 150deg East; northern hemisphere.,9807,0.0,147.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16056,UTM zone 56N,,,,150deg East to 156deg East; northern hemisphere.,9807,0.0,153.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16057,UTM zone 57N,,,,156deg East to 162deg East; northern hemisphere.,9807,0.0,159.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16058,UTM zone 58N,,,,162deg East to 168deg East; northern hemisphere.,9807,0.0,165.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16059,UTM zone 59N,,,,168deg East to 174deg East; northern hemisphere.,9807,0.0,171.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16060,UTM zone 60N,,,,174deg East to 180deg; northern hemisphere.,9807,0.0,177.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16061,Universal Polar Stereographic North,UPS North,,,Northern hemisphere polar area.,9810,90.0,0.0,,,0.994,2000000.0,2000000.0,9001,9102,8901,,,,,1997-06-16 00:00:00,,EPSG,,97.18
+16101,UTM zone 1S,,,,180deg to 174deg West; southern hemisphere.,9807,0.0,-177.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16102,UTM zone 2S,,,,174deg West to 168deg West; southern hemisphere.,9807,0.0,-171.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16103,UTM zone 3S,,,,168deg West to 162deg West; southern hemisphere.,9807,0.0,-165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16104,UTM zone 4S,,,,162deg West to 156deg West; southern hemisphere.,9807,0.0,-159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16105,UTM zone 5S,,,,156deg West to 150deg West; southern hemisphere.,9807,0.0,-153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16106,UTM zone 6S,,,,150deg West to 144deg West; southern hemisphere.,9807,0.0,-147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16107,UTM zone 7S,,,,144deg West to 138deg West; southern hemisphere.,9807,0.0,-141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16108,UTM zone 8S,,,,138deg West to 132deg West; southern hemisphere.,9807,0.0,-135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16109,UTM zone 9S,,,,132deg West to 126deg West; southern hemisphere.,9807,0.0,-129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16110,UTM zone 10S,,,,130deg West to 120deg West; southern hemisphere.,9807,0.0,-123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16111,UTM zone 11S,,,,120deg West to 114deg West; southern hemisphere.,9807,0.0,-117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16112,UTM zone 12S,,,,114deg West to 108deg West; southern hemisphere.,9807,0.0,-111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16113,UTM zone 13S,,,,108deg West to 102deg West; southern hemisphere.,9807,0.0,-105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16114,UTM zone 14S,,,,102deg West to 96deg West; southern hemisphere.,9807,0.0,-99.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16115,UTM zone 15S,,,,96deg West to 90deg West; southern hemisphere.,9807,0.0,-93.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16116,UTM zone 16S,,,,90deg West to 84deg West; southern hemisphere.,9807,0.0,-87.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16117,UTM zone 17S,,,,84deg West to 78deg West; southern hemisphere.,9807,0.0,-81.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16118,UTM zone 18S,,,,78deg West to 72deg West; southern hemisphere.,9807,0.0,-75.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16119,UTM zone 19S,,,,72deg West to 66deg West; southern hemisphere.,9807,0.0,-69.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16120,UTM zone 20S,,,,66deg West to 60deg West; southern hemisphere.,9807,0.0,-63.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16121,UTM zone 21S,,,,60deg West to 54deg West; southern hemisphere.,9807,0.0,-57.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16122,UTM zone 22S,,,,54deg West to 48deg West; southern hemisphere.,9807,0.0,-51.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16123,UTM zone 23S,,,,48deg West to 42deg West; southern hemisphere.,9807,0.0,-45.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16124,UTM zone 24S,,,,42deg West to 36deg West; southern hemisphere.,9807,0.0,-39.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16125,UTM zone 25S,,,,36deg West to 30deg West; southern hemisphere.,9807,0.0,-33.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16126,UTM zone 26S,,,,30deg West to 24deg West; southern hemisphere.,9807,0.0,-27.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16127,UTM zone 27S,,,,24deg West to 18deg West; southern hemisphere.,9807,0.0,-21.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16128,UTM zone 28S,,,,18deg West to 12deg West; southern hemisphere.,9807,0.0,-15.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16129,UTM zone 29S,,,,12deg West to 6deg West; southern hemisphere.,9807,0.0,-9.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16130,UTM zone 30S,,,,6deg West to 0deg; southern hemisphere.,9807,0.0,-3.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16131,UTM zone 31S,,,,0deg to 6deg East; southern hemisphere.,9807,0.0,3.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16132,UTM zone 32S,,,,6deg East to 12deg East; southern hemisphere.,9807,0.0,9.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16133,UTM zone 33S,,,,12deg East to 18deg East; southern hemisphere.,9807,0.0,15.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16134,UTM zone 34S,,,,18deg East to 24deg East; southern hemisphere.,9807,0.0,21.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16135,UTM zone 35S,,,,24deg East to 30deg East; southern hemisphere.,9807,0.0,27.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16136,UTM zone 36S,,,,30deg East to 36deg East; southern hemisphere.,9807,0.0,33.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16137,UTM zone 37S,,,,36deg East to 42deg East; southern hemisphere.,9807,0.0,39.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16138,UTM zone 38S,,,,42deg East to 48deg East; southern hemisphere.,9807,0.0,45.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16139,UTM zone 39S,,,,48deg East to 54deg East; southern hemisphere.,9807,0.0,51.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16140,UTM zone 40S,,,,54deg East to 60deg East; southern hemisphere.,9807,0.0,57.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16141,UTM zone 41S,,,,60deg East to 66deg East; southern hemisphere.,9807,0.0,63.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16142,UTM zone 42S,,,,66deg East to 72deg East; southern hemisphere.,9807,0.0,69.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16143,UTM zone 43S,,,,72deg East to 78deg East; southern hemisphere.,9807,0.0,75.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16144,UTM zone 44S,,,,78deg East to 84deg East; southern hemisphere.,9807,0.0,81.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16145,UTM zone 45S,,,,84deg East to 90deg East; southern hemisphere.,9807,0.0,87.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16146,UTM zone 46S,,,,90deg East to 96deg East; southern hemisphere.,9807,0.0,93.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16147,UTM zone 47S,,,,96deg East to 102eg East; southern hemisphere.,9807,0.0,99.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16148,UTM zone 48S,,,,102deg East to 108deg East; southern hemisphere.,9807,0.0,105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16149,UTM zone 49S,,,,108deg East to 114deg East; southern hemisphere.,9807,0.0,111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16150,UTM zone 50S,,,,114deg East to 120deg East; southern hemisphere.,9807,0.0,117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16151,UTM zone 51S,,,,120deg East to 126deg East; southern hemisphere.,9807,0.0,123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16152,UTM zone 52S,,,,126deg East to 132deg East; southern hemisphere.,9807,0.0,129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16153,UTM zone 53S,,,,132deg East to 138deg East; southern hemisphere.,9807,0.0,135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16154,UTM zone 54S,,,,138deg East to 144deg East; southern hemisphere.,9807,0.0,141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16155,UTM zone 55S,,,,144deg East to 150deg East; southern hemisphere.,9807,0.0,147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16156,UTM zone 56S,,,,150deg East to 156deg East; southern hemisphere.,9807,0.0,153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16157,UTM zone 57S,,,,156deg East to 162deg East; southern hemisphere.,9807,0.0,159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16158,UTM zone 58S,,,,162deg East to 168deg East; southern hemisphere.,9807,0.0,165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16159,UTM zone 59S,,,,168deg East to 174deg East; southern hemisphere.,9807,0.0,171.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16160,UTM zone 60S,,,,174deg East to 180deg; southern hemisphere.,9807,0.0,177.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.28
+16161,Universal Polar Stereographic South,UPS South,,,Southern hemisphere polar area.,9810,-90.0,0.0,,,0.994,2000000.0,2000000.0,9001,9102,8901,,,,,1997-06-16 00:00:00,,EPSG,,97.18
+16202,Gauss-Kruger zone 2,,,,6deg East to 12deg East; northern hemisphere.,9807,0.0,9.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16203,Gauss-Kruger zone 3,,,,12deg East to 18deg East; northern hemisphere.,9807,0.0,15.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16204,Gauss-Kruger zone 4,,,,18deg East to 24deg East; northern hemisphere.,9807,0.0,21.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16205,Gauss-Kruger zone 5,,,,24deg East to 30deg East; northern hemisphere.,9807,0.0,27.0,,,1.0,5500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16206,Gauss-Kruger zone 6,,,,30deg East to 36deg East; northern hemisphere.,9807,0.0,33.0,,,1.0,6500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16207,Gauss-Kruger zone 7,,,,36deg East to 42deg East; northern hemisphere.,9807,0.0,39.0,,,1.0,7500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16208,Gauss-Kruger zone 8,,,,42deg East to 48deg East; northern hemisphere.,9807,0.0,45.0,,,1.0,8500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16209,Gauss-Kruger zone 9,,,,48deg East to 54deg East; northern hemisphere.,9807,0.0,51.0,,,1.0,9500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16210,Gauss-Kruger zone 10,,,,54deg East to 60deg East; northern hemisphere.,9807,0.0,57.0,,,1.0,10500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16211,Gauss-Kruger zone 11,,,,60deg East to 66deg East; northern hemisphere.,9807,0.0,63.0,,,1.0,11500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16212,Gauss-Kruger zone 12,,,,66deg East to 72deg East; northern hemisphere.,9807,0.0,69.0,,,1.0,12500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16213,Gauss-Kruger zone 13,,,,72deg East to 78deg East; northern hemisphere.,9807,0.0,75.0,,,1.0,13500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16214,Gauss-Kruger zone 14,,,,78deg East to 84deg East; northern hemisphere.,9807,0.0,81.0,,,1.0,14500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16215,Gauss-Kruger zone 15,,,,84deg East to 90deg East; northern hemisphere.,9807,0.0,87.0,,,1.0,15500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16216,Gauss-Kruger zone 16,,,,90deg East to 96deg East; northern hemisphere.,9807,0.0,93.0,,,1.0,16500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16217,Gauss-Kruger zone 17,,,,96deg East to 102eg East; northern hemisphere.,9807,0.0,99.0,,,1.0,17500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16218,Gauss-Kruger zone 18,,,,102deg East to 108deg East; northern hemisphere.,9807,0.0,105.0,,,1.0,18500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16219,Gauss-Kruger zone 19,,,,108deg East to 114deg East; northern hemisphere.,9807,0.0,111.0,,,1.0,19500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16220,Gauss-Kruger zone 20,,,,114deg East to 120deg East; northern hemisphere.,9807,0.0,117.0,,,1.0,20500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16221,Gauss-Kruger zone 21,,,,120deg East to 126deg East; northern hemisphere.,9807,0.0,123.0,,,1.0,21500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16222,Gauss-Kruger zone 22,,,,126deg East to 132deg East; northern hemisphere.,9807,0.0,129.0,,,1.0,22500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16223,Gauss-Kruger zone 23,,,,132deg East to 138deg East; northern hemisphere.,9807,0.0,135.0,,,1.0,23500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16224,Gauss-Kruger zone 24,,,,138deg East to 144deg East; northern hemisphere.,9807,0.0,141.0,,,1.0,24500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16225,Gauss-Kruger zone 25,,,,144deg East to 150deg East; northern hemisphere.,9807,0.0,147.0,,,1.0,25500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16226,Gauss-Kruger zone 26,,,,150deg East to 156deg East; northern hemisphere.,9807,0.0,153.0,,,1.0,26500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16227,Gauss-Kruger zone 27,,,,156deg East to 162deg East; northern hemisphere.,9807,0.0,159.0,,,1.0,27500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16228,Gauss-Kruger zone 28,,,,162deg East to 168deg East; northern hemisphere.,9807,0.0,165.0,,,1.0,28500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16229,Gauss-Kruger zone 29,,,,168deg East to 174deg East; northern hemisphere.,9807,0.0,171.0,,,1.0,29500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16230,Gauss-Kruger zone 30,,,,174deg East to 180deg; northern hemisphere.,9807,0.0,177.0,,,1.0,30500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16231,Gauss-Kruger zone 31,,,,180deg to 174deg West; northern hemisphere.,9807,0.0,-177.0,,,1.0,31500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16232,Gauss-Kruger zone 32,,,,174deg West to 168deg West; northern hemisphere.,9807,0.0,-171.0,,,1.0,32500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16302,Gauss-Kruger 2N,,,,6deg East to 12deg East; northern hemisphere.,9807,0.0,9.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16303,Gauss-Kruger 3N,,,,12deg East to 18deg East; northern hemisphere.,9807,0.0,15.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1998-06-30 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,
+16304,Gauss-Kruger 4N,,,,18deg East to 24deg East; northern hemisphere.,9807,0.0,21.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16305,Gauss-Kruger 5N,,,,24deg East to 30deg East; northern hemisphere.,9807,0.0,27.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16306,Gauss-Kruger 6N,,,,30deg East to 36deg East; northern hemisphere.,9807,0.0,33.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16307,Gauss-Kruger 7N,,,,36deg East to 42deg East; northern hemisphere.,9807,0.0,39.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16308,Gauss-Kruger 8N,,,,42deg East to 48deg East; northern hemisphere.,9807,0.0,45.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16309,Gauss-Kruger 9N,,,,48deg East to 54deg East; northern hemisphere.,9807,0.0,51.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16310,Gauss-Kruger 10N,,,,54deg East to 60deg East; northern hemisphere.,9807,0.0,57.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16311,Gauss-Kruger 11N,,,,60deg East to 66deg East; northern hemisphere.,9807,0.0,63.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16312,Gauss-Kruger 12N,,,,66deg East to 72deg East; northern hemisphere.,9807,0.0,69.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16313,Gauss-Kruger 13N,,,,72deg East to 78deg East; northern hemisphere.,9807,0.0,75.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16314,Gauss-Kruger 14N,,,,78deg East to 84deg East; northern hemisphere.,9807,0.0,81.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16315,Gauss-Kruger 15N,,,,84deg East to 90deg East; northern hemisphere.,9807,0.0,87.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16316,Gauss-Kruger 16N,,,,90deg East to 96deg East; northern hemisphere.,9807,0.0,93.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16317,Gauss-Kruger 17N,,,,96deg East to 102eg East; northern hemisphere.,9807,0.0,99.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16318,Gauss-Kruger 18N,,,,102deg East to 108deg East; northern hemisphere.,9807,0.0,105.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16319,Gauss-Kruger 19N,,,,108deg East to 114deg East; northern hemisphere.,9807,0.0,111.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16320,Gauss-Kruger 20N,,,,114deg East to 120deg East; northern hemisphere.,9807,0.0,117.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16321,Gauss-Kruger 21N,,,,120deg East to 126deg East; northern hemisphere.,9807,0.0,123.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16322,Gauss-Kruger 22N,,,,126deg East to 132deg East; northern hemisphere.,9807,0.0,129.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16323,Gauss-Kruger 23N,,,,132deg East to 138deg East; northern hemisphere.,9807,0.0,135.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16324,Gauss-Kruger 24N,,,,138deg East to 144deg East; northern hemisphere.,9807,0.0,141.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16325,Gauss-Kruger 25N,,,,144deg East to 150deg East; northern hemisphere.,9807,0.0,147.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16326,Gauss-Kruger 26N,,,,150deg East to 156deg East; northern hemisphere.,9807,0.0,153.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16327,Gauss-Kruger 27N,,,,156deg East to 162deg East; northern hemisphere.,9807,0.0,159.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16328,Gauss-Kruger 28N,,,,162deg East to 168deg East; northern hemisphere.,9807,0.0,165.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16329,Gauss-Kruger 29N,,,,168deg East to 174deg East; northern hemisphere.,9807,0.0,171.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16330,Gauss-Kruger 30N,,,,174deg East to 180deg; northern hemisphere.,9807,0.0,177.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16331,Gauss-Kruger 31N,,,,180deg to 174deg West; northern hemisphere.,9807,0.0,-177.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16332,Gauss-Kruger 32N,,,,174deg West to 168deg West; northern hemisphere.,9807,0.0,-171.0,,,1.0,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.28
+16400,TM 0 N,,,,United Kingdom (UKCS) - offshore North Sea.,9807,0.0,0.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-11-11 00:00:00,Shell UK,EPSG,,
+16405,TM 5 NE,,,,Netherlands - offshore.,9807,0.0,5.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-11-11 00:00:00,NAM,EPSG,,
+16506,TM 106 NE,,,,Vietnam - offshore.,9807,0.0,106.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-11-11 00:00:00,PetroVietnam,EPSG,,
+16611,TM 11.30 SE,,,,Angola - offshore.,9807,0.0,11.3,,,0.9996,500000.0,10000000.0,9001,9110,8901,,,,,1998-11-11 00:00:00,Esso Angola,EPSG,,
+16612,TM 12 SE,,,,Angola - offshore.,9807,0.0,12.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1998-11-11 00:00:00,Shell Angola,EPSG,,
+16636,TM 36 SE,,,,Mozambique - offshore.,9807,0.0,36.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1998-11-11 00:00:00,BP Mozambique,EPSG,,
+17348,Map Grid of Australia zone 48,MGA zone 48,,,Australia 102deg East  to 108deg East.,9807,0.0,105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17349,Map Grid of Australia zone 49,MGA zone 49,,,Australia 108deg East  to 114deg East.,9807,0.0,111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17350,Map Grid of Australia zone 50,MGA zone 50,,,Australia 114deg East  to 120deg East.,9807,0.0,117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17351,Map Grid of Australia zone 51,MGA zone 51,,,Australia 120deg East  to 126deg East.,9807,0.0,123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17352,Map Grid of Australia zone 52,MGA zone 52,,,Australia 126deg East  to 132deg East.,9807,0.0,129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17353,Map Grid of Australia zone 53,MGA zone 53,,,Australia 132deg East  to 138deg East.,9807,0.0,135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17354,Map Grid of Australia zone 54,MGA zone 54,,,Australia 138deg East  to 144deg East.,9807,0.0,141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17355,Map Grid of Australia zone 55,MGA zone 55,,,Australia 144deg East  to 150deg East.,9807,0.0,147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17356,Map Grid of Australia zone 56,MGA zone 56,,,Australia 150deg East  to 156deg East.,9807,0.0,153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17357,Map Grid of Australia zone 57,MGA zone 57,,,Australia 156deg East  to 162deg East.,9807,0.0,159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17358,Map Grid of Australia zone 58,MGA zone 58,,,Australia 162deg East  to 168deg East.,9807,0.0,165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Australian Surveying and Land Information Group Internet WWW page.,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17448,Australian Map Grid zone 48,AMG zone 48,,,Australia 102deg East  to 108deg East.,9807,0.0,105.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17449,Australian Map Grid zone 49,AMG zone 49,,,Australia 108deg East  to 114deg East.,9807,0.0,111.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17450,Australian Map Grid zone 50,AMG zone 50,,,Australia 114deg East  to 120deg East.,9807,0.0,117.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17451,Australian Map Grid zone 51,AMG zone 51,,,Australia 120deg East  to 126deg East.,9807,0.0,123.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17452,Australian Map Grid zone 52,AMG zone 52,,,Australia 126deg East  to 132deg East.,9807,0.0,129.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17453,Australian Map Grid zone 53,AMG zone 53,,,Australia 132deg East  to 138deg East.,9807,0.0,135.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17454,Australian Map Grid zone 54,AMG zone 54,,,Australia 138deg East  to 144deg East.  Papua New Guinea west of 144 deg East.,9807,0.0,141.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17455,Australian Map Grid zone 55,AMG zone 55,,,Australia 144deg East  to 150deg East.  Papua New Guinea 144deg East  to 150deg East.,9807,0.0,147.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17456,Australian Map Grid zone 56,AMG zone 56,,,Australia 150deg East  to 156deg East.,9807,0.0,153.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17457,Australian Map Grid zone 57,AMG zone 57,,,Australia 156deg East  to 162deg East.,9807,0.0,159.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17458,Australian Map Grid zone 58,AMG zone 58,,,Australia 162deg East  to 168deg East.,9807,0.0,165.0,,,0.9996,500000.0,10000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,The Australian Map Grid Technical Manual; National Mapping Council of Australia; 1972,EPSG,Grid convergence uses opposite sign convention to UTM,95.30  96.29
+17515,South African Survey Grid zone 15,S. African Grid zone 15,,,South Africa - Walvis Bay.,9808,0.0,15.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17517,South African Survey Grid zone 17,S. African Grid zone 17,,,South Africa - west of 18 deg East.,9808,0.0,17.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17519,South African Survey Grid zone 19,S. African Grid zone 19,,,South Africa - 18 to 20 deg East.,9808,0.0,19.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17521,South African Survey Grid zone 21,S. African Grid zone 21,,,South Africa - 20 to 22 deg East.,9808,0.0,21.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17523,South African Survey Grid zone 23,S. African Grid zone 23,,,South Africa - 22 to 24 deg East.,9808,0.0,23.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17525,South African Survey Grid zone 25,S. African Grid zone 25,,,Lestho  - west of 26 deg East; South Africa - 24 to 26 deg East.,9808,0.0,25.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17527,South African Survey Grid zone 27,S. African Grid zone 27,,,Lestho  - east of 26 deg East;  South Africa - 26 to 28 deg East.,9808,0.0,27.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17529,South African Survey Grid zone 29,S. African Grid zone 29,,,South Africa - 28 to 30 deg East.,9808,0.0,29.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17531,South African Survey Grid zone 31,S. African Grid zone 31,,,South Africa - 30 to 32 deg East;  Swaziland.,9808,0.0,31.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17533,South African Survey Grid zone 33,S. African Grid zone 33,,,South Africa - east of 32 deg East.,9808,0.0,33.0,,,1.0,0.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29
+17611,South West African Survey Grid zone 11,SW African Grid zone 11,,,Namibia - west of 12 deg East.,9808,-22.0,11.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17613,South West African Survey Grid zone 13,SW African Grid zone 13,,,Namibia - 12 to 14 deg East.,9808,-22.0,13.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17615,South West African Survey Grid zone 15,SW African Grid zone 15,,,Namibia - 14 to 16 deg East.,9808,-22.0,15.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17617,South West African Survey Grid zone 17,SW African Grid zone 17,,,Namibia - 16 to 18 deg East.,9808,-22.0,17.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17619,South West African Survey Grid zone 19,SW African Grid zone 19,,,Namibia - 18 to 20 deg East.,9808,-22.0,19.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17621,South West African Survey Grid zone 21,SW African Grid zone 21,,,Namibia - 20 to 22 deg East.,9808,-22.0,21.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17623,South West African Survey Grid zone 23,SW African Grid zone 23,,,Namibia - 22 to 24 deg East.,9808,-22.0,23.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17625,South West African Survey Grid zone 25,SW African Grid zone 25,,,Namibia - east of 24 deg East.,9808,-22.0,25.0,,,1.0,0.0,0.0,9031,9102,8901,,,,,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa.,EPSG,"Transformation method sometimes described as \"Gauss conform\".",95.30  96.29  97.16
+17700,MTM Quebec zone 2,,,,Canada - Quebec - east of 57 deg East.,9807,0.0,-55.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,,
+17701,MTM zone 1,,,,Canada - Newfoundland - east of 54 deg 30 min West.,9807,0.0,-53.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17702,MTM Newfoundland zone 2,MTM zone 2,,,Canada - Newfoundland and Labrador between 57 deg 30 min and 54 de 30 min West.,9807,0.0,-56.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17703,MTM zone 3,,,,Canada - Newfoundland and Labrador between 60 deg and 57 deg 30 min West; Canada - Quebec between 60 deg and 57 deg West.,9807,0.0,-58.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17704,MTM zone 4,,,,Canada - Quebec and Newfoundland (Labrador) between 63 deg and 60 deg West.,9807,0.0,-61.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17705,MTM zone 5,,,,Canada - Quebec and Newfoundland (Labrador) between 66 deg and 63 deg West.,9807,0.0,-64.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17706,MTM zone 6,,,,Canada - Quebec and Newfoundland (Labrador) between 69 deg and  66 deg West.,9807,0.0,-67.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources. Also Geodetic Surveys Section; Newfoundland Department of Government Services and Lands.,EPSG,,
+17707,MTM zone 7,,,,Canada - Quebec between 72 deg and 69 deg West.,9807,0.0,-70.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Topographic Mapping Section; Quebec Ministry of Natural Resources.,EPSG,,
+17708,MTM zone 8,,,,Canada - Quebec between 75 deg and 72 deg West.; Canada - Ontario - east of 75 deg West.,9807,0.0,-73.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17709,MTM zone 9,,,,Canada - Quebec and Ontario - between 78 deg and 75 deg West.,9807,0.0,-76.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17710,MTM zone 10,,,,Canada - Quebec west of 78 deg West; Canada - Ontario - between 79 deg 30 min and 78 deg W in area to north of 47 deg N; between 80 deg 15 min and 78 deg W in area between 46 deg and 47 deg N; between 81 deg and 78 deg W in area south of 46 deg N.,9807,0.0,-79.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17711,MTM zone 11,,,,Canada - Ontario - south of 46 deg N and west of 81 deg West.,9807,0.0,-82.3,,,0.9999,304800.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17712,MTM zone 12,,,,Canada - Ontario - between 82 deg 30 min and 79 deg 30 min W in area to north of 47 deg N; between 82 deg 30 min and 80 deg 15 min W in area between 46 deg and 47 deg N; between 82 deg 30 min and 79 deg 30 min W in area north of 47 deg N.,9807,0.0,-81.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17713,MTM zone 13,,,,Canada - Ontario - between 85 deg 30 min and 82 deg 30 min West and north of 46 deg North.,9807,0.0,-84.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17714,MTM zone 14,,,,Canada - Ontario - between 88 deg 30 min and 85 deg 30 min West.,9807,0.0,-87.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17715,MTM zone 15,,,,Canada - Ontario - between 91 deg 30 min and 88 deg 30 min West.,9807,0.0,-90.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17716,MTM zone 16,,,,Canada - Ontario - between 94 deg 30 min and 91 deg 30 min West.,9807,0.0,-93.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17717,MTM zone 17,,,,Canada - Ontario - west of 94 deg 30 min West.,9807,0.0,-96.0,,,0.9999,304800.0,0.0,9001,9102,8901,,,,,1997-11-13 00:00:00,Surveys and Mapping Section; Ontario Ministry of Transportation.,EPSG,,
+17794,MTM Nova Scotia zone 4,,,,Canada - Nova Scotia - east of 63 deg West.,9807,0.0,-61.3,,,0.9999,4500000.0,0.0,9001,9110,8901,,,,,1999-05-24 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,,99.042
+17795,MTM Nova Scotia zone 5,,,,Canada - Nova Scotia - west of 63 deg West.,9807,0.0,-64.3,,,0.9999,5500000.0,0.0,9001,9110,8901,,,,,1999-05-24 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,,99.042
+17801,Japan Plane Rectangular CS zone I,Japan zone I,,,Japan - Kyushu - Nagasaki-ken; islands of Kagoshima-ken between 27 and 32 deg N and between 128 deg 18 min and 130 deg E (between 128 deg 18 min and 30 deg 13 min E for Amami islands).,9807,33.0,129.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17802,Japan Plane Rectangular CS zone II,Japan zone II,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,33.0,131.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17803,Japan Plane Rectangular CS zone III,Japan zone III,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,132.1,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17804,Japan Plane Rectangular CS zone IV,Japan zone IV,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,33.0,133.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17805,Japan Plane Rectangular CS zone V,Japan zone V,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,134.2,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17806,Japan Plane Rectangular CS zone VI,Japan zone VI,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,136.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17807,Japan Plane Rectangular CS zone VII,Japan zone VII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,137.1,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17808,Japan Plane Rectangular CS zone VIII,Japan zone VIII,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,138.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17809,Japan Plane Rectangular CS zone IX,Japan zone IX,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,36.0,139.5,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17810,Japan Plane Rectangular CS zone X,Japan zone X,,,Japan - Kyushu - Fukuoka-ken; Saga-ken; Kumamoto-ken; Oita-ken; Miyazaki-ken; Kagoshima-ken (except for area within Japan Plane Rectangular Coordinates System zone I).,9807,40.0,140.5,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17811,Japan Plane Rectangular CS zone XI,Japan zone XI,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,9807,44.0,140.15,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17812,Japan Plane Rectangular CS zone XII,Japan zone XII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,9807,44.0,142.15,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17813,Japan Plane Rectangular CS zone XIII,Japan zone XIII,,,Japan - Hokkaido west of 141 deg 15 min E approx. - Otaru city; Hakodate city; Date city; Usu-gun and Abuta-gun of Iburi-shicyo; area of Hiyama-shicyo; area of Shiribeshi-shicyo; Oshima-shicyo.,9807,44.0,144.15,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17814,Japan Plane Rectangular CS zone XIV,Japan zone XIV,,,Japan - Tokyo-to south of 28 deg N & between 140 deg 30 min & 143 deg E.,9807,26.0,142.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17815,Japan Plane Rectangular CS zone XV,Japan zone XV,,,Japan - Okinawa-ken between 126 deg &130 deg E.,9807,26.0,127.3,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17816,Japan Plane Rectangular CS zone XVI,Japan zone XVI,,,Japan - Okinawa-ken west of 126 deg E.,9807,26.0,124.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17817,Japan Plane Rectangular CS zone XVII,Japan zone XVII,,,Japan - Okinawa-ken east of 130 deg E.,9807,26.0,131.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17818,Japan Plane Rectangular CS zone XVIII,Japan zone XVIII,,,Japan - Tokyo-to south of 28 N & west of 140 deg 30 min E.,9807,20.0,136.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+17819,Japan Plane Rectangular CS zone XIX,Japan zone XIX,,,Japan - Tokyo-to south of 28 N & east of 143 deg E.,9807,26.0,154.0,,,0.9999,0.0,0.0,9001,9110,8901,,,,,1998-12-12 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,Original transformation by Gauss-Kruger formula.,
+18011,Nord Algerie (ancienne),,,,Algeria north of 38.5g (34 deg 39 min) North.,9801,40.0,3.0,,,0.999625544,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Used with Voirol 1875 datum - now superseded.,
+18012,Sud Algerie (ancienne),,,,Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.,9801,37.0,3.0,,,0.999625769,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Used with Voirol 1875 datum - now superseded.,
+18021,Nord Algerie,,,,Algeria north of 38.5g (34 deg 39 min) North.,9801,40.0,3.0,,,0.999625544,500135.0,300090.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Use with Voirol Unifie 1960 datum.,
+18022,Sud Algerie,,,,Algeria 35g to 38.5g (31 deg 30 min to 34 deg 39 min) North.,9801,37.0,3.0,,,0.999625769,500135.0,300090.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,Use with Voirol Unifie 1960 datum.,
+18031,Argentina zone 1,Argentina 1,,,Argentina west of 70 deg 30 min West.,9807,-90.0,-72.0,,,1.0,1500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18032,Argentina zone 2,Argentina 2,,,Argentina between 70 deg 30 min and 67 deg 30 min West.,9807,-90.0,-69.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18033,Argentina zone 3,Argentina 3,,,Argentina between 67 deg 30 min and 64 deg 30 min West.,9807,-90.0,-66.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18034,Argentina zone 4,Argentina 4,,,Argentina between 64 deg 30 min and 61 deg 30 min West.,9807,-90.0,-63.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18035,Argentina zone 5,Argentina 5,,,Argentina between 61 deg 30 min and 58 deg 30 min West.,9807,-90.0,-60.0,,,1.0,5500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18036,Argentina zone 6,Argentina 6,,,Argentina between 58 deg 30 min and 55 deg 30 min West.,9807,-90.0,-57.0,,,1.0,6500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18037,Argentina zone 7,Argentina 7,,,Argentina east of 55 deg 30 min West.,9807,-90.0,-54.0,,,1.0,7500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18041,Austria West Zone,,,,Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).,9807,0.0,28.0,,,1.0,0.0,0.0,9001,9102,8909,,,,,1997-04-11 00:00:00,,EPSG,Superseded by M28 (EPSG code 18044).,95.30  96.29  97.01  98.48
+18042,Austria Central Zone,,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).,9807,0.0,31.0,,,1.0,0.0,0.0,9001,9102,8909,,,,,1997-04-11 00:00:00,,EPSG,Superseded by M31 (EPSG code 18045).,95.30  96.29  97.01  98.48
+18043,Austria East Zone,,,,Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).,9807,0.0,34.0,,,1.0,0.0,0.0,9001,9102,8909,,,,,1997-04-11 00:00:00,,EPSG,Superseded by M34 (EPSG code 18046).,95.30  96.29  97.01  98.48
+18044,Austria M28,M28,,,Austria west of 11deg 50min East of Greenwich (29deg 30min E of Ferro).,9807,0.0,10.2,,,1.0,150000.0,0.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,Supersedes Austria West zone (EPSG code 18041).,
+18045,Austria M31,M31,,,Austria between 11deg 50min and 14deg 50min East of Greenwich (29deg 30min and 32deg 30min East of Ferro).,9807,0.0,13.2,,,1.0,450000.0,0.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,Supersedes Austria Central zone (EPSG code 18042).,
+18046,Austria M34,M34,,,Austria east of 14deg 50min East of Greenwich (32deg 30min East of Ferro).,9807,0.0,16.2,,,1.0,750000.0,0.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,Supersedes Austria East zone (EPSG code 18043).,
+18051,Colombia West zone,Colombia 3W,,,Colombia west of 1 deg 30 min W of Bogota (75d 34m 51.30s W of Greenwich).,9807,4.355657,-77.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,"Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as \"6 west\".",95.30  96.29  97.11
+18052,Colombia Bogota zone,Colombia Bogota,,,Colombia 1 deg 30 min W to 1 deg 30 min E of Bogota (75d 35m W to 72d 35m W of Greenwich).,9807,4.355657,-74.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30  96.29  97.11
+18053,Colombia East Central zone,Colombia 3E,,,Colombia 1 deg 30 min to 4 deg 30 min E of Bogota (72d 35m to 69d 34m W of Greenwich).,9807,4.355657,-71.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,"Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as \"3 east\".",95.30  96.29  97.11
+18054,Colombia East zone,Colombia 6E,,,Colombia east of 4 deg 30 min E of Bogota (69d 34m 51.3s W of Greenwich).,9807,4.355657,-68.04513,,,1.0,1000000.0,1000000.0,9001,9110,8901,,,,,1997-04-11 00:00:00,,EPSG,"Original transformation by Gauss-Kruger formula.  Zone name sometimes referred to as \"6 east\".",95.30  96.29  97.11
+18061,Cuba Norte,,,,Cuba,9801,22.21,-81.0,,,0.99993602,500000.0,280296.016,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18062,Cuba Sur,,,,Cuba,9801,20.43,-76.5,,,0.99994848,500000.0,229126.939,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18071,Egypt Blue Belt,Blue Belt,,,Egypt  - Sinai peninsula.,9807,30.0,35.0,,,1.0,300000.0,1100000.0,9001,9102,8901,,,,,1999-04-22 00:00:00,,EPSG,Also known as Green Belt.,
+18072,Egypt Red Belt,Red Belt,,,Egypt  east of 29 deg East.,9807,30.0,31.0,,,1.0,615000.0,810000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18073,Egypt Purple Belt,Purple Belt,,,Egypt  west of 29 deg East; north of approx 28 deg 11 min North.,9807,30.0,27.0,,,1.0,700000.0,200000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18074,Egypt Extended Purple Belt,Extended Purple Belt,,,Egypt  west of 29 deg East; south of approx 28 deg 11 min North.,9807,30.0,27.0,,,1.0,700000.0,1200000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18081,France I,,,,France north of 53.5 grads (48 deg 09 min) North.,9801,55.0,0.0,,,0.999877341,600000.0,1200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18091.,95.26
+18082,France II,,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,9801,52.0,0.0,,,0.99987742,600000.0,2200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18092.,95.26
+18083,France III,,,,France south of 50.5 grads (45 deg 27 min) North.,9801,49.0,0.0,,,0.999877499,600000.0,3200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18093.,95.26
+18084,France IV,,,,France - Corsica.,9801,46.85,0.0,,,0.99994471,234.358,4185861.369,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Introduced 1972. See 18094.,
+18091,Nord France,,,,France north of 53.5 grads (48 deg 09 min) North.,9801,55.0,0.0,,,0.999877341,600000.0,200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18081 from 1972.,95.26
+18092,Centre France,,,,France 50.5 to 53.5 grads (45 deg 27 min to 48 deg 09 min) North.,9801,52.0,0.0,,,0.99987742,600000.0,200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18082 from 1972.,95.26
+18093,Sud France,,,,France south of 50.5 grads (45 deg 27 min) North.,9801,49.0,0.0,,,0.999877499,600000.0,200000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18083 from 1972.,95.26
+18094,Corse,,,,France - Corsica.,9801,46.85,0.0,,,0.99994471,234.358,185861.369,9001,9105,8903,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,Superseded by 18084 from 1972.,
+18101,Germany zone 1,,,,Germany - onshore west of 4 deg 30 min East.,9807,0.0,3.0,,,1.0,1500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18102,Germany zone 2,,,,Germany - onshore between 4 deg 30 min and 7 deg 30 min East.,9807,0.0,6.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18103,Germany zone 3,,,,Germany - onshore between 7 deg 30 min and 10 deg 30 min East.,9807,0.0,9.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18104,Germany zone 4,,,,Germany - onshore between 10 deg 30 min and 13 deg 30 min East.,9807,0.0,12.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18105,Germany zone 5,,,,Germany - onshore between 13 deg 30 min and 16 deg 30 min East.,9807,0.0,15.0,,,1.0,5500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula,95.30
+18110,India zone 0,,,,Pakistan north of 35 deg 35 min North.,9801,39.3,68.0,,,0.99846154,2355500.0,2590000.0,9084,9110,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.30  96.01  96.02  96.29  97.23
+18111,India zone I,,,,India north of 28 deg North. Pakistan 28 deg to 35 deg 35 min North.,9801,32.3,68.0,,,0.99878641,3000000.0,1000000.0,9084,9110,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.30  96.02  96.29  97.23
+18112,India zone IIa,,,,India - between 21 deg and 28 deg North and  west of 82 deg East; Pakistan - south of 28 deg North.,9801,26.0,74.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28  96.02  97.23
+18113,India zone IIb,India zone II b,,,Bangladesh; India - north of 21 deg North and east of 82 deg East; Myanmar (Burma) - north of 21 deg North.,9801,26.0,90.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28  96.02  97.23
+18114,India zone IIIa,India zone IIIa,,,India - between 15 deg and 21 deg North.,9801,19.0,80.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28  96.02  97.23
+18115,India zone IIIb,,,,Myanmar (Burma) - between 15 deg and 21 deg North.,9801,19.0,100.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28  96.02  97.23
+18116,India zone IVa,India zone Iva,,,India - south of 15 deg North.,9801,12.0,80.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28  96.02  97.23
+18117,India zone IVb,,,,Myanmar - south of 15 deg North.,9801,12.0,100.0,,,0.99878641,3000000.0,1000000.0,9084,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,95.28  96.02  97.23
+18121,Italy zone 1,,,,Italy west of 12 deg East (of Greenwich).,9807,0.0,9.0,,,0.9996,1500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Boaga formula,
+18122,Italy zone 2,,,,Italy east of 12 deg East (of Greenwich).,9807,0.0,15.0,,,0.9996,2520000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Original transformation by Gauss-Boaga formula,
+18131,Nord Maroc,,,,Morocco north of 35 grads (31 deg 30 min) North.,9801,37.0,-6.0,,,0.999625769,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,IGN Paris.,EPSG,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,99.203
+18132,Sud Maroc,,,,Morocco 31gr to 35gr  (27 deg 54 min to 31 deg 30 min) North.,9801,33.0,-6.0,,,0.999615596,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,A projection with the same parameter values used the Lambert Conic Near-Conformal method (EPSG code 9817) prior to 1953.,99.203
+18133,Sahara,,,,Morocco south of 31gr  (27 deg 54 min) North.,9801,29.0,-6.0,,,0.9996,1200000.0,400000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,IGN Paris,EPSG,Created in 1977 to cover Sahara Marocain (ex Spanish Sahara),
+18141,New Zealand North Island National Grid,North Island Grid,,,New Zealand - North Island.,9807,-39.0,175.3,,,1.0,300000.0,400000.0,9040,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,Superseded by New Zealand Map Grid.,95.30  96.29  97.231
+18142,New Zealand South Island National Grid,South Island Grid,,,New Zealand - South Island.,9807,-44.0,171.3,,,1.0,500000.0,500000.0,9040,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,Superseded by New Zealand Map Grid.,95.30  96.29  97.231
+18151,Nigeria West Belt,,,,Nigeria west of 6 deg 30 min East.,9807,4.0,4.3,,,0.99975,230738.26,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18152,Nigeria Mid Belt,,,,Nigeria between 6 deg 30 min and 10 deg 30 min East.,9807,4.0,8.3,,,0.99975,670553.98,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18153,Nigeria East Belt,,,,Nigeria east of 10 deg 30 min East.,9807,4.0,12.3,,,0.99975,1110369.7,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18161,Peru west zone,,,,Peru west of 79 deg West.,9807,-6.0,-80.3,,,0.99983008,222000.0,1426834.743,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18162,Peru central zone,,,,Peru 79 to 73 deg West.,9807,-9.3,-76.0,,,0.99932994,720000.0,1039979.159,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18163,Peru east zone,,,,Peru east of 73 deg West.,9807,-9.3,-70.3,,,0.99952992,1324000.0,1040084.558,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+18171,Philippines zone  I,,,,Philippines - west of 118 deg East.,9807,0.0,117.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18172,Philippines zone  II,,,,Philippines - Palawan; Calamian Islands.,9807,0.0,119.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18173,Philippines zone  III,,,,Philippines - Luzon (except SE part); Mindoro.,9807,0.0,121.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18174,Philippines zone  IV,,,,Philippines - SE Luzon; Tablas; Masbate; Panay; Cebu; Negros; W. Mindanao.,9807,0.0,123.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18175,Philippines zone  V,,,,Philippines - E. Mindanao; Bohol; Samar.,9807,0.0,125.0,,,0.99995,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+18181,Nord Tunisie,,,,Tunisia north of 38.5 grads (34 deg 39 min) North.,9801,40.0,11.0,,,0.999625544,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,,95.30
+18182,Sud Tunisie,,,,Tunisia south of 38.5 grads (34 deg 39 min) North.,9801,37.0,11.0,,,0.999625769,500000.0,300000.0,9001,9105,8901,,,,,1996-09-12 00:00:00,,EPSG,,
+18191,Finland zone 1,,,,Finland - west of 22deg 30min E.,9807,0.0,21.0,,,1.0,1500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+18192,Finland zone 2,,,,Finland - 22deg 30 min to 25deg 30min E.,9807,0.0,24.0,,,1.0,2500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+18193,Finland Uniform Coordinate System,Finland zone 3,,,Finland; Finland - 25 deg 30min E to 28deg 30min E.,9807,0.0,27.0,,,1.0,3500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,Used by Uniform Coordinate System over all country and also by zone 3 of Basic Coordinate System at larger scales.,
+18194,Finland zone 4,,,,Finland - east of 28deg 30 min E.,9807,0.0,30.0,,,1.0,4500000.0,0.0,9001,9102,8901,,,,,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,,
+18201,Palestine Grid,,,,Israel;  Jordan,9806,31.4402749,35.124349,,,,170251.555,126867.909,9001,9110,8901,,,,,1999-04-22 00:00:00,,EPSG,Also encountered as a Transverse Mercator projection with scale factor of 1.  The difference in conversion caused by the change of formula does not exceed 2m within Israel.  Within the State of Israel superseded by the Israeli CS Grid (EPSG code 18203).,
+18202,Palestine Belt,,,,Israel;  Jordan,9807,31.4402749,35.124349,,,1.0,170251.555,1126867.909,9001,9110,8901,,,,,1999-04-22 00:00:00,,EPSG,"Originally constructed as the Palestine Grid - EPSG code 18201. Adopted by the US Army Map Service as \"Palestine Belt\" with change of projection method and false northing (FN). Sometimes seen with unchanged FN of 126867.909.",
+18203,Israeli CS,ICS,,,Israel,9806,31.4402749,35.124349,,,,170251.555,1126867.909,9001,9110,8901,,,,,1999-10-20 00:00:00,Survey of Israel   ftp://ftp.rd.soi.gov.il/doc,EPSG,,
+18204,Israeli TM,ITM,,,Israel,9807,31.4403817,35.1216261,,,1.0000067,219529.584,626907.39,9001,9110,8901,,,,,1999-10-20 00:00:00,Survey of Israel   ftp://ftp.rd.soi.gov.il/doc,EPSG,Designed to approximate Israeli CS grid in north-central Israel.,
+18211,Guatemala Norte,,,,Guatemala north of 15 deg 50 min North.,9801,16.49,-90.2,,,0.99992226,500000.0,292209.579,9001,9110,8901,,,,,1999-08-16 00:00:00,,EPSG,,
+18212,Guatemala Sud,,,,Guatemala south of 15 deg 50 min North.,9801,14.54,-90.2,,,0.99989906,500000.0,325992.681,9001,9110,8901,,,,,1999-08-16 00:00:00,,EPSG,,
+18221,NGO zone I,,,,Norway - west of 3deg 30min W of Oslo (7deg 13min 22.5sec E of Greenwich).,9807,58.0,-4.4,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18222,NGO zone II,,,,Norway - between 3deg 30min W and 1deg 10min W of Oslo (7deg 13min 22.5sec E  and 9deg 33min 22.5sec E of Greenwich).,9807,58.0,-2.2,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18223,NGO zone III,,,,Norway - between 1deg 10min W and 1deg 15min E of Oslo (9deg 33min 22.5sec E and 11deg 58min 22.5sec E of Greenwich).,9807,58.0,0.0,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18224,NGO zone IV,,,,Norway - between 1deg 15min E and 4deg 20min E of Oslo (11deg 58min 22.5sec E and 15deg 03min 22.5sec E of Greenwich).,9807,58.0,2.3,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18225,NGO zone V,,,,Norway - between 4deg 20min E and 8deg 10min E of Oslo (15deg 03min 22.5sec E and 18deg 53min 22.5sec E of Greenwich).,9807,58.0,6.1,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18226,NGO zone VI,,,,Norway - between 8deg 10min E and 12deg 10min E of Oslo (18deg 53min 22.5sec E and 22deg 53min 22.5sec E of Greenwich).,9807,58.0,10.1,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18227,NGO zone VII,,,,Norway - between 12deg 10min E and 16deg 15min E of Oslo (22deg 53min 22.5sec E and 26deg 58min 22.5sec E of Greenwich).,9807,58.0,14.1,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18228,NGO zone VIII,,,,Norway - east of 16deg 15min E of Oslo (26deg 58min 22.5sec E of Greenwich).,9807,58.0,18.2,,,1.0,0.0,0.0,9001,9110,8913,,,,,1999-10-20 00:00:00,"J. Danielsen; \"Transformasjoner ved Norges Geografiske Oppm�ling\"; Kart Og Plan nr 1; 1982.",EPSG,,
+18231,India zone I (1975 metres),India zone I,,,India north of 28 deg North.,9801,32.3,68.0,,,0.99878641,2743185.69,914395.23,9001,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18232,India zone IIa (1975 metres),India zone II a,,,India - between 21 deg and 28 deg North and  west of 82 deg East.,9801,26.0,74.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18233,India zone IIIa (1975 metres),India zone IIIa,,,India - between 15 deg and 21 deg North.,9801,19.0,80.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18234,India zone IVa (1975 metres),India zone IV a,,,India - south of 15 deg North.,9801,12.0,80.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18235,India zone IIb (1975 metres),India zone II b,,,India - north of 21 deg North and east of 82 deg East.,9801,26.0,90.0,,,0.99878641,2743185.69,914395.23,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18236,India zone I (1962 metres),India zone I,,,Pakistan - north of 28 deg North.,9801,32.3,68.0,,,0.99878641,2743196.4,914398.8,9001,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18237,India zone IIa (1962 metres),India zone II a,,,Pakistan - south of 28 deg North.,9801,26.0,74.0,,,0.99878641,2743196.4,914398.8,9001,9102,8901,,,,,1999-10-20 00:00:00,,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+18238,India zone IIb (1937 metres),India zone II b,,,Bangladesh.,9801,26.0,90.0,,,0.99878641,2743195.5,914398.5,9001,9102,8901,,,,,1999-10-20 00:00:00,US Army Map Service projection tables; 1943.,EPSG,BEWARE !  Different yard to metre conversion values have been used in different parts of south Asia. Some areas have changed conversion value with time.,
+19900,Bahrain State Grid,Bahrain Grid,,,Bahrain.,9807,0.0,51.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+19901,Belge Lambert 50,,,,Belgium - onshore.,9802,90.0,0.0,49.5,51.1,,150000.0,5400000.0,9001,9110,8910,,,,,1999-04-22 00:00:00,"\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels",EPSG,,95.30  96.29  99.28
+19902,Belge Lambert 72,,,,Belgium - onshore.,9803,90.0,4.2124983,49.5,51.1,,150000.01256,5400088.4378,9001,9110,8901,,,,,1999-04-22 00:00:00,"\"Systemes de reference et formules de transformation en usage en Belgique\"; IGN Brussels",EPSG,Rotation from Belge Lambert 50 to Belge Lambert 72 is +29.2985sec.,95.30  96.29  99.28
+19903,Nord de Guerre,,,,France - Alsace.,9801,55.0,6.0,,,0.99950908,500000.0,300000.0,9001,9105,8903,,,,,1996-09-12 00:00:00,,EPSG,,
+19904,Ghana Metre Grid,,,,Ghana.,9807,4.4,-1.0,,,0.99975,274319.51,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+19905,Netherlands East Indies Equatorial Zone,NEIEZ,,,Indonesia.,9804,0.0,110.0,,,0.997,3900000.0,900000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,US Army Map Service projection tables; 1943.,EPSG,,95.30
+19906,Iraq zone,,,,Iran -south of 36 deg North; Iraq;  Kuwait.,9801,32.3,45.0,,,0.99878640776699,1500000.0,1166200.0,9001,9110,8901,,,,,1996-04-12 00:00:00,US Army Map Service projection tables; 1943.,EPSG,,95.30  96.29
+19907,Iraq National Grid,,,,Iraq.,9807,29.0134566,46.3,,,0.9994,800000.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+19908,Irish National Grid,,,,Ireland - onshore.  United Kingdom (UK) - Northern Ireland onshore.,9807,53.3,-8.0,,,1.000035,200000.0,250000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+19909,Jamaica (Old Grid),,,,Jamaica.,9801,18.0,-77.0,,,1.0,550000.0,400000.0,9005,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Superseded by Jamaica (New Grid).,95.28
+19910,Jamaica National Grid,,,,Jamaica.,9801,18.0,-77.0,,,1.0,250000.0,150000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,Supersedes Jamaica (Old Grid).,95.28
+19911,Laborde Grid,,,,Madagascar.,9815,-21.0,49.0,21.0,21.0,0.9995,400000.0,800000.0,9001,9105,8903,,,,,1997-11-13 00:00:00,,EPSG,Can also use transformation method 9813.,97.613
+19912,Rectified Skew Orthomorphic Borneo Grid,R.S.O. Borneo,,,Brunei;  Malaysia - East Malaysia (Sabah; Sarawak).,9812,4.0,115.0,53.18569537,53.07483685,0.99984,0.0,0.0,9042,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,,95.30  96.29  97.231
+19913,RD Old,,,,Netherlands - onshore.,9809,52.0922178,5.23155,,,0.9999079,0.0,0.0,9001,9110,8901,,,,,1995-12-02 00:00:00,Nederlandse Commissie voor Geodesie publication 30.,EPSG,,95.30  96.29
+19914,RD New,,,,Netherlands - onshore.,9809,52.0922178,5.23155,,,0.9999079,155000.0,463000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,Nederlandse Commissie voor Geodesie publication 30.,EPSG,,95.30  96.29
+19915,Aden Zone,,,,Yemen.,9801,15.0,45.0,,,0.999365678,1500000.0,1000000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,US Army Map Service projection tables; 1943.,EPSG,,95.28
+19916,British National Grid,,,,United Kingdom (UK) - onshore England; Scotland; Wales; Isle of Man.,9807,49.0,-2.0,,,0.999601272,400000.0,-100000.0,9001,9102,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30
+19917,New Zealand Map Grid,,,,New Zealand.,9811,-41.0,173.0,,,,2510000.0,6023150.0,9001,9102,8901,,,,,1995-12-02 00:00:00,Dept. of Lands and Surveys Technical Circular 1973/32; 23 Nov 1973.,EPSG,Supersedes North and South Island National Grids.,95.28
+19919,Qatar National Grid,,,,Qatar.,9807,24.27,51.13,,,0.99999,200000.0,300000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+19920,Singapore Grid,,,,Singapore.,9806,1.1715528,103.5110808,,,,30000.0,30000.0,9001,9110,8901,,,,,1995-12-02 00:00:00,,EPSG,,95.30  96.29
+19921,Spain,,,,Spain.,9801,40.0,0.0,,,0.9988085293,600000.0,600000.0,9001,9102,8905,,,,,1995-12-02 00:00:00,,EPSG,Superseded by UTM,95.28
+19922,Swiss New Grid,LV03,,,Liechtenstein;  Switzerland.,9815,46.570866,7.26225,90.0,90.0,1.0,600000.0,200000.0,9001,9110,8901,,,,,1997-11-13 00:00:00,"\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967",EPSG,,95.30  96.29  97.27  97.612  97.62
+19923,Swiss Old Grid,LV03C,,,Liechtenstein;  Switzerland.,9815,46.570866,0.0,90.0,90.0,1.0,0.0,0.0,9001,9110,8907,,,,,1997-11-13 00:00:00,"\"Die Projektionen der schweizerischen Plan- und Kartenwerke\"; J. Bolliger 1967",EPSG,Superseded by LV03 (19922).,95.30  96.29  97.612  97.62
+19924,Tobago Grid,,,,Trinidad and Tobago - Tobago.,9806,11.1507843,-60.4109632,,,,187500.0,180000.0,9039,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,,95.30  96.29  97.231
+19925,Trinidad Grid,,,,Trinidad and Tobago - Trinidad.,9806,10.263,-61.2,,,,430000.0,325000.0,9039,9110,8901,,,,,1999-10-20 00:00:00,,EPSG,,95.30  96.29  97.231
+19926,Stereo 70,,,,Romania.,9809,46.0,25.0,,,0.99975,500000.0,500000.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,Supersedes Stereo 33 (code 19927).,
+19927,Stereo 33,,,,Romania.,9809,45.54,25.23328772,,,0.9996667,500000.0,500000.0,9001,9110,8901,,,,,1996-04-12 00:00:00,,EPSG,Superseded by Stereo 70 (code 19926),96.29
+19928,Kuwait TM,KTM,,,Kuwait - Kuwait City.,9807,0.0,48.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1996-04-12 00:00:00,,EPSG,,
+19929,Swedish National Projection,2.5 gon West,,,Sweden.,9807,0.0,15.48298,,,1.0,1500000.0,0.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Lantmateriet of Sweden; private communication.,EPSG,"Used since 1938 superseding 6 old zones.  Longitude of natural origin is 2.5 gon west of Stockholm prime meridian; transformation is also known as \"2.5 gon West of old Stockholm observatory\".",96.29  97.39
+19930,Greek Grid,,,,Greece,9807,0.0,24.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,Created for use with GGRS87.,
+19931,Egyseges Orszagos Vetuleti,EOV,,,Hungary,9815,47.08398174,19.02548584,90.0,90.0,0.99993,650000.0,200000.0,9001,9110,8901,,,,,1997-07-22 00:00:00,http://lazarus.elte.hu/gb/geodez/geod2.htm,EPSG,EOV = Uniform National Projection,
+19933,Prince Edward Island Stereographic,PEI Stereographic,,,Canada - Prince Edward Island,9809,47.15,-63.0,,,0.999912,700000.0,400000.0,9001,9110,8901,,,,,1997-11-13 00:00:00,Geomatics Centre; Nova Scotia Ministry of Housing and Municipal Affairs.,EPSG,In use from 1979.  To be phased out in late 1990's.,
+19934,Lithuania 1994,,,,Lithuania,9807,0.0,24.0,,,0.9998,500000.0,0.0,9001,9102,8901,,,,,1998-03-12 00:00:00,HNIT-BALTIC GeoInfoServisas,EPSG,,
+19935,Rectified Skew Orthomorphic Malaya Grid,R.S.O. Malaya,,,Malaysia - West Malaysia,9812,4.0,102.15,323.01328458,323.07483685,0.99984,40000.0,0.0,9062,9110,8901,,,,,1999-10-20 00:00:00,UK Directorate of Overseas Surveys paper,EPSG,,97.231
+19936,Portuguese National Grid,,,,Portugal onshore.,9807,39.4,1.0,,,1.0,200000.0,300000.0,9001,9110,8902,,,,,1998-11-11 00:00:00,,EPSG,Original transformation by Gauss-Kruger formula.,95.30  96.29  98.42
+19937,Tunisia Mining Grid,,,,Tunisia - onshore,9816,38.81973,7.83445,,,,270.0,582.0,9036,9105,8903,,,,,1999-11-15 00:00:00,Mining decree of 1st January 1953,EPSG,Origin: Djebel Kebar,99.81
+19938,Estonian National Grid,,,,Estonia,9802,57.310319415,24.0,59.2,58.0,,500000.0,6375000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,Coordinates at the projection origin match those of TM Baltic 93.,99.28
+19939,TM Baltic 93,,,,Estonia; Latvia; Lithuania.,9807,0.0,24.0,,,0.9996,500000.0,0.0,9001,9102,8901,,,,,1998-12-14 00:00:00,http://www.geo.ut.ee/~raivo/estcoord.html,EPSG,,
+19940,Levant Zone,,,,Syrian Arab Republic west of 39 deg E.,9817,34.39,37.21,,,0.9996256,300000.0,300000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,US Army Map Service projection tables; 1943.,EPSG,Superseded by projection using full Lambert formula from 1973. (EPSG code 19948).,
+19941,Brazil Polyconic,,,,Brazil,9818,0.0,-54.0,,,,5000000.0,10000000.0,9001,9102,8901,,,,,1999-10-20 00:00:00,PetroBras,EPSG,,99.55
+19942,British West Indies Grid,,,,Windward Islands - Dominica  Grenada  Saint Lucia  Saint Vincent;  Leeward Islands - Anguilla   Antigua (excluding Barbuda)  Montserrat   Saint Kitts and Nevis; Barbados.,9807,0.0,-62.0,,,0.9995,400000.0,0.0,9001,9102,8901,,,,,1999-04-22 00:00:00,"UK Royal Engineers projection tables P10/25, 1943.",EPSG,,
+19943,Barbados National Grid,,,,Barbados,9807,13.1035,-59.3335,,,0.9999986,30000.0,75000.0,9001,9110,8901,,,,,1999-04-22 00:00:00,Ordnance Survey of Great Britain,EPSG,Superseded British West Indies Grid (19942) after 1983.,
+19944,Quebec Lambert Projection,,,,Canada - Quebec,9802,44.0,-68.3,60.0,46.0,,0.0,0.0,9001,9110,8901,,,,,1999-10-22 00:00:00,Service de la Cartographie; Minist�re des Ressources Naturelles; Quebec,EPSG,,
+19945,New Brunswick Stereographic (ATS77),NB Stereographic ATS77,,,Canada - New Brunswick - onshore,9809,46.3,-66.3,,,0.999912,300000.0,800000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1979.  To be phased out in late 1990's.,99.61
+19946,New Brunswick Stereographic (NAD83),NB Stereographic NAD83,,,Canada - New Brunswick - onshore,9809,46.3,-66.3,,,0.999912,2500000.0,7500000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,New Brunswick Geographic Information Corporation land and water information standards manual.,EPSG,In use from 1999.,
+19947,Austria Lambert,,,,Austria,9802,13.2,47.3,49.0,46.0,,400000.0,400000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Eich- und Vermessungswesen,EPSG,,
+19948,Syria Lambert,,,,Syrian Arab Republic,9801,34.39,37.21,,,0.9996256,300000.0,300000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,Superseded Levant zone (same parameters but using truncated near-conformal method) from 1973.,
+19949,Levant Stereographic,,,,Lebanon,9809,38.0,43.5,,,0.9995341,0.0,0.0,9001,9105,8901,,,,,1999-10-20 00:00:00,IGN Paris,EPSG,Used prior to World War II for cadastral and large scale topographic mapping.,
+19950,Landesvermessung 1995,LV95,,,Liechtenstein;  Switzerland.,9815,46.570866,7.26225,90.0,90.0,1.0,2600000.0,1200000.0,9001,9110,8901,,,,,1999-10-20 00:00:00,Bundesamt f�r Landestopographie.  Aufbau der Landesvermessung der Schweiz 'LV95' Teil 3: Terrestrische Bezugssysteme und Bezugsrahmen. L+T 1999.,EPSG,,
+19951,Nakhl e Taqi Oblique Mercator,Nakhl e Taqi,,,Iran - Taheri refinery site only.,9815,27.31077837,52.3612741,0.34179803,0.34179803,0.999895934,658377.437,3044969.194,9001,9110,8901,,,,,1999-10-20 00:00:00,Total-Fina,EPSG,Used only for terminal site.,
diff --git a/src/tiff/csv/trf_path.c b/src/tiff/csv/trf_path.c
new file mode 100644
index 0000000..0c38f03
--- /dev/null
+++ b/src/tiff/csv/trf_path.c
@@ -0,0 +1,568 @@
+#include "defs.h"
+datafile_rows_t trf_path_row_1[] = {"TRF_PATH_CODE","TRF_STEP_CODE","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","POLYN_TRF_CODE","NONPOLYN_TRF_CODE","CHANGE_ID",NULL};
+datafile_rows_t trf_path_row_2[] = {"8400","1","4201","4326","","1100","",NULL};
+datafile_rows_t trf_path_row_3[] = {"8401","1","4201","4326","","1101","",NULL};
+datafile_rows_t trf_path_row_4[] = {"8402","1","4201","4326","","1102","",NULL};
+datafile_rows_t trf_path_row_5[] = {"8403","1","4201","4326","","1103","",NULL};
+datafile_rows_t trf_path_row_6[] = {"8404","1","4201","4326","","1104","",NULL};
+datafile_rows_t trf_path_row_7[] = {"8405","1","4201","4326","","1105","",NULL};
+datafile_rows_t trf_path_row_8[] = {"8406","1","4201","4326","","1106","",NULL};
+datafile_rows_t trf_path_row_9[] = {"8407","1","4205","4326","","1107","",NULL};
+datafile_rows_t trf_path_row_10[] = {"8408","1","4202","4326","","1108","",NULL};
+datafile_rows_t trf_path_row_11[] = {"8409","1","4203","4326","","1109","",NULL};
+datafile_rows_t trf_path_row_12[] = {"8410","1","4204","4326","","1110","",NULL};
+datafile_rows_t trf_path_row_13[] = {"8411","1","4204","4326","","1111","",NULL};
+datafile_rows_t trf_path_row_14[] = {"8412","1","4289","4326","","1112","",NULL};
+datafile_rows_t trf_path_row_15[] = {"8413","1","4209","4326","","1113","",NULL};
+datafile_rows_t trf_path_row_16[] = {"8414","1","4209","4326","","1114","",NULL};
+datafile_rows_t trf_path_row_17[] = {"8415","1","4209","4326","","1115","",NULL};
+datafile_rows_t trf_path_row_18[] = {"8416","1","4209","4326","","1116","",NULL};
+datafile_rows_t trf_path_row_19[] = {"8417","1","4209","4326","","1117","",NULL};
+datafile_rows_t trf_path_row_20[] = {"8418","1","4209","4326","","1118","",NULL};
+datafile_rows_t trf_path_row_21[] = {"8419","1","4209","4326","","1119","",NULL};
+datafile_rows_t trf_path_row_22[] = {"8420","1","4209","4326","","1120","",NULL};
+datafile_rows_t trf_path_row_23[] = {"8421","1","4209","4326","","1121","",NULL};
+datafile_rows_t trf_path_row_24[] = {"8422","1","4210","4326","","1122","",NULL};
+datafile_rows_t trf_path_row_25[] = {"8423","1","4211","4326","","1123","",NULL};
+datafile_rows_t trf_path_row_26[] = {"8424","1","4216","4326","","1124","",NULL};
+datafile_rows_t trf_path_row_27[] = {"8425","1","4218","4326","","1125","",NULL};
+datafile_rows_t trf_path_row_28[] = {"8426","1","4219","4326","","1126","",NULL};
+datafile_rows_t trf_path_row_29[] = {"8427","1","4221","4326","","1127","",NULL};
+datafile_rows_t trf_path_row_30[] = {"8428","1","4222","4326","","1128","",NULL};
+datafile_rows_t trf_path_row_31[] = {"8429","1","4222","4326","","1129","",NULL};
+datafile_rows_t trf_path_row_32[] = {"8430","1","4223","4326","","1130","",NULL};
+datafile_rows_t trf_path_row_33[] = {"8431","1","4224","4326","","1131","",NULL};
+datafile_rows_t trf_path_row_34[] = {"8432","1","4225","4326","","1132","",NULL};
+datafile_rows_t trf_path_row_35[] = {"8433","1","4230","4326","","1133","",NULL};
+datafile_rows_t trf_path_row_36[] = {"8434","1","4230","4326","","1134","",NULL};
+datafile_rows_t trf_path_row_37[] = {"8435","1","4230","4326","","1135","",NULL};
+datafile_rows_t trf_path_row_38[] = {"8436","1","4230","4326","","1136","",NULL};
+datafile_rows_t trf_path_row_39[] = {"8437","1","4230","4326","","1137","",NULL};
+datafile_rows_t trf_path_row_40[] = {"8438","1","4230","4326","","1138","",NULL};
+datafile_rows_t trf_path_row_41[] = {"8439","1","4230","4326","","1139","",NULL};
+datafile_rows_t trf_path_row_42[] = {"8440","1","4230","4326","","1140","",NULL};
+datafile_rows_t trf_path_row_43[] = {"8441","1","4230","4326","","1141","",NULL};
+datafile_rows_t trf_path_row_44[] = {"8442","1","4230","4326","","1142","",NULL};
+datafile_rows_t trf_path_row_45[] = {"8443","1","4230","4326","","1143","",NULL};
+datafile_rows_t trf_path_row_46[] = {"8444","1","4230","4326","","1144","",NULL};
+datafile_rows_t trf_path_row_47[] = {"8445","1","4230","4326","","1145","",NULL};
+datafile_rows_t trf_path_row_48[] = {"8446","1","4230","4231","1000","","",NULL};
+datafile_rows_t trf_path_row_49[] = {"8446","2","4231","4326","","1146","",NULL};
+datafile_rows_t trf_path_row_50[] = {"8447","1","4230","4231","","1147","",NULL};
+datafile_rows_t trf_path_row_51[] = {"8447","2","4231","4326","","1146","",NULL};
+datafile_rows_t trf_path_row_52[] = {"8448","1","4229","4326","","1148","",NULL};
+datafile_rows_t trf_path_row_53[] = {"8449","1","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_54[] = {"8450","1","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_55[] = {"8451","1","4272","4326","","1151","",NULL};
+datafile_rows_t trf_path_row_56[] = {"8452","1","4236","4326","","1152","",NULL};
+datafile_rows_t trf_path_row_57[] = {"8453","1","4239","4326","","1153","",NULL};
+datafile_rows_t trf_path_row_58[] = {"8454","1","4240","4326","","1154","",NULL};
+datafile_rows_t trf_path_row_59[] = {"8455","1","4144","4326","","1155","97.235",NULL};
+datafile_rows_t trf_path_row_60[] = {"8456","1","4146","4326","","1156","97.235",NULL};
+datafile_rows_t trf_path_row_61[] = {"8457","1","4244","4326","","1157","",NULL};
+datafile_rows_t trf_path_row_62[] = {"8458","1","4245","4326","","1158","",NULL};
+datafile_rows_t trf_path_row_63[] = {"8459","1","4250","4326","","1159","",NULL};
+datafile_rows_t trf_path_row_64[] = {"8460","1","4251","4326","","1160","",NULL};
+datafile_rows_t trf_path_row_65[] = {"8461","1","4253","4326","","1161","",NULL};
+datafile_rows_t trf_path_row_66[] = {"8462","1","4253","4326","","1162","",NULL};
+datafile_rows_t trf_path_row_67[] = {"8463","1","4266","4326","","1163","",NULL};
+datafile_rows_t trf_path_row_68[] = {"8464","1","4256","4326","","1164","",NULL};
+datafile_rows_t trf_path_row_69[] = {"8465","1","4262","4326","","1165","",NULL};
+datafile_rows_t trf_path_row_70[] = {"8466","1","4261","4326","","1166","",NULL};
+datafile_rows_t trf_path_row_71[] = {"8467","1","4263","4326","","1167","",NULL};
+datafile_rows_t trf_path_row_72[] = {"8468","1","4263","4326","","1168","",NULL};
+datafile_rows_t trf_path_row_73[] = {"8469","1","4265","4326","","1169","",NULL};
+datafile_rows_t trf_path_row_74[] = {"8470","1","4267","4326","","1170","",NULL};
+datafile_rows_t trf_path_row_75[] = {"8471","1","4267","4326","","1171","",NULL};
+datafile_rows_t trf_path_row_76[] = {"8472","1","4267","4326","","1172","",NULL};
+datafile_rows_t trf_path_row_77[] = {"8473","1","4267","4326","","1173","",NULL};
+datafile_rows_t trf_path_row_78[] = {"8474","1","4267","4326","","1174","",NULL};
+datafile_rows_t trf_path_row_79[] = {"8475","1","4267","4326","","1175","",NULL};
+datafile_rows_t trf_path_row_80[] = {"8476","1","4267","4326","","1176","",NULL};
+datafile_rows_t trf_path_row_81[] = {"8477","1","4267","4326","","1177","",NULL};
+datafile_rows_t trf_path_row_82[] = {"8478","1","4267","4326","","1178","",NULL};
+datafile_rows_t trf_path_row_83[] = {"8479","1","4267","4326","","1179","",NULL};
+datafile_rows_t trf_path_row_84[] = {"8480","1","4267","4326","","1180","",NULL};
+datafile_rows_t trf_path_row_85[] = {"8481","1","4267","4326","","1181","",NULL};
+datafile_rows_t trf_path_row_86[] = {"8482","1","4267","4326","","1182","",NULL};
+datafile_rows_t trf_path_row_87[] = {"8483","1","4267","4326","","1183","",NULL};
+datafile_rows_t trf_path_row_88[] = {"8484","1","4267","4326","","1184","",NULL};
+datafile_rows_t trf_path_row_89[] = {"8485","1","4267","4326","","1185","",NULL};
+datafile_rows_t trf_path_row_90[] = {"8486","1","4267","4326","","1186","",NULL};
+datafile_rows_t trf_path_row_91[] = {"8487","1","4267","4326","","1187","",NULL};
+datafile_rows_t trf_path_row_92[] = {"8488","1","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_93[] = {"8489","1","4270","4326","","1189","",NULL};
+datafile_rows_t trf_path_row_94[] = {"8490","1","4270","4326","","1190","",NULL};
+datafile_rows_t trf_path_row_95[] = {"8491","1","4270","4326","","1191","",NULL};
+datafile_rows_t trf_path_row_96[] = {"8492","1","4271","4326","","1192","",NULL};
+datafile_rows_t trf_path_row_97[] = {"8493","1","4275","4326","","1193","",NULL};
+datafile_rows_t trf_path_row_98[] = {"8494","1","4807","4275","","1467","97.05",NULL};
+datafile_rows_t trf_path_row_99[] = {"8494","2","4275","4326","","1193","",NULL};
+datafile_rows_t trf_path_row_100[] = {"8495","1","4277","4326","","1195","",NULL};
+datafile_rows_t trf_path_row_101[] = {"8496","1","4277","4326","","1196","",NULL};
+datafile_rows_t trf_path_row_102[] = {"8497","1","4277","4326","","1197","",NULL};
+datafile_rows_t trf_path_row_103[] = {"8498","1","4277","4326","","1198","",NULL};
+datafile_rows_t trf_path_row_104[] = {"8499","1","4277","4326","","1199","",NULL};
+datafile_rows_t trf_path_row_105[] = {"8500","1","4282","4326","","1200","",NULL};
+datafile_rows_t trf_path_row_106[] = {"8501","1","4248","4326","","1201","",NULL};
+datafile_rows_t trf_path_row_107[] = {"8502","1","4248","4326","","1202","",NULL};
+datafile_rows_t trf_path_row_108[] = {"8503","1","4248","4326","","1203","",NULL};
+datafile_rows_t trf_path_row_109[] = {"8504","1","4248","4326","","1204","",NULL};
+datafile_rows_t trf_path_row_110[] = {"8505","1","4248","4326","","1205","",NULL};
+datafile_rows_t trf_path_row_111[] = {"8506","1","4248","4326","","1206","",NULL};
+datafile_rows_t trf_path_row_112[] = {"8507","1","4248","4326","","1207","",NULL};
+datafile_rows_t trf_path_row_113[] = {"8508","1","4248","4326","","1208","",NULL};
+datafile_rows_t trf_path_row_114[] = {"8509","1","4248","4326","","1209","",NULL};
+datafile_rows_t trf_path_row_115[] = {"8510","1","4285","4326","","1210","",NULL};
+datafile_rows_t trf_path_row_116[] = {"8511","1","4287","4326","","1211","",NULL};
+datafile_rows_t trf_path_row_117[] = {"8512","1","4291","4326","","1212","",NULL};
+datafile_rows_t trf_path_row_118[] = {"8513","1","4291","4326","","1213","",NULL};
+datafile_rows_t trf_path_row_119[] = {"8514","1","4291","4326","","1214","",NULL};
+datafile_rows_t trf_path_row_120[] = {"8515","1","4291","4326","","1215","",NULL};
+datafile_rows_t trf_path_row_121[] = {"8516","1","4291","4326","","1216","",NULL};
+datafile_rows_t trf_path_row_122[] = {"8517","1","4291","4326","","1217","",NULL};
+datafile_rows_t trf_path_row_123[] = {"8518","1","4291","4326","","1218","",NULL};
+datafile_rows_t trf_path_row_124[] = {"8519","1","4291","4326","","1219","",NULL};
+datafile_rows_t trf_path_row_125[] = {"8520","1","4291","4326","","1220","",NULL};
+datafile_rows_t trf_path_row_126[] = {"8521","1","4291","4326","","1221","",NULL};
+datafile_rows_t trf_path_row_127[] = {"8522","1","4291","4326","","1222","",NULL};
+datafile_rows_t trf_path_row_128[] = {"8523","1","4291","4326","","1223","",NULL};
+datafile_rows_t trf_path_row_129[] = {"8524","1","4291","4326","","1224","",NULL};
+datafile_rows_t trf_path_row_130[] = {"8525","1","4292","4326","","1225","",NULL};
+datafile_rows_t trf_path_row_131[] = {"8526","1","4293","4326","","1226","",NULL};
+datafile_rows_t trf_path_row_132[] = {"8527","1","4297","4326","","1227","",NULL};
+datafile_rows_t trf_path_row_133[] = {"8528","1","4298","4326","","1228","",NULL};
+datafile_rows_t trf_path_row_134[] = {"8529","1","4299","4326","","1229","",NULL};
+datafile_rows_t trf_path_row_135[] = {"8530","1","4301","4326","","1230","",NULL};
+datafile_rows_t trf_path_row_136[] = {"8531","1","4301","4326","","1231","",NULL};
+datafile_rows_t trf_path_row_137[] = {"8532","1","4301","4326","","1232","",NULL};
+datafile_rows_t trf_path_row_138[] = {"8533","1","4301","4326","","1233","",NULL};
+datafile_rows_t trf_path_row_139[] = {"8534","1","4309","4326","","1234","",NULL};
+datafile_rows_t trf_path_row_140[] = {"8535","1","4311","4326","","1235","",NULL};
+datafile_rows_t trf_path_row_141[] = {"8536","1","4230","4231","1000","","",NULL};
+datafile_rows_t trf_path_row_142[] = {"8537","1","4231","4326","","1146","",NULL};
+datafile_rows_t trf_path_row_143[] = {"8538","1","4230","4231","","1147","",NULL};
+datafile_rows_t trf_path_row_144[] = {"8539","1","4203","4326","","1236","",NULL};
+datafile_rows_t trf_path_row_145[] = {"8540","1","4322","4326","","1237","",NULL};
+datafile_rows_t trf_path_row_146[] = {"8541","1","4322","4326","","1238","",NULL};
+datafile_rows_t trf_path_row_147[] = {"8542","1","4324","4322","","1239","",NULL};
+datafile_rows_t trf_path_row_148[] = {"8543","1","4324","4326","","1240","",NULL};
+datafile_rows_t trf_path_row_149[] = {"8544","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_150[] = {"8546","1","4267","4269","","1243","",NULL};
+datafile_rows_t trf_path_row_151[] = {"8548","1","4230","4326","","1245","",NULL};
+datafile_rows_t trf_path_row_152[] = {"8549","1","4255","4326","","1246","",NULL};
+datafile_rows_t trf_path_row_153[] = {"8550","1","4145","4326","","1247","97.235",NULL};
+datafile_rows_t trf_path_row_154[] = {"8551","1","4238","4326","","1248","",NULL};
+datafile_rows_t trf_path_row_155[] = {"8552","1","4267","4326","","1249","",NULL};
+datafile_rows_t trf_path_row_156[] = {"8553","1","4267","4326","","1250","",NULL};
+datafile_rows_t trf_path_row_157[] = {"8554","1","4269","4326","","1251","",NULL};
+datafile_rows_t trf_path_row_158[] = {"8555","1","4269","4326","","1252","",NULL};
+datafile_rows_t trf_path_row_159[] = {"8556","1","4307","4326","","1253","",NULL};
+datafile_rows_t trf_path_row_160[] = {"8557","1","4284","4326","","1254","",NULL};
+datafile_rows_t trf_path_row_161[] = {"8558","1","4305","4326","","1255","",NULL};
+datafile_rows_t trf_path_row_162[] = {"8559","1","4232","4326","","1256","",NULL};
+datafile_rows_t trf_path_row_163[] = {"8560","1","4807","4275","","1467","99.63",NULL};
+datafile_rows_t trf_path_row_164[] = {"8561","1","4801","4217","","1257","",NULL};
+datafile_rows_t trf_path_row_165[] = {"8562","1","4802","4218","","1258","",NULL};
+datafile_rows_t trf_path_row_166[] = {"8563","1","4802","4218","","1258","",NULL};
+datafile_rows_t trf_path_row_167[] = {"8563","2","4218","4326","","1125","",NULL};
+datafile_rows_t trf_path_row_168[] = {"8564","1","4803","4207","","1259","",NULL};
+datafile_rows_t trf_path_row_169[] = {"8565","1","4804","4257","","1260","",NULL};
+datafile_rows_t trf_path_row_170[] = {"8566","1","4805","4312","","1261","",NULL};
+datafile_rows_t trf_path_row_171[] = {"8567","1","4806","4265","","1262","",NULL};
+datafile_rows_t trf_path_row_172[] = {"8568","1","4806","4265","","1262","",NULL};
+datafile_rows_t trf_path_row_173[] = {"8568","2","4265","4326","","1169","",NULL};
+datafile_rows_t trf_path_row_174[] = {"8569","1","4808","4280","","1263","",NULL};
+datafile_rows_t trf_path_row_175[] = {"8570","1","4809","4215","","1264","",NULL};
+datafile_rows_t trf_path_row_176[] = {"8571","1","4810","4297","","1265","",NULL};
+datafile_rows_t trf_path_row_177[] = {"8572","1","4810","4297","","1265","",NULL};
+datafile_rows_t trf_path_row_178[] = {"8572","2","4297","4326","","1227","",NULL};
+datafile_rows_t trf_path_row_179[] = {"8573","1","4811","4304","","1266","",NULL};
+datafile_rows_t trf_path_row_180[] = {"8574","1","4812","4305","","1267","",NULL};
+datafile_rows_t trf_path_row_181[] = {"8575","1","4812","4305","","1267","",NULL};
+datafile_rows_t trf_path_row_182[] = {"8575","2","4305","4326","","1255","",NULL};
+datafile_rows_t trf_path_row_183[] = {"8576","1","4813","4211","","1268","",NULL};
+datafile_rows_t trf_path_row_184[] = {"8577","1","4813","4211","","1268","",NULL};
+datafile_rows_t trf_path_row_185[] = {"8577","2","4211","4326","","1123","",NULL};
+datafile_rows_t trf_path_row_186[] = {"8578","1","4814","4308","","1269","98.51",NULL};
+datafile_rows_t trf_path_row_187[] = {"8579","1","4815","4120","","1270","",NULL};
+datafile_rows_t trf_path_row_188[] = {"8580","1","4293","4326","","1271","",NULL};
+datafile_rows_t trf_path_row_189[] = {"8581","1","4121","4326","","1272","",NULL};
+datafile_rows_t trf_path_row_190[] = {"8582","1","4237","4258","","1273","",NULL};
+datafile_rows_t trf_path_row_191[] = {"8583","1","4237","4258","","1273","",NULL};
+datafile_rows_t trf_path_row_192[] = {"8583","2","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_193[] = {"8584","1","4230","4326","","1275","",NULL};
+datafile_rows_t trf_path_row_194[] = {"8585","1","4275","4230","","1276","",NULL};
+datafile_rows_t trf_path_row_195[] = {"8586","1","4807","4275","","1467","",NULL};
+datafile_rows_t trf_path_row_196[] = {"8586","2","4275","4230","","1276","",NULL};
+datafile_rows_t trf_path_row_197[] = {"8587","1","4275","4322","","1277","",NULL};
+datafile_rows_t trf_path_row_198[] = {"8588","1","4807","4275","","1467","",NULL};
+datafile_rows_t trf_path_row_199[] = {"8588","2","4275","4322","","1277","",NULL};
+datafile_rows_t trf_path_row_200[] = {"8589","1","4202","4283","","1278","",NULL};
+datafile_rows_t trf_path_row_201[] = {"8590","1","4202","4283","","1278","",NULL};
+datafile_rows_t trf_path_row_202[] = {"8590","2","4283","4326","","1150","98.50",NULL};
+datafile_rows_t trf_path_row_203[] = {"8591","1","4203","4283","","1279","",NULL};
+datafile_rows_t trf_path_row_204[] = {"8592","1","4203","4283","","1279","",NULL};
+datafile_rows_t trf_path_row_205[] = {"8592","2","4283","4326","","1150","98.50",NULL};
+datafile_rows_t trf_path_row_206[] = {"8593","1","4203","4283","","1280","",NULL};
+datafile_rows_t trf_path_row_207[] = {"8594","1","4203","4283","","1280","",NULL};
+datafile_rows_t trf_path_row_208[] = {"8594","2","4283","4326","","1150","98.50",NULL};
+datafile_rows_t trf_path_row_209[] = {"8595","1","4124","4258","","1437","99.11",NULL};
+datafile_rows_t trf_path_row_210[] = {"8595","2","4258","4326","","1149","99.11",NULL};
+datafile_rows_t trf_path_row_211[] = {"8596","1","4125","4326","","1282","",NULL};
+datafile_rows_t trf_path_row_212[] = {"8597","1","4284","4126","","1274","",NULL};
+datafile_rows_t trf_path_row_213[] = {"8598","1","4126","4326","","1283","",NULL};
+datafile_rows_t trf_path_row_214[] = {"8599","1","4210","4326","","1284","",NULL};
+datafile_rows_t trf_path_row_215[] = {"8600","1","4210","4326","","1285","",NULL};
+datafile_rows_t trf_path_row_216[] = {"8601","1","4294","4326","","1286","",NULL};
+datafile_rows_t trf_path_row_217[] = {"8602","1","4284","4326","","1287","",NULL};
+datafile_rows_t trf_path_row_218[] = {"8603","1","4284","4326","","1288","",NULL};
+datafile_rows_t trf_path_row_219[] = {"8604","1","4284","4326","","1289","",NULL};
+datafile_rows_t trf_path_row_220[] = {"8605","1","4284","4326","","1290","",NULL};
+datafile_rows_t trf_path_row_221[] = {"8606","1","4284","4326","","1291","",NULL};
+datafile_rows_t trf_path_row_222[] = {"8607","1","4284","4326","","1292","",NULL};
+datafile_rows_t trf_path_row_223[] = {"8608","1","4284","4326","","1293","",NULL};
+datafile_rows_t trf_path_row_224[] = {"8609","1","4284","4126","","1274","",NULL};
+datafile_rows_t trf_path_row_225[] = {"8609","2","4126","4326","","1283","",NULL};
+datafile_rows_t trf_path_row_226[] = {"8610","1","4304","4326","","1294","",NULL};
+datafile_rows_t trf_path_row_227[] = {"8611","1","4811","4304","","1266","",NULL};
+datafile_rows_t trf_path_row_228[] = {"8611","2","4304","4326","","1294","",NULL};
+datafile_rows_t trf_path_row_229[] = {"8612","1","4271","4326","","1295","",NULL};
+datafile_rows_t trf_path_row_230[] = {"8613","1","4302","4326","","1296","",NULL};
+datafile_rows_t trf_path_row_231[] = {"8614","1","4127","4130","","1297","",NULL};
+datafile_rows_t trf_path_row_232[] = {"8615","1","4127","4130","","1297","",NULL};
+datafile_rows_t trf_path_row_233[] = {"8615","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_234[] = {"8616","1","4127","4130","","1298","",NULL};
+datafile_rows_t trf_path_row_235[] = {"8617","1","4127","4130","","1298","",NULL};
+datafile_rows_t trf_path_row_236[] = {"8617","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_237[] = {"8618","1","4127","4130","","1299","",NULL};
+datafile_rows_t trf_path_row_238[] = {"8619","1","4127","4130","","1299","",NULL};
+datafile_rows_t trf_path_row_239[] = {"8619","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_240[] = {"8620","1","4127","4130","","1300","",NULL};
+datafile_rows_t trf_path_row_241[] = {"8621","1","4127","4130","","1300","",NULL};
+datafile_rows_t trf_path_row_242[] = {"8621","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_243[] = {"8622","1","4127","4130","","1301","",NULL};
+datafile_rows_t trf_path_row_244[] = {"8623","1","4127","4130","","1301","",NULL};
+datafile_rows_t trf_path_row_245[] = {"8623","2","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_246[] = {"8624","1","4130","4326","","1302","",NULL};
+datafile_rows_t trf_path_row_247[] = {"8625","1","4284","4326","","1303","",NULL};
+datafile_rows_t trf_path_row_248[] = {"8626","1","4240","4326","","1304","",NULL};
+datafile_rows_t trf_path_row_249[] = {"8627","1","4301","4326","","1305","",NULL};
+datafile_rows_t trf_path_row_250[] = {"8628","1","4312","4326","","1306","",NULL};
+datafile_rows_t trf_path_row_251[] = {"8629","1","4271","4326","","1307","",NULL};
+datafile_rows_t trf_path_row_252[] = {"8633","1","4314","4258","","1309","",NULL};
+datafile_rows_t trf_path_row_253[] = {"8634","1","4314","4258","","1309","",NULL};
+datafile_rows_t trf_path_row_254[] = {"8634","2","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_255[] = {"8635","1","4284","4258","","1310","",NULL};
+datafile_rows_t trf_path_row_256[] = {"8636","1","4284","4258","","1310","",NULL};
+datafile_rows_t trf_path_row_257[] = {"8636","2","4258","4326","","1149","",NULL};
+datafile_rows_t trf_path_row_258[] = {"8637","1","4230","4326","","1311","",NULL};
+datafile_rows_t trf_path_row_259[] = {"8638","1","4903","4230","1001","","",NULL};
+datafile_rows_t trf_path_row_260[] = {"8639","1","4903","4230","1002","","",NULL};
+datafile_rows_t trf_path_row_261[] = {"8640","1","4903","4230","1003","","",NULL};
+datafile_rows_t trf_path_row_262[] = {"8641","1","4903","4230","1001","","",NULL};
+datafile_rows_t trf_path_row_263[] = {"8641","2","4230","4326","","1145","",NULL};
+datafile_rows_t trf_path_row_264[] = {"8642","1","4267","4269","","1312","",NULL};
+datafile_rows_t trf_path_row_265[] = {"8643","1","4267","4269","","1312","",NULL};
+datafile_rows_t trf_path_row_266[] = {"8643","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_267[] = {"8644","1","4267","4269","","1313","",NULL};
+datafile_rows_t trf_path_row_268[] = {"8645","1","4267","4269","","1313","",NULL};
+datafile_rows_t trf_path_row_269[] = {"8645","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_270[] = {"8646","1","4277","4326","","1314","",NULL};
+datafile_rows_t trf_path_row_271[] = {"8647","1","4277","4230","","1315","",NULL};
+datafile_rows_t trf_path_row_272[] = {"8648","1","4260","4326","","1316","",NULL};
+datafile_rows_t trf_path_row_273[] = {"8649","1","4220","4324","","1317","",NULL};
+datafile_rows_t trf_path_row_274[] = {"8650","1","4220","4326","","1318","",NULL};
+datafile_rows_t trf_path_row_275[] = {"8651","1","4220","4326","","1319","",NULL};
+datafile_rows_t trf_path_row_276[] = {"8652","1","4220","4326","","1320","",NULL};
+datafile_rows_t trf_path_row_277[] = {"8653","1","4220","4326","","1321","",NULL};
+datafile_rows_t trf_path_row_278[] = {"8654","1","4220","4326","","1322","",NULL};
+datafile_rows_t trf_path_row_279[] = {"8655","1","4220","4326","","1323","",NULL};
+datafile_rows_t trf_path_row_280[] = {"8656","1","4220","4326","","1324","",NULL};
+datafile_rows_t trf_path_row_281[] = {"8657","1","4220","4326","","1325","",NULL};
+datafile_rows_t trf_path_row_282[] = {"8658","1","4220","4326","","1326","",NULL};
+datafile_rows_t trf_path_row_283[] = {"8659","1","4220","4326","","1327","",NULL};
+datafile_rows_t trf_path_row_284[] = {"8660","1","4259","4264","","1328","",NULL};
+datafile_rows_t trf_path_row_285[] = {"8661","1","4264","4326","","1329","",NULL};
+datafile_rows_t trf_path_row_286[] = {"8662","1","4259","4326","","1330","",NULL};
+datafile_rows_t trf_path_row_287[] = {"8663","1","4805","4312","","1261","",NULL};
+datafile_rows_t trf_path_row_288[] = {"8663","2","4312","4326","","1306","",NULL};
+datafile_rows_t trf_path_row_289[] = {"8664","1","4133","4258","","1331","",NULL};
+datafile_rows_t trf_path_row_290[] = {"8665","1","4284","4133","","1332","",NULL};
+datafile_rows_t trf_path_row_291[] = {"8666","1","4133","4326","","1333","",NULL};
+datafile_rows_t trf_path_row_292[] = {"8667","1","4284","4326","","1334","",NULL};
+datafile_rows_t trf_path_row_293[] = {"8668","1","4301","4326","","1335","",NULL};
+datafile_rows_t trf_path_row_294[] = {"8669","1","4301","4326","","1336","",NULL};
+datafile_rows_t trf_path_row_295[] = {"8670","1","4301","4326","","1337","",NULL};
+datafile_rows_t trf_path_row_296[] = {"8671","1","4301","4326","","1338","",NULL};
+datafile_rows_t trf_path_row_297[] = {"8672","1","4301","4326","","1339","",NULL};
+datafile_rows_t trf_path_row_298[] = {"8673","1","4301","4326","","1340","",NULL};
+datafile_rows_t trf_path_row_299[] = {"8674","1","4301","4326","","1341","",NULL};
+datafile_rows_t trf_path_row_300[] = {"8675","1","4301","4326","","1342","",NULL};
+datafile_rows_t trf_path_row_301[] = {"8676","1","4301","4326","","1343","",NULL};
+datafile_rows_t trf_path_row_302[] = {"8677","1","4301","4326","","1344","",NULL};
+datafile_rows_t trf_path_row_303[] = {"8678","1","4301","4326","","1345","",NULL};
+datafile_rows_t trf_path_row_304[] = {"8679","1","4301","4326","","1346","",NULL};
+datafile_rows_t trf_path_row_305[] = {"8680","1","4301","4326","","1347","",NULL};
+datafile_rows_t trf_path_row_306[] = {"8681","1","4301","4326","","1348","",NULL};
+datafile_rows_t trf_path_row_307[] = {"8682","1","4301","4326","","1349","",NULL};
+datafile_rows_t trf_path_row_308[] = {"8683","1","4301","4326","","1350","",NULL};
+datafile_rows_t trf_path_row_309[] = {"8684","1","4301","4326","","1351","",NULL};
+datafile_rows_t trf_path_row_310[] = {"8685","1","4301","4326","","1352","",NULL};
+datafile_rows_t trf_path_row_311[] = {"8686","1","4301","4326","","1353","",NULL};
+datafile_rows_t trf_path_row_312[] = {"8687","1","4301","4326","","1354","",NULL};
+datafile_rows_t trf_path_row_313[] = {"8688","1","4301","4326","","1355","",NULL};
+datafile_rows_t trf_path_row_314[] = {"8689","1","4301","4326","","1356","",NULL};
+datafile_rows_t trf_path_row_315[] = {"8690","1","4301","4326","","1357","",NULL};
+datafile_rows_t trf_path_row_316[] = {"8691","1","4301","4326","","1358","",NULL};
+datafile_rows_t trf_path_row_317[] = {"8692","1","4301","4326","","1359","",NULL};
+datafile_rows_t trf_path_row_318[] = {"8693","1","4301","4326","","1360","",NULL};
+datafile_rows_t trf_path_row_319[] = {"8694","1","4301","4326","","1361","",NULL};
+datafile_rows_t trf_path_row_320[] = {"8695","1","4301","4326","","1362","",NULL};
+datafile_rows_t trf_path_row_321[] = {"8696","1","4301","4326","","1363","",NULL};
+datafile_rows_t trf_path_row_322[] = {"8697","1","4301","4326","","1364","",NULL};
+datafile_rows_t trf_path_row_323[] = {"8698","1","4301","4326","","1365","",NULL};
+datafile_rows_t trf_path_row_324[] = {"8699","1","4301","4326","","1366","",NULL};
+datafile_rows_t trf_path_row_325[] = {"8700","1","4301","4326","","1367","",NULL};
+datafile_rows_t trf_path_row_326[] = {"8701","1","4301","4326","","1368","",NULL};
+datafile_rows_t trf_path_row_327[] = {"8702","1","4301","4326","","1369","",NULL};
+datafile_rows_t trf_path_row_328[] = {"8703","1","4301","4326","","1370","",NULL};
+datafile_rows_t trf_path_row_329[] = {"8704","1","4301","4326","","1371","",NULL};
+datafile_rows_t trf_path_row_330[] = {"8705","1","4301","4326","","1372","",NULL};
+datafile_rows_t trf_path_row_331[] = {"8706","1","4301","4326","","1373","",NULL};
+datafile_rows_t trf_path_row_332[] = {"8707","1","4301","4326","","1374","",NULL};
+datafile_rows_t trf_path_row_333[] = {"8708","1","4301","4326","","1375","",NULL};
+datafile_rows_t trf_path_row_334[] = {"8709","1","4301","4326","","1376","",NULL};
+datafile_rows_t trf_path_row_335[] = {"8710","1","4301","4326","","1377","",NULL};
+datafile_rows_t trf_path_row_336[] = {"8711","1","4301","4326","","1378","",NULL};
+datafile_rows_t trf_path_row_337[] = {"8712","1","4301","4326","","1379","",NULL};
+datafile_rows_t trf_path_row_338[] = {"8713","1","4301","4326","","1380","",NULL};
+datafile_rows_t trf_path_row_339[] = {"8714","1","4301","4326","","1381","",NULL};
+datafile_rows_t trf_path_row_340[] = {"8715","1","4301","4326","","1382","",NULL};
+datafile_rows_t trf_path_row_341[] = {"8716","1","4301","4326","","1383","",NULL};
+datafile_rows_t trf_path_row_342[] = {"8717","1","4301","4326","","1384","",NULL};
+datafile_rows_t trf_path_row_343[] = {"8718","1","4301","4326","","1385","",NULL};
+datafile_rows_t trf_path_row_344[] = {"8719","1","4301","4326","","1386","",NULL};
+datafile_rows_t trf_path_row_345[] = {"8720","1","4301","4326","","1387","",NULL};
+datafile_rows_t trf_path_row_346[] = {"8721","1","4301","4326","","1388","",NULL};
+datafile_rows_t trf_path_row_347[] = {"8722","1","4301","4326","","1389","",NULL};
+datafile_rows_t trf_path_row_348[] = {"8723","1","4301","4326","","1390","",NULL};
+datafile_rows_t trf_path_row_349[] = {"8724","1","4301","4326","","1391","",NULL};
+datafile_rows_t trf_path_row_350[] = {"8725","1","4301","4326","","1392","",NULL};
+datafile_rows_t trf_path_row_351[] = {"8726","1","4301","4326","","1393","",NULL};
+datafile_rows_t trf_path_row_352[] = {"8727","1","4301","4326","","1394","",NULL};
+datafile_rows_t trf_path_row_353[] = {"8728","1","4301","4326","","1395","",NULL};
+datafile_rows_t trf_path_row_354[] = {"8729","1","4301","4326","","1396","",NULL};
+datafile_rows_t trf_path_row_355[] = {"8730","1","4301","4326","","1397","",NULL};
+datafile_rows_t trf_path_row_356[] = {"8731","1","4301","4326","","1398","",NULL};
+datafile_rows_t trf_path_row_357[] = {"8732","1","4301","4326","","1399","",NULL};
+datafile_rows_t trf_path_row_358[] = {"8733","1","4301","4326","","1400","",NULL};
+datafile_rows_t trf_path_row_359[] = {"8734","1","4301","4326","","1401","",NULL};
+datafile_rows_t trf_path_row_360[] = {"8735","1","4301","4326","","1402","",NULL};
+datafile_rows_t trf_path_row_361[] = {"8736","1","4301","4326","","1403","",NULL};
+datafile_rows_t trf_path_row_362[] = {"8737","1","4301","4326","","1404","",NULL};
+datafile_rows_t trf_path_row_363[] = {"8738","1","4301","4326","","1405","",NULL};
+datafile_rows_t trf_path_row_364[] = {"8739","1","4301","4326","","1406","",NULL};
+datafile_rows_t trf_path_row_365[] = {"8740","1","4301","4326","","1407","",NULL};
+datafile_rows_t trf_path_row_366[] = {"8741","1","4301","4326","","1408","",NULL};
+datafile_rows_t trf_path_row_367[] = {"8742","1","4301","4326","","1409","",NULL};
+datafile_rows_t trf_path_row_368[] = {"8743","1","4301","4326","","1410","",NULL};
+datafile_rows_t trf_path_row_369[] = {"8744","1","4301","4326","","1411","",NULL};
+datafile_rows_t trf_path_row_370[] = {"8745","1","4301","4326","","1412","",NULL};
+datafile_rows_t trf_path_row_371[] = {"8746","1","4301","4326","","1413","",NULL};
+datafile_rows_t trf_path_row_372[] = {"8747","1","4301","4326","","1414","",NULL};
+datafile_rows_t trf_path_row_373[] = {"8748","1","4301","4326","","1415","",NULL};
+datafile_rows_t trf_path_row_374[] = {"8749","1","4301","4326","","1416","",NULL};
+datafile_rows_t trf_path_row_375[] = {"8750","1","4301","4326","","1417","",NULL};
+datafile_rows_t trf_path_row_376[] = {"8751","1","4301","4326","","1418","",NULL};
+datafile_rows_t trf_path_row_377[] = {"8752","1","4301","4326","","1419","",NULL};
+datafile_rows_t trf_path_row_378[] = {"8753","1","4301","4326","","1420","",NULL};
+datafile_rows_t trf_path_row_379[] = {"8754","1","4301","4326","","1421","",NULL};
+datafile_rows_t trf_path_row_380[] = {"8755","1","4301","4326","","1422","",NULL};
+datafile_rows_t trf_path_row_381[] = {"8756","1","4301","4326","","1423","",NULL};
+datafile_rows_t trf_path_row_382[] = {"8757","1","4301","4326","","1424","",NULL};
+datafile_rows_t trf_path_row_383[] = {"8758","1","4301","4326","","1425","",NULL};
+datafile_rows_t trf_path_row_384[] = {"8759","1","4301","4326","","1426","",NULL};
+datafile_rows_t trf_path_row_385[] = {"8760","1","4301","4326","","1427","",NULL};
+datafile_rows_t trf_path_row_386[] = {"8761","1","4301","4326","","1428","",NULL};
+datafile_rows_t trf_path_row_387[] = {"8762","1","4301","4326","","1429","",NULL};
+datafile_rows_t trf_path_row_388[] = {"8763","1","4301","4326","","1430","",NULL};
+datafile_rows_t trf_path_row_389[] = {"8764","1","4301","4326","","1431","",NULL};
+datafile_rows_t trf_path_row_390[] = {"8765","1","4301","4326","","1432","",NULL};
+datafile_rows_t trf_path_row_391[] = {"8766","1","4301","4326","","1433","",NULL};
+datafile_rows_t trf_path_row_392[] = {"8767","1","4301","4326","","1434","",NULL};
+datafile_rows_t trf_path_row_393[] = {"8768","1","4301","4326","","1435","",NULL};
+datafile_rows_t trf_path_row_394[] = {"8769","1","4301","4326","","1436","",NULL};
+datafile_rows_t trf_path_row_395[] = {"8770","1","4232","4326","","1438","",NULL};
+datafile_rows_t trf_path_row_396[] = {"8771","1","4134","4326","","1439","",NULL};
+datafile_rows_t trf_path_row_397[] = {"8772","1","4230","4326","","1440","",NULL};
+datafile_rows_t trf_path_row_398[] = {"8773","1","4601","4326","","1441","",NULL};
+datafile_rows_t trf_path_row_399[] = {"8774","1","4602","4326","","1442","",NULL};
+datafile_rows_t trf_path_row_400[] = {"8775","1","4603","4326","","1443","",NULL};
+datafile_rows_t trf_path_row_401[] = {"8776","1","4604","4326","","1444","",NULL};
+datafile_rows_t trf_path_row_402[] = {"8777","1","4605","4326","","1445","",NULL};
+datafile_rows_t trf_path_row_403[] = {"8778","1","4606","4326","","1446","",NULL};
+datafile_rows_t trf_path_row_404[] = {"8779","1","4600","4326","","1447","",NULL};
+datafile_rows_t trf_path_row_405[] = {"8780","1","4124","4258","","1437","",NULL};
+datafile_rows_t trf_path_row_406[] = {"8784","1","4230","4326","","1450","",NULL};
+datafile_rows_t trf_path_row_407[] = {"8785","1","4135","4269","","1454","",NULL};
+datafile_rows_t trf_path_row_408[] = {"8786","1","4135","4269","","1454","",NULL};
+datafile_rows_t trf_path_row_409[] = {"8786","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_410[] = {"8787","1","4136","4269","","1455","",NULL};
+datafile_rows_t trf_path_row_411[] = {"8788","1","4136","4269","","1455","",NULL};
+datafile_rows_t trf_path_row_412[] = {"8788","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_413[] = {"8789","1","4137","4269","","1456","",NULL};
+datafile_rows_t trf_path_row_414[] = {"8790","1","4137","4269","","1456","",NULL};
+datafile_rows_t trf_path_row_415[] = {"8790","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_416[] = {"8791","1","4138","4269","","1457","",NULL};
+datafile_rows_t trf_path_row_417[] = {"8792","1","4138","4269","","1457","",NULL};
+datafile_rows_t trf_path_row_418[] = {"8792","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_419[] = {"8793","1","4609","4269","","1451","",NULL};
+datafile_rows_t trf_path_row_420[] = {"8794","1","4609","4269","","1451","",NULL};
+datafile_rows_t trf_path_row_421[] = {"8794","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_422[] = {"8795","1","4202","4283","","1458","",NULL};
+datafile_rows_t trf_path_row_423[] = {"8796","1","4202","4283","","1458","",NULL};
+datafile_rows_t trf_path_row_424[] = {"8796","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_425[] = {"8797","1","4202","4283","","1459","",NULL};
+datafile_rows_t trf_path_row_426[] = {"8798","1","4202","4283","","1459","",NULL};
+datafile_rows_t trf_path_row_427[] = {"8798","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_428[] = {"8799","1","4202","4283","","1460","",NULL};
+datafile_rows_t trf_path_row_429[] = {"8800","1","4202","4283","","1460","",NULL};
+datafile_rows_t trf_path_row_430[] = {"8800","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_431[] = {"8801","1","4139","4269","","1461","",NULL};
+datafile_rows_t trf_path_row_432[] = {"8802","1","4139","4269","","1461","",NULL};
+datafile_rows_t trf_path_row_433[] = {"8802","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_434[] = {"8803","1","4267","4269","","1462","",NULL};
+datafile_rows_t trf_path_row_435[] = {"8804","1","4267","4269","","1462","",NULL};
+datafile_rows_t trf_path_row_436[] = {"8804","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_437[] = {"8805","1","4608","4269","","1463","",NULL};
+datafile_rows_t trf_path_row_438[] = {"8806","1","4608","4269","","1463","",NULL};
+datafile_rows_t trf_path_row_439[] = {"8806","2","4269","4326","","1188","",NULL};
+datafile_rows_t trf_path_row_440[] = {"8807","1","4202","4283","","1464","",NULL};
+datafile_rows_t trf_path_row_441[] = {"8808","1","4202","4283","","1464","",NULL};
+datafile_rows_t trf_path_row_442[] = {"8808","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_443[] = {"8811","1","4817","4273","","1466","",NULL};
+datafile_rows_t trf_path_row_444[] = {"8812","1","4807","4275","","1468","",NULL};
+datafile_rows_t trf_path_row_445[] = {"8813","1","4142","4326","","1469","",NULL};
+datafile_rows_t trf_path_row_446[] = {"8814","1","4143","4326","","1470","",NULL};
+datafile_rows_t trf_path_row_447[] = {"8815","1","4312","4326","","1471","",NULL};
+datafile_rows_t trf_path_row_448[] = {"8816","1","4122","4140","","1472","",NULL};
+datafile_rows_t trf_path_row_449[] = {"8817","1","4140","4326","","1473","",NULL};
+datafile_rows_t trf_path_row_450[] = {"8818","1","4122","4140","","1472","",NULL};
+datafile_rows_t trf_path_row_451[] = {"8818","2","4140","4326","","1473","",NULL};
+datafile_rows_t trf_path_row_452[] = {"8819","1","4269","4152","","1474","",NULL};
+datafile_rows_t trf_path_row_453[] = {"8820","1","4269","4152","","1475","",NULL};
+datafile_rows_t trf_path_row_454[] = {"8821","1","4269","4152","","1476","",NULL};
+datafile_rows_t trf_path_row_455[] = {"8822","1","4269","4152","","1477","",NULL};
+datafile_rows_t trf_path_row_456[] = {"8823","1","4269","4152","","1478","",NULL};
+datafile_rows_t trf_path_row_457[] = {"8824","1","4269","4152","","1479","",NULL};
+datafile_rows_t trf_path_row_458[] = {"8825","1","4269","4152","","1480","",NULL};
+datafile_rows_t trf_path_row_459[] = {"8826","1","4269","4152","","1481","",NULL};
+datafile_rows_t trf_path_row_460[] = {"8827","1","4269","4152","","1482","",NULL};
+datafile_rows_t trf_path_row_461[] = {"8828","1","4269","4152","","1483","",NULL};
+datafile_rows_t trf_path_row_462[] = {"8829","1","4269","4152","","1484","",NULL};
+datafile_rows_t trf_path_row_463[] = {"8830","1","4269","4152","","1485","",NULL};
+datafile_rows_t trf_path_row_464[] = {"8831","1","4269","4152","","1486","",NULL};
+datafile_rows_t trf_path_row_465[] = {"8832","1","4269","4152","","1487","",NULL};
+datafile_rows_t trf_path_row_466[] = {"8833","1","4269","4152","","1488","",NULL};
+datafile_rows_t trf_path_row_467[] = {"8834","1","4269","4152","","1489","",NULL};
+datafile_rows_t trf_path_row_468[] = {"8835","1","4269","4152","","1490","",NULL};
+datafile_rows_t trf_path_row_469[] = {"8836","1","4269","4152","","1491","",NULL};
+datafile_rows_t trf_path_row_470[] = {"8837","1","4269","4152","","1492","",NULL};
+datafile_rows_t trf_path_row_471[] = {"8838","1","4269","4152","","1493","",NULL};
+datafile_rows_t trf_path_row_472[] = {"8839","1","4269","4152","","1494","",NULL};
+datafile_rows_t trf_path_row_473[] = {"8840","1","4269","4152","","1495","",NULL};
+datafile_rows_t trf_path_row_474[] = {"8841","1","4269","4152","","1496","",NULL};
+datafile_rows_t trf_path_row_475[] = {"8842","1","4269","4152","","1497","",NULL};
+datafile_rows_t trf_path_row_476[] = {"8843","1","4269","4152","","1498","",NULL};
+datafile_rows_t trf_path_row_477[] = {"8844","1","4269","4152","","1499","",NULL};
+datafile_rows_t trf_path_row_478[] = {"8845","1","4269","4152","","1500","",NULL};
+datafile_rows_t trf_path_row_479[] = {"8846","1","4269","4152","","1501","",NULL};
+datafile_rows_t trf_path_row_480[] = {"8847","1","4269","4152","","1502","",NULL};
+datafile_rows_t trf_path_row_481[] = {"8848","1","4269","4152","","1503","",NULL};
+datafile_rows_t trf_path_row_482[] = {"8849","1","4222","4148","","1504","",NULL};
+datafile_rows_t trf_path_row_483[] = {"8850","1","4148","4326","","1505","",NULL};
+datafile_rows_t trf_path_row_484[] = {"8851","1","4202","4283","","1506","",NULL};
+datafile_rows_t trf_path_row_485[] = {"8852","1","4202","4283","","1507","",NULL};
+datafile_rows_t trf_path_row_486[] = {"8853","1","4202","4283","","1506","",NULL};
+datafile_rows_t trf_path_row_487[] = {"8853","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_488[] = {"8854","1","4202","4283","","1507","",NULL};
+datafile_rows_t trf_path_row_489[] = {"8854","2","4283","4326","","1150","",NULL};
+datafile_rows_t trf_path_row_490[] = {"8855","1","4149","4326","","1508","",NULL};
+datafile_rows_t trf_path_row_491[] = {"8856","1","4150","4151","","1509","",NULL};
+datafile_rows_t trf_path_row_492[] = {"8857","1","4150","4151","","1509","",NULL};
+datafile_rows_t trf_path_row_493[] = {"8857","2","4151","4326","","1511","",NULL};
+datafile_rows_t trf_path_row_494[] = {"8858","1","4149","4326","","1510","",NULL};
+datafile_rows_t trf_path_row_495[] = {"8859","1","4151","4326","","1511","",NULL};
+datafile_rows_t trf_path_row_496[] = {"8860","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_497[] = {"8860","2","4269","4152","","1474","",NULL};
+datafile_rows_t trf_path_row_498[] = {"8861","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_499[] = {"8861","2","4269","4152","","1475","",NULL};
+datafile_rows_t trf_path_row_500[] = {"8862","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_501[] = {"8862","2","4269","4152","","1476","",NULL};
+datafile_rows_t trf_path_row_502[] = {"8863","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_503[] = {"8863","2","4269","4152","","1477","",NULL};
+datafile_rows_t trf_path_row_504[] = {"8864","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_505[] = {"8864","2","4269","4152","","1478","",NULL};
+datafile_rows_t trf_path_row_506[] = {"8865","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_507[] = {"8865","2","4269","4152","","1479","",NULL};
+datafile_rows_t trf_path_row_508[] = {"8866","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_509[] = {"8866","2","4269","4152","","1480","",NULL};
+datafile_rows_t trf_path_row_510[] = {"8867","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_511[] = {"8867","2","4269","4152","","1481","",NULL};
+datafile_rows_t trf_path_row_512[] = {"8868","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_513[] = {"8868","2","4269","4152","","1482","",NULL};
+datafile_rows_t trf_path_row_514[] = {"8869","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_515[] = {"8869","2","4269","4152","","1483","",NULL};
+datafile_rows_t trf_path_row_516[] = {"8870","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_517[] = {"8870","2","4269","4152","","1484","",NULL};
+datafile_rows_t trf_path_row_518[] = {"8871","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_519[] = {"8871","2","4269","4152","","1485","",NULL};
+datafile_rows_t trf_path_row_520[] = {"8872","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_521[] = {"8872","2","4269","4152","","1486","",NULL};
+datafile_rows_t trf_path_row_522[] = {"8873","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_523[] = {"8873","2","4269","4152","","1487","",NULL};
+datafile_rows_t trf_path_row_524[] = {"8874","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_525[] = {"8874","2","4269","4152","","1488","",NULL};
+datafile_rows_t trf_path_row_526[] = {"8875","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_527[] = {"8875","2","4269","4152","","1489","",NULL};
+datafile_rows_t trf_path_row_528[] = {"8876","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_529[] = {"8876","2","4269","4152","","1490","",NULL};
+datafile_rows_t trf_path_row_530[] = {"8877","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_531[] = {"8877","2","4269","4152","","1491","",NULL};
+datafile_rows_t trf_path_row_532[] = {"8878","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_533[] = {"8878","2","4269","4152","","1492","",NULL};
+datafile_rows_t trf_path_row_534[] = {"8879","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_535[] = {"8879","2","4269","4152","","1493","",NULL};
+datafile_rows_t trf_path_row_536[] = {"8880","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_537[] = {"8880","2","4269","4152","","1494","",NULL};
+datafile_rows_t trf_path_row_538[] = {"8881","1","4139","4269","","1461","",NULL};
+datafile_rows_t trf_path_row_539[] = {"8881","2","4269","4152","","1495","",NULL};
+datafile_rows_t trf_path_row_540[] = {"8882","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_541[] = {"8882","2","4269","4152","","1496","",NULL};
+datafile_rows_t trf_path_row_542[] = {"8883","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_543[] = {"8883","2","4269","4152","","1497","",NULL};
+datafile_rows_t trf_path_row_544[] = {"8884","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_545[] = {"8884","2","4269","4152","","1498","",NULL};
+datafile_rows_t trf_path_row_546[] = {"8885","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_547[] = {"8885","2","4269","4152","","1499","",NULL};
+datafile_rows_t trf_path_row_548[] = {"8886","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_549[] = {"8886","2","4269","4152","","1500","",NULL};
+datafile_rows_t trf_path_row_550[] = {"8887","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_551[] = {"8887","2","4269","4152","","1501","",NULL};
+datafile_rows_t trf_path_row_552[] = {"8888","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_553[] = {"8888","2","4269","4152","","1502","",NULL};
+datafile_rows_t trf_path_row_554[] = {"8889","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_555[] = {"8889","2","4269","4152","","1503","",NULL};
+datafile_rows_t trf_path_row_556[] = {"8890","1","4153","4326","","1512","",NULL};
+datafile_rows_t trf_path_row_557[] = {"8891","1","4132","4326","","1513","",NULL};
+datafile_rows_t trf_path_row_558[] = {"8892","1","4154","4326","","1514","",NULL};
+datafile_rows_t trf_path_row_559[] = {"8893","1","4269","4326","","1308","",NULL};
+datafile_rows_t trf_path_row_560[] = {"8894","1","4269","4326","","1515","",NULL};
+datafile_rows_t trf_path_row_561[] = {"8895","1","4247","4326","","1516","",NULL};
+datafile_rows_t trf_path_row_562[] = {"8896","1","4267","4269","","1241","",NULL};
+datafile_rows_t trf_path_row_563[] = {"8896","2","4269","4326","","1515","",NULL};
+datafile_rows_t trf_path_row_564[] = {"8897","1","4267","4269","","1243","",NULL};
+datafile_rows_t trf_path_row_565[] = {"8897","2","4269","4326","","1515","",NULL};
+
+datafile_rows_t *trf_path_rows[] = {trf_path_row_1,trf_path_row_2,trf_path_row_3,trf_path_row_4,trf_path_row_5,trf_path_row_6,trf_path_row_7,trf_path_row_8,trf_path_row_9,trf_path_row_10,trf_path_row_11,trf_path_row_12,trf_path_row_13,trf_path_row_14,trf_path_row_15,trf_path_row_16,trf_path_row_17,trf_path_row_18,trf_path_row_19,trf_path_row_20,trf_path_row_21,trf_path_row_22,trf_path_row_23,trf_path_row_24,trf_path_row_25,trf_path_row_26,trf_path_row_27,trf_path_row_28,trf_path_row_29,t [...]
diff --git a/src/tiff/csv/trf_path.csv b/src/tiff/csv/trf_path.csv
new file mode 100644
index 0000000..edf31a1
--- /dev/null
+++ b/src/tiff/csv/trf_path.csv
@@ -0,0 +1,565 @@
+"TRF_PATH_CODE","TRF_STEP_CODE","SOURCE_HORIZCS_CODE","TARGET_HORIZCS_CODE","POLYN_TRF_CODE","NONPOLYN_TRF_CODE","CHANGE_ID"
+8400,1,4201,4326,,1100,
+8401,1,4201,4326,,1101,
+8402,1,4201,4326,,1102,
+8403,1,4201,4326,,1103,
+8404,1,4201,4326,,1104,
+8405,1,4201,4326,,1105,
+8406,1,4201,4326,,1106,
+8407,1,4205,4326,,1107,
+8408,1,4202,4326,,1108,
+8409,1,4203,4326,,1109,
+8410,1,4204,4326,,1110,
+8411,1,4204,4326,,1111,
+8412,1,4289,4326,,1112,
+8413,1,4209,4326,,1113,
+8414,1,4209,4326,,1114,
+8415,1,4209,4326,,1115,
+8416,1,4209,4326,,1116,
+8417,1,4209,4326,,1117,
+8418,1,4209,4326,,1118,
+8419,1,4209,4326,,1119,
+8420,1,4209,4326,,1120,
+8421,1,4209,4326,,1121,
+8422,1,4210,4326,,1122,
+8423,1,4211,4326,,1123,
+8424,1,4216,4326,,1124,
+8425,1,4218,4326,,1125,
+8426,1,4219,4326,,1126,
+8427,1,4221,4326,,1127,
+8428,1,4222,4326,,1128,
+8429,1,4222,4326,,1129,
+8430,1,4223,4326,,1130,
+8431,1,4224,4326,,1131,
+8432,1,4225,4326,,1132,
+8433,1,4230,4326,,1133,
+8434,1,4230,4326,,1134,
+8435,1,4230,4326,,1135,
+8436,1,4230,4326,,1136,
+8437,1,4230,4326,,1137,
+8438,1,4230,4326,,1138,
+8439,1,4230,4326,,1139,
+8440,1,4230,4326,,1140,
+8441,1,4230,4326,,1141,
+8442,1,4230,4326,,1142,
+8443,1,4230,4326,,1143,
+8444,1,4230,4326,,1144,
+8445,1,4230,4326,,1145,
+8446,1,4230,4231,1000,,
+8446,2,4231,4326,,1146,
+8447,1,4230,4231,,1147,
+8447,2,4231,4326,,1146,
+8448,1,4229,4326,,1148,
+8449,1,4258,4326,,1149,
+8450,1,4283,4326,,1150,
+8451,1,4272,4326,,1151,
+8452,1,4236,4326,,1152,
+8453,1,4239,4326,,1153,
+8454,1,4240,4326,,1154,
+8455,1,4144,4326,,1155,97.235
+8456,1,4146,4326,,1156,97.235
+8457,1,4244,4326,,1157,
+8458,1,4245,4326,,1158,
+8459,1,4250,4326,,1159,
+8460,1,4251,4326,,1160,
+8461,1,4253,4326,,1161,
+8462,1,4253,4326,,1162,
+8463,1,4266,4326,,1163,
+8464,1,4256,4326,,1164,
+8465,1,4262,4326,,1165,
+8466,1,4261,4326,,1166,
+8467,1,4263,4326,,1167,
+8468,1,4263,4326,,1168,
+8469,1,4265,4326,,1169,
+8470,1,4267,4326,,1170,
+8471,1,4267,4326,,1171,
+8472,1,4267,4326,,1172,
+8473,1,4267,4326,,1173,
+8474,1,4267,4326,,1174,
+8475,1,4267,4326,,1175,
+8476,1,4267,4326,,1176,
+8477,1,4267,4326,,1177,
+8478,1,4267,4326,,1178,
+8479,1,4267,4326,,1179,
+8480,1,4267,4326,,1180,
+8481,1,4267,4326,,1181,
+8482,1,4267,4326,,1182,
+8483,1,4267,4326,,1183,
+8484,1,4267,4326,,1184,
+8485,1,4267,4326,,1185,
+8486,1,4267,4326,,1186,
+8487,1,4267,4326,,1187,
+8488,1,4269,4326,,1188,
+8489,1,4270,4326,,1189,
+8490,1,4270,4326,,1190,
+8491,1,4270,4326,,1191,
+8492,1,4271,4326,,1192,
+8493,1,4275,4326,,1193,
+8494,1,4807,4275,,1467,97.05
+8494,2,4275,4326,,1193,
+8495,1,4277,4326,,1195,
+8496,1,4277,4326,,1196,
+8497,1,4277,4326,,1197,
+8498,1,4277,4326,,1198,
+8499,1,4277,4326,,1199,
+8500,1,4282,4326,,1200,
+8501,1,4248,4326,,1201,
+8502,1,4248,4326,,1202,
+8503,1,4248,4326,,1203,
+8504,1,4248,4326,,1204,
+8505,1,4248,4326,,1205,
+8506,1,4248,4326,,1206,
+8507,1,4248,4326,,1207,
+8508,1,4248,4326,,1208,
+8509,1,4248,4326,,1209,
+8510,1,4285,4326,,1210,
+8511,1,4287,4326,,1211,
+8512,1,4291,4326,,1212,
+8513,1,4291,4326,,1213,
+8514,1,4291,4326,,1214,
+8515,1,4291,4326,,1215,
+8516,1,4291,4326,,1216,
+8517,1,4291,4326,,1217,
+8518,1,4291,4326,,1218,
+8519,1,4291,4326,,1219,
+8520,1,4291,4326,,1220,
+8521,1,4291,4326,,1221,
+8522,1,4291,4326,,1222,
+8523,1,4291,4326,,1223,
+8524,1,4291,4326,,1224,
+8525,1,4292,4326,,1225,
+8526,1,4293,4326,,1226,
+8527,1,4297,4326,,1227,
+8528,1,4298,4326,,1228,
+8529,1,4299,4326,,1229,
+8530,1,4301,4326,,1230,
+8531,1,4301,4326,,1231,
+8532,1,4301,4326,,1232,
+8533,1,4301,4326,,1233,
+8534,1,4309,4326,,1234,
+8535,1,4311,4326,,1235,
+8536,1,4230,4231,1000,,
+8537,1,4231,4326,,1146,
+8538,1,4230,4231,,1147,
+8539,1,4203,4326,,1236,
+8540,1,4322,4326,,1237,
+8541,1,4322,4326,,1238,
+8542,1,4324,4322,,1239,
+8543,1,4324,4326,,1240,
+8544,1,4267,4269,,1241,
+8546,1,4267,4269,,1243,
+8548,1,4230,4326,,1245,
+8549,1,4255,4326,,1246,
+8550,1,4145,4326,,1247,97.235
+8551,1,4238,4326,,1248,
+8552,1,4267,4326,,1249,
+8553,1,4267,4326,,1250,
+8554,1,4269,4326,,1251,
+8555,1,4269,4326,,1252,
+8556,1,4307,4326,,1253,
+8557,1,4284,4326,,1254,
+8558,1,4305,4326,,1255,
+8559,1,4232,4326,,1256,
+8560,1,4807,4275,,1467,99.63
+8561,1,4801,4217,,1257,
+8562,1,4802,4218,,1258,
+8563,1,4802,4218,,1258,
+8563,2,4218,4326,,1125,
+8564,1,4803,4207,,1259,
+8565,1,4804,4257,,1260,
+8566,1,4805,4312,,1261,
+8567,1,4806,4265,,1262,
+8568,1,4806,4265,,1262,
+8568,2,4265,4326,,1169,
+8569,1,4808,4280,,1263,
+8570,1,4809,4215,,1264,
+8571,1,4810,4297,,1265,
+8572,1,4810,4297,,1265,
+8572,2,4297,4326,,1227,
+8573,1,4811,4304,,1266,
+8574,1,4812,4305,,1267,
+8575,1,4812,4305,,1267,
+8575,2,4305,4326,,1255,
+8576,1,4813,4211,,1268,
+8577,1,4813,4211,,1268,
+8577,2,4211,4326,,1123,
+8578,1,4814,4308,,1269,98.51
+8579,1,4815,4120,,1270,
+8580,1,4293,4326,,1271,
+8581,1,4121,4326,,1272,
+8582,1,4237,4258,,1273,
+8583,1,4237,4258,,1273,
+8583,2,4258,4326,,1149,
+8584,1,4230,4326,,1275,
+8585,1,4275,4230,,1276,
+8586,1,4807,4275,,1467,
+8586,2,4275,4230,,1276,
+8587,1,4275,4322,,1277,
+8588,1,4807,4275,,1467,
+8588,2,4275,4322,,1277,
+8589,1,4202,4283,,1278,
+8590,1,4202,4283,,1278,
+8590,2,4283,4326,,1150,98.50
+8591,1,4203,4283,,1279,
+8592,1,4203,4283,,1279,
+8592,2,4283,4326,,1150,98.50
+8593,1,4203,4283,,1280,
+8594,1,4203,4283,,1280,
+8594,2,4283,4326,,1150,98.50
+8595,1,4124,4258,,1437,99.11
+8595,2,4258,4326,,1149,99.11
+8596,1,4125,4326,,1282,
+8597,1,4284,4126,,1274,
+8598,1,4126,4326,,1283,
+8599,1,4210,4326,,1284,
+8600,1,4210,4326,,1285,
+8601,1,4294,4326,,1286,
+8602,1,4284,4326,,1287,
+8603,1,4284,4326,,1288,
+8604,1,4284,4326,,1289,
+8605,1,4284,4326,,1290,
+8606,1,4284,4326,,1291,
+8607,1,4284,4326,,1292,
+8608,1,4284,4326,,1293,
+8609,1,4284,4126,,1274,
+8609,2,4126,4326,,1283,
+8610,1,4304,4326,,1294,
+8611,1,4811,4304,,1266,
+8611,2,4304,4326,,1294,
+8612,1,4271,4326,,1295,
+8613,1,4302,4326,,1296,
+8614,1,4127,4130,,1297,
+8615,1,4127,4130,,1297,
+8615,2,4130,4326,,1302,
+8616,1,4127,4130,,1298,
+8617,1,4127,4130,,1298,
+8617,2,4130,4326,,1302,
+8618,1,4127,4130,,1299,
+8619,1,4127,4130,,1299,
+8619,2,4130,4326,,1302,
+8620,1,4127,4130,,1300,
+8621,1,4127,4130,,1300,
+8621,2,4130,4326,,1302,
+8622,1,4127,4130,,1301,
+8623,1,4127,4130,,1301,
+8623,2,4130,4326,,1302,
+8624,1,4130,4326,,1302,
+8625,1,4284,4326,,1303,
+8626,1,4240,4326,,1304,
+8627,1,4301,4326,,1305,
+8628,1,4312,4326,,1306,
+8629,1,4271,4326,,1307,
+8633,1,4314,4258,,1309,
+8634,1,4314,4258,,1309,
+8634,2,4258,4326,,1149,
+8635,1,4284,4258,,1310,
+8636,1,4284,4258,,1310,
+8636,2,4258,4326,,1149,
+8637,1,4230,4326,,1311,
+8638,1,4903,4230,1001,,
+8639,1,4903,4230,1002,,
+8640,1,4903,4230,1003,,
+8641,1,4903,4230,1001,,
+8641,2,4230,4326,,1145,
+8642,1,4267,4269,,1312,
+8643,1,4267,4269,,1312,
+8643,2,4269,4326,,1188,
+8644,1,4267,4269,,1313,
+8645,1,4267,4269,,1313,
+8645,2,4269,4326,,1188,
+8646,1,4277,4326,,1314,
+8647,1,4277,4230,,1315,
+8648,1,4260,4326,,1316,
+8649,1,4220,4324,,1317,
+8650,1,4220,4326,,1318,
+8651,1,4220,4326,,1319,
+8652,1,4220,4326,,1320,
+8653,1,4220,4326,,1321,
+8654,1,4220,4326,,1322,
+8655,1,4220,4326,,1323,
+8656,1,4220,4326,,1324,
+8657,1,4220,4326,,1325,
+8658,1,4220,4326,,1326,
+8659,1,4220,4326,,1327,
+8660,1,4259,4264,,1328,
+8661,1,4264,4326,,1329,
+8662,1,4259,4326,,1330,
+8663,1,4805,4312,,1261,
+8663,2,4312,4326,,1306,
+8664,1,4133,4258,,1331,
+8665,1,4284,4133,,1332,
+8666,1,4133,4326,,1333,
+8667,1,4284,4326,,1334,
+8668,1,4301,4326,,1335,
+8669,1,4301,4326,,1336,
+8670,1,4301,4326,,1337,
+8671,1,4301,4326,,1338,
+8672,1,4301,4326,,1339,
+8673,1,4301,4326,,1340,
+8674,1,4301,4326,,1341,
+8675,1,4301,4326,,1342,
+8676,1,4301,4326,,1343,
+8677,1,4301,4326,,1344,
+8678,1,4301,4326,,1345,
+8679,1,4301,4326,,1346,
+8680,1,4301,4326,,1347,
+8681,1,4301,4326,,1348,
+8682,1,4301,4326,,1349,
+8683,1,4301,4326,,1350,
+8684,1,4301,4326,,1351,
+8685,1,4301,4326,,1352,
+8686,1,4301,4326,,1353,
+8687,1,4301,4326,,1354,
+8688,1,4301,4326,,1355,
+8689,1,4301,4326,,1356,
+8690,1,4301,4326,,1357,
+8691,1,4301,4326,,1358,
+8692,1,4301,4326,,1359,
+8693,1,4301,4326,,1360,
+8694,1,4301,4326,,1361,
+8695,1,4301,4326,,1362,
+8696,1,4301,4326,,1363,
+8697,1,4301,4326,,1364,
+8698,1,4301,4326,,1365,
+8699,1,4301,4326,,1366,
+8700,1,4301,4326,,1367,
+8701,1,4301,4326,,1368,
+8702,1,4301,4326,,1369,
+8703,1,4301,4326,,1370,
+8704,1,4301,4326,,1371,
+8705,1,4301,4326,,1372,
+8706,1,4301,4326,,1373,
+8707,1,4301,4326,,1374,
+8708,1,4301,4326,,1375,
+8709,1,4301,4326,,1376,
+8710,1,4301,4326,,1377,
+8711,1,4301,4326,,1378,
+8712,1,4301,4326,,1379,
+8713,1,4301,4326,,1380,
+8714,1,4301,4326,,1381,
+8715,1,4301,4326,,1382,
+8716,1,4301,4326,,1383,
+8717,1,4301,4326,,1384,
+8718,1,4301,4326,,1385,
+8719,1,4301,4326,,1386,
+8720,1,4301,4326,,1387,
+8721,1,4301,4326,,1388,
+8722,1,4301,4326,,1389,
+8723,1,4301,4326,,1390,
+8724,1,4301,4326,,1391,
+8725,1,4301,4326,,1392,
+8726,1,4301,4326,,1393,
+8727,1,4301,4326,,1394,
+8728,1,4301,4326,,1395,
+8729,1,4301,4326,,1396,
+8730,1,4301,4326,,1397,
+8731,1,4301,4326,,1398,
+8732,1,4301,4326,,1399,
+8733,1,4301,4326,,1400,
+8734,1,4301,4326,,1401,
+8735,1,4301,4326,,1402,
+8736,1,4301,4326,,1403,
+8737,1,4301,4326,,1404,
+8738,1,4301,4326,,1405,
+8739,1,4301,4326,,1406,
+8740,1,4301,4326,,1407,
+8741,1,4301,4326,,1408,
+8742,1,4301,4326,,1409,
+8743,1,4301,4326,,1410,
+8744,1,4301,4326,,1411,
+8745,1,4301,4326,,1412,
+8746,1,4301,4326,,1413,
+8747,1,4301,4326,,1414,
+8748,1,4301,4326,,1415,
+8749,1,4301,4326,,1416,
+8750,1,4301,4326,,1417,
+8751,1,4301,4326,,1418,
+8752,1,4301,4326,,1419,
+8753,1,4301,4326,,1420,
+8754,1,4301,4326,,1421,
+8755,1,4301,4326,,1422,
+8756,1,4301,4326,,1423,
+8757,1,4301,4326,,1424,
+8758,1,4301,4326,,1425,
+8759,1,4301,4326,,1426,
+8760,1,4301,4326,,1427,
+8761,1,4301,4326,,1428,
+8762,1,4301,4326,,1429,
+8763,1,4301,4326,,1430,
+8764,1,4301,4326,,1431,
+8765,1,4301,4326,,1432,
+8766,1,4301,4326,,1433,
+8767,1,4301,4326,,1434,
+8768,1,4301,4326,,1435,
+8769,1,4301,4326,,1436,
+8770,1,4232,4326,,1438,
+8771,1,4134,4326,,1439,
+8772,1,4230,4326,,1440,
+8773,1,4601,4326,,1441,
+8774,1,4602,4326,,1442,
+8775,1,4603,4326,,1443,
+8776,1,4604,4326,,1444,
+8777,1,4605,4326,,1445,
+8778,1,4606,4326,,1446,
+8779,1,4600,4326,,1447,
+8780,1,4124,4258,,1437,
+8784,1,4230,4326,,1450,
+8785,1,4135,4269,,1454,
+8786,1,4135,4269,,1454,
+8786,2,4269,4326,,1188,
+8787,1,4136,4269,,1455,
+8788,1,4136,4269,,1455,
+8788,2,4269,4326,,1188,
+8789,1,4137,4269,,1456,
+8790,1,4137,4269,,1456,
+8790,2,4269,4326,,1188,
+8791,1,4138,4269,,1457,
+8792,1,4138,4269,,1457,
+8792,2,4269,4326,,1188,
+8793,1,4609,4269,,1451,
+8794,1,4609,4269,,1451,
+8794,2,4269,4326,,1188,
+8795,1,4202,4283,,1458,
+8796,1,4202,4283,,1458,
+8796,2,4283,4326,,1150,
+8797,1,4202,4283,,1459,
+8798,1,4202,4283,,1459,
+8798,2,4283,4326,,1150,
+8799,1,4202,4283,,1460,
+8800,1,4202,4283,,1460,
+8800,2,4283,4326,,1150,
+8801,1,4139,4269,,1461,
+8802,1,4139,4269,,1461,
+8802,2,4269,4326,,1188,
+8803,1,4267,4269,,1462,
+8804,1,4267,4269,,1462,
+8804,2,4269,4326,,1188,
+8805,1,4608,4269,,1463,
+8806,1,4608,4269,,1463,
+8806,2,4269,4326,,1188,
+8807,1,4202,4283,,1464,
+8808,1,4202,4283,,1464,
+8808,2,4283,4326,,1150,
+8811,1,4817,4273,,1466,
+8812,1,4807,4275,,1468,
+8813,1,4142,4326,,1469,
+8814,1,4143,4326,,1470,
+8815,1,4312,4326,,1471,
+8816,1,4122,4140,,1472,
+8817,1,4140,4326,,1473,
+8818,1,4122,4140,,1472,
+8818,2,4140,4326,,1473,
+8819,1,4269,4152,,1474,
+8820,1,4269,4152,,1475,
+8821,1,4269,4152,,1476,
+8822,1,4269,4152,,1477,
+8823,1,4269,4152,,1478,
+8824,1,4269,4152,,1479,
+8825,1,4269,4152,,1480,
+8826,1,4269,4152,,1481,
+8827,1,4269,4152,,1482,
+8828,1,4269,4152,,1483,
+8829,1,4269,4152,,1484,
+8830,1,4269,4152,,1485,
+8831,1,4269,4152,,1486,
+8832,1,4269,4152,,1487,
+8833,1,4269,4152,,1488,
+8834,1,4269,4152,,1489,
+8835,1,4269,4152,,1490,
+8836,1,4269,4152,,1491,
+8837,1,4269,4152,,1492,
+8838,1,4269,4152,,1493,
+8839,1,4269,4152,,1494,
+8840,1,4269,4152,,1495,
+8841,1,4269,4152,,1496,
+8842,1,4269,4152,,1497,
+8843,1,4269,4152,,1498,
+8844,1,4269,4152,,1499,
+8845,1,4269,4152,,1500,
+8846,1,4269,4152,,1501,
+8847,1,4269,4152,,1502,
+8848,1,4269,4152,,1503,
+8849,1,4222,4148,,1504,
+8850,1,4148,4326,,1505,
+8851,1,4202,4283,,1506,
+8852,1,4202,4283,,1507,
+8853,1,4202,4283,,1506,
+8853,2,4283,4326,,1150,
+8854,1,4202,4283,,1507,
+8854,2,4283,4326,,1150,
+8855,1,4149,4326,,1508,
+8856,1,4150,4151,,1509,
+8857,1,4150,4151,,1509,
+8857,2,4151,4326,,1511,
+8858,1,4149,4326,,1510,
+8859,1,4151,4326,,1511,
+8860,1,4267,4269,,1241,
+8860,2,4269,4152,,1474,
+8861,1,4267,4269,,1241,
+8861,2,4269,4152,,1475,
+8862,1,4267,4269,,1241,
+8862,2,4269,4152,,1476,
+8863,1,4267,4269,,1241,
+8863,2,4269,4152,,1477,
+8864,1,4267,4269,,1241,
+8864,2,4269,4152,,1478,
+8865,1,4267,4269,,1241,
+8865,2,4269,4152,,1479,
+8866,1,4267,4269,,1241,
+8866,2,4269,4152,,1480,
+8867,1,4267,4269,,1241,
+8867,2,4269,4152,,1481,
+8868,1,4267,4269,,1241,
+8868,2,4269,4152,,1482,
+8869,1,4267,4269,,1241,
+8869,2,4269,4152,,1483,
+8870,1,4267,4269,,1241,
+8870,2,4269,4152,,1484,
+8871,1,4267,4269,,1241,
+8871,2,4269,4152,,1485,
+8872,1,4267,4269,,1241,
+8872,2,4269,4152,,1486,
+8873,1,4267,4269,,1241,
+8873,2,4269,4152,,1487,
+8874,1,4267,4269,,1241,
+8874,2,4269,4152,,1488,
+8875,1,4267,4269,,1241,
+8875,2,4269,4152,,1489,
+8876,1,4267,4269,,1241,
+8876,2,4269,4152,,1490,
+8877,1,4267,4269,,1241,
+8877,2,4269,4152,,1491,
+8878,1,4267,4269,,1241,
+8878,2,4269,4152,,1492,
+8879,1,4267,4269,,1241,
+8879,2,4269,4152,,1493,
+8880,1,4267,4269,,1241,
+8880,2,4269,4152,,1494,
+8881,1,4139,4269,,1461,
+8881,2,4269,4152,,1495,
+8882,1,4267,4269,,1241,
+8882,2,4269,4152,,1496,
+8883,1,4267,4269,,1241,
+8883,2,4269,4152,,1497,
+8884,1,4267,4269,,1241,
+8884,2,4269,4152,,1498,
+8885,1,4267,4269,,1241,
+8885,2,4269,4152,,1499,
+8886,1,4267,4269,,1241,
+8886,2,4269,4152,,1500,
+8887,1,4267,4269,,1241,
+8887,2,4269,4152,,1501,
+8888,1,4267,4269,,1241,
+8888,2,4269,4152,,1502,
+8889,1,4267,4269,,1241,
+8889,2,4269,4152,,1503,
+8890,1,4153,4326,,1512,
+8891,1,4132,4326,,1513,
+8892,1,4154,4326,,1514,
+8893,1,4269,4326,,1308,
+8894,1,4269,4326,,1515,
+8895,1,4247,4326,,1516,
+8896,1,4267,4269,,1241,
+8896,2,4269,4326,,1515,
+8897,1,4267,4269,,1243,
+8897,2,4269,4326,,1515,
diff --git a/src/tiff/csv/unit_of_measure.csv b/src/tiff/csv/unit_of_measure.csv
new file mode 100644
index 0000000..805d97c
--- /dev/null
+++ b/src/tiff/csv/unit_of_measure.csv
@@ -0,0 +1,64 @@
+"UOM_CODE","UNIT_OF_MEAS_NAME","UNIT_OF_MEAS_TYPE","TARGET_UOM_CODE","FACTOR_B","FACTOR_C","REMARKS","INFORMATION_SOURCE","DATA_SOURCE","REVISION_DATE","CHANGE_ID","DEPRECATED"
+9001,metre,length,9001,1.0,1.0,Also known as International metre.,ISO 1000.,EPSG,1995-06-02 00:00:00,,0
+9002,foot,length,9001,0.3048,1.0,,ISO; 1958,EPSG,1995-06-02 00:00:00,,0
+9003,US survey foot,length,9001,12.0,39.37,Used in USA.,EPSG,EPSG,2000-05-07 00:00:00,99.99,0
+9005,Clarke's foot,length,9001,0.304797265,1.0,"Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group  www.auslig.gov.au/geodesy/histry.htm,EPSG,2001-01-21 00:00:00,97.234 99.99  2000.05,0
+9014,fathom,length,9001,1.8288,1.0,= 6 feet.,,EPSG,1995-06-02 00:00:00,,0
+9030,nautical mile,length,9001,1852.0,1.0,,,EPSG,1996-10-18 00:00:00,96.24,0
+9031,German legal metre,length,9001,1.0000135965,1.0,Used in Namibia.,Chief Directorate Surveys and Land Information; Mowbray; South Africa,EPSG,1997-06-16 00:00:00,,0
+9033,US survey chain,length,9001,792.0,39.37,Used in USA primarily for public lands cadastral work.,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,2000-05-07 00:00:00,99.99,0
+9034,US survey link,length,9001,7.92,39.37,Used in USA primarily for public lands cadastral work.,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,2000-05-07 00:00:00,99.99,0
+9035,US survey mile,length,9001,63360.0,39.37,Used in USA primarily for public lands cadastral work.,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,2000-05-07 00:00:00,99.99,0
+9036,kilometre,length,9001,1000.0,1.0,,ISO 1000.,EPSG,1998-11-11 00:00:00,,0
+9037,Clarke's yard,length,9001,0.914391795,1.0,"=3 Clarke's feet.  Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group  www.auslig.gov.au/geodesy/histry.htm,EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9038,Clarke's chain,length,9001,20.11661949,1.0,"=22 Clarke's yards.  Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group  www.auslig.gov.au/geodesy/histry.htm,EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9039,Clarke's link,length,9001,0.2011661949,1.0,"=1/100 Clarke's chain. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",Australian Land Information Group  www.auslig.gov.au/geodesy/histry.htm,EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9040,British yard (Sears 1922),length,9001,36.0,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9041,British foot (Sears 1922),length,9001,12.0,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9042,British chain (Sears 1922),length,9001,792.0,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9043,British link (Sears 1922),length,9001,7.92,39.370147,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9050,British yard (Benoit 1895 A),length,9001,0.9143992,1.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9051,British foot (Benoit 1895 A),length,9001,0.9143992,3.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9052,British chain (Benoit 1895 A),length,9001,20.1167824,1.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9053,British link (Benoit 1895 A),length,9001,0.201167824,1.0,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9060,British yard (Benoit 1895 B),length,9001,36.0,39.370113,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.","G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9061,British foot (Benoit 1895 B),length,9001,12.0,39.370113,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9062,British chain (Benoit 1895 B),length,9001,792.0,39.370113,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,"G. Bomford ""Geodesy"" 2nd edition 1962; after J.S.Clark ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9063,British link (Benoit 1895 B),length,9001,7.92,39.370113,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,"G. Bomford; ""Geodesy""; 3rd edition 1975",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9070,British foot (1865),length,9001,0.9144025,3.0,Uses Clark's estimate of 1853-1865 British foot-metre ratio of 0.9144025 metres per yard.  Used in 1962 and 1975 estimates of Indian foot.,"J.S.Clark; ""Remeasurement of the Old Length Standards""; Empire Survey Review no. 90; 1953.",EPSG,2000-05-07 00:00:00,97.233  99.99,0
+9080,Indian foot,length,9001,12.0,39.370142,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9081,Indian foot (1937),length,9001,0.30479841,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British foot taken to be 1895 Benoit value of 12/39.370113m.  Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam.  Previously used in India and Pakistan but superseded.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9082,Indian foot (1962),length,9001,0.3047996,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m.  Used in Pakistan since metrication.,"G. Bomford; ""Geodesy""; 2nd edition 1962",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9083,Indian foot (1975),length,9001,0.3047995,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m.  Used in India since metrication.,"G. Bomford; ""Geodesy""; 3rd edition 1975",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9084,Indian yard,length,9001,36.0,39.370142,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9085,Indian yard (1937),length,9001,0.91439523,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British foot taken to be 1895 Benoit value of 12/39.370113m.  Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam.  Previously used in India and Pakistan but superseded.,"G. Bomford; ""The Re-adjustment of the Indian Triangulation""; Survey of India Professional Paper 28; 1939.",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9086,Indian yard (1962),length,9001,0.9143988,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m.  Used in Pakistan since metrication.,"G. Bomford; ""Geodesy""; 2nd edition 1962",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9087,Indian yard (1975),length,9001,0.9143985,1.0,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m.  Used in India since metrication.,"G. Bomford; ""Geodesy""; 3rd edition 1975",EPSG,2000-05-07 00:00:00,97.231  99.99,0
+9093,Statute mile,length,9001,1609.344,1.0,=5280 feet,EPSG,EPSG,2000-03-07 00:00:00,,0
+9094,Gold Coast foot,length,9001,6378300.0,20926201.0,"Used in Ghana and some adjacent parts of British west Africa prior to metrication, except for the metrication of projection defining parameters when British foot (Sears 1922) used.",Ordnance Survey International,EPSG,2001-01-21 00:00:00,2000.86,0
+9101,radian,angle,9101,1.0,1.0,SI standard unit.,ISO 1000.,EPSG,1995-06-02 00:00:00,,0
+9102,degree,angle,9101,3.14159265358979,180.0,=pi/180,,EPSG,1996-10-18 00:00:00,96.22,0
+9103,arc-minute,angle,9101,3.14159265358979,10800.0,1/60th degree.  =(pi/180) / 60,,EPSG,1996-10-18 00:00:00,96.22,0
+9104,arc-second,angle,9101,3.14159265358979,648000.0,1/60th arc-minute.  =(pi/180) / 3600,,EPSG,1996-10-18 00:00:00,96.22,0
+9105,grad,angle,9101,3.14159265358979,200.0,"=pi/200.  In France also abbreviated as ""gr"".",,EPSG,1996-10-18 00:00:00,96.22  99.05,0
+9106,gon,angle,9101,3.14159265358979,200.0,=pi/200,,EPSG,1996-10-18 00:00:00,96.22,0
+9107,degree minute second,angle,9101,,,"Format: sign - degrees (integer) - symbol - arc-minutes (integer) - symbol - arc-seconds (real, any precision). Different symbol sets are in use as separators for example � ' "". Convert to degrees using formula. Not recommended for data storage.",EPSG,EPSG,2002-07-13 00:00:00,96.19 2002.07,0
+9108,degree minute second hemisphere,angle,9101,,,Format: degrees (integer) - symbol - arc-minutes (integer) - symbol - arc-seconds (real) - symbol - hemisphere (single character N S E or W). Different symbol sets are in use as separators. Convert to deg using formula. Not recommended for data storage.,EPSG,EPSG,2002-07-13 00:00:00,96.19 2002.07,0
+9109,microradian,angle,9101,1.0,1000000.0,rad * 10E-6,ISO 1000.,EPSG,1996-10-18 00:00:00,99.05,0
+9110,sexagesimal DMS,angle,9101,,,Format: sign - degrees - decimal point - minutes (two digits) - integer seconds (two digits) - fraction of seconds (any precision). Must include leading zero in minutes and seconds and exclude decimal point for seconds. Convert to degrees using formula.,EPSG,EPSG,2002-07-13 00:00:00,2002.27,0
+9111,sexagesimal DM,angle,9101,,,Format: sign - degrees - decimal point - integer minutes (two digits) - fraction of minutes (any precision).  Must include leading zero in integer minutes.  Must exclude decimal point for minutes.  Convert to degrees using formula.  Not recommended.,EPSG,EPSG,2002-06-22 00:00:00,2002.07,0
+9112,centesimal minute,angle,9101,3.14159265358979,20000.0,1/100 of a grad and gon.  =(pi/200) / 100,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1999-10-20 00:00:00,98.48  99.51,0
+9113,centesimal second,angle,9101,3.14159265358979,2000000.0,"1/100 of a centesimal minute or 1/10,000th of a grad and gon.  =(pi/200) / 10000",http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1999-10-20 00:00:00,99.51,0
+9114,mil_6400,angle,9101,3.14159265358979,3200.0,Angle subtended by 1/6400 part of a circle.  Approximates to 1/1000th radian.  Note that other approximations (notably 1/6300 circle and 1/6000 circle) also exist.,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1999-10-20 00:00:00,99.51,0
+9115,degree minute,angle,9101,,,"Format: sign - degrees (integer) - symbol - arc-minutes (real, any precision) - symbol. Different symbol sets are in use as separators for example � '. Convert to degrees using formula. Not recommended for data storage.",EPSG,EPSG,2002-07-13 00:00:00,,0
+9201,unity,scale,9201,1.0,1.0,,,EPSG,1996-09-12 00:00:00,,0
+9202,parts per million,scale,9201,1.0,1000000.0,,,EPSG,1996-09-12 00:00:00,,0
+9203,coefficient,scale,9201,,,Used when parameters are coefficients.  They inherently take the units which depend upon the term to which the coefficient applies.,EPSG,EPSG,2000-03-07 00:00:00,,0
+9204,Bin width 330 US survey feet,length,9001,3960.0,39.37,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9205,Bin width 165 US survey feet,length,9001,1980.0,39.37,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9206,Bin width 82.5 US survey feet,length,9001,990.0,39.37,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9207,Bin width 37.5 metres,length,9001,37.5,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9208,Bin width 25 metres,length,9001,25.0,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9209,Bin width 12.5 metres,length,9001,12.5,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9210,Bin width 6.25 metres,length,9001,6.25,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
+9211,Bin width 3.125 metres,length,9001,3.125,1.0,,EPSG,EPSG,2000-10-19 00:00:00,2000.59,0
diff --git a/src/tiff/csv/uom_an_alias.c b/src/tiff/csv/uom_an_alias.c
new file mode 100644
index 0000000..59a31f8
--- /dev/null
+++ b/src/tiff/csv/uom_an_alias.c
@@ -0,0 +1,5 @@
+#include "defs.h"
+datafile_rows_t uom_an_alias_row_1[] = {"UOM_A_ALIAS_CODE","UOM_A_ALIAS_NAME","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_an_alias_row_2[] = {"9115","mil","9114","1999-04-22 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","Alias also applies to other variations of a mil, especially mil_6300 and mil_6000.","",NULL};
+
+datafile_rows_t *uom_an_alias_rows[] = {uom_an_alias_row_1,uom_an_alias_row_2,NULL};
diff --git a/src/tiff/csv/uom_an_alias.csv b/src/tiff/csv/uom_an_alias.csv
new file mode 100644
index 0000000..ee4178d
--- /dev/null
+++ b/src/tiff/csv/uom_an_alias.csv
@@ -0,0 +1,2 @@
+"UOM_A_ALIAS_CODE","UOM_A_ALIAS_NAME","UOM_ANGLE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9115,mil,9114,1999-04-22 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,"Alias also applies to other variations of a mil, especially mil_6300 and mil_6000.",
diff --git a/src/tiff/csv/uom_angle.c b/src/tiff/csv/uom_angle.c
new file mode 100644
index 0000000..b671957
--- /dev/null
+++ b/src/tiff/csv/uom_angle.c
@@ -0,0 +1,18 @@
+#include "defs.h"
+datafile_rows_t uom_angle_row_1[] = {"UOM_ANGLE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_ANGLE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_angle_row_2[] = {"9101","radian","","rad","","9101","1.0","1.0","1995-06-02 00:00:00","ISO 1000.","EPSG","SI standard unit.","",NULL};
+datafile_rows_t uom_angle_row_3[] = {"9102","degree","","deg","","9101","3.14159265358979","180.0","1996-10-18 00:00:00","","EPSG","=pi/180","96.22",NULL};
+datafile_rows_t uom_angle_row_4[] = {"9103","arc-minute","","min","","9101","3.14159265358979","10800.0","1996-10-18 00:00:00","","EPSG","1/60th degree.  =(pi/180) / 60","96.22",NULL};
+datafile_rows_t uom_angle_row_5[] = {"9104","arc-second","","sec","","9101","3.14159265358979","648000.0","1996-10-18 00:00:00","","EPSG","1/60th arc-minute.  =(pi/180) / 3600","96.22",NULL};
+datafile_rows_t uom_angle_row_6[] = {"9105","grad","","g","","9101","3.14159265358979","200.0","1996-10-18 00:00:00","","EPSG","=pi/200.  In France also abbreviated as \"gr\".","96.22  99.05",NULL};
+datafile_rows_t uom_angle_row_7[] = {"9106","gon","","","","9101","3.14159265358979","200.0","1996-10-18 00:00:00","","EPSG","=pi/200","96.22",NULL};
+datafile_rows_t uom_angle_row_8[] = {"9107","DMS","","","degree minute second","9101","","","1996-10-18 00:00:00","","EPSG","Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real).  Convert to degees using formula.","96.19",NULL};
+datafile_rows_t uom_angle_row_9[] = {"9108","DMSH","","","degree minute second hemisphere","9101","","","1996-10-18 00:00:00","","EPSG","Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real) - hemisphere (single character N S E or W).  Convert to degrees using formula.","96.19",NULL};
+datafile_rows_t uom_angle_row_10[] = {"9109","microradian","","�rad","rad * 10E-6","9101","1.0","1000000.0","1996-10-18 00:00:00","ISO 1000.","EPSG","","99.05",NULL};
+datafile_rows_t uom_angle_row_11[] = {"9110","DDD.MMSSsss","","","sexagesimal degrees","9101","","","1996-10-18 00:00:00","","EPSG","Format: degrees - decimal point - minutes (two digits) - integer seconds (two digits) - fraction of seconds (any precision).  Must include leading zero in minutes and seconds.  Must exclude decimal point for seconds.  Convert to degrees using formula.","",NULL};
+datafile_rows_t uom_angle_row_12[] = {"9111","DDD.MMm","","","degrees and decimal minutes","9101","","","1999-04-22 00:00:00","","EPSG","Format: degrees - decimal point - integer minutes (two digits) - fraction of minutes.  Must include leading zero in integer minutes.  Must exclude decimal point for minutes.  Any precision of minutes are allowed.  Convert to degrees using formula.","",NULL};
+datafile_rows_t uom_angle_row_13[] = {"9112","centesimal minute","","c","","9101","3.14159265358979","20000.0","1999-10-20 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","1/100 of a grad and gon.  =(pi/200) / 100","98.48  99.51",NULL};
+datafile_rows_t uom_angle_row_14[] = {"9113","centesimal second","","cc","","9101","3.14159265358979","2000000.0","1999-10-20 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","1/100 of a centesimal minute or 1/10,000th of a grad and gon.  =(pi/200) / 10000","99.51",NULL};
+datafile_rows_t uom_angle_row_15[] = {"9114","mil_6400","","mil","Angle subtended by 1/6400 part of a circle","9101","3.14159265358979","3200.0","1999-10-20 00:00:00","http://www.geodesy.matav.hu/xgonmil.htm","EPSG","Angle subtended by 1/6400 part of a circle.  Approximates to 1/1000th radian.  Note that other approximations (notably 1/6300 circle and 1/6000 circle) also exist.","99.51",NULL};
+
+datafile_rows_t *uom_angle_rows[] = {uom_angle_row_1,uom_angle_row_2,uom_angle_row_3,uom_angle_row_4,uom_angle_row_5,uom_angle_row_6,uom_angle_row_7,uom_angle_row_8,uom_angle_row_9,uom_angle_row_10,uom_angle_row_11,uom_angle_row_12,uom_angle_row_13,uom_angle_row_14,uom_angle_row_15,NULL};
diff --git a/src/tiff/csv/uom_angle.csv b/src/tiff/csv/uom_angle.csv
new file mode 100644
index 0000000..5fa6a4a
--- /dev/null
+++ b/src/tiff/csv/uom_angle.csv
@@ -0,0 +1,15 @@
+"UOM_ANGLE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_ANGLE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9101,radian,,rad,,9101,1.0,1.0,1995-06-02 00:00:00,ISO 1000.,EPSG,SI standard unit.,
+9102,degree,,deg,,9101,3.14159265358979,180.0,1996-10-18 00:00:00,,EPSG,=pi/180,96.22
+9103,arc-minute,,min,,9101,3.14159265358979,10800.0,1996-10-18 00:00:00,,EPSG,1/60th degree.  =(pi/180) / 60,96.22
+9104,arc-second,,sec,,9101,3.14159265358979,648000.0,1996-10-18 00:00:00,,EPSG,1/60th arc-minute.  =(pi/180) / 3600,96.22
+9105,grad,,g,,9101,3.14159265358979,200.0,1996-10-18 00:00:00,,EPSG,"=pi/200.  In France also abbreviated as \"gr\".",96.22  99.05
+9106,gon,,,,9101,3.14159265358979,200.0,1996-10-18 00:00:00,,EPSG,=pi/200,96.22
+9107,DMS,,,degree minute second,9101,,,1996-10-18 00:00:00,,EPSG,Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real).  Convert to degees using formula.,96.19
+9108,DMSH,,,degree minute second hemisphere,9101,,,1996-10-18 00:00:00,,EPSG,Format: degrees (integer) - space - arc-minutes (integer) - space - arc-seconds (real) - hemisphere (single character N S E or W).  Convert to degrees using formula.,96.19
+9109,microradian,,�rad,rad * 10E-6,9101,1.0,1000000.0,1996-10-18 00:00:00,ISO 1000.,EPSG,,99.05
+9110,DDD.MMSSsss,,,sexagesimal degrees,9101,,,1996-10-18 00:00:00,,EPSG,Format: degrees - decimal point - minutes (two digits) - integer seconds (two digits) - fraction of seconds (any precision).  Must include leading zero in minutes and seconds.  Must exclude decimal point for seconds.  Convert to degrees using formula.,
+9111,DDD.MMm,,,degrees and decimal minutes,9101,,,1999-04-22 00:00:00,,EPSG,Format: degrees - decimal point - integer minutes (two digits) - fraction of minutes.  Must include leading zero in integer minutes.  Must exclude decimal point for minutes.  Any precision of minutes are allowed.  Convert to degrees using formula.,
+9112,centesimal minute,,c,,9101,3.14159265358979,20000.0,1999-10-20 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,1/100 of a grad and gon.  =(pi/200) / 100,98.48  99.51
+9113,centesimal second,,cc,,9101,3.14159265358979,2000000.0,1999-10-20 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,"1/100 of a centesimal minute or 1/10,000th of a grad and gon.  =(pi/200) / 10000",99.51
+9114,mil_6400,,mil,Angle subtended by 1/6400 part of a circle,9101,3.14159265358979,3200.0,1999-10-20 00:00:00,http://www.geodesy.matav.hu/xgonmil.htm,EPSG,Angle subtended by 1/6400 part of a circle.  Approximates to 1/1000th radian.  Note that other approximations (notably 1/6300 circle and 1/6000 circle) also exist.,99.51
diff --git a/src/tiff/csv/uom_le_alias.c b/src/tiff/csv/uom_le_alias.c
new file mode 100644
index 0000000..3f7404b
--- /dev/null
+++ b/src/tiff/csv/uom_le_alias.c
@@ -0,0 +1,27 @@
+#include "defs.h"
+datafile_rows_t uom_le_alias_row_1[] = {"UOM_L_ALIAS_CODE","UOM_L_ALIAS_NAME","UOM_LENGTH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_le_alias_row_2[] = {"9015","International nautical mile","9030","1996-10-18 00:00:00","","EPSG","","9624",NULL};
+datafile_rows_t uom_le_alias_row_3[] = {"9016","meter","9001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_4[] = {"9018","International foot","9002","1995-06-02 00:00:00","ISO 1958.","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_5[] = {"9019","American foot","9003","1995-06-02 00:00:00","","EPSG","Used in USA.","",NULL};
+datafile_rows_t uom_le_alias_row_6[] = {"9020","Cape foot","9005","1995-06-02 00:00:00","","EPSG","Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre.   Used in southern African & Jamaica mapping.","",NULL};
+datafile_rows_t uom_le_alias_row_7[] = {"9022","Indian geodetic foot","9080","1995-06-02 00:00:00","","EPSG","Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be J.S.Clarke 1865 value of 0.9144025 metres.","97.23",NULL};
+datafile_rows_t uom_le_alias_row_8[] = {"9023","link (Clarke's ratio)","9039","1999-10-20 00:00:00","","EPSG","Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre.  Used in Trinidad and Tobago mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_9[] = {"9024","link","9063","1999-10-20 00:00:00","","EPSG","Used in West Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_10[] = {"9025","link","9043","1999-10-20 00:00:00","","EPSG","Used in East Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_11[] = {"9026","chain","9062","1999-10-20 00:00:00","","EPSG","Used in West Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_12[] = {"9027","chain","9042","1999-10-20 00:00:00","","EPSG","Used in East Malaysian mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_13[] = {"9028","yard","9040","1999-10-20 00:00:00","","EPSG","Used in older New Zealand mapping.","97.231",NULL};
+datafile_rows_t uom_le_alias_row_14[] = {"9029","yard","9085","1999-10-20 00:00:00","","EPSG","= 3 Indian feet.","97.23",NULL};
+datafile_rows_t uom_le_alias_row_15[] = {"9044","foot","9041","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_16[] = {"9054","chain","9052","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_17[] = {"9055","foot","9051","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_18[] = {"9056","link","9053","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_19[] = {"9057","yard","9050","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_20[] = {"9064","foot","9061","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_21[] = {"9065","yard","9060","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_22[] = {"9071","foot","9070","1999-10-20 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_le_alias_row_23[] = {"9088","Indian geodetic foot","9081","1999-10-20 00:00:00","","EPSG","Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be Benoit's 1885 value of 0.9144992 metres.","",NULL};
+datafile_rows_t uom_le_alias_row_24[] = {"9090","yard","9084","1999-10-20 00:00:00","","EPSG","= 3 Indian feet.","97.23",NULL};
+
+datafile_rows_t *uom_le_alias_rows[] = {uom_le_alias_row_1,uom_le_alias_row_2,uom_le_alias_row_3,uom_le_alias_row_4,uom_le_alias_row_5,uom_le_alias_row_6,uom_le_alias_row_7,uom_le_alias_row_8,uom_le_alias_row_9,uom_le_alias_row_10,uom_le_alias_row_11,uom_le_alias_row_12,uom_le_alias_row_13,uom_le_alias_row_14,uom_le_alias_row_15,uom_le_alias_row_16,uom_le_alias_row_17,uom_le_alias_row_18,uom_le_alias_row_19,uom_le_alias_row_20,uom_le_alias_row_21,uom_le_alias_row_22,uom_le_alias_row_23,u [...]
diff --git a/src/tiff/csv/uom_le_alias.csv b/src/tiff/csv/uom_le_alias.csv
new file mode 100644
index 0000000..7bb11ea
--- /dev/null
+++ b/src/tiff/csv/uom_le_alias.csv
@@ -0,0 +1,24 @@
+"UOM_L_ALIAS_CODE","UOM_L_ALIAS_NAME","UOM_LENGTH_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9015,International nautical mile,9030,1996-10-18 00:00:00,,EPSG,,9624
+9016,meter,9001,1995-06-02 00:00:00,,EPSG,,
+9018,International foot,9002,1995-06-02 00:00:00,ISO 1958.,EPSG,,
+9019,American foot,9003,1995-06-02 00:00:00,,EPSG,Used in USA.,
+9020,Cape foot,9005,1995-06-02 00:00:00,,EPSG,Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre.   Used in southern African & Jamaica mapping.,
+9022,Indian geodetic foot,9080,1995-06-02 00:00:00,,EPSG,Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be J.S.Clarke 1865 value of 0.9144025 metres.,97.23
+9023,link (Clarke's ratio),9039,1999-10-20 00:00:00,,EPSG,Assumes Clarke's 1865 ratio of 1 French legal metre = 39.370432 imperial inches applies to the international metre.  Used in Trinidad and Tobago mapping.,97.231
+9024,link,9063,1999-10-20 00:00:00,,EPSG,Used in West Malaysian mapping.,97.231
+9025,link,9043,1999-10-20 00:00:00,,EPSG,Used in East Malaysian mapping.,97.231
+9026,chain,9062,1999-10-20 00:00:00,,EPSG,Used in West Malaysian mapping.,97.231
+9027,chain,9042,1999-10-20 00:00:00,,EPSG,Used in East Malaysian mapping.,97.231
+9028,yard,9040,1999-10-20 00:00:00,,EPSG,Used in older New Zealand mapping.,97.231
+9029,yard,9085,1999-10-20 00:00:00,,EPSG,= 3 Indian feet.,97.23
+9044,foot,9041,1999-10-20 00:00:00,,EPSG,,
+9054,chain,9052,1999-10-20 00:00:00,,EPSG,,
+9055,foot,9051,1999-10-20 00:00:00,,EPSG,,
+9056,link,9053,1999-10-20 00:00:00,,EPSG,,
+9057,yard,9050,1999-10-20 00:00:00,,EPSG,,
+9064,foot,9061,1999-10-20 00:00:00,,EPSG,,
+9065,yard,9060,1999-10-20 00:00:00,,EPSG,,
+9071,foot,9070,1999-10-20 00:00:00,,EPSG,,
+9088,Indian geodetic foot,9081,1999-10-20 00:00:00,,EPSG,Indian Foot = 0.9999566 British feet (A.R.Clarke). British yard (=3 feet) taken to be Benoit's 1885 value of 0.9144992 metres.,
+9090,yard,9084,1999-10-20 00:00:00,,EPSG,= 3 Indian feet.,97.23
diff --git a/src/tiff/csv/uom_length.c b/src/tiff/csv/uom_length.c
new file mode 100644
index 0000000..9f13b1e
--- /dev/null
+++ b/src/tiff/csv/uom_length.c
@@ -0,0 +1,39 @@
+#include "defs.h"
+datafile_rows_t uom_length_row_1[] = {"UOM_LENGTH_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_LENGTH_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_length_row_2[] = {"9001","metre","","m","","9001","1.0","1.0","1995-06-02 00:00:00","ISO 1000.","EPSG","Also known as International metre.","",NULL};
+datafile_rows_t uom_length_row_3[] = {"9002","foot","","ft","","9001","0.3048","1.0","1995-06-02 00:00:00","ISO; 1958","EPSG","","",NULL};
+datafile_rows_t uom_length_row_4[] = {"9003","US survey foot","","ft US","","9001","12.0","39.37","1995-06-02 00:00:00","","EPSG","Used in USA.","",NULL};
+datafile_rows_t uom_length_row_5[] = {"9005","Clarke's foot","","ft (Cla)","","9001","0.304797265","1.0","1999-10-20 00:00:00","Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm","EPSG","Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.","97.234",NULL};
+datafile_rows_t uom_length_row_6[] = {"9014","fathom","","f","","9001","1.8288","1.0","1999-10-20 00:00:00","","EPSG","= 6 feet.","",NULL};
+datafile_rows_t uom_length_row_7[] = {"9030","nautical mile","","NM","","9001","1852.0","1.0","1996-10-18 00:00:00","","EPSG","","96.24",NULL};
+datafile_rows_t uom_length_row_8[] = {"9031","German legal metre","","GLM","","9001","1.0000135965","1.0","1997-06-16 00:00:00","Chief Directorate Surveys and Land Information; Mowbray; South Africa","EPSG","Used in Namibia.","",NULL};
+datafile_rows_t uom_length_row_9[] = {"9033","US survey chain","","ch US","","9001","792.0","39.37","1998-03-12 00:00:00","Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).","EPSG","Used in USA primarily for public lands cadastral work.","",NULL};
+datafile_rows_t uom_length_row_10[] = {"9034","US survey link","","lk US","","9001","7.92","39.37","1998-03-12 00:00:00","Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).","EPSG","Used in USA primarily for public lands cadastral work.","",NULL};
+datafile_rows_t uom_length_row_11[] = {"9035","US survey mile","","mile US","","9001","63360.0","39.37","1998-03-12 00:00:00","Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).","EPSG","Used in USA primarily for public lands cadastral work.","",NULL};
+datafile_rows_t uom_length_row_12[] = {"9036","kilometre","","km","","9001","1000.0","1.0","1998-11-11 00:00:00","ISO 1000.","EPSG","","",NULL};
+datafile_rows_t uom_length_row_13[] = {"9037","Clarke's yard","","yd (Cla)","","9001","0.914391795","1.0","1999-10-20 00:00:00","Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm","EPSG","=3 Clarke's feet.  Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_14[] = {"9038","Clarke's chain","","ch (Cla)","","9001","20.11661949","1.0","1999-10-20 00:00:00","Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm","EPSG","=22 Clarke's yards.  Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_15[] = {"9039","Clarke's link","","lk (Cla)","","9001","0.2011661949","1.0","1999-10-20 00:00:00","Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm","EPSG","=1/100 Clarke's chain. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_16[] = {"9040","British yard (Sears 1922)","","yd (Sears)","","9001","36.0","39.370147","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_17[] = {"9041","British foot (Sears 1922)","","ft (Sears)","","9001","12.0","39.370147","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_18[] = {"9042","British chain (Sears 1922)","","ch (Sears)","","9001","792.0","39.370147","1999-10-20 00:00:00","\"Geodesy\"; G. Bomford.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_19[] = {"9043","British link (Sears 1922)","","lk (Sears)","","9001","7.92","39.370147","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_20[] = {"9050","British yard (Benoit 1895 A)","","yd (Ben A)","","9001","0.9143992","1.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_21[] = {"9051","British foot (Benoit 1895 A)","","ft (Ben A)","","9001","0.9143992","3.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_22[] = {"9052","British chain (Benoit 1895 A)","","ch (Ben A)","","9001","20.1167824","1.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_23[] = {"9053","British link (Benoit 1895 A)","","lk (Ben A)","","9001","0.201167824","1.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.","97.233",NULL};
+datafile_rows_t uom_length_row_24[] = {"9060","British yard (Benoit 1895 B)","","yd (Ben B)","","9001","36.0","39.370113","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_25[] = {"9061","British foot (Benoit 1895 B)","","ft (Ben B)","","9001","12.0","39.370113","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_26[] = {"9062","British chain (Benoit 1895 B)","","ch (Ben B)","","9001","792.0","39.370113","1999-10-20 00:00:00","G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_27[] = {"9063","British link (Benoit 1895 B)","","lk (Ben B)","","9001","7.92","39.370113","1999-10-20 00:00:00","\"Geodesy\"; G. Bomford.","EPSG","Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.","97.233",NULL};
+datafile_rows_t uom_length_row_28[] = {"9070","British foot (1865)","","ft (1865)","","9001","0.9144025","3.0","1999-10-20 00:00:00","J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.","EPSG","Uses Clark's estimate of 1853-1865 British foot-metre ratio of 0.9144025 metres per yard.  Used in 1962 and 1975 estimates of Indian foot.","97.233",NULL};
+datafile_rows_t uom_length_row_29[] = {"9080","Indian foot","","Ind ft (Cla)","","9001","12.0","39.370142","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.","97.231",NULL};
+datafile_rows_t uom_length_row_30[] = {"9081","Indian foot (1937)","","Ind ft (37)","","9001","0.30479841","1.0","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British foot taken to be 1895 Benoit value of 12/39.370113m.  Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam.  Previously used in India and Pakistan but  [...]
+datafile_rows_t uom_length_row_31[] = {"9082","Indian foot (1962)","","Ind ft (62)","","9001","0.3047996","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 2nd edition 1962","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m.  Used in Pakistan since metrication.","97.231",NULL};
+datafile_rows_t uom_length_row_32[] = {"9083","Indian foot (1975)","","Ind ft (75)","","9001","0.3047995","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 3rd edition 1975","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m.  Used in India since metrication.","97.231",NULL};
+datafile_rows_t uom_length_row_33[] = {"9084","Indian yard","","Ind yd (Cla)","","9001","36.0","39.370142","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.","97.231",NULL};
+datafile_rows_t uom_length_row_34[] = {"9085","Indian yard (1937)","","Ind yd (37)","","9001","0.91439523","1.0","1999-10-20 00:00:00","G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British foot taken to be 1895 Benoit value of 12/39.370113m.  Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam.  Previously used in India and Pakistan but  [...]
+datafile_rows_t uom_length_row_35[] = {"9086","Indian yard (1962)","","Ind yd (62)","","9001","0.9143988","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 2nd edition 1962","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m.  Used in Pakistan since metrication.","97.231",NULL};
+datafile_rows_t uom_length_row_36[] = {"9087","Indian yard (1975)","","Ind yd (75)","","9001","0.9143985","1.0","1999-10-20 00:00:00","G. Bomford; \"Geodesy\"; 3rd edition 1975","EPSG","Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m.  Used in India since metrication.","97.231",NULL};
+
+datafile_rows_t *uom_length_rows[] = {uom_length_row_1,uom_length_row_2,uom_length_row_3,uom_length_row_4,uom_length_row_5,uom_length_row_6,uom_length_row_7,uom_length_row_8,uom_length_row_9,uom_length_row_10,uom_length_row_11,uom_length_row_12,uom_length_row_13,uom_length_row_14,uom_length_row_15,uom_length_row_16,uom_length_row_17,uom_length_row_18,uom_length_row_19,uom_length_row_20,uom_length_row_21,uom_length_row_22,uom_length_row_23,uom_length_row_24,uom_length_row_25,uom_length_ro [...]
diff --git a/src/tiff/csv/uom_length.csv b/src/tiff/csv/uom_length.csv
new file mode 100644
index 0000000..c8c77dd
--- /dev/null
+++ b/src/tiff/csv/uom_length.csv
@@ -0,0 +1,36 @@
+"UOM_LENGTH_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_LENGTH_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9001,metre,,m,,9001,1.0,1.0,1995-06-02 00:00:00,ISO 1000.,EPSG,Also known as International metre.,
+9002,foot,,ft,,9001,0.3048,1.0,1995-06-02 00:00:00,ISO; 1958,EPSG,,
+9003,US survey foot,,ft US,,9001,12.0,39.37,1995-06-02 00:00:00,,EPSG,Used in USA.,
+9005,Clarke's foot,,ft (Cla),,9001,0.304797265,1.0,1999-10-20 00:00:00,Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm,EPSG,"Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",97.234
+9014,fathom,,f,,9001,1.8288,1.0,1999-10-20 00:00:00,,EPSG,= 6 feet.,
+9030,nautical mile,,NM,,9001,1852.0,1.0,1996-10-18 00:00:00,,EPSG,,96.24
+9031,German legal metre,,GLM,,9001,1.0000135965,1.0,1997-06-16 00:00:00,Chief Directorate Surveys and Land Information; Mowbray; South Africa,EPSG,Used in Namibia.,
+9033,US survey chain,,ch US,,9001,792.0,39.37,1998-03-12 00:00:00,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,Used in USA primarily for public lands cadastral work.,
+9034,US survey link,,lk US,,9001,7.92,39.37,1998-03-12 00:00:00,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,Used in USA primarily for public lands cadastral work.,
+9035,US survey mile,,mile US,,9001,63360.0,39.37,1998-03-12 00:00:00,Bureau of Land Management technical bulletin 6 (1973) and Standard Field Tables 8th edition (1956).,EPSG,Used in USA primarily for public lands cadastral work.,
+9036,kilometre,,km,,9001,1000.0,1.0,1998-11-11 00:00:00,ISO 1000.,EPSG,,
+9037,Clarke's yard,,yd (Cla),,9001,0.914391795,1.0,1999-10-20 00:00:00,Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm,EPSG,"=3 Clarke's feet.  Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",97.233
+9038,Clarke's chain,,ch (Cla),,9001,20.11661949,1.0,1999-10-20 00:00:00,Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm,EPSG,"=22 Clarke's yards.  Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",97.233
+9039,Clarke's link,,lk (Cla),,9001,0.2011661949,1.0,1999-10-20 00:00:00,Australian Land Information Group  www.auslig.gov/au/geodesy/histry.htm,EPSG,"=1/100 Clarke's chain. Assumes Clarke's 1865 ratio of 1 British foot = 0.304797265 French legal metres applies to the international metre.   Used in older Australian, southern African & British West Indian mapping.",97.233
+9040,British yard (Sears 1922),,yd (Sears),,9001,36.0,39.370147,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,97.233
+9041,British foot (Sears 1922),,ft (Sears),,9001,12.0,39.370147,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,97.233
+9042,British chain (Sears 1922),,ch (Sears),,9001,792.0,39.370147,1999-10-20 00:00:00,"\"Geodesy\"; G. Bomford.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,97.233
+9043,British link (Sears 1922),,lk (Sears),,9001,7.92,39.370147,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Sear's 1922 British yard-metre ratio as given by Bomford as 39.370147 inches per metre.  Used in East Malaysian and older New Zealand mapping.,97.233
+9050,British yard (Benoit 1895 A),,yd (Ben A),,9001,0.9143992,1.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,97.233
+9051,British foot (Benoit 1895 A),,ft (Ben A),,9001,0.9143992,3.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,97.233
+9052,British chain (Benoit 1895 A),,ch (Ben A),,9001,20.1167824,1.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,97.233
+9053,British link (Benoit 1895 A),,lk (Ben A),,9001,0.201167824,1.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Clark as 0.9144992 metres per yard.  Used for deriving metric size of ellipsoid in Palestine.,97.233
+9060,British yard (Benoit 1895 B),,yd (Ben B),,9001,36.0,39.370113,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,97.233
+9061,British foot (Benoit 1895 B),,ft (Ben B),,9001,12.0,39.370113,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,97.233
+9062,British chain (Benoit 1895 B),,ch (Ben B),,9001,792.0,39.370113,1999-10-20 00:00:00,"G. Bomford \"Geodesy\" 2nd edition 1962; after J.S.Clark \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,97.233
+9063,British link (Benoit 1895 B),,lk (Ben B),,9001,7.92,39.370113,1999-10-20 00:00:00,"\"Geodesy\"; G. Bomford.",EPSG,Uses Benoit's 1895 British yard-metre ratio as given by Bomford as 39.370113 inches per metre.  Used in West Malaysian mapping.,97.233
+9070,British foot (1865),,ft (1865),,9001,0.9144025,3.0,1999-10-20 00:00:00,"J.S.Clark; \"Remeasurement of the Old Length Standards\"; Empire Survey Review no. 90; 1953.",EPSG,Uses Clark's estimate of 1853-1865 British foot-metre ratio of 0.9144025 metres per yard.  Used in 1962 and 1975 estimates of Indian foot.,97.233
+9080,Indian foot,,Ind ft (Cla),,9001,12.0,39.370142,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,97.231
+9081,Indian foot (1937),,Ind ft (37),,9001,0.30479841,1.0,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British foot taken to be 1895 Benoit value of 12/39.370113m.  Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam.  Previously used in India and Pakistan but superseded.,97.231
+9082,Indian foot (1962),,Ind ft (62),,9001,0.3047996,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 2nd edition 1962",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m.  Used in Pakistan since metrication.,97.231
+9083,Indian foot (1975),,Ind ft (75),,9001,0.3047995,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 3rd edition 1975",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m.  Used in India since metrication.,97.231
+9084,Indian yard,,Ind yd (Cla),,9001,36.0,39.370142,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (= 3 British feet) taken to be J.S.Clark's 1865 value of 0.9144025 metres.,97.231
+9085,Indian yard (1937),,Ind yd (37),,9001,0.91439523,1.0,1999-10-20 00:00:00,"G. Bomford; \"The Re-adjustment of the Indian Triangulation\"; Survey of India Professional Paper 28; 1939.",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British foot taken to be 1895 Benoit value of 12/39.370113m.  Rounded to 8 decimal places as 0.30479841. Used from Bangladesh to Vietnam.  Previously used in India and Pakistan but superseded.,97.231
+9086,Indian yard (1962),,Ind yd (62),,9001,0.9143988,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 2nd edition 1962",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures with a small error as 1 Ind ft=0.3048996m.  Used in Pakistan since metrication.,97.231
+9087,Indian yard (1975),,Ind yd (75),,9001,0.9143985,1.0,1999-10-20 00:00:00,"G. Bomford; \"Geodesy\"; 3rd edition 1975",EPSG,Indian Foot = 0.99999566 British feet (A.R.Clarke 1865).  British yard (3 feet) taken to be J.S. Clark's 1865 value of 0.9144025m. Rounded to 8 significant figures as 1 Ind ft=0.3048995m.  Used in India since metrication.,97.231
diff --git a/src/tiff/csv/uom_sc_alias.c b/src/tiff/csv/uom_sc_alias.c
new file mode 100644
index 0000000..e978f3f
--- /dev/null
+++ b/src/tiff/csv/uom_sc_alias.c
@@ -0,0 +1,4 @@
+#include "defs.h"
+datafile_rows_t uom_sc_alias_row_1[] = {"UOM_S_ALIAS_CODE","UOM_S_ALIAS_NAME","UOM_SCALE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+
+datafile_rows_t *uom_sc_alias_rows[] = {uom_sc_alias_row_1,NULL};
diff --git a/src/tiff/csv/uom_sc_alias.csv b/src/tiff/csv/uom_sc_alias.csv
new file mode 100644
index 0000000..e896d13
--- /dev/null
+++ b/src/tiff/csv/uom_sc_alias.csv
@@ -0,0 +1 @@
+"UOM_S_ALIAS_CODE","UOM_S_ALIAS_NAME","UOM_SCALE_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
diff --git a/src/tiff/csv/uom_scale.c b/src/tiff/csv/uom_scale.c
new file mode 100644
index 0000000..57883dc
--- /dev/null
+++ b/src/tiff/csv/uom_scale.c
@@ -0,0 +1,6 @@
+#include "defs.h"
+datafile_rows_t uom_scale_row_1[] = {"UOM_SCALE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_SCALE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t uom_scale_row_2[] = {"9201","unity","","","","9201","1.0","1.0","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t uom_scale_row_3[] = {"9202","parts per million","","ppm","","9201","1.0","1000000.0","1996-09-12 00:00:00","","EPSG","","",NULL};
+
+datafile_rows_t *uom_scale_rows[] = {uom_scale_row_1,uom_scale_row_2,uom_scale_row_3,NULL};
diff --git a/src/tiff/csv/uom_scale.csv b/src/tiff/csv/uom_scale.csv
new file mode 100644
index 0000000..e7bf8e1
--- /dev/null
+++ b/src/tiff/csv/uom_scale.csv
@@ -0,0 +1,3 @@
+"UOM_SCALE_CODE","UNIT_OF_MEAS_EPSG_NAME","UNIT_OF_MEAS_USER_NAME","ABBREVIATION","DESCRIPTION","TARGET_UOM_SCALE_CODE","FACTOR_B","FACTOR_C","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+9201,unity,,,,9201,1.0,1.0,1996-09-12 00:00:00,,EPSG,,
+9202,parts per million,,ppm,,9201,1.0,1000000.0,1996-09-12 00:00:00,,EPSG,,
diff --git a/src/tiff/csv/version_history.csv b/src/tiff/csv/version_history.csv
new file mode 100644
index 0000000..efc06cd
--- /dev/null
+++ b/src/tiff/csv/version_history.csv
@@ -0,0 +1,23 @@
+"VERSION_DATE","VERSION_NUMBER","VERSION_REMARKS","SUPERCEDED_BY","SUPERCEDES"
+1999-11-19 00:00:00,4.4,Version 4.4 release.,5.0,4.3
+1999-07-26 00:00:00,4.3,Version 4.3 release.,4.4,4.2
+1998-11-25 00:00:00,4.2,Version 4.2 release.,4.3,4.1
+1998-09-29 00:00:00,4.1,Version 4.1 release.,4.2,4.0
+1998-03-24 00:00:00,4.0,Version 4.0 release.  Access v7.,4.1,3.2
+1997-08-28 00:00:00,3.2,Version 3.2 release.,4.0,3.1
+1997-04-11 00:00:00,3.1,Version 3.1 release.,3.2,3.0
+1996-12-12 00:00:00,3.0,Version 3.0 release.  Access v2.,3.1,2.1
+1996-06-02 00:00:00,2.1,Version 2.1 release.  Excel v4.,3.0,
+2000-06-29 00:00:00,4.5,Version 4.5 release.,5.1,4.4
+2000-06-29 00:00:00,5.0,Version 5.0 release.  Access97,5.01,4.4
+2000-12-31 00:00:00,5.1,Version 5.1 release.,5.2,5.01
+2001-06-11 00:00:00,5.2,Version 5.2 release.,5.21,5.1
+2001-09-03 00:00:00,6.02,v6.02 release to EPSG wg and ISO 1927 project team.,6.1,
+1994-06-01 00:00:00,1.0,Version 1.0 release.  Excel v2.,,
+2000-07-09 00:00:00,5.01,Version 5.01 release.,5.1,5.0
+2001-06-26 00:00:00,5.21,Version 5.21 release.,6.1,5.2
+2002-02-21 00:00:00,5.3,Version 5.3 release. Same data as v6.1.,6.1,5.21
+2002-02-25 00:00:00,6.1,Version 6.1 release. ISO 19111 compliant data model and terminology.,6.2,5.21  6.02
+2002-07-31 00:00:00,6.2,Version 6.2 release.,6.2.1,5.3  6.1
+2002-09-05 00:00:00,6.2.1,v6.2 data; purged redundant Visual Basic code behind forms.,6.2.2,6.2
+2002-09-16 00:00:00,6.2.2,v6.2 data; purged further redundant Visual Basic code behind forms.,,6.2.1
diff --git a/src/tiff/csv/vert_cs.c b/src/tiff/csv/vert_cs.c
new file mode 100644
index 0000000..b323089
--- /dev/null
+++ b/src/tiff/csv/vert_cs.c
@@ -0,0 +1,31 @@
+#include "defs.h"
+datafile_rows_t vert_cs_row_1[] = {"VERTCS_CODE","VERTCS_EPSG_NAME","VERTCS_EPSG_ABBR","VERTCS_USER_NAME","DESCRIPTION","AREA_OF_USE","VERTCS_TYPE","VERTICAL_DATUM_CODE","VERTCS_AXIS_NAME","VERTCS_AXIS_ABBREV","VERTCS_AXIS_UOM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t vert_cs_row_2[] = {"5701","Newlyn","ODN","","","United Kingdom (UK) - Great Britain.","height system","5101","height","","9001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_3[] = {"5702","National Geodetic Vertical Datum of 1929","NGVD29","","","United States (USA).","height system","5102","height","","9003","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_4[] = {"5703","North American Vertical Datum of 1988","NAVD88","","","Canada;  United States (USA).","height system","5103","height","","9001","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_5[] = {"5704","Yellow Sea","","","","China.","height system","5104","height","","9001","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_6[] = {"5705","Baltic","","","","Armenia;  Azerbaijan;  Belorus;  Estonia;  Georgia;  Kazakstan;  Kirgizstan;  Latvia;  Lithuania;  Moldavia;  Russia;  Tadzhikistan;  Turkmenistan;  Ukraine;  Uzbekistan.","height system","5105","height","","9001","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_7[] = {"5706","Caspian","","","","Azerbaijan - offshore; Kazakhstan - offshore;  Russia - Caspian Sea;  Turkmenistan - offshore.","depth system","5106","depth","","9001","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_8[] = {"5709","Noormal Amsterdams Piel","NAP","","","Netherlands.","height system","5109","height","","9001","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_9[] = {"5710","Oostende","","","","Belgium.","height system","5110","height","","9001","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_10[] = {"5711","Australian Height Datum","AHD","","","Australia (New South Wales; Northern Territories; Queensland; South Australia; Western Australia; Victoria).","height system","5111","height","","9001","1996-09-12 00:00:00","http://www.auslig.gov.au/geodesy","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_11[] = {"5712","Australian Height Datum (Tasmania)","AHD (Tasmania)","","","Australia - Tasmania.","height system","5112","height","","9001","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_12[] = {"5713","Canadian Vertical Datum of 1928","CVD28","","","Canada.","height system","5114","height","","9001","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_13[] = {"5714","mean sea level height","msl height","","","","height system","5100","height","","9001","1996-04-12 00:00:00","","EPSG","Approximates geoid.  Not specific to any location or epoch.","",NULL};
+datafile_rows_t vert_cs_row_14[] = {"5715","mean sea level depth","msl depth","","","","depth system","5100","depth","","9001","1996-10-18 00:00:00","","EPSG","Approximates geoid.  Not specific to any location or epoch.","",NULL};
+datafile_rows_t vert_cs_row_15[] = {"5716","Piraeus","","","","Greece.","height system","5115","height","","9001","1997-06-16 00:00:00","Geodesy Department; Public Petroleum Corporation of Greece.","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_16[] = {"5717","N60","","","","Finland.","height system","5116","height","","9001","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","In use since 1968.","",NULL};
+datafile_rows_t vert_cs_row_17[] = {"5718","RH70","","","","Sweden","height system","5117","height","","9001","1997-11-13 00:00:00","National and Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_18[] = {"5719","NGF Lallemand","","","","France - mainland.","height system","5118","height","","9001","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","Generally but not entirely superceded by NGF IGN69 (code 5720).","",NULL};
+datafile_rows_t vert_cs_row_19[] = {"5720","NGF IGN69","","","","France - mainland.","height system","5119","height","","9001","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_20[] = {"5721","NGF IGN78","","","","France - Corsica.","height system","5120","height","","9001","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_21[] = {"5722","Maputo","","","","Mozambique.","height system","5121","height","","9001","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_22[] = {"5723","Japanese Standard Levelling Datum","Japan Levelling Datum","","","Japan","height system","5122","height","","9001","1999-04-22 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif","EPSG","","",NULL};
+datafile_rows_t vert_cs_row_23[] = {"5724","PDO Height Datum 1993","PHD93","","","Oman","height system","5123","height","","9001","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Supersedes Fahud vertical datum (code 5725) from 1993.","",NULL};
+datafile_rows_t vert_cs_row_24[] = {"5725","Fahud Height Datum 1993","","","","Oman","height system","5124","height","","9001","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Superseded by PHD93 (code 5724)  from 1993.","",NULL};
+datafile_rows_t vert_cs_row_25[] = {"5726","Ha Tien 1960","","","","Cambodia; Vietnam","height system","5125","height","","9001","1999-10-20 00:00:00","","EPSG","In Vietnam superseded by Hon Dau from 1992.","",NULL};
+datafile_rows_t vert_cs_row_26[] = {"5727","Hon Dau 1992","","","","Vietnam","height system","5126","height","","9001","1999-10-20 00:00:00","","EPSG","In Vietnam supersedes Ha Tien from 1992.","",NULL};
+datafile_rows_t vert_cs_row_27[] = {"5728","Landesnivellement 1902","LN02","","","Liechtenstein;  Switzerland.","height system","5127","height","","9001","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","To be superseded by LHN95 (code 5729).","",NULL};
+datafile_rows_t vert_cs_row_28[] = {"5729","Landeshohennetz 1995","LHN95","","","Liechtenstein;  Switzerland.","height system","5128","height","","9001","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","To supersede LN02 (code 5728).","",NULL};
+
+datafile_rows_t *vert_cs_rows[] = {vert_cs_row_1,vert_cs_row_2,vert_cs_row_3,vert_cs_row_4,vert_cs_row_5,vert_cs_row_6,vert_cs_row_7,vert_cs_row_8,vert_cs_row_9,vert_cs_row_10,vert_cs_row_11,vert_cs_row_12,vert_cs_row_13,vert_cs_row_14,vert_cs_row_15,vert_cs_row_16,vert_cs_row_17,vert_cs_row_18,vert_cs_row_19,vert_cs_row_20,vert_cs_row_21,vert_cs_row_22,vert_cs_row_23,vert_cs_row_24,vert_cs_row_25,vert_cs_row_26,vert_cs_row_27,vert_cs_row_28,NULL};
diff --git a/src/tiff/csv/vert_cs.csv b/src/tiff/csv/vert_cs.csv
new file mode 100644
index 0000000..edc345f
--- /dev/null
+++ b/src/tiff/csv/vert_cs.csv
@@ -0,0 +1,28 @@
+"VERTCS_CODE","VERTCS_EPSG_NAME","VERTCS_EPSG_ABBR","VERTCS_USER_NAME","DESCRIPTION","AREA_OF_USE","VERTCS_TYPE","VERTICAL_DATUM_CODE","VERTCS_AXIS_NAME","VERTCS_AXIS_ABBREV","VERTCS_AXIS_UOM_CODE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+5701,Newlyn,ODN,,,United Kingdom (UK) - Great Britain.,height system,5101,height,,9001,1995-06-02 00:00:00,,EPSG,,
+5702,National Geodetic Vertical Datum of 1929,NGVD29,,,United States (USA).,height system,5102,height,,9003,1996-10-18 00:00:00,,EPSG,,
+5703,North American Vertical Datum of 1988,NAVD88,,,Canada;  United States (USA).,height system,5103,height,,9001,1996-10-18 00:00:00,,EPSG,,
+5704,Yellow Sea,,,,China.,height system,5104,height,,9001,1995-06-02 00:00:00,,EPSG,,
+5705,Baltic,,,,Armenia;  Azerbaijan;  Belorus;  Estonia;  Georgia;  Kazakstan;  Kirgizstan;  Latvia;  Lithuania;  Moldavia;  Russia;  Tadzhikistan;  Turkmenistan;  Ukraine;  Uzbekistan.,height system,5105,height,,9001,1996-09-12 00:00:00,,EPSG,,
+5706,Caspian,,,,Azerbaijan - offshore; Kazakhstan - offshore;  Russia - Caspian Sea;  Turkmenistan - offshore.,depth system,5106,depth,,9001,1996-09-12 00:00:00,,EPSG,,
+5709,Noormal Amsterdams Piel,NAP,,,Netherlands.,height system,5109,height,,9001,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,,
+5710,Oostende,,,,Belgium.,height system,5110,height,,9001,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,,
+5711,Australian Height Datum,AHD,,,Australia (New South Wales; Northern Territories; Queensland; South Australia; Western Australia; Victoria).,height system,5111,height,,9001,1996-09-12 00:00:00,http://www.auslig.gov.au/geodesy,EPSG,,
+5712,Australian Height Datum (Tasmania),AHD (Tasmania),,,Australia - Tasmania.,height system,5112,height,,9001,1996-09-12 00:00:00,,EPSG,,
+5713,Canadian Vertical Datum of 1928,CVD28,,,Canada.,height system,5114,height,,9001,1996-12-12 00:00:00,,EPSG,,
+5714,mean sea level height,msl height,,,,height system,5100,height,,9001,1996-04-12 00:00:00,,EPSG,Approximates geoid.  Not specific to any location or epoch.,
+5715,mean sea level depth,msl depth,,,,depth system,5100,depth,,9001,1996-10-18 00:00:00,,EPSG,Approximates geoid.  Not specific to any location or epoch.,
+5716,Piraeus,,,,Greece.,height system,5115,height,,9001,1997-06-16 00:00:00,Geodesy Department; Public Petroleum Corporation of Greece.,EPSG,,
+5717,N60,,,,Finland.,height system,5116,height,,9001,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,In use since 1968.,
+5718,RH70,,,,Sweden,height system,5117,height,,9001,1997-11-13 00:00:00,National and Survey of Sweden,EPSG,,
+5719,NGF Lallemand,,,,France - mainland.,height system,5118,height,,9001,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,Generally but not entirely superceded by NGF IGN69 (code 5720).,
+5720,NGF IGN69,,,,France - mainland.,height system,5119,height,,9001,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,,
+5721,NGF IGN78,,,,France - Corsica.,height system,5120,height,,9001,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,,
+5722,Maputo,,,,Mozambique.,height system,5121,height,,9001,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,,
+5723,Japanese Standard Levelling Datum,Japan Levelling Datum,,,Japan,height system,5122,height,,9001,1999-04-22 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/image/heichoku2.gif,EPSG,,
+5724,PDO Height Datum 1993,PHD93,,,Oman,height system,5123,height,,9001,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Supersedes Fahud vertical datum (code 5725) from 1993.,
+5725,Fahud Height Datum 1993,,,,Oman,height system,5124,height,,9001,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Superseded by PHD93 (code 5724)  from 1993.,
+5726,Ha Tien 1960,,,,Cambodia; Vietnam,height system,5125,height,,9001,1999-10-20 00:00:00,,EPSG,In Vietnam superseded by Hon Dau from 1992.,
+5727,Hon Dau 1992,,,,Vietnam,height system,5126,height,,9001,1999-10-20 00:00:00,,EPSG,In Vietnam supersedes Ha Tien from 1992.,
+5728,Landesnivellement 1902,LN02,,,Liechtenstein;  Switzerland.,height system,5127,height,,9001,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,To be superseded by LHN95 (code 5729).,
+5729,Landeshohennetz 1995,LHN95,,,Liechtenstein;  Switzerland.,height system,5128,height,,9001,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,To supersede LN02 (code 5728).,
diff --git a/src/tiff/csv/vert_datum.c b/src/tiff/csv/vert_datum.c
new file mode 100644
index 0000000..29f3761
--- /dev/null
+++ b/src/tiff/csv/vert_datum.c
@@ -0,0 +1,32 @@
+#include "defs.h"
+datafile_rows_t vert_datum_row_1[] = {"VERTICAL_DATUM_CODE","VERT_DAT_EPSG_NAME","VERT_DAT_EPSG_ABBREV","VERT_DAT_USER_NAME","DESCRIPTION","VERT_DAT_TYPE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t vert_datum_row_2[] = {"5100","Mean Sea Level","msl","","","geoidal","1996-04-12 00:00:00","","EPSG","msl has geographic and temporal components.  Users are advised to not use this generic vertical datum but to define specific instances of msl based on knowledge of these components; for instance \"msl at xxx during 19yy\".","",NULL};
+datafile_rows_t vert_datum_row_3[] = {"5101","Ordnance Datum Newlyn","ODN","","","geoidal","1996-10-18 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_4[] = {"5102","National Geodetic Vertical Datum 1929","NGVD29","","","geoidal","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_5[] = {"5103","North American Vertical Datum 1988","NAVD88","","","geoidal","1996-09-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_6[] = {"5104","Yellow Sea 1956","Yellow Sea","","","geoidal","1995-06-02 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_7[] = {"5105","Baltic Sea","Baltic","","","geoidal","1996-09-12 00:00:00","","EPSG","Average water level at Kronshtadt","",NULL};
+datafile_rows_t vert_datum_row_8[] = {"5106","Caspian Sea","Caspian","","","geoidal","1996-09-12 00:00:00","","EPSG","Defined as -28.0m Baltic datum","",NULL};
+datafile_rows_t vert_datum_row_9[] = {"5107","Nivellement general de la France","NGF","","","geoidal","1996-04-12 00:00:00","","EPSG","Mean sea level at Marseille","",NULL};
+datafile_rows_t vert_datum_row_10[] = {"5109","Normaal Amsterdams Peil","NAP","","","geoidal","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_11[] = {"5110","Oostende","","","","geoidal","1996-09-12 00:00:00","Nederlandse Commissie voor Geodesie publication 30; 1993","EPSG","Mean low water during 1958","",NULL};
+datafile_rows_t vert_datum_row_12[] = {"5111","Australian Height Datum","AHD","","","geoidal","1996-09-12 00:00:00","http://www.auslig.gov.au/geodesy","EPSG","MSL 1966-68 at 30 gauges around coast.","",NULL};
+datafile_rows_t vert_datum_row_13[] = {"5112","Australian Height Datum (Tasmania)","AHD (Tasmania)","","","geoidal","1996-09-12 00:00:00","","EPSG","MSL 1972 at Hobart and Burnie.","",NULL};
+datafile_rows_t vert_datum_row_14[] = {"5113","Sea Level","","","","geoidal","1996-09-12 00:00:00","","EPSG","An unspecified local vertical datum not recommended for use.","",NULL};
+datafile_rows_t vert_datum_row_15[] = {"5114","Canadian Vertical Datum of 1928","CVD28","","","geoidal","1996-12-12 00:00:00","","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_16[] = {"5115","Piraeus Harbour 1986","Piraeus86","","","geoidal","1997-06-16 00:00:00","Geodesy Department; Public Pertoleum Corporation of Greece","EPSG","MSL determined during 1986.","",NULL};
+datafile_rows_t vert_datum_row_17[] = {"5116","Helsinki 1960","N60","","","geoidal","1997-07-22 00:00:00","www.nls.fi/maa/papers/kkj.html","EPSG","MSL at Helsinki during 1960.","",NULL};
+datafile_rows_t vert_datum_row_18[] = {"5117","Rikets hoghtsystem 1970","RH70","","","geoidal","1997-11-13 00:00:00","National Land Survey of Sweden","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_19[] = {"5118","Nivellement general de la France - Lalle","NGF - Lallemand","","","geoidal","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","Mean sea level at Marseille.","",NULL};
+datafile_rows_t vert_datum_row_20[] = {"5119","Nivellement general de la France - IGN69","NGF - IGN69","","","geoidal","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","Mean sea level at Marseille.","",NULL};
+datafile_rows_t vert_datum_row_21[] = {"5120","Nivellement general de la France - IGN78","NGF - IGN78","","","geoidal","1997-11-13 00:00:00","Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994","EPSG","","",NULL};
+datafile_rows_t vert_datum_row_22[] = {"5121","Maputo","","","","geoidal","1998-04-16 00:00:00","Direc��o Nacional de Geografia e Cadastral (DINAGECA).","EPSG","Mean sea level at Maputo.","",NULL};
+datafile_rows_t vert_datum_row_23[] = {"5122","Japanese Standard Levelling Datum 1949","JapanVD","","","geoidal","1999-04-22 00:00:00","Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html","EPSG","24.4140 metres above mean sea level Tokyo Bay.","",NULL};
+datafile_rows_t vert_datum_row_24[] = {"5123","PDO Height Datum 1993","PHD93","","","geoidal","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Misclosure between Muscat and Salalah less than .5 meters with differences from of up to 5 meters from old Fahud Datum.  The PHD93 adjustment was initially known as the Spine.  Supercedes Fahud Vertical Datum (Code 5124) from 1993.","",NULL};
+datafile_rows_t vert_datum_row_25[] = {"5124","Fahud Height Datum","","","","geoidal","1999-04-22 00:00:00","Petroleum Development Oman","EPSG","Superceded by PHD93 Datum (Code 5123) in 1993.  Based on reciprocal trigonometric heighting based on single MSL determination at Mina Al Fahal.","",NULL};
+datafile_rows_t vert_datum_row_26[] = {"5125","Ha Tien 1960","","","","geoidal","1999-10-20 00:00:00","","EPSG","In Vietnam replaced by Hon Dau in 1992.","",NULL};
+datafile_rows_t vert_datum_row_27[] = {"5126","Hon Dau 1992","","","","geoidal","1999-10-20 00:00:00","","EPSG","Supersedes Ha Tien in Vietnam.","",NULL};
+datafile_rows_t vert_datum_row_28[] = {"5127","Landesnivellement 1902","LN02","","","geoidal","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.","",NULL};
+datafile_rows_t vert_datum_row_29[] = {"5128","Landeshohennetz 1995","LHN95","","","geoidal","1999-10-20 00:00:00","Bundesamt f�r Landestopographie","EPSG","Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.","",NULL};
+
+datafile_rows_t *vert_datum_rows[] = {vert_datum_row_1,vert_datum_row_2,vert_datum_row_3,vert_datum_row_4,vert_datum_row_5,vert_datum_row_6,vert_datum_row_7,vert_datum_row_8,vert_datum_row_9,vert_datum_row_10,vert_datum_row_11,vert_datum_row_12,vert_datum_row_13,vert_datum_row_14,vert_datum_row_15,vert_datum_row_16,vert_datum_row_17,vert_datum_row_18,vert_datum_row_19,vert_datum_row_20,vert_datum_row_21,vert_datum_row_22,vert_datum_row_23,vert_datum_row_24,vert_datum_row_25,vert_datum_ro [...]
diff --git a/src/tiff/csv/vert_datum.csv b/src/tiff/csv/vert_datum.csv
new file mode 100644
index 0000000..5cec1f9
--- /dev/null
+++ b/src/tiff/csv/vert_datum.csv
@@ -0,0 +1,29 @@
+"VERTICAL_DATUM_CODE","VERT_DAT_EPSG_NAME","VERT_DAT_EPSG_ABBREV","VERT_DAT_USER_NAME","DESCRIPTION","VERT_DAT_TYPE","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+5100,Mean Sea Level,msl,,,geoidal,1996-04-12 00:00:00,,EPSG,"msl has geographic and temporal components.  Users are advised to not use this generic vertical datum but to define specific instances of msl based on knowledge of these components; for instance \"msl at xxx during 19yy\".",
+5101,Ordnance Datum Newlyn,ODN,,,geoidal,1996-10-18 00:00:00,,EPSG,,
+5102,National Geodetic Vertical Datum 1929,NGVD29,,,geoidal,1996-09-12 00:00:00,,EPSG,,
+5103,North American Vertical Datum 1988,NAVD88,,,geoidal,1996-09-12 00:00:00,,EPSG,,
+5104,Yellow Sea 1956,Yellow Sea,,,geoidal,1995-06-02 00:00:00,,EPSG,,
+5105,Baltic Sea,Baltic,,,geoidal,1996-09-12 00:00:00,,EPSG,Average water level at Kronshtadt,
+5106,Caspian Sea,Caspian,,,geoidal,1996-09-12 00:00:00,,EPSG,Defined as -28.0m Baltic datum,
+5107,Nivellement general de la France,NGF,,,geoidal,1996-04-12 00:00:00,,EPSG,Mean sea level at Marseille,
+5109,Normaal Amsterdams Peil,NAP,,,geoidal,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,,
+5110,Oostende,,,,geoidal,1996-09-12 00:00:00,Nederlandse Commissie voor Geodesie publication 30; 1993,EPSG,Mean low water during 1958,
+5111,Australian Height Datum,AHD,,,geoidal,1996-09-12 00:00:00,http://www.auslig.gov.au/geodesy,EPSG,MSL 1966-68 at 30 gauges around coast.,
+5112,Australian Height Datum (Tasmania),AHD (Tasmania),,,geoidal,1996-09-12 00:00:00,,EPSG,MSL 1972 at Hobart and Burnie.,
+5113,Sea Level,,,,geoidal,1996-09-12 00:00:00,,EPSG,An unspecified local vertical datum not recommended for use.,
+5114,Canadian Vertical Datum of 1928,CVD28,,,geoidal,1996-12-12 00:00:00,,EPSG,,
+5115,Piraeus Harbour 1986,Piraeus86,,,geoidal,1997-06-16 00:00:00,Geodesy Department; Public Pertoleum Corporation of Greece,EPSG,MSL determined during 1986.,
+5116,Helsinki 1960,N60,,,geoidal,1997-07-22 00:00:00,www.nls.fi/maa/papers/kkj.html,EPSG,MSL at Helsinki during 1960.,
+5117,Rikets hoghtsystem 1970,RH70,,,geoidal,1997-11-13 00:00:00,National Land Survey of Sweden,EPSG,,
+5118,Nivellement general de la France - Lalle,NGF - Lallemand,,,geoidal,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,Mean sea level at Marseille.,
+5119,Nivellement general de la France - IGN69,NGF - IGN69,,,geoidal,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,Mean sea level at Marseille.,
+5120,Nivellement general de la France - IGN78,NGF - IGN78,,,geoidal,1997-11-13 00:00:00,"Conseil National de l'Information Geographique groupe de travail \"Reseaux de Nivellement\" recommendations v5.1 April 1994",EPSG,,
+5121,Maputo,,,,geoidal,1998-04-16 00:00:00,Direc��o Nacional de Geografia e Cadastral (DINAGECA).,EPSG,Mean sea level at Maputo.,
+5122,Japanese Standard Levelling Datum 1949,JapanVD,,,geoidal,1999-04-22 00:00:00,Ministry of Construction; Japan.  http://vldb.gsi-mc.go.jp/sokuchi/datum/tokyodatum.html,EPSG,24.4140 metres above mean sea level Tokyo Bay.,
+5123,PDO Height Datum 1993,PHD93,,,geoidal,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Misclosure between Muscat and Salalah less than .5 meters with differences from of up to 5 meters from old Fahud Datum.  The PHD93 adjustment was initially known as the Spine.  Supercedes Fahud Vertical Datum (Code 5124) from 1993.,
+5124,Fahud Height Datum,,,,geoidal,1999-04-22 00:00:00,Petroleum Development Oman,EPSG,Superceded by PHD93 Datum (Code 5123) in 1993.  Based on reciprocal trigonometric heighting based on single MSL determination at Mina Al Fahal.,
+5125,Ha Tien 1960,,,,geoidal,1999-10-20 00:00:00,,EPSG,In Vietnam replaced by Hon Dau in 1992.,
+5126,Hon Dau 1992,,,,geoidal,1999-10-20 00:00:00,,EPSG,Supersedes Ha Tien in Vietnam.,
+5127,Landesnivellement 1902,LN02,,,geoidal,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,
+5128,Landeshohennetz 1995,LHN95,,,geoidal,1999-10-20 00:00:00,Bundesamt f�r Landestopographie,EPSG,Origin at Repere Pierre du Niton (RPN) 373.6 metres above msl derived at Marseille.,
diff --git a/src/tiff/csv/vert_offset.c b/src/tiff/csv/vert_offset.c
new file mode 100644
index 0000000..57f097f
--- /dev/null
+++ b/src/tiff/csv/vert_offset.c
@@ -0,0 +1,5 @@
+#include "defs.h"
+datafile_rows_t vert_offset_row_1[] = {"OFFSET_CODE","INITIAL_VERTCS_CODE","TERMINAL_VERTCS_CODE","COORD_TRF_METHOD_CODE","OFFSET_VALUE","OFFSET_UOM_CODE","AREA_OF_USE","DESCRIPTION","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID",NULL};
+datafile_rows_t vert_offset_row_2[] = {"5400","5705","5706","9616","28.0","9001","Azerbaijan; Kazakstan; Russia; Turkmenistan - Caspian Sea","","1999-11-12 00:00:00","","EPSG","","97.61  99.79",NULL};
+
+datafile_rows_t *vert_offset_rows[] = {vert_offset_row_1,vert_offset_row_2,NULL};
diff --git a/src/tiff/csv/vert_offset.csv b/src/tiff/csv/vert_offset.csv
new file mode 100644
index 0000000..a6a11e6
--- /dev/null
+++ b/src/tiff/csv/vert_offset.csv
@@ -0,0 +1,2 @@
+"OFFSET_CODE","INITIAL_VERTCS_CODE","TERMINAL_VERTCS_CODE","COORD_TRF_METHOD_CODE","OFFSET_VALUE","OFFSET_UOM_CODE","AREA_OF_USE","DESCRIPTION","REVISION_DATE","INFORMATION_SOURCE","DATA_SOURCE","REMARKS","CHANGE_ID"
+5400,5705,5706,9616,28.0,9001,Azerbaijan; Kazakstan; Russia; Turkmenistan - Caspian Sea,,1999-11-12 00:00:00,,EPSG,,97.61  99.79
diff --git a/src/tiff/epsg_datum.inc b/src/tiff/epsg_datum.inc
new file mode 100644
index 0000000..198e78f
--- /dev/null
+++ b/src/tiff/epsg_datum.inc
@@ -0,0 +1,174 @@
+/*
+ *  EPSG/POSC Datum database -- GeoTIFF Rev. 0.2
+ */
+ 
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_datum.inc
+#endif /* OLD Codes */
+
+/* New datums */
+ValuePair(Datum_Dealul_Piscului_1970,6317)
+
+/* Datums for which only the ellipsoid is known */
+ValuePair(DatumE_Airy1830,	6001)
+ValuePair(DatumE_AiryModified1849,	6002)
+ValuePair(DatumE_AustralianNationalSpheroid,	6003)
+ValuePair(DatumE_Bessel1841,	6004)
+ValuePair(DatumE_BesselModified,	6005)
+ValuePair(DatumE_BesselNamibia,	6006)
+ValuePair(DatumE_Clarke1858,	6007)
+ValuePair(DatumE_Clarke1866,	6008)
+ValuePair(DatumE_Clarke1866Michigan,	6009)
+ValuePair(DatumE_Clarke1880_Benoit,	6010)
+ValuePair(DatumE_Clarke1880_IGN,	6011)
+ValuePair(DatumE_Clarke1880_RGS,	6012)
+ValuePair(DatumE_Clarke1880_Arc,	6013)
+ValuePair(DatumE_Clarke1880_SGA1922,	6014)
+ValuePair(DatumE_Everest1830_1937Adjustment,	6015)
+ValuePair(DatumE_Everest1830_1967Definition,	6016)
+ValuePair(DatumE_Everest1830_1975Definition,	6017)
+ValuePair(DatumE_Everest1830Modified,	6018)
+ValuePair(DatumE_GRS1980,	6019)
+ValuePair(DatumE_Helmert1906,	6020)
+ValuePair(DatumE_IndonesianNationalSpheroid,	6021)
+ValuePair(DatumE_International1924,	6022)
+ValuePair(DatumE_International1967,	6023)
+ValuePair(DatumE_Krassowsky1960,	6024)
+ValuePair(DatumE_NWL9D,	6025)
+ValuePair(DatumE_NWL10D,	6026)
+ValuePair(DatumE_Plessis1817,	6027)
+ValuePair(DatumE_Struve1860,	6028)
+ValuePair(DatumE_WarOffice,	6029)
+ValuePair(DatumE_WGS84,	6030)
+ValuePair(DatumE_GEM10C,	6031)
+ValuePair(DatumE_OSU86F,	6032)
+ValuePair(DatumE_OSU91A,	6033)
+ValuePair(DatumE_Clarke1880,	6034)
+ValuePair(DatumE_Sphere,	6035)
+
+/* standard datums */
+ValuePair(Datum_Adindan,	6201)
+ValuePair(Datum_Australian_Geodetic_Datum_1966,	6202)
+ValuePair(Datum_Australian_Geodetic_Datum_1984,	6203)
+ValuePair(Datum_Ain_el_Abd_1970,	6204)
+ValuePair(Datum_Afgooye,	6205)
+ValuePair(Datum_Agadez,	6206)
+ValuePair(Datum_Lisbon,	6207)
+ValuePair(Datum_Aratu,	6208)
+ValuePair(Datum_Arc_1950,	6209)
+ValuePair(Datum_Arc_1960,	6210)
+ValuePair(Datum_Batavia,	6211)
+ValuePair(Datum_Barbados,	6212)
+ValuePair(Datum_Beduaram,	6213)
+ValuePair(Datum_Beijing_1954,	6214)
+ValuePair(Datum_Reseau_National_Belge_1950,	6215)
+ValuePair(Datum_Bermuda_1957,	6216)
+ValuePair(Datum_Bern_1898,	6217)
+ValuePair(Datum_Bogota,	6218)
+ValuePair(Datum_Bukit_Rimpah,	6219)
+ValuePair(Datum_Camacupa,	6220)
+ValuePair(Datum_Campo_Inchauspe,	6221)
+ValuePair(Datum_Cape,	6222)
+ValuePair(Datum_Carthage,	6223)
+ValuePair(Datum_Chua,	6224)
+ValuePair(Datum_Corrego_Alegre,	6225)
+ValuePair(Datum_Cote_d_Ivoire,	6226)
+ValuePair(Datum_Deir_ez_Zor,	6227)
+ValuePair(Datum_Douala,	6228)
+ValuePair(Datum_Egypt_1907,	6229)
+ValuePair(Datum_European_Datum_1950,	6230)
+ValuePair(Datum_European_Datum_1987,	6231)
+ValuePair(Datum_Fahud,	6232)
+ValuePair(Datum_Gandajika_1970,	6233)
+ValuePair(Datum_Garoua,	6234)
+ValuePair(Datum_Guyane_Francaise,	6235)
+ValuePair(Datum_Hu_Tzu_Shan,	6236)
+ValuePair(Datum_Hungarian_Datum_1972,	6237)
+ValuePair(Datum_Indonesian_Datum_1974,	6238)
+ValuePair(Datum_Indian_1954,	6239)
+ValuePair(Datum_Indian_1975,	6240)
+ValuePair(Datum_Jamaica_1875,	6241)
+ValuePair(Datum_Jamaica_1969,	6242)
+ValuePair(Datum_Kalianpur,	6243)
+ValuePair(Datum_Kandawala,	6244)
+ValuePair(Datum_Kertau,	6245)
+ValuePair(Datum_Kuwait_Oil_Company,	6246)
+ValuePair(Datum_La_Canoa,	6247)
+ValuePair(Datum_Provisional_S_American_Datum_1956,	6248)
+ValuePair(Datum_Lake,	6249)
+ValuePair(Datum_Leigon,	6250)
+ValuePair(Datum_Liberia_1964,	6251)
+ValuePair(Datum_Lome,	6252)
+ValuePair(Datum_Luzon_1911,	6253)
+ValuePair(Datum_Hito_XVIII_1963,	6254)
+ValuePair(Datum_Herat_North,	6255)
+ValuePair(Datum_Mahe_1971,	6256)
+ValuePair(Datum_Makassar,	6257)
+ValuePair(Datum_European_Reference_System_1989,	6258)
+ValuePair(Datum_Malongo_1987,	6259)
+ValuePair(Datum_Manoca,	6260)
+ValuePair(Datum_Merchich,	6261)
+ValuePair(Datum_Massawa,	6262)
+ValuePair(Datum_Minna,	6263)
+ValuePair(Datum_Mhast,	6264)
+ValuePair(Datum_Monte_Mario,	6265)
+ValuePair(Datum_M_poraloko,	6266)
+ValuePair(Datum_North_American_Datum_1927,	6267)
+ValuePair(Datum_NAD_Michigan,	6268)
+ValuePair(Datum_North_American_Datum_1983,	6269)
+ValuePair(Datum_Nahrwan_1967,	6270)
+ValuePair(Datum_Naparima_1972,	6271)
+ValuePair(Datum_New_Zealand_Geodetic_Datum_1949,	6272)
+ValuePair(Datum_NGO_1948,	6273)
+ValuePair(Datum_Datum_73,	6274)
+ValuePair(Datum_Nouvelle_Triangulation_Francaise,	6275)
+ValuePair(Datum_NSWC_9Z_2,	6276)
+ValuePair(Datum_OSGB_1936,	6277)
+ValuePair(Datum_OSGB_1970_SN,	6278)
+ValuePair(Datum_OS_SN_1980,	6279)
+ValuePair(Datum_Padang_1884,	6280)
+ValuePair(Datum_Palestine_1923,	6281)
+ValuePair(Datum_Pointe_Noire,	6282)
+ValuePair(Datum_Geocentric_Datum_of_Australia_1994,	6283)
+ValuePair(Datum_Pulkovo_1942,	6284)
+ValuePair(Datum_Qatar,	6285)
+ValuePair(Datum_Qatar_1948,	6286)
+ValuePair(Datum_Qornoq,	6287)
+ValuePair(Datum_Loma_Quintana,	6288)
+ValuePair(Datum_Amersfoort,	6289)
+ValuePair(Datum_RT38,	6290)
+ValuePair(Datum_South_American_Datum_1969,	6291)
+ValuePair(Datum_Sapper_Hill_1943,	6292)
+ValuePair(Datum_Schwarzeck,	6293)
+ValuePair(Datum_Segora,	6294)
+ValuePair(Datum_Serindung,	6295)
+ValuePair(Datum_Sudan,	6296)
+ValuePair(Datum_Tananarive_1925,	6297)
+ValuePair(Datum_Timbalai_1948,	6298)
+ValuePair(Datum_TM65,	6299)
+ValuePair(Datum_TM75,	6300)
+ValuePair(Datum_Tokyo,	6301)
+ValuePair(Datum_Trinidad_1903,	6302)
+ValuePair(Datum_Trucial_Coast_1948,	6303)
+ValuePair(Datum_Voirol_1875,	6304)
+ValuePair(Datum_Voirol_Unifie_1960,	6305)
+ValuePair(Datum_Bern_1938,	6306)
+ValuePair(Datum_Nord_Sahara_1959,	6307)
+ValuePair(Datum_Stockholm_1938,	6308)
+ValuePair(Datum_Yacare,	6309)
+ValuePair(Datum_Yoff,	6310)
+ValuePair(Datum_Zanderij,	6311)
+ValuePair(Datum_Militar_Geographische_Institut,	6312)
+ValuePair(Datum_Reseau_National_Belge_1972,	6313)
+ValuePair(Datum_Deutsche_Hauptdreiecksnetz,	6314)
+ValuePair(Datum_Conakry_1905,	6315)
+ValuePair(Datum_WGS72,	6322)
+ValuePair(Datum_WGS72_Transit_Broadcast_Ephemeris,	6324)
+ValuePair(Datum_WGS84,	6326)
+ValuePair(Datum_Ancienne_Triangulation_Francaise,	6901)
+ValuePair(Datum_Nord_de_Guerre,	6902)
+/* end of list */
diff --git a/src/tiff/epsg_ellipse.inc b/src/tiff/epsg_ellipse.inc
new file mode 100644
index 0000000..95c1432
--- /dev/null
+++ b/src/tiff/epsg_ellipse.inc
@@ -0,0 +1,48 @@
+/*
+ *  GeoTIFF Rev. 0.2  Ellipsoids
+ */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_ellipse.inc
+#endif /* OLD Codes */
+
+ValuePair(Ellipse_Airy_1830,	7001)
+ValuePair(Ellipse_Airy_Modified_1849,	7002)
+ValuePair(Ellipse_Australian_National_Spheroid,	7003)
+ValuePair(Ellipse_Bessel_1841,	7004)
+ValuePair(Ellipse_Bessel_Modified,	7005)
+ValuePair(Ellipse_Bessel_Namibia,	7006)
+ValuePair(Ellipse_Clarke_1858,	7007)
+ValuePair(Ellipse_Clarke_1866,	7008)
+ValuePair(Ellipse_Clarke_1866_Michigan,	7009)
+ValuePair(Ellipse_Clarke_1880_Benoit,	7010)
+ValuePair(Ellipse_Clarke_1880_IGN,	7011)
+ValuePair(Ellipse_Clarke_1880_RGS,	7012)
+ValuePair(Ellipse_Clarke_1880_Arc,	7013)
+ValuePair(Ellipse_Clarke_1880_SGA_1922,	7014)
+ValuePair(Ellipse_Everest_1830_1937_Adjustment,	7015)
+ValuePair(Ellipse_Everest_1830_1967_Definition,	7016)
+ValuePair(Ellipse_Everest_1830_1975_Definition,	7017)
+ValuePair(Ellipse_Everest_1830_Modified,	7018)
+ValuePair(Ellipse_GRS_1980,	7019)
+ValuePair(Ellipse_Helmert_1906,	7020)
+ValuePair(Ellipse_Indonesian_National_Spheroid,	7021)
+ValuePair(Ellipse_International_1924,	7022)
+ValuePair(Ellipse_International_1967,	7023)
+ValuePair(Ellipse_Krassowsky_1940,	7024)
+ValuePair(Ellipse_NWL_9D,	7025)
+ValuePair(Ellipse_NWL_10D,	7026)
+ValuePair(Ellipse_Plessis_1817,	7027)
+ValuePair(Ellipse_Struve_1860,	7028)
+ValuePair(Ellipse_War_Office,	7029)
+ValuePair(Ellipse_WGS_84,	7030)
+ValuePair(Ellipse_GEM_10C,	7031)
+ValuePair(Ellipse_OSU86F,	7032)
+ValuePair(Ellipse_OSU91A,	7033)
+ValuePair(Ellipse_Clarke_1880,	7034)
+ValuePair(Ellipse_Sphere,	7035)
+/* end of list */
diff --git a/src/tiff/epsg_gcs.inc b/src/tiff/epsg_gcs.inc
new file mode 100644
index 0000000..4917964
--- /dev/null
+++ b/src/tiff/epsg_gcs.inc
@@ -0,0 +1,193 @@
+/*
+ *  EPSG/POSC GCS Codes -- GeoTIFF Rev. 0.2
+ */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_gcs.inc
+#endif /* OLD Codes */
+
+/* Unspecified GCS based on ellipsoid */
+ValuePair(GCSE_Airy1830,	4001)
+ValuePair(GCSE_AiryModified1849,	4002)
+ValuePair(GCSE_AustralianNationalSpheroid,	4003)
+ValuePair(GCSE_Bessel1841,	4004)
+ValuePair(GCSE_BesselModified,	4005)
+ValuePair(GCSE_BesselNamibia,	4006)
+ValuePair(GCSE_Clarke1858,	4007)
+ValuePair(GCSE_Clarke1866,	4008)
+ValuePair(GCSE_Clarke1866Michigan,	4009)
+ValuePair(GCSE_Clarke1880_Benoit,	4010)
+ValuePair(GCSE_Clarke1880_IGN,	4011)
+ValuePair(GCSE_Clarke1880_RGS,	4012)
+ValuePair(GCSE_Clarke1880_Arc,	4013)
+ValuePair(GCSE_Clarke1880_SGA1922,	4014)
+ValuePair(GCSE_Everest1830_1937Adjustment,	4015)
+ValuePair(GCSE_Everest1830_1967Definition,	4016)
+ValuePair(GCSE_Everest1830_1975Definition,	4017)
+ValuePair(GCSE_Everest1830Modified,	4018)
+ValuePair(GCSE_GRS1980,	4019)
+ValuePair(GCSE_Helmert1906,	4020)
+ValuePair(GCSE_IndonesianNationalSpheroid,	4021)
+ValuePair(GCSE_International1924,	4022)
+ValuePair(GCSE_International1967,	4023)
+ValuePair(GCSE_Krassowsky1940,	4024)
+ValuePair(GCSE_NWL9D,	4025)
+ValuePair(GCSE_NWL10D,	4026)
+ValuePair(GCSE_Plessis1817,	4027)
+ValuePair(GCSE_Struve1860,	4028)
+ValuePair(GCSE_WarOffice,	4029)
+ValuePair(GCSE_WGS84,	4030)
+ValuePair(GCSE_GEM10C,	4031)
+ValuePair(GCSE_OSU86F,	4032)
+ValuePair(GCSE_OSU91A,	4033)
+ValuePair(GCSE_Clarke1880,	4034)
+ValuePair(GCSE_Sphere,	4035)
+
+/* New GCS */
+ValuePair(GCS_Greek,4120)
+ValuePair(GCS_GGRS87,4121)
+ValuePair(GCS_KKJ,4123)
+ValuePair(GCS_RT90,4124)
+ValuePair(GCS_EST92,4133)
+ValuePair(GCS_Dealul_Piscului_1970,4317)
+ValuePair(GCS_Greek_Athens,4815)
+
+/* Standard GCS */
+ValuePair(GCS_Adindan,	4201)
+ValuePair(GCS_AGD66,	4202)
+ValuePair(GCS_AGD84,	4203)
+ValuePair(GCS_Ain_el_Abd,	4204)
+ValuePair(GCS_Afgooye,	4205)
+ValuePair(GCS_Agadez,	4206)
+ValuePair(GCS_Lisbon,	4207)
+ValuePair(GCS_Aratu,	4208)
+ValuePair(GCS_Arc_1950,	4209)
+ValuePair(GCS_Arc_1960,	4210)
+ValuePair(GCS_Batavia,	4211)
+ValuePair(GCS_Barbados,	4212)
+ValuePair(GCS_Beduaram,	4213)
+ValuePair(GCS_Beijing_1954,	4214)
+ValuePair(GCS_Belge_1950,	4215)
+ValuePair(GCS_Bermuda_1957,	4216)
+ValuePair(GCS_Bern_1898,	4217)
+ValuePair(GCS_Bogota,	4218)
+ValuePair(GCS_Bukit_Rimpah,	4219)
+ValuePair(GCS_Camacupa,	4220)
+ValuePair(GCS_Campo_Inchauspe,	4221)
+ValuePair(GCS_Cape,	4222)
+ValuePair(GCS_Carthage,	4223)
+ValuePair(GCS_Chua,	4224)
+ValuePair(GCS_Corrego_Alegre,	4225)
+ValuePair(GCS_Cote_d_Ivoire,	4226)
+ValuePair(GCS_Deir_ez_Zor,	4227)
+ValuePair(GCS_Douala,	4228)
+ValuePair(GCS_Egypt_1907,	4229)
+ValuePair(GCS_ED50,	4230)
+ValuePair(GCS_ED87,	4231)
+ValuePair(GCS_Fahud,	4232)
+ValuePair(GCS_Gandajika_1970,	4233)
+ValuePair(GCS_Garoua,	4234)
+ValuePair(GCS_Guyane_Francaise,	4235)
+ValuePair(GCS_Hu_Tzu_Shan,	4236)
+ValuePair(GCS_HD72,	4237)
+ValuePair(GCS_ID74,	4238)
+ValuePair(GCS_Indian_1954,	4239)
+ValuePair(GCS_Indian_1975,	4240)
+ValuePair(GCS_Jamaica_1875,	4241)
+ValuePair(GCS_JAD69,	4242)
+ValuePair(GCS_Kalianpur,	4243)
+ValuePair(GCS_Kandawala,	4244)
+ValuePair(GCS_Kertau,	4245)
+ValuePair(GCS_KOC,	4246)
+ValuePair(GCS_La_Canoa,	4247)
+ValuePair(GCS_PSAD56,	4248)
+ValuePair(GCS_Lake,	4249)
+ValuePair(GCS_Leigon,	4250)
+ValuePair(GCS_Liberia_1964,	4251)
+ValuePair(GCS_Lome,	4252)
+ValuePair(GCS_Luzon_1911,	4253)
+ValuePair(GCS_Hito_XVIII_1963,	4254)
+ValuePair(GCS_Herat_North,	4255)
+ValuePair(GCS_Mahe_1971,	4256)
+ValuePair(GCS_Makassar,	4257)
+ValuePair(GCS_EUREF89,	4258)
+ValuePair(GCS_Malongo_1987,	4259)
+ValuePair(GCS_Manoca,	4260)
+ValuePair(GCS_Merchich,	4261)
+ValuePair(GCS_Massawa,	4262)
+ValuePair(GCS_Minna,	4263)
+ValuePair(GCS_Mhast,	4264)
+ValuePair(GCS_Monte_Mario,	4265)
+ValuePair(GCS_M_poraloko,	4266)
+ValuePair(GCS_NAD27,	4267)
+ValuePair(GCS_NAD_Michigan,	4268)
+ValuePair(GCS_NAD83,	4269)
+ValuePair(GCS_Nahrwan_1967,	4270)
+ValuePair(GCS_Naparima_1972,	4271)
+ValuePair(GCS_GD49,	4272)
+ValuePair(GCS_NGO_1948,	4273)
+ValuePair(GCS_Datum_73,	4274)
+ValuePair(GCS_NTF,	4275)
+ValuePair(GCS_NSWC_9Z_2,	4276)
+ValuePair(GCS_OSGB_1936,	4277)
+ValuePair(GCS_OSGB70,	4278)
+ValuePair(GCS_OS_SN80,	4279)
+ValuePair(GCS_Padang,	4280)
+ValuePair(GCS_Palestine_1923,	4281)
+ValuePair(GCS_Pointe_Noire,	4282)
+ValuePair(GCS_GDA94,	4283)
+ValuePair(GCS_Pulkovo_1942,	4284)
+ValuePair(GCS_Qatar,	4285)
+ValuePair(GCS_Qatar_1948,	4286)
+ValuePair(GCS_Qornoq,	4287)
+ValuePair(GCS_Loma_Quintana,	4288)
+ValuePair(GCS_Amersfoort,	4289)
+ValuePair(GCS_RT38,	4290)
+ValuePair(GCS_SAD69,	4291)
+ValuePair(GCS_Sapper_Hill_1943,	4292)
+ValuePair(GCS_Schwarzeck,	4293)
+ValuePair(GCS_Segora,	4294)
+ValuePair(GCS_Serindung,	4295)
+ValuePair(GCS_Sudan,	4296)
+ValuePair(GCS_Tananarive,	4297)
+ValuePair(GCS_Timbalai_1948,	4298)
+ValuePair(GCS_TM65,	4299)
+ValuePair(GCS_TM75,	4300)
+ValuePair(GCS_Tokyo,	4301)
+ValuePair(GCS_Trinidad_1903,	4302)
+ValuePair(GCS_TC_1948,	4303)
+ValuePair(GCS_Voirol_1875,	4304)
+ValuePair(GCS_Voirol_Unifie,	4305)
+ValuePair(GCS_Bern_1938,	4306)
+ValuePair(GCS_Nord_Sahara_1959,	4307)
+ValuePair(GCS_Stockholm_1938,	4308)
+ValuePair(GCS_Yacare,	4309)
+ValuePair(GCS_Yoff,	4310)
+ValuePair(GCS_Zanderij,	4311)
+ValuePair(GCS_MGI,	4312)
+ValuePair(GCS_Belge_1972,	4313)
+ValuePair(GCS_DHDN,	4314)
+ValuePair(GCS_Conakry_1905,	4315)
+ValuePair(GCS_WGS_72,	4322)
+ValuePair(GCS_WGS_72BE,	4324)
+ValuePair(GCS_WGS_84,	4326)
+ValuePair(GCS_Bern_1898_Bern,	4801)
+ValuePair(GCS_Bogota_Bogota,	4802)
+ValuePair(GCS_Lisbon_Lisbon,	4803)
+ValuePair(GCS_Makassar_Jakarta,	4804)
+ValuePair(GCS_MGI_Ferro,	4805)
+ValuePair(GCS_Monte_Mario_Rome,	4806)
+ValuePair(GCS_NTF_Paris,	4807)
+ValuePair(GCS_Padang_Jakarta,	4808)
+ValuePair(GCS_Belge_1950_Brussels,	4809)
+ValuePair(GCS_Tananarive_Paris,	4810)
+ValuePair(GCS_Voirol_1875_Paris,	4811)
+ValuePair(GCS_Voirol_Unifie_Paris,	4812)
+ValuePair(GCS_Batavia_Jakarta,	4813)
+ValuePair(GCS_ATF_Paris,	4901)
+ValuePair(GCS_NDG_Paris,	4902)
+/* End of list */
diff --git a/src/tiff/epsg_pcs.inc b/src/tiff/epsg_pcs.inc
new file mode 100644
index 0000000..d54153a
--- /dev/null
+++ b/src/tiff/epsg_pcs.inc
@@ -0,0 +1,1003 @@
+/*
+ *  EPSG PCS Codes - GeoTIFF Rev 0.2
+ */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_pcs.inc
+#endif /* OLD Codes */
+
+/* New PCS */
+ValuePair(PCS_GGRS87_Greek_Grid,2100)
+ValuePair(PCS_KKJ_Finland_zone_1,2391)
+ValuePair(PCS_KKJ_Finland_zone_2,2392)
+ValuePair(PCS_KKJ_Finland_zone_3,2393)
+ValuePair(PCS_KKJ_Finland_zone_4,2394)
+ValuePair(PCS_RT90_2_5_gon_W,2400)
+ValuePair(PCS_Lietuvos_Koordinoei_Sistema_1994,2600)
+ValuePair(PCS_Estonian_Coordinate_System_of_1992,3300)
+ValuePair(PCS_HD72_EOV,23700)
+ValuePair(PCS_Dealul_Piscului_1970_Stereo_70,31700)
+
+ValuePair(PCS_Adindan_UTM_zone_37N,	20137)
+ValuePair(PCS_Adindan_UTM_zone_38N,	20138)
+ValuePair(PCS_AGD66_AMG_zone_48,	20248)
+ValuePair(PCS_AGD66_AMG_zone_49,	20249)
+ValuePair(PCS_AGD66_AMG_zone_50,	20250)
+ValuePair(PCS_AGD66_AMG_zone_51,	20251)
+ValuePair(PCS_AGD66_AMG_zone_52,	20252)
+ValuePair(PCS_AGD66_AMG_zone_53,	20253)
+ValuePair(PCS_AGD66_AMG_zone_54,	20254)
+ValuePair(PCS_AGD66_AMG_zone_55,	20255)
+ValuePair(PCS_AGD66_AMG_zone_56,	20256)
+ValuePair(PCS_AGD66_AMG_zone_57,	20257)
+ValuePair(PCS_AGD66_AMG_zone_58,	20258)
+ValuePair(PCS_AGD84_AMG_zone_48,	20348)
+ValuePair(PCS_AGD84_AMG_zone_49,	20349)
+ValuePair(PCS_AGD84_AMG_zone_50,	20350)
+ValuePair(PCS_AGD84_AMG_zone_51,	20351)
+ValuePair(PCS_AGD84_AMG_zone_52,	20352)
+ValuePair(PCS_AGD84_AMG_zone_53,	20353)
+ValuePair(PCS_AGD84_AMG_zone_54,	20354)
+ValuePair(PCS_AGD84_AMG_zone_55,	20355)
+ValuePair(PCS_AGD84_AMG_zone_56,	20356)
+ValuePair(PCS_AGD84_AMG_zone_57,	20357)
+ValuePair(PCS_AGD84_AMG_zone_58,	20358)
+ValuePair(PCS_Ain_el_Abd_UTM_zone_37N,	20437)
+ValuePair(PCS_Ain_el_Abd_UTM_zone_38N,	20438)
+ValuePair(PCS_Ain_el_Abd_UTM_zone_39N,	20439)
+ValuePair(PCS_Ain_el_Abd_Bahrain_Grid,	20499)
+ValuePair(PCS_Afgooye_UTM_zone_38N,	20538)
+ValuePair(PCS_Afgooye_UTM_zone_39N,	20539)
+ValuePair(PCS_Lisbon_Portugese_Grid,	20700)
+ValuePair(PCS_Aratu_UTM_zone_22S,	20822)
+ValuePair(PCS_Aratu_UTM_zone_23S,	20823)
+ValuePair(PCS_Aratu_UTM_zone_24S,	20824)
+ValuePair(PCS_Arc_1950_Lo13,	20973)
+ValuePair(PCS_Arc_1950_Lo15,	20975)
+ValuePair(PCS_Arc_1950_Lo17,	20977)
+ValuePair(PCS_Arc_1950_Lo19,	20979)
+ValuePair(PCS_Arc_1950_Lo21,	20981)
+ValuePair(PCS_Arc_1950_Lo23,	20983)
+ValuePair(PCS_Arc_1950_Lo25,	20985)
+ValuePair(PCS_Arc_1950_Lo27,	20987)
+ValuePair(PCS_Arc_1950_Lo29,	20989)
+ValuePair(PCS_Arc_1950_Lo31,	20991)
+ValuePair(PCS_Arc_1950_Lo33,	20993)
+ValuePair(PCS_Arc_1950_Lo35,	20995)
+ValuePair(PCS_Batavia_NEIEZ,	21100)
+ValuePair(PCS_Batavia_UTM_zone_48S,	21148)
+ValuePair(PCS_Batavia_UTM_zone_49S,	21149)
+ValuePair(PCS_Batavia_UTM_zone_50S,	21150)
+ValuePair(PCS_Beijing_Gauss_zone_13,	21413)
+ValuePair(PCS_Beijing_Gauss_zone_14,	21414)
+ValuePair(PCS_Beijing_Gauss_zone_15,	21415)
+ValuePair(PCS_Beijing_Gauss_zone_16,	21416)
+ValuePair(PCS_Beijing_Gauss_zone_17,	21417)
+ValuePair(PCS_Beijing_Gauss_zone_18,	21418)
+ValuePair(PCS_Beijing_Gauss_zone_19,	21419)
+ValuePair(PCS_Beijing_Gauss_zone_20,	21420)
+ValuePair(PCS_Beijing_Gauss_zone_21,	21421)
+ValuePair(PCS_Beijing_Gauss_zone_22,	21422)
+ValuePair(PCS_Beijing_Gauss_zone_23,	21423)
+ValuePair(PCS_Beijing_Gauss_13N,	21473)
+ValuePair(PCS_Beijing_Gauss_14N,	21474)
+ValuePair(PCS_Beijing_Gauss_15N,	21475)
+ValuePair(PCS_Beijing_Gauss_16N,	21476)
+ValuePair(PCS_Beijing_Gauss_17N,	21477)
+ValuePair(PCS_Beijing_Gauss_18N,	21478)
+ValuePair(PCS_Beijing_Gauss_19N,	21479)
+ValuePair(PCS_Beijing_Gauss_20N,	21480)
+ValuePair(PCS_Beijing_Gauss_21N,	21481)
+ValuePair(PCS_Beijing_Gauss_22N,	21482)
+ValuePair(PCS_Beijing_Gauss_23N,	21483)
+ValuePair(PCS_Belge_Lambert_50,	21500)
+ValuePair(PCS_Bern_1898_Swiss_Old,	21790)
+ValuePair(PCS_Bogota_UTM_zone_17N,	21817)
+ValuePair(PCS_Bogota_UTM_zone_18N,	21818)
+ValuePair(PCS_Bogota_Colombia_3W,	21891)
+ValuePair(PCS_Bogota_Colombia_Bogota,	21892)
+ValuePair(PCS_Bogota_Colombia_3E,	21893)
+ValuePair(PCS_Bogota_Colombia_6E,	21894)
+ValuePair(PCS_Camacupa_UTM_32S,	22032)
+ValuePair(PCS_Camacupa_UTM_33S,	22033)
+ValuePair(PCS_C_Inchauspe_Argentina_1,	22191)
+ValuePair(PCS_C_Inchauspe_Argentina_2,	22192)
+ValuePair(PCS_C_Inchauspe_Argentina_3,	22193)
+ValuePair(PCS_C_Inchauspe_Argentina_4,	22194)
+ValuePair(PCS_C_Inchauspe_Argentina_5,	22195)
+ValuePair(PCS_C_Inchauspe_Argentina_6,	22196)
+ValuePair(PCS_C_Inchauspe_Argentina_7,	22197)
+ValuePair(PCS_Carthage_UTM_zone_32N,	22332)
+ValuePair(PCS_Carthage_Nord_Tunisie,	22391)
+ValuePair(PCS_Carthage_Sud_Tunisie,	22392)
+ValuePair(PCS_Corrego_Alegre_UTM_23S,	22523)
+ValuePair(PCS_Corrego_Alegre_UTM_24S,	22524)
+ValuePair(PCS_Douala_UTM_zone_32N,	22832)
+ValuePair(PCS_Egypt_1907_Red_Belt,	22992)
+ValuePair(PCS_Egypt_1907_Purple_Belt,	22993)
+ValuePair(PCS_Egypt_1907_Ext_Purple,	22994)
+ValuePair(PCS_ED50_UTM_zone_28N,	23028)
+ValuePair(PCS_ED50_UTM_zone_29N,	23029)
+ValuePair(PCS_ED50_UTM_zone_30N,	23030)
+ValuePair(PCS_ED50_UTM_zone_31N,	23031)
+ValuePair(PCS_ED50_UTM_zone_32N,	23032)
+ValuePair(PCS_ED50_UTM_zone_33N,	23033)
+ValuePair(PCS_ED50_UTM_zone_34N,	23034)
+ValuePair(PCS_ED50_UTM_zone_35N,	23035)
+ValuePair(PCS_ED50_UTM_zone_36N,	23036)
+ValuePair(PCS_ED50_UTM_zone_37N,	23037)
+ValuePair(PCS_ED50_UTM_zone_38N,	23038)
+ValuePair(PCS_Fahud_UTM_zone_39N,	23239)
+ValuePair(PCS_Fahud_UTM_zone_40N,	23240)
+ValuePair(PCS_Garoua_UTM_zone_33N,	23433)
+ValuePair(PCS_ID74_UTM_zone_46N,	23846)
+ValuePair(PCS_ID74_UTM_zone_47N,	23847)
+ValuePair(PCS_ID74_UTM_zone_48N,	23848)
+ValuePair(PCS_ID74_UTM_zone_49N,	23849)
+ValuePair(PCS_ID74_UTM_zone_50N,	23850)
+ValuePair(PCS_ID74_UTM_zone_51N,	23851)
+ValuePair(PCS_ID74_UTM_zone_52N,	23852)
+ValuePair(PCS_ID74_UTM_zone_53N,	23853)
+ValuePair(PCS_ID74_UTM_zone_46S,	23886)
+ValuePair(PCS_ID74_UTM_zone_47S,	23887)
+ValuePair(PCS_ID74_UTM_zone_48S,	23888)
+ValuePair(PCS_ID74_UTM_zone_49S,	23889)
+ValuePair(PCS_ID74_UTM_zone_50S,	23890)
+ValuePair(PCS_ID74_UTM_zone_51S,	23891)
+ValuePair(PCS_ID74_UTM_zone_52S,	23892)
+ValuePair(PCS_ID74_UTM_zone_53S,	23893)
+ValuePair(PCS_ID74_UTM_zone_54S,	23894)
+ValuePair(PCS_Indian_1954_UTM_47N,	23947)
+ValuePair(PCS_Indian_1954_UTM_48N,	23948)
+ValuePair(PCS_Indian_1975_UTM_47N,	24047)
+ValuePair(PCS_Indian_1975_UTM_48N,	24048)
+ValuePair(PCS_Jamaica_1875_Old_Grid,	24100)
+ValuePair(PCS_JAD69_Jamaica_Grid,	24200)
+ValuePair(PCS_Kalianpur_India_0,	24370)
+ValuePair(PCS_Kalianpur_India_I,	24371)
+ValuePair(PCS_Kalianpur_India_IIa,	24372)
+ValuePair(PCS_Kalianpur_India_IIIa,	24373)
+ValuePair(PCS_Kalianpur_India_IVa,	24374)
+ValuePair(PCS_Kalianpur_India_IIb,	24382)
+ValuePair(PCS_Kalianpur_India_IIIb,	24383)
+ValuePair(PCS_Kalianpur_India_IVb,	24384)
+ValuePair(PCS_Kertau_Singapore_Grid,	24500)
+ValuePair(PCS_Kertau_UTM_zone_47N,	24547)
+ValuePair(PCS_Kertau_UTM_zone_48N,	24548)
+ValuePair(PCS_La_Canoa_UTM_zone_20N,	24720)
+ValuePair(PCS_La_Canoa_UTM_zone_21N,	24721)
+ValuePair(PCS_PSAD56_UTM_zone_18N,	24818)
+ValuePair(PCS_PSAD56_UTM_zone_19N,	24819)
+ValuePair(PCS_PSAD56_UTM_zone_20N,	24820)
+ValuePair(PCS_PSAD56_UTM_zone_21N,	24821)
+ValuePair(PCS_PSAD56_UTM_zone_17S,	24877)
+ValuePair(PCS_PSAD56_UTM_zone_18S,	24878)
+ValuePair(PCS_PSAD56_UTM_zone_19S,	24879)
+ValuePair(PCS_PSAD56_UTM_zone_20S,	24880)
+ValuePair(PCS_PSAD56_Peru_west_zone,	24891)
+ValuePair(PCS_PSAD56_Peru_central,	24892)
+ValuePair(PCS_PSAD56_Peru_east_zone,	24893)
+ValuePair(PCS_Leigon_Ghana_Grid,	25000)
+ValuePair(PCS_Lome_UTM_zone_31N,	25231)
+ValuePair(PCS_Luzon_Philippines_I,	25391)
+ValuePair(PCS_Luzon_Philippines_II,	25392)
+ValuePair(PCS_Luzon_Philippines_III,	25393)
+ValuePair(PCS_Luzon_Philippines_IV,	25394)
+ValuePair(PCS_Luzon_Philippines_V,	25395)
+ValuePair(PCS_Makassar_NEIEZ,	25700)
+ValuePair(PCS_Malongo_1987_UTM_32S,	25932)
+ValuePair(PCS_Merchich_Nord_Maroc,	26191)
+ValuePair(PCS_Merchich_Sud_Maroc,	26192)
+ValuePair(PCS_Merchich_Sahara,	26193)
+ValuePair(PCS_Massawa_UTM_zone_37N,	26237)
+ValuePair(PCS_Minna_UTM_zone_31N,	26331)
+ValuePair(PCS_Minna_UTM_zone_32N,	26332)
+ValuePair(PCS_Minna_Nigeria_West,	26391)
+ValuePair(PCS_Minna_Nigeria_Mid_Belt,	26392)
+ValuePair(PCS_Minna_Nigeria_East,	26393)
+ValuePair(PCS_Mhast_UTM_zone_32S,	26432)
+ValuePair(PCS_Monte_Mario_Italy_1,	26591)
+ValuePair(PCS_Monte_Mario_Italy_2,	26592)
+ValuePair(PCS_M_poraloko_UTM_32N,	26632)
+ValuePair(PCS_M_poraloko_UTM_32S,	26692)
+ValuePair(PCS_NAD27_UTM_zone_3N,	26703)
+ValuePair(PCS_NAD27_UTM_zone_4N,	26704)
+ValuePair(PCS_NAD27_UTM_zone_5N,	26705)
+ValuePair(PCS_NAD27_UTM_zone_6N,	26706)
+ValuePair(PCS_NAD27_UTM_zone_7N,	26707)
+ValuePair(PCS_NAD27_UTM_zone_8N,	26708)
+ValuePair(PCS_NAD27_UTM_zone_9N,	26709)
+ValuePair(PCS_NAD27_UTM_zone_10N,	26710)
+ValuePair(PCS_NAD27_UTM_zone_11N,	26711)
+ValuePair(PCS_NAD27_UTM_zone_12N,	26712)
+ValuePair(PCS_NAD27_UTM_zone_13N,	26713)
+ValuePair(PCS_NAD27_UTM_zone_14N,	26714)
+ValuePair(PCS_NAD27_UTM_zone_15N,	26715)
+ValuePair(PCS_NAD27_UTM_zone_16N,	26716)
+ValuePair(PCS_NAD27_UTM_zone_17N,	26717)
+ValuePair(PCS_NAD27_UTM_zone_18N,	26718)
+ValuePair(PCS_NAD27_UTM_zone_19N,	26719)
+ValuePair(PCS_NAD27_UTM_zone_20N,	26720)
+ValuePair(PCS_NAD27_UTM_zone_21N,	26721)
+ValuePair(PCS_NAD27_UTM_zone_22N,	26722)
+ValuePair(PCS_NAD27_Alabama_East,	26729)
+ValuePair(PCS_NAD27_Alabama_West,	26730)
+ValuePair(PCS_NAD27_Alaska_zone_1,	26731)
+ValuePair(PCS_NAD27_Alaska_zone_2,	26732)
+ValuePair(PCS_NAD27_Alaska_zone_3,	26733)
+ValuePair(PCS_NAD27_Alaska_zone_4,	26734)
+ValuePair(PCS_NAD27_Alaska_zone_5,	26735)
+ValuePair(PCS_NAD27_Alaska_zone_6,	26736)
+ValuePair(PCS_NAD27_Alaska_zone_7,	26737)
+ValuePair(PCS_NAD27_Alaska_zone_8,	26738)
+ValuePair(PCS_NAD27_Alaska_zone_9,	26739)
+ValuePair(PCS_NAD27_Alaska_zone_10,	26740)
+ValuePair(PCS_NAD27_California_I,	26741)
+ValuePair(PCS_NAD27_California_II,	26742)
+ValuePair(PCS_NAD27_California_III,	26743)
+ValuePair(PCS_NAD27_California_IV,	26744)
+ValuePair(PCS_NAD27_California_V,	26745)
+ValuePair(PCS_NAD27_California_VI,	26746)
+ValuePair(PCS_NAD27_California_VII,	26747)
+ValuePair(PCS_NAD27_Arizona_East,	26748)
+ValuePair(PCS_NAD27_Arizona_Central,	26749)
+ValuePair(PCS_NAD27_Arizona_West,	26750)
+ValuePair(PCS_NAD27_Arkansas_North,	26751)
+ValuePair(PCS_NAD27_Arkansas_South,	26752)
+ValuePair(PCS_NAD27_Colorado_North,	26753)
+ValuePair(PCS_NAD27_Colorado_Central,	26754)
+ValuePair(PCS_NAD27_Colorado_South,	26755)
+ValuePair(PCS_NAD27_Connecticut,	26756)
+ValuePair(PCS_NAD27_Delaware,	26757)
+ValuePair(PCS_NAD27_Florida_East,	26758)
+ValuePair(PCS_NAD27_Florida_West,	26759)
+ValuePair(PCS_NAD27_Florida_North,	26760)
+ValuePair(PCS_NAD27_Hawaii_zone_1,	26761)
+ValuePair(PCS_NAD27_Hawaii_zone_2,	26762)
+ValuePair(PCS_NAD27_Hawaii_zone_3,	26763)
+ValuePair(PCS_NAD27_Hawaii_zone_4,	26764)
+ValuePair(PCS_NAD27_Hawaii_zone_5,	26765)
+ValuePair(PCS_NAD27_Georgia_East,	26766)
+ValuePair(PCS_NAD27_Georgia_West,	26767)
+ValuePair(PCS_NAD27_Idaho_East,	26768)
+ValuePair(PCS_NAD27_Idaho_Central,	26769)
+ValuePair(PCS_NAD27_Idaho_West,	26770)
+ValuePair(PCS_NAD27_Illinois_East,	26771)
+ValuePair(PCS_NAD27_Illinois_West,	26772)
+ValuePair(PCS_NAD27_Indiana_East,	26773)
+ValuePair(PCS_NAD27_BLM_14N_feet,	26774)
+ValuePair(PCS_NAD27_Indiana_West,	26774)
+ValuePair(PCS_NAD27_BLM_15N_feet,	26775)
+ValuePair(PCS_NAD27_Iowa_North,	26775)
+ValuePair(PCS_NAD27_BLM_16N_feet,	26776)
+ValuePair(PCS_NAD27_Iowa_South,	26776)
+ValuePair(PCS_NAD27_BLM_17N_feet,	26777)
+ValuePair(PCS_NAD27_Kansas_North,	26777)
+ValuePair(PCS_NAD27_Kansas_South,	26778)
+ValuePair(PCS_NAD27_Kentucky_North,	26779)
+ValuePair(PCS_NAD27_Kentucky_South,	26780)
+ValuePair(PCS_NAD27_Louisiana_North,	26781)
+ValuePair(PCS_NAD27_Louisiana_South,	26782)
+ValuePair(PCS_NAD27_Maine_East,	26783)
+ValuePair(PCS_NAD27_Maine_West,	26784)
+ValuePair(PCS_NAD27_Maryland,	26785)
+ValuePair(PCS_NAD27_Massachusetts,	26786)
+ValuePair(PCS_NAD27_Massachusetts_Is,	26787)
+ValuePair(PCS_NAD27_Michigan_North,	26788)
+ValuePair(PCS_NAD27_Michigan_Central,	26789)
+ValuePair(PCS_NAD27_Michigan_South,	26790)
+ValuePair(PCS_NAD27_Minnesota_North,	26791)
+ValuePair(PCS_NAD27_Minnesota_Cent,	26792)
+ValuePair(PCS_NAD27_Minnesota_South,	26793)
+ValuePair(PCS_NAD27_Mississippi_East,	26794)
+ValuePair(PCS_NAD27_Mississippi_West,	26795)
+ValuePair(PCS_NAD27_Missouri_East,	26796)
+ValuePair(PCS_NAD27_Missouri_Central,	26797)
+ValuePair(PCS_NAD27_Missouri_West,	26798)
+ValuePair(PCS_NAD_Michigan_Michigan_East,	26801)
+ValuePair(PCS_NAD_Michigan_Michigan_Old_Central,	26802)
+ValuePair(PCS_NAD_Michigan_Michigan_West,	26803)
+ValuePair(PCS_NAD83_UTM_zone_3N,	26903)
+ValuePair(PCS_NAD83_UTM_zone_4N,	26904)
+ValuePair(PCS_NAD83_UTM_zone_5N,	26905)
+ValuePair(PCS_NAD83_UTM_zone_6N,	26906)
+ValuePair(PCS_NAD83_UTM_zone_7N,	26907)
+ValuePair(PCS_NAD83_UTM_zone_8N,	26908)
+ValuePair(PCS_NAD83_UTM_zone_9N,	26909)
+ValuePair(PCS_NAD83_UTM_zone_10N,	26910)
+ValuePair(PCS_NAD83_UTM_zone_11N,	26911)
+ValuePair(PCS_NAD83_UTM_zone_12N,	26912)
+ValuePair(PCS_NAD83_UTM_zone_13N,	26913)
+ValuePair(PCS_NAD83_UTM_zone_14N,	26914)
+ValuePair(PCS_NAD83_UTM_zone_15N,	26915)
+ValuePair(PCS_NAD83_UTM_zone_16N,	26916)
+ValuePair(PCS_NAD83_UTM_zone_17N,	26917)
+ValuePair(PCS_NAD83_UTM_zone_18N,	26918)
+ValuePair(PCS_NAD83_UTM_zone_19N,	26919)
+ValuePair(PCS_NAD83_UTM_zone_20N,	26920)
+ValuePair(PCS_NAD83_UTM_zone_21N,	26921)
+ValuePair(PCS_NAD83_UTM_zone_22N,	26922)
+ValuePair(PCS_NAD83_UTM_zone_23N,	26923)
+ValuePair(PCS_NAD83_Alabama_East,	26929)
+ValuePair(PCS_NAD83_Alabama_West,	26930)
+ValuePair(PCS_NAD83_Alaska_zone_1,	26931)
+ValuePair(PCS_NAD83_Alaska_zone_2,	26932)
+ValuePair(PCS_NAD83_Alaska_zone_3,	26933)
+ValuePair(PCS_NAD83_Alaska_zone_4,	26934)
+ValuePair(PCS_NAD83_Alaska_zone_5,	26935)
+ValuePair(PCS_NAD83_Alaska_zone_6,	26936)
+ValuePair(PCS_NAD83_Alaska_zone_7,	26937)
+ValuePair(PCS_NAD83_Alaska_zone_8,	26938)
+ValuePair(PCS_NAD83_Alaska_zone_9,	26939)
+ValuePair(PCS_NAD83_Alaska_zone_10,	26940)
+ValuePair(PCS_NAD83_California_1,	26941)
+ValuePair(PCS_NAD83_California_2,	26942)
+ValuePair(PCS_NAD83_California_3,	26943)
+ValuePair(PCS_NAD83_California_4,	26944)
+ValuePair(PCS_NAD83_California_5,	26945)
+ValuePair(PCS_NAD83_California_6,	26946)
+ValuePair(PCS_NAD83_Arizona_East,	26948)
+ValuePair(PCS_NAD83_Arizona_Central,	26949)
+ValuePair(PCS_NAD83_Arizona_West,	26950)
+ValuePair(PCS_NAD83_Arkansas_North,	26951)
+ValuePair(PCS_NAD83_Arkansas_South,	26952)
+ValuePair(PCS_NAD83_Colorado_North,	26953)
+ValuePair(PCS_NAD83_Colorado_Central,	26954)
+ValuePair(PCS_NAD83_Colorado_South,	26955)
+ValuePair(PCS_NAD83_Connecticut,	26956)
+ValuePair(PCS_NAD83_Delaware,	26957)
+ValuePair(PCS_NAD83_Florida_East,	26958)
+ValuePair(PCS_NAD83_Florida_West,	26959)
+ValuePair(PCS_NAD83_Florida_North,	26960)
+ValuePair(PCS_NAD83_Hawaii_zone_1,	26961)
+ValuePair(PCS_NAD83_Hawaii_zone_2,	26962)
+ValuePair(PCS_NAD83_Hawaii_zone_3,	26963)
+ValuePair(PCS_NAD83_Hawaii_zone_4,	26964)
+ValuePair(PCS_NAD83_Hawaii_zone_5,	26965)
+ValuePair(PCS_NAD83_Georgia_East,	26966)
+ValuePair(PCS_NAD83_Georgia_West,	26967)
+ValuePair(PCS_NAD83_Idaho_East,	26968)
+ValuePair(PCS_NAD83_Idaho_Central,	26969)
+ValuePair(PCS_NAD83_Idaho_West,	26970)
+ValuePair(PCS_NAD83_Illinois_East,	26971)
+ValuePair(PCS_NAD83_Illinois_West,	26972)
+ValuePair(PCS_NAD83_Indiana_East,	26973)
+ValuePair(PCS_NAD83_Indiana_West,	26974)
+ValuePair(PCS_NAD83_Iowa_North,	26975)
+ValuePair(PCS_NAD83_Iowa_South,	26976)
+ValuePair(PCS_NAD83_Kansas_North,	26977)
+ValuePair(PCS_NAD83_Kansas_South,	26978)
+ValuePair(PCS_NAD83_Kentucky_North,	2205)
+ValuePair(PCS_NAD83_Kentucky_South,	26980)
+ValuePair(PCS_NAD83_Louisiana_North,	26981)
+ValuePair(PCS_NAD83_Louisiana_South,	26982)
+ValuePair(PCS_NAD83_Maine_East,	26983)
+ValuePair(PCS_NAD83_Maine_West,	26984)
+ValuePair(PCS_NAD83_Maryland,	26985)
+ValuePair(PCS_NAD83_Massachusetts,	26986)
+ValuePair(PCS_NAD83_Massachusetts_Is,	26987)
+ValuePair(PCS_NAD83_Michigan_North,	26988)
+ValuePair(PCS_NAD83_Michigan_Central,	26989)
+ValuePair(PCS_NAD83_Michigan_South,	26990)
+ValuePair(PCS_NAD83_Minnesota_North,	26991)
+ValuePair(PCS_NAD83_Minnesota_Cent,	26992)
+ValuePair(PCS_NAD83_Minnesota_South,	26993)
+ValuePair(PCS_NAD83_Mississippi_East,	26994)
+ValuePair(PCS_NAD83_Mississippi_West,	26995)
+ValuePair(PCS_NAD83_Missouri_East,	26996)
+ValuePair(PCS_NAD83_Missouri_Central,	26997)
+ValuePair(PCS_NAD83_Missouri_West,	26998)
+ValuePair(PCS_Nahrwan_1967_UTM_38N,	27038)
+ValuePair(PCS_Nahrwan_1967_UTM_39N,	27039)
+ValuePair(PCS_Nahrwan_1967_UTM_40N,	27040)
+ValuePair(PCS_Naparima_UTM_20N,	27120)
+ValuePair(PCS_GD49_NZ_Map_Grid,	27200)
+ValuePair(PCS_GD49_North_Island_Grid,	27291)
+ValuePair(PCS_GD49_South_Island_Grid,	27292)
+ValuePair(PCS_Datum_73_UTM_zone_29N,	27429)
+ValuePair(PCS_ATF_Nord_de_Guerre,	27500)
+ValuePair(PCS_NTF_France_I,	27581)
+ValuePair(PCS_NTF_France_II,	27582)
+ValuePair(PCS_NTF_France_III,	27583)
+ValuePair(PCS_NTF_Nord_France,	27591)
+ValuePair(PCS_NTF_Centre_France,	27592)
+ValuePair(PCS_NTF_Sud_France,	27593)
+ValuePair(PCS_British_National_Grid,	27700)
+ValuePair(PCS_Point_Noire_UTM_32S,	28232)
+ValuePair(PCS_GDA94_MGA_zone_48,	28348)
+ValuePair(PCS_GDA94_MGA_zone_49,	28349)
+ValuePair(PCS_GDA94_MGA_zone_50,	28350)
+ValuePair(PCS_GDA94_MGA_zone_51,	28351)
+ValuePair(PCS_GDA94_MGA_zone_52,	28352)
+ValuePair(PCS_GDA94_MGA_zone_53,	28353)
+ValuePair(PCS_GDA94_MGA_zone_54,	28354)
+ValuePair(PCS_GDA94_MGA_zone_55,	28355)
+ValuePair(PCS_GDA94_MGA_zone_56,	28356)
+ValuePair(PCS_GDA94_MGA_zone_57,	28357)
+ValuePair(PCS_GDA94_MGA_zone_58,	28358)
+ValuePair(PCS_Pulkovo_Gauss_zone_4,	28404)
+ValuePair(PCS_Pulkovo_Gauss_zone_5,	28405)
+ValuePair(PCS_Pulkovo_Gauss_zone_6,	28406)
+ValuePair(PCS_Pulkovo_Gauss_zone_7,	28407)
+ValuePair(PCS_Pulkovo_Gauss_zone_8,	28408)
+ValuePair(PCS_Pulkovo_Gauss_zone_9,	28409)
+ValuePair(PCS_Pulkovo_Gauss_zone_10,	28410)
+ValuePair(PCS_Pulkovo_Gauss_zone_11,	28411)
+ValuePair(PCS_Pulkovo_Gauss_zone_12,	28412)
+ValuePair(PCS_Pulkovo_Gauss_zone_13,	28413)
+ValuePair(PCS_Pulkovo_Gauss_zone_14,	28414)
+ValuePair(PCS_Pulkovo_Gauss_zone_15,	28415)
+ValuePair(PCS_Pulkovo_Gauss_zone_16,	28416)
+ValuePair(PCS_Pulkovo_Gauss_zone_17,	28417)
+ValuePair(PCS_Pulkovo_Gauss_zone_18,	28418)
+ValuePair(PCS_Pulkovo_Gauss_zone_19,	28419)
+ValuePair(PCS_Pulkovo_Gauss_zone_20,	28420)
+ValuePair(PCS_Pulkovo_Gauss_zone_21,	28421)
+ValuePair(PCS_Pulkovo_Gauss_zone_22,	28422)
+ValuePair(PCS_Pulkovo_Gauss_zone_23,	28423)
+ValuePair(PCS_Pulkovo_Gauss_zone_24,	28424)
+ValuePair(PCS_Pulkovo_Gauss_zone_25,	28425)
+ValuePair(PCS_Pulkovo_Gauss_zone_26,	28426)
+ValuePair(PCS_Pulkovo_Gauss_zone_27,	28427)
+ValuePair(PCS_Pulkovo_Gauss_zone_28,	28428)
+ValuePair(PCS_Pulkovo_Gauss_zone_29,	28429)
+ValuePair(PCS_Pulkovo_Gauss_zone_30,	28430)
+ValuePair(PCS_Pulkovo_Gauss_zone_31,	28431)
+ValuePair(PCS_Pulkovo_Gauss_zone_32,	28432)
+ValuePair(PCS_Pulkovo_Gauss_4N,	28464)
+ValuePair(PCS_Pulkovo_Gauss_5N,	28465)
+ValuePair(PCS_Pulkovo_Gauss_6N,	28466)
+ValuePair(PCS_Pulkovo_Gauss_7N,	28467)
+ValuePair(PCS_Pulkovo_Gauss_8N,	28468)
+ValuePair(PCS_Pulkovo_Gauss_9N,	28469)
+ValuePair(PCS_Pulkovo_Gauss_10N,	28470)
+ValuePair(PCS_Pulkovo_Gauss_11N,	28471)
+ValuePair(PCS_Pulkovo_Gauss_12N,	28472)
+ValuePair(PCS_Pulkovo_Gauss_13N,	28473)
+ValuePair(PCS_Pulkovo_Gauss_14N,	28474)
+ValuePair(PCS_Pulkovo_Gauss_15N,	28475)
+ValuePair(PCS_Pulkovo_Gauss_16N,	28476)
+ValuePair(PCS_Pulkovo_Gauss_17N,	28477)
+ValuePair(PCS_Pulkovo_Gauss_18N,	28478)
+ValuePair(PCS_Pulkovo_Gauss_19N,	28479)
+ValuePair(PCS_Pulkovo_Gauss_20N,	28480)
+ValuePair(PCS_Pulkovo_Gauss_21N,	28481)
+ValuePair(PCS_Pulkovo_Gauss_22N,	28482)
+ValuePair(PCS_Pulkovo_Gauss_23N,	28483)
+ValuePair(PCS_Pulkovo_Gauss_24N,	28484)
+ValuePair(PCS_Pulkovo_Gauss_25N,	28485)
+ValuePair(PCS_Pulkovo_Gauss_26N,	28486)
+ValuePair(PCS_Pulkovo_Gauss_27N,	28487)
+ValuePair(PCS_Pulkovo_Gauss_28N,	28488)
+ValuePair(PCS_Pulkovo_Gauss_29N,	28489)
+ValuePair(PCS_Pulkovo_Gauss_30N,	28490)
+ValuePair(PCS_Pulkovo_Gauss_31N,	28491)
+ValuePair(PCS_Pulkovo_Gauss_32N,	28492)
+ValuePair(PCS_Qatar_National_Grid,	28600)
+ValuePair(PCS_RD_Netherlands_Old,	28991)
+ValuePair(PCS_RD_Netherlands_New,	28992)
+ValuePair(PCS_SAD69_UTM_zone_18N,	29118)
+ValuePair(PCS_SAD69_UTM_zone_19N,	29119)
+ValuePair(PCS_SAD69_UTM_zone_20N,	29120)
+ValuePair(PCS_SAD69_UTM_zone_21N,	29121)
+ValuePair(PCS_SAD69_UTM_zone_22N,	29122)
+ValuePair(PCS_SAD69_UTM_zone_17S,	29177)
+ValuePair(PCS_SAD69_UTM_zone_18S,	29178)
+ValuePair(PCS_SAD69_UTM_zone_19S,	29179)
+ValuePair(PCS_SAD69_UTM_zone_20S,	29180)
+ValuePair(PCS_SAD69_UTM_zone_21S,	29181)
+ValuePair(PCS_SAD69_UTM_zone_22S,	29182)
+ValuePair(PCS_SAD69_UTM_zone_23S,	29183)
+ValuePair(PCS_SAD69_UTM_zone_24S,	29184)
+ValuePair(PCS_SAD69_UTM_zone_25S,	29185)
+ValuePair(PCS_Sapper_Hill_UTM_20S,	29220)
+ValuePair(PCS_Sapper_Hill_UTM_21S,	29221)
+ValuePair(PCS_Schwarzeck_UTM_33S,	29333)
+ValuePair(PCS_Sudan_UTM_zone_35N,	29635)
+ValuePair(PCS_Sudan_UTM_zone_36N,	29636)
+ValuePair(PCS_Tananarive_Laborde,	29700)
+ValuePair(PCS_Tananarive_UTM_38S,	29738)
+ValuePair(PCS_Tananarive_UTM_39S,	29739)
+ValuePair(PCS_Timbalai_1948_Borneo,	29800)
+ValuePair(PCS_Timbalai_1948_UTM_49N,	29849)
+ValuePair(PCS_Timbalai_1948_UTM_50N,	29850)
+ValuePair(PCS_TM65_Irish_Nat_Grid,	29900)
+ValuePair(PCS_Trinidad_1903_Trinidad,	30200)
+ValuePair(PCS_TC_1948_UTM_zone_39N,	30339)
+ValuePair(PCS_TC_1948_UTM_zone_40N,	30340)
+ValuePair(PCS_Voirol_N_Algerie_ancien,	30491)
+ValuePair(PCS_Voirol_S_Algerie_ancien,	30492)
+ValuePair(PCS_Voirol_Unifie_N_Algerie,	30591)
+ValuePair(PCS_Voirol_Unifie_S_Algerie,	30592)
+ValuePair(PCS_Bern_1938_Swiss_New,	30600)
+ValuePair(PCS_Nord_Sahara_UTM_29N,	30729)
+ValuePair(PCS_Nord_Sahara_UTM_30N,	30730)
+ValuePair(PCS_Nord_Sahara_UTM_31N,	30731)
+ValuePair(PCS_Nord_Sahara_UTM_32N,	30732)
+ValuePair(PCS_Yoff_UTM_zone_28N,	31028)
+ValuePair(PCS_Zanderij_UTM_zone_21N,	31121)
+ValuePair(PCS_MGI_Austria_West,	31291)
+ValuePair(PCS_MGI_Austria_Central,	31292)
+ValuePair(PCS_MGI_Austria_East,	31293)
+ValuePair(PCS_Belge_Lambert_72,	31300)
+ValuePair(PCS_DHDN_Germany_zone_1,	31491)
+ValuePair(PCS_DHDN_Germany_zone_2,	31492)
+ValuePair(PCS_DHDN_Germany_zone_3,	31493)
+ValuePair(PCS_DHDN_Germany_zone_4,	31494)
+ValuePair(PCS_DHDN_Germany_zone_5,	31495)
+ValuePair(PCS_NAD27_Montana_North,	32001)
+ValuePair(PCS_NAD27_Montana_Central,	32002)
+ValuePair(PCS_NAD27_Montana_South,	32003)
+ValuePair(PCS_NAD27_Nebraska_North,	32005)
+ValuePair(PCS_NAD27_Nebraska_South,	32006)
+ValuePair(PCS_NAD27_Nevada_East,	32007)
+ValuePair(PCS_NAD27_Nevada_Central,	32008)
+ValuePair(PCS_NAD27_Nevada_West,	32009)
+ValuePair(PCS_NAD27_New_Hampshire,	32010)
+ValuePair(PCS_NAD27_New_Jersey,	32011)
+ValuePair(PCS_NAD27_New_Mexico_East,	32012)
+ValuePair(PCS_NAD27_New_Mexico_Cent,	32013)
+ValuePair(PCS_NAD27_New_Mexico_West,	32014)
+ValuePair(PCS_NAD27_New_York_East,	32015)
+ValuePair(PCS_NAD27_New_York_Central,	32016)
+ValuePair(PCS_NAD27_New_York_West,	32017)
+ValuePair(PCS_NAD27_New_York_Long_Is,	32018)
+ValuePair(PCS_NAD27_North_Carolina,	32019)
+ValuePair(PCS_NAD27_North_Dakota_N,	32020)
+ValuePair(PCS_NAD27_North_Dakota_S,	32021)
+ValuePair(PCS_NAD27_Ohio_North,	32022)
+ValuePair(PCS_NAD27_Ohio_South,	32023)
+ValuePair(PCS_NAD27_Oklahoma_North,	32024)
+ValuePair(PCS_NAD27_Oklahoma_South,	32025)
+ValuePair(PCS_NAD27_Oregon_North,	32026)
+ValuePair(PCS_NAD27_Oregon_South,	32027)
+ValuePair(PCS_NAD27_Pennsylvania_N,	32028)
+ValuePair(PCS_NAD27_Pennsylvania_S,	32029)
+ValuePair(PCS_NAD27_Rhode_Island,	32030)
+ValuePair(PCS_NAD27_South_Carolina_N,	32031)
+ValuePair(PCS_NAD27_South_Carolina_S,	32033)
+ValuePair(PCS_NAD27_South_Dakota_N,	32034)
+ValuePair(PCS_NAD27_South_Dakota_S,	32035)
+ValuePair(PCS_NAD27_Tennessee,		2204)
+ValuePair(PCS_NAD27_Texas_North,	32037)
+ValuePair(PCS_NAD27_Texas_North_Cen,	32038)
+ValuePair(PCS_NAD27_Texas_Central,	32039)
+ValuePair(PCS_NAD27_Texas_South_Cen,	32040)
+ValuePair(PCS_NAD27_Texas_South,	32041)
+ValuePair(PCS_NAD27_Utah_North,	32042)
+ValuePair(PCS_NAD27_Utah_Central,	32043)
+ValuePair(PCS_NAD27_Utah_South,	32044)
+ValuePair(PCS_NAD27_Vermont,	32045)
+ValuePair(PCS_NAD27_Virginia_North,	32046)
+ValuePair(PCS_NAD27_Virginia_South,	32047)
+ValuePair(PCS_NAD27_Washington_North,	32048)
+ValuePair(PCS_NAD27_Washington_South,	32049)
+ValuePair(PCS_NAD27_West_Virginia_N,	32050)
+ValuePair(PCS_NAD27_West_Virginia_S,	32051)
+ValuePair(PCS_NAD27_Wisconsin_North,	32052)
+ValuePair(PCS_NAD27_Wisconsin_Cen,	32053)
+ValuePair(PCS_NAD27_Wisconsin_South,	32054)
+ValuePair(PCS_NAD27_Wyoming_East,	32055)
+ValuePair(PCS_NAD27_Wyoming_E_Cen,	32056)
+ValuePair(PCS_NAD27_Wyoming_W_Cen,	32057)
+ValuePair(PCS_NAD27_Wyoming_West,	32058)
+ValuePair(PCS_NAD27_Puerto_Rico,	32059)
+ValuePair(PCS_NAD27_St_Croix,	32060)
+ValuePair(PCS_NAD83_Montana,	32100)
+ValuePair(PCS_NAD83_Nebraska,	32104)
+ValuePair(PCS_NAD83_Nevada_East,	32107)
+ValuePair(PCS_NAD83_Nevada_Central,	32108)
+ValuePair(PCS_NAD83_Nevada_West,	32109)
+ValuePair(PCS_NAD83_New_Hampshire,	32110)
+ValuePair(PCS_NAD83_New_Jersey,	32111)
+ValuePair(PCS_NAD83_New_Mexico_East,	32112)
+ValuePair(PCS_NAD83_New_Mexico_Cent,	32113)
+ValuePair(PCS_NAD83_New_Mexico_West,	32114)
+ValuePair(PCS_NAD83_New_York_East,	32115)
+ValuePair(PCS_NAD83_New_York_Central,	32116)
+ValuePair(PCS_NAD83_New_York_West,	32117)
+ValuePair(PCS_NAD83_New_York_Long_Is,	32118)
+ValuePair(PCS_NAD83_North_Carolina,	32119)
+ValuePair(PCS_NAD83_North_Dakota_N,	32120)
+ValuePair(PCS_NAD83_North_Dakota_S,	32121)
+ValuePair(PCS_NAD83_Ohio_North,	32122)
+ValuePair(PCS_NAD83_Ohio_South,	32123)
+ValuePair(PCS_NAD83_Oklahoma_North,	32124)
+ValuePair(PCS_NAD83_Oklahoma_South,	32125)
+ValuePair(PCS_NAD83_Oregon_North,	32126)
+ValuePair(PCS_NAD83_Oregon_South,	32127)
+ValuePair(PCS_NAD83_Pennsylvania_N,	32128)
+ValuePair(PCS_NAD83_Pennsylvania_S,	32129)
+ValuePair(PCS_NAD83_Rhode_Island,	32130)
+ValuePair(PCS_NAD83_South_Carolina,	32133)
+ValuePair(PCS_NAD83_South_Dakota_N,	32134)
+ValuePair(PCS_NAD83_South_Dakota_S,	32135)
+ValuePair(PCS_NAD83_Tennessee,	32136)
+ValuePair(PCS_NAD83_Texas_North,	32137)
+ValuePair(PCS_NAD83_Texas_North_Cen,	32138)
+ValuePair(PCS_NAD83_Texas_Central,	32139)
+ValuePair(PCS_NAD83_Texas_South_Cen,	32140)
+ValuePair(PCS_NAD83_Texas_South,	32141)
+ValuePair(PCS_NAD83_Utah_North,	32142)
+ValuePair(PCS_NAD83_Utah_Central,	32143)
+ValuePair(PCS_NAD83_Utah_South,	32144)
+ValuePair(PCS_NAD83_Vermont,	32145)
+ValuePair(PCS_NAD83_Virginia_North,	32146)
+ValuePair(PCS_NAD83_Virginia_South,	32147)
+ValuePair(PCS_NAD83_Washington_North,	32148)
+ValuePair(PCS_NAD83_Washington_South,	32149)
+ValuePair(PCS_NAD83_West_Virginia_N,	32150)
+ValuePair(PCS_NAD83_West_Virginia_S,	32151)
+ValuePair(PCS_NAD83_Wisconsin_North,	32152)
+ValuePair(PCS_NAD83_Wisconsin_Cen,	32153)
+ValuePair(PCS_NAD83_Wisconsin_South,	32154)
+ValuePair(PCS_NAD83_Wyoming_East,	32155)
+ValuePair(PCS_NAD83_Wyoming_E_Cen,	32156)
+ValuePair(PCS_NAD83_Wyoming_W_Cen,	32157)
+ValuePair(PCS_NAD83_Wyoming_West,	32158)
+ValuePair(PCS_NAD83_Puerto_Rico_Virgin_Is,	32161)
+ValuePair(PCS_WGS72_UTM_zone_1N,	32201)
+ValuePair(PCS_WGS72_UTM_zone_2N,	32202)
+ValuePair(PCS_WGS72_UTM_zone_3N,	32203)
+ValuePair(PCS_WGS72_UTM_zone_4N,	32204)
+ValuePair(PCS_WGS72_UTM_zone_5N,	32205)
+ValuePair(PCS_WGS72_UTM_zone_6N,	32206)
+ValuePair(PCS_WGS72_UTM_zone_7N,	32207)
+ValuePair(PCS_WGS72_UTM_zone_8N,	32208)
+ValuePair(PCS_WGS72_UTM_zone_9N,	32209)
+ValuePair(PCS_WGS72_UTM_zone_10N,	32210)
+ValuePair(PCS_WGS72_UTM_zone_11N,	32211)
+ValuePair(PCS_WGS72_UTM_zone_12N,	32212)
+ValuePair(PCS_WGS72_UTM_zone_13N,	32213)
+ValuePair(PCS_WGS72_UTM_zone_14N,	32214)
+ValuePair(PCS_WGS72_UTM_zone_15N,	32215)
+ValuePair(PCS_WGS72_UTM_zone_16N,	32216)
+ValuePair(PCS_WGS72_UTM_zone_17N,	32217)
+ValuePair(PCS_WGS72_UTM_zone_18N,	32218)
+ValuePair(PCS_WGS72_UTM_zone_19N,	32219)
+ValuePair(PCS_WGS72_UTM_zone_20N,	32220)
+ValuePair(PCS_WGS72_UTM_zone_21N,	32221)
+ValuePair(PCS_WGS72_UTM_zone_22N,	32222)
+ValuePair(PCS_WGS72_UTM_zone_23N,	32223)
+ValuePair(PCS_WGS72_UTM_zone_24N,	32224)
+ValuePair(PCS_WGS72_UTM_zone_25N,	32225)
+ValuePair(PCS_WGS72_UTM_zone_26N,	32226)
+ValuePair(PCS_WGS72_UTM_zone_27N,	32227)
+ValuePair(PCS_WGS72_UTM_zone_28N,	32228)
+ValuePair(PCS_WGS72_UTM_zone_29N,	32229)
+ValuePair(PCS_WGS72_UTM_zone_30N,	32230)
+ValuePair(PCS_WGS72_UTM_zone_31N,	32231)
+ValuePair(PCS_WGS72_UTM_zone_32N,	32232)
+ValuePair(PCS_WGS72_UTM_zone_33N,	32233)
+ValuePair(PCS_WGS72_UTM_zone_34N,	32234)
+ValuePair(PCS_WGS72_UTM_zone_35N,	32235)
+ValuePair(PCS_WGS72_UTM_zone_36N,	32236)
+ValuePair(PCS_WGS72_UTM_zone_37N,	32237)
+ValuePair(PCS_WGS72_UTM_zone_38N,	32238)
+ValuePair(PCS_WGS72_UTM_zone_39N,	32239)
+ValuePair(PCS_WGS72_UTM_zone_40N,	32240)
+ValuePair(PCS_WGS72_UTM_zone_41N,	32241)
+ValuePair(PCS_WGS72_UTM_zone_42N,	32242)
+ValuePair(PCS_WGS72_UTM_zone_43N,	32243)
+ValuePair(PCS_WGS72_UTM_zone_44N,	32244)
+ValuePair(PCS_WGS72_UTM_zone_45N,	32245)
+ValuePair(PCS_WGS72_UTM_zone_46N,	32246)
+ValuePair(PCS_WGS72_UTM_zone_47N,	32247)
+ValuePair(PCS_WGS72_UTM_zone_48N,	32248)
+ValuePair(PCS_WGS72_UTM_zone_49N,	32249)
+ValuePair(PCS_WGS72_UTM_zone_50N,	32250)
+ValuePair(PCS_WGS72_UTM_zone_51N,	32251)
+ValuePair(PCS_WGS72_UTM_zone_52N,	32252)
+ValuePair(PCS_WGS72_UTM_zone_53N,	32253)
+ValuePair(PCS_WGS72_UTM_zone_54N,	32254)
+ValuePair(PCS_WGS72_UTM_zone_55N,	32255)
+ValuePair(PCS_WGS72_UTM_zone_56N,	32256)
+ValuePair(PCS_WGS72_UTM_zone_57N,	32257)
+ValuePair(PCS_WGS72_UTM_zone_58N,	32258)
+ValuePair(PCS_WGS72_UTM_zone_59N,	32259)
+ValuePair(PCS_WGS72_UTM_zone_60N,	32260)
+ValuePair(PCS_WGS72_UTM_zone_1S,	32301)
+ValuePair(PCS_WGS72_UTM_zone_2S,	32302)
+ValuePair(PCS_WGS72_UTM_zone_3S,	32303)
+ValuePair(PCS_WGS72_UTM_zone_4S,	32304)
+ValuePair(PCS_WGS72_UTM_zone_5S,	32305)
+ValuePair(PCS_WGS72_UTM_zone_6S,	32306)
+ValuePair(PCS_WGS72_UTM_zone_7S,	32307)
+ValuePair(PCS_WGS72_UTM_zone_8S,	32308)
+ValuePair(PCS_WGS72_UTM_zone_9S,	32309)
+ValuePair(PCS_WGS72_UTM_zone_10S,	32310)
+ValuePair(PCS_WGS72_UTM_zone_11S,	32311)
+ValuePair(PCS_WGS72_UTM_zone_12S,	32312)
+ValuePair(PCS_WGS72_UTM_zone_13S,	32313)
+ValuePair(PCS_WGS72_UTM_zone_14S,	32314)
+ValuePair(PCS_WGS72_UTM_zone_15S,	32315)
+ValuePair(PCS_WGS72_UTM_zone_16S,	32316)
+ValuePair(PCS_WGS72_UTM_zone_17S,	32317)
+ValuePair(PCS_WGS72_UTM_zone_18S,	32318)
+ValuePair(PCS_WGS72_UTM_zone_19S,	32319)
+ValuePair(PCS_WGS72_UTM_zone_20S,	32320)
+ValuePair(PCS_WGS72_UTM_zone_21S,	32321)
+ValuePair(PCS_WGS72_UTM_zone_22S,	32322)
+ValuePair(PCS_WGS72_UTM_zone_23S,	32323)
+ValuePair(PCS_WGS72_UTM_zone_24S,	32324)
+ValuePair(PCS_WGS72_UTM_zone_25S,	32325)
+ValuePair(PCS_WGS72_UTM_zone_26S,	32326)
+ValuePair(PCS_WGS72_UTM_zone_27S,	32327)
+ValuePair(PCS_WGS72_UTM_zone_28S,	32328)
+ValuePair(PCS_WGS72_UTM_zone_29S,	32329)
+ValuePair(PCS_WGS72_UTM_zone_30S,	32330)
+ValuePair(PCS_WGS72_UTM_zone_31S,	32331)
+ValuePair(PCS_WGS72_UTM_zone_32S,	32332)
+ValuePair(PCS_WGS72_UTM_zone_33S,	32333)
+ValuePair(PCS_WGS72_UTM_zone_34S,	32334)
+ValuePair(PCS_WGS72_UTM_zone_35S,	32335)
+ValuePair(PCS_WGS72_UTM_zone_36S,	32336)
+ValuePair(PCS_WGS72_UTM_zone_37S,	32337)
+ValuePair(PCS_WGS72_UTM_zone_38S,	32338)
+ValuePair(PCS_WGS72_UTM_zone_39S,	32339)
+ValuePair(PCS_WGS72_UTM_zone_40S,	32340)
+ValuePair(PCS_WGS72_UTM_zone_41S,	32341)
+ValuePair(PCS_WGS72_UTM_zone_42S,	32342)
+ValuePair(PCS_WGS72_UTM_zone_43S,	32343)
+ValuePair(PCS_WGS72_UTM_zone_44S,	32344)
+ValuePair(PCS_WGS72_UTM_zone_45S,	32345)
+ValuePair(PCS_WGS72_UTM_zone_46S,	32346)
+ValuePair(PCS_WGS72_UTM_zone_47S,	32347)
+ValuePair(PCS_WGS72_UTM_zone_48S,	32348)
+ValuePair(PCS_WGS72_UTM_zone_49S,	32349)
+ValuePair(PCS_WGS72_UTM_zone_50S,	32350)
+ValuePair(PCS_WGS72_UTM_zone_51S,	32351)
+ValuePair(PCS_WGS72_UTM_zone_52S,	32352)
+ValuePair(PCS_WGS72_UTM_zone_53S,	32353)
+ValuePair(PCS_WGS72_UTM_zone_54S,	32354)
+ValuePair(PCS_WGS72_UTM_zone_55S,	32355)
+ValuePair(PCS_WGS72_UTM_zone_56S,	32356)
+ValuePair(PCS_WGS72_UTM_zone_57S,	32357)
+ValuePair(PCS_WGS72_UTM_zone_58S,	32358)
+ValuePair(PCS_WGS72_UTM_zone_59S,	32359)
+ValuePair(PCS_WGS72_UTM_zone_60S,	32360)
+ValuePair(PCS_WGS72BE_UTM_zone_1N,	32401)
+ValuePair(PCS_WGS72BE_UTM_zone_2N,	32402)
+ValuePair(PCS_WGS72BE_UTM_zone_3N,	32403)
+ValuePair(PCS_WGS72BE_UTM_zone_4N,	32404)
+ValuePair(PCS_WGS72BE_UTM_zone_5N,	32405)
+ValuePair(PCS_WGS72BE_UTM_zone_6N,	32406)
+ValuePair(PCS_WGS72BE_UTM_zone_7N,	32407)
+ValuePair(PCS_WGS72BE_UTM_zone_8N,	32408)
+ValuePair(PCS_WGS72BE_UTM_zone_9N,	32409)
+ValuePair(PCS_WGS72BE_UTM_zone_10N,	32410)
+ValuePair(PCS_WGS72BE_UTM_zone_11N,	32411)
+ValuePair(PCS_WGS72BE_UTM_zone_12N,	32412)
+ValuePair(PCS_WGS72BE_UTM_zone_13N,	32413)
+ValuePair(PCS_WGS72BE_UTM_zone_14N,	32414)
+ValuePair(PCS_WGS72BE_UTM_zone_15N,	32415)
+ValuePair(PCS_WGS72BE_UTM_zone_16N,	32416)
+ValuePair(PCS_WGS72BE_UTM_zone_17N,	32417)
+ValuePair(PCS_WGS72BE_UTM_zone_18N,	32418)
+ValuePair(PCS_WGS72BE_UTM_zone_19N,	32419)
+ValuePair(PCS_WGS72BE_UTM_zone_20N,	32420)
+ValuePair(PCS_WGS72BE_UTM_zone_21N,	32421)
+ValuePair(PCS_WGS72BE_UTM_zone_22N,	32422)
+ValuePair(PCS_WGS72BE_UTM_zone_23N,	32423)
+ValuePair(PCS_WGS72BE_UTM_zone_24N,	32424)
+ValuePair(PCS_WGS72BE_UTM_zone_25N,	32425)
+ValuePair(PCS_WGS72BE_UTM_zone_26N,	32426)
+ValuePair(PCS_WGS72BE_UTM_zone_27N,	32427)
+ValuePair(PCS_WGS72BE_UTM_zone_28N,	32428)
+ValuePair(PCS_WGS72BE_UTM_zone_29N,	32429)
+ValuePair(PCS_WGS72BE_UTM_zone_30N,	32430)
+ValuePair(PCS_WGS72BE_UTM_zone_31N,	32431)
+ValuePair(PCS_WGS72BE_UTM_zone_32N,	32432)
+ValuePair(PCS_WGS72BE_UTM_zone_33N,	32433)
+ValuePair(PCS_WGS72BE_UTM_zone_34N,	32434)
+ValuePair(PCS_WGS72BE_UTM_zone_35N,	32435)
+ValuePair(PCS_WGS72BE_UTM_zone_36N,	32436)
+ValuePair(PCS_WGS72BE_UTM_zone_37N,	32437)
+ValuePair(PCS_WGS72BE_UTM_zone_38N,	32438)
+ValuePair(PCS_WGS72BE_UTM_zone_39N,	32439)
+ValuePair(PCS_WGS72BE_UTM_zone_40N,	32440)
+ValuePair(PCS_WGS72BE_UTM_zone_41N,	32441)
+ValuePair(PCS_WGS72BE_UTM_zone_42N,	32442)
+ValuePair(PCS_WGS72BE_UTM_zone_43N,	32443)
+ValuePair(PCS_WGS72BE_UTM_zone_44N,	32444)
+ValuePair(PCS_WGS72BE_UTM_zone_45N,	32445)
+ValuePair(PCS_WGS72BE_UTM_zone_46N,	32446)
+ValuePair(PCS_WGS72BE_UTM_zone_47N,	32447)
+ValuePair(PCS_WGS72BE_UTM_zone_48N,	32448)
+ValuePair(PCS_WGS72BE_UTM_zone_49N,	32449)
+ValuePair(PCS_WGS72BE_UTM_zone_50N,	32450)
+ValuePair(PCS_WGS72BE_UTM_zone_51N,	32451)
+ValuePair(PCS_WGS72BE_UTM_zone_52N,	32452)
+ValuePair(PCS_WGS72BE_UTM_zone_53N,	32453)
+ValuePair(PCS_WGS72BE_UTM_zone_54N,	32454)
+ValuePair(PCS_WGS72BE_UTM_zone_55N,	32455)
+ValuePair(PCS_WGS72BE_UTM_zone_56N,	32456)
+ValuePair(PCS_WGS72BE_UTM_zone_57N,	32457)
+ValuePair(PCS_WGS72BE_UTM_zone_58N,	32458)
+ValuePair(PCS_WGS72BE_UTM_zone_59N,	32459)
+ValuePair(PCS_WGS72BE_UTM_zone_60N,	32460)
+ValuePair(PCS_WGS72BE_UTM_zone_1S,	32501)
+ValuePair(PCS_WGS72BE_UTM_zone_2S,	32502)
+ValuePair(PCS_WGS72BE_UTM_zone_3S,	32503)
+ValuePair(PCS_WGS72BE_UTM_zone_4S,	32504)
+ValuePair(PCS_WGS72BE_UTM_zone_5S,	32505)
+ValuePair(PCS_WGS72BE_UTM_zone_6S,	32506)
+ValuePair(PCS_WGS72BE_UTM_zone_7S,	32507)
+ValuePair(PCS_WGS72BE_UTM_zone_8S,	32508)
+ValuePair(PCS_WGS72BE_UTM_zone_9S,	32509)
+ValuePair(PCS_WGS72BE_UTM_zone_10S,	32510)
+ValuePair(PCS_WGS72BE_UTM_zone_11S,	32511)
+ValuePair(PCS_WGS72BE_UTM_zone_12S,	32512)
+ValuePair(PCS_WGS72BE_UTM_zone_13S,	32513)
+ValuePair(PCS_WGS72BE_UTM_zone_14S,	32514)
+ValuePair(PCS_WGS72BE_UTM_zone_15S,	32515)
+ValuePair(PCS_WGS72BE_UTM_zone_16S,	32516)
+ValuePair(PCS_WGS72BE_UTM_zone_17S,	32517)
+ValuePair(PCS_WGS72BE_UTM_zone_18S,	32518)
+ValuePair(PCS_WGS72BE_UTM_zone_19S,	32519)
+ValuePair(PCS_WGS72BE_UTM_zone_20S,	32520)
+ValuePair(PCS_WGS72BE_UTM_zone_21S,	32521)
+ValuePair(PCS_WGS72BE_UTM_zone_22S,	32522)
+ValuePair(PCS_WGS72BE_UTM_zone_23S,	32523)
+ValuePair(PCS_WGS72BE_UTM_zone_24S,	32524)
+ValuePair(PCS_WGS72BE_UTM_zone_25S,	32525)
+ValuePair(PCS_WGS72BE_UTM_zone_26S,	32526)
+ValuePair(PCS_WGS72BE_UTM_zone_27S,	32527)
+ValuePair(PCS_WGS72BE_UTM_zone_28S,	32528)
+ValuePair(PCS_WGS72BE_UTM_zone_29S,	32529)
+ValuePair(PCS_WGS72BE_UTM_zone_30S,	32530)
+ValuePair(PCS_WGS72BE_UTM_zone_31S,	32531)
+ValuePair(PCS_WGS72BE_UTM_zone_32S,	32532)
+ValuePair(PCS_WGS72BE_UTM_zone_33S,	32533)
+ValuePair(PCS_WGS72BE_UTM_zone_34S,	32534)
+ValuePair(PCS_WGS72BE_UTM_zone_35S,	32535)
+ValuePair(PCS_WGS72BE_UTM_zone_36S,	32536)
+ValuePair(PCS_WGS72BE_UTM_zone_37S,	32537)
+ValuePair(PCS_WGS72BE_UTM_zone_38S,	32538)
+ValuePair(PCS_WGS72BE_UTM_zone_39S,	32539)
+ValuePair(PCS_WGS72BE_UTM_zone_40S,	32540)
+ValuePair(PCS_WGS72BE_UTM_zone_41S,	32541)
+ValuePair(PCS_WGS72BE_UTM_zone_42S,	32542)
+ValuePair(PCS_WGS72BE_UTM_zone_43S,	32543)
+ValuePair(PCS_WGS72BE_UTM_zone_44S,	32544)
+ValuePair(PCS_WGS72BE_UTM_zone_45S,	32545)
+ValuePair(PCS_WGS72BE_UTM_zone_46S,	32546)
+ValuePair(PCS_WGS72BE_UTM_zone_47S,	32547)
+ValuePair(PCS_WGS72BE_UTM_zone_48S,	32548)
+ValuePair(PCS_WGS72BE_UTM_zone_49S,	32549)
+ValuePair(PCS_WGS72BE_UTM_zone_50S,	32550)
+ValuePair(PCS_WGS72BE_UTM_zone_51S,	32551)
+ValuePair(PCS_WGS72BE_UTM_zone_52S,	32552)
+ValuePair(PCS_WGS72BE_UTM_zone_53S,	32553)
+ValuePair(PCS_WGS72BE_UTM_zone_54S,	32554)
+ValuePair(PCS_WGS72BE_UTM_zone_55S,	32555)
+ValuePair(PCS_WGS72BE_UTM_zone_56S,	32556)
+ValuePair(PCS_WGS72BE_UTM_zone_57S,	32557)
+ValuePair(PCS_WGS72BE_UTM_zone_58S,	32558)
+ValuePair(PCS_WGS72BE_UTM_zone_59S,	32559)
+ValuePair(PCS_WGS72BE_UTM_zone_60S,	32560)
+ValuePair(PCS_WGS84_UTM_zone_1N,	32601)
+ValuePair(PCS_WGS84_UTM_zone_2N,	32602)
+ValuePair(PCS_WGS84_UTM_zone_3N,	32603)
+ValuePair(PCS_WGS84_UTM_zone_4N,	32604)
+ValuePair(PCS_WGS84_UTM_zone_5N,	32605)
+ValuePair(PCS_WGS84_UTM_zone_6N,	32606)
+ValuePair(PCS_WGS84_UTM_zone_7N,	32607)
+ValuePair(PCS_WGS84_UTM_zone_8N,	32608)
+ValuePair(PCS_WGS84_UTM_zone_9N,	32609)
+ValuePair(PCS_WGS84_UTM_zone_10N,	32610)
+ValuePair(PCS_WGS84_UTM_zone_11N,	32611)
+ValuePair(PCS_WGS84_UTM_zone_12N,	32612)
+ValuePair(PCS_WGS84_UTM_zone_13N,	32613)
+ValuePair(PCS_WGS84_UTM_zone_14N,	32614)
+ValuePair(PCS_WGS84_UTM_zone_15N,	32615)
+ValuePair(PCS_WGS84_UTM_zone_16N,	32616)
+ValuePair(PCS_WGS84_UTM_zone_17N,	32617)
+ValuePair(PCS_WGS84_UTM_zone_18N,	32618)
+ValuePair(PCS_WGS84_UTM_zone_19N,	32619)
+ValuePair(PCS_WGS84_UTM_zone_20N,	32620)
+ValuePair(PCS_WGS84_UTM_zone_21N,	32621)
+ValuePair(PCS_WGS84_UTM_zone_22N,	32622)
+ValuePair(PCS_WGS84_UTM_zone_23N,	32623)
+ValuePair(PCS_WGS84_UTM_zone_24N,	32624)
+ValuePair(PCS_WGS84_UTM_zone_25N,	32625)
+ValuePair(PCS_WGS84_UTM_zone_26N,	32626)
+ValuePair(PCS_WGS84_UTM_zone_27N,	32627)
+ValuePair(PCS_WGS84_UTM_zone_28N,	32628)
+ValuePair(PCS_WGS84_UTM_zone_29N,	32629)
+ValuePair(PCS_WGS84_UTM_zone_30N,	32630)
+ValuePair(PCS_WGS84_UTM_zone_31N,	32631)
+ValuePair(PCS_WGS84_UTM_zone_32N,	32632)
+ValuePair(PCS_WGS84_UTM_zone_33N,	32633)
+ValuePair(PCS_WGS84_UTM_zone_34N,	32634)
+ValuePair(PCS_WGS84_UTM_zone_35N,	32635)
+ValuePair(PCS_WGS84_UTM_zone_36N,	32636)
+ValuePair(PCS_WGS84_UTM_zone_37N,	32637)
+ValuePair(PCS_WGS84_UTM_zone_38N,	32638)
+ValuePair(PCS_WGS84_UTM_zone_39N,	32639)
+ValuePair(PCS_WGS84_UTM_zone_40N,	32640)
+ValuePair(PCS_WGS84_UTM_zone_41N,	32641)
+ValuePair(PCS_WGS84_UTM_zone_42N,	32642)
+ValuePair(PCS_WGS84_UTM_zone_43N,	32643)
+ValuePair(PCS_WGS84_UTM_zone_44N,	32644)
+ValuePair(PCS_WGS84_UTM_zone_45N,	32645)
+ValuePair(PCS_WGS84_UTM_zone_46N,	32646)
+ValuePair(PCS_WGS84_UTM_zone_47N,	32647)
+ValuePair(PCS_WGS84_UTM_zone_48N,	32648)
+ValuePair(PCS_WGS84_UTM_zone_49N,	32649)
+ValuePair(PCS_WGS84_UTM_zone_50N,	32650)
+ValuePair(PCS_WGS84_UTM_zone_51N,	32651)
+ValuePair(PCS_WGS84_UTM_zone_52N,	32652)
+ValuePair(PCS_WGS84_UTM_zone_53N,	32653)
+ValuePair(PCS_WGS84_UTM_zone_54N,	32654)
+ValuePair(PCS_WGS84_UTM_zone_55N,	32655)
+ValuePair(PCS_WGS84_UTM_zone_56N,	32656)
+ValuePair(PCS_WGS84_UTM_zone_57N,	32657)
+ValuePair(PCS_WGS84_UTM_zone_58N,	32658)
+ValuePair(PCS_WGS84_UTM_zone_59N,	32659)
+ValuePair(PCS_WGS84_UTM_zone_60N,	32660)
+ValuePair(PCS_WGS84_UTM_zone_1S,	32701)
+ValuePair(PCS_WGS84_UTM_zone_2S,	32702)
+ValuePair(PCS_WGS84_UTM_zone_3S,	32703)
+ValuePair(PCS_WGS84_UTM_zone_4S,	32704)
+ValuePair(PCS_WGS84_UTM_zone_5S,	32705)
+ValuePair(PCS_WGS84_UTM_zone_6S,	32706)
+ValuePair(PCS_WGS84_UTM_zone_7S,	32707)
+ValuePair(PCS_WGS84_UTM_zone_8S,	32708)
+ValuePair(PCS_WGS84_UTM_zone_9S,	32709)
+ValuePair(PCS_WGS84_UTM_zone_10S,	32710)
+ValuePair(PCS_WGS84_UTM_zone_11S,	32711)
+ValuePair(PCS_WGS84_UTM_zone_12S,	32712)
+ValuePair(PCS_WGS84_UTM_zone_13S,	32713)
+ValuePair(PCS_WGS84_UTM_zone_14S,	32714)
+ValuePair(PCS_WGS84_UTM_zone_15S,	32715)
+ValuePair(PCS_WGS84_UTM_zone_16S,	32716)
+ValuePair(PCS_WGS84_UTM_zone_17S,	32717)
+ValuePair(PCS_WGS84_UTM_zone_18S,	32718)
+ValuePair(PCS_WGS84_UTM_zone_19S,	32719)
+ValuePair(PCS_WGS84_UTM_zone_20S,	32720)
+ValuePair(PCS_WGS84_UTM_zone_21S,	32721)
+ValuePair(PCS_WGS84_UTM_zone_22S,	32722)
+ValuePair(PCS_WGS84_UTM_zone_23S,	32723)
+ValuePair(PCS_WGS84_UTM_zone_24S,	32724)
+ValuePair(PCS_WGS84_UTM_zone_25S,	32725)
+ValuePair(PCS_WGS84_UTM_zone_26S,	32726)
+ValuePair(PCS_WGS84_UTM_zone_27S,	32727)
+ValuePair(PCS_WGS84_UTM_zone_28S,	32728)
+ValuePair(PCS_WGS84_UTM_zone_29S,	32729)
+ValuePair(PCS_WGS84_UTM_zone_30S,	32730)
+ValuePair(PCS_WGS84_UTM_zone_31S,	32731)
+ValuePair(PCS_WGS84_UTM_zone_32S,	32732)
+ValuePair(PCS_WGS84_UTM_zone_33S,	32733)
+ValuePair(PCS_WGS84_UTM_zone_34S,	32734)
+ValuePair(PCS_WGS84_UTM_zone_35S,	32735)
+ValuePair(PCS_WGS84_UTM_zone_36S,	32736)
+ValuePair(PCS_WGS84_UTM_zone_37S,	32737)
+ValuePair(PCS_WGS84_UTM_zone_38S,	32738)
+ValuePair(PCS_WGS84_UTM_zone_39S,	32739)
+ValuePair(PCS_WGS84_UTM_zone_40S,	32740)
+ValuePair(PCS_WGS84_UTM_zone_41S,	32741)
+ValuePair(PCS_WGS84_UTM_zone_42S,	32742)
+ValuePair(PCS_WGS84_UTM_zone_43S,	32743)
+ValuePair(PCS_WGS84_UTM_zone_44S,	32744)
+ValuePair(PCS_WGS84_UTM_zone_45S,	32745)
+ValuePair(PCS_WGS84_UTM_zone_46S,	32746)
+ValuePair(PCS_WGS84_UTM_zone_47S,	32747)
+ValuePair(PCS_WGS84_UTM_zone_48S,	32748)
+ValuePair(PCS_WGS84_UTM_zone_49S,	32749)
+ValuePair(PCS_WGS84_UTM_zone_50S,	32750)
+ValuePair(PCS_WGS84_UTM_zone_51S,	32751)
+ValuePair(PCS_WGS84_UTM_zone_52S,	32752)
+ValuePair(PCS_WGS84_UTM_zone_53S,	32753)
+ValuePair(PCS_WGS84_UTM_zone_54S,	32754)
+ValuePair(PCS_WGS84_UTM_zone_55S,	32755)
+ValuePair(PCS_WGS84_UTM_zone_56S,	32756)
+ValuePair(PCS_WGS84_UTM_zone_57S,	32757)
+ValuePair(PCS_WGS84_UTM_zone_58S,	32758)
+ValuePair(PCS_WGS84_UTM_zone_59S,	32759)
+ValuePair(PCS_WGS84_UTM_zone_60S,	32760)
+/* end of list */
diff --git a/src/tiff/epsg_pm.inc b/src/tiff/epsg_pm.inc
new file mode 100644
index 0000000..1e41598
--- /dev/null
+++ b/src/tiff/epsg_pm.inc
@@ -0,0 +1,22 @@
+/* EPSG/GeoTIFF Rev 0.2 Prime Meridian Database */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_pm.inc
+#endif /* OLD Codes */
+
+ValuePair(PM_Greenwich,	8901)
+ValuePair(PM_Lisbon,	8902)
+ValuePair(PM_Paris,	8903)
+ValuePair(PM_Bogota,	8904)
+ValuePair(PM_Madrid,	8905)
+ValuePair(PM_Rome,	8906)
+ValuePair(PM_Bern,	8907)
+ValuePair(PM_Jakarta,	8908)
+ValuePair(PM_Ferro,	8909)
+ValuePair(PM_Brussels,	8910)
+ValuePair(PM_Stockholm,	8911)
+/* end of list */
diff --git a/src/tiff/epsg_proj.inc b/src/tiff/epsg_proj.inc
new file mode 100644
index 0000000..d6c8791
--- /dev/null
+++ b/src/tiff/epsg_proj.inc
@@ -0,0 +1,443 @@
+/*
+ *  EPSG/POSC Projection Codes - GeoTIFF Rev 0.2
+ */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+#ifdef INCLUDE_OLD_CODES
+#include old_proj.inc
+#endif /* OLD Codes */
+
+/* New codes */
+
+ValuePair(Proj_Stereo_70,19926)
+
+/* old codes */
+
+ValuePair(Proj_Alabama_CS27_East,	10101)
+ValuePair(Proj_Alabama_CS27_West,	10102)
+ValuePair(Proj_Alabama_CS83_East,	10131)
+ValuePair(Proj_Alabama_CS83_West,	10132)
+ValuePair(Proj_Arizona_Coordinate_System_east,	10201)
+ValuePair(Proj_Arizona_Coordinate_System_Central,	10202)
+ValuePair(Proj_Arizona_Coordinate_System_west,	10203)
+ValuePair(Proj_Arizona_CS83_east,	10231)
+ValuePair(Proj_Arizona_CS83_Central,	10232)
+ValuePair(Proj_Arizona_CS83_west,	10233)
+ValuePair(Proj_Arkansas_CS27_North,	10301)
+ValuePair(Proj_Arkansas_CS27_South,	10302)
+ValuePair(Proj_Arkansas_CS83_North,	10331)
+ValuePair(Proj_Arkansas_CS83_South,	10332)
+ValuePair(Proj_California_CS27_I,	10401)
+ValuePair(Proj_California_CS27_II,	10402)
+ValuePair(Proj_California_CS27_III,	10403)
+ValuePair(Proj_California_CS27_IV,	10404)
+ValuePair(Proj_California_CS27_V,	10405)
+ValuePair(Proj_California_CS27_VI,	10406)
+ValuePair(Proj_California_CS27_VII,	10407)
+ValuePair(Proj_California_CS83_1,	10431)
+ValuePair(Proj_California_CS83_2,	10432)
+ValuePair(Proj_California_CS83_3,	10433)
+ValuePair(Proj_California_CS83_4,	10434)
+ValuePair(Proj_California_CS83_5,	10435)
+ValuePair(Proj_California_CS83_6,	10436)
+ValuePair(Proj_Colorado_CS27_North,	10501)
+ValuePair(Proj_Colorado_CS27_Central,	10502)
+ValuePair(Proj_Colorado_CS27_South,	10503)
+ValuePair(Proj_Colorado_CS83_North,	10531)
+ValuePair(Proj_Colorado_CS83_Central,	10532)
+ValuePair(Proj_Colorado_CS83_South,	10533)
+ValuePair(Proj_Connecticut_CS27,	10600)
+ValuePair(Proj_Connecticut_CS83,	10630)
+ValuePair(Proj_Delaware_CS27,	10700)
+ValuePair(Proj_Delaware_CS83,	10730)
+ValuePair(Proj_Florida_CS27_East,	10901)
+ValuePair(Proj_Florida_CS27_West,	10902)
+ValuePair(Proj_Florida_CS27_North,	10903)
+ValuePair(Proj_Florida_CS83_East,	10931)
+ValuePair(Proj_Florida_CS83_West,	10932)
+ValuePair(Proj_Florida_CS83_North,	10933)
+ValuePair(Proj_Georgia_CS27_East,	11001)
+ValuePair(Proj_Georgia_CS27_West,	11002)
+ValuePair(Proj_Georgia_CS83_East,	11031)
+ValuePair(Proj_Georgia_CS83_West,	11032)
+ValuePair(Proj_Idaho_CS27_East,	11101)
+ValuePair(Proj_Idaho_CS27_Central,	11102)
+ValuePair(Proj_Idaho_CS27_West,	11103)
+ValuePair(Proj_Idaho_CS83_East,	11131)
+ValuePair(Proj_Idaho_CS83_Central,	11132)
+ValuePair(Proj_Idaho_CS83_West,	11133)
+ValuePair(Proj_Illinois_CS27_East,	11201)
+ValuePair(Proj_Illinois_CS27_West,	11202)
+ValuePair(Proj_Illinois_CS83_East,	11231)
+ValuePair(Proj_Illinois_CS83_West,	11232)
+ValuePair(Proj_Indiana_CS27_East,	11301)
+ValuePair(Proj_Indiana_CS27_West,	11302)
+ValuePair(Proj_Indiana_CS83_East,	11331)
+ValuePair(Proj_Indiana_CS83_West,	11332)
+ValuePair(Proj_Iowa_CS27_North,	11401)
+ValuePair(Proj_Iowa_CS27_South,	11402)
+ValuePair(Proj_Iowa_CS83_North,	11431)
+ValuePair(Proj_Iowa_CS83_South,	11432)
+ValuePair(Proj_Kansas_CS27_North,	11501)
+ValuePair(Proj_Kansas_CS27_South,	11502)
+ValuePair(Proj_Kansas_CS83_North,	11531)
+ValuePair(Proj_Kansas_CS83_South,	11532)
+ValuePair(Proj_Kentucky_CS27_North,	11601)
+ValuePair(Proj_Kentucky_CS27_South,	11602)
+ValuePair(Proj_Kentucky_CS83_North,	15303)
+ValuePair(Proj_Kentucky_CS83_South,	11632)
+ValuePair(Proj_Louisiana_CS27_North,	11701)
+ValuePair(Proj_Louisiana_CS27_South,	11702)
+ValuePair(Proj_Louisiana_CS83_North,	11731)
+ValuePair(Proj_Louisiana_CS83_South,	11732)
+ValuePair(Proj_Maine_CS27_East,	11801)
+ValuePair(Proj_Maine_CS27_West,	11802)
+ValuePair(Proj_Maine_CS83_East,	11831)
+ValuePair(Proj_Maine_CS83_West,	11832)
+ValuePair(Proj_Maryland_CS27,	11900)
+ValuePair(Proj_Maryland_CS83,	11930)
+ValuePair(Proj_Massachusetts_CS27_Mainland,	12001)
+ValuePair(Proj_Massachusetts_CS27_Island,	12002)
+ValuePair(Proj_Massachusetts_CS83_Mainland,	12031)
+ValuePair(Proj_Massachusetts_CS83_Island,	12032)
+ValuePair(Proj_Michigan_State_Plane_East,	12101)
+ValuePair(Proj_Michigan_State_Plane_Old_Central,	12102)
+ValuePair(Proj_Michigan_State_Plane_West,	12103)
+ValuePair(Proj_Michigan_CS27_North,	12111)
+ValuePair(Proj_Michigan_CS27_Central,	12112)
+ValuePair(Proj_Michigan_CS27_South,	12113)
+ValuePair(Proj_Michigan_CS83_North,	12141)
+ValuePair(Proj_Michigan_CS83_Central,	12142)
+ValuePair(Proj_Michigan_CS83_South,	12143)
+ValuePair(Proj_Minnesota_CS27_North,	12201)
+ValuePair(Proj_Minnesota_CS27_Central,	12202)
+ValuePair(Proj_Minnesota_CS27_South,	12203)
+ValuePair(Proj_Minnesota_CS83_North,	12231)
+ValuePair(Proj_Minnesota_CS83_Central,	12232)
+ValuePair(Proj_Minnesota_CS83_South,	12233)
+ValuePair(Proj_Mississippi_CS27_East,	12301)
+ValuePair(Proj_Mississippi_CS27_West,	12302)
+ValuePair(Proj_Mississippi_CS83_East,	12331)
+ValuePair(Proj_Mississippi_CS83_West,	12332)
+ValuePair(Proj_Missouri_CS27_East,	12401)
+ValuePair(Proj_Missouri_CS27_Central,	12402)
+ValuePair(Proj_Missouri_CS27_West,	12403)
+ValuePair(Proj_Missouri_CS83_East,	12431)
+ValuePair(Proj_Missouri_CS83_Central,	12432)
+ValuePair(Proj_Missouri_CS83_West,	12433)
+ValuePair(Proj_Montana_CS27_North,	12501)
+ValuePair(Proj_Montana_CS27_Central,	12502)
+ValuePair(Proj_Montana_CS27_South,	12503)
+ValuePair(Proj_Montana_CS83,	12530)
+ValuePair(Proj_Nebraska_CS27_North,	12601)
+ValuePair(Proj_Nebraska_CS27_South,	12602)
+ValuePair(Proj_Nebraska_CS83,	12630)
+ValuePair(Proj_Nevada_CS27_East,	12701)
+ValuePair(Proj_Nevada_CS27_Central,	12702)
+ValuePair(Proj_Nevada_CS27_West,	12703)
+ValuePair(Proj_Nevada_CS83_East,	12731)
+ValuePair(Proj_Nevada_CS83_Central,	12732)
+ValuePair(Proj_Nevada_CS83_West,	12733)
+ValuePair(Proj_New_Hampshire_CS27,	12800)
+ValuePair(Proj_New_Hampshire_CS83,	12830)
+ValuePair(Proj_New_Jersey_CS27,	12900)
+ValuePair(Proj_New_Jersey_CS83,	12930)
+ValuePair(Proj_New_Mexico_CS27_East,	13001)
+ValuePair(Proj_New_Mexico_CS27_Central,	13002)
+ValuePair(Proj_New_Mexico_CS27_West,	13003)
+ValuePair(Proj_New_Mexico_CS83_East,	13031)
+ValuePair(Proj_New_Mexico_CS83_Central,	13032)
+ValuePair(Proj_New_Mexico_CS83_West,	13033)
+ValuePair(Proj_New_York_CS27_East,	13101)
+ValuePair(Proj_New_York_CS27_Central,	13102)
+ValuePair(Proj_New_York_CS27_West,	13103)
+ValuePair(Proj_New_York_CS27_Long_Island,	13104)
+ValuePair(Proj_New_York_CS83_East,	13131)
+ValuePair(Proj_New_York_CS83_Central,	13132)
+ValuePair(Proj_New_York_CS83_West,	13133)
+ValuePair(Proj_New_York_CS83_Long_Island,	13134)
+ValuePair(Proj_North_Carolina_CS27,	13200)
+ValuePair(Proj_North_Carolina_CS83,	13230)
+ValuePair(Proj_North_Dakota_CS27_North,	13301)
+ValuePair(Proj_North_Dakota_CS27_South,	13302)
+ValuePair(Proj_North_Dakota_CS83_North,	13331)
+ValuePair(Proj_North_Dakota_CS83_South,	13332)
+ValuePair(Proj_Ohio_CS27_North,	13401)
+ValuePair(Proj_Ohio_CS27_South,	13402)
+ValuePair(Proj_Ohio_CS83_North,	13431)
+ValuePair(Proj_Ohio_CS83_South,	13432)
+ValuePair(Proj_Oklahoma_CS27_North,	13501)
+ValuePair(Proj_Oklahoma_CS27_South,	13502)
+ValuePair(Proj_Oklahoma_CS83_North,	13531)
+ValuePair(Proj_Oklahoma_CS83_South,	13532)
+ValuePair(Proj_Oregon_CS27_North,	13601)
+ValuePair(Proj_Oregon_CS27_South,	13602)
+ValuePair(Proj_Oregon_CS83_North,	13631)
+ValuePair(Proj_Oregon_CS83_South,	13632)
+ValuePair(Proj_Pennsylvania_CS27_North,	13701)
+ValuePair(Proj_Pennsylvania_CS27_South,	13702)
+ValuePair(Proj_Pennsylvania_CS83_North,	13731)
+ValuePair(Proj_Pennsylvania_CS83_South,	13732)
+ValuePair(Proj_Rhode_Island_CS27,	13800)
+ValuePair(Proj_Rhode_Island_CS83,	13830)
+ValuePair(Proj_South_Carolina_CS27_North,	13901)
+ValuePair(Proj_South_Carolina_CS27_South,	13902)
+ValuePair(Proj_South_Carolina_CS83,	13930)
+ValuePair(Proj_South_Dakota_CS27_North,	14001)
+ValuePair(Proj_South_Dakota_CS27_South,	14002)
+ValuePair(Proj_South_Dakota_CS83_North,	14031)
+ValuePair(Proj_South_Dakota_CS83_South,	14032)
+ValuePair(Proj_Tennessee_CS27,	15302)
+ValuePair(Proj_Tennessee_CS83,	14130)
+ValuePair(Proj_Texas_CS27_North,	14201)
+ValuePair(Proj_Texas_CS27_North_Central,	14202)
+ValuePair(Proj_Texas_CS27_Central,	14203)
+ValuePair(Proj_Texas_CS27_South_Central,	14204)
+ValuePair(Proj_Texas_CS27_South,	14205)
+ValuePair(Proj_Texas_CS83_North,	14231)
+ValuePair(Proj_Texas_CS83_North_Central,	14232)
+ValuePair(Proj_Texas_CS83_Central,	14233)
+ValuePair(Proj_Texas_CS83_South_Central,	14234)
+ValuePair(Proj_Texas_CS83_South,	14235)
+ValuePair(Proj_Utah_CS27_North,	14301)
+ValuePair(Proj_Utah_CS27_Central,	14302)
+ValuePair(Proj_Utah_CS27_South,	14303)
+ValuePair(Proj_Utah_CS83_North,	14331)
+ValuePair(Proj_Utah_CS83_Central,	14332)
+ValuePair(Proj_Utah_CS83_South,	14333)
+ValuePair(Proj_Vermont_CS27,	14400)
+ValuePair(Proj_Vermont_CS83,	14430)
+ValuePair(Proj_Virginia_CS27_North,	14501)
+ValuePair(Proj_Virginia_CS27_South,	14502)
+ValuePair(Proj_Virginia_CS83_North,	14531)
+ValuePair(Proj_Virginia_CS83_South,	14532)
+ValuePair(Proj_Washington_CS27_North,	14601)
+ValuePair(Proj_Washington_CS27_South,	14602)
+ValuePair(Proj_Washington_CS83_North,	14631)
+ValuePair(Proj_Washington_CS83_South,	14632)
+ValuePair(Proj_West_Virginia_CS27_North,	14701)
+ValuePair(Proj_West_Virginia_CS27_South,	14702)
+ValuePair(Proj_West_Virginia_CS83_North,	14731)
+ValuePair(Proj_West_Virginia_CS83_South,	14732)
+ValuePair(Proj_Wisconsin_CS27_North,	14801)
+ValuePair(Proj_Wisconsin_CS27_Central,	14802)
+ValuePair(Proj_Wisconsin_CS27_South,	14803)
+ValuePair(Proj_Wisconsin_CS83_North,	14831)
+ValuePair(Proj_Wisconsin_CS83_Central,	14832)
+ValuePair(Proj_Wisconsin_CS83_South,	14833)
+ValuePair(Proj_Wyoming_CS27_East,	14901)
+ValuePair(Proj_Wyoming_CS27_East_Central,	14902)
+ValuePair(Proj_Wyoming_CS27_West_Central,	14903)
+ValuePair(Proj_Wyoming_CS27_West,	14904)
+ValuePair(Proj_Wyoming_CS83_East,	14931)
+ValuePair(Proj_Wyoming_CS83_East_Central,	14932)
+ValuePair(Proj_Wyoming_CS83_West_Central,	14933)
+ValuePair(Proj_Wyoming_CS83_West,	14934)
+ValuePair(Proj_Alaska_CS27_1,	15001)
+ValuePair(Proj_Alaska_CS27_2,	15002)
+ValuePair(Proj_Alaska_CS27_3,	15003)
+ValuePair(Proj_Alaska_CS27_4,	15004)
+ValuePair(Proj_Alaska_CS27_5,	15005)
+ValuePair(Proj_Alaska_CS27_6,	15006)
+ValuePair(Proj_Alaska_CS27_7,	15007)
+ValuePair(Proj_Alaska_CS27_8,	15008)
+ValuePair(Proj_Alaska_CS27_9,	15009)
+ValuePair(Proj_Alaska_CS27_10,	15010)
+ValuePair(Proj_Alaska_CS83_1,	15031)
+ValuePair(Proj_Alaska_CS83_2,	15032)
+ValuePair(Proj_Alaska_CS83_3,	15033)
+ValuePair(Proj_Alaska_CS83_4,	15034)
+ValuePair(Proj_Alaska_CS83_5,	15035)
+ValuePair(Proj_Alaska_CS83_6,	15036)
+ValuePair(Proj_Alaska_CS83_7,	15037)
+ValuePair(Proj_Alaska_CS83_8,	15038)
+ValuePair(Proj_Alaska_CS83_9,	15039)
+ValuePair(Proj_Alaska_CS83_10,	15040)
+ValuePair(Proj_Hawaii_CS27_1,	15101)
+ValuePair(Proj_Hawaii_CS27_2,	15102)
+ValuePair(Proj_Hawaii_CS27_3,	15103)
+ValuePair(Proj_Hawaii_CS27_4,	15104)
+ValuePair(Proj_Hawaii_CS27_5,	15105)
+ValuePair(Proj_Hawaii_CS83_1,	15131)
+ValuePair(Proj_Hawaii_CS83_2,	15132)
+ValuePair(Proj_Hawaii_CS83_3,	15133)
+ValuePair(Proj_Hawaii_CS83_4,	15134)
+ValuePair(Proj_Hawaii_CS83_5,	15135)
+ValuePair(Proj_Puerto_Rico_CS27,	15201)
+ValuePair(Proj_St_Croix,	15202)
+ValuePair(Proj_Puerto_Rico_Virgin_Is,	15230)
+ValuePair(Proj_BLM_14N_feet,	15914)
+ValuePair(Proj_BLM_15N_feet,	15915)
+ValuePair(Proj_BLM_16N_feet,	15916)
+ValuePair(Proj_BLM_17N_feet,	15917)
+ValuePair(Proj_UTM_zone_1N,  16001)
+ValuePair(Proj_UTM_zone_2N,  16002)
+ValuePair(Proj_UTM_zone_3N,  16003)
+ValuePair(Proj_UTM_zone_4N,  16004)
+ValuePair(Proj_UTM_zone_5N,  16005)
+ValuePair(Proj_UTM_zone_6N,  16006)
+ValuePair(Proj_UTM_zone_7N,  16007)
+ValuePair(Proj_UTM_zone_8N,  16008)
+ValuePair(Proj_UTM_zone_9N,  16009)
+ValuePair(Proj_UTM_zone_10N, 16010)
+ValuePair(Proj_UTM_zone_11N, 16011)
+ValuePair(Proj_UTM_zone_12N, 16012)
+ValuePair(Proj_UTM_zone_13N, 16013)
+ValuePair(Proj_UTM_zone_14N, 16014)
+ValuePair(Proj_UTM_zone_15N, 16015)
+ValuePair(Proj_UTM_zone_16N, 16016)
+ValuePair(Proj_UTM_zone_17N, 16017)
+ValuePair(Proj_UTM_zone_18N, 16018)
+ValuePair(Proj_UTM_zone_19N, 16019)
+ValuePair(Proj_UTM_zone_20N, 16020)
+ValuePair(Proj_UTM_zone_21N, 16021)
+ValuePair(Proj_UTM_zone_22N, 16022)
+ValuePair(Proj_UTM_zone_23N, 16023)
+ValuePair(Proj_UTM_zone_24N, 16024)
+ValuePair(Proj_UTM_zone_25N, 16025)
+ValuePair(Proj_UTM_zone_26N, 16026)
+ValuePair(Proj_UTM_zone_27N, 16027)
+ValuePair(Proj_UTM_zone_28N, 16028)
+ValuePair(Proj_UTM_zone_29N, 16029)
+ValuePair(Proj_UTM_zone_30N, 16030)
+ValuePair(Proj_UTM_zone_31N, 16031)
+ValuePair(Proj_UTM_zone_32N, 16032)
+ValuePair(Proj_UTM_zone_33N, 16033)
+ValuePair(Proj_UTM_zone_34N, 16034)
+ValuePair(Proj_UTM_zone_35N, 16035)
+ValuePair(Proj_UTM_zone_36N, 16036)
+ValuePair(Proj_UTM_zone_37N, 16037)
+ValuePair(Proj_UTM_zone_38N, 16038)
+ValuePair(Proj_UTM_zone_39N, 16039)
+ValuePair(Proj_UTM_zone_40N, 16040)
+ValuePair(Proj_UTM_zone_41N, 16041)
+ValuePair(Proj_UTM_zone_42N, 16042)
+ValuePair(Proj_UTM_zone_43N, 16043)
+ValuePair(Proj_UTM_zone_44N, 16044)
+ValuePair(Proj_UTM_zone_45N, 16045)
+ValuePair(Proj_UTM_zone_46N, 16046)
+ValuePair(Proj_UTM_zone_47N, 16047)
+ValuePair(Proj_UTM_zone_48N, 16048)
+ValuePair(Proj_UTM_zone_49N, 16049)
+ValuePair(Proj_UTM_zone_50N, 16050)
+ValuePair(Proj_UTM_zone_51N, 16051)
+ValuePair(Proj_UTM_zone_52N, 16052)
+ValuePair(Proj_UTM_zone_53N, 16053)
+ValuePair(Proj_UTM_zone_54N, 16054)
+ValuePair(Proj_UTM_zone_55N, 16055)
+ValuePair(Proj_UTM_zone_56N, 16056)
+ValuePair(Proj_UTM_zone_57N, 16057)
+ValuePair(Proj_UTM_zone_58N, 16058)
+ValuePair(Proj_UTM_zone_59N, 16059)
+ValuePair(Proj_UTM_zone_60N, 16060)
+ValuePair(Proj_UTM_zone_1S,  16101)
+ValuePair(Proj_UTM_zone_2S,  16102)
+ValuePair(Proj_UTM_zone_3S,  16103)
+ValuePair(Proj_UTM_zone_4S,  16104)
+ValuePair(Proj_UTM_zone_5S,  16105)
+ValuePair(Proj_UTM_zone_6S,  16106)
+ValuePair(Proj_UTM_zone_7S,  16107)
+ValuePair(Proj_UTM_zone_8S,  16108)
+ValuePair(Proj_UTM_zone_9S,  16109)
+ValuePair(Proj_UTM_zone_10S, 16110)
+ValuePair(Proj_UTM_zone_11S, 16111)
+ValuePair(Proj_UTM_zone_12S, 16112)
+ValuePair(Proj_UTM_zone_13S, 16113)
+ValuePair(Proj_UTM_zone_14S, 16114)
+ValuePair(Proj_UTM_zone_15S, 16115)
+ValuePair(Proj_UTM_zone_16S, 16116)
+ValuePair(Proj_UTM_zone_17S, 16117)
+ValuePair(Proj_UTM_zone_18S, 16118)
+ValuePair(Proj_UTM_zone_19S, 16119)
+ValuePair(Proj_UTM_zone_20S, 16120)
+ValuePair(Proj_UTM_zone_21S, 16121)
+ValuePair(Proj_UTM_zone_22S, 16122)
+ValuePair(Proj_UTM_zone_23S, 16123)
+ValuePair(Proj_UTM_zone_24S, 16124)
+ValuePair(Proj_UTM_zone_25S, 16125)
+ValuePair(Proj_UTM_zone_26S, 16126)
+ValuePair(Proj_UTM_zone_27S, 16127)
+ValuePair(Proj_UTM_zone_28S, 16128)
+ValuePair(Proj_UTM_zone_29S, 16129)
+ValuePair(Proj_UTM_zone_30S, 16130)
+ValuePair(Proj_UTM_zone_31S, 16131)
+ValuePair(Proj_UTM_zone_32S, 16132)
+ValuePair(Proj_UTM_zone_33S, 16133)
+ValuePair(Proj_UTM_zone_34S, 16134)
+ValuePair(Proj_UTM_zone_35S, 16135)
+ValuePair(Proj_UTM_zone_36S, 16136)
+ValuePair(Proj_UTM_zone_37S, 16137)
+ValuePair(Proj_UTM_zone_38S, 16138)
+ValuePair(Proj_UTM_zone_39S, 16139)
+ValuePair(Proj_UTM_zone_40S, 16140)
+ValuePair(Proj_UTM_zone_41S, 16141)
+ValuePair(Proj_UTM_zone_42S, 16142)
+ValuePair(Proj_UTM_zone_43S, 16143)
+ValuePair(Proj_UTM_zone_44S, 16144)
+ValuePair(Proj_UTM_zone_45S, 16145)
+ValuePair(Proj_UTM_zone_46S, 16146)
+ValuePair(Proj_UTM_zone_47S, 16147)
+ValuePair(Proj_UTM_zone_48S, 16148)
+ValuePair(Proj_UTM_zone_49S, 16149)
+ValuePair(Proj_UTM_zone_50S, 16150)
+ValuePair(Proj_UTM_zone_51S, 16151)
+ValuePair(Proj_UTM_zone_52S, 16152)
+ValuePair(Proj_UTM_zone_53S, 16153)
+ValuePair(Proj_UTM_zone_54S, 16154)
+ValuePair(Proj_UTM_zone_55S, 16155)
+ValuePair(Proj_UTM_zone_56S, 16156)
+ValuePair(Proj_UTM_zone_57S, 16157)
+ValuePair(Proj_UTM_zone_58S, 16158)
+ValuePair(Proj_UTM_zone_59S, 16159)
+ValuePair(Proj_UTM_zone_60S, 16160)
+ValuePair(Proj_Gauss_Kruger_zone_0, 16200)
+ValuePair(Proj_Gauss_Kruger_zone_1, 16201)
+ValuePair(Proj_Gauss_Kruger_zone_2, 16202)
+ValuePair(Proj_Gauss_Kruger_zone_3, 16203)
+ValuePair(Proj_Gauss_Kruger_zone_4, 16204)
+ValuePair(Proj_Gauss_Kruger_zone_5, 16205)
+ValuePair(Proj_Map_Grid_of_Australia_48,	17348)
+ValuePair(Proj_Map_Grid_of_Australia_49,	17349)
+ValuePair(Proj_Map_Grid_of_Australia_50,	17350)
+ValuePair(Proj_Map_Grid_of_Australia_51,	17351)
+ValuePair(Proj_Map_Grid_of_Australia_52,	17352)
+ValuePair(Proj_Map_Grid_of_Australia_53,	17353)
+ValuePair(Proj_Map_Grid_of_Australia_54,	17354)
+ValuePair(Proj_Map_Grid_of_Australia_55,	17355)
+ValuePair(Proj_Map_Grid_of_Australia_56,	17356)
+ValuePair(Proj_Map_Grid_of_Australia_57,	17357)
+ValuePair(Proj_Map_Grid_of_Australia_58,	17358)
+ValuePair(Proj_Australian_Map_Grid_48,	17448)
+ValuePair(Proj_Australian_Map_Grid_49,	17449)
+ValuePair(Proj_Australian_Map_Grid_50,	17450)
+ValuePair(Proj_Australian_Map_Grid_51,	17451)
+ValuePair(Proj_Australian_Map_Grid_52,	17452)
+ValuePair(Proj_Australian_Map_Grid_53,	17453)
+ValuePair(Proj_Australian_Map_Grid_54,	17454)
+ValuePair(Proj_Australian_Map_Grid_55,	17455)
+ValuePair(Proj_Australian_Map_Grid_56,	17456)
+ValuePair(Proj_Australian_Map_Grid_57,	17457)
+ValuePair(Proj_Australian_Map_Grid_58,	17458)
+ValuePair(Proj_Argentina_1,	18031)
+ValuePair(Proj_Argentina_2,	18032)
+ValuePair(Proj_Argentina_3,	18033)
+ValuePair(Proj_Argentina_4,	18034)
+ValuePair(Proj_Argentina_5,	18035)
+ValuePair(Proj_Argentina_6,	18036)
+ValuePair(Proj_Argentina_7,	18037)
+ValuePair(Proj_Colombia_3W,	18051)
+ValuePair(Proj_Colombia_Bogota,	18052)
+ValuePair(Proj_Colombia_3E,	18053)
+ValuePair(Proj_Colombia_6E,	18054)
+ValuePair(Proj_Egypt_Red_Belt,	18072)
+ValuePair(Proj_Egypt_Purple_Belt,	18073)
+ValuePair(Proj_Extended_Purple_Belt,	18074)
+ValuePair(Proj_New_Zealand_North_Island_Nat_Grid,	18141)
+ValuePair(Proj_New_Zealand_South_Island_Nat_Grid,	18142)
+ValuePair(Proj_Bahrain_Grid,	19900)
+ValuePair(Proj_Netherlands_E_Indies_Equatorial,	19905)
+ValuePair(Proj_RSO_Borneo,	19912)
+/* end of list */
diff --git a/src/tiff/epsg_units.inc b/src/tiff/epsg_units.inc
new file mode 100644
index 0000000..fe1b5db
--- /dev/null
+++ b/src/tiff/epsg_units.inc
@@ -0,0 +1,35 @@
+/*
+ * Rev. 0.2 EPSG/POSC Units Database.
+ */
+ 
+#ifdef INCLUDE_OLD_CODES
+#include geo_units.inc
+#endif /* OLD Codes */
+
+ValuePair(Linear_Meter,	9001)
+ValuePair(Linear_Foot,	9002)
+ValuePair(Linear_Foot_US_Survey,	9003)
+ValuePair(Linear_Foot_Modified_American,	9004)
+ValuePair(Linear_Foot_Clarke,	9005)
+ValuePair(Linear_Foot_Indian,	9006)
+ValuePair(Linear_Link,	9007)
+ValuePair(Linear_Link_Benoit,	9008)
+ValuePair(Linear_Link_Sears,	9009)
+ValuePair(Linear_Chain_Benoit,	9010)
+ValuePair(Linear_Chain_Sears,	9011)
+ValuePair(Linear_Yard_Sears,	9012)
+ValuePair(Linear_Yard_Indian,	9013)
+ValuePair(Linear_Fathom,	9014)
+ValuePair(Linear_Mile_International_Nautical,	9015)
+/*
+ *  Angular Units
+ */
+ValuePair(Angular_Radian,	9101)
+ValuePair(Angular_Degree,	9102)
+ValuePair(Angular_Arc_Minute,	9103)
+ValuePair(Angular_Arc_Second,	9104)
+ValuePair(Angular_Grad,	9105)
+ValuePair(Angular_Gon,	9106)
+ValuePair(Angular_DMS,	9107)
+ValuePair(Angular_DMS_Hemisphere,	9108)
+/* end of list */
diff --git a/src/tiff/epsg_vertcs.inc b/src/tiff/epsg_vertcs.inc
new file mode 100644
index 0000000..d6b6791
--- /dev/null
+++ b/src/tiff/epsg_vertcs.inc
@@ -0,0 +1,46 @@
+/*
+ *  EPSG/POSC Ellipsoid-referenced Vertical CS
+ *   Note: these should correspond exactly with the Ellipsoid database.
+ */
+ValuePair(VertCS_Airy_1830_ellipsoid,	5001)
+ValuePair(VertCS_Airy_Modified_1849_ellipsoid,	5002)
+ValuePair(VertCS_ANS_ellipsoid,	5003)
+ValuePair(VertCS_Bessel_1841_ellipsoid,	5004)
+ValuePair(VertCS_Bessel_Modified_ellipsoid,	5005)
+ValuePair(VertCS_Bessel_Namibia_ellipsoid,	5006)
+ValuePair(VertCS_Clarke_1858_ellipsoid,	5007)
+ValuePair(VertCS_Clarke_1866_ellipsoid,	5008)
+ValuePair(VertCS_Clarke_1880_Benoit_ellipsoid,	5010)
+ValuePair(VertCS_Clarke_1880_IGN_ellipsoid,	5011)
+ValuePair(VertCS_Clarke_1880_RGS_ellipsoid,	5012)
+ValuePair(VertCS_Clarke_1880_Arc_ellipsoid,	5013)
+ValuePair(VertCS_Clarke_1880_SGA_1922_ellipsoid,	5014)
+ValuePair(VertCS_Everest_1830_1937_Adjustment_ellipsoid,	5015)
+ValuePair(VertCS_Everest_1830_1967_Definition_ellipsoid,	5016)
+ValuePair(VertCS_Everest_1830_1975_Definition_ellipsoid,	5017)
+ValuePair(VertCS_Everest_1830_Modified_ellipsoid,	5018)
+ValuePair(VertCS_GRS_1980_ellipsoid,	5019)
+ValuePair(VertCS_Helmert_1906_ellipsoid,	5020)
+ValuePair(VertCS_INS_ellipsoid,	5021)
+ValuePair(VertCS_International_1924_ellipsoid,	5022)
+ValuePair(VertCS_International_1967_ellipsoid,	5023)
+ValuePair(VertCS_Krassowsky_1940_ellipsoid,	5024)
+ValuePair(VertCS_NWL_9D_ellipsoid,	5025)
+ValuePair(VertCS_NWL_10D_ellipsoid,	5026)
+ValuePair(VertCS_Plessis_1817_ellipsoid,	5027)
+ValuePair(VertCS_Struve_1860_ellipsoid,	5028)
+ValuePair(VertCS_War_Office_ellipsoid,	5029)
+ValuePair(VertCS_WGS_84_ellipsoid,	5030)
+ValuePair(VertCS_GEM_10C_ellipsoid,	5031)
+ValuePair(VertCS_OSU86F_ellipsoid,	5032)
+ValuePair(VertCS_OSU91A_ellipsoid,	5033)
+/*
+ *  Other established Vertical CS
+ */
+ValuePair(VertCS_Newlyn,	5101)
+ValuePair(VertCS_North_American_Vertical_Datum_1929,	5102)
+ValuePair(VertCS_North_American_Vertical_Datum_1988,	5103)
+ValuePair(VertCS_Yellow_Sea_1956,	5104)
+ValuePair(VertCS_Baltic_Sea,	5105)
+ValuePair(VertCS_Caspian_Sea,	5106)
+/* end of list */
diff --git a/src/tiff/fax3sm.c b/src/tiff/fax3sm.c
new file mode 100644
index 0000000..564c9aa
--- /dev/null
+++ b/src/tiff/fax3sm.c
@@ -0,0 +1,1046 @@
+/* WARNING, this file was automatically generated by the
+    mkg3states program */
+#include "tiff.h"
+#include "tif_fax3.h"
+ const  TIFFFaxTabEnt TIFFFaxMainTable[128] = {
+12,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,7,3,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,6,7,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,5,6,2,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+4,7,3,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,1,4,0,3,1,0,5,3,1,3,1,0,
+2,3,0,3,1,0,4,3,1,3,1,0,4,6,2,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0,
+1,4,0,3,1,0,5,3,1,3,1,0,2,3,0,3,1,0,4,3,1,3,1,0
+};
+const TIFFFaxTabEnt TIFFFaxWhiteTable[4096] = {
+12,11,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
+7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,11,1856,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
+7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,12,2112,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2368,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
+7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,12,1984,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,
+7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2240,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
+7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,12,2496,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,12,11,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
+7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,11,1792,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,11,1856,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
+7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,12,2176,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,
+7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,12,2432,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1472,7,4,5,7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,960,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2048,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,
+7,8,44,7,6,17,9,9,1344,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,
+7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,
+7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,
+7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+11,11,1920,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,
+7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,
+7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1728,7,4,5,7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,
+7,8,42,7,6,16,9,9,1152,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,
+9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,0,0,0,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,7,7,19,7,5,8,7,8,55,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,7,8,53,7,5,9,9,8,448,7,4,6,
+7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1472,7,4,5,
+7,8,43,7,6,17,9,9,1216,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,33,9,5,128,7,8,49,7,6,14,
+7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,7,8,41,7,6,16,9,9,960,7,4,6,
+7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,9,704,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,9,8,320,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,11,12,2304,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,
+7,8,40,7,6,16,9,9,832,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,7,8,36,9,5,128,7,8,52,7,6,15,
+7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1600,7,4,5,7,8,44,7,6,17,9,9,1344,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,30,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,7,8,62,7,4,4,7,4,2,7,4,7,
+7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1088,7,4,6,7,8,32,7,5,8,7,8,58,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,8,640,7,4,6,
+7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,
+7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+0,0,0,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,
+7,7,28,7,4,4,7,4,2,7,4,7,7,7,23,7,4,3,7,7,27,7,4,5,7,8,39,7,6,16,9,8,576,7,4,6,
+7,7,19,7,5,8,7,8,55,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,8,45,7,4,3,7,5,11,7,4,5,
+7,8,53,7,5,9,9,8,448,7,4,6,7,8,35,9,5,128,7,8,51,7,6,15,7,8,63,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,9,9,1536,7,4,5,7,8,43,7,6,17,9,9,1280,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,29,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,
+7,8,33,9,5,128,7,8,49,7,6,14,7,8,61,7,4,4,7,4,2,7,4,7,7,8,47,7,4,3,7,8,59,7,4,5,
+7,8,41,7,6,16,9,9,1024,7,4,6,7,8,31,7,5,8,7,8,57,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,7,22,7,4,3,7,5,11,7,4,5,7,7,26,7,5,9,9,9,768,7,4,6,7,8,37,9,5,128,7,7,25,7,6,15,
+9,8,320,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,
+7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,11,12,2560,7,4,3,7,5,11,7,4,5,
+7,6,12,7,5,9,9,6,1664,7,4,6,7,7,20,9,5,128,7,7,24,7,6,14,7,7,28,7,4,4,7,4,2,7,4,7,
+7,7,23,7,4,3,7,7,27,7,4,5,7,8,40,7,6,16,9,9,896,7,4,6,7,7,19,7,5,8,7,8,56,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7,7,8,46,7,4,3,7,5,11,7,4,5,7,8,54,7,5,9,9,8,512,7,4,6,
+7,8,36,9,5,128,7,8,52,7,6,15,7,8,0,7,4,4,7,4,2,7,4,7,7,6,13,7,4,3,9,9,1728,7,4,5,
+7,8,44,7,6,17,9,9,1408,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,
+7,8,30,7,4,3,7,5,11,7,4,5,7,6,12,7,5,9,9,6,1664,7,4,6,7,8,34,9,5,128,7,8,50,7,6,14,
+7,8,62,7,4,4,7,4,2,7,4,7,7,8,48,7,4,3,7,8,60,7,4,5,7,8,42,7,6,16,9,9,1152,7,4,6,
+7,8,32,7,5,8,7,8,58,9,5,64,7,5,10,7,4,4,7,4,2,7,4,7,7,7,22,7,4,3,7,5,11,7,4,5,
+7,7,26,7,5,9,9,8,640,7,4,6,7,8,38,9,5,128,7,7,25,7,6,15,9,8,384,7,4,4,7,4,2,7,4,7,
+7,6,13,7,4,3,7,7,18,7,4,5,7,7,21,7,6,17,9,7,256,7,4,6,7,6,1,7,5,8,9,6,192,9,5,64,
+7,5,10,7,4,4,7,4,2,7,4,7
+};
+const  TIFFFaxTabEnt TIFFFaxBlackTable[8192] = {
+12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,128,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,56,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,30,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,57,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,54,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,52,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,48,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2112,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,44,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,36,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,384,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,28,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,60,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,40,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2368,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,1984,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,50,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,34,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1664,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,26,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,1408,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,32,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,61,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,42,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1024,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,768,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,62,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2240,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,46,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,38,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,512,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2496,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,12,11,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,25,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,192,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1280,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,31,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1856,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,58,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,21,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,896,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,640,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,49,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2176,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,45,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,37,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,448,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,29,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,1536,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,41,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2432,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2048,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,51,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,35,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,320,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,27,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,59,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,33,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,256,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,43,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1152,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,55,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,63,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2304,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,47,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,39,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,53,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2560,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1792,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,20,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,128,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,56,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,30,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,57,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,54,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,52,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,48,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2112,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,44,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,36,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,384,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,28,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,60,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,40,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2368,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,1984,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,50,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,34,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1728,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,26,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1472,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,32,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,61,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,42,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,1088,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,832,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,62,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2240,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,46,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,38,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,576,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,24,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2496,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+12,11,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,11,1792,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,23,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,20,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,25,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,192,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1344,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,31,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,11,1856,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,58,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,11,21,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,960,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,13,704,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,49,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,12,2176,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,45,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,37,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,12,448,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,29,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,13,1600,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,41,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2432,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,18,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,10,17,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2048,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,51,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,35,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,12,320,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,27,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,59,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,33,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,11,11,1920,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+10,12,256,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,43,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,10,13,1216,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,13,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,9,15,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,55,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,63,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,11,12,2304,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,12,47,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,12,39,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,12,53,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,8,14,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,0,0,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,13,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,19,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,11,24,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,7,11,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,11,22,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+11,12,2560,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,9,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,10,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,10,16,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,10,0,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,10,10,64,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,6,9,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,8,7,11,8,2,3,8,3,1,8,2,2,
+8,4,6,8,2,3,8,3,4,8,2,2,8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2,
+8,8,14,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,8,6,8,8,2,3,8,3,1,8,2,2,
+8,4,5,8,2,3,8,3,4,8,2,2,8,7,12,8,2,3,8,3,1,8,2,2,8,4,6,8,2,3,8,3,4,8,2,2,
+8,5,7,8,2,3,8,3,1,8,2,2,8,4,5,8,2,3,8,3,4,8,2,2
+};
diff --git a/src/tiff/geo_config.h b/src/tiff/geo_config.h
new file mode 100644
index 0000000..9875b77
--- /dev/null
+++ b/src/tiff/geo_config.h
@@ -0,0 +1,20 @@
+/* geo_config.h.  Generated automatically by configure.  */
+#ifndef GEO_CONFIG_H
+#define GEO_CONFIG_H
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Define if you have the <stdlib.h> header file.  */
+#define HAVE_STDLIB_H 1
+
+/* Define if you have the <string.h> header file.  */
+#define HAVE_STRING_H 1
+
+/* Define if you have the <strings.h> header file.  */
+#define HAVE_STRINGS_H 1
+
+/* #undef HAVE_LIBPROJ */
+/* #undef HAVE_PROJECTS_H */
+
+#endif /* ndef GEO_CONFIG_H */
diff --git a/src/tiff/geo_ctrans.inc b/src/tiff/geo_ctrans.inc
new file mode 100644
index 0000000..030fe58
--- /dev/null
+++ b/src/tiff/geo_ctrans.inc
@@ -0,0 +1,55 @@
+/* GeoTIFF Coordinate Transformations Database */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+/*
+ *  Revised 12 Jul 1995   NDR -- changed South Oriented to a code 
+ *  Revised 28 Sep 1995   NDR -- Added Rev. 1.0 aliases. 
+ */
+
+ValuePair(CT_TransverseMercator,	1)
+ValuePair(CT_TransvMercator_Modified_Alaska, 2)
+ValuePair(CT_ObliqueMercator,	3)
+ValuePair(CT_ObliqueMercator_Laborde,	4)
+ValuePair(CT_ObliqueMercator_Rosenmund,	5)
+ValuePair(CT_ObliqueMercator_Spherical,	6)   /* not advisable */
+ValuePair(CT_Mercator,	7)
+ValuePair(CT_LambertConfConic_2SP,	8)
+ValuePair(CT_LambertConfConic,CT_LambertConfConic_2SP)         /* Alias */
+ValuePair(CT_LambertConfConic_1SP,	9)
+ValuePair(CT_LambertConfConic_Helmert,CT_LambertConfConic_1SP) /* alias */
+ValuePair(CT_LambertAzimEqualArea,	10)
+ValuePair(CT_AlbersEqualArea,	11)
+ValuePair(CT_AzimuthalEquidistant,	12)
+ValuePair(CT_EquidistantConic,	13)
+ValuePair(CT_Stereographic,	14)
+ValuePair(CT_PolarStereographic,	15)
+ValuePair(CT_ObliqueStereographic,	16)   /* not advisable */
+ValuePair(CT_Equirectangular,	17)
+ValuePair(CT_CassiniSoldner,	18)
+ValuePair(CT_Gnomonic,	19)
+ValuePair(CT_MillerCylindrical,	20)
+ValuePair(CT_Orthographic,	21)
+ValuePair(CT_Polyconic,	22)
+ValuePair(CT_Robinson,	23)
+ValuePair(CT_Sinusoidal,	24)
+ValuePair(CT_VanDerGrinten,	25)
+ValuePair(CT_NewZealandMapGrid,	26)
+/* Added for 1.0 */
+ValuePair(CT_TransvMercator_SouthOrientated, 27)
+
+
+/* Aliases */
+
+ValuePair(CT_SouthOrientedGaussConformal,CT_TransvMercator_SouthOrientated)
+ValuePair(CT_AlaskaConformal,	CT_TransvMercator_Modified_Alaska)
+ValuePair(CT_TransvEquidistCylindrical,	CT_CassiniSoldner)
+ValuePair(CT_ObliqueMercator_Hotine,	CT_ObliqueMercator)
+ValuePair(CT_SwissObliqueCylindrical,	CT_ObliqueMercator_Rosenmund)
+ValuePair(CT_GaussBoaga,	CT_TransverseMercator)
+ValuePair(CT_GaussKruger,	CT_TransverseMercator)
+ValuePair(CT_TransvMercator_SouthOriented, CT_TransvMercator_SouthOrientated)
+
+
diff --git a/src/tiff/geo_extra.c b/src/tiff/geo_extra.c
new file mode 100644
index 0000000..9338436
--- /dev/null
+++ b/src/tiff/geo_extra.c
@@ -0,0 +1,750 @@
+/******************************************************************************
+ * $Id: geo_extra.c,v 1.2 2004/03/19 11:51:23 lubia Exp $
+ *
+ * Project:  libgeotiff
+ * Purpose:  Code to normalize a few common PCS values without use of CSV
+ *           files.
+ * Author:   Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: geo_extra.c,v $
+ * Revision 1.2  2004/03/19 11:51:23  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.4  2002/12/01 23:44:34  warmerda
+ * Fixed typo in last fix.
+ *
+ * Revision 1.3  2002/12/01 23:42:06  warmerda
+ * added overrides for two deprecated stateplane zones
+ *
+ * Revision 1.2  1999/05/04 03:09:33  warmerda
+ * avoid warnings
+ *
+ * Revision 1.1  1999/04/28 20:01:29  warmerda
+ * new
+ *
+ */
+
+/*
+#include "geotiff.h"
+#include "geo_tiffp.h"
+#include "geo_keyp.h"
+*/
+
+#include "geo_normalize.h"
+#include "geovalues.h"
+
+static int StatePlaneTable[] = 
+{
+    PCS_NAD83_Alabama_East,		Proj_Alabama_CS83_East,
+    PCS_NAD83_Alabama_West,		Proj_Alabama_CS83_West,
+
+    PCS_NAD83_Alaska_zone_1,		Proj_Alaska_CS83_1,
+    PCS_NAD83_Alaska_zone_2,		Proj_Alaska_CS83_2,
+    PCS_NAD83_Alaska_zone_3,		Proj_Alaska_CS83_3,
+    PCS_NAD83_Alaska_zone_4,		Proj_Alaska_CS83_4,
+    PCS_NAD83_Alaska_zone_5,		Proj_Alaska_CS83_5,
+    PCS_NAD83_Alaska_zone_6,		Proj_Alaska_CS83_6,
+    PCS_NAD83_Alaska_zone_7,		Proj_Alaska_CS83_7,
+    PCS_NAD83_Alaska_zone_8,		Proj_Alaska_CS83_8,
+    PCS_NAD83_Alaska_zone_9,		Proj_Alaska_CS83_9,
+    PCS_NAD83_Alaska_zone_10,		Proj_Alaska_CS83_10,
+
+    PCS_NAD83_California_1,		Proj_California_CS83_1,
+    PCS_NAD83_California_2,		Proj_California_CS83_2,
+    PCS_NAD83_California_3,		Proj_California_CS83_3,
+    PCS_NAD83_California_4,		Proj_California_CS83_4,
+    PCS_NAD83_California_5,		Proj_California_CS83_5,
+    PCS_NAD83_California_6,		Proj_California_CS83_6,
+
+    PCS_NAD83_Arizona_East,		Proj_Arizona_CS83_east,
+    PCS_NAD83_Arizona_Central,		Proj_Arizona_CS83_Central,
+    PCS_NAD83_Arizona_West,		Proj_Arizona_CS83_west,
+
+    PCS_NAD83_Arkansas_North,		Proj_Arkansas_CS83_North,
+    PCS_NAD83_Arkansas_South,		Proj_Arkansas_CS83_South,
+
+    PCS_NAD83_Colorado_North,		Proj_Colorado_CS83_North,
+    PCS_NAD83_Colorado_Central,		Proj_Colorado_CS83_Central,
+    PCS_NAD83_Colorado_South,		Proj_Colorado_CS83_South,
+
+    PCS_NAD83_Connecticut,		Proj_Connecticut_CS83,
+
+    PCS_NAD83_Delaware,			Proj_Delaware_CS83,
+
+    PCS_NAD83_Florida_East,		Proj_Florida_CS83_East,
+    PCS_NAD83_Florida_North,		Proj_Florida_CS83_North,
+    PCS_NAD83_Florida_West,		Proj_Florida_CS83_West,
+
+    PCS_NAD83_Hawaii_zone_1,		Proj_Hawaii_CS83_1,
+    PCS_NAD83_Hawaii_zone_2,		Proj_Hawaii_CS83_2,
+    PCS_NAD83_Hawaii_zone_3,		Proj_Hawaii_CS83_3,
+    PCS_NAD83_Hawaii_zone_4,		Proj_Hawaii_CS83_4,
+    PCS_NAD83_Hawaii_zone_5,		Proj_Hawaii_CS83_5,
+
+    PCS_NAD83_Georgia_East,		Proj_Georgia_CS83_East,
+    PCS_NAD83_Georgia_West,		Proj_Georgia_CS83_West,
+
+    PCS_NAD83_Idaho_East,		Proj_Idaho_CS83_East,
+    PCS_NAD83_Idaho_Central,		Proj_Idaho_CS83_Central,
+    PCS_NAD83_Idaho_West,		Proj_Idaho_CS83_West,
+
+    PCS_NAD83_Illinois_East,		Proj_Illinois_CS83_East,
+    PCS_NAD83_Illinois_West,		Proj_Illinois_CS83_West,
+
+    PCS_NAD83_Indiana_East,		Proj_Indiana_CS83_East,
+    PCS_NAD83_Indiana_West,		Proj_Indiana_CS83_West,
+
+    PCS_NAD83_Iowa_North,      		Proj_Iowa_CS83_North,
+    PCS_NAD83_Iowa_South,      		Proj_Iowa_CS83_South,
+
+    PCS_NAD83_Kansas_North,		Proj_Kansas_CS83_North,
+    PCS_NAD83_Kansas_South,		Proj_Kansas_CS83_South,
+
+    PCS_NAD83_Kentucky_North,		Proj_Kentucky_CS83_North,
+    PCS_NAD83_Kentucky_South,		Proj_Kentucky_CS83_South,
+
+    PCS_NAD83_Louisiana_North,		Proj_Louisiana_CS83_North,
+    PCS_NAD83_Louisiana_South,		Proj_Louisiana_CS83_South,
+
+    PCS_NAD83_Maine_East,		Proj_Maine_CS83_East,
+    PCS_NAD83_Maine_West,		Proj_Maine_CS83_West,
+
+    PCS_NAD83_Maryland,			Proj_Maryland_CS83,
+
+    PCS_NAD83_Massachusetts,		Proj_Massachusetts_CS83_Mainland,
+    PCS_NAD83_Massachusetts_Is,		Proj_Massachusetts_CS83_Island,
+
+    PCS_NAD83_Michigan_North,		Proj_Michigan_CS83_North,
+    PCS_NAD83_Michigan_Central,		Proj_Michigan_CS83_Central,
+    PCS_NAD83_Michigan_South,		Proj_Michigan_CS83_South,
+
+    PCS_NAD83_Minnesota_North,		Proj_Minnesota_CS83_North,
+    PCS_NAD83_Minnesota_Cent,		Proj_Minnesota_CS83_Central,
+    PCS_NAD83_Minnesota_South,		Proj_Minnesota_CS83_South,
+
+    PCS_NAD83_Mississippi_East,		Proj_Mississippi_CS83_East,
+    PCS_NAD83_Mississippi_West,		Proj_Mississippi_CS83_West,
+
+    PCS_NAD83_Missouri_East,		Proj_Missouri_CS83_East,
+    PCS_NAD83_Missouri_Central,		Proj_Missouri_CS83_Central,
+    PCS_NAD83_Missouri_West,		Proj_Missouri_CS83_West,
+
+    PCS_NAD83_Montana,			Proj_Montana_CS83,
+
+    PCS_NAD83_Nebraska,			Proj_Nebraska_CS83,
+
+    PCS_NAD83_Nevada_East,		Proj_Nevada_CS83_East,
+    PCS_NAD83_Nevada_Central,		Proj_Nevada_CS83_Central,
+    PCS_NAD83_Nevada_West,		Proj_Nevada_CS83_West,
+
+    PCS_NAD83_New_Hampshire,		Proj_New_Hampshire_CS83,
+
+    PCS_NAD83_New_Jersey,		Proj_New_Jersey_CS83,
+
+    PCS_NAD83_New_Mexico_East,		Proj_New_Mexico_CS83_East,
+    PCS_NAD83_New_Mexico_Cent,		Proj_New_Mexico_CS83_Central,
+    PCS_NAD83_New_Mexico_West,		Proj_New_Mexico_CS83_West,
+
+    PCS_NAD83_New_York_East,		Proj_New_York_CS83_East,
+    PCS_NAD83_New_York_Central,		Proj_New_York_CS83_Central,
+    PCS_NAD83_New_York_West,		Proj_New_York_CS83_West,
+    PCS_NAD83_New_York_Long_Is,		Proj_New_York_CS83_Long_Island,
+
+    PCS_NAD83_North_Carolina,	       	Proj_North_Carolina_CS83,
+
+    PCS_NAD83_North_Dakota_N,		Proj_North_Dakota_CS83_North,
+    PCS_NAD83_North_Dakota_S,		Proj_North_Dakota_CS83_South,
+
+    PCS_NAD83_Ohio_North,		Proj_Ohio_CS83_North,
+    PCS_NAD83_Ohio_South,		Proj_Ohio_CS83_South,
+
+    PCS_NAD83_Oklahoma_North,		Proj_Oklahoma_CS83_North,
+    PCS_NAD83_Oklahoma_South,		Proj_Oklahoma_CS83_South,
+
+    PCS_NAD83_Oregon_North,		Proj_Oregon_CS83_North,
+    PCS_NAD83_Oregon_South,		Proj_Oregon_CS83_South,
+
+    PCS_NAD83_Pennsylvania_N,		Proj_Pennsylvania_CS83_North,
+    PCS_NAD83_Pennsylvania_S,		Proj_Pennsylvania_CS83_South,
+
+    PCS_NAD83_Rhode_Island,		Proj_Rhode_Island_CS83,
+
+    PCS_NAD83_South_Carolina,		Proj_South_Carolina_CS83,
+
+    PCS_NAD83_South_Dakota_N,		Proj_South_Dakota_CS83_North,
+    PCS_NAD83_South_Dakota_S,		Proj_South_Dakota_CS83_South,
+
+    PCS_NAD83_Tennessee,		Proj_Tennessee_CS83,
+
+    PCS_NAD83_Texas_North,		Proj_Texas_CS83_North,
+    PCS_NAD83_Texas_North_Cen,		Proj_Texas_CS83_North_Central,
+    PCS_NAD83_Texas_Central,		Proj_Texas_CS83_Central,
+    PCS_NAD83_Texas_South_Cen,		Proj_Texas_CS83_South_Central,
+    PCS_NAD83_Texas_South,		Proj_Texas_CS83_South,
+
+    PCS_NAD83_Utah_North,		Proj_Utah_CS83_North,
+    PCS_NAD83_Utah_Central,		Proj_Utah_CS83_Central,
+    PCS_NAD83_Utah_South,		Proj_Utah_CS83_South,
+
+    PCS_NAD83_Vermont,			Proj_Vermont_CS83,
+
+    PCS_NAD83_Virginia_North,		Proj_Virginia_CS83_North,
+    PCS_NAD83_Virginia_South,		Proj_Virginia_CS83_South,
+
+    PCS_NAD83_Washington_North,		Proj_Washington_CS83_North,
+    PCS_NAD83_Washington_South,		Proj_Washington_CS83_South,
+
+    PCS_NAD83_West_Virginia_N,		Proj_West_Virginia_CS83_North,
+    PCS_NAD83_West_Virginia_S,		Proj_West_Virginia_CS83_South,
+
+    PCS_NAD83_Wisconsin_North,		Proj_Wisconsin_CS83_North,
+    PCS_NAD83_Wisconsin_Cen,		Proj_Wisconsin_CS83_Central,
+    PCS_NAD83_Wisconsin_South,		Proj_Wisconsin_CS83_South,
+
+    PCS_NAD83_Wyoming_East,		Proj_Wyoming_CS83_East,
+    PCS_NAD83_Wyoming_E_Cen,		Proj_Wyoming_CS83_East_Central,
+    PCS_NAD83_Wyoming_W_Cen,		Proj_Wyoming_CS83_West_Central,
+    PCS_NAD83_Wyoming_West,		Proj_Wyoming_CS83_West,
+    
+    PCS_NAD83_Puerto_Rico_Virgin_Is,	Proj_Puerto_Rico_Virgin_Is,
+
+    PCS_NAD27_Alabama_East,		Proj_Alabama_CS27_East,
+    PCS_NAD27_Alabama_West,		Proj_Alabama_CS27_West,
+
+    PCS_NAD27_Alaska_zone_1,		Proj_Alaska_CS27_1,
+    PCS_NAD27_Alaska_zone_2,		Proj_Alaska_CS27_2,
+    PCS_NAD27_Alaska_zone_3,		Proj_Alaska_CS27_3,
+    PCS_NAD27_Alaska_zone_4,		Proj_Alaska_CS27_4,
+    PCS_NAD27_Alaska_zone_5,		Proj_Alaska_CS27_5,
+    PCS_NAD27_Alaska_zone_6,		Proj_Alaska_CS27_6,
+    PCS_NAD27_Alaska_zone_7,		Proj_Alaska_CS27_7,
+    PCS_NAD27_Alaska_zone_8,		Proj_Alaska_CS27_8,
+    PCS_NAD27_Alaska_zone_9,		Proj_Alaska_CS27_9,
+    PCS_NAD27_Alaska_zone_10,		Proj_Alaska_CS27_10,
+
+    PCS_NAD27_California_I,		Proj_California_CS27_I,
+    PCS_NAD27_California_II,		Proj_California_CS27_II,
+    PCS_NAD27_California_III,		Proj_California_CS27_III,
+    PCS_NAD27_California_IV,		Proj_California_CS27_IV,
+    PCS_NAD27_California_V,		Proj_California_CS27_V,
+    PCS_NAD27_California_VI,		Proj_California_CS27_VI,
+    PCS_NAD27_California_VII,		Proj_California_CS27_VII,
+
+    PCS_NAD27_Arizona_East,		Proj_Arizona_Coordinate_System_east,
+    PCS_NAD27_Arizona_Central,		Proj_Arizona_Coordinate_System_Central,
+    PCS_NAD27_Arizona_West,		Proj_Arizona_Coordinate_System_west,
+
+    PCS_NAD27_Arkansas_North,		Proj_Arkansas_CS27_North,
+    PCS_NAD27_Arkansas_South,		Proj_Arkansas_CS27_South,
+
+    PCS_NAD27_Colorado_North,		Proj_Colorado_CS27_North,
+    PCS_NAD27_Colorado_Central,		Proj_Colorado_CS27_Central,
+    PCS_NAD27_Colorado_South,		Proj_Colorado_CS27_South,
+
+    PCS_NAD27_Connecticut,		Proj_Connecticut_CS27,
+
+    PCS_NAD27_Delaware,			Proj_Delaware_CS27,
+
+    PCS_NAD27_Florida_East,		Proj_Florida_CS27_East,
+    PCS_NAD27_Florida_North,		Proj_Florida_CS27_North,
+    PCS_NAD27_Florida_West,		Proj_Florida_CS27_West,
+
+    PCS_NAD27_Hawaii_zone_1,		Proj_Hawaii_CS27_1,
+    PCS_NAD27_Hawaii_zone_2,		Proj_Hawaii_CS27_2,
+    PCS_NAD27_Hawaii_zone_3,		Proj_Hawaii_CS27_3,
+    PCS_NAD27_Hawaii_zone_4,		Proj_Hawaii_CS27_4,
+    PCS_NAD27_Hawaii_zone_5,		Proj_Hawaii_CS27_5,
+
+    PCS_NAD27_Georgia_East,		Proj_Georgia_CS27_East,
+    PCS_NAD27_Georgia_West,		Proj_Georgia_CS27_West,
+
+    PCS_NAD27_Idaho_East,		Proj_Idaho_CS27_East,
+    PCS_NAD27_Idaho_Central,		Proj_Idaho_CS27_Central,
+    PCS_NAD27_Idaho_West,		Proj_Idaho_CS27_West,
+
+    PCS_NAD27_Illinois_East,		Proj_Illinois_CS27_East,
+    PCS_NAD27_Illinois_West,		Proj_Illinois_CS27_West,
+
+    PCS_NAD27_Indiana_East,		Proj_Indiana_CS27_East,
+    PCS_NAD27_Indiana_West,		Proj_Indiana_CS27_West,
+
+    PCS_NAD27_Iowa_North,      		Proj_Iowa_CS27_North,
+    PCS_NAD27_Iowa_South,      		Proj_Iowa_CS27_South,
+
+    PCS_NAD27_Kansas_North,		Proj_Kansas_CS27_North,
+    PCS_NAD27_Kansas_South,		Proj_Kansas_CS27_South,
+
+    PCS_NAD27_Kentucky_North,		Proj_Kentucky_CS27_North,
+    PCS_NAD27_Kentucky_South,		Proj_Kentucky_CS27_South,
+
+    PCS_NAD27_Louisiana_North,		Proj_Louisiana_CS27_North,
+    PCS_NAD27_Louisiana_South,		Proj_Louisiana_CS27_South,
+
+    PCS_NAD27_Maine_East,		Proj_Maine_CS27_East,
+    PCS_NAD27_Maine_West,		Proj_Maine_CS27_West,
+
+    PCS_NAD27_Maryland,			Proj_Maryland_CS27,
+
+    PCS_NAD27_Massachusetts,		Proj_Massachusetts_CS27_Mainland,
+    PCS_NAD27_Massachusetts_Is,		Proj_Massachusetts_CS27_Island,
+
+    PCS_NAD27_Michigan_North,		Proj_Michigan_CS27_North,
+    PCS_NAD27_Michigan_Central,		Proj_Michigan_CS27_Central,
+    PCS_NAD27_Michigan_South,		Proj_Michigan_CS27_South,
+
+    PCS_NAD27_Minnesota_North,		Proj_Minnesota_CS27_North,
+    PCS_NAD27_Minnesota_Cent,		Proj_Minnesota_CS27_Central,
+    PCS_NAD27_Minnesota_South,		Proj_Minnesota_CS27_South,
+
+    PCS_NAD27_Mississippi_East,		Proj_Mississippi_CS27_East,
+    PCS_NAD27_Mississippi_West,		Proj_Mississippi_CS27_West,
+
+    PCS_NAD27_Missouri_East,		Proj_Missouri_CS27_East,
+    PCS_NAD27_Missouri_Central,		Proj_Missouri_CS27_Central,
+    PCS_NAD27_Missouri_West,		Proj_Missouri_CS27_West,
+
+    PCS_NAD27_Montana_North,		Proj_Montana_CS27_North,
+    PCS_NAD27_Montana_Central,		Proj_Montana_CS27_Central,
+    PCS_NAD27_Montana_South,		Proj_Montana_CS27_South,
+
+    PCS_NAD27_Nebraska_North,		Proj_Nebraska_CS27_North,
+    PCS_NAD27_Nebraska_South,		Proj_Nebraska_CS27_South,
+
+    PCS_NAD27_Nevada_East,		Proj_Nevada_CS27_East,
+    PCS_NAD27_Nevada_Central,		Proj_Nevada_CS27_Central,
+    PCS_NAD27_Nevada_West,		Proj_Nevada_CS27_West,
+
+    PCS_NAD27_New_Hampshire,		Proj_New_Hampshire_CS27,
+
+    PCS_NAD27_New_Jersey,		Proj_New_Jersey_CS27,
+
+    PCS_NAD27_New_Mexico_East,		Proj_New_Mexico_CS27_East,
+    PCS_NAD27_New_Mexico_Cent,		Proj_New_Mexico_CS27_Central,
+    PCS_NAD27_New_Mexico_West,		Proj_New_Mexico_CS27_West,
+
+    PCS_NAD27_New_York_East,		Proj_New_York_CS27_East,
+    PCS_NAD27_New_York_Central,		Proj_New_York_CS27_Central,
+    PCS_NAD27_New_York_West,		Proj_New_York_CS27_West,
+    PCS_NAD27_New_York_Long_Is,		Proj_New_York_CS27_Long_Island,
+
+    PCS_NAD27_North_Carolina,	       	Proj_North_Carolina_CS27,
+
+    PCS_NAD27_North_Dakota_N,		Proj_North_Dakota_CS27_North,
+    PCS_NAD27_North_Dakota_S,		Proj_North_Dakota_CS27_South,
+
+    PCS_NAD27_Ohio_North,		Proj_Ohio_CS27_North,
+    PCS_NAD27_Ohio_South,		Proj_Ohio_CS27_South,
+
+    PCS_NAD27_Oklahoma_North,		Proj_Oklahoma_CS27_North,
+    PCS_NAD27_Oklahoma_South,		Proj_Oklahoma_CS27_South,
+
+    PCS_NAD27_Oregon_North,		Proj_Oregon_CS27_North,
+    PCS_NAD27_Oregon_South,		Proj_Oregon_CS27_South,
+
+    PCS_NAD27_Pennsylvania_N,		Proj_Pennsylvania_CS27_North,
+    PCS_NAD27_Pennsylvania_S,		Proj_Pennsylvania_CS27_South,
+
+    PCS_NAD27_Rhode_Island,		Proj_Rhode_Island_CS27,
+
+    PCS_NAD27_South_Carolina_N,		Proj_South_Carolina_CS27_North,
+    PCS_NAD27_South_Carolina_S,		Proj_South_Carolina_CS27_South,
+
+    PCS_NAD27_South_Dakota_N,		Proj_South_Dakota_CS27_North,
+    PCS_NAD27_South_Dakota_S,		Proj_South_Dakota_CS27_South,
+
+    PCS_NAD27_Tennessee,		Proj_Tennessee_CS27,
+
+    PCS_NAD27_Texas_North,		Proj_Texas_CS27_North,
+    PCS_NAD27_Texas_North_Cen,		Proj_Texas_CS27_North_Central,
+    PCS_NAD27_Texas_Central,		Proj_Texas_CS27_Central,
+    PCS_NAD27_Texas_South_Cen,		Proj_Texas_CS27_South_Central,
+    PCS_NAD27_Texas_South,		Proj_Texas_CS27_South,
+
+    PCS_NAD27_Utah_North,		Proj_Utah_CS27_North,
+    PCS_NAD27_Utah_Central,		Proj_Utah_CS27_Central,
+    PCS_NAD27_Utah_South,		Proj_Utah_CS27_South,
+
+    PCS_NAD27_Vermont,			Proj_Vermont_CS27,
+
+    PCS_NAD27_Virginia_North,		Proj_Virginia_CS27_North,
+    PCS_NAD27_Virginia_South,		Proj_Virginia_CS27_South,
+
+    PCS_NAD27_Washington_North,		Proj_Washington_CS27_North,
+    PCS_NAD27_Washington_South,		Proj_Washington_CS27_South,
+
+    PCS_NAD27_West_Virginia_N,		Proj_West_Virginia_CS27_North,
+    PCS_NAD27_West_Virginia_S,		Proj_West_Virginia_CS27_South,
+
+    PCS_NAD27_Wisconsin_North,		Proj_Wisconsin_CS27_North,
+    PCS_NAD27_Wisconsin_Cen,		Proj_Wisconsin_CS27_Central,
+    PCS_NAD27_Wisconsin_South,		Proj_Wisconsin_CS27_South,
+
+    PCS_NAD27_Wyoming_East,		Proj_Wyoming_CS27_East,
+    PCS_NAD27_Wyoming_E_Cen,		Proj_Wyoming_CS27_East_Central,
+    PCS_NAD27_Wyoming_W_Cen,		Proj_Wyoming_CS27_West_Central,
+    PCS_NAD27_Wyoming_West,		Proj_Wyoming_CS27_West,
+    
+    PCS_NAD27_Puerto_Rico,		Proj_Puerto_Rico_CS27,
+
+    KvUserDefined
+};
+
+/************************************************************************/
+/*                          GTIFMapSysToPCS()                           */
+/*                                                                      */
+/*      Given a Datum, MapSys and zone value generate the best PCS      */
+/*      code possible.                                                  */
+/************************************************************************/
+
+int	GTIFMapSysToPCS( int MapSys, int Datum, int nZone )
+
+{
+    int		PCSCode = KvUserDefined;
+
+    if( MapSys == MapSys_UTM_North )
+    {
+	if( Datum == GCS_NAD27 )
+	    PCSCode = PCS_NAD27_UTM_zone_3N + nZone - 3;
+	else if( Datum == GCS_NAD83 )
+	    PCSCode = PCS_NAD83_UTM_zone_3N + nZone - 3;
+	else if( Datum == GCS_WGS_72 )
+	    PCSCode = PCS_WGS72_UTM_zone_1N + nZone - 1;
+	else if( Datum == GCS_WGS_72BE )
+	    PCSCode = PCS_WGS72BE_UTM_zone_1N + nZone - 1;
+	else if( Datum == GCS_WGS_84 )
+	    PCSCode = PCS_WGS84_UTM_zone_1N + nZone - 1;
+    }
+    else if( MapSys == MapSys_UTM_South )
+    {
+	if( Datum == GCS_WGS_72 )
+	    PCSCode = PCS_WGS72_UTM_zone_1S + nZone - 1;
+	else if( Datum == GCS_WGS_72BE )
+	    PCSCode = PCS_WGS72BE_UTM_zone_1S + nZone - 1;
+	else if( Datum == GCS_WGS_84 )
+	    PCSCode = PCS_WGS84_UTM_zone_1S + nZone - 1;
+    }
+    else if( MapSys == MapSys_State_Plane_27 )
+    {
+	int		i;
+
+        PCSCode = 10000 + nZone;
+	for( i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
+	{
+	    if( StatePlaneTable[i+1] == PCSCode )
+	        PCSCode = StatePlaneTable[i];
+	}
+
+        /* Old EPSG code was in error for Tennesse CS27, override */
+        if( nZone == 4100 )
+            PCSCode = 2204;
+    }
+    else if( MapSys == MapSys_State_Plane_83 )
+    {
+	int		i;
+
+        PCSCode = 10000 + nZone + 30;
+
+	for( i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
+	{
+	    if( StatePlaneTable[i+1] == PCSCode )
+	        PCSCode = StatePlaneTable[i];
+	}
+
+        /* Old EPSG code was in error for Kentucky North CS83, override */
+        if( nZone == 1601 )
+            PCSCode = 2205;
+    }
+
+    return( PCSCode );
+}
+
+/************************************************************************/
+/*                          GTIFMapSysToProj()                          */
+/*                                                                      */
+/*      Given a MapSys and zone value generate the best Proj_           */
+/*      code possible.                                                  */
+/************************************************************************/
+
+int	GTIFMapSysToProj( int MapSys, int nZone )
+
+{
+    int		ProjCode = KvUserDefined;
+
+    if( MapSys == MapSys_UTM_North )
+    {
+        ProjCode = Proj_UTM_zone_1N + nZone - 1;
+    }
+    else if( MapSys == MapSys_UTM_South )
+    {
+        ProjCode = Proj_UTM_zone_1S + nZone - 1;
+    }
+    else if( MapSys == MapSys_State_Plane_27 )
+    {
+        ProjCode = 10000 + nZone;
+
+        /* Tennesse override */
+        if( nZone == 4100 )
+            ProjCode = 15302;
+    }
+    else if( MapSys == MapSys_State_Plane_83 )
+    {
+        ProjCode = 10000 + nZone + 30;
+
+        /* Kentucky North override */
+        if( nZone == 1601 )
+            ProjCode = 15303;
+    }
+
+    return( ProjCode );
+}
+
+/************************************************************************/
+/*                          GTIFPCSToMapSys()                           */
+/************************************************************************/
+
+/**
+ * Translate a PCS_ code into a UTM or State Plane map system, a datum,
+ * and a zone if possible.
+ *
+ * @param PCSCode The projection code (PCS_*) as would be stored in the
+ * ProjectedCSTypeGeoKey of a GeoTIFF file.
+ *
+ * @param pDatum Pointer to an integer into which the datum code (GCS_*)
+ * is put if the function succeeds.
+ *
+ * @param pZone Pointer to an integer into which the zone will be placed
+ * if the function is successful.
+ *
+ * @return Returns either MapSys_UTM_North, MapSys_UTM_South,
+ * MapSys_State_Plane_83, MapSys_State_Plane_27 or KvUserDefined.
+ * KvUserDefined indicates that the
+ * function failed to recognise the projection as UTM or State Plane.
+ *
+ * The zone value is only set if the return code is other than KvUserDefined.
+ * For utm map system the returned zone will be between 1 and 60.  For
+ * State Plane, the USGS state plane zone number is returned.  For instance,
+ * Alabama East is zone 101.
+ *
+ * The datum (really this is the GCS) is set to a GCS_ value such as GCS_NAD27.
+ *
+ * This function is useful to recognise (most) UTM and State Plane coordinate
+ * systems, even if CSV files aren't available to translate them automatically.
+ * It is used as a fallback mechanism by GTIFGetDefn() for normalization when
+ * CSV files aren't found. 
+ */
+
+int GTIFPCSToMapSys( int PCSCode, int * pDatum, int * pZone )
+
+{
+    int		Datum = KvUserDefined, Proj = KvUserDefined;
+    int		nZone = KvUserDefined, i;
+
+/* -------------------------------------------------------------------- */
+/*      UTM with various datums.  Note there are lots of PCS UTM        */
+/*      codes not done yet which use strange datums.                    */
+/* -------------------------------------------------------------------- */
+    if( PCSCode >= PCS_NAD27_UTM_zone_3N && PCSCode <= PCS_NAD27_UTM_zone_22N )
+    {
+	Datum = GCS_NAD27;
+	Proj = MapSys_UTM_North;
+	nZone = PCSCode - PCS_NAD27_UTM_zone_3N + 3;
+    }
+    else if( PCSCode >= PCS_NAD83_UTM_zone_3N 
+	     && PCSCode <= PCS_NAD83_UTM_zone_23N )
+    {
+	Datum = GCS_NAD83;
+	Proj = MapSys_UTM_North;
+	nZone = PCSCode - PCS_NAD83_UTM_zone_3N + 3;
+    }
+
+    else if( PCSCode >= PCS_WGS72_UTM_zone_1N
+	     && PCSCode <= PCS_WGS72_UTM_zone_60N )
+    {
+	Datum = GCS_WGS_72;
+	Proj = MapSys_UTM_North;
+	nZone = PCSCode - PCS_WGS72_UTM_zone_1N + 1;
+    }
+    else if( PCSCode >= PCS_WGS72_UTM_zone_1S
+	     && PCSCode <= PCS_WGS72_UTM_zone_60S )
+    {
+	Datum = GCS_WGS_72;
+	Proj = MapSys_UTM_South;
+	nZone = PCSCode - PCS_WGS72_UTM_zone_1S + 1;
+    }
+
+    else if( PCSCode >= PCS_WGS72BE_UTM_zone_1N
+	     && PCSCode <= PCS_WGS72BE_UTM_zone_60N )
+    {
+	Datum = GCS_WGS_72BE;
+	Proj = MapSys_UTM_North;
+	nZone = PCSCode - PCS_WGS72BE_UTM_zone_1N + 1;
+    }
+    else if( PCSCode >= PCS_WGS72BE_UTM_zone_1S
+	     && PCSCode <= PCS_WGS72BE_UTM_zone_60S )
+    {
+	Datum = GCS_WGS_72BE;
+	Proj = MapSys_UTM_South;
+	nZone = PCSCode - PCS_WGS72BE_UTM_zone_1S + 1;
+    }
+
+    else if( PCSCode >= PCS_WGS84_UTM_zone_1N
+	     && PCSCode <= PCS_WGS84_UTM_zone_60N )
+    {
+	Datum = GCS_WGS_84;
+	Proj = MapSys_UTM_North;
+	nZone = PCSCode - PCS_WGS84_UTM_zone_1N + 1;
+    }
+    else if( PCSCode >= PCS_WGS84_UTM_zone_1S
+	     && PCSCode <= PCS_WGS84_UTM_zone_60S )
+    {
+	Datum = GCS_WGS_84;
+	Proj = MapSys_UTM_South;
+	nZone = PCSCode - PCS_WGS84_UTM_zone_1S + 1;
+    }
+    else if( PCSCode >= PCS_SAD69_UTM_zone_18N 
+	     && PCSCode <= PCS_SAD69_UTM_zone_22N )
+    {
+	Datum = KvUserDefined;
+	Proj = MapSys_UTM_North;
+	nZone = PCSCode - PCS_SAD69_UTM_zone_18N + 18;
+    }
+    else if( PCSCode >= PCS_SAD69_UTM_zone_17S
+	     && PCSCode <= PCS_SAD69_UTM_zone_25S )
+    {
+	Datum = KvUserDefined;
+	Proj = MapSys_UTM_South;
+	nZone = PCSCode - PCS_SAD69_UTM_zone_17S + 17;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      State Plane zones, first we translate any PCS_ codes to		*/
+/*	a Proj_ code that we can get a handle on.			*/
+/* -------------------------------------------------------------------- */
+    for( i = 0; StatePlaneTable[i] != KvUserDefined; i += 2 )
+    {
+	if( StatePlaneTable[i] == PCSCode )
+	    PCSCode = StatePlaneTable[i+1];
+    }
+
+    if( PCSCode <= 15900 && PCSCode >= 10000 )
+    {
+	if( (PCSCode % 100) >= 30 )
+        {
+            Proj = MapSys_State_Plane_83;
+	    Datum = GCS_NAD83;
+        }
+	else
+        {
+            Proj = MapSys_State_Plane_27;
+	    Datum = GCS_NAD27;
+        }
+	
+	nZone = PCSCode - 10000;
+	if( Datum == GCS_NAD83 )
+	    nZone -= 30;
+    }
+
+    if( pDatum != NULL )
+        *pDatum = Datum;
+
+    if( pZone != NULL )
+        *pZone = nZone;
+
+    return( Proj );
+}
+
+/************************************************************************/
+/*                          GTIFProjToMapSys()                          */
+/************************************************************************/
+
+/**
+ * Translate a Proj_ code into a UTM or State Plane map system, and a zone
+ * if possible.
+ *
+ * @param ProjCode The projection code (Proj_*) as would be stored in the
+ * ProjectionGeoKey of a GeoTIFF file.
+ * @param pZone Pointer to an integer into which the zone will be placed
+ * if the function is successful.
+ *
+ * @return Returns either MapSys_UTM_North, MapSys_UTM_South,
+ * MapSys_State_Plane_27, MapSys_State_Plane_83 or KvUserDefined.
+ * KvUserDefined indicates that the
+ * function failed to recognise the projection as UTM or State Plane.
+ *
+ * The zone value is only set if the return code is other than KvUserDefined.
+ * For utm map system the returned zone will be between 1 and 60.  For
+ * State Plane, the USGS state plane zone number is returned.  For instance,
+ * Alabama East is zone 101.
+ *
+ * This function is useful to recognise UTM and State Plane coordinate
+ * systems, and to extract zone numbers so the projections can be
+ * represented as UTM rather than as the underlying projection method such
+ * Transverse Mercator for instance.
+ */
+
+int GTIFProjToMapSys( int ProjCode, int * pZone )
+
+{
+    int		nZone = KvUserDefined;
+    int		MapSys = KvUserDefined;
+
+/* -------------------------------------------------------------------- */
+/*      Handle UTM.                                                     */
+/* -------------------------------------------------------------------- */
+    if( ProjCode >= Proj_UTM_zone_1N && ProjCode <= Proj_UTM_zone_60N )
+    {
+	MapSys = MapSys_UTM_North;
+	nZone = ProjCode - Proj_UTM_zone_1N + 1;
+    }
+    else if( ProjCode >= Proj_UTM_zone_1S && ProjCode <= Proj_UTM_zone_60S )
+    {
+	MapSys = MapSys_UTM_South;
+	nZone = ProjCode - Proj_UTM_zone_1S + 1;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Handle State Plane.  I think there are some anomolies in        */
+/*      here, so this is a bit risky.                                   */
+/* -------------------------------------------------------------------- */
+    else if( ProjCode >= 10101 && ProjCode <= 15299 )
+    {
+        if( ProjCode % 100 >= 30 )
+        {
+            MapSys = MapSys_State_Plane_83;
+            nZone = ProjCode - 10000 - 30;
+        }
+        else
+        {
+            MapSys = MapSys_State_Plane_27;
+            nZone = ProjCode - 10000;
+        }
+    }
+    
+    if( pZone != NULL )
+        *pZone = nZone;
+
+    return( MapSys );
+}
+
diff --git a/src/tiff/geo_free.c b/src/tiff/geo_free.c
new file mode 100644
index 0000000..a43fcad
--- /dev/null
+++ b/src/tiff/geo_free.c
@@ -0,0 +1,62 @@
+/**********************************************************************
+ *
+ *  geo_free.c  -- Public routines for GEOTIFF GeoKey access.
+ *
+ *    Written By: Niles D. Ritter.
+ *
+ *  copyright (c) 1995   Niles D. Ritter
+ *
+ *  Permission granted to use this software, so long as this copyright
+ *  notice accompanies any products derived therefrom.
+ *
+ **********************************************************************/
+
+#include "geotiff.h"   /* public interface        */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+
+
+/**********************************************************************
+ *
+ *                        Public Routines
+ *
+ **********************************************************************/
+
+/**
+  
+This function deallocates an existing GeoTIFF access handle previously
+created with GTIFNew().  If the handle was
+used to write GeoTIFF keys to the TIFF file, the 
+GTIFWriteKeys() function should be used
+to flush results to the file before calling GTIFFree().  GTIFFree()
+should be called before XTIFFClose() is
+called on the corresponding TIFF file handle.<p>
+
+*/
+
+void GTIFFree(GTIF* gtif)
+{
+    int     i;
+	
+    if (!gtif) return;
+	
+    /* Free parameter arrays */
+    if (gtif->gt_double) _GTIFFree (gtif->gt_double);
+    if (gtif->gt_short) _GTIFFree (gtif->gt_short);
+	
+    /* Free GeoKey arrays */
+    if (gtif->gt_keys)
+    {
+        for (i = 0; i < MAX_KEYS; i++)
+        {
+            if (gtif->gt_keys[i].gk_type == TYPE_ASCII)
+            {
+                _GTIFFree (gtif->gt_keys[i].gk_data);
+            }
+        }
+        _GTIFFree (gtif->gt_keys);
+    }
+    if (gtif->gt_keyindex) _GTIFFree (gtif->gt_keyindex);
+	
+    _GTIFFree (gtif);
+}
diff --git a/src/tiff/geo_get.c b/src/tiff/geo_get.c
new file mode 100644
index 0000000..f027bd3
--- /dev/null
+++ b/src/tiff/geo_get.c
@@ -0,0 +1,176 @@
+/**********************************************************************
+ *
+ *  geo_get.c  -- Public routines for GEOTIFF GeoKey access.
+ *
+ *    Written By: Niles D. Ritter.
+ *
+ *  copyright (c) 1995   Niles D. Ritter
+ *
+ *  Permission granted to use this software, so long as this copyright
+ *  notice accompanies any products derived therefrom.
+ *
+ *  Revision History;
+ *
+ *    20 June, 1995      Niles D. Ritter         New
+ *    3 July,  1995      Greg Martin             Fix strings and index
+ *    6 July,  1995      Niles D. Ritter         Unfix indexing.
+ *
+ **********************************************************************/
+
+#include "geotiff.h"   /* public interface        */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+
+/* return the Header info of this geotiff file */
+
+void GTIFDirectoryInfo(GTIF *gtif, int version[3], int *keycount)
+{
+        if (version)
+        {
+                version[0]  = gtif->gt_version;
+                version[1]  = gtif->gt_rev_major;
+                version[2]  = gtif->gt_rev_minor;
+        }
+        if (keycount) *keycount = gtif->gt_num_keys;
+}
+
+
+int GTIFKeyInfo(GTIF *gtif, geokey_t key, int *size, tagtype_t* type)
+{
+        int index = gtif->gt_keyindex[ key ];
+        GeoKey *keyptr;
+
+        if (!index) return 0;
+
+        keyptr = gtif->gt_keys + index;
+        if (size) *size = (int) keyptr->gk_size;
+        if (type) *type = keyptr->gk_type;
+
+        return keyptr->gk_count;
+}
+
+/** 
+
+This function reads the value of a single GeoKey from a GeoTIFF file.
+
+ at param gtif The geotiff information handle from GTIFNew().
+
+ at param thekey The geokey_t name (such as ProjectedCSTypeGeoKey).
+This must come from the list of legal geokey_t values
+(an enumeration) listed below.
+
+ at param val The <b>val</b> argument is a pointer to the
+variable into which the value should be read.  The type of the variable
+varies depending on the geokey_t given.  While there is no ready mapping
+of geokey_t values onto types, in general code values are of type <i>short</i>,
+citations are strings, and everything else is of type <i>double</i>.  Note
+that pointer's to <i>int</i> should never be passed to GTIFKeyGet() for
+integer values as they will be shorts, and the int's may not be properly
+initialized (and will be grossly wrong on MSB systems).
+
+ at param index Indicates how far into the list of values
+for this geokey to offset. Should normally be zero.
+
+ at param count Indicates how many values
+to read.  At this time all keys except for strings have only one value,
+so <b>index</b> should be zero, and <b>count</b> should be one.
+
+ at return The GTIFKeyGet() function returns the number of values read.  Normally
+this would be one if successful or zero if the key doesn't exist for this
+file.
+
+From geokeys.inc we see the following geokey_t values are possible:<p>
+
+<pre>
+-- 6.2.1 GeoTIFF Configuration Keys --
+
+ValuePair(  GTModelTypeGeoKey,	1024) -- Section 6.3.1.1 Codes       --
+ValuePair(  GTRasterTypeGeoKey,	1025) -- Section 6.3.1.2 Codes       --
+ValuePair(  GTCitationGeoKey,	1026) -- documentation --
+
+-- 6.2.2 Geographic CS Parameter Keys --
+
+ValuePair(  GeographicTypeGeoKey,	2048) -- Section 6.3.2.1 Codes     --
+ValuePair(  GeogCitationGeoKey,	2049) -- documentation             --
+ValuePair(  GeogGeodeticDatumGeoKey,	2050) -- Section 6.3.2.2 Codes     --
+ValuePair(  GeogPrimeMeridianGeoKey,	2051) -- Section 6.3.2.4 codes     --
+ValuePair(  GeogLinearUnitsGeoKey,	2052) -- Section 6.3.1.3 Codes     --
+ValuePair(  GeogLinearUnitSizeGeoKey,	2053) -- meters                    --
+ValuePair(  GeogAngularUnitsGeoKey,	2054) -- Section 6.3.1.4 Codes     --
+ValuePair(  GeogAngularUnitSizeGeoKey,	2055) -- radians                   --
+ValuePair(  GeogEllipsoidGeoKey,	2056) -- Section 6.3.2.3 Codes     --
+ValuePair(  GeogSemiMajorAxisGeoKey,	2057) -- GeogLinearUnits           --
+ValuePair(  GeogSemiMinorAxisGeoKey,	2058) -- GeogLinearUnits           --
+ValuePair(  GeogInvFlatteningGeoKey,	2059) -- ratio                     --
+ValuePair(  GeogAzimuthUnitsGeoKey,	2060) -- Section 6.3.1.4 Codes     --
+ValuePair(  GeogPrimeMeridianLongGeoKey,	2061) -- GeoAngularUnit            --
+
+-- 6.2.3 Projected CS Parameter Keys --
+--    Several keys have been renamed,--
+--    and the deprecated names aliased for backward compatibility --
+
+ValuePair(  ProjectedCSTypeGeoKey,	3072)     -- Section 6.3.3.1 codes   --
+ValuePair(  PCSCitationGeoKey,	3073)     -- documentation           --
+ValuePair(  ProjectionGeoKey,	3074)     -- Section 6.3.3.2 codes   --
+ValuePair(  ProjCoordTransGeoKey,	3075)     -- Section 6.3.3.3 codes   --
+ValuePair(  ProjLinearUnitsGeoKey,	3076)     -- Section 6.3.1.3 codes   --
+ValuePair(  ProjLinearUnitSizeGeoKey,	3077)     -- meters                  --
+ValuePair(  ProjStdParallel1GeoKey,	3078)     -- GeogAngularUnit --
+ValuePair(  ProjStdParallelGeoKey,ProjStdParallel1GeoKey) -- ** alias **   --
+ValuePair(  ProjStdParallel2GeoKey,	3079)     -- GeogAngularUnit --
+ValuePair(  ProjNatOriginLongGeoKey,	3080)     -- GeogAngularUnit --
+ValuePair(  ProjOriginLongGeoKey,ProjNatOriginLongGeoKey) -- ** alias **     --
+ValuePair(  ProjNatOriginLatGeoKey,	3081)     -- GeogAngularUnit --
+ValuePair(  ProjOriginLatGeoKey,ProjNatOriginLatGeoKey)   -- ** alias **     --
+ValuePair(  ProjFalseEastingGeoKey,	3082)     -- ProjLinearUnits --
+ValuePair(  ProjFalseNorthingGeoKey,	3083)     -- ProjLinearUnits --
+ValuePair(  ProjFalseOriginLongGeoKey,	3084)     -- GeogAngularUnit --
+ValuePair(  ProjFalseOriginLatGeoKey,	3085)     -- GeogAngularUnit --
+ValuePair(  ProjFalseOriginEastingGeoKey,	3086)     -- ProjLinearUnits --
+ValuePair(  ProjFalseOriginNorthingGeoKey,	3087)     -- ProjLinearUnits --
+ValuePair(  ProjCenterLongGeoKey,	3088)     -- GeogAngularUnit --
+ValuePair(  ProjCenterLatGeoKey,	3089)     -- GeogAngularUnit --
+ValuePair(  ProjCenterEastingGeoKey,	3090)     -- ProjLinearUnits --
+ValuePair(  ProjCenterNorthingGeoKey,	3091)     -- ProjLinearUnits --
+ValuePair(  ProjScaleAtNatOriginGeoKey,	3092)     -- ratio   --
+ValuePair(  ProjScaleAtOriginGeoKey,ProjScaleAtNatOriginGeoKey)  -- ** alias **   --
+ValuePair(  ProjScaleAtCenterGeoKey,	3093)     -- ratio   --
+ValuePair(  ProjAzimuthAngleGeoKey,	3094)     -- GeogAzimuthUnit --
+ValuePair(  ProjStraightVertPoleLongGeoKey,	3095)     -- GeogAngularUnit --
+
+ 6.2.4 Vertical CS Keys 
+   
+ValuePair(  VerticalCSTypeGeoKey,	4096)  -- Section 6.3.4.1 codes   --
+ValuePair(  VerticalCitationGeoKey,	4097)  -- documentation --
+ValuePair(  VerticalDatumGeoKey,	4098)  -- Section 6.3.4.2 codes   --
+ValuePair(  VerticalUnitsGeoKey,	4099)  -- Section 6.3.1 (.x) codes   --
+</pre>
+*/
+
+int GTIFKeyGet(GTIF *gtif, geokey_t thekey, void *val, int index, int count)
+{
+        int kindex = gtif->gt_keyindex[ thekey ];
+        GeoKey *key;
+        gsize_t size;
+        char *data;
+        tagtype_t type;
+
+        if (!kindex) return 0;
+
+        key = gtif->gt_keys+kindex;
+        if (!count) count = key->gk_count - index;
+        if (count <=0) return 0;
+        if (count > key->gk_count) count = key->gk_count;
+        size = key->gk_size;
+        type = key->gk_type;
+
+        if (count==1 && type==TYPE_SHORT) data = (char *)&key->gk_data;
+        else data = key->gk_data;
+
+        _GTIFmemcpy( val, data + index*size, count*size );
+
+        if (type==TYPE_ASCII)
+           ((char *)val)[count-1] = '\0'; /* replace last char with NULL */
+
+        return count;
+}
diff --git a/src/tiff/geo_keyp.h b/src/tiff/geo_keyp.h
new file mode 100644
index 0000000..140bf40
--- /dev/null
+++ b/src/tiff/geo_keyp.h
@@ -0,0 +1,98 @@
+/**********************************************************************
+ *
+ *  geo_keyp.h - private interface for GeoTIFF geokey tag parsing
+ *
+ *     Written by: Niles D. Ritter
+ *
+ **********************************************************************/
+
+#ifndef __geo_keyp_h_
+#define __geo_keyp_h_
+
+#include <stdlib.h> /* for size_t */
+
+/*
+ * This structure contains the internal program
+ * representation of the key entry.
+ */
+struct GeoKey {
+	int       gk_key;    /* GeoKey ID        */
+	size_t    gk_size;   /* data byte size   */
+	tagtype_t gk_type;   /* TIFF data type   */
+	long      gk_count;  /* number of values */
+	char*     gk_data;   /* pointer to data, or value */
+};
+typedef struct GeoKey GeoKey;
+
+/*
+ *  This structure represents the file-organization of
+ *  the key entry. Note that it assumes that short entries
+ *  are aligned along 2-byte boundaries.
+ */
+struct KeyEntry {
+	pinfo_t ent_key;        /* GeoKey ID            */
+	pinfo_t ent_location;   /* TIFF Tag ID or 0     */
+	pinfo_t ent_count;      /* GeoKey value count   */
+	pinfo_t ent_val_offset; /* value or tag offset  */
+};
+typedef struct KeyEntry KeyEntry;
+
+/*
+ * This is the header of the CoordSystemInfoTag. The 'Version'
+ *  will only change if the CoorSystemInfoTag structure changes;
+ *  The Major Revision will be incremented whenever a new set of
+ *  Keys is added or changed, while the Minor revision will be
+ *  incremented when only the set of Key-values is increased.
+ */
+struct KeyHeader{
+	pinfo_t hdr_version;      /* GeoTIFF Version          */
+	pinfo_t hdr_rev_major;    /* GeoKey Major Revision #  */
+	pinfo_t hdr_rev_minor;    /* GeoKey Minor Revision #  */
+	pinfo_t hdr_num_keys;     /* Number of GeoKeys        */
+};
+typedef struct KeyHeader KeyHeader;
+
+/*
+ * This structure holds temporary data while reading or writing
+ *  the tags.
+ */
+struct TempKeyData {
+    char   *tk_asciiParams;
+    int     tk_asciiParamsLength;
+    int     tk_asciiParamsOffset;
+};
+typedef struct TempKeyData TempKeyData;
+
+
+struct gtiff {
+   tiff_t*    gt_tif;      /* TIFF file descriptor  */
+   TIFFMethod gt_methods;  /* TIFF i/o methods      */
+   int        gt_flags;    /* file flags            */
+   
+   pinfo_t    gt_version;  /* GeoTIFF Version       */
+   pinfo_t    gt_rev_major;/* GeoKey Key Revision   */
+   pinfo_t    gt_rev_minor;/* GeoKey Code Revision  */
+   
+   int        gt_num_keys; /* number of keys        */
+   GeoKey*    gt_keys;     /* array of keys         */
+   int*       gt_keyindex; /* index of a key, if set*/
+   int        gt_keymin;   /* smallest key set      */
+   int        gt_keymax;   /* largest key set       */
+   
+   pinfo_t*   gt_short;    /* array of SHORT vals   */
+   double*    gt_double;   /* array of DOUBLE vals  */
+   int        gt_nshorts;  /* number of SHORT vals  */
+   int        gt_ndoubles; /* number of DOUBLE vals */
+};  
+
+typedef enum {
+	FLAG_FILE_OPEN=1,
+	FLAG_FILE_MODIFIED=2
+} gtiff_flags;
+
+#define MAX_KEYINDEX 65535   /* largest possible key    */
+#define MAX_KEYS 100         /* maximum keys in a file  */
+#define MAX_VALUES 1000      /* maximum values in a tag */
+
+#endif /* __geo_keyp_h_ */
+
diff --git a/src/tiff/geo_names.c b/src/tiff/geo_names.c
new file mode 100644
index 0000000..de58ca2
--- /dev/null
+++ b/src/tiff/geo_names.c
@@ -0,0 +1,175 @@
+/*
+ * geo_names.c
+ *
+ *  This encapsulates all of the value-naming mechanism of 
+ *  libgeotiff. 
+ *
+ *  Written By: Niles Ritter
+ */
+
+#include "geotiffio.h"
+#include "geonames.h"
+#include "geo_tiffp.h" /* for tag names */
+
+static KeyInfo _formatInfo[] =  {
+   {TYPE_BYTE,    "Byte"},
+   {TYPE_SHORT,   "Short"},
+   {TYPE_LONG,    "Long"},
+   {TYPE_RATIONAL,"Rational"},
+   {TYPE_ASCII,   "Ascii"},
+   {TYPE_FLOAT,   "Float"},
+   {TYPE_DOUBLE,  "Double"},
+   {TYPE_SBYTE,   "SignedByte"},
+   {TYPE_SSHORT,  "SignedShort"},
+   {TYPE_SLONG,  "SignedLong"},
+   {TYPE_UNKNOWN, "Unknown"},
+    END_LIST
+};
+
+static KeyInfo _tagInfo[] =  {
+    {GTIFF_PIXELSCALE,  "ModelPixelScaleTag"},
+    {GTIFF_TRANSMATRIX, "ModelTransformationTag"},
+    {GTIFF_TIEPOINTS,   "ModelTiepointTag"},
+     /* This alias maps the Intergraph symbol to the current tag */
+    {GTIFF_TRANSMATRIX, "IntergraphMatrixTag"},
+    END_LIST
+};
+
+static char *FindName(KeyInfo *info,int key)
+{
+   static char errmsg[80];
+   
+   while (info->ki_key>=0 && info->ki_key != key) info++;
+
+   if (info->ki_key<0)
+   {
+	   sprintf(errmsg,"Unknown-%d", key );
+	   return errmsg;
+   }
+   return info->ki_name;
+}
+
+char *GTIFKeyName(geokey_t key)
+{
+   return FindName( &_keyInfo[0],key);
+}
+
+char *GTIFTypeName(tagtype_t type)
+{
+   return FindName( &_formatInfo[0],type);
+}
+
+char *GTIFTagName(int tag)
+{
+   return FindName( &_tagInfo[0],tag);
+}
+
+char *GTIFValueName(geokey_t key, int value)
+{
+   KeyInfo *info;
+   
+   switch (key)
+   {
+	/* All codes using linear/angular/whatever units */
+	case GeogLinearUnitsGeoKey: 
+	case ProjLinearUnitsGeoKey: 
+	case GeogAngularUnitsGeoKey: 
+	case GeogAzimuthUnitsGeoKey: 
+		                      info=_geounitsValue; break;
+
+   	/* put other key-dependent lists here */
+	case GTModelTypeGeoKey:       info=_modeltypeValue; break;
+	case GTRasterTypeGeoKey:      info=_rastertypeValue; break;
+	case GeographicTypeGeoKey:    info=_geographicValue; break;
+	case GeogGeodeticDatumGeoKey: info=_geodeticdatumValue; break;
+	case GeogEllipsoidGeoKey:     info=_ellipsoidValue; break;
+	case GeogPrimeMeridianGeoKey: info=_primemeridianValue; break;
+	case ProjectedCSTypeGeoKey:   info=_pcstypeValue; break;
+	case ProjectionGeoKey:        info=_projectionValue; break;
+	case ProjCoordTransGeoKey:    info=_coordtransValue; break;
+	case VerticalCSTypeGeoKey:    info=_vertcstypeValue; break;
+	case VerticalDatumGeoKey:     info=_vdatumValue; break;
+
+	/* And if all else fails... */
+   	default:                      info = _csdefaultValue;break;
+   }
+   
+   return FindName( info,value);
+}
+
+/* 
+ * Inverse Utilities (name->code) 
+ */
+
+
+static int FindCode(KeyInfo *info,char *key)
+{
+   while (info->ki_key>=0 && strcmp(info->ki_name,key) ) info++;
+
+   if (info->ki_key<0)
+   {
+	/* not a registered key; might be generic code */
+	if (!strncmp(key,"Unknown-",8))
+	{
+		int code=-1;
+		sscanf(key,"Unknown-%d",&code);
+		return code;
+	}
+	else return -1;
+   }
+   return info->ki_key;
+}
+
+int GTIFKeyCode(char *key)
+{
+   return FindCode( &_keyInfo[0],key);
+}
+
+int GTIFTypeCode(char *type)
+{
+   return FindCode( &_formatInfo[0],type);
+}
+
+int GTIFTagCode(char *tag)
+{
+   return FindCode( &_tagInfo[0],tag);
+}
+
+
+/*
+ *  The key must be determined with GTIFKeyCode() before
+ *  the name can be encoded.
+ */
+int GTIFValueCode(geokey_t key, char *name)
+{
+   KeyInfo *info;
+   
+   switch (key)
+   {
+	/* All codes using linear/angular/whatever units */
+	case GeogLinearUnitsGeoKey: 
+	case ProjLinearUnitsGeoKey: 
+	case GeogAngularUnitsGeoKey: 
+	case GeogAzimuthUnitsGeoKey: 
+		                      info=_geounitsValue; break;
+
+   	/* put other key-dependent lists here */
+	case GTModelTypeGeoKey:       info=_modeltypeValue; break;
+	case GTRasterTypeGeoKey:      info=_rastertypeValue; break;
+	case GeographicTypeGeoKey:    info=_geographicValue; break;
+	case GeogGeodeticDatumGeoKey: info=_geodeticdatumValue; break;
+	case GeogEllipsoidGeoKey:     info=_ellipsoidValue; break;
+	case GeogPrimeMeridianGeoKey: info=_primemeridianValue; break;
+	case ProjectedCSTypeGeoKey:   info=_pcstypeValue; break;
+	case ProjectionGeoKey:        info=_projectionValue; break;
+	case ProjCoordTransGeoKey:    info=_coordtransValue; break;
+	case VerticalCSTypeGeoKey:    info=_vertcstypeValue; break;
+	case VerticalDatumGeoKey:     info=_vdatumValue; break;
+
+	/* And if all else fails... */
+   	default:                      info = _csdefaultValue;break;
+   }
+   
+   return FindCode( info,name);
+}
+
diff --git a/src/tiff/geo_new.c b/src/tiff/geo_new.c
new file mode 100644
index 0000000..4fe58ab
--- /dev/null
+++ b/src/tiff/geo_new.c
@@ -0,0 +1,224 @@
+/**********************************************************************
+ *
+ *  geo_new.c  -- Public routines for GEOTIFF GeoKey access.
+ *
+ *    Written By: Niles D. Ritter.
+ *
+ *  copyright (c) 1995   Niles D. Ritter
+ *
+ *  Permission granted to use this software, so long as this copyright
+ *  notice accompanies any products derived therefrom.
+ *
+ *    20 June, 1995      Niles D. Ritter         New
+ *    7 July,  1995      Greg Martin             Fix index
+ *
+ * $Log: geo_new.c,v $
+ * Revision 1.2  2004/03/19 11:51:23  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.9  2003/06/19 20:04:11  warmerda
+ * fix memory underwrite if ascii parameter string is zero length
+ *
+ * Revision 1.8  2003/06/05 14:20:45  warmerda
+ * cosmetic formatting changes
+ *
+ **********************************************************************/
+
+#include "geotiffio.h"   /* public interface        */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+
+/* private local routines */
+static int ReadKey(GTIF* gt, TempKeyData* tempData,
+                   KeyEntry* entptr, GeoKey* keyptr);
+
+
+/**********************************************************************
+ *
+ *                        Public Routines
+ *
+ **********************************************************************/
+
+
+/**
+ * Given an open TIFF file, look for GTIF keys and 
+ *  values and return GTIF structure.
+
+This function creates a GeoTIFF information interpretation handle
+(GTIF *) based on a passed in TIFF handle originally from 
+XTIFFOpen().  Even though the argument 
+(<b>tif</b>) is shown as type <tt>void *</tt>, it is really normally
+of type <tt>TIFF *</tt>.<p>
+
+The returned GTIF handle can be used to read or write GeoTIFF tags 
+using the various GTIF functions.  The handle should be destroyed using
+GTIFFree() before the file is closed with TIFFClose().<p>
+
+If the file accessed has no GeoTIFF keys, an valid (but empty) GTIF is
+still returned.  GTIFNew() is used both for existing files being read, and
+for new TIFF files that will have GeoTIFF tags written to them.<p>
+
+ */
+ 
+GTIF* GTIFNew(void *tif)
+{
+    GTIF* gt=(GTIF*)0;
+    int count,bufcount,index;
+    GeoKey *keyptr;
+    pinfo_t *data;
+    KeyEntry *entptr;
+    KeyHeader *header;
+    TempKeyData tempData;
+	
+    gt = (GTIF*)_GTIFcalloc( sizeof(GTIF));
+    if (!gt) goto failure;	
+	
+    /* install TIFF file and I/O methods */
+    gt->gt_tif = (tiff_t *)tif;
+    _GTIFSetDefaultTIFF(&gt->gt_methods);
+
+    tempData.tk_asciiParams = 0;
+    tempData.tk_asciiParamsLength = 0;
+    tempData.tk_asciiParamsOffset = 0;
+	
+    /* since this is an array, GTIF will allocate the memory */
+    if (!(gt->gt_methods.get)(tif, GTIFF_GEOKEYDIRECTORY, &gt->gt_nshorts, &data ))
+    {
+        /* No ProjectionInfo, create a blank one */
+        data=(pinfo_t*)_GTIFcalloc((4+MAX_VALUES)*sizeof(pinfo_t));
+        if (!data) goto failure;	
+        header = (KeyHeader *)data;
+        header->hdr_version = GvCurrentVersion;
+        header->hdr_rev_major = GvCurrentRevision;
+        header->hdr_rev_minor = GvCurrentMinorRev;
+        gt->gt_nshorts=sizeof(KeyHeader)/sizeof(pinfo_t);
+    }
+    gt->gt_short = data;
+    header = (KeyHeader *)data;
+	
+    if (header->hdr_version > GvCurrentVersion) goto failure;
+    if (header->hdr_rev_major > GvCurrentRevision)
+    {
+        /* issue warning */
+    }
+	
+    /* If we got here, then the geokey can be parsed */
+    count = header->hdr_num_keys;
+    gt->gt_num_keys = count;
+    gt->gt_version  = header->hdr_version;
+    gt->gt_rev_major  = header->hdr_rev_major;
+    gt->gt_rev_minor  = header->hdr_rev_minor;
+
+    bufcount = count+MAX_KEYS; /* allow for expansion */
+
+    /* Get the PARAMS Tags, if any */
+    if (!(gt->gt_methods.get)(tif, GTIFF_DOUBLEPARAMS,
+                              &gt->gt_ndoubles, &gt->gt_double ))
+    {
+        gt->gt_double=(double*)_GTIFcalloc(MAX_VALUES*sizeof(double));
+        if (!gt->gt_double) goto failure;	
+    }
+    if (!(gt->gt_methods.get)(tif, GTIFF_ASCIIPARAMS,
+                              &tempData.tk_asciiParamsLength,
+                              &tempData.tk_asciiParams ))
+    {
+        tempData.tk_asciiParams         = 0;
+        tempData.tk_asciiParamsLength   = 0;
+    }
+    else
+    {
+        /* last NULL doesn't count; "|" used for delimiter */
+        --tempData.tk_asciiParamsLength;
+    }
+
+    /* allocate space for GeoKey array and its index */
+    gt->gt_keys = (GeoKey *)_GTIFcalloc( sizeof(GeoKey)*bufcount);
+    if (!gt->gt_keys) goto failure;
+    gt->gt_keyindex = (int *)_GTIFcalloc( sizeof(int)*(MAX_KEYINDEX+1));
+    if (!gt->gt_keyindex) goto failure;
+	
+    /*  Loop to get all GeoKeys */
+    entptr = ((KeyEntry *)data) + 1;
+    keyptr = gt->gt_keys;
+    gt->gt_keymin = MAX_KEYINDEX;
+    gt->gt_keymax = 0;
+    for (index=1; index<=count; index++,entptr++)
+    {
+        if (!ReadKey(gt, &tempData, entptr, ++keyptr))
+            goto failure;
+			
+        /* Set up the index (start at 1, since 0=unset) */
+        gt->gt_keyindex[entptr->ent_key] = index;		
+    }
+
+    if( tempData.tk_asciiParams != NULL )
+        _GTIFFree( tempData.tk_asciiParams );
+	
+    return gt;
+	
+  failure:
+    /* Notify of error */
+    GTIFFree (gt);
+    return (GTIF *)0;
+}
+
+/**********************************************************************
+ *
+ *                        Private Routines
+ *
+ **********************************************************************/
+
+/*
+ * Given KeyEntry, read in the GeoKey value location and set up
+ *  the Key structure, returning 0 if failure.
+ */
+
+static int ReadKey(GTIF* gt, TempKeyData* tempData,
+                   KeyEntry* entptr, GeoKey* keyptr)
+{
+    int offset,count;
+	
+    keyptr->gk_key = entptr->ent_key;
+    keyptr->gk_count = entptr->ent_count;
+    count = entptr->ent_count;
+    offset = entptr->ent_val_offset;
+    if (gt->gt_keymin > keyptr->gk_key)  gt->gt_keymin=keyptr->gk_key;
+    if (gt->gt_keymax < keyptr->gk_key)  gt->gt_keymax=keyptr->gk_key;
+	
+    if (entptr->ent_location)
+        keyptr->gk_type = (gt->gt_methods.type)(gt->gt_tif,entptr->ent_location);
+    else
+        keyptr->gk_type = (gt->gt_methods.type)(gt->gt_tif,GTIFF_GEOKEYDIRECTORY);
+	  
+    switch (entptr->ent_location)
+    {
+        case GTIFF_LOCAL:
+            /* store value into data value */
+            *(pinfo_t *)(&keyptr->gk_data) = entptr->ent_val_offset;
+            break;
+        case GTIFF_GEOKEYDIRECTORY:
+            keyptr->gk_data = (char *)(gt->gt_short+offset);
+            if (gt->gt_nshorts < offset+count)
+                gt->gt_nshorts = offset+count;
+            break;
+        case GTIFF_DOUBLEPARAMS:
+            keyptr->gk_data = (char *)(gt->gt_double+offset);
+            if (gt->gt_ndoubles < offset+count)
+                gt->gt_ndoubles = offset+count;
+            break;
+        case GTIFF_ASCIIPARAMS:
+            if (offset + count > tempData->tk_asciiParamsLength)
+                return (0);
+
+            keyptr->gk_data = (char *) _GTIFcalloc (MAX(1,count));
+            _GTIFmemcpy (keyptr->gk_data,
+                         tempData->tk_asciiParams + offset, count);
+            keyptr->gk_data[MAX(0,count-1)] = '\0';
+            break;
+        default:
+            return 0; /* failure */
+    }
+    keyptr->gk_size = _gtiff_size[keyptr->gk_type];
+	
+    return 1; /* success */
+}
diff --git a/src/tiff/geo_normalize.c b/src/tiff/geo_normalize.c
new file mode 100644
index 0000000..1c6645c
--- /dev/null
+++ b/src/tiff/geo_normalize.c
@@ -0,0 +1,2330 @@
+/******************************************************************************
+ * $Id: geo_normalize.c,v 1.3 2004/03/19 11:51:23 lubia Exp $
+ *
+ * Project:  libgeotiff
+ * Purpose:  Code to normalize PCS and other composite codes in a GeoTIFF file.
+ * Author:   Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: geo_normalize.c,v $
+ * Revision 1.3  2004/03/19 11:51:23  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.36  2003/01/28 18:31:58  warmerda
+ * Default dfInDegrees in GTIFAngleToDD().
+ *
+ * Revision 1.35  2003/01/15 04:39:16  warmerda
+ * Added GTIFDeaccessCSV
+ *
+ * Revision 1.34  2003/01/15 03:37:40  warmerda
+ * added GTIFFreeMemory()
+ *
+ * Revision 1.33  2002/12/05 19:21:01  warmerda
+ * fixed dfInDegrees to actually be in degrees, not radians!
+ *
+ * Revision 1.32  2002/11/30 16:01:11  warmerda
+ * fixed some problems in GTIFGetUOMAngleInfo
+ *
+ * Revision 1.31  2002/11/30 15:44:35  warmerda
+ * fixed GetCTParms EPSG code mappings
+ *
+ * Revision 1.30  2002/11/28 22:27:42  warmerda
+ * preliminary upgrade to EPSG 6.2.2 tables
+ *
+ * Revision 1.29  2002/06/19 03:51:15  warmerda
+ * migrated cpl_csv.h into cpl_serv.h
+ *
+ * Revision 1.28  2002/01/03 21:28:25  warmerda
+ * call CSVDeaccess(NULL) at end of GTIFPrintDefn()
+ *
+ * Revision 1.27  2001/04/17 13:41:10  warmerda
+ * fix memory leaks in GTIFPrintDefn()
+ *
+ * Revision 1.26  2001/04/17 13:23:07  warmerda
+ * added support for reading custom ellipsoid definitions
+ *
+ * Revision 1.25  2001/03/05 04:55:26  warmerda
+ * CVSDeaccess at end of GTIFGetDefn to avoid file leak
+ *
+ * Revision 1.24  2001/03/05 03:26:29  warmerda
+ * fixed memory leaks in GTIFPrintDefn()
+ *
+ * Revision 1.23  2001/02/23 13:49:48  warmerda
+ * Fixed GTIFPrintDefn() to use fprintf( fp ), instead of printf().
+ *
+ * Revision 1.22  2000/10/13 14:30:57  warmerda
+ * fixed LCC parm order when parameters read directly from geotiff file
+ *
+ * Revision 1.21  2000/09/15 19:30:14  warmerda
+ * report units of linear proj parms
+ *
+ * Revision 1.20  2000/09/15 18:21:07  warmerda
+ * Fixed order of parameters for LCC 2SP.  When parameters
+ * were read from EPSG CSV files the standard parallels and origin
+ * were mixed up.  This affects alot of state plane zones!
+ *
+ * Revision 1.19  2000/06/09 14:05:43  warmerda
+ * added default knowledge of NAD27/NAD83/WGS72/WGS84
+ *
+ * Revision 1.18  1999/12/10 21:28:12  warmerda
+ * fixed Stereographic to look for ProjCenterLat/Long
+ *
+ * Revision 1.17  1999/12/10 20:06:58  warmerda
+ * fixed up scale geokey used for a couple of projections
+ *
+ * Revision 1.16  1999/12/10 19:50:21  warmerda
+ * Added EquidistantConic support, fixed return of StdParallel2GeoKey for
+ * LCC2, and Albers.
+ *
+ * Revision 1.15  1999/12/10 19:39:26  warmerda
+ * Fixed bug setting the false northing for files with
+ * ProjCenterNorthingGeoKey set in GTIFGetDefn().
+ *
+ * Revision 1.14  1999/09/17 14:58:37  warmerda
+ * Added ProjRectifiedGridAngleGeoKey(3096) and support for it's
+ * use with Oblique Mercator in geo_normalize.c.
+ *
+ * Revision 1.13  1999/09/17 00:55:26  warmerda
+ * added GTIFGetUOMAngleInfo(), and UOMAngle in GTIFDefn
+ *
+ * Revision 1.12  1999/09/15 18:51:31  warmerda
+ * Map 9808 to TM South Oriented, not TM Modified Alaska.
+ *
+ * Revision 1.11  1999/09/15 16:44:06  warmerda
+ * Change meter to metre to match EPSG database in GTIFGetUOMLengthInfo()
+ * shortcut.
+ *
+ * Revision 1.10  1999/09/15 16:35:15  warmerda
+ * Fixed the fractions of second handling properly in GTIFAngleStringToDD().
+ *
+ * Revision 1.9  1999/09/15 14:24:17  warmerda
+ * Fixed serious bug in geo_normalize.c with translation of
+ * DD.MMSSsss values.  Return value was seriously off if any
+ * fraction of a second was included in the string.
+ *
+ * Revision 1.8  1999/07/13 03:12:52  warmerda
+ * Make scale a parameter of CT_Stereographic.
+ *
+ * Revision 1.7  1999/05/04 03:13:22  warmerda
+ * fixed a serious bug in parsing DMSmmss.sss values, and a bug in forming DMS strings
+ *
+ * Revision 1.6  1999/05/03 17:50:31  warmerda
+ * avoid warnings on IRIX
+ *
+ * Revision 1.5  1999/04/28 20:04:51  warmerda
+ * Added doxygen style documentation.
+ * Use GTIFPCSToMapSys() and related functions to partially normalize
+ * projections when we don't have the CSV files.
+ *
+ * Revision 1.4  1999/03/18 21:34:59  geotiff
+ * added GTIFDecToDMS
+ *
+ * Revision 1.3  1999/03/17 19:53:15  geotiff
+ * sys includes moved to cpl_serv.h
+ *
+ * Revision 1.2  1999/03/10 18:24:06  geotiff
+ * corrected to use int'
+ *
+ * Revision 1.1  1999/03/09 15:57:04  geotiff
+ * New
+ *
+ * Revision 1.4  1999/03/03 02:29:38  warmerda
+ * Define PI if not already defined.
+ *
+ * Revision 1.3  1999/03/02 21:10:57  warmerda
+ * added lots of projections
+ *
+ * Revision 1.2  1999/02/24 16:24:15  warmerda
+ * Continuing to evolve
+ *
+ * Revision 1.1  1999/02/22 18:51:08  warmerda
+ * New
+ *
+ */
+ 
+#include "cpl_serv.h"
+#include "geo_tiffp.h"
+#include "geovalues.h"
+#include "geo_normalize.h"
+
+#ifndef KvUserDefined
+#  define KvUserDefined 32767
+#endif
+
+#ifndef PI
+#  define PI 3.14159265358979323846
+#endif
+
+/* EPSG Codes for projection parameters.  Unfortunately, these bear no
+   relationship to the GeoTIFF codes even though the names are so similar. */
+
+#define EPSGNatOriginLat         8801
+#define EPSGNatOriginLong        8802
+#define EPSGNatOriginScaleFactor 8805
+#define EPSGFalseEasting         8806
+#define EPSGFalseNorthing        8807
+#define EPSGProjCenterLat        8811
+#define EPSGProjCenterLong       8812
+#define EPSGAzimuth              8813
+#define EPSGAngleRectifiedToSkewedGrid 8814
+#define EPSGInitialLineScaleFactor 8815
+#define EPSGProjCenterEasting    8816
+#define EPSGProjCenterNorthing   8817
+#define EPSGPseudoStdParallelLat 8818
+#define EPSGPseudoStdParallelScaleFactor 8819
+#define EPSGFalseOriginLat       8821
+#define EPSGFalseOriginLong      8822
+#define EPSGStdParallel1Lat      8823
+#define EPSGStdParallel2Lat      8824
+#define EPSGFalseOriginEasting   8826
+#define EPSGFalseOriginNorthing  8827
+#define EPSGSphericalOriginLat   8828
+#define EPSGSphericalOriginLong  8829
+#define EPSGInitialLongitude     8830
+#define EPSGZoneWidth            8831
+
+/************************************************************************/
+/*                           GTIFGetPCSInfo()                           */
+/************************************************************************/
+
+int GTIFGetPCSInfo( int nPCSCode, char **ppszEPSGName, 
+                    short *pnProjOp, short *pnUOMLengthCode, 
+                    short *pnGeogCS )
+
+{
+    char	**papszRecord;
+    char	szSearchKey[24];
+    const char	*pszFilename = CSVFilename( "pcs.csv" );
+    
+/* -------------------------------------------------------------------- */
+/*      Search the units database for this unit.  If we don't find      */
+/*      it return failure.                                              */
+/* -------------------------------------------------------------------- */
+    sprintf( szSearchKey, "%d", nPCSCode );
+    papszRecord = CSVScanFileByName( pszFilename, "COORD_REF_SYS_CODE",
+                                     szSearchKey, CC_Integer );
+
+    if( papszRecord == NULL )
+        return FALSE;
+
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszEPSGName != NULL )
+    {
+        *ppszEPSGName =
+            CPLStrdup( CSLGetField( papszRecord,
+                                    CSVGetFileFieldId(pszFilename,
+                                                      "COORD_REF_SYS_NAME") ));
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the UOM Length code, if requested.                          */
+/* -------------------------------------------------------------------- */
+    if( pnUOMLengthCode != NULL )
+    {
+        const char	*pszValue;
+
+        pszValue =
+            CSLGetField( papszRecord,
+                         CSVGetFileFieldId(pszFilename,"UOM_CODE"));
+        if( atoi(pszValue) > 0 )
+            *pnUOMLengthCode = atoi(pszValue);
+        else
+            *pnUOMLengthCode = KvUserDefined;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the UOM Length code, if requested.                          */
+/* -------------------------------------------------------------------- */
+    if( pnProjOp != NULL )
+    {
+        const char	*pszValue;
+
+        pszValue =
+            CSLGetField( papszRecord,
+                         CSVGetFileFieldId(pszFilename,"COORD_OP_CODE"));
+        if( atoi(pszValue) > 0 )
+            *pnProjOp = atoi(pszValue);
+        else
+            *pnUOMLengthCode = KvUserDefined;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the GeogCS (Datum with PM) code, if requested.		*/
+/* -------------------------------------------------------------------- */
+    if( pnGeogCS != NULL )
+    {
+        const char	*pszValue;
+
+        pszValue =
+            CSLGetField( papszRecord,
+                         CSVGetFileFieldId(pszFilename,"SOURCE_GEOGCRS_CODE"));
+        if( atoi(pszValue) > 0 )
+            *pnGeogCS = atoi(pszValue);
+        else
+            *pnGeogCS = KvUserDefined;
+    }
+
+    return TRUE;
+}
+
+/************************************************************************/
+/*                           GTIFAngleToDD()                            */
+/*                                                                      */
+/*      Convert a numeric angle to decimal degress.                     */
+/************************************************************************/
+
+double GTIFAngleToDD( double dfAngle, int nUOMAngle )
+
+{
+    if( nUOMAngle == 9110 )		/* DDD.MMSSsss */
+    {
+        char	szAngleString[32];
+
+        sprintf( szAngleString, "%12.7f", dfAngle );
+        dfAngle = GTIFAngleStringToDD( szAngleString, nUOMAngle );
+    }
+    else
+    {
+        double		dfInDegrees = 1.0;
+        
+        GTIFGetUOMAngleInfo( nUOMAngle, NULL, &dfInDegrees );
+        dfAngle = dfAngle * dfInDegrees;
+    }
+
+    return( dfAngle );
+}
+
+/************************************************************************/
+/*                        GTIFAngleStringToDD()                         */
+/*                                                                      */
+/*      Convert an angle in the specified units to decimal degrees.     */
+/************************************************************************/
+
+double GTIFAngleStringToDD( const char * pszAngle, int nUOMAngle )
+
+{
+    double	dfAngle;
+    
+    if( nUOMAngle == 9110 )		/* DDD.MMSSsss */
+    {
+        char	*pszDecimal;
+        
+        dfAngle = ABS(atoi(pszAngle));
+        pszDecimal = strchr(pszAngle,'.');
+        if( pszDecimal != NULL && strlen(pszDecimal) > 1 )
+        {
+            char	szMinutes[3];
+            char	szSeconds[64];
+
+            szMinutes[0] = pszDecimal[1];
+            if( pszDecimal[2] >= '0' && pszDecimal[2] <= '9' )
+                szMinutes[1] = pszDecimal[2];
+            else
+                szMinutes[1] = '0';
+            
+            szMinutes[2] = '\0';
+            dfAngle += atoi(szMinutes) / 60.0;
+
+            if( strlen(pszDecimal) > 3 )
+            {
+                szSeconds[0] = pszDecimal[3];
+                if( pszDecimal[4] >= '0' && pszDecimal[4] <= '9' )
+                {
+                    szSeconds[1] = pszDecimal[4];
+                    szSeconds[2] = '.';
+                    strcpy( szSeconds+3, pszDecimal + 5 );
+                }
+                else
+                {
+                    szSeconds[1] = '0';
+                    szSeconds[2] = '\0';
+                }
+                dfAngle += atof(szSeconds) / 3600.0;
+            }
+        }
+
+        if( pszAngle[0] == '-' )
+            dfAngle *= -1;
+    }
+    else if( nUOMAngle == 9105 || nUOMAngle == 9106 )	/* grad */
+    {
+        dfAngle = 180 * (atof(pszAngle ) / 200);
+    }
+    else if( nUOMAngle == 9101 )			/* radians */
+    {
+        dfAngle = 180 * (atof(pszAngle ) / PI);
+    }
+    else if( nUOMAngle == 9103 )			/* arc-minute */
+    {
+        dfAngle = atof(pszAngle) / 60;
+    }
+    else if( nUOMAngle == 9104 )			/* arc-second */
+    {
+        dfAngle = atof(pszAngle) / 3600;
+    }
+    else /* decimal degrees ... some cases missing but seeminly never used */
+    {
+        CPLAssert( nUOMAngle == 9102 || nUOMAngle == KvUserDefined
+                   || nUOMAngle == 0 );
+        
+        dfAngle = atof(pszAngle );
+    }
+
+    return( dfAngle );
+}
+
+/************************************************************************/
+/*                           GTIFGetGCSInfo()                           */
+/*                                                                      */
+/*      Fetch the datum, and prime meridian related to a particular     */
+/*      GCS.                                                            */
+/************************************************************************/
+
+int GTIFGetGCSInfo( int nGCSCode, char ** ppszName,
+                    short * pnDatum, short * pnPM, short *pnUOMAngle )
+
+{
+    char	szSearchKey[24];
+    int		nDatum, nPM, nUOMAngle;
+
+/* -------------------------------------------------------------------- */
+/*      Search the database for the corresponding datum code.           */
+/* -------------------------------------------------------------------- */
+    sprintf( szSearchKey, "%d", nGCSCode );
+
+    nDatum = atoi(CSVGetField( CSVFilename("gcs.csv" ),
+                               "COORD_REF_SYS_CODE", szSearchKey, CC_Integer,
+                               "DATUM_CODE" ) );
+
+/* -------------------------------------------------------------------- */
+/*      Handle some "well known" GCS codes directly if the table        */
+/*      wasn't found.                                                   */
+/* -------------------------------------------------------------------- */
+    if( nDatum < 1 )
+    {
+        const char * pszName = NULL;
+        nPM = PM_Greenwich;
+        nUOMAngle = Angular_DMS_Hemisphere; 
+        if( nGCSCode == GCS_NAD27 )
+        {
+            nDatum = Datum_North_American_Datum_1927;
+            pszName = "NAD27";
+        }
+        else if( nGCSCode == GCS_NAD83 )
+        {
+            nDatum = Datum_North_American_Datum_1983;
+            pszName = "NAD83";
+        }
+        else if( nGCSCode == GCS_WGS_84 )
+        {
+            nDatum = Datum_WGS84;
+            pszName = "WGS 84";
+        }
+        else if( nGCSCode == GCS_WGS_72 )
+        {
+            nDatum = Datum_WGS72;
+            pszName = "WGS 82";
+        }
+        else
+            return FALSE;
+
+        if( ppszName != NULL )
+            *ppszName = CPLStrdup( pszName );
+        if( pnDatum != NULL )
+            *pnDatum = nDatum;
+        if( pnPM != NULL )
+            *pnPM = nPM;
+        if( pnUOMAngle != NULL )
+            *pnUOMAngle = nUOMAngle;
+
+        return TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the PM.                                                     */
+/* -------------------------------------------------------------------- */
+    if( pnDatum != NULL )
+        *pnDatum = nDatum;
+    
+    nPM = atoi(CSVGetField( CSVFilename("gcs.csv" ),
+                            "COORD_REF_SYS_CODE", szSearchKey, CC_Integer,
+                            "PRIME_MERIDIAN_CODE" ) );
+
+    if( nPM < 1 )
+        return FALSE;
+
+    if( pnPM != NULL )
+        *pnPM = nPM;
+
+/* -------------------------------------------------------------------- */
+/*      Get the angular units.                                          */
+/* -------------------------------------------------------------------- */
+    nUOMAngle = atoi(CSVGetField( CSVFilename("gcs.csv" ),
+                                  "COORD_REF_SYS_CODE",szSearchKey, CC_Integer,
+                                  "UOM_CODE" ) );
+
+    if( nUOMAngle < 1 )
+        return FALSE;
+
+    if( pnUOMAngle != NULL )
+        *pnUOMAngle = nUOMAngle;
+
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszName != NULL )
+        *ppszName =
+            CPLStrdup(CSVGetField( CSVFilename("gcs.csv" ),
+                                   "COORD_REF_SYS_CODE",szSearchKey,CC_Integer,
+                                   "COORD_REF_SYS_NAME" ));
+    
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                        GTIFGetEllipsoidInfo()                        */
+/*                                                                      */
+/*      Fetch info about an ellipsoid.  Axes are always returned in     */
+/*      meters.  SemiMajor computed based on inverse flattening         */
+/*      where that is provided.                                         */
+/************************************************************************/
+
+int GTIFGetEllipsoidInfo( int nEllipseCode, char ** ppszName,
+                          double * pdfSemiMajor, double * pdfSemiMinor )
+
+{
+    char	szSearchKey[24];
+    double	dfSemiMajor, dfToMeters = 1.0;
+    int		nUOMLength;
+    
+/* -------------------------------------------------------------------- */
+/*      Get the semi major axis.                                        */
+/* -------------------------------------------------------------------- */
+    sprintf( szSearchKey, "%d", nEllipseCode );
+
+    dfSemiMajor =
+        atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
+                          "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+                          "SEMI_MAJOR_AXIS" ) );
+
+/* -------------------------------------------------------------------- */
+/*      Try some well known ellipsoids.                                 */
+/* -------------------------------------------------------------------- */
+    if( dfSemiMajor == 0.0 )
+    {
+        double     dfInvFlattening, dfSemiMinor;
+        const char *pszName = NULL;
+        
+        if( nEllipseCode == Ellipse_Clarke_1866 )
+        {
+            pszName = "Clarke 1866";
+            dfSemiMajor = 6378206.4;
+            dfSemiMinor = 6356583.8;
+            dfInvFlattening = 0.0;
+        }
+        else if( nEllipseCode == Ellipse_GRS_1980 )
+        {
+            pszName = "GRS 1980";
+            dfSemiMajor = 6378137.0;
+            dfSemiMinor = 0.0;
+            dfInvFlattening = 298.257222101;
+        }
+        else if( nEllipseCode == Ellipse_WGS_84 )
+        {
+            pszName = "WGS 84";
+            dfSemiMajor = 6378137.0;
+            dfSemiMinor = 0.0;
+            dfInvFlattening = 298.257223563;
+        }
+        else if( nEllipseCode == 7043 )
+        {
+            pszName = "WGS 72";
+            dfSemiMajor = 6378135.0;
+            dfSemiMinor = 0.0;
+            dfInvFlattening = 298.26;
+        }
+        else
+            return FALSE;
+
+        if( dfSemiMinor == 0.0 )
+            dfSemiMinor = dfSemiMajor * (1 - 1.0/dfInvFlattening);
+
+        if( pdfSemiMinor != NULL )
+            *pdfSemiMinor = dfSemiMinor;
+        if( pdfSemiMajor != NULL )
+            *pdfSemiMajor = dfSemiMajor;
+        if( ppszName != NULL )
+            *ppszName = CPLStrdup( pszName );
+
+        return TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*	Get the translation factor into meters.				*/
+/* -------------------------------------------------------------------- */
+    nUOMLength = atoi(CSVGetField( CSVFilename("ellipsoid.csv" ),
+                                   "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+                                   "UOM_CODE" ));
+    GTIFGetUOMLengthInfo( nUOMLength, NULL, &dfToMeters );
+
+    dfSemiMajor *= dfToMeters;
+    
+    if( pdfSemiMajor != NULL )
+        *pdfSemiMajor = dfSemiMajor;
+    
+/* -------------------------------------------------------------------- */
+/*      Get the semi-minor if requested.  If the Semi-minor axis        */
+/*      isn't available, compute it based on the inverse flattening.    */
+/* -------------------------------------------------------------------- */
+    if( pdfSemiMinor != NULL )
+    {
+        *pdfSemiMinor =
+            atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
+                              "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+                              "SEMI_MINOR_AXIS" )) * dfToMeters;
+
+        if( *pdfSemiMinor == 0.0 )
+        {
+            double	dfInvFlattening;
+            
+            dfInvFlattening = 
+                atof(CSVGetField( CSVFilename("ellipsoid.csv" ),
+                                  "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+                                  "INV_FLATTENING" ));
+            *pdfSemiMinor = dfSemiMajor * (1 - 1.0/dfInvFlattening);
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszName != NULL )
+        *ppszName =
+            CPLStrdup(CSVGetField( CSVFilename("ellipsoid.csv" ),
+                                   "ELLIPSOID_CODE", szSearchKey, CC_Integer,
+                                   "ELLIPSOID_NAME" ));
+    
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                           GTIFGetPMInfo()                            */
+/*                                                                      */
+/*      Get the offset between a given prime meridian and Greenwich     */
+/*      in degrees.                                                     */
+/************************************************************************/
+
+int GTIFGetPMInfo( int nPMCode, char ** ppszName, double *pdfOffset )
+
+{
+    char	szSearchKey[24];
+    int		nUOMAngle;
+    const char *pszFilename = CSVFilename("prime_meridian.csv");
+
+/* -------------------------------------------------------------------- */
+/*      Use a special short cut for Greenwich, since it is so common.   */
+/* -------------------------------------------------------------------- */
+    if( nPMCode == PM_Greenwich )
+    {
+        if( pdfOffset != NULL )
+            *pdfOffset = 0.0;
+        if( ppszName != NULL )
+            *ppszName = CPLStrdup( "Greenwich" );
+        return TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Search the database for the corresponding datum code.           */
+/* -------------------------------------------------------------------- */
+    sprintf( szSearchKey, "%d", nPMCode );
+
+    nUOMAngle =
+        atoi(CSVGetField( pszFilename, 
+                          "PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
+                          "UOM_CODE" ) );
+    if( nUOMAngle < 1 )
+        return FALSE;
+
+/* -------------------------------------------------------------------- */
+/*      Get the PM offset.                                              */
+/* -------------------------------------------------------------------- */
+    if( pdfOffset != NULL )
+    {
+        *pdfOffset =
+            GTIFAngleStringToDD(
+                CSVGetField( pszFilename, 
+                             "PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
+                             "GREENWICH_LONGITUDE" ),
+                nUOMAngle );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszName != NULL )
+        *ppszName =
+            CPLStrdup(
+                CSVGetField( pszFilename, 
+                             "PRIME_MERIDIAN_CODE", szSearchKey, CC_Integer,
+                             "PRIME_MERIDIAN_NAME" ));
+    
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                          GTIFGetDatumInfo()                          */
+/*                                                                      */
+/*      Fetch the ellipsoid, and name for a datum.                      */
+/************************************************************************/
+
+int GTIFGetDatumInfo( int nDatumCode, char ** ppszName, short * pnEllipsoid )
+
+{
+    char	szSearchKey[24];
+    int		nEllipsoid;
+    const char *pszFilename = CSVFilename( "datum.csv" );
+
+/* -------------------------------------------------------------------- */
+/*      Search the database for the corresponding datum code.           */
+/* -------------------------------------------------------------------- */
+    sprintf( szSearchKey, "%d", nDatumCode );
+
+    nEllipsoid = atoi(CSVGetField( pszFilename,
+                                   "DATUM_CODE", szSearchKey, CC_Integer,
+                                   "ELLIPSOID_CODE" ) );
+
+    if( pnEllipsoid != NULL )
+        *pnEllipsoid = nEllipsoid;
+    
+/* -------------------------------------------------------------------- */
+/*      Handle a few built-in datums.                                   */
+/* -------------------------------------------------------------------- */
+    if( nEllipsoid < 1 )
+    {
+        const char *pszName = NULL;
+        
+        if( nDatumCode == Datum_North_American_Datum_1927 )
+        {
+            nEllipsoid = Ellipse_Clarke_1866;
+            pszName = "North American Datum 1927";
+        }
+        else if( nDatumCode == Datum_North_American_Datum_1983 )
+        {
+            nEllipsoid = Ellipse_GRS_1980;
+            pszName = "North American Datum 1983";
+        }
+        else if( nDatumCode == Datum_WGS84 )
+        {
+            nEllipsoid = Ellipse_WGS_84;
+            pszName = "World Geodetic System 1984";
+        }
+        else if( nDatumCode == Datum_WGS72 )
+        {
+            nEllipsoid = 7043; /* WGS7 */
+            pszName = "World Geodetic System 1972";
+        }
+        else
+            return FALSE;
+
+        if( pnEllipsoid != NULL )
+            *pnEllipsoid = nEllipsoid;
+
+        if( ppszName != NULL )
+            *ppszName = CPLStrdup( pszName );
+
+        return TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszName != NULL )
+        *ppszName =
+            CPLStrdup(CSVGetField( pszFilename,
+                                   "DATUM_CODE", szSearchKey, CC_Integer,
+                                   "DATUM_NAME" ));
+    
+    return( TRUE );
+}
+
+
+/************************************************************************/
+/*                        GTIFGetUOMLengthInfo()                        */
+/*                                                                      */
+/*      Note: This function should eventually also know how to          */
+/*      lookup length aliases in the UOM_LE_ALIAS table.                */
+/************************************************************************/
+
+int GTIFGetUOMLengthInfo( int nUOMLengthCode,
+                          char **ppszUOMName,
+                          double * pdfInMeters )
+
+{
+    char	**papszUnitsRecord;
+    char	szSearchKey[24];
+    int		iNameField;
+    const char *pszFilename;
+
+/* -------------------------------------------------------------------- */
+/*      We short cut meter to save work in the most common case.        */
+/* -------------------------------------------------------------------- */
+    if( nUOMLengthCode == 9001 )
+    {
+        if( ppszUOMName != NULL )
+            *ppszUOMName = CPLStrdup( "metre" );
+        if( pdfInMeters != NULL )
+            *pdfInMeters = 1.0;
+
+        return TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Search the units database for this unit.  If we don't find      */
+/*      it return failure.                                              */
+/* -------------------------------------------------------------------- */
+    pszFilename = CSVFilename( "unit_of_measure.csv" );
+
+    sprintf( szSearchKey, "%d", nUOMLengthCode );
+    papszUnitsRecord =
+        CSVScanFileByName( pszFilename,
+                           "UOM_CODE", szSearchKey, CC_Integer );
+
+    if( papszUnitsRecord == NULL )
+        return FALSE;
+
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszUOMName != NULL )
+    {
+        iNameField = CSVGetFileFieldId( pszFilename,
+                                        "UNIT_OF_MEAS_NAME" );
+        *ppszUOMName = CPLStrdup( CSLGetField(papszUnitsRecord, iNameField) );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Get the A and B factor fields, and create the multiplicative    */
+/*      factor.                                                         */
+/* -------------------------------------------------------------------- */
+    if( pdfInMeters != NULL )
+    {
+        int	iBFactorField, iCFactorField;
+        
+        iBFactorField = CSVGetFileFieldId( pszFilename, "FACTOR_B" );
+        iCFactorField = CSVGetFileFieldId( pszFilename, "FACTOR_C" );
+
+        if( atof(CSLGetField(papszUnitsRecord, iCFactorField)) > 0.0 )
+            *pdfInMeters = atof(CSLGetField(papszUnitsRecord, iBFactorField))
+                / atof(CSLGetField(papszUnitsRecord, iCFactorField));
+        else
+            *pdfInMeters = 0.0;
+    }
+    
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                        GTIFGetUOMAngleInfo()                         */
+/************************************************************************/
+
+int GTIFGetUOMAngleInfo( int nUOMAngleCode,
+                         char **ppszUOMName,
+                         double * pdfInDegrees )
+
+{
+    const char	*pszUOMName = NULL;
+    double	dfInDegrees = 1.0;
+    const char *pszFilename = CSVFilename( "unit_of_measure.csv" );
+    char	szSearchKey[24];
+
+    sprintf( szSearchKey, "%d", nUOMAngleCode );
+    pszUOMName = CSVGetField( pszFilename,
+                              "UOM_CODE", szSearchKey, CC_Integer,
+                              "UNIT_OF_MEAS_NAME" );
+
+/* -------------------------------------------------------------------- */
+/*      If the file is found, read from there.  Note that FactorC is    */
+/*      an empty field for any of the DMS style formats, and in this    */
+/*      case we really want to return the default InDegrees value       */
+/*      (1.0) from above.                                               */
+/* -------------------------------------------------------------------- */
+    if( pszUOMName != NULL )
+    {
+        double dfFactorB, dfFactorC, dfInRadians;
+        
+        dfFactorB = 
+            atof(CSVGetField( pszFilename,
+                              "UOM_CODE", szSearchKey, CC_Integer,
+                              "FACTOR_B" ));
+        
+        dfFactorC = 
+            atof(CSVGetField( pszFilename,
+                              "UOM_CODE", szSearchKey, CC_Integer,
+                              "FACTOR_C" ));
+
+        if( dfFactorC != 0.0 )
+        {
+            dfInRadians = (dfFactorB / dfFactorC);
+            dfInDegrees = dfInRadians * 180.0 / PI;
+        }
+                          
+
+        /* We do a special override of some of the DMS formats name */
+        if( nUOMAngleCode == 9102 || nUOMAngleCode == 9107
+            || nUOMAngleCode == 9108 || nUOMAngleCode == 9110 )
+        {
+            dfInDegrees = 1.0;
+            pszUOMName = "degree";
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Otherwise handle a few well known units directly.               */
+/* -------------------------------------------------------------------- */
+    else
+    {
+        switch( nUOMAngleCode )
+        {
+          case 9101:
+            pszUOMName = "radian";
+            dfInDegrees = 180.0 / PI;
+            break;
+        
+          case 9102:
+          case 9107:
+          case 9108:
+          case 9110:
+            pszUOMName = "degree";
+            dfInDegrees = 1.0;
+            break;
+
+          case 9103:
+            pszUOMName = "arc-minute";
+            dfInDegrees = 1 / 60.0;
+            break;
+
+          case 9104:
+            pszUOMName = "arc-second";
+            dfInDegrees = 1 / 3600.0;
+            break;
+        
+          case 9105:
+            pszUOMName = "grad";
+            dfInDegrees = 180.0 / 200.0;
+            break;
+
+          case 9106:
+            pszUOMName = "gon";
+            dfInDegrees = 180.0 / 200.0;
+            break;
+        
+          case 9109:
+            pszUOMName = "microradian";
+            dfInDegrees = 180.0 / (PI * 1000000.0);
+            break;
+
+          default:
+            return FALSE;
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Return to caller.                                               */
+/* -------------------------------------------------------------------- */
+    if( ppszUOMName != NULL )
+    {
+        if( pszUOMName != NULL )
+            *ppszUOMName = CPLStrdup( pszUOMName );
+        else
+            *ppszUOMName = NULL;
+    }
+
+    if( pdfInDegrees != NULL )
+        *pdfInDegrees = dfInDegrees;
+
+    return( TRUE );
+}
+
+/************************************************************************/
+/*                    EPSGProjMethodToCTProjMethod()                    */
+/*                                                                      */
+/*      Convert between the EPSG enumeration for projection methods,    */
+/*      and the GeoTIFF CT codes.                                       */
+/************************************************************************/
+
+static int EPSGProjMethodToCTProjMethod( int nEPSG )
+
+{
+    /* see trf_method.csv for list of EPSG codes */
+    
+    switch( nEPSG )
+    {
+      case 9801:
+        return( CT_LambertConfConic_1SP );
+
+      case 9802:
+        return( CT_LambertConfConic_2SP );
+
+      case 9803:
+        return( CT_LambertConfConic_2SP ); /* Belgian variant not supported */
+
+      case 9804:
+        return( CT_Mercator );  /* 1SP and 2SP not differentiated */
+
+      case 9805:
+        return( CT_Mercator );  /* 1SP and 2SP not differentiated */
+
+      case 9806:
+        return( CT_CassiniSoldner );
+
+      case 9807:
+        return( CT_TransverseMercator );
+
+      case 9808:
+        return( CT_TransvMercator_SouthOriented );
+
+      case 9809:
+        return( CT_ObliqueStereographic );
+
+      case 9810:
+        return( CT_PolarStereographic );
+
+      case 9811:
+        return( CT_NewZealandMapGrid );
+
+      case 9812:
+        return( CT_ObliqueMercator ); /* is hotine actually different? */
+
+      case 9813:
+        return( CT_ObliqueMercator_Laborde );
+
+      case 9814:
+        return( CT_ObliqueMercator_Rosenmund ); /* swiss  */
+
+      case 9815:
+        return( CT_ObliqueMercator );
+
+      case 9816: /* tunesia mining grid has no counterpart */
+        return( KvUserDefined );
+    }
+
+    return( KvUserDefined );
+}
+
+/************************************************************************/
+/*                            SetGTParmIds()                            */
+/*                                                                      */
+/*      This is hardcoded logic to set the GeoTIFF parmaeter            */
+/*      identifiers for all the EPSG supported projections.  As the     */
+/*      trf_method.csv table grows with new projections, this code      */
+/*      will need to be updated.                                        */
+/************************************************************************/
+
+static int SetGTParmIds( int nCTProjection, 
+                         int *panProjParmId, 
+                         int *panEPSGCodes )
+
+{
+    int anWorkingDummy[7];
+
+    if( panEPSGCodes == NULL )
+        panEPSGCodes = anWorkingDummy;
+    if( panProjParmId == NULL )
+        panProjParmId = anWorkingDummy;
+
+    memset( panEPSGCodes, 0, sizeof(int) * 7 );
+
+    /* psDefn->nParms = 7; */
+    
+    switch( nCTProjection )
+    {
+      case CT_CassiniSoldner:
+      case CT_NewZealandMapGrid:
+        panProjParmId[0] = ProjNatOriginLatGeoKey;
+        panProjParmId[1] = ProjNatOriginLongGeoKey;
+        panProjParmId[5] = ProjFalseEastingGeoKey;
+        panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        panEPSGCodes[0] = EPSGNatOriginLat;
+        panEPSGCodes[1] = EPSGNatOriginLong;
+        panEPSGCodes[5] = EPSGFalseEasting;
+        panEPSGCodes[6] = EPSGFalseNorthing;
+        return TRUE;
+
+      case CT_ObliqueMercator:
+        panProjParmId[0] = ProjCenterLatGeoKey;
+        panProjParmId[1] = ProjCenterLongGeoKey;
+        panProjParmId[2] = ProjAzimuthAngleGeoKey;
+        panProjParmId[3] = ProjRectifiedGridAngleGeoKey;
+        panProjParmId[4] = ProjScaleAtCenterGeoKey;
+        panProjParmId[5] = ProjFalseEastingGeoKey;
+        panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        panEPSGCodes[0] = EPSGProjCenterLat;
+        panEPSGCodes[1] = EPSGProjCenterLong;
+        panEPSGCodes[2] = EPSGAzimuth;
+        panEPSGCodes[3] = EPSGAngleRectifiedToSkewedGrid;
+        panEPSGCodes[4] = EPSGInitialLineScaleFactor;
+        panEPSGCodes[5] = EPSGProjCenterEasting;
+        panEPSGCodes[6] = EPSGProjCenterNorthing;
+        return TRUE;
+
+      case CT_ObliqueMercator_Laborde:
+        panProjParmId[0] = ProjCenterLatGeoKey;
+        panProjParmId[1] = ProjCenterLongGeoKey;
+        panProjParmId[2] = ProjAzimuthAngleGeoKey;
+        panProjParmId[4] = ProjScaleAtCenterGeoKey;
+        panProjParmId[5] = ProjFalseEastingGeoKey;
+        panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        panEPSGCodes[0] = EPSGProjCenterLat;
+        panEPSGCodes[1] = EPSGProjCenterLong;
+        panEPSGCodes[2] = EPSGAzimuth;
+        panEPSGCodes[4] = EPSGInitialLineScaleFactor;
+        panEPSGCodes[5] = EPSGProjCenterEasting;
+        panEPSGCodes[6] = EPSGProjCenterNorthing;
+        return TRUE;
+        
+      case CT_LambertConfConic_1SP:
+      case CT_Mercator:
+      case CT_ObliqueStereographic:
+      case CT_PolarStereographic:
+      case CT_TransverseMercator:
+      case CT_TransvMercator_SouthOriented:
+        panProjParmId[0] = ProjNatOriginLatGeoKey;
+        panProjParmId[1] = ProjNatOriginLongGeoKey;
+        panProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+        panProjParmId[5] = ProjFalseEastingGeoKey;
+        panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        panEPSGCodes[0] = EPSGNatOriginLat;
+        panEPSGCodes[1] = EPSGNatOriginLong;
+        panEPSGCodes[4] = EPSGNatOriginScaleFactor;
+        panEPSGCodes[5] = EPSGFalseEasting;
+        panEPSGCodes[6] = EPSGFalseNorthing;
+        return TRUE;
+
+      case CT_LambertConfConic_2SP:
+        panProjParmId[0] = ProjFalseOriginLatGeoKey;
+        panProjParmId[1] = ProjFalseOriginLongGeoKey;
+        panProjParmId[2] = ProjStdParallel1GeoKey;
+        panProjParmId[3] = ProjStdParallel2GeoKey;
+        panProjParmId[5] = ProjFalseEastingGeoKey;
+        panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        panEPSGCodes[0] = EPSGFalseOriginLat;
+        panEPSGCodes[1] = EPSGFalseOriginLong;
+        panEPSGCodes[2] = EPSGStdParallel1Lat;
+        panEPSGCodes[3] = EPSGStdParallel2Lat;
+        panEPSGCodes[5] = EPSGFalseOriginEasting;
+        panEPSGCodes[6] = EPSGFalseOriginNorthing;
+        return TRUE;
+
+      case CT_SwissObliqueCylindrical:
+        panProjParmId[0] = ProjCenterLatGeoKey;
+        panProjParmId[1] = ProjCenterLongGeoKey;
+        panProjParmId[5] = ProjFalseEastingGeoKey;
+        panProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        /* EPSG codes? */
+        return TRUE;
+
+      default:
+        return( FALSE );
+    }
+}
+
+/************************************************************************/
+/*                         GTIFGetProjTRFInfo()                         */
+/*                                                                      */
+/*      Transform a PROJECTION_TRF_CODE into a projection method,       */
+/*      and a set of parameters.  The parameters identify will          */
+/*      depend on the returned method, but they will all have been      */
+/*      normalized into degrees and meters.                             */
+/************************************************************************/
+
+int GTIFGetProjTRFInfo( /* COORD_OP_CODE from coordinate_operation.csv */
+                        int nProjTRFCode, 
+                        char **ppszProjTRFName,
+                        short * pnProjMethod,
+                        double * padfProjParms )
+
+{
+    int		nProjMethod, i, anEPSGCodes[7];
+    double	adfProjParms[7];
+    char	szTRFCode[16];
+    int         nCTProjMethod;
+    char       *pszFilename = CPLStrdup(CSVFilename("projop_wparm.csv"));
+
+/* -------------------------------------------------------------------- */
+/*      Get the proj method.  If this fails to return a meaningful      */
+/*      number, then the whole function fails.                          */
+/* -------------------------------------------------------------------- */
+    sprintf( szTRFCode, "%d", nProjTRFCode );
+    nProjMethod =
+        atoi( CSVGetField( pszFilename,
+                           "COORD_OP_CODE", szTRFCode, CC_Integer,
+                           "COORD_OP_METHOD_CODE" ) );
+    if( nProjMethod == 0 )
+    {
+        CPLFree( pszFilename );
+        return FALSE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Initialize a definition of what EPSG codes need to be loaded    */
+/*      into what fields in adfProjParms.                               */
+/* -------------------------------------------------------------------- */
+    nCTProjMethod = EPSGProjMethodToCTProjMethod( nProjMethod );
+    SetGTParmIds( nCTProjMethod, NULL, anEPSGCodes );
+
+/* -------------------------------------------------------------------- */
+/*      Get the parameters for this projection.  For the time being     */
+/*      I am assuming the first four parameters are angles, the         */
+/*      fifth is unitless (normally scale), and the remainder are       */
+/*      linear measures.  This works fine for the existing              */
+/*      projections, but is a pretty fragile approach.                  */
+/* -------------------------------------------------------------------- */
+
+    for( i = 0; i < 7; i++ )
+    {
+        char    szParamUOMID[32], szParamValueID[32], szParamCodeID[32];
+        const char *pszValue;
+        int     nUOM;
+        int     nEPSGCode = anEPSGCodes[i];
+        int     iEPSG;
+
+        /* Establish default */
+        if( nEPSGCode == EPSGAngleRectifiedToSkewedGrid )
+            adfProjParms[i] = 90.0;
+        else if( nEPSGCode == EPSGNatOriginScaleFactor
+                 || nEPSGCode == EPSGInitialLineScaleFactor
+                 || nEPSGCode == EPSGPseudoStdParallelScaleFactor )
+            adfProjParms[i] = 1.0;
+        else
+            adfProjParms[i] = 0.0;
+
+        /* If there is no parameter, skip */
+        if( nEPSGCode == 0 )
+            continue;
+
+        /* Find the matching parameter */
+        for( iEPSG = 0; iEPSG < 7; iEPSG++ )
+        {
+            sprintf( szParamCodeID, "PARAMETER_CODE_%d", iEPSG+1 );
+
+            if( atoi(CSVGetField( pszFilename,
+                                  "COORD_OP_CODE", szTRFCode, CC_Integer, 
+                                  szParamCodeID )) == nEPSGCode )
+                break;
+        }
+
+        /* not found, accept the default */
+        if( iEPSG == 7 )
+            continue;
+
+        /* Get the value, and UOM */
+        sprintf( szParamUOMID, "PARAMETER_UOM_%d", iEPSG+1 );
+        sprintf( szParamValueID, "PARAMETER_VALUE_%d", iEPSG+1 );
+
+        nUOM = atoi(CSVGetField( pszFilename,
+                                 "COORD_OP_CODE", szTRFCode, CC_Integer, 
+                                 szParamUOMID ));
+        pszValue = CSVGetField( pszFilename,
+                                "COORD_OP_CODE", szTRFCode, CC_Integer, 
+                                szParamValueID );
+
+        /* Transform according to the UOM */
+        if( nUOM >= 9100 && nUOM < 9200 )
+            adfProjParms[i] = GTIFAngleStringToDD( pszValue, nUOM );
+        else if( nUOM > 9000 && nUOM < 9100 )
+        {
+            double dfInMeters;
+
+            if( !GTIFGetUOMLengthInfo( nUOM, NULL, &dfInMeters ) )
+                dfInMeters = 1.0;
+            adfProjParms[i] = atof(pszValue) * dfInMeters;
+        }
+        else
+            adfProjParms[i] = atof(pszValue);
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Get the name, if requested.                                     */
+/* -------------------------------------------------------------------- */
+    if( ppszProjTRFName != NULL )
+    {
+        *ppszProjTRFName =
+            CPLStrdup(CSVGetField( pszFilename,
+                                   "COORD_OP_CODE", szTRFCode, CC_Integer,
+                                   "COORD_OP_NAME" ));
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Transfer requested data into passed variables.                  */
+/* -------------------------------------------------------------------- */
+    if( pnProjMethod != NULL )
+        *pnProjMethod = nProjMethod;
+
+    if( padfProjParms != NULL )
+    {
+        for( i = 0; i < 7; i++ )
+            padfProjParms[i] = adfProjParms[i];
+    }
+
+    CPLFree( pszFilename );
+
+    return TRUE;
+}
+
+/************************************************************************/
+/*                         GTIFFetchProjParms()                         */
+/*                                                                      */
+/*      Fetch the projection parameters for a particular projection     */
+/*      from a GeoTIFF file, and fill the GTIFDefn structure out        */
+/*      with them.                                                      */
+/************************************************************************/
+
+static void GTIFFetchProjParms( GTIF * psGTIF, GTIFDefn * psDefn )
+
+{
+    double	dfNatOriginLong, dfNatOriginLat, dfRectGridAngle;
+    double	dfFalseEasting, dfFalseNorthing, dfNatOriginScale;
+    double	dfStdParallel1, dfStdParallel2, dfAzimuth;
+
+/* -------------------------------------------------------------------- */
+/*      Get the false easting, and northing if available.               */
+/* -------------------------------------------------------------------- */
+    if( !GTIFKeyGet(psGTIF, ProjFalseEastingGeoKey, &dfFalseEasting, 0, 1)
+        && !GTIFKeyGet(psGTIF, ProjCenterEastingGeoKey,
+                       &dfFalseEasting, 0, 1) )
+        dfFalseEasting = 0.0;
+        
+    if( !GTIFKeyGet(psGTIF, ProjFalseNorthingGeoKey, &dfFalseNorthing,0,1)
+        && !GTIFKeyGet(psGTIF, ProjCenterNorthingGeoKey,
+                       &dfFalseNorthing, 0, 1) )
+        dfFalseNorthing = 0.0;
+        
+    switch( psDefn->CTProjection )
+    {
+/* -------------------------------------------------------------------- */
+      case CT_Stereographic:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+                       &dfNatOriginScale, 0, 1 ) == 0 )
+            dfNatOriginScale = 1.0;
+            
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjCenterLatGeoKey;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+        psDefn->ProjParm[4] = dfNatOriginScale;
+        psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_LambertConfConic_1SP:
+      case CT_Mercator:
+      case CT_ObliqueStereographic:
+      case CT_TransverseMercator:
+      case CT_TransvMercator_SouthOriented:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+                       &dfNatOriginScale, 0, 1 ) == 0 )
+            dfNatOriginScale = 1.0;
+            
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjNatOriginLongGeoKey;
+        psDefn->ProjParm[4] = dfNatOriginScale;
+        psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_ObliqueMercator: /* hotine */
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjAzimuthAngleGeoKey, 
+                       &dfAzimuth, 0, 1 ) == 0 )
+            dfAzimuth = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjRectifiedGridAngleGeoKey,
+                       &dfRectGridAngle, 0, 1 ) == 0 )
+            dfRectGridAngle = 90.0;
+
+        if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+                       &dfNatOriginScale, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjScaleAtCenterGeoKey,
+                          &dfNatOriginScale, 0, 1 ) == 0 )
+            dfNatOriginScale = 1.0;
+            
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjCenterLatGeoKey;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+        psDefn->ProjParm[2] = dfAzimuth;
+        psDefn->ProjParmId[2] = ProjAzimuthAngleGeoKey;
+        psDefn->ProjParm[3] = dfRectGridAngle;
+        psDefn->ProjParmId[3] = ProjRectifiedGridAngleGeoKey;
+        psDefn->ProjParm[4] = dfNatOriginScale;
+        psDefn->ProjParmId[4] = ProjScaleAtCenterGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_CassiniSoldner:
+      case CT_Polyconic:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+                       &dfNatOriginScale, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjScaleAtCenterGeoKey,
+                          &dfNatOriginScale, 0, 1 ) == 0 )
+            dfNatOriginScale = 1.0;
+            
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjNatOriginLongGeoKey;
+        psDefn->ProjParm[4] = dfNatOriginScale;
+        psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_AzimuthalEquidistant:
+      case CT_MillerCylindrical:
+      case CT_Equirectangular:
+      case CT_Gnomonic:
+      case CT_LambertAzimEqualArea:
+      case CT_Orthographic:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjCenterLatGeoKey;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_Robinson:
+      case CT_Sinusoidal:
+      case CT_VanDerGrinten:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjCenterLongGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_PolarStereographic:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjStraightVertPoleLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjScaleAtNatOriginGeoKey,
+                       &dfNatOriginScale, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjScaleAtCenterGeoKey,
+                          &dfNatOriginScale, 0, 1 ) == 0 )
+            dfNatOriginScale = 1.0;
+            
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjStraightVertPoleLongGeoKey;
+        psDefn->ProjParm[4] = dfNatOriginScale;
+        psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_LambertConfConic_2SP:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjStdParallel1GeoKey, 
+                       &dfStdParallel1, 0, 1 ) == 0 )
+            dfStdParallel1 = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjStdParallel2GeoKey, 
+                       &dfStdParallel2, 0, 1 ) == 0 )
+            dfStdParallel1 = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfNatOriginLat;
+        psDefn->ProjParmId[0] = ProjFalseOriginLatGeoKey;
+        psDefn->ProjParm[1] = dfNatOriginLong;
+        psDefn->ProjParmId[1] = ProjFalseOriginLongGeoKey;
+        psDefn->ProjParm[2] = dfStdParallel1;
+        psDefn->ProjParmId[2] = ProjStdParallel1GeoKey;
+        psDefn->ProjParm[3] = dfStdParallel2;
+        psDefn->ProjParmId[3] = ProjStdParallel2GeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+
+/* -------------------------------------------------------------------- */
+      case CT_AlbersEqualArea:
+      case CT_EquidistantConic:
+/* -------------------------------------------------------------------- */
+        if( GTIFKeyGet(psGTIF, ProjStdParallel1GeoKey, 
+                       &dfStdParallel1, 0, 1 ) == 0 )
+            dfStdParallel1 = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjStdParallel2GeoKey, 
+                       &dfStdParallel2, 0, 1 ) == 0 )
+            dfStdParallel1 = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLongGeoKey, 
+                       &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLongGeoKey, 
+                          &dfNatOriginLong, 0, 1 ) == 0 )
+            dfNatOriginLong = 0.0;
+
+        if( GTIFKeyGet(psGTIF, ProjNatOriginLatGeoKey, 
+                       &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjFalseOriginLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0
+            && GTIFKeyGet(psGTIF, ProjCenterLatGeoKey, 
+                          &dfNatOriginLat, 0, 1 ) == 0 )
+            dfNatOriginLat = 0.0;
+
+        /* notdef: should transform to decimal degrees at this point */
+
+        psDefn->ProjParm[0] = dfStdParallel1;
+        psDefn->ProjParmId[0] = ProjStdParallel1GeoKey;
+        psDefn->ProjParm[1] = dfStdParallel2;
+        psDefn->ProjParmId[1] = ProjStdParallel2GeoKey;
+        psDefn->ProjParm[2] = dfNatOriginLat;
+        psDefn->ProjParmId[2] = ProjNatOriginLatGeoKey;
+        psDefn->ProjParm[3] = dfNatOriginLong;
+        psDefn->ProjParmId[3] = ProjNatOriginLongGeoKey;
+        psDefn->ProjParm[5] = dfFalseEasting;
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[6] = dfFalseNorthing;
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        psDefn->nParms = 7;
+        break;
+    }
+}
+
+/************************************************************************/
+/*                            GTIFGetDefn()                             */
+/************************************************************************/
+
+/**
+ at param psGTIF GeoTIFF information handle as returned by GTIFNew.
+ at param psDefn Pointer to an existing GTIFDefn structure.  This structure
+does not need to have been pre-initialized at all.
+
+ at return TRUE if the function has been successful, otherwise FALSE.
+
+This function reads the coordinate system definition from a GeoTIFF file,
+and <i>normalizes</i> it into a set of component information using 
+definitions from CSV (Comma Seperated Value ASCII) files derived from 
+EPSG tables.  This function is intended to simplify correct support for
+reading files with defined PCS (Projected Coordinate System) codes that
+wouldn't otherwise be directly known by application software by reducing
+it to the underlying projection method, parameters, datum, ellipsoid, 
+prime meridian and units.<p>
+
+The application should pass a pointer to an existing uninitialized 
+GTIFDefn structure, and GTIFGetDefn() will fill it in.  The fuction 
+currently always returns TRUE but in the future will return FALSE if 
+CSV files are not found.  In any event, all geokeys actually found in the
+file will be copied into the GTIFDefn.  However, if the CSV files aren't
+found codes implied by other codes will not be set properly.<p>
+
+GTIFGetDefn() will not generally work if the EPSG derived CSV files cannot
+be found.  By default a modest attempt will be made to find them, but 
+in general it is necessary for the calling application to override the
+logic to find them.  This can be done by calling the 
+SetCSVFilenameHook() function to
+override the search method based on application knowledge of where they are
+found.<p>
+
+The normalization methodology operates by fetching tags from the GeoTIFF
+file, and then setting all other tags implied by them in the structure.  The
+implied relationships are worked out by reading definitions from the 
+various EPSG derived CSV tables.<p>
+
+For instance, if a PCS (ProjectedCSTypeGeoKey) is found in the GeoTIFF file
+this code is used to lookup a record in the <tt>horiz_cs.csv</tt> CSV
+file.  For example given the PCS 26746 we can find the name
+(NAD27 / California zone VI), the GCS 4257 (NAD27), and the ProjectionCode
+10406 (California CS27 zone VI).  The GCS, and ProjectionCode can in turn
+be looked up in other tables until all the details of units, ellipsoid, 
+prime meridian, datum, projection (LambertConfConic_2SP) and projection
+parameters are established.  A full listgeo dump of a file 
+for this result might look like the following, all based on a single PCS
+value:<p>
+
+<pre>
+% listgeo -norm ~/data/geotiff/pci_eg/spaf27.tif
+Geotiff_Information:
+   Version: 1
+   Key_Revision: 1.0
+   Tagged_Information:
+      ModelTiepointTag (2,3):
+         0                0                0                
+         1577139.71       634349.176       0                
+      ModelPixelScaleTag (1,3):
+         195.509321       198.32184        0                
+      End_Of_Tags.
+   Keyed_Information:
+      GTModelTypeGeoKey (Short,1): ModelTypeProjected
+      GTRasterTypeGeoKey (Short,1): RasterPixelIsArea
+      ProjectedCSTypeGeoKey (Short,1): PCS_NAD27_California_VI
+      End_Of_Keys.
+   End_Of_Geotiff.
+
+PCS = 26746 (NAD27 / California zone VI)
+Projection = 10406 (California CS27 zone VI)
+Projection Method: CT_LambertConfConic_2SP
+   ProjStdParallel1GeoKey: 33.883333
+   ProjStdParallel2GeoKey: 32.766667
+   ProjFalseOriginLatGeoKey: 32.166667
+   ProjFalseOriginLongGeoKey: -116.233333
+   ProjFalseEastingGeoKey: 609601.219202
+   ProjFalseNorthingGeoKey: 0.000000
+GCS: 4267/NAD27
+Datum: 6267/North American Datum 1927
+Ellipsoid: 7008/Clarke 1866 (6378206.40,6356583.80)
+Prime Meridian: 8901/Greenwich (0.000000)
+Projection Linear Units: 9003/US survey foot (0.304801m)
+</pre>
+
+Note that GTIFGetDefn() does not inspect or return the tiepoints and scale.
+This must be handled seperately as it normally would.  It is intended to
+simplify capture and normalization of the coordinate system definition.  
+Note that GTIFGetDefn() also does the following things:
+
+<ol>
+<li> Convert all angular values to decimal degrees.
+<li> Convert all linear values to meters. 
+<li> Return the linear units and conversion to meters for the tiepoints and
+scale (though the tiepoints and scale remain in their native units). 
+<li> When reading projection parameters a variety of differences between
+different GeoTIFF generators are handled, and a normalized set of parameters
+for each projection are always returned.
+</ol>
+
+Code fields in the GTIFDefn are filled with KvUserDefined if there is not
+value to assign.  The parameter lists for each of the underlying projection
+transform methods can be found at the
+<a href="http://www.remotesensing.org/geotiff/proj_list">Projections</a>
+page.  Note that nParms will be set based on the maximum parameter used.
+Some of the parameters may not be used in which case the
+GTIFDefn::ProjParmId[] will
+be zero.  This is done to retain correspondence to the EPSG parameter
+numbering scheme.<p>
+
+The 
+<a href="http://www.remotesensing.org/cgi-bin/cvsweb.cgi/~checkout~/osrs/geotiff/libgeotiff/geotiff_proj4.c">geotiff_proj4.c</a> module distributed with libgeotiff can 
+be used as an example of code that converts a GTIFDefn into another projection
+system.<p>
+
+ at see GTIFKeySet(), SetCSVFilenameHook()
+
+*/
+
+int GTIFGetDefn( GTIF * psGTIF, GTIFDefn * psDefn )
+
+{
+    int		i;
+    short	nGeogUOMLinear;
+    double	dfInvFlattening;
+    
+/* -------------------------------------------------------------------- */
+/*      Initially we default all the information we can.                */
+/* -------------------------------------------------------------------- */
+    psDefn->Model = KvUserDefined;
+    psDefn->PCS = KvUserDefined;
+    psDefn->GCS = KvUserDefined;
+    psDefn->UOMLength = KvUserDefined;
+    psDefn->UOMLengthInMeters = 1.0;
+    psDefn->UOMAngle = KvUserDefined;
+    psDefn->UOMAngleInDegrees = 1.0;
+    psDefn->Datum = KvUserDefined;
+    psDefn->Ellipsoid = KvUserDefined;
+    psDefn->SemiMajor = 0.0;
+    psDefn->SemiMinor = 0.0;
+    psDefn->PM = KvUserDefined;
+    psDefn->PMLongToGreenwich = 0.0;
+
+    psDefn->ProjCode = KvUserDefined;
+    psDefn->Projection = KvUserDefined;
+    psDefn->CTProjection = KvUserDefined;
+
+    psDefn->nParms = 0;
+    for( i = 0; i < MAX_GTIF_PROJPARMS; i++ )
+    {
+        psDefn->ProjParm[i] = 0.0;
+        psDefn->ProjParmId[i] = 0;
+    }
+
+    psDefn->MapSys = KvUserDefined;
+    psDefn->Zone = 0;
+
+/* -------------------------------------------------------------------- */
+/*	Try to get the overall model type.				*/
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF,GTModelTypeGeoKey,&(psDefn->Model),0,1);
+
+/* -------------------------------------------------------------------- */
+/*	Extract the Geog units.  					*/
+/* -------------------------------------------------------------------- */
+    nGeogUOMLinear = 9001; /* Linear_Meter */
+    GTIFKeyGet(psGTIF, GeogLinearUnitsGeoKey, &nGeogUOMLinear, 0, 1 );
+
+/* -------------------------------------------------------------------- */
+/*      Try to get a PCS.                                               */
+/* -------------------------------------------------------------------- */
+    if( GTIFKeyGet(psGTIF,ProjectedCSTypeGeoKey, &(psDefn->PCS),0,1) == 1
+        && psDefn->PCS != KvUserDefined )
+    {
+        /*
+         * Translate this into useful information.
+         */
+        GTIFGetPCSInfo( psDefn->PCS, NULL, &(psDefn->ProjCode),
+                        &(psDefn->UOMLength), &(psDefn->GCS) );
+    }
+
+/* -------------------------------------------------------------------- */
+/*       If we have the PCS code, but didn't find it in the CSV files   */
+/*      (likely because we can't find them) we will try some ``jiffy    */
+/*      rules'' for UTM and state plane.                                */
+/* -------------------------------------------------------------------- */
+    if( psDefn->PCS != KvUserDefined && psDefn->ProjCode == KvUserDefined )
+    {
+        int	nMapSys, nZone;
+        int	nGCS = psDefn->GCS;
+
+        nMapSys = GTIFPCSToMapSys( psDefn->PCS, &nGCS, &nZone );
+        if( nMapSys != KvUserDefined )
+        {
+            psDefn->ProjCode = GTIFMapSysToProj( nMapSys, nZone );
+            psDefn->GCS = nGCS;
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      If the Proj_ code is specified directly, use that.              */
+/* -------------------------------------------------------------------- */
+    if( psDefn->ProjCode == KvUserDefined )
+        GTIFKeyGet(psGTIF, ProjectionGeoKey, &(psDefn->ProjCode), 0, 1 );
+    
+    if( psDefn->ProjCode != KvUserDefined )
+    {
+        /*
+         * We have an underlying projection transformation value.  Look
+         * this up.  For a PCS of ``WGS 84 / UTM 11'' the transformation
+         * would be Transverse Mercator, with a particular set of options.
+         * The nProjTRFCode itself would correspond to the name
+         * ``UTM zone 11N'', and doesn't include datum info.
+         */
+        GTIFGetProjTRFInfo( psDefn->ProjCode, NULL, &(psDefn->Projection),
+                            psDefn->ProjParm );
+        
+        /*
+         * Set the GeoTIFF identity of the parameters.
+         */
+        psDefn->CTProjection =
+            EPSGProjMethodToCTProjMethod( psDefn->Projection );
+
+        SetGTParmIds( psDefn->CTProjection, psDefn->ProjParmId, NULL);
+        psDefn->nParms = 7;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Try to get a GCS.  If found, it will override any implied by    */
+/*      the PCS.                                                        */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF, GeographicTypeGeoKey, &(psDefn->GCS), 0, 1 );
+
+/* -------------------------------------------------------------------- */
+/*      Derive the datum, and prime meridian from the GCS.              */
+/* -------------------------------------------------------------------- */
+    if( psDefn->GCS != KvUserDefined )
+    {
+        GTIFGetGCSInfo( psDefn->GCS, NULL, &(psDefn->Datum), &(psDefn->PM),
+                        &(psDefn->UOMAngle) );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Handle the GCS angular units.  GeogAngularUnitsGeoKey           */
+/*      overrides the GCS or PCS setting.                               */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF, GeogAngularUnitsGeoKey, &(psDefn->UOMAngle), 0, 1 );
+    if( psDefn->UOMAngle != KvUserDefined )
+    {
+        GTIFGetUOMAngleInfo( psDefn->UOMAngle, NULL,
+                             &(psDefn->UOMAngleInDegrees) );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Check for a datum setting, and then use the datum to derive     */
+/*      an ellipsoid.                                                   */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF, GeogGeodeticDatumGeoKey, &(psDefn->Datum), 0, 1 );
+
+    if( psDefn->Datum != KvUserDefined )
+    {
+        GTIFGetDatumInfo( psDefn->Datum, NULL, &(psDefn->Ellipsoid) );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Check for an explicit ellipsoid.  Use the ellipsoid to          */
+/*      derive the ellipsoid characteristics, if possible.              */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF, GeogEllipsoidGeoKey, &(psDefn->Ellipsoid), 0, 1 );
+
+    if( psDefn->Ellipsoid != KvUserDefined )
+    {
+        GTIFGetEllipsoidInfo( psDefn->Ellipsoid, NULL,
+                              &(psDefn->SemiMajor), &(psDefn->SemiMinor) );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Check for overridden ellipsoid parameters.  It would be nice    */
+/*      to warn if they conflict with provided information, but for     */
+/*      now we just override.                                           */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF, GeogSemiMajorAxisGeoKey, &(psDefn->SemiMajor), 0, 1 );
+    GTIFKeyGet(psGTIF, GeogSemiMinorAxisGeoKey, &(psDefn->SemiMinor), 0, 1 );
+    
+    if( GTIFKeyGet(psGTIF, GeogInvFlatteningGeoKey, &dfInvFlattening, 
+                   0, 1 ) == 1 )
+    {
+        if( dfInvFlattening != 0.0 )
+            psDefn->SemiMinor = 
+                psDefn->SemiMajor * (1 - 1.0/dfInvFlattening);
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Get the prime meridian info.                                    */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF, GeogPrimeMeridianGeoKey, &(psDefn->PM), 0, 1 );
+
+    if( psDefn->PM != KvUserDefined )
+    {
+        GTIFGetPMInfo( psDefn->PM, NULL, &(psDefn->PMLongToGreenwich) );
+    }
+    else
+    {
+        GTIFKeyGet(psGTIF, GeogPrimeMeridianLongGeoKey,
+                   &(psDefn->PMLongToGreenwich), 0, 1 );
+
+        psDefn->PMLongToGreenwich =
+            GTIFAngleToDD( psDefn->PMLongToGreenwich,
+                           psDefn->UOMAngle );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Have the projection units of measure been overridden?  We       */
+/*      should likely be doing something about angular units too,       */
+/*      but these are very rarely not decimal degrees for actual        */
+/*      file coordinates.                                               */
+/* -------------------------------------------------------------------- */
+    GTIFKeyGet(psGTIF,ProjLinearUnitsGeoKey,&(psDefn->UOMLength),0,1);
+
+    if( psDefn->UOMLength != KvUserDefined )
+    {
+        GTIFGetUOMLengthInfo( psDefn->UOMLength, NULL,
+                              &(psDefn->UOMLengthInMeters) );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Handle a variety of user defined transform types.               */
+/* -------------------------------------------------------------------- */
+    if( GTIFKeyGet(psGTIF,ProjCoordTransGeoKey,
+                   &(psDefn->CTProjection),0,1) == 1)
+    {
+        GTIFFetchProjParms( psGTIF, psDefn );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Try to set the zoned map system information.                    */
+/* -------------------------------------------------------------------- */
+    psDefn->MapSys = GTIFProjToMapSys( psDefn->ProjCode, &(psDefn->Zone) );
+
+/* -------------------------------------------------------------------- */
+/*      If this is UTM, and we were unable to extract the projection    */
+/*      parameters from the CSV file, just set them directly now,       */
+/*      since it's pretty easy, and a common case.                      */
+/* -------------------------------------------------------------------- */
+    if( (psDefn->MapSys == MapSys_UTM_North
+         || psDefn->MapSys == MapSys_UTM_South)
+        && psDefn->CTProjection == KvUserDefined )
+    {
+        psDefn->CTProjection = CT_TransverseMercator;
+        psDefn->nParms = 7;
+        psDefn->ProjParmId[0] = ProjNatOriginLatGeoKey;
+        psDefn->ProjParm[0] = 0.0;
+            
+        psDefn->ProjParmId[1] = ProjNatOriginLongGeoKey;
+        psDefn->ProjParm[1] = psDefn->Zone*6 - 183.0;
+        
+        psDefn->ProjParmId[4] = ProjScaleAtNatOriginGeoKey;
+        psDefn->ProjParm[4] = 0.9996;
+        
+        psDefn->ProjParmId[5] = ProjFalseEastingGeoKey;
+        psDefn->ProjParm[5] = 500000.0;
+        
+        psDefn->ProjParmId[6] = ProjFalseNorthingGeoKey;
+
+        if( psDefn->MapSys == MapSys_UTM_North )
+            psDefn->ProjParm[6] = 0.0;
+        else
+            psDefn->ProjParm[6] = 10000000.0;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      For now we forceable deaccess all CSV files to reduce the       */
+/*      chance of "leakage".  Really, this should be application        */
+/*      controlled.                                                     */
+/* -------------------------------------------------------------------- */
+    CSVDeaccess( NULL );
+
+    return TRUE;
+}
+
+/************************************************************************/
+/*                            GTIFDecToDMS()                            */
+/*                                                                      */
+/*      Convenient function to translate decimal degrees to DMS         */
+/*      format for reporting to a user.                                 */
+/************************************************************************/
+
+const char *GTIFDecToDMS( double dfAngle, const char * pszAxis,
+                          int nPrecision )
+
+{
+    int		nDegrees, nMinutes;
+    double	dfSeconds;
+    char	szFormat[30];
+    static char szBuffer[50];
+    const char	*pszHemisphere = NULL;
+    double	dfRound;
+    int		i;
+
+    dfRound = 0.5/60;
+    for( i = 0; i < nPrecision; i++ )
+        dfRound = dfRound * 0.1;
+
+    nDegrees = (int) ABS(dfAngle);
+    nMinutes = (int) ((ABS(dfAngle) - nDegrees) * 60 + dfRound);
+    dfSeconds = ABS((ABS(dfAngle) * 3600 - nDegrees*3600 - nMinutes*60));
+
+    if( EQUAL(pszAxis,"Long") && dfAngle < 0.0 )
+        pszHemisphere = "W";
+    else if( EQUAL(pszAxis,"Long") )
+        pszHemisphere = "E";
+    else if( dfAngle < 0.0 )
+        pszHemisphere = "S";
+    else
+        pszHemisphere = "N";
+
+    sprintf( szFormat, "%%3dd%%2d\'%%%d.%df\"%s",
+             nPrecision+3, nPrecision, pszHemisphere );
+    sprintf( szBuffer, szFormat, nDegrees, nMinutes, dfSeconds );
+
+    return( szBuffer );
+}
+
+/************************************************************************/
+/*                           GTIFPrintDefn()                            */
+/*                                                                      */
+/*      Report the contents of a GTIFDefn structure ... mostly for      */
+/*      debugging.                                                      */
+/************************************************************************/
+
+void GTIFPrintDefn( GTIFDefn * psDefn, FILE * fp )
+
+{
+/* -------------------------------------------------------------------- */
+/*      Get the PCS name if possible.                                   */
+/* -------------------------------------------------------------------- */
+    if( psDefn->PCS != KvUserDefined )
+    {
+        char	*pszPCSName = NULL;
+    
+        GTIFGetPCSInfo( psDefn->PCS, &pszPCSName, NULL, NULL, NULL );
+        if( pszPCSName == NULL )
+            pszPCSName = CPLStrdup("name unknown");
+        
+        fprintf( fp, "PCS = %d (%s)\n", psDefn->PCS, pszPCSName );
+        CPLFree( pszPCSName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*	Dump the projection code if possible.				*/
+/* -------------------------------------------------------------------- */
+    if( psDefn->ProjCode != KvUserDefined )
+    {
+        char	*pszTRFName = NULL;
+
+        GTIFGetProjTRFInfo( psDefn->ProjCode, &pszTRFName, NULL, NULL );
+        if( pszTRFName == NULL )
+            pszTRFName = CPLStrdup("");
+                
+        fprintf( fp, "Projection = %d (%s)\n",
+                 psDefn->ProjCode, pszTRFName );
+
+        CPLFree( pszTRFName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Try to dump the projection method name, and parameters if possible.*/
+/* -------------------------------------------------------------------- */
+    if( psDefn->CTProjection != KvUserDefined )
+    {
+        char	*pszName = GTIFValueName(ProjCoordTransGeoKey,
+                                         psDefn->CTProjection);
+        int     i;
+
+        if( pszName == NULL )
+            pszName = "(unknown)";
+            
+        fprintf( fp, "Projection Method: %s\n", pszName );
+
+        for( i = 0; i < psDefn->nParms; i++ )
+        {
+            if( psDefn->ProjParmId[i] == 0 )
+                continue;
+
+            pszName = GTIFKeyName((geokey_t) psDefn->ProjParmId[i]);
+            if( pszName == NULL )
+                pszName = "(unknown)";
+
+            if( i < 4 )
+            {
+                char	*pszAxisName;
+                
+                if( strstr(pszName,"Long") != NULL )
+                    pszAxisName = "Long";
+                else if( strstr(pszName,"Lat") != NULL )
+                    pszAxisName = "Lat";
+                else
+                    pszAxisName = "?";
+                
+                fprintf( fp, "   %s: %f (%s)\n",
+                         pszName, psDefn->ProjParm[i],
+                         GTIFDecToDMS( psDefn->ProjParm[i], pszAxisName, 2 ) );
+            }
+            else if( i == 4 )
+                fprintf( fp, "   %s: %f\n", pszName, psDefn->ProjParm[i] );
+            else
+                fprintf( fp, "   %s: %f m\n", pszName, psDefn->ProjParm[i] );
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Report the GCS name, and number.                                */
+/* -------------------------------------------------------------------- */
+    if( psDefn->GCS != KvUserDefined )
+    {
+        char	*pszName = NULL;
+
+        GTIFGetGCSInfo( psDefn->GCS, &pszName, NULL, NULL, NULL );
+        if( pszName == NULL )
+            pszName = CPLStrdup("(unknown)");
+        
+        fprintf( fp, "GCS: %d/%s\n", psDefn->GCS, pszName );
+        CPLFree( pszName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Report the datum name.                                          */
+/* -------------------------------------------------------------------- */
+    if( psDefn->Datum != KvUserDefined )
+    {
+        char	*pszName = NULL;
+
+        GTIFGetDatumInfo( psDefn->Datum, &pszName, NULL );
+        if( pszName == NULL )
+            pszName = CPLStrdup("(unknown)");
+        
+        fprintf( fp, "Datum: %d/%s\n", psDefn->Datum, pszName );
+        CPLFree( pszName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Report the ellipsoid.                                           */
+/* -------------------------------------------------------------------- */
+    if( psDefn->Ellipsoid != KvUserDefined )
+    {
+        char	*pszName = NULL;
+
+        GTIFGetEllipsoidInfo( psDefn->Ellipsoid, &pszName, NULL, NULL );
+        if( pszName == NULL )
+            pszName = CPLStrdup("(unknown)");
+        
+        fprintf( fp, "Ellipsoid: %d/%s (%.2f,%.2f)\n",
+                 psDefn->Ellipsoid, pszName,
+                 psDefn->SemiMajor, psDefn->SemiMinor );
+        CPLFree( pszName );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Report the prime meridian.                                      */
+/* -------------------------------------------------------------------- */
+    if( psDefn->PM != KvUserDefined )
+    {
+        char	*pszName = NULL;
+
+        GTIFGetPMInfo( psDefn->PM, &pszName, NULL );
+
+        if( pszName == NULL )
+            pszName = CPLStrdup("(unknown)");
+        
+        fprintf( fp, "Prime Meridian: %d/%s (%f/%s)\n",
+                 psDefn->PM, pszName,
+                 psDefn->PMLongToGreenwich,
+                 GTIFDecToDMS( psDefn->PMLongToGreenwich, "Long", 2 ) );
+        CPLFree( pszName );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Report the projection units of measure (currently just          */
+/*      linear).                                                        */
+/* -------------------------------------------------------------------- */
+    if( psDefn->UOMLength != KvUserDefined )
+    {
+        char	*pszName = NULL;
+
+        GTIFGetUOMLengthInfo( psDefn->UOMLength, &pszName, NULL );
+        if( pszName == NULL )
+            pszName = CPLStrdup( "(unknown)" );
+        
+        fprintf( fp, "Projection Linear Units: %d/%s (%fm)\n",
+                 psDefn->UOMLength, pszName, psDefn->UOMLengthInMeters );
+        CPLFree( pszName );
+    }
+
+    CSVDeaccess( NULL );
+}
+
+/************************************************************************/
+/*                           GTIFFreeMemory()                           */
+/*                                                                      */
+/*      Externally visible function to free memory allocated within     */
+/*      geo_normalize.c.                                                */
+/************************************************************************/
+
+void GTIFFreeMemory( char * pMemory )
+
+{
+    if( pMemory != NULL )
+        VSIFree( pMemory );
+}
+
+/************************************************************************/
+/*                          GTIFDeaccessCSV()                           */
+/*                                                                      */
+/*      Free all cached CSV info.                                       */
+/************************************************************************/
+
+void GTIFDeaccessCSV()
+
+{
+    CSVDeaccess( NULL );
+}
diff --git a/src/tiff/geo_normalize.h b/src/tiff/geo_normalize.h
new file mode 100644
index 0000000..3cd551f
--- /dev/null
+++ b/src/tiff/geo_normalize.h
@@ -0,0 +1,233 @@
+/******************************************************************************
+ * $Id: geo_normalize.h,v 1.3 2004/03/19 11:51:24 lubia Exp $
+ *
+ * Project:  libgeotiff
+ * Purpose:  Include file related to geo_normalize.c containing Code to
+ *           normalize PCS and other composite codes in a GeoTIFF file.
+ * Author:   Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: geo_normalize.h,v $
+ * Revision 1.3  2004/03/19 11:51:24  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.10  2003/01/15 04:39:16  warmerda
+ * Added GTIFDeaccessCSV
+ *
+ * Revision 1.9  2003/01/15 03:37:40  warmerda
+ * added GTIFFreeMemory()
+ *
+ * Revision 1.8  2002/11/28 22:27:42  warmerda
+ * preliminary upgrade to EPSG 6.2.2 tables
+ *
+ * Revision 1.7  1999/09/17 00:55:26  warmerda
+ * added GTIFGetUOMAngleInfo(), and UOMAngle in GTIFDefn
+ *
+ * Revision 1.6  1999/05/04 03:13:42  warmerda
+ * Added prototype
+ *
+ * Revision 1.5  1999/04/29 23:02:55  warmerda
+ * added docs, and MapSys related stuff
+ *
+ * Revision 1.4  1999/03/18 21:35:19  geotiff
+ * Added PROJ.4 related stuff
+ *
+ * Revision 1.3  1999/03/17 20:44:04  geotiff
+ * added CPL_DLL related support
+ *
+ * Revision 1.2  1999/03/10 18:24:06  geotiff
+ * corrected to use int'
+ *
+ */
+
+#ifndef GEO_NORMALIZE_H_INCLUDED
+#define GEO_NORMALIZE_H_INCLUDED
+
+#include <stdio.h>
+#include "geotiff.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * \file geo_normalize.h
+ *
+ * Include file for extended projection definition normalization api.
+ */
+    
+#define MAX_GTIF_PROJPARMS 	10
+
+/**
+ * Holds a definition of a coordinate system in normalized form.
+ */
+
+typedef struct {
+    /** From GTModelTypeGeoKey tag.  Can have the values ModelTypeGeographic
+        or ModelTypeProjected. */
+    short	Model;
+
+    /** From ProjectedCSTypeGeoKey tag.  For example PCS_NAD27_UTM_zone_3N.*/
+    short	PCS;
+
+    /** From GeographicTypeGeoKey tag.  For example GCS_WGS_84 or
+        GCS_Voirol_1875_Paris.  Includes datum and prime meridian value. */
+    short	GCS;	      
+
+    /** From ProjLinearUnitsGeoKey.  For example Linear_Meter. */
+    short	UOMLength;
+
+    /** One UOMLength = UOMLengthInMeters meters. */
+    double	UOMLengthInMeters;
+
+    /** The angular units of the GCS. */
+    short       UOMAngle;
+
+    /** One UOMAngle = UOMLengthInDegrees degrees. */
+    double      UOMAngleInDegrees;
+    
+    /** Datum from GeogGeodeticDatumGeoKey tag. For example Datum_WGS84 */
+    short	Datum;
+
+    /** Prime meridian from GeogPrimeMeridianGeoKey.  For example PM_Greenwich
+        or PM_Paris. */
+    short	PM;
+
+    /** Decimal degrees of longitude between this prime meridian and
+        Greenwich.  Prime meridians to the west of Greenwich are negative. */
+    double	PMLongToGreenwich;
+
+    /** Ellipsoid identifier from GeogELlipsoidGeoKey.  For example
+        Ellipse_Clarke_1866. */
+    short	Ellipsoid;
+
+    /** The length of the semi major ellipse axis in meters. */
+    double	SemiMajor;
+
+    /** The length of the semi minor ellipse axis in meters. */
+    double	SemiMinor;
+
+    /** Projection id from ProjectionGeoKey.  For example Proj_UTM_11S. */
+    short	ProjCode;
+
+    /** EPSG identifier for underlying projection method.  From the EPSG
+        TRF_METHOD table.  */
+    short	Projection;
+
+    /** GeoTIFF identifier for underlying projection method.  While some of
+      these values have corresponding vlaues in EPSG (Projection field),
+      others do not.  For example CT_TransverseMercator. */
+    short	CTProjection;   
+
+    /** Number of projection parameters in ProjParm and ProjParmId. */
+    int		nParms;
+
+    /** Projection parameter value.  The identify of this parameter
+        is established from the corresponding entry in ProjParmId.  The
+        value will be measured in meters, or decimal degrees if it is a
+        linear or angular measure. */
+    double	ProjParm[MAX_GTIF_PROJPARMS];
+
+    /** Projection parameter identifier.  For example ProjFalseEastingGeoKey.
+        The value will be 0 for unused table entries. */
+    int		ProjParmId[MAX_GTIF_PROJPARMS]; /* geokey identifier,
+                                                   eg. ProjFalseEastingGeoKey*/
+
+    /** Special zone map system code (MapSys_UTM_South, MapSys_UTM_North,
+        MapSys_State_Plane or KvUserDefined if none apply. */
+    int		MapSys;
+
+    /** UTM, or State Plane Zone number, zero if not known. */
+    int		Zone;
+
+} GTIFDefn;
+
+int CPL_DLL GTIFGetPCSInfo( int nPCSCode, char **ppszEPSGName,
+                            short *pnProjOp, 
+                            short *pnUOMLengthCode, short *pnGeogCS );
+int CPL_DLL GTIFGetProjTRFInfo( int nProjTRFCode,
+                                char ** ppszProjTRFName,
+                                short * pnProjMethod,
+                                double * padfProjParms );
+int CPL_DLL GTIFGetGCSInfo( int nGCSCode, char **ppszName,
+                            short *pnDatum, short *pnPM, short *pnUOMAngle );
+int CPL_DLL GTIFGetDatumInfo( int nDatumCode, char **ppszName,
+                              short * pnEllipsoid );
+int CPL_DLL GTIFGetEllipsoidInfo( int nEllipsoid, char ** ppszName,
+                                  double * pdfSemiMajor,
+                                  double * pdfSemiMinor );
+int CPL_DLL GTIFGetPMInfo( int nPM, char **ppszName,
+                           double * pdfLongToGreenwich );
+
+double CPL_DLL GTIFAngleStringToDD( const char *pszAngle, int nUOMAngle );
+int CPL_DLL GTIFGetUOMLengthInfo( int nUOMLengthCode,
+                                  char **ppszUOMName,
+                                  double * pdfInMeters );
+int CPL_DLL GTIFGetUOMAngleInfo( int nUOMAngleCode,
+                                 char **ppszUOMName,
+                                 double * pdfInDegrees );
+
+/* this should be used to free strings returned by GTIFGet... funcs */
+void CPL_DLL GTIFFreeMemory( char * );
+void CPL_DLL GTIFDeaccessCSV();
+
+int CPL_DLL GTIFGetDefn( GTIF *psGTIF, GTIFDefn * psDefn );
+void CPL_DLL GTIFPrintDefn( GTIFDefn *, FILE * );
+void CPL_DLL GTIFFreeDefn( GTIF * );
+
+void CPL_DLL SetCSVFilenameHook( const char *(*CSVFileOverride)(const char *) );
+
+const char CPL_DLL *GTIFDecToDMS( double, const char *, int );
+
+/*
+ * These are useful for recognising UTM and State Plane, with or without
+ * CSV files being found.
+ */
+
+#define MapSys_UTM_North	-9001
+#define MapSys_UTM_South	-9002
+#define MapSys_State_Plane_27	-9003
+#define MapSys_State_Plane_83	-9004
+
+int CPL_DLL   GTIFMapSysToPCS( int MapSys, int Datum, int nZone );
+int CPL_DLL   GTIFMapSysToProj( int MapSys, int nZone );
+int CPL_DLL   GTIFPCSToMapSys( int PCSCode, int * pDatum, int * pZone );
+int CPL_DLL   GTIFProjToMapSys( int ProjCode, int * pZone );
+
+/*
+ * These are only useful if using libgeotiff with libproj (PROJ.4+).
+ */
+char CPL_DLL *GTIFGetProj4Defn( GTIFDefn * );
+int  CPL_DLL  GTIFProj4ToLatLong( GTIFDefn *, int, double *, double * );
+int  CPL_DLL  GTIFProj4FromLatLong( GTIFDefn *, int, double *, double * );
+
+#if defined(HAVE_LIBPROJ) && defined(HAVE_PROJECTS_H)
+#  define HAVE_GTIFPROJ4
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+    
+#endif /* ndef GEO_NORMALIZE_H_INCLUDED */
diff --git a/src/tiff/geo_print.c b/src/tiff/geo_print.c
new file mode 100644
index 0000000..0964a4b
--- /dev/null
+++ b/src/tiff/geo_print.c
@@ -0,0 +1,496 @@
+/**********************************************************************
+ *
+ *  geo_print.c  -- Key-dumping routines for GEOTIFF files.
+ *
+ *    Written By: Niles D. Ritter.
+ *
+ *  copyright (c) 1995   Niles D. Ritter
+ *
+ *  Permission granted to use this software, so long as this copyright
+ *  notice accompanies any products derived therefrom.
+ *
+ *  Revision History;
+ *
+ *    20 June,  1995      Niles D. Ritter      New
+ *     7 July,  1995      NDR                  Fix indexing
+ *    27 July,  1995      NDR                  Added Import utils
+ *    28 July,  1995      NDR                  Made parser more strict.
+ *    29  Sep,  1995      NDR                  Fixed matrix printing.
+ *
+ * $Log: geo_print.c,v $
+ * Revision 1.2  2004/03/19 11:51:24  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.4  2002/05/31 14:27:26  warmerda
+ * added escaping in metadata for string key values
+ *
+ * Revision 1.3  1999/05/04 03:14:35  warmerda
+ * avoid warnings
+ *
+ * Revision 1.2  1999/05/03 17:50:31  warmerda
+ * avoid warnings on IRIX
+ *
+ *
+ **********************************************************************/
+
+#include "geotiff.h"   /* public interface        */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+#include "geokeys.h"
+
+#include <stdio.h>     /* for sprintf             */
+
+#define FMT_GEOTIFF "Geotiff_Information:"
+#define FMT_VERSION "Version: %hd"
+#define FMT_REV     "Key_Revision: %1hd.%hd"
+#define FMT_TAGS    "Tagged_Information:"
+#define FMT_TAGEND  "End_Of_Tags."
+#define FMT_KEYS    "Keyed_Information:"
+#define FMT_KEYEND  "End_Of_Keys."
+#define FMT_GEOEND  "End_Of_Geotiff."
+#define FMT_DOUBLE  "%-17.9g"
+#define FMT_SHORT   "%-11hd"
+
+static void DefaultPrint(char *string, void *aux);
+static void PrintKey(GeoKey *key, GTIFPrintMethod print,void *aux);
+static void PrintGeoTags(GTIF *gtif,GTIFReadMethod scan,void *aux);
+static void PrintTag(int tag, int nrows, double *data, int ncols, 
+					GTIFPrintMethod print,void *aux);
+static void DefaultRead(char *string, void *aux);
+static int  ReadKey(GTIF *gt, GTIFReadMethod scan, void *aux);
+static int  ReadTag(GTIF *gt,GTIFReadMethod scan,void *aux);
+
+/*
+ * Print off the directory info, using whatever method is specified
+ * (defaults to fprintf if null). The "aux" parameter is provided for user
+ * defined method for passing parameters or whatever.
+ *
+ * The output format is a "GeoTIFF meta-data" file, which may be
+ * used to import information with the GTIFFImport() routine.
+ */
+ 
+void GTIFPrint(GTIF *gtif, GTIFPrintMethod print,void *aux)
+{
+    int i;
+    int numkeys = gtif->gt_num_keys;
+    GeoKey *key = gtif->gt_keys;
+    char message[1024];
+	
+    if (!print) print = (GTIFPrintMethod) &DefaultPrint;
+    if (!aux) aux=stdout;	
+
+    sprintf(message,FMT_GEOTIFF "\n"); 
+    print(message,aux);
+    sprintf(message, "Version: %hd" ,gtif->gt_version);
+    sprintf(message, FMT_VERSION,gtif->gt_version);
+    print("   ",aux); print(message,aux); print("\n",aux);
+    sprintf(message, FMT_REV,gtif->gt_rev_major,
+            gtif->gt_rev_minor); 
+    print("   ",aux); print(message,aux); print("\n",aux);
+
+    sprintf(message,"   %s\n",FMT_TAGS); print(message,aux);
+    PrintGeoTags(gtif,print,aux);
+    sprintf(message,"      %s\n",FMT_TAGEND); print(message,aux);
+
+    sprintf(message,"   %s\n",FMT_KEYS); print(message,aux);
+    for (i=0; i<numkeys; i++)
+        PrintKey(++key,print,aux);
+    sprintf(message,"      %s\n",FMT_KEYEND); print(message,aux);
+
+    sprintf(message,"   %s\n",FMT_GEOEND); print(message,aux);
+}
+
+static void PrintGeoTags(GTIF *gt, GTIFPrintMethod print,void *aux)
+{
+	double *data;
+	int count;
+	tiff_t *tif=gt->gt_tif;
+
+	if ((gt->gt_methods.get)(tif, GTIFF_TIEPOINTS, &count, &data ))
+		PrintTag(GTIFF_TIEPOINTS,count/3, data, 3, print, aux);
+	if ((gt->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &data ))
+		PrintTag(GTIFF_PIXELSCALE,count/3, data, 3, print, aux);
+	if ((gt->gt_methods.get)(tif, GTIFF_TRANSMATRIX, &count, &data ))
+		PrintTag(GTIFF_TRANSMATRIX,count/4, data, 4, print, aux);
+}
+
+static void PrintTag(int tag, int nrows, double *dptr, int ncols, 
+					GTIFPrintMethod print,void *aux)
+{
+	int i,j;
+	double *data=dptr;
+        char message[1024];
+
+	print("      ",aux);
+	print(GTIFTagName(tag),aux);
+	sprintf(message," (%d,%d):\n",nrows,ncols);
+	print(message,aux);
+	for (i=0;i<nrows;i++)
+	{
+		print("         ",aux);
+		for (j=0;j<ncols;j++)
+		{
+			sprintf(message,FMT_DOUBLE,*data++);
+			print(message,aux);
+		}
+		print("\n",aux);
+	}
+	_GTIFFree(dptr); /* free up the allocated memory */
+}
+
+
+static void PrintKey(GeoKey *key, GTIFPrintMethod print, void *aux)
+{
+    char *data;
+    geokey_t keyid = (geokey_t) key->gk_key;
+    int count = key->gk_count;
+    int vals_now,i;
+    pinfo_t *sptr;
+    double *dptr;
+    char message[40];
+
+    print("      ",aux);
+    print(GTIFKeyName(keyid),aux);
+	
+    sprintf(message," (%s,%d): ",GTIFTypeName(key->gk_type),count);
+    print(message,aux);
+	
+    if (key->gk_type==TYPE_SHORT && count==1)
+        data = (char *)&key->gk_data;
+    else
+        data = key->gk_data;
+		
+    switch (key->gk_type)
+    {
+      case TYPE_ASCII: 
+      {
+          int  in_char, out_char;
+
+          print("\"",aux);
+
+          in_char = 0;
+          out_char = 0;
+          while( in_char < count-1 )
+          {
+              char ch = ((char *) data)[in_char++];
+
+              if( ch == '\n' )
+              {
+                  message[out_char++] = '\\';
+                  message[out_char++] = 'n';
+              }
+              else if( ch == '\\' )
+              {
+                  message[out_char++] = '\\';
+                  message[out_char++] = '\\';
+              }
+              else
+                  message[out_char++] = ch;
+
+              /* flush message if buffer full */
+              if( out_char == sizeof(message)-3 )
+              {
+                  message[out_char] = '\0';
+                  print(message,aux);
+                  out_char = 0;
+              }
+          }
+
+          message[out_char]='\0';
+          print(message,aux);
+
+          print("\"\n",aux);
+      }
+      break;
+        
+      case TYPE_DOUBLE: 
+        for (dptr = (double *)data; count > 0; count-= vals_now)
+        {
+            vals_now = count > 3? 3: count;
+            for (i=0; i<vals_now; i++,dptr++)
+            {
+                sprintf(message,FMT_DOUBLE ,*dptr);
+                print(message,aux);
+            }
+            print("\n",aux);
+        }
+        break;
+        
+      case TYPE_SHORT: 
+        sptr = (pinfo_t *)data;
+        if (count==1)
+        {
+            sprintf(message,"%s\n",GTIFValueName(keyid,*sptr));
+            print(message,aux);
+        }
+        else
+            for (; count > 0; count-= vals_now)
+            {
+                vals_now = count > 3? 3: count;
+                for (i=0; i<vals_now; i++,sptr++)
+                {
+                    sprintf(message,FMT_SHORT,*sptr);
+                    print(message,aux);
+                }
+                print("\n",aux);
+            }
+        break;
+        
+      default: 
+        sprintf(message, "Unknown Type (%d)\n",key->gk_type);
+        print(message,aux);
+        break;
+    }
+}
+
+static void DefaultPrint(char *string, void *aux)
+{
+    /* Pretty boring */
+    fprintf((FILE *)aux,string);
+}
+
+
+/*
+ *  Importing metadata file
+ */
+
+/*
+ * Import the directory info, using whatever method is specified
+ * (defaults to fscanf if null). The "aux" parameter is provided for user
+ * defined method for passing file or whatever.
+ *
+ * The input format is a "GeoTIFF meta-data" file, which may be
+ * generated by the GTIFFPrint() routine.
+ */
+ 
+int GTIFImport(GTIF *gtif, GTIFReadMethod scan,void *aux)
+{
+    int status;
+    char message[1024];
+	
+    if (!scan) scan = (GTIFReadMethod) &DefaultRead;
+    if (!aux) aux=stdin;	
+	
+    scan(message,aux);
+    if (strncmp(message,FMT_GEOTIFF,8)) return 0; 
+    scan(message,aux);
+    if (!sscanf(message,FMT_VERSION,&gtif->gt_version)) return 0;
+    scan(message,aux);
+    if (sscanf(message,FMT_REV,&gtif->gt_rev_major,
+               &gtif->gt_rev_minor) !=2) return 0;
+
+    scan(message,aux);
+    if (strncmp(message,FMT_TAGS,8)) return 0;
+    while ((status=ReadTag(gtif,scan,aux))>0);
+    if (status < 0) return 0;
+
+    scan(message,aux);
+    if (strncmp(message,FMT_KEYS,8)) return 0;
+    while ((status=ReadKey(gtif,scan,aux))>0);
+	
+    return (status==0); /* success */
+}
+
+static int StringError(char *string)
+{
+    fprintf(stderr,"Parsing Error at \'%s\'\n",string);
+    return -1;
+}
+
+#define SKIPWHITE(vptr) \
+  while (*vptr && (*vptr==' '||*vptr=='\t')) vptr++
+#define FINDCHAR(vptr,c) \
+  while (*vptr && *vptr!=(c)) vptr++
+
+static int ReadTag(GTIF *gt,GTIFReadMethod scan,void *aux)
+{
+    int i,j,tag;
+    char *vptr;
+    char tagname[100];
+    double data[100],*dptr=data;
+    int count,nrows,ncols,num;
+    char message[1024];
+
+    scan(message,aux);
+    if (!strncmp(message,FMT_TAGEND,8)) return 0;
+
+    num=sscanf(message,"%[^( ] (%d,%d):\n",tagname,&nrows,&ncols);
+    if (num!=3) return StringError(message);
+	
+    tag = GTIFTagCode(tagname);
+    if (tag < 0) return StringError(tagname);
+	
+    count = nrows*ncols;
+    for (i=0;i<nrows;i++)
+    {
+        scan(message,aux);
+        vptr = message;
+        for (j=0;j<ncols;j++)
+        {
+            if (!sscanf(vptr,"%lg",dptr++))
+                return StringError(vptr);
+            FINDCHAR(vptr,' ');
+            SKIPWHITE(vptr);
+        }
+    }	
+    (gt->gt_methods.set)(gt->gt_tif, tag, count, data );	
+
+    return 1;
+}
+
+
+static int ReadKey(GTIF *gt, GTIFReadMethod scan, void *aux)
+{
+    tagtype_t ktype;
+    int count,outcount;
+    int vals_now,i;
+    geokey_t key;
+    int icode;
+    pinfo_t code;
+    short  *sptr;
+    char name[1000];
+    char type[20];
+    double data[100];
+    double *dptr;
+    char *vptr;
+    int num;
+    char message[2048];
+
+    scan(message,aux); 
+    if (!strncmp(message,FMT_KEYEND,8)) return 0;
+
+    num=sscanf(message,"%[^( ] (%[^,],%d):\n",name,type,&count);
+    if (num!=3) return StringError(message);
+
+    vptr = message;
+    FINDCHAR(vptr,':'); 
+    if (!*vptr) return StringError(message);
+    vptr+=2;
+
+    if( GTIFKeyCode(name) < 0 )
+        return StringError(name);
+    else
+        key = (geokey_t) GTIFKeyCode(name);
+
+    if( GTIFTypeCode(type) < 0 )
+        return StringError(type);
+    else
+        ktype = (tagtype_t) GTIFTypeCode(type);
+
+    /* skip white space */
+    SKIPWHITE(vptr);
+    if (!*vptr) return StringError(message);
+			
+    switch (ktype)
+    {
+      case TYPE_ASCII: 
+      {
+          char *cdata;
+          int out_char = 0;
+
+          FINDCHAR(vptr,'"');
+          if (!*vptr) return StringError(message);
+
+          cdata = (char *) _GTIFcalloc( count+1 );
+
+          vptr++;
+          while( out_char < count-1 )
+          {
+              if( *vptr == '\0' )
+                  break;
+
+              else if( vptr[0] == '\\' && vptr[1] == 'n' )
+              {
+                  cdata[out_char++] = '\n';
+                  vptr += 2;
+              }
+              else if( vptr[0] == '\\' && vptr[1] == '\\' )
+              {
+                  cdata[out_char++] = '\\';
+                  vptr += 2;
+              }
+              else
+                  cdata[out_char++] = *(vptr++);
+          }
+
+          if( out_char < count-1 ) return StringError(message);
+          if( *vptr != '"' ) return StringError(message);
+
+          cdata[count-1] = '\0';
+          GTIFKeySet(gt,key,ktype,count,cdata);
+
+          _GTIFFree( cdata );
+      }
+      break;
+        
+      case TYPE_DOUBLE: 
+        outcount = count;
+        for (dptr = data; count > 0; count-= vals_now)
+        {
+            vals_now = count > 3? 3: count;
+            for (i=0; i<vals_now; i++,dptr++)
+            {
+                if (!sscanf(vptr,"%lg" ,dptr))
+                    StringError(vptr);
+                FINDCHAR(vptr,' ');
+                SKIPWHITE(vptr);
+            }
+            if (vals_now<count)
+            {
+                scan(message,aux);
+                vptr = message;
+            }
+        }
+        if (outcount==1)
+            GTIFKeySet(gt,key,ktype,outcount,data[0]);
+        else
+            GTIFKeySet(gt,key,ktype,outcount,data);
+        break;
+        
+      case TYPE_SHORT: 
+        if (count==1)
+        {
+            icode = GTIFValueCode(key,vptr);
+            if (icode < 0) return StringError(vptr);
+            code = icode;
+            GTIFKeySet(gt,key,ktype,count,code);
+        }
+        else  /* multi-valued short - no such thing yet */
+        {
+            sptr = (short *)data;
+            outcount = count;
+            for (; count > 0; count-= vals_now)
+            {
+                vals_now = count > 3? 3: count;
+                for (i=0; i<vals_now; i++,sptr++)
+                {
+                    int		work_int;
+
+                    /* note: FMT_SHORT (%11hd) not supported on IRIX */
+                    sscanf(message,"%11d",&work_int);
+                    *sptr = work_int;
+                    scan(message,aux);
+                }
+                if (vals_now<count)
+                {
+                    scan(message,aux);
+                    vptr = message;
+                }
+            }
+            GTIFKeySet(gt,key,ktype,outcount,sptr);			
+        }
+        break;
+        
+      default: 
+        return -1;
+    }
+    return 1;
+}
+
+
+static void DefaultRead(char *string, void *aux)
+{
+	/* Pretty boring */
+	fscanf((FILE *)aux,"%[^\n]\n",string);
+}
+
diff --git a/src/tiff/geo_set.c b/src/tiff/geo_set.c
new file mode 100644
index 0000000..61cb3d4
--- /dev/null
+++ b/src/tiff/geo_set.c
@@ -0,0 +1,259 @@
+/**********************************************************************
+ *
+ *  geo_set.c  -- Public routines for GEOTIFF GeoKey access.
+ *
+ *    Written By: Niles D. Ritter.
+ *
+ *  copyright (c) 1995   Niles D. Ritter
+ *
+ *  Permission granted to use this software, so long as this copyright
+ *  notice accompanies any products derived therefrom.
+ *
+ * $Log: geo_set.c,v $
+ * Revision 1.2  2004/03/19 11:51:24  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.9  2003/01/15 03:37:19  warmerda
+ * avoid warning
+ *
+ * Revision 1.8  2002/09/27 13:05:33  warmerda
+ * allow dynamic set/delete of ASCII tags. ASCIIPARAMS now kept split
+ *
+ * Revision 1.7  2001/05/02 16:48:22  warmerda
+ * fixed a couple bugs in delete code
+ *
+ * Revision 1.6  2001/05/02 13:54:34  warmerda
+ * updated geo_set.c to support deleting tags
+ *
+ * Revision 1.5  1999/05/04 03:09:33  warmerda
+ * avoid warnings
+ *
+ * Revision 1.4  1999/05/03 17:50:31  warmerda
+ * avoid warnings on IRIX
+ *
+ * Revision 1.3  1999/04/28 19:59:38  warmerda
+ * added some doxygen style documentation
+ *
+ * Revision 1.2  1999/03/11 17:39:38  geotiff
+ * Added fix for case where a key is being overwritten.
+ *
+ **********************************************************************/
+
+#include "geotiff.h"   /* public interface        */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+
+#include <assert.h>
+
+/**
+This function writes a geokey_t value to a GeoTIFF file.
+
+ at param gtif The geotiff information handle from GTIFNew().
+
+ at param keyID The geokey_t name (such as ProjectedCSTypeGeoKey).
+This must come from the list of legal geokey_t values
+(an enumeration) listed below.
+
+ at param val The <b>val</b> argument is a pointer to the
+variable into which the value should be read.  The type of the variable
+varies depending on the geokey_t given.  While there is no ready mapping
+of geokey_t values onto types, in general code values are of type <i>short</i>,
+citations are strings, and everything else is of type <i>double</i>.  Note
+that pointer's to <i>int</i> should never be passed to GTIFKeyGet() for
+integer values as they will be shorts, and the int's may not be properly
+initialized (and will be grossly wrong on MSB systems).
+
+ at param index Indicates how far into the list of values
+for this geokey to offset. Should normally be zero.
+
+ at param count Indicates how many values
+to read.  At this time all keys except for strings have only one value,
+so <b>index</b> should be zero, and <b>count</b> should be one.<p>
+
+The <b>key</b> indicates the key name to be written to the
+file and should from the geokey_t enumeration 
+(eg. <tt>ProjectedCSTypeGeoKey</tt>).  The full list of possible geokey_t
+values can be found in geokeys.inc, or in the online documentation for
+GTIFKeyGet().<p>
+
+The <b>type</b> should be one of TYPE_SHORT, TYPE_ASCII, or TYPE_DOUBLE and
+will indicate the type of value being passed at the end of the argument
+list (the key value).  The <b>count</b> should be one except for strings
+when it should be the length of the string (or zero to for this to be
+computed internally).  As a special case a <b>count</b> of -1 can be
+used to request an existing key be deleted, in which no value is passed.<p>
+
+The actual value is passed at the end of the argument list, and should be
+a short, a double, or a char * value.  Note that short and double values
+are passed as is, not as pointers.<p>
+
+Note that key values aren't actually flushed to the file until
+GTIFWriteKeys() is called.  Till then 
+the new values are just kept with the GTIF structure.<p>
+
+<b>Example:</b><p>
+
+<pre>
+    GTIFKeySet(gtif, GTRasterTypeGeoKey, TYPE_SHORT, 1, 
+               RasterPixelIsArea);
+    GTIFKeySet(gtif, GTCitationGeoKey, TYPE_ASCII, 0, 
+               "UTM 11 North / NAD27" );
+</pre>
+
+ */
+
+int GTIFKeySet(GTIF *gtif, geokey_t keyID, tagtype_t type, int count,...)
+{
+    va_list ap;
+    int index = gtif->gt_keyindex[ keyID ];
+    int newvalues = 0;
+    GeoKey *key;
+    char *data = NULL;
+    char *val;
+    pinfo_t sval;
+    double dval;
+
+    va_start(ap, count);
+    /* pass singleton keys by value */
+    if (count>1 && type!=TYPE_ASCII) 
+    {
+        val = va_arg(ap, char*);
+    }
+    else if( count == -1 )
+    {
+        /* delete the indicated tag */
+        va_end(ap);
+
+        if( index < 1 )
+            return 0;
+
+        if (gtif->gt_keys[index].gk_type == TYPE_ASCII)
+        {
+            _GTIFFree (gtif->gt_keys[index].gk_data);
+        }
+
+        while( index < gtif->gt_num_keys )
+        {
+            _GTIFmemcpy( gtif->gt_keys + index, 
+                         gtif->gt_keys + index + 1, 
+                         sizeof(GeoKey) );
+            gtif->gt_keyindex[gtif->gt_keys[index].gk_key] = index;
+            index++;
+        }
+
+        gtif->gt_num_keys--;
+        gtif->gt_nshorts -= sizeof(KeyEntry)/sizeof(pinfo_t);
+        gtif->gt_keyindex[keyID] = 0;
+        gtif->gt_flags |= FLAG_FILE_MODIFIED;
+
+        return 1;
+    }
+    else switch (type)
+    {
+        case TYPE_SHORT:  sval=va_arg(ap, int); val=(char *)&sval;     break;
+        case TYPE_DOUBLE: dval=va_arg(ap, dblparam_t); val=(char *)&dval;  break;
+        case TYPE_ASCII: 
+            val=va_arg(ap, char*);
+            count = strlen(val) + 1; /* force = string length */
+            break;
+        default:
+            assert( FALSE );
+            break;
+    }
+    va_end(ap);
+    
+    /* We assume here that there are no multi-valued SHORTS ! */
+    if (index)
+    {
+        /* Key already exists */
+        key = gtif->gt_keys+index;
+        if (type!=key->gk_type || count > key->gk_count)
+        {
+            /* need to reset data pointer */
+            key->gk_type = type;
+            key->gk_count = count;
+            key->gk_size = _gtiff_size[ type ];
+            newvalues = 1;
+        }
+    }
+    else
+    {
+        /* We need to create the key */
+        if (gtif->gt_num_keys == MAX_KEYS) return 0;
+        key = gtif->gt_keys + ++gtif->gt_num_keys;
+        index = gtif->gt_num_keys;
+        gtif->gt_keyindex[ keyID ] = index;
+        key->gk_key = keyID;
+        key->gk_type = type;
+        key->gk_count = count;
+        key->gk_size = _gtiff_size[ type ];
+        if (gtif->gt_keymin > keyID)  gtif->gt_keymin=keyID;
+        if (gtif->gt_keymax < keyID)  gtif->gt_keymax=keyID;
+        newvalues = 1;
+    }
+
+    if (newvalues)
+    {
+        switch (type)
+        {
+        case TYPE_SHORT:  
+            if (count > 1) return 0;
+            data = (char *)&key->gk_data; /* store value *in* data */
+            break;
+        case TYPE_DOUBLE:
+            key->gk_data = (char *)(gtif->gt_double + gtif->gt_ndoubles);
+            data = key->gk_data;
+            gtif->gt_ndoubles += count;
+            break;
+        case TYPE_ASCII:
+            break;
+        default:
+            va_end(ap);
+            return 0;
+        }
+        gtif->gt_nshorts += sizeof(KeyEntry)/sizeof(pinfo_t);
+    }
+
+        /* this fixes a bug where if a request is made to write a duplicate
+           key, we must initialize the data to a valid value.
+           Bryan Wells (bryan at athena.bangor.autometric.com) */
+        
+        else /* no new values, but still have something to write */
+        {
+            switch (type)
+            {
+            case TYPE_SHORT:  
+                if (count > 1) return 0;
+                data = (char *)&key->gk_data; /* store value *in* data */
+                break;
+            case TYPE_DOUBLE:
+                data = key->gk_data;
+                break;
+            case TYPE_ASCII:
+                break;
+            default:
+                return 0;
+            }
+        }
+        
+    switch (type)
+    {
+    case TYPE_ASCII:
+        /* throw away existing data and allocate room for new data */
+        if (key->gk_data != 0)
+        {
+            _GTIFFree(key->gk_data);
+        }
+        key->gk_data = (char *)_GTIFcalloc(count);
+        key->gk_count = count;
+        data = key->gk_data;
+        break;
+    default:
+        break;
+    }
+
+    _GTIFmemcpy(data, val, count*key->gk_size);
+    
+    gtif->gt_flags |= FLAG_FILE_MODIFIED;
+    return 1;
+}
diff --git a/src/tiff/geo_tiffp.c b/src/tiff/geo_tiffp.c
new file mode 100644
index 0000000..895486d
--- /dev/null
+++ b/src/tiff/geo_tiffp.c
@@ -0,0 +1,140 @@
+/**********************************************************************
+ *
+ *  geo_tiffp.c  Private TIFF interface module for GEOTIFF
+ *
+ *    This module implements the interface between the GEOTIFF
+ *    tag parser and the TIFF i/o module. The current setup
+ *    relies on the "libtiff" code, but if you use your own
+ *    TIFF reader software, you may replace the module implementations
+ *    here with your own calls. No "libtiff" dependencies occur
+ *    anywhere else in this code.
+ *
+ **********************************************************************/
+ 
+#include "geotiff.h"    /* public GTIFF interface */
+
+#include "geo_tiffp.h"  /* Private TIFF interface */
+#include "geo_keyp.h"   /* Private GTIFF interface */
+
+/* tiff size array global */
+gsize_t _gtiff_size[] = { 0, 1, 2, 4, 8, 1, 4, 8, 1, 2, 4, 1 };
+
+static int        _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *value );
+static int        _GTIFSetField (tiff_t *tif, pinfo_t tag, int  count, void *value );
+static tagtype_t  _GTIFTagType  (tiff_t *tif, pinfo_t tag);
+
+/*
+ * Set up default TIFF handlers. 
+ */
+void _GTIFSetDefaultTIFF(TIFFMethod *method)
+{
+	if (!method) return;
+	
+	method->get = _GTIFGetField;
+	method->set = _GTIFSetField;
+	method->type = _GTIFTagType;
+}
+
+gdata_t _GTIFcalloc(gsize_t size)
+{
+    gdata_t data=(gdata_t)_TIFFmalloc((tsize_t)size);
+	if (data) _TIFFmemset((tdata_t)data,0,(tsize_t)size);
+	return data;
+}
+
+gdata_t _GTIFrealloc(gdata_t ptr, gsize_t size)
+{
+    return( _TIFFrealloc((tdata_t)ptr, (tsize_t) size) );
+}
+
+void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size)
+{
+	_TIFFmemcpy((tdata_t)out,(tdata_t)in,(tsize_t)size);
+}
+
+void _GTIFFree(gdata_t data)
+{
+	if (data) _TIFFfree((tdata_t)data);
+}
+
+
+
+/* returns the value of TIFF tag <tag>, or if
+ * the value is an array, returns an allocated buffer
+ * containing the values. Allocate a copy of the actual
+ * buffer, sized up for updating.
+ */
+static int _GTIFGetField (tiff_t *tif, pinfo_t tag, int *count, void *val )
+{
+	int status;
+	unsigned short scount=0;
+	char *tmp;
+	char *value;
+	gsize_t size = _gtiff_size[_GTIFTagType (tif,tag)];
+	
+	if (_GTIFTagType(tif,  tag) == TYPE_ASCII)
+	{
+		status = TIFFGetField((TIFF *)tif,tag,&tmp);
+		if (!status) return status;
+		scount = strlen(tmp)+1;
+	}
+	else status = TIFFGetField((TIFF *)tif,tag,&scount,&tmp);
+	if (!status) return status;
+	
+	*count = scount;
+
+	value = (char *)_GTIFcalloc( (scount+MAX_VALUES)*size);
+	if (!value) return 0;
+	
+	_TIFFmemcpy( value, tmp,  size * scount);
+	
+	*(char **)val = value;
+	return status;
+}
+
+/* 
+ * Set a GeoTIFF TIFF field.
+ */
+static int _GTIFSetField (tiff_t *tif, pinfo_t tag, int count, void *value )
+{
+	int status;
+	unsigned short scount = count;
+
+	/* libtiff ASCII uses null-delimiter */
+	if (_GTIFTagType(tif,  tag) == TYPE_ASCII)
+		status = TIFFSetField((TIFF *)tif,tag,value);
+	else 
+		status = TIFFSetField((TIFF *)tif,tag,scount,value);
+	return status;
+}
+
+
+/*
+ *  This routine is supposed to return the TagType of the <tag>
+ *  TIFF tag. Unfortunately, "libtiff" does not provide this
+ *  service by default, so we just have to "know" what type of tags
+ *  we've got, and how many. We only define the ones Geotiff
+ *  uses here, and others return UNKNOWN. The "tif" parameter
+ *  is provided for those TIFF implementations that provide
+ *  for tag-type queries.
+ */
+static tagtype_t  _GTIFTagType  (tiff_t *tif, pinfo_t tag)
+{
+	tagtype_t ttype;
+
+	(void) tif; /* dummy reference */
+	
+	switch (tag)
+	{
+		case GTIFF_ASCIIPARAMS:    ttype=TYPE_ASCII; break;
+		case GTIFF_PIXELSCALE:
+		case GTIFF_TRANSMATRIX:
+		case GTIFF_TIEPOINTS:
+		case GTIFF_DOUBLEPARAMS:   ttype=TYPE_DOUBLE; break;
+		case GTIFF_GEOKEYDIRECTORY: ttype=TYPE_SHORT; break;
+		default: ttype = TYPE_UNKNOWN;
+	}
+	
+	return ttype;
+}
+
diff --git a/src/tiff/geo_tiffp.h b/src/tiff/geo_tiffp.h
new file mode 100644
index 0000000..4cf2ec8
--- /dev/null
+++ b/src/tiff/geo_tiffp.h
@@ -0,0 +1,113 @@
+/**********************************************************************
+ *
+ *  geo_tiffp.h - Private interface for TIFF tag parsing.
+ *
+ *   Written by: Niles D. Ritter
+ *
+ *   This interface file encapsulates the interface to external TIFF
+ *   file-io routines and definitions. The current configuration
+ *   assumes that the "libtiff" module is used, but if you have your
+ *   own TIFF reader, you may replace the definitions with your own
+ *   here, and replace the implementations in geo_tiffp.c. No other
+ *   modules have any explicit dependence on external TIFF modules.
+ *
+ *  Revision History;
+ *
+ *    20 June, 1995      Niles D. Ritter         New
+ *    6 July,  1995      Niles D. Ritter         Fix prototypes
+ *
+ **********************************************************************/
+
+#ifndef __geo_tiffp_h_
+#define __geo_tiffp_h_
+
+/**********************************************************************
+ *
+ *                        Private includes
+ *
+ *   If you are not using libtiff and XTIFF, replace this include file
+ *    with the appropriate one for your own TIFF parsing routines.
+ *
+ *   Revision History
+ * 
+ *      19 September 1995   ndr    Demoted Intergraph trans matrix.
+ *
+ **********************************************************************/
+
+#include "geotiff.h"
+#include "xtiffio.h"
+
+/*
+ * dblparam_t is the type that a double precision
+ * floating point value will have on the parameter
+ * stack (when coerced by the compiler). You shouldn't
+ * have to change this.
+ */
+#ifdef applec
+typedef extended dblparam_t;
+#else
+typedef double dblparam_t;
+#endif
+
+
+/**********************************************************************
+ *
+ *                        Private defines
+ *
+ *   If you are not using "libtiff"/LIBXTIFF, replace these definitions
+ *   with the appropriate definitions to access the geo-tags
+ *
+ **********************************************************************/
+ 
+typedef unsigned short pinfo_t;    /* SHORT ProjectionInfo tag type */
+typedef TIFF    tiff_t;            /* TIFF file descriptor          */
+typedef tdata_t  gdata_t;          /* pointer to data */
+typedef tsize_t  gsize_t;          /* data allocation size */
+ 
+#define GTIFF_GEOKEYDIRECTORY   TIFFTAG_GEOKEYDIRECTORY /* from xtiffio.h */
+#define GTIFF_DOUBLEPARAMS      TIFFTAG_GEODOUBLEPARAMS
+#define GTIFF_ASCIIPARAMS       TIFFTAG_GEOASCIIPARAMS
+#define GTIFF_PIXELSCALE        TIFFTAG_GEOPIXELSCALE
+#define GTIFF_TRANSMATRIX       TIFFTAG_GEOTRANSMATRIX
+#define GTIFF_INTERGRAPH_MATRIX TIFFTAG_INTERGRAPH_MATRIX
+#define GTIFF_TIEPOINTS         TIFFTAG_GEOTIEPOINTS
+#define GTIFF_LOCAL          0
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+/*
+ * Method function pointer types
+ */
+typedef int        (*GTGetFunction) (tiff_t *tif, pinfo_t tag, int *count, void *value );
+typedef int        (*GTSetFunction) (tiff_t *tif, pinfo_t tag, int  count, void *value );
+typedef tagtype_t  (*GTTypeFunction) (tiff_t *tif, pinfo_t tag);
+typedef struct     _TIFFMethod {
+	GTGetFunction get;
+	GTSetFunction set;
+	GTTypeFunction type;
+} TIFFMethod;
+
+/**********************************************************************
+ *
+ *               Protected Function Declarations  
+ *
+ *   These routines are exposed implementations, and should not
+ *   be used by external GEOTIFF client programs.
+ *
+ **********************************************************************/
+
+extern gsize_t _gtiff_size[]; /* TIFF data sizes */
+extern void _GTIFSetDefaultTIFF(TIFFMethod *method);
+extern gdata_t _GTIFcalloc(gsize_t);
+extern gdata_t _GTIFrealloc(gdata_t,gsize_t);
+extern void _GTIFFree(gdata_t data);
+extern void _GTIFmemcpy(gdata_t out,gdata_t in,gsize_t size);
+
+#if defined(__cplusplus)
+} 
+#endif
+
+
+#endif /* __geo_tiffp_h_ */
diff --git a/src/tiff/geo_trans.c b/src/tiff/geo_trans.c
new file mode 100644
index 0000000..3d5b6eb
--- /dev/null
+++ b/src/tiff/geo_trans.c
@@ -0,0 +1,326 @@
+/******************************************************************************
+ * $Id: geo_trans.c,v 1.3 2004/03/19 11:51:24 lubia Exp $
+ *
+ * Project:  libgeotiff
+ * Purpose:  Code to abstract translation between pixel/line and PCS
+ *           coordinates.
+ * Author:   Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: geo_trans.c,v $
+ * Revision 1.3  2004/03/19 11:51:24  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.9  2001/11/28 14:20:30  warmerda
+ * fixed transform memory leak in GTIFPCSToImage
+ *
+ * Revision 1.8  2001/04/06 16:56:22  warmerda
+ * added support for PCSToImage with matrix
+ *
+ * Revision 1.7  2001/03/05 03:25:23  warmerda
+ * restructure cleanup, and apply to GTIFPCSToImage()
+ *
+ * Revision 1.6  2001/03/04 22:37:39  warmerda
+ * fixed memory leak for fields fetched with gt_methods.get - Alan Gray
+ *
+ * Revision 1.5  2000/08/22 03:32:46  warmerda
+ * removed GTIFTiepointTranslate code
+ *
+ * Revision 1.4  1999/09/17 01:19:51  warmerda
+ * Fixed bug in use of transform matrix.
+ *
+ * Revision 1.3  1999/09/16 21:25:40  warmerda
+ * Added tiepoint, and transformation matrix based translation.  Note
+ * that we don't try to invert the transformation matrix for
+ * GTIFPCSToImage().
+ *
+ * Revision 1.2  1999/09/07 20:00:40  warmerda
+ * Fixed count/tiepoint_count bug in GTIFPCSToImage().
+ *
+ * Revision 1.1  1999/05/04 03:07:57  warmerda
+ * New
+ *
+ */
+ 
+#include "geotiff.h"
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+#include "geokeys.h"
+
+/************************************************************************/
+/*                          inv_geotransform()                          */
+/*                                                                      */
+/*      Invert a 6 term geotransform style matrix.                      */
+/************************************************************************/
+
+static int inv_geotransform( double *gt_in, double *gt_out )
+
+{
+    double	det, inv_det;
+
+    /* we assume a 3rd row that is [0 0 1] */
+
+    /* Compute determinate */
+
+    det = gt_in[0] * gt_in[4] - gt_in[1] * gt_in[3];
+
+    if( fabs(det) < 0.000000000000001 )
+        return 0;
+
+    inv_det = 1.0 / det;
+
+    /* compute adjoint, and devide by determinate */
+
+    gt_out[0] =  gt_in[4] * inv_det;
+    gt_out[3] = -gt_in[3] * inv_det;
+
+    gt_out[1] = -gt_in[1] * inv_det;
+    gt_out[4] =  gt_in[0] * inv_det;
+
+    gt_out[2] = ( gt_in[1] * gt_in[5] - gt_in[2] * gt_in[4]) * inv_det;
+    gt_out[5] = (-gt_in[0] * gt_in[5] + gt_in[2] * gt_in[3]) * inv_det;
+
+    return 1;
+}
+
+/************************************************************************/
+/*                       GTIFTiepointTranslate()                        */
+/************************************************************************/
+
+int GTIFTiepointTranslate( int gcp_count, double * gcps_in, double * gcps_out,
+                           double x_in, double y_in,
+                           double *x_out, double *y_out )
+
+{
+    /* I would appreciate a _brief_ block of code for doing second order
+       polynomial regression here! */
+    return FALSE;
+}
+
+
+/************************************************************************/
+/*                           GTIFImageToPCS()                           */
+/************************************************************************/
+
+/**
+ * Translate a pixel/line coordinate to projection coordinates.
+ *
+ * At this time this function does not support image to PCS translations for
+ * tiepoints-only definitions,  only pixelscale and transformation matrix
+ * formulations.
+ *
+ * @param gtif The handle from GTIFNew() indicating the target file.
+ * @param x A pointer to the double containing the pixel offset on input,
+ * and into which the easting/longitude will be put on completion.
+ * @param y A pointer to the double containing the line offset on input,
+ * and into which the northing/latitude will be put on completion.
+ *
+ * @return TRUE if the transformation succeeds, or FALSE if it fails.  It may
+ * fail if the file doesn't have properly setup transformation information,
+ * or it is in a form unsupported by this function.
+ */
+
+int GTIFImageToPCS( GTIF *gtif, double *x, double *y )
+
+{
+    int     res = FALSE;
+    int     tiepoint_count, count, transform_count;
+    tiff_t *tif=gtif->gt_tif;
+    double *tiepoints   = 0;
+    double *pixel_scale = 0;
+    double *transform   = 0;
+
+
+    if (!(gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS,
+                              &tiepoint_count, &tiepoints ))
+        tiepoint_count = 0;
+
+    if (!(gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixel_scale ))
+        count = 0;
+
+    if (!(gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX,
+                                &transform_count, &transform ))
+        transform_count = 0;
+
+/* -------------------------------------------------------------------- */
+/*      If the pixelscale count is zero, but we have tiepoints use      */
+/*      the tiepoint based approach.                                    */
+/* -------------------------------------------------------------------- */
+    if( tiepoint_count > 6 && count == 0 ) 
+    {
+        res = GTIFTiepointTranslate( tiepoint_count / 6,
+                                     tiepoints, tiepoints + 3,
+                                     *x, *y, x, y );
+    }
+
+/* -------------------------------------------------------------------- */
+/*	If we have a transformation matrix, use it. 			*/
+/* -------------------------------------------------------------------- */
+    else if( transform_count == 16 ) 
+    {
+        double x_in = *x, y_in = *y;
+
+        *x = x_in * transform[0] + y_in * transform[1] + transform[3];
+        *y = x_in * transform[4] + y_in * transform[5] + transform[7];
+        
+        res = TRUE;
+    } 
+
+/* -------------------------------------------------------------------- */
+/*      For now we require one tie point, and a valid pixel scale.      */
+/* -------------------------------------------------------------------- */
+    else if( count < 3 || tiepoint_count < 6 ) 
+    {
+        res = FALSE;
+    } 
+
+    else 
+    {
+        *x = (*x - tiepoints[0]) * pixel_scale[0] + tiepoints[3];
+        *y = (*y - tiepoints[1]) * (-1 * pixel_scale[1]) + tiepoints[4];
+
+        res = TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Cleanup                                                         */
+/* -------------------------------------------------------------------- */
+    if(tiepoints)   
+        _GTIFFree(tiepoints);
+    if(pixel_scale)
+        _GTIFFree(pixel_scale);
+    if(transform)  
+        _GTIFFree(transform);
+
+    return res;
+}
+
+/************************************************************************/
+/*                           GTIFPCSToImage()                           */
+/************************************************************************/
+
+/**
+ * Translate a projection coordinate to pixel/line coordinates.
+ *
+ * At this time this function does not support PCS to image translations for
+ * tiepoints-only based definitions, only matrix and pixelscale/tiepoints 
+ * formulations are supposed.
+ *
+ * @param gtif The handle from GTIFNew() indicating the target file.
+ * @param x A pointer to the double containing the pixel offset on input,
+ * and into which the easting/longitude will be put on completion.
+ * @param y A pointer to the double containing the line offset on input,
+ * and into which the northing/latitude will be put on completion.
+ *
+ * @return TRUE if the transformation succeeds, or FALSE if it fails.  It may
+ * fail if the file doesn't have properly setup transformation information,
+ * or it is in a form unsupported by this function.
+ */
+
+int GTIFPCSToImage( GTIF *gtif, double *x, double *y )
+
+{
+    double 	*tiepoints = NULL;
+    int 	tiepoint_count, count, transform_count = 0;
+    double	*pixel_scale = NULL;
+    double 	*transform   = NULL;
+    tiff_t 	*tif=gtif->gt_tif;
+    int		result = FALSE;
+
+/* -------------------------------------------------------------------- */
+/*      Fetch tiepoints and pixel scale.                                */
+/* -------------------------------------------------------------------- */
+    if (!(gtif->gt_methods.get)(tif, GTIFF_TIEPOINTS,
+                              &tiepoint_count, &tiepoints ))
+        tiepoint_count = 0;
+
+    if (!(gtif->gt_methods.get)(tif, GTIFF_PIXELSCALE, &count, &pixel_scale ))
+        count = 0;
+
+    if (!(gtif->gt_methods.get)(tif, GTIFF_TRANSMATRIX,
+                                &transform_count, &transform ))
+        transform_count = 0;
+
+/* -------------------------------------------------------------------- */
+/*      If the pixelscale count is zero, but we have tiepoints use      */
+/*      the tiepoint based approach.                                    */
+/* -------------------------------------------------------------------- */
+    if( tiepoint_count > 6 && count == 0 )
+    {
+        result = GTIFTiepointTranslate( tiepoint_count / 6,
+                                        tiepoints + 3, tiepoints,
+                                        *x, *y, x, y );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Handle matrix - convert to "geotransform" format, invert and    */
+/*      apply.                                                          */
+/* -------------------------------------------------------------------- */
+    else if( transform_count == 16 )
+    {
+        double  x_in = *x, y_in = *y;
+        double	gt_in[6], gt_out[6];
+        
+        gt_in[0] = transform[0];
+        gt_in[1] = transform[1];
+        gt_in[2] = transform[3];
+        gt_in[3] = transform[4];
+        gt_in[4] = transform[5];
+        gt_in[5] = transform[7];
+
+        if( !inv_geotransform( gt_in, gt_out ) )
+            result = FALSE;
+        else
+        {
+            *x = x_in * gt_out[0] + y_in * gt_out[1] + gt_out[2];
+            *y = x_in * gt_out[3] + y_in * gt_out[4] + gt_out[5];
+            
+            result = TRUE;
+        }
+    }
+
+/* -------------------------------------------------------------------- */
+/*      For now we require one tie point, and a valid pixel scale.      */
+/* -------------------------------------------------------------------- */
+    else if( count >= 3 && tiepoint_count >= 6 )
+    {
+        *x = (*x - tiepoints[3]) / pixel_scale[0] + tiepoints[0];
+        *y = (*y - tiepoints[4]) / (-1 * pixel_scale[1]) + tiepoints[1];
+
+        result = TRUE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Cleanup.                                                        */
+/* -------------------------------------------------------------------- */
+    if(tiepoints)   
+        _GTIFFree(tiepoints);
+    if(pixel_scale)
+        _GTIFFree(pixel_scale);
+    if(transform)  
+        _GTIFFree(transform);
+
+    return result;
+}
+
diff --git a/src/tiff/geo_write.c b/src/tiff/geo_write.c
new file mode 100644
index 0000000..4eedda2
--- /dev/null
+++ b/src/tiff/geo_write.c
@@ -0,0 +1,190 @@
+/**********************************************************************
+ *
+ *  geo_write.c  -- Public routines for GEOTIFF GeoKey access.
+ *
+ *    Written By: Niles D. Ritter.
+ *
+ *  copyright (c) 1995   Niles D. Ritter
+ *
+ *  Permission granted to use this software, so long as this copyright
+ *  notice accompanies any source code derived therefrom.
+ *
+ **********************************************************************/
+
+#include "geotiffio.h"   /* public interface        */
+#include "geo_tiffp.h" /* external TIFF interface */
+#include "geo_keyp.h"  /* private interface       */
+
+static int WriteKey(GTIF* gt, TempKeyData* tempData,
+                    KeyEntry* entptr, GeoKey* keyptr);
+static int SortKeys(GTIF* gt,int *sortkeys);
+
+
+/**
+This function flushes all the GeoTIFF keys that have been set with the 
+GTIFKeySet() function into the associated 
+TIFF file.
+
+ at param gt The GeoTIFF handle returned by GTIFNew.
+
+GTIFKeySet() should be called before 
+GTIFFree() is used to deallocate a GeoTIFF access handle.
+ */
+
+int GTIFWriteKeys(GTIF *gt)
+{
+    int i;
+    GeoKey *keyptr;
+    KeyEntry *entptr;
+    KeyHeader *header;
+    TempKeyData tempData;
+    int sortkeys[MAX_KEYS];
+	
+    if (!(gt->gt_flags & FLAG_FILE_MODIFIED)) return 1;
+	
+    tempData.tk_asciiParams = 0;
+    tempData.tk_asciiParamsLength = 0;
+    tempData.tk_asciiParamsOffset = 0;
+
+    /*  Sort the Keys into numerical order */
+    if (!SortKeys(gt,sortkeys))
+    {
+        /* XXX error: a key was not recognized */
+    }
+	
+    /* Set up header of ProjectionInfo tag */
+    header = (KeyHeader *)gt->gt_short;
+    header->hdr_num_keys = gt->gt_num_keys;
+    header->hdr_version  = GvCurrentVersion;
+    header->hdr_rev_major  = GvCurrentRevision;
+    header->hdr_rev_minor  = GvCurrentMinorRev;
+	
+    /* Sum up the ASCII tag lengths */
+    for (i = 0; i < gt->gt_num_keys; i++)
+    {
+        keyptr = gt->gt_keys + sortkeys[i];
+        if (keyptr->gk_type == TYPE_ASCII)
+        {
+            tempData.tk_asciiParamsLength += keyptr->gk_count;
+        }
+    }
+    if (tempData.tk_asciiParamsLength > 0)
+    {
+        tempData.tk_asciiParams =
+            (char *)_GTIFcalloc(tempData.tk_asciiParamsLength + 1);
+        tempData.tk_asciiParams[tempData.tk_asciiParamsLength] = '\0';
+    }
+
+    /* Set up the rest of SHORT array properly */
+    keyptr = gt->gt_keys;
+    entptr = (KeyEntry*)(gt->gt_short + 4);
+    for (i=0; i< gt->gt_num_keys; i++,entptr++)
+    {
+        if (!WriteKey(gt,&tempData,entptr,keyptr+sortkeys[i])) return 0;
+    }	
+	
+    /* Write out the Key Directory */
+    (gt->gt_methods.set)(gt->gt_tif, GTIFF_GEOKEYDIRECTORY, gt->gt_nshorts, gt->gt_short );	
+	
+    /* Write out the params directories */
+    if (gt->gt_ndoubles)
+        (gt->gt_methods.set)(gt->gt_tif, GTIFF_DOUBLEPARAMS, gt->gt_ndoubles, gt->gt_double );
+    if (tempData.tk_asciiParamsLength > 0)
+    {
+        /* just to be safe */
+        tempData.tk_asciiParams[tempData.tk_asciiParamsLength] = '\0';
+        (gt->gt_methods.set)(gt->gt_tif,
+                             GTIFF_ASCIIPARAMS, 0, tempData.tk_asciiParams);
+    }
+	
+    gt->gt_flags &= ~FLAG_FILE_MODIFIED;
+
+    if (tempData.tk_asciiParamsLength > 0)
+    {
+        _GTIFFree (tempData.tk_asciiParams);
+    }
+    return 1;
+}
+
+/**********************************************************************
+ *
+ *                        Private Routines
+ *
+ **********************************************************************/
+ 
+/*
+ * Given GeoKey, write out the KeyEntry entries, returning 0 if failure.
+ *  This is the exact complement of ReadKey().
+ */
+
+static int WriteKey(GTIF* gt, TempKeyData* tempData,
+                    KeyEntry* entptr, GeoKey* keyptr)
+{
+    int count;
+	
+    entptr->ent_key = keyptr->gk_key;
+    entptr->ent_count = keyptr->gk_count;
+    count = entptr->ent_count;
+	
+    if (count==1 && keyptr->gk_type==TYPE_SHORT)
+    {
+        entptr->ent_location = GTIFF_LOCAL;
+        entptr->ent_val_offset = *(pinfo_t*)&keyptr->gk_data;
+        return 1;
+    }
+		  
+    switch (keyptr->gk_type)
+    {
+      case TYPE_SHORT:
+        entptr->ent_location = GTIFF_GEOKEYDIRECTORY;
+        entptr->ent_val_offset = 
+            (pinfo_t*)keyptr->gk_data - gt->gt_short;
+        break;
+      case TYPE_DOUBLE:
+        entptr->ent_location = GTIFF_DOUBLEPARAMS;
+        entptr->ent_val_offset = 
+            (double*)keyptr->gk_data - gt->gt_double;
+        break;
+      case TYPE_ASCII:
+        entptr->ent_location = GTIFF_ASCIIPARAMS;
+        entptr->ent_val_offset = tempData->tk_asciiParamsOffset;
+        _GTIFmemcpy (tempData->tk_asciiParams + tempData->tk_asciiParamsOffset
+                     , keyptr->gk_data, keyptr->gk_count);
+        tempData->tk_asciiParams[tempData->tk_asciiParamsOffset+keyptr->gk_count-1] = '|';
+        tempData->tk_asciiParamsOffset += keyptr->gk_count;
+        break;
+      default:
+        return 0; /* failure */
+    }
+	
+    return 1; /* success */
+}
+
+
+/* 
+ * Numerically sort the GeoKeys.
+ * We just do a linear search through
+ * the list and pull out the keys that were set.
+ */
+
+static int SortKeys(GTIF* gt,int *sortkeys)
+{
+    int loc;
+    int nkeys=0;
+    geokey_t key,kmin,kmax;
+    int *index = gt->gt_keyindex;
+	
+    kmin = (geokey_t) gt->gt_keymin;
+    kmax = (geokey_t) gt->gt_keymax;
+    for (key=kmin; key<=kmax; key++)
+    {
+        if ( (loc=index[key]) != 0 )
+        {
+            sortkeys[nkeys] = loc;
+            nkeys++;
+        }
+    }
+	
+    return nkeys==gt->gt_num_keys;
+}
+
diff --git a/src/tiff/geokeys.h b/src/tiff/geokeys.h
new file mode 100644
index 0000000..f3e47c1
--- /dev/null
+++ b/src/tiff/geokeys.h
@@ -0,0 +1,54 @@
+/**********************************************************************
+ *
+ *  geokeys.h - Public registry for valid GEOTIFF GeoKeys.
+ *
+ *   Written By: Niles D. Ritter
+ *
+ *  Revision History:
+ *
+ *     Rev.#  Author  M/D/Y Date     Key Changes/Additions
+ *     -----  ------  ----------  -------------------------------------
+ *       0      ndr    06/10/95      Inital Beta Release
+ *       1      ndr    09/18/95      Final 1.0 Release
+ *
+ **********************************************************************/
+
+#ifndef __geokeys_h_
+#define __geokeys_h_
+
+/* The GvCurrentRevision number should be incremented whenever a 
+ * new set of Keys are defined or modified in "geokeys.inc", and comments 
+ * added to the "Revision History" section above. If only code
+ * _values_ are augmented, the "GvCurrentMinorRev" number should
+ * be incremented instead (see "geovalues.h"). Whenever the 
+ * GvCurrentRevision is incremented, the GvCurrentMinorRev should
+ * be reset to zero.
+ *
+ *
+ * The Section Numbers below refer to the GeoTIFF Spec sections
+ * in which these values are documented.
+ *
+ */
+#define GvCurrentRevision  1  /* Final 1.0 Release */
+
+#ifdef ValuePair
+#  undef ValuePair
+#endif
+#define ValuePair(name,value)    name = value,
+
+typedef enum {
+   BaseGeoKey   =  1024,               /* First valid code */
+
+#  include "geokeys.inc"         /* geokey database */
+
+   ReservedEndGeoKey  =  32767,
+   
+   /* Key space available for Private or internal use */
+   PrivateBaseGeoKey = 32768,    /* Consistent with TIFF Private tags */
+   PrivateEndGeoKey  = 65535,    
+   
+   EndGeoKey = 65535             /* Largest Possible GeoKey ID */
+} geokey_t;
+
+
+#endif /* __geokeys_h_ */
diff --git a/src/tiff/geokeys.inc b/src/tiff/geokeys.inc
new file mode 100644
index 0000000..286c23c
--- /dev/null
+++ b/src/tiff/geokeys.inc
@@ -0,0 +1,76 @@
+/* GeoTIFF GeoKey Database */
+
+/* Note: Any changes/additions to this database require */
+/* a change in the revision value in geokeys.h          */
+
+/* C database for Geotiff include files.   */
+/* the macro ValuePair() must be defined   */
+/* by the enclosing include file           */
+
+/*  Revised 28 Sep 1995   NDR -- Added Rev. 1.0 aliases. */
+
+/* 6.2.1 GeoTIFF Configuration Keys */
+
+ValuePair(  GTModelTypeGeoKey,	1024) /* Section 6.3.1.1 Codes       */
+ValuePair(  GTRasterTypeGeoKey,	1025) /* Section 6.3.1.2 Codes       */
+ValuePair(  GTCitationGeoKey,	1026) /* documentation */
+
+/* 6.2.2 Geographic CS Parameter Keys */
+
+ValuePair(  GeographicTypeGeoKey,	2048) /* Section 6.3.2.1 Codes     */
+ValuePair(  GeogCitationGeoKey,	2049) /* documentation             */
+ValuePair(  GeogGeodeticDatumGeoKey,	2050) /* Section 6.3.2.2 Codes     */
+ValuePair(  GeogPrimeMeridianGeoKey,	2051) /* Section 6.3.2.4 codes     */
+ValuePair(  GeogLinearUnitsGeoKey,	2052) /* Section 6.3.1.3 Codes     */
+ValuePair(  GeogLinearUnitSizeGeoKey,	2053) /* meters                    */
+ValuePair(  GeogAngularUnitsGeoKey,	2054) /* Section 6.3.1.4 Codes     */
+ValuePair(  GeogAngularUnitSizeGeoKey,	2055) /* radians                   */
+ValuePair(  GeogEllipsoidGeoKey,	2056) /* Section 6.3.2.3 Codes     */
+ValuePair(  GeogSemiMajorAxisGeoKey,	2057) /* GeogLinearUnits           */
+ValuePair(  GeogSemiMinorAxisGeoKey,	2058) /* GeogLinearUnits           */
+ValuePair(  GeogInvFlatteningGeoKey,	2059) /* ratio                     */
+ValuePair(  GeogAzimuthUnitsGeoKey,	2060) /* Section 6.3.1.4 Codes     */
+ValuePair(  GeogPrimeMeridianLongGeoKey,	2061) /* GeoAngularUnit            */
+
+/* 6.2.3 Projected CS Parameter Keys */
+/*    Several keys have been renamed,*/
+/*    and the deprecated names aliased for backward compatibility */
+
+ValuePair(  ProjectedCSTypeGeoKey,	3072)     /* Section 6.3.3.1 codes   */
+ValuePair(  PCSCitationGeoKey,	3073)     /* documentation           */
+ValuePair(  ProjectionGeoKey,	3074)     /* Section 6.3.3.2 codes   */
+ValuePair(  ProjCoordTransGeoKey,	3075)     /* Section 6.3.3.3 codes   */
+ValuePair(  ProjLinearUnitsGeoKey,	3076)     /* Section 6.3.1.3 codes   */
+ValuePair(  ProjLinearUnitSizeGeoKey,	3077)     /* meters                  */
+ValuePair(  ProjStdParallel1GeoKey,	3078)     /* GeogAngularUnit */
+ValuePair(  ProjStdParallelGeoKey,ProjStdParallel1GeoKey) /* ** alias **   */
+ValuePair(  ProjStdParallel2GeoKey,	3079)     /* GeogAngularUnit */
+ValuePair(  ProjNatOriginLongGeoKey,	3080)     /* GeogAngularUnit */
+ValuePair(  ProjOriginLongGeoKey,ProjNatOriginLongGeoKey) /* ** alias **     */
+ValuePair(  ProjNatOriginLatGeoKey,	3081)     /* GeogAngularUnit */
+ValuePair(  ProjOriginLatGeoKey,ProjNatOriginLatGeoKey)   /* ** alias **     */
+ValuePair(  ProjFalseEastingGeoKey,	3082)     /* ProjLinearUnits */
+ValuePair(  ProjFalseNorthingGeoKey,	3083)     /* ProjLinearUnits */
+ValuePair(  ProjFalseOriginLongGeoKey,	3084)     /* GeogAngularUnit */
+ValuePair(  ProjFalseOriginLatGeoKey,	3085)     /* GeogAngularUnit */
+ValuePair(  ProjFalseOriginEastingGeoKey,	3086)     /* ProjLinearUnits */
+ValuePair(  ProjFalseOriginNorthingGeoKey,	3087)     /* ProjLinearUnits */
+ValuePair(  ProjCenterLongGeoKey,	3088)     /* GeogAngularUnit */
+ValuePair(  ProjCenterLatGeoKey,	3089)     /* GeogAngularUnit */
+ValuePair(  ProjCenterEastingGeoKey,	3090)     /* ProjLinearUnits */
+ValuePair(  ProjCenterNorthingGeoKey,	3091)     /* ProjLinearUnits */
+ValuePair(  ProjScaleAtNatOriginGeoKey,	3092)     /* ratio   */
+ValuePair(  ProjScaleAtOriginGeoKey,ProjScaleAtNatOriginGeoKey)  /* ** alias **   */
+ValuePair(  ProjScaleAtCenterGeoKey,	3093)     /* ratio   */
+ValuePair(  ProjAzimuthAngleGeoKey,	3094)     /* GeogAzimuthUnit */
+ValuePair(  ProjStraightVertPoleLongGeoKey, 3095) /* GeogAngularUnit */
+ValuePair(  ProjRectifiedGridAngleGeoKey, 3096)   /* GeogAngularUnit */
+
+/* 6.2.4 Vertical CS Keys */
+   
+ValuePair(  VerticalCSTypeGeoKey,	4096)  /* Section 6.3.4.1 codes   */
+ValuePair(  VerticalCitationGeoKey,	4097)  /* documentation */
+ValuePair(  VerticalDatumGeoKey,	4098)  /* Section 6.3.4.2 codes   */
+ValuePair(  VerticalUnitsGeoKey,	4099)  /* Section 6.3.1 (.x) codes   */
+
+/* End of Data base */
diff --git a/src/tiff/geonames.h b/src/tiff/geonames.h
new file mode 100644
index 0000000..ccedc7d
--- /dev/null
+++ b/src/tiff/geonames.h
@@ -0,0 +1,146 @@
+/*
+ * geonames.h
+ *
+ *  This encapsulates all of the value-naming mechanism of 
+ *  libgeotiff. 
+ *
+ *  Written By: Niles Ritter
+ *
+ *  Revision History:
+ *
+ *      Author     Date     Key Changes/Additions
+ *      ------  ----------  -------------------------------------
+ *      ndr    10 Jun 95     Inital Beta Release
+ *      ndr    28 Jul 95     Added ModelType aliases, Kv aliases.
+ */
+
+#ifndef __geonames_h
+#define __geonames_h
+
+struct _KeyInfo {
+	int ki_key;
+	char *ki_name;
+};
+typedef struct _KeyInfo KeyInfo;
+
+/* If memory is a premium, then omitting the 
+ * long name lists may save some space; simply 
+ * #define OMIT_GEOTIFF_NAMES in the compile statement
+ * to remove all key->string translation.
+ */
+#ifdef ValuePair
+#  undef ValuePair
+#endif
+
+#ifndef OMIT_GEOTIFF_NAMES
+#define ValuePair(token,value)  {token,#token},
+#else
+#define ValuePair(token,value)
+#endif
+
+#define END_LIST { -1, (char *)0}
+
+/************************************************************
+ *         6.2.x GeoTIFF Keys
+ ************************************************************/
+
+static KeyInfo _keyInfo[] =  {
+#   include "geokeys.inc"   /* geokey database */
+    END_LIST
+};
+
+#define COMMON_VALUES \
+   {KvUndefined, "Undefined"}, \
+   {KvUserDefined,"User-Defined"}, \
+   ValuePair(KvUndefined,KvUndefined) \
+   ValuePair(KvUserDefined,KvUserDefined) 
+
+static KeyInfo _csdefaultValue[] = {
+   COMMON_VALUES
+   END_LIST  
+};
+
+/************************************************************
+ *         6.3.x GeoTIFF Key Values
+ ************************************************************/
+
+static KeyInfo _modeltypeValue[] = {
+   COMMON_VALUES
+    ValuePair(ModelTypeProjected,1)
+    ValuePair(ModelTypeGeographic,2)
+    ValuePair(ModelTypeGeocentric,3)
+    ValuePair(ModelProjected,1)     /* aliases */
+    ValuePair(ModelGeographic,2)    /* aliases */
+    ValuePair(ModelGeocentric,3)    /* aliases */
+   END_LIST  
+};
+
+static KeyInfo _rastertypeValue[] = {
+   COMMON_VALUES
+    ValuePair(RasterPixelIsArea,1)
+    ValuePair(RasterPixelIsPoint,2)
+   END_LIST  
+};
+
+static KeyInfo _geounitsValue[] = {
+   COMMON_VALUES
+#  include "epsg_units.inc"
+   END_LIST  
+};
+
+static KeyInfo _geographicValue[] = {
+   COMMON_VALUES
+#  include "epsg_gcs.inc"
+   END_LIST  
+};
+
+static KeyInfo _geodeticdatumValue[] = {
+   COMMON_VALUES
+#  include "epsg_datum.inc"
+   END_LIST  
+};
+
+static KeyInfo _ellipsoidValue[] = {
+   COMMON_VALUES
+#  include "epsg_ellipse.inc"
+   END_LIST  
+};
+
+static KeyInfo _primemeridianValue[] = {
+   COMMON_VALUES
+#  include "epsg_pm.inc"
+   END_LIST  
+};
+
+static KeyInfo _pcstypeValue[] = {
+   COMMON_VALUES
+#  include "epsg_pcs.inc"
+   END_LIST  
+};
+
+static KeyInfo _projectionValue[] = {
+   COMMON_VALUES
+#  include "epsg_proj.inc"
+   END_LIST  
+};
+
+static KeyInfo _coordtransValue[] = {
+   COMMON_VALUES
+#  include "geo_ctrans.inc"
+   END_LIST  
+};
+
+static KeyInfo _vertcstypeValue[] = {
+   COMMON_VALUES
+#  include "epsg_vertcs.inc"
+   END_LIST  
+};
+
+static KeyInfo _vdatumValue[] = {
+   COMMON_VALUES
+    ValuePair(VDatumBase,1)
+   END_LIST  
+};
+
+#endif /* __geonames_h */
+
diff --git a/src/tiff/geotiff.h b/src/tiff/geotiff.h
new file mode 100644
index 0000000..dc57caf
--- /dev/null
+++ b/src/tiff/geotiff.h
@@ -0,0 +1,117 @@
+/**********************************************************************
+ *
+ *  geotiff.h - Public interface for Geotiff tag parsing.
+ *
+ *
+ *   Written By: Niles D. Ritter
+ *
+ **********************************************************************/
+
+#ifndef __geotiff_h_
+#define __geotiff_h_
+
+/**
+ * \file geotiff.h
+ *
+ * Primary libgeotiff include file.
+ *
+ * This is the defacto registry for valid GEOTIFF GeoKeys
+ * and their associated symbolic values. This is also the only file
+ * of the GeoTIFF library which needs to be included in client source
+ * code.
+ */
+
+/* This Version code should only change if a drastic
+ * alteration is made to the GeoTIFF key structure. Readers
+ * encountering a larger value should give up gracefully.
+ */
+#define GvCurrentVersion   1
+
+#define LIBGEOTIFF_VERSION 1210
+
+#include "geo_config.h"
+#include "geokeys.h"
+
+/**********************************************************************
+ * Do we want to build as a DLL on windows?
+ **********************************************************************/
+#if !defined(CPL_DLL)
+#  if defined(_WIN32) && defined(BUILD_AS_DLL)
+#    define CPL_DLL     __declspec(dllexport)
+#  else
+#    define CPL_DLL
+#  endif
+#endif
+
+/**********************************************************************
+ *
+ *                 Public Structures & Definitions
+ *
+ **********************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+typedef struct gtiff GTIF;   /* struct gtiff is private */
+typedef unsigned short tifftag_t;
+typedef unsigned short geocode_t;
+typedef int (*GTIFPrintMethod)(char *string, void *aux);
+typedef int (*GTIFReadMethod)(char *string, void *aux);
+
+typedef enum {
+   TYPE_BYTE=1,
+   TYPE_SHORT=2,
+   TYPE_LONG=3,
+   TYPE_RATIONAL=4,
+   TYPE_ASCII=5,
+   TYPE_FLOAT=6,
+   TYPE_DOUBLE=7,
+   TYPE_SBYTE=8,
+   TYPE_SSHORT=9,
+   TYPE_SLONG=10,
+   TYPE_UNKNOWN=11
+} tagtype_t;
+
+
+/**********************************************************************
+ *
+ *                 Public Function Declarations
+ *
+ **********************************************************************/
+
+/* TIFF-level interface */
+GTIF CPL_DLL *GTIFNew(void *tif);
+void CPL_DLL  GTIFFree(GTIF *gtif);
+int  CPL_DLL  GTIFWriteKeys(GTIF *gtif);
+void CPL_DLL  GTIFDirectoryInfo(GTIF *gtif, int *versions, int *keycount);
+
+/* GeoKey Access */
+int  CPL_DLL  GTIFKeyInfo(GTIF *gtif, geokey_t key, int *size, tagtype_t* type);
+int  CPL_DLL  GTIFKeyGet(GTIF *gtif, geokey_t key, void *val, int index,
+                         int count);
+int  CPL_DLL  GTIFKeySet(GTIF *gtif, geokey_t keyID, tagtype_t type,
+                         int count,...);
+
+/* Metadata Import-Export utilities */
+void  CPL_DLL  GTIFPrint(GTIF *gtif, GTIFPrintMethod print, void *aux);
+int   CPL_DLL  GTIFImport(GTIF *gtif, GTIFReadMethod scan, void *aux);
+char  CPL_DLL *GTIFKeyName(geokey_t key);
+char  CPL_DLL *GTIFValueName(geokey_t key,int value);
+char  CPL_DLL *GTIFTypeName(tagtype_t type);
+char  CPL_DLL *GTIFTagName(int tag);
+int   CPL_DLL  GTIFKeyCode(char * key);
+int   CPL_DLL  GTIFValueCode(geokey_t key,char *value);
+int   CPL_DLL  GTIFTypeCode(char *type);
+int   CPL_DLL  GTIFTagCode(char *tag);
+
+/* Translation between image/PCS space */
+
+int CPL_DLL    GTIFImageToPCS( GTIF *gtif, double *x, double *y );
+int CPL_DLL    GTIFPCSToImage( GTIF *gtif, double *x, double *y );
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __geotiff_h_ */
diff --git a/src/tiff/geotiff_proj4.c b/src/tiff/geotiff_proj4.c
new file mode 100644
index 0000000..1778d73
--- /dev/null
+++ b/src/tiff/geotiff_proj4.c
@@ -0,0 +1,679 @@
+/******************************************************************************
+ * $Id: geotiff_proj4.c,v 1.3 2004/03/19 11:51:24 lubia Exp $
+ *
+ * Project:  libgeotiff
+ * Purpose:  Code to convert a normalized GeoTIFF definition into a PROJ.4
+ *           (OGDI) compatible projection string.
+ * Author:   Frank Warmerdam, warmerda at home.com
+ *
+ ******************************************************************************
+ * Copyright (c) 1999, Frank Warmerdam
+ *
+ * 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.
+ ******************************************************************************
+ *
+ * $Log: geotiff_proj4.c,v $
+ * Revision 1.3  2004/03/19 11:51:24  lubia
+ * Atualizada as bibliotecas Tif e GeoTif
+ *
+ * Revision 1.19  2002/11/29 20:57:09  warmerda
+ * added LCC1SP mapping
+ *
+ * Revision 1.18  2002/07/09 14:47:53  warmerda
+ * fixed translation of polar stereographic
+ *
+ * Revision 1.17  2001/11/23 19:53:56  warmerda
+ * free PROJ.4 definitions after use
+ *
+ * Revision 1.16  2000/12/05 19:21:45  warmerda
+ * added cassini support
+ *
+ * Revision 1.15  2000/12/05 17:44:41  warmerda
+ * Use +R_A for Miller and VanDerGrinten
+ *
+ * Revision 1.14  2000/10/13 18:06:51  warmerda
+ * added econic support for PROJ.4 translation
+ *
+ * Revision 1.13  2000/09/15 19:30:48  warmerda
+ * *** empty log message ***
+ *
+ * Revision 1.12  2000/09/15 18:21:07  warmerda
+ * Fixed order of parameters for LCC 2SP.  When parameters
+ * were read from EPSG CSV files the standard parallels and origin
+ * were mixed up.  This affects alot of state plane zones!
+ *
+ * Revision 1.11  2000/06/06 17:39:45  warmerda
+ * Modify to work with projUV version of library.
+ *
+ * Revision 1.10  1999/07/06 15:05:51  warmerda
+ * Fixed up LCC_1SP notes.
+ *
+ * Revision 1.9  1999/05/04 16:24:49  warmerda
+ * Fixed projection string formating with zones.
+ *
+ * Revision 1.8  1999/05/04 12:27:01  geotiff
+ * only emit proj unsupported warning if DEBUG defined
+ *
+ * Revision 1.7  1999/05/04 03:14:59  warmerda
+ * fixed use of foot instead of ft for units
+ *
+ * Revision 1.6  1999/05/03 17:50:31  warmerda
+ * avoid warnings on IRIX
+ *
+ * Revision 1.5  1999/04/29 23:02:24  warmerda
+ * added mapsys utm test.
+ *
+ * Revision 1.4  1999/03/18 21:35:42  geotiff
+ * Added reprojection functions
+ *
+ * Revision 1.3  1999/03/10 18:11:17  geotiff
+ * Removed comment about this not being the master ... now it is.
+ *
+ * Revision 1.2  1999/03/10 18:10:27  geotiff
+ * Avoid use of cpl_serv.h and CPLStrdup().
+ *
+ * Revision 1.1  1999/03/10 15:20:43  geotiff
+ * New
+ *
+ */
+
+#include "cpl_serv.h"
+#include "geotiff.h"
+#include "geo_normalize.h"
+#include "geovalues.h"
+
+/************************************************************************/
+/*                          GTIFGetProj4Defn()                          */
+/************************************************************************/
+
+char * GTIFGetProj4Defn( GTIFDefn * psDefn )
+
+{
+    char	szProjection[512];
+    char	szUnits[24];
+    double      dfFalseEasting, dfFalseNorthing;
+
+    szProjection[0] = '\0';
+    
+/* ==================================================================== */
+/*      Translate the units of measure.                                 */
+/*                                                                      */
+/*      Note that even with a +units, or +to_meter in effect, it is     */
+/*      still assumed that all the projection parameters are in         */
+/*      meters.                                                         */
+/* ==================================================================== */
+    if( psDefn->UOMLength == Linear_Meter )
+    {
+        strcpy( szUnits, "+units=m " ); 
+    }
+    else if( psDefn->UOMLength == Linear_Foot )
+    {
+        strcpy( szUnits, "+units=ft " );
+    }
+    else if( psDefn->UOMLength == Linear_Foot_US_Survey )
+    {
+        strcpy( szUnits, "+units=us-ft " );
+    }
+    else if( psDefn->UOMLength == Linear_Foot_Indian )
+    {
+        strcpy( szUnits, "+units=ind-ft " );
+    }
+    else if( psDefn->UOMLength == Linear_Link )
+    {
+        strcpy( szUnits, "+units=link " );
+    }
+    else if( psDefn->UOMLength == Linear_Yard_Indian)
+    {
+        strcpy( szUnits, "+units=ind-yd " );
+    }
+    else if( psDefn->UOMLength == Linear_Fathom )
+    {
+        strcpy( szUnits, "+units=fath " );
+    }
+    else if( psDefn->UOMLength == Linear_Mile_International_Nautical )
+    {
+        strcpy( szUnits, "+units=kmi " );
+    }
+    else
+    {
+        sprintf( szUnits, "+to_meter=%.10f", psDefn->UOMLengthInMeters );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      false easting and northing are in meters and that is what       */
+/*      PROJ.4 wants regardless of the linear units.                    */
+/* -------------------------------------------------------------------- */
+    dfFalseEasting = psDefn->ProjParm[5];
+    dfFalseNorthing = psDefn->ProjParm[6];
+    
+/* ==================================================================== */
+/*      Handle general projection methods.                              */
+/* ==================================================================== */
+
+/* -------------------------------------------------------------------- */
+/*      UTM - special case override on transverse mercator so things    */
+/*      will be more meaningful to the user.                            */
+/* -------------------------------------------------------------------- */
+    if( psDefn->MapSys == MapSys_UTM_North )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=utm +zone=%d ",
+                 psDefn->Zone );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Transverse Mercator                                             */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_TransverseMercator )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=tmerc +lat_0=%.9f +lon_0=%.9f +k=%f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[4],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Mercator							*/
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Mercator )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=merc +lat_ts=%.9f +lon_0=%.9f +k=%f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[4],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Cassini/Soldner                                                 */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_CassiniSoldner )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=cass +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Oblique Stereographic - Should this really map onto             */
+/*      Stereographic?                                                  */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_ObliqueStereographic )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=stere +lat_0=%.9f +lon_0=%.9f +k=%f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[4],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Stereographic                                                   */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Stereographic )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=stere +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Polar Stereographic                                             */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_PolarStereographic )
+    {
+        if( psDefn->ProjParm[0] > 0.0 )
+            sprintf( szProjection+strlen(szProjection),
+                     "+proj=stere +lat_0=90 +lat_ts=%.9f +lon_0=%.9f "
+                     "+k=%.9f +x_0=%.3f +y_0=%.3f ",
+                     psDefn->ProjParm[0],
+                     psDefn->ProjParm[1],
+                     psDefn->ProjParm[4],
+                     dfFalseEasting,
+                     dfFalseNorthing );
+        else
+            sprintf( szProjection+strlen(szProjection),
+                     "+proj=stere +lat_0=-90 +lat_ts=%.9f +lon_0=%.9f "
+                     "+k=%.9f +x_0=%.3f +y_0=%.3f ",
+                     psDefn->ProjParm[0],
+                     psDefn->ProjParm[1],
+                     psDefn->ProjParm[4],
+                     dfFalseEasting,
+                     dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Equirectangular                                                 */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Equirectangular )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=eqc +lat_ts=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Gnomonic                                                        */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Gnomonic )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=gnom +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Orthographic                                                    */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Orthographic )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=ortho +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Lambert Azimuthal Equal Area                                    */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_LambertAzimEqualArea )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=laea +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Azimuthal Equidistant                                           */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_AzimuthalEquidistant )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=aeqd +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Miller Cylindrical                                              */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_MillerCylindrical )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=mill +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f +R_A ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Polyconic                                                       */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Polyconic )
+    {
+        sprintf( szProjection+strlen(szProjection),
+           "+proj=poly +lat_0=%.9f +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+
+/* -------------------------------------------------------------------- */
+/*      AlbersEqualArea                                                 */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_AlbersEqualArea )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=aea +lat_1=%.9f +lat_2=%.9f +lat_0=%.9f +lon_0=%.9f"
+                 " +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[2],
+                 psDefn->ProjParm[3],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      EquidistantConic                                                */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_EquidistantConic )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=eqdc +lat_1=%.9f +lat_2=%.9f +lat_0=%.9f +lon_0=%.9f"
+                 " +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[2],
+                 psDefn->ProjParm[3],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Robinson                                                        */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Robinson )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=robin +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      VanDerGrinten                                                   */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_VanDerGrinten )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=vandg +lon_0=%.9f +x_0=%.3f +y_0=%.3f +R_A ",
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Sinusoidal                                                      */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_Sinusoidal )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=sinu +lon_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[1],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      LambertConfConic_2SP                                            */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_LambertConfConic_2SP )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=lcc +lat_0=%.9f +lon_0=%.9f +lat_1=%.9f +lat_2=%.9f "
+                 " +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[2],
+                 psDefn->ProjParm[3],
+                 dfFalseEasting,
+                 dfFalseNorthing );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      LambertConfConic_1SP                                            */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_LambertConfConic_1SP )
+    {
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=lcc +lat_0=%.9f +lat_1=%.9f +lon_0=%.9f"
+                 " +k_0=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[4],
+                 psDefn->ProjParm[5],
+                 psDefn->ProjParm[6] );
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      NewZealandMapGrid                                               */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_NewZealandMapGrid )
+    {
+        /* this appears to be an unsupported formulation with PROJ.4 */
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      Transverse Mercator - south oriented.                           */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_TransvMercator_SouthOriented )
+    {
+        /* this appears to be an unsupported formulation with PROJ.4 */
+    }
+    
+/* -------------------------------------------------------------------- */
+/*      ObliqueMercator (Hotine)                                        */
+/* -------------------------------------------------------------------- */
+    else if( psDefn->CTProjection == CT_ObliqueMercator )
+    {
+        /* not clear how ProjParm[3] - angle from rectified to skewed grid -
+           should be applied ... see the +not_rot flag for PROJ.4.
+           Just ignoring for now. */
+
+        sprintf( szProjection+strlen(szProjection),
+                 "+proj=omerc +lat_0=%.9f +lonc=%.9f +alpha=%.9f"
+                 " +k=%.9f +x_0=%.3f +y_0=%.3f ",
+                 psDefn->ProjParm[0],
+                 psDefn->ProjParm[1],
+                 psDefn->ProjParm[2],
+                 psDefn->ProjParm[4],
+                 psDefn->ProjParm[5],
+                 psDefn->ProjParm[6] );
+    }
+
+/* ==================================================================== */
+/*      Handle ellipsoid information.                                   */
+/* ==================================================================== */
+    if( psDefn->Ellipsoid == Ellipse_WGS_84 )
+        strcat( szProjection, "+ellps=WGS84 " );
+    else if( psDefn->Ellipsoid == Ellipse_Clarke_1866 )
+        strcat( szProjection, "+ellps=clrk66 " );
+    else if( psDefn->Ellipsoid == Ellipse_Clarke_1880 )
+        strcat( szProjection, "+ellps=clrk80 " );
+    else if( psDefn->Ellipsoid == Ellipse_GRS_1980 )
+        strcat( szProjection, "+ellps=GRS80 " );
+    else
+    {
+        if( psDefn->SemiMajor != 0.0 && psDefn->SemiMinor != 0.0 )
+        {
+            sprintf( szProjection+strlen(szProjection),
+                     "+a=%.3f +b=%.3f ",
+                     psDefn->SemiMajor,
+                     psDefn->SemiMinor );
+        }
+    }
+
+    strcat( szProjection, szUnits );
+
+    return( strdup( szProjection ) );
+}
+
+#if !defined(HAVE_LIBPROJ) || !defined(HAVE_PROJECTS_H)
+
+int GTIFProj4ToLatLong( GTIFDefn * psDefn, int nPoints,
+                        double *padfX, double *padfY )
+{
+#ifdef DEBUG    
+    fprintf( stderr,
+             "GTIFProj4ToLatLong() - PROJ.4 support not compiled in.\n" );
+#endif    
+    return FALSE;
+}
+
+int GTIFProj4FromLatLong( GTIFDefn * psDefn, int nPoints,
+                          double *padfX, double *padfY )
+{
+#ifdef DEBUG    
+    fprintf( stderr,
+             "GTIFProj4FromLatLong() - PROJ.4 support not compiled in.\n" );
+#endif    
+    return FALSE;
+}
+#else
+
+#include "projects.h"
+
+#ifdef USE_PROJUV
+#  define UV projUV
+#endif
+
+/************************************************************************/
+/*                        GTIFProj4FromLatLong()                        */
+/*                                                                      */
+/*      Convert lat/long values to projected coordinate for a           */
+/*      particular definition.                                          */
+/************************************************************************/
+
+int GTIFProj4FromLatLong( GTIFDefn * psDefn, int nPoints,
+                          double *padfX, double *padfY )
+
+{
+    char	*pszProjection, **papszArgs;
+    PJ		*psPJ;
+    int		i;
+    
+/* -------------------------------------------------------------------- */
+/*      Get a projection definition.                                    */
+/* -------------------------------------------------------------------- */
+    pszProjection = GTIFGetProj4Defn( psDefn );
+
+    if( pszProjection == NULL )
+        return FALSE;
+
+/* -------------------------------------------------------------------- */
+/*      Parse into tokens for pj_init(), and initialize the projection. */
+/* -------------------------------------------------------------------- */
+    
+    papszArgs = CSLTokenizeStringComplex( pszProjection, " +", TRUE, FALSE );
+    free( pszProjection );
+
+    psPJ = pj_init( CSLCount(papszArgs), papszArgs );
+
+    CSLDestroy( papszArgs );
+
+    if( psPJ == NULL )
+    {
+        return FALSE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Process each of the points.                                     */
+/* -------------------------------------------------------------------- */
+    for( i = 0; i < nPoints; i++ )
+    {
+        UV	sUV;
+
+        sUV.u = padfX[i] * DEG_TO_RAD;
+        sUV.v = padfY[i] * DEG_TO_RAD;
+
+        sUV = pj_fwd( sUV, psPJ );
+
+        padfX[i] = sUV.u;
+        padfY[i] = sUV.v;
+    }
+
+    pj_free( psPJ );
+
+    return TRUE;
+}
+
+/************************************************************************/
+/*                         GTIFProj4ToLatLong()                         */
+/*                                                                      */
+/*      Convert projection coordinates to lat/long for a particular     */
+/*      definition.                                                     */
+/************************************************************************/
+
+int GTIFProj4ToLatLong( GTIFDefn * psDefn, int nPoints,
+                        double *padfX, double *padfY )
+
+{
+    char	*pszProjection, **papszArgs;
+    PJ		*psPJ;
+    int		i;
+    
+/* -------------------------------------------------------------------- */
+/*      Get a projection definition.                                    */
+/* -------------------------------------------------------------------- */
+    pszProjection = GTIFGetProj4Defn( psDefn );
+
+    if( pszProjection == NULL )
+        return FALSE;
+
+/* -------------------------------------------------------------------- */
+/*      Parse into tokens for pj_init(), and initialize the projection. */
+/* -------------------------------------------------------------------- */
+    
+    papszArgs = CSLTokenizeStringComplex( pszProjection, " +", TRUE, FALSE );
+    free( pszProjection );
+
+    psPJ = pj_init( CSLCount(papszArgs), papszArgs );
+
+    CSLDestroy( papszArgs );
+
+    if( psPJ == NULL )
+    {
+        return FALSE;
+    }
+
+/* -------------------------------------------------------------------- */
+/*      Process each of the points.                                     */
+/* -------------------------------------------------------------------- */
+    for( i = 0; i < nPoints; i++ )
+    {
+        UV	sUV;
+
+        sUV.u = padfX[i];
+        sUV.v = padfY[i];
+
+        sUV = pj_inv( sUV, psPJ );
+
+        padfX[i] = sUV.u * RAD_TO_DEG;
+        padfY[i] = sUV.v * RAD_TO_DEG;
+    }
+
+    pj_free( psPJ );
+
+    return TRUE;
+}
+
+
+#endif /* has projects.h and -lproj */
+
diff --git a/src/tiff/geotiffio.h b/src/tiff/geotiffio.h
new file mode 100644
index 0000000..72442b4
--- /dev/null
+++ b/src/tiff/geotiffio.h
@@ -0,0 +1,16 @@
+/* 
+ * geotiffio.h
+ * 
+ * Standard include file for geotiff, including all
+ *  key and code definitions.
+ */
+
+
+#ifndef __geotiffio_h
+#define __geotiffio_h
+
+#include "geotiff.h"  /* public key interface */
+#include "geovalues.h" /* key code definitions */
+
+#endif /* __geotiffio_h */
+
diff --git a/src/tiff/geovalues.h b/src/tiff/geovalues.h
new file mode 100644
index 0000000..625d33a
--- /dev/null
+++ b/src/tiff/geovalues.h
@@ -0,0 +1,120 @@
+/**********************************************************************
+ *
+ *  geovalues.h - Public registry for valid GEOTIFF  key-values.
+ *
+ *   Written By: Niles D. Ritter
+ *
+ *  Revision History:
+ *
+ *     Rev.#  Author     Date     Key Changes/Additions
+ *     -----  ------  ----------  -------------------------------------
+ *      0.1     ndr    10 Jun 95     Inital Beta Release
+ *      0.2     ndr    12 Jul 95     New EPSG Tables installed.
+ *      0.2.1   ndr    28 Jul 95     Added ModelType aliases to Model's
+ *      1.0     ndr    18 Sep 95     Promoted to Revision 1.0
+ *
+ **********************************************************************/
+
+#ifndef __geovalues_h_
+#define __geovalues_h_
+
+/* If code values are added or modified, the "GvCurrentMinorRev" 
+ * number should be incremented here. If new Keys are added, then the
+ * GvCurrentRevision number should be incremented instead, and the
+ * GvCurrentMinorRev should be reset to zero (see "geokeys.h").
+ *
+ * In addition, any changes here should be reflected in "geo_names.c"
+ *
+ */
+ 
+#define GvCurrentMinorRev  0  /* First Major Rev EPSG Code Release  */
+
+
+/*
+ * Universal key values -- defined for consistency
+ */
+#define KvUndefined         0
+#define KvUserDefined   32767
+
+#ifdef ValuePair
+#  undef ValuePair
+#endif
+#define ValuePair(name,value)    name = value,
+
+/*
+ * The section numbers refer to the GeoTIFF Specification section
+ * in which the code values are documented.
+ */
+ 
+/************************************************************
+ *         6.3.1 GeoTIFF General Codes
+ ************************************************************/
+
+/* 6.3.1.1 Model Type Codes */
+typedef enum {
+	ModelTypeProjected  = 1,  /* Projection Coordinate System */
+	ModelTypeGeographic = 2,  /* Geographic latitude-longitude System */
+	ModelTypeGeocentric = 3,   /* Geocentric (X,Y,Z) Coordinate System */
+	ModelProjected  = ModelTypeProjected,   /* alias */
+	ModelGeographic = ModelTypeGeographic,  /* alias */
+	ModelGeocentric = ModelTypeGeocentric   /* alias */
+} modeltype_t;
+
+/* 6.3.1.2 Raster Type Codes */
+typedef enum {
+	RasterPixelIsArea   = 1,  /* Standard pixel-fills-grid-cell */
+	RasterPixelIsPoint  = 2   /* Pixel-at-grid-vertex */
+} rastertype_t;
+
+typedef enum {
+#  include "epsg_gcs.inc"
+  geographic_end
+} geographic_t;
+
+typedef enum {
+#  include "epsg_datum.inc"
+   geodeticdatum_end
+} geodeticdatum_t;
+
+typedef enum {
+#  include "epsg_units.inc"
+   Unit_End
+} geounits_t;
+
+typedef enum {
+#  include "epsg_ellipse.inc"
+    ellipsoid_end
+} ellipsoid_t;
+
+typedef enum {
+#  include "epsg_pm.inc"
+   primemeridian_end
+} primemeridian_t;
+
+typedef enum {
+#  include "epsg_pcs.inc"
+   pcstype_end
+} pcstype_t;
+
+typedef enum {
+#  include "epsg_proj.inc"
+   projection_end
+} projection_t;
+
+typedef enum {
+#  include "geo_ctrans.inc"
+   coordtrans_end
+} coordtrans_t;
+
+typedef enum {
+#  include "epsg_vertcs.inc"
+   vertcs_end
+} vertcstype_t;
+
+
+typedef enum {
+	VDatumBase = 1
+} vdatum_t;
+
+#endif /* __geovalues_h_ */
+
diff --git a/src/tiff/port.h b/src/tiff/port.h
new file mode 100644
index 0000000..50dafd7
--- /dev/null
+++ b/src/tiff/port.h
@@ -0,0 +1,32 @@
+/*
+ * Warning, this file was automatically created by the TIFF configure script
+ * VERSION:	 v3.4033
+ * DATE:	 Fri Dec 12 17:10:08 EDT 1997
+ * TARGET:	 sparc-sun-solaris2.5.1
+ * CCOMPILER:	 /usr/local/bin/gcc-2.7.2
+ */
+#ifndef _PORT_
+#define _PORT_ 1
+#ifdef __cplusplus
+extern "C" {
+#endif
+#include <sys/types.h>
+#define HOST_FILLORDER FILLORDER_LSB2MSB
+#define HOST_BIGENDIAN	0
+#define HAVE_MMAP 1
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <fcntl.h>
+typedef double dblparam_t;
+#ifdef __STRICT_ANSI__
+#define	INLINE	__inline__
+#else
+#define	INLINE	inline
+#endif
+#define GLOBALDATA(TYPE,NAME)	extern TYPE NAME
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/tiff/t4.h b/src/tiff/t4.h
new file mode 100644
index 0000000..2fb12a2
--- /dev/null
+++ b/src/tiff/t4.h
@@ -0,0 +1,285 @@
+/* $Id: t4.h,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _T4_
+#define	_T4_
+/*
+ * CCITT T.4 1D Huffman runlength codes and
+ * related definitions.  Given the small sizes
+ * of these tables it does not seem
+ * worthwhile to make code & length 8 bits.
+ */
+typedef struct tableentry {
+    unsigned short length;	/* bit length of g3 code */
+    unsigned short code;	/* g3 code */
+    short	runlen;		/* run length in bits */
+} tableentry;
+
+#define	EOL	0x001	/* EOL code value - 0000 0000 0000 1 */
+
+/* status values returned instead of a run length */
+#define	G3CODE_EOL	-1	/* NB: ACT_EOL - ACT_WRUNT */
+#define	G3CODE_INVALID	-2	/* NB: ACT_INVALID - ACT_WRUNT */
+#define	G3CODE_EOF	-3	/* end of input data */
+#define	G3CODE_INCOMP	-4	/* incomplete run code */
+
+/*
+ * Note that these tables are ordered such that the
+ * index into the table is known to be either the
+ * run length, or (run length / 64) + a fixed offset.
+ *
+ * NB: The G3CODE_INVALID entries are only used
+ *     during state generation (see mkg3states.c).
+ */
+#ifdef G3CODES
+const tableentry TIFFFaxWhiteCodes[] = {
+    { 8, 0x35, 0 },	/* 0011 0101 */
+    { 6, 0x7, 1 },	/* 0001 11 */
+    { 4, 0x7, 2 },	/* 0111 */
+    { 4, 0x8, 3 },	/* 1000 */
+    { 4, 0xB, 4 },	/* 1011 */
+    { 4, 0xC, 5 },	/* 1100 */
+    { 4, 0xE, 6 },	/* 1110 */
+    { 4, 0xF, 7 },	/* 1111 */
+    { 5, 0x13, 8 },	/* 1001 1 */
+    { 5, 0x14, 9 },	/* 1010 0 */
+    { 5, 0x7, 10 },	/* 0011 1 */
+    { 5, 0x8, 11 },	/* 0100 0 */
+    { 6, 0x8, 12 },	/* 0010 00 */
+    { 6, 0x3, 13 },	/* 0000 11 */
+    { 6, 0x34, 14 },	/* 1101 00 */
+    { 6, 0x35, 15 },	/* 1101 01 */
+    { 6, 0x2A, 16 },	/* 1010 10 */
+    { 6, 0x2B, 17 },	/* 1010 11 */
+    { 7, 0x27, 18 },	/* 0100 111 */
+    { 7, 0xC, 19 },	/* 0001 100 */
+    { 7, 0x8, 20 },	/* 0001 000 */
+    { 7, 0x17, 21 },	/* 0010 111 */
+    { 7, 0x3, 22 },	/* 0000 011 */
+    { 7, 0x4, 23 },	/* 0000 100 */
+    { 7, 0x28, 24 },	/* 0101 000 */
+    { 7, 0x2B, 25 },	/* 0101 011 */
+    { 7, 0x13, 26 },	/* 0010 011 */
+    { 7, 0x24, 27 },	/* 0100 100 */
+    { 7, 0x18, 28 },	/* 0011 000 */
+    { 8, 0x2, 29 },	/* 0000 0010 */
+    { 8, 0x3, 30 },	/* 0000 0011 */
+    { 8, 0x1A, 31 },	/* 0001 1010 */
+    { 8, 0x1B, 32 },	/* 0001 1011 */
+    { 8, 0x12, 33 },	/* 0001 0010 */
+    { 8, 0x13, 34 },	/* 0001 0011 */
+    { 8, 0x14, 35 },	/* 0001 0100 */
+    { 8, 0x15, 36 },	/* 0001 0101 */
+    { 8, 0x16, 37 },	/* 0001 0110 */
+    { 8, 0x17, 38 },	/* 0001 0111 */
+    { 8, 0x28, 39 },	/* 0010 1000 */
+    { 8, 0x29, 40 },	/* 0010 1001 */
+    { 8, 0x2A, 41 },	/* 0010 1010 */
+    { 8, 0x2B, 42 },	/* 0010 1011 */
+    { 8, 0x2C, 43 },	/* 0010 1100 */
+    { 8, 0x2D, 44 },	/* 0010 1101 */
+    { 8, 0x4, 45 },	/* 0000 0100 */
+    { 8, 0x5, 46 },	/* 0000 0101 */
+    { 8, 0xA, 47 },	/* 0000 1010 */
+    { 8, 0xB, 48 },	/* 0000 1011 */
+    { 8, 0x52, 49 },	/* 0101 0010 */
+    { 8, 0x53, 50 },	/* 0101 0011 */
+    { 8, 0x54, 51 },	/* 0101 0100 */
+    { 8, 0x55, 52 },	/* 0101 0101 */
+    { 8, 0x24, 53 },	/* 0010 0100 */
+    { 8, 0x25, 54 },	/* 0010 0101 */
+    { 8, 0x58, 55 },	/* 0101 1000 */
+    { 8, 0x59, 56 },	/* 0101 1001 */
+    { 8, 0x5A, 57 },	/* 0101 1010 */
+    { 8, 0x5B, 58 },	/* 0101 1011 */
+    { 8, 0x4A, 59 },	/* 0100 1010 */
+    { 8, 0x4B, 60 },	/* 0100 1011 */
+    { 8, 0x32, 61 },	/* 0011 0010 */
+    { 8, 0x33, 62 },	/* 0011 0011 */
+    { 8, 0x34, 63 },	/* 0011 0100 */
+    { 5, 0x1B, 64 },	/* 1101 1 */
+    { 5, 0x12, 128 },	/* 1001 0 */
+    { 6, 0x17, 192 },	/* 0101 11 */
+    { 7, 0x37, 256 },	/* 0110 111 */
+    { 8, 0x36, 320 },	/* 0011 0110 */
+    { 8, 0x37, 384 },	/* 0011 0111 */
+    { 8, 0x64, 448 },	/* 0110 0100 */
+    { 8, 0x65, 512 },	/* 0110 0101 */
+    { 8, 0x68, 576 },	/* 0110 1000 */
+    { 8, 0x67, 640 },	/* 0110 0111 */
+    { 9, 0xCC, 704 },	/* 0110 0110 0 */
+    { 9, 0xCD, 768 },	/* 0110 0110 1 */
+    { 9, 0xD2, 832 },	/* 0110 1001 0 */
+    { 9, 0xD3, 896 },	/* 0110 1001 1 */
+    { 9, 0xD4, 960 },	/* 0110 1010 0 */
+    { 9, 0xD5, 1024 },	/* 0110 1010 1 */
+    { 9, 0xD6, 1088 },	/* 0110 1011 0 */
+    { 9, 0xD7, 1152 },	/* 0110 1011 1 */
+    { 9, 0xD8, 1216 },	/* 0110 1100 0 */
+    { 9, 0xD9, 1280 },	/* 0110 1100 1 */
+    { 9, 0xDA, 1344 },	/* 0110 1101 0 */
+    { 9, 0xDB, 1408 },	/* 0110 1101 1 */
+    { 9, 0x98, 1472 },	/* 0100 1100 0 */
+    { 9, 0x99, 1536 },	/* 0100 1100 1 */
+    { 9, 0x9A, 1600 },	/* 0100 1101 0 */
+    { 6, 0x18, 1664 },	/* 0110 00 */
+    { 9, 0x9B, 1728 },	/* 0100 1101 1 */
+    { 11, 0x8, 1792 },	/* 0000 0001 000 */
+    { 11, 0xC, 1856 },	/* 0000 0001 100 */
+    { 11, 0xD, 1920 },	/* 0000 0001 101 */
+    { 12, 0x12, 1984 },	/* 0000 0001 0010 */
+    { 12, 0x13, 2048 },	/* 0000 0001 0011 */
+    { 12, 0x14, 2112 },	/* 0000 0001 0100 */
+    { 12, 0x15, 2176 },	/* 0000 0001 0101 */
+    { 12, 0x16, 2240 },	/* 0000 0001 0110 */
+    { 12, 0x17, 2304 },	/* 0000 0001 0111 */
+    { 12, 0x1C, 2368 },	/* 0000 0001 1100 */
+    { 12, 0x1D, 2432 },	/* 0000 0001 1101 */
+    { 12, 0x1E, 2496 },	/* 0000 0001 1110 */
+    { 12, 0x1F, 2560 },	/* 0000 0001 1111 */
+    { 12, 0x1, G3CODE_EOL },	/* 0000 0000 0001 */
+    { 9, 0x1, G3CODE_INVALID },	/* 0000 0000 1 */
+    { 10, 0x1, G3CODE_INVALID },	/* 0000 0000 01 */
+    { 11, 0x1, G3CODE_INVALID },	/* 0000 0000 001 */
+    { 12, 0x0, G3CODE_INVALID },	/* 0000 0000 0000 */
+};
+
+const tableentry TIFFFaxBlackCodes[] = {
+    { 10, 0x37, 0 },	/* 0000 1101 11 */
+    { 3, 0x2, 1 },	/* 010 */
+    { 2, 0x3, 2 },	/* 11 */
+    { 2, 0x2, 3 },	/* 10 */
+    { 3, 0x3, 4 },	/* 011 */
+    { 4, 0x3, 5 },	/* 0011 */
+    { 4, 0x2, 6 },	/* 0010 */
+    { 5, 0x3, 7 },	/* 0001 1 */
+    { 6, 0x5, 8 },	/* 0001 01 */
+    { 6, 0x4, 9 },	/* 0001 00 */
+    { 7, 0x4, 10 },	/* 0000 100 */
+    { 7, 0x5, 11 },	/* 0000 101 */
+    { 7, 0x7, 12 },	/* 0000 111 */
+    { 8, 0x4, 13 },	/* 0000 0100 */
+    { 8, 0x7, 14 },	/* 0000 0111 */
+    { 9, 0x18, 15 },	/* 0000 1100 0 */
+    { 10, 0x17, 16 },	/* 0000 0101 11 */
+    { 10, 0x18, 17 },	/* 0000 0110 00 */
+    { 10, 0x8, 18 },	/* 0000 0010 00 */
+    { 11, 0x67, 19 },	/* 0000 1100 111 */
+    { 11, 0x68, 20 },	/* 0000 1101 000 */
+    { 11, 0x6C, 21 },	/* 0000 1101 100 */
+    { 11, 0x37, 22 },	/* 0000 0110 111 */
+    { 11, 0x28, 23 },	/* 0000 0101 000 */
+    { 11, 0x17, 24 },	/* 0000 0010 111 */
+    { 11, 0x18, 25 },	/* 0000 0011 000 */
+    { 12, 0xCA, 26 },	/* 0000 1100 1010 */
+    { 12, 0xCB, 27 },	/* 0000 1100 1011 */
+    { 12, 0xCC, 28 },	/* 0000 1100 1100 */
+    { 12, 0xCD, 29 },	/* 0000 1100 1101 */
+    { 12, 0x68, 30 },	/* 0000 0110 1000 */
+    { 12, 0x69, 31 },	/* 0000 0110 1001 */
+    { 12, 0x6A, 32 },	/* 0000 0110 1010 */
+    { 12, 0x6B, 33 },	/* 0000 0110 1011 */
+    { 12, 0xD2, 34 },	/* 0000 1101 0010 */
+    { 12, 0xD3, 35 },	/* 0000 1101 0011 */
+    { 12, 0xD4, 36 },	/* 0000 1101 0100 */
+    { 12, 0xD5, 37 },	/* 0000 1101 0101 */
+    { 12, 0xD6, 38 },	/* 0000 1101 0110 */
+    { 12, 0xD7, 39 },	/* 0000 1101 0111 */
+    { 12, 0x6C, 40 },	/* 0000 0110 1100 */
+    { 12, 0x6D, 41 },	/* 0000 0110 1101 */
+    { 12, 0xDA, 42 },	/* 0000 1101 1010 */
+    { 12, 0xDB, 43 },	/* 0000 1101 1011 */
+    { 12, 0x54, 44 },	/* 0000 0101 0100 */
+    { 12, 0x55, 45 },	/* 0000 0101 0101 */
+    { 12, 0x56, 46 },	/* 0000 0101 0110 */
+    { 12, 0x57, 47 },	/* 0000 0101 0111 */
+    { 12, 0x64, 48 },	/* 0000 0110 0100 */
+    { 12, 0x65, 49 },	/* 0000 0110 0101 */
+    { 12, 0x52, 50 },	/* 0000 0101 0010 */
+    { 12, 0x53, 51 },	/* 0000 0101 0011 */
+    { 12, 0x24, 52 },	/* 0000 0010 0100 */
+    { 12, 0x37, 53 },	/* 0000 0011 0111 */
+    { 12, 0x38, 54 },	/* 0000 0011 1000 */
+    { 12, 0x27, 55 },	/* 0000 0010 0111 */
+    { 12, 0x28, 56 },	/* 0000 0010 1000 */
+    { 12, 0x58, 57 },	/* 0000 0101 1000 */
+    { 12, 0x59, 58 },	/* 0000 0101 1001 */
+    { 12, 0x2B, 59 },	/* 0000 0010 1011 */
+    { 12, 0x2C, 60 },	/* 0000 0010 1100 */
+    { 12, 0x5A, 61 },	/* 0000 0101 1010 */
+    { 12, 0x66, 62 },	/* 0000 0110 0110 */
+    { 12, 0x67, 63 },	/* 0000 0110 0111 */
+    { 10, 0xF, 64 },	/* 0000 0011 11 */
+    { 12, 0xC8, 128 },	/* 0000 1100 1000 */
+    { 12, 0xC9, 192 },	/* 0000 1100 1001 */
+    { 12, 0x5B, 256 },	/* 0000 0101 1011 */
+    { 12, 0x33, 320 },	/* 0000 0011 0011 */
+    { 12, 0x34, 384 },	/* 0000 0011 0100 */
+    { 12, 0x35, 448 },	/* 0000 0011 0101 */
+    { 13, 0x6C, 512 },	/* 0000 0011 0110 0 */
+    { 13, 0x6D, 576 },	/* 0000 0011 0110 1 */
+    { 13, 0x4A, 640 },	/* 0000 0010 0101 0 */
+    { 13, 0x4B, 704 },	/* 0000 0010 0101 1 */
+    { 13, 0x4C, 768 },	/* 0000 0010 0110 0 */
+    { 13, 0x4D, 832 },	/* 0000 0010 0110 1 */
+    { 13, 0x72, 896 },	/* 0000 0011 1001 0 */
+    { 13, 0x73, 960 },	/* 0000 0011 1001 1 */
+    { 13, 0x74, 1024 },	/* 0000 0011 1010 0 */
+    { 13, 0x75, 1088 },	/* 0000 0011 1010 1 */
+    { 13, 0x76, 1152 },	/* 0000 0011 1011 0 */
+    { 13, 0x77, 1216 },	/* 0000 0011 1011 1 */
+    { 13, 0x52, 1280 },	/* 0000 0010 1001 0 */
+    { 13, 0x53, 1344 },	/* 0000 0010 1001 1 */
+    { 13, 0x54, 1408 },	/* 0000 0010 1010 0 */
+    { 13, 0x55, 1472 },	/* 0000 0010 1010 1 */
+    { 13, 0x5A, 1536 },	/* 0000 0010 1101 0 */
+    { 13, 0x5B, 1600 },	/* 0000 0010 1101 1 */
+    { 13, 0x64, 1664 },	/* 0000 0011 0010 0 */
+    { 13, 0x65, 1728 },	/* 0000 0011 0010 1 */
+    { 11, 0x8, 1792 },	/* 0000 0001 000 */
+    { 11, 0xC, 1856 },	/* 0000 0001 100 */
+    { 11, 0xD, 1920 },	/* 0000 0001 101 */
+    { 12, 0x12, 1984 },	/* 0000 0001 0010 */
+    { 12, 0x13, 2048 },	/* 0000 0001 0011 */
+    { 12, 0x14, 2112 },	/* 0000 0001 0100 */
+    { 12, 0x15, 2176 },	/* 0000 0001 0101 */
+    { 12, 0x16, 2240 },	/* 0000 0001 0110 */
+    { 12, 0x17, 2304 },	/* 0000 0001 0111 */
+    { 12, 0x1C, 2368 },	/* 0000 0001 1100 */
+    { 12, 0x1D, 2432 },	/* 0000 0001 1101 */
+    { 12, 0x1E, 2496 },	/* 0000 0001 1110 */
+    { 12, 0x1F, 2560 },	/* 0000 0001 1111 */
+    { 12, 0x1, G3CODE_EOL },	/* 0000 0000 0001 */
+    { 9, 0x1, G3CODE_INVALID },	/* 0000 0000 1 */
+    { 10, 0x1, G3CODE_INVALID },	/* 0000 0000 01 */
+    { 11, 0x1, G3CODE_INVALID },	/* 0000 0000 001 */
+    { 12, 0x0, G3CODE_INVALID },	/* 0000 0000 0000 */
+};
+#else
+extern	const tableentry TIFFFaxWhiteCodes[];
+extern	const tableentry TIFFFaxBlackCodes[];
+#endif
+#endif /* _T4_ */
diff --git a/src/tiff/tif_aux.c b/src/tiff/tif_aux.c
new file mode 100644
index 0000000..8e8fecf
--- /dev/null
+++ b/src/tiff/tif_aux.c
@@ -0,0 +1,218 @@
+/* $Header: /home/terralib/src/tiff/tif_aux.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Auxiliary Support Routines.
+ */
+#include "tiffiop.h"
+#include "tif_predict.h"
+#include <math.h>
+
+static void
+TIFFDefaultTransferFunction(TIFFDirectory* td)
+{
+	uint16 **tf = td->td_transferfunction;
+	long i, n = 1<<td->td_bitspersample;
+
+	tf[0] = (uint16 *)_TIFFmalloc(n * sizeof (uint16));
+	tf[0][0] = 0;
+	for (i = 1; i < n; i++) {
+		double t = (double)i/((double) n-1.);
+		tf[0][i] = (uint16)floor(65535.*pow(t, 2.2) + .5);
+	}
+	if (td->td_samplesperpixel - td->td_extrasamples > 1) {
+		tf[1] = (uint16 *)_TIFFmalloc(n * sizeof (uint16));
+		_TIFFmemcpy(tf[1], tf[0], n * sizeof (uint16));
+		tf[2] = (uint16 *)_TIFFmalloc(n * sizeof (uint16));
+		_TIFFmemcpy(tf[2], tf[0], n * sizeof (uint16));
+	}
+}
+
+static void
+TIFFDefaultRefBlackWhite(TIFFDirectory* td)
+{
+	int i;
+
+	td->td_refblackwhite = (float *)_TIFFmalloc(6*sizeof (float));
+	for (i = 0; i < 3; i++) {
+	    td->td_refblackwhite[2*i+0] = 0;
+	    td->td_refblackwhite[2*i+1] = (float)((1L<<td->td_bitspersample)-1L);
+	}
+}
+
+/*
+ * Like TIFFGetField, but return any default
+ * value if the tag is not present in the directory.
+ *
+ * NB:	We use the value in the directory, rather than
+ *	explcit values so that defaults exist only one
+ *	place in the library -- in TIFFDefaultDirectory.
+ */
+int
+TIFFVGetFieldDefaulted(TIFF* tif, ttag_t tag, va_list ap)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if (TIFFVGetField(tif, tag, ap))
+		return (1);
+	switch (tag) {
+	case TIFFTAG_SUBFILETYPE:
+		*va_arg(ap, uint32 *) = td->td_subfiletype;
+		return (1);
+	case TIFFTAG_BITSPERSAMPLE:
+		*va_arg(ap, uint16 *) = td->td_bitspersample;
+		return (1);
+	case TIFFTAG_THRESHHOLDING:
+		*va_arg(ap, uint16 *) = td->td_threshholding;
+		return (1);
+	case TIFFTAG_FILLORDER:
+		*va_arg(ap, uint16 *) = td->td_fillorder;
+		return (1);
+	case TIFFTAG_ORIENTATION:
+		*va_arg(ap, uint16 *) = td->td_orientation;
+		return (1);
+	case TIFFTAG_SAMPLESPERPIXEL:
+		*va_arg(ap, uint16 *) = td->td_samplesperpixel;
+		return (1);
+	case TIFFTAG_ROWSPERSTRIP:
+		*va_arg(ap, uint32 *) = td->td_rowsperstrip;
+		return (1);
+	case TIFFTAG_MINSAMPLEVALUE:
+		*va_arg(ap, uint16 *) = td->td_minsamplevalue;
+		return (1);
+	case TIFFTAG_MAXSAMPLEVALUE:
+		*va_arg(ap, uint16 *) = td->td_maxsamplevalue;
+		return (1);
+	case TIFFTAG_PLANARCONFIG:
+		*va_arg(ap, uint16 *) = td->td_planarconfig;
+		return (1);
+	case TIFFTAG_RESOLUTIONUNIT:
+		*va_arg(ap, uint16 *) = td->td_resolutionunit;
+		return (1);
+	case TIFFTAG_PREDICTOR:
+                {
+			TIFFPredictorState* sp = (TIFFPredictorState*) tif->tif_data;
+			*va_arg(ap, uint16*) = (uint16) sp->predictor;
+			return (1);
+                }
+	case TIFFTAG_DOTRANGE:
+		*va_arg(ap, uint16 *) = 0;
+		*va_arg(ap, uint16 *) = (1<<td->td_bitspersample)-1;
+		return (1);
+	case TIFFTAG_INKSET:
+		*va_arg(ap, uint16 *) = td->td_inkset;
+		return (1);
+	case TIFFTAG_NUMBEROFINKS:
+		*va_arg(ap, uint16 *) = td->td_ninks;
+		return (1);
+	case TIFFTAG_EXTRASAMPLES:
+		*va_arg(ap, uint16 *) = td->td_extrasamples;
+		*va_arg(ap, uint16 **) = td->td_sampleinfo;
+		return (1);
+	case TIFFTAG_MATTEING:
+		*va_arg(ap, uint16 *) =
+		    (td->td_extrasamples == 1 &&
+		     td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
+		return (1);
+	case TIFFTAG_TILEDEPTH:
+		*va_arg(ap, uint32 *) = td->td_tiledepth;
+		return (1);
+	case TIFFTAG_DATATYPE:
+		*va_arg(ap, uint16 *) = td->td_sampleformat-1;
+		return (1);
+	case TIFFTAG_SAMPLEFORMAT:
+		*va_arg(ap, uint16 *) = td->td_sampleformat;
+                return(1);
+	case TIFFTAG_IMAGEDEPTH:
+		*va_arg(ap, uint32 *) = td->td_imagedepth;
+		return (1);
+	case TIFFTAG_YCBCRCOEFFICIENTS:
+		if (!td->td_ycbcrcoeffs) {
+			td->td_ycbcrcoeffs = (float *)
+			    _TIFFmalloc(3*sizeof (float));
+			/* defaults are from CCIR Recommendation 601-1 */
+			td->td_ycbcrcoeffs[0] = 0.299f;
+			td->td_ycbcrcoeffs[1] = 0.587f;
+			td->td_ycbcrcoeffs[2] = 0.114f;
+		}
+		*va_arg(ap, float **) = td->td_ycbcrcoeffs;
+		return (1);
+	case TIFFTAG_YCBCRSUBSAMPLING:
+		*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[0];
+		*va_arg(ap, uint16 *) = td->td_ycbcrsubsampling[1];
+		return (1);
+	case TIFFTAG_YCBCRPOSITIONING:
+		*va_arg(ap, uint16 *) = td->td_ycbcrpositioning;
+		return (1);
+	case TIFFTAG_WHITEPOINT:
+		if (!td->td_whitepoint) {
+			td->td_whitepoint = (float *)
+				_TIFFmalloc(2 * sizeof (float));
+			/* TIFF 6.0 specification says that it is no default
+			   value for the WhitePoint, but AdobePhotoshop TIFF
+			   Technical Note tells that it should be CIE D50. */
+			td->td_whitepoint[0] =
+				D50_X0 / (D50_X0 + D50_Y0 + D50_Z0);
+			td->td_whitepoint[1] =
+				D50_Y0 / (D50_X0 + D50_Y0 + D50_Z0);
+		}
+		*va_arg(ap, float **) = td->td_whitepoint;
+		return (1);
+	case TIFFTAG_TRANSFERFUNCTION:
+		if (!td->td_transferfunction[0])
+			TIFFDefaultTransferFunction(td);
+		*va_arg(ap, uint16 **) = td->td_transferfunction[0];
+		if (td->td_samplesperpixel - td->td_extrasamples > 1) {
+			*va_arg(ap, uint16 **) = td->td_transferfunction[1];
+			*va_arg(ap, uint16 **) = td->td_transferfunction[2];
+		}
+		return (1);
+	case TIFFTAG_REFERENCEBLACKWHITE:
+		if (!td->td_refblackwhite)
+			TIFFDefaultRefBlackWhite(td);
+		*va_arg(ap, float **) = td->td_refblackwhite;
+		return (1);
+	}
+	return (0);
+}
+
+/*
+ * Like TIFFGetField, but return any default
+ * value if the tag is not present in the directory.
+ */
+int
+TIFFGetFieldDefaulted(TIFF* tif, ttag_t tag, ...)
+{
+	int ok;
+	va_list ap;
+
+	va_start(ap, tag);
+	ok =  TIFFVGetFieldDefaulted(tif, tag, ap);
+	va_end(ap);
+	return (ok);
+}
diff --git a/src/tiff/tif_close.c b/src/tiff/tif_close.c
new file mode 100644
index 0000000..87acd32
--- /dev/null
+++ b/src/tiff/tif_close.c
@@ -0,0 +1,80 @@
+/* $Header: /home/terralib/src/tiff/tif_close.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+void
+TIFFClose(TIFF* tif)
+{
+    if (tif->tif_mode != O_RDONLY)
+        /*
+         * Flush buffered data and directory (if dirty).
+         */
+        TIFFFlush(tif);
+    (*tif->tif_cleanup)(tif);
+    TIFFFreeDirectory(tif);
+
+    if (tif->tif_dirlist)
+        _TIFFfree(tif->tif_dirlist);
+        
+    /* Clean up client info links */
+    while( tif->tif_clientinfo )
+    {
+        TIFFClientInfoLink *link = tif->tif_clientinfo;
+
+        tif->tif_clientinfo = link->next;
+        _TIFFfree( link->name );
+        _TIFFfree( link );
+    }
+
+    if (tif->tif_rawdata && (tif->tif_flags&TIFF_MYBUFFER))
+        _TIFFfree(tif->tif_rawdata);
+    if (isMapped(tif))
+        TIFFUnmapFileContents(tif, tif->tif_base, tif->tif_size);
+    (void) TIFFCloseFile(tif);
+    if (tif->tif_nfields > 0) 
+    {
+        int  i;
+
+        for (i = 0; i < tif->tif_nfields; i++) 
+	{
+	    TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
+ 	    if (fld->field_bit == FIELD_CUSTOM && 
+		strncmp("Tag ", fld->field_name, 4) == 0) 
+	    {
+                _TIFFfree(fld->field_name);
+                _TIFFfree(fld);
+	    }
+        }   
+      
+        _TIFFfree(tif->tif_fieldinfo);
+    }
+
+    _TIFFfree(tif);
+}
diff --git a/src/tiff/tif_codec.c b/src/tiff/tif_codec.c
new file mode 100644
index 0000000..3486d93
--- /dev/null
+++ b/src/tiff/tif_codec.c
@@ -0,0 +1,150 @@
+/* $Header: /home/terralib/src/tiff/tif_codec.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Builtin Compression Scheme Configuration Support.
+ */
+#include "tiffiop.h"
+
+static	int NotConfigured(TIFF*, int);
+
+#ifndef	LZW_SUPPORT
+#define	TIFFInitLZW		NotConfigured
+#endif
+#ifndef	PACKBITS_SUPPORT
+#define	TIFFInitPackbits	NotConfigured
+#endif
+#ifndef	THUNDER_SUPPORT
+#define	TIFFInitThunderScan	NotConfigured
+#endif
+#ifndef	NEXT_SUPPORT
+#define	TIFFInitNeXT		NotConfigured
+#endif
+#ifndef	JPEG_SUPPORT
+#define	TIFFInitJPEG		NotConfigured
+#endif
+#ifndef	OJPEG_SUPPORT
+#define	TIFFInitOJPEG		NotConfigured
+#endif
+#ifndef	CCITT_SUPPORT
+#define	TIFFInitCCITTRLE	NotConfigured
+#define	TIFFInitCCITTRLEW	NotConfigured
+#define	TIFFInitCCITTFax3	NotConfigured
+#define	TIFFInitCCITTFax4	NotConfigured
+#endif
+#ifndef JBIG_SUPPORT
+#define	TIFFInitJBIG		NotConfigured
+#endif
+#ifndef	ZIP_SUPPORT
+#define	TIFFInitZIP		NotConfigured
+#endif
+#ifndef	PIXARLOG_SUPPORT
+#define	TIFFInitPixarLog	NotConfigured
+#endif
+#ifndef LOGLUV_SUPPORT
+#define TIFFInitSGILog		NotConfigured
+#endif
+
+/*
+ * Compression schemes statically built into the library.
+ */
+#ifdef VMS
+const TIFFCodec _TIFFBuiltinCODECS[] = {
+#else
+TIFFCodec _TIFFBuiltinCODECS[] = {
+#endif
+    { "None",		COMPRESSION_NONE,	TIFFInitDumpMode },
+    { "LZW",		COMPRESSION_LZW,	TIFFInitLZW },
+    { "PackBits",	COMPRESSION_PACKBITS,	TIFFInitPackBits },
+    { "ThunderScan",	COMPRESSION_THUNDERSCAN,TIFFInitThunderScan },
+    { "NeXT",		COMPRESSION_NEXT,	TIFFInitNeXT },
+    { "JPEG",		COMPRESSION_JPEG,	TIFFInitJPEG },
+    { "Old-style JPEG",	COMPRESSION_OJPEG,	TIFFInitOJPEG },
+    { "CCITT RLE",	COMPRESSION_CCITTRLE,	TIFFInitCCITTRLE },
+    { "CCITT RLE/W",	COMPRESSION_CCITTRLEW,	TIFFInitCCITTRLEW },
+    { "CCITT Group 3",	COMPRESSION_CCITTFAX3,	TIFFInitCCITTFax3 },
+    { "CCITT Group 4",	COMPRESSION_CCITTFAX4,	TIFFInitCCITTFax4 },
+    { "ISO JBIG",	COMPRESSION_JBIG,	TIFFInitJBIG },
+    { "Deflate",	COMPRESSION_DEFLATE,	TIFFInitZIP },
+    { "AdobeDeflate",   COMPRESSION_ADOBE_DEFLATE , TIFFInitZIP }, 
+    { "PixarLog",	COMPRESSION_PIXARLOG,	TIFFInitPixarLog },
+    { "SGILog",		COMPRESSION_SGILOG,	TIFFInitSGILog },
+    { "SGILog24",	COMPRESSION_SGILOG24,	TIFFInitSGILog },
+    { NULL }
+};
+
+static int
+_notConfigured(TIFF* tif)
+{
+	const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+	TIFFError(tif->tif_name,
+	    "%s compression support is not configured", c->name);
+	return (0);
+}
+
+static int
+NotConfigured(TIFF* tif, int scheme)
+{
+    (void) scheme;
+    
+    tif->tif_decodestatus = FALSE;
+    tif->tif_setupdecode = _notConfigured;
+    tif->tif_encodestatus = FALSE;
+    tif->tif_setupencode = _notConfigured;
+    return (1);
+}
+
+/************************************************************************/
+/*                       TIFFIsCODECConfigured()                        */
+/************************************************************************/
+
+/**
+ * Check whether we have working codec for the specific coding scheme.
+ * 
+ * @return returns 1 if the codec is configured and working. Otherwise
+ * 0 will be returned.
+ */
+
+int
+TIFFIsCODECConfigured(uint16 scheme)
+{
+	const TIFFCodec* codec = TIFFFindCODEC(scheme);
+
+	if(codec == NULL) {
+            return 0;
+        }
+        if(codec->init == NULL) {
+            return 0;
+        }
+	if(codec->init != NotConfigured){
+            return 1;
+        }
+	return 0;
+}
+
diff --git a/src/tiff/tif_color.c b/src/tiff/tif_color.c
new file mode 100644
index 0000000..c4d85bb
--- /dev/null
+++ b/src/tiff/tif_color.c
@@ -0,0 +1,268 @@
+/* $Header: /home/terralib/src/tiff/tif_color.c,v 1.1 2004/04/12 13:48:53 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * CIE L*a*b* to CIE XYZ and CIE XYZ to RGB conversion routines are taken
+ * from the VIPS library (http://www.vips.ecs.soton.ac.uk) with
+ * the permission of John Cupitt, the VIPS author.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Color space conversion routines.
+ */
+
+#include "tiffiop.h"
+#include <math.h>
+
+/*
+ * Convert color value from the CIE L*a*b* 1976 space to CIE XYZ.
+ */
+void
+TIFFCIELabToXYZ(TIFFCIELabToRGB *cielab, uint32 l, int32 a, int32 b,
+		float *X, float *Y, float *Z)
+{
+	float L = (float)l * 100.0F / 255.0F;
+	float cby, tmp;
+
+	if( L < 8.856F ) {
+		*Y = (L * cielab->Y0) / 903.292F;
+		cby = 7.787F * (*Y / cielab->Y0) + 16.0F / 116.0F;
+	} else {
+		cby = (L + 16.0F) / 116.0F;
+		*Y = cielab->Y0 * cby * cby * cby;
+	}
+
+	tmp = (float)a / 500.0F + cby;
+	if( tmp < 0.2069F )
+		*X = cielab->X0 * (tmp - 0.13793F) / 7.787F;
+	else    
+		*X = cielab->X0 * tmp * tmp * tmp;
+
+	tmp = cby - (float)b / 200.0F;
+	if( tmp < 0.2069F )
+		*Z = cielab->Z0 * (tmp - 0.13793F) / 7.787F;
+	else    
+		*Z = cielab->Z0 * tmp * tmp * tmp;
+}
+
+#define RINT(R) ((uint32)((R)>0?((R)+0.5):((R)-0.5)))
+/*
+ * Convert color value from the XYZ space to RGB.
+ */
+void
+TIFFXYZToRGB(TIFFCIELabToRGB *cielab, float X, float Y, float Z,
+	     uint32 *r, uint32 *g, uint32 *b)
+{
+	int i;
+	float Yr, Yg, Yb;
+	float *matrix = &cielab->display.d_mat[0][0];
+
+	/* Multiply through the matrix to get luminosity values. */
+	Yr =  matrix[0] * X + matrix[1] * Y + matrix[2] * Z;
+	Yg =  matrix[3] * X + matrix[4] * Y + matrix[5] * Z;
+	Yb =  matrix[6] * X + matrix[7] * Y + matrix[8] * Z;
+
+	/* Clip input */
+	Yr = TIFFmax( Yr, cielab->display.d_Y0R );
+	Yg = TIFFmax( Yg, cielab->display.d_Y0G );
+	Yb = TIFFmax( Yb, cielab->display.d_Y0B );
+
+	/* Turn luminosity to colour value. */
+	i = TIFFmin(cielab->range,
+		    (int)((Yr - cielab->display.d_Y0R) / cielab->rstep));
+	*r = RINT(cielab->Yr2r[i]);
+
+	i = TIFFmin(cielab->range,
+		    (int)((Yg - cielab->display.d_Y0G) / cielab->gstep));
+	*g = RINT(cielab->Yg2g[i]);
+
+	i = TIFFmin(cielab->range,
+		    (int)((Yb - cielab->display.d_Y0B) / cielab->bstep));
+	*b = RINT(cielab->Yb2b[i]);
+
+	/* Clip output. */
+	*r = TIFFmin( *r, cielab->display.d_Vrwr );
+	*g = TIFFmin( *g, cielab->display.d_Vrwg );
+	*b = TIFFmin( *b, cielab->display.d_Vrwb );
+}
+#undef RINT
+
+/* 
+ * Allocate conversion state structures and make look_up tables for
+ * the Yr,Yb,Yg <=> r,g,b conversions.
+ */
+int
+TIFFCIELabToRGBInit(TIFFCIELabToRGB* cielab,
+		    TIFFDisplay *display, float *refWhite)
+{
+	int i;
+	float gamma;
+
+	cielab->range = CIELABTORGB_TABLE_RANGE;
+
+	_TIFFmemcpy(&cielab->display, display, sizeof(TIFFDisplay));
+
+	/* Red */
+	gamma = 1.0F / cielab->display.d_gammaR ;
+	cielab->rstep =
+		(cielab->display.d_YCR - cielab->display.d_Y0R)	/ cielab->range;
+	for(i = 0; i <= cielab->range; i++) {
+		cielab->Yr2r[i] = cielab->display.d_Vrwr
+		    * ((float)pow((double)i / cielab->range, gamma));
+	}
+
+	/* Green */
+	gamma = 1.0F / cielab->display.d_gammaG ;
+	cielab->gstep =
+	    (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+	for(i = 0; i <= cielab->range; i++) {
+		cielab->Yg2g[i] = cielab->display.d_Vrwg
+		    * ((float)pow((double)i / cielab->range, gamma));
+	}
+
+	/* Blue */
+	gamma = 1.0F / cielab->display.d_gammaB ;
+	cielab->bstep =
+	    (cielab->display.d_YCR - cielab->display.d_Y0R) / cielab->range;
+	for(i = 0; i <= cielab->range; i++) {
+		cielab->Yb2b[i] = cielab->display.d_Vrwb
+		    * ((float)pow((double)i / cielab->range, gamma));
+	}
+
+	/* Init reference white point */
+	cielab->X0 = refWhite[0];
+	cielab->Y0 = refWhite[1];
+	cielab->Z0 = refWhite[2];
+
+	return 0;
+}
+
+/* 
+ * Convert color value from the YCbCr space to CIE XYZ.
+ * The colorspace conversion algorithm comes from the IJG v5a code;
+ * see below for more information on how it works.
+ */
+#define	SHIFT			16
+#define	FIX(x)			((int32)((x) * (1L<<SHIFT) + 0.5))
+#define	ONE_HALF		((int32)(1<<(SHIFT-1)))
+#define	Code2V(c, RB, RW, CR)	((((c)-(int32)(RB))*(float)(CR))/(float)((RW)-(RB)))
+#define	CLAMP(f,min,max)	((f)<(min)?(min):(f)>(max)?(max):(f))
+
+void
+TIFFYCbCrtoRGB(TIFFYCbCrToRGB *ycbcr, uint32 Y, int32 Cb, int32 Cr,
+	       uint32 *r, uint32 *g, uint32 *b)
+{
+	/* XXX: Only 8-bit YCbCr input supported for now */
+	Y = CLAMP(Y, 0, 255), Cb = CLAMP(Cb, 0, 255), Cr = CLAMP(Cr, 0, 255);
+
+	*r = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cr_r_tab[Cr]];
+	*g = ycbcr->clamptab[ycbcr->Y_tab[Y]
+	    + (int)((ycbcr->Cb_g_tab[Cb] + ycbcr->Cr_g_tab[Cr]) >> SHIFT)];
+	*b = ycbcr->clamptab[ycbcr->Y_tab[Y] + ycbcr->Cb_b_tab[Cb]];
+}
+
+/*
+ * Initialize the YCbCr->RGB conversion tables.  The conversion
+ * is done according to the 6.0 spec:
+ *
+ *    R = Y + Cr*(2 - 2*LumaRed)
+ *    B = Y + Cb*(2 - 2*LumaBlue)
+ *    G =   Y
+ *        - LumaBlue*Cb*(2-2*LumaBlue)/LumaGreen
+ *        - LumaRed*Cr*(2-2*LumaRed)/LumaGreen
+ *
+ * To avoid floating point arithmetic the fractional constants that
+ * come out of the equations are represented as fixed point values
+ * in the range 0...2^16.  We also eliminate multiplications by
+ * pre-calculating possible values indexed by Cb and Cr (this code
+ * assumes conversion is being done for 8-bit samples).
+ */
+int
+TIFFYCbCrToRGBInit(TIFFYCbCrToRGB* ycbcr, float *luma, float *refBlackWhite)
+{
+    TIFFRGBValue* clamptab;
+    int i;
+    
+#define LumaRed	    luma[0]
+#define LumaGreen   luma[1]
+#define LumaBlue    luma[2]
+
+    clamptab = (TIFFRGBValue*)(
+	(tidata_t) ycbcr+TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long)));
+    _TIFFmemset(clamptab, 0, 256);		/* v < 0 => 0 */
+    ycbcr->clamptab = (clamptab += 256);
+    for (i = 0; i < 256; i++)
+	clamptab[i] = (TIFFRGBValue) i;
+    _TIFFmemset(clamptab+256, 255, 2*256);	/* v > 255 => 255 */
+    ycbcr->Cr_r_tab = (int*) (clamptab + 3*256);
+    ycbcr->Cb_b_tab = ycbcr->Cr_r_tab + 256;
+    ycbcr->Cr_g_tab = (int32*) (ycbcr->Cb_b_tab + 256);
+    ycbcr->Cb_g_tab = ycbcr->Cr_g_tab + 256;
+    ycbcr->Y_tab = ycbcr->Cb_g_tab + 256;
+
+    { float f1 = 2-2*LumaRed;		int32 D1 = FIX(f1);
+      float f2 = LumaRed*f1/LumaGreen;	int32 D2 = -FIX(f2);
+      float f3 = 2-2*LumaBlue;		int32 D3 = FIX(f3);
+      float f4 = LumaBlue*f3/LumaGreen;	int32 D4 = -FIX(f4);
+      int x;
+
+#undef LumaBlue
+#undef LumaGreen
+#undef LumaRed
+      
+      /*
+       * i is the actual input pixel value in the range 0..255
+       * Cb and Cr values are in the range -128..127 (actually
+       * they are in a range defined by the ReferenceBlackWhite
+       * tag) so there is some range shifting to do here when
+       * constructing tables indexed by the raw pixel data.
+       */
+      for (i = 0, x = -128; i < 256; i++, x++) {
+	    int32 Cr = (int32)Code2V(x, refBlackWhite[4] - 128.0F,
+			    refBlackWhite[5] - 128.0F, 127);
+	    int32 Cb = (int32)Code2V(x, refBlackWhite[2] - 128.0F,
+			    refBlackWhite[3] - 128.0F, 127);
+
+	    ycbcr->Cr_r_tab[i] = (int32)((D1*Cr + ONE_HALF)>>SHIFT);
+	    ycbcr->Cb_b_tab[i] = (int32)((D3*Cb + ONE_HALF)>>SHIFT);
+	    ycbcr->Cr_g_tab[i] = D2*Cr;
+	    ycbcr->Cb_g_tab[i] = D4*Cb + ONE_HALF;
+	    ycbcr->Y_tab[i] =
+		    (int32)Code2V(x + 128, refBlackWhite[0], refBlackWhite[1], 255);
+      }
+    }
+
+    return 0;
+}
+#undef	CLAMP
+#undef	Code2V
+#undef	SHIFT
+#undef	ONE_HALF
+#undef	FIX
+
+
diff --git a/src/tiff/tif_compress.c b/src/tiff/tif_compress.c
new file mode 100644
index 0000000..d3c2379
--- /dev/null
+++ b/src/tiff/tif_compress.c
@@ -0,0 +1,233 @@
+/* $Header: /home/terralib/src/tiff/tif_compress.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Compression Scheme Configuration Support.
+ */
+#include "tiffiop.h"
+
+static int
+TIFFNoEncode(TIFF* tif, char* method)
+{
+	const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+	if (c) { 
+	  if (! strncmp(c->name, "LZW", 3) ){ 
+	    TIFFError(tif->tif_name, 
+		      "%s %s encoding is no longer implemented due to Unisys patent enforcement", 
+		      c->name, method); 
+	  } else { 
+	    TIFFError(tif->tif_name, "%s %s encoding is not implemented",
+		      c->name, method);
+	  }
+	}
+	else { 
+		TIFFError(tif->tif_name,
+			  "Compression scheme %u %s encoding is not implemented",
+		    tif->tif_dir.td_compression, method);
+	}
+	return (-1);
+}
+
+int
+_TIFFNoRowEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) pp; (void) cc; (void) s;
+	return (TIFFNoEncode(tif, "scanline"));
+}
+
+int
+_TIFFNoStripEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) pp; (void) cc; (void) s;
+	return (TIFFNoEncode(tif, "strip"));
+}
+
+int
+_TIFFNoTileEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) pp; (void) cc; (void) s;
+	return (TIFFNoEncode(tif, "tile"));
+}
+
+static int
+TIFFNoDecode(TIFF* tif, char* method)
+{
+	const TIFFCodec* c = TIFFFindCODEC(tif->tif_dir.td_compression);
+
+	if (c)
+		TIFFError(tif->tif_name, "%s %s decoding is not implemented",
+		    c->name, method);
+	else
+		TIFFError(tif->tif_name,
+		    "Compression scheme %u %s decoding is not implemented",
+		    tif->tif_dir.td_compression, method);
+	return (-1);
+}
+
+int
+_TIFFNoRowDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) pp; (void) cc; (void) s;
+	return (TIFFNoDecode(tif, "scanline"));
+}
+
+int
+_TIFFNoStripDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) pp; (void) cc; (void) s;
+	return (TIFFNoDecode(tif, "strip"));
+}
+
+int
+_TIFFNoTileDecode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) pp; (void) cc; (void) s;
+	return (TIFFNoDecode(tif, "tile"));
+}
+
+int
+_TIFFNoSeek(TIFF* tif, uint32 off)
+{
+	(void) off;
+	TIFFError(tif->tif_name,
+	    "Compression algorithm does not support random access");
+	return (0);
+}
+
+int
+_TIFFNoPreCode(TIFF* tif, tsample_t s)
+{
+	(void) tif; (void) s;
+	return (1);
+}
+
+static int _TIFFtrue(TIFF* tif) { (void) tif; return (1); }
+static void _TIFFvoid(TIFF* tif) { (void) tif; }
+
+void
+_TIFFSetDefaultCompressionState(TIFF* tif)
+{
+	tif->tif_decodestatus = TRUE;
+	tif->tif_setupdecode = _TIFFtrue;
+	tif->tif_predecode = _TIFFNoPreCode;
+	tif->tif_decoderow = _TIFFNoRowDecode;
+	tif->tif_decodestrip = _TIFFNoStripDecode;
+	tif->tif_decodetile = _TIFFNoTileDecode;
+	tif->tif_encodestatus = TRUE;
+	tif->tif_setupencode = _TIFFtrue;
+	tif->tif_preencode = _TIFFNoPreCode;
+	tif->tif_postencode = _TIFFtrue;
+	tif->tif_encoderow = _TIFFNoRowEncode;
+	tif->tif_encodestrip = _TIFFNoStripEncode;
+	tif->tif_encodetile = _TIFFNoTileEncode;
+	tif->tif_close = _TIFFvoid;
+	tif->tif_seek = _TIFFNoSeek;
+	tif->tif_cleanup = _TIFFvoid;
+	tif->tif_defstripsize = _TIFFDefaultStripSize;
+	tif->tif_deftilesize = _TIFFDefaultTileSize;
+	tif->tif_flags &= ~TIFF_NOBITREV;
+}
+
+int
+TIFFSetCompressionScheme(TIFF* tif, int scheme)
+{
+	const TIFFCodec *c = TIFFFindCODEC((uint16) scheme);
+
+	_TIFFSetDefaultCompressionState(tif);
+	/*
+	 * Don't treat an unknown compression scheme as an error.
+	 * This permits applications to open files with data that
+	 * the library does not have builtin support for, but which
+	 * may still be meaningful.
+	 */
+	return (c ? (*c->init)(tif, scheme) : 1);
+}
+
+/*
+ * Other compression schemes may be registered.  Registered
+ * schemes can also override the builtin versions provided
+ * by this library.
+ */
+typedef struct _codec {
+	struct _codec*	next;
+	TIFFCodec*	info;
+} codec_t;
+static	codec_t* registeredCODECS = NULL;
+
+const TIFFCodec*
+TIFFFindCODEC(uint16 scheme)
+{
+	const TIFFCodec* c;
+	codec_t* cd;
+
+	for (cd = registeredCODECS; cd; cd = cd->next)
+		if (cd->info->scheme == scheme)
+			return ((const TIFFCodec*) cd->info);
+	for (c = _TIFFBuiltinCODECS; c->name; c++)
+		if (c->scheme == scheme)
+			return (c);
+	return ((const TIFFCodec*) 0);
+}
+
+TIFFCodec*
+TIFFRegisterCODEC(uint16 scheme, const char* name, TIFFInitMethod init)
+{
+	codec_t* cd = (codec_t*)
+	    _TIFFmalloc(sizeof (codec_t) + sizeof (TIFFCodec) + strlen(name)+1);
+
+	if (cd != NULL) {
+		cd->info = (TIFFCodec*) ((tidata_t) cd + sizeof (codec_t));
+		cd->info->name = (char*)
+		    ((tidata_t) cd->info + sizeof (TIFFCodec));
+		strcpy(cd->info->name, name);
+		cd->info->scheme = scheme;
+		cd->info->init = init;
+		cd->next = registeredCODECS;
+		registeredCODECS = cd;
+	} else
+		TIFFError("TIFFRegisterCODEC",
+		    "No space to register compression scheme %s", name);
+	return (cd->info);
+}
+
+void
+TIFFUnRegisterCODEC(TIFFCodec* c)
+{
+	codec_t* cd;
+	codec_t** pcd;
+
+	for (pcd = ®isteredCODECS; (cd = *pcd); pcd = &cd->next)
+		if (cd->info == c) {
+			*pcd = cd->next;
+			_TIFFfree(cd);
+			return;
+		}
+	TIFFError("TIFFUnRegisterCODEC",
+	    "Cannot remove compression scheme %s; not registered", c->name);
+}
diff --git a/src/tiff/tif_dir.c b/src/tiff/tif_dir.c
new file mode 100644
index 0000000..44e6c2a
--- /dev/null
+++ b/src/tiff/tif_dir.c
@@ -0,0 +1,1419 @@
+/* $Header: /home/terralib/src/tiff/tif_dir.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Tag Get & Set Routines.
+ * (and also some miscellaneous stuff)
+ */
+#include "tiffiop.h"
+
+/*
+ * These are used in the backwards compatibility code...
+ */
+#define DATATYPE_VOID		0       /* !untyped data */
+#define DATATYPE_INT		1       /* !signed integer data */
+#define DATATYPE_UINT		2       /* !unsigned integer data */
+#define DATATYPE_IEEEFP		3       /* !IEEE floating point data */
+
+void
+_TIFFsetByteArray(void** vpp, void* vp, long n)
+{
+	if (*vpp)
+		_TIFFfree(*vpp), *vpp = 0;
+	if (vp && (*vpp = (void*) _TIFFmalloc(n)))
+		_TIFFmemcpy(*vpp, vp, n);
+}
+void _TIFFsetString(char** cpp, char* cp)
+    { _TIFFsetByteArray((void**) cpp, (void*) cp, (long) (strlen(cp)+1)); }
+void _TIFFsetNString(char** cpp, char* cp, long n)
+    { _TIFFsetByteArray((void**) cpp, (void*) cp, n); }
+void _TIFFsetShortArray(uint16** wpp, uint16* wp, long n)
+    { _TIFFsetByteArray((void**) wpp, (void*) wp, n*sizeof (uint16)); }
+void _TIFFsetLongArray(uint32** lpp, uint32* lp, long n)
+    { _TIFFsetByteArray((void**) lpp, (void*) lp, n*sizeof (uint32)); }
+void _TIFFsetFloatArray(float** fpp, float* fp, long n)
+    { _TIFFsetByteArray((void**) fpp, (void*) fp, n*sizeof (float)); }
+void _TIFFsetDoubleArray(double** dpp, double* dp, long n)
+    { _TIFFsetByteArray((void**) dpp, (void*) dp, n*sizeof (double)); }
+
+/*
+ * Install extra samples information.
+ */
+static int
+setExtraSamples(TIFFDirectory* td, va_list ap, int* v)
+{
+	uint16* va;
+	int i;
+
+	*v = va_arg(ap, int);
+	if ((uint16) *v > td->td_samplesperpixel)
+		return (0);
+	va = va_arg(ap, uint16*);
+	if (*v > 0 && va == NULL)		/* typically missing param */
+		return (0);
+	for (i = 0; i < *v; i++)
+		if (va[i] > EXTRASAMPLE_UNASSALPHA)
+			return (0);
+	td->td_extrasamples = (uint16) *v;
+	_TIFFsetShortArray(&td->td_sampleinfo, va, td->td_extrasamples);
+	return (1);
+}
+
+static int
+checkInkNamesString(TIFF* tif, int slen, const char* s)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+	int i = td->td_samplesperpixel;
+
+	if (slen > 0) {
+		const char* ep = s+slen;
+		const char* cp = s;
+		for (; i > 0; i--) {
+			for (; *cp != '\0'; cp++)
+				if (cp >= ep)
+					goto bad;
+			cp++;				/* skip \0 */
+		}
+		return (cp-s);
+	}
+bad:
+	TIFFError("TIFFSetField",
+	    "%s: Invalid InkNames value; expecting %d names, found %d",
+	    tif->tif_name,
+	    td->td_samplesperpixel,
+	    td->td_samplesperpixel-i);
+	return (0);
+}
+
+static int
+_TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	static const char module[] = "_TIFFVSetField";
+	
+	TIFFDirectory* td = &tif->tif_dir;
+	int status = 1;
+	uint32 v32;
+	int i, v;
+	double d;
+	char* s;
+
+	switch (tag) {
+	case TIFFTAG_SUBFILETYPE:
+		td->td_subfiletype = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_IMAGEWIDTH:
+		td->td_imagewidth = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_IMAGELENGTH:
+		td->td_imagelength = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_BITSPERSAMPLE:
+		td->td_bitspersample = (uint16) va_arg(ap, int);
+		/*
+		 * If the data require post-decoding processing
+		 * to byte-swap samples, set it up here.  Note
+		 * that since tags are required to be ordered,
+		 * compression code can override this behaviour
+		 * in the setup method if it wants to roll the
+		 * post decoding work in with its normal work.
+		 */
+		if (tif->tif_flags & TIFF_SWAB) {
+			if (td->td_bitspersample == 16)
+				tif->tif_postdecode = _TIFFSwab16BitData;
+			else if (td->td_bitspersample == 32)
+				tif->tif_postdecode = _TIFFSwab32BitData;
+			else if (td->td_bitspersample == 64)
+				tif->tif_postdecode = _TIFFSwab64BitData;
+		}
+		break;
+	case TIFFTAG_COMPRESSION:
+		v = va_arg(ap, int) & 0xffff;
+		/*
+		 * If we're changing the compression scheme,
+		 * the notify the previous module so that it
+		 * can cleanup any state it's setup.
+		 */
+		if (TIFFFieldSet(tif, FIELD_COMPRESSION)) {
+			if (td->td_compression == v)
+				break;
+			(*tif->tif_cleanup)(tif);
+			tif->tif_flags &= ~TIFF_CODERSETUP;
+		}
+		/*
+		 * Setup new compression routine state.
+		 */
+		if( (status = TIFFSetCompressionScheme(tif, v)) != 0 )
+                    td->td_compression = (uint16) v;
+                else
+                    status = 0;
+		break;
+	case TIFFTAG_PHOTOMETRIC:
+		td->td_photometric = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_THRESHHOLDING:
+		td->td_threshholding = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_FILLORDER:
+		v = va_arg(ap, int);
+		if (v != FILLORDER_LSB2MSB && v != FILLORDER_MSB2LSB)
+			goto badvalue;
+		td->td_fillorder = (uint16) v;
+		break;
+	case TIFFTAG_DOCUMENTNAME:
+		_TIFFsetString(&td->td_documentname, va_arg(ap, char*));
+		break;
+	case TIFFTAG_ARTIST:
+		_TIFFsetString(&td->td_artist, va_arg(ap, char*));
+		break;
+	case TIFFTAG_DATETIME:
+		_TIFFsetString(&td->td_datetime, va_arg(ap, char*));
+		break;
+	case TIFFTAG_HOSTCOMPUTER:
+		_TIFFsetString(&td->td_hostcomputer, va_arg(ap, char*));
+		break;
+	case TIFFTAG_IMAGEDESCRIPTION:
+		_TIFFsetString(&td->td_imagedescription, va_arg(ap, char*));
+		break;
+	case TIFFTAG_MAKE:
+		_TIFFsetString(&td->td_make, va_arg(ap, char*));
+		break;
+	case TIFFTAG_MODEL:
+		_TIFFsetString(&td->td_model, va_arg(ap, char*));
+		break;
+	case TIFFTAG_COPYRIGHT:
+		_TIFFsetString(&td->td_copyright, va_arg(ap, char*));
+		break;
+	case TIFFTAG_ORIENTATION:
+		v = va_arg(ap, int);
+		if (v < ORIENTATION_TOPLEFT || ORIENTATION_LEFTBOT < v) {
+			TIFFWarning(tif->tif_name,
+			    "Bad value %ld for \"%s\" tag ignored",
+			    v, _TIFFFieldWithTag(tif, tag)->field_name);
+		} else
+			td->td_orientation = (uint16) v;
+		break;
+	case TIFFTAG_SAMPLESPERPIXEL:
+		/* XXX should cross check -- e.g. if pallette, then 1 */
+		v = va_arg(ap, int);
+		if (v == 0)
+			goto badvalue;
+		td->td_samplesperpixel = (uint16) v;
+		break;
+	case TIFFTAG_ROWSPERSTRIP:
+		v32 = va_arg(ap, uint32);
+		if (v32 == 0)
+			goto badvalue32;
+		td->td_rowsperstrip = v32;
+		if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
+			td->td_tilelength = v32;
+			td->td_tilewidth = td->td_imagewidth;
+		}
+		break;
+	case TIFFTAG_MINSAMPLEVALUE:
+		td->td_minsamplevalue = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_MAXSAMPLEVALUE:
+		td->td_maxsamplevalue = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_SMINSAMPLEVALUE:
+		td->td_sminsamplevalue = (double) va_arg(ap, dblparam_t);
+		break;
+	case TIFFTAG_SMAXSAMPLEVALUE:
+		td->td_smaxsamplevalue = (double) va_arg(ap, dblparam_t);
+		break;
+	case TIFFTAG_XRESOLUTION:
+		td->td_xresolution = (float) va_arg(ap, dblparam_t);
+		break;
+	case TIFFTAG_YRESOLUTION:
+		td->td_yresolution = (float) va_arg(ap, dblparam_t);
+		break;
+	case TIFFTAG_PLANARCONFIG:
+		v = va_arg(ap, int);
+		if (v != PLANARCONFIG_CONTIG && v != PLANARCONFIG_SEPARATE)
+			goto badvalue;
+		td->td_planarconfig = (uint16) v;
+		break;
+	case TIFFTAG_PAGENAME:
+		_TIFFsetString(&td->td_pagename, va_arg(ap, char*));
+		break;
+	case TIFFTAG_XPOSITION:
+		td->td_xposition = (float) va_arg(ap, dblparam_t);
+		break;
+	case TIFFTAG_YPOSITION:
+		td->td_yposition = (float) va_arg(ap, dblparam_t);
+		break;
+	case TIFFTAG_RESOLUTIONUNIT:
+		v = va_arg(ap, int);
+		if (v < RESUNIT_NONE || RESUNIT_CENTIMETER < v)
+			goto badvalue;
+		td->td_resolutionunit = (uint16) v;
+		break;
+	case TIFFTAG_PAGENUMBER:
+		td->td_pagenumber[0] = (uint16) va_arg(ap, int);
+		td->td_pagenumber[1] = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_HALFTONEHINTS:
+		td->td_halftonehints[0] = (uint16) va_arg(ap, int);
+		td->td_halftonehints[1] = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_COLORMAP:
+		v32 = (uint32)(1L<<td->td_bitspersample);
+		_TIFFsetShortArray(&td->td_colormap[0], va_arg(ap, uint16*), v32);
+		_TIFFsetShortArray(&td->td_colormap[1], va_arg(ap, uint16*), v32);
+		_TIFFsetShortArray(&td->td_colormap[2], va_arg(ap, uint16*), v32);
+		break;
+	case TIFFTAG_EXTRASAMPLES:
+		if (!setExtraSamples(td, ap, &v))
+			goto badvalue;
+		break;
+	case TIFFTAG_MATTEING:
+		td->td_extrasamples = (uint16) (va_arg(ap, int) != 0);
+		if (td->td_extrasamples) {
+			uint16 sv = EXTRASAMPLE_ASSOCALPHA;
+			_TIFFsetShortArray(&td->td_sampleinfo, &sv, 1);
+		}
+		break;
+	case TIFFTAG_TILEWIDTH:
+		v32 = va_arg(ap, uint32);
+		if (v32 % 16) {
+			if (tif->tif_mode != O_RDONLY)
+				goto badvalue32;
+			TIFFWarning(tif->tif_name,
+			    "Nonstandard tile width %d, convert file", v32);
+		}
+		td->td_tilewidth = v32;
+		tif->tif_flags |= TIFF_ISTILED;
+		break;
+	case TIFFTAG_TILELENGTH:
+		v32 = va_arg(ap, uint32);
+		if (v32 % 16) {
+			if (tif->tif_mode != O_RDONLY)
+				goto badvalue32;
+			TIFFWarning(tif->tif_name,
+			    "Nonstandard tile length %d, convert file", v32);
+		}
+		td->td_tilelength = v32;
+		tif->tif_flags |= TIFF_ISTILED;
+		break;
+	case TIFFTAG_TILEDEPTH:
+		v32 = va_arg(ap, uint32);
+		if (v32 == 0)
+			goto badvalue32;
+		td->td_tiledepth = v32;
+		break;
+	case TIFFTAG_DATATYPE:
+		v = va_arg(ap, int);
+		switch (v) {
+		case DATATYPE_VOID:	v = SAMPLEFORMAT_VOID;	break;
+		case DATATYPE_INT:	v = SAMPLEFORMAT_INT;	break;
+		case DATATYPE_UINT:	v = SAMPLEFORMAT_UINT;	break;
+		case DATATYPE_IEEEFP:	v = SAMPLEFORMAT_IEEEFP;break;
+		default:		goto badvalue;
+		}
+		td->td_sampleformat = (uint16) v;
+		break;
+	case TIFFTAG_SAMPLEFORMAT:
+		v = va_arg(ap, int);
+		if (v < SAMPLEFORMAT_UINT || SAMPLEFORMAT_COMPLEXIEEEFP < v)
+			goto badvalue;
+		td->td_sampleformat = (uint16) v;
+
+                /*  Try to fix up the SWAB function for complex data. */
+                if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT 
+                    && td->td_bitspersample == 32
+                    && tif->tif_postdecode == _TIFFSwab32BitData )
+                    tif->tif_postdecode = _TIFFSwab16BitData;
+                else if( (td->td_sampleformat == SAMPLEFORMAT_COMPLEXINT 
+                          || td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP)
+                         && td->td_bitspersample == 64
+                         && tif->tif_postdecode == _TIFFSwab64BitData )
+                    tif->tif_postdecode = _TIFFSwab32BitData;
+                else if( td->td_sampleformat == SAMPLEFORMAT_COMPLEXIEEEFP
+                         && td->td_bitspersample == 128
+                         && tif->tif_postdecode == NULL )
+                    tif->tif_postdecode = _TIFFSwab64BitData;
+		break;
+	case TIFFTAG_IMAGEDEPTH:
+		td->td_imagedepth = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_STONITS:
+		d = va_arg(ap, dblparam_t);
+		if (d <= 0.)
+			goto badvaluedbl;
+		td->td_stonits = d;
+		break;
+	/* Begin Pixar Tags */
+ 	case TIFFTAG_PIXAR_IMAGEFULLWIDTH:
+ 		td->td_imagefullwidth = va_arg(ap, uint32);
+ 		break;
+ 	case TIFFTAG_PIXAR_IMAGEFULLLENGTH:
+ 		td->td_imagefulllength = va_arg(ap, uint32);
+ 		break;
+ 	case TIFFTAG_PIXAR_TEXTUREFORMAT:
+ 		_TIFFsetString(&td->td_textureformat, va_arg(ap, char*));
+ 		break;
+ 	case TIFFTAG_PIXAR_WRAPMODES:
+ 		_TIFFsetString(&td->td_wrapmodes, va_arg(ap, char*));
+ 		break;
+ 	case TIFFTAG_PIXAR_FOVCOT:
+ 		td->td_fovcot = (float) va_arg(ap, dblparam_t);
+ 		break;
+ 	case TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN:
+ 		_TIFFsetFloatArray(&td->td_matrixWorldToScreen,
+ 			va_arg(ap, float*), 16);
+ 		break;
+ 	case TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA:
+ 		_TIFFsetFloatArray(&td->td_matrixWorldToCamera,
+ 			va_arg(ap, float*), 16);
+ 		break;
+ 	/* End Pixar Tags */	       
+
+	case TIFFTAG_SUBIFD:
+		if ((tif->tif_flags & TIFF_INSUBIFD) == 0) {
+			td->td_nsubifd = (uint16) va_arg(ap, int);
+			_TIFFsetLongArray(&td->td_subifd, va_arg(ap, uint32*),
+			    (long) td->td_nsubifd);
+		} else {
+			TIFFError(module, "%s: Sorry, cannot nest SubIFDs",
+				  tif->tif_name);
+			status = 0;
+		}
+		break;
+	case TIFFTAG_YCBCRCOEFFICIENTS:
+		_TIFFsetFloatArray(&td->td_ycbcrcoeffs, va_arg(ap, float*), 3);
+		break;
+	case TIFFTAG_YCBCRPOSITIONING:
+		td->td_ycbcrpositioning = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_YCBCRSUBSAMPLING:
+		td->td_ycbcrsubsampling[0] = (uint16) va_arg(ap, int);
+		td->td_ycbcrsubsampling[1] = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_WHITEPOINT:
+		_TIFFsetFloatArray(&td->td_whitepoint, va_arg(ap, float*), 2);
+		break;
+	case TIFFTAG_PRIMARYCHROMATICITIES:
+		_TIFFsetFloatArray(&td->td_primarychromas, va_arg(ap, float*), 6);
+		break;
+	case TIFFTAG_TRANSFERFUNCTION:
+		v = (td->td_samplesperpixel - td->td_extrasamples) > 1 ? 3 : 1;
+		for (i = 0; i < v; i++)
+			_TIFFsetShortArray(&td->td_transferfunction[i],
+			    va_arg(ap, uint16*), 1L<<td->td_bitspersample);
+		break;
+	case TIFFTAG_REFERENCEBLACKWHITE:
+		/* XXX should check for null range */
+		_TIFFsetFloatArray(&td->td_refblackwhite, va_arg(ap, float*), 6);
+		break;
+	case TIFFTAG_INKSET:
+		td->td_inkset = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_DOTRANGE:
+		/* XXX should check for null range */
+		td->td_dotrange[0] = (uint16) va_arg(ap, int);
+		td->td_dotrange[1] = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_INKNAMES:
+		i = va_arg(ap, int);
+		s = va_arg(ap, char*);
+		i = checkInkNamesString(tif, i, s);
+                status = i > 0;
+		if( i > 0 ) {
+			_TIFFsetNString(&td->td_inknames, s, i);
+			td->td_inknameslen = i;
+		}
+		break;
+	case TIFFTAG_NUMBEROFINKS:
+		td->td_ninks = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_TARGETPRINTER:
+		_TIFFsetString(&td->td_targetprinter, va_arg(ap, char*));
+		break;
+	case TIFFTAG_ICCPROFILE:
+		td->td_profileLength = (uint32) va_arg(ap, uint32);
+		_TIFFsetByteArray(&td->td_profileData, va_arg(ap, void*),
+		    td->td_profileLength);
+		break;
+ 	case TIFFTAG_PHOTOSHOP:
+  		td->td_photoshopLength = (uint32) va_arg(ap, uint32);
+  		_TIFFsetByteArray (&td->td_photoshopData, va_arg(ap, void*),
+ 			td->td_photoshopLength);
+ 		break;
+	case TIFFTAG_RICHTIFFIPTC: 
+  		td->td_richtiffiptcLength = (uint32) va_arg(ap, uint32);
+  		_TIFFsetLongArray ((uint32**)&td->td_richtiffiptcData,
+				   va_arg(ap, uint32*),
+				   td->td_richtiffiptcLength);
+ 		break;
+	case TIFFTAG_XMLPACKET:
+		td->td_xmlpacketLength = (uint32) va_arg(ap, uint32);
+		_TIFFsetByteArray(&td->td_xmlpacketData, va_arg(ap, void*),
+		    td->td_xmlpacketLength);
+		break;
+        default: {
+            const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+            TIFFTagValue *tv;
+            int           tv_size, iCustom;
+
+            /*
+             * This can happen if multiple images are open with
+             * different codecs which have private tags.  The
+             * global tag information table may then have tags
+             * that are valid for one file but not the other. 
+             * If the client tries to set a tag that is not valid
+             * for the image's codec then we'll arrive here.  This
+             * happens, for example, when tiffcp is used to convert
+             * between compression schemes and codec-specific tags
+             * are blindly copied.
+             */
+            if( fip == NULL || fip->field_bit != FIELD_CUSTOM )
+            {
+		TIFFError(module,
+		    "%s: Invalid %stag \"%s\" (not supported by codec)",
+		    tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+		    _TIFFFieldWithTag(tif, tag)->field_name);
+		status = 0;
+		break;
+            }
+
+            /*
+             * Find the existing entry for this custom value.
+             */
+            tv = NULL;
+            for( iCustom = 0; iCustom < td->td_customValueCount; iCustom++ )
+            {
+                if( td->td_customValues[iCustom].info == fip )
+                {
+                    tv = td->td_customValues + iCustom;
+                    if( tv->value != NULL )
+                        _TIFFfree( tv->value );
+                    break;
+                }
+            }
+
+            /*
+             * Grow the custom list if the entry was not found.
+             */
+            if( tv == NULL )
+            {
+                td->td_customValueCount++;
+                if( td->td_customValueCount > 1 )
+                    td->td_customValues = (TIFFTagValue *)
+                        _TIFFrealloc(td->td_customValues,
+                                     sizeof(TIFFTagValue) * td->td_customValueCount);
+                else
+                    td->td_customValues = (TIFFTagValue *)
+                        _TIFFmalloc(sizeof(TIFFTagValue));
+
+                tv = td->td_customValues + (td->td_customValueCount-1);
+                tv->info = fip;
+                tv->value = NULL;
+                tv->count = 0;
+            }
+
+            /*
+             * Set custom value ... save a copy of the custom tag value.
+             */
+            tv_size = TIFFDataWidth(fip->field_type);
+            if( fip->field_passcount )
+                tv->count = (int) va_arg(ap, int);
+            else
+                tv->count = 1;
+            if( fip->field_passcount )
+            {
+                tv->value = _TIFFmalloc(tv_size * tv->count);
+		if ( !tv->value ) {
+			va_end(ap);
+			return 0;
+		}
+                _TIFFmemcpy( tv->value, (void *) va_arg(ap,void*),
+                             tv->count * tv_size );
+            }
+            else if( fip->field_type == TIFF_ASCII )
+            {
+                const char *value = (const char *) va_arg(ap,const char *);
+                tv->count = strlen(value)+1;
+                tv->value = _TIFFmalloc(tv->count);
+		if ( !tv->value ) {
+			va_end(ap);
+			return 0;
+		}
+                strcpy( tv->value, value );
+            }
+            else
+            {
+                /* not supporting "pass by value" types yet */
+		TIFFWarning(module, " ... pass by value not implemented.");
+
+                tv->value = _TIFFmalloc(tv_size * tv->count);
+		if ( !tv->value ) {
+			va_end(ap);
+			return 0;
+		}
+                _TIFFmemset( tv->value, 0, tv->count * tv_size );
+                status = 0;
+            }
+          }
+	}
+	if (status) {
+            TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit);
+            tif->tif_flags |= TIFF_DIRTYDIRECT;
+	}
+	va_end(ap);
+	return (status);
+badvalue:
+	TIFFError(module, "%.1000s: Bad value %d for \"%s\"",
+		  tif->tif_name, v, _TIFFFieldWithTag(tif, tag)->field_name);
+	va_end(ap);
+	return (0);
+badvalue32:
+	TIFFError(module, "%.1000s: Bad value %ld for \"%s\"",
+		   tif->tif_name, v32, _TIFFFieldWithTag(tif, tag)->field_name);
+	va_end(ap);
+	return (0);
+badvaluedbl:
+	TIFFError(module, "%.1000s: Bad value %f for \"%s\"",
+		  tif->tif_name, d, _TIFFFieldWithTag(tif, tag)->field_name);
+	va_end(ap);
+	return (0);
+}
+
+/*
+ * Return 1/0 according to whether or not
+ * it is permissible to set the tag's value.
+ * Note that we allow ImageLength to be changed
+ * so that we can append and extend to images.
+ * Any other tag may not be altered once writing
+ * has commenced, unless its value has no effect
+ * on the format of the data that is written.
+ */
+static int
+OkToChangeTag(TIFF* tif, ttag_t tag)
+{
+	const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+	if (!fip) {			/* unknown tag */
+		TIFFError("TIFFSetField", "%s: Unknown %stag %u",
+		    tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "", tag);
+		return (0);
+	}
+	if (tag != TIFFTAG_IMAGELENGTH && (tif->tif_flags & TIFF_BEENWRITING) &&
+	    !fip->field_oktochange) {
+		/*
+		 * Consult info table to see if tag can be changed
+		 * after we've started writing.  We only allow changes
+		 * to those tags that don't/shouldn't affect the
+		 * compression and/or format of the data.
+		 */
+		TIFFError("TIFFSetField",
+		    "%s: Cannot modify tag \"%s\" while writing",
+		    tif->tif_name, fip->field_name);
+		return (0);
+	}
+	return (1);
+}
+
+/*
+ * Record the value of a field in the
+ * internal directory structure.  The
+ * field will be written to the file
+ * when/if the directory structure is
+ * updated.
+ */
+int
+TIFFSetField(TIFF* tif, ttag_t tag, ...)
+{
+	va_list ap;
+	int status;
+
+	va_start(ap, tag);
+	status = TIFFVSetField(tif, tag, ap);
+	va_end(ap);
+	return (status);
+}
+
+/*
+ * Like TIFFSetField, but taking a varargs
+ * parameter list.  This routine is useful
+ * for building higher-level interfaces on
+ * top of the library.
+ */
+int
+TIFFVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	return OkToChangeTag(tif, tag) ?
+	    (*tif->tif_tagmethods.vsetfield)(tif, tag, ap) : 0;
+}
+
+static int
+_TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+    TIFFDirectory* td = &tif->tif_dir;
+    int            ret_val = 1;
+
+    switch (tag) {
+	case TIFFTAG_SUBFILETYPE:
+            *va_arg(ap, uint32*) = td->td_subfiletype;
+            break;
+	case TIFFTAG_IMAGEWIDTH:
+            *va_arg(ap, uint32*) = td->td_imagewidth;
+            break;
+	case TIFFTAG_IMAGELENGTH:
+            *va_arg(ap, uint32*) = td->td_imagelength;
+            break;
+	case TIFFTAG_BITSPERSAMPLE:
+            *va_arg(ap, uint16*) = td->td_bitspersample;
+            break;
+	case TIFFTAG_COMPRESSION:
+            *va_arg(ap, uint16*) = td->td_compression;
+            break;
+	case TIFFTAG_PHOTOMETRIC:
+            *va_arg(ap, uint16*) = td->td_photometric;
+            break;
+	case TIFFTAG_THRESHHOLDING:
+            *va_arg(ap, uint16*) = td->td_threshholding;
+            break;
+	case TIFFTAG_FILLORDER:
+            *va_arg(ap, uint16*) = td->td_fillorder;
+            break;
+	case TIFFTAG_DOCUMENTNAME:
+            *va_arg(ap, char**) = td->td_documentname;
+            break;
+	case TIFFTAG_ARTIST:
+            *va_arg(ap, char**) = td->td_artist;
+            break;
+	case TIFFTAG_DATETIME:
+            *va_arg(ap, char**) = td->td_datetime;
+            break;
+	case TIFFTAG_HOSTCOMPUTER:
+            *va_arg(ap, char**) = td->td_hostcomputer;
+            break;
+	case TIFFTAG_IMAGEDESCRIPTION:
+            *va_arg(ap, char**) = td->td_imagedescription;
+            break;
+	case TIFFTAG_MAKE:
+            *va_arg(ap, char**) = td->td_make;
+            break;
+	case TIFFTAG_MODEL:
+            *va_arg(ap, char**) = td->td_model;
+            break;
+	case TIFFTAG_COPYRIGHT:
+            *va_arg(ap, char**) = td->td_copyright;
+            break;
+	case TIFFTAG_ORIENTATION:
+            *va_arg(ap, uint16*) = td->td_orientation;
+            break;
+	case TIFFTAG_SAMPLESPERPIXEL:
+            *va_arg(ap, uint16*) = td->td_samplesperpixel;
+            break;
+	case TIFFTAG_ROWSPERSTRIP:
+            *va_arg(ap, uint32*) = td->td_rowsperstrip;
+            break;
+	case TIFFTAG_MINSAMPLEVALUE:
+            *va_arg(ap, uint16*) = td->td_minsamplevalue;
+            break;
+	case TIFFTAG_MAXSAMPLEVALUE:
+            *va_arg(ap, uint16*) = td->td_maxsamplevalue;
+            break;
+	case TIFFTAG_SMINSAMPLEVALUE:
+            *va_arg(ap, double*) = td->td_sminsamplevalue;
+            break;
+	case TIFFTAG_SMAXSAMPLEVALUE:
+            *va_arg(ap, double*) = td->td_smaxsamplevalue;
+            break;
+	case TIFFTAG_XRESOLUTION:
+            *va_arg(ap, float*) = td->td_xresolution;
+            break;
+	case TIFFTAG_YRESOLUTION:
+            *va_arg(ap, float*) = td->td_yresolution;
+            break;
+	case TIFFTAG_PLANARCONFIG:
+            *va_arg(ap, uint16*) = td->td_planarconfig;
+            break;
+	case TIFFTAG_XPOSITION:
+            *va_arg(ap, float*) = td->td_xposition;
+            break;
+	case TIFFTAG_YPOSITION:
+            *va_arg(ap, float*) = td->td_yposition;
+            break;
+	case TIFFTAG_PAGENAME:
+            *va_arg(ap, char**) = td->td_pagename;
+            break;
+	case TIFFTAG_RESOLUTIONUNIT:
+            *va_arg(ap, uint16*) = td->td_resolutionunit;
+            break;
+	case TIFFTAG_PAGENUMBER:
+            *va_arg(ap, uint16*) = td->td_pagenumber[0];
+            *va_arg(ap, uint16*) = td->td_pagenumber[1];
+            break;
+	case TIFFTAG_HALFTONEHINTS:
+            *va_arg(ap, uint16*) = td->td_halftonehints[0];
+            *va_arg(ap, uint16*) = td->td_halftonehints[1];
+            break;
+	case TIFFTAG_COLORMAP:
+            *va_arg(ap, uint16**) = td->td_colormap[0];
+            *va_arg(ap, uint16**) = td->td_colormap[1];
+            *va_arg(ap, uint16**) = td->td_colormap[2];
+            break;
+	case TIFFTAG_STRIPOFFSETS:
+	case TIFFTAG_TILEOFFSETS:
+            *va_arg(ap, uint32**) = td->td_stripoffset;
+            break;
+	case TIFFTAG_STRIPBYTECOUNTS:
+	case TIFFTAG_TILEBYTECOUNTS:
+            *va_arg(ap, uint32**) = td->td_stripbytecount;
+            break;
+	case TIFFTAG_MATTEING:
+            *va_arg(ap, uint16*) =
+                (td->td_extrasamples == 1 &&
+                 td->td_sampleinfo[0] == EXTRASAMPLE_ASSOCALPHA);
+            break;
+	case TIFFTAG_EXTRASAMPLES:
+            *va_arg(ap, uint16*) = td->td_extrasamples;
+            *va_arg(ap, uint16**) = td->td_sampleinfo;
+            break;
+	case TIFFTAG_TILEWIDTH:
+            *va_arg(ap, uint32*) = td->td_tilewidth;
+            break;
+	case TIFFTAG_TILELENGTH:
+            *va_arg(ap, uint32*) = td->td_tilelength;
+            break;
+	case TIFFTAG_TILEDEPTH:
+            *va_arg(ap, uint32*) = td->td_tiledepth;
+            break;
+	case TIFFTAG_DATATYPE:
+            switch (td->td_sampleformat) {
+		case SAMPLEFORMAT_UINT:
+                    *va_arg(ap, uint16*) = DATATYPE_UINT;
+                    break;
+		case SAMPLEFORMAT_INT:
+                    *va_arg(ap, uint16*) = DATATYPE_INT;
+                    break;
+		case SAMPLEFORMAT_IEEEFP:
+                    *va_arg(ap, uint16*) = DATATYPE_IEEEFP;
+                    break;
+		case SAMPLEFORMAT_VOID:
+                    *va_arg(ap, uint16*) = DATATYPE_VOID;
+                    break;
+            }
+            break;
+	case TIFFTAG_SAMPLEFORMAT:
+            *va_arg(ap, uint16*) = td->td_sampleformat;
+            break;
+	case TIFFTAG_IMAGEDEPTH:
+            *va_arg(ap, uint32*) = td->td_imagedepth;
+            break;
+	case TIFFTAG_STONITS:
+            *va_arg(ap, double*) = td->td_stonits;
+            break;
+	case TIFFTAG_SUBIFD:
+            *va_arg(ap, uint16*) = td->td_nsubifd;
+            *va_arg(ap, uint32**) = td->td_subifd;
+            break;
+	case TIFFTAG_YCBCRCOEFFICIENTS:
+            *va_arg(ap, float**) = td->td_ycbcrcoeffs;
+            break;
+	case TIFFTAG_YCBCRPOSITIONING:
+            *va_arg(ap, uint16*) = td->td_ycbcrpositioning;
+            break;
+	case TIFFTAG_YCBCRSUBSAMPLING:
+            *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[0];
+            *va_arg(ap, uint16*) = td->td_ycbcrsubsampling[1];
+            break;
+	case TIFFTAG_WHITEPOINT:
+            *va_arg(ap, float**) = td->td_whitepoint;
+            break;
+	case TIFFTAG_PRIMARYCHROMATICITIES:
+            *va_arg(ap, float**) = td->td_primarychromas;
+            break;
+	case TIFFTAG_TRANSFERFUNCTION:
+            *va_arg(ap, uint16**) = td->td_transferfunction[0];
+            if (td->td_samplesperpixel - td->td_extrasamples > 1) {
+                *va_arg(ap, uint16**) = td->td_transferfunction[1];
+                *va_arg(ap, uint16**) = td->td_transferfunction[2];
+            }
+            break;
+	case TIFFTAG_REFERENCEBLACKWHITE:
+            *va_arg(ap, float**) = td->td_refblackwhite;
+            break;
+	case TIFFTAG_INKSET:
+            *va_arg(ap, uint16*) = td->td_inkset;
+            break;
+	case TIFFTAG_DOTRANGE:
+            *va_arg(ap, uint16*) = td->td_dotrange[0];
+            *va_arg(ap, uint16*) = td->td_dotrange[1];
+            break;
+	case TIFFTAG_INKNAMES:
+            *va_arg(ap, char**) = td->td_inknames;
+            break;
+	case TIFFTAG_NUMBEROFINKS:
+            *va_arg(ap, uint16*) = td->td_ninks;
+            break;
+	case TIFFTAG_TARGETPRINTER:
+            *va_arg(ap, char**) = td->td_targetprinter;
+            break;
+	case TIFFTAG_ICCPROFILE:
+            *va_arg(ap, uint32*) = td->td_profileLength;
+            *va_arg(ap, void**) = td->td_profileData;
+            break;
+ 	case TIFFTAG_PHOTOSHOP:
+            *va_arg(ap, uint32*) = td->td_photoshopLength;
+            *va_arg(ap, void**) = td->td_photoshopData;
+            break;
+ 	case TIFFTAG_RICHTIFFIPTC:
+            *va_arg(ap, uint32*) = td->td_richtiffiptcLength;
+            *va_arg(ap, void**) = td->td_richtiffiptcData;
+            break;
+	case TIFFTAG_XMLPACKET:
+            *va_arg(ap, uint32*) = td->td_xmlpacketLength;
+            *va_arg(ap, void**) = td->td_xmlpacketData;
+            break;
+            /* Begin Pixar Tags */
+ 	case TIFFTAG_PIXAR_IMAGEFULLWIDTH:
+            *va_arg(ap, uint32*) = td->td_imagefullwidth;
+            break;
+ 	case TIFFTAG_PIXAR_IMAGEFULLLENGTH:
+            *va_arg(ap, uint32*) = td->td_imagefulllength;
+            break;
+ 	case TIFFTAG_PIXAR_TEXTUREFORMAT:
+            *va_arg(ap, char**) = td->td_textureformat;
+            break;
+ 	case TIFFTAG_PIXAR_WRAPMODES:
+            *va_arg(ap, char**) = td->td_wrapmodes;
+            break;
+ 	case TIFFTAG_PIXAR_FOVCOT:
+            *va_arg(ap, float*) = td->td_fovcot;
+            break;
+ 	case TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN:
+            *va_arg(ap, float**) = td->td_matrixWorldToScreen;
+            break;
+ 	case TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA:
+            *va_arg(ap, float**) = td->td_matrixWorldToCamera;
+            break;
+            /* End Pixar Tags */
+
+        default:
+        {
+            const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+            int           i;
+            
+            /*
+             * This can happen if multiple images are open with
+             * different codecs which have private tags.  The
+             * global tag information table may then have tags
+             * that are valid for one file but not the other. 
+             * If the client tries to get a tag that is not valid
+             * for the image's codec then we'll arrive here.
+             */
+            if( fip == NULL || fip->field_bit != FIELD_CUSTOM )
+            {
+                TIFFError("_TIFFVGetField",
+                          "%s: Invalid %stag \"%s\" (not supported by codec)",
+                          tif->tif_name, isPseudoTag(tag) ? "pseudo-" : "",
+                          _TIFFFieldWithTag(tif, tag)->field_name);
+                ret_val = 0;
+                break;
+            }
+
+            /*
+            ** Do we have a custom value?
+            */
+            ret_val = 0;
+            for( i = 0; i < td->td_customValueCount; i++ )
+            {
+                TIFFTagValue *tv = td->td_customValues + i;
+
+                if( tv->info->field_tag != tag )
+                    continue;
+                
+                if( fip->field_passcount )
+                {
+                    *va_arg(ap, u_short *) = (u_short) tv->count;
+                    *va_arg(ap, void **) = tv->value;
+                    ret_val = 1;
+                    break;
+                }
+                else if( fip->field_type == TIFF_ASCII )
+                {
+                    *va_arg(ap, void **) = tv->value;
+                    ret_val = 1;
+                    break;
+                }
+                else
+                {
+                    printf( "TIFFVGetField ... pass by value not imp.\n" );
+                    break;
+                }
+            }
+        }
+    }
+    return( ret_val );
+}
+
+/*
+ * Return the value of a field in the
+ * internal directory structure.
+ */
+int
+TIFFGetField(TIFF* tif, ttag_t tag, ...)
+{
+	int status;
+	va_list ap;
+
+	va_start(ap, tag);
+	status = TIFFVGetField(tif, tag, ap);
+	va_end(ap);
+	return (status);
+}
+
+/*
+ * Like TIFFGetField, but taking a varargs
+ * parameter list.  This routine is useful
+ * for building higher-level interfaces on
+ * top of the library.
+ */
+int
+TIFFVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+	return (fip && (isPseudoTag(tag) || TIFFFieldSet(tif, fip->field_bit)) ?
+	    (*tif->tif_tagmethods.vgetfield)(tif, tag, ap) : 0);
+}
+
+#define	CleanupField(member) {		\
+    if (td->member) {			\
+	_TIFFfree(td->member);		\
+	td->member = 0;			\
+    }					\
+}
+
+/*
+ * Release storage associated with a directory.
+ */
+void
+TIFFFreeDirectory(TIFF* tif)
+{
+    TIFFDirectory *td = &tif->tif_dir;
+    int            i;
+
+    CleanupField(td_colormap[0]);
+    CleanupField(td_colormap[1]);
+    CleanupField(td_colormap[2]);
+    CleanupField(td_documentname);
+    CleanupField(td_artist);
+    CleanupField(td_datetime);
+    CleanupField(td_hostcomputer);
+    CleanupField(td_imagedescription);
+    CleanupField(td_make);
+    CleanupField(td_model);
+    CleanupField(td_copyright);
+    CleanupField(td_pagename);
+    CleanupField(td_sampleinfo);
+    CleanupField(td_subifd);
+    CleanupField(td_ycbcrcoeffs);
+    CleanupField(td_inknames);
+    CleanupField(td_targetprinter);
+    CleanupField(td_whitepoint);
+    CleanupField(td_primarychromas);
+    CleanupField(td_refblackwhite);
+    CleanupField(td_transferfunction[0]);
+    CleanupField(td_transferfunction[1]);
+    CleanupField(td_transferfunction[2]);
+    CleanupField(td_profileData);
+    CleanupField(td_photoshopData);
+    CleanupField(td_richtiffiptcData);
+    CleanupField(td_xmlpacketData);
+    CleanupField(td_stripoffset);
+    CleanupField(td_stripbytecount);
+    /* Begin Pixar Tags */
+    CleanupField(td_textureformat);
+    CleanupField(td_wrapmodes);
+    CleanupField(td_matrixWorldToScreen);
+    CleanupField(td_matrixWorldToCamera);
+    /* End Pixar Tags */
+
+    /* Cleanup custom tag values */
+    for( i = 0; i < td->td_customValueCount; i++ )
+        _TIFFfree( td->td_customValues[i].value );
+
+    if( td->td_customValues != NULL )
+        _TIFFfree( td->td_customValues );
+          
+}
+#undef CleanupField
+
+/*
+ * Client Tag extension support (from Niles Ritter).
+ */
+static TIFFExtendProc _TIFFextender = (TIFFExtendProc) NULL;
+
+TIFFExtendProc
+TIFFSetTagExtender(TIFFExtendProc extender)
+{
+	TIFFExtendProc prev = _TIFFextender;
+	_TIFFextender = extender;
+	return (prev);
+}
+
+/*
+ * Setup for a new directory.  Should we automatically call
+ * TIFFWriteDirectory() if the current one is dirty?
+ *
+ * The newly created directory will not exist on the file till
+ * TIFFWriteDirectory(), TIFFFlush() or TIFFClose() is called.
+ */
+int
+TIFFCreateDirectory(TIFF* tif)
+{
+    TIFFDefaultDirectory(tif);
+    tif->tif_diroff = 0;
+    tif->tif_nextdiroff = 0;
+    tif->tif_curoff = 0;
+    tif->tif_row = (uint32) -1;
+    tif->tif_curstrip = (tstrip_t) -1;
+
+    return 0;
+}
+
+/*
+ * Setup a default directory structure.
+ */
+int
+TIFFDefaultDirectory(TIFF* tif)
+{
+	register TIFFDirectory* td = &tif->tif_dir;
+
+	_TIFFSetupFieldInfo(tif);
+	_TIFFmemset(td, 0, sizeof (*td));
+	td->td_fillorder = FILLORDER_MSB2LSB;
+	td->td_bitspersample = 1;
+	td->td_threshholding = THRESHHOLD_BILEVEL;
+	td->td_orientation = ORIENTATION_TOPLEFT;
+	td->td_samplesperpixel = 1;
+	td->td_rowsperstrip = (uint32) -1;
+	td->td_tilewidth = (uint32) -1;
+	td->td_tilelength = (uint32) -1;
+	td->td_tiledepth = 1;
+	td->td_resolutionunit = RESUNIT_INCH;
+	td->td_sampleformat = SAMPLEFORMAT_UINT;
+	td->td_imagedepth = 1;
+	td->td_ycbcrsubsampling[0] = 2;
+	td->td_ycbcrsubsampling[1] = 2;
+	td->td_ycbcrpositioning = YCBCRPOSITION_CENTERED;
+	td->td_inkset = INKSET_CMYK;
+	td->td_ninks = 4;
+	tif->tif_postdecode = _TIFFNoPostDecode;
+	tif->tif_tagmethods.vsetfield = _TIFFVSetField;
+	tif->tif_tagmethods.vgetfield = _TIFFVGetField;
+	tif->tif_tagmethods.printdir = NULL;
+	/*
+	 *  Give client code a chance to install their own
+	 *  tag extensions & methods, prior to compression overloads.
+	 */
+	if (_TIFFextender)
+		(*_TIFFextender)(tif);
+	(void) TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+	/*
+	 * NB: The directory is marked dirty as a result of setting
+	 * up the default compression scheme.  However, this really
+	 * isn't correct -- we want TIFF_DIRTYDIRECT to be set only
+	 * if the user does something.  We could just do the setup
+	 * by hand, but it seems better to use the normal mechanism
+	 * (i.e. TIFFSetField).
+	 */
+	tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+
+        /*
+         * As per http://bugzilla.remotesensing.org/show_bug.cgi?id=19
+         * we clear the ISTILED flag when setting up a new directory.
+         * Should we also be clearing stuff like INSUBIFD?
+         */
+        tif->tif_flags &= ~TIFF_ISTILED;
+
+	return (1);
+}
+
+static int
+TIFFAdvanceDirectory(TIFF* tif, uint32* nextdir, toff_t* off)
+{
+    static const char module[] = "TIFFAdvanceDirectory";
+    uint16 dircount;
+    if (isMapped(tif))
+    {
+        toff_t poff=*nextdir;
+        if (poff+sizeof(uint16) > tif->tif_size)
+        {
+            TIFFError(module, "%s: Error fetching directory count",
+                      tif->tif_name);
+            return (0);
+        }
+        _TIFFmemcpy(&dircount, tif->tif_base+poff, sizeof (uint16));
+        if (tif->tif_flags & TIFF_SWAB)
+            TIFFSwabShort(&dircount);
+        poff+=sizeof (uint16)+dircount*sizeof (TIFFDirEntry);
+        if (off != NULL)
+            *off = poff;
+        if (((toff_t) (poff+sizeof (uint32))) > tif->tif_size)
+        {
+            TIFFError(module, "%s: Error fetching directory link",
+                      tif->tif_name);
+            return (0);
+        }
+        _TIFFmemcpy(nextdir, tif->tif_base+poff, sizeof (uint32));
+        if (tif->tif_flags & TIFF_SWAB)
+            TIFFSwabLong(nextdir);
+        return (1);
+    }
+    else
+    {
+        if (!SeekOK(tif, *nextdir) ||
+            !ReadOK(tif, &dircount, sizeof (uint16))) {
+            TIFFError(module, "%s: Error fetching directory count",
+                      tif->tif_name);
+            return (0);
+        }
+        if (tif->tif_flags & TIFF_SWAB)
+            TIFFSwabShort(&dircount);
+        if (off != NULL)
+            *off = TIFFSeekFile(tif,
+                                dircount*sizeof (TIFFDirEntry), SEEK_CUR);
+        else
+            (void) TIFFSeekFile(tif,
+                                dircount*sizeof (TIFFDirEntry), SEEK_CUR);
+        if (!ReadOK(tif, nextdir, sizeof (uint32))) {
+            TIFFError(module, "%s: Error fetching directory link",
+                      tif->tif_name);
+            return (0);
+        }
+        if (tif->tif_flags & TIFF_SWAB)
+            TIFFSwabLong(nextdir);
+        return (1);
+    }
+}
+
+/*
+ * Count the number of directories in a file.
+ */
+tdir_t
+TIFFNumberOfDirectories(TIFF* tif)
+{
+    toff_t nextdir = tif->tif_header.tiff_diroff;
+    tdir_t n = 0;
+    
+    while (nextdir != 0 && TIFFAdvanceDirectory(tif, &nextdir, NULL))
+        n++;
+    return (n);
+}
+
+/*
+ * Set the n-th directory as the current directory.
+ * NB: Directories are numbered starting at 0.
+ */
+int
+TIFFSetDirectory(TIFF* tif, tdir_t dirn)
+{
+	toff_t nextdir;
+	tdir_t n;
+
+	nextdir = tif->tif_header.tiff_diroff;
+	for (n = dirn; n > 0 && nextdir != 0; n--)
+		if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
+			return (0);
+	tif->tif_nextdiroff = nextdir;
+	/*
+	 * Set curdir to the actual directory index.  The
+	 * -1 is because TIFFReadDirectory will increment
+	 * tif_curdir after successfully reading the directory.
+	 */
+	tif->tif_curdir = (dirn - n) - 1;
+	/*
+	 * Reset tif_dirnumber counter nad start new list of seen directories.
+	 * We need this in order to prevent IFD loops.
+	 */
+	tif->tif_dirnumber = 0;
+	return (TIFFReadDirectory(tif));
+}
+
+/*
+ * Set the current directory to be the directory
+ * located at the specified file offset.  This interface
+ * is used mainly to access directories linked with
+ * the SubIFD tag (e.g. thumbnail images).
+ */
+int
+TIFFSetSubDirectory(TIFF* tif, uint32 diroff)
+{
+	tif->tif_nextdiroff = diroff;
+	/*
+	 * Reset tif_dirnumber counter nad start new list of seen directories.
+	 * We need this in order to prevent IFD loops.
+	 */
+	tif->tif_dirnumber = 0;
+	return (TIFFReadDirectory(tif));
+}
+
+/*
+ * Return file offset of the current directory.
+ */
+uint32
+TIFFCurrentDirOffset(TIFF* tif)
+{
+	return (tif->tif_diroff);
+}
+
+/*
+ * Return an indication of whether or not we are
+ * at the last directory in the file.
+ */
+int
+TIFFLastDirectory(TIFF* tif)
+{
+	return (tif->tif_nextdiroff == 0);
+}
+
+/*
+ * Unlink the specified directory from the directory chain.
+ */
+int
+TIFFUnlinkDirectory(TIFF* tif, tdir_t dirn)
+{
+	static const char module[] = "TIFFUnlinkDirectory";
+	toff_t nextdir;
+	toff_t off;
+	tdir_t n;
+
+	if (tif->tif_mode == O_RDONLY) {
+		TIFFError(module, "Can not unlink directory in read-only file");
+		return (0);
+	}
+	/*
+	 * Go to the directory before the one we want
+	 * to unlink and nab the offset of the link
+	 * field we'll need to patch.
+	 */
+	nextdir = tif->tif_header.tiff_diroff;
+	off = sizeof (uint16) + sizeof (uint16);
+	for (n = dirn-1; n > 0; n--) {
+		if (nextdir == 0) {
+			TIFFError(module, "Directory %d does not exist", dirn);
+			return (0);
+		}
+		if (!TIFFAdvanceDirectory(tif, &nextdir, &off))
+			return (0);
+	}
+	/*
+	 * Advance to the directory to be unlinked and fetch
+	 * the offset of the directory that follows.
+	 */
+	if (!TIFFAdvanceDirectory(tif, &nextdir, NULL))
+		return (0);
+	/*
+	 * Go back and patch the link field of the preceding
+	 * directory to point to the offset of the directory
+	 * that follows.
+	 */
+	(void) TIFFSeekFile(tif, off, SEEK_SET);
+	if (tif->tif_flags & TIFF_SWAB)
+		TIFFSwabLong(&nextdir);
+	if (!WriteOK(tif, &nextdir, sizeof (uint32))) {
+		TIFFError(module, "Error writing directory link");
+		return (0);
+	}
+	/*
+	 * Leave directory state setup safely.  We don't have
+	 * facilities for doing inserting and removing directories,
+	 * so it's safest to just invalidate everything.  This
+	 * means that the caller can only append to the directory
+	 * chain.
+	 */
+	(*tif->tif_cleanup)(tif);
+	if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
+		_TIFFfree(tif->tif_rawdata);
+		tif->tif_rawdata = NULL;
+		tif->tif_rawcc = 0;
+	}
+	tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP|TIFF_POSTENCODE);
+	TIFFFreeDirectory(tif);
+	TIFFDefaultDirectory(tif);
+	tif->tif_diroff = 0;			/* force link on next write */
+	tif->tif_nextdiroff = 0;		/* next write must be at end */
+	tif->tif_curoff = 0;
+	tif->tif_row = (uint32) -1;
+	tif->tif_curstrip = (tstrip_t) -1;
+	return (1);
+}
+
+/*			[BFC]
+ *
+ * Author: Bruce Cameron <cameron at petris.com>
+ *
+ * Set a table of tags that are to be replaced during directory process by the
+ * 'IGNORE' state - or return TRUE/FALSE for the requested tag such that
+ * 'ReadDirectory' can use the stored information.
+ */
+int
+TIFFReassignTagToIgnore (enum TIFFIgnoreSense task, int TIFFtagID)
+{
+    static int TIFFignoretags [FIELD_LAST];
+    static int tagcount = 0 ;
+    int		i;					/* Loop index */
+    int		j;					/* Loop index */
+
+    switch (task)
+    {
+      case TIS_STORE:
+        if ( tagcount < (FIELD_LAST - 1) )
+        {
+            for ( j = 0 ; j < tagcount ; ++j )
+            {					/* Do not add duplicate tag */
+                if ( TIFFignoretags [j] == TIFFtagID )
+                    return (TRUE) ;
+            }
+            TIFFignoretags [tagcount++] = TIFFtagID ;
+            return (TRUE) ;
+        }
+        break ;
+        
+      case TIS_EXTRACT:
+        for ( i = 0 ; i < tagcount ; ++i )
+        {
+            if ( TIFFignoretags [i] == TIFFtagID )
+                return (TRUE) ;
+        }
+        break;
+        
+      case TIS_EMPTY:
+        tagcount = 0 ;			/* Clear the list */
+        return (TRUE) ;
+        
+      default:
+        break;
+    }
+    
+    return (FALSE);
+}
+
diff --git a/src/tiff/tif_dir.h b/src/tiff/tif_dir.h
new file mode 100644
index 0000000..9b5cf55
--- /dev/null
+++ b/src/tiff/tif_dir.h
@@ -0,0 +1,267 @@
+/* $Header: /home/terralib/src/tiff/tif_dir.h,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFDIR_
+#define	_TIFFDIR_
+/*
+ * ``Library-private'' Directory-related Definitions.
+ */
+
+/*
+ * Internal format of a TIFF directory entry.
+ */
+typedef	struct {
+#define	FIELD_SETLONGS	4
+	/* bit vector of fields that are set */
+	u_long	td_fieldsset[FIELD_SETLONGS];
+
+	uint32	td_imagewidth, td_imagelength, td_imagedepth;
+	uint32	td_tilewidth, td_tilelength, td_tiledepth;
+	uint32	td_subfiletype;
+	uint16	td_bitspersample;
+	uint16	td_sampleformat;
+	uint16	td_compression;
+	uint16	td_photometric;
+	uint16	td_threshholding;
+	uint16	td_fillorder;
+	uint16	td_orientation;
+	uint16	td_samplesperpixel;
+	uint32	td_rowsperstrip;
+	uint16	td_minsamplevalue, td_maxsamplevalue;
+	double	td_sminsamplevalue, td_smaxsamplevalue;
+	float	td_xresolution, td_yresolution;
+	uint16	td_resolutionunit;
+	uint16	td_planarconfig;
+	float	td_xposition, td_yposition;
+	uint16	td_pagenumber[2];
+	uint16*	td_colormap[3];
+	uint16	td_halftonehints[2];
+	uint16	td_extrasamples;
+	uint16*	td_sampleinfo;
+	double	td_stonits;
+	char*	td_documentname;
+	char*	td_artist;
+	char*	td_datetime;
+	char*	td_hostcomputer;
+	char*	td_imagedescription;
+	char*	td_make;
+	char*	td_model;
+        char*   td_copyright;
+	char*	td_pagename;
+	tstrip_t td_stripsperimage;
+	tstrip_t td_nstrips;		/* size of offset & bytecount arrays */
+	uint32*	td_stripoffset;
+	uint32*	td_stripbytecount;
+#if SUBIFD_SUPPORT
+	uint16	td_nsubifd;
+	uint32*	td_subifd;
+#endif
+#ifdef YCBCR_SUPPORT
+	float*	td_ycbcrcoeffs;
+	uint16	td_ycbcrsubsampling[2];
+	uint16	td_ycbcrpositioning;
+#endif
+#ifdef COLORIMETRY_SUPPORT
+	float*	td_whitepoint;
+	float*	td_primarychromas;
+	float*	td_refblackwhite;
+	uint16*	td_transferfunction[3];
+#endif
+#ifdef CMYK_SUPPORT
+	uint16	td_inkset;
+	uint16	td_ninks;
+	uint16	td_dotrange[2];
+	int	td_inknameslen;
+	char*	td_inknames;
+	char*	td_targetprinter;
+#endif
+#ifdef ICC_SUPPORT
+	uint32	td_profileLength;
+	void	*td_profileData;
+#endif
+#ifdef PHOTOSHOP_SUPPORT
+	uint32	td_photoshopLength;
+	void	*td_photoshopData;
+#endif
+#ifdef IPTC_SUPPORT
+	uint32	td_richtiffiptcLength;
+	void	*td_richtiffiptcData;
+#endif
+        /* Begin Pixar Tag values. */
+        uint32	td_imagefullwidth, td_imagefulllength;
+ 	char*	td_textureformat;
+ 	char*	td_wrapmodes;
+ 	float	td_fovcot;
+ 	float*	td_matrixWorldToScreen;
+ 	float*	td_matrixWorldToCamera;
+ 	/* End Pixar Tag Values. */
+	uint32	td_xmlpacketLength;
+	void	*td_xmlpacketData;
+		int     td_customValueCount;
+        TIFFTagValue *td_customValues;
+} TIFFDirectory;
+
+/*
+ * Field flags used to indicate fields that have
+ * been set in a directory, and to reference fields
+ * when manipulating a directory.
+ */
+
+/*
+ * FIELD_IGNORE is used to signify tags that are to
+ * be processed but otherwise ignored.  This permits
+ * antiquated tags to be quietly read and discarded.
+ * Note that a bit *is* allocated for ignored tags;
+ * this is understood by the directory reading logic
+ * which uses this fact to avoid special-case handling
+ */ 
+#define	FIELD_IGNORE			0
+
+/* multi-item fields */
+#define	FIELD_IMAGEDIMENSIONS		1
+#define FIELD_TILEDIMENSIONS		2
+#define	FIELD_RESOLUTION		3
+#define	FIELD_POSITION			4
+
+/* single-item fields */
+#define	FIELD_SUBFILETYPE		5
+#define	FIELD_BITSPERSAMPLE		6
+#define	FIELD_COMPRESSION		7
+#define	FIELD_PHOTOMETRIC		8
+#define	FIELD_THRESHHOLDING		9
+#define	FIELD_FILLORDER			10
+#define	FIELD_DOCUMENTNAME		11
+#define	FIELD_IMAGEDESCRIPTION		12
+#define	FIELD_MAKE			13
+#define	FIELD_MODEL			14
+#define	FIELD_ORIENTATION		15
+#define	FIELD_SAMPLESPERPIXEL		16
+#define	FIELD_ROWSPERSTRIP		17
+#define	FIELD_MINSAMPLEVALUE		18
+#define	FIELD_MAXSAMPLEVALUE		19
+#define	FIELD_PLANARCONFIG		20
+#define	FIELD_PAGENAME			21
+#define	FIELD_RESOLUTIONUNIT		22
+#define	FIELD_PAGENUMBER		23
+#define	FIELD_STRIPBYTECOUNTS		24
+#define	FIELD_STRIPOFFSETS		25
+#define	FIELD_COLORMAP			26
+#define FIELD_ARTIST			27
+#define FIELD_DATETIME			28
+#define FIELD_HOSTCOMPUTER		29
+/* unused - was FIELD_SOFTWARE          30 */
+#define	FIELD_EXTRASAMPLES		31
+#define FIELD_SAMPLEFORMAT		32
+#define	FIELD_SMINSAMPLEVALUE		33
+#define	FIELD_SMAXSAMPLEVALUE		34
+#define FIELD_IMAGEDEPTH		35
+#define FIELD_TILEDEPTH			36
+#define	FIELD_HALFTONEHINTS		37
+#define FIELD_YCBCRCOEFFICIENTS		38
+#define FIELD_YCBCRSUBSAMPLING		39
+#define FIELD_YCBCRPOSITIONING		40
+#define	FIELD_REFBLACKWHITE		41
+#define	FIELD_WHITEPOINT		42
+#define	FIELD_PRIMARYCHROMAS		43
+#define	FIELD_TRANSFERFUNCTION		44
+#define	FIELD_INKSET			45
+#define	FIELD_INKNAMES			46
+#define	FIELD_DOTRANGE			47
+#define	FIELD_TARGETPRINTER		48
+#define	FIELD_SUBIFD			49
+#define	FIELD_NUMBEROFINKS		50
+#define FIELD_ICCPROFILE		51
+#define FIELD_PHOTOSHOP			52
+#define FIELD_RICHTIFFIPTC		53
+#define FIELD_STONITS			54
+/* Begin PIXAR */
+#define	FIELD_IMAGEFULLWIDTH		55
+#define	FIELD_IMAGEFULLLENGTH		56
+#define FIELD_TEXTUREFORMAT		57
+#define FIELD_WRAPMODES			58
+#define FIELD_FOVCOT			59
+#define FIELD_MATRIX_WORLDTOSCREEN	60
+#define FIELD_MATRIX_WORLDTOCAMERA	61
+#define FIELD_COPYRIGHT			62
+#define FIELD_XMLPACKET			63
+/*      FIELD_CUSTOM (see tiffio.h)     65 */
+/* end of support for well-known tags; codec-private tags follow */
+#define	FIELD_CODEC			66	/* base of codec-private tags */
+
+
+/*
+ * Pseudo-tags don't normally need field bits since they
+ * are not written to an output file (by definition).
+ * The library also has express logic to always query a
+ * codec for a pseudo-tag so allocating a field bit for
+ * one is a waste.   If codec wants to promote the notion
+ * of a pseudo-tag being ``set'' or ``unset'' then it can
+ * do using internal state flags without polluting the
+ * field bit space defined for real tags.
+ */
+#define	FIELD_PSEUDO			0
+
+#define	FIELD_LAST			(32*FIELD_SETLONGS-1)
+
+#define	TIFFExtractData(tif, type, v) \
+    ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \
+        ((v) >> (tif)->tif_typeshift[type]) & (tif)->tif_typemask[type] : \
+	(v) & (tif)->tif_typemask[type]))
+#define	TIFFInsertData(tif, type, v) \
+    ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \
+        ((v) & (tif)->tif_typemask[type]) << (tif)->tif_typeshift[type] : \
+	(v) & (tif)->tif_typemask[type]))
+
+
+#define BITn(n)				(((u_long)1L)<<((n)&0x1f)) 
+#define BITFIELDn(tif, n)		((tif)->tif_dir.td_fieldsset[(n)/32]) 
+#define TIFFFieldSet(tif, field)	(BITFIELDn(tif, field) & BITn(field)) 
+#define TIFFSetFieldBit(tif, field)	(BITFIELDn(tif, field) |= BITn(field))
+#define TIFFClrFieldBit(tif, field)	(BITFIELDn(tif, field) &= ~BITn(field))
+
+#define	FieldSet(fields, f)		(fields[(f)/32] & BITn(f))
+#define	ResetFieldBit(fields, f)	(fields[(f)/32] &= ~BITn(f))
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern	void _TIFFSetupFieldInfo(TIFF*);
+extern	void _TIFFPrintFieldInfo(TIFF*, FILE*);
+extern	TIFFDataType _TIFFSampleToTagType(TIFF*);
+extern  const TIFFFieldInfo* _TIFFFindOrRegisterFieldInfo( TIFF *tif,
+							   ttag_t tag,
+							   TIFFDataType dt );
+extern  TIFFFieldInfo* _TIFFCreateAnonFieldInfo( TIFF *tif, ttag_t tag,
+                                                 TIFFDataType dt );
+
+#define _TIFFMergeFieldInfo TIFFMergeFieldInfo
+#define _TIFFFindFieldInfo  TIFFFindFieldInfo
+#define _TIFFFieldWithTag   TIFFFieldWithTag
+    
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFDIR_ */
diff --git a/src/tiff/tif_dirinfo.c b/src/tiff/tif_dirinfo.c
new file mode 100644
index 0000000..fe085c1
--- /dev/null
+++ b/src/tiff/tif_dirinfo.c
@@ -0,0 +1,480 @@
+/* $Header: /home/terralib/src/tiff/tif_dirinfo.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Core Directory Tag Support.
+ */
+#include "tiffiop.h"
+#include <stdlib.h>
+
+/*
+ * NB: NB: THIS ARRAY IS ASSUMED TO BE SORTED BY TAG.
+ *     If a tag can have both LONG and SHORT types
+ *     then the LONG must be placed before the SHORT for
+ *     writing to work properly.
+ *
+ * NOTE: The second field (field_readcount) and third field (field_writecount)
+ *       sometimes use the values TIFF_VARIABLE (-1), TIFF_VARIABLE2 (-3)
+ *       and TIFFTAG_SPP (-2). The macros should be used but would throw off 
+ *       the formatting of the code, so please interprete the -1, -2 and -3 
+ *       values accordingly.
+ */
+#ifndef VMS
+static 
+#endif
+const TIFFFieldInfo tiffFieldInfo[] = {
+    { TIFFTAG_SUBFILETYPE,	 1, 1, TIFF_LONG,	FIELD_SUBFILETYPE,
+      TRUE,	FALSE,	"SubfileType" },
+/* XXX SHORT for compatibility w/ old versions of the library */
+    { TIFFTAG_SUBFILETYPE,	 1, 1, TIFF_SHORT,	FIELD_SUBFILETYPE,
+      TRUE,	FALSE,	"SubfileType" },
+    { TIFFTAG_OSUBFILETYPE,	 1, 1, TIFF_SHORT,	FIELD_SUBFILETYPE,
+      TRUE,	FALSE,	"OldSubfileType" },
+    { TIFFTAG_IMAGEWIDTH,	 1, 1, TIFF_LONG,	FIELD_IMAGEDIMENSIONS,
+      FALSE,	FALSE,	"ImageWidth" },
+    { TIFFTAG_IMAGEWIDTH,	 1, 1, TIFF_SHORT,	FIELD_IMAGEDIMENSIONS,
+      FALSE,	FALSE,	"ImageWidth" },
+    { TIFFTAG_IMAGELENGTH,	 1, 1, TIFF_LONG,	FIELD_IMAGEDIMENSIONS,
+      TRUE,	FALSE,	"ImageLength" },
+    { TIFFTAG_IMAGELENGTH,	 1, 1, TIFF_SHORT,	FIELD_IMAGEDIMENSIONS,
+      TRUE,	FALSE,	"ImageLength" },
+/* XXX LONG for compatibility with some broken TIFF writers */
+    { TIFFTAG_BITSPERSAMPLE,	-1,-1, TIFF_LONG,	FIELD_BITSPERSAMPLE,
+      FALSE,	FALSE,	"BitsPerSample" },
+    { TIFFTAG_BITSPERSAMPLE,	-1,-1, TIFF_SHORT,	FIELD_BITSPERSAMPLE,
+      FALSE,	FALSE,	"BitsPerSample" },
+/* XXX LONG for compatibility with some broken TIFF writers */
+    { TIFFTAG_COMPRESSION,	-1, 1, TIFF_LONG,	FIELD_COMPRESSION,
+      FALSE,	FALSE,	"Compression" },
+    { TIFFTAG_COMPRESSION,	-1, 1, TIFF_SHORT,	FIELD_COMPRESSION,
+      FALSE,	FALSE,	"Compression" },
+/* XXX LONG for compatibility with some broken TIFF writers */
+    { TIFFTAG_PHOTOMETRIC,	 1, 1, TIFF_LONG,	FIELD_PHOTOMETRIC,
+      FALSE,	FALSE,	"PhotometricInterpretation" },
+    { TIFFTAG_PHOTOMETRIC,	 1, 1, TIFF_SHORT,	FIELD_PHOTOMETRIC,
+      FALSE,	FALSE,	"PhotometricInterpretation" },
+    { TIFFTAG_THRESHHOLDING,	 1, 1, TIFF_SHORT,	FIELD_THRESHHOLDING,
+      TRUE,	FALSE,	"Threshholding" },
+    { TIFFTAG_CELLWIDTH,	 1, 1, TIFF_SHORT,	FIELD_IGNORE,
+      TRUE,	FALSE,	"CellWidth" },
+    { TIFFTAG_CELLLENGTH,	 1, 1, TIFF_SHORT,	FIELD_IGNORE,
+      TRUE,	FALSE,	"CellLength" },
+    { TIFFTAG_FILLORDER,	 1, 1, TIFF_SHORT,	FIELD_FILLORDER,
+      FALSE,	FALSE,	"FillOrder" },
+    { TIFFTAG_DOCUMENTNAME,	-1,-1, TIFF_ASCII,	FIELD_DOCUMENTNAME,
+      TRUE,	FALSE,	"DocumentName" },
+    { TIFFTAG_IMAGEDESCRIPTION,	-1,-1, TIFF_ASCII,	FIELD_IMAGEDESCRIPTION,
+      TRUE,	FALSE,	"ImageDescription" },
+    { TIFFTAG_MAKE,		-1,-1, TIFF_ASCII,	FIELD_MAKE,
+      TRUE,	FALSE,	"Make" },
+    { TIFFTAG_MODEL,		-1,-1, TIFF_ASCII,	FIELD_MODEL,
+      TRUE,	FALSE,	"Model" },
+    { TIFFTAG_STRIPOFFSETS,	-1,-1, TIFF_LONG,	FIELD_STRIPOFFSETS,
+      FALSE,	FALSE,	"StripOffsets" },
+    { TIFFTAG_STRIPOFFSETS,	-1,-1, TIFF_SHORT,	FIELD_STRIPOFFSETS,
+      FALSE,	FALSE,	"StripOffsets" },
+    { TIFFTAG_ORIENTATION,	 1, 1, TIFF_SHORT,	FIELD_ORIENTATION,
+      FALSE,	FALSE,	"Orientation" },
+    { TIFFTAG_SAMPLESPERPIXEL,	 1, 1, TIFF_SHORT,	FIELD_SAMPLESPERPIXEL,
+      FALSE,	FALSE,	"SamplesPerPixel" },
+    { TIFFTAG_ROWSPERSTRIP,	 1, 1, TIFF_LONG,	FIELD_ROWSPERSTRIP,
+      FALSE,	FALSE,	"RowsPerStrip" },
+    { TIFFTAG_ROWSPERSTRIP,	 1, 1, TIFF_SHORT,	FIELD_ROWSPERSTRIP,
+      FALSE,	FALSE,	"RowsPerStrip" },
+    { TIFFTAG_STRIPBYTECOUNTS,	-1,-1, TIFF_LONG,	FIELD_STRIPBYTECOUNTS,
+      FALSE,	FALSE,	"StripByteCounts" },
+    { TIFFTAG_STRIPBYTECOUNTS,	-1,-1, TIFF_SHORT,	FIELD_STRIPBYTECOUNTS,
+      FALSE,	FALSE,	"StripByteCounts" },
+    { TIFFTAG_MINSAMPLEVALUE,	-2,-1, TIFF_SHORT,	FIELD_MINSAMPLEVALUE,
+      TRUE,	FALSE,	"MinSampleValue" },
+    { TIFFTAG_MAXSAMPLEVALUE,	-2,-1, TIFF_SHORT,	FIELD_MAXSAMPLEVALUE,
+      TRUE,	FALSE,	"MaxSampleValue" },
+    { TIFFTAG_XRESOLUTION,	 1, 1, TIFF_RATIONAL,	FIELD_RESOLUTION,
+      FALSE,	FALSE,	"XResolution" },
+    { TIFFTAG_YRESOLUTION,	 1, 1, TIFF_RATIONAL,	FIELD_RESOLUTION,
+      FALSE,	FALSE,	"YResolution" },
+    { TIFFTAG_PLANARCONFIG,	 1, 1, TIFF_SHORT,	FIELD_PLANARCONFIG,
+      FALSE,	FALSE,	"PlanarConfiguration" },
+    { TIFFTAG_PAGENAME,		-1,-1, TIFF_ASCII,	FIELD_PAGENAME,
+      TRUE,	FALSE,	"PageName" },
+    { TIFFTAG_XPOSITION,	 1, 1, TIFF_RATIONAL,	FIELD_POSITION,
+      TRUE,	FALSE,	"XPosition" },
+    { TIFFTAG_YPOSITION,	 1, 1, TIFF_RATIONAL,	FIELD_POSITION,
+      TRUE,	FALSE,	"YPosition" },
+    { TIFFTAG_FREEOFFSETS,	-1,-1, TIFF_LONG,	FIELD_IGNORE,
+      FALSE,	FALSE,	"FreeOffsets" },
+    { TIFFTAG_FREEBYTECOUNTS,	-1,-1, TIFF_LONG,	FIELD_IGNORE,
+      FALSE,	FALSE,	"FreeByteCounts" },
+    { TIFFTAG_GRAYRESPONSEUNIT,	 1, 1, TIFF_SHORT,	FIELD_IGNORE,
+      TRUE,	FALSE,	"GrayResponseUnit" },
+    { TIFFTAG_GRAYRESPONSECURVE,-1,-1, TIFF_SHORT,	FIELD_IGNORE,
+      TRUE,	FALSE,	"GrayResponseCurve" },
+    { TIFFTAG_RESOLUTIONUNIT,	 1, 1, TIFF_SHORT,	FIELD_RESOLUTIONUNIT,
+      FALSE,	FALSE,	"ResolutionUnit" },
+    { TIFFTAG_PAGENUMBER,	 2, 2, TIFF_SHORT,	FIELD_PAGENUMBER,
+      TRUE,	FALSE,	"PageNumber" },
+    { TIFFTAG_COLORRESPONSEUNIT, 1, 1, TIFF_SHORT,	FIELD_IGNORE,
+      TRUE,	FALSE,	"ColorResponseUnit" },
+    { TIFFTAG_TRANSFERFUNCTION,	-1,-1, TIFF_SHORT,	FIELD_TRANSFERFUNCTION,
+      TRUE,	FALSE,	"TransferFunction" },
+    { TIFFTAG_SOFTWARE,		-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
+      TRUE,	FALSE,	"Software" },
+    { TIFFTAG_DATETIME,		20,20, TIFF_ASCII,	FIELD_DATETIME,
+      TRUE,	FALSE,	"DateTime" },
+    { TIFFTAG_ARTIST,		-1,-1, TIFF_ASCII,	FIELD_ARTIST,
+      TRUE,	FALSE,	"Artist" },
+    { TIFFTAG_HOSTCOMPUTER,	-1,-1, TIFF_ASCII,	FIELD_HOSTCOMPUTER,
+      TRUE,	FALSE,	"HostComputer" },
+    { TIFFTAG_WHITEPOINT,	 2, 2, TIFF_RATIONAL,FIELD_WHITEPOINT,
+      TRUE,	FALSE,	"WhitePoint" },
+    { TIFFTAG_PRIMARYCHROMATICITIES,6,6,TIFF_RATIONAL,FIELD_PRIMARYCHROMAS,
+      TRUE,	FALSE,	"PrimaryChromaticities" },
+    { TIFFTAG_COLORMAP,		-1,-1, TIFF_SHORT,	FIELD_COLORMAP,
+      TRUE,	FALSE,	"ColorMap" },
+    { TIFFTAG_HALFTONEHINTS,	 2, 2, TIFF_SHORT,	FIELD_HALFTONEHINTS,
+      TRUE,	FALSE,	"HalftoneHints" },
+    { TIFFTAG_TILEWIDTH,	 1, 1, TIFF_LONG,	FIELD_TILEDIMENSIONS,
+      FALSE,	FALSE,	"TileWidth" },
+    { TIFFTAG_TILEWIDTH,	 1, 1, TIFF_SHORT,	FIELD_TILEDIMENSIONS,
+      FALSE,	FALSE,	"TileWidth" },
+    { TIFFTAG_TILELENGTH,	 1, 1, TIFF_LONG,	FIELD_TILEDIMENSIONS,
+      FALSE,	FALSE,	"TileLength" },
+    { TIFFTAG_TILELENGTH,	 1, 1, TIFF_SHORT,	FIELD_TILEDIMENSIONS,
+      FALSE,	FALSE,	"TileLength" },
+    { TIFFTAG_TILEOFFSETS,	-1, 1, TIFF_LONG,	FIELD_STRIPOFFSETS,
+      FALSE,	FALSE,	"TileOffsets" },
+    { TIFFTAG_TILEBYTECOUNTS,	-1, 1, TIFF_LONG,	FIELD_STRIPBYTECOUNTS,
+      FALSE,	FALSE,	"TileByteCounts" },
+    { TIFFTAG_TILEBYTECOUNTS,	-1, 1, TIFF_SHORT,	FIELD_STRIPBYTECOUNTS,
+      FALSE,	FALSE,	"TileByteCounts" },
+    { TIFFTAG_SUBIFD,		-1,-1, TIFF_LONG,	FIELD_SUBIFD,
+      TRUE,	TRUE,	"SubIFD" },
+    { TIFFTAG_INKSET,		 1, 1, TIFF_SHORT,	FIELD_INKSET,
+      FALSE,	FALSE,	"InkSet" },
+    { TIFFTAG_INKNAMES,		-1,-1, TIFF_ASCII,	FIELD_INKNAMES,
+      TRUE,	TRUE,	"InkNames" },
+    { TIFFTAG_NUMBEROFINKS,	 1, 1, TIFF_SHORT,	FIELD_NUMBEROFINKS,
+      TRUE,	FALSE,	"NumberOfInks" },
+    { TIFFTAG_DOTRANGE,		 2, 2, TIFF_SHORT,	FIELD_DOTRANGE,
+      FALSE,	FALSE,	"DotRange" },
+    { TIFFTAG_DOTRANGE,		 2, 2, TIFF_BYTE,	FIELD_DOTRANGE,
+      FALSE,	FALSE,	"DotRange" },
+    { TIFFTAG_TARGETPRINTER,	-1,-1, TIFF_ASCII,	FIELD_TARGETPRINTER,
+      TRUE,	FALSE,	"TargetPrinter" },
+    { TIFFTAG_EXTRASAMPLES,	-1,-1, TIFF_SHORT,	FIELD_EXTRASAMPLES,
+      FALSE,	FALSE,	"ExtraSamples" },
+/* XXX for bogus Adobe Photoshop v2.5 files */
+    { TIFFTAG_EXTRASAMPLES,	-1,-1, TIFF_BYTE,	FIELD_EXTRASAMPLES,
+      FALSE,	FALSE,	"ExtraSamples" },
+    { TIFFTAG_SAMPLEFORMAT,	-1,-1, TIFF_SHORT,	FIELD_SAMPLEFORMAT,
+      FALSE,	FALSE,	"SampleFormat" },
+    { TIFFTAG_SMINSAMPLEVALUE,	-2,-1, TIFF_ANY,	FIELD_SMINSAMPLEVALUE,
+      TRUE,	FALSE,	"SMinSampleValue" },
+    { TIFFTAG_SMAXSAMPLEVALUE,	-2,-1, TIFF_ANY,	FIELD_SMAXSAMPLEVALUE,
+      TRUE,	FALSE,	"SMaxSampleValue" },
+    { TIFFTAG_YCBCRCOEFFICIENTS, 3, 3, TIFF_RATIONAL,	FIELD_YCBCRCOEFFICIENTS,
+      FALSE,	FALSE,	"YCbCrCoefficients" },
+    { TIFFTAG_YCBCRSUBSAMPLING,	 2, 2, TIFF_SHORT,	FIELD_YCBCRSUBSAMPLING,
+      FALSE,	FALSE,	"YCbCrSubsampling" },
+    { TIFFTAG_YCBCRPOSITIONING,	 1, 1, TIFF_SHORT,	FIELD_YCBCRPOSITIONING,
+      FALSE,	FALSE,	"YCbCrPositioning" },
+    { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_RATIONAL,	FIELD_REFBLACKWHITE,
+      TRUE,	FALSE,	"ReferenceBlackWhite" },
+/* XXX temporarily accept LONG for backwards compatibility */
+    { TIFFTAG_REFERENCEBLACKWHITE,6,6,TIFF_LONG,	FIELD_REFBLACKWHITE,
+      TRUE,	FALSE,	"ReferenceBlackWhite" },
+    { TIFFTAG_XMLPACKET,	-1,-3, TIFF_UNDEFINED,	FIELD_XMLPACKET,
+      FALSE,	TRUE,	"XMLPacket" },
+/* begin SGI tags */
+    { TIFFTAG_MATTEING,		 1, 1, TIFF_SHORT,	FIELD_EXTRASAMPLES,
+      FALSE,	FALSE,	"Matteing" },
+    { TIFFTAG_DATATYPE,		-2,-1, TIFF_SHORT,	FIELD_SAMPLEFORMAT,
+      FALSE,	FALSE,	"DataType" },
+    { TIFFTAG_IMAGEDEPTH,	 1, 1, TIFF_LONG,	FIELD_IMAGEDEPTH,
+      FALSE,	FALSE,	"ImageDepth" },
+    { TIFFTAG_IMAGEDEPTH,	 1, 1, TIFF_SHORT,	FIELD_IMAGEDEPTH,
+      FALSE,	FALSE,	"ImageDepth" },
+    { TIFFTAG_TILEDEPTH,	 1, 1, TIFF_LONG,	FIELD_TILEDEPTH,
+      FALSE,	FALSE,	"TileDepth" },
+    { TIFFTAG_TILEDEPTH,	 1, 1, TIFF_SHORT,	FIELD_TILEDEPTH,
+      FALSE,	FALSE,	"TileDepth" },
+/* end SGI tags */
+/* begin Pixar tags */
+    { TIFFTAG_PIXAR_IMAGEFULLWIDTH,  1, 1, TIFF_LONG,	FIELD_IMAGEFULLWIDTH,
+      TRUE,	FALSE,	"ImageFullWidth" },
+    { TIFFTAG_PIXAR_IMAGEFULLLENGTH, 1, 1, TIFF_LONG,	FIELD_IMAGEFULLLENGTH,
+      TRUE,	FALSE,	"ImageFullLength" },
+    { TIFFTAG_PIXAR_TEXTUREFORMAT,  -1,-1, TIFF_ASCII,	FIELD_TEXTUREFORMAT,
+      TRUE,	FALSE,	"TextureFormat" },
+    { TIFFTAG_PIXAR_WRAPMODES,	    -1,-1, TIFF_ASCII,	FIELD_WRAPMODES,
+      TRUE,	FALSE,	"TextureWrapModes" },
+    { TIFFTAG_PIXAR_FOVCOT,	     1, 1, TIFF_FLOAT,	FIELD_FOVCOT,
+      TRUE,	FALSE,	"FieldOfViewCotan" },
+    { TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN,	16,16,	TIFF_FLOAT,
+      FIELD_MATRIX_WORLDTOSCREEN,	TRUE,	FALSE,	"MatrixWorldToScreen" },
+    { TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA,	16,16,	TIFF_FLOAT,
+       FIELD_MATRIX_WORLDTOCAMERA,	TRUE,	FALSE,	"MatrixWorldToCamera" },
+    { TIFFTAG_COPYRIGHT,	-1,-1, TIFF_ASCII,	FIELD_COPYRIGHT,
+      TRUE,	FALSE,	"Copyright" },
+/* end Pixar tags */
+#ifdef IPTC_SUPPORT
+#ifdef PHOTOSHOP_SUPPORT
+    { TIFFTAG_RICHTIFFIPTC, -1,-1, TIFF_LONG,   FIELD_RICHTIFFIPTC, 
+      FALSE,    TRUE,   "RichTIFFIPTC" },
+#else
+    { TIFFTAG_RICHTIFFIPTC, -1,-3, TIFF_UNDEFINED, FIELD_RICHTIFFIPTC, 
+      FALSE,    TRUE,   "RichTIFFIPTC" },
+#endif
+#endif
+    { TIFFTAG_PHOTOSHOP,    -1,-3, TIFF_BYTE,   FIELD_PHOTOSHOP, 
+      FALSE,    TRUE,   "Photoshop" },
+    { TIFFTAG_ICCPROFILE,	-1,-3, TIFF_UNDEFINED,	FIELD_ICCPROFILE,
+      FALSE,	TRUE,	"ICC Profile" },
+    { TIFFTAG_STONITS,		 1, 1, TIFF_DOUBLE,	FIELD_STONITS,
+      FALSE,	FALSE,	"StoNits" },
+};
+#define	N(a)	(sizeof (a) / sizeof (a[0]))
+
+void
+_TIFFSetupFieldInfo(TIFF* tif)
+{
+	if (tif->tif_fieldinfo) {
+		int  i;
+
+		for (i = 0; i < tif->tif_nfields; i++) 
+		{
+			TIFFFieldInfo *fld = tif->tif_fieldinfo[i];
+			if (fld->field_bit == FIELD_CUSTOM && 
+				strncmp("Tag ", fld->field_name, 4) == 0) 
+				{
+				_TIFFfree(fld->field_name);
+				_TIFFfree(fld);
+				}
+		}   
+      
+		_TIFFfree(tif->tif_fieldinfo);
+		tif->tif_nfields = 0;
+	}
+	_TIFFMergeFieldInfo(tif, tiffFieldInfo, N(tiffFieldInfo));
+}
+
+static int
+tagCompare(const void* a, const void* b)
+{
+	const TIFFFieldInfo* ta = *(const TIFFFieldInfo**) a;
+	const TIFFFieldInfo* tb = *(const TIFFFieldInfo**) b;
+	/* NB: be careful of return values for 16-bit platforms */
+	if (ta->field_tag != tb->field_tag)
+		return (ta->field_tag < tb->field_tag ? -1 : 1);
+	else
+		return ((int)tb->field_type - (int)ta->field_type);
+}
+
+void
+_TIFFMergeFieldInfo(TIFF* tif, const TIFFFieldInfo info[], int n)
+{
+	TIFFFieldInfo** tp;
+	int i;
+
+	if (tif->tif_nfields > 0) {
+		tif->tif_fieldinfo = (TIFFFieldInfo**)
+		    _TIFFrealloc(tif->tif_fieldinfo,
+			(tif->tif_nfields+n) * sizeof (TIFFFieldInfo*));
+	} else {
+		tif->tif_fieldinfo = (TIFFFieldInfo**)
+		    _TIFFmalloc(n * sizeof (TIFFFieldInfo*));
+	}
+	tp = &tif->tif_fieldinfo[tif->tif_nfields];
+	for (i = 0; i < n; i++)
+		tp[i] = (TIFFFieldInfo*) &info[i];	/* XXX */
+
+        /* Sort the field info by tag number */
+        qsort(tif->tif_fieldinfo, (size_t) (tif->tif_nfields += n),
+              sizeof (TIFFFieldInfo*), tagCompare);
+}
+
+void
+_TIFFPrintFieldInfo(TIFF* tif, FILE* fd)
+{
+	int i;
+
+	fprintf(fd, "%s: \n", tif->tif_name);
+	for (i = 0; i < tif->tif_nfields; i++) {
+		const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
+		fprintf(fd, "field[%2d] %5lu, %2d, %2d, %d, %2d, %5s, %5s, %s\n"
+			, i
+			, (unsigned long) fip->field_tag
+			, fip->field_readcount, fip->field_writecount
+			, fip->field_type
+			, fip->field_bit
+			, fip->field_oktochange ? "TRUE" : "FALSE"
+			, fip->field_passcount ? "TRUE" : "FALSE"
+			, fip->field_name
+		);
+	}
+}
+
+/*
+ * Return size of TIFFDataType in bytes
+ */
+int
+TIFFDataWidth(TIFFDataType type)
+{
+	switch(type)
+	{
+	case 0:  /* nothing */
+	case 1:  /* TIFF_BYTE */
+	case 2:  /* TIFF_ASCII */
+	case 6:  /* TIFF_SBYTE */
+	case 7:  /* TIFF_UNDEFINED */
+		return 1;
+	case 3:  /* TIFF_SHORT */
+	case 8:  /* TIFF_SSHORT */
+		return 2;
+	case 4:  /* TIFF_LONG */
+	case 9:  /* TIFF_SLONG */
+	case 11: /* TIFF_FLOAT */
+        case 13: /* TIFF_IFD */
+		return 4;
+	case 5:  /* TIFF_RATIONAL */
+	case 10: /* TIFF_SRATIONAL */
+	case 12: /* TIFF_DOUBLE */
+		return 8;
+	default:
+		return 0; /* will return 0 for unknown types */
+	}
+}
+
+/*
+ * Return nearest TIFFDataType to the sample type of an image.
+ */
+TIFFDataType
+_TIFFSampleToTagType(TIFF* tif)
+{
+	int bps = (int) TIFFhowmany(tif->tif_dir.td_bitspersample, 8);
+
+	switch (tif->tif_dir.td_sampleformat) {
+	case SAMPLEFORMAT_IEEEFP:
+		return (bps == 4 ? TIFF_FLOAT : TIFF_DOUBLE);
+	case SAMPLEFORMAT_INT:
+		return (bps <= 1 ? TIFF_SBYTE :
+		    bps <= 2 ? TIFF_SSHORT : TIFF_SLONG);
+	case SAMPLEFORMAT_UINT:
+		return (bps <= 1 ? TIFF_BYTE :
+		    bps <= 2 ? TIFF_SHORT : TIFF_LONG);
+	case SAMPLEFORMAT_VOID:
+		return (TIFF_UNDEFINED);
+	}
+	/*NOTREACHED*/
+	return (TIFF_UNDEFINED);
+}
+
+const TIFFFieldInfo*
+_TIFFFindFieldInfo(TIFF* tif, ttag_t tag, TIFFDataType dt)
+{
+	static const TIFFFieldInfo *last = NULL;
+	int i, n;
+
+	if (last && last->field_tag == tag &&
+	    (dt == TIFF_ANY || dt == last->field_type))
+		return (last);
+	/* NB: if table gets big, use sorted search (e.g. binary search) */
+	if(dt != TIFF_ANY) {
+            TIFFFieldInfo key = {0, 0, 0, 0, 0, 0, 0, 0};
+            key.field_tag = tag;
+            key.field_type = dt;
+            return((const TIFFFieldInfo *) bsearch(&key, 
+						   tif->tif_fieldinfo, 
+						   tif->tif_nfields,
+						   sizeof(TIFFFieldInfo), 
+						   tagCompare));
+        } else for (i = 0, n = tif->tif_nfields; i < n; i++) {
+		const TIFFFieldInfo* fip = tif->tif_fieldinfo[i];
+		if (fip->field_tag == tag &&
+		    (dt == TIFF_ANY || fip->field_type == dt))
+			return (last = fip);
+	}
+	return ((const TIFFFieldInfo *)0);
+}
+
+#include <assert.h>
+#include <stdio.h>
+
+const TIFFFieldInfo*
+_TIFFFieldWithTag(TIFF* tif, ttag_t tag)
+{
+	const TIFFFieldInfo* fip = _TIFFFindFieldInfo(tif, tag, TIFF_ANY);
+	if (!fip) {
+		TIFFError("TIFFFieldWithTag",
+		    "Internal error, unknown tag 0x%x", (u_int) tag);
+		assert(fip != NULL);
+		/*NOTREACHED*/
+	}
+	return (fip);
+}
+
+const TIFFFieldInfo*
+_TIFFFindOrRegisterFieldInfo( TIFF *tif, ttag_t tag, TIFFDataType dt )
+
+{
+    const TIFFFieldInfo *fld;
+
+    fld = _TIFFFindFieldInfo( tif, tag, dt );
+    if( fld == NULL )
+    {
+        fld = _TIFFCreateAnonFieldInfo( tif, tag, dt );
+        _TIFFMergeFieldInfo( tif, fld, 1 );
+    }
+
+    return fld;
+}
+
+TIFFFieldInfo*
+_TIFFCreateAnonFieldInfo(TIFF *tif, ttag_t tag, TIFFDataType field_type)
+{
+    TIFFFieldInfo *fld;
+
+    fld = (TIFFFieldInfo *) _TIFFmalloc(sizeof (TIFFFieldInfo));
+    _TIFFmemset( fld, 0, sizeof(TIFFFieldInfo) );
+
+    fld->field_tag = tag;
+    fld->field_readcount = TIFF_VARIABLE;
+    fld->field_writecount = TIFF_VARIABLE;
+    fld->field_type = field_type;
+    fld->field_bit = FIELD_CUSTOM;
+    fld->field_oktochange = TRUE;
+    fld->field_passcount = TRUE;
+    fld->field_name = (char *) _TIFFmalloc(32);
+
+    /* note that this name is a special sign to TIFFClose() and
+     * _TIFFSetupFieldInfo() to free the field
+     */
+    sprintf(fld->field_name, "Tag %d", (int) tag);
+
+    return fld;    
+}
diff --git a/src/tiff/tif_dirread.c b/src/tiff/tif_dirread.c
new file mode 100644
index 0000000..cd41347
--- /dev/null
+++ b/src/tiff/tif_dirread.c
@@ -0,0 +1,1485 @@
+/* $Header: /home/terralib/src/tiff/tif_dirread.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Read Support Routines.
+ */
+#include "tiffiop.h"
+
+#define	IGNORE	0		/* tag placeholder used below */
+
+#if HAVE_IEEEFP
+#define	TIFFCvtIEEEFloatToNative(tif, n, fp)
+#define	TIFFCvtIEEEDoubleToNative(tif, n, dp)
+#else
+extern	void TIFFCvtIEEEFloatToNative(TIFF*, uint32, float*);
+extern	void TIFFCvtIEEEDoubleToNative(TIFF*, uint32, double*);
+#endif
+
+static	int EstimateStripByteCounts(TIFF*, TIFFDirEntry*, uint16);
+static	void MissingRequired(TIFF*, const char*);
+static	int CheckDirCount(TIFF*, TIFFDirEntry*, uint32);
+static	tsize_t TIFFFetchData(TIFF*, TIFFDirEntry*, char*);
+static	tsize_t TIFFFetchString(TIFF*, TIFFDirEntry*, char*);
+static	float TIFFFetchRational(TIFF*, TIFFDirEntry*);
+static	int TIFFFetchNormalTag(TIFF*, TIFFDirEntry*);
+static	int TIFFFetchPerSampleShorts(TIFF*, TIFFDirEntry*, int*);
+static	int TIFFFetchPerSampleAnys(TIFF*, TIFFDirEntry*, double*);
+static	int TIFFFetchShortArray(TIFF*, TIFFDirEntry*, uint16*);
+static	int TIFFFetchStripThing(TIFF*, TIFFDirEntry*, long, uint32**);
+static	int TIFFFetchExtraSamples(TIFF*, TIFFDirEntry*);
+static	int TIFFFetchRefBlackWhite(TIFF*, TIFFDirEntry*);
+static	float TIFFFetchFloat(TIFF*, TIFFDirEntry*);
+static	int TIFFFetchFloatArray(TIFF*, TIFFDirEntry*, float*);
+static	int TIFFFetchDoubleArray(TIFF*, TIFFDirEntry*, double*);
+static	int TIFFFetchAnyArray(TIFF*, TIFFDirEntry*, double*);
+static	int TIFFFetchShortPair(TIFF*, TIFFDirEntry*);
+static	void ChopUpSingleUncompressedStrip(TIFF*);
+
+static char *
+CheckMalloc(TIFF* tif, tsize_t n, const char* what)
+{
+	char *cp = (char*)_TIFFmalloc(n);
+	if (cp == NULL)
+		TIFFError(tif->tif_name, "No space %s", what);
+	return (cp);
+}
+
+/*
+ * Read the next TIFF directory from a file
+ * and convert it to the internal format.
+ * We read directories sequentially.
+ */
+int
+TIFFReadDirectory(TIFF* tif)
+{
+	static const char module[] = "TIFFReadDirectory";
+
+	register TIFFDirEntry* dp;
+	register int n;
+	register TIFFDirectory* td;
+	TIFFDirEntry* dir;
+	int iv;
+	long v;
+	double dv;
+	const TIFFFieldInfo* fip;
+	int fix;
+	uint16 dircount;
+	toff_t nextdiroff;
+	char* cp;
+	int diroutoforderwarning = 0;
+
+	tif->tif_diroff = tif->tif_nextdiroff;
+	if (tif->tif_diroff == 0)		/* no more directories */
+		return (0);
+
+	/*
+	 * XXX: Trick to prevent IFD looping. The one can create TIFF file
+	 * with looped directory pointers. We will maintain a list of already
+	 * seen directories and check every IFD offset against this list.
+	 */
+	for (n = 0; n < tif->tif_dirnumber; n++) {
+		if (tif->tif_dirlist[n] == tif->tif_diroff)
+			return (0);
+	}
+	tif->tif_dirnumber++;
+	tif->tif_dirlist = _TIFFrealloc(tif->tif_dirlist,
+					tif->tif_dirnumber * sizeof(toff_t));
+	if (!tif->tif_dirlist) {
+		TIFFError(module,
+			  "%.1000s: Failed to allocate space for IFD list",
+			  tif->tif_name);
+		return (0);
+	}
+	tif->tif_dirlist[tif->tif_dirnumber - 1] = tif->tif_diroff;
+
+	/*
+	 * Cleanup any previous compression state.
+	 */
+	(*tif->tif_cleanup)(tif);
+	tif->tif_curdir++;
+	nextdiroff = 0;
+	if (!isMapped(tif)) {
+		if (!SeekOK(tif, tif->tif_diroff)) {
+			TIFFError(module,
+			    "%.1000s: Seek error accessing TIFF directory",
+                            tif->tif_name);
+			return (0);
+		}
+		if (!ReadOK(tif, &dircount, sizeof (uint16))) {
+			TIFFError(module,
+			    "%.1000s: Can not read TIFF directory count",
+                            tif->tif_name);
+			return (0);
+		}
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabShort(&dircount);
+		dir = (TIFFDirEntry *)CheckMalloc(tif,
+		    dircount * sizeof (TIFFDirEntry), "to read TIFF directory");
+		if (dir == NULL)
+			return (0);
+		if (!ReadOK(tif, dir, dircount*sizeof (TIFFDirEntry))) {
+			TIFFError(module,
+                                  "%.100s: Can not read TIFF directory",
+                                  tif->tif_name);
+			goto bad;
+		}
+		/*
+		 * Read offset to next directory for sequential scans.
+		 */
+		(void) ReadOK(tif, &nextdiroff, sizeof (uint32));
+	} else {
+		toff_t off = tif->tif_diroff;
+
+		if (off + sizeof (uint16) > tif->tif_size) {
+			TIFFError(module,
+			    "%.1000s: Can not read TIFF directory count",
+                            tif->tif_name);
+			return (0);
+		} else
+			_TIFFmemcpy(&dircount, tif->tif_base + off, sizeof (uint16));
+		off += sizeof (uint16);
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabShort(&dircount);
+		dir = (TIFFDirEntry *)CheckMalloc(tif,
+		    dircount * sizeof (TIFFDirEntry), "to read TIFF directory");
+		if (dir == NULL)
+			return (0);
+		if (off + dircount*sizeof (TIFFDirEntry) > tif->tif_size) {
+			TIFFError(module,
+                                  "%.1000s: Can not read TIFF directory",
+                                  tif->tif_name);
+			goto bad;
+		} else
+			_TIFFmemcpy(dir, tif->tif_base + off,
+			    dircount*sizeof (TIFFDirEntry));
+		off += dircount* sizeof (TIFFDirEntry);
+		if (off + sizeof (uint32) <= tif->tif_size)
+			_TIFFmemcpy(&nextdiroff, tif->tif_base+off, sizeof (uint32));
+	}
+	if (tif->tif_flags & TIFF_SWAB)
+		TIFFSwabLong(&nextdiroff);
+	tif->tif_nextdiroff = nextdiroff;
+
+	tif->tif_flags &= ~TIFF_BEENWRITING;	/* reset before new dir */
+	/*
+	 * Setup default value and then make a pass over
+	 * the fields to check type and tag information,
+	 * and to extract info required to size data
+	 * structures.  A second pass is made afterwards
+	 * to read in everthing not taken in the first pass.
+	 */
+	td = &tif->tif_dir;
+	/* free any old stuff and reinit */
+	TIFFFreeDirectory(tif);
+	TIFFDefaultDirectory(tif);
+	/*
+	 * Electronic Arts writes gray-scale TIFF files
+	 * without a PlanarConfiguration directory entry.
+	 * Thus we setup a default value here, even though
+	 * the TIFF spec says there is no default value.
+	 */
+	TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+
+	/*
+	 * Sigh, we must make a separate pass through the
+	 * directory for the following reason:
+	 *
+	 * We must process the Compression tag in the first pass
+	 * in order to merge in codec-private tag definitions (otherwise
+	 * we may get complaints about unknown tags).  However, the
+	 * Compression tag may be dependent on the SamplesPerPixel
+	 * tag value because older TIFF specs permited Compression
+	 * to be written as a SamplesPerPixel-count tag entry.
+	 * Thus if we don't first figure out the correct SamplesPerPixel
+	 * tag value then we may end up ignoring the Compression tag
+	 * value because it has an incorrect count value (if the
+	 * true value of SamplesPerPixel is not 1).
+	 *
+	 * It sure would have been nice if Aldus had really thought
+	 * this stuff through carefully.
+	 */ 
+	for (dp = dir, n = dircount; n > 0; n--, dp++) {
+		if (tif->tif_flags & TIFF_SWAB) {
+			TIFFSwabArrayOfShort(&dp->tdir_tag, 2);
+			TIFFSwabArrayOfLong(&dp->tdir_count, 2);
+		}
+		if (dp->tdir_tag == TIFFTAG_SAMPLESPERPIXEL) {
+			if (!TIFFFetchNormalTag(tif, dp))
+				goto bad;
+			dp->tdir_tag = IGNORE;
+		}
+	}
+	/*
+	 * First real pass over the directory.
+	 */
+	fix = 0;
+	for (dp = dir, n = dircount; n > 0; n--, dp++) {
+
+                /*
+                 * Find the field information entry for this tag.
+		 * Added check for tags to ignore ... [BFC]
+                 */
+		if( TIFFReassignTagToIgnore(TIS_EXTRACT, dp->tdir_tag) )
+                    dp->tdir_tag = IGNORE;
+
+		if (fix >= tif->tif_nfields || dp->tdir_tag == IGNORE)
+			continue;
+               
+		/*
+		 * Silicon Beach (at least) writes unordered
+		 * directory tags (violating the spec).  Handle
+		 * it here, but be obnoxious (maybe they'll fix it?).
+		 */
+		if (dp->tdir_tag < tif->tif_fieldinfo[fix]->field_tag) {
+			if (!diroutoforderwarning) {
+				TIFFWarning(module,
+"%.1000s: invalid TIFF directory; tags are not sorted in ascending order",
+                                            tif->tif_name);
+				diroutoforderwarning = 1;
+			}
+			fix = 0;			/* O(n^2) */
+		}
+		while (fix < tif->tif_nfields &&
+		       tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
+			fix++;
+		if (fix >= tif->tif_nfields ||
+		    tif->tif_fieldinfo[fix]->field_tag != dp->tdir_tag) {
+
+                    TIFFWarning(module,
+			"%.1000s: unknown field with tag %d (0x%x) encountered",
+                                tif->tif_name, dp->tdir_tag,  dp->tdir_tag);
+
+                    TIFFMergeFieldInfo( tif,
+                                        _TIFFCreateAnonFieldInfo( tif,
+                                              dp->tdir_tag,
+					      (TIFFDataType) dp->tdir_type ),
+                                        1 );
+                    fix = 0;
+                    while (fix < tif->tif_nfields &&
+                           tif->tif_fieldinfo[fix]->field_tag < dp->tdir_tag)
+			fix++;
+		}
+		/*
+		 * Null out old tags that we ignore.
+		 */
+		if (tif->tif_fieldinfo[fix]->field_bit == FIELD_IGNORE) {
+	ignore:
+			dp->tdir_tag = IGNORE;
+			continue;
+		}
+		/*
+		 * Check data type.
+		 */
+		fip = tif->tif_fieldinfo[fix];
+		while (dp->tdir_type != (u_short) fip->field_type) {
+			if (fip->field_type == TIFF_ANY)	/* wildcard */
+				break;
+			fip++, fix++;
+			if (fix == tif->tif_nfields ||
+			    fip->field_tag != dp->tdir_tag) {
+				TIFFWarning(module,
+			"%.1000s: wrong data type %d for \"%s\"; tag ignored",
+					    tif->tif_name, dp->tdir_type,
+					    fip[-1].field_name);
+				goto ignore;
+			}
+		}
+		/*
+		 * Check count if known in advance.
+		 */
+		if (fip->field_readcount != TIFF_VARIABLE) {
+			uint32 expected = (fip->field_readcount == TIFF_SPP) ?
+			    (uint32) td->td_samplesperpixel :
+			    (uint32) fip->field_readcount;
+			if (!CheckDirCount(tif, dp, expected))
+				goto ignore;
+		}
+
+		switch (dp->tdir_tag) {
+		case TIFFTAG_COMPRESSION:
+			/*
+			 * The 5.0 spec says the Compression tag has
+			 * one value, while earlier specs say it has
+			 * one value per sample.  Because of this, we
+			 * accept the tag if one value is supplied.
+			 */
+			if (dp->tdir_count == 1) {
+				v = TIFFExtractData(tif,
+				    dp->tdir_type, dp->tdir_offset);
+				if (!TIFFSetField(tif, dp->tdir_tag, (int)v))
+					goto bad;
+				break;
+			}
+			if (!TIFFFetchPerSampleShorts(tif, dp, &iv) ||
+			    !TIFFSetField(tif, dp->tdir_tag, iv))
+				goto bad;
+			dp->tdir_tag = IGNORE;
+			break;
+		case TIFFTAG_STRIPOFFSETS:
+		case TIFFTAG_STRIPBYTECOUNTS:
+		case TIFFTAG_TILEOFFSETS:
+		case TIFFTAG_TILEBYTECOUNTS:
+			TIFFSetFieldBit(tif, fip->field_bit);
+			break;
+		case TIFFTAG_IMAGEWIDTH:
+		case TIFFTAG_IMAGELENGTH:
+		case TIFFTAG_IMAGEDEPTH:
+		case TIFFTAG_TILELENGTH:
+		case TIFFTAG_TILEWIDTH:
+		case TIFFTAG_TILEDEPTH:
+		case TIFFTAG_PLANARCONFIG:
+		case TIFFTAG_ROWSPERSTRIP:
+			if (!TIFFFetchNormalTag(tif, dp))
+				goto bad;
+			dp->tdir_tag = IGNORE;
+			break;
+		case TIFFTAG_EXTRASAMPLES:
+			(void) TIFFFetchExtraSamples(tif, dp);
+			dp->tdir_tag = IGNORE;
+			break;
+		}
+	}
+
+	/*
+	 * Allocate directory structure and setup defaults.
+	 */
+	if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
+		MissingRequired(tif, "ImageLength");
+		goto bad;
+	}
+	if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
+		MissingRequired(tif, "PlanarConfiguration");
+		goto bad;
+	}
+	/* 
+ 	 * Setup appropriate structures (by strip or by tile)
+	 */
+	if (!TIFFFieldSet(tif, FIELD_TILEDIMENSIONS)) {
+		td->td_nstrips = TIFFNumberOfStrips(tif);
+		td->td_tilewidth = td->td_imagewidth;
+		td->td_tilelength = td->td_rowsperstrip;
+		td->td_tiledepth = td->td_imagedepth;
+		tif->tif_flags &= ~TIFF_ISTILED;
+	} else {
+		td->td_nstrips = TIFFNumberOfTiles(tif);
+		tif->tif_flags |= TIFF_ISTILED;
+	}
+	td->td_stripsperimage = td->td_nstrips;
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+		td->td_stripsperimage /= td->td_samplesperpixel;
+	if (!TIFFFieldSet(tif, FIELD_STRIPOFFSETS)) {
+		MissingRequired(tif,
+		    isTiled(tif) ? "TileOffsets" : "StripOffsets");
+		goto bad;
+	}
+
+	/*
+	 * Second pass: extract other information.
+	 */
+	for (dp = dir, n = dircount; n > 0; n--, dp++) {
+		if (dp->tdir_tag == IGNORE)
+			continue;
+		switch (dp->tdir_tag) {
+		case TIFFTAG_MINSAMPLEVALUE:
+		case TIFFTAG_MAXSAMPLEVALUE:
+		case TIFFTAG_BITSPERSAMPLE:
+			/*
+			 * The 5.0 spec says the Compression tag has
+			 * one value, while earlier specs say it has
+			 * one value per sample.  Because of this, we
+			 * accept the tag if one value is supplied.
+			 *
+			 * The MinSampleValue, MaxSampleValue and
+			 * BitsPerSample tags are supposed to be written
+			 * as one value/sample, but some vendors incorrectly
+			 * write one value only -- so we accept that
+			 * as well (yech).
+			 */
+			if (dp->tdir_count == 1) {
+				v = TIFFExtractData(tif,
+				    dp->tdir_type, dp->tdir_offset);
+				if (!TIFFSetField(tif, dp->tdir_tag, (int)v))
+					goto bad;
+				break;
+			}
+			/* fall thru... */
+		case TIFFTAG_DATATYPE:
+		case TIFFTAG_SAMPLEFORMAT:
+			if (!TIFFFetchPerSampleShorts(tif, dp, &iv) ||
+			    !TIFFSetField(tif, dp->tdir_tag, iv))
+				goto bad;
+			break;
+		case TIFFTAG_SMINSAMPLEVALUE:
+		case TIFFTAG_SMAXSAMPLEVALUE:
+			if (!TIFFFetchPerSampleAnys(tif, dp, &dv) ||
+			    !TIFFSetField(tif, dp->tdir_tag, dv))
+				goto bad;
+			break;
+		case TIFFTAG_STRIPOFFSETS:
+		case TIFFTAG_TILEOFFSETS:
+			if (!TIFFFetchStripThing(tif, dp,
+			    td->td_nstrips, &td->td_stripoffset))
+				goto bad;
+			break;
+		case TIFFTAG_STRIPBYTECOUNTS:
+		case TIFFTAG_TILEBYTECOUNTS:
+			if (!TIFFFetchStripThing(tif, dp,
+			    td->td_nstrips, &td->td_stripbytecount))
+				goto bad;
+			break;
+		case TIFFTAG_COLORMAP:
+		case TIFFTAG_TRANSFERFUNCTION:
+			/*
+			 * TransferFunction can have either 1x or 3x data
+			 * values; Colormap can have only 3x items.
+			 */
+			v = 1L<<td->td_bitspersample;
+			if (dp->tdir_tag == TIFFTAG_COLORMAP ||
+			    dp->tdir_count != (uint32) v) {
+				if (!CheckDirCount(tif, dp, (uint32)(3*v)))
+					break;
+			}
+			v *= sizeof (uint16);
+			cp = CheckMalloc(tif, dp->tdir_count * sizeof (uint16),
+			    "to read \"TransferFunction\" tag");
+			if (cp != NULL) {
+				if (TIFFFetchData(tif, dp, cp)) {
+					/*
+					 * This deals with there being only
+					 * one array to apply to all samples.
+					 */
+					uint32 c =
+					    (uint32)1 << td->td_bitspersample;
+					if (dp->tdir_count == c)
+						v = 0;
+					TIFFSetField(tif, dp->tdir_tag,
+					    cp, cp+v, cp+2*v);
+				}
+				_TIFFfree(cp);
+			}
+			break;
+		case TIFFTAG_PAGENUMBER:
+		case TIFFTAG_HALFTONEHINTS:
+		case TIFFTAG_YCBCRSUBSAMPLING:
+		case TIFFTAG_DOTRANGE:
+			(void) TIFFFetchShortPair(tif, dp);
+			break;
+#ifdef COLORIMETRY_SUPPORT
+		case TIFFTAG_REFERENCEBLACKWHITE:
+			(void) TIFFFetchRefBlackWhite(tif, dp);
+			break;
+#endif
+/* BEGIN REV 4.0 COMPATIBILITY */
+		case TIFFTAG_OSUBFILETYPE:
+			v = 0;
+			switch (TIFFExtractData(tif, dp->tdir_type,
+			    dp->tdir_offset)) {
+			case OFILETYPE_REDUCEDIMAGE:
+				v = FILETYPE_REDUCEDIMAGE;
+				break;
+			case OFILETYPE_PAGE:
+				v = FILETYPE_PAGE;
+				break;
+			}
+			if (v)
+				(void) TIFFSetField(tif,
+				    TIFFTAG_SUBFILETYPE, (int)v);
+			break;
+/* END REV 4.0 COMPATIBILITY */
+		default:
+			(void) TIFFFetchNormalTag(tif, dp);
+			break;
+		}
+	}
+	/*
+	 * Verify Palette image has a Colormap.
+	 */
+	if (td->td_photometric == PHOTOMETRIC_PALETTE &&
+	    !TIFFFieldSet(tif, FIELD_COLORMAP)) {
+		MissingRequired(tif, "Colormap");
+		goto bad;
+	}
+	/*
+	 * Attempt to deal with a missing StripByteCounts tag.
+	 */
+	if (!TIFFFieldSet(tif, FIELD_STRIPBYTECOUNTS)) {
+		/*
+		 * Some manufacturers violate the spec by not giving
+		 * the size of the strips.  In this case, assume there
+		 * is one uncompressed strip of data.
+		 */
+		if ((td->td_planarconfig == PLANARCONFIG_CONTIG &&
+		    td->td_nstrips > 1) ||
+		    (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
+		     td->td_nstrips != td->td_samplesperpixel)) {
+		    MissingRequired(tif, "StripByteCounts");
+		    goto bad;
+		}
+		TIFFWarning(module,
+			"%.1000s: TIFF directory is missing required "
+			"\"%s\" field, calculating from imagelength",
+			tif->tif_name,
+		        _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
+		if (EstimateStripByteCounts(tif, dir, dircount) < 0)
+		    goto bad;
+/* 
+ * Assume we have wrong StripByteCount value (in case of single strip) in
+ * following cases:
+ *   - it is equal to zero along with StripOffset;
+ *   - it is larger than file itself (in case of uncompressed image).
+ */
+#define	BYTECOUNTLOOKSBAD \
+    ( (td->td_stripbytecount[0] == 0 && td->td_stripoffset[0] != 0) || \
+      (td->td_compression == COMPRESSION_NONE && \
+       td->td_stripbytecount[0] > TIFFGetFileSize(tif) - td->td_stripoffset[0]) )
+	} else if (td->td_nstrips == 1 && BYTECOUNTLOOKSBAD) {
+		/*
+		 * Plexus (and others) sometimes give a value
+		 * of zero for a tag when they don't know what
+		 * the correct value is!  Try and handle the
+		 * simple case of estimating the size of a one
+		 * strip image.
+		 */
+		TIFFWarning(module,
+	"%.1000s: Bogus \"%s\" field, ignoring and calculating from imagelength",
+                            tif->tif_name,
+		            _TIFFFieldWithTag(tif,TIFFTAG_STRIPBYTECOUNTS)->field_name);
+		if(EstimateStripByteCounts(tif, dir, dircount) < 0)
+		    goto bad;
+	}
+	if (dir)
+		_TIFFfree((char *)dir);
+	if (!TIFFFieldSet(tif, FIELD_MAXSAMPLEVALUE))
+		td->td_maxsamplevalue = (uint16)((1L<<td->td_bitspersample)-1);
+	/*
+	 * Setup default compression scheme.
+	 */
+	if (!TIFFFieldSet(tif, FIELD_COMPRESSION))
+		TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+        /*
+         * Some manufacturers make life difficult by writing
+	 * large amounts of uncompressed data as a single strip.
+	 * This is contrary to the recommendations of the spec.
+         * The following makes an attempt at breaking such images
+	 * into strips closer to the recommended 8k bytes.  A
+	 * side effect, however, is that the RowsPerStrip tag
+	 * value may be changed.
+         */
+	if (td->td_nstrips == 1 && td->td_compression == COMPRESSION_NONE &&
+	    (tif->tif_flags & (TIFF_STRIPCHOP|TIFF_ISTILED)) == TIFF_STRIPCHOP)
+		ChopUpSingleUncompressedStrip(tif);
+	/*
+	 * Reinitialize i/o since we are starting on a new directory.
+	 */
+	tif->tif_row = (uint32) -1;
+	tif->tif_curstrip = (tstrip_t) -1;
+	tif->tif_col = (uint32) -1;
+	tif->tif_curtile = (ttile_t) -1;
+	tif->tif_tilesize = TIFFTileSize(tif);
+	tif->tif_scanlinesize = TIFFScanlineSize(tif);
+	return (1);
+bad:
+	if (dir)
+		_TIFFfree(dir);
+	return (0);
+}
+
+static int
+EstimateStripByteCounts(TIFF* tif, TIFFDirEntry* dir, uint16 dircount)
+{
+	static const char module[] = "EstimateStripByteCounts";
+
+	register TIFFDirEntry *dp;
+	register TIFFDirectory *td = &tif->tif_dir;
+	uint16 i;
+
+	if (td->td_stripbytecount)
+		_TIFFfree(td->td_stripbytecount);
+	td->td_stripbytecount = (uint32*)
+	    CheckMalloc(tif, td->td_nstrips * sizeof (uint32),
+		"for \"StripByteCounts\" array");
+	if (td->td_compression != COMPRESSION_NONE) {
+		uint32 space = (uint32)(sizeof (TIFFHeader)
+		    + sizeof (uint16)
+		    + (dircount * sizeof (TIFFDirEntry))
+		    + sizeof (uint32));
+		toff_t filesize = TIFFGetFileSize(tif);
+		uint16 n;
+
+		/* calculate amount of space used by indirect values */
+		for (dp = dir, n = dircount; n > 0; n--, dp++)
+		{
+			uint32 cc = TIFFDataWidth((TIFFDataType) dp->tdir_type);
+			if (cc == 0) {
+				TIFFError(module,
+			"%.1000s: Cannot determine size of unknown tag type %d",
+					  tif->tif_name, dp->tdir_type);
+				return -1;
+			}
+			cc = cc * dp->tdir_count;
+			if (cc > sizeof (uint32))
+				space += cc;
+		}
+		space = filesize - space;
+		if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+			space /= td->td_samplesperpixel;
+		for (i = 0; i < td->td_nstrips; i++)
+			td->td_stripbytecount[i] = space;
+		/*
+		 * This gross hack handles the case were the offset to
+		 * the last strip is past the place where we think the strip
+		 * should begin.  Since a strip of data must be contiguous,
+		 * it's safe to assume that we've overestimated the amount
+		 * of data in the strip and trim this number back accordingly.
+		 */ 
+		i--;
+		if (((toff_t)(td->td_stripoffset[i]+td->td_stripbytecount[i]))
+                                                               > filesize)
+			td->td_stripbytecount[i] =
+			    filesize - td->td_stripoffset[i];
+	} else {
+		uint32 rowbytes = TIFFScanlineSize(tif);
+		uint32 rowsperstrip = td->td_imagelength/td->td_stripsperimage;
+		for (i = 0; i < td->td_nstrips; i++)
+			td->td_stripbytecount[i] = rowbytes*rowsperstrip;
+	}
+	TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
+	if (!TIFFFieldSet(tif, FIELD_ROWSPERSTRIP))
+		td->td_rowsperstrip = td->td_imagelength;
+	return 1;
+}
+
+static void
+MissingRequired(TIFF* tif, const char* tagname)
+{
+	static const char module[] = "MissingRequired";
+
+	TIFFError(module,
+		  "%.1000s: TIFF directory is missing required \"%s\" field",
+		  tif->tif_name, tagname);
+}
+
+/*
+ * Check the count field of a directory
+ * entry against a known value.  The caller
+ * is expected to skip/ignore the tag if
+ * there is a mismatch.
+ */
+static int
+CheckDirCount(TIFF* tif, TIFFDirEntry* dir, uint32 count)
+{
+	if (count != dir->tdir_count) {
+		TIFFWarning(tif->tif_name,
+	"incorrect count for field \"%s\" (%lu, expecting %lu); tag ignored",
+		    _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name,
+		    dir->tdir_count, count);
+		return (0);
+	}
+	return (1);
+}
+
+/*
+ * Fetch a contiguous directory item.
+ */
+static tsize_t
+TIFFFetchData(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+	int w = TIFFDataWidth((TIFFDataType) dir->tdir_type);
+	tsize_t cc = dir->tdir_count * w;
+
+	if (!isMapped(tif)) {
+		if (!SeekOK(tif, dir->tdir_offset))
+			goto bad;
+		if (!ReadOK(tif, cp, cc))
+			goto bad;
+	} else {
+		if (dir->tdir_offset + cc > tif->tif_size)
+			goto bad;
+		_TIFFmemcpy(cp, tif->tif_base + dir->tdir_offset, cc);
+	}
+	if (tif->tif_flags & TIFF_SWAB) {
+		switch (dir->tdir_type) {
+		case TIFF_SHORT:
+		case TIFF_SSHORT:
+			TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count);
+			break;
+		case TIFF_LONG:
+		case TIFF_SLONG:
+		case TIFF_FLOAT:
+			TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count);
+			break;
+		case TIFF_RATIONAL:
+		case TIFF_SRATIONAL:
+			TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count);
+			break;
+		case TIFF_DOUBLE:
+			TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count);
+			break;
+		}
+	}
+	return (cc);
+bad:
+	TIFFError(tif->tif_name, "Error fetching data for field \"%s\"",
+	    _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+	return ((tsize_t) 0);
+}
+
+/*
+ * Fetch an ASCII item from the file.
+ */
+static tsize_t
+TIFFFetchString(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+	if (dir->tdir_count <= 4) {
+		uint32 l = dir->tdir_offset;
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabLong(&l);
+		_TIFFmemcpy(cp, &l, dir->tdir_count);
+		return (1);
+	}
+	return (TIFFFetchData(tif, dir, cp));
+}
+
+/*
+ * Convert numerator+denominator to float.
+ */
+static int
+cvtRational(TIFF* tif, TIFFDirEntry* dir, uint32 num, uint32 denom, float* rv)
+{
+	if (denom == 0) {
+		TIFFError(tif->tif_name,
+		    "%s: Rational with zero denominator (num = %lu)",
+		    _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name, num);
+		return (0);
+	} else {
+		if (dir->tdir_type == TIFF_RATIONAL)
+			*rv = ((float)num / (float)denom);
+		else
+			*rv = ((float)(int32)num / (float)(int32)denom);
+		return (1);
+	}
+}
+
+/*
+ * Fetch a rational item from the file
+ * at offset off and return the value
+ * as a floating point number.
+ */
+static float
+TIFFFetchRational(TIFF* tif, TIFFDirEntry* dir)
+{
+	uint32 l[2];
+	float v;
+
+	return (!TIFFFetchData(tif, dir, (char *)l) ||
+	    !cvtRational(tif, dir, l[0], l[1], &v) ? 1.0f : v);
+}
+
+/*
+ * Fetch a single floating point value
+ * from the offset field and return it
+ * as a native float.
+ */
+static float
+TIFFFetchFloat(TIFF* tif, TIFFDirEntry* dir)
+{
+	long l = TIFFExtractData(tif, dir->tdir_type, dir->tdir_offset);
+	float v = *(float*) &l;
+	TIFFCvtIEEEFloatToNative(tif, 1, &v);
+	return (v);
+}
+
+/*
+ * Fetch an array of BYTE or SBYTE values.
+ */
+static int
+TIFFFetchByteArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
+{
+    if (dir->tdir_count <= 4) {
+        /*
+         * Extract data from offset field.
+         */
+        if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
+	    if (dir->tdir_type == TIFF_SBYTE)
+                switch (dir->tdir_count) {
+                    case 4: v[3] = (signed char)(dir->tdir_offset & 0xff);
+                    case 3: v[2] = (signed char)((dir->tdir_offset >> 8) & 0xff);
+                    case 2: v[1] = (signed char)((dir->tdir_offset >> 16) & 0xff);
+		    case 1: v[0] = (signed char)(dir->tdir_offset >> 24);	
+                }
+	    else
+                switch (dir->tdir_count) {
+                    case 4: v[3] = (uint16)(dir->tdir_offset & 0xff);
+                    case 3: v[2] = (uint16)((dir->tdir_offset >> 8) & 0xff);
+                    case 2: v[1] = (uint16)((dir->tdir_offset >> 16) & 0xff);
+		    case 1: v[0] = (uint16)(dir->tdir_offset >> 24);	
+                }
+	} else {
+	    if (dir->tdir_type == TIFF_SBYTE)
+                switch (dir->tdir_count) {
+                    case 4: v[3] = (signed char)(dir->tdir_offset >> 24);
+                    case 3: v[2] = (signed char)((dir->tdir_offset >> 16) & 0xff);
+                    case 2: v[1] = (signed char)((dir->tdir_offset >> 8) & 0xff);
+                    case 1: v[0] = (signed char)(dir->tdir_offset & 0xff);
+		}
+	    else
+                switch (dir->tdir_count) {
+                    case 4: v[3] = (uint16)(dir->tdir_offset >> 24);
+                    case 3: v[2] = (uint16)((dir->tdir_offset >> 16) & 0xff);
+                    case 2: v[1] = (uint16)((dir->tdir_offset >> 8) & 0xff);
+                    case 1: v[0] = (uint16)(dir->tdir_offset & 0xff);
+		}
+	}
+        return (1);
+    } else
+        return (TIFFFetchData(tif, dir, (char*) v) != 0);	/* XXX */
+}
+
+/*
+ * Fetch an array of SHORT or SSHORT values.
+ */
+static int
+TIFFFetchShortArray(TIFF* tif, TIFFDirEntry* dir, uint16* v)
+{
+	if (dir->tdir_count <= 2) {
+		if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
+			switch (dir->tdir_count) {
+			case 2: v[1] = (uint16) (dir->tdir_offset & 0xffff);
+			case 1: v[0] = (uint16) (dir->tdir_offset >> 16);
+			}
+		} else {
+			switch (dir->tdir_count) {
+			case 2: v[1] = (uint16) (dir->tdir_offset >> 16);
+			case 1: v[0] = (uint16) (dir->tdir_offset & 0xffff);
+			}
+		}
+		return (1);
+	} else
+		return (TIFFFetchData(tif, dir, (char *)v) != 0);
+}
+
+/*
+ * Fetch a pair of SHORT or BYTE values.
+ */
+static int
+TIFFFetchShortPair(TIFF* tif, TIFFDirEntry* dir)
+{
+	uint16 v[4];
+	int ok = 0;
+
+	switch (dir->tdir_type) {
+	case TIFF_SHORT:
+	case TIFF_SSHORT:
+		ok = TIFFFetchShortArray(tif, dir, v);
+		break;
+	case TIFF_BYTE:
+	case TIFF_SBYTE:
+		ok  = TIFFFetchByteArray(tif, dir, v);
+		break;
+	}
+	if (ok)
+		TIFFSetField(tif, dir->tdir_tag, v[0], v[1]);
+	return (ok);
+}
+
+/*
+ * Fetch an array of LONG or SLONG values.
+ */
+static int
+TIFFFetchLongArray(TIFF* tif, TIFFDirEntry* dir, uint32* v)
+{
+	if (dir->tdir_count == 1) {
+		v[0] = dir->tdir_offset;
+		return (1);
+	} else
+		return (TIFFFetchData(tif, dir, (char*) v) != 0);
+}
+
+/*
+ * Fetch an array of RATIONAL or SRATIONAL values.
+ */
+static int
+TIFFFetchRationalArray(TIFF* tif, TIFFDirEntry* dir, float* v)
+{
+	int ok = 0;
+	uint32* l;
+
+	l = (uint32*)CheckMalloc(tif,
+	    dir->tdir_count*TIFFDataWidth((TIFFDataType) dir->tdir_type),
+	    "to fetch array of rationals");
+	if (l) {
+		if (TIFFFetchData(tif, dir, (char *)l)) {
+			uint32 i;
+			for (i = 0; i < dir->tdir_count; i++) {
+				ok = cvtRational(tif, dir,
+				    l[2*i+0], l[2*i+1], &v[i]);
+				if (!ok)
+					break;
+			}
+		}
+		_TIFFfree((char *)l);
+	}
+	return (ok);
+}
+
+/*
+ * Fetch an array of FLOAT values.
+ */
+static int
+TIFFFetchFloatArray(TIFF* tif, TIFFDirEntry* dir, float* v)
+{
+
+	if (dir->tdir_count == 1) {
+		v[0] = *(float*) &dir->tdir_offset;
+		TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v);
+		return (1);
+	} else	if (TIFFFetchData(tif, dir, (char*) v)) {
+		TIFFCvtIEEEFloatToNative(tif, dir->tdir_count, v);
+		return (1);
+	} else
+		return (0);
+}
+
+/*
+ * Fetch an array of DOUBLE values.
+ */
+static int
+TIFFFetchDoubleArray(TIFF* tif, TIFFDirEntry* dir, double* v)
+{
+	if (TIFFFetchData(tif, dir, (char*) v)) {
+		TIFFCvtIEEEDoubleToNative(tif, dir->tdir_count, v);
+		return (1);
+	} else
+		return (0);
+}
+
+/*
+ * Fetch an array of ANY values.  The actual values are
+ * returned as doubles which should be able hold all the
+ * types.  Yes, there really should be an tany_t to avoid
+ * this potential non-portability ...  Note in particular
+ * that we assume that the double return value vector is
+ * large enough to read in any fundamental type.  We use
+ * that vector as a buffer to read in the base type vector
+ * and then convert it in place to double (from end
+ * to front of course).
+ */
+static int
+TIFFFetchAnyArray(TIFF* tif, TIFFDirEntry* dir, double* v)
+{
+	int i;
+
+	switch (dir->tdir_type) {
+	case TIFF_BYTE:
+	case TIFF_SBYTE:
+		if (!TIFFFetchByteArray(tif, dir, (uint16*) v))
+			return (0);
+		if (dir->tdir_type == TIFF_BYTE) {
+			uint16* vp = (uint16*) v;
+			for (i = dir->tdir_count-1; i >= 0; i--)
+				v[i] = vp[i];
+		} else {
+			int16* vp = (int16*) v;
+			for (i = dir->tdir_count-1; i >= 0; i--)
+				v[i] = vp[i];
+		}
+		break;
+	case TIFF_SHORT:
+	case TIFF_SSHORT:
+		if (!TIFFFetchShortArray(tif, dir, (uint16*) v))
+			return (0);
+		if (dir->tdir_type == TIFF_SHORT) {
+			uint16* vp = (uint16*) v;
+			for (i = dir->tdir_count-1; i >= 0; i--)
+				v[i] = vp[i];
+		} else {
+			int16* vp = (int16*) v;
+			for (i = dir->tdir_count-1; i >= 0; i--)
+				v[i] = vp[i];
+		}
+		break;
+	case TIFF_LONG:
+	case TIFF_SLONG:
+		if (!TIFFFetchLongArray(tif, dir, (uint32*) v))
+			return (0);
+		if (dir->tdir_type == TIFF_LONG) {
+			uint32* vp = (uint32*) v;
+			for (i = dir->tdir_count-1; i >= 0; i--)
+				v[i] = vp[i];
+		} else {
+			int32* vp = (int32*) v;
+			for (i = dir->tdir_count-1; i >= 0; i--)
+				v[i] = vp[i];
+		}
+		break;
+	case TIFF_RATIONAL:
+	case TIFF_SRATIONAL:
+		if (!TIFFFetchRationalArray(tif, dir, (float*) v))
+			return (0);
+		{ float* vp = (float*) v;
+		  for (i = dir->tdir_count-1; i >= 0; i--)
+			v[i] = vp[i];
+		}
+		break;
+	case TIFF_FLOAT:
+		if (!TIFFFetchFloatArray(tif, dir, (float*) v))
+			return (0);
+		{ float* vp = (float*) v;
+		  for (i = dir->tdir_count-1; i >= 0; i--)
+			v[i] = vp[i];
+		}
+		break;
+	case TIFF_DOUBLE:
+		return (TIFFFetchDoubleArray(tif, dir, (double*) v));
+	default:
+		/* TIFF_NOTYPE */
+		/* TIFF_ASCII */
+		/* TIFF_UNDEFINED */
+		TIFFError(tif->tif_name,
+		    "cannot read TIFF_ANY type %d for field \"%s\"",
+		    _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+		return (0);
+	}
+	return (1);
+}
+
+/*
+ * Fetch a tag that is not handled by special case code.
+ */
+static int
+TIFFFetchNormalTag(TIFF* tif, TIFFDirEntry* dp)
+{
+	static const char mesg[] = "to fetch tag value";
+	int ok = 0;
+	const TIFFFieldInfo* fip = _TIFFFieldWithTag(tif, dp->tdir_tag);
+
+	if (dp->tdir_count > 1) {		/* array of values */
+		char* cp = NULL;
+
+		switch (dp->tdir_type) {
+		case TIFF_BYTE:
+		case TIFF_SBYTE:
+			/* NB: always expand BYTE values to shorts */
+			cp = CheckMalloc(tif,
+			    dp->tdir_count * sizeof (uint16), mesg);
+			ok = cp && TIFFFetchByteArray(tif, dp, (uint16*) cp);
+			break;
+		case TIFF_SHORT:
+		case TIFF_SSHORT:
+			cp = CheckMalloc(tif,
+			    dp->tdir_count * sizeof (uint16), mesg);
+			ok = cp && TIFFFetchShortArray(tif, dp, (uint16*) cp);
+			break;
+		case TIFF_LONG:
+		case TIFF_SLONG:
+			cp = CheckMalloc(tif,
+			    dp->tdir_count * sizeof (uint32), mesg);
+			ok = cp && TIFFFetchLongArray(tif, dp, (uint32*) cp);
+			break;
+		case TIFF_RATIONAL:
+		case TIFF_SRATIONAL:
+			cp = CheckMalloc(tif,
+			    dp->tdir_count * sizeof (float), mesg);
+			ok = cp && TIFFFetchRationalArray(tif, dp, (float*) cp);
+			break;
+		case TIFF_FLOAT:
+			cp = CheckMalloc(tif,
+			    dp->tdir_count * sizeof (float), mesg);
+			ok = cp && TIFFFetchFloatArray(tif, dp, (float*) cp);
+			break;
+		case TIFF_DOUBLE:
+			cp = CheckMalloc(tif,
+			    dp->tdir_count * sizeof (double), mesg);
+			ok = cp && TIFFFetchDoubleArray(tif, dp, (double*) cp);
+			break;
+		case TIFF_ASCII:
+		case TIFF_UNDEFINED:		/* bit of a cheat... */
+			/*
+			 * Some vendors write strings w/o the trailing
+			 * NULL byte, so always append one just in case.
+			 */
+			cp = CheckMalloc(tif, dp->tdir_count+1, mesg);
+			if( (ok = (cp && TIFFFetchString(tif, dp, cp))) != 0 )
+				cp[dp->tdir_count] = '\0';	/* XXX */
+			break;
+		}
+		if (ok) {
+			ok = (fip->field_passcount ?
+			    TIFFSetField(tif, dp->tdir_tag, dp->tdir_count, cp)
+			  : TIFFSetField(tif, dp->tdir_tag, cp));
+		}
+		if (cp != NULL)
+			_TIFFfree(cp);
+	} else if (CheckDirCount(tif, dp, 1)) {	/* singleton value */
+		switch (dp->tdir_type) {
+		case TIFF_BYTE:
+		case TIFF_SBYTE:
+		case TIFF_SHORT:
+		case TIFF_SSHORT:
+			/*
+			 * If the tag is also acceptable as a LONG or SLONG
+			 * then TIFFSetField will expect an uint32 parameter
+			 * passed to it (through varargs).  Thus, for machines
+			 * where sizeof (int) != sizeof (uint32) we must do
+			 * a careful check here.  It's hard to say if this
+			 * is worth optimizing.
+			 *
+			 * NB: We use TIFFFieldWithTag here knowing that
+			 *     it returns us the first entry in the table
+			 *     for the tag and that that entry is for the
+			 *     widest potential data type the tag may have.
+			 */
+			{ TIFFDataType type = fip->field_type;
+			  if (type != TIFF_LONG && type != TIFF_SLONG) {
+				uint16 v = (uint16)
+			   TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset);
+				ok = (fip->field_passcount ?
+				    TIFFSetField(tif, dp->tdir_tag, 1, &v)
+				  : TIFFSetField(tif, dp->tdir_tag, v));
+				break;
+			  }
+			}
+			/* fall thru... */
+		case TIFF_LONG:
+		case TIFF_SLONG:
+			{ uint32 v32 =
+		    TIFFExtractData(tif, dp->tdir_type, dp->tdir_offset);
+			  ok = (fip->field_passcount ? 
+			      TIFFSetField(tif, dp->tdir_tag, 1, &v32)
+			    : TIFFSetField(tif, dp->tdir_tag, v32));
+			}
+			break;
+		case TIFF_RATIONAL:
+		case TIFF_SRATIONAL:
+		case TIFF_FLOAT:
+			{ float v = (dp->tdir_type == TIFF_FLOAT ? 
+			      TIFFFetchFloat(tif, dp)
+			    : TIFFFetchRational(tif, dp));
+			  ok = (fip->field_passcount ?
+			      TIFFSetField(tif, dp->tdir_tag, 1, &v)
+			    : TIFFSetField(tif, dp->tdir_tag, v));
+			}
+			break;
+		case TIFF_DOUBLE:
+			{ double v;
+			  ok = (TIFFFetchDoubleArray(tif, dp, &v) &&
+			    (fip->field_passcount ?
+			      TIFFSetField(tif, dp->tdir_tag, 1, &v)
+			    : TIFFSetField(tif, dp->tdir_tag, v))
+			  );
+			}
+			break;
+		case TIFF_ASCII:
+		case TIFF_UNDEFINED:		/* bit of a cheat... */
+			{ char c[2];
+			  if( (ok = (TIFFFetchString(tif, dp, c) != 0)) != 0 ){
+				c[1] = '\0';		/* XXX paranoid */
+				ok = TIFFSetField(tif, dp->tdir_tag, c);
+			  }
+			}
+			break;
+		}
+	}
+	return (ok);
+}
+
+#define	NITEMS(x)	(sizeof (x) / sizeof (x[0]))
+/*
+ * Fetch samples/pixel short values for 
+ * the specified tag and verify that
+ * all values are the same.
+ */
+static int
+TIFFFetchPerSampleShorts(TIFF* tif, TIFFDirEntry* dir, int* pl)
+{
+	int samples = tif->tif_dir.td_samplesperpixel;
+	int status = 0;
+
+	if (CheckDirCount(tif, dir, (uint32) samples)) {
+		uint16 buf[10];
+		uint16* v = buf;
+
+		if (samples > NITEMS(buf))
+			v = (uint16*) _TIFFmalloc(samples * sizeof (uint16));
+		if (TIFFFetchShortArray(tif, dir, v)) {
+			int i;
+			for (i = 1; i < samples; i++)
+				if (v[i] != v[0]) {
+					TIFFError(tif->tif_name,
+		"Cannot handle different per-sample values for field \"%s\"",
+			   _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+					goto bad;
+				}
+			*pl = v[0];
+			status = 1;
+		}
+	bad:
+		if (v != buf)
+			_TIFFfree((char*) v);
+	}
+	return (status);
+}
+
+/*
+ * Fetch samples/pixel ANY values for 
+ * the specified tag and verify that
+ * all values are the same.
+ */
+static int
+TIFFFetchPerSampleAnys(TIFF* tif, TIFFDirEntry* dir, double* pl)
+{
+	int samples = (int) tif->tif_dir.td_samplesperpixel;
+	int status = 0;
+
+	if (CheckDirCount(tif, dir, (uint32) samples)) {
+		double buf[10];
+		double* v = buf;
+
+		if (samples > NITEMS(buf))
+			v = (double*) _TIFFmalloc(samples * sizeof (double));
+		if (TIFFFetchAnyArray(tif, dir, v)) {
+			int i;
+			for (i = 1; i < samples; i++)
+				if (v[i] != v[0]) {
+					TIFFError(tif->tif_name,
+		"Cannot handle different per-sample values for field \"%s\"",
+			   _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+					goto bad;
+				}
+			*pl = v[0];
+			status = 1;
+		}
+	bad:
+		if (v != buf)
+			_TIFFfree(v);
+	}
+	return (status);
+}
+#undef NITEMS
+
+/*
+ * Fetch a set of offsets or lengths.
+ * While this routine says "strips",
+ * in fact it's also used for tiles.
+ */
+static int
+TIFFFetchStripThing(TIFF* tif, TIFFDirEntry* dir, long nstrips, uint32** lpp)
+{
+	register uint32* lp;
+	int status;
+
+        CheckDirCount(tif, dir, (uint32) nstrips);
+
+	/*
+	 * Allocate space for strip information.
+	 */
+	if (*lpp == NULL &&
+	    (*lpp = (uint32 *)CheckMalloc(tif,
+	      nstrips * sizeof (uint32), "for strip array")) == NULL)
+		return (0);
+	lp = *lpp;
+        memset( lp, 0, sizeof(uint32) * nstrips );
+
+	if (dir->tdir_type == (int)TIFF_SHORT) {
+		/*
+		 * Handle uint16->uint32 expansion.
+		 */
+		uint16* dp = (uint16*) CheckMalloc(tif,
+		    dir->tdir_count* sizeof (uint16), "to fetch strip tag");
+		if (dp == NULL)
+			return (0);
+		if( (status = TIFFFetchShortArray(tif, dir, dp)) != 0 ) {
+                    int i;
+                    
+                    for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ )
+                    {
+                        lp[i] = dp[i];
+                    }
+		}
+		_TIFFfree((char*) dp);
+
+        } else if( nstrips != (int) dir->tdir_count ) {
+            /* Special case to correct length */
+
+            uint32* dp = (uint32*) CheckMalloc(tif,
+		    dir->tdir_count* sizeof (uint32), "to fetch strip tag");
+            if (dp == NULL)
+                return (0);
+
+            status = TIFFFetchLongArray(tif, dir, dp);
+            if( status != 0 ) {
+                int i;
+
+                for( i = 0; i < nstrips && i < (int) dir->tdir_count; i++ )
+                {
+                    lp[i] = dp[i];
+                }
+            }
+
+            _TIFFfree( (char *) dp );
+	} else
+            status = TIFFFetchLongArray(tif, dir, lp);
+        
+	return (status);
+}
+
+#define	NITEMS(x)	(sizeof (x) / sizeof (x[0]))
+/*
+ * Fetch and set the ExtraSamples tag.
+ */
+static int
+TIFFFetchExtraSamples(TIFF* tif, TIFFDirEntry* dir)
+{
+	uint16 buf[10];
+	uint16* v = buf;
+	int status;
+
+	if (dir->tdir_count > NITEMS(buf))
+		v = (uint16*) _TIFFmalloc(dir->tdir_count * sizeof (uint16));
+	if (dir->tdir_type == TIFF_BYTE)
+		status = TIFFFetchByteArray(tif, dir, v);
+	else
+		status = TIFFFetchShortArray(tif, dir, v);
+	if (status)
+		status = TIFFSetField(tif, dir->tdir_tag, dir->tdir_count, v);
+	if (v != buf)
+		_TIFFfree((char*) v);
+	return (status);
+}
+#undef NITEMS
+
+#ifdef COLORIMETRY_SUPPORT
+/*
+ * Fetch and set the RefBlackWhite tag.
+ */
+static int
+TIFFFetchRefBlackWhite(TIFF* tif, TIFFDirEntry* dir)
+{
+	static const char mesg[] = "for \"ReferenceBlackWhite\" array";
+	char* cp;
+	int ok;
+
+	if (dir->tdir_type == TIFF_RATIONAL)
+		return (TIFFFetchNormalTag(tif, dir));
+	/*
+	 * Handle LONG's for backward compatibility.
+	 */
+	cp = CheckMalloc(tif, dir->tdir_count * sizeof (uint32), mesg);
+	if( (ok = (cp && TIFFFetchLongArray(tif, dir, (uint32*) cp))) != 0) {
+		float* fp = (float*)
+		    CheckMalloc(tif, dir->tdir_count * sizeof (float), mesg);
+		if( (ok = (fp != NULL)) != 0 ) {
+			uint32 i;
+			for (i = 0; i < dir->tdir_count; i++)
+				fp[i] = (float)((uint32*) cp)[i];
+			ok = TIFFSetField(tif, dir->tdir_tag, fp);
+			_TIFFfree((char*) fp);
+		}
+	}
+	if (cp)
+		_TIFFfree(cp);
+	return (ok);
+}
+#endif
+
+/*
+ * Replace a single strip (tile) of uncompressed data by
+ * multiple strips (tiles), each approximately 8Kbytes.
+ * This is useful for dealing with large images or
+ * for dealing with machines with a limited amount
+ * memory.
+ */
+static void
+ChopUpSingleUncompressedStrip(TIFF* tif)
+{
+	register TIFFDirectory *td = &tif->tif_dir;
+	uint32 bytecount = td->td_stripbytecount[0];
+	uint32 offset = td->td_stripoffset[0];
+	tsize_t rowbytes = TIFFVTileSize(tif, 1), stripbytes;
+	tstrip_t strip, nstrips, rowsperstrip;
+	uint32* newcounts;
+	uint32* newoffsets;
+
+	/*
+	 * Make the rows hold at least one
+	 * scanline, but fill 8k if possible.
+	 */
+	if (rowbytes > 8192) {
+		stripbytes = rowbytes;
+		rowsperstrip = 1;
+	} else if (rowbytes > 0 ) {
+		rowsperstrip = 8192 / rowbytes;
+		stripbytes = rowbytes * rowsperstrip;
+	}
+        else
+            return;
+
+	/* never increase the number of strips in an image */
+	if (rowsperstrip >= td->td_rowsperstrip)
+		return;
+	nstrips = (tstrip_t) TIFFhowmany(bytecount, stripbytes);
+	newcounts = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32),
+				"for chopped \"StripByteCounts\" array");
+	newoffsets = (uint32*) CheckMalloc(tif, nstrips * sizeof (uint32),
+				"for chopped \"StripOffsets\" array");
+	if (newcounts == NULL || newoffsets == NULL) {
+	        /*
+		 * Unable to allocate new strip information, give
+		 * up and use the original one strip information.
+		 */
+		if (newcounts != NULL)
+			_TIFFfree(newcounts);
+		if (newoffsets != NULL)
+			_TIFFfree(newoffsets);
+		return;
+	}
+	/*
+	 * Fill the strip information arrays with
+	 * new bytecounts and offsets that reflect
+	 * the broken-up format.
+	 */
+	for (strip = 0; strip < nstrips; strip++) {
+		if (stripbytes > (tsize_t) bytecount)
+			stripbytes = bytecount;
+		newcounts[strip] = stripbytes;
+		newoffsets[strip] = offset;
+		offset += stripbytes;
+		bytecount -= stripbytes;
+	}
+	/*
+	 * Replace old single strip info with multi-strip info.
+	 */
+	td->td_stripsperimage = td->td_nstrips = nstrips;
+	TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, rowsperstrip);
+
+	_TIFFfree(td->td_stripbytecount);
+	_TIFFfree(td->td_stripoffset);
+	td->td_stripbytecount = newcounts;
+	td->td_stripoffset = newoffsets;
+}
diff --git a/src/tiff/tif_dirwrite.c b/src/tiff/tif_dirwrite.c
new file mode 100644
index 0000000..9a17e85
--- /dev/null
+++ b/src/tiff/tif_dirwrite.c
@@ -0,0 +1,1233 @@
+/* $Header: /home/terralib/src/tiff/tif_dirwrite.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Write Support Routines.
+ */
+#include "tiffiop.h"
+
+#if HAVE_IEEEFP
+#define	TIFFCvtNativeToIEEEFloat(tif, n, fp)
+#define	TIFFCvtNativeToIEEEDouble(tif, n, dp)
+#else
+extern	void TIFFCvtNativeToIEEEFloat(TIFF*, uint32, float*);
+extern	void TIFFCvtNativeToIEEEDouble(TIFF*, uint32, double*);
+#endif
+
+static	int TIFFWriteNormalTag(TIFF*, TIFFDirEntry*, const TIFFFieldInfo*);
+static	void TIFFSetupShortLong(TIFF*, ttag_t, TIFFDirEntry*, uint32);
+static	void TIFFSetupShort(TIFF*, ttag_t, TIFFDirEntry*, uint16);
+static	int TIFFSetupShortPair(TIFF*, ttag_t, TIFFDirEntry*);
+static	int TIFFWritePerSampleShorts(TIFF*, ttag_t, TIFFDirEntry*);
+static	int TIFFWritePerSampleAnys(TIFF*, TIFFDataType, ttag_t, TIFFDirEntry*);
+static	int TIFFWriteShortTable(TIFF*, ttag_t, TIFFDirEntry*, uint32, uint16**);
+static	int TIFFWriteShortArray(TIFF*,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint16*);
+static	int TIFFWriteLongArray(TIFF *,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, uint32, uint32*);
+static	int TIFFWriteRationalArray(TIFF *,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*);
+static	int TIFFWriteFloatArray(TIFF *,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, uint32, float*);
+static	int TIFFWriteDoubleArray(TIFF *,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*);
+static	int TIFFWriteByteArray(TIFF*, TIFFDirEntry*, char*);
+static	int TIFFWriteAnyArray(TIFF*,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, uint32, double*);
+#ifdef COLORIMETRY_SUPPORT
+static	int TIFFWriteTransferFunction(TIFF*, TIFFDirEntry*);
+#endif
+#ifdef CMYK_SUPPORT
+static	int TIFFWriteInkNames(TIFF*, TIFFDirEntry*);
+#endif
+static	int TIFFWriteData(TIFF*, TIFFDirEntry*, char*);
+static	int TIFFLinkDirectory(TIFF*);
+
+#define	WriteRationalPair(type, tag1, v1, tag2, v2) {		\
+	if (!TIFFWriteRational(tif, type, tag1, dir, v1))	\
+		goto bad;					\
+	if (!TIFFWriteRational(tif, type, tag2, dir+1, v2))	\
+		goto bad;					\
+	dir++;							\
+}
+#define	TIFFWriteRational(tif, type, tag, dir, v) \
+	TIFFWriteRationalArray((tif), (type), (tag), (dir), 1, &(v))
+#ifndef TIFFWriteRational
+static	int TIFFWriteRational(TIFF*,
+	    TIFFDataType, ttag_t, TIFFDirEntry*, float);
+#endif
+
+/*
+ * Write the contents of the current directory
+ * to the specified file.  This routine doesn't
+ * handle overwriting a directory with auxiliary
+ * storage that's been changed.
+ */
+static int
+_TIFFWriteDirectory(TIFF* tif, int done)
+{
+	uint16 dircount;
+	toff_t diroff;
+	ttag_t tag;
+	uint32 nfields;
+	tsize_t dirsize;
+	char* data;
+	TIFFDirEntry* dir;
+	TIFFDirectory* td;
+	u_long b, fields[FIELD_SETLONGS];
+	int fi, nfi;
+
+	if (tif->tif_mode == O_RDONLY)
+		return (1);
+	/*
+	 * Clear write state so that subsequent images with
+	 * different characteristics get the right buffers
+	 * setup for them.
+	 */
+	if (done)
+	{
+	    if (tif->tif_flags & TIFF_POSTENCODE) {
+		    tif->tif_flags &= ~TIFF_POSTENCODE;
+		    if (!(*tif->tif_postencode)(tif)) {
+			    TIFFError(tif->tif_name,
+				"Error post-encoding before directory write");
+			    return (0);
+		    }
+	    }
+	    (*tif->tif_close)(tif);		/* shutdown encoder */
+	    /*
+	     * Flush any data that might have been written
+	     * by the compression close+cleanup routines.
+	     */
+	    if (tif->tif_rawcc > 0 && !TIFFFlushData1(tif)) {
+		    TIFFError(tif->tif_name,
+			"Error flushing data before directory write");
+		    return (0);
+	    }
+	    if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata) {
+		    _TIFFfree(tif->tif_rawdata);
+		    tif->tif_rawdata = NULL;
+		    tif->tif_rawcc = 0;
+		    tif->tif_rawdatasize = 0;
+	    }
+	    tif->tif_flags &= ~(TIFF_BEENWRITING|TIFF_BUFFERSETUP);
+	}
+
+	td = &tif->tif_dir;
+	/*
+	 * Size the directory so that we can calculate
+	 * offsets for the data items that aren't kept
+	 * in-place in each field.
+	 */
+	nfields = 0;
+	for (b = 0; b <= FIELD_LAST; b++)
+		if (TIFFFieldSet(tif, b) && b != FIELD_CUSTOM)
+			nfields += (b < FIELD_SUBFILETYPE ? 2 : 1);
+        nfields += td->td_customValueCount;
+	dirsize = nfields * sizeof (TIFFDirEntry);
+	data = (char*) _TIFFmalloc(dirsize);
+	if (data == NULL) {
+		TIFFError(tif->tif_name,
+		    "Cannot write directory, out of space");
+		return (0);
+	}
+	/*
+	 * Directory hasn't been placed yet, put
+	 * it at the end of the file and link it
+	 * into the existing directory structure.
+	 */
+	if (tif->tif_diroff == 0 && !TIFFLinkDirectory(tif))
+		goto bad;
+	tif->tif_dataoff = (toff_t)(
+	    tif->tif_diroff + sizeof (uint16) + dirsize + sizeof (toff_t));
+	if (tif->tif_dataoff & 1)
+		tif->tif_dataoff++;
+	(void) TIFFSeekFile(tif, tif->tif_dataoff, SEEK_SET);
+	tif->tif_curdir++;
+	dir = (TIFFDirEntry*) data;
+	/*
+	 * Setup external form of directory
+	 * entries and write data items.
+	 */
+	_TIFFmemcpy(fields, td->td_fieldsset, sizeof (fields));
+	/*
+	 * Write out ExtraSamples tag only if
+	 * extra samples are present in the data.
+	 */
+	if (FieldSet(fields, FIELD_EXTRASAMPLES) && !td->td_extrasamples) {
+		ResetFieldBit(fields, FIELD_EXTRASAMPLES);
+		nfields--;
+		dirsize -= sizeof (TIFFDirEntry);
+	}								/*XXX*/
+	for (fi = 0, nfi = tif->tif_nfields; nfi > 0; nfi--, fi++) {
+		const TIFFFieldInfo* fip = tif->tif_fieldinfo[fi];
+
+                /*
+                ** For custom fields, we test to see if the custom field
+                ** is set or not.  For normal fields, we just use the
+                ** FieldSet test. 
+                */
+                if( fip->field_bit == FIELD_CUSTOM )
+                {
+                    int ci, is_set = FALSE;
+
+                    for( ci = 0; ci < td->td_customValueCount; ci++ )
+                        is_set |= (td->td_customValues[ci].info == fip);
+
+                    if( !is_set )
+                        continue;
+                }
+		else if (!FieldSet(fields, fip->field_bit))
+                    continue;
+
+
+                /*
+                ** Handle other fields.
+                */
+		switch (fip->field_bit)
+                {
+		case FIELD_STRIPOFFSETS:
+			/*
+			 * We use one field bit for both strip and tile
+
+			 * offsets, and so must be careful in selecting
+			 * the appropriate field descriptor (so that tags
+			 * are written in sorted order).
+			 */
+			tag = isTiled(tif) ?
+			    TIFFTAG_TILEOFFSETS : TIFFTAG_STRIPOFFSETS;
+			if (tag != fip->field_tag)
+				continue;
+			if (!TIFFWriteLongArray(tif, TIFF_LONG, tag, dir,
+			    (uint32) td->td_nstrips, td->td_stripoffset))
+				goto bad;
+			break;
+		case FIELD_STRIPBYTECOUNTS:
+			/*
+			 * We use one field bit for both strip and tile
+			 * byte counts, and so must be careful in selecting
+			 * the appropriate field descriptor (so that tags
+			 * are written in sorted order).
+			 */
+			tag = isTiled(tif) ?
+			    TIFFTAG_TILEBYTECOUNTS : TIFFTAG_STRIPBYTECOUNTS;
+			if (tag != fip->field_tag)
+				continue;
+			if (!TIFFWriteLongArray(tif, TIFF_LONG, tag, dir,
+			    (uint32) td->td_nstrips, td->td_stripbytecount))
+				goto bad;
+			break;
+		case FIELD_ROWSPERSTRIP:
+			TIFFSetupShortLong(tif, TIFFTAG_ROWSPERSTRIP,
+			    dir, td->td_rowsperstrip);
+			break;
+		case FIELD_COLORMAP:
+			if (!TIFFWriteShortTable(tif, TIFFTAG_COLORMAP, dir,
+			    3, td->td_colormap))
+				goto bad;
+			break;
+		case FIELD_IMAGEDIMENSIONS:
+			TIFFSetupShortLong(tif, TIFFTAG_IMAGEWIDTH,
+			    dir++, td->td_imagewidth);
+			TIFFSetupShortLong(tif, TIFFTAG_IMAGELENGTH,
+			    dir, td->td_imagelength);
+			break;
+		case FIELD_TILEDIMENSIONS:
+			TIFFSetupShortLong(tif, TIFFTAG_TILEWIDTH,
+			    dir++, td->td_tilewidth);
+			TIFFSetupShortLong(tif, TIFFTAG_TILELENGTH,
+			    dir, td->td_tilelength);
+			break;
+		case FIELD_COMPRESSION:
+			TIFFSetupShort(tif, TIFFTAG_COMPRESSION,
+			    dir, td->td_compression);
+			break;
+		case FIELD_PHOTOMETRIC:
+			TIFFSetupShort(tif, TIFFTAG_PHOTOMETRIC,
+			    dir, td->td_photometric);
+			break;
+		case FIELD_POSITION:
+			WriteRationalPair(TIFF_RATIONAL,
+			    TIFFTAG_XPOSITION, td->td_xposition,
+			    TIFFTAG_YPOSITION, td->td_yposition);
+			break;
+		case FIELD_RESOLUTION:
+			WriteRationalPair(TIFF_RATIONAL,
+			    TIFFTAG_XRESOLUTION, td->td_xresolution,
+			    TIFFTAG_YRESOLUTION, td->td_yresolution);
+			break;
+		case FIELD_BITSPERSAMPLE:
+		case FIELD_MINSAMPLEVALUE:
+		case FIELD_MAXSAMPLEVALUE:
+		case FIELD_SAMPLEFORMAT:
+			if (!TIFFWritePerSampleShorts(tif, fip->field_tag, dir))
+				goto bad;
+			break;
+		case FIELD_SMINSAMPLEVALUE:
+		case FIELD_SMAXSAMPLEVALUE:
+			if (!TIFFWritePerSampleAnys(tif,
+			    _TIFFSampleToTagType(tif), fip->field_tag, dir))
+				goto bad;
+			break;
+		case FIELD_PAGENUMBER:
+		case FIELD_HALFTONEHINTS:
+#ifdef YCBCR_SUPPORT
+		case FIELD_YCBCRSUBSAMPLING:
+#endif
+#ifdef CMYK_SUPPORT
+		case FIELD_DOTRANGE:
+#endif
+			if (!TIFFSetupShortPair(tif, fip->field_tag, dir))
+				goto bad;
+			break;
+#ifdef CMYK_SUPPORT
+		case FIELD_INKNAMES:
+			if (!TIFFWriteInkNames(tif, dir))
+				goto bad;
+			break;
+#endif
+#ifdef COLORIMETRY_SUPPORT
+		case FIELD_TRANSFERFUNCTION:
+			if (!TIFFWriteTransferFunction(tif, dir))
+				goto bad;
+			break;
+#endif
+#if SUBIFD_SUPPORT
+		case FIELD_SUBIFD:
+			if (!TIFFWriteNormalTag(tif, dir, fip))
+				goto bad;
+			/*
+			 * Total hack: if this directory includes a SubIFD
+			 * tag then force the next <n> directories to be
+			 * written as ``sub directories'' of this one.  This
+			 * is used to write things like thumbnails and
+			 * image masks that one wants to keep out of the
+			 * normal directory linkage access mechanism.
+			 */
+			if (dir->tdir_count > 0) {
+				tif->tif_flags |= TIFF_INSUBIFD;
+				tif->tif_nsubifd = (uint16) dir->tdir_count;
+				if (dir->tdir_count > 1)
+					tif->tif_subifdoff = dir->tdir_offset;
+				else
+					tif->tif_subifdoff = (uint32)(
+					      tif->tif_diroff
+					    + sizeof (uint16)
+					    + ((char*)&dir->tdir_offset-data));
+			}
+			break;
+#endif
+		default:
+			if (!TIFFWriteNormalTag(tif, dir, fip))
+				goto bad;
+			break;
+		}
+		dir++;
+                
+                if( fip->field_bit != FIELD_CUSTOM )
+                    ResetFieldBit(fields, fip->field_bit);
+	}
+
+	/*
+	 * Write directory.
+	 */
+	dircount = (uint16) nfields;
+	diroff = (uint32) tif->tif_nextdiroff;
+	if (tif->tif_flags & TIFF_SWAB) {
+		/*
+		 * The file's byte order is opposite to the
+		 * native machine architecture.  We overwrite
+		 * the directory information with impunity
+		 * because it'll be released below after we
+		 * write it to the file.  Note that all the
+		 * other tag construction routines assume that
+		 * we do this byte-swapping; i.e. they only
+		 * byte-swap indirect data.
+		 */
+		for (dir = (TIFFDirEntry*) data; dircount; dir++, dircount--) {
+			TIFFSwabArrayOfShort(&dir->tdir_tag, 2);
+			TIFFSwabArrayOfLong(&dir->tdir_count, 2);
+		}
+		dircount = (uint16) nfields;
+		TIFFSwabShort(&dircount);
+		TIFFSwabLong(&diroff);
+	}
+	(void) TIFFSeekFile(tif, tif->tif_diroff, SEEK_SET);
+	if (!WriteOK(tif, &dircount, sizeof (dircount))) {
+		TIFFError(tif->tif_name, "Error writing directory count");
+		goto bad;
+	}
+	if (!WriteOK(tif, data, dirsize)) {
+		TIFFError(tif->tif_name, "Error writing directory contents");
+		goto bad;
+	}
+	if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+		TIFFError(tif->tif_name, "Error writing directory link");
+		goto bad;
+	}
+	if (done) {
+		TIFFFreeDirectory(tif);
+		tif->tif_flags &= ~TIFF_DIRTYDIRECT;
+		(*tif->tif_cleanup)(tif);
+
+		/*
+		* Reset directory-related state for subsequent
+		* directories.
+		*/
+		TIFFCreateDirectory(tif);
+	}
+	_TIFFfree(data);
+	return (1);
+bad:
+	_TIFFfree(data);
+	return (0);
+}
+#undef WriteRationalPair
+
+int
+TIFFWriteDirectory(TIFF* tif)
+{
+	return _TIFFWriteDirectory(tif, TRUE);
+}
+
+/*
+ * Similar to TIFFWriteDirectory(), writes the directory out
+ * but leaves all data structures in memory so that it can be
+ * written again.  This will make a partially written TIFF file
+ * readable before it is successfully completed/closed.
+ */ 
+int
+TIFFCheckpointDirectory(TIFF* tif)
+{
+	int rc;
+	/* Setup the strips arrays, if they haven't already been. */
+	if (tif->tif_dir.td_stripoffset == NULL)
+	    (void) TIFFSetupStrips(tif);
+	rc = _TIFFWriteDirectory(tif, FALSE);
+	(void) TIFFSetWriteOffset(tif, TIFFSeekFile(tif, 0, SEEK_END));
+	return rc;
+}
+
+/*
+ * Process tags that are not special cased.
+ */
+static int
+TIFFWriteNormalTag(TIFF* tif, TIFFDirEntry* dir, const TIFFFieldInfo* fip)
+{
+	u_short wc = (u_short) fip->field_writecount;
+	uint32 wc2;
+
+	dir->tdir_tag = (uint16) fip->field_tag;
+	dir->tdir_type = (u_short) fip->field_type;
+	dir->tdir_count = wc;
+#define	WRITEF(x,y)	x(tif, fip->field_type, fip->field_tag, dir, wc, y)
+	switch (fip->field_type) {
+	case TIFF_SHORT:
+	case TIFF_SSHORT:
+		if (wc > 1) {
+			uint16* wp;
+			if (wc == (u_short) TIFF_VARIABLE
+			    || fip->field_passcount)
+				TIFFGetField(tif, fip->field_tag, &wc, &wp);
+			else
+				TIFFGetField(tif, fip->field_tag, &wp);
+			if (!WRITEF(TIFFWriteShortArray, wp))
+				return (0);
+		} else {
+			if (fip->field_passcount) {
+				uint16* wp;
+				TIFFGetField(tif, fip->field_tag, &wc, &wp);
+				if (!WRITEF(TIFFWriteShortArray, wp))
+					return 0;
+			} else {
+				uint16 sv;
+				TIFFGetField(tif, fip->field_tag, &sv);
+				dir->tdir_offset =
+					TIFFInsertData(tif, dir->tdir_type, sv);
+			}
+		}
+		break;
+	case TIFF_LONG:
+	case TIFF_SLONG:
+	case TIFF_IFD:
+		if (wc > 1) {
+			uint32* lp;
+			if (wc == (u_short) TIFF_VARIABLE
+			    || fip->field_passcount)
+				TIFFGetField(tif, fip->field_tag, &wc, &lp);
+			else
+				TIFFGetField(tif, fip->field_tag, &lp);
+			if (!WRITEF(TIFFWriteLongArray, lp))
+				return (0);
+		} else {
+			if (fip->field_passcount) {
+				uint32* lp;
+				TIFFGetField(tif, fip->field_tag, &wc, &lp);
+				if (!WRITEF(TIFFWriteLongArray, lp))
+					return 0;
+			} else {
+				/* XXX handle LONG->SHORT conversion */
+				TIFFGetField(tif, fip->field_tag,
+					     &dir->tdir_offset);
+			}
+		}
+		break;
+	case TIFF_RATIONAL:
+	case TIFF_SRATIONAL:
+		if (wc > 1) {
+			float* fp;
+			if (wc == (u_short) TIFF_VARIABLE
+			    || fip->field_passcount)
+				TIFFGetField(tif, fip->field_tag, &wc, &fp);
+			else
+				TIFFGetField(tif, fip->field_tag, &fp);
+			if (!WRITEF(TIFFWriteRationalArray, fp))
+				return (0);
+		} else {
+			if (fip->field_passcount) {
+				float* fp;
+				TIFFGetField(tif, fip->field_tag, &wc, &fp);
+				if (!WRITEF(TIFFWriteRationalArray, fp))
+					return 0;
+			} else {
+				float fv;
+				TIFFGetField(tif, fip->field_tag, &fv);
+				if (!WRITEF(TIFFWriteRationalArray, &fv))
+					return (0);
+			}
+		}
+		break;
+	case TIFF_FLOAT:
+		if (wc > 1) {
+			float* fp;
+			if (wc == (u_short) TIFF_VARIABLE
+			    || fip->field_passcount)
+				TIFFGetField(tif, fip->field_tag, &wc, &fp);
+			else
+				TIFFGetField(tif, fip->field_tag, &fp);
+			if (!WRITEF(TIFFWriteFloatArray, fp))
+				return (0);
+		} else {
+			if (fip->field_passcount) {
+				float* fp;
+				TIFFGetField(tif, fip->field_tag, &wc, &fp);
+				if (!WRITEF(TIFFWriteFloatArray, fp))
+					return 0;
+			} else {
+				float fv;
+				TIFFGetField(tif, fip->field_tag, &fv);
+				if (!WRITEF(TIFFWriteFloatArray, &fv))
+					return (0);
+			}
+		}
+		break;
+	case TIFF_DOUBLE:
+		if (wc > 1) {
+			double* dp;
+			if (wc == (u_short) TIFF_VARIABLE
+			    || fip->field_passcount)
+				TIFFGetField(tif, fip->field_tag, &wc, &dp);
+			else
+				TIFFGetField(tif, fip->field_tag, &dp);
+			if (!WRITEF(TIFFWriteDoubleArray, dp))
+				return (0);
+		} else {
+			if (fip->field_passcount) {
+				double* dp;
+				TIFFGetField(tif, fip->field_tag, &wc, &dp);
+				if (!WRITEF(TIFFWriteDoubleArray, dp))
+					return 0;
+			} else {
+				double dv;
+				TIFFGetField(tif, fip->field_tag, &dv);
+				if (!WRITEF(TIFFWriteDoubleArray, &dv))
+					return (0);
+			}
+		}
+		break;
+	case TIFF_ASCII:
+		{ char* cp;
+		  TIFFGetField(tif, fip->field_tag, &cp);
+		  dir->tdir_count = (uint32) (strlen(cp) + 1);
+		  if (!TIFFWriteByteArray(tif, dir, cp))
+			return (0);
+		}
+		break;
+
+        /* added based on patch request from MARTIN.MCBRIDE.MM at agfa.co.uk,
+           correctness not verified (FW, 99/08) */
+        case TIFF_BYTE:
+        case TIFF_SBYTE:          
+		if (wc > 1) {
+			char* cp;
+			if (wc == (u_short) TIFF_VARIABLE
+			    || fip->field_passcount) {
+				TIFFGetField(tif, fip->field_tag, &wc, &cp);
+				dir->tdir_count = wc;
+			} else if (wc == (u_short) TIFF_VARIABLE2) {
+				TIFFGetField(tif, fip->field_tag, &wc2, &cp);
+				dir->tdir_count = wc2;
+			} else
+				TIFFGetField(tif, fip->field_tag, &cp);
+			if (!TIFFWriteByteArray(tif, dir, cp))
+				return (0);
+                } else {
+			if (fip->field_passcount) {
+				char* cp;
+				TIFFGetField(tif, fip->field_tag, &wc, &cp);
+				dir->tdir_count = wc;
+				if (!TIFFWriteByteArray(tif, dir, cp))
+					return 0;
+			} else {
+				char cv;
+				TIFFGetField(tif, fip->field_tag, &cv);
+				if (!TIFFWriteByteArray(tif, dir, &cv))
+					return (0);
+			}
+                }
+                break;
+
+	case TIFF_UNDEFINED:
+		{ char* cp;
+		  if (wc == (u_short) TIFF_VARIABLE) {
+			TIFFGetField(tif, fip->field_tag, &wc, &cp);
+			dir->tdir_count = wc;
+		  } else if (wc == (u_short) TIFF_VARIABLE2) {
+			TIFFGetField(tif, fip->field_tag, &wc2, &cp);
+			dir->tdir_count = wc2;
+		  } else 
+			TIFFGetField(tif, fip->field_tag, &cp);
+		  if (!TIFFWriteByteArray(tif, dir, cp))
+			return (0);
+		}
+		break;
+
+        case TIFF_NOTYPE:
+                break;
+	}
+	return (1);
+}
+#undef WRITEF
+
+/*
+ * Setup a directory entry with either a SHORT
+ * or LONG type according to the value.
+ */
+static void
+TIFFSetupShortLong(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint32 v)
+{
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_count = 1;
+	if (v > 0xffffL) {
+		dir->tdir_type = (short) TIFF_LONG;
+		dir->tdir_offset = v;
+	} else {
+		dir->tdir_type = (short) TIFF_SHORT;
+		dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v);
+	}
+}
+
+/*
+ * Setup a SHORT directory entry
+ */
+static void
+TIFFSetupShort(TIFF* tif, ttag_t tag, TIFFDirEntry* dir, uint16 v)
+{
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_count = 1;
+	dir->tdir_type = (short) TIFF_SHORT;
+	dir->tdir_offset = TIFFInsertData(tif, (int) TIFF_SHORT, v);
+}
+#undef MakeShortDirent
+
+#ifndef TIFFWriteRational
+/*
+ * Setup a RATIONAL directory entry and
+ * write the associated indirect value.
+ */
+static int
+TIFFWriteRational(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, float v)
+{
+	return (TIFFWriteRationalArray(tif, type, tag, dir, 1, &v));
+}
+#endif
+
+#define	NITEMS(x)	(sizeof (x) / sizeof (x[0]))
+/*
+ * Setup a directory entry that references a
+ * samples/pixel array of SHORT values and
+ * (potentially) write the associated indirect
+ * values.
+ */
+static int
+TIFFWritePerSampleShorts(TIFF* tif, ttag_t tag, TIFFDirEntry* dir)
+{
+	uint16 buf[10], v;
+	uint16* w = buf;
+	int i, status, samples = tif->tif_dir.td_samplesperpixel;
+
+	if (samples > NITEMS(buf))
+		w = (uint16*) _TIFFmalloc(samples * sizeof (uint16));
+	TIFFGetField(tif, tag, &v);
+	for (i = 0; i < samples; i++)
+		w[i] = v;
+	status = TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, samples, w);
+	if (w != buf)
+		_TIFFfree((char*) w);
+	return (status);
+}
+
+/*
+ * Setup a directory entry that references a samples/pixel array of ``type''
+ * values and (potentially) write the associated indirect values.  The source
+ * data from TIFFGetField() for the specified tag must be returned as double.
+ */
+static int
+TIFFWritePerSampleAnys(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir)
+{
+	double buf[10], v;
+	double* w = buf;
+	int i, status;
+	int samples = (int) tif->tif_dir.td_samplesperpixel;
+
+	if (samples > NITEMS(buf))
+		w = (double*) _TIFFmalloc(samples * sizeof (double));
+	TIFFGetField(tif, tag, &v);
+	for (i = 0; i < samples; i++)
+		w[i] = v;
+	status = TIFFWriteAnyArray(tif, type, tag, dir, samples, w);
+	if (w != buf)
+		_TIFFfree(w);
+	return (status);
+}
+#undef NITEMS
+
+/*
+ * Setup a pair of shorts that are returned by
+ * value, rather than as a reference to an array.
+ */
+static int
+TIFFSetupShortPair(TIFF* tif, ttag_t tag, TIFFDirEntry* dir)
+{
+	uint16 v[2];
+
+	TIFFGetField(tif, tag, &v[0], &v[1]);
+	return (TIFFWriteShortArray(tif, TIFF_SHORT, tag, dir, 2, v));
+}
+
+/*
+ * Setup a directory entry for an NxM table of shorts,
+ * where M is known to be 2**bitspersample, and write
+ * the associated indirect data.
+ */
+static int
+TIFFWriteShortTable(TIFF* tif,
+    ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16** table)
+{
+	uint32 i, off;
+
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_type = (short) TIFF_SHORT;
+	/* XXX -- yech, fool TIFFWriteData */
+	dir->tdir_count = (uint32) (1L<<tif->tif_dir.td_bitspersample);
+	off = tif->tif_dataoff;
+	for (i = 0; i < n; i++)
+		if (!TIFFWriteData(tif, dir, (char *)table[i]))
+			return (0);
+	dir->tdir_count *= n;
+	dir->tdir_offset = off;
+	return (1);
+}
+
+/*
+ * Write/copy data associated with an ASCII or opaque tag value.
+ */
+static int
+TIFFWriteByteArray(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+	if (dir->tdir_count > 4) {
+		if (!TIFFWriteData(tif, dir, cp))
+			return (0);
+	} else
+		_TIFFmemcpy(&dir->tdir_offset, cp, dir->tdir_count);
+	return (1);
+}
+
+/*
+ * Setup a directory entry of an array of SHORT
+ * or SSHORT and write the associated indirect values.
+ */
+static int
+TIFFWriteShortArray(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint16* v)
+{
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_type = (short) type;
+	dir->tdir_count = n;
+	if (n <= 2) {
+		if (tif->tif_header.tiff_magic == TIFF_BIGENDIAN) {
+			dir->tdir_offset = (uint32) ((long) v[0] << 16);
+			if (n == 2)
+				dir->tdir_offset |= v[1] & 0xffff;
+		} else {
+			dir->tdir_offset = v[0] & 0xffff;
+			if (n == 2)
+				dir->tdir_offset |= (long) v[1] << 16;
+		}
+		return (1);
+	} else
+		return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+/*
+ * Setup a directory entry of an array of LONG
+ * or SLONG and write the associated indirect values.
+ */
+static int
+TIFFWriteLongArray(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, uint32* v)
+{
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_type = (short) type;
+	dir->tdir_count = n;
+	if (n == 1) {
+		dir->tdir_offset = v[0];
+		return (1);
+	} else
+		return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+/*
+ * Setup a directory entry of an array of RATIONAL
+ * or SRATIONAL and write the associated indirect values.
+ */
+static int
+TIFFWriteRationalArray(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v)
+{
+	uint32 i;
+	uint32* t;
+	int status;
+
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_type = (short) type;
+	dir->tdir_count = n;
+	t = (uint32*) _TIFFmalloc(2*n * sizeof (uint32));
+	for (i = 0; i < n; i++) {
+		float fv = v[i];
+		int sign = 1;
+		uint32 den;
+
+		if (fv < 0) {
+			if (type == TIFF_RATIONAL) {
+				TIFFWarning(tif->tif_name,
+	"\"%s\": Information lost writing value (%g) as (unsigned) RATIONAL",
+				_TIFFFieldWithTag(tif,tag)->field_name, fv);
+				fv = 0;
+			} else
+				fv = -fv, sign = -1;
+		}
+		den = 1L;
+		if (fv > 0) {
+			while (fv < 1L<<(31-3) && den < 1L<<(31-3))
+				fv *= 1<<3, den *= 1L<<3;
+		}
+		t[2*i+0] = (uint32) (sign * (fv + 0.5));
+		t[2*i+1] = den;
+	}
+	status = TIFFWriteData(tif, dir, (char *)t);
+	_TIFFfree((char*) t);
+	return (status);
+}
+
+static int
+TIFFWriteFloatArray(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, float* v)
+{
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_type = (short) type;
+	dir->tdir_count = n;
+	TIFFCvtNativeToIEEEFloat(tif, n, v);
+	if (n == 1) {
+		dir->tdir_offset = *(uint32*) &v[0];
+		return (1);
+	} else
+		return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+static int
+TIFFWriteDoubleArray(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v)
+{
+	dir->tdir_tag = (uint16) tag;
+	dir->tdir_type = (short) type;
+	dir->tdir_count = n;
+	TIFFCvtNativeToIEEEDouble(tif, n, v);
+	return (TIFFWriteData(tif, dir, (char*) v));
+}
+
+/*
+ * Write an array of ``type'' values for a specified tag (i.e. this is a tag
+ * which is allowed to have different types, e.g. SMaxSampleType).
+ * Internally the data values are represented as double since a double can
+ * hold any of the TIFF tag types (yes, this should really be an abstract
+ * type tany_t for portability).  The data is converted into the specified
+ * type in a temporary buffer and then handed off to the appropriate array
+ * writer.
+ */
+static int
+TIFFWriteAnyArray(TIFF* tif,
+    TIFFDataType type, ttag_t tag, TIFFDirEntry* dir, uint32 n, double* v)
+{
+	char buf[10 * sizeof(double)];
+	char* w = buf;
+	int i, status = 0;
+
+	if (n * TIFFDataWidth(type) > sizeof buf)
+		w = (char*) _TIFFmalloc(n * TIFFDataWidth(type));
+	switch (type) {
+	case TIFF_BYTE:
+		{ uint8* bp = (uint8*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (uint8) v[i];
+		  dir->tdir_tag = (uint16) tag;
+		  dir->tdir_type = (short) type;
+		  dir->tdir_count = n;
+		  if (!TIFFWriteByteArray(tif, dir, (char*) bp))
+			goto out;
+		}
+		break;
+	case TIFF_SBYTE:
+		{ int8* bp = (int8*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (int8) v[i];
+		  dir->tdir_tag = (uint16) tag;
+		  dir->tdir_type = (short) type;
+		  dir->tdir_count = n;
+		  if (!TIFFWriteByteArray(tif, dir, (char*) bp))
+			goto out;
+		}
+		break;
+	case TIFF_SHORT:
+		{ uint16* bp = (uint16*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (uint16) v[i];
+		  if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp))
+				goto out;
+		}
+		break;
+	case TIFF_SSHORT:
+		{ int16* bp = (int16*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (int16) v[i];
+		  if (!TIFFWriteShortArray(tif, type, tag, dir, n, (uint16*)bp))
+			goto out;
+		}
+		break;
+	case TIFF_LONG:
+		{ uint32* bp = (uint32*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (uint32) v[i];
+		  if (!TIFFWriteLongArray(tif, type, tag, dir, n, bp))
+			goto out;
+		}
+		break;
+	case TIFF_SLONG:
+		{ int32* bp = (int32*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (int32) v[i];
+		  if (!TIFFWriteLongArray(tif, type, tag, dir, n, (uint32*) bp))
+			goto out;
+		}
+		break;
+	case TIFF_FLOAT:
+		{ float* bp = (float*) w;
+		  for (i = 0; i < (int) n; i++)
+			bp[i] = (float) v[i];
+		  if (!TIFFWriteFloatArray(tif, type, tag, dir, n, bp))
+			goto out;
+		}
+		break;
+	case TIFF_DOUBLE:
+		return (TIFFWriteDoubleArray(tif, type, tag, dir, n, v));
+	default:
+		/* TIFF_NOTYPE */
+		/* TIFF_ASCII */
+		/* TIFF_UNDEFINED */
+		/* TIFF_RATIONAL */
+		/* TIFF_SRATIONAL */
+		goto out;
+	}
+	status = 1;
+ out:
+	if (w != buf)
+		_TIFFfree(w);
+	return (status);
+}
+
+#ifdef COLORIMETRY_SUPPORT
+static int
+TIFFWriteTransferFunction(TIFF* tif, TIFFDirEntry* dir)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+	tsize_t n = (1L<<td->td_bitspersample) * sizeof (uint16);
+	uint16** tf = td->td_transferfunction;
+	int ncols;
+
+	/*
+	 * Check if the table can be written as a single column,
+	 * or if it must be written as 3 columns.  Note that we
+	 * write a 3-column tag if there are 2 samples/pixel and
+	 * a single column of data won't suffice--hmm.
+	 */
+	switch (td->td_samplesperpixel - td->td_extrasamples) {
+	default:	if (_TIFFmemcmp(tf[0], tf[2], n)) { ncols = 3; break; }
+	case 2:		if (_TIFFmemcmp(tf[0], tf[1], n)) { ncols = 3; break; }
+	case 1: case 0:	ncols = 1;
+	}
+	return (TIFFWriteShortTable(tif,
+	    TIFFTAG_TRANSFERFUNCTION, dir, ncols, tf));
+}
+#endif
+
+#ifdef CMYK_SUPPORT
+static int
+TIFFWriteInkNames(TIFF* tif, TIFFDirEntry* dir)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+
+	dir->tdir_tag = TIFFTAG_INKNAMES;
+	dir->tdir_type = (short) TIFF_ASCII;
+	dir->tdir_count = td->td_inknameslen;
+	return (TIFFWriteByteArray(tif, dir, td->td_inknames));
+}
+#endif
+
+/*
+ * Write a contiguous directory item.
+ */
+static int
+TIFFWriteData(TIFF* tif, TIFFDirEntry* dir, char* cp)
+{
+	tsize_t cc;
+
+	if (tif->tif_flags & TIFF_SWAB) {
+		switch (dir->tdir_type) {
+		case TIFF_SHORT:
+		case TIFF_SSHORT:
+			TIFFSwabArrayOfShort((uint16*) cp, dir->tdir_count);
+			break;
+		case TIFF_LONG:
+		case TIFF_SLONG:
+		case TIFF_FLOAT:
+			TIFFSwabArrayOfLong((uint32*) cp, dir->tdir_count);
+			break;
+		case TIFF_RATIONAL:
+		case TIFF_SRATIONAL:
+			TIFFSwabArrayOfLong((uint32*) cp, 2*dir->tdir_count);
+			break;
+		case TIFF_DOUBLE:
+			TIFFSwabArrayOfDouble((double*) cp, dir->tdir_count);
+			break;
+		}
+	}
+	dir->tdir_offset = tif->tif_dataoff;
+	cc = dir->tdir_count * TIFFDataWidth((TIFFDataType) dir->tdir_type);
+	if (SeekOK(tif, dir->tdir_offset) &&
+	    WriteOK(tif, cp, cc)) {
+		tif->tif_dataoff += (cc + 1) & ~1;
+		return (1);
+	}
+	TIFFError(tif->tif_name, "Error writing data for field \"%s\"",
+	    _TIFFFieldWithTag(tif, dir->tdir_tag)->field_name);
+	return (0);
+}
+
+/*
+ * Similar to TIFFWriteDirectory(), but if the directory has already
+ * been written once, it is relocated to the end of the file, in case it
+ * has changed in size.  Note that this will result in the loss of the 
+ * previously used directory space. 
+ */ 
+
+int 
+TIFFRewriteDirectory( TIFF *tif )
+{
+    static const char module[] = "TIFFRewriteDirectory";
+
+    /* We don't need to do anything special if it hasn't been written. */
+    if( tif->tif_diroff == 0 )
+        return TIFFWriteDirectory( tif );
+
+    /*
+    ** Find and zero the pointer to this directory, so that TIFFLinkDirectory
+    ** will cause it to be added after this directories current pre-link.
+    */
+    
+    /* Is it the first directory in the file? */
+    if (tif->tif_header.tiff_diroff == tif->tif_diroff) 
+    {
+        tif->tif_header.tiff_diroff = 0;
+        tif->tif_diroff = 0;
+
+#if defined(__hpux) && defined(__LP64__)
+#define HDROFF(f) ((toff_t)(unsigned long) &(((TIFFHeader*) 0)->f))
+#else
+#define	HDROFF(f)	((toff_t) &(((TIFFHeader*) 0)->f))
+#endif
+        TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET);
+        if (!WriteOK(tif, &(tif->tif_header.tiff_diroff), 
+                     sizeof (tif->tif_diroff))) 
+        {
+            TIFFError(tif->tif_name, "Error updating TIFF header");
+            return (0);
+        }
+    }
+    else
+    {
+        toff_t  nextdir, off;
+
+	nextdir = tif->tif_header.tiff_diroff;
+	do {
+		uint16 dircount;
+
+		if (!SeekOK(tif, nextdir) ||
+		    !ReadOK(tif, &dircount, sizeof (dircount))) {
+			TIFFError(module, "Error fetching directory count");
+			return (0);
+		}
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabShort(&dircount);
+		(void) TIFFSeekFile(tif,
+		    dircount * sizeof (TIFFDirEntry), SEEK_CUR);
+		if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
+			TIFFError(module, "Error fetching directory link");
+			return (0);
+		}
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabLong(&nextdir);
+	} while (nextdir != tif->tif_diroff && nextdir != 0);
+        off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
+        (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
+        tif->tif_diroff = 0;
+	if (!WriteOK(tif, &(tif->tif_diroff), sizeof (nextdir))) {
+		TIFFError(module, "Error writing directory link");
+		return (0);
+	}
+    }
+
+    /*
+    ** Now use TIFFWriteDirectory() normally.
+    */
+
+    return TIFFWriteDirectory( tif );
+}
+
+
+/*
+ * Link the current directory into the
+ * directory chain for the file.
+ */
+static int
+TIFFLinkDirectory(TIFF* tif)
+{
+	static const char module[] = "TIFFLinkDirectory";
+	toff_t nextdir;
+	toff_t diroff, off;
+
+	tif->tif_diroff = (TIFFSeekFile(tif, (toff_t) 0, SEEK_END)+1) &~ 1;
+	diroff = tif->tif_diroff;
+	if (tif->tif_flags & TIFF_SWAB)
+		TIFFSwabLong(&diroff);
+#if SUBIFD_SUPPORT
+	if (tif->tif_flags & TIFF_INSUBIFD) {
+		(void) TIFFSeekFile(tif, tif->tif_subifdoff, SEEK_SET);
+		if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+			TIFFError(module,
+			    "%s: Error writing SubIFD directory link",
+			    tif->tif_name);
+			return (0);
+		}
+		/*
+		 * Advance to the next SubIFD or, if this is
+		 * the last one configured, revert back to the
+		 * normal directory linkage.
+		 */
+		if (--tif->tif_nsubifd)
+			tif->tif_subifdoff += sizeof (diroff);
+		else
+			tif->tif_flags &= ~TIFF_INSUBIFD;
+		return (1);
+	}
+#endif
+	if (tif->tif_header.tiff_diroff == 0) {
+		/*
+		 * First directory, overwrite offset in header.
+		 */
+		tif->tif_header.tiff_diroff = tif->tif_diroff;
+#define	HDROFF(f)	((toff_t) &(((TIFFHeader*) 0)->f))
+		(void) TIFFSeekFile(tif, HDROFF(tiff_diroff), SEEK_SET);
+		if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+			TIFFError(tif->tif_name, "Error writing TIFF header");
+			return (0);
+		}
+		return (1);
+	}
+	/*
+	 * Not the first directory, search to the last and append.
+	 */
+	nextdir = tif->tif_header.tiff_diroff;
+	do {
+		uint16 dircount;
+
+		if (!SeekOK(tif, nextdir) ||
+		    !ReadOK(tif, &dircount, sizeof (dircount))) {
+			TIFFError(module, "Error fetching directory count");
+			return (0);
+		}
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabShort(&dircount);
+		(void) TIFFSeekFile(tif,
+		    dircount * sizeof (TIFFDirEntry), SEEK_CUR);
+		if (!ReadOK(tif, &nextdir, sizeof (nextdir))) {
+			TIFFError(module, "Error fetching directory link");
+			return (0);
+		}
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabLong(&nextdir);
+	} while (nextdir != 0);
+        off = TIFFSeekFile(tif, 0, SEEK_CUR); /* get current offset */
+        (void) TIFFSeekFile(tif, off - (toff_t)sizeof(nextdir), SEEK_SET);
+	if (!WriteOK(tif, &diroff, sizeof (diroff))) {
+		TIFFError(module, "Error writing directory link");
+		return (0);
+	}
+	return (1);
+}
diff --git a/src/tiff/tif_dumpmode.c b/src/tiff/tif_dumpmode.c
new file mode 100644
index 0000000..4f8f38a
--- /dev/null
+++ b/src/tiff/tif_dumpmode.c
@@ -0,0 +1,118 @@
+/* $Header: /home/terralib/src/tiff/tif_dumpmode.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * "Null" Compression Algorithm Support.
+ */
+#include "tiffiop.h"
+#include <assert.h>
+
+/*
+ * Encode a hunk of pixels.
+ */
+static int
+DumpModeEncode(TIFF* tif, tidata_t pp, tsize_t cc, tsample_t s)
+{
+	(void) s;
+	while (cc > 0) {
+		tsize_t n;
+
+		n = cc;
+		if (tif->tif_rawcc + n > tif->tif_rawdatasize)
+			n = tif->tif_rawdatasize - tif->tif_rawcc;
+
+                assert( n > 0 );
+                
+		/*
+		 * Avoid copy if client has setup raw
+		 * data buffer to avoid extra copy.
+		 */
+		if (tif->tif_rawcp != pp)
+			_TIFFmemcpy(tif->tif_rawcp, pp, n);
+		tif->tif_rawcp += n;
+		tif->tif_rawcc += n;
+		pp += n;
+		cc -= n;
+		if (tif->tif_rawcc >= tif->tif_rawdatasize &&
+		    !TIFFFlushData1(tif))
+			return (-1);
+	}
+	return (1);
+}
+
+/*
+ * Decode a hunk of pixels.
+ */
+static int
+DumpModeDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+	(void) s;
+	if (tif->tif_rawcc < cc) {
+		TIFFError(tif->tif_name,
+		    "DumpModeDecode: Not enough data for scanline %d",
+		    tif->tif_row);
+		return (0);
+	}
+	/*
+	 * Avoid copy if client has setup raw
+	 * data buffer to avoid extra copy.
+	 */
+	if (tif->tif_rawcp != buf)
+		_TIFFmemcpy(buf, tif->tif_rawcp, cc);
+	tif->tif_rawcp += cc;
+	tif->tif_rawcc -= cc;
+	return (1);
+}
+
+/*
+ * Seek forwards nrows in the current strip.
+ */
+static int
+DumpModeSeek(TIFF* tif, uint32 nrows)
+{
+	tif->tif_rawcp += nrows * tif->tif_scanlinesize;
+	tif->tif_rawcc -= nrows * tif->tif_scanlinesize;
+	return (1);
+}
+
+/*
+ * Initialize dump mode.
+ */
+int
+TIFFInitDumpMode(TIFF* tif, int scheme)
+{
+	(void) scheme;
+	tif->tif_decoderow = DumpModeDecode;
+	tif->tif_decodestrip = DumpModeDecode;
+	tif->tif_decodetile = DumpModeDecode;
+	tif->tif_encoderow = DumpModeEncode;
+	tif->tif_encodestrip = DumpModeEncode;
+	tif->tif_encodetile = DumpModeEncode;
+	tif->tif_seek = DumpModeSeek;
+	return (1);
+}
diff --git a/src/tiff/tif_error.c b/src/tiff/tif_error.c
new file mode 100644
index 0000000..d9100eb
--- /dev/null
+++ b/src/tiff/tif_error.c
@@ -0,0 +1,49 @@
+/* $Header: /home/terralib/src/tiff/tif_error.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+TIFFErrorHandler
+TIFFSetErrorHandler(TIFFErrorHandler handler)
+{
+	TIFFErrorHandler prev = _TIFFerrorHandler;
+	_TIFFerrorHandler = handler;
+	return (prev);
+}
+
+void
+TIFFError(const char* module, const char* fmt, ...)
+{
+	if (_TIFFerrorHandler) {
+		va_list ap;
+		va_start(ap, fmt);
+		(*_TIFFerrorHandler)(module, fmt, ap);
+		va_end(ap);
+	}
+}
diff --git a/src/tiff/tif_extension.c b/src/tiff/tif_extension.c
new file mode 100644
index 0000000..95fc409
--- /dev/null
+++ b/src/tiff/tif_extension.c
@@ -0,0 +1,109 @@
+/* $Header: /home/terralib/src/tiff/tif_extension.c,v 1.1 2004/03/19 11:52:52 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Various routines support external extension of the tag set, and other
+ * application extension capabilities. 
+ */
+
+#include "tiffiop.h"
+
+int TIFFGetTagListCount( TIFF *tif )
+
+{
+    TIFFDirectory* td = &tif->tif_dir;
+    
+    return td->td_customValueCount;
+}
+
+ttag_t TIFFGetTagListEntry( TIFF *tif, int tag_index )
+
+{
+    TIFFDirectory* td = &tif->tif_dir;
+
+    if( tag_index < 0 || tag_index >= td->td_customValueCount )
+        return (ttag_t) -1;
+    else
+        return td->td_customValues[tag_index].info->field_tag;
+}
+
+/*
+** This provides read/write access to the TIFFTagMethods within the TIFF
+** structure to application code without giving access to the private
+** TIFF structure.
+*/
+TIFFTagMethods *TIFFAccessTagMethods( TIFF *tif )
+
+{
+    return &(tif->tif_tagmethods);
+}
+
+void *TIFFGetClientInfo( TIFF *tif, const char *name )
+
+{
+    TIFFClientInfoLink *link = tif->tif_clientinfo;
+
+    while( link != NULL && strcmp(link->name,name) != 0 )
+        link = link->next;
+
+    if( link != NULL )
+        return link->data;
+    else
+        return NULL;
+}
+
+void TIFFSetClientInfo( TIFF *tif, void *data, const char *name )
+
+{
+    TIFFClientInfoLink *link = tif->tif_clientinfo;
+
+    /*
+    ** Do we have an existing link with this name?  If so, just
+    ** set it.
+    */
+    while( link != NULL && strcmp(link->name,name) != 0 )
+        link = link->next;
+
+    if( link != NULL )
+    {
+        link->data = data;
+        return;
+    }
+
+    /*
+    ** Create a new link.
+    */
+
+    link = (TIFFClientInfoLink *) _TIFFmalloc(sizeof(TIFFClientInfoLink));
+    link->next = tif->tif_clientinfo;
+    link->name = (char *) _TIFFmalloc(strlen(name)+1);
+    strcpy(link->name, name);
+    link->data = data;
+
+    tif->tif_clientinfo = link;
+}
diff --git a/src/tiff/tif_fax3.c b/src/tiff/tif_fax3.c
new file mode 100644
index 0000000..3f98c86
--- /dev/null
+++ b/src/tiff/tif_fax3.c
@@ -0,0 +1,1515 @@
+/* $Header: /home/terralib/src/tiff/tif_fax3.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1990-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef CCITT_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * CCITT Group 3 (T.4) and Group 4 (T.6) Compression Support.
+ *
+ * This file contains support for decoding and encoding TIFF
+ * compression algorithms 2, 3, 4, and 32771.
+ *
+ * Decoder support is derived, with permission, from the code
+ * in Frank Cringle's viewfax program;
+ *      Copyright (C) 1990, 1995  Frank D. Cringle.
+ */
+#include "tif_fax3.h"
+#define	G3CODES
+#include "t4.h"
+#include <assert.h>
+#include <stdio.h>
+
+/*
+ * Compression+decompression state blocks are
+ * derived from this ``base state'' block.
+ */
+typedef struct {
+        int     rw_mode;                /* O_RDONLY for decode, else encode */
+	int	mode;			/* operating mode */
+	uint32	rowbytes;		/* bytes in a decoded scanline */
+	uint32	rowpixels;		/* pixels in a scanline */
+
+	uint16	cleanfaxdata;		/* CleanFaxData tag */
+	uint32	badfaxrun;		/* BadFaxRun tag */
+	uint32	badfaxlines;		/* BadFaxLines tag */
+	uint32	groupoptions;		/* Group 3/4 options tag */
+	uint32	recvparams;		/* encoded Class 2 session params */
+	char*	subaddress;		/* subaddress string */
+	uint32	recvtime;		/* time spent receiving (secs) */
+	TIFFVGetMethod vgetparent;	/* super-class method */
+	TIFFVSetMethod vsetparent;	/* super-class method */
+} Fax3BaseState;
+#define	Fax3State(tif)		((Fax3BaseState*) (tif)->tif_data)
+
+typedef enum { G3_1D, G3_2D } Ttag;
+typedef struct {
+	Fax3BaseState b;
+
+	/* Decoder state info */
+	const u_char* bitmap;		/* bit reversal table */
+	uint32	data;			/* current i/o byte/word */
+	int	bit;			/* current i/o bit in byte */
+	int	EOLcnt;			/* count of EOL codes recognized */
+	TIFFFaxFillFunc fill;		/* fill routine */
+	uint32*	runs;			/* b&w runs for current/previous row */
+	uint32*	refruns;		/* runs for reference line */
+	uint32*	curruns;		/* runs for current line */
+
+	/* Encoder state info */
+	Ttag    tag;	                /* encoding state */
+	u_char*	refline;		/* reference line for 2d decoding */
+	int	k;			/* #rows left that can be 2d encoded */
+	int	maxk;			/* max #rows that can be 2d encoded */
+} Fax3CodecState;
+#define	DecoderState(tif)	((Fax3CodecState*) Fax3State(tif))
+#define	EncoderState(tif)	((Fax3CodecState*) Fax3State(tif))
+
+#define	is2DEncoding(sp) \
+	(sp->b.groupoptions & GROUP3OPT_2DENCODING)
+#define	isAligned(p,t)	((((u_long)(p)) & (sizeof (t)-1)) == 0)
+
+/*
+ * Group 3 and Group 4 Decoding.
+ */
+
+/*
+ * These macros glue the TIFF library state to
+ * the state expected by Frank's decoder.
+ */
+#define	DECLARE_STATE(tif, sp, mod)					\
+    static const char module[] = mod;					\
+    Fax3CodecState* sp = DecoderState(tif);				\
+    int a0;				/* reference element */		\
+    int lastx = sp->b.rowpixels;	/* last element in row */	\
+    uint32 BitAcc;			/* bit accumulator */		\
+    int BitsAvail;			/* # valid bits in BitAcc */	\
+    int RunLength;			/* length of current run */	\
+    u_char* cp;				/* next byte of input data */	\
+    u_char* ep;				/* end of input data */		\
+    uint32* pa;				/* place to stuff next run */	\
+    uint32* thisrun;			/* current row's run array */	\
+    int EOLcnt;				/* # EOL codes recognized */	\
+    const u_char* bitmap = sp->bitmap;	/* input data bit reverser */	\
+    const TIFFFaxTabEnt* TabEnt
+#define	DECLARE_STATE_2D(tif, sp, mod)					\
+    DECLARE_STATE(tif, sp, mod);					\
+    int b1;				/* next change on prev line */	\
+    uint32* pb				/* next run in reference line */\
+/*
+ * Load any state that may be changed during decoding.
+ */
+#define	CACHE_STATE(tif, sp) do {					\
+    BitAcc = sp->data;							\
+    BitsAvail = sp->bit;						\
+    EOLcnt = sp->EOLcnt;						\
+    cp = (unsigned char*) tif->tif_rawcp;				\
+    ep = cp + tif->tif_rawcc;						\
+} while (0)
+/*
+ * Save state possibly changed during decoding.
+ */
+#define	UNCACHE_STATE(tif, sp) do {					\
+    sp->bit = BitsAvail;						\
+    sp->data = BitAcc;							\
+    sp->EOLcnt = EOLcnt;						\
+    tif->tif_rawcc -= (tidata_t) cp - tif->tif_rawcp;			\
+    tif->tif_rawcp = (tidata_t) cp;					\
+} while (0)
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+Fax3PreDecode(TIFF* tif, tsample_t s)
+{
+	Fax3CodecState* sp = DecoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	sp->bit = 0;			/* force initial read */
+	sp->data = 0;
+	sp->EOLcnt = 0;			/* force initial scan for EOL */
+	/*
+	 * Decoder assumes lsb-to-msb bit order.  Note that we select
+	 * this here rather than in Fax3SetupState so that viewers can
+	 * hold the image open, fiddle with the FillOrder tag value,
+	 * and then re-decode the image.  Otherwise they'd need to close
+	 * and open the image to get the state reset.
+	 */
+	sp->bitmap =
+	    TIFFGetBitRevTable(tif->tif_dir.td_fillorder != FILLORDER_LSB2MSB);
+	if (sp->refruns) {		/* init reference line to white */
+		sp->refruns[0] = (uint32) sp->b.rowpixels;
+		sp->refruns[1] = 0;
+	}
+	return (1);
+}
+
+/*
+ * Routine for handling various errors/conditions.
+ * Note how they are "glued into the decoder" by
+ * overriding the definitions used by the decoder.
+ */
+
+static void
+Fax3Unexpected(const char* module, TIFF* tif, uint32 a0)
+{
+	TIFFError(module, "%s: Bad code word at scanline %d (x %lu)",
+	    tif->tif_name, tif->tif_row, (u_long) a0);
+}
+#define	unexpected(table, a0)	Fax3Unexpected(module, tif, a0)
+
+static void
+Fax3Extension(const char* module, TIFF* tif, uint32 a0)
+{
+	TIFFError(module,
+	    "%s: Uncompressed data (not supported) at scanline %d (x %lu)",
+	    tif->tif_name, tif->tif_row, (u_long) a0);
+}
+#define	extension(a0)	Fax3Extension(module, tif, a0)
+
+static void
+Fax3BadLength(const char* module, TIFF* tif, uint32 a0, uint32 lastx)
+{
+	TIFFWarning(module, "%s: %s at scanline %d (got %lu, expected %lu)",
+	    tif->tif_name,
+	    a0 < lastx ? "Premature EOL" : "Line length mismatch",
+	    tif->tif_row, (u_long) a0, (u_long) lastx);
+}
+#define	badlength(a0,lastx)	Fax3BadLength(module, tif, a0, lastx)
+
+static void
+Fax3PrematureEOF(const char* module, TIFF* tif, uint32 a0)
+{
+	TIFFWarning(module, "%s: Premature EOF at scanline %d (x %lu)",
+	    tif->tif_name, tif->tif_row, (u_long) a0);
+}
+#define	prematureEOF(a0)	Fax3PrematureEOF(module, tif, a0)
+
+#define	Nop
+
+/*
+ * Decode the requested amount of G3 1D-encoded data.
+ */
+static int
+Fax3Decode1D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+	DECLARE_STATE(tif, sp, "Fax3Decode1D");
+
+	(void) s;
+	CACHE_STATE(tif, sp);
+	thisrun = sp->curruns;
+	while ((long)occ > 0) {
+		a0 = 0;
+		RunLength = 0;
+		pa = thisrun;
+#ifdef FAX3_DEBUG
+		printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
+		printf("-------------------- %d\n", tif->tif_row);
+		fflush(stdout);
+#endif
+		SYNC_EOL(EOF1D);
+		EXPAND1D(EOF1Da);
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		buf += sp->b.rowbytes;
+		occ -= sp->b.rowbytes;
+		continue;
+	EOF1D:				/* premature EOF */
+		CLEANUP_RUNS();
+	EOF1Da:				/* premature EOF */
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		UNCACHE_STATE(tif, sp);
+		return (-1);
+	}
+	UNCACHE_STATE(tif, sp);
+	return (1);
+}
+
+#define	SWAP(t,a,b)	{ t x; x = (a); (a) = (b); (b) = x; }
+/*
+ * Decode the requested amount of G3 2D-encoded data.
+ */
+static int
+Fax3Decode2D(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+	DECLARE_STATE_2D(tif, sp, "Fax3Decode2D");
+	int is1D;			/* current line is 1d/2d-encoded */
+
+	(void) s;
+	CACHE_STATE(tif, sp);
+	while ((long)occ > 0) {
+		a0 = 0;
+		RunLength = 0;
+		pa = thisrun = sp->curruns;
+#ifdef FAX3_DEBUG
+		printf("\nBitAcc=%08X, BitsAvail = %d EOLcnt = %d",
+		    BitAcc, BitsAvail, EOLcnt);
+#endif
+		SYNC_EOL(EOF2D);
+		NeedBits8(1, EOF2D);
+		is1D = GetBits(1);	/* 1D/2D-encoding tag bit */
+		ClrBits(1);
+#ifdef FAX3_DEBUG
+		printf(" %s\n-------------------- %d\n",
+		    is1D ? "1D" : "2D", tif->tif_row);
+		fflush(stdout);
+#endif
+		pb = sp->refruns;
+		b1 = *pb++;
+		if (is1D)
+			EXPAND1D(EOF2Da);
+		else
+			EXPAND2D(EOF2Da);
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		SETVAL(0);		/* imaginary change for reference */
+		SWAP(uint32*, sp->curruns, sp->refruns);
+		buf += sp->b.rowbytes;
+		occ -= sp->b.rowbytes;
+		continue;
+	EOF2D:				/* premature EOF */
+		CLEANUP_RUNS();
+	EOF2Da:				/* premature EOF */
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		UNCACHE_STATE(tif, sp);
+		return (-1);
+	}
+	UNCACHE_STATE(tif, sp);
+	return (1);
+}
+#undef SWAP
+
+/*
+ * The ZERO & FILL macros must handle spans < 2*sizeof(long) bytes.
+ * For machines with 64-bit longs this is <16 bytes; otherwise
+ * this is <8 bytes.  We optimize the code here to reflect the
+ * machine characteristics.
+ */
+#if defined(__alpha) || _MIPS_SZLONG == 64 || defined(__LP64__) || defined(__arch64__)
+#define FILL(n, cp)							    \
+    switch (n) {							    \
+    case 15:(cp)[14] = 0xff; case 14:(cp)[13] = 0xff; case 13: (cp)[12] = 0xff;\
+    case 12:(cp)[11] = 0xff; case 11:(cp)[10] = 0xff; case 10: (cp)[9] = 0xff;\
+    case  9: (cp)[8] = 0xff; case  8: (cp)[7] = 0xff; case  7: (cp)[6] = 0xff;\
+    case  6: (cp)[5] = 0xff; case  5: (cp)[4] = 0xff; case  4: (cp)[3] = 0xff;\
+    case  3: (cp)[2] = 0xff; case  2: (cp)[1] = 0xff;			      \
+    case  1: (cp)[0] = 0xff; (cp) += (n); case 0:  ;			      \
+    }
+#define ZERO(n, cp)							\
+    switch (n) {							\
+    case 15:(cp)[14] = 0; case 14:(cp)[13] = 0; case 13: (cp)[12] = 0;	\
+    case 12:(cp)[11] = 0; case 11:(cp)[10] = 0; case 10: (cp)[9] = 0;	\
+    case  9: (cp)[8] = 0; case  8: (cp)[7] = 0; case  7: (cp)[6] = 0;	\
+    case  6: (cp)[5] = 0; case  5: (cp)[4] = 0; case  4: (cp)[3] = 0;	\
+    case  3: (cp)[2] = 0; case  2: (cp)[1] = 0;			      	\
+    case  1: (cp)[0] = 0; (cp) += (n); case 0:  ;			\
+    }
+#else
+#define FILL(n, cp)							    \
+    switch (n) {							    \
+    case 7: (cp)[6] = 0xff; case 6: (cp)[5] = 0xff; case 5: (cp)[4] = 0xff; \
+    case 4: (cp)[3] = 0xff; case 3: (cp)[2] = 0xff; case 2: (cp)[1] = 0xff; \
+    case 1: (cp)[0] = 0xff; (cp) += (n); case 0:  ;			    \
+    }
+#define ZERO(n, cp)							\
+    switch (n) {							\
+    case 7: (cp)[6] = 0; case 6: (cp)[5] = 0; case 5: (cp)[4] = 0;	\
+    case 4: (cp)[3] = 0; case 3: (cp)[2] = 0; case 2: (cp)[1] = 0;	\
+    case 1: (cp)[0] = 0; (cp) += (n); case 0:  ;			\
+    }
+#endif
+
+/*
+ * Bit-fill a row according to the white/black
+ * runs generated during G3/G4 decoding.
+ */
+void
+_TIFFFax3fillruns(u_char* buf, uint32* runs, uint32* erun, uint32 lastx)
+{
+	static const unsigned char _fillmasks[] =
+	    { 0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff };
+	u_char* cp;
+	uint32 x, bx, run;
+	int32 n, nw;
+	long* lp;
+
+	if ((erun-runs)&1)
+	    *erun++ = 0;
+	x = 0;
+	for (; runs < erun; runs += 2) {
+	    run = runs[0];
+	    if (x+run > lastx || run > lastx )
+		run = runs[0] = (uint32) (lastx - x);
+	    if (run) {
+		cp = buf + (x>>3);
+		bx = x&7;
+		if (run > 8-bx) {
+		    if (bx) {			/* align to byte boundary */
+			*cp++ &= 0xff << (8-bx);
+			run -= 8-bx;
+		    }
+		    if( (n = run >> 3) != 0 ) {	/* multiple bytes to fill */
+			if ((n/sizeof (long)) > 1) {
+			    /*
+			     * Align to longword boundary and fill.
+			     */
+			    for (; n && !isAligned(cp, long); n--)
+				    *cp++ = 0x00;
+			    lp = (long*) cp;
+			    nw = (int32)(n / sizeof (long));
+			    n -= nw * sizeof (long);
+			    do {
+				    *lp++ = 0L;
+			    } while (--nw);
+			    cp = (u_char*) lp;
+			}
+			ZERO(n, cp);
+			run &= 7;
+		    }
+		    if (run)
+			cp[0] &= 0xff >> run;
+		} else
+		    cp[0] &= ~(_fillmasks[run]>>bx);
+		x += runs[0];
+	    }
+	    run = runs[1];
+	    if (x+run > lastx || run > lastx )
+		run = runs[1] = lastx - x;
+	    if (run) {
+		cp = buf + (x>>3);
+		bx = x&7;
+		if (run > 8-bx) {
+		    if (bx) {			/* align to byte boundary */
+			*cp++ |= 0xff >> bx;
+			run -= 8-bx;
+		    }
+		    if( (n = run>>3) != 0 ) {	/* multiple bytes to fill */
+			if ((n/sizeof (long)) > 1) {
+			    /*
+			     * Align to longword boundary and fill.
+			     */
+			    for (; n && !isAligned(cp, long); n--)
+				*cp++ = 0xff;
+			    lp = (long*) cp;
+			    nw = (int32)(n / sizeof (long));
+			    n -= nw * sizeof (long);
+			    do {
+				*lp++ = -1L;
+			    } while (--nw);
+			    cp = (u_char*) lp;
+			}
+			FILL(n, cp);
+			run &= 7;
+		    }
+		    if (run)
+			cp[0] |= 0xff00 >> run;
+		} else
+		    cp[0] |= _fillmasks[run]>>bx;
+		x += runs[1];
+	    }
+	}
+	assert(x == lastx);
+}
+#undef	ZERO
+#undef	FILL
+
+/*
+ * Setup G3/G4-related compression/decompression state
+ * before data is processed.  This routine is called once
+ * per image -- it sets up different state based on whether
+ * or not decoding or encoding is being done and whether
+ * 1D- or 2D-encoded data is involved.
+ */
+static int
+Fax3SetupState(TIFF* tif)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+	Fax3BaseState* sp = Fax3State(tif);
+	long rowbytes, rowpixels;
+	int needsRefLine;
+	Fax3CodecState* dsp = DecoderState(tif);
+	uint32 nruns;
+
+	if (td->td_bitspersample != 1) {
+		TIFFError(tif->tif_name,
+		    "Bits/sample must be 1 for Group 3/4 encoding/decoding");
+		return (0);
+	}
+	/*
+	 * Calculate the scanline/tile widths.
+	 */
+	if (isTiled(tif)) {
+		rowbytes = TIFFTileRowSize(tif);
+		rowpixels = td->td_tilewidth;
+	} else {
+		rowbytes = TIFFScanlineSize(tif);
+		rowpixels = td->td_imagewidth;
+	}
+	sp->rowbytes = (uint32) rowbytes;
+	sp->rowpixels = (uint32) rowpixels;
+	/*
+	 * Allocate any additional space required for decoding/encoding.
+	 */
+	needsRefLine = (
+	    (sp->groupoptions & GROUP3OPT_2DENCODING) ||
+	    td->td_compression == COMPRESSION_CCITTFAX4
+	);
+
+	nruns = needsRefLine ? 2*TIFFroundup(rowpixels,32) : rowpixels;
+
+	dsp->runs = (uint32*) _TIFFmalloc((2*nruns+3)*sizeof (uint32));
+	if (dsp->runs == NULL) {
+		TIFFError("Fax3SetupState",
+		    "%s: No space for Group 3/4 run arrays",
+		    tif->tif_name);
+		return (0);
+	}
+	dsp->curruns = dsp->runs;
+	if (needsRefLine)
+		dsp->refruns = dsp->runs + (nruns>>1);
+	else
+		dsp->refruns = NULL;
+	if (is2DEncoding(dsp)) {	/* NB: default is 1D routine */
+		tif->tif_decoderow = Fax3Decode2D;
+		tif->tif_decodestrip = Fax3Decode2D;
+		tif->tif_decodetile = Fax3Decode2D;
+	}
+
+	if (needsRefLine) {		/* 2d encoding */
+		Fax3CodecState* esp = EncoderState(tif);
+		/*
+		 * 2d encoding requires a scanline
+		 * buffer for the ``reference line''; the
+		 * scanline against which delta encoding
+		 * is referenced.  The reference line must
+		 * be initialized to be ``white'' (done elsewhere).
+		 */
+		esp->refline = (u_char*) _TIFFmalloc(rowbytes);
+		if (esp->refline == NULL) {
+			TIFFError("Fax3SetupState",
+			    "%s: No space for Group 3/4 reference line",
+			    tif->tif_name);
+			return (0);
+		}
+	} else					/* 1d encoding */
+		EncoderState(tif)->refline = NULL;
+	return (1);
+}
+
+/*
+ * CCITT Group 3 FAX Encoding.
+ */
+
+#define	Fax3FlushBits(tif, sp) {				\
+	if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize)		\
+		(void) TIFFFlushData1(tif);			\
+	*(tif)->tif_rawcp++ = (tidataval_t) (sp)->data;		\
+	(tif)->tif_rawcc++;					\
+	(sp)->data = 0, (sp)->bit = 8;				\
+}
+#define	_FlushBits(tif) {					\
+	if ((tif)->tif_rawcc >= (tif)->tif_rawdatasize)		\
+		(void) TIFFFlushData1(tif);			\
+	*(tif)->tif_rawcp++ = (tidataval_t) data;		\
+	(tif)->tif_rawcc++;					\
+	data = 0, bit = 8;					\
+}
+static const int _msbmask[9] =
+    { 0x00, 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff };
+#define	_PutBits(tif, bits, length) {				\
+	while (length > bit) {					\
+		data |= bits >> (length - bit);			\
+		length -= bit;					\
+		_FlushBits(tif);				\
+	}							\
+	data |= (bits & _msbmask[length]) << (bit - length);	\
+	bit -= length;						\
+	if (bit == 0)						\
+		_FlushBits(tif);				\
+}
+	
+/*
+ * Write a variable-length bit-value to
+ * the output stream.  Values are
+ * assumed to be at most 16 bits.
+ */
+static void
+Fax3PutBits(TIFF* tif, u_int bits, u_int length)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+	u_int bit = sp->bit;
+	int data = sp->data;
+
+	_PutBits(tif, bits, length);
+
+	sp->data = data;
+	sp->bit = bit;
+}
+
+/*
+ * Write a code to the output stream.
+ */
+#define putcode(tif, te)	Fax3PutBits(tif, (te)->code, (te)->length)
+
+#ifdef FAX3_DEBUG
+#define	DEBUG_COLOR(w) (tab == TIFFFaxWhiteCodes ? w "W" : w "B")
+#define	DEBUG_PRINT(what,len) {						\
+    int t;								\
+    printf("%08X/%-2d: %s%5d\t", data, bit, DEBUG_COLOR(what), len);	\
+    for (t = length-1; t >= 0; t--)					\
+	putchar(code & (1<<t) ? '1' : '0');				\
+    putchar('\n');							\
+}
+#endif
+
+/*
+ * Write the sequence of codes that describes
+ * the specified span of zero's or one's.  The
+ * appropriate table that holds the make-up and
+ * terminating codes is supplied.
+ */
+static void
+putspan(TIFF* tif, int32 span, const tableentry* tab)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+	u_int bit = sp->bit;
+	int data = sp->data;
+	u_int code, length;
+
+	while (span >= 2624) {
+		const tableentry* te = &tab[63 + (2560>>6)];
+		code = te->code, length = te->length;
+#ifdef FAX3_DEBUG
+		DEBUG_PRINT("MakeUp", te->runlen);
+#endif
+		_PutBits(tif, code, length);
+		span -= te->runlen;
+	}
+	if (span >= 64) {
+		const tableentry* te = &tab[63 + (span>>6)];
+		assert(te->runlen == 64*(span>>6));
+		code = te->code, length = te->length;
+#ifdef FAX3_DEBUG
+		DEBUG_PRINT("MakeUp", te->runlen);
+#endif
+		_PutBits(tif, code, length);
+		span -= te->runlen;
+	}
+	code = tab[span].code, length = tab[span].length;
+#ifdef FAX3_DEBUG
+	DEBUG_PRINT("  Term", tab[span].runlen);
+#endif
+	_PutBits(tif, code, length);
+
+	sp->data = data;
+	sp->bit = bit;
+}
+
+/*
+ * Write an EOL code to the output stream.  The zero-fill
+ * logic for byte-aligning encoded scanlines is handled
+ * here.  We also handle writing the tag bit for the next
+ * scanline when doing 2d encoding.
+ */
+static void
+Fax3PutEOL(TIFF* tif)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+	u_int bit = sp->bit;
+	int data = sp->data;
+	u_int code, length, tparm;
+
+	if (sp->b.groupoptions & GROUP3OPT_FILLBITS) {
+		/*
+		 * Force bit alignment so EOL will terminate on
+		 * a byte boundary.  That is, force the bit alignment
+		 * to 16-12 = 4 before putting out the EOL code.
+		 */
+		int align = 8 - 4;
+		if (align != sp->bit) {
+			if (align > sp->bit)
+				align = sp->bit + (8 - align);
+			else
+				align = sp->bit - align;
+			code = 0;
+			tparm=align; 
+			_PutBits(tif, 0, tparm);
+		}
+	}
+	code = EOL, length = 12;
+	if (is2DEncoding(sp))
+		code = (code<<1) | (sp->tag == G3_1D), length++;
+	_PutBits(tif, code, length);
+
+	sp->data = data;
+	sp->bit = bit;
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int
+Fax3PreEncode(TIFF* tif, tsample_t s)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	sp->bit = 8;
+	sp->data = 0;
+	sp->tag = G3_1D;
+	/*
+	 * This is necessary for Group 4; otherwise it isn't
+	 * needed because the first scanline of each strip ends
+	 * up being copied into the refline.
+	 */
+	if (sp->refline)
+		_TIFFmemset(sp->refline, 0x00, sp->b.rowbytes);
+	if (is2DEncoding(sp)) {
+		float res = tif->tif_dir.td_yresolution;
+		/*
+		 * The CCITT spec says that when doing 2d encoding, you
+		 * should only do it on K consecutive scanlines, where K
+		 * depends on the resolution of the image being encoded
+		 * (2 for <= 200 lpi, 4 for > 200 lpi).  Since the directory
+		 * code initializes td_yresolution to 0, this code will
+		 * select a K of 2 unless the YResolution tag is set
+		 * appropriately.  (Note also that we fudge a little here
+		 * and use 150 lpi to avoid problems with units conversion.)
+		 */
+		if (tif->tif_dir.td_resolutionunit == RESUNIT_CENTIMETER)
+			res *= 2.54f;		/* convert to inches */
+		sp->maxk = (res > 150 ? 4 : 2);
+		sp->k = sp->maxk-1;
+	} else
+		sp->k = sp->maxk = 0;
+	return (1);
+}
+
+static const u_char zeroruns[256] = {
+    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,	/* 0x00 - 0x0f */
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,	/* 0x10 - 0x1f */
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0x20 - 0x2f */
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0x30 - 0x3f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x40 - 0x4f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x50 - 0x5f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x60 - 0x6f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x70 - 0x7f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x80 - 0x8f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x90 - 0x9f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xa0 - 0xaf */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xb0 - 0xbf */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xc0 - 0xcf */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xd0 - 0xdf */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xe0 - 0xef */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0xf0 - 0xff */
+};
+static const u_char oneruns[256] = {
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x00 - 0x0f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x10 - 0x1f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x20 - 0x2f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x30 - 0x3f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x40 - 0x4f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x50 - 0x5f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x60 - 0x6f */
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,	/* 0x70 - 0x7f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x80 - 0x8f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0x90 - 0x9f */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0xa0 - 0xaf */
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,	/* 0xb0 - 0xbf */
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0xc0 - 0xcf */
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,	/* 0xd0 - 0xdf */
+    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,	/* 0xe0 - 0xef */
+    4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 7, 8,	/* 0xf0 - 0xff */
+};
+
+/*
+ * On certain systems it pays to inline
+ * the routines that find pixel spans.
+ */
+#ifdef VAXC
+static	int32 find0span(u_char*, int32, int32);
+static	int32 find1span(u_char*, int32, int32);
+#pragma inline(find0span,find1span)
+#endif
+
+/*
+ * Find a span of ones or zeros using the supplied
+ * table.  The ``base'' of the bit string is supplied
+ * along with the start+end bit indices.
+ */
+INLINE static int32
+find0span(u_char* bp, int32 bs, int32 be)
+{
+	int32 bits = be - bs;
+	int32 n, span;
+
+	bp += bs>>3;
+	/*
+	 * Check partial byte on lhs.
+	 */
+	if (bits > 0 && (n = (bs & 7))) {
+		span = zeroruns[(*bp << n) & 0xff];
+		if (span > 8-n)		/* table value too generous */
+			span = 8-n;
+		if (span > bits)	/* constrain span to bit range */
+			span = bits;
+		if (n+span < 8)		/* doesn't extend to edge of byte */
+			return (span);
+		bits -= span;
+		bp++;
+	} else
+		span = 0;
+	if (bits >= 2*8*sizeof (long)) {
+		long* lp;
+		/*
+		 * Align to longword boundary and check longwords.
+		 */
+		while (!isAligned(bp, long)) {
+			if (*bp != 0x00)
+				return (span + zeroruns[*bp]);
+			span += 8, bits -= 8;
+			bp++;
+		}
+		lp = (long*) bp;
+		while (bits >= 8*sizeof (long) && *lp == 0) {
+			span += 8*sizeof (long), bits -= 8*sizeof (long);
+			lp++;
+		}
+		bp = (u_char*) lp;
+	}
+	/*
+	 * Scan full bytes for all 0's.
+	 */
+	while (bits >= 8) {
+		if (*bp != 0x00)	/* end of run */
+			return (span + zeroruns[*bp]);
+		span += 8, bits -= 8;
+		bp++;
+	}
+	/*
+	 * Check partial byte on rhs.
+	 */
+	if (bits > 0) {
+		n = zeroruns[*bp];
+		span += (n > bits ? bits : n);
+	}
+	return (span);
+}
+
+INLINE static int32
+find1span(u_char* bp, int32 bs, int32 be)
+{
+	int32 bits = be - bs;
+	int32 n, span;
+
+	bp += bs>>3;
+	/*
+	 * Check partial byte on lhs.
+	 */
+	if (bits > 0 && (n = (bs & 7))) {
+		span = oneruns[(*bp << n) & 0xff];
+		if (span > 8-n)		/* table value too generous */
+			span = 8-n;
+		if (span > bits)	/* constrain span to bit range */
+			span = bits;
+		if (n+span < 8)		/* doesn't extend to edge of byte */
+			return (span);
+		bits -= span;
+		bp++;
+	} else
+		span = 0;
+	if (bits >= 2*8*sizeof (long)) {
+		long* lp;
+		/*
+		 * Align to longword boundary and check longwords.
+		 */
+		while (!isAligned(bp, long)) {
+			if (*bp != 0xff)
+				return (span + oneruns[*bp]);
+			span += 8, bits -= 8;
+			bp++;
+		}
+		lp = (long*) bp;
+		while (bits >= 8*sizeof (long) && *lp == ~0) {
+			span += 8*sizeof (long), bits -= 8*sizeof (long);
+			lp++;
+		}
+		bp = (u_char*) lp;
+	}
+	/*
+	 * Scan full bytes for all 1's.
+	 */
+	while (bits >= 8) {
+		if (*bp != 0xff)	/* end of run */
+			return (span + oneruns[*bp]);
+		span += 8, bits -= 8;
+		bp++;
+	}
+	/*
+	 * Check partial byte on rhs.
+	 */
+	if (bits > 0) {
+		n = oneruns[*bp];
+		span += (n > bits ? bits : n);
+	}
+	return (span);
+}
+
+/*
+ * Return the offset of the next bit in the range
+ * [bs..be] that is different from the specified
+ * color.  The end, be, is returned if no such bit
+ * exists.
+ */
+#define	finddiff(_cp, _bs, _be, _color)	\
+	(_bs + (_color ? find1span(_cp,_bs,_be) : find0span(_cp,_bs,_be)))
+/*
+ * Like finddiff, but also check the starting bit
+ * against the end in case start > end.
+ */
+#define	finddiff2(_cp, _bs, _be, _color) \
+	(_bs < _be ? finddiff(_cp,_bs,_be,_color) : _be)
+
+/*
+ * 1d-encode a row of pixels.  The encoding is
+ * a sequence of all-white or all-black spans
+ * of pixels encoded with Huffman codes.
+ */
+static int
+Fax3Encode1DRow(TIFF* tif, u_char* bp, uint32 bits)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+	int32 span;
+        uint32 bs = 0;
+
+	for (;;) {
+		span = find0span(bp, bs, bits);		/* white span */
+		putspan(tif, span, TIFFFaxWhiteCodes);
+		bs += span;
+		if (bs >= bits)
+			break;
+		span = find1span(bp, bs, bits);		/* black span */
+		putspan(tif, span, TIFFFaxBlackCodes);
+		bs += span;
+		if (bs >= bits)
+			break;
+	}
+	if (sp->b.mode & (FAXMODE_BYTEALIGN|FAXMODE_WORDALIGN)) {
+		if (sp->bit != 8)			/* byte-align */
+			Fax3FlushBits(tif, sp);
+		if ((sp->b.mode&FAXMODE_WORDALIGN) &&
+		    !isAligned(tif->tif_rawcp, uint16))
+			Fax3FlushBits(tif, sp);
+	}
+	return (1);
+}
+
+static const tableentry horizcode =
+    { 3, 0x1 };		/* 001 */
+static const tableentry passcode =
+    { 4, 0x1 };		/* 0001 */
+static const tableentry vcodes[7] = {
+    { 7, 0x03 },	/* 0000 011 */
+    { 6, 0x03 },	/* 0000 11 */
+    { 3, 0x03 },	/* 011 */
+    { 1, 0x1 },		/* 1 */
+    { 3, 0x2 },		/* 010 */
+    { 6, 0x02 },	/* 0000 10 */
+    { 7, 0x02 }		/* 0000 010 */
+};
+
+/*
+ * 2d-encode a row of pixels.  Consult the CCITT
+ * documentation for the algorithm.
+ */
+static int
+Fax3Encode2DRow(TIFF* tif, u_char* bp, u_char* rp, uint32 bits)
+{
+#define	PIXEL(buf,ix)	((((buf)[(ix)>>3]) >> (7-((ix)&7))) & 1)
+        uint32 a0 = 0;
+	uint32 a1 = (PIXEL(bp, 0) != 0 ? 0 : finddiff(bp, 0, bits, 0));
+	uint32 b1 = (PIXEL(rp, 0) != 0 ? 0 : finddiff(rp, 0, bits, 0));
+	uint32 a2, b2;
+
+	for (;;) {
+		b2 = finddiff2(rp, b1, bits, PIXEL(rp,b1));
+		if (b2 >= a1) {
+			int32 d = b1 - a1;
+			if (!(-3 <= d && d <= 3)) {	/* horizontal mode */
+				a2 = finddiff2(bp, a1, bits, PIXEL(bp,a1));
+				putcode(tif, &horizcode);
+				if (a0+a1 == 0 || PIXEL(bp, a0) == 0) {
+					putspan(tif, a1-a0, TIFFFaxWhiteCodes);
+					putspan(tif, a2-a1, TIFFFaxBlackCodes);
+				} else {
+					putspan(tif, a1-a0, TIFFFaxBlackCodes);
+					putspan(tif, a2-a1, TIFFFaxWhiteCodes);
+				}
+				a0 = a2;
+			} else {			/* vertical mode */
+				putcode(tif, &vcodes[d+3]);
+				a0 = a1;
+			}
+		} else {				/* pass mode */
+			putcode(tif, &passcode);
+			a0 = b2;
+		}
+		if (a0 >= bits)
+			break;
+		a1 = finddiff(bp, a0, bits, PIXEL(bp,a0));
+		b1 = finddiff(rp, a0, bits, !PIXEL(bp,a0));
+		b1 = finddiff(rp, b1, bits, PIXEL(bp,a0));
+	}
+	return (1);
+#undef PIXEL
+}
+
+/*
+ * Encode a buffer of pixels.
+ */
+static int
+Fax3Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+
+	(void) s;
+	while ((long)cc > 0) {
+		if ((sp->b.mode & FAXMODE_NOEOL) == 0)
+			Fax3PutEOL(tif);
+		if (is2DEncoding(sp)) {
+			if (sp->tag == G3_1D) {
+				if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
+					return (0);
+				sp->tag = G3_2D;
+			} else {
+				if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
+					return (0);
+				sp->k--;
+			}
+			if (sp->k == 0) {
+				sp->tag = G3_1D;
+				sp->k = sp->maxk-1;
+			} else
+				_TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
+		} else {
+			if (!Fax3Encode1DRow(tif, bp, sp->b.rowpixels))
+				return (0);
+		}
+		bp += sp->b.rowbytes;
+		cc -= sp->b.rowbytes;
+	}
+	return (1);
+}
+
+static int
+Fax3PostEncode(TIFF* tif)
+{
+	Fax3CodecState* sp = EncoderState(tif);
+
+	if (sp->bit != 8)
+		Fax3FlushBits(tif, sp);
+	return (1);
+}
+
+static void
+Fax3Close(TIFF* tif)
+{
+	if ((Fax3State(tif)->mode & FAXMODE_NORTC) == 0) {
+		Fax3CodecState* sp = EncoderState(tif);
+		u_int code = EOL;
+		u_int length = 12;
+		int i;
+
+		if (is2DEncoding(sp))
+			code = (code<<1) | (sp->tag == G3_1D), length++;
+		for (i = 0; i < 6; i++)
+			Fax3PutBits(tif, code, length);
+		Fax3FlushBits(tif, sp);
+	}
+}
+
+static void
+Fax3Cleanup(TIFF* tif)
+{
+	if (tif->tif_data) {
+		Fax3CodecState* sp = DecoderState(tif);
+
+		if (sp->runs)
+			_TIFFfree(sp->runs);
+		if (sp->refline)
+			_TIFFfree(sp->refline);
+
+		if (Fax3State(tif)->subaddress)
+			_TIFFfree(Fax3State(tif)->subaddress);
+		_TIFFfree(tif->tif_data);
+		tif->tif_data = NULL;
+	}
+}
+
+#define	FIELD_BADFAXLINES	(FIELD_CODEC+0)
+#define	FIELD_CLEANFAXDATA	(FIELD_CODEC+1)
+#define	FIELD_BADFAXRUN		(FIELD_CODEC+2)
+#define	FIELD_RECVPARAMS	(FIELD_CODEC+3)
+#define	FIELD_SUBADDRESS	(FIELD_CODEC+4)
+#define	FIELD_RECVTIME		(FIELD_CODEC+5)
+
+#define	FIELD_OPTIONS		(FIELD_CODEC+6)
+
+static const TIFFFieldInfo faxFieldInfo[] = {
+    { TIFFTAG_FAXMODE,		 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
+      FALSE,	FALSE,	"FaxMode" },
+    { TIFFTAG_FAXFILLFUNC,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
+      FALSE,	FALSE,	"FaxFillFunc" },
+    { TIFFTAG_BADFAXLINES,	 1, 1,	TIFF_LONG,	FIELD_BADFAXLINES,
+      TRUE,	FALSE,	"BadFaxLines" },
+    { TIFFTAG_BADFAXLINES,	 1, 1,	TIFF_SHORT,	FIELD_BADFAXLINES,
+      TRUE,	FALSE,	"BadFaxLines" },
+    { TIFFTAG_CLEANFAXDATA,	 1, 1,	TIFF_SHORT,	FIELD_CLEANFAXDATA,
+      TRUE,	FALSE,	"CleanFaxData" },
+    { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_LONG,	FIELD_BADFAXRUN,
+      TRUE,	FALSE,	"ConsecutiveBadFaxLines" },
+    { TIFFTAG_CONSECUTIVEBADFAXLINES,1,1, TIFF_SHORT,	FIELD_BADFAXRUN,
+      TRUE,	FALSE,	"ConsecutiveBadFaxLines" },
+    { TIFFTAG_FAXRECVPARAMS,	 1, 1, TIFF_LONG,	FIELD_RECVPARAMS,
+      TRUE,	FALSE,	"FaxRecvParams" },
+    { TIFFTAG_FAXSUBADDRESS,	-1,-1, TIFF_ASCII,	FIELD_SUBADDRESS,
+      TRUE,	FALSE,	"FaxSubAddress" },
+    { TIFFTAG_FAXRECVTIME,	 1, 1, TIFF_LONG,	FIELD_RECVTIME,
+      TRUE,	FALSE,	"FaxRecvTime" },
+};
+static const TIFFFieldInfo fax3FieldInfo[] = {
+    { TIFFTAG_GROUP3OPTIONS,	 1, 1,	TIFF_LONG,	FIELD_OPTIONS,
+      FALSE,	FALSE,	"Group3Options" },
+};
+static const TIFFFieldInfo fax4FieldInfo[] = {
+    { TIFFTAG_GROUP4OPTIONS,	 1, 1,	TIFF_LONG,	FIELD_OPTIONS,
+      FALSE,	FALSE,	"Group4Options" },
+};
+#define	N(a)	(sizeof (a) / sizeof (a[0]))
+
+static int
+Fax3VSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	Fax3BaseState* sp = Fax3State(tif);
+
+	switch (tag) {
+	case TIFFTAG_FAXMODE:
+		sp->mode = va_arg(ap, int);
+		return (1);			/* NB: pseudo tag */
+	case TIFFTAG_FAXFILLFUNC:
+		DecoderState(tif)->fill = va_arg(ap, TIFFFaxFillFunc);
+		return (1);			/* NB: pseudo tag */
+	case TIFFTAG_GROUP3OPTIONS:
+	case TIFFTAG_GROUP4OPTIONS:
+		sp->groupoptions = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_BADFAXLINES:
+		sp->badfaxlines = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_CLEANFAXDATA:
+		sp->cleanfaxdata = (uint16) va_arg(ap, int);
+		break;
+	case TIFFTAG_CONSECUTIVEBADFAXLINES:
+		sp->badfaxrun = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_FAXRECVPARAMS:
+		sp->recvparams = va_arg(ap, uint32);
+		break;
+	case TIFFTAG_FAXSUBADDRESS:
+		_TIFFsetString(&sp->subaddress, va_arg(ap, char*));
+		break;
+	case TIFFTAG_FAXRECVTIME:
+		sp->recvtime = va_arg(ap, uint32);
+		break;
+	default:
+		return (*sp->vsetparent)(tif, tag, ap);
+	}
+	TIFFSetFieldBit(tif, _TIFFFieldWithTag(tif, tag)->field_bit);
+	tif->tif_flags |= TIFF_DIRTYDIRECT;
+	return (1);
+}
+
+static int
+Fax3VGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	Fax3BaseState* sp = Fax3State(tif);
+
+	switch (tag) {
+	case TIFFTAG_FAXMODE:
+		*va_arg(ap, int*) = sp->mode;
+		break;
+	case TIFFTAG_FAXFILLFUNC:
+		*va_arg(ap, TIFFFaxFillFunc*) = DecoderState(tif)->fill;
+		break;
+	case TIFFTAG_GROUP3OPTIONS:
+	case TIFFTAG_GROUP4OPTIONS:
+		*va_arg(ap, uint32*) = sp->groupoptions;
+		break;
+	case TIFFTAG_BADFAXLINES:
+		*va_arg(ap, uint32*) = sp->badfaxlines;
+		break;
+	case TIFFTAG_CLEANFAXDATA:
+		*va_arg(ap, uint16*) = sp->cleanfaxdata;
+		break;
+	case TIFFTAG_CONSECUTIVEBADFAXLINES:
+		*va_arg(ap, uint32*) = sp->badfaxrun;
+		break;
+	case TIFFTAG_FAXRECVPARAMS:
+		*va_arg(ap, uint32*) = sp->recvparams;
+		break;
+	case TIFFTAG_FAXSUBADDRESS:
+		*va_arg(ap, char**) = sp->subaddress;
+		break;
+	case TIFFTAG_FAXRECVTIME:
+		*va_arg(ap, uint32*) = sp->recvtime;
+		break;
+	default:
+		return (*sp->vgetparent)(tif, tag, ap);
+	}
+	return (1);
+}
+
+static void
+Fax3PrintDir(TIFF* tif, FILE* fd, long flags)
+{
+	Fax3BaseState* sp = Fax3State(tif);
+
+	(void) flags;
+	if (TIFFFieldSet(tif,FIELD_OPTIONS)) {
+		const char* sep = " ";
+		if (tif->tif_dir.td_compression == COMPRESSION_CCITTFAX4) {
+			fprintf(fd, "  Group 4 Options:");
+			if (sp->groupoptions & GROUP4OPT_UNCOMPRESSED)
+				fprintf(fd, "%suncompressed data", sep);
+		} else {
+
+			fprintf(fd, "  Group 3 Options:");
+			if (sp->groupoptions & GROUP3OPT_2DENCODING)
+				fprintf(fd, "%s2-d encoding", sep), sep = "+";
+			if (sp->groupoptions & GROUP3OPT_FILLBITS)
+				fprintf(fd, "%sEOL padding", sep), sep = "+";
+			if (sp->groupoptions & GROUP3OPT_UNCOMPRESSED)
+				fprintf(fd, "%suncompressed data", sep);
+		}
+		fprintf(fd, " (%lu = 0x%lx)\n",
+		    (u_long) sp->groupoptions, (u_long) sp->groupoptions);
+	}
+	if (TIFFFieldSet(tif,FIELD_CLEANFAXDATA)) {
+		fprintf(fd, "  Fax Data:");
+		switch (sp->cleanfaxdata) {
+		case CLEANFAXDATA_CLEAN:
+			fprintf(fd, " clean");
+			break;
+		case CLEANFAXDATA_REGENERATED:
+			fprintf(fd, " receiver regenerated");
+			break;
+		case CLEANFAXDATA_UNCLEAN:
+			fprintf(fd, " uncorrected errors");
+			break;
+		}
+		fprintf(fd, " (%u = 0x%x)\n",
+		    sp->cleanfaxdata, sp->cleanfaxdata);
+	}
+	if (TIFFFieldSet(tif,FIELD_BADFAXLINES))
+		fprintf(fd, "  Bad Fax Lines: %lu\n", (u_long) sp->badfaxlines);
+	if (TIFFFieldSet(tif,FIELD_BADFAXRUN))
+		fprintf(fd, "  Consecutive Bad Fax Lines: %lu\n",
+		    (u_long) sp->badfaxrun);
+	if (TIFFFieldSet(tif,FIELD_RECVPARAMS))
+		fprintf(fd, "  Fax Receive Parameters: %08lx\n",
+		   (u_long) sp->recvparams);
+	if (TIFFFieldSet(tif,FIELD_SUBADDRESS))
+		fprintf(fd, "  Fax SubAddress: %s\n", sp->subaddress);
+	if (TIFFFieldSet(tif,FIELD_RECVTIME))
+		fprintf(fd, "  Fax Receive Time: %lu secs\n",
+		    (u_long) sp->recvtime);
+}
+
+static int
+InitCCITTFax3(TIFF* tif)
+{
+	Fax3BaseState* sp;
+
+	/*
+	 * Allocate state block so tag methods have storage to record values.
+	 */
+	tif->tif_data = (tidata_t)
+		_TIFFmalloc(sizeof (Fax3CodecState));
+
+	if (tif->tif_data == NULL) {
+		TIFFError("TIFFInitCCITTFax3",
+		    "%s: No space for state block", tif->tif_name);
+		return (0);
+	}
+
+	sp = Fax3State(tif);
+        sp->rw_mode = tif->tif_mode;
+
+	/*
+	 * Merge codec-specific tag information and
+	 * override parent get/set field methods.
+	 */
+	_TIFFMergeFieldInfo(tif, faxFieldInfo, N(faxFieldInfo));
+	sp->vgetparent = tif->tif_tagmethods.vgetfield;
+	tif->tif_tagmethods.vgetfield = Fax3VGetField;	/* hook for codec tags */
+	sp->vsetparent = tif->tif_tagmethods.vsetfield;
+	tif->tif_tagmethods.vsetfield = Fax3VSetField;	/* hook for codec tags */
+	tif->tif_tagmethods.printdir = Fax3PrintDir;	/* hook for codec tags */
+	sp->groupoptions = 0;	
+	sp->recvparams = 0;
+	sp->subaddress = NULL;
+
+	tif->tif_flags |= TIFF_NOBITREV;	/* decoder does bit reversal */
+	DecoderState(tif)->runs = NULL;
+	TIFFSetField(tif, TIFFTAG_FAXFILLFUNC, _TIFFFax3fillruns);
+	EncoderState(tif)->refline = NULL;
+
+	/*
+	 * Install codec methods.
+	 */
+	tif->tif_setupdecode = Fax3SetupState;
+	tif->tif_predecode = Fax3PreDecode;
+	tif->tif_decoderow = Fax3Decode1D;
+	tif->tif_decodestrip = Fax3Decode1D;
+	tif->tif_decodetile = Fax3Decode1D;
+	tif->tif_setupencode = Fax3SetupState;
+	tif->tif_preencode = Fax3PreEncode;
+	tif->tif_postencode = Fax3PostEncode;
+	tif->tif_encoderow = Fax3Encode;
+	tif->tif_encodestrip = Fax3Encode;
+	tif->tif_encodetile = Fax3Encode;
+	tif->tif_close = Fax3Close;
+	tif->tif_cleanup = Fax3Cleanup;
+
+	return (1);
+}
+
+int
+TIFFInitCCITTFax3(TIFF* tif, int scheme)
+{
+	if (InitCCITTFax3(tif)) {
+		_TIFFMergeFieldInfo(tif, fax3FieldInfo, N(fax3FieldInfo));
+
+		/*
+		 * The default format is Class/F-style w/o RTC.
+		 */
+		return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_CLASSF);
+	} else
+		return (0);
+}
+
+/*
+ * CCITT Group 4 (T.6) Facsimile-compatible
+ * Compression Scheme Support.
+ */
+
+#define	SWAP(t,a,b)	{ t x; x = (a); (a) = (b); (b) = x; }
+/*
+ * Decode the requested amount of G4-encoded data.
+ */
+static int
+Fax4Decode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+	DECLARE_STATE_2D(tif, sp, "Fax4Decode");
+
+	(void) s;
+	CACHE_STATE(tif, sp);
+	while ((long)occ > 0) {
+		a0 = 0;
+		RunLength = 0;
+		pa = thisrun = sp->curruns;
+		pb = sp->refruns;
+		b1 = *pb++;
+#ifdef FAX3_DEBUG
+		printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
+		printf("-------------------- %d\n", tif->tif_row);
+		fflush(stdout);
+#endif
+		EXPAND2D(EOFG4);
+                if (EOLcnt)
+                    goto EOFG4;
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		SETVAL(0);		/* imaginary change for reference */
+		SWAP(uint32*, sp->curruns, sp->refruns);
+		buf += sp->b.rowbytes;
+		occ -= sp->b.rowbytes;
+		continue;
+	EOFG4:
+                NeedBits16( 13, BADG4 );
+        BADG4:
+#ifdef FAX3_DEBUG
+                if( GetBits(13) != 0x1001 )
+                    fputs( "Bad RTC\n", stderr );
+#endif                
+                ClrBits( 13 );
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		UNCACHE_STATE(tif, sp);
+		return (-1);
+	}
+	UNCACHE_STATE(tif, sp);
+	return (1);
+}
+#undef	SWAP
+
+/*
+ * Encode the requested amount of data.
+ */
+static int
+Fax4Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	Fax3CodecState *sp = EncoderState(tif);
+
+	(void) s;
+	while ((long)cc > 0) {
+		if (!Fax3Encode2DRow(tif, bp, sp->refline, sp->b.rowpixels))
+			return (0);
+		_TIFFmemcpy(sp->refline, bp, sp->b.rowbytes);
+		bp += sp->b.rowbytes;
+		cc -= sp->b.rowbytes;
+	}
+	return (1);
+}
+
+static int
+Fax4PostEncode(TIFF* tif)
+{
+	Fax3CodecState *sp = EncoderState(tif);
+
+	/* terminate strip w/ EOFB */
+	Fax3PutBits(tif, EOL, 12);
+	Fax3PutBits(tif, EOL, 12);
+	if (sp->bit != 8)
+		Fax3FlushBits(tif, sp);
+	return (1);
+}
+
+int
+TIFFInitCCITTFax4(TIFF* tif, int scheme)
+{
+	if (InitCCITTFax3(tif)) {		/* reuse G3 support */
+		_TIFFMergeFieldInfo(tif, fax4FieldInfo, N(fax4FieldInfo));
+
+		tif->tif_decoderow = Fax4Decode;
+		tif->tif_decodestrip = Fax4Decode;
+		tif->tif_decodetile = Fax4Decode;
+		tif->tif_encoderow = Fax4Encode;
+		tif->tif_encodestrip = Fax4Encode;
+		tif->tif_encodetile = Fax4Encode;
+		tif->tif_postencode = Fax4PostEncode;
+		/*
+		 * Suppress RTC at the end of each strip.
+		 */
+		return TIFFSetField(tif, TIFFTAG_FAXMODE, FAXMODE_NORTC);
+	} else
+		return (0);
+}
+
+/*
+ * CCITT Group 3 1-D Modified Huffman RLE Compression Support.
+ * (Compression algorithms 2 and 32771)
+ */
+
+/*
+ * Decode the requested amount of RLE-encoded data.
+ */
+static int
+Fax3DecodeRLE(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+	DECLARE_STATE(tif, sp, "Fax3DecodeRLE");
+	int mode = sp->b.mode;
+
+	(void) s;
+	CACHE_STATE(tif, sp);
+	thisrun = sp->curruns;
+	while ((long)occ > 0) {
+		a0 = 0;
+		RunLength = 0;
+		pa = thisrun;
+#ifdef FAX3_DEBUG
+		printf("\nBitAcc=%08X, BitsAvail = %d\n", BitAcc, BitsAvail);
+		printf("-------------------- %d\n", tif->tif_row);
+		fflush(stdout);
+#endif
+		EXPAND1D(EOFRLE);
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		/*
+		 * Cleanup at the end of the row.
+		 */
+		if (mode & FAXMODE_BYTEALIGN) {
+			int n = BitsAvail - (BitsAvail &~ 7);
+			ClrBits(n);
+		} else if (mode & FAXMODE_WORDALIGN) {
+			int n = BitsAvail - (BitsAvail &~ 15);
+			ClrBits(n);
+			if (BitsAvail == 0 && !isAligned(cp, uint16))
+			    cp++;
+		}
+		buf += sp->b.rowbytes;
+		occ -= sp->b.rowbytes;
+		continue;
+	EOFRLE:				/* premature EOF */
+		(*sp->fill)(buf, thisrun, pa, lastx);
+		UNCACHE_STATE(tif, sp);
+		return (-1);
+	}
+	UNCACHE_STATE(tif, sp);
+	return (1);
+}
+
+int
+TIFFInitCCITTRLE(TIFF* tif, int scheme)
+{
+	if (InitCCITTFax3(tif)) {		/* reuse G3 support */
+		tif->tif_decoderow = Fax3DecodeRLE;
+		tif->tif_decodestrip = Fax3DecodeRLE;
+		tif->tif_decodetile = Fax3DecodeRLE;
+		/*
+		 * Suppress RTC+EOLs when encoding and byte-align data.
+		 */
+		return TIFFSetField(tif, TIFFTAG_FAXMODE,
+		    FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_BYTEALIGN);
+	} else
+		return (0);
+}
+
+int
+TIFFInitCCITTRLEW(TIFF* tif, int scheme)
+{
+	if (InitCCITTFax3(tif)) {		/* reuse G3 support */
+		tif->tif_decoderow = Fax3DecodeRLE;
+		tif->tif_decodestrip = Fax3DecodeRLE;
+		tif->tif_decodetile = Fax3DecodeRLE;
+		/*
+		 * Suppress RTC+EOLs when encoding and word-align data.
+		 */
+		return TIFFSetField(tif, TIFFTAG_FAXMODE,
+		    FAXMODE_NORTC|FAXMODE_NOEOL|FAXMODE_WORDALIGN);
+	} else
+		return (0);
+}
+#endif /* CCITT_SUPPORT */
diff --git a/src/tiff/tif_fax3.h b/src/tiff/tif_fax3.h
new file mode 100644
index 0000000..b1f078c
--- /dev/null
+++ b/src/tiff/tif_fax3.h
@@ -0,0 +1,525 @@
+/* $Id: tif_fax3.h,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1990-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _FAX3_
+#define	_FAX3_
+/*
+ * TIFF Library.
+ *
+ * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support.
+ *
+ * Decoder support is derived, with permission, from the code
+ * in Frank Cringle's viewfax program;
+ *      Copyright (C) 1990, 1995  Frank D. Cringle.
+ */
+#include "tiff.h"
+
+/*
+ * To override the default routine used to image decoded
+ * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC.
+ * The routine must have the type signature given below;
+ * for example:
+ *
+ * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx)
+ *
+ * where buf is place to set the bits, runs is the array of b&w run
+ * lengths (white then black), erun is the last run in the array, and
+ * lastx is the width of the row in pixels.  Fill routines can assume
+ * the run array has room for at least lastx runs and can overwrite
+ * data in the run array as needed (e.g. to append zero runs to bring
+ * the count up to a nice multiple).
+ */
+typedef	void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32);
+
+/*
+ * The default run filler; made external for other decoders.
+ */
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern	void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32);
+#if defined(__cplusplus)
+}
+#endif
+
+
+/* finite state machine codes */
+#define S_Null		0
+#define S_Pass		1
+#define S_Horiz		2
+#define S_V0		3
+#define S_VR		4
+#define S_VL		5
+#define S_Ext		6
+#define S_TermW		7
+#define S_TermB		8
+#define S_MakeUpW	9
+#define S_MakeUpB	10
+#define S_MakeUp	11
+#define S_EOL		12
+
+typedef struct {		/* state table entry */
+	unsigned char State;	/* see above */
+	unsigned char Width;	/* width of code in bits */
+	uint32	Param;		/* unsigned 32-bit run length in bits */
+} TIFFFaxTabEnt;
+
+extern	const TIFFFaxTabEnt TIFFFaxMainTable[];
+extern	const TIFFFaxTabEnt TIFFFaxWhiteTable[];
+extern	const TIFFFaxTabEnt TIFFFaxBlackTable[];
+
+/*
+ * The following macros define the majority of the G3/G4 decoder
+ * algorithm using the state tables defined elsewhere.  To build
+ * a decoder you need some setup code and some glue code. Note
+ * that you may also need/want to change the way the NeedBits*
+ * macros get input data if, for example, you know the data to be
+ * decoded is properly aligned and oriented (doing so before running
+ * the decoder can be a big performance win).
+ *
+ * Consult the decoder in the TIFF library for an idea of what you
+ * need to define and setup to make use of these definitions.
+ *
+ * NB: to enable a debugging version of these macros define FAX3_DEBUG
+ *     before including this file.  Trace output goes to stdout.
+ */
+
+#ifndef EndOfData
+#define EndOfData()	(cp >= ep)
+#endif
+/*
+ * Need <=8 or <=16 bits of input data.  Unlike viewfax we
+ * cannot use/assume a word-aligned, properly bit swizzled
+ * input data set because data may come from an arbitrarily
+ * aligned, read-only source such as a memory-mapped file.
+ * Note also that the viewfax decoder does not check for
+ * running off the end of the input data buffer.  This is
+ * possible for G3-encoded data because it prescans the input
+ * data to count EOL markers, but can cause problems for G4
+ * data.  In any event, we don't prescan and must watch for
+ * running out of data since we can't permit the library to
+ * scan past the end of the input data buffer.
+ *
+ * Finally, note that we must handle remaindered data at the end
+ * of a strip specially.  The coder asks for a fixed number of
+ * bits when scanning for the next code.  This may be more bits
+ * than are actually present in the data stream.  If we appear
+ * to run out of data but still have some number of valid bits
+ * remaining then we makeup the requested amount with zeros and
+ * return successfully.  If the returned data is incorrect then
+ * we should be called again and get a premature EOF error;
+ * otherwise we should get the right answer.
+ */
+#ifndef NeedBits8
+#define NeedBits8(n,eoflab) do {					\
+    if (BitsAvail < (n)) {						\
+	if (EndOfData()) {						\
+	    if (BitsAvail == 0)			/* no valid bits */	\
+		goto eoflab;						\
+	    BitsAvail = (n);			/* pad with zeros */	\
+	} else {							\
+	    BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail;		\
+	    BitsAvail += 8;						\
+	}								\
+    }									\
+} while (0)
+#endif
+#ifndef NeedBits16
+#define NeedBits16(n,eoflab) do {					\
+    if (BitsAvail < (n)) {						\
+	if (EndOfData()) {						\
+	    if (BitsAvail == 0)			/* no valid bits */	\
+		goto eoflab;						\
+	    BitsAvail = (n);			/* pad with zeros */	\
+	} else {							\
+	    BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail;		\
+	    if ((BitsAvail += 8) < (n)) {				\
+		if (EndOfData()) {					\
+		    /* NB: we know BitsAvail is non-zero here */	\
+		    BitsAvail = (n);		/* pad with zeros */	\
+		} else {						\
+		    BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail;	\
+		    BitsAvail += 8;					\
+		}							\
+	    }								\
+	}								\
+    }									\
+} while (0)
+#endif
+#define GetBits(n)	(BitAcc & ((1<<(n))-1))
+#define ClrBits(n) do {							\
+    BitsAvail -= (n);							\
+    BitAcc >>= (n);							\
+} while (0)
+
+#ifdef FAX3_DEBUG
+static const char* StateNames[] = {
+    "Null   ",
+    "Pass   ",
+    "Horiz  ",
+    "V0     ",
+    "VR     ",
+    "VL     ",
+    "Ext    ",
+    "TermW  ",
+    "TermB  ",
+    "MakeUpW",
+    "MakeUpB",
+    "MakeUp ",
+    "EOL    ",
+};
+#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0')
+#define LOOKUP8(wid,tab,eoflab) do {					\
+    int t;								\
+    NeedBits8(wid,eoflab);						\
+    TabEnt = tab + GetBits(wid);					\
+    printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail,		\
+	   StateNames[TabEnt->State], TabEnt->Param);			\
+    for (t = 0; t < TabEnt->Width; t++)					\
+	DEBUG_SHOW;							\
+    putchar('\n');							\
+    fflush(stdout);							\
+    ClrBits(TabEnt->Width);						\
+} while (0)
+#define LOOKUP16(wid,tab,eoflab) do {					\
+    int t;								\
+    NeedBits16(wid,eoflab);						\
+    TabEnt = tab + GetBits(wid);					\
+    printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail,		\
+	   StateNames[TabEnt->State], TabEnt->Param);			\
+    for (t = 0; t < TabEnt->Width; t++)					\
+	DEBUG_SHOW;							\
+    putchar('\n');							\
+    fflush(stdout);							\
+    ClrBits(TabEnt->Width);						\
+} while (0)
+
+#define SETVAL(x) do {							\
+    *pa++ = RunLength + (x);						\
+    printf("SETVAL: %d\t%d\n", RunLength + (x), a0);			\
+    a0 += x;								\
+    RunLength = 0;							\
+} while (0)
+#else
+#define LOOKUP8(wid,tab,eoflab) do {					\
+    NeedBits8(wid,eoflab);						\
+    TabEnt = tab + GetBits(wid);					\
+    ClrBits(TabEnt->Width);						\
+} while (0)
+#define LOOKUP16(wid,tab,eoflab) do {					\
+    NeedBits16(wid,eoflab);						\
+    TabEnt = tab + GetBits(wid);					\
+    ClrBits(TabEnt->Width);						\
+} while (0)
+
+/*
+ * Append a run to the run length array for the
+ * current row and reset decoding state.
+ */
+#define SETVAL(x) do {							\
+    *pa++ = RunLength + (x);						\
+    a0 += (x);								\
+    RunLength = 0;							\
+} while (0)
+#endif
+
+/*
+ * Synchronize input decoding at the start of each
+ * row by scanning for an EOL (if appropriate) and
+ * skipping any trash data that might be present
+ * after a decoding error.  Note that the decoding
+ * done elsewhere that recognizes an EOL only consumes
+ * 11 consecutive zero bits.  This means that if EOLcnt
+ * is non-zero then we still need to scan for the final flag
+ * bit that is part of the EOL code.
+ */
+#define	SYNC_EOL(eoflab) do {						\
+    if (EOLcnt == 0) {							\
+	for (;;) {							\
+	    NeedBits16(11,eoflab);					\
+	    if (GetBits(11) == 0)					\
+		break;							\
+	    ClrBits(1);							\
+	}								\
+    }									\
+    for (;;) {								\
+	NeedBits8(8,eoflab);						\
+	if (GetBits(8))							\
+	    break;							\
+	ClrBits(8);							\
+    }									\
+    while (GetBits(1) == 0)						\
+	ClrBits(1);							\
+    ClrBits(1);				/* EOL bit */			\
+    EOLcnt = 0;				/* reset EOL counter/flag */	\
+} while (0)
+
+/*
+ * Cleanup the array of runs after decoding a row.
+ * We adjust final runs to insure the user buffer is not
+ * overwritten and/or undecoded area is white filled.
+ */
+#define	CLEANUP_RUNS() do {						\
+    if (RunLength)							\
+	SETVAL(0);							\
+    if (a0 != lastx) {							\
+	badlength(a0, lastx);						\
+	while (a0 > lastx && pa > thisrun)				\
+	    a0 -= *--pa;						\
+	if (a0 < lastx) {						\
+	    if (a0 < 0)							\
+		a0 = 0;							\
+	    if ((pa-thisrun)&1)						\
+		SETVAL(0);						\
+	    SETVAL(lastx - a0);						\
+	} else if (a0 > lastx) {					\
+	    SETVAL(lastx);						\
+	    SETVAL(0);							\
+	}								\
+    }									\
+} while (0)
+
+/*
+ * Decode a line of 1D-encoded data.
+ *
+ * The line expanders are written as macros so that they can be reused
+ * but still have direct access to the local variables of the "calling"
+ * function.
+ *
+ * Note that unlike the original version we have to explicitly test for
+ * a0 >= lastx after each black/white run is decoded.  This is because
+ * the original code depended on the input data being zero-padded to
+ * insure the decoder recognized an EOL before running out of data.
+ */
+#define EXPAND1D(eoflab) do {						\
+    for (;;) {								\
+	for (;;) {							\
+	    LOOKUP16(12, TIFFFaxWhiteTable, eof1d);			\
+	    switch (TabEnt->State) {					\
+	    case S_EOL:							\
+		EOLcnt = 1;						\
+		goto done1d;						\
+	    case S_TermW:						\
+		SETVAL(TabEnt->Param);					\
+		goto doneWhite1d;					\
+	    case S_MakeUpW:						\
+	    case S_MakeUp:						\
+		a0 += TabEnt->Param;					\
+		RunLength += TabEnt->Param;				\
+		break;							\
+	    default:							\
+		unexpected("WhiteTable", a0);				\
+		goto done1d;						\
+	    }								\
+	}								\
+    doneWhite1d:							\
+	if (a0 >= lastx)						\
+	    goto done1d;						\
+	for (;;) {							\
+	    LOOKUP16(13, TIFFFaxBlackTable, eof1d);			\
+	    switch (TabEnt->State) {					\
+	    case S_EOL:							\
+		EOLcnt = 1;						\
+		goto done1d;						\
+	    case S_TermB:						\
+		SETVAL(TabEnt->Param);					\
+		goto doneBlack1d;					\
+	    case S_MakeUpB:						\
+	    case S_MakeUp:						\
+		a0 += TabEnt->Param;					\
+		RunLength += TabEnt->Param;				\
+		break;							\
+	    default:							\
+		unexpected("BlackTable", a0);				\
+		goto done1d;						\
+	    }								\
+	}								\
+    doneBlack1d:							\
+	if (a0 >= lastx)						\
+	    goto done1d;						\
+        if( *(pa-1) == 0 && *(pa-2) == 0 )				\
+            pa -= 2;                                                    \
+    }									\
+eof1d:									\
+    prematureEOF(a0);							\
+    CLEANUP_RUNS();							\
+    goto eoflab;							\
+done1d:									\
+    CLEANUP_RUNS();							\
+} while (0)
+
+/*
+ * Update the value of b1 using the array
+ * of runs for the reference line.
+ */
+#define CHECK_b1 do {							\
+    if (pa != thisrun) while (b1 <= a0 && b1 < lastx) {			\
+	b1 += pb[0] + pb[1];						\
+	pb += 2;							\
+    }									\
+} while (0)
+
+/*
+ * Expand a row of 2D-encoded data.
+ */
+#define EXPAND2D(eoflab) do {						\
+    while (a0 < lastx) {						\
+	LOOKUP8(7, TIFFFaxMainTable, eof2d);				\
+	switch (TabEnt->State) {					\
+	case S_Pass:							\
+	    CHECK_b1;							\
+	    b1 += *pb++;						\
+	    RunLength += b1 - a0;					\
+	    a0 = b1;							\
+	    b1 += *pb++;						\
+	    break;							\
+	case S_Horiz:							\
+	    if ((pa-thisrun)&1) {					\
+		for (;;) {	/* black first */			\
+		    LOOKUP16(13, TIFFFaxBlackTable, eof2d);		\
+		    switch (TabEnt->State) {				\
+		    case S_TermB:					\
+			SETVAL(TabEnt->Param);				\
+			goto doneWhite2da;				\
+		    case S_MakeUpB:					\
+		    case S_MakeUp:					\
+			a0 += TabEnt->Param;				\
+			RunLength += TabEnt->Param;			\
+			break;						\
+		    default:						\
+			goto badBlack2d;				\
+		    }							\
+		}							\
+	    doneWhite2da:;						\
+		for (;;) {	/* then white */			\
+		    LOOKUP16(12, TIFFFaxWhiteTable, eof2d);		\
+		    switch (TabEnt->State) {				\
+		    case S_TermW:					\
+			SETVAL(TabEnt->Param);				\
+			goto doneBlack2da;				\
+		    case S_MakeUpW:					\
+		    case S_MakeUp:					\
+			a0 += TabEnt->Param;				\
+			RunLength += TabEnt->Param;			\
+			break;						\
+		    default:						\
+			goto badWhite2d;				\
+		    }							\
+		}							\
+	    doneBlack2da:;						\
+	    } else {							\
+		for (;;) {	/* white first */			\
+		    LOOKUP16(12, TIFFFaxWhiteTable, eof2d);		\
+		    switch (TabEnt->State) {				\
+		    case S_TermW:					\
+			SETVAL(TabEnt->Param);				\
+			goto doneWhite2db;				\
+		    case S_MakeUpW:					\
+		    case S_MakeUp:					\
+			a0 += TabEnt->Param;				\
+			RunLength += TabEnt->Param;			\
+			break;						\
+		    default:						\
+			goto badWhite2d;				\
+		    }							\
+		}							\
+	    doneWhite2db:;						\
+		for (;;) {	/* then black */			\
+		    LOOKUP16(13, TIFFFaxBlackTable, eof2d);		\
+		    switch (TabEnt->State) {				\
+		    case S_TermB:					\
+			SETVAL(TabEnt->Param);				\
+			goto doneBlack2db;				\
+		    case S_MakeUpB:					\
+		    case S_MakeUp:					\
+			a0 += TabEnt->Param;				\
+			RunLength += TabEnt->Param;			\
+			break;						\
+		    default:						\
+			goto badBlack2d;				\
+		    }							\
+		}							\
+	    doneBlack2db:;						\
+	    }								\
+	    CHECK_b1;							\
+	    break;							\
+	case S_V0:							\
+	    CHECK_b1;							\
+	    SETVAL(b1 - a0);						\
+	    b1 += *pb++;						\
+	    break;							\
+	case S_VR:							\
+	    CHECK_b1;							\
+	    SETVAL(b1 - a0 + TabEnt->Param);				\
+	    b1 += *pb++;						\
+	    break;							\
+	case S_VL:							\
+	    CHECK_b1;							\
+	    SETVAL(b1 - a0 - TabEnt->Param);				\
+	    b1 -= *--pb;						\
+	    break;							\
+	case S_Ext:							\
+	    *pa++ = lastx - a0;						\
+	    extension(a0);						\
+	    goto eol2d;							\
+	case S_EOL:							\
+	    *pa++ = lastx - a0;						\
+	    NeedBits8(4,eof2d);						\
+	    if (GetBits(4))						\
+		unexpected("EOL", a0);					\
+            ClrBits(4);                                                 \
+	    EOLcnt = 1;							\
+	    goto eol2d;							\
+	default:							\
+	badMain2d:							\
+	    unexpected("MainTable", a0);				\
+	    goto eol2d;							\
+	badBlack2d:							\
+	    unexpected("BlackTable", a0);				\
+	    goto eol2d;							\
+	badWhite2d:							\
+	    unexpected("WhiteTable", a0);				\
+	    goto eol2d;							\
+	eof2d:								\
+	    prematureEOF(a0);						\
+	    CLEANUP_RUNS();						\
+	    goto eoflab;						\
+	}								\
+    }									\
+    if (RunLength) {							\
+	if (RunLength + a0 < lastx) {					\
+	    /* expect a final V0 */					\
+	    NeedBits8(1,eof2d);						\
+	    if (!GetBits(1))						\
+		goto badMain2d;						\
+	    ClrBits(1);							\
+	}								\
+	SETVAL(0);							\
+    }									\
+eol2d:									\
+    CLEANUP_RUNS();							\
+} while (0)
+#endif /* _FAX3_ */
diff --git a/src/tiff/tif_flush.c b/src/tiff/tif_flush.c
new file mode 100644
index 0000000..a89b096
--- /dev/null
+++ b/src/tiff/tif_flush.c
@@ -0,0 +1,67 @@
+/* $Header: /home/terralib/src/tiff/tif_flush.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+int
+TIFFFlush(TIFF* tif)
+{
+
+	if (tif->tif_mode != O_RDONLY) {
+		if (!TIFFFlushData(tif))
+			return (0);
+		if ((tif->tif_flags & TIFF_DIRTYDIRECT) &&
+		    !TIFFWriteDirectory(tif))
+			return (0);
+	}
+	return (1);
+}
+
+/*
+ * Flush buffered data to the file.
+ *
+ * Frank Warmerdam'2000: I modified this to return 1 if TIFF_BEENWRITING
+ * is not set, so that TIFFFlush() will proceed to write out the directory.
+ * The documentation says returning 1 is an error indicator, but not having
+ * been writing isn't exactly a an error.  Hopefully this doesn't cause
+ * problems for other people. 
+ */
+int
+TIFFFlushData(TIFF* tif)
+{
+	if ((tif->tif_flags & TIFF_BEENWRITING) == 0)
+		return (0);
+	if (tif->tif_flags & TIFF_POSTENCODE) {
+		tif->tif_flags &= ~TIFF_POSTENCODE;
+		if (!(*tif->tif_postencode)(tif))
+			return (0);
+	}
+	return (TIFFFlushData1(tif));
+}
+
diff --git a/src/tiff/tif_getimage.c b/src/tiff/tif_getimage.c
new file mode 100644
index 0000000..5abfd60
--- /dev/null
+++ b/src/tiff/tif_getimage.c
@@ -0,0 +1,2584 @@
+/* $Header: /home/terralib/src/tiff/tif_getimage.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library
+ *
+ * Read and return a packed RGBA image.
+ */
+#include "tiffiop.h"
+#include <assert.h>
+#include <stdio.h>
+
+static	int gtTileContig(TIFFRGBAImage*, uint32*, uint32, uint32);
+static	int gtTileSeparate(TIFFRGBAImage*, uint32*, uint32, uint32);
+static	int gtStripContig(TIFFRGBAImage*, uint32*, uint32, uint32);
+static	int gtStripSeparate(TIFFRGBAImage*, uint32*, uint32, uint32);
+static	int pickTileContigCase(TIFFRGBAImage*);
+static	int pickTileSeparateCase(TIFFRGBAImage*);
+
+static	const char photoTag[] = "PhotometricInterpretation";
+
+/* 
+ * Helper constants used in Orientation tag handling
+ */
+#define FLIP_VERTICALLY 0x01
+#define FLIP_HORIZONTALLY 0x02
+
+/*
+ * Color conversion constants. We will define display types here.
+ */
+
+TIFFDisplay display_sRGB = {
+	{			/* XYZ -> luminance matrix */
+		{  3.2410F, -1.5374F, -0.4986F },
+		{  -0.9692F, 1.8760F, 0.0416F },
+		{  0.0556F, -0.2040F, 1.0570F }
+	},	
+	100.0F, 100.0F, 100.0F,	/* Light o/p for reference white */
+	255, 255, 255,		/* Pixel values for ref. white */
+	1.0F, 1.0F, 1.0F,	/* Residual light o/p for black pixel */
+	2.4F, 2.4F, 2.4F,	/* Gamma values for the three guns */
+};
+
+/*
+ * Check the image to see if TIFFReadRGBAImage can deal with it.
+ * 1/0 is returned according to whether or not the image can
+ * be handled.  If 0 is returned, emsg contains the reason
+ * why it is being rejected.
+ */
+int
+TIFFRGBAImageOK(TIFF* tif, char emsg[1024])
+{
+    TIFFDirectory* td = &tif->tif_dir;
+    uint16 photometric;
+    int colorchannels;
+
+    if (!tif->tif_decodestatus) {
+	sprintf(emsg, "Sorry, requested compression method is not configured");
+	return (0);
+    }
+    switch (td->td_bitspersample) {
+    case 1: case 2: case 4:
+    case 8: case 16:
+	break;
+    default:
+	sprintf(emsg, "Sorry, can not handle images with %d-bit samples",
+	    td->td_bitspersample);
+	return (0);
+    }
+    colorchannels = td->td_samplesperpixel - td->td_extrasamples;
+    if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &photometric)) {
+	switch (colorchannels) {
+	case 1:
+	    photometric = PHOTOMETRIC_MINISBLACK;
+	    break;
+	case 3:
+	    photometric = PHOTOMETRIC_RGB;
+	    break;
+	default:
+	    sprintf(emsg, "Missing needed %s tag", photoTag);
+	    return (0);
+	}
+    }
+    switch (photometric) {
+    case PHOTOMETRIC_MINISWHITE:
+    case PHOTOMETRIC_MINISBLACK:
+    case PHOTOMETRIC_PALETTE:
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG 
+            && td->td_samplesperpixel != 1
+            && td->td_bitspersample < 8 ) {
+	    sprintf(emsg,
+                    "Sorry, can not handle contiguous data with %s=%d, "
+                    "and %s=%d and Bits/Sample=%d",
+                    photoTag, photometric,
+                    "Samples/pixel", td->td_samplesperpixel,
+                    td->td_bitspersample);
+	    return (0);
+	}
+        /*
+        ** We should likely validate that any extra samples are either
+        ** to be ignored, or are alpha, and if alpha we should try to use
+        ** them.  But for now we won't bother with this. 
+        */
+	break;
+    case PHOTOMETRIC_YCBCR:
+	if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
+	    sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d",
+		"Planarconfiguration", td->td_planarconfig);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_RGB: 
+	if (colorchannels < 3) {
+	    sprintf(emsg, "Sorry, can not handle RGB image with %s=%d",
+		"Color channels", colorchannels);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_SEPARATED:
+	if (td->td_inkset != INKSET_CMYK) {
+	    sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+		"InkSet", td->td_inkset);
+	    return (0);
+	}
+	if (td->td_samplesperpixel < 4) {
+	    sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+		"Samples/pixel", td->td_samplesperpixel);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_LOGL:
+	if (td->td_compression != COMPRESSION_SGILOG) {
+	    sprintf(emsg, "Sorry, LogL data must have %s=%d",
+		"Compression", COMPRESSION_SGILOG);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_LOGLUV:
+	if (td->td_compression != COMPRESSION_SGILOG &&
+		td->td_compression != COMPRESSION_SGILOG24) {
+	    sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d",
+		"Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24);
+	    return (0);
+	}
+	if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
+	    sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d",
+		"Planarconfiguration", td->td_planarconfig);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_CIELAB:
+	break;
+    default:
+	sprintf(emsg, "Sorry, can not handle image with %s=%d",
+	    photoTag, photometric);
+	return (0);
+    }
+    return (1);
+}
+
+void
+TIFFRGBAImageEnd(TIFFRGBAImage* img)
+{
+	if (img->Map)
+		_TIFFfree(img->Map), img->Map = NULL;
+	if (img->BWmap)
+		_TIFFfree(img->BWmap), img->BWmap = NULL;
+	if (img->PALmap)
+		_TIFFfree(img->PALmap), img->PALmap = NULL;
+	if (img->ycbcr)
+		_TIFFfree(img->ycbcr), img->ycbcr = NULL;
+	if (img->cielab)
+		_TIFFfree(img->cielab), img->cielab = NULL;
+
+	if( img->redcmap ) {
+		_TIFFfree( img->redcmap );
+		_TIFFfree( img->greencmap );
+		_TIFFfree( img->bluecmap );
+	}
+}
+
+static int
+isCCITTCompression(TIFF* tif)
+{
+    uint16 compress;
+    TIFFGetField(tif, TIFFTAG_COMPRESSION, &compress);
+    return (compress == COMPRESSION_CCITTFAX3 ||
+	    compress == COMPRESSION_CCITTFAX4 ||
+	    compress == COMPRESSION_CCITTRLE ||
+	    compress == COMPRESSION_CCITTRLEW);
+}
+
+int
+TIFFRGBAImageBegin(TIFFRGBAImage* img, TIFF* tif, int stop, char emsg[1024])
+{
+    uint16* sampleinfo;
+    uint16 extrasamples;
+    uint16 planarconfig;
+    uint16 compress;
+    int colorchannels;
+    uint16	*red_orig, *green_orig, *blue_orig;
+    int		n_color;
+
+    /* Initialize to normal values */
+    img->row_offset = 0;
+    img->col_offset = 0;
+    img->redcmap = NULL;
+    img->greencmap = NULL;
+    img->bluecmap = NULL;
+    img->req_orientation = ORIENTATION_BOTLEFT;	    /* It is the default */
+    
+    img->tif = tif;
+    img->stoponerr = stop;
+    TIFFGetFieldDefaulted(tif, TIFFTAG_BITSPERSAMPLE, &img->bitspersample);
+    switch (img->bitspersample) {
+    case 1: case 2: case 4:
+    case 8: case 16:
+	break;
+    default:
+	sprintf(emsg, "Sorry, can not handle images with %d-bit samples",
+	    img->bitspersample);
+	return (0);
+    }
+    img->alpha = 0;
+    TIFFGetFieldDefaulted(tif, TIFFTAG_SAMPLESPERPIXEL, &img->samplesperpixel);
+    TIFFGetFieldDefaulted(tif, TIFFTAG_EXTRASAMPLES,
+	&extrasamples, &sampleinfo);
+    if (extrasamples == 1)
+    {
+	switch (sampleinfo[0]) {
+	case EXTRASAMPLE_UNSPECIFIED:	/* Workaround for some images without */
+		if (img->samplesperpixel == 4)	/* correct info about alpha channel */
+			img->alpha = EXTRASAMPLE_ASSOCALPHA;
+		break;
+	case EXTRASAMPLE_ASSOCALPHA:	/* data is pre-multiplied */
+	case EXTRASAMPLE_UNASSALPHA:	/* data is not pre-multiplied */
+		img->alpha = sampleinfo[0];
+		break;
+	}
+    }
+
+#if DEFAULT_EXTRASAMPLE_AS_ALPHA == 1
+    if( !TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric))
+        img->photometric = PHOTOMETRIC_MINISWHITE;
+
+    if( extrasamples == 0 
+        && img->samplesperpixel == 4 
+        && img->photometric == PHOTOMETRIC_RGB )
+    {
+        img->alpha = EXTRASAMPLE_ASSOCALPHA;
+        extrasamples = 1;
+    }
+#endif
+
+    colorchannels = img->samplesperpixel - extrasamples;
+    TIFFGetFieldDefaulted(tif, TIFFTAG_COMPRESSION, &compress);
+    TIFFGetFieldDefaulted(tif, TIFFTAG_PLANARCONFIG, &planarconfig);
+    if (!TIFFGetField(tif, TIFFTAG_PHOTOMETRIC, &img->photometric)) {
+	switch (colorchannels) {
+	case 1:
+	    if (isCCITTCompression(tif))
+		img->photometric = PHOTOMETRIC_MINISWHITE;
+	    else
+		img->photometric = PHOTOMETRIC_MINISBLACK;
+	    break;
+	case 3:
+	    img->photometric = PHOTOMETRIC_RGB;
+	    break;
+	default:
+	    sprintf(emsg, "Missing needed %s tag", photoTag);
+	    return (0);
+	}
+    }
+    switch (img->photometric) {
+    case PHOTOMETRIC_PALETTE:
+	if (!TIFFGetField(tif, TIFFTAG_COLORMAP,
+	    &red_orig, &green_orig, &blue_orig)) {
+	    TIFFError(TIFFFileName(tif), "Missing required \"Colormap\" tag");
+	    return (0);
+	}
+
+        /* copy the colormaps so we can modify them */
+        n_color = (1L << img->bitspersample);
+        img->redcmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
+        img->greencmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
+        img->bluecmap = (uint16 *) _TIFFmalloc(sizeof(uint16)*n_color);
+        if( !img->redcmap || !img->greencmap || !img->bluecmap ) {
+	    TIFFError(TIFFFileName(tif), "Out of memory for colormap copy");
+	    return (0);
+        }
+
+        memcpy( img->redcmap, red_orig, n_color * 2 );
+        memcpy( img->greencmap, green_orig, n_color * 2 );
+        memcpy( img->bluecmap, blue_orig, n_color * 2 );
+        
+	/* fall thru... */
+    case PHOTOMETRIC_MINISWHITE:
+    case PHOTOMETRIC_MINISBLACK:
+	if (planarconfig == PLANARCONFIG_CONTIG 
+            && img->samplesperpixel != 1
+            && img->bitspersample < 8 ) {
+	    sprintf(emsg,
+                    "Sorry, can not handle contiguous data with %s=%d, "
+                    "and %s=%d and Bits/Sample=%d",
+                    photoTag, img->photometric,
+                    "Samples/pixel", img->samplesperpixel,
+                    img->bitspersample);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_YCBCR:
+	if (planarconfig != PLANARCONFIG_CONTIG) {
+	    sprintf(emsg, "Sorry, can not handle YCbCr images with %s=%d",
+		"Planarconfiguration", planarconfig);
+	    return (0);
+	}
+	/* It would probably be nice to have a reality check here. */
+	if (planarconfig == PLANARCONFIG_CONTIG)
+	    /* can rely on libjpeg to convert to RGB */
+	    /* XXX should restore current state on exit */
+	    switch (compress) {
+		case COMPRESSION_OJPEG:
+		case COMPRESSION_JPEG:
+		    TIFFSetField(tif, TIFFTAG_JPEGCOLORMODE, JPEGCOLORMODE_RGB);
+		    img->photometric = PHOTOMETRIC_RGB;
+                    break;
+
+                default:
+                    /* do nothing */;
+                    break;
+	    }
+	break;
+    case PHOTOMETRIC_RGB: 
+	if (colorchannels < 3) {
+	    sprintf(emsg, "Sorry, can not handle RGB image with %s=%d",
+		"Color channels", colorchannels);
+	    return (0);
+	}
+	break;
+    case PHOTOMETRIC_SEPARATED: {
+	uint16 inkset;
+	TIFFGetFieldDefaulted(tif, TIFFTAG_INKSET, &inkset);
+	if (inkset != INKSET_CMYK) {
+	    sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+		"InkSet", inkset);
+	    return (0);
+	}
+	if (img->samplesperpixel < 4) {
+	    sprintf(emsg, "Sorry, can not handle separated image with %s=%d",
+		"Samples/pixel", img->samplesperpixel);
+	    return (0);
+	}
+	break;
+    }
+    case PHOTOMETRIC_LOGL:
+	if (compress != COMPRESSION_SGILOG) {
+	    sprintf(emsg, "Sorry, LogL data must have %s=%d",
+		"Compression", COMPRESSION_SGILOG);
+	    return (0);
+	}
+	TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
+	img->photometric = PHOTOMETRIC_MINISBLACK;	/* little white lie */
+	img->bitspersample = 8;
+	break;
+    case PHOTOMETRIC_LOGLUV:
+	if (compress != COMPRESSION_SGILOG && compress != COMPRESSION_SGILOG24) {
+	    sprintf(emsg, "Sorry, LogLuv data must have %s=%d or %d",
+		"Compression", COMPRESSION_SGILOG, COMPRESSION_SGILOG24);
+	    return (0);
+	}
+	if (planarconfig != PLANARCONFIG_CONTIG) {
+	    sprintf(emsg, "Sorry, can not handle LogLuv images with %s=%d",
+		"Planarconfiguration", planarconfig);
+	    return (0);
+	}
+	TIFFSetField(tif, TIFFTAG_SGILOGDATAFMT, SGILOGDATAFMT_8BIT);
+	img->photometric = PHOTOMETRIC_RGB;		/* little white lie */
+	img->bitspersample = 8;
+	break;
+    case PHOTOMETRIC_CIELAB:
+	break;
+    default:
+	sprintf(emsg, "Sorry, can not handle image with %s=%d",
+	    photoTag, img->photometric);
+	return (0);
+    }
+    img->Map = NULL;
+    img->BWmap = NULL;
+    img->PALmap = NULL;
+    img->ycbcr = NULL;
+    img->cielab = NULL;
+    TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &img->width);
+    TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &img->height);
+    TIFFGetFieldDefaulted(tif, TIFFTAG_ORIENTATION, &img->orientation);
+    img->isContig =
+	!(planarconfig == PLANARCONFIG_SEPARATE && colorchannels > 1);
+    if (img->isContig) {
+	img->get = TIFFIsTiled(tif) ? gtTileContig : gtStripContig;
+	return pickTileContigCase(img);
+    } else {
+	img->get = TIFFIsTiled(tif) ? gtTileSeparate : gtStripSeparate;
+	return pickTileSeparateCase(img);
+    }
+}
+
+int
+TIFFRGBAImageGet(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+    if (img->get == NULL) {
+	TIFFError(TIFFFileName(img->tif), "No \"get\" routine setup");
+	return (0);
+    }
+    if (img->put.any == NULL) {
+	TIFFError(TIFFFileName(img->tif),
+	    "No \"put\" routine setupl; probably can not handle image format");
+	return (0);
+    }
+    return (*img->get)(img, raster, w, h);
+}
+
+/*
+ * Read the specified image into an ABGR-format rastertaking in account
+ * specified orientation.
+ */
+int
+TIFFReadRGBAImageOriented(TIFF* tif,
+			  uint32 rwidth, uint32 rheight, uint32* raster,
+			  int orientation, int stop)
+{
+    char emsg[1024];
+    TIFFRGBAImage img;
+    int ok;
+
+    if (TIFFRGBAImageOK(tif, emsg) &&
+	TIFFRGBAImageBegin(&img, tif, stop, emsg)) {
+	img.req_orientation = orientation;
+	/* XXX verify rwidth and rheight against width and height */
+	ok = TIFFRGBAImageGet(&img, raster+(rheight-img.height)*rwidth,
+	    rwidth, img.height);
+	TIFFRGBAImageEnd(&img);
+    } else {
+	TIFFError(TIFFFileName(tif), emsg);
+	ok = 0;
+    }
+    return (ok);
+}
+
+/*
+ * Read the specified image into an ABGR-format raster. Use bottom left
+ * origin for raster by default.
+ */
+int
+TIFFReadRGBAImage(TIFF* tif,
+		  uint32 rwidth, uint32 rheight, uint32* raster, int stop)
+{
+	return TIFFReadRGBAImageOriented(tif, rwidth, rheight, raster,
+					 ORIENTATION_BOTLEFT, stop);
+}
+
+static int 
+setorientation(TIFFRGBAImage* img)
+{
+	switch (img->orientation) {
+		case ORIENTATION_TOPLEFT:
+		case ORIENTATION_LEFTTOP:
+			if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+			    img->req_orientation == ORIENTATION_RIGHTTOP)
+				return FLIP_HORIZONTALLY;
+			else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+			    img->req_orientation == ORIENTATION_RIGHTBOT)
+				return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+			else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+			    img->req_orientation == ORIENTATION_LEFTBOT)
+				return FLIP_VERTICALLY;
+			else
+				return 0;
+		case ORIENTATION_TOPRIGHT:
+		case ORIENTATION_RIGHTTOP:
+			if (img->req_orientation == ORIENTATION_TOPLEFT ||
+			    img->req_orientation == ORIENTATION_LEFTTOP)
+				return FLIP_HORIZONTALLY;
+			else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+			    img->req_orientation == ORIENTATION_RIGHTBOT)
+				return FLIP_VERTICALLY;
+			else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+			    img->req_orientation == ORIENTATION_LEFTBOT)
+				return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+			else
+				return 0;
+		case ORIENTATION_BOTRIGHT:
+		case ORIENTATION_RIGHTBOT:
+			if (img->req_orientation == ORIENTATION_TOPLEFT ||
+			    img->req_orientation == ORIENTATION_LEFTTOP)
+				return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+			else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+			    img->req_orientation == ORIENTATION_RIGHTTOP)
+				return FLIP_VERTICALLY;
+			else if (img->req_orientation == ORIENTATION_BOTLEFT ||
+			    img->req_orientation == ORIENTATION_LEFTBOT)
+				return FLIP_HORIZONTALLY;
+			else
+				return 0;
+		case ORIENTATION_BOTLEFT:
+		case ORIENTATION_LEFTBOT:
+			if (img->req_orientation == ORIENTATION_TOPLEFT ||
+			    img->req_orientation == ORIENTATION_LEFTTOP)
+				return FLIP_VERTICALLY;
+			else if (img->req_orientation == ORIENTATION_TOPRIGHT ||
+			    img->req_orientation == ORIENTATION_RIGHTTOP)
+				return FLIP_HORIZONTALLY | FLIP_VERTICALLY;
+			else if (img->req_orientation == ORIENTATION_BOTRIGHT ||
+			    img->req_orientation == ORIENTATION_RIGHTBOT)
+				return FLIP_HORIZONTALLY;
+			else
+				return 0;
+		default:	/* NOTREACHED */
+			return 0;
+	}
+}
+
+/*
+ * Get an tile-organized image that has
+ *	PlanarConfiguration contiguous if SamplesPerPixel > 1
+ * or
+ *	SamplesPerPixel == 1
+ */	
+static int
+gtTileContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+    TIFF* tif = img->tif;
+    tileContigRoutine put = img->put.contig;
+    uint32 col, row, y, rowstoread;
+    uint32 pos;
+    uint32 tw, th;
+    u_char* buf;
+    int32 fromskew, toskew;
+    uint32 nrow;
+    int ret = 1, flip;
+
+    buf = (u_char*) _TIFFmalloc(TIFFTileSize(tif));
+    if (buf == 0) {
+	TIFFError(TIFFFileName(tif), "No space for tile buffer");
+	return (0);
+    }
+    TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
+    TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
+
+    flip = setorientation(img);
+    if (flip & FLIP_VERTICALLY) {
+	    y = h - 1;
+	    toskew = -(int32)(tw + w);
+    }
+    else {
+	    y = 0;
+	    toskew = -(int32)(tw - w);
+    }
+     
+    for (row = 0; row < h; row += nrow)
+    {
+        rowstoread = th - (row + img->row_offset) % th;
+    	nrow = (row + rowstoread > h ? h - row : rowstoread);
+	for (col = 0; col < w; col += tw) 
+        {
+            if (TIFFReadTile(tif, buf, col+img->col_offset,
+                             row+img->row_offset, 0, 0) < 0 && img->stoponerr)
+            {
+                ret = 0;
+                break;
+            }
+	    
+            pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif);
+
+    	    if (col + tw > w) 
+            {
+                /*
+                 * Tile is clipped horizontally.  Calculate
+                 * visible portion and skewing factors.
+                 */
+                uint32 npix = w - col;
+                fromskew = tw - npix;
+                (*put)(img, raster+y*w+col, col, y,
+                       npix, nrow, fromskew, toskew + fromskew, buf + pos);
+            }
+            else 
+            {
+                (*put)(img, raster+y*w+col, col, y, tw, nrow, 0, toskew, buf + pos);
+            }
+        }
+
+        y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
+    }
+    _TIFFfree(buf);
+
+    if (flip & FLIP_HORIZONTALLY) {
+	    uint32 line;
+
+	    for (line = 0; line < h; line++) {
+		    uint32 *left = raster + (line * w);
+		    uint32 *right = left + w - 1;
+		    
+		    while ( left < right ) {
+			    uint32 temp = *left;
+			    *left = *right;
+			    *right = temp;
+			    left++, right--;
+		    }
+	    }
+    }
+
+    return (ret);
+}
+
+/*
+ * Get an tile-organized image that has
+ *	 SamplesPerPixel > 1
+ *	 PlanarConfiguration separated
+ * We assume that all such images are RGB.
+ */	
+static int
+gtTileSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+    TIFF* tif = img->tif;
+    tileSeparateRoutine put = img->put.separate;
+    uint32 col, row, y, rowstoread;
+    uint32 pos;
+    uint32 tw, th;
+    u_char* buf;
+    u_char* r;
+    u_char* g;
+    u_char* b;
+    u_char* a;
+    tsize_t tilesize;
+    int32 fromskew, toskew;
+    int alpha = img->alpha;
+    uint32 nrow;
+    int ret = 1, flip;
+
+    tilesize = TIFFTileSize(tif);
+    buf = (u_char*) _TIFFmalloc(4*tilesize);
+    if (buf == 0) {
+	TIFFError(TIFFFileName(tif), "No space for tile buffer");
+	return (0);
+    }
+    r = buf;
+    g = r + tilesize;
+    b = g + tilesize;
+    a = b + tilesize;
+    if (!alpha)
+	memset(a, 0xff, tilesize);
+    TIFFGetField(tif, TIFFTAG_TILEWIDTH, &tw);
+    TIFFGetField(tif, TIFFTAG_TILELENGTH, &th);
+
+    flip = setorientation(img);
+    if (flip & FLIP_VERTICALLY) {
+	    y = h - 1;
+	    toskew = -(int32)(tw + w);
+    }
+    else {
+	    y = 0;
+	    toskew = -(int32)(tw - w);
+    }
+
+    for (row = 0; row < h; row += nrow) 
+    {
+        rowstoread = th - (row + img->row_offset) % th;
+    	nrow = (row + rowstoread > h ? h - row : rowstoread);
+        for (col = 0; col < w; col += tw) 
+        {
+            if (TIFFReadTile(tif, r, col+img->col_offset,
+                             row+img->row_offset,0,0) < 0 && img->stoponerr)
+            {
+                ret = 0;
+                break;
+            }
+            if (TIFFReadTile(tif, g, col+img->col_offset,
+                             row+img->row_offset,0,1) < 0 && img->stoponerr)
+            {
+                ret = 0;
+                break;
+            }
+            if (TIFFReadTile(tif, b, col+img->col_offset,
+                             row+img->row_offset,0,2) < 0 && img->stoponerr)
+            {
+                ret = 0;
+                break;
+            }
+            if (alpha && TIFFReadTile(tif,a,col+img->col_offset,
+                                      row+img->row_offset,0,3) < 0 && img->stoponerr)
+            {
+                ret = 0;
+                break;
+            }
+
+            pos = ((row+img->row_offset) % th) * TIFFTileRowSize(tif);
+
+            if (col + tw > w) 
+            {
+                /*
+                 * Tile is clipped horizontally.  Calculate
+                 * visible portion and skewing factors.
+                 */
+                uint32 npix = w - col;
+                fromskew = tw - npix;
+                (*put)(img, raster+y*w+col, col, y,
+                       npix, nrow, fromskew, toskew + fromskew, 
+                       r + pos, g + pos, b + pos, a + pos);
+            } 
+            else 
+            {
+                (*put)(img, raster+y*w+col, col, y,
+                       tw, nrow, 0, toskew, r + pos, g + pos, b + pos, a + pos);
+            }
+        }
+
+        y += (flip & FLIP_VERTICALLY ?-(int32) nrow : (int32) nrow);
+    }
+
+    if (flip & FLIP_HORIZONTALLY) {
+	    uint32 line;
+
+	    for (line = 0; line < h; line++) {
+		    uint32 *left = raster + (line * w);
+		    uint32 *right = left + w - 1;
+		    
+		    while ( left < right ) {
+			    uint32 temp = *left;
+			    *left = *right;
+			    *right = temp;
+			    left++, right--;
+		    }
+	    }
+    }
+
+    _TIFFfree(buf);
+    return (ret);
+}
+
+/*
+ * Get a strip-organized image that has
+ *	PlanarConfiguration contiguous if SamplesPerPixel > 1
+ * or
+ *	SamplesPerPixel == 1
+ */	
+static int
+gtStripContig(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+    TIFF* tif = img->tif;
+    tileContigRoutine put = img->put.contig;
+    uint32 row, y, nrow, rowstoread;
+    uint32 pos;
+    u_char* buf;
+    uint32 rowsperstrip;
+    uint32 imagewidth = img->width;
+    tsize_t scanline;
+    int32 fromskew, toskew;
+    int ret = 1, flip;
+
+    buf = (u_char*) _TIFFmalloc(TIFFStripSize(tif));
+    if (buf == 0) {
+	TIFFError(TIFFFileName(tif), "No space for strip buffer");
+	return (0);
+    }
+
+    flip = setorientation(img);
+    if (flip & FLIP_VERTICALLY) {
+	    y = h - 1;
+	    toskew = -(int32)(w + w);
+    }
+    else {
+	    y = 0;
+	    toskew = -(int32)(w - w);
+    }
+
+    TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+    scanline = TIFFScanlineSize(tif);
+    fromskew = (w < imagewidth ? imagewidth - w : 0);
+    for (row = 0; row < h; row += nrow) 
+    {
+        rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;
+        nrow = (row + rowstoread > h ? h - row : rowstoread);
+        if (TIFFReadEncodedStrip(tif,
+                                 TIFFComputeStrip(tif,row+img->row_offset, 0),
+                                 buf, 
+                                 ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0
+            && img->stoponerr)
+        {
+            ret = 0;
+            break;
+        }
+
+        pos = ((row + img->row_offset) % rowsperstrip) * scanline;
+        (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, buf + pos);
+        y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
+    }
+
+    if (flip & FLIP_HORIZONTALLY) {
+	    uint32 line;
+
+	    for (line = 0; line < h; line++) {
+		    uint32 *left = raster + (line * w);
+		    uint32 *right = left + w - 1;
+		    
+		    while ( left < right ) {
+			    uint32 temp = *left;
+			    *left = *right;
+			    *right = temp;
+			    left++, right--;
+		    }
+	    }
+    }
+
+    _TIFFfree(buf);
+    return (ret);
+}
+
+/*
+ * Get a strip-organized image with
+ *	 SamplesPerPixel > 1
+ *	 PlanarConfiguration separated
+ * We assume that all such images are RGB.
+ */
+static int
+gtStripSeparate(TIFFRGBAImage* img, uint32* raster, uint32 w, uint32 h)
+{
+    TIFF* tif = img->tif;
+    tileSeparateRoutine put = img->put.separate;
+    u_char *buf;
+    u_char *r, *g, *b, *a;
+    uint32 row, y, nrow, rowstoread;
+    uint32 pos;
+    tsize_t scanline;
+    uint32 rowsperstrip, offset_row;
+    uint32 imagewidth = img->width;
+    tsize_t stripsize;
+    int32 fromskew, toskew;
+    int alpha = img->alpha;
+    int	ret = 1, flip;
+
+    stripsize = TIFFStripSize(tif);
+    r = buf = (u_char *)_TIFFmalloc(4*stripsize);
+    if (buf == 0) {
+	TIFFError(TIFFFileName(tif), "No space for tile buffer");
+	return (0);
+    }
+    g = r + stripsize;
+    b = g + stripsize;
+    a = b + stripsize;
+    if (!alpha)
+	memset(a, 0xff, stripsize);
+
+    flip = setorientation(img);
+    if (flip & FLIP_VERTICALLY) {
+	    y = h - 1;
+	    toskew = -(int32)(w + w);
+    }
+    else {
+	    y = 0;
+	    toskew = -(int32)(w - w);
+    }
+
+    TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+    scanline = TIFFScanlineSize(tif);
+    fromskew = (w < imagewidth ? imagewidth - w : 0);
+    for (row = 0; row < h; row += nrow) 
+    {
+        rowstoread = rowsperstrip - (row + img->row_offset) % rowsperstrip;    	
+        nrow = (row + rowstoread > h ? h - row : rowstoread);
+        offset_row = row + img->row_offset;
+    	if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 0),
+                                 r, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 
+            && img->stoponerr)
+        {
+            ret = 0;
+            break;
+        }
+        if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 1),
+                                 g, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 
+            && img->stoponerr)
+        {
+            ret = 0;
+            break;
+        }
+        if (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 2),
+                                 b, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 
+            && img->stoponerr)
+        {
+            ret = 0;
+            break;
+        }
+        if (alpha &&
+            (TIFFReadEncodedStrip(tif, TIFFComputeStrip(tif, offset_row, 3),
+                                  a, ((row + img->row_offset)%rowsperstrip + nrow) * scanline) < 0 
+             && img->stoponerr))
+        {
+            ret = 0;
+            break;
+        }
+
+        pos = ((row + img->row_offset) % rowsperstrip) * scanline;
+        (*put)(img, raster+y*w, 0, y, w, nrow, fromskew, toskew, r + pos, g + pos, 
+               b + pos, a + pos);
+        y += (flip & FLIP_VERTICALLY ? -(int32) nrow : (int32) nrow);
+    }
+
+    if (flip & FLIP_HORIZONTALLY) {
+	    uint32 line;
+
+	    for (line = 0; line < h; line++) {
+		    uint32 *left = raster + (line * w);
+		    uint32 *right = left + w - 1;
+		    
+		    while ( left < right ) {
+			    uint32 temp = *left;
+			    *left = *right;
+			    *right = temp;
+			    left++, right--;
+		    }
+	    }
+    }
+
+    _TIFFfree(buf);
+    return (ret);
+}
+
+/*
+ * The following routines move decoded data returned
+ * from the TIFF library into rasters filled with packed
+ * ABGR pixels (i.e. suitable for passing to lrecwrite.)
+ *
+ * The routines have been created according to the most
+ * important cases and optimized.  pickTileContigCase and
+ * pickTileSeparateCase analyze the parameters and select
+ * the appropriate "put" routine to use.
+ */
+#define	REPEAT8(op)	REPEAT4(op); REPEAT4(op)
+#define	REPEAT4(op)	REPEAT2(op); REPEAT2(op)
+#define	REPEAT2(op)	op; op
+#define	CASE8(x,op)			\
+    switch (x) {			\
+    case 7: op; case 6: op; case 5: op;	\
+    case 4: op; case 3: op; case 2: op;	\
+    case 1: op;				\
+    }
+#define	CASE4(x,op)	switch (x) { case 3: op; case 2: op; case 1: op; }
+#define	NOP
+
+#define	UNROLL8(w, op1, op2) {		\
+    uint32 _x;				\
+    for (_x = w; _x >= 8; _x -= 8) {	\
+	op1;				\
+	REPEAT8(op2);			\
+    }					\
+    if (_x > 0) {			\
+	op1;				\
+	CASE8(_x,op2);			\
+    }					\
+}
+#define	UNROLL4(w, op1, op2) {		\
+    uint32 _x;				\
+    for (_x = w; _x >= 4; _x -= 4) {	\
+	op1;				\
+	REPEAT4(op2);			\
+    }					\
+    if (_x > 0) {			\
+	op1;				\
+	CASE4(_x,op2);			\
+    }					\
+}
+#define	UNROLL2(w, op1, op2) {		\
+    uint32 _x;				\
+    for (_x = w; _x >= 2; _x -= 2) {	\
+	op1;				\
+	REPEAT2(op2);			\
+    }					\
+    if (_x) {				\
+	op1;				\
+	op2;				\
+    }					\
+}
+    
+#define	SKEW(r,g,b,skew)	{ r += skew; g += skew; b += skew; }
+#define	SKEW4(r,g,b,a,skew)	{ r += skew; g += skew; b += skew; a+= skew; }
+
+#define A1 ((uint32)(0xffL<<24))
+#define	PACK(r,g,b)	\
+	((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|A1)
+#define	PACK4(r,g,b,a)	\
+	((uint32)(r)|((uint32)(g)<<8)|((uint32)(b)<<16)|((uint32)(a)<<24))
+#define W2B(v) (((v)>>8)&0xff)
+#define	PACKW(r,g,b)	\
+	((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|A1)
+#define	PACKW4(r,g,b,a)	\
+	((uint32)W2B(r)|((uint32)W2B(g)<<8)|((uint32)W2B(b)<<16)|((uint32)W2B(a)<<24))
+
+#define	DECLAREContigPutFunc(name) \
+static void name(\
+    TIFFRGBAImage* img, \
+    uint32* cp, \
+    uint32 x, uint32 y, \
+    uint32 w, uint32 h, \
+    int32 fromskew, int32 toskew, \
+    u_char* pp \
+)
+
+/*
+ * 8-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put8bitcmaptile)
+{
+    uint32** PALmap = img->PALmap;
+    int samplesperpixel = img->samplesperpixel;
+
+    (void) y;
+    while (h-- > 0) {
+	for (x = w; x-- > 0;)
+        {
+	    *cp++ = PALmap[*pp][0];
+            pp += samplesperpixel;
+        }
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 4-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put4bitcmaptile)
+{
+    uint32** PALmap = img->PALmap;
+
+    (void) x; (void) y;
+    fromskew /= 2;
+    while (h-- > 0) {
+	uint32* bw;
+	UNROLL2(w, bw = PALmap[*pp++], *cp++ = *bw++);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 2-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put2bitcmaptile)
+{
+    uint32** PALmap = img->PALmap;
+
+    (void) x; (void) y;
+    fromskew /= 4;
+    while (h-- > 0) {
+	uint32* bw;
+	UNROLL4(w, bw = PALmap[*pp++], *cp++ = *bw++);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 1-bit palette => colormap/RGB
+ */
+DECLAREContigPutFunc(put1bitcmaptile)
+{
+    uint32** PALmap = img->PALmap;
+
+    (void) x; (void) y;
+    fromskew /= 8;
+    while (h-- > 0) {
+	uint32* bw;
+	UNROLL8(w, bw = PALmap[*pp++], *cp++ = *bw++);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 8-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(putgreytile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    uint32** BWmap = img->BWmap;
+
+    (void) y;
+    while (h-- > 0) {
+	for (x = w; x-- > 0;)
+        {
+	    *cp++ = BWmap[*pp][0];
+            pp += samplesperpixel;
+        }
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 16-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(put16bitbwtile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    uint32** BWmap = img->BWmap;
+
+    (void) y;
+    while (h-- > 0) {
+        uint16 *wp = (uint16 *) pp;
+
+	for (x = w; x-- > 0;)
+        {
+            /* use high order byte of 16bit value */
+
+	    *cp++ = BWmap[*wp >> 8][0];
+            pp += 2 * samplesperpixel;
+            wp += samplesperpixel;
+        }
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 1-bit bilevel => colormap/RGB
+ */
+DECLAREContigPutFunc(put1bitbwtile)
+{
+    uint32** BWmap = img->BWmap;
+
+    (void) x; (void) y;
+    fromskew /= 8;
+    while (h-- > 0) {
+	uint32* bw;
+	UNROLL8(w, bw = BWmap[*pp++], *cp++ = *bw++);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 2-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(put2bitbwtile)
+{
+    uint32** BWmap = img->BWmap;
+
+    (void) x; (void) y;
+    fromskew /= 4;
+    while (h-- > 0) {
+	uint32* bw;
+	UNROLL4(w, bw = BWmap[*pp++], *cp++ = *bw++);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 4-bit greyscale => colormap/RGB
+ */
+DECLAREContigPutFunc(put4bitbwtile)
+{
+    uint32** BWmap = img->BWmap;
+
+    (void) x; (void) y;
+    fromskew /= 2;
+    while (h-- > 0) {
+	uint32* bw;
+	UNROLL2(w, bw = BWmap[*pp++], *cp++ = *bw++);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 8-bit packed samples, no Map => RGB
+ */
+DECLAREContigPutFunc(putRGBcontig8bittile)
+{
+    int samplesperpixel = img->samplesperpixel;
+
+    (void) x; (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	UNROLL8(w, NOP,
+	    *cp++ = PACK(pp[0], pp[1], pp[2]);
+	    pp += samplesperpixel);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 8-bit packed samples, w/ Map => RGB
+ */
+DECLAREContigPutFunc(putRGBcontig8bitMaptile)
+{
+    TIFFRGBValue* Map = img->Map;
+    int samplesperpixel = img->samplesperpixel;
+
+    (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	for (x = w; x-- > 0;) {
+	    *cp++ = PACK(Map[pp[0]], Map[pp[1]], Map[pp[2]]);
+	    pp += samplesperpixel;
+	}
+	pp += fromskew;
+	cp += toskew;
+    }
+}
+
+/*
+ * 8-bit packed samples => RGBA w/ associated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBAAcontig8bittile)
+{
+    int samplesperpixel = img->samplesperpixel;
+
+    (void) x; (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	UNROLL8(w, NOP,
+	    *cp++ = PACK4(pp[0], pp[1], pp[2], pp[3]);
+	    pp += samplesperpixel);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 8-bit packed samples => RGBA w/ unassociated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBUAcontig8bittile)
+{
+    int samplesperpixel = img->samplesperpixel;
+
+    (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	uint32 r, g, b, a;
+	for (x = w; x-- > 0;) {
+	    a = pp[3];
+	    r = (pp[0] * a) / 255;
+	    g = (pp[1] * a) / 255;
+	    b = (pp[2] * a) / 255;
+	    *cp++ = PACK4(r,g,b,a);
+	    pp += samplesperpixel;
+	}
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 16-bit packed samples => RGB
+ */
+DECLAREContigPutFunc(putRGBcontig16bittile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    uint16 *wp = (uint16 *)pp;
+
+    (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	for (x = w; x-- > 0;) {
+	    *cp++ = PACKW(wp[0], wp[1], wp[2]);
+	    wp += samplesperpixel;
+	}
+	cp += toskew;
+	wp += fromskew;
+    }
+}
+
+/*
+ * 16-bit packed samples => RGBA w/ associated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBAAcontig16bittile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    uint16 *wp = (uint16 *)pp;
+
+    (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	for (x = w; x-- > 0;) {
+	    *cp++ = PACKW4(wp[0], wp[1], wp[2], wp[3]);
+	    wp += samplesperpixel;
+	}
+	cp += toskew;
+	wp += fromskew;
+    }
+}
+
+/*
+ * 16-bit packed samples => RGBA w/ unassociated alpha
+ * (known to have Map == NULL)
+ */
+DECLAREContigPutFunc(putRGBUAcontig16bittile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    uint16 *wp = (uint16 *)pp;
+
+    (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	uint32 r,g,b,a;
+	/*
+	 * We shift alpha down four bits just in case unsigned
+	 * arithmetic doesn't handle the full range.
+	 * We still have plenty of accuracy, since the output is 8 bits.
+	 * So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff)
+	 * Since we want r*a * 0xff for eight bit output,
+	 * we divide by (0xffff * 0xfff) / 0xff == 0x10eff.
+	 */
+	for (x = w; x-- > 0;) {
+	    a = wp[3] >> 4; 
+	    r = (wp[0] * a) / 0x10eff;
+	    g = (wp[1] * a) / 0x10eff;
+	    b = (wp[2] * a) / 0x10eff;
+	    *cp++ = PACK4(r,g,b,a);
+	    wp += samplesperpixel;
+	}
+	cp += toskew;
+	wp += fromskew;
+    }
+}
+
+/*
+ * 8-bit packed CMYK samples w/o Map => RGB
+ *
+ * NB: The conversion of CMYK->RGB is *very* crude.
+ */
+DECLAREContigPutFunc(putRGBcontig8bitCMYKtile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    uint16 r, g, b, k;
+
+    (void) x; (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	UNROLL8(w, NOP,
+	    k = 255 - pp[3];
+	    r = (k*(255-pp[0]))/255;
+	    g = (k*(255-pp[1]))/255;
+	    b = (k*(255-pp[2]))/255;
+	    *cp++ = PACK(r, g, b);
+	    pp += samplesperpixel);
+	cp += toskew;
+	pp += fromskew;
+    }
+}
+
+/*
+ * 8-bit packed CMYK samples w/Map => RGB
+ *
+ * NB: The conversion of CMYK->RGB is *very* crude.
+ */
+DECLAREContigPutFunc(putRGBcontig8bitCMYKMaptile)
+{
+    int samplesperpixel = img->samplesperpixel;
+    TIFFRGBValue* Map = img->Map;
+    uint16 r, g, b, k;
+
+    (void) y;
+    fromskew *= samplesperpixel;
+    while (h-- > 0) {
+	for (x = w; x-- > 0;) {
+	    k = 255 - pp[3];
+	    r = (k*(255-pp[0]))/255;
+	    g = (k*(255-pp[1]))/255;
+	    b = (k*(255-pp[2]))/255;
+	    *cp++ = PACK(Map[r], Map[g], Map[b]);
+	    pp += samplesperpixel;
+	}
+	pp += fromskew;
+	cp += toskew;
+    }
+}
+
+#define	DECLARESepPutFunc(name) \
+static void name(\
+    TIFFRGBAImage* img,\
+    uint32* cp,\
+    uint32 x, uint32 y, \
+    uint32 w, uint32 h,\
+    int32 fromskew, int32 toskew,\
+    u_char* r, u_char* g, u_char* b, u_char* a\
+)
+
+/*
+ * 8-bit unpacked samples => RGB
+ */
+DECLARESepPutFunc(putRGBseparate8bittile)
+{
+    (void) img; (void) x; (void) y; (void) a;
+    while (h-- > 0) {
+	UNROLL8(w, NOP, *cp++ = PACK(*r++, *g++, *b++));
+	SKEW(r, g, b, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 8-bit unpacked samples => RGB
+ */
+DECLARESepPutFunc(putRGBseparate8bitMaptile)
+{
+    TIFFRGBValue* Map = img->Map;
+
+    (void) y; (void) a;
+    while (h-- > 0) {
+	for (x = w; x > 0; x--)
+	    *cp++ = PACK(Map[*r++], Map[*g++], Map[*b++]);
+	SKEW(r, g, b, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 8-bit unpacked samples => RGBA w/ associated alpha
+ */
+DECLARESepPutFunc(putRGBAAseparate8bittile)
+{
+    (void) img; (void) x; (void) y;
+    while (h-- > 0) {
+	UNROLL8(w, NOP, *cp++ = PACK4(*r++, *g++, *b++, *a++));
+	SKEW4(r, g, b, a, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 8-bit unpacked samples => RGBA w/ unassociated alpha
+ */
+DECLARESepPutFunc(putRGBUAseparate8bittile)
+{
+    (void) img; (void) y;
+    while (h-- > 0) {
+	uint32 rv, gv, bv, av;
+	for (x = w; x-- > 0;) {
+	    av = *a++;
+	    rv = (*r++ * av) / 255;
+	    gv = (*g++ * av) / 255;
+	    bv = (*b++ * av) / 255;
+	    *cp++ = PACK4(rv,gv,bv,av);
+	}
+	SKEW4(r, g, b, a, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 16-bit unpacked samples => RGB
+ */
+DECLARESepPutFunc(putRGBseparate16bittile)
+{
+    uint16 *wr = (uint16*) r;
+    uint16 *wg = (uint16*) g;
+    uint16 *wb = (uint16*) b;
+
+    (void) img; (void) y; (void) a;
+    while (h-- > 0) {
+	for (x = 0; x < w; x++)
+	    *cp++ = PACKW(*wr++, *wg++, *wb++);
+	SKEW(wr, wg, wb, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 16-bit unpacked samples => RGBA w/ associated alpha
+ */
+DECLARESepPutFunc(putRGBAAseparate16bittile)
+{
+    uint16 *wr = (uint16*) r;
+    uint16 *wg = (uint16*) g;
+    uint16 *wb = (uint16*) b;
+    uint16 *wa = (uint16*) a;
+
+    (void) img; (void) y;
+    while (h-- > 0) {
+	for (x = 0; x < w; x++)
+	    *cp++ = PACKW4(*wr++, *wg++, *wb++, *wa++);
+	SKEW4(wr, wg, wb, wa, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 16-bit unpacked samples => RGBA w/ unassociated alpha
+ */
+DECLARESepPutFunc(putRGBUAseparate16bittile)
+{
+    uint16 *wr = (uint16*) r;
+    uint16 *wg = (uint16*) g;
+    uint16 *wb = (uint16*) b;
+    uint16 *wa = (uint16*) a;
+
+    (void) img; (void) y;
+    while (h-- > 0) {
+	uint32 r,g,b,a;
+	/*
+	 * We shift alpha down four bits just in case unsigned
+	 * arithmetic doesn't handle the full range.
+	 * We still have plenty of accuracy, since the output is 8 bits.
+	 * So we have (r * 0xffff) * (a * 0xfff)) = r*a * (0xffff*0xfff)
+	 * Since we want r*a * 0xff for eight bit output,
+	 * we divide by (0xffff * 0xfff) / 0xff == 0x10eff.
+	 */
+	for (x = w; x-- > 0;) {
+	    a = *wa++ >> 4; 
+	    r = (*wr++ * a) / 0x10eff;
+	    g = (*wg++ * a) / 0x10eff;
+	    b = (*wb++ * a) / 0x10eff;
+	    *cp++ = PACK4(r,g,b,a);
+	}
+	SKEW4(wr, wg, wb, wa, fromskew);
+	cp += toskew;
+    }
+}
+
+/*
+ * 8-bit packed CIE L*a*b 1976 samples => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitCIELab)
+{
+	float X, Y, Z;
+	uint32 r, g, b;
+	(void) y;
+	fromskew *= 3;
+	while (h-- > 0) {
+		for (x = w; x-- > 0;) {
+			TIFFCIELabToXYZ(img->cielab,
+					(u_char)pp[0],
+					(signed char)pp[1],
+					(signed char)pp[2],
+					&X, &Y, &Z);
+			TIFFXYZToRGB(img->cielab, X, Y, Z, &r, &g, &b);
+			*cp++ = PACK(r, g, b);
+			pp += 3;
+		}
+		cp += toskew;
+		pp += fromskew;
+	}
+}
+
+/*
+ * YCbCr -> RGB conversion and packing routines.
+ */
+
+#define	YCbCrtoRGB(dst, Y) {						\
+	uint32 r, g, b;							\
+	TIFFYCbCrtoRGB(img->ycbcr, (Y), Cb, Cr, &r, &g, &b);		\
+	dst = PACK(r, g, b);						\
+}
+
+/*
+ * 8-bit packed YCbCr samples => RGB 
+ * This function is generic for different sampling sizes, 
+ * and can handle blocks sizes that aren't multiples of the
+ * sampling size.  However, it is substantially less optimized
+ * than the specific sampling cases.  It is used as a fallback
+ * for difficult blocks.
+ */
+#ifdef notdef
+static void putcontig8bitYCbCrGenericTile( 
+    TIFFRGBAImage* img, 
+    uint32* cp, 
+    uint32 x, uint32 y, 
+    uint32 w, uint32 h, 
+    int32 fromskew, int32 toskew, 
+    u_char* pp,
+    int h_group, 
+    int v_group )
+
+{
+    uint32* cp1 = cp+w+toskew;
+    uint32* cp2 = cp1+w+toskew;
+    uint32* cp3 = cp2+w+toskew;
+    int32 incr = 3*w+4*toskew;
+    int32   Cb, Cr;
+    int     group_size = v_group * h_group + 2;
+
+    (void) y;
+    fromskew = (fromskew * group_size) / h_group;
+
+    for( yy = 0; yy < h; yy++ )
+    {
+        u_char *pp_line;
+        int     y_line_group = yy / v_group;
+        int     y_remainder = yy - y_line_group * v_group;
+
+        pp_line = pp + v_line_group * 
+
+        
+        for( xx = 0; xx < w; xx++ )
+        {
+            Cb = pp
+        }
+    }
+    for (; h >= 4; h -= 4) {
+	x = w>>2;
+	do {
+	    Cb = pp[16];
+	    Cr = pp[17];
+
+	    YCbCrtoRGB(cp [0], pp[ 0]);
+	    YCbCrtoRGB(cp [1], pp[ 1]);
+	    YCbCrtoRGB(cp [2], pp[ 2]);
+	    YCbCrtoRGB(cp [3], pp[ 3]);
+	    YCbCrtoRGB(cp1[0], pp[ 4]);
+	    YCbCrtoRGB(cp1[1], pp[ 5]);
+	    YCbCrtoRGB(cp1[2], pp[ 6]);
+	    YCbCrtoRGB(cp1[3], pp[ 7]);
+	    YCbCrtoRGB(cp2[0], pp[ 8]);
+	    YCbCrtoRGB(cp2[1], pp[ 9]);
+	    YCbCrtoRGB(cp2[2], pp[10]);
+	    YCbCrtoRGB(cp2[3], pp[11]);
+	    YCbCrtoRGB(cp3[0], pp[12]);
+	    YCbCrtoRGB(cp3[1], pp[13]);
+	    YCbCrtoRGB(cp3[2], pp[14]);
+	    YCbCrtoRGB(cp3[3], pp[15]);
+
+	    cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
+	    pp += 18;
+	} while (--x);
+	cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
+	pp += fromskew;
+    }
+}
+#endif
+
+/*
+ * 8-bit packed YCbCr samples w/ 4,4 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr44tile)
+{
+    uint32* cp1 = cp+w+toskew;
+    uint32* cp2 = cp1+w+toskew;
+    uint32* cp3 = cp2+w+toskew;
+    int32 incr = 3*w+4*toskew;
+
+    (void) y;
+    /* adjust fromskew */
+    fromskew = (fromskew * 18) / 4;
+    if ((h & 3) == 0 && (w & 3) == 0) {				        
+        for (; h >= 4; h -= 4) {
+            x = w>>2;
+            do {
+                int32 Cb = pp[16];
+                int32 Cr = pp[17];
+
+                YCbCrtoRGB(cp [0], pp[ 0]);
+                YCbCrtoRGB(cp [1], pp[ 1]);
+                YCbCrtoRGB(cp [2], pp[ 2]);
+                YCbCrtoRGB(cp [3], pp[ 3]);
+                YCbCrtoRGB(cp1[0], pp[ 4]);
+                YCbCrtoRGB(cp1[1], pp[ 5]);
+                YCbCrtoRGB(cp1[2], pp[ 6]);
+                YCbCrtoRGB(cp1[3], pp[ 7]);
+                YCbCrtoRGB(cp2[0], pp[ 8]);
+                YCbCrtoRGB(cp2[1], pp[ 9]);
+                YCbCrtoRGB(cp2[2], pp[10]);
+                YCbCrtoRGB(cp2[3], pp[11]);
+                YCbCrtoRGB(cp3[0], pp[12]);
+                YCbCrtoRGB(cp3[1], pp[13]);
+                YCbCrtoRGB(cp3[2], pp[14]);
+                YCbCrtoRGB(cp3[3], pp[15]);
+
+                cp += 4, cp1 += 4, cp2 += 4, cp3 += 4;
+                pp += 18;
+            } while (--x);
+            cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
+            pp += fromskew;
+        }
+    } else {
+        while (h > 0) {
+            for (x = w; x > 0;) {
+                int32 Cb = pp[16];
+                int32 Cr = pp[17];
+                switch (x) {
+                default:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp3[3], pp[15]); /* FALLTHROUGH */
+                    case 3:  YCbCrtoRGB(cp2[3], pp[11]); /* FALLTHROUGH */
+                    case 2:  YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 3:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp3[2], pp[14]); /* FALLTHROUGH */
+                    case 3:  YCbCrtoRGB(cp2[2], pp[10]); /* FALLTHROUGH */
+                    case 2:  YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 2:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp3[1], pp[13]); /* FALLTHROUGH */
+                    case 3:  YCbCrtoRGB(cp2[1], pp[ 9]); /* FALLTHROUGH */
+                    case 2:  YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 1:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp3[0], pp[12]); /* FALLTHROUGH */
+                    case 3:  YCbCrtoRGB(cp2[0], pp[ 8]); /* FALLTHROUGH */
+                    case 2:  YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                }
+                if (x < 4) {
+                    cp += x; cp1 += x; cp2 += x; cp3 += x;
+                    x = 0;
+                }
+                else {
+                    cp += 4; cp1 += 4; cp2 += 4; cp3 += 4;
+                    x -= 4;
+                }
+                pp += 18;
+            }
+            if (h <= 4)
+                break;
+            h -= 4;
+            cp += incr, cp1 += incr, cp2 += incr, cp3 += incr;
+            pp += fromskew;
+        }
+    }
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 4,2 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr42tile)
+{
+    uint32* cp1 = cp+w+toskew;
+    int32 incr = 2*toskew+w;
+
+    (void) y;
+    fromskew = (fromskew * 10) / 4;
+    if ((h & 3) == 0 && (w & 1) == 0) {
+        for (; h >= 2; h -= 2) {
+            x = w>>2;
+            do {
+                int32 Cb = pp[8];
+                int32 Cr = pp[9];
+                
+                YCbCrtoRGB(cp [0], pp[0]);
+                YCbCrtoRGB(cp [1], pp[1]);
+                YCbCrtoRGB(cp [2], pp[2]);
+                YCbCrtoRGB(cp [3], pp[3]);
+                YCbCrtoRGB(cp1[0], pp[4]);
+                YCbCrtoRGB(cp1[1], pp[5]);
+                YCbCrtoRGB(cp1[2], pp[6]);
+                YCbCrtoRGB(cp1[3], pp[7]);
+                
+                cp += 4, cp1 += 4;
+                pp += 10;
+            } while (--x);
+            cp += incr, cp1 += incr;
+            pp += fromskew;
+        }
+    } else {
+        while (h > 0) {
+            for (x = w; x > 0;) {
+                int32 Cb = pp[8];
+                int32 Cr = pp[9];
+                switch (x) {
+                default:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp1[3], pp[ 7]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [3], pp[ 3]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 3:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp1[2], pp[ 6]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [2], pp[ 2]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 2:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp1[1], pp[ 5]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 1:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp1[0], pp[ 4]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                }
+                if (x < 4) {
+                    cp += x; cp1 += x;
+                    x = 0;
+                }
+                else {
+                    cp += 4; cp1 += 4;
+                    x -= 4;
+                }
+                pp += 10;
+            }
+            if (h <= 2)
+                break;
+            h -= 2;
+            cp += incr, cp1 += incr;
+            pp += fromskew;
+        }
+    }
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 4,1 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr41tile)
+{
+    (void) y;
+    /* XXX adjust fromskew */
+    do {
+	x = w>>2;
+	do {
+	    int32 Cb = pp[4];
+	    int32 Cr = pp[5];
+
+	    YCbCrtoRGB(cp [0], pp[0]);
+	    YCbCrtoRGB(cp [1], pp[1]);
+	    YCbCrtoRGB(cp [2], pp[2]);
+	    YCbCrtoRGB(cp [3], pp[3]);
+
+	    cp += 4;
+	    pp += 6;
+	} while (--x);
+
+        if( (w&3) != 0 )
+        {
+	    int32 Cb = pp[4];
+	    int32 Cr = pp[5];
+
+            switch( (w&3) ) {
+              case 3: YCbCrtoRGB(cp [2], pp[2]);
+              case 2: YCbCrtoRGB(cp [1], pp[1]);
+              case 1: YCbCrtoRGB(cp [0], pp[0]);
+              case 0: break;
+            }
+
+            cp += (w&3);
+            pp += 6;
+        }
+
+	cp += toskew;
+	pp += fromskew;
+    } while (--h);
+
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 2,2 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr22tile)
+{
+    uint32* cp1 = cp+w+toskew;
+    int32 incr = 2*toskew+w;
+
+    (void) y;
+    fromskew = (fromskew * 6) / 2;
+    if ((h & 1) == 0 && (w & 1) == 0) {
+        for (; h >= 2; h -= 2) {
+            x = w>>1;
+            do {
+                int32 Cb = pp[4];
+                int32 Cr = pp[5];
+
+                YCbCrtoRGB(cp [0], pp[0]);
+                YCbCrtoRGB(cp [1], pp[1]);
+                YCbCrtoRGB(cp1[0], pp[2]);
+                YCbCrtoRGB(cp1[1], pp[3]);
+
+                cp += 2, cp1 += 2;
+                pp += 6;
+            } while (--x);
+            cp += incr, cp1 += incr;
+            pp += fromskew;
+        }
+    } else {
+        while (h > 0) {
+            for (x = w; x > 0;) {
+                int32 Cb = pp[4];
+                int32 Cr = pp[5];
+                switch (x) {
+                default:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp1[1], pp[ 3]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [1], pp[ 1]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                case 1:
+                    switch (h) {
+                    default: YCbCrtoRGB(cp1[0], pp[ 2]); /* FALLTHROUGH */
+                    case 1:  YCbCrtoRGB(cp [0], pp[ 0]); /* FALLTHROUGH */
+                    }                                    /* FALLTHROUGH */
+                }
+                if (x < 2) {
+                    cp += x; cp1 += x;
+                    x = 0;
+                }
+                else {
+                    cp += 2; cp1 += 2;
+                    x -= 2;
+                }
+                pp += 6;
+            }
+            if (h <= 2)
+                break;
+            h -= 2;
+            cp += incr, cp1 += incr;
+            pp += fromskew;
+        }
+    }
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ 2,1 subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr21tile)
+{
+    (void) y;
+    fromskew = (fromskew * 4) / 2;
+    do {
+	x = w>>1;
+	do {
+	    int32 Cb = pp[2];
+	    int32 Cr = pp[3];
+
+	    YCbCrtoRGB(cp[0], pp[0]); 
+	    YCbCrtoRGB(cp[1], pp[1]);
+
+	    cp += 2;
+	    pp += 4;
+	} while (--x);
+
+        if( (w&1) != 0 )
+        {
+	    int32 Cb = pp[2];
+	    int32 Cr = pp[3];
+            
+            YCbCrtoRGB(cp [0], pp[0]);
+
+	    cp += 1;
+	    pp += 4;
+        }
+
+	cp += toskew;
+	pp += fromskew;
+    } while (--h);
+}
+
+/*
+ * 8-bit packed YCbCr samples w/ no subsampling => RGB
+ */
+DECLAREContigPutFunc(putcontig8bitYCbCr11tile)
+{
+    (void) y;
+    fromskew *= 3;
+    do {
+        x = w; /* was x = w>>1; patched 2000/09/25 warmerda at home.com */ 
+	do {
+	    int32 Cb = pp[1];
+	    int32 Cr = pp[2];
+
+	    YCbCrtoRGB(*cp++, pp[0]);
+
+	    pp += 3;
+	} while (--x);
+	cp += toskew;
+	pp += fromskew;
+    } while (--h);
+}
+#undef	YCbCrtoRGB
+
+static tileContigRoutine
+initYCbCrConversion(TIFFRGBAImage* img)
+{
+	static char module[] = "initCIELabConversion";
+
+	float *luma, *refBlackWhite;
+	uint16 hs, vs;
+
+	if (img->ycbcr == NULL) {
+	    img->ycbcr = (TIFFYCbCrToRGB*) _TIFFmalloc(
+		    TIFFroundup(sizeof (TIFFYCbCrToRGB), sizeof (long))
+		    + 4*256*sizeof (TIFFRGBValue)
+		    + 2*256*sizeof (int)
+		    + 3*256*sizeof (int32)
+	    );
+	    if (img->ycbcr == NULL) {
+		    TIFFError(module,
+			      "No space for YCbCr->RGB conversion state");
+		    return (NULL);
+	    }
+	}
+
+	TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRCOEFFICIENTS, &luma);
+	TIFFGetFieldDefaulted(img->tif, TIFFTAG_REFERENCEBLACKWHITE,
+			      &refBlackWhite);
+	if (TIFFYCbCrToRGBInit(img->ycbcr, luma, refBlackWhite) < 0)
+		return NULL;
+
+	/*
+	 * The 6.0 spec says that subsampling must be
+	 * one of 1, 2, or 4, and that vertical subsampling
+	 * must always be <= horizontal subsampling; so
+	 * there are only a few possibilities and we just
+	 * enumerate the cases.
+	 */
+	TIFFGetFieldDefaulted(img->tif, TIFFTAG_YCBCRSUBSAMPLING, &hs, &vs);
+	switch ((hs<<4)|vs) {
+		case 0x44: return (putcontig8bitYCbCr44tile);
+		case 0x42: return (putcontig8bitYCbCr42tile);
+		case 0x41: return (putcontig8bitYCbCr41tile);
+		case 0x22: return (putcontig8bitYCbCr22tile);
+		case 0x21: return (putcontig8bitYCbCr21tile);
+		case 0x11: return (putcontig8bitYCbCr11tile);
+	}
+
+	return (NULL);
+}
+
+static tileContigRoutine
+initCIELabConversion(TIFFRGBAImage* img)
+{
+	static char module[] = "initCIELabConversion";
+
+	float   *whitePoint;
+	float   refWhite[3];
+
+	if (!img->cielab) {
+		img->cielab = (TIFFCIELabToRGB *)
+			_TIFFmalloc(sizeof(TIFFCIELabToRGB));
+		if (!img->cielab) {
+			TIFFError(module,
+			    "No space for CIE L*a*b*->RGB conversion state.");
+			return NULL;
+		}
+	}
+
+	TIFFGetFieldDefaulted(img->tif, TIFFTAG_WHITEPOINT, &whitePoint);
+	refWhite[1] = 100.0F;
+	refWhite[0] = whitePoint[0] / whitePoint[1] * refWhite[1];
+	refWhite[2] = (1.0F - whitePoint[0] - whitePoint[1])
+		      / whitePoint[1] * refWhite[1];
+	if (TIFFCIELabToRGBInit(img->cielab, &display_sRGB, refWhite) < 0) {
+		TIFFError(module,
+		    "Failed to initialize CIE L*a*b*->RGB conversion state.");
+		_TIFFfree(img->cielab);
+		return NULL;
+	}
+
+	return putcontig8bitCIELab;
+}
+
+/*
+ * Greyscale images with less than 8 bits/sample are handled
+ * with a table to avoid lots of shifts and masks.  The table
+ * is setup so that put*bwtile (below) can retrieve 8/bitspersample
+ * pixel values simply by indexing into the table with one
+ * number.
+ */
+static int
+makebwmap(TIFFRGBAImage* img)
+{
+    TIFFRGBValue* Map = img->Map;
+    int bitspersample = img->bitspersample;
+    int nsamples = 8 / bitspersample;
+    int i;
+    uint32* p;
+
+    if( nsamples == 0 )
+        nsamples = 1;
+
+    img->BWmap = (uint32**) _TIFFmalloc(
+	256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32)));
+    if (img->BWmap == NULL) {
+	TIFFError(TIFFFileName(img->tif), "No space for B&W mapping table");
+	return (0);
+    }
+    p = (uint32*)(img->BWmap + 256);
+    for (i = 0; i < 256; i++) {
+	TIFFRGBValue c;
+	img->BWmap[i] = p;
+	switch (bitspersample) {
+#define	GREY(x)	c = Map[x]; *p++ = PACK(c,c,c);
+	case 1:
+	    GREY(i>>7);
+	    GREY((i>>6)&1);
+	    GREY((i>>5)&1);
+	    GREY((i>>4)&1);
+	    GREY((i>>3)&1);
+	    GREY((i>>2)&1);
+	    GREY((i>>1)&1);
+	    GREY(i&1);
+	    break;
+	case 2:
+	    GREY(i>>6);
+	    GREY((i>>4)&3);
+	    GREY((i>>2)&3);
+	    GREY(i&3);
+	    break;
+	case 4:
+	    GREY(i>>4);
+	    GREY(i&0xf);
+	    break;
+	case 8:
+        case 16:
+	    GREY(i);
+	    break;
+	}
+#undef	GREY
+    }
+    return (1);
+}
+
+/*
+ * Construct a mapping table to convert from the range
+ * of the data samples to [0,255] --for display.  This
+ * process also handles inverting B&W images when needed.
+ */ 
+static int
+setupMap(TIFFRGBAImage* img)
+{
+    int32 x, range;
+
+    range = (int32)((1L<<img->bitspersample)-1);
+    
+    /* treat 16 bit the same as eight bit */
+    if( img->bitspersample == 16 )
+        range = (int32) 255;
+
+    img->Map = (TIFFRGBValue*) _TIFFmalloc((range+1) * sizeof (TIFFRGBValue));
+    if (img->Map == NULL) {
+	TIFFError(TIFFFileName(img->tif),
+	    "No space for photometric conversion table");
+	return (0);
+    }
+    if (img->photometric == PHOTOMETRIC_MINISWHITE) {
+	for (x = 0; x <= range; x++)
+	    img->Map[x] = (TIFFRGBValue) (((range - x) * 255) / range);
+    } else {
+	for (x = 0; x <= range; x++)
+	    img->Map[x] = (TIFFRGBValue) ((x * 255) / range);
+    }
+    if (img->bitspersample <= 16 &&
+	(img->photometric == PHOTOMETRIC_MINISBLACK ||
+	 img->photometric == PHOTOMETRIC_MINISWHITE)) {
+	/*
+	 * Use photometric mapping table to construct
+	 * unpacking tables for samples <= 8 bits.
+	 */
+	if (!makebwmap(img))
+	    return (0);
+	/* no longer need Map, free it */
+	_TIFFfree(img->Map), img->Map = NULL;
+    }
+    return (1);
+}
+
+static int
+checkcmap(TIFFRGBAImage* img)
+{
+    uint16* r = img->redcmap;
+    uint16* g = img->greencmap;
+    uint16* b = img->bluecmap;
+    long n = 1L<<img->bitspersample;
+
+    while (n-- > 0)
+	if (*r++ >= 256 || *g++ >= 256 || *b++ >= 256)
+	    return (16);
+    return (8);
+}
+
+static void
+cvtcmap(TIFFRGBAImage* img)
+{
+    uint16* r = img->redcmap;
+    uint16* g = img->greencmap;
+    uint16* b = img->bluecmap;
+    long i;
+
+    for (i = (1L<<img->bitspersample)-1; i >= 0; i--) {
+#define	CVT(x)		((uint16)((x)>>8))
+	r[i] = CVT(r[i]);
+	g[i] = CVT(g[i]);
+	b[i] = CVT(b[i]);
+#undef	CVT
+    }
+}
+
+/*
+ * Palette images with <= 8 bits/sample are handled
+ * with a table to avoid lots of shifts and masks.  The table
+ * is setup so that put*cmaptile (below) can retrieve 8/bitspersample
+ * pixel values simply by indexing into the table with one
+ * number.
+ */
+static int
+makecmap(TIFFRGBAImage* img)
+{
+    int bitspersample = img->bitspersample;
+    int nsamples = 8 / bitspersample;
+    uint16* r = img->redcmap;
+    uint16* g = img->greencmap;
+    uint16* b = img->bluecmap;
+    uint32 *p;
+    int i;
+
+    img->PALmap = (uint32**) _TIFFmalloc(
+	256*sizeof (uint32 *)+(256*nsamples*sizeof(uint32)));
+    if (img->PALmap == NULL) {
+	TIFFError(TIFFFileName(img->tif), "No space for Palette mapping table");
+	return (0);
+    }
+    p = (uint32*)(img->PALmap + 256);
+    for (i = 0; i < 256; i++) {
+	TIFFRGBValue c;
+	img->PALmap[i] = p;
+#define	CMAP(x)	c = (TIFFRGBValue) x; *p++ = PACK(r[c]&0xff, g[c]&0xff, b[c]&0xff);
+	switch (bitspersample) {
+	case 1:
+	    CMAP(i>>7);
+	    CMAP((i>>6)&1);
+	    CMAP((i>>5)&1);
+	    CMAP((i>>4)&1);
+	    CMAP((i>>3)&1);
+	    CMAP((i>>2)&1);
+	    CMAP((i>>1)&1);
+	    CMAP(i&1);
+	    break;
+	case 2:
+	    CMAP(i>>6);
+	    CMAP((i>>4)&3);
+	    CMAP((i>>2)&3);
+	    CMAP(i&3);
+	    break;
+	case 4:
+	    CMAP(i>>4);
+	    CMAP(i&0xf);
+	    break;
+	case 8:
+	    CMAP(i);
+	    break;
+	}
+#undef CMAP
+    }
+    return (1);
+}
+
+/* 
+ * Construct any mapping table used
+ * by the associated put routine.
+ */
+static int
+buildMap(TIFFRGBAImage* img)
+{
+    switch (img->photometric) {
+    case PHOTOMETRIC_RGB:
+    case PHOTOMETRIC_YCBCR:
+    case PHOTOMETRIC_SEPARATED:
+	if (img->bitspersample == 8)
+	    break;
+	/* fall thru... */
+    case PHOTOMETRIC_MINISBLACK:
+    case PHOTOMETRIC_MINISWHITE:
+	if (!setupMap(img))
+	    return (0);
+	break;
+    case PHOTOMETRIC_PALETTE:
+	/*
+	 * Convert 16-bit colormap to 8-bit (unless it looks
+	 * like an old-style 8-bit colormap).
+	 */
+	if (checkcmap(img) == 16)
+	    cvtcmap(img);
+	else
+	    TIFFWarning(TIFFFileName(img->tif), "Assuming 8-bit colormap");
+	/*
+	 * Use mapping table and colormap to construct
+	 * unpacking tables for samples < 8 bits.
+	 */
+	if (img->bitspersample <= 8 && !makecmap(img))
+	    return (0);
+	break;
+    }
+    return (1);
+}
+
+/*
+ * Select the appropriate conversion routine for packed data.
+ */
+static int
+pickTileContigCase(TIFFRGBAImage* img)
+{
+    tileContigRoutine put = 0;
+
+    if (buildMap(img)) {
+	switch (img->photometric) {
+	case PHOTOMETRIC_RGB:
+	    switch (img->bitspersample) {
+	    case 8:
+		if (!img->Map) {
+		    if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+			put = putRGBAAcontig8bittile;
+		    else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+			put = putRGBUAcontig8bittile;
+		    else
+			put = putRGBcontig8bittile;
+		} else
+		    put = putRGBcontig8bitMaptile;
+		break;
+	    case 16:
+		put = putRGBcontig16bittile;
+		if (!img->Map) {
+		    if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+			put = putRGBAAcontig16bittile;
+		    else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+			put = putRGBUAcontig16bittile;
+		}
+		break;
+	    }
+	    break;
+	case PHOTOMETRIC_SEPARATED:
+	    if (img->bitspersample == 8) {
+		if (!img->Map)
+		    put = putRGBcontig8bitCMYKtile;
+		else
+		    put = putRGBcontig8bitCMYKMaptile;
+	    }
+	    break;
+	case PHOTOMETRIC_PALETTE:
+	    switch (img->bitspersample) {
+	    case 8:	put = put8bitcmaptile; break;
+	    case 4: put = put4bitcmaptile; break;
+	    case 2: put = put2bitcmaptile; break;
+	    case 1: put = put1bitcmaptile; break;
+	    }
+	    break;
+	case PHOTOMETRIC_MINISWHITE:
+	case PHOTOMETRIC_MINISBLACK:
+	    switch (img->bitspersample) {
+            case 16: put = put16bitbwtile; break;
+	    case 8:  put = putgreytile; break;
+	    case 4:  put = put4bitbwtile; break;
+	    case 2:  put = put2bitbwtile; break;
+	    case 1:  put = put1bitbwtile; break;
+	    }
+	    break;
+	case PHOTOMETRIC_YCBCR:
+	    if (img->bitspersample == 8)
+		put = initYCbCrConversion(img);
+	    break;
+	case PHOTOMETRIC_CIELAB:
+	    if (img->bitspersample == 8)
+		put = initCIELabConversion(img);
+	    break;
+	}
+    }
+    return ((img->put.contig = put) != 0);
+}
+
+/*
+ * Select the appropriate conversion routine for unpacked data.
+ *
+ * NB: we assume that unpacked single channel data is directed
+ *	 to the "packed routines.
+ */
+static int
+pickTileSeparateCase(TIFFRGBAImage* img)
+{
+    tileSeparateRoutine put = 0;
+
+    if (buildMap(img)) {
+	switch (img->photometric) {
+	case PHOTOMETRIC_RGB:
+	    switch (img->bitspersample) {
+	    case 8:
+		if (!img->Map) {
+		    if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+			put = putRGBAAseparate8bittile;
+		    else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+			put = putRGBUAseparate8bittile;
+		    else
+			put = putRGBseparate8bittile;
+		} else
+		    put = putRGBseparate8bitMaptile;
+		break;
+	    case 16:
+		put = putRGBseparate16bittile;
+		if (!img->Map) {
+		    if (img->alpha == EXTRASAMPLE_ASSOCALPHA)
+			put = putRGBAAseparate16bittile;
+		    else if (img->alpha == EXTRASAMPLE_UNASSALPHA)
+			put = putRGBUAseparate16bittile;
+		}
+		break;
+	    }
+	    break;
+	}
+    }
+    return ((img->put.separate = put) != 0);
+}
+
+/*
+ * Read a whole strip off data from the file, and convert to RGBA form.
+ * If this is the last strip, then it will only contain the portion of
+ * the strip that is actually within the image space.  The result is
+ * organized in bottom to top form.
+ */
+
+
+int
+TIFFReadRGBAStrip(TIFF* tif, uint32 row, uint32 * raster )
+
+{
+    char 	emsg[1024];
+    TIFFRGBAImage img;
+    int 	ok;
+    uint32	rowsperstrip, rows_to_read;
+
+    if( TIFFIsTiled( tif ) )
+    {
+        TIFFError(TIFFFileName(tif),
+                  "Can't use TIFFReadRGBAStrip() with tiled file.");
+	return (0);
+    }
+    
+    TIFFGetFieldDefaulted(tif, TIFFTAG_ROWSPERSTRIP, &rowsperstrip);
+    if( (row % rowsperstrip) != 0 )
+    {
+        TIFFError(TIFFFileName(tif),
+                "Row passed to TIFFReadRGBAStrip() must be first in a strip.");
+	return (0);
+    }
+
+    if (TIFFRGBAImageOK(tif, emsg) && TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
+
+        img.row_offset = row;
+        img.col_offset = 0;
+
+        if( row + rowsperstrip > img.height )
+            rows_to_read = img.height - row;
+        else
+            rows_to_read = rowsperstrip;
+        
+	ok = TIFFRGBAImageGet(&img, raster, img.width, rows_to_read );
+        
+	TIFFRGBAImageEnd(&img);
+    } else {
+	TIFFError(TIFFFileName(tif), emsg);
+	ok = 0;
+    }
+    
+    return (ok);
+}
+
+/*
+ * Read a whole tile off data from the file, and convert to RGBA form.
+ * The returned RGBA data is organized from bottom to top of tile,
+ * and may include zeroed areas if the tile extends off the image.
+ */
+
+int
+TIFFReadRGBATile(TIFF* tif, uint32 col, uint32 row, uint32 * raster)
+
+{
+    char 	emsg[1024];
+    TIFFRGBAImage img;
+    int 	ok;
+    uint32	tile_xsize, tile_ysize;
+    uint32	read_xsize, read_ysize;
+    uint32	i_row;
+
+    /*
+     * Verify that our request is legal - on a tile file, and on a
+     * tile boundary.
+     */
+    
+    if( !TIFFIsTiled( tif ) )
+    {
+        TIFFError(TIFFFileName(tif),
+                  "Can't use TIFFReadRGBATile() with stripped file.");
+	return (0);
+    }
+    
+    TIFFGetFieldDefaulted(tif, TIFFTAG_TILEWIDTH, &tile_xsize);
+    TIFFGetFieldDefaulted(tif, TIFFTAG_TILELENGTH, &tile_ysize);
+    if( (col % tile_xsize) != 0 || (row % tile_ysize) != 0 )
+    {
+        TIFFError(TIFFFileName(tif),
+                  "Row/col passed to TIFFReadRGBATile() must be top"
+                  "left corner of a tile.");
+	return (0);
+    }
+
+    /*
+     * Setup the RGBA reader.
+     */
+    
+    if (!TIFFRGBAImageOK(tif, emsg) 
+	|| !TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
+	    TIFFError(TIFFFileName(tif), emsg);
+	    return( 0 );
+    }
+
+    /*
+     * The TIFFRGBAImageGet() function doesn't allow us to get off the
+     * edge of the image, even to fill an otherwise valid tile.  So we
+     * figure out how much we can read, and fix up the tile buffer to
+     * a full tile configuration afterwards.
+     */
+
+    if( row + tile_ysize > img.height )
+        read_ysize = img.height - row;
+    else
+        read_ysize = tile_ysize;
+    
+    if( col + tile_xsize > img.width )
+        read_xsize = img.width - col;
+    else
+        read_xsize = tile_xsize;
+
+    /*
+     * Read the chunk of imagery.
+     */
+    
+    img.row_offset = row;
+    img.col_offset = col;
+
+    ok = TIFFRGBAImageGet(&img, raster, read_xsize, read_ysize );
+        
+    TIFFRGBAImageEnd(&img);
+
+    /*
+     * If our read was incomplete we will need to fix up the tile by
+     * shifting the data around as if a full tile of data is being returned.
+     *
+     * This is all the more complicated because the image is organized in
+     * bottom to top format. 
+     */
+
+    if( read_xsize == tile_xsize && read_ysize == tile_ysize )
+        return( ok );
+
+    for( i_row = 0; i_row < read_ysize; i_row++ ) {
+        memmove( raster + (tile_ysize - i_row - 1) * tile_xsize,
+                 raster + (read_ysize - i_row - 1) * read_xsize,
+                 read_xsize * sizeof(uint32) );
+        _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize+read_xsize,
+                     0, sizeof(uint32) * (tile_xsize - read_xsize) );
+    }
+
+    for( i_row = read_ysize; i_row < tile_ysize; i_row++ ) {
+        _TIFFmemset( raster + (tile_ysize - i_row - 1) * tile_xsize,
+                     0, sizeof(uint32) * tile_xsize );
+    }
+
+    return (ok);
+}
diff --git a/src/tiff/tif_jpeg.c b/src/tiff/tif_jpeg.c
new file mode 100644
index 0000000..46f4d20
--- /dev/null
+++ b/src/tiff/tif_jpeg.c
@@ -0,0 +1,1667 @@
+/* $Header: /home/terralib/src/tiff/tif_jpeg.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1994-1997 Sam Leffler
+ * Copyright (c) 1994-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef JPEG_SUPPORT
+/*
+ * TIFF Library
+ *
+ * JPEG Compression support per TIFF Technical Note #2
+ * (*not* per the original TIFF 6.0 spec).
+ *
+ * This file is simply an interface to the libjpeg library written by
+ * the Independent JPEG Group.  You need release 5 or later of the IJG
+ * code, which you can find on the Internet at ftp.uu.net:/graphics/jpeg/.
+ *
+ * Contributed by Tom Lane <tgl at sss.pgh.pa.us>.
+ */
+#include <assert.h>
+#include <stdio.h>
+#include <setjmp.h>
+
+int TIFFFillStrip(TIFF*, tstrip_t);
+int TIFFFillTile(TIFF*, ttile_t);
+
+/* We undefine FAR to avoid conflict with JPEG definition */
+
+#ifdef FAR
+#undef FAR
+#endif
+
+/*
+   The windows RPCNDR.H file defines boolean, but defines it with the
+   wrong size.  So we declare HAVE_BOOLEAN so that the jpeg include file
+   won't try to typedef boolean, but #define it to override the rpcndr.h
+   definition.
+
+   http://bugzilla.remotesensing.org/show_bug.cgi?id=188
+*/
+#if defined(__RPCNDR_H__)
+#define HAVE_BOOLEAN
+#define boolean unsigned int
+#endif
+
+#include "jpeglib.h"
+#include "jerror.h"
+
+/*
+ * On some machines it may be worthwhile to use _setjmp or sigsetjmp
+ * in place of plain setjmp.  These macros will make it easier.
+ */
+#define SETJMP(jbuf)		setjmp(jbuf)
+#define LONGJMP(jbuf,code)	longjmp(jbuf,code)
+#define JMP_BUF			jmp_buf
+
+typedef struct jpeg_destination_mgr jpeg_destination_mgr;
+typedef struct jpeg_source_mgr jpeg_source_mgr;
+typedef	struct jpeg_error_mgr jpeg_error_mgr;
+
+/*
+ * State block for each open TIFF file using
+ * libjpeg to do JPEG compression/decompression.
+ *
+ * libjpeg's visible state is either a jpeg_compress_struct
+ * or jpeg_decompress_struct depending on which way we
+ * are going.  comm can be used to refer to the fields
+ * which are common to both.
+ *
+ * NB: cinfo is required to be the first member of JPEGState,
+ *     so we can safely cast JPEGState* -> jpeg_xxx_struct*
+ *     and vice versa!
+ */
+typedef	struct {
+	union {
+		struct jpeg_compress_struct c;
+		struct jpeg_decompress_struct d;
+		struct jpeg_common_struct comm;
+	} cinfo;			/* NB: must be first */
+        int             cinfo_initialized;
+
+	jpeg_error_mgr	err;		/* libjpeg error manager */
+	JMP_BUF		exit_jmpbuf;	/* for catching libjpeg failures */
+	/*
+	 * The following two members could be a union, but
+	 * they're small enough that it's not worth the effort.
+	 */
+	jpeg_destination_mgr dest;	/* data dest for compression */
+	jpeg_source_mgr	src;		/* data source for decompression */
+					/* private state */
+	TIFF*		tif;		/* back link needed by some code */
+	uint16		photometric;	/* copy of PhotometricInterpretation */
+	uint16		h_sampling;	/* luminance sampling factors */
+	uint16		v_sampling;
+	tsize_t		bytesperline;	/* decompressed bytes per scanline */
+	/* pointers to intermediate buffers when processing downsampled data */
+	JSAMPARRAY	ds_buffer[MAX_COMPONENTS];
+	int		scancount;	/* number of "scanlines" accumulated */
+	int		samplesperclump;
+
+	TIFFVGetMethod	vgetparent;	/* super-class method */
+	TIFFVSetMethod	vsetparent;	/* super-class method */
+	TIFFStripMethod	defsparent;	/* super-class method */
+	TIFFTileMethod	deftparent;	/* super-class method */
+					/* pseudo-tag fields */
+	void*		jpegtables;	/* JPEGTables tag value, or NULL */
+	uint32		jpegtables_length; /* number of bytes in same */
+	int		jpegquality;	/* Compression quality level */
+	int		jpegcolormode;	/* Auto RGB<=>YCbCr convert? */
+	int		jpegtablesmode;	/* What to put in JPEGTables */
+
+        int             ycbcrsampling_fetched;
+} JPEGState;
+
+#define	JState(tif)	((JPEGState*)(tif)->tif_data)
+
+static	int JPEGDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int JPEGDecodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int JPEGEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int JPEGEncodeRaw(TIFF*, tidata_t, tsize_t, tsample_t);
+static  int JPEGInitializeLibJPEG( TIFF * tif );
+
+#define	FIELD_JPEGTABLES	(FIELD_CODEC+0)
+
+static const TIFFFieldInfo jpegFieldInfo[] = {
+    { TIFFTAG_JPEGTABLES,	 -1,-1,	TIFF_UNDEFINED,	FIELD_JPEGTABLES,
+      FALSE,	TRUE,	"JPEGTables" },
+    { TIFFTAG_JPEGQUALITY,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
+      TRUE,	FALSE,	"" },
+    { TIFFTAG_JPEGCOLORMODE,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
+      FALSE,	FALSE,	"" },
+    { TIFFTAG_JPEGTABLESMODE,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
+      FALSE,	FALSE,	"" },
+};
+#define	N(a)	(sizeof (a) / sizeof (a[0]))
+
+/*
+ * libjpeg interface layer.
+ *
+ * We use setjmp/longjmp to return control to libtiff
+ * when a fatal error is encountered within the JPEG
+ * library.  We also direct libjpeg error and warning
+ * messages through the appropriate libtiff handlers.
+ */
+
+/*
+ * Error handling routines (these replace corresponding
+ * IJG routines from jerror.c).  These are used for both
+ * compression and decompression.
+ */
+static void
+TIFFjpeg_error_exit(j_common_ptr cinfo)
+{
+	JPEGState *sp = (JPEGState *) cinfo;	/* NB: cinfo assumed first */
+	char buffer[JMSG_LENGTH_MAX];
+
+	(*cinfo->err->format_message) (cinfo, buffer);
+	TIFFError("JPEGLib", buffer);		/* display the error message */
+	jpeg_abort(cinfo);			/* clean up libjpeg state */
+	LONGJMP(sp->exit_jmpbuf, 1);		/* return to libtiff caller */
+}
+
+/*
+ * This routine is invoked only for warning messages,
+ * since error_exit does its own thing and trace_level
+ * is never set > 0.
+ */
+static void
+TIFFjpeg_output_message(j_common_ptr cinfo)
+{
+	char buffer[JMSG_LENGTH_MAX];
+
+	(*cinfo->err->format_message) (cinfo, buffer);
+	TIFFWarning("JPEGLib", buffer);
+}
+
+/*
+ * Interface routines.  This layer of routines exists
+ * primarily to limit side-effects from using setjmp.
+ * Also, normal/error returns are converted into return
+ * values per libtiff practice.
+ */
+#define	CALLJPEG(sp, fail, op)	(SETJMP((sp)->exit_jmpbuf) ? (fail) : (op))
+#define	CALLVJPEG(sp, op)	CALLJPEG(sp, 0, ((op),1))
+
+static int
+TIFFjpeg_create_compress(JPEGState* sp)
+{
+	/* initialize JPEG error handling */
+	sp->cinfo.c.err = jpeg_std_error(&sp->err);
+	sp->err.error_exit = TIFFjpeg_error_exit;
+	sp->err.output_message = TIFFjpeg_output_message;
+
+	return CALLVJPEG(sp, jpeg_create_compress(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_create_decompress(JPEGState* sp)
+{
+	/* initialize JPEG error handling */
+	sp->cinfo.d.err = jpeg_std_error(&sp->err);
+	sp->err.error_exit = TIFFjpeg_error_exit;
+	sp->err.output_message = TIFFjpeg_output_message;
+
+	return CALLVJPEG(sp, jpeg_create_decompress(&sp->cinfo.d));
+}
+
+static int
+TIFFjpeg_set_defaults(JPEGState* sp)
+{
+	return CALLVJPEG(sp, jpeg_set_defaults(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_set_colorspace(JPEGState* sp, J_COLOR_SPACE colorspace)
+{
+	return CALLVJPEG(sp, jpeg_set_colorspace(&sp->cinfo.c, colorspace));
+}
+
+static int
+TIFFjpeg_set_quality(JPEGState* sp, int quality, boolean force_baseline)
+{
+	return CALLVJPEG(sp,
+	    jpeg_set_quality(&sp->cinfo.c, quality, force_baseline));
+}
+
+static int
+TIFFjpeg_suppress_tables(JPEGState* sp, boolean suppress)
+{
+	return CALLVJPEG(sp, jpeg_suppress_tables(&sp->cinfo.c, suppress));
+}
+
+static int
+TIFFjpeg_start_compress(JPEGState* sp, boolean write_all_tables)
+{
+	return CALLVJPEG(sp,
+	    jpeg_start_compress(&sp->cinfo.c, write_all_tables));
+}
+
+static int
+TIFFjpeg_write_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int num_lines)
+{
+	return CALLJPEG(sp, -1, (int) jpeg_write_scanlines(&sp->cinfo.c,
+	    scanlines, (JDIMENSION) num_lines));
+}
+
+static int
+TIFFjpeg_write_raw_data(JPEGState* sp, JSAMPIMAGE data, int num_lines)
+{
+	return CALLJPEG(sp, -1, (int) jpeg_write_raw_data(&sp->cinfo.c,
+	    data, (JDIMENSION) num_lines));
+}
+
+static int
+TIFFjpeg_finish_compress(JPEGState* sp)
+{
+	return CALLVJPEG(sp, jpeg_finish_compress(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_write_tables(JPEGState* sp)
+{
+	return CALLVJPEG(sp, jpeg_write_tables(&sp->cinfo.c));
+}
+
+static int
+TIFFjpeg_read_header(JPEGState* sp, boolean require_image)
+{
+	return CALLJPEG(sp, -1, jpeg_read_header(&sp->cinfo.d, require_image));
+}
+
+static int
+TIFFjpeg_start_decompress(JPEGState* sp)
+{
+	return CALLVJPEG(sp, jpeg_start_decompress(&sp->cinfo.d));
+}
+
+static int
+TIFFjpeg_read_scanlines(JPEGState* sp, JSAMPARRAY scanlines, int max_lines)
+{
+	return CALLJPEG(sp, -1, (int) jpeg_read_scanlines(&sp->cinfo.d,
+	    scanlines, (JDIMENSION) max_lines));
+}
+
+static int
+TIFFjpeg_read_raw_data(JPEGState* sp, JSAMPIMAGE data, int max_lines)
+{
+	return CALLJPEG(sp, -1, (int) jpeg_read_raw_data(&sp->cinfo.d,
+	    data, (JDIMENSION) max_lines));
+}
+
+static int
+TIFFjpeg_finish_decompress(JPEGState* sp)
+{
+	return CALLJPEG(sp, -1, (int) jpeg_finish_decompress(&sp->cinfo.d));
+}
+
+static int
+TIFFjpeg_abort(JPEGState* sp)
+{
+	return CALLVJPEG(sp, jpeg_abort(&sp->cinfo.comm));
+}
+
+static int
+TIFFjpeg_destroy(JPEGState* sp)
+{
+	return CALLVJPEG(sp, jpeg_destroy(&sp->cinfo.comm));
+}
+
+static JSAMPARRAY
+TIFFjpeg_alloc_sarray(JPEGState* sp, int pool_id,
+		      JDIMENSION samplesperrow, JDIMENSION numrows)
+{
+	return CALLJPEG(sp, (JSAMPARRAY) NULL,
+	    (*sp->cinfo.comm.mem->alloc_sarray)
+		(&sp->cinfo.comm, pool_id, samplesperrow, numrows));
+}
+
+/*
+ * JPEG library destination data manager.
+ * These routines direct compressed data from libjpeg into the
+ * libtiff output buffer.
+ */
+
+static void
+std_init_destination(j_compress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+	TIFF* tif = sp->tif;
+
+	sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
+	sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
+}
+
+static boolean
+std_empty_output_buffer(j_compress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+	TIFF* tif = sp->tif;
+
+	/* the entire buffer has been filled */
+	tif->tif_rawcc = tif->tif_rawdatasize;
+	TIFFFlushData1(tif);
+	sp->dest.next_output_byte = (JOCTET*) tif->tif_rawdata;
+	sp->dest.free_in_buffer = (size_t) tif->tif_rawdatasize;
+
+	return (TRUE);
+}
+
+static void
+std_term_destination(j_compress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+	TIFF* tif = sp->tif;
+
+	tif->tif_rawcp = (tidata_t) sp->dest.next_output_byte;
+	tif->tif_rawcc =
+	    tif->tif_rawdatasize - (tsize_t) sp->dest.free_in_buffer;
+	/* NB: libtiff does the final buffer flush */
+}
+
+static void
+TIFFjpeg_data_dest(JPEGState* sp, TIFF* tif)
+{
+	(void) tif;
+	sp->cinfo.c.dest = &sp->dest;
+	sp->dest.init_destination = std_init_destination;
+	sp->dest.empty_output_buffer = std_empty_output_buffer;
+	sp->dest.term_destination = std_term_destination;
+}
+
+/*
+ * Alternate destination manager for outputting to JPEGTables field.
+ */
+
+static void
+tables_init_destination(j_compress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+
+	/* while building, jpegtables_length is allocated buffer size */
+	sp->dest.next_output_byte = (JOCTET*) sp->jpegtables;
+	sp->dest.free_in_buffer = (size_t) sp->jpegtables_length;
+}
+
+static boolean
+tables_empty_output_buffer(j_compress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+	void* newbuf;
+
+	/* the entire buffer has been filled; enlarge it by 1000 bytes */
+	newbuf = _TIFFrealloc((tdata_t) sp->jpegtables,
+			      (tsize_t) (sp->jpegtables_length + 1000));
+	if (newbuf == NULL)
+		ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 100);
+	sp->dest.next_output_byte = (JOCTET*) newbuf + sp->jpegtables_length;
+	sp->dest.free_in_buffer = (size_t) 1000;
+	sp->jpegtables = newbuf;
+	sp->jpegtables_length += 1000;
+	return (TRUE);
+}
+
+static void
+tables_term_destination(j_compress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+
+	/* set tables length to number of bytes actually emitted */
+	sp->jpegtables_length -= sp->dest.free_in_buffer;
+}
+
+static int
+TIFFjpeg_tables_dest(JPEGState* sp, TIFF* tif)
+{
+	(void) tif;
+	/*
+	 * Allocate a working buffer for building tables.
+	 * Initial size is 1000 bytes, which is usually adequate.
+	 */
+	if (sp->jpegtables)
+		_TIFFfree(sp->jpegtables);
+	sp->jpegtables_length = 1000;
+	sp->jpegtables = (void*) _TIFFmalloc((tsize_t) sp->jpegtables_length);
+	if (sp->jpegtables == NULL) {
+		sp->jpegtables_length = 0;
+		TIFFError("TIFFjpeg_tables_dest", "No space for JPEGTables");
+		return (0);
+	}
+	sp->cinfo.c.dest = &sp->dest;
+	sp->dest.init_destination = tables_init_destination;
+	sp->dest.empty_output_buffer = tables_empty_output_buffer;
+	sp->dest.term_destination = tables_term_destination;
+	return (1);
+}
+
+/*
+ * JPEG library source data manager.
+ * These routines supply compressed data to libjpeg.
+ */
+
+static void
+std_init_source(j_decompress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+	TIFF* tif = sp->tif;
+
+	sp->src.next_input_byte = (const JOCTET*) tif->tif_rawdata;
+	sp->src.bytes_in_buffer = (size_t) tif->tif_rawcc;
+}
+
+static boolean
+std_fill_input_buffer(j_decompress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState* ) cinfo;
+	static const JOCTET dummy_EOI[2] = { 0xFF, JPEG_EOI };
+
+	/*
+	 * Should never get here since entire strip/tile is
+	 * read into memory before the decompressor is called,
+	 * and thus was supplied by init_source.
+	 */
+	WARNMS(cinfo, JWRN_JPEG_EOF);
+	/* insert a fake EOI marker */
+	sp->src.next_input_byte = dummy_EOI;
+	sp->src.bytes_in_buffer = 2;
+	return (TRUE);
+}
+
+static void
+std_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+
+	if (num_bytes > 0) {
+		if (num_bytes > (long) sp->src.bytes_in_buffer) {
+			/* oops, buffer overrun */
+			(void) std_fill_input_buffer(cinfo);
+		} else {
+			sp->src.next_input_byte += (size_t) num_bytes;
+			sp->src.bytes_in_buffer -= (size_t) num_bytes;
+		}
+	}
+}
+
+static void
+std_term_source(j_decompress_ptr cinfo)
+{
+	/* No work necessary here */
+	/* Or must we update tif->tif_rawcp, tif->tif_rawcc ??? */
+	/* (if so, need empty tables_term_source!) */
+	(void) cinfo;
+}
+
+static void
+TIFFjpeg_data_src(JPEGState* sp, TIFF* tif)
+{
+	(void) tif;
+	sp->cinfo.d.src = &sp->src;
+	sp->src.init_source = std_init_source;
+	sp->src.fill_input_buffer = std_fill_input_buffer;
+	sp->src.skip_input_data = std_skip_input_data;
+	sp->src.resync_to_restart = jpeg_resync_to_restart;
+	sp->src.term_source = std_term_source;
+	sp->src.bytes_in_buffer = 0;		/* for safety */
+	sp->src.next_input_byte = NULL;
+}
+
+/*
+ * Alternate source manager for reading from JPEGTables.
+ * We can share all the code except for the init routine.
+ */
+
+static void
+tables_init_source(j_decompress_ptr cinfo)
+{
+	JPEGState* sp = (JPEGState*) cinfo;
+
+	sp->src.next_input_byte = (const JOCTET*) sp->jpegtables;
+	sp->src.bytes_in_buffer = (size_t) sp->jpegtables_length;
+}
+
+static void
+TIFFjpeg_tables_src(JPEGState* sp, TIFF* tif)
+{
+	TIFFjpeg_data_src(sp, tif);
+	sp->src.init_source = tables_init_source;
+}
+
+/*
+ * Allocate downsampled-data buffers needed for downsampled I/O.
+ * We use values computed in jpeg_start_compress or jpeg_start_decompress.
+ * We use libjpeg's allocator so that buffers will be released automatically
+ * when done with strip/tile.
+ * This is also a handy place to compute samplesperclump, bytesperline.
+ */
+static int
+alloc_downsampled_buffers(TIFF* tif, jpeg_component_info* comp_info,
+			  int num_components)
+{
+	JPEGState* sp = JState(tif);
+	int ci;
+	jpeg_component_info* compptr;
+	JSAMPARRAY buf;
+	int samples_per_clump = 0;
+
+	for (ci = 0, compptr = comp_info; ci < num_components;
+	     ci++, compptr++) {
+		samples_per_clump += compptr->h_samp_factor *
+			compptr->v_samp_factor;
+		buf = TIFFjpeg_alloc_sarray(sp, JPOOL_IMAGE,
+				compptr->width_in_blocks * DCTSIZE,
+				(JDIMENSION) (compptr->v_samp_factor*DCTSIZE));
+		if (buf == NULL)
+			return (0);
+		sp->ds_buffer[ci] = buf;
+	}
+	sp->samplesperclump = samples_per_clump;
+	return (1);
+}
+
+
+/*
+ * JPEG Decoding.
+ */
+
+static int
+JPEGSetupDecode(TIFF* tif)
+{
+	JPEGState* sp = JState(tif);
+	TIFFDirectory *td = &tif->tif_dir;
+
+        JPEGInitializeLibJPEG( tif );
+
+	assert(sp != NULL);
+	assert(sp->cinfo.comm.is_decompressor);
+
+	/* Read JPEGTables if it is present */
+	if (TIFFFieldSet(tif,FIELD_JPEGTABLES)) {
+		TIFFjpeg_tables_src(sp, tif);
+		if(TIFFjpeg_read_header(sp,FALSE) != JPEG_HEADER_TABLES_ONLY) {
+			TIFFError("JPEGSetupDecode", "Bogus JPEGTables field");
+			return (0);
+		}
+	}
+
+	/* Grab parameters that are same for all strips/tiles */
+	sp->photometric = td->td_photometric;
+	switch (sp->photometric) {
+	case PHOTOMETRIC_YCBCR:
+		sp->h_sampling = td->td_ycbcrsubsampling[0];
+		sp->v_sampling = td->td_ycbcrsubsampling[1];
+		break;
+	default:
+		/* TIFF 6.0 forbids subsampling of all other color spaces */
+		sp->h_sampling = 1;
+		sp->v_sampling = 1;
+		break;
+	}
+
+	/* Set up for reading normal data */
+	TIFFjpeg_data_src(sp, tif);
+	tif->tif_postdecode = _TIFFNoPostDecode; /* override byte swapping */
+	return (1);
+}
+
+/*
+ * Set up for decoding a strip or tile.
+ */
+static int
+JPEGPreDecode(TIFF* tif, tsample_t s)
+{
+	JPEGState *sp = JState(tif);
+	TIFFDirectory *td = &tif->tif_dir;
+	static const char module[] = "JPEGPreDecode";
+	uint32 segment_width, segment_height;
+	int downsampled_output;
+	int ci;
+
+	assert(sp != NULL);
+	assert(sp->cinfo.comm.is_decompressor);
+	/*
+	 * Reset decoder state from any previous strip/tile,
+	 * in case application didn't read the whole strip.
+	 */
+	if (!TIFFjpeg_abort(sp))
+		return (0);
+	/*
+	 * Read the header for this strip/tile.
+	 */
+	if (TIFFjpeg_read_header(sp, TRUE) != JPEG_HEADER_OK)
+		return (0);
+	/*
+	 * Check image parameters and set decompression parameters.
+	 */
+	segment_width = td->td_imagewidth;
+	segment_height = td->td_imagelength - tif->tif_row;
+	if (isTiled(tif)) {
+                segment_width = td->td_tilewidth;
+                segment_height = td->td_tilelength;
+		sp->bytesperline = TIFFTileRowSize(tif);
+	} else {
+		if (segment_height > td->td_rowsperstrip)
+			segment_height = td->td_rowsperstrip;
+		sp->bytesperline = TIFFScanlineSize(tif);
+	}
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
+		/*
+		 * For PC 2, scale down the expected strip/tile size
+		 * to match a downsampled component
+		 */
+		segment_width = TIFFhowmany(segment_width, sp->h_sampling);
+		segment_height = TIFFhowmany(segment_height, sp->v_sampling);
+	}
+	if (sp->cinfo.d.image_width != segment_width ||
+	    sp->cinfo.d.image_height != segment_height) {
+		TIFFWarning(module, 
+                 "Improper JPEG strip/tile size, expected %dx%d, got %dx%d",
+                          segment_width, 
+                          segment_height,
+                          sp->cinfo.d.image_width, 
+                          sp->cinfo.d.image_height);
+	}
+	if (sp->cinfo.d.num_components !=
+	    (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+	     td->td_samplesperpixel : 1)) {
+		TIFFError(module, "Improper JPEG component count");
+		return (0);
+	}
+	if (sp->cinfo.d.data_precision != td->td_bitspersample) {
+		TIFFError(module, "Improper JPEG data precision");
+		return (0);
+	}
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+		/* Component 0 should have expected sampling factors */
+		if (sp->cinfo.d.comp_info[0].h_samp_factor != sp->h_sampling ||
+		    sp->cinfo.d.comp_info[0].v_samp_factor != sp->v_sampling) {
+			TIFFWarning(module, 
+                                    "Improper JPEG sampling factors %d,%d\n"
+                                    "Apparently should be %d,%d, "
+                                    "decompressor will try reading with "
+                                    "sampling %d,%d",
+                                    sp->cinfo.d.comp_info[0].h_samp_factor,
+                                    sp->cinfo.d.comp_info[0].v_samp_factor,
+                                    sp->h_sampling, 
+                                    sp->v_sampling,
+                                    sp->cinfo.d.comp_info[0].h_samp_factor,
+                                    sp->cinfo.d.comp_info[0].v_samp_factor );
+
+                        sp->h_sampling = (uint16)
+                            sp->cinfo.d.comp_info[0].h_samp_factor;
+                        sp->v_sampling = (uint16)
+                            sp->cinfo.d.comp_info[0].v_samp_factor;
+		}
+		/* Rest should have sampling factors 1,1 */
+		for (ci = 1; ci < sp->cinfo.d.num_components; ci++) {
+			if (sp->cinfo.d.comp_info[ci].h_samp_factor != 1 ||
+			    sp->cinfo.d.comp_info[ci].v_samp_factor != 1) {
+				TIFFError(module, "Improper JPEG sampling factors");
+				return (0);
+			}
+		}
+	} else {
+		/* PC 2's single component should have sampling factors 1,1 */
+		if (sp->cinfo.d.comp_info[0].h_samp_factor != 1 ||
+		    sp->cinfo.d.comp_info[0].v_samp_factor != 1) {
+			TIFFError(module, "Improper JPEG sampling factors");
+			return (0);
+		}
+	}
+	downsampled_output = FALSE;
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+	    sp->photometric == PHOTOMETRIC_YCBCR &&
+	    sp->jpegcolormode == JPEGCOLORMODE_RGB) {
+    	/* Convert YCbCr to RGB */
+		sp->cinfo.d.jpeg_color_space = JCS_YCbCr;
+		sp->cinfo.d.out_color_space = JCS_RGB;
+	} else {
+			/* Suppress colorspace handling */
+		sp->cinfo.d.jpeg_color_space = JCS_UNKNOWN;
+		sp->cinfo.d.out_color_space = JCS_UNKNOWN;
+		if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+		    (sp->h_sampling != 1 || sp->v_sampling != 1))
+			downsampled_output = TRUE;
+		/* XXX what about up-sampling? */
+	}
+	if (downsampled_output) {
+		/* Need to use raw-data interface to libjpeg */
+		sp->cinfo.d.raw_data_out = TRUE;
+		tif->tif_decoderow = JPEGDecodeRaw;
+		tif->tif_decodestrip = JPEGDecodeRaw;
+		tif->tif_decodetile = JPEGDecodeRaw;
+	} else {
+		/* Use normal interface to libjpeg */
+		sp->cinfo.d.raw_data_out = FALSE;
+		tif->tif_decoderow = JPEGDecode;
+		tif->tif_decodestrip = JPEGDecode;
+		tif->tif_decodetile = JPEGDecode;
+	}
+	/* Start JPEG decompressor */
+	if (!TIFFjpeg_start_decompress(sp))
+		return (0);
+	/* Allocate downsampled-data buffers if needed */
+	if (downsampled_output) {
+		if (!alloc_downsampled_buffers(tif, sp->cinfo.d.comp_info,
+					       sp->cinfo.d.num_components))
+			return (0);
+		sp->scancount = DCTSIZE;	/* mark buffer empty */
+	}
+	return (1);
+}
+
+/*
+ * Decode a chunk of pixels.
+ * "Standard" case: returned data is not downsampled.
+ */
+/*ARGSUSED*/ static int
+JPEGDecode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+    JPEGState *sp = JState(tif);
+    tsize_t nrows;
+
+    nrows = cc / sp->bytesperline;
+    if (cc % sp->bytesperline)
+        TIFFWarning(tif->tif_name, "fractional scanline not read");
+
+    if( nrows > (int) sp->cinfo.d.image_height )
+        nrows = sp->cinfo.d.image_height;
+
+    /* data is expected to be read in multiples of a scanline */
+    if (nrows)
+    {
+        do {
+            JSAMPROW bufptr = (JSAMPROW)buf;
+
+            if (TIFFjpeg_read_scanlines(sp, &bufptr, 1) != 1)
+                return (0);
+            ++tif->tif_row;
+            buf += sp->bytesperline;
+            cc -= sp->bytesperline;
+        } while (--nrows > 0);
+    }
+    /* Close down the decompressor if we've finished the strip or tile. */
+    return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
+        || TIFFjpeg_finish_decompress(sp);
+}
+
+/*
+ * Decode a chunk of pixels.
+ * Returned data is downsampled per sampling factors.
+ */
+/*ARGSUSED*/ static int
+JPEGDecodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+	JPEGState *sp = JState(tif);
+	tsize_t nrows;
+
+	/* data is expected to be read in multiples of a scanline */
+	if ( (nrows = sp->cinfo.d.image_height) ) {
+		/* Cb,Cr both have sampling factors 1, so this is correct */
+		JDIMENSION clumps_per_line = sp->cinfo.d.comp_info[1].downsampled_width;
+		int samples_per_clump = sp->samplesperclump;
+	
+		do {
+			jpeg_component_info *compptr;
+			int ci, clumpoffset;
+
+			/* Reload downsampled-data buffer if needed */
+			if (sp->scancount >= DCTSIZE) {
+				int n = sp->cinfo.d.max_v_samp_factor * DCTSIZE;
+
+				if (TIFFjpeg_read_raw_data(sp, sp->ds_buffer, n)
+					!= n)
+					return (0);
+				sp->scancount = 0;
+			}
+			/*
+			 * Fastest way to unseparate data is to make one pass
+			 * over the scanline for each row of each component.
+			 */
+			clumpoffset = 0;	/* first sample in clump */
+			for (ci = 0, compptr = sp->cinfo.d.comp_info;
+			     ci < sp->cinfo.d.num_components;
+			     ci++, compptr++) {
+			    int hsamp = compptr->h_samp_factor;
+			    int vsamp = compptr->v_samp_factor;
+			    int ypos;
+
+			    for (ypos = 0; ypos < vsamp; ypos++) {
+				JSAMPLE *inptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
+				JSAMPLE *outptr = (JSAMPLE*)buf + clumpoffset;
+				JDIMENSION nclump;
+
+				if (hsamp == 1) {
+				    /* fast path for at least Cb and Cr */
+				    for (nclump = clumps_per_line; nclump-- > 0; ) {
+					outptr[0] = *inptr++;
+					outptr += samples_per_clump;
+				    }
+				} else {
+					int xpos;
+
+				    /* general case */
+				    for (nclump = clumps_per_line; nclump-- > 0; ) {
+					for (xpos = 0; xpos < hsamp; xpos++)
+					    outptr[xpos] = *inptr++;
+					outptr += samples_per_clump;
+				    }
+				}
+				clumpoffset += hsamp;
+			    }
+			}
+			++sp->scancount;
+			++tif->tif_row;
+			buf += sp->bytesperline;
+			cc -= sp->bytesperline;
+		} while (--nrows > 0);
+	}
+
+        /* Close down the decompressor if done. */
+        return sp->cinfo.d.output_scanline < sp->cinfo.d.output_height
+       	    || TIFFjpeg_finish_decompress(sp);
+}
+
+
+/*
+ * JPEG Encoding.
+ */
+
+static void
+unsuppress_quant_table (JPEGState* sp, int tblno)
+{
+	JQUANT_TBL* qtbl;
+
+	if ((qtbl = sp->cinfo.c.quant_tbl_ptrs[tblno]) != NULL)
+		qtbl->sent_table = FALSE;
+}
+
+static void
+unsuppress_huff_table (JPEGState* sp, int tblno)
+{
+	JHUFF_TBL* htbl;
+
+	if ((htbl = sp->cinfo.c.dc_huff_tbl_ptrs[tblno]) != NULL)
+		htbl->sent_table = FALSE;
+	if ((htbl = sp->cinfo.c.ac_huff_tbl_ptrs[tblno]) != NULL)
+		htbl->sent_table = FALSE;
+}
+
+static int
+prepare_JPEGTables(TIFF* tif)
+{
+	JPEGState* sp = JState(tif);
+
+        JPEGInitializeLibJPEG( tif );
+
+	/* Initialize quant tables for current quality setting */
+	if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
+		return (0);
+	/* Mark only the tables we want for output */
+	/* NB: chrominance tables are currently used only with YCbCr */
+	if (!TIFFjpeg_suppress_tables(sp, TRUE))
+		return (0);
+	if (sp->jpegtablesmode & JPEGTABLESMODE_QUANT) {
+		unsuppress_quant_table(sp, 0);
+		if (sp->photometric == PHOTOMETRIC_YCBCR)
+			unsuppress_quant_table(sp, 1);
+	}
+	if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF) {
+		unsuppress_huff_table(sp, 0);
+		if (sp->photometric == PHOTOMETRIC_YCBCR)
+			unsuppress_huff_table(sp, 1);
+	}
+	/* Direct libjpeg output into jpegtables */
+	if (!TIFFjpeg_tables_dest(sp, tif))
+		return (0);
+	/* Emit tables-only datastream */
+	if (!TIFFjpeg_write_tables(sp))
+		return (0);
+
+	return (1);
+}
+
+static int
+JPEGSetupEncode(TIFF* tif)
+{
+	JPEGState* sp = JState(tif);
+	TIFFDirectory *td = &tif->tif_dir;
+	static const char module[] = "JPEGSetupEncode";
+
+        JPEGInitializeLibJPEG( tif );
+
+	assert(sp != NULL);
+	assert(!sp->cinfo.comm.is_decompressor);
+
+	/*
+	 * Initialize all JPEG parameters to default values.
+	 * Note that jpeg_set_defaults needs legal values for
+	 * in_color_space and input_components.
+	 */
+	sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+	sp->cinfo.c.input_components = 1;
+	if (!TIFFjpeg_set_defaults(sp))
+		return (0);
+	/* Set per-file parameters */
+	sp->photometric = td->td_photometric;
+	switch (sp->photometric) {
+	case PHOTOMETRIC_YCBCR:
+		sp->h_sampling = td->td_ycbcrsubsampling[0];
+		sp->v_sampling = td->td_ycbcrsubsampling[1];
+		/*
+		 * A ReferenceBlackWhite field *must* be present since the
+		 * default value is inappropriate for YCbCr.  Fill in the
+		 * proper value if application didn't set it.
+		 */
+		if (!TIFFFieldSet(tif, FIELD_REFBLACKWHITE)) {
+			float refbw[6];
+			long top = 1L << td->td_bitspersample;
+			refbw[0] = 0;
+			refbw[1] = (float)(top-1L);
+			refbw[2] = (float)(top>>1);
+			refbw[3] = refbw[1];
+			refbw[4] = refbw[2];
+			refbw[5] = refbw[1];
+			TIFFSetField(tif, TIFFTAG_REFERENCEBLACKWHITE, refbw);
+		}
+		break;
+	case PHOTOMETRIC_PALETTE:		/* disallowed by Tech Note */
+	case PHOTOMETRIC_MASK:
+		TIFFError(module,
+			  "PhotometricInterpretation %d not allowed for JPEG",
+			  (int) sp->photometric);
+		return (0);
+	default:
+		/* TIFF 6.0 forbids subsampling of all other color spaces */
+		sp->h_sampling = 1;
+		sp->v_sampling = 1;
+		break;
+	}
+	
+	/* Verify miscellaneous parameters */
+
+	/*
+	 * This would need work if libtiff ever supports different
+	 * depths for different components, or if libjpeg ever supports
+	 * run-time selection of depth.  Neither is imminent.
+	 */
+	if (td->td_bitspersample != BITS_IN_JSAMPLE) {
+		TIFFError(module, "BitsPerSample %d not allowed for JPEG",
+			  (int) td->td_bitspersample);
+		return (0);
+	}
+	sp->cinfo.c.data_precision = td->td_bitspersample;
+	if (isTiled(tif)) {
+		if ((td->td_tilelength % (sp->v_sampling * DCTSIZE)) != 0) {
+			TIFFError(module,
+				  "JPEG tile height must be multiple of %d",
+				  sp->v_sampling * DCTSIZE);
+			return (0);
+		}
+		if ((td->td_tilewidth % (sp->h_sampling * DCTSIZE)) != 0) {
+			TIFFError(module,
+				  "JPEG tile width must be multiple of %d",
+				  sp->h_sampling * DCTSIZE);
+			return (0);
+		}
+	} else {
+		if (td->td_rowsperstrip < td->td_imagelength &&
+		    (td->td_rowsperstrip % (sp->v_sampling * DCTSIZE)) != 0) {
+			TIFFError(module,
+				  "RowsPerStrip must be multiple of %d for JPEG",
+				  sp->v_sampling * DCTSIZE);
+			return (0);
+		}
+	}
+
+	/* Create a JPEGTables field if appropriate */
+	if (sp->jpegtablesmode & (JPEGTABLESMODE_QUANT|JPEGTABLESMODE_HUFF)) {
+		if (!prepare_JPEGTables(tif))
+			return (0);
+		/* Mark the field present */
+		/* Can't use TIFFSetField since BEENWRITING is already set! */
+		TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
+		tif->tif_flags |= TIFF_DIRTYDIRECT;
+	} else {
+		/* We do not support application-supplied JPEGTables, */
+		/* so mark the field not present */
+		TIFFClrFieldBit(tif, FIELD_JPEGTABLES);
+	}
+
+	/* Direct libjpeg output to libtiff's output buffer */
+	TIFFjpeg_data_dest(sp, tif);
+
+	return (1);
+}
+
+/*
+ * Set encoding state at the start of a strip or tile.
+ */
+static int
+JPEGPreEncode(TIFF* tif, tsample_t s)
+{
+	JPEGState *sp = JState(tif);
+	TIFFDirectory *td = &tif->tif_dir;
+	static const char module[] = "JPEGPreEncode";
+	uint32 segment_width, segment_height;
+	int downsampled_input;
+
+	assert(sp != NULL);
+	assert(!sp->cinfo.comm.is_decompressor);
+	/*
+	 * Set encoding parameters for this strip/tile.
+	 */
+	if (isTiled(tif)) {
+		segment_width = td->td_tilewidth;
+		segment_height = td->td_tilelength;
+		sp->bytesperline = TIFFTileRowSize(tif);
+	} else {
+		segment_width = td->td_imagewidth;
+		segment_height = td->td_imagelength - tif->tif_row;
+		if (segment_height > td->td_rowsperstrip)
+			segment_height = td->td_rowsperstrip;
+		sp->bytesperline = TIFFScanlineSize(tif);
+	}
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE && s > 0) {
+		/* for PC 2, scale down the strip/tile size
+		 * to match a downsampled component
+		 */
+		segment_width = TIFFhowmany(segment_width, sp->h_sampling);
+		segment_height = TIFFhowmany(segment_height, sp->v_sampling);
+	}
+	if (segment_width > 65535 || segment_height > 65535) {
+		TIFFError(module, "Strip/tile too large for JPEG");
+		return (0);
+	}
+	sp->cinfo.c.image_width = segment_width;
+	sp->cinfo.c.image_height = segment_height;
+	downsampled_input = FALSE;
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+		sp->cinfo.c.input_components = td->td_samplesperpixel;
+		if (sp->photometric == PHOTOMETRIC_YCBCR) {
+			if (sp->jpegcolormode == JPEGCOLORMODE_RGB) {
+				sp->cinfo.c.in_color_space = JCS_RGB;
+			} else {
+				sp->cinfo.c.in_color_space = JCS_YCbCr;
+				if (sp->h_sampling != 1 || sp->v_sampling != 1)
+					downsampled_input = TRUE;
+			}
+			if (!TIFFjpeg_set_colorspace(sp, JCS_YCbCr))
+				return (0);
+			/*
+			 * Set Y sampling factors;
+			 * we assume jpeg_set_colorspace() set the rest to 1
+			 */
+			sp->cinfo.c.comp_info[0].h_samp_factor = sp->h_sampling;
+			sp->cinfo.c.comp_info[0].v_samp_factor = sp->v_sampling;
+		} else {
+			sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+			if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
+				return (0);
+			/* jpeg_set_colorspace set all sampling factors to 1 */
+		}
+	} else {
+		sp->cinfo.c.input_components = 1;
+		sp->cinfo.c.in_color_space = JCS_UNKNOWN;
+		if (!TIFFjpeg_set_colorspace(sp, JCS_UNKNOWN))
+			return (0);
+		sp->cinfo.c.comp_info[0].component_id = s;
+		/* jpeg_set_colorspace() set sampling factors to 1 */
+		if (sp->photometric == PHOTOMETRIC_YCBCR && s > 0) {
+			sp->cinfo.c.comp_info[0].quant_tbl_no = 1;
+			sp->cinfo.c.comp_info[0].dc_tbl_no = 1;
+			sp->cinfo.c.comp_info[0].ac_tbl_no = 1;
+		}
+	}
+	/* ensure libjpeg won't write any extraneous markers */
+	sp->cinfo.c.write_JFIF_header = FALSE;
+	sp->cinfo.c.write_Adobe_marker = FALSE;
+	/* set up table handling correctly */
+	if (! (sp->jpegtablesmode & JPEGTABLESMODE_QUANT)) {
+		if (!TIFFjpeg_set_quality(sp, sp->jpegquality, FALSE))
+			return (0);
+		unsuppress_quant_table(sp, 0);
+		unsuppress_quant_table(sp, 1);
+	}
+	if (sp->jpegtablesmode & JPEGTABLESMODE_HUFF)
+		sp->cinfo.c.optimize_coding = FALSE;
+	else
+		sp->cinfo.c.optimize_coding = TRUE;
+	if (downsampled_input) {
+		/* Need to use raw-data interface to libjpeg */
+		sp->cinfo.c.raw_data_in = TRUE;
+		tif->tif_encoderow = JPEGEncodeRaw;
+		tif->tif_encodestrip = JPEGEncodeRaw;
+		tif->tif_encodetile = JPEGEncodeRaw;
+	} else {
+		/* Use normal interface to libjpeg */
+		sp->cinfo.c.raw_data_in = FALSE;
+		tif->tif_encoderow = JPEGEncode;
+		tif->tif_encodestrip = JPEGEncode;
+		tif->tif_encodetile = JPEGEncode;
+	}
+	/* Start JPEG compressor */
+	if (!TIFFjpeg_start_compress(sp, FALSE))
+		return (0);
+	/* Allocate downsampled-data buffers if needed */
+	if (downsampled_input) {
+		if (!alloc_downsampled_buffers(tif, sp->cinfo.c.comp_info,
+					       sp->cinfo.c.num_components))
+			return (0);
+	}
+	sp->scancount = 0;
+
+	return (1);
+}
+
+/*
+ * Encode a chunk of pixels.
+ * "Standard" case: incoming data is not downsampled.
+ */
+static int
+JPEGEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+	JPEGState *sp = JState(tif);
+	tsize_t nrows;
+	JSAMPROW bufptr[1];
+
+	(void) s;
+	assert(sp != NULL);
+	/* data is expected to be supplied in multiples of a scanline */
+	nrows = cc / sp->bytesperline;
+	if (cc % sp->bytesperline)
+		TIFFWarning(tif->tif_name, "fractional scanline discarded");
+
+	while (nrows-- > 0) {
+		bufptr[0] = (JSAMPROW) buf;
+		if (TIFFjpeg_write_scanlines(sp, bufptr, 1) != 1)
+			return (0);
+		if (nrows > 0)
+			tif->tif_row++;
+		buf += sp->bytesperline;
+	}
+	return (1);
+}
+
+/*
+ * Encode a chunk of pixels.
+ * Incoming data is expected to be downsampled per sampling factors.
+ */
+static int
+JPEGEncodeRaw(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+	JPEGState *sp = JState(tif);
+	JSAMPLE* inptr;
+	JSAMPLE* outptr;
+	tsize_t nrows;
+	JDIMENSION clumps_per_line, nclump;
+	int clumpoffset, ci, xpos, ypos;
+	jpeg_component_info* compptr;
+	int samples_per_clump = sp->samplesperclump;
+
+	(void) s;
+	assert(sp != NULL);
+	/* data is expected to be supplied in multiples of a scanline */
+	nrows = cc / sp->bytesperline;
+	if (cc % sp->bytesperline)
+		TIFFWarning(tif->tif_name, "fractional scanline discarded");
+
+	/* Cb,Cr both have sampling factors 1, so this is correct */
+	clumps_per_line = sp->cinfo.c.comp_info[1].downsampled_width;
+
+	while (nrows-- > 0) {
+		/*
+		 * Fastest way to separate the data is to make one pass
+		 * over the scanline for each row of each component.
+		 */
+		clumpoffset = 0;		/* first sample in clump */
+		for (ci = 0, compptr = sp->cinfo.c.comp_info;
+		     ci < sp->cinfo.c.num_components;
+		     ci++, compptr++) {
+		    int hsamp = compptr->h_samp_factor;
+		    int vsamp = compptr->v_samp_factor;
+		    int padding = (int) (compptr->width_in_blocks * DCTSIZE -
+					 clumps_per_line * hsamp);
+		    for (ypos = 0; ypos < vsamp; ypos++) {
+			inptr = ((JSAMPLE*) buf) + clumpoffset;
+			outptr = sp->ds_buffer[ci][sp->scancount*vsamp + ypos];
+			if (hsamp == 1) {
+			    /* fast path for at least Cb and Cr */
+			    for (nclump = clumps_per_line; nclump-- > 0; ) {
+				*outptr++ = inptr[0];
+				inptr += samples_per_clump;
+			    }
+			} else {
+			    /* general case */
+			    for (nclump = clumps_per_line; nclump-- > 0; ) {
+				for (xpos = 0; xpos < hsamp; xpos++)
+				    *outptr++ = inptr[xpos];
+				inptr += samples_per_clump;
+			    }
+			}
+			/* pad each scanline as needed */
+			for (xpos = 0; xpos < padding; xpos++) {
+			    *outptr = outptr[-1];
+			    outptr++;
+			}
+			clumpoffset += hsamp;
+		    }
+		}
+		sp->scancount++;
+		if (sp->scancount >= DCTSIZE) {
+			int n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
+			if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
+				return (0);
+			sp->scancount = 0;
+		}
+		if (nrows > 0)
+			tif->tif_row++;
+		buf += sp->bytesperline;
+	}
+	return (1);
+}
+
+/*
+ * Finish up at the end of a strip or tile.
+ */
+static int
+JPEGPostEncode(TIFF* tif)
+{
+	JPEGState *sp = JState(tif);
+
+	if (sp->scancount > 0) {
+		/*
+		 * Need to emit a partial bufferload of downsampled data.
+		 * Pad the data vertically.
+		 */
+		int ci, ypos, n;
+		jpeg_component_info* compptr;
+
+		for (ci = 0, compptr = sp->cinfo.c.comp_info;
+		     ci < sp->cinfo.c.num_components;
+		     ci++, compptr++) {
+			int vsamp = compptr->v_samp_factor;
+			tsize_t row_width = compptr->width_in_blocks * DCTSIZE
+				* sizeof(JSAMPLE);
+			for (ypos = sp->scancount * vsamp;
+			     ypos < DCTSIZE * vsamp; ypos++) {
+				_TIFFmemcpy((tdata_t)sp->ds_buffer[ci][ypos],
+					    (tdata_t)sp->ds_buffer[ci][ypos-1],
+					    row_width);
+
+			}
+		}
+		n = sp->cinfo.c.max_v_samp_factor * DCTSIZE;
+		if (TIFFjpeg_write_raw_data(sp, sp->ds_buffer, n) != n)
+			return (0);
+	}
+
+	return (TIFFjpeg_finish_compress(JState(tif)));
+}
+
+static void
+JPEGCleanup(TIFF* tif)
+{
+	if (tif->tif_data) {
+		JPEGState *sp = JState(tif);
+                if( sp->cinfo_initialized )
+                    TIFFjpeg_destroy(sp);	/* release libjpeg resources */
+		if (sp->jpegtables)		/* tag value */
+			_TIFFfree(sp->jpegtables);
+		_TIFFfree(tif->tif_data);	/* release local state */
+		tif->tif_data = NULL;
+	}
+}
+
+static int
+JPEGVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	JPEGState* sp = JState(tif);
+	TIFFDirectory* td = &tif->tif_dir;
+	uint32 v32;
+
+	switch (tag) {
+	case TIFFTAG_JPEGTABLES:
+		v32 = va_arg(ap, uint32);
+		if (v32 == 0) {
+			/* XXX */
+			return (0);
+		}
+		_TIFFsetByteArray(&sp->jpegtables, va_arg(ap, void*),
+		    (long) v32);
+		sp->jpegtables_length = v32;
+		TIFFSetFieldBit(tif, FIELD_JPEGTABLES);
+		break;
+	case TIFFTAG_JPEGQUALITY:
+		sp->jpegquality = va_arg(ap, int);
+		return (1);			/* pseudo tag */
+	case TIFFTAG_JPEGCOLORMODE:
+		sp->jpegcolormode = va_arg(ap, int);
+		/*
+		 * Mark whether returned data is up-sampled or not
+		 * so TIFFStripSize and TIFFTileSize return values
+		 * that reflect the true amount of data.
+		 */
+		tif->tif_flags &= ~TIFF_UPSAMPLED;
+		if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+		    if (td->td_photometric == PHOTOMETRIC_YCBCR &&
+		      sp->jpegcolormode == JPEGCOLORMODE_RGB) {
+			tif->tif_flags |= TIFF_UPSAMPLED;
+		    } else {
+			if (td->td_ycbcrsubsampling[0] != 1 ||
+			    td->td_ycbcrsubsampling[1] != 1)
+			    ; /* XXX what about up-sampling? */
+		    }
+		}
+		/*
+		 * Must recalculate cached tile size
+		 * in case sampling state changed.
+		 */
+		tif->tif_tilesize = TIFFTileSize(tif);
+		return (1);			/* pseudo tag */
+	case TIFFTAG_JPEGTABLESMODE:
+		sp->jpegtablesmode = va_arg(ap, int);
+		return (1);			/* pseudo tag */
+	case TIFFTAG_YCBCRSUBSAMPLING:
+                /* mark the fact that we have a real ycbcrsubsampling! */
+		sp->ycbcrsampling_fetched = 1;
+		return (*sp->vsetparent)(tif, tag, ap);
+	default:
+		return (*sp->vsetparent)(tif, tag, ap);
+	}
+	tif->tif_flags |= TIFF_DIRTYDIRECT;
+	return (1);
+}
+
+/*
+ * Some JPEG-in-TIFF produces do not emit the YCBCRSUBSAMPLING values in
+ * the TIFF tags, but still use non-default (2,2) values within the jpeg
+ * data stream itself.  In order for TIFF applications to work properly
+ * - for instance to get the strip buffer size right - it is imperative
+ * that the subsampling be available before we start reading the image
+ * data normally.  This function will attempt to load the first strip in
+ * order to get the sampling values from the jpeg data stream.  Various
+ * hacks are various places are done to ensure this function gets called
+ * before the td_ycbcrsubsampling values are used from the directory structure,
+ * including calling TIFFGetField() for the YCBCRSUBSAMPLING field from 
+ * TIFFStripSize(), and the printing code in tif_print.c. 
+ *
+ * Note that JPEGPreDeocode() will produce a fairly loud warning when the
+ * discovered sampling does not match the default sampling (2,2) or whatever
+ * was actually in the tiff tags. 
+ *
+ * Problems:
+ *  o This code will cause one whole strip/tile of compressed data to be
+ *    loaded just to get the tags right, even if the imagery is never read.
+ *    It would be more efficient to just load a bit of the header, and
+ *    initialize things from that. 
+ *
+ * See the bug in bugzilla for details:
+ *
+ * http://bugzilla.remotesensing.org/show_bug.cgi?id=168
+ *
+ * Frank Warmerdam, July 2002
+ */
+
+static void 
+JPEGFixupTestSubsampling( TIFF * tif )
+{
+#if CHECK_JPEG_YCBCR_SUBSAMPLING == 1
+    JPEGState *sp = JState(tif);
+    TIFFDirectory *td = &tif->tif_dir;
+
+    JPEGInitializeLibJPEG( tif );
+
+    /*
+     * Some JPEG-in-TIFF files don't provide the ycbcrsampling tags, 
+     * and use a sampling schema other than the default 2,2.  To handle
+     * this we actually have to scan the header of a strip or tile of
+     * jpeg data to get the sampling.  
+     */
+    if( !sp->cinfo.comm.is_decompressor 
+        || sp->ycbcrsampling_fetched  
+        || td->td_photometric != PHOTOMETRIC_YCBCR )
+        return;
+
+    sp->ycbcrsampling_fetched = 1;
+    if( TIFFIsTiled( tif ) )
+    {
+        if( !TIFFFillTile( tif, 0 ) )
+            return;
+    }
+    else
+    {
+        if( !TIFFFillStrip( tif, 0 ) )
+            return;
+    }
+
+    TIFFSetField( tif, TIFFTAG_YCBCRSUBSAMPLING, 
+                  (uint16) sp->h_sampling, (uint16) sp->v_sampling );
+#endif /* CHECK_JPEG_YCBCR_SUBSAMPLING == 1 */
+}
+
+static int
+JPEGVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	JPEGState* sp = JState(tif);
+
+	switch (tag) {
+	case TIFFTAG_JPEGTABLES:
+		/* u_short is bogus --- should be uint32 ??? */
+		/* TIFFWriteNormalTag needs fixed  XXX */
+		*va_arg(ap, u_short*) = (u_short) sp->jpegtables_length;
+		*va_arg(ap, void**) = sp->jpegtables;
+		break;
+	case TIFFTAG_JPEGQUALITY:
+		*va_arg(ap, int*) = sp->jpegquality;
+		break;
+	case TIFFTAG_JPEGCOLORMODE:
+		*va_arg(ap, int*) = sp->jpegcolormode;
+		break;
+	case TIFFTAG_JPEGTABLESMODE:
+		*va_arg(ap, int*) = sp->jpegtablesmode;
+		break;
+	case TIFFTAG_YCBCRSUBSAMPLING:
+                JPEGFixupTestSubsampling( tif );
+		return (*sp->vgetparent)(tif, tag, ap);
+		break;
+	default:
+		return (*sp->vgetparent)(tif, tag, ap);
+	}
+	return (1);
+}
+
+static void
+JPEGPrintDir(TIFF* tif, FILE* fd, long flags)
+{
+	JPEGState* sp = JState(tif);
+
+	(void) flags;
+	if (TIFFFieldSet(tif,FIELD_JPEGTABLES))
+		fprintf(fd, "  JPEG Tables: (%lu bytes)\n",
+			(u_long) sp->jpegtables_length);
+}
+
+static uint32
+JPEGDefaultStripSize(TIFF* tif, uint32 s)
+{
+	JPEGState* sp = JState(tif);
+	TIFFDirectory *td = &tif->tif_dir;
+
+	s = (*sp->defsparent)(tif, s);
+	if (s < td->td_imagelength)
+		s = TIFFroundup(s, td->td_ycbcrsubsampling[1] * DCTSIZE);
+	return (s);
+}
+
+static void
+JPEGDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+{
+	JPEGState* sp = JState(tif);
+	TIFFDirectory *td = &tif->tif_dir;
+
+	(*sp->deftparent)(tif, tw, th);
+	*tw = TIFFroundup(*tw, td->td_ycbcrsubsampling[0] * DCTSIZE);
+	*th = TIFFroundup(*th, td->td_ycbcrsubsampling[1] * DCTSIZE);
+}
+
+/*
+ * The JPEG library initialized used to be done in TIFFInitJPEG(), but
+ * now that we allow a TIFF file to be opened in update mode it is necessary
+ * to have some way of deciding whether compression or decompression is
+ * desired other than looking at tif->tif_mode.  We accomplish this by 
+ * examining {TILE/STRIP}BYTECOUNTS to see if there is a non-zero entry.
+ * If so, we assume decompression is desired. 
+ *
+ * This is tricky, because TIFFInitJPEG() is called while the directory is
+ * being read, and generally speaking the BYTECOUNTS tag won't have been read
+ * at that point.  So we try to defer jpeg library initialization till we
+ * do have that tag ... basically any access that might require the compressor
+ * or decompressor that occurs after the reading of the directory. 
+ *
+ * In an ideal world compressors or decompressors would be setup
+ * at the point where a single tile or strip was accessed (for read or write)
+ * so that stuff like update of missing tiles, or replacement of tiles could
+ * be done. However, we aren't trying to crack that nut just yet ...
+ *
+ * NFW, Feb 3rd, 2003.
+ */
+
+static int JPEGInitializeLibJPEG( TIFF * tif )
+{
+    JPEGState* sp = JState(tif);
+    uint32 *byte_counts = NULL;
+    int     data_is_empty = TRUE;
+
+    if( sp->cinfo_initialized )
+        return 1;
+
+    /*
+     * Do we have tile data already?  Make sure we initialize the
+     * the state in decompressor mode if we have tile data, even if we
+     * are not in read-only file access mode. 
+     */
+    if( TIFFIsTiled( tif ) 
+        && TIFFGetField( tif, TIFFTAG_TILEBYTECOUNTS, &byte_counts ) 
+        && byte_counts != NULL )
+    {
+        data_is_empty = byte_counts[0] == 0;
+    }
+    if( !TIFFIsTiled( tif ) 
+        && TIFFGetField( tif, TIFFTAG_STRIPBYTECOUNTS, &byte_counts) 
+        && byte_counts != NULL )
+    {
+        data_is_empty = byte_counts[0] == 0;
+    }
+
+    /*
+     * Initialize libjpeg.
+     */
+    if (tif->tif_mode == O_RDONLY || !data_is_empty ) {
+        if (!TIFFjpeg_create_decompress(sp))
+            return (0);
+
+    } else {
+        if (!TIFFjpeg_create_compress(sp))
+            return (0);
+    }
+
+    sp->cinfo_initialized = TRUE;
+
+    return 1;
+}
+
+int
+TIFFInitJPEG(TIFF* tif, int scheme)
+{
+	JPEGState* sp;
+
+	assert(scheme == COMPRESSION_JPEG);
+
+	/*
+	 * Allocate state block so tag methods have storage to record values.
+	 */
+	tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (JPEGState));
+
+	if (tif->tif_data == NULL) {
+		TIFFError("TIFFInitJPEG", "No space for JPEG state block");
+		return (0);
+	}
+        memset( tif->tif_data, 0, sizeof(JPEGState));
+
+	sp = JState(tif);
+	sp->tif = tif;				/* back link */
+
+	/*
+	 * Merge codec-specific tag information and
+	 * override parent get/set field methods.
+	 */
+	_TIFFMergeFieldInfo(tif, jpegFieldInfo, N(jpegFieldInfo));
+	sp->vgetparent = tif->tif_tagmethods.vgetfield;
+	tif->tif_tagmethods.vgetfield = JPEGVGetField;	/* hook for codec tags */
+	sp->vsetparent = tif->tif_tagmethods.vsetfield;
+	tif->tif_tagmethods.vsetfield = JPEGVSetField;	/* hook for codec tags */
+	tif->tif_tagmethods.printdir = JPEGPrintDir;	/* hook for codec tags */
+
+	/* Default values for codec-specific fields */
+	sp->jpegtables = NULL;
+	sp->jpegtables_length = 0;
+	sp->jpegquality = 75;			/* Default IJG quality */
+	sp->jpegcolormode = JPEGCOLORMODE_RAW;
+	sp->jpegtablesmode = JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF;
+
+        sp->ycbcrsampling_fetched = 0;
+
+	/*
+	 * Install codec methods.
+	 */
+	tif->tif_setupdecode = JPEGSetupDecode;
+	tif->tif_predecode = JPEGPreDecode;
+	tif->tif_decoderow = JPEGDecode;
+	tif->tif_decodestrip = JPEGDecode;
+	tif->tif_decodetile = JPEGDecode;
+	tif->tif_setupencode = JPEGSetupEncode;
+	tif->tif_preencode = JPEGPreEncode;
+	tif->tif_postencode = JPEGPostEncode;
+	tif->tif_encoderow = JPEGEncode;
+	tif->tif_encodestrip = JPEGEncode;
+	tif->tif_encodetile = JPEGEncode;
+	tif->tif_cleanup = JPEGCleanup;
+	sp->defsparent = tif->tif_defstripsize;
+	tif->tif_defstripsize = JPEGDefaultStripSize;
+	sp->deftparent = tif->tif_deftilesize;
+	tif->tif_deftilesize = JPEGDefaultTileSize;
+	tif->tif_flags |= TIFF_NOBITREV;	/* no bit reversal, please */
+
+        sp->cinfo_initialized = FALSE;
+
+        /*
+         * Mark the TIFFTAG_YCBCRSAMPLES as present even if it is not
+         * see: JPEGFixupTestSubsampling().
+         */
+        TIFFSetFieldBit( tif, FIELD_YCBCRSUBSAMPLING );
+
+	return (1);
+}
+#endif /* JPEG_SUPPORT */
diff --git a/src/tiff/tif_luv.c b/src/tiff/tif_luv.c
new file mode 100644
index 0000000..b6011f3
--- /dev/null
+++ b/src/tiff/tif_luv.c
@@ -0,0 +1,1586 @@
+/*
+ * Copyright (c) 1997 Greg Ward Larson
+ * Copyright (c) 1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler, Greg Larson and Silicon Graphics may not be used in any
+ * advertising or publicity relating to the software without the specific,
+ * prior written permission of Sam Leffler, Greg Larson and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER, GREG LARSON OR SILICON GRAPHICS BE LIABLE
+ * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef LOGLUV_SUPPORT
+
+/*
+ * TIFF Library.
+ * LogLuv compression support for high dynamic range images.
+ *
+ * Contributed by Greg Larson.
+ *
+ * LogLuv image support uses the TIFF library to store 16 or 10-bit
+ * log luminance values with 8 bits each of u and v or a 14-bit index.
+ *
+ * The codec can take as input and produce as output 32-bit IEEE float values 
+ * as well as 16-bit integer values.  A 16-bit luminance is interpreted
+ * as a sign bit followed by a 15-bit integer that is converted
+ * to and from a linear magnitude using the transformation:
+ *
+ *	L = 2^( (Le+.5)/256 - 64 )		# real from 15-bit
+ *
+ *	Le = floor( 256*(log2(L) + 64) )	# 15-bit from real
+ *
+ * The actual conversion to world luminance units in candelas per sq. meter
+ * requires an additional multiplier, which is stored in the TIFFTAG_STONITS.
+ * This value is usually set such that a reasonable exposure comes from
+ * clamping decoded luminances above 1 to 1 in the displayed image.
+ *
+ * The 16-bit values for u and v may be converted to real values by dividing
+ * each by 32768.  (This allows for negative values, which aren't useful as
+ * far as we know, but are left in case of future improvements in human
+ * color vision.)
+ *
+ * Conversion from (u,v), which is actually the CIE (u',v') system for
+ * you color scientists, is accomplished by the following transformation:
+ *
+ *	u = 4*x / (-2*x + 12*y + 3)
+ *	v = 9*y / (-2*x + 12*y + 3)
+ *
+ *	x = 9*u / (6*u - 16*v + 12)
+ *	y = 4*v / (6*u - 16*v + 12)
+ *
+ * This process is greatly simplified by passing 32-bit IEEE floats
+ * for each of three CIE XYZ coordinates.  The codec then takes care
+ * of conversion to and from LogLuv, though the application is still
+ * responsible for interpreting the TIFFTAG_STONITS calibration factor.
+ *
+ * By definition, a CIE XYZ vector of [1 1 1] corresponds to a neutral white
+ * point of (x,y)=(1/3,1/3).  However, most color systems assume some other
+ * white point, such as D65, and an absolute color conversion to XYZ then
+ * to another color space with a different white point may introduce an
+ * unwanted color cast to the image.  It is often desirable, therefore, to
+ * perform a white point conversion that maps the input white to [1 1 1]
+ * in XYZ, then record the original white point using the TIFFTAG_WHITEPOINT
+ * tag value.  A decoder that demands absolute color calibration may use
+ * this white point tag to get back the original colors, but usually it
+ * will be ignored and the new white point will be used instead that
+ * matches the output color space.
+ *
+ * Pixel information is compressed into one of two basic encodings, depending
+ * on the setting of the compression tag, which is one of COMPRESSION_SGILOG
+ * or COMPRESSION_SGILOG24.  For COMPRESSION_SGILOG, greyscale data is
+ * stored as:
+ *
+ *	 1       15
+ *	|-+---------------|
+ *
+ * COMPRESSION_SGILOG color data is stored as:
+ *
+ *	 1       15           8        8
+ *	|-+---------------|--------+--------|
+ *	 S       Le           ue       ve
+ *
+ * For the 24-bit COMPRESSION_SGILOG24 color format, the data is stored as:
+ *
+ *	     10           14
+ *	|----------|--------------|
+ *	     Le'          Ce
+ *
+ * There is no sign bit in the 24-bit case, and the (u,v) chromaticity is
+ * encoded as an index for optimal color resolution.  The 10 log bits are
+ * defined by the following conversions:
+ *
+ *	L = 2^((Le'+.5)/64 - 12)		# real from 10-bit
+ *
+ *	Le' = floor( 64*(log2(L) + 12) )	# 10-bit from real
+ *
+ * The 10 bits of the smaller format may be converted into the 15 bits of
+ * the larger format by multiplying by 4 and adding 13314.  Obviously,
+ * a smaller range of magnitudes is covered (about 5 orders of magnitude
+ * instead of 38), and the lack of a sign bit means that negative luminances
+ * are not allowed.  (Well, they aren't allowed in the real world, either,
+ * but they are useful for certain types of image processing.)
+ *
+ * The desired user format is controlled by the setting the internal
+ * pseudo tag TIFFTAG_SGILOGDATAFMT to one of:
+ *  SGILOGDATAFMT_FLOAT       = IEEE 32-bit float XYZ values
+ *  SGILOGDATAFMT_16BIT	      = 16-bit integer encodings of logL, u and v
+ * Raw data i/o is also possible using:
+ *  SGILOGDATAFMT_RAW         = 32-bit unsigned integer with encoded pixel
+ * In addition, the following decoding is provided for ease of display:
+ *  SGILOGDATAFMT_8BIT        = 8-bit default RGB gamma-corrected values
+ *
+ * For grayscale images, we provide the following data formats:
+ *  SGILOGDATAFMT_FLOAT       = IEEE 32-bit float Y values
+ *  SGILOGDATAFMT_16BIT       = 16-bit integer w/ encoded luminance
+ *  SGILOGDATAFMT_8BIT        = 8-bit gray monitor values
+ *
+ * Note that the COMPRESSION_SGILOG applies a simple run-length encoding
+ * scheme by separating the logL, u and v bytes for each row and applying
+ * a PackBits type of compression.  Since the 24-bit encoding is not
+ * adaptive, the 32-bit color format takes less space in many cases.
+ *
+ * Further control is provided over the conversion from higher-resolution
+ * formats to final encoded values through the pseudo tag
+ * TIFFTAG_SGILOGENCODE:
+ *  SGILOGENCODE_NODITHER     = do not dither encoded values
+ *  SGILOGENCODE_RANDITHER    = apply random dithering during encoding
+ *
+ * The default value of this tag is SGILOGENCODE_NODITHER for
+ * COMPRESSION_SGILOG to maximize run-length encoding and
+ * SGILOGENCODE_RANDITHER for COMPRESSION_SGILOG24 to turn
+ * quantization errors into noise.
+ */
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <math.h>
+
+/*
+ * State block for each open TIFF
+ * file using LogLuv compression/decompression.
+ */
+typedef	struct logLuvState LogLuvState;
+
+struct logLuvState {
+	int			user_datafmt;	/* user data format */
+	int			encode_meth;	/* encoding method */
+	int			pixel_size;	/* bytes per pixel */
+
+	tidata_t*		tbuf;		/* translation buffer */
+	int			tbuflen;	/* buffer length */
+	void (*tfunc)(LogLuvState*, tidata_t, int);
+
+	TIFFVSetMethod		vgetparent;	/* super-class method */
+	TIFFVSetMethod		vsetparent;	/* super-class method */
+};
+
+#define	DecoderState(tif)	((LogLuvState*) (tif)->tif_data)
+#define	EncoderState(tif)	((LogLuvState*) (tif)->tif_data)
+
+#define N(a)   (sizeof(a)/sizeof(a[0]))
+#define SGILOGDATAFMT_UNKNOWN	-1
+
+#define MINRUN		4	/* minimum run length */
+
+/*
+ * Decode a string of 16-bit gray pixels.
+ */
+static int
+LogL16Decode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+	LogLuvState* sp = DecoderState(tif);
+	int shft, i, npixels;
+	u_char* bp;
+	int16* tp;
+	int16 b;
+	int cc, rc;
+
+	assert(s == 0);
+	assert(sp != NULL);
+
+	npixels = occ / sp->pixel_size;
+
+	if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+		tp = (int16*) op;
+	else {
+		assert(sp->tbuflen >= npixels);
+		tp = (int16*) sp->tbuf;
+	}
+	_TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0]));
+
+	bp = (u_char*) tif->tif_rawcp;
+	cc = tif->tif_rawcc;
+					/* get each byte string */
+	for (shft = 2*8; (shft -= 8) >= 0; ) {
+		for (i = 0; i < npixels && cc > 0; )
+			if (*bp >= 128) {		/* run */
+				rc = *bp++ + (2-128);
+				b = (int16)(*bp++ << shft);
+				cc -= 2;
+				while (rc--)
+					tp[i++] |= b;
+			} else {			/* non-run */
+				rc = *bp++;		/* nul is noop */
+				while (--cc && rc--)
+					tp[i++] |= (int16)*bp++ << shft;
+			}
+		if (i != npixels) {
+			TIFFError(tif->tif_name,
+		"LogL16Decode: Not enough data at row %d (short %d pixels)",
+			    tif->tif_row, npixels - i);
+			tif->tif_rawcp = (tidata_t) bp;
+			tif->tif_rawcc = cc;
+			return (0);
+		}
+	}
+	(*sp->tfunc)(sp, op, npixels);
+	tif->tif_rawcp = (tidata_t) bp;
+	tif->tif_rawcc = cc;
+	return (1);
+}
+
+/*
+ * Decode a string of 24-bit pixels.
+ */
+static int
+LogLuvDecode24(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+	LogLuvState* sp = DecoderState(tif);
+	int cc, i, npixels;
+	u_char* bp;
+	uint32* tp;
+
+	assert(s == 0);
+	assert(sp != NULL);
+
+	npixels = occ / sp->pixel_size;
+
+	if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+		tp = (uint32 *)op;
+	else {
+		assert(sp->tbuflen >= npixels);
+		tp = (uint32 *) sp->tbuf;
+	}
+					/* copy to array of uint32 */
+	bp = (u_char*) tif->tif_rawcp;
+	cc = tif->tif_rawcc;
+	for (i = 0; i < npixels && cc > 0; i++) {
+		tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2];
+		bp += 3;
+		cc -= 3;
+	}
+	tif->tif_rawcp = (tidata_t) bp;
+	tif->tif_rawcc = cc;
+	if (i != npixels) {
+		TIFFError(tif->tif_name,
+	    "LogLuvDecode24: Not enough data at row %d (short %d pixels)",
+		    tif->tif_row, npixels - i);
+		return (0);
+	}
+	(*sp->tfunc)(sp, op, npixels);
+	return (1);
+}
+
+/*
+ * Decode a string of 32-bit pixels.
+ */
+static int
+LogLuvDecode32(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+	LogLuvState* sp;
+	int shft, i, npixels;
+	u_char* bp;
+	uint32* tp;
+	uint32 b;
+	int cc, rc;
+
+	assert(s == 0);
+	sp = DecoderState(tif);
+	assert(sp != NULL);
+
+	npixels = occ / sp->pixel_size;
+
+	if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+		tp = (uint32*) op;
+	else {
+		assert(sp->tbuflen >= npixels);
+		tp = (uint32*) sp->tbuf;
+	}
+	_TIFFmemset((tdata_t) tp, 0, npixels*sizeof (tp[0]));
+
+	bp = (u_char*) tif->tif_rawcp;
+	cc = tif->tif_rawcc;
+					/* get each byte string */
+	for (shft = 4*8; (shft -= 8) >= 0; ) {
+		for (i = 0; i < npixels && cc > 0; )
+			if (*bp >= 128) {		/* run */
+				rc = *bp++ + (2-128);
+				b = (uint32)*bp++ << shft;
+				cc -= 2;
+				while (rc--)
+					tp[i++] |= b;
+			} else {			/* non-run */
+				rc = *bp++;		/* nul is noop */
+				while (--cc && rc--)
+					tp[i++] |= (uint32)*bp++ << shft;
+			}
+		if (i != npixels) {
+			TIFFError(tif->tif_name,
+		"LogLuvDecode32: Not enough data at row %d (short %d pixels)",
+			    tif->tif_row, npixels - i);
+			tif->tif_rawcp = (tidata_t) bp;
+			tif->tif_rawcc = cc;
+			return (0);
+		}
+	}
+	(*sp->tfunc)(sp, op, npixels);
+	tif->tif_rawcp = (tidata_t) bp;
+	tif->tif_rawcc = cc;
+	return (1);
+}
+
+/*
+ * Decode a strip of pixels.  We break it into rows to
+ * maintain synchrony with the encode algorithm, which
+ * is row by row.
+ */
+static int
+LogLuvDecodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	tsize_t rowlen = TIFFScanlineSize(tif);
+
+	assert(cc%rowlen == 0);
+	while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s))
+		bp += rowlen, cc -= rowlen;
+	return (cc == 0);
+}
+
+/*
+ * Decode a tile of pixels.  We break it into rows to
+ * maintain synchrony with the encode algorithm, which
+ * is row by row.
+ */
+static int
+LogLuvDecodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	tsize_t rowlen = TIFFTileRowSize(tif);
+
+	assert(cc%rowlen == 0);
+	while (cc && (*tif->tif_decoderow)(tif, bp, rowlen, s))
+		bp += rowlen, cc -= rowlen;
+	return (cc == 0);
+}
+
+/*
+ * Encode a row of 16-bit pixels.
+ */
+static int
+LogL16Encode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	LogLuvState* sp = EncoderState(tif);
+	int shft, i, j, npixels;
+	tidata_t op;
+	int16* tp;
+	int16 b;
+	int occ, rc=0, mask, beg;
+
+	assert(s == 0);
+	assert(sp != NULL);
+	npixels = cc / sp->pixel_size;
+
+	if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+		tp = (int16*) bp;
+	else {
+		tp = (int16*) sp->tbuf;
+		assert(sp->tbuflen >= npixels);
+		(*sp->tfunc)(sp, bp, npixels);
+	}
+					/* compress each byte string */
+	op = tif->tif_rawcp;
+	occ = tif->tif_rawdatasize - tif->tif_rawcc;
+	for (shft = 2*8; (shft -= 8) >= 0; )
+		for (i = 0; i < npixels; i += rc) {
+			if (occ < 4) {
+				tif->tif_rawcp = op;
+				tif->tif_rawcc = tif->tif_rawdatasize - occ;
+				if (!TIFFFlushData1(tif))
+					return (-1);
+				op = tif->tif_rawcp;
+				occ = tif->tif_rawdatasize - tif->tif_rawcc;
+			}
+			mask = 0xff << shft;		/* find next run */
+			for (beg = i; beg < npixels; beg += rc) {
+				b = (int16) (tp[beg] & mask);
+				rc = 1;
+				while (rc < 127+2 && beg+rc < npixels &&
+						(tp[beg+rc] & mask) == b)
+					rc++;
+				if (rc >= MINRUN)
+					break;		/* long enough */
+			}
+			if (beg-i > 1 && beg-i < MINRUN) {
+				b = (int16) (tp[i] & mask);/*check short run */
+				j = i+1;
+				while ((tp[j++] & mask) == b)
+                                    if (j == beg) {
+                                        *op++ = (tidataval_t)(128-2+j-i);
+                                        *op++ = (tidataval_t) (b >> shft);
+                                        occ -= 2;
+                                        i = beg;
+                                        break;
+                                    }
+			}
+			while (i < beg) {		/* write out non-run */
+				if ((j = beg-i) > 127) j = 127;
+				if (occ < j+3) {
+                                    tif->tif_rawcp = op;
+                                    tif->tif_rawcc = tif->tif_rawdatasize - occ;
+                                    if (!TIFFFlushData1(tif))
+                                        return (-1);
+                                    op = tif->tif_rawcp;
+                                    occ = tif->tif_rawdatasize - tif->tif_rawcc;
+				}
+				*op++ = (tidataval_t) j; occ--;
+				while (j--) {
+					*op++ = (tidataval_t) (tp[i++] >> shft & 0xff);
+					occ--;
+				}
+			}
+			if (rc >= MINRUN) {		/* write out run */
+				*op++ = (tidataval_t) (128-2+rc);
+				*op++ = (tidataval_t) (tp[beg] >> shft & 0xff);
+				occ -= 2;
+			} else
+				rc = 0;
+		}
+	tif->tif_rawcp = op;
+	tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+	return (0);
+}
+
+/*
+ * Encode a row of 24-bit pixels.
+ */
+static int
+LogLuvEncode24(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	LogLuvState* sp = EncoderState(tif);
+	int i, npixels, occ;
+	tidata_t op;
+	uint32* tp;
+
+	assert(s == 0);
+	assert(sp != NULL);
+	npixels = cc / sp->pixel_size;
+
+	if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+		tp = (uint32*) bp;
+	else {
+		tp = (uint32*) sp->tbuf;
+		assert(sp->tbuflen >= npixels);
+		(*sp->tfunc)(sp, bp, npixels);
+	}
+					/* write out encoded pixels */
+	op = tif->tif_rawcp;
+	occ = tif->tif_rawdatasize - tif->tif_rawcc;
+	for (i = npixels; i--; ) {
+		if (occ < 3) {
+			tif->tif_rawcp = op;
+			tif->tif_rawcc = tif->tif_rawdatasize - occ;
+			if (!TIFFFlushData1(tif))
+				return (-1);
+			op = tif->tif_rawcp;
+			occ = tif->tif_rawdatasize - tif->tif_rawcc;
+		}
+		*op++ = (tidataval_t)(*tp >> 16);
+		*op++ = (tidataval_t)(*tp >> 8 & 0xff);
+		*op++ = (tidataval_t)(*tp++ & 0xff);
+		occ -= 3;
+	}
+	tif->tif_rawcp = op;
+	tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+	return (0);
+}
+
+/*
+ * Encode a row of 32-bit pixels.
+ */
+static int
+LogLuvEncode32(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	LogLuvState* sp = EncoderState(tif);
+	int shft, i, j, npixels;
+	tidata_t op;
+	uint32* tp;
+	uint32 b;
+	int occ, rc=0, mask, beg;
+
+	assert(s == 0);
+	assert(sp != NULL);
+
+	npixels = cc / sp->pixel_size;
+
+	if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+		tp = (uint32*) bp;
+	else {
+		tp = (uint32*) sp->tbuf;
+		assert(sp->tbuflen >= npixels);
+		(*sp->tfunc)(sp, bp, npixels);
+	}
+					/* compress each byte string */
+	op = tif->tif_rawcp;
+	occ = tif->tif_rawdatasize - tif->tif_rawcc;
+	for (shft = 4*8; (shft -= 8) >= 0; )
+		for (i = 0; i < npixels; i += rc) {
+			if (occ < 4) {
+				tif->tif_rawcp = op;
+				tif->tif_rawcc = tif->tif_rawdatasize - occ;
+				if (!TIFFFlushData1(tif))
+					return (-1);
+				op = tif->tif_rawcp;
+				occ = tif->tif_rawdatasize - tif->tif_rawcc;
+			}
+			mask = 0xff << shft;		/* find next run */
+			for (beg = i; beg < npixels; beg += rc) {
+				b = tp[beg] & mask;
+				rc = 1;
+				while (rc < 127+2 && beg+rc < npixels &&
+						(tp[beg+rc] & mask) == b)
+					rc++;
+				if (rc >= MINRUN)
+					break;		/* long enough */
+			}
+			if (beg-i > 1 && beg-i < MINRUN) {
+				b = tp[i] & mask;	/* check short run */
+				j = i+1;
+				while ((tp[j++] & mask) == b)
+					if (j == beg) {
+						*op++ = (tidataval_t)(128-2+j-i);
+						*op++ = (tidataval_t)(b >> shft);
+						occ -= 2;
+						i = beg;
+						break;
+					}
+			}
+			while (i < beg) {		/* write out non-run */
+				if ((j = beg-i) > 127) j = 127;
+				if (occ < j+3) {
+					tif->tif_rawcp = op;
+					tif->tif_rawcc = tif->tif_rawdatasize - occ;
+					if (!TIFFFlushData1(tif))
+						return (-1);
+					op = tif->tif_rawcp;
+					occ = tif->tif_rawdatasize - tif->tif_rawcc;
+				}
+				*op++ = (tidataval_t) j; occ--;
+				while (j--) {
+					*op++ = (tidataval_t)(tp[i++] >> shft & 0xff);
+					occ--;
+				}
+			}
+			if (rc >= MINRUN) {		/* write out run */
+				*op++ = (tidataval_t) (128-2+rc);
+				*op++ = (tidataval_t)(tp[beg] >> shft & 0xff);
+				occ -= 2;
+			} else
+				rc = 0;
+		}
+	tif->tif_rawcp = op;
+	tif->tif_rawcc = tif->tif_rawdatasize - occ;
+
+	return (0);
+}
+
+/*
+ * Encode a strip of pixels.  We break it into rows to
+ * avoid encoding runs across row boundaries.
+ */
+static int
+LogLuvEncodeStrip(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	tsize_t rowlen = TIFFScanlineSize(tif);
+
+	assert(cc%rowlen == 0);
+	while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 0)
+		bp += rowlen, cc -= rowlen;
+	return (cc == 0);
+}
+
+/*
+ * Encode a tile of pixels.  We break it into rows to
+ * avoid encoding runs across row boundaries.
+ */
+static int
+LogLuvEncodeTile(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	tsize_t rowlen = TIFFTileRowSize(tif);
+
+	assert(cc%rowlen == 0);
+	while (cc && (*tif->tif_encoderow)(tif, bp, rowlen, s) == 0)
+		bp += rowlen, cc -= rowlen;
+	return (cc == 0);
+}
+
+/*
+ * Encode/Decode functions for converting to and from user formats.
+ */
+
+#include "uvcode.h"
+
+#ifndef UVSCALE
+#define U_NEU		0.210526316
+#define V_NEU		0.473684211
+#define UVSCALE		410.
+#endif
+
+#ifndef	M_LN2
+#define M_LN2		0.69314718055994530942
+#endif
+#ifndef M_PI
+#define M_PI		3.14159265358979323846
+#endif
+#define log2(x)		((1./M_LN2)*log(x))
+#define exp2(x)		exp(M_LN2*(x))
+
+#define itrunc(x,m)	((m)==SGILOGENCODE_NODITHER ? \
+				(int)(x) : \
+				(int)((x) + rand()*(1./RAND_MAX) - .5))
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+double
+LogL16toY(int p16)		/* compute luminance from 16-bit LogL */
+{
+	int	Le = p16 & 0x7fff;
+	double	Y;
+
+	if (!Le)
+		return (0.);
+	Y = exp(M_LN2/256.*(Le+.5) - M_LN2*64.);
+	return (!(p16 & 0x8000) ? Y : -Y);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+LogL16fromY(double Y, int em)	/* get 16-bit LogL from Y */
+{
+	if (Y >= 1.8371976e19)
+		return (0x7fff);
+	if (Y <= -1.8371976e19)
+		return (0xffff);
+	if (Y > 5.4136769e-20)
+		return itrunc(256.*(log2(Y) + 64.), em);
+	if (Y < -5.4136769e-20)
+		return (~0x7fff | itrunc(256.*(log2(-Y) + 64.), em));
+	return (0);
+}
+
+static void
+L16toY(LogLuvState* sp, tidata_t op, int n)
+{
+	int16* l16 = (int16*) sp->tbuf;
+	float* yp = (float*) op;
+
+	while (n-- > 0)
+		*yp++ = (float)LogL16toY(*l16++);
+}
+
+static void
+L16toGry(LogLuvState* sp, tidata_t op, int n)
+{
+	int16* l16 = (int16*) sp->tbuf;
+	uint8* gp = (uint8*) op;
+
+	while (n-- > 0) {
+		double Y = LogL16toY(*l16++);
+		*gp++ = (uint8) ((Y <= 0.) ? 0 : (Y >= 1.) ? 255 : (int)(256.*sqrt(Y)));
+	}
+}
+
+static void
+L16fromY(LogLuvState* sp, tidata_t op, int n)
+{
+	int16* l16 = (int16*) sp->tbuf;
+	float* yp = (float*) op;
+
+	while (n-- > 0)
+		*l16++ = (int16) (LogL16fromY(*yp++, sp->encode_meth));
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+void
+XYZtoRGB24(float xyz[3], uint8 rgb[3])
+{
+	double	r, g, b;
+					/* assume CCIR-709 primaries */
+	r =  2.690*xyz[0] + -1.276*xyz[1] + -0.414*xyz[2];
+	g = -1.022*xyz[0] +  1.978*xyz[1] +  0.044*xyz[2];
+	b =  0.061*xyz[0] + -0.224*xyz[1] +  1.163*xyz[2];
+					/* assume 2.0 gamma for speed */
+	/* could use integer sqrt approx., but this is probably faster */
+	rgb[0] = (uint8)((r<=0.) ? 0 : (r >= 1.) ? 255 : (int)(256.*sqrt(r)));
+	rgb[1] = (uint8)((g<=0.) ? 0 : (g >= 1.) ? 255 : (int)(256.*sqrt(g)));
+	rgb[2] = (uint8)((b<=0.) ? 0 : (b >= 1.) ? 255 : (int)(256.*sqrt(b)));
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+double
+LogL10toY(int p10)		/* compute luminance from 10-bit LogL */
+{
+	if (p10 == 0)
+		return (0.);
+	return (exp(M_LN2/64.*(p10+.5) - M_LN2*12.));
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+LogL10fromY(double Y, int em)	/* get 10-bit LogL from Y */
+{
+	if (Y >= 15.742)
+		return (0x3ff);
+	else if (Y <= .00024283)
+		return (0);
+	else
+		return itrunc(64.*(log2(Y) + 12.), em);
+}
+
+#define NANGLES		100
+#define uv2ang(u, v)	( (NANGLES*.499999999/M_PI) \
+				* atan2((v)-V_NEU,(u)-U_NEU) + .5*NANGLES )
+
+static int
+oog_encode(double u, double v)		/* encode out-of-gamut chroma */
+{
+	static int	oog_table[NANGLES];
+	static int	initialized = 0;
+	register int	i;
+	
+	if (!initialized) {		/* set up perimeter table */
+		double	eps[NANGLES], ua, va, ang, epsa;
+		int	ui, vi, ustep;
+		for (i = NANGLES; i--; )
+			eps[i] = 2.;
+		for (vi = UV_NVS; vi--; ) {
+			va = UV_VSTART + (vi+.5)*UV_SQSIZ;
+			ustep = uv_row[vi].nus-1;
+			if (vi == UV_NVS-1 || vi == 0 || ustep <= 0)
+				ustep = 1;
+			for (ui = uv_row[vi].nus-1; ui >= 0; ui -= ustep) {
+				ua = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ;
+				ang = uv2ang(ua, va);
+                                i = (int) ang;
+				epsa = fabs(ang - (i+.5));
+				if (epsa < eps[i]) {
+					oog_table[i] = uv_row[vi].ncum + ui;
+					eps[i] = epsa;
+				}
+			}
+		}
+		for (i = NANGLES; i--; )	/* fill any holes */
+			if (eps[i] > 1.5) {
+				int	i1, i2;
+				for (i1 = 1; i1 < NANGLES/2; i1++)
+					if (eps[(i+i1)%NANGLES] < 1.5)
+						break;
+				for (i2 = 1; i2 < NANGLES/2; i2++)
+					if (eps[(i+NANGLES-i2)%NANGLES] < 1.5)
+						break;
+				if (i1 < i2)
+					oog_table[i] =
+						oog_table[(i+i1)%NANGLES];
+				else
+					oog_table[i] =
+						oog_table[(i+NANGLES-i2)%NANGLES];
+			}
+		initialized = 1;
+	}
+	i = (int) uv2ang(u, v);		/* look up hue angle */
+	return (oog_table[i]);
+}
+
+#undef uv2ang
+#undef NANGLES
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+uv_encode(double u, double v, int em)	/* encode (u',v') coordinates */
+{
+	register int	vi, ui;
+
+	if (v < UV_VSTART)
+		return oog_encode(u, v);
+	vi = itrunc((v - UV_VSTART)*(1./UV_SQSIZ), em);
+	if (vi >= UV_NVS)
+		return oog_encode(u, v);
+	if (u < uv_row[vi].ustart)
+		return oog_encode(u, v);
+	ui = itrunc((u - uv_row[vi].ustart)*(1./UV_SQSIZ), em);
+	if (ui >= uv_row[vi].nus)
+		return oog_encode(u, v);
+
+	return (uv_row[vi].ncum + ui);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+int
+uv_decode(double *up, double *vp, int c)	/* decode (u',v') index */
+{
+	int	upper, lower;
+	register int	ui, vi;
+
+	if (c < 0 || c >= UV_NDIVS)
+		return (-1);
+	lower = 0;				/* binary search */
+	upper = UV_NVS;
+	while (upper - lower > 1) {
+		vi = (lower + upper) >> 1;
+		ui = c - uv_row[vi].ncum;
+		if (ui > 0)
+			lower = vi;
+		else if (ui < 0)
+			upper = vi;
+		else {
+			lower = vi;
+			break;
+		}
+	}
+	vi = lower;
+	ui = c - uv_row[vi].ncum;
+	*up = uv_row[vi].ustart + (ui+.5)*UV_SQSIZ;
+	*vp = UV_VSTART + (vi+.5)*UV_SQSIZ;
+	return (0);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+void
+LogLuv24toXYZ(uint32 p, float XYZ[3])
+{
+	int	Ce;
+	double	L, u, v, s, x, y;
+					/* decode luminance */
+	L = LogL10toY(p>>14 & 0x3ff);
+	if (L <= 0.) {
+		XYZ[0] = XYZ[1] = XYZ[2] = 0.;
+		return;
+	}
+					/* decode color */
+	Ce = p & 0x3fff;
+	if (uv_decode(&u, &v, Ce) < 0) {
+		u = U_NEU; v = V_NEU;
+	}
+	s = 1./(6.*u - 16.*v + 12.);
+	x = 9.*u * s;
+	y = 4.*v * s;
+					/* convert to XYZ */
+	XYZ[0] = (float)(x/y * L);
+	XYZ[1] = (float)L;
+	XYZ[2] = (float)((1.-x-y)/y * L);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+uint32
+LogLuv24fromXYZ(float XYZ[3], int em)
+{
+	int	Le, Ce;
+	double	u, v, s;
+					/* encode luminance */
+	Le = LogL10fromY(XYZ[1], em);
+					/* encode color */
+	s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2];
+	if (!Le || s <= 0.) {
+		u = U_NEU;
+		v = V_NEU;
+	} else {
+		u = 4.*XYZ[0] / s;
+		v = 9.*XYZ[1] / s;
+	}
+	Ce = uv_encode(u, v, em);
+	if (Ce < 0)			/* never happens */
+		Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
+					/* combine encodings */
+	return (Le << 14 | Ce);
+}
+
+static void
+Luv24toXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	float* xyz = (float*) op;
+
+	while (n-- > 0) {
+		LogLuv24toXYZ(*luv, xyz);
+		xyz += 3;
+		luv++;
+	}
+}
+
+static void
+Luv24toLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	int16* luv3 = (int16*) op;
+
+	while (n-- > 0) {
+		double u, v;
+
+		*luv3++ = (int16)((*luv >> 12 & 0xffd) + 13314);
+		if (uv_decode(&u, &v, *luv&0x3fff) < 0) {
+			u = U_NEU;
+			v = V_NEU;
+		}
+		*luv3++ = (int16)(u * (1L<<15));
+		*luv3++ = (int16)(v * (1L<<15));
+		luv++;
+	}
+}
+
+static void
+Luv24toRGB(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	uint8* rgb = (uint8*) op;
+
+	while (n-- > 0) {
+		float xyz[3];
+
+		LogLuv24toXYZ(*luv++, xyz);
+		XYZtoRGB24(xyz, rgb);
+		rgb += 3;
+	}
+}
+
+static void
+Luv24fromXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	float* xyz = (float*) op;
+
+	while (n-- > 0) {
+		*luv++ = LogLuv24fromXYZ(xyz, sp->encode_meth);
+		xyz += 3;
+	}
+}
+
+static void
+Luv24fromLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	int16* luv3 = (int16*) op;
+
+	while (n-- > 0) {
+		int Le, Ce;
+
+		if (luv3[0] <= 0)
+			Le = 0;
+		else if (luv3[0] >= (1<<12)+3314)
+			Le = (1<<10) - 1;
+		else if (sp->encode_meth == SGILOGENCODE_NODITHER)
+			Le = (luv3[0]-3314) >> 2;
+		else
+			Le = itrunc(.25*(luv3[0]-3314.), sp->encode_meth);
+
+		Ce = uv_encode((luv3[1]+.5)/(1<<15), (luv3[2]+.5)/(1<<15),
+					sp->encode_meth);
+		if (Ce < 0)	/* never happens */
+			Ce = uv_encode(U_NEU, V_NEU, SGILOGENCODE_NODITHER);
+		*luv++ = (uint32)Le << 14 | Ce;
+		luv3 += 3;
+	}
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+void
+LogLuv32toXYZ(uint32 p, float XYZ[3])
+{
+	double	L, u, v, s, x, y;
+					/* decode luminance */
+	L = LogL16toY((int)p >> 16);
+	if (L <= 0.) {
+		XYZ[0] = XYZ[1] = XYZ[2] = 0.;
+		return;
+	}
+					/* decode color */
+	u = 1./UVSCALE * ((p>>8 & 0xff) + .5);
+	v = 1./UVSCALE * ((p & 0xff) + .5);
+	s = 1./(6.*u - 16.*v + 12.);
+	x = 9.*u * s;
+	y = 4.*v * s;
+					/* convert to XYZ */
+	XYZ[0] = (float)(x/y * L);
+	XYZ[1] = (float)L;
+	XYZ[2] = (float)((1.-x-y)/y * L);
+}
+
+#if !LOGLUV_PUBLIC
+static
+#endif
+uint32
+LogLuv32fromXYZ(float XYZ[3], int em)
+{
+	unsigned int	Le, ue, ve;
+	double	u, v, s;
+					/* encode luminance */
+	Le = (unsigned int)LogL16fromY(XYZ[1], em);
+					/* encode color */
+	s = XYZ[0] + 15.*XYZ[1] + 3.*XYZ[2];
+	if (!Le || s <= 0.) {
+		u = U_NEU;
+		v = V_NEU;
+	} else {
+		u = 4.*XYZ[0] / s;
+		v = 9.*XYZ[1] / s;
+	}
+	if (u <= 0.) ue = 0;
+	else ue = itrunc(UVSCALE*u, em);
+	if (ue > 255) ue = 255;
+	if (v <= 0.) ve = 0;
+	else ve = itrunc(UVSCALE*v, em);
+	if (ve > 255) ve = 255;
+					/* combine encodings */
+	return (Le << 16 | ue << 8 | ve);
+}
+
+static void
+Luv32toXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	float* xyz = (float*) op;
+
+	while (n-- > 0) {
+		LogLuv32toXYZ(*luv++, xyz);
+		xyz += 3;
+	}
+}
+
+static void
+Luv32toLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	int16* luv3 = (int16*) op;
+
+	while (n-- > 0) {
+		double u, v;
+
+		*luv3++ = (int16)(*luv >> 16);
+		u = 1./UVSCALE * ((*luv>>8 & 0xff) + .5);
+		v = 1./UVSCALE * ((*luv & 0xff) + .5);
+		*luv3++ = (int16)(u * (1L<<15));
+		*luv3++ = (int16)(v * (1L<<15));
+		luv++;
+	}
+}
+
+static void
+Luv32toRGB(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	uint8* rgb = (uint8*) op;
+
+	while (n-- > 0) {
+		float xyz[3];
+
+		LogLuv32toXYZ(*luv++, xyz);
+		XYZtoRGB24(xyz, rgb);
+		rgb += 3;
+	}
+}
+
+static void
+Luv32fromXYZ(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	float* xyz = (float*) op;
+
+	while (n-- > 0) {
+		*luv++ = LogLuv32fromXYZ(xyz, sp->encode_meth);
+		xyz += 3;
+	}
+}
+
+static void
+Luv32fromLuv48(LogLuvState* sp, tidata_t op, int n)
+{
+	uint32* luv = (uint32*) sp->tbuf;
+	int16* luv3 = (int16*) op;
+
+	if (sp->encode_meth == SGILOGENCODE_NODITHER) {
+		while (n-- > 0) {
+			*luv++ = (uint32)luv3[0] << 16 |
+				(luv3[1]*(uint32)(UVSCALE+.5) >> 7 & 0xff00) |
+				(luv3[2]*(uint32)(UVSCALE+.5) >> 15 & 0xff);
+			luv3 += 3;
+		}
+		return;
+	}
+	while (n-- > 0) {
+		*luv++ = (uint32)luv3[0] << 16 |
+	(itrunc(luv3[1]*(UVSCALE/(1<<15)), sp->encode_meth) << 8 & 0xff00) |
+		(itrunc(luv3[2]*(UVSCALE/(1<<15)), sp->encode_meth) & 0xff);
+		luv3 += 3;
+	}
+}
+
+static void
+_logLuvNop(LogLuvState* sp, tidata_t op, int n)
+{
+	(void) sp; (void) op; (void) n;
+}
+
+static int
+LogL16GuessDataFmt(TIFFDirectory *td)
+{
+#define	PACK(s,b,f)	(((b)<<6)|((s)<<3)|(f))
+	switch (PACK(td->td_samplesperpixel, td->td_bitspersample, td->td_sampleformat)) {
+	case PACK(1, 32, SAMPLEFORMAT_IEEEFP):
+		return (SGILOGDATAFMT_FLOAT);
+	case PACK(1, 16, SAMPLEFORMAT_VOID):
+	case PACK(1, 16, SAMPLEFORMAT_INT):
+	case PACK(1, 16, SAMPLEFORMAT_UINT):
+		return (SGILOGDATAFMT_16BIT);
+	case PACK(1,  8, SAMPLEFORMAT_VOID):
+	case PACK(1,  8, SAMPLEFORMAT_UINT):
+		return (SGILOGDATAFMT_8BIT);
+	}
+#undef PACK
+	return (SGILOGDATAFMT_UNKNOWN);
+}
+
+static int
+LogL16InitState(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	LogLuvState* sp = DecoderState(tif);
+	static const char module[] = "LogL16InitState";
+
+	assert(sp != NULL);
+	assert(td->td_photometric == PHOTOMETRIC_LOGL);
+
+	/* for some reason, we can't do this in TIFFInitLogL16 */
+	if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
+		sp->user_datafmt = LogL16GuessDataFmt(td);
+	switch (sp->user_datafmt) {
+	case SGILOGDATAFMT_FLOAT:
+		sp->pixel_size = sizeof (float);
+		break;
+	case SGILOGDATAFMT_16BIT:
+		sp->pixel_size = sizeof (int16);
+		break;
+	case SGILOGDATAFMT_8BIT:
+		sp->pixel_size = sizeof (uint8);
+		break;
+	default:
+		TIFFError(tif->tif_name,
+		    "No support for converting user data format to LogL");
+		return (0);
+	}
+	sp->tbuflen = td->td_imagewidth * td->td_rowsperstrip;
+	sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (int16));
+	if (sp->tbuf == NULL) {
+		TIFFError(module, "%s: No space for SGILog translation buffer",
+		    tif->tif_name);
+		return (0);
+	}
+	return (1);
+}
+
+static int
+LogLuvGuessDataFmt(TIFFDirectory *td)
+{
+	int guess;
+
+	/*
+	 * If the user didn't tell us their datafmt,
+	 * take our best guess from the bitspersample.
+	 */
+#define	PACK(a,b)	(((a)<<3)|(b))
+	switch (PACK(td->td_bitspersample, td->td_sampleformat)) {
+	case PACK(32, SAMPLEFORMAT_IEEEFP):
+		guess = SGILOGDATAFMT_FLOAT;
+		break;
+	case PACK(32, SAMPLEFORMAT_VOID):
+	case PACK(32, SAMPLEFORMAT_UINT):
+	case PACK(32, SAMPLEFORMAT_INT):
+		guess = SGILOGDATAFMT_RAW;
+		break;
+	case PACK(16, SAMPLEFORMAT_VOID):
+	case PACK(16, SAMPLEFORMAT_INT):
+	case PACK(16, SAMPLEFORMAT_UINT):
+		guess = SGILOGDATAFMT_16BIT;
+		break;
+	case PACK( 8, SAMPLEFORMAT_VOID):
+	case PACK( 8, SAMPLEFORMAT_UINT):
+		guess = SGILOGDATAFMT_8BIT;
+		break;
+	default:
+		guess = SGILOGDATAFMT_UNKNOWN;
+		break;
+#undef PACK
+	}
+	/*
+	 * Double-check samples per pixel.
+	 */
+	switch (td->td_samplesperpixel) {
+	case 1:
+		if (guess != SGILOGDATAFMT_RAW)
+			guess = SGILOGDATAFMT_UNKNOWN;
+		break;
+	case 3:
+		if (guess == SGILOGDATAFMT_RAW)
+			guess = SGILOGDATAFMT_UNKNOWN;
+		break;
+	default:
+		guess = SGILOGDATAFMT_UNKNOWN;
+		break;
+	}
+	return (guess);
+}
+
+static int
+LogLuvInitState(TIFF* tif)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+	LogLuvState* sp = DecoderState(tif);
+	static const char module[] = "LogLuvInitState";
+
+	assert(sp != NULL);
+	assert(td->td_photometric == PHOTOMETRIC_LOGLUV);
+
+	/* for some reason, we can't do this in TIFFInitLogLuv */
+	if (td->td_planarconfig != PLANARCONFIG_CONTIG) {
+		TIFFError(module,
+		    "SGILog compression cannot handle non-contiguous data");
+		return (0);
+	}
+	if (sp->user_datafmt == SGILOGDATAFMT_UNKNOWN)
+		sp->user_datafmt = LogLuvGuessDataFmt(td);
+	switch (sp->user_datafmt) {
+	case SGILOGDATAFMT_FLOAT:
+		sp->pixel_size = 3*sizeof (float);
+		break;
+	case SGILOGDATAFMT_16BIT:
+		sp->pixel_size = 3*sizeof (int16);
+		break;
+	case SGILOGDATAFMT_RAW:
+		sp->pixel_size = sizeof (uint32);
+		break;
+	case SGILOGDATAFMT_8BIT:
+		sp->pixel_size = 3*sizeof (uint8);
+		break;
+	default:
+		TIFFError(tif->tif_name,
+		    "No support for converting user data format to LogLuv");
+		return (0);
+	}
+	sp->tbuflen = td->td_imagewidth * td->td_rowsperstrip;
+	sp->tbuf = (tidata_t*) _TIFFmalloc(sp->tbuflen * sizeof (uint32));
+	if (sp->tbuf == NULL) {
+		TIFFError(module, "%s: No space for SGILog translation buffer",
+		    tif->tif_name);
+		return (0);
+	}
+	return (1);
+}
+
+static int
+LogLuvSetupDecode(TIFF* tif)
+{
+	LogLuvState* sp = DecoderState(tif);
+	TIFFDirectory* td = &tif->tif_dir;
+
+	tif->tif_postdecode = _TIFFNoPostDecode;
+	switch (td->td_photometric) {
+	case PHOTOMETRIC_LOGLUV:
+		if (!LogLuvInitState(tif))
+			break;
+		if (td->td_compression == COMPRESSION_SGILOG24) {
+			tif->tif_decoderow = LogLuvDecode24;
+			switch (sp->user_datafmt) {
+			case SGILOGDATAFMT_FLOAT:
+				sp->tfunc = Luv24toXYZ;
+				break;
+			case SGILOGDATAFMT_16BIT:
+				sp->tfunc = Luv24toLuv48;
+				break;
+			case SGILOGDATAFMT_8BIT:
+				sp->tfunc = Luv24toRGB;
+				break;
+			}
+		} else {
+			tif->tif_decoderow = LogLuvDecode32;
+			switch (sp->user_datafmt) {
+			case SGILOGDATAFMT_FLOAT:
+				sp->tfunc = Luv32toXYZ;
+				break;
+			case SGILOGDATAFMT_16BIT:
+				sp->tfunc = Luv32toLuv48;
+				break;
+			case SGILOGDATAFMT_8BIT:
+				sp->tfunc = Luv32toRGB;
+				break;
+			}
+		}
+		return (1);
+	case PHOTOMETRIC_LOGL:
+		if (!LogL16InitState(tif))
+			break;
+		tif->tif_decoderow = LogL16Decode;
+		switch (sp->user_datafmt) {
+		case SGILOGDATAFMT_FLOAT:
+			sp->tfunc = L16toY;
+			break;
+		case SGILOGDATAFMT_8BIT:
+			sp->tfunc = L16toGry;
+			break;
+		}
+		return (1);
+	default:
+		TIFFError(tif->tif_name,
+    "Inappropriate photometric interpretation %d for SGILog compression; %s",
+		    td->td_photometric, "must be either LogLUV or LogL");
+		break;
+	}
+	return (0);
+}
+
+static int
+LogLuvSetupEncode(TIFF* tif)
+{
+	LogLuvState* sp = EncoderState(tif);
+	TIFFDirectory* td = &tif->tif_dir;
+
+	switch (td->td_photometric) {
+	case PHOTOMETRIC_LOGLUV:
+		if (!LogLuvInitState(tif))
+			break;
+		if (td->td_compression == COMPRESSION_SGILOG24) {
+			tif->tif_encoderow = LogLuvEncode24;
+			switch (sp->user_datafmt) {
+			case SGILOGDATAFMT_FLOAT:
+				sp->tfunc = Luv24fromXYZ;
+				break;
+			case SGILOGDATAFMT_16BIT:
+				sp->tfunc = Luv24fromLuv48;
+				break;
+			case SGILOGDATAFMT_RAW:
+				break;
+			default:
+				goto notsupported;
+			}
+		} else {
+			tif->tif_encoderow = LogLuvEncode32;
+			switch (sp->user_datafmt) {
+			case SGILOGDATAFMT_FLOAT:
+				sp->tfunc = Luv32fromXYZ;
+				break;
+			case SGILOGDATAFMT_16BIT:
+				sp->tfunc = Luv32fromLuv48;
+				break;
+			case SGILOGDATAFMT_RAW:
+				break;
+			default:
+				goto notsupported;
+			}
+		}
+		break;
+	case PHOTOMETRIC_LOGL:
+		if (!LogL16InitState(tif))
+			break;
+		tif->tif_encoderow = LogL16Encode;
+		switch (sp->user_datafmt) {
+		case SGILOGDATAFMT_FLOAT:
+			sp->tfunc = L16fromY;
+			break;
+		case SGILOGDATAFMT_16BIT:
+			break;
+		default:
+			goto notsupported;
+		}
+		break;
+	default:
+		TIFFError(tif->tif_name,
+    "Inappropriate photometric interpretation %d for SGILog compression; %s",
+    		    td->td_photometric, "must be either LogLUV or LogL");
+		break;
+	}
+	return (1);
+notsupported:
+	TIFFError(tif->tif_name,
+	    "SGILog compression supported only for %s, or raw data",
+	    td->td_photometric == PHOTOMETRIC_LOGL ? "Y, L" : "XYZ, Luv");
+	return (0);
+}
+
+static void
+LogLuvClose(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	/*
+	 * For consistency, we always want to write out the same
+	 * bitspersample and sampleformat for our TIFF file,
+	 * regardless of the data format being used by the application.
+	 * Since this routine is called after tags have been set but
+	 * before they have been recorded in the file, we reset them here.
+	 */
+	td->td_samplesperpixel =
+	    (td->td_photometric == PHOTOMETRIC_LOGL) ? 1 : 3;
+	td->td_bitspersample = 16;
+	td->td_sampleformat = SAMPLEFORMAT_INT;
+}
+
+static void
+LogLuvCleanup(TIFF* tif)
+{
+	LogLuvState* sp = (LogLuvState *)tif->tif_data;
+
+	if (sp) {
+		if (sp->tbuf)
+			_TIFFfree(sp->tbuf);
+		_TIFFfree(sp);
+		tif->tif_data = NULL;
+	}
+}
+
+static int
+LogLuvVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	LogLuvState* sp = DecoderState(tif);
+	int bps, fmt;
+
+	switch (tag) {
+	case TIFFTAG_SGILOGDATAFMT:
+		sp->user_datafmt = va_arg(ap, int);
+		/*
+		 * Tweak the TIFF header so that the rest of libtiff knows what
+		 * size of data will be passed between app and library, and
+		 * assume that the app knows what it is doing and is not
+		 * confused by these header manipulations...
+		 */
+		switch (sp->user_datafmt) {
+		case SGILOGDATAFMT_FLOAT:
+			bps = 32, fmt = SAMPLEFORMAT_IEEEFP;
+			break;
+		case SGILOGDATAFMT_16BIT:
+			bps = 16, fmt = SAMPLEFORMAT_INT;
+			break;
+		case SGILOGDATAFMT_RAW:
+			bps = 32, fmt = SAMPLEFORMAT_UINT;
+			TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 1);
+			break;
+		case SGILOGDATAFMT_8BIT:
+			bps = 8, fmt = SAMPLEFORMAT_UINT;
+			break;
+		default:
+			TIFFError(tif->tif_name,
+			    "Unknown data format %d for LogLuv compression",
+			    sp->user_datafmt);
+			return (0);
+		}
+		TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, bps);
+		TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, fmt);
+		/*
+		 * Must recalculate sizes should bits/sample change.
+		 */
+		tif->tif_tilesize = TIFFTileSize(tif);
+		tif->tif_scanlinesize = TIFFScanlineSize(tif);
+		return (1);
+	case TIFFTAG_SGILOGENCODE:
+		sp->encode_meth = va_arg(ap, int);
+		if (sp->encode_meth != SGILOGENCODE_NODITHER &&
+				sp->encode_meth != SGILOGENCODE_RANDITHER) {
+			TIFFError(tif->tif_name,
+				"Unknown encoding %d for LogLuv compression",
+				sp->encode_meth);
+			return (0);
+		}
+		return (1);
+	default:
+		return (*sp->vsetparent)(tif, tag, ap);
+	}
+}
+
+static int
+LogLuvVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	LogLuvState *sp = (LogLuvState *)tif->tif_data;
+
+	switch (tag) {
+	case TIFFTAG_SGILOGDATAFMT:
+		*va_arg(ap, int*) = sp->user_datafmt;
+		return (1);
+	default:
+		return (*sp->vgetparent)(tif, tag, ap);
+	}
+}
+
+static const TIFFFieldInfo LogLuvFieldInfo[] = {
+    { TIFFTAG_SGILOGDATAFMT,	  0, 0,	TIFF_SHORT,	FIELD_PSEUDO,
+      TRUE,	FALSE,	"SGILogDataFmt"},
+    { TIFFTAG_SGILOGENCODE,	  0, 0, TIFF_SHORT,	FIELD_PSEUDO,
+      TRUE,	FALSE,	"SGILogEncode"}
+};
+
+int
+TIFFInitSGILog(TIFF* tif, int scheme)
+{
+	static const char module[] = "TIFFInitSGILog";
+	LogLuvState* sp;
+
+	assert(scheme == COMPRESSION_SGILOG24 || scheme == COMPRESSION_SGILOG);
+
+	/*
+	 * Allocate state block so tag methods have storage to record values.
+	 */
+	tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LogLuvState));
+	if (tif->tif_data == NULL)
+		goto bad;
+	sp = (LogLuvState*) tif->tif_data;
+	_TIFFmemset((tdata_t)sp, 0, sizeof (*sp));
+	sp->user_datafmt = SGILOGDATAFMT_UNKNOWN;
+	sp->encode_meth = (scheme == COMPRESSION_SGILOG24) ?
+				SGILOGENCODE_RANDITHER : SGILOGENCODE_NODITHER;
+	sp->tfunc = _logLuvNop;
+
+	/*
+	 * Install codec methods.
+	 * NB: tif_decoderow & tif_encoderow are filled
+	 *     in at setup time.
+	 */
+	tif->tif_setupdecode = LogLuvSetupDecode;
+	tif->tif_decodestrip = LogLuvDecodeStrip;
+	tif->tif_decodetile = LogLuvDecodeTile;
+	tif->tif_setupencode = LogLuvSetupEncode;
+	tif->tif_encodestrip = LogLuvEncodeStrip;
+	tif->tif_encodetile = LogLuvEncodeTile;
+	tif->tif_close = LogLuvClose;
+	tif->tif_cleanup = LogLuvCleanup;
+
+	/* override SetField so we can handle our private pseudo-tag */
+	_TIFFMergeFieldInfo(tif, LogLuvFieldInfo, N(LogLuvFieldInfo));
+	sp->vgetparent = tif->tif_tagmethods.vgetfield;
+	tif->tif_tagmethods.vgetfield = LogLuvVGetField;   /* hook for codec tags */
+	sp->vsetparent = tif->tif_tagmethods.vsetfield;
+	tif->tif_tagmethods.vsetfield = LogLuvVSetField;   /* hook for codec tags */
+
+	return (1);
+bad:
+	TIFFError(module, "%s: No space for LogLuv state block", tif->tif_name);
+	return (0);
+}
+#endif /* LOGLUV_SUPPORT */
diff --git a/src/tiff/tif_lzw.c b/src/tiff/tif_lzw.c
new file mode 100644
index 0000000..9acea7a
--- /dev/null
+++ b/src/tiff/tif_lzw.c
@@ -0,0 +1,745 @@
+/* $Header: /home/terralib/src/tiff/tif_lzw.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef LZW_SUPPORT
+/*
+ * TIFF Library.
+ * Rev 5.0 Lempel-Ziv & Welch Compression Support
+ *
+ * This code is derived from the compress program whose code is
+ * derived from software contributed to Berkeley by James A. Woods,
+ * derived from original work by Spencer Thomas and Joseph Orost.
+ *
+ * The original Berkeley copyright notice appears below in its entirety.
+ */
+#include "tif_predict.h"
+
+#include <assert.h>
+#include <stdio.h>
+
+/*
+ * NB: The 5.0 spec describes a different algorithm than Aldus
+ *     implements.  Specifically, Aldus does code length transitions
+ *     one code earlier than should be done (for real LZW).
+ *     Earlier versions of this library implemented the correct
+ *     LZW algorithm, but emitted codes in a bit order opposite
+ *     to the TIFF spec.  Thus, to maintain compatibility w/ Aldus
+ *     we interpret MSB-LSB ordered codes to be images written w/
+ *     old versions of this library, but otherwise adhere to the
+ *     Aldus "off by one" algorithm.
+ *
+ * Future revisions to the TIFF spec are expected to "clarify this issue".
+ */
+#define	LZW_COMPAT		/* include backwards compatibility code */
+/*
+ * Each strip of data is supposed to be terminated by a CODE_EOI.
+ * If the following #define is included, the decoder will also
+ * check for end-of-strip w/o seeing this code.  This makes the
+ * library more robust, but also slower.
+ */
+#define	LZW_CHECKEOS		/* include checks for strips w/o EOI code */
+
+#define MAXCODE(n)	((1L<<(n))-1)
+/*
+ * The TIFF spec specifies that encoded bit
+ * strings range from 9 to 12 bits.
+ */
+#define	BITS_MIN	9		/* start with 9 bits */
+#define	BITS_MAX	12		/* max of 12 bit strings */
+/* predefined codes */
+#define	CODE_CLEAR	256		/* code to clear string table */
+#define	CODE_EOI	257		/* end-of-information code */
+#define CODE_FIRST	258		/* first free code entry */
+#define	CODE_MAX	MAXCODE(BITS_MAX)
+#define	HSIZE		9001L		/* 91% occupancy */
+#define	HSHIFT		(13-8)
+#ifdef LZW_COMPAT
+/* NB: +1024 is for compatibility with old files */
+#define	CSIZE		(MAXCODE(BITS_MAX)+1024L)
+#else
+#define	CSIZE		(MAXCODE(BITS_MAX)+1L)
+#endif
+
+/*
+ * State block for each open TIFF file using LZW
+ * compression/decompression.  Note that the predictor
+ * state block must be first in this data structure.
+ */
+typedef	struct {
+	TIFFPredictorState predict;	/* predictor super class */
+
+	u_short		nbits;		/* # of bits/code */
+	u_short		maxcode;	/* maximum code for lzw_nbits */
+	u_short		free_ent;	/* next free entry in hash table */
+	long		nextdata;	/* next bits of i/o */
+	long		nextbits;	/* # of valid bits in lzw_nextdata */
+} LZWBaseState;
+
+#define	lzw_nbits	base.nbits
+#define	lzw_maxcode	base.maxcode
+#define	lzw_free_ent	base.free_ent
+#define	lzw_nextdata	base.nextdata
+#define	lzw_nextbits	base.nextbits
+
+/*
+ * Encoding-specific state.
+ */
+typedef uint16 hcode_t;			/* codes fit in 16 bits */
+
+/*
+ * Decoding-specific state.
+ */
+typedef struct code_ent {
+	struct code_ent *next;
+	u_short	length;			/* string len, including this token */
+	u_char	value;			/* data value */
+	u_char	firstchar;		/* first token of string */
+} code_t;
+
+typedef	int (*decodeFunc)(TIFF*, tidata_t, tsize_t, tsample_t);
+
+typedef struct {
+	LZWBaseState base;
+
+        /* Decoding specific data */
+	long	dec_nbitsmask;		/* lzw_nbits 1 bits, right adjusted */
+	long	dec_restart;		/* restart count */
+#ifdef LZW_CHECKEOS
+	long	dec_bitsleft;		/* available bits in raw data */
+#endif
+	decodeFunc dec_decode;		/* regular or backwards compatible */
+	code_t*	dec_codep;		/* current recognized code */
+	code_t*	dec_oldcodep;		/* previously recognized code */
+	code_t*	dec_free_entp;		/* next free entry */
+	code_t*	dec_maxcodep;		/* max available entry */
+	code_t*	dec_codetab;		/* kept separate for small machines */
+} LZWCodecState;
+
+#define	LZWState(tif)		((LZWBaseState*) (tif)->tif_data)
+#define	DecoderState(tif)	((LZWCodecState*) LZWState(tif))
+
+static	int LZWDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+#ifdef LZW_COMPAT
+static	int LZWDecodeCompat(TIFF*, tidata_t, tsize_t, tsample_t);
+#endif
+
+/*
+ * LZW Decoder.
+ */
+
+#ifdef LZW_CHECKEOS
+/*
+ * This check shouldn't be necessary because each
+ * strip is suppose to be terminated with CODE_EOI.
+ */
+#define	NextCode(_tif, _sp, _bp, _code, _get) {				\
+	if ((_sp)->dec_bitsleft < nbits) {				\
+		TIFFWarning(_tif->tif_name,				\
+		    "LZWDecode: Strip %d not terminated with EOI code", \
+		    _tif->tif_curstrip);				\
+		_code = CODE_EOI;					\
+	} else {							\
+		_get(_sp,_bp,_code);					\
+		(_sp)->dec_bitsleft -= nbits;				\
+	}								\
+}
+#else
+#define	NextCode(tif, sp, bp, code, get) get(sp, bp, code)
+#endif
+
+static int
+LZWSetupDecode(TIFF* tif)
+{
+	LZWCodecState* sp = DecoderState(tif);
+	static const char module[] = "LZWSetupDecode";
+	int code;
+
+	assert(sp != NULL);
+
+	if (sp->dec_codetab == NULL) {
+		sp->dec_codetab = (code_t*)_TIFFmalloc(CSIZE*sizeof (code_t));
+		if (sp->dec_codetab == NULL) {
+			TIFFError(module, "No space for LZW code table");
+			return (0);
+		}
+		/*
+		 * Pre-load the table.
+		 */
+                code = 255;
+                do {
+                    sp->dec_codetab[code].value = (u_char) code;
+                    sp->dec_codetab[code].firstchar = (u_char) code;
+                    sp->dec_codetab[code].length = 1;
+                    sp->dec_codetab[code].next = NULL;
+                } while (code--);
+	}
+	return (1);
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+LZWPreDecode(TIFF* tif, tsample_t s)
+{
+	LZWCodecState *sp = DecoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	/*
+	 * Check for old bit-reversed codes.
+	 */
+	if (tif->tif_rawdata[0] == 0 && (tif->tif_rawdata[1] & 0x1)) {
+#ifdef LZW_COMPAT
+		if (!sp->dec_decode) {
+			TIFFWarning(tif->tif_name,
+			    "Old-style LZW codes, convert file");
+			/*
+			 * Override default decoding methods with
+			 * ones that deal with the old coding.
+			 * Otherwise the predictor versions set
+			 * above will call the compatibility routines
+			 * through the dec_decode method.
+			 */
+			tif->tif_decoderow = LZWDecodeCompat;
+			tif->tif_decodestrip = LZWDecodeCompat;
+			tif->tif_decodetile = LZWDecodeCompat;
+			/*
+			 * If doing horizontal differencing, must
+			 * re-setup the predictor logic since we
+			 * switched the basic decoder methods...
+			 */
+			(*tif->tif_setupdecode)(tif);
+			sp->dec_decode = LZWDecodeCompat;
+		}
+		sp->lzw_maxcode = MAXCODE(BITS_MIN);
+#else /* !LZW_COMPAT */
+		if (!sp->dec_decode) {
+			TIFFError(tif->tif_name,
+			    "Old-style LZW codes not supported");
+			sp->dec_decode = LZWDecode;
+		}
+		return (0);
+#endif/* !LZW_COMPAT */
+	} else {
+		sp->lzw_maxcode = MAXCODE(BITS_MIN)-1;
+		sp->dec_decode = LZWDecode;
+	}
+	sp->lzw_nbits = BITS_MIN;
+	sp->lzw_nextbits = 0;
+	sp->lzw_nextdata = 0;
+
+	sp->dec_restart = 0;
+	sp->dec_nbitsmask = MAXCODE(BITS_MIN);
+#ifdef LZW_CHECKEOS
+	sp->dec_bitsleft = tif->tif_rawcc << 3;
+#endif
+	sp->dec_free_entp = sp->dec_codetab + CODE_FIRST;
+	/*
+	 * Zero entries that are not yet filled in.  We do
+	 * this to guard against bogus input data that causes
+	 * us to index into undefined entries.  If you can
+	 * come up with a way to safely bounds-check input codes
+	 * while decoding then you can remove this operation.
+	 */
+	_TIFFmemset(sp->dec_free_entp, 0, (CSIZE-CODE_FIRST)*sizeof (code_t));
+	sp->dec_oldcodep = &sp->dec_codetab[-1];
+	sp->dec_maxcodep = &sp->dec_codetab[sp->dec_nbitsmask-1];
+	return (1);
+}
+
+/*
+ * Decode a "hunk of data".
+ */
+#define	GetNextCode(sp, bp, code) {				\
+	nextdata = (nextdata<<8) | *(bp)++;			\
+	nextbits += 8;						\
+	if (nextbits < nbits) {					\
+		nextdata = (nextdata<<8) | *(bp)++;		\
+		nextbits += 8;					\
+	}							\
+	code = (hcode_t)((nextdata >> (nextbits-nbits)) & nbitsmask);	\
+	nextbits -= nbits;					\
+}
+
+static void
+codeLoop(TIFF* tif)
+{
+	TIFFError(tif->tif_name,
+	    "LZWDecode: Bogus encoding, loop in the code table; scanline %d",
+	    tif->tif_row);
+}
+
+static int
+LZWDecode(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+	LZWCodecState *sp = DecoderState(tif);
+	char *op = (char*) op0;
+	long occ = (long) occ0;
+	char *tp;
+	u_char *bp;
+	hcode_t code;
+	int len;
+	long nbits, nextbits, nextdata, nbitsmask;
+	code_t *codep, *free_entp, *maxcodep, *oldcodep;
+
+	(void) s;
+	assert(sp != NULL);
+	/*
+	 * Restart interrupted output operation.
+	 */
+	if (sp->dec_restart) {
+		long residue;
+
+		codep = sp->dec_codep;
+		residue = codep->length - sp->dec_restart;
+		if (residue > occ) {
+			/*
+			 * Residue from previous decode is sufficient
+			 * to satisfy decode request.  Skip to the
+			 * start of the decoded string, place decoded
+			 * values in the output buffer, and return.
+			 */
+			sp->dec_restart += occ;
+			do {
+				codep = codep->next;
+			} while (--residue > occ && codep);
+			if (codep) {
+				tp = op + occ;
+				do {
+					*--tp = codep->value;
+					codep = codep->next;
+				} while (--occ && codep);
+			}
+			return (1);
+		}
+		/*
+		 * Residue satisfies only part of the decode request.
+		 */
+		op += residue, occ -= residue;
+		tp = op;
+		do {
+			int t;
+			--tp;
+			t = codep->value;
+			codep = codep->next;
+			*tp = (char) t;
+		} while (--residue && codep);
+		sp->dec_restart = 0;
+	}
+
+	bp = (u_char *)tif->tif_rawcp;
+	nbits = sp->lzw_nbits;
+	nextdata = sp->lzw_nextdata;
+	nextbits = sp->lzw_nextbits;
+	nbitsmask = sp->dec_nbitsmask;
+	oldcodep = sp->dec_oldcodep;
+	free_entp = sp->dec_free_entp;
+	maxcodep = sp->dec_maxcodep;
+
+	while (occ > 0) {
+		NextCode(tif, sp, bp, code, GetNextCode);
+		if (code == CODE_EOI)
+			break;
+		if (code == CODE_CLEAR) {
+			free_entp = sp->dec_codetab + CODE_FIRST;
+			nbits = BITS_MIN;
+			nbitsmask = MAXCODE(BITS_MIN);
+			maxcodep = sp->dec_codetab + nbitsmask-1;
+			NextCode(tif, sp, bp, code, GetNextCode);
+			if (code == CODE_EOI)
+				break;
+			*op++ = (char)code, occ--;
+			oldcodep = sp->dec_codetab + code;
+			continue;
+		}
+		codep = sp->dec_codetab + code;
+
+		/*
+	 	 * Add the new entry to the code table.
+	 	 */
+		if (free_entp < &sp->dec_codetab[0] ||
+			free_entp >= &sp->dec_codetab[CSIZE]) {
+			TIFFError(tif->tif_name,
+			"LZWDecode: Corrupted LZW table at scanline %d",
+			tif->tif_row);
+			return (0);
+		}
+
+		free_entp->next = oldcodep;
+		if (free_entp->next < &sp->dec_codetab[0] ||
+			free_entp->next >= &sp->dec_codetab[CSIZE]) {
+			TIFFError(tif->tif_name,
+			"LZWDecode: Corrupted LZW table at scanline %d",
+			tif->tif_row);
+			return (0);
+		}
+		free_entp->firstchar = free_entp->next->firstchar;
+		free_entp->length = free_entp->next->length+1;
+		free_entp->value = (codep < free_entp) ?
+		    codep->firstchar : free_entp->firstchar;
+		if (++free_entp > maxcodep) {
+			if (++nbits > BITS_MAX)		/* should not happen */
+				nbits = BITS_MAX;
+			nbitsmask = MAXCODE(nbits);
+			maxcodep = sp->dec_codetab + nbitsmask-1;
+		}
+		oldcodep = codep;
+		if (code >= 256) {
+			/*
+		 	 * Code maps to a string, copy string
+			 * value to output (written in reverse).
+		 	 */
+			if(codep->length == 0) {
+			    TIFFError(tif->tif_name,
+	    		    "LZWDecode: Wrong length of decoded string: "
+			    "data probably corrupted at scanline %d",
+			    tif->tif_row);	
+			    return (0);
+			}
+			if (codep->length > occ) {
+				/*
+				 * String is too long for decode buffer,
+				 * locate portion that will fit, copy to
+				 * the decode buffer, and setup restart
+				 * logic for the next decoding call.
+				 */
+				sp->dec_codep = codep;
+				do {
+					codep = codep->next;
+				} while (codep && codep->length > occ);
+				if (codep) {
+					sp->dec_restart = occ;
+					tp = op + occ;
+					do  {
+						*--tp = codep->value;
+						codep = codep->next;
+					}  while (--occ && codep);
+					if (codep)
+						codeLoop(tif);
+				}
+				break;
+			}
+			len = codep->length;
+			tp = op + len;
+			do {
+				int t;
+				--tp;
+				t = codep->value;
+				codep = codep->next;
+				*tp = (char) t;
+			} while (codep && tp > op);
+			if (codep) {
+			    codeLoop(tif);
+			    break;
+			}
+			op += len, occ -= len;
+		} else
+			*op++ = (char)code, occ--;
+	}
+
+	tif->tif_rawcp = (tidata_t) bp;
+	sp->lzw_nbits = (u_short) nbits;
+	sp->lzw_nextdata = nextdata;
+	sp->lzw_nextbits = nextbits;
+	sp->dec_nbitsmask = nbitsmask;
+	sp->dec_oldcodep = oldcodep;
+	sp->dec_free_entp = free_entp;
+	sp->dec_maxcodep = maxcodep;
+
+	if (occ > 0) {
+		TIFFError(tif->tif_name,
+		"LZWDecode: Not enough data at scanline %d (short %d bytes)",
+		    tif->tif_row, occ);
+		return (0);
+	}
+	return (1);
+}
+
+#ifdef LZW_COMPAT
+/*
+ * Decode a "hunk of data" for old images.
+ */
+#define	GetNextCodeCompat(sp, bp, code) {			\
+	nextdata |= (u_long) *(bp)++ << nextbits;		\
+	nextbits += 8;						\
+	if (nextbits < nbits) {					\
+		nextdata |= (u_long) *(bp)++ << nextbits;	\
+		nextbits += 8;					\
+	}							\
+	code = (hcode_t)(nextdata & nbitsmask);			\
+	nextdata >>= nbits;					\
+	nextbits -= nbits;					\
+}
+
+static int
+LZWDecodeCompat(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+	LZWCodecState *sp = DecoderState(tif);
+	char *op = (char*) op0;
+	long occ = (long) occ0;
+	char *tp;
+	u_char *bp;
+	int code, nbits;
+	long nextbits, nextdata, nbitsmask;
+	code_t *codep, *free_entp, *maxcodep, *oldcodep;
+
+	(void) s;
+	assert(sp != NULL);
+	/*
+	 * Restart interrupted output operation.
+	 */
+	if (sp->dec_restart) {
+		long residue;
+
+		codep = sp->dec_codep;
+		residue = codep->length - sp->dec_restart;
+		if (residue > occ) {
+			/*
+			 * Residue from previous decode is sufficient
+			 * to satisfy decode request.  Skip to the
+			 * start of the decoded string, place decoded
+			 * values in the output buffer, and return.
+			 */
+			sp->dec_restart += occ;
+			do {
+				codep = codep->next;
+			} while (--residue > occ);
+			tp = op + occ;
+			do {
+				*--tp = codep->value;
+				codep = codep->next;
+			} while (--occ);
+			return (1);
+		}
+		/*
+		 * Residue satisfies only part of the decode request.
+		 */
+		op += residue, occ -= residue;
+		tp = op;
+		do {
+			*--tp = codep->value;
+			codep = codep->next;
+		} while (--residue);
+		sp->dec_restart = 0;
+	}
+
+	bp = (u_char *)tif->tif_rawcp;
+	nbits = sp->lzw_nbits;
+	nextdata = sp->lzw_nextdata;
+	nextbits = sp->lzw_nextbits;
+	nbitsmask = sp->dec_nbitsmask;
+	oldcodep = sp->dec_oldcodep;
+	free_entp = sp->dec_free_entp;
+	maxcodep = sp->dec_maxcodep;
+
+	while (occ > 0) {
+		NextCode(tif, sp, bp, code, GetNextCodeCompat);
+		if (code == CODE_EOI)
+			break;
+		if (code == CODE_CLEAR) {
+			free_entp = sp->dec_codetab + CODE_FIRST;
+			nbits = BITS_MIN;
+			nbitsmask = MAXCODE(BITS_MIN);
+			maxcodep = sp->dec_codetab + nbitsmask;
+			NextCode(tif, sp, bp, code, GetNextCodeCompat);
+			if (code == CODE_EOI)
+				break;
+			*op++ = (char) code, occ--;
+			oldcodep = sp->dec_codetab + code;
+			continue;
+		}
+		codep = sp->dec_codetab + code;
+
+		/*
+	 	 * Add the new entry to the code table.
+	 	 */
+		if (free_entp < &sp->dec_codetab[0] ||
+			free_entp >= &sp->dec_codetab[CSIZE]) {
+			TIFFError(tif->tif_name,
+			"LZWDecodeCompat: Corrupted LZW table at scanline %d",
+			tif->tif_row);
+			return (0);
+		}
+
+		free_entp->next = oldcodep;
+		if (free_entp->next < &sp->dec_codetab[0] ||
+			free_entp->next >= &sp->dec_codetab[CSIZE]) {
+			TIFFError(tif->tif_name,
+			"LZWDecodeCompat: Corrupted LZW table at scanline %d",
+			tif->tif_row);
+			return (0);
+		}
+		free_entp->firstchar = free_entp->next->firstchar;
+		free_entp->length = free_entp->next->length+1;
+		free_entp->value = (codep < free_entp) ?
+		    codep->firstchar : free_entp->firstchar;
+		if (++free_entp > maxcodep) {
+			if (++nbits > BITS_MAX)		/* should not happen */
+				nbits = BITS_MAX;
+			nbitsmask = MAXCODE(nbits);
+			maxcodep = sp->dec_codetab + nbitsmask;
+		}
+		oldcodep = codep;
+		if (code >= 256) {
+			/*
+		 	 * Code maps to a string, copy string
+			 * value to output (written in reverse).
+		 	 */
+			if(codep->length == 0) {
+			    TIFFError(tif->tif_name,
+	    		    "LZWDecodeCompat: Wrong length of decoded "
+			    "string: data probably corrupted at scanline %d",
+			    tif->tif_row);	
+			    return (0);
+			}
+			if (codep->length > occ) {
+				/*
+				 * String is too long for decode buffer,
+				 * locate portion that will fit, copy to
+				 * the decode buffer, and setup restart
+				 * logic for the next decoding call.
+				 */
+				sp->dec_codep = codep;
+				do {
+					codep = codep->next;
+				} while (codep->length > occ);
+				sp->dec_restart = occ;
+				tp = op + occ;
+				do  {
+					*--tp = codep->value;
+					codep = codep->next;
+				}  while (--occ);
+				break;
+			}
+			op += codep->length, occ -= codep->length;
+			tp = op;
+			do {
+				*--tp = codep->value;
+			} while( (codep = codep->next) != NULL);
+		} else
+			*op++ = (char) code, occ--;
+	}
+
+	tif->tif_rawcp = (tidata_t) bp;
+	sp->lzw_nbits = (u_short) nbits;
+	sp->lzw_nextdata = nextdata;
+	sp->lzw_nextbits = nextbits;
+	sp->dec_nbitsmask = nbitsmask;
+	sp->dec_oldcodep = oldcodep;
+	sp->dec_free_entp = free_entp;
+	sp->dec_maxcodep = maxcodep;
+
+	if (occ > 0) {
+		TIFFError(tif->tif_name,
+	    "LZWDecodeCompat: Not enough data at scanline %d (short %d bytes)",
+		    tif->tif_row, occ);
+		return (0);
+	}
+	return (1);
+}
+#endif /* LZW_COMPAT */
+
+
+
+static void
+LZWCleanup(TIFF* tif)
+{
+    if (tif->tif_data) {
+        if (DecoderState(tif)->dec_codetab)
+            _TIFFfree(DecoderState(tif)->dec_codetab);
+        _TIFFfree(tif->tif_data);
+        tif->tif_data = NULL;
+    }
+}
+
+static int
+LZWSetupEncode(TIFF* tif)
+{
+    TIFFError(tif->tif_name,
+              "LZW compression is not available to due to Unisys patent enforcement");
+    return (0);
+}
+
+int
+TIFFInitLZW(TIFF* tif, int scheme)
+{
+	assert(scheme == COMPRESSION_LZW);
+
+	/*
+	 * Allocate state block so tag methods have storage to record values.
+	 */
+	tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (LZWCodecState));
+	if (tif->tif_data == NULL)
+		goto bad;
+	DecoderState(tif)->dec_codetab = NULL;
+	DecoderState(tif)->dec_decode = NULL;
+
+	/*
+	 * Install codec methods.
+	 */
+	tif->tif_setupencode = LZWSetupEncode;
+	tif->tif_setupdecode = LZWSetupDecode;
+	tif->tif_predecode = LZWPreDecode;
+	tif->tif_decoderow = LZWDecode;
+	tif->tif_decodestrip = LZWDecode;
+	tif->tif_decodetile = LZWDecode;
+	tif->tif_cleanup = LZWCleanup;
+
+	/*
+	 * Setup predictor setup.
+	 */
+	(void) TIFFPredictorInit(tif);
+
+	return (1);
+
+bad:
+	TIFFError("TIFFInitLZW", "No space for LZW state block");
+	return (0);
+}
+
+/*
+ * Copyright (c) 1985, 1986 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * James A. Woods, derived from original work by Spencer Thomas
+ * and Joseph Orost.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ */
+#endif /* LZW_SUPPORT */
diff --git a/src/tiff/tif_machdep.c b/src/tiff/tif_machdep.c
new file mode 100644
index 0000000..d685faf
--- /dev/null
+++ b/src/tiff/tif_machdep.c
@@ -0,0 +1,186 @@
+#ifndef lint
+static char rcsid[] = "$Header: /home/terralib/src/tiff/tif_machdep.c,v 1.1 2002/07/30 19:57:54 juan Exp $";
+#endif
+
+/*
+ * Copyright (c) 1992 Sam Leffler
+ * Copyright (c) 1992 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library Machine Dependent Routines.
+ */
+#include "tiffiop.h"
+
+#ifdef tahoe
+typedef	struct ieeedouble {
+	u_long	sign	: 1,
+		exp	: 11,
+		mant	: 20;
+	u_long	mant2;
+} ieeedouble;
+typedef	struct ieeefloat {
+	u_long	sign	: 1,
+		exp	: 8,
+		mant	: 23;
+} ieeefloat;
+
+typedef	struct {
+	u_long	sign	: 1,
+		exp	: 8,
+		mant	: 23;
+	u_long	mant2;
+} nativedouble;
+typedef	struct {
+	u_long	sign	: 1,
+		exp	: 8,
+		mant	: 23;
+} nativefloat;
+/*
+ * Beware, over/under-flow in conversions will
+ * result in garbage values -- handling it would
+ * require a subroutine call or lots more code.
+ */
+#define	NATIVE2IEEEFLOAT(fp) { \
+    if ((fp)->native.exp) \
+        (fp)->ieee.exp = (fp)->native.exp - 129 + 127;	/* alter bias */\
+}
+#define	IEEEFLOAT2NATIVE(fp) { \
+    if ((fp)->ieee.exp) \
+        (fp)->native.exp = (fp)->ieee.exp - 127 + 129; 	/* alter bias */\
+}
+#define	IEEEDOUBLE2NATIVE(dp) { \
+    if ((dp)->native.exp = (dp)->ieee.exp) \
+	(dp)->native.exp += -1023 + 129; \
+    (dp)->native.mant = ((dp)->ieee.mant<<3)|((dp)->native.mant2>>29); \
+    (dp)->native.mant2 <<= 3; \
+}
+#endif /* tahoe */
+
+#ifdef vax
+typedef	struct ieeedouble {
+	u_long	mant	: 20,
+		exp	: 11,
+		sign	: 1;
+	u_long	mant2;
+} ieeedouble;
+typedef	struct ieeefloat {
+	u_long	mant	: 23,
+		exp	: 8,
+		sign	: 1;
+} ieeefloat;
+
+typedef	struct {
+	u_long	mant1	: 7,
+		exp	: 8,
+		sign	: 1,
+		mant2	: 16;
+	u_long	mant3;
+} nativedouble;
+typedef	struct {
+	u_long	mant1	: 7,
+		exp	: 8,
+		sign	: 1,
+		mant2	: 16;
+} nativefloat;
+/*
+ * Beware, these do not handle over/under-flow
+ * during conversion from ieee to native format.
+ */
+#define	NATIVE2IEEEFLOAT(fp) { \
+    float_t t; \
+    if (t.ieee.exp = (fp)->native.exp) \
+	t.ieee.exp += -129 + 127; \
+    t.ieee.sign = (fp)->native.sign; \
+    t.ieee.mant = ((fp)->native.mant1<<16)|(fp)->native.mant2; \
+    *(fp) = t; \
+}
+#define	IEEEFLOAT2NATIVE(fp) { \
+    float_t t; int v = (fp)->ieee.exp; \
+    if (v) v += -127 + 129;		/* alter bias of exponent */\
+    t.native.exp = v;			/* implicit truncation of exponent */\
+    t.native.sign = (fp)->ieee.sign; \
+    v = (fp)->ieee.mant; \
+    t.native.mant1 = v >> 16; \
+    t.native.mant2 = v;\
+    *(fp) = t; \
+}
+#define	IEEEDOUBLE2NATIVE(dp) { \
+    double_t t; int v = (dp)->ieee.exp; \
+    if (v) v += -1023 + 1025; 		/* if can alter bias of exponent */\
+    t.native.exp = v;			/* implicit truncation of exponent */\
+    v = (dp)->ieee.mant; \
+    t.native.sign = (dp)->ieee.sign; \
+    t.native.mant1 = v >> 16; \
+    t.native.mant2 = v;\
+    t.native.mant3 = (dp)->mant2; \
+    *(dp) = t; \
+}
+#endif /* vax */
+
+#if !HAVE_IEEEFP
+#if !defined(IEEEFLOAT2NATIVE) || !defined(NATIVE2IEEEFLOAT)
+"Help, you've configured the library to not have IEEE floating point,\
+but not defined how to convert between IEEE and native formats!"
+#endif
+
+/*
+ * These unions are used during floating point
+ * conversions.  The above macros define the
+ * conversion operations.
+ */
+typedef	union {
+	ieeedouble	ieee;
+	nativedouble	native;
+	char		b[8];
+	double		d;
+} double_t;
+
+typedef	union {
+	ieeefloat	ieee;
+	nativefloat	native;
+	char		b[4];
+	float		f;
+} float_t;
+
+void
+TIFFCvtIEEEFloatToNative(TIFF* tif, u_int n, float* f)
+{
+	float_t *fp = (float_t *)f;
+
+	while (n-- > 0) {
+		IEEEFLOAT2NATIVE(fp);
+		fp++;
+	}
+}
+
+void
+TIFFCvtNativeToIEEEFloat(TIFF* tif, u_int n, float* f)
+{
+	float_t *fp = (float_t *)f;
+
+	while (n-- > 0) {
+		NATIVE2IEEEFLOAT(fp);
+		fp++;
+	}
+}
+#endif
diff --git a/src/tiff/tif_next.c b/src/tiff/tif_next.c
new file mode 100644
index 0000000..bb7eeab
--- /dev/null
+++ b/src/tiff/tif_next.c
@@ -0,0 +1,142 @@
+/* $Header: /home/terralib/src/tiff/tif_next.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef NEXT_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * NeXT 2-bit Grey Scale Compression Algorithm Support
+ */
+
+#define SETPIXEL(op, v) {			\
+	switch (npixels++ & 3) {		\
+	case 0:	op[0]  = (u_char) ((v) << 6); break;	\
+	case 1:	op[0] |= (v) << 4; break;	\
+	case 2:	op[0] |= (v) << 2; break;	\
+	case 3:	*op++ |= (v);	   break;	\
+	}					\
+}
+
+#define LITERALROW	0x00
+#define LITERALSPAN	0x40
+#define WHITE   	((1<<2)-1)
+
+static int
+NeXTDecode(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+	register u_char *bp, *op;
+	register tsize_t cc;
+	register int n;
+	tidata_t row;
+	tsize_t scanline;
+
+	(void) s;
+	/*
+	 * Each scanline is assumed to start off as all
+	 * white (we assume a PhotometricInterpretation
+	 * of ``min-is-black'').
+	 */
+	for (op = buf, cc = occ; cc-- > 0;)
+		*op++ = 0xff;
+
+	bp = (u_char *)tif->tif_rawcp;
+	cc = tif->tif_rawcc;
+	scanline = tif->tif_scanlinesize;
+	for (row = buf; (long)occ > 0; occ -= scanline, row += scanline) {
+		n = *bp++, cc--;
+		switch (n) {
+		case LITERALROW:
+			/*
+			 * The entire scanline is given as literal values.
+			 */
+			if (cc < scanline)
+				goto bad;
+			_TIFFmemcpy(row, bp, scanline);
+			bp += scanline;
+			cc -= scanline;
+			break;
+		case LITERALSPAN: {
+			int off;
+			/*
+			 * The scanline has a literal span
+			 * that begins at some offset.
+			 */
+			off = (bp[0] * 256) + bp[1];
+			n = (bp[2] * 256) + bp[3];
+			if (cc < 4+n)
+				goto bad;
+			_TIFFmemcpy(row+off, bp+4, n);
+			bp += 4+n;
+			cc -= 4+n;
+			break;
+		}
+		default: {
+			register int npixels = 0, grey;
+			u_long imagewidth = tif->tif_dir.td_imagewidth;
+
+			/*
+			 * The scanline is composed of a sequence
+			 * of constant color ``runs''.  We shift
+			 * into ``run mode'' and interpret bytes
+			 * as codes of the form <color><npixels>
+			 * until we've filled the scanline.
+			 */
+			op = row;
+			for (;;) {
+				grey = (n>>6) & 0x3;
+				n &= 0x3f;
+				while (n-- > 0)
+					SETPIXEL(op, grey);
+				if (npixels >= (int) imagewidth)
+					break;
+				if (cc == 0)
+					goto bad;
+				n = *bp++, cc--;
+			}
+			break;
+		}
+		}
+	}
+	tif->tif_rawcp = (tidata_t) bp;
+	tif->tif_rawcc = cc;
+	return (1);
+bad:
+	TIFFError(tif->tif_name, "NeXTDecode: Not enough data for scanline %ld",
+	    (long) tif->tif_row);
+	return (0);
+}
+
+int
+TIFFInitNeXT(TIFF* tif, int scheme)
+{
+	(void) scheme;
+	tif->tif_decoderow = NeXTDecode;
+	tif->tif_decodestrip = NeXTDecode;
+	tif->tif_decodetile = NeXTDecode;
+	return (1);
+}
+#endif /* NEXT_SUPPORT */
diff --git a/src/tiff/tif_open.c b/src/tiff/tif_open.c
new file mode 100644
index 0000000..91ed9db
--- /dev/null
+++ b/src/tiff/tif_open.c
@@ -0,0 +1,495 @@
+/* $Header: /home/terralib/src/tiff/tif_open.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+void _TIFFSetDefaultCompressionState(TIFF* tif);
+
+static const long typemask[13] = {
+	(long)0L,		/* TIFF_NOTYPE */
+	(long)0x000000ffL,	/* TIFF_BYTE */
+	(long)0xffffffffL,	/* TIFF_ASCII */
+	(long)0x0000ffffL,	/* TIFF_SHORT */
+	(long)0xffffffffL,	/* TIFF_LONG */
+	(long)0xffffffffL,	/* TIFF_RATIONAL */
+	(long)0x000000ffL,	/* TIFF_SBYTE */
+	(long)0x000000ffL,	/* TIFF_UNDEFINED */
+	(long)0x0000ffffL,	/* TIFF_SSHORT */
+	(long)0xffffffffL,	/* TIFF_SLONG */
+	(long)0xffffffffL,	/* TIFF_SRATIONAL */
+	(long)0xffffffffL,	/* TIFF_FLOAT */
+	(long)0xffffffffL,	/* TIFF_DOUBLE */
+};
+static const int bigTypeshift[13] = {
+	0,		/* TIFF_NOTYPE */
+	24,		/* TIFF_BYTE */
+	0,		/* TIFF_ASCII */
+	16,		/* TIFF_SHORT */
+	0,		/* TIFF_LONG */
+	0,		/* TIFF_RATIONAL */
+	24,		/* TIFF_SBYTE */
+	24,		/* TIFF_UNDEFINED */
+	16,		/* TIFF_SSHORT */
+	0,		/* TIFF_SLONG */
+	0,		/* TIFF_SRATIONAL */
+	0,		/* TIFF_FLOAT */
+	0,		/* TIFF_DOUBLE */
+};
+static const int litTypeshift[13] = {
+	0,		/* TIFF_NOTYPE */
+	0,		/* TIFF_BYTE */
+	0,		/* TIFF_ASCII */
+	0,		/* TIFF_SHORT */
+	0,		/* TIFF_LONG */
+	0,		/* TIFF_RATIONAL */
+	0,		/* TIFF_SBYTE */
+	0,		/* TIFF_UNDEFINED */
+	0,		/* TIFF_SSHORT */
+	0,		/* TIFF_SLONG */
+	0,		/* TIFF_SRATIONAL */
+	0,		/* TIFF_FLOAT */
+	0,		/* TIFF_DOUBLE */
+};
+
+/*
+ * Initialize the shift & mask tables, and the
+ * byte swapping state according to the file
+ * contents and the machine architecture.
+ */
+static void
+TIFFInitOrder(TIFF* tif, int magic, int bigendian)
+{
+	tif->tif_typemask = typemask;
+	if (magic == TIFF_BIGENDIAN) {
+		tif->tif_typeshift = bigTypeshift;
+		if (!bigendian)
+			tif->tif_flags |= TIFF_SWAB;
+	} else {
+		tif->tif_typeshift = litTypeshift;
+		if (bigendian)
+			tif->tif_flags |= TIFF_SWAB;
+	}
+}
+
+int
+_TIFFgetMode(const char* mode, const char* module)
+{
+	int m = -1;
+
+	switch (mode[0]) {
+	case 'r':
+		m = O_RDONLY;
+		if (mode[1] == '+')
+			m = O_RDWR;
+		break;
+	case 'w':
+	case 'a':
+		m = O_RDWR|O_CREAT;
+		if (mode[0] == 'w')
+			m |= O_TRUNC;
+		break;
+	default:
+		TIFFError(module, "\"%s\": Bad mode", mode);
+		break;
+	}
+	return (m);
+}
+
+TIFF*
+TIFFClientOpen(
+	const char* name, const char* mode,
+	thandle_t clientdata,
+	TIFFReadWriteProc readproc,
+	TIFFReadWriteProc writeproc,
+	TIFFSeekProc seekproc,
+	TIFFCloseProc closeproc,
+	TIFFSizeProc sizeproc,
+	TIFFMapFileProc mapproc,
+	TIFFUnmapFileProc unmapproc
+)
+{
+	static const char module[] = "TIFFClientOpen";
+	TIFF *tif;
+	int m, bigendian;
+	const char* cp;
+
+	m = _TIFFgetMode(mode, module);
+	if (m == -1)
+		goto bad2;
+	tif = (TIFF *)_TIFFmalloc(sizeof (TIFF) + strlen(name) + 1);
+	if (tif == NULL) {
+		TIFFError(module, "%s: Out of memory (TIFF structure)", name);
+		goto bad2;
+	}
+	_TIFFmemset(tif, 0, sizeof (*tif));
+	tif->tif_name = (char *)tif + sizeof (TIFF);
+	strcpy(tif->tif_name, name);
+	tif->tif_mode = m &~ (O_CREAT|O_TRUNC);
+	tif->tif_curdir = (tdir_t) -1;		/* non-existent directory */
+	tif->tif_curoff = 0;
+	tif->tif_curstrip = (tstrip_t) -1;	/* invalid strip */
+	tif->tif_row = (uint32) -1;		/* read/write pre-increment */
+	tif->tif_clientdata = clientdata;
+	if (!readproc || !writeproc || !seekproc || !closeproc
+			|| !sizeproc || !mapproc || !unmapproc) {
+		TIFFError(module, "One of the client procedures are NULL pointer");
+		goto bad3;
+	}
+	tif->tif_readproc = readproc;
+	tif->tif_writeproc = writeproc;
+	tif->tif_seekproc = seekproc;
+	tif->tif_closeproc = closeproc;
+	tif->tif_sizeproc = sizeproc;
+	tif->tif_mapproc = mapproc;
+	tif->tif_unmapproc = unmapproc;
+	_TIFFSetDefaultCompressionState(tif);	/* setup default state */
+	/*
+	 * Default is to return data MSB2LSB and enable the
+	 * use of memory-mapped files and strip chopping when
+	 * a file is opened read-only.
+	 */
+	tif->tif_flags = FILLORDER_MSB2LSB;
+	if (m == O_RDONLY )
+            tif->tif_flags |= TIFF_MAPPED;
+
+#ifdef STRIPCHOP_DEFAULT
+	if (m == O_RDONLY || m == O_RDWR)
+		tif->tif_flags |= STRIPCHOP_DEFAULT;
+#endif
+
+	{ union { int32 i; char c[4]; } u; u.i = 1; bigendian = u.c[0] == 0; }
+	/*
+	 * Process library-specific flags in the open mode string.
+	 * The following flags may be used to control intrinsic library
+	 * behaviour that may or may not be desirable (usually for
+	 * compatibility with some application that claims to support
+	 * TIFF but only supports some braindead idea of what the
+	 * vendor thinks TIFF is):
+	 *
+	 * 'l'		use little-endian byte order for creating a file
+	 * 'b'		use big-endian byte order for creating a file
+	 * 'L'		read/write information using LSB2MSB bit order
+	 * 'B'		read/write information using MSB2LSB bit order
+	 * 'H'		read/write information using host bit order
+	 * 'M'		enable use of memory-mapped files when supported
+	 * 'm'		disable use of memory-mapped files
+	 * 'C'		enable strip chopping support when reading
+	 * 'c'		disable strip chopping support
+	 *
+	 * The use of the 'l' and 'b' flags is strongly discouraged.
+	 * These flags are provided solely because numerous vendors,
+	 * typically on the PC, do not correctly support TIFF; they
+	 * only support the Intel little-endian byte order.  This
+	 * support is not configured by default because it supports
+	 * the violation of the TIFF spec that says that readers *MUST*
+	 * support both byte orders.  It is strongly recommended that
+	 * you not use this feature except to deal with busted apps
+	 * that write invalid TIFF.  And even in those cases you should
+	 * bang on the vendors to fix their software.
+	 *
+	 * The 'L', 'B', and 'H' flags are intended for applications
+	 * that can optimize operations on data by using a particular
+	 * bit order.  By default the library returns data in MSB2LSB
+	 * bit order for compatibiltiy with older versions of this
+	 * library.  Returning data in the bit order of the native cpu
+	 * makes the most sense but also requires applications to check
+	 * the value of the FillOrder tag; something they probabyl do
+	 * not do right now.
+	 *
+	 * The 'M' and 'm' flags are provided because some virtual memory
+	 * systems exhibit poor behaviour when large images are mapped.
+	 * These options permit clients to control the use of memory-mapped
+	 * files on a per-file basis.
+	 *
+	 * The 'C' and 'c' flags are provided because the library support
+	 * for chopping up large strips into multiple smaller strips is not
+	 * application-transparent and as such can cause problems.  The 'c'
+	 * option permits applications that only want to look at the tags,
+	 * for example, to get the unadulterated TIFF tag information.
+	 */
+	for (cp = mode; *cp; cp++)
+		switch (*cp) {
+		case 'b':
+			if ((m&O_CREAT) && !bigendian)
+				tif->tif_flags |= TIFF_SWAB;
+			break;
+		case 'l':
+			if ((m&O_CREAT) && bigendian)
+				tif->tif_flags |= TIFF_SWAB;
+			break;
+		case 'B':
+			tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
+			    FILLORDER_MSB2LSB;
+			break;
+		case 'L':
+			tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
+			    FILLORDER_LSB2MSB;
+			break;
+		case 'H':
+			tif->tif_flags = (tif->tif_flags &~ TIFF_FILLORDER) |
+			    HOST_FILLORDER;
+			break;
+		case 'M':
+			if (m == O_RDONLY)
+				tif->tif_flags |= TIFF_MAPPED;
+			break;
+		case 'm':
+			if (m == O_RDONLY)
+				tif->tif_flags &= ~TIFF_MAPPED;
+			break;
+		case 'C':
+			if (m == O_RDONLY)
+				tif->tif_flags |= TIFF_STRIPCHOP;
+			break;
+		case 'c':
+			if (m == O_RDONLY)
+				tif->tif_flags &= ~TIFF_STRIPCHOP;
+			break;
+		}
+	/*
+	 * Read in TIFF header.
+	 */
+	if (!ReadOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
+		if (tif->tif_mode == O_RDONLY) {
+			TIFFError(name, "Cannot read TIFF header");
+			goto bad;
+		}
+		/*
+		 * Setup header and write.
+		 */
+		tif->tif_header.tiff_magic = tif->tif_flags & TIFF_SWAB
+		    ? (bigendian ? TIFF_LITTLEENDIAN : TIFF_BIGENDIAN)
+		    : (bigendian ? TIFF_BIGENDIAN : TIFF_LITTLEENDIAN);
+		tif->tif_header.tiff_version = TIFF_VERSION;
+		if (tif->tif_flags & TIFF_SWAB)
+			TIFFSwabShort(&tif->tif_header.tiff_version);
+		tif->tif_header.tiff_diroff = 0;	/* filled in later */
+
+                /*
+                 * This seek shouldn't be necessary, but I have had some
+                 * crazy problems with a failed fseek() on Solaris leaving
+                 * the current file pointer out of whack when an fwrite()
+                 * is done. 
+                 */
+                TIFFSeekFile( tif, 0, SEEK_SET );
+
+		if (!WriteOK(tif, &tif->tif_header, sizeof (TIFFHeader))) {
+			TIFFError(name, "Error writing TIFF header");
+			goto bad;
+		}
+		/*
+		 * Setup the byte order handling.
+		 */
+		TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian);
+		/*
+		 * Setup default directory.
+		 */
+		if (!TIFFDefaultDirectory(tif))
+			goto bad;
+		tif->tif_diroff = 0;
+		tif->tif_dirlist = NULL;
+		tif->tif_dirnumber = 0;
+		return (tif);
+	}
+	/*
+	 * Setup the byte order handling.
+	 */
+	if (tif->tif_header.tiff_magic != TIFF_BIGENDIAN &&
+	    tif->tif_header.tiff_magic != TIFF_LITTLEENDIAN) {
+		TIFFError(name,  "Not a TIFF file, bad magic number %d (0x%x)",
+		    tif->tif_header.tiff_magic,
+		    tif->tif_header.tiff_magic);
+		goto bad;
+	}
+	TIFFInitOrder(tif, tif->tif_header.tiff_magic, bigendian);
+	/*
+	 * Swap header if required.
+	 */
+	if (tif->tif_flags & TIFF_SWAB) {
+		TIFFSwabShort(&tif->tif_header.tiff_version);
+		TIFFSwabLong(&tif->tif_header.tiff_diroff);
+	}
+	/*
+	 * Now check version (if needed, it's been byte-swapped).
+	 * Note that this isn't actually a version number, it's a
+	 * magic number that doesn't change (stupid).
+	 */
+	if (tif->tif_header.tiff_version != TIFF_VERSION) {
+		TIFFError(name,
+		    "Not a TIFF file, bad version number %d (0x%x)",
+		    tif->tif_header.tiff_version,
+		    tif->tif_header.tiff_version); 
+		goto bad;
+	}
+	tif->tif_flags |= TIFF_MYBUFFER;
+	tif->tif_rawcp = tif->tif_rawdata = 0;
+	tif->tif_rawdatasize = 0;
+	/*
+	 * Setup initial directory.
+	 */
+	switch (mode[0]) {
+	case 'r':
+		tif->tif_nextdiroff = tif->tif_header.tiff_diroff;
+		/*
+		 * Try to use a memory-mapped file if the client
+		 * has not explicitly suppressed usage with the
+		 * 'm' flag in the open mode (see above).
+		 */
+		if ((tif->tif_flags & TIFF_MAPPED) &&
+	!TIFFMapFileContents(tif, (tdata_t*) &tif->tif_base, &tif->tif_size))
+			tif->tif_flags &= ~TIFF_MAPPED;
+		if (TIFFReadDirectory(tif)) {
+			tif->tif_rawcc = -1;
+			tif->tif_flags |= TIFF_BUFFERSETUP;
+			return (tif);
+		}
+		break;
+	case 'a':
+		/*
+		 * New directories are automatically append
+		 * to the end of the directory chain when they
+		 * are written out (see TIFFWriteDirectory).
+		 */
+		if (!TIFFDefaultDirectory(tif))
+			goto bad;
+		return (tif);
+	}
+bad:
+	tif->tif_mode = O_RDONLY;	/* XXX avoid flush */
+	TIFFClose(tif);
+	return ((TIFF*)0);
+bad2:
+	(void) (*closeproc)(clientdata);
+bad3:
+	return ((TIFF*)0);
+}
+
+/*
+ * Query functions to access private data.
+ */
+
+/*
+ * Return open file's name.
+ */
+const char *
+TIFFFileName(TIFF* tif)
+{
+	return (tif->tif_name);
+}
+
+/*
+ * Return open file's I/O descriptor.
+ */
+int
+TIFFFileno(TIFF* tif)
+{
+	return (tif->tif_fd);
+}
+
+/*
+ * Return read/write mode.
+ */
+int
+TIFFGetMode(TIFF* tif)
+{
+	return (tif->tif_mode);
+}
+
+/*
+ * Return nonzero if file is organized in
+ * tiles; zero if organized as strips.
+ */
+int
+TIFFIsTiled(TIFF* tif)
+{
+	return (isTiled(tif));
+}
+
+/*
+ * Return current row being read/written.
+ */
+uint32
+TIFFCurrentRow(TIFF* tif)
+{
+	return (tif->tif_row);
+}
+
+/*
+ * Return index of the current directory.
+ */
+tdir_t
+TIFFCurrentDirectory(TIFF* tif)
+{
+	return (tif->tif_curdir);
+}
+
+/*
+ * Return current strip.
+ */
+tstrip_t
+TIFFCurrentStrip(TIFF* tif)
+{
+	return (tif->tif_curstrip);
+}
+
+/*
+ * Return current tile.
+ */
+ttile_t
+TIFFCurrentTile(TIFF* tif)
+{
+	return (tif->tif_curtile);
+}
+
+/*
+ * Return nonzero if the file has byte-swapped data.
+ */
+int
+TIFFIsByteSwapped(TIFF* tif)
+{
+	return ((tif->tif_flags & TIFF_SWAB) != 0);
+}
+
+/*
+ * Return nonzero if the data is returned up-sampled.
+ */
+int
+TIFFIsUpSampled(TIFF* tif)
+{
+	return (isUpSampled(tif));
+}
+
+/*
+ * Return nonzero if the data is returned in MSB-to-LSB bit order.
+ */
+int
+TIFFIsMSB2LSB(TIFF* tif)
+{
+	return (isFillOrder(tif, FILLORDER_MSB2LSB));
+}
diff --git a/src/tiff/tif_packbits.c b/src/tiff/tif_packbits.c
new file mode 100644
index 0000000..fbba87e
--- /dev/null
+++ b/src/tiff/tif_packbits.c
@@ -0,0 +1,300 @@
+/* $Header: /home/terralib/src/tiff/tif_packbits.c,v 1.3 2004/03/19 11:51:24 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef PACKBITS_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * PackBits Compression Algorithm Support
+ */
+#include <assert.h>
+#include <stdio.h>
+
+static int
+PackBitsPreEncode(TIFF* tif, tsample_t s)
+{
+	(void) s;
+	/*
+	 * Calculate the scanline/tile-width size in bytes.
+	 */
+	if (isTiled(tif))
+		tif->tif_data = (tidata_t) TIFFTileRowSize(tif);
+	else
+		tif->tif_data = (tidata_t) TIFFScanlineSize(tif);
+	return (1);
+}
+
+/*
+ * NB: tidata is the type representing *(tidata_t);
+ *     if tidata_t is made signed then this type must
+ *     be adjusted accordingly.
+ */
+typedef unsigned char tidata;
+
+/*
+ * Encode a run of pixels.
+ */
+static int
+PackBitsEncode(TIFF* tif, tidata_t buf, tsize_t cc, tsample_t s)
+{
+	u_char* bp = (u_char*) buf;
+	tidata_t op, ep, lastliteral;
+	long n, slop;
+	int b;
+	enum { BASE, LITERAL, RUN, LITERAL_RUN } state;
+
+	(void) s;
+	op = tif->tif_rawcp;
+	ep = tif->tif_rawdata + tif->tif_rawdatasize;
+	state = BASE;
+	lastliteral = 0;
+	while (cc > 0) {
+		/*
+		 * Find the longest string of identical bytes.
+		 */
+		b = *bp++, cc--, n = 1;
+		for (; cc > 0 && b == *bp; cc--, bp++)
+			n++;
+	again:
+		if (op + 2 >= ep) {		/* insure space for new data */
+			/*
+			 * Be careful about writing the last
+			 * literal.  Must write up to that point
+			 * and then copy the remainder to the
+			 * front of the buffer.
+			 */
+			if (state == LITERAL || state == LITERAL_RUN) {
+				slop = op - lastliteral;
+				tif->tif_rawcc += lastliteral - tif->tif_rawcp;
+				if (!TIFFFlushData1(tif))
+					return (-1);
+				op = tif->tif_rawcp;
+				while (slop-- > 0)
+					*op++ = *lastliteral++;
+				lastliteral = tif->tif_rawcp;
+			} else {
+				tif->tif_rawcc += op - tif->tif_rawcp;
+				if (!TIFFFlushData1(tif))
+					return (-1);
+				op = tif->tif_rawcp;
+			}
+		}
+		switch (state) {
+		case BASE:		/* initial state, set run/literal */
+			if (n > 1) {
+				state = RUN;
+				if (n > 128) {
+					*op++ = (tidata) -127;
+					*op++ = (tidataval_t) b;
+					n -= 128;
+					goto again;
+				}
+				*op++ = (tidataval_t)(-(n-1));
+				*op++ = (tidataval_t) b;
+			} else {
+				lastliteral = op;
+				*op++ = 0;
+				*op++ = (tidataval_t) b;
+				state = LITERAL;
+			}
+			break;
+		case LITERAL:		/* last object was literal string */
+			if (n > 1) {
+				state = LITERAL_RUN;
+				if (n > 128) {
+					*op++ = (tidata) -127;
+					*op++ = (tidataval_t) b;
+					n -= 128;
+					goto again;
+				}
+				*op++ = (tidataval_t)(-(n-1));	/* encode run */
+				*op++ = (tidataval_t) b;
+			} else {			/* extend literal */
+				if (++(*lastliteral) == 127)
+					state = BASE;
+				*op++ = (tidataval_t) b;
+			}
+			break;
+		case RUN:		/* last object was run */
+			if (n > 1) {
+				if (n > 128) {
+					*op++ = (tidata) -127;
+					*op++ = (tidataval_t) b;
+					n -= 128;
+					goto again;
+				}
+				*op++ = (tidataval_t)(-(n-1));
+				*op++ = (tidataval_t) b;
+			} else {
+				lastliteral = op;
+				*op++ = 0;
+				*op++ = (tidataval_t) b;
+				state = LITERAL;
+			}
+			break;
+		case LITERAL_RUN:	/* literal followed by a run */
+			/*
+			 * Check to see if previous run should
+			 * be converted to a literal, in which
+			 * case we convert literal-run-literal
+			 * to a single literal.
+			 */
+			if (n == 1 && op[-2] == (tidata) -1 &&
+			    *lastliteral < 126) {
+				state = (((*lastliteral) += 2) == 127 ?
+				    BASE : LITERAL);
+				op[-2] = op[-1];	/* replicate */
+			} else
+				state = RUN;
+			goto again;
+		}
+	}
+	tif->tif_rawcc += op - tif->tif_rawcp;
+	tif->tif_rawcp = op;
+	return (1);
+}
+
+/*
+ * Encode a rectangular chunk of pixels.  We break it up
+ * into row-sized pieces to insure that encoded runs do
+ * not span rows.  Otherwise, there can be problems with
+ * the decoder if data is read, for example, by scanlines
+ * when it was encoded by strips.
+ */
+static int
+PackBitsEncodeChunk(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+#if defined(__hpux) && defined(__LP64__)
+	tsize_t rowsize = (tsize_t)(unsigned long) tif->tif_data;
+#else
+	tsize_t rowsize = (tsize_t) tif->tif_data;
+#endif
+
+	assert(rowsize > 0);
+    
+#ifdef YCBCR_SUPPORT
+	/* 
+	 * YCBCR data isn't really separable into rows, so we
+	 * might as well encode the whole tile/strip as one chunk.
+	 */
+	if( tif->tif_dir.td_photometric == PHOTOMETRIC_YCBCR ) {
+#if defined(__hpux) && defined(__LP64__)
+		rowsize = (tsize_t)(unsigned long) tif->tif_data;
+#else
+		rowsize = (tsize_t) tif->tif_data;
+#endif
+	}
+#endif
+
+	while ((long)cc > 0) {
+		int	chunk = rowsize;
+		
+		if( cc < chunk )
+		    chunk = cc;
+
+		if (PackBitsEncode(tif, bp, chunk, s) < 0)
+		    return (-1);
+		bp += chunk;
+		cc -= chunk;
+	}
+	return (1);
+}
+
+static int
+PackBitsDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+	char *bp;
+	tsize_t cc;
+	long n;
+	int b;
+
+	(void) s;
+	bp = (char*) tif->tif_rawcp;
+	cc = tif->tif_rawcc;
+	while (cc > 0 && (long)occ > 0) {
+		n = (long) *bp++, cc--;
+		/*
+		 * Watch out for compilers that
+		 * don't sign extend chars...
+		 */
+		if (n >= 128)
+			n -= 256;
+		if (n < 0) {		/* replicate next byte -n+1 times */
+			if (n == -128)	/* nop */
+				continue;
+                        n = -n + 1;
+                        if( occ < n )
+                        {
+                            TIFFWarning(tif->tif_name,
+                                        "PackBitsDecode: discarding %d bytes "
+                                        "to avoid buffer overrun",
+                                        n - occ);
+                            n = occ;
+                        }
+			occ -= n;
+			b = *bp++, cc--;
+			while (n-- > 0)
+				*op++ = (tidataval_t) b;
+		} else {		/* copy next n+1 bytes literally */
+			if (occ < n + 1)
+                        {
+                            TIFFWarning(tif->tif_name,
+                                        "PackBitsDecode: discarding %d bytes "
+                                        "to avoid buffer overrun",
+                                        n - occ + 1);
+                            n = occ - 1;
+                        }
+                        _TIFFmemcpy(op, bp, ++n);
+			op += n; occ -= n;
+			bp += n; cc -= n;
+		}
+	}
+	tif->tif_rawcp = (tidata_t) bp;
+	tif->tif_rawcc = cc;
+	if (occ > 0) {
+		TIFFError(tif->tif_name,
+		    "PackBitsDecode: Not enough data for scanline %ld",
+		    (long) tif->tif_row);
+		return (0);
+	}
+	return (1);
+}
+
+int
+TIFFInitPackBits(TIFF* tif, int scheme)
+{
+	(void) scheme;
+	tif->tif_decoderow = PackBitsDecode;
+	tif->tif_decodestrip = PackBitsDecode;
+	tif->tif_decodetile = PackBitsDecode;
+	tif->tif_preencode = PackBitsPreEncode;
+	tif->tif_encoderow = PackBitsEncode;
+	tif->tif_encodestrip = PackBitsEncodeChunk;
+	tif->tif_encodetile = PackBitsEncodeChunk;
+	return (1);
+}
+#endif /* PACKBITS_SUPPORT */
diff --git a/src/tiff/tif_pixarlog.c b/src/tiff/tif_pixarlog.c
new file mode 100644
index 0000000..f1664bc
--- /dev/null
+++ b/src/tiff/tif_pixarlog.c
@@ -0,0 +1,1305 @@
+/*
+ * Copyright (c) 1996-1997 Sam Leffler
+ * Copyright (c) 1996 Pixar
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Pixar, Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Pixar, Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL PIXAR, SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef PIXARLOG_SUPPORT
+
+/*
+ * TIFF Library.
+ * PixarLog Compression Support
+ *
+ * Contributed by Dan McCoy.
+ *
+ * PixarLog film support uses the TIFF library to store companded
+ * 11 bit values into a tiff file, which are compressed using the 
+ * zip compressor.  
+ *
+ * The codec can take as input and produce as output 32-bit IEEE float values 
+ * as well as 16-bit or 8-bit unsigned integer values.
+ *
+ * On writing any of the above are converted into the internal
+ * 11-bit log format.   In the case of  8 and 16 bit values, the
+ * input is assumed to be unsigned linear color values that represent
+ * the range 0-1.  In the case of IEEE values, the 0-1 range is assumed to
+ * be the normal linear color range, in addition over 1 values are
+ * accepted up to a value of about 25.0 to encode "hot" hightlights and such.
+ * The encoding is lossless for 8-bit values, slightly lossy for the
+ * other bit depths.  The actual color precision should be better
+ * than the human eye can perceive with extra room to allow for
+ * error introduced by further image computation.  As with any quantized
+ * color format, it is possible to perform image calculations which
+ * expose the quantization error. This format should certainly be less 
+ * susceptable to such errors than standard 8-bit encodings, but more
+ * susceptable than straight 16-bit or 32-bit encodings.
+ *
+ * On reading the internal format is converted to the desired output format.
+ * The program can request which format it desires by setting the internal
+ * pseudo tag TIFFTAG_PIXARLOGDATAFMT to one of these possible values:
+ *  PIXARLOGDATAFMT_FLOAT     = provide IEEE float values.
+ *  PIXARLOGDATAFMT_16BIT     = provide unsigned 16-bit integer values
+ *  PIXARLOGDATAFMT_8BIT      = provide unsigned 8-bit integer values
+ *
+ * alternately PIXARLOGDATAFMT_8BITABGR provides unsigned 8-bit integer
+ * values with the difference that if there are exactly three or four channels
+ * (rgb or rgba) it swaps the channel order (bgr or abgr).
+ *
+ * PIXARLOGDATAFMT_11BITLOG provides the internal encoding directly
+ * packed in 16-bit values.   However no tools are supplied for interpreting
+ * these values.
+ *
+ * "hot" (over 1.0) areas written in floating point get clamped to
+ * 1.0 in the integer data types.
+ *
+ * When the file is closed after writing, the bit depth and sample format
+ * are set always to appear as if 8-bit data has been written into it.
+ * That way a naive program unaware of the particulars of the encoding
+ * gets the format it is most likely able to handle.
+ *
+ * The codec does it's own horizontal differencing step on the coded
+ * values so the libraries predictor stuff should be turned off.
+ * The codec also handle byte swapping the encoded values as necessary
+ * since the library does not have the information necessary
+ * to know the bit depth of the raw unencoded buffer.
+ * 
+ */
+
+#include "tif_predict.h"
+#include "zlib.h"
+
+#include <stdio.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <math.h>
+
+/* Tables for converting to/from 11 bit coded values */
+
+#define  TSIZE	 2048		/* decode table size (11-bit tokens) */
+#define  TSIZEP1 2049		/* Plus one for slop */
+#define  ONE	 1250		/* token value of 1.0 exactly */
+#define  RATIO	 1.004		/* nominal ratio for log part */
+
+#define CODE_MASK 0x7ff         /* 11 bits. */
+
+static float  Fltsize;
+static float  LogK1, LogK2;
+
+#define REPEAT(n, op)   { int i; i=n; do { i--; op; } while (i>0); }
+
+static void
+horizontalAccumulateF(uint16 *wp, int n, int stride, float *op, 
+	float *ToLinearF)
+{
+    register unsigned int  cr, cg, cb, ca, mask;
+    register float  t0, t1, t2, t3;
+
+    if (n >= stride) {
+	mask = CODE_MASK;
+	if (stride == 3) {
+	    t0 = ToLinearF[cr = wp[0]];
+	    t1 = ToLinearF[cg = wp[1]];
+	    t2 = ToLinearF[cb = wp[2]];
+	    op[0] = t0;
+	    op[1] = t1;
+	    op[2] = t2;
+	    n -= 3;
+	    while (n > 0) {
+		wp += 3;
+		op += 3;
+		n -= 3;
+		t0 = ToLinearF[(cr += wp[0]) & mask];
+		t1 = ToLinearF[(cg += wp[1]) & mask];
+		t2 = ToLinearF[(cb += wp[2]) & mask];
+		op[0] = t0;
+		op[1] = t1;
+		op[2] = t2;
+	    }
+	} else if (stride == 4) {
+	    t0 = ToLinearF[cr = wp[0]];
+	    t1 = ToLinearF[cg = wp[1]];
+	    t2 = ToLinearF[cb = wp[2]];
+	    t3 = ToLinearF[ca = wp[3]];
+	    op[0] = t0;
+	    op[1] = t1;
+	    op[2] = t2;
+	    op[3] = t3;
+	    n -= 4;
+	    while (n > 0) {
+		wp += 4;
+		op += 4;
+		n -= 4;
+		t0 = ToLinearF[(cr += wp[0]) & mask];
+		t1 = ToLinearF[(cg += wp[1]) & mask];
+		t2 = ToLinearF[(cb += wp[2]) & mask];
+		t3 = ToLinearF[(ca += wp[3]) & mask];
+		op[0] = t0;
+		op[1] = t1;
+		op[2] = t2;
+		op[3] = t3;
+	    }
+	} else {
+	    REPEAT(stride, *op = ToLinearF[*wp&mask]; wp++; op++)
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride,
+		    wp[stride] += *wp; *op = ToLinearF[*wp&mask]; wp++; op++)
+		n -= stride;
+	    }
+	}
+    }
+}
+
+static void
+horizontalAccumulate12(uint16 *wp, int n, int stride, int16 *op,
+	float *ToLinearF)
+{
+    register unsigned int  cr, cg, cb, ca, mask;
+    register float  t0, t1, t2, t3;
+
+#define SCALE12 2048.0
+#define CLAMP12(t) (((t) < 3071) ? (uint16) (t) : 3071)
+
+    if (n >= stride) {
+	mask = CODE_MASK;
+	if (stride == 3) {
+	    t0 = ToLinearF[cr = wp[0]] * SCALE12;
+	    t1 = ToLinearF[cg = wp[1]] * SCALE12;
+	    t2 = ToLinearF[cb = wp[2]] * SCALE12;
+	    op[0] = CLAMP12(t0);
+	    op[1] = CLAMP12(t1);
+	    op[2] = CLAMP12(t2);
+	    n -= 3;
+	    while (n > 0) {
+		wp += 3;
+		op += 3;
+		n -= 3;
+		t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
+		t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
+		t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
+		op[0] = CLAMP12(t0);
+		op[1] = CLAMP12(t1);
+		op[2] = CLAMP12(t2);
+	    }
+	} else if (stride == 4) {
+	    t0 = ToLinearF[cr = wp[0]] * SCALE12;
+	    t1 = ToLinearF[cg = wp[1]] * SCALE12;
+	    t2 = ToLinearF[cb = wp[2]] * SCALE12;
+	    t3 = ToLinearF[ca = wp[3]] * SCALE12;
+	    op[0] = CLAMP12(t0);
+	    op[1] = CLAMP12(t1);
+	    op[2] = CLAMP12(t2);
+	    op[3] = CLAMP12(t3);
+	    n -= 4;
+	    while (n > 0) {
+		wp += 4;
+		op += 4;
+		n -= 4;
+		t0 = ToLinearF[(cr += wp[0]) & mask] * SCALE12;
+		t1 = ToLinearF[(cg += wp[1]) & mask] * SCALE12;
+		t2 = ToLinearF[(cb += wp[2]) & mask] * SCALE12;
+		t3 = ToLinearF[(ca += wp[3]) & mask] * SCALE12;
+		op[0] = CLAMP12(t0);
+		op[1] = CLAMP12(t1);
+		op[2] = CLAMP12(t2);
+		op[3] = CLAMP12(t3);
+	    }
+	} else {
+	    REPEAT(stride, t0 = ToLinearF[*wp&mask] * SCALE12;
+                           *op = CLAMP12(t0); wp++; op++)
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride,
+		    wp[stride] += *wp; t0 = ToLinearF[wp[stride]&mask]*SCALE12;
+		    *op = CLAMP12(t0);  wp++; op++)
+		n -= stride;
+	    }
+	}
+    }
+}
+
+static void
+horizontalAccumulate16(uint16 *wp, int n, int stride, uint16 *op,
+	uint16 *ToLinear16)
+{
+    register unsigned int  cr, cg, cb, ca, mask;
+
+    if (n >= stride) {
+	mask = CODE_MASK;
+	if (stride == 3) {
+	    op[0] = ToLinear16[cr = wp[0]];
+	    op[1] = ToLinear16[cg = wp[1]];
+	    op[2] = ToLinear16[cb = wp[2]];
+	    n -= 3;
+	    while (n > 0) {
+		wp += 3;
+		op += 3;
+		n -= 3;
+		op[0] = ToLinear16[(cr += wp[0]) & mask];
+		op[1] = ToLinear16[(cg += wp[1]) & mask];
+		op[2] = ToLinear16[(cb += wp[2]) & mask];
+	    }
+	} else if (stride == 4) {
+	    op[0] = ToLinear16[cr = wp[0]];
+	    op[1] = ToLinear16[cg = wp[1]];
+	    op[2] = ToLinear16[cb = wp[2]];
+	    op[3] = ToLinear16[ca = wp[3]];
+	    n -= 4;
+	    while (n > 0) {
+		wp += 4;
+		op += 4;
+		n -= 4;
+		op[0] = ToLinear16[(cr += wp[0]) & mask];
+		op[1] = ToLinear16[(cg += wp[1]) & mask];
+		op[2] = ToLinear16[(cb += wp[2]) & mask];
+		op[3] = ToLinear16[(ca += wp[3]) & mask];
+	    }
+	} else {
+	    REPEAT(stride, *op = ToLinear16[*wp&mask]; wp++; op++)
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride,
+		    wp[stride] += *wp; *op = ToLinear16[*wp&mask]; wp++; op++)
+		n -= stride;
+	    }
+	}
+    }
+}
+
+/* 
+ * Returns the log encoded 11-bit values with the horizontal
+ * differencing undone.
+ */
+static void
+horizontalAccumulate11(uint16 *wp, int n, int stride, uint16 *op)
+{
+    register unsigned int  cr, cg, cb, ca, mask;
+
+    if (n >= stride) {
+	mask = CODE_MASK;
+	if (stride == 3) {
+	    op[0] = cr = wp[0];  op[1] = cg = wp[1];  op[2] = cb = wp[2];
+	    n -= 3;
+	    while (n > 0) {
+		wp += 3;
+		op += 3;
+		n -= 3;
+		op[0] = (cr += wp[0]) & mask;
+		op[1] = (cg += wp[1]) & mask;
+		op[2] = (cb += wp[2]) & mask;
+	    }
+	} else if (stride == 4) {
+	    op[0] = cr = wp[0];  op[1] = cg = wp[1];
+	    op[2] = cb = wp[2];  op[3] = ca = wp[3];
+	    n -= 4;
+	    while (n > 0) {
+		wp += 4;
+		op += 4;
+		n -= 4;
+		op[0] = (cr += wp[0]) & mask;
+		op[1] = (cg += wp[1]) & mask;
+		op[2] = (cb += wp[2]) & mask;
+		op[3] = (ca += wp[3]) & mask;
+	    } 
+	} else {
+	    REPEAT(stride, *op = *wp&mask; wp++; op++)
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride,
+		    wp[stride] += *wp; *op = *wp&mask; wp++; op++)
+	    	n -= stride;
+	    }
+	}
+    }
+}
+
+static void
+horizontalAccumulate8(uint16 *wp, int n, int stride, unsigned char *op,
+	unsigned char *ToLinear8)
+{
+    register unsigned int  cr, cg, cb, ca, mask;
+
+    if (n >= stride) {
+	mask = CODE_MASK;
+	if (stride == 3) {
+	    op[0] = ToLinear8[cr = wp[0]];
+	    op[1] = ToLinear8[cg = wp[1]];
+	    op[2] = ToLinear8[cb = wp[2]];
+	    n -= 3;
+	    while (n > 0) {
+		n -= 3;
+		wp += 3;
+		op += 3;
+		op[0] = ToLinear8[(cr += wp[0]) & mask];
+		op[1] = ToLinear8[(cg += wp[1]) & mask];
+		op[2] = ToLinear8[(cb += wp[2]) & mask];
+	    }
+	} else if (stride == 4) {
+	    op[0] = ToLinear8[cr = wp[0]];
+	    op[1] = ToLinear8[cg = wp[1]];
+	    op[2] = ToLinear8[cb = wp[2]];
+	    op[3] = ToLinear8[ca = wp[3]];
+	    n -= 4;
+	    while (n > 0) {
+		n -= 4;
+		wp += 4;
+		op += 4;
+		op[0] = ToLinear8[(cr += wp[0]) & mask];
+		op[1] = ToLinear8[(cg += wp[1]) & mask];
+		op[2] = ToLinear8[(cb += wp[2]) & mask];
+		op[3] = ToLinear8[(ca += wp[3]) & mask];
+	    }
+	} else {
+	    REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++)
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride,
+		    wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++)
+		n -= stride;
+	    }
+	}
+    }
+}
+
+
+static void
+horizontalAccumulate8abgr(uint16 *wp, int n, int stride, unsigned char *op,
+	unsigned char *ToLinear8)
+{
+    register unsigned int  cr, cg, cb, ca, mask;
+    register unsigned char  t0, t1, t2, t3;
+
+    if (n >= stride) {
+	mask = CODE_MASK;
+	if (stride == 3) {
+	    op[0] = 0;
+	    t1 = ToLinear8[cb = wp[2]];
+	    t2 = ToLinear8[cg = wp[1]];
+	    t3 = ToLinear8[cr = wp[0]];
+	    op[1] = t1;
+	    op[2] = t2;
+	    op[3] = t3;
+	    n -= 3;
+	    while (n > 0) {
+		n -= 3;
+		wp += 3;
+		op += 4;
+		op[0] = 0;
+		t1 = ToLinear8[(cb += wp[2]) & mask];
+		t2 = ToLinear8[(cg += wp[1]) & mask];
+		t3 = ToLinear8[(cr += wp[0]) & mask];
+		op[1] = t1;
+		op[2] = t2;
+		op[3] = t3;
+	    }
+	} else if (stride == 4) {
+	    t0 = ToLinear8[ca = wp[3]];
+	    t1 = ToLinear8[cb = wp[2]];
+	    t2 = ToLinear8[cg = wp[1]];
+	    t3 = ToLinear8[cr = wp[0]];
+	    op[0] = t0;
+	    op[1] = t1;
+	    op[2] = t2;
+	    op[3] = t3;
+	    n -= 4;
+	    while (n > 0) {
+		n -= 4;
+		wp += 4;
+		op += 4;
+		t0 = ToLinear8[(ca += wp[3]) & mask];
+		t1 = ToLinear8[(cb += wp[2]) & mask];
+		t2 = ToLinear8[(cg += wp[1]) & mask];
+		t3 = ToLinear8[(cr += wp[0]) & mask];
+		op[0] = t0;
+		op[1] = t1;
+		op[2] = t2;
+		op[3] = t3;
+	    }
+	} else {
+	    REPEAT(stride, *op = ToLinear8[*wp&mask]; wp++; op++)
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride,
+		    wp[stride] += *wp; *op = ToLinear8[*wp&mask]; wp++; op++)
+		n -= stride;
+	    }
+	}
+    }
+}
+
+/*
+ * State block for each open TIFF
+ * file using PixarLog compression/decompression.
+ */
+typedef	struct {
+	TIFFPredictorState	predict;
+	z_stream		stream;
+	uint16			*tbuf; 
+	uint16			stride;
+	int			state;
+	int			user_datafmt;
+	int			quality;
+#define PLSTATE_INIT 1
+
+	TIFFVSetMethod		vgetparent;	/* super-class method */
+	TIFFVSetMethod		vsetparent;	/* super-class method */
+
+	float *ToLinearF;
+	uint16 *ToLinear16;
+	unsigned char *ToLinear8;
+	uint16  *FromLT2;
+	uint16  *From14; /* Really for 16-bit data, but we shift down 2 */
+	uint16  *From8;
+	
+} PixarLogState;
+
+static int
+PixarLogMakeTables(PixarLogState *sp)
+{
+
+/*
+ *    We make several tables here to convert between various external
+ *    representations (float, 16-bit, and 8-bit) and the internal
+ *    11-bit companded representation.  The 11-bit representation has two
+ *    distinct regions.  A linear bottom end up through .018316 in steps
+ *    of about .000073, and a region of constant ratio up to about 25.
+ *    These floating point numbers are stored in the main table ToLinearF. 
+ *    All other tables are derived from this one.  The tables (and the
+ *    ratios) are continuous at the internal seam.
+ */
+
+    int  nlin, lt2size;
+    int  i, j;
+    double  b, c, linstep, v;
+    float *ToLinearF;
+    uint16 *ToLinear16;
+    unsigned char *ToLinear8;
+    uint16  *FromLT2;
+    uint16  *From14; /* Really for 16-bit data, but we shift down 2 */
+    uint16  *From8;
+
+    c = log(RATIO);	
+    nlin = (int)1./c;	/* nlin must be an integer */
+    c = 1./nlin;
+    b = exp(-c*ONE);	/* multiplicative scale factor [b*exp(c*ONE) = 1] */
+    linstep = b*c*exp(1.);
+
+    LogK1 = 1./c;	/* if (v >= 2)  token = k1*log(v*k2) */
+    LogK2 = 1./b;
+    lt2size = (int)(2./linstep) + 1;
+    FromLT2 = (uint16 *)_TIFFmalloc(lt2size*sizeof(uint16));
+    From14 = (uint16 *)_TIFFmalloc(16384*sizeof(uint16));
+    From8 = (uint16 *)_TIFFmalloc(256*sizeof(uint16));
+    ToLinearF = (float *)_TIFFmalloc(TSIZEP1 * sizeof(float));
+    ToLinear16 = (uint16 *)_TIFFmalloc(TSIZEP1 * sizeof(uint16));
+    ToLinear8 = (unsigned char *)_TIFFmalloc(TSIZEP1 * sizeof(unsigned char));
+    if (FromLT2 == NULL || From14  == NULL || From8   == NULL ||
+	 ToLinearF == NULL || ToLinear16 == NULL || ToLinear8 == NULL) {
+	if (FromLT2) _TIFFfree(FromLT2);
+	if (From14) _TIFFfree(From14);
+	if (From8) _TIFFfree(From8);
+	if (ToLinearF) _TIFFfree(ToLinearF);
+	if (ToLinear16) _TIFFfree(ToLinear16);
+	if (ToLinear8) _TIFFfree(ToLinear8);
+	sp->FromLT2 = NULL;
+	sp->From14 = NULL;
+	sp->From8 = NULL;
+	sp->ToLinearF = NULL;
+	sp->ToLinear16 = NULL;
+	sp->ToLinear8 = NULL;
+	return 0;
+    }
+
+    j = 0;
+
+    for (i = 0; i < nlin; i++)  {
+	v = i * linstep;
+	ToLinearF[j++] = v;
+    }
+
+    for (i = nlin; i < TSIZE; i++)
+	ToLinearF[j++] = b*exp(c*i);
+
+    ToLinearF[2048] = ToLinearF[2047];
+
+    for (i = 0; i < TSIZEP1; i++)  {
+	v = ToLinearF[i]*65535.0 + 0.5;
+	ToLinear16[i] = (v > 65535.0) ? 65535 : (uint16)v;
+	v = ToLinearF[i]*255.0  + 0.5;
+	ToLinear8[i]  = (v > 255.0) ? 255 : (unsigned char)v;
+    }
+
+    j = 0;
+    for (i = 0; i < lt2size; i++)  {
+	if ((i*linstep)*(i*linstep) > ToLinearF[j]*ToLinearF[j+1])
+	    j++;
+	FromLT2[i] = j;
+    }
+
+    /*
+     * Since we lose info anyway on 16-bit data, we set up a 14-bit
+     * table and shift 16-bit values down two bits on input.
+     * saves a little table space.
+     */
+    j = 0;
+    for (i = 0; i < 16384; i++)  {
+	while ((i/16383.)*(i/16383.) > ToLinearF[j]*ToLinearF[j+1])
+	    j++;
+	From14[i] = j;
+    }
+
+    j = 0;
+    for (i = 0; i < 256; i++)  {
+	while ((i/255.)*(i/255.) > ToLinearF[j]*ToLinearF[j+1])
+	    j++;
+	From8[i] = j;
+    }
+
+    Fltsize = lt2size/2;
+
+    sp->ToLinearF = ToLinearF;
+    sp->ToLinear16 = ToLinear16;
+    sp->ToLinear8 = ToLinear8;
+    sp->FromLT2 = FromLT2;
+    sp->From14 = From14;
+    sp->From8 = From8;
+
+    return 1;
+}
+
+#define	DecoderState(tif)	((PixarLogState*) (tif)->tif_data)
+#define	EncoderState(tif)	((PixarLogState*) (tif)->tif_data)
+
+static	int PixarLogEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int PixarLogDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+
+#define N(a)   (sizeof(a)/sizeof(a[0]))
+#define PIXARLOGDATAFMT_UNKNOWN	-1
+
+static int
+PixarLogGuessDataFmt(TIFFDirectory *td)
+{
+	int guess = PIXARLOGDATAFMT_UNKNOWN;
+	int format = td->td_sampleformat;
+
+	/* If the user didn't tell us his datafmt,
+	 * take our best guess from the bitspersample.
+	 */
+	switch (td->td_bitspersample) {
+	 case 32:
+		if (format == SAMPLEFORMAT_IEEEFP)
+			guess = PIXARLOGDATAFMT_FLOAT;
+		break;
+	 case 16:
+		if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+			guess = PIXARLOGDATAFMT_16BIT;
+		break;
+	 case 12:
+		if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_INT)
+			guess = PIXARLOGDATAFMT_12BITPICIO;
+		break;
+	 case 11:
+		if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+			guess = PIXARLOGDATAFMT_11BITLOG;
+		break;
+	 case 8:
+		if (format == SAMPLEFORMAT_VOID || format == SAMPLEFORMAT_UINT)
+			guess = PIXARLOGDATAFMT_8BIT;
+		break;
+	}
+
+	return guess;
+}
+
+static int
+PixarLogSetupDecode(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	PixarLogState* sp = DecoderState(tif);
+	static const char module[] = "PixarLogSetupDecode";
+
+	assert(sp != NULL);
+
+	/* Make sure no byte swapping happens on the data
+	 * after decompression. */
+	tif->tif_postdecode = _TIFFNoPostDecode;
+
+	/* for some reason, we can't do this in TIFFInitPixarLog */
+
+	sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+	    td->td_samplesperpixel : 1);
+	sp->tbuf = (uint16 *) _TIFFmalloc(sp->stride * 
+		td->td_imagewidth * td->td_rowsperstrip * sizeof(uint16));
+	if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+		sp->user_datafmt = PixarLogGuessDataFmt(td);
+	if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) {
+		TIFFError(module, 
+			"PixarLog compression can't handle bits depth/data format combination (depth: %d)", 
+			td->td_bitspersample);
+		return (0);
+	}
+
+	if (inflateInit(&sp->stream) != Z_OK) {
+		TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+		return (0);
+	} else {
+		sp->state |= PLSTATE_INIT;
+		return (1);
+	}
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+PixarLogPreDecode(TIFF* tif, tsample_t s)
+{
+	PixarLogState* sp = DecoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	sp->stream.next_in = tif->tif_rawdata;
+	sp->stream.avail_in = tif->tif_rawcc;
+	return (inflateReset(&sp->stream) == Z_OK);
+}
+
+static int
+PixarLogDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	PixarLogState* sp = DecoderState(tif);
+	static const char module[] = "PixarLogDecode";
+	int i, nsamples, llen;
+	uint16 *up;
+
+	switch (sp->user_datafmt) {
+	case PIXARLOGDATAFMT_FLOAT:
+		nsamples = occ / sizeof(float);	/* XXX float == 32 bits */
+		break;
+	case PIXARLOGDATAFMT_16BIT:
+	case PIXARLOGDATAFMT_12BITPICIO:
+	case PIXARLOGDATAFMT_11BITLOG:
+		nsamples = occ / sizeof(uint16); /* XXX uint16 == 16 bits */
+		break;
+	case PIXARLOGDATAFMT_8BIT:
+	case PIXARLOGDATAFMT_8BITABGR:
+		nsamples = occ;
+		break;
+	default:
+		TIFFError(tif->tif_name,
+			"%d bit input not supported in PixarLog",
+			td->td_bitspersample);
+		return 0;
+	}
+
+	llen = sp->stride * td->td_imagewidth;
+
+	(void) s;
+	assert(sp != NULL);
+	sp->stream.next_out = (unsigned char *) sp->tbuf;
+	sp->stream.avail_out = nsamples * sizeof(uint16);
+	do {
+		int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
+		if (state == Z_STREAM_END) {
+			break;			/* XXX */
+		}
+		if (state == Z_DATA_ERROR) {
+			TIFFError(module,
+			    "%s: Decoding error at scanline %d, %s",
+			    tif->tif_name, tif->tif_row, sp->stream.msg);
+			if (inflateSync(&sp->stream) != Z_OK)
+				return (0);
+			continue;
+		}
+		if (state != Z_OK) {
+			TIFFError(module, "%s: zlib error: %s",
+			    tif->tif_name, sp->stream.msg);
+			return (0);
+		}
+	} while (sp->stream.avail_out > 0);
+
+	/* hopefully, we got all the bytes we needed */
+	if (sp->stream.avail_out != 0) {
+		TIFFError(module,
+		    "%s: Not enough data at scanline %d (short %d bytes)",
+		    tif->tif_name, tif->tif_row, sp->stream.avail_out);
+		return (0);
+	}
+
+	up = sp->tbuf;
+	/* Swap bytes in the data if from a different endian machine. */
+	if (tif->tif_flags & TIFF_SWAB)
+		TIFFSwabArrayOfShort(up, nsamples);
+
+	for (i = 0; i < nsamples; i += llen, up += llen) {
+		switch (sp->user_datafmt)  {
+		case PIXARLOGDATAFMT_FLOAT:
+			horizontalAccumulateF(up, llen, sp->stride,
+					(float *)op, sp->ToLinearF);
+			op += llen * sizeof(float);
+			break;
+		case PIXARLOGDATAFMT_16BIT:
+			horizontalAccumulate16(up, llen, sp->stride,
+					(uint16 *)op, sp->ToLinear16);
+			op += llen * sizeof(uint16);
+			break;
+		case PIXARLOGDATAFMT_12BITPICIO:
+			horizontalAccumulate12(up, llen, sp->stride,
+					(int16 *)op, sp->ToLinearF);
+			op += llen * sizeof(int16);
+			break;
+		case PIXARLOGDATAFMT_11BITLOG:
+			horizontalAccumulate11(up, llen, sp->stride,
+					(uint16 *)op);
+			op += llen * sizeof(uint16);
+			break;
+		case PIXARLOGDATAFMT_8BIT:
+			horizontalAccumulate8(up, llen, sp->stride,
+					(unsigned char *)op, sp->ToLinear8);
+			op += llen * sizeof(unsigned char);
+			break;
+		case PIXARLOGDATAFMT_8BITABGR:
+			horizontalAccumulate8abgr(up, llen, sp->stride,
+					(unsigned char *)op, sp->ToLinear8);
+			op += llen * sizeof(unsigned char);
+			break;
+		default:
+			TIFFError(tif->tif_name,
+				  "PixarLogDecode: unsupported bits/sample: %d", 
+				  td->td_bitspersample);
+			return (0);
+		}
+	}
+
+	return (1);
+}
+
+static int
+PixarLogSetupEncode(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	PixarLogState* sp = EncoderState(tif);
+	static const char module[] = "PixarLogSetupEncode";
+
+	assert(sp != NULL);
+
+	/* for some reason, we can't do this in TIFFInitPixarLog */
+
+	sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+	    td->td_samplesperpixel : 1);
+	sp->tbuf = (uint16 *) _TIFFmalloc(sp->stride * 
+		td->td_imagewidth * td->td_rowsperstrip * sizeof(uint16));
+	if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN)
+		sp->user_datafmt = PixarLogGuessDataFmt(td);
+	if (sp->user_datafmt == PIXARLOGDATAFMT_UNKNOWN) {
+		TIFFError(module, "PixarLog compression can't handle %d bit linear encodings", td->td_bitspersample);
+		return (0);
+	}
+
+	if (deflateInit(&sp->stream, sp->quality) != Z_OK) {
+		TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+		return (0);
+	} else {
+		sp->state |= PLSTATE_INIT;
+		return (1);
+	}
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int
+PixarLogPreEncode(TIFF* tif, tsample_t s)
+{
+	PixarLogState *sp = EncoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	sp->stream.next_out = tif->tif_rawdata;
+	sp->stream.avail_out = tif->tif_rawdatasize;
+	return (deflateReset(&sp->stream) == Z_OK);
+}
+
+static void
+horizontalDifferenceF(float *ip, int n, int stride, uint16 *wp, uint16 *FromLT2)
+{
+
+    register int  r1, g1, b1, a1, r2, g2, b2, a2, mask;
+    register float  fltsize = Fltsize;
+
+#define  CLAMP(v) ( (v<(float)0.)   ? 0				\
+		  : (v<(float)2.)   ? FromLT2[(int)(v*fltsize)]	\
+		  : (v>(float)24.2) ? 2047			\
+		  : LogK1*log(v*LogK2) + 0.5 )
+
+    mask = CODE_MASK;
+    if (n >= stride) {
+	if (stride == 3) {
+	    r2 = wp[0] = CLAMP(ip[0]);  g2 = wp[1] = CLAMP(ip[1]);
+	    b2 = wp[2] = CLAMP(ip[2]);
+	    n -= 3;
+	    while (n > 0) {
+		n -= 3;
+		wp += 3;
+		ip += 3;
+		r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+		g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+		b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+	    }
+	} else if (stride == 4) {
+	    r2 = wp[0] = CLAMP(ip[0]);  g2 = wp[1] = CLAMP(ip[1]);
+	    b2 = wp[2] = CLAMP(ip[2]);  a2 = wp[3] = CLAMP(ip[3]);
+	    n -= 4;
+	    while (n > 0) {
+		n -= 4;
+		wp += 4;
+		ip += 4;
+		r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+		g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+		b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+		a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1;
+	    }
+	} else {
+	    ip += n - 1;	/* point to last one */
+	    wp += n - 1;	/* point to last one */
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride, wp[0] = CLAMP(ip[0]);
+				wp[stride] -= wp[0];
+				wp[stride] &= mask;
+				wp--; ip--)
+		n -= stride;
+	    }
+	    REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--)
+	}
+    }
+}
+
+static void
+horizontalDifference16(unsigned short *ip, int n, int stride, 
+	unsigned short *wp, uint16 *From14)
+{
+    register int  r1, g1, b1, a1, r2, g2, b2, a2, mask;
+
+/* assumption is unsigned pixel values */
+#undef   CLAMP
+#define  CLAMP(v) From14[(v) >> 2]
+
+    mask = CODE_MASK;
+    if (n >= stride) {
+	if (stride == 3) {
+	    r2 = wp[0] = CLAMP(ip[0]);  g2 = wp[1] = CLAMP(ip[1]);
+	    b2 = wp[2] = CLAMP(ip[2]);
+	    n -= 3;
+	    while (n > 0) {
+		n -= 3;
+		wp += 3;
+		ip += 3;
+		r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+		g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+		b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+	    }
+	} else if (stride == 4) {
+	    r2 = wp[0] = CLAMP(ip[0]);  g2 = wp[1] = CLAMP(ip[1]);
+	    b2 = wp[2] = CLAMP(ip[2]);  a2 = wp[3] = CLAMP(ip[3]);
+	    n -= 4;
+	    while (n > 0) {
+		n -= 4;
+		wp += 4;
+		ip += 4;
+		r1 = CLAMP(ip[0]); wp[0] = (r1-r2) & mask; r2 = r1;
+		g1 = CLAMP(ip[1]); wp[1] = (g1-g2) & mask; g2 = g1;
+		b1 = CLAMP(ip[2]); wp[2] = (b1-b2) & mask; b2 = b1;
+		a1 = CLAMP(ip[3]); wp[3] = (a1-a2) & mask; a2 = a1;
+	    }
+	} else {
+	    ip += n - 1;	/* point to last one */
+	    wp += n - 1;	/* point to last one */
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride, wp[0] = CLAMP(ip[0]);
+				wp[stride] -= wp[0];
+				wp[stride] &= mask;
+				wp--; ip--)
+		n -= stride;
+	    }
+	    REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--)
+	}
+    }
+}
+
+
+static void
+horizontalDifference8(unsigned char *ip, int n, int stride, 
+	unsigned short *wp, uint16 *From8)
+{
+    register int  r1, g1, b1, a1, r2, g2, b2, a2, mask;
+
+#undef	 CLAMP
+#define  CLAMP(v) (From8[(v)])
+
+    mask = CODE_MASK;
+    if (n >= stride) {
+	if (stride == 3) {
+	    r2 = wp[0] = CLAMP(ip[0]);  g2 = wp[1] = CLAMP(ip[1]);
+	    b2 = wp[2] = CLAMP(ip[2]);
+	    n -= 3;
+	    while (n > 0) {
+		n -= 3;
+		r1 = CLAMP(ip[3]); wp[3] = (r1-r2) & mask; r2 = r1;
+		g1 = CLAMP(ip[4]); wp[4] = (g1-g2) & mask; g2 = g1;
+		b1 = CLAMP(ip[5]); wp[5] = (b1-b2) & mask; b2 = b1;
+		wp += 3;
+		ip += 3;
+	    }
+	} else if (stride == 4) {
+	    r2 = wp[0] = CLAMP(ip[0]);  g2 = wp[1] = CLAMP(ip[1]);
+	    b2 = wp[2] = CLAMP(ip[2]);  a2 = wp[3] = CLAMP(ip[3]);
+	    n -= 4;
+	    while (n > 0) {
+		n -= 4;
+		r1 = CLAMP(ip[4]); wp[4] = (r1-r2) & mask; r2 = r1;
+		g1 = CLAMP(ip[5]); wp[5] = (g1-g2) & mask; g2 = g1;
+		b1 = CLAMP(ip[6]); wp[6] = (b1-b2) & mask; b2 = b1;
+		a1 = CLAMP(ip[7]); wp[7] = (a1-a2) & mask; a2 = a1;
+		wp += 4;
+		ip += 4;
+	    }
+	} else {
+	    wp += n + stride - 1;	/* point to last one */
+	    ip += n + stride - 1;	/* point to last one */
+	    n -= stride;
+	    while (n > 0) {
+		REPEAT(stride, wp[0] = CLAMP(ip[0]);
+				wp[stride] -= wp[0];
+				wp[stride] &= mask;
+				wp--; ip--)
+		n -= stride;
+	    }
+	    REPEAT(stride, wp[0] = CLAMP(ip[0]); wp--; ip--)
+	}
+    }
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int
+PixarLogEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	PixarLogState *sp = EncoderState(tif);
+	static const char module[] = "PixarLogEncode";
+	int 	i, n, llen;
+	unsigned short * up;
+
+	(void) s;
+
+	switch (sp->user_datafmt) {
+	case PIXARLOGDATAFMT_FLOAT:
+		n = cc / sizeof(float);		/* XXX float == 32 bits */
+		break;
+	case PIXARLOGDATAFMT_16BIT:
+	case PIXARLOGDATAFMT_12BITPICIO:
+	case PIXARLOGDATAFMT_11BITLOG:
+		n = cc / sizeof(uint16);	/* XXX uint16 == 16 bits */
+		break;
+	case PIXARLOGDATAFMT_8BIT:
+	case PIXARLOGDATAFMT_8BITABGR:
+		n = cc;
+		break;
+	default:
+		TIFFError(tif->tif_name,
+			"%d bit input not supported in PixarLog",
+			td->td_bitspersample);
+		return 0;
+	}
+
+	llen = sp->stride * td->td_imagewidth;
+
+	for (i = 0, up = sp->tbuf; i < n; i += llen, up += llen) {
+		switch (sp->user_datafmt)  {
+		case PIXARLOGDATAFMT_FLOAT:
+			horizontalDifferenceF((float *)bp, llen, 
+				sp->stride, up, sp->FromLT2);
+			bp += llen * sizeof(float);
+			break;
+		case PIXARLOGDATAFMT_16BIT:
+			horizontalDifference16((uint16 *)bp, llen, 
+				sp->stride, up, sp->From14);
+			bp += llen * sizeof(uint16);
+			break;
+		case PIXARLOGDATAFMT_8BIT:
+			horizontalDifference8((unsigned char *)bp, llen, 
+				sp->stride, up, sp->From8);
+			bp += llen * sizeof(unsigned char);
+			break;
+		default:
+			TIFFError(tif->tif_name,
+				"%d bit input not supported in PixarLog",
+				td->td_bitspersample);
+			return 0;
+		}
+	}
+ 
+	sp->stream.next_in = (unsigned char *) sp->tbuf;
+	sp->stream.avail_in = n * sizeof(uint16);
+
+	do {
+		if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
+			TIFFError(module, "%s: Encoder error: %s",
+			    tif->tif_name, sp->stream.msg);
+			return (0);
+		}
+		if (sp->stream.avail_out == 0) {
+			tif->tif_rawcc = tif->tif_rawdatasize;
+			TIFFFlushData1(tif);
+			sp->stream.next_out = tif->tif_rawdata;
+			sp->stream.avail_out = tif->tif_rawdatasize;
+		}
+	} while (sp->stream.avail_in > 0);
+	return (1);
+}
+
+/*
+ * Finish off an encoded strip by flushing the last
+ * string and tacking on an End Of Information code.
+ */
+
+static int
+PixarLogPostEncode(TIFF* tif)
+{
+	PixarLogState *sp = EncoderState(tif);
+	static const char module[] = "PixarLogPostEncode";
+	int state;
+
+	sp->stream.avail_in = 0;
+
+	do {
+		state = deflate(&sp->stream, Z_FINISH);
+		switch (state) {
+		case Z_STREAM_END:
+		case Z_OK:
+		    if (sp->stream.avail_out != tif->tif_rawdatasize) {
+			    tif->tif_rawcc =
+				tif->tif_rawdatasize - sp->stream.avail_out;
+			    TIFFFlushData1(tif);
+			    sp->stream.next_out = tif->tif_rawdata;
+			    sp->stream.avail_out = tif->tif_rawdatasize;
+		    }
+		    break;
+		default:
+		    TIFFError(module, "%s: zlib error: %s",
+			tif->tif_name, sp->stream.msg);
+		    return (0);
+		}
+	} while (state != Z_STREAM_END);
+	return (1);
+}
+
+static void
+PixarLogClose(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	/* In a really sneaky maneuver, on close, we covertly modify both
+	 * bitspersample and sampleformat in the directory to indicate
+	 * 8-bit linear.  This way, the decode "just works" even for
+	 * readers that don't know about PixarLog, or how to set
+	 * the PIXARLOGDATFMT pseudo-tag.
+	 */
+	td->td_bitspersample = 8;
+	td->td_sampleformat = SAMPLEFORMAT_UINT;
+}
+
+static void
+PixarLogCleanup(TIFF* tif)
+{
+	PixarLogState* sp = (PixarLogState*) tif->tif_data;
+
+	if (sp) {
+		if (sp->FromLT2) _TIFFfree(sp->FromLT2);
+		if (sp->From14) _TIFFfree(sp->From14);
+		if (sp->From8) _TIFFfree(sp->From8);
+		if (sp->ToLinearF) _TIFFfree(sp->ToLinearF);
+		if (sp->ToLinear16) _TIFFfree(sp->ToLinear16);
+		if (sp->ToLinear8) _TIFFfree(sp->ToLinear8);
+		if (sp->state&PLSTATE_INIT) {
+			if (tif->tif_mode == O_RDONLY)
+				inflateEnd(&sp->stream);
+			else
+				deflateEnd(&sp->stream);
+		}
+		if (sp->tbuf)
+			_TIFFfree(sp->tbuf);
+		_TIFFfree(sp);
+		tif->tif_data = NULL;
+	}
+}
+
+static int
+PixarLogVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+    PixarLogState *sp = (PixarLogState *)tif->tif_data;
+    int result;
+    static const char module[] = "PixarLogVSetField";
+
+    switch (tag) {
+     case TIFFTAG_PIXARLOGQUALITY:
+		sp->quality = va_arg(ap, int);
+		if (tif->tif_mode != O_RDONLY && (sp->state&PLSTATE_INIT)) {
+			if (deflateParams(&sp->stream,
+			    sp->quality, Z_DEFAULT_STRATEGY) != Z_OK) {
+				TIFFError(module, "%s: zlib error: %s",
+					tif->tif_name, sp->stream.msg);
+				return (0);
+			}
+		}
+		return (1);
+     case TIFFTAG_PIXARLOGDATAFMT:
+	sp->user_datafmt = va_arg(ap, int);
+	/* Tweak the TIFF header so that the rest of libtiff knows what
+	 * size of data will be passed between app and library, and
+	 * assume that the app knows what it is doing and is not
+	 * confused by these header manipulations...
+	 */
+	switch (sp->user_datafmt) {
+	 case PIXARLOGDATAFMT_8BIT:
+	 case PIXARLOGDATAFMT_8BITABGR:
+	    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
+	    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+	    break;
+	 case PIXARLOGDATAFMT_11BITLOG:
+	    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+	    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+	    break;
+	 case PIXARLOGDATAFMT_12BITPICIO:
+	    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+	    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT);
+	    break;
+	 case PIXARLOGDATAFMT_16BIT:
+	    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 16);
+	    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
+	    break;
+	 case PIXARLOGDATAFMT_FLOAT:
+	    TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 32);
+	    TIFFSetField(tif, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
+	    break;
+	}
+	/*
+	 * Must recalculate sizes should bits/sample change.
+	 */
+	tif->tif_tilesize = TIFFTileSize(tif);
+	tif->tif_scanlinesize = TIFFScanlineSize(tif);
+	result = 1;		/* NB: pseudo tag */
+	break;
+     default:
+	result = (*sp->vsetparent)(tif, tag, ap);
+    }
+    return (result);
+}
+
+static int
+PixarLogVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+    PixarLogState *sp = (PixarLogState *)tif->tif_data;
+
+    switch (tag) {
+     case TIFFTAG_PIXARLOGQUALITY:
+	*va_arg(ap, int*) = sp->quality;
+	break;
+     case TIFFTAG_PIXARLOGDATAFMT:
+	*va_arg(ap, int*) = sp->user_datafmt;
+	break;
+     default:
+	return (*sp->vgetparent)(tif, tag, ap);
+    }
+    return (1);
+}
+
+static const TIFFFieldInfo pixarlogFieldInfo[] = {
+    {TIFFTAG_PIXARLOGDATAFMT,0,0,TIFF_ANY,  FIELD_PSEUDO,FALSE,FALSE,""},
+    {TIFFTAG_PIXARLOGQUALITY,0,0,TIFF_ANY,  FIELD_PSEUDO,FALSE,FALSE,""}
+};
+
+int
+TIFFInitPixarLog(TIFF* tif, int scheme)
+{
+	PixarLogState* sp;
+
+	assert(scheme == COMPRESSION_PIXARLOG);
+
+	/*
+	 * Allocate state block so tag methods have storage to record values.
+	 */
+	tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (PixarLogState));
+	if (tif->tif_data == NULL)
+		goto bad;
+	sp = (PixarLogState*) tif->tif_data;
+	memset(sp, 0, sizeof (*sp));
+	sp->stream.data_type = Z_BINARY;
+	sp->user_datafmt = PIXARLOGDATAFMT_UNKNOWN;
+
+	/*
+	 * Install codec methods.
+	 */
+	tif->tif_setupdecode = PixarLogSetupDecode;
+	tif->tif_predecode = PixarLogPreDecode;
+	tif->tif_decoderow = PixarLogDecode;
+	tif->tif_decodestrip = PixarLogDecode;
+	tif->tif_decodetile = PixarLogDecode;
+	tif->tif_setupencode = PixarLogSetupEncode;
+	tif->tif_preencode = PixarLogPreEncode;
+	tif->tif_postencode = PixarLogPostEncode;
+	tif->tif_encoderow = PixarLogEncode;
+	tif->tif_encodestrip = PixarLogEncode;
+	tif->tif_encodetile = PixarLogEncode;
+	tif->tif_close = PixarLogClose;
+	tif->tif_cleanup = PixarLogCleanup;
+
+	/* Override SetField so we can handle our private pseudo-tag */
+	_TIFFMergeFieldInfo(tif, pixarlogFieldInfo, N(pixarlogFieldInfo));
+	sp->vgetparent = tif->tif_tagmethods.vgetfield;
+	tif->tif_tagmethods.vgetfield = PixarLogVGetField;   /* hook for codec tags */
+	sp->vsetparent = tif->tif_tagmethods.vsetfield;
+	tif->tif_tagmethods.vsetfield = PixarLogVSetField;   /* hook for codec tags */
+
+	/* Default values for codec-specific fields */
+	sp->quality = Z_DEFAULT_COMPRESSION; /* default comp. level */
+	sp->state = 0;
+
+	/* we don't wish to use the predictor, 
+	 * the default is none, which predictor value 1
+	 */
+	(void) TIFFPredictorInit(tif);
+
+	/*
+	 * build the companding tables 
+	 */
+	PixarLogMakeTables(sp);
+
+	return (1);
+bad:
+	TIFFError("TIFFInitPixarLog", "No space for PixarLog state block");
+	return (0);
+}
+#endif /* PIXARLOG_SUPPORT */
diff --git a/src/tiff/tif_predict.c b/src/tiff/tif_predict.c
new file mode 100644
index 0000000..670c28b
--- /dev/null
+++ b/src/tiff/tif_predict.c
@@ -0,0 +1,464 @@
+/* $Header: /home/terralib/src/tiff/tif_predict.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Predictor Tag Support (used by multiple codecs).
+ */
+#include "tiffiop.h"
+#include "tif_predict.h"
+
+#include <assert.h>
+
+#define	PredictorState(tif)	((TIFFPredictorState*) (tif)->tif_data)
+
+static	void horAcc8(TIFF*, tidata_t, tsize_t);
+static	void horAcc16(TIFF*, tidata_t, tsize_t);
+static	void swabHorAcc16(TIFF*, tidata_t, tsize_t);
+static	void horDiff8(TIFF*, tidata_t, tsize_t);
+static	void horDiff16(TIFF*, tidata_t, tsize_t);
+static	int PredictorDecodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int PredictorDecodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int PredictorEncodeRow(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int PredictorEncodeTile(TIFF*, tidata_t, tsize_t, tsample_t);
+
+static int
+PredictorSetup(TIFF* tif)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	TIFFDirectory* td = &tif->tif_dir;
+
+	if (sp->predictor == 1)		/* no differencing */
+		return (1);
+	if (sp->predictor != 2) {
+		TIFFError(tif->tif_name, "\"Predictor\" value %d not supported",
+		    sp->predictor);
+		return (0);
+	}
+	if (td->td_bitspersample != 8 && td->td_bitspersample != 16) {
+		TIFFError(tif->tif_name,
+    "Horizontal differencing \"Predictor\" not supported with %d-bit samples",
+		    td->td_bitspersample);
+		return (0);
+	}
+	sp->stride = (td->td_planarconfig == PLANARCONFIG_CONTIG ?
+	    td->td_samplesperpixel : 1);
+	/*
+	 * Calculate the scanline/tile-width size in bytes.
+	 */
+	if (isTiled(tif))
+		sp->rowsize = TIFFTileRowSize(tif);
+	else
+		sp->rowsize = TIFFScanlineSize(tif);
+	return (1);
+}
+
+static int
+PredictorSetupDecode(TIFF* tif)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	TIFFDirectory* td = &tif->tif_dir;
+
+	if (!(*sp->setupdecode)(tif) || !PredictorSetup(tif))
+		return (0);
+	if (sp->predictor == 2) {
+		switch (td->td_bitspersample) {
+		case 8:  sp->pfunc = horAcc8; break;
+		case 16: sp->pfunc = horAcc16; break;
+		}
+		/*
+		 * Override default decoding method with
+		 * one that does the predictor stuff.
+		 */
+		sp->coderow = tif->tif_decoderow;
+		tif->tif_decoderow = PredictorDecodeRow;
+		sp->codestrip = tif->tif_decodestrip;
+		tif->tif_decodestrip = PredictorDecodeTile;
+		sp->codetile = tif->tif_decodetile;
+		tif->tif_decodetile = PredictorDecodeTile;
+		/*
+		 * If the data is horizontally differenced
+		 * 16-bit data that requires byte-swapping,
+		 * then it must be byte swapped before the
+		 * accumulation step.  We do this with a
+		 * special-purpose routine and override the
+		 * normal post decoding logic that the library
+		 * setup when the directory was read.
+		 */
+		if (tif->tif_flags&TIFF_SWAB) {
+			if (sp->pfunc == horAcc16) {
+				sp->pfunc = swabHorAcc16;
+				tif->tif_postdecode = _TIFFNoPostDecode;
+			} /* else handle 32-bit case... */
+		}
+	}
+	return (1);
+}
+
+static int
+PredictorSetupEncode(TIFF* tif)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	TIFFDirectory* td = &tif->tif_dir;
+
+	if (!(*sp->setupencode)(tif) || !PredictorSetup(tif))
+		return (0);
+	if (sp->predictor == 2) {
+		switch (td->td_bitspersample) {
+		case 8:  sp->pfunc = horDiff8; break;
+		case 16: sp->pfunc = horDiff16; break;
+		}
+		/*
+		 * Override default encoding method with
+		 * one that does the predictor stuff.
+		 */
+		sp->coderow = tif->tif_encoderow;
+		tif->tif_encoderow = PredictorEncodeRow;
+		sp->codestrip = tif->tif_encodestrip;
+		tif->tif_encodestrip = PredictorEncodeTile;
+		sp->codetile = tif->tif_encodetile;
+		tif->tif_encodetile = PredictorEncodeTile;
+	}
+	return (1);
+}
+
+#define REPEAT4(n, op)		\
+    switch (n) {		\
+    default: { int i; for (i = n-4; i > 0; i--) { op; } } \
+    case 4:  op;		\
+    case 3:  op;		\
+    case 2:  op;		\
+    case 1:  op;		\
+    case 0:  ;			\
+    }
+
+static void
+horAcc8(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	tsize_t stride = sp->stride;
+
+	char* cp = (char*) cp0;
+	if (cc > stride) {
+		cc -= stride;
+		/*
+		 * Pipeline the most common cases.
+		 */
+		if (stride == 3)  {
+			u_int cr = cp[0];
+			u_int cg = cp[1];
+			u_int cb = cp[2];
+			do {
+				cc -= 3, cp += 3;
+				cp[0] = (char) (cr += cp[0]);
+				cp[1] = (char) (cg += cp[1]);
+				cp[2] = (char) (cb += cp[2]);
+			} while ((int32) cc > 0);
+		} else if (stride == 4)  {
+			u_int cr = cp[0];
+			u_int cg = cp[1];
+			u_int cb = cp[2];
+			u_int ca = cp[3];
+			do {
+				cc -= 4, cp += 4;
+				cp[0] = (char) (cr += cp[0]);
+				cp[1] = (char) (cg += cp[1]);
+				cp[2] = (char) (cb += cp[2]);
+				cp[3] = (char) (ca += cp[3]);
+			} while ((int32) cc > 0);
+		} else  {
+			do {
+				REPEAT4(stride, cp[stride] = (char) (cp[stride] + *cp); cp++)
+				cc -= stride;
+			} while ((int32) cc > 0);
+		}
+	}
+}
+
+static void
+swabHorAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	tsize_t stride = sp->stride;
+	uint16* wp = (uint16*) cp0;
+	tsize_t wc = cc / 2;
+
+	if (wc > stride) {
+		TIFFSwabArrayOfShort(wp, wc);
+		wc -= stride;
+		do {
+			REPEAT4(stride, wp[stride] += wp[0]; wp++)
+			wc -= stride;
+		} while ((int32) wc > 0);
+	}
+}
+
+static void
+horAcc16(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+	tsize_t stride = PredictorState(tif)->stride;
+	uint16* wp = (uint16*) cp0;
+	tsize_t wc = cc / 2;
+
+	if (wc > stride) {
+		wc -= stride;
+		do {
+			REPEAT4(stride, wp[stride] += wp[0]; wp++)
+			wc -= stride;
+		} while ((int32) wc > 0);
+	}
+}
+
+/*
+ * Decode a scanline and apply the predictor routine.
+ */
+static int
+PredictorDecodeRow(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+	TIFFPredictorState *sp = PredictorState(tif);
+
+	assert(sp != NULL);
+	assert(sp->coderow != NULL);
+	assert(sp->pfunc != NULL);
+	if ((*sp->coderow)(tif, op0, occ0, s)) {
+		(*sp->pfunc)(tif, op0, occ0);
+		return (1);
+	} else
+		return (0);
+}
+
+/*
+ * Decode a tile/strip and apply the predictor routine.
+ * Note that horizontal differencing must be done on a
+ * row-by-row basis.  The width of a "row" has already
+ * been calculated at pre-decode time according to the
+ * strip/tile dimensions.
+ */
+static int
+PredictorDecodeTile(TIFF* tif, tidata_t op0, tsize_t occ0, tsample_t s)
+{
+	TIFFPredictorState *sp = PredictorState(tif);
+
+	assert(sp != NULL);
+	assert(sp->codetile != NULL);
+	if ((*sp->codetile)(tif, op0, occ0, s)) {
+		tsize_t rowsize = sp->rowsize;
+		assert(rowsize > 0);
+		assert(sp->pfunc != NULL);
+		while ((long)occ0 > 0) {
+			(*sp->pfunc)(tif, op0, (tsize_t) rowsize);
+			occ0 -= rowsize;
+			op0 += rowsize;
+		}
+		return (1);
+	} else
+		return (0);
+}
+
+static void
+horDiff8(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	tsize_t stride = sp->stride;
+	char* cp = (char*) cp0;
+
+	if (cc > stride) {
+		cc -= stride;
+		/*
+		 * Pipeline the most common cases.
+		 */
+		if (stride == 3) {
+			int r1, g1, b1;
+			int r2 = cp[0];
+			int g2 = cp[1];
+			int b2 = cp[2];
+			do {
+				r1 = cp[3]; cp[3] = r1-r2; r2 = r1;
+				g1 = cp[4]; cp[4] = g1-g2; g2 = g1;
+				b1 = cp[5]; cp[5] = b1-b2; b2 = b1;
+				cp += 3;
+			} while ((int32)(cc -= 3) > 0);
+		} else if (stride == 4) {
+			int r1, g1, b1, a1;
+			int r2 = cp[0];
+			int g2 = cp[1];
+			int b2 = cp[2];
+			int a2 = cp[3];
+			do {
+				r1 = cp[4]; cp[4] = r1-r2; r2 = r1;
+				g1 = cp[5]; cp[5] = g1-g2; g2 = g1;
+				b1 = cp[6]; cp[6] = b1-b2; b2 = b1;
+				a1 = cp[7]; cp[7] = a1-a2; a2 = a1;
+				cp += 4;
+			} while ((int32)(cc -= 4) > 0);
+		} else {
+			cp += cc - 1;
+			do {
+				REPEAT4(stride, cp[stride] -= cp[0]; cp--)
+			} while ((int32)(cc -= stride) > 0);
+		}
+	}
+}
+
+static void
+horDiff16(TIFF* tif, tidata_t cp0, tsize_t cc)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+	tsize_t stride = sp->stride;
+	int16 *wp = (int16*) cp0;
+	tsize_t wc = cc/2;
+
+	if (wc > stride) {
+		wc -= stride;
+		wp += wc - 1;
+		do {
+			REPEAT4(stride, wp[stride] -= wp[0]; wp--)
+			wc -= stride;
+		} while ((int32) wc > 0);
+	}
+}
+
+static int
+PredictorEncodeRow(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	TIFFPredictorState *sp = PredictorState(tif);
+
+	assert(sp != NULL);
+	assert(sp->pfunc != NULL);
+	assert(sp->coderow != NULL);
+/* XXX horizontal differencing alters user's data XXX */
+	(*sp->pfunc)(tif, bp, cc);
+	return ((*sp->coderow)(tif, bp, cc, s));
+}
+
+static int
+PredictorEncodeTile(TIFF* tif, tidata_t bp0, tsize_t cc0, tsample_t s)
+{
+	TIFFPredictorState *sp = PredictorState(tif);
+	tsize_t cc = cc0, rowsize;
+	u_char* bp = bp0;
+
+	assert(sp != NULL);
+	assert(sp->pfunc != NULL);
+	assert(sp->codetile != NULL);
+	rowsize = sp->rowsize;
+	assert(rowsize > 0);
+	while ((long)cc > 0) {
+		(*sp->pfunc)(tif, bp, (tsize_t) rowsize);
+		cc -= rowsize;
+		bp += rowsize;
+	}
+	return ((*sp->codetile)(tif, bp0, cc0, s));
+}
+
+#define	FIELD_PREDICTOR	(FIELD_CODEC+0)		/* XXX */
+
+static const TIFFFieldInfo predictFieldInfo[] = {
+    { TIFFTAG_PREDICTOR,	 1, 1, TIFF_SHORT,	FIELD_PREDICTOR,
+      FALSE,	FALSE,	"Predictor" },
+};
+#define	N(a)	(sizeof (a) / sizeof (a[0]))
+
+static int
+PredictorVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	TIFFPredictorState *sp = PredictorState(tif);
+
+	switch (tag) {
+	case TIFFTAG_PREDICTOR:
+		sp->predictor = (uint16) va_arg(ap, int);
+		TIFFSetFieldBit(tif, FIELD_PREDICTOR);
+		break;
+	default:
+		return (*sp->vsetparent)(tif, tag, ap);
+	}
+	tif->tif_flags |= TIFF_DIRTYDIRECT;
+	return (1);
+}
+
+static int
+PredictorVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	TIFFPredictorState *sp = PredictorState(tif);
+
+	switch (tag) {
+	case TIFFTAG_PREDICTOR:
+		*va_arg(ap, uint16*) = sp->predictor;
+		break;
+	default:
+		return (*sp->vgetparent)(tif, tag, ap);
+	}
+	return (1);
+}
+
+static void
+PredictorPrintDir(TIFF* tif, FILE* fd, long flags)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+
+	(void) flags;
+	if (TIFFFieldSet(tif,FIELD_PREDICTOR)) {
+		fprintf(fd, "  Predictor: ");
+		switch (sp->predictor) {
+		case 1: fprintf(fd, "none "); break;
+		case 2: fprintf(fd, "horizontal differencing "); break;
+		}
+		fprintf(fd, "%u (0x%x)\n", sp->predictor, sp->predictor);
+	}
+	if (sp->printdir)
+		(*sp->printdir)(tif, fd, flags);
+}
+
+int
+TIFFPredictorInit(TIFF* tif)
+{
+	TIFFPredictorState* sp = PredictorState(tif);
+
+	/*
+	 * Merge codec-specific tag information and
+	 * override parent get/set field methods.
+	 */
+	_TIFFMergeFieldInfo(tif, predictFieldInfo, N(predictFieldInfo));
+	sp->vgetparent = tif->tif_tagmethods.vgetfield;
+	tif->tif_tagmethods.vgetfield =
+            PredictorVGetField;/* hook for predictor tag */
+	sp->vsetparent = tif->tif_tagmethods.vsetfield;
+	tif->tif_tagmethods.vsetfield =
+            PredictorVSetField;/* hook for predictor tag */
+	sp->printdir = tif->tif_tagmethods.printdir;
+	tif->tif_tagmethods.printdir =
+            PredictorPrintDir;	/* hook for predictor tag */
+
+	sp->setupdecode = tif->tif_setupdecode;
+	tif->tif_setupdecode = PredictorSetupDecode;
+	sp->setupencode = tif->tif_setupencode;
+	tif->tif_setupencode = PredictorSetupEncode;
+
+	sp->predictor = 1;			/* default value */
+	sp->pfunc = NULL;			/* no predictor routine */
+	return (1);
+}
diff --git a/src/tiff/tif_predict.h b/src/tiff/tif_predict.h
new file mode 100644
index 0000000..b40fb76
--- /dev/null
+++ b/src/tiff/tif_predict.h
@@ -0,0 +1,61 @@
+/* $Header: /home/terralib/src/tiff/tif_predict.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1995-1997 Sam Leffler
+ * Copyright (c) 1995-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFPREDICT_
+#define	_TIFFPREDICT_
+/*
+ * ``Library-private'' Support for the Predictor Tag
+ */
+
+/*
+ * Codecs that want to support the Predictor tag must place
+ * this structure first in their private state block so that
+ * the predictor code can cast tif_data to find its state.
+ */
+typedef struct {
+	int	predictor;		/* predictor tag value */
+	int	stride;			/* sample stride over data */
+	tsize_t	rowsize;		/* tile/strip row size */
+
+	TIFFPostMethod	pfunc;		/* horizontal differencer/accumulator */
+	TIFFCodeMethod	coderow;	/* parent codec encode/decode row */
+	TIFFCodeMethod	codestrip;	/* parent codec encode/decode strip */
+	TIFFCodeMethod	codetile;	/* parent codec encode/decode tile */
+	TIFFVGetMethod	vgetparent;	/* super-class method */
+	TIFFVSetMethod	vsetparent;	/* super-class method */
+	TIFFPrintMethod	printdir;	/* super-class method */
+	TIFFBoolMethod	setupdecode;	/* super-class method */
+	TIFFBoolMethod	setupencode;	/* super-class method */
+} TIFFPredictorState;
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern	int TIFFPredictorInit(TIFF*);
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFPREDICT_ */
diff --git a/src/tiff/tif_print.c b/src/tiff/tif_print.c
new file mode 100644
index 0000000..087e565
--- /dev/null
+++ b/src/tiff/tif_print.c
@@ -0,0 +1,613 @@
+/* $Header: /home/terralib/src/tiff/tif_print.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Directory Printing Support
+ */
+#include "tiffiop.h"
+#include <stdio.h>
+
+#include <ctype.h>
+
+static const char *photoNames[] = {
+    "min-is-white",				/* PHOTOMETRIC_MINISWHITE */
+    "min-is-black",				/* PHOTOMETRIC_MINISBLACK */
+    "RGB color",				/* PHOTOMETRIC_RGB */
+    "palette color (RGB from colormap)",	/* PHOTOMETRIC_PALETTE */
+    "transparency mask",			/* PHOTOMETRIC_MASK */
+    "separated",				/* PHOTOMETRIC_SEPARATED */
+    "YCbCr",					/* PHOTOMETRIC_YCBCR */
+    "7 (0x7)",
+    "CIE L*a*b*",				/* PHOTOMETRIC_CIELAB */
+};
+#define	NPHOTONAMES	(sizeof (photoNames) / sizeof (photoNames[0]))
+
+static const char *orientNames[] = {
+    "0 (0x0)",
+    "row 0 top, col 0 lhs",			/* ORIENTATION_TOPLEFT */
+    "row 0 top, col 0 rhs",			/* ORIENTATION_TOPRIGHT */
+    "row 0 bottom, col 0 rhs",			/* ORIENTATION_BOTRIGHT */
+    "row 0 bottom, col 0 lhs",			/* ORIENTATION_BOTLEFT */
+    "row 0 lhs, col 0 top",			/* ORIENTATION_LEFTTOP */
+    "row 0 rhs, col 0 top",			/* ORIENTATION_RIGHTTOP */
+    "row 0 rhs, col 0 bottom",			/* ORIENTATION_RIGHTBOT */
+    "row 0 lhs, col 0 bottom",			/* ORIENTATION_LEFTBOT */
+};
+#define	NORIENTNAMES	(sizeof (orientNames) / sizeof (orientNames[0]))
+
+/*
+ * Print the contents of the current directory
+ * to the specified stdio file stream.
+ */
+void
+TIFFPrintDirectory(TIFF* tif, FILE* fd, long flags)
+{
+	register TIFFDirectory *td;
+	char *sep;
+	uint16 i;
+	long l, n;
+
+	fprintf(fd, "TIFF Directory at offset 0x%lx\n", tif->tif_diroff);
+	td = &tif->tif_dir;
+	if (TIFFFieldSet(tif,FIELD_SUBFILETYPE)) {
+		fprintf(fd, "  Subfile Type:");
+		sep = " ";
+		if (td->td_subfiletype & FILETYPE_REDUCEDIMAGE) {
+			fprintf(fd, "%sreduced-resolution image", sep);
+			sep = "/";
+		}
+		if (td->td_subfiletype & FILETYPE_PAGE) {
+			fprintf(fd, "%smulti-page document", sep);
+			sep = "/";
+		}
+		if (td->td_subfiletype & FILETYPE_MASK)
+			fprintf(fd, "%stransparency mask", sep);
+		fprintf(fd, " (%lu = 0x%lx)\n",
+		    (long) td->td_subfiletype, (long) td->td_subfiletype);
+	}
+	if (TIFFFieldSet(tif,FIELD_IMAGEDIMENSIONS)) {
+		fprintf(fd, "  Image Width: %lu Image Length: %lu",
+		    (u_long) td->td_imagewidth, (u_long) td->td_imagelength);
+		if (TIFFFieldSet(tif,FIELD_IMAGEDEPTH))
+			fprintf(fd, " Image Depth: %lu",
+			    (u_long) td->td_imagedepth);
+		fprintf(fd, "\n");
+	}
+
+ 	/* Begin Pixar */
+ 	if (TIFFFieldSet(tif,FIELD_IMAGEFULLWIDTH) ||
+ 	    TIFFFieldSet(tif,FIELD_IMAGEFULLLENGTH)) {
+	  fprintf(fd, "  Pixar Full Image Width: %lu Full Image Length: %lu\n",
+		  (u_long) td->td_imagefullwidth,
+		  (u_long) td->td_imagefulllength);
+ 	}
+ 	if (TIFFFieldSet(tif,FIELD_TEXTUREFORMAT))
+	  _TIFFprintAsciiTag(fd, "Texture Format", td->td_textureformat);
+ 	if (TIFFFieldSet(tif,FIELD_WRAPMODES))
+	  _TIFFprintAsciiTag(fd, "Texture Wrap Modes", td->td_wrapmodes);
+ 	if (TIFFFieldSet(tif,FIELD_FOVCOT))
+	  fprintf(fd, "  Field of View Cotangent: %g\n", td->td_fovcot);
+	if (TIFFFieldSet(tif,FIELD_MATRIX_WORLDTOSCREEN)) {
+	  typedef float	Matrix[4][4];
+	  Matrix*		m = (Matrix*)td->td_matrixWorldToScreen;
+	  
+	  fprintf(fd, "  Matrix NP:\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n",
+		  (*m)[0][0], (*m)[0][1], (*m)[0][2], (*m)[0][3],
+		  (*m)[1][0], (*m)[1][1], (*m)[1][2], (*m)[1][3],
+		  (*m)[2][0], (*m)[2][1], (*m)[2][2], (*m)[2][3],
+		  (*m)[3][0], (*m)[3][1], (*m)[3][2], (*m)[3][3]);
+ 	}
+ 	if (TIFFFieldSet(tif,FIELD_MATRIX_WORLDTOCAMERA)) {
+	  typedef float	Matrix[4][4];
+	  Matrix*		m = (Matrix*)td->td_matrixWorldToCamera;
+	  
+	  fprintf(fd, "  Matrix Nl:\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n\t%g %g %g %g\n",
+		  (*m)[0][0], (*m)[0][1], (*m)[0][2], (*m)[0][3],
+		  (*m)[1][0], (*m)[1][1], (*m)[1][2], (*m)[1][3],
+		  (*m)[2][0], (*m)[2][1], (*m)[2][2], (*m)[2][3],
+		  (*m)[3][0], (*m)[3][1], (*m)[3][2], (*m)[3][3]);
+ 	}
+ 	/* End Pixar */
+	
+	if (TIFFFieldSet(tif,FIELD_TILEDIMENSIONS)) {
+		fprintf(fd, "  Tile Width: %lu Tile Length: %lu",
+		    (u_long) td->td_tilewidth, (u_long) td->td_tilelength);
+		if (TIFFFieldSet(tif,FIELD_TILEDEPTH))
+			fprintf(fd, " Tile Depth: %lu",
+			    (u_long) td->td_tiledepth);
+		fprintf(fd, "\n");
+	}
+	if (TIFFFieldSet(tif,FIELD_RESOLUTION)) {
+		fprintf(fd, "  Resolution: %g, %g",
+		    td->td_xresolution, td->td_yresolution);
+		if (TIFFFieldSet(tif,FIELD_RESOLUTIONUNIT)) {
+			switch (td->td_resolutionunit) {
+			case RESUNIT_NONE:
+				fprintf(fd, " (unitless)");
+				break;
+			case RESUNIT_INCH:
+				fprintf(fd, " pixels/inch");
+				break;
+			case RESUNIT_CENTIMETER:
+				fprintf(fd, " pixels/cm");
+				break;
+			default:
+				fprintf(fd, " (unit %u = 0x%x)",
+				    td->td_resolutionunit,
+				    td->td_resolutionunit);
+				break;
+			}
+		}
+		fprintf(fd, "\n");
+	}
+	if (TIFFFieldSet(tif,FIELD_POSITION))
+		fprintf(fd, "  Position: %g, %g\n",
+		    td->td_xposition, td->td_yposition);
+	if (TIFFFieldSet(tif,FIELD_BITSPERSAMPLE))
+		fprintf(fd, "  Bits/Sample: %u\n", td->td_bitspersample);
+	if (TIFFFieldSet(tif,FIELD_SAMPLEFORMAT)) {
+		fprintf(fd, "  Sample Format: ");
+		switch (td->td_sampleformat) {
+		case SAMPLEFORMAT_VOID:
+			fprintf(fd, "void\n");
+			break;
+		case SAMPLEFORMAT_INT:
+			fprintf(fd, "signed integer\n");
+			break;
+		case SAMPLEFORMAT_UINT:
+			fprintf(fd, "unsigned integer\n");
+			break;
+		case SAMPLEFORMAT_IEEEFP:
+			fprintf(fd, "IEEE floating point\n");
+			break;
+		case SAMPLEFORMAT_COMPLEXINT:
+			fprintf(fd, "complex signed integer\n");
+			break;
+		case SAMPLEFORMAT_COMPLEXIEEEFP:
+			fprintf(fd, "complex IEEE floating point\n");
+			break;
+		default:
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_sampleformat, td->td_sampleformat);
+			break;
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_COMPRESSION)) {
+		const TIFFCodec* c = TIFFFindCODEC(td->td_compression);
+		fprintf(fd, "  Compression Scheme: ");
+		if (c)
+			fprintf(fd, "%s\n", c->name);
+		else
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_compression, td->td_compression);
+	}
+	if (TIFFFieldSet(tif,FIELD_PHOTOMETRIC)) {
+		fprintf(fd, "  Photometric Interpretation: ");
+		if (td->td_photometric < NPHOTONAMES)
+			fprintf(fd, "%s\n", photoNames[td->td_photometric]);
+		else {
+			switch (td->td_photometric) {
+			case PHOTOMETRIC_LOGL:
+				fprintf(fd, "CIE Log2(L)\n");
+				break;
+			case PHOTOMETRIC_LOGLUV:
+				fprintf(fd, "CIE Log2(L) (u',v')\n");
+				break;
+			default:
+				fprintf(fd, "%u (0x%x)\n",
+				    td->td_photometric, td->td_photometric);
+				break;
+			}
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_EXTRASAMPLES) && td->td_extrasamples) {
+		fprintf(fd, "  Extra Samples: %u<", td->td_extrasamples);
+		sep = "";
+		for (i = 0; i < td->td_extrasamples; i++) {
+			switch (td->td_sampleinfo[i]) {
+			case EXTRASAMPLE_UNSPECIFIED:
+				fprintf(fd, "%sunspecified", sep);
+				break;
+			case EXTRASAMPLE_ASSOCALPHA:
+				fprintf(fd, "%sassoc-alpha", sep);
+				break;
+			case EXTRASAMPLE_UNASSALPHA:
+				fprintf(fd, "%sunassoc-alpha", sep);
+				break;
+			default:
+				fprintf(fd, "%s%u (0x%x)", sep,
+				    td->td_sampleinfo[i], td->td_sampleinfo[i]);
+				break;
+			}
+			sep = ", ";
+		}
+		fprintf(fd, ">\n");
+	}
+	if (TIFFFieldSet(tif,FIELD_STONITS)) {
+		fprintf(fd, "  Sample to Nits conversion factor: %.4e\n",
+				td->td_stonits);
+	}
+#ifdef CMYK_SUPPORT
+	if (TIFFFieldSet(tif,FIELD_INKSET)) {
+		fprintf(fd, "  Ink Set: ");
+		switch (td->td_inkset) {
+		case INKSET_CMYK:
+			fprintf(fd, "CMYK\n");
+			break;
+		default:
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_inkset, td->td_inkset);
+			break;
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_INKNAMES)) {
+		char* cp;
+		fprintf(fd, "  Ink Names: ");
+		i = td->td_samplesperpixel;
+		sep = "";
+		for (cp = td->td_inknames; i > 0; cp = strchr(cp,'\0')+1, i--) {
+			fprintf(fd, "%s", sep);
+			_TIFFprintAscii(fd, cp);
+			sep = ", ";
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_NUMBEROFINKS))
+		fprintf(fd, " Number of Inks: %u\n", td->td_ninks);
+	if (TIFFFieldSet(tif,FIELD_DOTRANGE))
+		fprintf(fd, "  Dot Range: %u-%u\n",
+		    td->td_dotrange[0], td->td_dotrange[1]);
+	if (TIFFFieldSet(tif,FIELD_TARGETPRINTER))
+		_TIFFprintAsciiTag(fd, "Target Printer", td->td_targetprinter);
+#endif
+	if (TIFFFieldSet(tif,FIELD_THRESHHOLDING)) {
+		fprintf(fd, "  Thresholding: ");
+		switch (td->td_threshholding) {
+		case THRESHHOLD_BILEVEL:
+			fprintf(fd, "bilevel art scan\n");
+			break;
+		case THRESHHOLD_HALFTONE:
+			fprintf(fd, "halftone or dithered scan\n");
+			break;
+		case THRESHHOLD_ERRORDIFFUSE:
+			fprintf(fd, "error diffused\n");
+			break;
+		default:
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_threshholding, td->td_threshholding);
+			break;
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_FILLORDER)) {
+		fprintf(fd, "  FillOrder: ");
+		switch (td->td_fillorder) {
+		case FILLORDER_MSB2LSB:
+			fprintf(fd, "msb-to-lsb\n");
+			break;
+		case FILLORDER_LSB2MSB:
+			fprintf(fd, "lsb-to-msb\n");
+			break;
+		default:
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_fillorder, td->td_fillorder);
+			break;
+		}
+	}
+#ifdef YCBCR_SUPPORT
+	if (TIFFFieldSet(tif,FIELD_YCBCRSUBSAMPLING))
+        {
+            /*
+             * For hacky reasons (see tif_jpeg.c - JPEGFixupTestSubsampling),
+             * we need to fetch this rather than trust what is in our
+             * structures.
+             */
+            uint16 subsampling[2];
+
+            TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING, 
+                          subsampling + 0, subsampling + 1 );
+		fprintf(fd, "  YCbCr Subsampling: %u, %u\n",
+                        subsampling[0], subsampling[1] );
+        }
+	if (TIFFFieldSet(tif,FIELD_YCBCRPOSITIONING)) {
+		fprintf(fd, "  YCbCr Positioning: ");
+		switch (td->td_ycbcrpositioning) {
+		case YCBCRPOSITION_CENTERED:
+			fprintf(fd, "centered\n");
+			break;
+		case YCBCRPOSITION_COSITED:
+			fprintf(fd, "cosited\n");
+			break;
+		default:
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_ycbcrpositioning, td->td_ycbcrpositioning);
+			break;
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_YCBCRCOEFFICIENTS))
+		fprintf(fd, "  YCbCr Coefficients: %g, %g, %g\n",
+		    td->td_ycbcrcoeffs[0],
+		    td->td_ycbcrcoeffs[1],
+		    td->td_ycbcrcoeffs[2]);
+#endif
+	if (TIFFFieldSet(tif,FIELD_HALFTONEHINTS))
+		fprintf(fd, "  Halftone Hints: light %u dark %u\n",
+		    td->td_halftonehints[0], td->td_halftonehints[1]);
+	if (TIFFFieldSet(tif,FIELD_ARTIST))
+		_TIFFprintAsciiTag(fd, "Artist", td->td_artist);
+	if (TIFFFieldSet(tif,FIELD_DATETIME))
+		_TIFFprintAsciiTag(fd, "Date & Time", td->td_datetime);
+	if (TIFFFieldSet(tif,FIELD_HOSTCOMPUTER))
+		_TIFFprintAsciiTag(fd, "Host Computer", td->td_hostcomputer);
+	if (TIFFFieldSet(tif,FIELD_COPYRIGHT))
+		_TIFFprintAsciiTag(fd, "Copyright", td->td_copyright);
+	if (TIFFFieldSet(tif,FIELD_DOCUMENTNAME))
+		_TIFFprintAsciiTag(fd, "Document Name", td->td_documentname);
+	if (TIFFFieldSet(tif,FIELD_IMAGEDESCRIPTION))
+		_TIFFprintAsciiTag(fd, "Image Description", td->td_imagedescription);
+	if (TIFFFieldSet(tif,FIELD_MAKE))
+		_TIFFprintAsciiTag(fd, "Make", td->td_make);
+	if (TIFFFieldSet(tif,FIELD_MODEL))
+		_TIFFprintAsciiTag(fd, "Model", td->td_model);
+	if (TIFFFieldSet(tif,FIELD_ORIENTATION)) {
+		fprintf(fd, "  Orientation: ");
+		if (td->td_orientation < NORIENTNAMES)
+			fprintf(fd, "%s\n", orientNames[td->td_orientation]);
+		else
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_orientation, td->td_orientation);
+	}
+	if (TIFFFieldSet(tif,FIELD_SAMPLESPERPIXEL))
+		fprintf(fd, "  Samples/Pixel: %u\n", td->td_samplesperpixel);
+	if (TIFFFieldSet(tif,FIELD_ROWSPERSTRIP)) {
+		fprintf(fd, "  Rows/Strip: ");
+		if (td->td_rowsperstrip == (uint32) -1)
+			fprintf(fd, "(infinite)\n");
+		else
+			fprintf(fd, "%lu\n", (u_long) td->td_rowsperstrip);
+	}
+	if (TIFFFieldSet(tif,FIELD_MINSAMPLEVALUE))
+		fprintf(fd, "  Min Sample Value: %u\n", td->td_minsamplevalue);
+	if (TIFFFieldSet(tif,FIELD_MAXSAMPLEVALUE))
+		fprintf(fd, "  Max Sample Value: %u\n", td->td_maxsamplevalue);
+	if (TIFFFieldSet(tif,FIELD_SMINSAMPLEVALUE))
+		fprintf(fd, "  SMin Sample Value: %g\n",
+		    td->td_sminsamplevalue);
+	if (TIFFFieldSet(tif,FIELD_SMAXSAMPLEVALUE))
+		fprintf(fd, "  SMax Sample Value: %g\n",
+		    td->td_smaxsamplevalue);
+	if (TIFFFieldSet(tif,FIELD_PLANARCONFIG)) {
+		fprintf(fd, "  Planar Configuration: ");
+		switch (td->td_planarconfig) {
+		case PLANARCONFIG_CONTIG:
+			fprintf(fd, "single image plane\n");
+			break;
+		case PLANARCONFIG_SEPARATE:
+			fprintf(fd, "separate image planes\n");
+			break;
+		default:
+			fprintf(fd, "%u (0x%x)\n",
+			    td->td_planarconfig, td->td_planarconfig);
+			break;
+		}
+	}
+	if (TIFFFieldSet(tif,FIELD_PAGENAME))
+		_TIFFprintAsciiTag(fd, "Page Name", td->td_pagename);
+	if (TIFFFieldSet(tif,FIELD_PAGENUMBER))
+		fprintf(fd, "  Page Number: %u-%u\n",
+		    td->td_pagenumber[0], td->td_pagenumber[1]);
+	if (TIFFFieldSet(tif,FIELD_COLORMAP)) {
+		fprintf(fd, "  Color Map: ");
+		if (flags & TIFFPRINT_COLORMAP) {
+			fprintf(fd, "\n");
+			n = 1L<<td->td_bitspersample;
+			for (l = 0; l < n; l++)
+				fprintf(fd, "   %5lu: %5u %5u %5u\n",
+				    l,
+				    td->td_colormap[0][l],
+				    td->td_colormap[1][l],
+				    td->td_colormap[2][l]);
+		} else
+			fprintf(fd, "(present)\n");
+	}
+#ifdef COLORIMETRY_SUPPORT
+	if (TIFFFieldSet(tif,FIELD_WHITEPOINT))
+		fprintf(fd, "  White Point: %g-%g\n",
+		    td->td_whitepoint[0], td->td_whitepoint[1]);
+	if (TIFFFieldSet(tif,FIELD_PRIMARYCHROMAS))
+		fprintf(fd, "  Primary Chromaticities: %g,%g %g,%g %g,%g\n",
+		    td->td_primarychromas[0], td->td_primarychromas[1],
+		    td->td_primarychromas[2], td->td_primarychromas[3],
+		    td->td_primarychromas[4], td->td_primarychromas[5]);
+	if (TIFFFieldSet(tif,FIELD_REFBLACKWHITE)) {
+		fprintf(fd, "  Reference Black/White:\n");
+		for (i = 0; i < td->td_samplesperpixel; i++)
+			fprintf(fd, "    %2d: %5g %5g\n",
+			    i,
+			    td->td_refblackwhite[2*i+0],
+			    td->td_refblackwhite[2*i+1]);
+	}
+	if (TIFFFieldSet(tif,FIELD_TRANSFERFUNCTION)) {
+		fprintf(fd, "  Transfer Function: ");
+		if (flags & TIFFPRINT_CURVES) {
+			fprintf(fd, "\n");
+			n = 1L<<td->td_bitspersample;
+			for (l = 0; l < n; l++) {
+				fprintf(fd, "    %2lu: %5u",
+				    l, td->td_transferfunction[0][l]);
+				for (i = 1; i < td->td_samplesperpixel; i++)
+					fprintf(fd, " %5u",
+					    td->td_transferfunction[i][l]);
+				fputc('\n', fd);
+			}
+		} else
+			fprintf(fd, "(present)\n");
+	}
+#endif
+#ifdef ICC_SUPPORT
+	if (TIFFFieldSet(tif,FIELD_ICCPROFILE))
+		fprintf(fd, "  ICC Profile: <present>, %lu bytes\n",
+		    (u_long) td->td_profileLength);
+#endif
+#ifdef PHOTOSHOP_SUPPORT
+ 	if (TIFFFieldSet(tif,FIELD_PHOTOSHOP))
+ 		fprintf(fd, "  Photoshop Data: <present>, %lu bytes\n",
+ 		    (u_long) td->td_photoshopLength);
+#endif
+#ifdef IPTC_SUPPORT
+ 	if (TIFFFieldSet(tif,FIELD_RICHTIFFIPTC))
+ 		fprintf(fd, "  RichTIFFIPTC Data: <present>, %lu bytes\n",
+ 		    (u_long) td->td_richtiffiptcLength);
+#endif
+#if SUBIFD_SUPPORT
+	if (TIFFFieldSet(tif, FIELD_SUBIFD)) {
+		fprintf(fd, "  SubIFD Offsets:");
+		for (i = 0; i < td->td_nsubifd; i++)
+			fprintf(fd, " %5lu", (long) td->td_subifd[i]);
+		fputc('\n', fd);
+	}
+#endif
+        /*
+        ** Custom tag support.
+        */
+        {
+            int  i;
+            short count;
+
+            count = (short) TIFFGetTagListCount( tif );
+            for( i = 0; i < count; i++ )
+            {
+                ttag_t  tag = TIFFGetTagListEntry( tif, i );
+                const TIFFFieldInfo *fld;
+
+                fld = TIFFFieldWithTag( tif, tag );
+                if( fld == NULL )
+                    continue;
+
+                if( fld->field_passcount )
+                {
+                    short value_count;
+                    int j;
+                    void *raw_data;
+                    
+                    if( TIFFGetField( tif, tag, &value_count, &raw_data ) != 1 )
+                        continue;
+
+                    fprintf(fd, "  %s: ", fld->field_name );
+
+                    for( j = 0; j < value_count; j++ )
+                    {
+			if( fld->field_type == TIFF_BYTE )
+                            fprintf( fd, "%d",
+                                     (int) ((char *) raw_data)[j] );
+			else if( fld->field_type == TIFF_SHORT )
+                            fprintf( fd, "%d",
+                                     (int) ((short *) raw_data)[j] );
+                        else if( fld->field_type == TIFF_LONG )
+                            fprintf( fd, "%d",
+                                     (int) ((long *) raw_data)[j] );
+			else if( fld->field_type == TIFF_RATIONAL )
+			    fprintf( fd, "%f",
+				     ((float *) raw_data)[j] );
+                        else if( fld->field_type == TIFF_ASCII )
+                        {
+                            fprintf( fd, "%s",
+                                     (char *) raw_data );
+                            break;
+                        }
+                        else if( fld->field_type == TIFF_DOUBLE )
+                            fprintf( fd, "%f",
+                                     ((double *) raw_data)[j] );
+                        else if( fld->field_type == TIFF_FLOAT )
+                            fprintf( fd, "%f",
+                                     ((float *) raw_data)[j] );
+                        else
+                        {
+                            fprintf( fd,
+                                     "<unsupported data type in TIFFPrint>" );
+                            break;
+                        }
+
+                        if( j < value_count-1 )
+                            fprintf( fd, "," );
+                    }
+                    fprintf( fd, "\n" );
+                } 
+                else if( !fld->field_passcount
+                         && fld->field_type == TIFF_ASCII )
+                {
+                    char *data;
+                    
+                    if( TIFFGetField( tif, tag, &data ) )
+                        fprintf(fd, "  %s: %s\n", fld->field_name, data );
+                }
+            }
+        }
+        
+	if (tif->tif_tagmethods.printdir)
+		(*tif->tif_tagmethods.printdir)(tif, fd, flags);
+	if ((flags & TIFFPRINT_STRIPS) &&
+	    TIFFFieldSet(tif,FIELD_STRIPOFFSETS)) {
+		tstrip_t s;
+
+		fprintf(fd, "  %lu %s:\n",
+		    (long) td->td_nstrips,
+		    isTiled(tif) ? "Tiles" : "Strips");
+		for (s = 0; s < td->td_nstrips; s++)
+			fprintf(fd, "    %3lu: [%8lu, %8lu]\n",
+			    (u_long) s,
+			    (u_long) td->td_stripoffset[s],
+			    (u_long) td->td_stripbytecount[s]);
+	}
+}
+
+void
+_TIFFprintAscii(FILE* fd, const char* cp)
+{
+	for (; *cp != '\0'; cp++) {
+		const char* tp;
+
+		if (isprint(*cp)) {
+			fputc(*cp, fd);
+			continue;
+		}
+		for (tp = "\tt\bb\rr\nn\vv"; *tp; tp++)
+			if (*tp++ == *cp)
+				break;
+		if (*tp)
+			fprintf(fd, "\\%c", *tp);
+		else
+			fprintf(fd, "\\%03o", *cp & 0xff);
+	}
+}
+
+void
+_TIFFprintAsciiTag(FILE* fd, const char* name, const char* value)
+{
+	fprintf(fd, "  %s: \"", name);
+	_TIFFprintAscii(fd, value);
+	fprintf(fd, "\"\n");
+}
diff --git a/src/tiff/tif_read.c b/src/tiff/tif_read.c
new file mode 100644
index 0000000..4017d64
--- /dev/null
+++ b/src/tiff/tif_read.c
@@ -0,0 +1,637 @@
+/* $Header: /home/terralib/src/tiff/tif_read.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ * Scanline-oriented Read Support
+ */
+#include "tiffiop.h"
+#include <stdio.h>
+#include <assert.h>
+
+	int TIFFFillStrip(TIFF*, tstrip_t);
+	int TIFFFillTile(TIFF*, ttile_t);
+static	int TIFFStartStrip(TIFF*, tstrip_t);
+static	int TIFFStartTile(TIFF*, ttile_t);
+static	int TIFFCheckRead(TIFF*, int);
+
+#define	NOSTRIP	((tstrip_t) -1)			/* undefined state */
+#define	NOTILE	((ttile_t) -1)			/* undefined state */
+
+/*
+ * Seek to a random row+sample in a file.
+ */
+static int
+TIFFSeek(TIFF* tif, uint32 row, tsample_t sample)
+{
+	register TIFFDirectory *td = &tif->tif_dir;
+	tstrip_t strip;
+
+	if (row >= td->td_imagelength) {	/* out of range */
+		TIFFError(tif->tif_name, "%lu: Row out of range, max %lu",
+		    (u_long) row, (u_long) td->td_imagelength);
+		return (0);
+	}
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+		if (sample >= td->td_samplesperpixel) {
+			TIFFError(tif->tif_name,
+			    "%lu: Sample out of range, max %lu",
+			    (u_long) sample, (u_long) td->td_samplesperpixel);
+			return (0);
+		}
+		strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
+	} else
+		strip = row / td->td_rowsperstrip;
+	if (strip != tif->tif_curstrip) { 	/* different strip, refill */
+		if (!TIFFFillStrip(tif, strip))
+			return (0);
+	} else if (row < tif->tif_row) {
+		/*
+		 * Moving backwards within the same strip: backup
+		 * to the start and then decode forward (below).
+		 *
+		 * NB: If you're planning on lots of random access within a
+		 * strip, it's better to just read and decode the entire
+		 * strip, and then access the decoded data in a random fashion.
+		 */
+		if (!TIFFStartStrip(tif, strip))
+			return (0);
+	}
+	if (row != tif->tif_row) {
+		/*
+		 * Seek forward to the desired row.
+		 */
+		if (!(*tif->tif_seek)(tif, row - tif->tif_row))
+			return (0);
+		tif->tif_row = row;
+	}
+	return (1);
+}
+
+int
+TIFFReadScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample)
+{
+	int e;
+
+	if (!TIFFCheckRead(tif, 0))
+		return (-1);
+	if( (e = TIFFSeek(tif, row, sample)) != 0) {
+		/*
+		 * Decompress desired row into user buffer.
+		 */
+		e = (*tif->tif_decoderow)
+		    (tif, (tidata_t) buf, tif->tif_scanlinesize, sample);
+
+                /* we are now poised at the beginning of the next row */
+                tif->tif_row = row + 1;
+
+		if (e)
+			(*tif->tif_postdecode)(tif, (tidata_t) buf,
+			    tif->tif_scanlinesize);
+	}
+	return (e > 0 ? 1 : -1);
+}
+
+/*
+ * Read a strip of data and decompress the specified
+ * amount into the user-supplied buffer.
+ */
+tsize_t
+TIFFReadEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	uint32 nrows;
+	tsize_t stripsize;
+        tstrip_t sep_strip, strips_per_sep;
+
+	if (!TIFFCheckRead(tif, 0))
+		return (-1);
+	if (strip >= td->td_nstrips) {
+		TIFFError(tif->tif_name, "%ld: Strip out of range, max %ld",
+		    (long) strip, (long) td->td_nstrips);
+		return (-1);
+	}
+	/*
+	 * Calculate the strip size according to the number of
+	 * rows in the strip (check for truncated last strip on any
+         * of the separations).
+	 */
+        if( td->td_rowsperstrip >= td->td_imagelength )
+            strips_per_sep = 1;
+        else
+            strips_per_sep = (td->td_imagelength+td->td_rowsperstrip-1)
+                / td->td_rowsperstrip;
+
+        sep_strip = strip % strips_per_sep;
+
+	if (sep_strip != strips_per_sep-1 ||
+	    (nrows = td->td_imagelength % td->td_rowsperstrip) == 0)
+		nrows = td->td_rowsperstrip;
+
+	stripsize = TIFFVStripSize(tif, nrows);
+	if (size == (tsize_t) -1)
+		size = stripsize;
+	else if (size > stripsize)
+		size = stripsize;
+	if (TIFFFillStrip(tif, strip) 
+            && (*tif->tif_decodestrip)(tif, (tidata_t) buf, size, 
+                         (tsample_t)(strip / td->td_stripsperimage)) > 0 ) {
+		(*tif->tif_postdecode)(tif, (tidata_t) buf, size);
+		return (size);
+	} else
+		return ((tsize_t) -1);
+}
+
+static tsize_t
+TIFFReadRawStrip1(TIFF* tif,
+    tstrip_t strip, tdata_t buf, tsize_t size, const char* module)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if (!isMapped(tif)) {
+		tsize_t cc;
+
+		if (!SeekOK(tif, td->td_stripoffset[strip])) {
+			TIFFError(module,
+			    "%s: Seek error at scanline %lu, strip %lu",
+			    tif->tif_name,
+			    (u_long) tif->tif_row, (u_long) strip);
+			return (-1);
+		}
+		cc = TIFFReadFile(tif, buf, size);
+		if (cc != size) {
+			TIFFError(module,
+		"%s: Read error at scanline %lu; got %lu bytes, expected %lu",
+			    tif->tif_name,
+			    (u_long) tif->tif_row,
+			    (u_long) cc,
+			    (u_long) size);
+			return (-1);
+		}
+	} else {
+		if (td->td_stripoffset[strip] + size > tif->tif_size) {
+			TIFFError(module,
+    "%s: Read error at scanline %lu, strip %lu; got %lu bytes, expected %lu",
+			    tif->tif_name,
+			    (u_long) tif->tif_row,
+			    (u_long) strip,
+			    (u_long) tif->tif_size - td->td_stripoffset[strip],
+			    (u_long) size);
+			return (-1);
+		}
+		_TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[strip], size);
+	}
+	return (size);
+}
+
+/*
+ * Read a strip of data from the file.
+ */
+tsize_t
+TIFFReadRawStrip(TIFF* tif, tstrip_t strip, tdata_t buf, tsize_t size)
+{
+	static const char module[] = "TIFFReadRawStrip";
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t bytecount;
+
+	if (!TIFFCheckRead(tif, 0))
+		return ((tsize_t) -1);
+	if (strip >= td->td_nstrips) {
+		TIFFError(tif->tif_name, "%lu: Strip out of range, max %lu",
+		    (u_long) strip, (u_long) td->td_nstrips);
+		return ((tsize_t) -1);
+	}
+	bytecount = td->td_stripbytecount[strip];
+	if (bytecount <= 0) {
+		TIFFError(tif->tif_name,
+		    "%lu: Invalid strip byte count, strip %lu",
+		    (u_long) bytecount, (u_long) strip);
+		return ((tsize_t) -1);
+	}
+	if (size != (tsize_t)-1 && size < bytecount)
+		bytecount = size;
+	return (TIFFReadRawStrip1(tif, strip, buf, bytecount, module));
+}
+
+/*
+ * Read the specified strip and setup for decoding. 
+ * The data buffer is expanded, as necessary, to
+ * hold the strip's data.
+ */
+int
+TIFFFillStrip(TIFF* tif, tstrip_t strip)
+{
+	static const char module[] = "TIFFFillStrip";
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t bytecount;
+
+	bytecount = td->td_stripbytecount[strip];
+	if (bytecount <= 0) {
+		TIFFError(tif->tif_name,
+		    "%lu: Invalid strip byte count, strip %lu",
+		    (u_long) bytecount, (u_long) strip);
+		return (0);
+	}
+	if (isMapped(tif) &&
+	    (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) {
+		/*
+		 * The image is mapped into memory and we either don't
+		 * need to flip bits or the compression routine is going
+		 * to handle this operation itself.  In this case, avoid
+		 * copying the raw data and instead just reference the
+		 * data from the memory mapped file image.  This assumes
+		 * that the decompression routines do not modify the
+		 * contents of the raw data buffer (if they try to,
+		 * the application will get a fault since the file is
+		 * mapped read-only).
+		 */
+		if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+			_TIFFfree(tif->tif_rawdata);
+		tif->tif_flags &= ~TIFF_MYBUFFER;
+		if ( td->td_stripoffset[strip] + bytecount > tif->tif_size) {
+			/*
+			 * This error message might seem strange, but it's
+			 * what would happen if a read were done instead.
+			 */
+			TIFFError(module,
+		    "%s: Read error on strip %lu; got %lu bytes, expected %lu",
+			    tif->tif_name,
+			    (u_long) strip,
+			    (u_long) tif->tif_size - td->td_stripoffset[strip],
+			    (u_long) bytecount);
+			tif->tif_curstrip = NOSTRIP;
+			return (0);
+		}
+		tif->tif_rawdatasize = bytecount;
+		tif->tif_rawdata = tif->tif_base + td->td_stripoffset[strip];
+	} else {
+		/*
+		 * Expand raw data buffer, if needed, to
+		 * hold data strip coming from file
+		 * (perhaps should set upper bound on
+		 *  the size of a buffer we'll use?).
+		 */
+		if (bytecount > tif->tif_rawdatasize) {
+			tif->tif_curstrip = NOSTRIP;
+			if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
+				TIFFError(module,
+				"%s: Data buffer too small to hold strip %lu",
+				    tif->tif_name, (u_long) strip);
+				return (0);
+			}
+			if (!TIFFReadBufferSetup(tif, 0,
+			    TIFFroundup(bytecount, 1024)))
+				return (0);
+		}
+		if (TIFFReadRawStrip1(tif, strip, (u_char *)tif->tif_rawdata,
+		    bytecount, module) != bytecount)
+			return (0);
+		if (!isFillOrder(tif, td->td_fillorder) &&
+		    (tif->tif_flags & TIFF_NOBITREV) == 0)
+			TIFFReverseBits(tif->tif_rawdata, bytecount);
+	}
+	return (TIFFStartStrip(tif, strip));
+}
+
+/*
+ * Tile-oriented Read Support
+ * Contributed by Nancy Cam (Silicon Graphics).
+ */
+
+/*
+ * Read and decompress a tile of data.  The
+ * tile is selected by the (x,y,z,s) coordinates.
+ */
+tsize_t
+TIFFReadTile(TIFF* tif,
+    tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+	if (!TIFFCheckRead(tif, 1) || !TIFFCheckTile(tif, x, y, z, s))
+		return (-1);
+	return (TIFFReadEncodedTile(tif,
+	    TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1));
+}
+
+/*
+ * Read a tile of data and decompress the specified
+ * amount into the user-supplied buffer.
+ */
+tsize_t
+TIFFReadEncodedTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t tilesize = tif->tif_tilesize;
+
+	if (!TIFFCheckRead(tif, 1))
+		return (-1);
+	if (tile >= td->td_nstrips) {
+		TIFFError(tif->tif_name, "%ld: Tile out of range, max %ld",
+		    (long) tile, (u_long) td->td_nstrips);
+		return (-1);
+	}
+	if (size == (tsize_t) -1)
+		size = tilesize;
+	else if (size > tilesize)
+		size = tilesize;
+	if (TIFFFillTile(tif, tile) && (*tif->tif_decodetile)(tif,
+	    (tidata_t) buf, size, (tsample_t)(tile/td->td_stripsperimage))) {
+		(*tif->tif_postdecode)(tif, (tidata_t) buf, size);
+		return (size);
+	} else
+		return (-1);
+}
+
+static tsize_t
+TIFFReadRawTile1(TIFF* tif,
+    ttile_t tile, tdata_t buf, tsize_t size, const char* module)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if (!isMapped(tif)) {
+		tsize_t cc;
+
+		if (!SeekOK(tif, td->td_stripoffset[tile])) {
+			TIFFError(module,
+			    "%s: Seek error at row %ld, col %ld, tile %ld",
+			    tif->tif_name,
+			    (long) tif->tif_row,
+			    (long) tif->tif_col,
+			    (long) tile);
+			return ((tsize_t) -1);
+		}
+		cc = TIFFReadFile(tif, buf, size);
+		if (cc != size) {
+			TIFFError(module,
+	    "%s: Read error at row %ld, col %ld; got %lu bytes, expected %lu",
+			    tif->tif_name,
+			    (long) tif->tif_row,
+			    (long) tif->tif_col,
+			    (u_long) cc,
+			    (u_long) size);
+			return ((tsize_t) -1);
+		}
+	} else {
+		if (td->td_stripoffset[tile] + size > tif->tif_size) {
+			TIFFError(module,
+    "%s: Read error at row %ld, col %ld, tile %ld; got %lu bytes, expected %lu",
+			    tif->tif_name,
+			    (long) tif->tif_row,
+			    (long) tif->tif_col,
+			    (long) tile,
+			    (u_long) tif->tif_size - td->td_stripoffset[tile],
+			    (u_long) size);
+			return ((tsize_t) -1);
+		}
+		_TIFFmemcpy(buf, tif->tif_base + td->td_stripoffset[tile], size);
+	}
+	return (size);
+}
+
+/*
+ * Read a tile of data from the file.
+ */
+tsize_t
+TIFFReadRawTile(TIFF* tif, ttile_t tile, tdata_t buf, tsize_t size)
+{
+	static const char module[] = "TIFFReadRawTile";
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t bytecount;
+
+	if (!TIFFCheckRead(tif, 1))
+		return ((tsize_t) -1);
+	if (tile >= td->td_nstrips) {
+		TIFFError(tif->tif_name, "%lu: Tile out of range, max %lu",
+		    (u_long) tile, (u_long) td->td_nstrips);
+		return ((tsize_t) -1);
+	}
+	bytecount = td->td_stripbytecount[tile];
+	if (size != (tsize_t) -1 && size < bytecount)
+		bytecount = size;
+	return (TIFFReadRawTile1(tif, tile, buf, bytecount, module));
+}
+
+/*
+ * Read the specified tile and setup for decoding. 
+ * The data buffer is expanded, as necessary, to
+ * hold the tile's data.
+ */
+int
+TIFFFillTile(TIFF* tif, ttile_t tile)
+{
+	static const char module[] = "TIFFFillTile";
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t bytecount;
+
+	bytecount = td->td_stripbytecount[tile];
+	if (bytecount <= 0) {
+		TIFFError(tif->tif_name,
+		    "%lu: Invalid tile byte count, tile %lu",
+		    (u_long) bytecount, (u_long) tile);
+		return (0);
+	}
+	if (isMapped(tif) &&
+	    (isFillOrder(tif, td->td_fillorder) || (tif->tif_flags & TIFF_NOBITREV))) {
+		/*
+		 * The image is mapped into memory and we either don't
+		 * need to flip bits or the compression routine is going
+		 * to handle this operation itself.  In this case, avoid
+		 * copying the raw data and instead just reference the
+		 * data from the memory mapped file image.  This assumes
+		 * that the decompression routines do not modify the
+		 * contents of the raw data buffer (if they try to,
+		 * the application will get a fault since the file is
+		 * mapped read-only).
+		 */
+		if ((tif->tif_flags & TIFF_MYBUFFER) && tif->tif_rawdata)
+			_TIFFfree(tif->tif_rawdata);
+		tif->tif_flags &= ~TIFF_MYBUFFER;
+		if ( td->td_stripoffset[tile] + bytecount > tif->tif_size) {
+			tif->tif_curtile = NOTILE;
+			return (0);
+		}
+		tif->tif_rawdatasize = bytecount;
+		tif->tif_rawdata = tif->tif_base + td->td_stripoffset[tile];
+	} else {
+		/*
+		 * Expand raw data buffer, if needed, to
+		 * hold data tile coming from file
+		 * (perhaps should set upper bound on
+		 *  the size of a buffer we'll use?).
+		 */
+		if (bytecount > tif->tif_rawdatasize) {
+			tif->tif_curtile = NOTILE;
+			if ((tif->tif_flags & TIFF_MYBUFFER) == 0) {
+				TIFFError(module,
+				"%s: Data buffer too small to hold tile %ld",
+				    tif->tif_name, (long) tile);
+				return (0);
+			}
+			if (!TIFFReadBufferSetup(tif, 0,
+			    TIFFroundup(bytecount, 1024)))
+				return (0);
+		}
+		if (TIFFReadRawTile1(tif, tile, (u_char *)tif->tif_rawdata,
+		    bytecount, module) != bytecount)
+			return (0);
+		if (!isFillOrder(tif, td->td_fillorder) &&
+		    (tif->tif_flags & TIFF_NOBITREV) == 0)
+			TIFFReverseBits(tif->tif_rawdata, bytecount);
+	}
+	return (TIFFStartTile(tif, tile));
+}
+
+/*
+ * Setup the raw data buffer in preparation for
+ * reading a strip of raw data.  If the buffer
+ * is specified as zero, then a buffer of appropriate
+ * size is allocated by the library.  Otherwise,
+ * the client must guarantee that the buffer is
+ * large enough to hold any individual strip of
+ * raw data.
+ */
+int
+TIFFReadBufferSetup(TIFF* tif, tdata_t bp, tsize_t size)
+{
+	static const char module[] = "TIFFReadBufferSetup";
+
+	if (tif->tif_rawdata) {
+		if (tif->tif_flags & TIFF_MYBUFFER)
+			_TIFFfree(tif->tif_rawdata);
+		tif->tif_rawdata = NULL;
+	}
+	if (bp) {
+		tif->tif_rawdatasize = size;
+		tif->tif_rawdata = (tidata_t) bp;
+		tif->tif_flags &= ~TIFF_MYBUFFER;
+	} else {
+		tif->tif_rawdatasize = TIFFroundup(size, 1024);
+		tif->tif_rawdata = (tidata_t) _TIFFmalloc(tif->tif_rawdatasize);
+		tif->tif_flags |= TIFF_MYBUFFER;
+	}
+	if (tif->tif_rawdata == NULL) {
+		TIFFError(module,
+		    "%s: No space for data buffer at scanline %ld",
+		    tif->tif_name, (long) tif->tif_row);
+		tif->tif_rawdatasize = 0;
+		return (0);
+	}
+	return (1);
+}
+
+/*
+ * Set state to appear as if a
+ * strip has just been read in.
+ */
+static int
+TIFFStartStrip(TIFF* tif, tstrip_t strip)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+		if (!(*tif->tif_setupdecode)(tif))
+			return (0);
+		tif->tif_flags |= TIFF_CODERSETUP;
+	}
+	tif->tif_curstrip = strip;
+	tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+	tif->tif_rawcp = tif->tif_rawdata;
+	tif->tif_rawcc = td->td_stripbytecount[strip];
+	return ((*tif->tif_predecode)(tif,
+			(tsample_t)(strip / td->td_stripsperimage)));
+}
+
+/*
+ * Set state to appear as if a
+ * tile has just been read in.
+ */
+static int
+TIFFStartTile(TIFF* tif, ttile_t tile)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+		if (!(*tif->tif_setupdecode)(tif))
+			return (0);
+		tif->tif_flags |= TIFF_CODERSETUP;
+	}
+	tif->tif_curtile = tile;
+	tif->tif_row =
+	    (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth)) *
+		td->td_tilelength;
+	tif->tif_col =
+	    (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength)) *
+		td->td_tilewidth;
+	tif->tif_rawcp = tif->tif_rawdata;
+	tif->tif_rawcc = td->td_stripbytecount[tile];
+	return ((*tif->tif_predecode)(tif,
+			(tsample_t)(tile/td->td_stripsperimage)));
+}
+
+static int
+TIFFCheckRead(TIFF* tif, int tiles)
+{
+	if (tif->tif_mode == O_WRONLY) {
+		TIFFError(tif->tif_name, "File not open for reading");
+		return (0);
+	}
+	if (tiles ^ isTiled(tif)) {
+		TIFFError(tif->tif_name, tiles ?
+		    "Can not read tiles from a stripped image" :
+		    "Can not read scanlines from a tiled image");
+		return (0);
+	}
+	return (1);
+}
+
+void
+_TIFFNoPostDecode(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+    (void) tif; (void) buf; (void) cc;
+}
+
+void
+_TIFFSwab16BitData(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+    (void) tif;
+    assert((cc & 1) == 0);
+    TIFFSwabArrayOfShort((uint16*) buf, cc/2);
+}
+
+void
+_TIFFSwab32BitData(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+    (void) tif;
+    assert((cc & 3) == 0);
+    TIFFSwabArrayOfLong((uint32*) buf, cc/4);
+}
+
+void
+_TIFFSwab64BitData(TIFF* tif, tidata_t buf, tsize_t cc)
+{
+    (void) tif;
+    assert((cc & 7) == 0);
+    TIFFSwabArrayOfDouble((double*) buf, cc/8);
+}
diff --git a/src/tiff/tif_strip.c b/src/tiff/tif_strip.c
new file mode 100644
index 0000000..e1e299b
--- /dev/null
+++ b/src/tiff/tif_strip.c
@@ -0,0 +1,217 @@
+/* $Header: /home/terralib/src/tiff/tif_strip.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Strip-organized Image Support Routines.
+ */
+#include "tiffiop.h"
+
+/*
+ * Compute which strip a (row,sample) value is in.
+ */
+tstrip_t
+TIFFComputeStrip(TIFF* tif, uint32 row, tsample_t sample)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tstrip_t strip;
+
+	strip = row / td->td_rowsperstrip;
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+		if (sample >= td->td_samplesperpixel) {
+			TIFFError(tif->tif_name,
+			    "%u: Sample out of range, max %u",
+			    sample, td->td_samplesperpixel);
+			return ((tstrip_t) 0);
+		}
+		strip += sample*td->td_stripsperimage;
+	}
+	return (strip);
+}
+
+/*
+ * Compute how many strips are in an image.
+ */
+tstrip_t
+TIFFNumberOfStrips(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tstrip_t nstrips;
+
+	nstrips = (td->td_rowsperstrip == (uint32) -1 ?
+	     (td->td_imagelength != 0 ? 1 : 0) :
+	     TIFFhowmany(td->td_imagelength, td->td_rowsperstrip));
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+		nstrips *= td->td_samplesperpixel;
+	return (nstrips);
+}
+
+/*
+ * Compute the # bytes in a variable height, row-aligned strip.
+ */
+tsize_t
+TIFFVStripSize(TIFF* tif, uint32 nrows)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if (nrows == (uint32) -1)
+		nrows = td->td_imagelength;
+#ifdef YCBCR_SUPPORT
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+	    td->td_photometric == PHOTOMETRIC_YCBCR &&
+	    !isUpSampled(tif)) {
+		/*
+		 * Packed YCbCr data contain one Cb+Cr for every
+		 * HorizontalSampling*VerticalSampling Y values.
+		 * Must also roundup width and height when calculating
+		 * since images that are not a multiple of the
+		 * horizontal/vertical subsampling area include
+		 * YCbCr data for the extended image.
+		 */
+                uint16 ycbcrsubsampling[2];
+                tsize_t w, scanline, samplingarea;
+
+                TIFFGetField( tif, TIFFTAG_YCBCRSUBSAMPLING, 
+                              ycbcrsubsampling + 0, 
+                              ycbcrsubsampling + 1 );
+
+		w = TIFFroundup(td->td_imagewidth, ycbcrsubsampling[0]);
+		scanline = TIFFhowmany(w*td->td_bitspersample, 8);
+		samplingarea = ycbcrsubsampling[0]*ycbcrsubsampling[1];
+		nrows = TIFFroundup(nrows, ycbcrsubsampling[1]);
+		/* NB: don't need TIFFhowmany here 'cuz everything is rounded */
+		return ((tsize_t)
+		    (nrows*scanline + 2*(nrows*scanline / samplingarea)));
+	} else
+#endif
+		return ((tsize_t)(nrows * TIFFScanlineSize(tif)));
+}
+
+
+/*
+ * Compute the # bytes in a raw strip.
+ */
+tsize_t
+TIFFRawStripSize(TIFF* tif, tstrip_t strip)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+	tsize_t bytecount = td->td_stripbytecount[strip];
+
+	if (bytecount <= 0) {
+		TIFFError(tif->tif_name,
+			  "%lu: Invalid strip byte count, strip %lu",
+			  (u_long) bytecount, (u_long) strip);
+		bytecount = (tsize_t) -1;
+	}
+
+	return bytecount;
+}
+
+/*
+ * Compute the # bytes in a (row-aligned) strip.
+ *
+ * Note that if RowsPerStrip is larger than the
+ * recorded ImageLength, then the strip size is
+ * truncated to reflect the actual space required
+ * to hold the strip.
+ */
+tsize_t
+TIFFStripSize(TIFF* tif)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+	uint32 rps = td->td_rowsperstrip;
+	if (rps > td->td_imagelength)
+		rps = td->td_imagelength;
+	return (TIFFVStripSize(tif, rps));
+}
+
+/*
+ * Compute a default strip size based on the image
+ * characteristics and a requested value.  If the
+ * request is <1 then we choose a strip size according
+ * to certain heuristics.
+ */
+uint32
+TIFFDefaultStripSize(TIFF* tif, uint32 request)
+{
+	return (*tif->tif_defstripsize)(tif, request);
+}
+
+uint32
+_TIFFDefaultStripSize(TIFF* tif, uint32 s)
+{
+	if ((int32) s < 1) {
+		/*
+		 * If RowsPerStrip is unspecified, try to break the
+		 * image up into strips that are approximately 8Kbytes.
+		 */
+		tsize_t scanline = TIFFScanlineSize(tif);
+		s = (uint32)(8*1024) / (scanline == 0 ? 1 : scanline);
+		if (s == 0)		/* very wide images */
+			s = 1;
+	}
+	return (s);
+}
+
+/*
+ * Return the number of bytes to read/write in a call to
+ * one of the scanline-oriented i/o routines.  Note that
+ * this number may be 1/samples-per-pixel if data is
+ * stored as separate planes.
+ */
+tsize_t
+TIFFScanlineSize(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t scanline;
+	
+	scanline = td->td_bitspersample * td->td_imagewidth;
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+		scanline *= td->td_samplesperpixel;
+	return ((tsize_t) TIFFhowmany(scanline, 8));
+}
+
+/*
+ * Return the number of bytes required to store a complete
+ * decoded and packed raster scanline (as opposed to the
+ * I/O size returned by TIFFScanlineSize which may be less
+ * if data is store as separate planes).
+ */
+tsize_t
+TIFFRasterScanlineSize(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t scanline;
+	
+	scanline = td->td_bitspersample * td->td_imagewidth;
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG) {
+		scanline *= td->td_samplesperpixel;
+		return ((tsize_t) TIFFhowmany(scanline, 8));
+	} else
+		return ((tsize_t)
+		    TIFFhowmany(scanline, 8)*td->td_samplesperpixel);
+}
diff --git a/src/tiff/tif_swab.c b/src/tiff/tif_swab.c
new file mode 100644
index 0000000..2128c8a
--- /dev/null
+++ b/src/tiff/tif_swab.c
@@ -0,0 +1,217 @@
+/* $Header: /home/terralib/src/tiff/tif_swab.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library Bit & Byte Swapping Support.
+ *
+ * XXX We assume short = 16-bits and long = 32-bits XXX
+ */
+#include "tiffiop.h"
+
+#ifndef TIFFSwabShort
+void
+TIFFSwabShort(uint16* wp)
+{
+	register u_char* cp = (u_char*) wp;
+	u_char t;
+
+	t = cp[1]; cp[1] = cp[0]; cp[0] = t;
+}
+#endif
+
+#ifndef TIFFSwabLong
+void
+TIFFSwabLong(uint32* lp)
+{
+	register u_char* cp = (u_char*) lp;
+	u_char t;
+
+	t = cp[3]; cp[3] = cp[0]; cp[0] = t;
+	t = cp[2]; cp[2] = cp[1]; cp[1] = t;
+}
+#endif
+
+#ifndef TIFFSwabArrayOfShort
+void
+TIFFSwabArrayOfShort(uint16* wp, register u_long n)
+{
+	register u_char* cp;
+	register u_char t;
+
+	/* XXX unroll loop some */
+	while (n-- > 0) {
+		cp = (u_char*) wp;
+		t = cp[1]; cp[1] = cp[0]; cp[0] = t;
+		wp++;
+	}
+}
+#endif
+
+#ifndef TIFFSwabArrayOfLong
+void
+TIFFSwabArrayOfLong(register uint32* lp, register u_long n)
+{
+	register unsigned char *cp;
+	register unsigned char t;
+
+	/* XXX unroll loop some */
+	while (n-- > 0) {
+		cp = (unsigned char *)lp;
+		t = cp[3]; cp[3] = cp[0]; cp[0] = t;
+		t = cp[2]; cp[2] = cp[1]; cp[1] = t;
+		lp++;
+	}
+}
+#endif
+
+#ifndef TIFFSwabDouble
+void
+TIFFSwabDouble(double *dp)
+{
+        register uint32* lp = (uint32*) dp;
+        uint32 t;
+
+	TIFFSwabArrayOfLong(lp, 2);
+	t = lp[0]; lp[0] = lp[1]; lp[1] = t;
+}
+#endif
+
+#ifndef TIFFSwabArrayOfDouble
+void
+TIFFSwabArrayOfDouble(double* dp, register u_long n)
+{
+	register uint32* lp = (uint32*) dp;
+        register uint32 t;
+
+	TIFFSwabArrayOfLong(lp, n + n);
+        while (n-- > 0) {
+		t = lp[0]; lp[0] = lp[1]; lp[1] = t;
+                lp += 2;
+        }
+}
+#endif
+
+/*
+ * Bit reversal tables.  TIFFBitRevTable[<byte>] gives
+ * the bit reversed value of <byte>.  Used in various
+ * places in the library when the FillOrder requires
+ * bit reversal of byte values (e.g. CCITT Fax 3
+ * encoding/decoding).  TIFFNoBitRevTable is provided
+ * for algorithms that want an equivalent table that
+ * do not reverse bit values.
+ */
+static const unsigned char TIFFBitRevTable[256] = {
+    0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
+    0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
+    0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
+    0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
+    0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
+    0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
+    0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
+    0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
+    0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
+    0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
+    0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
+    0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
+    0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
+    0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
+    0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
+    0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
+    0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
+    0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
+    0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
+    0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
+    0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
+    0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
+    0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
+    0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
+    0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
+    0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
+    0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
+    0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
+    0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
+    0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
+    0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
+    0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
+};
+static const unsigned char TIFFNoBitRevTable[256] = {
+    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 
+    0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 
+    0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 
+    0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 
+    0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 
+    0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 
+    0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 
+    0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 
+    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 
+    0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 
+    0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 
+    0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 
+    0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 
+    0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 
+    0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 
+    0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 
+    0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 
+    0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 
+    0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 
+    0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 
+    0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 
+    0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 
+    0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 
+    0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 
+    0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 
+    0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 
+    0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 
+    0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 
+    0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 
+    0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 
+};
+
+const unsigned char*
+TIFFGetBitRevTable(int reversed)
+{
+	return (reversed ? TIFFBitRevTable : TIFFNoBitRevTable);
+}
+
+void
+TIFFReverseBits(register u_char* cp, register u_long n)
+{
+	for (; n > 8; n -= 8) {
+		cp[0] = TIFFBitRevTable[cp[0]];
+		cp[1] = TIFFBitRevTable[cp[1]];
+		cp[2] = TIFFBitRevTable[cp[2]];
+		cp[3] = TIFFBitRevTable[cp[3]];
+		cp[4] = TIFFBitRevTable[cp[4]];
+		cp[5] = TIFFBitRevTable[cp[5]];
+		cp[6] = TIFFBitRevTable[cp[6]];
+		cp[7] = TIFFBitRevTable[cp[7]];
+		cp += 8;
+	}
+	while (n-- > 0)
+		*cp = TIFFBitRevTable[*cp], cp++;
+}
diff --git a/src/tiff/tif_thunder.c b/src/tiff/tif_thunder.c
new file mode 100644
index 0000000..1608e62
--- /dev/null
+++ b/src/tiff/tif_thunder.c
@@ -0,0 +1,154 @@
+/* $Header: /home/terralib/src/tiff/tif_thunder.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef THUNDER_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * ThunderScan 4-bit Compression Algorithm Support
+ */
+
+/*
+ * ThunderScan uses an encoding scheme designed for
+ * 4-bit pixel values.  Data is encoded in bytes, with
+ * each byte split into a 2-bit code word and a 6-bit
+ * data value.  The encoding gives raw data, runs of
+ * pixels, or pixel values encoded as a delta from the
+ * previous pixel value.  For the latter, either 2-bit
+ * or 3-bit delta values are used, with the deltas packed
+ * into a single byte.
+ */
+#define	THUNDER_DATA		0x3f	/* mask for 6-bit data */
+#define	THUNDER_CODE		0xc0	/* mask for 2-bit code word */
+/* code values */
+#define	THUNDER_RUN		0x00	/* run of pixels w/ encoded count */
+#define	THUNDER_2BITDELTAS	0x40	/* 3 pixels w/ encoded 2-bit deltas */
+#define	    DELTA2_SKIP		2	/* skip code for 2-bit deltas */
+#define	THUNDER_3BITDELTAS	0x80	/* 2 pixels w/ encoded 3-bit deltas */
+#define	    DELTA3_SKIP		4	/* skip code for 3-bit deltas */
+#define	THUNDER_RAW		0xc0	/* raw data encoded */
+
+static const int twobitdeltas[4] = { 0, 1, 0, -1 };
+static const int threebitdeltas[8] = { 0, 1, 2, 3, 0, -3, -2, -1 };
+
+#define	SETPIXEL(op, v) { \
+	lastpixel = (v) & 0xf; \
+	if (npixels++ & 1) \
+	    *op++ |= lastpixel; \
+	else \
+	    op[0] = (tidataval_t) (lastpixel << 4); \
+}
+
+static int
+ThunderDecode(TIFF* tif, tidata_t op, tsize_t maxpixels)
+{
+	register u_char *bp;
+	register tsize_t cc;
+	u_int lastpixel;
+	tsize_t npixels;
+
+	bp = (u_char *)tif->tif_rawcp;
+	cc = tif->tif_rawcc;
+	lastpixel = 0;
+	npixels = 0;
+	while (cc > 0 && npixels < maxpixels) {
+		int n, delta;
+
+		n = *bp++, cc--;
+		switch (n & THUNDER_CODE) {
+		case THUNDER_RUN:		/* pixel run */
+			/*
+			 * Replicate the last pixel n times,
+			 * where n is the lower-order 6 bits.
+			 */
+			if (npixels & 1) {
+				op[0] |= lastpixel;
+				lastpixel = *op++; npixels++; n--;
+			} else
+				lastpixel |= lastpixel << 4;
+			npixels += n;
+			for (; n > 0; n -= 2)
+				*op++ = (tidataval_t) lastpixel;
+			if (n == -1)
+				*--op &= 0xf0;
+			lastpixel &= 0xf;
+			break;
+		case THUNDER_2BITDELTAS:	/* 2-bit deltas */
+			if ((delta = ((n >> 4) & 3)) != DELTA2_SKIP)
+				SETPIXEL(op, lastpixel + twobitdeltas[delta]);
+			if ((delta = ((n >> 2) & 3)) != DELTA2_SKIP)
+				SETPIXEL(op, lastpixel + twobitdeltas[delta]);
+			if ((delta = (n & 3)) != DELTA2_SKIP)
+				SETPIXEL(op, lastpixel + twobitdeltas[delta]);
+			break;
+		case THUNDER_3BITDELTAS:	/* 3-bit deltas */
+			if ((delta = ((n >> 3) & 7)) != DELTA3_SKIP)
+				SETPIXEL(op, lastpixel + threebitdeltas[delta]);
+			if ((delta = (n & 7)) != DELTA3_SKIP)
+				SETPIXEL(op, lastpixel + threebitdeltas[delta]);
+			break;
+		case THUNDER_RAW:		/* raw data */
+			SETPIXEL(op, n);
+			break;
+		}
+	}
+	tif->tif_rawcp = (tidata_t) bp;
+	tif->tif_rawcc = cc;
+	if (npixels != maxpixels) {
+		TIFFError(tif->tif_name,
+		    "ThunderDecode: %s data at scanline %ld (%lu != %lu)",
+		    npixels < maxpixels ? "Not enough" : "Too much",
+		    (long) tif->tif_row, (long) npixels, (long) maxpixels);
+		return (0);
+	}
+	return (1);
+}
+
+static int
+ThunderDecodeRow(TIFF* tif, tidata_t buf, tsize_t occ, tsample_t s)
+{
+	tidata_t row = buf;
+	
+	(void) s;
+	while ((long)occ > 0) {
+		if (!ThunderDecode(tif, row, tif->tif_dir.td_imagewidth))
+			return (0);
+		occ -= tif->tif_scanlinesize;
+		row += tif->tif_scanlinesize;
+	}
+	return (1);
+}
+
+int
+TIFFInitThunderScan(TIFF* tif, int scheme)
+{
+	(void) scheme;
+	tif->tif_decoderow = ThunderDecodeRow;
+	tif->tif_decodestrip = ThunderDecodeRow;
+	return (1);
+}
+#endif /* THUNDER_SUPPORT */
diff --git a/src/tiff/tif_tile.c b/src/tiff/tif_tile.c
new file mode 100644
index 0000000..1512dec
--- /dev/null
+++ b/src/tiff/tif_tile.c
@@ -0,0 +1,219 @@
+/* $Header: /home/terralib/src/tiff/tif_tile.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Tiled Image Support Routines.
+ */
+#include "tiffiop.h"
+
+/*
+ * Compute which tile an (x,y,z,s) value is in.
+ */
+ttile_t
+TIFFComputeTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	uint32 dx = td->td_tilewidth;
+	uint32 dy = td->td_tilelength;
+	uint32 dz = td->td_tiledepth;
+	ttile_t tile = 1;
+
+	if (td->td_imagedepth == 1)
+		z = 0;
+	if (dx == (uint32) -1)
+		dx = td->td_imagewidth;
+	if (dy == (uint32) -1)
+		dy = td->td_imagelength;
+	if (dz == (uint32) -1)
+		dz = td->td_imagedepth;
+	if (dx != 0 && dy != 0 && dz != 0) {
+		uint32 xpt = TIFFhowmany(td->td_imagewidth, dx); 
+		uint32 ypt = TIFFhowmany(td->td_imagelength, dy); 
+		uint32 zpt = TIFFhowmany(td->td_imagedepth, dz); 
+
+		if (td->td_planarconfig == PLANARCONFIG_SEPARATE) 
+			tile = (xpt*ypt*zpt)*s +
+			     (xpt*ypt)*(z/dz) +
+			     xpt*(y/dy) +
+			     x/dx;
+		else
+			tile = (xpt*ypt)*(z/dz) + xpt*(y/dy) + x/dx;
+	}
+	return (tile);
+}
+
+/*
+ * Check an (x,y,z,s) coordinate
+ * against the image bounds.
+ */
+int
+TIFFCheckTile(TIFF* tif, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if (x >= td->td_imagewidth) {
+		TIFFError(tif->tif_name, "Col %ld out of range, max %lu",
+		    (long) x, (u_long) td->td_imagewidth);
+		return (0);
+	}
+	if (y >= td->td_imagelength) {
+		TIFFError(tif->tif_name, "Row %ld out of range, max %lu",
+		    (long) y, (u_long) td->td_imagelength);
+		return (0);
+	}
+	if (z >= td->td_imagedepth) {
+		TIFFError(tif->tif_name, "Depth %ld out of range, max %lu",
+		    (long) z, (u_long) td->td_imagedepth);
+		return (0);
+	}
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE &&
+	    s >= td->td_samplesperpixel) {
+		TIFFError(tif->tif_name, "Sample %d out of range, max %u",
+		    (int) s, td->td_samplesperpixel);
+		return (0);
+	}
+	return (1);
+}
+
+/*
+ * Compute how many tiles are in an image.
+ */
+ttile_t
+TIFFNumberOfTiles(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	uint32 dx = td->td_tilewidth;
+	uint32 dy = td->td_tilelength;
+	uint32 dz = td->td_tiledepth;
+	ttile_t ntiles;
+
+	if (dx == (uint32) -1)
+		dx = td->td_imagewidth;
+	if (dy == (uint32) -1)
+		dy = td->td_imagelength;
+	if (dz == (uint32) -1)
+		dz = td->td_imagedepth;
+	ntiles = (dx == 0 || dy == 0 || dz == 0) ? 0 :
+	    (TIFFhowmany(td->td_imagewidth, dx) *
+	     TIFFhowmany(td->td_imagelength, dy) *
+	     TIFFhowmany(td->td_imagedepth, dz));
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+		ntiles *= td->td_samplesperpixel;
+	return (ntiles);
+}
+
+/*
+ * Compute the # bytes in each row of a tile.
+ */
+tsize_t
+TIFFTileRowSize(TIFF* tif)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t rowsize;
+	
+	if (td->td_tilelength == 0 || td->td_tilewidth == 0)
+		return ((tsize_t) 0);
+	rowsize = td->td_bitspersample * td->td_tilewidth;
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG)
+		rowsize *= td->td_samplesperpixel;
+	return ((tsize_t) TIFFhowmany(rowsize, 8));
+}
+
+/*
+ * Compute the # bytes in a variable length, row-aligned tile.
+ */
+tsize_t
+TIFFVTileSize(TIFF* tif, uint32 nrows)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	tsize_t tilesize;
+
+	if (td->td_tilelength == 0 || td->td_tilewidth == 0 ||
+	    td->td_tiledepth == 0)
+		return ((tsize_t) 0);
+#ifdef YCBCR_SUPPORT
+	if (td->td_planarconfig == PLANARCONFIG_CONTIG &&
+	    td->td_photometric == PHOTOMETRIC_YCBCR &&
+	    !isUpSampled(tif)) {
+		/*
+		 * Packed YCbCr data contain one Cb+Cr for every
+		 * HorizontalSampling*VerticalSampling Y values.
+		 * Must also roundup width and height when calculating
+		 * since images that are not a multiple of the
+		 * horizontal/vertical subsampling area include
+		 * YCbCr data for the extended image.
+		 */
+		tsize_t w =
+		    TIFFroundup(td->td_tilewidth, td->td_ycbcrsubsampling[0]);
+		tsize_t rowsize = TIFFhowmany(w*td->td_bitspersample, 8);
+		tsize_t samplingarea =
+		    td->td_ycbcrsubsampling[0]*td->td_ycbcrsubsampling[1];
+		nrows = TIFFroundup(nrows, td->td_ycbcrsubsampling[1]);
+		/* NB: don't need TIFFhowmany here 'cuz everything is rounded */
+		tilesize = nrows*rowsize + 2*(nrows*rowsize / samplingarea);
+	} else
+#endif
+		tilesize = nrows * TIFFTileRowSize(tif);
+	return ((tsize_t)(tilesize * td->td_tiledepth));
+}
+
+/*
+ * Compute the # bytes in a row-aligned tile.
+ */
+tsize_t
+TIFFTileSize(TIFF* tif)
+{
+	return (TIFFVTileSize(tif, tif->tif_dir.td_tilelength));
+}
+
+/*
+ * Compute a default tile size based on the image
+ * characteristics and a requested value.  If a
+ * request is <1 then we choose a size according
+ * to certain heuristics.
+ */
+void
+TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+{
+	(*tif->tif_deftilesize)(tif, tw, th);
+}
+
+void
+_TIFFDefaultTileSize(TIFF* tif, uint32* tw, uint32* th)
+{
+	(void) tif;
+	if (*(int32*) tw < 1)
+		*tw = 256;
+	if (*(int32*) th < 1)
+		*th = 256;
+	/* roundup to a multiple of 16 per the spec */
+	if (*tw & 0xf)
+		*tw = TIFFroundup(*tw, 16);
+	if (*th & 0xf)
+		*th = TIFFroundup(*th, 16);
+}
diff --git a/src/tiff/tif_unix.c b/src/tiff/tif_unix.c
new file mode 100644
index 0000000..6a3c874
--- /dev/null
+++ b/src/tiff/tif_unix.c
@@ -0,0 +1,228 @@
+/* $Header: /home/terralib/src/tiff/tif_unix.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library UNIX-specific Routines.
+ */
+#include "tiffiop.h"
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+static tsize_t
+_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+	return ((tsize_t) read((int) fd, buf, (size_t) size));
+}
+
+static tsize_t
+_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+	return ((tsize_t) write((int) fd, buf, (size_t) size));
+}
+
+static toff_t
+_tiffSeekProc(thandle_t fd, toff_t off, int whence)
+{
+#if USE_64BIT_API == 1
+	return ((toff_t) lseek64((int) fd, (off64_t) off, whence));
+#else
+	return ((toff_t) lseek((int) fd, (off_t) off, whence));
+#endif
+}
+
+static int
+_tiffCloseProc(thandle_t fd)
+{
+	return (close((int) fd));
+}
+
+#include <sys/stat.h>
+
+static toff_t
+_tiffSizeProc(thandle_t fd)
+{
+#ifdef _AM29K
+	long fsize;
+	return ((fsize = lseek((int) fd, 0, SEEK_END)) < 0 ? 0 : fsize);
+#else
+#if USE_64BIT_API == 1
+	struct stat64 sb;
+	return (toff_t) (fstat64((int) fd, &sb) < 0 ? 0 : sb.st_size);
+#else
+	struct stat sb;
+	return (toff_t) (fstat((int) fd, &sb) < 0 ? 0 : sb.st_size);
+#endif
+#endif
+}
+
+#ifdef HAVE_MMAP
+#include <sys/mman.h>
+
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+	toff_t size = _tiffSizeProc(fd);
+	if (size != (toff_t) -1) {
+		*pbase = (tdata_t)
+		    mmap(0, size, PROT_READ, MAP_SHARED, (int) fd, 0);
+		if (*pbase != (tdata_t) -1) {
+			*psize = size;
+			return (1);
+		}
+	}
+	return (0);
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+	(void) fd;
+	(void) munmap(base, (off_t) size);
+}
+#else /* !HAVE_MMAP */
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+	(void) fd; (void) pbase; (void) psize;
+	return (0);
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+	(void) fd; (void) base; (void) size;
+}
+#endif /* !HAVE_MMAP */
+
+/*
+ * Open a TIFF file descriptor for read/writing.
+ */
+TIFF*
+TIFFFdOpen(int fd, const char* name, const char* mode)
+{
+	TIFF* tif;
+
+	tif = TIFFClientOpen(name, mode,
+	    (thandle_t) fd,
+	    _tiffReadProc, _tiffWriteProc,
+	    _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+	    _tiffMapProc, _tiffUnmapProc);
+	if (tif)
+		tif->tif_fd = fd;
+	return (tif);
+}
+
+/*
+ * Open a TIFF file for read/writing.
+ */
+TIFF*
+TIFFOpen(const char* name, const char* mode)
+{
+	static const char module[] = "TIFFOpen";
+	int m, fd;
+
+	m = _TIFFgetMode(mode, module);
+	if (m == -1)
+		return ((TIFF*)0);
+
+/* for cygwin */        
+#ifdef O_BINARY
+        m |= O_BINARY;
+#endif        
+        
+#ifdef _AM29K
+	fd = open(name, m);
+#else
+#if USE_64BIT_API == 1
+	fd = open(name, m | O_LARGEFILE, 0666);
+#else
+	fd = open(name, m, 0666);
+#endif
+#endif
+	if (fd < 0) {
+		TIFFError(module, "%s: Cannot open", name);
+		return ((TIFF *)0);
+	}
+	return (TIFFFdOpen(fd, name, mode));
+}
+
+void*
+_TIFFmalloc(tsize_t s)
+{
+	return (malloc((size_t) s));
+}
+
+void
+_TIFFfree(tdata_t p)
+{
+	free(p);
+}
+
+void*
+_TIFFrealloc(tdata_t p, tsize_t s)
+{
+	return (realloc(p, (size_t) s));
+}
+
+void
+_TIFFmemset(tdata_t p, int v, tsize_t c)
+{
+	memset(p, v, (size_t) c);
+}
+
+void
+_TIFFmemcpy(tdata_t d, const tdata_t s, tsize_t c)
+{
+	memcpy(d, s, (size_t) c);
+}
+
+int
+_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
+{
+	return (memcmp(p1, p2, (size_t) c));
+}
+
+static void
+unixWarningHandler(const char* module, const char* fmt, va_list ap)
+{
+	if (module != NULL)
+		fprintf(stderr, "%s: ", module);
+	fprintf(stderr, "Warning, ");
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, ".\n");
+}
+TIFFErrorHandler _TIFFwarningHandler = unixWarningHandler;
+
+static void
+unixErrorHandler(const char* module, const char* fmt, va_list ap)
+{
+	if (module != NULL)
+		fprintf(stderr, "%s: ", module);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, ".\n");
+}
+TIFFErrorHandler _TIFFerrorHandler = unixErrorHandler;
diff --git a/src/tiff/tif_version.c b/src/tiff/tif_version.c
new file mode 100644
index 0000000..6c60313
--- /dev/null
+++ b/src/tiff/tif_version.c
@@ -0,0 +1,33 @@
+/* $Header: /home/terralib/src/tiff/tif_version.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+/*
+ * Copyright (c) 1992-1997 Sam Leffler
+ * Copyright (c) 1992-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+#include "tiffiop.h"
+
+static const char TIFFVersion[] = TIFFLIB_VERSION_STR;
+
+const char*
+TIFFGetVersion(void)
+{
+	return (TIFFVersion);
+}
diff --git a/src/tiff/tif_warning.c b/src/tiff/tif_warning.c
new file mode 100644
index 0000000..faf7e67
--- /dev/null
+++ b/src/tiff/tif_warning.c
@@ -0,0 +1,49 @@
+/* $Header: /home/terralib/src/tiff/tif_warning.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ */
+#include "tiffiop.h"
+
+TIFFErrorHandler
+TIFFSetWarningHandler(TIFFErrorHandler handler)
+{
+	TIFFErrorHandler prev = _TIFFwarningHandler;
+	_TIFFwarningHandler = handler;
+	return (prev);
+}
+
+void
+TIFFWarning(const char* module, const char* fmt, ...)
+{
+	if (_TIFFwarningHandler) {
+		va_list ap;
+		va_start(ap, fmt);
+		(*_TIFFwarningHandler)(module, fmt, ap);
+		va_end(ap);
+	}
+}
diff --git a/src/tiff/tif_win32.c b/src/tiff/tif_win32.c
new file mode 100644
index 0000000..5b86505
--- /dev/null
+++ b/src/tiff/tif_win32.c
@@ -0,0 +1,323 @@
+/* $Header: /home/terralib/src/tiff/tif_win32.c,v 1.5 2005/04/07 18:25:16 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library Win32-specific Routines.  Adapted from tif_unix.c 4/5/95 by
+ * Scott Wagner (wagner at itek.com), Itek Graphix, Rochester, NY USA
+ */
+#include <windows.h>
+#include "tiffiop.h"
+
+static tsize_t
+_tiffReadProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+	DWORD dwSizeRead;
+	if (!ReadFile(fd, buf, size, &dwSizeRead, NULL))
+		return(0);
+	return ((tsize_t) dwSizeRead);
+}
+
+static tsize_t
+_tiffWriteProc(thandle_t fd, tdata_t buf, tsize_t size)
+{
+	DWORD dwSizeWritten;
+	if (!WriteFile(fd, buf, size, &dwSizeWritten, NULL))
+		return(0);
+	return ((tsize_t) dwSizeWritten);
+}
+
+static toff_t
+_tiffSeekProc(thandle_t fd, toff_t off, int whence)
+{
+	DWORD dwMoveMethod, dwMoveHigh;
+
+        /* we use this as a special code, so avoid accepting it */
+        if( off == 0xFFFFFFFF )
+            return 0xFFFFFFFF;
+        
+	switch(whence)
+	{
+	case SEEK_SET:
+		dwMoveMethod = FILE_BEGIN;
+		break;
+	case SEEK_CUR:
+		dwMoveMethod = FILE_CURRENT;
+		break;
+	case SEEK_END:
+		dwMoveMethod = FILE_END;
+		break;
+	default:
+		dwMoveMethod = FILE_BEGIN;
+		break;
+	}
+        dwMoveHigh = 0;
+	return ((toff_t)SetFilePointer(fd, (LONG) off, (PLONG)&dwMoveHigh,
+                                       dwMoveMethod));
+}
+
+static int
+_tiffCloseProc(thandle_t fd)
+{
+	return (CloseHandle(fd) ? 0 : -1);
+}
+
+static toff_t
+_tiffSizeProc(thandle_t fd)
+{
+	return ((toff_t)GetFileSize(fd, NULL));
+}
+
+#ifdef __BORLANDC__
+#pragma argsused
+#endif
+static int
+_tiffDummyMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+	return (0);
+}
+
+/*
+ * From "Hermann Josef Hill" <lhill at rhein-zeitung.de>:
+ *
+ * Windows uses both a handle and a pointer for file mapping,
+ * but according to the SDK documentation and Richter's book
+ * "Advanced Windows Programming" it is safe to free the handle
+ * after obtaining the file mapping pointer
+ *
+ * This removes a nasty OS dependency and cures a problem
+ * with Visual C++ 5.0
+ */
+static int
+_tiffMapProc(thandle_t fd, tdata_t* pbase, toff_t* psize)
+{
+	toff_t size;
+	HANDLE hMapFile;
+
+	if ((size = _tiffSizeProc(fd)) == 0xFFFFFFFF)
+		return (0);
+	hMapFile = CreateFileMapping(fd, NULL, PAGE_READONLY, 0, size, NULL);
+	if (hMapFile == NULL)
+		return (0);
+	*pbase = MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0);
+	CloseHandle(hMapFile);
+	if (*pbase == NULL)
+		return (0);
+	*psize = size;
+	return(1);
+}
+
+#ifdef __BORLANDC__
+#pragma argsused
+#endif
+static void
+_tiffDummyUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+}
+
+static void
+_tiffUnmapProc(thandle_t fd, tdata_t base, toff_t size)
+{
+	UnmapViewOfFile(base);
+}
+
+/*
+ * Open a TIFF file descriptor for read/writing.
+ * Note that TIFFFdOpen and TIFFOpen recognise the character 'u' in the mode
+ * string, which forces the file to be opened unmapped.
+ */
+TIFF*
+TIFFFdOpen(int ifd, const char* name, const char* mode)
+{
+	TIFF* tif;
+	BOOL fSuppressMap = (mode[1] == 'u' || (mode[1]!=0 && mode[2] == 'u'));
+
+	tif = TIFFClientOpen(name, mode,
+		 (thandle_t)ifd,
+	    _tiffReadProc, _tiffWriteProc,
+	    _tiffSeekProc, _tiffCloseProc, _tiffSizeProc,
+		 fSuppressMap ? _tiffDummyMapProc : _tiffMapProc,
+		 fSuppressMap ? _tiffDummyUnmapProc : _tiffUnmapProc);
+	if (tif)
+		tif->tif_fd = ifd;
+	return (tif);
+}
+
+/*
+ * Open a TIFF file for read/writing.
+ */
+TIFF*
+TIFFOpen(const char* name, const char* mode)
+{
+	static const char module[] = "TIFFOpen";
+	thandle_t fd;
+	int m;
+	DWORD dwMode;
+
+	m = _TIFFgetMode(mode, module);
+
+	switch(m)
+	{
+	case O_RDONLY:
+		dwMode = OPEN_EXISTING;
+		break;
+	case O_RDWR:
+		dwMode = OPEN_ALWAYS;
+		break;
+	case O_RDWR|O_CREAT:
+		dwMode = OPEN_ALWAYS;
+		break;
+	case O_RDWR|O_TRUNC:
+		dwMode = CREATE_ALWAYS;
+		break;
+	case O_RDWR|O_CREAT|O_TRUNC:
+		dwMode = CREATE_ALWAYS;
+		break;
+	default:
+		return ((TIFF*)0);
+	}
+	fd = (thandle_t)CreateFile(name, (m == O_RDONLY) ? GENERIC_READ :
+			(GENERIC_READ | GENERIC_WRITE), FILE_SHARE_READ, NULL, dwMode,
+			(m == O_RDONLY) ? FILE_ATTRIBUTE_READONLY : FILE_ATTRIBUTE_NORMAL, NULL);
+	if (fd == INVALID_HANDLE_VALUE) {
+		TIFFError(module, "%s: Cannot open", name);
+		return ((TIFF *)0);
+	}
+	return (TIFFFdOpen((int)fd, name, mode));
+}
+
+tdata_t
+_TIFFmalloc(tsize_t s)
+{
+	return ((tdata_t)GlobalAlloc(GMEM_FIXED, s));
+}
+
+void
+_TIFFfree(tdata_t p)
+{
+	GlobalFree(p);
+	return;
+}
+
+tdata_t
+_TIFFrealloc(tdata_t p, tsize_t s)
+{
+  void* pvTmp;
+  tsize_t old=GlobalSize(p);
+  if (old>=s)
+    {
+      if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) {
+	CopyMemory(pvTmp, p, s);
+	GlobalFree(p);
+      }
+    }
+  else
+    {
+      if ((pvTmp = GlobalAlloc(GMEM_FIXED, s)) != NULL) {
+	CopyMemory(pvTmp, p, old);
+	GlobalFree(p);
+      }
+    }
+  return ((tdata_t)pvTmp);
+}
+
+void
+_TIFFmemset(void* p, int v, tsize_t c)
+{
+	FillMemory(p, c, (BYTE)v);
+}
+
+void
+_TIFFmemcpy(void* d, const tdata_t s, tsize_t c)
+{
+	CopyMemory(d, s, c);
+}
+
+int
+_TIFFmemcmp(const tdata_t p1, const tdata_t p2, tsize_t c)
+{
+	register const BYTE *pb1 = (const BYTE *) p1;
+	register const BYTE *pb2 = (const BYTE *) p2;
+	register DWORD dwTmp = c;
+	register int iTmp;
+	for (iTmp = 0; dwTmp-- && !iTmp; iTmp = (int)*pb1++ - (int)*pb2++)
+		;
+	return (iTmp);
+}
+
+static void
+Win32WarningHandler(const char* module, const char* fmt, va_list ap)
+{
+#ifndef TIF_PLATFORM_CONSOLE
+	LPTSTR szTitle;
+	LPTSTR szTmp;
+	LPCTSTR szTitleText = "%s Warning";
+	LPCTSTR szDefaultModule = "TIFFLIB";
+	szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module;
+	if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) +
+			lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL)
+		return;
+	wsprintf(szTitle, szTitleText, szTmp);
+	szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR);
+	wvsprintf(szTmp, fmt, ap);
+	MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONINFORMATION);
+	LocalFree(szTitle);
+	return;
+#else
+	if (module != NULL)
+		fprintf(stderr, "%s: ", module);
+	fprintf(stderr, "Warning, ");
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, ".\n");
+#endif        
+}
+TIFFErrorHandler _TIFFwarningHandler = Win32WarningHandler;
+
+static void
+Win32ErrorHandler(const char* module, const char* fmt, va_list ap)
+{
+#ifndef TIF_PLATFORM_CONSOLE
+	LPTSTR szTitle;
+	LPTSTR szTmp;
+	LPCTSTR szTitleText = "%s Error";
+	LPCTSTR szDefaultModule = "TIFFLIB";
+	szTmp = (module == NULL) ? (LPTSTR)szDefaultModule : (LPTSTR)module;
+	if ((szTitle = (LPTSTR)LocalAlloc(LMEM_FIXED, (lstrlen(szTmp) +
+			lstrlen(szTitleText) + lstrlen(fmt) + 128)*sizeof(TCHAR))) == NULL)
+		return;
+	wsprintf(szTitle, szTitleText, szTmp);
+	szTmp = szTitle + (lstrlen(szTitle)+2)*sizeof(TCHAR);
+	wvsprintf(szTmp, fmt, ap);
+	MessageBox(GetFocus(), szTmp, szTitle, MB_OK | MB_ICONEXCLAMATION);
+	LocalFree(szTitle);
+	return;
+#else
+	if (module != NULL)
+		fprintf(stderr, "%s: ", module);
+	vfprintf(stderr, fmt, ap);
+	fprintf(stderr, ".\n");
+#endif        
+}
+TIFFErrorHandler _TIFFerrorHandler = Win32ErrorHandler;
diff --git a/src/tiff/tif_write.c b/src/tiff/tif_write.c
new file mode 100644
index 0000000..e5cc00f
--- /dev/null
+++ b/src/tiff/tif_write.c
@@ -0,0 +1,726 @@
+/* $Header: /home/terralib/src/tiff/tif_write.c,v 1.4 2004/04/12 13:52:41 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+/*
+ * TIFF Library.
+ *
+ * Scanline-oriented Write Support
+ */
+#include "tiffiop.h"
+#include <assert.h>
+#include <stdio.h>
+
+#define REWRITE_HACK
+
+#define	STRIPINCR	20		/* expansion factor on strip array */
+
+#define	WRITECHECKSTRIPS(tif, module)				\
+	(((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),0,module))
+#define	WRITECHECKTILES(tif, module)				\
+	(((tif)->tif_flags&TIFF_BEENWRITING) || TIFFWriteCheck((tif),1,module))
+#define	BUFFERCHECK(tif)					\
+	((((tif)->tif_flags & TIFF_BUFFERSETUP) && tif->tif_rawdata) ||	\
+	    TIFFWriteBufferSetup((tif), NULL, (tsize_t) -1))
+
+static	int TIFFGrowStrips(TIFF*, int, const char*);
+static	int TIFFAppendToStrip(TIFF*, tstrip_t, tidata_t, tsize_t);
+
+int
+TIFFWriteScanline(TIFF* tif, tdata_t buf, uint32 row, tsample_t sample)
+{
+	static const char module[] = "TIFFWriteScanline";
+	register TIFFDirectory *td;
+	int status, imagegrew = 0;
+	tstrip_t strip;
+
+	if (!WRITECHECKSTRIPS(tif, module))
+		return (-1);
+	/*
+	 * Handle delayed allocation of data buffer.  This
+	 * permits it to be sized more intelligently (using
+	 * directory information).
+	 */
+	if (!BUFFERCHECK(tif))
+		return (-1);
+	td = &tif->tif_dir;
+	/*
+	 * Extend image length if needed
+	 * (but only for PlanarConfig=1).
+	 */
+	if (row >= td->td_imagelength) {	/* extend image */
+		if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+			TIFFError(tif->tif_name,
+		"Can not change \"ImageLength\" when using separate planes");
+			return (-1);
+		}
+		td->td_imagelength = row+1;
+		imagegrew = 1;
+	}
+	/*
+	 * Calculate strip and check for crossings.
+	 */
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+		if (sample >= td->td_samplesperpixel) {
+			TIFFError(tif->tif_name,
+			    "%d: Sample out of range, max %d",
+			    sample, td->td_samplesperpixel);
+			return (-1);
+		}
+		strip = sample*td->td_stripsperimage + row/td->td_rowsperstrip;
+	} else
+		strip = row / td->td_rowsperstrip;
+	if (strip != tif->tif_curstrip) {
+		/*
+		 * Changing strips -- flush any data present.
+		 */
+		if (!TIFFFlushData(tif))
+			return (-1);
+		tif->tif_curstrip = strip;
+		/*
+		 * Watch out for a growing image.  The value of
+		 * strips/image will initially be 1 (since it
+		 * can't be deduced until the imagelength is known).
+		 */
+		if (strip >= td->td_stripsperimage && imagegrew)
+			td->td_stripsperimage =
+			    TIFFhowmany(td->td_imagelength,td->td_rowsperstrip);
+		tif->tif_row =
+		    (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+		if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+			if (!(*tif->tif_setupencode)(tif))
+				return (-1);
+			tif->tif_flags |= TIFF_CODERSETUP;
+		}
+		if (!(*tif->tif_preencode)(tif, sample))
+			return (-1);
+		tif->tif_flags |= TIFF_POSTENCODE;
+	}
+	/*
+	 * Check strip array to make sure there's space.
+	 * We don't support dynamically growing files that
+	 * have data organized in separate bitplanes because
+	 * it's too painful.  In that case we require that
+	 * the imagelength be set properly before the first
+	 * write (so that the strips array will be fully
+	 * allocated above).
+	 */
+	if (strip >= td->td_nstrips && !TIFFGrowStrips(tif, 1, module))
+		return (-1);
+	/*
+	 * Ensure the write is either sequential or at the
+	 * beginning of a strip (or that we can randomly
+	 * access the data -- i.e. no encoding).
+	 */
+	if (row != tif->tif_row) {
+		if (row < tif->tif_row) {
+			/*
+			 * Moving backwards within the same strip:
+			 * backup to the start and then decode
+			 * forward (below).
+			 */
+			tif->tif_row = (strip % td->td_stripsperimage) *
+			    td->td_rowsperstrip;
+			tif->tif_rawcp = tif->tif_rawdata;
+		}
+		/*
+		 * Seek forward to the desired row.
+		 */
+		if (!(*tif->tif_seek)(tif, row - tif->tif_row))
+			return (-1);
+		tif->tif_row = row;
+	}
+
+        /* swab if needed - note that source buffer will be altered */
+        tif->tif_postdecode( tif, (tidata_t) buf, tif->tif_scanlinesize );
+
+	status = (*tif->tif_encoderow)(tif, (tidata_t) buf,
+	    tif->tif_scanlinesize, sample);
+
+        /* we are now poised at the beginning of the next row */
+	tif->tif_row = row + 1;
+	return (status);
+}
+
+/*
+ * Encode the supplied data and write it to the
+ * specified strip.  There must be space for the
+ * data; we don't check if strips overlap!
+ *
+ * NB: Image length must be setup before writing.
+ */
+tsize_t
+TIFFWriteEncodedStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
+{
+	static const char module[] = "TIFFWriteEncodedStrip";
+	TIFFDirectory *td = &tif->tif_dir;
+	tsample_t sample;
+
+	if (!WRITECHECKSTRIPS(tif, module))
+		return ((tsize_t) -1);
+	/*
+	 * Check strip array to make sure there's space.
+	 * We don't support dynamically growing files that
+	 * have data organized in separate bitplanes because
+	 * it's too painful.  In that case we require that
+	 * the imagelength be set properly before the first
+	 * write (so that the strips array will be fully
+	 * allocated above).
+	 */
+	if (strip >= td->td_nstrips) {
+		if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+			TIFFError(tif->tif_name,
+		"Can not grow image by strips when using separate planes");
+			return ((tsize_t) -1);
+		}
+		if (!TIFFGrowStrips(tif, 1, module))
+			return ((tsize_t) -1);
+		td->td_stripsperimage =
+		    TIFFhowmany(td->td_imagelength, td->td_rowsperstrip);
+	}
+	/*
+	 * Handle delayed allocation of data buffer.  This
+	 * permits it to be sized according to the directory
+	 * info.
+	 */
+	if (!BUFFERCHECK(tif))
+		return ((tsize_t) -1);
+	tif->tif_curstrip = strip;
+	tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+	if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+		if (!(*tif->tif_setupencode)(tif))
+			return ((tsize_t) -1);
+		tif->tif_flags |= TIFF_CODERSETUP;
+	}
+        
+#ifdef REWRITE_HACK        
+	tif->tif_rawcc = 0;
+	tif->tif_rawcp = tif->tif_rawdata;
+
+        if( td->td_stripbytecount[strip] > 0 )
+        {
+            /* if we are writing over existing tiles, zero length. */
+            td->td_stripbytecount[strip] = 0;
+
+            /* this forces TIFFAppendToStrip() to do a seek */
+            tif->tif_curoff = 0;
+        }
+#endif
+        
+	tif->tif_flags &= ~TIFF_POSTENCODE;
+	sample = (tsample_t)(strip / td->td_stripsperimage);
+	if (!(*tif->tif_preencode)(tif, sample))
+		return ((tsize_t) -1);
+
+        /* swab if needed - note that source buffer will be altered */
+        tif->tif_postdecode( tif, (tidata_t) data, cc );
+
+	if (!(*tif->tif_encodestrip)(tif, (tidata_t) data, cc, sample))
+		return ((tsize_t) 0);
+	if (!(*tif->tif_postencode)(tif))
+		return ((tsize_t) -1);
+	if (!isFillOrder(tif, td->td_fillorder) &&
+	    (tif->tif_flags & TIFF_NOBITREV) == 0)
+		TIFFReverseBits(tif->tif_rawdata, tif->tif_rawcc);
+	if (tif->tif_rawcc > 0 &&
+	    !TIFFAppendToStrip(tif, strip, tif->tif_rawdata, tif->tif_rawcc))
+		return ((tsize_t) -1);
+	tif->tif_rawcc = 0;
+	tif->tif_rawcp = tif->tif_rawdata;
+	return (cc);
+}
+
+/*
+ * Write the supplied data to the specified strip.
+ * There must be space for the data; we don't check
+ * if strips overlap!
+ *
+ * NB: Image length must be setup before writing.
+ */
+tsize_t
+TIFFWriteRawStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
+{
+	static const char module[] = "TIFFWriteRawStrip";
+	TIFFDirectory *td = &tif->tif_dir;
+
+	if (!WRITECHECKSTRIPS(tif, module))
+		return ((tsize_t) -1);
+	/*
+	 * Check strip array to make sure there's space.
+	 * We don't support dynamically growing files that
+	 * have data organized in separate bitplanes because
+	 * it's too painful.  In that case we require that
+	 * the imagelength be set properly before the first
+	 * write (so that the strips array will be fully
+	 * allocated above).
+	 */
+	if (strip >= td->td_nstrips) {
+		if (td->td_planarconfig == PLANARCONFIG_SEPARATE) {
+			TIFFError(tif->tif_name,
+		"Can not grow image by strips when using separate planes");
+			return ((tsize_t) -1);
+		}
+		/*
+		 * Watch out for a growing image.  The value of
+		 * strips/image will initially be 1 (since it
+		 * can't be deduced until the imagelength is known).
+		 */
+		if (strip >= td->td_stripsperimage)
+			td->td_stripsperimage =
+			    TIFFhowmany(td->td_imagelength,td->td_rowsperstrip);
+		if (!TIFFGrowStrips(tif, 1, module))
+			return ((tsize_t) -1);
+	}
+	tif->tif_curstrip = strip;
+	tif->tif_row = (strip % td->td_stripsperimage) * td->td_rowsperstrip;
+	return (TIFFAppendToStrip(tif, strip, (tidata_t) data, cc) ?
+	    cc : (tsize_t) -1);
+}
+
+/*
+ * Write and compress a tile of data.  The
+ * tile is selected by the (x,y,z,s) coordinates.
+ */
+tsize_t
+TIFFWriteTile(TIFF* tif,
+    tdata_t buf, uint32 x, uint32 y, uint32 z, tsample_t s)
+{
+	if (!TIFFCheckTile(tif, x, y, z, s))
+		return (-1);
+	/*
+	 * NB: A tile size of -1 is used instead of tif_tilesize knowing
+	 *     that TIFFWriteEncodedTile will clamp this to the tile size.
+	 *     This is done because the tile size may not be defined until
+	 *     after the output buffer is setup in TIFFWriteBufferSetup.
+	 */
+	return (TIFFWriteEncodedTile(tif,
+	    TIFFComputeTile(tif, x, y, z, s), buf, (tsize_t) -1));
+}
+
+/*
+ * Encode the supplied data and write it to the
+ * specified tile.  There must be space for the
+ * data.  The function clamps individual writes
+ * to a tile to the tile size, but does not (and
+ * can not) check that multiple writes to the same
+ * tile do not write more than tile size data.
+ *
+ * NB: Image length must be setup before writing; this
+ *     interface does not support automatically growing
+ *     the image on each write (as TIFFWriteScanline does).
+ */
+tsize_t
+TIFFWriteEncodedTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc)
+{
+	static const char module[] = "TIFFWriteEncodedTile";
+	TIFFDirectory *td;
+	tsample_t sample;
+
+	if (!WRITECHECKTILES(tif, module))
+		return ((tsize_t) -1);
+	td = &tif->tif_dir;
+	if (tile >= td->td_nstrips) {
+		TIFFError(module, "%s: Tile %lu out of range, max %lu",
+		    tif->tif_name, (u_long) tile, (u_long) td->td_nstrips);
+		return ((tsize_t) -1);
+	}
+	/*
+	 * Handle delayed allocation of data buffer.  This
+	 * permits it to be sized more intelligently (using
+	 * directory information).
+	 */
+	if (!BUFFERCHECK(tif))
+		return ((tsize_t) -1);
+	tif->tif_curtile = tile;
+
+#ifdef REWRITE_HACK        
+	tif->tif_rawcc = 0;
+	tif->tif_rawcp = tif->tif_rawdata;
+
+        if( td->td_stripbytecount[tile] > 0 )
+        {
+            /* if we are writing over existing tiles, zero length. */
+            td->td_stripbytecount[tile] = 0;
+
+            /* this forces TIFFAppendToStrip() to do a seek */
+            tif->tif_curoff = 0;
+        }
+#endif
+        
+	/* 
+	 * Compute tiles per row & per column to compute
+	 * current row and column
+	 */
+	tif->tif_row = (tile % TIFFhowmany(td->td_imagelength, td->td_tilelength))
+		* td->td_tilelength;
+	tif->tif_col = (tile % TIFFhowmany(td->td_imagewidth, td->td_tilewidth))
+		* td->td_tilewidth;
+
+	if ((tif->tif_flags & TIFF_CODERSETUP) == 0) {
+		if (!(*tif->tif_setupencode)(tif))
+			return ((tsize_t) -1);
+		tif->tif_flags |= TIFF_CODERSETUP;
+	}
+	tif->tif_flags &= ~TIFF_POSTENCODE;
+	sample = (tsample_t)(tile/td->td_stripsperimage);
+	if (!(*tif->tif_preencode)(tif, sample))
+		return ((tsize_t) -1);
+	/*
+	 * Clamp write amount to the tile size.  This is mostly
+	 * done so that callers can pass in some large number
+	 * (e.g. -1) and have the tile size used instead.
+	 */
+	if ( cc < 1 || cc > tif->tif_tilesize)
+		cc = tif->tif_tilesize;
+
+        /* swab if needed - note that source buffer will be altered */
+        tif->tif_postdecode( tif, (tidata_t) data, cc );
+
+	if (!(*tif->tif_encodetile)(tif, (tidata_t) data, cc, sample))
+		return ((tsize_t) 0);
+	if (!(*tif->tif_postencode)(tif))
+		return ((tsize_t) -1);
+	if (!isFillOrder(tif, td->td_fillorder) &&
+	    (tif->tif_flags & TIFF_NOBITREV) == 0)
+		TIFFReverseBits((u_char *)tif->tif_rawdata, tif->tif_rawcc);
+	if (tif->tif_rawcc > 0 && !TIFFAppendToStrip(tif, tile,
+	    tif->tif_rawdata, tif->tif_rawcc))
+		return ((tsize_t) -1);
+	tif->tif_rawcc = 0;
+	tif->tif_rawcp = tif->tif_rawdata;
+	return (cc);
+}
+
+/*
+ * Write the supplied data to the specified strip.
+ * There must be space for the data; we don't check
+ * if strips overlap!
+ *
+ * NB: Image length must be setup before writing; this
+ *     interface does not support automatically growing
+ *     the image on each write (as TIFFWriteScanline does).
+ */
+tsize_t
+TIFFWriteRawTile(TIFF* tif, ttile_t tile, tdata_t data, tsize_t cc)
+{
+	static const char module[] = "TIFFWriteRawTile";
+
+	if (!WRITECHECKTILES(tif, module))
+		return ((tsize_t) -1);
+	if (tile >= tif->tif_dir.td_nstrips) {
+		TIFFError(module, "%s: Tile %lu out of range, max %lu",
+		    tif->tif_name, (u_long) tile,
+		    (u_long) tif->tif_dir.td_nstrips);
+		return ((tsize_t) -1);
+	}
+	return (TIFFAppendToStrip(tif, tile, (tidata_t) data, cc) ?
+	    cc : (tsize_t) -1);
+}
+
+#define	isUnspecified(tif, f) \
+    (TIFFFieldSet(tif,f) && (tif)->tif_dir.td_imagelength == 0)
+
+int
+TIFFSetupStrips(TIFF* tif)
+{
+	TIFFDirectory* td = &tif->tif_dir;
+
+	if (isTiled(tif))
+		td->td_stripsperimage =
+		    isUnspecified(tif, FIELD_TILEDIMENSIONS) ?
+			td->td_samplesperpixel : TIFFNumberOfTiles(tif);
+	else
+		td->td_stripsperimage =
+		    isUnspecified(tif, FIELD_ROWSPERSTRIP) ?
+			td->td_samplesperpixel : TIFFNumberOfStrips(tif);
+	td->td_nstrips = td->td_stripsperimage;
+	if (td->td_planarconfig == PLANARCONFIG_SEPARATE)
+		td->td_stripsperimage /= td->td_samplesperpixel;
+	td->td_stripoffset = (uint32 *)
+	    _TIFFmalloc(td->td_nstrips * sizeof (uint32));
+	td->td_stripbytecount = (uint32 *)
+	    _TIFFmalloc(td->td_nstrips * sizeof (uint32));
+	if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL)
+		return (0);
+	/*
+	 * Place data at the end-of-file
+	 * (by setting offsets to zero).
+	 */
+	_TIFFmemset(td->td_stripoffset, 0, td->td_nstrips*sizeof (uint32));
+	_TIFFmemset(td->td_stripbytecount, 0, td->td_nstrips*sizeof (uint32));
+	TIFFSetFieldBit(tif, FIELD_STRIPOFFSETS);
+	TIFFSetFieldBit(tif, FIELD_STRIPBYTECOUNTS);
+	return (1);
+}
+#undef isUnspecified
+
+/*
+ * Verify file is writable and that the directory
+ * information is setup properly.  In doing the latter
+ * we also "freeze" the state of the directory so
+ * that important information is not changed.
+ */
+int
+TIFFWriteCheck(TIFF* tif, int tiles, const char* module)
+{
+	if (tif->tif_mode == O_RDONLY) {
+		TIFFError(module, "%s: File not open for writing",
+		    tif->tif_name);
+		return (0);
+	}
+	if (tiles ^ isTiled(tif)) {
+		TIFFError(tif->tif_name, tiles ?
+		    "Can not write tiles to a stripped image" :
+		    "Can not write scanlines to a tiled image");
+		return (0);
+	}
+        
+        /*
+         * While we allow compressed TIFF files to be opened in update mode,
+         * we don't allow writing any image blocks in an existing compressed
+         * image.  Eventually we could do so, by moving blocks that grow
+         * to the end of the file, but we don't for now. 
+         */
+	if (tif->tif_dir.td_stripoffset != NULL 
+            && tif->tif_dir.td_compression != COMPRESSION_NONE )
+        {
+            TIFFError( module,
+                       "%s:\n"
+                       "In place update to compressed TIFF images not "
+                       "supported.",
+                       tif->tif_name );
+            return (0);
+        }
+
+	/*
+	 * On the first write verify all the required information
+	 * has been setup and initialize any data structures that
+	 * had to wait until directory information was set.
+	 * Note that a lot of our work is assumed to remain valid
+	 * because we disallow any of the important parameters
+	 * from changing after we start writing (i.e. once
+	 * TIFF_BEENWRITING is set, TIFFSetField will only allow
+	 * the image's length to be changed).
+	 */
+	if (!TIFFFieldSet(tif, FIELD_IMAGEDIMENSIONS)) {
+		TIFFError(module,
+		    "%s: Must set \"ImageWidth\" before writing data",
+		    tif->tif_name);
+		return (0);
+	}
+	if (!TIFFFieldSet(tif, FIELD_PLANARCONFIG)) {
+		TIFFError(module,
+	    "%s: Must set \"PlanarConfiguration\" before writing data",
+		    tif->tif_name);
+		return (0);
+	}
+	if (tif->tif_dir.td_stripoffset == NULL && !TIFFSetupStrips(tif)) {
+		tif->tif_dir.td_nstrips = 0;
+		TIFFError(module, "%s: No space for %s arrays",
+		    tif->tif_name, isTiled(tif) ? "tile" : "strip");
+		return (0);
+	}
+	tif->tif_tilesize = TIFFTileSize(tif);
+	tif->tif_scanlinesize = TIFFScanlineSize(tif);
+	tif->tif_flags |= TIFF_BEENWRITING;
+	return (1);
+}
+
+/*
+ * Setup the raw data buffer used for encoding.
+ */
+int
+TIFFWriteBufferSetup(TIFF* tif, tdata_t bp, tsize_t size)
+{
+	static const char module[] = "TIFFWriteBufferSetup";
+
+	if (tif->tif_rawdata) {
+		if (tif->tif_flags & TIFF_MYBUFFER) {
+			_TIFFfree(tif->tif_rawdata);
+			tif->tif_flags &= ~TIFF_MYBUFFER;
+		}
+		tif->tif_rawdata = NULL;
+	}
+	if (size == (tsize_t) -1) {
+		size = (isTiled(tif) ?
+		    tif->tif_tilesize : tif->tif_scanlinesize);
+		/*
+		 * Make raw data buffer at least 8K
+		 */
+		if (size < 8*1024)
+			size = 8*1024;
+		bp = NULL;			/* NB: force malloc */
+	}
+	if (bp == NULL) {
+		bp = _TIFFmalloc(size);
+		if (bp == NULL) {
+			TIFFError(module, "%s: No space for output buffer",
+			    tif->tif_name);
+			return (0);
+		}
+		tif->tif_flags |= TIFF_MYBUFFER;
+	} else
+		tif->tif_flags &= ~TIFF_MYBUFFER;
+	tif->tif_rawdata = (tidata_t) bp;
+	tif->tif_rawdatasize = size;
+	tif->tif_rawcc = 0;
+	tif->tif_rawcp = tif->tif_rawdata;
+	tif->tif_flags |= TIFF_BUFFERSETUP;
+	return (1);
+}
+
+/*
+ * Grow the strip data structures by delta strips.
+ */
+static int
+TIFFGrowStrips(TIFF* tif, int delta, const char* module)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+
+	assert(td->td_planarconfig == PLANARCONFIG_CONTIG);
+	td->td_stripoffset = (uint32*)_TIFFrealloc(td->td_stripoffset,
+	    (td->td_nstrips + delta) * sizeof (uint32));
+	td->td_stripbytecount = (uint32*)_TIFFrealloc(td->td_stripbytecount,
+	    (td->td_nstrips + delta) * sizeof (uint32));
+	if (td->td_stripoffset == NULL || td->td_stripbytecount == NULL) {
+		td->td_nstrips = 0;
+		TIFFError(module, "%s: No space to expand strip arrays",
+		    tif->tif_name);
+		return (0);
+	}
+	_TIFFmemset(td->td_stripoffset+td->td_nstrips, 0, delta*sizeof (uint32));
+	_TIFFmemset(td->td_stripbytecount+td->td_nstrips, 0, delta*sizeof (uint32));
+	td->td_nstrips += delta;
+	return (1);
+}
+
+/*
+ * Append the data to the specified strip.
+ *
+ * NB: We don't check that there's space in the
+ *     file (i.e. that strips do not overlap).
+ */
+static int
+TIFFAppendToStrip(TIFF* tif, tstrip_t strip, tidata_t data, tsize_t cc)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	static const char module[] = "TIFFAppendToStrip";
+
+	if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) {
+		/*
+		 * No current offset, set the current strip.
+
+		 */
+		if (td->td_stripoffset[strip] != 0) {
+			if (!SeekOK(tif, td->td_stripoffset[strip])) {
+				TIFFError(module,
+				    "%s: Seek error at scanline %lu",
+				    tif->tif_name, (u_long) tif->tif_row);
+				return (0);
+			}
+		} else
+			td->td_stripoffset[strip] =
+			    TIFFSeekFile(tif, (toff_t) 0, SEEK_END);
+		tif->tif_curoff = td->td_stripoffset[strip];
+	}
+	if (!WriteOK(tif, data, cc)) {
+		TIFFError(module, "%s: Write error at scanline %lu",
+		    tif->tif_name, (u_long) tif->tif_row);
+		return (0);
+	}
+	tif->tif_curoff += cc;
+	td->td_stripbytecount[strip] += cc;
+	return (1);
+}
+
+/*
+ * Internal version of TIFFFlushData that can be
+ * called by ``encodestrip routines'' w/o concern
+ * for infinite recursion.
+ */
+int
+TIFFFlushData1(TIFF* tif)
+{
+	if (tif->tif_rawcc > 0) {
+		if (!isFillOrder(tif, tif->tif_dir.td_fillorder) &&
+		    (tif->tif_flags & TIFF_NOBITREV) == 0)
+			TIFFReverseBits((u_char *)tif->tif_rawdata,
+			    tif->tif_rawcc);
+		if (!TIFFAppendToStrip(tif,
+		    isTiled(tif) ? tif->tif_curtile : tif->tif_curstrip,
+		    tif->tif_rawdata, tif->tif_rawcc))
+			return (0);
+		tif->tif_rawcc = 0;
+		tif->tif_rawcp = tif->tif_rawdata;
+	}
+	return (1);
+}
+
+/*
+ * Set the current write offset.  This should only be
+ * used to set the offset to a known previous location
+ * (very carefully), or to 0 so that the next write gets
+ * appended to the end of the file.
+ */
+void
+TIFFSetWriteOffset(TIFF* tif, toff_t off)
+{
+	tif->tif_curoff = off;
+}
+
+
+/*
+ * Rewrite the specified strip.
+ */
+
+tsize_t
+TIFFWriteStrip(TIFF* tif, tstrip_t strip, tdata_t data, tsize_t cc)
+{
+	TIFFDirectory *td = &tif->tif_dir;
+	static const char module[] = "TIFFWriteStrip";
+
+	if (td->td_stripoffset[strip] == 0 || tif->tif_curoff == 0) {
+		/*
+		 * No current offset, set the current strip.
+		 */
+		if (td->td_stripoffset[strip] != 0) {
+			if (!SeekOK(tif, td->td_stripoffset[strip])) {
+				TIFFError(module,
+				    "%s: Seek error at scanline %lu",
+				    tif->tif_name, (u_long) tif->tif_row);
+				return (0);
+			}
+		} else
+			td->td_stripoffset[strip] =
+			    TIFFSeekFile(tif, (toff_t) 0, SEEK_END);
+		tif->tif_curoff = td->td_stripoffset[strip];
+	}
+	if (!WriteOK(tif, data, cc)) {
+		TIFFError(module, "%s: Write error at scanline %lu",
+		    tif->tif_name, (u_long) tif->tif_row);
+		return (0);
+	}
+	return (1);
+}
\ No newline at end of file
diff --git a/src/tiff/tif_zip.c b/src/tiff/tif_zip.c
new file mode 100644
index 0000000..71e4062
--- /dev/null
+++ b/src/tiff/tif_zip.c
@@ -0,0 +1,368 @@
+/* $Header: /home/terralib/src/tiff/tif_zip.c,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1995-1997 Sam Leffler
+ * Copyright (c) 1995-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#include "tiffiop.h"
+#ifdef ZIP_SUPPORT
+/*
+ * TIFF Library.
+ *
+ * ZIP (aka Deflate) Compression Support
+ *
+ * This file is simply an interface to the zlib library written by
+ * Jean-loup Gailly and Mark Adler.  You must use version 1.0 or later
+ * of the library: this code assumes the 1.0 API and also depends on
+ * the ability to write the zlib header multiple times (one per strip)
+ * which was not possible with versions prior to 0.95.  Note also that
+ * older versions of this codec avoided this bug by supressing the header
+ * entirely.  This means that files written with the old library cannot
+ * be read; they should be converted to a different compression scheme
+ * and then reconverted.
+ *
+ * The data format used by the zlib library is described in the files
+ * zlib-3.1.doc, deflate-1.1.doc and gzip-4.1.doc, available in the
+ * directory ftp://ftp.uu.net/pub/archiving/zip/doc.  The library was
+ * last found at ftp://ftp.uu.net/pub/archiving/zip/zlib/zlib-0.99.tar.gz.
+ */
+#include "tif_predict.h"
+#include "zlib.h"
+
+#include <stdio.h>
+#include <assert.h>
+
+/*
+ * Sigh, ZLIB_VERSION is defined as a string so there's no
+ * way to do a proper check here.  Instead we guess based
+ * on the presence of #defines that were added between the
+ * 0.95 and 1.0 distributions.
+ */
+#if !defined(Z_NO_COMPRESSION) || !defined(Z_DEFLATED)
+#error "Antiquated ZLIB software; you must use version 1.0 or later"
+#endif
+
+/*
+ * State block for each open TIFF
+ * file using ZIP compression/decompression.
+ */
+typedef	struct {
+	TIFFPredictorState predict;
+	z_stream	stream;
+	int		zipquality;		/* compression level */
+	int		state;			/* state flags */
+#define	ZSTATE_INIT	0x1		/* zlib setup successfully */
+
+	TIFFVGetMethod	vgetparent;		/* super-class method */
+	TIFFVSetMethod	vsetparent;		/* super-class method */
+} ZIPState;
+
+#define	ZState(tif)		((ZIPState*) (tif)->tif_data)
+#define	DecoderState(tif)	ZState(tif)
+#define	EncoderState(tif)	ZState(tif)
+
+static	int ZIPEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+static	int ZIPDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+
+static int
+ZIPSetupDecode(TIFF* tif)
+{
+	ZIPState* sp = DecoderState(tif);
+	static const char module[] = "ZIPSetupDecode";
+
+	assert(sp != NULL);
+	if (inflateInit(&sp->stream) != Z_OK) {
+		TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+		return (0);
+	} else {
+		sp->state |= ZSTATE_INIT;
+		return (1);
+	}
+}
+
+/*
+ * Setup state for decoding a strip.
+ */
+static int
+ZIPPreDecode(TIFF* tif, tsample_t s)
+{
+	ZIPState* sp = DecoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	sp->stream.next_in = tif->tif_rawdata;
+	sp->stream.avail_in = tif->tif_rawcc;
+	return (inflateReset(&sp->stream) == Z_OK);
+}
+
+static int
+ZIPDecode(TIFF* tif, tidata_t op, tsize_t occ, tsample_t s)
+{
+	ZIPState* sp = DecoderState(tif);
+	static const char module[] = "ZIPDecode";
+
+	(void) s;
+	assert(sp != NULL);
+	sp->stream.next_out = op;
+	sp->stream.avail_out = occ;
+	do {
+		int state = inflate(&sp->stream, Z_PARTIAL_FLUSH);
+		if (state == Z_STREAM_END)
+			break;
+		if (state == Z_DATA_ERROR) {
+			TIFFError(module,
+			    "%s: Decoding error at scanline %d, %s",
+			    tif->tif_name, tif->tif_row, sp->stream.msg);
+			if (inflateSync(&sp->stream) != Z_OK)
+				return (0);
+			continue;
+		}
+		if (state != Z_OK) {
+			TIFFError(module, "%s: zlib error: %s",
+			    tif->tif_name, sp->stream.msg);
+			return (0);
+		}
+	} while (sp->stream.avail_out > 0);
+	if (sp->stream.avail_out != 0) {
+		TIFFError(module,
+		    "%s: Not enough data at scanline %d (short %d bytes)",
+		    tif->tif_name, tif->tif_row, sp->stream.avail_out);
+		return (0);
+	}
+	return (1);
+}
+
+static int
+ZIPSetupEncode(TIFF* tif)
+{
+	ZIPState* sp = EncoderState(tif);
+	static const char module[] = "ZIPSetupEncode";
+
+	assert(sp != NULL);
+	if (deflateInit(&sp->stream, sp->zipquality) != Z_OK) {
+		TIFFError(module, "%s: %s", tif->tif_name, sp->stream.msg);
+		return (0);
+	} else {
+		sp->state |= ZSTATE_INIT;
+		return (1);
+	}
+}
+
+/*
+ * Reset encoding state at the start of a strip.
+ */
+static int
+ZIPPreEncode(TIFF* tif, tsample_t s)
+{
+	ZIPState *sp = EncoderState(tif);
+
+	(void) s;
+	assert(sp != NULL);
+	sp->stream.next_out = tif->tif_rawdata;
+	sp->stream.avail_out = tif->tif_rawdatasize;
+	return (deflateReset(&sp->stream) == Z_OK);
+}
+
+/*
+ * Encode a chunk of pixels.
+ */
+static int
+ZIPEncode(TIFF* tif, tidata_t bp, tsize_t cc, tsample_t s)
+{
+	ZIPState *sp = EncoderState(tif);
+	static const char module[] = "ZIPEncode";
+
+	(void) s;
+	sp->stream.next_in = bp;
+	sp->stream.avail_in = cc;
+	do {
+		if (deflate(&sp->stream, Z_NO_FLUSH) != Z_OK) {
+			TIFFError(module, "%s: Encoder error: %s",
+			    tif->tif_name, sp->stream.msg);
+			return (0);
+		}
+		if (sp->stream.avail_out == 0) {
+			tif->tif_rawcc = tif->tif_rawdatasize;
+			TIFFFlushData1(tif);
+			sp->stream.next_out = tif->tif_rawdata;
+			sp->stream.avail_out = tif->tif_rawdatasize;
+		}
+	} while (sp->stream.avail_in > 0);
+	return (1);
+}
+
+/*
+ * Finish off an encoded strip by flushing the last
+ * string and tacking on an End Of Information code.
+ */
+static int
+ZIPPostEncode(TIFF* tif)
+{
+	ZIPState *sp = EncoderState(tif);
+	static const char module[] = "ZIPPostEncode";
+	int state;
+
+	sp->stream.avail_in = 0;
+	do {
+		state = deflate(&sp->stream, Z_FINISH);
+		switch (state) {
+		case Z_STREAM_END:
+		case Z_OK:
+		    if ((int)sp->stream.avail_out != (int)tif->tif_rawdatasize)
+                    {
+			    tif->tif_rawcc =
+				tif->tif_rawdatasize - sp->stream.avail_out;
+			    TIFFFlushData1(tif);
+			    sp->stream.next_out = tif->tif_rawdata;
+			    sp->stream.avail_out = tif->tif_rawdatasize;
+		    }
+		    break;
+		default:
+		    TIFFError(module, "%s: zlib error: %s",
+			tif->tif_name, sp->stream.msg);
+		    return (0);
+		}
+	} while (state != Z_STREAM_END);
+	return (1);
+}
+
+static void
+ZIPCleanup(TIFF* tif)
+{
+	ZIPState* sp = ZState(tif);
+	if (sp) {
+		if (sp->state&ZSTATE_INIT) {
+			/* NB: avoid problems in the library */
+			if (tif->tif_mode == O_RDONLY)
+				inflateEnd(&sp->stream);
+			else
+				deflateEnd(&sp->stream);
+		}
+		_TIFFfree(sp);
+		tif->tif_data = NULL;
+	}
+}
+
+static int
+ZIPVSetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	ZIPState* sp = ZState(tif);
+	static const char module[] = "ZIPVSetField";
+
+	switch (tag) {
+	case TIFFTAG_ZIPQUALITY:
+		sp->zipquality = va_arg(ap, int);
+		if (tif->tif_mode != O_RDONLY && (sp->state&ZSTATE_INIT)) {
+			if (deflateParams(&sp->stream,
+			    sp->zipquality, Z_DEFAULT_STRATEGY) != Z_OK) {
+				TIFFError(module, "%s: zlib error: %s",
+				    tif->tif_name, sp->stream.msg);
+				return (0);
+			}
+		}
+		return (1);
+	default:
+		return (*sp->vsetparent)(tif, tag, ap);
+	}
+	/*NOTREACHED*/
+}
+
+static int
+ZIPVGetField(TIFF* tif, ttag_t tag, va_list ap)
+{
+	ZIPState* sp = ZState(tif);
+
+	switch (tag) {
+	case TIFFTAG_ZIPQUALITY:
+		*va_arg(ap, int*) = sp->zipquality;
+		break;
+	default:
+		return (*sp->vgetparent)(tif, tag, ap);
+	}
+	return (1);
+}
+
+static const TIFFFieldInfo zipFieldInfo[] = {
+    { TIFFTAG_ZIPQUALITY,	 0, 0,	TIFF_ANY,	FIELD_PSEUDO,
+      TRUE,	FALSE,	"" },
+};
+#define	N(a)	(sizeof (a) / sizeof (a[0]))
+
+int
+TIFFInitZIP(TIFF* tif, int scheme)
+{
+	ZIPState* sp;
+
+	assert( (scheme == COMPRESSION_DEFLATE) || (scheme == COMPRESSION_ADOBE_DEFLATE));
+
+	/*
+	 * Allocate state block so tag methods have storage to record values.
+	 */
+	tif->tif_data = (tidata_t) _TIFFmalloc(sizeof (ZIPState));
+	if (tif->tif_data == NULL)
+		goto bad;
+	sp = ZState(tif);
+	sp->stream.zalloc = NULL;
+	sp->stream.zfree = NULL;
+	sp->stream.opaque = NULL;
+	sp->stream.data_type = Z_BINARY;
+
+	/*
+	 * Merge codec-specific tag information and
+	 * override parent get/set field methods.
+	 */
+	_TIFFMergeFieldInfo(tif, zipFieldInfo, N(zipFieldInfo));
+	sp->vgetparent = tif->tif_tagmethods.vgetfield;
+	tif->tif_tagmethods.vgetfield = ZIPVGetField;	/* hook for codec tags */
+	sp->vsetparent = tif->tif_tagmethods.vsetfield;
+	tif->tif_tagmethods.vsetfield = ZIPVSetField;	/* hook for codec tags */
+
+	/* Default values for codec-specific fields */
+	sp->zipquality = Z_DEFAULT_COMPRESSION;	/* default comp. level */
+	sp->state = 0;
+
+	/*
+	 * Install codec methods.
+	 */
+	tif->tif_setupdecode = ZIPSetupDecode;
+	tif->tif_predecode = ZIPPreDecode;
+	tif->tif_decoderow = ZIPDecode;
+	tif->tif_decodestrip = ZIPDecode;
+	tif->tif_decodetile = ZIPDecode;
+	tif->tif_setupencode = ZIPSetupEncode;
+	tif->tif_preencode = ZIPPreEncode;
+	tif->tif_postencode = ZIPPostEncode;
+	tif->tif_encoderow = ZIPEncode;
+	tif->tif_encodestrip = ZIPEncode;
+	tif->tif_encodetile = ZIPEncode;
+	tif->tif_cleanup = ZIPCleanup;
+	/*
+	 * Setup predictor setup.
+	 */
+	(void) TIFFPredictorInit(tif);
+	return (1);
+bad:
+	TIFFError("TIFFInitZIP", "No space for ZIP state block");
+	return (0);
+}
+#endif /* ZIP_SUPORT */
diff --git a/src/tiff/tiff.h b/src/tiff/tiff.h
new file mode 100644
index 0000000..312c411
--- /dev/null
+++ b/src/tiff/tiff.h
@@ -0,0 +1,482 @@
+/* $Header: /home/terralib/src/tiff/tiff.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFF_
+#define	_TIFF_
+/*
+ * Tag Image File Format (TIFF)
+ *
+ * Based on Rev 6.0 from:
+ *    Developer's Desk
+ *    Aldus Corporation
+ *    411 First Ave. South
+ *    Suite 200
+ *    Seattle, WA  98104
+ *    206-622-5500
+ */
+#define	TIFF_VERSION	42
+
+#define	TIFF_BIGENDIAN		0x4d4d
+#define	TIFF_LITTLEENDIAN	0x4949
+
+/*
+ * The so called TIFF types conflict with definitions from inttypes.h 
+ * included from sys/types.h on AIX (at least using VisualAge compiler). 
+ * We try to work around this by detecting this case.  Defining 
+ * _TIFF_DATA_TYPEDEFS_ short circuits the later definitions in tiff.h, and
+ * we will in the holes not provided for by inttypes.h. 
+ *
+ * See http://bugzilla.remotesensing.org/show_bug.cgi?id=39
+ */
+#if defined(_H_INTTYPES) && defined(_ALL_SOURCE) && defined(USING_VISUALAGE)
+
+#define _TIFF_DATA_TYPEDEFS_
+typedef unsigned char uint8;
+typedef unsigned short uint16;
+typedef unsigned int uint32;
+
+#endif
+
+/*
+ * Intrinsic data types required by the file format:
+ *
+ * 8-bit quantities	int8/uint8
+ * 16-bit quantities	int16/uint16
+ * 32-bit quantities	int32/uint32
+ * strings		unsigned char*
+ */
+#ifndef _TIFF_DATA_TYPEDEFS_
+#define _TIFF_DATA_TYPEDEFS_
+
+#ifdef __STDC__
+typedef	signed char int8;	/* NB: non-ANSI compilers may not grok */
+#else
+typedef	char int8;
+#endif
+typedef	unsigned char uint8;
+typedef	short int16;
+typedef	unsigned short uint16;	/* sizeof (uint16) must == 2 */
+#if defined(__alpha) || (defined(_MIPS_SZLONG) && _MIPS_SZLONG == 64) || defined(__LP64__) || defined(__arch64__)
+typedef	int int32;
+typedef	unsigned int uint32;	/* sizeof (uint32) must == 4 */
+#else
+typedef	long int32;
+typedef	unsigned long uint32;	/* sizeof (uint32) must == 4 */
+#endif
+#endif /* _TIFF_DATA_TYPEDEFS_ */
+
+/*	For TIFFReassignTagToIgnore */
+enum TIFFIgnoreSense /* IGNORE tag table */
+{
+	TIS_STORE,
+	TIS_EXTRACT,
+	TIS_EMPTY
+};
+
+typedef	struct {
+	uint16	tiff_magic;	/* magic number (defines byte order) */
+	uint16	tiff_version;	/* TIFF version number */
+	uint32	tiff_diroff;	/* byte offset to first directory */
+} TIFFHeader;
+
+/*
+ * TIFF Image File Directories are comprised of
+ * a table of field descriptors of the form shown
+ * below.  The table is sorted in ascending order
+ * by tag.  The values associated with each entry
+ * are disjoint and may appear anywhere in the file
+ * (so long as they are placed on a word boundary).
+ *
+ * If the value is 4 bytes or less, then it is placed
+ * in the offset field to save space.  If the value
+ * is less than 4 bytes, it is left-justified in the
+ * offset field.
+ */
+typedef	struct {
+	uint16		tdir_tag;	/* see below */
+	uint16		tdir_type;	/* data type; see below */
+	uint32		tdir_count;	/* number of items; length in spec */
+	uint32		tdir_offset;	/* byte offset to field data */
+} TIFFDirEntry;
+
+/*
+ * NB: In the comments below,
+ *  - items marked with a + are obsoleted by revision 5.0,
+ *  - items marked with a ! are introduced in revision 6.0.
+ *  - items marked with a % are introduced post revision 6.0.
+ *  - items marked with a $ are obsoleted by revision 6.0.
+ */
+
+/*
+ * Tag data type information.
+ *
+ * Note: RATIONALs are the ratio of two 32-bit integer values.
+ */
+typedef	enum {
+	TIFF_NOTYPE	= 0,	/* placeholder */
+	TIFF_BYTE	= 1,	/* 8-bit unsigned integer */
+	TIFF_ASCII	= 2,	/* 8-bit bytes w/ last byte null */
+	TIFF_SHORT	= 3,	/* 16-bit unsigned integer */
+	TIFF_LONG	= 4,	/* 32-bit unsigned integer */
+	TIFF_RATIONAL	= 5,	/* 64-bit unsigned fraction */
+	TIFF_SBYTE	= 6,	/* !8-bit signed integer */
+	TIFF_UNDEFINED	= 7,	/* !8-bit untyped data */
+	TIFF_SSHORT	= 8,	/* !16-bit signed integer */
+	TIFF_SLONG	= 9,	/* !32-bit signed integer */
+	TIFF_SRATIONAL	= 10,	/* !64-bit signed fraction */
+	TIFF_FLOAT	= 11,	/* !32-bit IEEE floating point */
+	TIFF_DOUBLE	= 12,	/* !64-bit IEEE floating point */
+	TIFF_IFD	= 13	/* %32-bit unsigned integer (offset) */
+} TIFFDataType;
+
+/*
+ * TIFF Tag Definitions.
+ */
+#define	TIFFTAG_SUBFILETYPE		254	/* subfile data descriptor */
+#define	    FILETYPE_REDUCEDIMAGE	0x1	/* reduced resolution version */
+#define	    FILETYPE_PAGE		0x2	/* one page of many */
+#define	    FILETYPE_MASK		0x4	/* transparency mask */
+#define	TIFFTAG_OSUBFILETYPE		255	/* +kind of data in subfile */
+#define	    OFILETYPE_IMAGE		1	/* full resolution image data */
+#define	    OFILETYPE_REDUCEDIMAGE	2	/* reduced size image data */
+#define	    OFILETYPE_PAGE		3	/* one page of many */
+#define	TIFFTAG_IMAGEWIDTH		256	/* image width in pixels */
+#define	TIFFTAG_IMAGELENGTH		257	/* image height in pixels */
+#define	TIFFTAG_BITSPERSAMPLE		258	/* bits per channel (sample) */
+#define	TIFFTAG_COMPRESSION		259	/* data compression technique */
+#define	    COMPRESSION_NONE		1	/* dump mode */
+#define	    COMPRESSION_CCITTRLE	2	/* CCITT modified Huffman RLE */
+#define	    COMPRESSION_CCITTFAX3	3	/* CCITT Group 3 fax encoding */
+#define     COMPRESSION_CCITT_T4        3       /* CCITT T.4 (TIFF 6 name) */
+#define	    COMPRESSION_CCITTFAX4	4	/* CCITT Group 4 fax encoding */
+#define     COMPRESSION_CCITT_T6        4       /* CCITT T.6 (TIFF 6 name) */
+#define	    COMPRESSION_LZW		5       /* Lempel-Ziv  & Welch */
+#define	    COMPRESSION_OJPEG		6	/* !6.0 JPEG */
+#define	    COMPRESSION_JPEG		7	/* %JPEG DCT compression */
+#define	    COMPRESSION_NEXT		32766	/* NeXT 2-bit RLE */
+#define	    COMPRESSION_CCITTRLEW	32771	/* #1 w/ word alignment */
+#define	    COMPRESSION_PACKBITS	32773	/* Macintosh RLE */
+#define	    COMPRESSION_THUNDERSCAN	32809	/* ThunderScan RLE */
+/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly at apago.com) */
+#define	    COMPRESSION_IT8CTPAD	32895   /* IT8 CT w/padding */
+#define	    COMPRESSION_IT8LW		32896   /* IT8 Linework RLE */
+#define	    COMPRESSION_IT8MP		32897   /* IT8 Monochrome picture */
+#define	    COMPRESSION_IT8BL		32898   /* IT8 Binary line art */
+/* compression codes 32908-32911 are reserved for Pixar */
+#define     COMPRESSION_PIXARFILM	32908   /* Pixar companded 10bit LZW */
+#define	    COMPRESSION_PIXARLOG	32909   /* Pixar companded 11bit ZIP */
+#define	    COMPRESSION_DEFLATE		32946	/* Deflate compression */
+#define     COMPRESSION_ADOBE_DEFLATE   8       /* Deflate compression, as recognized by Adobe */
+/* compression code 32947 is reserved for Oceana Matrix <dev at oceana.com> */
+#define     COMPRESSION_DCS             32947   /* Kodak DCS encoding */
+#define	    COMPRESSION_JBIG		34661	/* ISO JBIG */
+#define     COMPRESSION_SGILOG		34676	/* SGI Log Luminance RLE */
+#define     COMPRESSION_SGILOG24	34677	/* SGI Log 24-bit packed */
+#define     COMPRESSION_JP2000          34712   /* Leadtools JPEG2000 */
+#define	TIFFTAG_PHOTOMETRIC		262	/* photometric interpretation */
+#define	    PHOTOMETRIC_MINISWHITE	0	/* min value is white */
+#define	    PHOTOMETRIC_MINISBLACK	1	/* min value is black */
+#define	    PHOTOMETRIC_RGB		2	/* RGB color model */
+#define	    PHOTOMETRIC_PALETTE		3	/* color map indexed */
+#define	    PHOTOMETRIC_MASK		4	/* $holdout mask */
+#define	    PHOTOMETRIC_SEPARATED	5	/* !color separations */
+#define	    PHOTOMETRIC_YCBCR		6	/* !CCIR 601 */
+#define	    PHOTOMETRIC_CIELAB		8	/* !1976 CIE L*a*b* */
+#define	    PHOTOMETRIC_ICCLAB		9	/* ICC L*a*b* [Adobe TIFF Technote 4] */
+#define	    PHOTOMETRIC_ITULAB		10	/* ITU L*a*b* */
+#define     PHOTOMETRIC_LOGL		32844	/* CIE Log2(L) */
+#define     PHOTOMETRIC_LOGLUV		32845	/* CIE Log2(L) (u',v') */
+#define	TIFFTAG_THRESHHOLDING		263	/* +thresholding used on data */
+#define	    THRESHHOLD_BILEVEL		1	/* b&w art scan */
+#define	    THRESHHOLD_HALFTONE		2	/* or dithered scan */
+#define	    THRESHHOLD_ERRORDIFFUSE	3	/* usually floyd-steinberg */
+#define	TIFFTAG_CELLWIDTH		264	/* +dithering matrix width */
+#define	TIFFTAG_CELLLENGTH		265	/* +dithering matrix height */
+#define	TIFFTAG_FILLORDER		266	/* data order within a byte */
+#define	    FILLORDER_MSB2LSB		1	/* most significant -> least */
+#define	    FILLORDER_LSB2MSB		2	/* least significant -> most */
+#define	TIFFTAG_DOCUMENTNAME		269	/* name of doc. image is from */
+#define	TIFFTAG_IMAGEDESCRIPTION	270	/* info about image */
+#define	TIFFTAG_MAKE			271	/* scanner manufacturer name */
+#define	TIFFTAG_MODEL			272	/* scanner model name/number */
+#define	TIFFTAG_STRIPOFFSETS		273	/* offsets to data strips */
+#define	TIFFTAG_ORIENTATION		274	/* +image orientation */
+#define	    ORIENTATION_TOPLEFT		1	/* row 0 top, col 0 lhs */
+#define	    ORIENTATION_TOPRIGHT	2	/* row 0 top, col 0 rhs */
+#define	    ORIENTATION_BOTRIGHT	3	/* row 0 bottom, col 0 rhs */
+#define	    ORIENTATION_BOTLEFT		4	/* row 0 bottom, col 0 lhs */
+#define	    ORIENTATION_LEFTTOP		5	/* row 0 lhs, col 0 top */
+#define	    ORIENTATION_RIGHTTOP	6	/* row 0 rhs, col 0 top */
+#define	    ORIENTATION_RIGHTBOT	7	/* row 0 rhs, col 0 bottom */
+#define	    ORIENTATION_LEFTBOT		8	/* row 0 lhs, col 0 bottom */
+#define	TIFFTAG_SAMPLESPERPIXEL		277	/* samples per pixel */
+#define	TIFFTAG_ROWSPERSTRIP		278	/* rows per strip of data */
+#define	TIFFTAG_STRIPBYTECOUNTS		279	/* bytes counts for strips */
+#define	TIFFTAG_MINSAMPLEVALUE		280	/* +minimum sample value */
+#define	TIFFTAG_MAXSAMPLEVALUE		281	/* +maximum sample value */
+#define	TIFFTAG_XRESOLUTION		282	/* pixels/resolution in x */
+#define	TIFFTAG_YRESOLUTION		283	/* pixels/resolution in y */
+#define	TIFFTAG_PLANARCONFIG		284	/* storage organization */
+#define	    PLANARCONFIG_CONTIG		1	/* single image plane */
+#define	    PLANARCONFIG_SEPARATE	2	/* separate planes of data */
+#define	TIFFTAG_PAGENAME		285	/* page name image is from */
+#define	TIFFTAG_XPOSITION		286	/* x page offset of image lhs */
+#define	TIFFTAG_YPOSITION		287	/* y page offset of image lhs */
+#define	TIFFTAG_FREEOFFSETS		288	/* +byte offset to free block */
+#define	TIFFTAG_FREEBYTECOUNTS		289	/* +sizes of free blocks */
+#define	TIFFTAG_GRAYRESPONSEUNIT	290	/* $gray scale curve accuracy */
+#define	    GRAYRESPONSEUNIT_10S	1	/* tenths of a unit */
+#define	    GRAYRESPONSEUNIT_100S	2	/* hundredths of a unit */
+#define	    GRAYRESPONSEUNIT_1000S	3	/* thousandths of a unit */
+#define	    GRAYRESPONSEUNIT_10000S	4	/* ten-thousandths of a unit */
+#define	    GRAYRESPONSEUNIT_100000S	5	/* hundred-thousandths */
+#define	TIFFTAG_GRAYRESPONSECURVE	291	/* $gray scale response curve */
+#define	TIFFTAG_GROUP3OPTIONS		292	/* 32 flag bits */
+#define	TIFFTAG_T4OPTIONS		292	/* TIFF 6.0 proper name alias */
+#define	    GROUP3OPT_2DENCODING	0x1	/* 2-dimensional coding */
+#define	    GROUP3OPT_UNCOMPRESSED	0x2	/* data not compressed */
+#define	    GROUP3OPT_FILLBITS		0x4	/* fill to byte boundary */
+#define	TIFFTAG_GROUP4OPTIONS		293	/* 32 flag bits */
+#define TIFFTAG_T6OPTIONS               293     /* TIFF 6.0 proper name */
+#define	    GROUP4OPT_UNCOMPRESSED	0x2	/* data not compressed */
+#define	TIFFTAG_RESOLUTIONUNIT		296	/* units of resolutions */
+#define	    RESUNIT_NONE		1	/* no meaningful units */
+#define	    RESUNIT_INCH		2	/* english */
+#define	    RESUNIT_CENTIMETER		3	/* metric */
+#define	TIFFTAG_PAGENUMBER		297	/* page numbers of multi-page */
+#define	TIFFTAG_COLORRESPONSEUNIT	300	/* $color curve accuracy */
+#define	    COLORRESPONSEUNIT_10S	1	/* tenths of a unit */
+#define	    COLORRESPONSEUNIT_100S	2	/* hundredths of a unit */
+#define	    COLORRESPONSEUNIT_1000S	3	/* thousandths of a unit */
+#define	    COLORRESPONSEUNIT_10000S	4	/* ten-thousandths of a unit */
+#define	    COLORRESPONSEUNIT_100000S	5	/* hundred-thousandths */
+#define	TIFFTAG_TRANSFERFUNCTION	301	/* !colorimetry info */
+#define	TIFFTAG_SOFTWARE		305	/* name & release */
+#define	TIFFTAG_DATETIME		306	/* creation date and time */
+#define	TIFFTAG_ARTIST			315	/* creator of image */
+#define	TIFFTAG_HOSTCOMPUTER		316	/* machine where created */
+#define	TIFFTAG_PREDICTOR		317	/* prediction scheme w/ LZW */
+#define	TIFFTAG_WHITEPOINT		318	/* image white point */
+#define	TIFFTAG_PRIMARYCHROMATICITIES	319	/* !primary chromaticities */
+#define	TIFFTAG_COLORMAP		320	/* RGB map for pallette image */
+#define	TIFFTAG_HALFTONEHINTS		321	/* !highlight+shadow info */
+#define	TIFFTAG_TILEWIDTH		322	/* !rows/data tile */
+#define	TIFFTAG_TILELENGTH		323	/* !cols/data tile */
+#define TIFFTAG_TILEOFFSETS		324	/* !offsets to data tiles */
+#define TIFFTAG_TILEBYTECOUNTS		325	/* !byte counts for tiles */
+#define	TIFFTAG_BADFAXLINES		326	/* lines w/ wrong pixel count */
+#define	TIFFTAG_CLEANFAXDATA		327	/* regenerated line info */
+#define	    CLEANFAXDATA_CLEAN		0	/* no errors detected */
+#define	    CLEANFAXDATA_REGENERATED	1	/* receiver regenerated lines */
+#define	    CLEANFAXDATA_UNCLEAN	2	/* uncorrected errors exist */
+#define	TIFFTAG_CONSECUTIVEBADFAXLINES	328	/* max consecutive bad lines */
+#define	TIFFTAG_SUBIFD			330	/* subimage descriptors */
+#define	TIFFTAG_INKSET			332	/* !inks in separated image */
+#define	    INKSET_CMYK			1	/* !cyan-magenta-yellow-black color */
+#define	    INKSET_MULTIINK		2	/* !multi-ink or hi-fi color */
+#define	TIFFTAG_INKNAMES		333	/* !ascii names of inks */
+#define	TIFFTAG_NUMBEROFINKS		334	/* !number of inks */
+#define	TIFFTAG_DOTRANGE		336	/* !0% and 100% dot codes */
+#define	TIFFTAG_TARGETPRINTER		337	/* !separation target */
+#define	TIFFTAG_EXTRASAMPLES		338	/* !info about extra samples */
+#define	    EXTRASAMPLE_UNSPECIFIED	0	/* !unspecified data */
+#define	    EXTRASAMPLE_ASSOCALPHA	1	/* !associated alpha data */
+#define	    EXTRASAMPLE_UNASSALPHA	2	/* !unassociated alpha data */
+#define	TIFFTAG_SAMPLEFORMAT		339	/* !data sample format */
+#define	    SAMPLEFORMAT_UINT		1	/* !unsigned integer data */
+#define	    SAMPLEFORMAT_INT		2	/* !signed integer data */
+#define	    SAMPLEFORMAT_IEEEFP		3	/* !IEEE floating point data */
+#define	    SAMPLEFORMAT_VOID		4	/* !untyped data */
+#define	    SAMPLEFORMAT_COMPLEXINT	5	/* !complex signed int */
+#define	    SAMPLEFORMAT_COMPLEXIEEEFP	6	/* !complex ieee floating */
+#define	TIFFTAG_SMINSAMPLEVALUE		340	/* !variable MinSampleValue */
+#define	TIFFTAG_SMAXSAMPLEVALUE		341	/* !variable MaxSampleValue */
+#define	TIFFTAG_CLIPPATH		343	/* %ClipPath [Adobe TIFF technote 2] */
+#define	TIFFTAG_XCLIPPATHUNITS	344	/* %XClipPathUnits [Adobe TIFF technote 2] */
+#define	TIFFTAG_YCLIPPATHUNITS	344	/* %YClipPathUnits [Adobe TIFF technote 2] */
+#define	TIFFTAG_INDEXED			345	/* %Indexed [Adobe TIFF Technote 3] */
+#define	TIFFTAG_JPEGTABLES		347	/* %JPEG table stream */
+#define	TIFFTAG_OPIPROXY		351	/* %OPI Proxy [Adobe TIFF technote] */
+/*
+ * Tags 512-521 are obsoleted by Technical Note #2
+ * which specifies a revised JPEG-in-TIFF scheme.
+ */
+#define	TIFFTAG_JPEGPROC		512	/* !JPEG processing algorithm */
+#define	    JPEGPROC_BASELINE		1	/* !baseline sequential */
+#define	    JPEGPROC_LOSSLESS		14	/* !Huffman coded lossless */
+#define	TIFFTAG_JPEGIFOFFSET		513	/* !pointer to SOI marker */
+#define	TIFFTAG_JPEGIFBYTECOUNT		514	/* !JFIF stream length */
+#define	TIFFTAG_JPEGRESTARTINTERVAL	515	/* !restart interval length */
+#define	TIFFTAG_JPEGLOSSLESSPREDICTORS	517	/* !lossless proc predictor */
+#define	TIFFTAG_JPEGPOINTTRANSFORM	518	/* !lossless point transform */
+#define	TIFFTAG_JPEGQTABLES		519	/* !Q matrice offsets */
+#define	TIFFTAG_JPEGDCTABLES		520	/* !DCT table offsets */
+#define	TIFFTAG_JPEGACTABLES		521	/* !AC coefficient offsets */
+#define	TIFFTAG_YCBCRCOEFFICIENTS	529	/* !RGB -> YCbCr transform */
+#define	TIFFTAG_YCBCRSUBSAMPLING	530	/* !YCbCr subsampling factors */
+#define	TIFFTAG_YCBCRPOSITIONING	531	/* !subsample positioning */
+#define	    YCBCRPOSITION_CENTERED	1	/* !as in PostScript Level 2 */
+#define	    YCBCRPOSITION_COSITED	2	/* !as in CCIR 601-1 */
+#define	TIFFTAG_REFERENCEBLACKWHITE	532	/* !colorimetry info */
+#define	TIFFTAG_XMLPACKET		700		/* %XML packet [Adobe XMP technote 9-14-02] (dkelly at apago.com) */
+#define TIFFTAG_OPIIMAGEID		32781	/* %OPI ImageID [Adobe TIFF technote] */
+/* tags 32952-32956 are private tags registered to Island Graphics */
+#define TIFFTAG_REFPTS			32953	/* image reference points */
+#define TIFFTAG_REGIONTACKPOINT		32954	/* region-xform tack point */
+#define TIFFTAG_REGIONWARPCORNERS	32955	/* warp quadrilateral */
+#define TIFFTAG_REGIONAFFINE		32956	/* affine transformation mat */
+/* tags 32995-32999 are private tags registered to SGI */
+#define	TIFFTAG_MATTEING		32995	/* $use ExtraSamples */
+#define	TIFFTAG_DATATYPE		32996	/* $use SampleFormat */
+#define	TIFFTAG_IMAGEDEPTH		32997	/* z depth of image */
+#define	TIFFTAG_TILEDEPTH		32998	/* z depth/data tile */
+/* tags 33300-33309 are private tags registered to Pixar */
+/*
+ * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH
+ * are set when an image has been cropped out of a larger image.  
+ * They reflect the size of the original uncropped image.
+ * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used
+ * to determine the position of the smaller image in the larger one.
+ */
+#define TIFFTAG_PIXAR_IMAGEFULLWIDTH    33300   /* full image size in x */
+#define TIFFTAG_PIXAR_IMAGEFULLLENGTH   33301   /* full image size in y */
+ /* Tags 33302-33306 are used to identify special image modes and data
+  * used by Pixar's texture formats.
+  */
+#define TIFFTAG_PIXAR_TEXTUREFORMAT	33302	/* texture map format */
+#define TIFFTAG_PIXAR_WRAPMODES		33303	/* s & t wrap modes */
+#define TIFFTAG_PIXAR_FOVCOT		33304	/* cotan(fov) for env. maps */
+#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305
+#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306
+/* tag 33405 is a private tag registered to Eastman Kodak */
+#define TIFFTAG_WRITERSERIALNUMBER      33405   /* device serial number */
+/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */
+#define	TIFFTAG_COPYRIGHT		33432	/* copyright string */
+/* IPTC TAG from RichTIFF specifications */
+#define TIFFTAG_RICHTIFFIPTC    33723
+/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly at apago.com) */
+#define TIFFTAG_IT8SITE			34016	/* site name */
+#define TIFFTAG_IT8COLORSEQUENCE	34017	/* color seq. [RGB,CMYK,etc] */
+#define TIFFTAG_IT8HEADER		34018	/* DDES Header */
+#define TIFFTAG_IT8RASTERPADDING	34019	/* raster scanline padding */
+#define TIFFTAG_IT8BITSPERRUNLENGTH	34020	/* # of bits in short run */
+#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */
+#define TIFFTAG_IT8COLORTABLE		34022	/* LW colortable */
+#define TIFFTAG_IT8IMAGECOLORINDICATOR	34023	/* BP/BL image color switch */
+#define TIFFTAG_IT8BKGCOLORINDICATOR	34024	/* BP/BL bg color switch */
+#define TIFFTAG_IT8IMAGECOLORVALUE	34025	/* BP/BL image color value */
+#define TIFFTAG_IT8BKGCOLORVALUE	34026	/* BP/BL bg color value */
+#define TIFFTAG_IT8PIXELINTENSITYRANGE	34027	/* MP pixel intensity value */
+#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028	/* HC transparency switch */
+#define TIFFTAG_IT8COLORCHARACTERIZATION 34029	/* color character. table */
+#define TIFFTAG_IT8HCUSAGE			34030	/* HC usage indicator */
+#define TIFFTAG_IT8TRAPINDICATOR	34031	/* Trapping indicator (untrapped=0, trapped=1) */
+#define TIFFTAG_IT8CMYKEQUIVALENT	34032	/* CMYK color equivalents */
+/* tags 34232-34236 are private tags registered to Texas Instruments */
+#define TIFFTAG_FRAMECOUNT              34232   /* Sequence Frame Count */
+/* tag 34750 is a private tag registered to Adobe? */
+#define TIFFTAG_ICCPROFILE		34675	/* ICC profile data */
+/* tag 34377 is private tag registered to Adobe for PhotoShop */
+#define TIFFTAG_PHOTOSHOP				34377 
+/* tag 34750 is a private tag registered to Pixel Magic */
+#define	TIFFTAG_JBIGOPTIONS		34750	/* JBIG options */
+/* tags 34908-34914 are private tags registered to SGI */
+#define	TIFFTAG_FAXRECVPARAMS		34908	/* encoded Class 2 ses. parms */
+#define	TIFFTAG_FAXSUBADDRESS		34909	/* received SubAddr string */
+#define	TIFFTAG_FAXRECVTIME		34910	/* receive time (secs) */
+/* tags 37439-37443 are registered to SGI <gregl at sgi.com> */
+#define TIFFTAG_STONITS			37439	/* Sample value to Nits */
+/* tag 34929 is a private tag registered to FedEx */
+#define	TIFFTAG_FEDEX_EDR		34929	/* unknown use */
+/* tag 65535 is an undefined tag used by Eastman Kodak */
+#define TIFFTAG_DCSHUESHIFTVALUES       65535   /* hue shift correction data */
+
+/*
+ * The following are ``pseudo tags'' that can be
+ * used to control codec-specific functionality.
+ * These tags are not written to file.  Note that
+ * these values start at 0xffff+1 so that they'll
+ * never collide with Aldus-assigned tags.
+ *
+ * If you want your private pseudo tags ``registered''
+ * (i.e. added to this file), send mail to sam at sgi.com
+ * with the appropriate C definitions to add.
+ */
+#define	TIFFTAG_FAXMODE			65536	/* Group 3/4 format control */
+#define	    FAXMODE_CLASSIC	0x0000		/* default, include RTC */
+#define	    FAXMODE_NORTC	0x0001		/* no RTC at end of data */
+#define	    FAXMODE_NOEOL	0x0002		/* no EOL code at end of row */
+#define	    FAXMODE_BYTEALIGN	0x0004		/* byte align row */
+#define	    FAXMODE_WORDALIGN	0x0008		/* word align row */
+#define	    FAXMODE_CLASSF	FAXMODE_NORTC	/* TIFF Class F */
+#define	TIFFTAG_JPEGQUALITY		65537	/* Compression quality level */
+/* Note: quality level is on the IJG 0-100 scale.  Default value is 75 */
+#define	TIFFTAG_JPEGCOLORMODE		65538	/* Auto RGB<=>YCbCr convert? */
+#define	    JPEGCOLORMODE_RAW	0x0000		/* no conversion (default) */
+#define	    JPEGCOLORMODE_RGB	0x0001		/* do auto conversion */
+#define	TIFFTAG_JPEGTABLESMODE		65539	/* What to put in JPEGTables */
+#define	    JPEGTABLESMODE_QUANT 0x0001		/* include quantization tbls */
+#define	    JPEGTABLESMODE_HUFF	0x0002		/* include Huffman tbls */
+/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */
+#define	TIFFTAG_FAXFILLFUNC		65540	/* G3/G4 fill function */
+#define	TIFFTAG_PIXARLOGDATAFMT		65549	/* PixarLogCodec I/O data sz */
+#define	    PIXARLOGDATAFMT_8BIT	0	/* regular u_char samples */
+#define	    PIXARLOGDATAFMT_8BITABGR	1	/* ABGR-order u_chars */
+#define	    PIXARLOGDATAFMT_11BITLOG	2	/* 11-bit log-encoded (raw) */
+#define	    PIXARLOGDATAFMT_12BITPICIO	3	/* as per PICIO (1.0==2048) */
+#define	    PIXARLOGDATAFMT_16BIT	4	/* signed short samples */
+#define	    PIXARLOGDATAFMT_FLOAT	5	/* IEEE float samples */
+/* 65550-65556 are allocated to Oceana Matrix <dev at oceana.com> */
+#define TIFFTAG_DCSIMAGERTYPE           65550   /* imager model & filter */
+#define     DCSIMAGERMODEL_M3           0       /* M3 chip (1280 x 1024) */
+#define     DCSIMAGERMODEL_M5           1       /* M5 chip (1536 x 1024) */
+#define     DCSIMAGERMODEL_M6           2       /* M6 chip (3072 x 2048) */
+#define     DCSIMAGERFILTER_IR          0       /* infrared filter */
+#define     DCSIMAGERFILTER_MONO        1       /* monochrome filter */
+#define     DCSIMAGERFILTER_CFA         2       /* color filter array */
+#define     DCSIMAGERFILTER_OTHER       3       /* other filter */
+#define TIFFTAG_DCSINTERPMODE           65551   /* interpolation mode */
+#define     DCSINTERPMODE_NORMAL        0x0     /* whole image, default */
+#define     DCSINTERPMODE_PREVIEW       0x1     /* preview of image (384x256) */
+#define TIFFTAG_DCSBALANCEARRAY         65552   /* color balance values */
+#define TIFFTAG_DCSCORRECTMATRIX        65553   /* color correction values */
+#define TIFFTAG_DCSGAMMA                65554   /* gamma value */
+#define TIFFTAG_DCSTOESHOULDERPTS       65555   /* toe & shoulder points */
+#define TIFFTAG_DCSCALIBRATIONFD        65556   /* calibration file desc */
+/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */
+#define	TIFFTAG_ZIPQUALITY		65557	/* compression quality level */
+#define	TIFFTAG_PIXARLOGQUALITY		65558	/* PixarLog uses same scale */
+/* 65559 is allocated to Oceana Matrix <dev at oceana.com> */
+#define TIFFTAG_DCSCLIPRECTANGLE	65559	/* area of image to acquire */
+#define TIFFTAG_SGILOGDATAFMT		65560	/* SGILog user data format */
+#define     SGILOGDATAFMT_FLOAT		0	/* IEEE float samples */
+#define     SGILOGDATAFMT_16BIT		1	/* 16-bit samples */
+#define     SGILOGDATAFMT_RAW		2	/* uninterpreted data */
+#define     SGILOGDATAFMT_8BIT		3	/* 8-bit RGB monitor values */
+#define TIFFTAG_SGILOGENCODE		65561 /* SGILog data encoding control*/
+#define     SGILOGENCODE_NODITHER	0     /* do not dither encoded values*/
+#define     SGILOGENCODE_RANDITHER	1     /* randomly dither encd values */
+#endif /* _TIFF_ */
diff --git a/src/tiff/tiffcomp.h b/src/tiff/tiffcomp.h
new file mode 100644
index 0000000..a8f80e8
--- /dev/null
+++ b/src/tiff/tiffcomp.h
@@ -0,0 +1,220 @@
+/* $Header: /home/terralib/src/tiff/tiffcomp.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1990-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _COMPAT_
+#define	_COMPAT_
+/*
+ * This file contains a hodgepodge of definitions and
+ * declarations that are needed to provide compatibility
+ * between the native system and the base implementation
+ * that the library assumes.
+ *
+ * NB: This file is a mess.
+ */
+
+/*
+ * Setup basic type definitions and function declaratations.
+ */
+
+/*
+ * Simplify Acorn RISC OS identifier (to avoid confusion with Acorn RISC iX
+ * and with defunct Unix Risc OS)
+ * No need to specify __arm - hey, Acorn might port the OS, no problem here!
+ */
+#ifdef __acornriscos
+#undef __acornriscos
+#endif
+#if defined(__acorn) && defined(__riscos)
+#define __acornriscos
+#endif
+
+#if defined(__MWERKS__) || defined(THINK_C)
+#include <unix.h>
+#include <math.h>
+#endif
+
+#include <stdio.h>
+
+#if defined(__PPCC__) || defined(__SC__) || defined(__MRC__)
+#include <types.h>
+#elif !defined(__MWERKS__) && !defined(THINK_C) && !defined(__acornriscos) && !defined(applec)
+#include <sys/types.h>
+#endif
+
+#if defined(VMS)
+#include <file.h>
+#include <unixio.h>
+#elif !defined(__acornriscos)
+#include <fcntl.h>
+#endif
+
+/*
+ * This maze of checks controls defines or not the
+ * target system has BSD-style typdedefs declared in
+ * an include file and/or whether or not to include
+ * <unistd.h> to get the SEEK_* definitions.  Some
+ * additional includes are also done to pull in the
+ * appropriate definitions we're looking for.
+ */
+#if defined(__MWERKS__) || defined(THINK_C) || defined(__PPCC__) || defined(__SC__) || defined(__MRC__)
+#include <stdlib.h>
+#define	BSDTYPES
+#define	HAVE_UNISTD_H	0
+#elif (defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) || defined(_WIN32)) && !defined(unix)
+#define	BSDTYPES
+#elif defined(OS2_16) || defined(OS2_32)
+#define	BSDTYPES
+#elif defined(__acornriscos)
+#include <stdlib.h>
+#define	BSDTYPES
+#define	HAVE_UNISTD_H	0
+#elif defined(VMS)
+#define	HAVE_UNISTD_H	0
+#else
+#define	HAVE_UNISTD_H	1
+#endif
+
+/*
+ * The library uses the ANSI C/POSIX SEEK_*
+ * definitions that should be defined in unistd.h
+ * (except on system where they are in stdio.h and
+ * there is no unistd.h).
+ */
+#if !defined(SEEK_SET) && HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/*
+ * The library uses memset, memcpy, and memcmp.
+ * ANSI C and System V define these in string.h.
+ */
+#include <string.h>
+
+/*
+ * The BSD typedefs are used throughout the library.
+ * If your system doesn't have them in <sys/types.h>,
+ * then define BSDTYPES in your Makefile.
+ */
+#if defined(BSDTYPES)
+# ifndef _BSDTYPES_DEFINED
+#  ifndef __u_char_defined
+typedef	unsigned char u_char;
+typedef	unsigned short u_short;
+typedef	unsigned int u_int;
+typedef	unsigned long u_long;
+#   define __u_char_defined
+#  endif /* __u_char_defined */
+#  define _BSDTYPES_DEFINED
+# endif /* _BSDTYPES_DEFINED */
+#endif /* BSDTYPES */
+
+/*
+ * dblparam_t is the type that a double precision
+ * floating point value will have on the parameter
+ * stack (when coerced by the compiler).
+ */
+/* Note: on MacPowerPC "extended" is undefined. So only use it for 68K-Macs */
+#if defined(__SC__) || defined(THINK_C)
+typedef extended dblparam_t;
+#else
+typedef double dblparam_t;
+#endif
+
+/*
+ * If your compiler supports inline functions, then
+ * set INLINE appropriately to get the known hotspots
+ * in the library expanded inline.
+ */
+#if defined(__GNUC__)
+#if defined(__STRICT_ANSI__)
+#define	INLINE	__inline__
+#else
+#define	INLINE	inline
+#endif
+#else /* !__GNUC__ */
+#define	INLINE
+#endif
+
+/*
+ * GLOBALDATA is a macro that is used to define global variables
+ * private to the library.  We use this indirection to hide
+ * brain-damage in VAXC (and GCC) under VAX/VMS.  In these
+ * environments the macro places the variable in a non-shareable
+ * program section, which ought to be done by default (sigh!)
+ *
+ * Apparently DEC are aware of the problem as this behaviour is the
+ * default under VMS on AXP.
+ *
+ * The GNU C variant is untested.
+ */
+#if defined(VAX) && defined(VMS)
+#if defined(VAXC)
+#define GLOBALDATA(TYPE,NAME)	extern noshare TYPE NAME
+#endif
+#if defined(__GNUC__)
+#define GLOBALDATA(TYPE,NAME)	extern TYPE NAME \
+	asm("_$$PsectAttributes_NOSHR$$" #NAME)
+#endif
+#else	/* !VAX/VMS */
+#define GLOBALDATA(TYPE,NAME)	extern TYPE NAME
+#endif
+
+#if defined(__acornriscos)
+/*
+ * osfcn.h is part of C++Lib on Acorn C/C++, and as such can't be used
+ * on C alone. For that reason, the relevant functions are
+ * implemented in tif_acorn.c, and the elements from the header
+ * file are included here.
+ */
+#if defined(__cplusplus)
+#include <osfcn.h>
+#else
+#define	O_RDONLY	0
+#define	O_WRONLY	1
+#define	O_RDWR		2
+#define	O_APPEND	8
+#define	O_CREAT		0x200
+#define	O_TRUNC		0x400
+typedef long off_t;
+extern int open(const char *name, int flags, int mode);
+extern int close(int fd);
+extern int write(int fd, const char *buf, int nbytes);
+extern int read(int fd, char *buf, int nbytes);
+extern off_t lseek(int fd, off_t offset, int whence);
+extern int creat(const char *path, int mode);
+#endif /* __cplusplus */
+#endif /* __acornriscos */
+
+/* Bit and byte order, the default is MSB to LSB */
+#ifdef VMS
+#undef HOST_FILLORDER
+#undef HOST_BIGENDIAN
+#define HOST_FILLORDER FILLORDER_LSB2MSB
+#define HOST_BIGENDIAN	0
+#endif
+
+
+#endif /* _COMPAT_ */
diff --git a/src/tiff/tiffconf.h b/src/tiff/tiffconf.h
new file mode 100644
index 0000000..b2b3c93
--- /dev/null
+++ b/src/tiff/tiffconf.h
@@ -0,0 +1,153 @@
+/* $Header: /home/terralib/src/tiff/tiffconf.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFCONF_
+#define	_TIFFCONF_
+/*
+ * Library Configuration Definitions.
+ *
+ * This file defines the default configuration for the library.
+ * If the target system does not have make or a way to specify
+ * #defines on the command line, this file can be edited to
+ * configure the library.  Otherwise, one can override portability
+ * and configuration-related definitions from a Makefile or command
+ * line by defining COMPRESSION_SUPPORT (see below).
+ */
+
+/*
+ * General portability-related defines:
+ *
+ * HAVE_IEEEFP		define as 0 or 1 according to the floating point
+ *			format suported by the machine
+ * BSDTYPES		define this if your system does NOT define the
+ *			usual 4BSD typedefs u_int et. al.
+ * HAVE_MMAP		enable support for memory mapping read-only files;
+ *			this is typically deduced by the configure script
+ * HOST_FILLORDER	native cpu bit order: one of FILLORDER_MSB2LSB
+ *			or FILLODER_LSB2MSB; this is typically set by the
+ *			configure script
+ * HOST_BIGENDIAN	native cpu byte order: 1 if big-endian (Motorola)
+ *			or 0 if little-endian (Intel); this may be used
+ *			in codecs to optimize code
+ * USE_64BIT_API	set to 1 if tif_unix.c should use lseek64(),
+ *                      fstat64() and stat64 allowing 2-4GB files.
+ */
+#ifndef HAVE_IEEEFP
+#define	HAVE_IEEEFP	1
+#endif
+#ifndef HOST_FILLORDER
+#define	HOST_FILLORDER	FILLORDER_MSB2LSB
+#endif
+#ifndef	HOST_BIGENDIAN
+#define	HOST_BIGENDIAN	1
+#endif
+
+#ifndef USE_64BIT_API
+#  define USE_64BIT_API	0
+#endif
+
+#ifndef COMPRESSION_SUPPORT
+/*
+ * Compression support defines:
+ *
+ *    CCITT_SUPPORT	enable support for CCITT Group 3 & 4 algorithms
+ *    PACKBITS_SUPPORT	enable support for Macintosh PackBits algorithm
+ *    LZW_SUPPORT	enable support for LZW algorithm
+ *    THUNDER_SUPPORT	enable support for ThunderScan 4-bit RLE algorithm
+ *    NEXT_SUPPORT	enable support for NeXT 2-bit RLE algorithm
+ *    OJPEG_SUPPORT	enable support for 6.0-style JPEG DCT algorithms
+ *			(requires IJG software)
+ *    JPEG_SUPPORT	enable support for post-6.0-style JPEG DCT algorithms
+ *			(requires freely available IJG software, see tif_jpeg.c)
+ *    ZIP_SUPPORT	enable support for Deflate algorithm
+ *			(requires freely available zlib software, see tif_zip.c)
+ *    PIXARLOG_SUPPORT	enable support for Pixar log-format algorithm
+ *    LOGLUV_SUPPORT	enable support for LogLuv high dynamic range encoding
+ */
+#define	CCITT_SUPPORT
+#define	PACKBITS_SUPPORT
+#define	LZW_SUPPORT
+#define	THUNDER_SUPPORT
+#define	NEXT_SUPPORT
+#define LOGLUV_SUPPORT
+#endif /* COMPRESSION_SUPPORT */
+
+/*
+ * If JPEG compression is enabled then we must also include
+ * support for the colorimetry and YCbCr-related tags.
+ */
+#ifdef JPEG_SUPPORT
+#ifndef YCBCR_SUPPORT
+#define	YCBCR_SUPPORT
+#endif
+#ifndef COLORIMETRY_SUPPORT
+#define	COLORIMETRY_SUPPORT
+#endif
+#endif /* JPEG_SUPPORT */
+
+/*
+ * ``Orthogonal Features''
+ *
+ * STRIPCHOP_DEFAULT	default handling of strip chopping support (whether
+ *			or not to convert single-strip uncompressed images
+ *			to mutiple strips of ~8Kb--to reduce memory use)
+ * SUBIFD_SUPPORT	enable support for SubIFD tag (thumbnails and such)
+ * DEFAULT_EXTRASAMPLE_AS_ALPHA
+ *                      The RGBA interface will treat a fourth sample with
+ *                      no EXTRASAMPLE_ value as being ASSOCALPHA.  Many
+ *                      packages produce RGBA files but don't mark the alpha
+ *                      properly.
+ * CHECK_JPEG_YCBCR_SUBSAMPLING
+ *                      Enable picking up YCbCr subsampling info from the
+ *                      JPEG data stream to support files lacking the tag.
+ *                      See Bug 168 in Bugzilla, and JPEGFixupTestSubsampling()
+ *                      for details. 
+ */
+#ifndef STRIPCHOP_DEFAULT
+#define	STRIPCHOP_DEFAULT	TIFF_STRIPCHOP	/* default is to enable */
+#endif
+#ifndef SUBIFD_SUPPORT
+#define	SUBIFD_SUPPORT		1	/* enable SubIFD tag (330) support */
+#endif
+#ifndef DEFAULT_EXTRASAMPLE_AS_ALPHA
+#define DEFAULT_EXTRASAMPLE_AS_ALPHA 1
+#endif
+#ifndef CHECK_JPEG_YCBCR_SUBSAMPLING
+#define CHECK_JPEG_YCBCR_SUBSAMPLING 1
+#endif
+
+/*
+ * Feature support definitions.
+ * XXX: These macros are obsoleted. Don't use them in your apps!
+ * Macros stays here for backward compatibility and should be always defined.
+ */
+#define	COLORIMETRY_SUPPORT
+#define	YCBCR_SUPPORT
+#define	CMYK_SUPPORT
+#define	ICC_SUPPORT
+#define PHOTOSHOP_SUPPORT
+#define IPTC_SUPPORT
+
+#endif /* _TIFFCONF_ */
diff --git a/src/tiff/tiffio.h b/src/tiff/tiffio.h
new file mode 100644
index 0000000..be79679
--- /dev/null
+++ b/src/tiff/tiffio.h
@@ -0,0 +1,479 @@
+/* $Header: /home/terralib/src/tiff/tiffio.h,v 1.4 2004/04/12 13:52:41 juan Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFIO_
+#define	_TIFFIO_
+
+/*
+ * TIFF I/O Library Definitions.
+ */
+#include "tiff.h"
+#include "tiffvers.h"
+
+/*
+ * TIFF is defined as an incomplete type to hide the
+ * library's internal data structures from clients.
+ */
+typedef	struct tiff TIFF;
+
+/*
+ * The following typedefs define the intrinsic size of
+ * data types used in the *exported* interfaces.  These
+ * definitions depend on the proper definition of types
+ * in tiff.h.  Note also that the varargs interface used
+ * to pass tag types and values uses the types defined in
+ * tiff.h directly.
+ *
+ * NB: ttag_t is unsigned int and not unsigned short because
+ *     ANSI C requires that the type before the ellipsis be a
+ *     promoted type (i.e. one of int, unsigned int, pointer,
+ *     or double) and because we defined pseudo-tags that are
+ *     outside the range of legal Aldus-assigned tags.
+ * NB: tsize_t is int32 and not uint32 because some functions
+ *     return -1.
+ * NB: toff_t is not off_t for many reasons; TIFFs max out at
+ *     32-bit file offsets being the most important, and to ensure
+ *     that it is unsigned, rather than signed.
+ */
+typedef	uint32 ttag_t;		/* directory tag */
+typedef	uint16 tdir_t;		/* directory index */
+typedef	uint16 tsample_t;	/* sample number */
+typedef	uint32 tstrip_t;	/* strip number */
+typedef uint32 ttile_t;		/* tile number */
+typedef	int32 tsize_t;		/* i/o size in bytes */
+typedef	void* tdata_t;		/* image data ref */
+typedef	uint32 toff_t;		/* file offset */
+
+#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32))
+#define __WIN32__
+#endif
+
+/*
+ * On windows you should define USE_WIN32_FILEIO if you are using tif_win32.c
+ * or AVOID_WIN32_FILEIO if you are using something else (like tif_unix.c).
+ *
+ * By default tif_win32.c is assumed on windows if not using the cygwin
+ * environment.
+ */
+
+#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows)
+#  if !defined(__CYGWIN) && !defined(AVOID_WIN32_FILEIO) && !defined(USE_WIN32_FILIO)
+#    define USE_WIN32_FILEIO
+#  endif
+#endif
+
+#if defined(USE_WIN32_FILEIO)
+#include <windows.h>
+#ifdef __WIN32__
+DECLARE_HANDLE(thandle_t);	/* Win32 file handle */
+#else
+typedef	HFILE thandle_t;	/* client data handle */
+#endif
+#else
+typedef	void* thandle_t;	/* client data handle */
+#endif
+
+#ifndef NULL
+#define	NULL	0
+#endif
+
+/*
+ * Flags to pass to TIFFPrintDirectory to control
+ * printing of data structures that are potentially
+ * very large.   Bit-or these flags to enable printing
+ * multiple items.
+ */
+#define	TIFFPRINT_NONE		0x0		/* no extra info */
+#define	TIFFPRINT_STRIPS	0x1		/* strips/tiles info */
+#define	TIFFPRINT_CURVES	0x2		/* color/gray response curves */
+#define	TIFFPRINT_COLORMAP	0x4		/* colormap */
+#define	TIFFPRINT_JPEGQTABLES	0x100		/* JPEG Q matrices */
+#define	TIFFPRINT_JPEGACTABLES	0x200		/* JPEG AC tables */
+#define	TIFFPRINT_JPEGDCTABLES	0x200		/* JPEG DC tables */
+
+/* 
+ * Colour conversion stuff
+ */
+
+/* reference white */
+#define D65_X0 (95.0470F)
+#define D65_Y0 (100.0F)
+#define D65_Z0 (108.8827F)
+
+#define D50_X0 (96.4250F)
+#define D50_Y0 (100.0F)
+#define D50_Z0 (82.4680F)
+
+/* Structure for holding information about a display device. */
+
+typedef	unsigned char TIFFRGBValue;		/* 8-bit samples */
+
+typedef struct {
+	float d_mat[3][3]; 		/* XYZ -> luminance matrix */
+	float d_YCR;			/* Light o/p for reference white */
+	float d_YCG;
+	float d_YCB;
+	uint32 d_Vrwr;			/* Pixel values for ref. white */
+	uint32 d_Vrwg;
+	uint32 d_Vrwb;
+	float d_Y0R;			/* Residual light for black pixel */
+	float d_Y0G;
+	float d_Y0B;
+	float d_gammaR;			/* Gamma values for the three guns */
+	float d_gammaG;
+	float d_gammaB;
+} TIFFDisplay;
+
+typedef struct {				/* YCbCr->RGB support */
+	TIFFRGBValue* clamptab;			/* range clamping table */
+	int*	Cr_r_tab;
+	int*	Cb_b_tab;
+	int32*	Cr_g_tab;
+	int32*	Cb_g_tab;
+        int32*  Y_tab;
+} TIFFYCbCrToRGB;
+
+typedef struct {				/* CIE Lab 1976->RGB support */
+	int	range;				/* Size of conversion table */
+#define CIELABTORGB_TABLE_RANGE 1500
+	float	rstep, gstep, bstep;
+	float	X0, Y0, Z0;			/* Reference white point */
+	TIFFDisplay display;
+	float	Yr2r[CIELABTORGB_TABLE_RANGE + 1];  /* Conversion of Yr to r */
+	float	Yg2g[CIELABTORGB_TABLE_RANGE + 1];  /* Conversion of Yg to g */
+	float	Yb2b[CIELABTORGB_TABLE_RANGE + 1];  /* Conversion of Yb to b */
+} TIFFCIELabToRGB;
+
+extern int TIFFCIELabToRGBInit(TIFFCIELabToRGB*, TIFFDisplay *, float*);
+extern void TIFFCIELabToXYZ(TIFFCIELabToRGB *, uint32, int32, int32,
+			    float *, float *, float *);
+extern void TIFFXYZToRGB(TIFFCIELabToRGB *, float, float, float,
+			 uint32 *, uint32 *, uint32 *);
+
+extern int TIFFYCbCrToRGBInit(TIFFYCbCrToRGB*, float*, float*);
+extern void TIFFYCbCrtoRGB(TIFFYCbCrToRGB *, uint32, int32, int32,
+			   uint32 *, uint32 *, uint32 *);
+
+/*
+ * RGBA-style image support.
+ */
+typedef struct _TIFFRGBAImage TIFFRGBAImage;
+/*
+ * The image reading and conversion routines invoke
+ * ``put routines'' to copy/image/whatever tiles of
+ * raw image data.  A default set of routines are 
+ * provided to convert/copy raw image data to 8-bit
+ * packed ABGR format rasters.  Applications can supply
+ * alternate routines that unpack the data into a
+ * different format or, for example, unpack the data
+ * and draw the unpacked raster on the display.
+ */
+typedef void (*tileContigRoutine)
+    (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
+	unsigned char*);
+typedef void (*tileSeparateRoutine)
+    (TIFFRGBAImage*, uint32*, uint32, uint32, uint32, uint32, int32, int32,
+	unsigned char*, unsigned char*, unsigned char*, unsigned char*);
+/*
+ * RGBA-reader state.
+ */
+struct _TIFFRGBAImage {
+	TIFF*	tif;				/* image handle */
+	int	stoponerr;			/* stop on read error */
+	int	isContig;			/* data is packed/separate */
+	int	alpha;				/* type of alpha data present */
+	uint32	width;				/* image width */
+	uint32	height;				/* image height */
+	uint16	bitspersample;			/* image bits/sample */
+	uint16	samplesperpixel;		/* image samples/pixel */
+	uint16	orientation;			/* image orientation */
+	uint16	req_orientation;		/* requested orientation */
+	uint16	photometric;			/* image photometric interp */
+	uint16*	redcmap;			/* colormap pallete */
+	uint16*	greencmap;
+	uint16*	bluecmap;
+						/* get image data routine */
+	int	(*get)(TIFFRGBAImage*, uint32*, uint32, uint32);
+	union {
+	    void (*any)(TIFFRGBAImage*);
+	    tileContigRoutine	contig;
+	    tileSeparateRoutine	separate;
+	} put;					/* put decoded strip/tile */
+	TIFFRGBValue* Map;			/* sample mapping array */
+	uint32** BWmap;				/* black&white map */
+	uint32** PALmap;			/* palette image map */
+	TIFFYCbCrToRGB* ycbcr;			/* YCbCr conversion state */
+        TIFFCIELabToRGB* cielab;		/* CIE L*a*b conversion state */
+
+        int	row_offset;
+        int     col_offset;
+};
+
+/*
+ * Macros for extracting components from the
+ * packed ABGR form returned by TIFFReadRGBAImage.
+ */
+#define	TIFFGetR(abgr)	((abgr) & 0xff)
+#define	TIFFGetG(abgr)	(((abgr) >> 8) & 0xff)
+#define	TIFFGetB(abgr)	(((abgr) >> 16) & 0xff)
+#define	TIFFGetA(abgr)	(((abgr) >> 24) & 0xff)
+
+/*
+ * A CODEC is a software package that implements decoding,
+ * encoding, or decoding+encoding of a compression algorithm.
+ * The library provides a collection of builtin codecs.
+ * More codecs may be registered through calls to the library
+ * and/or the builtin implementations may be overridden.
+ */
+typedef	int (*TIFFInitMethod)(TIFF*, int);
+typedef struct {
+	char*		name;
+	uint16		scheme;
+	TIFFInitMethod	init;
+} TIFFCodec;
+
+#include <stdio.h>
+#include <stdarg.h>
+
+/* share internal LogLuv conversion routines? */
+#ifndef LOGLUV_PUBLIC
+#define LOGLUV_PUBLIC		1	
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+typedef	void (*TIFFErrorHandler)(const char*, const char*, va_list);
+typedef	tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t);
+typedef	toff_t (*TIFFSeekProc)(thandle_t, toff_t, int);
+typedef	int (*TIFFCloseProc)(thandle_t);
+typedef	toff_t (*TIFFSizeProc)(thandle_t);
+typedef	int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*);
+typedef	void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t);
+typedef	void (*TIFFExtendProc)(TIFF*); 
+
+extern	const char* TIFFGetVersion(void);
+
+extern	const TIFFCodec* TIFFFindCODEC(uint16);
+extern	TIFFCodec* TIFFRegisterCODEC(uint16, const char*, TIFFInitMethod);
+extern	void TIFFUnRegisterCODEC(TIFFCodec*);
+extern  int TIFFIsCODECConfigured(uint16);
+
+extern	tdata_t _TIFFmalloc(tsize_t);
+extern	tdata_t _TIFFrealloc(tdata_t, tsize_t);
+extern	void _TIFFmemset(tdata_t, int, tsize_t);
+extern	void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t);
+extern	int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t);
+extern	void _TIFFfree(tdata_t);
+
+extern	void TIFFClose(TIFF*);
+extern	int TIFFFlush(TIFF*);
+extern	int TIFFFlushData(TIFF*);
+extern	int TIFFGetField(TIFF*, ttag_t, ...);
+extern	int TIFFVGetField(TIFF*, ttag_t, va_list);
+extern	int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...);
+extern	int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list);
+extern	int TIFFReadDirectory(TIFF*);
+extern	tsize_t TIFFScanlineSize(TIFF*);
+extern	tsize_t TIFFRasterScanlineSize(TIFF*);
+extern	tsize_t TIFFStripSize(TIFF*);
+extern	tsize_t TIFFRawStripSize(TIFF*, tstrip_t);
+extern	tsize_t TIFFVStripSize(TIFF*, uint32);
+extern	tsize_t TIFFTileRowSize(TIFF*);
+extern	tsize_t TIFFTileSize(TIFF*);
+extern	tsize_t TIFFVTileSize(TIFF*, uint32);
+extern	uint32 TIFFDefaultStripSize(TIFF*, uint32);
+extern	void TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
+extern	int TIFFFileno(TIFF*);
+extern	int TIFFGetMode(TIFF*);
+extern	int TIFFIsTiled(TIFF*);
+extern	int TIFFIsByteSwapped(TIFF*);
+extern	int TIFFIsUpSampled(TIFF*);
+extern	int TIFFIsMSB2LSB(TIFF*);
+extern	uint32 TIFFCurrentRow(TIFF*);
+extern	tdir_t TIFFCurrentDirectory(TIFF*);
+extern	tdir_t TIFFNumberOfDirectories(TIFF*);
+extern	uint32 TIFFCurrentDirOffset(TIFF*);
+extern	tstrip_t TIFFCurrentStrip(TIFF*);
+extern	ttile_t TIFFCurrentTile(TIFF*);
+extern	int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t);
+extern	int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t);
+extern	int TIFFSetupStrips(TIFF *);
+extern  int TIFFWriteCheck(TIFF*, int, const char *);
+extern  int TIFFCreateDirectory(TIFF*);
+extern	int TIFFLastDirectory(TIFF*);
+extern	int TIFFSetDirectory(TIFF*, tdir_t);
+extern	int TIFFSetSubDirectory(TIFF*, uint32);
+extern	int TIFFUnlinkDirectory(TIFF*, tdir_t);
+extern	int TIFFSetField(TIFF*, ttag_t, ...);
+extern	int TIFFVSetField(TIFF*, ttag_t, va_list);
+extern	int TIFFWriteDirectory(TIFF *);
+extern	int TIFFCheckpointDirectory(TIFF *);
+extern	int TIFFRewriteDirectory(TIFF *);
+extern	int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int);
+
+#if defined(c_plusplus) || defined(__cplusplus)
+extern	void TIFFPrintDirectory(TIFF*, FILE*, long = 0);
+extern	int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
+extern	int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t = 0);
+extern	int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int = 0);
+extern	int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*,
+				      int = ORIENTATION_BOTLEFT, int = 0);
+#else
+extern	void TIFFPrintDirectory(TIFF*, FILE*, long);
+extern	int TIFFReadScanline(TIFF*, tdata_t, uint32, tsample_t);
+extern	int TIFFWriteScanline(TIFF*, tdata_t, uint32, tsample_t);
+extern	int TIFFReadRGBAImage(TIFF*, uint32, uint32, uint32*, int);
+extern	int TIFFReadRGBAImageOriented(TIFF*, uint32, uint32, uint32*, int, int);
+#endif
+
+extern	int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32 * );
+extern	int TIFFReadRGBATile(TIFF*, uint32, uint32, uint32 * );
+extern	int TIFFRGBAImageOK(TIFF*, char [1024]);
+extern	int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]);
+extern	int TIFFRGBAImageGet(TIFFRGBAImage*, uint32*, uint32, uint32);
+extern	void TIFFRGBAImageEnd(TIFFRGBAImage*);
+extern	TIFF* TIFFOpen(const char*, const char*);
+extern	TIFF* TIFFFdOpen(int, const char*, const char*);
+extern	TIFF* TIFFClientOpen(const char*, const char*,
+	    thandle_t,
+	    TIFFReadWriteProc, TIFFReadWriteProc,
+	    TIFFSeekProc, TIFFCloseProc,
+	    TIFFSizeProc,
+	    TIFFMapFileProc, TIFFUnmapFileProc);
+extern	const char* TIFFFileName(TIFF*);
+extern	void TIFFError(const char*, const char*, ...);
+extern	void TIFFWarning(const char*, const char*, ...);
+extern	TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler);
+extern	TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler);
+extern	TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc);
+extern	ttile_t TIFFComputeTile(TIFF*, uint32, uint32, uint32, tsample_t);
+extern	int TIFFCheckTile(TIFF*, uint32, uint32, uint32, tsample_t);
+extern	ttile_t TIFFNumberOfTiles(TIFF*);
+extern	tsize_t TIFFReadTile(TIFF*,
+	    tdata_t, uint32, uint32, uint32, tsample_t);
+extern	tsize_t TIFFWriteTile(TIFF*,
+	    tdata_t, uint32, uint32, uint32, tsample_t);
+extern	tstrip_t TIFFComputeStrip(TIFF*, uint32, tsample_t);
+extern	tstrip_t TIFFNumberOfStrips(TIFF*);
+extern	tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern	tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern	tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern	tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern	tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern	tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern  tsize_t TIFFWriteStrip(TIFF*, tstrip_t, tdata_t, tsize_t);
+extern	tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern	tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t);
+extern	int TIFFDataWidth(TIFFDataType);    /* table of tag datatype widths */
+extern	void TIFFSetWriteOffset(TIFF*, toff_t);
+extern	void TIFFSwabShort(uint16*);
+extern	void TIFFSwabLong(uint32*);
+extern	void TIFFSwabDouble(double*);
+extern	void TIFFSwabArrayOfShort(uint16*, unsigned long);
+extern	void TIFFSwabArrayOfLong(uint32*, unsigned long);
+extern	void TIFFSwabArrayOfDouble(double*, unsigned long);
+extern	void TIFFReverseBits(unsigned char *, unsigned long);
+extern	const unsigned char* TIFFGetBitRevTable(int);
+
+
+#ifdef LOGLUV_PUBLIC
+#define U_NEU		0.210526316
+#define V_NEU		0.473684211
+#define UVSCALE		410.
+extern	double LogL16toY(int);
+extern	double LogL10toY(int);
+extern	void XYZtoRGB24(float*, uint8*);
+extern	int uv_decode(double*, double*, int);
+extern	void LogLuv24toXYZ(uint32, float*);
+extern	void LogLuv32toXYZ(uint32, float*);
+#if defined(c_plusplus) || defined(__cplusplus)
+extern	int LogL16fromY(double, int = SGILOGENCODE_NODITHER);
+extern	int LogL10fromY(double, int = SGILOGENCODE_NODITHER);
+extern	int uv_encode(double, double, int = SGILOGENCODE_NODITHER);
+extern	uint32 LogLuv24fromXYZ(float*, int = SGILOGENCODE_NODITHER);
+extern	uint32 LogLuv32fromXYZ(float*, int = SGILOGENCODE_NODITHER);
+#else
+extern	int LogL16fromY(double, int);
+extern	int LogL10fromY(double, int);
+extern	int uv_encode(double, double, int);
+extern	uint32 LogLuv24fromXYZ(float*, int);
+extern	uint32 LogLuv32fromXYZ(float*, int);
+#endif
+#endif /* LOGLUV_PUBLIC */
+
+/*
+** New stuff going public in 3.6.x.
+*/
+extern  int  TIFFGetTagListCount( TIFF * );
+extern  ttag_t TIFFGetTagListEntry( TIFF *, int tag_index );
+    
+#define	TIFF_ANY	TIFF_NOTYPE	/* for field descriptor searching */
+#define	TIFF_VARIABLE	-1		/* marker for variable length tags */
+#define	TIFF_SPP	-2		/* marker for SamplesPerPixel tags */
+#define	TIFF_VARIABLE2	-3		/* marker for uint32 var-length tags */
+
+#define FIELD_CUSTOM    65    
+
+typedef	struct {
+	ttag_t	field_tag;		/* field's tag */
+	short	field_readcount;	/* read count/TIFF_VARIABLE/TIFF_SPP */
+	short	field_writecount;	/* write count/TIFF_VARIABLE */
+	TIFFDataType field_type;	/* type of associated data */
+        unsigned short field_bit;	/* bit in fieldsset bit vector */
+	unsigned char field_oktochange;	/* if true, can change while writing */
+	unsigned char field_passcount;	/* if true, pass dir count on set */
+	char	*field_name;		/* ASCII name */
+} TIFFFieldInfo;
+
+typedef struct _TIFFTagValue {
+    const TIFFFieldInfo  *info;
+    int             count;
+    void           *value;
+} TIFFTagValue;
+
+extern	void TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int);
+extern	const TIFFFieldInfo* TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType);
+extern	const TIFFFieldInfo* TIFFFieldWithTag(TIFF*, ttag_t);
+
+typedef	int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list);
+typedef	int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list);
+typedef	void (*TIFFPrintMethod)(TIFF*, FILE*, long);
+    
+typedef struct {
+    TIFFVSetMethod	vsetfield;	/* tag set routine */
+    TIFFVGetMethod	vgetfield;	/* tag get routine */
+    TIFFPrintMethod	printdir;	/* directory print routine */
+} TIFFTagMethods;
+        
+extern  TIFFTagMethods *TIFFAccessTagMethods( TIFF * );
+extern  void *TIFFGetClientInfo( TIFF *, const char * );
+extern  void TIFFSetClientInfo( TIFF *, void *, const char * );
+    
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFIO_ */
diff --git a/src/tiff/tiffiop.h b/src/tiff/tiffiop.h
new file mode 100644
index 0000000..b36cbeb
--- /dev/null
+++ b/src/tiff/tiffiop.h
@@ -0,0 +1,289 @@
+/* $Header: /home/terralib/src/tiff/tiffiop.h,v 1.3 2004/03/19 11:51:25 lubia Exp $ */
+
+/*
+ * Copyright (c) 1988-1997 Sam Leffler
+ * Copyright (c) 1991-1997 Silicon Graphics, Inc.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and 
+ * its documentation for any purpose is hereby granted without fee, provided
+ * that (i) the above copyright notices and this permission notice appear in
+ * all copies of the software and related documentation, and (ii) the names of
+ * Sam Leffler and Silicon Graphics may not be used in any advertising or
+ * publicity relating to the software without the specific, prior written
+ * permission of Sam Leffler and Silicon Graphics.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
+ * 
+ * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
+ * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
+ * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
+ * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
+ * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
+ * OF THIS SOFTWARE.
+ */
+
+#ifndef _TIFFIOP_
+#define	_TIFFIOP_
+/*
+ * ``Library-private'' definitions.
+ */
+/*
+ * UNIX systems should run the configure script to generate
+ * a port.h file that reflects the system capabilities.
+ * Doing this obviates all the dreck done in tiffcomp.h.
+ */
+#if defined(unix) || defined(__unix)
+#include "port.h"
+#include "tiffconf.h"
+#else
+#include "tiffconf.h"
+#include "tiffcomp.h"
+#endif
+#include "tiffio.h"
+#include "tif_dir.h"
+
+#ifndef TRUE
+#define	TRUE	1
+#define	FALSE	0
+#endif
+
+typedef struct client_info {
+    struct client_info *next;
+    void      *data;
+    char      *name;
+} TIFFClientInfoLink;
+
+/*
+ * Typedefs for ``method pointers'' used internally.
+ */
+typedef	unsigned char tidataval_t;	/* internal image data value type */
+typedef	tidataval_t* tidata_t;		/* reference to internal image data */
+
+typedef	void (*TIFFVoidMethod)(TIFF*);
+typedef	int (*TIFFBoolMethod)(TIFF*);
+typedef	int (*TIFFPreMethod)(TIFF*, tsample_t);
+typedef	int (*TIFFCodeMethod)(TIFF*, tidata_t, tsize_t, tsample_t);
+typedef	int (*TIFFSeekMethod)(TIFF*, uint32);
+typedef	void (*TIFFPostMethod)(TIFF*, tidata_t, tsize_t);
+typedef	uint32 (*TIFFStripMethod)(TIFF*, uint32);
+typedef	void (*TIFFTileMethod)(TIFF*, uint32*, uint32*);
+
+struct tiff {
+	char*		tif_name;	/* name of open file */
+	int		tif_fd;		/* open file descriptor */
+	int		tif_mode;	/* open mode (O_*) */
+	uint32		tif_flags;
+#define	TIFF_FILLORDER		0x0003	/* natural bit fill order for machine */
+#define	TIFF_DIRTYHEADER	0x0004	/* header must be written on close */
+#define	TIFF_DIRTYDIRECT	0x0008	/* current directory must be written */
+#define	TIFF_BUFFERSETUP	0x0010	/* data buffers setup */
+#define	TIFF_CODERSETUP		0x0020	/* encoder/decoder setup done */
+#define	TIFF_BEENWRITING	0x0040	/* written 1+ scanlines to file */
+#define	TIFF_SWAB			0x0080	/* byte swap file information */
+#define	TIFF_NOBITREV		0x0100	/* inhibit bit reversal logic */
+#define	TIFF_MYBUFFER		0x0200	/* my raw data buffer; free on close */
+#define	TIFF_ISTILED		0x0400	/* file is tile, not strip- based */
+#define	TIFF_MAPPED			0x0800	/* file is mapped into memory */
+#define	TIFF_POSTENCODE		0x1000	/* need call to postencode routine */
+#define	TIFF_INSUBIFD		0x2000	/* currently writing a subifd */
+#define	TIFF_UPSAMPLED		0x4000	/* library is doing data up-sampling */ 
+#define	TIFF_STRIPCHOP		0x8000	/* enable strip chopping support */
+	toff_t		tif_diroff;	/* file offset of current directory */
+	toff_t		tif_nextdiroff;	/* file offset of following directory */
+	toff_t*		tif_dirlist;	/* list of offsets to already seen */
+					/* directories to prevent IFD looping */
+	uint16		tif_dirnumber;  /* number of already seen directories */
+	TIFFDirectory	tif_dir;	/* internal rep of current directory */
+	TIFFHeader	tif_header;	/* file's header block */
+	const int*	tif_typeshift;	/* data type shift counts */
+	const long*	tif_typemask;	/* data type masks */
+	uint32		tif_row;	/* current scanline */
+	tdir_t		tif_curdir;	/* current directory (index) */
+	tstrip_t	tif_curstrip;	/* current strip for read/write */
+	toff_t		tif_curoff;	/* current offset for read/write */
+	toff_t		tif_dataoff;	/* current offset for writing dir */
+#if SUBIFD_SUPPORT
+	uint16		tif_nsubifd;	/* remaining subifds to write */
+	toff_t		tif_subifdoff;	/* offset for patching SubIFD link */
+#endif
+/* tiling support */
+	uint32 		tif_col;	/* current column (offset by row too) */
+	ttile_t		tif_curtile;	/* current tile for read/write */
+	tsize_t		tif_tilesize;	/* # of bytes in a tile */
+/* compression scheme hooks */
+	int		tif_decodestatus;
+	TIFFBoolMethod	tif_setupdecode;/* called once before predecode */
+	TIFFPreMethod	tif_predecode;	/* pre- row/strip/tile decoding */
+	TIFFBoolMethod	tif_setupencode;/* called once before preencode */
+	int		tif_encodestatus;
+	TIFFPreMethod	tif_preencode;	/* pre- row/strip/tile encoding */
+	TIFFBoolMethod	tif_postencode;	/* post- row/strip/tile encoding */
+	TIFFCodeMethod	tif_decoderow;	/* scanline decoding routine */
+	TIFFCodeMethod	tif_encoderow;	/* scanline encoding routine */
+	TIFFCodeMethod	tif_decodestrip;/* strip decoding routine */
+	TIFFCodeMethod	tif_encodestrip;/* strip encoding routine */
+	TIFFCodeMethod	tif_decodetile;	/* tile decoding routine */
+	TIFFCodeMethod	tif_encodetile;	/* tile encoding routine */
+	TIFFVoidMethod	tif_close;	/* cleanup-on-close routine */
+	TIFFSeekMethod	tif_seek;	/* position within a strip routine */
+	TIFFVoidMethod	tif_cleanup;	/* cleanup state routine */
+	TIFFStripMethod	tif_defstripsize;/* calculate/constrain strip size */
+	TIFFTileMethod	tif_deftilesize;/* calculate/constrain tile size */
+	tidata_t	tif_data;	/* compression scheme private data */
+/* input/output buffering */
+	tsize_t		tif_scanlinesize;/* # of bytes in a scanline */
+	tsize_t		tif_scanlineskew;/* scanline skew for reading strips */
+	tidata_t	tif_rawdata;	/* raw data buffer */
+	tsize_t		tif_rawdatasize;/* # of bytes in raw data buffer */
+	tidata_t	tif_rawcp;	/* current spot in raw buffer */
+	tsize_t		tif_rawcc;	/* bytes unread from raw buffer */
+
+/* memory-mapped file support */
+	tidata_t	tif_base;	/* base of mapped file */
+	toff_t		tif_size;	/* size of mapped file region (bytes) */
+	TIFFMapFileProc	tif_mapproc;	/* map file method */
+	TIFFUnmapFileProc tif_unmapproc;/* unmap file method */
+/* input/output callback methods */
+	thandle_t	tif_clientdata;	/* callback parameter */
+	TIFFReadWriteProc tif_readproc;	/* read method */
+	TIFFReadWriteProc tif_writeproc;/* write method */
+	TIFFSeekProc	tif_seekproc;	/* lseek method */
+	TIFFCloseProc	tif_closeproc;	/* close method */
+	TIFFSizeProc	tif_sizeproc;	/* filesize method */
+/* post-decoding support */
+	TIFFPostMethod	tif_postdecode;	/* post decoding routine */
+/* tag support */
+	TIFFFieldInfo**	tif_fieldinfo;	/* sorted table of registered tags */
+	int		tif_nfields;	/* # entries in registered tag table */
+        TIFFTagMethods  tif_tagmethods; /* tag get/set/print routines */
+        TIFFClientInfoLink *tif_clientinfo; /* extra client information. */
+};
+
+#define	isPseudoTag(t)	(t > 0xffff)	/* is tag value normal or pseudo */
+
+#define	isTiled(tif)	(((tif)->tif_flags & TIFF_ISTILED) != 0)
+#define	isMapped(tif)	(((tif)->tif_flags & TIFF_MAPPED) != 0)
+#define	isFillOrder(tif, o)	(((tif)->tif_flags & (o)) != 0)
+#define	isUpSampled(tif)	(((tif)->tif_flags & TIFF_UPSAMPLED) != 0)
+#define	TIFFReadFile(tif, buf, size) \
+	((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size))
+#define	TIFFWriteFile(tif, buf, size) \
+	((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size))
+#define	TIFFSeekFile(tif, off, whence) \
+	((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence))
+#define	TIFFCloseFile(tif) \
+	((*(tif)->tif_closeproc)((tif)->tif_clientdata))
+#define	TIFFGetFileSize(tif) \
+	((*(tif)->tif_sizeproc)((tif)->tif_clientdata))
+#define	TIFFMapFileContents(tif, paddr, psize) \
+	((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize))
+#define	TIFFUnmapFileContents(tif, addr, size) \
+	((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size))
+
+/*
+ * Default Read/Seek/Write definitions.
+ */
+#ifndef ReadOK
+#define	ReadOK(tif, buf, size) \
+	(TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size))
+#endif
+#ifndef SeekOK
+#define	SeekOK(tif, off) \
+	(TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off)
+#endif
+#ifndef WriteOK
+#define	WriteOK(tif, buf, size) \
+	(TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size)
+#endif
+
+/* NB: the uint32 casts are to silence certain ANSI-C compilers */
+#define	TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y)))
+#define	TIFFroundup(x, y) (TIFFhowmany(x,y)*((uint32)(y)))
+
+#define TIFFmax(A,B) ((A)>(B)?(A):(B))
+#define TIFFmin(A,B) ((A)<(B)?(A):(B))
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+extern	int _TIFFgetMode(const char*, const char*);
+extern	int _TIFFNoRowEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern	int _TIFFNoStripEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern	int _TIFFNoTileEncode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern	int _TIFFNoRowDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern	int _TIFFNoStripDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern	int _TIFFNoTileDecode(TIFF*, tidata_t, tsize_t, tsample_t);
+extern	void _TIFFNoPostDecode(TIFF*, tidata_t, tsize_t);
+extern  int  _TIFFNoPreCode (TIFF*, tsample_t); 
+extern	int _TIFFNoSeek(TIFF*, uint32);
+extern	void _TIFFSwab16BitData(TIFF*, tidata_t, tsize_t);
+extern	void _TIFFSwab32BitData(TIFF*, tidata_t, tsize_t);
+extern	void _TIFFSwab64BitData(TIFF*, tidata_t, tsize_t);
+extern	int TIFFFlushData1(TIFF*);
+extern	void TIFFFreeDirectory(TIFF*);
+extern	int TIFFDefaultDirectory(TIFF*);
+extern	int TIFFSetCompressionScheme(TIFF*, int);
+extern	int TIFFSetDefaultCompressionState(TIFF*);
+extern	uint32 _TIFFDefaultStripSize(TIFF*, uint32);
+extern	void _TIFFDefaultTileSize(TIFF*, uint32*, uint32*);
+
+extern	void _TIFFsetByteArray(void**, void*, long);
+extern	void _TIFFsetString(char**, char*);
+extern	void _TIFFsetShortArray(uint16**, uint16*, long);
+extern	void _TIFFsetLongArray(uint32**, uint32*, long);
+extern	void _TIFFsetFloatArray(float**, float*, long);
+extern	void _TIFFsetDoubleArray(double**, double*, long);
+
+extern	void _TIFFprintAscii(FILE*, const char*);
+extern	void _TIFFprintAsciiTag(FILE*, const char*, const char*);
+
+GLOBALDATA(TIFFErrorHandler,_TIFFwarningHandler);
+GLOBALDATA(TIFFErrorHandler,_TIFFerrorHandler);
+
+extern	int TIFFInitDumpMode(TIFF*, int);
+#ifdef PACKBITS_SUPPORT
+extern	int TIFFInitPackBits(TIFF*, int);
+#endif
+#ifdef CCITT_SUPPORT
+extern	int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int);
+extern	int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int);
+#endif
+#ifdef THUNDER_SUPPORT
+extern	int TIFFInitThunderScan(TIFF*, int);
+#endif
+#ifdef NEXT_SUPPORT
+extern	int TIFFInitNeXT(TIFF*, int);
+#endif
+#ifdef LZW_SUPPORT
+extern	int TIFFInitLZW(TIFF*, int);
+#endif
+#ifdef OJPEG_SUPPORT
+extern	int TIFFInitOJPEG(TIFF*, int);
+#endif
+#ifdef JPEG_SUPPORT
+extern	int TIFFInitJPEG(TIFF*, int);
+#endif
+#ifdef JBIG_SUPPORT
+extern	int TIFFInitJBIG(TIFF*, int);
+#endif
+#ifdef ZIP_SUPPORT
+extern	int TIFFInitZIP(TIFF*, int);
+#endif
+#ifdef PIXARLOG_SUPPORT
+extern	int TIFFInitPixarLog(TIFF*, int);
+#endif
+#ifdef LOGLUV_SUPPORT
+extern	int TIFFInitSGILog(TIFF*, int);
+#endif
+#ifdef VMS
+extern	const TIFFCodec _TIFFBuiltinCODECS[];
+#else
+extern	TIFFCodec _TIFFBuiltinCODECS[];
+#endif
+
+#if defined(__cplusplus)
+}
+#endif
+#endif /* _TIFFIOP_ */
diff --git a/src/tiff/tiffvers.h b/src/tiff/tiffvers.h
new file mode 100644
index 0000000..3d24f9a
--- /dev/null
+++ b/src/tiff/tiffvers.h
@@ -0,0 +1,9 @@
+#define TIFFLIB_VERSION_STR "LIBTIFF, Version 3.6.1\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc."
+/*
+ * This define can be used in code that requires
+ * compilation-related definitions specific to a
+ * version or versions of the library.  Runtime
+ * version checking should be done based on the
+ * string returned by TIFFGetVersion.
+ */
+#define TIFFLIB_VERSION 20031226
diff --git a/src/tiff/uvcode.h b/src/tiff/uvcode.h
new file mode 100644
index 0000000..8d96e44
--- /dev/null
+++ b/src/tiff/uvcode.h
@@ -0,0 +1,173 @@
+/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */
+#define UV_SQSIZ	(float)0.003500
+#define UV_NDIVS	16289
+#define UV_VSTART	(float)0.016940
+#define UV_NVS		163
+static struct {
+	float	ustart;
+	short	nus, ncum;
+}	uv_row[UV_NVS] = {
+	(float)0.247663,	4,	0,
+	(float)0.243779,	6,	4,
+	(float)0.241684,	7,	10,
+	(float)0.237874,	9,	17,
+	(float)0.235906,	10,	26,
+	(float)0.232153,	12,	36,
+	(float)0.228352,	14,	48,
+	(float)0.226259,	15,	62,
+	(float)0.222371,	17,	77,
+	(float)0.220410,	18,	94,
+	(float)0.214710,	21,	112,
+	(float)0.212714,	22,	133,
+	(float)0.210721,	23,	155,
+	(float)0.204976,	26,	178,
+	(float)0.202986,	27,	204,
+	(float)0.199245,	29,	231,
+	(float)0.195525,	31,	260,
+	(float)0.193560,	32,	291,
+	(float)0.189878,	34,	323,
+	(float)0.186216,	36,	357,
+	(float)0.186216,	36,	393,
+	(float)0.182592,	38,	429,
+	(float)0.179003,	40,	467,
+	(float)0.175466,	42,	507,
+	(float)0.172001,	44,	549,
+	(float)0.172001,	44,	593,
+	(float)0.168612,	46,	637,
+	(float)0.168612,	46,	683,
+	(float)0.163575,	49,	729,
+	(float)0.158642,	52,	778,
+	(float)0.158642,	52,	830,
+	(float)0.158642,	52,	882,
+	(float)0.153815,	55,	934,
+	(float)0.153815,	55,	989,
+	(float)0.149097,	58,	1044,
+	(float)0.149097,	58,	1102,
+	(float)0.142746,	62,	1160,
+	(float)0.142746,	62,	1222,
+	(float)0.142746,	62,	1284,
+	(float)0.138270,	65,	1346,
+	(float)0.138270,	65,	1411,
+	(float)0.138270,	65,	1476,
+	(float)0.132166,	69,	1541,
+	(float)0.132166,	69,	1610,
+	(float)0.126204,	73,	1679,
+	(float)0.126204,	73,	1752,
+	(float)0.126204,	73,	1825,
+	(float)0.120381,	77,	1898,
+	(float)0.120381,	77,	1975,
+	(float)0.120381,	77,	2052,
+	(float)0.120381,	77,	2129,
+	(float)0.112962,	82,	2206,
+	(float)0.112962,	82,	2288,
+	(float)0.112962,	82,	2370,
+	(float)0.107450,	86,	2452,
+	(float)0.107450,	86,	2538,
+	(float)0.107450,	86,	2624,
+	(float)0.107450,	86,	2710,
+	(float)0.100343,	91,	2796,
+	(float)0.100343,	91,	2887,
+	(float)0.100343,	91,	2978,
+	(float)0.095126,	95,	3069,
+	(float)0.095126,	95,	3164,
+	(float)0.095126,	95,	3259,
+	(float)0.095126,	95,	3354,
+	(float)0.088276,	100,	3449,
+	(float)0.088276,	100,	3549,
+	(float)0.088276,	100,	3649,
+	(float)0.088276,	100,	3749,
+	(float)0.081523,	105,	3849,
+	(float)0.081523,	105,	3954,
+	(float)0.081523,	105,	4059,
+	(float)0.081523,	105,	4164,
+	(float)0.074861,	110,	4269,
+	(float)0.074861,	110,	4379,
+	(float)0.074861,	110,	4489,
+	(float)0.074861,	110,	4599,
+	(float)0.068290,	115,	4709,
+	(float)0.068290,	115,	4824,
+	(float)0.068290,	115,	4939,
+	(float)0.068290,	115,	5054,
+	(float)0.063573,	119,	5169,
+	(float)0.063573,	119,	5288,
+	(float)0.063573,	119,	5407,
+	(float)0.063573,	119,	5526,
+	(float)0.057219,	124,	5645,
+	(float)0.057219,	124,	5769,
+	(float)0.057219,	124,	5893,
+	(float)0.057219,	124,	6017,
+	(float)0.050985,	129,	6141,
+	(float)0.050985,	129,	6270,
+	(float)0.050985,	129,	6399,
+	(float)0.050985,	129,	6528,
+	(float)0.050985,	129,	6657,
+	(float)0.044859,	134,	6786,
+	(float)0.044859,	134,	6920,
+	(float)0.044859,	134,	7054,
+	(float)0.044859,	134,	7188,
+	(float)0.040571,	138,	7322,
+	(float)0.040571,	138,	7460,
+	(float)0.040571,	138,	7598,
+	(float)0.040571,	138,	7736,
+	(float)0.036339,	142,	7874,
+	(float)0.036339,	142,	8016,
+	(float)0.036339,	142,	8158,
+	(float)0.036339,	142,	8300,
+	(float)0.032139,	146,	8442,
+	(float)0.032139,	146,	8588,
+	(float)0.032139,	146,	8734,
+	(float)0.032139,	146,	8880,
+	(float)0.027947,	150,	9026,
+	(float)0.027947,	150,	9176,
+	(float)0.027947,	150,	9326,
+	(float)0.023739,	154,	9476,
+	(float)0.023739,	154,	9630,
+	(float)0.023739,	154,	9784,
+	(float)0.023739,	154,	9938,
+	(float)0.019504,	158,	10092,
+	(float)0.019504,	158,	10250,
+	(float)0.019504,	158,	10408,
+	(float)0.016976,	161,	10566,
+	(float)0.016976,	161,	10727,
+	(float)0.016976,	161,	10888,
+	(float)0.016976,	161,	11049,
+	(float)0.012639,	165,	11210,
+	(float)0.012639,	165,	11375,
+	(float)0.012639,	165,	11540,
+	(float)0.009991,	168,	11705,
+	(float)0.009991,	168,	11873,
+	(float)0.009991,	168,	12041,
+	(float)0.009016,	170,	12209,
+	(float)0.009016,	170,	12379,
+	(float)0.009016,	170,	12549,
+	(float)0.006217,	173,	12719,
+	(float)0.006217,	173,	12892,
+	(float)0.005097,	175,	13065,
+	(float)0.005097,	175,	13240,
+	(float)0.005097,	175,	13415,
+	(float)0.003909,	177,	13590,
+	(float)0.003909,	177,	13767,
+	(float)0.002340,	177,	13944,
+	(float)0.002389,	170,	14121,
+	(float)0.001068,	164,	14291,
+	(float)0.001653,	157,	14455,
+	(float)0.000717,	150,	14612,
+	(float)0.001614,	143,	14762,
+	(float)0.000270,	136,	14905,
+	(float)0.000484,	129,	15041,
+	(float)0.001103,	123,	15170,
+	(float)0.001242,	115,	15293,
+	(float)0.001188,	109,	15408,
+	(float)0.001011,	103,	15517,
+	(float)0.000709,	97,	15620,
+	(float)0.000301,	89,	15717,
+	(float)0.002416,	82,	15806,
+	(float)0.003251,	76,	15888,
+	(float)0.003246,	69,	15964,
+	(float)0.004141,	62,	16033,
+	(float)0.005963,	55,	16095,
+	(float)0.008839,	47,	16150,
+	(float)0.010490,	40,	16197,
+	(float)0.016994,	31,	16237,
+	(float)0.023659,	21,	16268,
+};
diff --git a/src/tiff/version.h b/src/tiff/version.h
new file mode 100644
index 0000000..49f72b0
--- /dev/null
+++ b/src/tiff/version.h
@@ -0,0 +1 @@
+#define VERSION "LIBTIFF, Version 3.4beta024\nCopyright (c) 1988-1995 Sam Leffler\nCopyright (c) 1991-1995 Silicon Graphics, Inc."
diff --git a/src/tiff/xtiff.c b/src/tiff/xtiff.c
new file mode 100644
index 0000000..d15031e
--- /dev/null
+++ b/src/tiff/xtiff.c
@@ -0,0 +1,198 @@
+/*
+ * xtiff.c
+ *
+ * Extended TIFF Directory GEO Tag Support.
+ *
+ *  You may use this file as a template to add your own
+ *  extended tags to the library. Only the parts of the code
+ *  marked with "XXX" require modification.
+ *
+ *  Author: Niles D. Ritter
+ *
+ *  Revisions:
+ *    18 Sep 1995   -- Deprecated Integraph Matrix tag with new one.
+ *                     Backward compatible support provided.  --NDR.
+ */
+ 
+#include "xtiffio.h"
+#include <stdio.h>
+
+/*  Tiff info structure.
+ *
+ *     Entry format:
+ *        { TAGNUMBER, ReadCount, WriteCount, DataType, FIELDNUM, 
+ *          OkToChange, PassDirCountOnSet, AsciiName }
+ *
+ *     For ReadCount, WriteCount, -1 = unknown.
+ */
+
+static const TIFFFieldInfo xtiffFieldInfo[] = {
+  
+  /* XXX Insert Your tags here */
+    { TIFFTAG_GEOPIXELSCALE,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"GeoPixelScale" },
+    { TIFFTAG_INTERGRAPH_MATRIX,-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"Intergraph TransformationMatrix" },
+    { TIFFTAG_GEOTRANSMATRIX,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"GeoTransformationMatrix" },
+    { TIFFTAG_GEOTIEPOINTS,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"GeoTiePoints" },
+    { TIFFTAG_GEOKEYDIRECTORY,-1,-1, TIFF_SHORT,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"GeoKeyDirectory" },
+    { TIFFTAG_GEODOUBLEPARAMS,	-1,-1, TIFF_DOUBLE,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"GeoDoubleParams" },
+    { TIFFTAG_GEOASCIIPARAMS,	-1,-1, TIFF_ASCII,	FIELD_CUSTOM,
+      TRUE,	FALSE,	"GeoASCIIParams" },
+#ifdef JPL_TAG_SUPPORT
+    { TIFFTAG_JPL_CARTO_IFD,	 1, 1, TIFF_LONG,	FIELD_CUSTOM,
+      TRUE,	TRUE,	"JPL Carto IFD offset" },  /** Don't use this! **/
+#endif
+};
+
+#define	N(a)	(sizeof (a) / sizeof (a[0]))
+static void _XTIFFLocalDefaultDirectory(TIFF *tif)
+{
+    /* Install the extended Tag field info */
+    TIFFMergeFieldInfo(tif, xtiffFieldInfo, N(xtiffFieldInfo));
+}
+
+
+/**********************************************************************
+ *    Nothing below this line should need to be changed.
+ **********************************************************************/
+
+static TIFFExtendProc _ParentExtender;
+
+/*
+ *  This is the callback procedure, and is
+ *  called by the DefaultDirectory method
+ *  every time a new TIFF directory is opened.
+ */
+
+static void
+_XTIFFDefaultDirectory(TIFF *tif)
+{
+    /* set up our own defaults */
+    _XTIFFLocalDefaultDirectory(tif);
+
+    /* Since an XTIFF client module may have overridden
+     * the default directory method, we call it now to
+     * allow it to set up the rest of its own methods.
+     */
+
+    if (_ParentExtender) 
+        (*_ParentExtender)(tif);
+}
+
+/*
+ *  XTIFF Initializer -- sets up the callback
+ *   procedure for the TIFF module.
+ */
+
+static
+void _XTIFFInitialize(void)
+{
+    static int first_time=1;
+	
+    if (! first_time) return; /* Been there. Done that. */
+    first_time = 0;
+	
+    /* Grab the inherited method and install */
+    _ParentExtender = TIFFSetTagExtender(_XTIFFDefaultDirectory);
+}
+
+
+/**
+ * GeoTIFF compatible TIFF file open function.
+ *
+ * @param name The filename of a TIFF file to open.
+ * @param mode The open mode ("r", "w" or "a").
+ *
+ * @return a TIFF * for the file, or NULL if the open failed.
+ *
+This function is used to open GeoTIFF files instead of TIFFOpen() from
+libtiff.  Internally it calls TIFFOpen(), but sets up some extra hooks
+so that GeoTIFF tags can be extracted from the file.  If XTIFFOpen() isn't
+used, GTIFNew() won't work properly.  Files opened
+with XTIFFOpen() should be closed with XTIFFClose().
+
+The name of the file to be opened should be passed as <b>name</b>, and an
+opening mode ("r", "w" or "a") acceptable to TIFFOpen() should be passed as the
+<b>mode</b>.<p>
+
+If XTIFFOpen() fails it will return NULL.  Otherwise, normal TIFFOpen()
+error reporting steps will have already taken place.<p>
+ */
+
+TIFF*
+XTIFFOpen(const char* name, const char* mode)
+{
+    TIFF *tif;
+
+    /* Set up the callback */
+    _XTIFFInitialize();	
+	
+    /* Open the file; the callback will set everything up
+     */
+    tif = TIFFOpen(name, mode);
+    if (!tif) return tif;
+	
+    return tif;
+}
+
+TIFF*
+XTIFFFdOpen(int fd, const char* name, const char* mode)
+{
+    TIFF *tif;
+
+    /* Set up the callback */
+    _XTIFFInitialize();	
+
+    /* Open the file; the callback will set everything up
+     */
+    tif = TIFFFdOpen(fd, name, mode);
+    if (!tif) return tif;
+	
+    return tif;
+}
+
+TIFF*
+XTIFFClientOpen(const char* name, const char* mode, thandle_t thehandle,
+	    TIFFReadWriteProc RWProc, TIFFReadWriteProc RWProc2,
+	    TIFFSeekProc SProc, TIFFCloseProc CProc,
+	    TIFFSizeProc SzProc,
+	    TIFFMapFileProc MFProvc, TIFFUnmapFileProc UMFProc )
+{
+    TIFF *tif;
+    
+    /* Set up the callback */
+    _XTIFFInitialize();	
+    
+    /* Open the file; the callback will set everything up
+     */
+    tif = TIFFClientOpen(name, mode, thehandle,
+                         RWProc, RWProc2,
+                         SProc, CProc,
+                         SzProc,
+                         MFProvc, UMFProc);
+    
+    if (!tif) return tif;
+    
+    return tif;
+}
+
+/**
+ * Close a file opened with XTIFFOpen().
+ *
+ * @param tif The file handle returned by XTIFFOpen().
+ * 
+ * If a GTIF structure was created with GTIFNew()
+ * for this file, it should be freed with GTIFFree()
+ * <i>before</i> calling XTIFFClose().
+*/
+
+void
+XTIFFClose(TIFF *tif)
+{
+    TIFFClose(tif);
+}
diff --git a/src/tiff/xtiffio.h b/src/tiff/xtiffio.h
new file mode 100644
index 0000000..c4f10e8
--- /dev/null
+++ b/src/tiff/xtiffio.h
@@ -0,0 +1,72 @@
+/*
+ *  xtiffio.h -- Public interface to Extended GEO TIFF tags
+ *
+ *    written by: Niles D. Ritter
+ */
+
+#ifndef __xtiffio_h
+#define __xtiffio_h
+
+#include "cpl_serv.h"
+#include "tiffio.h"
+
+/**
+ * \file xtiffio.h
+ *
+ * Definitions relating GeoTIFF functions from geotiff.h to the TIFF
+ * library (usually libtiff).
+ */
+
+/* 
+ *  Define public Tag names and values here 
+ */
+
+/* tags 33550 is a private tag registered to SoftDesk, Inc */
+#define TIFFTAG_GEOPIXELSCALE       33550
+/* tags 33920-33921 are private tags registered to Intergraph, Inc */
+#define TIFFTAG_INTERGRAPH_MATRIX    33920   /* $use TIFFTAG_GEOTRANSMATRIX ! */
+#define TIFFTAG_GEOTIEPOINTS         33922
+/* tags 34263-34264 are private tags registered to NASA-JPL Carto Group */
+#ifdef JPL_TAG_SUPPORT
+#define TIFFTAG_JPL_CARTO_IFD        34263    /* $use GeoProjectionInfo ! */
+#endif
+#define TIFFTAG_GEOTRANSMATRIX       34264    /* New Matrix Tag replaces 33920 */
+/* tags 34735-3438 are private tags registered to SPOT Image, Inc */
+#define TIFFTAG_GEOKEYDIRECTORY      34735
+#define TIFFTAG_GEODOUBLEPARAMS      34736
+#define TIFFTAG_GEOASCIIPARAMS       34737
+
+/* 
+ *  Define Printing method flags. These
+ *  flags may be passed in to TIFFPrintDirectory() to
+ *  indicate that those particular field values should
+ *  be printed out in full, rather than just an indicator
+ *  of whether they are present or not.
+ */
+#define	TIFFPRINT_GEOKEYDIRECTORY	0x80000000
+#define	TIFFPRINT_GEOKEYPARAMS		0x40000000
+
+/**********************************************************************
+ *    Nothing below this line should need to be changed by the user.
+ **********************************************************************/
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+extern TIFF CPL_DLL * XTIFFOpen(const char* name, const char* mode);
+extern TIFF CPL_DLL * XTIFFFdOpen(int fd, const char* name, const char* mode);
+extern void CPL_DLL XTIFFClose(TIFF *tif);
+
+extern TIFF CPL_DLL * XTIFFClientOpen(const char* name, const char* mode, 
+                                      thandle_t thehandle,
+                                      TIFFReadWriteProc, TIFFReadWriteProc,
+                                      TIFFSeekProc, TIFFCloseProc,
+                                      TIFFSizeProc,
+                                      TIFFMapFileProc, TIFFUnmapFileProc);
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* __xtiffio_h */
+
diff --git a/src/tiff/xtiffiop.h b/src/tiff/xtiffiop.h
new file mode 100644
index 0000000..e3b3134
--- /dev/null
+++ b/src/tiff/xtiffiop.h
@@ -0,0 +1,90 @@
+/*
+ * Private Extended TIFF library interface.
+ *
+ *  uses private LIBTIFF interface.
+ *
+ *  written by: Niles D. Ritter
+ *
+ *  Revisions:
+ *    18 Sep 1995   -- Deprecated Integraph Matrix tag with new one.
+ *                     Backward compatible support provided.  --NDR.
+ *
+ */
+
+#ifndef __xtiffiop_h
+#define __xtiffiop_h
+
+#include "tiffiop.h"
+#include "xtiffio.h"
+
+/**********************************************************************
+ *               User Configuration
+ **********************************************************************/
+
+/* Define number of extended tags here */
+#define NUM_XFIELD 8
+#define XFIELD_BASE (FIELD_LAST-NUM_XFIELD)
+
+/*  Define Fields here  */
+#define	FIELD_GEOPIXELSCALE     (XFIELD_BASE+0)
+#define	FIELD_INTERGRAPH_MATRIX (XFIELD_BASE+1)
+#define	FIELD_GEOTRANSMATRIX    (XFIELD_BASE+2)
+#define	FIELD_GEOTIEPOINTS      (XFIELD_BASE+3)
+#define	FIELD_GEOASCIIPARAMS    (XFIELD_BASE+4)
+#define	FIELD_GEOKEYDIRECTORY   (XFIELD_BASE+5)
+#define	FIELD_GEODOUBLEPARAMS   (XFIELD_BASE+6)
+#ifdef JPL_TAG_SUPPORT
+#define	FIELD_JPL_CARTO_IFD     (XFIELD_BASE+7)   /* unsupported */
+#endif
+
+/* Used for GEO tags having variable counts */
+typedef enum {
+	GEO_NUM_DIR=0,
+	GEO_NUM_DOUBLE,
+	GEO_NUM_TIEPOINT,
+	GEO_NUM_PIXELSCALE,
+	GEO_NUM_MATRIX,
+	GEO_NUM_IG_MATRIX,
+	GEO_NUM_TAGS
+} geo_count_t;
+
+/* Define Private directory structure here */
+struct XTIFFDirectory {
+	uint16	 xd_geodimensions[GEO_NUM_TAGS]; /* dir-count for the geo tags */
+	uint16*  xd_geokeydirectory;
+	double*  xd_geodoubleparams;
+	char*    xd_geoasciiparams;
+	double*  xd_geotiepoints;
+	double*  xd_geopixelscale;
+	double*  xd_geomatrix;
+	double*  xd_intergraph_matrix;
+#ifdef JPL_TAG_SUPPORT
+	uint32   xd_jpl_ifd_offset; /* dont use */
+#endif
+};
+typedef struct XTIFFDirectory XTIFFDirectory;
+
+/**********************************************************************
+ *    Nothing below this line should need to be changed by the user.
+ **********************************************************************/
+
+struct xtiff {
+	TIFF 		*xtif_tif;	/* parent TIFF pointer */
+	uint32		xtif_flags;
+#define       XTIFFP_PRINT   0x00000001
+	XTIFFDirectory	xtif_dir;	/* internal rep of current directory */
+	TIFFVSetMethod	xtif_vsetfield;	/* inherited tag set routine */
+	TIFFVGetMethod	xtif_vgetfield;	/* inherited tag get routine */
+	TIFFPrintMethod	xtif_printdir;  /* inherited dir print method */
+};
+typedef struct xtiff xtiff;
+
+
+#define PARENT(xt,pmember) ((xt)->xtif_ ## pmember) 
+#define TIFFMEMBER(tf,pmember) ((tf)->tif_ ## pmember) 
+#define XTIFFDIR(tif) ((xtiff *)TIFFMEMBER(tif,clientdir))
+	
+/* Extended TIFF flags */
+#define XTIFF_INITIALIZED 0x80000000
+	
+#endif /* __xtiffiop_h */
diff --git a/src/zlib/ChangeLog b/src/zlib/ChangeLog
new file mode 100644
index 0000000..8012afc
--- /dev/null
+++ b/src/zlib/ChangeLog
@@ -0,0 +1,471 @@
+
+		ChangeLog file for zlib
+
+Changes in 1.1.3 (9 July 1998)
+- fix "an inflate input buffer bug that shows up on rare but persistent
+  occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+  (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+  See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+- Support gzdopen on Mac with Metrowerks (Jason Linhart)
+- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)
+- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)
+- avoid some warnings with Borland C (Tom Tanner)
+- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)
+- emulate utime() for WIN32 in contrib/untgz  (Gilles Vollant)
+- allow several arguments to configure (Tim Mooney, Frodo Looijaard)
+- use libdir and includedir in Makefile.in (Tim Mooney)
+- support shared libraries on OSF1 V4 (Tim Mooney)
+- remove so_locations in "make clean"  (Tim Mooney)
+- fix maketree.c compilation error (Glenn, Mark)
+- Python interface to zlib now in Python 1.5 (Jeremy Hylton)
+- new Makefile.riscos (Rich Walker)
+- initialize static descriptors in trees.c for embedded targets (Nick Smith)
+- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)
+- add the OS/2 files in Makefile.in too (Andrew Zabolotny)
+- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)
+- fix maketree.c to allow clean compilation of inffixed.h (Mark)
+- fix parameter check in deflateCopy (Gunther Nikl)
+- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)
+- Many portability patches by Christian Spieler:
+  . zutil.c, zutil.h: added "const" for zmem*
+  . Make_vms.com: fixed some typos
+  . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists
+  . msdos/Makefile.msc: remove "default rtl link library" info from obj files
+  . msdos/Makefile.*: use model-dependent name for the built zlib library
+  . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:
+     new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)
+- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)
+- replace __far with _far for better portability (Christian Spieler, Tom Lane)
+- fix test for errno.h in configure (Tim Newsham)
+
+Changes in 1.1.2 (19 March 98)
+- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)
+  See http://www.winimage.com/zLibDll/unzip.html
+- preinitialize the inflate tables for fixed codes, to make the code
+  completely thread safe (Mark)
+- some simplifications and slight speed-up to the inflate code (Mark)
+- fix gzeof on non-compressed files (Allan Schrum)
+- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)
+- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)
+- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)
+- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)
+- do not wrap extern "C" around system includes (Tom Lane)
+- mention zlib binding for TCL in README (Andreas Kupries)
+- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)
+- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)
+- allow "configure --prefix $HOME" (Tim Mooney)
+- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)
+- move Makefile.sas to amiga/Makefile.sas
+
+Changes in 1.1.1 (27 Feb 98)
+- fix macros _tr_tally_* in deflate.h for debug mode  (Glenn Randers-Pehrson)
+- remove block truncation heuristic which had very marginal effect for zlib
+  (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
+  compression ratio on some files. This also allows inlining _tr_tally for
+  matches in deflate_slow.
+- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
+
+Changes in 1.1.0 (24 Feb 98)
+- do not return STREAM_END prematurely in inflate (John Bowler)
+- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)
+- compile with -DFASTEST to get compression code optimized for speed only
+- in minigzip, try mmap'ing the input file first (Miguel Albrecht)
+- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain
+  on Sun but significant on HP)
+
+- add a pointer to experimental unzip library in README (Gilles Vollant)
+- initialize variable gcc in configure (Chris Herborth)
+
+Changes in 1.0.9 (17 Feb 1998)
+- added gzputs and gzgets functions
+- do not clear eof flag in gzseek (Mark Diekhans)
+- fix gzseek for files in transparent mode (Mark Diekhans)
+- do not assume that vsprintf returns the number of bytes written (Jens Krinke)
+- replace EXPORT with ZEXPORT to avoid conflict with other programs
+- added compress2 in zconf.h, zlib.def, zlib.dnt
+- new asm code from Gilles Vollant in contrib/asm386
+- simplify the inflate code (Mark):
+ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()
+ . ZALLOC the length list in inflate_trees_fixed() instead of using stack
+ . ZALLOC the value area for huft_build() instead of using stack
+ . Simplify Z_FINISH check in inflate()
+
+- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
+- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
+- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
+  the declaration of FAR (Gilles VOllant)
+- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
+- read_buf buf parameter of type Bytef* instead of charf*
+- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
+- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)
+- fix check for presence of directories in "make install" (Ian Willis)
+
+Changes in 1.0.8 (27 Jan 1998)
+- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)
+- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)
+- added compress2() to allow setting the compression level
+- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
+- use constant arrays for the static trees in trees.c instead of computing
+  them at run time (thanks to Ken Raeburn for this suggestion). To create
+  trees.h, compile with GEN_TREES_H and run "make test".
+- check return code of example in "make test" and display result
+- pass minigzip command line options to file_compress
+- simplifying code of inflateSync to avoid gcc 2.8 bug
+
+- support CC="gcc -Wall" in configure -s (QingLong)
+- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)
+- fix test for shared library support to avoid compiler warnings
+- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)
+- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)
+- do not use fdopen for Metrowerks on Mac (Brad Pettit))
+- add checks for gzputc and gzputc in example.c
+- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)
+- use const for the CRC table (Ken Raeburn)
+- fixed "make uninstall" for shared libraries
+- use Tracev instead of Trace in infblock.c
+- in example.c use correct compressed length for test_sync
+- suppress +vnocompatwarnings in configure for HPUX (not always supported)
+
+Changes in 1.0.7 (20 Jan 1998)
+- fix gzseek which was broken in write mode
+- return error for gzseek to negative absolute position
+- fix configure for Linux (Chun-Chung Chen)
+- increase stack space for MSC (Tim Wegner)
+- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)
+- define EXPORTVA for gzprintf (Gilles Vollant)
+- added man page zlib.3 (Rick Rodgers)
+- for contrib/untgz, fix makedir() and improve Makefile
+
+- check gzseek in write mode in example.c
+- allocate extra buffer for seeks only if gzseek is actually called
+- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)
+- add inflateSyncPoint in zconf.h
+- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def
+
+Changes in 1.0.6 (19 Jan 1998)
+- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
+  gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
+- Fix a deflate bug occuring only with compression level 0 (thanks to
+  Andy Buckler for finding this one).
+- In minigzip, pass transparently also the first byte for .Z files.
+- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
+- check Z_FINISH in inflate (thanks to Marc Schluper)
+- Implement deflateCopy (thanks to Adam Costello)
+- make static libraries by default in configure, add --shared option.
+- move MSDOS or Windows specific files to directory msdos
+- suppress the notion of partial flush to simplify the interface
+  (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
+- suppress history buffer provided by application to simplify the interface
+  (this feature was not implemented anyway in 1.0.4)
+- next_in and avail_in must be initialized before calling inflateInit or
+  inflateInit2
+- add EXPORT in all exported functions (for Windows DLL)
+- added Makefile.nt (thanks to Stephen Williams)
+- added the unsupported "contrib" directory:
+   contrib/asm386/ by Gilles Vollant <info at winimage.com>
+	386 asm code replacing longest_match().
+   contrib/iostream/ by Kevin Ruland <kevin at rodin.wustl.edu>
+        A C++ I/O streams interface to the zlib gz* functions
+   contrib/iostream2/  by Tyge L�vset <Tyge.Lovset at cmr.no>
+	Another C++ I/O streams interface
+   contrib/untgz/  by "Pedro A. Aranda Guti\irrez" <paag at tid.es>
+	A very simple tar.gz file extractor using zlib
+   contrib/visual-basic.txt by Carlos Rios <c_rios at sonda.cl>
+        How to use compress(), uncompress() and the gz* functions from VB.
+- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
+  level) in minigzip (thanks to Tom Lane)
+
+- use const for rommable constants in deflate
+- added test for gzseek and gztell in example.c
+- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
+- add undocumented function zError to convert error code to string
+  (for Tim Smithers)
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
+- Use default memcpy for Symantec MSDOS compiler.
+- Add EXPORT keyword for check_func (needed for Windows DLL)
+- add current directory to LD_LIBRARY_PATH for "make test"
+- create also a link for libz.so.1
+- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)
+- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)
+- added -soname for Linux in configure (Chun-Chung Chen,
+- assign numbers to the exported functions in zlib.def (for Windows DLL)
+- add advice in zlib.h for best usage of deflateSetDictionary
+- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)
+- allow compilation with ANSI keywords only enabled for TurboC in large model
+- avoid "versionString"[0] (Borland bug)
+- add NEED_DUMMY_RETURN for Borland
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
+- allow compilation with CC
+- defined STDC for OS/2 (David Charlap)	
+- limit external names to 8 chars for MVS (Thomas Lund)
+- in minigzip.c, use static buffers only for 16-bit systems
+- fix suffix check for "minigzip -d foo.gz"
+- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)
+- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
+- added makelcc.bat for lcc-win32 (Tom St Denis)
+- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
+- Avoid expanded $Id: ChangeLog,v 1.1 2002/07/30 20:02:47 juan Exp $. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- check for unistd.h in configure (for off_t)
+- remove useless check parameter in inflate_blocks_free
+- avoid useless assignment of s->check to itself in inflate_blocks_new
+- do not flush twice in gzclose (thanks to Ken Raeburn)
+- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h
+- use NO_ERRNO_H instead of enumeration of operating systems with errno.h
+- work around buggy fclose on pipes for HP/UX
+- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)
+- fix configure if CC is already equal to gcc
+
+Changes in 1.0.5 (3 Jan 98)
+- Fix inflate to terminate gracefully when fed corrupted or invalid data
+- Use const for rommable constants in inflate
+- Eliminate memory leaks on error conditions in inflate
+- Removed some vestigial code in inflate
+- Update web address in README
+  
+Changes in 1.0.4 (24 Jul 96)
+- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
+  bit, so the decompressor could decompress all the correct data but went
+  on to attempt decompressing extra garbage data. This affected minigzip too.
+- zlibVersion and gzerror return const char* (needed for DLL)
+- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
+- use z_error only for DEBUG (avoid problem with DLLs)
+
+Changes in 1.0.3 (2 Jul 96)
+- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
+  small and medium models; this makes the library incompatible with previous
+  versions for these models. (No effect in large model or on other systems.)
+- return OK instead of BUF_ERROR if previous deflate call returned with
+  avail_out as zero but there is nothing to do
+- added memcmp for non STDC compilers
+- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
+- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
+- better check for 16-bit mode MSC (avoids problem with Symantec)
+
+Changes in 1.0.2 (23 May 96)
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
+- Bytef is define's instead of typedef'd only for Borland C
+- avoid reading uninitialized memory in example.c
+- mention in README that the zlib format is now RFC1950
+- updated Makefile.dj2
+- added algorithm.doc
+
+Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
+- fix array overlay in deflate.c which sometimes caused bad compressed data
+- fix inflate bug with empty stored block
+- fix MSDOS medium model which was broken in 0.99
+- fix deflateParams() which could generated bad compressed data.
+- Bytef is define'd instead of typedef'ed (work around Borland bug)
+- added an INDEX file
+- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
+  Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
+- speed up adler32 for modern machines without auto-increment
+- added -ansi for IRIX in configure
+- static_init_done in trees.c is an int
+- define unlink as delete for VMS
+- fix configure for QNX
+- add configure branch for SCO and HPUX
+- avoid many warnings (unused variables, dead assignments, etc...)
+- no fdopen for BeOS
+- fix the Watcom fix for 32 bit mode (define FAR as empty)
+- removed redefinition of Byte for MKWERKS
+- work around an MWKERKS bug (incorrect merge of all .h files)
+
+Changes in 0.99 (27 Jan 96)
+- allow preset dictionary shared between compressor and decompressor
+- allow compression level 0 (no compression)
+- add deflateParams in zlib.h: allow dynamic change of compression level
+  and compression strategy.
+- test large buffers and deflateParams in example.c
+- add optional "configure" to build zlib as a shared library
+- suppress Makefile.qnx, use configure instead
+- fixed deflate for 64-bit systems (detected on Cray)
+- fixed inflate_blocks for 64-bit systems (detected on Alpha)
+- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
+- always return Z_BUF_ERROR when deflate() has nothing to do
+- deflateInit and inflateInit are now macros to allow version checking
+- prefix all global functions and types with z_ with -DZ_PREFIX
+- make falloc completely reentrant (inftrees.c)
+- fixed very unlikely race condition in ct_static_init
+- free in reverse order of allocation to help memory manager
+- use zlib-1.0/* instead of zlib/* inside the tar.gz
+- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
+  -Wconversion -Wstrict-prototypes -Wmissing-prototypes"
+- allow gzread on concatenated .gz files
+- deflateEnd now returns Z_DATA_ERROR if it was premature
+- deflate is finally (?) fully deterministic (no matches beyond end of input)
+- Document Z_SYNC_FLUSH
+- add uninstall in Makefile
+- Check for __cpluplus in zlib.h
+- Better test in ct_align for partial flush
+- avoid harmless warnings for Borland C++
+- initialize hash_head in deflate.c
+- avoid warning on fdopen (gzio.c) for HP cc -Aa
+- include stdlib.h for STDC compilers
+- include errno.h for Cray
+- ignore error if ranlib doesn't exist
+- call ranlib twice for NeXTSTEP
+- use exec_prefix instead of prefix for libz.a
+- renamed ct_* as _tr_* to avoid conflict with applications
+- clear z->msg in inflateInit2 before any error return
+- initialize opaque in example.c, gzio.c, deflate.c and inflate.c
+- fixed typo in zconf.h (_GNUC__ => __GNUC__)
+- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)
+- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
+- in fcalloc, normalize pointer if size > 65520 bytes
+- don't use special fcalloc for 32 bit Borland C++
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use Z_BINARY instead of BINARY
+- document that gzclose after gzdopen will close the file
+- allow "a" as mode in gzopen.
+- fix error checking in gzread
+- allow skipping .gz extra-field on pipes
+- added reference to Perl interface in README
+- put the crc table in FAR data (I dislike more and more the medium model :)
+- added get_crc_table
+- added a dimension to all arrays (Borland C can't count).
+- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
+- guard against multiple inclusion of *.h (for precompiled header on Mac)
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
+- don't use unsized arrays to avoid silly warnings by Visual C++:
+     warning C4746: 'inflate_mask' : unsized array treated as  '__far'
+     (what's wrong with far data in far model?).
+- define enum out of inflate_blocks_state to allow compilation with C++
+
+Changes in 0.95 (16 Aug 95)
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+  not completely flushed in rare occasions).
+- default window size is same for compression and decompression
+  (it's now sufficient to set MAX_WBITS in zconf.h).
+- voidp -> voidpf and voidnp -> voidp (for consistency with other
+  typedefs and because voidnp was not near in large model).
+
+Changes in 0.94 (13 Aug 95)
+- support MSDOS medium model
+- fix deflate with flush (could sometimes generate bad output)
+- fix deflateReset (zlib header was incorrectly suppressed)
+- added support for VMS
+- allow a compression level in gzopen()
+- gzflush now calls fflush
+- For deflate with flush, flush even if no more input is provided.
+- rename libgz.a as libz.a
+- avoid complex expression in infcodes.c triggering Turbo C bug
+- work around a problem with gcc on Alpha (in INSERT_STRING)
+- don't use inline functions (problem with some gcc versions)
+- allow renaming of Byte, uInt, etc... with #define.
+- avoid warning about (unused) pointer before start of array in deflate.c
+- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
+- avoid reserved word 'new' in trees.c
+
+Changes in 0.93 (25 June 95)
+- temporarily disable inline functions
+- make deflate deterministic
+- give enough lookahead for PARTIAL_FLUSH
+- Set binary mode for stdin/stdout in minigzip.c for OS/2
+- don't even use signed char in inflate (not portable enough)
+- fix inflate memory leak for segmented architectures
+
+Changes in 0.92 (3 May 95)
+- don't assume that char is signed (problem on SGI)
+- Clear bit buffer when starting a stored block
+- no memcpy on Pyramid
+- suppressed inftest.c
+- optimized fill_window, put longest_match inline for gcc
+- optimized inflate on stored blocks.
+- untabify all sources to simplify patches
+
+Changes in 0.91 (2 May 95)
+- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h
+- Document the memory requirements in zconf.h
+- added "make install"
+- fix sync search logic in inflateSync
+- deflate(Z_FULL_FLUSH) now works even if output buffer too short
+- after inflateSync, don't scare people with just "lo world"
+- added support for DJGPP
+
+Changes in 0.9 (1 May 95)
+- don't assume that zalloc clears the allocated memory (the TurboC bug
+  was Mark's bug after all :)
+- let again gzread copy uncompressed data unchanged (was working in 0.71)
+- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
+- added a test of inflateSync in example.c
+- moved MAX_WBITS to zconf.h because users might want to change that.
+- document explicitly that zalloc(64K) on MSDOS must return a normalized
+  pointer (zero offset)
+- added Makefiles for Microsoft C, Turbo C, Borland C++
+- faster crc32()
+
+Changes in 0.8 (29 April 95)
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+  is incompatible with previous versions of zlib which returned Z_OK.
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
+  (actually that was not a compiler bug, see 0.81 above)
+- gzread no longer reads one extra byte in certain cases
+- In gzio destroy(), don't reference a freed structure
+- avoid many warnings for MSDOS
+- avoid the ERROR symbol which is used by MS Windows
+
+Changes in 0.71 (14 April 95)
+- Fixed more MSDOS compilation problems :( There is still a bug with
+  TurboC large model.
+
+Changes in 0.7 (14 April 95)
+- Added full inflate support.
+- Simplified the crc32() interface. The pre- and post-conditioning
+  (one's complement) is now done inside crc32(). WARNING: this is
+  incompatible with previous versions; see zlib.h for the new usage.
+
+Changes in 0.61 (12 April 95)
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
+
+Changes in 0.6 (11 April 95)
+- added minigzip.c
+- added gzdopen to reopen a file descriptor as gzFile
+- added transparent reading of non-gziped files in gzread.
+- fixed bug in gzread (don't read crc as data)
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
+- don't allocate big arrays in the stack (for MSDOS)
+- fix some MSDOS compilation problems
+
+Changes in 0.5:
+- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
+  not yet Z_FULL_FLUSH.
+- support decompression but only in a single step (forced Z_FINISH)
+- added opaque object for zalloc and zfree.
+- added deflateReset and inflateReset
+- added a variable zlib_version for consistency checking.
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
+  Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
+
+Changes in 0.4:
+- avoid "zip" everywhere, use zlib instead of ziplib.
+- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
+  if compression method == 8.
+- added adler32 and crc32
+- renamed deflateOptions as deflateInit2, call one or the other but not both
+- added the method parameter for deflateInit2.
+- added inflateInit2
+- simplied considerably deflateInit and inflateInit by not supporting
+  user-provided history buffer. This is supported only in deflateInit2
+  and inflateInit2.
+
+Changes in 0.3:
+- prefix all macro names with Z_
+- use Z_FINISH instead of deflateEnd to finish compression.
+- added Z_HUFFMAN_ONLY
+- added gzerror()
diff --git a/src/zlib/FAQ b/src/zlib/FAQ
new file mode 100644
index 0000000..0feb6d3
--- /dev/null
+++ b/src/zlib/FAQ
@@ -0,0 +1,72 @@
+
+		Frequently Asked Questions about zlib
+
+
+If your question is not there, please check the zlib home page 
+http://www.cdrom.com/pub/infozip/zlib/ which may have more recent information.
+
+
+1) I need a Windows DLL
+2) I need a Visual Basic interface to zlib
+3) compress() returns Z_BUF_ERROR
+4) deflate or inflate returns Z_BUF_ERROR
+5) Where is the zlib documentation (man pages, etc...)?
+6) Why don't you use GNU autoconf, libtool, etc...?
+7) There is a bug in zlib.
+8) I get "undefined reference to gzputc"
+
+
+
+1) I need a Windows DLL
+
+  The zlib sources can be compiled without change to produce a DLL.
+  If you want a precompiled DLL, see http://www.winimage.com/zLibDll
+
+
+2) I need a Visual Basic interface to zlib
+
+  See http://www.tcfb.com/dowseware/cmp-z-it.zip
+      http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+  and contrib/visual-basic.txt
+
+3) compress() returns Z_BUF_ERROR
+
+  Make sure that before the call of compress, the length of the
+  compressed buffer is equal to the total size of the compressed buffer
+  and not zero.  For Visual Basic, check that this parameter is passed
+  by reference ("as any"), not by value ("as long").
+
+
+4) deflate or inflate returns Z_BUF_ERROR
+
+  Make sure that before the call avail_in and avail_out are not zero.
+
+
+5) Where is the zlib documentation (man pages, etc...)?
+
+  It's in zlib.h for the moment. Volunteers to transform this
+  to man pages, please contact jloup at gzip.org. Examples of zlib usage
+  are in the files example.c and minigzip.c.
+
+
+6) Why don't you use GNU autoconf, libtool, etc...?
+
+  Because we would like to keep zlib as a very small and simple package.
+  zlib is rather portable and doesn't need much configuration.
+
+
+7) There is a bug in zlib.
+
+  Most of the time, such problems are due to an incorrect usage
+  of zlib. Please try to reproduce the problem with a small
+  program and send us the corresponding source at zlib at quest.jpl.nasa.gov
+  Do not send multi-megabyte data files without prior agreement.
+
+
+8) I get "undefined reference to gzputc"
+
+  If "make test" produces something like
+     example.o(.text+0x174): 
+  check that you don't have old files libz.* in /usr/lib, /usr/local/lib
+  or /usr/X11R6/lib. Remove old versions then do "make install".
+
diff --git a/src/zlib/Makefile b/src/zlib/Makefile
new file mode 100644
index 0000000..8212584
--- /dev/null
+++ b/src/zlib/Makefile
@@ -0,0 +1,99 @@
+# Makefile for zlib (MSVC + NMAKE; others?)
+#
+# GRR 1998.10.21:  This makefile now builds both shared (DLL) and static
+#   libraries.  Objects ending in ".obj" are the static ones; those ending
+#   in ".objdll" are "position-independent" DLL objects.  Since cl.exe
+#   doesn't seem to honor the -out: option, the .objdll flavor are renamed
+#   using what is probably an NMAKE-specific feature:  %|xF, where "x" is
+#   some combo of d (drive), p (path, including drive), f (file basename)
+#   and e (extension).  The useful output is zlibstat.lib (the static version),
+#   zlibdll.lib (the DLL import or stub library with which one links), and
+#   zlib.dll (the DLL itself, required at runtime).  To build only one or the
+#   other, remove either zlib.dll or zlibstat.lib from the "all:" target.
+#
+#   SUMMARY:  Link programs with either zlibstat.lib or zlibdll.lib.  If the
+#             latter, be sure to distribute zlib.dll with the executable(s).
+
+!include <ntwin32.mak>
+
+CC=cl
+LD=link
+CFLAGS=-nologo -O
+LDFLAGS=
+O=.obj
+OD=.objdll
+
+# variables
+OBJ1 = adler32$(O) compress$(O) crc32$(O) gzio$(O) uncompr$(O)
+OBJ2 = deflate$(O) trees$(O) zutil$(O) inflate$(O) infblock$(O)
+OBJ3 = inftrees$(O) infcodes$(O) infutil$(O) inffast$(O)
+OBJS = $(OBJ1) $(OBJ2) $(OBJ3)
+
+OBJD1 = adler32$(OD) compress$(OD) crc32$(OD) gzio$(OD) uncompr$(OD)
+OBJD2 = deflate$(OD) trees$(OD) zutil$(OD) inflate$(OD) infblock$(OD)
+OBJD3 = inftrees$(OD) infcodes$(OD) infutil$(OD) inffast$(OD)
+OBJSDLL = $(OBJD1) $(OBJD2) $(OBJD3)
+
+.SUFFIXES: .objdll
+
+# [see %devstudio%\vc\include\win32.mak for macro definitions]
+.c.obj:
+	$(CC) -c $(CFLAGS) $(cvars) $<
+
+# -out: doesn't work with cl.exe (some other option? RTFM, I suppose...)
+.c.objdll:
+#	$(CC) -c $(CFLAGS) $(cvarsdll) -out:$@ $<
+	$(CC) -c $(CFLAGS) $(cvarsdll) $<
+	ren %|fF.obj $@
+
+all:  zlib.dll zlibstat.lib example.exe minigzip.exe
+
+adler32$(O) adler32$(OD):	adler32.c zutil.h zlib.h zconf.h
+compress$(O) compress$(OD):	compress.c zlib.h zconf.h
+crc32$(O) crc32$(OD):		crc32.c zutil.h zlib.h zconf.h
+deflate$(O) deflate$(OD):	deflate.c deflate.h zutil.h zlib.h zconf.h
+gzio$(O) gzio$(OD):		gzio.c zutil.h zlib.h zconf.h
+infblock$(O) infblock$(OD):	infblock.c zutil.h zlib.h zconf.h inftrees.h \
+  infutil.h infcodes.h infblock.h
+infcodes$(O) infcodes$(OD):	infcodes.c zutil.h zlib.h zconf.h inftrees.h \
+  infutil.h infcodes.h inffast.h
+inflate$(O) inflate$(OD):	inflate.c zutil.h zlib.h zconf.h infblock.h
+inftrees$(O) inftrees$(OD):	inftrees.c zutil.h zlib.h zconf.h inftrees.h
+infutil$(O) infutil$(OD):	infutil.c zutil.h zlib.h zconf.h inftrees.h \
+  infutil.h
+inffast$(O) inffast$(OD):	inffast.c zutil.h zlib.h zconf.h inftrees.h \
+  infutil.h inffast.h
+trees$(O) trees$(OD):		trees.c deflate.h zutil.h zlib.h zconf.h
+uncompr$(O) uncompr$(OD):	uncompr.c zlib.h zconf.h
+zutil$(O) zutil$(OD):		zutil.c zutil.h zlib.h zconf.h
+
+example$(O): example.c zlib.h zconf.h
+minigzip$(O): minigzip.c zlib.h zconf.h
+
+zlib.dll: $(OBJSDLL) nt/zlib.dnt
+	link $(dlllflags) -out:$@ -def:nt/zlib.dnt $(OBJSDLL) $(guilibsdll)
+	-ren zlib.lib zlibdll.lib
+
+zlibstat.lib: $(OBJS)
+	lib -nologo -out:$@ $(OBJS)
+
+zlibdll.lib: zlib.dll
+
+example.exe: example.obj zlibdll.lib
+	$(LD) $(LDFLAGS) example.obj zlibdll.lib
+
+minigzip.exe: minigzip.obj zlibdll.lib
+	$(LD) $(LDFLAGS) minigzip.obj zlibdll.lib 
+
+test: example.exe minigzip.exe
+	example
+	echo hello world | minigzip | minigzip -d 
+
+clean:
+	del *.objdll
+	del *.obj
+	del *.exe
+	del *.dll
+	del *.lib
+	del zlib.exp
+	del foo.gz
diff --git a/src/zlib/README b/src/zlib/README
new file mode 100644
index 0000000..8ff4587
--- /dev/null
+++ b/src/zlib/README
@@ -0,0 +1,148 @@
+zlib 1.1.3 is a general purpose data compression library.  All the code
+is thread safe.  The data format used by the zlib library
+is described by RFCs (Request for Comments) 1950 to 1952 in the files 
+ftp://ds.internic.net/rfc/rfc1950.txt (zlib format), rfc1951.txt (deflate
+format) and rfc1952.txt (gzip format). These documents are also available in
+other formats from ftp://ftp.uu.net/graphics/png/documents/zlib/zdoc-index.html
+
+All functions of the compression library are documented in the file zlib.h
+(volunteer to write man pages welcome, contact jloup at gzip.org). A usage
+example of the library is given in the file example.c which also tests that
+the library is working correctly. Another example is given in the file
+minigzip.c. The compression library itself is composed of all source files
+except example.c and minigzip.c.
+
+To compile all files and run the test program, follow the instructions
+given at the top of Makefile. In short "make test; make install"
+should work for most machines. For Unix: "configure; make test; make install"
+For MSDOS, use one of the special makefiles such as Makefile.msc.
+For VMS, use Make_vms.com or descrip.mms.
+
+Questions about zlib should be sent to <zlib at quest.jpl.nasa.gov>, or to
+Gilles Vollant <info at winimage.com> for the Windows DLL version.
+The zlib home page is http://www.cdrom.com/pub/infozip/zlib/
+The official zlib ftp site is ftp://ftp.cdrom.com/pub/infozip/zlib/
+Before reporting a problem, please check those sites to verify that
+you have the latest version of zlib; otherwise get the latest version and
+check whether the problem still exists or not.
+
+Mark Nelson <markn at tiny.com> wrote an article about zlib for the Jan. 1997
+issue of  Dr. Dobb's Journal; a copy of the article is available in
+http://web2.airmail.net/markn/articles/zlibtool/zlibtool.htm
+
+The changes made in version 1.1.3 are documented in the file ChangeLog.
+The main changes since 1.1.2 are:
+
+- fix "an inflate input buffer bug that shows up on rare but persistent
+  occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+  (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+  See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+plus many changes for portability.
+
+Unsupported third party contributions are provided in directory "contrib".
+
+A Java implementation of zlib is available in the Java Development Kit 1.1
+http://www.javasoft.com/products/JDK/1.1/docs/api/Package-java.util.zip.html
+See the zlib home page http://www.cdrom.com/pub/infozip/zlib/ for details.
+
+A Perl interface to zlib written by Paul Marquess <pmarquess at bfsec.bt.co.uk>
+is in the CPAN (Comprehensive Perl Archive Network) sites, such as:
+ftp://ftp.cis.ufl.edu/pub/perl/CPAN/modules/by-module/Compress/Compress-Zlib*
+
+A Python interface to zlib written by A.M. Kuchling <amk at magnet.com>
+is available in Python 1.5 and later versions, see
+http://www.python.org/doc/lib/module-zlib.html
+
+A zlib binding for TCL written by Andreas Kupries <a.kupries at westend.com>
+is availlable at http://www.westend.com/~kupries/doc/trf/man/man.html
+
+An experimental package to read and write files in .zip format,
+written on top of zlib by Gilles Vollant <info at winimage.com>, is
+available at http://www.winimage.com/zLibDll/unzip.html
+and also in the contrib/minizip directory of zlib.
+
+
+Notes for some targets:
+
+- To build a Windows DLL version, include in a DLL project zlib.def, zlib.rc
+  and all .c files except example.c and minigzip.c; compile with -DZLIB_DLL
+  The zlib DLL support was initially done by Alessandro Iacopetti and is
+  now maintained by Gilles Vollant <info at winimage.com>. Check the zlib DLL
+  home page at http://www.winimage.com/zLibDll
+
+  From Visual Basic, you can call the DLL functions which do not take
+  a structure as argument: compress, uncompress and all gz* functions.
+  See contrib/visual-basic.txt for more information, or get
+  http://www.tcfb.com/dowseware/cmp-z-it.zip
+
+- For 64-bit Irix, deflate.c must be compiled without any optimization.
+  With -O, one libpng test fails. The test works in 32 bit mode (with
+  the -n32 compiler flag). The compiler bug has been reported to SGI.
+
+- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1   
+  it works when compiled with cc.
+
+- on Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1
+  is necessary to get gzprintf working correctly. This is done by configure.
+
+- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works
+  with other compilers. Use "make test" to check your compiler.
+
+- gzdopen is not supported on RISCOS, BEOS and by some Mac compilers.
+
+- For Turbo C the small model is supported only with reduced performance to
+  avoid any far allocation; it was tested with -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+
+- For PalmOs, see http://www.cs.uit.no/~perm/PASTA/pilot/software.html
+  Per Harald Myrvang <perm at stud.cs.uit.no>
+
+
+Acknowledgments:
+
+  The deflate format used by zlib was defined by Phil Katz. The deflate
+  and zlib specifications were written by L. Peter Deutsch. Thanks to all the
+  people who reported problems and suggested various improvements in zlib;
+  they are too numerous to cite here.
+
+Copyright notice:
+
+ (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup at gzip.org          madler at alumni.caltech.edu
+
+If you use the zlib library in a product, we would appreciate *not*
+receiving lengthy legal documents to sign. The sources are provided
+for free but without warranty of any kind.  The library has been
+entirely written by Jean-loup Gailly and Mark Adler; it does not
+include third-party code.
+
+If you redistribute modified sources, we would appreciate that you include
+in the file ChangeLog history information documenting your changes.
diff --git a/src/zlib/algorithm.txt b/src/zlib/algorithm.txt
new file mode 100644
index 0000000..f488cd1
--- /dev/null
+++ b/src/zlib/algorithm.txt
@@ -0,0 +1,213 @@
+1. Compression algorithm (deflate)
+
+The deflation algorithm used by gzip (also zip and zlib) is a variation of
+LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in
+the input data.  The second occurrence of a string is replaced by a
+pointer to the previous string, in the form of a pair (distance,
+length).  Distances are limited to 32K bytes, and lengths are limited
+to 258 bytes. When a string does not occur anywhere in the previous
+32K bytes, it is emitted as a sequence of literal bytes.  (In this
+description, `string' must be taken as an arbitrary sequence of bytes,
+and is not restricted to printable characters.)
+
+Literals or match lengths are compressed with one Huffman tree, and
+match distances are compressed with another tree. The trees are stored
+in a compact form at the start of each block. The blocks can have any
+size (except that the compressed data for one block must fit in
+available memory). A block is terminated when deflate() determines that
+it would be useful to start another block with fresh trees. (This is
+somewhat similar to the behavior of LZW-based _compress_.)
+
+Duplicated strings are found using a hash table. All input strings of
+length 3 are inserted in the hash table. A hash index is computed for
+the next 3 bytes. If the hash chain for this index is not empty, all
+strings in the chain are compared with the current input string, and
+the longest match is selected.
+
+The hash chains are searched starting with the most recent strings, to
+favor small distances and thus take advantage of the Huffman encoding.
+The hash chains are singly linked. There are no deletions from the
+hash chains, the algorithm simply discards matches that are too old.
+
+To avoid a worst-case situation, very long hash chains are arbitrarily
+truncated at a certain length, determined by a runtime option (level
+parameter of deflateInit). So deflate() does not always find the longest
+possible match but generally finds a match which is long enough.
+
+deflate() also defers the selection of matches with a lazy evaluation
+mechanism. After a match of length N has been found, deflate() searches for
+a longer match at the next input byte. If a longer match is found, the
+previous match is truncated to a length of one (thus producing a single
+literal byte) and the process of lazy evaluation begins again. Otherwise,
+the original match is kept, and the next match search is attempted only N
+steps later.
+
+The lazy match evaluation is also subject to a runtime parameter. If
+the current match is long enough, deflate() reduces the search for a longer
+match, thus speeding up the whole process. If compression ratio is more
+important than speed, deflate() attempts a complete second search even if
+the first match is already long enough.
+
+The lazy match evaluation is not performed for the fastest compression
+modes (level parameter 1 to 3). For these fast modes, new strings
+are inserted in the hash table only when no match was found, or
+when the match is not too long. This degrades the compression ratio
+but saves time since there are both fewer insertions and fewer searches.
+
+
+2. Decompression algorithm (inflate)
+
+2.1 Introduction
+
+The real question is, given a Huffman tree, how to decode fast.  The most
+important realization is that shorter codes are much more common than
+longer codes, so pay attention to decoding the short codes fast, and let
+the long codes take longer to decode.
+
+inflate() sets up a first level table that covers some number of bits of
+input less than the length of longest code.  It gets that many bits from the
+stream, and looks it up in the table.  The table will tell if the next
+code is that many bits or less and how many, and if it is, it will tell
+the value, else it will point to the next level table for which inflate()
+grabs more bits and tries to decode a longer code.
+
+How many bits to make the first lookup is a tradeoff between the time it
+takes to decode and the time it takes to build the table.  If building the
+table took no time (and if you had infinite memory), then there would only
+be a first level table to cover all the way to the longest code.  However,
+building the table ends up taking a lot longer for more bits since short
+codes are replicated many times in such a table.  What inflate() does is
+simply to make the number of bits in the first table a variable, and set it
+for the maximum speed.
+
+inflate() sends new trees relatively often, so it is possibly set for a
+smaller first level table than an application that has only one tree for
+all the data.  For inflate, which has 286 possible codes for the
+literal/length tree, the size of the first table is nine bits.  Also the
+distance trees have 30 possible values, and the size of the first table is
+six bits.  Note that for each of those cases, the table ended up one bit
+longer than the ``average'' code length, i.e. the code length of an
+approximately flat code which would be a little more than eight bits for
+286 symbols and a little less than five bits for 30 symbols.  It would be
+interesting to see if optimizing the first level table for other
+applications gave values within a bit or two of the flat code size.
+
+
+2.2 More details on the inflate table lookup
+
+Ok, you want to know what this cleverly obfuscated inflate tree actually  
+looks like.  You are correct that it's not a Huffman tree.  It is simply a  
+lookup table for the first, let's say, nine bits of a Huffman symbol.  The  
+symbol could be as short as one bit or as long as 15 bits.  If a particular  
+symbol is shorter than nine bits, then that symbol's translation is duplicated
+in all those entries that start with that symbol's bits.  For example, if the  
+symbol is four bits, then it's duplicated 32 times in a nine-bit table.  If a  
+symbol is nine bits long, it appears in the table once.
+
+If the symbol is longer than nine bits, then that entry in the table points  
+to another similar table for the remaining bits.  Again, there are duplicated  
+entries as needed.  The idea is that most of the time the symbol will be short
+and there will only be one table look up.  (That's whole idea behind data  
+compression in the first place.)  For the less frequent long symbols, there  
+will be two lookups.  If you had a compression method with really long  
+symbols, you could have as many levels of lookups as is efficient.  For  
+inflate, two is enough.
+
+So a table entry either points to another table (in which case nine bits in  
+the above example are gobbled), or it contains the translation for the symbol  
+and the number of bits to gobble.  Then you start again with the next  
+ungobbled bit.
+
+You may wonder: why not just have one lookup table for how ever many bits the  
+longest symbol is?  The reason is that if you do that, you end up spending  
+more time filling in duplicate symbol entries than you do actually decoding.   
+At least for deflate's output that generates new trees every several 10's of  
+kbytes.  You can imagine that filling in a 2^15 entry table for a 15-bit code  
+would take too long if you're only decoding several thousand symbols.  At the  
+other extreme, you could make a new table for every bit in the code.  In fact,
+that's essentially a Huffman tree.  But then you spend two much time  
+traversing the tree while decoding, even for short symbols.
+
+So the number of bits for the first lookup table is a trade of the time to  
+fill out the table vs. the time spent looking at the second level and above of
+the table.
+
+Here is an example, scaled down:
+
+The code being decoded, with 10 symbols, from 1 to 6 bits long:
+
+A: 0
+B: 10
+C: 1100
+D: 11010
+E: 11011
+F: 11100
+G: 11101
+H: 11110
+I: 111110
+J: 111111
+
+Let's make the first table three bits long (eight entries):
+
+000: A,1
+001: A,1
+010: A,1
+011: A,1
+100: B,2
+101: B,2
+110: -> table X (gobble 3 bits)
+111: -> table Y (gobble 3 bits)
+
+Each entry is what the bits decode to and how many bits that is, i.e. how  
+many bits to gobble.  Or the entry points to another table, with the number of
+bits to gobble implicit in the size of the table.
+
+Table X is two bits long since the longest code starting with 110 is five bits
+long:
+
+00: C,1
+01: C,1
+10: D,2
+11: E,2
+
+Table Y is three bits long since the longest code starting with 111 is six  
+bits long:
+
+000: F,2
+001: F,2
+010: G,2
+011: G,2
+100: H,2
+101: H,2
+110: I,3
+111: J,3
+
+So what we have here are three tables with a total of 20 entries that had to  
+be constructed.  That's compared to 64 entries for a single table.  Or  
+compared to 16 entries for a Huffman tree (six two entry tables and one four  
+entry table).  Assuming that the code ideally represents the probability of  
+the symbols, it takes on the average 1.25 lookups per symbol.  That's compared
+to one lookup for the single table, or 1.66 lookups per symbol for the  
+Huffman tree.
+
+There, I think that gives you a picture of what's going on.  For inflate, the  
+meaning of a particular symbol is often more than just a letter.  It can be a  
+byte (a "literal"), or it can be either a length or a distance which  
+indicates a base value and a number of bits to fetch after the code that is  
+added to the base value.  Or it might be the special end-of-block code.  The  
+data structures created in inftrees.c try to encode all that information  
+compactly in the tables.
+
+
+Jean-loup Gailly        Mark Adler
+jloup at gzip.org          madler at alumni.caltech.edu
+
+
+References:
+
+[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data
+Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,
+pp. 337-343.
+
+``DEFLATE Compressed Data Format Specification'' available in
+ftp://ds.internic.net/rfc/rfc1951.txt
diff --git a/src/zlib/zconf.h b/src/zlib/zconf.h
new file mode 100644
index 0000000..c54ceff
--- /dev/null
+++ b/src/zlib/zconf.h
@@ -0,0 +1,279 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-1998 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h 
+ */
+
+/* @(#) $Id: zconf.h,v 1.1 2002/07/30 20:02:48 juan Exp $ */
+
+#ifndef _ZCONF_H
+#define _ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ */
+#ifdef Z_PREFIX
+#  define deflateInit_	z_deflateInit_
+#  define deflate	z_deflate
+#  define deflateEnd	z_deflateEnd
+#  define inflateInit_ 	z_inflateInit_
+#  define inflate	z_inflate
+#  define inflateEnd	z_inflateEnd
+#  define deflateInit2_	z_deflateInit2_
+#  define deflateSetDictionary z_deflateSetDictionary
+#  define deflateCopy	z_deflateCopy
+#  define deflateReset	z_deflateReset
+#  define deflateParams	z_deflateParams
+#  define inflateInit2_	z_inflateInit2_
+#  define inflateSetDictionary z_inflateSetDictionary
+#  define inflateSync	z_inflateSync
+#  define inflateSyncPoint z_inflateSyncPoint
+#  define inflateReset	z_inflateReset
+#  define compress	z_compress
+#  define compress2	z_compress2
+#  define uncompress	z_uncompress
+#  define adler32	z_adler32
+#  define crc32		z_crc32
+#  define get_crc_table z_get_crc_table
+
+#  define Byte		z_Byte
+#  define uInt		z_uInt
+#  define uLong		z_uLong
+#  define Bytef	        z_Bytef
+#  define charf		z_charf
+#  define intf		z_intf
+#  define uIntf		z_uIntf
+#  define uLongf	z_uLongf
+#  define voidpf	z_voidpf
+#  define voidp		z_voidp
+#endif
+
+#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
+#  define WIN32
+#endif
+#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
+#  ifndef __32BIT__
+#    define __32BIT__
+#  endif
+#endif
+#if defined(__MSDOS__) && !defined(MSDOS)
+#  define MSDOS
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#if defined(MSDOS) && !defined(__32BIT__)
+#  define MAXSEG_64K
+#endif
+#ifdef MSDOS
+#  define UNALIGNED_OK
+#endif
+
+#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32))  && !defined(STDC)
+#  define STDC
+#endif
+#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
+#  ifndef STDC
+#    define STDC
+#  endif
+#endif
+
+#ifndef STDC
+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+#    define const
+#  endif
+#endif
+
+/* Some Mac compilers merge all .h files incorrectly: */
+#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
+#  define NO_DUMMY_DECL
+#endif
+
+/* Old Borland C incorrectly complains about missing returns: */
+#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
+#  define NEED_DUMMY_RETURN
+#endif
+
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+#  ifdef MAXSEG_64K
+#    define MAX_MEM_LEVEL 8
+#  else
+#    define MAX_MEM_LEVEL 9
+#  endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+#  define MAX_WBITS   15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+            (1 << (windowBits+2)) +  (1 << (memLevel+9))
+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+   The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes
+ for small objects.
+*/
+
+                        /* Type declarations */
+
+#ifndef OF /* function prototypes */
+#  ifdef STDC
+#    define OF(args)  args
+#  else
+#    define OF(args)  ()
+#  endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
+   /* MSC small or medium model */
+#  define SMALL_MEDIUM
+#  ifdef _MSC_VER
+#    define FAR _far
+#  else
+#    define FAR far
+#  endif
+#endif
+#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
+#  ifndef __32BIT__
+#    define SMALL_MEDIUM
+#    define FAR _far
+#  endif
+#endif
+
+/* Compile with -DZLIB_DLL for Windows DLL support */
+#if defined(ZLIB_DLL)
+#  if defined(_WINDOWS) || defined(WINDOWS)
+#    ifdef FAR
+#      undef FAR
+#    endif
+#    include <windows.h>
+#    define ZEXPORT  WINAPI
+#    ifdef WIN32
+#      define ZEXPORTVA  WINAPIV
+#    else
+#      define ZEXPORTVA  FAR _cdecl _export
+#    endif
+#  endif
+#  if defined (__BORLANDC__)
+#    if (__BORLANDC__ >= 0x0500) && defined (WIN32)
+#      include <windows.h>
+#      define ZEXPORT __declspec(dllexport) WINAPI
+#      define ZEXPORTRVA __declspec(dllexport) WINAPIV
+#    else
+#      if defined (_Windows) && defined (__DLL__)
+#        define ZEXPORT _export
+#        define ZEXPORTVA _export
+#      endif
+#    endif
+#  endif
+#endif
+
+#if defined (__BEOS__)
+#  if defined (ZLIB_DLL)
+#    define ZEXTERN extern __declspec(dllexport)
+#  else
+#    define ZEXTERN extern __declspec(dllimport)
+#  endif
+#endif
+
+#ifndef ZEXPORT
+#  define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+#  define ZEXPORTVA
+#endif
+#ifndef ZEXTERN
+#  define ZEXTERN extern
+#endif
+
+#ifndef FAR
+#   define FAR
+#endif
+
+#if !defined(MACOS) && !defined(TARGET_OS_MAC)
+typedef unsigned char  Byte;  /* 8 bits */
+#endif
+typedef unsigned int   uInt;  /* 16 bits or more */
+typedef unsigned long  uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+#  define Bytef Byte FAR
+#else
+   typedef Byte  FAR Bytef;
+#endif
+typedef char  FAR charf;
+typedef int   FAR intf;
+typedef uInt  FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+   typedef void FAR *voidpf;
+   typedef void     *voidp;
+#else
+   typedef Byte FAR *voidpf;
+   typedef Byte     *voidp;
+#endif
+
+#ifdef HAVE_UNISTD_H
+#  include <sys/types.h> /* for off_t */
+#  include <unistd.h>    /* for SEEK_* and off_t */
+#  define z_off_t  off_t
+#endif
+#ifndef SEEK_SET
+#  define SEEK_SET        0       /* Seek from beginning of file.  */
+#  define SEEK_CUR        1       /* Seek from current position.  */
+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */
+#endif
+#ifndef z_off_t
+#  define  z_off_t long
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+#   pragma map(deflateInit_,"DEIN")
+#   pragma map(deflateInit2_,"DEIN2")
+#   pragma map(deflateEnd,"DEEND")
+#   pragma map(inflateInit_,"ININ")
+#   pragma map(inflateInit2_,"ININ2")
+#   pragma map(inflateEnd,"INEND")
+#   pragma map(inflateSync,"INSY")
+#   pragma map(inflateSetDictionary,"INSEDI")
+#   pragma map(inflate_blocks,"INBL")
+#   pragma map(inflate_blocks_new,"INBLNE")
+#   pragma map(inflate_blocks_free,"INBLFR")
+#   pragma map(inflate_blocks_reset,"INBLRE")
+#   pragma map(inflate_codes_free,"INCOFR")
+#   pragma map(inflate_codes,"INCO")
+#   pragma map(inflate_fast,"INFA")
+#   pragma map(inflate_flush,"INFLU")
+#   pragma map(inflate_mask,"INMA")
+#   pragma map(inflate_set_dictionary,"INSEDI2")
+#   pragma map(inflate_copyright,"INCOPY")
+#   pragma map(inflate_trees_bits,"INTRBI")
+#   pragma map(inflate_trees_dynamic,"INTRDY")
+#   pragma map(inflate_trees_fixed,"INTRFI")
+#   pragma map(inflate_trees_free,"INTRFR")
+#endif
+
+#endif /* _ZCONF_H */
diff --git a/src/zlib/zlib.h b/src/zlib/zlib.h
new file mode 100644
index 0000000..49f56b4
--- /dev/null
+++ b/src/zlib/zlib.h
@@ -0,0 +1,893 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+  version 1.1.3, July 9th, 1998
+
+  Copyright (C) 1995-1998 Jean-loup Gailly and Mark Adler
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+
+  Jean-loup Gailly        Mark Adler
+  jloup at gzip.org          madler at alumni.caltech.edu
+
+
+  The data format used by the zlib library is described by RFCs (Request for
+  Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
+  (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef _ZLIB_H
+#define _ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.1.3"
+
+/* 
+     The 'zlib' compression library provides in-memory compression and
+  decompression functions, including integrity checks of the uncompressed
+  data.  This version of the library supports only one compression method
+  (deflation) but other algorithms will be added later and will have the same
+  stream interface.
+
+     Compression can be done in a single step if the buffers are large
+  enough (for example if an input file is mmap'ed), or can be done by
+  repeated calls of the compression function.  In the latter case, the
+  application must provide more input and/or consume the output
+  (providing more output space) before each call.
+
+     The library also supports reading and writing files in gzip (.gz) format
+  with an interface similar to that of stdio.
+
+     The library does not install any signal handler. The decoder checks
+  the consistency of the compressed data, so the library should never
+  crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+    Bytef    *next_in;  /* next input byte */
+    uInt     avail_in;  /* number of bytes available at next_in */
+    uLong    total_in;  /* total nb of input bytes read so far */
+
+    Bytef    *next_out; /* next output byte should be put there */
+    uInt     avail_out; /* remaining free space at next_out */
+    uLong    total_out; /* total nb of bytes output so far */
+
+    char     *msg;      /* last error message, NULL if no error */
+    struct internal_state FAR *state; /* not visible by applications */
+
+    alloc_func zalloc;  /* used to allocate the internal state */
+    free_func  zfree;   /* used to free the internal state */
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */
+
+    int     data_type;  /* best guess about the data type: ascii or binary */
+    uLong   adler;      /* adler32 value of the uncompressed data */
+    uLong   reserved;   /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+   The application must update next_in and avail_in when avail_in has
+   dropped to zero. It must update next_out and avail_out when avail_out
+   has dropped to zero. The application must initialize zalloc, zfree and
+   opaque before calling the init function. All other fields are set by the
+   compression library and must not be updated by the application.
+
+   The opaque value provided by the application will be passed as the first
+   parameter for calls of zalloc and zfree. This can be useful for custom
+   memory management. The compression library attaches no meaning to the
+   opaque value.
+
+   zalloc must return Z_NULL if there is not enough memory for the object.
+   If zlib is used in a multi-threaded application, zalloc and zfree must be
+   thread safe.
+
+   On 16-bit systems, the functions zalloc and zfree must be able to allocate
+   exactly 65536 bytes, but will not be required to allocate more than this
+   if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+   pointers returned by zalloc for objects of exactly 65536 bytes *must*
+   have their offset normalized to zero. The default allocation function
+   provided by this library ensures this (see zutil.c). To reduce memory
+   requirements and avoid any allocation of 64K objects, at the expense of
+   compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+   The fields total_in and total_out can be used for statistics or
+   progress reports. After compression, total_in holds the total size of
+   the uncompressed data and may be saved for use in the decompressor
+   (particularly if the decompressor wants to decompress everything in
+   a single step).
+*/
+
+                        /* constants */
+
+#define Z_NO_FLUSH      0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH    2
+#define Z_FULL_FLUSH    3
+#define Z_FINISH        4
+/* Allowed flush values; see deflate() below for details */
+
+#define Z_OK            0
+#define Z_STREAM_END    1
+#define Z_NEED_DICT     2
+#define Z_ERRNO        (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR   (-3)
+#define Z_MEM_ERROR    (-4)
+#define Z_BUF_ERROR    (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION         0
+#define Z_BEST_SPEED             1
+#define Z_BEST_COMPRESSION       9
+#define Z_DEFAULT_COMPRESSION  (-1)
+/* compression levels */
+
+#define Z_FILTERED            1
+#define Z_HUFFMAN_ONLY        2
+#define Z_DEFAULT_STRATEGY    0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY   0
+#define Z_ASCII    1
+#define Z_UNKNOWN  2
+/* Possible values of the data_type field */
+
+#define Z_DEFLATED   8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+                        /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+   If the first character differs, the library code actually used is
+   not compatible with the zlib.h header file used by the application.
+   This check is automatically made by deflateInit and inflateInit.
+ */
+
+/* 
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+     Initializes the internal stream state for compression. The fields
+   zalloc, zfree and opaque must be initialized before by the caller.
+   If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+   use default allocation functions.
+
+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+   1 gives best speed, 9 gives best compression, 0 gives no compression at
+   all (the input data is simply copied a block at a time).
+   Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+   compression (currently equivalent to level 6).
+
+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+   with the version assumed by the caller (ZLIB_VERSION).
+   msg is set to null if there is no error message.  deflateInit does not
+   perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+    deflate compresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may introduce some
+  output latency (reading input without producing any output) except when
+  forced to flush.
+
+    The detailed semantics are as follows. deflate performs one or both of the
+  following actions:
+
+  - Compress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in and avail_in are updated and
+    processing will resume at this point for the next call of deflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly. This action is forced if the parameter flush is non zero.
+    Forcing flush frequently degrades the compression ratio, so this parameter
+    should be set only when necessary (in interactive applications).
+    Some output may be provided even if flush is not set.
+
+  Before the call of deflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating avail_in or avail_out accordingly; avail_out
+  should never be zero before the call. The application can consume the
+  compressed output when it wants, for example when the output buffer is full
+  (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+  and with zero avail_out, it must be called again after making room in the
+  output buffer because there might be more output pending.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+  flushed to the output buffer and the output is aligned on a byte boundary, so
+  that the decompressor can get all input data available so far. (In particular
+  avail_in is zero after the call if enough output space has been provided
+  before the call.)  Flushing may degrade compression for some compression
+  algorithms and so it should be used only when necessary.
+
+    If flush is set to Z_FULL_FLUSH, all output is flushed as with
+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+  restart from this point if previous compressed data has been damaged or if
+  random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+  the compression.
+
+    If deflate returns with avail_out == 0, this function must be called again
+  with the same value of the flush parameter and more output space (updated
+  avail_out), until the flush is complete (deflate returns with non-zero
+  avail_out).
+
+    If the parameter flush is set to Z_FINISH, pending input is processed,
+  pending output is flushed and deflate returns with Z_STREAM_END if there
+  was enough output space; if deflate returns with Z_OK, this function must be
+  called again with Z_FINISH and more output space (updated avail_out) but no
+  more input data, until it returns with Z_STREAM_END or an error. After
+  deflate has returned Z_STREAM_END, the only possible operations on the
+  stream are deflateReset or deflateEnd.
+  
+    Z_FINISH can be used immediately after deflateInit if all the compression
+  is to be done in a single step. In this case, avail_out must be at least
+  0.1% larger than avail_in plus 12 bytes.  If deflate does not return
+  Z_STREAM_END, then it must be called again as described above.
+
+    deflate() sets strm->adler to the adler32 checksum of all input read
+  so far (that is, total_in bytes).
+
+    deflate() may update data_type if it can make a good guess about
+  the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
+  binary. This field is only for information purposes and does not affect
+  the compression algorithm in any manner.
+
+    deflate() returns Z_OK if some progress has been made (more input
+  processed or more output produced), Z_STREAM_END if all input has been
+  consumed and all output has been produced (only when flush is set to
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+  if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+  (for example avail_in or avail_out was zero).
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+   prematurely (some input or output was discarded). In the error case,
+   msg may be set but then points to a static string (which must not be
+   deallocated).
+*/
+
+
+/* 
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+     Initializes the internal stream state for decompression. The fields
+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+   the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+   value depends on the compression method), inflateInit determines the
+   compression method from the zlib header and allocates all data structures
+   accordingly; otherwise the allocation will be deferred to the first call of
+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+   use default allocation functions.
+
+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+   version assumed by the caller.  msg is set to null if there is no error
+   message. inflateInit does not perform any decompression apart from reading
+   the zlib header if present: this will be done by inflate().  (So next_in and
+   avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+    inflate decompresses as much data as possible, and stops when the input
+  buffer becomes empty or the output buffer becomes full. It may some
+  introduce some output latency (reading input without producing any output)
+  except when forced to flush.
+
+  The detailed semantics are as follows. inflate performs one or both of the
+  following actions:
+
+  - Decompress more input starting at next_in and update next_in and avail_in
+    accordingly. If not all input can be processed (because there is not
+    enough room in the output buffer), next_in is updated and processing
+    will resume at this point for the next call of inflate().
+
+  - Provide more output starting at next_out and update next_out and avail_out
+    accordingly.  inflate() provides as much output as possible, until there
+    is no more input data or no more space in the output buffer (see below
+    about the flush parameter).
+
+  Before the call of inflate(), the application should ensure that at least
+  one of the actions is possible, by providing more input and/or consuming
+  more output, and updating the next_* and avail_* values accordingly.
+  The application can consume the uncompressed output when it wants, for
+  example when the output buffer is full (avail_out == 0), or after each
+  call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+  must be called again after making room in the output buffer because there
+  might be more output pending.
+
+    If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
+  output as possible to the output buffer. The flushing behavior of inflate is
+  not specified for values of the flush parameter other than Z_SYNC_FLUSH
+  and Z_FINISH, but the current implementation actually flushes as much output
+  as possible anyway.
+
+    inflate() should normally be called until it returns Z_STREAM_END or an
+  error. However if all decompression is to be performed in a single step
+  (a single call of inflate), the parameter flush should be set to
+  Z_FINISH. In this case all pending input is processed and all pending
+  output is flushed; avail_out must be large enough to hold all the
+  uncompressed data. (The size of the uncompressed data may have been saved
+  by the compressor for this purpose.) The next operation on this stream must
+  be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+  is never required, but can be used to inform inflate that a faster routine
+  may be used for the single inflate() call.
+
+     If a preset dictionary is needed at this point (see inflateSetDictionary
+  below), inflate sets strm-adler to the adler32 checksum of the
+  dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise 
+  it sets strm->adler to the adler32 checksum of all output produced
+  so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
+  an error code as described below. At the end of the stream, inflate()
+  checks that its computed adler32 checksum is equal to that saved by the
+  compressor and returns Z_STREAM_END only if the checksum is correct.
+
+    inflate() returns Z_OK if some progress has been made (more input processed
+  or more output produced), Z_STREAM_END if the end of the compressed data has
+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+  corrupted (input stream not conforming to the zlib format or incorrect
+  adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
+  (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
+  enough memory, Z_BUF_ERROR if no progress is possible or if there was not
+  enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
+  case, the application may then call inflateSync to look for a good
+  compression block.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+     All dynamically allocated data structures for this stream are freed.
+   This function discards any unprocessed input and does not flush any
+   pending output.
+
+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+   was inconsistent. In the error case, msg may be set but then points to a
+   static string (which must not be deallocated).
+*/
+
+                        /* Advanced functions */
+
+/*
+    The following functions are needed only in some special applications.
+*/
+
+/*   
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+                                     int  level,
+                                     int  method,
+                                     int  windowBits,
+                                     int  memLevel,
+                                     int  strategy));
+
+     This is another version of deflateInit with more compression options. The
+   fields next_in, zalloc, zfree and opaque must be initialized before by
+   the caller.
+
+     The method parameter is the compression method. It must be Z_DEFLATED in
+   this version of the library.
+
+     The windowBits parameter is the base two logarithm of the window size
+   (the size of the history buffer).  It should be in the range 8..15 for this
+   version of the library. Larger values of this parameter result in better
+   compression at the expense of memory usage. The default value is 15 if
+   deflateInit is used instead.
+
+     The memLevel parameter specifies how much memory should be allocated
+   for the internal compression state. memLevel=1 uses minimum memory but
+   is slow and reduces compression ratio; memLevel=9 uses maximum memory
+   for optimal speed. The default value is 8. See zconf.h for total memory
+   usage as a function of windowBits and memLevel.
+
+     The strategy parameter is used to tune the compression algorithm. Use the
+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+   filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
+   string match).  Filtered data consists mostly of small values with a
+   somewhat random distribution. In this case, the compression algorithm is
+   tuned to compress them better. The effect of Z_FILTERED is to force more
+   Huffman coding and less string matching; it is somewhat intermediate
+   between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
+   the compression ratio but not the correctness of the compressed output even
+   if it is not set appropriately.
+
+      deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+   method). msg is set to null if there is no error message.  deflateInit2 does
+   not perform any compression: this will be done by deflate().
+*/
+                            
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the compression dictionary from the given byte sequence
+   without producing any compressed output. This function must be called
+   immediately after deflateInit, deflateInit2 or deflateReset, before any
+   call of deflate. The compressor and decompressor must use exactly the same
+   dictionary (see inflateSetDictionary).
+
+     The dictionary should consist of strings (byte sequences) that are likely
+   to be encountered later in the data to be compressed, with the most commonly
+   used strings preferably put towards the end of the dictionary. Using a
+   dictionary is most useful when the data to be compressed is short and can be
+   predicted with good accuracy; the data can then be compressed better than
+   with the default empty dictionary.
+
+     Depending on the size of the compression data structures selected by
+   deflateInit or deflateInit2, a part of the dictionary may in effect be
+   discarded, for example if the dictionary is larger than the window size in
+   deflate or deflate2. Thus the strings most likely to be useful should be
+   put at the end of the dictionary, not at the front.
+
+     Upon return of this function, strm->adler is set to the Adler32 value
+   of the dictionary; the decompressor may later use this value to determine
+   which dictionary has been used by the compressor. (The Adler32 value
+   applies to the whole dictionary even if only a subset of the dictionary is
+   actually used by the compressor.)
+
+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent (for example if deflate has already been called for this stream
+   or if the compression method is bsort). deflateSetDictionary does not
+   perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+                                    z_streamp source));
+/*
+     Sets the destination stream as a complete copy of the source stream.
+
+     This function can be useful when several compression strategies will be
+   tried, for example when there are several ways of pre-processing the input
+   data with a filter. The streams that will be discarded should then be freed
+   by calling deflateEnd.  Note that deflateCopy duplicates the internal
+   compression state which can be quite large, so this strategy is slow and
+   can consume lots of memory.
+
+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+   (such as zalloc being NULL). msg is left unchanged in both source and
+   destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to deflateEnd followed by deflateInit,
+   but does not free and reallocate all the internal compression state.
+   The stream will keep the same compression level and any other attributes
+   that may have been set by deflateInit2.
+
+      deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+				      int level,
+				      int strategy));
+/*
+     Dynamically update the compression level and compression strategy.  The
+   interpretation of level and strategy is as in deflateInit2.  This can be
+   used to switch between compression and straight copy of the input data, or
+   to switch to a different kind of input data requiring a different
+   strategy. If the compression level is changed, the input available so far
+   is compressed with the old level (and may be flushed); the new level will
+   take effect only at the next call of deflate().
+
+     Before the call of deflateParams, the stream state must be set as for
+   a call of deflate(), since the currently available input may have to
+   be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+   if strm->avail_out was zero.
+*/
+
+/*   
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+                                     int  windowBits));
+
+     This is another version of inflateInit with an extra parameter. The
+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+   before by the caller.
+
+     The windowBits parameter is the base two logarithm of the maximum window
+   size (the size of the history buffer).  It should be in the range 8..15 for
+   this version of the library. The default value is 15 if inflateInit is used
+   instead. If a compressed stream with a larger window size is given as
+   input, inflate() will return with the error code Z_DATA_ERROR instead of
+   trying to allocate a larger window.
+
+      inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
+   memLevel). msg is set to null if there is no error message.  inflateInit2
+   does not perform any decompression apart from reading the zlib header if
+   present: this will be done by inflate(). (So next_in and avail_in may be
+   modified, but next_out and avail_out are unchanged.)
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+                                             const Bytef *dictionary,
+                                             uInt  dictLength));
+/*
+     Initializes the decompression dictionary from the given uncompressed byte
+   sequence. This function must be called immediately after a call of inflate
+   if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
+   can be determined from the Adler32 value returned by this call of
+   inflate. The compressor and decompressor must use exactly the same
+   dictionary (see deflateSetDictionary).
+
+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+   parameter is invalid (such as NULL dictionary) or the stream state is
+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+   expected one (incorrect Adler32 value). inflateSetDictionary does not
+   perform any decompression: this will be done by subsequent calls of
+   inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/* 
+    Skips invalid compressed data until a full flush point (see above the
+  description of deflate with Z_FULL_FLUSH) can be found, or until all
+  available input is skipped. No output is provided.
+
+    inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+  if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+  or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+  case, the application may save the current current value of total_in which
+  indicates where valid compressed data was found. In the error case, the
+  application may repeatedly call inflateSync, providing more input each time,
+  until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+     This function is equivalent to inflateEnd followed by inflateInit,
+   but does not free and reallocate all the internal decompression state.
+   The stream will keep attributes that may have been set by inflateInit2.
+
+      inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+   stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+
+                        /* utility functions */
+
+/*
+     The following utility functions are implemented on top of the
+   basic stream-oriented functions. To simplify the interface, some
+   default options are assumed (compression level and memory usage,
+   standard memory allocation functions). The source code of these
+   utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,
+                                 const Bytef *source, uLong sourceLen));
+/*
+     Compresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be at least 0.1% larger than
+   sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
+   compressed buffer.
+     This function can be used to compress a whole file at once if the
+   input file is mmap'ed.
+     compress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,
+                                  const Bytef *source, uLong sourceLen,
+                                  int level));
+/*
+     Compresses the source buffer into the destination buffer. The level
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte
+   length of the source buffer. Upon entry, destLen is the total size of the
+   destination buffer, which must be at least 0.1% larger than sourceLen plus
+   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+   Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,
+                                   const Bytef *source, uLong sourceLen));
+/*
+     Decompresses the source buffer into the destination buffer.  sourceLen is
+   the byte length of the source buffer. Upon entry, destLen is the total
+   size of the destination buffer, which must be large enough to hold the
+   entire uncompressed data. (The size of the uncompressed data must have
+   been saved previously by the compressor and transmitted to the decompressor
+   by some mechanism outside the scope of this compression library.)
+   Upon exit, destLen is the actual size of the compressed buffer.
+     This function can be used to decompress a whole file at once if the
+   input file is mmap'ed.
+
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+   enough memory, Z_BUF_ERROR if there was not enough room in the output
+   buffer, or Z_DATA_ERROR if the input data was corrupted.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile ZEXPORT gzopen  OF((const char *path, const char *mode));
+/*
+     Opens a gzip (.gz) file for reading or writing. The mode parameter
+   is as in fopen ("rb" or "wb") but can also include a compression level
+   ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+   Huffman only compression as in "wb1h". (See the description
+   of deflateInit2 for more information about the strategy parameter.)
+
+     gzopen can be used to read a file which is not in gzip format; in this
+   case gzread will directly read from the file without decompression.
+
+     gzopen returns NULL if the file could not be opened or if there was
+   insufficient memory to allocate the (de)compression state; errno
+   can be checked to distinguish the two cases (if errno is zero, the
+   zlib error is Z_MEM_ERROR).  */
+
+ZEXTERN gzFile ZEXPORT gzdopen  OF((int fd, const char *mode));
+/*
+     gzdopen() associates a gzFile with the file descriptor fd.  File
+   descriptors are obtained from calls like open, dup, creat, pipe or
+   fileno (in the file has been previously opened with fopen).
+   The mode parameter is as in gzopen.
+     The next call of gzclose on the returned gzFile will also close the
+   file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+   descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+     gzdopen returns NULL if there was insufficient memory to allocate
+   the (de)compression state.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+     Dynamically update the compression level or strategy. See the description
+   of deflateInit2 for the meaning of these parameters.
+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+   opened for writing.
+*/
+
+ZEXTERN int ZEXPORT    gzread  OF((gzFile file, voidp buf, unsigned len));
+/*
+     Reads the given number of uncompressed bytes from the compressed file.
+   If the input file was not in gzip format, gzread copies the given number
+   of bytes into the buffer.
+     gzread returns the number of uncompressed bytes actually read (0 for
+   end of file, -1 for error). */
+
+ZEXTERN int ZEXPORT    gzwrite OF((gzFile file, 
+				   const voidp buf, unsigned len));
+/*
+     Writes the given number of uncompressed bytes into the compressed file.
+   gzwrite returns the number of uncompressed bytes actually written
+   (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORTVA   gzprintf OF((gzFile file, const char *format, ...));
+/*
+     Converts, formats, and writes the args to the compressed file under
+   control of the format string, as in fprintf. gzprintf returns the number of
+   uncompressed bytes actually written (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+      Writes the given null-terminated string to the compressed file, excluding
+   the terminating null character.
+      gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+      Reads bytes from the compressed file until len-1 characters are read, or
+   a newline character is read and transferred to buf, or an end-of-file
+   condition is encountered.  The string is then terminated with a null
+   character.
+      gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int ZEXPORT    gzputc OF((gzFile file, int c));
+/*
+      Writes c, converted to an unsigned char, into the compressed file.
+   gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT    gzgetc OF((gzFile file));
+/*
+      Reads one byte from the compressed file. gzgetc returns this byte
+   or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT    gzflush OF((gzFile file, int flush));
+/*
+     Flushes all pending output into the compressed file. The parameter
+   flush is as in the deflate() function. The return value is the zlib
+   error number (see function gzerror below). gzflush returns Z_OK if
+   the flush parameter is Z_FINISH and all output could be flushed.
+     gzflush should be called only when strictly necessary because it can
+   degrade compression.
+*/
+
+ZEXTERN z_off_t ZEXPORT    gzseek OF((gzFile file,
+				      z_off_t offset, int whence));
+/* 
+      Sets the starting position for the next gzread or gzwrite on the
+   given compressed file. The offset represents a number of bytes in the
+   uncompressed data stream. The whence parameter is defined as in lseek(2);
+   the value SEEK_END is not supported.
+     If the file is opened for reading, this function is emulated but can be
+   extremely slow. If the file is opened for writing, only forward seeks are
+   supported; gzseek then compresses a sequence of zeroes up to the new
+   starting position.
+
+      gzseek returns the resulting offset location as measured in bytes from
+   the beginning of the uncompressed stream, or -1 in case of error, in
+   particular if the file is opened for writing and the new starting position
+   would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));
+/*
+     Rewinds the given file. This function is supported only for reading.
+
+   gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));
+/*
+     Returns the starting position for the next gzread or gzwrite on the
+   given compressed file. This position represents a number of bytes in the
+   uncompressed data stream.
+
+   gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+     Returns 1 when EOF has previously been detected reading the given
+   input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT    gzclose OF((gzFile file));
+/*
+     Flushes all pending output if necessary, closes the compressed file
+   and deallocates all the (de)compression state. The return value is the zlib
+   error number (see function gzerror below).
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+     Returns the error message for the last error which occurred on the
+   given compressed file. errnum is set to zlib error number. If an
+   error occurred in the file system and not in the compression library,
+   errnum is set to Z_ERRNO and the application may consult errno
+   to get the exact error code.
+*/
+
+                        /* checksum functions */
+
+/*
+     These functions are not related to compression but are exported
+   anyway because they might be useful in applications using the
+   compression library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+
+/*
+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+   return the updated checksum. If buf is NULL, this function returns
+   the required initial value for the checksum.
+   An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+   much faster. Usage example:
+
+     uLong adler = adler32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       adler = adler32(adler, buffer, length);
+     }
+     if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));
+/*
+     Update a running crc with the bytes buf[0..len-1] and return the updated
+   crc. If buf is NULL, this function returns the required initial value
+   for the crc. Pre- and post-conditioning (one's complement) is performed
+   within this function so it shouldn't be done by the application.
+   Usage example:
+
+     uLong crc = crc32(0L, Z_NULL, 0);
+
+     while (read_buffer(buffer, length) != EOF) {
+       crc = crc32(crc, buffer, length);
+     }
+     if (crc != original_crc) error();
+*/
+
+
+                        /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+                                     const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+                                     const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,
+                                      int windowBits, int memLevel,
+                                      int strategy, const char *version,
+                                      int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,
+                                      const char *version, int stream_size));
+#define deflateInit(strm, level) \
+        deflateInit_((strm), (level),       ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+        inflateInit_((strm),                ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+                      (strategy),           ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
+    struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN const char   * ZEXPORT zError           OF((int err));
+ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN const uLongf * ZEXPORT get_crc_table    OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZLIB_H */
diff --git a/terralibx/PostgreSQL/libpq.a b/terralibx/PostgreSQL/libpq.a
new file mode 100644
index 0000000..185da7d
Binary files /dev/null and b/terralibx/PostgreSQL/libpq.a differ
diff --git a/terralibx/shapelib/Makefile b/terralibx/shapelib/Makefile
new file mode 100644
index 0000000..e15d343
--- /dev/null
+++ b/terralibx/shapelib/Makefile
@@ -0,0 +1,11 @@
+all: shapelib
+
+shapelib:
+	qmake -o makeShapelib shapelib.pro; make -f makeShapelib
+
+clean:
+	if \
+	 test -f makeShapelib; \
+	then \
+		make -f makeShapelib distclean; rm -f makeShapelib; \
+	fi
diff --git a/terralibx/shapelib/shapelib.pro b/terralibx/shapelib/shapelib.pro
new file mode 100755
index 0000000..5bb0f3c
--- /dev/null
+++ b/terralibx/shapelib/shapelib.pro
@@ -0,0 +1,18 @@
+TEMPLATE = lib
+CONFIG  += warn_off  debug
+TARGET  += shapelib
+
+unix {
+  OBJECTS_DIR = .obj
+}
+
+
+SOURCES =  \
+    ../../src/shapelib/dbfopen.c \
+    ../../src/shapelib/shpopen.c
+
+HEADERS =  \
+    ../../src/shapelib/shapefil.h
+
+
+
diff --git a/terralibx/stat/Makefile b/terralibx/stat/Makefile
new file mode 100644
index 0000000..1ffdad1
--- /dev/null
+++ b/terralibx/stat/Makefile
@@ -0,0 +1,11 @@
+all: stat
+
+stat:
+	qmake -o makeStat stat.pro; make -f makeStat
+
+clean:
+	if \
+	 test -f makeStat; \
+	then \
+		make -f makeStat distclean; rm -f makeStat; \
+	fi
diff --git a/terralibx/stat/stat.pro b/terralibx/stat/stat.pro
new file mode 100644
index 0000000..d2395ae
--- /dev/null
+++ b/terralibx/stat/stat.pro
@@ -0,0 +1,45 @@
+TEMPLATE = lib
+TARGET  += stat
+CONFIG	+= warn_on debug
+
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+=	\
+			../../src/terralib/stat/filaDouble.cpp \
+			../../src/terralib/stat/filaInt.cpp \
+			../../src/terralib/stat/filaR.cpp \
+			../../src/terralib/stat/hash.cpp \
+			../../src/terralib/stat/heap.cpp \
+			../../src/terralib/stat/lista.cpp \
+			../../src/terralib/stat/TeBayesFunctions.cpp \
+			../../src/terralib/stat/TeKernelFunctions.cpp \
+			../../src/terralib/stat/TeSkaterArvore.cpp \
+			../../src/terralib/stat/TeSkaterFunctions.cpp \
+			../../src/terralib/stat/TeSkaterGrafo.cpp \
+			../../src/terralib/stat/TeSpatialStatistics.cpp \
+			../../src/terralib/stat/TeStatDataStructures.cpp
+
+HEADERS	+= 	\
+			../../src/terralib/stat/erro.h \
+			../../src/terralib/stat/filaDouble.h \
+			../../src/terralib/stat/filaInt.h \
+			../../src/terralib/stat/filaR.h \
+			../../src/terralib/stat/hash.h \
+			../../src/terralib/stat/heap.h \
+			../../src/terralib/stat/lista.h \
+			../../src/terralib/stat/TeBayesFunctions.h \
+			../../src/terralib/stat/TeKernelFunctions.h \
+			../../src/terralib/stat/TeKernelParams.h \
+			../../src/terralib/stat/TeKMeansGrouping.h \
+			../../src/terralib/stat/TeSkaterArvore.h \
+			../../src/terralib/stat/TeSkaterFunctions.h \
+			../../src/terralib/stat/TeSkaterGrafo.h \
+			../../src/terralib/stat/TeSpatialStatistics.h \
+			../../src/terralib/stat/TeStatDataStructures.h
+
+INCLUDEPATH	+=	\
+				. \
+				../../src/terralib/kernel
+
diff --git a/terralibx/terralib/Makefile b/terralibx/terralib/Makefile
new file mode 100644
index 0000000..dc79ef6
--- /dev/null
+++ b/terralibx/terralib/Makefile
@@ -0,0 +1,14 @@
+all: terralib
+
+tiff:
+	cd ../tiff; make
+
+terralib: tiff
+	qmake -o makeTerralib terralib.pro; make -f makeTerralib
+
+clean:
+	if \
+	 test -f makeTerralib; \
+	then \
+		make -f makeTerralib distclean; rm -f makeTerralib; \
+	fi
diff --git a/terralibx/terralib/terralib.kdevprj b/terralibx/terralib/terralib.kdevprj
new file mode 100644
index 0000000..34fd5e3
--- /dev/null
+++ b/terralibx/terralib/terralib.kdevprj
@@ -0,0 +1,795 @@
+[Config for BinMakefileAm]
+bin_program=terralib
+cxxflags=-O0 -g3 -Wall
+ldflags=\s
+
+[General]
+AMChanged=false
+author=
+configure_args=
+email=
+kdevprj_version=1.3
+lfv_open_groups=
+make_options=-j1
+makefiles=Makefile.am,terralib/Makefile.am,terralib/docs/Makefile.am,terralib/docs/en/Makefile.am
+project_name=Terralib
+project_type=normal_empty
+showNonProjectFiles=true
+sub_dir=terralib/
+version=0.1
+version_control=None
+workspace=1
+
+[Gra_algo.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[LFV Groups]
+Headers=*.h,*.hh,*.hxx,*.hpp,*.H
+Others=*
+Sources=*.cpp,*.c,*.cc,*.C,*.cxx,*.ec,*.ecpp,*.lxx,*.l++,*.ll,*.l
+User Interface=*.kdevdlg,*.ui,*.rc,*.dlg
+groups=Headers,Sources,User Interface,Others
+
+[Makefile]
+dist=true
+install=false
+install_location=
+type=DATA
+
+[Makefile.am]
+files=TeAsciiFile.cpp,TeAsciiFile.h,TeBox.cpp,TeBox.h,TeCentroid.cpp,TeConsoleErrorMessage.cpp,TeDatabase.cpp,TeDatum.cpp,TeDecoder.cpp,TeDecoderDatabase.cpp,TeDecoderFile.cpp,TeDecoderMemory.cpp,TeDecoderMemoryMap.cpp,TeDecoderTIFF.cpp,TeDecoderVirtualMemory.cpp,TeErrorLog.cpp,TeErrorMessage.cpp,TeEvent.cpp,TeException.cpp,TeGeneralizedProxMatrix.cpp,TeGeometry.cpp,TeGeometryAlgorithms.cpp,TeGraph.cpp,TeImportRaster.cpp,TeInitRasterDecoders.cpp,TeKernelParams.cpp,TeLayer.cpp,TeLineInter [...]
+sub_dirs=terralib
+type=static_library
+
+[TeAsciiFile.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeAsciiFile.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeAttribute.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeBox.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeBox.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCellAlgorithms.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeCellAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCentroid.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeComposite.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeConsoleErrorMessage.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeConsoleErrorMessage.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCoord2D.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeCounted.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDataTypes.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDatabase.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDatabase.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDatum.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDatum.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoder.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoder.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderDatabase.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderDatabase.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderFile.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderFile.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderMemory.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderMemory.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderMemoryMap.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderMemoryMap.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderTIFF.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderTIFF.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDecoderVirtualMemory.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeDecoderVirtualMemory.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeDefines.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeErrorLog.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeErrorLog.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeErrorMessage.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeErrorMessage.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeEvent.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeException.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeException.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeFactory.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGeneralizedProxMatrix.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGeneralizedProxMatrix.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGeometry.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGeometry.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGeometryAlgorithms.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGeometryAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGraph.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeGraph.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeGroupingAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeImportRaster.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeInitRasterDecoders.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeKernelParams.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeKernelParams.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLayer.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeLayer.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLegendEntry.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLineIntersector.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeLineIntersector.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeLineIntersectorUtils.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeMatrix.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeMatrix.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeMeasure.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeNeighbours.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeNeighbours.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeNetwork.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeNetwork.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TePrecision.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProgress.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProgress.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProgressBase.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProjection.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProjection.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TePrototype.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixConstructionStrategy.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixImplementation.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProxMatrixImplementation.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixSlicingStrategy.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeProxMatrixStrategies.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeProxMatrixWeightsStrategy.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRaster.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRaster.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterAlgorithms.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRasterAlgorithms.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterParams.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRasterParams.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterRemap.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRasterRemap.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRasterTransform.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRedBlackTree.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeRepresentation.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeRepresentation.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSTObject.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSTObject.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSetOperation.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSetOperation.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSimilarity.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSingleton.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSlice.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSparseMatrix.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeSpatialOperations.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeSpatialOperations.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeStdFile.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeStdFile.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTable.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTable.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTheme.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTheme.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTime.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTime.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTimeInterval.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTimeInterval.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeTin.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeTin.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeUtils.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[TeUtils.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeView.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeViewNode.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[TeVisual.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[checkvec.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[dynpq.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[graph.cpp]
+dist=true
+install=false
+install_location=
+type=SOURCE
+
+[graph.h]
+dist=true
+install=false
+install_location=
+type=HEADER
+
+[terralib/Makefile.am]
+sub_dirs=
+type=prog_main
+
+[terralib/docs/Makefile.am]
+sub_dirs=
+type=normal
+
+[terralib/docs/en/Makefile.am]
+sub_dirs=
+type=normal
diff --git a/terralibx/terralib/terralib.pro b/terralibx/terralib/terralib.pro
new file mode 100755
index 0000000..3371947
--- /dev/null
+++ b/terralibx/terralib/terralib.pro
@@ -0,0 +1,181 @@
+TEMPLATE = lib
+TARGET  += terralib
+CONFIG	+= warn_on debug
+
+LANGUAGE = C++
+
+OBJECTS_DIR = .obj
+
+SOURCES	+=	\
+#			../../src/terralib/kernel/jpeg.cpp \
+			../../src/terralib/kernel/lexTemporal.cpp \
+			../../src/terralib/kernel/TeAsciiFile.cpp \
+			../../src/terralib/kernel/TeBox.cpp \
+			../../src/terralib/kernel/TeBufferRegion.cpp \
+			../../src/terralib/kernel/TeCentroid.cpp \
+			../../src/terralib/kernel/TeComputeAttributeStrategies.cpp \
+			../../src/terralib/kernel/TeDatabase.cpp \
+			../../src/terralib/kernel/TeDatum.cpp \
+			../../src/terralib/kernel/TeDecoderASCIIGrid.cpp \
+			../../src/terralib/kernel/TeDecoderDatabase.cpp \
+			../../src/terralib/kernel/TeDecoderFile.cpp \
+#			../../src/terralib/kernel/TeDecoderJPEG.cpp \
+			../../src/terralib/kernel/TeDecoderMemory.cpp \
+			../../src/terralib/kernel/TeDecoderMemoryMap.cpp \
+			../../src/terralib/kernel/TeDecoderSPR.cpp \
+			../../src/terralib/kernel/TeDecoderTIFF.cpp \
+			../../src/terralib/kernel/TeDecoderVirtualMemory.cpp \
+			../../src/terralib/kernel/TeErrorLog.cpp \
+			../../src/terralib/kernel/TeErrorMessage.cpp \
+			../../src/terralib/kernel/TeException.cpp \
+			../../src/terralib/kernel/TeFragmentation.cpp \
+			../../src/terralib/kernel/TeGeneralizedProxMatrix.cpp \
+			../../src/terralib/kernel/TeGeometry.cpp \
+			../../src/terralib/kernel/TeGeometryAlgorithms.cpp \
+			../../src/terralib/kernel/TeGraph.cpp \
+			../../src/terralib/kernel/TeGroupingAlgorithms.cpp \
+			../../src/terralib/kernel/TeImportRaster.cpp \
+			../../src/terralib/kernel/TeInitQuerierStrategy.cpp \
+			../../src/terralib/kernel/TeInitRasterDecoders.cpp \
+			../../src/terralib/kernel/TeIntersector.cpp \
+			../../src/terralib/kernel/TeLayer.cpp \
+			../../src/terralib/kernel/TeMatrix.cpp \
+			../../src/terralib/kernel/TeMultiGeometry.cpp \
+			../../src/terralib/kernel/TeNeighbours.cpp \
+			../../src/terralib/kernel/TeNetwork.cpp \
+			../../src/terralib/kernel/TeOverlay.cpp \
+			../../src/terralib/kernel/TeProgress.cpp \
+			../../src/terralib/kernel/TeProjection.cpp \
+			../../src/terralib/kernel/TeProxMatrixConstructionStrategy.cpp \
+			../../src/terralib/kernel/TeProxMatrixImplementation.cpp \
+			../../src/terralib/kernel/TeProxMatrixStrategies.cpp \
+			../../src/terralib/kernel/TeQuerier.cpp \
+			../../src/terralib/kernel/TeQuerierDB.cpp \
+			../../src/terralib/kernel/TeQuerierDBStr1.cpp \
+			../../src/terralib/kernel/TeQuerierDBStr2.cpp \
+			../../src/terralib/kernel/TeQuerierDBStr3.cpp \
+			../../src/terralib/kernel/TeQuerierImpl.cpp \
+			../../src/terralib/kernel/TeQuerierParams.cpp \
+			../../src/terralib/kernel/TeRaster.cpp \
+			../../src/terralib/kernel/TeRasterParams.cpp \
+			../../src/terralib/kernel/TeRasterRemap.cpp \
+			../../src/terralib/kernel/TeRasterTransform.cpp \
+			../../src/terralib/kernel/TeRepresentation.cpp \
+			../../src/terralib/kernel/TeSpatialOperations.cpp \
+			../../src/terralib/kernel/TeStdFile.cpp \
+			../../src/terralib/kernel/TeSTEFunctionsDB.cpp \
+			../../src/terralib/kernel/TeSTElement.cpp \
+			../../src/terralib/kernel/TeSTElementSet.cpp \
+			../../src/terralib/kernel/TeSTEvent.cpp \
+			../../src/terralib/kernel/TeSTInstance.cpp \
+			../../src/terralib/kernel/TeTable.cpp \
+			../../src/terralib/kernel/TeTemporalSeries.cpp \
+			../../src/terralib/kernel/TeTheme.cpp \
+			../../src/terralib/kernel/TeTime.cpp \
+			../../src/terralib/kernel/TeTimeInterval.cpp \
+			../../src/terralib/kernel/TeTin.cpp \
+			../../src/terralib/kernel/TeUtils.cpp \
+			../../src/terralib/kernel/TeVectorRemap.cpp \
+			../../src/terralib/kernel/yyTemporal.cpp
+
+HEADERS	+= 	../../src/terralib/kernel/checkvec.h \
+			../../src/terralib/kernel/dynpq.h \
+			../../src/terralib/kernel/Gra_algo.h \
+			../../src/terralib/kernel/graph.h \
+#			../../src/terralib/kernel/ijl.h \
+#			../../src/terralib/kernel/jpeg.h \
+			../../src/terralib/kernel/TeAsciiFile.h \
+			../../src/terralib/kernel/TeAttribute.h \
+			../../src/terralib/kernel/TeBox.h \
+			../../src/terralib/kernel/TeBufferRegion.h \
+			../../src/terralib/kernel/TeComposite.h \
+			../../src/terralib/kernel/TeComputeAttributeStrategies.h \
+			../../src/terralib/kernel/TeCoord2D.h \
+			../../src/terralib/kernel/TeCounted.h \
+			../../src/terralib/kernel/TeDatabase.h \
+			../../src/terralib/kernel/TeDataTypes.h \
+			../../src/terralib/kernel/TeDatum.h \
+			../../src/terralib/kernel/TeDecoder.h \
+			../../src/terralib/kernel/TeDecoderASCIIGrid.h \
+			../../src/terralib/kernel/TeDecoderDatabase.h \
+			../../src/terralib/kernel/TeDecoderFile.h \
+#			../../src/terralib/kernel/TeDecoderJPEG.h \
+			../../src/terralib/kernel/TeDecoderMemory.h \
+			../../src/terralib/kernel/TeDecoderMemoryMap.h \
+			../../src/terralib/kernel/TeDecoderSPR.h \
+			../../src/terralib/kernel/TeDecoderTIFF.h \
+			../../src/terralib/kernel/TeDecoderVirtualMemory.h \
+			../../src/terralib/kernel/TeDefines.h \
+			../../src/terralib/kernel/TeErrorLog.h \
+			../../src/terralib/kernel/TeErrorMessage.h \
+			../../src/terralib/kernel/TeException.h \
+			../../src/terralib/kernel/TeFactory.h \
+			../../src/terralib/kernel/TeFragmentation.h \
+			../../src/terralib/kernel/TeGeneralizedProxMatrix.h \
+			../../src/terralib/kernel/TeGeometry.h \
+			../../src/terralib/kernel/TeGeometryAlgorithms.h \
+			../../src/terralib/kernel/TeGraph.h \
+			../../src/terralib/kernel/TeGroupingAlgorithms.h \
+			../../src/terralib/kernel/TeImportRaster.h \
+			../../src/terralib/kernel/TeInitQuerierStrategy.h \
+			../../src/terralib/kernel/TeIntersector.h \
+			../../src/terralib/kernel/TeLayer.h \
+			../../src/terralib/kernel/TeLegendEntry.h \
+			../../src/terralib/kernel/TeMatrix.h \
+			../../src/terralib/kernel/TeMeasure.h \
+			../../src/terralib/kernel/TeMultiGeometry.h \
+			../../src/terralib/kernel/TeNeighbours.h \
+			../../src/terralib/kernel/TeNetwork.h \
+			../../src/terralib/kernel/TeOverlay.h \
+			../../src/terralib/kernel/TePrecision.h \
+			../../src/terralib/kernel/TeProgress.h \
+			../../src/terralib/kernel/TeProgressBase.h \
+			../../src/terralib/kernel/TeProjection.h \
+			../../src/terralib/kernel/TePrototype.h \
+			../../src/terralib/kernel/TeProxMatrixConstructionStrategy.h \
+			../../src/terralib/kernel/TeProxMatrixImplementation.h \
+			../../src/terralib/kernel/TeProxMatrixSlicingStrategy.h \
+			../../src/terralib/kernel/TeProxMatrixWeightsStrategy.h \
+			../../src/terralib/kernel/TeQuerier.h\
+			../../src/terralib/kernel/TeQuerierDB.h\
+			../../src/terralib/kernel/TeQuerierDBStr1.h\
+			../../src/terralib/kernel/TeQuerierDBStr2.h\
+			../../src/terralib/kernel/TeQuerierDBStr3.h \
+			../../src/terralib/kernel/TeQuerierImpl.h\
+			../../src/terralib/kernel/TeQuerierParams.h\
+			../../src/terralib/kernel/TeQuerierSHP.h\
+			../../src/terralib/kernel/TeRaster.h \
+			../../src/terralib/kernel/TeRasterParams.h \
+			../../src/terralib/kernel/TeRasterRemap.h \
+			../../src/terralib/kernel/TeRasterTransform.h \
+			../../src/terralib/kernel/TeRedBlackTree.h \
+			../../src/terralib/kernel/TeRepresentation.h \
+			../../src/terralib/kernel/TeSingleton.h \
+			../../src/terralib/kernel/TeSlice.h \
+			../../src/terralib/kernel/TeSpatialOperations.h \
+			../../src/terralib/kernel/TeStatistics.h \
+			../../src/terralib/kernel/TeStdFile.h \
+			../../src/terralib/kernel/TeSTEFunctionsDB.h \
+			../../src/terralib/kernel/TeSTElement.h \
+			../../src/terralib/kernel/TeSTElementSet.h \
+			../../src/terralib/kernel/TeSTEvent.h \
+			../../src/terralib/kernel/TeSTInstance.h\
+			../../src/terralib/kernel/TeTable.h \
+			../../src/terralib/kernel/TeTemporalSeries.h \
+			../../src/terralib/kernel/TeTheme.h \
+			../../src/terralib/kernel/TeTime.h \
+			../../src/terralib/kernel/TeTimeInterval.h \
+			../../src/terralib/kernel/TeTin.h \
+			../../src/terralib/kernel/TeUtils.h \
+			../../src/terralib/kernel/TeVectorRemap.h \
+			../../src/terralib/kernel/TeView.h \
+			../../src/terralib/kernel/TeViewNode.h \
+			../../src/terralib/kernel/TeVisual.h \
+			../../src/terralib/kernel/yyTemporal.h
+
+INCLUDEPATH	+=	../../src/terralib/kernel \
+				../../src/terralib/functions \
+				../../src/tiff \
+				../../src/zlib
+
+LIBS += -L../tiff -ltiff
diff --git a/terralibx/tiff/Makefile b/terralibx/tiff/Makefile
new file mode 100644
index 0000000..7e1c8a9
--- /dev/null
+++ b/terralibx/tiff/Makefile
@@ -0,0 +1,13 @@
+all: tiff
+
+tiff:
+	qmake -o makeTiff tiff.pro; make -f makeTiff
+
+clean:
+	if \
+	 test -f makeTiff; \
+	then \
+		make -f makeTiff distclean; rm -f makeTiff; \
+	fi
+
+
diff --git a/terralibx/tiff/tiff.pro b/terralibx/tiff/tiff.pro
new file mode 100755
index 0000000..26ef517
--- /dev/null
+++ b/terralibx/tiff/tiff.pro
@@ -0,0 +1,61 @@
+TEMPLATE = lib
+CONFIG  += warn_off  debug
+TARGET  += tiff
+
+unix {
+  OBJECTS_DIR = .obj
+}
+
+SOURCES =  \
+		../../src/tiff/cpl_csv.c \
+		../../src/tiff/cpl_serv.c \
+		../../src/tiff/fax3sm.c \
+		../../src/tiff/geo_extra.c \
+		../../src/tiff/geo_free.c \
+		../../src/tiff/geo_get.c \
+		../../src/tiff/geo_names.c \
+		../../src/tiff/geo_new.c \
+		../../src/tiff/geo_normalize.c \
+		../../src/tiff/geo_print.c \
+		../../src/tiff/geo_set.c \
+		../../src/tiff/geo_tiffp.c \
+		../../src/tiff/geo_trans.c \
+		../../src/tiff/geo_write.c \
+		../../src/tiff/geotiff_proj4.c \
+		../../src/tiff/tif_aux.c \
+		../../src/tiff/tif_close.c \
+		../../src/tiff/tif_codec.c \
+		../../src/tiff/tif_color.c \
+		../../src/tiff/tif_compress.c \
+		../../src/tiff/tif_dir.c \
+		../../src/tiff/tif_dirinfo.c \
+		../../src/tiff/tif_dirread.c \
+		../../src/tiff/tif_dirwrite.c \
+		../../src/tiff/tif_dumpmode.c \
+		../../src/tiff/tif_error.c \
+		../../src/tiff/tif_extension.c \    
+		../../src/tiff/tif_fax3.c \
+		../../src/tiff/tif_flush.c \
+		../../src/tiff/tif_getimage.c \
+		../../src/tiff/tif_jpeg.c \
+		../../src/tiff/tif_luv.c \
+		../../src/tiff/tif_lzw.c \
+		../../src/tiff/tif_machdep.c \
+		../../src/tiff/tif_next.c \
+		../../src/tiff/tif_open.c \
+		../../src/tiff/tif_packbits.c \
+		../../src/tiff/tif_pixarlog.c \
+		../../src/tiff/tif_predict.c \
+		../../src/tiff/tif_print.c \
+		../../src/tiff/tif_read.c \
+		../../src/tiff/tif_strip.c \
+		../../src/tiff/tif_swab.c \
+		../../src/tiff/tif_thunder.c \
+		../../src/tiff/tif_tile.c \
+		../../src/tiff/tif_unix.c \
+		../../src/tiff/tif_version.c \
+		../../src/tiff/tif_warning.c \
+		../../src/tiff/tif_write.c \
+		../../src/tiff/tif_zip.c \
+		../../src/tiff/xtiff.c
+

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



More information about the Pkg-grass-devel mailing list